@tsi-developpement/tsi-shared-ui 1.0.8 → 1.1.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.
@@ -96,6 +96,32 @@ export class TsiSearchComboComponent extends TsiInputBase {
96
96
  get isStatusCombo() {
97
97
  return this.comboType === 'status';
98
98
  }
99
+ lightenColor(hex, percent = 40) {
100
+ if (!hex)
101
+ return '';
102
+ hex = hex.replace(/^#/, '');
103
+ let r = parseInt(hex.substring(0, 2), 16);
104
+ let g = parseInt(hex.substring(2, 4), 16);
105
+ let b = parseInt(hex.substring(4, 6), 16);
106
+ r = Math.min(255, Math.floor(r + (255 - r) * percent / 100));
107
+ g = Math.min(255, Math.floor(g + (255 - g) * percent / 100));
108
+ b = Math.min(255, Math.floor(b + (255 - b) * percent / 100));
109
+ const newHex = '#' +
110
+ [r, g, b]
111
+ .map(x => x.toString(16).padStart(2, '0'))
112
+ .join('');
113
+ return newHex;
114
+ }
115
+ getReadableTextColor(hex) {
116
+ if (!hex)
117
+ return 'black';
118
+ hex = hex.replace(/^#/, '');
119
+ const r = parseInt(hex.substring(0, 2), 16);
120
+ const g = parseInt(hex.substring(2, 4), 16);
121
+ const b = parseInt(hex.substring(4, 6), 16);
122
+ const brightness = (r * 299 + g * 587 + b * 114) / 1000;
123
+ return brightness > 230 ? 'black' : `#${hex}`;
124
+ }
99
125
  getStatusOption(value) {
100
126
  return this.statusMetadata?.options.find(o => o.translatedLabel === value);
101
127
  }
@@ -583,11 +609,11 @@ export class TsiSearchComboComponent extends TsiInputBase {
583
609
  this.onClick.emit(event);
584
610
  }
585
611
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TsiSearchComboComponent, deps: [{ token: i1.EntityConfigurationService }, { token: i2.TsiModalService }, { token: i3.TsiNotificationService }, { token: i4.HttpClient }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
586
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: TsiSearchComboComponent, selector: "Tsi-Search-Combo", inputs: { elementSourceUrl: "elementSourceUrl", listSourceUrl: "listSourceUrl", idField: ["id-field", "idField"], labelField: ["label-field", "labelField"], multiple: "multiple", sort: "sort", showClear: "showClear", reloadDataSource: "reloadDataSource", isFiltered: "isFiltered", selectedLabel: "selectedLabel", maxWidth: "maxWidth", businessClass: "businessClass", comboType: "comboType", statusMetadata: "statusMetadata", currentRowItem: "currentRowItem", datasource: "datasource", bind: "bind", showSearchButton: "showSearchButton", showAddButton: "showAddButton", showConsultButton: "showConsultButton", showUpdateButton: "showUpdateButton" }, outputs: { bindChange: "bindChange", dataSourceLoaded: "datasource-loaded", init: "init", isLoaded: "isLoaded", selectedLabelChange: "selectedLabelChange", onClick: "onClick", onSearchButtonClick: "onSearchButtonClick" }, host: { listeners: { "keydown.enter": "onEnterKey($event)" } }, usesInheritance: true, ngImport: i0, template: "<div class=\"flex\">\r\n <p-dropdown [placeholder]=\"placeHolder\" class=\"{{myStyleClass}}\" [required]=\"isRequired\"\r\n styleClass=\"{{myStyleClass}} border-radius-7 {{validationStatusCssClass}}\" appendTo=\"body\" optionLabel=\"label\"\r\n optionValue=\"id\" filterBy=\"label\" [options]=\"datasource\" [disabled]=\"disabled\" [lazy]=\"!dataLoaded\"\r\n [(ngModel)]=\"bind\" [filter]=\"true\" [showClear]=\"showClear\" [autoDisplayFirst]=\"false\"\r\n (onChange)=\"bindValueChanged($event)\" (onHide)=\"onHide()\" (onShow)=\"onOpen()\"\r\n (onFilter)=\"searchValueChanged($event)\" (onClear)=\"clearSelectedValue()\" (onClick)=\"onSearchComboClick($event)\"\r\n [style]=\"{'max-width': maxWidth, 'width':'100%', 'height': '1.7rem'}\"\r\n [ngClass]=\"isAr ? 'p-dropdown-clear-iconAR': 'p-dropdown-clear-iconFR' \">\r\n <!-- Ajout d'un bouton dans le dropdown -->\r\n <ng-template pTemplate=\"header\">\r\n <div class=\"dropdown-header flex gap-1 pt-2 px-2\">\r\n <Tsi-Button *ngIf=\"showSearchButton\" type=\"button\" icon=\"pi pi-search\" title=\"title-search-combo-Ouvrir\"\r\n styleClass=\"p-button-primary hover:shadow-6 h-2rem p-button-icon-only\" (click)=\"openSearchDialog()\">\r\n </Tsi-Button>\r\n\r\n <Tsi-Button *ngIf=\"showAddButton\" type=\"button\" icon=\"pi pi-plus\" title=\"title-search-combo-Ajouter\"\r\n styleClass=\"p-button-success hover:shadow-6 h-2rem p-button-icon-only\" (click)=\"addElement()\">\r\n </Tsi-Button>\r\n\r\n <Tsi-Button *ngIf=\"showAdvancedSearchButton\" type=\"button\" icon=\"pi pi-sort-amount-down\"\r\n title=\"Lister les articles pivot\u00E9s\" styleClass=\"p-button-secondary hover:shadow-6 h-2rem p-button-icon-only\"\r\n (click)=\"openAdvancedSearchComponent()\">\r\n </Tsi-Button>\r\n\r\n <Tsi-Button *ngIf=\"showConsultButton\" type=\"button\" icon=\"pi pi-eye\" title=\"title-search-combo-Consulter\"\r\n styleClass=\"p-button-primary hover:shadow-6 h-2rem p-button-icon-only\" (click)=\"consultElement()\">\r\n </Tsi-Button>\r\n\r\n <Tsi-Button *ngIf=\"showUpdateButton\" type=\"button\" icon=\"pi pi-pencil\" title=\"title-search-combo-update\"\r\n styleClass=\"p-button-primary hover:shadow-6 h-2rem p-button-icon-only\" (click)=\"updateElement()\">\r\n </Tsi-Button>\r\n\r\n </div>\r\n </ng-template>\r\n <ng-template let-target pTemplate=\"item\">\r\n <div pTooltip=\"{{target.label}}\" tooltipPosition=\"top\" tooltipStyleClass=\"custom-tooltip\">\r\n\r\n \r\n <ng-container *ngIf=\"isStatusCombo && statusMetadata; else normalOption\">\r\n <ng-container *ngIf=\"getStatusOption(target.label) as opt\">\r\n <span\r\n class=\"font-bold status-badge\"\r\n [style.background-color]=\"opt.colorHex\"\r\n [style.color]=\"opt.colorHex ? 'white' : 'black'\">\r\n {{target.label}}\r\n </span>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-template #normalOption>\r\n <span>{{target.label}}</span>\r\n </ng-template>\r\n </div>\r\n </ng-template>\r\n </p-dropdown>\r\n\r\n <!-- Bubble Info -->\r\n <Tsi-Bubble-Info [infoText]=\"infoText\"></Tsi-Bubble-Info>\r\n</div>", styles: [".ng-select .ng-select-container .ng-value-container .ng-input>input{z-index:10!important}::ng-deep .p-icon-wrapper{align-items:center!important;justify-content:center!important}::ng-deep .p-dropdown-clear-icon{position:unset!important;top:unset!important;margin-top:unset!important}::ng-deep .p-dropdown-panel{max-width:30rem!important}::ng-deep .p-dropdown-clear-iconAR svg{left:0!important}::ng-deep .p-dropdown-clear-iconFR svg{right:2.5rem;left:auto}::ng-deep .custom-tooltip{max-width:300px;white-space:normal;word-wrap:break-word}.status-badge{display:inline-block;min-width:max-content;width:100%;text-align:center;white-space:nowrap;border-radius:9999px;padding-top:.05rem;padding-bottom:.05rem;font-weight:600;color:#fff;box-shadow:0 1px 3px #0000001a;transition:all .15s ease-in-out;cursor:default}.status-badge:hover{transform:scale(1.06);box-shadow:0 2px 6px #00000026;filter:brightness(1.1)}\n"], dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i7.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: i8.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "component", type: i9.Dropdown, selector: "p-dropdown", inputs: ["id", "scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "loadingIcon", "filterPlaceholder", "filterLocale", "variant", "inputId", "dataKey", "filterBy", "filterFields", "autofocus", "resetFilterOnHide", "checkmark", "dropdownIcon", "loading", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "focusOnHover", "selectOnFocus", "autoOptionFocus", "autofocusFilter", "autoShowPanelOnPrintableCharacterKeyDown", "disabled", "itemSize", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "filterValue", "options"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "component", type: i10.TsiBubbleInfoComponent, selector: "Tsi-Bubble-Info", inputs: ["infoText"] }, { kind: "component", type: i11.TsiButtonComponent, selector: "Tsi-Button", inputs: ["disabled", "text", "style", "tooltipText", "tooltipPosition", "buttonType", "icon", "styleClass", "iconSrc", "id", "iconWidth", "iconClass"], outputs: ["onClick", "rightClick"] }] }); }
612
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: TsiSearchComboComponent, selector: "Tsi-Search-Combo", inputs: { elementSourceUrl: "elementSourceUrl", listSourceUrl: "listSourceUrl", idField: ["id-field", "idField"], labelField: ["label-field", "labelField"], multiple: "multiple", sort: "sort", showClear: "showClear", reloadDataSource: "reloadDataSource", isFiltered: "isFiltered", selectedLabel: "selectedLabel", maxWidth: "maxWidth", businessClass: "businessClass", comboType: "comboType", statusMetadata: "statusMetadata", currentRowItem: "currentRowItem", datasource: "datasource", bind: "bind", showSearchButton: "showSearchButton", showAddButton: "showAddButton", showConsultButton: "showConsultButton", showUpdateButton: "showUpdateButton" }, outputs: { bindChange: "bindChange", dataSourceLoaded: "datasource-loaded", init: "init", isLoaded: "isLoaded", selectedLabelChange: "selectedLabelChange", onClick: "onClick", onSearchButtonClick: "onSearchButtonClick" }, host: { listeners: { "keydown.enter": "onEnterKey($event)" } }, usesInheritance: true, ngImport: i0, template: "<div class=\"flex\">\r\n <p-dropdown [placeholder]=\"placeHolder\" class=\"{{myStyleClass}}\" [required]=\"isRequired\"\r\n styleClass=\"{{myStyleClass}} border-radius-7 {{validationStatusCssClass}}\" appendTo=\"body\" optionLabel=\"label\"\r\n optionValue=\"id\" filterBy=\"label\" [options]=\"datasource\" [disabled]=\"disabled\" [lazy]=\"!dataLoaded\"\r\n [(ngModel)]=\"bind\" [filter]=\"true\" [showClear]=\"showClear\" [autoDisplayFirst]=\"false\"\r\n (onChange)=\"bindValueChanged($event)\" (onHide)=\"onHide()\" (onShow)=\"onOpen()\"\r\n (onFilter)=\"searchValueChanged($event)\" (onClear)=\"clearSelectedValue()\" (onClick)=\"onSearchComboClick($event)\"\r\n [style]=\"{'max-width': maxWidth, 'width':'100%', 'height': '1.7rem'}\"\r\n [ngClass]=\"isAr ? 'p-dropdown-clear-iconAR': 'p-dropdown-clear-iconFR' \">\r\n <!-- Ajout d'un bouton dans le dropdown -->\r\n <ng-template pTemplate=\"header\">\r\n <div class=\"dropdown-header flex gap-1 pt-2 px-2\">\r\n <Tsi-Button *ngIf=\"showSearchButton\" type=\"button\" icon=\"pi pi-search\" title=\"title-search-combo-Ouvrir\"\r\n styleClass=\"p-button-primary hover:shadow-6 h-2rem p-button-icon-only\" (click)=\"openSearchDialog()\">\r\n </Tsi-Button>\r\n\r\n <Tsi-Button *ngIf=\"showAddButton\" type=\"button\" icon=\"pi pi-plus\" title=\"title-search-combo-Ajouter\"\r\n styleClass=\"p-button-success hover:shadow-6 h-2rem p-button-icon-only\" (click)=\"addElement()\">\r\n </Tsi-Button>\r\n\r\n <Tsi-Button *ngIf=\"showAdvancedSearchButton\" type=\"button\" icon=\"pi pi-sort-amount-down\"\r\n title=\"Lister les articles pivot\u00E9s\" styleClass=\"p-button-secondary hover:shadow-6 h-2rem p-button-icon-only\"\r\n (click)=\"openAdvancedSearchComponent()\">\r\n </Tsi-Button>\r\n\r\n <Tsi-Button *ngIf=\"showConsultButton\" type=\"button\" icon=\"pi pi-eye\" title=\"title-search-combo-Consulter\"\r\n styleClass=\"p-button-primary hover:shadow-6 h-2rem p-button-icon-only\" (click)=\"consultElement()\">\r\n </Tsi-Button>\r\n\r\n <Tsi-Button *ngIf=\"showUpdateButton\" type=\"button\" icon=\"pi pi-pencil\" title=\"title-search-combo-update\"\r\n styleClass=\"p-button-primary hover:shadow-6 h-2rem p-button-icon-only\" (click)=\"updateElement()\">\r\n </Tsi-Button>\r\n\r\n </div>\r\n </ng-template>\r\n <ng-template let-target pTemplate=\"item\">\r\n <div pTooltip=\"{{target.label}}\" tooltipPosition=\"top\" tooltipStyleClass=\"custom-tooltip\">\r\n\r\n \r\n <ng-container *ngIf=\"isStatusCombo && statusMetadata; else normalOption\">\r\n <ng-container *ngIf=\"getStatusOption(target.label) as opt\">\r\n <span\r\n class=\"font-bold status-badge\"\r\n [style.background-color]=\"lightenColor(opt.colorHex)\"\r\n [style.color]=\"getReadableTextColor(opt.colorHex)\"\r\n [style.padding-top]=\"'0.1rem'\"\r\n [style.padding-bottom]=\"'0.1rem'\"\r\n >\r\n {{target.label}}\r\n </span>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-template #normalOption>\r\n <span>{{target.label}}</span>\r\n </ng-template>\r\n </div>\r\n </ng-template>\r\n </p-dropdown>\r\n\r\n <!-- Bubble Info -->\r\n <Tsi-Bubble-Info [infoText]=\"infoText\"></Tsi-Bubble-Info>\r\n</div>", styles: [".ng-select .ng-select-container .ng-value-container .ng-input>input{z-index:10!important}::ng-deep .p-icon-wrapper{align-items:center!important;justify-content:center!important}::ng-deep .p-dropdown-clear-icon{position:unset!important;top:unset!important;margin-top:unset!important}::ng-deep .p-dropdown-panel{max-width:30rem!important}::ng-deep .p-dropdown-clear-iconAR svg{left:0!important}::ng-deep .p-dropdown-clear-iconFR svg{right:2.5rem;left:auto}::ng-deep .custom-tooltip{max-width:300px;white-space:normal;word-wrap:break-word}.status-badge{display:inline-flex;align-items:center;justify-content:center;min-width:max-content;width:100%;text-align:center;white-space:nowrap;border-radius:.4rem;padding:.1rem .2rem;font-weight:600;line-height:1.2;color:#fff;box-shadow:0 1px 2px #0000000d;transition:all .2s ease-in-out;cursor:default;transform-origin:top center;border-top-left-radius:inherit;border-bottom-right-radius:inherit}.status-badge:hover{transform:scale(1.06);box-shadow:0 2px 4px #0000001a;filter:brightness(1.2)}\n"], dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i7.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: i8.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "component", type: i9.Dropdown, selector: "p-dropdown", inputs: ["id", "scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "loadingIcon", "filterPlaceholder", "filterLocale", "variant", "inputId", "dataKey", "filterBy", "filterFields", "autofocus", "resetFilterOnHide", "checkmark", "dropdownIcon", "loading", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "focusOnHover", "selectOnFocus", "autoOptionFocus", "autofocusFilter", "autoShowPanelOnPrintableCharacterKeyDown", "disabled", "itemSize", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "filterValue", "options"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "component", type: i10.TsiBubbleInfoComponent, selector: "Tsi-Bubble-Info", inputs: ["infoText"] }, { kind: "component", type: i11.TsiButtonComponent, selector: "Tsi-Button", inputs: ["disabled", "text", "style", "tooltipText", "tooltipPosition", "buttonType", "icon", "styleClass", "iconSrc", "id", "iconWidth", "iconClass"], outputs: ["onClick", "rightClick"] }] }); }
587
613
  }
588
614
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TsiSearchComboComponent, decorators: [{
589
615
  type: Component,
590
- args: [{ selector: 'Tsi-Search-Combo', template: "<div class=\"flex\">\r\n <p-dropdown [placeholder]=\"placeHolder\" class=\"{{myStyleClass}}\" [required]=\"isRequired\"\r\n styleClass=\"{{myStyleClass}} border-radius-7 {{validationStatusCssClass}}\" appendTo=\"body\" optionLabel=\"label\"\r\n optionValue=\"id\" filterBy=\"label\" [options]=\"datasource\" [disabled]=\"disabled\" [lazy]=\"!dataLoaded\"\r\n [(ngModel)]=\"bind\" [filter]=\"true\" [showClear]=\"showClear\" [autoDisplayFirst]=\"false\"\r\n (onChange)=\"bindValueChanged($event)\" (onHide)=\"onHide()\" (onShow)=\"onOpen()\"\r\n (onFilter)=\"searchValueChanged($event)\" (onClear)=\"clearSelectedValue()\" (onClick)=\"onSearchComboClick($event)\"\r\n [style]=\"{'max-width': maxWidth, 'width':'100%', 'height': '1.7rem'}\"\r\n [ngClass]=\"isAr ? 'p-dropdown-clear-iconAR': 'p-dropdown-clear-iconFR' \">\r\n <!-- Ajout d'un bouton dans le dropdown -->\r\n <ng-template pTemplate=\"header\">\r\n <div class=\"dropdown-header flex gap-1 pt-2 px-2\">\r\n <Tsi-Button *ngIf=\"showSearchButton\" type=\"button\" icon=\"pi pi-search\" title=\"title-search-combo-Ouvrir\"\r\n styleClass=\"p-button-primary hover:shadow-6 h-2rem p-button-icon-only\" (click)=\"openSearchDialog()\">\r\n </Tsi-Button>\r\n\r\n <Tsi-Button *ngIf=\"showAddButton\" type=\"button\" icon=\"pi pi-plus\" title=\"title-search-combo-Ajouter\"\r\n styleClass=\"p-button-success hover:shadow-6 h-2rem p-button-icon-only\" (click)=\"addElement()\">\r\n </Tsi-Button>\r\n\r\n <Tsi-Button *ngIf=\"showAdvancedSearchButton\" type=\"button\" icon=\"pi pi-sort-amount-down\"\r\n title=\"Lister les articles pivot\u00E9s\" styleClass=\"p-button-secondary hover:shadow-6 h-2rem p-button-icon-only\"\r\n (click)=\"openAdvancedSearchComponent()\">\r\n </Tsi-Button>\r\n\r\n <Tsi-Button *ngIf=\"showConsultButton\" type=\"button\" icon=\"pi pi-eye\" title=\"title-search-combo-Consulter\"\r\n styleClass=\"p-button-primary hover:shadow-6 h-2rem p-button-icon-only\" (click)=\"consultElement()\">\r\n </Tsi-Button>\r\n\r\n <Tsi-Button *ngIf=\"showUpdateButton\" type=\"button\" icon=\"pi pi-pencil\" title=\"title-search-combo-update\"\r\n styleClass=\"p-button-primary hover:shadow-6 h-2rem p-button-icon-only\" (click)=\"updateElement()\">\r\n </Tsi-Button>\r\n\r\n </div>\r\n </ng-template>\r\n <ng-template let-target pTemplate=\"item\">\r\n <div pTooltip=\"{{target.label}}\" tooltipPosition=\"top\" tooltipStyleClass=\"custom-tooltip\">\r\n\r\n \r\n <ng-container *ngIf=\"isStatusCombo && statusMetadata; else normalOption\">\r\n <ng-container *ngIf=\"getStatusOption(target.label) as opt\">\r\n <span\r\n class=\"font-bold status-badge\"\r\n [style.background-color]=\"opt.colorHex\"\r\n [style.color]=\"opt.colorHex ? 'white' : 'black'\">\r\n {{target.label}}\r\n </span>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-template #normalOption>\r\n <span>{{target.label}}</span>\r\n </ng-template>\r\n </div>\r\n </ng-template>\r\n </p-dropdown>\r\n\r\n <!-- Bubble Info -->\r\n <Tsi-Bubble-Info [infoText]=\"infoText\"></Tsi-Bubble-Info>\r\n</div>", styles: [".ng-select .ng-select-container .ng-value-container .ng-input>input{z-index:10!important}::ng-deep .p-icon-wrapper{align-items:center!important;justify-content:center!important}::ng-deep .p-dropdown-clear-icon{position:unset!important;top:unset!important;margin-top:unset!important}::ng-deep .p-dropdown-panel{max-width:30rem!important}::ng-deep .p-dropdown-clear-iconAR svg{left:0!important}::ng-deep .p-dropdown-clear-iconFR svg{right:2.5rem;left:auto}::ng-deep .custom-tooltip{max-width:300px;white-space:normal;word-wrap:break-word}.status-badge{display:inline-block;min-width:max-content;width:100%;text-align:center;white-space:nowrap;border-radius:9999px;padding-top:.05rem;padding-bottom:.05rem;font-weight:600;color:#fff;box-shadow:0 1px 3px #0000001a;transition:all .15s ease-in-out;cursor:default}.status-badge:hover{transform:scale(1.06);box-shadow:0 2px 6px #00000026;filter:brightness(1.1)}\n"] }]
616
+ args: [{ selector: 'Tsi-Search-Combo', template: "<div class=\"flex\">\r\n <p-dropdown [placeholder]=\"placeHolder\" class=\"{{myStyleClass}}\" [required]=\"isRequired\"\r\n styleClass=\"{{myStyleClass}} border-radius-7 {{validationStatusCssClass}}\" appendTo=\"body\" optionLabel=\"label\"\r\n optionValue=\"id\" filterBy=\"label\" [options]=\"datasource\" [disabled]=\"disabled\" [lazy]=\"!dataLoaded\"\r\n [(ngModel)]=\"bind\" [filter]=\"true\" [showClear]=\"showClear\" [autoDisplayFirst]=\"false\"\r\n (onChange)=\"bindValueChanged($event)\" (onHide)=\"onHide()\" (onShow)=\"onOpen()\"\r\n (onFilter)=\"searchValueChanged($event)\" (onClear)=\"clearSelectedValue()\" (onClick)=\"onSearchComboClick($event)\"\r\n [style]=\"{'max-width': maxWidth, 'width':'100%', 'height': '1.7rem'}\"\r\n [ngClass]=\"isAr ? 'p-dropdown-clear-iconAR': 'p-dropdown-clear-iconFR' \">\r\n <!-- Ajout d'un bouton dans le dropdown -->\r\n <ng-template pTemplate=\"header\">\r\n <div class=\"dropdown-header flex gap-1 pt-2 px-2\">\r\n <Tsi-Button *ngIf=\"showSearchButton\" type=\"button\" icon=\"pi pi-search\" title=\"title-search-combo-Ouvrir\"\r\n styleClass=\"p-button-primary hover:shadow-6 h-2rem p-button-icon-only\" (click)=\"openSearchDialog()\">\r\n </Tsi-Button>\r\n\r\n <Tsi-Button *ngIf=\"showAddButton\" type=\"button\" icon=\"pi pi-plus\" title=\"title-search-combo-Ajouter\"\r\n styleClass=\"p-button-success hover:shadow-6 h-2rem p-button-icon-only\" (click)=\"addElement()\">\r\n </Tsi-Button>\r\n\r\n <Tsi-Button *ngIf=\"showAdvancedSearchButton\" type=\"button\" icon=\"pi pi-sort-amount-down\"\r\n title=\"Lister les articles pivot\u00E9s\" styleClass=\"p-button-secondary hover:shadow-6 h-2rem p-button-icon-only\"\r\n (click)=\"openAdvancedSearchComponent()\">\r\n </Tsi-Button>\r\n\r\n <Tsi-Button *ngIf=\"showConsultButton\" type=\"button\" icon=\"pi pi-eye\" title=\"title-search-combo-Consulter\"\r\n styleClass=\"p-button-primary hover:shadow-6 h-2rem p-button-icon-only\" (click)=\"consultElement()\">\r\n </Tsi-Button>\r\n\r\n <Tsi-Button *ngIf=\"showUpdateButton\" type=\"button\" icon=\"pi pi-pencil\" title=\"title-search-combo-update\"\r\n styleClass=\"p-button-primary hover:shadow-6 h-2rem p-button-icon-only\" (click)=\"updateElement()\">\r\n </Tsi-Button>\r\n\r\n </div>\r\n </ng-template>\r\n <ng-template let-target pTemplate=\"item\">\r\n <div pTooltip=\"{{target.label}}\" tooltipPosition=\"top\" tooltipStyleClass=\"custom-tooltip\">\r\n\r\n \r\n <ng-container *ngIf=\"isStatusCombo && statusMetadata; else normalOption\">\r\n <ng-container *ngIf=\"getStatusOption(target.label) as opt\">\r\n <span\r\n class=\"font-bold status-badge\"\r\n [style.background-color]=\"lightenColor(opt.colorHex)\"\r\n [style.color]=\"getReadableTextColor(opt.colorHex)\"\r\n [style.padding-top]=\"'0.1rem'\"\r\n [style.padding-bottom]=\"'0.1rem'\"\r\n >\r\n {{target.label}}\r\n </span>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-template #normalOption>\r\n <span>{{target.label}}</span>\r\n </ng-template>\r\n </div>\r\n </ng-template>\r\n </p-dropdown>\r\n\r\n <!-- Bubble Info -->\r\n <Tsi-Bubble-Info [infoText]=\"infoText\"></Tsi-Bubble-Info>\r\n</div>", styles: [".ng-select .ng-select-container .ng-value-container .ng-input>input{z-index:10!important}::ng-deep .p-icon-wrapper{align-items:center!important;justify-content:center!important}::ng-deep .p-dropdown-clear-icon{position:unset!important;top:unset!important;margin-top:unset!important}::ng-deep .p-dropdown-panel{max-width:30rem!important}::ng-deep .p-dropdown-clear-iconAR svg{left:0!important}::ng-deep .p-dropdown-clear-iconFR svg{right:2.5rem;left:auto}::ng-deep .custom-tooltip{max-width:300px;white-space:normal;word-wrap:break-word}.status-badge{display:inline-flex;align-items:center;justify-content:center;min-width:max-content;width:100%;text-align:center;white-space:nowrap;border-radius:.4rem;padding:.1rem .2rem;font-weight:600;line-height:1.2;color:#fff;box-shadow:0 1px 2px #0000000d;transition:all .2s ease-in-out;cursor:default;transform-origin:top center;border-top-left-radius:inherit;border-bottom-right-radius:inherit}.status-badge:hover{transform:scale(1.06);box-shadow:0 2px 4px #0000001a;filter:brightness(1.2)}\n"] }]
591
617
  }], ctorParameters: () => [{ type: i1.EntityConfigurationService }, { type: i2.TsiModalService }, { type: i3.TsiNotificationService }, { type: i4.HttpClient }, { type: i0.ChangeDetectorRef }], propDecorators: { onEnterKey: [{
592
618
  type: HostListener,
593
619
  args: ['keydown.enter', ['$event']]
@@ -656,4 +682,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
656
682
  }], showUpdateButton: [{
657
683
  type: Input
658
684
  }] } });
659
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHNpLXNlYXJjaC1jb21iby5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90c2ktc2hhcmVkLXVpL3NyYy9saWIvdHNpLWNvbXBvbmVudHMvaW5wdXQtY29tcG9uZW50cy90c2ktc2VhcmNoLWNvbWJvL3RzaS1zZWFyY2gtY29tYm8uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdHNpLXNoYXJlZC11aS9zcmMvbGliL3RzaS1jb21wb25lbnRzL2lucHV0LWNvbXBvbmVudHMvdHNpLXNlYXJjaC1jb21iby90c2ktc2VhcmNoLWNvbWJvLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBYyxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUM5RCxPQUFPLEVBQXFCLFNBQVMsRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBcUIsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNILE9BQU8sRUFBRSxjQUFjLEVBQTRCLE1BQU0sTUFBTSxDQUFDO0FBRWhFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwyREFBMkQsQ0FBQztBQUN6RixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGVBQWUsRUFBRSxpQkFBaUIsRUFBRSxhQUFhLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNuRixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUcvRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7Ozs7Ozs7Ozs7Ozs7QUFVeEQsTUFBTSxPQUFPLHVCQUF3QixTQUFRLFlBQWlCO0lBZ0I1RCxVQUFVLENBQUMsS0FBVTtRQUNuQixrQ0FBa0M7UUFDbEMsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3ZCLEtBQUss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QUFNO2dCQUNHLG1CQUFtQjtzQkFBNUIsTUFBTTtnQkFDRyxPQUFPO3NCQUFoQixNQUFNO2dCQUNHLG1CQUFtQjtzQkFBNUIsTUFBTTtnQkFnREUsZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBQYXJhbXMgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSG9zdExpc3RlbmVyLCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBmaXJzdFZhbHVlRnJvbSwgT2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IENvbWJvU3RhdHVzTW9kZWwgfSBmcm9tICcuLi8uLi8uLi9pbnRlcmZhY2VzJztcclxuaW1wb3J0IHsgVHNpSW5wdXRCYXNlIH0gZnJvbSAnLi4vLi4vLi4vdHNpLWJhc2UvdHNpLWlucHV0LWJhc2UvdHNpLWlucHV0LWJhc2UuY29tcG9uZW50JztcclxuaW1wb3J0IHsgcnRsTW9kZUtleXMgfSBmcm9tICcuLi8uLi8uLi9jb25zdHMvbG9jYWxzLmNvbnN0JztcclxuaW1wb3J0IHsgQ29tcG9uZW50X01vZGVzLCBHcmlkU2VsZWN0aW9uTW9kZSwgTW9kYWxTaXplRW51bSB9IGZyb20gJy4uLy4uLy4uL2VudW1zJztcclxuaW1wb3J0IHsgVHlwZVJlZ2lzdHJ5SGVscGVyIH0gZnJvbSAnLi4vLi4vLi4vdHNpLWhlbHBlcnMvdHlwZS1yZWdpc3RyeS5oZWxwZXInO1xyXG5pbXBvcnQgeyBFbnRpdHlDb25maWd1cmF0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2NvbmZpZ3VyYXRpb24vZW50aXR5LWNvbmZpZ3VyYXRpb24uc2VydmljZSc7XHJcbmltcG9ydCB7IFRzaU5vdGlmaWNhdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9ub3RpZmljYXRpb24vdHNpLW5vdGlmaWNhdGlvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgR3VpZCB9IGZyb20gJy4uLy4uLy4uL3RzaS1oZWxwZXJzL2d1aWQuaGVscGVyJztcclxuaW1wb3J0IHsgVHNpTW9kYWxTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvbW9kYWwvdHNpLW1vZGFsLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBEeW5hbWljRGlhbG9nQ29uZmlnLCBEeW5hbWljRGlhbG9nUmVmIH0gZnJvbSAncHJpbWVuZy9keW5hbWljZGlhbG9nJztcclxuaW1wb3J0IHsgU3RhdHVzTWV0YWRhdGFSZXNwb25zZSwgU3RhdHVzT3B0aW9uIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL3N0YXR1cy9jb2xvci1zdGF0dXMnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdUc2ktU2VhcmNoLUNvbWJvJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vdHNpLXNlYXJjaC1jb21iby5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vdHNpLXNlYXJjaC1jb21iby5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBUc2lTZWFyY2hDb21ib0NvbXBvbmVudCBleHRlbmRzIFRzaUlucHV0QmFzZTxhbnk+IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG5cclxuICAvLyNyZWdpb24gbG9jYWwgdmFyc1xyXG4gIHByaXZhdGUgX2RhdGFzb3VyY2U6IGFueVtdID0gW107XHJcbiAgcHJpdmF0ZSBfcmVsb2FkU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBfaXNJbnB1dERhdGFzb3VyY2U6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIF9nb3R0ZW5EYXRhc291cmNlOiBhbnlbXSA9IFtdO1xyXG4gIHByaXZhdGUgX2JpbmQ/OiBhbnk7XHJcbiAgcHJpdmF0ZSBfYmluZENoYW5nZUVtaXR0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIF9jdXJyZW50Um93SXRlbT86IGFueTtcclxuICBwdWJsaWMgZGF0YUxvYWRlZDogYm9vbGVhbiA9IHRydWU7XHJcbiAgcHJpdmF0ZSBfc2VsZWN0ZWQ/OiBhbnk7XHJcbiAgcHJpdmF0ZSBfZGlhbG9nUmVmZXJlbmNlPzogRHluYW1pY0RpYWxvZ1JlZiB8IHVuZGVmaW5lZDtcclxuICBpc0FyOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ2tleWRvd24uZW50ZXInLCBbJyRldmVudCddKVxyXG4gIG9uRW50ZXJLZXkoZXZlbnQ6IGFueSkge1xyXG4gICAgLy8gSGFuZGxlIHRoZSBlbnRlciBrZXkgZXZlbnQgaGVyZVxyXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXHJcbiAgfVxyXG5cclxuICAvLyNlbmRyZWdpb25cclxuXHJcbiAgLy8jcmVnaW9uIElucHV0c1xyXG4gIEBJbnB1dChcImVsZW1lbnRTb3VyY2VVcmxcIikgZWxlbWVudFNvdXJjZVVybD86IHN0cmluZztcclxuICBASW5wdXQoXCJsaXN0U291cmNlVXJsXCIpIGxpc3RTb3VyY2VVcmw/OiBzdHJpbmcgfCAoKGl0ZW06IGFueSkgPT4gc3RyaW5nKTtcclxuICBASW5wdXQoXCJpZC1maWVsZFwiKSBpZEZpZWxkOiBzdHJpbmcgPSBcIlwiO1xyXG4gIEBJbnB1dChcImxhYmVsLWZpZWxkXCIpIGxhYmVsRmllbGQ6IHN0cmluZyA9IFwiXCI7XHJcbiAgQElucHV0KFwibXVsdGlwbGVcIikgbXVsdGlwbGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoXCJzb3J0XCIpIHNvcnQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgQElucHV0KCkgc2hvd0NsZWFyOiBib29sZWFuID0gdHJ1ZTtcclxuICBASW5wdXQoKSByZWxvYWREYXRhU291cmNlOiBPYnNlcnZhYmxlPGFueT4gfCB1bmRlZmluZWQ7XHJcbiAgQElucHV0KCkgaXNGaWx0ZXJlZD86IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKSBzZWxlY3RlZExhYmVsPzogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIG1heFdpZHRoOiBzdHJpbmcgPSAnJztcclxuICBASW5wdXQoKSBidXNpbmVzc0NsYXNzOiBzdHJpbmcgPSAnJztcclxuXHJcbiAgQElucHV0KCkgY29tYm9UeXBlPzogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIHN0YXR1c01ldGFkYXRhPzogU3RhdHVzTWV0YWRhdGFSZXNwb25zZTtcclxuXHJcbiAgQElucHV0KClcclxuICBnZXQgY3VycmVudFJvd0l0ZW0oKTogYW55IHtcclxuICAgIHJldHVybiB0aGlzLl9jdXJyZW50Um93SXRlbTtcclxuICB9XHJcblxyXG4gIHNldCBjdXJyZW50Um93SXRlbSh2YWx1ZTogYW55KSB7XHJcbiAgICB0aGlzLl9jdXJyZW50Um93SXRlbSA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgQElucHV0KCkgZ2V0IGRhdGFzb3VyY2UoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fZGF0YXNvdXJjZTtcclxuICB9XHJcblxyXG4gIHNldCBkYXRhc291cmNlKGRhdGFzb3VyY2U6IGFueVtdKSB7XHJcbiAgICAvL3NldCB0aGUgZGF0YSBzb3VyY2VcclxuICAgIHRoaXMuX2dvdHRlbkRhdGFzb3VyY2UgPSBkYXRhc291cmNlO1xyXG5cclxuICAgIGlmICh0aGlzLl9nb3R0ZW5EYXRhc291cmNlKSB7XHJcbiAgICAgIHRoaXMuX21hcEdvdHRlbkRhdGFTb3VyY2VUb0xvY2FsRGF0YXNvdXJjZSgpXHJcblxyXG4gICAgICB0aGlzLl9pc0lucHV0RGF0YXNvdXJjZSA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcbiAgQElucHV0KFwiYmluZFwiKSBnZXQgYmluZCgpIHtcclxuICAgIHJldHVybiB0aGlzLl9iaW5kO1xyXG4gIH1cclxuXHJcbiAgc2V0IGJpbmQodmFsdWU6IGFueSkge1xyXG4gICAgdGhpcy5fYmluZCA9IHZhbHVlO1xyXG4gICAgdGhpcy5pbnB1dEZpZWxkID0gdmFsdWU7XHJcbiAgICB0aGlzLl9vbkJpbmRTZXQoKTtcclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG4gIC8vI3JlZ2lvbiBPdXRwdXRzXHJcbiAgQE91dHB1dCgpIGJpbmRDaGFuZ2U6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQE91dHB1dChcImRhdGFzb3VyY2UtbG9hZGVkXCIpIGRhdGFTb3VyY2VMb2FkZWQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgQE91dHB1dCgpIGluaXQgPSBuZXcgRXZlbnRFbWl0dGVyPENvbWJvU3RhdHVzTW9kZWw+KCk7XHJcbiAgQE91dHB1dCgpIGlzTG9hZGVkID0gbmV3IEV2ZW50RW1pdHRlcjxDb21ib1N0YXR1c01vZGVsPigpO1xyXG4gIEBPdXRwdXQoKSBzZWxlY3RlZExhYmVsQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XHJcbiAgQE91dHB1dCgpIG9uQ2xpY2s6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQE91dHB1dCgpIG9uU2VhcmNoQnV0dG9uQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG4gIC8vI3JlZ2lvbiBjdG9yXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwdWJsaWMgZW50aXR5Q29uZmlndXJhdGlvblNlcnZpY2U6IEVudGl0eUNvbmZpZ3VyYXRpb25TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfdHNpTW9kYWxTZXJ2aWNlOiBUc2lNb2RhbFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9tZXNzYWdlU2VydmljZTogVHNpTm90aWZpY2F0aW9uU2VydmljZSxcclxuICAgIHByaXZhdGUgX2h0dHBDbGllbnQ6IEh0dHBDbGllbnQsXHJcbiAgICBwcm90ZWN0ZWQgX2NkUmVmPzogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgKSB7XHJcbiAgICBzdXBlcihfY2RSZWYpXHJcbiAgfVxyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuICAvLyNyZWdpb24gaGFuZGxlIGxpZmVjeWNsZSBob29rc1xyXG4gIG92ZXJyaWRlIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgc3VwZXIubmdPbkRlc3Ryb3koKTtcclxuICAgIHRoaXMuX3JlbG9hZFN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcclxuICB9XHJcblxyXG4gIGdldCBpc1N0YXR1c0NvbWJvKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuY29tYm9UeXBlID09PSAnc3RhdHVzJztcclxuICB9XHJcbiAgXHJcbiAgZ2V0U3RhdHVzT3B0aW9uKHZhbHVlOiBzdHJpbmcpOiBTdGF0dXNPcHRpb24gfCB1bmRlZmluZWQge1xyXG4gICAgcmV0dXJuIHRoaXMuc3RhdHVzTWV0YWRhdGE/Lm9wdGlvbnMuZmluZChvID0+IG8udHJhbnNsYXRlZExhYmVsID09PSB2YWx1ZSk7XHJcbiAgfVxyXG5cclxuICBvdmVycmlkZSBhc3luYyBuZ09uSW5pdCgpIHtcclxuICAgIHN1cGVyLm5nT25Jbml0KCk7XHJcbiAgICB0aGlzLmNoZWNrSWZBZHZhbmNlZFNlYXJjaENvbXBvbmVudEV4aXN0cygpO1xyXG4gICAgICBhd2FpdCB0aGlzLmNoZWNrSWZGb3JtTmFtZUV4aXN0cygpOyBcclxuICAgIHRoaXMuX2luaXRQYXJhbWV0ZXJzV2l0aERlZmF1bHRzKCk7XHJcbiAgICB0aGlzLl9pbml0UmVsb2FkRGF0YVNvdXJjZVN1YnNjcmlwdGlvbigpO1xyXG4gICAgYXdhaXQgdGhpcy5faW5pdGlhbExvYWREYXRhKCk7XHJcbiAgICBsZXQgbGFuZ3VlID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0ocnRsTW9kZUtleXMucnRsTW9kZUVuYWJsZWQpO1xyXG4gICAgaWYgKGxhbmd1ZSAmJiBKU09OLnBhcnNlKGxhbmd1ZSkpIHtcclxuICAgICAgdGhpcy5pc0FyID0gdHJ1ZVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMuaXNBciA9IGZhbHNlXHJcbiAgICB9XHJcblxyXG5cclxuICAgIHRoaXMubWF4V2lkdGggPSB0aGlzLm1heFdpZHRoICsgJ3JlbSc7XHJcbiAgfVxyXG4gIC8vI2VuZHJlZ2lvblxyXG4gIEBJbnB1dCgpIHNob3dTZWFyY2hCdXR0b246IGJvb2xlYW4gPSB0cnVlO1xyXG4gIEBJbnB1dCgpIHNob3dBZGRCdXR0b246IGJvb2xlYW4gPSB0cnVlO1xyXG4gIEBJbnB1dCgpIHNob3dDb25zdWx0QnV0dG9uPzogYm9vbGVhbjtcclxuICBASW5wdXQoKSBzaG93VXBkYXRlQnV0dG9uPzogYm9vbGVhbjtcclxuICBzaG93QWR2YW5jZWRTZWFyY2hCdXR0b246IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcblxyXG5cclxuICBjaGVja0lmQWR2YW5jZWRTZWFyY2hDb21wb25lbnRFeGlzdHMoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuYnVzaW5lc3NDbGFzcykge1xyXG4gICAgICB0aGlzLnNob3dBZHZhbmNlZFNlYXJjaEJ1dHRvbiA9IGZhbHNlO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLmVudGl0eUNvbmZpZ3VyYXRpb25TZXJ2aWNlLmdldEVudGl0eUluZm8odGhpcy5idXNpbmVzc0NsYXNzKS5zdWJzY3JpYmUoe1xyXG5cclxuICAgICAgbmV4dDogKGVudGl0eTogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy5zaG93QWR2YW5jZWRTZWFyY2hCdXR0b24gPSAhIWVudGl0eT8uYWR2YW5jZWRTZWFyY2hDb21wb25lbnQ7XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiAoZXJyKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xyXG4gICAgICAgIHRoaXMuc2hvd0FkdmFuY2VkU2VhcmNoQnV0dG9uID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuICBcclxuIGNoZWNrSWZGb3JtTmFtZUV4aXN0cygpOiBQcm9taXNlPHZvaWQ+IHtcclxuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcclxuICAgIGlmICghdGhpcy5idXNpbmVzc0NsYXNzKSB7XHJcbiAgICAgIGlmICh0aGlzLnNob3dBZGRCdXR0b24gPT09IHVuZGVmaW5lZCkgdGhpcy5zaG93QWRkQnV0dG9uID0gZmFsc2U7XHJcbiAgICAgIGlmICh0aGlzLnNob3dDb25zdWx0QnV0dG9uID09PSB1bmRlZmluZWQpIHRoaXMuc2hvd0NvbnN1bHRCdXR0b24gPSBmYWxzZTtcclxuICAgICAgaWYgKHRoaXMuc2hvd1VwZGF0ZUJ1dHRvbiA9PT0gdW5kZWZpbmVkKSB0aGlzLnNob3dVcGRhdGVCdXR0b24gPSBmYWxzZTtcclxuICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5lbnRpdHlDb25maWd1cmF0aW9uU2VydmljZS5nZXRFbnRpdHlJbmZvKHRoaXMuYnVzaW5lc3NDbGFzcykuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKGVudGl0eTogYW55KSA9PiB7XHJcbiAgICAgICAgY29uc3QgaGFzRm9ybSA9ICEhZW50aXR5Py5mb3JtTmFtZTtcclxuXHJcbiAgICAgICAgY29uc29sZS5sb2coXCJzaG93QWRkQnV0dG9uXCIsdGhpcy5zaG93QWRkQnV0dG9uKVxyXG5cclxuICAgICAgICBpZighaGFzRm9ybSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICB0aGlzLnNob3dBZGRCdXR0b24gPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMuc2hvd1VwZGF0ZUJ1dHRvbiA9IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy5zaG93Q29uc3VsdEJ1dHRvbiA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnNob3dDb25zdWx0QnV0dG9uID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgIHRoaXMuc2hvd0NvbnN1bHRCdXR0b24gPSB0aGlzLnNob3dBZGRCdXR0b247XHJcbiAgICAgICAgfSAgICAgICAgXHJcblxyXG4gICAgICAgIGlmICh0aGlzLnNob3dVcGRhdGVCdXR0b24gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgdGhpcy5zaG93VXBkYXRlQnV0dG9uID0gdGhpcy5zaG93QWRkQnV0dG9uO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKGVycikgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuc2hvd0FkZEJ1dHRvbiA9PT0gdW5kZWZpbmVkKSB0aGlzLnNob3dBZGRCdXR0b24gPSBmYWxzZTtcclxuICAgICAgICBpZiAodGhpcy5zaG93Q29uc3VsdEJ1dHRvbiA9PT0gdW5kZWZpbmVkKSB0aGlzLnNob3dDb25zdWx0QnV0dG9uID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKHRoaXMuc2hvd1VwZGF0ZUJ1dHRvbiA9PT0gdW5kZWZpbmVkKSB0aGlzLnNob3dVcGRhdGVCdXR0b24gPSBmYWxzZTtcclxuXHJcbiAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9KTtcclxufSAgXHJcblxyXG5cclxuICBvcGVuQWR2YW5jZWRTZWFyY2hDb21wb25lbnQoKSB7XHJcbiAgICBpZiAoIXRoaXMuYnVzaW5lc3NDbGFzcykge1xyXG4gICAgICB0aGlzLl9tZXNzYWdlU2VydmljZT8uZXJyb3IoXCJzZWFyY2hfY29tYm9fY29tcG9uZW50X25hbWVFbnRpdHlcIik7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmVudGl0eUNvbmZpZ3VyYXRpb25TZXJ2aWNlLmdldEVudGl0eUluZm8odGhpcy5idXNpbmVzc0NsYXNzKS5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6IGFzeW5jIChlbnRpdHk6IGFueSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5zaG93QWR2YW5jZWRTZWFyY2hCdXR0b24gPSAhIWVudGl0eT8uYWR2YW5jZWRTZWFyY2hDb21wb25lbnQ7XHJcbiAgICAgICAgICBpZiAoIWVudGl0eSB8fCAhZW50aXR5LmFkdmFuY2VkU2VhcmNoQ29tcG9uZW50KSB7XHJcbiAgICAgICAgICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlPy5lcnJvcihcInNlYXJjaF9jb21ib19jb21wb25lbnRfZm9ybV9uYW1lX25mXCIpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgbGV0IGNvbmY6IER5bmFtaWNEaWFsb2dDb25maWcgPSB7XHJcbiAgICAgICAgICAgIGRhdGE6IHtcclxuICAgICAgICAgICAgICBpc0FkdmFuY2VkU2VhcmNoOiB0cnVlLFxyXG4gICAgICAgICAgICAgIHNlbGVjdGlvbk1vZGU6IEdyaWRTZWxlY3Rpb25Nb2RlLlNpbmdsZSxcclxuICAgICAgICAgICAgICBtb2RlOiBDb21wb25lbnRfTW9kZXMuQ09OU1VMVCxcclxuICAgICAgICAgICAgICBjdXN0b21EYXRhOiBlbnRpdHlcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgc3R5bGVDbGFzczogJycsXHJcbiAgICAgICAgICAgIHdpZHRoOiBNb2RhbFNpemVFbnVtLk1lZGl1bS53aWR0aCxcclxuICAgICAgICAgICAgaGVpZ2h0OiBNb2RhbFNpemVFbnVtLk1lZGl1bS5oZWlnaHQsXHJcbiAgICAgICAgICAgIG1heGltaXphYmxlOiB0cnVlLFxyXG4gICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICB0aGlzLl9kaWFsb2dSZWZlcmVuY2UgPSB0aGlzLl90c2lNb2RhbFNlcnZpY2U/Lm9wZW4oVHlwZVJlZ2lzdHJ5SGVscGVyLmdldFR5cGUoZW50aXR5LmFkdmFuY2VkU2VhcmNoQ29tcG9uZW50KSwgY29uZik7XHJcblxyXG4gICAgICAgICAgdGhpcy5fZGlhbG9nUmVmZXJlbmNlPy5vbkNsb3NlLnN1YnNjcmliZSgoc2VsZWN0ZWRQZXJzb246IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWRQZXJzb24pIHtcclxuICAgICAgICAgICAgICB0aGlzLmJpbmQgPSBzZWxlY3RlZFBlcnNvbjtcclxuICAgICAgICAgICAgICB0aGlzLmJpbmRDaGFuZ2UuZW1pdCh0aGlzLmJpbmQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGVycm9yOiAoZXJyKSA9PiB7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XHJcbiAgICAgICAgICB0aGlzLnNob3dBZHZhbmNlZFNlYXJjaEJ1dHRvbiA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgb3BlblNlYXJjaERpYWxvZygpIHtcclxuICAgIGNvbnNvbGUubG9nKFwiY2xhc3M6IFwiLCB0aGlzLmJ1c2luZXNzQ2xhc3MpXHJcbiAgICBpZiAoIXRoaXMuYnVzaW5lc3NDbGFzcykge1xyXG4gICAgICB0aGlzLl9tZXNzYWdlU2VydmljZT8uZXJyb3IoXCJzZWFyY2hfY29tYm9fY29tcG9uZW50X25hbWVFbnRpdHlcIik7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5lbnRpdHlDb25maWd1cmF0aW9uU2VydmljZS5nZXRFbnRpdHlJbmZvKHRoaXMuYnVzaW5lc3NDbGFzcykuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiBhc3luYyAoZW50aXR5OiBhbnkpID0+IHtcclxuICAgICAgICAgIGxldCBjb25mOiBEeW5hbWljRGlhbG9nQ29uZmlnID0ge1xyXG4gICAgICAgICAgICBkYXRhOiB7IGlzQWR2YW5jZWRTZWFyY2g6IHRydWUsIHNlbGVjdGlvbk1vZGU6IEdyaWRTZWxlY3Rpb25Nb2RlLlNpbmdsZSwgbW9kZTogQ29tcG9uZW50X01vZGVzLkNPTlNVTFQsIGN1c3RvbURhdGE6IGVudGl0eSB9LFxyXG4gICAgICAgICAgICBzdHlsZUNsYXNzOiAnJyxcclxuICAgICAgICAgICAgd2lkdGg6IE1vZGFsU2l6ZUVudW0uTWVkaXVtLndpZHRoLFxyXG4gICAgICAgICAgICBoZWlnaHQ6IE1vZGFsU2l6ZUVudW0uTWVkaXVtLmhlaWdodCxcclxuICAgICAgICAgICAgbWF4aW1pemFibGU6IHRydWUsXHJcbiAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgIGlmICghZW50aXR5IHx8ICFlbnRpdHkubGlzdENvbXBvbmVudCkge1xyXG4gICAgICAgICAgICB0aGlzLl9tZXNzYWdlU2VydmljZT8uZXJyb3IoXCJzZWFyY2hfY29tYm9fY29tcG9uZW50X2Zvcm1fbmFtZV9uZlwiKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5fZGlhbG9nUmVmZXJlbmNlID0gdGhpcy5fdHNpTW9kYWxTZXJ2aWNlPy5vcGVuKFR5cGVSZWdpc3RyeUhlbHBlci5nZXRUeXBlKGVudGl0eS5saXN0Q29tcG9uZW50KSwgY29uZik7XHJcbiAgICAgICAgICB0aGlzLl9kaWFsb2dSZWZlcmVuY2U/Lm9uQ2xvc2Uuc3Vic2NyaWJlKChzZWxlY3RlZFBlcnNvbjogYW55KSA9PiB7XHJcblxyXG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWRQZXJzb24pIHtcclxuICAgICAgICAgICAgICB0aGlzLmJpbmQgPSBzZWxlY3RlZFBlcnNvbjtcclxuICAgICAgICAgICAgICB0aGlzLmJpbmRDaGFuZ2UuZW1pdCh0aGlzLmJpbmQpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6IChlcnIpID0+IHtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuICBhZGRFbGVtZW50KCkge1xyXG4gICAgaWYgKCF0aGlzLmJ1c2luZXNzQ2xhc3MpIHtcclxuICAgICAgdGhpcy5fbWVzc2FnZVNlcnZpY2U/LmVycm9yKFwic2VhcmNoX2NvbWJvX2NvbXBvbmVudF9uYW1lRW50aXR5XCIpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMuZW50aXR5Q29uZmlndXJhdGlvblNlcnZpY2UuZ2V0RW50aXR5SW5mbyh0aGlzLmJ1c2luZXNzQ2xhc3MpLnN1YnNjcmliZSh7XHJcbiAgICAgICAgbmV4dDogYXN5bmMgKGVudGl0eTogYW55KSA9PiB7XHJcbiAgICAgICAgICBsZXQgY29uZjogRHluYW1pY0RpYWxvZ0NvbmZpZyA9IHtcclxuICAgICAgICAgICAgZGF0YTogeyBtb2RlOiBDb21wb25lbnRfTW9kZXMuQ1JFQVRFLCBjdXN0b21EYXRhOiBlbnRpdHkgfSxcclxuICAgICAgICAgICAgc3R5bGVDbGFzczogJycsXHJcbiAgICAgICAgICAgIHdpZHRoOiBNb2RhbFNpemVFbnVtLk1lZGl1bS53aWR0aCxcclxuICAgICAgICAgICAgaGVpZ2h0OiBNb2RhbFNpemVFbnVtLk1lZGl1bS5oZWlnaHQsXHJcbiAgICAgICAgICAgIG1heGltaXphYmxlOiB0cnVlLFxyXG4gICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICBpZiAoIWVudGl0eSB8fCAhZW50aXR5LmZvcm1OYW1lKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlPy5lcnJvcihcInNlYXJjaF9jb21ib19jb21wb25lbnRfZm9ybV9uYW1lX25mXCIpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLl9kaWFsb2dSZWZlcmVuY2UgPSB0aGlzLl90c2lNb2RhbFNlcnZpY2U/Lm9wZW4oVHlwZVJlZ2lzdHJ5SGVscGVyLmdldFR5cGUoZW50aXR5LmZvcm1OYW1lKSwgY29uZik7XHJcbiAgICAgICAgICB0aGlzLl9kaWFsb2dSZWZlcmVuY2U/Lm9uQ2xvc2Uuc3Vic2NyaWJlKChzYXZlZEVsZW1lbnQ6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoc2F2ZWRFbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiBzYXZlZEVsZW1lbnQgPT09ICdvYmplY3QnICYmIHNhdmVkRWxlbWVudCAhPT0gbnVsbCAmJiAndWlkJyBpbiBzYXZlZEVsZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYmluZCA9IHNhdmVkRWxlbWVudD8udWlkO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5iaW5kQ2hhbmdlLmVtaXQodGhpcy5iaW5kKVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlb2Ygc2F2ZWRFbGVtZW50ID09PSAnc3RyaW5nJyAmJiBHdWlkLmlzVmFsaWQoc2F2ZWRFbGVtZW50KSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5iaW5kID0gc2F2ZWRFbGVtZW50O1xyXG4gICAgICAgICAgICAgICAgdGhpcy5iaW5kQ2hhbmdlLmVtaXQodGhpcy5iaW5kKVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvcjogKGVycikgPT4ge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB1cGRhdGVFbGVtZW50KCkge1xyXG4gIGlmICghdGhpcy5idXNpbmVzc0NsYXNzKSB7XHJcbiAgICB0aGlzLl9tZXNzYWdlU2VydmljZT8uZXJyb3IoXCJzZWFyY2hfY29tYm9fY29tcG9uZW50X25hbWVFbnRpdHlcIik7XHJcbiAgICByZXR1cm47XHJcbiAgfVxyXG5cclxuICBpZiAoIXRoaXMuYmluZCkge1xyXG4gICAgdGhpcy5fbWVzc2FnZVNlcnZpY2U/LmVycm9yKFwiQXVjdW4gw6lsw6ltZW50IHPDqWxlY3Rpb25uw6kgcG91ciBsYSBtaXNlIMOgIGpvdXIuXCIpO1xyXG4gICAgcmV0dXJuO1xyXG4gIH1cclxuXHJcbiAgdGhpcy5lbnRpdHlDb25maWd1cmF0aW9uU2VydmljZS5nZXRFbnRpdHlJbmZvKHRoaXMuYnVzaW5lc3NDbGFzcykuc3Vic2NyaWJlKHtcclxuICAgIG5leHQ6IGFzeW5jIChlbnRpdHk6IGFueSkgPT4ge1xyXG4gICAgICBpZiAoIWVudGl0eSB8fCAhZW50aXR5LmZvcm1OYW1lKSB7XHJcbiAgICAgICAgdGhpcy5fbWVzc2FnZVNlcnZpY2U/LmVycm9yKFwic2VhcmNoX2NvbWJvX2NvbXBvbmVudF9mb3JtX25hbWVfbmZcIik7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGxldCBjb25mOiBEeW5hbWljRGlhbG9nQ29uZmlnID0ge1xyXG4gICAgICAgIGRhdGE6IHtcclxuICAgICAgICAgIG1vZGU6IENvbXBvbmVudF9Nb2Rlcy5FRElULFxyXG4gICAgICAgICAgY3VzdG9tRGF0YTogZW50aXR5LFxyXG4gICAgICAgICAgaWQ6IHRoaXMuYmluZFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgXHJcbiAgICAgICAgc3R5bGVDbGFzczogJycsXHJcbiAgICAgICAgd2lkdGg6IE1vZGFsU2l6ZUVudW0uTWVkaXVtLndpZHRoLFxyXG4gICAgICAgIGhlaWdodDogTW9kYWxTaXplRW51bS5NZWRpdW0uaGVpZ2h0LFxyXG4gICAgICAgIG1heGltaXphYmxlOiB0cnVlLFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgdGhpcy5fZGlhbG9nUmVmZXJlbmNlID0gdGhpcy5fdHNpTW9kYWxTZXJ2aWNlPy5vcGVuKFR5cGVSZWdpc3RyeUhlbHBlci5nZXRUeXBlKGVudGl0eS5mb3JtTmFtZSksIGNvbmYpO1xyXG5cclxuICAgICAgdGhpcy5fZGlhbG9nUmVmZXJlbmNlPy5vbkNsb3NlLnN1YnNjcmliZSgodXBkYXRlZEVsZW1lbnQ6IGFueSkgPT4ge1xyXG4gICAgICBpZiAodXBkYXRlZEVsZW1lbnQpIHtcclxuICAgICAgICBpZiAodHlwZW9mIHVwZGF0ZWRFbGVtZW50ID09PSAnb2JqZWN0JyAmJiB1cGRhdGVkRWxlbWVudCAhPT0gbnVsbCAmJiAndWlkJyBpbiB1cGRhdGVkRWxlbWVudCkge1xyXG4gICAgICAgICAgdGhpcy5iaW5kID0gdXBkYXRlZEVsZW1lbnQudWlkO1xyXG4gICAgICAgICAgdGhpcy5iaW5kQ2hhbmdlLmVtaXQodGhpcy5iaW5kKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB1cGRhdGVkRWxlbWVudCA9PT0gJ3N0cmluZycgJiYgR3VpZC5pc1ZhbGlkKHVwZGF0ZWRFbGVtZW50KSkge1xyXG4gICAgICAgICAgdGhpcy5iaW5kID0gdXBkYXRlZEVsZW1lbnQ7XHJcbiAgICAgICAgICB0aGlzLmJpbmRDaGFuZ2UuZW1pdCh0aGlzLmJpbmQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG59KTtcclxuICAgIH0sXHJcbiAgICBlcnJvcjogKGVycikgPT4ge1xyXG4gICAgICBjb25zb2xlLmVycm9yKGVycik7XHJcbiAgICB9XHJcbiAgfSk7XHJcbn1cclxuY29uc3VsdEVsZW1lbnQoKSB7XHJcbiAgaWYgKCF0aGlzLmJ1c2luZXNzQ2xhc3MpIHtcclxuICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlPy5lcnJvcihcInNlYXJjaF9jb21ib19jb21wb25lbnRfbmFtZUVudGl0eVwiKTtcclxuICAgIHJldHVybjtcclxuICB9XHJcblxyXG4gIGlmICghdGhpcy5iaW5kKSB7XHJcbiAgICB0aGlzLl9tZXNzYWdlU2VydmljZT8uZXJyb3IoXCJBdWN1biDDqWzDqW1lbnQgc8OpbGVjdGlvbm7DqSBwb3VyIGxhIGNvbnN1bHRhdGlvbi5cIik7XHJcbiAgICByZXR1cm47XHJcbiAgfVxyXG5cclxuICB0aGlzLmVudGl0eUNvbmZpZ3VyYXRpb25TZXJ2aWNlLmdldEVudGl0eUluZm8odGhpcy5idXNpbmVzc0NsYXNzKS5zdWJzY3JpYmUoe1xyXG4gICAgbmV4dDogYXN5bmMgKGVudGl0eTogYW55KSA9PiB7XHJcbiAgICAgIGlmICghZW50aXR5IHx8ICFlbnRpdHkuZm9ybU5hbWUpIHtcclxuICAgICAgICB0aGlzLl9tZXNzYWdlU2VydmljZT8uZXJyb3IoXCJzZWFyY2hfY29tYm9fY29tcG9uZW50X2Zvcm1fbmFtZV9uZlwiKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IGNvbmY6IER5bmFtaWNEaWFsb2dDb25maWcgPSB7XHJcbiAgICAgICAgZGF0YToge1xyXG4gICAgICAgICAgbW9kZTogQ29tcG9uZW50X01vZGVzLkNPTlNVTFQsXHJcbiAgICAgICAgICBjdXN0b21EYXRhOiBlbnRpdHksXHJcbiAgICAgICAgICBpZDogdGhpcy5iaW5kICAgXHJcbiAgICAgICAgfSxcclxuICAgICAgICBzdHlsZUNsYXNzOiAnJyxcclxuICAgICAgICB3aWR0aDogTW9kYWxTaXplRW51bS5NZWRpdW0ud2lkdGgsXHJcbiAgICAgICAgaGVpZ2h0OiBNb2RhbFNpemVFbnVtLk1lZGl1bS5oZWlnaHQsXHJcbiAgICAgICAgbWF4aW1pemFibGU6IHRydWUsXHJcbiAgICAgIH07XHJcblxyXG4gICAgICB0aGlzLl9kaWFsb2dSZWZlcmVuY2UgPSB0aGlzLl90c2lNb2RhbFNlcnZpY2U/Lm9wZW4oXHJcbiAgICAgICAgVHlwZVJlZ2lzdHJ5SGVscGVyLmdldFR5cGUoZW50aXR5LmZvcm1OYW1lKSxcclxuICAgICAgICBjb25mXHJcbiAgICAgICk7XHJcblxyXG4gICAgICB0aGlzLl9kaWFsb2dSZWZlcmVuY2U/Lm9uQ2xvc2Uuc3Vic2NyaWJlKChfKSA9PiB7XHJcbiAgICAgIH0pO1xyXG4gICAgfSxcclxuICAgIGVycm9yOiAoZXJyKSA9PiB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJldXIgbG9ycyBkZSBsYSByw6ljdXDDqXJhdGlvbiBkZXMgaW5mb3MgZCdlbnRpdMOpIDpcIiwgZXJyKTtcclxuICAgIH1cclxuICB9KTtcclxufVxyXG5cclxuXHJcbiAgLy8jcmVnaW9uIGhhbmRsZSBldmVudHNcclxuICBiaW5kVmFsdWVDaGFuZ2VkKGV2ZW50OiBhbnkpIHtcclxuICAgIHRoaXMuYmluZCA9IGV2ZW50LnZhbHVlO1xyXG4gICAgaWYgKHRoaXMuYmluZCAhPT0gbnVsbCAmJiB0aGlzLmJpbmQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aGlzLl9zZWxlY3RlZCA9IHRoaXMuYmluZFxyXG4gICAgfVxyXG4gICAgdGhpcy5iaW5kQ2hhbmdlLmVtaXQoZXZlbnQudmFsdWUpO1xyXG5cclxuICAgIGlmICghdGhpcy5fYmluZENoYW5nZUVtaXR0ZWQpIHtcclxuICAgICAgdGhpcy5fYmluZENoYW5nZUVtaXR0ZWQgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBzZWxlY3RlZEVsZW1lbnQ6IGFueSA9IHRoaXMuZGF0YXNvdXJjZS5maW5kKGUgPT4gZS5pZCA9PSB0aGlzLmJpbmQpO1xyXG4gICAgaWYgKHNlbGVjdGVkRWxlbWVudCkge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkTGFiZWxDaGFuZ2UuZW1pdChzZWxlY3RlZEVsZW1lbnQubGFiZWwpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2VhcmNoVmFsdWVDaGFuZ2VkKHNlYXJjaFZhbHVlOiBhbnkpIHtcclxuICAgIGlmICh0aGlzLmlzRmlsdGVyZWQgJiYgIXRoaXMuX2lzSW5wdXREYXRhc291cmNlKSB7XHJcbiAgICAgIHRoaXMuX2xvYWRTZXJ2ZXJTaWRlUGFnZWREYXRhU291cmNlKHNlYXJjaFZhbHVlLmZpbHRlcik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbk9wZW4oKSB7XHJcbiAgICBpZiAodGhpcy5pc0ZpbHRlcmVkIHx8IHR5cGVvZiB0aGlzLmxpc3RTb3VyY2VVcmwgPT0gXCJmdW5jdGlvblwiKSB7XHJcbiAgICAgIHRoaXMuX2xvYWREYXRhU291cmNlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbkhpZGUoKSB7XHJcbiAgICBpZiAodGhpcy5kYXRhTG9hZGVkKSB7XHJcbiAgICAgIHRoaXMuYmluZCA9IHRoaXMuX3NlbGVjdGVkXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjbGVhclNlbGVjdGVkVmFsdWUoKSB7XHJcbiAgICB0aGlzLl9zZWxlY3RlZCA9IHVuZGVmaW5lZFxyXG4gIH1cclxuICAvLyNlbmRyZWdpb25cclxuXHJcbiAgLy8jcmVnaW9uIHByaXZhdGUgbWV0aG9kc1xyXG4gIHByaXZhdGUgX2xvYWREYXRhU291cmNlKCkge1xyXG4gICAgaWYgKCF0aGlzLl9pc0lucHV0RGF0YXNvdXJjZSkge1xyXG4gICAgICBpZiAodGhpcy5pc0ZpbHRlcmVkKSB7XHJcbiAgICAgICAgdGhpcy5fbG9hZFNlcnZlclNpZGVQYWdlZERhdGFTb3VyY2UoKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICB0aGlzLl9sb2FkTm90U2VydmVyU2lkZVBhZ2VkRGF0YVNvdXJjZSgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9sb2FkU2VydmVyU2lkZVBhZ2VkRGF0YVNvdXJjZShrZXl3b3JkOiBzdHJpbmcgPSBcIlwiKSB7XHJcbiAgICBpZiAodGhpcy5fdmFsaWRhdGVMaXN0SW5wdXRzKCkpIHtcclxuICAgICAgdGhpcy5fZGF0YXNvdXJjZSA9IFtdO1xyXG4gICAgICB0aGlzLmRhdGFMb2FkZWQgPSBmYWxzZTtcclxuICAgICAgdGhpcy5faHR0cENsaWVudC5nZXQodGhpcy5faW5pdExpc3REYXRhU291cmNlRW5kcG9pbnQoKSwgdGhpcy5fZ2VuZXJhdGVIdHRwUGFyYW1zKGtleXdvcmQpKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgbmV4dDogKGRhdGE6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLl9nb3R0ZW5EYXRhc291cmNlID0gZGF0YTtcclxuICAgICAgICAgICAgdGhpcy5fbWFwR290dGVuRGF0YVNvdXJjZVRvTG9jYWxEYXRhc291cmNlKCk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmRhdGFMb2FkZWQgPSBmYWxzZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgKTtcclxuXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9sb2FkTm90U2VydmVyU2lkZVBhZ2VkRGF0YVNvdXJjZSgpIHtcclxuICAgIGlmICh0aGlzLl92YWxpZGF0ZUxpc3RJbnB1dHMoKSkge1xyXG4gICAgICB0aGlzLl9kYXRhc291cmNlID0gW107XHJcbiAgICAgIHRoaXMuZGF0YUxvYWRlZCA9IGZhbHNlO1xyXG4gICAgICB0aGlzLl9odHRwQ2xpZW50LmdldCh0aGlzLl9pbml0TGlzdERhdGFTb3VyY2VFbmRwb2ludCgpKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgbmV4dDogKGRhdGE6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLl9nb3R0ZW5EYXRhc291cmNlID0gZGF0YTtcclxuICAgICAgICAgICAgdGhpcy5fbWFwR290dGVuRGF0YVNvdXJjZVRvTG9jYWxEYXRhc291cmNlKCk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmRhdGFMb2FkZWQgPSBmYWxzZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgKTtcclxuXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIF9sb2FkQmluZEVsZW1lbnQoKSB7XHJcbiAgICBpZiAodGhpcy5fdmFsaWRhdGVCaW5kRWxlbWVudElucHV0cygpKSB7XHJcbiAgICAgIGlmICh0aGlzLmJpbmQpIHtcclxuICAgICAgICB0aGlzLl9kYXRhc291cmNlID0gW107XHJcbiAgICAgICAgdGhpcy5kYXRhTG9hZGVkID0gZmFsc2U7XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICBjb25zdCBkYXRhOiBhbnkgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbSh0aGlzLl9odHRwQ2xpZW50LmdldCh0aGlzLl9pbml0RWxlbWVudEVuZHBvaW50KCkpKTtcclxuXHJcbiAgICAgICAgICBsZXQgdGVtcEFycmF5OiBhbnlbXSA9IFtdO1xyXG4gICAgICAgICAgbGV0IG9iaiA9IHtcclxuICAgICAgICAgICAgaWQ6IGRhdGFbdGhpcy5pZEZpZWxkXSxcclxuICAgICAgICAgICAgbGFiZWw6IGRhdGFbdGhpcy5sYWJlbEZpZWxkXVxyXG4gICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICB0aGlzLl9zZWxlY3RlZCA9IG9iai5pZDtcclxuICAgICAgICAgIHRlbXBBcnJheS5wdXNoKG9iaik7XHJcbiAgICAgICAgICB0aGlzLl9kYXRhc291cmNlID0gdGVtcEFycmF5O1xyXG4gICAgICAgICAgdGhpcy5kYXRhTG9hZGVkID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkTGFiZWxDaGFuZ2UuZW1pdChvYmoubGFiZWwpO1xyXG4gICAgICAgICAgdGhpcy5kYXRhU291cmNlTG9hZGVkLmVtaXQoKTtcclxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgdGhpcy5kYXRhTG9hZGVkID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9jb21wYXJlRnVuY3Rpb24oKTogKGE6IGFueSwgYjogYW55KSA9PiBudW1iZXIge1xyXG4gICAgcmV0dXJuIChhLCBiKSA9PiB7XHJcbiAgICAgIGlmIChhLmxhYmVsID4gYi5sYWJlbCkgeyByZXR1cm4gMTsgfVxyXG4gICAgICBpZiAoYS5sYWJlbCA8IGIubGFiZWwpIHsgcmV0dXJuIC0xOyB9XHJcbiAgICAgIHJldHVybiAwO1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3ZhbGlkYXRlTGlzdElucHV0cygpOiBib29sZWFuIHtcclxuICAgIGlmICh0aGlzLmxpc3RTb3VyY2VVcmwgPT0gdW5kZWZpbmVkIHx8IHRoaXMubGlzdFNvdXJjZVVybCA9PT0gJycpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdsaXN0U291cmNlVXJsIHVybCBub3QgZGVmaW5lZCcpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF92YWxpZGF0ZUJpbmRFbGVtZW50SW5wdXRzKCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMuZWxlbWVudFNvdXJjZVVybCA9PSB1bmRlZmluZWQgfHwgdGhpcy5lbGVtZW50U291cmNlVXJsID09PSAnJykge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2VsZW1lbnRTb3VyY2VVcmwgbm90IGRlZmluZWQnKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2luaXRQYXJhbWV0ZXJzV2l0aERlZmF1bHRzKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuaWRGaWVsZCA9PSB1bmRlZmluZWQgfHwgdGhpcy5pZEZpZWxkID09PSBcIlwiKSB7XHJcbiAgICAgIHRoaXMuaWRGaWVsZCA9IFwiaWRcIjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5sYWJlbEZpZWxkID09IHVuZGVmaW5lZCB8fCB0aGlzLmxhYmVsRmllbGQgPT09IFwiXCIpIHtcclxuICAgICAgdGhpcy5sYWJlbEZpZWxkID0gXCJsaWJlbGxlXCI7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9pbml0RWxlbWVudEVuZHBvaW50KCk6IHN0cmluZyB7XHJcbiAgICBpZiAodGhpcy5iaW5kKSB7XHJcbiAgICAgIHJldHVybiBlbmNvZGVVUkkoYCR7dGhpcy5lbGVtZW50U291cmNlVXJsfS8ke3RoaXMuYmluZH1gKTtcclxuICAgIH1cclxuICAgIGVsc2UgdGhyb3cgbmV3IEVycm9yKCdubyBiaW5kIGlucHV0IHdhcyBwcm92aWRlZCwgY2Fubm90IGNyZWF0ZSBiaW5kRWxlbWVudFVybCcpXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9pbml0TGlzdERhdGFTb3VyY2VFbmRwb2ludCgpOiBzdHJpbmcge1xyXG4gICAgaWYgKCF0aGlzLmxpc3RTb3VyY2VVcmwpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCd5b3UgbXVzdCBwcm92aWRlIHRoZSBsaXN0IHNvdXJjZSB1cmwnKVxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0eXBlb2YgdGhpcy5saXN0U291cmNlVXJsID09IFwic3RyaW5nXCIpIHtcclxuICAgICAgcmV0dXJuIGVuY29kZVVSSShgJHt0aGlzLmxpc3RTb3VyY2VVcmx9YCk7XHJcbiAgICB9XHJcbiAgICBpZiAodHlwZW9mIHRoaXMubGlzdFNvdXJjZVVybCA9PSBcImZ1bmN0aW9uXCIpIHtcclxuICAgICAgbGV0IHRlbXBMaXN0U291cmNlVXJsID0gdGhpcy5saXN0U291cmNlVXJsKHRoaXMuY3VycmVudFJvd0l0ZW0pXHJcbiAgICAgIHJldHVybiBlbmNvZGVVUkkoYCR7dGVtcExpc3RTb3VyY2VVcmx9YClcclxuICAgIH1cclxuICAgIHJldHVybiBcIlwiXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIF9pbml0aWFsTG9hZERhdGEoKSB7XHJcbiAgICBpZiAodGhpcy5faXNJbnB1dERhdGFzb3VyY2UpIHtcclxuICAgICAgdGhpcy5fbWFwR290dGVuRGF0YVNvdXJjZVRvTG9jYWxEYXRhc291cmNlKCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKHRoaXMuaXNGaWx0ZXJlZCkge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuX2xvYWRCaW5kRWxlbWVudCgpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRoaXMuX2xvYWROb3RTZXJ2ZXJTaWRlUGFnZWREYXRhU291cmNlKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgX29uQmluZFNldCgpIHtcclxuICAgIGlmICh0aGlzLmlzRmlsdGVyZWQgJiYgIXRoaXMuX2JpbmRDaGFuZ2VFbWl0dGVkICYmICF0aGlzLl9pc0lucHV0RGF0YXNvdXJjZSkge1xyXG4gICAgICBhd2FpdCB0aGlzLl9sb2FkQmluZEVsZW1lbnQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2xvYWRBbGxEYXRhKCkge1xyXG4gICAgaWYgKHRoaXMuaXNGaWx0ZXJlZCkge1xyXG4gICAgICB0aGlzLl9sb2FkU2VydmVyU2lkZVBhZ2VkRGF0YVNvdXJjZSgpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMuX2xvYWROb3RTZXJ2ZXJTaWRlUGFnZWREYXRhU291cmNlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9pbml0UmVsb2FkRGF0YVNvdXJjZVN1YnNjcmlwdGlvbigpIHtcclxuICAgIGlmICh0aGlzLnJlbG9hZERhdGFTb3VyY2UpIHtcclxuICAgICAgdGhpcy5fcmVsb2FkU3Vic2NyaXB0aW9uID0gdGhpcy5yZWxvYWREYXRhU291cmNlLnN1YnNjcmliZShcclxuICAgICAgICAoZGF0YTogYW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAodHlwZW9mIChkYXRhKSA9PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICBpZiAoZGF0YSAhPSB1bmRlZmluZWQgJiYgZGF0YSAhPSBudWxsICYmIGRhdGEgIT0gJycpIHtcclxuICAgICAgICAgICAgICB0aGlzLmxpc3RTb3VyY2VVcmwgPSBkYXRhO1xyXG4gICAgICAgICAgICAgIHRoaXMuX2xvYWRBbGxEYXRhKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoZGF0YSkpIHtcclxuICAgICAgICAgICAgdGhpcy5kYXRhc291cmNlID0gZGF0YVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX21hcEdvdHRlbkRhdGFTb3VyY2VUb0xvY2FsRGF0YXNvdXJjZSgpOiB2b2lkIHtcclxuICAgIGxldCB0ZW1wQXJyYXk6IGFueVtdID0gW107XHJcbiAgICB0aGlzLl9nb3R0ZW5EYXRhc291cmNlLmZvckVhY2goKGVsZW1lbnQ6IGFueSkgPT4ge1xyXG4gICAgICBsZXQgb2JqID0ge1xyXG4gICAgICAgIGlkOiBlbGVtZW50W3RoaXMuaWRGaWVsZF0sXHJcbiAgICAgICAgbGFiZWw6IGVsZW1lbnRbdGhpcy5sYWJlbEZpZWxkXVxyXG4gICAgICB9O1xyXG4gICAgICB0ZW1wQXJyYXkucHVzaChvYmopO1xyXG4gICAgfSlcclxuICAgIHRoaXMuX2RhdGFzb3VyY2UgPSB0ZW1wQXJyYXk7XHJcbiAgICBpZiAodGhpcy5zb3J0KSB7XHJcbiAgICAgIHRoaXMuX2RhdGFzb3VyY2Uuc29ydCh0aGlzLl9jb21wYXJlRnVuY3Rpb24oKSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmRhdGFMb2FkZWQgPSB0cnVlO1xyXG4gICAgdGhpcy5kYXRhU291cmNlTG9hZGVkLmVtaXQoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2dlbmVyYXRlSHR0cFBhcmFtcyhrZXl3b3JkOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBhbnkge1xyXG4gICAgLy9pbml0IHBhcmFtc1xyXG4gICAgbGV0IHBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKCk7XHJcbiAgICBwYXJhbXMgPSBwYXJhbXMuYXBwZW5kKCd2YWx1ZScsIGtleXdvcmQgPz8gJycpO1xyXG5cclxuICAgIHJldHVybiB7IHBhcmFtczogcGFyYW1zIH07XHJcbiAgfVxyXG5cclxuICBvblNlYXJjaENvbWJvQ2xpY2soZXZlbnQ6IGFueSkge1xyXG4gICAgdGhpcy5vbkNsaWNrLmVtaXQoZXZlbnQpO1xyXG4gIH1cclxuICAvLyNlbmRyZWdpb25cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwiZmxleFwiPlxyXG4gIDxwLWRyb3Bkb3duIFtwbGFjZWhvbGRlcl09XCJwbGFjZUhvbGRlclwiIGNsYXNzPVwie3tteVN0eWxlQ2xhc3N9fVwiIFtyZXF1aXJlZF09XCJpc1JlcXVpcmVkXCJcclxuICAgIHN0eWxlQ2xhc3M9XCJ7e215U3R5bGVDbGFzc319IGJvcmRlci1yYWRpdXMtNyB7e3ZhbGlkYXRpb25TdGF0dXNDc3NDbGFzc319XCIgYXBwZW5kVG89XCJib2R5XCIgb3B0aW9uTGFiZWw9XCJsYWJlbFwiXHJcbiAgICBvcHRpb25WYWx1ZT1cImlkXCIgZmlsdGVyQnk9XCJsYWJlbFwiIFtvcHRpb25zXT1cImRhdGFzb3VyY2VcIiBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIiBbbGF6eV09XCIhZGF0YUxvYWRlZFwiXHJcbiAgICBbKG5nTW9kZWwpXT1cImJpbmRcIiBbZmlsdGVyXT1cInRydWVcIiBbc2hvd0NsZWFyXT1cInNob3dDbGVhclwiIFthdXRvRGlzcGxheUZpcnN0XT1cImZhbHNlXCJcclxuICAgIChvbkNoYW5nZSk9XCJiaW5kVmFsdWVDaGFuZ2VkKCRldmVudClcIiAob25IaWRlKT1cIm9uSGlkZSgpXCIgKG9uU2hvdyk9XCJvbk9wZW4oKVwiXHJcbiAgICAob25GaWx0ZXIpPVwic2VhcmNoVmFsdWVDaGFuZ2VkKCRldmVudClcIiAob25DbGVhcik9XCJjbGVhclNlbGVjdGVkVmFsdWUoKVwiIChvbkNsaWNrKT1cIm9uU2VhcmNoQ29tYm9DbGljaygkZXZlbnQpXCJcclxuICAgIFtzdHlsZV09XCJ7J21heC13aWR0aCc6IG1heFdpZHRoLCAnd2lkdGgnOicxMDAlJywgJ2hlaWdodCc6ICcxLjdyZW0nfVwiXHJcbiAgICBbbmdDbGFzc109XCJpc0FyID8gJ3AtZHJvcGRvd24tY2xlYXItaWNvbkFSJzogJ3AtZHJvcGRvd24tY2xlYXItaWNvbkZSJyBcIj5cclxuICAgIDwhLS0gQWpvdXQgZCd1biBib3V0b24gZGFucyBsZSBkcm9wZG93biAtLT5cclxuICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duLWhlYWRlciBmbGV4IGdhcC0xIHB0LTIgcHgtMlwiPlxyXG4gICAgICAgIDxUc2ktQnV0dG9uICpuZ0lmPVwic2hvd1NlYXJjaEJ1dHRvblwiIHR5cGU9XCJidXR0b25cIiBpY29uPVwicGkgcGktc2VhcmNoXCIgdGl0bGU9XCJ0aXRsZS1zZWFyY2gtY29tYm8tT3V2cmlyXCJcclxuICAgICAgICAgIHN0eWxlQ2xhc3M9XCJwLWJ1dHRvbi1wcmltYXJ5IGhvdmVyOnNoYWRvdy02IGgtMnJlbSBwLWJ1dHRvbi1pY29uLW9ubHlcIiAoY2xpY2spPVwib3BlblNlYXJjaERpYWxvZygpXCI+XHJcbiAgICAgICAgPC9Uc2ktQnV0dG9uPlxyXG5cclxuICAgICAgICA8VHNpLUJ1dHRvbiAqbmdJZj1cInNob3dBZGRCdXR0b25cIiB0eXBlPVwiYnV0dG9uXCIgaWNvbj1cInBpIHBpLXBsdXNcIiB0aXRsZT1cInRpdGxlLXNlYXJjaC1jb21iby1Bam91dGVyXCJcclxuICAgICAgICAgIHN0eWxlQ2xhc3M9XCJwLWJ1dHRvbi1zdWNjZXNzIGhvdmVyOnNoYWRvdy02IGgtMnJlbSBwLWJ1dHRvbi1pY29uLW9ubHlcIiAoY2xpY2spPVwiYWRkRWxlbWVudCgpXCI+XHJcbiAgICAgICAgPC9Uc2ktQnV0dG9uPlxyXG5cclxuICAgICAgICA8VHNpLUJ1dHRvbiAqbmdJZj1cInNob3dBZHZhbmNlZFNlYXJjaEJ1dHRvblwiIHR5cGU9XCJidXR0b25cIiBpY29uPVwicGkgcGktc29ydC1hbW91bnQtZG93blwiXHJcbiAgICAgICAgICB0aXRsZT1cIkxpc3RlciBsZXMgYXJ0aWNsZXMgcGl2b3TDqXNcIiBzdHlsZUNsYXNzPVwicC1idXR0b24tc2Vjb25kYXJ5IGhvdmVyOnNoYWRvdy02IGgtMnJlbSBwLWJ1dHRvbi1pY29uLW9ubHlcIlxyXG4gICAgICAgICAgKGNsaWNrKT1cIm9wZW5BZHZhbmNlZFNlYXJjaENvbXBvbmVudCgpXCI+XHJcbiAgICAgICAgPC9Uc2ktQnV0dG9uPlxyXG5cclxuICAgICAgICA8VHNpLUJ1dHRvbiAqbmdJZj1cInNob3dDb25zdWx0QnV0dG9uXCIgdHlwZT1cImJ1dHRvblwiIGljb249XCJwaSBwaS1leWVcIiB0aXRsZT1cInRpdGxlLXNlYXJjaC1jb21iby1Db25zdWx0ZXJcIlxyXG4gICAgICAgICAgc3R5bGVDbGFzcz1cInAtYnV0dG9uLXByaW1hcnkgaG92ZXI6c2hhZG93LTYgaC0ycmVtIHAtYnV0dG9uLWljb24tb25seVwiIChjbGljayk9XCJjb25zdWx0RWxlbWVudCgpXCI+XHJcbiAgICAgICAgPC9Uc2ktQnV0dG9uPlxyXG5cclxuICAgICAgICA8VHNpLUJ1dHRvbiAqbmdJZj1cInNob3dVcGRhdGVCdXR0b25cIiB0eXBlPVwiYnV0dG9uXCIgaWNvbj1cInBpIHBpLXBlbmNpbFwiIHRpdGxlPVwidGl0bGUtc2VhcmNoLWNvbWJvLXVwZGF0ZVwiXHJcbiAgICAgICAgICBzdHlsZUNsYXNzPVwicC1idXR0b24tcHJpbWFyeSBob3ZlcjpzaGFkb3ctNiBoLTJyZW0gcC1idXR0b24taWNvbi1vbmx5XCIgKGNsaWNrKT1cInVwZGF0ZUVsZW1lbnQoKVwiPlxyXG4gICAgICAgIDwvVHNpLUJ1dHRvbj5cclxuXHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgIDxuZy10ZW1wbGF0ZSBsZXQtdGFyZ2V0IHBUZW1wbGF0ZT1cIml0ZW1cIj5cclxuICAgICAgPGRpdiBwVG9vbHRpcD1cInt7dGFyZ2V0LmxhYmVsfX1cIiB0b29sdGlwUG9zaXRpb249XCJ0b3BcIiB0b29sdGlwU3R5bGVDbGFzcz1cImN1c3RvbS10b29sdGlwXCI+XHJcblxyXG4gICAgICAgIFxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc1N0YXR1c0NvbWJvICYmIHN0YXR1c01ldGFkYXRhOyBlbHNlIG5vcm1hbE9wdGlvblwiPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImdldFN0YXR1c09wdGlvbih0YXJnZXQubGFiZWwpIGFzIG9wdFwiPlxyXG4gICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmb250LWJvbGQgc3RhdHVzLWJhZGdlXCJcclxuICAgICAgICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kLWNvbG9yXT1cIm9wdC5jb2xvckhleFwiXHJcbiAgICAgICAgICAgICAgICBbc3R5bGUuY29sb3JdPVwib3B0LmNvbG9ySGV4ID8gJ3doaXRlJyA6ICdibGFjaydcIj5cclxuICAgICAgICAgICAgICAgIHt7dGFyZ2V0LmxhYmVsfX1cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjbm9ybWFsT3B0aW9uPlxyXG4gICAgICAgICAgPHNwYW4+e3t0YXJnZXQubGFiZWx9fTwvc3Bhbj5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgPC9wLWRyb3Bkb3duPlxyXG5cclxuICA8IS0tIEJ1YmJsZSBJbmZvIC0tPlxyXG4gIDxUc2ktQnViYmxlLUluZm8gW2luZm9UZXh0XT1cImluZm9UZXh0XCI+PC9Uc2ktQnViYmxlLUluZm8+XHJcbjwvZGl2PiJdfQ==
685
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHNpLXNlYXJjaC1jb21iby5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90c2ktc2hhcmVkLXVpL3NyYy9saWIvdHNpLWNvbXBvbmVudHMvaW5wdXQtY29tcG9uZW50cy90c2ktc2VhcmNoLWNvbWJvL3RzaS1zZWFyY2gtY29tYm8uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdHNpLXNoYXJlZC11aS9zcmMvbGliL3RzaS1jb21wb25lbnRzL2lucHV0LWNvbXBvbmVudHMvdHNpLXNlYXJjaC1jb21iby90c2ktc2VhcmNoLWNvbWJvLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBYyxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUM5RCxPQUFPLEVBQXFCLFNBQVMsRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBcUIsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNILE9BQU8sRUFBRSxjQUFjLEVBQTRCLE1BQU0sTUFBTSxDQUFDO0FBRWhFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwyREFBMkQsQ0FBQztBQUN6RixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGVBQWUsRUFBRSxpQkFBaUIsRUFBRSxhQUFhLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNuRixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUcvRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7Ozs7Ozs7Ozs7Ozs7QUFVeEQsTUFBTSxPQUFPLHVCQUF3QixTQUFRLFlBQWlCO0lBZ0I1RCxVQUFVLENBQUMsS0FBVTtRQUNuQixrQ0FBa0M7UUFDbEMsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3ZCLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQTtJQUN6QixDQUFDO0lBc0JELElBQ0ksY0FBYztRQUNoQixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUM7SUFDOUIsQ0FBQztJQUVELElBQUksY0FBYyxDQUFDLEtBQVU7UUFDM0IsSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUM7SUFDL0IsQ0FBQztJQUVELElBQWEsVUFBVTtRQUNyQixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDMUIsQ0FBQztJQUVELElBQUksVUFBVSxDQUFDLFVBQWlCO1FBQzlCLHFCQUFxQjtRQUNyQixJQUFJLENBQUMsaUJBQWlCLEdBQUcsVUFBVSxDQUFDO1FBRXBDLElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDM0IsSUFBSSxDQUFDLHFDQUFxQyxFQUFFLENBQUE7WUFFNUMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQztRQUNqQyxDQUFDO0lBRUgsQ0FBQztJQUVELElBQW1CLElBQUk7UUFDckIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3BCLENBQUM7SUFFRCxJQUFJLElBQUksQ0FBQyxLQUFVO1FBQ2pCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25CLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUNwQixDQUFDO0lBV0QsWUFBWTtJQUVaLGNBQWM7SUFDZCxZQUNTLDBCQUFzRCxFQUNyRCxnQkFBaUMsRUFDakMsZUFBdUMsRUFDdkMsV0FBdUIsRUFDckIsTUFBMEI7UUFFcEMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBTk4sK0JBQTBCLEdBQTFCLDBCQUEwQixDQUE0QjtRQUNyRCxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWlCO1FBQ2pDLG9CQUFlLEdBQWYsZUFBZSxDQUF3QjtRQUN2QyxnQkFBVyxHQUFYLFdBQVcsQ0FBWTtRQUNyQixXQUFNLEdBQU4sTUFBTSxDQUFvQjtRQTVGdEMsb0JBQW9CO1FBQ1osZ0JBQVcsR0FBVSxFQUFFLENBQUM7UUFFeEIsdUJBQWtCLEdBQVksS0FBSyxDQUFDO1FBQ3BDLHNCQUFpQixHQUFVLEVBQUUsQ0FBQztRQUU5Qix1QkFBa0IsR0FBWSxLQUFLLENBQUM7UUFFckMsZUFBVSxHQUFZLElBQUksQ0FBQztRQUdsQyxTQUFJLEdBQVksS0FBSyxDQUFDO1FBY0gsWUFBTyxHQUFXLEVBQUUsQ0FBQztRQUNsQixlQUFVLEdBQVcsRUFBRSxDQUFDO1FBQzNCLGFBQVEsR0FBWSxLQUFLLENBQUM7UUFDOUIsU0FBSSxHQUFZLEtBQUssQ0FBQztRQUU1QixjQUFTLEdBQVksSUFBSSxDQUFDO1FBRTFCLGVBQVUsR0FBYSxLQUFLLENBQUM7UUFFN0IsYUFBUSxHQUFXLEVBQUUsQ0FBQztRQUN0QixrQkFBYSxHQUFXLEVBQUUsQ0FBQztRQXVDcEMsWUFBWTtRQUVaLGlCQUFpQjtRQUNQLGVBQVUsR0FBc0IsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUNyQyxxQkFBZ0IsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ3pELFNBQUksR0FBRyxJQUFJLFlBQVksRUFBb0IsQ0FBQztRQUM1QyxhQUFRLEdBQUcsSUFBSSxZQUFZLEVBQW9CLENBQUM7UUFDaEQsd0JBQW1CLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUNqRCxZQUFPLEdBQXNCLElBQUksWUFBWSxFQUFPLENBQUM7UUFDckQsd0JBQW1CLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQWlGekQsWUFBWTtRQUNILHFCQUFnQixHQUFZLElBQUksQ0FBQztRQUNqQyxrQkFBYSxHQUFZLElBQUksQ0FBQztRQUd2Qyw2QkFBd0IsR0FBWSxLQUFLLENBQUM7SUExRTFDLENBQUM7SUFDRCxZQUFZO0lBRVosZ0NBQWdDO0lBQ3ZCLFdBQVc7UUFDbEIsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxXQUFXLEVBQUUsQ0FBQztJQUMxQyxDQUFDO0lBRUQsSUFBSSxhQUFhO1FBQ2YsT0FBTyxJQUFJLENBQUMsU0FBUyxLQUFLLFFBQVEsQ0FBQztJQUNyQyxDQUFDO0lBRUQsWUFBWSxDQUFDLEdBQXVCLEVBQUUsVUFBa0IsRUFBRTtRQUN4RCxJQUFJLENBQUMsR0FBRztZQUFFLE9BQU8sRUFBRSxDQUFDO1FBQ3BCLEdBQUcsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztRQUU1QixJQUFJLENBQUMsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDMUMsSUFBSSxDQUFDLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzFDLElBQUksQ0FBQyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUUxQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsT0FBTyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDN0QsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLE9BQU8sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzdELENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxPQUFPLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUU3RCxNQUFNLE1BQU0sR0FDVixHQUFHO1lBQ0gsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztpQkFDTixHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7aUJBQ3pDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUVkLE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxvQkFBb0IsQ0FBQyxHQUF1QjtRQUMxQyxJQUFJLENBQUMsR0FBRztZQUFFLE9BQU8sT0FBTyxDQUFDO1FBRXpCLEdBQUcsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztRQUM1QixNQUFNLENBQUMsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDNUMsTUFBTSxDQUFDLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzVDLE1BQU0sQ0FBQyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUU1QyxNQUFNLFVBQVUsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBRXhELE9BQU8sVUFBVSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDO0lBQ2hELENBQUM7SUFFRCxlQUFlLENBQUMsS0FBYTtRQUMzQixPQUFPLElBQUksQ0FBQyxjQUFjLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxlQUFlLEtBQUssS0FBSyxDQUFDLENBQUM7SUFDN0UsQ0FBQztJQUVRLEtBQUssQ0FBQyxRQUFRO1FBQ3JCLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNqQixJQUFJLENBQUMsb0NBQW9DLEVBQUUsQ0FBQztRQUMxQyxNQUFNLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQ3JDLElBQUksQ0FBQywyQkFBMkIsRUFBRSxDQUFDO1FBQ25DLElBQUksQ0FBQyxpQ0FBaUMsRUFBRSxDQUFDO1FBQ3pDLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDOUIsSUFBSSxNQUFNLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDOUQsSUFBSSxNQUFNLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQ2pDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFBO1FBQ2xCLENBQUM7YUFDSSxDQUFDO1lBQ0osSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUE7UUFDbkIsQ0FBQztRQUdELElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7SUFDeEMsQ0FBQztJQVVELG9DQUFvQztRQUNsQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3hCLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxLQUFLLENBQUM7WUFDdEMsT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLENBQUMsMEJBQTBCLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFFMUUsSUFBSSxFQUFFLENBQUMsTUFBVyxFQUFFLEVBQUU7Z0JBQ3BCLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLHVCQUF1QixDQUFDO1lBQ3BFLENBQUM7WUFDRCxLQUFLLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRTtnQkFDYixPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNuQixJQUFJLENBQUMsd0JBQXdCLEdBQUcsS0FBSyxDQUFDO1lBQ3hDLENBQUM7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUYscUJBQXFCO1FBQ3BCLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUM3QixJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO2dCQUN4QixJQUFJLElBQUksQ0FBQyxhQUFhLEtBQUssU0FBUztvQkFBRSxJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztnQkFDakUsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEtBQUssU0FBUztvQkFBRSxJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO2dCQUN6RSxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsS0FBSyxTQUFTO29CQUFFLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7Z0JBQ3ZFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE9BQU87WUFDVCxDQUFDO1lBRUQsSUFBSSxDQUFDLDBCQUEwQixDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsU0FBUyxDQUFDO2dCQUMxRSxJQUFJLEVBQUUsQ0FBQyxNQUFXLEVBQUUsRUFBRTtvQkFDcEIsTUFBTSxPQUFPLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUM7b0JBRW5DLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBZSxFQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQTtvQkFFL0MsSUFBRyxDQUFDLE9BQU8sRUFDWCxDQUFDO3dCQUNDLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO3dCQUMzQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO3dCQUM5QixJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO3dCQUUvQixPQUFPO29CQUNULENBQUM7b0JBRUQsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEtBQUssU0FBUyxFQUFFLENBQUM7d0JBQ3pDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO29CQUM5QyxDQUFDO29CQUVELElBQUksSUFBSSxDQUFDLGdCQUFnQixLQUFLLFNBQVMsRUFBRSxDQUFDO3dCQUN4QyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztvQkFDN0MsQ0FBQztvQkFFRCxPQUFPLEVBQUUsQ0FBQztnQkFDWixDQUFDO2dCQUNELEtBQUssRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFO29CQUNiLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBRW5CLElBQUksSUFBSSxDQUFDLGFBQWEsS0FBSyxTQUFTO3dCQUFFLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO29CQUNqRSxJQUFJLElBQUksQ0FBQyxpQkFBaUIsS0FBSyxTQUFTO3dCQUFFLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxLQUFLLENBQUM7b0JBQ3pFLElBQUksSUFBSSxDQUFDLGdCQUFnQixLQUFLLFNBQVM7d0JBQUUsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQztvQkFFdkUsT0FBTyxFQUFFLENBQUM7Z0JBQ1osQ0FBQzthQUNGLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUdDLDJCQUEyQjtRQUN6QixJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxlQUFlLEVBQUUsS0FBSyxDQUFDLG1DQUFtQyxDQUFDLENBQUM7UUFDbkUsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsMEJBQTBCLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxTQUFTLENBQUM7Z0JBQzFFLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBVyxFQUFFLEVBQUU7b0JBQzFCLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLHVCQUF1QixDQUFDO29CQUNsRSxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLHVCQUF1QixFQUFFLENBQUM7d0JBQy9DLElBQUksQ0FBQyxlQUFlLEVBQUUsS0FBSyxDQUFDLHFDQUFxQyxDQUFDLENBQUM7d0JBQ25FLE9BQU87b0JBQ1QsQ0FBQztvQkFFRCxJQUFJLElBQUksR0FBd0I7d0JBQzlCLElBQUksRUFBRTs0QkFDSixnQkFBZ0IsRUFBRSxJQUFJOzRCQUN0QixhQUFhLEVBQUUsaUJBQWlCLENBQUMsTUFBTTs0QkFDdkMsSUFBSSxFQUFFLGVBQWUsQ0FBQyxPQUFPOzRCQUM3QixVQUFVLEVBQUUsTUFBTTt5QkFDbkI7d0JBQ0QsVUFBVSxFQUFFLEVBQUU7d0JBQ2QsS0FBSyxFQUFFLGFBQWEsQ0FBQyxNQUFNLENBQUMsS0FBSzt3QkFDakMsTUFBTSxFQUFFLGFBQWEsQ0FBQyxNQUFNLENBQUMsTUFBTTt3QkFDbkMsV0FBVyxFQUFFLElBQUk7cUJBQ2xCLENBQUM7b0JBRUYsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO29CQUV0SCxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLGNBQW1CLEVBQUUsRUFBRTt3QkFDL0QsSUFBSSxjQUFjLEVBQUUsQ0FBQzs0QkFDbkIsSUFBSSxDQUFDLElBQUksR0FBRyxjQUFjLENBQUM7NEJBQzNCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQzt3QkFDbEMsQ0FBQztvQkFDSCxDQUFDLENBQUMsQ0FBQztnQkFDTCxDQUFDO2dCQUNELEtBQUssRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFO29CQUNiLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQ25CLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxLQUFLLENBQUM7Z0JBQ3hDLENBQUM7YUFDRixDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQztJQUdELGdCQUFnQjtRQUNkLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQTtRQUMxQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxlQUFlLEVBQUUsS0FBSyxDQUFDLG1DQUFtQyxDQUFDLENBQUM7UUFDbkUsQ0FBQzthQUNJLENBQUM7WUFDSixJQUFJLENBQUMsMEJBQTBCLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxTQUFTLENBQUM7Z0JBQzFFLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBVyxFQUFFLEVBQUU7b0JBQzFCLElBQUksSUFBSSxHQUF3Qjt3QkFDOUIsSUFBSSxFQUFFLEVBQUUsZ0JBQWdCLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLGVBQWUsQ0FBQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRTt3QkFDNUgsVUFBVSxFQUFFLEVBQUU7d0JBQ2QsS0FBSyxFQUFFLGFBQWEsQ0FBQyxNQUFNLENBQUMsS0FBSzt3QkFDakMsTUFBTSxFQUFFLGFBQWEsQ0FBQyxNQUFNLENBQUMsTUFBTTt3QkFDbkMsV0FBVyxFQUFFLElBQUk7cUJBQ2xCLENBQUM7b0JBRUYsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLEVBQUUsQ0FBQzt3QkFDckMsSUFBSSxDQUFDLGVBQWUsRUFBRSxLQUFLLENBQUMscUNBQXFDLENBQUMsQ0FBQzt3QkFDbkUsT0FBTztvQkFDVCxDQUFDO29CQUNELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7b0JBQzVHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsY0FBbUIsRUFBRSxFQUFFO3dCQUUvRCxJQUFJLGNBQWMsRUFBRSxDQUFDOzRCQUNuQixJQUFJLENBQUMsSUFBSSxHQUFHLGNBQWMsQ0FBQzs0QkFDM0IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO3dCQUNqQyxDQUFDO29CQUNILENBQUMsQ0FBQyxDQUFDO2dCQUNMLENBQUM7Z0JBQ0QsS0FBSyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUU7b0JBQ2IsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDckIsQ0FBQzthQUNGLENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDO0lBQ0QsVUFBVTtRQUNSLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLGVBQWUsRUFBRSxLQUFLLENBQUMsbUNBQW1DLENBQUMsQ0FBQztRQUNuRSxDQUFDO2FBQ0ksQ0FBQztZQUNKLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLFNBQVMsQ0FBQztnQkFDMUUsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFXLEVBQUUsRUFBRTtvQkFDMUIsSUFBSSxJQUFJLEdBQXdCO3dCQUM5QixJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUsZUFBZSxDQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFO3dCQUMxRCxVQUFVLEVBQUUsRUFBRTt3QkFDZCxLQUFLLEVBQUUsYUFBYSxDQUFDLE1BQU0sQ0FBQyxLQUFLO3dCQUNqQyxNQUFNLEVBQUUsYUFBYSxDQUFDLE1BQU0sQ0FBQyxNQUFNO3dCQUNuQyxXQUFXLEVBQUUsSUFBSTtxQkFDbEIsQ0FBQztvQkFFRixJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO3dCQUNoQyxJQUFJLENBQUMsZUFBZSxFQUFFLEtBQUssQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDO3dCQUNuRSxPQUFPO29CQUNULENBQUM7b0JBQ0QsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztvQkFDdkcsSUFBSSxDQUFDLGdCQUFnQixFQUFFLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxZQUFpQixFQUFFLEVBQUU7d0JBQzdELElBQUksWUFBWSxFQUFFLENBQUM7NEJBQ2pCLElBQUksT0FBTyxZQUFZLEtBQUssUUFBUSxJQUFJLFlBQVksS0FBSyxJQUFJLElBQUksS0FBSyxJQUFJLFlBQVksRUFBRSxDQUFDO2dDQUN2RixJQUFJLENBQUMsSUFBSSxHQUFHLFlBQVksRUFBRSxHQUFHLENBQUM7Z0NBQzlCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTs0QkFDakMsQ0FBQztpQ0FDSSxJQUFJLE9BQU8sWUFBWSxLQUFLLFFBQVEsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7Z0NBQ3hFLElBQUksQ0FBQyxJQUFJLEdBQUcsWUFBWSxDQUFDO2dDQUN6QixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7NEJBQ2pDLENBQUM7d0JBQ0gsQ0FBQztvQkFDSCxDQUFDLENBQUMsQ0FBQztnQkFDTCxDQUFDO2dCQUNELEtBQUssRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFO29CQUNiLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3JCLENBQUM7YUFDRixDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQztJQUVELGFBQWE7UUFDYixJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxlQUFlLEVBQUUsS0FBSyxDQUFDLG1DQUFtQyxDQUFDLENBQUM7WUFDakUsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2YsSUFBSSxDQUFDLGVBQWUsRUFBRSxLQUFLLENBQUMsZ0RBQWdELENBQUMsQ0FBQztZQUM5RSxPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksQ0FBQywwQkFBMEIsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUMxRSxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQVcsRUFBRSxFQUFFO2dCQUMxQixJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO29CQUNoQyxJQUFJLENBQUMsZUFBZSxFQUFFLEtBQUssQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDO29CQUNuRSxPQUFPO2dCQUNULENBQUM7Z0JBQ0QsSUFBSSxJQUFJLEdBQXdCO29CQUM5QixJQUFJLEVBQUU7d0JBQ0osSUFBSSxFQUFFLGVBQWUsQ0FBQyxJQUFJO3dCQUMxQixVQUFVLEVBQUUsTUFBTTt3QkFDbEIsRUFBRSxFQUFFLElBQUksQ0FBQyxJQUFJO3FCQUNkO29CQUVELFVBQVUsRUFBRSxFQUFFO29CQUNkLEtBQUssRUFBRSxhQUFhLENBQUMsTUFBTSxDQUFDLEtBQUs7b0JBQ2pDLE1BQU0sRUFBRSxhQUFhLENBQUMsTUFBTSxDQUFDLE1BQU07b0JBQ25DLFdBQVcsRUFBRSxJQUFJO2lCQUNsQixDQUFDO2dCQUVGLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBRXZHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsY0FBbUIsRUFBRSxFQUFFO29CQUNqRSxJQUFJLGNBQWMsRUFBRSxDQUFDO3dCQUNuQixJQUFJLE9BQU8sY0FBYyxLQUFLLFFBQVEsSUFBSSxjQUFjLEtBQUssSUFBSSxJQUFJLEtBQUssSUFBSSxjQUFjLEVBQUUsQ0FBQzs0QkFDN0YsSUFBSSxDQUFDLElBQUksR0FBRyxjQUFjLENBQUMsR0FBRyxDQUFDOzRCQUMvQixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7d0JBQ2xDLENBQUM7NkJBQU0sSUFBSSxPQUFPLGNBQWMsS0FBSyxRQUFRLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDOzRCQUM5RSxJQUFJLENBQUMsSUFBSSxHQUFHLGNBQWMsQ0FBQzs0QkFDM0IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO3dCQUNsQyxDQUFDO29CQUNILENBQUM7Z0JBQ1AsQ0FBQyxDQUFDLENBQUM7WUFDQyxDQUFDO1lBQ0QsS0FBSyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUU7Z0JBQ2IsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNyQixDQUFDO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUNELGNBQWM7UUFDWixJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxlQUFlLEVBQUUsS0FBSyxDQUFDLG1DQUFtQyxDQUFDLENBQUM7WUFDakUsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2YsSUFBSSxDQUFDLGVBQWUsRUFBRSxLQUFLLENBQUMsaURBQWlELENBQUMsQ0FBQztZQUMvRSxPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksQ0FBQywwQkFBMEIsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUMxRSxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQVcsRUFBRSxFQUFFO2dCQUMxQixJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO29CQUNoQyxJQUFJLENBQUMsZUFBZSxFQUFFLEtBQUssQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDO29CQUNuRSxPQUFPO2dCQUNULENBQUM7Z0JBRUQsTUFBTSxJQUFJLEdBQXdCO29CQUNoQyxJQUFJLEVBQUU7d0JBQ0osSUFBSSxFQUFFLGVBQWUsQ0FBQyxPQUFPO3dCQUM3QixVQUFVLEVBQUUsTUFBTTt3QkFDbEIsRUFBRSxFQUFFLElBQUksQ0FBQyxJQUFJO3FCQUNkO29CQUNELFVBQVUsRUFBRSxFQUFFO29CQUNkLEtBQUssRUFBRSxhQUFhLENBQUMsTUFBTSxDQUFDLEtBQUs7b0JBQ2pDLE1BQU0sRUFBRSxhQUFhLENBQUMsTUFBTSxDQUFDLE1BQU07b0JBQ25DLFdBQVcsRUFBRSxJQUFJO2lCQUNsQixDQUFDO2dCQUVGLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxDQUNqRCxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUMzQyxJQUFJLENBQ0wsQ0FBQztnQkFFRixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO2dCQUMvQyxDQUFDLENBQUMsQ0FBQztZQUNMLENBQUM7WUFDRCxLQUFLLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRTtnQkFDYixPQUFPLENBQUMsS0FBSyxDQUFDLHFEQUFxRCxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQzVFLENBQUM7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO0lBR0MsdUJBQXVCO0lBQ3ZCLGdCQUFnQixDQUFDLEtBQVU7UUFDekIsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDO1FBQ3hCLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUNsRCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUE7UUFDNUIsQ0FBQztRQUNELElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUVsQyxJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDN0IsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQztRQUNqQyxDQUFDO1FBRUQsSUFBSSxlQUFlLEdBQVEsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4RSxJQUFJLGVBQWUsRUFBRSxDQUFDO1lBQ3BCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3ZELENBQUM7SUFDSCxDQUFDO0lBRUQsa0JBQWtCLENBQUMsV0FBZ0I7UUFDakMsSUFBSSxJQUFJLENBQUMsVUFBVSxJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDaEQsSUFBSSxDQUFDLDhCQUE4QixDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMxRCxDQUFDO0lBQ0gsQ0FBQztJQUVELE1BQU07UUFDSixJQUFJLElBQUksQ0FBQyxVQUFVLElBQUksT0FBTyxJQUFJLENBQUMsYUFBYSxJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQy9ELElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN6QixDQUFDO0lBQ0gsQ0FBQztJQUVELE1BQU07UUFDSixJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNwQixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUE7UUFDNUIsQ0FBQztJQUNILENBQUM7SUFFRCxrQkFBa0I7UUFDaEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUE7SUFDNUIsQ0FBQztJQUNELFlBQVk7SUFFWix5QkFBeUI7SUFDakIsZUFBZTtRQUNyQixJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDN0IsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQ3BCLElBQUksQ0FBQyw4QkFBOEIsRUFBRSxDQUFDO1lBQ3hDLENBQUM7aUJBQ0ksQ0FBQztnQkFDSixJQUFJLENBQUMsaUNBQWlDLEVBQUUsQ0FBQztZQUMzQyxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFTyw4QkFBOEIsQ0FBQyxVQUFrQixFQUFFO1FBQ3pELElBQUksSUFBSSxDQUFDLG1CQUFtQixFQUFFLEVBQUUsQ0FBQztZQUMvQixJQUFJLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQztZQUN0QixJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztZQUN4QixJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsMkJBQTJCLEVBQUUsRUFBRSxJQUFJLENBQUMsbUJBQW1CLENBQUMsT0FBTyxDQUFDLENBQUM7aUJBQ3hGLFNBQVMsQ0FBQztnQkFDVCxJQUFJLEVBQUUsQ0FBQyxJQUFTLEVBQUUsRUFBRTtvQkFDbEIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztvQkFDOUIsSUFBSSxDQUFDLHFDQUFxQyxFQUFFLENBQUM7Z0JBQy9DLENBQUM7Z0JBQ0QsS0FBSyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7b0JBQ2YsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7Z0JBQzFCLENBQUM7YUFDRixDQUNBLENBQUM7UUFFTixDQUFDO0lBQ0gsQ0FBQztJQUVPLGlDQUFpQztRQUN2QyxJQUFJLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxFQUFFLENBQUM7WUFDL0IsSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7WUFDeEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLDJCQUEyQixFQUFFLENBQUM7aUJBQ3JELFNBQVMsQ0FBQztnQkFDVCxJQUFJLEVBQUUsQ0FBQyxJQUFTLEVBQUUsRUFBRTtvQkFDbEIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztvQkFDOUIsSUFBSSxDQUFDLHFDQUFxQyxFQUFFLENBQUM7Z0JBQy9DLENBQUM7Z0JBQ0QsS0FBSyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7b0JBQ2YsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7Z0JBQzFCLENBQUM7YUFDRixDQUNBLENBQUM7UUFFTixDQUFDO0lBQ0gsQ0FBQztJQUVPLEtBQUssQ0FBQyxnQkFBZ0I7UUFDNUIsSUFBSSxJQUFJLENBQUMsMEJBQTBCLEVBQUUsRUFBRSxDQUFDO1lBQ3RDLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUNkLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO2dCQUN0QixJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztnQkFFeEIsSUFBSSxDQUFDO29CQUNILE1BQU0sSUFBSSxHQUFRLE1BQU0sY0FBYyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDLENBQUMsQ0FBQztvQkFFMUYsSUFBSSxTQUFTLEdBQVUsRUFBRSxDQUFDO29CQUMxQixJQUFJLEdBQUcsR0FBRzt3QkFDUixFQUFFLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7d0JBQ3RCLEtBQUssRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztxQkFDN0IsQ0FBQztvQkFFRixJQUFJLENBQUMsU0FBUyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQ3hCLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQ3BCLElBQUksQ0FBQyxXQUFXLEdBQUcsU0FBUyxDQUFDO29CQUM3QixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztvQkFFdkIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQ3pDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDL0IsQ0FBQztnQkFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO29CQUNmLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO2dCQUMxQixDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRU8sZ0JBQWdCO1FBQ3RCLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDZCxJQUFJLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQUMsQ0FBQztZQUNwQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFBQyxDQUFDO1lBQ3JDLE9BQU8sQ0FBQyxDQUFDO1FBQ1gsQ0FBQyxDQUFDO0lBQ0osQ0FBQztJQUVPLG1CQUFtQjtRQUN6QixJQUFJLElBQUksQ0FBQyxhQUFhLElBQUksU0FBUyxJQUFJLElBQUksQ0FBQyxhQUFhLEtBQUssRUFBRSxFQUFFLENBQUM7WUFDakUsTUFBTSxJQUFJLEtBQUssQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO1FBQ25ELENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFTywwQkFBMEI7UUFDaEMsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLElBQUksU0FBUyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsS0FBSyxFQUFFLEVBQUUsQ0FBQztZQUN2RSxNQUFNLElBQUksS0FBSyxDQUFDLDhCQUE4QixDQUFDLENBQUM7UUFDbEQsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVPLDJCQUEyQjtRQUNqQyxJQUFJLElBQUksQ0FBQyxPQUFPLElBQUksU0FBUyxJQUFJLElBQUksQ0FBQyxPQUFPLEtBQUssRUFBRSxFQUFFLENBQUM7WUFDckQsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFDdEIsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLFVBQVUsSUFBSSxTQUFTLElBQUksSUFBSSxDQUFDLFVBQVUsS0FBSyxFQUFFLEVBQUUsQ0FBQztZQUMzRCxJQUFJLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQztRQUM5QixDQUFDO0lBQ0gsQ0FBQztJQUVPLG9CQUFvQjtRQUMxQixJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNkLE9BQU8sU0FBUyxDQUFDLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQzVELENBQUM7O1lBQ0ksTUFBTSxJQUFJLEtBQUssQ0FBQywwREFBMEQsQ0FBQyxDQUFBO0lBQ2xGLENBQUM7SUFFTywyQkFBMkI7UUFDakMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN4QixNQUFNLElBQUksS0FBSyxDQUFDLHNDQUFzQyxDQUFDLENBQUE7UUFDekQsQ0FBQztRQUVELElBQUksT0FBTyxJQUFJLENBQUMsYUFBYSxJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQzFDLE9BQU8sU0FBUyxDQUFDLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUM7UUFDNUMsQ0FBQztRQUNELElBQUksT0FBTyxJQUFJLENBQUMsYUFBYSxJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQzVDLElBQUksaUJBQWlCLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUE7WUFDL0QsT0FBTyxTQUFTLENBQUMsR0FBRyxpQkFBaUIsRUFBRSxDQUFDLENBQUE7UUFDMUMsQ0FBQztRQUNELE9BQU8sRUFBRSxDQUFBO0lBQ1gsQ0FBQztJQUVPLEtBQUssQ0FBQyxnQkFBZ0I7UUFDNUIsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUM1QixJQUFJLENBQUMscUNBQXFDLEVBQUUsQ0FBQztRQUMvQyxDQUFDO2FBQ0ksQ0FBQztZQUNKLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUNwQixNQUFNLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ2hDLENBQUM7aUJBQ0ksQ0FBQztnQkFDSixJQUFJLENBQUMsaUNBQWlDLEVBQUUsQ0FBQztZQUMzQyxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFTyxLQUFLLENBQUMsVUFBVTtRQUN0QixJQUFJLElBQUksQ0FBQyxVQUFVLElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUM1RSxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ2hDLENBQUM7SUFDSCxDQUFDO0lBRU8sWUFBWTtRQUNsQixJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNwQixJQUFJLENBQUMsOEJBQThCLEVBQUUsQ0FBQztRQUN4QyxDQUFDO2FBQ0ksQ0FBQztZQUNKLElBQUksQ0FBQyxpQ0FBaUMsRUFBRSxDQUFDO1FBQzNDLENBQUM7SUFDSCxDQUFDO0lBRU8saUNBQWlDO1FBQ3ZDLElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDMUIsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQ3hELENBQUMsSUFBUyxFQUFFLEVBQUU7Z0JBQ1osSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksUUFBUSxFQUFFLENBQUM7b0JBQzlCLElBQUksSUFBSSxJQUFJLFNBQVMsSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxFQUFFLEVBQUUsQ0FBQzt3QkFDcEQsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7d0JBQzFCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztvQkFDdEIsQ0FBQztnQkFDSCxDQUFDO3FCQUNJLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO29CQUM3QixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQTtnQkFDeEIsQ0FBQztZQUNILENBQUMsQ0FDRixDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7SUFFTyxxQ0FBcUM7UUFDM0MsSUFBSSxTQUFTLEdBQVUsRUFBRSxDQUFDO1FBQzFCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFZLEVBQUUsRUFBRTtZQUM5QyxJQUFJLEdBQUcsR0FBRztnQkFDUixFQUFFLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7Z0JBQ3pCLEtBQUssRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQzthQUNoQyxDQUFDO1lBQ0YsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN0QixDQUFDLENBQUMsQ0FBQTtRQUNGLElBQUksQ0FBQyxXQUFXLEdBQUcsU0FBUyxDQUFDO1FBQzdCLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FBQztRQUNqRCxDQUFDO1FBQ0QsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7UUFDdkIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxDQUFDO0lBQy9CLENBQUM7SUFFTyxtQkFBbUIsQ0FBQyxPQUEyQjtRQUNyRCxhQUFhO1FBQ2IsSUFBSSxNQUFNLEdBQUcsSUFBSSxVQUFVLEVBQUUsQ0FBQztRQUM5QixNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsT0FBTyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBRS9DLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVELGtCQUFrQixDQUFDLEtBQVU7UUFDM0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDM0IsQ0FBQzsrR0E5ckJVLHVCQUF1QjttR0FBdkIsdUJBQXVCLHMvQkNwQnBDLDI2R0E4RE07OzRGRDFDTyx1QkFBdUI7a0JBTG5DLFNBQVM7K0JBQ0Usa0JBQWtCOzJOQW9CNUIsVUFBVTtzQkFEVCxZQUFZO3VCQUFDLGVBQWUsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFVZCxnQkFBZ0I7c0JBQTFDLEtBQUs7dUJBQUMsa0JBQWtCO2dCQUNELGFBQWE7c0JBQXBDLEtBQUs7dUJBQUMsZUFBZTtnQkFDSCxPQUFPO3NCQUF6QixLQUFLO3VCQUFDLFVBQVU7Z0JBQ0ssVUFBVTtzQkFBL0IsS0FBSzt1QkFBQyxhQUFhO2dCQUNELFFBQVE7c0JBQTFCLEtBQUs7dUJBQUMsVUFBVTtnQkFDRixJQUFJO3NCQUFsQixLQUFLO3VCQUFDLE1BQU07Z0JBRUosU0FBUztzQkFBakIsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFFRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBR0YsY0FBYztzQkFEakIsS0FBSztnQkFTTyxVQUFVO3NCQUF0QixLQUFLO2dCQWdCYSxJQUFJO3NCQUF0QixLQUFLO3VCQUFDLE1BQU07Z0JBWUgsVUFBVTtzQkFBbkIsTUFBTTtnQkFDc0IsZ0JBQWdCO3NCQUE1QyxNQUFNO3VCQUFDLG1CQUFtQjtnQkFDakIsSUFBSTtzQkFBYixNQUFNO2dCQUNHLFFBQVE7c0JBQWpCLE1BQU07Z0JBQ0csbUJBQW1CO3NCQUE1QixNQUFNO2dCQUNHLE9BQU87c0JBQWhCLE1BQU07Z0JBQ0csbUJBQW1CO3NCQUE1QixNQUFNO2dCQWtGRSxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cENsaWVudCwgSHR0cFBhcmFtcyB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBIb3N0TGlzdGVuZXIsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IGZpcnN0VmFsdWVGcm9tLCBPYnNlcnZhYmxlLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgQ29tYm9TdGF0dXNNb2RlbCB9IGZyb20gJy4uLy4uLy4uL2ludGVyZmFjZXMnO1xyXG5pbXBvcnQgeyBUc2lJbnB1dEJhc2UgfSBmcm9tICcuLi8uLi8uLi90c2ktYmFzZS90c2ktaW5wdXQtYmFzZS90c2ktaW5wdXQtYmFzZS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBydGxNb2RlS2V5cyB9IGZyb20gJy4uLy4uLy4uL2NvbnN0cy9sb2NhbHMuY29uc3QnO1xyXG5pbXBvcnQgeyBDb21wb25lbnRfTW9kZXMsIEdyaWRTZWxlY3Rpb25Nb2RlLCBNb2RhbFNpemVFbnVtIH0gZnJvbSAnLi4vLi4vLi4vZW51bXMnO1xyXG5pbXBvcnQgeyBUeXBlUmVnaXN0cnlIZWxwZXIgfSBmcm9tICcuLi8uLi8uLi90c2ktaGVscGVycy90eXBlLXJlZ2lzdHJ5LmhlbHBlcic7XHJcbmltcG9ydCB7IEVudGl0eUNvbmZpZ3VyYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvY29uZmlndXJhdGlvbi9lbnRpdHktY29uZmlndXJhdGlvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgVHNpTm90aWZpY2F0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL25vdGlmaWNhdGlvbi90c2ktbm90aWZpY2F0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBHdWlkIH0gZnJvbSAnLi4vLi4vLi4vdHNpLWhlbHBlcnMvZ3VpZC5oZWxwZXInO1xyXG5pbXBvcnQgeyBUc2lNb2RhbFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9tb2RhbC90c2ktbW9kYWwuc2VydmljZSc7XHJcbmltcG9ydCB7IER5bmFtaWNEaWFsb2dDb25maWcsIER5bmFtaWNEaWFsb2dSZWYgfSBmcm9tICdwcmltZW5nL2R5bmFtaWNkaWFsb2cnO1xyXG5pbXBvcnQgeyBTdGF0dXNNZXRhZGF0YVJlc3BvbnNlLCBTdGF0dXNPcHRpb24gfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvc3RhdHVzL2NvbG9yLXN0YXR1cyc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ1RzaS1TZWFyY2gtQ29tYm8nLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi90c2ktc2VhcmNoLWNvbWJvLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi90c2ktc2VhcmNoLWNvbWJvLmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIFRzaVNlYXJjaENvbWJvQ29tcG9uZW50IGV4dGVuZHMgVHNpSW5wdXRCYXNlPGFueT4gaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcblxyXG4gIC8vI3JlZ2lvbiBsb2NhbCB2YXJzXHJcbiAgcHJpdmF0ZSBfZGF0YXNvdXJjZTogYW55W10gPSBbXTtcclxuICBwcml2YXRlIF9yZWxvYWRTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIF9pc0lucHV0RGF0YXNvdXJjZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX2dvdHRlbkRhdGFzb3VyY2U6IGFueVtdID0gW107XHJcbiAgcHJpdmF0ZSBfYmluZD86IGFueTtcclxuICBwcml2YXRlIF9iaW5kQ2hhbmdlRW1pdHRlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX2N1cnJlbnRSb3dJdGVtPzogYW55O1xyXG4gIHB1YmxpYyBkYXRhTG9hZGVkOiBib29sZWFuID0gdHJ1ZTtcclxuICBwcml2YXRlIF9zZWxlY3RlZD86IGFueTtcclxuICBwcml2YXRlIF9kaWFsb2dSZWZlcmVuY2U/OiBEeW5hbWljRGlhbG9nUmVmIHwgdW5kZWZpbmVkO1xyXG4gIGlzQXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bi5lbnRlcicsIFsnJGV2ZW50J10pXHJcbiAgb25FbnRlcktleShldmVudDogYW55KSB7XHJcbiAgICAvLyBIYW5kbGUgdGhlIGVudGVyIGtleSBldmVudCBoZXJlXHJcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcclxuICB9XHJcblxyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuICAvLyNyZWdpb24gSW5wdXRzXHJcbiAgQElucHV0KFwiZWxlbWVudFNvdXJjZVVybFwiKSBlbGVtZW50U291cmNlVXJsPzogc3RyaW5nO1xyXG4gIEBJbnB1dChcImxpc3RTb3VyY2VVcmxcIikgbGlzdFNvdXJjZVVybD86IHN0cmluZyB8ICgoaXRlbTogYW55KSA9PiBzdHJpbmcpO1xyXG4gIEBJbnB1dChcImlkLWZpZWxkXCIpIGlkRmllbGQ6IHN0cmluZyA9IFwiXCI7XHJcbiAgQElucHV0KFwibGFiZWwtZmllbGRcIikgbGFiZWxGaWVsZDogc3RyaW5nID0gXCJcIjtcclxuICBASW5wdXQoXCJtdWx0aXBsZVwiKSBtdWx0aXBsZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dChcInNvcnRcIikgc29ydDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBASW5wdXQoKSBzaG93Q2xlYXI6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIEBJbnB1dCgpIHJlbG9hZERhdGFTb3VyY2U6IE9ic2VydmFibGU8YW55PiB8IHVuZGVmaW5lZDtcclxuICBASW5wdXQoKSBpc0ZpbHRlcmVkPzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIHNlbGVjdGVkTGFiZWw/OiBzdHJpbmc7XHJcbiAgQElucHV0KCkgbWF4V2lkdGg6IHN0cmluZyA9ICcnO1xyXG4gIEBJbnB1dCgpIGJ1c2luZXNzQ2xhc3M6IHN0cmluZyA9ICcnO1xyXG5cclxuICBASW5wdXQoKSBjb21ib1R5cGU/OiBzdHJpbmc7XHJcbiAgQElucHV0KCkgc3RhdHVzTWV0YWRhdGE/OiBTdGF0dXNNZXRhZGF0YVJlc3BvbnNlO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIGdldCBjdXJyZW50Um93SXRlbSgpOiBhbnkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRSb3dJdGVtO1xyXG4gIH1cclxuXHJcbiAgc2V0IGN1cnJlbnRSb3dJdGVtKHZhbHVlOiBhbnkpIHtcclxuICAgIHRoaXMuX2N1cnJlbnRSb3dJdGVtID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKSBnZXQgZGF0YXNvdXJjZSgpIHtcclxuICAgIHJldHVybiB0aGlzLl9kYXRhc291cmNlO1xyXG4gIH1cclxuXHJcbiAgc2V0IGRhdGFzb3VyY2UoZGF0YXNvdXJjZTogYW55W10pIHtcclxuICAgIC8vc2V0IHRoZSBkYXRhIHNvdXJjZVxyXG4gICAgdGhpcy5fZ290dGVuRGF0YXNvdXJjZSA9IGRhdGFzb3VyY2U7XHJcblxyXG4gICAgaWYgKHRoaXMuX2dvdHRlbkRhdGFzb3VyY2UpIHtcclxuICAgICAgdGhpcy5fbWFwR290dGVuRGF0YVNvdXJjZVRvTG9jYWxEYXRhc291cmNlKClcclxuXHJcbiAgICAgIHRoaXMuX2lzSW5wdXREYXRhc291cmNlID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICBASW5wdXQoXCJiaW5kXCIpIGdldCBiaW5kKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2JpbmQ7XHJcbiAgfVxyXG5cclxuICBzZXQgYmluZCh2YWx1ZTogYW55KSB7XHJcbiAgICB0aGlzLl9iaW5kID0gdmFsdWU7XHJcbiAgICB0aGlzLmlucHV0RmllbGQgPSB2YWx1ZTtcclxuICAgIHRoaXMuX29uQmluZFNldCgpO1xyXG4gIH1cclxuICAvLyNlbmRyZWdpb25cclxuXHJcbiAgLy8jcmVnaW9uIE91dHB1dHNcclxuICBAT3V0cHV0KCkgYmluZENoYW5nZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBAT3V0cHV0KFwiZGF0YXNvdXJjZS1sb2FkZWRcIikgZGF0YVNvdXJjZUxvYWRlZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICBAT3V0cHV0KCkgaW5pdCA9IG5ldyBFdmVudEVtaXR0ZXI8Q29tYm9TdGF0dXNNb2RlbD4oKTtcclxuICBAT3V0cHV0KCkgaXNMb2FkZWQgPSBuZXcgRXZlbnRFbWl0dGVyPENvbWJvU3RhdHVzTW9kZWw+KCk7XHJcbiAgQE91dHB1dCgpIHNlbGVjdGVkTGFiZWxDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcclxuICBAT3V0cHV0KCkgb25DbGljazogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBAT3V0cHV0KCkgb25TZWFyY2hCdXR0b25DbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuICAvLyNlbmRyZWdpb25cclxuXHJcbiAgLy8jcmVnaW9uIGN0b3JcclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHB1YmxpYyBlbnRpdHlDb25maWd1cmF0aW9uU2VydmljZTogRW50aXR5Q29uZmlndXJhdGlvblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF90c2lNb2RhbFNlcnZpY2U6IFRzaU1vZGFsU2VydmljZSxcclxuICAgIHByaXZhdGUgX21lc3NhZ2VTZXJ2aWNlOiBUc2lOb3RpZmljYXRpb25TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfaHR0cENsaWVudDogSHR0cENsaWVudCxcclxuICAgIHByb3RlY3RlZCBfY2RSZWY/OiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICApIHtcclxuICAgIHN1cGVyKF9jZFJlZilcclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG4gIC8vI3JlZ2lvbiBoYW5kbGUgbGlmZWN5Y2xlIGhvb2tzXHJcbiAgb3ZlcnJpZGUgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xyXG4gICAgdGhpcy5fcmVsb2FkU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGlzU3RhdHVzQ29tYm8oKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5jb21ib1R5cGUgPT09ICdzdGF0dXMnO1xyXG4gIH1cclxuICBcclxuICBsaWdodGVuQ29sb3IoaGV4OiBzdHJpbmcgfCB1bmRlZmluZWQsIHBlcmNlbnQ6IG51bWJlciA9IDQwKTogc3RyaW5nIHtcclxuICAgIGlmICghaGV4KSByZXR1cm4gJyc7XHJcbiAgICBoZXggPSBoZXgucmVwbGFjZSgvXiMvLCAnJyk7XHJcbiAgICBcclxuICAgIGxldCByID0gcGFyc2VJbnQoaGV4LnN1YnN0cmluZygwLCAyKSwgMTYpO1xyXG4gICAgbGV0IGcgPSBwYXJzZUludChoZXguc3Vic3RyaW5nKDIsIDQpLCAxNik7XHJcbiAgICBsZXQgYiA9IHBhcnNlSW50KGhleC5zdWJzdHJpbmcoNCwgNiksIDE2KTtcclxuXHJcbiAgICByID0gTWF0aC5taW4oMjU1LCBNYXRoLmZsb29yKHIgKyAoMjU1IC0gcikgKiBwZXJjZW50IC8gMTAwKSk7XHJcbiAgICBnID0gTWF0aC5taW4oMjU1LCBNYXRoLmZsb29yKGcgKyAoMjU1IC0gZykgKiBwZXJjZW50IC8gMTAwKSk7XHJcbiAgICBiID0gTWF0aC5taW4oMjU1LCBNYXRoLmZsb29yKGIgKyAoMjU1IC0gYikgKiBwZXJjZW50IC8gMTAwKSk7XHJcblxyXG4gICAgY29uc3QgbmV3SGV4ID1cclxuICAgICAgJyMnICtcclxuICAgICAgW3IsIGcsIGJdXHJcbiAgICAgICAgLm1hcCh4ID0+IHgudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsICcwJykpXHJcbiAgICAgICAgLmpvaW4oJycpO1xyXG5cclxuICAgIHJldHVybiBuZXdIZXg7XHJcbiAgfVxyXG5cclxuICBnZXRSZWFkYWJsZVRleHRDb2xvcihoZXg6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XHJcbiAgICBpZiAoIWhleCkgcmV0dXJuICdibGFjayc7XHJcblxyXG4gICAgaGV4ID0gaGV4LnJlcGxhY2UoL14jLywgJycpO1xyXG4gICAgY29uc3QgciA9IHBhcnNlSW50KGhleC5zdWJzdHJpbmcoMCwgMiksIDE2KTtcclxuICAgIGNvbnN0IGcgPSBwYXJzZUludChoZXguc3Vic3RyaW5nKDIsIDQpLCAxNik7XHJcbiAgICBjb25zdCBiID0gcGFyc2VJbnQoaGV4LnN1YnN0cmluZyg0LCA2KSwgMTYpO1xyXG5cclxuICAgIGNvbnN0IGJyaWdodG5lc3MgPSAociAqIDI5OSArIGcgKiA1ODcgKyBiICogMTE0KSAvIDEwMDA7XHJcblxyXG4gICAgcmV0dXJuIGJyaWdodG5lc3MgPiAyMzAgPyAnYmxhY2snIDogYCMke2hleH1gO1xyXG4gIH1cclxuXHJcbiAgZ2V0U3RhdHVzT3B0aW9uKHZhbHVlOiBzdHJpbmcpOiBTdGF0dXNPcHRpb24gfCB1bmRlZmluZWQge1xyXG4gICAgcmV0dXJuIHRoaXMuc3RhdHVzTWV0YWRhdGE/Lm9wdGlvbnMuZmluZChvID0+IG8udHJhbnNsYXRlZExhYmVsID09PSB2YWx1ZSk7XHJcbiAgfVxyXG5cclxuICBvdmVycmlkZSBhc3luYyBuZ09uSW5pdCgpIHtcclxuICAgIHN1cGVyLm5nT25Jbml0KCk7XHJcbiAgICB0aGlzLmNoZWNrSWZBZHZhbmNlZFNlYXJjaENvbXBvbmVudEV4aXN0cygpO1xyXG4gICAgICBhd2FpdCB0aGlzLmNoZWNrSWZGb3JtTmFtZUV4aXN0cygpOyBcclxuICAgIHRoaXMuX2luaXRQYXJhbWV0ZXJzV2l0aERlZmF1bHRzKCk7XHJcbiAgICB0aGlzLl9pbml0UmVsb2FkRGF0YVNvdXJjZVN1YnNjcmlwdGlvbigpO1xyXG4gICAgYXdhaXQgdGhpcy5faW5pdGlhbExvYWREYXRhKCk7XHJcbiAgICBsZXQgbGFuZ3VlID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0ocnRsTW9kZUtleXMucnRsTW9kZUVuYWJsZWQpO1xyXG4gICAgaWYgKGxhbmd1ZSAmJiBKU09OLnBhcnNlKGxhbmd1ZSkpIHtcclxuICAgICAgdGhpcy5pc0FyID0gdHJ1ZVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMuaXNBciA9IGZhbHNlXHJcbiAgICB9XHJcblxyXG5cclxuICAgIHRoaXMubWF4V2lkdGggPSB0aGlzLm1heFdpZHRoICsgJ3JlbSc7XHJcbiAgfVxyXG4gIC8vI2VuZHJlZ2lvblxyXG4gIEBJbnB1dCgpIHNob3dTZWFyY2hCdXR0b246IGJvb2xlYW4gPSB0cnVlO1xyXG4gIEBJbnB1dCgpIHNob3dBZGRCdXR0b246IGJvb2xlYW4gPSB0cnVlO1xyXG4gIEBJbnB1dCgpIHNob3dDb25zdWx0QnV0dG9uPzogYm9vbGVhbjtcclxuICBASW5wdXQoKSBzaG93VXBkYXRlQnV0dG9uPzogYm9vbGVhbjtcclxuICBzaG93QWR2YW5jZWRTZWFyY2hCdXR0b246IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcblxyXG5cclxuICBjaGVja0lmQWR2YW5jZWRTZWFyY2hDb21wb25lbnRFeGlzdHMoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuYnVzaW5lc3NDbGFzcykge1xyXG4gICAgICB0aGlzLnNob3dBZHZhbmNlZFNlYXJjaEJ1dHRvbiA9IGZhbHNlO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLmVudGl0eUNvbmZpZ3VyYXRpb25TZXJ2aWNlLmdldEVudGl0eUluZm8odGhpcy5idXNpbmVzc0NsYXNzKS5zdWJzY3JpYmUoe1xyXG5cclxuICAgICAgbmV4dDogKGVudGl0eTogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy5zaG93QWR2YW5jZWRTZWFyY2hCdXR0b24gPSAhIWVudGl0eT8uYWR2YW5jZWRTZWFyY2hDb21wb25lbnQ7XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiAoZXJyKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xyXG4gICAgICAgIHRoaXMuc2hvd0FkdmFuY2VkU2VhcmNoQnV0dG9uID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuICBcclxuIGNoZWNrSWZGb3JtTmFtZUV4aXN0cygpOiBQcm9taXNlPHZvaWQ+IHtcclxuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcclxuICAgIGlmICghdGhpcy5idXNpbmVzc0NsYXNzKSB7XHJcbiAgICAgIGlmICh0aGlzLnNob3dBZGRCdXR0b24gPT09IHVuZGVmaW5lZCkgdGhpcy5zaG93QWRkQnV0dG9uID0gZmFsc2U7XHJcbiAgICAgIGlmICh0aGlzLnNob3dDb25zdWx0QnV0dG9uID09PSB1bmRlZmluZWQpIHRoaXMuc2hvd0NvbnN1bHRCdXR0b24gPSBmYWxzZTtcclxuICAgICAgaWYgKHRoaXMuc2hvd1VwZGF0ZUJ1dHRvbiA9PT0gdW5kZWZpbmVkKSB0aGlzLnNob3dVcGRhdGVCdXR0b24gPSBmYWxzZTtcclxuICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5lbnRpdHlDb25maWd1cmF0aW9uU2VydmljZS5nZXRFbnRpdHlJbmZvKHRoaXMuYnVzaW5lc3NDbGFzcykuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKGVudGl0eTogYW55KSA9PiB7XHJcbiAgICAgICAgY29uc3QgaGFzRm9ybSA9ICEhZW50aXR5Py5mb3JtTmFtZTtcclxuXHJcbiAgICAgICAgY29uc29sZS5sb2coXCJzaG93QWRkQnV0dG9uXCIsdGhpcy5zaG93QWRkQnV0dG9uKVxyXG5cclxuICAgICAgICBpZighaGFzRm9ybSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICB0aGlzLnNob3dBZGRCdXR0b24gPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMuc2hvd1VwZGF0ZUJ1dHRvbiA9IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy5zaG93Q29uc3VsdEJ1dHRvbiA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnNob3dDb25zdWx0QnV0dG9uID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgIHRoaXMuc2hvd0NvbnN1bHRCdXR0b24gPSB0aGlzLnNob3dBZGRCdXR0b247XHJcbiAgICAgICAgfSAgICAgICAgXHJcblxyXG4gICAgICAgIGlmICh0aGlzLnNob3dVcGRhdGVCdXR0b24gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgdGhpcy5zaG93VXBkYXRlQnV0dG9uID0gdGhpcy5zaG93QWRkQnV0dG9uO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKGVycikgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuc2hvd0FkZEJ1dHRvbiA9PT0gdW5kZWZpbmVkKSB0aGlzLnNob3dBZGRCdXR0b24gPSBmYWxzZTtcclxuICAgICAgICBpZiAodGhpcy5zaG93Q29uc3VsdEJ1dHRvbiA9PT0gdW5kZWZpbmVkKSB0aGlzLnNob3dDb25zdWx0QnV0dG9uID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKHRoaXMuc2hvd1VwZGF0ZUJ1dHRvbiA9PT0gdW5kZWZpbmVkKSB0aGlzLnNob3dVcGRhdGVCdXR0b24gPSBmYWxzZTtcclxuXHJcbiAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9KTtcclxufSAgXHJcblxyXG5cclxuICBvcGVuQWR2YW5jZWRTZWFyY2hDb21wb25lbnQoKSB7XHJcbiAgICBpZiAoIXRoaXMuYnVzaW5lc3NDbGFzcykge1xyXG4gICAgICB0aGlzLl9tZXNzYWdlU2VydmljZT8uZXJyb3IoXCJzZWFyY2hfY29tYm9fY29tcG9uZW50X25hbWVFbnRpdHlcIik7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmVudGl0eUNvbmZpZ3VyYXRpb25TZXJ2aWNlLmdldEVudGl0eUluZm8odGhpcy5idXNpbmVzc0NsYXNzKS5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6IGFzeW5jIChlbnRpdHk6IGFueSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5zaG93QWR2YW5jZWRTZWFyY2hCdXR0b24gPSAhIWVudGl0eT8uYWR2YW5jZWRTZWFyY2hDb21wb25lbnQ7XHJcbiAgICAgICAgICBpZiAoIWVudGl0eSB8fCAhZW50aXR5LmFkdmFuY2VkU2VhcmNoQ29tcG9uZW50KSB7XHJcbiAgICAgICAgICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlPy5lcnJvcihcInNlYXJjaF9jb21ib19jb21wb25lbnRfZm9ybV9uYW1lX25mXCIpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgbGV0IGNvbmY6IER5bmFtaWNEaWFsb2dDb25maWcgPSB7XHJcbiAgICAgICAgICAgIGRhdGE6IHtcclxuICAgICAgICAgICAgICBpc0FkdmFuY2VkU2VhcmNoOiB0cnVlLFxyXG4gICAgICAgICAgICAgIHNlbGVjdGlvbk1vZGU6IEdyaWRTZWxlY3Rpb25Nb2RlLlNpbmdsZSxcclxuICAgICAgICAgICAgICBtb2RlOiBDb21wb25lbnRfTW9kZXMuQ09OU1VMVCxcclxuICAgICAgICAgICAgICBjdXN0b21EYXRhOiBlbnRpdHlcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgc3R5bGVDbGFzczogJycsXHJcbiAgICAgICAgICAgIHdpZHRoOiBNb2RhbFNpemVFbnVtLk1lZGl1bS53aWR0aCxcclxuICAgICAgICAgICAgaGVpZ2h0OiBNb2RhbFNpemVFbnVtLk1lZGl1bS5oZWlnaHQsXHJcbiAgICAgICAgICAgIG1heGltaXphYmxlOiB0cnVlLFxyXG4gICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICB0aGlzLl9kaWFsb2dSZWZlcmVuY2UgPSB0aGlzLl90c2lNb2RhbFNlcnZpY2U/Lm9wZW4oVHlwZVJlZ2lzdHJ5SGVscGVyLmdldFR5cGUoZW50aXR5LmFkdmFuY2VkU2VhcmNoQ29tcG9uZW50KSwgY29uZik7XHJcblxyXG4gICAgICAgICAgdGhpcy5fZGlhbG9nUmVmZXJlbmNlPy5vbkNsb3NlLnN1YnNjcmliZSgoc2VsZWN0ZWRQZXJzb246IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWRQZXJzb24pIHtcclxuICAgICAgICAgICAgICB0aGlzLmJpbmQgPSBzZWxlY3RlZFBlcnNvbjtcclxuICAgICAgICAgICAgICB0aGlzLmJpbmRDaGFuZ2UuZW1pdCh0aGlzLmJpbmQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGVycm9yOiAoZXJyKSA9PiB7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XHJcbiAgICAgICAgICB0aGlzLnNob3dBZHZhbmNlZFNlYXJjaEJ1dHRvbiA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgb3BlblNlYXJjaERpYWxvZygpIHtcclxuICAgIGNvbnNvbGUubG9nKFwiY2xhc3M6IFwiLCB0aGlzLmJ1c2luZXNzQ2xhc3MpXHJcbiAgICBpZiAoIXRoaXMuYnVzaW5lc3NDbGFzcykge1xyXG4gICAgICB0aGlzLl9tZXNzYWdlU2VydmljZT8uZXJyb3IoXCJzZWFyY2hfY29tYm9fY29tcG9uZW50X25hbWVFbnRpdHlcIik7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5lbnRpdHlDb25maWd1cmF0aW9uU2VydmljZS5nZXRFbnRpdHlJbmZvKHRoaXMuYnVzaW5lc3NDbGFzcykuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiBhc3luYyAoZW50aXR5OiBhbnkpID0+IHtcclxuICAgICAgICAgIGxldCBjb25mOiBEeW5hbWljRGlhbG9nQ29uZmlnID0ge1xyXG4gICAgICAgICAgICBkYXRhOiB7IGlzQWR2YW5jZWRTZWFyY2g6IHRydWUsIHNlbGVjdGlvbk1vZGU6IEdyaWRTZWxlY3Rpb25Nb2RlLlNpbmdsZSwgbW9kZTogQ29tcG9uZW50X01vZGVzLkNPTlNVTFQsIGN1c3RvbURhdGE6IGVudGl0eSB9LFxyXG4gICAgICAgICAgICBzdHlsZUNsYXNzOiAnJyxcclxuICAgICAgICAgICAgd2lkdGg6IE1vZGFsU2l6ZUVudW0uTWVkaXVtLndpZHRoLFxyXG4gICAgICAgICAgICBoZWlnaHQ6IE1vZGFsU2l6ZUVudW0uTWVkaXVtLmhlaWdodCxcclxuICAgICAgICAgICAgbWF4aW1pemFibGU6IHRydWUsXHJcbiAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgIGlmICghZW50aXR5IHx8ICFlbnRpdHkubGlzdENvbXBvbmVudCkge1xyXG4gICAgICAgICAgICB0aGlzLl9tZXNzYWdlU2VydmljZT8uZXJyb3IoXCJzZWFyY2hfY29tYm9fY29tcG9uZW50X2Zvcm1fbmFtZV9uZlwiKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5fZGlhbG9nUmVmZXJlbmNlID0gdGhpcy5fdHNpTW9kYWxTZXJ2aWNlPy5vcGVuKFR5cGVSZWdpc3RyeUhlbHBlci5nZXRUeXBlKGVudGl0eS5saXN0Q29tcG9uZW50KSwgY29uZik7XHJcbiAgICAgICAgICB0aGlzLl9kaWFsb2dSZWZlcmVuY2U/Lm9uQ2xvc2Uuc3Vic2NyaWJlKChzZWxlY3RlZFBlcnNvbjogYW55KSA9PiB7XHJcblxyXG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWRQZXJzb24pIHtcclxuICAgICAgICAgICAgICB0aGlzLmJpbmQgPSBzZWxlY3RlZFBlcnNvbjtcclxuICAgICAgICAgICAgICB0aGlzLmJpbmRDaGFuZ2UuZW1pdCh0aGlzLmJpbmQpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6IChlcnIpID0+IHtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuICBhZGRFbGVtZW50KCkge1xyXG4gICAgaWYgKCF0aGlzLmJ1c2luZXNzQ2xhc3MpIHtcclxuICAgICAgdGhpcy5fbWVzc2FnZVNlcnZpY2U/LmVycm9yKFwic2VhcmNoX2NvbWJvX2NvbXBvbmVudF9uYW1lRW50aXR5XCIpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMuZW50aXR5Q29uZmlndXJhdGlvblNlcnZpY2UuZ2V0RW50aXR5SW5mbyh0aGlzLmJ1c2luZXNzQ2xhc3MpLnN1YnNjcmliZSh7XHJcbiAgICAgICAgbmV4dDogYXN5bmMgKGVudGl0eTogYW55KSA9PiB7XHJcbiAgICAgICAgICBsZXQgY29uZjogRHluYW1pY0RpYWxvZ0NvbmZpZyA9IHtcclxuICAgICAgICAgICAgZGF0YTogeyBtb2RlOiBDb21wb25lbnRfTW9kZXMuQ1JFQVRFLCBjdXN0b21EYXRhOiBlbnRpdHkgfSxcclxuICAgICAgICAgICAgc3R5bGVDbGFzczogJycsXHJcbiAgICAgICAgICAgIHdpZHRoOiBNb2RhbFNpemVFbnVtLk1lZGl1bS53aWR0aCxcclxuICAgICAgICAgICAgaGVpZ2h0OiBNb2RhbFNpemVFbnVtLk1lZGl1bS5oZWlnaHQsXHJcbiAgICAgICAgICAgIG1heGltaXphYmxlOiB0cnVlLFxyXG4gICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICBpZiAoIWVudGl0eSB8fCAhZW50aXR5LmZvcm1OYW1lKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlPy5lcnJvcihcInNlYXJjaF9jb21ib19jb21wb25lbnRfZm9ybV9uYW1lX25mXCIpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLl9kaWFsb2dSZWZlcmVuY2UgPSB0aGlzLl90c2lNb2RhbFNlcnZpY2U/Lm9wZW4oVHlwZVJlZ2lzdHJ5SGVscGVyLmdldFR5cGUoZW50aXR5LmZvcm1OYW1lKSwgY29uZik7XHJcbiAgICAgICAgICB0aGlzLl9kaWFsb2dSZWZlcmVuY2U/Lm9uQ2xvc2Uuc3Vic2NyaWJlKChzYXZlZEVsZW1lbnQ6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoc2F2ZWRFbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiBzYXZlZEVsZW1lbnQgPT09ICdvYmplY3QnICYmIHNhdmVkRWxlbWVudCAhPT0gbnVsbCAmJiAndWlkJyBpbiBzYXZlZEVsZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYmluZCA9IHNhdmVkRWxlbWVudD8udWlkO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5iaW5kQ2hhbmdlLmVtaXQodGhpcy5iaW5kKVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlb2Ygc2F2ZWRFbGVtZW50ID09PSAnc3RyaW5nJyAmJiBHdWlkLmlzVmFsaWQoc2F2ZWRFbGVtZW50KSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5iaW5kID0gc2F2ZWRFbGVtZW50O1xyXG4gICAgICAgICAgICAgICAgdGhpcy5iaW5kQ2hhbmdlLmVtaXQodGhpcy5iaW5kKVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvcjogKGVycikgPT4ge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB1cGRhdGVFbGVtZW50KCkge1xyXG4gIGlmICghdGhpcy5idXNpbmVzc0NsYXNzKSB7XHJcbiAgICB0aGlzLl9tZXNzYWdlU2VydmljZT8uZXJyb3IoXCJzZWFyY2hfY29tYm9fY29tcG9uZW50X25hbWVFbnRpdHlcIik7XHJcbiAgICByZXR1cm47XHJcbiAgfVxyXG5cclxuICBpZiAoIXRoaXMuYmluZCkge1xyXG4gICAgdGhpcy5fbWVzc2FnZVNlcnZpY2U/LmVycm9yKFwiQXVjdW4gw6lsw6ltZW50IHPDqWxlY3Rpb25uw6kgcG91ciBsYSBtaXNlIMOgIGpvdXIuXCIpO1xyXG4gICAgcmV0dXJuO1xyXG4gIH1cclxuXHJcbiAgdGhpcy5lbnRpdHlDb25maWd1cmF0aW9uU2VydmljZS5nZXRFbnRpdHlJbmZvKHRoaXMuYnVzaW5lc3NDbGFzcykuc3Vic2NyaWJlKHtcclxuICAgIG5leHQ6IGFzeW5jIChlbnRpdHk6IGFueSkgPT4ge1xyXG4gICAgICBpZiAoIWVudGl0eSB8fCAhZW50aXR5LmZvcm1OYW1lKSB7XHJcbiAgICAgICAgdGhpcy5fbWVzc2FnZVNlcnZpY2U/LmVycm9yKFwic2VhcmNoX2NvbWJvX2NvbXBvbmVudF9mb3JtX25hbWVfbmZcIik7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGxldCBjb25mOiBEeW5hbWljRGlhbG9nQ29uZmlnID0ge1xyXG4gICAgICAgIGRhdGE6IHtcclxuICAgICAgICAgIG1vZGU6IENvbXBvbmVudF9Nb2Rlcy5FRElULFxyXG4gICAgICAgICAgY3VzdG9tRGF0YTogZW50aXR5LFxyXG4gICAgICAgICAgaWQ6IHRoaXMuYmluZFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgXHJcbiAgICAgICAgc3R5bGVDbGFzczogJycsXHJcbiAgICAgICAgd2lkdGg6IE1vZGFsU2l6ZUVudW0uTWVkaXVtLndpZHRoLFxyXG4gICAgICAgIGhlaWdodDogTW9kYWxTaXplRW51bS5NZWRpdW0uaGVpZ2h0LFxyXG4gICAgICAgIG1heGltaXphYmxlOiB0cnVlLFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgdGhpcy5fZGlhbG9nUmVmZXJlbmNlID0gdGhpcy5fdHNpTW9kYWxTZXJ2aWNlPy5vcGVuKFR5cGVSZWdpc3RyeUhlbHBlci5nZXRUeXBlKGVudGl0eS5mb3JtTmFtZSksIGNvbmYpO1xyXG5cclxuICAgICAgdGhpcy5fZGlhbG9nUmVmZXJlbmNlPy5vbkNsb3NlLnN1YnNjcmliZSgodXBkYXRlZEVsZW1lbnQ6IGFueSkgPT4ge1xyXG4gICAgICBpZiAodXBkYXRlZEVsZW1lbnQpIHtcclxuICAgICAgICBpZiAodHlwZW9mIHVwZGF0ZWRFbGVtZW50ID09PSAnb2JqZWN0JyAmJiB1cGRhdGVkRWxlbWVudCAhPT0gbnVsbCAmJiAndWlkJyBpbiB1cGRhdGVkRWxlbWVudCkge1xyXG4gICAgICAgICAgdGhpcy5iaW5kID0gdXBkYXRlZEVsZW1lbnQudWlkO1xyXG4gICAgICAgICAgdGhpcy5iaW5kQ2hhbmdlLmVtaXQodGhpcy5iaW5kKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB1cGRhdGVkRWxlbWVudCA9PT0gJ3N0cmluZycgJiYgR3VpZC5pc1ZhbGlkKHVwZGF0ZWRFbGVtZW50KSkge1xyXG4gICAgICAgICAgdGhpcy5iaW5kID0gdXBkYXRlZEVsZW1lbnQ7XHJcbiAgICAgICAgICB0aGlzLmJpbmRDaGFuZ2UuZW1pdCh0aGlzLmJpbmQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG59KTtcclxuICAgIH0sXHJcbiAgICBlcnJvcjogKGVycikgPT4ge1xyXG4gICAgICBjb25zb2xlLmVycm9yKGVycik7XHJcbiAgICB9XHJcbiAgfSk7XHJcbn1cclxuY29uc3VsdEVsZW1lbnQoKSB7XHJcbiAgaWYgKCF0aGlzLmJ1c2luZXNzQ2xhc3MpIHtcclxuICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlPy5lcnJvcihcInNlYXJjaF9jb21ib19jb21wb25lbnRfbmFtZUVudGl0eVwiKTtcclxuICAgIHJldHVybjtcclxuICB9XHJcblxyXG4gIGlmICghdGhpcy5iaW5kKSB7XHJcbiAgICB0aGlzLl9tZXNzYWdlU2VydmljZT8uZXJyb3IoXCJBdWN1biDDqWzDqW1lbnQgc8OpbGVjdGlvbm7DqSBwb3VyIGxhIGNvbnN1bHRhdGlvbi5cIik7XHJcbiAgICByZXR1cm47XHJcbiAgfVxyXG5cclxuICB0aGlzLmVudGl0eUNvbmZpZ3VyYXRpb25TZXJ2aWNlLmdldEVudGl0eUluZm8odGhpcy5idXNpbmVzc0NsYXNzKS5zdWJzY3JpYmUoe1xyXG4gICAgbmV4dDogYXN5bmMgKGVudGl0eTogYW55KSA9PiB7XHJcbiAgICAgIGlmICghZW50aXR5IHx8ICFlbnRpdHkuZm9ybU5hbWUpIHtcclxuICAgICAgICB0aGlzLl9tZXNzYWdlU2VydmljZT8uZXJyb3IoXCJzZWFyY2hfY29tYm9fY29tcG9uZW50X2Zvcm1fbmFtZV9uZlwiKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IGNvbmY6IER5bmFtaWNEaWFsb2dDb25maWcgPSB7XHJcbiAgICAgICAgZGF0YToge1xyXG4gICAgICAgICAgbW9kZTogQ29tcG9uZW50X01vZGVzLkNPTlNVTFQsXHJcbiAgICAgICAgICBjdXN0b21EYXRhOiBlbnRpdHksXHJcbiAgICAgICAgICBpZDogdGhpcy5iaW5kICAgXHJcbiAgICAgICAgfSxcclxuICAgICAgICBzdHlsZUNsYXNzOiAnJyxcclxuICAgICAgICB3aWR0aDogTW9kYWxTaXplRW51bS5NZWRpdW0ud2lkdGgsXHJcbiAgICAgICAgaGVpZ2h0OiBNb2RhbFNpemVFbnVtLk1lZGl1bS5oZWlnaHQsXHJcbiAgICAgICAgbWF4aW1pemFibGU6IHRydWUsXHJcbiAgICAgIH07XHJcblxyXG4gICAgICB0aGlzLl9kaWFsb2dSZWZlcmVuY2UgPSB0aGlzLl90c2lNb2RhbFNlcnZpY2U/Lm9wZW4oXHJcbiAgICAgICAgVHlwZVJlZ2lzdHJ5SGVscGVyLmdldFR5cGUoZW50aXR5LmZvcm1OYW1lKSxcclxuICAgICAgICBjb25mXHJcbiAgICAgICk7XHJcblxyXG4gICAgICB0aGlzLl9kaWFsb2dSZWZlcmVuY2U/Lm9uQ2xvc2Uuc3Vic2NyaWJlKChfKSA9PiB7XHJcbiAgICAgIH0pO1xyXG4gICAgfSxcclxuICAgIGVycm9yOiAoZXJyKSA9PiB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJldXIgbG9ycyBkZSBsYSByw6ljdXDDqXJhdGlvbiBkZXMgaW5mb3MgZCdlbnRpdMOpIDpcIiwgZXJyKTtcclxuICAgIH1cclxuICB9KTtcclxufVxyXG5cclxuXHJcbiAgLy8jcmVnaW9uIGhhbmRsZSBldmVudHNcclxuICBiaW5kVmFsdWVDaGFuZ2VkKGV2ZW50OiBhbnkpIHtcclxuICAgIHRoaXMuYmluZCA9IGV2ZW50LnZhbHVlO1xyXG4gICAgaWYgKHRoaXMuYmluZCAhPT0gbnVsbCAmJiB0aGlzLmJpbmQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aGlzLl9zZWxlY3RlZCA9IHRoaXMuYmluZFxyXG4gICAgfVxyXG4gICAgdGhpcy5iaW5kQ2hhbmdlLmVtaXQoZXZlbnQudmFsdWUpO1xyXG5cclxuICAgIGlmICghdGhpcy5fYmluZENoYW5nZUVtaXR0ZWQpIHtcclxuICAgICAgdGhpcy5fYmluZENoYW5nZUVtaXR0ZWQgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBzZWxlY3RlZEVsZW1lbnQ6IGFueSA9IHRoaXMuZGF0YXNvdXJjZS5maW5kKGUgPT4gZS5pZCA9PSB0aGlzLmJpbmQpO1xyXG4gICAgaWYgKHNlbGVjdGVkRWxlbWVudCkge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkTGFiZWxDaGFuZ2UuZW1pdChzZWxlY3RlZEVsZW1lbnQubGFiZWwpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2VhcmNoVmFsdWVDaGFuZ2VkKHNlYXJjaFZhbHVlOiBhbnkpIHtcclxuICAgIGlmICh0aGlzLmlzRmlsdGVyZWQgJiYgIXRoaXMuX2lzSW5wdXREYXRhc291cmNlKSB7XHJcbiAgICAgIHRoaXMuX2xvYWRTZXJ2ZXJTaWRlUGFnZWREYXRhU291cmNlKHNlYXJjaFZhbHVlLmZpbHRlcik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbk9wZW4oKSB7XHJcbiAgICBpZiAodGhpcy5pc0ZpbHRlcmVkIHx8IHR5cGVvZiB0aGlzLmxpc3RTb3VyY2VVcmwgPT0gXCJmdW5jdGlvblwiKSB7XHJcbiAgICAgIHRoaXMuX2xvYWREYXRhU291cmNlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbkhpZGUoKSB7XHJcbiAgICBpZiAodGhpcy5kYXRhTG9hZGVkKSB7XHJcbiAgICAgIHRoaXMuYmluZCA9IHRoaXMuX3NlbGVjdGVkXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjbGVhclNlbGVjdGVkVmFsdWUoKSB7XHJcbiAgICB0aGlzLl9zZWxlY3RlZCA9IHVuZGVmaW5lZFxyXG4gIH1cclxuICAvLyNlbmRyZWdpb25cclxuXHJcbiAgLy8jcmVnaW9uIHByaXZhdGUgbWV0aG9kc1xyXG4gIHByaXZhdGUgX2xvYWREYXRhU291cmNlKCkge1xyXG4gICAgaWYgKCF0aGlzLl9pc0lucHV0RGF0YXNvdXJjZSkge1xyXG4gICAgICBpZiAodGhpcy5pc0ZpbHRlcmVkKSB7XHJcbiAgICAgICAgdGhpcy5fbG9hZFNlcnZlclNpZGVQYWdlZERhdGFTb3VyY2UoKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICB0aGlzLl9sb2FkTm90U2VydmVyU2lkZVBhZ2VkRGF0YVNvdXJjZSgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9sb2FkU2VydmVyU2lkZVBhZ2VkRGF0YVNvdXJjZShrZXl3b3JkOiBzdHJpbmcgPSBcIlwiKSB7XHJcbiAgICBpZiAodGhpcy5fdmFsaWRhdGVMaXN0SW5wdXRzKCkpIHtcclxuICAgICAgdGhpcy5fZGF0YXNvdXJjZSA9IFtdO1xyXG4gICAgICB0aGlzLmRhdGFMb2FkZWQgPSBmYWxzZTtcclxuICAgICAgdGhpcy5faHR0cENsaWVudC5nZXQodGhpcy5faW5pdExpc3REYXRhU291cmNlRW5kcG9pbnQoKSwgdGhpcy5fZ2VuZXJhdGVIdHRwUGFyYW1zKGtleXdvcmQpKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgbmV4dDogKGRhdGE6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLl9nb3R0ZW5EYXRhc291cmNlID0gZGF0YTtcclxuICAgICAgICAgICAgdGhpcy5fbWFwR290dGVuRGF0YVNvdXJjZVRvTG9jYWxEYXRhc291cmNlKCk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmRhdGFMb2FkZWQgPSBmYWxzZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgKTtcclxuXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9sb2FkTm90U2VydmVyU2lkZVBhZ2VkRGF0YVNvdXJjZSgpIHtcclxuICAgIGlmICh0aGlzLl92YWxpZGF0ZUxpc3RJbnB1dHMoKSkge1xyXG4gICAgICB0aGlzLl9kYXRhc291cmNlID0gW107XHJcbiAgICAgIHRoaXMuZGF0YUxvYWRlZCA9IGZhbHNlO1xyXG4gICAgICB0aGlzLl9odHRwQ2xpZW50LmdldCh0aGlzLl9pbml0TGlzdERhdGFTb3VyY2VFbmRwb2ludCgpKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgbmV4dDogKGRhdGE6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLl9nb3R0ZW5EYXRhc291cmNlID0gZGF0YTtcclxuICAgICAgICAgICAgdGhpcy5fbWFwR290dGVuRGF0YVNvdXJjZVRvTG9jYWxEYXRhc291cmNlKCk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmRhdGFMb2FkZWQgPSBmYWxzZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgKTtcclxuXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIF9sb2FkQmluZEVsZW1lbnQoKSB7XHJcbiAgICBpZiAodGhpcy5fdmFsaWRhdGVCaW5kRWxlbWVudElucHV0cygpKSB7XHJcbiAgICAgIGlmICh0aGlzLmJpbmQpIHtcclxuICAgICAgICB0aGlzLl9kYXRhc291cmNlID0gW107XHJcbiAgICAgICAgdGhpcy5kYXRhTG9hZGVkID0gZmFsc2U7XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICBjb25zdCBkYXRhOiBhbnkgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbSh0aGlzLl9odHRwQ2xpZW50LmdldCh0aGlzLl9pbml0RWxlbWVudEVuZHBvaW50KCkpKTtcclxuXHJcbiAgICAgICAgICBsZXQgdGVtcEFycmF5OiBhbnlbXSA9IFtdO1xyXG4gICAgICAgICAgbGV0IG9iaiA9IHtcclxuICAgICAgICAgICAgaWQ6IGRhdGFbdGhpcy5pZEZpZWxkXSxcclxuICAgICAgICAgICAgbGFiZWw6IGRhdGFbdGhpcy5sYWJlbEZpZWxkXVxyXG4gICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICB0aGlzLl9zZWxlY3RlZCA9IG9iai5pZDtcclxuICAgICAgICAgIHRlbXBBcnJheS5wdXNoKG9iaik7XHJcbiAgICAgICAgICB0aGlzLl9kYXRhc291cmNlID0gdGVtcEFycmF5O1xyXG4gICAgICAgICAgdGhpcy5kYXRhTG9hZGVkID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkTGFiZWxDaGFuZ2UuZW1pdChvYmoubGFiZWwpO1xyXG4gICAgICAgICAgdGhpcy5kYXRhU291cmNlTG9hZGVkLmVtaXQoKTtcclxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgdGhpcy5kYXRhTG9hZGVkID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9jb21wYXJlRnVuY3Rpb24oKTogKGE6IGFueSwgYjogYW55KSA9PiBudW1iZXIge1xyXG4gICAgcmV0dXJuIChhLCBiKSA9PiB7XHJcbiAgICAgIGlmIChhLmxhYmVsID4gYi5sYWJlbCkgeyByZXR1cm4gMTsgfVxyXG4gICAgICBpZiAoYS5sYWJlbCA8IGIubGFiZWwpIHsgcmV0dXJuIC0xOyB9XHJcbiAgICAgIHJldHVybiAwO1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3ZhbGlkYXRlTGlzdElucHV0cygpOiBib29sZWFuIHtcclxuICAgIGlmICh0aGlzLmxpc3RTb3VyY2VVcmwgPT0gdW5kZWZpbmVkIHx8IHRoaXMubGlzdFNvdXJjZVVybCA9PT0gJycpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdsaXN0U291cmNlVXJsIHVybCBub3QgZGVmaW5lZCcpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF92YWxpZGF0ZUJpbmRFbGVtZW50SW5wdXRzKCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMuZWxlbWVudFNvdXJjZVVybCA9PSB1bmRlZmluZWQgfHwgdGhpcy5lbGVtZW50U291cmNlVXJsID09PSAnJykge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2VsZW1lbnRTb3VyY2VVcmwgbm90IGRlZmluZWQnKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2luaXRQYXJhbWV0ZXJzV2l0aERlZmF1bHRzKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuaWRGaWVsZCA9PSB1bmRlZmluZWQgfHwgdGhpcy5pZEZpZWxkID09PSBcIlwiKSB7XHJcbiAgICAgIHRoaXMuaWRGaWVsZCA9IFwiaWRcIjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5sYWJlbEZpZWxkID09IHVuZGVmaW5lZCB8fCB0aGlzLmxhYmVsRmllbGQgPT09IFwiXCIpIHtcclxuICAgICAgdGhpcy5sYWJlbEZpZWxkID0gXCJsaWJlbGxlXCI7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9pbml0RWxlbWVudEVuZHBvaW50KCk6IHN0cmluZyB7XHJcbiAgICBpZiAodGhpcy5iaW5kKSB7XHJcbiAgICAgIHJldHVybiBlbmNvZGVVUkkoYCR7dGhpcy5lbGVtZW50U291cmNlVXJsfS8ke3RoaXMuYmluZH1gKTtcclxuICAgIH1cclxuICAgIGVsc2UgdGhyb3cgbmV3IEVycm9yKCdubyBiaW5kIGlucHV0IHdhcyBwcm92aWRlZCwgY2Fubm90IGNyZWF0ZSBiaW5kRWxlbWVudFVybCcpXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9pbml0TGlzdERhdGFTb3VyY2VFbmRwb2ludCgpOiBzdHJpbmcge1xyXG4gICAgaWYgKCF0aGlzLmxpc3RTb3VyY2VVcmwpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCd5b3UgbXVzdCBwcm92aWRlIHRoZSBsaXN0IHNvdXJjZSB1cmwnKVxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0eXBlb2YgdGhpcy5saXN0U291cmNlVXJsID09IFwic3RyaW5nXCIpIHtcclxuICAgICAgcmV0dXJuIGVuY29kZVVSSShgJHt0aGlzLmxpc3RTb3VyY2VVcmx9YCk7XHJcbiAgICB9XHJcbiAgICBpZiAodHlwZW9mIHRoaXMubGlzdFNvdXJjZVVybCA9PSBcImZ1bmN0aW9uXCIpIHtcclxuICAgICAgbGV0IHRlbXBMaXN0U291cmNlVXJsID0gdGhpcy5saXN0U291cmNlVXJsKHRoaXMuY3VycmVudFJvd0l0ZW0pXHJcbiAgICAgIHJldHVybiBlbmNvZGVVUkkoYCR7dGVtcExpc3RTb3VyY2VVcmx9YClcclxuICAgIH1cclxuICAgIHJldHVybiBcIlwiXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIF9pbml0aWFsTG9hZERhdGEoKSB7XHJcbiAgICBpZiAodGhpcy5faXNJbnB1dERhdGFzb3VyY2UpIHtcclxuICAgICAgdGhpcy5fbWFwR290dGVuRGF0YVNvdXJjZVRvTG9jYWxEYXRhc291cmNlKCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKHRoaXMuaXNGaWx0ZXJlZCkge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuX2xvYWRCaW5kRWxlbWVudCgpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRoaXMuX2xvYWROb3RTZXJ2ZXJTaWRlUGFnZWREYXRhU291cmNlKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgX29uQmluZFNldCgpIHtcclxuICAgIGlmICh0aGlzLmlzRmlsdGVyZWQgJiYgIXRoaXMuX2JpbmRDaGFuZ2VFbWl0dGVkICYmICF0aGlzLl9pc0lucHV0RGF0YXNvdXJjZSkge1xyXG4gICAgICBhd2FpdCB0aGlzLl9sb2FkQmluZEVsZW1lbnQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2xvYWRBbGxEYXRhKCkge1xyXG4gICAgaWYgKHRoaXMuaXNGaWx0ZXJlZCkge1xyXG4gICAgICB0aGlzLl9sb2FkU2VydmVyU2lkZVBhZ2VkRGF0YVNvdXJjZSgpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMuX2xvYWROb3RTZXJ2ZXJTaWRlUGFnZWREYXRhU291cmNlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9pbml0UmVsb2FkRGF0YVNvdXJjZVN1YnNjcmlwdGlvbigpIHtcclxuICAgIGlmICh0aGlzLnJlbG9hZERhdGFTb3VyY2UpIHtcclxuICAgICAgdGhpcy5fcmVsb2FkU3Vic2NyaXB0aW9uID0gdGhpcy5yZWxvYWREYXRhU291cmNlLnN1YnNjcmliZShcclxuICAgICAgICAoZGF0YTogYW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAodHlwZW9mIChkYXRhKSA9PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICBpZiAoZGF0YSAhPSB1bmRlZmluZWQgJiYgZGF0YSAhPSBudWxsICYmIGRhdGEgIT0gJycpIHtcclxuICAgICAgICAgICAgICB0aGlzLmxpc3RTb3VyY2VVcmwgPSBkYXRhO1xyXG4gICAgICAgICAgICAgIHRoaXMuX2xvYWRBbGxEYXRhKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoZGF0YSkpIHtcclxuICAgICAgICAgICAgdGhpcy5kYXRhc291cmNlID0gZGF0YVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX21hcEdvdHRlbkRhdGFTb3VyY2VUb0xvY2FsRGF0YXNvdXJjZSgpOiB2b2lkIHtcclxuICAgIGxldCB0ZW1wQXJyYXk6IGFueVtdID0gW107XHJcbiAgICB0aGlzLl9nb3R0ZW5EYXRhc291cmNlLmZvckVhY2goKGVsZW1lbnQ6IGFueSkgPT4ge1xyXG4gICAgICBsZXQgb2JqID0ge1xyXG4gICAgICAgIGlkOiBlbGVtZW50W3RoaXMuaWRGaWVsZF0sXHJcbiAgICAgICAgbGFiZWw6IGVsZW1lbnRbdGhpcy5sYWJlbEZpZWxkXVxyXG4gICAgICB9O1xyXG4gICAgICB0ZW1wQXJyYXkucHVzaChvYmopO1xyXG4gICAgfSlcclxuICAgIHRoaXMuX2RhdGFzb3VyY2UgPSB0ZW1wQXJyYXk7XHJcbiAgICBpZiAodGhpcy5zb3J0KSB7XHJcbiAgICAgIHRoaXMuX2RhdGFzb3VyY2Uuc29ydCh0aGlzLl9jb21wYXJlRnVuY3Rpb24oKSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmRhdGFMb2FkZWQgPSB0cnVlO1xyXG4gICAgdGhpcy5kYXRhU291cmNlTG9hZGVkLmVtaXQoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2dlbmVyYXRlSHR0cFBhcmFtcyhrZXl3b3JkOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBhbnkge1xyXG4gICAgLy9pbml0IHBhcmFtc1xyXG4gICAgbGV0IHBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKCk7XHJcbiAgICBwYXJhbXMgPSBwYXJhbXMuYXBwZW5kKCd2YWx1ZScsIGtleXdvcmQgPz8gJycpO1xyXG5cclxuICAgIHJldHVybiB7IHBhcmFtczogcGFyYW1zIH07XHJcbiAgfVxyXG5cclxuICBvblNlYXJjaENvbWJvQ2xpY2soZXZlbnQ6IGFueSkge1xyXG4gICAgdGhpcy5vbkNsaWNrLmVtaXQoZXZlbnQpO1xyXG4gIH1cclxuICAvLyNlbmRyZWdpb25cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwiZmxleFwiPlxyXG4gIDxwLWRyb3Bkb3duIFtwbGFjZWhvbGRlcl09XCJwbGFjZUhvbGRlclwiIGNsYXNzPVwie3tteVN0eWxlQ2xhc3N9fVwiIFtyZXF1aXJlZF09XCJpc1JlcXVpcmVkXCJcclxuICAgIHN0eWxlQ2xhc3M9XCJ7e215U3R5bGVDbGFzc319IGJvcmRlci1yYWRpdXMtNyB7e3ZhbGlkYXRpb25TdGF0dXNDc3NDbGFzc319XCIgYXBwZW5kVG89XCJib2R5XCIgb3B0aW9uTGFiZWw9XCJsYWJlbFwiXHJcbiAgICBvcHRpb25WYWx1ZT1cImlkXCIgZmlsdGVyQnk9XCJsYWJlbFwiIFtvcHRpb25zXT1cImRhdGFzb3VyY2VcIiBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIiBbbGF6eV09XCIhZGF0YUxvYWRlZFwiXHJcbiAgICBbKG5nTW9kZWwpXT1cImJpbmRcIiBbZmlsdGVyXT1cInRydWVcIiBbc2hvd0NsZWFyXT1cInNob3dDbGVhclwiIFthdXRvRGlzcGxheUZpcnN0XT1cImZhbHNlXCJcclxuICAgIChvbkNoYW5nZSk9XCJiaW5kVmFsdWVDaGFuZ2VkKCRldmVudClcIiAob25IaWRlKT1cIm9uSGlkZSgpXCIgKG9uU2hvdyk9XCJvbk9wZW4oKVwiXHJcbiAgICAob25GaWx0ZXIpPVwic2VhcmNoVmFsdWVDaGFuZ2VkKCRldmVudClcIiAob25DbGVhcik9XCJjbGVhclNlbGVjdGVkVmFsdWUoKVwiIChvbkNsaWNrKT1cIm9uU2VhcmNoQ29tYm9DbGljaygkZXZlbnQpXCJcclxuICAgIFtzdHlsZV09XCJ7J21heC13aWR0aCc6IG1heFdpZHRoLCAnd2lkdGgnOicxMDAlJywgJ2hlaWdodCc6ICcxLjdyZW0nfVwiXHJcbiAgICBbbmdDbGFzc109XCJpc0FyID8gJ3AtZHJvcGRvd24tY2xlYXItaWNvbkFSJzogJ3AtZHJvcGRvd24tY2xlYXItaWNvbkZSJyBcIj5cclxuICAgIDwhLS0gQWpvdXQgZCd1biBib3V0b24gZGFucyBsZSBkcm9wZG93biAtLT5cclxuICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duLWhlYWRlciBmbGV4IGdhcC0xIHB0LTIgcHgtMlwiPlxyXG4gICAgICAgIDxUc2ktQnV0dG9uICpuZ0lmPVwic2hvd1NlYXJjaEJ1dHRvblwiIHR5cGU9XCJidXR0b25cIiBpY29uPVwicGkgcGktc2VhcmNoXCIgdGl0bGU9XCJ0aXRsZS1zZWFyY2gtY29tYm8tT3V2cmlyXCJcclxuICAgICAgICAgIHN0eWxlQ2xhc3M9XCJwLWJ1dHRvbi1wcmltYXJ5IGhvdmVyOnNoYWRvdy02IGgtMnJlbSBwLWJ1dHRvbi1pY29uLW9ubHlcIiAoY2xpY2spPVwib3BlblNlYXJjaERpYWxvZygpXCI+XHJcbiAgICAgICAgPC9Uc2ktQnV0dG9uPlxyXG5cclxuICAgICAgICA8VHNpLUJ1dHRvbiAqbmdJZj1cInNob3dBZGRCdXR0b25cIiB0eXBlPVwiYnV0dG9uXCIgaWNvbj1cInBpIHBpLXBsdXNcIiB0aXRsZT1cInRpdGxlLXNlYXJjaC1jb21iby1Bam91dGVyXCJcclxuICAgICAgICAgIHN0eWxlQ2xhc3M9XCJwLWJ1dHRvbi1zdWNjZXNzIGhvdmVyOnNoYWRvdy02IGgtMnJlbSBwLWJ1dHRvbi1pY29uLW9ubHlcIiAoY2xpY2spPVwiYWRkRWxlbWVudCgpXCI+XHJcbiAgICAgICAgPC9Uc2ktQnV0dG9uPlxyXG5cclxuICAgICAgICA8VHNpLUJ1dHRvbiAqbmdJZj1cInNob3dBZHZhbmNlZFNlYXJjaEJ1dHRvblwiIHR5cGU9XCJidXR0b25cIiBpY29uPVwicGkgcGktc29ydC1hbW91bnQtZG93blwiXHJcbiAgICAgICAgICB0aXRsZT1cIkxpc3RlciBsZXMgYXJ0aWNsZXMgcGl2b3TDqXNcIiBzdHlsZUNsYXNzPVwicC1idXR0b24tc2Vjb25kYXJ5IGhvdmVyOnNoYWRvdy02IGgtMnJlbSBwLWJ1dHRvbi1pY29uLW9ubHlcIlxyXG4gICAgICAgICAgKGNsaWNrKT1cIm9wZW5BZHZhbmNlZFNlYXJjaENvbXBvbmVudCgpXCI+XHJcbiAgICAgICAgPC9Uc2ktQnV0dG9uPlxyXG5cclxuICAgICAgICA8VHNpLUJ1dHRvbiAqbmdJZj1cInNob3dDb25zdWx0QnV0dG9uXCIgdHlwZT1cImJ1dHRvblwiIGljb249XCJwaSBwaS1leWVcIiB0aXRsZT1cInRpdGxlLXNlYXJjaC1jb21iby1Db25zdWx0ZXJcIlxyXG4gICAgICAgICAgc3R5bGVDbGFzcz1cInAtYnV0dG9uLXByaW1hcnkgaG92ZXI6c2hhZG93LTYgaC0ycmVtIHAtYnV0dG9uLWljb24tb25seVwiIChjbGljayk9XCJjb25zdWx0RWxlbWVudCgpXCI+XHJcbiAgICAgICAgPC9Uc2ktQnV0dG9uPlxyXG5cclxuICAgICAgICA8VHNpLUJ1dHRvbiAqbmdJZj1cInNob3dVcGRhdGVCdXR0b25cIiB0eXBlPVwiYnV0dG9uXCIgaWNvbj1cInBpIHBpLXBlbmNpbFwiIHRpdGxlPVwidGl0bGUtc2VhcmNoLWNvbWJvLXVwZGF0ZVwiXHJcbiAgICAgICAgICBzdHlsZUNsYXNzPVwicC1idXR0b24tcHJpbWFyeSBob3ZlcjpzaGFkb3ctNiBoLTJyZW0gcC1idXR0b24taWNvbi1vbmx5XCIgKGNsaWNrKT1cInVwZGF0ZUVsZW1lbnQoKVwiPlxyXG4gICAgICAgIDwvVHNpLUJ1dHRvbj5cclxuXHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgIDxuZy10ZW1wbGF0ZSBsZXQtdGFyZ2V0IHBUZW1wbGF0ZT1cIml0ZW1cIj5cclxuICAgICAgPGRpdiBwVG9vbHRpcD1cInt7dGFyZ2V0LmxhYmVsfX1cIiB0b29sdGlwUG9zaXRpb249XCJ0b3BcIiB0b29sdGlwU3R5bGVDbGFzcz1cImN1c3RvbS10b29sdGlwXCI+XHJcblxyXG4gICAgICAgIFxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc1N0YXR1c0NvbWJvICYmIHN0YXR1c01ldGFkYXRhOyBlbHNlIG5vcm1hbE9wdGlvblwiPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImdldFN0YXR1c09wdGlvbih0YXJnZXQubGFiZWwpIGFzIG9wdFwiPlxyXG4gICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmb250LWJvbGQgc3RhdHVzLWJhZGdlXCJcclxuICAgICAgICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kLWNvbG9yXT1cImxpZ2h0ZW5Db2xvcihvcHQuY29sb3JIZXgpXCJcclxuICAgICAgICAgICAgICAgIFtzdHlsZS5jb2xvcl09XCJnZXRSZWFkYWJsZVRleHRDb2xvcihvcHQuY29sb3JIZXgpXCJcclxuICAgICAgICAgICAgICAgIFtzdHlsZS5wYWRkaW5nLXRvcF09XCInMC4xcmVtJ1wiXHJcbiAgICAgICAgICAgICAgICBbc3R5bGUucGFkZGluZy1ib3R0b21dPVwiJzAuMXJlbSdcIlxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAge3t0YXJnZXQubGFiZWx9fVxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICNub3JtYWxPcHRpb24+XHJcbiAgICAgICAgICA8c3Bhbj57e3RhcmdldC5sYWJlbH19PC9zcGFuPlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuICA8L3AtZHJvcGRvd24+XHJcblxyXG4gIDwhLS0gQnViYmxlIEluZm8gLS0+XHJcbiAgPFRzaS1CdWJibGUtSW5mbyBbaW5mb1RleHRdPVwiaW5mb1RleHRcIj48L1RzaS1CdWJibGUtSW5mbz5cclxuPC9kaXY+Il19