@dsivd/prestations-ng 16.2.0 → 16.2.1-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +20 -0
- package/UPGRADING_V16.md +70 -0
- package/dsivd-prestations-ng-v16.2.1-beta.1.tgz +0 -0
- package/esm2020/foehn-address/foehn-input-address.component.mjs +70 -26
- package/esm2020/foehn-breadcrumb/breadcrumb-event.service.mjs +3 -8
- package/esm2020/foehn-input/foehn-input-number.component.mjs +39 -2
- package/esm2020/foehn-input/foehn-input-string.component.mjs +3 -1
- package/fesm2015/dsivd-prestations-ng.mjs +110 -32
- package/fesm2015/dsivd-prestations-ng.mjs.map +1 -1
- package/fesm2020/dsivd-prestations-ng.mjs +109 -32
- package/fesm2020/dsivd-prestations-ng.mjs.map +1 -1
- package/foehn-address/foehn-input-address.component.d.ts +8 -2
- package/foehn-input/foehn-input-number.component.d.ts +1 -0
- package/foehn-input/foehn-input-string.component.d.ts +1 -0
- package/package.json +1 -1
- package/dsivd-prestations-ng-v16.2.0.tgz +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -29,6 +29,26 @@ A change is considered **breaking** if you have to change your code or update yo
|
|
|
29
29
|
|
|
30
30
|
---
|
|
31
31
|
|
|
32
|
+
## [16.2.1]
|
|
33
|
+
|
|
34
|
+
### Updated
|
|
35
|
+
|
|
36
|
+
- [breadcrumb-event.service.ts](projects/prestations-ng/src/foehn-breadcrumb/breadcrumb-event.service.ts)
|
|
37
|
+
- remove level "Accéder aux prestations" when user is connected
|
|
38
|
+
|
|
39
|
+
- [foehn-input-number](projects/prestations-ng/src/foehn-input/foehn-input-number.component.ts)
|
|
40
|
+
- removes leading `0` when `allowFreeInput` is set to `false` such as `01` or `-01`
|
|
41
|
+
|
|
42
|
+
### Fixed
|
|
43
|
+
|
|
44
|
+
- [foehn-input-string](projects/prestations-ng/src/foehn-input/foehn-input-string.component.ts)
|
|
45
|
+
|
|
46
|
+
- replaces one or multiple consecutive tabulations with one white space on blur
|
|
47
|
+
- all `foehn-input-*` components extending `foehn-input-string` component will be fixed (i.e. text, textarea, email, phone...)
|
|
48
|
+
|
|
49
|
+
- [foehn-input-address](projects/prestations-ng/src/foehn-address/foehn-input-address.component.ts)
|
|
50
|
+
- now listens to changes on `model` and `isOnlySwiss` to set default country to switzerland
|
|
51
|
+
|
|
32
52
|
## [16.2.0] - must be aligned with prestations-be
|
|
33
53
|
|
|
34
54
|
### Added
|
package/UPGRADING_V16.md
CHANGED
|
@@ -559,6 +559,8 @@ Your are good to go if no errors are remaining!
|
|
|
559
559
|
|
|
560
560
|
see https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.7-Release-Notes#upgrading-from-spring-boot-26
|
|
561
561
|
|
|
562
|
+
#### With spring boot starter parent
|
|
563
|
+
|
|
562
564
|
if you're using `org.springframework.boot.spring-boot-starter-parent` :
|
|
563
565
|
|
|
564
566
|
```diff
|
|
@@ -576,6 +578,74 @@ if you're using `org.springframework.boot.spring-boot-starter-parent` :
|
|
|
576
578
|
+ <prestations-be.version>16.x.x</prestations-be.version>
|
|
577
579
|
```
|
|
578
580
|
|
|
581
|
+
We now deploy artifacts to Nexus instead of xFile (will be disabled in end of 2023). This requires us to deploy
|
|
582
|
+
to the current repository in Nexus.
|
|
583
|
+
|
|
584
|
+
Add two distributionManagement (DM), one for applications and one for libraries. Applications DM will be enabled through a profile if the packaging of the project is war,
|
|
585
|
+
otherwise your project will use the default libraries DM. With this, we will send artifacts to appropriate repositories.
|
|
586
|
+
|
|
587
|
+
```xml
|
|
588
|
+
<yourPom>
|
|
589
|
+
<distributionManagement>
|
|
590
|
+
<repository>
|
|
591
|
+
<id>nexus.releases</id>
|
|
592
|
+
<name>Nexus releases</name>
|
|
593
|
+
<url>${nexus.url.releases}</url>
|
|
594
|
+
</repository>
|
|
595
|
+
<snapshotRepository>
|
|
596
|
+
<id>nexus.snapshots</id>
|
|
597
|
+
<name>Nexus snaphots</name>
|
|
598
|
+
<url>${nexus.url.snapshots}</url>
|
|
599
|
+
<uniqueVersion>false</uniqueVersion>
|
|
600
|
+
</snapshotRepository>
|
|
601
|
+
</distributionManagement>
|
|
602
|
+
<!-- ... -->
|
|
603
|
+
<profile>
|
|
604
|
+
<id>nexusApps</id>
|
|
605
|
+
<properties>
|
|
606
|
+
<release.goals>clean deploy</release.goals>
|
|
607
|
+
<devex-maven-plugin.phase>deploy</devex-maven-plugin.phase>
|
|
608
|
+
</properties>
|
|
609
|
+
<activation>
|
|
610
|
+
<property>
|
|
611
|
+
<name>packaging</name>
|
|
612
|
+
<value>war</value>
|
|
613
|
+
</property>
|
|
614
|
+
</activation>
|
|
615
|
+
<distributionManagement>
|
|
616
|
+
<repository>
|
|
617
|
+
<id>nexus-dgnsi-server</id>
|
|
618
|
+
<name>Nexus DGNSI</name>
|
|
619
|
+
<url>${nexus.url}/app-${application.repository}-stable</url>
|
|
620
|
+
</repository>
|
|
621
|
+
<snapshotRepository>
|
|
622
|
+
<id>nexus-dgnsi-server</id>
|
|
623
|
+
<name>Nexus DGNSI</name>
|
|
624
|
+
<url>${nexus.url}/app-${application.repository}-snapshots</url>
|
|
625
|
+
<uniqueVersion>false</uniqueVersion>
|
|
626
|
+
</snapshotRepository>
|
|
627
|
+
</distributionManagement>
|
|
628
|
+
</profile>
|
|
629
|
+
</yourPom>
|
|
630
|
+
```
|
|
631
|
+
|
|
632
|
+
> application.repository depends on the type of project (ask for migration wiki page to get it and also other URLs).
|
|
633
|
+
|
|
634
|
+
In Jenkinsfile (snap and stable only), use the 'withNexus' args to true so that you will use Nexus and not xFile anymore :
|
|
635
|
+
|
|
636
|
+
```groovy
|
|
637
|
+
def buildArgs = [
|
|
638
|
+
name : 'yourProject',
|
|
639
|
+
withNexus: true
|
|
640
|
+
]
|
|
641
|
+
|
|
642
|
+
stage('Snap2Devex yourProject') {
|
|
643
|
+
snap2Devex(buildArgs)
|
|
644
|
+
}
|
|
645
|
+
```
|
|
646
|
+
|
|
647
|
+
#### With application parent
|
|
648
|
+
|
|
579
649
|
if you're using `ch.vd.cyber.parent.application-parent
|
|
580
650
|
|
|
581
651
|
```diff
|
|
Binary file
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { Component, forwardRef, Input, ViewChild } from '@angular/core';
|
|
2
2
|
import { BehaviorSubject, combineLatest, of } from 'rxjs';
|
|
3
|
-
import { debounceTime, distinctUntilChanged,
|
|
3
|
+
import { debounceTime, distinctUntilChanged, map, shareReplay, switchMap, tap } from 'rxjs/operators';
|
|
4
4
|
import { FoehnInputComponent } from '../foehn-input/foehn-input.component';
|
|
5
|
+
import { ObjectHelper } from '../helpers/object.helper';
|
|
5
6
|
import { FoehnInputForeignLocalityComponent } from './foehn-input-foreign-locality.component';
|
|
6
7
|
import { FoehnInputForeignStreetComponent } from './foehn-input-foreign-street.component';
|
|
7
8
|
import * as i0 from "@angular/core";
|
|
@@ -19,6 +20,7 @@ export const SWISS_ISO_ID = 'CH';
|
|
|
19
20
|
export class StreetNumber {
|
|
20
21
|
}
|
|
21
22
|
const isDefined = (value) => value === true || value === false;
|
|
23
|
+
const hasInputChanged = (change) => change && !ObjectHelper.isEqual(change.previousValue, change.currentValue);
|
|
22
24
|
export class FoehnInputAddressComponent extends FoehnInputComponent {
|
|
23
25
|
constructor(httpClient, ngZone, dictionaryService) {
|
|
24
26
|
super();
|
|
@@ -44,6 +46,8 @@ export class FoehnInputAddressComponent extends FoehnInputComponent {
|
|
|
44
46
|
this.iso2IdSubject = new BehaviorSubject(null);
|
|
45
47
|
this.zipCodeIdSubject = new BehaviorSubject(null);
|
|
46
48
|
this.estrIdSubject = new BehaviorSubject(null);
|
|
49
|
+
this.countryModelChangeSubject = new BehaviorSubject(undefined);
|
|
50
|
+
this.isOnlySwissChangeSubject = new BehaviorSubject(true);
|
|
47
51
|
this.identity = (n) => n;
|
|
48
52
|
this.countryIdentity = (country) => country.iso2Id;
|
|
49
53
|
this.localityIdentity = (loc) => loc.postalLocalityHistoryId;
|
|
@@ -52,6 +56,7 @@ export class FoehnInputAddressComponent extends FoehnInputComponent {
|
|
|
52
56
|
estrid: null,
|
|
53
57
|
longName
|
|
54
58
|
});
|
|
59
|
+
this.manageDefaultCountrySubscription = this.manageDefaultCountry();
|
|
55
60
|
}
|
|
56
61
|
ngOnInit() {
|
|
57
62
|
super.ngOnInit();
|
|
@@ -68,7 +73,7 @@ export class FoehnInputAddressComponent extends FoehnInputComponent {
|
|
|
68
73
|
]).pipe(
|
|
69
74
|
// The zipCodeId when locality changes or match locality (postalLocalityHistoryId) from model
|
|
70
75
|
map(([zipCodeId, localities]) => zipCodeId ||
|
|
71
|
-
this.extractLocalityZipCodeId(localities, this.locality)),
|
|
76
|
+
this.extractLocalityZipCodeId(localities, this.locality)), distinctUntilChanged(),
|
|
72
77
|
// The list of streets or a default value to an empty array
|
|
73
78
|
switchMap(zipCodeId => this.getStreetsFor(zipCodeId)), shareReplay(1));
|
|
74
79
|
this.streetNumbers = combineLatest([
|
|
@@ -76,7 +81,7 @@ export class FoehnInputAddressComponent extends FoehnInputComponent {
|
|
|
76
81
|
this.streets
|
|
77
82
|
]).pipe(
|
|
78
83
|
// The estrid when street changes or match street (longName) from model
|
|
79
|
-
map(([estrid, streets]) => estrid || this.extractStreetEstrid(streets, this.street)),
|
|
84
|
+
map(([estrid, streets]) => estrid || this.extractStreetEstrid(streets, this.street)), distinctUntilChanged(),
|
|
80
85
|
// The list of streets or a default value to an empty array
|
|
81
86
|
switchMap(estrid => this.getStreetNumberFor(estrid)),
|
|
82
87
|
// Some street might not have an name, RefInf sometimes returns weird data.
|
|
@@ -87,13 +92,24 @@ export class FoehnInputAddressComponent extends FoehnInputComponent {
|
|
|
87
92
|
});
|
|
88
93
|
return values.sort((a, b) => collator.compare(a.name, b.name));
|
|
89
94
|
}), shareReplay(1));
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
95
|
+
}
|
|
96
|
+
ngOnDestroy() {
|
|
97
|
+
super.ngOnDestroy();
|
|
98
|
+
this.manageDefaultCountrySubscription?.unsubscribe();
|
|
99
|
+
}
|
|
100
|
+
ngOnChanges(changes) {
|
|
101
|
+
const modelChange = changes.model;
|
|
102
|
+
const isOnlySwiss = changes.isOnlySwiss;
|
|
103
|
+
if (hasInputChanged(modelChange)) {
|
|
104
|
+
// When model changes, we ensure to not send "undefined" anymore
|
|
105
|
+
const country = !!modelChange.currentValue
|
|
106
|
+
? modelChange.currentValue.country
|
|
107
|
+
: null;
|
|
108
|
+
this.countryModelChangeSubject.next(country);
|
|
109
|
+
}
|
|
110
|
+
if (hasInputChanged(isOnlySwiss)) {
|
|
111
|
+
this.isOnlySwissChangeSubject.next(isOnlySwiss.currentValue);
|
|
112
|
+
}
|
|
97
113
|
}
|
|
98
114
|
updateAddress() {
|
|
99
115
|
const validValue = this.getValidValue();
|
|
@@ -102,18 +118,20 @@ export class FoehnInputAddressComponent extends FoehnInputComponent {
|
|
|
102
118
|
}
|
|
103
119
|
}
|
|
104
120
|
updateNgModel(value) {
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
121
|
+
if (!!value) {
|
|
122
|
+
// avoid wrongfull prefill by session info
|
|
123
|
+
if (!this.showAdressLines || !this.showAdressLine1) {
|
|
124
|
+
value.addressLine1 = null;
|
|
125
|
+
}
|
|
126
|
+
if (!this.showAdressLines || !this.showAdressLine2) {
|
|
127
|
+
value.addressLine2 = null;
|
|
128
|
+
}
|
|
129
|
+
if (!this.showPostOfficeBoxText) {
|
|
130
|
+
value.postOfficeBoxText = null;
|
|
131
|
+
}
|
|
132
|
+
// never updatable in the component
|
|
133
|
+
value.postOfficeBoxNumber = null;
|
|
114
134
|
}
|
|
115
|
-
// never updatable in the component
|
|
116
|
-
value.postOfficeBoxNumber = null;
|
|
117
135
|
super.updateNgModel(value);
|
|
118
136
|
}
|
|
119
137
|
handleUserInput() {
|
|
@@ -344,14 +362,40 @@ export class FoehnInputAddressComponent extends FoehnInputComponent {
|
|
|
344
362
|
return value;
|
|
345
363
|
}
|
|
346
364
|
isModelEmpty() {
|
|
347
|
-
return (this.isEmpty(this.country) &&
|
|
348
|
-
this.isEmpty(this.locality) &&
|
|
349
|
-
this.isEmpty(this.street) &&
|
|
365
|
+
return ((!this.country || ObjectHelper.isEmpty(this.country)) &&
|
|
366
|
+
(!this.locality || ObjectHelper.isEmpty(this.locality)) &&
|
|
367
|
+
(!this.street || ObjectHelper.isEmpty(this.street)) &&
|
|
350
368
|
this.isEmpty(this.houseNumber) &&
|
|
351
369
|
this.isEmpty(this.postOfficeBoxText) &&
|
|
352
370
|
this.isEmpty(this.addressLine1) &&
|
|
353
371
|
this.isEmpty(this.addressLine2));
|
|
354
372
|
}
|
|
373
|
+
manageDefaultCountry() {
|
|
374
|
+
return (combineLatest([
|
|
375
|
+
this.countryModelChangeSubject.asObservable().pipe(debounceTime(0), distinctUntilChanged((previous, current) => previous.iso2Id === current.iso2Id)),
|
|
376
|
+
this.isOnlySwissChangeSubject
|
|
377
|
+
.asObservable()
|
|
378
|
+
.pipe(debounceTime(0), distinctUntilChanged())
|
|
379
|
+
])
|
|
380
|
+
.pipe(tap(([country, isOnlySwiss]) => {
|
|
381
|
+
// When country selection is allowed, we need to check "undefined"
|
|
382
|
+
// to set default country only on component initialization
|
|
383
|
+
if (!isOnlySwiss && country === undefined) {
|
|
384
|
+
this.setDefaultCountry();
|
|
385
|
+
return;
|
|
386
|
+
}
|
|
387
|
+
if (isOnlySwiss) {
|
|
388
|
+
// When there is a country, we need to check if it has to be cleaned and set to default
|
|
389
|
+
if (!!country && !ObjectHelper.isEmpty(country)) {
|
|
390
|
+
this.clearAutocompletesWhenCountryIsUnappropriatedToComponentConfiguration();
|
|
391
|
+
}
|
|
392
|
+
this.setDefaultCountry();
|
|
393
|
+
return;
|
|
394
|
+
}
|
|
395
|
+
}))
|
|
396
|
+
// eslint-disable-next-line rxjs-angular/prefer-async-pipe
|
|
397
|
+
.subscribe());
|
|
398
|
+
}
|
|
355
399
|
}
|
|
356
400
|
FoehnInputAddressComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FoehnInputAddressComponent, deps: [{ token: i1.HttpClient }, { token: i0.NgZone }, { token: i2.SdkDictionaryService }], target: i0.ɵɵFactoryTarget.Component });
|
|
357
401
|
FoehnInputAddressComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: FoehnInputAddressComponent, selector: "foehn-input-address", inputs: { countriesUrl: "countriesUrl", isOnlySwiss: "isOnlySwiss", showPostOfficeBoxText: "showPostOfficeBoxText", showAdressLines: "showAdressLines", showAdressLine1: "showAdressLine1", showAdressLine2: "showAdressLine2", specifiedCanton: "specifiedCanton", countryRequired: "countryRequired", swissNpaLocalityRequired: "swissNpaLocalityRequired", streetRequired: "streetRequired", streetNumberRequired: "streetNumberRequired", foreignZipCodeRequired: "foreignZipCodeRequired", foreignLocalityRequired: "foreignLocalityRequired", foreignStreetRequired: "foreignStreetRequired", foreignStreetNumberRequired: "foreignStreetNumberRequired", postOfficeBoxTextRequired: "postOfficeBoxTextRequired", addressLine1Required: "addressLine1Required", addressLine2Required: "addressLine2Required", withCompanyLocalities: "withCompanyLocalities" }, providers: [
|
|
@@ -360,7 +404,7 @@ FoehnInputAddressComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0
|
|
|
360
404
|
useExisting: forwardRef(() => FoehnInputAddressComponent),
|
|
361
405
|
multi: true
|
|
362
406
|
}
|
|
363
|
-
], viewQueries: [{ propertyName: "foreignLocalityComponent", first: true, predicate: FoehnInputForeignLocalityComponent, descendants: true }, { propertyName: "foreignStreetComponent", first: true, predicate: FoehnInputForeignStreetComponent, descendants: true }, { propertyName: "foreignHouseNumber", first: true, predicate: ["foreignHouseNumber"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<div\n [attr.id]=\"buildId() + 'Container'\"\n class=\"form-group\"\n [class.has-danger]=\"hasErrorsToDisplay()\"\n [class.vd-form-group-danger]=\"hasErrorsToDisplay()\"\n [tabIndex]=\"-1\"\n>\n <fieldset\n class=\"mb-3\"\n [attr.aria-describedby]=\"getDescribedBy()\"\n [attr.aria-invalid]=\"hasErrorsToDisplay() || null\"\n >\n <legend *ngIf=\"!!label\" [ngClass]=\"isLabelSrOnly ? 'sr-only' : 'vd-p'\">\n <span [innerHTML]=\"label\"></span>\n <span\n *ngIf=\"!required && !hideNotRequiredExtraLabel\"\n aria-hidden=\"true\"\n >\n {{ 'foehn-input.optional' | fromDictionary }}\n </span>\n </legend>\n\n <foehn-validation-alerts [component]=\"this\"></foehn-validation-alerts>\n\n <small\n *ngIf=\"helpText\"\n [attr.id]=\"buildId() + 'Help'\"\n class=\"text-secondary\"\n [innerHTML]=\"helpText\"\n ></small>\n\n <ng-content></ng-content>\n\n <foehn-autocomplete\n *ngIf=\"!isOnlySwiss\"\n [label]=\"'foehn-input-address.country.label' | fromDictionary\"\n [elements]=\"countries | async\"\n elementLabel=\"shortNameFr\"\n [elementValue]=\"identity\"\n [elementValueIdentity]=\"countryIdentity\"\n (modelChange)=\"countryUpdated($event)\"\n (userInput)=\"userInputCountry()\"\n [model]=\"country\"\n [name]=\"name + '.country'\"\n [required]=\"countryRequired\"\n [disabled]=\"disabled\"\n ></foehn-autocomplete>\n\n <ng-container *ngIf=\"isSwiss()\">\n <foehn-autocomplete\n [label]=\"'foehn-input-address.locality.label' | fromDictionary\"\n [elements]=\"localities | async\"\n [elementLabel]=\"getLocalityDisplayedName\"\n [elementValue]=\"identity\"\n [elementValueIdentity]=\"localityIdentity\"\n (modelChange)=\"localityUpdated($event)\"\n (userInput)=\"userInputLocality($event)\"\n [model]=\"locality\"\n [name]=\"name + '.locality'\"\n [allowCustomValue]=\"disabled\"\n [required]=\"swissNpaLocalityRequired\"\n [disabled]=\"!country || disabled\"\n ></foehn-autocomplete>\n\n <foehn-autocomplete\n [label]=\"'foehn-input-address.street.label' | fromDictionary\"\n [elements]=\"streets | async\"\n elementLabel=\"longName\"\n [elementValue]=\"identity\"\n [elementValueIdentity]=\"streetIdentity\"\n (modelChange)=\"streetUpdated($event)\"\n [model]=\"street\"\n [name]=\"name + '.street'\"\n [allowCustomValue]=\"true\"\n [customValueModelGenerator]=\"streetGenerator\"\n [required]=\"isStreetRequired()\"\n [helpText]=\"\n 'foehn-input-address.street.help-text' | fromDictionary\n \"\n [customErrors]=\"streetCustomErrors\"\n (userInput)=\"userInputStreet($event)\"\n [disabled]=\"!country || disabled\"\n ></foehn-autocomplete>\n\n <foehn-autocomplete\n [label]=\"\n 'foehn-input-address.houseNumber.label' | fromDictionary\n \"\n [elements]=\"streetNumbers | async\"\n elementLabel=\"name\"\n elementValue=\"name\"\n [(model)]=\"houseNumber\"\n [name]=\"name + '.houseNumber'\"\n [allowCustomValue]=\"true\"\n [helpText]=\"\n 'foehn-input-address.houseNumber.help-text' | fromDictionary\n \"\n (modelChange)=\"updateAddress()\"\n (userInput)=\"handleUserInput()\"\n [required]=\"streetNumberRequired\"\n [disabled]=\"!country || disabled\"\n ></foehn-autocomplete>\n </ng-container>\n\n <ng-container *ngIf=\"!isSwiss()\">\n <!--\n Component <foehn-input-foreign-locality> is special because we use the same model when swiss or foreigner.\n To do so, we need:\n - Errors will be bind on 'locality' when NULL or on 'zipCode' and 'longName' model inside component when EMPTY\n - Hide label from component because we need label from children to be displayed (isLabelSrOnly: true)\n - required and disabled params are transmitted to children\n -->\n <foehn-input-foreign-locality\n [label]=\"'foehn-input-address.locality.label' | fromDictionary\"\n [name]=\"name + '.locality'\"\n [(model)]=\"locality\"\n [zipCodeRequired]=\"foreignZipCodeRequired\"\n [localityRequired]=\"foreignLocalityRequired\"\n [isLabelSrOnly]=\"true\"\n [disabled]=\"!country || disabled\"\n (modelChange)=\"updateAddress()\"\n (userInput)=\"handleUserInput()\"\n ></foehn-input-foreign-locality>\n <!--\n Component <foehn-input-foreign-street> is special because we use the same model when swiss or foreigner.\n To do so, we need:\n - Errors will be bind on 'street' when NULL or on 'longName' model inside component when EMPTY\n - required, helpText, isLabelSrOnly and disabled params are transmitted to children\n -->\n <foehn-input-foreign-street\n [label]=\"'foehn-input-address.street.label' | fromDictionary\"\n [name]=\"name + '.street'\"\n [(model)]=\"street\"\n [required]=\"isForeignStreetRequired()\"\n [helpText]=\"\n 'foehn-input-address.street.help-text' | fromDictionary\n \"\n [customErrors]=\"streetCustomErrors\"\n [disabled]=\"!country || disabled\"\n (modelChange)=\"updateAddress()\"\n (userInput)=\"handleUserInput()\"\n ></foehn-input-foreign-street>\n\n <foehn-input-text\n #foreignHouseNumber\n [label]=\"\n 'foehn-input-address.houseNumber.label' | fromDictionary\n \"\n [name]=\"name + '.houseNumber'\"\n [(model)]=\"houseNumber\"\n [helpText]=\"\n 'foehn-input-address.houseNumber.help-text' | fromDictionary\n \"\n [disabled]=\"!country || disabled\"\n (modelChange)=\"updateAddress()\"\n (userInput)=\"handleUserInput()\"\n [required]=\"foreignStreetNumberRequired\"\n ></foehn-input-text>\n </ng-container>\n\n <foehn-input-text\n *ngIf=\"showPostOfficeBoxText\"\n [(model)]=\"postOfficeBoxText\"\n [helpText]=\"\n 'foehn-input-address.postOfficeBoxText.help-text'\n | fromDictionary\n \"\n [label]=\"\n 'foehn-input-address.postOfficeBoxText.label' | fromDictionary\n \"\n [name]=\"name + '.postOfficeBoxText'\"\n (modelChange)=\"updateAddress()\"\n (userInput)=\"handleUserInput()\"\n [required]=\"isPostOfficeBoxTextRequired()\"\n [disabled]=\"disabled\"\n ></foehn-input-text>\n\n <foehn-input-text\n *ngIf=\"showAdressLines && showAdressLine1\"\n [(model)]=\"addressLine1\"\n [label]=\"'foehn-input-address.addressLine1.label' | fromDictionary\"\n [name]=\"name + '.addressLine1'\"\n (modelChange)=\"updateAddress()\"\n (userInput)=\"handleUserInput()\"\n [required]=\"addressLine1Required\"\n [autocomplete]=\"'address-line2'\"\n [disabled]=\"disabled\"\n ></foehn-input-text>\n\n <foehn-input-text\n *ngIf=\"showAdressLines && showAdressLine2\"\n [(model)]=\"addressLine2\"\n [label]=\"'foehn-input-address.addressLine2.label' | fromDictionary\"\n [name]=\"name + '.addressLine2'\"\n (modelChange)=\"updateAddress()\"\n (userInput)=\"handleUserInput()\"\n [required]=\"addressLine2Required\"\n [autocomplete]=\"'address-line3'\"\n [disabled]=\"disabled\"\n ></foehn-input-text>\n </fieldset>\n</div>\n", dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.FoehnAutocompleteComponent, selector: "foehn-autocomplete", inputs: ["searchValueMinCharsCount", "allowCustomValue", "isSuggestionListDynamic", "customValueModelGenerator", "itemHeightInSuggestionListInPx", "elementSuggestionLabel", "caseSensitiveSearch", "disabled"], outputs: ["userSearchInput"] }, { kind: "component", type: i5.FoehnInputTextComponent, selector: "foehn-input-text", inputs: ["numberOnly"] }, { kind: "component", type: i6.FoehnValidationAlertsComponent, selector: "foehn-validation-alerts", inputs: ["component", "shouldErrorsBeLive"] }, { kind: "component", type: i7.FoehnInputForeignLocalityComponent, selector: "foehn-input-foreign-locality", inputs: ["localityRequired", "zipCodeRequired"] }, { kind: "component", type: i8.FoehnInputForeignStreetComponent, selector: "foehn-input-foreign-street" }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i9.SdkDictionaryPipe, name: "fromDictionary" }] });
|
|
407
|
+
], viewQueries: [{ propertyName: "foreignLocalityComponent", first: true, predicate: FoehnInputForeignLocalityComponent, descendants: true }, { propertyName: "foreignStreetComponent", first: true, predicate: FoehnInputForeignStreetComponent, descendants: true }, { propertyName: "foreignHouseNumber", first: true, predicate: ["foreignHouseNumber"], descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div\n [attr.id]=\"buildId() + 'Container'\"\n class=\"form-group\"\n [class.has-danger]=\"hasErrorsToDisplay()\"\n [class.vd-form-group-danger]=\"hasErrorsToDisplay()\"\n [tabIndex]=\"-1\"\n>\n <fieldset\n class=\"mb-3\"\n [attr.aria-describedby]=\"getDescribedBy()\"\n [attr.aria-invalid]=\"hasErrorsToDisplay() || null\"\n >\n <legend *ngIf=\"!!label\" [ngClass]=\"isLabelSrOnly ? 'sr-only' : 'vd-p'\">\n <span [innerHTML]=\"label\"></span>\n <span\n *ngIf=\"!required && !hideNotRequiredExtraLabel\"\n aria-hidden=\"true\"\n >\n {{ 'foehn-input.optional' | fromDictionary }}\n </span>\n </legend>\n\n <foehn-validation-alerts [component]=\"this\"></foehn-validation-alerts>\n\n <small\n *ngIf=\"helpText\"\n [attr.id]=\"buildId() + 'Help'\"\n class=\"text-secondary\"\n [innerHTML]=\"helpText\"\n ></small>\n\n <ng-content></ng-content>\n\n <foehn-autocomplete\n *ngIf=\"!isOnlySwiss\"\n [label]=\"'foehn-input-address.country.label' | fromDictionary\"\n [elements]=\"countries | async\"\n elementLabel=\"shortNameFr\"\n [elementValue]=\"identity\"\n [elementValueIdentity]=\"countryIdentity\"\n (modelChange)=\"countryUpdated($event)\"\n (userInput)=\"userInputCountry()\"\n [model]=\"country\"\n [name]=\"name + '.country'\"\n [required]=\"countryRequired\"\n [disabled]=\"disabled\"\n ></foehn-autocomplete>\n\n <ng-container *ngIf=\"isSwiss()\">\n <foehn-autocomplete\n [label]=\"'foehn-input-address.locality.label' | fromDictionary\"\n [elements]=\"localities | async\"\n [elementLabel]=\"getLocalityDisplayedName\"\n [elementValue]=\"identity\"\n [elementValueIdentity]=\"localityIdentity\"\n (modelChange)=\"localityUpdated($event)\"\n (userInput)=\"userInputLocality($event)\"\n [model]=\"locality\"\n [name]=\"name + '.locality'\"\n [allowCustomValue]=\"disabled\"\n [required]=\"swissNpaLocalityRequired\"\n [disabled]=\"!country || disabled\"\n ></foehn-autocomplete>\n\n <foehn-autocomplete\n [label]=\"'foehn-input-address.street.label' | fromDictionary\"\n [elements]=\"streets | async\"\n elementLabel=\"longName\"\n [elementValue]=\"identity\"\n [elementValueIdentity]=\"streetIdentity\"\n (modelChange)=\"streetUpdated($event)\"\n [model]=\"street\"\n [name]=\"name + '.street'\"\n [allowCustomValue]=\"true\"\n [customValueModelGenerator]=\"streetGenerator\"\n [required]=\"isStreetRequired()\"\n [helpText]=\"\n 'foehn-input-address.street.help-text' | fromDictionary\n \"\n [customErrors]=\"streetCustomErrors\"\n (userInput)=\"userInputStreet($event)\"\n [disabled]=\"!country || disabled\"\n ></foehn-autocomplete>\n\n <foehn-autocomplete\n [label]=\"\n 'foehn-input-address.houseNumber.label' | fromDictionary\n \"\n [elements]=\"streetNumbers | async\"\n elementLabel=\"name\"\n elementValue=\"name\"\n [(model)]=\"houseNumber\"\n [name]=\"name + '.houseNumber'\"\n [allowCustomValue]=\"true\"\n [helpText]=\"\n 'foehn-input-address.houseNumber.help-text' | fromDictionary\n \"\n (modelChange)=\"updateAddress()\"\n (userInput)=\"handleUserInput()\"\n [required]=\"streetNumberRequired\"\n [disabled]=\"!country || disabled\"\n ></foehn-autocomplete>\n </ng-container>\n\n <ng-container *ngIf=\"!isSwiss()\">\n <!--\n Component <foehn-input-foreign-locality> is special because we use the same model when swiss or foreigner.\n To do so, we need:\n - Errors will be bind on 'locality' when NULL or on 'zipCode' and 'longName' model inside component when EMPTY\n - Hide label from component because we need label from children to be displayed (isLabelSrOnly: true)\n - required and disabled params are transmitted to children\n -->\n <foehn-input-foreign-locality\n [label]=\"'foehn-input-address.locality.label' | fromDictionary\"\n [name]=\"name + '.locality'\"\n [(model)]=\"locality\"\n [zipCodeRequired]=\"foreignZipCodeRequired\"\n [localityRequired]=\"foreignLocalityRequired\"\n [isLabelSrOnly]=\"true\"\n [disabled]=\"!country || disabled\"\n (modelChange)=\"updateAddress()\"\n (userInput)=\"handleUserInput()\"\n ></foehn-input-foreign-locality>\n <!--\n Component <foehn-input-foreign-street> is special because we use the same model when swiss or foreigner.\n To do so, we need:\n - Errors will be bind on 'street' when NULL or on 'longName' model inside component when EMPTY\n - required, helpText, isLabelSrOnly and disabled params are transmitted to children\n -->\n <foehn-input-foreign-street\n [label]=\"'foehn-input-address.street.label' | fromDictionary\"\n [name]=\"name + '.street'\"\n [(model)]=\"street\"\n [required]=\"isForeignStreetRequired()\"\n [helpText]=\"\n 'foehn-input-address.street.help-text' | fromDictionary\n \"\n [customErrors]=\"streetCustomErrors\"\n [disabled]=\"!country || disabled\"\n (modelChange)=\"updateAddress()\"\n (userInput)=\"handleUserInput()\"\n ></foehn-input-foreign-street>\n\n <foehn-input-text\n #foreignHouseNumber\n [label]=\"\n 'foehn-input-address.houseNumber.label' | fromDictionary\n \"\n [name]=\"name + '.houseNumber'\"\n [(model)]=\"houseNumber\"\n [helpText]=\"\n 'foehn-input-address.houseNumber.help-text' | fromDictionary\n \"\n [disabled]=\"!country || disabled\"\n (modelChange)=\"updateAddress()\"\n (userInput)=\"handleUserInput()\"\n [required]=\"foreignStreetNumberRequired\"\n ></foehn-input-text>\n </ng-container>\n\n <foehn-input-text\n *ngIf=\"showPostOfficeBoxText\"\n [(model)]=\"postOfficeBoxText\"\n [helpText]=\"\n 'foehn-input-address.postOfficeBoxText.help-text'\n | fromDictionary\n \"\n [label]=\"\n 'foehn-input-address.postOfficeBoxText.label' | fromDictionary\n \"\n [name]=\"name + '.postOfficeBoxText'\"\n (modelChange)=\"updateAddress()\"\n (userInput)=\"handleUserInput()\"\n [required]=\"isPostOfficeBoxTextRequired()\"\n [disabled]=\"disabled\"\n ></foehn-input-text>\n\n <foehn-input-text\n *ngIf=\"showAdressLines && showAdressLine1\"\n [(model)]=\"addressLine1\"\n [label]=\"'foehn-input-address.addressLine1.label' | fromDictionary\"\n [name]=\"name + '.addressLine1'\"\n (modelChange)=\"updateAddress()\"\n (userInput)=\"handleUserInput()\"\n [required]=\"addressLine1Required\"\n [autocomplete]=\"'address-line2'\"\n [disabled]=\"disabled\"\n ></foehn-input-text>\n\n <foehn-input-text\n *ngIf=\"showAdressLines && showAdressLine2\"\n [(model)]=\"addressLine2\"\n [label]=\"'foehn-input-address.addressLine2.label' | fromDictionary\"\n [name]=\"name + '.addressLine2'\"\n (modelChange)=\"updateAddress()\"\n (userInput)=\"handleUserInput()\"\n [required]=\"addressLine2Required\"\n [autocomplete]=\"'address-line3'\"\n [disabled]=\"disabled\"\n ></foehn-input-text>\n </fieldset>\n</div>\n", dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.FoehnAutocompleteComponent, selector: "foehn-autocomplete", inputs: ["searchValueMinCharsCount", "allowCustomValue", "isSuggestionListDynamic", "customValueModelGenerator", "itemHeightInSuggestionListInPx", "elementSuggestionLabel", "caseSensitiveSearch", "disabled"], outputs: ["userSearchInput"] }, { kind: "component", type: i5.FoehnInputTextComponent, selector: "foehn-input-text", inputs: ["numberOnly"] }, { kind: "component", type: i6.FoehnValidationAlertsComponent, selector: "foehn-validation-alerts", inputs: ["component", "shouldErrorsBeLive"] }, { kind: "component", type: i7.FoehnInputForeignLocalityComponent, selector: "foehn-input-foreign-locality", inputs: ["localityRequired", "zipCodeRequired"] }, { kind: "component", type: i8.FoehnInputForeignStreetComponent, selector: "foehn-input-foreign-street" }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i9.SdkDictionaryPipe, name: "fromDictionary" }] });
|
|
364
408
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FoehnInputAddressComponent, decorators: [{
|
|
365
409
|
type: Component,
|
|
366
410
|
args: [{ selector: 'foehn-input-address', providers: [
|
|
@@ -418,4 +462,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
|
|
|
418
462
|
}], withCompanyLocalities: [{
|
|
419
463
|
type: Input
|
|
420
464
|
}] } });
|
|
421
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9laG4taW5wdXQtYWRkcmVzcy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9wcmVzdGF0aW9ucy1uZy9zcmMvZm9laG4tYWRkcmVzcy9mb2Vobi1pbnB1dC1hZGRyZXNzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uL3Byb2plY3RzL3ByZXN0YXRpb25zLW5nL3NyYy9mb2Vobi1hZGRyZXNzL2ZvZWhuLWlucHV0LWFkZHJlc3MuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUNILFNBQVMsRUFDVCxVQUFVLEVBQ1YsS0FBSyxFQUdMLFNBQVMsRUFDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBYyxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEUsT0FBTyxFQUNILFlBQVksRUFDWixvQkFBb0IsRUFDcEIsS0FBSyxFQUNMLEdBQUcsRUFDSCxXQUFXLEVBQ1gsU0FBUyxFQUNaLE1BQU0sZ0JBQWdCLENBQUM7QUFFeEIsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFJM0UsT0FBTyxFQUFFLGtDQUFrQyxFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFDOUYsT0FBTyxFQUFFLGdDQUFnQyxFQUFFLE1BQU0sd0NBQXdDLENBQUM7Ozs7Ozs7Ozs7O0FBRTFGLHNDQUFzQztBQUN0QyxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDO0FBRWpDLE1BQU0sT0FBTyxZQUFZO0NBRXhCO0FBRUQsTUFBTSxTQUFTLEdBQUcsQ0FBQyxLQUFjLEVBQVcsRUFBRSxDQUMxQyxLQUFLLEtBQUssSUFBSSxJQUFJLEtBQUssS0FBSyxLQUFLLENBQUM7QUFhdEMsTUFBTSxPQUFPLDBCQUNULFNBQVEsbUJBQTRCO0lBdUZwQyxZQUNZLFVBQXNCLEVBQ3RCLE1BQWMsRUFDZCxpQkFBdUM7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LHdCQUF3QjtzQkFEdkIsS0FBSztnQkFJTixjQUFjO3NCQURiLEtBQUs7Z0JBSU4sb0JBQW9CO3NCQURuQixLQUFLO2dCQUlOLHNCQUFzQjtzQkFEckIsS0FBSztnQkFJTix1QkFBdUI7c0JBRHRCLEtBQUs7Z0JBSU4scUJBQXFCO3NCQURwQixLQUFLO2dCQUlOLDJCQUEyQjtzQkFEMUIsS0FBSztnQkFJTix5QkFBeUI7c0JBRHhCLEtBQUs7Z0JBSU4sb0JBQW9CO3NCQURuQixLQUFLO2dCQUlOLG9CQUFvQjtzQkFEbkIsS0FBSztnQkFJTixxQkFBcUI7c0JBRHBCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHtcbiAgICBDb21wb25lbnQsXG4gICAgZm9yd2FyZFJlZixcbiAgICBJbnB1dCxcbiAgICBOZ1pvbmUsXG4gICAgT25Jbml0LFxuICAgIFZpZXdDaGlsZFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgY29tYmluZUxhdGVzdCwgT2JzZXJ2YWJsZSwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gICAgZGVib3VuY2VUaW1lLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkLFxuICAgIGZpcnN0LFxuICAgIG1hcCxcbiAgICBzaGFyZVJlcGxheSxcbiAgICBzd2l0Y2hNYXBcbn0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBGb2VobklucHV0Q29tcG9uZW50IH0gZnJvbSAnLi4vZm9laG4taW5wdXQvZm9laG4taW5wdXQuY29tcG9uZW50JztcbmltcG9ydCB7IEZvZWhuSW5wdXRUZXh0Q29tcG9uZW50IH0gZnJvbSAnLi4vZm9laG4taW5wdXQvZm9laG4taW5wdXQtdGV4dC5jb21wb25lbnQnO1xuaW1wb3J0IHsgU2RrRGljdGlvbmFyeVNlcnZpY2UgfSBmcm9tICcuLi9zZGstZGljdGlvbmFyeS9zZGstZGljdGlvbmFyeS5zZXJ2aWNlJztcbmltcG9ydCB7IEFkZHJlc3MsIENvdW50cnksIExvY2FsaXR5LCBTdHJlZXQgfSBmcm9tICcuL2FkZHJlc3MudHlwZSc7XG5pbXBvcnQgeyBGb2VobklucHV0Rm9yZWlnbkxvY2FsaXR5Q29tcG9uZW50IH0gZnJvbSAnLi9mb2Vobi1pbnB1dC1mb3JlaWduLWxvY2FsaXR5LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBGb2VobklucHV0Rm9yZWlnblN0cmVldENvbXBvbmVudCB9IGZyb20gJy4vZm9laG4taW5wdXQtZm9yZWlnbi1zdHJlZXQuY29tcG9uZW50JztcblxuLy8gZXNsaW50LWRpc2FibGUgbWF4LWNsYXNzZXMtcGVyLWZpbGVcbmV4cG9ydCBjb25zdCBTV0lTU19JU09fSUQgPSAnQ0gnO1xuXG5leHBvcnQgY2xhc3MgU3RyZWV0TnVtYmVyIHtcbiAgICBuYW1lOiBzdHJpbmc7XG59XG5cbmNvbnN0IGlzRGVmaW5lZCA9ICh2YWx1ZTogYm9vbGVhbik6IGJvb2xlYW4gPT5cbiAgICB2YWx1ZSA9PT0gdHJ1ZSB8fCB2YWx1ZSA9PT0gZmFsc2U7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnZm9laG4taW5wdXQtYWRkcmVzcycsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2ZvZWhuLWlucHV0LWFkZHJlc3MuY29tcG9uZW50Lmh0bWwnLFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBGb2VobklucHV0Q29tcG9uZW50LFxuICAgICAgICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gRm9laG5JbnB1dEFkZHJlc3NDb21wb25lbnQpLFxuICAgICAgICAgICAgbXVsdGk6IHRydWVcbiAgICAgICAgfVxuICAgIF1cbn0pXG5leHBvcnQgY2xhc3MgRm9laG5JbnB1dEFkZHJlc3NDb21wb25lbnRcbiAgICBleHRlbmRzIEZvZWhuSW5wdXRDb21wb25lbnQ8QWRkcmVzcz5cbiAgICBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gICAgQFZpZXdDaGlsZChGb2VobklucHV0Rm9yZWlnbkxvY2FsaXR5Q29tcG9uZW50LCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgICBmb3JlaWduTG9jYWxpdHlDb21wb25lbnQ6IEZvZWhuSW5wdXRGb3JlaWduTG9jYWxpdHlDb21wb25lbnQ7XG5cbiAgICBAVmlld0NoaWxkKEZvZWhuSW5wdXRGb3JlaWduU3RyZWV0Q29tcG9uZW50LCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgICBmb3JlaWduU3RyZWV0Q29tcG9uZW50OiBGb2VobklucHV0Rm9yZWlnblN0cmVldENvbXBvbmVudDtcblxuICAgIEBWaWV3Q2hpbGQoJ2ZvcmVpZ25Ib3VzZU51bWJlcicsIHsgc3RhdGljOiBmYWxzZSB9KVxuICAgIGZvcmVpZ25Ib3VzZU51bWJlcjogRm9laG5JbnB1dFRleHRDb21wb25lbnQ7XG5cbiAgICBASW5wdXQoKVxuICAgIGNvdW50cmllc1VybCA9ICdhcGkvcmVmaW5mL2NvdW50cmllcyc7XG5cbiAgICBASW5wdXQoKVxuICAgIGlzT25seVN3aXNzID0gdHJ1ZTtcblxuICAgIEBJbnB1dCgpXG4gICAgc2hvd1Bvc3RPZmZpY2VCb3hUZXh0ID0gZmFsc2U7XG5cbiAgICBASW5wdXQoKVxuICAgIHNob3dBZHJlc3NMaW5lcyA9IHRydWU7XG5cbiAgICBASW5wdXQoKVxuICAgIHNob3dBZHJlc3NMaW5lMSA9IHRydWU7XG5cbiAgICBASW5wdXQoKVxuICAgIHNob3dBZHJlc3NMaW5lMiA9IHRydWU7XG5cbiAgICBASW5wdXQoKVxuICAgIHNwZWNpZmllZENhbnRvbjogc3RyaW5nO1xuXG4gICAgQElucHV0KClcbiAgICBjb3VudHJ5UmVxdWlyZWQgPSB0cnVlO1xuXG4gICAgQElucHV0KClcbiAgICBzd2lzc05wYUxvY2FsaXR5UmVxdWlyZWQgPSB0cnVlO1xuXG4gICAgQElucHV0KClcbiAgICBzdHJlZXRSZXF1aXJlZDogYm9vbGVhbjtcblxuICAgIEBJbnB1dCgpXG4gICAgc3RyZWV0TnVtYmVyUmVxdWlyZWQgPSBmYWxzZTtcblxuICAgIEBJbnB1dCgpXG4gICAgZm9yZWlnblppcENvZGVSZXF1aXJlZCA9IHRydWU7XG5cbiAgICBASW5wdXQoKVxuICAgIGZvcmVpZ25Mb2NhbGl0eVJlcXVpcmVkID0gdHJ1ZTtcblxuICAgIEBJbnB1dCgpXG4gICAgZm9yZWlnblN0cmVldFJlcXVpcmVkOiBib29sZWFuO1xuXG4gICAgQElucHV0KClcbiAgICBmb3JlaWduU3RyZWV0TnVtYmVyUmVxdWlyZWQgPSBmYWxzZTtcblxuICAgIEBJbnB1dCgpXG4gICAgcG9zdE9mZmljZUJveFRleHRSZXF1aXJlZDogYm9vbGVhbjtcblxuICAgIEBJbnB1dCgpXG4gICAgYWRkcmVzc0xpbmUxUmVxdWlyZWQgPSBmYWxzZTtcblxuICAgIEBJbnB1dCgpXG4gICAgYWRkcmVzc0xpbmUyUmVxdWlyZWQgPSBmYWxzZTtcblxuICAgIEBJbnB1dCgpXG4gICAgd2l0aENvbXBhbnlMb2NhbGl0aWVzID0gZmFsc2U7XG5cbiAgICBjb3VudHJ5OiBDb3VudHJ5O1xuICAgIGxvY2FsaXR5OiBMb2NhbGl0eTtcbiAgICBzdHJlZXQ6IFN0cmVldDtcbiAgICBob3VzZU51bWJlcjogc3RyaW5nO1xuICAgIHBvc3RPZmZpY2VCb3hUZXh0OiBzdHJpbmc7XG4gICAgYWRkcmVzc0xpbmUxOiBzdHJpbmc7XG4gICAgYWRkcmVzc0xpbmUyOiBzdHJpbmc7XG5cbiAgICBjb3VudHJpZXM6IE9ic2VydmFibGU8Q291bnRyeVtdPjtcbiAgICBsb2NhbGl0aWVzOiBPYnNlcnZhYmxlPExvY2FsaXR5W10+O1xuICAgIHN0cmVldHM6IE9ic2VydmFibGU8U3RyZWV0W10+O1xuICAgIHN0cmVldE51bWJlcnM6IE9ic2VydmFibGU8U3RyZWV0TnVtYmVyW10+O1xuXG4gICAgc3RyZWV0Q3VzdG9tRXJyb3JzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge307XG5cbiAgICBwcml2YXRlIGlzbzJJZFN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4obnVsbCk7XG4gICAgcHJpdmF0ZSB6aXBDb2RlSWRTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+KG51bGwpO1xuICAgIHByaXZhdGUgZXN0cklkU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPihudWxsKTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIGh0dHBDbGllbnQ6IEh0dHBDbGllbnQsXG4gICAgICAgIHByaXZhdGUgbmdab25lOiBOZ1pvbmUsXG4gICAgICAgIHByaXZhdGUgZGljdGlvbmFyeVNlcnZpY2U6IFNka0RpY3Rpb25hcnlTZXJ2aWNlXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxuXG4gICAgaWRlbnRpdHkgPSA8VD4objogVCk6IFQgPT4gbjtcbiAgICBjb3VudHJ5SWRlbnRpdHkgPSAoY291bnRyeTogQ291bnRyeSk6IHN0cmluZyA9PiBjb3VudHJ5LmlzbzJJZDtcbiAgICBsb2NhbGl0eUlkZW50aXR5ID0gKGxvYzogTG9jYWxpdHkpOiBzdHJpbmcgPT4gbG9jLnBvc3RhbExvY2FsaXR5SGlzdG9yeUlkO1xuICAgIHN0cmVldElkZW50aXR5ID0gKHN0cmVldDogU3RyZWV0KTogc3RyaW5nID0+IHN0cmVldC5lc3RyaWQ7XG4gICAgc3RyZWV0R2VuZXJhdG9yID0gKGxvbmdOYW1lOiBzdHJpbmcpOiBTdHJlZXQgPT4gKHtcbiAgICAgICAgZXN0cmlkOiBudWxsLFxuICAgICAgICBsb25nTmFtZVxuICAgIH0pO1xuXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIHN1cGVyLm5nT25Jbml0KCk7XG5cbiAgICAgICAgaWYgKCF0aGlzLnNob3dQb3N0T2ZmaWNlQm94VGV4dCkge1xuICAgICAgICAgICAgdGhpcy5zdHJlZXRDdXN0b21FcnJvcnMuQXRMZWFzdE9uZU5vdE51bGwgPSB0aGlzLmRpY3Rpb25hcnlTZXJ2aWNlLmdldEtleVN5bmMoXG4gICAgICAgICAgICAgICAgJ2Vycm9ycy5Ob3ROdWxsJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY291bnRyaWVzID0gdGhpcy5nZXRDb3VudHJpZXMoKTtcblxuICAgICAgICB0aGlzLmxvY2FsaXRpZXMgPSB0aGlzLmlzbzJJZFN1YmplY3QucGlwZShcbiAgICAgICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgICAgICAgICAvLyBUaGUgbGlzdCBvZiBsb2NhbGl0aWVzLCBvciBhbiBlbXB0eSBhcnJheSBhcyB0aGUgZGVmYXVsdCB2YWx1ZS5cbiAgICAgICAgICAgIHN3aXRjaE1hcChpc28ySWQgPT4gdGhpcy5nZXRMb2NhbGl0aWVzKGlzbzJJZCkpLFxuICAgICAgICAgICAgc2hhcmVSZXBsYXkoMSlcbiAgICAgICAgKTtcblxuICAgICAgICB0aGlzLnN0cmVldHMgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICAgICAgICAgIHRoaXMuemlwQ29kZUlkU3ViamVjdCxcbiAgICAgICAgICAgIHRoaXMubG9jYWxpdGllc1xuICAgICAgICBdKS5waXBlKFxuICAgICAgICAgICAgLy8gVGhlIHppcENvZGVJZCB3aGVuIGxvY2FsaXR5IGNoYW5nZXMgb3IgbWF0Y2ggbG9jYWxpdHkgKHBvc3RhbExvY2FsaXR5SGlzdG9yeUlkKSBmcm9tIG1vZGVsXG4gICAgICAgICAgICBtYXAoXG4gICAgICAgICAgICAgICAgKFt6aXBDb2RlSWQsIGxvY2FsaXRpZXNdKSA9PlxuICAgICAgICAgICAgICAgICAgICB6aXBDb2RlSWQgfHxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5leHRyYWN0TG9jYWxpdHlaaXBDb2RlSWQobG9jYWxpdGllcywgdGhpcy5sb2NhbGl0eSlcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBkZWJvdW5jZVRpbWUoMCksXG4gICAgICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICAgICAgICAgLy8gVGhlIGxpc3Qgb2Ygc3RyZWV0cyBvciBhIGRlZmF1bHQgdmFsdWUgdG8gYW4gZW1wdHkgYXJyYXlcbiAgICAgICAgICAgIHN3aXRjaE1hcCh6aXBDb2RlSWQgPT4gdGhpcy5nZXRTdHJlZXRzRm9yKHppcENvZGVJZCkpLFxuICAgICAgICAgICAgc2hhcmVSZXBsYXkoMSlcbiAgICAgICAgKTtcblxuICAgICAgICB0aGlzLnN0cmVldE51bWJlcnMgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICAgICAgICAgIHRoaXMuZXN0cklkU3ViamVjdCxcbiAgICAgICAgICAgIHRoaXMuc3RyZWV0c1xuICAgICAgICBdKS5waXBlKFxuICAgICAgICAgICAgLy8gVGhlIGVzdHJpZCB3aGVuIHN0cmVldCBjaGFuZ2VzIG9yIG1hdGNoIHN0cmVldCAobG9uZ05hbWUpIGZyb20gbW9kZWxcbiAgICAgICAgICAgIG1hcChcbiAgICAgICAgICAgICAgICAoW2VzdHJpZCwgc3RyZWV0c10pID0+XG4gICAgICAgICAgICAgICAgICAgIGVzdHJpZCB8fCB0aGlzLmV4dHJhY3RTdHJlZXRFc3RyaWQoc3RyZWV0cywgdGhpcy5zdHJlZXQpXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgZGVib3VuY2VUaW1lKDApLFxuICAgICAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgICAgICAgIC8vIFRoZSBsaXN0IG9mIHN0cmVldHMgb3IgYSBkZWZhdWx0IHZhbHVlIHRvIGFuIGVtcHR5IGFycmF5XG4gICAgICAgICAgICBzd2l0Y2hNYXAoZXN0cmlkID0+IHRoaXMuZ2V0U3RyZWV0TnVtYmVyRm9yKGVzdHJpZCkpLFxuICAgICAgICAgICAgLy8gU29tZSBzdHJlZXQgbWlnaHQgbm90IGhhdmUgYW4gbmFtZSwgUmVmSW5mIHNvbWV0aW1lcyByZXR1cm5zIHdlaXJkIGRhdGEuXG4gICAgICAgICAgICBtYXAodmFsdWVzID0+IHZhbHVlcy5maWx0ZXIoc3RyZWV0TnVtYmVyID0+ICEhc3RyZWV0TnVtYmVyLm5hbWUpKSxcbiAgICAgICAgICAgIG1hcCh2YWx1ZXMgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbGxhdG9yID0gbmV3IEludGwuQ29sbGF0b3IodW5kZWZpbmVkLCB7XG4gICAgICAgICAgICAgICAgICAgIG51bWVyaWM6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIHNlbnNpdGl2aXR5OiAnYmFzZSdcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWVzLnNvcnQoKGEsIGIpID0+IGNvbGxhdG9yLmNvbXBhcmUoYS5uYW1lLCBiLm5hbWUpKTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgc2hhcmVSZXBsYXkoMSlcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcnhqcy1hbmd1bGFyL3ByZWZlci1hc3luYy1waXBlXG4gICAgICAgIHRoaXMubmdab25lLm9uTWljcm90YXNrRW1wdHkucGlwZShmaXJzdCgpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5jbGVhckF1dG9jb21wbGV0ZXNXaGVuQ291bnRyeUlzVW5hcHByb3ByaWF0ZWRUb0NvbXBvbmVudENvbmZpZ3VyYXRpb24oKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldERlZmF1bHRDb3VudHJ5KCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgdXBkYXRlQWRkcmVzcygpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgdmFsaWRWYWx1ZSA9IHRoaXMuZ2V0VmFsaWRWYWx1ZSgpO1xuICAgICAgICBpZiAodHlwZW9mIHZhbGlkVmFsdWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZU5nTW9kZWwodmFsaWRWYWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1cGRhdGVOZ01vZGVsKHZhbHVlOiBBZGRyZXNzKTogdm9pZCB7XG4gICAgICAgIC8vIGF2b2lkIHdyb25nZnVsbCBwcmVmaWxsIGJ5IHNlc3Npb24gaW5mb1xuICAgICAgICBpZiAoIXRoaXMuc2hvd0FkcmVzc0xpbmVzIHx8ICF0aGlzLnNob3dBZHJlc3NMaW5lMSkge1xuICAgICAgICAgICAgdmFsdWUuYWRkcmVzc0xpbmUxID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuc2hvd0FkcmVzc0xpbmVzIHx8ICF0aGlzLnNob3dBZHJlc3NMaW5lMikge1xuICAgICAgICAgICAgdmFsdWUuYWRkcmVzc0xpbmUyID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuc2hvd1Bvc3RPZmZpY2VCb3hUZXh0KSB7XG4gICAgICAgICAgICB2YWx1ZS5wb3N0T2ZmaWNlQm94VGV4dCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgLy8gbmV2ZXIgdXBkYXRhYmxlIGluIHRoZSBjb21wb25lbnRcbiAgICAgICAgdmFsdWUucG9zdE9mZmljZUJveE51bWJlciA9IG51bGw7XG5cbiAgICAgICAgc3VwZXIudXBkYXRlTmdNb2RlbCh2YWx1ZSk7XG4gICAgfVxuXG4gICAgaGFuZGxlVXNlcklucHV0KCk6IHZvaWQge1xuICAgICAgICBjb25zdCB2YWxpZFZhbHVlID0gdGhpcy5nZXRWYWxpZFZhbHVlKCk7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsaWRWYWx1ZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlQ2hhbmdlKHZhbGlkVmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25Nb2RlbENoYW5nZSh2YWx1ZTogQWRkcmVzcyk6IHZvaWQge1xuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuY291bnRyeSA9IHZhbHVlLmNvdW50cnk7XG4gICAgICAgICAgICB0aGlzLmxvY2FsaXR5ID0gdmFsdWUubG9jYWxpdHk7XG4gICAgICAgICAgICB0aGlzLnN0cmVldCA9IHZhbHVlLnN0cmVldDtcbiAgICAgICAgICAgIHRoaXMuaG91c2VOdW1iZXIgPSB2YWx1ZS5ob3VzZU51bWJlcjtcbiAgICAgICAgICAgIHRoaXMucG9zdE9mZmljZUJveFRleHQgPSB2YWx1ZS5wb3N0T2ZmaWNlQm94VGV4dDtcbiAgICAgICAgICAgIHRoaXMuYWRkcmVzc0xpbmUxID0gdmFsdWUuYWRkcmVzc0xpbmUxO1xuICAgICAgICAgICAgdGhpcy5hZGRyZXNzTGluZTIgPSB2YWx1ZS5hZGRyZXNzTGluZTI7XG4gICAgICAgIH0gZWxzZSBpZiAoIXZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLmxvY2FsaXR5ID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuc3RyZWV0ID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuaG91c2VOdW1iZXIgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5wb3N0T2ZmaWNlQm94VGV4dCA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLmFkZHJlc3NMaW5lMSA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLmFkZHJlc3NMaW5lMiA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpc1N3aXNzKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gISEoXG4gICAgICAgICAgICB0aGlzLmlzT25seVN3aXNzIHx8XG4gICAgICAgICAgICAodGhpcy5jb3VudHJ5ICYmIHRoaXMuY291bnRyeS5pc28ySWQgPT09IFNXSVNTX0lTT19JRClcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICB1c2VySW5wdXRDb3VudHJ5KCk6IHZvaWQge1xuICAgICAgICB0aGlzLnppcENvZGVJZFN1YmplY3QubmV4dChudWxsKTtcbiAgICAgICAgdGhpcy5lc3RySWRTdWJqZWN0Lm5leHQobnVsbCk7XG5cbiAgICAgICAgdGhpcy5sb2NhbGl0eSA9IG51bGw7XG4gICAgICAgIHRoaXMuc3RyZWV0ID0gbnVsbDtcbiAgICAgICAgdGhpcy5ob3VzZU51bWJlciA9IG51bGw7XG4gICAgICAgIHRoaXMucG9zdE9mZmljZUJveFRleHQgPSBudWxsO1xuICAgICAgICB0aGlzLmFkZHJlc3NMaW5lMSA9IG51bGw7XG4gICAgICAgIHRoaXMuYWRkcmVzc0xpbmUyID0gbnVsbDtcblxuICAgICAgICB0aGlzLnVwZGF0ZUFkZHJlc3MoKTtcbiAgICAgICAgdGhpcy5oYW5kbGVVc2VySW5wdXQoKTtcbiAgICB9XG5cbiAgICB1c2VySW5wdXRMb2NhbGl0eShsb2NhbGl0eTogdW5rbm93bik6IHZvaWQge1xuICAgICAgICBpZiAoIWxvY2FsaXR5KSB7XG4gICAgICAgICAgICB0aGlzLnppcENvZGVJZFN1YmplY3QubmV4dChudWxsKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBBbHdheXMgcmVzZXQgc3VnZ2VzdGlvbiBsaXN0IG9mIGhvdXNlTnVtYmVyIHdoZW4gbG9jYWxpdHkgY2hhbmdlc1xuICAgICAgICB0aGlzLmVzdHJJZFN1YmplY3QubmV4dChudWxsKTtcblxuICAgICAgICB0aGlzLnN0cmVldCA9IG51bGw7XG4gICAgICAgIHRoaXMuaG91c2VOdW1iZXIgPSBudWxsO1xuXG4gICAgICAgIHRoaXMudXBkYXRlQWRkcmVzcygpO1xuICAgICAgICB0aGlzLmhhbmRsZVVzZXJJbnB1dCgpO1xuICAgIH1cblxuICAgIHVzZXJJbnB1dFN0cmVldChzdHJlZXQ6IHVua25vd24pOiB2b2lkIHtcbiAgICAgICAgaWYgKCFzdHJlZXQpIHtcbiAgICAgICAgICAgIHRoaXMuZXN0cklkU3ViamVjdC5uZXh0KG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaG91c2VOdW1iZXIgPSBudWxsO1xuICAgICAgICB0aGlzLmhhbmRsZVVzZXJJbnB1dCgpO1xuICAgIH1cblxuICAgIGNvdW50cnlVcGRhdGVkKGNvdW50cnk6IENvdW50cnkpOiB2b2lkIHtcbiAgICAgICAgLy8gTm8gZG91YmxlLWJpbmRpbmcgb24gY291bnRyeSBpbiB2aWV3IHRvIGVuc3VyZSB3ZSB1cGRhdGUgcHJvcGVybHkgbW9kZWxcbiAgICAgICAgdGhpcy5jb3VudHJ5ID0gY291bnRyeTtcbiAgICAgICAgdGhpcy51cGRhdGVBZGRyZXNzKCk7XG5cbiAgICAgICAgaWYgKCFjb3VudHJ5KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7IGlzbzJJZCB9ID0gY291bnRyeTtcbiAgICAgICAgdGhpcy5pc28ySWRTdWJqZWN0Lm5leHQoaXNvMklkKTtcbiAgICB9XG5cbiAgICBnZXRMb2NhbGl0eURpc3BsYXllZE5hbWUobG9jYWxpdHk6IExvY2FsaXR5KTogc3RyaW5nIHwgdm9pZCB7XG4gICAgICAgIGlmICghbG9jYWxpdHkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBgJHtsb2NhbGl0eS56aXBDb2RlfSAke2xvY2FsaXR5LmxvbmdOYW1lfWA7XG4gICAgfVxuXG4gICAgbG9jYWxpdHlVcGRhdGVkKGxvY2FsaXR5OiBMb2NhbGl0eSk6IHZvaWQge1xuICAgICAgICAvLyBObyBkb3VibGUtYmluZGluZyBvbiBsb2NhbGl0eSBpbiB2aWV3IHRvIGVuc3VyZSB3ZSB1cGRhdGUgcHJvcGVybHkgbW9kZWxcbiAgICAgICAgdGhpcy5sb2NhbGl0eSA9IGxvY2FsaXR5O1xuICAgICAgICB0aGlzLnVwZGF0ZUFkZHJlc3MoKTtcblxuICAgICAgICBpZiAoIWxvY2FsaXR5KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7IHppcENvZGVJZCB9ID0gbG9jYWxpdHk7XG4gICAgICAgIHRoaXMuemlwQ29kZUlkU3ViamVjdC5uZXh0KHppcENvZGVJZCk7XG4gICAgfVxuXG4gICAgc3RyZWV0VXBkYXRlZChzdHJlZXQ6IFN0cmVldCk6IHZvaWQge1xuICAgICAgICAvLyBObyBkb3VibGUtYmluZGluZyBvbiBzdHJlZXQgaW4gdmlldyB0byBlbnN1cmUgd2UgdXBkYXRlIHByb3Blcmx5IG1vZGVsXG4gICAgICAgIHRoaXMuc3RyZWV0ID0gc3RyZWV0O1xuICAgICAgICB0aGlzLnVwZGF0ZUFkZHJlc3MoKTtcblxuICAgICAgICBpZiAoIXN0cmVldCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgeyBlc3RyaWQgfSA9IHN0cmVldDtcbiAgICAgICAgdGhpcy5lc3RySWRTdWJqZWN0Lm5leHQoZXN0cmlkKTtcbiAgICB9XG5cbiAgICBpc1N0cmVldFJlcXVpcmVkKCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoaXNEZWZpbmVkKHRoaXMuc3RyZWV0UmVxdWlyZWQpKSB7XG4gICAgICAgICAgICAvLyByZXNwZWN0IG92ZXJyaWRlbiB2YWx1ZVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3RyZWV0UmVxdWlyZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuc2hvd1Bvc3RPZmZpY2VCb3hUZXh0KSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAhdGhpcy5wb3N0T2ZmaWNlQm94VGV4dCB8fCAhIXRoaXMuc3RyZWV0O1xuICAgIH1cblxuICAgIGlzRm9yZWlnblN0cmVldFJlcXVpcmVkKCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoaXNEZWZpbmVkKHRoaXMuZm9yZWlnblN0cmVldFJlcXVpcmVkKSkge1xuICAgICAgICAgICAgLy8gcmVzcGVjdCBvdmVycmlkZW4gdmFsdWVcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZvcmVpZ25TdHJlZXRSZXF1aXJlZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5zaG93UG9zdE9mZmljZUJveFRleHQpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICF0aGlzLnBvc3RPZmZpY2VCb3hUZXh0IHx8ICEhdGhpcy5zdHJlZXQ7XG4gICAgfVxuXG4gICAgaXNQb3N0T2ZmaWNlQm94VGV4dFJlcXVpcmVkKCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoaXNEZWZpbmVkKHRoaXMucG9zdE9mZmljZUJveFRleHRSZXF1aXJlZCkpIHtcbiAgICAgICAgICAgIC8vIHJlc3BlY3Qgb3ZlcnJpZGVuIHZhbHVlXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wb3N0T2ZmaWNlQm94VGV4dFJlcXVpcmVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAhdGhpcy5zdHJlZXQgfHwgISF0aGlzLnBvc3RPZmZpY2VCb3hUZXh0O1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0Q291bnRyaWVzKCk6IE9ic2VydmFibGU8Q291bnRyeVtdPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQuZ2V0PENvdW50cnlbXT4odGhpcy5jb3VudHJpZXNVcmwpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0TG9jYWxpdGllcyhpc28ySWQ6IHN0cmluZyk6IE9ic2VydmFibGU8TG9jYWxpdHlbXT4ge1xuICAgICAgICBpZiAoaXNvMklkICE9PSBTV0lTU19JU09fSUQpIHtcbiAgICAgICAgICAgIHJldHVybiBvZihbXSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBxdWVyeVBhcmFtcyA9ICEhdGhpcy53aXRoQ29tcGFueUxvY2FsaXRpZXNcbiAgICAgICAgICAgID8gJz93aXRoQ29tcGFueUxvY2FsaXRpZXM9dHJ1ZSdcbiAgICAgICAgICAgIDogJyc7XG5cbiAgICAgICAgaWYgKCEhdGhpcy5zcGVjaWZpZWRDYW50b24pIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQuZ2V0PExvY2FsaXR5W10+KFxuICAgICAgICAgICAgICAgIGBhcGkvcmVmaW5mL2xvY2FsaXR5LyR7dGhpcy5zcGVjaWZpZWRDYW50b259JHtxdWVyeVBhcmFtc31gXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5nZXQ8TG9jYWxpdHlbXT4oXG4gICAgICAgICAgICAgICAgYGFwaS9yZWZpbmYvbG9jYWxpdHkvYWxsJHtxdWVyeVBhcmFtc31gXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRTdHJlZXROdW1iZXJGb3IoZXN0cmlkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPFN0cmVldE51bWJlcltdPiB7XG4gICAgICAgIGlmICghZXN0cmlkKSB7XG4gICAgICAgICAgICByZXR1cm4gb2YoW10pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdXJsID0gYGFwaS9yZWZpbmYvYWRkcmVzc2VzLyR7ZXN0cmlkfWA7XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQuZ2V0PFN0cmVldE51bWJlcltdPih1cmwpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0U3RyZWV0c0Zvcih6aXBDb2RlSWQ6IHN0cmluZyk6IE9ic2VydmFibGU8U3RyZWV0W10+IHtcbiAgICAgICAgaWYgKCF6aXBDb2RlSWQpIHtcbiAgICAgICAgICAgIHJldHVybiBvZihbXSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB1cmwgPSBgYXBpL3JlZmluZi9zdHJlZXRzLyR7emlwQ29kZUlkfWA7XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQuZ2V0PFN0cmVldFtdPih1cmwpO1xuICAgIH1cblxuICAgIHByaXZhdGUgY2xlYXJBdXRvY29tcGxldGVzV2hlbkNvdW50cnlJc1VuYXBwcm9wcmlhdGVkVG9Db21wb25lbnRDb25maWd1cmF0aW9uKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5pc01vZGVsRW1wdHkoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5pc09ubHlTd2lzcyAmJlxuICAgICAgICAgICAgdGhpcy5jb3VudHJ5ICYmXG4gICAgICAgICAgICB0aGlzLmNvdW50cnkuaXNvMklkICE9PSBTV0lTU19JU09fSURcbiAgICAgICAgKSB7XG4gICAgICAgICAgICAvLyBEbyBub3QgcmVtb3ZlIHRoaXMgd2FybmluZy4gTmVlZGVkIGZvciBkZWJ1Z2dpbmcgYXQgYWxsIHRpbWUuXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1sZW5cbiAgICAgICAgICAgICAgICBgQ291bnRyeSBhZGRyZXNzIHdhcyAnJHt0aGlzLmNvdW50cnkuaXNvMklkfScuIE9ubHkgc3dpc3MgaXMgYXNrZWQgaW4gY29tcG9uZW50ICdmb2Vobi1pbnB1dC1hZGRyZXNzJyBjb25maWd1cmF0aW9uLiBBZGRyZXNzIG1vZGVsIHJlc2V0dGVkLmBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLmNsZWFyQXV0b2NvbXBsZXRlcygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXREZWZhdWx0Q291bnRyeSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuaXNPbmx5U3dpc3MgfHwgIXRoaXMuY291bnRyeSB8fCAhdGhpcy5jb3VudHJ5LmlzbzJJZCkge1xuICAgICAgICAgICAgdGhpcy5jb3VudHJ5ID0ge1xuICAgICAgICAgICAgICAgIGlzbzJJZDogU1dJU1NfSVNPX0lELFxuICAgICAgICAgICAgICAgIHNob3J0TmFtZUZyOiAnU3Vpc3NlJ1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMuaXNvMklkU3ViamVjdC5uZXh0KFNXSVNTX0lTT19JRCk7XG5cbiAgICAgICAgICAgIHRoaXMudXBkYXRlQWRkcmVzcygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjbGVhckF1dG9jb21wbGV0ZXMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY291bnRyeSA9IG51bGw7XG4gICAgICAgIHRoaXMuc3RyZWV0ID0gbnVsbDtcbiAgICAgICAgdGhpcy5sb2NhbGl0eSA9IG51bGw7XG4gICAgICAgIHRoaXMuaG91c2VOdW1iZXIgPSBudWxsO1xuICAgICAgICAvLyBObyB1cGRhdGVBZGRyZXNzKCkgaGVyZSBiZWNhdXNlIGRvbmUgaW4gc2V0RGVmYXVsdENvdW50cnkoKVxuICAgIH1cblxuICAgIHByaXZhdGUgZXh0cmFjdExvY2FsaXR5WmlwQ29kZUlkKFxuICAgICAgICBsb2NhbGl0aWVzOiBMb2NhbGl0eVtdLFxuICAgICAgICBsb2NhbGl0eVRvTWF0Y2g6IExvY2FsaXR5XG4gICAgKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKGxvY2FsaXR5VG9NYXRjaCAmJiBsb2NhbGl0eVRvTWF0Y2gucG9zdGFsTG9jYWxpdHlIaXN0b3J5SWQpIHtcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoZWQgPSBsb2NhbGl0aWVzLmZpbmQoXG4gICAgICAgICAgICAgICAgKGxvY2FsaXR5OiBMb2NhbGl0eSkgPT5cbiAgICAgICAgICAgICAgICAgICAgbG9jYWxpdHkucG9zdGFsTG9jYWxpdHlIaXN0b3J5SWQgPT09XG4gICAgICAgICAgICAgICAgICAgIGxvY2FsaXR5VG9NYXRjaC5wb3N0YWxMb2NhbGl0eUhpc3RvcnlJZFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChtYXRjaGVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1hdGNoZWQuemlwQ29kZUlkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBleHRyYWN0U3RyZWV0RXN0cmlkKFxuICAgICAgICBzdHJlZXRzOiBTdHJlZXRbXSxcbiAgICAgICAgc3RyZWV0VG9NYXRjaDogU3RyZWV0XG4gICAgKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKHN0cmVldFRvTWF0Y2ggJiYgc3RyZWV0VG9NYXRjaC5sb25nTmFtZSkge1xuICAgICAgICAgICAgY29uc3QgbWF0Y2hlZCA9IHN0cmVldHMuZmluZChcbiAgICAgICAgICAgICAgICAoc3RyZWV0OiBTdHJlZXQpID0+IHN0cmVldC5sb25nTmFtZSA9PT0gc3RyZWV0VG9NYXRjaC5sb25nTmFtZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChtYXRjaGVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1hdGNoZWQuZXN0cmlkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRWYWxpZFZhbHVlKCk6IEFkZHJlc3MgfCBudWxsIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgaWYgKHRoaXMuaXNNb2RlbEVtcHR5KCkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm1vZGVsXyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvdW50cnk6IHRoaXMuY291bnRyeSxcbiAgICAgICAgICAgIGxvY2FsaXR5OiB0aGlzLmdldFZhbGlkTG9jYWxpdHkodGhpcy5sb2NhbGl0eSksXG4gICAgICAgICAgICBzdHJlZXQ6IHRoaXMuc3RyZWV0LFxuICAgICAgICAgICAgaG91c2VOdW1iZXI6IHRoaXMuaG91c2VOdW1iZXIsXG4gICAgICAgICAgICBwb3N0T2ZmaWNlQm94VGV4dDogdGhpcy5wb3N0T2ZmaWNlQm94VGV4dCxcbiAgICAgICAgICAgIGFkZHJlc3NMaW5lMTogdGhpcy5hZGRyZXNzTGluZTEsXG4gICAgICAgICAgICBhZGRyZXNzTGluZTI6IHRoaXMuYWRkcmVzc0xpbmUyXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRWYWxpZExvY2FsaXR5KHZhbHVlOiBMb2NhbGl0eSk6IExvY2FsaXR5IHtcbiAgICAgICAgLy8gUFJFU1RBS0lULTM1MjogTmVlZCBhIGZha2UgJ3Bvc3RhbExvY2FsaXR5SGlzdG9yeUlkJyBmb3IgaW5kaXZpZHVhbCBlcnJvcnMgb24gJ3ppcENvZGUnIGFuZCAnbG9uZ05hbWUnXG4gICAgICAgIGlmICghdGhpcy5pc1N3aXNzKCkgJiYgIXZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4geyBwb3N0YWxMb2NhbGl0eUhpc3RvcnlJZDogJy0xJyB9O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNNb2RlbEVtcHR5KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgdGhpcy5pc0VtcHR5KHRoaXMuY291bnRyeSkgJiZcbiAgICAgICAgICAgIHRoaXMuaXNFbXB0eSh0aGlzLmxvY2FsaXR5KSAmJlxuICAgICAgICAgICAgdGhpcy5pc0VtcHR5KHRoaXMuc3RyZWV0KSAmJlxuICAgICAgICAgICAgdGhpcy5pc0VtcHR5KHRoaXMuaG91c2VOdW1iZXIpICYmXG4gICAgICAgICAgICB0aGlzLmlzRW1wdHkodGhpcy5wb3N0T2ZmaWNlQm94VGV4dCkgJiZcbiAgICAgICAgICAgIHRoaXMuaXNFbXB0eSh0aGlzLmFkZHJlc3NMaW5lMSkgJiZcbiAgICAgICAgICAgIHRoaXMuaXNFbXB0eSh0aGlzLmFkZHJlc3NMaW5lMilcbiAgICAgICAgKTtcbiAgICB9XG59XG4iLCI8ZGl2XG4gICAgW2F0dHIuaWRdPVwiYnVpbGRJZCgpICsgJ0NvbnRhaW5lcidcIlxuICAgIGNsYXNzPVwiZm9ybS1ncm91cFwiXG4gICAgW2NsYXNzLmhhcy1kYW5nZXJdPVwiaGFzRXJyb3JzVG9EaXNwbGF5KClcIlxuICAgIFtjbGFzcy52ZC1mb3JtLWdyb3VwLWRhbmdlcl09XCJoYXNFcnJvcnNUb0Rpc3BsYXkoKVwiXG4gICAgW3RhYkluZGV4XT1cIi0xXCJcbj5cbiAgICA8ZmllbGRzZXRcbiAgICAgICAgY2xhc3M9XCJtYi0zXCJcbiAgICAgICAgW2F0dHIuYXJpYS1kZXNjcmliZWRieV09XCJnZXREZXNjcmliZWRCeSgpXCJcbiAgICAgICAgW2F0dHIuYXJpYS1pbnZhbGlkXT1cImhhc0Vycm9yc1RvRGlzcGxheSgpIHx8IG51bGxcIlxuICAgID5cbiAgICAgICAgPGxlZ2VuZCAqbmdJZj1cIiEhbGFiZWxcIiBbbmdDbGFzc109XCJpc0xhYmVsU3JPbmx5ID8gJ3NyLW9ubHknIDogJ3ZkLXAnXCI+XG4gICAgICAgICAgICA8c3BhbiBbaW5uZXJIVE1MXT1cImxhYmVsXCI+PC9zcGFuPlxuICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAqbmdJZj1cIiFyZXF1aXJlZCAmJiAhaGlkZU5vdFJlcXVpcmVkRXh0cmFMYWJlbFwiXG4gICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7eyAnZm9laG4taW5wdXQub3B0aW9uYWwnIHwgZnJvbURpY3Rpb25hcnkgfX1cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9sZWdlbmQ+XG5cbiAgICAgICAgPGZvZWhuLXZhbGlkYXRpb24tYWxlcnRzIFtjb21wb25lbnRdPVwidGhpc1wiPjwvZm9laG4tdmFsaWRhdGlvbi1hbGVydHM+XG5cbiAgICAgICAgPHNtYWxsXG4gICAgICAgICAgICAqbmdJZj1cImhlbHBUZXh0XCJcbiAgICAgICAgICAgIFthdHRyLmlkXT1cImJ1aWxkSWQoKSArICdIZWxwJ1wiXG4gICAgICAgICAgICBjbGFzcz1cInRleHQtc2Vjb25kYXJ5XCJcbiAgICAgICAgICAgIFtpbm5lckhUTUxdPVwiaGVscFRleHRcIlxuICAgICAgICA+PC9zbWFsbD5cblxuICAgICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG5cbiAgICAgICAgPGZvZWhuLWF1dG9jb21wbGV0ZVxuICAgICAgICAgICAgKm5nSWY9XCIhaXNPbmx5U3dpc3NcIlxuICAgICAgICAgICAgW2xhYmVsXT1cIidmb2Vobi1pbnB1dC1hZGRyZXNzLmNvdW50cnkubGFiZWwnIHwgZnJvbURpY3Rpb25hcnlcIlxuICAgICAgICAgICAgW2VsZW1lbnRzXT1cImNvdW50cmllcyB8IGFzeW5jXCJcbiAgICAgICAgICAgIGVsZW1lbnRMYWJlbD1cInNob3J0TmFtZUZyXCJcbiAgICAgICAgICAgIFtlbGVtZW50VmFsdWVdPVwiaWRlbnRpdHlcIlxuICAgICAgICAgICAgW2VsZW1lbnRWYWx1ZUlkZW50aXR5XT1cImNvdW50cnlJZGVudGl0eVwiXG4gICAgICAgICAgICAobW9kZWxDaGFuZ2UpPVwiY291bnRyeVVwZGF0ZWQoJGV2ZW50KVwiXG4gICAgICAgICAgICAodXNlcklucHV0KT1cInVzZXJJbnB1dENvdW50cnkoKVwiXG4gICAgICAgICAgICBbbW9kZWxdPVwiY291bnRyeVwiXG4gICAgICAgICAgICBbbmFtZV09XCJuYW1lICsgJy5jb3VudHJ5J1wiXG4gICAgICAgICAgICBbcmVxdWlyZWRdPVwiY291bnRyeVJlcXVpcmVkXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgID48L2ZvZWhuLWF1dG9jb21wbGV0ZT5cblxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNTd2lzcygpXCI+XG4gICAgICAgICAgICA8Zm9laG4tYXV0b2NvbXBsZXRlXG4gICAgICAgICAgICAgICAgW2xhYmVsXT1cIidmb2Vobi1pbnB1dC1hZGRyZXNzLmxvY2FsaXR5LmxhYmVsJyB8IGZyb21EaWN0aW9uYXJ5XCJcbiAgICAgICAgICAgICAgICBbZWxlbWVudHNdPVwibG9jYWxpdGllcyB8IGFzeW5jXCJcbiAgICAgICAgICAgICAgICBbZWxlbWVudExhYmVsXT1cImdldExvY2FsaXR5RGlzcGxheWVkTmFtZVwiXG4gICAgICAgICAgICAgICAgW2VsZW1lbnRWYWx1ZV09XCJpZGVudGl0eVwiXG4gICAgICAgICAgICAgICAgW2VsZW1lbnRWYWx1ZUlkZW50aXR5XT1cImxvY2FsaXR5SWRlbnRpdHlcIlxuICAgICAgICAgICAgICAgIChtb2RlbENoYW5nZSk9XCJsb2NhbGl0eVVwZGF0ZWQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKHVzZXJJbnB1dCk9XCJ1c2VySW5wdXRMb2NhbGl0eSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICBbbW9kZWxdPVwibG9jYWxpdHlcIlxuICAgICAgICAgICAgICAgIFtuYW1lXT1cIm5hbWUgKyAnLmxvY2FsaXR5J1wiXG4gICAgICAgICAgICAgICAgW2FsbG93Q3VzdG9tVmFsdWVdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgIFtyZXF1aXJlZF09XCJzd2lzc05wYUxvY2FsaXR5UmVxdWlyZWRcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhY291bnRyeSB8fCBkaXNhYmxlZFwiXG4gICAgICAgICAgICA+PC9mb2Vobi1hdXRvY29tcGxldGU+XG5cbiAgICAgICAgICAgIDxmb2Vobi1hdXRvY29tcGxldGVcbiAgICAgICAgICAgICAgICBbbGFiZWxdPVwiJ2ZvZWhuLWlucHV0LWFkZHJlc3Muc3RyZWV0LmxhYmVsJyB8IGZyb21EaWN0aW9uYXJ5XCJcbiAgICAgICAgICAgICAgICBbZWxlbWVudHNdPVwic3RyZWV0cyB8IGFzeW5jXCJcbiAgICAgICAgICAgICAgICBlbGVtZW50TGFiZWw9XCJsb25nTmFtZVwiXG4gICAgICAgICAgICAgICAgW2VsZW1lbnRWYWx1ZV09XCJpZGVudGl0eVwiXG4gICAgICAgICAgICAgICAgW2VsZW1lbnRWYWx1ZUlkZW50aXR5XT1cInN0cmVldElkZW50aXR5XCJcbiAgICAgICAgICAgICAgICAobW9kZWxDaGFuZ2UpPVwic3RyZWV0VXBkYXRlZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICBbbW9kZWxdPVwic3RyZWV0XCJcbiAgICAgICAgICAgICAgICBbbmFtZV09XCJuYW1lICsgJy5zdHJlZXQnXCJcbiAgICAgICAgICAgICAgICBbYWxsb3dDdXN0b21WYWx1ZV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBbY3VzdG9tVmFsdWVNb2RlbEdlbmVyYXRvcl09XCJzdHJlZXRHZW5lcmF0b3JcIlxuICAgICAgICAgICAgICAgIFtyZXF1aXJlZF09XCJpc1N0cmVldFJlcXVpcmVkKClcIlxuICAgICAgICAgICAgICAgIFtoZWxwVGV4dF09XCJcbiAgICAgICAgICAgICAgICAgICAgJ2ZvZWhuLWlucHV0LWFkZHJlc3Muc3RyZWV0LmhlbHAtdGV4dCcgfCBmcm9tRGljdGlvbmFyeVxuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgW2N1c3RvbUVycm9yc109XCJzdHJlZXRDdXN0b21FcnJvcnNcIlxuICAgICAgICAgICAgICAgICh1c2VySW5wdXQpPVwidXNlcklucHV0U3RyZWV0KCRldmVudClcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhY291bnRyeSB8fCBkaXNhYmxlZFwiXG4gICAgICAgICAgICA+PC9mb2Vobi1hdXRvY29tcGxldGU+XG5cbiAgICAgICAgICAgIDxmb2Vobi1hdXRvY29tcGxldGVcbiAgICAgICAgICAgICAgICBbbGFiZWxdPVwiXG4gICAgICAgICAgICAgICAgICAgICdmb2Vobi1pbnB1dC1hZGRyZXNzLmhvdXNlTnVtYmVyLmxhYmVsJyB8IGZyb21EaWN0aW9uYXJ5XG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICBbZWxlbWVudHNdPVwic3RyZWV0TnVtYmVycyB8IGFzeW5jXCJcbiAgICAgICAgICAgICAgICBlbGVtZW50TGFiZWw9XCJuYW1lXCJcbiAgICAgICAgICAgICAgICBlbGVtZW50VmFsdWU9XCJuYW1lXCJcbiAgICAgICAgICAgICAgICBbKG1vZGVsKV09XCJob3VzZU51bWJlclwiXG4gICAgICAgICAgICAgICAgW25hbWVdPVwibmFtZSArICcuaG91c2VOdW1iZXInXCJcbiAgICAgICAgICAgICAgICBbYWxsb3dDdXN0b21WYWx1ZV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBbaGVscFRleHRdPVwiXG4gICAgICAgICAgICAgICAgICAgICdmb2Vobi1pbnB1dC1hZGRyZXNzLmhvdXNlTnVtYmVyLmhlbHAtdGV4dCcgfCBmcm9tRGljdGlvbmFyeVxuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgKG1vZGVsQ2hhbmdlKT1cInVwZGF0ZUFkZHJlc3MoKVwiXG4gICAgICAgICAgICAgICAgKHVzZXJJbnB1dCk9XCJoYW5kbGVVc2VySW5wdXQoKVwiXG4gICAgICAgICAgICAgICAgW3JlcXVpcmVkXT1cInN0cmVldE51bWJlclJlcXVpcmVkXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWNvdW50cnkgfHwgZGlzYWJsZWRcIlxuICAgICAgICAgICAgPjwvZm9laG4tYXV0b2NvbXBsZXRlPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzU3dpc3MoKVwiPlxuICAgICAgICAgICAgPCEtLVxuICAgICAgICAgICAgQ29tcG9uZW50IDxmb2Vobi1pbnB1dC1mb3JlaWduLWxvY2FsaXR5PiBpcyBzcGVjaWFsIGJlY2F1c2Ugd2UgdXNlIHRoZSBzYW1lIG1vZGVsIHdoZW4gc3dpc3Mgb3IgZm9yZWlnbmVyLlxuICAgICAgICAgICAgVG8gZG8gc28sIHdlIG5lZWQ6XG4gICAgICAgICAgICAgICAgLSBFcnJvcnMgd2lsbCBiZSBiaW5kIG9uICdsb2NhbGl0eScgd2hlbiBOVUxMIG9yIG9uICd6aXBDb2RlJyBhbmQgJ2xvbmdOYW1lJyBtb2RlbCBpbnNpZGUgY29tcG9uZW50IHdoZW4gRU1QVFlcbiAgICAgICAgICAgICAgICAtIEhpZGUgbGFiZWwgZnJvbSBjb21wb25lbnQgYmVjYXVzZSB3ZSBuZWVkIGxhYmVsIGZyb20gY2hpbGRyZW4gdG8gYmUgZGlzcGxheWVkIChpc0xhYmVsU3JPbmx5OiB0cnVlKVxuICAgICAgICAgICAgICAgIC0gcmVxdWlyZWQgYW5kIGRpc2FibGVkIHBhcmFtcyBhcmUgdHJhbnNtaXR0ZWQgdG8gY2hpbGRyZW5cbiAgICAgICAgICAgICAtLT5cbiAgICAgICAgICAgIDxmb2Vobi1pbnB1dC1mb3JlaWduLWxvY2FsaXR5XG4gICAgICAgICAgICAgICAgW2xhYmVsXT1cIidmb2Vobi1pbnB1dC1hZGRyZXNzLmxvY2FsaXR5LmxhYmVsJyB8IGZyb21EaWN0aW9uYXJ5XCJcbiAgICAgICAgICAgICAgICBbbmFtZV09XCJuYW1lICsgJy5sb2NhbGl0eSdcIlxuICAgICAgICAgICAgICAgIFsobW9kZWwpXT1cImxvY2FsaXR5XCJcbiAgICAgICAgICAgICAgICBbemlwQ29kZVJlcXVpcmVkXT1cImZvcmVpZ25aaXBDb2RlUmVxdWlyZWRcIlxuICAgICAgICAgICAgICAgIFtsb2NhbGl0eVJlcXVpcmVkXT1cImZvcmVpZ25Mb2NhbGl0eVJlcXVpcmVkXCJcbiAgICAgICAgICAgICAgICBbaXNMYWJlbFNyT25seV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWNvdW50cnkgfHwgZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgIChtb2RlbENoYW5nZSk9XCJ1cGRhdGVBZGRyZXNzKClcIlxuICAgICAgICAgICAgICAgICh1c2VySW5wdXQpPVwiaGFuZGxlVXNlcklucHV0KClcIlxuICAgICAgICAgICAgPjwvZm9laG4taW5wdXQtZm9yZWlnbi1sb2NhbGl0eT5cbiAgICAgICAgICAgIDwhLS1cbiAgICAgICAgICAgIENvbXBvbmVudCA8Zm9laG4taW5wdXQtZm9yZWlnbi1zdHJlZXQ+IGlzIHNwZWNpYWwgYmVjYXVzZSB3ZSB1c2UgdGhlIHNhbWUgbW9kZWwgd2hlbiBzd2lzcyBvciBmb3JlaWduZXIuXG4gICAgICAgICAgICBUbyBkbyBzbywgd2UgbmVlZDpcbiAgICAgICAgICAgICAgICAtIEVycm9ycyB3aWxsIGJlIGJpbmQgb24gJ3N0cmVldCcgd2hlbiBOVUxMIG9yIG9uICdsb25nTmFtZScgbW9kZWwgaW5zaWRlIGNvbXBvbmVudCB3aGVuIEVNUFRZXG4gICAgICAgICAgICAgICAgLSByZXF1aXJlZCwgaGVscFRleHQsIGlzTGFiZWxTck9ubHkgYW5kIGRpc2FibGVkICBwYXJhbXMgYXJlIHRyYW5zbWl0dGVkIHRvIGNoaWxkcmVuXG4gICAgICAgICAgICAgLS0+XG4gICAgICAgICAgICA8Zm9laG4taW5wdXQtZm9yZWlnbi1zdHJlZXRcbiAgICAgICAgICAgICAgICBbbGFiZWxdPVwiJ2ZvZWhuLWlucHV0LWFkZHJlc3Muc3RyZWV0LmxhYmVsJyB8IGZyb21EaWN0aW9uYXJ5XCJcbiAgICAgICAgICAgICAgICBbbmFtZV09XCJuYW1lICsgJy5zdHJlZXQnXCJcbiAgICAgICAgICAgICAgICBbKG1vZGVsKV09XCJzdHJlZXRcIlxuICAgICAgICAgICAgICAgIFtyZXF1aXJlZF09XCJpc0ZvcmVpZ25TdHJlZXRSZXF1aXJlZCgpXCJcbiAgICAgICAgICAgICAgICBbaGVscFRleHRdPVwiXG4gICAgICAgICAgICAgICAgICAgICdmb2Vobi1pbnB1dC1hZGRyZXNzLnN0cmVldC5oZWxwLXRleHQnIHwgZnJvbURpY3Rpb25hcnlcbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgIFtjdXN0b21FcnJvcnNdPVwic3RyZWV0Q3VzdG9tRXJyb3JzXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWNvdW50cnkgfHwgZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgIChtb2RlbENoYW5nZSk9XCJ1cGRhdGVBZGRyZXNzKClcIlxuICAgICAgICAgICAgICAgICh1c2VySW5wdXQpPVwiaGFuZGxlVXNlcklucHV0KClcIlxuICAgICAgICAgICAgPjwvZm9laG4taW5wdXQtZm9yZWlnbi1zdHJlZXQ+XG5cbiAgICAgICAgICAgIDxmb2Vobi1pbnB1dC10ZXh0XG4gICAgICAgICAgICAgICAgI2ZvcmVpZ25Ib3VzZU51bWJlclxuICAgICAgICAgICAgICAgIFtsYWJlbF09XCJcbiAgICAgICAgICAgICAgICAgICAgJ2ZvZWhuLWlucHV0LWFkZHJlc3MuaG91c2VOdW1iZXIubGFiZWwnIHwgZnJvbURpY3Rpb25hcnlcbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgIFtuYW1lXT1cIm5hbWUgKyAnLmhvdXNlTnVtYmVyJ1wiXG4gICAgICAgICAgICAgICAgWyhtb2RlbCldPVwiaG91c2VOdW1iZXJcIlxuICAgICAgICAgICAgICAgIFtoZWxwVGV4dF09XCJcbiAgICAgICAgICAgICAgICAgICAgJ2ZvZWhuLWlucHV0LWFkZHJlc3MuaG91c2VOdW1iZXIuaGVscC10ZXh0JyB8IGZyb21EaWN0aW9uYXJ5XG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWNvdW50cnkgfHwgZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgIChtb2RlbENoYW5nZSk9XCJ1cGRhdGVBZGRyZXNzKClcIlxuICAgICAgICAgICAgICAgICh1c2VySW5wdXQpPVwiaGFuZGxlVXNlcklucHV0KClcIlxuICAgICAgICAgICAgICAgIFtyZXF1aXJlZF09XCJmb3JlaWduU3RyZWV0TnVtYmVyUmVxdWlyZWRcIlxuICAgICAgICAgICAgPjwvZm9laG4taW5wdXQtdGV4dD5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPGZvZWhuLWlucHV0LXRleHRcbiAgICAgICAgICAgICpuZ0lmPVwic2hvd1Bvc3RPZmZpY2VCb3hUZXh0XCJcbiAgICAgICAgICAgIFsobW9kZWwpXT1cInBvc3RPZmZpY2VCb3hUZXh0XCJcbiAgICAgICAgICAgIFtoZWxwVGV4dF09XCJcbiAgICAgICAgICAgICAgICAnZm9laG4taW5wdXQtYWRkcmVzcy5wb3N0T2ZmaWNlQm94VGV4dC5oZWxwLXRleHQnXG4gICAgICAgICAgICAgICAgICAgIHwgZnJvbURpY3Rpb25hcnlcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgICBbbGFiZWxdPVwiXG4gICAgICAgICAgICAgICAgJ2ZvZWhuLWlucHV0LWFkZHJlc3MucG9zdE9mZmljZUJveFRleHQubGFiZWwnIHwgZnJvbURpY3Rpb25hcnlcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgICBbbmFtZV09XCJuYW1lICsgJy5wb3N0T2ZmaWNlQm94VGV4dCdcIlxuICAgICAgICAgICAgKG1vZGVsQ2hhbmdlKT1cInVwZGF0ZUFkZHJlc3MoKVwiXG4gICAgICAgICAgICAodXNlcklucHV0KT1cImhhbmRsZVVzZXJJbnB1dCgpXCJcbiAgICAgICAgICAgIFtyZXF1aXJlZF09XCJpc1Bvc3RPZmZpY2VCb3hUZXh0UmVxdWlyZWQoKVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICA+PC9mb2Vobi1pbnB1dC10ZXh0PlxuXG4gICAgICAgIDxmb2Vobi1pbnB1dC10ZXh0XG4gICAgICAgICAgICAqbmdJZj1cInNob3dBZHJlc3NMaW5lcyAmJiBzaG93QWRyZXNzTGluZTFcIlxuICAgICAgICAgICAgWyhtb2RlbCldPVwiYWRkcmVzc0xpbmUxXCJcbiAgICAgICAgICAgIFtsYWJlbF09XCInZm9laG4taW5wdXQtYWRkcmVzcy5hZGRyZXNzTGluZTEubGFiZWwnIHwgZnJvbURpY3Rpb25hcnlcIlxuICAgICAgICAgICAgW25hbWVdPVwibmFtZSArICcuYWRkcmVzc0xpbmUxJ1wiXG4gICAgICAgICAgICAobW9kZWxDaGFuZ2UpPVwidXBkYXRlQWRkcmVzcygpXCJcbiAgICAgICAgICAgICh1c2VySW5wdXQpPVwiaGFuZGxlVXNlcklucHV0KClcIlxuICAgICAgICAgICAgW3JlcXVpcmVkXT1cImFkZHJlc3NMaW5lMVJlcXVpcmVkXCJcbiAgICAgICAgICAgIFthdXRvY29tcGxldGVdPVwiJ2FkZHJlc3MtbGluZTInXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgID48L2ZvZWhuLWlucHV0LXRleHQ+XG5cbiAgICAgICAgPGZvZWhuLWlucHV0LXRleHRcbiAgICAgICAgICAgICpuZ0lmPVwic2hvd0FkcmVzc0xpbmVzICYmIHNob3dBZHJlc3NMaW5lMlwiXG4gICAgICAgICAgICBbKG1vZGVsKV09XCJhZGRyZXNzTGluZTJcIlxuICAgICAgICAgICAgW2xhYmVsXT1cIidmb2Vobi1pbnB1dC1hZGRyZXNzLmFkZHJlc3NMaW5lMi5sYWJlbCcgfCBmcm9tRGljdGlvbmFyeVwiXG4gICAgICAgICAgICBbbmFtZV09XCJuYW1lICsgJy5hZGRyZXNzTGluZTInXCJcbiAgICAgICAgICAgIChtb2RlbENoYW5nZSk9XCJ1cGRhdGVBZGRyZXNzKClcIlxuICAgICAgICAgICAgKHVzZXJJbnB1dCk9XCJoYW5kbGVVc2VySW5wdXQoKVwiXG4gICAgICAgICAgICBbcmVxdWlyZWRdPVwiYWRkcmVzc0xpbmUyUmVxdWlyZWRcIlxuICAgICAgICAgICAgW2F1dG9jb21wbGV0ZV09XCInYWRkcmVzcy1saW5lMydcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgPjwvZm9laG4taW5wdXQtdGV4dD5cbiAgICA8L2ZpZWxkc2V0PlxuPC9kaXY+XG4iXX0=
|
|
465
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9laG4taW5wdXQtYWRkcmVzcy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9wcmVzdGF0aW9ucy1uZy9zcmMvZm9laG4tYWRkcmVzcy9mb2Vobi1pbnB1dC1hZGRyZXNzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uL3Byb2plY3RzL3ByZXN0YXRpb25zLW5nL3NyYy9mb2Vobi1hZGRyZXNzL2ZvZWhuLWlucHV0LWFkZHJlc3MuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUNILFNBQVMsRUFDVCxVQUFVLEVBQ1YsS0FBSyxFQU9MLFNBQVMsRUFDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0gsZUFBZSxFQUNmLGFBQWEsRUFFYixFQUFFLEVBRUwsTUFBTSxNQUFNLENBQUM7QUFDZCxPQUFPLEVBQ0gsWUFBWSxFQUNaLG9CQUFvQixFQUNwQixHQUFHLEVBQ0gsV0FBVyxFQUNYLFNBQVMsRUFDVCxHQUFHLEVBQ04sTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUUzRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFHeEQsT0FBTyxFQUFFLGtDQUFrQyxFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFDOUYsT0FBTyxFQUFFLGdDQUFnQyxFQUFFLE1BQU0sd0NBQXdDLENBQUM7Ozs7Ozs7Ozs7O0FBRTFGLHNDQUFzQztBQUN0QyxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDO0FBRWpDLE1BQU0sT0FBTyxZQUFZO0NBRXhCO0FBRUQsTUFBTSxTQUFTLEdBQUcsQ0FBQyxLQUFjLEVBQVcsRUFBRSxDQUMxQyxLQUFLLEtBQUssSUFBSSxJQUFJLEtBQUssS0FBSyxLQUFLLENBQUM7QUFFdEMsTUFBTSxlQUFlLEdBQUcsQ0FBQyxNQUFvQixF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bSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHtcbiAgICBDb21wb25lbnQsXG4gICAgZm9yd2FyZFJlZixcbiAgICBJbnB1dCxcbiAgICBOZ1pvbmUsXG4gICAgT25DaGFuZ2VzLFxuICAgIE9uRGVzdHJveSxcbiAgICBPbkluaXQsXG4gICAgU2ltcGxlQ2hhbmdlLFxuICAgIFNpbXBsZUNoYW5nZXMsXG4gICAgVmlld0NoaWxkXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgICBCZWhhdmlvclN1YmplY3QsXG4gICAgY29tYmluZUxhdGVzdCxcbiAgICBPYnNlcnZhYmxlLFxuICAgIG9mLFxuICAgIFN1YnNjcmlwdGlvblxufSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gICAgZGVib3VuY2VUaW1lLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkLFxuICAgIG1hcCxcbiAgICBzaGFyZVJlcGxheSxcbiAgICBzd2l0Y2hNYXAsXG4gICAgdGFwXG59IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgRm9laG5JbnB1dENvbXBvbmVudCB9IGZyb20gJy4uL2ZvZWhuLWlucHV0L2ZvZWhuLWlucHV0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBGb2VobklucHV0VGV4dENvbXBvbmVudCB9IGZyb20gJy4uL2ZvZWhuLWlucHV0L2ZvZWhuLWlucHV0LXRleHQuY29tcG9uZW50JztcbmltcG9ydCB7IE9iamVjdEhlbHBlciB9IGZyb20gJy4uL2hlbHBlcnMvb2JqZWN0LmhlbHBlcic7XG5pbXBvcnQgeyBTZGtEaWN0aW9uYXJ5U2VydmljZSB9IGZyb20gJy4uL3Nkay1kaWN0aW9uYXJ5L3Nkay1kaWN0aW9uYXJ5LnNlcnZpY2UnO1xuaW1wb3J0IHsgQWRkcmVzcywgQ291bnRyeSwgTG9jYWxpdHksIFN0cmVldCB9IGZyb20gJy4vYWRkcmVzcy50eXBlJztcbmltcG9ydCB7IEZvZWhuSW5wdXRGb3JlaWduTG9jYWxpdHlDb21wb25lbnQgfSBmcm9tICcuL2ZvZWhuLWlucHV0LWZvcmVpZ24tbG9jYWxpdHkuY29tcG9uZW50JztcbmltcG9ydCB7IEZvZWhuSW5wdXRGb3JlaWduU3RyZWV0Q29tcG9uZW50IH0gZnJvbSAnLi9mb2Vobi1pbnB1dC1mb3JlaWduLXN0cmVldC5jb21wb25lbnQnO1xuXG4vLyBlc2xpbnQtZGlzYWJsZSBtYXgtY2xhc3Nlcy1wZXItZmlsZVxuZXhwb3J0IGNvbnN0IFNXSVNTX0lTT19JRCA9ICdDSCc7XG5cbmV4cG9ydCBjbGFzcyBTdHJlZXROdW1iZXIge1xuICAgIG5hbWU6IHN0cmluZztcbn1cblxuY29uc3QgaXNEZWZpbmVkID0gKHZhbHVlOiBib29sZWFuKTogYm9vbGVhbiA9PlxuICAgIHZhbHVlID09PSB0cnVlIHx8IHZhbHVlID09PSBmYWxzZTtcblxuY29uc3QgaGFzSW5wdXRDaGFuZ2VkID0gKGNoYW5nZTogU2ltcGxlQ2hhbmdlKTogYm9vbGVhbiA9PlxuICAgIGNoYW5nZSAmJiAhT2JqZWN0SGVscGVyLmlzRXF1YWwoY2hhbmdlLnByZXZpb3VzVmFsdWUsIGNoYW5nZS5jdXJyZW50VmFsdWUpO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2ZvZWhuLWlucHV0LWFkZHJlc3MnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9mb2Vobi1pbnB1dC1hZGRyZXNzLmNvbXBvbmVudC5odG1sJyxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZTogRm9laG5JbnB1dENvbXBvbmVudCxcbiAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEZvZWhuSW5wdXRBZGRyZXNzQ29tcG9uZW50KSxcbiAgICAgICAgICAgIG11bHRpOiB0cnVlXG4gICAgICAgIH1cbiAgICBdXG59KVxuZXhwb3J0IGNsYXNzIEZvZWhuSW5wdXRBZGRyZXNzQ29tcG9uZW50XG4gICAgZXh0ZW5kcyBGb2VobklucHV0Q29tcG9uZW50PEFkZHJlc3M+XG4gICAgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcbiAgICBAVmlld0NoaWxkKEZvZWhuSW5wdXRGb3JlaWduTG9jYWxpdHlDb21wb25lbnQsIHsgc3RhdGljOiBmYWxzZSB9KVxuICAgIGZvcmVpZ25Mb2NhbGl0eUNvbXBvbmVudDogRm9laG5JbnB1dEZvcmVpZ25Mb2NhbGl0eUNvbXBvbmVudDtcblxuICAgIEBWaWV3Q2hpbGQoRm9laG5JbnB1dEZvcmVpZ25TdHJlZXRDb21wb25lbnQsIHsgc3RhdGljOiBmYWxzZSB9KVxuICAgIGZvcmVpZ25TdHJlZXRDb21wb25lbnQ6IEZvZWhuSW5wdXRGb3JlaWduU3RyZWV0Q29tcG9uZW50O1xuXG4gICAgQFZpZXdDaGlsZCgnZm9yZWlnbkhvdXNlTnVtYmVyJywgeyBzdGF0aWM6IGZhbHNlIH0pXG4gICAgZm9yZWlnbkhvdXNlTnVtYmVyOiBGb2VobklucHV0VGV4dENvbXBvbmVudDtcblxuICAgIEBJbnB1dCgpXG4gICAgY291bnRyaWVzVXJsID0gJ2FwaS9yZWZpbmYvY291bnRyaWVzJztcblxuICAgIEBJbnB1dCgpXG4gICAgaXNPbmx5U3dpc3MgPSB0cnVlO1xuXG4gICAgQElucHV0KClcbiAgICBzaG93UG9zdE9mZmljZUJveFRleHQgPSBmYWxzZTtcblxuICAgIEBJbnB1dCgpXG4gICAgc2hvd0FkcmVzc0xpbmVzID0gdHJ1ZTtcblxuICAgIEBJbnB1dCgpXG4gICAgc2hvd0FkcmVzc0xpbmUxID0gdHJ1ZTtcblxuICAgIEBJbnB1dCgpXG4gICAgc2hvd0FkcmVzc0xpbmUyID0gdHJ1ZTtcblxuICAgIEBJbnB1dCgpXG4gICAgc3BlY2lmaWVkQ2FudG9uOiBzdHJpbmc7XG5cbiAgICBASW5wdXQoKVxuICAgIGNvdW50cnlSZXF1aXJlZCA9IHRydWU7XG5cbiAgICBASW5wdXQoKVxuICAgIHN3aXNzTnBhTG9jYWxpdHlSZXF1aXJlZCA9IHRydWU7XG5cbiAgICBASW5wdXQoKVxuICAgIHN0cmVldFJlcXVpcmVkOiBib29sZWFuO1xuXG4gICAgQElucHV0KClcbiAgICBzdHJlZXROdW1iZXJSZXF1aXJlZCA9IGZhbHNlO1xuXG4gICAgQElucHV0KClcbiAgICBmb3JlaWduWmlwQ29kZVJlcXVpcmVkID0gdHJ1ZTtcblxuICAgIEBJbnB1dCgpXG4gICAgZm9yZWlnbkxvY2FsaXR5UmVxdWlyZWQgPSB0cnVlO1xuXG4gICAgQElucHV0KClcbiAgICBmb3JlaWduU3RyZWV0UmVxdWlyZWQ6IGJvb2xlYW47XG5cbiAgICBASW5wdXQoKVxuICAgIGZvcmVpZ25TdHJlZXROdW1iZXJSZXF1aXJlZCA9IGZhbHNlO1xuXG4gICAgQElucHV0KClcbiAgICBwb3N0T2ZmaWNlQm94VGV4dFJlcXVpcmVkOiBib29sZWFuO1xuXG4gICAgQElucHV0KClcbiAgICBhZGRyZXNzTGluZTFSZXF1aXJlZCA9IGZhbHNlO1xuXG4gICAgQElucHV0KClcbiAgICBhZGRyZXNzTGluZTJSZXF1aXJlZCA9IGZhbHNlO1xuXG4gICAgQElucHV0KClcbiAgICB3aXRoQ29tcGFueUxvY2FsaXRpZXMgPSBmYWxzZTtcblxuICAgIGNvdW50cnk6IENvdW50cnk7XG4gICAgbG9jYWxpdHk6IExvY2FsaXR5O1xuICAgIHN0cmVldDogU3RyZWV0O1xuICAgIGhvdXNlTnVtYmVyOiBzdHJpbmc7XG4gICAgcG9zdE9mZmljZUJveFRleHQ6IHN0cmluZztcbiAgICBhZGRyZXNzTGluZTE6IHN0cmluZztcbiAgICBhZGRyZXNzTGluZTI6IHN0cmluZztcblxuICAgIGNvdW50cmllczogT2JzZXJ2YWJsZTxDb3VudHJ5W10+O1xuICAgIGxvY2FsaXRpZXM6IE9ic2VydmFibGU8TG9jYWxpdHlbXT47XG4gICAgc3RyZWV0czogT2JzZXJ2YWJsZTxTdHJlZXRbXT47XG4gICAgc3RyZWV0TnVtYmVyczogT2JzZXJ2YWJsZTxTdHJlZXROdW1iZXJbXT47XG5cbiAgICBzdHJlZXRDdXN0b21FcnJvcnM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7fTtcblxuICAgIHByaXZhdGUgaXNvMklkU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPihudWxsKTtcbiAgICBwcml2YXRlIHppcENvZGVJZFN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4obnVsbCk7XG4gICAgcHJpdmF0ZSBlc3RySWRTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+KG51bGwpO1xuXG4gICAgcHJpdmF0ZSBjb3VudHJ5TW9kZWxDaGFuZ2VTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxDb3VudHJ5Pih1bmRlZmluZWQpO1xuICAgIHByaXZhdGUgaXNPbmx5U3dpc3NDaGFuZ2VTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPih0cnVlKTtcbiAgICBwcml2YXRlIG1hbmFnZURlZmF1bHRDb3VudHJ5U3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSBodHRwQ2xpZW50OiBIdHRwQ2xpZW50LFxuICAgICAgICBwcml2YXRlIG5nWm9uZTogTmdab25lLFxuICAgICAgICBwcml2YXRlIGRpY3Rpb25hcnlTZXJ2aWNlOiBTZGtEaWN0aW9uYXJ5U2VydmljZVxuICAgICkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLm1hbmFnZURlZmF1bHRDb3VudHJ5U3Vic2NyaXB0aW9uID0gdGhpcy5tYW5hZ2VEZWZhdWx0Q291bnRyeSgpO1xuICAgIH1cblxuICAgIGlkZW50aXR5ID0gPFQ+KG46IFQpOiBUID0+IG47XG4gICAgY291bnRyeUlkZW50aXR5ID0gKGNvdW50cnk6IENvdW50cnkpOiBzdHJpbmcgPT4gY291bnRyeS5pc28ySWQ7XG4gICAgbG9jYWxpdHlJZGVudGl0eSA9IChsb2M6IExvY2FsaXR5KTogc3RyaW5nID0+IGxvYy5wb3N0YWxMb2NhbGl0eUhpc3RvcnlJZDtcbiAgICBzdHJlZXRJZGVudGl0eSA9IChzdHJlZXQ6IFN0cmVldCk6IHN0cmluZyA9PiBzdHJlZXQuZXN0cmlkO1xuICAgIHN0cmVldEdlbmVyYXRvciA9IChsb25nTmFtZTogc3RyaW5nKTogU3RyZWV0ID0+ICh7XG4gICAgICAgIGVzdHJpZDogbnVsbCxcbiAgICAgICAgbG9uZ05hbWVcbiAgICB9KTtcblxuICAgIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICBzdXBlci5uZ09uSW5pdCgpO1xuXG4gICAgICAgIGlmICghdGhpcy5zaG93UG9zdE9mZmljZUJveFRleHQpIHtcbiAgICAgICAgICAgIHRoaXMuc3RyZWV0Q3VzdG9tRXJyb3JzLkF0TGVhc3RPbmVOb3ROdWxsID0gdGhpcy5kaWN0aW9uYXJ5U2VydmljZS5nZXRLZXlTeW5jKFxuICAgICAgICAgICAgICAgICdlcnJvcnMuTm90TnVsbCdcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvdW50cmllcyA9IHRoaXMuZ2V0Q291bnRyaWVzKCk7XG5cbiAgICAgICAgdGhpcy5sb2NhbGl0aWVzID0gdGhpcy5pc28ySWRTdWJqZWN0LnBpcGUoXG4gICAgICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICAgICAgICAgLy8gVGhlIGxpc3Qgb2YgbG9jYWxpdGllcywgb3IgYW4gZW1wdHkgYXJyYXkgYXMgdGhlIGRlZmF1bHQgdmFsdWUuXG4gICAgICAgICAgICBzd2l0Y2hNYXAoaXNvMklkID0+IHRoaXMuZ2V0TG9jYWxpdGllcyhpc28ySWQpKSxcbiAgICAgICAgICAgIHNoYXJlUmVwbGF5KDEpXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5zdHJlZXRzID0gY29tYmluZUxhdGVzdChbXG4gICAgICAgICAgICB0aGlzLnppcENvZGVJZFN1YmplY3QsXG4gICAgICAgICAgICB0aGlzLmxvY2FsaXRpZXNcbiAgICAgICAgXSkucGlwZShcbiAgICAgICAgICAgIC8vIFRoZSB6aXBDb2RlSWQgd2hlbiBsb2NhbGl0eSBjaGFuZ2VzIG9yIG1hdGNoIGxvY2FsaXR5IChwb3N0YWxMb2NhbGl0eUhpc3RvcnlJZCkgZnJvbSBtb2RlbFxuICAgICAgICAgICAgbWFwKFxuICAgICAgICAgICAgICAgIChbemlwQ29kZUlkLCBsb2NhbGl0aWVzXSkgPT5cbiAgICAgICAgICAgICAgICAgICAgemlwQ29kZUlkIHx8XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXh0cmFjdExvY2FsaXR5WmlwQ29kZUlkKGxvY2FsaXRpZXMsIHRoaXMubG9jYWxpdHkpXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgICAgICAgIC8vIFRoZSBsaXN0IG9mIHN0cmVldHMgb3IgYSBkZWZhdWx0IHZhbHVlIHRvIGFuIGVtcHR5IGFycmF5XG4gICAgICAgICAgICBzd2l0Y2hNYXAoemlwQ29kZUlkID0+IHRoaXMuZ2V0U3RyZWV0c0Zvcih6aXBDb2RlSWQpKSxcbiAgICAgICAgICAgIHNoYXJlUmVwbGF5KDEpXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5zdHJlZXROdW1iZXJzID0gY29tYmluZUxhdGVzdChbXG4gICAgICAgICAgICB0aGlzLmVzdHJJZFN1YmplY3QsXG4gICAgICAgICAgICB0aGlzLnN0cmVldHNcbiAgICAgICAgXSkucGlwZShcbiAgICAgICAgICAgIC8vIFRoZSBlc3RyaWQgd2hlbiBzdHJlZXQgY2hhbmdlcyBvciBtYXRjaCBzdHJlZXQgKGxvbmdOYW1lKSBmcm9tIG1vZGVsXG4gICAgICAgICAgICBtYXAoXG4gICAgICAgICAgICAgICAgKFtlc3RyaWQsIHN0cmVldHNdKSA9PlxuICAgICAgICAgICAgICAgICAgICBlc3RyaWQgfHwgdGhpcy5leHRyYWN0U3RyZWV0RXN0cmlkKHN0cmVldHMsIHRoaXMuc3RyZWV0KVxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgICAgICAgICAvLyBUaGUgbGlzdCBvZiBzdHJlZXRzIG9yIGEgZGVmYXVsdCB2YWx1ZSB0byBhbiBlbXB0eSBhcnJheVxuICAgICAgICAgICAgc3dpdGNoTWFwKGVzdHJpZCA9PiB0aGlzLmdldFN0cmVldE51bWJlckZvcihlc3RyaWQpKSxcbiAgICAgICAgICAgIC8vIFNvbWUgc3RyZWV0IG1pZ2h0IG5vdCBoYXZlIGFuIG5hbWUsIFJlZkluZiBzb21ldGltZXMgcmV0dXJucyB3ZWlyZCBkYXRhLlxuICAgICAgICAgICAgbWFwKHZhbHVlcyA9PiB2YWx1ZXMuZmlsdGVyKHN0cmVldE51bWJlciA9PiAhIXN0cmVldE51bWJlci5uYW1lKSksXG4gICAgICAgICAgICBtYXAodmFsdWVzID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb2xsYXRvciA9IG5ldyBJbnRsLkNvbGxhdG9yKHVuZGVmaW5lZCwge1xuICAgICAgICAgICAgICAgICAgICBudW1lcmljOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBzZW5zaXRpdml0eTogJ2Jhc2UnXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlcy5zb3J0KChhLCBiKSA9PiBjb2xsYXRvci5jb21wYXJlKGEubmFtZSwgYi5uYW1lKSk7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHNoYXJlUmVwbGF5KDEpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHN1cGVyLm5nT25EZXN0cm95KCk7XG4gICAgICAgIHRoaXMubWFuYWdlRGVmYXVsdENvdW50cnlTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuXG4gICAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgICAgICBjb25zdCBtb2RlbENoYW5nZTogU2ltcGxlQ2hhbmdlID0gY2hhbmdlcy5tb2RlbDtcbiAgICAgICAgY29uc3QgaXNPbmx5U3dpc3M6IFNpbXBsZUNoYW5nZSA9IGNoYW5nZXMuaXNPbmx5U3dpc3M7XG5cbiAgICAgICAgaWYgKGhhc0lucHV0Q2hhbmdlZChtb2RlbENoYW5nZSkpIHtcbiAgICAgICAgICAgIC8vIFdoZW4gbW9kZWwgY2hhbmdlcywgd2UgZW5zdXJlIHRvIG5vdCBzZW5kIFwidW5kZWZpbmVkXCIgYW55bW9yZVxuICAgICAgICAgICAgY29uc3QgY291bnRyeSA9ICEhbW9kZWxDaGFuZ2UuY3VycmVudFZhbHVlXG4gICAgICAgICAgICAgICAgPyBtb2RlbENoYW5nZS5jdXJyZW50VmFsdWUuY291bnRyeVxuICAgICAgICAgICAgICAgIDogbnVsbDtcbiAgICAgICAgICAgIHRoaXMuY291bnRyeU1vZGVsQ2hhbmdlU3ViamVjdC5uZXh0KGNvdW50cnkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoYXNJbnB1dENoYW5nZWQoaXNPbmx5U3dpc3MpKSB7XG4gICAgICAgICAgICB0aGlzLmlzT25seVN3aXNzQ2hhbmdlU3ViamVjdC5uZXh0KGlzT25seVN3aXNzLmN1cnJlbnRWYWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1cGRhdGVBZGRyZXNzKCk6IHZvaWQge1xuICAgICAgICBjb25zdCB2YWxpZFZhbHVlID0gdGhpcy5nZXRWYWxpZFZhbHVlKCk7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsaWRWYWx1ZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlTmdNb2RlbCh2YWxpZFZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHVwZGF0ZU5nTW9kZWwodmFsdWU6IEFkZHJlc3MpOiB2b2lkIHtcbiAgICAgICAgaWYgKCEhdmFsdWUpIHtcbiAgICAgICAgICAgIC8vIGF2b2lkIHdyb25nZnVsbCBwcmVmaWxsIGJ5IHNlc3Npb24gaW5mb1xuICAgICAgICAgICAgaWYgKCF0aGlzLnNob3dBZHJlc3NMaW5lcyB8fCAhdGhpcy5zaG93QWRyZXNzTGluZTEpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZS5hZGRyZXNzTGluZTEgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF0aGlzLnNob3dBZHJlc3NMaW5lcyB8fCAhdGhpcy5zaG93QWRyZXNzTGluZTIpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZS5hZGRyZXNzTGluZTIgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF0aGlzLnNob3dQb3N0T2ZmaWNlQm94VGV4dCkge1xuICAgICAgICAgICAgICAgIHZhbHVlLnBvc3RPZmZpY2VCb3hUZXh0ID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIG5ldmVyIHVwZGF0YWJsZSBpbiB0aGUgY29tcG9uZW50XG4gICAgICAgICAgICB2YWx1ZS5wb3N0T2ZmaWNlQm94TnVtYmVyID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHN1cGVyLnVwZGF0ZU5nTW9kZWwodmFsdWUpO1xuICAgIH1cblxuICAgIGhhbmRsZVVzZXJJbnB1dCgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgdmFsaWRWYWx1ZSA9IHRoaXMuZ2V0VmFsaWRWYWx1ZSgpO1xuICAgICAgICBpZiAodHlwZW9mIHZhbGlkVmFsdWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZUNoYW5nZSh2YWxpZFZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uTW9kZWxDaGFuZ2UodmFsdWU6IEFkZHJlc3MpOiB2b2lkIHtcbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLmNvdW50cnkgPSB2YWx1ZS5jb3VudHJ5O1xuICAgICAgICAgICAgdGhpcy5sb2NhbGl0eSA9IHZhbHVlLmxvY2FsaXR5O1xuICAgICAgICAgICAgdGhpcy5zdHJlZXQgPSB2YWx1ZS5zdHJlZXQ7XG4gICAgICAgICAgICB0aGlzLmhvdXNlTnVtYmVyID0gdmFsdWUuaG91c2VOdW1iZXI7XG4gICAgICAgICAgICB0aGlzLnBvc3RPZmZpY2VCb3hUZXh0ID0gdmFsdWUucG9zdE9mZmljZUJveFRleHQ7XG4gICAgICAgICAgICB0aGlzLmFkZHJlc3NMaW5lMSA9IHZhbHVlLmFkZHJlc3NMaW5lMTtcbiAgICAgICAgICAgIHRoaXMuYWRkcmVzc0xpbmUyID0gdmFsdWUuYWRkcmVzc0xpbmUyO1xuICAgICAgICB9IGVsc2UgaWYgKCF2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5sb2NhbGl0eSA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLnN0cmVldCA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLmhvdXNlTnVtYmVyID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMucG9zdE9mZmljZUJveFRleHQgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5hZGRyZXNzTGluZTEgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5hZGRyZXNzTGluZTIgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaXNTd2lzcygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICEhKFxuICAgICAgICAgICAgdGhpcy5pc09ubHlTd2lzcyB8fFxuICAgICAgICAgICAgKHRoaXMuY291bnRyeSAmJiB0aGlzLmNvdW50cnkuaXNvMklkID09PSBTV0lTU19JU09fSUQpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgdXNlcklucHV0Q291bnRyeSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy56aXBDb2RlSWRTdWJqZWN0Lm5leHQobnVsbCk7XG4gICAgICAgIHRoaXMuZXN0cklkU3ViamVjdC5uZXh0KG51bGwpO1xuXG4gICAgICAgIHRoaXMubG9jYWxpdHkgPSBudWxsO1xuICAgICAgICB0aGlzLnN0cmVldCA9IG51bGw7XG4gICAgICAgIHRoaXMuaG91c2VOdW1iZXIgPSBudWxsO1xuICAgICAgICB0aGlzLnBvc3RPZmZpY2VCb3hUZXh0ID0gbnVsbDtcbiAgICAgICAgdGhpcy5hZGRyZXNzTGluZTEgPSBudWxsO1xuICAgICAgICB0aGlzLmFkZHJlc3NMaW5lMiA9IG51bGw7XG5cbiAgICAgICAgdGhpcy51cGRhdGVBZGRyZXNzKCk7XG4gICAgICAgIHRoaXMuaGFuZGxlVXNlcklucHV0KCk7XG4gICAgfVxuXG4gICAgdXNlcklucHV0TG9jYWxpdHkobG9jYWxpdHk6IHVua25vd24pOiB2b2lkIHtcbiAgICAgICAgaWYgKCFsb2NhbGl0eSkge1xuICAgICAgICAgICAgdGhpcy56aXBDb2RlSWRTdWJqZWN0Lm5leHQobnVsbCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQWx3YXlzIHJlc2V0IHN1Z2dlc3Rpb24gbGlzdCBvZiBob3VzZU51bWJlciB3aGVuIGxvY2FsaXR5IGNoYW5nZXNcbiAgICAgICAgdGhpcy5lc3RySWRTdWJqZWN0Lm5leHQobnVsbCk7XG5cbiAgICAgICAgdGhpcy5zdHJlZXQgPSBudWxsO1xuICAgICAgICB0aGlzLmhvdXNlTnVtYmVyID0gbnVsbDtcblxuICAgICAgICB0aGlzLnVwZGF0ZUFkZHJlc3MoKTtcbiAgICAgICAgdGhpcy5oYW5kbGVVc2VySW5wdXQoKTtcbiAgICB9XG5cbiAgICB1c2VySW5wdXRTdHJlZXQoc3RyZWV0OiB1bmtub3duKTogdm9pZCB7XG4gICAgICAgIGlmICghc3RyZWV0KSB7XG4gICAgICAgICAgICB0aGlzLmVzdHJJZFN1YmplY3QubmV4dChudWxsKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmhvdXNlTnVtYmVyID0gbnVsbDtcbiAgICAgICAgdGhpcy5oYW5kbGVVc2VySW5wdXQoKTtcbiAgICB9XG5cbiAgICBjb3VudHJ5VXBkYXRlZChjb3VudHJ5OiBDb3VudHJ5KTogdm9pZCB7XG4gICAgICAgIC8vIE5vIGRvdWJsZS1iaW5kaW5nIG9uIGNvdW50cnkgaW4gdmlldyB0byBlbnN1cmUgd2UgdXBkYXRlIHByb3Blcmx5IG1vZGVsXG4gICAgICAgIHRoaXMuY291bnRyeSA9IGNvdW50cnk7XG4gICAgICAgIHRoaXMudXBkYXRlQWRkcmVzcygpO1xuXG4gICAgICAgIGlmICghY291bnRyeSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgeyBpc28ySWQgfSA9IGNvdW50cnk7XG4gICAgICAgIHRoaXMuaXNvMklkU3ViamVjdC5uZXh0KGlzbzJJZCk7XG4gICAgfVxuXG4gICAgZ2V0TG9jYWxpdHlEaXNwbGF5ZWROYW1lKGxvY2FsaXR5OiBMb2NhbGl0eSk6IHN0cmluZyB8IHZvaWQge1xuICAgICAgICBpZiAoIWxvY2FsaXR5KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYCR7bG9jYWxpdHkuemlwQ29kZX0gJHtsb2NhbGl0eS5sb25nTmFtZX1gO1xuICAgIH1cblxuICAgIGxvY2FsaXR5VXBkYXRlZChsb2NhbGl0eTogTG9jYWxpdHkpOiB2b2lkIHtcbiAgICAgICAgLy8gTm8gZG91YmxlLWJpbmRpbmcgb24gbG9jYWxpdHkgaW4gdmlldyB0byBlbnN1cmUgd2UgdXBkYXRlIHByb3Blcmx5IG1vZGVsXG4gICAgICAgIHRoaXMubG9jYWxpdHkgPSBsb2NhbGl0eTtcbiAgICAgICAgdGhpcy51cGRhdGVBZGRyZXNzKCk7XG5cbiAgICAgICAgaWYgKCFsb2NhbGl0eSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgeyB6aXBDb2RlSWQgfSA9IGxvY2FsaXR5O1xuICAgICAgICB0aGlzLnppcENvZGVJZFN1YmplY3QubmV4dCh6aXBDb2RlSWQpO1xuICAgIH1cblxuICAgIHN0cmVldFVwZGF0ZWQoc3RyZWV0OiBTdHJlZXQpOiB2b2lkIHtcbiAgICAgICAgLy8gTm8gZG91YmxlLWJpbmRpbmcgb24gc3RyZWV0IGluIHZpZXcgdG8gZW5zdXJlIHdlIHVwZGF0ZSBwcm9wZXJseSBtb2RlbFxuICAgICAgICB0aGlzLnN0cmVldCA9IHN0cmVldDtcbiAgICAgICAgdGhpcy51cGRhdGVBZGRyZXNzKCk7XG5cbiAgICAgICAgaWYgKCFzdHJlZXQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHsgZXN0cmlkIH0gPSBzdHJlZXQ7XG4gICAgICAgIHRoaXMuZXN0cklkU3ViamVjdC5uZXh0KGVzdHJpZCk7XG4gICAgfVxuXG4gICAgaXNTdHJlZXRSZXF1aXJlZCgpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKGlzRGVmaW5lZCh0aGlzLnN0cmVldFJlcXVpcmVkKSkge1xuICAgICAgICAgICAgLy8gcmVzcGVjdCBvdmVycmlkZW4gdmFsdWVcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnN0cmVldFJlcXVpcmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLnNob3dQb3N0T2ZmaWNlQm94VGV4dCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gIXRoaXMucG9zdE9mZmljZUJveFRleHQgfHwgISF0aGlzLnN0cmVldDtcbiAgICB9XG5cbiAgICBpc0ZvcmVpZ25TdHJlZXRSZXF1aXJlZCgpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKGlzRGVmaW5lZCh0aGlzLmZvcmVpZ25TdHJlZXRSZXF1aXJlZCkpIHtcbiAgICAgICAgICAgIC8vIHJlc3BlY3Qgb3ZlcnJpZGVuIHZhbHVlXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5mb3JlaWduU3RyZWV0UmVxdWlyZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuc2hvd1Bvc3RPZmZpY2VCb3hUZXh0KSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAhdGhpcy5wb3N0T2ZmaWNlQm94VGV4dCB8fCAhIXRoaXMuc3RyZWV0O1xuICAgIH1cblxuICAgIGlzUG9zdE9mZmljZUJveFRleHRSZXF1aXJlZCgpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKGlzRGVmaW5lZCh0aGlzLnBvc3RPZmZpY2VCb3hUZXh0UmVxdWlyZWQpKSB7XG4gICAgICAgICAgICAvLyByZXNwZWN0IG92ZXJyaWRlbiB2YWx1ZVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucG9zdE9mZmljZUJveFRleHRSZXF1aXJlZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gIXRoaXMuc3RyZWV0IHx8ICEhdGhpcy5wb3N0T2ZmaWNlQm94VGV4dDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldENvdW50cmllcygpOiBPYnNlcnZhYmxlPENvdW50cnlbXT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LmdldDxDb3VudHJ5W10+KHRoaXMuY291bnRyaWVzVXJsKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldExvY2FsaXRpZXMoaXNvMklkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPExvY2FsaXR5W10+IHtcbiAgICAgICAgaWYgKGlzbzJJZCAhPT0gU1dJU1NfSVNPX0lEKSB7XG4gICAgICAgICAgICByZXR1cm4gb2YoW10pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcXVlcnlQYXJhbXMgPSAhIXRoaXMud2l0aENvbXBhbnlMb2NhbGl0aWVzXG4gICAgICAgICAgICA/ICc/d2l0aENvbXBhbnlMb2NhbGl0aWVzPXRydWUnXG4gICAgICAgICAgICA6ICcnO1xuXG4gICAgICAgIGlmICghIXRoaXMuc3BlY2lmaWVkQ2FudG9uKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LmdldDxMb2NhbGl0eVtdPihcbiAgICAgICAgICAgICAgICBgYXBpL3JlZmluZi9sb2NhbGl0eS8ke3RoaXMuc3BlY2lmaWVkQ2FudG9ufSR7cXVlcnlQYXJhbXN9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQuZ2V0PExvY2FsaXR5W10+KFxuICAgICAgICAgICAgICAgIGBhcGkvcmVmaW5mL2xvY2FsaXR5L2FsbCR7cXVlcnlQYXJhbXN9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0U3RyZWV0TnVtYmVyRm9yKGVzdHJpZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxTdHJlZXROdW1iZXJbXT4ge1xuICAgICAgICBpZiAoIWVzdHJpZCkge1xuICAgICAgICAgICAgcmV0dXJuIG9mKFtdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHVybCA9IGBhcGkvcmVmaW5mL2FkZHJlc3Nlcy8ke2VzdHJpZH1gO1xuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LmdldDxTdHJlZXROdW1iZXJbXT4odXJsKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFN0cmVldHNGb3IoemlwQ29kZUlkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPFN0cmVldFtdPiB7XG4gICAgICAgIGlmICghemlwQ29kZUlkKSB7XG4gICAgICAgICAgICByZXR1cm4gb2YoW10pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdXJsID0gYGFwaS9yZWZpbmYvc3RyZWV0cy8ke3ppcENvZGVJZH1gO1xuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LmdldDxTdHJlZXRbXT4odXJsKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNsZWFyQXV0b2NvbXBsZXRlc1doZW5Db3VudHJ5SXNVbmFwcHJvcHJpYXRlZFRvQ29tcG9uZW50Q29uZmlndXJhdGlvbigpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuaXNNb2RlbEVtcHR5KCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMuaXNPbmx5U3dpc3MgJiZcbiAgICAgICAgICAgIHRoaXMuY291bnRyeSAmJlxuICAgICAgICAgICAgdGhpcy5jb3VudHJ5LmlzbzJJZCAhPT0gU1dJU1NfSVNPX0lEXG4gICAgICAgICkge1xuICAgICAgICAgICAgLy8gRG8gbm90IHJlbW92ZSB0aGlzIHdhcm5pbmcuIE5lZWRlZCBmb3IgZGVidWdnaW5nIGF0IGFsbCB0aW1lLlxuICAgICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtbGVuXG4gICAgICAgICAgICAgICAgYENvdW50cnkgYWRkcmVzcyB3YXMgJyR7dGhpcy5jb3VudHJ5LmlzbzJJZH0nLiBPbmx5IHN3aXNzIGlzIGFza2VkIGluIGNvbXBvbmVudCAnZm9laG4taW5wdXQtYWRkcmVzcycgY29uZmlndXJhdGlvbi4gQWRkcmVzcyBtb2RlbCByZXNldHRlZC5gXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5jbGVhckF1dG9jb21wbGV0ZXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc2V0RGVmYXVsdENvdW50cnkoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmlzT25seVN3aXNzIHx8ICF0aGlzLmNvdW50cnkgfHwgIXRoaXMuY291bnRyeS5pc28ySWQpIHtcbiAgICAgICAgICAgIHRoaXMuY291bnRyeSA9IHtcbiAgICAgICAgICAgICAgICBpc28ySWQ6IFNXSVNTX0lTT19JRCxcbiAgICAgICAgICAgICAgICBzaG9ydE5hbWVGcjogJ1N1aXNzZSdcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLmlzbzJJZFN1YmplY3QubmV4dChTV0lTU19JU09fSUQpO1xuXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUFkZHJlc3MoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgY2xlYXJBdXRvY29tcGxldGVzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmNvdW50cnkgPSBudWxsO1xuICAgICAgICB0aGlzLnN0cmVldCA9IG51bGw7XG4gICAgICAgIHRoaXMubG9jYWxpdHkgPSBudWxsO1xuICAgICAgICB0aGlzLmhvdXNlTnVtYmVyID0gbnVsbDtcbiAgICAgICAgLy8gTm8gdXBkYXRlQWRkcmVzcygpIGhlcmUgYmVjYXVzZSBkb25lIGluIHNldERlZmF1bHRDb3VudHJ5KClcbiAgICB9XG5cbiAgICBwcml2YXRlIGV4dHJhY3RMb2NhbGl0eVppcENvZGVJZChcbiAgICAgICAgbG9jYWxpdGllczogTG9jYWxpdHlbXSxcbiAgICAgICAgbG9jYWxpdHlUb01hdGNoOiBMb2NhbGl0eVxuICAgICk6IHN0cmluZyB7XG4gICAgICAgIGlmIChsb2NhbGl0eVRvTWF0Y2ggJiYgbG9jYWxpdHlUb01hdGNoLnBvc3RhbExvY2FsaXR5SGlzdG9yeUlkKSB7XG4gICAgICAgICAgICBjb25zdCBtYXRjaGVkID0gbG9jYWxpdGllcy5maW5kKFxuICAgICAgICAgICAgICAgIChsb2NhbGl0eTogTG9jYWxpdHkpID0+XG4gICAgICAgICAgICAgICAgICAgIGxvY2FsaXR5LnBvc3RhbExvY2FsaXR5SGlzdG9yeUlkID09PVxuICAgICAgICAgICAgICAgICAgICBsb2NhbGl0eVRvTWF0Y2gucG9zdGFsTG9jYWxpdHlIaXN0b3J5SWRcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAobWF0Y2hlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBtYXRjaGVkLnppcENvZGVJZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHByaXZhdGUgZXh0cmFjdFN0cmVldEVzdHJpZChcbiAgICAgICAgc3RyZWV0czogU3RyZWV0W10sXG4gICAgICAgIHN0cmVldFRvTWF0Y2g6IFN0cmVldFxuICAgICk6IHN0cmluZyB7XG4gICAgICAgIGlmIChzdHJlZXRUb01hdGNoICYmIHN0cmVldFRvTWF0Y2gubG9uZ05hbWUpIHtcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoZWQgPSBzdHJlZXRzLmZpbmQoXG4gICAgICAgICAgICAgICAgKHN0cmVldDogU3RyZWV0KSA9PiBzdHJlZXQubG9uZ05hbWUgPT09IHN0cmVldFRvTWF0Y2gubG9uZ05hbWVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAobWF0Y2hlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBtYXRjaGVkLmVzdHJpZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0VmFsaWRWYWx1ZSgpOiBBZGRyZXNzIHwgbnVsbCB8IHVuZGVmaW5lZCB7XG4gICAgICAgIGlmICh0aGlzLmlzTW9kZWxFbXB0eSgpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5tb2RlbF8gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb3VudHJ5OiB0aGlzLmNvdW50cnksXG4gICAgICAgICAgICBsb2NhbGl0eTogdGhpcy5nZXRWYWxpZExvY2FsaXR5KHRoaXMubG9jYWxpdHkpLFxuICAgICAgICAgICAgc3RyZWV0OiB0aGlzLnN0cmVldCxcbiAgICAgICAgICAgIGhvdXNlTnVtYmVyOiB0aGlzLmhvdXNlTnVtYmVyLFxuICAgICAgICAgICAgcG9zdE9mZmljZUJveFRleHQ6IHRoaXMucG9zdE9mZmljZUJveFRleHQsXG4gICAgICAgICAgICBhZGRyZXNzTGluZTE6IHRoaXMuYWRkcmVzc0xpbmUxLFxuICAgICAgICAgICAgYWRkcmVzc0xpbmUyOiB0aGlzLmFkZHJlc3NMaW5lMlxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0VmFsaWRMb2NhbGl0eSh2YWx1ZTogTG9jYWxpdHkpOiBMb2NhbGl0eSB7XG4gICAgICAgIC8vIFBSRVNUQUtJVC0zNTI6IE5lZWQgYSBmYWtlICdwb3N0YWxMb2NhbGl0eUhpc3RvcnlJZCcgZm9yIGluZGl2aWR1YWwgZXJyb3JzIG9uICd6aXBDb2RlJyBhbmQgJ2xvbmdOYW1lJ1xuICAgICAgICBpZiAoIXRoaXMuaXNTd2lzcygpICYmICF2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHsgcG9zdGFsTG9jYWxpdHlIaXN0b3J5SWQ6ICctMScgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzTW9kZWxFbXB0eSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICghdGhpcy5jb3VudHJ5IHx8IE9iamVjdEhlbHBlci5pc0VtcHR5KHRoaXMuY291bnRyeSkpICYmXG4gICAgICAgICAgICAoIXRoaXMubG9jYWxpdHkgfHwgT2JqZWN0SGVscGVyLmlzRW1wdHkodGhpcy5sb2NhbGl0eSkpICYmXG4gICAgICAgICAgICAoIXRoaXMuc3RyZWV0IHx8IE9iamVjdEhlbHBlci5pc0VtcHR5KHRoaXMuc3RyZWV0KSkgJiZcbiAgICAgICAgICAgIHRoaXMuaXNFbXB0eSh0aGlzLmhvdXNlTnVtYmVyKSAmJlxuICAgICAgICAgICAgdGhpcy5pc0VtcHR5KHRoaXMucG9zdE9mZmljZUJveFRleHQpICYmXG4gICAgICAgICAgICB0aGlzLmlzRW1wdHkodGhpcy5hZGRyZXNzTGluZTEpICYmXG4gICAgICAgICAgICB0aGlzLmlzRW1wdHkodGhpcy5hZGRyZXNzTGluZTIpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBtYW5hZ2VEZWZhdWx0Q291bnRyeSgpOiBTdWJzY3JpcHRpb24ge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgY29tYmluZUxhdGVzdChbXG4gICAgICAgICAgICAgICAgdGhpcy5jb3VudHJ5TW9kZWxDaGFuZ2VTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgIGRlYm91bmNlVGltZSgwKSxcbiAgICAgICAgICAgICAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoXG4gICAgICAgICAgICAgICAgICAgICAgICAocHJldmlvdXMsIGN1cnJlbnQpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXMuaXNvMklkID09PSBjdXJyZW50LmlzbzJJZFxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICB0aGlzLmlzT25seVN3aXNzQ2hhbmdlU3ViamVjdFxuICAgICAgICAgICAgICAgICAgICAuYXNPYnNlcnZhYmxlKClcbiAgICAgICAgICAgICAgICAgICAgLnBpcGUoZGVib3VuY2VUaW1lKDApLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpKVxuICAgICAgICAgICAgXSlcbiAgICAgICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICAgICAgdGFwKChbY291bnRyeSwgaXNPbmx5U3dpc3NdKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBXaGVuIGNvdW50cnkgc2VsZWN0aW9uIGlzIGFsbG93ZWQsIHdlIG5lZWQgdG8gY2hlY2sgXCJ1bmRlZmluZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gc2V0IGRlZmF1bHQgY291bnRyeSBvbmx5IG9uIGNvbXBvbmVudCBpbml0aWFsaXphdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc09ubHlTd2lzcyAmJiBjb3VudHJ5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldERlZmF1bHRDb3VudHJ5KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNPbmx5U3dpc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXaGVuIHRoZXJlIGlzIGEgY291bnRyeSwgd2UgbmVlZCB0byBjaGVjayBpZiBpdCBoYXMgdG8gYmUgY2xlYW5lZCBhbmQgc2V0IHRvIGRlZmF1bHRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISFjb3VudHJ5ICYmICFPYmplY3RIZWxwZXIuaXNFbXB0eShjb3VudHJ5KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNsZWFyQXV0b2NvbXBsZXRlc1doZW5Db3VudHJ5SXNVbmFwcHJvcHJpYXRlZFRvQ29tcG9uZW50Q29uZmlndXJhdGlvbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldERlZmF1bHRDb3VudHJ5KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcnhqcy1hbmd1bGFyL3ByZWZlci1hc3luYy1waXBlXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSgpXG4gICAgICAgICk7XG4gICAgfVxufVxuIiwiPGRpdlxuICAgIFthdHRyLmlkXT1cImJ1aWxkSWQoKSArICdDb250YWluZXInXCJcbiAgICBjbGFzcz1cImZvcm0tZ3JvdXBcIlxuICAgIFtjbGFzcy5oYXMtZGFuZ2VyXT1cImhhc0Vycm9yc1RvRGlzcGxheSgpXCJcbiAgICBbY2xhc3MudmQtZm9ybS1ncm91cC1kYW5nZXJdPVwiaGFzRXJyb3JzVG9EaXNwbGF5KClcIlxuICAgIFt0YWJJbmRleF09XCItMVwiXG4+XG4gICAgPGZpZWxkc2V0XG4gICAgICAgIGNsYXNzPVwibWItM1wiXG4gICAgICAgIFthdHRyLmFyaWEtZGVzY3JpYmVkYnldPVwiZ2V0RGVzY3JpYmVkQnkoKVwiXG4gICAgICAgIFthdHRyLmFyaWEtaW52YWxpZF09XCJoYXNFcnJvcnNUb0Rpc3BsYXkoKSB8fCBudWxsXCJcbiAgICA+XG4gICAgICAgIDxsZWdlbmQgKm5nSWY9XCIhIWxhYmVsXCIgW25nQ2xhc3NdPVwiaXNMYWJlbFNyT25seSA/ICdzci1vbmx5JyA6ICd2ZC1wJ1wiPlxuICAgICAgICAgICAgPHNwYW4gW2lubmVySFRNTF09XCJsYWJlbFwiPjwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgKm5nSWY9XCIhcmVxdWlyZWQgJiYgIWhpZGVOb3RSZXF1aXJlZEV4dHJhTGFiZWxcIlxuICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge3sgJ2ZvZWhuLWlucHV0Lm9wdGlvbmFsJyB8IGZyb21EaWN0aW9uYXJ5IH19XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvbGVnZW5kPlxuXG4gICAgICAgIDxmb2Vobi12YWxpZGF0aW9uLWFsZXJ0cyBbY29tcG9uZW50XT1cInRoaXNcIj48L2ZvZWhuLXZhbGlkYXRpb24tYWxlcnRzPlxuXG4gICAgICAgIDxzbWFsbFxuICAgICAgICAgICAgKm5nSWY9XCJoZWxwVGV4dFwiXG4gICAgICAgICAgICBbYXR0ci5pZF09XCJidWlsZElkKCkgKyAnSGVscCdcIlxuICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LXNlY29uZGFyeVwiXG4gICAgICAgICAgICBbaW5uZXJIVE1MXT1cImhlbHBUZXh0XCJcbiAgICAgICAgPjwvc21hbGw+XG5cbiAgICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuXG4gICAgICAgIDxmb2Vobi1hdXRvY29tcGxldGVcbiAgICAgICAgICAgICpuZ0lmPVwiIWlzT25seVN3aXNzXCJcbiAgICAgICAgICAgIFtsYWJlbF09XCInZm9laG4taW5wdXQtYWRkcmVzcy5jb3VudHJ5LmxhYmVsJyB8IGZyb21EaWN0aW9uYXJ5XCJcbiAgICAgICAgICAgIFtlbGVtZW50c109XCJjb3VudHJpZXMgfCBhc3luY1wiXG4gICAgICAgICAgICBlbGVtZW50TGFiZWw9XCJzaG9ydE5hbWVGclwiXG4gICAgICAgICAgICBbZWxlbWVudFZhbHVlXT1cImlkZW50aXR5XCJcbiAgICAgICAgICAgIFtlbGVtZW50VmFsdWVJZGVudGl0eV09XCJjb3VudHJ5SWRlbnRpdHlcIlxuICAgICAgICAgICAgKG1vZGVsQ2hhbmdlKT1cImNvdW50cnlVcGRhdGVkKCRldmVudClcIlxuICAgICAgICAgICAgKHVzZXJJbnB1dCk9XCJ1c2VySW5wdXRDb3VudHJ5KClcIlxuICAgICAgICAgICAgW21vZGVsXT1cImNvdW50cnlcIlxuICAgICAgICAgICAgW25hbWVdPVwibmFtZSArICcuY291bnRyeSdcIlxuICAgICAgICAgICAgW3JlcXVpcmVkXT1cImNvdW50cnlSZXF1aXJlZFwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICA+PC9mb2Vobi1hdXRvY29tcGxldGU+XG5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzU3dpc3MoKVwiPlxuICAgICAgICAgICAgPGZvZWhuLWF1dG9jb21wbGV0ZVxuICAgICAgICAgICAgICAgIFtsYWJlbF09XCInZm9laG4taW5wdXQtYWRkcmVzcy5sb2NhbGl0eS5sYWJlbCcgfCBmcm9tRGljdGlvbmFyeVwiXG4gICAgICAgICAgICAgICAgW2VsZW1lbnRzXT1cImxvY2FsaXRpZXMgfCBhc3luY1wiXG4gICAgICAgICAgICAgICAgW2VsZW1lbnRMYWJlbF09XCJnZXRMb2NhbGl0eURpc3BsYXllZE5hbWVcIlxuICAgICAgICAgICAgICAgIFtlbGVtZW50VmFsdWVdPVwiaWRlbnRpdHlcIlxuICAgICAgICAgICAgICAgIFtlbGVtZW50VmFsdWVJZGVudGl0eV09XCJsb2NhbGl0eUlkZW50aXR5XCJcbiAgICAgICAgICAgICAgICAobW9kZWxDaGFuZ2UpPVwibG9jYWxpdHlVcGRhdGVkKCRldmVudClcIlxuICAgICAgICAgICAgICAgICh1c2VySW5wdXQpPVwidXNlcklucHV0TG9jYWxpdHkoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgW21vZGVsXT1cImxvY2FsaXR5XCJcbiAgICAgICAgICAgICAgICBbbmFtZV09XCJuYW1lICsgJy5sb2NhbGl0eSdcIlxuICAgICAgICAgICAgICAgIFthbGxvd0N1c3RvbVZhbHVlXT1cImRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwic3dpc3NOcGFMb2NhbGl0eVJlcXVpcmVkXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWNvdW50cnkgfHwgZGlzYWJsZWRcIlxuICAgICAgICAgICAgPjwvZm9laG4tYXV0b2NvbXBsZXRlPlxuXG4gICAgICAgICAgICA8Zm9laG4tYXV0b2NvbXBsZXRlXG4gICAgICAgICAgICAgICAgW2xhYmVsXT1cIidmb2Vobi1pbnB1dC1hZGRyZXNzLnN0cmVldC5sYWJlbCcgfCBmcm9tRGljdGlvbmFyeVwiXG4gICAgICAgICAgICAgICAgW2VsZW1lbnRzXT1cInN0cmVldHMgfCBhc3luY1wiXG4gICAgICAgICAgICAgICAgZWxlbWVudExhYmVsPVwibG9uZ05hbWVcIlxuICAgICAgICAgICAgICAgIFtlbGVtZW50VmFsdWVdPVwiaWRlbnRpdHlcIlxuICAgICAgICAgICAgICAgIFtlbGVtZW50VmFsdWVJZGVudGl0eV09XCJzdHJlZXRJZGVudGl0eVwiXG4gICAgICAgICAgICAgICAgKG1vZGVsQ2hhbmdlKT1cInN0cmVldFVwZGF0ZWQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgW21vZGVsXT1cInN0cmVldFwiXG4gICAgICAgICAgICAgICAgW25hbWVdPVwibmFtZSArICcuc3RyZWV0J1wiXG4gICAgICAgICAgICAgICAgW2FsbG93Q3VzdG9tVmFsdWVdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgW2N1c3RvbVZhbHVlTW9kZWxHZW5lcmF0b3JdPVwic3RyZWV0R2VuZXJhdG9yXCJcbiAgICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwiaXNTdHJlZXRSZXF1aXJlZCgpXCJcbiAgICAgICAgICAgICAgICBbaGVscFRleHRdPVwiXG4gICAgICAgICAgICAgICAgICAgICdmb2Vobi1pbnB1dC1hZGRyZXNzLnN0cmVldC5oZWxwLXRleHQnIHwgZnJvbURpY3Rpb25hcnlcbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgIFtjdXN0b21FcnJvcnNdPVwic3RyZWV0Q3VzdG9tRXJyb3JzXCJcbiAgICAgICAgICAgICAgICAodXNlcklucHV0KT1cInVzZXJJbnB1dFN0cmVldCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWNvdW50cnkgfHwgZGlzYWJsZWRcIlxuICAgICAgICAgICAgPjwvZm9laG4tYXV0b2NvbXBsZXRlPlxuXG4gICAgICAgICAgICA8Zm9laG4tYXV0b2NvbXBsZXRlXG4gICAgICAgICAgICAgICAgW2xhYmVsXT1cIlxuICAgICAgICAgICAgICAgICAgICAnZm9laG4taW5wdXQtYWRkcmVzcy5ob3VzZU51bWJlci5sYWJlbCcgfCBmcm9tRGljdGlvbmFyeVxuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgW2VsZW1lbnRzXT1cInN0cmVldE51bWJlcnMgfCBhc3luY1wiXG4gICAgICAgICAgICAgICAgZWxlbWVudExhYmVsPVwibmFtZVwiXG4gICAgICAgICAgICAgICAgZWxlbWVudFZhbHVlPVwibmFtZVwiXG4gICAgICAgICAgICAgICAgWyhtb2RlbCldPVwiaG91c2VOdW1iZXJcIlxuICAgICAgICAgICAgICAgIFtuYW1lXT1cIm5hbWUgKyAnLmhvdXNlTnVtYmVyJ1wiXG4gICAgICAgICAgICAgICAgW2FsbG93Q3VzdG9tVmFsdWVdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgW2hlbHBUZXh0XT1cIlxuICAgICAgICAgICAgICAgICAgICAnZm9laG4taW5wdXQtYWRkcmVzcy5ob3VzZU51bWJlci5oZWxwLXRleHQnIHwgZnJvbURpY3Rpb25hcnlcbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgIChtb2RlbENoYW5nZSk9XCJ1cGRhdGVBZGRyZXNzKClcIlxuICAgICAgICAgICAgICAgICh1c2VySW5wdXQpPVwiaGFuZGxlVXNlcklucHV0KClcIlxuICAgICAgICAgICAgICAgIFtyZXF1aXJlZF09XCJzdHJlZXROdW1iZXJSZXF1aXJlZFwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFjb3VudHJ5IHx8IGRpc2FibGVkXCJcbiAgICAgICAgICAgID48L2ZvZWhuLWF1dG9jb21wbGV0ZT5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc1N3aXNzKClcIj5cbiAgICAgICAgICAgIDwhLS1cbiAgICAgICAgICAgIENvbXBvbmVudCA8Zm9laG4taW5wdXQtZm9yZWlnbi1sb2NhbGl0eT4gaXMgc3BlY2lhbCBiZWNhdXNlIHdlIHVzZSB0aGUgc2FtZSBtb2RlbCB3aGVuIHN3aXNzIG9yIGZvcmVpZ25lci5cbiAgICAgICAgICAgIFRvIGRvIHNvLCB3ZSBuZWVkOlxuICAgICAgICAgICAgICAgIC0gRXJyb3JzIHdpbGwgYmUgYmluZCBvbiAnbG9jYWxpdHknIHdoZW4gTlVMTCBvciBvbiAnemlwQ29kZScgYW5kICdsb25nTmFtZScgbW9kZWwgaW5zaWRlIGNvbXBvbmVudCB3aGVuIEVNUFRZXG4gICAgICAgICAgICAgICAgLSBIaWRlIGxhYmVsIGZyb20gY29tcG9uZW50IGJlY2F1c2Ugd2UgbmVlZCBsYWJlbCBmcm9tIGNoaWxkcmVuIHRvIGJlIGRpc3BsYXllZCAoaXNMYWJlbFNyT25seTogdHJ1ZSlcbiAgICAgICAgICAgICAgICAtIHJlcXVpcmVkIGFuZCBkaXNhYmxlZCBwYXJhbXMgYXJlIHRyYW5zbWl0dGVkIHRvIGNoaWxkcmVuXG4gICAgICAgICAgICAgLS0+XG4gICAgICAgICAgICA8Zm9laG4taW5wdXQtZm9yZWlnbi1sb2NhbGl0eVxuICAgICAgICAgICAgICAgIFtsYWJlbF09XCInZm9laG4taW5wdXQtYWRkcmVzcy5sb2NhbGl0eS5sYWJlbCcgfCBmcm9tRGljdGlvbmFyeVwiXG4gICAgICAgICAgICAgICAgW25hbWVdPVwibmFtZSArICcubG9jYWxpdHknXCJcbiAgICAgICAgICAgICAgICBbKG1vZGVsKV09XCJsb2NhbGl0eVwiXG4gICAgICAgICAgICAgICAgW3ppcENvZGVSZXF1aXJlZF09XCJmb3JlaWduWmlwQ29kZVJlcXVpcmVkXCJcbiAgICAgICAgICAgICAgICBbbG9jYWxpdHlSZXF1aXJlZF09XCJmb3JlaWduTG9jYWxpdHlSZXF1aXJlZFwiXG4gICAgICAgICAgICAgICAgW2lzTGFiZWxTck9ubHldPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFjb3VudHJ5IHx8IGRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAobW9kZWxDaGFuZ2UpPVwidXBkYXRlQWRkcmVzcygpXCJcbiAgICAgICAgICAgICAgICAodXNlcklucHV0KT1cImhhbmRsZVVzZXJJbnB1dCgpXCJcbiAgICAgICAgICAgID48L2ZvZWhuLWlucHV0LWZvcmVpZ24tbG9jYWxpdHk+XG4gICAgICAgICAgICA8IS0tXG4gICAgICAgICAgICBDb21wb25lbnQgPGZvZWhuLWlucHV0LWZvcmVpZ24tc3RyZWV0PiBpcyBzcGVjaWFsIGJlY2F1c2Ugd2UgdXNlIHRoZSBzYW1lIG1vZGVsIHdoZW4gc3dpc3Mgb3IgZm9yZWlnbmVyLlxuICAgICAgICAgICAgVG8gZG8gc28sIHdlIG5lZWQ6XG4gICAgICAgICAgICAgICAgLSBFcnJvcnMgd2lsbCBiZSBiaW5kIG9uICdzdHJlZXQnIHdoZW4gTlVMTCBvciBvbiAnbG9uZ05hbWUnIG1vZGVsIGluc2lkZSBjb21wb25lbnQgd2hlbiBFTVBUWVxuICAgICAgICAgICAgICAgIC0gcmVxdWlyZWQsIGhlbHBUZXh0LCBpc0xhYmVsU3JPbmx5IGFuZCBkaXNhYmxlZCAgcGFyYW1zIGFyZSB0cmFuc21pdHRlZCB0byBjaGlsZHJlblxuICAgICAgICAgICAgIC0tPlxuICAgICAgICAgICAgPGZvZWhuLWlucHV0LWZvcmVpZ24tc3RyZWV0XG4gICAgICAgICAgICAgICAgW2xhYmVsXT1cIidmb2Vobi1pbnB1dC1hZGRyZXNzLnN0cmVldC5sYWJlbCcgfCBmcm9tRGljdGlvbmFyeVwiXG4gICAgICAgICAgICAgICAgW25hbWVdPVwibmFtZSArICcuc3RyZWV0J1wiXG4gICAgICAgICAgICAgICAgWyhtb2RlbCldPVwic3RyZWV0XCJcbiAgICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwiaXNGb3JlaWduU3RyZWV0UmVxdWlyZWQoKVwiXG4gICAgICAgICAgICAgICAgW2hlbHBUZXh0XT1cIlxuICAgICAgICAgICAgICAgICAgICAnZm9laG4taW5wdXQtYWRkcmVzcy5zdHJlZXQuaGVscC10ZXh0JyB8IGZyb21EaWN0aW9uYXJ5XG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICBbY3VzdG9tRXJyb3JzXT1cInN0cmVldEN1c3RvbUVycm9yc1wiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFjb3VudHJ5IHx8IGRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAobW9kZWxDaGFuZ2UpPVwidXBkYXRlQWRkcmVzcygpXCJcbiAgICAgICAgICAgICAgICAodXNlcklucHV0KT1cImhhbmRsZVVzZXJJbnB1dCgpXCJcbiAgICAgICAgICAgID48L2ZvZWhuLWlucHV0LWZvcmVpZ24tc3RyZWV0PlxuXG4gICAgICAgICAgICA8Zm9laG4taW5wdXQtdGV4dFxuICAgICAgICAgICAgICAgICNmb3JlaWduSG91c2VOdW1iZXJcbiAgICAgICAgICAgICAgICBbbGFiZWxdPVwiXG4gICAgICAgICAgICAgICAgICAgICdmb2Vobi1pbnB1dC1hZGRyZXNzLmhvdXNlTnVtYmVyLmxhYmVsJyB8IGZyb21EaWN0aW9uYXJ5XG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICBbbmFtZV09XCJuYW1lICsgJy5ob3VzZU51bWJlcidcIlxuICAgICAgICAgICAgICAgIFsobW9kZWwpXT1cImhvdXNlTnVtYmVyXCJcbiAgICAgICAgICAgICAgICBbaGVscFRleHRdPVwiXG4gICAgICAgICAgICAgICAgICAgICdmb2Vobi1pbnB1dC1hZGRyZXNzLmhvdXNlTnVtYmVyLmhlbHAtdGV4dCcgfCBmcm9tRGljdGlvbmFyeVxuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFjb3VudHJ5IHx8IGRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAobW9kZWxDaGFuZ2UpPVwidXBkYXRlQWRkcmVzcygpXCJcbiAgICAgICAgICAgICAgICAodXNlcklucHV0KT1cImhhbmRsZVVzZXJJbnB1dCgpXCJcbiAgICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwiZm9yZWlnblN0cmVldE51bWJlclJlcXVpcmVkXCJcbiAgICAgICAgICAgID48L2ZvZWhuLWlucHV0LXRleHQ+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDxmb2Vobi1pbnB1dC10ZXh0XG4gICAgICAgICAgICAqbmdJZj1cInNob3dQb3N0T2ZmaWNlQm94VGV4dFwiXG4gICAgICAgICAgICBbKG1vZGVsKV09XCJwb3N0T2ZmaWNlQm94VGV4dFwiXG4gICAgICAgICAgICBbaGVscFRleHRdPVwiXG4gICAgICAgICAgICAgICAgJ2ZvZWhuLWlucHV0LWFkZHJlc3MucG9zdE9mZmljZUJveFRleHQuaGVscC10ZXh0J1xuICAgICAgICAgICAgICAgICAgICB8IGZyb21EaWN0aW9uYXJ5XG4gICAgICAgICAgICBcIlxuICAgICAgICAgICAgW2xhYmVsXT1cIlxuICAgICAgICAgICAgICAgICdmb2Vobi1pbnB1dC1hZGRyZXNzLnBvc3RPZmZpY2VCb3hUZXh0LmxhYmVsJyB8IGZyb21EaWN0aW9uYXJ5XG4gICAgICAgICAgICBcIlxuICAgICAgICAgICAgW25hbWVdPVwibmFtZSArICcucG9zdE9mZmljZUJveFRleHQnXCJcbiAgICAgICAgICAgIChtb2RlbENoYW5nZSk9XCJ1cGRhdGVBZGRyZXNzKClcIlxuICAgICAgICAgICAgKHVzZXJJbnB1dCk9XCJoYW5kbGVVc2VySW5wdXQoKVwiXG4gICAgICAgICAgICBbcmVxdWlyZWRdPVwiaXNQb3N0T2ZmaWNlQm94VGV4dFJlcXVpcmVkKClcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgPjwvZm9laG4taW5wdXQtdGV4dD5cblxuICAgICAgICA8Zm9laG4taW5wdXQtdGV4dFxuICAgICAgICAgICAgKm5nSWY9XCJzaG93QWRyZXNzTGluZXMgJiYgc2hvd0FkcmVzc0xpbmUxXCJcbiAgICAgICAgICAgIFsobW9kZWwpXT1cImFkZHJlc3NMaW5lMVwiXG4gICAgICAgICAgICBbbGFiZWxdPVwiJ2ZvZWhuLWlucHV0LWFkZHJlc3MuYWRkcmVzc0xpbmUxLmxhYmVsJyB8IGZyb21EaWN0aW9uYXJ5XCJcbiAgICAgICAgICAgIFtuYW1lXT1cIm5hbWUgKyAnLmFkZHJlc3NMaW5lMSdcIlxuICAgICAgICAgICAgKG1vZGVsQ2hhbmdlKT1cInVwZGF0ZUFkZHJlc3MoKVwiXG4gICAgICAgICAgICAodXNlcklucHV0KT1cImhhbmRsZVVzZXJJbnB1dCgpXCJcbiAgICAgICAgICAgIFtyZXF1aXJlZF09XCJhZGRyZXNzTGluZTFSZXF1aXJlZFwiXG4gICAgICAgICAgICBbYXV0b2NvbXBsZXRlXT1cIidhZGRyZXNzLWxpbmUyJ1wiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICA+PC9mb2Vobi1pbnB1dC10ZXh0PlxuXG4gICAgICAgIDxmb2Vobi1pbnB1dC10ZXh0XG4gICAgICAgICAgICAqbmdJZj1cInNob3dBZHJlc3NMaW5lcyAmJiBzaG93QWRyZXNzTGluZTJcIlxuICAgICAgICAgICAgWyhtb2RlbCldPVwiYWRkcmVzc0xpbmUyXCJcbiAgICAgICAgICAgIFtsYWJlbF09XCInZm9laG4taW5wdXQtYWRkcmVzcy5hZGRyZXNzTGluZTIubGFiZWwnIHwgZnJvbURpY3Rpb25hcnlcIlxuICAgICAgICAgICAgW25hbWVdPVwibmFtZSArICcuYWRkcmVzc0xpbmUyJ1wiXG4gICAgICAgICAgICAobW9kZWxDaGFuZ2UpPVwidXBkYXRlQWRkcmVzcygpXCJcbiAgICAgICAgICAgICh1c2VySW5wdXQpPVwiaGFuZGxlVXNlcklucHV0KClcIlxuICAgICAgICAgICAgW3JlcXVpcmVkXT1cImFkZHJlc3NMaW5lMlJlcXVpcmVkXCJcbiAgICAgICAgICAgIFthdXRvY29tcGxldGVdPVwiJ2FkZHJlc3MtbGluZTMnXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgID48L2ZvZWhuLWlucHV0LXRleHQ+XG4gICAgPC9maWVsZHNldD5cbjwvZGl2PlxuIl19
|