ng-zenduit 2.0.20 → 2.0.21

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.
@@ -740,10 +740,10 @@ export class ZenduFilterComponent {
740
740
  }
741
741
  }
742
742
  ZenduFilterComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ZenduFilterComponent, deps: [{ token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component });
743
- ZenduFilterComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: ZenduFilterComponent, selector: "zen-filter", inputs: { config: "config", filter: "filter", position: "position", resetBehavior: "resetBehavior", isVisible: "isVisible", customTrigger: "customTrigger", imageUrl: "imageUrl", label: "label", showOptions: "showOptions", customOptions: "customOptions", wrapperBodyClass: "wrapperBodyClass", customPosition: "customPosition" }, outputs: { filterChange: "filterChange", isVisibleChange: "isVisibleChange" }, host: { listeners: { "window:mousedown": "outsideHandling($event)", "window:resize": "windowSizeHandling($event)", "window:scroll": "windowScroll($event)", "window:keydown": "onWindowKeyDown($event)" } }, viewQueries: [{ propertyName: "searchBox", first: true, predicate: ["searchBox"], descendants: true }, { propertyName: "_componentElement", first: true, predicate: ["mainComponent"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"filters-component\"\n #mainComponent\n click-out=\"isVisible && hide()\">\n\n <ng-container *ngIf=\"!customTrigger\">\n <zen-button (click)=\"toggle()\"\n [variant]=\"isApplied ? 'secondary' : 'secondary-gray'\"\n size=\"sm\"\n class=\"filter {{isApplied ? 'applied' : ''}}\">\n <zen-icon [src]=\"imageUrl\"\n *ngIf=\"imageUrl\"></zen-icon>\n <i class=\"filter-icon material-icons\"\n *ngIf=\"!imageUrl\">filter_list</i>\n <span *ngIf=\"label\">{{ label | translate }}</span>\n </zen-button>\n </ng-container>\n\n <ng-content *ngIf=\"customTrigger\"></ng-content>\n\n <div [hidden]=\"!isVisible\"\n class=\"action-menu menu-content\"\n [class.customTrigger]=\"customTrigger\"\n [ngStyle]=\"{ 'left': menuLeft, 'right': menuRight, 'top': menuTop, 'bottom': menuBottom }\">\n <div class=\"action-menu-header\">\n <zen-search-box [(text)]=\"searchText\"\n #searchBox\n (textChange)=\"searchTextChanged()\"></zen-search-box>\n </div>\n\n <div class=\"action-menu-body items-wrapper\"\n ngClass=\"{{wrapperBodyClass}}\">\n <ng-container *ngIf=\"errorMessage.length\">\n <li *ngFor=\"let item of errorMessage\"\n class=\"error-msg\">{{item | translate }}</li>\n </ng-container>\n\n <div *ngFor=\"let item of config.items\">\n <div class=\"menu-item\"\n *ngIf=\"isMenuIsVisible(item)\">\n\n <!-- Divider between two filter -->\n <div *ngIf=\"item.type === 'divider'\">\n <p class=\"filter-divider\"></p>\n </div>\n\n <!-- Boolean toggle -->\n <div *ngIf=\"item.type === 'toggle'\"\n class=\"action-item toggle-row\">\n <div>{{item.title | translate}}</div>\n <zen-toggle-slide [(enabled)]=\"item.enabled\"></zen-toggle-slide>\n </div>\n\n <button class=\"action-item expander-item\"\n *ngIf=\"item.type != 'toggle' && item.type != 'divider' && !item.disableCollapse\"\n (click)=\"toggleItem(item)\">\n <span class=\"expander-title\">{{item.title | translate}}</span>\n <i class=\"material-icons expand-icon\"\n [ngClass]=\"{'active': item.expanded}\">expand_more</i>\n </button>\n\n <div class=\"action-item section-title\"\n *ngIf=\"item.type != 'toggle' && item.type != 'divider' && item.disableCollapse\">\n {{item.title | translate}}\n </div>\n\n <ng-container *ngIf=\"item.expanded || item.disableCollapse\">\n <div [ngSwitch]=\"item.type\">\n <!-- Multiselect -->\n <div *ngSwitchCase=\"'multiselect'\">\n <!-- Lazy loading mode -->\n <ng-container *ngIf=\"item.isLazyLoading\">\n <div *ngFor=\"let dsItem of item.filteredDataSource\"\n class=\"action-item-checkbox ds-item\"\n [class.has-badge]=\"dsItem.badgeBgColor\">\n <zen-checkbox [(checked)]=\"dsItem.checked\"\n [imageUrl]=\"dsItem.imageUrl\"\n (checkedChange)=\"checkChanged(dsItem, item)\"\n [label]=\"dsItem.badgeBgColor ? '' : (dsItem.name?.toString() | translate)\"></zen-checkbox>\n <span *ngIf=\"dsItem.badgeBgColor\"\n class=\"filter-item-badge\"\n [ngStyle]=\"{'background': dsItem.badgeBgColor, 'color': dsItem.badgeColor}\">\n {{ dsItem.name?.toString() | translate }}\n </span>\n </div>\n <div *ngIf=\"item.canLoadMore && !item.isLoadingNow\"\n class=\"action-item\">\n <button (click)=\"loadMore(item, false)\"\n class=\"button-stroked full-width\">\n {{'Load More' | translate}}\n </button>\n </div>\n <div *ngIf=\"item.isLoadingNow\"\n class=\"loader-more-spinner\">\n <zen-spinner size=\"small\"></zen-spinner>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"!item.isLazyLoading && !hasTreeData(item)\">\n <div class=\"action-item-checkbox ds-item select-all\" *ngIf=\"!item.hideSelectAll\">\n <zen-checkbox *ngIf=\"item.dataSource.length === item.filteredDataSource.length\"\n [(checked)]=\"item.isSelectedAll\"\n [indeterminate]=\"isItemActive(item) && !item.isSelectedAll\"\n [label]=\"'Select All' | translate\"\n (checkedChange)=\"onSelectAll(item)\">\n </zen-checkbox>\n </div>\n\n <div *ngFor=\"let dsItem of item.filteredDataSource\"\n class=\"action-item-checkbox ds-item\"\n [class.has-badge]=\"dsItem.badgeBgColor\">\n <zen-checkbox [(checked)]=\"dsItem.checked\"\n [imageUrl]=\"dsItem.imageUrl\"\n (checkedChange)=\"checkChanged(dsItem, item)\"\n [label]=\"dsItem.badgeBgColor ? '' : (dsItem.name?.toString() | translate)\"></zen-checkbox>\n <span *ngIf=\"dsItem.badgeBgColor\"\n class=\"filter-item-badge\"\n [ngStyle]=\"{'background': dsItem.badgeBgColor, 'color': dsItem.badgeColor}\">\n {{ dsItem.name?.toString() | translate }}\n </span>\n </div>\n </ng-container>\n\n <!-- Tree view mode -->\n <zen-groups *ngIf=\"!item.isLazyLoading && hasTreeData(item)\"\n [dataSource]=\"item.dataSource\"\n [filteredDataSource]=\"item.filteredDataSource\"\n [hideSelectAll]=\"item.hideSelectAll\"\n [inline]=\"true\"\n [hideSearch]=\"true\"\n [(isSelectedAll)]=\"item.isSelectedAll\"\n (checkedChange)=\"checkChanged($event, item)\">\n </zen-groups>\n </div>\n\n <!-- Date range picker -->\n <div *ngSwitchCase=\"'dateRange'\">\n <!-- Options date range view -->\n <ng-container *ngIf=\"item.dateRangeOptions?.length\">\n <ng-container *ngFor=\"let option of item.dateRangeOptions\">\n <div class=\"action-item-radio ds-item\">\n <zen-radio [value]=\"option.name\"\n [label]=\"option.name | translate\"\n [name]=\"item.key\"\n [selected]=\"selectedDateRangeOptions[item.key] === option.name\"\n (radioChange)=\"handleDateRangeOptionClick(item, option)\"></zen-radio>\n </div>\n </ng-container>\n <div class=\"action-item-radio ds-item\">\n <zen-radio [value]=\"'Custom'\"\n [label]=\"'Custom' | translate\"\n [name]=\"item.key\"\n [selected]=\"selectedDateRangeOptions[item.key] === 'Custom'\"\n (radioChange)=\"handleCustomDateRangeClick(item)\"></zen-radio>\n </div>\n <ng-container *ngIf=\"selectedDateRangeOptions[item.key] === 'Custom'\">\n <div class=\"ds-item filter-row\">\n <div class=\"lbl\">{{'From' | translate}}:</div>\n <zen-datepicker class=\"width-full\"\n [(date)]=\"item.dateRange.start\"\n [showTime]=\"item.showTime\"\n [yPosition]=\"item.config?.yPosition ?? datepickerPosition.AUTO\"\n [parentContainer]=\"mainComponent\">\n </zen-datepicker>\n </div>\n <div class=\"ds-item filter-row\">\n <div class=\"lbl\">{{'To' | translate}}:</div>\n <zen-datepicker class=\"width-full\"\n [(date)]=\"item.dateRange.end\"\n [showTime]=\"item.showTime\"\n [yPosition]=\"item.config?.yPosition ?? datepickerPosition.AUTO\"\n (dateChange)=\"handleEndDateChange(item)\"\n [parentContainer]=\"mainComponent\">\n </zen-datepicker>\n </div>\n </ng-container>\n </ng-container>\n\n <!-- Default date range view -->\n <ng-container *ngIf=\"!item.dateRangeOptions?.length\">\n <div class=\"ds-item filter-row\">\n <div class=\"lbl\">{{'From' | translate}}:</div>\n <zen-datepicker class=\"width-full\"\n [(date)]=\"item.dateRange.start\"\n [showTime]=\"item.showTime\"\n [yPosition]=\"item.config?.yPosition ?? datepickerPosition.AUTO\"\n [parentContainer]=\"mainComponent\">\n </zen-datepicker>\n </div>\n <div class=\"ds-item filter-row\">\n <div class=\"lbl\">{{'To' | translate}}:</div>\n <zen-datepicker class=\"width-full\"\n [(date)]=\"item.dateRange.end\"\n [showTime]=\"item.showTime\"\n [yPosition]=\"item.config?.yPosition ?? datepickerPosition.AUTO\"\n (dateChange)=\"handleEndDateChange(item)\"\n [parentContainer]=\"mainComponent\">\n </zen-datepicker>\n </div>\n </ng-container>\n </div>\n\n <!-- Date picker -->\n <div *ngSwitchCase=\"'date'\">\n <div class=\"ds-item filter-row\">\n <div class=\"lbl\">{{'Date' | translate}}:</div>\n <zen-datepicker class=\"width-full\"\n [(date)]=\"item.date\"\n [showTime]=\"item.showTime\"\n [parentContainer]=\"mainComponent\">\n </zen-datepicker>\n </div>\n </div>\n\n <!-- Number range -->\n <div *ngSwitchCase=\"'numberRange'\"\n class=\"filter-row number-range-row\">\n <div>\n <div class=\"lbl\">{{'Min' | translate}}:</div>\n <input class=\"material-input\"\n [(ngModel)]=\"item.numberRange.from\"\n type=\"number\" />\n </div>\n <div>\n <div class=\"lbl\">{{'Max' | translate}}:</div>\n <input class=\"material-input\"\n [(ngModel)]=\"item.numberRange.to\"\n type=\"number\" />\n </div>\n </div>\n\n <!-- Radio -->\n <div *ngSwitchCase=\"'radio'\">\n <div *ngFor=\"let option of item.radioOptions\"\n class=\"action-item-radio ds-item\">\n <zen-radio [value]=\"option.id\"\n [label]=\"option.name | translate\"\n [name]=\"item.key\"\n [imageUrl]=\"option.imageUrl\"\n [selected]=\"option.selected\"\n (radioChange)=\"radioChanged($event, item)\"\n [disabled]=\"option.disabled\"></zen-radio>\n </div>\n </div>\n </div>\n </ng-container>\n\n </div>\n </div>\n <span *ngIf=\"showNoFilterResult\"\n class=\"no-item\">{{'No Results Found' | translate}}..</span>\n </div>\n\n <div class=\"action-menu-footer filter-footer\">\n <span class=\"selected-count\" *ngIf=\"hasMultiselectItems\">{{ selectedCount }} {{'Selected' | translate}}</span>\n <div class=\"filter-footer-actions\">\n <button (click)=\"reset()\"\n class=\"filter-btn-clear\"\n [class.has-selection]=\"selectedCount > 0 && hasMultiselectItems\">\n {{'Clear Filter' | translate}}\n </button>\n <button (click)=\"apply()\"\n class=\"filter-btn-apply\">\n {{'Apply' | translate}}\n </button>\n </div>\n </div>\n\n </div>\n</div>\n", styles: [".filters-component{display:inline-block;position:relative}.filters-component .menu-content{width:360px;white-space:initial;position:fixed}.filters-component .menu-content.absolute{position:absolute;inset:auto}.filters-component .menu-content.dropdown-left{right:0}.filters-component .menu-content.dropdown-right{left:0}.filters-component .menu-content.dropdown-top{bottom:100%;margin-bottom:8px}.filters-component .menu-content.dropdown-bottom{top:100%;margin-top:8px}.filters-component .menu-content.customTrigger{top:30px}.filters-component .menu-content .items-wrapper{overflow-y:auto;max-height:calc(100vh - 407px);position:relative;padding:8px 0}.filters-component .menu-content .items-wrapper .action-item,.filters-component .menu-content .items-wrapper .action-item-checkbox,.filters-component .menu-content .items-wrapper .action-item-radio{font-weight:500;font-size:14px;line-height:20px;color:#344054;padding:0 24px}.filters-component .menu-content .items-wrapper .action-item:hover,.filters-component .menu-content .items-wrapper .action-item-checkbox:hover,.filters-component .menu-content .items-wrapper .action-item-radio:hover{background:transparent}.filters-component .menu-content .items-wrapper .expander-item{outline:none;border:none;display:flex;width:100%;justify-content:space-between;font-family:inherit;font-weight:500;font-size:14px;line-height:20px;color:#344054;background:transparent;padding:12px 24px}.filters-component .menu-content .items-wrapper .expander-item .expander-title{flex:1;text-align:left}.filters-component .menu-content .items-wrapper .expander-item.expanded,.filters-component .menu-content .items-wrapper .expander-item.active{background:transparent;color:#344054}.filters-component .menu-content .items-wrapper .expander-item:hover{background:transparent}.filters-component .menu-content .items-wrapper .expand-icon{transition:.3s;font-size:20px;color:#667085}.filters-component .menu-content .items-wrapper .expand-icon.active{transform:rotate(180deg)}.filters-component .menu-content .items-wrapper .ds-item{padding-left:32px}.filters-component .menu-content .items-wrapper .no-item,.filters-component .menu-content .items-wrapper .error-msg{color:#dc3e33;display:flex;flex-direction:row;align-items:center;padding:10px 24px;font-weight:400;font-size:14px}.filters-component .menu-content .items-wrapper .select-all{font-weight:500}.filters-component .menu-content .items-wrapper .filter-row{padding:0 24px}.filters-component .menu-content .items-wrapper .filter-row:not(:last-of-type){margin-bottom:20px}.filters-component .menu-content .items-wrapper .filter-row .lbl{color:#344054;font-size:14px;font-weight:500;margin-bottom:8px}.filters-component .menu-content .items-wrapper .filter-row:focus-within .lbl{color:var(--color-primary, #2188d9)}.filters-component .menu-content .items-wrapper .number-range-row{display:flex;margin-left:32px;gap:16px;margin-bottom:10px}.filters-component .menu-content .items-wrapper .toggle-row{justify-content:space-between}.filters-component .filter-footer{justify-content:space-between;padding:16px 24px;border-top:1px solid #eaecf0}.filters-component .filter-footer .selected-count{font-weight:500;font-size:14px;line-height:20px;color:#1d2939}.filters-component .filter-footer .filter-footer-actions{display:flex;gap:12px}.filters-component .filter-footer .filter-btn-clear{display:flex;align-items:center;justify-content:center;padding:10px 16px;border-radius:8px;background:#ffffff;border:1px solid #eaecf0;box-shadow:0 1px 2px #1018280d;font-family:inherit;font-weight:500;font-size:14px;line-height:20px;color:#d0d5dd;cursor:pointer;white-space:nowrap}.filters-component .filter-footer .filter-btn-clear:hover{background:#f9fafb;color:#98a2b3}.filters-component .filter-footer .filter-btn-clear.has-selection{border-color:#fda29b;color:#b42318}.filters-component .filter-footer .filter-btn-clear.has-selection:hover{background:#fef3f2;color:#912018}.filters-component .filter-footer .filter-btn-apply{display:flex;align-items:center;justify-content:center;padding:10px 16px;border-radius:8px;background:var(--color-primary, #2188d9);border:1px solid var(--color-primary, #2188d9);box-shadow:0 1px 2px #1018280d;font-family:inherit;font-weight:500;font-size:14px;line-height:20px;color:#fff;cursor:pointer;white-space:nowrap}.filters-component .filter-footer .filter-btn-apply:hover{background:var(--color-blue-shade-1, #0d74c5);border-color:var(--color-blue-shade-1, #0d74c5)}.filters-component .section-title{font-weight:500;font-size:14px;line-height:20px;color:#344054;cursor:default;padding:12px 24px}.filters-component .section-title:hover{background:transparent}.filters-component .has-badge zen-checkbox{width:auto}.filters-component .filter-item-badge{font-weight:500;font-size:14px;line-height:20px;padding:2px 10px;border-radius:16px;white-space:nowrap}.filters-component .loader-more-spinner{display:flex;align-items:center;justify-content:center;padding:16px;box-sizing:border-box}.hidden{display:none}:host ::ng-deep zen-radio label{margin:0}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i3.ZenduCheckboxComponent, selector: "zen-checkbox", inputs: ["checked", "label", "labelColor", "disabled", "disableValueChange", "indeterminate", "imageUrl", "size", "supportingText"], outputs: ["checkedChange"] }, { kind: "component", type: i4.ZenduToggleSlideComponent, selector: "zen-toggle-slide", inputs: ["enabled", "disabled"], outputs: ["enabledChange"] }, { kind: "component", type: i5.ZenduSearchBoxComponent, selector: "zen-search-box", inputs: ["text", "delay", "autoFocus", "disabled", "placeholder"], outputs: ["textChange"] }, { kind: "component", type: i6.ZenduDatepickerComponent, selector: "zen-datepicker", inputs: ["date", "showTime", "showSeconds", "showDate", "parentContainer", "containerClass", "minDate", "maxDate", "boxDesign", "highlightDays", "autoConfirm", "hint", "highlightError", "disabled", "readonly", "xPosition", "yPosition", "dispalyOverParent"], outputs: ["dateChange"] }, { kind: "component", type: i7.ZenduGroupsComponent, selector: "zen-groups", inputs: ["dataSource", "filteredDataSource", "hideSelectAll", "isSelectedAll", "inline", "width", "placeholder", "hideSearch", "idProp", "displayProp"], outputs: ["isSelectedAllChange", "checkedChange"] }, { kind: "component", type: i8.ZenduRadioButtonComponent, selector: "zen-radio", inputs: ["selected", "label", "value", "name", "disabled", "imageUrl", "size", "supportingText"], outputs: ["radioChange"] }, { kind: "component", type: i9.ZenduIconComponent, selector: "zen-icon", inputs: ["src", "name", "size", "color", "theme", "customColor"] }, { kind: "component", type: i10.ZenduSpinner, selector: "zen-spinner", inputs: ["size"] }, { kind: "component", type: i11.ZenButtonComponent, selector: "zen-button", inputs: ["variant", "buttonType", "icon", "size", "destructive", "disabled", "fullWidth", "type"] }, { kind: "pipe", type: i12.TranslatePipe, name: "translate" }] });
743
+ ZenduFilterComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: ZenduFilterComponent, selector: "zen-filter", inputs: { config: "config", filter: "filter", position: "position", resetBehavior: "resetBehavior", isVisible: "isVisible", customTrigger: "customTrigger", imageUrl: "imageUrl", label: "label", showOptions: "showOptions", customOptions: "customOptions", wrapperBodyClass: "wrapperBodyClass", customPosition: "customPosition" }, outputs: { filterChange: "filterChange", isVisibleChange: "isVisibleChange" }, host: { listeners: { "window:mousedown": "outsideHandling($event)", "window:resize": "windowSizeHandling($event)", "window:scroll": "windowScroll($event)", "window:keydown": "onWindowKeyDown($event)" } }, viewQueries: [{ propertyName: "searchBox", first: true, predicate: ["searchBox"], descendants: true }, { propertyName: "_componentElement", first: true, predicate: ["mainComponent"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"filters-component\"\n #mainComponent\n click-out=\"isVisible && hide()\">\n\n <ng-container *ngIf=\"!customTrigger\">\n <zen-button (click)=\"toggle()\"\n [variant]=\"isApplied ? 'secondary' : 'secondary-gray'\"\n class=\"filter {{isApplied ? 'applied' : ''}}\">\n <zen-icon [src]=\"imageUrl\"\n *ngIf=\"imageUrl\"></zen-icon>\n <i class=\"filter-icon material-icons\"\n *ngIf=\"!imageUrl\">filter_list</i>\n <span *ngIf=\"label\">{{ label | translate }}</span>\n </zen-button>\n </ng-container>\n\n <ng-content *ngIf=\"customTrigger\"></ng-content>\n\n <div [hidden]=\"!isVisible\"\n class=\"action-menu menu-content\"\n [class.customTrigger]=\"customTrigger\"\n [ngStyle]=\"{ 'left': menuLeft, 'right': menuRight, 'top': menuTop, 'bottom': menuBottom }\">\n <div class=\"action-menu-header\">\n <zen-search-box [(text)]=\"searchText\"\n #searchBox\n (textChange)=\"searchTextChanged()\"></zen-search-box>\n </div>\n\n <div class=\"action-menu-body items-wrapper\"\n ngClass=\"{{wrapperBodyClass}}\">\n <ng-container *ngIf=\"errorMessage.length\">\n <li *ngFor=\"let item of errorMessage\"\n class=\"error-msg\">{{item | translate }}</li>\n </ng-container>\n\n <div *ngFor=\"let item of config.items\">\n <div class=\"menu-item\"\n *ngIf=\"isMenuIsVisible(item)\">\n\n <!-- Divider between two filter -->\n <div *ngIf=\"item.type === 'divider'\">\n <p class=\"filter-divider\"></p>\n </div>\n\n <!-- Boolean toggle -->\n <div *ngIf=\"item.type === 'toggle'\"\n class=\"action-item toggle-row\">\n <div>{{item.title | translate}}</div>\n <zen-toggle-slide [(enabled)]=\"item.enabled\"></zen-toggle-slide>\n </div>\n\n <button class=\"action-item expander-item\"\n *ngIf=\"item.type != 'toggle' && item.type != 'divider' && !item.disableCollapse\"\n (click)=\"toggleItem(item)\">\n <span class=\"expander-title\">{{item.title | translate}}</span>\n <i class=\"material-icons expand-icon\"\n [ngClass]=\"{'active': item.expanded}\">expand_more</i>\n </button>\n\n <div class=\"action-item section-title\"\n *ngIf=\"item.type != 'toggle' && item.type != 'divider' && item.disableCollapse\">\n {{item.title | translate}}\n </div>\n\n <ng-container *ngIf=\"item.expanded || item.disableCollapse\">\n <div [ngSwitch]=\"item.type\">\n <!-- Multiselect -->\n <div *ngSwitchCase=\"'multiselect'\">\n <!-- Lazy loading mode -->\n <ng-container *ngIf=\"item.isLazyLoading\">\n <div *ngFor=\"let dsItem of item.filteredDataSource\"\n class=\"action-item-checkbox ds-item\"\n [class.has-badge]=\"dsItem.badgeBgColor\">\n <zen-checkbox [(checked)]=\"dsItem.checked\"\n [imageUrl]=\"dsItem.imageUrl\"\n (checkedChange)=\"checkChanged(dsItem, item)\"\n [label]=\"dsItem.badgeBgColor ? '' : (dsItem.name?.toString() | translate)\"></zen-checkbox>\n <span *ngIf=\"dsItem.badgeBgColor\"\n class=\"filter-item-badge\"\n [ngStyle]=\"{'background': dsItem.badgeBgColor, 'color': dsItem.badgeColor}\">\n {{ dsItem.name?.toString() | translate }}\n </span>\n </div>\n <div *ngIf=\"item.canLoadMore && !item.isLoadingNow\"\n class=\"action-item\">\n <button (click)=\"loadMore(item, false)\"\n class=\"button-stroked full-width\">\n {{'Load More' | translate}}\n </button>\n </div>\n <div *ngIf=\"item.isLoadingNow\"\n class=\"loader-more-spinner\">\n <zen-spinner size=\"small\"></zen-spinner>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"!item.isLazyLoading && !hasTreeData(item)\">\n <div class=\"action-item-checkbox ds-item select-all\" *ngIf=\"!item.hideSelectAll\">\n <zen-checkbox *ngIf=\"item.dataSource.length === item.filteredDataSource.length\"\n [(checked)]=\"item.isSelectedAll\"\n [indeterminate]=\"isItemActive(item) && !item.isSelectedAll\"\n [label]=\"'Select All' | translate\"\n (checkedChange)=\"onSelectAll(item)\">\n </zen-checkbox>\n </div>\n\n <div *ngFor=\"let dsItem of item.filteredDataSource\"\n class=\"action-item-checkbox ds-item\"\n [class.has-badge]=\"dsItem.badgeBgColor\">\n <zen-checkbox [(checked)]=\"dsItem.checked\"\n [imageUrl]=\"dsItem.imageUrl\"\n (checkedChange)=\"checkChanged(dsItem, item)\"\n [label]=\"dsItem.badgeBgColor ? '' : (dsItem.name?.toString() | translate)\"></zen-checkbox>\n <span *ngIf=\"dsItem.badgeBgColor\"\n class=\"filter-item-badge\"\n [ngStyle]=\"{'background': dsItem.badgeBgColor, 'color': dsItem.badgeColor}\">\n {{ dsItem.name?.toString() | translate }}\n </span>\n </div>\n </ng-container>\n\n <!-- Tree view mode -->\n <zen-groups *ngIf=\"!item.isLazyLoading && hasTreeData(item)\"\n [dataSource]=\"item.dataSource\"\n [filteredDataSource]=\"item.filteredDataSource\"\n [hideSelectAll]=\"item.hideSelectAll\"\n [inline]=\"true\"\n [hideSearch]=\"true\"\n [(isSelectedAll)]=\"item.isSelectedAll\"\n (checkedChange)=\"checkChanged($event, item)\">\n </zen-groups>\n </div>\n\n <!-- Date range picker -->\n <div *ngSwitchCase=\"'dateRange'\">\n <!-- Options date range view -->\n <ng-container *ngIf=\"item.dateRangeOptions?.length\">\n <ng-container *ngFor=\"let option of item.dateRangeOptions\">\n <div class=\"action-item-radio ds-item\">\n <zen-radio [value]=\"option.name\"\n [label]=\"option.name | translate\"\n [name]=\"item.key\"\n [selected]=\"selectedDateRangeOptions[item.key] === option.name\"\n (radioChange)=\"handleDateRangeOptionClick(item, option)\"></zen-radio>\n </div>\n </ng-container>\n <div class=\"action-item-radio ds-item\">\n <zen-radio [value]=\"'Custom'\"\n [label]=\"'Custom' | translate\"\n [name]=\"item.key\"\n [selected]=\"selectedDateRangeOptions[item.key] === 'Custom'\"\n (radioChange)=\"handleCustomDateRangeClick(item)\"></zen-radio>\n </div>\n <ng-container *ngIf=\"selectedDateRangeOptions[item.key] === 'Custom'\">\n <div class=\"ds-item filter-row\">\n <div class=\"lbl\">{{'From' | translate}}:</div>\n <zen-datepicker class=\"width-full\"\n [(date)]=\"item.dateRange.start\"\n [showTime]=\"item.showTime\"\n [yPosition]=\"item.config?.yPosition ?? datepickerPosition.AUTO\"\n [parentContainer]=\"mainComponent\">\n </zen-datepicker>\n </div>\n <div class=\"ds-item filter-row\">\n <div class=\"lbl\">{{'To' | translate}}:</div>\n <zen-datepicker class=\"width-full\"\n [(date)]=\"item.dateRange.end\"\n [showTime]=\"item.showTime\"\n [yPosition]=\"item.config?.yPosition ?? datepickerPosition.AUTO\"\n (dateChange)=\"handleEndDateChange(item)\"\n [parentContainer]=\"mainComponent\">\n </zen-datepicker>\n </div>\n </ng-container>\n </ng-container>\n\n <!-- Default date range view -->\n <ng-container *ngIf=\"!item.dateRangeOptions?.length\">\n <div class=\"ds-item filter-row\">\n <div class=\"lbl\">{{'From' | translate}}:</div>\n <zen-datepicker class=\"width-full\"\n [(date)]=\"item.dateRange.start\"\n [showTime]=\"item.showTime\"\n [yPosition]=\"item.config?.yPosition ?? datepickerPosition.AUTO\"\n [parentContainer]=\"mainComponent\">\n </zen-datepicker>\n </div>\n <div class=\"ds-item filter-row\">\n <div class=\"lbl\">{{'To' | translate}}:</div>\n <zen-datepicker class=\"width-full\"\n [(date)]=\"item.dateRange.end\"\n [showTime]=\"item.showTime\"\n [yPosition]=\"item.config?.yPosition ?? datepickerPosition.AUTO\"\n (dateChange)=\"handleEndDateChange(item)\"\n [parentContainer]=\"mainComponent\">\n </zen-datepicker>\n </div>\n </ng-container>\n </div>\n\n <!-- Date picker -->\n <div *ngSwitchCase=\"'date'\">\n <div class=\"ds-item filter-row\">\n <div class=\"lbl\">{{'Date' | translate}}:</div>\n <zen-datepicker class=\"width-full\"\n [(date)]=\"item.date\"\n [showTime]=\"item.showTime\"\n [parentContainer]=\"mainComponent\">\n </zen-datepicker>\n </div>\n </div>\n\n <!-- Number range -->\n <div *ngSwitchCase=\"'numberRange'\"\n class=\"filter-row number-range-row\">\n <div>\n <div class=\"lbl\">{{'Min' | translate}}:</div>\n <input class=\"material-input\"\n [(ngModel)]=\"item.numberRange.from\"\n type=\"number\" />\n </div>\n <div>\n <div class=\"lbl\">{{'Max' | translate}}:</div>\n <input class=\"material-input\"\n [(ngModel)]=\"item.numberRange.to\"\n type=\"number\" />\n </div>\n </div>\n\n <!-- Radio -->\n <div *ngSwitchCase=\"'radio'\">\n <div *ngFor=\"let option of item.radioOptions\"\n class=\"action-item-radio ds-item\">\n <zen-radio [value]=\"option.id\"\n [label]=\"option.name | translate\"\n [name]=\"item.key\"\n [imageUrl]=\"option.imageUrl\"\n [selected]=\"option.selected\"\n (radioChange)=\"radioChanged($event, item)\"\n [disabled]=\"option.disabled\"></zen-radio>\n </div>\n </div>\n </div>\n </ng-container>\n\n </div>\n </div>\n <span *ngIf=\"showNoFilterResult\"\n class=\"no-item\">{{'No Results Found' | translate}}..</span>\n </div>\n\n <div class=\"action-menu-footer filter-footer\">\n <span class=\"selected-count\" *ngIf=\"hasMultiselectItems\">{{ selectedCount }} {{'Selected' | translate}}</span>\n <div class=\"filter-footer-actions\">\n <button (click)=\"reset()\"\n class=\"filter-btn-clear\"\n [class.has-selection]=\"selectedCount > 0 && hasMultiselectItems\">\n {{'Clear Filter' | translate}}\n </button>\n <button (click)=\"apply()\"\n class=\"filter-btn-apply\">\n {{'Apply' | translate}}\n </button>\n </div>\n </div>\n\n </div>\n</div>\n", styles: [".filters-component{display:inline-block;position:relative}.filters-component .menu-content{width:360px;white-space:initial;position:fixed}.filters-component .menu-content.absolute{position:absolute;inset:auto}.filters-component .menu-content.dropdown-left{right:0}.filters-component .menu-content.dropdown-right{left:0}.filters-component .menu-content.dropdown-top{bottom:100%;margin-bottom:8px}.filters-component .menu-content.dropdown-bottom{top:100%;margin-top:8px}.filters-component .menu-content.customTrigger{top:30px}.filters-component .menu-content .items-wrapper{overflow-y:auto;max-height:calc(100vh - 407px);position:relative;padding:8px 0}.filters-component .menu-content .items-wrapper .action-item,.filters-component .menu-content .items-wrapper .action-item-checkbox,.filters-component .menu-content .items-wrapper .action-item-radio{font-weight:500;font-size:14px;line-height:20px;color:#344054;padding:0 24px}.filters-component .menu-content .items-wrapper .action-item:hover,.filters-component .menu-content .items-wrapper .action-item-checkbox:hover,.filters-component .menu-content .items-wrapper .action-item-radio:hover{background:transparent}.filters-component .menu-content .items-wrapper .expander-item{outline:none;border:none;display:flex;width:100%;justify-content:space-between;font-family:inherit;font-weight:500;font-size:14px;line-height:20px;color:#344054;background:transparent;padding:12px 24px}.filters-component .menu-content .items-wrapper .expander-item .expander-title{flex:1;text-align:left}.filters-component .menu-content .items-wrapper .expander-item.expanded,.filters-component .menu-content .items-wrapper .expander-item.active{background:transparent;color:#344054}.filters-component .menu-content .items-wrapper .expander-item:hover{background:transparent}.filters-component .menu-content .items-wrapper .expand-icon{transition:.3s;font-size:20px;color:#667085}.filters-component .menu-content .items-wrapper .expand-icon.active{transform:rotate(180deg)}.filters-component .menu-content .items-wrapper .ds-item{padding-left:32px}.filters-component .menu-content .items-wrapper .no-item,.filters-component .menu-content .items-wrapper .error-msg{color:#dc3e33;display:flex;flex-direction:row;align-items:center;padding:10px 24px;font-weight:400;font-size:14px}.filters-component .menu-content .items-wrapper .select-all{font-weight:500}.filters-component .menu-content .items-wrapper .filter-row{padding:0 24px}.filters-component .menu-content .items-wrapper .filter-row:not(:last-of-type){margin-bottom:20px}.filters-component .menu-content .items-wrapper .filter-row .lbl{color:#344054;font-size:14px;font-weight:500;margin-bottom:8px}.filters-component .menu-content .items-wrapper .filter-row:focus-within .lbl{color:var(--color-primary, #2188d9)}.filters-component .menu-content .items-wrapper .number-range-row{display:flex;margin-left:32px;gap:16px;margin-bottom:10px}.filters-component .menu-content .items-wrapper .toggle-row{justify-content:space-between}.filters-component .filter-footer{justify-content:space-between;padding:16px 24px;border-top:1px solid #eaecf0}.filters-component .filter-footer .selected-count{font-weight:500;font-size:14px;line-height:20px;color:#1d2939}.filters-component .filter-footer .filter-footer-actions{display:flex;gap:12px}.filters-component .filter-footer .filter-btn-clear{display:flex;align-items:center;justify-content:center;padding:10px 16px;border-radius:8px;background:#ffffff;border:1px solid #eaecf0;box-shadow:0 1px 2px #1018280d;font-family:inherit;font-weight:500;font-size:14px;line-height:20px;color:#d0d5dd;cursor:pointer;white-space:nowrap}.filters-component .filter-footer .filter-btn-clear:hover{background:#f9fafb;color:#98a2b3}.filters-component .filter-footer .filter-btn-clear.has-selection{border-color:#fda29b;color:#b42318}.filters-component .filter-footer .filter-btn-clear.has-selection:hover{background:#fef3f2;color:#912018}.filters-component .filter-footer .filter-btn-apply{display:flex;align-items:center;justify-content:center;padding:10px 16px;border-radius:8px;background:var(--color-primary, #2188d9);border:1px solid var(--color-primary, #2188d9);box-shadow:0 1px 2px #1018280d;font-family:inherit;font-weight:500;font-size:14px;line-height:20px;color:#fff;cursor:pointer;white-space:nowrap}.filters-component .filter-footer .filter-btn-apply:hover{background:var(--color-blue-shade-1, #0d74c5);border-color:var(--color-blue-shade-1, #0d74c5)}.filters-component .section-title{font-weight:500;font-size:14px;line-height:20px;color:#344054;cursor:default;padding:12px 24px}.filters-component .section-title:hover{background:transparent}.filters-component .has-badge zen-checkbox{width:auto}.filters-component .filter-item-badge{font-weight:500;font-size:14px;line-height:20px;padding:2px 10px;border-radius:16px;white-space:nowrap}.filters-component .loader-more-spinner{display:flex;align-items:center;justify-content:center;padding:16px;box-sizing:border-box}.hidden{display:none}:host ::ng-deep zen-radio label{margin:0}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i3.ZenduCheckboxComponent, selector: "zen-checkbox", inputs: ["checked", "label", "labelColor", "disabled", "disableValueChange", "indeterminate", "imageUrl", "size", "supportingText"], outputs: ["checkedChange"] }, { kind: "component", type: i4.ZenduToggleSlideComponent, selector: "zen-toggle-slide", inputs: ["enabled", "disabled"], outputs: ["enabledChange"] }, { kind: "component", type: i5.ZenduSearchBoxComponent, selector: "zen-search-box", inputs: ["text", "delay", "autoFocus", "disabled", "placeholder"], outputs: ["textChange"] }, { kind: "component", type: i6.ZenduDatepickerComponent, selector: "zen-datepicker", inputs: ["date", "showTime", "showSeconds", "showDate", "parentContainer", "containerClass", "minDate", "maxDate", "boxDesign", "highlightDays", "autoConfirm", "hint", "highlightError", "disabled", "readonly", "xPosition", "yPosition", "dispalyOverParent"], outputs: ["dateChange"] }, { kind: "component", type: i7.ZenduGroupsComponent, selector: "zen-groups", inputs: ["dataSource", "filteredDataSource", "hideSelectAll", "isSelectedAll", "inline", "width", "placeholder", "hideSearch", "idProp", "displayProp"], outputs: ["isSelectedAllChange", "checkedChange"] }, { kind: "component", type: i8.ZenduRadioButtonComponent, selector: "zen-radio", inputs: ["selected", "label", "value", "name", "disabled", "imageUrl", "size", "supportingText"], outputs: ["radioChange"] }, { kind: "component", type: i9.ZenduIconComponent, selector: "zen-icon", inputs: ["src", "name", "size", "color", "theme", "customColor"] }, { kind: "component", type: i10.ZenduSpinner, selector: "zen-spinner", inputs: ["size"] }, { kind: "component", type: i11.ZenButtonComponent, selector: "zen-button", inputs: ["variant", "buttonType", "icon", "size", "destructive", "disabled", "fullWidth", "type"] }, { kind: "pipe", type: i12.TranslatePipe, name: "translate" }] });
744
744
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ZenduFilterComponent, decorators: [{
745
745
  type: Component,
746
- args: [{ selector: 'zen-filter', template: "<div class=\"filters-component\"\n #mainComponent\n click-out=\"isVisible && hide()\">\n\n <ng-container *ngIf=\"!customTrigger\">\n <zen-button (click)=\"toggle()\"\n [variant]=\"isApplied ? 'secondary' : 'secondary-gray'\"\n size=\"sm\"\n class=\"filter {{isApplied ? 'applied' : ''}}\">\n <zen-icon [src]=\"imageUrl\"\n *ngIf=\"imageUrl\"></zen-icon>\n <i class=\"filter-icon material-icons\"\n *ngIf=\"!imageUrl\">filter_list</i>\n <span *ngIf=\"label\">{{ label | translate }}</span>\n </zen-button>\n </ng-container>\n\n <ng-content *ngIf=\"customTrigger\"></ng-content>\n\n <div [hidden]=\"!isVisible\"\n class=\"action-menu menu-content\"\n [class.customTrigger]=\"customTrigger\"\n [ngStyle]=\"{ 'left': menuLeft, 'right': menuRight, 'top': menuTop, 'bottom': menuBottom }\">\n <div class=\"action-menu-header\">\n <zen-search-box [(text)]=\"searchText\"\n #searchBox\n (textChange)=\"searchTextChanged()\"></zen-search-box>\n </div>\n\n <div class=\"action-menu-body items-wrapper\"\n ngClass=\"{{wrapperBodyClass}}\">\n <ng-container *ngIf=\"errorMessage.length\">\n <li *ngFor=\"let item of errorMessage\"\n class=\"error-msg\">{{item | translate }}</li>\n </ng-container>\n\n <div *ngFor=\"let item of config.items\">\n <div class=\"menu-item\"\n *ngIf=\"isMenuIsVisible(item)\">\n\n <!-- Divider between two filter -->\n <div *ngIf=\"item.type === 'divider'\">\n <p class=\"filter-divider\"></p>\n </div>\n\n <!-- Boolean toggle -->\n <div *ngIf=\"item.type === 'toggle'\"\n class=\"action-item toggle-row\">\n <div>{{item.title | translate}}</div>\n <zen-toggle-slide [(enabled)]=\"item.enabled\"></zen-toggle-slide>\n </div>\n\n <button class=\"action-item expander-item\"\n *ngIf=\"item.type != 'toggle' && item.type != 'divider' && !item.disableCollapse\"\n (click)=\"toggleItem(item)\">\n <span class=\"expander-title\">{{item.title | translate}}</span>\n <i class=\"material-icons expand-icon\"\n [ngClass]=\"{'active': item.expanded}\">expand_more</i>\n </button>\n\n <div class=\"action-item section-title\"\n *ngIf=\"item.type != 'toggle' && item.type != 'divider' && item.disableCollapse\">\n {{item.title | translate}}\n </div>\n\n <ng-container *ngIf=\"item.expanded || item.disableCollapse\">\n <div [ngSwitch]=\"item.type\">\n <!-- Multiselect -->\n <div *ngSwitchCase=\"'multiselect'\">\n <!-- Lazy loading mode -->\n <ng-container *ngIf=\"item.isLazyLoading\">\n <div *ngFor=\"let dsItem of item.filteredDataSource\"\n class=\"action-item-checkbox ds-item\"\n [class.has-badge]=\"dsItem.badgeBgColor\">\n <zen-checkbox [(checked)]=\"dsItem.checked\"\n [imageUrl]=\"dsItem.imageUrl\"\n (checkedChange)=\"checkChanged(dsItem, item)\"\n [label]=\"dsItem.badgeBgColor ? '' : (dsItem.name?.toString() | translate)\"></zen-checkbox>\n <span *ngIf=\"dsItem.badgeBgColor\"\n class=\"filter-item-badge\"\n [ngStyle]=\"{'background': dsItem.badgeBgColor, 'color': dsItem.badgeColor}\">\n {{ dsItem.name?.toString() | translate }}\n </span>\n </div>\n <div *ngIf=\"item.canLoadMore && !item.isLoadingNow\"\n class=\"action-item\">\n <button (click)=\"loadMore(item, false)\"\n class=\"button-stroked full-width\">\n {{'Load More' | translate}}\n </button>\n </div>\n <div *ngIf=\"item.isLoadingNow\"\n class=\"loader-more-spinner\">\n <zen-spinner size=\"small\"></zen-spinner>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"!item.isLazyLoading && !hasTreeData(item)\">\n <div class=\"action-item-checkbox ds-item select-all\" *ngIf=\"!item.hideSelectAll\">\n <zen-checkbox *ngIf=\"item.dataSource.length === item.filteredDataSource.length\"\n [(checked)]=\"item.isSelectedAll\"\n [indeterminate]=\"isItemActive(item) && !item.isSelectedAll\"\n [label]=\"'Select All' | translate\"\n (checkedChange)=\"onSelectAll(item)\">\n </zen-checkbox>\n </div>\n\n <div *ngFor=\"let dsItem of item.filteredDataSource\"\n class=\"action-item-checkbox ds-item\"\n [class.has-badge]=\"dsItem.badgeBgColor\">\n <zen-checkbox [(checked)]=\"dsItem.checked\"\n [imageUrl]=\"dsItem.imageUrl\"\n (checkedChange)=\"checkChanged(dsItem, item)\"\n [label]=\"dsItem.badgeBgColor ? '' : (dsItem.name?.toString() | translate)\"></zen-checkbox>\n <span *ngIf=\"dsItem.badgeBgColor\"\n class=\"filter-item-badge\"\n [ngStyle]=\"{'background': dsItem.badgeBgColor, 'color': dsItem.badgeColor}\">\n {{ dsItem.name?.toString() | translate }}\n </span>\n </div>\n </ng-container>\n\n <!-- Tree view mode -->\n <zen-groups *ngIf=\"!item.isLazyLoading && hasTreeData(item)\"\n [dataSource]=\"item.dataSource\"\n [filteredDataSource]=\"item.filteredDataSource\"\n [hideSelectAll]=\"item.hideSelectAll\"\n [inline]=\"true\"\n [hideSearch]=\"true\"\n [(isSelectedAll)]=\"item.isSelectedAll\"\n (checkedChange)=\"checkChanged($event, item)\">\n </zen-groups>\n </div>\n\n <!-- Date range picker -->\n <div *ngSwitchCase=\"'dateRange'\">\n <!-- Options date range view -->\n <ng-container *ngIf=\"item.dateRangeOptions?.length\">\n <ng-container *ngFor=\"let option of item.dateRangeOptions\">\n <div class=\"action-item-radio ds-item\">\n <zen-radio [value]=\"option.name\"\n [label]=\"option.name | translate\"\n [name]=\"item.key\"\n [selected]=\"selectedDateRangeOptions[item.key] === option.name\"\n (radioChange)=\"handleDateRangeOptionClick(item, option)\"></zen-radio>\n </div>\n </ng-container>\n <div class=\"action-item-radio ds-item\">\n <zen-radio [value]=\"'Custom'\"\n [label]=\"'Custom' | translate\"\n [name]=\"item.key\"\n [selected]=\"selectedDateRangeOptions[item.key] === 'Custom'\"\n (radioChange)=\"handleCustomDateRangeClick(item)\"></zen-radio>\n </div>\n <ng-container *ngIf=\"selectedDateRangeOptions[item.key] === 'Custom'\">\n <div class=\"ds-item filter-row\">\n <div class=\"lbl\">{{'From' | translate}}:</div>\n <zen-datepicker class=\"width-full\"\n [(date)]=\"item.dateRange.start\"\n [showTime]=\"item.showTime\"\n [yPosition]=\"item.config?.yPosition ?? datepickerPosition.AUTO\"\n [parentContainer]=\"mainComponent\">\n </zen-datepicker>\n </div>\n <div class=\"ds-item filter-row\">\n <div class=\"lbl\">{{'To' | translate}}:</div>\n <zen-datepicker class=\"width-full\"\n [(date)]=\"item.dateRange.end\"\n [showTime]=\"item.showTime\"\n [yPosition]=\"item.config?.yPosition ?? datepickerPosition.AUTO\"\n (dateChange)=\"handleEndDateChange(item)\"\n [parentContainer]=\"mainComponent\">\n </zen-datepicker>\n </div>\n </ng-container>\n </ng-container>\n\n <!-- Default date range view -->\n <ng-container *ngIf=\"!item.dateRangeOptions?.length\">\n <div class=\"ds-item filter-row\">\n <div class=\"lbl\">{{'From' | translate}}:</div>\n <zen-datepicker class=\"width-full\"\n [(date)]=\"item.dateRange.start\"\n [showTime]=\"item.showTime\"\n [yPosition]=\"item.config?.yPosition ?? datepickerPosition.AUTO\"\n [parentContainer]=\"mainComponent\">\n </zen-datepicker>\n </div>\n <div class=\"ds-item filter-row\">\n <div class=\"lbl\">{{'To' | translate}}:</div>\n <zen-datepicker class=\"width-full\"\n [(date)]=\"item.dateRange.end\"\n [showTime]=\"item.showTime\"\n [yPosition]=\"item.config?.yPosition ?? datepickerPosition.AUTO\"\n (dateChange)=\"handleEndDateChange(item)\"\n [parentContainer]=\"mainComponent\">\n </zen-datepicker>\n </div>\n </ng-container>\n </div>\n\n <!-- Date picker -->\n <div *ngSwitchCase=\"'date'\">\n <div class=\"ds-item filter-row\">\n <div class=\"lbl\">{{'Date' | translate}}:</div>\n <zen-datepicker class=\"width-full\"\n [(date)]=\"item.date\"\n [showTime]=\"item.showTime\"\n [parentContainer]=\"mainComponent\">\n </zen-datepicker>\n </div>\n </div>\n\n <!-- Number range -->\n <div *ngSwitchCase=\"'numberRange'\"\n class=\"filter-row number-range-row\">\n <div>\n <div class=\"lbl\">{{'Min' | translate}}:</div>\n <input class=\"material-input\"\n [(ngModel)]=\"item.numberRange.from\"\n type=\"number\" />\n </div>\n <div>\n <div class=\"lbl\">{{'Max' | translate}}:</div>\n <input class=\"material-input\"\n [(ngModel)]=\"item.numberRange.to\"\n type=\"number\" />\n </div>\n </div>\n\n <!-- Radio -->\n <div *ngSwitchCase=\"'radio'\">\n <div *ngFor=\"let option of item.radioOptions\"\n class=\"action-item-radio ds-item\">\n <zen-radio [value]=\"option.id\"\n [label]=\"option.name | translate\"\n [name]=\"item.key\"\n [imageUrl]=\"option.imageUrl\"\n [selected]=\"option.selected\"\n (radioChange)=\"radioChanged($event, item)\"\n [disabled]=\"option.disabled\"></zen-radio>\n </div>\n </div>\n </div>\n </ng-container>\n\n </div>\n </div>\n <span *ngIf=\"showNoFilterResult\"\n class=\"no-item\">{{'No Results Found' | translate}}..</span>\n </div>\n\n <div class=\"action-menu-footer filter-footer\">\n <span class=\"selected-count\" *ngIf=\"hasMultiselectItems\">{{ selectedCount }} {{'Selected' | translate}}</span>\n <div class=\"filter-footer-actions\">\n <button (click)=\"reset()\"\n class=\"filter-btn-clear\"\n [class.has-selection]=\"selectedCount > 0 && hasMultiselectItems\">\n {{'Clear Filter' | translate}}\n </button>\n <button (click)=\"apply()\"\n class=\"filter-btn-apply\">\n {{'Apply' | translate}}\n </button>\n </div>\n </div>\n\n </div>\n</div>\n", styles: [".filters-component{display:inline-block;position:relative}.filters-component .menu-content{width:360px;white-space:initial;position:fixed}.filters-component .menu-content.absolute{position:absolute;inset:auto}.filters-component .menu-content.dropdown-left{right:0}.filters-component .menu-content.dropdown-right{left:0}.filters-component .menu-content.dropdown-top{bottom:100%;margin-bottom:8px}.filters-component .menu-content.dropdown-bottom{top:100%;margin-top:8px}.filters-component .menu-content.customTrigger{top:30px}.filters-component .menu-content .items-wrapper{overflow-y:auto;max-height:calc(100vh - 407px);position:relative;padding:8px 0}.filters-component .menu-content .items-wrapper .action-item,.filters-component .menu-content .items-wrapper .action-item-checkbox,.filters-component .menu-content .items-wrapper .action-item-radio{font-weight:500;font-size:14px;line-height:20px;color:#344054;padding:0 24px}.filters-component .menu-content .items-wrapper .action-item:hover,.filters-component .menu-content .items-wrapper .action-item-checkbox:hover,.filters-component .menu-content .items-wrapper .action-item-radio:hover{background:transparent}.filters-component .menu-content .items-wrapper .expander-item{outline:none;border:none;display:flex;width:100%;justify-content:space-between;font-family:inherit;font-weight:500;font-size:14px;line-height:20px;color:#344054;background:transparent;padding:12px 24px}.filters-component .menu-content .items-wrapper .expander-item .expander-title{flex:1;text-align:left}.filters-component .menu-content .items-wrapper .expander-item.expanded,.filters-component .menu-content .items-wrapper .expander-item.active{background:transparent;color:#344054}.filters-component .menu-content .items-wrapper .expander-item:hover{background:transparent}.filters-component .menu-content .items-wrapper .expand-icon{transition:.3s;font-size:20px;color:#667085}.filters-component .menu-content .items-wrapper .expand-icon.active{transform:rotate(180deg)}.filters-component .menu-content .items-wrapper .ds-item{padding-left:32px}.filters-component .menu-content .items-wrapper .no-item,.filters-component .menu-content .items-wrapper .error-msg{color:#dc3e33;display:flex;flex-direction:row;align-items:center;padding:10px 24px;font-weight:400;font-size:14px}.filters-component .menu-content .items-wrapper .select-all{font-weight:500}.filters-component .menu-content .items-wrapper .filter-row{padding:0 24px}.filters-component .menu-content .items-wrapper .filter-row:not(:last-of-type){margin-bottom:20px}.filters-component .menu-content .items-wrapper .filter-row .lbl{color:#344054;font-size:14px;font-weight:500;margin-bottom:8px}.filters-component .menu-content .items-wrapper .filter-row:focus-within .lbl{color:var(--color-primary, #2188d9)}.filters-component .menu-content .items-wrapper .number-range-row{display:flex;margin-left:32px;gap:16px;margin-bottom:10px}.filters-component .menu-content .items-wrapper .toggle-row{justify-content:space-between}.filters-component .filter-footer{justify-content:space-between;padding:16px 24px;border-top:1px solid #eaecf0}.filters-component .filter-footer .selected-count{font-weight:500;font-size:14px;line-height:20px;color:#1d2939}.filters-component .filter-footer .filter-footer-actions{display:flex;gap:12px}.filters-component .filter-footer .filter-btn-clear{display:flex;align-items:center;justify-content:center;padding:10px 16px;border-radius:8px;background:#ffffff;border:1px solid #eaecf0;box-shadow:0 1px 2px #1018280d;font-family:inherit;font-weight:500;font-size:14px;line-height:20px;color:#d0d5dd;cursor:pointer;white-space:nowrap}.filters-component .filter-footer .filter-btn-clear:hover{background:#f9fafb;color:#98a2b3}.filters-component .filter-footer .filter-btn-clear.has-selection{border-color:#fda29b;color:#b42318}.filters-component .filter-footer .filter-btn-clear.has-selection:hover{background:#fef3f2;color:#912018}.filters-component .filter-footer .filter-btn-apply{display:flex;align-items:center;justify-content:center;padding:10px 16px;border-radius:8px;background:var(--color-primary, #2188d9);border:1px solid var(--color-primary, #2188d9);box-shadow:0 1px 2px #1018280d;font-family:inherit;font-weight:500;font-size:14px;line-height:20px;color:#fff;cursor:pointer;white-space:nowrap}.filters-component .filter-footer .filter-btn-apply:hover{background:var(--color-blue-shade-1, #0d74c5);border-color:var(--color-blue-shade-1, #0d74c5)}.filters-component .section-title{font-weight:500;font-size:14px;line-height:20px;color:#344054;cursor:default;padding:12px 24px}.filters-component .section-title:hover{background:transparent}.filters-component .has-badge zen-checkbox{width:auto}.filters-component .filter-item-badge{font-weight:500;font-size:14px;line-height:20px;padding:2px 10px;border-radius:16px;white-space:nowrap}.filters-component .loader-more-spinner{display:flex;align-items:center;justify-content:center;padding:16px;box-sizing:border-box}.hidden{display:none}:host ::ng-deep zen-radio label{margin:0}\n"] }]
746
+ args: [{ selector: 'zen-filter', template: "<div class=\"filters-component\"\n #mainComponent\n click-out=\"isVisible && hide()\">\n\n <ng-container *ngIf=\"!customTrigger\">\n <zen-button (click)=\"toggle()\"\n [variant]=\"isApplied ? 'secondary' : 'secondary-gray'\"\n class=\"filter {{isApplied ? 'applied' : ''}}\">\n <zen-icon [src]=\"imageUrl\"\n *ngIf=\"imageUrl\"></zen-icon>\n <i class=\"filter-icon material-icons\"\n *ngIf=\"!imageUrl\">filter_list</i>\n <span *ngIf=\"label\">{{ label | translate }}</span>\n </zen-button>\n </ng-container>\n\n <ng-content *ngIf=\"customTrigger\"></ng-content>\n\n <div [hidden]=\"!isVisible\"\n class=\"action-menu menu-content\"\n [class.customTrigger]=\"customTrigger\"\n [ngStyle]=\"{ 'left': menuLeft, 'right': menuRight, 'top': menuTop, 'bottom': menuBottom }\">\n <div class=\"action-menu-header\">\n <zen-search-box [(text)]=\"searchText\"\n #searchBox\n (textChange)=\"searchTextChanged()\"></zen-search-box>\n </div>\n\n <div class=\"action-menu-body items-wrapper\"\n ngClass=\"{{wrapperBodyClass}}\">\n <ng-container *ngIf=\"errorMessage.length\">\n <li *ngFor=\"let item of errorMessage\"\n class=\"error-msg\">{{item | translate }}</li>\n </ng-container>\n\n <div *ngFor=\"let item of config.items\">\n <div class=\"menu-item\"\n *ngIf=\"isMenuIsVisible(item)\">\n\n <!-- Divider between two filter -->\n <div *ngIf=\"item.type === 'divider'\">\n <p class=\"filter-divider\"></p>\n </div>\n\n <!-- Boolean toggle -->\n <div *ngIf=\"item.type === 'toggle'\"\n class=\"action-item toggle-row\">\n <div>{{item.title | translate}}</div>\n <zen-toggle-slide [(enabled)]=\"item.enabled\"></zen-toggle-slide>\n </div>\n\n <button class=\"action-item expander-item\"\n *ngIf=\"item.type != 'toggle' && item.type != 'divider' && !item.disableCollapse\"\n (click)=\"toggleItem(item)\">\n <span class=\"expander-title\">{{item.title | translate}}</span>\n <i class=\"material-icons expand-icon\"\n [ngClass]=\"{'active': item.expanded}\">expand_more</i>\n </button>\n\n <div class=\"action-item section-title\"\n *ngIf=\"item.type != 'toggle' && item.type != 'divider' && item.disableCollapse\">\n {{item.title | translate}}\n </div>\n\n <ng-container *ngIf=\"item.expanded || item.disableCollapse\">\n <div [ngSwitch]=\"item.type\">\n <!-- Multiselect -->\n <div *ngSwitchCase=\"'multiselect'\">\n <!-- Lazy loading mode -->\n <ng-container *ngIf=\"item.isLazyLoading\">\n <div *ngFor=\"let dsItem of item.filteredDataSource\"\n class=\"action-item-checkbox ds-item\"\n [class.has-badge]=\"dsItem.badgeBgColor\">\n <zen-checkbox [(checked)]=\"dsItem.checked\"\n [imageUrl]=\"dsItem.imageUrl\"\n (checkedChange)=\"checkChanged(dsItem, item)\"\n [label]=\"dsItem.badgeBgColor ? '' : (dsItem.name?.toString() | translate)\"></zen-checkbox>\n <span *ngIf=\"dsItem.badgeBgColor\"\n class=\"filter-item-badge\"\n [ngStyle]=\"{'background': dsItem.badgeBgColor, 'color': dsItem.badgeColor}\">\n {{ dsItem.name?.toString() | translate }}\n </span>\n </div>\n <div *ngIf=\"item.canLoadMore && !item.isLoadingNow\"\n class=\"action-item\">\n <button (click)=\"loadMore(item, false)\"\n class=\"button-stroked full-width\">\n {{'Load More' | translate}}\n </button>\n </div>\n <div *ngIf=\"item.isLoadingNow\"\n class=\"loader-more-spinner\">\n <zen-spinner size=\"small\"></zen-spinner>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"!item.isLazyLoading && !hasTreeData(item)\">\n <div class=\"action-item-checkbox ds-item select-all\" *ngIf=\"!item.hideSelectAll\">\n <zen-checkbox *ngIf=\"item.dataSource.length === item.filteredDataSource.length\"\n [(checked)]=\"item.isSelectedAll\"\n [indeterminate]=\"isItemActive(item) && !item.isSelectedAll\"\n [label]=\"'Select All' | translate\"\n (checkedChange)=\"onSelectAll(item)\">\n </zen-checkbox>\n </div>\n\n <div *ngFor=\"let dsItem of item.filteredDataSource\"\n class=\"action-item-checkbox ds-item\"\n [class.has-badge]=\"dsItem.badgeBgColor\">\n <zen-checkbox [(checked)]=\"dsItem.checked\"\n [imageUrl]=\"dsItem.imageUrl\"\n (checkedChange)=\"checkChanged(dsItem, item)\"\n [label]=\"dsItem.badgeBgColor ? '' : (dsItem.name?.toString() | translate)\"></zen-checkbox>\n <span *ngIf=\"dsItem.badgeBgColor\"\n class=\"filter-item-badge\"\n [ngStyle]=\"{'background': dsItem.badgeBgColor, 'color': dsItem.badgeColor}\">\n {{ dsItem.name?.toString() | translate }}\n </span>\n </div>\n </ng-container>\n\n <!-- Tree view mode -->\n <zen-groups *ngIf=\"!item.isLazyLoading && hasTreeData(item)\"\n [dataSource]=\"item.dataSource\"\n [filteredDataSource]=\"item.filteredDataSource\"\n [hideSelectAll]=\"item.hideSelectAll\"\n [inline]=\"true\"\n [hideSearch]=\"true\"\n [(isSelectedAll)]=\"item.isSelectedAll\"\n (checkedChange)=\"checkChanged($event, item)\">\n </zen-groups>\n </div>\n\n <!-- Date range picker -->\n <div *ngSwitchCase=\"'dateRange'\">\n <!-- Options date range view -->\n <ng-container *ngIf=\"item.dateRangeOptions?.length\">\n <ng-container *ngFor=\"let option of item.dateRangeOptions\">\n <div class=\"action-item-radio ds-item\">\n <zen-radio [value]=\"option.name\"\n [label]=\"option.name | translate\"\n [name]=\"item.key\"\n [selected]=\"selectedDateRangeOptions[item.key] === option.name\"\n (radioChange)=\"handleDateRangeOptionClick(item, option)\"></zen-radio>\n </div>\n </ng-container>\n <div class=\"action-item-radio ds-item\">\n <zen-radio [value]=\"'Custom'\"\n [label]=\"'Custom' | translate\"\n [name]=\"item.key\"\n [selected]=\"selectedDateRangeOptions[item.key] === 'Custom'\"\n (radioChange)=\"handleCustomDateRangeClick(item)\"></zen-radio>\n </div>\n <ng-container *ngIf=\"selectedDateRangeOptions[item.key] === 'Custom'\">\n <div class=\"ds-item filter-row\">\n <div class=\"lbl\">{{'From' | translate}}:</div>\n <zen-datepicker class=\"width-full\"\n [(date)]=\"item.dateRange.start\"\n [showTime]=\"item.showTime\"\n [yPosition]=\"item.config?.yPosition ?? datepickerPosition.AUTO\"\n [parentContainer]=\"mainComponent\">\n </zen-datepicker>\n </div>\n <div class=\"ds-item filter-row\">\n <div class=\"lbl\">{{'To' | translate}}:</div>\n <zen-datepicker class=\"width-full\"\n [(date)]=\"item.dateRange.end\"\n [showTime]=\"item.showTime\"\n [yPosition]=\"item.config?.yPosition ?? datepickerPosition.AUTO\"\n (dateChange)=\"handleEndDateChange(item)\"\n [parentContainer]=\"mainComponent\">\n </zen-datepicker>\n </div>\n </ng-container>\n </ng-container>\n\n <!-- Default date range view -->\n <ng-container *ngIf=\"!item.dateRangeOptions?.length\">\n <div class=\"ds-item filter-row\">\n <div class=\"lbl\">{{'From' | translate}}:</div>\n <zen-datepicker class=\"width-full\"\n [(date)]=\"item.dateRange.start\"\n [showTime]=\"item.showTime\"\n [yPosition]=\"item.config?.yPosition ?? datepickerPosition.AUTO\"\n [parentContainer]=\"mainComponent\">\n </zen-datepicker>\n </div>\n <div class=\"ds-item filter-row\">\n <div class=\"lbl\">{{'To' | translate}}:</div>\n <zen-datepicker class=\"width-full\"\n [(date)]=\"item.dateRange.end\"\n [showTime]=\"item.showTime\"\n [yPosition]=\"item.config?.yPosition ?? datepickerPosition.AUTO\"\n (dateChange)=\"handleEndDateChange(item)\"\n [parentContainer]=\"mainComponent\">\n </zen-datepicker>\n </div>\n </ng-container>\n </div>\n\n <!-- Date picker -->\n <div *ngSwitchCase=\"'date'\">\n <div class=\"ds-item filter-row\">\n <div class=\"lbl\">{{'Date' | translate}}:</div>\n <zen-datepicker class=\"width-full\"\n [(date)]=\"item.date\"\n [showTime]=\"item.showTime\"\n [parentContainer]=\"mainComponent\">\n </zen-datepicker>\n </div>\n </div>\n\n <!-- Number range -->\n <div *ngSwitchCase=\"'numberRange'\"\n class=\"filter-row number-range-row\">\n <div>\n <div class=\"lbl\">{{'Min' | translate}}:</div>\n <input class=\"material-input\"\n [(ngModel)]=\"item.numberRange.from\"\n type=\"number\" />\n </div>\n <div>\n <div class=\"lbl\">{{'Max' | translate}}:</div>\n <input class=\"material-input\"\n [(ngModel)]=\"item.numberRange.to\"\n type=\"number\" />\n </div>\n </div>\n\n <!-- Radio -->\n <div *ngSwitchCase=\"'radio'\">\n <div *ngFor=\"let option of item.radioOptions\"\n class=\"action-item-radio ds-item\">\n <zen-radio [value]=\"option.id\"\n [label]=\"option.name | translate\"\n [name]=\"item.key\"\n [imageUrl]=\"option.imageUrl\"\n [selected]=\"option.selected\"\n (radioChange)=\"radioChanged($event, item)\"\n [disabled]=\"option.disabled\"></zen-radio>\n </div>\n </div>\n </div>\n </ng-container>\n\n </div>\n </div>\n <span *ngIf=\"showNoFilterResult\"\n class=\"no-item\">{{'No Results Found' | translate}}..</span>\n </div>\n\n <div class=\"action-menu-footer filter-footer\">\n <span class=\"selected-count\" *ngIf=\"hasMultiselectItems\">{{ selectedCount }} {{'Selected' | translate}}</span>\n <div class=\"filter-footer-actions\">\n <button (click)=\"reset()\"\n class=\"filter-btn-clear\"\n [class.has-selection]=\"selectedCount > 0 && hasMultiselectItems\">\n {{'Clear Filter' | translate}}\n </button>\n <button (click)=\"apply()\"\n class=\"filter-btn-apply\">\n {{'Apply' | translate}}\n </button>\n </div>\n </div>\n\n </div>\n</div>\n", styles: [".filters-component{display:inline-block;position:relative}.filters-component .menu-content{width:360px;white-space:initial;position:fixed}.filters-component .menu-content.absolute{position:absolute;inset:auto}.filters-component .menu-content.dropdown-left{right:0}.filters-component .menu-content.dropdown-right{left:0}.filters-component .menu-content.dropdown-top{bottom:100%;margin-bottom:8px}.filters-component .menu-content.dropdown-bottom{top:100%;margin-top:8px}.filters-component .menu-content.customTrigger{top:30px}.filters-component .menu-content .items-wrapper{overflow-y:auto;max-height:calc(100vh - 407px);position:relative;padding:8px 0}.filters-component .menu-content .items-wrapper .action-item,.filters-component .menu-content .items-wrapper .action-item-checkbox,.filters-component .menu-content .items-wrapper .action-item-radio{font-weight:500;font-size:14px;line-height:20px;color:#344054;padding:0 24px}.filters-component .menu-content .items-wrapper .action-item:hover,.filters-component .menu-content .items-wrapper .action-item-checkbox:hover,.filters-component .menu-content .items-wrapper .action-item-radio:hover{background:transparent}.filters-component .menu-content .items-wrapper .expander-item{outline:none;border:none;display:flex;width:100%;justify-content:space-between;font-family:inherit;font-weight:500;font-size:14px;line-height:20px;color:#344054;background:transparent;padding:12px 24px}.filters-component .menu-content .items-wrapper .expander-item .expander-title{flex:1;text-align:left}.filters-component .menu-content .items-wrapper .expander-item.expanded,.filters-component .menu-content .items-wrapper .expander-item.active{background:transparent;color:#344054}.filters-component .menu-content .items-wrapper .expander-item:hover{background:transparent}.filters-component .menu-content .items-wrapper .expand-icon{transition:.3s;font-size:20px;color:#667085}.filters-component .menu-content .items-wrapper .expand-icon.active{transform:rotate(180deg)}.filters-component .menu-content .items-wrapper .ds-item{padding-left:32px}.filters-component .menu-content .items-wrapper .no-item,.filters-component .menu-content .items-wrapper .error-msg{color:#dc3e33;display:flex;flex-direction:row;align-items:center;padding:10px 24px;font-weight:400;font-size:14px}.filters-component .menu-content .items-wrapper .select-all{font-weight:500}.filters-component .menu-content .items-wrapper .filter-row{padding:0 24px}.filters-component .menu-content .items-wrapper .filter-row:not(:last-of-type){margin-bottom:20px}.filters-component .menu-content .items-wrapper .filter-row .lbl{color:#344054;font-size:14px;font-weight:500;margin-bottom:8px}.filters-component .menu-content .items-wrapper .filter-row:focus-within .lbl{color:var(--color-primary, #2188d9)}.filters-component .menu-content .items-wrapper .number-range-row{display:flex;margin-left:32px;gap:16px;margin-bottom:10px}.filters-component .menu-content .items-wrapper .toggle-row{justify-content:space-between}.filters-component .filter-footer{justify-content:space-between;padding:16px 24px;border-top:1px solid #eaecf0}.filters-component .filter-footer .selected-count{font-weight:500;font-size:14px;line-height:20px;color:#1d2939}.filters-component .filter-footer .filter-footer-actions{display:flex;gap:12px}.filters-component .filter-footer .filter-btn-clear{display:flex;align-items:center;justify-content:center;padding:10px 16px;border-radius:8px;background:#ffffff;border:1px solid #eaecf0;box-shadow:0 1px 2px #1018280d;font-family:inherit;font-weight:500;font-size:14px;line-height:20px;color:#d0d5dd;cursor:pointer;white-space:nowrap}.filters-component .filter-footer .filter-btn-clear:hover{background:#f9fafb;color:#98a2b3}.filters-component .filter-footer .filter-btn-clear.has-selection{border-color:#fda29b;color:#b42318}.filters-component .filter-footer .filter-btn-clear.has-selection:hover{background:#fef3f2;color:#912018}.filters-component .filter-footer .filter-btn-apply{display:flex;align-items:center;justify-content:center;padding:10px 16px;border-radius:8px;background:var(--color-primary, #2188d9);border:1px solid var(--color-primary, #2188d9);box-shadow:0 1px 2px #1018280d;font-family:inherit;font-weight:500;font-size:14px;line-height:20px;color:#fff;cursor:pointer;white-space:nowrap}.filters-component .filter-footer .filter-btn-apply:hover{background:var(--color-blue-shade-1, #0d74c5);border-color:var(--color-blue-shade-1, #0d74c5)}.filters-component .section-title{font-weight:500;font-size:14px;line-height:20px;color:#344054;cursor:default;padding:12px 24px}.filters-component .section-title:hover{background:transparent}.filters-component .has-badge zen-checkbox{width:auto}.filters-component .filter-item-badge{font-weight:500;font-size:14px;line-height:20px;padding:2px 10px;border-radius:16px;white-space:nowrap}.filters-component .loader-more-spinner{display:flex;align-items:center;justify-content:center;padding:16px;box-sizing:border-box}.hidden{display:none}:host ::ng-deep zen-radio label{margin:0}\n"] }]
747
747
  }], ctorParameters: function () { return [{ type: i0.Renderer2 }]; }, propDecorators: { config: [{
748
748
  type: Input
749
749
  }], filter: [{
@@ -791,4 +791,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
791
791
  type: HostListener,
792
792
  args: ['window:keydown', ['$event']]
793
793
  }] } });
794
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiemVuZHUtZmlsdGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLXplbmR1aXQvc3JjL2xpYi9maWx0ZXIvemVuZHUtZmlsdGVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLXplbmR1aXQvc3JjL2xpYi9maWx0ZXIvemVuZHUtZmlsdGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBRVQsWUFBWSxFQUNaLFlBQVksRUFDWixLQUFLLEVBRUwsTUFBTSxFQUVOLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQU92QixPQUFPLE1BQU0sTUFBTSxlQUFlLENBQUM7QUFDbkMsT0FBTyxNQUFNLE1BQU0sZUFBZSxDQUFDO0FBRW5DLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDL0IsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7Ozs7Ozs7Ozs7Ozs7O0FBUy9ELE1BQU0sT0FBTyxvQkFBb0I7SUF5RC9CLFlBQW1CLFFBQW1CO1FBQW5CLGFBQVEsR0FBUixRQUFRLENBQVc7UUF4RDdCLFdBQU0sR0FBa0IsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQUM7UUFJdEMsYUFBUSxHQUFHLE9BQU8sQ0FBQztRQUVuQixrQkFBYSxHQUF3QixPQUFPLENBQUM7UUFFNUMsaUJBQVksR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO1FBRTNDLGNBQVMsR0FBRyxLQUFLLENBQUM7UUFFakIsb0JBQWUsR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDO1FBRS9DLGtCQUFhLEdBQUcsS0FBSyxDQUFDO1FBWXRCLG1CQUFjLEdBQXlCLE9BQU8sQ0FBQztRQUVqRCxlQUFVLEdBQUcsRUFBRSxDQUFDO1FBRWhCLGNBQVMsR0FBRyxLQUFLLENBQUM7UUFFakIsc0JBQWlCLEdB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O2FBQzFEO1NBQ0Y7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7O2tIQXYyQlUsb0JBQW9CO3NHQUFwQixvQkFBb0IsdzNCQzlCakMsb3NoQkE2UUE7NEZEL09hLG9CQUFvQjtrQkFMaEMsU0FBUzsrQkFDRSxZQUFZO2dHQUtiLE1BQU07c0JBQWQsS0FBSztnQkFFRyxNQUFNO3NCQUFkLEtBQUs7Z0JBRUcsUUFBUTtzQkFBaEIsS0FBSztnQkFFRyxhQUFhO3NCQUFyQixLQUFLO2dCQUVJLFlBQVk7c0JBQXJCLE1BQU07Z0JBRUUsU0FBUztzQkFBakIsS0FBSztnQkFFSSxlQUFlO3NCQUF4QixNQUFNO2dCQUVFLGFBQWE7c0JBQXJCLEtBQUs7Z0JBRUcsUUFBUTtzQkFBaEIsS0FBSztnQkFFRyxLQUFLO3NCQUFiLEtBQUs7Z0JBRUcsV0FBVztzQkFBbkIsS0FBSztnQkFFRyxhQUFhO3NCQUFyQixLQUFLO2dCQUVHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFFRyxjQUFjO3NCQUF0QixLQUFLO2dCQTBCcUMsU0FBUztzQkFBbkQsU0FBUzt1QkFBQyxXQUFXLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUd6QyxpQkFBaUI7c0JBRGhCLFNBQVM7dUJBQUMsZUFBZSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFnRDdDLGVBQWU7c0JBRGQsWUFBWTt1QkFBQyxrQkFBa0IsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkF1QjVDLGtCQUFrQjtzQkFEakIsWUFBWTt1QkFBQyxlQUFlLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBVXpDLFlBQVk7c0JBRFgsWUFBWTt1QkFBQyxlQUFlLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBVXpDLGVBQWU7c0JBRGQsWUFBWTt1QkFBQyxnQkFBZ0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBIb3N0TGlzdGVuZXIsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIERhdGFTb3VyY2UsXG4gIEZpbHRlcnNDb25maWcsXG4gIEZpbHRlcnNDb25maWdJdGVtLFxuICBNdWx0aVNlbGVjdEl0ZW0sXG59IGZyb20gJy4vZmlsdGVyc0NvbmZpZyc7XG5pbXBvcnQgdW5pcUJ5IGZyb20gJ2xvZGFzaC51bmlxYnknO1xuaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQvbW9tZW50JztcbmltcG9ydCB7IFplbmR1U2VhcmNoQm94Q29tcG9uZW50IH0gZnJvbSAnLi4vc2VhcmNoLWJveC96ZW5kdS1zZWFyY2gtYm94LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBVdGlsIH0gZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBEQVRFUElDS0VSX1BPU0lUSU9OIH0gZnJvbSAnLi4vZGF0ZXBpY2tlci9kYXRlcGlja2VyJztcbmltcG9ydCB7IERhdGVSYW5nZSB9IGZyb20gJy4vZGF0ZVJhbmdlJztcbmltcG9ydCB7IFJlbmRlcmVyMiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd6ZW4tZmlsdGVyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3plbmR1LWZpbHRlci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3plbmR1LWZpbHRlci5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBaZW5kdUZpbHRlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XG4gIEBJbnB1dCgpIGNvbmZpZzogRmlsdGVyc0NvbmZpZyA9IHsgaXRlbXM6IFtdIH07XG5cbiAgQElucHV0KCkgZmlsdGVyOiBvYmplY3Q7XG5cbiAgQElucHV0KCkgcG9zaXRpb24gPSAncmlnaHQnO1xuXG4gIEBJbnB1dCgpIHJlc2V0QmVoYXZpb3I6ICdzZXRfYWxsJyB8ICdjbGVhcicgPSAnY2xlYXInO1xuXG4gIEBPdXRwdXQoKSBmaWx0ZXJDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPG9iamVjdD4oKTtcblxuICBASW5wdXQoKSBpc1Zpc2libGUgPSBmYWxzZTtcblxuICBAT3V0cHV0KCkgaXNWaXNpYmxlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gIEBJbnB1dCgpIGN1c3RvbVRyaWdnZXIgPSBmYWxzZTtcblxuICBASW5wdXQoKSBpbWFnZVVybDogc3RyaW5nO1xuXG4gIEBJbnB1dCgpIGxhYmVsOiBzdHJpbmc7XG5cbiAgQElucHV0KCkgc2hvd09wdGlvbnM6IGJvb2xlYW47XG5cbiAgQElucHV0KCkgY3VzdG9tT3B0aW9uczogc3RyaW5nO1xuXG4gIEBJbnB1dCgpIHdyYXBwZXJCb2R5Q2xhc3M6IHN0cmluZztcblxuICBASW5wdXQoKSBjdXN0b21Qb3NpdGlvbjogJ2ZpeGVkJyB8ICdhYnNvbHV0ZScgPSAnZml4ZWQnO1xuXG4gIHB1YmxpYyBzZWFyY2hUZXh0ID0gJyc7XG5cbiAgcHVibGljIGlzQXBwbGllZCA9IGZhbHNlO1xuXG4gIHByaXZhdGUgbGFzdEFwcGxpZWRGaWx0ZXI6IGFueSA9IHt9O1xuXG4gIHByaXZhdGUgcmVzZXRlZEZpbHRlcjogYW55O1xuXG4gIHB1YmxpYyBtZW51TGVmdCA9ICcwcHgnO1xuXG4gIHB1YmxpYyBtZW51UmlnaHQgPSAnMHB4JztcblxuICBwdWJsaWMgbWVudVRvcCA9ICcwcHgnO1xuXG4gIHB1YmxpYyBtZW51Qm90dG9tID0gJzBweCc7XG5cbiAgcHVibGljIHNob3dOb0ZpbHRlclJlc3VsdDogYm9vbGVhbjtcblxuICBwdWJsaWMgZXJyb3JNZXNzYWdlOiBzdHJpbmdbXSA9IFtdO1xuXG4gIHB1YmxpYyBkYXRlcGlja2VyUG9zaXRpb24gPSBEQVRFUElDS0VSX1BPU0lUSU9OO1xuXG4gIHB1YmxpYyBzZWxlY3RlZERhdGVSYW5nZU9wdGlvbnM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7fTtcblxuICBAVmlld0NoaWxkKCdzZWFyY2hCb3gnLCB7IHN0YXRpYzogZmFsc2UgfSkgc2VhcmNoQm94OiBaZW5kdVNlYXJjaEJveENvbXBvbmVudDtcblxuICBAVmlld0NoaWxkKCdtYWluQ29tcG9uZW50JywgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIF9jb21wb25lbnRFbGVtZW50OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcbiAgY29uc3RydWN0b3IocHVibGljIHJlbmRlcmVyOiBSZW5kZXJlcjIpIHt9XG5cbiAgcHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IGFueSk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzLmNvbmZpZyAmJiBjaGFuZ2VzLmNvbmZpZy5jdXJyZW50VmFsdWUpIHtcbiAgICAgIC8vIGluaXQgdmFsdWVzXG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy5jb25maWcuaXRlbXMpIHtcbiAgICAgICAgaWYgKGl0ZW0udHlwZSA9PT0gJ211bHRpc2VsZWN0Jykge1xuICAgICAgICAgIGl0ZW0uZGF0YVNvdXJjZSA9IGl0ZW0uZGF0YVNvdXJjZVxuICAgICAgICAgICAgPyB0aGlzLmV4dHJhY3RVbmlxdWVEYXRhU291cmNlKGl0ZW0uZGF0YVNvdXJjZSlcbiAgICAgICAgICAgIDogW107XG4gICAgICAgIH0gZWxzZSBpZiAoaXRlbS50eXBlID09PSAnZGF0ZVJhbmdlJyAmJiAhaXRlbS5kYXRlUmFuZ2UpIHtcbiAgICAgICAgICBpdGVtLmRhdGVSYW5nZSA9IHsgc3RhcnQ6IG51bGwsIGVuZDogbnVsbCB9O1xuXG4gICAgICAgICAgLy8gaW5pdCBkYXRlIHJhbmdlIG9wdGlvbnNcbiAgICAgICAgICBpZiAoaXRlbS5zaG93RGF0ZVJhbmdlT3B0aW9ucyAmJiAhaXRlbS5kYXRlUmFuZ2VPcHRpb25zPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGl0ZW0uZGF0ZVJhbmdlT3B0aW9ucyA9IHRoaXMuZ2V0RGVmYXVsdERhdGVSYW5nZU9wdGlvbnMoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoaXRlbS50eXBlID09PSAnbnVtYmVyUmFuZ2UnICYmICFpdGVtLm51bWJlclJhbmdlKSB7XG4gICAgICAgICAgaXRlbS5udW1iZXJSYW5nZSA9IHt9O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBpdGVtLnNob3dUaW1lICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICBpdGVtLnNob3dUaW1lID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLmZpbHRlckl0ZW1zKCk7XG5cbiAgICAgIHRoaXMucmVzZXRlZEZpbHRlciA9IHRoaXMuZ2V0RmlsdGVyT2JqZWN0KCk7XG4gICAgICB0aGlzLmZpbHRlciA9IHRoaXMuZ2V0RmlsdGVyT2JqZWN0KCk7XG4gICAgICB0aGlzLmxhc3RBcHBsaWVkRmlsdGVyID0gVXRpbC5jbG9uZSh0aGlzLmZpbHRlcik7XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZXMuZmlsdGVyICYmIGNoYW5nZXMuZmlsdGVyLmN1cnJlbnRWYWx1ZSkge1xuICAgICAgdGhpcy5sYXN0QXBwbGllZEZpbHRlciA9IFV0aWwuY2xvbmUoY2hhbmdlcy5maWx0ZXIuY3VycmVudFZhbHVlKTtcblxuICAgICAgdGhpcy51cGRhdGVBcHBsaWVkU3RhdGUoKTtcbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlcy5pc1Zpc2libGUgJiYgY2hhbmdlcy5pc1Zpc2libGUuY3VycmVudFZhbHVlKSB7XG4gICAgICB0aGlzLnVwZGF0ZVBsYWNlbWVudCh0aGlzLmN1c3RvbVBvc2l0aW9uKTtcbiAgICAgIHRoaXMuZm9jdXNTZWFyY2hCb3goKTtcbiAgICB9XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6bW91c2Vkb3duJywgWyckZXZlbnQnXSlcbiAgb3V0c2lkZUhhbmRsaW5nKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgaWYgKCF0aGlzLmlzVmlzaWJsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICBpZiAoIWRvY3VtZW50LmJvZHkuY29udGFpbnModGFyZ2V0KSkge1xuICAgICAgLy8gZWxlbWVudCBub3QgaW4gdGhlIERPTVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5fY29tcG9uZW50RWxlbWVudC5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKHRhcmdldCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBoaWRlIHRoZSBtZW51IGZvciBvdXRzaWRlIGNsaWNrXG4gICAgdGhpcy5oaWRlKCk7XG5cbiAgICAvLyByZXN0b3JlIHZhbHVlc1xuICAgIHRoaXMucmVzdG9yZVByZXZpb3VzQXBwbGllZCgpO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OnJlc2l6ZScsIFsnJGV2ZW50J10pXG4gIHdpbmRvd1NpemVIYW5kbGluZygpIHtcbiAgICBpZiAoIXRoaXMuaXNWaXNpYmxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy51cGRhdGVQbGFjZW1lbnQodGhpcy5jdXN0b21Qb3NpdGlvbik7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6c2Nyb2xsJywgWyckZXZlbnQnXSlcbiAgd2luZG93U2Nyb2xsKCkge1xuICAgIGlmICghdGhpcy5pc1Zpc2libGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnVwZGF0ZVBsYWNlbWVudCh0aGlzLmN1c3RvbVBvc2l0aW9uKTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzprZXlkb3duJywgWyckZXZlbnQnXSlcbiAgb25XaW5kb3dLZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgaWYgKCF0aGlzLmlzVmlzaWJsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIGV2ZW50LmtleSA9PT0gJ0Fycm93VXAnIHx8XG4gICAgICBldmVudC5rZXkgPT09ICdBcnJvd0Rvd24nIHx8XG4gICAgICBldmVudC5rZXkgPT09ICdQYWdlVXAnIHx8XG4gICAgICBldmVudC5rZXkgPT09ICdQYWdlRG93bicgfHxcbiAgICAgIGV2ZW50LmtleSA9PT0gJ0hvbWUnIHx8XG4gICAgICBldmVudC5rZXkgPT09ICdFbmQnXG4gICAgKSB7XG4gICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICBpZiAoIWRvY3VtZW50LmJvZHkuY29udGFpbnModGFyZ2V0KSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5fY29tcG9uZW50RWxlbWVudC5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKHRhcmdldCkgJiZcbiAgICAgICAgIXRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoJ2J1dHRvbi1zdHJva2VkJylcbiAgICAgICkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLmhpZGUoKTtcbiAgICAgIHRoaXMucmVzdG9yZVByZXZpb3VzQXBwbGllZCgpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBmb2N1c1NlYXJjaEJveCgpIHtcbiAgICB0aGlzLnNlYXJjaEJveC5kb0ZvY3VzKCk7XG4gIH1cblxuICBwdWJsaWMgaXNNZW51SXNWaXNpYmxlKGl0ZW06IEZpbHRlcnNDb25maWdJdGVtKSB7XG4gICAgaWYgKGl0ZW0uaXNMYXp5TG9hZGluZykge1xuICAgICAgaWYgKGl0ZW0uaXNMb2FkaW5nTm93IHx8IGl0ZW0uY2FuTG9hZE1vcmUgIT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuc2VhcmNoVGV4dCkge1xuICAgICAgICByZXR1cm4gaXRlbS5maWx0ZXJlZERhdGFTb3VyY2U/Lmxlbmd0aCA+IDA7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoaXRlbS5maWx0ZXJlZERhdGFTb3VyY2UgJiYgdGhpcy5zZWFyY2hUZXh0KSB7XG4gICAgICBpZiAoIWl0ZW0uZmlsdGVyZWREYXRhU291cmNlLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwcml2YXRlIGV4dHJhY3RVbmlxdWVEYXRhU291cmNlKFxuICAgIGFycmF5OiB7XG4gICAgICBpZDogc3RyaW5nIHwgbnVtYmVyO1xuICAgICAgbmFtZTogc3RyaW5nIHwgbnVtYmVyO1xuICAgIH1bXVxuICApOiBNdWx0aVNlbGVjdEl0ZW1bXSB7XG4gICAgY29uc3QgaXRlbXMgPSBhcnJheS5maWx0ZXIoKGVsKSA9PiB7XG4gICAgICByZXR1cm4gQm9vbGVhbihcbiAgICAgICAgdHlwZW9mIGVsLmlkID09PSAnbnVtYmVyJ1xuICAgICAgICAgID8gdHlwZW9mIGVsLmlkICE9PSB1bmRlZmluZWRcbiAgICAgICAgICA6IGVsLmlkICYmIHR5cGVvZiBlbC5uYW1lID09PSAnbnVtYmVyJ1xuICAgICAgICAgID8gdHlwZW9mIGVsLm5hbWUgIT09IHVuZGVmaW5lZFxuICAgICAgICAgIDogZWwubmFtZVxuICAgICAgKTtcbiAgICB9KTtcbiAgICBjb25zdCB1bmlxSXRlbXMgPSB1bmlxQnkoaXRlbXMsIChlbCkgPT4gZWwuaWQpO1xuICAgIC8vIGFkZCBpbmRleCB0byBlYWNoIHVuaXFJdGVtc1xuICAgIHVuaXFJdGVtcy5mb3JFYWNoKFxuICAgICAgKGVsOiBNdWx0aVNlbGVjdEl0ZW0sIGluZGV4OiBudW1iZXIpID0+IChlbC5pbmRleCA9IGluZGV4KVxuICAgICk7XG4gICAgcmV0dXJuIHVuaXFJdGVtcztcbiAgfVxuXG4gIHB1YmxpYyBvblNlbGVjdEFsbChpdGVtOiBGaWx0ZXJzQ29uZmlnSXRlbSkge1xuICAgIGl0ZW0uZGF0YVNvdXJjZS5mb3JFYWNoKChkKSA9PiAoZC5jaGVja2VkID0gaXRlbS5pc1NlbGVjdGVkQWxsKSk7XG4gIH1cblxuICBwdWJsaWMgaXNJdGVtQWN0aXZlKGl0ZW06IEZpbHRlcnNDb25maWdJdGVtKTogYm9vbGVhbiB7XG4gICAgaWYgKGl0ZW0udHlwZSA9PT0gJ211bHRpc2VsZWN0Jykge1xuICAgICAgY29uc3QgY2hlY2tlZEl0ZW1zID0gaXRlbS5kYXRhU291cmNlLmZpbHRlcigoZWwpID0+IGVsLmNoZWNrZWQpO1xuICAgICAgaXRlbS5pc1NlbGVjdGVkQWxsID0gY2hlY2tlZEl0ZW1zLmxlbmd0aCA9PT0gaXRlbS5kYXRhU291cmNlLmxlbmd0aDtcbiAgICAgIHJldHVybiBjaGVja2VkSXRlbXMubGVuZ3RoID4gMDtcbiAgICB9IGVsc2UgaWYgKGl0ZW0udHlwZSA9PT0gJ3JhZGlvJykge1xuICAgICAgcmV0dXJuIGl0ZW0ucmFkaW9PcHRpb25zLnNvbWUoKHJvKSA9PiByby5zZWxlY3RlZCk7XG4gICAgfSBlbHNlIGlmIChpdGVtLnR5cGUgPT09ICdudW1iZXJSYW5nZScpIHtcbiAgICAgIHJldHVybiBCb29sZWFuKGl0ZW0ubnVtYmVyUmFuZ2UuZnJvbSB8fCBpdGVtLm51bWJlclJhbmdlLnRvKTtcbiAgICB9IGVsc2UgaWYgKGl0ZW0udHlwZSA9PT0gJ2RhdGVSYW5nZScpIHtcbiAgICAgIHJldHVybiBCb29sZWFuKGl0ZW0uZGF0ZVJhbmdlLnN0YXJ0IHx8IGl0ZW0uZGF0ZVJhbmdlLmVuZCk7XG4gICAgfSBlbHNlIGlmIChpdGVtLnR5cGUgPT09ICdkYXRlJykge1xuICAgICAgcmV0dXJuIEJvb2xlYW4oaXRlbS5kYXRlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzZWFyY2hUZXh0Q2hhbmdlZCgpIHtcbiAgICAvLyBydW4gdGhlIGxhenkgbG9hZGluZ1xuICAgIC8vIHRoZSBmaWx0ZXJJdGVtcyBjYWxsZWQgZnJvbSBvbkNoYW5nZXMsIHNvIGNhbGwgbGF6eSBsb2FkaW5nIG9ubHkgb24gc2VhcmNoIGNoYW5nZVxuICAgIHRoaXMucmVzZXRMYXp5TG9hZGluZ1NvdXJjZXMoZmFsc2UpO1xuXG4gICAgdGhpcy5maWx0ZXJJdGVtcygpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZXNldExhenlMb2FkaW5nU291cmNlcyhzaG93U2VsZWN0ZWRPblRvcDogYm9vbGVhbikge1xuICAgIGNvbnN0IHJlcXVlc3RzID0gW107XG4gICAgZm9yIChjb25zdCBjb25maWdJdGVtIG9mIHRoaXMuY29uZmlnLml0ZW1zKSB7XG4gICAgICBpZiAoY29uZmlnSXRlbS5pc0xhenlMb2FkaW5nKSB7XG4gICAgICAgIGNvbmZpZ0l0ZW0uY2FuTG9hZE1vcmUgPSB0cnVlO1xuICAgICAgICBjb25maWdJdGVtLmZpbHRlcmVkRGF0YVNvdXJjZSA9IFtdO1xuICAgICAgICByZXF1ZXN0cy5wdXNoKHRoaXMubG9hZE1vcmUoY29uZmlnSXRlbSwgc2hvd1NlbGVjdGVkT25Ub3ApKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhd2FpdCBQcm9taXNlLmFsbChyZXF1ZXN0cyk7XG5cbiAgICAvLyBmaWx0ZXIgbm9uLWxhenkgbG9hZGluZyBpdGVtc1xuICAgIHRoaXMuZmlsdGVySXRlbXMoKTtcbiAgfVxuXG4gIHByaXZhdGUgZmlsdGVySXRlbXMoKSB7XG4gICAgbGV0IGhhc0RhdGEgPSBmYWxzZTtcblxuICAgIGZvciAoY29uc3QgY29uZmlnSXRlbSBvZiB0aGlzLmNvbmZpZy5pdGVtcykge1xuICAgICAgaWYgKGNvbmZpZ0l0ZW0udHlwZSA9PT0gJ211bHRpc2VsZWN0Jykge1xuICAgICAgICBpZiAoY29uZmlnSXRlbS5pc0xhenlMb2FkaW5nKSB7XG4gICAgICAgICAgaWYgKGNvbmZpZ0l0ZW0uaXNMb2FkaW5nTm93KSB7XG4gICAgICAgICAgICAvLyBtYXJrIGFzIGRhdGEgYXZhaWxhYmxlIGluIGxvYWRpbmcgc3RhdGVcbiAgICAgICAgICAgIGhhc0RhdGEgPSB0cnVlO1xuICAgICAgICAgIH0gZWxzZSBpZiAoY29uZmlnSXRlbS5maWx0ZXJlZERhdGFTb3VyY2U/Lmxlbmd0aCkge1xuICAgICAgICAgICAgaGFzRGF0YSA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGlzVHJlZSA9IHRoaXMuaGFzVHJlZURhdGEoY29uZmlnSXRlbSk7XG4gICAgICAgICAgaWYgKGlzVHJlZSAmJiB0aGlzLnNlYXJjaFRleHQpIHtcbiAgICAgICAgICAgIC8vIEJ1aWxkIGEgbG9jYWwgbG9va3VwIG1hcCBmb3IgYW5jZXN0b3IgdHJhdmVyc2FsXG4gICAgICAgICAgICBjb25zdCBsb2NhbE1hcCA9IG5ldyBNYXA8c3RyaW5nIHwgbnVtYmVyLCBEYXRhU291cmNlPigpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBlbCBvZiBjb25maWdJdGVtLmRhdGFTb3VyY2UpIHtcbiAgICAgICAgICAgICAgbG9jYWxNYXAuc2V0KGVsLmlkLCBlbCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEZvciB0cmVlIGRhdGEsIGluY2x1ZGUgbWF0Y2hpbmcgaXRlbXMgYW5kIHRoZWlyIGFuY2VzdG9yc1xuICAgICAgICAgICAgY29uc3QgbWF0Y2hpbmdJZHMgPSBuZXcgU2V0PHN0cmluZyB8IG51bWJlcj4oKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZWwgb2YgY29uZmlnSXRlbS5kYXRhU291cmNlKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHByZXBhcmVkTmFtZSA9XG4gICAgICAgICAgICAgICAgdHlwZW9mIGVsLm5hbWUgPT09ICdudW1iZXInID8gZWwubmFtZS50b1N0cmluZygpIDogZWwubmFtZTtcbiAgICAgICAgICAgICAgaWYgKHByZXBhcmVkTmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHRoaXMuc2VhcmNoVGV4dC50b0xvd2VyQ2FzZSgpKSkge1xuICAgICAgICAgICAgICAgIG1hdGNoaW5nSWRzLmFkZChlbC5pZCk7XG4gICAgICAgICAgICAgICAgLy8gQWRkIGFsbCBhbmNlc3RvcnNcbiAgICAgICAgICAgICAgICBsZXQgY3VycmVudCA9IGVsO1xuICAgICAgICAgICAgICAgIHdoaWxlIChjdXJyZW50LnBhcmVudElkKSB7XG4gICAgICAgICAgICAgICAgICBtYXRjaGluZ0lkcy5hZGQoY3VycmVudC5wYXJlbnRJZCk7XG4gICAgICAgICAgICAgICAgICBjdXJyZW50ID0gbG9jYWxNYXAuZ2V0KGN1cnJlbnQucGFyZW50SWQpO1xuICAgICAgICAgICAgICAgICAgaWYgKCFjdXJyZW50KSBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbmZpZ0l0ZW0uZmlsdGVyZWREYXRhU291cmNlID0gY29uZmlnSXRlbS5kYXRhU291cmNlLmZpbHRlcihcbiAgICAgICAgICAgICAgKGVsKSA9PiBtYXRjaGluZ0lkcy5oYXMoZWwuaWQpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgLy8gQXV0by1leHBhbmQgcGFyZW50cyB3aGVuIHNlYXJjaGluZ1xuICAgICAgICAgICAgZm9yIChjb25zdCBlbCBvZiBjb25maWdJdGVtLmZpbHRlcmVkRGF0YVNvdXJjZSkge1xuICAgICAgICAgICAgICBpZiAoZWwuY2hpbGRyZW4/Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGVsLmlzT3BlbiA9IHRydWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbmZpZ0l0ZW0uZmlsdGVyZWREYXRhU291cmNlID0gdGhpcy5zb3J0VHJlZU9yZGVyKGNvbmZpZ0l0ZW0uZmlsdGVyZWREYXRhU291cmNlLCBsb2NhbE1hcCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbmZpZ0l0ZW0uZmlsdGVyZWREYXRhU291cmNlID0gY29uZmlnSXRlbS5kYXRhU291cmNlLmZpbHRlcigoZWwpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgcHJlcGFyZWROYW1lID1cbiAgICAgICAgICAgICAgICB0eXBlb2YgZWwubmFtZSA9PT0gJ251bWJlcicgPyBlbC5uYW1lLnRvU3RyaW5nKCkgOiBlbC5uYW1lO1xuICAgICAgICAgICAgICByZXR1cm4gcHJlcGFyZWROYW1lXG4gICAgICAgICAgICAgICAgLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgICAgICAuaW5jbHVkZXModGhpcy5zZWFyY2hUZXh0LnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoaXNUcmVlKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGxvY2FsTWFwID0gbmV3IE1hcDxzdHJpbmcgfCBudW1iZXIsIERhdGFTb3VyY2U+KCk7XG4gICAgICAgICAgICAgIGZvciAoY29uc3QgZWwgb2YgY29uZmlnSXRlbS5kYXRhU291cmNlKSB7XG4gICAgICAgICAgICAgICAgbG9jYWxNYXAuc2V0KGVsLmlkLCBlbCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29uZmlnSXRlbS5maWx0ZXJlZERhdGFTb3VyY2UgPSB0aGlzLnNvcnRUcmVlT3JkZXIoY29uZmlnSXRlbS5maWx0ZXJlZERhdGFTb3VyY2UsIGxvY2FsTWFwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoY29uZmlnSXRlbS5maWx0ZXJlZERhdGFTb3VyY2UubGVuZ3RoKSB7XG4gICAgICAgICAgICBoYXNEYXRhID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoY29uZmlnSXRlbS50eXBlID09PSAnZGF0ZVJhbmdlJykge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgdGhpcy5zZWFyY2hUZXh0ICYmXG4gICAgICAgICAgIUJvb2xlYW4oY29uZmlnSXRlbS5kYXRlUmFuZ2Uuc3RhcnQgfHwgY29uZmlnSXRlbS5kYXRlUmFuZ2UuZW5kKVxuICAgICAgICApIHtcbiAgICAgICAgICBjb25maWdJdGVtLmZpbHRlcmVkRGF0YVNvdXJjZSA9IFtdO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGNvbmZpZ0l0ZW0udHlwZSA9PT0gJ251bWJlclJhbmdlJykge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgdGhpcy5zZWFyY2hUZXh0ICYmXG4gICAgICAgICAgIUJvb2xlYW4oY29uZmlnSXRlbS5udW1iZXJSYW5nZS5mcm9tIHx8IGNvbmZpZ0l0ZW0ubnVtYmVyUmFuZ2UudG8pXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbmZpZ0l0ZW0uZmlsdGVyZWREYXRhU291cmNlID0gW107XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnNob3dOb0ZpbHRlclJlc3VsdCA9IHRoaXMuc2VhcmNoVGV4dCAmJiAhaGFzRGF0YTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBsb2FkTW9yZShpdGVtOiBGaWx0ZXJzQ29uZmlnSXRlbSwgc2hvd1NlbGVjdGVkT25Ub3A6IGJvb2xlYW4pIHtcbiAgICB0cnkge1xuICAgICAgaXRlbS5pc0xvYWRpbmdOb3cgPSB0cnVlO1xuICAgICAgaWYgKCFpdGVtLmxhenlMb2FkZXIpIHtcbiAgICAgICAgdGhyb3cgYGxvYWRlciBpcyBub3QgYXZhaWxhYmxlYDtcbiAgICAgIH1cbiAgICAgIGlmICghaXRlbS5maWx0ZXJlZERhdGFTb3VyY2UpIHtcbiAgICAgICAgaXRlbS5maWx0ZXJlZERhdGFTb3VyY2UgPSBbXTtcbiAgICAgIH1cblxuICAgICAgLy8gbG9hZCBmaXJzdCAxMCByZWNvcmRzIGZvciB0aGUgdGhlIGZpcnN0IHRpbWVcbiAgICAgIGNvbnN0IGxpbWl0ID0gaXRlbS5maWx0ZXJlZERhdGFTb3VyY2UubGVuZ3RoID09IDAgPyAxMCA6IDEwMDtcbiAgICAgIGNvbnN0IG5ld0l0ZW1zID0gYXdhaXQgaXRlbS5sYXp5TG9hZGVyKFxuICAgICAgICB7IHRleHQ6IHRoaXMuc2VhcmNoVGV4dCB8fCAnJyB9LFxuICAgICAgICBpdGVtLmZpbHRlcmVkRGF0YVNvdXJjZS5sZW5ndGgsXG4gICAgICAgIGxpbWl0XG4gICAgICApO1xuXG4gICAgICBpdGVtLmNhbkxvYWRNb3JlID0gbmV3SXRlbXMubGVuZ3RoID09IGxpbWl0O1xuXG4gICAgICAvLyB0aGUgZmlsdGVyZWREYXRhU291cmNlIGNvbnRhaW5zIHRoZSBpdGVtcyB0aGF0IGlzIHZpc2lsaWJsZSB0byB1c2VyIGF0IHRoZSBjdXJyZW50IG1vbWVudFxuICAgICAgaXRlbS5maWx0ZXJlZERhdGFTb3VyY2UgPSBpdGVtLmZpbHRlcmVkRGF0YVNvdXJjZS5jb25jYXQobmV3SXRlbXMpO1xuXG4gICAgICAvLyB0aGUgZGF0YVNvdXJjZSBjb250YWlucyB0aGUgc2VsZWN0ZWQgaXRlbXNcbiAgICAgIGNvbnN0IGNoZWNrZWRJZHMgPSBpdGVtLmRhdGFTb3VyY2VcbiAgICAgICAgLmZpbHRlcigoaSkgPT4gaS5jaGVja2VkKVxuICAgICAgICAubWFwKChpKSA9PiBpLmlkKTtcblxuICAgICAgaWYgKHNob3dTZWxlY3RlZE9uVG9wKSB7XG4gICAgICAgIC8vIHJlbW92ZSB0aGUgY2hlY2tlZCBpdGVtcyBmaXJzdFxuICAgICAgICBpdGVtLmZpbHRlcmVkRGF0YVNvdXJjZSA9IGl0ZW0uZmlsdGVyZWREYXRhU291cmNlLmZpbHRlcihcbiAgICAgICAgICAoaSkgPT4gIWNoZWNrZWRJZHMuaW5jbHVkZXMoaS5pZClcbiAgICAgICAgKTtcbiAgICAgICAgLy8gYWRkIGFsbCBjaGVja2VkIGl0ZW1zIHRvIHRoZSB0b3BcbiAgICAgICAgY29uc3QgY2hlY2tlZEl0ZW1zID0gaXRlbS5kYXRhU291cmNlLmZpbHRlcigoaSkgPT4gaS5jaGVja2VkKTtcbiAgICAgICAgaXRlbS5maWx0ZXJlZERhdGFTb3VyY2UgPSBjaGVja2VkSXRlbXMuY29uY2F0KGl0ZW0uZmlsdGVyZWREYXRhU291cmNlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIG1hcmsgYXMgY2hlY2tlZCBiYXNlZCBvbiB0aGUgZGF0YVNvdXJjZVxuICAgICAgICBmb3IgKGxldCBkc0l0ZW0gb2YgaXRlbS5maWx0ZXJlZERhdGFTb3VyY2UpIHtcbiAgICAgICAgICBkc0l0ZW0uY2hlY2tlZCA9IGNoZWNrZWRJZHMuaW5jbHVkZXMoZHNJdGVtLmlkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpdGVtLmlzTG9hZGluZ05vdyA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyB0b2dnbGVJdGVtKGl0ZW06IEZpbHRlcnNDb25maWdJdGVtKSB7XG4gICAgaXRlbS5leHBhbmRlZCA9ICFpdGVtLmV4cGFuZGVkO1xuXG4gICAgaWYgKGl0ZW0uaXNMYXp5TG9hZGluZykge1xuICAgICAgaWYgKGl0ZW0uZXhwYW5kZWQpIHtcbiAgICAgICAgaWYgKGl0ZW0uY2FuTG9hZE1vcmUgIT09IGZhbHNlICYmICFpdGVtLmZpbHRlcmVkRGF0YVNvdXJjZT8ubGVuZ3RoKSB7XG4gICAgICAgICAgdGhpcy5sb2FkTW9yZShpdGVtLCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlc2V0RmlsdGVycygpIHtcbiAgICBsZXQgc2VsZWN0QWxsID0gdGhpcy5yZXNldEJlaGF2aW9yID09PSAnc2V0X2FsbCc7XG4gICAgdGhpcy5zZWxlY3RlZERhdGVSYW5nZU9wdGlvbnMgPSB7fTtcblxuICAgIGZvciAoY29uc3QgaXRlbSBvZiB0aGlzLmNvbmZpZy5pdGVtcykge1xuICAgICAgaWYgKGl0ZW0uZGF0YVNvdXJjZSkge1xuICAgICAgICBpdGVtLmlzU2VsZWN0ZWRBbGwgPSBzZWxlY3RBbGw7XG5cbiAgICAgICAgZm9yIChjb25zdCBkc0l0ZW0gb2YgaXRlbS5kYXRhU291cmNlKSB7XG4gICAgICAgICAgZHNJdGVtLmNoZWNrZWQgPSBzZWxlY3RBbGw7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGl0ZW0uZGF0ZVJhbmdlKSB7XG4gICAgICAgIGl0ZW0uZGF0ZVJhbmdlID0geyBzdGFydDogbnVsbCwgZW5kOiBudWxsIH07XG4gICAgICB9XG5cbiAgICAgIGlmIChpdGVtLm51bWJlclJhbmdlKSB7XG4gICAgICAgIGl0ZW0ubnVtYmVyUmFuZ2UgPSB7IGZyb206IG51bGwsIHRvOiBudWxsIH07XG4gICAgICB9XG5cbiAgICAgIGlmIChpdGVtLmRhdGUpIHtcbiAgICAgICAgaXRlbS5kYXRlID0gbmV3IERhdGUoKTtcbiAgICAgIH1cbiAgICAgIGlmIChpdGVtLnR5cGUgPT09ICd0b2dnbGUnKSB7XG4gICAgICAgIGl0ZW0uZW5hYmxlZCA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKGl0ZW0udHlwZSA9PT0gJ3JhZGlvJykge1xuICAgICAgICBpdGVtLnJhZGlvT3B0aW9ucy5mb3JFYWNoKChlKSA9PiB7XG4gICAgICAgICAgaWYgKGUuaWQgPT09IGl0ZW0uc2VsZWN0ZWRSYWRpbykge1xuICAgICAgICAgICAgZS5zZWxlY3RlZCA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGUuc2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVzdG9yZVByZXZpb3VzQXBwbGllZCgpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy5jb25maWcuaXRlbXMpIHtcbiAgICAgIHN3aXRjaCAoaXRlbS50eXBlKSB7XG4gICAgICAgIGNhc2UgJ211bHRpc2VsZWN0JzpcbiAgICAgICAgICBpZiAoaXRlbS5kYXRhU291cmNlKSB7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB0aGlzLmxhc3RBcHBsaWVkRmlsdGVyW2l0ZW0ua2V5XTtcblxuICAgICAgICAgICAgZm9yIChjb25zdCBkYXRhSXRlbSBvZiBpdGVtLmRhdGFTb3VyY2UpIHtcbiAgICAgICAgICAgICAgZGF0YUl0ZW0uY2hlY2tlZCA9IHNlbGVjdGlvblxuICAgICAgICAgICAgICAgID8gc2VsZWN0aW9uLmluY2x1ZGVzKGRhdGFJdGVtLmlkKVxuICAgICAgICAgICAgICAgIDogZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdkYXRlUmFuZ2UnOlxuICAgICAgICAgIGl0ZW0uZGF0ZVJhbmdlID0gdGhpcy5sYXN0QXBwbGllZEZpbHRlcltpdGVtLmtleV0gfHwge1xuICAgICAgICAgICAgc3RhcnQ6IG51bGwsXG4gICAgICAgICAgICBlbmQ6IG51bGwsXG4gICAgICAgICAgfTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnbnVtYmVyUmFuZ2UnOlxuICAgICAgICAgIGl0ZW0ubnVtYmVyUmFuZ2UgPSB0aGlzLmxhc3RBcHBsaWVkRmlsdGVyW2l0ZW0ua2V5XSB8fCB7fTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAndG9nZ2xlJzpcbiAgICAgICAgICBpdGVtLmRhdGVSYW5nZSA9IHRoaXMubGFzdEFwcGxpZWRGaWx0ZXJbaXRlbS5rZXldO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdkYXRlJzpcbiAgICAgICAgICBpdGVtLmRhdGUgPSB0aGlzLmxhc3RBcHBsaWVkRmlsdGVyW2l0ZW0ua2V5XTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAncmFkaW8nOlxuICAgICAgICAgIGl0ZW0uc2VsZWN0ZWRSYWRpbyA9IHRoaXMubGFzdEFwcGxpZWRGaWx0ZXJbaXRlbS5rZXldO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyByZXNldCgpIHtcbiAgICB0aGlzLnJlc2V0RmlsdGVycygpO1xuXG4gICAgdGhpcy5maWx0ZXIgPSB0aGlzLmdldEZpbHRlck9iamVjdCgpO1xuICAgIHRoaXMucmVzZXRlZEZpbHRlciA9IHRoaXMuZ2V0RmlsdGVyT2JqZWN0KCk7XG5cbiAgICB0aGlzLnJlc2V0TGF6eUxvYWRpbmdTb3VyY2VzKGZhbHNlKTtcbiAgfVxuXG4gIHB1YmxpYyBhcHBseSgpIHtcbiAgICB0aGlzLmZpbHRlciA9IHRoaXMuZ2V0RmlsdGVyT2JqZWN0KCk7XG4gICAgbGV0IGhhc0Vycm9yID0gZmFsc2U7XG4gICAgZm9yIChjb25zdCBpdGVyYXRvciBvZiB0aGlzLmNvbmZpZy5pdGVtcykge1xuICAgICAgY29uc3QgaXRlbUZsYWcgPSB0aGlzLm9uQ2hlY2tWYWxpZGl0eShpdGVyYXRvcik7XG4gICAgICBpZiAoIWl0ZW1GbGFnKSB7XG4gICAgICAgIGhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGhhc0Vycm9yKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+ICh0aGlzLmVycm9yTWVzc2FnZSA9IFtdKSwgNTAwMCk7XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZXJyb3JNZXNzYWdlID0gW107XG4gICAgfVxuICAgIHRoaXMubGFzdEFwcGxpZWRGaWx0ZXIgPSBVdGlsLmNsb25lKHRoaXMuZmlsdGVyKTtcblxuICAgIHRoaXMuZmlsdGVyQ2hhbmdlLmVtaXQodGhpcy5maWx0ZXIpO1xuXG4gICAgLy8gdXBkYXRlIHRoZSBhcHBseSBzdGF0ZVxuICAgIHRoaXMudXBkYXRlQXBwbGllZFN0YXRlKCk7XG5cbiAgICB0aGlzLmhpZGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlQXBwbGllZFN0YXRlKCkge1xuICAgIHRoaXMuaXNBcHBsaWVkID0gZmFsc2U7XG4gICAgLy8gc2hvd2luZyBjaGVja2VkIGl0ZW1zIG9uIHRvcCBvZiB0aGUgbGlzdFxuICAgIGZvciAoY29uc3QgaXRlbSBvZiB0aGlzLmNvbmZpZy5pdGVtcykge1xuICAgICAgaWYgKGl0ZW0udHlwZSA9PT0gJ211bHRpc2VsZWN0Jykge1xuICAgICAgICAvLyByZXNvcnQgZmlyc3QgYmFzZWQgb24gaW5kZXhcbiAgICAgICAgaXRlbS5kYXRhU291cmNlLnNvcnQoKGEsIGIpID0+IGEuaW5kZXggLSBiLmluZGV4KTtcblxuICAgICAgICAvLyB0aGVuIHNvcnQgYmFzZWQgb24gY2hlY2tlZCBpdGVtcyBhZ2FpblxuICAgICAgICBpdGVtLmRhdGFTb3VyY2Uuc29ydChcbiAgICAgICAgICAoYTogRGF0YVNvdXJjZSwgYjogRGF0YVNvdXJjZSkgPT5cbiAgICAgICAgICAgIE51bWJlcihiLmNoZWNrZWQgfHwgMCkgLSBOdW1iZXIoYS5jaGVja2VkIHx8IDApXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuZmlsdGVyKS5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAodGhpcy5yZXNldGVkRmlsdGVyKSB7XG4gICAgICAgIC8vIEZpbHRlciB3YXMgcmVzZXQsIHNvIGNvbXBhcmUgdGhlIHJlc2V0IGZpbHRlciBvYmplY3Qgd2l0aCB0aGUgY3VycmVudCBmaWx0ZXJcbiAgICAgICAgLy8gV2hlbiB1c2VyIGNsaWNrIG9uIFJlc2V0IGFuZCBUaGVuIEFwcGx5LCBmaWx0ZXIgbXVzdCB1bmhpZ2hsaWdodGVkXG4gICAgICAgIGlmIChcbiAgICAgICAgICBKU09OLnN0cmluZ2lmeSh0aGlzLnJlc2V0ZWRGaWx0ZXIpICE9PSBKU09OLnN0cmluZ2lmeSh0aGlzLmZpbHRlcilcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5pc0FwcGxpZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmlzQXBwbGllZCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IHdyYXBwZXJDbGFzcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5hY3Rpb24tbWVudS1ib2R5Jyk7XG4gICAgaWYgKHRoaXMud3JhcHBlckJvZHlDbGFzcykge1xuICAgICAgd3JhcHBlckNsYXNzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgLiR7dGhpcy53cmFwcGVyQm9keUNsYXNzfWApO1xuICAgIH1cbiAgICBpZiAod3JhcHBlckNsYXNzKSB7XG4gICAgICB3cmFwcGVyQ2xhc3Muc2Nyb2xsVG8oeyB0b3A6IDAsIGJlaGF2aW9yOiAnYXV0bycgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRGaWx0ZXJPYmplY3QoKSB7XG4gICAgY29uc3QgZmlsdGVyID0ge307XG5cbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy5jb25maWcuaXRlbXMpIHtcbiAgICAgIHN3aXRjaCAoaXRlbS50eXBlKSB7XG4gICAgICAgIGNhc2UgJ211bHRpc2VsZWN0JzpcbiAgICAgICAgICBpZiAoaXRlbS5kYXRhU291cmNlICYmIGl0ZW0uZGF0YVNvdXJjZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGNoZWNrZWRJZHMgPSBpdGVtLmRhdGFTb3VyY2VcbiAgICAgICAgICAgICAgLmZpbHRlcigoaSkgPT4gaS5jaGVja2VkKVxuICAgICAgICAgICAgICAubWFwKChpKSA9PiBpLmlkKTtcblxuICAgICAgICAgICAgaWYgKGNoZWNrZWRJZHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIGZpbHRlcltpdGVtLmtleV0gPSBjaGVja2VkSWRzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnZGF0ZVJhbmdlJzpcbiAgICAgICAgICBpZiAoaXRlbS5kYXRlUmFuZ2UgJiYgaXRlbS5kYXRlUmFuZ2Uuc3RhcnQgJiYgaXRlbS5kYXRlUmFuZ2UuZW5kKSB7XG4gICAgICAgICAgICBmaWx0ZXJbaXRlbS5rZXldID0gaXRlbS5kYXRlUmFuZ2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdudW1iZXJSYW5nZSc6XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgaXRlbS5udW1iZXJSYW5nZSAmJlxuICAgICAgICAgICAgdHlwZW9mIGl0ZW0/Lm51bWJlclJhbmdlPy5mcm9tID09PSAnbnVtYmVyJyAmJlxuICAgICAgICAgICAgdHlwZW9mIGl0ZW0/Lm51bWJlclJhbmdlPy50byA9PT0gJ251bWJlcidcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGZpbHRlcltpdGVtLmtleV0gPSBpdGVtLm51bWJlclJhbmdlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAndG9nZ2xlJzpcbiAgICAgICAgICBmaWx0ZXJbaXRlbS5rZXldID0gaXRlbS5lbmFibGVkIHx8IGZhbHNlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdkYXRlJzpcbiAgICAgICAgICBpZiAoaXRlbS5kYXRlKSB7XG4gICAgICAgICAgICBmaWx0ZXJbaXRlbS5rZXldID0gaXRlbS5kYXRlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAncmFkaW8nOlxuICAgICAgICAgIGZpbHRlcltpdGVtLmtleV0gPSBpdGVtLnJhZGlvT3B0aW9ucy5maW5kKChybykgPT4gcm8uc2VsZWN0ZWQpPy5pZDtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmlsdGVyO1xuICB9XG5cbiAgcHVibGljIGhpZGUoKSB7XG4gICAgdGhpcy5pc1Zpc2libGUgPSBmYWxzZTtcbiAgICB0aGlzLnNlYXJjaFRleHQgPSAnJztcbiAgICB0aGlzLmZpbHRlckl0ZW1zKCk7XG5cbiAgICB0aGlzLmlzVmlzaWJsZUNoYW5nZS5lbWl0KGZhbHNlKTtcbiAgfVxuXG4gIHB1YmxpYyByYWRpb0NoYW5nZWQodmFsdWU6IHN0cmluZywgaXRlbTogRmlsdGVyc0NvbmZpZ0l0ZW0pOiB2b2lkIHtcbiAgICBpdGVtLnJhZGlvT3B0aW9ucy5mb3JFYWNoKChvcHQpID0+IChvcHQuc2VsZWN0ZWQgPSBvcHQuaWQgPT09IHZhbHVlKSk7XG4gIH1cblxuICBwdWJsaWMgY2hlY2tDaGFuZ2VkKGl0ZW06IERhdGFTb3VyY2UsIGNvbmZpZ0l0ZW06IEZpbHRlcnNDb25maWdJdGVtKTogdm9pZCB7XG4gICAgaWYgKGNvbmZpZ0l0ZW0uaXNMYXp5TG9hZGluZykge1xuICAgICAgLy8gc3RvcmUgdGhlIGNoZWNrIGl0ZW1zIGluIHRoZSBkYXRhIHNvdXJjZVxuICAgICAgY29uc3QgZXhpc3RJdGVtID0gY29uZmlnSXRlbS5kYXRhU291cmNlLmZpbmQoKGkpID0+IGkuaWQgPT0gaXRlbS5pZCk7XG4gICAgICBpZiAoZXhpc3RJdGVtKSB7XG4gICAgICAgIGV4aXN0SXRlbS5jaGVja2VkID0gaXRlbS5jaGVja2VkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uZmlnSXRlbS5kYXRhU291cmNlLnB1c2goaXRlbSk7XG4gICAgICB9XG4gICAgICAvLyBrZWVwIG9ubHkgY2hlY2tlZFxuICAgICAgY29uZmlnSXRlbS5kYXRhU291cmNlID0gY29uZmlnSXRlbS5kYXRhU291cmNlLmZpbHRlcigoZCkgPT4gZC5jaGVja2VkKTtcbiAgICB9XG4gICAgLy8gRm9yIHRyZWUgaXRlbXMsIHplbi1ncm91cHMgaGFuZGxlcyBjYXNjYWRlIGludGVybmFsbHlcbiAgfVxuXG4gIHB1YmxpYyB0b2dnbGUoKSB7XG4gICAgdGhpcy5pc1Zpc2libGUgPSAhdGhpcy5pc1Zpc2libGU7XG4gICAgdGhpcy51cGRhdGVQbGFjZW1lbnQodGhpcy5jdXN0b21Qb3NpdGlvbik7XG4gICAgdGhpcy5mb2N1c1NlYXJjaEJveCgpO1xuXG4gICAgaWYgKHRoaXMuaXNWaXNpYmxlKSB7XG4gICAgICB0aGlzLnJlc2V0TGF6eUxvYWRpbmdTb3VyY2VzKHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBvbkNoZWNrVmFsaWRpdHkoaXRlbTogRmlsdGVyc0NvbmZpZ0l0ZW0pIHtcbiAgICBpZiAoaXRlbS50eXBlID09PSAnbnVtYmVyUmFuZ2UnKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHR5cGVvZiBpdGVtLm51bWJlclJhbmdlLmZyb20gPT09ICdudW1iZXInICYmXG4gICAgICAgIHR5cGVvZiBpdGVtLm51bWJlclJhbmdlLnRvID09PSAnbnVtYmVyJyAmJlxuICAgICAgICBpdGVtLm51bWJlclJhbmdlLmZyb20gPiBpdGVtLm51bWJlclJhbmdlLnRvXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5lcnJvck1lc3NhZ2UucHVzaChcbiAgICAgICAgICBgSW52YWxpZCBOdW1iZXIgcmFuZ2U6IFRoZSBNaW4gbnVtYmVyIGNhbm5vdCBiZSBncmVhdGVyIHRoYW4gdGhlIE1heCBudW1iZXIuYFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpdGVtLnR5cGUgPT09ICdkYXRlUmFuZ2UnKSB7XG4gICAgICBpZiAoXG4gICAgICAgIGl0ZW0uZGF0ZVJhbmdlLnN0YXJ0ICYmXG4gICAgICAgIGl0ZW0uZGF0ZVJhbmdlLmVuZCAmJlxuICAgICAgICBuZXcgRGF0ZShpdGVtLmRhdGVSYW5nZS5zdGFydCkgPiBuZXcgRGF0ZShpdGVtLmRhdGVSYW5nZS5lbmQpXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5lcnJvck1lc3NhZ2UucHVzaChcbiAgICAgICAgICBgSW52YWxpZCBEYXRlIHJhbmdlOiBUaGUgU3RhcnQgZGF0ZSBjYW5ub3QgYmUgYWZ0ZXIgdGhlIEVuZCBkYXRlLmBcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGVQbGFjZW1lbnQocG9zOiAnZml4ZWQnIHwgJ2Fic29sdXRlJyA9ICdmaXhlZCcpIHtcbiAgICBjb25zdCBob3N0ID0gdGhpcy5fY29tcG9uZW50RWxlbWVudC5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IGhvc3QucXVlcnlTZWxlY3RvcignLm1lbnUtY29udGVudCcpIGFzIEhUTUxFbGVtZW50O1xuICAgIGlmICghY29udGFpbmVyKSByZXR1cm47XG5cbiAgICBjb25zdCByZWN0ID1cbiAgICAgIHBvcyA9PT0gJ2ZpeGVkJ1xuICAgICAgICA/IGhvc3QuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClcbiAgICAgICAgOiBjb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgbGVmdCA9IHJlY3QubGVmdDtcbiAgICBjb25zdCByaWdodCA9IHJlY3QucmlnaHQ7XG4gICAgY29uc3QgdG9wID0gcmVjdC50b3A7XG4gICAgY29uc3QgYm90dG9tID0gd2luZG93LmlubmVySGVpZ2h0IC0gdG9wO1xuXG4gICAgaWYgKHBvcyA9PT0gJ2Fic29sdXRlJykge1xuICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyhjb250YWluZXIsICdhYnNvbHV0ZScpO1xuICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVTdHlsZShjb250YWluZXIsICdpbnNldCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKGNvbnRhaW5lciwgJ2Fic29sdXRlJyk7XG4gICAgfVxuXG4gICAgaWYgKHBvcyA9PT0gJ2ZpeGVkJykge1xuICAgICAgaWYgKHRoaXMucG9zaXRpb24uaW5jbHVkZXMoJ2F1dG8nKSkge1xuICAgICAgICBjb25zdCBob3Jpem9udGFsUG9zaXRpb24gPSB0aGlzLmdldEhvcml6b250YWxQb3NpdGlvbigpO1xuICAgICAgICB0aGlzLm1lbnVSaWdodCA9XG4gICAgICAgICAgaG9yaXpvbnRhbFBvc2l0aW9uID09PSAnbGVmdCdcbiAgICAgICAgICAgID8gYCR7d2luZG93LmlubmVyV2lkdGggLSByaWdodH1weGBcbiAgICAgICAgICAgIDogJ3Vuc2V0JztcbiAgICAgICAgdGhpcy5tZW51TGVmdCA9IGhvcml6b250YWxQb3NpdGlvbiA9PT0gJ3JpZ2h0JyA/IGAke2xlZnR9cHhgIDogJ3Vuc2V0JztcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5wb3NpdGlvbi5pbmNsdWRlcygnbGVmdCcpKSB7XG4gICAgICAgIHRoaXMubWVudVJpZ2h0ID0gYCR7d2luZG93LmlubmVyV2lkdGggLSByaWdodH1weGA7XG4gICAgICAgIHRoaXMubWVudUxlZnQgPSAndW5zZXQnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5tZW51TGVmdCA9IGAke2xlZnR9cHhgO1xuICAgICAgICB0aGlzLm1lbnVSaWdodCA9ICd1bnNldCc7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnBvc2l0aW9uLmluY2x1ZGVzKCdhdXRvJykpIHtcbiAgICAgICAgY29uc3QgdmVydGljYWxQb3NpdGlvbiA9IHRoaXMuZ2V0VmVydGljYWxQb3NpdGlvbigpO1xuICAgICAgICB0aGlzLm1lbnVUb3AgPVxuICAgICAgICAgIHZlcnRpY2FsUG9zaXRpb24gPT09ICdib3R0b20nID8gYCR7dG9wICsgNDJ9cHhgIDogJ3Vuc2V0JztcbiAgICAgICAgdGhpcy5tZW51Qm90dG9tID0gdmVydGljYWxQb3NpdGlvbiA9PT0gJ3RvcCcgPyBgJHtib3R0b219cHhgIDogJ3Vuc2V0JztcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5wb3NpdGlvbi5pbmNsdWRlcygndG9wJykpIHtcbiAgICAgICAgdGhpcy5tZW51VG9wID0gJ3Vuc2V0JztcbiAgICAgICAgdGhpcy5tZW51Qm90dG9tID0gYCR7Ym90dG9tICsgMTB9cHhgO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5tZW51VG9wID0gYCR7dG9wICsgNTV9cHhgO1xuICAgICAgICB0aGlzLm1lbnVCb3R0b20gPSAndW5zZXQnO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgdmVydGljYWxDbGFzcyA9ICcnO1xuICAgICAgbGV0IGhvcml6b250YWxDbGFzcyA9ICcnO1xuXG4gICAgICBpZiAodGhpcy5wb3NpdGlvbi5pbmNsdWRlcygnYXV0bycpKSB7XG4gICAgICAgIGhvcml6b250YWxDbGFzcyA9IHRoaXMuZ2V0SG9yaXpvbnRhbFBvc2l0aW9uKCk7XG4gICAgICAgIHZlcnRpY2FsQ2xhc3MgPSB0aGlzLmdldFZlcnRpY2FsUG9zaXRpb24oKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGhvcml6b250YWxDbGFzcyA9IHRoaXMucG9zaXRpb24uaW5jbHVkZXMoJ2xlZnQnKSA/ICdsZWZ0JyA6ICdyaWdodCc7XG4gICAgICAgIHZlcnRpY2FsQ2xhc3MgPSB0aGlzLnBvc2l0aW9uLmluY2x1ZGVzKCd0b3AnKSA/ICd0b3AnIDogJ2JvdHRvbSc7XG4gICAgICB9XG4gICAgICBbXG4gICAgICAgICdkcm9wZG93bi1sZWZ0JyxcbiAgICAgICAgJ2Ryb3Bkb3duLXJpZ2h0JyxcbiAgICAgICAgJ2Ryb3Bkb3duLXRvcCcsXG4gICAgICAgICdkcm9wZG93bi1ib3R0b20nLFxuICAgICAgXS5mb3JFYWNoKChjKSA9PiB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKGNvbnRhaW5lciwgYykpO1xuICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyhjb250YWluZXIsIGBkcm9wZG93bi0ke2hvcml6b250YWxDbGFzc31gKTtcbiAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MoY29udGFpbmVyLCBgZHJvcGRvd24tJHt2ZXJ0aWNhbENsYXNzfWApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0VmVydGljYWxQb3NpdGlvbigpOiAnYm90dG9tJyB8ICd0b3AnIHtcbiAgICBjb25zdCB0b3AgPVxuICAgICAgdGhpcy5fY29tcG9uZW50RWxlbWVudC5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcDtcbiAgICByZXR1cm4gdG9wID4gd2luZG93LmlubmVySGVpZ2h0IC8gMiA/ICd0b3AnIDogJ2JvdHRvbSc7XG4gIH1cblxuICBwcml2YXRlIGdldEhvcml6b250YWxQb3NpdGlvbigpOiAncmlnaHQnIHwgJ2xlZnQnIHtcbiAgICBjb25zdCBsZWZ0ID1cbiAgICAgIHRoaXMuX2NvbXBvbmVudEVsZW1lbnQubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0O1xuICAgIHJldHVybiBsZWZ0ID4gd2luZG93LmlubmVyV2lkdGggLyAyID8gJ2xlZnQnIDogJ3JpZ2h0JztcbiAgfVxuXG4gIHB1YmxpYyBnZXREZWZhdWx0RGF0ZVJhbmdlT3B0aW9ucygpOiB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGRhdGVSYW5nZTogRGF0ZVJhbmdlO1xuICB9W10ge1xuICAgIHJldHVybiBbXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdUb2RheScsXG4gICAgICAgIGRhdGVSYW5nZToge1xuICAgICAgICAgIHN0YXJ0OiBtb21lbnQoKS5zdGFydE9mKCdkYXknKS50b0RhdGUoKSxcbiAgICAgICAgICBlbmQ6IG1vbWVudCgpLmVuZE9mKCdkYXknKS50b0RhdGUoKSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdZZXN0ZXJkYXknLFxuICAgICAgICBkYXRlUmFuZ2U6IHtcbiAgICAgICAgICBzdGFydDogbW9tZW50KCkuc3VidHJhY3QoMSwgJ2RheXMnKS5zdGFydE9mKCdkYXknKS50b0RhdGUoKSxcbiAgICAgICAgICBlbmQ6IG1vbWVudCgpLnN1YnRyYWN0KDEsICdkYXlzJykuZW5kT2YoJ2RheScpLnRvRGF0ZSgpLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ1RoaXMgV2VlaycsXG4gICAgICAgIGRhdGVSYW5nZToge1xuICAgICAgICAgIHN0YXJ0OiBtb21lbnQoKS5zdGFydE9mKCd3ZWVrJykudG9EYXRlKCksXG4gICAgICAgICAgZW5kOiBtb21lbnQoKS5lbmRPZignd2VlaycpLnRvRGF0ZSgpLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ0xhc3QgV2VlaycsXG4gICAgICAgIGRhdGVSYW5nZToge1xuICAgICAgICAgIHN0YXJ0OiBtb21lbnQoKS5zdWJ0cmFjdCg3LCAnZGF5cycpLnN0YXJ0T2YoJ3dlZWsnKS50b0RhdGUoKSxcbiAgICAgICAgICBlbmQ6IG1vbWVudCgpLnN1YnRyYWN0KDcsICdkYXlzJykuZW5kT2YoJ3dlZWsnKS50b0RhdGUoKSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdUaGlzIE1vbnRoJyxcbiAgICAgICAgZGF0ZVJhbmdlOiB7XG4gICAgICAgICAgc3RhcnQ6IG1vbWVudCgpLnN0YXJ0T2YoJ21vbnRoJykudG9EYXRlKCksXG4gICAgICAgICAgZW5kOiBtb21lbnQoKS5lbmRPZignbW9udGgnKS50b0RhdGUoKSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdMYXN0IE1vbnRoJyxcbiAgICAgICAgZGF0ZVJhbmdlOiB7XG4gICAgICAgICAgc3RhcnQ6IG1vbWVudCgpLnN1YnRyYWN0KDEsICdtb250aCcpLnN0YXJ0T2YoJ21vbnRoJykudG9EYXRlKCksXG4gICAgICAgICAgZW5kOiBtb21lbnQoKS5zdWJ0cmFjdCgxLCAnbW9udGgnKS5lbmRPZignbW9udGgnKS50b0RhdGUoKSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgXTtcbiAgfVxuXG4gIHByaXZhdGUgc29ydFRyZWVPcmRlcihpdGVtczogRGF0YVNvdXJjZVtdLCB0cmVlTWFwOiBNYXA8c3RyaW5nIHwgbnVtYmVyLCBEYXRhU291cmNlPik6IERhdGFTb3VyY2VbXSB7XG4gICAgY29uc3QgaXRlbVNldCA9IG5ldyBTZXQoaXRlbXMubWFwKGkgPT4gaS5pZCkpO1xuICAgIGNvbnN0IHZpc2l0ZWQgPSBuZXcgU2V0PHN0cmluZyB8IG51bWJlcj4oKTtcbiAgICBjb25zdCBvcmRlcmVkOiBEYXRhU291cmNlW10gPSBbXTtcbiAgICBjb25zdCB2aXNpdCA9IChpdGVtOiBEYXRhU291cmNlKSA9PiB7XG4gICAgICBpZiAodmlzaXRlZC5oYXMoaXRlbS5pZCkpIHJldHVybjtcbiAgICAgIGlmICghaXRlbVNldC5oYXMoaXRlbS5pZCkpIHJldHVybjtcbiAgICAgIHZpc2l0ZWQuYWRkKGl0ZW0uaWQpO1xuICAgICAgb3JkZXJlZC5wdXNoKGl0ZW0pO1xuICAgICAgaWYgKGl0ZW0uY2hpbGRyZW4/Lmxlbmd0aCkge1xuICAgICAgICBmb3IgKGNvbnN0IGNoaWxkSWQgb2YgaXRlbS5jaGlsZHJlbikge1xuICAgICAgICAgIGNvbnN0IGNoaWxkID0gdHJlZU1hcC5nZXQoY2hpbGRJZCk7XG4gICAgICAgICAgaWYgKGNoaWxkKSB7XG4gICAgICAgICAgICB2aXNpdChjaGlsZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcbiAgICAgIGlmIChpdGVtLnBhcmVudElkID09IG51bGwpIHtcbiAgICAgICAgdmlzaXQoaXRlbSk7XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xuICAgICAgaWYgKCF2aXNpdGVkLmhhcyhpdGVtLmlkKSkge1xuICAgICAgICBvcmRlcmVkLnB1c2goaXRlbSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvcmRlcmVkO1xuICB9XG5cbiAgcHVibGljIGhhc1RyZWVEYXRhKGNvbmZpZ0l0ZW06IEZpbHRlcnNDb25maWdJdGVtKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGNvbmZpZ0l0ZW0uZGF0YVNvdXJjZT8uc29tZShkID0+IGQuY2hpbGRyZW4/Lmxlbmd0aCA+IDApIHx8IGZhbHNlO1xuICB9XG5cbiAgcHVibGljIGhhbmRsZURhdGVSYW5nZU9wdGlvbkNsaWNrKGl0ZW0sIG9wdGlvbikge1xuICAgIGl0ZW0uZGF0ZVJhbmdlID0gb3B0aW9uLmRhdGVSYW5nZTtcbiAgICB0aGlzLnNlbGVjdGVkRGF0ZVJhbmdlT3B0aW9uc1tpdGVtLmtleV0gPSBvcHRpb24ubmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBoYW5kbGVDdXN0b21EYXRlUmFuZ2VDbGljayhpdGVtKSB7XG4gICAgdGhpcy5zZWxlY3RlZERhdGVSYW5nZU9wdGlvbnNbaXRlbS5rZXldID0gJ0N1c3RvbSc7XG4gIH1cblxuICBwdWJsaWMgaGFuZGxlRW5kRGF0ZUNoYW5nZShpdGVtKSB7XG4gICAgaWYgKCFpdGVtLnNob3dUaW1lKSB7XG4gICAgICBpdGVtLmRhdGVSYW5nZS5lbmQgPSBtb21lbnQoaXRlbS5kYXRlUmFuZ2UuZW5kKS5lbmRPZignZGF5JykudG9EYXRlKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldCBoYXNNdWx0aXNlbGVjdEl0ZW1zKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5pdGVtcy5zb21lKFxuICAgICAgKGl0ZW0pID0+IGl0ZW0udHlwZSA9PT0gJ211bHRpc2VsZWN0JyAmJiBpdGVtLmRhdGFTb3VyY2U/Lmxlbmd0aCA+IDBcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGdldCBzZWxlY3RlZENvdW50KCk6IG51bWJlciB7XG4gICAgbGV0IGNvdW50ID0gMDtcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy5jb25maWcuaXRlbXMpIHtcbiAgICAgIGlmIChpdGVtLnR5cGUgPT09ICdtdWx0aXNlbGVjdCcgJiYgaXRlbS5kYXRhU291cmNlKSB7XG4gICAgICAgIGNvdW50ICs9IGl0ZW0uZGF0YVNvdXJjZS5maWx0ZXIoKGQpID0+IGQuY2hlY2tlZCkubGVuZ3RoO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY291bnQ7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJmaWx0ZXJzLWNvbXBvbmVudFwiXG4gICAgICNtYWluQ29tcG9uZW50XG4gICAgIGNsaWNrLW91dD1cImlzVmlzaWJsZSAmJiBoaWRlKClcIj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhY3VzdG9tVHJpZ2dlclwiPlxuICAgICAgICA8emVuLWJ1dHRvbiAoY2xpY2spPVwidG9nZ2xlKClcIlxuICAgICAgICAgICAgICAgICAgICBbdmFyaWFudF09XCJpc0FwcGxpZWQgPyAnc2Vjb25kYXJ5JyA6ICdzZWNvbmRhcnktZ3JheSdcIlxuICAgICAgICAgICAgICAgICAgICBzaXplPVwic21cIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZpbHRlciB7e2lzQXBwbGllZCA/ICdhcHBsaWVkJyA6ICcnfX1cIj5cbiAgICAgICAgICAgIDx6ZW4taWNvbiBbc3JjXT1cImltYWdlVXJsXCJcbiAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImltYWdlVXJsXCI+PC96ZW4taWNvbj5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwiZmlsdGVyLWljb24gbWF0ZXJpYWwtaWNvbnNcIlxuICAgICAgICAgICAgICAgKm5nSWY9XCIhaW1hZ2VVcmxcIj5maWx0ZXJfbGlzdDwvaT5cbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwibGFiZWxcIj57eyBsYWJlbCB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgPC96ZW4tYnV0dG9uPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPG5nLWNvbnRlbnQgKm5nSWY9XCJjdXN0b21UcmlnZ2VyXCI+PC9uZy1jb250ZW50PlxuXG4gICAgPGRpdiBbaGlkZGVuXT1cIiFpc1Zpc2libGVcIlxuICAgICAgICAgY2xhc3M9XCJhY3Rpb24tbWVudSBtZW51LWNvbnRlbnRcIlxuICAgICAgICAgW2NsYXNzLmN1c3RvbVRyaWdnZXJdPVwiY3VzdG9tVHJpZ2dlclwiXG4gICAgICAgICBbbmdTdHlsZV09XCJ7ICdsZWZ0JzogbWVudUxlZnQsICdyaWdodCc6IG1lbnVSaWdodCwgJ3RvcCc6IG1lbnVUb3AsICdib3R0b20nOiBtZW51Qm90dG9tICB9XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJhY3Rpb24tbWVudS1oZWFkZXJcIj5cbiAgICAgICAgICAgIDx6ZW4tc2VhcmNoLWJveCBbKHRleHQpXT1cInNlYXJjaFRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICNzZWFyY2hCb3hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGV4dENoYW5nZSk9XCJzZWFyY2hUZXh0Q2hhbmdlZCgpXCI+PC96ZW4tc2VhcmNoLWJveD5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImFjdGlvbi1tZW51LWJvZHkgaXRlbXMtd3JhcHBlclwiXG4gICAgICAgICAgICAgbmdDbGFzcz1cInt7d3JhcHBlckJvZHlDbGFzc319XCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZXJyb3JNZXNzYWdlLmxlbmd0aFwiPlxuICAgICAgICAgICAgICAgIDxsaSAqbmdGb3I9XCJsZXQgaXRlbSBvZiBlcnJvck1lc3NhZ2VcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImVycm9yLW1zZ1wiPnt7aXRlbSB8IHRyYW5zbGF0ZSB9fTwvbGk+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBjb25maWcuaXRlbXNcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWVudS1pdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiaXNNZW51SXNWaXNpYmxlKGl0ZW0pXCI+XG5cbiAgICAgICAgICAgICAgICAgICAgPCEtLSBEaXZpZGVyIGJldHdlZW4gdHdvIGZpbHRlciAtLT5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIml0ZW0udHlwZSA9PT0gJ2RpdmlkZXInXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImZpbHRlci1kaXZpZGVyXCI+PC9wPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8IS0tIEJvb2xlYW4gdG9nZ2xlIC0tPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXRlbS50eXBlID09PSAndG9nZ2xlJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhY3Rpb24taXRlbSB0b2dnbGUtcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2Pnt7aXRlbS50aXRsZSB8IHRyYW5zbGF0ZX19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8emVuLXRvZ2dsZS1zbGlkZSBbKGVuYWJsZWQpXT1cIml0ZW0uZW5hYmxlZFwiPjwvemVuLXRvZ2dsZS1zbGlkZT5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1pdGVtIGV4cGFuZGVyLWl0ZW1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiaXRlbS50eXBlICE9ICd0b2dnbGUnICYmIGl0ZW0udHlwZSAhPSAnZGl2aWRlcicgJiYgIWl0ZW0uZGlzYWJsZUNvbGxhcHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlSXRlbShpdGVtKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJleHBhbmRlci10aXRsZVwiPnt7aXRlbS50aXRsZSB8IHRyYW5zbGF0ZX19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJtYXRlcmlhbC1pY29ucyBleHBhbmQtaWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2FjdGl2ZSc6IGl0ZW0uZXhwYW5kZWR9XCI+ZXhwYW5kX21vcmU8L2k+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY3Rpb24taXRlbSBzZWN0aW9uLXRpdGxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIml0ZW0udHlwZSAhPSAndG9nZ2xlJyAmJiBpdGVtLnR5cGUgIT0gJ2RpdmlkZXInICYmIGl0ZW0uZGlzYWJsZUNvbGxhcHNlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7e2l0ZW0udGl0bGUgfCB0cmFuc2xhdGV9fVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXRlbS5leHBhbmRlZCB8fCBpdGVtLmRpc2FibGVDb2xsYXBzZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBbbmdTd2l0Y2hdPVwiaXRlbS50eXBlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBNdWx0aXNlbGVjdCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCInbXVsdGlzZWxlY3QnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gTGF6eSBsb2FkaW5nIG1vZGUgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpdGVtLmlzTGF6eUxvYWRpbmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGRzSXRlbSBvZiBpdGVtLmZpbHRlcmVkRGF0YVNvdXJjZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYWN0aW9uLWl0ZW0tY2hlY2tib3ggZHMtaXRlbVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5oYXMtYmFkZ2VdPVwiZHNJdGVtLmJhZGdlQmdDb2xvclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx6ZW4tY2hlY2tib3ggWyhjaGVja2VkKV09XCJkc0l0ZW0uY2hlY2tlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaW1hZ2VVcmxdPVwiZHNJdGVtLmltYWdlVXJsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGVja2VkQ2hhbmdlKT1cImNoZWNrQ2hhbmdlZChkc0l0ZW0sIGl0ZW0pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJkc0l0ZW0uYmFkZ2VCZ0NvbG9yID8gJycgOiAoZHNJdGVtLm5hbWU/LnRvU3RyaW5nKCkgfCB0cmFuc2xhdGUpXCI+PC96ZW4tY2hlY2tib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJkc0l0ZW0uYmFkZ2VCZ0NvbG9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZpbHRlci1pdGVtLWJhZGdlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7J2JhY2tncm91bmQnOiBkc0l0ZW0uYmFkZ2VCZ0NvbG9yLCAnY29sb3InOiBkc0l0ZW0uYmFkZ2VDb2xvcn1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZHNJdGVtLm5hbWU/LnRvU3RyaW5nKCkgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpdGVtLmNhbkxvYWRNb3JlICYmICFpdGVtLmlzTG9hZGluZ05vd1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYWN0aW9uLWl0ZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJsb2FkTW9yZShpdGVtLCBmYWxzZSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidXR0b24tc3Ryb2tlZCBmdWxsLXdpZHRoXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7J0xvYWQgTW9yZScgfCB0cmFuc2xhdGV9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXRlbS5pc0xvYWRpbmdOb3dcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImxvYWRlci1tb3JlLXNwaW5uZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8emVuLXNwaW5uZXIgc2l6ZT1cInNtYWxsXCI+PC96ZW4tc3Bpbm5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWl0ZW0uaXNMYXp5TG9hZGluZyAmJiAhaGFzVHJlZURhdGEoaXRlbSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY3Rpb24taXRlbS1jaGVja2JveCBkcy1pdGVtIHNlbGVjdC1hbGxcIiAqbmdJZj1cIiFpdGVtLmhpZGVTZWxlY3RBbGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8emVuLWNoZWNrYm94ICpuZ0lmPVwiaXRlbS5kYXRhU291cmNlLmxlbmd0aCA9PT0gaXRlbS5maWx0ZXJlZERhdGFTb3VyY2UubGVuZ3RoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsoY2hlY2tlZCldPVwiaXRlbS5pc1NlbGVjdGVkQWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpbmRldGVybWluYXRlXT1cImlzSXRlbUFjdGl2ZShpdGVtKSAmJiAhaXRlbS5pc1NlbGVjdGVkQWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCInU2VsZWN0IEFsbCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoZWNrZWRDaGFuZ2UpPVwib25TZWxlY3RBbGwoaXRlbSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3plbi1jaGVja2JveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBkc0l0ZW0gb2YgaXRlbS5maWx0ZXJlZERhdGFTb3VyY2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFjdGlvbi1pdGVtLWNoZWNrYm94IGRzLWl0ZW1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuaGFzLWJhZGdlXT1cImRzSXRlbS5iYWRnZUJnQ29sb3JcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8emVuLWNoZWNrYm94IFsoY2hlY2tlZCldPVwiZHNJdGVtLmNoZWNrZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ltYWdlVXJsXT1cImRzSXRlbS5pbWFnZVVybFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hlY2tlZENoYW5nZSk9XCJjaGVja0NoYW5nZWQoZHNJdGVtLCBpdGVtKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiZHNJdGVtLmJhZGdlQmdDb2xvciA/ICcnIDogKGRzSXRlbS5uYW1lPy50b1N0cmluZygpIHwgdHJhbnNsYXRlKVwiPjwvemVuLWNoZWNrYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZHNJdGVtLmJhZGdlQmdDb2xvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmaWx0ZXItaXRlbS1iYWRnZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieydiYWNrZ3JvdW5kJzogZHNJdGVtLmJhZGdlQmdDb2xvciwgJ2NvbG9yJzogZHNJdGVtLmJhZGdlQ29sb3J9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGRzSXRlbS5uYW1lPy50b1N0cmluZygpIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gVHJlZSB2aWV3IG1vZGUgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx6ZW4tZ3JvdXBzICpuZ0lmPVwiIWl0ZW0uaXNMYXp5TG9hZGluZyAmJiBoYXNUcmVlRGF0YShpdGVtKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkYXRhU291cmNlXT1cIml0ZW0uZGF0YVNvdXJjZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmaWx0ZXJlZERhdGFTb3VyY2VdPVwiaXRlbS5maWx0ZXJlZERhdGFTb3VyY2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaGlkZVNlbGVjdEFsbF09XCJpdGVtLmhpZGVTZWxlY3RBbGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaW5saW5lXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaGlkZVNlYXJjaF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhpc1NlbGVjdGVkQWxsKV09XCJpdGVtLmlzU2VsZWN0ZWRBbGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hlY2tlZENoYW5nZSk9XCJjaGVja0NoYW5nZWQoJGV2ZW50LCBpdGVtKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3plbi1ncm91cHM+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIERhdGUgcmFuZ2UgcGlja2VyIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cIidkYXRlUmFuZ2UnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gIE9wdGlvbnMgZGF0ZSByYW5nZSB2aWV3ICAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIml0ZW0uZGF0ZVJhbmdlT3B0aW9ucz8ubGVuZ3RoXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgaXRlbS5kYXRlUmFuZ2VPcHRpb25zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFjdGlvbi1pdGVtLXJhZGlvIGRzLWl0ZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHplbi1yYWRpbyBbdmFsdWVdPVwib3B0aW9uLm5hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJvcHRpb24ubmFtZSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25hbWVdPVwiaXRlbS5rZXlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxlY3RlZF09XCJzZWxlY3RlZERhdGVSYW5nZU9wdGlvbnNbaXRlbS5rZXldID09PSBvcHRpb24ubmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJhZGlvQ2hhbmdlKT1cImhhbmRsZURhdGVSYW5nZU9wdGlvbkNsaWNrKGl0ZW0sIG9wdGlvbilcIj48L3plbi1yYWRpbz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFjdGlvbi1pdGVtLXJhZGlvIGRzLWl0ZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8emVuLXJhZGlvIFt2YWx1ZV09XCInQ3VzdG9tJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiJ0N1c3RvbScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25hbWVdPVwiaXRlbS5rZXlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NlbGVjdGVkXT1cInNlbGVjdGVkRGF0ZVJhbmdlT3B0aW9uc1tpdGVtLmtleV0gPT09ICdDdXN0b20nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyYWRpb0NoYW5nZSk9XCJoYW5kbGVDdXN0b21EYXRlUmFuZ2VDbGljayhpdGVtKVwiPjwvemVuLXJhZGlvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2VsZWN0ZWREYXRlUmFuZ2VPcHRpb25zW2l0ZW0ua2V5XSA9PT0gJ0N1c3RvbSdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHMtaXRlbSBmaWx0ZXItcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsYmxcIj57eydGcm9tJyB8IHRyYW5zbGF0ZX19OjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8emVuLWRhdGVwaWNrZXIgY2xhc3M9XCJ3aWR0aC1mdWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsoZGF0ZSldPVwiaXRlbS5kYXRlUmFuZ2Uuc3RhcnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Nob3dUaW1lXT1cIml0ZW0uc2hvd1RpbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3lQb3NpdGlvbl09XCJpdGVtLmNvbmZpZz8ueVBvc2l0aW9uID8/IGRhdGVwaWNrZXJQb3NpdGlvbi5BVVRPXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwYXJlbnRDb250YWluZXJdPVwibWFpbkNvbXBvbmVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3plbi1kYXRlcGlja2VyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcy1pdGVtIGZpbHRlci1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxibFwiPnt7J1RvJyB8IHRyYW5zbGF0ZX19OjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8emVuLWRhdGVwaWNrZXIgY2xhc3M9XCJ3aWR0aC1mdWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsoZGF0ZSldPVwiaXRlbS5kYXRlUmFuZ2UuZW5kXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93VGltZV09XCJpdGVtLnNob3dUaW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt5UG9zaXRpb25dPVwiaXRlbS5jb25maWc/LnlQb3NpdGlvbiA/PyBkYXRlcGlja2VyUG9zaXRpb24uQVVUT1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGF0ZUNoYW5nZSk9XCJoYW5kbGVFbmREYXRlQ2hhbmdlKGl0ZW0pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwYXJlbnRDb250YWluZXJdPVwibWFpbkNvbXBvbmVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3plbi1kYXRlcGlja2VyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gIERlZmF1bHQgZGF0ZSByYW5nZSB2aWV3ICAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpdGVtLmRhdGVSYW5nZU9wdGlvbnM/Lmxlbmd0aFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRzLWl0ZW0gZmlsdGVyLXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsYmxcIj57eydGcm9tJyB8IHRyYW5zbGF0ZX19OjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx6ZW4tZGF0ZXBpY2tlciBjbGFzcz1cIndpZHRoLWZ1bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKGRhdGUpXT1cIml0ZW0uZGF0ZVJhbmdlLnN0YXJ0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Nob3dUaW1lXT1cIml0ZW0uc2hvd1RpbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbeVBvc2l0aW9uXT1cIml0ZW0uY29uZmlnPy55UG9zaXRpb24gPz8gZGF0ZXBpY2tlclBvc2l0aW9uLkFVVE9cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGFyZW50Q29udGFpbmVyXT1cIm1haW5Db21wb25lbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3plbi1kYXRlcGlja2VyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHMtaXRlbSBmaWx0ZXItcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxibFwiPnt7J1RvJyB8IHRyYW5zbGF0ZX19OjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx6ZW4tZGF0ZXBpY2tlciBjbGFzcz1cIndpZHRoLWZ1bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKGRhdGUpXT1cIml0ZW0uZGF0ZVJhbmdlLmVuZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93VGltZV09XCJpdGVtLnNob3dUaW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3lQb3NpdGlvbl09XCJpdGVtLmNvbmZpZz8ueVBvc2l0aW9uID8/IGRhdGVwaWNrZXJQb3NpdGlvbi5BVVRPXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRhdGVDaGFuZ2UpPVwiaGFuZGxlRW5kRGF0ZUNoYW5nZShpdGVtKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwYXJlbnRDb250YWluZXJdPVwibWFpbkNvbXBvbmVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvemVuLWRhdGVwaWNrZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIERhdGUgcGlja2VyIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cIidkYXRlJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHMtaXRlbSBmaWx0ZXItcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGJsXCI+e3snRGF0ZScgfCB0cmFuc2xhdGV9fTo8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx6ZW4tZGF0ZXBpY2tlciBjbGFzcz1cIndpZHRoLWZ1bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsoZGF0ZSldPVwiaXRlbS5kYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2hvd1RpbWVdPVwiaXRlbS5zaG93VGltZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BhcmVudENvbnRhaW5lcl09XCJtYWluQ29tcG9uZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3plbi1kYXRlcGlja2VyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gTnVtYmVyIHJhbmdlIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cIidudW1iZXJSYW5nZSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmaWx0ZXItcm93IG51bWJlci1yYW5nZS1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsYmxcIj57eydNaW4nIHwgdHJhbnNsYXRlfX06PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJtYXRlcmlhbC1pbnB1dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJpdGVtLm51bWJlclJhbmdlLmZyb21cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsYmxcIj57eydNYXgnIHwgdHJhbnNsYXRlfX06PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJtYXRlcmlhbC1pbnB1dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJpdGVtLm51bWJlclJhbmdlLnRvXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFJhZGlvIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cIidyYWRpbydcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIGl0ZW0ucmFkaW9PcHRpb25zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFjdGlvbi1pdGVtLXJhZGlvIGRzLWl0ZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx6ZW4tcmFkaW8gW3ZhbHVlXT1cIm9wdGlvbi5pZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJvcHRpb24ubmFtZSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cIml0ZW0ua2V5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ltYWdlVXJsXT1cIm9wdGlvbi5pbWFnZVVybFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxlY3RlZF09XCJvcHRpb24uc2VsZWN0ZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmFkaW9DaGFuZ2UpPVwicmFkaW9DaGFuZ2VkKCRldmVudCwgaXRlbSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwib3B0aW9uLmRpc2FibGVkXCI+PC96ZW4tcmFkaW8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwic2hvd05vRmlsdGVyUmVzdWx0XCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwibm8taXRlbVwiPnt7J05vIFJlc3VsdHMgRm91bmQnIHwgdHJhbnNsYXRlfX0uLjwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImFjdGlvbi1tZW51LWZvb3RlciBmaWx0ZXItZm9vdGVyXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNlbGVjdGVkLWNvdW50XCIgKm5nSWY9XCJoYXNNdWx0aXNlbGVjdEl0ZW1zXCI+e3sgc2VsZWN0ZWRDb3VudCB9fSB7eydTZWxlY3RlZCcgfCB0cmFuc2xhdGV9fTwvc3Bhbj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWx0ZXItZm9vdGVyLWFjdGlvbnNcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJyZXNldCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmlsdGVyLWJ0bi1jbGVhclwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuaGFzLXNlbGVjdGlvbl09XCJzZWxlY3RlZENvdW50ID4gMCAmJiBoYXNNdWx0aXNlbGVjdEl0ZW1zXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7J0NsZWFyIEZpbHRlcicgfCB0cmFuc2xhdGV9fVxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cImFwcGx5KClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmaWx0ZXItYnRuLWFwcGx5XCI+XG4gICAgICAgICAgICAgICAgICAgIHt7J0FwcGx5JyB8IHRyYW5zbGF0ZX19XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuIl19
794
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiemVuZHUtZmlsdGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLXplbmR1aXQvc3JjL2xpYi9maWx0ZXIvemVuZHUtZmlsdGVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLXplbmR1aXQvc3JjL2xpYi9maWx0ZXIvemVuZHUtZmlsdGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBRVQsWUFBWSxFQUNaLFlBQVksRUFDWixLQUFLLEVBRUwsTUFBTSxFQUVOLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQU92QixPQUFPLE1BQU0sTUFBTSxlQUFlLENBQUM7QUFDbkMsT0FBTyxNQUFNLE1BQU0sZUFBZSxDQUFDO0FBRW5DLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDL0IsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7Ozs7Ozs7Ozs7Ozs7O0FBUy9ELE1BQU0sT0FBTyxvQkFBb0I7SUF5RC9CLFlBQW1CLFFBQW1CO1FBQW5CLGFBQVEsR0FBUixRQUFRLENBQVc7UUF4RDdCLFdBQU0sR0FBa0IsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQUM7UUFJdEMsYUFBUSxHQUFHLE9BQU8sQ0FBQztRQUVuQixrQkFBYSxHQUF3QixPQUFPLENBQUM7UUFFNUMsaUJBQVksR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO1FBRTNDLGNBQVMsR0FBRyxLQUFLLENBQUM7UUFFakIsb0JBQWUsR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDO1FBRS9DLGtCQUFhLEdBQUcsS0FBSyxDQUFDO1FBWXRCLG1CQUFjLEdBQXlCLE9BQU8sQ0FBQztRQUVqRCxlQUFVLEdBQUcsRUFBRSxDQUFDO1FBRWhCLGNBQVMsR0FBRyxLQUFLLENBQUM7UUFFakIsc0JBQWlCLEdB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O2FBQzFEO1NBQ0Y7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7O2tIQXYyQlUsb0JBQW9CO3NHQUFwQixvQkFBb0IsdzNCQzlCakMsbXFoQkE0UUE7NEZEOU9hLG9CQUFvQjtrQkFMaEMsU0FBUzsrQkFDRSxZQUFZO2dHQUtiLE1BQU07c0JBQWQsS0FBSztnQkFFRyxNQUFNO3NCQUFkLEtBQUs7Z0JBRUcsUUFBUTtzQkFBaEIsS0FBSztnQkFFRyxhQUFhO3NCQUFyQixLQUFLO2dCQUVJLFlBQVk7c0JBQXJCLE1BQU07Z0JBRUUsU0FBUztzQkFBakIsS0FBSztnQkFFSSxlQUFlO3NCQUF4QixNQUFNO2dCQUVFLGFBQWE7c0JBQXJCLEtBQUs7Z0JBRUcsUUFBUTtzQkFBaEIsS0FBSztnQkFFRyxLQUFLO3NCQUFiLEtBQUs7Z0JBRUcsV0FBVztzQkFBbkIsS0FBSztnQkFFRyxhQUFhO3NCQUFyQixLQUFLO2dCQUVHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFFRyxjQUFjO3NCQUF0QixLQUFLO2dCQTBCcUMsU0FBUztzQkFBbkQsU0FBUzt1QkFBQyxXQUFXLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUd6QyxpQkFBaUI7c0JBRGhCLFNBQVM7dUJBQUMsZUFBZSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFnRDdDLGVBQWU7c0JBRGQsWUFBWTt1QkFBQyxrQkFBa0IsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkF1QjVDLGtCQUFrQjtzQkFEakIsWUFBWTt1QkFBQyxlQUFlLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBVXpDLFlBQVk7c0JBRFgsWUFBWTt1QkFBQyxlQUFlLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBVXpDLGVBQWU7c0JBRGQsWUFBWTt1QkFBQyxnQkFBZ0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBIb3N0TGlzdGVuZXIsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIERhdGFTb3VyY2UsXG4gIEZpbHRlcnNDb25maWcsXG4gIEZpbHRlcnNDb25maWdJdGVtLFxuICBNdWx0aVNlbGVjdEl0ZW0sXG59IGZyb20gJy4vZmlsdGVyc0NvbmZpZyc7XG5pbXBvcnQgdW5pcUJ5IGZyb20gJ2xvZGFzaC51bmlxYnknO1xuaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQvbW9tZW50JztcbmltcG9ydCB7IFplbmR1U2VhcmNoQm94Q29tcG9uZW50IH0gZnJvbSAnLi4vc2VhcmNoLWJveC96ZW5kdS1zZWFyY2gtYm94LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBVdGlsIH0gZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBEQVRFUElDS0VSX1BPU0lUSU9OIH0gZnJvbSAnLi4vZGF0ZXBpY2tlci9kYXRlcGlja2VyJztcbmltcG9ydCB7IERhdGVSYW5nZSB9IGZyb20gJy4vZGF0ZVJhbmdlJztcbmltcG9ydCB7IFJlbmRlcmVyMiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd6ZW4tZmlsdGVyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3plbmR1LWZpbHRlci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3plbmR1LWZpbHRlci5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBaZW5kdUZpbHRlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XG4gIEBJbnB1dCgpIGNvbmZpZzogRmlsdGVyc0NvbmZpZyA9IHsgaXRlbXM6IFtdIH07XG5cbiAgQElucHV0KCkgZmlsdGVyOiBvYmplY3Q7XG5cbiAgQElucHV0KCkgcG9zaXRpb24gPSAncmlnaHQnO1xuXG4gIEBJbnB1dCgpIHJlc2V0QmVoYXZpb3I6ICdzZXRfYWxsJyB8ICdjbGVhcicgPSAnY2xlYXInO1xuXG4gIEBPdXRwdXQoKSBmaWx0ZXJDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPG9iamVjdD4oKTtcblxuICBASW5wdXQoKSBpc1Zpc2libGUgPSBmYWxzZTtcblxuICBAT3V0cHV0KCkgaXNWaXNpYmxlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gIEBJbnB1dCgpIGN1c3RvbVRyaWdnZXIgPSBmYWxzZTtcblxuICBASW5wdXQoKSBpbWFnZVVybDogc3RyaW5nO1xuXG4gIEBJbnB1dCgpIGxhYmVsOiBzdHJpbmc7XG5cbiAgQElucHV0KCkgc2hvd09wdGlvbnM6IGJvb2xlYW47XG5cbiAgQElucHV0KCkgY3VzdG9tT3B0aW9uczogc3RyaW5nO1xuXG4gIEBJbnB1dCgpIHdyYXBwZXJCb2R5Q2xhc3M6IHN0cmluZztcblxuICBASW5wdXQoKSBjdXN0b21Qb3NpdGlvbjogJ2ZpeGVkJyB8ICdhYnNvbHV0ZScgPSAnZml4ZWQnO1xuXG4gIHB1YmxpYyBzZWFyY2hUZXh0ID0gJyc7XG5cbiAgcHVibGljIGlzQXBwbGllZCA9IGZhbHNlO1xuXG4gIHByaXZhdGUgbGFzdEFwcGxpZWRGaWx0ZXI6IGFueSA9IHt9O1xuXG4gIHByaXZhdGUgcmVzZXRlZEZpbHRlcjogYW55O1xuXG4gIHB1YmxpYyBtZW51TGVmdCA9ICcwcHgnO1xuXG4gIHB1YmxpYyBtZW51UmlnaHQgPSAnMHB4JztcblxuICBwdWJsaWMgbWVudVRvcCA9ICcwcHgnO1xuXG4gIHB1YmxpYyBtZW51Qm90dG9tID0gJzBweCc7XG5cbiAgcHVibGljIHNob3dOb0ZpbHRlclJlc3VsdDogYm9vbGVhbjtcblxuICBwdWJsaWMgZXJyb3JNZXNzYWdlOiBzdHJpbmdbXSA9IFtdO1xuXG4gIHB1YmxpYyBkYXRlcGlja2VyUG9zaXRpb24gPSBEQVRFUElDS0VSX1BPU0lUSU9OO1xuXG4gIHB1YmxpYyBzZWxlY3RlZERhdGVSYW5nZU9wdGlvbnM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7fTtcblxuICBAVmlld0NoaWxkKCdzZWFyY2hCb3gnLCB7IHN0YXRpYzogZmFsc2UgfSkgc2VhcmNoQm94OiBaZW5kdVNlYXJjaEJveENvbXBvbmVudDtcblxuICBAVmlld0NoaWxkKCdtYWluQ29tcG9uZW50JywgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIF9jb21wb25lbnRFbGVtZW50OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcbiAgY29uc3RydWN0b3IocHVibGljIHJlbmRlcmVyOiBSZW5kZXJlcjIpIHt9XG5cbiAgcHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IGFueSk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzLmNvbmZpZyAmJiBjaGFuZ2VzLmNvbmZpZy5jdXJyZW50VmFsdWUpIHtcbiAgICAgIC8vIGluaXQgdmFsdWVzXG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy5jb25maWcuaXRlbXMpIHtcbiAgICAgICAgaWYgKGl0ZW0udHlwZSA9PT0gJ211bHRpc2VsZWN0Jykge1xuICAgICAgICAgIGl0ZW0uZGF0YVNvdXJjZSA9IGl0ZW0uZGF0YVNvdXJjZVxuICAgICAgICAgICAgPyB0aGlzLmV4dHJhY3RVbmlxdWVEYXRhU291cmNlKGl0ZW0uZGF0YVNvdXJjZSlcbiAgICAgICAgICAgIDogW107XG4gICAgICAgIH0gZWxzZSBpZiAoaXRlbS50eXBlID09PSAnZGF0ZVJhbmdlJyAmJiAhaXRlbS5kYXRlUmFuZ2UpIHtcbiAgICAgICAgICBpdGVtLmRhdGVSYW5nZSA9IHsgc3RhcnQ6IG51bGwsIGVuZDogbnVsbCB9O1xuXG4gICAgICAgICAgLy8gaW5pdCBkYXRlIHJhbmdlIG9wdGlvbnNcbiAgICAgICAgICBpZiAoaXRlbS5zaG93RGF0ZVJhbmdlT3B0aW9ucyAmJiAhaXRlbS5kYXRlUmFuZ2VPcHRpb25zPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGl0ZW0uZGF0ZVJhbmdlT3B0aW9ucyA9IHRoaXMuZ2V0RGVmYXVsdERhdGVSYW5nZU9wdGlvbnMoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoaXRlbS50eXBlID09PSAnbnVtYmVyUmFuZ2UnICYmICFpdGVtLm51bWJlclJhbmdlKSB7XG4gICAgICAgICAgaXRlbS5udW1iZXJSYW5nZSA9IHt9O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBpdGVtLnNob3dUaW1lICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICBpdGVtLnNob3dUaW1lID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLmZpbHRlckl0ZW1zKCk7XG5cbiAgICAgIHRoaXMucmVzZXRlZEZpbHRlciA9IHRoaXMuZ2V0RmlsdGVyT2JqZWN0KCk7XG4gICAgICB0aGlzLmZpbHRlciA9IHRoaXMuZ2V0RmlsdGVyT2JqZWN0KCk7XG4gICAgICB0aGlzLmxhc3RBcHBsaWVkRmlsdGVyID0gVXRpbC5jbG9uZSh0aGlzLmZpbHRlcik7XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZXMuZmlsdGVyICYmIGNoYW5nZXMuZmlsdGVyLmN1cnJlbnRWYWx1ZSkge1xuICAgICAgdGhpcy5sYXN0QXBwbGllZEZpbHRlciA9IFV0aWwuY2xvbmUoY2hhbmdlcy5maWx0ZXIuY3VycmVudFZhbHVlKTtcblxuICAgICAgdGhpcy51cGRhdGVBcHBsaWVkU3RhdGUoKTtcbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlcy5pc1Zpc2libGUgJiYgY2hhbmdlcy5pc1Zpc2libGUuY3VycmVudFZhbHVlKSB7XG4gICAgICB0aGlzLnVwZGF0ZVBsYWNlbWVudCh0aGlzLmN1c3RvbVBvc2l0aW9uKTtcbiAgICAgIHRoaXMuZm9jdXNTZWFyY2hCb3goKTtcbiAgICB9XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6bW91c2Vkb3duJywgWyckZXZlbnQnXSlcbiAgb3V0c2lkZUhhbmRsaW5nKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgaWYgKCF0aGlzLmlzVmlzaWJsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICBpZiAoIWRvY3VtZW50LmJvZHkuY29udGFpbnModGFyZ2V0KSkge1xuICAgICAgLy8gZWxlbWVudCBub3QgaW4gdGhlIERPTVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5fY29tcG9uZW50RWxlbWVudC5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKHRhcmdldCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBoaWRlIHRoZSBtZW51IGZvciBvdXRzaWRlIGNsaWNrXG4gICAgdGhpcy5oaWRlKCk7XG5cbiAgICAvLyByZXN0b3JlIHZhbHVlc1xuICAgIHRoaXMucmVzdG9yZVByZXZpb3VzQXBwbGllZCgpO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OnJlc2l6ZScsIFsnJGV2ZW50J10pXG4gIHdpbmRvd1NpemVIYW5kbGluZygpIHtcbiAgICBpZiAoIXRoaXMuaXNWaXNpYmxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy51cGRhdGVQbGFjZW1lbnQodGhpcy5jdXN0b21Qb3NpdGlvbik7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6c2Nyb2xsJywgWyckZXZlbnQnXSlcbiAgd2luZG93U2Nyb2xsKCkge1xuICAgIGlmICghdGhpcy5pc1Zpc2libGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnVwZGF0ZVBsYWNlbWVudCh0aGlzLmN1c3RvbVBvc2l0aW9uKTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzprZXlkb3duJywgWyckZXZlbnQnXSlcbiAgb25XaW5kb3dLZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgaWYgKCF0aGlzLmlzVmlzaWJsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIGV2ZW50LmtleSA9PT0gJ0Fycm93VXAnIHx8XG4gICAgICBldmVudC5rZXkgPT09ICdBcnJvd0Rvd24nIHx8XG4gICAgICBldmVudC5rZXkgPT09ICdQYWdlVXAnIHx8XG4gICAgICBldmVudC5rZXkgPT09ICdQYWdlRG93bicgfHxcbiAgICAgIGV2ZW50LmtleSA9PT0gJ0hvbWUnIHx8XG4gICAgICBldmVudC5rZXkgPT09ICdFbmQnXG4gICAgKSB7XG4gICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICBpZiAoIWRvY3VtZW50LmJvZHkuY29udGFpbnModGFyZ2V0KSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5fY29tcG9uZW50RWxlbWVudC5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKHRhcmdldCkgJiZcbiAgICAgICAgIXRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoJ2J1dHRvbi1zdHJva2VkJylcbiAgICAgICkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLmhpZGUoKTtcbiAgICAgIHRoaXMucmVzdG9yZVByZXZpb3VzQXBwbGllZCgpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBmb2N1c1NlYXJjaEJveCgpIHtcbiAgICB0aGlzLnNlYXJjaEJveC5kb0ZvY3VzKCk7XG4gIH1cblxuICBwdWJsaWMgaXNNZW51SXNWaXNpYmxlKGl0ZW06IEZpbHRlcnNDb25maWdJdGVtKSB7XG4gICAgaWYgKGl0ZW0uaXNMYXp5TG9hZGluZykge1xuICAgICAgaWYgKGl0ZW0uaXNMb2FkaW5nTm93IHx8IGl0ZW0uY2FuTG9hZE1vcmUgIT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuc2VhcmNoVGV4dCkge1xuICAgICAgICByZXR1cm4gaXRlbS5maWx0ZXJlZERhdGFTb3VyY2U/Lmxlbmd0aCA+IDA7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoaXRlbS5maWx0ZXJlZERhdGFTb3VyY2UgJiYgdGhpcy5zZWFyY2hUZXh0KSB7XG4gICAgICBpZiAoIWl0ZW0uZmlsdGVyZWREYXRhU291cmNlLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwcml2YXRlIGV4dHJhY3RVbmlxdWVEYXRhU291cmNlKFxuICAgIGFycmF5OiB7XG4gICAgICBpZDogc3RyaW5nIHwgbnVtYmVyO1xuICAgICAgbmFtZTogc3RyaW5nIHwgbnVtYmVyO1xuICAgIH1bXVxuICApOiBNdWx0aVNlbGVjdEl0ZW1bXSB7XG4gICAgY29uc3QgaXRlbXMgPSBhcnJheS5maWx0ZXIoKGVsKSA9PiB7XG4gICAgICByZXR1cm4gQm9vbGVhbihcbiAgICAgICAgdHlwZW9mIGVsLmlkID09PSAnbnVtYmVyJ1xuICAgICAgICAgID8gdHlwZW9mIGVsLmlkICE9PSB1bmRlZmluZWRcbiAgICAgICAgICA6IGVsLmlkICYmIHR5cGVvZiBlbC5uYW1lID09PSAnbnVtYmVyJ1xuICAgICAgICAgID8gdHlwZW9mIGVsLm5hbWUgIT09IHVuZGVmaW5lZFxuICAgICAgICAgIDogZWwubmFtZVxuICAgICAgKTtcbiAgICB9KTtcbiAgICBjb25zdCB1bmlxSXRlbXMgPSB1bmlxQnkoaXRlbXMsIChlbCkgPT4gZWwuaWQpO1xuICAgIC8vIGFkZCBpbmRleCB0byBlYWNoIHVuaXFJdGVtc1xuICAgIHVuaXFJdGVtcy5mb3JFYWNoKFxuICAgICAgKGVsOiBNdWx0aVNlbGVjdEl0ZW0sIGluZGV4OiBudW1iZXIpID0+IChlbC5pbmRleCA9IGluZGV4KVxuICAgICk7XG4gICAgcmV0dXJuIHVuaXFJdGVtcztcbiAgfVxuXG4gIHB1YmxpYyBvblNlbGVjdEFsbChpdGVtOiBGaWx0ZXJzQ29uZmlnSXRlbSkge1xuICAgIGl0ZW0uZGF0YVNvdXJjZS5mb3JFYWNoKChkKSA9PiAoZC5jaGVja2VkID0gaXRlbS5pc1NlbGVjdGVkQWxsKSk7XG4gIH1cblxuICBwdWJsaWMgaXNJdGVtQWN0aXZlKGl0ZW06IEZpbHRlcnNDb25maWdJdGVtKTogYm9vbGVhbiB7XG4gICAgaWYgKGl0ZW0udHlwZSA9PT0gJ211bHRpc2VsZWN0Jykge1xuICAgICAgY29uc3QgY2hlY2tlZEl0ZW1zID0gaXRlbS5kYXRhU291cmNlLmZpbHRlcigoZWwpID0+IGVsLmNoZWNrZWQpO1xuICAgICAgaXRlbS5pc1NlbGVjdGVkQWxsID0gY2hlY2tlZEl0ZW1zLmxlbmd0aCA9PT0gaXRlbS5kYXRhU291cmNlLmxlbmd0aDtcbiAgICAgIHJldHVybiBjaGVja2VkSXRlbXMubGVuZ3RoID4gMDtcbiAgICB9IGVsc2UgaWYgKGl0ZW0udHlwZSA9PT0gJ3JhZGlvJykge1xuICAgICAgcmV0dXJuIGl0ZW0ucmFkaW9PcHRpb25zLnNvbWUoKHJvKSA9PiByby5zZWxlY3RlZCk7XG4gICAgfSBlbHNlIGlmIChpdGVtLnR5cGUgPT09ICdudW1iZXJSYW5nZScpIHtcbiAgICAgIHJldHVybiBCb29sZWFuKGl0ZW0ubnVtYmVyUmFuZ2UuZnJvbSB8fCBpdGVtLm51bWJlclJhbmdlLnRvKTtcbiAgICB9IGVsc2UgaWYgKGl0ZW0udHlwZSA9PT0gJ2RhdGVSYW5nZScpIHtcbiAgICAgIHJldHVybiBCb29sZWFuKGl0ZW0uZGF0ZVJhbmdlLnN0YXJ0IHx8IGl0ZW0uZGF0ZVJhbmdlLmVuZCk7XG4gICAgfSBlbHNlIGlmIChpdGVtLnR5cGUgPT09ICdkYXRlJykge1xuICAgICAgcmV0dXJuIEJvb2xlYW4oaXRlbS5kYXRlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzZWFyY2hUZXh0Q2hhbmdlZCgpIHtcbiAgICAvLyBydW4gdGhlIGxhenkgbG9hZGluZ1xuICAgIC8vIHRoZSBmaWx0ZXJJdGVtcyBjYWxsZWQgZnJvbSBvbkNoYW5nZXMsIHNvIGNhbGwgbGF6eSBsb2FkaW5nIG9ubHkgb24gc2VhcmNoIGNoYW5nZVxuICAgIHRoaXMucmVzZXRMYXp5TG9hZGluZ1NvdXJjZXMoZmFsc2UpO1xuXG4gICAgdGhpcy5maWx0ZXJJdGVtcygpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZXNldExhenlMb2FkaW5nU291cmNlcyhzaG93U2VsZWN0ZWRPblRvcDogYm9vbGVhbikge1xuICAgIGNvbnN0IHJlcXVlc3RzID0gW107XG4gICAgZm9yIChjb25zdCBjb25maWdJdGVtIG9mIHRoaXMuY29uZmlnLml0ZW1zKSB7XG4gICAgICBpZiAoY29uZmlnSXRlbS5pc0xhenlMb2FkaW5nKSB7XG4gICAgICAgIGNvbmZpZ0l0ZW0uY2FuTG9hZE1vcmUgPSB0cnVlO1xuICAgICAgICBjb25maWdJdGVtLmZpbHRlcmVkRGF0YVNvdXJjZSA9IFtdO1xuICAgICAgICByZXF1ZXN0cy5wdXNoKHRoaXMubG9hZE1vcmUoY29uZmlnSXRlbSwgc2hvd1NlbGVjdGVkT25Ub3ApKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhd2FpdCBQcm9taXNlLmFsbChyZXF1ZXN0cyk7XG5cbiAgICAvLyBmaWx0ZXIgbm9uLWxhenkgbG9hZGluZyBpdGVtc1xuICAgIHRoaXMuZmlsdGVySXRlbXMoKTtcbiAgfVxuXG4gIHByaXZhdGUgZmlsdGVySXRlbXMoKSB7XG4gICAgbGV0IGhhc0RhdGEgPSBmYWxzZTtcblxuICAgIGZvciAoY29uc3QgY29uZmlnSXRlbSBvZiB0aGlzLmNvbmZpZy5pdGVtcykge1xuICAgICAgaWYgKGNvbmZpZ0l0ZW0udHlwZSA9PT0gJ211bHRpc2VsZWN0Jykge1xuICAgICAgICBpZiAoY29uZmlnSXRlbS5pc0xhenlMb2FkaW5nKSB7XG4gICAgICAgICAgaWYgKGNvbmZpZ0l0ZW0uaXNMb2FkaW5nTm93KSB7XG4gICAgICAgICAgICAvLyBtYXJrIGFzIGRhdGEgYXZhaWxhYmxlIGluIGxvYWRpbmcgc3RhdGVcbiAgICAgICAgICAgIGhhc0RhdGEgPSB0cnVlO1xuICAgICAgICAgIH0gZWxzZSBpZiAoY29uZmlnSXRlbS5maWx0ZXJlZERhdGFTb3VyY2U/Lmxlbmd0aCkge1xuICAgICAgICAgICAgaGFzRGF0YSA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGlzVHJlZSA9IHRoaXMuaGFzVHJlZURhdGEoY29uZmlnSXRlbSk7XG4gICAgICAgICAgaWYgKGlzVHJlZSAmJiB0aGlzLnNlYXJjaFRleHQpIHtcbiAgICAgICAgICAgIC8vIEJ1aWxkIGEgbG9jYWwgbG9va3VwIG1hcCBmb3IgYW5jZXN0b3IgdHJhdmVyc2FsXG4gICAgICAgICAgICBjb25zdCBsb2NhbE1hcCA9IG5ldyBNYXA8c3RyaW5nIHwgbnVtYmVyLCBEYXRhU291cmNlPigpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBlbCBvZiBjb25maWdJdGVtLmRhdGFTb3VyY2UpIHtcbiAgICAgICAgICAgICAgbG9jYWxNYXAuc2V0KGVsLmlkLCBlbCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEZvciB0cmVlIGRhdGEsIGluY2x1ZGUgbWF0Y2hpbmcgaXRlbXMgYW5kIHRoZWlyIGFuY2VzdG9yc1xuICAgICAgICAgICAgY29uc3QgbWF0Y2hpbmdJZHMgPSBuZXcgU2V0PHN0cmluZyB8IG51bWJlcj4oKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZWwgb2YgY29uZmlnSXRlbS5kYXRhU291cmNlKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHByZXBhcmVkTmFtZSA9XG4gICAgICAgICAgICAgICAgdHlwZW9mIGVsLm5hbWUgPT09ICdudW1iZXInID8gZWwubmFtZS50b1N0cmluZygpIDogZWwubmFtZTtcbiAgICAgICAgICAgICAgaWYgKHByZXBhcmVkTmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHRoaXMuc2VhcmNoVGV4dC50b0xvd2VyQ2FzZSgpKSkge1xuICAgICAgICAgICAgICAgIG1hdGNoaW5nSWRzLmFkZChlbC5pZCk7XG4gICAgICAgICAgICAgICAgLy8gQWRkIGFsbCBhbmNlc3RvcnNcbiAgICAgICAgICAgICAgICBsZXQgY3VycmVudCA9IGVsO1xuICAgICAgICAgICAgICAgIHdoaWxlIChjdXJyZW50LnBhcmVudElkKSB7XG4gICAgICAgICAgICAgICAgICBtYXRjaGluZ0lkcy5hZGQoY3VycmVudC5wYXJlbnRJZCk7XG4gICAgICAgICAgICAgICAgICBjdXJyZW50ID0gbG9jYWxNYXAuZ2V0KGN1cnJlbnQucGFyZW50SWQpO1xuICAgICAgICAgICAgICAgICAgaWYgKCFjdXJyZW50KSBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbmZpZ0l0ZW0uZmlsdGVyZWREYXRhU291cmNlID0gY29uZmlnSXRlbS5kYXRhU291cmNlLmZpbHRlcihcbiAgICAgICAgICAgICAgKGVsKSA9PiBtYXRjaGluZ0lkcy5oYXMoZWwuaWQpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgLy8gQXV0by1leHBhbmQgcGFyZW50cyB3aGVuIHNlYXJjaGluZ1xuICAgICAgICAgICAgZm9yIChjb25zdCBlbCBvZiBjb25maWdJdGVtLmZpbHRlcmVkRGF0YVNvdXJjZSkge1xuICAgICAgICAgICAgICBpZiAoZWwuY2hpbGRyZW4/Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGVsLmlzT3BlbiA9IHRydWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbmZpZ0l0ZW0uZmlsdGVyZWREYXRhU291cmNlID0gdGhpcy5zb3J0VHJlZU9yZGVyKGNvbmZpZ0l0ZW0uZmlsdGVyZWREYXRhU291cmNlLCBsb2NhbE1hcCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbmZpZ0l0ZW0uZmlsdGVyZWREYXRhU291cmNlID0gY29uZmlnSXRlbS5kYXRhU291cmNlLmZpbHRlcigoZWwpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgcHJlcGFyZWROYW1lID1cbiAgICAgICAgICAgICAgICB0eXBlb2YgZWwubmFtZSA9PT0gJ251bWJlcicgPyBlbC5uYW1lLnRvU3RyaW5nKCkgOiBlbC5uYW1lO1xuICAgICAgICAgICAgICByZXR1cm4gcHJlcGFyZWROYW1lXG4gICAgICAgICAgICAgICAgLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgICAgICAuaW5jbHVkZXModGhpcy5zZWFyY2hUZXh0LnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoaXNUcmVlKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGxvY2FsTWFwID0gbmV3IE1hcDxzdHJpbmcgfCBudW1iZXIsIERhdGFTb3VyY2U+KCk7XG4gICAgICAgICAgICAgIGZvciAoY29uc3QgZWwgb2YgY29uZmlnSXRlbS5kYXRhU291cmNlKSB7XG4gICAgICAgICAgICAgICAgbG9jYWxNYXAuc2V0KGVsLmlkLCBlbCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29uZmlnSXRlbS5maWx0ZXJlZERhdGFTb3VyY2UgPSB0aGlzLnNvcnRUcmVlT3JkZXIoY29uZmlnSXRlbS5maWx0ZXJlZERhdGFTb3VyY2UsIGxvY2FsTWFwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoY29uZmlnSXRlbS5maWx0ZXJlZERhdGFTb3VyY2UubGVuZ3RoKSB7XG4gICAgICAgICAgICBoYXNEYXRhID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoY29uZmlnSXRlbS50eXBlID09PSAnZGF0ZVJhbmdlJykge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgdGhpcy5zZWFyY2hUZXh0ICYmXG4gICAgICAgICAgIUJvb2xlYW4oY29uZmlnSXRlbS5kYXRlUmFuZ2Uuc3RhcnQgfHwgY29uZmlnSXRlbS5kYXRlUmFuZ2UuZW5kKVxuICAgICAgICApIHtcbiAgICAgICAgICBjb25maWdJdGVtLmZpbHRlcmVkRGF0YVNvdXJjZSA9IFtdO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGNvbmZpZ0l0ZW0udHlwZSA9PT0gJ251bWJlclJhbmdlJykge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgdGhpcy5zZWFyY2hUZXh0ICYmXG4gICAgICAgICAgIUJvb2xlYW4oY29uZmlnSXRlbS5udW1iZXJSYW5nZS5mcm9tIHx8IGNvbmZpZ0l0ZW0ubnVtYmVyUmFuZ2UudG8pXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbmZpZ0l0ZW0uZmlsdGVyZWREYXRhU291cmNlID0gW107XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnNob3dOb0ZpbHRlclJlc3VsdCA9IHRoaXMuc2VhcmNoVGV4dCAmJiAhaGFzRGF0YTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBsb2FkTW9yZShpdGVtOiBGaWx0ZXJzQ29uZmlnSXRlbSwgc2hvd1NlbGVjdGVkT25Ub3A6IGJvb2xlYW4pIHtcbiAgICB0cnkge1xuICAgICAgaXRlbS5pc0xvYWRpbmdOb3cgPSB0cnVlO1xuICAgICAgaWYgKCFpdGVtLmxhenlMb2FkZXIpIHtcbiAgICAgICAgdGhyb3cgYGxvYWRlciBpcyBub3QgYXZhaWxhYmxlYDtcbiAgICAgIH1cbiAgICAgIGlmICghaXRlbS5maWx0ZXJlZERhdGFTb3VyY2UpIHtcbiAgICAgICAgaXRlbS5maWx0ZXJlZERhdGFTb3VyY2UgPSBbXTtcbiAgICAgIH1cblxuICAgICAgLy8gbG9hZCBmaXJzdCAxMCByZWNvcmRzIGZvciB0aGUgdGhlIGZpcnN0IHRpbWVcbiAgICAgIGNvbnN0IGxpbWl0ID0gaXRlbS5maWx0ZXJlZERhdGFTb3VyY2UubGVuZ3RoID09IDAgPyAxMCA6IDEwMDtcbiAgICAgIGNvbnN0IG5ld0l0ZW1zID0gYXdhaXQgaXRlbS5sYXp5TG9hZGVyKFxuICAgICAgICB7IHRleHQ6IHRoaXMuc2VhcmNoVGV4dCB8fCAnJyB9LFxuICAgICAgICBpdGVtLmZpbHRlcmVkRGF0YVNvdXJjZS5sZW5ndGgsXG4gICAgICAgIGxpbWl0XG4gICAgICApO1xuXG4gICAgICBpdGVtLmNhbkxvYWRNb3JlID0gbmV3SXRlbXMubGVuZ3RoID09IGxpbWl0O1xuXG4gICAgICAvLyB0aGUgZmlsdGVyZWREYXRhU291cmNlIGNvbnRhaW5zIHRoZSBpdGVtcyB0aGF0IGlzIHZpc2lsaWJsZSB0byB1c2VyIGF0IHRoZSBjdXJyZW50IG1vbWVudFxuICAgICAgaXRlbS5maWx0ZXJlZERhdGFTb3VyY2UgPSBpdGVtLmZpbHRlcmVkRGF0YVNvdXJjZS5jb25jYXQobmV3SXRlbXMpO1xuXG4gICAgICAvLyB0aGUgZGF0YVNvdXJjZSBjb250YWlucyB0aGUgc2VsZWN0ZWQgaXRlbXNcbiAgICAgIGNvbnN0IGNoZWNrZWRJZHMgPSBpdGVtLmRhdGFTb3VyY2VcbiAgICAgICAgLmZpbHRlcigoaSkgPT4gaS5jaGVja2VkKVxuICAgICAgICAubWFwKChpKSA9PiBpLmlkKTtcblxuICAgICAgaWYgKHNob3dTZWxlY3RlZE9uVG9wKSB7XG4gICAgICAgIC8vIHJlbW92ZSB0aGUgY2hlY2tlZCBpdGVtcyBmaXJzdFxuICAgICAgICBpdGVtLmZpbHRlcmVkRGF0YVNvdXJjZSA9IGl0ZW0uZmlsdGVyZWREYXRhU291cmNlLmZpbHRlcihcbiAgICAgICAgICAoaSkgPT4gIWNoZWNrZWRJZHMuaW5jbHVkZXMoaS5pZClcbiAgICAgICAgKTtcbiAgICAgICAgLy8gYWRkIGFsbCBjaGVja2VkIGl0ZW1zIHRvIHRoZSB0b3BcbiAgICAgICAgY29uc3QgY2hlY2tlZEl0ZW1zID0gaXRlbS5kYXRhU291cmNlLmZpbHRlcigoaSkgPT4gaS5jaGVja2VkKTtcbiAgICAgICAgaXRlbS5maWx0ZXJlZERhdGFTb3VyY2UgPSBjaGVja2VkSXRlbXMuY29uY2F0KGl0ZW0uZmlsdGVyZWREYXRhU291cmNlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIG1hcmsgYXMgY2hlY2tlZCBiYXNlZCBvbiB0aGUgZGF0YVNvdXJjZVxuICAgICAgICBmb3IgKGxldCBkc0l0ZW0gb2YgaXRlbS5maWx0ZXJlZERhdGFTb3VyY2UpIHtcbiAgICAgICAgICBkc0l0ZW0uY2hlY2tlZCA9IGNoZWNrZWRJZHMuaW5jbHVkZXMoZHNJdGVtLmlkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpdGVtLmlzTG9hZGluZ05vdyA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyB0b2dnbGVJdGVtKGl0ZW06IEZpbHRlcnNDb25maWdJdGVtKSB7XG4gICAgaXRlbS5leHBhbmRlZCA9ICFpdGVtLmV4cGFuZGVkO1xuXG4gICAgaWYgKGl0ZW0uaXNMYXp5TG9hZGluZykge1xuICAgICAgaWYgKGl0ZW0uZXhwYW5kZWQpIHtcbiAgICAgICAgaWYgKGl0ZW0uY2FuTG9hZE1vcmUgIT09IGZhbHNlICYmICFpdGVtLmZpbHRlcmVkRGF0YVNvdXJjZT8ubGVuZ3RoKSB7XG4gICAgICAgICAgdGhpcy5sb2FkTW9yZShpdGVtLCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlc2V0RmlsdGVycygpIHtcbiAgICBsZXQgc2VsZWN0QWxsID0gdGhpcy5yZXNldEJlaGF2aW9yID09PSAnc2V0X2FsbCc7XG4gICAgdGhpcy5zZWxlY3RlZERhdGVSYW5nZU9wdGlvbnMgPSB7fTtcblxuICAgIGZvciAoY29uc3QgaXRlbSBvZiB0aGlzLmNvbmZpZy5pdGVtcykge1xuICAgICAgaWYgKGl0ZW0uZGF0YVNvdXJjZSkge1xuICAgICAgICBpdGVtLmlzU2VsZWN0ZWRBbGwgPSBzZWxlY3RBbGw7XG5cbiAgICAgICAgZm9yIChjb25zdCBkc0l0ZW0gb2YgaXRlbS5kYXRhU291cmNlKSB7XG4gICAgICAgICAgZHNJdGVtLmNoZWNrZWQgPSBzZWxlY3RBbGw7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGl0ZW0uZGF0ZVJhbmdlKSB7XG4gICAgICAgIGl0ZW0uZGF0ZVJhbmdlID0geyBzdGFydDogbnVsbCwgZW5kOiBudWxsIH07XG4gICAgICB9XG5cbiAgICAgIGlmIChpdGVtLm51bWJlclJhbmdlKSB7XG4gICAgICAgIGl0ZW0ubnVtYmVyUmFuZ2UgPSB7IGZyb206IG51bGwsIHRvOiBudWxsIH07XG4gICAgICB9XG5cbiAgICAgIGlmIChpdGVtLmRhdGUpIHtcbiAgICAgICAgaXRlbS5kYXRlID0gbmV3IERhdGUoKTtcbiAgICAgIH1cbiAgICAgIGlmIChpdGVtLnR5cGUgPT09ICd0b2dnbGUnKSB7XG4gICAgICAgIGl0ZW0uZW5hYmxlZCA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKGl0ZW0udHlwZSA9PT0gJ3JhZGlvJykge1xuICAgICAgICBpdGVtLnJhZGlvT3B0aW9ucy5mb3JFYWNoKChlKSA9PiB7XG4gICAgICAgICAgaWYgKGUuaWQgPT09IGl0ZW0uc2VsZWN0ZWRSYWRpbykge1xuICAgICAgICAgICAgZS5zZWxlY3RlZCA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGUuc2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVzdG9yZVByZXZpb3VzQXBwbGllZCgpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy5jb25maWcuaXRlbXMpIHtcbiAgICAgIHN3aXRjaCAoaXRlbS50eXBlKSB7XG4gICAgICAgIGNhc2UgJ211bHRpc2VsZWN0JzpcbiAgICAgICAgICBpZiAoaXRlbS5kYXRhU291cmNlKSB7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB0aGlzLmxhc3RBcHBsaWVkRmlsdGVyW2l0ZW0ua2V5XTtcblxuICAgICAgICAgICAgZm9yIChjb25zdCBkYXRhSXRlbSBvZiBpdGVtLmRhdGFTb3VyY2UpIHtcbiAgICAgICAgICAgICAgZGF0YUl0ZW0uY2hlY2tlZCA9IHNlbGVjdGlvblxuICAgICAgICAgICAgICAgID8gc2VsZWN0aW9uLmluY2x1ZGVzKGRhdGFJdGVtLmlkKVxuICAgICAgICAgICAgICAgIDogZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdkYXRlUmFuZ2UnOlxuICAgICAgICAgIGl0ZW0uZGF0ZVJhbmdlID0gdGhpcy5sYXN0QXBwbGllZEZpbHRlcltpdGVtLmtleV0gfHwge1xuICAgICAgICAgICAgc3RhcnQ6IG51bGwsXG4gICAgICAgICAgICBlbmQ6IG51bGwsXG4gICAgICAgICAgfTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnbnVtYmVyUmFuZ2UnOlxuICAgICAgICAgIGl0ZW0ubnVtYmVyUmFuZ2UgPSB0aGlzLmxhc3RBcHBsaWVkRmlsdGVyW2l0ZW0ua2V5XSB8fCB7fTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAndG9nZ2xlJzpcbiAgICAgICAgICBpdGVtLmRhdGVSYW5nZSA9IHRoaXMubGFzdEFwcGxpZWRGaWx0ZXJbaXRlbS5rZXldO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdkYXRlJzpcbiAgICAgICAgICBpdGVtLmRhdGUgPSB0aGlzLmxhc3RBcHBsaWVkRmlsdGVyW2l0ZW0ua2V5XTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAncmFkaW8nOlxuICAgICAgICAgIGl0ZW0uc2VsZWN0ZWRSYWRpbyA9IHRoaXMubGFzdEFwcGxpZWRGaWx0ZXJbaXRlbS5rZXldO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyByZXNldCgpIHtcbiAgICB0aGlzLnJlc2V0RmlsdGVycygpO1xuXG4gICAgdGhpcy5maWx0ZXIgPSB0aGlzLmdldEZpbHRlck9iamVjdCgpO1xuICAgIHRoaXMucmVzZXRlZEZpbHRlciA9IHRoaXMuZ2V0RmlsdGVyT2JqZWN0KCk7XG5cbiAgICB0aGlzLnJlc2V0TGF6eUxvYWRpbmdTb3VyY2VzKGZhbHNlKTtcbiAgfVxuXG4gIHB1YmxpYyBhcHBseSgpIHtcbiAgICB0aGlzLmZpbHRlciA9IHRoaXMuZ2V0RmlsdGVyT2JqZWN0KCk7XG4gICAgbGV0IGhhc0Vycm9yID0gZmFsc2U7XG4gICAgZm9yIChjb25zdCBpdGVyYXRvciBvZiB0aGlzLmNvbmZpZy5pdGVtcykge1xuICAgICAgY29uc3QgaXRlbUZsYWcgPSB0aGlzLm9uQ2hlY2tWYWxpZGl0eShpdGVyYXRvcik7XG4gICAgICBpZiAoIWl0ZW1GbGFnKSB7XG4gICAgICAgIGhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGhhc0Vycm9yKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+ICh0aGlzLmVycm9yTWVzc2FnZSA9IFtdKSwgNTAwMCk7XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZXJyb3JNZXNzYWdlID0gW107XG4gICAgfVxuICAgIHRoaXMubGFzdEFwcGxpZWRGaWx0ZXIgPSBVdGlsLmNsb25lKHRoaXMuZmlsdGVyKTtcblxuICAgIHRoaXMuZmlsdGVyQ2hhbmdlLmVtaXQodGhpcy5maWx0ZXIpO1xuXG4gICAgLy8gdXBkYXRlIHRoZSBhcHBseSBzdGF0ZVxuICAgIHRoaXMudXBkYXRlQXBwbGllZFN0YXRlKCk7XG5cbiAgICB0aGlzLmhpZGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlQXBwbGllZFN0YXRlKCkge1xuICAgIHRoaXMuaXNBcHBsaWVkID0gZmFsc2U7XG4gICAgLy8gc2hvd2luZyBjaGVja2VkIGl0ZW1zIG9uIHRvcCBvZiB0aGUgbGlzdFxuICAgIGZvciAoY29uc3QgaXRlbSBvZiB0aGlzLmNvbmZpZy5pdGVtcykge1xuICAgICAgaWYgKGl0ZW0udHlwZSA9PT0gJ211bHRpc2VsZWN0Jykge1xuICAgICAgICAvLyByZXNvcnQgZmlyc3QgYmFzZWQgb24gaW5kZXhcbiAgICAgICAgaXRlbS5kYXRhU291cmNlLnNvcnQoKGEsIGIpID0+IGEuaW5kZXggLSBiLmluZGV4KTtcblxuICAgICAgICAvLyB0aGVuIHNvcnQgYmFzZWQgb24gY2hlY2tlZCBpdGVtcyBhZ2FpblxuICAgICAgICBpdGVtLmRhdGFTb3VyY2Uuc29ydChcbiAgICAgICAgICAoYTogRGF0YVNvdXJjZSwgYjogRGF0YVNvdXJjZSkgPT5cbiAgICAgICAgICAgIE51bWJlcihiLmNoZWNrZWQgfHwgMCkgLSBOdW1iZXIoYS5jaGVja2VkIHx8IDApXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuZmlsdGVyKS5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAodGhpcy5yZXNldGVkRmlsdGVyKSB7XG4gICAgICAgIC8vIEZpbHRlciB3YXMgcmVzZXQsIHNvIGNvbXBhcmUgdGhlIHJlc2V0IGZpbHRlciBvYmplY3Qgd2l0aCB0aGUgY3VycmVudCBmaWx0ZXJcbiAgICAgICAgLy8gV2hlbiB1c2VyIGNsaWNrIG9uIFJlc2V0IGFuZCBUaGVuIEFwcGx5LCBmaWx0ZXIgbXVzdCB1bmhpZ2hsaWdodGVkXG4gICAgICAgIGlmIChcbiAgICAgICAgICBKU09OLnN0cmluZ2lmeSh0aGlzLnJlc2V0ZWRGaWx0ZXIpICE9PSBKU09OLnN0cmluZ2lmeSh0aGlzLmZpbHRlcilcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5pc0FwcGxpZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmlzQXBwbGllZCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IHdyYXBwZXJDbGFzcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5hY3Rpb24tbWVudS1ib2R5Jyk7XG4gICAgaWYgKHRoaXMud3JhcHBlckJvZHlDbGFzcykge1xuICAgICAgd3JhcHBlckNsYXNzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgLiR7dGhpcy53cmFwcGVyQm9keUNsYXNzfWApO1xuICAgIH1cbiAgICBpZiAod3JhcHBlckNsYXNzKSB7XG4gICAgICB3cmFwcGVyQ2xhc3Muc2Nyb2xsVG8oeyB0b3A6IDAsIGJlaGF2aW9yOiAnYXV0bycgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRGaWx0ZXJPYmplY3QoKSB7XG4gICAgY29uc3QgZmlsdGVyID0ge307XG5cbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy5jb25maWcuaXRlbXMpIHtcbiAgICAgIHN3aXRjaCAoaXRlbS50eXBlKSB7XG4gICAgICAgIGNhc2UgJ211bHRpc2VsZWN0JzpcbiAgICAgICAgICBpZiAoaXRlbS5kYXRhU291cmNlICYmIGl0ZW0uZGF0YVNvdXJjZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGNoZWNrZWRJZHMgPSBpdGVtLmRhdGFTb3VyY2VcbiAgICAgICAgICAgICAgLmZpbHRlcigoaSkgPT4gaS5jaGVja2VkKVxuICAgICAgICAgICAgICAubWFwKChpKSA9PiBpLmlkKTtcblxuICAgICAgICAgICAgaWYgKGNoZWNrZWRJZHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIGZpbHRlcltpdGVtLmtleV0gPSBjaGVja2VkSWRzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnZGF0ZVJhbmdlJzpcbiAgICAgICAgICBpZiAoaXRlbS5kYXRlUmFuZ2UgJiYgaXRlbS5kYXRlUmFuZ2Uuc3RhcnQgJiYgaXRlbS5kYXRlUmFuZ2UuZW5kKSB7XG4gICAgICAgICAgICBmaWx0ZXJbaXRlbS5rZXldID0gaXRlbS5kYXRlUmFuZ2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdudW1iZXJSYW5nZSc6XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgaXRlbS5udW1iZXJSYW5nZSAmJlxuICAgICAgICAgICAgdHlwZW9mIGl0ZW0/Lm51bWJlclJhbmdlPy5mcm9tID09PSAnbnVtYmVyJyAmJlxuICAgICAgICAgICAgdHlwZW9mIGl0ZW0/Lm51bWJlclJhbmdlPy50byA9PT0gJ251bWJlcidcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGZpbHRlcltpdGVtLmtleV0gPSBpdGVtLm51bWJlclJhbmdlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAndG9nZ2xlJzpcbiAgICAgICAgICBmaWx0ZXJbaXRlbS5rZXldID0gaXRlbS5lbmFibGVkIHx8IGZhbHNlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdkYXRlJzpcbiAgICAgICAgICBpZiAoaXRlbS5kYXRlKSB7XG4gICAgICAgICAgICBmaWx0ZXJbaXRlbS5rZXldID0gaXRlbS5kYXRlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAncmFkaW8nOlxuICAgICAgICAgIGZpbHRlcltpdGVtLmtleV0gPSBpdGVtLnJhZGlvT3B0aW9ucy5maW5kKChybykgPT4gcm8uc2VsZWN0ZWQpPy5pZDtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmlsdGVyO1xuICB9XG5cbiAgcHVibGljIGhpZGUoKSB7XG4gICAgdGhpcy5pc1Zpc2libGUgPSBmYWxzZTtcbiAgICB0aGlzLnNlYXJjaFRleHQgPSAnJztcbiAgICB0aGlzLmZpbHRlckl0ZW1zKCk7XG5cbiAgICB0aGlzLmlzVmlzaWJsZUNoYW5nZS5lbWl0KGZhbHNlKTtcbiAgfVxuXG4gIHB1YmxpYyByYWRpb0NoYW5nZWQodmFsdWU6IHN0cmluZywgaXRlbTogRmlsdGVyc0NvbmZpZ0l0ZW0pOiB2b2lkIHtcbiAgICBpdGVtLnJhZGlvT3B0aW9ucy5mb3JFYWNoKChvcHQpID0+IChvcHQuc2VsZWN0ZWQgPSBvcHQuaWQgPT09IHZhbHVlKSk7XG4gIH1cblxuICBwdWJsaWMgY2hlY2tDaGFuZ2VkKGl0ZW06IERhdGFTb3VyY2UsIGNvbmZpZ0l0ZW06IEZpbHRlcnNDb25maWdJdGVtKTogdm9pZCB7XG4gICAgaWYgKGNvbmZpZ0l0ZW0uaXNMYXp5TG9hZGluZykge1xuICAgICAgLy8gc3RvcmUgdGhlIGNoZWNrIGl0ZW1zIGluIHRoZSBkYXRhIHNvdXJjZVxuICAgICAgY29uc3QgZXhpc3RJdGVtID0gY29uZmlnSXRlbS5kYXRhU291cmNlLmZpbmQoKGkpID0+IGkuaWQgPT0gaXRlbS5pZCk7XG4gICAgICBpZiAoZXhpc3RJdGVtKSB7XG4gICAgICAgIGV4aXN0SXRlbS5jaGVja2VkID0gaXRlbS5jaGVja2VkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uZmlnSXRlbS5kYXRhU291cmNlLnB1c2goaXRlbSk7XG4gICAgICB9XG4gICAgICAvLyBrZWVwIG9ubHkgY2hlY2tlZFxuICAgICAgY29uZmlnSXRlbS5kYXRhU291cmNlID0gY29uZmlnSXRlbS5kYXRhU291cmNlLmZpbHRlcigoZCkgPT4gZC5jaGVja2VkKTtcbiAgICB9XG4gICAgLy8gRm9yIHRyZWUgaXRlbXMsIHplbi1ncm91cHMgaGFuZGxlcyBjYXNjYWRlIGludGVybmFsbHlcbiAgfVxuXG4gIHB1YmxpYyB0b2dnbGUoKSB7XG4gICAgdGhpcy5pc1Zpc2libGUgPSAhdGhpcy5pc1Zpc2libGU7XG4gICAgdGhpcy51cGRhdGVQbGFjZW1lbnQodGhpcy5jdXN0b21Qb3NpdGlvbik7XG4gICAgdGhpcy5mb2N1c1NlYXJjaEJveCgpO1xuXG4gICAgaWYgKHRoaXMuaXNWaXNpYmxlKSB7XG4gICAgICB0aGlzLnJlc2V0TGF6eUxvYWRpbmdTb3VyY2VzKHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBvbkNoZWNrVmFsaWRpdHkoaXRlbTogRmlsdGVyc0NvbmZpZ0l0ZW0pIHtcbiAgICBpZiAoaXRlbS50eXBlID09PSAnbnVtYmVyUmFuZ2UnKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHR5cGVvZiBpdGVtLm51bWJlclJhbmdlLmZyb20gPT09ICdudW1iZXInICYmXG4gICAgICAgIHR5cGVvZiBpdGVtLm51bWJlclJhbmdlLnRvID09PSAnbnVtYmVyJyAmJlxuICAgICAgICBpdGVtLm51bWJlclJhbmdlLmZyb20gPiBpdGVtLm51bWJlclJhbmdlLnRvXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5lcnJvck1lc3NhZ2UucHVzaChcbiAgICAgICAgICBgSW52YWxpZCBOdW1iZXIgcmFuZ2U6IFRoZSBNaW4gbnVtYmVyIGNhbm5vdCBiZSBncmVhdGVyIHRoYW4gdGhlIE1heCBudW1iZXIuYFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpdGVtLnR5cGUgPT09ICdkYXRlUmFuZ2UnKSB7XG4gICAgICBpZiAoXG4gICAgICAgIGl0ZW0uZGF0ZVJhbmdlLnN0YXJ0ICYmXG4gICAgICAgIGl0ZW0uZGF0ZVJhbmdlLmVuZCAmJlxuICAgICAgICBuZXcgRGF0ZShpdGVtLmRhdGVSYW5nZS5zdGFydCkgPiBuZXcgRGF0ZShpdGVtLmRhdGVSYW5nZS5lbmQpXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5lcnJvck1lc3NhZ2UucHVzaChcbiAgICAgICAgICBgSW52YWxpZCBEYXRlIHJhbmdlOiBUaGUgU3RhcnQgZGF0ZSBjYW5ub3QgYmUgYWZ0ZXIgdGhlIEVuZCBkYXRlLmBcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGVQbGFjZW1lbnQocG9zOiAnZml4ZWQnIHwgJ2Fic29sdXRlJyA9ICdmaXhlZCcpIHtcbiAgICBjb25zdCBob3N0ID0gdGhpcy5fY29tcG9uZW50RWxlbWVudC5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IGhvc3QucXVlcnlTZWxlY3RvcignLm1lbnUtY29udGVudCcpIGFzIEhUTUxFbGVtZW50O1xuICAgIGlmICghY29udGFpbmVyKSByZXR1cm47XG5cbiAgICBjb25zdCByZWN0ID1cbiAgICAgIHBvcyA9PT0gJ2ZpeGVkJ1xuICAgICAgICA/IGhvc3QuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClcbiAgICAgICAgOiBjb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgbGVmdCA9IHJlY3QubGVmdDtcbiAgICBjb25zdCByaWdodCA9IHJlY3QucmlnaHQ7XG4gICAgY29uc3QgdG9wID0gcmVjdC50b3A7XG4gICAgY29uc3QgYm90dG9tID0gd2luZG93LmlubmVySGVpZ2h0IC0gdG9wO1xuXG4gICAgaWYgKHBvcyA9PT0gJ2Fic29sdXRlJykge1xuICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyhjb250YWluZXIsICdhYnNvbHV0ZScpO1xuICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVTdHlsZShjb250YWluZXIsICdpbnNldCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKGNvbnRhaW5lciwgJ2Fic29sdXRlJyk7XG4gICAgfVxuXG4gICAgaWYgKHBvcyA9PT0gJ2ZpeGVkJykge1xuICAgICAgaWYgKHRoaXMucG9zaXRpb24uaW5jbHVkZXMoJ2F1dG8nKSkge1xuICAgICAgICBjb25zdCBob3Jpem9udGFsUG9zaXRpb24gPSB0aGlzLmdldEhvcml6b250YWxQb3NpdGlvbigpO1xuICAgICAgICB0aGlzLm1lbnVSaWdodCA9XG4gICAgICAgICAgaG9yaXpvbnRhbFBvc2l0aW9uID09PSAnbGVmdCdcbiAgICAgICAgICAgID8gYCR7d2luZG93LmlubmVyV2lkdGggLSByaWdodH1weGBcbiAgICAgICAgICAgIDogJ3Vuc2V0JztcbiAgICAgICAgdGhpcy5tZW51TGVmdCA9IGhvcml6b250YWxQb3NpdGlvbiA9PT0gJ3JpZ2h0JyA/IGAke2xlZnR9cHhgIDogJ3Vuc2V0JztcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5wb3NpdGlvbi5pbmNsdWRlcygnbGVmdCcpKSB7XG4gICAgICAgIHRoaXMubWVudVJpZ2h0ID0gYCR7d2luZG93LmlubmVyV2lkdGggLSByaWdodH1weGA7XG4gICAgICAgIHRoaXMubWVudUxlZnQgPSAndW5zZXQnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5tZW51TGVmdCA9IGAke2xlZnR9cHhgO1xuICAgICAgICB0aGlzLm1lbnVSaWdodCA9ICd1bnNldCc7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnBvc2l0aW9uLmluY2x1ZGVzKCdhdXRvJykpIHtcbiAgICAgICAgY29uc3QgdmVydGljYWxQb3NpdGlvbiA9IHRoaXMuZ2V0VmVydGljYWxQb3NpdGlvbigpO1xuICAgICAgICB0aGlzLm1lbnVUb3AgPVxuICAgICAgICAgIHZlcnRpY2FsUG9zaXRpb24gPT09ICdib3R0b20nID8gYCR7dG9wICsgNDJ9cHhgIDogJ3Vuc2V0JztcbiAgICAgICAgdGhpcy5tZW51Qm90dG9tID0gdmVydGljYWxQb3NpdGlvbiA9PT0gJ3RvcCcgPyBgJHtib3R0b219cHhgIDogJ3Vuc2V0JztcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5wb3NpdGlvbi5pbmNsdWRlcygndG9wJykpIHtcbiAgICAgICAgdGhpcy5tZW51VG9wID0gJ3Vuc2V0JztcbiAgICAgICAgdGhpcy5tZW51Qm90dG9tID0gYCR7Ym90dG9tICsgMTB9cHhgO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5tZW51VG9wID0gYCR7dG9wICsgNTV9cHhgO1xuICAgICAgICB0aGlzLm1lbnVCb3R0b20gPSAndW5zZXQnO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgdmVydGljYWxDbGFzcyA9ICcnO1xuICAgICAgbGV0IGhvcml6b250YWxDbGFzcyA9ICcnO1xuXG4gICAgICBpZiAodGhpcy5wb3NpdGlvbi5pbmNsdWRlcygnYXV0bycpKSB7XG4gICAgICAgIGhvcml6b250YWxDbGFzcyA9IHRoaXMuZ2V0SG9yaXpvbnRhbFBvc2l0aW9uKCk7XG4gICAgICAgIHZlcnRpY2FsQ2xhc3MgPSB0aGlzLmdldFZlcnRpY2FsUG9zaXRpb24oKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGhvcml6b250YWxDbGFzcyA9IHRoaXMucG9zaXRpb24uaW5jbHVkZXMoJ2xlZnQnKSA/ICdsZWZ0JyA6ICdyaWdodCc7XG4gICAgICAgIHZlcnRpY2FsQ2xhc3MgPSB0aGlzLnBvc2l0aW9uLmluY2x1ZGVzKCd0b3AnKSA/ICd0b3AnIDogJ2JvdHRvbSc7XG4gICAgICB9XG4gICAgICBbXG4gICAgICAgICdkcm9wZG93bi1sZWZ0JyxcbiAgICAgICAgJ2Ryb3Bkb3duLXJpZ2h0JyxcbiAgICAgICAgJ2Ryb3Bkb3duLXRvcCcsXG4gICAgICAgICdkcm9wZG93bi1ib3R0b20nLFxuICAgICAgXS5mb3JFYWNoKChjKSA9PiB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKGNvbnRhaW5lciwgYykpO1xuICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyhjb250YWluZXIsIGBkcm9wZG93bi0ke2hvcml6b250YWxDbGFzc31gKTtcbiAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MoY29udGFpbmVyLCBgZHJvcGRvd24tJHt2ZXJ0aWNhbENsYXNzfWApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0VmVydGljYWxQb3NpdGlvbigpOiAnYm90dG9tJyB8ICd0b3AnIHtcbiAgICBjb25zdCB0b3AgPVxuICAgICAgdGhpcy5fY29tcG9uZW50RWxlbWVudC5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcDtcbiAgICByZXR1cm4gdG9wID4gd2luZG93LmlubmVySGVpZ2h0IC8gMiA/ICd0b3AnIDogJ2JvdHRvbSc7XG4gIH1cblxuICBwcml2YXRlIGdldEhvcml6b250YWxQb3NpdGlvbigpOiAncmlnaHQnIHwgJ2xlZnQnIHtcbiAgICBjb25zdCBsZWZ0ID1cbiAgICAgIHRoaXMuX2NvbXBvbmVudEVsZW1lbnQubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0O1xuICAgIHJldHVybiBsZWZ0ID4gd2luZG93LmlubmVyV2lkdGggLyAyID8gJ2xlZnQnIDogJ3JpZ2h0JztcbiAgfVxuXG4gIHB1YmxpYyBnZXREZWZhdWx0RGF0ZVJhbmdlT3B0aW9ucygpOiB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGRhdGVSYW5nZTogRGF0ZVJhbmdlO1xuICB9W10ge1xuICAgIHJldHVybiBbXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdUb2RheScsXG4gICAgICAgIGRhdGVSYW5nZToge1xuICAgICAgICAgIHN0YXJ0OiBtb21lbnQoKS5zdGFydE9mKCdkYXknKS50b0RhdGUoKSxcbiAgICAgICAgICBlbmQ6IG1vbWVudCgpLmVuZE9mKCdkYXknKS50b0RhdGUoKSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdZZXN0ZXJkYXknLFxuICAgICAgICBkYXRlUmFuZ2U6IHtcbiAgICAgICAgICBzdGFydDogbW9tZW50KCkuc3VidHJhY3QoMSwgJ2RheXMnKS5zdGFydE9mKCdkYXknKS50b0RhdGUoKSxcbiAgICAgICAgICBlbmQ6IG1vbWVudCgpLnN1YnRyYWN0KDEsICdkYXlzJykuZW5kT2YoJ2RheScpLnRvRGF0ZSgpLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ1RoaXMgV2VlaycsXG4gICAgICAgIGRhdGVSYW5nZToge1xuICAgICAgICAgIHN0YXJ0OiBtb21lbnQoKS5zdGFydE9mKCd3ZWVrJykudG9EYXRlKCksXG4gICAgICAgICAgZW5kOiBtb21lbnQoKS5lbmRPZignd2VlaycpLnRvRGF0ZSgpLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ0xhc3QgV2VlaycsXG4gICAgICAgIGRhdGVSYW5nZToge1xuICAgICAgICAgIHN0YXJ0OiBtb21lbnQoKS5zdWJ0cmFjdCg3LCAnZGF5cycpLnN0YXJ0T2YoJ3dlZWsnKS50b0RhdGUoKSxcbiAgICAgICAgICBlbmQ6IG1vbWVudCgpLnN1YnRyYWN0KDcsICdkYXlzJykuZW5kT2YoJ3dlZWsnKS50b0RhdGUoKSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdUaGlzIE1vbnRoJyxcbiAgICAgICAgZGF0ZVJhbmdlOiB7XG4gICAgICAgICAgc3RhcnQ6IG1vbWVudCgpLnN0YXJ0T2YoJ21vbnRoJykudG9EYXRlKCksXG4gICAgICAgICAgZW5kOiBtb21lbnQoKS5lbmRPZignbW9udGgnKS50b0RhdGUoKSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdMYXN0IE1vbnRoJyxcbiAgICAgICAgZGF0ZVJhbmdlOiB7XG4gICAgICAgICAgc3RhcnQ6IG1vbWVudCgpLnN1YnRyYWN0KDEsICdtb250aCcpLnN0YXJ0T2YoJ21vbnRoJykudG9EYXRlKCksXG4gICAgICAgICAgZW5kOiBtb21lbnQoKS5zdWJ0cmFjdCgxLCAnbW9udGgnKS5lbmRPZignbW9udGgnKS50b0RhdGUoKSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgXTtcbiAgfVxuXG4gIHByaXZhdGUgc29ydFRyZWVPcmRlcihpdGVtczogRGF0YVNvdXJjZVtdLCB0cmVlTWFwOiBNYXA8c3RyaW5nIHwgbnVtYmVyLCBEYXRhU291cmNlPik6IERhdGFTb3VyY2VbXSB7XG4gICAgY29uc3QgaXRlbVNldCA9IG5ldyBTZXQoaXRlbXMubWFwKGkgPT4gaS5pZCkpO1xuICAgIGNvbnN0IHZpc2l0ZWQgPSBuZXcgU2V0PHN0cmluZyB8IG51bWJlcj4oKTtcbiAgICBjb25zdCBvcmRlcmVkOiBEYXRhU291cmNlW10gPSBbXTtcbiAgICBjb25zdCB2aXNpdCA9IChpdGVtOiBEYXRhU291cmNlKSA9PiB7XG4gICAgICBpZiAodmlzaXRlZC5oYXMoaXRlbS5pZCkpIHJldHVybjtcbiAgICAgIGlmICghaXRlbVNldC5oYXMoaXRlbS5pZCkpIHJldHVybjtcbiAgICAgIHZpc2l0ZWQuYWRkKGl0ZW0uaWQpO1xuICAgICAgb3JkZXJlZC5wdXNoKGl0ZW0pO1xuICAgICAgaWYgKGl0ZW0uY2hpbGRyZW4/Lmxlbmd0aCkge1xuICAgICAgICBmb3IgKGNvbnN0IGNoaWxkSWQgb2YgaXRlbS5jaGlsZHJlbikge1xuICAgICAgICAgIGNvbnN0IGNoaWxkID0gdHJlZU1hcC5nZXQoY2hpbGRJZCk7XG4gICAgICAgICAgaWYgKGNoaWxkKSB7XG4gICAgICAgICAgICB2aXNpdChjaGlsZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcbiAgICAgIGlmIChpdGVtLnBhcmVudElkID09IG51bGwpIHtcbiAgICAgICAgdmlzaXQoaXRlbSk7XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xuICAgICAgaWYgKCF2aXNpdGVkLmhhcyhpdGVtLmlkKSkge1xuICAgICAgICBvcmRlcmVkLnB1c2goaXRlbSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvcmRlcmVkO1xuICB9XG5cbiAgcHVibGljIGhhc1RyZWVEYXRhKGNvbmZpZ0l0ZW06IEZpbHRlcnNDb25maWdJdGVtKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGNvbmZpZ0l0ZW0uZGF0YVNvdXJjZT8uc29tZShkID0+IGQuY2hpbGRyZW4/Lmxlbmd0aCA+IDApIHx8IGZhbHNlO1xuICB9XG5cbiAgcHVibGljIGhhbmRsZURhdGVSYW5nZU9wdGlvbkNsaWNrKGl0ZW0sIG9wdGlvbikge1xuICAgIGl0ZW0uZGF0ZVJhbmdlID0gb3B0aW9uLmRhdGVSYW5nZTtcbiAgICB0aGlzLnNlbGVjdGVkRGF0ZVJhbmdlT3B0aW9uc1tpdGVtLmtleV0gPSBvcHRpb24ubmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBoYW5kbGVDdXN0b21EYXRlUmFuZ2VDbGljayhpdGVtKSB7XG4gICAgdGhpcy5zZWxlY3RlZERhdGVSYW5nZU9wdGlvbnNbaXRlbS5rZXldID0gJ0N1c3RvbSc7XG4gIH1cblxuICBwdWJsaWMgaGFuZGxlRW5kRGF0ZUNoYW5nZShpdGVtKSB7XG4gICAgaWYgKCFpdGVtLnNob3dUaW1lKSB7XG4gICAgICBpdGVtLmRhdGVSYW5nZS5lbmQgPSBtb21lbnQoaXRlbS5kYXRlUmFuZ2UuZW5kKS5lbmRPZignZGF5JykudG9EYXRlKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldCBoYXNNdWx0aXNlbGVjdEl0ZW1zKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5pdGVtcy5zb21lKFxuICAgICAgKGl0ZW0pID0+IGl0ZW0udHlwZSA9PT0gJ211bHRpc2VsZWN0JyAmJiBpdGVtLmRhdGFTb3VyY2U/Lmxlbmd0aCA+IDBcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGdldCBzZWxlY3RlZENvdW50KCk6IG51bWJlciB7XG4gICAgbGV0IGNvdW50ID0gMDtcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy5jb25maWcuaXRlbXMpIHtcbiAgICAgIGlmIChpdGVtLnR5cGUgPT09ICdtdWx0aXNlbGVjdCcgJiYgaXRlbS5kYXRhU291cmNlKSB7XG4gICAgICAgIGNvdW50ICs9IGl0ZW0uZGF0YVNvdXJjZS5maWx0ZXIoKGQpID0+IGQuY2hlY2tlZCkubGVuZ3RoO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY291bnQ7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJmaWx0ZXJzLWNvbXBvbmVudFwiXG4gICAgICNtYWluQ29tcG9uZW50XG4gICAgIGNsaWNrLW91dD1cImlzVmlzaWJsZSAmJiBoaWRlKClcIj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhY3VzdG9tVHJpZ2dlclwiPlxuICAgICAgICA8emVuLWJ1dHRvbiAoY2xpY2spPVwidG9nZ2xlKClcIlxuICAgICAgICAgICAgICAgICAgICBbdmFyaWFudF09XCJpc0FwcGxpZWQgPyAnc2Vjb25kYXJ5JyA6ICdzZWNvbmRhcnktZ3JheSdcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZpbHRlciB7e2lzQXBwbGllZCA/ICdhcHBsaWVkJyA6ICcnfX1cIj5cbiAgICAgICAgICAgIDx6ZW4taWNvbiBbc3JjXT1cImltYWdlVXJsXCJcbiAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImltYWdlVXJsXCI+PC96ZW4taWNvbj5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwiZmlsdGVyLWljb24gbWF0ZXJpYWwtaWNvbnNcIlxuICAgICAgICAgICAgICAgKm5nSWY9XCIhaW1hZ2VVcmxcIj5maWx0ZXJfbGlzdDwvaT5cbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwibGFiZWxcIj57eyBsYWJlbCB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgPC96ZW4tYnV0dG9uPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPG5nLWNvbnRlbnQgKm5nSWY9XCJjdXN0b21UcmlnZ2VyXCI+PC9uZy1jb250ZW50PlxuXG4gICAgPGRpdiBbaGlkZGVuXT1cIiFpc1Zpc2libGVcIlxuICAgICAgICAgY2xhc3M9XCJhY3Rpb24tbWVudSBtZW51LWNvbnRlbnRcIlxuICAgICAgICAgW2NsYXNzLmN1c3RvbVRyaWdnZXJdPVwiY3VzdG9tVHJpZ2dlclwiXG4gICAgICAgICBbbmdTdHlsZV09XCJ7ICdsZWZ0JzogbWVudUxlZnQsICdyaWdodCc6IG1lbnVSaWdodCwgJ3RvcCc6IG1lbnVUb3AsICdib3R0b20nOiBtZW51Qm90dG9tICB9XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJhY3Rpb24tbWVudS1oZWFkZXJcIj5cbiAgICAgICAgICAgIDx6ZW4tc2VhcmNoLWJveCBbKHRleHQpXT1cInNlYXJjaFRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICNzZWFyY2hCb3hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGV4dENoYW5nZSk9XCJzZWFyY2hUZXh0Q2hhbmdlZCgpXCI+PC96ZW4tc2VhcmNoLWJveD5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImFjdGlvbi1tZW51LWJvZHkgaXRlbXMtd3JhcHBlclwiXG4gICAgICAgICAgICAgbmdDbGFzcz1cInt7d3JhcHBlckJvZHlDbGFzc319XCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZXJyb3JNZXNzYWdlLmxlbmd0aFwiPlxuICAgICAgICAgICAgICAgIDxsaSAqbmdGb3I9XCJsZXQgaXRlbSBvZiBlcnJvck1lc3NhZ2VcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImVycm9yLW1zZ1wiPnt7aXRlbSB8IHRyYW5zbGF0ZSB9fTwvbGk+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBjb25maWcuaXRlbXNcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWVudS1pdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiaXNNZW51SXNWaXNpYmxlKGl0ZW0pXCI+XG5cbiAgICAgICAgICAgICAgICAgICAgPCEtLSBEaXZpZGVyIGJldHdlZW4gdHdvIGZpbHRlciAtLT5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIml0ZW0udHlwZSA9PT0gJ2RpdmlkZXInXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImZpbHRlci1kaXZpZGVyXCI+PC9wPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8IS0tIEJvb2xlYW4gdG9nZ2xlIC0tPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXRlbS50eXBlID09PSAndG9nZ2xlJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhY3Rpb24taXRlbSB0b2dnbGUtcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2Pnt7aXRlbS50aXRsZSB8IHRyYW5zbGF0ZX19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8emVuLXRvZ2dsZS1zbGlkZSBbKGVuYWJsZWQpXT1cIml0ZW0uZW5hYmxlZFwiPjwvemVuLXRvZ2dsZS1zbGlkZT5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1pdGVtIGV4cGFuZGVyLWl0ZW1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiaXRlbS50eXBlICE9ICd0b2dnbGUnICYmIGl0ZW0udHlwZSAhPSAnZGl2aWRlcicgJiYgIWl0ZW0uZGlzYWJsZUNvbGxhcHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlSXRlbShpdGVtKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJleHBhbmRlci10aXRsZVwiPnt7aXRlbS50aXRsZSB8IHRyYW5zbGF0ZX19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJtYXRlcmlhbC1pY29ucyBleHBhbmQtaWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2FjdGl2ZSc6IGl0ZW0uZXhwYW5kZWR9XCI+ZXhwYW5kX21vcmU8L2k+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY3Rpb24taXRlbSBzZWN0aW9uLXRpdGxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIml0ZW0udHlwZSAhPSAndG9nZ2xlJyAmJiBpdGVtLnR5cGUgIT0gJ2RpdmlkZXInICYmIGl0ZW0uZGlzYWJsZUNvbGxhcHNlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7e2l0ZW0udGl0bGUgfCB0cmFuc2xhdGV9fVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXRlbS5leHBhbmRlZCB8fCBpdGVtLmRpc2FibGVDb2xsYXBzZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBbbmdTd2l0Y2hdPVwiaXRlbS50eXBlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBNdWx0aXNlbGVjdCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCInbXVsdGlzZWxlY3QnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gTGF6eSBsb2FkaW5nIG1vZGUgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpdGVtLmlzTGF6eUxvYWRpbmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGRzSXRlbSBvZiBpdGVtLmZpbHRlcmVkRGF0YVNvdXJjZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYWN0aW9uLWl0ZW0tY2hlY2tib3ggZHMtaXRlbVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5oYXMtYmFkZ2VdPVwiZHNJdGVtLmJhZGdlQmdDb2xvclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx6ZW4tY2hlY2tib3ggWyhjaGVja2VkKV09XCJkc0l0ZW0uY2hlY2tlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaW1hZ2VVcmxdPVwiZHNJdGVtLmltYWdlVXJsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGVja2VkQ2hhbmdlKT1cImNoZWNrQ2hhbmdlZChkc0l0ZW0sIGl0ZW0pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJkc0l0ZW0uYmFkZ2VCZ0NvbG9yID8gJycgOiAoZHNJdGVtLm5hbWU/LnRvU3RyaW5nKCkgfCB0cmFuc2xhdGUpXCI+PC96ZW4tY2hlY2tib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJkc0l0ZW0uYmFkZ2VCZ0NvbG9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZpbHRlci1pdGVtLWJhZGdlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7J2JhY2tncm91bmQnOiBkc0l0ZW0uYmFkZ2VCZ0NvbG9yLCAnY29sb3InOiBkc0l0ZW0uYmFkZ2VDb2xvcn1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZHNJdGVtLm5hbWU/LnRvU3RyaW5nKCkgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpdGVtLmNhbkxvYWRNb3JlICYmICFpdGVtLmlzTG9hZGluZ05vd1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYWN0aW9uLWl0ZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJsb2FkTW9yZShpdGVtLCBmYWxzZSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidXR0b24tc3Ryb2tlZCBmdWxsLXdpZHRoXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7J0xvYWQgTW9yZScgfCB0cmFuc2xhdGV9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXRlbS5pc0xvYWRpbmdOb3dcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImxvYWRlci1tb3JlLXNwaW5uZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8emVuLXNwaW5uZXIgc2l6ZT1cInNtYWxsXCI+PC96ZW4tc3Bpbm5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWl0ZW0uaXNMYXp5TG9hZGluZyAmJiAhaGFzVHJlZURhdGEoaXRlbSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY3Rpb24taXRlbS1jaGVja2JveCBkcy1pdGVtIHNlbGVjdC1hbGxcIiAqbmdJZj1cIiFpdGVtLmhpZGVTZWxlY3RBbGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8emVuLWNoZWNrYm94ICpuZ0lmPVwiaXRlbS5kYXRhU291cmNlLmxlbmd0aCA9PT0gaXRlbS5maWx0ZXJlZERhdGFTb3VyY2UubGVuZ3RoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsoY2hlY2tlZCldPVwiaXRlbS5pc1NlbGVjdGVkQWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpbmRldGVybWluYXRlXT1cImlzSXRlbUFjdGl2ZShpdGVtKSAmJiAhaXRlbS5pc1NlbGVjdGVkQWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCInU2VsZWN0IEFsbCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoZWNrZWRDaGFuZ2UpPVwib25TZWxlY3RBbGwoaXRlbSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3plbi1jaGVja2JveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBkc0l0ZW0gb2YgaXRlbS5maWx0ZXJlZERhdGFTb3VyY2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFjdGlvbi1pdGVtLWNoZWNrYm94IGRzLWl0ZW1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuaGFzLWJhZGdlXT1cImRzSXRlbS5iYWRnZUJnQ29sb3JcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8emVuLWNoZWNrYm94IFsoY2hlY2tlZCldPVwiZHNJdGVtLmNoZWNrZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ltYWdlVXJsXT1cImRzSXRlbS5pbWFnZVVybFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hlY2tlZENoYW5nZSk9XCJjaGVja0NoYW5nZWQoZHNJdGVtLCBpdGVtKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiZHNJdGVtLmJhZGdlQmdDb2xvciA/ICcnIDogKGRzSXRlbS5uYW1lPy50b1N0cmluZygpIHwgdHJhbnNsYXRlKVwiPjwvemVuLWNoZWNrYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZHNJdGVtLmJhZGdlQmdDb2xvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmaWx0ZXItaXRlbS1iYWRnZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieydiYWNrZ3JvdW5kJzogZHNJdGVtLmJhZGdlQmdDb2xvciwgJ2NvbG9yJzogZHNJdGVtLmJhZGdlQ29sb3J9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGRzSXRlbS5uYW1lPy50b1N0cmluZygpIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gVHJlZSB2aWV3IG1vZGUgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx6ZW4tZ3JvdXBzICpuZ0lmPVwiIWl0ZW0uaXNMYXp5TG9hZGluZyAmJiBoYXNUcmVlRGF0YShpdGVtKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkYXRhU291cmNlXT1cIml0ZW0uZGF0YVNvdXJjZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmaWx0ZXJlZERhdGFTb3VyY2VdPVwiaXRlbS5maWx0ZXJlZERhdGFTb3VyY2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaGlkZVNlbGVjdEFsbF09XCJpdGVtLmhpZGVTZWxlY3RBbGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaW5saW5lXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaGlkZVNlYXJjaF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhpc1NlbGVjdGVkQWxsKV09XCJpdGVtLmlzU2VsZWN0ZWRBbGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hlY2tlZENoYW5nZSk9XCJjaGVja0NoYW5nZWQoJGV2ZW50LCBpdGVtKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3plbi1ncm91cHM+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIERhdGUgcmFuZ2UgcGlja2VyIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cIidkYXRlUmFuZ2UnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gIE9wdGlvbnMgZGF0ZSByYW5nZSB2aWV3ICAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIml0ZW0uZGF0ZVJhbmdlT3B0aW9ucz8ubGVuZ3RoXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgaXRlbS5kYXRlUmFuZ2VPcHRpb25zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFjdGlvbi1pdGVtLXJhZGlvIGRzLWl0ZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHplbi1yYWRpbyBbdmFsdWVdPVwib3B0aW9uLm5hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJvcHRpb24ubmFtZSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25hbWVdPVwiaXRlbS5rZXlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxlY3RlZF09XCJzZWxlY3RlZERhdGVSYW5nZU9wdGlvbnNbaXRlbS5rZXldID09PSBvcHRpb24ubmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJhZGlvQ2hhbmdlKT1cImhhbmRsZURhdGVSYW5nZU9wdGlvbkNsaWNrKGl0ZW0sIG9wdGlvbilcIj48L3plbi1yYWRpbz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFjdGlvbi1pdGVtLXJhZGlvIGRzLWl0ZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8emVuLXJhZGlvIFt2YWx1ZV09XCInQ3VzdG9tJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiJ0N1c3RvbScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25hbWVdPVwiaXRlbS5rZXlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NlbGVjdGVkXT1cInNlbGVjdGVkRGF0ZVJhbmdlT3B0aW9uc1tpdGVtLmtleV0gPT09ICdDdXN0b20nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyYWRpb0NoYW5nZSk9XCJoYW5kbGVDdXN0b21EYXRlUmFuZ2VDbGljayhpdGVtKVwiPjwvemVuLXJhZGlvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2VsZWN0ZWREYXRlUmFuZ2VPcHRpb25zW2l0ZW0ua2V5XSA9PT0gJ0N1c3RvbSdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHMtaXRlbSBmaWx0ZXItcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsYmxcIj57eydGcm9tJyB8IHRyYW5zbGF0ZX19OjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8emVuLWRhdGVwaWNrZXIgY2xhc3M9XCJ3aWR0aC1mdWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsoZGF0ZSldPVwiaXRlbS5kYXRlUmFuZ2Uuc3RhcnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Nob3dUaW1lXT1cIml0ZW0uc2hvd1RpbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3lQb3NpdGlvbl09XCJpdGVtLmNvbmZpZz8ueVBvc2l0aW9uID8/IGRhdGVwaWNrZXJQb3NpdGlvbi5BVVRPXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwYXJlbnRDb250YWluZXJdPVwibWFpbkNvbXBvbmVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3plbi1kYXRlcGlja2VyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcy1pdGVtIGZpbHRlci1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxibFwiPnt7J1RvJyB8IHRyYW5zbGF0ZX19OjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8emVuLWRhdGVwaWNrZXIgY2xhc3M9XCJ3aWR0aC1mdWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsoZGF0ZSldPVwiaXRlbS5kYXRlUmFuZ2UuZW5kXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93VGltZV09XCJpdGVtLnNob3dUaW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt5UG9zaXRpb25dPVwiaXRlbS5jb25maWc/LnlQb3NpdGlvbiA/PyBkYXRlcGlja2VyUG9zaXRpb24uQVVUT1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGF0ZUNoYW5nZSk9XCJoYW5kbGVFbmREYXRlQ2hhbmdlKGl0ZW0pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwYXJlbnRDb250YWluZXJdPVwibWFpbkNvbXBvbmVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3plbi1kYXRlcGlja2VyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gIERlZmF1bHQgZGF0ZSByYW5nZSB2aWV3ICAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpdGVtLmRhdGVSYW5nZU9wdGlvbnM/Lmxlbmd0aFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRzLWl0ZW0gZmlsdGVyLXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsYmxcIj57eydGcm9tJyB8IHRyYW5zbGF0ZX19OjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx6ZW4tZGF0ZXBpY2tlciBjbGFzcz1cIndpZHRoLWZ1bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKGRhdGUpXT1cIml0ZW0uZGF0ZVJhbmdlLnN0YXJ0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Nob3dUaW1lXT1cIml0ZW0uc2hvd1RpbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbeVBvc2l0aW9uXT1cIml0ZW0uY29uZmlnPy55UG9zaXRpb24gPz8gZGF0ZXBpY2tlclBvc2l0aW9uLkFVVE9cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGFyZW50Q29udGFpbmVyXT1cIm1haW5Db21wb25lbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3plbi1kYXRlcGlja2VyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHMtaXRlbSBmaWx0ZXItcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxibFwiPnt7J1RvJyB8IHRyYW5zbGF0ZX19OjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx6ZW4tZGF0ZXBpY2tlciBjbGFzcz1cIndpZHRoLWZ1bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKGRhdGUpXT1cIml0ZW0uZGF0ZVJhbmdlLmVuZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93VGltZV09XCJpdGVtLnNob3dUaW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3lQb3NpdGlvbl09XCJpdGVtLmNvbmZpZz8ueVBvc2l0aW9uID8/IGRhdGVwaWNrZXJQb3NpdGlvbi5BVVRPXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRhdGVDaGFuZ2UpPVwiaGFuZGxlRW5kRGF0ZUNoYW5nZShpdGVtKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwYXJlbnRDb250YWluZXJdPVwibWFpbkNvbXBvbmVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvemVuLWRhdGVwaWNrZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIERhdGUgcGlja2VyIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cIidkYXRlJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHMtaXRlbSBmaWx0ZXItcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGJsXCI+e3snRGF0ZScgfCB0cmFuc2xhdGV9fTo8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx6ZW4tZGF0ZXBpY2tlciBjbGFzcz1cIndpZHRoLWZ1bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsoZGF0ZSldPVwiaXRlbS5kYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2hvd1RpbWVdPVwiaXRlbS5zaG93VGltZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BhcmVudENvbnRhaW5lcl09XCJtYWluQ29tcG9uZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3plbi1kYXRlcGlja2VyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gTnVtYmVyIHJhbmdlIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cIidudW1iZXJSYW5nZSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmaWx0ZXItcm93IG51bWJlci1yYW5nZS1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsYmxcIj57eydNaW4nIHwgdHJhbnNsYXRlfX06PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJtYXRlcmlhbC1pbnB1dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJpdGVtLm51bWJlclJhbmdlLmZyb21cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsYmxcIj57eydNYXgnIHwgdHJhbnNsYXRlfX06PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJtYXRlcmlhbC1pbnB1dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJpdGVtLm51bWJlclJhbmdlLnRvXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFJhZGlvIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cIidyYWRpbydcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIGl0ZW0ucmFkaW9PcHRpb25zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFjdGlvbi1pdGVtLXJhZGlvIGRzLWl0ZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx6ZW4tcmFkaW8gW3ZhbHVlXT1cIm9wdGlvbi5pZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJvcHRpb24ubmFtZSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cIml0ZW0ua2V5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ltYWdlVXJsXT1cIm9wdGlvbi5pbWFnZVVybFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxlY3RlZF09XCJvcHRpb24uc2VsZWN0ZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmFkaW9DaGFuZ2UpPVwicmFkaW9DaGFuZ2VkKCRldmVudCwgaXRlbSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwib3B0aW9uLmRpc2FibGVkXCI+PC96ZW4tcmFkaW8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwic2hvd05vRmlsdGVyUmVzdWx0XCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwibm8taXRlbVwiPnt7J05vIFJlc3VsdHMgRm91bmQnIHwgdHJhbnNsYXRlfX0uLjwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImFjdGlvbi1tZW51LWZvb3RlciBmaWx0ZXItZm9vdGVyXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNlbGVjdGVkLWNvdW50XCIgKm5nSWY9XCJoYXNNdWx0aXNlbGVjdEl0ZW1zXCI+e3sgc2VsZWN0ZWRDb3VudCB9fSB7eydTZWxlY3RlZCcgfCB0cmFuc2xhdGV9fTwvc3Bhbj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWx0ZXItZm9vdGVyLWFjdGlvbnNcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJyZXNldCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmlsdGVyLWJ0bi1jbGVhclwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuaGFzLXNlbGVjdGlvbl09XCJzZWxlY3RlZENvdW50ID4gMCAmJiBoYXNNdWx0aXNlbGVjdEl0ZW1zXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7J0NsZWFyIEZpbHRlcicgfCB0cmFuc2xhdGV9fVxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cImFwcGx5KClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmaWx0ZXItYnRuLWFwcGx5XCI+XG4gICAgICAgICAgICAgICAgICAgIHt7J0FwcGx5JyB8IHRyYW5zbGF0ZX19XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuIl19