@norwegian/core-components 7.2.2 → 7.3.0
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/esm2022/lib/components/airport-select/airport-select-dropdown/airport-select-dropdown.component.mjs +3 -3
- package/esm2022/lib/components/airport-select/airport-select.component.mjs +6 -4
- package/esm2022/lib/components/autocomplete/autocomplete.component.mjs +8 -3
- package/esm2022/lib/components/box/box.component.mjs +2 -2
- package/esm2022/lib/components/checkbox/checkbox.component.mjs +10 -4
- package/esm2022/lib/components/continue/continue.component.mjs +2 -2
- package/esm2022/lib/components/datepicker/calendar/calendar.component.mjs +2 -2
- package/esm2022/lib/components/datepicker/datepicker.component.mjs +3 -3
- package/esm2022/lib/components/datepicker-combo/datepicker-combo.component.mjs +7 -11
- package/esm2022/lib/components/dropdown/dropdown.component.mjs +2 -2
- package/esm2022/lib/components/filter/filter.component.mjs +25 -11
- package/esm2022/lib/components/journey-availability/journey-availability.component.mjs +2 -2
- package/esm2022/lib/components/modal/modal.component.mjs +2 -2
- package/esm2022/lib/components/page-footer/page-footer.component.mjs +2 -2
- package/fesm2022/norwegian-core-components.mjs +69 -46
- package/fesm2022/norwegian-core-components.mjs.map +1 -1
- package/lib/components/airport-select/airport-select.component.d.ts +9 -3
- package/lib/components/checkbox/checkbox.component.d.ts +13 -1
- package/lib/components/datepicker-combo/datepicker-combo.component.d.ts +9 -5
- package/lib/components/filter/filter.component.d.ts +22 -6
- package/package.json +1 -1
- package/styles/1__settings/_colors.scss +11 -4
- package/styles/3__base/_heading.scss +0 -15
|
@@ -543,11 +543,11 @@ export class AirportSelectDropdownComponent extends NasComponentBase {
|
|
|
543
543
|
this.updateSelected(airport);
|
|
544
544
|
}
|
|
545
545
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.5", ngImport: i0, type: AirportSelectDropdownComponent, deps: [{ token: DOCUMENT }, { token: i1.AirportSelectService }, { token: i2.AirportSelectDropdownService }, { token: i3.GeolocationService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
546
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.5", type: AirportSelectDropdownComponent, selector: "nas-airport-select-dropdown", inputs: { id: "id", displayLatestSearches: "displayLatestSearches", displayClosestAirports: "displayClosestAirports", latestSearches: "latestSearches", resultsLabels: "resultsLabels", airportSelectLabel: "airportSelectLabel", airportSelectPlaceholder: "airportSelectPlaceholder", airportSelectIconModifier: "airportSelectIconModifier", keepSelection: "keepSelection", nasFormControlName: "nasFormControlName", nasFormGroup: "nasFormGroup", enableGeolocation: "enableGeolocation", ariaLabelClear: "ariaLabelClear", ariaLabelBackdrop: "ariaLabelBackdrop", isValid: "isValid", invalidText: "invalidText", closestAirports: "closestAirports", airport: "airport", open: "open", airports: "airports" }, outputs: { selected: "selected", openChange: "openChange", focusOnNext: "focusOnNext", focusOnPrevious: "focusOnPrevious", positionChange: "positionChange", clearedSelection: "clearedSelection" }, viewQueries: [{ propertyName: "input", first: true, predicate: ["airportSelect"], descendants: true }, { propertyName: "results", first: true, predicate: ["results"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<ng-container *ngIf=\"!nasFormControlName; else reactiveForm\">\n <label [id]=\"labelId\"\n [attr.aria-label]=\"airportSelectLabel\"\n [nasClass]=\"getClass('wrapper', [open && 'active', selectedModel && 'filled'])\">\n <span [nasClass]=\"getClass('label')\">\n <ng-container *ngIf=\"airportSelectLabel; else emptyLabel\">{{airportSelectLabel}}</ng-container>\n <ng-template #emptyLabel> </ng-template>\n </span>\n <input #airportSelect\n type=\"text\"\n role=\"combobox\"\n autocomplete=\"off\"\n aria-haspopup=\"listbox\"\n aria-autocomplete=\"none\"\n [id]=\"inputId + '__origin'\"\n [attr.aria-controls]=\"resultsId\"\n [attr.aria-expanded]=\"open ? 'true' : 'false'\"\n [attr.aria-owns]=\"resultsId\"\n [nasClass]=\"getClass('input')\"\n [placeholder]=\"airportSelectPlaceholder\"\n (focus)=\"setOpen()\"\n (mousedown)=\"setOpen()\"\n (input)=\"filter()\"\n (keydown)=\"onKeyDown($event)\"\n [(ngModel)]=\"selectedModel\"/>\n <span [nasClass]=\"getClass('icon')\">\n <button type=\"button\"\n role=\"button\"\n tabindex=\"-1\"\n *ngIf=\"selectedModel; else isEmpty\"\n [attr.aria-label]=\"ariaLabelClear\"\n (click)=\"clearSelected($event)\">\n <nas-icon [type]=\"selectedModel ? 'remove--secondary' : 'remove'\"></nas-icon>\n </button>\n <ng-template #isEmpty>\n <nas-icon [type]=\"'small'\"\n [icon]=\"airportSelectIconModifier\"></nas-icon>\n </ng-template>\n </span>\n </label>\n</ng-container>\n<ng-template #reactiveForm>\n <label [id]=\"labelId\"\n [attr.aria-label]=\"airportSelectLabel\"\n [nasClass]=\"getClass('wrapper', [open && 'active', selectedModel && 'filled'])\"\n [formGroup]=\"nasFormGroup\">\n <span [nasClass]=\"getClass('label')\"\n *ngIf=\"airportSelectLabel\">{{airportSelectLabel}}</span>\n <input #airportSelect\n type=\"text\"\n role=\"combobox\"\n autocomplete=\"off\"\n aria-autocomplete=\"none\"\n [id]=\"inputId + '__destination'\"\n [attr.aria-controls]=\"resultsId\"\n [attr.aria-expanded]=\"open ? 'true' : 'false'\"\n [attr.aria-owns]=\"resultsId\"\n [nasClass]=\"getClass('input')\"\n [formControlName]=\"nasFormControlName\"\n [placeholder]=\"airportSelectPlaceholder\"\n (mousedown)=\"setOpen()\"\n (focus)=\"setOpen()\"\n (input)=\"filter()\"\n (keydown)=\"onKeyDown($event)\" />\n <span [nasClass]=\"getClass('icon')\">\n <button type=\"button\"\n role=\"button\"\n tabindex=\"-1\"\n *ngIf=\"selectedModel; else isEmpty\"\n [attr.aria-label]=\"ariaLabelClear\"\n (click)=\"clearSelected($event)\">\n <nas-icon [type]=\"selectedModel ? 'remove--secondary' : 'remove'\"></nas-icon>\n </button>\n <ng-template #isEmpty>\n <nas-icon [type]=\"'small'\"\n [icon]=\"airportSelectIconModifier\"></nas-icon>\n </ng-template>\n </span>\n </label>\n</ng-template>\n<div [nasClass]=\"getClass('results-wrapper')\"\n [id]=\"resultsId\"\n [attr.aria-expanded]=\"open ? 'true' : 'false'\">\n <ul #results\n role=\"listbox\"\n *ngIf=\"open\"\n [attr.aria-labelledby]=\"labelId\"\n [nasClass]=\"getClass('results')\">\n <ng-container *ngIf=\"exists(enableGeolocation) && geolocationState !== null && geolocationState !== 0 && isValid\">\n <li role=\"option\">\n <nas-button link\n secondary\n [disabled]=\"geolocationState === 2\"\n [cssStyle]=\"{'height': '66px', 'text-decoration': 'underline', 'display': 'flex', 'justify-content': 'space-between'}\"\n [cssClass]=\"getClass('item', ['geolocation', focusOnGeolocation && geolocationState !== 2 && 'focus', geolocationState === 2 && 'disabled'])\"\n [tabindex]=\"-1\"\n (clickChange)=\"updateCurrentPosition()\"\n (mouseenter)=\"onGeolocationHover(true)\"\n (mouseleave)=\"onGeolocationHover(false)\">\n <span *ngIf=\"geolocationState === 1; else geolocationDenied\"\n [nasClass]=\"getClass('geolocation', 'label')\">{{resultsLabels?.geolocation}}</span>\n <ng-template #geolocationDenied>\n <span [nasClass]=\"getClass('geolocation', 'label')\">{{resultsLabels?.geolocationDenied}}</span>\n </ng-template>\n <nas-icon [nasClass]=\"getClass('geolocation', 'icon')\"\n [type]=\"geolocationIcon\"></nas-icon>\n </nas-button>\n </li>\n </ng-container>\n <li role=\"separator\"\n [nasClass]=\"getClass('list-section-label')\"\n *ngIf=\"latestSearches?.length > 0\n && exists(displayLatestSearches)\n && resultsLabels?.latestSearches\n && isValid\">\n <span>{{resultsLabels?.latestSearches}}</span>\n </li>\n <ng-container *ngIf=\"exists(displayLatestSearches) && isValid\">\n <li role=\"option\"\n *ngFor=\"let airport of latestSearches\"\n [id]=\"getLatestSearchesAirportId(airport.code)\"\n [attr.aria-selected]=\"airport.code === focusedLatestSearchesAirportCode\"\n [nasClass]=\"getClass('list-item', airport.code === focusedLatestSearchesAirportCode && 'focus')\">\n <button type=\"button\"\n [nasClass]=\"getClass('item', airport.code === focusedLatestSearchesAirportCode && 'focus')\"\n (click)=\"setSelected(airport)\"\n tabindex=\"-1\">\n <span [nasClass]=\"getClass('name')\">{{airport.name}}</span>\n <span [nasClass]=\"getClass('code')\"></span>\n <span [nasClass]=\"getClass('country')\">{{airport.countryName}}</span>\n </button>\n </li>\n </ng-container>\n <li role=\"separator\"\n *ngIf=\"exists(displayClosestAirports)\n && geolocationState !== null\n && geolocationState === 0\n && closestAirports?.length > 0\n && resultsLabels?.closestAirports\n && isValid\"\n [nasClass]=\"getClass('list-section-label')\">\n <span>{{resultsLabels?.closestAirports}}</span>\n </li>\n <ng-container *ngIf=\"exists(displayClosestAirports) && geolocationState === 0 && isValid\">\n <li role=\"option\"\n *ngFor=\"let airport of closestAirports\"\n [id]=\"getClosestAirportsAirportId(airport.code)\"\n [attr.aria-selected]=\"airport.code === focusedClosestAirportCode\"\n [nasClass]=\"getClass('list-item', airport.code === focusedClosestAirportCode && 'focus')\">\n <button type=\"button\"\n [nasClass]=\"getClass('item', airport.code === focusedClosestAirportCode && 'focus')\"\n (click)=\"setSelected(airport)\"\n tabindex=\"-1\">\n <span [nasClass]=\"getClass('name')\">{{airport.name}}</span>\n <span [nasClass]=\"getClass('code')\"></span>\n <span [nasClass]=\"getClass('country')\">{{airport.countryName}}</span>\n </button>\n </li>\n </ng-container>\n <li role=\"separator\"\n [nasClass]=\"getClass('list-section-label')\"\n *ngIf=\"displayAllAirportsLabel && resultsLabels?.allAirports && isValid\">\n <span>{{resultsLabels?.allAirports}}</span>\n </li>\n <ng-container *ngIf=\"isValid\">\n <li role=\"option\"\n *ngFor=\"let airport of filteredAirports\"\n [id]=\"getAllAirportsAirportId(airport.code)\"\n [attr.aria-selected]=\"airport.code === focusedAirportCode\"\n [nasClass]=\"getClass('list-item', airport.code === focusedAirportCode && 'focus')\">\n <button type=\"button\"\n [nasClass]=\"getClass('item', airport.code === focusedAirportCode && 'focus')\"\n (click)=\"setSelected(airport)\"\n tabindex=\"-1\">\n <span [nasClass]=\"getClass('name')\">{{airport.name}}</span>\n <span [nasClass]=\"getClass('code')\"></span>\n <span [nasClass]=\"getClass('country')\">{{airport.countryName}}</span>\n </button>\n </li>\n </ng-container>\n <li *ngIf=\"!isValid\"\n role=\"listitem\">\n <span [nasClass]=\"getClass('name', 'invalid')\">{{invalidText}}</span>\n </li>\n </ul>\n</div>\n<button type=\"button\"\n tabindex=\"0\"\n *ngIf=\"open\"\n [attr.aria-label]=\"ariaLabelBackdrop\"\n [nasClass]=\"getClass('backdrop')\"\n (click)=\"blur()\"></button>", styles: [""], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i6.NasClassDirective, selector: "[nasClass]", inputs: ["nasClass", "attr.class"] }, { kind: "component", type: i7.IconComponent, selector: "nas-icon", inputs: ["icon", "type", "isIndicator", "lightCircularBackground", "cssClass"] }, { kind: "directive", type: i5.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i5.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i8.ButtonComponent, selector: "nas-button", inputs: ["primary", "secondary", "link", "light", "large", "block", "flex", "compact", "right", "spaceless", "href", "trackingvalue", "canContinueOnDisabled", "disabled", "type", "cssClass", "ariaLabel", "cssStyle", "tabindex", "overrideBaseCssClass", "useRouterLink", "id", "target", "icon", "iconLeft", "iconType", "buttonlink"], outputs: ["clickChange"] }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
546
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.5", type: AirportSelectDropdownComponent, selector: "nas-airport-select-dropdown", inputs: { id: "id", displayLatestSearches: "displayLatestSearches", displayClosestAirports: "displayClosestAirports", latestSearches: "latestSearches", resultsLabels: "resultsLabels", airportSelectLabel: "airportSelectLabel", airportSelectPlaceholder: "airportSelectPlaceholder", airportSelectIconModifier: "airportSelectIconModifier", keepSelection: "keepSelection", nasFormControlName: "nasFormControlName", nasFormGroup: "nasFormGroup", enableGeolocation: "enableGeolocation", ariaLabelClear: "ariaLabelClear", ariaLabelBackdrop: "ariaLabelBackdrop", isValid: "isValid", invalidText: "invalidText", closestAirports: "closestAirports", airport: "airport", open: "open", airports: "airports" }, outputs: { selected: "selected", openChange: "openChange", focusOnNext: "focusOnNext", focusOnPrevious: "focusOnPrevious", positionChange: "positionChange", clearedSelection: "clearedSelection" }, viewQueries: [{ propertyName: "input", first: true, predicate: ["airportSelect"], descendants: true }, { propertyName: "results", first: true, predicate: ["results"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<ng-container *ngIf=\"!nasFormControlName; else reactiveForm\">\n <label [id]=\"labelId\"\n [attr.aria-label]=\"airportSelectLabel\"\n [nasClass]=\"getClass('wrapper', [open && 'active', selectedModel && 'filled'])\">\n <span [nasClass]=\"getClass('label')\">\n <ng-container *ngIf=\"airportSelectLabel; else emptyLabel\">{{airportSelectLabel}}</ng-container>\n <ng-template #emptyLabel> </ng-template>\n </span>\n <input #airportSelect\n type=\"text\"\n role=\"combobox\"\n autocomplete=\"off\"\n aria-haspopup=\"listbox\"\n aria-autocomplete=\"none\"\n [id]=\"inputId\"\n [attr.aria-controls]=\"resultsId\"\n [attr.aria-expanded]=\"open ? 'true' : 'false'\"\n [attr.aria-owns]=\"resultsId\"\n [nasClass]=\"getClass('input')\"\n [placeholder]=\"airportSelectPlaceholder\"\n (focus)=\"setOpen()\"\n (mousedown)=\"setOpen()\"\n (input)=\"filter()\"\n (keydown)=\"onKeyDown($event)\"\n [(ngModel)]=\"selectedModel\"/>\n <span [nasClass]=\"getClass('icon')\">\n <button type=\"button\"\n role=\"button\"\n tabindex=\"-1\"\n *ngIf=\"selectedModel; else isEmpty\"\n [attr.aria-label]=\"ariaLabelClear\"\n (click)=\"clearSelected($event)\">\n <nas-icon [type]=\"selectedModel ? 'remove--secondary' : 'remove'\"></nas-icon>\n </button>\n <ng-template #isEmpty>\n <nas-icon [type]=\"'small'\"\n [icon]=\"airportSelectIconModifier\"></nas-icon>\n </ng-template>\n </span>\n </label>\n</ng-container>\n<ng-template #reactiveForm>\n <label [id]=\"labelId\"\n [attr.aria-label]=\"airportSelectLabel\"\n [nasClass]=\"getClass('wrapper', [open && 'active', selectedModel && 'filled'])\"\n [formGroup]=\"nasFormGroup\">\n <span [nasClass]=\"getClass('label')\"\n *ngIf=\"airportSelectLabel\">{{airportSelectLabel}}</span>\n <input #airportSelect\n type=\"text\"\n role=\"combobox\"\n autocomplete=\"off\"\n aria-autocomplete=\"none\"\n [id]=\"inputId\"\n [attr.aria-controls]=\"resultsId\"\n [attr.aria-expanded]=\"open ? 'true' : 'false'\"\n [attr.aria-owns]=\"resultsId\"\n [nasClass]=\"getClass('input')\"\n [formControlName]=\"nasFormControlName\"\n [placeholder]=\"airportSelectPlaceholder\"\n (mousedown)=\"setOpen()\"\n (focus)=\"setOpen()\"\n (input)=\"filter()\"\n (keydown)=\"onKeyDown($event)\" />\n <span [nasClass]=\"getClass('icon')\">\n <button type=\"button\"\n role=\"button\"\n tabindex=\"-1\"\n *ngIf=\"selectedModel; else isEmpty\"\n [attr.aria-label]=\"ariaLabelClear\"\n (click)=\"clearSelected($event)\">\n <nas-icon [type]=\"selectedModel ? 'remove--secondary' : 'remove'\"></nas-icon>\n </button>\n <ng-template #isEmpty>\n <nas-icon [type]=\"'small'\"\n [icon]=\"airportSelectIconModifier\"></nas-icon>\n </ng-template>\n </span>\n </label>\n</ng-template>\n<div [nasClass]=\"getClass('results-wrapper')\"\n [id]=\"resultsId\"\n [attr.aria-expanded]=\"open ? 'true' : 'false'\">\n <ul #results\n role=\"listbox\"\n *ngIf=\"open\"\n [attr.aria-labelledby]=\"labelId\"\n [nasClass]=\"getClass('results')\">\n <ng-container *ngIf=\"exists(enableGeolocation) && geolocationState !== null && geolocationState !== 0 && isValid\">\n <li role=\"option\">\n <nas-button link\n secondary\n [disabled]=\"geolocationState === 2\"\n [cssStyle]=\"{'height': '66px', 'text-decoration': 'underline', 'display': 'flex', 'justify-content': 'space-between'}\"\n [cssClass]=\"getClass('item', ['geolocation', focusOnGeolocation && geolocationState !== 2 && 'focus', geolocationState === 2 && 'disabled'])\"\n [tabindex]=\"-1\"\n (clickChange)=\"updateCurrentPosition()\"\n (mouseenter)=\"onGeolocationHover(true)\"\n (mouseleave)=\"onGeolocationHover(false)\">\n <span *ngIf=\"geolocationState === 1; else geolocationDenied\"\n [nasClass]=\"getClass('geolocation', 'label')\">{{resultsLabels?.geolocation}}</span>\n <ng-template #geolocationDenied>\n <span [nasClass]=\"getClass('geolocation', 'label')\">{{resultsLabels?.geolocationDenied}}</span>\n </ng-template>\n <nas-icon [nasClass]=\"getClass('geolocation', 'icon')\"\n [type]=\"geolocationIcon\"></nas-icon>\n </nas-button>\n </li>\n </ng-container>\n <li role=\"separator\"\n [nasClass]=\"getClass('list-section-label')\"\n *ngIf=\"latestSearches?.length > 0\n && exists(displayLatestSearches)\n && resultsLabels?.latestSearches\n && isValid\">\n <span>{{resultsLabels?.latestSearches}}</span>\n </li>\n <ng-container *ngIf=\"exists(displayLatestSearches) && isValid\">\n <li role=\"option\"\n *ngFor=\"let airport of latestSearches\"\n [id]=\"getLatestSearchesAirportId(airport.code)\"\n [attr.aria-selected]=\"airport.code === focusedLatestSearchesAirportCode\"\n [nasClass]=\"getClass('list-item', airport.code === focusedLatestSearchesAirportCode && 'focus')\">\n <button type=\"button\"\n [nasClass]=\"getClass('item', airport.code === focusedLatestSearchesAirportCode && 'focus')\"\n (click)=\"setSelected(airport)\"\n tabindex=\"-1\">\n <span [nasClass]=\"getClass('name')\">{{airport.name}}</span>\n <span [nasClass]=\"getClass('code')\"></span>\n <span [nasClass]=\"getClass('country')\">{{airport.countryName}}</span>\n </button>\n </li>\n </ng-container>\n <li role=\"separator\"\n *ngIf=\"exists(displayClosestAirports)\n && geolocationState !== null\n && geolocationState === 0\n && closestAirports?.length > 0\n && resultsLabels?.closestAirports\n && isValid\"\n [nasClass]=\"getClass('list-section-label')\">\n <span>{{resultsLabels?.closestAirports}}</span>\n </li>\n <ng-container *ngIf=\"exists(displayClosestAirports) && geolocationState === 0 && isValid\">\n <li role=\"option\"\n *ngFor=\"let airport of closestAirports\"\n [id]=\"getClosestAirportsAirportId(airport.code)\"\n [attr.aria-selected]=\"airport.code === focusedClosestAirportCode\"\n [nasClass]=\"getClass('list-item', airport.code === focusedClosestAirportCode && 'focus')\">\n <button type=\"button\"\n [nasClass]=\"getClass('item', airport.code === focusedClosestAirportCode && 'focus')\"\n (click)=\"setSelected(airport)\"\n tabindex=\"-1\">\n <span [nasClass]=\"getClass('name')\">{{airport.name}}</span>\n <span [nasClass]=\"getClass('code')\"></span>\n <span [nasClass]=\"getClass('country')\">{{airport.countryName}}</span>\n </button>\n </li>\n </ng-container>\n <li role=\"separator\"\n [nasClass]=\"getClass('list-section-label')\"\n *ngIf=\"displayAllAirportsLabel && resultsLabels?.allAirports && isValid\">\n <span>{{resultsLabels?.allAirports}}</span>\n </li>\n <ng-container *ngIf=\"isValid\">\n <li role=\"option\"\n *ngFor=\"let airport of filteredAirports\"\n [id]=\"getAllAirportsAirportId(airport.code)\"\n [attr.aria-selected]=\"airport.code === focusedAirportCode\"\n [nasClass]=\"getClass('list-item', airport.code === focusedAirportCode && 'focus')\">\n <button type=\"button\"\n [nasClass]=\"getClass('item', airport.code === focusedAirportCode && 'focus')\"\n (click)=\"setSelected(airport)\"\n tabindex=\"-1\">\n <span [nasClass]=\"getClass('name')\">{{airport.name}}</span>\n <span [nasClass]=\"getClass('code')\"></span>\n <span [nasClass]=\"getClass('country')\">{{airport.countryName}}</span>\n </button>\n </li>\n </ng-container>\n <li *ngIf=\"!isValid\"\n role=\"listitem\">\n <span [nasClass]=\"getClass('name', 'invalid')\">{{invalidText}}</span>\n </li>\n </ul>\n</div>\n<button type=\"button\"\n tabindex=\"0\"\n *ngIf=\"open\"\n [attr.aria-label]=\"ariaLabelBackdrop\"\n [nasClass]=\"getClass('backdrop')\"\n (click)=\"blur()\"></button>", styles: [""], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i6.NasClassDirective, selector: "[nasClass]", inputs: ["nasClass", "attr.class"] }, { kind: "component", type: i7.IconComponent, selector: "nas-icon", inputs: ["icon", "type", "isIndicator", "lightCircularBackground", "cssClass"] }, { kind: "directive", type: i5.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i5.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i8.ButtonComponent, selector: "nas-button", inputs: ["primary", "secondary", "link", "light", "large", "block", "flex", "compact", "right", "spaceless", "href", "trackingvalue", "canContinueOnDisabled", "disabled", "type", "cssClass", "ariaLabel", "cssStyle", "tabindex", "overrideBaseCssClass", "useRouterLink", "id", "target", "icon", "iconLeft", "iconType", "buttonlink"], outputs: ["clickChange"] }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
547
547
|
}
|
|
548
548
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.5", ngImport: i0, type: AirportSelectDropdownComponent, decorators: [{
|
|
549
549
|
type: Component,
|
|
550
|
-
args: [{ selector: 'nas-airport-select-dropdown', encapsulation: ViewEncapsulation.None, template: "<ng-container *ngIf=\"!nasFormControlName; else reactiveForm\">\n <label [id]=\"labelId\"\n [attr.aria-label]=\"airportSelectLabel\"\n [nasClass]=\"getClass('wrapper', [open && 'active', selectedModel && 'filled'])\">\n <span [nasClass]=\"getClass('label')\">\n <ng-container *ngIf=\"airportSelectLabel; else emptyLabel\">{{airportSelectLabel}}</ng-container>\n <ng-template #emptyLabel> </ng-template>\n </span>\n <input #airportSelect\n type=\"text\"\n role=\"combobox\"\n autocomplete=\"off\"\n aria-haspopup=\"listbox\"\n aria-autocomplete=\"none\"\n [id]=\"inputId
|
|
550
|
+
args: [{ selector: 'nas-airport-select-dropdown', encapsulation: ViewEncapsulation.None, template: "<ng-container *ngIf=\"!nasFormControlName; else reactiveForm\">\n <label [id]=\"labelId\"\n [attr.aria-label]=\"airportSelectLabel\"\n [nasClass]=\"getClass('wrapper', [open && 'active', selectedModel && 'filled'])\">\n <span [nasClass]=\"getClass('label')\">\n <ng-container *ngIf=\"airportSelectLabel; else emptyLabel\">{{airportSelectLabel}}</ng-container>\n <ng-template #emptyLabel> </ng-template>\n </span>\n <input #airportSelect\n type=\"text\"\n role=\"combobox\"\n autocomplete=\"off\"\n aria-haspopup=\"listbox\"\n aria-autocomplete=\"none\"\n [id]=\"inputId\"\n [attr.aria-controls]=\"resultsId\"\n [attr.aria-expanded]=\"open ? 'true' : 'false'\"\n [attr.aria-owns]=\"resultsId\"\n [nasClass]=\"getClass('input')\"\n [placeholder]=\"airportSelectPlaceholder\"\n (focus)=\"setOpen()\"\n (mousedown)=\"setOpen()\"\n (input)=\"filter()\"\n (keydown)=\"onKeyDown($event)\"\n [(ngModel)]=\"selectedModel\"/>\n <span [nasClass]=\"getClass('icon')\">\n <button type=\"button\"\n role=\"button\"\n tabindex=\"-1\"\n *ngIf=\"selectedModel; else isEmpty\"\n [attr.aria-label]=\"ariaLabelClear\"\n (click)=\"clearSelected($event)\">\n <nas-icon [type]=\"selectedModel ? 'remove--secondary' : 'remove'\"></nas-icon>\n </button>\n <ng-template #isEmpty>\n <nas-icon [type]=\"'small'\"\n [icon]=\"airportSelectIconModifier\"></nas-icon>\n </ng-template>\n </span>\n </label>\n</ng-container>\n<ng-template #reactiveForm>\n <label [id]=\"labelId\"\n [attr.aria-label]=\"airportSelectLabel\"\n [nasClass]=\"getClass('wrapper', [open && 'active', selectedModel && 'filled'])\"\n [formGroup]=\"nasFormGroup\">\n <span [nasClass]=\"getClass('label')\"\n *ngIf=\"airportSelectLabel\">{{airportSelectLabel}}</span>\n <input #airportSelect\n type=\"text\"\n role=\"combobox\"\n autocomplete=\"off\"\n aria-autocomplete=\"none\"\n [id]=\"inputId\"\n [attr.aria-controls]=\"resultsId\"\n [attr.aria-expanded]=\"open ? 'true' : 'false'\"\n [attr.aria-owns]=\"resultsId\"\n [nasClass]=\"getClass('input')\"\n [formControlName]=\"nasFormControlName\"\n [placeholder]=\"airportSelectPlaceholder\"\n (mousedown)=\"setOpen()\"\n (focus)=\"setOpen()\"\n (input)=\"filter()\"\n (keydown)=\"onKeyDown($event)\" />\n <span [nasClass]=\"getClass('icon')\">\n <button type=\"button\"\n role=\"button\"\n tabindex=\"-1\"\n *ngIf=\"selectedModel; else isEmpty\"\n [attr.aria-label]=\"ariaLabelClear\"\n (click)=\"clearSelected($event)\">\n <nas-icon [type]=\"selectedModel ? 'remove--secondary' : 'remove'\"></nas-icon>\n </button>\n <ng-template #isEmpty>\n <nas-icon [type]=\"'small'\"\n [icon]=\"airportSelectIconModifier\"></nas-icon>\n </ng-template>\n </span>\n </label>\n</ng-template>\n<div [nasClass]=\"getClass('results-wrapper')\"\n [id]=\"resultsId\"\n [attr.aria-expanded]=\"open ? 'true' : 'false'\">\n <ul #results\n role=\"listbox\"\n *ngIf=\"open\"\n [attr.aria-labelledby]=\"labelId\"\n [nasClass]=\"getClass('results')\">\n <ng-container *ngIf=\"exists(enableGeolocation) && geolocationState !== null && geolocationState !== 0 && isValid\">\n <li role=\"option\">\n <nas-button link\n secondary\n [disabled]=\"geolocationState === 2\"\n [cssStyle]=\"{'height': '66px', 'text-decoration': 'underline', 'display': 'flex', 'justify-content': 'space-between'}\"\n [cssClass]=\"getClass('item', ['geolocation', focusOnGeolocation && geolocationState !== 2 && 'focus', geolocationState === 2 && 'disabled'])\"\n [tabindex]=\"-1\"\n (clickChange)=\"updateCurrentPosition()\"\n (mouseenter)=\"onGeolocationHover(true)\"\n (mouseleave)=\"onGeolocationHover(false)\">\n <span *ngIf=\"geolocationState === 1; else geolocationDenied\"\n [nasClass]=\"getClass('geolocation', 'label')\">{{resultsLabels?.geolocation}}</span>\n <ng-template #geolocationDenied>\n <span [nasClass]=\"getClass('geolocation', 'label')\">{{resultsLabels?.geolocationDenied}}</span>\n </ng-template>\n <nas-icon [nasClass]=\"getClass('geolocation', 'icon')\"\n [type]=\"geolocationIcon\"></nas-icon>\n </nas-button>\n </li>\n </ng-container>\n <li role=\"separator\"\n [nasClass]=\"getClass('list-section-label')\"\n *ngIf=\"latestSearches?.length > 0\n && exists(displayLatestSearches)\n && resultsLabels?.latestSearches\n && isValid\">\n <span>{{resultsLabels?.latestSearches}}</span>\n </li>\n <ng-container *ngIf=\"exists(displayLatestSearches) && isValid\">\n <li role=\"option\"\n *ngFor=\"let airport of latestSearches\"\n [id]=\"getLatestSearchesAirportId(airport.code)\"\n [attr.aria-selected]=\"airport.code === focusedLatestSearchesAirportCode\"\n [nasClass]=\"getClass('list-item', airport.code === focusedLatestSearchesAirportCode && 'focus')\">\n <button type=\"button\"\n [nasClass]=\"getClass('item', airport.code === focusedLatestSearchesAirportCode && 'focus')\"\n (click)=\"setSelected(airport)\"\n tabindex=\"-1\">\n <span [nasClass]=\"getClass('name')\">{{airport.name}}</span>\n <span [nasClass]=\"getClass('code')\"></span>\n <span [nasClass]=\"getClass('country')\">{{airport.countryName}}</span>\n </button>\n </li>\n </ng-container>\n <li role=\"separator\"\n *ngIf=\"exists(displayClosestAirports)\n && geolocationState !== null\n && geolocationState === 0\n && closestAirports?.length > 0\n && resultsLabels?.closestAirports\n && isValid\"\n [nasClass]=\"getClass('list-section-label')\">\n <span>{{resultsLabels?.closestAirports}}</span>\n </li>\n <ng-container *ngIf=\"exists(displayClosestAirports) && geolocationState === 0 && isValid\">\n <li role=\"option\"\n *ngFor=\"let airport of closestAirports\"\n [id]=\"getClosestAirportsAirportId(airport.code)\"\n [attr.aria-selected]=\"airport.code === focusedClosestAirportCode\"\n [nasClass]=\"getClass('list-item', airport.code === focusedClosestAirportCode && 'focus')\">\n <button type=\"button\"\n [nasClass]=\"getClass('item', airport.code === focusedClosestAirportCode && 'focus')\"\n (click)=\"setSelected(airport)\"\n tabindex=\"-1\">\n <span [nasClass]=\"getClass('name')\">{{airport.name}}</span>\n <span [nasClass]=\"getClass('code')\"></span>\n <span [nasClass]=\"getClass('country')\">{{airport.countryName}}</span>\n </button>\n </li>\n </ng-container>\n <li role=\"separator\"\n [nasClass]=\"getClass('list-section-label')\"\n *ngIf=\"displayAllAirportsLabel && resultsLabels?.allAirports && isValid\">\n <span>{{resultsLabels?.allAirports}}</span>\n </li>\n <ng-container *ngIf=\"isValid\">\n <li role=\"option\"\n *ngFor=\"let airport of filteredAirports\"\n [id]=\"getAllAirportsAirportId(airport.code)\"\n [attr.aria-selected]=\"airport.code === focusedAirportCode\"\n [nasClass]=\"getClass('list-item', airport.code === focusedAirportCode && 'focus')\">\n <button type=\"button\"\n [nasClass]=\"getClass('item', airport.code === focusedAirportCode && 'focus')\"\n (click)=\"setSelected(airport)\"\n tabindex=\"-1\">\n <span [nasClass]=\"getClass('name')\">{{airport.name}}</span>\n <span [nasClass]=\"getClass('code')\"></span>\n <span [nasClass]=\"getClass('country')\">{{airport.countryName}}</span>\n </button>\n </li>\n </ng-container>\n <li *ngIf=\"!isValid\"\n role=\"listitem\">\n <span [nasClass]=\"getClass('name', 'invalid')\">{{invalidText}}</span>\n </li>\n </ul>\n</div>\n<button type=\"button\"\n tabindex=\"0\"\n *ngIf=\"open\"\n [attr.aria-label]=\"ariaLabelBackdrop\"\n [nasClass]=\"getClass('backdrop')\"\n (click)=\"blur()\"></button>" }]
|
|
551
551
|
}], ctorParameters: function () { return [{ type: undefined, decorators: [{
|
|
552
552
|
type: Inject,
|
|
553
553
|
args: [DOCUMENT]
|
|
@@ -610,4 +610,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.5", ngImpor
|
|
|
610
610
|
}], clearedSelection: [{
|
|
611
611
|
type: Output
|
|
612
612
|
}] } });
|
|
613
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWlycG9ydC1zZWxlY3QtZHJvcGRvd24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29yZS1jb21wb25lbnRzL3NyYy9saWIvY29tcG9uZW50cy9haXJwb3J0LXNlbGVjdC9haXJwb3J0LXNlbGVjdC1kcm9wZG93bi9haXJwb3J0LXNlbGVjdC1kcm9wZG93bi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb3JlLWNvbXBvbmVudHMvc3JjL2xpYi9jb21wb25lbnRzL2FpcnBvcnQtc2VsZWN0L2FpcnBvcnQtc2VsZWN0LWRyb3Bkb3duL2FpcnBvcnQtc2VsZWN0LWRyb3Bkb3duLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQUNILE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBQ0wsU0FBUyxFQUVULFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUdMLE1BQU0sRUFDTixTQUFTLEVBQ1QsaUJBQWlCLEVBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBTXpFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJEQUEyRCxDQUFDOzs7Ozs7Ozs7O0FBRTdGLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQztBQVFmLE1BQU0sT0FBTyw4QkFBK0IsU0FBUSxnQkFBZ0I7SUFvQ2xFLElBQ0ksZUFBZTtRQUNqQixPQUFPLElBQUksQ0FBQyxvQkFBb0IsQ0FBQztJQUNuQyxDQUFDO0lBQ0QsSUFBSSxlQUFlLENBQUMsUUFBNkI7UUFDL0MsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUU7WUFDakMsT0FBTztTQUNSO1FBRUQsSUFBSSxDQUFDLG9CQUFvQixHQUFH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c2VcbiAqIENvcHlyaWdodCBOb3J3ZWdpYW4gQWlyIFNodXR0bGUuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKi9cbmltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbmplY3QsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdFbmNhcHN1bGF0aW9uXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTmFzQ29tcG9uZW50QmFzZSB9IGZyb20gJy4uLy4uLy4uL2NvcmUvYmFzZS9uYXMtY29tcG9uZW50LmJhc2UnO1xuaW1wb3J0IHsgR2VvbG9jYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9zZXJ2aWNlcy9nZW9sb2NhdGlvbi9nZW9sb2NhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IEFpcnBvcnRNb2RlbCB9IGZyb20gJy4uL21vZGVscy9haXJwb3J0Lm1vZGVsJztcbmltcG9ydCB7IFJlc3VsdHNMYWJlbHNNb2RlbCB9IGZyb20gJy4uL21vZGVscy9yZXN1bHRzLWxhYmVscy5tb2RlbCc7XG5pbXBvcnQgeyBBaXJwb3J0U2VsZWN0RHJvcGRvd25TZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvYWlycG9ydC1zZWxlY3QtZHJvcGRvd24uc2VydmljZSc7XG5pbXBvcnQgeyBBaXJwb3J0U2VsZWN0U2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2FpcnBvcnQtc2VsZWN0LnNlcnZpY2UnO1xuaW1wb3J0IHsgR2VvbG9jYXRpb25TdGF0ZSB9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZXMvZ2VvbG9jYXRpb24vZ2VvbG9jYXRpb24tc3RhdGUuZW51bSc7XG5cbmxldCBuZXh0SWQgPSAwO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICduYXMtYWlycG9ydC1zZWxlY3QtZHJvcGRvd24nLFxuICB0ZW1wbGF0ZVVybDogJy4vYWlycG9ydC1zZWxlY3QtZHJvcGRvd24uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9haXJwb3J0LXNlbGVjdC1kcm9wZG93bi5jb21wb25lbnQuc2NzcyddLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lXG59KVxuZXhwb3J0IGNsYXNzIEFpcnBvcnRTZWxlY3REcm9wZG93bkNvbXBvbmVudCBleHRlbmRzIE5hc0NvbXBvbmVudEJhc2UgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gIGFpcnBvcnRWYWx1ZTogQWlycG9ydE1vZGVsO1xuICBhaXJwb3J0c1ZhbHVlOiBBcnJheTxBaXJwb3J0TW9kZWw+O1xuICBmb2N1c2VkQWlycG9ydEluZGV4ID0gLTE7XG4gIGZvY3VzZWRMYXRlc3RTZWFyY2hlc0luZGV4ID0gLTE7XG4gIGZvY3VzZWRDbG9zZXN0QWlycG9ydEluZGV4ID0gLTE7XG4gIGZvY3VzZWRDbG9zZXN0QWlycG9ydENvZGU6IHN0cmluZztcbiAgZm9jdXNlZEFpcnBvcnRDb2RlOiBzdHJpbmc7XG4gIGZvY3VzZWRMYXRlc3RTZWFyY2hlc0FpcnBvcnRDb2RlOiBzdHJpbmc7XG4gIGZpbHRlcmVkQWlycG9ydHM6IEFycmF5PEFpcnBvcnRNb2RlbD4gPSB0aGlzLmFpcnBvcnRzO1xuICBkaXNwbGF5QWxsQWlycG9ydHNMYWJlbCA9IHRydWU7XG4gIG9wZW5WYWx1ZTogYm9vbGVhbjtcbiAgZm9jdXNPbkdlb2xvY2F0aW9uOiBib29sZWFuO1xuICBnZW9sb2NhdGlvblN0YXRlOiBHZW9sb2NhdGlvblN0YXRlID0gbnVsbDtcblxuICBAVmlld0NoaWxkKCdhaXJwb3J0U2VsZWN0JykgaW5wdXQ6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ3Jlc3VsdHMnKSByZXN1bHRzOiBFbGVtZW50UmVmO1xuXG4gIEBJbnB1dCgpIGlkOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGRpc3BsYXlMYXRlc3RTZWFyY2hlcz86IGJvb2xlYW47XG4gIEBJbnB1dCgpIGRpc3BsYXlDbG9zZXN0QWlycG9ydHM/OiBib29sZWFuO1xuICBASW5wdXQoKSBsYXRlc3RTZWFyY2hlczogQXJyYXk8QWlycG9ydE1vZGVsPjtcbiAgQElucHV0KCkgcmVzdWx0c0xhYmVsczogUmVzdWx0c0xhYmVsc01vZGVsO1xuICBASW5wdXQoKSBhaXJwb3J0U2VsZWN0TGFiZWw6IHN0cmluZztcbiAgQElucHV0KCkgYWlycG9ydFNlbGVjdFBsYWNlaG9sZGVyOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGFpcnBvcnRTZWxlY3RJY29uTW9kaWZpZXI6IHN0cmluZztcbiAgQElucHV0KCkga2VlcFNlbGVjdGlvbjogYm9vbGVhbjtcbiAgQElucHV0KCkgbmFzRm9ybUNvbnRyb2xOYW1lOiBzdHJpbmc7XG4gIEBJbnB1dCgpIG5hc0Zvcm1Hcm91cDogRm9ybUdyb3VwO1xuICBASW5wdXQoKSBlbmFibGVHZW9sb2NhdGlvbj86IGJvb2xlYW47XG4gIEBJbnB1dCgpIGFyaWFMYWJlbENsZWFyOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGFyaWFMYWJlbEJhY2tkcm9wOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGlzVmFsaWQgPSB0cnVlO1xuICBASW5wdXQoKSBpbnZhbGlkVGV4dDogc3RyaW5nO1xuXG4gIEBJbnB1dCgpXG4gIGdldCBjbG9zZXN0QWlycG9ydHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuY2xvc2VzdEFpcnBvcnRzVmFsdWU7XG4gIH1cbiAgc2V0IGNsb3Nlc3RBaXJwb3J0cyhhaXJwb3J0czogQXJyYXk8QWlycG9ydE1vZGVsPikge1xuICAgIGlmICghYWlycG9ydHMgfHwgIWFpcnBvcnRzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuY2xvc2VzdEFpcnBvcnRzVmFsdWUgPSBhaXJwb3J0cztcbiAgICB0aGlzLmdlb2xvY2F0aW9uU3RhdGUgPSBHZW9sb2NhdGlvblN0YXRlLmdyYW50ZWQ7XG4gIH1cblxuICBASW5wdXQoKVxuICBnZXQgYWlycG9ydCgpIHtcbiAgICByZXR1cm4gdGhpcy5haXJwb3J0VmFsdWU7XG4gIH1cbiAgc2V0IGFpcnBvcnQoYWlycG9ydDogQWlycG9ydE1vZGVsKSB7XG4gICAgaWYgKCFhaXJwb3J0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5haXJwb3J0VmFsdWUgPSBhaXJwb3J0O1xuICAgIHRoaXMuc2VsZWN0ZWRNb2RlbCA9IGFpcnBvcnQubmFtZTtcbiAgICB0aGlzLmZpbHRlcmVkQWlycG9ydHMgPSB0aGlzLnNlbGVjdFNlcnZpY2UuZmlsdGVyKHRoaXMuYWlycG9ydHMsIHRoaXMuc2VsZWN0ZWRNb2RlbCk7XG4gIH1cblxuICBASW5wdXQoKVxuICBnZXQgb3BlbigpIHtcbiAgICByZXR1cm4gdGhpcy5vcGVuVmFsdWU7XG4gIH1cbiAgc2V0IG9wZW4odmFsdWU6IGJvb2xlYW4pIHtcbiAgICBpZiAodGhpcy5vcGVuVmFsdWUgPT09IHZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuaW5wdXRTZWxlY3Rpb25UaW1lb3V0KTtcbiAgICB0aGlzLm9wZW5WYWx1ZSA9IHZhbHVlO1xuXG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICB0aGlzLmlucHV0U2VsZWN0aW9uVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmlucHV0Lm5hdGl2ZUVsZW1lbnQuc2VsZWN0KCk7XG4gICAgICB9LCAxMDApO1xuICAgIH1cbiAgfVxuXG4gIEBJbnB1dCgpXG4gIGdldCBhaXJwb3J0cygpIHtcbiAgICByZXR1cm4gdGhpcy5haXJwb3J0c1ZhbHVlO1xuICB9XG4gIHNldCBhaXJwb3J0cyhhaXJwb3J0czogQXJyYXk8QWlycG9ydE1vZGVsPikge1xuICAgIHRoaXMuYWlycG9ydHNWYWx1ZSA9IGFpcnBvcnRzO1xuICAgIHRoaXMuZmlsdGVyZWRBaXJwb3J0cyA9IHRoaXMuc2VsZWN0U2VydmljZS5maWx0ZXIodGhpcy5haXJwb3J0cywgdGhpcy5zZWxlY3RlZE1vZGVsKTtcbiAgfVxuXG4gIEBPdXRwdXQoKSBzZWxlY3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8QWlycG9ydE1vZGVsPigpO1xuICBAT3V0cHV0KCkgb3BlbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcbiAgQE91dHB1dCgpIGZvY3VzT25OZXh0ID0gbmV3IEV2ZW50RW1pdHRlcjxLZXlib2FyZEV2ZW50PigpO1xuICBAT3V0cHV0KCkgZm9jdXNPblByZXZpb3VzID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgcG9zaXRpb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPEdlb2xvY2F0aW9uUG9zaXRpb24+KCk7XG4gIEBPdXRwdXQoKSBjbGVhcmVkU2VsZWN0aW9uID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIGdldCBzZWxlY3RlZE1vZGVsKCkge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkTW9kZWxWYWx1ZTtcbiAgfVxuICBzZXQgc2VsZWN0ZWRNb2RlbChtb2RlbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZWxlY3RlZE1vZGVsVmFsdWUgPSBtb2RlbDtcblxuICAgIGlmICghdGhpcy5uYXNGb3JtR3JvdXAgfHwgIXRoaXMubmFzRm9ybUNvbnRyb2xOYW1lKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY29udHJvbCA9IHRoaXMubmFzRm9ybUdyb3VwLmdldCh0aGlzLm5hc0Zvcm1Db250cm9sTmFtZSk7XG5cbiAgICBpZiAoY29udHJvbCAmJiBjb250cm9sLnZhbHVlICE9PSBtb2RlbCkge1xuICAgICAgY29udHJvbC5wYXRjaFZhbHVlKG1vZGVsKTtcbiAgICB9XG4gIH1cblxuICBnZXQgcmVzdWx0c0lkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBuYXMtYWlycG9ydC1zZWxlY3QtZHJvcGRvd24tcmVzdWx0cy0ke3RoaXMuY29tcG9uZW50SWR9YDtcbiAgfVxuXG4gIGdldCBsYWJlbElkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBuYXMtYWlycG9ydC1zZWxlY3QtZHJvcGRvd24tbGFiZWwtJHt0aGlzLmNvbXBvbmVudElkfWA7XG4gIH1cblxuICBnZXQgaW5wdXRJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmlkID8gdGhpcy5pZCA6IGBuYXMtYWlycG9ydC1zZWxlY3QtZHJvcGRvd24taW5wdXQtJHt0aGlzLmNvbXBvbmVudElkfWA7XG4gIH1cblxuICBnZXQgZ2VvbG9jYXRpb25JY29uKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuZ2VvbG9jYXRpb25TdGF0ZSA9PT0gR2VvbG9jYXRpb25TdGF0ZS5kZW5pZWQpIHtcbiAgICAgIHJldHVybiAnZ2VvbG9jYXRpb24tLWRpc2FibGVkJztcbiAgICB9XG5cbiAgICByZXR1cm4gJ2dlb2xvY2F0aW9uJztcbiAgfVxuXG4gIHByaXZhdGUgbGFzdFNlbGVjdGVkTW9kZWw6IHN0cmluZztcbiAgcHJpdmF0ZSBzZWxlY3RlZE1vZGVsVmFsdWU6IHN0cmluZztcbiAgcHJpdmF0ZSBpbnB1dFNlbGVjdGlvblRpbWVvdXQ6IGFueTtcbiAgcHJpdmF0ZSBjbG9zZXN0QWlycG9ydHNWYWx1ZTogQXJyYXk8QWlycG9ydE1vZGVsPjtcbiAgcHJpdmF0ZSBjb21wb25lbnRJZDogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoRE9DVU1FTlQpIHByaXZhdGUgZG9jdW1lbnQ6IGFueSxcbiAgICBwcml2YXRlIHNlbGVjdFNlcnZpY2U6IEFpcnBvcnRTZWxlY3RTZXJ2aWNlLFxuICAgIHByaXZhdGUgYWlycG9ydFNlbGVjdERyb3Bkb3duU2VydmljZTogQWlycG9ydFNlbGVjdERyb3Bkb3duU2VydmljZSxcbiAgICBwcml2YXRlIGdlb2xvY2F0aW9uU2VydmljZTogR2VvbG9jYXRpb25TZXJ2aWNlKSB7XG4gICAgc3VwZXIoJ25hcy1haXJwb3J0LXNlbGVjdCcpO1xuICAgIHRoaXMuY29tcG9uZW50SWQgPSBuZXh0SWQrKztcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5hcmlhTGFiZWxDbGVhcikge1xuICAgICAgdGhpcy53YXJuTWlzc2luZ0FjY2Vzc2liaWx0eUlucHV0KCdhcmlhTGFiZWxDbGVhcicpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuYXJpYUxhYmVsQmFja2Ryb3ApIHtcbiAgICAgIHRoaXMud2Fybk1pc3NpbmdBY2Nlc3NpYmlsdHlJbnB1dCgnYXJpYUxhYmVsQmFja2Ryb3AnKTtcbiAgICB9XG5cbiAgICB0aGlzLnNlbGVjdGVkTW9kZWwgPSB0aGlzLmFpcnBvcnQgPyB0aGlzLmFpcnBvcnQubmFtZSA6ICcnO1xuXG4gICAgaWYgKHRoaXMuZXhpc3RzKHRoaXMuZGlzcGxheUNsb3Nlc3RBaXJwb3J0cykpIHtcbiAgICAgIHRoaXMuZ2VvbG9jYXRpb25TZXJ2aWNlLmdldFN0YXRlKCkuc3Vic2NyaWJlKChzdGF0ZTogR2VvbG9jYXRpb25TdGF0ZSkgPT4ge1xuICAgICAgICB0aGlzLmdlb2xvY2F0aW9uU3RhdGUgPSBzdGF0ZTtcblxuICAgICAgICBpZiAoc3RhdGUgPT09IEdlb2xvY2F0aW9uU3RhdGUuZ3JhbnRlZCkge1xuICAgICAgICAgIHRoaXMudXBkYXRlQ3VycmVudFBvc2l0aW9uKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5zZWxlY3RlZE1vZGVsKSB7XG4gICAgICB0aGlzLmZpbHRlcmVkQWlycG9ydHMgPSB0aGlzLnNlbGVjdFNlcnZpY2UuZmlsdGVyKHRoaXMuYWlycG9ydHMsIHRoaXMuc2VsZWN0ZWRNb2RlbCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5kaXNwbGF5TGF0ZXN0U2VhcmNoZXMgPSBmYWxzZTtcbiAgICB0aGlzLmRpc3BsYXlDbG9zZXN0QWlycG9ydHMgPSBmYWxzZTtcbiAgICB0aGlzLmRpc3BsYXlBbGxBaXJwb3J0c0xhYmVsID0gZmFsc2U7XG5cbiAgICBpZiAoIXRoaXMuZmlsdGVyZWRBaXJwb3J0cykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGFpcnBvcnQgPSB0aGlzLmZpbHRlcmVkQWlycG9ydHMuZmluZCh4ID0+IHgubmFtZSA9PT0gdGhpcy5zZWxlY3RlZE1vZGVsKTtcblxuICAgIGlmIChhaXJwb3J0KSB7XG4gICAgICB0aGlzLmZvY3VzZWRBaXJwb3J0Q29kZSA9IGFpcnBvcnQuY29kZTtcbiAgICB9XG4gIH1cblxuICBnZXRBbGxBaXJwb3J0c0FpcnBvcnRJZChhaXJwb3J0Q29kZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYG5hcy1haXJwb3J0LXNlbGVjdC1kcm9wZG93bi1haXJwb3J0LSR7dGhpcy5jb21wb25lbnRJZH0tYWxsLWFpcnBvcnRzLSR7YWlycG9ydENvZGV9YDtcbiAgfVxuXG4gIGdldENsb3Nlc3RBaXJwb3J0c0FpcnBvcnRJZChhaXJwb3J0Q29kZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYG5hcy1haXJwb3J0LXNlbGVjdC1kcm9wZG93bi1haXJwb3J0LSR7dGhpcy5jb21wb25lbnRJZH0tY2xvc2VzdC1haXJwb3J0cy0ke2FpcnBvcnRDb2RlfWA7XG4gIH1cblxuICBnZXRMYXRlc3RTZWFyY2hlc0FpcnBvcnRJZChhaXJwb3J0Q29kZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYG5hcy1haXJwb3J0LXNlbGVjdC1kcm9wZG93bi1haXJwb3J0LSR7dGhpcy5jb21wb25lbnRJZH0tbGF0ZXN0LXNlYXJjaGVzLSR7YWlycG9ydENvZGV9YDtcbiAgfVxuXG4gIHVwZGF0ZUN1cnJlbnRQb3NpdGlvbigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5nZW9sb2NhdGlvblN0YXRlID09PSBHZW9sb2NhdGlvblN0YXRlLmRlbmllZFxuICAgICAgfHwgdGhpcy5nZW9sb2NhdGlvblN0YXRlID09PSBHZW9sb2NhdGlvblN0YXRlLnVua25vd24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmdlb2xvY2F0aW9uU2VydmljZS5nZXRDdXJyZW50UG9zaXRpb24oKS5zdWJzY3JpYmUoKHg6IEdlb2xvY2F0aW9uUG9zaXRpb24pID0+IHtcbiAgICAgIHRoaXMucG9zaXRpb25DaGFuZ2UuZW1pdCh4KTtcbiAgICB9LCAoZXJyb3I6IEdlb2xvY2F0aW9uUG9zaXRpb25FcnJvcikgPT4ge1xuICAgICAgaWYgKGVycm9yLlBFUk1JU1NJT05fREVOSUVEKSB7XG4gICAgICAgIHRoaXMuZ2VvbG9jYXRpb25TdGF0ZSA9IEdlb2xvY2F0aW9uU3RhdGUuZGVuaWVkO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgc2V0T3BlbigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5vcGVuKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5vcGVuID0gdHJ1ZTtcbiAgICB0aGlzLm9wZW5DaGFuZ2UuZW1pdCh0cnVlKTtcbiAgfVxuXG4gIG9uR2VvbG9jYXRpb25Ib3Zlcihob3ZlcjogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmIChob3ZlciAmJiB0aGlzLmdlb2xvY2F0aW9uU3RhdGUgIT09IEdlb2xvY2F0aW9uU3RhdGUuZGVuaWVkKSB7XG4gICAgICB0aGlzLmZvY3VzT25HZW9sb2NhdGlvbiA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZm9jdXNPbkdlb2xvY2F0aW9uID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgYmx1cigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5rZWVwU2VsZWN0aW9uKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkTW9kZWwgPSB0aGlzLmxhc3RTZWxlY3RlZE1vZGVsO1xuICAgIH1cblxuICAgIHRoaXMub3BlbiA9IGZhbHNlO1xuICAgIHRoaXMub3BlbkNoYW5nZS5lbWl0KGZhbHNlKTtcblxuICAgIGlmICh0aGlzLnNlbGVjdGVkTW9kZWwgPT09IHRoaXMubGFzdFNlbGVjdGVkTW9kZWwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zZWxlY3RlZE1vZGVsKSB7XG4gICAgICBpZiAodGhpcy5maWx0ZXJlZEFpcnBvcnRzKSB7XG4gICAgICAgIGxldCBhaXJwb3J0ID0gdGhpcy5maWx0ZXJlZEFpcnBvcnRzLmZpbmQoeCA9PiB4Lm5hbWUgPT09IHRoaXMuc2VsZWN0ZWRNb2RlbCk7XG4gICAgICAgIGlmICghYWlycG9ydCkge1xuICAgICAgICAgIGFpcnBvcnQgPSB0aGlzLmZpbHRlcmVkQWlycG9ydHNbMF07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51cGRhdGVTZWxlY3RlZChhaXJwb3J0KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy51cGRhdGVTZWxlY3RlZCh7XG4gICAgICAgIGFpcnBvcnROYW1lOiAnJyxcbiAgICAgICAgY29kZTogJycsXG4gICAgICAgIGNvdW50cnlOYW1lOiAnJyxcbiAgICAgICAgZGlzcGxheU5hbWU6ICcnLFxuICAgICAgICBuYW1lOiAnJyxcbiAgICAgICAgbm9ybWFsaXplZEFpcnBvcnROYW1lOiAnJ1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgZmlsdGVyKCk6IHZvaWQge1xuICAgIGxldCBpc0VtcHR5ID0gZmFsc2U7XG5cbiAgICBpZiAoIXRoaXMubmFzRm9ybUdyb3VwIHx8ICF0aGlzLm5hc0Zvcm1Db250cm9sTmFtZSkge1xuICAgICAgaWYgKCF0aGlzLnNlbGVjdGVkTW9kZWwpIHtcbiAgICAgICAgdGhpcy5yZXNldEZpbHRlcigpO1xuICAgICAgICBpc0VtcHR5ID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZm9jdXNlZEFpcnBvcnRJbmRleCA9IDA7XG4gICAgICAgIHRoaXMuZmlsdGVyZWRBaXJwb3J0cyA9IHRoaXMuc2VsZWN0U2VydmljZS5maWx0ZXIodGhpcy5haXJwb3J0cywgdGhpcy5zZWxlY3RlZE1vZGVsKTtcbiAgICAgICAgdGhpcy5mb2N1c2VkQWlycG9ydENvZGUgPSB0aGlzLmZpbHRlcmVkQWlycG9ydHNbMF0uY29kZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY29udHJvbCA9IHRoaXMubmFzRm9ybUdyb3VwLmdldCh0aGlzLm5hc0Zvcm1Db250cm9sTmFtZSk7XG5cbiAgICAgIGlmICghY29udHJvbCB8fCAhY29udHJvbC52YWx1ZSkge1xuICAgICAgICB0aGlzLnJlc2V0RmlsdGVyKCk7XG4gICAgICAgIGlzRW1wdHkgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5mb2N1c2VkQWlycG9ydEluZGV4ID0gMDtcbiAgICAgICAgdGhpcy5maWx0ZXJlZEFpcnBvcnRzID0gdGhpcy5zZWxlY3RTZXJ2aWNlLmZpbHRlcih0aGlzLmFpcnBvcnRzLCBjb250cm9sLnZhbHVlKTtcbiAgICAgICAgdGhpcy5mb2N1c2VkQWlycG9ydENvZGUgPSB0aGlzLmZpbHRlcmVkQWlycG9ydHNbMF0uY29kZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmRpc3BsYXlMYXRlc3RTZWFyY2hlcyA9IGlzRW1wdHk7XG4gICAgdGhpcy5kaXNwbGF5Q2xvc2VzdEFpcnBvcnRzID0gaXNFbXB0eTtcbiAgICB0aGlzLmRpc3BsYXlBbGxBaXJwb3J0c0xhYmVsID0gaXNFbXB0eTtcbiAgfVxuXG4gIGNsZWFyU2VsZWN0ZWQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgIGlmICh0aGlzLmtlZXBTZWxlY3Rpb24pIHtcbiAgICAgIHRoaXMubGFzdFNlbGVjdGVkTW9kZWwgPSB0aGlzLmFpcnBvcnQubmFtZTtcbiAgICB9XG5cbiAgICB0aGlzLnNlbGVjdGVkTW9kZWwgPSAnJztcblxuICAgIHRoaXMudXBkYXRlU2VsZWN0ZWQoe1xuICAgICAgbmFtZTogJycsXG4gICAgICBjb3VudHJ5TmFtZTogJycsXG4gICAgICBjb2RlOiAnJyxcbiAgICAgIGRpc3BsYXlOYW1lOiAnJyxcbiAgICAgIGFpcnBvcnROYW1lOiAnJyxcbiAgICAgIG5vcm1hbGl6ZWRBaXJwb3J0TmFtZTogJydcbiAgICB9KTtcblxuICAgIHRoaXMuZm9jdXNlZEFpcnBvcnRJbmRleCA9IC0xO1xuICAgIHRoaXMuZm9jdXNlZExhdGVzdFNlYXJjaGVzSW5kZXggPSAtMTtcbiAgICB0aGlzLmZvY3VzZWRDbG9zZXN0QWlycG9ydEluZGV4ID0gLTE7XG4gICAgdGhpcy5mb2N1c2VkQWlycG9ydENvZGUgPSAnJztcbiAgICB0aGlzLmZvY3VzZWRMYXRlc3RTZWFyY2hlc0FpcnBvcnRDb2RlID0gJyc7XG4gICAgdGhpcy5mb2N1c2VkQ2xvc2VzdEFpcnBvcnRDb2RlID0gJyc7XG4gICAgdGhpcy5maWx0ZXJlZEFpcnBvcnRzID0gdGhpcy5haXJwb3J0cztcblxuICAgIHRoaXMub3BlbiA9IHRydWU7XG4gICAgdGhpcy5kaXNwbGF5TGF0ZXN0U2VhcmNoZXMgPSB0cnVlO1xuICAgIHRoaXMuZGlzcGxheUNsb3Nlc3RBaXJwb3J0cyA9IHRydWU7XG4gICAgdGhpcy5kaXNwbGF5QWxsQWlycG9ydHNMYWJlbCA9IHRydWU7XG4gICAgdGhpcy5jbGVhcmVkU2VsZWN0aW9uLmVtaXQoKTtcbiAgfVxuXG4gIGZvY3VzRG93bigpOiB2b2lkIHtcbiAgICBjb25zdCBoYXNMYXRlc3RTZWFyY2hlcyA9IHRoaXMuYWlycG9ydFNlbGVjdERyb3Bkb3duU2VydmljZVxuICAgICAgLmhhc0xhdGVzdFNlYXJjaGVzKHRoaXMuZXhpc3RzKHRoaXMuZGlzcGxheUxhdGVzdFNlYXJjaGVzKSwgdGhpcy5sYXRlc3RTZWFyY2hlcyk7XG5cbiAgICBjb25zdCBoYXNDbG9zZXN0QWlycG9ydHMgPSB0aGlzLmFpcnBvcnRTZWxlY3REcm9wZG93blNlcnZpY2VcbiAgICAgIC5oYXNDbG9zZXN0QWlycG9ydHModGhpcy5leGlzdHModGhpcy5kaXNwbGF5Q2xvc2VzdEFpcnBvcnRzKSwgdGhpcy5jbG9zZXN0QWlycG9ydHMpO1xuXG4gICAgaWYgKHRoaXMuZ2VvbG9jYXRpb25TdGF0ZSAhPT0gbnVsbCAmJlxuICAgICAgdGhpcy5nZW9sb2NhdGlvblN0YXRlICE9PSBHZW9sb2NhdGlvblN0YXRlLmdyYW50ZWQgJiZcbiAgICAgIHRoaXMuZ2VvbG9jYXRpb25TdGF0ZSAhPT0gR2VvbG9jYXRpb25TdGF0ZS5kZW5pZWQgJiZcbiAgICAgICF0aGlzLmZvY3VzT25HZW9sb2NhdGlvbiAmJlxuICAgICAgdGhpcy5mb2N1c2VkQWlycG9ydEluZGV4ID09PSAtMSAmJlxuICAgICAgdGhpcy5mb2N1c2VkTGF0ZXN0U2VhcmNoZXNJbmRleCA9PT0gLTEpIHtcbiAgICAgIHRoaXMuZm9jdXNPbkdlb2xvY2F0aW9uID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKGhhc0xhdGVzdFNlYXJjaGVzICYmIHRoaXMuZm9jdXNlZExhdGVzdFNlYXJjaGVzSW5kZXggPCB0aGlzLmxhdGVzdFNlYXJjaGVzLmxlbmd0aCAtIDEpIHtcbiAgICAgIHRoaXMuZm9jdXNEb3duTGF0ZXN0U2VhcmNoZXMoKTtcbiAgICB9IGVsc2UgaWYgKGhhc0Nsb3Nlc3RBaXJwb3J0c1xuICAgICAgJiYgdGhpcy5haXJwb3J0U2VsZWN0RHJvcGRvd25TZXJ2aWNlLmlzSW5kZXhJbkNsb3Nlc3RBaXJwb3J0cyh0aGlzLmZvY3VzZWRDbG9zZXN0QWlycG9ydEluZGV4LCB0aGlzLmNsb3Nlc3RBaXJwb3J0cykpIHtcbiAgICAgIHRoaXMuZm9jdXNEb3duQ2xvc2VzdEFpcnBvcnRzKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZm9jdXNEb3duQWlycG9ydHMoaGFzQ2xvc2VzdEFpcnBvcnRzLCBoYXNMYXRlc3RTZWFyY2hlcyk7XG4gICAgfVxuXG4gICAgdGhpcy5hdXRvU2Nyb2xsKDY2KTtcbiAgfVxuXG4gIGZvY3VzVXAoKTogdm9pZCB7XG4gICAgY29uc3QgaGFzTGF0ZXN0U2VhcmNoZXMgPSB0aGlzLmFpcnBvcnRTZWxlY3REcm9wZG93blNlcnZpY2VcbiAgICAgIC5oYXNMYXRlc3RTZWFyY2hlcyh0aGlzLmV4aXN0cyh0aGlzLmRpc3BsYXlMYXRlc3RTZWFyY2hlcyksIHRoaXMubGF0ZXN0U2VhcmNoZXMpO1xuXG4gICAgY29uc3QgaGFzQ2xvc2VzdEFpcnBvcnRzID0gdGhpcy5haXJwb3J0U2VsZWN0RHJvcGRvd25TZXJ2aWNlXG4gICAgICAuaGFzQ2xvc2VzdEFpcnBvcnRzKHRoaXMuZXhpc3RzKHRoaXMuZGlzcGxheUNsb3Nlc3RBaXJwb3J0cyksIHRoaXMuY2xvc2VzdEFpcnBvcnRzKTtcblxuICAgIGNvbnN0IGhhc0dlb2xvY2F0aW9uID0gdGhpcy5nZW9sb2NhdGlvblN0YXRlICE9PSBudWxsICYmXG4gICAgICB0aGlzLmdlb2xvY2F0aW9uU3RhdGUgIT09IEdlb2xvY2F0aW9uU3RhdGUuZ3JhbnRlZCAmJlxuICAgICAgdGhpcy5nZW9sb2NhdGlvblN0YXRlICE9PSBHZW9sb2NhdGlvblN0YXRlLmRlbmllZCAmJlxuICAgICAgIXRoaXMuZm9jdXNPbkdlb2xvY2F0aW9uO1xuXG4gICAgaWYgKHRoaXMuZm9jdXNlZEFpcnBvcnRJbmRleCA+IDApIHtcbiAgICAgIHRoaXMuZm9jdXNVcEFpcnBvcnRzKGhhc0Nsb3Nlc3RBaXJwb3J0cywgaGFzTGF0ZXN0U2VhcmNoZXMpO1xuICAgIH0gZWxzZSBpZiAoaGFzQ2xvc2VzdEFpcnBvcnRzICYmIHRoaXMuZm9jdXNlZEFpcnBvcnRJbmRleCA8PSAwICYmIHRoaXMuZm9jdXNlZENsb3Nlc3RBaXJwb3J0SW5kZXggPiAwKSB7XG4gICAgICB0aGlzLmZvY3VzVXBDbG9zZXN0QWlycG9ydHMoaGFzTGF0ZXN0U2VhcmNoZXMpO1xuICAgIH0gZWxzZSBpZiAoaGFzTGF0ZXN0U2VhcmNoZXMgJiYgaGFzQ2xvc2VzdEFpcnBvcnRzICYmIHRoaXMuZm9jdXNlZENsb3Nlc3RBaXJwb3J0SW5kZXggPD0gMFxuICAgICAgfHwgaGFzTGF0ZXN0U2VhcmNoZXMgJiYgIWhhc0Nsb3Nlc3RBaXJwb3J0cyAmJiB0aGlzLmZvY3VzZWRBaXJwb3J0SW5kZXggPD0gMCkge1xuICAgICAgdGhpcy5mb2N1c1VwTGF0ZXN0U2VhcmNoZXMoKTtcbiAgICB9IGVsc2UgaWYgKGhhc0dlb2xvY2F0aW9uICYmIGhhc0xhdGVzdFNlYXJjaGVzICYmIHRoaXMuZm9jdXNlZExhdGVzdFNlYXJjaGVzSW5kZXggPD0gMFxuICAgICAgfHwgaGFzR2VvbG9jYXRpb24gJiYgIWhhc0xhdGVzdFNlYXJjaGVzICYmIHRoaXMuZm9jdXNlZEFpcnBvcnRJbmRleCA8PSAwKSB7XG4gICAgICB0aGlzLmZvY3VzT25HZW9sb2NhdGlvbiA9IHRydWU7XG4gICAgICB0aGlzLmZvY3VzZWRBaXJwb3J0Q29kZSA9ICcnO1xuICAgICAgdGhpcy5mb2N1c2VkTGF0ZXN0U2VhcmNoZXNBaXJwb3J0Q29kZSA9ICcnO1xuICAgICAgdGhpcy5mb2N1c2VkTGF0ZXN0U2VhcmNoZXNJbmRleCA9IC0xO1xuICAgICAgdGhpcy5mb2N1c2VkQWlycG9ydEluZGV4ID0gLTE7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYmx1cigpO1xuICAgIH1cblxuICAgIHRoaXMuYXV0b1Njcm9sbCg2Nik7XG4gIH1cblxuICBzZXRTZWxlY3RlZChhaXJwb3J0OiBBaXJwb3J0TW9kZWwpOiB2b2lkIHtcbiAgICB0aGlzLnVwZGF0ZVNlbGVjdGVkKGFpcnBvcnQpO1xuICAgIHRoaXMub3BlbiA9IGZhbHNlO1xuICAgIHRoaXMub3BlbkNoYW5nZS5lbWl0KGZhbHNlKTtcbiAgfVxuXG4gIG9uS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIHN3aXRjaCAoZXZlbnQua2V5KSB7XG4gICAgICBjYXNlICdFc2NhcGUnOlxuICAgICAgICB0aGlzLm9wZW4gPSBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMua2VlcFNlbGVjdGlvbiAmJiAhdGhpcy5haXJwb3J0Lm5hbWUpIHtcbiAgICAgICAgICB0aGlzLmJsdXIoKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ1RhYic6XG4gICAgICBjYXNlICdFbnRlcic6XG4gICAgICAgIGlmICh0aGlzLmZpbHRlcmVkQWlycG9ydHMpIHtcbiAgICAgICAgICBjb25zdCBhaXJwb3J0ID0gdGhpcy5maWx0ZXJlZEFpcnBvcnRzLmZpbmQoeCA9PiB4LmNvZGUgPT09IHRoaXMuZm9jdXNlZEFpcnBvcnRDb2RlKSB8fCB0aGlzLmZpbHRlcmVkQWlycG9ydHNbMF07XG4gICAgICAgICAgdGhpcy5zZWxlY3RlZE1vZGVsID0gYWlycG9ydC5uYW1lIHx8ICcnO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuZm9jdXNPbkdlb2xvY2F0aW9uKSB7XG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICB0aGlzLnVwZGF0ZUN1cnJlbnRQb3NpdGlvbigpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmJsdXIoKTtcbiAgICAgICAgICBpZiAoIWV2ZW50LnNoaWZ0S2V5KSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdGhpcy5mb2N1c09uTmV4dC5lbWl0KGV2ZW50KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5mb2N1c09uUHJldmlvdXMuZW1pdCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIWV2ZW50LnNoaWZ0S2V5KSB7XG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNPbk5leHQuZW1pdChldmVudCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5vcGVuID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdBcnJvd0Rvd24nOlxuICAgICAgY2FzZSAnRG93bic6XG4gICAgICAgIHRoaXMuZm9jdXNEb3duKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnQXJyb3dVcCc6XG4gICAgICBjYXNlICdVcCc6XG4gICAgICAgIHRoaXMuZm9jdXNVcCgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0JhY2tzcGFjZSc6XG4gICAgICBjYXNlICdEZWxldGUnOlxuICAgICAgICBpZiAodGhpcy5rZWVwU2VsZWN0aW9uKSB7XG4gICAgICAgICAgdGhpcy5sYXN0U2VsZWN0ZWRNb2RlbCA9IHRoaXMuYWlycG9ydC5uYW1lO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZXNldEZpbHRlcigpOiB2b2lkIHtcbiAgICB0aGlzLmZvY3VzZWRBaXJwb3J0SW5kZXggPSAtMTtcbiAgICB0aGlzLmZvY3VzZWRMYXRlc3RTZWFyY2hlc0luZGV4ID0gLTE7XG4gICAgdGhpcy5mb2N1c2VkQ2xvc2VzdEFpcnBvcnRJbmRleCA9IC0xO1xuICAgIHRoaXMuZm9jdXNlZEFpcnBvcnRDb2RlID0gJyc7XG4gICAgdGhpcy5mb2N1c2VkTGF0ZXN0U2VhcmNoZXNBaXJwb3J0Q29kZSA9ICcnO1xuICAgIHRoaXMuZm9jdXNlZENsb3Nlc3RBaXJwb3J0Q29kZSA9ICcnO1xuICAgIHRoaXMuZmlsdGVyZWRBaXJwb3J0cyA9IHRoaXMuYWlycG9ydHM7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVNlbGVjdGVkKGFpcnBvcnQ6IEFpcnBvcnRNb2RlbCk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0ZWRNb2RlbCA9IGFpcnBvcnQubmFtZTtcbiAgICBpZiAodGhpcy5rZWVwU2VsZWN0aW9uICYmIGFpcnBvcnQubmFtZS5sZW5ndGgpIHtcbiAgICAgIHRoaXMubGFzdFNlbGVjdGVkTW9kZWwgPSBhaXJwb3J0Lm5hbWU7XG4gICAgfVxuICAgIHRoaXMuc2VsZWN0ZWQuZW1pdChhaXJwb3J0KTtcbiAgfVxuXG4gIHByaXZhdGUgZm9jdXNEb3duTGF0ZXN0U2VhcmNoZXMoKTogdm9pZCB7XG4gICAgdGhpcy5mb2N1c09uR2VvbG9jYXRpb24gPSBmYWxzZTtcblxuICAgIGxldCBpbmRleCA9IHRoaXMuZm9jdXNlZExhdGVzdFNlYXJjaGVzSW5kZXg7XG5cbiAgICBpbmRleCA9IGluZGV4ICsgMTtcblxuICAgIGNvbnN0IGFpcnBvcnQgPSB0aGlzLmxhdGVzdFNlYXJjaGVzW2luZGV4XTtcblxuICAgIHRoaXMuZm9jdXNlZExhdGVzdFNlYXJjaGVzSW5kZXggPSBpbmRleDtcbiAgICB0aGlzLmZvY3VzZWRMYXRlc3RTZWFyY2hlc0FpcnBvcnRDb2RlID0gYWlycG9ydC5jb2RlO1xuICAgIHRoaXMuZm9jdXNlZEFpcnBvcnRDb2RlID0gJyc7XG4gICAgdGhpcy5mb2N1c2VkQ2xvc2VzdEFpcnBvcnRDb2RlID0gJyc7XG4gICAgdGhpcy51cGRhdGVTZWxlY3RlZChhaXJwb3J0KTtcbiAgfVxuXG4gIHByaXZhdGUgZm9jdXNEb3duQ2xvc2VzdEFpcnBvcnRzKCk6IHZvaWQge1xuICAgIGxldCBpbmRleCA9IHRoaXMuZm9jdXNlZENsb3Nlc3RBaXJwb3J0SW5kZXg7XG5cbiAgICBpbmRleCA9IGluZGV4ICsgMTtcblxuICAgIGNvbnN0IGFpcnBvcnQgPSB0aGlzLmNsb3Nlc3RBaXJwb3J0c1tpbmRleF07XG5cbiAgICB0aGlzLmZvY3VzZWRDbG9zZXN0QWlycG9ydEluZGV4ID0gaW5kZXg7XG4gICAgdGhpcy5mb2N1c2VkQ2xvc2VzdEFpcnBvcnRDb2RlID0gYWlycG9ydC5jb2RlIHx8ICcnO1xuICAgIHRoaXMuZm9jdXNlZEFpcnBvcnRDb2RlID0gJyc7XG4gICAgdGhpcy5mb2N1c2VkTGF0ZXN0U2VhcmNoZXNBaXJwb3J0Q29kZSA9ICcnO1xuICAgIHRoaXMudXBkYXRlU2VsZWN0ZWQoYWlycG9ydCk7XG4gIH1cblxuICBwcml2YXRlIGZvY3VzRG93bkFpcnBvcnRzKGhhc0Nsb3Nlc3RBaXJwb3J0czogYm9vbGVhbiwgaGFzTGF0ZXN0U2VhcmNoZXM6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBsZXQgaW5kZXggPSB0aGlzLmZvY3VzZWRBaXJwb3J0SW5kZXg7XG4gICAgdGhpcy5mb2N1c09uR2VvbG9jYXRpb24gPSBmYWxzZTtcblxuICAgIGluZGV4ID0gaW5kZXggKyAxO1xuXG4gICAgaWYgKHRoaXMuZmlsdGVyZWRBaXJwb3J0cyAmJiBpbmRleCA+IHRoaXMuZmlsdGVyZWRBaXJwb3J0cy5sZW5ndGggLSAxKSB7XG4gICAgICB0aGlzLmZvY3VzZWRDbG9zZXN0QWlycG9ydEluZGV4ID0gLTE7XG4gICAgICB0aGlzLmZvY3VzZWRMYXRlc3RTZWFyY2hlc0luZGV4ID0gLTE7XG4gICAgICB0aGlzLmZvY3VzZWRBaXJwb3J0SW5kZXggPSAtMTtcblxuICAgICAgaWYgKHRoaXMuZ2VvbG9jYXRpb25TdGF0ZSAhPT0gR2VvbG9jYXRpb25TdGF0ZS5ncmFudGVkKSB7XG4gICAgICAgIHRoaXMuZm9jdXNPbkdlb2xvY2F0aW9uID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5mb2N1c2VkQWlycG9ydENvZGUgPSAnJztcbiAgICAgICAgdGhpcy5mb2N1c2VkQ2xvc2VzdEFpcnBvcnRDb2RlID0gJyc7XG4gICAgICAgIHRoaXMuZm9jdXNlZExhdGVzdFNlYXJjaGVzQWlycG9ydENvZGUgPSAnJztcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBlbHNlIGlmIChoYXNMYXRlc3RTZWFyY2hlcykge1xuICAgICAgICB0aGlzLmZvY3VzRG93bkxhdGVzdFNlYXJjaGVzKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gZWxzZSBpZiAoaGFzQ2xvc2VzdEFpcnBvcnRzKSB7XG4gICAgICAgIHRoaXMuZm9jdXNEb3duQ2xvc2VzdEFpcnBvcnRzKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmZvY3VzZWRBaXJwb3J0SW5kZXggPSBpbmRleDtcblxuICAgIGlmICh0aGlzLmZpbHRlcmVkQWlycG9ydHMpIHtcbiAgICAgIGNvbnN0IGFpcnBvcnQgPSB0aGlzLmZpbHRlcmVkQWlycG9ydHNbaW5kZXhdO1xuXG4gICAgICBpZiAoYWlycG9ydCkge1xuICAgICAgICB0aGlzLmZvY3VzZWRBaXJwb3J0Q29kZSA9IGFpcnBvcnQuY29kZTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZE1vZGVsID0gYWlycG9ydC5uYW1lO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuZm9jdXNlZExhdGVzdFNlYXJjaGVzQWlycG9ydENvZGUgPSAnJztcbiAgICB0aGlzLmZvY3VzZWRDbG9zZXN0QWlycG9ydENvZGUgPSAnJztcbiAgfVxuXG4gIHByaXZhdGUgZm9jdXNVcEFpcnBvcnRzKGhhc0Nsb3Nlc3RBaXJwb3J0czogYm9vbGVhbiwgaGFzTGF0ZXN0U2VhcmNoZXM6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBsZXQgaW5kZXggPSB0aGlzLmZvY3VzZWRBaXJwb3J0SW5kZXg7XG4gICAgdGhpcy5mb2N1c09uR2VvbG9jYXRpb24gPSBmYWxzZTtcblxuICAgIGlmIChpbmRleCAtIDEgPCAwKSB7XG4gICAgICB0aGlzLmZvY3VzZWRBaXJwb3J0SW5kZXggPSAtMTtcbiAgICAgIHRoaXMuZm9jdXNlZEFpcnBvcnRDb2RlID0gJyc7XG4gICAgICB0aGlzLmJsdXIoKTtcblxuICAgICAgaWYgKCFoYXNDbG9zZXN0QWlycG9ydHMpIHtcbiAgICAgICAgdGhpcy5mb2N1c2VkQ2xvc2VzdEFpcnBvcnRDb2RlID0gJyc7XG4gICAgICB9XG4gICAgICBpZiAoIWhhc0xhdGVzdFNlYXJjaGVzKSB7XG4gICAgICAgIHRoaXMuZm9jdXNlZENsb3Nlc3RBaXJwb3J0Q29kZSA9ICcnO1xuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaW5kZXggPSBpbmRleCAtIDE7XG5cbiAgICB0aGlzLmZvY3VzZWRBaXJwb3J0SW5kZXggPSBpbmRleDtcbiAgICB0aGlzLmZvY3VzZWRMYXRlc3RTZWFyY2hlc0FpcnBvcnRDb2RlID0gJyc7XG4gICAgdGhpcy5mb2N1c2VkQ2xvc2VzdEFpcnBvcnRDb2RlID0gJyc7XG5cbiAgICBpZiAodGhpcy5maWx0ZXJlZEFpcnBvcnRzKSB7XG4gICAgICBjb25zdCBhaXJwb3J0ID0gdGhpcy5maWx0ZXJlZEFpcnBvcnRzW2luZGV4XTtcblxuICAgICAgaWYgKGFpcnBvcnQpIHtcbiAgICAgICAgdGhpcy5mb2N1c2VkQWlycG9ydENvZGUgPSBhaXJwb3J0LmNvZGU7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRNb2RlbCA9IGFpcnBvcnQubmFtZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGF1dG9TY3JvbGwoZXh0cmFPZmZzZXQ6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICghdGhpcy5yZXN1bHRzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdHMgPSB0aGlzLnJlc3VsdHMubmF0aXZlRWxlbWVudDtcbiAgICBjb25zdCBmb2N1c2VkSXRlbSA9IHRoaXMuZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLm5hcy1haXJwb3J0LXNlbGVjdF9fbGlzdC1pdGVtLS1mb2N1cycpO1xuXG4gICAgaWYgKGZvY3VzZWRJdGVtKSB7XG4gICAgICByZXN1bHRzLnNjcm9sbFRvKDAsIDApO1xuICAgICAgcmVzdWx0cy5zY3JvbGxUbygwLCBmb2N1c2VkSXRlbS5vZmZzZXRUb3AgKyBleHRyYU9mZnNldCAtIHJlc3VsdHMuY2xpZW50SGVpZ2h0KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGZvY3VzVXBMYXRlc3RTZWFyY2hlcygpOiB2b2lkIHtcbiAgICB0aGlzLmZvY3VzT25HZW9sb2NhdGlvbiA9IGZhbHNlO1xuXG4gICAgbGV0IGxhdGVzdFNlYXJjaGVzSW5kZXggPSB0aGlzLmZvY3VzZWRMYXRlc3RTZWFyY2hlc0luZGV4O1xuXG4gICAgaWYgKGxhdGVzdFNlYXJjaGVzSW5kZXggPCAwKSB7XG4gICAgICB0aGlzLmZvY3VzZWRMYXRlc3RTZWFyY2hlc0luZGV4ID0gLTE7XG4gICAgICB0aGlzLmZvY3VzZWRMYXRlc3RTZWFyY2hlc0FpcnBvcnRDb2RlID0gJyc7XG4gICAgICB0aGlzLmJsdXIoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjbG9zZXN0QWlycG9ydEluZGV4ID0gdGhpcy5mb2N1c2VkQ2xvc2VzdEFpcnBvcnRJbmRleDtcbiAgICBjb25zdCBhaXJwb3J0c0luZGV4ID0gdGhpcy5mb2N1c2VkQWlycG9ydEluZGV4O1xuXG4gICAgaWYgKGNsb3Nlc3RBaXJwb3J0SW5kZXggPCAwICYmIGFpcnBvcnRzSW5kZXggPCAwKSB7XG4gICAgICBsYXRlc3RTZWFyY2hlc0luZGV4ID0gbGF0ZXN0U2VhcmNoZXNJbmRleCAtIDE7XG5cbiAgICAgIGlmIChsYXRlc3RTZWFyY2hlc0luZGV4IDwgMCkge1xuICAgICAgICB0aGlzLmZvY3VzZWRMYXRlc3RTZWFyY2hlc0luZGV4ID0gLTE7XG4gICAgICAgIHRoaXMuZm9jdXNlZExhdGVzdFNlYXJjaGVzQWlycG9ydENvZGUgPSAnJztcbiAgICAgICAgdGhpcy5ibHVyKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBhaXJwb3J0ID0gdGhpcy5sYXRlc3RTZWFyY2hlc1tsYXRlc3RTZWFyY2hlc0luZGV4XTtcblxuICAgIHRoaXMuZm9jdXNlZExhdGVzdFNlYXJjaGVzSW5kZXggPSBsYXRlc3RTZWFyY2hlc0luZGV4O1xuICAgIHRoaXMuZm9jdXNlZExhdGVzdFNlYXJjaGVzQWlycG9ydENvZGUgPSBhaXJwb3J0LmNvZGU7XG4gICAgdGhpcy5mb2N1c2VkQ2xvc2VzdEFpcnBvcnRDb2RlID0gJyc7XG4gICAgdGhpcy5mb2N1c2VkQ2xvc2VzdEFpcnBvcnRJbmRleCA9IC0xO1xuICAgIHRoaXMuZm9jdXNlZEFpcnBvcnRDb2RlID0gJyc7XG4gICAgdGhpcy5mb2N1c2VkQWlycG9ydEluZGV4ID0gLTE7XG4gICAgdGhpcy51cGRhdGVTZWxlY3RlZChhaXJwb3J0KTtcbiAgfVxuXG4gIHByaXZhdGUgZm9jdXNVcENsb3Nlc3RBaXJwb3J0cyhoYXNMYXRlc3RTZWFyY2hlczogYm9vbGVhbik6IHZvaWQge1xuICAgIGxldCBjbG9zZXN0QWlycG9ydEluZGV4ID0gdGhpcy5mb2N1c2VkQ2xvc2VzdEFpcnBvcnRJbmRleDtcblxuICAgIGlmICghaGFzTGF0ZXN0U2VhcmNoZXMgJiYgY2xvc2VzdEFpcnBvcnRJbmRleCA8PSAwKSB7XG4gICAgICB0aGlzLmZvY3VzZWRDbG9zZXN0QWlycG9ydEluZGV4ID0gLTE7XG4gICAgICB0aGlzLmJsdXIoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoY2xvc2VzdEFpcnBvcnRJbmRleCAtIDEgPCAwKSB7XG4gICAgICB0aGlzLmZvY3VzZWRDbG9zZXN0QWlycG9ydEluZGV4ID0gLTE7XG4gICAgICB0aGlzLmZvY3VzZWRDbG9zZXN0QWlycG9ydENvZGUgPSAnJztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5mb2N1c2VkQWlycG9ydEluZGV4IDwgMCkge1xuICAgICAgY2xvc2VzdEFpcnBvcnRJbmRleCA9IGNsb3Nlc3RBaXJwb3J0SW5kZXggLSAxO1xuICAgIH1cblxuICAgIGNvbnN0IGFpcnBvcnQgPSB0aGlzLmNsb3Nlc3RBaXJwb3J0c1tjbG9zZXN0QWlycG9ydEluZGV4XTtcbiAgICB0aGlzLmZvY3VzZWRDbG9zZXN0QWlycG9ydEluZGV4ID0gY2xvc2VzdEFpcnBvcnRJbmRleDtcbiAgICB0aGlzLmZvY3VzZWRDbG9zZXN0QWlycG9ydENvZGUgPSBhaXJwb3J0LmNvZGU7XG4gICAgdGhpcy5mb2N1c2VkQWlycG9ydENvZGUgPSAnJztcbiAgICB0aGlzLmZvY3VzZWRBaXJwb3J0SW5kZXggPSAtMTtcblxuICAgIHRoaXMudXBkYXRlU2VsZWN0ZWQoYWlycG9ydCk7XG4gIH1cbn1cbiIsIjxuZy1jb250YWluZXIgKm5nSWY9XCIhbmFzRm9ybUNvbnRyb2xOYW1lOyBlbHNlIHJlYWN0aXZlRm9ybVwiPlxuICA8bGFiZWwgW2lkXT1cImxhYmVsSWRcIlxuICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiYWlycG9ydFNlbGVjdExhYmVsXCJcbiAgICBbbmFzQ2xhc3NdPVwiZ2V0Q2xhc3MoJ3dyYXBwZXInLCBbb3BlbiAmJiAnYWN0aXZlJywgc2VsZWN0ZWRNb2RlbCAmJiAnZmlsbGVkJ10pXCI+XG4gICAgPHNwYW4gW25hc0NsYXNzXT1cImdldENsYXNzKCdsYWJlbCcpXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYWlycG9ydFNlbGVjdExhYmVsOyBlbHNlIGVtcHR5TGFiZWxcIj57e2FpcnBvcnRTZWxlY3RMYWJlbH19PC9uZy1jb250YWluZXI+XG4gICAgICA8bmctdGVtcGxhdGUgI2VtcHR5TGFiZWw+Jm5ic3A7PC9uZy10ZW1wbGF0ZT5cbiAgICA8L3NwYW4+XG4gICAgPGlucHV0ICNhaXJwb3J0U2VsZWN0XG4gICAgICB0eXBlPVwidGV4dFwiXG4gICAgICByb2xlPVwiY29tYm9ib3hcIlxuICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCJcbiAgICAgIGFyaWEtaGFzcG9wdXA9XCJsaXN0Ym94XCJcbiAgICAgIGFyaWEtYXV0b2NvbXBsZXRlPVwibm9uZVwiXG4gICAgICBbaWRdPVwiaW5wdXRJZCArICdfX29yaWdpbidcIlxuICAgICAgW2F0dHIuYXJpYS1jb250cm9sc109XCJyZXN1bHRzSWRcIlxuICAgICAgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJvcGVuID8gJ3RydWUnIDogJ2ZhbHNlJ1wiXG4gICAgICBbYXR0ci5hcmlhLW93bnNdPVwicmVzdWx0c0lkXCJcbiAgICAgIFtuYXNDbGFzc109XCJnZXRDbGFzcygnaW5wdXQnKVwiXG4gICAgICBbcGxhY2Vob2xkZXJdPVwiYWlycG9ydFNlbGVjdFBsYWNlaG9sZGVyXCJcbiAgICAgIChmb2N1cyk9XCJzZXRPcGVuKClcIlxuICAgICAgKG1vdXNlZG93bik9XCJzZXRPcGVuKClcIlxuICAgICAgKGlucHV0KT1cImZpbHRlcigpXCJcbiAgICAgIChrZXlkb3duKT1cIm9uS2V5RG93bigkZXZlbnQpXCJcbiAgICAgIFsobmdNb2RlbCldPVwic2VsZWN0ZWRNb2RlbFwiLz5cbiAgICA8c3BhbiBbbmFzQ2xhc3NdPVwiZ2V0Q2xhc3MoJ2ljb24nKVwiPlxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgcm9sZT1cImJ1dHRvblwiXG4gICAgICAgIHRhYmluZGV4PVwiLTFcIlxuICAgICAgICAqbmdJZj1cInNlbGVjdGVkTW9kZWw7IGVsc2UgaXNFbXB0eVwiXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiYXJpYUxhYmVsQ2xlYXJcIlxuICAgICAgICAoY2xpY2spPVwiY2xlYXJTZWxlY3RlZCgkZXZlbnQpXCI+XG4gICAgICAgIDxuYXMtaWNvbiBbdHlwZV09XCJzZWxlY3RlZE1vZGVsID8gJ3JlbW92ZS0tc2Vjb25kYXJ5JyA6ICdyZW1vdmUnXCI+PC9uYXMtaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPG5nLXRlbXBsYXRlICNpc0VtcHR5PlxuICAgICAgICA8bmFzLWljb24gW3R5cGVdPVwiJ3NtYWxsJ1wiXG4gICAgICAgICAgW2ljb25dPVwiYWlycG9ydFNlbGVjdEljb25Nb2RpZmllclwiPjwvbmFzLWljb24+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuICAgIDwvc3Bhbj5cbiAgPC9sYWJlbD5cbjwvbmctY29udGFpbmVyPlxuPG5nLXRlbXBsYXRlICNyZWFjdGl2ZUZvcm0+XG4gIDxsYWJlbCBbaWRdPVwibGFiZWxJZFwiXG4gICAgW2F0dHIuYXJpYS1sYWJlbF09XCJhaXJwb3J0U2VsZWN0TGFiZWxcIlxuICAgIFtuYXNDbGFzc109XCJnZXRDbGFzcygnd3JhcHBlcicsIFtvcGVuICYmICdhY3RpdmUnLCBzZWxlY3RlZE1vZGVsICYmICdmaWxsZWQnXSlcIlxuICAgIFtmb3JtR3JvdXBdPVwibmFzRm9ybUdyb3VwXCI+XG4gICAgPHNwYW4gW25hc0NsYXNzXT1cImdldENsYXNzKCdsYWJlbCcpXCJcbiAgICAgICpuZ0lmPVwiYWlycG9ydFNlbGVjdExhYmVsXCI+e3thaXJwb3J0U2VsZWN0TGFiZWx9fTwvc3Bhbj5cbiAgICA8aW5wdXQgI2FpcnBvcnRTZWxlY3RcbiAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgIHJvbGU9XCJjb21ib2JveFwiXG4gICAgICBhdXRvY29tcGxldGU9XCJvZmZcIlxuICAgICAgYXJpYS1hdXRvY29tcGxldGU9XCJub25lXCJcbiAgICAgIFtpZF09XCJpbnB1dElkICsgJ19fZGVzdGluYXRpb24nXCJcbiAgICAgIFthdHRyLmFyaWEtY29udHJvbHNdPVwicmVzdWx0c0lkXCJcbiAgICAgIFthdHRyLmFyaWEtZXhwYW5kZWRdPVwib3BlbiA/ICd0cnVlJyA6ICdmYWxzZSdcIlxuICAgICAgW2F0dHIuYXJpYS1vd25zXT1cInJlc3VsdHNJZFwiXG4gICAgICBbbmFzQ2xhc3NdPVwiZ2V0Q2xhc3MoJ2lucHV0JylcIlxuICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJuYXNGb3JtQ29udHJvbE5hbWVcIlxuICAgICAgW3BsYWNlaG9sZGVyXT1cImFpcnBvcnRTZWxlY3RQbGFjZWhvbGRlclwiXG4gICAgICAobW91c2Vkb3duKT1cInNldE9wZW4oKVwiXG4gICAgICAoZm9jdXMpPVwic2V0T3BlbigpXCJcbiAgICAgIChpbnB1dCk9XCJmaWx0ZXIoKVwiXG4gICAgICAoa2V5ZG93bik9XCJvbktleURvd24oJGV2ZW50KVwiIC8+XG4gICAgPHNwYW4gW25hc0NsYXNzXT1cImdldENsYXNzKCdpY29uJylcIj5cbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIHJvbGU9XCJidXR0b25cIlxuICAgICAgICB0YWJpbmRleD1cIi0xXCJcbiAgICAgICAgKm5nSWY9XCJzZWxlY3RlZE1vZGVsOyBlbHNlIGlzRW1wdHlcIlxuICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImFyaWFMYWJlbENsZWFyXCJcbiAgICAgICAgKGNsaWNrKT1cImNsZWFyU2VsZWN0ZWQoJGV2ZW50KVwiPlxuICAgICAgICA8bmFzLWljb24gW3R5cGVdPVwic2VsZWN0ZWRNb2RlbCA/ICdyZW1vdmUtLXNlY29uZGFyeScgOiAncmVtb3ZlJ1wiPjwvbmFzLWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxuZy10ZW1wbGF0ZSAjaXNFbXB0eT5cbiAgICAgICAgPG5hcy1pY29uIFt0eXBlXT1cIidzbWFsbCdcIlxuICAgICAgICAgIFtpY29uXT1cImFpcnBvcnRTZWxlY3RJY29uTW9kaWZpZXJcIj48L25hcy1pY29uPlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L3NwYW4+XG4gIDwvbGFiZWw+XG48L25nLXRlbXBsYXRlPlxuPGRpdiBbbmFzQ2xhc3NdPVwiZ2V0Q2xhc3MoJ3Jlc3VsdHMtd3JhcHBlcicpXCJcbiAgW2lkXT1cInJlc3VsdHNJZFwiXG4gIFthdHRyLmFyaWEtZXhwYW5kZWRdPVwib3BlbiA/ICd0cnVlJyA6ICdmYWxzZSdcIj5cbiAgPHVsICNyZXN1bHRzXG4gICAgcm9sZT1cImxpc3Rib3hcIlxuICAgICpuZ0lmPVwib3BlblwiXG4gICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cImxhYmVsSWRcIlxuICAgIFtuYXNDbGFzc109XCJnZXRDbGFzcygncmVzdWx0cycpXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImV4aXN0cyhlbmFibGVHZW9sb2NhdGlvbikgJiYgZ2VvbG9jYXRpb25TdGF0ZSAhPT0gbnVsbCAmJiBnZW9sb2NhdGlvblN0YXRlICE9PSAwICYmIGlzVmFsaWRcIj5cbiAgICAgIDxsaSByb2xlPVwib3B0aW9uXCI+XG4gICAgICAgIDxuYXMtYnV0dG9uIGxpbmtcbiAgICAgICAgICBzZWNvbmRhcnlcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiZ2VvbG9jYXRpb25TdGF0ZSA9PT0gMlwiXG4gICAgICAgICAgW2Nzc1N0eWxlXT1cInsnaGVpZ2h0JzogJzY2cHgnLCAndGV4dC1kZWNvcmF0aW9uJzogJ3VuZGVybGluZScsICdkaXNwbGF5JzogJ2ZsZXgnLCAnanVzdGlmeS1jb250ZW50JzogJ3NwYWNlLWJldHdlZW4nfVwiXG4gICAgICAgICAgW2Nzc0NsYXNzXT1cImdldENsYXNzKCdpdGVtJywgWydnZW9sb2NhdGlvbicsIGZvY3VzT25HZW9sb2NhdGlvbiAmJiBnZW9sb2NhdGlvblN0YXRlICE9PSAyICYmICdmb2N1cycsIGdlb2xvY2F0aW9uU3RhdGUgPT09IDIgJiYgJ2Rpc2FibGVkJ10pXCJcbiAgICAgICAgICBbdGFiaW5kZXhdPVwiLTFcIlxuICAgICAgICAgIChjbGlja0NoYW5nZSk9XCJ1cGRhdGVDdXJyZW50UG9zaXRpb24oKVwiXG4gICAgICAgICAgKG1vdXNlZW50ZXIpPVwib25HZW9sb2NhdGlvbkhvdmVyKHRydWUpXCJcbiAgICAgICAgICAobW91c2VsZWF2ZSk9XCJvbkdlb2xvY2F0aW9uSG92ZXIoZmFsc2UpXCI+XG4gICAgICAgICAgPHNwYW4gKm5nSWY9XCJnZW9sb2NhdGlvblN0YXRlID09PSAxOyBlbHNlIGdlb2xvY2F0aW9uRGVuaWVkXCJcbiAgICAgICAgICAgIFtuYXNDbGFzc109XCJnZXRDbGFzcygnZ2VvbG9jYXRpb24nLCAnbGFiZWwnKVwiPnt7cmVzdWx0c0xhYmVscz8uZ2VvbG9jYXRpb259fTwvc3Bhbj5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgI2dlb2xvY2F0aW9uRGVuaWVkPlxuICAgICAgICAgICAgPHNwYW4gW25hc0NsYXNzXT1cImdldENsYXNzKCdnZW9sb2NhdGlvbicsICdsYWJlbCcpXCI+e3tyZXN1bHRzTGFiZWxzPy5nZW9sb2NhdGlvbkRlbmllZH19PC9zcGFuPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPG5hcy1pY29uIFtuYXNDbGFzc109XCJnZXRDbGFzcygnZ2VvbG9jYXRpb24nLCAnaWNvbicpXCJcbiAgICAgICAgICAgIFt0eXBlXT1cImdlb2xvY2F0aW9uSWNvblwiPjwvbmFzLWljb24+XG4gICAgICAgIDwvbmFzLWJ1dHRvbj5cbiAgICAgIDwvbGk+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPGxpIHJvbGU9XCJzZXBhcmF0b3JcIlxuICAgICAgW25hc0NsYXNzXT1cImdldENsYXNzKCdsaXN0LXNlY3Rpb24tbGFiZWwnKVwiXG4gICAgICAqbmdJZj1cImxhdGVzdFNlYXJjaGVzPy5sZW5ndGggPiAwXG4gICAgICAmJiBleGlzdHMoZGlzcGxheUxhdGVzdFNlYXJjaGVzKVxuICAgICAgJiYgcmVzdWx0c0xhYmVscz8ubGF0ZXN0U2VhcmNoZXNcbiAgICAgICYmIGlzVmFsaWRcIj5cbiAgICAgIDxzcGFuPnt7cmVzdWx0c0xhYmVscz8ubGF0ZXN0U2VhcmNoZXN9fTwvc3Bhbj5cbiAgICA8L2xpPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJleGlzdHMoZGlzcGxheUxhdGVzdFNlYXJjaGVzKSAmJiBpc1ZhbGlkXCI+XG4gICAgICA8bGkgcm9sZT1cIm9wdGlvblwiXG4gICAgICAgICpuZ0Zvcj1cImxldCBhaXJwb3J0IG9mIGxhdGVzdFNlYXJjaGVzXCJcbiAgICAgICAgW2lkXT1cImdldExhdGVzdFNlYXJjaGVzQWlycG9ydElkKGFpcnBvcnQuY29kZSlcIlxuICAgICAgICBbYXR0ci5hcmlhLXNlbGVjdGVkXT1cImFpcnBvcnQuY29kZSA9PT0gZm9jdXNlZExhdGVzdFNlYXJjaGVzQWlycG9ydENvZGVcIlxuICAgICAgICBbbmFzQ2xhc3NdPVwiZ2V0Q2xhc3MoJ2xpc3QtaXRlbScsIGFpcnBvcnQuY29kZSA9PT0gZm9jdXNlZExhdGVzdFNlYXJjaGVzQWlycG9ydENvZGUgJiYgJ2ZvY3VzJylcIj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBbbmFzQ2xhc3NdPVwiZ2V0Q2xhc3MoJ2l0ZW0nLCBhaXJwb3J0LmNvZGUgPT09IGZvY3VzZWRMYXRlc3RTZWFyY2hlc0FpcnBvcnRDb2RlICYmICdmb2N1cycpXCJcbiAgICAgICAgICAoY2xpY2spPVwic2V0U2VsZWN0ZWQoYWlycG9ydClcIlxuICAgICAgICAgIHRhYmluZGV4PVwiLTFcIj5cbiAgICAgICAgICA8c3BhbiBbbmFzQ2xhc3NdPVwiZ2V0Q2xhc3MoJ25hbWUnKVwiPnt7YWlycG9ydC5uYW1lfX08L3NwYW4+XG4gICAgICAgICAgPHNwYW4gW25hc0NsYXNzXT1cImdldENsYXNzKCdjb2RlJylcIj48L3NwYW4+XG4gICAgICAgICAgPHNwYW4gW25hc0NsYXNzXT1cImdldENsYXNzKCdjb3VudHJ5JylcIj57e2FpcnBvcnQuY291bnRyeU5hbWV9fTwvc3Bhbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2xpPlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxsaSByb2xlPVwic2VwYXJhdG9yXCJcbiAgICAgICpuZ0lmPVwiZXhpc3RzKGRpc3BsYXlDbG9zZXN0QWlycG9ydHMpXG4gICAgICAgJiYgZ2VvbG9jYXRpb25TdGF0ZSAhPT0gbnVsbFxuICAgICAgICYmIGdlb2xvY2F0aW9uU3RhdGUgPT09IDBcbiAgICAgICAmJiBjbG9zZXN0QWlycG9ydHM/Lmxlbmd0aCA+IDBcbiAgICAgICAmJiByZXN1bHRzTGFiZWxzPy5jbG9zZXN0QWlycG9ydHNcbiAgICAgICAmJiBpc1ZhbGlkXCJcbiAgICAgIFtuYXNDbGFzc109XCJnZXRDbGFzcygnbGlzdC1zZWN0aW9uLWxhYmVsJylcIj5cbiAgICAgIDxzcGFuPnt7cmVzdWx0c0xhYmVscz8uY2xvc2VzdEFpcnBvcnRzfX08L3NwYW4+XG4gICAgPC9saT5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZXhpc3RzKGRpc3BsYXlDbG9zZXN0QWlycG9ydHMpICYmIGdlb2xvY2F0aW9uU3RhdGUgPT09IDAgJiYgaXNWYWxpZFwiPlxuICAgICAgPGxpIHJvbGU9XCJvcHRpb25cIlxuICAgICAgICAqbmdGb3I9XCJsZXQgYWlycG9ydCBvZiBjbG9zZXN0QWlycG9ydHNcIlxuICAgICAgICBbaWRdPVwiZ2V0Q2xvc2VzdEFpcnBvcnRzQWlycG9ydElkKGFpcnBvcnQuY29kZSlcIlxuICAgICAgICBbYXR0ci5hcmlhLXNlbGVjdGVkXT1cImFpcnBvcnQuY29kZSA9PT0gZm9jdXNlZENsb3Nlc3RBaXJwb3J0Q29kZVwiXG4gICAgICAgIFtuYXNDbGFzc109XCJnZXRDbGFzcygnbGlzdC1pdGVtJywgYWlycG9ydC5jb2RlID09PSBmb2N1c2VkQ2xvc2VzdEFpcnBvcnRDb2RlICYmICdmb2N1cycpXCI+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgW25hc0NsYXNzXT1cImdldENsYXNzKCdpdGVtJywgYWlycG9ydC5jb2RlID09PSBmb2N1c2VkQ2xvc2VzdEFpcnBvcnRDb2RlICYmICdmb2N1cycpXCJcbiAgICAgICAgICAoY2xpY2spPVwic2V0U2VsZWN0ZWQoYWlycG9ydClcIlxuICAgICAgICAgIHRhYmluZGV4PVwiLTFcIj5cbiAgICAgICAgICA8c3BhbiBbbmFzQ2xhc3NdPVwiZ2V0Q2xhc3MoJ25hbWUnKVwiPnt7YWlycG9ydC5uYW1lfX08L3NwYW4+XG4gICAgICAgICAgPHNwYW4gW25hc0NsYXNzXT1cImdldENsYXNzKCdjb2RlJylcIj48L3NwYW4+XG4gICAgICAgICAgPHNwYW4gW25hc0NsYXNzXT1cImdldENsYXNzKCdjb3VudHJ5JylcIj57e2FpcnBvcnQuY291bnRyeU5hbWV9fTwvc3Bhbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2xpPlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxsaSByb2xlPVwic2VwYXJhdG9yXCJcbiAgICAgIFtuYXNDbGFzc109XCJnZXRDbGFzcygnbGlzdC1zZWN0aW9uLWxhYmVsJylcIlxuICAgICAgKm5nSWY9XCJkaXNwbGF5QWxsQWlycG9ydHNMYWJlbCAmJiByZXN1bHRzTGFiZWxzPy5hbGxBaXJwb3J0cyAmJiBpc1ZhbGlkXCI+XG4gICAgICA8c3Bhbj57e3Jlc3VsdHNMYWJlbHM/LmFsbEFpcnBvcnRzfX08L3NwYW4+XG4gICAgPC9saT5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNWYWxpZFwiPlxuICAgICAgPGxpIHJvbGU9XCJvcHRpb25cIlxuICAgICAgICAqbmdGb3I9XCJsZXQgYWlycG9ydCBvZiBmaWx0ZXJlZEFpcnBvcnRzXCJcbiAgICAgICAgW2lkXT1cImdldEFsbEFpcnBvcnRzQWlycG9ydElkKGFpcnBvcnQuY29kZSlcIlxuICAgICAgICBbYXR0ci5hcmlhLXNlbGVjdGVkXT1cImFpcnBvcnQuY29kZSA9PT0gZm9jdXNlZEFpcnBvcnRDb2RlXCJcbiAgICAgICAgW25hc0NsYXNzXT1cImdldENsYXNzKCdsaXN0LWl0ZW0nLCBhaXJwb3J0LmNvZGUgPT09IGZvY3VzZWRBaXJwb3J0Q29kZSAmJiAnZm9jdXMnKVwiPlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIFtuYXNDbGFzc109XCJnZXRDbGFzcygnaXRlbScsIGFpcnBvcnQuY29kZSA9PT0gZm9jdXNlZEFpcnBvcnRDb2RlICYmICdmb2N1cycpXCJcbiAgICAgICAgICAoY2xpY2spPVwic2V0U2VsZWN0ZWQoYWlycG9ydClcIlxuICAgICAgICAgIHRhYmluZGV4PVwiLTFcIj5cbiAgICAgICAgICA8c3BhbiBbbmFzQ2xhc3NdPVwiZ2V0Q2xhc3MoJ25hbWUnKVwiPnt7YWlycG9ydC5uYW1lfX08L3NwYW4+XG4gICAgICAgICAgPHNwYW4gW25hc0NsYXNzXT1cImdldENsYXNzKCdjb2RlJylcIj48L3NwYW4+XG4gICAgICAgICAgPHNwYW4gW25hc0NsYXNzXT1cImdldENsYXNzKCdjb3VudHJ5JylcIj57e2FpcnBvcnQuY291bnRyeU5hbWV9fTwvc3Bhbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2xpPlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxsaSAqbmdJZj1cIiFpc1ZhbGlkXCJcbiAgICAgIHJvbGU9XCJsaXN0aXRlbVwiPlxuICAgICAgPHNwYW4gW25hc0NsYXNzXT1cImdldENsYXNzKCduYW1lJywgJ2ludmFsaWQnKVwiPnt7aW52YWxpZFRleHR9fTwvc3Bhbj5cbiAgICA8L2xpPlxuICA8L3VsPlxuPC9kaXY+XG48YnV0dG9uIHR5cGU9XCJidXR0b25cIlxuICB0YWJpbmRleD1cIjBcIlxuICAqbmdJZj1cIm9wZW5cIlxuICBbYXR0ci5hcmlhLWxhYmVsXT1cImFyaWFMYWJlbEJhY2tkcm9wXCJcbiAgW25hc0NsYXNzXT1cImdldENsYXNzKCdiYWNrZHJvcCcpXCJcbiAgKGNsaWNrKT1cImJsdXIoKVwiPjwvYnV0dG9uPiJdfQ==
|
|
613
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWlycG9ydC1zZWxlY3QtZHJvcGRvd24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29yZS1jb21wb25lbnRzL3NyYy9saWIvY29tcG9uZW50cy9haXJwb3J0LXNlbGVjdC9haXJwb3J0LXNlbGVjdC1kcm9wZG93bi9haXJwb3J0LXNlbGVjdC1kcm9wZG93bi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb3JlLWNvbXBvbmVudHMvc3JjL2xpYi9jb21wb25lbnRzL2FpcnBvcnQtc2VsZWN0L2FpcnBvcnQtc2VsZWN0LWRyb3Bkb3duL2FpcnBvcnQtc2VsZWN0LWRyb3Bkb3duLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQUNILE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBQ0wsU0FBUyxFQUVULFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUdMLE1BQU0sRUFDTixTQUFTLEVBQ1QsaUJBQWlCLEVBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBTXpFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJEQUEyRCxDQUFDOzs7Ozs7Ozs7O0FBRTdGLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQztBQVFmLE1BQU0sT0FBTyw4QkFBK0IsU0FBUSxnQkFBZ0I7SUFvQ2xFLElBQ0ksZUFBZTtRQUNqQixPQUFPLElBQUksQ0FBQyxvQkFBb0IsQ0FBQztJQUNuQyxDQUFDO0lBQ0QsSUFBSSxlQUFlLENBQUMsUUFBNkI7UUFDL0MsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUU7WUFDakMsT0FBTztTQUNSO1FBRUQsSUFBSSxDQUFDLG9CQUFvQixHQUFH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c2VcbiAqIENvcHlyaWdodCBOb3J3ZWdpYW4gQWlyIFNodXR0bGUuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKi9cbmltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbmplY3QsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdFbmNhcHN1bGF0aW9uXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTmFzQ29tcG9uZW50QmFzZSB9IGZyb20gJy4uLy4uLy4uL2NvcmUvYmFzZS9uYXMtY29tcG9uZW50LmJhc2UnO1xuaW1wb3J0IHsgR2VvbG9jYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9zZXJ2aWNlcy9nZW9sb2NhdGlvbi9nZW9sb2NhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IEFpcnBvcnRNb2RlbCB9IGZyb20gJy4uL21vZGVscy9haXJwb3J0Lm1vZGVsJztcbmltcG9ydCB7IFJlc3VsdHNMYWJlbHNNb2RlbCB9IGZyb20gJy4uL21vZGVscy9yZXN1bHRzLWxhYmVscy5tb2RlbCc7XG5pbXBvcnQgeyBBaXJwb3J0U2VsZWN0RHJvcGRvd25TZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvYWlycG9ydC1zZWxlY3QtZHJvcGRvd24uc2VydmljZSc7XG5pbXBvcnQgeyBBaXJwb3J0U2VsZWN0U2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2FpcnBvcnQtc2VsZWN0LnNlcnZpY2UnO1xuaW1wb3J0IHsgR2VvbG9jYXRpb25TdGF0ZSB9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZXMvZ2VvbG9jYXRpb24vZ2VvbG9jYXRpb24tc3RhdGUuZW51bSc7XG5cbmxldCBuZXh0SWQgPSAwO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICduYXMtYWlycG9ydC1zZWxlY3QtZHJvcGRvd24nLFxuICB0ZW1wbGF0ZVVybDogJy4vYWlycG9ydC1zZWxlY3QtZHJvcGRvd24uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9haXJwb3J0LXNlbGVjdC1kcm9wZG93bi5jb21wb25lbnQuc2NzcyddLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lXG59KVxuZXhwb3J0IGNsYXNzIEFpcnBvcnRTZWxlY3REcm9wZG93bkNvbXBvbmVudCBleHRlbmRzIE5hc0NvbXBvbmVudEJhc2UgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gIGFpcnBvcnRWYWx1ZTogQWlycG9ydE1vZGVsO1xuICBhaXJwb3J0c1ZhbHVlOiBBcnJheTxBaXJwb3J0TW9kZWw+O1xuICBmb2N1c2VkQWlycG9ydEluZGV4ID0gLTE7XG4gIGZvY3VzZWRMYXRlc3RTZWFyY2hlc0luZGV4ID0gLTE7XG4gIGZvY3VzZWRDbG9zZXN0QWlycG9ydEluZGV4ID0gLTE7XG4gIGZvY3VzZWRDbG9zZXN0QWlycG9ydENvZGU6IHN0cmluZztcbiAgZm9jdXNlZEFpcnBvcnRDb2RlOiBzdHJpbmc7XG4gIGZvY3VzZWRMYXRlc3RTZWFyY2hlc0FpcnBvcnRDb2RlOiBzdHJpbmc7XG4gIGZpbHRlcmVkQWlycG9ydHM6IEFycmF5PEFpcnBvcnRNb2RlbD4gPSB0aGlzLmFpcnBvcnRzO1xuICBkaXNwbGF5QWxsQWlycG9ydHNMYWJlbCA9IHRydWU7XG4gIG9wZW5WYWx1ZTogYm9vbGVhbjtcbiAgZm9jdXNPbkdlb2xvY2F0aW9uOiBib29sZWFuO1xuICBnZW9sb2NhdGlvblN0YXRlOiBHZW9sb2NhdGlvblN0YXRlID0gbnVsbDtcblxuICBAVmlld0NoaWxkKCdhaXJwb3J0U2VsZWN0JykgaW5wdXQ6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ3Jlc3VsdHMnKSByZXN1bHRzOiBFbGVtZW50UmVmO1xuXG4gIEBJbnB1dCgpIGlkOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGRpc3BsYXlMYXRlc3RTZWFyY2hlcz86IGJvb2xlYW47XG4gIEBJbnB1dCgpIGRpc3BsYXlDbG9zZXN0QWlycG9ydHM/OiBib29sZWFuO1xuICBASW5wdXQoKSBsYXRlc3RTZWFyY2hlczogQXJyYXk8QWlycG9ydE1vZGVsPjtcbiAgQElucHV0KCkgcmVzdWx0c0xhYmVsczogUmVzdWx0c0xhYmVsc01vZGVsO1xuICBASW5wdXQoKSBhaXJwb3J0U2VsZWN0TGFiZWw6IHN0cmluZztcbiAgQElucHV0KCkgYWlycG9ydFNlbGVjdFBsYWNlaG9sZGVyOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGFpcnBvcnRTZWxlY3RJY29uTW9kaWZpZXI6IHN0cmluZztcbiAgQElucHV0KCkga2VlcFNlbGVjdGlvbjogYm9vbGVhbjtcbiAgQElucHV0KCkgbmFzRm9ybUNvbnRyb2xOYW1lOiBzdHJpbmc7XG4gIEBJbnB1dCgpIG5hc0Zvcm1Hcm91cDogRm9ybUdyb3VwO1xuICBASW5wdXQoKSBlbmFibGVHZW9sb2NhdGlvbj86IGJvb2xlYW47XG4gIEBJbnB1dCgpIGFyaWFMYWJlbENsZWFyOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGFyaWFMYWJlbEJhY2tkcm9wOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGlzVmFsaWQgPSB0cnVlO1xuICBASW5wdXQoKSBpbnZhbGlkVGV4dDogc3RyaW5nO1xuXG4gIEBJbnB1dCgpXG4gIGdldCBjbG9zZXN0QWlycG9ydHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuY2xvc2VzdEFpcnBvcnRzVmFsdWU7XG4gIH1cbiAgc2V0IGNsb3Nlc3RBaXJwb3J0cyhhaXJwb3J0czogQXJyYXk8QWlycG9ydE1vZGVsPikge1xuICAgIGlmICghYWlycG9ydHMgfHwgIWFpcnBvcnRzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuY2xvc2VzdEFpcnBvcnRzVmFsdWUgPSBhaXJwb3J0cztcbiAgICB0aGlzLmdlb2xvY2F0aW9uU3RhdGUgPSBHZW9sb2NhdGlvblN0YXRlLmdyYW50ZWQ7XG4gIH1cblxuICBASW5wdXQoKVxuICBnZXQgYWlycG9ydCgpIHtcbiAgICByZXR1cm4gdGhpcy5haXJwb3J0VmFsdWU7XG4gIH1cbiAgc2V0IGFpcnBvcnQoYWlycG9ydDogQWlycG9ydE1vZGVsKSB7XG4gICAgaWYgKCFhaXJwb3J0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5haXJwb3J0VmFsdWUgPSBhaXJwb3J0O1xuICAgIHRoaXMuc2VsZWN0ZWRNb2RlbCA9IGFpcnBvcnQubmFtZTtcbiAgICB0aGlzLmZpbHRlcmVkQWlycG9ydHMgPSB0aGlzLnNlbGVjdFNlcnZpY2UuZmlsdGVyKHRoaXMuYWlycG9ydHMsIHRoaXMuc2VsZWN0ZWRNb2RlbCk7XG4gIH1cblxuICBASW5wdXQoKVxuICBnZXQgb3BlbigpIHtcbiAgICByZXR1cm4gdGhpcy5vcGVuVmFsdWU7XG4gIH1cbiAgc2V0IG9wZW4odmFsdWU6IGJvb2xlYW4pIHtcbiAgICBpZiAodGhpcy5vcGVuVmFsdWUgPT09IHZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuaW5wdXRTZWxlY3Rpb25UaW1lb3V0KTtcbiAgICB0aGlzLm9wZW5WYWx1ZSA9IHZhbHVlO1xuXG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICB0aGlzLmlucHV0U2VsZWN0aW9uVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmlucHV0Lm5hdGl2ZUVsZW1lbnQuc2VsZWN0KCk7XG4gICAgICB9LCAxMDApO1xuICAgIH1cbiAgfVxuXG4gIEBJbnB1dCgpXG4gIGdldCBhaXJwb3J0cygpIHtcbiAgICByZXR1cm4gdGhpcy5haXJwb3J0c1ZhbHVlO1xuICB9XG4gIHNldCBhaXJwb3J0cyhhaXJwb3J0czogQXJyYXk8QWlycG9ydE1vZGVsPikge1xuICAgIHRoaXMuYWlycG9ydHNWYWx1ZSA9IGFpcnBvcnRzO1xuICAgIHRoaXMuZmlsdGVyZWRBaXJwb3J0cyA9IHRoaXMuc2VsZWN0U2VydmljZS5maWx0ZXIodGhpcy5haXJwb3J0cywgdGhpcy5zZWxlY3RlZE1vZGVsKTtcbiAgfVxuXG4gIEBPdXRwdXQoKSBzZWxlY3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8QWlycG9ydE1vZGVsPigpO1xuICBAT3V0cHV0KCkgb3BlbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcbiAgQE91dHB1dCgpIGZvY3VzT25OZXh0ID0gbmV3IEV2ZW50RW1pdHRlcjxLZXlib2FyZEV2ZW50PigpO1xuICBAT3V0cHV0KCkgZm9jdXNPblByZXZpb3VzID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgcG9zaXRpb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPEdlb2xvY2F0aW9uUG9zaXRpb24+KCk7XG4gIEBPdXRwdXQoKSBjbGVhcmVkU2VsZWN0aW9uID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIGdldCBzZWxlY3RlZE1vZGVsKCkge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkTW9kZWxWYWx1ZTtcbiAgfVxuICBzZXQgc2VsZWN0ZWRNb2RlbChtb2RlbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZWxlY3RlZE1vZGVsVmFsdWUgPSBtb2RlbDtcblxuICAgIGlmICghdGhpcy5uYXNGb3JtR3JvdXAgfHwgIXRoaXMubmFzRm9ybUNvbnRyb2xOYW1lKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY29udHJvbCA9IHRoaXMubmFzRm9ybUdyb3VwLmdldCh0aGlzLm5hc0Zvcm1Db250cm9sTmFtZSk7XG5cbiAgICBpZiAoY29udHJvbCAmJiBjb250cm9sLnZhbHVlICE9PSBtb2RlbCkge1xuICAgICAgY29udHJvbC5wYXRjaFZhbHVlKG1vZGVsKTtcbiAgICB9XG4gIH1cblxuICBnZXQgcmVzdWx0c0lkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBuYXMtYWlycG9ydC1zZWxlY3QtZHJvcGRvd24tcmVzdWx0cy0ke3RoaXMuY29tcG9uZW50SWR9YDtcbiAgfVxuXG4gIGdldCBsYWJlbElkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBuYXMtYWlycG9ydC1zZWxlY3QtZHJvcGRvd24tbGFiZWwtJHt0aGlzLmNvbXBvbmVudElkfWA7XG4gIH1cblxuICBnZXQgaW5wdXRJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmlkID8gdGhpcy5pZCA6IGBuYXMtYWlycG9ydC1zZWxlY3QtZHJvcGRvd24taW5wdXQtJHt0aGlzLmNvbXBvbmVudElkfWA7XG4gIH1cblxuICBnZXQgZ2VvbG9jYXRpb25JY29uKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuZ2VvbG9jYXRpb25TdGF0ZSA9PT0gR2VvbG9jYXRpb25TdGF0ZS5kZW5pZWQpIHtcbiAgICAgIHJldHVybiAnZ2VvbG9jYXRpb24tLWRpc2FibGVkJztcbiAgICB9XG5cbiAgICByZXR1cm4gJ2dlb2xvY2F0aW9uJztcbiAgfVxuXG4gIHByaXZhdGUgbGFzdFNlbGVjdGVkTW9kZWw6IHN0cmluZztcbiAgcHJpdmF0ZSBzZWxlY3RlZE1vZGVsVmFsdWU6IHN0cmluZztcbiAgcHJpdmF0ZSBpbnB1dFNlbGVjdGlvblRpbWVvdXQ6IGFueTtcbiAgcHJpdmF0ZSBjbG9zZXN0QWlycG9ydHNWYWx1ZTogQXJyYXk8QWlycG9ydE1vZGVsPjtcbiAgcHJpdmF0ZSBjb21wb25lbnRJZDogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoRE9DVU1FTlQpIHByaXZhdGUgZG9jdW1lbnQ6IGFueSxcbiAgICBwcml2YXRlIHNlbGVjdFNlcnZpY2U6IEFpcnBvcnRTZWxlY3RTZXJ2aWNlLFxuICAgIHByaXZhdGUgYWlycG9ydFNlbGVjdERyb3Bkb3duU2VydmljZTogQWlycG9ydFNlbGVjdERyb3Bkb3duU2VydmljZSxcbiAgICBwcml2YXRlIGdlb2xvY2F0aW9uU2VydmljZTogR2VvbG9jYXRpb25TZXJ2aWNlKSB7XG4gICAgc3VwZXIoJ25hcy1haXJwb3J0LXNlbGVjdCcpO1xuICAgIHRoaXMuY29tcG9uZW50SWQgPSBuZXh0SWQrKztcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5hcmlhTGFiZWxDbGVhcikge1xuICAgICAgdGhpcy53YXJuTWlzc2luZ0FjY2Vzc2liaWx0eUlucHV0KCdhcmlhTGFiZWxDbGVhcicpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuYXJpYUxhYmVsQmFja2Ryb3ApIHtcbiAgICAgIHRoaXMud2Fybk1pc3NpbmdBY2Nlc3NpYmlsdHlJbnB1dCgnYXJpYUxhYmVsQmFja2Ryb3AnKTtcbiAgICB9XG5cbiAgICB0aGlzLnNlbGVjdGVkTW9kZWwgPSB0aGlzLmFpcnBvcnQgPyB0aGlzLmFpcnBvcnQubmFtZSA6ICcnO1xuXG4gICAgaWYgKHRoaXMuZXhpc3RzKHRoaXMuZGlzcGxheUNsb3Nlc3RBaXJwb3J0cykpIHtcbiAgICAgIHRoaXMuZ2VvbG9jYXRpb25TZXJ2aWNlLmdldFN0YXRlKCkuc3Vic2NyaWJlKChzdGF0ZTogR2VvbG9jYXRpb25TdGF0ZSkgPT4ge1xuICAgICAgICB0aGlzLmdlb2xvY2F0aW9uU3RhdGUgPSBzdGF0ZTtcblxuICAgICAgICBpZiAoc3RhdGUgPT09IEdlb2xvY2F0aW9uU3RhdGUuZ3JhbnRlZCkge1xuICAgICAgICAgIHRoaXMudXBkYXRlQ3VycmVudFBvc2l0aW9uKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5zZWxlY3RlZE1vZGVsKSB7XG4gICAgICB0aGlzLmZpbHRlcmVkQWlycG9ydHMgPSB0aGlzLnNlbGVjdFNlcnZpY2UuZmlsdGVyKHRoaXMuYWlycG9ydHMsIHRoaXMuc2VsZWN0ZWRNb2RlbCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5kaXNwbGF5TGF0ZXN0U2VhcmNoZXMgPSBmYWxzZTtcbiAgICB0aGlzLmRpc3BsYXlDbG9zZXN0QWlycG9ydHMgPSBmYWxzZTtcbiAgICB0aGlzLmRpc3BsYXlBbGxBaXJwb3J0c0xhYmVsID0gZmFsc2U7XG5cbiAgICBpZiAoIXRoaXMuZmlsdGVyZWRBaXJwb3J0cykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGFpcnBvcnQgPSB0aGlzLmZpbHRlcmVkQWlycG9ydHMuZmluZCh4ID0+IHgubmFtZSA9PT0gdGhpcy5zZWxlY3RlZE1vZGVsKTtcblxuICAgIGlmIChhaXJwb3J0KSB7XG4gICAgICB0aGlzLmZvY3VzZWRBaXJwb3J0Q29kZSA9IGFpcnBvcnQuY29kZTtcbiAgICB9XG4gIH1cblxuICBnZXRBbGxBaXJwb3J0c0FpcnBvcnRJZChhaXJwb3J0Q29kZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYG5hcy1haXJwb3J0LXNlbGVjdC1kcm9wZG93bi1haXJwb3J0LSR7dGhpcy5jb21wb25lbnRJZH0tYWxsLWFpcnBvcnRzLSR7YWlycG9ydENvZGV9YDtcbiAgfVxuXG4gIGdldENsb3Nlc3RBaXJwb3J0c0FpcnBvcnRJZChhaXJwb3J0Q29kZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYG5hcy1haXJwb3J0LXNlbGVjdC1kcm9wZG93bi1haXJwb3J0LSR7dGhpcy5jb21wb25lbnRJZH0tY2xvc2VzdC1haXJwb3J0cy0ke2FpcnBvcnRDb2RlfWA7XG4gIH1cblxuICBnZXRMYXRlc3RTZWFyY2hlc0FpcnBvcnRJZChhaXJwb3J0Q29kZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYG5hcy1haXJwb3J0LXNlbGVjdC1kcm9wZG93bi1haXJwb3J0LSR7dGhpcy5jb21wb25lbnRJZH0tbGF0ZXN0LXNlYXJjaGVzLSR7YWlycG9ydENvZGV9YDtcbiAgfVxuXG4gIHVwZGF0ZUN1cnJlbnRQb3NpdGlvbigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5nZW9sb2NhdGlvblN0YXRlID09PSBHZW9sb2NhdGlvblN0YXRlLmRlbmllZFxuICAgICAgfHwgdGhpcy5nZW9sb2NhdGlvblN0YXRlID09PSBHZW9sb2NhdGlvblN0YXRlLnVua25vd24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmdlb2xvY2F0aW9uU2VydmljZS5nZXRDdXJyZW50UG9zaXRpb24oKS5zdWJzY3JpYmUoKHg6IEdlb2xvY2F0aW9uUG9zaXRpb24pID0+IHtcbiAgICAgIHRoaXMucG9zaXRpb25DaGFuZ2UuZW1pdCh4KTtcbiAgICB9LCAoZXJyb3I6IEdlb2xvY2F0aW9uUG9zaXRpb25FcnJvcikgPT4ge1xuICAgICAgaWYgKGVycm9yLlBFUk1JU1NJT05fREVOSUVEKSB7XG4gICAgICAgIHRoaXMuZ2VvbG9jYXRpb25TdGF0ZSA9IEdlb2xvY2F0aW9uU3RhdGUuZGVuaWVkO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgc2V0T3BlbigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5vcGVuKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5vcGVuID0gdHJ1ZTtcbiAgICB0aGlzLm9wZW5DaGFuZ2UuZW1pdCh0cnVlKTtcbiAgfVxuXG4gIG9uR2VvbG9jYXRpb25Ib3Zlcihob3ZlcjogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmIChob3ZlciAmJiB0aGlzLmdlb2xvY2F0aW9uU3RhdGUgIT09IEdlb2xvY2F0aW9uU3RhdGUuZGVuaWVkKSB7XG4gICAgICB0aGlzLmZvY3VzT25HZW9sb2NhdGlvbiA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZm9jdXNPbkdlb2xvY2F0aW9uID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgYmx1cigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5rZWVwU2VsZWN0aW9uKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkTW9kZWwgPSB0aGlzLmxhc3RTZWxlY3RlZE1vZGVsO1xuICAgIH1cblxuICAgIHRoaXMub3BlbiA9IGZhbHNlO1xuICAgIHRoaXMub3BlbkNoYW5nZS5lbWl0KGZhbHNlKTtcblxuICAgIGlmICh0aGlzLnNlbGVjdGVkTW9kZWwgPT09IHRoaXMubGFzdFNlbGVjdGVkTW9kZWwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zZWxlY3RlZE1vZGVsKSB7XG4gICAgICBpZiAodGhpcy5maWx0ZXJlZEFpcnBvcnRzKSB7XG4gICAgICAgIGxldCBhaXJwb3J0ID0gdGhpcy5maWx0ZXJlZEFpcnBvcnRzLmZpbmQoeCA9PiB4Lm5hbWUgPT09IHRoaXMuc2VsZWN0ZWRNb2RlbCk7XG4gICAgICAgIGlmICghYWlycG9ydCkge1xuICAgICAgICAgIGFpcnBvcnQgPSB0aGlzLmZpbHRlcmVkQWlycG9ydHNbMF07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51cGRhdGVTZWxlY3RlZChhaXJwb3J0KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy51cGRhdGVTZWxlY3RlZCh7XG4gICAgICAgIGFpcnBvcnROYW1lOiAnJyxcbiAgICAgICAgY29kZTogJycsXG4gICAgICAgIGNvdW50cnlOYW1lOiAnJyxcbiAgICAgICAgZGlzcGxheU5hbWU6ICcnLFxuICAgICAgICBuYW1lOiAnJyxcbiAgICAgICAgbm9ybWFsaXplZEFpcnBvcnROYW1lOiAnJ1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgZmlsdGVyKCk6IHZvaWQge1xuICAgIGxldCBpc0VtcHR5ID0gZmFsc2U7XG5cbiAgICBpZiAoIXRoaXMubmFzRm9ybUdyb3VwIHx8ICF0aGlzLm5hc0Zvcm1Db250cm9sTmFtZSkge1xuICAgICAgaWYgKCF0aGlzLnNlbGVjdGVkTW9kZWwpIHtcbiAgICAgICAgdGhpcy5yZXNldEZpbHRlcigpO1xuICAgICAgICBpc0VtcHR5ID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZm9jdXNlZEFpcnBvcnRJbmRleCA9IDA7XG4gICAgICAgIHRoaXMuZmlsdGVyZWRBaXJwb3J0cyA9IHRoaXMuc2VsZWN0U2VydmljZS5maWx0ZXIodGhpcy5haXJwb3J0cywgdGhpcy5zZWxlY3RlZE1vZGVsKTtcbiAgICAgICAgdGhpcy5mb2N1c2VkQWlycG9ydENvZGUgPSB0aGlzLmZpbHRlcmVkQWlycG9ydHNbMF0uY29kZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY29udHJvbCA9IHRoaXMubmFzRm9ybUdyb3VwLmdldCh0aGlzLm5hc0Zvcm1Db250cm9sTmFtZSk7XG5cbiAgICAgIGlmICghY29udHJvbCB8fCAhY29udHJvbC52YWx1ZSkge1xuICAgICAgICB0aGlzLnJlc2V0RmlsdGVyKCk7XG4gICAgICAgIGlzRW1wdHkgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5mb2N1c2VkQWlycG9ydEluZGV4ID0gMDtcbiAgICAgICAgdGhpcy5maWx0ZXJlZEFpcnBvcnRzID0gdGhpcy5zZWxlY3RTZXJ2aWNlLmZpbHRlcih0aGlzLmFpcnBvcnRzLCBjb250cm9sLnZhbHVlKTtcbiAgICAgICAgdGhpcy5mb2N1c2VkQWlycG9ydENvZGUgPSB0aGlzLmZpbHRlcmVkQWlycG9ydHNbMF0uY29kZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmRpc3BsYXlMYXRlc3RTZWFyY2hlcyA9IGlzRW1wdHk7XG4gICAgdGhpcy5kaXNwbGF5Q2xvc2VzdEFpcnBvcnRzID0gaXNFbXB0eTtcbiAgICB0aGlzLmRpc3BsYXlBbGxBaXJwb3J0c0xhYmVsID0gaXNFbXB0eTtcbiAgfVxuXG4gIGNsZWFyU2VsZWN0ZWQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgIGlmICh0aGlzLmtlZXBTZWxlY3Rpb24pIHtcbiAgICAgIHRoaXMubGFzdFNlbGVjdGVkTW9kZWwgPSB0aGlzLmFpcnBvcnQubmFtZTtcbiAgICB9XG5cbiAgICB0aGlzLnNlbGVjdGVkTW9kZWwgPSAnJztcblxuICAgIHRoaXMudXBkYXRlU2VsZWN0ZWQoe1xuICAgICAgbmFtZTogJycsXG4gICAgICBjb3VudHJ5TmFtZTogJycsXG4gICAgICBjb2RlOiAnJyxcbiAgICAgIGRpc3BsYXlOYW1lOiAnJyxcbiAgICAgIGFpcnBvcnROYW1lOiAnJyxcbiAgICAgIG5vcm1hbGl6ZWRBaXJwb3J0TmFtZTogJydcbiAgICB9KTtcblxuICAgIHRoaXMuZm9jdXNlZEFpcnBvcnRJbmRleCA9IC0xO1xuICAgIHRoaXMuZm9jdXNlZExhdGVzdFNlYXJjaGVzSW5kZXggPSAtMTtcbiAgICB0aGlzLmZvY3VzZWRDbG9zZXN0QWlycG9ydEluZGV4ID0gLTE7XG4gICAgdGhpcy5mb2N1c2VkQWlycG9ydENvZGUgPSAnJztcbiAgICB0aGlzLmZvY3VzZWRMYXRlc3RTZWFyY2hlc0FpcnBvcnRDb2RlID0gJyc7XG4gICAgdGhpcy5mb2N1c2VkQ2xvc2VzdEFpcnBvcnRDb2RlID0gJyc7XG4gICAgdGhpcy5maWx0ZXJlZEFpcnBvcnRzID0gdGhpcy5haXJwb3J0cztcblxuICAgIHRoaXMub3BlbiA9IHRydWU7XG4gICAgdGhpcy5kaXNwbGF5TGF0ZXN0U2VhcmNoZXMgPSB0cnVlO1xuICAgIHRoaXMuZGlzcGxheUNsb3Nlc3RBaXJwb3J0cyA9IHRydWU7XG4gICAgdGhpcy5kaXNwbGF5QWxsQWlycG9ydHNMYWJlbCA9IHRydWU7XG4gICAgdGhpcy5jbGVhcmVkU2VsZWN0aW9uLmVtaXQoKTtcbiAgfVxuXG4gIGZvY3VzRG93bigpOiB2b2lkIHtcbiAgICBjb25zdCBoYXNMYXRlc3RTZWFyY2hlcyA9IHRoaXMuYWlycG9ydFNlbGVjdERyb3Bkb3duU2VydmljZVxuICAgICAgLmhhc0xhdGVzdFNlYXJjaGVzKHRoaXMuZXhpc3RzKHRoaXMuZGlzcGxheUxhdGVzdFNlYXJjaGVzKSwgdGhpcy5sYXRlc3RTZWFyY2hlcyk7XG5cbiAgICBjb25zdCBoYXNDbG9zZXN0QWlycG9ydHMgPSB0aGlzLmFpcnBvcnRTZWxlY3REcm9wZG93blNlcnZpY2VcbiAgICAgIC5oYXNDbG9zZXN0QWlycG9ydHModGhpcy5leGlzdHModGhpcy5kaXNwbGF5Q2xvc2VzdEFpcnBvcnRzKSwgdGhpcy5jbG9zZXN0QWlycG9ydHMpO1xuXG4gICAgaWYgKHRoaXMuZ2VvbG9jYXRpb25TdGF0ZSAhPT0gbnVsbCAmJlxuICAgICAgdGhpcy5nZW9sb2NhdGlvblN0YXRlICE9PSBHZW9sb2NhdGlvblN0YXRlLmdyYW50ZWQgJiZcbiAgICAgIHRoaXMuZ2VvbG9jYXRpb25TdGF0ZSAhPT0gR2VvbG9jYXRpb25TdGF0ZS5kZW5pZWQgJiZcbiAgICAgICF0aGlzLmZvY3VzT25HZW9sb2NhdGlvbiAmJlxuICAgICAgdGhpcy5mb2N1c2VkQWlycG9ydEluZGV4ID09PSAtMSAmJlxuICAgICAgdGhpcy5mb2N1c2VkTGF0ZXN0U2VhcmNoZXNJbmRleCA9PT0gLTEpIHtcbiAgICAgIHRoaXMuZm9jdXNPbkdlb2xvY2F0aW9uID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKGhhc0xhdGVzdFNlYXJjaGVzICYmIHRoaXMuZm9jdXNlZExhdGVzdFNlYXJjaGVzSW5kZXggPCB0aGlzLmxhdGVzdFNlYXJjaGVzLmxlbmd0aCAtIDEpIHtcbiAgICAgIHRoaXMuZm9jdXNEb3duTGF0ZXN0U2VhcmNoZXMoKTtcbiAgICB9IGVsc2UgaWYgKGhhc0Nsb3Nlc3RBaXJwb3J0c1xuICAgICAgJiYgdGhpcy5haXJwb3J0U2VsZWN0RHJvcGRvd25TZXJ2aWNlLmlzSW5kZXhJbkNsb3Nlc3RBaXJwb3J0cyh0aGlzLmZvY3VzZWRDbG9zZXN0QWlycG9ydEluZGV4LCB0aGlzLmNsb3Nlc3RBaXJwb3J0cykpIHtcbiAgICAgIHRoaXMuZm9jdXNEb3duQ2xvc2VzdEFpcnBvcnRzKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZm9jdXNEb3duQWlycG9ydHMoaGFzQ2xvc2VzdEFpcnBvcnRzLCBoYXNMYXRlc3RTZWFyY2hlcyk7XG4gICAgfVxuXG4gICAgdGhpcy5hdXRvU2Nyb2xsKDY2KTtcbiAgfVxuXG4gIGZvY3VzVXAoKTogdm9pZCB7XG4gICAgY29uc3QgaGFzTGF0ZXN0U2VhcmNoZXMgPSB0aGlzLmFpcnBvcnRTZWxlY3REcm9wZG93blNlcnZpY2VcbiAgICAgIC5oYXNMYXRlc3RTZWFyY2hlcyh0aGlzLmV4aXN0cyh0aGlzLmRpc3BsYXlMYXRlc3RTZWFyY2hlcyksIHRoaXMubGF0ZXN0U2VhcmNoZXMpO1xuXG4gICAgY29uc3QgaGFzQ2xvc2VzdEFpcnBvcnRzID0gdGhpcy5haXJwb3J0U2VsZWN0RHJvcGRvd25TZXJ2aWNlXG4gICAgICAuaGFzQ2xvc2VzdEFpcnBvcnRzKHRoaXMuZXhpc3RzKHRoaXMuZGlzcGxheUNsb3Nlc3RBaXJwb3J0cyksIHRoaXMuY2xvc2VzdEFpcnBvcnRzKTtcblxuICAgIGNvbnN0IGhhc0dlb2xvY2F0aW9uID0gdGhpcy5nZW9sb2NhdGlvblN0YXRlICE9PSBudWxsICYmXG4gICAgICB0aGlzLmdlb2xvY2F0aW9uU3RhdGUgIT09IEdlb2xvY2F0aW9uU3RhdGUuZ3JhbnRlZCAmJlxuICAgICAgdGhpcy5nZW9sb2NhdGlvblN0YXRlICE9PSBHZW9sb2NhdGlvblN0YXRlLmRlbmllZCAmJlxuICAgICAgIXRoaXMuZm9jdXNPbkdlb2xvY2F0aW9uO1xuXG4gICAgaWYgKHRoaXMuZm9jdXNlZEFpcnBvcnRJbmRleCA+IDApIHtcbiAgICAgIHRoaXMuZm9jdXNVcEFpcnBvcnRzKGhhc0Nsb3Nlc3RBaXJwb3J0cywgaGFzTGF0ZXN0U2VhcmNoZXMpO1xuICAgIH0gZWxzZSBpZiAoaGFzQ2xvc2VzdEFpcnBvcnRzICYmIHRoaXMuZm9jdXNlZEFpcnBvcnRJbmRleCA8PSAwICYmIHRoaXMuZm9jdXNlZENsb3Nlc3RBaXJwb3J0SW5kZXggPiAwKSB7XG4gICAgICB0aGlzLmZvY3VzVXBDbG9zZXN0QWlycG9ydHMoaGFzTGF0ZXN0U2VhcmNoZXMpO1xuICAgIH0gZWxzZSBpZiAoaGFzTGF0ZXN0U2VhcmNoZXMgJiYgaGFzQ2xvc2VzdEFpcnBvcnRzICYmIHRoaXMuZm9jdXNlZENsb3Nlc3RBaXJwb3J0SW5kZXggPD0gMFxuICAgICAgfHwgaGFzTGF0ZXN0U2VhcmNoZXMgJiYgIWhhc0Nsb3Nlc3RBaXJwb3J0cyAmJiB0aGlzLmZvY3VzZWRBaXJwb3J0SW5kZXggPD0gMCkge1xuICAgICAgdGhpcy5mb2N1c1VwTGF0ZXN0U2VhcmNoZXMoKTtcbiAgICB9IGVsc2UgaWYgKGhhc0dlb2xvY2F0aW9uICYmIGhhc0xhdGVzdFNlYXJjaGVzICYmIHRoaXMuZm9jdXNlZExhdGVzdFNlYXJjaGVzSW5kZXggPD0gMFxuICAgICAgfHwgaGFzR2VvbG9jYXRpb24gJiYgIWhhc0xhdGVzdFNlYXJjaGVzICYmIHRoaXMuZm9jdXNlZEFpcnBvcnRJbmRleCA8PSAwKSB7XG4gICAgICB0aGlzLmZvY3VzT25HZW9sb2NhdGlvbiA9IHRydWU7XG4gICAgICB0aGlzLmZvY3VzZWRBaXJwb3J0Q29kZSA9ICcnO1xuICAgICAgdGhpcy5mb2N1c2VkTGF0ZXN0U2VhcmNoZXNBaXJwb3J0Q29kZSA9ICcnO1xuICAgICAgdGhpcy5mb2N1c2VkTGF0ZXN0U2VhcmNoZXNJbmRleCA9IC0xO1xuICAgICAgdGhpcy5mb2N1c2VkQWlycG9ydEluZGV4ID0gLTE7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYmx1cigpO1xuICAgIH1cblxuICAgIHRoaXMuYXV0b1Njcm9sbCg2Nik7XG4gIH1cblxuICBzZXRTZWxlY3RlZChhaXJwb3J0OiBBaXJwb3J0TW9kZWwpOiB2b2lkIHtcbiAgICB0aGlzLnVwZGF0ZVNlbGVjdGVkKGFpcnBvcnQpO1xuICAgIHRoaXMub3BlbiA9IGZhbHNlO1xuICAgIHRoaXMub3BlbkNoYW5nZS5lbWl0KGZhbHNlKTtcbiAgfVxuXG4gIG9uS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIHN3aXRjaCAoZXZlbnQua2V5KSB7XG4gICAgICBjYXNlICdFc2NhcGUnOlxuICAgICAgICB0aGlzLm9wZW4gPSBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMua2VlcFNlbGVjdGlvbiAmJiAhdGhpcy5haXJwb3J0Lm5hbWUpIHtcbiAgICAgICAgICB0aGlzLmJsdXIoKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ1RhYic6XG4gICAgICBjYXNlICdFbnRlcic6XG4gICAgICAgIGlmICh0aGlzLmZpbHRlcmVkQWlycG9ydHMpIHtcbiAgICAgICAgICBjb25zdCBhaXJwb3J0ID0gdGhpcy5maWx0ZXJlZEFpcnBvcnRzLmZpbmQoeCA9PiB4LmNvZGUgPT09IHRoaXMuZm9jdXNlZEFpcnBvcnRDb2RlKSB8fCB0aGlzLmZpbHRlcmVkQWlycG9ydHNbMF07XG4gICAgICAgICAgdGhpcy5zZWxlY3RlZE1vZGVsID0gYWlycG9ydC5uYW1lIHx8ICcnO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuZm9jdXNPbkdlb2xvY2F0aW9uKSB7XG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICB0aGlzLnVwZGF0ZUN1cnJlbnRQb3NpdGlvbigpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmJsdXIoKTtcbiAgICAgICAgICBpZiAoIWV2ZW50LnNoaWZ0S2V5KSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdGhpcy5mb2N1c09uTmV4dC5lbWl0KGV2ZW50KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5mb2N1c09uUHJldmlvdXMuZW1pdCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIWV2ZW50LnNoaWZ0S2V5KSB7XG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNPbk5leHQuZW1pdChldmVudCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5vcGVuID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdBcnJvd0Rvd24nOlxuICAgICAgY2FzZSAnRG93bic6XG4gICAgICAgIHRoaXMuZm9jdXNEb3duKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnQXJyb3dVcCc6XG4gICAgICBjYXNlICdVcCc6XG4gICAgICAgIHRoaXMuZm9jdXNVcCgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0JhY2tzcGFjZSc6XG4gICAgICBjYXNlICdEZWxldGUnOlxuICAgICAgICBpZiAodGhpcy5rZWVwU2VsZWN0aW9uKSB7XG4gICAgICAgICAgdGhpcy5sYXN0U2VsZWN0ZWRNb2RlbCA9IHRoaXMuYWlycG9ydC5uYW1lO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZXNldEZpbHRlcigpOiB2b2lkIHtcbiAgICB0aGlzLmZvY3VzZWRBaXJwb3J0SW5kZXggPSAtMTtcbiAgICB0aGlzLmZvY3VzZWRMYXRlc3RTZWFyY2hlc0luZGV4ID0gLTE7XG4gICAgdGhpcy5mb2N1c2VkQ2xvc2VzdEFpcnBvcnRJbmRleCA9IC0xO1xuICAgIHRoaXMuZm9jdXNlZEFpcnBvcnRDb2RlID0gJyc7XG4gICAgdGhpcy5mb2N1c2VkTGF0ZXN0U2VhcmNoZXNBaXJwb3J0Q29kZSA9ICcnO1xuICAgIHRoaXMuZm9jdXNlZENsb3Nlc3RBaXJwb3J0Q29kZSA9ICcnO1xuICAgIHRoaXMuZmlsdGVyZWRBaXJwb3J0cyA9IHRoaXMuYWlycG9ydHM7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVNlbGVjdGVkKGFpcnBvcnQ6IEFpcnBvcnRNb2RlbCk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0ZWRNb2RlbCA9IGFpcnBvcnQubmFtZTtcbiAgICBpZiAodGhpcy5rZWVwU2VsZWN0aW9uICYmIGFpcnBvcnQubmFtZS5sZW5ndGgpIHtcbiAgICAgIHRoaXMubGFzdFNlbGVjdGVkTW9kZWwgPSBhaXJwb3J0Lm5hbWU7XG4gICAgfVxuICAgIHRoaXMuc2VsZWN0ZWQuZW1pdChhaXJwb3J0KTtcbiAgfVxuXG4gIHByaXZhdGUgZm9jdXNEb3duTGF0ZXN0U2VhcmNoZXMoKTogdm9pZCB7XG4gICAgdGhpcy5mb2N1c09uR2VvbG9jYXRpb24gPSBmYWxzZTtcblxuICAgIGxldCBpbmRleCA9IHRoaXMuZm9jdXNlZExhdGVzdFNlYXJjaGVzSW5kZXg7XG5cbiAgICBpbmRleCA9IGluZGV4ICsgMTtcblxuICAgIGNvbnN0IGFpcnBvcnQgPSB0aGlzLmxhdGVzdFNlYXJjaGVzW2luZGV4XTtcblxuICAgIHRoaXMuZm9jdXNlZExhdGVzdFNlYXJjaGVzSW5kZXggPSBpbmRleDtcbiAgICB0aGlzLmZvY3VzZWRMYXRlc3RTZWFyY2hlc0FpcnBvcnRDb2RlID0gYWlycG9ydC5jb2RlO1xuICAgIHRoaXMuZm9jdXNlZEFpcnBvcnRDb2RlID0gJyc7XG4gICAgdGhpcy5mb2N1c2VkQ2xvc2VzdEFpcnBvcnRDb2RlID0gJyc7XG4gICAgdGhpcy51cGRhdGVTZWxlY3RlZChhaXJwb3J0KTtcbiAgfVxuXG4gIHByaXZhdGUgZm9jdXNEb3duQ2xvc2VzdEFpcnBvcnRzKCk6IHZvaWQge1xuICAgIGxldCBpbmRleCA9IHRoaXMuZm9jdXNlZENsb3Nlc3RBaXJwb3J0SW5kZXg7XG5cbiAgICBpbmRleCA9IGluZGV4ICsgMTtcblxuICAgIGNvbnN0IGFpcnBvcnQgPSB0aGlzLmNsb3Nlc3RBaXJwb3J0c1tpbmRleF07XG5cbiAgICB0aGlzLmZvY3VzZWRDbG9zZXN0QWlycG9ydEluZGV4ID0gaW5kZXg7XG4gICAgdGhpcy5mb2N1c2VkQ2xvc2VzdEFpcnBvcnRDb2RlID0gYWlycG9ydC5jb2RlIHx8ICcnO1xuICAgIHRoaXMuZm9jdXNlZEFpcnBvcnRDb2RlID0gJyc7XG4gICAgdGhpcy5mb2N1c2VkTGF0ZXN0U2VhcmNoZXNBaXJwb3J0Q29kZSA9ICcnO1xuICAgIHRoaXMudXBkYXRlU2VsZWN0ZWQoYWlycG9ydCk7XG4gIH1cblxuICBwcml2YXRlIGZvY3VzRG93bkFpcnBvcnRzKGhhc0Nsb3Nlc3RBaXJwb3J0czogYm9vbGVhbiwgaGFzTGF0ZXN0U2VhcmNoZXM6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBsZXQgaW5kZXggPSB0aGlzLmZvY3VzZWRBaXJwb3J0SW5kZXg7XG4gICAgdGhpcy5mb2N1c09uR2VvbG9jYXRpb24gPSBmYWxzZTtcblxuICAgIGluZGV4ID0gaW5kZXggKyAxO1xuXG4gICAgaWYgKHRoaXMuZmlsdGVyZWRBaXJwb3J0cyAmJiBpbmRleCA+IHRoaXMuZmlsdGVyZWRBaXJwb3J0cy5sZW5ndGggLSAxKSB7XG4gICAgICB0aGlzLmZvY3VzZWRDbG9zZXN0QWlycG9ydEluZGV4ID0gLTE7XG4gICAgICB0aGlzLmZvY3VzZWRMYXRlc3RTZWFyY2hlc0luZGV4ID0gLTE7XG4gICAgICB0aGlzLmZvY3VzZWRBaXJwb3J0SW5kZXggPSAtMTtcblxuICAgICAgaWYgKHRoaXMuZ2VvbG9jYXRpb25TdGF0ZSAhPT0gR2VvbG9jYXRpb25TdGF0ZS5ncmFudGVkKSB7XG4gICAgICAgIHRoaXMuZm9jdXNPbkdlb2xvY2F0aW9uID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5mb2N1c2VkQWlycG9ydENvZGUgPSAnJztcbiAgICAgICAgdGhpcy5mb2N1c2VkQ2xvc2VzdEFpcnBvcnRDb2RlID0gJyc7XG4gICAgICAgIHRoaXMuZm9jdXNlZExhdGVzdFNlYXJjaGVzQWlycG9ydENvZGUgPSAnJztcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBlbHNlIGlmIChoYXNMYXRlc3RTZWFyY2hlcykge1xuICAgICAgICB0aGlzLmZvY3VzRG93bkxhdGVzdFNlYXJjaGVzKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gZWxzZSBpZiAoaGFzQ2xvc2VzdEFpcnBvcnRzKSB7XG4gICAgICAgIHRoaXMuZm9jdXNEb3duQ2xvc2VzdEFpcnBvcnRzKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmZvY3VzZWRBaXJwb3J0SW5kZXggPSBpbmRleDtcblxuICAgIGlmICh0aGlzLmZpbHRlcmVkQWlycG9ydHMpIHtcbiAgICAgIGNvbnN0IGFpcnBvcnQgPSB0aGlzLmZpbHRlcmVkQWlycG9ydHNbaW5kZXhdO1xuXG4gICAgICBpZiAoYWlycG9ydCkge1xuICAgICAgICB0aGlzLmZvY3VzZWRBaXJwb3J0Q29kZSA9IGFpcnBvcnQuY29kZTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZE1vZGVsID0gYWlycG9ydC5uYW1lO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuZm9jdXNlZExhdGVzdFNlYXJjaGVzQWlycG9ydENvZGUgPSAnJztcbiAgICB0aGlzLmZvY3VzZWRDbG9zZXN0QWlycG9ydENvZGUgPSAnJztcbiAgfVxuXG4gIHByaXZhdGUgZm9jdXNVcEFpcnBvcnRzKGhhc0Nsb3Nlc3RBaXJwb3J0czogYm9vbGVhbiwgaGFzTGF0ZXN0U2VhcmNoZXM6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBsZXQgaW5kZXggPSB0aGlzLmZvY3VzZWRBaXJwb3J0SW5kZXg7XG4gICAgdGhpcy5mb2N1c09uR2VvbG9jYXRpb24gPSBmYWxzZTtcblxuICAgIGlmIChpbmRleCAtIDEgPCAwKSB7XG4gICAgICB0aGlzLmZvY3VzZWRBaXJwb3J0SW5kZXggPSAtMTtcbiAgICAgIHRoaXMuZm9jdXNlZEFpcnBvcnRDb2RlID0gJyc7XG4gICAgICB0aGlzLmJsdXIoKTtcblxuICAgICAgaWYgKCFoYXNDbG9zZXN0QWlycG9ydHMpIHtcbiAgICAgICAgdGhpcy5mb2N1c2VkQ2xvc2VzdEFpcnBvcnRDb2RlID0gJyc7XG4gICAgICB9XG4gICAgICBpZiAoIWhhc0xhdGVzdFNlYXJjaGVzKSB7XG4gICAgICAgIHRoaXMuZm9jdXNlZENsb3Nlc3RBaXJwb3J0Q29kZSA9ICcnO1xuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaW5kZXggPSBpbmRleCAtIDE7XG5cbiAgICB0aGlzLmZvY3VzZWRBaXJwb3J0SW5kZXggPSBpbmRleDtcbiAgICB0aGlzLmZvY3VzZWRMYXRlc3RTZWFyY2hlc0FpcnBvcnRDb2RlID0gJyc7XG4gICAgdGhpcy5mb2N1c2VkQ2xvc2VzdEFpcnBvcnRDb2RlID0gJyc7XG5cbiAgICBpZiAodGhpcy5maWx0ZXJlZEFpcnBvcnRzKSB7XG4gICAgICBjb25zdCBhaXJwb3J0ID0gdGhpcy5maWx0ZXJlZEFpcnBvcnRzW2luZGV4XTtcblxuICAgICAgaWYgKGFpcnBvcnQpIHtcbiAgICAgICAgdGhpcy5mb2N1c2VkQWlycG9ydENvZGUgPSBhaXJwb3J0LmNvZGU7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRNb2RlbCA9IGFpcnBvcnQubmFtZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGF1dG9TY3JvbGwoZXh0cmFPZmZzZXQ6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICghdGhpcy5yZXN1bHRzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdHMgPSB0aGlzLnJlc3VsdHMubmF0aXZlRWxlbWVudDtcbiAgICBjb25zdCBmb2N1c2VkSXRlbSA9IHRoaXMuZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLm5hcy1haXJwb3J0LXNlbGVjdF9fbGlzdC1pdGVtLS1mb2N1cycpO1xuXG4gICAgaWYgKGZvY3VzZWRJdGVtKSB7XG4gICAgICByZXN1bHRzLnNjcm9sbFRvKDAsIDApO1xuICAgICAgcmVzdWx0cy5zY3JvbGxUbygwLCBmb2N1c2VkSXRlbS5vZmZzZXRUb3AgKyBleHRyYU9mZnNldCAtIHJlc3VsdHMuY2xpZW50SGVpZ2h0KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGZvY3VzVXBMYXRlc3RTZWFyY2hlcygpOiB2b2lkIHtcbiAgICB0aGlzLmZvY3VzT25HZW9sb2NhdGlvbiA9IGZhbHNlO1xuXG4gICAgbGV0IGxhdGVzdFNlYXJjaGVzSW5kZXggPSB0aGlzLmZvY3VzZWRMYXRlc3RTZWFyY2hlc0luZGV4O1xuXG4gICAgaWYgKGxhdGVzdFNlYXJjaGVzSW5kZXggPCAwKSB7XG4gICAgICB0aGlzLmZvY3VzZWRMYXRlc3RTZWFyY2hlc0luZGV4ID0gLTE7XG4gICAgICB0aGlzLmZvY3VzZWRMYXRlc3RTZWFyY2hlc0FpcnBvcnRDb2RlID0gJyc7XG4gICAgICB0aGlzLmJsdXIoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjbG9zZXN0QWlycG9ydEluZGV4ID0gdGhpcy5mb2N1c2VkQ2xvc2VzdEFpcnBvcnRJbmRleDtcbiAgICBjb25zdCBhaXJwb3J0c0luZGV4ID0gdGhpcy5mb2N1c2VkQWlycG9ydEluZGV4O1xuXG4gICAgaWYgKGNsb3Nlc3RBaXJwb3J0SW5kZXggPCAwICYmIGFpcnBvcnRzSW5kZXggPCAwKSB7XG4gICAgICBsYXRlc3RTZWFyY2hlc0luZGV4ID0gbGF0ZXN0U2VhcmNoZXNJbmRleCAtIDE7XG5cbiAgICAgIGlmIChsYXRlc3RTZWFyY2hlc0luZGV4IDwgMCkge1xuICAgICAgICB0aGlzLmZvY3VzZWRMYXRlc3RTZWFyY2hlc0luZGV4ID0gLTE7XG4gICAgICAgIHRoaXMuZm9jdXNlZExhdGVzdFNlYXJjaGVzQWlycG9ydENvZGUgPSAnJztcbiAgICAgICAgdGhpcy5ibHVyKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBhaXJwb3J0ID0gdGhpcy5sYXRlc3RTZWFyY2hlc1tsYXRlc3RTZWFyY2hlc0luZGV4XTtcblxuICAgIHRoaXMuZm9jdXNlZExhdGVzdFNlYXJjaGVzSW5kZXggPSBsYXRlc3RTZWFyY2hlc0luZGV4O1xuICAgIHRoaXMuZm9jdXNlZExhdGVzdFNlYXJjaGVzQWlycG9ydENvZGUgPSBhaXJwb3J0LmNvZGU7XG4gICAgdGhpcy5mb2N1c2VkQ2xvc2VzdEFpcnBvcnRDb2RlID0gJyc7XG4gICAgdGhpcy5mb2N1c2VkQ2xvc2VzdEFpcnBvcnRJbmRleCA9IC0xO1xuICAgIHRoaXMuZm9jdXNlZEFpcnBvcnRDb2RlID0gJyc7XG4gICAgdGhpcy5mb2N1c2VkQWlycG9ydEluZGV4ID0gLTE7XG4gICAgdGhpcy51cGRhdGVTZWxlY3RlZChhaXJwb3J0KTtcbiAgfVxuXG4gIHByaXZhdGUgZm9jdXNVcENsb3Nlc3RBaXJwb3J0cyhoYXNMYXRlc3RTZWFyY2hlczogYm9vbGVhbik6IHZvaWQge1xuICAgIGxldCBjbG9zZXN0QWlycG9ydEluZGV4ID0gdGhpcy5mb2N1c2VkQ2xvc2VzdEFpcnBvcnRJbmRleDtcblxuICAgIGlmICghaGFzTGF0ZXN0U2VhcmNoZXMgJiYgY2xvc2VzdEFpcnBvcnRJbmRleCA8PSAwKSB7XG4gICAgICB0aGlzLmZvY3VzZWRDbG9zZXN0QWlycG9ydEluZGV4ID0gLTE7XG4gICAgICB0aGlzLmJsdXIoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoY2xvc2VzdEFpcnBvcnRJbmRleCAtIDEgPCAwKSB7XG4gICAgICB0aGlzLmZvY3VzZWRDbG9zZXN0QWlycG9ydEluZGV4ID0gLTE7XG4gICAgICB0aGlzLmZvY3VzZWRDbG9zZXN0QWlycG9ydENvZGUgPSAnJztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5mb2N1c2VkQWlycG9ydEluZGV4IDwgMCkge1xuICAgICAgY2xvc2VzdEFpcnBvcnRJbmRleCA9IGNsb3Nlc3RBaXJwb3J0SW5kZXggLSAxO1xuICAgIH1cblxuICAgIGNvbnN0IGFpcnBvcnQgPSB0aGlzLmNsb3Nlc3RBaXJwb3J0c1tjbG9zZXN0QWlycG9ydEluZGV4XTtcbiAgICB0aGlzLmZvY3VzZWRDbG9zZXN0QWlycG9ydEluZGV4ID0gY2xvc2VzdEFpcnBvcnRJbmRleDtcbiAgICB0aGlzLmZvY3VzZWRDbG9zZXN0QWlycG9ydENvZGUgPSBhaXJwb3J0LmNvZGU7XG4gICAgdGhpcy5mb2N1c2VkQWlycG9ydENvZGUgPSAnJztcbiAgICB0aGlzLmZvY3VzZWRBaXJwb3J0SW5kZXggPSAtMTtcblxuICAgIHRoaXMudXBkYXRlU2VsZWN0ZWQoYWlycG9ydCk7XG4gIH1cbn1cbiIsIjxuZy1jb250YWluZXIgKm5nSWY9XCIhbmFzRm9ybUNvbnRyb2xOYW1lOyBlbHNlIHJlYWN0aXZlRm9ybVwiPlxuICA8bGFiZWwgW2lkXT1cImxhYmVsSWRcIlxuICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiYWlycG9ydFNlbGVjdExhYmVsXCJcbiAgICBbbmFzQ2xhc3NdPVwiZ2V0Q2xhc3MoJ3dyYXBwZXInLCBbb3BlbiAmJiAnYWN0aXZlJywgc2VsZWN0ZWRNb2RlbCAmJiAnZmlsbGVkJ10pXCI+XG4gICAgPHNwYW4gW25hc0NsYXNzXT1cImdldENsYXNzKCdsYWJlbCcpXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYWlycG9ydFNlbGVjdExhYmVsOyBlbHNlIGVtcHR5TGFiZWxcIj57e2FpcnBvcnRTZWxlY3RMYWJlbH19PC9uZy1jb250YWluZXI+XG4gICAgICA8bmctdGVtcGxhdGUgI2VtcHR5TGFiZWw+Jm5ic3A7PC9uZy10ZW1wbGF0ZT5cbiAgICA8L3NwYW4+XG4gICAgPGlucHV0ICNhaXJwb3J0U2VsZWN0XG4gICAgICB0eXBlPVwidGV4dFwiXG4gICAgICByb2xlPVwiY29tYm9ib3hcIlxuICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCJcbiAgICAgIGFyaWEtaGFzcG9wdXA9XCJsaXN0Ym94XCJcbiAgICAgIGFyaWEtYXV0b2NvbXBsZXRlPVwibm9uZVwiXG4gICAgICBbaWRdPVwiaW5wdXRJZFwiXG4gICAgICBbYXR0ci5hcmlhLWNvbnRyb2xzXT1cInJlc3VsdHNJZFwiXG4gICAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cIm9wZW4gPyAndHJ1ZScgOiAnZmFsc2UnXCJcbiAgICAgIFthdHRyLmFyaWEtb3duc109XCJyZXN1bHRzSWRcIlxuICAgICAgW25hc0NsYXNzXT1cImdldENsYXNzKCdpbnB1dCcpXCJcbiAgICAgIFtwbGFjZWhvbGRlcl09XCJhaXJwb3J0U2VsZWN0UGxhY2Vob2xkZXJcIlxuICAgICAgKGZvY3VzKT1cInNldE9wZW4oKVwiXG4gICAgICAobW91c2Vkb3duKT1cInNldE9wZW4oKVwiXG4gICAgICAoaW5wdXQpPVwiZmlsdGVyKClcIlxuICAgICAgKGtleWRvd24pPVwib25LZXlEb3duKCRldmVudClcIlxuICAgICAgWyhuZ01vZGVsKV09XCJzZWxlY3RlZE1vZGVsXCIvPlxuICAgIDxzcGFuIFtuYXNDbGFzc109XCJnZXRDbGFzcygnaWNvbicpXCI+XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIlxuICAgICAgICByb2xlPVwiYnV0dG9uXCJcbiAgICAgICAgdGFiaW5kZXg9XCItMVwiXG4gICAgICAgICpuZ0lmPVwic2VsZWN0ZWRNb2RlbDsgZWxzZSBpc0VtcHR5XCJcbiAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJhcmlhTGFiZWxDbGVhclwiXG4gICAgICAgIChjbGljayk9XCJjbGVhclNlbGVjdGVkKCRldmVudClcIj5cbiAgICAgICAgPG5hcy1pY29uIFt0eXBlXT1cInNlbGVjdGVkTW9kZWwgPyAncmVtb3ZlLS1zZWNvbmRhcnknIDogJ3JlbW92ZSdcIj48L25hcy1pY29uPlxuICAgICAgPC9idXR0b24+XG4gICAgICA8bmctdGVtcGxhdGUgI2lzRW1wdHk+XG4gICAgICAgIDxuYXMtaWNvbiBbdHlwZV09XCInc21hbGwnXCJcbiAgICAgICAgICBbaWNvbl09XCJhaXJwb3J0U2VsZWN0SWNvbk1vZGlmaWVyXCI+PC9uYXMtaWNvbj5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPC9zcGFuPlxuICA8L2xhYmVsPlxuPC9uZy1jb250YWluZXI+XG48bmctdGVtcGxhdGUgI3JlYWN0aXZlRm9ybT5cbiAgPGxhYmVsIFtpZF09XCJsYWJlbElkXCJcbiAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImFpcnBvcnRTZWxlY3RMYWJlbFwiXG4gICAgW25hc0NsYXNzXT1cImdldENsYXNzKCd3cmFwcGVyJywgW29wZW4gJiYgJ2FjdGl2ZScsIHNlbGVjdGVkTW9kZWwgJiYgJ2ZpbGxlZCddKVwiXG4gICAgW2Zvcm1Hcm91cF09XCJuYXNGb3JtR3JvdXBcIj5cbiAgICA8c3BhbiBbbmFzQ2xhc3NdPVwiZ2V0Q2xhc3MoJ2xhYmVsJylcIlxuICAgICAgKm5nSWY9XCJhaXJwb3J0U2VsZWN0TGFiZWxcIj57e2FpcnBvcnRTZWxlY3RMYWJlbH19PC9zcGFuPlxuICAgIDxpbnB1dCAjYWlycG9ydFNlbGVjdFxuICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgcm9sZT1cImNvbWJvYm94XCJcbiAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgICBhcmlhLWF1dG9jb21wbGV0ZT1cIm5vbmVcIlxuICAgICAgW2lkXT1cImlucHV0SWRcIlxuICAgICAgW2F0dHIuYXJpYS1jb250cm9sc109XCJyZXN1bHRzSWRcIlxuICAgICAgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJvcGVuID8gJ3RydWUnIDogJ2ZhbHNlJ1wiXG4gICAgICBbYXR0ci5hcmlhLW93bnNdPVwicmVzdWx0c0lkXCJcbiAgICAgIFtuYXNDbGFzc109XCJnZXRDbGFzcygnaW5wdXQnKVwiXG4gICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIm5hc0Zvcm1Db250cm9sTmFtZVwiXG4gICAgICBbcGxhY2Vob2xkZXJdPVwiYWlycG9ydFNlbGVjdFBsYWNlaG9sZGVyXCJcbiAgICAgIChtb3VzZWRvd24pPVwic2V0T3BlbigpXCJcbiAgICAgIChmb2N1cyk9XCJzZXRPcGVuKClcIlxuICAgICAgKGlucHV0KT1cImZpbHRlcigpXCJcbiAgICAgIChrZXlkb3duKT1cIm9uS2V5RG93bigkZXZlbnQpXCIgLz5cbiAgICA8c3BhbiBbbmFzQ2xhc3NdPVwiZ2V0Q2xhc3MoJ2ljb24nKVwiPlxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgcm9sZT1cImJ1dHRvblwiXG4gICAgICAgIHRhYmluZGV4PVwiLTFcIlxuICAgICAgICAqbmdJZj1cInNlbGVjdGVkTW9kZWw7IGVsc2UgaXNFbXB0eVwiXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiYXJpYUxhYmVsQ2xlYXJcIlxuICAgICAgICAoY2xpY2spPVwiY2xlYXJTZWxlY3RlZCgkZXZlbnQpXCI+XG4gICAgICAgIDxuYXMtaWNvbiBbdHlwZV09XCJzZWxlY3RlZE1vZGVsID8gJ3JlbW92ZS0tc2Vjb25kYXJ5JyA6ICdyZW1vdmUnXCI+PC9uYXMtaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPG5nLXRlbXBsYXRlICNpc0VtcHR5PlxuICAgICAgICA8bmFzLWljb24gW3R5cGVdPVwiJ3NtYWxsJ1wiXG4gICAgICAgICAgW2ljb25dPVwiYWlycG9ydFNlbGVjdEljb25Nb2RpZmllclwiPjwvbmFzLWljb24+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuICAgIDwvc3Bhbj5cbiAgPC9sYWJlbD5cbjwvbmctdGVtcGxhdGU+XG48ZGl2IFtuYXNDbGFzc109XCJnZXRDbGFzcygncmVzdWx0cy13cmFwcGVyJylcIlxuICBbaWRdPVwicmVzdWx0c0lkXCJcbiAgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJvcGVuID8gJ3RydWUnIDogJ2ZhbHNlJ1wiPlxuICA8dWwgI3Jlc3VsdHNcbiAgICByb2xlPVwibGlzdGJveFwiXG4gICAgKm5nSWY9XCJvcGVuXCJcbiAgICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwibGFiZWxJZFwiXG4gICAgW25hc0NsYXNzXT1cImdldENsYXNzKCdyZXN1bHRzJylcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZXhpc3RzKGVuYWJsZUdlb2xvY2F0aW9uKSAmJiBnZW9sb2NhdGlvblN0YXRlICE9PSBudWxsICYmIGdlb2xvY2F0aW9uU3RhdGUgIT09IDAgJiYgaXNWYWxpZFwiPlxuICAgICAgPGxpIHJvbGU9XCJvcHRpb25cIj5cbiAgICAgICAgPG5hcy1idXR0b24gbGlua1xuICAgICAgICAgIHNlY29uZGFyeVxuICAgICAgICAgIFtkaXNhYmxlZF09XCJnZW9sb2NhdGlvblN0YXRlID09PSAyXCJcbiAgICAgICAgICBbY3NzU3R5bGVdPVwieydoZWlnaHQnOiAnNjZweCcsICd0ZXh0LWRlY29yYXRpb24nOiAndW5kZXJsaW5lJywgJ2Rpc3BsYXknOiAnZmxleCcsICdqdXN0aWZ5LWNvbnRlbnQnOiAnc3BhY2UtYmV0d2Vlbid9XCJcbiAgICAgICAgICBbY3NzQ2xhc3NdPVwiZ2V0Q2xhc3MoJ2l0ZW0nLCBbJ2dlb2xvY2F0aW9uJywgZm9jdXNPbkdlb2xvY2F0aW9uICYmIGdlb2xvY2F0aW9uU3RhdGUgIT09IDIgJiYgJ2ZvY3VzJywgZ2VvbG9jYXRpb25TdGF0ZSA9PT0gMiAmJiAnZGlzYWJsZWQnXSlcIlxuICAgICAgICAgIFt0YWJpbmRleF09XCItMVwiXG4gICAgICAgICAgKGNsaWNrQ2hhbmdlKT1cInVwZGF0ZUN1cnJlbnRQb3NpdGlvbigpXCJcbiAgICAgICAgICAobW91c2VlbnRlcik9XCJvbkdlb2xvY2F0aW9uSG92ZXIodHJ1ZSlcIlxuICAgICAgICAgIChtb3VzZWxlYXZlKT1cIm9uR2VvbG9jYXRpb25Ib3ZlcihmYWxzZSlcIj5cbiAgICAgICAgICA8c3BhbiAqbmdJZj1cImdlb2xvY2F0aW9uU3RhdGUgPT09IDE7IGVsc2UgZ2VvbG9jYXRpb25EZW5pZWRcIlxuICAgICAgICAgICAgW25hc0NsYXNzXT1cImdldENsYXNzKCdnZW9sb2NhdGlvbicsICdsYWJlbCcpXCI+e3tyZXN1bHRzTGFiZWxzPy5nZW9sb2NhdGlvbn19PC9zcGFuPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZ2VvbG9jYXRpb25EZW5pZWQ+XG4gICAgICAgICAgICA8c3BhbiBbbmFzQ2xhc3NdPVwiZ2V0Q2xhc3MoJ2dlb2xvY2F0aW9uJywgJ2xhYmVsJylcIj57e3Jlc3VsdHNMYWJlbHM/Lmdlb2xvY2F0aW9uRGVuaWVkfX08L3NwYW4+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8bmFzLWljb24gW25hc0NsYXNzXT1cImdldENsYXNzKCdnZW9sb2NhdGlvbicsICdpY29uJylcIlxuICAgICAgICAgICAgW3R5cGVdPVwiZ2VvbG9jYXRpb25JY29uXCI+PC9uYXMtaWNvbj5cbiAgICAgICAgPC9uYXMtYnV0dG9uPlxuICAgICAgPC9saT5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bGkgcm9sZT1cInNlcGFyYXRvclwiXG4gICAgICBbbmFzQ2xhc3NdPVwiZ2V0Q2xhc3MoJ2xpc3Qtc2VjdGlvbi1sYWJlbCcpXCJcbiAgICAgICpuZ0lmPVwibGF0ZXN0U2VhcmNoZXM/Lmxlbmd0aCA+IDBcbiAgICAgICYmIGV4aXN0cyhkaXNwbGF5TGF0ZXN0U2VhcmNoZXMpXG4gICAgICAmJiByZXN1bHRzTGFiZWxzPy5sYXRlc3RTZWFyY2hlc1xuICAgICAgJiYgaXNWYWxpZFwiPlxuICAgICAgPHNwYW4+e3tyZXN1bHRzTGFiZWxzPy5sYXRlc3RTZWFyY2hlc319PC9zcGFuPlxuICAgIDwvbGk+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImV4aXN0cyhkaXNwbGF5TGF0ZXN0U2VhcmNoZXMpICYmIGlzVmFsaWRcIj5cbiAgICAgIDxsaSByb2xlPVwib3B0aW9uXCJcbiAgICAgICAgKm5nRm9yPVwibGV0IGFpcnBvcnQgb2YgbGF0ZXN0U2VhcmNoZXNcIlxuICAgICAgICBbaWRdPVwiZ2V0TGF0ZXN0U2VhcmNoZXNBaXJwb3J0SWQoYWlycG9ydC5jb2RlKVwiXG4gICAgICAgIFthdHRyLmFyaWEtc2VsZWN0ZWRdPVwiYWlycG9ydC5jb2RlID09PSBmb2N1c2VkTGF0ZXN0U2VhcmNoZXNBaXJwb3J0Q29kZVwiXG4gICAgICAgIFtuYXNDbGFzc109XCJnZXRDbGFzcygnbGlzdC1pdGVtJywgYWlycG9ydC5jb2RlID09PSBmb2N1c2VkTGF0ZXN0U2VhcmNoZXNBaXJwb3J0Q29kZSAmJiAnZm9jdXMnKVwiPlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIFtuYXNDbGFzc109XCJnZXRDbGFzcygnaXRlbScsIGFpcnBvcnQuY29kZSA9PT0gZm9jdXNlZExhdGVzdFNlYXJjaGVzQWlycG9ydENvZGUgJiYgJ2ZvY3VzJylcIlxuICAgICAgICAgIChjbGljayk9XCJzZXRTZWxlY3RlZChhaXJwb3J0KVwiXG4gICAgICAgICAgdGFiaW5kZXg9XCItMVwiPlxuICAgICAgICAgIDxzcGFuIFtuYXNDbGFzc109XCJnZXRDbGFzcygnbmFtZScpXCI+e3thaXJwb3J0Lm5hbWV9fTwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBbbmFzQ2xhc3NdPVwiZ2V0Q2xhc3MoJ2NvZGUnKVwiPjwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBbbmFzQ2xhc3NdPVwiZ2V0Q2xhc3MoJ2NvdW50cnknKVwiPnt7YWlycG9ydC5jb3VudHJ5TmFtZX19PC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvbGk+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPGxpIHJvbGU9XCJzZXBhcmF0b3JcIlxuICAgICAgKm5nSWY9XCJleGlzdHMoZGlzcGxheUNsb3Nlc3RBaXJwb3J0cylcbiAgICAgICAmJiBnZW9sb2NhdGlvblN0YXRlICE9PSBudWxsXG4gICAgICAgJiYgZ2VvbG9jYXRpb25TdGF0ZSA9PT0gMFxuICAgICAgICYmIGNsb3Nlc3RBaXJwb3J0cz8ubGVuZ3RoID4gMFxuICAgICAgICYmIHJlc3VsdHNMYWJlbHM/LmNsb3Nlc3RBaXJwb3J0c1xuICAgICAgICYmIGlzVmFsaWRcIlxuICAgICAgW25hc0NsYXNzXT1cImdldENsYXNzKCdsaXN0LXNlY3Rpb24tbGFiZWwnKVwiPlxuICAgICAgPHNwYW4+e3tyZXN1bHRzTGFiZWxzPy5jbG9zZXN0QWlycG9ydHN9fTwvc3Bhbj5cbiAgICA8L2xpPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJleGlzdHMoZGlzcGxheUNsb3Nlc3RBaXJwb3J0cykgJiYgZ2VvbG9jYXRpb25TdGF0ZSA9PT0gMCAmJiBpc1ZhbGlkXCI+XG4gICAgICA8bGkgcm9sZT1cIm9wdGlvblwiXG4gICAgICAgICpuZ0Zvcj1cImxldCBhaXJwb3J0IG9mIGNsb3Nlc3RBaXJwb3J0c1wiXG4gICAgICAgIFtpZF09XCJnZXRDbG9zZXN0QWlycG9ydHNBaXJwb3J0SWQoYWlycG9ydC5jb2RlKVwiXG4gICAgICAgIFthdHRyLmFyaWEtc2VsZWN0ZWRdPVwiYWlycG9ydC5jb2RlID09PSBmb2N1c2VkQ2xvc2VzdEFpcnBvcnRDb2RlXCJcbiAgICAgICAgW25hc0NsYXNzXT1cImdldENsYXNzKCdsaXN0LWl0ZW0nLCBhaXJwb3J0LmNvZGUgPT09IGZvY3VzZWRDbG9zZXN0QWlycG9ydENvZGUgJiYgJ2ZvY3VzJylcIj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBbbmFzQ2xhc3NdPVwiZ2V0Q2xhc3MoJ2l0ZW0nLCBhaXJwb3J0LmNvZGUgPT09IGZvY3VzZWRDbG9zZXN0QWlycG9ydENvZGUgJiYgJ2ZvY3VzJylcIlxuICAgICAgICAgIChjbGljayk9XCJzZXRTZWxlY3RlZChhaXJwb3J0KVwiXG4gICAgICAgICAgdGFiaW5kZXg9XCItMVwiPlxuICAgICAgICAgIDxzcGFuIFtuYXNDbGFzc109XCJnZXRDbGFzcygnbmFtZScpXCI+e3thaXJwb3J0Lm5hbWV9fTwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBbbmFzQ2xhc3NdPVwiZ2V0Q2xhc3MoJ2NvZGUnKVwiPjwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBbbmFzQ2xhc3NdPVwiZ2V0Q2xhc3MoJ2NvdW50cnknKVwiPnt7YWlycG9ydC5jb3VudHJ5TmFtZX19PC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvbGk+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPGxpIHJvbGU9XCJzZXBhcmF0b3JcIlxuICAgICAgW25hc0NsYXNzXT1cImdldENsYXNzKCdsaXN0LXNlY3Rpb24tbGFiZWwnKVwiXG4gICAgICAqbmdJZj1cImRpc3BsYXlBbGxBaXJwb3J0c0xhYmVsICYmIHJlc3VsdHNMYWJlbHM/LmFsbEFpcnBvcnRzICYmIGlzVmFsaWRcIj5cbiAgICAgIDxzcGFuPnt7cmVzdWx0c0xhYmVscz8uYWxsQWlycG9ydHN9fTwvc3Bhbj5cbiAgICA8L2xpPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc1ZhbGlkXCI+XG4gICAgICA8bGkgcm9sZT1cIm9wdGlvblwiXG4gICAgICAgICpuZ0Zvcj1cImxldCBhaXJwb3J0IG9mIGZpbHRlcmVkQWlycG9ydHNcIlxuICAgICAgICBbaWRdPVwiZ2V0QWxsQWlycG9ydHNBaXJwb3J0SWQoYWlycG9ydC5jb2RlKVwiXG4gICAgICAgIFthdHRyLmFyaWEtc2VsZWN0ZWRdPVwiYWlycG9ydC5jb2RlID09PSBmb2N1c2VkQWlycG9ydENvZGVcIlxuICAgICAgICBbbmFzQ2xhc3NdPVwiZ2V0Q2xhc3MoJ2xpc3QtaXRlbScsIGFpcnBvcnQuY29kZSA9PT0gZm9jdXNlZEFpcnBvcnRDb2RlICYmICdmb2N1cycpXCI+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgW25hc0NsYXNzXT1cImdldENsYXNzKCdpdGVtJywgYWlycG9ydC5jb2RlID09PSBmb2N1c2VkQWlycG9ydENvZGUgJiYgJ2ZvY3VzJylcIlxuICAgICAgICAgIChjbGljayk9XCJzZXRTZWxlY3RlZChhaXJwb3J0KVwiXG4gICAgICAgICAgdGFiaW5kZXg9XCItMVwiPlxuICAgICAgICAgIDxzcGFuIFtuYXNDbGFzc109XCJnZXRDbGFzcygnbmFtZScpXCI+e3thaXJwb3J0Lm5hbWV9fTwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBbbmFzQ2xhc3NdPVwiZ2V0Q2xhc3MoJ2NvZGUnKVwiPjwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBbbmFzQ2xhc3NdPVwiZ2V0Q2xhc3MoJ2NvdW50cnknKVwiPnt7YWlycG9ydC5jb3VudHJ5TmFtZX19PC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvbGk+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPGxpICpuZ0lmPVwiIWlzVmFsaWRcIlxuICAgICAgcm9sZT1cImxpc3RpdGVtXCI+XG4gICAgICA8c3BhbiBbbmFzQ2xhc3NdPVwiZ2V0Q2xhc3MoJ25hbWUnLCAnaW52YWxpZCcpXCI+e3tpbnZhbGlkVGV4dH19PC9zcGFuPlxuICAgIDwvbGk+XG4gIDwvdWw+XG48L2Rpdj5cbjxidXR0b24gdHlwZT1cImJ1dHRvblwiXG4gIHRhYmluZGV4PVwiMFwiXG4gICpuZ0lmPVwib3BlblwiXG4gIFthdHRyLmFyaWEtbGFiZWxdPVwiYXJpYUxhYmVsQmFja2Ryb3BcIlxuICBbbmFzQ2xhc3NdPVwiZ2V0Q2xhc3MoJ2JhY2tkcm9wJylcIlxuICAoY2xpY2spPVwiYmx1cigpXCI+PC9idXR0b24+Il19
|