@libs-ui/components-table 0.2.234 → 0.2.235

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.
@@ -655,7 +655,7 @@ export class LibsUiComponentsTableComponent {
655
655
  clearTimeout(this.timeoutLeaveItem());
656
656
  }
657
657
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LibsUiComponentsTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
658
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: LibsUiComponentsTableComponent, isStandalone: true, selector: "libs_ui-components-table", inputs: { timeHighlighNewItem: { classPropertyName: "timeHighlighNewItem", publicName: "timeHighlighNewItem", isSignal: true, isRequired: false, transformFunction: null }, headerLeft: { classPropertyName: "headerLeft", publicName: "headerLeft", isSignal: true, isRequired: false, transformFunction: null }, headerRight: { classPropertyName: "headerRight", publicName: "headerRight", isSignal: true, isRequired: false, transformFunction: null }, configTemplateItemCollapseExpand: { classPropertyName: "configTemplateItemCollapseExpand", publicName: "configTemplateItemCollapseExpand", isSignal: true, isRequired: false, transformFunction: null }, showFooter: { classPropertyName: "showFooter", publicName: "showFooter", isSignal: true, isRequired: false, transformFunction: null }, ignoreBorderFooter: { classPropertyName: "ignoreBorderFooter", publicName: "ignoreBorderFooter", isSignal: true, isRequired: false, transformFunction: null }, customPositionFooter: { classPropertyName: "customPositionFooter", publicName: "customPositionFooter", isSignal: true, isRequired: false, transformFunction: null }, footerLeft: { classPropertyName: "footerLeft", publicName: "footerLeft", isSignal: true, isRequired: false, transformFunction: null }, footerRight: { classPropertyName: "footerRight", publicName: "footerRight", isSignal: true, isRequired: false, transformFunction: null }, disableCheckbox: { classPropertyName: "disableCheckbox", publicName: "disableCheckbox", isSignal: true, isRequired: false, transformFunction: null }, enableUnequalChildrenSizes: { classPropertyName: "enableUnequalChildrenSizes", publicName: "enableUnequalChildrenSizes", isSignal: true, isRequired: false, transformFunction: null }, bufferAmount: { classPropertyName: "bufferAmount", publicName: "bufferAmount", isSignal: true, isRequired: false, transformFunction: null }, totalItem: { classPropertyName: "totalItem", publicName: "totalItem", isSignal: true, isRequired: false, transformFunction: null }, isDashBorder: { classPropertyName: "isDashBorder", publicName: "isDashBorder", isSignal: true, isRequired: false, transformFunction: null }, classHeaderContainerInclude: { classPropertyName: "classHeaderContainerInclude", publicName: "classHeaderContainerInclude", isSignal: true, isRequired: false, transformFunction: null }, classHeaderLeftInclude: { classPropertyName: "classHeaderLeftInclude", publicName: "classHeaderLeftInclude", isSignal: true, isRequired: false, transformFunction: null }, classBodyInclude: { classPropertyName: "classBodyInclude", publicName: "classBodyInclude", isSignal: true, isRequired: false, transformFunction: null }, classFooterInclude: { classPropertyName: "classFooterInclude", publicName: "classFooterInclude", isSignal: true, isRequired: false, transformFunction: null }, classTableContainerInclude: { classPropertyName: "classTableContainerInclude", publicName: "classTableContainerInclude", isSignal: true, isRequired: false, transformFunction: null }, classBarInclude: { classPropertyName: "classBarInclude", publicName: "classBarInclude", isSignal: true, isRequired: false, transformFunction: null }, fieldKey: { classPropertyName: "fieldKey", publicName: "fieldKey", isSignal: true, isRequired: false, transformFunction: null }, defaultKeysSelected: { classPropertyName: "defaultKeysSelected", publicName: "defaultKeysSelected", isSignal: true, isRequired: false, transformFunction: null }, labelBarNoSelectItem: { classPropertyName: "labelBarNoSelectItem", publicName: "labelBarNoSelectItem", isSignal: true, isRequired: false, transformFunction: null }, labelBarButtons: { classPropertyName: "labelBarButtons", publicName: "labelBarButtons", isSignal: true, isRequired: false, transformFunction: null }, classLabelBarButtons: { classPropertyName: "classLabelBarButtons", publicName: "classLabelBarButtons", isSignal: true, isRequired: false, transformFunction: null }, barButtons: { classPropertyName: "barButtons", publicName: "barButtons", isSignal: true, isRequired: false, transformFunction: null }, sortLocal: { classPropertyName: "sortLocal", publicName: "sortLocal", isSignal: true, isRequired: false, transformFunction: null }, filterOrSortLocal: { classPropertyName: "filterOrSortLocal", publicName: "filterOrSortLocal", isSignal: true, isRequired: false, transformFunction: null }, httpRequestData: { classPropertyName: "httpRequestData", publicName: "httpRequestData", isSignal: true, isRequired: false, transformFunction: null }, httpRequestDataFooter: { classPropertyName: "httpRequestDataFooter", publicName: "httpRequestDataFooter", isSignal: true, isRequired: false, transformFunction: null }, newData: { classPropertyName: "newData", publicName: "newData", isSignal: true, isRequired: false, transformFunction: null }, filter: { classPropertyName: "filter", publicName: "filter", isSignal: true, isRequired: false, transformFunction: null }, ignoreBar: { classPropertyName: "ignoreBar", publicName: "ignoreBar", isSignal: true, isRequired: false, transformFunction: null }, classLabelBarNoSelectItem: { classPropertyName: "classLabelBarNoSelectItem", publicName: "classLabelBarNoSelectItem", isSignal: true, isRequired: false, transformFunction: null }, ignoreClassBgHeader: { classPropertyName: "ignoreClassBgHeader", publicName: "ignoreClassBgHeader", isSignal: true, isRequired: false, transformFunction: null }, noDataConfig: { classPropertyName: "noDataConfig", publicName: "noDataConfig", isSignal: true, isRequired: false, transformFunction: null }, showScrollTablePinnedIfNoData: { classPropertyName: "showScrollTablePinnedIfNoData", publicName: "showScrollTablePinnedIfNoData", isSignal: true, isRequired: false, transformFunction: null }, ignoreBorderItemLast: { classPropertyName: "ignoreBorderItemLast", publicName: "ignoreBorderItemLast", isSignal: true, isRequired: false, transformFunction: null }, isHiddenHeaderWhenNodata: { classPropertyName: "isHiddenHeaderWhenNodata", publicName: "isHiddenHeaderWhenNodata", isSignal: true, isRequired: false, transformFunction: null }, maxItemSelected: { classPropertyName: "maxItemSelected", publicName: "maxItemSelected", isSignal: true, isRequired: false, transformFunction: null }, configSelectMoreItem: { classPropertyName: "configSelectMoreItem", publicName: "configSelectMoreItem", isSignal: true, isRequired: false, transformFunction: null }, onlyShowNoResult: { classPropertyName: "onlyShowNoResult", publicName: "onlyShowNoResult", isSignal: true, isRequired: false, transformFunction: null }, ignoreBorderItem: { classPropertyName: "ignoreBorderItem", publicName: "ignoreBorderItem", isSignal: true, isRequired: false, transformFunction: null }, templateNoData: { classPropertyName: "templateNoData", publicName: "templateNoData", isSignal: true, isRequired: false, transformFunction: null }, templateNoResult: { classPropertyName: "templateNoResult", publicName: "templateNoResult", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { outLoadMore: "outLoadMore", outScrollIsGone: "outScrollIsGone", outLoading: "outLoading", outClickButtonAction: "outClickButtonAction", outSort: "outSort", outClickBarButton: "outClickBarButton", outHoverButtonAction: "outHoverButtonAction", outKeysSelected: "outKeysSelected", outFunctionsControl: "outFunctionsControl", outLoadDataComplete: "outLoadDataComplete", outTotalItem: "outTotalItem", outLoadDataError: "outLoadDataError" }, viewQueries: [{ propertyName: "headerElementRef", first: true, predicate: ["headerElementRef"], descendants: true, isSignal: true }, { propertyName: "footerElementRef", first: true, predicate: ["footerElementRef"], descendants: true, isSignal: true }, { propertyName: "footerLeftElementRef", first: true, predicate: ["footerLeftElementRef"], descendants: true, isSignal: true }, { propertyName: "bodyElementRef", first: true, predicate: ["bodyElementRef"], descendants: true, isSignal: true }, { propertyName: "bodyComponentRef", first: true, predicate: ["bodyComponentRef"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class='flex flex-col w-full h-full'>\n @if (!ignoreBar()) {\n <div\n class=\"flex items-center relative z-[1] bottom-0 left-0 w-full bg-white libs-ui-table-shadow-bottom {{ classBarInclude() }}\"\n [class.px-[16px]]=\"keysSelected().length || labelBarNoSelectItem()\"\n [class.py-[6px]]=\"keysSelected().length || labelBarNoSelectItem()\"\n (mouseenter)=\"resetIndexHover($event)\">\n <ng-content select='div.libs-ui-table-bar-left'></ng-content>\n @if (!keysSelected().length && labelBarNoSelectItem()) {\n <div class=\"{{ classLabelBarNoSelectItem() ?? 'px-[12px] py-[5px]' }}\"\n [innerHtml]='labelBarNoSelectItem() | translate:{value:totalItemDisplay()}'>\n </div>\n }\n @if (keysSelected().length) {\n <div class=\"flex items-center pl-[12px]\">\n <div class=\"flex items-center h-full mt-[-2px]\">\n <libs_ui-components-checkbox-single [checked]=\"true\"\n [disable]=\"loading() || disableCheckbox()\"\n (outChange)=\"handlerChangeAllChecked()\" />\n </div>\n <div class=\"libs-ui-font-h5m text-[#071631] mr-[8px] {{ classLabelBarButtons() }}\">\n {{ labelBarButtons() | translate:{ value:keysSelected().length } }}\n </div>\n @if (configSelectMoreItem()) {\n <libs_ui-components-dropdown [isNgContent]=\"true\"\n [popoverCustomConfig]=\"{\n widthByParent:false,\n ignoreArrow: true,\n maxHeight: 2048,\n classInclude:'!w-[121px]',\n position: {\n mode:'start',\n distance:0\n }\n }\"\n [listConfig]=\"listConfigMoreItem()\"\n [listHiddenInputSearch]=\"true\"\n [listMaxItemShow]=\"5\"\n class=\"!w-[16px] h-[16px] mr-[8px]\"\n (outSelectKey)=\"handlerSelectedMoreItem($event)\"\n (outFunctionsControl)=\"handlerFunctionControlMoreSelectItem($event)\">\n <libs_ui-components-buttons-button [type]=\"'button-link-primary'\"\n [classInclude]=\"'!p-0 m-0'\"\n [classIconLeft]=\"'before:!text-[16px] libs-ui-icon-move-right rotate-90 mr-[6px]'\"\n [popover]=\"{config:{content:'i18n_more_select'}}\"\n [ignoreStopPropagationEvent]=\"true\" />\n </libs_ui-components-dropdown>\n }\n <div class=\"h-[16px] libs-ui-border-left-general ml-[16px]\"></div>\n @if (barButtons()?.length) {\n @for (button of barButtons();track button) {\n <libs_ui-components-buttons-button [type]=\"button.type || 'button-link-primary'\"\n [classIconLeft]=\"button.classIconLeft || ''\"\n [classInclude]=\"button.classInclude || ''\"\n [label]=\"(button.label || ' ') | translate\"\n (outClick)=\"handlerBarButtonClick(button)\" />\n }\n }\n </div>\n }\n <ng-content select='div.libs-ui-table-bar-right'></ng-content>\n </div>\n }\n\n <div #tableContainerElementRef\n class=\"libs-ui-table flex flex-col w-full h-full relative {{ classTableContainerInclude() }}\"\n [class.px-[16px]]='!ignoreBar()'\n (mouseleave)=\"handlerMouseLeaveContainer($event)\">\n <div class=\"relative w-full\"\n [style.height.px]=\"headerElementRef.offsetHeight\">\n <div #headerElementRef\n LibsUiComponentsScrollOverlayDirective\n [options]=\"{scrollbarWidth: 0}\"\n [class.libs-ui-border-bottom-dashed-general]=\"!hasItemHightLight() && isDashBorder()\"\n [class.libs-ui-border-bottom-general]=\"!hasItemHightLight() && !isDashBorder()\"\n [class.!hidden]=\"!items().length && isHiddenHeaderWhenNodata()\"\n [class]=\"classHeaderContainer()\"\n (outScroll)=\"handlerScrollHeader($event)\"\n (mouseenter)=\"handlerMouseEnterHeader($event)\"\n (mouseleave)=\"handlerMouseLeaveHeader($event)\">\n @if (headerLeft().length) {\n <div [class]=\"classHeaderLeftContainer()\">\n @for (header of headerLeft();track header) {\n <ng-container *ngTemplateOutlet=\"templateHeaderRef;context:{headerItem:header,isHeaderLeft:true}\" />\n }\n </div>\n }\n @if (headerRight().length) {\n @for (header of headerRight();track header) {\n <ng-container *ngTemplateOutlet=\"templateHeaderRef;context:{headerItem:header,isHeaderLeft:false}\" />\n }\n }\n </div>\n </div>\n @if (showFooter() && itemFooter() && customPositionFooter() === 'top') {\n <ng-container *ngTemplateOutlet='templateFooterRef' />\n }\n <div class=\"relative flex flex-col w-full h-full overflow-x-hidden bg-white {{ classBodyInclude() || '' }}\">\n <div #bodyElementRef\n class=\"flex h-full w-full relative\"\n LibsUiComponentsScrollOverlayDirective\n (outScroll)=\"handlerScrollBody($event)\"\n (outScrollBottom)=\"handlerScrollBottom($event)\">\n @if (items().length) {\n <virtual-scroller #bodyComponentRef\n [items]=\"items()\"\n [enableUnequalChildrenSizes]=\"enableUnequalChildrenSizes()\"\n class=\"h-full\"\n [style.width.px]=\"headerElementRef.scrollWidth > (bodyElementRef ? bodyElementRef.scrollWidth : 0) ? headerElementRef.scrollWidth: undefined\"\n [parentScroll]=\"bodyElementRef\"\n [bufferAmount]=\"bufferAmount()\">\n @for (data of bodyComponentRef.viewPortItems;track data()) {\n <div #elementHover\n class=\"flex\"\n [class.bg-[#f3fcfc]]=\"data().specificHightLight\"\n [class.libs-ui-border-top-1px-36d3d3]=\"data().specificHightLight && $first && !ignoreBorderItem()\"\n [class.libs-ui-border-bottom-1px-36d3d3]=\"data().specificHightLight && !ignoreBorderItem()\"\n [ngClass]=\"(data().specificHightLight || ($last && ignoreBorderItemLast())) ? 'libs-ui-border-radius-bottom-left-4px libs-ui-border-radius-bottom-right-4px' : ignoreBorderItem() ? '' : isDashBorder() ? 'libs-ui-border-bottom-dashed-general' : 'libs-ui-border-bottom-general'\"\n [style.width.px]=\"headerElementRef.scrollWidth\"\n [class.bg-[#f8f9fa]]=\"itemOfIndexHover === data && !data().specificHightLight\"\n (mouseenter)=\"setIndexHover($event,data)\"\n (mouseleave)=\"resetIndexHoverWhenMouseLeave($event)\">\n @if (headerLeft().length || headerRight().length) {\n <div class=\"flex flex-col w-full\">\n <div class=\"flex w-full\">\n @if (headerLeft().length) {\n <div class=\"flex sticky top-0 left-0 z-[1]\"\n [class.bg-white]=\"!data().specificHightLight\"\n [class.bg-[#f3fcfc]]=\"data().specificHightLight\">\n @for (header of headerLeft();track header) {\n <div\n class=\"relative flex px-[12px] py-[8px] {{ header.ignoreBorderRight ? '': 'libs-ui-border-right-general' }}\"\n [class.bg-[#f8f9fa]]=\"itemOfIndexHover === data && !data().specificHightLight\"\n [ngStyle]=\"(header|LibsUiTableCalculatorColumnPipe:headerElementRef.clientWidth:headerLeft():headerRight()) || (header.isShowIndexOnRow ? {width:'50px','flex-shirk':'0',padding:'8px'} : {})\"\n [ngClass]=\"header.ngClass || {}\">\n <ng-container *ngTemplateOutlet=\"templateBodyRef;context:{header:header,data:data}\" />\n </div>\n }\n </div>\n }\n @if (headerRight().length) {\n @for (header of headerRight();track header) {\n <div class=\"relative flex px-[12px] py-[8px]\"\n [ngStyle]=\"(header|LibsUiTableCalculatorColumnPipe:headerElementRef.clientWidth:headerLeft():headerRight()) || (header.isShowIndexOnRow ? {width:'50px','flex-shirk':'0',padding:'8px'} : {})\"\n [ngClass]=\"header.ngClass || {}\">\n <ng-container *ngTemplateOutlet=\"templateBodyRef;context:{header:header,data:data}\" />\n </div>\n }\n }\n </div>\n @if (configTemplateItemCollapseExpand() && data().specificExpand && data()[configTemplateItemCollapseExpand()?.fieldGetDataExpand || 'specificDataExpand']) {\n <div [class]=\"configTemplateItemCollapseExpand()?.cssWrapper || 'flex w-full'\">\n @for (dataExpand of data()[configTemplateItemCollapseExpand()?.fieldGetDataExpand || 'specificDataExpand']();track $index) {\n @if (configTemplateItemCollapseExpand()?.colTemplateConfig) {\n <libs_ui-components-table-templates [item]=\"dataExpand\"\n [templateCssWrapper]=\"configTemplateItemCollapseExpand()?.templateCssWrapper\"\n [configs]=\"configTemplateItemCollapseExpand()?.colTemplateConfig\" />\n }\n } @empty {\n <div class=\"relative h-[100px]\">\n <ng-container *ngTemplateOutlet=\"templateNodataRef\" />\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n </virtual-scroller>\n } @else if (!loading()) {\n <div class=\"sticky left-0 top-0 z-[1] h-full w-full\">\n <ng-container *ngTemplateOutlet=\"templateNodataRef\" />\n </div>\n @if (showScrollTablePinnedIfNoData()) {\n <div class=\"absolute h-[1px] bg-transparent top-0 left-0 z-[1]\"\n [style.width.px]=\"headerElementRef.scrollWidth\"></div>\n }\n }\n </div>\n\n @if (showFooter() && itemFooter() && customPositionFooter() === 'bottom') {\n <ng-container *ngTemplateOutlet='templateFooterRef' />\n }\n\n @if (loading()) {\n <div class=\"absolute w-full h-full z-[2] flex items-center content-center\">\n <libs_ui-components-spinner />\n </div>\n }\n </div>\n </div>\n</div>\n\n<ng-template #templateHeaderRef\n let-header='headerItem'\n let-isHeaderLeft='isHeaderLeft'>\n <div\n [class]=\"'relative flex '+ (header.paddingLeftRightHeaderContainer ?? ' px-[12px] ') + (isHeaderLeft && !header.ignoreBorderRight ? ' libs-ui-border-right-general ' : ' ')+ ' libs-ui-table-header-col '\"\n [class.flex-col]=\"header.rowsConfig\"\n [class.py-[8px]]='!header.ignorePyDefault'\n [ngStyle]=\"(header|LibsUiTableCalculatorColumnPipe:headerElementRef.clientWidth:headerLeft():headerRight()) || (header.isShowIndexOnRow ? {width:'50px','flex-shirk':'0',padding:'8px'} : {})\"\n [ngClass]=\"header.ngClass || {}\">\n @if (!header.rowsConfig) {\n <ng-container *ngTemplateOutlet=\"templateHeaderContentRef;context:{headerItem:header,isColRender:false}\" />\n }\n @if (header.rowsConfig;as rowsConfig) {\n @for (row of rowsConfig.rows;track row) {\n <div [class]=\"row.classRow\">\n @for (col of row.cols ; track col) {\n <ng-container *ngTemplateOutlet=\"templateHeaderContentRef;context:{headerItem:col,isColRender:true}\" />\n }\n </div>\n }\n }\n </div>\n</ng-template>\n\n<ng-template #templateHeaderContentRef\n let-header='headerItem'\n let-isColRender='isColRender'>\n <div class=\"flex libs-ui-font-h6m min-h-[18px] text-[#6a7383] max-w-full\"\n [class.items-center]='header.contentHeaderAlignCenter ?? true'\n [class.justify-end]='header.contentHeaderJustifyContentEnd'\n [class.w-full]=\"header.isShowIndexOnRow\"\n [ngStyle]=\"isColRender ? ((header|LibsUiTableCalculatorColumnPipe:headerElementRef.clientWidth:headerLeft():headerRight()) || (header.isShowIndexOnRow ? {width:'50px','flex-shirk':'0',padding:'8px'} : {})) : {}\"\n [ngClass]=\"isColRender ? (header.ngClass || {}) : {}\">\n @if (header.hasCheckbox) {\n @if (header.hasCheckboxAll) {\n <div class=\"flex h-full {{ header.checkboxAllClassInclude || 'mr-[16px]' }}\"\n [class.items-center]=\"header.checkboxAlignCenter\">\n <libs_ui-components-checkbox-single [key]=\"'all'\"\n [stillOtherOptions]=\"!!keysSelected().length && keysSelected().length !== items().length\"\n [checked]=\"!!keysSelected().length && keysSelected().length === items().length\"\n [disable]=\"loading()\"\n [classInclude]=\"header.checkboxClassInclude\"\n (outChange)=\"handlerChangeCheckedAllItems($event)\" />\n </div>\n } @else {\n <div class=\"flex h-full ml-[24px] {{ header.checkboxClassInclude }}\">\n </div>\n }\n }\n @for (tooltip of header.tooltipsLeft; track tooltip) {\n <div class=\"mr-[4px]\">\n <libs_ui-components-popover [type]=\"tooltip?.type || 'other'\"\n [mode]=\"tooltip?.mode || 'hover'\"\n [classInclude]=\"tooltip.classInclude || 'text-[#6a7383]'\"\n [ignoreShowPopover]=\"tooltip.ignoreShowTooltip || false\"\n [config]=\"tooltip.config || {content:(tooltip.dataView || ' ') | translate, position: {\n mode: 'center',\n distance: 0,\n autoUpdatePosition: {\n endDistance: 12,\n startDistance: -12\n }\n }}\"\n [innerHTML]=\"tooltip.dataView\" />\n </div>\n }\n\n @if (header.isShowIndexOnRow) {\n <div class=\"flex w-full h-full items-center justify-center {{ header.classIncludeIndexOnRow || '' }}\">\n {{ header.label ?? '#' }}\n </div>\n } @else {\n @if ((header.label | LibsUiPipesCallFunctionInTemplatePipe:header.parseValue:header) | async | translate; as labelHeaderColumn) {\n <libs_ui-components-popover [type]=\"header?.labelConfig?.type || 'text'\"\n [mode]=\"header?.labelConfig?.mode || 'hover'\"\n [classInclude]=\"(header?.labelConfig?.classInclude || '')\"\n [ignoreShowPopover]=\"header?.labelConfig?.ignoreShowTooltip || false\"\n [config]=\"header.labelConfig?.config || {content:labelHeaderColumn}\"\n [innerHTML]=\"labelHeaderColumn\" />\n }\n }\n\n @for (tooltip of header.tooltipsRight; track tooltip) {\n <div class=\"ml-[4px]\">\n <libs_ui-components-popover [type]=\"tooltip?.type || 'other'\"\n [mode]=\"tooltip?.mode || 'hover'\"\n [classInclude]=\"tooltip.classInclude || 'text-[#6a7383]'\"\n [ignoreShowPopover]=\"tooltip.ignoreShowTooltip || false\"\n [config]=\"tooltip.config || {content:(tooltip.dataView || ' ') | translate, position: {\n mode: 'center',\n distance: 0,\n autoUpdatePosition: {\n endDistance: 12,\n startDistance: -12\n }\n }}\"\n [innerHTML]=\"tooltip.dataView\" />\n </div>\n }\n\n @if (header.hasSort && header.orderby) {\n <div class=\"ml-[4px]\">\n <libs_ui-components-buttons-sort-arrow [disable]=\"loading() || !items().length\"\n [fieldSort]=\"header.orderby\"\n [ignorePopoverContent]=\"header.sortIgnoreTooltipContent ?? true\"\n [popoverContentAsc]=\"header.sortTooltipContentAsc\"\n [popoverContentDesc]=\"header.sortTooltipContentDesc\"\n [defaultMode]=\"header.defaultMode\"\n [zIndex]=\"header.zIndexTooltipSort\"\n (outChange)=\"handlerChangeSort($event)\" />\n </div>\n }\n </div>\n @if (header.labelDescription) {\n <div class=\"flex\">\n <libs_ui-components-popover [type]=\"'text'\"\n [classInclude]=\"header.labelDescription.classInclude || ''\"\n [config]=\"{content: header.labelDescription.content | translate}\"\n [innerHTML]=\"header.labelDescription.content | translate\" />\n </div>\n }\n</ng-template>\n\n<ng-template #templateBodyRef\n let-header='header'\n let-data='data'>\n <div class=\"flex w-full h-full\">\n @if (header.hasCheckbox) {\n <div class=\"flex h-full\"\n [class.invisible]=\"header.checkConditionCheckBoxHidden &&( data() | LibsUiPipesCallFunctionInTemplatePipe:header.checkConditionCheckBoxHidden:data() | async)\"\n [class.items-center]=\"header.checkboxAlignCenter\">\n <libs_ui-components-checkbox-single [key]=\"data()[fieldKey()]\"\n [classInclude]=\"header.checkboxClassInclude\"\n [checked]=\"data()[fieldKey()] | LibsUiPipesCheckSelectedByKeyPipe:keysSelected():keysSelected().length\"\n [disable]=\"loading() || disableCheckbox() || !!(maxItemSelected() && !(data()[fieldKey()] | LibsUiPipesCheckSelectedByKeyPipe:keysSelected():keysSelected().length) && keysSelected().length >= maxItemSelected())\"\n (outChange)=\"handlerChangeItemChecked($event,data())\" />\n </div>\n }\n\n @if (header.isShowIndexOnRow; as config) {\n <div class=\"w-full flex items-center justify-center libs-ui-font-h4r{{ config.classIncludeIndexOnRow || '' }}\">\n <div LibsUiComponentsPopoverDirective\n [type]=\"'text'\"\n [config]=\"{}\"\n [innerHTML]=\"data | LibsUiPipesCallFunctionInTemplatePipe:getIndexRow | async\">\n </div>\n </div>\n }\n\n @if (header.colTemplateConfig) {\n <libs_ui-components-table-templates [isHover]=\"itemOfIndexHover === data && !data.specificHightLight\"\n [class]=\"header.templateCssWrapperHost || ''\"\n [item]=\"data\"\n [templateCssWrapper]=\"header.templateCssWrapper\"\n [configs]=\"header.colTemplateConfig\" />\n }\n </div>\n</ng-template>\n\n<ng-template #templateFooterRef>\n @if (!isHiddenHeaderWhenNodata() || (isHiddenHeaderWhenNodata() && items().length)) {\n <div #footerElementRef\n class=\"flex w-full bg-[#f8f9fa] overflow-x-hidden z-[1] {{ ignoreBorderFooter() ? '': (customPositionFooter() === 'top' ? 'libs-ui-border-bottom-general':'libs-ui-table-shadow-top libs-ui-border-top-general') }} min-h-[35px]\"\n (mouseenter)=\"handlerMouseEnterFooter($event)\"\n (mouseleave)=\"handlerMouseLeaveFooter($event)\">\n @if (footerLeft()) {\n <div #footerLeftElementRef\n class=\"flex sticky top-0 left-0 z-[1] bg-[#f8f9fa]\">\n @for (footer of footerLeft();track footer) {\n <div\n class=\"flex items-center px-[12px] py-[8px] {{ footer.ignoreBorderRight ? '': 'libs-ui-border-right-general' }}\"\n [ngStyle]=\"(footer|LibsUiTableCalculatorColumnPipe:headerElementRef.clientWidth:footerLeft():footerRight()) || {}\"\n [ngClass]=\"footer.ngClass || {}\">\n @if (footer.colTemplateConfig && itemFooter()) {\n <libs_ui-components-table-templates [item]=\"itemFooter|LibsUiPipesConvertObjectToSignalPipe\"\n [templateCssWrapper]=\"footer.templateCssWrapper\"\n [configs]=\"footer.colTemplateConfig\" />\n }\n </div>\n }\n </div>\n }\n @if (footerRight()) {\n @for (footer of footerRight();track footer) {\n <div class=\"flex items-center px-[12px] py-[8px]\"\n [ngStyle]=\"(footer|LibsUiTableCalculatorColumnPipe:headerElementRef.clientWidth:footerLeft():footerRight()) || {}\"\n [ngClass]=\"footer.ngClass || {}\">\n @if (footer.colTemplateConfig && itemFooter()) {\n <libs_ui-components-table-templates [item]=\"itemFooter|LibsUiPipesConvertObjectToSignalPipe\"\n [templateCssWrapper]=\"footer.templateCssWrapper\"\n [configs]=\"footer.colTemplateConfig\" />\n }\n </div>\n }\n }\n\n </div>\n }\n</ng-template>\n\n<ng-template #templateNodataRef>\n @if (!keySearch() && templateNoData(); as templateNoData) {\n <ng-container *ngTemplateOutlet=\"templateNoData\" />\n } @if (keySearch() && templateNoResult(); as templateNoResult) {\n <ng-container *ngTemplateOutlet=\"templateNoResult\" />\n }\n @if (!templateNoData() && !templateNoResult() && noDataConfig(); as config) {\n <div class=\"flex items-center justify-center w-full h-full absolute left-0 top-0 z-[1]\">\n <div class=\"flex flex-col items-center justify-center w-full h-full shrink-0\"\n LibsUiComponentsScrollOverlayDirective>\n @if (!keySearch() && !onlyShowNoResult()) {\n <ng-container *ngComponentOutlet=\" ('no-data' | LibsUiIconsGetIconComponentPipe | async);inputs:{size:64}\" />\n <div class=\"libs-ui-table-no-data-config-text\"\n [ngStyle]=\"config.ngStyle || {}\"\n [ngClass]=\"config.ngClass || {}\"\n [innerHtml]=\"config.textNoData | translate\">\n </div>\n }\n @if (keySearch() || onlyShowNoResult()) {\n <ng-container *ngComponentOutlet=\"('no-result' | LibsUiIconsGetIconComponentPipe | async);inputs:{size:64}\" />\n <div class=\"libs-ui-table-no-data-config-text\"\n [ngStyle]=\"config.ngStyle || {}\"\n [ngClass]=\"config.ngClass || {}\"\n [innerHtml]=\"config.textSearchNoData | translate\">\n </div>\n }\n </div>\n </div>\n }\n</ng-template>\n", styles: [".libs-ui-table-header-container{height:33px;flex-shrink:0}.libs-ui-table-header-col{height:100%;width:100%;align-items:center}.libs-ui-table-no-data-config-text{margin-top:16px;font-size:12px;color:#9ca2ad;font-family:var(--libs-ui-font-family-name, \"Arial\");font-weight:400}.libs-ui-table-no-data-config-icon{margin-bottom:12px}.libs-ui-table-no-data-config-icon:before{font-size:84px;color:#c1c1c1}.libs-ui-table-shadow-bottom{box-shadow:0 1px 1px #00143305,0 4px 8px #0014330a}@media only screen and (min-width: 1921px){.libs-ui-border-bottom-general{border-bottom:solid 2px #e6e8ed!important}}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"] }, { kind: "component", type: LibsUiComponentsTableTemplatesComponent, selector: "libs_ui-components-table-templates", inputs: ["isHover", "configs", "templateCssWrapper", "item"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: VirtualScrollerModule }, { kind: "component", type: i2.VirtualScrollerComponent, selector: "virtual-scroller,[virtualScroller]", inputs: ["executeRefreshOutsideAngularZone", "enableUnequalChildrenSizes", "RTL", "useMarginInsteadOfTranslate", "modifyOverflowStyleOfParentScroll", "stripedTable", "scrollbarWidth", "scrollbarHeight", "childWidth", "childHeight", "ssrChildWidth", "ssrChildHeight", "ssrViewportWidth", "ssrViewportHeight", "bufferAmount", "scrollAnimationTime", "resizeBypassRefreshThreshold", "scrollThrottlingTime", "scrollDebounceTime", "checkResizeInterval", "items", "compareItems", "horizontal", "parentScroll"], outputs: ["vsUpdate", "vsChange", "vsStart", "vsEnd"], exportAs: ["virtualScroller"] }, { kind: "component", type: LibsUiComponentsButtonsButtonComponent, selector: "libs_ui-components-buttons-button", inputs: ["flagMouse", "type", "buttonCustom", "sizeButton", "label", "disable", "isPending", "imageLeft", "classInclude", "classIconLeft", "classIconRight", "classLabel", "iconOnlyType", "popover", "ignoreStopPropagationEvent", "zIndex", "widthLabelPopover", "styleIconLeft", "styleButton", "ignoreFocusWhenInputTab", "ignoreSetClickWhenShowPopover", "ignorePointerEvent", "isActive", "isHandlerEnterDocumentClickButton"], outputs: ["outClick", "outPopoverEvent", "outFunctionsControl"] }, { kind: "pipe", type: LibsUiPipesConvertObjectToSignalPipe, name: "LibsUiPipesConvertObjectToSignalPipe" }, { kind: "component", type: LibsUiComponentsDropdownComponent, selector: "libs_ui-components-dropdown", inputs: ["useXssFilter", "popoverElementRefCustom", "classInclude", "ignoreStopPropagationEvent", "flagMouse", "flagMouseContent", "popoverCustomConfig", "isNgContent", "zIndex", "convertItemSelected", "getPopoverItemSelected", "httpRequestDetailItemById", "lengthKeys", "textDisplayWhenNoSelect", "textDisplayWhenMultiSelect", "classIncludeTextDisplayWhenNoSelect", "fieldLabel", "fieldGetLabel", "labelPopoverConfig", "labelPopoverFullWidth", "hasContentUnitRight", "listSearchNoDataTemplateRef", "fieldGetImage", "imageSize", "typeShape", "fieldGetIcon", "fieldGetTextAvatar", "fieldGetColorAvatar", "classAvatarInclude", "getLastTextAfterSpace", "linkImageError", "showError", "showBorderError", "disable", "readonly", "labelConfig", "disableLabel", "listSearchConfig", "isSearchOnline", "listHiddenInputSearch", "listSearchPadding", "listKeySearch", "listDividerClassInclude", "listConfig", "listButtonsOther", "listHasButtonUnSelectOption", "listClickExactly", "listBackgroundCustom", "listMaxItemShow", "listKeySelected", "listMultiKeySelected", "listKeysDisable", "listKeysHidden", "validRequired", "validMaxItemSelected", "changeValidUndefinedResetError", "allowSelectItemMultiple", "focusInputSearch", "onlyEmitDataWhenReset", "resetKeyWhenSelectAllKey", "listConfigHasDivider", "classIncludeIcon", "classIncludeContent", "listIgnoreClassDisableDefaultWhenUseKeysDisableItem", "tabKeyActive", "tabsConfig", "ignoreBorderBottom"], outputs: ["flagMouseChange", "flagMouseContentChange", "lengthKeysChange", "showBorderErrorChange", "listKeySelectedChange", "listMultiKeySelectedChange", "tabKeyActiveChange", "outSelectKey", "outSelectMultiKey", "outFunctionsControl", "outValidEvent", "outChangStageFlagMouse", "outDataChange", "outClickButtonOther", "outShowList", "outChangeTabKeyActive"] }, { kind: "component", type: LibsUiComponentsButtonsSortArrowComponent, selector: "libs_ui-components-buttons-sort-arrow", inputs: ["size", "mode", "fieldSort", "disable", "ignorePopoverContent", "popoverContentAsc", "popoverContentDesc", "defaultMode", "zIndex"], outputs: ["modeChange", "outChange"] }, { kind: "component", type: LibsUiComponentsCheckboxSingleComponent, selector: "libs_ui-components-checkbox-single", inputs: ["key", "checked", "label", "classLabelInclude", "ignoreShowPopoverLabel", "typeLabelPopover", "popover", "linkImage", "linkImageError", "avatarConfig", "classImageInclude", "imgTypeIcon", "bullet", "classInclude", "clickExactly", "disable", "disableLabel", "ignoreCheckbox", "zIndexLabel", "stillOtherOptions", "error", "showBorderError", "description", "iconImageClass", "classIconInclude", "modeBorder", "dataComponentOutlet", "componentOutlet"], outputs: ["checkedChange", "linkImageChange", "outChange", "outEventPopover", "outClickLabel", "outChangStageFlagMousePopover"] }, { kind: "pipe", type: LibsUiTableCalculatorColumnPipe, name: "LibsUiTableCalculatorColumnPipe" }, { kind: "component", type: LibsUiComponentsSpinnerComponent, selector: "libs_ui-components-spinner", inputs: ["type", "size"] }, { kind: "component", type: LibsUiComponentsPopoverComponent, selector: "libs_ui-components-popover,[LibsUiComponentsPopoverDirective]", inputs: ["debugId", "flagMouse", "type", "mode", "config", "ignoreShowPopover", "elementRefCustom", "initEventInElementRefCustom", "classInclude", "ignoreHiddenPopoverContentWhenMouseLeave", "ignoreStopPropagationEvent", "ignoreCursorPointerModeLikeClick", "isAddContentToParentDocument", "ignoreClickOutside"], outputs: ["outEvent", "outChangStageFlagMouse", "outEventPopoverContent", "outFunctionsControl"] }, { kind: "directive", type: LibsUiComponentsScrollOverlayDirective, selector: "[LibsUiComponentsScrollOverlayDirective]", inputs: ["debugMode", "ignoreInit", "classContainer", "options", "elementCheckScrollX", "elementCheckScrollY", "elementScroll"], outputs: ["outScroll", "outScrollX", "outScrollY", "outScrollTop", "outScrollBottom"] }, { kind: "pipe", type: LibsUiIconsGetIconComponentPipe, name: "LibsUiIconsGetIconComponentPipe" }, { kind: "pipe", type: LibsUiPipesCallFunctionInTemplatePipe, name: "LibsUiPipesCallFunctionInTemplatePipe" }, { kind: "pipe", type: LibsUiPipesCheckSelectedByKeyPipe, name: "LibsUiPipesCheckSelectedByKeyPipe" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
658
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: LibsUiComponentsTableComponent, isStandalone: true, selector: "libs_ui-components-table", inputs: { timeHighlighNewItem: { classPropertyName: "timeHighlighNewItem", publicName: "timeHighlighNewItem", isSignal: true, isRequired: false, transformFunction: null }, headerLeft: { classPropertyName: "headerLeft", publicName: "headerLeft", isSignal: true, isRequired: false, transformFunction: null }, headerRight: { classPropertyName: "headerRight", publicName: "headerRight", isSignal: true, isRequired: false, transformFunction: null }, configTemplateItemCollapseExpand: { classPropertyName: "configTemplateItemCollapseExpand", publicName: "configTemplateItemCollapseExpand", isSignal: true, isRequired: false, transformFunction: null }, showFooter: { classPropertyName: "showFooter", publicName: "showFooter", isSignal: true, isRequired: false, transformFunction: null }, ignoreBorderFooter: { classPropertyName: "ignoreBorderFooter", publicName: "ignoreBorderFooter", isSignal: true, isRequired: false, transformFunction: null }, customPositionFooter: { classPropertyName: "customPositionFooter", publicName: "customPositionFooter", isSignal: true, isRequired: false, transformFunction: null }, footerLeft: { classPropertyName: "footerLeft", publicName: "footerLeft", isSignal: true, isRequired: false, transformFunction: null }, footerRight: { classPropertyName: "footerRight", publicName: "footerRight", isSignal: true, isRequired: false, transformFunction: null }, disableCheckbox: { classPropertyName: "disableCheckbox", publicName: "disableCheckbox", isSignal: true, isRequired: false, transformFunction: null }, enableUnequalChildrenSizes: { classPropertyName: "enableUnequalChildrenSizes", publicName: "enableUnequalChildrenSizes", isSignal: true, isRequired: false, transformFunction: null }, bufferAmount: { classPropertyName: "bufferAmount", publicName: "bufferAmount", isSignal: true, isRequired: false, transformFunction: null }, totalItem: { classPropertyName: "totalItem", publicName: "totalItem", isSignal: true, isRequired: false, transformFunction: null }, isDashBorder: { classPropertyName: "isDashBorder", publicName: "isDashBorder", isSignal: true, isRequired: false, transformFunction: null }, classHeaderContainerInclude: { classPropertyName: "classHeaderContainerInclude", publicName: "classHeaderContainerInclude", isSignal: true, isRequired: false, transformFunction: null }, classHeaderLeftInclude: { classPropertyName: "classHeaderLeftInclude", publicName: "classHeaderLeftInclude", isSignal: true, isRequired: false, transformFunction: null }, classBodyInclude: { classPropertyName: "classBodyInclude", publicName: "classBodyInclude", isSignal: true, isRequired: false, transformFunction: null }, classFooterInclude: { classPropertyName: "classFooterInclude", publicName: "classFooterInclude", isSignal: true, isRequired: false, transformFunction: null }, classTableContainerInclude: { classPropertyName: "classTableContainerInclude", publicName: "classTableContainerInclude", isSignal: true, isRequired: false, transformFunction: null }, classBarInclude: { classPropertyName: "classBarInclude", publicName: "classBarInclude", isSignal: true, isRequired: false, transformFunction: null }, fieldKey: { classPropertyName: "fieldKey", publicName: "fieldKey", isSignal: true, isRequired: false, transformFunction: null }, defaultKeysSelected: { classPropertyName: "defaultKeysSelected", publicName: "defaultKeysSelected", isSignal: true, isRequired: false, transformFunction: null }, labelBarNoSelectItem: { classPropertyName: "labelBarNoSelectItem", publicName: "labelBarNoSelectItem", isSignal: true, isRequired: false, transformFunction: null }, labelBarButtons: { classPropertyName: "labelBarButtons", publicName: "labelBarButtons", isSignal: true, isRequired: false, transformFunction: null }, classLabelBarButtons: { classPropertyName: "classLabelBarButtons", publicName: "classLabelBarButtons", isSignal: true, isRequired: false, transformFunction: null }, barButtons: { classPropertyName: "barButtons", publicName: "barButtons", isSignal: true, isRequired: false, transformFunction: null }, sortLocal: { classPropertyName: "sortLocal", publicName: "sortLocal", isSignal: true, isRequired: false, transformFunction: null }, filterOrSortLocal: { classPropertyName: "filterOrSortLocal", publicName: "filterOrSortLocal", isSignal: true, isRequired: false, transformFunction: null }, httpRequestData: { classPropertyName: "httpRequestData", publicName: "httpRequestData", isSignal: true, isRequired: false, transformFunction: null }, httpRequestDataFooter: { classPropertyName: "httpRequestDataFooter", publicName: "httpRequestDataFooter", isSignal: true, isRequired: false, transformFunction: null }, newData: { classPropertyName: "newData", publicName: "newData", isSignal: true, isRequired: false, transformFunction: null }, filter: { classPropertyName: "filter", publicName: "filter", isSignal: true, isRequired: false, transformFunction: null }, ignoreBar: { classPropertyName: "ignoreBar", publicName: "ignoreBar", isSignal: true, isRequired: false, transformFunction: null }, classLabelBarNoSelectItem: { classPropertyName: "classLabelBarNoSelectItem", publicName: "classLabelBarNoSelectItem", isSignal: true, isRequired: false, transformFunction: null }, ignoreClassBgHeader: { classPropertyName: "ignoreClassBgHeader", publicName: "ignoreClassBgHeader", isSignal: true, isRequired: false, transformFunction: null }, noDataConfig: { classPropertyName: "noDataConfig", publicName: "noDataConfig", isSignal: true, isRequired: false, transformFunction: null }, showScrollTablePinnedIfNoData: { classPropertyName: "showScrollTablePinnedIfNoData", publicName: "showScrollTablePinnedIfNoData", isSignal: true, isRequired: false, transformFunction: null }, ignoreBorderItemLast: { classPropertyName: "ignoreBorderItemLast", publicName: "ignoreBorderItemLast", isSignal: true, isRequired: false, transformFunction: null }, isHiddenHeaderWhenNodata: { classPropertyName: "isHiddenHeaderWhenNodata", publicName: "isHiddenHeaderWhenNodata", isSignal: true, isRequired: false, transformFunction: null }, maxItemSelected: { classPropertyName: "maxItemSelected", publicName: "maxItemSelected", isSignal: true, isRequired: false, transformFunction: null }, configSelectMoreItem: { classPropertyName: "configSelectMoreItem", publicName: "configSelectMoreItem", isSignal: true, isRequired: false, transformFunction: null }, onlyShowNoResult: { classPropertyName: "onlyShowNoResult", publicName: "onlyShowNoResult", isSignal: true, isRequired: false, transformFunction: null }, ignoreBorderItem: { classPropertyName: "ignoreBorderItem", publicName: "ignoreBorderItem", isSignal: true, isRequired: false, transformFunction: null }, templateNoData: { classPropertyName: "templateNoData", publicName: "templateNoData", isSignal: true, isRequired: false, transformFunction: null }, templateNoResult: { classPropertyName: "templateNoResult", publicName: "templateNoResult", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { outLoadMore: "outLoadMore", outScrollIsGone: "outScrollIsGone", outLoading: "outLoading", outClickButtonAction: "outClickButtonAction", outSort: "outSort", outClickBarButton: "outClickBarButton", outHoverButtonAction: "outHoverButtonAction", outKeysSelected: "outKeysSelected", outFunctionsControl: "outFunctionsControl", outLoadDataComplete: "outLoadDataComplete", outTotalItem: "outTotalItem", outLoadDataError: "outLoadDataError" }, viewQueries: [{ propertyName: "headerElementRef", first: true, predicate: ["headerElementRef"], descendants: true, isSignal: true }, { propertyName: "footerElementRef", first: true, predicate: ["footerElementRef"], descendants: true, isSignal: true }, { propertyName: "footerLeftElementRef", first: true, predicate: ["footerLeftElementRef"], descendants: true, isSignal: true }, { propertyName: "bodyElementRef", first: true, predicate: ["bodyElementRef"], descendants: true, isSignal: true }, { propertyName: "bodyComponentRef", first: true, predicate: ["bodyComponentRef"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class='flex flex-col w-full h-full'>\n @if (!ignoreBar()) {\n <div\n class=\"flex items-center relative z-[1] bottom-0 left-0 w-full bg-white libs-ui-table-shadow-bottom {{ classBarInclude() }}\"\n [class.px-[16px]]=\"keysSelected().length || labelBarNoSelectItem()\"\n [class.py-[6px]]=\"keysSelected().length || labelBarNoSelectItem()\"\n (mouseenter)=\"resetIndexHover($event)\">\n <ng-content select='div.libs-ui-table-bar-left'></ng-content>\n @if (!keysSelected().length && labelBarNoSelectItem()) {\n <div class=\"{{ classLabelBarNoSelectItem() ?? 'px-[12px] py-[5px]' }}\"\n [innerHtml]='labelBarNoSelectItem() | translate:{value:totalItemDisplay()}'>\n </div>\n }\n @if (keysSelected().length) {\n <div class=\"flex items-center pl-[12px]\">\n <div class=\"flex items-center h-full mt-[-2px]\">\n <libs_ui-components-checkbox-single [checked]=\"true\"\n [disable]=\"loading() || disableCheckbox()\"\n (outChange)=\"handlerChangeAllChecked()\" />\n </div>\n <div class=\"libs-ui-font-h5m text-[#071631] mr-[8px] {{ classLabelBarButtons() }}\">\n {{ labelBarButtons() | translate:{ value:keysSelected().length } }}\n </div>\n @if (configSelectMoreItem()) {\n <libs_ui-components-dropdown [isNgContent]=\"true\"\n [popoverCustomConfig]=\"{\n widthByParent:false,\n ignoreArrow: true,\n maxHeight: 2048,\n classInclude:'!w-[121px]',\n position: {\n mode:'start',\n distance:0\n }\n }\"\n [listConfig]=\"listConfigMoreItem()\"\n [listHiddenInputSearch]=\"true\"\n [listMaxItemShow]=\"5\"\n class=\"!w-[16px] h-[16px] mr-[8px]\"\n (outSelectKey)=\"handlerSelectedMoreItem($event)\"\n (outFunctionsControl)=\"handlerFunctionControlMoreSelectItem($event)\">\n <libs_ui-components-buttons-button [type]=\"'button-link-primary'\"\n [classInclude]=\"'!p-0 m-0'\"\n [classIconLeft]=\"'before:!text-[16px] libs-ui-icon-move-right rotate-90 mr-[6px]'\"\n [popover]=\"{config:{content:'i18n_more_select'}}\"\n [ignoreStopPropagationEvent]=\"true\" />\n </libs_ui-components-dropdown>\n }\n <div class=\"h-[16px] libs-ui-border-left-general ml-[16px]\"></div>\n @if (barButtons()?.length) {\n @for (button of barButtons();track button) {\n <libs_ui-components-buttons-button [type]=\"button.type || 'button-link-primary'\"\n [classIconLeft]=\"button.classIconLeft || ''\"\n [classInclude]=\"button.classInclude || ''\"\n [label]=\"(button.label || ' ') | translate\"\n (outClick)=\"handlerBarButtonClick(button)\" />\n }\n }\n </div>\n }\n <ng-content select='div.libs-ui-table-bar-right'></ng-content>\n </div>\n }\n\n <div #tableContainerElementRef\n class=\"libs-ui-table flex flex-col w-full h-full relative {{ classTableContainerInclude() }}\"\n [class.px-[16px]]='!ignoreBar()'\n (mouseleave)=\"handlerMouseLeaveContainer($event)\">\n <div class=\"relative w-full shrink-0\"\n [style.height.px]=\"headerElementRef.offsetHeight\">\n <div #headerElementRef\n LibsUiComponentsScrollOverlayDirective\n [options]=\"{scrollbarWidth: 0}\"\n [class.libs-ui-border-bottom-dashed-general]=\"!hasItemHightLight() && isDashBorder()\"\n [class.libs-ui-border-bottom-general]=\"!hasItemHightLight() && !isDashBorder()\"\n [class.!hidden]=\"!items().length && isHiddenHeaderWhenNodata()\"\n [class]=\"classHeaderContainer()\"\n (outScroll)=\"handlerScrollHeader($event)\"\n (mouseenter)=\"handlerMouseEnterHeader($event)\"\n (mouseleave)=\"handlerMouseLeaveHeader($event)\">\n @if (headerLeft().length) {\n <div [class]=\"classHeaderLeftContainer()\">\n @for (header of headerLeft();track header) {\n <ng-container *ngTemplateOutlet=\"templateHeaderRef;context:{headerItem:header,isHeaderLeft:true}\" />\n }\n </div>\n }\n @if (headerRight().length) {\n @for (header of headerRight();track header) {\n <ng-container *ngTemplateOutlet=\"templateHeaderRef;context:{headerItem:header,isHeaderLeft:false}\" />\n }\n }\n </div>\n </div>\n @if (showFooter() && itemFooter() && customPositionFooter() === 'top') {\n <ng-container *ngTemplateOutlet='templateFooterRef' />\n }\n <div class=\"relative flex flex-col w-full h-full overflow-x-hidden bg-white {{ classBodyInclude() || '' }}\">\n <div #bodyElementRef\n class=\"flex h-full w-full relative\"\n LibsUiComponentsScrollOverlayDirective\n (outScroll)=\"handlerScrollBody($event)\"\n (outScrollBottom)=\"handlerScrollBottom($event)\">\n @if (items().length) {\n <virtual-scroller #bodyComponentRef\n [items]=\"items()\"\n [enableUnequalChildrenSizes]=\"enableUnequalChildrenSizes()\"\n class=\"h-full\"\n [style.width.px]=\"headerElementRef.scrollWidth > (bodyElementRef ? bodyElementRef.scrollWidth : 0) ? headerElementRef.scrollWidth: undefined\"\n [parentScroll]=\"bodyElementRef\"\n [bufferAmount]=\"bufferAmount()\">\n @for (data of bodyComponentRef.viewPortItems;track data()) {\n <div #elementHover\n class=\"flex\"\n [class.bg-[#f3fcfc]]=\"data().specificHightLight\"\n [class.libs-ui-border-top-1px-36d3d3]=\"data().specificHightLight && $first && !ignoreBorderItem()\"\n [class.libs-ui-border-bottom-1px-36d3d3]=\"data().specificHightLight && !ignoreBorderItem()\"\n [ngClass]=\"(data().specificHightLight || ($last && ignoreBorderItemLast())) ? 'libs-ui-border-radius-bottom-left-4px libs-ui-border-radius-bottom-right-4px' : ignoreBorderItem() ? '' : isDashBorder() ? 'libs-ui-border-bottom-dashed-general' : 'libs-ui-border-bottom-general'\"\n [style.width.px]=\"headerElementRef.scrollWidth\"\n [class.bg-[#f8f9fa]]=\"itemOfIndexHover === data && !data().specificHightLight\"\n (mouseenter)=\"setIndexHover($event,data)\"\n (mouseleave)=\"resetIndexHoverWhenMouseLeave($event)\">\n @if (headerLeft().length || headerRight().length) {\n <div class=\"flex flex-col w-full\">\n <div class=\"flex w-full\">\n @if (headerLeft().length) {\n <div class=\"flex sticky top-0 left-0 z-[1]\"\n [class.bg-white]=\"!data().specificHightLight\"\n [class.bg-[#f3fcfc]]=\"data().specificHightLight\">\n @for (header of headerLeft();track header) {\n <div\n class=\"relative flex px-[12px] py-[8px] {{ header.ignoreBorderRight ? '': 'libs-ui-border-right-general' }}\"\n [class.bg-[#f8f9fa]]=\"itemOfIndexHover === data && !data().specificHightLight\"\n [ngStyle]=\"(header|LibsUiTableCalculatorColumnPipe:headerElementRef.clientWidth:headerLeft():headerRight()) || (header.isShowIndexOnRow ? {width:'50px','flex-shirk':'0',padding:'8px'} : {})\"\n [ngClass]=\"header.ngClass || {}\">\n <ng-container *ngTemplateOutlet=\"templateBodyRef;context:{header:header,data:data}\" />\n </div>\n }\n </div>\n }\n @if (headerRight().length) {\n @for (header of headerRight();track header) {\n <div class=\"relative flex px-[12px] py-[8px]\"\n [ngStyle]=\"(header|LibsUiTableCalculatorColumnPipe:headerElementRef.clientWidth:headerLeft():headerRight()) || (header.isShowIndexOnRow ? {width:'50px','flex-shirk':'0',padding:'8px'} : {})\"\n [ngClass]=\"header.ngClass || {}\">\n <ng-container *ngTemplateOutlet=\"templateBodyRef;context:{header:header,data:data}\" />\n </div>\n }\n }\n </div>\n @if (configTemplateItemCollapseExpand() && data().specificExpand && data()[configTemplateItemCollapseExpand()?.fieldGetDataExpand || 'specificDataExpand']) {\n <div [class]=\"configTemplateItemCollapseExpand()?.cssWrapper || 'flex w-full'\">\n @for (dataExpand of data()[configTemplateItemCollapseExpand()?.fieldGetDataExpand || 'specificDataExpand']();track $index) {\n @if (configTemplateItemCollapseExpand()?.colTemplateConfig) {\n <libs_ui-components-table-templates [item]=\"dataExpand\"\n [templateCssWrapper]=\"configTemplateItemCollapseExpand()?.templateCssWrapper\"\n [configs]=\"configTemplateItemCollapseExpand()?.colTemplateConfig\" />\n }\n } @empty {\n <div class=\"relative h-[100px]\">\n <ng-container *ngTemplateOutlet=\"templateNodataRef\" />\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n </virtual-scroller>\n } @else if (!loading()) {\n <div class=\"sticky left-0 top-0 z-[1] h-full w-full\">\n <ng-container *ngTemplateOutlet=\"templateNodataRef\" />\n </div>\n @if (showScrollTablePinnedIfNoData()) {\n <div class=\"absolute h-[1px] bg-transparent top-0 left-0 z-[1]\"\n [style.width.px]=\"headerElementRef.scrollWidth\"></div>\n }\n }\n </div>\n\n @if (showFooter() && itemFooter() && customPositionFooter() === 'bottom') {\n <ng-container *ngTemplateOutlet='templateFooterRef' />\n }\n\n @if (loading()) {\n <div class=\"absolute w-full h-full z-[2] flex items-center content-center\">\n <libs_ui-components-spinner />\n </div>\n }\n </div>\n </div>\n</div>\n\n<ng-template #templateHeaderRef\n let-header='headerItem'\n let-isHeaderLeft='isHeaderLeft'>\n <div\n [class]=\"'relative flex '+ (header.paddingLeftRightHeaderContainer ?? ' px-[12px] ') + (isHeaderLeft && !header.ignoreBorderRight ? ' libs-ui-border-right-general ' : ' ')+ ' libs-ui-table-header-col '\"\n [class.flex-col]=\"header.rowsConfig\"\n [class.py-[8px]]='!header.ignorePyDefault'\n [ngStyle]=\"(header|LibsUiTableCalculatorColumnPipe:headerElementRef.clientWidth:headerLeft():headerRight()) || (header.isShowIndexOnRow ? {width:'50px','flex-shirk':'0',padding:'8px'} : {})\"\n [ngClass]=\"header.ngClass || {}\">\n @if (!header.rowsConfig) {\n <ng-container *ngTemplateOutlet=\"templateHeaderContentRef;context:{headerItem:header,isColRender:false}\" />\n }\n @if (header.rowsConfig;as rowsConfig) {\n @for (row of rowsConfig.rows;track row) {\n <div [class]=\"row.classRow\">\n @for (col of row.cols ; track col) {\n <ng-container *ngTemplateOutlet=\"templateHeaderContentRef;context:{headerItem:col,isColRender:true}\" />\n }\n </div>\n }\n }\n </div>\n</ng-template>\n\n<ng-template #templateHeaderContentRef\n let-header='headerItem'\n let-isColRender='isColRender'>\n <div class=\"flex libs-ui-font-h6m min-h-[18px] text-[#6a7383] max-w-full\"\n [class.items-center]='header.contentHeaderAlignCenter ?? true'\n [class.justify-end]='header.contentHeaderJustifyContentEnd'\n [class.w-full]=\"header.isShowIndexOnRow\"\n [ngStyle]=\"isColRender ? ((header|LibsUiTableCalculatorColumnPipe:headerElementRef.clientWidth:headerLeft():headerRight()) || (header.isShowIndexOnRow ? {width:'50px','flex-shirk':'0',padding:'8px'} : {})) : {}\"\n [ngClass]=\"isColRender ? (header.ngClass || {}) : {}\">\n @if (header.hasCheckbox) {\n @if (header.hasCheckboxAll) {\n <div class=\"flex h-full {{ header.checkboxAllClassInclude || 'mr-[16px]' }}\"\n [class.items-center]=\"header.checkboxAlignCenter\">\n <libs_ui-components-checkbox-single [key]=\"'all'\"\n [stillOtherOptions]=\"!!keysSelected().length && keysSelected().length !== items().length\"\n [checked]=\"!!keysSelected().length && keysSelected().length === items().length\"\n [disable]=\"loading()\"\n [classInclude]=\"header.checkboxClassInclude\"\n (outChange)=\"handlerChangeCheckedAllItems($event)\" />\n </div>\n } @else {\n <div class=\"flex h-full ml-[24px] {{ header.checkboxClassInclude }}\">\n </div>\n }\n }\n @for (tooltip of header.tooltipsLeft; track tooltip) {\n <div class=\"mr-[4px]\">\n <libs_ui-components-popover [type]=\"tooltip?.type || 'other'\"\n [mode]=\"tooltip?.mode || 'hover'\"\n [classInclude]=\"tooltip.classInclude || 'text-[#6a7383]'\"\n [ignoreShowPopover]=\"tooltip.ignoreShowTooltip || false\"\n [config]=\"tooltip.config || {content:(tooltip.dataView || ' ') | translate, position: {\n mode: 'center',\n distance: 0,\n autoUpdatePosition: {\n endDistance: 12,\n startDistance: -12\n }\n }}\"\n [innerHTML]=\"tooltip.dataView\" />\n </div>\n }\n\n @if (header.isShowIndexOnRow) {\n <div class=\"flex w-full h-full items-center justify-center {{ header.classIncludeIndexOnRow || '' }}\">\n {{ header.label ?? '#' }}\n </div>\n } @else {\n @if ((header.label | LibsUiPipesCallFunctionInTemplatePipe:header.parseValue:header) | async | translate; as labelHeaderColumn) {\n <libs_ui-components-popover [type]=\"header?.labelConfig?.type || 'text'\"\n [mode]=\"header?.labelConfig?.mode || 'hover'\"\n [classInclude]=\"(header?.labelConfig?.classInclude || '')\"\n [ignoreShowPopover]=\"header?.labelConfig?.ignoreShowTooltip || false\"\n [config]=\"header.labelConfig?.config || {content:labelHeaderColumn}\"\n [innerHTML]=\"labelHeaderColumn\" />\n }\n }\n\n @for (tooltip of header.tooltipsRight; track tooltip) {\n <div class=\"ml-[4px]\">\n <libs_ui-components-popover [type]=\"tooltip?.type || 'other'\"\n [mode]=\"tooltip?.mode || 'hover'\"\n [classInclude]=\"tooltip.classInclude || 'text-[#6a7383]'\"\n [ignoreShowPopover]=\"tooltip.ignoreShowTooltip || false\"\n [config]=\"tooltip.config || {content:(tooltip.dataView || ' ') | translate, position: {\n mode: 'center',\n distance: 0,\n autoUpdatePosition: {\n endDistance: 12,\n startDistance: -12\n }\n }}\"\n [innerHTML]=\"tooltip.dataView\" />\n </div>\n }\n\n @if (header.hasSort && header.orderby) {\n <div class=\"ml-[4px]\">\n <libs_ui-components-buttons-sort-arrow [disable]=\"loading() || !items().length\"\n [fieldSort]=\"header.orderby\"\n [ignorePopoverContent]=\"header.sortIgnoreTooltipContent ?? true\"\n [popoverContentAsc]=\"header.sortTooltipContentAsc\"\n [popoverContentDesc]=\"header.sortTooltipContentDesc\"\n [defaultMode]=\"header.defaultMode\"\n [zIndex]=\"header.zIndexTooltipSort\"\n (outChange)=\"handlerChangeSort($event)\" />\n </div>\n }\n </div>\n @if (header.labelDescription) {\n <div class=\"flex\">\n <libs_ui-components-popover [type]=\"'text'\"\n [classInclude]=\"header.labelDescription.classInclude || ''\"\n [config]=\"{content: header.labelDescription.content | translate}\"\n [innerHTML]=\"header.labelDescription.content | translate\" />\n </div>\n }\n</ng-template>\n\n<ng-template #templateBodyRef\n let-header='header'\n let-data='data'>\n <div class=\"flex w-full h-full\">\n @if (header.hasCheckbox) {\n <div class=\"flex h-full\"\n [class.invisible]=\"header.checkConditionCheckBoxHidden &&( data() | LibsUiPipesCallFunctionInTemplatePipe:header.checkConditionCheckBoxHidden:data() | async)\"\n [class.items-center]=\"header.checkboxAlignCenter\">\n <libs_ui-components-checkbox-single [key]=\"data()[fieldKey()]\"\n [classInclude]=\"header.checkboxClassInclude\"\n [checked]=\"data()[fieldKey()] | LibsUiPipesCheckSelectedByKeyPipe:keysSelected():keysSelected().length\"\n [disable]=\"loading() || disableCheckbox() || !!(maxItemSelected() && !(data()[fieldKey()] | LibsUiPipesCheckSelectedByKeyPipe:keysSelected():keysSelected().length) && keysSelected().length >= maxItemSelected())\"\n (outChange)=\"handlerChangeItemChecked($event,data())\" />\n </div>\n }\n\n @if (header.isShowIndexOnRow; as config) {\n <div class=\"w-full flex items-center justify-center libs-ui-font-h4r{{ config.classIncludeIndexOnRow || '' }}\">\n <div LibsUiComponentsPopoverDirective\n [type]=\"'text'\"\n [config]=\"{}\"\n [innerHTML]=\"data | LibsUiPipesCallFunctionInTemplatePipe:getIndexRow | async\">\n </div>\n </div>\n }\n\n @if (header.colTemplateConfig) {\n <libs_ui-components-table-templates [isHover]=\"itemOfIndexHover === data && !data.specificHightLight\"\n [class]=\"header.templateCssWrapperHost || ''\"\n [item]=\"data\"\n [templateCssWrapper]=\"header.templateCssWrapper\"\n [configs]=\"header.colTemplateConfig\" />\n }\n </div>\n</ng-template>\n\n<ng-template #templateFooterRef>\n @if (!isHiddenHeaderWhenNodata() || (isHiddenHeaderWhenNodata() && items().length)) {\n <div #footerElementRef\n class=\"flex w-full bg-[#f8f9fa] overflow-x-hidden z-[1] {{ ignoreBorderFooter() ? '': (customPositionFooter() === 'top' ? 'libs-ui-border-bottom-general':'libs-ui-table-shadow-top libs-ui-border-top-general') }} min-h-[35px]\"\n (mouseenter)=\"handlerMouseEnterFooter($event)\"\n (mouseleave)=\"handlerMouseLeaveFooter($event)\">\n @if (footerLeft()) {\n <div #footerLeftElementRef\n class=\"flex sticky top-0 left-0 z-[1] bg-[#f8f9fa]\">\n @for (footer of footerLeft();track footer) {\n <div\n class=\"flex items-center px-[12px] py-[8px] {{ footer.ignoreBorderRight ? '': 'libs-ui-border-right-general' }}\"\n [ngStyle]=\"(footer|LibsUiTableCalculatorColumnPipe:headerElementRef.clientWidth:footerLeft():footerRight()) || {}\"\n [ngClass]=\"footer.ngClass || {}\">\n @if (footer.colTemplateConfig && itemFooter()) {\n <libs_ui-components-table-templates [item]=\"itemFooter|LibsUiPipesConvertObjectToSignalPipe\"\n [templateCssWrapper]=\"footer.templateCssWrapper\"\n [configs]=\"footer.colTemplateConfig\" />\n }\n </div>\n }\n </div>\n }\n @if (footerRight()) {\n @for (footer of footerRight();track footer) {\n <div class=\"flex items-center px-[12px] py-[8px]\"\n [ngStyle]=\"(footer|LibsUiTableCalculatorColumnPipe:headerElementRef.clientWidth:footerLeft():footerRight()) || {}\"\n [ngClass]=\"footer.ngClass || {}\">\n @if (footer.colTemplateConfig && itemFooter()) {\n <libs_ui-components-table-templates [item]=\"itemFooter|LibsUiPipesConvertObjectToSignalPipe\"\n [templateCssWrapper]=\"footer.templateCssWrapper\"\n [configs]=\"footer.colTemplateConfig\" />\n }\n </div>\n }\n }\n\n </div>\n }\n</ng-template>\n\n<ng-template #templateNodataRef>\n @if (!keySearch() && templateNoData(); as templateNoData) {\n <ng-container *ngTemplateOutlet=\"templateNoData\" />\n } @if (keySearch() && templateNoResult(); as templateNoResult) {\n <ng-container *ngTemplateOutlet=\"templateNoResult\" />\n }\n @if (!templateNoData() && !templateNoResult() && noDataConfig(); as config) {\n <div class=\"flex items-center justify-center w-full h-full absolute left-0 top-0 z-[1]\">\n <div class=\"flex flex-col items-center justify-center w-full h-full shrink-0\"\n LibsUiComponentsScrollOverlayDirective>\n @if (!keySearch() && !onlyShowNoResult()) {\n <ng-container *ngComponentOutlet=\" ('no-data' | LibsUiIconsGetIconComponentPipe | async);inputs:{size:64}\" />\n <div class=\"libs-ui-table-no-data-config-text\"\n [ngStyle]=\"config.ngStyle || {}\"\n [ngClass]=\"config.ngClass || {}\"\n [innerHtml]=\"config.textNoData | translate\">\n </div>\n }\n @if (keySearch() || onlyShowNoResult()) {\n <ng-container *ngComponentOutlet=\"('no-result' | LibsUiIconsGetIconComponentPipe | async);inputs:{size:64}\" />\n <div class=\"libs-ui-table-no-data-config-text\"\n [ngStyle]=\"config.ngStyle || {}\"\n [ngClass]=\"config.ngClass || {}\"\n [innerHtml]=\"config.textSearchNoData | translate\">\n </div>\n }\n </div>\n </div>\n }\n</ng-template>\n", styles: [".libs-ui-table-header-container{height:33px;flex-shrink:0}.libs-ui-table-header-col{height:100%;width:100%;align-items:center}.libs-ui-table-no-data-config-text{margin-top:16px;font-size:12px;color:#9ca2ad;font-family:var(--libs-ui-font-family-name, \"Arial\");font-weight:400}.libs-ui-table-no-data-config-icon{margin-bottom:12px}.libs-ui-table-no-data-config-icon:before{font-size:84px;color:#c1c1c1}.libs-ui-table-shadow-bottom{box-shadow:0 1px 1px #00143305,0 4px 8px #0014330a}@media only screen and (min-width: 1921px){.libs-ui-border-bottom-general{border-bottom:solid 2px #e6e8ed!important}}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"] }, { kind: "component", type: LibsUiComponentsTableTemplatesComponent, selector: "libs_ui-components-table-templates", inputs: ["isHover", "configs", "templateCssWrapper", "item"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: VirtualScrollerModule }, { kind: "component", type: i2.VirtualScrollerComponent, selector: "virtual-scroller,[virtualScroller]", inputs: ["executeRefreshOutsideAngularZone", "enableUnequalChildrenSizes", "RTL", "useMarginInsteadOfTranslate", "modifyOverflowStyleOfParentScroll", "stripedTable", "scrollbarWidth", "scrollbarHeight", "childWidth", "childHeight", "ssrChildWidth", "ssrChildHeight", "ssrViewportWidth", "ssrViewportHeight", "bufferAmount", "scrollAnimationTime", "resizeBypassRefreshThreshold", "scrollThrottlingTime", "scrollDebounceTime", "checkResizeInterval", "items", "compareItems", "horizontal", "parentScroll"], outputs: ["vsUpdate", "vsChange", "vsStart", "vsEnd"], exportAs: ["virtualScroller"] }, { kind: "component", type: LibsUiComponentsButtonsButtonComponent, selector: "libs_ui-components-buttons-button", inputs: ["flagMouse", "type", "buttonCustom", "sizeButton", "label", "disable", "isPending", "imageLeft", "classInclude", "classIconLeft", "classIconRight", "classLabel", "iconOnlyType", "popover", "ignoreStopPropagationEvent", "zIndex", "widthLabelPopover", "styleIconLeft", "styleButton", "ignoreFocusWhenInputTab", "ignoreSetClickWhenShowPopover", "ignorePointerEvent", "isActive", "isHandlerEnterDocumentClickButton"], outputs: ["outClick", "outPopoverEvent", "outFunctionsControl"] }, { kind: "pipe", type: LibsUiPipesConvertObjectToSignalPipe, name: "LibsUiPipesConvertObjectToSignalPipe" }, { kind: "component", type: LibsUiComponentsDropdownComponent, selector: "libs_ui-components-dropdown", inputs: ["useXssFilter", "popoverElementRefCustom", "classInclude", "ignoreStopPropagationEvent", "flagMouse", "flagMouseContent", "popoverCustomConfig", "isNgContent", "zIndex", "convertItemSelected", "getPopoverItemSelected", "httpRequestDetailItemById", "lengthKeys", "textDisplayWhenNoSelect", "textDisplayWhenMultiSelect", "classIncludeTextDisplayWhenNoSelect", "fieldLabel", "fieldGetLabel", "labelPopoverConfig", "labelPopoverFullWidth", "hasContentUnitRight", "listSearchNoDataTemplateRef", "fieldGetImage", "imageSize", "typeShape", "fieldGetIcon", "fieldGetTextAvatar", "fieldGetColorAvatar", "classAvatarInclude", "getLastTextAfterSpace", "linkImageError", "showError", "showBorderError", "disable", "readonly", "labelConfig", "disableLabel", "listSearchConfig", "isSearchOnline", "listHiddenInputSearch", "listSearchPadding", "listKeySearch", "listDividerClassInclude", "listConfig", "listButtonsOther", "listHasButtonUnSelectOption", "listClickExactly", "listBackgroundCustom", "listMaxItemShow", "listKeySelected", "listMultiKeySelected", "listKeysDisable", "listKeysHidden", "validRequired", "validMaxItemSelected", "changeValidUndefinedResetError", "allowSelectItemMultiple", "focusInputSearch", "onlyEmitDataWhenReset", "resetKeyWhenSelectAllKey", "listConfigHasDivider", "classIncludeIcon", "classIncludeContent", "listIgnoreClassDisableDefaultWhenUseKeysDisableItem", "tabKeyActive", "tabsConfig", "ignoreBorderBottom"], outputs: ["flagMouseChange", "flagMouseContentChange", "lengthKeysChange", "showBorderErrorChange", "listKeySelectedChange", "listMultiKeySelectedChange", "tabKeyActiveChange", "outSelectKey", "outSelectMultiKey", "outFunctionsControl", "outValidEvent", "outChangStageFlagMouse", "outDataChange", "outClickButtonOther", "outShowList", "outChangeTabKeyActive"] }, { kind: "component", type: LibsUiComponentsButtonsSortArrowComponent, selector: "libs_ui-components-buttons-sort-arrow", inputs: ["size", "mode", "fieldSort", "disable", "ignorePopoverContent", "popoverContentAsc", "popoverContentDesc", "defaultMode", "zIndex"], outputs: ["modeChange", "outChange"] }, { kind: "component", type: LibsUiComponentsCheckboxSingleComponent, selector: "libs_ui-components-checkbox-single", inputs: ["key", "checked", "label", "classLabelInclude", "ignoreShowPopoverLabel", "typeLabelPopover", "popover", "linkImage", "linkImageError", "avatarConfig", "classImageInclude", "imgTypeIcon", "bullet", "classInclude", "clickExactly", "disable", "disableLabel", "ignoreCheckbox", "zIndexLabel", "stillOtherOptions", "error", "showBorderError", "description", "iconImageClass", "classIconInclude", "modeBorder", "dataComponentOutlet", "componentOutlet"], outputs: ["checkedChange", "linkImageChange", "outChange", "outEventPopover", "outClickLabel", "outChangStageFlagMousePopover"] }, { kind: "pipe", type: LibsUiTableCalculatorColumnPipe, name: "LibsUiTableCalculatorColumnPipe" }, { kind: "component", type: LibsUiComponentsSpinnerComponent, selector: "libs_ui-components-spinner", inputs: ["type", "size"] }, { kind: "component", type: LibsUiComponentsPopoverComponent, selector: "libs_ui-components-popover,[LibsUiComponentsPopoverDirective]", inputs: ["debugId", "flagMouse", "type", "mode", "config", "ignoreShowPopover", "elementRefCustom", "initEventInElementRefCustom", "classInclude", "ignoreHiddenPopoverContentWhenMouseLeave", "ignoreStopPropagationEvent", "ignoreCursorPointerModeLikeClick", "isAddContentToParentDocument", "ignoreClickOutside"], outputs: ["outEvent", "outChangStageFlagMouse", "outEventPopoverContent", "outFunctionsControl"] }, { kind: "directive", type: LibsUiComponentsScrollOverlayDirective, selector: "[LibsUiComponentsScrollOverlayDirective]", inputs: ["debugMode", "ignoreInit", "classContainer", "options", "elementCheckScrollX", "elementCheckScrollY", "elementScroll"], outputs: ["outScroll", "outScrollX", "outScrollY", "outScrollTop", "outScrollBottom"] }, { kind: "pipe", type: LibsUiIconsGetIconComponentPipe, name: "LibsUiIconsGetIconComponentPipe" }, { kind: "pipe", type: LibsUiPipesCallFunctionInTemplatePipe, name: "LibsUiPipesCallFunctionInTemplatePipe" }, { kind: "pipe", type: LibsUiPipesCheckSelectedByKeyPipe, name: "LibsUiPipesCheckSelectedByKeyPipe" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
659
659
  }
660
660
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LibsUiComponentsTableComponent, decorators: [{
661
661
  type: Component,
@@ -667,6 +667,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
667
667
  LibsUiComponentsSpinnerComponent, LibsUiComponentsPopoverComponent,
668
668
  LibsUiComponentsScrollOverlayDirective, LibsUiIconsGetIconComponentPipe,
669
669
  LibsUiPipesCallFunctionInTemplatePipe, LibsUiPipesCheckSelectedByKeyPipe
670
- ], template: "<div class='flex flex-col w-full h-full'>\n @if (!ignoreBar()) {\n <div\n class=\"flex items-center relative z-[1] bottom-0 left-0 w-full bg-white libs-ui-table-shadow-bottom {{ classBarInclude() }}\"\n [class.px-[16px]]=\"keysSelected().length || labelBarNoSelectItem()\"\n [class.py-[6px]]=\"keysSelected().length || labelBarNoSelectItem()\"\n (mouseenter)=\"resetIndexHover($event)\">\n <ng-content select='div.libs-ui-table-bar-left'></ng-content>\n @if (!keysSelected().length && labelBarNoSelectItem()) {\n <div class=\"{{ classLabelBarNoSelectItem() ?? 'px-[12px] py-[5px]' }}\"\n [innerHtml]='labelBarNoSelectItem() | translate:{value:totalItemDisplay()}'>\n </div>\n }\n @if (keysSelected().length) {\n <div class=\"flex items-center pl-[12px]\">\n <div class=\"flex items-center h-full mt-[-2px]\">\n <libs_ui-components-checkbox-single [checked]=\"true\"\n [disable]=\"loading() || disableCheckbox()\"\n (outChange)=\"handlerChangeAllChecked()\" />\n </div>\n <div class=\"libs-ui-font-h5m text-[#071631] mr-[8px] {{ classLabelBarButtons() }}\">\n {{ labelBarButtons() | translate:{ value:keysSelected().length } }}\n </div>\n @if (configSelectMoreItem()) {\n <libs_ui-components-dropdown [isNgContent]=\"true\"\n [popoverCustomConfig]=\"{\n widthByParent:false,\n ignoreArrow: true,\n maxHeight: 2048,\n classInclude:'!w-[121px]',\n position: {\n mode:'start',\n distance:0\n }\n }\"\n [listConfig]=\"listConfigMoreItem()\"\n [listHiddenInputSearch]=\"true\"\n [listMaxItemShow]=\"5\"\n class=\"!w-[16px] h-[16px] mr-[8px]\"\n (outSelectKey)=\"handlerSelectedMoreItem($event)\"\n (outFunctionsControl)=\"handlerFunctionControlMoreSelectItem($event)\">\n <libs_ui-components-buttons-button [type]=\"'button-link-primary'\"\n [classInclude]=\"'!p-0 m-0'\"\n [classIconLeft]=\"'before:!text-[16px] libs-ui-icon-move-right rotate-90 mr-[6px]'\"\n [popover]=\"{config:{content:'i18n_more_select'}}\"\n [ignoreStopPropagationEvent]=\"true\" />\n </libs_ui-components-dropdown>\n }\n <div class=\"h-[16px] libs-ui-border-left-general ml-[16px]\"></div>\n @if (barButtons()?.length) {\n @for (button of barButtons();track button) {\n <libs_ui-components-buttons-button [type]=\"button.type || 'button-link-primary'\"\n [classIconLeft]=\"button.classIconLeft || ''\"\n [classInclude]=\"button.classInclude || ''\"\n [label]=\"(button.label || ' ') | translate\"\n (outClick)=\"handlerBarButtonClick(button)\" />\n }\n }\n </div>\n }\n <ng-content select='div.libs-ui-table-bar-right'></ng-content>\n </div>\n }\n\n <div #tableContainerElementRef\n class=\"libs-ui-table flex flex-col w-full h-full relative {{ classTableContainerInclude() }}\"\n [class.px-[16px]]='!ignoreBar()'\n (mouseleave)=\"handlerMouseLeaveContainer($event)\">\n <div class=\"relative w-full\"\n [style.height.px]=\"headerElementRef.offsetHeight\">\n <div #headerElementRef\n LibsUiComponentsScrollOverlayDirective\n [options]=\"{scrollbarWidth: 0}\"\n [class.libs-ui-border-bottom-dashed-general]=\"!hasItemHightLight() && isDashBorder()\"\n [class.libs-ui-border-bottom-general]=\"!hasItemHightLight() && !isDashBorder()\"\n [class.!hidden]=\"!items().length && isHiddenHeaderWhenNodata()\"\n [class]=\"classHeaderContainer()\"\n (outScroll)=\"handlerScrollHeader($event)\"\n (mouseenter)=\"handlerMouseEnterHeader($event)\"\n (mouseleave)=\"handlerMouseLeaveHeader($event)\">\n @if (headerLeft().length) {\n <div [class]=\"classHeaderLeftContainer()\">\n @for (header of headerLeft();track header) {\n <ng-container *ngTemplateOutlet=\"templateHeaderRef;context:{headerItem:header,isHeaderLeft:true}\" />\n }\n </div>\n }\n @if (headerRight().length) {\n @for (header of headerRight();track header) {\n <ng-container *ngTemplateOutlet=\"templateHeaderRef;context:{headerItem:header,isHeaderLeft:false}\" />\n }\n }\n </div>\n </div>\n @if (showFooter() && itemFooter() && customPositionFooter() === 'top') {\n <ng-container *ngTemplateOutlet='templateFooterRef' />\n }\n <div class=\"relative flex flex-col w-full h-full overflow-x-hidden bg-white {{ classBodyInclude() || '' }}\">\n <div #bodyElementRef\n class=\"flex h-full w-full relative\"\n LibsUiComponentsScrollOverlayDirective\n (outScroll)=\"handlerScrollBody($event)\"\n (outScrollBottom)=\"handlerScrollBottom($event)\">\n @if (items().length) {\n <virtual-scroller #bodyComponentRef\n [items]=\"items()\"\n [enableUnequalChildrenSizes]=\"enableUnequalChildrenSizes()\"\n class=\"h-full\"\n [style.width.px]=\"headerElementRef.scrollWidth > (bodyElementRef ? bodyElementRef.scrollWidth : 0) ? headerElementRef.scrollWidth: undefined\"\n [parentScroll]=\"bodyElementRef\"\n [bufferAmount]=\"bufferAmount()\">\n @for (data of bodyComponentRef.viewPortItems;track data()) {\n <div #elementHover\n class=\"flex\"\n [class.bg-[#f3fcfc]]=\"data().specificHightLight\"\n [class.libs-ui-border-top-1px-36d3d3]=\"data().specificHightLight && $first && !ignoreBorderItem()\"\n [class.libs-ui-border-bottom-1px-36d3d3]=\"data().specificHightLight && !ignoreBorderItem()\"\n [ngClass]=\"(data().specificHightLight || ($last && ignoreBorderItemLast())) ? 'libs-ui-border-radius-bottom-left-4px libs-ui-border-radius-bottom-right-4px' : ignoreBorderItem() ? '' : isDashBorder() ? 'libs-ui-border-bottom-dashed-general' : 'libs-ui-border-bottom-general'\"\n [style.width.px]=\"headerElementRef.scrollWidth\"\n [class.bg-[#f8f9fa]]=\"itemOfIndexHover === data && !data().specificHightLight\"\n (mouseenter)=\"setIndexHover($event,data)\"\n (mouseleave)=\"resetIndexHoverWhenMouseLeave($event)\">\n @if (headerLeft().length || headerRight().length) {\n <div class=\"flex flex-col w-full\">\n <div class=\"flex w-full\">\n @if (headerLeft().length) {\n <div class=\"flex sticky top-0 left-0 z-[1]\"\n [class.bg-white]=\"!data().specificHightLight\"\n [class.bg-[#f3fcfc]]=\"data().specificHightLight\">\n @for (header of headerLeft();track header) {\n <div\n class=\"relative flex px-[12px] py-[8px] {{ header.ignoreBorderRight ? '': 'libs-ui-border-right-general' }}\"\n [class.bg-[#f8f9fa]]=\"itemOfIndexHover === data && !data().specificHightLight\"\n [ngStyle]=\"(header|LibsUiTableCalculatorColumnPipe:headerElementRef.clientWidth:headerLeft():headerRight()) || (header.isShowIndexOnRow ? {width:'50px','flex-shirk':'0',padding:'8px'} : {})\"\n [ngClass]=\"header.ngClass || {}\">\n <ng-container *ngTemplateOutlet=\"templateBodyRef;context:{header:header,data:data}\" />\n </div>\n }\n </div>\n }\n @if (headerRight().length) {\n @for (header of headerRight();track header) {\n <div class=\"relative flex px-[12px] py-[8px]\"\n [ngStyle]=\"(header|LibsUiTableCalculatorColumnPipe:headerElementRef.clientWidth:headerLeft():headerRight()) || (header.isShowIndexOnRow ? {width:'50px','flex-shirk':'0',padding:'8px'} : {})\"\n [ngClass]=\"header.ngClass || {}\">\n <ng-container *ngTemplateOutlet=\"templateBodyRef;context:{header:header,data:data}\" />\n </div>\n }\n }\n </div>\n @if (configTemplateItemCollapseExpand() && data().specificExpand && data()[configTemplateItemCollapseExpand()?.fieldGetDataExpand || 'specificDataExpand']) {\n <div [class]=\"configTemplateItemCollapseExpand()?.cssWrapper || 'flex w-full'\">\n @for (dataExpand of data()[configTemplateItemCollapseExpand()?.fieldGetDataExpand || 'specificDataExpand']();track $index) {\n @if (configTemplateItemCollapseExpand()?.colTemplateConfig) {\n <libs_ui-components-table-templates [item]=\"dataExpand\"\n [templateCssWrapper]=\"configTemplateItemCollapseExpand()?.templateCssWrapper\"\n [configs]=\"configTemplateItemCollapseExpand()?.colTemplateConfig\" />\n }\n } @empty {\n <div class=\"relative h-[100px]\">\n <ng-container *ngTemplateOutlet=\"templateNodataRef\" />\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n </virtual-scroller>\n } @else if (!loading()) {\n <div class=\"sticky left-0 top-0 z-[1] h-full w-full\">\n <ng-container *ngTemplateOutlet=\"templateNodataRef\" />\n </div>\n @if (showScrollTablePinnedIfNoData()) {\n <div class=\"absolute h-[1px] bg-transparent top-0 left-0 z-[1]\"\n [style.width.px]=\"headerElementRef.scrollWidth\"></div>\n }\n }\n </div>\n\n @if (showFooter() && itemFooter() && customPositionFooter() === 'bottom') {\n <ng-container *ngTemplateOutlet='templateFooterRef' />\n }\n\n @if (loading()) {\n <div class=\"absolute w-full h-full z-[2] flex items-center content-center\">\n <libs_ui-components-spinner />\n </div>\n }\n </div>\n </div>\n</div>\n\n<ng-template #templateHeaderRef\n let-header='headerItem'\n let-isHeaderLeft='isHeaderLeft'>\n <div\n [class]=\"'relative flex '+ (header.paddingLeftRightHeaderContainer ?? ' px-[12px] ') + (isHeaderLeft && !header.ignoreBorderRight ? ' libs-ui-border-right-general ' : ' ')+ ' libs-ui-table-header-col '\"\n [class.flex-col]=\"header.rowsConfig\"\n [class.py-[8px]]='!header.ignorePyDefault'\n [ngStyle]=\"(header|LibsUiTableCalculatorColumnPipe:headerElementRef.clientWidth:headerLeft():headerRight()) || (header.isShowIndexOnRow ? {width:'50px','flex-shirk':'0',padding:'8px'} : {})\"\n [ngClass]=\"header.ngClass || {}\">\n @if (!header.rowsConfig) {\n <ng-container *ngTemplateOutlet=\"templateHeaderContentRef;context:{headerItem:header,isColRender:false}\" />\n }\n @if (header.rowsConfig;as rowsConfig) {\n @for (row of rowsConfig.rows;track row) {\n <div [class]=\"row.classRow\">\n @for (col of row.cols ; track col) {\n <ng-container *ngTemplateOutlet=\"templateHeaderContentRef;context:{headerItem:col,isColRender:true}\" />\n }\n </div>\n }\n }\n </div>\n</ng-template>\n\n<ng-template #templateHeaderContentRef\n let-header='headerItem'\n let-isColRender='isColRender'>\n <div class=\"flex libs-ui-font-h6m min-h-[18px] text-[#6a7383] max-w-full\"\n [class.items-center]='header.contentHeaderAlignCenter ?? true'\n [class.justify-end]='header.contentHeaderJustifyContentEnd'\n [class.w-full]=\"header.isShowIndexOnRow\"\n [ngStyle]=\"isColRender ? ((header|LibsUiTableCalculatorColumnPipe:headerElementRef.clientWidth:headerLeft():headerRight()) || (header.isShowIndexOnRow ? {width:'50px','flex-shirk':'0',padding:'8px'} : {})) : {}\"\n [ngClass]=\"isColRender ? (header.ngClass || {}) : {}\">\n @if (header.hasCheckbox) {\n @if (header.hasCheckboxAll) {\n <div class=\"flex h-full {{ header.checkboxAllClassInclude || 'mr-[16px]' }}\"\n [class.items-center]=\"header.checkboxAlignCenter\">\n <libs_ui-components-checkbox-single [key]=\"'all'\"\n [stillOtherOptions]=\"!!keysSelected().length && keysSelected().length !== items().length\"\n [checked]=\"!!keysSelected().length && keysSelected().length === items().length\"\n [disable]=\"loading()\"\n [classInclude]=\"header.checkboxClassInclude\"\n (outChange)=\"handlerChangeCheckedAllItems($event)\" />\n </div>\n } @else {\n <div class=\"flex h-full ml-[24px] {{ header.checkboxClassInclude }}\">\n </div>\n }\n }\n @for (tooltip of header.tooltipsLeft; track tooltip) {\n <div class=\"mr-[4px]\">\n <libs_ui-components-popover [type]=\"tooltip?.type || 'other'\"\n [mode]=\"tooltip?.mode || 'hover'\"\n [classInclude]=\"tooltip.classInclude || 'text-[#6a7383]'\"\n [ignoreShowPopover]=\"tooltip.ignoreShowTooltip || false\"\n [config]=\"tooltip.config || {content:(tooltip.dataView || ' ') | translate, position: {\n mode: 'center',\n distance: 0,\n autoUpdatePosition: {\n endDistance: 12,\n startDistance: -12\n }\n }}\"\n [innerHTML]=\"tooltip.dataView\" />\n </div>\n }\n\n @if (header.isShowIndexOnRow) {\n <div class=\"flex w-full h-full items-center justify-center {{ header.classIncludeIndexOnRow || '' }}\">\n {{ header.label ?? '#' }}\n </div>\n } @else {\n @if ((header.label | LibsUiPipesCallFunctionInTemplatePipe:header.parseValue:header) | async | translate; as labelHeaderColumn) {\n <libs_ui-components-popover [type]=\"header?.labelConfig?.type || 'text'\"\n [mode]=\"header?.labelConfig?.mode || 'hover'\"\n [classInclude]=\"(header?.labelConfig?.classInclude || '')\"\n [ignoreShowPopover]=\"header?.labelConfig?.ignoreShowTooltip || false\"\n [config]=\"header.labelConfig?.config || {content:labelHeaderColumn}\"\n [innerHTML]=\"labelHeaderColumn\" />\n }\n }\n\n @for (tooltip of header.tooltipsRight; track tooltip) {\n <div class=\"ml-[4px]\">\n <libs_ui-components-popover [type]=\"tooltip?.type || 'other'\"\n [mode]=\"tooltip?.mode || 'hover'\"\n [classInclude]=\"tooltip.classInclude || 'text-[#6a7383]'\"\n [ignoreShowPopover]=\"tooltip.ignoreShowTooltip || false\"\n [config]=\"tooltip.config || {content:(tooltip.dataView || ' ') | translate, position: {\n mode: 'center',\n distance: 0,\n autoUpdatePosition: {\n endDistance: 12,\n startDistance: -12\n }\n }}\"\n [innerHTML]=\"tooltip.dataView\" />\n </div>\n }\n\n @if (header.hasSort && header.orderby) {\n <div class=\"ml-[4px]\">\n <libs_ui-components-buttons-sort-arrow [disable]=\"loading() || !items().length\"\n [fieldSort]=\"header.orderby\"\n [ignorePopoverContent]=\"header.sortIgnoreTooltipContent ?? true\"\n [popoverContentAsc]=\"header.sortTooltipContentAsc\"\n [popoverContentDesc]=\"header.sortTooltipContentDesc\"\n [defaultMode]=\"header.defaultMode\"\n [zIndex]=\"header.zIndexTooltipSort\"\n (outChange)=\"handlerChangeSort($event)\" />\n </div>\n }\n </div>\n @if (header.labelDescription) {\n <div class=\"flex\">\n <libs_ui-components-popover [type]=\"'text'\"\n [classInclude]=\"header.labelDescription.classInclude || ''\"\n [config]=\"{content: header.labelDescription.content | translate}\"\n [innerHTML]=\"header.labelDescription.content | translate\" />\n </div>\n }\n</ng-template>\n\n<ng-template #templateBodyRef\n let-header='header'\n let-data='data'>\n <div class=\"flex w-full h-full\">\n @if (header.hasCheckbox) {\n <div class=\"flex h-full\"\n [class.invisible]=\"header.checkConditionCheckBoxHidden &&( data() | LibsUiPipesCallFunctionInTemplatePipe:header.checkConditionCheckBoxHidden:data() | async)\"\n [class.items-center]=\"header.checkboxAlignCenter\">\n <libs_ui-components-checkbox-single [key]=\"data()[fieldKey()]\"\n [classInclude]=\"header.checkboxClassInclude\"\n [checked]=\"data()[fieldKey()] | LibsUiPipesCheckSelectedByKeyPipe:keysSelected():keysSelected().length\"\n [disable]=\"loading() || disableCheckbox() || !!(maxItemSelected() && !(data()[fieldKey()] | LibsUiPipesCheckSelectedByKeyPipe:keysSelected():keysSelected().length) && keysSelected().length >= maxItemSelected())\"\n (outChange)=\"handlerChangeItemChecked($event,data())\" />\n </div>\n }\n\n @if (header.isShowIndexOnRow; as config) {\n <div class=\"w-full flex items-center justify-center libs-ui-font-h4r{{ config.classIncludeIndexOnRow || '' }}\">\n <div LibsUiComponentsPopoverDirective\n [type]=\"'text'\"\n [config]=\"{}\"\n [innerHTML]=\"data | LibsUiPipesCallFunctionInTemplatePipe:getIndexRow | async\">\n </div>\n </div>\n }\n\n @if (header.colTemplateConfig) {\n <libs_ui-components-table-templates [isHover]=\"itemOfIndexHover === data && !data.specificHightLight\"\n [class]=\"header.templateCssWrapperHost || ''\"\n [item]=\"data\"\n [templateCssWrapper]=\"header.templateCssWrapper\"\n [configs]=\"header.colTemplateConfig\" />\n }\n </div>\n</ng-template>\n\n<ng-template #templateFooterRef>\n @if (!isHiddenHeaderWhenNodata() || (isHiddenHeaderWhenNodata() && items().length)) {\n <div #footerElementRef\n class=\"flex w-full bg-[#f8f9fa] overflow-x-hidden z-[1] {{ ignoreBorderFooter() ? '': (customPositionFooter() === 'top' ? 'libs-ui-border-bottom-general':'libs-ui-table-shadow-top libs-ui-border-top-general') }} min-h-[35px]\"\n (mouseenter)=\"handlerMouseEnterFooter($event)\"\n (mouseleave)=\"handlerMouseLeaveFooter($event)\">\n @if (footerLeft()) {\n <div #footerLeftElementRef\n class=\"flex sticky top-0 left-0 z-[1] bg-[#f8f9fa]\">\n @for (footer of footerLeft();track footer) {\n <div\n class=\"flex items-center px-[12px] py-[8px] {{ footer.ignoreBorderRight ? '': 'libs-ui-border-right-general' }}\"\n [ngStyle]=\"(footer|LibsUiTableCalculatorColumnPipe:headerElementRef.clientWidth:footerLeft():footerRight()) || {}\"\n [ngClass]=\"footer.ngClass || {}\">\n @if (footer.colTemplateConfig && itemFooter()) {\n <libs_ui-components-table-templates [item]=\"itemFooter|LibsUiPipesConvertObjectToSignalPipe\"\n [templateCssWrapper]=\"footer.templateCssWrapper\"\n [configs]=\"footer.colTemplateConfig\" />\n }\n </div>\n }\n </div>\n }\n @if (footerRight()) {\n @for (footer of footerRight();track footer) {\n <div class=\"flex items-center px-[12px] py-[8px]\"\n [ngStyle]=\"(footer|LibsUiTableCalculatorColumnPipe:headerElementRef.clientWidth:footerLeft():footerRight()) || {}\"\n [ngClass]=\"footer.ngClass || {}\">\n @if (footer.colTemplateConfig && itemFooter()) {\n <libs_ui-components-table-templates [item]=\"itemFooter|LibsUiPipesConvertObjectToSignalPipe\"\n [templateCssWrapper]=\"footer.templateCssWrapper\"\n [configs]=\"footer.colTemplateConfig\" />\n }\n </div>\n }\n }\n\n </div>\n }\n</ng-template>\n\n<ng-template #templateNodataRef>\n @if (!keySearch() && templateNoData(); as templateNoData) {\n <ng-container *ngTemplateOutlet=\"templateNoData\" />\n } @if (keySearch() && templateNoResult(); as templateNoResult) {\n <ng-container *ngTemplateOutlet=\"templateNoResult\" />\n }\n @if (!templateNoData() && !templateNoResult() && noDataConfig(); as config) {\n <div class=\"flex items-center justify-center w-full h-full absolute left-0 top-0 z-[1]\">\n <div class=\"flex flex-col items-center justify-center w-full h-full shrink-0\"\n LibsUiComponentsScrollOverlayDirective>\n @if (!keySearch() && !onlyShowNoResult()) {\n <ng-container *ngComponentOutlet=\" ('no-data' | LibsUiIconsGetIconComponentPipe | async);inputs:{size:64}\" />\n <div class=\"libs-ui-table-no-data-config-text\"\n [ngStyle]=\"config.ngStyle || {}\"\n [ngClass]=\"config.ngClass || {}\"\n [innerHtml]=\"config.textNoData | translate\">\n </div>\n }\n @if (keySearch() || onlyShowNoResult()) {\n <ng-container *ngComponentOutlet=\"('no-result' | LibsUiIconsGetIconComponentPipe | async);inputs:{size:64}\" />\n <div class=\"libs-ui-table-no-data-config-text\"\n [ngStyle]=\"config.ngStyle || {}\"\n [ngClass]=\"config.ngClass || {}\"\n [innerHtml]=\"config.textSearchNoData | translate\">\n </div>\n }\n </div>\n </div>\n }\n</ng-template>\n", styles: [".libs-ui-table-header-container{height:33px;flex-shrink:0}.libs-ui-table-header-col{height:100%;width:100%;align-items:center}.libs-ui-table-no-data-config-text{margin-top:16px;font-size:12px;color:#9ca2ad;font-family:var(--libs-ui-font-family-name, \"Arial\");font-weight:400}.libs-ui-table-no-data-config-icon{margin-bottom:12px}.libs-ui-table-no-data-config-icon:before{font-size:84px;color:#c1c1c1}.libs-ui-table-shadow-bottom{box-shadow:0 1px 1px #00143305,0 4px 8px #0014330a}@media only screen and (min-width: 1921px){.libs-ui-border-bottom-general{border-bottom:solid 2px #e6e8ed!important}}\n"] }]
670
+ ], template: "<div class='flex flex-col w-full h-full'>\n @if (!ignoreBar()) {\n <div\n class=\"flex items-center relative z-[1] bottom-0 left-0 w-full bg-white libs-ui-table-shadow-bottom {{ classBarInclude() }}\"\n [class.px-[16px]]=\"keysSelected().length || labelBarNoSelectItem()\"\n [class.py-[6px]]=\"keysSelected().length || labelBarNoSelectItem()\"\n (mouseenter)=\"resetIndexHover($event)\">\n <ng-content select='div.libs-ui-table-bar-left'></ng-content>\n @if (!keysSelected().length && labelBarNoSelectItem()) {\n <div class=\"{{ classLabelBarNoSelectItem() ?? 'px-[12px] py-[5px]' }}\"\n [innerHtml]='labelBarNoSelectItem() | translate:{value:totalItemDisplay()}'>\n </div>\n }\n @if (keysSelected().length) {\n <div class=\"flex items-center pl-[12px]\">\n <div class=\"flex items-center h-full mt-[-2px]\">\n <libs_ui-components-checkbox-single [checked]=\"true\"\n [disable]=\"loading() || disableCheckbox()\"\n (outChange)=\"handlerChangeAllChecked()\" />\n </div>\n <div class=\"libs-ui-font-h5m text-[#071631] mr-[8px] {{ classLabelBarButtons() }}\">\n {{ labelBarButtons() | translate:{ value:keysSelected().length } }}\n </div>\n @if (configSelectMoreItem()) {\n <libs_ui-components-dropdown [isNgContent]=\"true\"\n [popoverCustomConfig]=\"{\n widthByParent:false,\n ignoreArrow: true,\n maxHeight: 2048,\n classInclude:'!w-[121px]',\n position: {\n mode:'start',\n distance:0\n }\n }\"\n [listConfig]=\"listConfigMoreItem()\"\n [listHiddenInputSearch]=\"true\"\n [listMaxItemShow]=\"5\"\n class=\"!w-[16px] h-[16px] mr-[8px]\"\n (outSelectKey)=\"handlerSelectedMoreItem($event)\"\n (outFunctionsControl)=\"handlerFunctionControlMoreSelectItem($event)\">\n <libs_ui-components-buttons-button [type]=\"'button-link-primary'\"\n [classInclude]=\"'!p-0 m-0'\"\n [classIconLeft]=\"'before:!text-[16px] libs-ui-icon-move-right rotate-90 mr-[6px]'\"\n [popover]=\"{config:{content:'i18n_more_select'}}\"\n [ignoreStopPropagationEvent]=\"true\" />\n </libs_ui-components-dropdown>\n }\n <div class=\"h-[16px] libs-ui-border-left-general ml-[16px]\"></div>\n @if (barButtons()?.length) {\n @for (button of barButtons();track button) {\n <libs_ui-components-buttons-button [type]=\"button.type || 'button-link-primary'\"\n [classIconLeft]=\"button.classIconLeft || ''\"\n [classInclude]=\"button.classInclude || ''\"\n [label]=\"(button.label || ' ') | translate\"\n (outClick)=\"handlerBarButtonClick(button)\" />\n }\n }\n </div>\n }\n <ng-content select='div.libs-ui-table-bar-right'></ng-content>\n </div>\n }\n\n <div #tableContainerElementRef\n class=\"libs-ui-table flex flex-col w-full h-full relative {{ classTableContainerInclude() }}\"\n [class.px-[16px]]='!ignoreBar()'\n (mouseleave)=\"handlerMouseLeaveContainer($event)\">\n <div class=\"relative w-full shrink-0\"\n [style.height.px]=\"headerElementRef.offsetHeight\">\n <div #headerElementRef\n LibsUiComponentsScrollOverlayDirective\n [options]=\"{scrollbarWidth: 0}\"\n [class.libs-ui-border-bottom-dashed-general]=\"!hasItemHightLight() && isDashBorder()\"\n [class.libs-ui-border-bottom-general]=\"!hasItemHightLight() && !isDashBorder()\"\n [class.!hidden]=\"!items().length && isHiddenHeaderWhenNodata()\"\n [class]=\"classHeaderContainer()\"\n (outScroll)=\"handlerScrollHeader($event)\"\n (mouseenter)=\"handlerMouseEnterHeader($event)\"\n (mouseleave)=\"handlerMouseLeaveHeader($event)\">\n @if (headerLeft().length) {\n <div [class]=\"classHeaderLeftContainer()\">\n @for (header of headerLeft();track header) {\n <ng-container *ngTemplateOutlet=\"templateHeaderRef;context:{headerItem:header,isHeaderLeft:true}\" />\n }\n </div>\n }\n @if (headerRight().length) {\n @for (header of headerRight();track header) {\n <ng-container *ngTemplateOutlet=\"templateHeaderRef;context:{headerItem:header,isHeaderLeft:false}\" />\n }\n }\n </div>\n </div>\n @if (showFooter() && itemFooter() && customPositionFooter() === 'top') {\n <ng-container *ngTemplateOutlet='templateFooterRef' />\n }\n <div class=\"relative flex flex-col w-full h-full overflow-x-hidden bg-white {{ classBodyInclude() || '' }}\">\n <div #bodyElementRef\n class=\"flex h-full w-full relative\"\n LibsUiComponentsScrollOverlayDirective\n (outScroll)=\"handlerScrollBody($event)\"\n (outScrollBottom)=\"handlerScrollBottom($event)\">\n @if (items().length) {\n <virtual-scroller #bodyComponentRef\n [items]=\"items()\"\n [enableUnequalChildrenSizes]=\"enableUnequalChildrenSizes()\"\n class=\"h-full\"\n [style.width.px]=\"headerElementRef.scrollWidth > (bodyElementRef ? bodyElementRef.scrollWidth : 0) ? headerElementRef.scrollWidth: undefined\"\n [parentScroll]=\"bodyElementRef\"\n [bufferAmount]=\"bufferAmount()\">\n @for (data of bodyComponentRef.viewPortItems;track data()) {\n <div #elementHover\n class=\"flex\"\n [class.bg-[#f3fcfc]]=\"data().specificHightLight\"\n [class.libs-ui-border-top-1px-36d3d3]=\"data().specificHightLight && $first && !ignoreBorderItem()\"\n [class.libs-ui-border-bottom-1px-36d3d3]=\"data().specificHightLight && !ignoreBorderItem()\"\n [ngClass]=\"(data().specificHightLight || ($last && ignoreBorderItemLast())) ? 'libs-ui-border-radius-bottom-left-4px libs-ui-border-radius-bottom-right-4px' : ignoreBorderItem() ? '' : isDashBorder() ? 'libs-ui-border-bottom-dashed-general' : 'libs-ui-border-bottom-general'\"\n [style.width.px]=\"headerElementRef.scrollWidth\"\n [class.bg-[#f8f9fa]]=\"itemOfIndexHover === data && !data().specificHightLight\"\n (mouseenter)=\"setIndexHover($event,data)\"\n (mouseleave)=\"resetIndexHoverWhenMouseLeave($event)\">\n @if (headerLeft().length || headerRight().length) {\n <div class=\"flex flex-col w-full\">\n <div class=\"flex w-full\">\n @if (headerLeft().length) {\n <div class=\"flex sticky top-0 left-0 z-[1]\"\n [class.bg-white]=\"!data().specificHightLight\"\n [class.bg-[#f3fcfc]]=\"data().specificHightLight\">\n @for (header of headerLeft();track header) {\n <div\n class=\"relative flex px-[12px] py-[8px] {{ header.ignoreBorderRight ? '': 'libs-ui-border-right-general' }}\"\n [class.bg-[#f8f9fa]]=\"itemOfIndexHover === data && !data().specificHightLight\"\n [ngStyle]=\"(header|LibsUiTableCalculatorColumnPipe:headerElementRef.clientWidth:headerLeft():headerRight()) || (header.isShowIndexOnRow ? {width:'50px','flex-shirk':'0',padding:'8px'} : {})\"\n [ngClass]=\"header.ngClass || {}\">\n <ng-container *ngTemplateOutlet=\"templateBodyRef;context:{header:header,data:data}\" />\n </div>\n }\n </div>\n }\n @if (headerRight().length) {\n @for (header of headerRight();track header) {\n <div class=\"relative flex px-[12px] py-[8px]\"\n [ngStyle]=\"(header|LibsUiTableCalculatorColumnPipe:headerElementRef.clientWidth:headerLeft():headerRight()) || (header.isShowIndexOnRow ? {width:'50px','flex-shirk':'0',padding:'8px'} : {})\"\n [ngClass]=\"header.ngClass || {}\">\n <ng-container *ngTemplateOutlet=\"templateBodyRef;context:{header:header,data:data}\" />\n </div>\n }\n }\n </div>\n @if (configTemplateItemCollapseExpand() && data().specificExpand && data()[configTemplateItemCollapseExpand()?.fieldGetDataExpand || 'specificDataExpand']) {\n <div [class]=\"configTemplateItemCollapseExpand()?.cssWrapper || 'flex w-full'\">\n @for (dataExpand of data()[configTemplateItemCollapseExpand()?.fieldGetDataExpand || 'specificDataExpand']();track $index) {\n @if (configTemplateItemCollapseExpand()?.colTemplateConfig) {\n <libs_ui-components-table-templates [item]=\"dataExpand\"\n [templateCssWrapper]=\"configTemplateItemCollapseExpand()?.templateCssWrapper\"\n [configs]=\"configTemplateItemCollapseExpand()?.colTemplateConfig\" />\n }\n } @empty {\n <div class=\"relative h-[100px]\">\n <ng-container *ngTemplateOutlet=\"templateNodataRef\" />\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n </virtual-scroller>\n } @else if (!loading()) {\n <div class=\"sticky left-0 top-0 z-[1] h-full w-full\">\n <ng-container *ngTemplateOutlet=\"templateNodataRef\" />\n </div>\n @if (showScrollTablePinnedIfNoData()) {\n <div class=\"absolute h-[1px] bg-transparent top-0 left-0 z-[1]\"\n [style.width.px]=\"headerElementRef.scrollWidth\"></div>\n }\n }\n </div>\n\n @if (showFooter() && itemFooter() && customPositionFooter() === 'bottom') {\n <ng-container *ngTemplateOutlet='templateFooterRef' />\n }\n\n @if (loading()) {\n <div class=\"absolute w-full h-full z-[2] flex items-center content-center\">\n <libs_ui-components-spinner />\n </div>\n }\n </div>\n </div>\n</div>\n\n<ng-template #templateHeaderRef\n let-header='headerItem'\n let-isHeaderLeft='isHeaderLeft'>\n <div\n [class]=\"'relative flex '+ (header.paddingLeftRightHeaderContainer ?? ' px-[12px] ') + (isHeaderLeft && !header.ignoreBorderRight ? ' libs-ui-border-right-general ' : ' ')+ ' libs-ui-table-header-col '\"\n [class.flex-col]=\"header.rowsConfig\"\n [class.py-[8px]]='!header.ignorePyDefault'\n [ngStyle]=\"(header|LibsUiTableCalculatorColumnPipe:headerElementRef.clientWidth:headerLeft():headerRight()) || (header.isShowIndexOnRow ? {width:'50px','flex-shirk':'0',padding:'8px'} : {})\"\n [ngClass]=\"header.ngClass || {}\">\n @if (!header.rowsConfig) {\n <ng-container *ngTemplateOutlet=\"templateHeaderContentRef;context:{headerItem:header,isColRender:false}\" />\n }\n @if (header.rowsConfig;as rowsConfig) {\n @for (row of rowsConfig.rows;track row) {\n <div [class]=\"row.classRow\">\n @for (col of row.cols ; track col) {\n <ng-container *ngTemplateOutlet=\"templateHeaderContentRef;context:{headerItem:col,isColRender:true}\" />\n }\n </div>\n }\n }\n </div>\n</ng-template>\n\n<ng-template #templateHeaderContentRef\n let-header='headerItem'\n let-isColRender='isColRender'>\n <div class=\"flex libs-ui-font-h6m min-h-[18px] text-[#6a7383] max-w-full\"\n [class.items-center]='header.contentHeaderAlignCenter ?? true'\n [class.justify-end]='header.contentHeaderJustifyContentEnd'\n [class.w-full]=\"header.isShowIndexOnRow\"\n [ngStyle]=\"isColRender ? ((header|LibsUiTableCalculatorColumnPipe:headerElementRef.clientWidth:headerLeft():headerRight()) || (header.isShowIndexOnRow ? {width:'50px','flex-shirk':'0',padding:'8px'} : {})) : {}\"\n [ngClass]=\"isColRender ? (header.ngClass || {}) : {}\">\n @if (header.hasCheckbox) {\n @if (header.hasCheckboxAll) {\n <div class=\"flex h-full {{ header.checkboxAllClassInclude || 'mr-[16px]' }}\"\n [class.items-center]=\"header.checkboxAlignCenter\">\n <libs_ui-components-checkbox-single [key]=\"'all'\"\n [stillOtherOptions]=\"!!keysSelected().length && keysSelected().length !== items().length\"\n [checked]=\"!!keysSelected().length && keysSelected().length === items().length\"\n [disable]=\"loading()\"\n [classInclude]=\"header.checkboxClassInclude\"\n (outChange)=\"handlerChangeCheckedAllItems($event)\" />\n </div>\n } @else {\n <div class=\"flex h-full ml-[24px] {{ header.checkboxClassInclude }}\">\n </div>\n }\n }\n @for (tooltip of header.tooltipsLeft; track tooltip) {\n <div class=\"mr-[4px]\">\n <libs_ui-components-popover [type]=\"tooltip?.type || 'other'\"\n [mode]=\"tooltip?.mode || 'hover'\"\n [classInclude]=\"tooltip.classInclude || 'text-[#6a7383]'\"\n [ignoreShowPopover]=\"tooltip.ignoreShowTooltip || false\"\n [config]=\"tooltip.config || {content:(tooltip.dataView || ' ') | translate, position: {\n mode: 'center',\n distance: 0,\n autoUpdatePosition: {\n endDistance: 12,\n startDistance: -12\n }\n }}\"\n [innerHTML]=\"tooltip.dataView\" />\n </div>\n }\n\n @if (header.isShowIndexOnRow) {\n <div class=\"flex w-full h-full items-center justify-center {{ header.classIncludeIndexOnRow || '' }}\">\n {{ header.label ?? '#' }}\n </div>\n } @else {\n @if ((header.label | LibsUiPipesCallFunctionInTemplatePipe:header.parseValue:header) | async | translate; as labelHeaderColumn) {\n <libs_ui-components-popover [type]=\"header?.labelConfig?.type || 'text'\"\n [mode]=\"header?.labelConfig?.mode || 'hover'\"\n [classInclude]=\"(header?.labelConfig?.classInclude || '')\"\n [ignoreShowPopover]=\"header?.labelConfig?.ignoreShowTooltip || false\"\n [config]=\"header.labelConfig?.config || {content:labelHeaderColumn}\"\n [innerHTML]=\"labelHeaderColumn\" />\n }\n }\n\n @for (tooltip of header.tooltipsRight; track tooltip) {\n <div class=\"ml-[4px]\">\n <libs_ui-components-popover [type]=\"tooltip?.type || 'other'\"\n [mode]=\"tooltip?.mode || 'hover'\"\n [classInclude]=\"tooltip.classInclude || 'text-[#6a7383]'\"\n [ignoreShowPopover]=\"tooltip.ignoreShowTooltip || false\"\n [config]=\"tooltip.config || {content:(tooltip.dataView || ' ') | translate, position: {\n mode: 'center',\n distance: 0,\n autoUpdatePosition: {\n endDistance: 12,\n startDistance: -12\n }\n }}\"\n [innerHTML]=\"tooltip.dataView\" />\n </div>\n }\n\n @if (header.hasSort && header.orderby) {\n <div class=\"ml-[4px]\">\n <libs_ui-components-buttons-sort-arrow [disable]=\"loading() || !items().length\"\n [fieldSort]=\"header.orderby\"\n [ignorePopoverContent]=\"header.sortIgnoreTooltipContent ?? true\"\n [popoverContentAsc]=\"header.sortTooltipContentAsc\"\n [popoverContentDesc]=\"header.sortTooltipContentDesc\"\n [defaultMode]=\"header.defaultMode\"\n [zIndex]=\"header.zIndexTooltipSort\"\n (outChange)=\"handlerChangeSort($event)\" />\n </div>\n }\n </div>\n @if (header.labelDescription) {\n <div class=\"flex\">\n <libs_ui-components-popover [type]=\"'text'\"\n [classInclude]=\"header.labelDescription.classInclude || ''\"\n [config]=\"{content: header.labelDescription.content | translate}\"\n [innerHTML]=\"header.labelDescription.content | translate\" />\n </div>\n }\n</ng-template>\n\n<ng-template #templateBodyRef\n let-header='header'\n let-data='data'>\n <div class=\"flex w-full h-full\">\n @if (header.hasCheckbox) {\n <div class=\"flex h-full\"\n [class.invisible]=\"header.checkConditionCheckBoxHidden &&( data() | LibsUiPipesCallFunctionInTemplatePipe:header.checkConditionCheckBoxHidden:data() | async)\"\n [class.items-center]=\"header.checkboxAlignCenter\">\n <libs_ui-components-checkbox-single [key]=\"data()[fieldKey()]\"\n [classInclude]=\"header.checkboxClassInclude\"\n [checked]=\"data()[fieldKey()] | LibsUiPipesCheckSelectedByKeyPipe:keysSelected():keysSelected().length\"\n [disable]=\"loading() || disableCheckbox() || !!(maxItemSelected() && !(data()[fieldKey()] | LibsUiPipesCheckSelectedByKeyPipe:keysSelected():keysSelected().length) && keysSelected().length >= maxItemSelected())\"\n (outChange)=\"handlerChangeItemChecked($event,data())\" />\n </div>\n }\n\n @if (header.isShowIndexOnRow; as config) {\n <div class=\"w-full flex items-center justify-center libs-ui-font-h4r{{ config.classIncludeIndexOnRow || '' }}\">\n <div LibsUiComponentsPopoverDirective\n [type]=\"'text'\"\n [config]=\"{}\"\n [innerHTML]=\"data | LibsUiPipesCallFunctionInTemplatePipe:getIndexRow | async\">\n </div>\n </div>\n }\n\n @if (header.colTemplateConfig) {\n <libs_ui-components-table-templates [isHover]=\"itemOfIndexHover === data && !data.specificHightLight\"\n [class]=\"header.templateCssWrapperHost || ''\"\n [item]=\"data\"\n [templateCssWrapper]=\"header.templateCssWrapper\"\n [configs]=\"header.colTemplateConfig\" />\n }\n </div>\n</ng-template>\n\n<ng-template #templateFooterRef>\n @if (!isHiddenHeaderWhenNodata() || (isHiddenHeaderWhenNodata() && items().length)) {\n <div #footerElementRef\n class=\"flex w-full bg-[#f8f9fa] overflow-x-hidden z-[1] {{ ignoreBorderFooter() ? '': (customPositionFooter() === 'top' ? 'libs-ui-border-bottom-general':'libs-ui-table-shadow-top libs-ui-border-top-general') }} min-h-[35px]\"\n (mouseenter)=\"handlerMouseEnterFooter($event)\"\n (mouseleave)=\"handlerMouseLeaveFooter($event)\">\n @if (footerLeft()) {\n <div #footerLeftElementRef\n class=\"flex sticky top-0 left-0 z-[1] bg-[#f8f9fa]\">\n @for (footer of footerLeft();track footer) {\n <div\n class=\"flex items-center px-[12px] py-[8px] {{ footer.ignoreBorderRight ? '': 'libs-ui-border-right-general' }}\"\n [ngStyle]=\"(footer|LibsUiTableCalculatorColumnPipe:headerElementRef.clientWidth:footerLeft():footerRight()) || {}\"\n [ngClass]=\"footer.ngClass || {}\">\n @if (footer.colTemplateConfig && itemFooter()) {\n <libs_ui-components-table-templates [item]=\"itemFooter|LibsUiPipesConvertObjectToSignalPipe\"\n [templateCssWrapper]=\"footer.templateCssWrapper\"\n [configs]=\"footer.colTemplateConfig\" />\n }\n </div>\n }\n </div>\n }\n @if (footerRight()) {\n @for (footer of footerRight();track footer) {\n <div class=\"flex items-center px-[12px] py-[8px]\"\n [ngStyle]=\"(footer|LibsUiTableCalculatorColumnPipe:headerElementRef.clientWidth:footerLeft():footerRight()) || {}\"\n [ngClass]=\"footer.ngClass || {}\">\n @if (footer.colTemplateConfig && itemFooter()) {\n <libs_ui-components-table-templates [item]=\"itemFooter|LibsUiPipesConvertObjectToSignalPipe\"\n [templateCssWrapper]=\"footer.templateCssWrapper\"\n [configs]=\"footer.colTemplateConfig\" />\n }\n </div>\n }\n }\n\n </div>\n }\n</ng-template>\n\n<ng-template #templateNodataRef>\n @if (!keySearch() && templateNoData(); as templateNoData) {\n <ng-container *ngTemplateOutlet=\"templateNoData\" />\n } @if (keySearch() && templateNoResult(); as templateNoResult) {\n <ng-container *ngTemplateOutlet=\"templateNoResult\" />\n }\n @if (!templateNoData() && !templateNoResult() && noDataConfig(); as config) {\n <div class=\"flex items-center justify-center w-full h-full absolute left-0 top-0 z-[1]\">\n <div class=\"flex flex-col items-center justify-center w-full h-full shrink-0\"\n LibsUiComponentsScrollOverlayDirective>\n @if (!keySearch() && !onlyShowNoResult()) {\n <ng-container *ngComponentOutlet=\" ('no-data' | LibsUiIconsGetIconComponentPipe | async);inputs:{size:64}\" />\n <div class=\"libs-ui-table-no-data-config-text\"\n [ngStyle]=\"config.ngStyle || {}\"\n [ngClass]=\"config.ngClass || {}\"\n [innerHtml]=\"config.textNoData | translate\">\n </div>\n }\n @if (keySearch() || onlyShowNoResult()) {\n <ng-container *ngComponentOutlet=\"('no-result' | LibsUiIconsGetIconComponentPipe | async);inputs:{size:64}\" />\n <div class=\"libs-ui-table-no-data-config-text\"\n [ngStyle]=\"config.ngStyle || {}\"\n [ngClass]=\"config.ngClass || {}\"\n [innerHtml]=\"config.textSearchNoData | translate\">\n </div>\n }\n </div>\n </div>\n }\n</ng-template>\n", styles: [".libs-ui-table-header-container{height:33px;flex-shrink:0}.libs-ui-table-header-col{height:100%;width:100%;align-items:center}.libs-ui-table-no-data-config-text{margin-top:16px;font-size:12px;color:#9ca2ad;font-family:var(--libs-ui-font-family-name, \"Arial\");font-weight:400}.libs-ui-table-no-data-config-icon{margin-bottom:12px}.libs-ui-table-no-data-config-icon:before{font-size:84px;color:#c1c1c1}.libs-ui-table-shadow-bottom{box-shadow:0 1px 1px #00143305,0 4px 8px #0014330a}@media only screen and (min-width: 1921px){.libs-ui-border-bottom-general{border-bottom:solid 2px #e6e8ed!important}}\n"] }]
671
671
  }], ctorParameters: () => [] });
672
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL3RhYmxlL3NyYy90YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvdGFibGUvc3JjL3RhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHVEQUF1RDtBQUN2RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNuRyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFjLE1BQU0sRUFBRSxLQUFLLEVBQXFCLE1BQU0sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBa0IsTUFBTSxlQUFlLENBQUM7QUFDNU0sT0FBTyxFQUE0QixxQkFBcUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ2pHLE9BQU8sRUFBVyxzQ0FBc0MsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3JHLE9BQU8sRUFBUyx5Q0FBeUMsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBRXBHLE9BQU8sRUFBa0IsdUNBQXVDLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUM5RyxPQUFPLEVBQWlELGlDQUFpQyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDaEksT0FBTyxFQUFFLGdDQUFnQyxFQUFzQixNQUFNLDZCQUE2QixDQUFDO0FBQ25HLE9BQU8sRUFBRSxzQ0FBc0MsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQzVGLE9BQU8sRUFBRSxnQ0FBZ0MsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQy9FLE9BQU8sRUFBRSwrQkFBK0Is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bnQiOlsiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuaW1wb3J0IHsgQXN5bmNQaXBlLCBOZ0NsYXNzLCBOZ0NvbXBvbmVudE91dGxldCwgTmdTdHlsZSwgTmdUZW1wbGF0ZU91dGxldCB9IGZyb20gXCJAYW5ndWxhci9jb21tb25cIjtcbmltcG9ydCB7IEh0dHBQYXJhbXMgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uL2h0dHBcIjtcbmltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBjb21wdXRlZCwgZWZmZWN0LCBFbGVtZW50UmVmLCBpbmplY3QsIGlucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgb3V0cHV0LCBzaWduYWwsIHVudHJhY2tlZCwgdmlld0NoaWxkLCBXcml0YWJsZVNpZ25hbCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBWaXJ0dWFsU2Nyb2xsZXJDb21wb25lbnQsIFZpcnR1YWxTY3JvbGxlck1vZHVsZSB9IGZyb20gJ0BpaGFyYmVjay9uZ3gtdmlydHVhbC1zY3JvbGxlcic7XG5pbXBvcnQgeyBJQnV0dG9uLCBMaWJzVWlDb21wb25lbnRzQnV0dG9uc0J1dHRvbkNvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtYnV0dG9ucy1idXR0b24nO1xuaW1wb3J0IHsgSVNvcnQsIExpYnNVaUNvbXBvbmVudHNCdXR0b25zU29ydEFycm93Q29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1idXR0b25zLXNvcnQnO1xuaW1wb3J0IHsgSUNoZWNrYm94SXRlbSB9IGZyb20gXCJAbGlicy11aS9jb21wb25lbnRzLWNoZWNrYm94LWdyb3VwXCI7XG5pbXBvcnQgeyBJQ2hlY2tib3hFdmVudCwgTGlic1VpQ29tcG9uZW50c0NoZWNrYm94U2luZ2xlQ29tcG9uZW50IH0gZnJvbSBcIkBsaWJzLXVpL2NvbXBvbmVudHMtY2hlY2tib3gtc2luZ2xlXCI7XG5pbXBvcnQgeyBJRHJvcGRvd25GdW5jdGlvbkNvbnRyb2xFdmVudCwgSUVtaXRTZWxlY3RLZXksIExpYnNVaUNvbXBvbmVudHNEcm9wZG93bkNvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtZHJvcGRvd24nO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c1BvcG92ZXJDb21wb25lbnQsIFRZUEVfUE9QT1ZFUl9FVkVOVCB9IGZyb20gXCJAbGlicy11aS9jb21wb25lbnRzLXBvcG92ZXJcIjtcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNTY3JvbGxPdmVybGF5RGlyZWN0aXZlIH0gZnJvbSBcIkBsaWJzLXVpL2NvbXBvbmVudHMtc2Nyb2xsLW92ZXJsYXlcIjtcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNTcGlubmVyQ29tcG9uZW50IH0gZnJvbSBcIkBsaWJzLXVpL2NvbXBvbmVudHMtc3Bpbm5lclwiO1xuaW1wb3J0IHsgTGlic1VpSWNvbnNHZXRJY29uQ29tcG9uZW50UGlwZSB9IGZyb20gXCJAbGlicy11aS9pY29uc1wiO1xuaW1wb3J0IHsgSUh0dHBSZXNwb25zZUVycm9yLCBJUGFnaW5nLCBUWVBFX09CSkVDVCwgVFlQRV9URU1QTEFURV9SRUYgfSBmcm9tIFwiQGxpYnMtdWkvaW50ZXJmYWNlcy10eXBlc1wiO1xuaW1wb3J0IHsgTGlic1VpUGlwZXNDYWxsRnVuY3Rpb25JblRlbXBsYXRlUGlwZSB9IGZyb20gXCJAbGlicy11aS9waXBlcy1jYWxsLWZ1bmN0aW9uLWluLXRlbXBsYXRlXCI7XG5pbXBvcnQgeyBMaWJzVWlQaXBlc0NoZWNrU2VsZWN0ZWRCeUtleVBpcGUgfSBmcm9tICdAbGlicy11aS9waXBlcy1jaGVjay1zZWxlY3RlZC1ieS1rZXknO1xuaW1wb3J0IHsgSUh0dHBSZXF1ZXN0Q29uZmlnLCBMaWJzVWlIdHRwUmVxdWVzdFNlcnZpY2UsIHJldHVybkxpc3RPYmplY3QgfSBmcm9tIFwiQGxpYnMtdWkvc2VydmljZXMtaHR0cC1yZXF1ZXN0XCI7XG5pbXBvcnQgeyBjbG9uZURlZXAsIGNvbnZlcnRPYmplY3RUb1NpZ25hbCwgZGVsZXRlVW5pY29kZSwgZ2V0LCBzZXQsIHZpZXdEYXRhTnVtYmVyQnlMYW5ndWFnZSB9IGZyb20gXCJAbGlicy11aS91dGlsc1wiO1xuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlIH0gZnJvbSBcIkBuZ3gtdHJhbnNsYXRlL2NvcmVcIjtcbmltcG9ydCB7IGZyb21FdmVudCwgbGFzdFZhbHVlRnJvbSwgb2YsIFN1YmplY3QsIHRha2VVbnRpbCwgdGltZXIgfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHsgSUJ1dHRvbkJhckV2ZW50LCBJQ29uZmlnU2VsZWN0TW9yZUl0ZW0sIElDb25maWdUZW1wbGF0ZUl0ZW1Db2xsYXBzZUV4cGFuZCwgSUhvdmVyQnV0dG9uQWN0aW9uRXZlbnQsIElMb2FkTW9yZUV2ZW50LCBJU29ydEV2ZW50LCBJVGFiZWxCdXR0b25BY3Rpb25FdmVudCwgSVRhYmxlRm9vdGVyQ29uZmlnLCBJVGFibGVIZWFkZXJDb25maWcsIFRZUEVfREFUQV9GSUxURVJfVEFCTEUsIFRZUEVfREFUQV9UQUJMRSwgVFlQRV9JVEVNX0RBVEFfVEFCTEUsIFRZUEVfTkVXX0RBVEFfVEFCTEUsIFRZUEVfVEFCTEVfRklMVEVSIH0gZnJvbSBcIi4vaW50ZXJmYWNlc1wiO1xuaW1wb3J0IHsgSVRhYmxlRnVuY3Rpb25Db250cm9sRXZlbnQgfSBmcm9tIFwiLi9pbnRlcmZhY2VzL2Z1bmN0aW9uLWNvbnRyb2wtZXZlbnQuaW50ZXJmYWNlXCI7XG5pbXBvcnQgeyBJVGFibGVOb0RhdGFDb25maWcgfSBmcm9tIFwiLi9pbnRlcmZhY2VzL25vLWRhdGEtY29uZmlnLmludGVyZmFjZVwiO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c1RhYmxlVGVtcGxhdGVzQ29tcG9uZW50IH0gZnJvbSBcIi4vdGVtcGxhdGVzL3RlbXBsYXRlcy5jb21wb25lbnRcIjtcbmltcG9ydCB7IElMaXN0Q29uZmlnSXRlbSB9IGZyb20gXCJAbGlicy11aS9jb21wb25lbnRzLWxpc3RcIjtcbmltcG9ydCB7IExpYnNVaVRhYmxlQ2FsY3VsYXRvckNvbHVtblBpcGUgfSBmcm9tIFwiLi9waXBlcy9jYWxjdWxhdG9yLWNvbHVtbi5waXBlXCI7XG5pbXBvcnQgeyBMaWJzVWlQaXBlc0NvbnZlcnRPYmplY3RUb1NpZ25hbFBpcGUgfSBmcm9tIFwiQGxpYnMtdWkvcGlwZXMtY29udmVydC1vYmplY3QtdG8tc2lnbmFsXCI7XG5cbkBDb21wb25lbnQoe1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L2NvbXBvbmVudC1zZWxlY3RvclxuICBzZWxlY3RvcjogJ2xpYnNfdWktY29tcG9uZW50cy10YWJsZScsXG4gIHRlbXBsYXRlVXJsOiAnLi90YWJsZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3RhYmxlLmNvbXBvbmVudC5zY3NzJ10sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBpbXBvcnRzOiBbXG4gICAgTmdDbGFzcywgTmdTdHlsZSwgQXN5bmNQaXBlLCBOZ1RlbXBsYXRlT3V0bGV0LCBOZ0NvbXBvbmVudE91dGxldCwgTGlic1VpQ29tcG9uZW50c1RhYmxlVGVtcGxhdGVzQ29tcG9uZW50LFxuICAgIFRyYW5zbGF0ZU1vZHVsZSwgVmlydHVhbFNjcm9sbGVyTW9kdWxlLCBMaWJzVWlDb21wb25lbnRzQnV0dG9uc0J1dHRvbkNvbXBvbmVudCwgTGlic1VpUGlwZXNDb252ZXJ0T2JqZWN0VG9TaWduYWxQaXBlLFxuICAgIExpYnNVaUNvbXBvbmVudHNEcm9wZG93bkNvbXBvbmVudCwgTGlic1VpQ29tcG9uZW50c0J1dHRvbnNTb3J0QXJyb3dDb21wb25lbnQsXG4gICAgTGlic1VpQ29tcG9uZW50c0NoZWNrYm94U2luZ2xlQ29tcG9uZW50LCBMaWJzVWlUYWJsZUNhbGN1bGF0b3JDb2x1bW5QaXBlLFxuICAgIExpYnNVaUNvbXBvbmVudHNTcGlubmVyQ29tcG9uZW50LCBMaWJzVWlDb21wb25lbnRzUG9wb3ZlckNvbXBvbmVudCxcbiAgICBMaWJzVWlDb21wb25lbnRzU2Nyb2xsT3ZlcmxheURpcmVjdGl2ZSwgTGlic1VpSWNvbnNHZXRJY29uQ29tcG9uZW50UGlwZSxcbiAgICBMaWJzVWlQaXBlc0NhbGxGdW5jdGlvbkluVGVtcGxhdGVQaXBlLCBMaWJzVWlQaXBlc0NoZWNrU2VsZWN0ZWRCeUtleVBpcGVcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBMaWJzVWlDb21wb25lbnRzVGFibGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIC8qKiBQUk9QRVJUWSAqL1xuICBwcm90ZWN0ZWQgY2xhc3NIZWFkZXJDb250YWluZXIgPSBjb21wdXRlZCgoKSA9PiBgbGlicy11aS10YWJsZS1oZWFkZXItY29udGFpbmVyIHctZnVsbCBhYnNvbHV0ZSBmbGV4IHNocmluay0wICR7dGhpcy5pZ25vcmVDbGFzc0JnSGVhZGVyKCkgPyAnJyA6ICdiZy13aGl0ZSd9IG92ZXJmbG93LXgtaGlkZGVuIHotWzFdIGl0ZW1zLWNlbnRlciAke3RoaXMuY2xhc3NIZWFkZXJDb250YWluZXJJbmNsdWRlKCkgfHwgJyd9YClcbiAgcHJvdGVjdGVkIGNsYXNzSGVhZGVyTGVmdENvbnRhaW5lciA9IGNvbXB1dGVkKCgpID0+IGBoLWZ1bGwgZmxleCBzdGlja3kgdG9wLTAgbGVmdC0wIHotWzFdICR7dGhpcy5pZ25vcmVDbGFzc0JnSGVhZGVyKCkgPyAnJyA6ICdiZy13aGl0ZSd9ICR7dGhpcy5jbGFzc0hlYWRlckxlZnRJbmNsdWRlKCkgfHwgJyd9YClcblxuICBwcm90ZWN0ZWQga2V5c1NlbGVjdGVkID0gc2lnbmFsPEFycmF5PGFueT4+KFtdKTtcbiAgcHJvdGVjdGVkIGxvYWRpbmcgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuICBwcm90ZWN0ZWQgc3RvcmVzID0gc2lnbmFsPEFycmF5PFdyaXRhYmxlU2lnbmFsPFRZUEVfT0JKRUNUPj4+KFtdKTtcbiAgcHJvdGVjdGVkIGl0ZW1zID0gc2lnbmFsPEFycmF5PFdyaXRhYmxlU2lnbmFsPFRZUEVfT0JKRUNUPj4+KFtdKTtcbiAgcHJvdGVjdGVkIGl0ZW1Gb290ZXIgPSBzaWduYWw8VFlQRV9PQkpFQ1QgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIHByb3RlY3RlZCBpdGVtT2ZJbmRleEhvdmVyPzogVFlQRV9JVEVNX0RBVEFfVEFCTEU7XG4gIHByb3RlY3RlZCBrZXlTZWFyY2ggPSBzaWduYWw8c3RyaW5nPignJyk7XG4gIHByb3RlY3RlZCB0b3RhbEl0ZW1JbkJhY2tlbmQgPSBzaWduYWw8bnVtYmVyPigwKTtcbiAgcHJvdGVjdGVkIGhhc0l0ZW1IaWdodExpZ2h0ID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJvdGVjdGVkIHRvdGFsSXRlbURpc3BsYXkgPSBjb21wdXRlZCgoKSA9PiB2aWV3RGF0YU51bWJlckJ5TGFuZ3VhZ2UoKHRoaXMudG90YWxJdGVtKCkgPz8gdGhpcy50b3RhbEl0ZW1JbkJhY2tlbmQoKSksIGZhbHNlKSk7XG4gIHByb3RlY3RlZCBsaXN0Q29uZmlnTW9yZUl0ZW0gPSBjb21wdXRlZDxJTGlzdENvbmZpZ0l0ZW0+KCgpID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgY29uZmlnVGVtcGxhdGVUZXh0OiBzaWduYWwoe1xuICAgICAgICBmaWVsZEtleTogJ2tleScsXG4gICAgICAgIGlnbm9yZUljb25TZWxlY3RlZDogdHJ1ZSxcbiAgICAgICAgZ2V0VmFsdWU6IHRoaXMuY29uZmlnU2VsZWN0TW9yZUl0ZW0oKT8uZ2V0VmFsdWUsXG4gICAgICAgIGNvbmZpZ0xhYmVsUG9wb3Zlcjogc2lnbmFsKHtcbiAgICAgICAgICB6SW5kZXg6IDEyMDBcbiAgICAgICAgfSlcbiAgICAgIH0pLFxuICAgICAgaHR0cFJlcXVlc3REYXRhOiBzaWduYWwoe1xuICAgICAgICBzZXJ2aWNlT3RoZXI6IHJldHVybkxpc3RPYmplY3QodGhpcy5jb25maWdTZWxlY3RNb3JlSXRlbSgpPy5saXN0T3B0aW9uKSxcbiAgICAgICAgZnVuY3Rpb25OYW1lOiAnbGlzdCcsXG4gICAgICAgIGFyZ3VtZW50c1ZhbHVlOiBbXVxuICAgICAgfSlcbiAgICB9XG4gIH0pXG5cbiAgcHJpdmF0ZSBoYXNTY3JvbGwgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuICBwcml2YXRlIGluc3RhbmNlU29ydCA9IHNpZ25hbDxJU29ydCB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgcHJpdmF0ZSBoYXNBY3Rpb25CdXR0b25Ecm9wZG93bkNvbnRlbnQgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuICBwcml2YXRlIHBhZ2luZ1N0b3JlID0gc2lnbmFsPElQYWdpbmc+KHt9KTtcbiAgcHJpdmF0ZSBsb2FkZWRMYXN0SXRlbSA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIHByaXZhdGUgc3RvcmVQYXJhbXNDYWxsQXBpID0gc2lnbmFsPFRZUEVfT0JKRUNUPih7fSk7XG4gIHByaXZhdGUgdGltZW91dExlYXZlSXRlbSA9IHNpZ25hbDxudW1iZXIgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIHByaXZhdGUgZnVuY3Rpb25Db250cm9sU2VsZWN0TW9yZUl0ZW0/OiBJRHJvcGRvd25GdW5jdGlvbkNvbnRyb2xFdmVudDtcbiAgcHJpdmF0ZSBtb3VzZUVudGVySGVhZGVyID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJpdmF0ZSBvbkRlc3Ryb3kgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIC8qKiBJTlBVVCAqL1xuICByZWFkb25seSB0aW1lSGlnaGxpZ2hOZXdJdGVtID0gaW5wdXQ8bnVtYmVyLCBudW1iZXIgfCB1bmRlZmluZWQ+KDIwMDAsIHsgdHJhbnNmb3JtOiB2YWwgPT4gdmFsID8/IDIwMDAgfSk7XG4gIHJlYWRvbmx5IGhlYWRlckxlZnQgPSBpbnB1dDxBcnJheTxJVGFibGVIZWFkZXJDb25maWc+LCBBcnJheTxJVGFibGVIZWFkZXJDb25maWc+IHwgdW5kZWZpbmVkPihbXSwgeyB0cmFuc2Zvcm06IHZhbCA9PiB2YWwgPz8gW10gfSk7XG4gIHJlYWRvbmx5IGhlYWRlclJpZ2h0ID0gaW5wdXQ8QXJyYXk8SVRhYmxlSGVhZGVyQ29uZmlnPiwgQXJyYXk8SVRhYmxlSGVhZGVyQ29uZmlnPiB8IHVuZGVmaW5lZD4oW10sIHsgdHJhbnNmb3JtOiB2YWwgPT4gdmFsID8/IFtdIH0pO1xuICByZWFkb25seSBjb25maWdUZW1wbGF0ZUl0ZW1Db2xsYXBzZUV4cGFuZCA9IGlucHV0PElDb25maWdUZW1wbGF0ZUl0ZW1Db2xsYXBzZUV4cGFuZD4oKTtcbiAgcmVhZG9ubHkgc2hvd0Zvb3RlciA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGlnbm9yZUJvcmRlckZvb3RlciA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGN1c3RvbVBvc2l0aW9uRm9vdGVyID0gaW5wdXQ8J3RvcCcgfCAnYm90dG9tJywgJ3RvcCcgfCAnYm90dG9tJyB8IHVuZGVmaW5lZD4oJ2JvdHRvbScsIHsgdHJhbnNmb3JtOiB2YWwgPT4gdmFsID8/ICdib3R0b20nIH0pO1xuICByZWFkb25seSBmb290ZXJMZWZ0ID0gaW5wdXQ8QXJyYXk8SVRhYmxlRm9vdGVyQ29uZmlnPiB8IHVuZGVmaW5lZD4oKTtcbiAgcmVhZG9ubHkgZm9vdGVyUmlnaHQgPSBpbnB1dDxBcnJheTxJVGFibGVGb290ZXJDb25maWc+IHwgdW5kZWZpbmVkPigpO1xuICByZWFkb25seSBkaXNhYmxlQ2hlY2tib3ggPSBpbnB1dDxib29sZWFuLCBib29sZWFuIHwgdW5kZWZpbmVkPihmYWxzZSwgeyB0cmFuc2Zvcm06IHZhbCA9PiB2YWwgPz8gZmFsc2UgfSk7XG4gIHJlYWRvbmx5IGVuYWJsZVVuZXF1YWxDaGlsZHJlblNpemVzID0gaW5wdXQ8Ym9vbGVhbiwgYm9vbGVhbiB8IHVuZGVmaW5lZD4oZmFsc2UsIHsgdHJhbnNmb3JtOiB2YWwgPT4gdmFsID8/IGZhbHNlIH0pO1xuICByZWFkb25seSBidWZmZXJBbW91bnQgPSBpbnB1dDxudW1iZXIsIG51bWJlciB8IHVuZGVmaW5lZD4oNSwgeyB0cmFuc2Zvcm06IHZhbCA9PiB2YWwgPyAodmFsID4gMjUgPyAyNSA6IHZhbCkgOiA1IH0pXG4gIHJlYWRvbmx5IHRvdGFsSXRlbSA9IGlucHV0PG51bWJlcj4oKTtcbiAgcmVhZG9ubHkgaXNEYXNoQm9yZGVyID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgY2xhc3NIZWFkZXJDb250YWluZXJJbmNsdWRlID0gaW5wdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSBjbGFzc0hlYWRlckxlZnRJbmNsdWRlID0gaW5wdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSBjbGFzc0JvZHlJbmNsdWRlID0gaW5wdXQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KCcnLCB7IHRyYW5zZm9ybTogdmFsID0+IHZhbCA/PyAnJyB9KTtcbiAgcmVhZG9ubHkgY2xhc3NGb290ZXJJbmNsdWRlID0gaW5wdXQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KCcnLCB7IHRyYW5zZm9ybTogdmFsID0+IHZhbCA/PyAnJyB9KTtcbiAgcmVhZG9ubHkgY2xhc3NUYWJsZUNvbnRhaW5lckluY2x1ZGUgPSBpbnB1dDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4oJycsIHsgdHJhbnNmb3JtOiB2YWwgPT4gdmFsID8/ICcnIH0pO1xuICByZWFkb25seSBjbGFzc0JhckluY2x1ZGUgPSBpbnB1dDxzdHJpbmc+KCdqdXN0aWZ5LWJldHdlZW4gbWItWzE2cHhdJyk7XG5cbiAgcmVhZG9ubHkgZmllbGRLZXkgPSBpbnB1dDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4oJ2lkJywgeyB0cmFuc2Zvcm06IHZhbCA9PiB2YWwgfHwgJ2lkJyB9KTsgLy8gdMOqbiBmaWVsZCDEkeG7i25oIGRhbmggaXRlbSBj4bunYSBsaXN0RGF0YXNcbiAgcmVhZG9ubHkgZGVmYXVsdEtleXNTZWxlY3RlZCA9IGlucHV0PEFycmF5PGFueT4+KCk7XG4gIHJlYWRvbmx5IGxhYmVsQmFyTm9TZWxlY3RJdGVtID0gaW5wdXQ8c3RyaW5nPihgaTE4bl90b3RhbF9xdWFudGl0eWApOyAvLyBz4butIGThu6VuZyDEkeG7gyBoacOqbiB0aOG7iyBraGkgdMOtY2ggY2jhu41uIGl0ZW1cbiAgcmVhZG9ubHkgbGFiZWxCYXJCdXR0b25zID0gaW5wdXQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KCdpMThuX251bWJlcl9pdGVtX3NlbGVjdGVkJywgeyB0cmFuc2Zvcm06IHZhbCA9PiB2YWwgfHwgJ2kxOG5fbnVtYmVyX2l0ZW1fc2VsZWN0ZWQnIH0pOyAvLyBz4butIGThu6VuZyDEkeG7gyBoacOqbiB0aOG7iyBraGkgdMOtY2ggY2jhu41uIGl0ZW1cbiAgcmVhZG9ubHkgY2xhc3NMYWJlbEJhckJ1dHRvbnMgPSBpbnB1dDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4oJycsIHsgdHJhbnNmb3JtOiB2YWwgPT4gdmFsID8/ICcnIH0pOyAvLyBz4butIGThu6VuZyDEkeG7gyBoacOqbiB0aOG7iyBraGkgdMOtY2ggY2jhu41uIGl0ZW1cbiAgcmVhZG9ubHkgYmFyQnV0dG9ucyA9IGlucHV0PEFycmF5PElCdXR0b24+PigpO1xuICByZWFkb25seSBzb3J0TG9jYWwgPSBpbnB1dDxib29sZWFuPigpOyAvLyB0csaw4budbmcgaOG7o3AgbuG6v3Ugc29ydExvY2FsIG7DoHkga2jDtG5nIMSRw6FwIOG7qW5nIMSRxrDhu6NjIG5naGnhu4dwIHbhu6UgdGjDrCBt4bubaSBjw6JuIG5o4bqvYyBz4butIGThu6VuZyBmaWx0ZXJMb2NhbFxuICByZWFkb25seSBmaWx0ZXJPclNvcnRMb2NhbCA9IGlucHV0PFRZUEVfVEFCTEVfRklMVEVSPigpO1xuICByZWFkb25seSBodHRwUmVxdWVzdERhdGEgPSBpbnB1dDxJSHR0cFJlcXVlc3RDb25maWc+KCk7XG4gIHJlYWRvbmx5IGh0dHBSZXF1ZXN0RGF0YUZvb3RlciA9IGlucHV0PElIdHRwUmVxdWVzdENvbmZpZz4oKTtcbiAgcmVhZG9ubHkgbmV3RGF0YSA9IGlucHV0PFRZUEVfTkVXX0RBVEFfVEFCTEU+KCk7XG4gIHJlYWRvbmx5IGZpbHRlciA9IGlucHV0PFRZUEVfREFUQV9GSUxURVJfVEFCTEUsIFRZUEVfREFUQV9GSUxURVJfVEFCTEUgfCB1bmRlZmluZWQ+KHsgZmlsdGVyRGF0YToge30gfSwgeyB0cmFuc2Zvcm06IHZhbCA9PiB2YWwgPz8geyBmaWx0ZXJEYXRhOiB7fSB9IH0pO1xuICByZWFkb25seSBpZ25vcmVCYXIgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBjbGFzc0xhYmVsQmFyTm9TZWxlY3RJdGVtID0gaW5wdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSBpZ25vcmVDbGFzc0JnSGVhZGVyID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgbm9EYXRhQ29uZmlnID0gaW5wdXQ8SVRhYmxlTm9EYXRhQ29uZmlnPih7IHRleHROb0RhdGE6ICdpMThuX25vX2RhdGFfeWV0JywgdGV4dFNlYXJjaE5vRGF0YTogJ2kxOG5fbm9fcmVzdWx0JyB9KTtcbiAgcmVhZG9ubHkgc2hvd1Njcm9sbFRhYmxlUGlubmVkSWZOb0RhdGEgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBpZ25vcmVCb3JkZXJJdGVtTGFzdCA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGlzSGlkZGVuSGVhZGVyV2hlbk5vZGF0YSA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IG1heEl0ZW1TZWxlY3RlZCA9IGlucHV0PG51bWJlciwgbnVtYmVyIHwgdW5kZWZpbmVkPigxMDAsIHsgdHJhbnNmb3JtOiB2YWwgPT4gdmFsID8/IDEwMCB9KTtcbiAgcmVhZG9ubHkgY29uZmlnU2VsZWN0TW9yZUl0ZW0gPSBpbnB1dDxJQ29uZmlnU2VsZWN0TW9yZUl0ZW0+KCk7XG4gIHJlYWRvbmx5IG9ubHlTaG93Tm9SZXN1bHQgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBpZ25vcmVCb3JkZXJJdGVtID0gaW5wdXQ8Ym9vbGVhbj4oKTtcblxuICByZWFkb25seSB0ZW1wbGF0ZU5vRGF0YSA9IGlucHV0PFRZUEVfVEVNUExBVEVfUkVGPigpO1xuICByZWFkb25seSB0ZW1wbGF0ZU5vUmVzdWx0ID0gaW5wdXQ8VFlQRV9URU1QTEFURV9SRUY+KCk7XG5cbiAgLyoqIE9VVFBVVCAqL1xuXG4gIHJlYWRvbmx5IG91dExvYWRNb3JlID0gb3V0cHV0PElMb2FkTW9yZUV2ZW50PigpO1xuICByZWFkb25seSBvdXRTY3JvbGxJc0dvbmUgPSBvdXRwdXQ8SUxvYWRNb3JlRXZlbnQ+KCk7XG4gIHJlYWRvbmx5IG91dExvYWRpbmcgPSBvdXRwdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgb3V0Q2xpY2tCdXR0b25BY3Rpb24gPSBvdXRwdXQ8SVRhYmVsQnV0dG9uQWN0aW9uRXZlbnQ+KCk7XG4gIHJlYWRvbmx5IG91dFNvcnQgPSBvdXRwdXQ8SVNvcnRFdmVudD4oKTtcbiAgcmVhZG9ubHkgb3V0Q2xpY2tCYXJCdXR0b24gPSBvdXRwdXQ8SUJ1dHRvbkJhckV2ZW50PigpO1xuICByZWFkb25seSBvdXRIb3ZlckJ1dHRvbkFjdGlvbiA9IG91dHB1dDxJSG92ZXJCdXR0b25BY3Rpb25FdmVudD4oKTtcbiAgcmVhZG9ubHkgb3V0S2V5c1NlbGVjdGVkID0gb3V0cHV0PHsga2V5czogQXJyYXk8YW55PiB9PigpO1xuICByZWFkb25seSBvdXRGdW5jdGlvbnNDb250cm9sID0gb3V0cHV0PElUYWJsZUZ1bmN0aW9uQ29udHJvbEV2ZW50PigpO1xuICByZWFkb25seSBvdXRMb2FkRGF0YUNvbXBsZXRlID0gb3V0cHV0PFdyaXRhYmxlU2lnbmFsPEFycmF5PFdyaXRhYmxlU2lnbmFsPGFueT4+Pj4oKTtcbiAgcmVhZG9ubHkgb3V0VG90YWxJdGVtID0gb3V0cHV0PG51bWJlcj4oKTtcbiAgcmVhZG9ubHkgb3V0TG9hZERhdGFFcnJvciA9IG91dHB1dDxJSHR0cFJlc3BvbnNlRXJyb3I+KCk7XG5cbiAgLyoqVklFVyBDSElMRCAqL1xuICBwcm90ZWN0ZWQgaGVhZGVyRWxlbWVudFJlZiA9IHZpZXdDaGlsZDxFbGVtZW50UmVmPignaGVhZGVyRWxlbWVudFJlZicpO1xuICBwcm90ZWN0ZWQgZm9vdGVyRWxlbWVudFJlZiA9IHZpZXdDaGlsZDxFbGVtZW50UmVmPignZm9vdGVyRWxlbWVudFJlZicpO1xuICBwcm90ZWN0ZWQgZm9vdGVyTGVmdEVsZW1lbnRSZWYgPSB2aWV3Q2hpbGQ8RWxlbWVudFJlZj4oJ2Zvb3RlckxlZnRFbGVtZW50UmVmJyk7XG4gIHByaXZhdGUgYm9keUVsZW1lbnRSZWYgPSB2aWV3Q2hpbGQ8RWxlbWVudFJlZj4oJ2JvZHlFbGVtZW50UmVmJyk7XG4gIHByaXZhdGUgYm9keUNvbXBvbmVudFJlZiA9IHZpZXdDaGlsZDxWaXJ0dWFsU2Nyb2xsZXJDb21wb25lbnQ+KCdib2R5Q29tcG9uZW50UmVmJyk7O1xuXG4gIC8qKklOSkVDVCAqL1xuICBwcml2YXRlIGh0dHBSZXF1ZXN0U2VydmljZSA9IGluamVjdChMaWJzVWlIdHRwUmVxdWVzdFNlcnZpY2UpO1xuICBwcml2YXRlIGNkciA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLmRlZmF1bHRLZXlzU2VsZWN0ZWQoKT8ubGVuZ3RoKSB7XG4gICAgICAgIHVudHJhY2tlZCgoKSA9PiB0aGlzLmtleXNTZWxlY3RlZC51cGRhdGUoa2V5cyA9PiAoWy4uLmtleXMsIC4uLih0aGlzLmRlZmF1bHRLZXlzU2VsZWN0ZWQoKSB8fCBbXSldKSkpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5zaG93Rm9vdGVyKCkpIHtcbiAgICAgICAgdW50cmFja2VkKCgpID0+IHRoaXMuY2FsbEFwaUJ5U2VydmljZUZvb3RlcigpKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5uZXdEYXRhKCk/LmRhdGEoKS5sZW5ndGgpIHtcbiAgICAgICAgdW50cmFja2VkKCgpID0+IHRoaXMuYWRkSXRlbXModGhpcy5uZXdEYXRhKCk/LmRhdGEgYXMgYW55LCAhdGhpcy5uZXdEYXRhKCk/LmFkZFRvTGFzdExpc3QpKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuZmlsdGVyKCkuZmlsdGVyRGF0YSB8fCB0aGlzLmZpbHRlcigpLmlnbm9yZUNhbGxBcGlBdXRvKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHVudHJhY2tlZCgoKSA9PiB7XG4gICAgICAgIHRoaXMua2V5U2VhcmNoLnNldChnZXQ8YW55Pih0aGlzLmZpbHRlcigpLmZpbHRlckRhdGEsICdrZXlTZWFyY2gnLCAnJykpO1xuICAgICAgICB0aGlzLnN0b3JlUGFyYW1zQ2FsbEFwaS5zZXQoY2xvbmVEZWVwKHRoaXMuZmlsdGVyKCkuZmlsdGVyRGF0YSkpO1xuICAgICAgICBpZiAodGhpcy5maWx0ZXIoKT8uZmlsdGVyRGF0YSAmJiAhdGhpcy5maWx0ZXIoKS5maWx0ZXJEYXRhWydpbnN0YW5jZVNvcnQnXSAmJiB0aGlzLmluc3RhbmNlU29ydCgpKSB7XG4gICAgICAgICAgdGhpcy5zdG9yZVBhcmFtc0NhbGxBcGkudXBkYXRlKGRhdGEgPT4gKHsgLi4uZGF0YSwgaW5zdGFuY2VTb3J0OiB0aGlzLmluc3RhbmNlU29ydCgpIH0pKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5maWx0ZXJPclNvcnRMb2NhbCgpICYmIHRoaXMuc3RvcmVzKCkubGVuZ3RoKSB7XG4gICAgICAgICAgdGhpcy5pdGVtcy5zZXQodGhpcy5maWx0ZXJPclNvcnRMb2NhbCgpPy4oc2lnbmFsKFsuLi50aGlzLnN0b3JlcygpXSksIHsgLi4uKHRoaXMuZmlsdGVyKCkuZmlsdGVyRGF0YSB8fCB7fSksIGluc3RhbmNlU29ydDogdGhpcy5pbnN0YW5jZVNvcnQoKSB9KSB8fCBbXSk7XG5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNhbGxBcGlCeVNlcnZpY2UodHJ1ZSk7XG4gICAgICB9KTtcblxuICAgIH0pO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5vdXRGdW5jdGlvbnNDb250cm9sLmVtaXQoe1xuICAgICAgcmVzZXQ6IHRoaXMucmVzZXQuYmluZCh0aGlzKSxcbiAgICAgIGNhbGxBcGlCeVNlcnZpY2U6IHRoaXMuY2FsbEFwaUJ5U2VydmljZS5iaW5kKHRoaXMpLFxuICAgICAgcmVzZXRTY3JvbGw6IHRoaXMucmVzZXRTY3JvbGwuYmluZCh0aGlzKSxcbiAgICAgIGFkZEl0ZW1zOiB0aGlzLmFkZEl0ZW1zLmJpbmQodGhpcyksXG4gICAgICByZW1vdmVJdGVtczogdGhpcy5yZW1vdmVJdGVtcy5iaW5kKHRoaXMpLFxuICAgICAgZ2V0Q291bnQ6IHRoaXMuZ2V0Q291bnQuYmluZCh0aGlzKSxcbiAgICAgIGdldFNjcm9sbENvbnRhaW5lcjogdGhpcy5nZXRTY3JvbGxDb250YWluZXIuYmluZCh0aGlzKSxcbiAgICAgIGhpZGVUb29sQmFyQm90dG9tOiAoKSA9PiB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0sXG4gICAgICByZXNldEtleVNlbGVjdGVkOiAoKSA9PiB0aGlzLmtleXNTZWxlY3RlZC5zZXQoW10pLFxuICAgICAgZGV0ZWN0Q2hhbmdlczogKCkgPT4gdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpXG4gICAgfSk7XG5cbiAgICBmcm9tRXZlbnQod2luZG93LCAncmVzaXplJykucGlwZSh0YWtlVW50aWwodGhpcy5vbkRlc3Ryb3kpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldEluZGV4Um93ID0gKGRhdGE6IHsgdmFsdWU6IFRZUEVfSVRFTV9EQVRBX1RBQkxFIH0pID0+IHtcbiAgICByZXR1cm4gb2YodGhpcy5pdGVtcygpLmZpbmRJbmRleCgoaXRlbSkgPT4gaXRlbSA9PT0gZGF0YS52YWx1ZSkgKyAxKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U2Nyb2xsQ29udGFpbmVyKCkge1xuICAgIHJldHVybiB0aGlzLmJvZHlDb21wb25lbnRSZWYoKSBhcyBWaXJ0dWFsU2Nyb2xsZXJDb21wb25lbnQ7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNhbGxBcGlCeVNlcnZpY2UoZmlyc3RDYWxsOiBib29sZWFuLCByZXNldEFmdGVyQ2FsbEFwaT86IGJvb2xlYW4pIHtcbiAgICB0cnkge1xuICAgICAgaWYgKGZpcnN0Q2FsbCkge1xuICAgICAgICB0aGlzLmxvYWRlZExhc3RJdGVtLnNldChmYWxzZSk7XG4gICAgICB9XG4gICAgICBpZiAoIXRoaXMuaHR0cFJlcXVlc3REYXRhKCkgfHwgdGhpcy5sb2FkaW5nKCkgfHwgdGhpcy5sb2FkZWRMYXN0SXRlbSgpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMubG9hZGluZy5zZXQodHJ1ZSk7XG4gICAgICB0aGlzLm91dExvYWRpbmcuZW1pdCh0aGlzLmxvYWRpbmcoKSk7XG4gICAgICB0aGlzLnJlc2V0SW5kZXhIb3ZlcigpO1xuICAgICAgY29uc3QgeyBhcmd1bWVudHNWYWx1ZSwgZ3VpZGVBdXRvVXBkYXRlQXJndW1lbnRzVmFsdWUgfSA9IHRoaXMuaHR0cFJlcXVlc3REYXRhKCkgYXMgSUh0dHBSZXF1ZXN0Q29uZmlnO1xuXG4gICAgICBpZiAoZ3VpZGVBdXRvVXBkYXRlQXJndW1lbnRzVmFsdWUgJiYgIWd1aWRlQXV0b1VwZGF0ZUFyZ3VtZW50c1ZhbHVlLnNvcnRPcmRlckJ5ICYmIHRoaXMuaW5zdGFuY2VTb3J0KCkpIHtcbiAgICAgICAgZ3VpZGVBdXRvVXBkYXRlQXJndW1lbnRzVmFsdWUuc29ydE9yZGVyQnkgPSB7XG4gICAgICAgICAgZmllbGRHZXRWYWx1ZTogJ3N0b3JlUGFyYW1zQ2FsbEFwaS5pbnN0YW5jZVNvcnQuZmllbGRTb3J0JyxcbiAgICAgICAgICBmaWVsZFVwZGF0ZTogJ1swXScsXG4gICAgICAgICAgc3ViRmllbGRVcGRhdGU6ICdvcmRlcl9ieSdcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgaWYgKGd1aWRlQXV0b1VwZGF0ZUFyZ3VtZW50c1ZhbHVlICYmICFndWlkZUF1dG9VcGRhdGVBcmd1bWVudHNWYWx1ZS5zb3J0T3JkZXJUeXBlICYmIHRoaXMuaW5zdGFuY2VTb3J0KCkpIHtcbiAgICAgICAgZ3VpZGVBdXRvVXBkYXRlQXJndW1lbnRzVmFsdWUuc29ydE9yZGVyVHlwZSA9IHtcbiAgICAgICAgICBmaWVsZEdldFZhbHVlOiAnc3RvcmVQYXJhbXNDYWxsQXBpLmluc3RhbmNlU29ydC5tb2RlJyxcbiAgICAgICAgICBmaWVsZFVwZGF0ZTogJ1swXScsXG4gICAgICAgICAgc3ViRmllbGRVcGRhdGU6ICdvcmRlcl90eXBlJ1xuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKGZpcnN0Q2FsbCkge1xuICAgICAgICBpZiAoIXJlc2V0QWZ0ZXJDYWxsQXBpKSB7XG4gICAgICAgICAgdGhpcy5oYXNTY3JvbGwuc2V0KGZhbHNlKTtcbiAgICAgICAgICB0aGlzLnN0b3Jlcy5zZXQoW10pO1xuICAgICAgICAgIHRoaXMuaXRlbXMuc2V0KFtdKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxvYWRlZExhc3RJdGVtLnNldCh0aGlzLmh0dHBSZXF1ZXN0U2VydmljZS51cGRhdGVBcmd1bWVudHMoYXJndW1lbnRzVmFsdWUsIHsgLi4udGhpcy5mYWtlUmVzcG9uc2VBcGkoKSwgc3RvcmVQYXJhbXNDYWxsQXBpOiB0aGlzLnN0b3JlUGFyYW1zQ2FsbEFwaSgpIH0sIHRoaXMucGFnaW5nU3RvcmUoKSwgdGhpcy5rZXlTZWFyY2goKSwgdHJ1ZSwgdGhpcy5sb2FkZWRMYXN0SXRlbSgpLCBndWlkZUF1dG9VcGRhdGVBcmd1bWVudHNWYWx1ZSkpO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5odHRwUmVxdWVzdFNlcnZpY2UuY2FsbEFwaSh0aGlzLmh0dHBSZXF1ZXN0RGF0YSgpIGFzIElIdHRwUmVxdWVzdENvbmZpZyk7XG5cbiAgICAgIGlmIChmaXJzdENhbGwgJiYgcmVzZXRBZnRlckNhbGxBcGkpIHtcbiAgICAgICAgdGhpcy5oYXNTY3JvbGwuc2V0KGZhbHNlKTtcbiAgICAgICAgdGhpcy5zdG9yZXMuc2V0KFtdKTtcbiAgICAgICAgdGhpcy5pdGVtcy5zZXQoW10pO1xuICAgICAgfVxuICAgICAgdGhpcy5wYWdpbmdTdG9yZS5zZXQocmVzdWx0LnBhZ2luZyk7XG4gICAgICB0aGlzLnRvdGFsSXRlbUluQmFja2VuZC5zZXQocmVzdWx0LnBhZ2luZz8udG90YWxfaXRlbXMgfHwgMCk7XG4gICAgICB0aGlzLm91dFRvdGFsSXRlbS5lbWl0KHRoaXMudG90YWxJdGVtSW5CYWNrZW5kKCkpO1xuICAgICAgaWYgKCF0aGlzLnBhZ2luZ1N0b3JlKCkpIHtcbiAgICAgICAgdGhpcy5sb2FkZWRMYXN0SXRlbS5zZXQodHJ1ZSk7XG4gICAgICB9XG4gICAgICB0aGlzLmxvYWRlZExhc3RJdGVtLnNldCh0aGlzLmh0dHBSZXF1ZXN0U2VydmljZS51cGRhdGVBcmd1bWVudHMoYXJndW1lbnRzVmFsdWUsIHsgLi4ucmVzdWx0LCBzdG9yZVBhcmFtc0NhbGxBcGk6IHRoaXMuc3RvcmVQYXJhbXNDYWxsQXBpKCkgfSwgdGhpcy5wYWdpbmdTdG9yZSgpLCB0aGlzLmtleVNlYXJjaCgpLCB0cnVlLCB0aGlzLmxvYWRlZExhc3RJdGVtKCksIGd1aWRlQXV0b1VwZGF0ZUFyZ3VtZW50c1ZhbHVlKSk7XG4gICAgICBhd2FpdCB0aGlzLmFkZEl0ZW1zKGNvbnZlcnRPYmplY3RUb1NpZ25hbChyZXN1bHQuZGF0YSB8fCBbXSksIGZhbHNlLCB0cnVlKTtcbiAgICAgIHRoaXMub3V0TG9hZERhdGFDb21wbGV0ZS5lbWl0KHRoaXMuc3RvcmVzKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xuICAgICAgdGhpcy5vdXRMb2FkRGF0YUVycm9yLmVtaXQoZXJyb3IgYXMgSUh0dHBSZXNwb25zZUVycm9yKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5sb2FkaW5nLnNldChmYWxzZSk7XG4gICAgICB0aGlzLm91dExvYWRpbmcuZW1pdCh0aGlzLmxvYWRpbmcoKSk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGZha2VSZXNwb25zZUFwaSgpOiBUWVBFX09CSkVDVCB7XG4gICAgdGhpcy5sb2FkZWRMYXN0SXRlbS5zZXQoZmFsc2UpO1xuICAgIHRoaXMucGFnaW5nU3RvcmUuc2V0KHt9KTtcblxuICAgIHJldHVybiB0aGlzLmh0dHBSZXF1ZXN0U2VydmljZS5mYWtlUmVzcG9uc2VQYWdpbmdBcGkoKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY2FsbEFwaUJ5U2VydmljZUZvb3RlcigpIHtcbiAgICBpZiAoIXRoaXMuaHR0cFJlcXVlc3REYXRhRm9vdGVyKCkgfHwgIXRoaXMuc2hvd0Zvb3RlcigpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHsgYXJndW1lbnRzVmFsdWUsIGd1aWRlQXV0b1VwZGF0ZUFyZ3VtZW50c1ZhbHVlIH0gPSB0aGlzLmh0dHBSZXF1ZXN0RGF0YUZvb3RlcigpIGFzIElIdHRwUmVxdWVzdENvbmZpZztcblxuICAgIHRoaXMuaHR0cFJlcXVlc3RTZXJ2aWNlLnVwZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHNWYWx1ZSwgeyBzdG9yZVBhcmFtc0NhbGxBcGk6IHRoaXMuc3RvcmVQYXJhbXNDYWxsQXBpKCkgfSwgdGhpcy5wYWdpbmdTdG9yZSgpLCB0aGlzLmtleVNlYXJjaCgpLCB0cnVlLCBmYWxzZSwgZ3VpZGVBdXRvVXBkYXRlQXJndW1lbnRzVmFsdWUpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuaHR0cFJlcXVlc3RTZXJ2aWNlLmNhbGxBcGkodGhpcy5odHRwUmVxdWVzdERhdGFGb290ZXIoKSBhcyBJSHR0cFJlcXVlc3RDb25maWcpO1xuXG4gICAgdGhpcy5pdGVtRm9vdGVyLnNldChjb252ZXJ0T2JqZWN0VG9TaWduYWwocmVzdWx0LmRhdGEpKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYWRkSXRlbXMoaXRlbXM6IFRZUEVfREFUQV9UQUJMRSwgYWRkRmlyc3Q6IGJvb2xlYW4sIGlnbm9yZUhpZ2h0TGlnaHQ/OiBib29sZWFuLCBpZ25vcmVSZUNhbGxGb290ZXI/OiBib29sZWFuLCBhdXRvQ291bnROZXdJdGVtPzogYm9vbGVhbikge1xuICAgIGlmICghaXRlbXMoKSB8fCAhaXRlbXMoKS5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaXRlbXNBZGQ6IEFycmF5PFdyaXRhYmxlU2lnbmFsPFRZUEVfT0JKRUNUPj4gPSBbXTtcblxuICAgIGl0ZW1zKCkuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgIGlmICghdGhpcy5jaGVja0V4aXN0SXRlbShpdGVtKSkge1xuICAgICAgICBpdGVtc0FkZC5wdXNoKGl0ZW0pO1xuICAgICAgICBpZiAoIWlnbm9yZUhpZ2h0TGlnaHQpIHtcbiAgICAgICAgICB0aGlzLmhhc0l0ZW1IaWdodExpZ2h0LnNldCh0cnVlKTtcbiAgICAgICAgICBpdGVtLnVwZGF0ZShkYXRhID0+ICh7IC4uLmRhdGEsIHNwZWNpZmljSGlnaHRMaWdodDogdHJ1ZSB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFkZEZpcnN0KSB7XG4gICAgICAgICAgdGhpcy5pdGVtcy51cGRhdGUoZGF0YSA9PiBbaXRlbSwgLi4uZGF0YV0pO1xuICAgICAgICAgIHRoaXMuc3RvcmVzLnVwZGF0ZShkYXRhID0+IFtpdGVtLCAuLi5kYXRhXSk7XG5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pdGVtcy51cGRhdGUoZGF0YSA9PiBbLi4uZGF0YSwgaXRlbV0pO1xuICAgICAgICB0aGlzLnN0b3Jlcy51cGRhdGUoZGF0YSA9PiBbLi4uZGF0YSwgaXRlbV0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmIChhdXRvQ291bnROZXdJdGVtICYmIGl0ZW1zQWRkLmxlbmd0aCkge1xuICAgICAgdGhpcy50b3RhbEl0ZW1JbkJhY2tlbmQudXBkYXRlKHZhbHVlID0+IHZhbHVlICsgaXRlbXNBZGQubGVuZ3RoKTtcbiAgICB9XG4gICAgaWYgKCFpZ25vcmVIaWdodExpZ2h0KSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaXRlbXNBZGQuZm9yRWFjaChpdGVtID0+IGl0ZW0udXBkYXRlKGRhdGEgPT4gKHsgLi4uZGF0YSwgc3BlY2lmaWNIaWdodExpZ2h0OiBmYWxzZSB9KSkpO1xuICAgICAgICB0aGlzLmhhc0l0ZW1IaWdodExpZ2h0LnNldChmYWxzZSk7XG4gICAgICB9LCB0aGlzLnRpbWVIaWdobGlnaE5ld0l0ZW0oKSk7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMuY2hlY2tTY3JvbGwoKTtcbiAgICBpZiAoIWlnbm9yZVJlQ2FsbEZvb3Rlcikge1xuICAgICAgYXdhaXQgdGhpcy5jYWxsQXBpQnlTZXJ2aWNlRm9vdGVyKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjaGVja0V4aXN0SXRlbShpdGVtTmV3OiBXcml0YWJsZVNpZ25hbDxUWVBFX09CSkVDVD4pOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pdGVtcygpLmZpbmQoaXRlbSA9PiBgJHtpdGVtKClbdGhpcy5maWVsZEtleSgpXX1gID09PSBgJHtpdGVtTmV3KClbdGhpcy5maWVsZEtleSgpXX1gKSA/IHRydWUgOiBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVtb3ZlSXRlbXMoa2V5czogQXJyYXk8dW5rbm93bj4sIGlnbm9yZVJlQ2FsbEZvb3Rlcj86IGJvb2xlYW4pIHtcbiAgICB0aGlzLnJlc2V0SW5kZXhIb3ZlcigpO1xuICAgIGlmICghdGhpcy5pdGVtcygpLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBrZXlzLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIHRoaXMuaXRlbXMudXBkYXRlKGl0ZW1zID0+IHtcbiAgICAgICAgbGV0IGlzVXBkYXRlID0gZmFsc2U7XG5cbiAgICAgICAgY29uc3QgbmV3SXRlbXMgPSBpdGVtcy5maWx0ZXIoaXRlbSA9PiB7XG4gICAgICAgICAgaWYgKGAke2l0ZW0oKVt0aGlzLmZpZWxkS2V5KCldfWAgPT09IGAke2tleX1gKSB7XG4gICAgICAgICAgICBpc1VwZGF0ZSA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gaXNVcGRhdGUgPyBuZXdJdGVtcyA6IGl0ZW1zO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuc3RvcmVzLnVwZGF0ZShpdGVtcyA9PiB7XG4gICAgICAgIGxldCBpc1VwZGF0ZSA9IGZhbHNlO1xuXG4gICAgICAgIGNvbnN0IG5ld0l0ZW1zID0gaXRlbXMuZmlsdGVyKGl0ZW0gPT4ge1xuICAgICAgICAgIGlmIChgJHtpdGVtKClbdGhpcy5maWVsZEtleSgpXX1gID09PSBgJHtrZXl9YCkge1xuICAgICAgICAgICAgaXNVcGRhdGUgPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGlzVXBkYXRlID8gbmV3SXRlbXMgOiBpdGVtcztcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoIXRoaXMua2V5c1NlbGVjdGVkKCkgfHwgIXRoaXMua2V5c1NlbGVjdGVkKCkubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMua2V5c1NlbGVjdGVkLnVwZGF0ZShrZXlzID0+IGtleXMuZmlsdGVyKGtleVNlbGVjdGVkID0+IGtleVNlbGVjdGVkICE9PSBrZXkpKTtcbiAgICB9KTtcbiAgICB0aGlzLnRvdGFsSXRlbUluQmFja2VuZC51cGRhdGUodmFsdWUgPT4gdmFsdWUgLSBrZXlzLmxlbmd0aCk7XG4gICAgYXdhaXQgdGhpcy5jaGVja1Njcm9sbCgpO1xuICAgIGlmICghaWdub3JlUmVDYWxsRm9vdGVyKSB7XG4gICAgICBhd2FpdCB0aGlzLmNhbGxBcGlCeVNlcnZpY2VGb290ZXIoKTtcbiAgICB9XG4gICAgdGhpcy5vdXRLZXlzU2VsZWN0ZWQuZW1pdCh7IGtleXM6IHRoaXMua2V5c1NlbGVjdGVkKCkgfSk7XG4gIH1cblxuICBwcml2YXRlIGdldENvdW50KCk6IG51bWJlciB7XG4gICAgaWYgKHRoaXMuaHR0cFJlcXVlc3REYXRhKCkpIHtcbiAgICAgIHJldHVybiB0aGlzLnBhZ2luZ1N0b3JlKCk/LnRvdGFsX2l0ZW1zIHx8IHRoaXMuaXRlbXMoKS5sZW5ndGg7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuaXRlbXMoKS5sZW5ndGg7XG4gIH1cblxuICBwcml2YXRlIGxvYWRNb3JlKCkge1xuICAgIGlmICh0aGlzLmxvYWRpbmcoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLm91dExvYWRNb3JlLmVtaXQoeyBsb2FkTW9yZVN1Y2Nlc3M6IHRoaXMubG9hZE1vcmVTdWNjZXNzLmJpbmQodGhpcykgfSk7XG4gICAgdGhpcy5jYWxsQXBpQnlTZXJ2aWNlKGZhbHNlKTtcbiAgfVxuXG4gIHByaXZhdGUgbG9hZE1vcmVTdWNjZXNzKGRhdGE6IFdyaXRhYmxlU2lnbmFsPEFycmF5PFdyaXRhYmxlU2lnbmFsPFRZUEVfT0JKRUNUPj4+KSB7XG4gICAgdGhpcy5hZGRJdGVtcyhkYXRhLCBmYWxzZSk7XG4gICAgdGhpcy5sb2FkaW5nLnNldChmYWxzZSk7XG4gICAgdGhpcy5vdXRMb2FkaW5nLmVtaXQodGhpcy5sb2FkaW5nKCkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJDaGFuZ2VBbGxDaGVja2VkKCkge1xuICAgIHRoaXMua2V5c1NlbGVjdGVkLnNldChbXSk7XG4gICAgdGhpcy5vdXRLZXlzU2VsZWN0ZWQuZW1pdCh7IGtleXM6IHRoaXMua2V5c1NlbGVjdGVkKCkgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckNoYW5nZUNoZWNrZWRBbGxJdGVtcyhldmVudDogSUNoZWNrYm94RXZlbnQpIHtcbiAgICBpZiAoZXZlbnQuY2hlY2tlZCkge1xuICAgICAgdGhpcy5rZXlzU2VsZWN0ZWQuc2V0KHRoaXMuaXRlbXMoKS5maWx0ZXIoYXN5bmMgKGl0ZW0pID0+ICEoYXdhaXQgdGhpcy5jaGVja0NhbmNlbENvbmRpdGlvbkNoZWNrZWRJdGVtKGl0ZW0pKSkubWFwKGl0ZW0gPT4gYCR7aXRlbSgpW3RoaXMuZmllbGRLZXkoKV19YCkpO1xuICAgICAgdGhpcy5vdXRLZXlzU2VsZWN0ZWQuZW1pdCh7IGtleXM6IHRoaXMua2V5c1NlbGVjdGVkKCkgfSk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5rZXlzU2VsZWN0ZWQuc2V0KFtdKTtcbiAgICB0aGlzLm91dEtleXNTZWxlY3RlZC5lbWl0KHsga2V5czogdGhpcy5rZXlzU2VsZWN0ZWQoKSB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY2hlY2tDYW5jZWxDb25kaXRpb25DaGVja2VkSXRlbShpdGVtOiBXcml0YWJsZVNpZ25hbDxUWVBFX09CSkVDVD4pIHtcbiAgICBsZXQgaXNDYW5jZWxDaGVjayA9IGZhbHNlO1xuXG4gICAgaWYgKCFpc0NhbmNlbENoZWNrICYmIHRoaXMuaGVhZGVyTGVmdCgpLmxlbmd0aCAmJiB0aGlzLmhlYWRlckxlZnQoKVswXS5jaGVja0NvbmRpdGlvbkNoZWNrQm94SGlkZGVuKSB7XG4gICAgICBpc0NhbmNlbENoZWNrID0gYXdhaXQgbGFzdFZhbHVlRnJvbSgodGhpcy5oZWFkZXJMZWZ0KClbMF0uY2hlY2tDb25kaXRpb25DaGVja0JveEhpZGRlbiBhcyBhbnkpKHsgaXRlbTogaXRlbSgpIH0pKSB8fCBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoIWlzQ2FuY2VsQ2hlY2sgJiYgdGhpcy5oZWFkZXJSaWdodCgpLmxlbmd0aCAmJiB0aGlzLmhlYWRlclJpZ2h0KClbMF0uY2hlY2tDb25kaXRpb25DaGVja0JveEhpZGRlbikge1xuICAgICAgaXNDYW5jZWxDaGVjayA9IGF3YWl0IGxhc3RWYWx1ZUZyb20oKHRoaXMuaGVhZGVyUmlnaHQoKVswXS5jaGVja0NvbmRpdGlvbkNoZWNrQm94SGlkZGVuIGFzIGFueSkoeyBpdGVtOiBpdGVtKCkgfSkpIHx8IGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiBpc0NhbmNlbENoZWNrO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJDaGFuZ2VJdGVtQ2hlY2tlZChldmVudDogSUNoZWNrYm94SXRlbSwgaXRlbTogVFlQRV9PQkpFQ1QpIHtcbiAgICBjb25zdCBrZXkgPSBpdGVtW3RoaXMuZmllbGRLZXkoKV07XG4gICAgY29uc3Qga2V5cyA9IG5ldyBTZXQodGhpcy5rZXlzU2VsZWN0ZWQoKSk7XG5cbiAgICBrZXlzLmFkZChrZXkpO1xuICAgIGlmICghZXZlbnQuY2hlY2tlZCkge1xuICAgICAga2V5cy5kZWxldGUoa2V5KTtcbiAgICB9XG4gICAgdGhpcy5rZXlzU2VsZWN0ZWQuc2V0KEFycmF5LmZyb20oa2V5cykpO1xuICAgIHRoaXMub3V0S2V5c1NlbGVjdGVkLmVtaXQoeyBrZXlzOiB0aGlzLmtleXNTZWxlY3RlZCgpIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJDaGFuZ2VTb3J0KHNvcnQ6IElTb3J0KSB7XG4gICAgaWYgKHRoaXMuaW5zdGFuY2VTb3J0ICYmIHRoaXMuaW5zdGFuY2VTb3J0KCk/LmZpZWxkU29ydCAhPT0gc29ydC5maWVsZFNvcnQpIHtcbiAgICAgIHRoaXMuaW5zdGFuY2VTb3J0KCk/LnJlc2V0KCk7XG4gICAgfVxuICAgIHRoaXMuaW5zdGFuY2VTb3J0LnNldChzb3J0KTtcbiAgICBpZiAodGhpcy5zb3J0TG9jYWwoKSkge1xuICAgICAgdGhpcy5oYW5kbGVyU29ydExvY2FsKHNvcnQpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc3RvcmVQYXJhbXNDYWxsQXBpLnVwZGF0ZShkYXRhID0+ICh7IC4uLmRhdGEsIGluc3RhbmNlU29ydDogdGhpcy5pbnN0YW5jZVNvcnQoKSB9KSk7XG4gICAgdGhpcy5jYWxsQXBpQnlTZXJ2aWNlKHRydWUpO1xuICAgIHRoaXMub3V0U29ydC5lbWl0KHtcbiAgICAgIHNvcnQ6IHNvcnQsXG4gICAgICBvblNvcnRTdWNjZXNzOiB0aGlzLm9uU29ydFN1Y2Nlc3MuYmluZCh0aGlzKVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVyU29ydExvY2FsKHNvcnQ6IElTb3J0KSB7XG4gICAgaWYgKHRoaXMuZmlsdGVyT3JTb3J0TG9jYWwoKSAmJiB0aGlzLnN0b3JlcygpLmxlbmd0aCkge1xuICAgICAgdGhpcy5pdGVtcy5zZXQodGhpcy5maWx0ZXJPclNvcnRMb2NhbCgpPy4oc2lnbmFsKFsuLi50aGlzLnN0b3JlcygpXSksIHsgLi4udGhpcy5zdG9yZVBhcmFtc0NhbGxBcGkoKSwgaW5zdGFuY2VTb3J0OiBzb3J0IH0pIHx8IFtdKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB7IGZpZWxkU29ydCwgbW9kZSB9ID0gc29ydDtcblxuICAgIHRoaXMuaXRlbXMudXBkYXRlKGl0ZW1zID0+IHtcbiAgICAgIGl0ZW1zLnNvcnQoKGl0ZW1BLCBpdGVtQikgPT4ge1xuICAgICAgICBsZXQgdmFsdWUxID0gbW9kZSA9PT0gJ2FzYycgPyBpdGVtQSgpW2ZpZWxkU29ydF0gOiBpdGVtQigpW2ZpZWxkU29ydF07XG4gICAgICAgIGxldCB2YWx1ZTIgPSBtb2RlID09PSAnYXNjJyA/IGl0ZW1CKClbZmllbGRTb3J0XSA6IGl0ZW1BKClbZmllbGRTb3J0XTtcblxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlMSA9PT0gJ3N0cmluZycgJiYgdHlwZW9mIHZhbHVlMiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB2YWx1ZTEgPSBkZWxldGVVbmljb2RlKHZhbHVlMSkudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICAgICAgICB2YWx1ZTIgPSBkZWxldGVVbmljb2RlKHZhbHVlMikudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZTEgPT09IHZhbHVlMikge1xuICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHZhbHVlMSA+IHZhbHVlMiA/IDEgOiAtMTtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gWy4uLml0ZW1zXTtcbiAgICB9KTtcbiAgICB0aGlzLm9uU29ydFN1Y2Nlc3MoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyRnVuY3Rpb25Db250cm9sTW9yZVNlbGVjdEl0ZW0oZnVuY3Rpb25Db250cm9sOiBJRHJvcGRvd25GdW5jdGlvbkNvbnRyb2xFdmVudCkge1xuICAgIHRoaXMuZnVuY3Rpb25Db250cm9sU2VsZWN0TW9yZUl0ZW0gPSBmdW5jdGlvbkNvbnRyb2w7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlclNlbGVjdGVkTW9yZUl0ZW0oZXZlbnQ6IElFbWl0U2VsZWN0S2V5IHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKCFldmVudCB8fCAhZXZlbnQua2V5IHx8ICF0aGlzLmNvbmZpZ1NlbGVjdE1vcmVJdGVtKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmZ1bmN0aW9uQ29udHJvbFNlbGVjdE1vcmVJdGVtPy5yZXNldCgpO1xuXG4gICAgY29uc3QgcGVyUGFnZSA9IE51bWJlcihldmVudC5rZXkpLnZhbHVlT2YoKTtcbiAgICBjb25zdCBjdXJyZW50UGFnZSA9IE51bWJlcih0aGlzLnNldFBlclBhZ2VTZWxlY3RNb3JlSXRlbShwZXJQYWdlKSkudmFsdWVPZigpO1xuICAgIGNvbnN0IGlzUGFnaW5nTnVtYmVyID0gdGhpcy5jb25maWdTZWxlY3RNb3JlSXRlbSgpPy5wYWdpbmdOdW1iZXI7XG5cbiAgICBpZiAoY3VycmVudFBhZ2UgPiBwZXJQYWdlIHx8IHRoaXMuaXRlbXMubGVuZ3RoID49IHBlclBhZ2UpIHtcbiAgICAgIGlmICghaXNQYWdpbmdOdW1iZXIpIHtcbiAgICAgICAgdGhpcy5zZXRQZXJQYWdlU2VsZWN0TW9yZUl0ZW0oY3VycmVudFBhZ2UpO1xuICAgICAgfVxuICAgICAgdGhpcy5rZXlzU2VsZWN0ZWQuc2V0KHRoaXMuaXRlbXMoKS5zbGljZSgwLCBwZXJQYWdlKS5tYXAoaXRlbSA9PiBgJHtpdGVtKClbdGhpcy5maWVsZEtleSgpXX1gKSk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmNhbGxBcGlCeVNlcnZpY2UodHJ1ZSwgdHJ1ZSk7XG4gICAgY29uc3Qgc3ViID0gdGhpcy5vdXRMb2FkRGF0YUNvbXBsZXRlLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICBzdWIudW5zdWJzY3JpYmUoKTtcbiAgICAgIGlmICghaXNQYWdpbmdOdW1iZXIpIHtcbiAgICAgICAgdGhpcy5zZXRQZXJQYWdlU2VsZWN0TW9yZUl0ZW0oY3VycmVudFBhZ2UpO1xuICAgICAgfVxuICAgICAgdGhpcy5rZXlzU2VsZWN0ZWQuc2V0KHRoaXMuaXRlbXMoKS5zbGljZSgwLCBwZXJQYWdlKS5tYXAoaXRlbSA9PiBgJHtpdGVtKClbdGhpcy5maWVsZEtleSgpXX1gKSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLm91dExvYWREYXRhRXJyb3Iuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuc2V0UGVyUGFnZVNlbGVjdE1vcmVJdGVtKGN1cnJlbnRQYWdlKTtcbiAgICB9KTtcbiAgfVxuICBwcml2YXRlIHNldFBlclBhZ2VTZWxlY3RNb3JlSXRlbShwZXJQYWdlOiBzdHJpbmcgfCBudW1iZXIpOiBzdHJpbmcge1xuICAgIGNvbnN0IGFyZ3VtZW50c1ZhbHVlID0gdGhpcy5odHRwUmVxdWVzdERhdGEoKT8uYXJndW1lbnRzVmFsdWU7XG5cbiAgICBpZiAoIWFyZ3VtZW50c1ZhbHVlIHx8ICF0aGlzLmNvbmZpZ1NlbGVjdE1vcmVJdGVtKCkpIHtcbiAgICAgIHJldHVybiAnLTEnO1xuICAgIH1cbiAgICBjb25zdCBrZXlQZXJQYWdlID0gdGhpcy5jb25maWdTZWxlY3RNb3JlSXRlbSgpPy5rZXlQZXJQYWdlIHx8ICdwZXJfcGFnZSc7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyZ3VtZW50c1ZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICBsZXQgYXJndW1lbnQgPSBhcmd1bWVudHNWYWx1ZVtpXTtcblxuICAgICAgaWYgKGFyZ3VtZW50IGluc3RhbmNlb2YgSHR0cFBhcmFtcyAmJiBhcmd1bWVudC5oYXMoa2V5UGVyUGFnZSkpIHtcbiAgICAgICAgY29uc3QgY3VycmVudFBlclBhZ2UgPSBhcmd1bWVudC5nZXQoa2V5UGVyUGFnZSkgfHwgJzI1JztcblxuICAgICAgICBhcmd1bWVudCA9IGFyZ3VtZW50LnNldChrZXlQZXJQYWdlLCBwZXJQYWdlKTtcbiAgICAgICAgc2V0KGFyZ3VtZW50c1ZhbHVlLCBgJHtpfWAsIGFyZ3VtZW50KTtcblxuICAgICAgICByZXR1cm4gY3VycmVudFBlclBhZ2U7XG4gICAgICB9XG5cbiAgICAgIGlmIChhcmd1bWVudCBpbnN0YW5jZW9mIE9iamVjdCAmJiBPYmplY3Qua2V5cyhhcmd1bWVudCkuaW5jbHVkZXMoa2V5UGVyUGFnZSkpIHtcbiAgICAgICAgY29uc3QgY3VycmVudFBlclBhZ2UgPSBhcmd1bWVudC5nZXQoa2V5UGVyUGFnZSkgfHwgJzI1JztcblxuICAgICAgICBzZXQoYXJndW1lbnQsIGtleVBlclBhZ2UsIHBlclBhZ2UpO1xuXG4gICAgICAgIHJldHVybiBjdXJyZW50UGVyUGFnZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gJy0xJztcbiAgfVxuXG4gIHByaXZhdGUgb25Tb3J0U3VjY2VzcygpIHtcbiAgICB0aGlzLmxvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICB0aGlzLm91dExvYWRpbmcuZW1pdCh0aGlzLmxvYWRpbmcoKSk7XG4gICAgdGhpcy5yZXNldFNjcm9sbCgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJCdXR0b25DbGljayh0eXBlOiAnYnV0dG9uJyB8ICdidXR0b24tZHJvcGRvd24nLCBidXR0b25Ecm9wZG93bkRhdGE6IGFueSwgYnV0dG9uOiBJQnV0dG9uKSB7IC8vIGJ1dHRvbk9yaWdpbiBjaOG7iSBz4butIGThu6VuZyBraGkgZMO5bmcgYnV0dG9uQWN0aW9ucyBjw7MgYnV0dG9uLWRyb3Bkb3duXG4gICAgaWYgKHR5cGUgPT09ICdidXR0b24nKSB7XG4gICAgICByZXR1cm4gdGhpcy5vdXRDbGlja0J1dHRvbkFjdGlvbi5lbWl0KHsgaXRlbTogdGhpcy5pdGVtT2ZJbmRleEhvdmVyLCBidXR0b246IGJ1dHRvbiB9KTtcbiAgICB9XG4gICAgdGhpcy5vdXRDbGlja0J1dHRvbkFjdGlvbi5lbWl0KHsgaXRlbTogdGhpcy5pdGVtT2ZJbmRleEhvdmVyLCBidXR0b24sIGJ1dHRvbkRyb3Bkb3duRGF0YSB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyQmFyQnV0dG9uQ2xpY2soYnV0dG9uOiBJQnV0dG9uKSB7XG4gICAgY29uc3QgaXRlbXM6IEFycmF5PFdyaXRhYmxlU2lnbmFsPGFueT4+ID0gW107XG5cbiAgICB0aGlzLmtleXNTZWxlY3RlZCgpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLml0ZW1zKCkuZmluZChpdGVtID0+IGAke2l0ZW0oKVt0aGlzLmZpZWxkS2V5KCldfWAgPT09IGAke2tleX1gKTtcblxuICAgICAgaWYgKGl0ZW0pIHtcbiAgICAgICAgaXRlbXMucHVzaChpdGVtKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLm91dENsaWNrQmFyQnV0dG9uLmVtaXQoe1xuICAgICAgYnV0dG9uLFxuICAgICAgaXRlbXMsXG4gICAgICBrZXlzOiB0aGlzLmtleXNTZWxlY3RlZCgpLFxuICAgICAgaGlkZGVuQmFyQnV0dG9uczogKCkgPT4ge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckJ1dHRvbkRyb3Bkb3duRXZlbnQoZXZlbnROYW1lOiBUWVBFX1BPUE9WRVJfRVZFTlQpIHtcbiAgICB0aGlzLmhhc0FjdGlvbkJ1dHRvbkRyb3Bkb3duQ29udGVudC5zZXQodHJ1ZSk7XG4gICAgaWYgKGV2ZW50TmFtZSA9PT0gJ3JlbW92ZScgfHwgZXZlbnROYW1lID09PSAnbW91c2VsZWF2ZS1jb250ZW50Jykge1xuICAgICAgdGhpcy5oYXNBY3Rpb25CdXR0b25Ecm9wZG93bkNvbnRlbnQuc2V0KGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgc2V0SW5kZXhIb3ZlcihlOiBFdmVudCwgaXRlbTogV3JpdGFibGVTaWduYWw8VFlQRV9PQkpFQ1Q+KSB7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBpZiAoIXRoaXMuaXRlbXMoKS5sZW5ndGgpIHtcbiAgICAgIHRoaXMucmVzZXRJbmRleEhvdmVyKCk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5pdGVtT2ZJbmRleEhvdmVyID0gaXRlbTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZXNldEluZGV4SG92ZXJXaGVuTW91c2VMZWF2ZShlPzogRXZlbnQpIHtcbiAgICBlPy5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBjb25zdCBjdXJyZW50SW5kZXhJdGVtSG92ZXIgPSB0aGlzLml0ZW1PZkluZGV4SG92ZXI7XG5cbiAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0TGVhdmVJdGVtKCkpO1xuICAgIHRoaXMudGltZW91dExlYXZlSXRlbS5zZXQoc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5pdGVtT2ZJbmRleEhvdmVyICYmIHRoaXMuaXRlbU9mSW5kZXhIb3ZlciAhPT0gY3VycmVudEluZGV4SXRlbUhvdmVyKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMucmVzZXRJbmRleEhvdmVyKGUpO1xuICAgIH0pKTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZXNldEluZGV4SG92ZXIoZT86IEV2ZW50KSB7XG4gICAgZT8uc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgaWYgKHRoaXMuaGFzQWN0aW9uQnV0dG9uRHJvcGRvd25Db250ZW50KCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5pdGVtT2ZJbmRleEhvdmVyID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJNb3VzZUxlYXZlQ29udGFpbmVyKGV2ZW50OiBFdmVudCkge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMucmVzZXRJbmRleEhvdmVyKGV2ZW50KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyTW91c2VFbnRlckhlYWRlcihldmVudDogRXZlbnQpIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLm1vdXNlRW50ZXJIZWFkZXIuc2V0KHRydWUpO1xuICAgIHRoaXMucmVzZXRJbmRleEhvdmVyKGV2ZW50KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyTW91c2VMZWF2ZUhlYWRlcihldmVudDogRXZlbnQpIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLm1vdXNlRW50ZXJIZWFkZXIuc2V0KGZhbHNlKTtcbiAgICB0aGlzLnJlc2V0SW5kZXhIb3ZlcihldmVudCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlck1vdXNlRW50ZXJGb290ZXIoZXZlbnQ6IEV2ZW50KSB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5yZXNldEluZGV4SG92ZXIoZXZlbnQpO1xuICAgIGlmICh0aGlzLmNsYXNzRm9vdGVySW5jbHVkZSgpKSB7XG4gICAgICB0aGlzLmZvb3RlckVsZW1lbnRSZWYoKT8ubmF0aXZlRWxlbWVudD8uY2xhc3NMaXN0LnJlbW92ZSgnYmctWyNmOGY5ZmFdJyk7XG4gICAgICB0aGlzLmZvb3RlckxlZnRFbGVtZW50UmVmKCk/Lm5hdGl2ZUVsZW1lbnQ/LmNsYXNzTGlzdC5yZW1vdmUoJ2JnLVsjZjhmOWZhXScpO1xuICAgICAgdGhpcy5mb290ZXJFbGVtZW50UmVmKCk/Lm5hdGl2ZUVsZW1lbnQ/LmNsYXNzTGlzdC5hZGQodGhpcy5jbGFzc0Zvb3RlckluY2x1ZGUoKSk7XG4gICAgICB0aGlzLmZvb3RlckxlZnRFbGVtZW50UmVmKCk/Lm5hdGl2ZUVsZW1lbnQ/LmNsYXNzTGlzdC5hZGQodGhpcy5jbGFzc0Zvb3RlckluY2x1ZGUoKSk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJNb3VzZUxlYXZlRm9vdGVyKGV2ZW50OiBFdmVudCkge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGlmICh0aGlzLmNsYXNzRm9vdGVySW5jbHVkZSgpKSB7XG4gICAgICB0aGlzLmZvb3RlckVsZW1lbnRSZWYoKT8ubmF0aXZlRWxlbWVudD8uY2xhc3NMaXN0LnJlbW92ZSh0aGlzLmNsYXNzRm9vdGVySW5jbHVkZSgpKTtcbiAgICAgIHRoaXMuZm9vdGVyTGVmdEVsZW1lbnRSZWYoKT8ubmF0aXZlRWxlbWVudD8uY2xhc3NMaXN0LnJlbW92ZSh0aGlzLmNsYXNzRm9vdGVySW5jbHVkZSgpKTtcbiAgICAgIHRoaXMuZm9vdGVyRWxlbWVudFJlZigpPy5uYXRpdmVFbGVtZW50Py5jbGFzc0xpc3QuYWRkKCdiZy1bI2Y4ZjlmYV0nKTtcbiAgICAgIHRoaXMuZm9vdGVyTGVmdEVsZW1lbnRSZWYoKT8ubmF0aXZlRWxlbWVudD8uY2xhc3NMaXN0LmFkZCgnYmctWyNmOGY5ZmFdJyk7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBoYW5kbGVyU2Nyb2xsSGVhZGVyKGU6IEV2ZW50KSB7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBpZiAoIXRoaXMubW91c2VFbnRlckhlYWRlcigpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgICh0aGlzLmJvZHlFbGVtZW50UmVmKCkgYXMgYW55KS5uYXRpdmVFbGVtZW50LnNjcm9sbExlZnQgPSAoZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLnNjcm9sbExlZnQ7XG4gICAgaWYgKHRoaXMuZm9vdGVyRWxlbWVudFJlZigpKSB7XG4gICAgICAodGhpcy5mb290ZXJFbGVtZW50UmVmKCkgYXMgYW55KS5uYXRpdmVFbGVtZW50LnNjcm9sbExlZnQgPSAoZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLnNjcm9sbExlZnQ7XG4gICAgfVxuICAgIHRoaXMucmVzZXRJbmRleEhvdmVyKGUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJTY3JvbGxCb2R5KGU6IEV2ZW50KSB7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBpZiAodGhpcy5tb3VzZUVudGVySGVhZGVyKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgKHRoaXMuaGVhZGVyRWxlbWVudFJlZigpIGFzIGFueSkubmF0aXZlRWxlbWVudC5zY3JvbGxMZWZ0ID0gKGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5zY3JvbGxMZWZ0O1xuICAgIGlmICh0aGlzLmZvb3RlckVsZW1lbnRSZWYoKSkge1xuICAgICAgKHRoaXMuZm9vdGVyRWxlbWVudFJlZigpIGFzIGFueSkubmF0aXZlRWxlbWVudC5zY3JvbGxMZWZ0ID0gKGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5zY3JvbGxMZWZ0O1xuICAgIH1cbiAgICB0aGlzLnJlc2V0SW5kZXhIb3ZlcihlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyU2Nyb2xsQm90dG9tKGU6IEV2ZW50KSB7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLmxvYWRNb3JlKCk7XG4gIH1cblxuICBwcml2YXRlIHJlc2V0U2Nyb2xsKCkge1xuICAgIGlmICh0aGlzLmhlYWRlckVsZW1lbnRSZWYoKSkge1xuICAgICAgKHRoaXMuaGVhZGVyRWxlbWVudFJlZigpIGFzIGFueSkubmF0aXZlRWxlbWVudC5zY3JvbGxMZWZ0ID0gMDtcbiAgICB9XG4gICAgaWYgKHRoaXMuQm9keUVsZW1lbnQpIHtcbiAgICAgIHRoaXMuQm9keUVsZW1lbnQuc2Nyb2xsVG9wID0gMDtcbiAgICAgIHRoaXMuQm9keUVsZW1lbnQuc2Nyb2xsTGVmdCA9IDA7XG4gICAgfVxuICAgIGlmICh0aGlzLmZvb3RlckVsZW1lbnRSZWYoKSkge1xuICAgICAgKHRoaXMuZm9vdGVyRWxlbWVudFJlZigpIGFzIGFueSkubmF0aXZlRWxlbWVudC5zY3JvbGxMZWZ0ID0gMDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlc2V0KGNsZWFyU29ydD86IGJvb2xlYW4pIHtcbiAgICBpZiAoY2xlYXJTb3J0KSB7XG4gICAgICB0aGlzLmluc3RhbmNlU29ydCgpPy5yZXNldCgpO1xuICAgICAgdGhpcy5pbnN0YW5jZVNvcnQuc2V0KHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIHRoaXMuaGFzU2Nyb2xsLnNldChmYWxzZSk7XG4gICAgdGhpcy5sb2FkaW5nLnNldChmYWxzZSk7XG4gICAgdGhpcy5vdXRMb2FkaW5nLmVtaXQodGhpcy5sb2FkaW5nKCkpO1xuICAgIHRoaXMuaXRlbXMuc2V0KFtdKTtcbiAgICB0aGlzLnN0b3Jlcy5zZXQoW10pO1xuICAgIHRoaXMuZmFrZVJlc3BvbnNlQXBpKCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNoZWNrU2Nyb2xsKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGhhc1Njcm9sbCA9IHRoaXMuaGFzU2Nyb2xsKCk7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICB0aW1lcig1MDApLnBpcGUodGFrZVVudGlsKHRoaXMub25EZXN0cm95KSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuQm9keUVsZW1lbnQpIHtcbiAgICAgICAgICB0aGlzLmhhc1Njcm9sbC5zZXQodGhpcy5Cb2R5RWxlbWVudC5zY3JvbGxIZWlnaHQgPiB0aGlzLkJvZHlFbGVtZW50Lm9mZnNldEhlaWdodCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhhc1Njcm9sbCAmJiAhdGhpcy5oYXNTY3JvbGwoKSkge1xuICAgICAgICAgIHRoaXMub3V0U2Nyb2xsSXNHb25lLmVtaXQoe30pO1xuICAgICAgICAgIGlmICghdGhpcy5maWx0ZXJPclNvcnRMb2NhbCgpKSB7XG4gICAgICAgICAgICB0aGlzLmNhbGxBcGlCeVNlcnZpY2UodHJ1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCBCb2R5RWxlbWVudCgpOiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuYm9keUVsZW1lbnRSZWYoKT8ubmF0aXZlRWxlbWVudDtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMub25EZXN0cm95Lm5leHQoKTtcbiAgICB0aGlzLm9uRGVzdHJveS5jb21wbGV0ZSgpO1xuICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXRMZWF2ZUl0ZW0oKSk7XG4gIH1cblxufVxuIiwiPGRpdiBjbGFzcz0nZmxleCBmbGV4LWNvbCB3LWZ1bGwgaC1mdWxsJz5cbiAgQGlmICghaWdub3JlQmFyKCkpIHtcbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIHJlbGF0aXZlIHotWzFdIGJvdHRvbS0wIGxlZnQtMCB3LWZ1bGwgYmctd2hpdGUgbGlicy11aS10YWJsZS1zaGFkb3ctYm90dG9tIHt7IGNsYXNzQmFySW5jbHVkZSgpIH19XCJcbiAgICAgIFtjbGFzcy5weC1bMTZweF1dPVwia2V5c1NlbGVjdGVkKCkubGVuZ3RoIHx8IGxhYmVsQmFyTm9TZWxlY3RJdGVtKClcIlxuICAgICAgW2NsYXNzLnB5LVs2cHhdXT1cImtleXNTZWxlY3RlZCgpLmxlbmd0aCB8fCBsYWJlbEJhck5vU2VsZWN0SXRlbSgpXCJcbiAgICAgIChtb3VzZWVudGVyKT1cInJlc2V0SW5kZXhIb3ZlcigkZXZlbnQpXCI+XG4gICAgICA8bmctY29udGVudCBzZWxlY3Q9J2Rpdi5saWJzLXVpLXRhYmxlLWJhci1sZWZ0Jz48L25nLWNvbnRlbnQ+XG4gICAgICBAaWYgKCFrZXlzU2VsZWN0ZWQoKS5sZW5ndGggJiYgbGFiZWxCYXJOb1NlbGVjdEl0ZW0oKSkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwie3sgY2xhc3NMYWJlbEJhck5vU2VsZWN0SXRlbSgpID8/ICdweC1bMTJweF0gcHktWzVweF0nIH19XCJcbiAgICAgICAgICBbaW5uZXJIdG1sXT0nbGFiZWxCYXJOb1NlbGVjdEl0ZW0oKSB8IHRyYW5zbGF0ZTp7dmFsdWU6dG90YWxJdGVtRGlzcGxheSgpfSc+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgICAgQGlmIChrZXlzU2VsZWN0ZWQoKS5sZW5ndGgpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIHBsLVsxMnB4XVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBoLWZ1bGwgbXQtWy0ycHhdXCI+XG4gICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWNoZWNrYm94LXNpbmdsZSBbY2hlY2tlZF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVdPVwibG9hZGluZygpIHx8IGRpc2FibGVDaGVja2JveCgpXCJcbiAgICAgICAgICAgICAgKG91dENoYW5nZSk9XCJoYW5kbGVyQ2hhbmdlQWxsQ2hlY2tlZCgpXCIgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibGlicy11aS1mb250LWg1bSB0ZXh0LVsjMDcxNjMxXSBtci1bOHB4XSB7eyBjbGFzc0xhYmVsQmFyQnV0dG9ucygpIH19XCI+XG4gICAgICAgICAgICB7eyBsYWJlbEJhckJ1dHRvbnMoKSB8IHRyYW5zbGF0ZTp7IHZhbHVlOmtleXNTZWxlY3RlZCgpLmxlbmd0aCB9IH19XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgQGlmIChjb25maWdTZWxlY3RNb3JlSXRlbSgpKSB7XG4gICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWRyb3Bkb3duIFtpc05nQ29udGVudF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgW3BvcG92ZXJDdXN0b21Db25maWddPVwie1xuICAgICAgICAgICAgICAgIHdpZHRoQnlQYXJlbnQ6ZmFsc2UsXG4gICAgICAgICAgICAgICAgaWdub3JlQXJyb3c6IHRydWUsXG4gICAgICAgICAgICAgICAgbWF4SGVpZ2h0OiAgMjA0OCxcbiAgICAgICAgICAgICAgICBjbGFzc0luY2x1ZGU6JyF3LVsxMjFweF0nLFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgICAgICAgICAgICBtb2RlOidzdGFydCcsXG4gICAgICAgICAgICAgICAgICBkaXN0YW5jZTowXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgIFtsaXN0Q29uZmlnXT1cImxpc3RDb25maWdNb3JlSXRlbSgpXCJcbiAgICAgICAgICAgICAgW2xpc3RIaWRkZW5JbnB1dFNlYXJjaF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgW2xpc3RNYXhJdGVtU2hvd109XCI1XCJcbiAgICAgICAgICAgICAgY2xhc3M9XCIhdy1bMTZweF0gaC1bMTZweF0gbXItWzhweF1cIlxuICAgICAgICAgICAgICAob3V0U2VsZWN0S2V5KT1cImhhbmRsZXJTZWxlY3RlZE1vcmVJdGVtKCRldmVudClcIlxuICAgICAgICAgICAgICAob3V0RnVuY3Rpb25zQ29udHJvbCk9XCJoYW5kbGVyRnVuY3Rpb25Db250cm9sTW9yZVNlbGVjdEl0ZW0oJGV2ZW50KVwiPlxuICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uIFt0eXBlXT1cIididXR0b24tbGluay1wcmltYXJ5J1wiXG4gICAgICAgICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCInIXAtMCBtLTAnXCJcbiAgICAgICAgICAgICAgICBbY2xhc3NJY29uTGVmdF09XCInYmVmb3JlOiF0ZXh0LVsxNnB4XSBsaWJzLXVpLWljb24tbW92ZS1yaWdodCByb3RhdGUtOTAgbXItWzZweF0nXCJcbiAgICAgICAgICAgICAgICBbcG9wb3Zlcl09XCJ7Y29uZmlnOntjb250ZW50OidpMThuX21vcmVfc2VsZWN0J319XCJcbiAgICAgICAgICAgICAgICBbaWdub3JlU3RvcFByb3BhZ2F0aW9uRXZlbnRdPVwidHJ1ZVwiIC8+XG4gICAgICAgICAgICA8L2xpYnNfdWktY29tcG9uZW50cy1kcm9wZG93bj5cbiAgICAgICAgICB9XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImgtWzE2cHhdIGxpYnMtdWktYm9yZGVyLWxlZnQtZ2VuZXJhbCBtbC1bMTZweF1cIj48L2Rpdj5cbiAgICAgICAgICBAaWYgKGJhckJ1dHRvbnMoKT8ubGVuZ3RoKSB7XG4gICAgICAgICAgICBAZm9yIChidXR0b24gb2YgYmFyQnV0dG9ucygpO3RyYWNrIGJ1dHRvbikge1xuICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uIFt0eXBlXT1cImJ1dHRvbi50eXBlIHx8ICdidXR0b24tbGluay1wcmltYXJ5J1wiXG4gICAgICAgICAgICAgICAgW2NsYXNzSWNvbkxlZnRdPVwiYnV0dG9uLmNsYXNzSWNvbkxlZnQgfHwgJydcIlxuICAgICAgICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiYnV0dG9uLmNsYXNzSW5jbHVkZSB8fCAnJ1wiXG4gICAgICAgICAgICAgICAgW2xhYmVsXT1cIihidXR0b24ubGFiZWwgfHwgJyAnKSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgKG91dENsaWNrKT1cImhhbmRsZXJCYXJCdXR0b25DbGljayhidXR0b24pXCIgLz5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PSdkaXYubGlicy11aS10YWJsZS1iYXItcmlnaHQnPjwvbmctY29udGVudD5cbiAgICA8L2Rpdj5cbiAgfVxuXG4gIDxkaXYgI3RhYmxlQ29udGFpbmVyRWxlbWVudFJlZlxuICAgIGNsYXNzPVwibGlicy11aS10YWJsZSBmbGV4IGZsZXgtY29sIHctZnVsbCBoLWZ1bGwgcmVsYXRpdmUge3sgY2xhc3NUYWJsZUNvbnRhaW5lckluY2x1ZGUoKSB9fVwiXG4gICAgW2NsYXNzLnB4LVsxNnB4XV09JyFpZ25vcmVCYXIoKSdcbiAgICAobW91c2VsZWF2ZSk9XCJoYW5kbGVyTW91c2VMZWF2ZUNvbnRhaW5lcigkZXZlbnQpXCI+XG4gICAgPGRpdiBjbGFzcz1cInJlbGF0aXZlIHctZnVsbFwiXG4gICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cImhlYWRlckVsZW1lbnRSZWYub2Zmc2V0SGVpZ2h0XCI+XG4gICAgICA8ZGl2ICNoZWFkZXJFbGVtZW50UmVmXG4gICAgICAgIExpYnNVaUNvbXBvbmVudHNTY3JvbGxPdmVybGF5RGlyZWN0aXZlXG4gICAgICAgIFtvcHRpb25zXT1cIntzY3JvbGxiYXJXaWR0aDogMH1cIlxuICAgICAgICBbY2xhc3MubGlicy11aS1ib3JkZXItYm90dG9tLWRhc2hlZC1nZW5lcmFsXT1cIiFoYXNJdGVtSGlnaHRMaWdodCgpICYmIGlzRGFzaEJvcmRlcigpXCJcbiAgICAgICAgW2NsYXNzLmxpYnMtdWktYm9yZGVyLWJvdHRvbS1nZW5lcmFsXT1cIiFoYXNJdGVtSGlnaHRMaWdodCgpICYmICFpc0Rhc2hCb3JkZXIoKVwiXG4gICAgICAgIFtjbGFzcy4haGlkZGVuXT1cIiFpdGVtcygpLmxlbmd0aCAmJiBpc0hpZGRlbkhlYWRlcldoZW5Ob2RhdGEoKVwiXG4gICAgICAgIFtjbGFzc109XCJjbGFzc0hlYWRlckNvbnRhaW5lcigpXCJcbiAgICAgICAgKG91dFNjcm9sbCk9XCJoYW5kbGVyU2Nyb2xsSGVhZGVyKCRldmVudClcIlxuICAgICAgICAobW91c2VlbnRlcik9XCJoYW5kbGVyTW91c2VFbnRlckhlYWRlcigkZXZlbnQpXCJcbiAgICAgICAgKG1vdXNlbGVhdmUpPVwiaGFuZGxlck1vdXNlTGVhdmVIZWFkZXIoJGV2ZW50KVwiPlxuICAgICAgICBAaWYgKGhlYWRlckxlZnQoKS5sZW5ndGgpIHtcbiAgICAgICAgICA8ZGl2IFtjbGFzc109XCJjbGFzc0hlYWRlckxlZnRDb250YWluZXIoKVwiPlxuICAgICAgICAgICAgQGZvciAoaGVhZGVyIG9mIGhlYWRlckxlZnQoKTt0cmFjayBoZWFkZXIpIHtcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRlbXBsYXRlSGVhZGVyUmVmO2NvbnRleHQ6e2hlYWRlckl0ZW06aGVhZGVyLGlzSGVhZGVyTGVmdDp0cnVlfVwiIC8+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgICAgQGlmIChoZWFkZXJSaWdodCgpLmxlbmd0aCkge1xuICAgICAgICAgIEBmb3IgKGhlYWRlciBvZiBoZWFkZXJSaWdodCgpO3RyYWNrIGhlYWRlcikge1xuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRlbXBsYXRlSGVhZGVyUmVmO2NvbnRleHQ6e2hlYWRlckl0ZW06aGVhZGVyLGlzSGVhZGVyTGVmdDpmYWxzZX1cIiAvPlxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgQGlmIChzaG93Rm9vdGVyKCkgJiYgaXRlbUZvb3RlcigpICYmIGN1c3RvbVBvc2l0aW9uRm9vdGVyKCkgPT09ICd0b3AnKSB7XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PSd0ZW1wbGF0ZUZvb3RlclJlZicgLz5cbiAgICB9XG4gICAgPGRpdiBjbGFzcz1cInJlbGF0aXZlIGZsZXggZmxleC1jb2wgdy1mdWxsIGgtZnVsbCBvdmVyZmxvdy14LWhpZGRlbiBiZy13aGl0ZSB7eyBjbGFzc0JvZHlJbmNsdWRlKCkgfHwgJycgfX1cIj5cbiAgICAgIDxkaXYgI2JvZHlFbGVtZW50UmVmXG4gICAgICAgIGNsYXNzPVwiZmxleCBoLWZ1bGwgdy1mdWxsIHJlbGF0aXZlXCJcbiAgICAgICAgTGlic1VpQ29tcG9uZW50c1Njcm9sbE92ZXJsYXlEaXJlY3RpdmVcbiAgICAgICAgKG91dFNjcm9sbCk9XCJoYW5kbGVyU2Nyb2xsQm9keSgkZXZlbnQpXCJcbiAgICAgICAgKG91dFNjcm9sbEJvdHRvbSk9XCJoYW5kbGVyU2Nyb2xsQm90dG9tKCRldmVudClcIj5cbiAgICAgICAgQGlmIChpdGVtcygpLmxlbmd0aCkge1xuICAgICAgICAgIDx2aXJ0dWFsLXNjcm9sbGVyICNib2R5Q29tcG9uZW50UmVmXG4gICAgICAgICAgICBbaXRlbXNdPVwiaXRlbXMoKVwiXG4gICAgICAgICAgICBbZW5hYmxlVW5lcXVhbENoaWxkcmVuU2l6ZXNdPVwiZW5hYmxlVW5lcXVhbENoaWxkcmVuU2l6ZXMoKVwiXG4gICAgICAgICAgICBjbGFzcz1cImgtZnVsbFwiXG4gICAgICAgICAgICBbc3R5bGUud2lkdGgucHhdPVwiaGVhZGVyRWxlbWVudFJlZi5zY3JvbGxXaWR0aCA+IChib2R5RWxlbWVudFJlZiA/IGJvZHlFbGVtZW50UmVmLnNjcm9sbFdpZHRoIDogMCkgPyBoZWFkZXJFbGVtZW50UmVmLnNjcm9sbFdpZHRoOiB1bmRlZmluZWRcIlxuICAgICAgICAgICAgW3BhcmVudFNjcm9sbF09XCJib2R5RWxlbWVudFJlZlwiXG4gICAgICAgICAgICBbYnVmZmVyQW1vdW50XT1cImJ1ZmZlckFtb3VudCgpXCI+XG4gICAgICAgICAgICBAZm9yIChkYXRhIG9mIGJvZHlDb21wb25lbnRSZWYudmlld1BvcnRJdGVtczt0cmFjayBkYXRhKCkpIHtcbiAgICAgICAgICAgICAgPGRpdiAjZWxlbWVudEhvdmVyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4XCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuYmctWyNmM2ZjZmNdXT1cImRhdGEoKS5zcGVjaWZpY0hpZ2h0TGlnaHRcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5saWJzLXVpLWJvcmRlci10b3AtMXB4LTM2ZDNkM109XCJkYXRhKCkuc3BlY2lmaWNIaWdodExpZ2h0ICYmICRmaXJzdCAmJiAhaWdub3JlQm9yZGVySXRlbSgpXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MubGlicy11aS1ib3JkZXItYm90dG9tLTFweC0zNmQzZDNdPVwiZGF0YSgpLnNwZWNpZmljSGlnaHRMaWdodCAmJiAhaWdub3JlQm9yZGVySXRlbSgpXCJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCIoZGF0YSgpLnNwZWNpZmljSGlnaHRMaWdodCB8fCAoJGxhc3QgJiYgaWdub3JlQm9yZGVySXRlbUxhc3QoKSkpID8gJ2xpYnMtdWktYm9yZGVyLXJhZGl1cy1ib3R0b20tbGVmdC00cHggbGlicy11aS1ib3JkZXItcmFkaXVzLWJvdHRvbS1yaWdodC00cHgnIDogaWdub3JlQm9yZGVySXRlbSgpID8gJycgOiBpc0Rhc2hCb3JkZXIoKSA/ICdsaWJzLXVpLWJvcmRlci1ib3R0b20tZGFzaGVkLWdlbmVyYWwnIDogJ2xpYnMtdWktYm9yZGVyLWJvdHRvbS1nZW5lcmFsJ1wiXG4gICAgICAgICAgICAgICAgW3N0eWxlLndpZHRoLnB4XT1cImhlYWRlckVsZW1lbnRSZWYuc2Nyb2xsV2lkdGhcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5iZy1bI2Y4ZjlmYV1dPVwiaXRlbU9mSW5kZXhIb3ZlciA9PT0gZGF0YSAmJiAhZGF0YSgpLnNwZWNpZmljSGlnaHRMaWdodFwiXG4gICAgICAgICAgICAgICAgKG1vdXNlZW50ZXIpPVwic2V0SW5kZXhIb3ZlcigkZXZlbnQsZGF0YSlcIlxuICAgICAgICAgICAgICAgIChtb3VzZWxlYXZlKT1cInJlc2V0SW5kZXhIb3ZlcldoZW5Nb3VzZUxlYXZlKCRldmVudClcIj5cbiAgICAgICAgICAgICAgICBAaWYgKGhlYWRlckxlZnQoKS5sZW5ndGggfHwgaGVhZGVyUmlnaHQoKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIHctZnVsbFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCB3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICBAaWYgKGhlYWRlckxlZnQoKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IHN0aWNreSB0b3AtMCBsZWZ0LTAgei1bMV1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYmctd2hpdGVdPVwiIWRhdGEoKS5zcGVjaWZpY0hpZ2h0TGlnaHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYmctWyNmM2ZjZmNdXT1cImRhdGEoKS5zcGVjaWZpY0hpZ2h0TGlnaHRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgQGZvciAoaGVhZGVyIG9mIGhlYWRlckxlZnQoKTt0cmFjayBoZWFkZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInJlbGF0aXZlIGZsZXggcHgtWzEycHhdIHB5LVs4cHhdIHt7IGhlYWRlci5pZ25vcmVCb3JkZXJSaWdodCA/ICcnOiAnbGlicy11aS1ib3JkZXItcmlnaHQtZ2VuZXJhbCcgfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmJnLVsjZjhmOWZhXV09XCJpdGVtT2ZJbmRleEhvdmVyID09PSBkYXRhICYmICFkYXRhKCkuc3BlY2lmaWNIaWdodExpZ2h0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cIihoZWFkZXJ8TGlic1VpVGFibGVDYWxjdWxhdG9yQ29sdW1uUGlwZTpoZWFkZXJFbGVtZW50UmVmLmNsaWVudFdpZHRoOmhlYWRlckxlZnQoKTpoZWFkZXJSaWdodCgpKSB8fCAoaGVhZGVyLmlzU2hvd0luZGV4T25Sb3cgPyB7d2lkdGg6JzUwcHgnLCdmbGV4LXNoaXJrJzonMCcscGFkZGluZzonOHB4J30gOiB7fSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiaGVhZGVyLm5nQ2xhc3MgfHwgIHt9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGVtcGxhdGVCb2R5UmVmO2NvbnRleHQ6e2hlYWRlcjpoZWFkZXIsZGF0YTpkYXRhfVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBAaWYgKGhlYWRlclJpZ2h0KCkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBAZm9yIChoZWFkZXIgb2YgaGVhZGVyUmlnaHQoKTt0cmFjayBoZWFkZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlbGF0aXZlIGZsZXggcHgtWzEycHhdIHB5LVs4cHhdXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCIoaGVhZGVyfExpYnNVaVRhYmxlQ2FsY3VsYXRvckNvbHVtblBpcGU6aGVhZGVyRWxlbWVudFJlZi5jbGllbnRXaWR0aDpoZWFkZXJMZWZ0KCk6aGVhZGVyUmlnaHQoKSkgfHwgKGhlYWRlci5pc1Nob3dJbmRleE9uUm93ID8ge3dpZHRoOic1MHB4JywnZmxleC1zaGlyayc6JzAnLHBhZGRpbmc6JzhweCd9IDoge30pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJoZWFkZXIubmdDbGFzcyB8fCB7fVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZW1wbGF0ZUJvZHlSZWY7Y29udGV4dDp7aGVhZGVyOmhlYWRlcixkYXRhOmRhdGF9XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgQGlmIChjb25maWdUZW1wbGF0ZUl0ZW1Db2xsYXBzZUV4cGFuZCgpICYmIGRhdGEoKS5zcGVjaWZpY0V4cGFuZCAmJiBkYXRhKClbY29uZmlnVGVtcGxhdGVJdGVtQ29sbGFwc2VFeHBhbmQoKT8uZmllbGRHZXREYXRhRXhwYW5kIHx8ICdzcGVjaWZpY0RhdGFFeHBhbmQnXSkge1xuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgW2NsYXNzXT1cImNvbmZpZ1RlbXBsYXRlSXRlbUNvbGxhcHNlRXhwYW5kKCk/LmNzc1dyYXBwZXIgfHwgJ2ZsZXggdy1mdWxsJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgQGZvciAoZGF0YUV4cGFuZCBvZiBkYXRhKClbY29uZmlnVGVtcGxhdGVJdGVtQ29sbGFwc2VFeHBhbmQoKT8uZmllbGRHZXREYXRhRXhwYW5kIHx8ICdzcGVjaWZpY0RhdGFFeHBhbmQnXSgpO3RyYWNrICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYgKGNvbmZpZ1RlbXBsYXRlSXRlbUNvbGxhcHNlRXhwYW5kKCk/LmNvbFRlbXBsYXRlQ29uZmlnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy10YWJsZS10ZW1wbGF0ZXMgW2l0ZW1dPVwiZGF0YUV4cGFuZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGVtcGxhdGVDc3NXcmFwcGVyXT1cImNvbmZpZ1RlbXBsYXRlSXRlbUNvbGxhcHNlRXhwYW5kKCk/LnRlbXBsYXRlQ3NzV3JhcHBlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY29uZmlnc109XCJjb25maWdUZW1wbGF0ZUl0ZW1Db2xsYXBzZUV4cGFuZCgpPy5jb2xUZW1wbGF0ZUNvbmZpZ1wiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gQGVtcHR5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlbGF0aXZlIGgtWzEwMHB4XVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZW1wbGF0ZU5vZGF0YVJlZlwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvdmlydHVhbC1zY3JvbGxlcj5cbiAgICAgICAgfSBAZWxzZSBpZiAoIWxvYWRpbmcoKSkge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdGlja3kgbGVmdC0wIHRvcC0wIHotWzFdIGgtZnVsbCB3LWZ1bGxcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZW1wbGF0ZU5vZGF0YVJlZlwiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgQGlmIChzaG93U2Nyb2xsVGFibGVQaW5uZWRJZk5vRGF0YSgpKSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWJzb2x1dGUgaC1bMXB4XSBiZy10cmFuc3BhcmVudCB0b3AtMCBsZWZ0LTAgei1bMV1cIlxuICAgICAgICAgICAgICBbc3R5bGUud2lkdGgucHhdPVwiaGVhZGVyRWxlbWVudFJlZi5zY3JvbGxXaWR0aFwiPjwvZGl2PlxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG5cbiAgICAgIEBpZiAoc2hvd0Zvb3RlcigpICYmIGl0ZW1Gb290ZXIoKSAmJiBjdXN0b21Qb3NpdGlvbkZvb3RlcigpID09PSAnYm90dG9tJykge1xuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PSd0ZW1wbGF0ZUZvb3RlclJlZicgLz5cbiAgICAgIH1cblxuICAgICAgQGlmIChsb2FkaW5nKCkpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cImFic29sdXRlIHctZnVsbCBoLWZ1bGwgei1bMl0gZmxleCBpdGVtcy1jZW50ZXIgY29udGVudC1jZW50ZXJcIj5cbiAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLXNwaW5uZXIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG5cbjxuZy10ZW1wbGF0ZSAjdGVtcGxhdGVIZWFkZXJSZWZcbiAgbGV0LWhlYWRlcj0naGVhZGVySXRlbSdcbiAgbGV0LWlzSGVhZGVyTGVmdD0naXNIZWFkZXJMZWZ0Jz5cbiAgPGRpdlxuICAgIFtjbGFzc109XCIncmVsYXRpdmUgZmxleCAnKyAoaGVhZGVyLnBhZGRpbmdMZWZ0UmlnaHRIZWFkZXJDb250YWluZXIgPz8gJyBweC1bMTJweF0gJykgKyAoaXNIZWFkZXJMZWZ0ICYmICFoZWFkZXIuaWdub3JlQm9yZGVyUmlnaHQgPyAnIGxpYnMtdWktYm9yZGVyLXJpZ2h0LWdlbmVyYWwgJyA6ICcgJykrICcgbGlicy11aS10YWJsZS1oZWFkZXItY29sICdcIlxuICAgIFtjbGFzcy5mbGV4LWNvbF09XCJoZWFkZXIucm93c0NvbmZpZ1wiXG4gICAgW2NsYXNzLnB5LVs4cHhdXT0nIWhlYWRlci5pZ25vcmVQeURlZmF1bHQnXG4gICAgW25nU3R5bGVdPVwiKGhlYWRlcnxMaWJzVWlUYWJsZUNhbGN1bGF0b3JDb2x1bW5QaXBlOmhlYWRlckVsZW1lbnRSZWYuY2xpZW50V2lkdGg6aGVhZGVyTGVmdCgpOmhlYWRlclJpZ2h0KCkpIHx8IChoZWFkZXIuaXNTaG93SW5kZXhPblJvdyA/IHt3aWR0aDonNTBweCcsJ2ZsZXgtc2hpcmsnOicwJyxwYWRkaW5nOic4cHgnfSA6IHt9KVwiXG4gICAgW25nQ2xhc3NdPVwiaGVhZGVyLm5nQ2xhc3MgfHwge31cIj5cbiAgICBAaWYgKCFoZWFkZXIucm93c0NvbmZpZykge1xuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRlbXBsYXRlSGVhZGVyQ29udGVudFJlZjtjb250ZXh0OntoZWFkZXJJdGVtOmhlYWRlcixpc0NvbFJlbmRlcjpmYWxzZX1cIiAvPlxuICAgIH1cbiAgICBAaWYgKGhlYWRlci5yb3dzQ29uZmlnO2FzIHJvd3NDb25maWcpIHtcbiAgICAgIEBmb3IgKHJvdyBvZiByb3dzQ29uZmlnLnJvd3M7dHJhY2sgcm93KSB7XG4gICAgICAgIDxkaXYgW2NsYXNzXT1cInJvdy5jbGFzc1Jvd1wiPlxuICAgICAgICAgIEBmb3IgKGNvbCBvZiByb3cuY29scyA7IHRyYWNrIGNvbCkge1xuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRlbXBsYXRlSGVhZGVyQ29udGVudFJlZjtjb250ZXh0OntoZWFkZXJJdGVtOmNvbCxpc0NvbFJlbmRlcjp0cnVlfVwiIC8+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICB9XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICN0ZW1wbGF0ZUhlYWRlckNvbnRlbnRSZWZcbiAgbGV0LWhlYWRlcj0naGVhZGVySXRlbSdcbiAgbGV0LWlzQ29sUmVuZGVyPSdpc0NvbFJlbmRlcic+XG4gIDxkaXYgY2xhc3M9XCJmbGV4IGxpYnMtdWktZm9udC1oNm0gbWluLWgtWzE4cHhdIHRleHQtWyM2YTczODNdIG1heC13LWZ1bGxcIlxuICAgIFtjbGFzcy5pdGVtcy1jZW50ZXJdPSdoZWFkZXIuY29udGVudEhlYWRlckFsaWduQ2VudGVyID8/IHRydWUnXG4gICAgW2NsYXNzLmp1c3RpZnktZW5kXT0naGVhZGVyLmNvbnRlbnRIZWFkZXJKdXN0aWZ5Q29udGVudEVuZCdcbiAgICBbY2xhc3Mudy1mdWxsXT1cImhlYWRlci5pc1Nob3dJbmRleE9uUm93XCJcbiAgICBbbmdTdHlsZV09XCJpc0NvbFJlbmRlciA/ICgoaGVhZGVyfExpYnNVaVRhYmxlQ2FsY3VsYXRvckNvbHVtblBpcGU6aGVhZGVyRWxlbWVudFJlZi5jbGllbnRXaWR0aDpoZWFkZXJMZWZ0KCk6aGVhZGVyUmlnaHQoKSkgfHwgKGhlYWRlci5pc1Nob3dJbmRleE9uUm93ID8ge3dpZHRoOic1MHB4JywnZmxleC1zaGlyayc6JzAnLHBhZGRpbmc6JzhweCd9IDoge30pKSA6IHt9XCJcbiAgICBbbmdDbGFzc109XCJpc0NvbFJlbmRlciA/IChoZWFkZXIubmdDbGFzcyB8fCB7fSkgOiB7fVwiPlxuICAgIEBpZiAoaGVhZGVyLmhhc0NoZWNrYm94KSB7XG4gICAgICBAaWYgKGhlYWRlci5oYXNDaGVja2JveEFsbCkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBoLWZ1bGwge3sgaGVhZGVyLmNoZWNrYm94QWxsQ2xhc3NJbmNsdWRlIHx8ICdtci1bMTZweF0nIH19XCJcbiAgICAgICAgICBbY2xhc3MuaXRlbXMtY2VudGVyXT1cImhlYWRlci5jaGVja2JveEFsaWduQ2VudGVyXCI+XG4gICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1jaGVja2JveC1zaW5nbGUgW2tleV09XCInYWxsJ1wiXG4gICAgICAgICAgICBbc3RpbGxPdGhlck9wdGlvbnNdPVwiISFrZXlzU2VsZWN0ZWQoKS5sZW5ndGggJiYga2V5c1NlbGVjdGVkKCkubGVuZ3RoICE9PSBpdGVtcygpLmxlbmd0aFwiXG4gICAgICAgICAgICBbY2hlY2tlZF09XCIhIWtleXNTZWxlY3RlZCgpLmxlbmd0aCAmJiBrZXlzU2VsZWN0ZWQoKS5sZW5ndGggPT09IGl0ZW1zKCkubGVuZ3RoXCJcbiAgICAgICAgICAgIFtkaXNhYmxlXT1cImxvYWRpbmcoKVwiXG4gICAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cImhlYWRlci5jaGVja2JveENsYXNzSW5jbHVkZVwiXG4gICAgICAgICAgICAob3V0Q2hhbmdlKT1cImhhbmRsZXJDaGFuZ2VDaGVja2VkQWxsSXRlbXMoJGV2ZW50KVwiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfSBAZWxzZSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGgtZnVsbCBtbC1bMjRweF0ge3sgaGVhZGVyLmNoZWNrYm94Q2xhc3NJbmNsdWRlIH19XCI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgIH1cbiAgICBAZm9yICh0b29sdGlwIG9mIGhlYWRlci50b29sdGlwc0xlZnQ7IHRyYWNrIHRvb2x0aXApIHtcbiAgICAgIDxkaXYgY2xhc3M9XCJtci1bNHB4XVwiPlxuICAgICAgICA8bGlic191aS1jb21wb25lbnRzLXBvcG92ZXIgW3R5cGVdPVwidG9vbHRpcD8udHlwZSB8fCAnb3RoZXInXCJcbiAgICAgICAgICBbbW9kZV09XCJ0b29sdGlwPy5tb2RlIHx8ICdob3ZlcidcIlxuICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwidG9vbHRpcC5jbGFzc0luY2x1ZGUgfHwgJ3RleHQtWyM2YTczODNdJ1wiXG4gICAgICAgICAgW2lnbm9yZVNob3dQb3BvdmVyXT1cInRvb2x0aXAuaWdub3JlU2hvd1Rvb2x0aXAgfHwgZmFsc2VcIlxuICAgICAgICAgIFtjb25maWddPVwidG9vbHRpcC5jb25maWcgfHwge2NvbnRlbnQ6KHRvb2x0aXAuZGF0YVZpZXcgfHwgJyAnKSB8IHRyYW5zbGF0ZSwgcG9zaXRpb246IHtcbiAgICAgICAgICAgICAgICBtb2RlOiAnY2VudGVyJyxcbiAgICAgICAgICAgICAgICBkaXN0YW5jZTogMCxcbiAgICAgICAgICAgICAgICBhdXRvVXBkYXRlUG9zaXRpb246IHtcbiAgICAgICAgICAgICAgICAgIGVuZERpc3RhbmNlOiAxMixcbiAgICAgICAgICAgICAgICAgIHN0YXJ0RGlzdGFuY2U6IC0xMlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfX1cIlxuICAgICAgICAgIFtpbm5lckhUTUxdPVwidG9vbHRpcC5kYXRhVmlld1wiIC8+XG4gICAgICA8L2Rpdj5cbiAgICB9XG5cbiAgICBAaWYgKGhlYWRlci5pc1Nob3dJbmRleE9uUm93KSB7XG4gICAgICA8ZGl2IGNsYXNzPVwiZmxleCB3LWZ1bGwgaC1mdWxsIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciB7eyBoZWFkZXIuY2xhc3NJbmNsdWRlSW5kZXhPblJvdyB8fCAnJyB9fVwiPlxuICAgICAgICB7eyBoZWFkZXIubGFiZWwgPz8gJyMnIH19XG4gICAgICA8L2Rpdj5cbiAgICB9IEBlbHNlIHtcbiAgICAgIEBpZiAoKGhlYWRlci5sYWJlbCB8IExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGU6aGVhZGVyLnBhcnNlVmFsdWU6aGVhZGVyKSB8IGFzeW5jIHwgdHJhbnNsYXRlOyBhcyBsYWJlbEhlYWRlckNvbHVtbikge1xuICAgICAgICA8bGlic191aS1jb21wb25lbnRzLXBvcG92ZXIgW3R5cGVdPVwiaGVhZGVyPy5sYWJlbENvbmZpZz8udHlwZSB8fCAndGV4dCdcIlxuICAgICAgICAgIFttb2RlXT1cImhlYWRlcj8ubGFiZWxDb25maWc/Lm1vZGUgfHwgJ2hvdmVyJ1wiXG4gICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCIoaGVhZGVyPy5sYWJlbENvbmZpZz8uY2xhc3NJbmNsdWRlIHx8ICcnKVwiXG4gICAgICAgICAgW2lnbm9yZVNob3dQb3BvdmVyXT1cImhlYWRlcj8ubGFiZWxDb25maWc/Lmlnbm9yZVNob3dUb29sdGlwIHx8IGZhbHNlXCJcbiAgICAgICAgICBbY29uZmlnXT1cImhlYWRlci5sYWJlbENvbmZpZz8uY29uZmlnIHx8IHtjb250ZW50OmxhYmVsSGVhZGVyQ29sdW1ufVwiXG4gICAgICAgICAgW2lubmVySFRNTF09XCJsYWJlbEhlYWRlckNvbHVtblwiIC8+XG4gICAgICB9XG4gICAgfVxuXG4gICAgQGZvciAodG9vbHRpcCBvZiBoZWFkZXIudG9vbHRpcHNSaWdodDsgdHJhY2sgdG9vbHRpcCkge1xuICAgICAgPGRpdiBjbGFzcz1cIm1sLVs0cHhdXCI+XG4gICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtcG9wb3ZlciBbdHlwZV09XCJ0b29sdGlwPy50eXBlIHx8ICdvdGhlcidcIlxuICAgICAgICAgIFttb2RlXT1cInRvb2x0aXA/Lm1vZGUgfHwgJ2hvdmVyJ1wiXG4gICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCJ0b29sdGlwLmNsYXNzSW5jbHVkZSB8fCAndGV4dC1bIzZhNzM4M10nXCJcbiAgICAgICAgICBbaWdub3JlU2hvd1BvcG92ZXJdPVwidG9vbHRpcC5pZ25vcmVTaG93VG9vbHRpcCB8fCBmYWxzZVwiXG4gICAgICAgICAgW2NvbmZpZ109XCJ0b29sdGlwLmNvbmZpZyB8fCB7Y29udGVudDoodG9vbHRpcC5kYXRhVmlldyB8fCAnICcpIHwgdHJhbnNsYXRlLCBwb3NpdGlvbjoge1xuICAgICAgICAgICAgICBtb2RlOiAnY2VudGVyJyxcbiAgICAgICAgICAgICAgZGlzdGFuY2U6IDAsXG4gICAgICAgICAgICAgIGF1dG9VcGRhdGVQb3NpdGlvbjoge1xuICAgICAgICAgICAgICAgIGVuZERpc3RhbmNlOiAxMixcbiAgICAgICAgICAgICAgICBzdGFydERpc3RhbmNlOiAtMTJcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfX1cIlxuICAgICAgICAgIFtpbm5lckhUTUxdPVwidG9vbHRpcC5kYXRhVmlld1wiIC8+XG4gICAgICA8L2Rpdj5cbiAgICB9XG5cbiAgICBAaWYgKGhlYWRlci5oYXNTb3J0ICYmIGhlYWRlci5vcmRlcmJ5KSB7XG4gICAgICA8ZGl2IGNsYXNzPVwibWwtWzRweF1cIj5cbiAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLXNvcnQtYXJyb3cgW2Rpc2FibGVdPVwibG9hZGluZygpIHx8ICFpdGVtcygpLmxlbmd0aFwiXG4gICAgICAgICAgW2ZpZWxkU29ydF09XCJoZWFkZXIub3JkZXJieVwiXG4gICAgICAgICAgW2lnbm9yZVBvcG92ZXJDb250ZW50XT1cImhlYWRlci5zb3J0SWdub3JlVG9vbHRpcENvbnRlbnQgPz8gdHJ1ZVwiXG4gICAgICAgICAgW3BvcG92ZXJDb250ZW50QXNjXT1cImhlYWRlci5zb3J0VG9vbHRpcENvbnRlbnRBc2NcIlxuICAgICAgICAgIFtwb3BvdmVyQ29udGVudERlc2NdPVwiaGVhZGVyLnNvcnRUb29sdGlwQ29udGVudERlc2NcIlxuICAgICAgICAgIFtkZWZhdWx0TW9kZV09XCJoZWFkZXIuZGVmYXVsdE1vZGVcIlxuICAgICAgICAgIFt6SW5kZXhdPVwiaGVhZGVyLnpJbmRleFRvb2x0aXBTb3J0XCJcbiAgICAgICAgICAob3V0Q2hhbmdlKT1cImhhbmRsZXJDaGFuZ2VTb3J0KCRldmVudClcIiAvPlxuICAgICAgPC9kaXY+XG4gICAgfVxuICA8L2Rpdj5cbiAgQGlmIChoZWFkZXIubGFiZWxEZXNjcmlwdGlvbikge1xuICAgIDxkaXYgY2xhc3M9XCJmbGV4XCI+XG4gICAgICA8bGlic191aS1jb21wb25lbnRzLXBvcG92ZXIgW3R5cGVdPVwiJ3RleHQnXCJcbiAgICAgICAgW2NsYXNzSW5jbHVkZV09XCJoZWFkZXIubGFiZWxEZXNjcmlwdGlvbi5jbGFzc0luY2x1ZGUgfHwgJydcIlxuICAgICAgICBbY29uZmlnXT1cIntjb250ZW50OiBoZWFkZXIubGFiZWxEZXNjcmlwdGlvbi5jb250ZW50IHwgdHJhbnNsYXRlfVwiXG4gICAgICAgIFtpbm5lckhUTUxdPVwiaGVhZGVyLmxhYmVsRGVzY3JpcHRpb24uY29udGVudCB8IHRyYW5zbGF0ZVwiIC8+XG4gICAgPC9kaXY+XG4gIH1cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjdGVtcGxhdGVCb2R5UmVmXG4gIGxldC1oZWFkZXI9J2hlYWRlcidcbiAgbGV0LWRhdGE9J2RhdGEnPlxuICA8ZGl2IGNsYXNzPVwiZmxleCB3LWZ1bGwgaC1mdWxsXCI+XG4gICAgQGlmIChoZWFkZXIuaGFzQ2hlY2tib3gpIHtcbiAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGgtZnVsbFwiXG4gICAgICAgIFtjbGFzcy5pbnZpc2libGVdPVwiaGVhZGVyLmNoZWNrQ29uZGl0aW9uQ2hlY2tCb3hIaWRkZW4gJiYoIGRhdGEoKSB8IExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGU6aGVhZGVyLmNoZWNrQ29uZGl0aW9uQ2hlY2tCb3hIaWRkZW46ZGF0YSgpIHwgYXN5bmMpXCJcbiAgICAgICAgW2NsYXNzLml0ZW1zLWNlbnRlcl09XCJoZWFkZXIuY2hlY2tib3hBbGlnbkNlbnRlclwiPlxuICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWNoZWNrYm94LXNpbmdsZSBba2V5XT1cImRhdGEoKVtmaWVsZEtleSgpXVwiXG4gICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCJoZWFkZXIuY2hlY2tib3hDbGFzc0luY2x1ZGVcIlxuICAgICAgICAgIFtjaGVja2VkXT1cImRhdGEoKVtmaWVsZEtleSgpXSB8IExpYnNVaVBpcGVzQ2hlY2tTZWxlY3RlZEJ5S2V5UGlwZTprZXlzU2VsZWN0ZWQoKTprZXlzU2VsZWN0ZWQoKS5sZW5ndGhcIlxuICAgICAgICAgIFtkaXNhYmxlXT1cImxvYWRpbmcoKSB8fCBkaXNhYmxlQ2hlY2tib3goKSB8fCAhIShtYXhJdGVtU2VsZWN0ZWQoKSAmJiAhKGRhdGEoKVtmaWVsZEtleSgpXSB8IExpYnNVaVBpcGVzQ2hlY2tTZWxlY3RlZEJ5S2V5UGlwZTprZXlzU2VsZWN0ZWQoKTprZXlzU2VsZWN0ZWQoKS5sZW5ndGgpICYmIGtleXNTZWxlY3RlZCgpLmxlbmd0aCA+PSBtYXhJdGVtU2VsZWN0ZWQoKSlcIlxuICAgICAgICAgIChvdXRDaGFuZ2UpPVwiaGFuZGxlckNoYW5nZUl0ZW1DaGVja2VkKCRldmVudCxkYXRhKCkpXCIgLz5cbiAgICAgIDwvZGl2PlxuICAgIH1cblxuICAgIEBpZiAoaGVhZGVyLmlzU2hvd0luZGV4T25Sb3c7IGFzIGNvbmZpZykge1xuICAgICAgPGRpdiBjbGFzcz1cInctZnVsbCBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBsaWJzLXVpLWZvbnQtaDRye3sgY29uZmlnLmNsYXNzSW5jbHVkZUluZGV4T25Sb3cgfHwgJycgfX1cIj5cbiAgICAgICAgPGRpdiBMaWJzVWlDb21wb25lbnRzUG9wb3ZlckRpcmVjdGl2ZVxuICAgICAgICAgIFt0eXBlXT1cIid0ZXh0J1wiXG4gICAgICAgICAgW2NvbmZpZ109XCJ7fVwiXG4gICAgICAgICAgW2lubmVySFRNTF09XCJkYXRhIHwgTGlic1VpUGlwZXNDYWxsRnVuY3Rpb25JblRlbXBsYXRlUGlwZTpnZXRJbmRleFJvdyB8IGFzeW5jXCI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgfVxuXG4gICAgQGlmIChoZWFkZXIuY29sVGVtcGxhdGVDb25maWcpIHtcbiAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtdGFibGUtdGVtcGxhdGVzIFtpc0hvdmVyXT1cIml0ZW1PZkluZGV4SG92ZXIgPT09IGRhdGEgJiYgIWRhdGEuc3BlY2lmaWNIaWdodExpZ2h0XCJcbiAgICAgICAgW2NsYXNzXT1cImhlYWRlci50ZW1wbGF0ZUNzc1dyYXBwZXJIb3N0IHx8ICcnXCJcbiAgICAgICAgW2l0ZW1dPVwiZGF0YVwiXG4gICAgICAgIFt0ZW1wbGF0ZUNzc1dyYXBwZXJdPVwiaGVhZGVyLnRlbXBsYXRlQ3NzV3JhcHBlclwiXG4gICAgICAgIFtjb25maWdzXT1cImhlYWRlci5jb2xUZW1wbGF0ZUNvbmZpZ1wiIC8+XG4gICAgfVxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjdGVtcGxhdGVGb290ZXJSZWY+XG4gIEBpZiAoIWlzSGlkZGVuSGVhZGVyV2hlbk5vZGF0YSgpIHx8IChpc0hpZGRlbkhlYWRlcldoZW5Ob2RhdGEoKSAmJiBpdGVtcygpLmxlbmd0aCkpIHtcbiAgICA8ZGl2ICNmb290ZXJFbGVtZW50UmVmXG4gICAgICBjbGFzcz1cImZsZXggdy1mdWxsIGJnLVsjZjhmOWZhXSBvdmVyZmxvdy14LWhpZGRlbiB6LVsxXSB7eyBpZ25vcmVCb3JkZXJGb290ZXIoKSA/ICcnOiAoY3VzdG9tUG9zaXRpb25Gb290ZXIoKSA9PT0gJ3RvcCcgPyAnbGlicy11aS1ib3JkZXItYm90dG9tLWdlbmVyYWwnOidsaWJzLXVpLXRhYmxlLXNoYWRvdy10b3AgbGlicy11aS1ib3JkZXItdG9wLWdlbmVyYWwnKSB9fSBtaW4taC1bMzVweF1cIlxuICAgICAgKG1vdXNlZW50ZXIpPVwiaGFuZGxlck1vdXNlRW50ZXJGb290ZXIoJGV2ZW50KVwiXG4gICAgICAobW91c2VsZWF2ZSk9XCJoYW5kbGVyTW91c2VMZWF2ZUZvb3RlcigkZXZlbnQpXCI+XG4gICAgICBAaWYgKGZvb3RlckxlZnQoKSkge1xuICAgICAgICA8ZGl2ICNmb290ZXJMZWZ0RWxlbWVudFJlZlxuICAgICAgICAgIGNsYXNzPVwiZmxleCBzdGlja3kgdG9wLTAgbGVmdC0wIHotWzFdIGJnLVsjZjhmOWZhXVwiPlxuICAgICAgICAgIEBmb3IgKGZvb3RlciBvZiBmb290ZXJMZWZ0KCk7dHJhY2sgZm9vdGVyKSB7XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgcHgtWzEycHhdIHB5LVs4cHhdIHt7IGZvb3Rlci5pZ25vcmVCb3JkZXJSaWdodCA/ICcnOiAnbGlicy11aS1ib3JkZXItcmlnaHQtZ2VuZXJhbCcgfX1cIlxuICAgICAgICAgICAgICBbbmdTdHlsZV09XCIoZm9vdGVyfExpYnNVaVRhYmxlQ2FsY3VsYXRvckNvbHVtblBpcGU6aGVhZGVyRWxlbWVudFJlZi5jbGllbnRXaWR0aDpmb290ZXJMZWZ0KCk6Zm9vdGVyUmlnaHQoKSkgfHwge31cIlxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJmb290ZXIubmdDbGFzcyB8fCB7fVwiPlxuICAgICAgICAgICAgICBAaWYgKGZvb3Rlci5jb2xUZW1wbGF0ZUNvbmZpZyAmJiBpdGVtRm9vdGVyKCkpIHtcbiAgICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLXRhYmxlLXRlbXBsYXRlcyBbaXRlbV09XCJpdGVtRm9vdGVyfExpYnNVaVBpcGVzQ29udmVydE9iamVjdFRvU2lnbmFsUGlwZVwiXG4gICAgICAgICAgICAgICAgICBbdGVtcGxhdGVDc3NXcmFwcGVyXT1cImZvb3Rlci50ZW1wbGF0ZUNzc1dyYXBwZXJcIlxuICAgICAgICAgICAgICAgICAgW2NvbmZpZ3NdPVwiZm9vdGVyLmNvbFRlbXBsYXRlQ29uZmlnXCIgLz5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICAgIEBpZiAoZm9vdGVyUmlnaHQoKSkge1xuICAgICAgICBAZm9yIChmb290ZXIgb2YgZm9vdGVyUmlnaHQoKTt0cmFjayBmb290ZXIpIHtcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgcHgtWzEycHhdIHB5LVs4cHhdXCJcbiAgICAgICAgICAgIFtuZ1N0eWxlXT1cIihmb290ZXJ8TGlic1VpVGFibGVDYWxjdWxhdG9yQ29sdW1uUGlwZTpoZWFkZXJFbGVtZW50UmVmLmNsaWVudFdpZHRoOmZvb3RlckxlZnQoKTpmb290ZXJSaWdodCgpKSB8fCB7fVwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJmb290ZXIubmdDbGFzcyB8fCB7fVwiPlxuICAgICAgICAgICAgQGlmIChmb290ZXIuY29sVGVtcGxhdGVDb25maWcgJiYgaXRlbUZvb3RlcigpKSB7XG4gICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtdGFibGUtdGVtcGxhdGVzIFtpdGVtXT1cIml0ZW1Gb290ZXJ8TGlic1VpUGlwZXNDb252ZXJ0T2JqZWN0VG9TaWduYWxQaXBlXCJcbiAgICAgICAgICAgICAgICBbdGVtcGxhdGVDc3NXcmFwcGVyXT1cImZvb3Rlci50ZW1wbGF0ZUNzc1dyYXBwZXJcIlxuICAgICAgICAgICAgICAgIFtjb25maWdzXT1cImZvb3Rlci5jb2xUZW1wbGF0ZUNvbmZpZ1wiIC8+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgIDwvZGl2PlxuICB9XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3RlbXBsYXRlTm9kYXRhUmVmPlxuICBAaWYgKCFrZXlTZWFyY2goKSAmJiB0ZW1wbGF0ZU5vRGF0YSgpOyBhcyB0ZW1wbGF0ZU5vRGF0YSkge1xuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZW1wbGF0ZU5vRGF0YVwiIC8+XG4gIH0gQGlmIChrZXlTZWFyY2goKSAmJiB0ZW1wbGF0ZU5vUmVzdWx0KCk7IGFzIHRlbXBsYXRlTm9SZXN1bHQpIHtcbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGVtcGxhdGVOb1Jlc3VsdFwiIC8+XG4gIH1cbiAgQGlmICghdGVtcGxhdGVOb0RhdGEoKSAmJiAhdGVtcGxhdGVOb1Jlc3VsdCgpICYmIG5vRGF0YUNvbmZpZygpOyBhcyBjb25maWcpIHtcbiAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgdy1mdWxsIGgtZnVsbCBhYnNvbHV0ZSBsZWZ0LTAgdG9wLTAgei1bMV1cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciB3LWZ1bGwgaC1mdWxsIHNocmluay0wXCJcbiAgICAgICAgTGlic1VpQ29tcG9uZW50c1Njcm9sbE92ZXJsYXlEaXJlY3RpdmU+XG4gICAgICAgIEBpZiAoIWtleVNlYXJjaCgpICYmICFvbmx5U2hvd05vUmVzdWx0KCkpIHtcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0NvbXBvbmVudE91dGxldD1cIiAoJ25vLWRhdGEnIHwgTGlic1VpSWNvbnNHZXRJY29uQ29tcG9uZW50UGlwZSB8IGFzeW5jKTtpbnB1dHM6e3NpemU6NjR9XCIgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibGlicy11aS10YWJsZS1uby1kYXRhLWNvbmZpZy10ZXh0XCJcbiAgICAgICAgICAgIFtuZ1N0eWxlXT1cImNvbmZpZy5uZ1N0eWxlIHx8IHt9XCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cImNvbmZpZy5uZ0NsYXNzIHx8IHt9XCJcbiAgICAgICAgICAgIFtpbm5lckh0bWxdPVwiY29uZmlnLnRleHROb0RhdGEgfCB0cmFuc2xhdGVcIj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgICBAaWYgKGtleVNlYXJjaCgpIHx8IG9ubHlTaG93Tm9SZXN1bHQoKSkge1xuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nQ29tcG9uZW50T3V0bGV0PVwiKCduby1yZXN1bHQnIHwgTGlic1VpSWNvbnNHZXRJY29uQ29tcG9uZW50UGlwZSB8IGFzeW5jKTtpbnB1dHM6e3NpemU6NjR9XCIgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibGlicy11aS10YWJsZS1uby1kYXRhLWNvbmZpZy10ZXh0XCJcbiAgICAgICAgICAgIFtuZ1N0eWxlXT1cImNvbmZpZy5uZ1N0eWxlIHx8IHt9XCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cImNvbmZpZy5uZ0NsYXNzIHx8IHt9XCJcbiAgICAgICAgICAgIFtpbm5lckh0bWxdPVwiY29uZmlnLnRleHRTZWFyY2hOb0RhdGEgfCB0cmFuc2xhdGVcIj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIH1cbjwvbmctdGVtcGxhdGU+XG4iXX0=
672
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL3RhYmxlL3NyYy90YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvdGFibGUvc3JjL3RhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHVEQUF1RDtBQUN2RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNuRyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFjLE1BQU0sRUFBRSxLQUFLLEVBQXFCLE1BQU0sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBa0IsTUFBTSxlQUFlLENBQUM7QUFDNU0sT0FBTyxFQUE0QixxQkFBcUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ2pHLE9BQU8sRUFBVyxzQ0FBc0MsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3JHLE9BQU8sRUFBUyx5Q0FBeUMsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBRXBHLE9BQU8sRUFBa0IsdUNBQXVDLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUM5RyxPQUFPLEVBQWlELGlDQUFpQyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDaEksT0FBTyxFQUFFLGdDQUFnQyxFQUFzQixNQUFNLDZCQUE2QixDQUFDO0FBQ25HLE9BQU8sRUFBRSxzQ0FBc0MsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQzVGLE9BQU8sRUFBRSxnQ0FBZ0MsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQy9FLE9BQU8sRUFBRSwrQkFBK0Is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bnQiOlsiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuaW1wb3J0IHsgQXN5bmNQaXBlLCBOZ0NsYXNzLCBOZ0NvbXBvbmVudE91dGxldCwgTmdTdHlsZSwgTmdUZW1wbGF0ZU91dGxldCB9IGZyb20gXCJAYW5ndWxhci9jb21tb25cIjtcbmltcG9ydCB7IEh0dHBQYXJhbXMgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uL2h0dHBcIjtcbmltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBjb21wdXRlZCwgZWZmZWN0LCBFbGVtZW50UmVmLCBpbmplY3QsIGlucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgb3V0cHV0LCBzaWduYWwsIHVudHJhY2tlZCwgdmlld0NoaWxkLCBXcml0YWJsZVNpZ25hbCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBWaXJ0dWFsU2Nyb2xsZXJDb21wb25lbnQsIFZpcnR1YWxTY3JvbGxlck1vZHVsZSB9IGZyb20gJ0BpaGFyYmVjay9uZ3gtdmlydHVhbC1zY3JvbGxlcic7XG5pbXBvcnQgeyBJQnV0dG9uLCBMaWJzVWlDb21wb25lbnRzQnV0dG9uc0J1dHRvbkNvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtYnV0dG9ucy1idXR0b24nO1xuaW1wb3J0IHsgSVNvcnQsIExpYnNVaUNvbXBvbmVudHNCdXR0b25zU29ydEFycm93Q29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1idXR0b25zLXNvcnQnO1xuaW1wb3J0IHsgSUNoZWNrYm94SXRlbSB9IGZyb20gXCJAbGlicy11aS9jb21wb25lbnRzLWNoZWNrYm94LWdyb3VwXCI7XG5pbXBvcnQgeyBJQ2hlY2tib3hFdmVudCwgTGlic1VpQ29tcG9uZW50c0NoZWNrYm94U2luZ2xlQ29tcG9uZW50IH0gZnJvbSBcIkBsaWJzLXVpL2NvbXBvbmVudHMtY2hlY2tib3gtc2luZ2xlXCI7XG5pbXBvcnQgeyBJRHJvcGRvd25GdW5jdGlvbkNvbnRyb2xFdmVudCwgSUVtaXRTZWxlY3RLZXksIExpYnNVaUNvbXBvbmVudHNEcm9wZG93bkNvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtZHJvcGRvd24nO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c1BvcG92ZXJDb21wb25lbnQsIFRZUEVfUE9QT1ZFUl9FVkVOVCB9IGZyb20gXCJAbGlicy11aS9jb21wb25lbnRzLXBvcG92ZXJcIjtcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNTY3JvbGxPdmVybGF5RGlyZWN0aXZlIH0gZnJvbSBcIkBsaWJzLXVpL2NvbXBvbmVudHMtc2Nyb2xsLW92ZXJsYXlcIjtcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNTcGlubmVyQ29tcG9uZW50IH0gZnJvbSBcIkBsaWJzLXVpL2NvbXBvbmVudHMtc3Bpbm5lclwiO1xuaW1wb3J0IHsgTGlic1VpSWNvbnNHZXRJY29uQ29tcG9uZW50UGlwZSB9IGZyb20gXCJAbGlicy11aS9pY29uc1wiO1xuaW1wb3J0IHsgSUh0dHBSZXNwb25zZUVycm9yLCBJUGFnaW5nLCBUWVBFX09CSkVDVCwgVFlQRV9URU1QTEFURV9SRUYgfSBmcm9tIFwiQGxpYnMtdWkvaW50ZXJmYWNlcy10eXBlc1wiO1xuaW1wb3J0IHsgTGlic1VpUGlwZXNDYWxsRnVuY3Rpb25JblRlbXBsYXRlUGlwZSB9IGZyb20gXCJAbGlicy11aS9waXBlcy1jYWxsLWZ1bmN0aW9uLWluLXRlbXBsYXRlXCI7XG5pbXBvcnQgeyBMaWJzVWlQaXBlc0NoZWNrU2VsZWN0ZWRCeUtleVBpcGUgfSBmcm9tICdAbGlicy11aS9waXBlcy1jaGVjay1zZWxlY3RlZC1ieS1rZXknO1xuaW1wb3J0IHsgSUh0dHBSZXF1ZXN0Q29uZmlnLCBMaWJzVWlIdHRwUmVxdWVzdFNlcnZpY2UsIHJldHVybkxpc3RPYmplY3QgfSBmcm9tIFwiQGxpYnMtdWkvc2VydmljZXMtaHR0cC1yZXF1ZXN0XCI7XG5pbXBvcnQgeyBjbG9uZURlZXAsIGNvbnZlcnRPYmplY3RUb1NpZ25hbCwgZGVsZXRlVW5pY29kZSwgZ2V0LCBzZXQsIHZpZXdEYXRhTnVtYmVyQnlMYW5ndWFnZSB9IGZyb20gXCJAbGlicy11aS91dGlsc1wiO1xuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlIH0gZnJvbSBcIkBuZ3gtdHJhbnNsYXRlL2NvcmVcIjtcbmltcG9ydCB7IGZyb21FdmVudCwgbGFzdFZhbHVlRnJvbSwgb2YsIFN1YmplY3QsIHRha2VVbnRpbCwgdGltZXIgfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHsgSUJ1dHRvbkJhckV2ZW50LCBJQ29uZmlnU2VsZWN0TW9yZUl0ZW0sIElDb25maWdUZW1wbGF0ZUl0ZW1Db2xsYXBzZUV4cGFuZCwgSUhvdmVyQnV0dG9uQWN0aW9uRXZlbnQsIElMb2FkTW9yZUV2ZW50LCBJU29ydEV2ZW50LCBJVGFiZWxCdXR0b25BY3Rpb25FdmVudCwgSVRhYmxlRm9vdGVyQ29uZmlnLCBJVGFibGVIZWFkZXJDb25maWcsIFRZUEVfREFUQV9GSUxURVJfVEFCTEUsIFRZUEVfREFUQV9UQUJMRSwgVFlQRV9JVEVNX0RBVEFfVEFCTEUsIFRZUEVfTkVXX0RBVEFfVEFCTEUsIFRZUEVfVEFCTEVfRklMVEVSIH0gZnJvbSBcIi4vaW50ZXJmYWNlc1wiO1xuaW1wb3J0IHsgSVRhYmxlRnVuY3Rpb25Db250cm9sRXZlbnQgfSBmcm9tIFwiLi9pbnRlcmZhY2VzL2Z1bmN0aW9uLWNvbnRyb2wtZXZlbnQuaW50ZXJmYWNlXCI7XG5pbXBvcnQgeyBJVGFibGVOb0RhdGFDb25maWcgfSBmcm9tIFwiLi9pbnRlcmZhY2VzL25vLWRhdGEtY29uZmlnLmludGVyZmFjZVwiO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c1RhYmxlVGVtcGxhdGVzQ29tcG9uZW50IH0gZnJvbSBcIi4vdGVtcGxhdGVzL3RlbXBsYXRlcy5jb21wb25lbnRcIjtcbmltcG9ydCB7IElMaXN0Q29uZmlnSXRlbSB9IGZyb20gXCJAbGlicy11aS9jb21wb25lbnRzLWxpc3RcIjtcbmltcG9ydCB7IExpYnNVaVRhYmxlQ2FsY3VsYXRvckNvbHVtblBpcGUgfSBmcm9tIFwiLi9waXBlcy9jYWxjdWxhdG9yLWNvbHVtbi5waXBlXCI7XG5pbXBvcnQgeyBMaWJzVWlQaXBlc0NvbnZlcnRPYmplY3RUb1NpZ25hbFBpcGUgfSBmcm9tIFwiQGxpYnMtdWkvcGlwZXMtY29udmVydC1vYmplY3QtdG8tc2lnbmFsXCI7XG5cbkBDb21wb25lbnQoe1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L2NvbXBvbmVudC1zZWxlY3RvclxuICBzZWxlY3RvcjogJ2xpYnNfdWktY29tcG9uZW50cy10YWJsZScsXG4gIHRlbXBsYXRlVXJsOiAnLi90YWJsZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3RhYmxlLmNvbXBvbmVudC5zY3NzJ10sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBpbXBvcnRzOiBbXG4gICAgTmdDbGFzcywgTmdTdHlsZSwgQXN5bmNQaXBlLCBOZ1RlbXBsYXRlT3V0bGV0LCBOZ0NvbXBvbmVudE91dGxldCwgTGlic1VpQ29tcG9uZW50c1RhYmxlVGVtcGxhdGVzQ29tcG9uZW50LFxuICAgIFRyYW5zbGF0ZU1vZHVsZSwgVmlydHVhbFNjcm9sbGVyTW9kdWxlLCBMaWJzVWlDb21wb25lbnRzQnV0dG9uc0J1dHRvbkNvbXBvbmVudCwgTGlic1VpUGlwZXNDb252ZXJ0T2JqZWN0VG9TaWduYWxQaXBlLFxuICAgIExpYnNVaUNvbXBvbmVudHNEcm9wZG93bkNvbXBvbmVudCwgTGlic1VpQ29tcG9uZW50c0J1dHRvbnNTb3J0QXJyb3dDb21wb25lbnQsXG4gICAgTGlic1VpQ29tcG9uZW50c0NoZWNrYm94U2luZ2xlQ29tcG9uZW50LCBMaWJzVWlUYWJsZUNhbGN1bGF0b3JDb2x1bW5QaXBlLFxuICAgIExpYnNVaUNvbXBvbmVudHNTcGlubmVyQ29tcG9uZW50LCBMaWJzVWlDb21wb25lbnRzUG9wb3ZlckNvbXBvbmVudCxcbiAgICBMaWJzVWlDb21wb25lbnRzU2Nyb2xsT3ZlcmxheURpcmVjdGl2ZSwgTGlic1VpSWNvbnNHZXRJY29uQ29tcG9uZW50UGlwZSxcbiAgICBMaWJzVWlQaXBlc0NhbGxGdW5jdGlvbkluVGVtcGxhdGVQaXBlLCBMaWJzVWlQaXBlc0NoZWNrU2VsZWN0ZWRCeUtleVBpcGVcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBMaWJzVWlDb21wb25lbnRzVGFibGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIC8qKiBQUk9QRVJUWSAqL1xuICBwcm90ZWN0ZWQgY2xhc3NIZWFkZXJDb250YWluZXIgPSBjb21wdXRlZCgoKSA9PiBgbGlicy11aS10YWJsZS1oZWFkZXItY29udGFpbmVyIHctZnVsbCBhYnNvbHV0ZSBmbGV4IHNocmluay0wICR7dGhpcy5pZ25vcmVDbGFzc0JnSGVhZGVyKCkgPyAnJyA6ICdiZy13aGl0ZSd9IG92ZXJmbG93LXgtaGlkZGVuIHotWzFdIGl0ZW1zLWNlbnRlciAke3RoaXMuY2xhc3NIZWFkZXJDb250YWluZXJJbmNsdWRlKCkgfHwgJyd9YClcbiAgcHJvdGVjdGVkIGNsYXNzSGVhZGVyTGVmdENvbnRhaW5lciA9IGNvbXB1dGVkKCgpID0+IGBoLWZ1bGwgZmxleCBzdGlja3kgdG9wLTAgbGVmdC0wIHotWzFdICR7dGhpcy5pZ25vcmVDbGFzc0JnSGVhZGVyKCkgPyAnJyA6ICdiZy13aGl0ZSd9ICR7dGhpcy5jbGFzc0hlYWRlckxlZnRJbmNsdWRlKCkgfHwgJyd9YClcblxuICBwcm90ZWN0ZWQga2V5c1NlbGVjdGVkID0gc2lnbmFsPEFycmF5PGFueT4+KFtdKTtcbiAgcHJvdGVjdGVkIGxvYWRpbmcgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuICBwcm90ZWN0ZWQgc3RvcmVzID0gc2lnbmFsPEFycmF5PFdyaXRhYmxlU2lnbmFsPFRZUEVfT0JKRUNUPj4+KFtdKTtcbiAgcHJvdGVjdGVkIGl0ZW1zID0gc2lnbmFsPEFycmF5PFdyaXRhYmxlU2lnbmFsPFRZUEVfT0JKRUNUPj4+KFtdKTtcbiAgcHJvdGVjdGVkIGl0ZW1Gb290ZXIgPSBzaWduYWw8VFlQRV9PQkpFQ1QgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIHByb3RlY3RlZCBpdGVtT2ZJbmRleEhvdmVyPzogVFlQRV9JVEVNX0RBVEFfVEFCTEU7XG4gIHByb3RlY3RlZCBrZXlTZWFyY2ggPSBzaWduYWw8c3RyaW5nPignJyk7XG4gIHByb3RlY3RlZCB0b3RhbEl0ZW1JbkJhY2tlbmQgPSBzaWduYWw8bnVtYmVyPigwKTtcbiAgcHJvdGVjdGVkIGhhc0l0ZW1IaWdodExpZ2h0ID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJvdGVjdGVkIHRvdGFsSXRlbURpc3BsYXkgPSBjb21wdXRlZCgoKSA9PiB2aWV3RGF0YU51bWJlckJ5TGFuZ3VhZ2UoKHRoaXMudG90YWxJdGVtKCkgPz8gdGhpcy50b3RhbEl0ZW1JbkJhY2tlbmQoKSksIGZhbHNlKSk7XG4gIHByb3RlY3RlZCBsaXN0Q29uZmlnTW9yZUl0ZW0gPSBjb21wdXRlZDxJTGlzdENvbmZpZ0l0ZW0+KCgpID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgY29uZmlnVGVtcGxhdGVUZXh0OiBzaWduYWwoe1xuICAgICAgICBmaWVsZEtleTogJ2tleScsXG4gICAgICAgIGlnbm9yZUljb25TZWxlY3RlZDogdHJ1ZSxcbiAgICAgICAgZ2V0VmFsdWU6IHRoaXMuY29uZmlnU2VsZWN0TW9yZUl0ZW0oKT8uZ2V0VmFsdWUsXG4gICAgICAgIGNvbmZpZ0xhYmVsUG9wb3Zlcjogc2lnbmFsKHtcbiAgICAgICAgICB6SW5kZXg6IDEyMDBcbiAgICAgICAgfSlcbiAgICAgIH0pLFxuICAgICAgaHR0cFJlcXVlc3REYXRhOiBzaWduYWwoe1xuICAgICAgICBzZXJ2aWNlT3RoZXI6IHJldHVybkxpc3RPYmplY3QodGhpcy5jb25maWdTZWxlY3RNb3JlSXRlbSgpPy5saXN0T3B0aW9uKSxcbiAgICAgICAgZnVuY3Rpb25OYW1lOiAnbGlzdCcsXG4gICAgICAgIGFyZ3VtZW50c1ZhbHVlOiBbXVxuICAgICAgfSlcbiAgICB9XG4gIH0pXG5cbiAgcHJpdmF0ZSBoYXNTY3JvbGwgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuICBwcml2YXRlIGluc3RhbmNlU29ydCA9IHNpZ25hbDxJU29ydCB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgcHJpdmF0ZSBoYXNBY3Rpb25CdXR0b25Ecm9wZG93bkNvbnRlbnQgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuICBwcml2YXRlIHBhZ2luZ1N0b3JlID0gc2lnbmFsPElQYWdpbmc+KHt9KTtcbiAgcHJpdmF0ZSBsb2FkZWRMYXN0SXRlbSA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIHByaXZhdGUgc3RvcmVQYXJhbXNDYWxsQXBpID0gc2lnbmFsPFRZUEVfT0JKRUNUPih7fSk7XG4gIHByaXZhdGUgdGltZW91dExlYXZlSXRlbSA9IHNpZ25hbDxudW1iZXIgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIHByaXZhdGUgZnVuY3Rpb25Db250cm9sU2VsZWN0TW9yZUl0ZW0/OiBJRHJvcGRvd25GdW5jdGlvbkNvbnRyb2xFdmVudDtcbiAgcHJpdmF0ZSBtb3VzZUVudGVySGVhZGVyID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJpdmF0ZSBvbkRlc3Ryb3kgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIC8qKiBJTlBVVCAqL1xuICByZWFkb25seSB0aW1lSGlnaGxpZ2hOZXdJdGVtID0gaW5wdXQ8bnVtYmVyLCBudW1iZXIgfCB1bmRlZmluZWQ+KDIwMDAsIHsgdHJhbnNmb3JtOiB2YWwgPT4gdmFsID8/IDIwMDAgfSk7XG4gIHJlYWRvbmx5IGhlYWRlckxlZnQgPSBpbnB1dDxBcnJheTxJVGFibGVIZWFkZXJDb25maWc+LCBBcnJheTxJVGFibGVIZWFkZXJDb25maWc+IHwgdW5kZWZpbmVkPihbXSwgeyB0cmFuc2Zvcm06IHZhbCA9PiB2YWwgPz8gW10gfSk7XG4gIHJlYWRvbmx5IGhlYWRlclJpZ2h0ID0gaW5wdXQ8QXJyYXk8SVRhYmxlSGVhZGVyQ29uZmlnPiwgQXJyYXk8SVRhYmxlSGVhZGVyQ29uZmlnPiB8IHVuZGVmaW5lZD4oW10sIHsgdHJhbnNmb3JtOiB2YWwgPT4gdmFsID8/IFtdIH0pO1xuICByZWFkb25seSBjb25maWdUZW1wbGF0ZUl0ZW1Db2xsYXBzZUV4cGFuZCA9IGlucHV0PElDb25maWdUZW1wbGF0ZUl0ZW1Db2xsYXBzZUV4cGFuZD4oKTtcbiAgcmVhZG9ubHkgc2hvd0Zvb3RlciA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGlnbm9yZUJvcmRlckZvb3RlciA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGN1c3RvbVBvc2l0aW9uRm9vdGVyID0gaW5wdXQ8J3RvcCcgfCAnYm90dG9tJywgJ3RvcCcgfCAnYm90dG9tJyB8IHVuZGVmaW5lZD4oJ2JvdHRvbScsIHsgdHJhbnNmb3JtOiB2YWwgPT4gdmFsID8/ICdib3R0b20nIH0pO1xuICByZWFkb25seSBmb290ZXJMZWZ0ID0gaW5wdXQ8QXJyYXk8SVRhYmxlRm9vdGVyQ29uZmlnPiB8IHVuZGVmaW5lZD4oKTtcbiAgcmVhZG9ubHkgZm9vdGVyUmlnaHQgPSBpbnB1dDxBcnJheTxJVGFibGVGb290ZXJDb25maWc+IHwgdW5kZWZpbmVkPigpO1xuICByZWFkb25seSBkaXNhYmxlQ2hlY2tib3ggPSBpbnB1dDxib29sZWFuLCBib29sZWFuIHwgdW5kZWZpbmVkPihmYWxzZSwgeyB0cmFuc2Zvcm06IHZhbCA9PiB2YWwgPz8gZmFsc2UgfSk7XG4gIHJlYWRvbmx5IGVuYWJsZVVuZXF1YWxDaGlsZHJlblNpemVzID0gaW5wdXQ8Ym9vbGVhbiwgYm9vbGVhbiB8IHVuZGVmaW5lZD4oZmFsc2UsIHsgdHJhbnNmb3JtOiB2YWwgPT4gdmFsID8/IGZhbHNlIH0pO1xuICByZWFkb25seSBidWZmZXJBbW91bnQgPSBpbnB1dDxudW1iZXIsIG51bWJlciB8IHVuZGVmaW5lZD4oNSwgeyB0cmFuc2Zvcm06IHZhbCA9PiB2YWwgPyAodmFsID4gMjUgPyAyNSA6IHZhbCkgOiA1IH0pXG4gIHJlYWRvbmx5IHRvdGFsSXRlbSA9IGlucHV0PG51bWJlcj4oKTtcbiAgcmVhZG9ubHkgaXNEYXNoQm9yZGVyID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgY2xhc3NIZWFkZXJDb250YWluZXJJbmNsdWRlID0gaW5wdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSBjbGFzc0hlYWRlckxlZnRJbmNsdWRlID0gaW5wdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSBjbGFzc0JvZHlJbmNsdWRlID0gaW5wdXQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KCcnLCB7IHRyYW5zZm9ybTogdmFsID0+IHZhbCA/PyAnJyB9KTtcbiAgcmVhZG9ubHkgY2xhc3NGb290ZXJJbmNsdWRlID0gaW5wdXQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KCcnLCB7IHRyYW5zZm9ybTogdmFsID0+IHZhbCA/PyAnJyB9KTtcbiAgcmVhZG9ubHkgY2xhc3NUYWJsZUNvbnRhaW5lckluY2x1ZGUgPSBpbnB1dDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4oJycsIHsgdHJhbnNmb3JtOiB2YWwgPT4gdmFsID8/ICcnIH0pO1xuICByZWFkb25seSBjbGFzc0JhckluY2x1ZGUgPSBpbnB1dDxzdHJpbmc+KCdqdXN0aWZ5LWJldHdlZW4gbWItWzE2cHhdJyk7XG5cbiAgcmVhZG9ubHkgZmllbGRLZXkgPSBpbnB1dDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4oJ2lkJywgeyB0cmFuc2Zvcm06IHZhbCA9PiB2YWwgfHwgJ2lkJyB9KTsgLy8gdMOqbiBmaWVsZCDEkeG7i25oIGRhbmggaXRlbSBj4bunYSBsaXN0RGF0YXNcbiAgcmVhZG9ubHkgZGVmYXVsdEtleXNTZWxlY3RlZCA9IGlucHV0PEFycmF5PGFueT4+KCk7XG4gIHJlYWRvbmx5IGxhYmVsQmFyTm9TZWxlY3RJdGVtID0gaW5wdXQ8c3RyaW5nPihgaTE4bl90b3RhbF9xdWFudGl0eWApOyAvLyBz4butIGThu6VuZyDEkeG7gyBoacOqbiB0aOG7iyBraGkgdMOtY2ggY2jhu41uIGl0ZW1cbiAgcmVhZG9ubHkgbGFiZWxCYXJCdXR0b25zID0gaW5wdXQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KCdpMThuX251bWJlcl9pdGVtX3NlbGVjdGVkJywgeyB0cmFuc2Zvcm06IHZhbCA9PiB2YWwgfHwgJ2kxOG5fbnVtYmVyX2l0ZW1fc2VsZWN0ZWQnIH0pOyAvLyBz4butIGThu6VuZyDEkeG7gyBoacOqbiB0aOG7iyBraGkgdMOtY2ggY2jhu41uIGl0ZW1cbiAgcmVhZG9ubHkgY2xhc3NMYWJlbEJhckJ1dHRvbnMgPSBpbnB1dDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4oJycsIHsgdHJhbnNmb3JtOiB2YWwgPT4gdmFsID8/ICcnIH0pOyAvLyBz4butIGThu6VuZyDEkeG7gyBoacOqbiB0aOG7iyBraGkgdMOtY2ggY2jhu41uIGl0ZW1cbiAgcmVhZG9ubHkgYmFyQnV0dG9ucyA9IGlucHV0PEFycmF5PElCdXR0b24+PigpO1xuICByZWFkb25seSBzb3J0TG9jYWwgPSBpbnB1dDxib29sZWFuPigpOyAvLyB0csaw4budbmcgaOG7o3AgbuG6v3Ugc29ydExvY2FsIG7DoHkga2jDtG5nIMSRw6FwIOG7qW5nIMSRxrDhu6NjIG5naGnhu4dwIHbhu6UgdGjDrCBt4bubaSBjw6JuIG5o4bqvYyBz4butIGThu6VuZyBmaWx0ZXJMb2NhbFxuICByZWFkb25seSBmaWx0ZXJPclNvcnRMb2NhbCA9IGlucHV0PFRZUEVfVEFCTEVfRklMVEVSPigpO1xuICByZWFkb25seSBodHRwUmVxdWVzdERhdGEgPSBpbnB1dDxJSHR0cFJlcXVlc3RDb25maWc+KCk7XG4gIHJlYWRvbmx5IGh0dHBSZXF1ZXN0RGF0YUZvb3RlciA9IGlucHV0PElIdHRwUmVxdWVzdENvbmZpZz4oKTtcbiAgcmVhZG9ubHkgbmV3RGF0YSA9IGlucHV0PFRZUEVfTkVXX0RBVEFfVEFCTEU+KCk7XG4gIHJlYWRvbmx5IGZpbHRlciA9IGlucHV0PFRZUEVfREFUQV9GSUxURVJfVEFCTEUsIFRZUEVfREFUQV9GSUxURVJfVEFCTEUgfCB1bmRlZmluZWQ+KHsgZmlsdGVyRGF0YToge30gfSwgeyB0cmFuc2Zvcm06IHZhbCA9PiB2YWwgPz8geyBmaWx0ZXJEYXRhOiB7fSB9IH0pO1xuICByZWFkb25seSBpZ25vcmVCYXIgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBjbGFzc0xhYmVsQmFyTm9TZWxlY3RJdGVtID0gaW5wdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSBpZ25vcmVDbGFzc0JnSGVhZGVyID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgbm9EYXRhQ29uZmlnID0gaW5wdXQ8SVRhYmxlTm9EYXRhQ29uZmlnPih7IHRleHROb0RhdGE6ICdpMThuX25vX2RhdGFfeWV0JywgdGV4dFNlYXJjaE5vRGF0YTogJ2kxOG5fbm9fcmVzdWx0JyB9KTtcbiAgcmVhZG9ubHkgc2hvd1Njcm9sbFRhYmxlUGlubmVkSWZOb0RhdGEgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBpZ25vcmVCb3JkZXJJdGVtTGFzdCA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGlzSGlkZGVuSGVhZGVyV2hlbk5vZGF0YSA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IG1heEl0ZW1TZWxlY3RlZCA9IGlucHV0PG51bWJlciwgbnVtYmVyIHwgdW5kZWZpbmVkPigxMDAsIHsgdHJhbnNmb3JtOiB2YWwgPT4gdmFsID8/IDEwMCB9KTtcbiAgcmVhZG9ubHkgY29uZmlnU2VsZWN0TW9yZUl0ZW0gPSBpbnB1dDxJQ29uZmlnU2VsZWN0TW9yZUl0ZW0+KCk7XG4gIHJlYWRvbmx5IG9ubHlTaG93Tm9SZXN1bHQgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBpZ25vcmVCb3JkZXJJdGVtID0gaW5wdXQ8Ym9vbGVhbj4oKTtcblxuICByZWFkb25seSB0ZW1wbGF0ZU5vRGF0YSA9IGlucHV0PFRZUEVfVEVNUExBVEVfUkVGPigpO1xuICByZWFkb25seSB0ZW1wbGF0ZU5vUmVzdWx0ID0gaW5wdXQ8VFlQRV9URU1QTEFURV9SRUY+KCk7XG5cbiAgLyoqIE9VVFBVVCAqL1xuXG4gIHJlYWRvbmx5IG91dExvYWRNb3JlID0gb3V0cHV0PElMb2FkTW9yZUV2ZW50PigpO1xuICByZWFkb25seSBvdXRTY3JvbGxJc0dvbmUgPSBvdXRwdXQ8SUxvYWRNb3JlRXZlbnQ+KCk7XG4gIHJlYWRvbmx5IG91dExvYWRpbmcgPSBvdXRwdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgb3V0Q2xpY2tCdXR0b25BY3Rpb24gPSBvdXRwdXQ8SVRhYmVsQnV0dG9uQWN0aW9uRXZlbnQ+KCk7XG4gIHJlYWRvbmx5IG91dFNvcnQgPSBvdXRwdXQ8SVNvcnRFdmVudD4oKTtcbiAgcmVhZG9ubHkgb3V0Q2xpY2tCYXJCdXR0b24gPSBvdXRwdXQ8SUJ1dHRvbkJhckV2ZW50PigpO1xuICByZWFkb25seSBvdXRIb3ZlckJ1dHRvbkFjdGlvbiA9IG91dHB1dDxJSG92ZXJCdXR0b25BY3Rpb25FdmVudD4oKTtcbiAgcmVhZG9ubHkgb3V0S2V5c1NlbGVjdGVkID0gb3V0cHV0PHsga2V5czogQXJyYXk8YW55PiB9PigpO1xuICByZWFkb25seSBvdXRGdW5jdGlvbnNDb250cm9sID0gb3V0cHV0PElUYWJsZUZ1bmN0aW9uQ29udHJvbEV2ZW50PigpO1xuICByZWFkb25seSBvdXRMb2FkRGF0YUNvbXBsZXRlID0gb3V0cHV0PFdyaXRhYmxlU2lnbmFsPEFycmF5PFdyaXRhYmxlU2lnbmFsPGFueT4+Pj4oKTtcbiAgcmVhZG9ubHkgb3V0VG90YWxJdGVtID0gb3V0cHV0PG51bWJlcj4oKTtcbiAgcmVhZG9ubHkgb3V0TG9hZERhdGFFcnJvciA9IG91dHB1dDxJSHR0cFJlc3BvbnNlRXJyb3I+KCk7XG5cbiAgLyoqVklFVyBDSElMRCAqL1xuICBwcm90ZWN0ZWQgaGVhZGVyRWxlbWVudFJlZiA9IHZpZXdDaGlsZDxFbGVtZW50UmVmPignaGVhZGVyRWxlbWVudFJlZicpO1xuICBwcm90ZWN0ZWQgZm9vdGVyRWxlbWVudFJlZiA9IHZpZXdDaGlsZDxFbGVtZW50UmVmPignZm9vdGVyRWxlbWVudFJlZicpO1xuICBwcm90ZWN0ZWQgZm9vdGVyTGVmdEVsZW1lbnRSZWYgPSB2aWV3Q2hpbGQ8RWxlbWVudFJlZj4oJ2Zvb3RlckxlZnRFbGVtZW50UmVmJyk7XG4gIHByaXZhdGUgYm9keUVsZW1lbnRSZWYgPSB2aWV3Q2hpbGQ8RWxlbWVudFJlZj4oJ2JvZHlFbGVtZW50UmVmJyk7XG4gIHByaXZhdGUgYm9keUNvbXBvbmVudFJlZiA9IHZpZXdDaGlsZDxWaXJ0dWFsU2Nyb2xsZXJDb21wb25lbnQ+KCdib2R5Q29tcG9uZW50UmVmJyk7O1xuXG4gIC8qKklOSkVDVCAqL1xuICBwcml2YXRlIGh0dHBSZXF1ZXN0U2VydmljZSA9IGluamVjdChMaWJzVWlIdHRwUmVxdWVzdFNlcnZpY2UpO1xuICBwcml2YXRlIGNkciA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLmRlZmF1bHRLZXlzU2VsZWN0ZWQoKT8ubGVuZ3RoKSB7XG4gICAgICAgIHVudHJhY2tlZCgoKSA9PiB0aGlzLmtleXNTZWxlY3RlZC51cGRhdGUoa2V5cyA9PiAoWy4uLmtleXMsIC4uLih0aGlzLmRlZmF1bHRLZXlzU2VsZWN0ZWQoKSB8fCBbXSldKSkpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5zaG93Rm9vdGVyKCkpIHtcbiAgICAgICAgdW50cmFja2VkKCgpID0+IHRoaXMuY2FsbEFwaUJ5U2VydmljZUZvb3RlcigpKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5uZXdEYXRhKCk/LmRhdGEoKS5sZW5ndGgpIHtcbiAgICAgICAgdW50cmFja2VkKCgpID0+IHRoaXMuYWRkSXRlbXModGhpcy5uZXdEYXRhKCk/LmRhdGEgYXMgYW55LCAhdGhpcy5uZXdEYXRhKCk/LmFkZFRvTGFzdExpc3QpKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuZmlsdGVyKCkuZmlsdGVyRGF0YSB8fCB0aGlzLmZpbHRlcigpLmlnbm9yZUNhbGxBcGlBdXRvKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHVudHJhY2tlZCgoKSA9PiB7XG4gICAgICAgIHRoaXMua2V5U2VhcmNoLnNldChnZXQ8YW55Pih0aGlzLmZpbHRlcigpLmZpbHRlckRhdGEsICdrZXlTZWFyY2gnLCAnJykpO1xuICAgICAgICB0aGlzLnN0b3JlUGFyYW1zQ2FsbEFwaS5zZXQoY2xvbmVEZWVwKHRoaXMuZmlsdGVyKCkuZmlsdGVyRGF0YSkpO1xuICAgICAgICBpZiAodGhpcy5maWx0ZXIoKT8uZmlsdGVyRGF0YSAmJiAhdGhpcy5maWx0ZXIoKS5maWx0ZXJEYXRhWydpbnN0YW5jZVNvcnQnXSAmJiB0aGlzLmluc3RhbmNlU29ydCgpKSB7XG4gICAgICAgICAgdGhpcy5zdG9yZVBhcmFtc0NhbGxBcGkudXBkYXRlKGRhdGEgPT4gKHsgLi4uZGF0YSwgaW5zdGFuY2VTb3J0OiB0aGlzLmluc3RhbmNlU29ydCgpIH0pKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5maWx0ZXJPclNvcnRMb2NhbCgpICYmIHRoaXMuc3RvcmVzKCkubGVuZ3RoKSB7XG4gICAgICAgICAgdGhpcy5pdGVtcy5zZXQodGhpcy5maWx0ZXJPclNvcnRMb2NhbCgpPy4oc2lnbmFsKFsuLi50aGlzLnN0b3JlcygpXSksIHsgLi4uKHRoaXMuZmlsdGVyKCkuZmlsdGVyRGF0YSB8fCB7fSksIGluc3RhbmNlU29ydDogdGhpcy5pbnN0YW5jZVNvcnQoKSB9KSB8fCBbXSk7XG5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNhbGxBcGlCeVNlcnZpY2UodHJ1ZSk7XG4gICAgICB9KTtcblxuICAgIH0pO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5vdXRGdW5jdGlvbnNDb250cm9sLmVtaXQoe1xuICAgICAgcmVzZXQ6IHRoaXMucmVzZXQuYmluZCh0aGlzKSxcbiAgICAgIGNhbGxBcGlCeVNlcnZpY2U6IHRoaXMuY2FsbEFwaUJ5U2VydmljZS5iaW5kKHRoaXMpLFxuICAgICAgcmVzZXRTY3JvbGw6IHRoaXMucmVzZXRTY3JvbGwuYmluZCh0aGlzKSxcbiAgICAgIGFkZEl0ZW1zOiB0aGlzLmFkZEl0ZW1zLmJpbmQodGhpcyksXG4gICAgICByZW1vdmVJdGVtczogdGhpcy5yZW1vdmVJdGVtcy5iaW5kKHRoaXMpLFxuICAgICAgZ2V0Q291bnQ6IHRoaXMuZ2V0Q291bnQuYmluZCh0aGlzKSxcbiAgICAgIGdldFNjcm9sbENvbnRhaW5lcjogdGhpcy5nZXRTY3JvbGxDb250YWluZXIuYmluZCh0aGlzKSxcbiAgICAgIGhpZGVUb29sQmFyQm90dG9tOiAoKSA9PiB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0sXG4gICAgICByZXNldEtleVNlbGVjdGVkOiAoKSA9PiB0aGlzLmtleXNTZWxlY3RlZC5zZXQoW10pLFxuICAgICAgZGV0ZWN0Q2hhbmdlczogKCkgPT4gdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpXG4gICAgfSk7XG5cbiAgICBmcm9tRXZlbnQod2luZG93LCAncmVzaXplJykucGlwZSh0YWtlVW50aWwodGhpcy5vbkRlc3Ryb3kpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldEluZGV4Um93ID0gKGRhdGE6IHsgdmFsdWU6IFRZUEVfSVRFTV9EQVRBX1RBQkxFIH0pID0+IHtcbiAgICByZXR1cm4gb2YodGhpcy5pdGVtcygpLmZpbmRJbmRleCgoaXRlbSkgPT4gaXRlbSA9PT0gZGF0YS52YWx1ZSkgKyAxKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U2Nyb2xsQ29udGFpbmVyKCkge1xuICAgIHJldHVybiB0aGlzLmJvZHlDb21wb25lbnRSZWYoKSBhcyBWaXJ0dWFsU2Nyb2xsZXJDb21wb25lbnQ7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNhbGxBcGlCeVNlcnZpY2UoZmlyc3RDYWxsOiBib29sZWFuLCByZXNldEFmdGVyQ2FsbEFwaT86IGJvb2xlYW4pIHtcbiAgICB0cnkge1xuICAgICAgaWYgKGZpcnN0Q2FsbCkge1xuICAgICAgICB0aGlzLmxvYWRlZExhc3RJdGVtLnNldChmYWxzZSk7XG4gICAgICB9XG4gICAgICBpZiAoIXRoaXMuaHR0cFJlcXVlc3REYXRhKCkgfHwgdGhpcy5sb2FkaW5nKCkgfHwgdGhpcy5sb2FkZWRMYXN0SXRlbSgpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMubG9hZGluZy5zZXQodHJ1ZSk7XG4gICAgICB0aGlzLm91dExvYWRpbmcuZW1pdCh0aGlzLmxvYWRpbmcoKSk7XG4gICAgICB0aGlzLnJlc2V0SW5kZXhIb3ZlcigpO1xuICAgICAgY29uc3QgeyBhcmd1bWVudHNWYWx1ZSwgZ3VpZGVBdXRvVXBkYXRlQXJndW1lbnRzVmFsdWUgfSA9IHRoaXMuaHR0cFJlcXVlc3REYXRhKCkgYXMgSUh0dHBSZXF1ZXN0Q29uZmlnO1xuXG4gICAgICBpZiAoZ3VpZGVBdXRvVXBkYXRlQXJndW1lbnRzVmFsdWUgJiYgIWd1aWRlQXV0b1VwZGF0ZUFyZ3VtZW50c1ZhbHVlLnNvcnRPcmRlckJ5ICYmIHRoaXMuaW5zdGFuY2VTb3J0KCkpIHtcbiAgICAgICAgZ3VpZGVBdXRvVXBkYXRlQXJndW1lbnRzVmFsdWUuc29ydE9yZGVyQnkgPSB7XG4gICAgICAgICAgZmllbGRHZXRWYWx1ZTogJ3N0b3JlUGFyYW1zQ2FsbEFwaS5pbnN0YW5jZVNvcnQuZmllbGRTb3J0JyxcbiAgICAgICAgICBmaWVsZFVwZGF0ZTogJ1swXScsXG4gICAgICAgICAgc3ViRmllbGRVcGRhdGU6ICdvcmRlcl9ieSdcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgaWYgKGd1aWRlQXV0b1VwZGF0ZUFyZ3VtZW50c1ZhbHVlICYmICFndWlkZUF1dG9VcGRhdGVBcmd1bWVudHNWYWx1ZS5zb3J0T3JkZXJUeXBlICYmIHRoaXMuaW5zdGFuY2VTb3J0KCkpIHtcbiAgICAgICAgZ3VpZGVBdXRvVXBkYXRlQXJndW1lbnRzVmFsdWUuc29ydE9yZGVyVHlwZSA9IHtcbiAgICAgICAgICBmaWVsZEdldFZhbHVlOiAnc3RvcmVQYXJhbXNDYWxsQXBpLmluc3RhbmNlU29ydC5tb2RlJyxcbiAgICAgICAgICBmaWVsZFVwZGF0ZTogJ1swXScsXG4gICAgICAgICAgc3ViRmllbGRVcGRhdGU6ICdvcmRlcl90eXBlJ1xuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKGZpcnN0Q2FsbCkge1xuICAgICAgICBpZiAoIXJlc2V0QWZ0ZXJDYWxsQXBpKSB7XG4gICAgICAgICAgdGhpcy5oYXNTY3JvbGwuc2V0KGZhbHNlKTtcbiAgICAgICAgICB0aGlzLnN0b3Jlcy5zZXQoW10pO1xuICAgICAgICAgIHRoaXMuaXRlbXMuc2V0KFtdKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxvYWRlZExhc3RJdGVtLnNldCh0aGlzLmh0dHBSZXF1ZXN0U2VydmljZS51cGRhdGVBcmd1bWVudHMoYXJndW1lbnRzVmFsdWUsIHsgLi4udGhpcy5mYWtlUmVzcG9uc2VBcGkoKSwgc3RvcmVQYXJhbXNDYWxsQXBpOiB0aGlzLnN0b3JlUGFyYW1zQ2FsbEFwaSgpIH0sIHRoaXMucGFnaW5nU3RvcmUoKSwgdGhpcy5rZXlTZWFyY2goKSwgdHJ1ZSwgdGhpcy5sb2FkZWRMYXN0SXRlbSgpLCBndWlkZUF1dG9VcGRhdGVBcmd1bWVudHNWYWx1ZSkpO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5odHRwUmVxdWVzdFNlcnZpY2UuY2FsbEFwaSh0aGlzLmh0dHBSZXF1ZXN0RGF0YSgpIGFzIElIdHRwUmVxdWVzdENvbmZpZyk7XG5cbiAgICAgIGlmIChmaXJzdENhbGwgJiYgcmVzZXRBZnRlckNhbGxBcGkpIHtcbiAgICAgICAgdGhpcy5oYXNTY3JvbGwuc2V0KGZhbHNlKTtcbiAgICAgICAgdGhpcy5zdG9yZXMuc2V0KFtdKTtcbiAgICAgICAgdGhpcy5pdGVtcy5zZXQoW10pO1xuICAgICAgfVxuICAgICAgdGhpcy5wYWdpbmdTdG9yZS5zZXQocmVzdWx0LnBhZ2luZyk7XG4gICAgICB0aGlzLnRvdGFsSXRlbUluQmFja2VuZC5zZXQocmVzdWx0LnBhZ2luZz8udG90YWxfaXRlbXMgfHwgMCk7XG4gICAgICB0aGlzLm91dFRvdGFsSXRlbS5lbWl0KHRoaXMudG90YWxJdGVtSW5CYWNrZW5kKCkpO1xuICAgICAgaWYgKCF0aGlzLnBhZ2luZ1N0b3JlKCkpIHtcbiAgICAgICAgdGhpcy5sb2FkZWRMYXN0SXRlbS5zZXQodHJ1ZSk7XG4gICAgICB9XG4gICAgICB0aGlzLmxvYWRlZExhc3RJdGVtLnNldCh0aGlzLmh0dHBSZXF1ZXN0U2VydmljZS51cGRhdGVBcmd1bWVudHMoYXJndW1lbnRzVmFsdWUsIHsgLi4ucmVzdWx0LCBzdG9yZVBhcmFtc0NhbGxBcGk6IHRoaXMuc3RvcmVQYXJhbXNDYWxsQXBpKCkgfSwgdGhpcy5wYWdpbmdTdG9yZSgpLCB0aGlzLmtleVNlYXJjaCgpLCB0cnVlLCB0aGlzLmxvYWRlZExhc3RJdGVtKCksIGd1aWRlQXV0b1VwZGF0ZUFyZ3VtZW50c1ZhbHVlKSk7XG4gICAgICBhd2FpdCB0aGlzLmFkZEl0ZW1zKGNvbnZlcnRPYmplY3RUb1NpZ25hbChyZXN1bHQuZGF0YSB8fCBbXSksIGZhbHNlLCB0cnVlKTtcbiAgICAgIHRoaXMub3V0TG9hZERhdGFDb21wbGV0ZS5lbWl0KHRoaXMuc3RvcmVzKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xuICAgICAgdGhpcy5vdXRMb2FkRGF0YUVycm9yLmVtaXQoZXJyb3IgYXMgSUh0dHBSZXNwb25zZUVycm9yKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5sb2FkaW5nLnNldChmYWxzZSk7XG4gICAgICB0aGlzLm91dExvYWRpbmcuZW1pdCh0aGlzLmxvYWRpbmcoKSk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGZha2VSZXNwb25zZUFwaSgpOiBUWVBFX09CSkVDVCB7XG4gICAgdGhpcy5sb2FkZWRMYXN0SXRlbS5zZXQoZmFsc2UpO1xuICAgIHRoaXMucGFnaW5nU3RvcmUuc2V0KHt9KTtcblxuICAgIHJldHVybiB0aGlzLmh0dHBSZXF1ZXN0U2VydmljZS5mYWtlUmVzcG9uc2VQYWdpbmdBcGkoKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY2FsbEFwaUJ5U2VydmljZUZvb3RlcigpIHtcbiAgICBpZiAoIXRoaXMuaHR0cFJlcXVlc3REYXRhRm9vdGVyKCkgfHwgIXRoaXMuc2hvd0Zvb3RlcigpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHsgYXJndW1lbnRzVmFsdWUsIGd1aWRlQXV0b1VwZGF0ZUFyZ3VtZW50c1ZhbHVlIH0gPSB0aGlzLmh0dHBSZXF1ZXN0RGF0YUZvb3RlcigpIGFzIElIdHRwUmVxdWVzdENvbmZpZztcblxuICAgIHRoaXMuaHR0cFJlcXVlc3RTZXJ2aWNlLnVwZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHNWYWx1ZSwgeyBzdG9yZVBhcmFtc0NhbGxBcGk6IHRoaXMuc3RvcmVQYXJhbXNDYWxsQXBpKCkgfSwgdGhpcy5wYWdpbmdTdG9yZSgpLCB0aGlzLmtleVNlYXJjaCgpLCB0cnVlLCBmYWxzZSwgZ3VpZGVBdXRvVXBkYXRlQXJndW1lbnRzVmFsdWUpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuaHR0cFJlcXVlc3RTZXJ2aWNlLmNhbGxBcGkodGhpcy5odHRwUmVxdWVzdERhdGFGb290ZXIoKSBhcyBJSHR0cFJlcXVlc3RDb25maWcpO1xuXG4gICAgdGhpcy5pdGVtRm9vdGVyLnNldChjb252ZXJ0T2JqZWN0VG9TaWduYWwocmVzdWx0LmRhdGEpKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYWRkSXRlbXMoaXRlbXM6IFRZUEVfREFUQV9UQUJMRSwgYWRkRmlyc3Q6IGJvb2xlYW4sIGlnbm9yZUhpZ2h0TGlnaHQ/OiBib29sZWFuLCBpZ25vcmVSZUNhbGxGb290ZXI/OiBib29sZWFuLCBhdXRvQ291bnROZXdJdGVtPzogYm9vbGVhbikge1xuICAgIGlmICghaXRlbXMoKSB8fCAhaXRlbXMoKS5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaXRlbXNBZGQ6IEFycmF5PFdyaXRhYmxlU2lnbmFsPFRZUEVfT0JKRUNUPj4gPSBbXTtcblxuICAgIGl0ZW1zKCkuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgIGlmICghdGhpcy5jaGVja0V4aXN0SXRlbShpdGVtKSkge1xuICAgICAgICBpdGVtc0FkZC5wdXNoKGl0ZW0pO1xuICAgICAgICBpZiAoIWlnbm9yZUhpZ2h0TGlnaHQpIHtcbiAgICAgICAgICB0aGlzLmhhc0l0ZW1IaWdodExpZ2h0LnNldCh0cnVlKTtcbiAgICAgICAgICBpdGVtLnVwZGF0ZShkYXRhID0+ICh7IC4uLmRhdGEsIHNwZWNpZmljSGlnaHRMaWdodDogdHJ1ZSB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFkZEZpcnN0KSB7XG4gICAgICAgICAgdGhpcy5pdGVtcy51cGRhdGUoZGF0YSA9PiBbaXRlbSwgLi4uZGF0YV0pO1xuICAgICAgICAgIHRoaXMuc3RvcmVzLnVwZGF0ZShkYXRhID0+IFtpdGVtLCAuLi5kYXRhXSk7XG5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pdGVtcy51cGRhdGUoZGF0YSA9PiBbLi4uZGF0YSwgaXRlbV0pO1xuICAgICAgICB0aGlzLnN0b3Jlcy51cGRhdGUoZGF0YSA9PiBbLi4uZGF0YSwgaXRlbV0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmIChhdXRvQ291bnROZXdJdGVtICYmIGl0ZW1zQWRkLmxlbmd0aCkge1xuICAgICAgdGhpcy50b3RhbEl0ZW1JbkJhY2tlbmQudXBkYXRlKHZhbHVlID0+IHZhbHVlICsgaXRlbXNBZGQubGVuZ3RoKTtcbiAgICB9XG4gICAgaWYgKCFpZ25vcmVIaWdodExpZ2h0KSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaXRlbXNBZGQuZm9yRWFjaChpdGVtID0+IGl0ZW0udXBkYXRlKGRhdGEgPT4gKHsgLi4uZGF0YSwgc3BlY2lmaWNIaWdodExpZ2h0OiBmYWxzZSB9KSkpO1xuICAgICAgICB0aGlzLmhhc0l0ZW1IaWdodExpZ2h0LnNldChmYWxzZSk7XG4gICAgICB9LCB0aGlzLnRpbWVIaWdobGlnaE5ld0l0ZW0oKSk7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMuY2hlY2tTY3JvbGwoKTtcbiAgICBpZiAoIWlnbm9yZVJlQ2FsbEZvb3Rlcikge1xuICAgICAgYXdhaXQgdGhpcy5jYWxsQXBpQnlTZXJ2aWNlRm9vdGVyKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjaGVja0V4aXN0SXRlbShpdGVtTmV3OiBXcml0YWJsZVNpZ25hbDxUWVBFX09CSkVDVD4pOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pdGVtcygpLmZpbmQoaXRlbSA9PiBgJHtpdGVtKClbdGhpcy5maWVsZEtleSgpXX1gID09PSBgJHtpdGVtTmV3KClbdGhpcy5maWVsZEtleSgpXX1gKSA/IHRydWUgOiBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVtb3ZlSXRlbXMoa2V5czogQXJyYXk8dW5rbm93bj4sIGlnbm9yZVJlQ2FsbEZvb3Rlcj86IGJvb2xlYW4pIHtcbiAgICB0aGlzLnJlc2V0SW5kZXhIb3ZlcigpO1xuICAgIGlmICghdGhpcy5pdGVtcygpLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBrZXlzLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIHRoaXMuaXRlbXMudXBkYXRlKGl0ZW1zID0+IHtcbiAgICAgICAgbGV0IGlzVXBkYXRlID0gZmFsc2U7XG5cbiAgICAgICAgY29uc3QgbmV3SXRlbXMgPSBpdGVtcy5maWx0ZXIoaXRlbSA9PiB7XG4gICAgICAgICAgaWYgKGAke2l0ZW0oKVt0aGlzLmZpZWxkS2V5KCldfWAgPT09IGAke2tleX1gKSB7XG4gICAgICAgICAgICBpc1VwZGF0ZSA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gaXNVcGRhdGUgPyBuZXdJdGVtcyA6IGl0ZW1zO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuc3RvcmVzLnVwZGF0ZShpdGVtcyA9PiB7XG4gICAgICAgIGxldCBpc1VwZGF0ZSA9IGZhbHNlO1xuXG4gICAgICAgIGNvbnN0IG5ld0l0ZW1zID0gaXRlbXMuZmlsdGVyKGl0ZW0gPT4ge1xuICAgICAgICAgIGlmIChgJHtpdGVtKClbdGhpcy5maWVsZEtleSgpXX1gID09PSBgJHtrZXl9YCkge1xuICAgICAgICAgICAgaXNVcGRhdGUgPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGlzVXBkYXRlID8gbmV3SXRlbXMgOiBpdGVtcztcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoIXRoaXMua2V5c1NlbGVjdGVkKCkgfHwgIXRoaXMua2V5c1NlbGVjdGVkKCkubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMua2V5c1NlbGVjdGVkLnVwZGF0ZShrZXlzID0+IGtleXMuZmlsdGVyKGtleVNlbGVjdGVkID0+IGtleVNlbGVjdGVkICE9PSBrZXkpKTtcbiAgICB9KTtcbiAgICB0aGlzLnRvdGFsSXRlbUluQmFja2VuZC51cGRhdGUodmFsdWUgPT4gdmFsdWUgLSBrZXlzLmxlbmd0aCk7XG4gICAgYXdhaXQgdGhpcy5jaGVja1Njcm9sbCgpO1xuICAgIGlmICghaWdub3JlUmVDYWxsRm9vdGVyKSB7XG4gICAgICBhd2FpdCB0aGlzLmNhbGxBcGlCeVNlcnZpY2VGb290ZXIoKTtcbiAgICB9XG4gICAgdGhpcy5vdXRLZXlzU2VsZWN0ZWQuZW1pdCh7IGtleXM6IHRoaXMua2V5c1NlbGVjdGVkKCkgfSk7XG4gIH1cblxuICBwcml2YXRlIGdldENvdW50KCk6IG51bWJlciB7XG4gICAgaWYgKHRoaXMuaHR0cFJlcXVlc3REYXRhKCkpIHtcbiAgICAgIHJldHVybiB0aGlzLnBhZ2luZ1N0b3JlKCk/LnRvdGFsX2l0ZW1zIHx8IHRoaXMuaXRlbXMoKS5sZW5ndGg7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuaXRlbXMoKS5sZW5ndGg7XG4gIH1cblxuICBwcml2YXRlIGxvYWRNb3JlKCkge1xuICAgIGlmICh0aGlzLmxvYWRpbmcoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLm91dExvYWRNb3JlLmVtaXQoeyBsb2FkTW9yZVN1Y2Nlc3M6IHRoaXMubG9hZE1vcmVTdWNjZXNzLmJpbmQodGhpcykgfSk7XG4gICAgdGhpcy5jYWxsQXBpQnlTZXJ2aWNlKGZhbHNlKTtcbiAgfVxuXG4gIHByaXZhdGUgbG9hZE1vcmVTdWNjZXNzKGRhdGE6IFdyaXRhYmxlU2lnbmFsPEFycmF5PFdyaXRhYmxlU2lnbmFsPFRZUEVfT0JKRUNUPj4+KSB7XG4gICAgdGhpcy5hZGRJdGVtcyhkYXRhLCBmYWxzZSk7XG4gICAgdGhpcy5sb2FkaW5nLnNldChmYWxzZSk7XG4gICAgdGhpcy5vdXRMb2FkaW5nLmVtaXQodGhpcy5sb2FkaW5nKCkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJDaGFuZ2VBbGxDaGVja2VkKCkge1xuICAgIHRoaXMua2V5c1NlbGVjdGVkLnNldChbXSk7XG4gICAgdGhpcy5vdXRLZXlzU2VsZWN0ZWQuZW1pdCh7IGtleXM6IHRoaXMua2V5c1NlbGVjdGVkKCkgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckNoYW5nZUNoZWNrZWRBbGxJdGVtcyhldmVudDogSUNoZWNrYm94RXZlbnQpIHtcbiAgICBpZiAoZXZlbnQuY2hlY2tlZCkge1xuICAgICAgdGhpcy5rZXlzU2VsZWN0ZWQuc2V0KHRoaXMuaXRlbXMoKS5maWx0ZXIoYXN5bmMgKGl0ZW0pID0+ICEoYXdhaXQgdGhpcy5jaGVja0NhbmNlbENvbmRpdGlvbkNoZWNrZWRJdGVtKGl0ZW0pKSkubWFwKGl0ZW0gPT4gYCR7aXRlbSgpW3RoaXMuZmllbGRLZXkoKV19YCkpO1xuICAgICAgdGhpcy5vdXRLZXlzU2VsZWN0ZWQuZW1pdCh7IGtleXM6IHRoaXMua2V5c1NlbGVjdGVkKCkgfSk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5rZXlzU2VsZWN0ZWQuc2V0KFtdKTtcbiAgICB0aGlzLm91dEtleXNTZWxlY3RlZC5lbWl0KHsga2V5czogdGhpcy5rZXlzU2VsZWN0ZWQoKSB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY2hlY2tDYW5jZWxDb25kaXRpb25DaGVja2VkSXRlbShpdGVtOiBXcml0YWJsZVNpZ25hbDxUWVBFX09CSkVDVD4pIHtcbiAgICBsZXQgaXNDYW5jZWxDaGVjayA9IGZhbHNlO1xuXG4gICAgaWYgKCFpc0NhbmNlbENoZWNrICYmIHRoaXMuaGVhZGVyTGVmdCgpLmxlbmd0aCAmJiB0aGlzLmhlYWRlckxlZnQoKVswXS5jaGVja0NvbmRpdGlvbkNoZWNrQm94SGlkZGVuKSB7XG4gICAgICBpc0NhbmNlbENoZWNrID0gYXdhaXQgbGFzdFZhbHVlRnJvbSgodGhpcy5oZWFkZXJMZWZ0KClbMF0uY2hlY2tDb25kaXRpb25DaGVja0JveEhpZGRlbiBhcyBhbnkpKHsgaXRlbTogaXRlbSgpIH0pKSB8fCBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoIWlzQ2FuY2VsQ2hlY2sgJiYgdGhpcy5oZWFkZXJSaWdodCgpLmxlbmd0aCAmJiB0aGlzLmhlYWRlclJpZ2h0KClbMF0uY2hlY2tDb25kaXRpb25DaGVja0JveEhpZGRlbikge1xuICAgICAgaXNDYW5jZWxDaGVjayA9IGF3YWl0IGxhc3RWYWx1ZUZyb20oKHRoaXMuaGVhZGVyUmlnaHQoKVswXS5jaGVja0NvbmRpdGlvbkNoZWNrQm94SGlkZGVuIGFzIGFueSkoeyBpdGVtOiBpdGVtKCkgfSkpIHx8IGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiBpc0NhbmNlbENoZWNrO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJDaGFuZ2VJdGVtQ2hlY2tlZChldmVudDogSUNoZWNrYm94SXRlbSwgaXRlbTogVFlQRV9PQkpFQ1QpIHtcbiAgICBjb25zdCBrZXkgPSBpdGVtW3RoaXMuZmllbGRLZXkoKV07XG4gICAgY29uc3Qga2V5cyA9IG5ldyBTZXQodGhpcy5rZXlzU2VsZWN0ZWQoKSk7XG5cbiAgICBrZXlzLmFkZChrZXkpO1xuICAgIGlmICghZXZlbnQuY2hlY2tlZCkge1xuICAgICAga2V5cy5kZWxldGUoa2V5KTtcbiAgICB9XG4gICAgdGhpcy5rZXlzU2VsZWN0ZWQuc2V0KEFycmF5LmZyb20oa2V5cykpO1xuICAgIHRoaXMub3V0S2V5c1NlbGVjdGVkLmVtaXQoeyBrZXlzOiB0aGlzLmtleXNTZWxlY3RlZCgpIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJDaGFuZ2VTb3J0KHNvcnQ6IElTb3J0KSB7XG4gICAgaWYgKHRoaXMuaW5zdGFuY2VTb3J0ICYmIHRoaXMuaW5zdGFuY2VTb3J0KCk/LmZpZWxkU29ydCAhPT0gc29ydC5maWVsZFNvcnQpIHtcbiAgICAgIHRoaXMuaW5zdGFuY2VTb3J0KCk/LnJlc2V0KCk7XG4gICAgfVxuICAgIHRoaXMuaW5zdGFuY2VTb3J0LnNldChzb3J0KTtcbiAgICBpZiAodGhpcy5zb3J0TG9jYWwoKSkge1xuICAgICAgdGhpcy5oYW5kbGVyU29ydExvY2FsKHNvcnQpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc3RvcmVQYXJhbXNDYWxsQXBpLnVwZGF0ZShkYXRhID0+ICh7IC4uLmRhdGEsIGluc3RhbmNlU29ydDogdGhpcy5pbnN0YW5jZVNvcnQoKSB9KSk7XG4gICAgdGhpcy5jYWxsQXBpQnlTZXJ2aWNlKHRydWUpO1xuICAgIHRoaXMub3V0U29ydC5lbWl0KHtcbiAgICAgIHNvcnQ6IHNvcnQsXG4gICAgICBvblNvcnRTdWNjZXNzOiB0aGlzLm9uU29ydFN1Y2Nlc3MuYmluZCh0aGlzKVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVyU29ydExvY2FsKHNvcnQ6IElTb3J0KSB7XG4gICAgaWYgKHRoaXMuZmlsdGVyT3JTb3J0TG9jYWwoKSAmJiB0aGlzLnN0b3JlcygpLmxlbmd0aCkge1xuICAgICAgdGhpcy5pdGVtcy5zZXQodGhpcy5maWx0ZXJPclNvcnRMb2NhbCgpPy4oc2lnbmFsKFsuLi50aGlzLnN0b3JlcygpXSksIHsgLi4udGhpcy5zdG9yZVBhcmFtc0NhbGxBcGkoKSwgaW5zdGFuY2VTb3J0OiBzb3J0IH0pIHx8IFtdKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB7IGZpZWxkU29ydCwgbW9kZSB9ID0gc29ydDtcblxuICAgIHRoaXMuaXRlbXMudXBkYXRlKGl0ZW1zID0+IHtcbiAgICAgIGl0ZW1zLnNvcnQoKGl0ZW1BLCBpdGVtQikgPT4ge1xuICAgICAgICBsZXQgdmFsdWUxID0gbW9kZSA9PT0gJ2FzYycgPyBpdGVtQSgpW2ZpZWxkU29ydF0gOiBpdGVtQigpW2ZpZWxkU29ydF07XG4gICAgICAgIGxldCB2YWx1ZTIgPSBtb2RlID09PSAnYXNjJyA/IGl0ZW1CKClbZmllbGRTb3J0XSA6IGl0ZW1BKClbZmllbGRTb3J0XTtcblxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlMSA9PT0gJ3N0cmluZycgJiYgdHlwZW9mIHZhbHVlMiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB2YWx1ZTEgPSBkZWxldGVVbmljb2RlKHZhbHVlMSkudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICAgICAgICB2YWx1ZTIgPSBkZWxldGVVbmljb2RlKHZhbHVlMikudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZTEgPT09IHZhbHVlMikge1xuICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHZhbHVlMSA+IHZhbHVlMiA/IDEgOiAtMTtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gWy4uLml0ZW1zXTtcbiAgICB9KTtcbiAgICB0aGlzLm9uU29ydFN1Y2Nlc3MoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyRnVuY3Rpb25Db250cm9sTW9yZVNlbGVjdEl0ZW0oZnVuY3Rpb25Db250cm9sOiBJRHJvcGRvd25GdW5jdGlvbkNvbnRyb2xFdmVudCkge1xuICAgIHRoaXMuZnVuY3Rpb25Db250cm9sU2VsZWN0TW9yZUl0ZW0gPSBmdW5jdGlvbkNvbnRyb2w7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlclNlbGVjdGVkTW9yZUl0ZW0oZXZlbnQ6IElFbWl0U2VsZWN0S2V5IHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKCFldmVudCB8fCAhZXZlbnQua2V5IHx8ICF0aGlzLmNvbmZpZ1NlbGVjdE1vcmVJdGVtKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmZ1bmN0aW9uQ29udHJvbFNlbGVjdE1vcmVJdGVtPy5yZXNldCgpO1xuXG4gICAgY29uc3QgcGVyUGFnZSA9IE51bWJlcihldmVudC5rZXkpLnZhbHVlT2YoKTtcbiAgICBjb25zdCBjdXJyZW50UGFnZSA9IE51bWJlcih0aGlzLnNldFBlclBhZ2VTZWxlY3RNb3JlSXRlbShwZXJQYWdlKSkudmFsdWVPZigpO1xuICAgIGNvbnN0IGlzUGFnaW5nTnVtYmVyID0gdGhpcy5jb25maWdTZWxlY3RNb3JlSXRlbSgpPy5wYWdpbmdOdW1iZXI7XG5cbiAgICBpZiAoY3VycmVudFBhZ2UgPiBwZXJQYWdlIHx8IHRoaXMuaXRlbXMubGVuZ3RoID49IHBlclBhZ2UpIHtcbiAgICAgIGlmICghaXNQYWdpbmdOdW1iZXIpIHtcbiAgICAgICAgdGhpcy5zZXRQZXJQYWdlU2VsZWN0TW9yZUl0ZW0oY3VycmVudFBhZ2UpO1xuICAgICAgfVxuICAgICAgdGhpcy5rZXlzU2VsZWN0ZWQuc2V0KHRoaXMuaXRlbXMoKS5zbGljZSgwLCBwZXJQYWdlKS5tYXAoaXRlbSA9PiBgJHtpdGVtKClbdGhpcy5maWVsZEtleSgpXX1gKSk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmNhbGxBcGlCeVNlcnZpY2UodHJ1ZSwgdHJ1ZSk7XG4gICAgY29uc3Qgc3ViID0gdGhpcy5vdXRMb2FkRGF0YUNvbXBsZXRlLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICBzdWIudW5zdWJzY3JpYmUoKTtcbiAgICAgIGlmICghaXNQYWdpbmdOdW1iZXIpIHtcbiAgICAgICAgdGhpcy5zZXRQZXJQYWdlU2VsZWN0TW9yZUl0ZW0oY3VycmVudFBhZ2UpO1xuICAgICAgfVxuICAgICAgdGhpcy5rZXlzU2VsZWN0ZWQuc2V0KHRoaXMuaXRlbXMoKS5zbGljZSgwLCBwZXJQYWdlKS5tYXAoaXRlbSA9PiBgJHtpdGVtKClbdGhpcy5maWVsZEtleSgpXX1gKSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLm91dExvYWREYXRhRXJyb3Iuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuc2V0UGVyUGFnZVNlbGVjdE1vcmVJdGVtKGN1cnJlbnRQYWdlKTtcbiAgICB9KTtcbiAgfVxuICBwcml2YXRlIHNldFBlclBhZ2VTZWxlY3RNb3JlSXRlbShwZXJQYWdlOiBzdHJpbmcgfCBudW1iZXIpOiBzdHJpbmcge1xuICAgIGNvbnN0IGFyZ3VtZW50c1ZhbHVlID0gdGhpcy5odHRwUmVxdWVzdERhdGEoKT8uYXJndW1lbnRzVmFsdWU7XG5cbiAgICBpZiAoIWFyZ3VtZW50c1ZhbHVlIHx8ICF0aGlzLmNvbmZpZ1NlbGVjdE1vcmVJdGVtKCkpIHtcbiAgICAgIHJldHVybiAnLTEnO1xuICAgIH1cbiAgICBjb25zdCBrZXlQZXJQYWdlID0gdGhpcy5jb25maWdTZWxlY3RNb3JlSXRlbSgpPy5rZXlQZXJQYWdlIHx8ICdwZXJfcGFnZSc7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyZ3VtZW50c1ZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICBsZXQgYXJndW1lbnQgPSBhcmd1bWVudHNWYWx1ZVtpXTtcblxuICAgICAgaWYgKGFyZ3VtZW50IGluc3RhbmNlb2YgSHR0cFBhcmFtcyAmJiBhcmd1bWVudC5oYXMoa2V5UGVyUGFnZSkpIHtcbiAgICAgICAgY29uc3QgY3VycmVudFBlclBhZ2UgPSBhcmd1bWVudC5nZXQoa2V5UGVyUGFnZSkgfHwgJzI1JztcblxuICAgICAgICBhcmd1bWVudCA9IGFyZ3VtZW50LnNldChrZXlQZXJQYWdlLCBwZXJQYWdlKTtcbiAgICAgICAgc2V0KGFyZ3VtZW50c1ZhbHVlLCBgJHtpfWAsIGFyZ3VtZW50KTtcblxuICAgICAgICByZXR1cm4gY3VycmVudFBlclBhZ2U7XG4gICAgICB9XG5cbiAgICAgIGlmIChhcmd1bWVudCBpbnN0YW5jZW9mIE9iamVjdCAmJiBPYmplY3Qua2V5cyhhcmd1bWVudCkuaW5jbHVkZXMoa2V5UGVyUGFnZSkpIHtcbiAgICAgICAgY29uc3QgY3VycmVudFBlclBhZ2UgPSBhcmd1bWVudC5nZXQoa2V5UGVyUGFnZSkgfHwgJzI1JztcblxuICAgICAgICBzZXQoYXJndW1lbnQsIGtleVBlclBhZ2UsIHBlclBhZ2UpO1xuXG4gICAgICAgIHJldHVybiBjdXJyZW50UGVyUGFnZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gJy0xJztcbiAgfVxuXG4gIHByaXZhdGUgb25Tb3J0U3VjY2VzcygpIHtcbiAgICB0aGlzLmxvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICB0aGlzLm91dExvYWRpbmcuZW1pdCh0aGlzLmxvYWRpbmcoKSk7XG4gICAgdGhpcy5yZXNldFNjcm9sbCgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJCdXR0b25DbGljayh0eXBlOiAnYnV0dG9uJyB8ICdidXR0b24tZHJvcGRvd24nLCBidXR0b25Ecm9wZG93bkRhdGE6IGFueSwgYnV0dG9uOiBJQnV0dG9uKSB7IC8vIGJ1dHRvbk9yaWdpbiBjaOG7iSBz4butIGThu6VuZyBraGkgZMO5bmcgYnV0dG9uQWN0aW9ucyBjw7MgYnV0dG9uLWRyb3Bkb3duXG4gICAgaWYgKHR5cGUgPT09ICdidXR0b24nKSB7XG4gICAgICByZXR1cm4gdGhpcy5vdXRDbGlja0J1dHRvbkFjdGlvbi5lbWl0KHsgaXRlbTogdGhpcy5pdGVtT2ZJbmRleEhvdmVyLCBidXR0b246IGJ1dHRvbiB9KTtcbiAgICB9XG4gICAgdGhpcy5vdXRDbGlja0J1dHRvbkFjdGlvbi5lbWl0KHsgaXRlbTogdGhpcy5pdGVtT2ZJbmRleEhvdmVyLCBidXR0b24sIGJ1dHRvbkRyb3Bkb3duRGF0YSB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyQmFyQnV0dG9uQ2xpY2soYnV0dG9uOiBJQnV0dG9uKSB7XG4gICAgY29uc3QgaXRlbXM6IEFycmF5PFdyaXRhYmxlU2lnbmFsPGFueT4+ID0gW107XG5cbiAgICB0aGlzLmtleXNTZWxlY3RlZCgpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLml0ZW1zKCkuZmluZChpdGVtID0+IGAke2l0ZW0oKVt0aGlzLmZpZWxkS2V5KCldfWAgPT09IGAke2tleX1gKTtcblxuICAgICAgaWYgKGl0ZW0pIHtcbiAgICAgICAgaXRlbXMucHVzaChpdGVtKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLm91dENsaWNrQmFyQnV0dG9uLmVtaXQoe1xuICAgICAgYnV0dG9uLFxuICAgICAgaXRlbXMsXG4gICAgICBrZXlzOiB0aGlzLmtleXNTZWxlY3RlZCgpLFxuICAgICAgaGlkZGVuQmFyQnV0dG9uczogKCkgPT4ge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckJ1dHRvbkRyb3Bkb3duRXZlbnQoZXZlbnROYW1lOiBUWVBFX1BPUE9WRVJfRVZFTlQpIHtcbiAgICB0aGlzLmhhc0FjdGlvbkJ1dHRvbkRyb3Bkb3duQ29udGVudC5zZXQodHJ1ZSk7XG4gICAgaWYgKGV2ZW50TmFtZSA9PT0gJ3JlbW92ZScgfHwgZXZlbnROYW1lID09PSAnbW91c2VsZWF2ZS1jb250ZW50Jykge1xuICAgICAgdGhpcy5oYXNBY3Rpb25CdXR0b25Ecm9wZG93bkNvbnRlbnQuc2V0KGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgc2V0SW5kZXhIb3ZlcihlOiBFdmVudCwgaXRlbTogV3JpdGFibGVTaWduYWw8VFlQRV9PQkpFQ1Q+KSB7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBpZiAoIXRoaXMuaXRlbXMoKS5sZW5ndGgpIHtcbiAgICAgIHRoaXMucmVzZXRJbmRleEhvdmVyKCk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5pdGVtT2ZJbmRleEhvdmVyID0gaXRlbTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZXNldEluZGV4SG92ZXJXaGVuTW91c2VMZWF2ZShlPzogRXZlbnQpIHtcbiAgICBlPy5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBjb25zdCBjdXJyZW50SW5kZXhJdGVtSG92ZXIgPSB0aGlzLml0ZW1PZkluZGV4SG92ZXI7XG5cbiAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0TGVhdmVJdGVtKCkpO1xuICAgIHRoaXMudGltZW91dExlYXZlSXRlbS5zZXQoc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5pdGVtT2ZJbmRleEhvdmVyICYmIHRoaXMuaXRlbU9mSW5kZXhIb3ZlciAhPT0gY3VycmVudEluZGV4SXRlbUhvdmVyKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMucmVzZXRJbmRleEhvdmVyKGUpO1xuICAgIH0pKTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZXNldEluZGV4SG92ZXIoZT86IEV2ZW50KSB7XG4gICAgZT8uc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgaWYgKHRoaXMuaGFzQWN0aW9uQnV0dG9uRHJvcGRvd25Db250ZW50KCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5pdGVtT2ZJbmRleEhvdmVyID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJNb3VzZUxlYXZlQ29udGFpbmVyKGV2ZW50OiBFdmVudCkge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMucmVzZXRJbmRleEhvdmVyKGV2ZW50KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyTW91c2VFbnRlckhlYWRlcihldmVudDogRXZlbnQpIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLm1vdXNlRW50ZXJIZWFkZXIuc2V0KHRydWUpO1xuICAgIHRoaXMucmVzZXRJbmRleEhvdmVyKGV2ZW50KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyTW91c2VMZWF2ZUhlYWRlcihldmVudDogRXZlbnQpIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLm1vdXNlRW50ZXJIZWFkZXIuc2V0KGZhbHNlKTtcbiAgICB0aGlzLnJlc2V0SW5kZXhIb3ZlcihldmVudCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlck1vdXNlRW50ZXJGb290ZXIoZXZlbnQ6IEV2ZW50KSB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5yZXNldEluZGV4SG92ZXIoZXZlbnQpO1xuICAgIGlmICh0aGlzLmNsYXNzRm9vdGVySW5jbHVkZSgpKSB7XG4gICAgICB0aGlzLmZvb3RlckVsZW1lbnRSZWYoKT8ubmF0aXZlRWxlbWVudD8uY2xhc3NMaXN0LnJlbW92ZSgnYmctWyNmOGY5ZmFdJyk7XG4gICAgICB0aGlzLmZvb3RlckxlZnRFbGVtZW50UmVmKCk/Lm5hdGl2ZUVsZW1lbnQ/LmNsYXNzTGlzdC5yZW1vdmUoJ2JnLVsjZjhmOWZhXScpO1xuICAgICAgdGhpcy5mb290ZXJFbGVtZW50UmVmKCk/Lm5hdGl2ZUVsZW1lbnQ/LmNsYXNzTGlzdC5hZGQodGhpcy5jbGFzc0Zvb3RlckluY2x1ZGUoKSk7XG4gICAgICB0aGlzLmZvb3RlckxlZnRFbGVtZW50UmVmKCk/Lm5hdGl2ZUVsZW1lbnQ/LmNsYXNzTGlzdC5hZGQodGhpcy5jbGFzc0Zvb3RlckluY2x1ZGUoKSk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJNb3VzZUxlYXZlRm9vdGVyKGV2ZW50OiBFdmVudCkge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGlmICh0aGlzLmNsYXNzRm9vdGVySW5jbHVkZSgpKSB7XG4gICAgICB0aGlzLmZvb3RlckVsZW1lbnRSZWYoKT8ubmF0aXZlRWxlbWVudD8uY2xhc3NMaXN0LnJlbW92ZSh0aGlzLmNsYXNzRm9vdGVySW5jbHVkZSgpKTtcbiAgICAgIHRoaXMuZm9vdGVyTGVmdEVsZW1lbnRSZWYoKT8ubmF0aXZlRWxlbWVudD8uY2xhc3NMaXN0LnJlbW92ZSh0aGlzLmNsYXNzRm9vdGVySW5jbHVkZSgpKTtcbiAgICAgIHRoaXMuZm9vdGVyRWxlbWVudFJlZigpPy5uYXRpdmVFbGVtZW50Py5jbGFzc0xpc3QuYWRkKCdiZy1bI2Y4ZjlmYV0nKTtcbiAgICAgIHRoaXMuZm9vdGVyTGVmdEVsZW1lbnRSZWYoKT8ubmF0aXZlRWxlbWVudD8uY2xhc3NMaXN0LmFkZCgnYmctWyNmOGY5ZmFdJyk7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBoYW5kbGVyU2Nyb2xsSGVhZGVyKGU6IEV2ZW50KSB7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBpZiAoIXRoaXMubW91c2VFbnRlckhlYWRlcigpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgICh0aGlzLmJvZHlFbGVtZW50UmVmKCkgYXMgYW55KS5uYXRpdmVFbGVtZW50LnNjcm9sbExlZnQgPSAoZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLnNjcm9sbExlZnQ7XG4gICAgaWYgKHRoaXMuZm9vdGVyRWxlbWVudFJlZigpKSB7XG4gICAgICAodGhpcy5mb290ZXJFbGVtZW50UmVmKCkgYXMgYW55KS5uYXRpdmVFbGVtZW50LnNjcm9sbExlZnQgPSAoZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLnNjcm9sbExlZnQ7XG4gICAgfVxuICAgIHRoaXMucmVzZXRJbmRleEhvdmVyKGUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJTY3JvbGxCb2R5KGU6IEV2ZW50KSB7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBpZiAodGhpcy5tb3VzZUVudGVySGVhZGVyKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgKHRoaXMuaGVhZGVyRWxlbWVudFJlZigpIGFzIGFueSkubmF0aXZlRWxlbWVudC5zY3JvbGxMZWZ0ID0gKGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5zY3JvbGxMZWZ0O1xuICAgIGlmICh0aGlzLmZvb3RlckVsZW1lbnRSZWYoKSkge1xuICAgICAgKHRoaXMuZm9vdGVyRWxlbWVudFJlZigpIGFzIGFueSkubmF0aXZlRWxlbWVudC5zY3JvbGxMZWZ0ID0gKGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5zY3JvbGxMZWZ0O1xuICAgIH1cbiAgICB0aGlzLnJlc2V0SW5kZXhIb3ZlcihlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyU2Nyb2xsQm90dG9tKGU6IEV2ZW50KSB7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLmxvYWRNb3JlKCk7XG4gIH1cblxuICBwcml2YXRlIHJlc2V0U2Nyb2xsKCkge1xuICAgIGlmICh0aGlzLmhlYWRlckVsZW1lbnRSZWYoKSkge1xuICAgICAgKHRoaXMuaGVhZGVyRWxlbWVudFJlZigpIGFzIGFueSkubmF0aXZlRWxlbWVudC5zY3JvbGxMZWZ0ID0gMDtcbiAgICB9XG4gICAgaWYgKHRoaXMuQm9keUVsZW1lbnQpIHtcbiAgICAgIHRoaXMuQm9keUVsZW1lbnQuc2Nyb2xsVG9wID0gMDtcbiAgICAgIHRoaXMuQm9keUVsZW1lbnQuc2Nyb2xsTGVmdCA9IDA7XG4gICAgfVxuICAgIGlmICh0aGlzLmZvb3RlckVsZW1lbnRSZWYoKSkge1xuICAgICAgKHRoaXMuZm9vdGVyRWxlbWVudFJlZigpIGFzIGFueSkubmF0aXZlRWxlbWVudC5zY3JvbGxMZWZ0ID0gMDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlc2V0KGNsZWFyU29ydD86IGJvb2xlYW4pIHtcbiAgICBpZiAoY2xlYXJTb3J0KSB7XG4gICAgICB0aGlzLmluc3RhbmNlU29ydCgpPy5yZXNldCgpO1xuICAgICAgdGhpcy5pbnN0YW5jZVNvcnQuc2V0KHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIHRoaXMuaGFzU2Nyb2xsLnNldChmYWxzZSk7XG4gICAgdGhpcy5sb2FkaW5nLnNldChmYWxzZSk7XG4gICAgdGhpcy5vdXRMb2FkaW5nLmVtaXQodGhpcy5sb2FkaW5nKCkpO1xuICAgIHRoaXMuaXRlbXMuc2V0KFtdKTtcbiAgICB0aGlzLnN0b3Jlcy5zZXQoW10pO1xuICAgIHRoaXMuZmFrZVJlc3BvbnNlQXBpKCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNoZWNrU2Nyb2xsKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGhhc1Njcm9sbCA9IHRoaXMuaGFzU2Nyb2xsKCk7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICB0aW1lcig1MDApLnBpcGUodGFrZVVudGlsKHRoaXMub25EZXN0cm95KSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuQm9keUVsZW1lbnQpIHtcbiAgICAgICAgICB0aGlzLmhhc1Njcm9sbC5zZXQodGhpcy5Cb2R5RWxlbWVudC5zY3JvbGxIZWlnaHQgPiB0aGlzLkJvZHlFbGVtZW50Lm9mZnNldEhlaWdodCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhhc1Njcm9sbCAmJiAhdGhpcy5oYXNTY3JvbGwoKSkge1xuICAgICAgICAgIHRoaXMub3V0U2Nyb2xsSXNHb25lLmVtaXQoe30pO1xuICAgICAgICAgIGlmICghdGhpcy5maWx0ZXJPclNvcnRMb2NhbCgpKSB7XG4gICAgICAgICAgICB0aGlzLmNhbGxBcGlCeVNlcnZpY2UodHJ1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCBCb2R5RWxlbWVudCgpOiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuYm9keUVsZW1lbnRSZWYoKT8ubmF0aXZlRWxlbWVudDtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMub25EZXN0cm95Lm5leHQoKTtcbiAgICB0aGlzLm9uRGVzdHJveS5jb21wbGV0ZSgpO1xuICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXRMZWF2ZUl0ZW0oKSk7XG4gIH1cblxufVxuIiwiPGRpdiBjbGFzcz0nZmxleCBmbGV4LWNvbCB3LWZ1bGwgaC1mdWxsJz5cbiAgQGlmICghaWdub3JlQmFyKCkpIHtcbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIHJlbGF0aXZlIHotWzFdIGJvdHRvbS0wIGxlZnQtMCB3LWZ1bGwgYmctd2hpdGUgbGlicy11aS10YWJsZS1zaGFkb3ctYm90dG9tIHt7IGNsYXNzQmFySW5jbHVkZSgpIH19XCJcbiAgICAgIFtjbGFzcy5weC1bMTZweF1dPVwia2V5c1NlbGVjdGVkKCkubGVuZ3RoIHx8IGxhYmVsQmFyTm9TZWxlY3RJdGVtKClcIlxuICAgICAgW2NsYXNzLnB5LVs2cHhdXT1cImtleXNTZWxlY3RlZCgpLmxlbmd0aCB8fCBsYWJlbEJhck5vU2VsZWN0SXRlbSgpXCJcbiAgICAgIChtb3VzZWVudGVyKT1cInJlc2V0SW5kZXhIb3ZlcigkZXZlbnQpXCI+XG4gICAgICA8bmctY29udGVudCBzZWxlY3Q9J2Rpdi5saWJzLXVpLXRhYmxlLWJhci1sZWZ0Jz48L25nLWNvbnRlbnQ+XG4gICAgICBAaWYgKCFrZXlzU2VsZWN0ZWQoKS5sZW5ndGggJiYgbGFiZWxCYXJOb1NlbGVjdEl0ZW0oKSkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwie3sgY2xhc3NMYWJlbEJhck5vU2VsZWN0SXRlbSgpID8/ICdweC1bMTJweF0gcHktWzVweF0nIH19XCJcbiAgICAgICAgICBbaW5uZXJIdG1sXT0nbGFiZWxCYXJOb1NlbGVjdEl0ZW0oKSB8IHRyYW5zbGF0ZTp7dmFsdWU6dG90YWxJdGVtRGlzcGxheSgpfSc+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgICAgQGlmIChrZXlzU2VsZWN0ZWQoKS5sZW5ndGgpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIHBsLVsxMnB4XVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBoLWZ1bGwgbXQtWy0ycHhdXCI+XG4gICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWNoZWNrYm94LXNpbmdsZSBbY2hlY2tlZF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVdPVwibG9hZGluZygpIHx8IGRpc2FibGVDaGVja2JveCgpXCJcbiAgICAgICAgICAgICAgKG91dENoYW5nZSk9XCJoYW5kbGVyQ2hhbmdlQWxsQ2hlY2tlZCgpXCIgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibGlicy11aS1mb250LWg1bSB0ZXh0LVsjMDcxNjMxXSBtci1bOHB4XSB7eyBjbGFzc0xhYmVsQmFyQnV0dG9ucygpIH19XCI+XG4gICAgICAgICAgICB7eyBsYWJlbEJhckJ1dHRvbnMoKSB8IHRyYW5zbGF0ZTp7IHZhbHVlOmtleXNTZWxlY3RlZCgpLmxlbmd0aCB9IH19XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgQGlmIChjb25maWdTZWxlY3RNb3JlSXRlbSgpKSB7XG4gICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWRyb3Bkb3duIFtpc05nQ29udGVudF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgW3BvcG92ZXJDdXN0b21Db25maWddPVwie1xuICAgICAgICAgICAgICAgIHdpZHRoQnlQYXJlbnQ6ZmFsc2UsXG4gICAgICAgICAgICAgICAgaWdub3JlQXJyb3c6IHRydWUsXG4gICAgICAgICAgICAgICAgbWF4SGVpZ2h0OiAgMjA0OCxcbiAgICAgICAgICAgICAgICBjbGFzc0luY2x1ZGU6JyF3LVsxMjFweF0nLFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgICAgICAgICAgICBtb2RlOidzdGFydCcsXG4gICAgICAgICAgICAgICAgICBkaXN0YW5jZTowXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgIFtsaXN0Q29uZmlnXT1cImxpc3RDb25maWdNb3JlSXRlbSgpXCJcbiAgICAgICAgICAgICAgW2xpc3RIaWRkZW5JbnB1dFNlYXJjaF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgW2xpc3RNYXhJdGVtU2hvd109XCI1XCJcbiAgICAgICAgICAgICAgY2xhc3M9XCIhdy1bMTZweF0gaC1bMTZweF0gbXItWzhweF1cIlxuICAgICAgICAgICAgICAob3V0U2VsZWN0S2V5KT1cImhhbmRsZXJTZWxlY3RlZE1vcmVJdGVtKCRldmVudClcIlxuICAgICAgICAgICAgICAob3V0RnVuY3Rpb25zQ29udHJvbCk9XCJoYW5kbGVyRnVuY3Rpb25Db250cm9sTW9yZVNlbGVjdEl0ZW0oJGV2ZW50KVwiPlxuICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uIFt0eXBlXT1cIididXR0b24tbGluay1wcmltYXJ5J1wiXG4gICAgICAgICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCInIXAtMCBtLTAnXCJcbiAgICAgICAgICAgICAgICBbY2xhc3NJY29uTGVmdF09XCInYmVmb3JlOiF0ZXh0LVsxNnB4XSBsaWJzLXVpLWljb24tbW92ZS1yaWdodCByb3RhdGUtOTAgbXItWzZweF0nXCJcbiAgICAgICAgICAgICAgICBbcG9wb3Zlcl09XCJ7Y29uZmlnOntjb250ZW50OidpMThuX21vcmVfc2VsZWN0J319XCJcbiAgICAgICAgICAgICAgICBbaWdub3JlU3RvcFByb3BhZ2F0aW9uRXZlbnRdPVwidHJ1ZVwiIC8+XG4gICAgICAgICAgICA8L2xpYnNfdWktY29tcG9uZW50cy1kcm9wZG93bj5cbiAgICAgICAgICB9XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImgtWzE2cHhdIGxpYnMtdWktYm9yZGVyLWxlZnQtZ2VuZXJhbCBtbC1bMTZweF1cIj48L2Rpdj5cbiAgICAgICAgICBAaWYgKGJhckJ1dHRvbnMoKT8ubGVuZ3RoKSB7XG4gICAgICAgICAgICBAZm9yIChidXR0b24gb2YgYmFyQnV0dG9ucygpO3RyYWNrIGJ1dHRvbikge1xuICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uIFt0eXBlXT1cImJ1dHRvbi50eXBlIHx8ICdidXR0b24tbGluay1wcmltYXJ5J1wiXG4gICAgICAgICAgICAgICAgW2NsYXNzSWNvbkxlZnRdPVwiYnV0dG9uLmNsYXNzSWNvbkxlZnQgfHwgJydcIlxuICAgICAgICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiYnV0dG9uLmNsYXNzSW5jbHVkZSB8fCAnJ1wiXG4gICAgICAgICAgICAgICAgW2xhYmVsXT1cIihidXR0b24ubGFiZWwgfHwgJyAnKSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgKG91dENsaWNrKT1cImhhbmRsZXJCYXJCdXR0b25DbGljayhidXR0b24pXCIgLz5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PSdkaXYubGlicy11aS10YWJsZS1iYXItcmlnaHQnPjwvbmctY29udGVudD5cbiAgICA8L2Rpdj5cbiAgfVxuXG4gIDxkaXYgI3RhYmxlQ29udGFpbmVyRWxlbWVudFJlZlxuICAgIGNsYXNzPVwibGlicy11aS10YWJsZSBmbGV4IGZsZXgtY29sIHctZnVsbCBoLWZ1bGwgcmVsYXRpdmUge3sgY2xhc3NUYWJsZUNvbnRhaW5lckluY2x1ZGUoKSB9fVwiXG4gICAgW2NsYXNzLnB4LVsxNnB4XV09JyFpZ25vcmVCYXIoKSdcbiAgICAobW91c2VsZWF2ZSk9XCJoYW5kbGVyTW91c2VMZWF2ZUNvbnRhaW5lcigkZXZlbnQpXCI+XG4gICAgPGRpdiBjbGFzcz1cInJlbGF0aXZlIHctZnVsbCBzaHJpbmstMFwiXG4gICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cImhlYWRlckVsZW1lbnRSZWYub2Zmc2V0SGVpZ2h0XCI+XG4gICAgICA8ZGl2ICNoZWFkZXJFbGVtZW50UmVmXG4gICAgICAgIExpYnNVaUNvbXBvbmVudHNTY3JvbGxPdmVybGF5RGlyZWN0aXZlXG4gICAgICAgIFtvcHRpb25zXT1cIntzY3JvbGxiYXJXaWR0aDogMH1cIlxuICAgICAgICBbY2xhc3MubGlicy11aS1ib3JkZXItYm90dG9tLWRhc2hlZC1nZW5lcmFsXT1cIiFoYXNJdGVtSGlnaHRMaWdodCgpICYmIGlzRGFzaEJvcmRlcigpXCJcbiAgICAgICAgW2NsYXNzLmxpYnMtdWktYm9yZGVyLWJvdHRvbS1nZW5lcmFsXT1cIiFoYXNJdGVtSGlnaHRMaWdodCgpICYmICFpc0Rhc2hCb3JkZXIoKVwiXG4gICAgICAgIFtjbGFzcy4haGlkZGVuXT1cIiFpdGVtcygpLmxlbmd0aCAmJiBpc0hpZGRlbkhlYWRlcldoZW5Ob2RhdGEoKVwiXG4gICAgICAgIFtjbGFzc109XCJjbGFzc0hlYWRlckNvbnRhaW5lcigpXCJcbiAgICAgICAgKG91dFNjcm9sbCk9XCJoYW5kbGVyU2Nyb2xsSGVhZGVyKCRldmVudClcIlxuICAgICAgICAobW91c2VlbnRlcik9XCJoYW5kbGVyTW91c2VFbnRlckhlYWRlcigkZXZlbnQpXCJcbiAgICAgICAgKG1vdXNlbGVhdmUpPVwiaGFuZGxlck1vdXNlTGVhdmVIZWFkZXIoJGV2ZW50KVwiPlxuICAgICAgICBAaWYgKGhlYWRlckxlZnQoKS5sZW5ndGgpIHtcbiAgICAgICAgICA8ZGl2IFtjbGFzc109XCJjbGFzc0hlYWRlckxlZnRDb250YWluZXIoKVwiPlxuICAgICAgICAgICAgQGZvciAoaGVhZGVyIG9mIGhlYWRlckxlZnQoKTt0cmFjayBoZWFkZXIpIHtcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRlbXBsYXRlSGVhZGVyUmVmO2NvbnRleHQ6e2hlYWRlckl0ZW06aGVhZGVyLGlzSGVhZGVyTGVmdDp0cnVlfVwiIC8+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgICAgQGlmIChoZWFkZXJSaWdodCgpLmxlbmd0aCkge1xuICAgICAgICAgIEBmb3IgKGhlYWRlciBvZiBoZWFkZXJSaWdodCgpO3RyYWNrIGhlYWRlcikge1xuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRlbXBsYXRlSGVhZGVyUmVmO2NvbnRleHQ6e2hlYWRlckl0ZW06aGVhZGVyLGlzSGVhZGVyTGVmdDpmYWxzZX1cIiAvPlxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgQGlmIChzaG93Rm9vdGVyKCkgJiYgaXRlbUZvb3RlcigpICYmIGN1c3RvbVBvc2l0aW9uRm9vdGVyKCkgPT09ICd0b3AnKSB7XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PSd0ZW1wbGF0ZUZvb3RlclJlZicgLz5cbiAgICB9XG4gICAgPGRpdiBjbGFzcz1cInJlbGF0aXZlIGZsZXggZmxleC1jb2wgdy1mdWxsIGgtZnVsbCBvdmVyZmxvdy14LWhpZGRlbiBiZy13aGl0ZSB7eyBjbGFzc0JvZHlJbmNsdWRlKCkgfHwgJycgfX1cIj5cbiAgICAgIDxkaXYgI2JvZHlFbGVtZW50UmVmXG4gICAgICAgIGNsYXNzPVwiZmxleCBoLWZ1bGwgdy1mdWxsIHJlbGF0aXZlXCJcbiAgICAgICAgTGlic1VpQ29tcG9uZW50c1Njcm9sbE92ZXJsYXlEaXJlY3RpdmVcbiAgICAgICAgKG91dFNjcm9sbCk9XCJoYW5kbGVyU2Nyb2xsQm9keSgkZXZlbnQpXCJcbiAgICAgICAgKG91dFNjcm9sbEJvdHRvbSk9XCJoYW5kbGVyU2Nyb2xsQm90dG9tKCRldmVudClcIj5cbiAgICAgICAgQGlmIChpdGVtcygpLmxlbmd0aCkge1xuICAgICAgICAgIDx2aXJ0dWFsLXNjcm9sbGVyICNib2R5Q29tcG9uZW50UmVmXG4gICAgICAgICAgICBbaXRlbXNdPVwiaXRlbXMoKVwiXG4gICAgICAgICAgICBbZW5hYmxlVW5lcXVhbENoaWxkcmVuU2l6ZXNdPVwiZW5hYmxlVW5lcXVhbENoaWxkcmVuU2l6ZXMoKVwiXG4gICAgICAgICAgICBjbGFzcz1cImgtZnVsbFwiXG4gICAgICAgICAgICBbc3R5bGUud2lkdGgucHhdPVwiaGVhZGVyRWxlbWVudFJlZi5zY3JvbGxXaWR0aCA+IChib2R5RWxlbWVudFJlZiA/IGJvZHlFbGVtZW50UmVmLnNjcm9sbFdpZHRoIDogMCkgPyBoZWFkZXJFbGVtZW50UmVmLnNjcm9sbFdpZHRoOiB1bmRlZmluZWRcIlxuICAgICAgICAgICAgW3BhcmVudFNjcm9sbF09XCJib2R5RWxlbWVudFJlZlwiXG4gICAgICAgICAgICBbYnVmZmVyQW1vdW50XT1cImJ1ZmZlckFtb3VudCgpXCI+XG4gICAgICAgICAgICBAZm9yIChkYXRhIG9mIGJvZHlDb21wb25lbnRSZWYudmlld1BvcnRJdGVtczt0cmFjayBkYXRhKCkpIHtcbiAgICAgICAgICAgICAgPGRpdiAjZWxlbWVudEhvdmVyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4XCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuYmctWyNmM2ZjZmNdXT1cImRhdGEoKS5zcGVjaWZpY0hpZ2h0TGlnaHRcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5saWJzLXVpLWJvcmRlci10b3AtMXB4LTM2ZDNkM109XCJkYXRhKCkuc3BlY2lmaWNIaWdodExpZ2h0ICYmICRmaXJzdCAmJiAhaWdub3JlQm9yZGVySXRlbSgpXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MubGlicy11aS1ib3JkZXItYm90dG9tLTFweC0zNmQzZDNdPVwiZGF0YSgpLnNwZWNpZmljSGlnaHRMaWdodCAmJiAhaWdub3JlQm9yZGVySXRlbSgpXCJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCIoZGF0YSgpLnNwZWNpZmljSGlnaHRMaWdodCB8fCAoJGxhc3QgJiYgaWdub3JlQm9yZGVySXRlbUxhc3QoKSkpID8gJ2xpYnMtdWktYm9yZGVyLXJhZGl1cy1ib3R0b20tbGVmdC00cHggbGlicy11aS1ib3JkZXItcmFkaXVzLWJvdHRvbS1yaWdodC00cHgnIDogaWdub3JlQm9yZGVySXRlbSgpID8gJycgOiBpc0Rhc2hCb3JkZXIoKSA/ICdsaWJzLXVpLWJvcmRlci1ib3R0b20tZGFzaGVkLWdlbmVyYWwnIDogJ2xpYnMtdWktYm9yZGVyLWJvdHRvbS1nZW5lcmFsJ1wiXG4gICAgICAgICAgICAgICAgW3N0eWxlLndpZHRoLnB4XT1cImhlYWRlckVsZW1lbnRSZWYuc2Nyb2xsV2lkdGhcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5iZy1bI2Y4ZjlmYV1dPVwiaXRlbU9mSW5kZXhIb3ZlciA9PT0gZGF0YSAmJiAhZGF0YSgpLnNwZWNpZmljSGlnaHRMaWdodFwiXG4gICAgICAgICAgICAgICAgKG1vdXNlZW50ZXIpPVwic2V0SW5kZXhIb3ZlcigkZXZlbnQsZGF0YSlcIlxuICAgICAgICAgICAgICAgIChtb3VzZWxlYXZlKT1cInJlc2V0SW5kZXhIb3ZlcldoZW5Nb3VzZUxlYXZlKCRldmVudClcIj5cbiAgICAgICAgICAgICAgICBAaWYgKGhlYWRlckxlZnQoKS5sZW5ndGggfHwgaGVhZGVyUmlnaHQoKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIHctZnVsbFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCB3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICBAaWYgKGhlYWRlckxlZnQoKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IHN0aWNreSB0b3AtMCBsZWZ0LTAgei1bMV1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYmctd2hpdGVdPVwiIWRhdGEoKS5zcGVjaWZpY0hpZ2h0TGlnaHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYmctWyNmM2ZjZmNdXT1cImRhdGEoKS5zcGVjaWZpY0hpZ2h0TGlnaHRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgQGZvciAoaGVhZGVyIG9mIGhlYWRlckxlZnQoKTt0cmFjayBoZWFkZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInJlbGF0aXZlIGZsZXggcHgtWzEycHhdIHB5LVs4cHhdIHt7IGhlYWRlci5pZ25vcmVCb3JkZXJSaWdodCA/ICcnOiAnbGlicy11aS1ib3JkZXItcmlnaHQtZ2VuZXJhbCcgfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmJnLVsjZjhmOWZhXV09XCJpdGVtT2ZJbmRleEhvdmVyID09PSBkYXRhICYmICFkYXRhKCkuc3BlY2lmaWNIaWdodExpZ2h0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cIihoZWFkZXJ8TGlic1VpVGFibGVDYWxjdWxhdG9yQ29sdW1uUGlwZTpoZWFkZXJFbGVtZW50UmVmLmNsaWVudFdpZHRoOmhlYWRlckxlZnQoKTpoZWFkZXJSaWdodCgpKSB8fCAoaGVhZGVyLmlzU2hvd0luZGV4T25Sb3cgPyB7d2lkdGg6JzUwcHgnLCdmbGV4LXNoaXJrJzonMCcscGFkZGluZzonOHB4J30gOiB7fSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiaGVhZGVyLm5nQ2xhc3MgfHwgIHt9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGVtcGxhdGVCb2R5UmVmO2NvbnRleHQ6e2hlYWRlcjpoZWFkZXIsZGF0YTpkYXRhfVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBAaWYgKGhlYWRlclJpZ2h0KCkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBAZm9yIChoZWFkZXIgb2YgaGVhZGVyUmlnaHQoKTt0cmFjayBoZWFkZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlbGF0aXZlIGZsZXggcHgtWzEycHhdIHB5LVs4cHhdXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCIoaGVhZGVyfExpYnNVaVRhYmxlQ2FsY3VsYXRvckNvbHVtblBpcGU6aGVhZGVyRWxlbWVudFJlZi5jbGllbnRXaWR0aDpoZWFkZXJMZWZ0KCk6aGVhZGVyUmlnaHQoKSkgfHwgKGhlYWRlci5pc1Nob3dJbmRleE9uUm93ID8ge3dpZHRoOic1MHB4JywnZmxleC1zaGlyayc6JzAnLHBhZGRpbmc6JzhweCd9IDoge30pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJoZWFkZXIubmdDbGFzcyB8fCB7fVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZW1wbGF0ZUJvZHlSZWY7Y29udGV4dDp7aGVhZGVyOmhlYWRlcixkYXRhOmRhdGF9XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgQGlmIChjb25maWdUZW1wbGF0ZUl0ZW1Db2xsYXBzZUV4cGFuZCgpICYmIGRhdGEoKS5zcGVjaWZpY0V4cGFuZCAmJiBkYXRhKClbY29uZmlnVGVtcGxhdGVJdGVtQ29sbGFwc2VFeHBhbmQoKT8uZmllbGRHZXREYXRhRXhwYW5kIHx8ICdzcGVjaWZpY0RhdGFFeHBhbmQnXSkge1xuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgW2NsYXNzXT1cImNvbmZpZ1RlbXBsYXRlSXRlbUNvbGxhcHNlRXhwYW5kKCk/LmNzc1dyYXBwZXIgfHwgJ2ZsZXggdy1mdWxsJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgQGZvciAoZGF0YUV4cGFuZCBvZiBkYXRhKClbY29uZmlnVGVtcGxhdGVJdGVtQ29sbGFwc2VFeHBhbmQoKT8uZmllbGRHZXREYXRhRXhwYW5kIHx8ICdzcGVjaWZpY0RhdGFFeHBhbmQnXSgpO3RyYWNrICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYgKGNvbmZpZ1RlbXBsYXRlSXRlbUNvbGxhcHNlRXhwYW5kKCk/LmNvbFRlbXBsYXRlQ29uZmlnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy10YWJsZS10ZW1wbGF0ZXMgW2l0ZW1dPVwiZGF0YUV4cGFuZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGVtcGxhdGVDc3NXcmFwcGVyXT1cImNvbmZpZ1RlbXBsYXRlSXRlbUNvbGxhcHNlRXhwYW5kKCk/LnRlbXBsYXRlQ3NzV3JhcHBlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY29uZmlnc109XCJjb25maWdUZW1wbGF0ZUl0ZW1Db2xsYXBzZUV4cGFuZCgpPy5jb2xUZW1wbGF0ZUNvbmZpZ1wiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gQGVtcHR5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlbGF0aXZlIGgtWzEwMHB4XVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZW1wbGF0ZU5vZGF0YVJlZlwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvdmlydHVhbC1zY3JvbGxlcj5cbiAgICAgICAgfSBAZWxzZSBpZiAoIWxvYWRpbmcoKSkge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdGlja3kgbGVmdC0wIHRvcC0wIHotWzFdIGgtZnVsbCB3LWZ1bGxcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZW1wbGF0ZU5vZGF0YVJlZlwiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgQGlmIChzaG93U2Nyb2xsVGFibGVQaW5uZWRJZk5vRGF0YSgpKSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWJzb2x1dGUgaC1bMXB4XSBiZy10cmFuc3BhcmVudCB0b3AtMCBsZWZ0LTAgei1bMV1cIlxuICAgICAgICAgICAgICBbc3R5bGUud2lkdGgucHhdPVwiaGVhZGVyRWxlbWVudFJlZi5zY3JvbGxXaWR0aFwiPjwvZGl2PlxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG5cbiAgICAgIEBpZiAoc2hvd0Zvb3RlcigpICYmIGl0ZW1Gb290ZXIoKSAmJiBjdXN0b21Qb3NpdGlvbkZvb3RlcigpID09PSAnYm90dG9tJykge1xuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PSd0ZW1wbGF0ZUZvb3RlclJlZicgLz5cbiAgICAgIH1cblxuICAgICAgQGlmIChsb2FkaW5nKCkpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cImFic29sdXRlIHctZnVsbCBoLWZ1bGwgei1bMl0gZmxleCBpdGVtcy1jZW50ZXIgY29udGVudC1jZW50ZXJcIj5cbiAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLXNwaW5uZXIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG5cbjxuZy10ZW1wbGF0ZSAjdGVtcGxhdGVIZWFkZXJSZWZcbiAgbGV0LWhlYWRlcj0naGVhZGVySXRlbSdcbiAgbGV0LWlzSGVhZGVyTGVmdD0naXNIZWFkZXJMZWZ0Jz5cbiAgPGRpdlxuICAgIFtjbGFzc109XCIncmVsYXRpdmUgZmxleCAnKyAoaGVhZGVyLnBhZGRpbmdMZWZ0UmlnaHRIZWFkZXJDb250YWluZXIgPz8gJyBweC1bMTJweF0gJykgKyAoaXNIZWFkZXJMZWZ0ICYmICFoZWFkZXIuaWdub3JlQm9yZGVyUmlnaHQgPyAnIGxpYnMtdWktYm9yZGVyLXJpZ2h0LWdlbmVyYWwgJyA6ICcgJykrICcgbGlicy11aS10YWJsZS1oZWFkZXItY29sICdcIlxuICAgIFtjbGFzcy5mbGV4LWNvbF09XCJoZWFkZXIucm93c0NvbmZpZ1wiXG4gICAgW2NsYXNzLnB5LVs4cHhdXT0nIWhlYWRlci5pZ25vcmVQeURlZmF1bHQnXG4gICAgW25nU3R5bGVdPVwiKGhlYWRlcnxMaWJzVWlUYWJsZUNhbGN1bGF0b3JDb2x1bW5QaXBlOmhlYWRlckVsZW1lbnRSZWYuY2xpZW50V2lkdGg6aGVhZGVyTGVmdCgpOmhlYWRlclJpZ2h0KCkpIHx8IChoZWFkZXIuaXNTaG93SW5kZXhPblJvdyA/IHt3aWR0aDonNTBweCcsJ2ZsZXgtc2hpcmsnOicwJyxwYWRkaW5nOic4cHgnfSA6IHt9KVwiXG4gICAgW25nQ2xhc3NdPVwiaGVhZGVyLm5nQ2xhc3MgfHwge31cIj5cbiAgICBAaWYgKCFoZWFkZXIucm93c0NvbmZpZykge1xuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRlbXBsYXRlSGVhZGVyQ29udGVudFJlZjtjb250ZXh0OntoZWFkZXJJdGVtOmhlYWRlcixpc0NvbFJlbmRlcjpmYWxzZX1cIiAvPlxuICAgIH1cbiAgICBAaWYgKGhlYWRlci5yb3dzQ29uZmlnO2FzIHJvd3NDb25maWcpIHtcbiAgICAgIEBmb3IgKHJvdyBvZiByb3dzQ29uZmlnLnJvd3M7dHJhY2sgcm93KSB7XG4gICAgICAgIDxkaXYgW2NsYXNzXT1cInJvdy5jbGFzc1Jvd1wiPlxuICAgICAgICAgIEBmb3IgKGNvbCBvZiByb3cuY29scyA7IHRyYWNrIGNvbCkge1xuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRlbXBsYXRlSGVhZGVyQ29udGVudFJlZjtjb250ZXh0OntoZWFkZXJJdGVtOmNvbCxpc0NvbFJlbmRlcjp0cnVlfVwiIC8+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICB9XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICN0ZW1wbGF0ZUhlYWRlckNvbnRlbnRSZWZcbiAgbGV0LWhlYWRlcj0naGVhZGVySXRlbSdcbiAgbGV0LWlzQ29sUmVuZGVyPSdpc0NvbFJlbmRlcic+XG4gIDxkaXYgY2xhc3M9XCJmbGV4IGxpYnMtdWktZm9udC1oNm0gbWluLWgtWzE4cHhdIHRleHQtWyM2YTczODNdIG1heC13LWZ1bGxcIlxuICAgIFtjbGFzcy5pdGVtcy1jZW50ZXJdPSdoZWFkZXIuY29udGVudEhlYWRlckFsaWduQ2VudGVyID8/IHRydWUnXG4gICAgW2NsYXNzLmp1c3RpZnktZW5kXT0naGVhZGVyLmNvbnRlbnRIZWFkZXJKdXN0aWZ5Q29udGVudEVuZCdcbiAgICBbY2xhc3Mudy1mdWxsXT1cImhlYWRlci5pc1Nob3dJbmRleE9uUm93XCJcbiAgICBbbmdTdHlsZV09XCJpc0NvbFJlbmRlciA/ICgoaGVhZGVyfExpYnNVaVRhYmxlQ2FsY3VsYXRvckNvbHVtblBpcGU6aGVhZGVyRWxlbWVudFJlZi5jbGllbnRXaWR0aDpoZWFkZXJMZWZ0KCk6aGVhZGVyUmlnaHQoKSkgfHwgKGhlYWRlci5pc1Nob3dJbmRleE9uUm93ID8ge3dpZHRoOic1MHB4JywnZmxleC1zaGlyayc6JzAnLHBhZGRpbmc6JzhweCd9IDoge30pKSA6IHt9XCJcbiAgICBbbmdDbGFzc109XCJpc0NvbFJlbmRlciA/IChoZWFkZXIubmdDbGFzcyB8fCB7fSkgOiB7fVwiPlxuICAgIEBpZiAoaGVhZGVyLmhhc0NoZWNrYm94KSB7XG4gICAgICBAaWYgKGhlYWRlci5oYXNDaGVja2JveEFsbCkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBoLWZ1bGwge3sgaGVhZGVyLmNoZWNrYm94QWxsQ2xhc3NJbmNsdWRlIHx8ICdtci1bMTZweF0nIH19XCJcbiAgICAgICAgICBbY2xhc3MuaXRlbXMtY2VudGVyXT1cImhlYWRlci5jaGVja2JveEFsaWduQ2VudGVyXCI+XG4gICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1jaGVja2JveC1zaW5nbGUgW2tleV09XCInYWxsJ1wiXG4gICAgICAgICAgICBbc3RpbGxPdGhlck9wdGlvbnNdPVwiISFrZXlzU2VsZWN0ZWQoKS5sZW5ndGggJiYga2V5c1NlbGVjdGVkKCkubGVuZ3RoICE9PSBpdGVtcygpLmxlbmd0aFwiXG4gICAgICAgICAgICBbY2hlY2tlZF09XCIhIWtleXNTZWxlY3RlZCgpLmxlbmd0aCAmJiBrZXlzU2VsZWN0ZWQoKS5sZW5ndGggPT09IGl0ZW1zKCkubGVuZ3RoXCJcbiAgICAgICAgICAgIFtkaXNhYmxlXT1cImxvYWRpbmcoKVwiXG4gICAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cImhlYWRlci5jaGVja2JveENsYXNzSW5jbHVkZVwiXG4gICAgICAgICAgICAob3V0Q2hhbmdlKT1cImhhbmRsZXJDaGFuZ2VDaGVja2VkQWxsSXRlbXMoJGV2ZW50KVwiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfSBAZWxzZSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGgtZnVsbCBtbC1bMjRweF0ge3sgaGVhZGVyLmNoZWNrYm94Q2xhc3NJbmNsdWRlIH19XCI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgIH1cbiAgICBAZm9yICh0b29sdGlwIG9mIGhlYWRlci50b29sdGlwc0xlZnQ7IHRyYWNrIHRvb2x0aXApIHtcbiAgICAgIDxkaXYgY2xhc3M9XCJtci1bNHB4XVwiPlxuICAgICAgICA8bGlic191aS1jb21wb25lbnRzLXBvcG92ZXIgW3R5cGVdPVwidG9vbHRpcD8udHlwZSB8fCAnb3RoZXInXCJcbiAgICAgICAgICBbbW9kZV09XCJ0b29sdGlwPy5tb2RlIHx8ICdob3ZlcidcIlxuICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwidG9vbHRpcC5jbGFzc0luY2x1ZGUgfHwgJ3RleHQtWyM2YTczODNdJ1wiXG4gICAgICAgICAgW2lnbm9yZVNob3dQb3BvdmVyXT1cInRvb2x0aXAuaWdub3JlU2hvd1Rvb2x0aXAgfHwgZmFsc2VcIlxuICAgICAgICAgIFtjb25maWddPVwidG9vbHRpcC5jb25maWcgfHwge2NvbnRlbnQ6KHRvb2x0aXAuZGF0YVZpZXcgfHwgJyAnKSB8IHRyYW5zbGF0ZSwgcG9zaXRpb246IHtcbiAgICAgICAgICAgICAgICBtb2RlOiAnY2VudGVyJyxcbiAgICAgICAgICAgICAgICBkaXN0YW5jZTogMCxcbiAgICAgICAgICAgICAgICBhdXRvVXBkYXRlUG9zaXRpb246IHtcbiAgICAgICAgICAgICAgICAgIGVuZERpc3RhbmNlOiAxMixcbiAgICAgICAgICAgICAgICAgIHN0YXJ0RGlzdGFuY2U6IC0xMlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfX1cIlxuICAgICAgICAgIFtpbm5lckhUTUxdPVwidG9vbHRpcC5kYXRhVmlld1wiIC8+XG4gICAgICA8L2Rpdj5cbiAgICB9XG5cbiAgICBAaWYgKGhlYWRlci5pc1Nob3dJbmRleE9uUm93KSB7XG4gICAgICA8ZGl2IGNsYXNzPVwiZmxleCB3LWZ1bGwgaC1mdWxsIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciB7eyBoZWFkZXIuY2xhc3NJbmNsdWRlSW5kZXhPblJvdyB8fCAnJyB9fVwiPlxuICAgICAgICB7eyBoZWFkZXIubGFiZWwgPz8gJyMnIH19XG4gICAgICA8L2Rpdj5cbiAgICB9IEBlbHNlIHtcbiAgICAgIEBpZiAoKGhlYWRlci5sYWJlbCB8IExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGU6aGVhZGVyLnBhcnNlVmFsdWU6aGVhZGVyKSB8IGFzeW5jIHwgdHJhbnNsYXRlOyBhcyBsYWJlbEhlYWRlckNvbHVtbikge1xuICAgICAgICA8bGlic191aS1jb21wb25lbnRzLXBvcG92ZXIgW3R5cGVdPVwiaGVhZGVyPy5sYWJlbENvbmZpZz8udHlwZSB8fCAndGV4dCdcIlxuICAgICAgICAgIFttb2RlXT1cImhlYWRlcj8ubGFiZWxDb25maWc/Lm1vZGUgfHwgJ2hvdmVyJ1wiXG4gICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCIoaGVhZGVyPy5sYWJlbENvbmZpZz8uY2xhc3NJbmNsdWRlIHx8ICcnKVwiXG4gICAgICAgICAgW2lnbm9yZVNob3dQb3BvdmVyXT1cImhlYWRlcj8ubGFiZWxDb25maWc/Lmlnbm9yZVNob3dUb29sdGlwIHx8IGZhbHNlXCJcbiAgICAgICAgICBbY29uZmlnXT1cImhlYWRlci5sYWJlbENvbmZpZz8uY29uZmlnIHx8IHtjb250ZW50OmxhYmVsSGVhZGVyQ29sdW1ufVwiXG4gICAgICAgICAgW2lubmVySFRNTF09XCJsYWJlbEhlYWRlckNvbHVtblwiIC8+XG4gICAgICB9XG4gICAgfVxuXG4gICAgQGZvciAodG9vbHRpcCBvZiBoZWFkZXIudG9vbHRpcHNSaWdodDsgdHJhY2sgdG9vbHRpcCkge1xuICAgICAgPGRpdiBjbGFzcz1cIm1sLVs0cHhdXCI+XG4gICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtcG9wb3ZlciBbdHlwZV09XCJ0b29sdGlwPy50eXBlIHx8ICdvdGhlcidcIlxuICAgICAgICAgIFttb2RlXT1cInRvb2x0aXA/Lm1vZGUgfHwgJ2hvdmVyJ1wiXG4gICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCJ0b29sdGlwLmNsYXNzSW5jbHVkZSB8fCAndGV4dC1bIzZhNzM4M10nXCJcbiAgICAgICAgICBbaWdub3JlU2hvd1BvcG92ZXJdPVwidG9vbHRpcC5pZ25vcmVTaG93VG9vbHRpcCB8fCBmYWxzZVwiXG4gICAgICAgICAgW2NvbmZpZ109XCJ0b29sdGlwLmNvbmZpZyB8fCB7Y29udGVudDoodG9vbHRpcC5kYXRhVmlldyB8fCAnICcpIHwgdHJhbnNsYXRlLCBwb3NpdGlvbjoge1xuICAgICAgICAgICAgICBtb2RlOiAnY2VudGVyJyxcbiAgICAgICAgICAgICAgZGlzdGFuY2U6IDAsXG4gICAgICAgICAgICAgIGF1dG9VcGRhdGVQb3NpdGlvbjoge1xuICAgICAgICAgICAgICAgIGVuZERpc3RhbmNlOiAxMixcbiAgICAgICAgICAgICAgICBzdGFydERpc3RhbmNlOiAtMTJcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfX1cIlxuICAgICAgICAgIFtpbm5lckhUTUxdPVwidG9vbHRpcC5kYXRhVmlld1wiIC8+XG4gICAgICA8L2Rpdj5cbiAgICB9XG5cbiAgICBAaWYgKGhlYWRlci5oYXNTb3J0ICYmIGhlYWRlci5vcmRlcmJ5KSB7XG4gICAgICA8ZGl2IGNsYXNzPVwibWwtWzRweF1cIj5cbiAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLXNvcnQtYXJyb3cgW2Rpc2FibGVdPVwibG9hZGluZygpIHx8ICFpdGVtcygpLmxlbmd0aFwiXG4gICAgICAgICAgW2ZpZWxkU29ydF09XCJoZWFkZXIub3JkZXJieVwiXG4gICAgICAgICAgW2lnbm9yZVBvcG92ZXJDb250ZW50XT1cImhlYWRlci5zb3J0SWdub3JlVG9vbHRpcENvbnRlbnQgPz8gdHJ1ZVwiXG4gICAgICAgICAgW3BvcG92ZXJDb250ZW50QXNjXT1cImhlYWRlci5zb3J0VG9vbHRpcENvbnRlbnRBc2NcIlxuICAgICAgICAgIFtwb3BvdmVyQ29udGVudERlc2NdPVwiaGVhZGVyLnNvcnRUb29sdGlwQ29udGVudERlc2NcIlxuICAgICAgICAgIFtkZWZhdWx0TW9kZV09XCJoZWFkZXIuZGVmYXVsdE1vZGVcIlxuICAgICAgICAgIFt6SW5kZXhdPVwiaGVhZGVyLnpJbmRleFRvb2x0aXBTb3J0XCJcbiAgICAgICAgICAob3V0Q2hhbmdlKT1cImhhbmRsZXJDaGFuZ2VTb3J0KCRldmVudClcIiAvPlxuICAgICAgPC9kaXY+XG4gICAgfVxuICA8L2Rpdj5cbiAgQGlmIChoZWFkZXIubGFiZWxEZXNjcmlwdGlvbikge1xuICAgIDxkaXYgY2xhc3M9XCJmbGV4XCI+XG4gICAgICA8bGlic191aS1jb21wb25lbnRzLXBvcG92ZXIgW3R5cGVdPVwiJ3RleHQnXCJcbiAgICAgICAgW2NsYXNzSW5jbHVkZV09XCJoZWFkZXIubGFiZWxEZXNjcmlwdGlvbi5jbGFzc0luY2x1ZGUgfHwgJydcIlxuICAgICAgICBbY29uZmlnXT1cIntjb250ZW50OiBoZWFkZXIubGFiZWxEZXNjcmlwdGlvbi5jb250ZW50IHwgdHJhbnNsYXRlfVwiXG4gICAgICAgIFtpbm5lckhUTUxdPVwiaGVhZGVyLmxhYmVsRGVzY3JpcHRpb24uY29udGVudCB8IHRyYW5zbGF0ZVwiIC8+XG4gICAgPC9kaXY+XG4gIH1cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjdGVtcGxhdGVCb2R5UmVmXG4gIGxldC1oZWFkZXI9J2hlYWRlcidcbiAgbGV0LWRhdGE9J2RhdGEnPlxuICA8ZGl2IGNsYXNzPVwiZmxleCB3LWZ1bGwgaC1mdWxsXCI+XG4gICAgQGlmIChoZWFkZXIuaGFzQ2hlY2tib3gpIHtcbiAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGgtZnVsbFwiXG4gICAgICAgIFtjbGFzcy5pbnZpc2libGVdPVwiaGVhZGVyLmNoZWNrQ29uZGl0aW9uQ2hlY2tCb3hIaWRkZW4gJiYoIGRhdGEoKSB8IExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGU6aGVhZGVyLmNoZWNrQ29uZGl0aW9uQ2hlY2tCb3hIaWRkZW46ZGF0YSgpIHwgYXN5bmMpXCJcbiAgICAgICAgW2NsYXNzLml0ZW1zLWNlbnRlcl09XCJoZWFkZXIuY2hlY2tib3hBbGlnbkNlbnRlclwiPlxuICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWNoZWNrYm94LXNpbmdsZSBba2V5XT1cImRhdGEoKVtmaWVsZEtleSgpXVwiXG4gICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCJoZWFkZXIuY2hlY2tib3hDbGFzc0luY2x1ZGVcIlxuICAgICAgICAgIFtjaGVja2VkXT1cImRhdGEoKVtmaWVsZEtleSgpXSB8IExpYnNVaVBpcGVzQ2hlY2tTZWxlY3RlZEJ5S2V5UGlwZTprZXlzU2VsZWN0ZWQoKTprZXlzU2VsZWN0ZWQoKS5sZW5ndGhcIlxuICAgICAgICAgIFtkaXNhYmxlXT1cImxvYWRpbmcoKSB8fCBkaXNhYmxlQ2hlY2tib3goKSB8fCAhIShtYXhJdGVtU2VsZWN0ZWQoKSAmJiAhKGRhdGEoKVtmaWVsZEtleSgpXSB8IExpYnNVaVBpcGVzQ2hlY2tTZWxlY3RlZEJ5S2V5UGlwZTprZXlzU2VsZWN0ZWQoKTprZXlzU2VsZWN0ZWQoKS5sZW5ndGgpICYmIGtleXNTZWxlY3RlZCgpLmxlbmd0aCA+PSBtYXhJdGVtU2VsZWN0ZWQoKSlcIlxuICAgICAgICAgIChvdXRDaGFuZ2UpPVwiaGFuZGxlckNoYW5nZUl0ZW1DaGVja2VkKCRldmVudCxkYXRhKCkpXCIgLz5cbiAgICAgIDwvZGl2PlxuICAgIH1cblxuICAgIEBpZiAoaGVhZGVyLmlzU2hvd0luZGV4T25Sb3c7IGFzIGNvbmZpZykge1xuICAgICAgPGRpdiBjbGFzcz1cInctZnVsbCBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBsaWJzLXVpLWZvbnQtaDRye3sgY29uZmlnLmNsYXNzSW5jbHVkZUluZGV4T25Sb3cgfHwgJycgfX1cIj5cbiAgICAgICAgPGRpdiBMaWJzVWlDb21wb25lbnRzUG9wb3ZlckRpcmVjdGl2ZVxuICAgICAgICAgIFt0eXBlXT1cIid0ZXh0J1wiXG4gICAgICAgICAgW2NvbmZpZ109XCJ7fVwiXG4gICAgICAgICAgW2lubmVySFRNTF09XCJkYXRhIHwgTGlic1VpUGlwZXNDYWxsRnVuY3Rpb25JblRlbXBsYXRlUGlwZTpnZXRJbmRleFJvdyB8IGFzeW5jXCI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgfVxuXG4gICAgQGlmIChoZWFkZXIuY29sVGVtcGxhdGVDb25maWcpIHtcbiAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtdGFibGUtdGVtcGxhdGVzIFtpc0hvdmVyXT1cIml0ZW1PZkluZGV4SG92ZXIgPT09IGRhdGEgJiYgIWRhdGEuc3BlY2lmaWNIaWdodExpZ2h0XCJcbiAgICAgICAgW2NsYXNzXT1cImhlYWRlci50ZW1wbGF0ZUNzc1dyYXBwZXJIb3N0IHx8ICcnXCJcbiAgICAgICAgW2l0ZW1dPVwiZGF0YVwiXG4gICAgICAgIFt0ZW1wbGF0ZUNzc1dyYXBwZXJdPVwiaGVhZGVyLnRlbXBsYXRlQ3NzV3JhcHBlclwiXG4gICAgICAgIFtjb25maWdzXT1cImhlYWRlci5jb2xUZW1wbGF0ZUNvbmZpZ1wiIC8+XG4gICAgfVxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjdGVtcGxhdGVGb290ZXJSZWY+XG4gIEBpZiAoIWlzSGlkZGVuSGVhZGVyV2hlbk5vZGF0YSgpIHx8IChpc0hpZGRlbkhlYWRlcldoZW5Ob2RhdGEoKSAmJiBpdGVtcygpLmxlbmd0aCkpIHtcbiAgICA8ZGl2ICNmb290ZXJFbGVtZW50UmVmXG4gICAgICBjbGFzcz1cImZsZXggdy1mdWxsIGJnLVsjZjhmOWZhXSBvdmVyZmxvdy14LWhpZGRlbiB6LVsxXSB7eyBpZ25vcmVCb3JkZXJGb290ZXIoKSA/ICcnOiAoY3VzdG9tUG9zaXRpb25Gb290ZXIoKSA9PT0gJ3RvcCcgPyAnbGlicy11aS1ib3JkZXItYm90dG9tLWdlbmVyYWwnOidsaWJzLXVpLXRhYmxlLXNoYWRvdy10b3AgbGlicy11aS1ib3JkZXItdG9wLWdlbmVyYWwnKSB9fSBtaW4taC1bMzVweF1cIlxuICAgICAgKG1vdXNlZW50ZXIpPVwiaGFuZGxlck1vdXNlRW50ZXJGb290ZXIoJGV2ZW50KVwiXG4gICAgICAobW91c2VsZWF2ZSk9XCJoYW5kbGVyTW91c2VMZWF2ZUZvb3RlcigkZXZlbnQpXCI+XG4gICAgICBAaWYgKGZvb3RlckxlZnQoKSkge1xuICAgICAgICA8ZGl2ICNmb290ZXJMZWZ0RWxlbWVudFJlZlxuICAgICAgICAgIGNsYXNzPVwiZmxleCBzdGlja3kgdG9wLTAgbGVmdC0wIHotWzFdIGJnLVsjZjhmOWZhXVwiPlxuICAgICAgICAgIEBmb3IgKGZvb3RlciBvZiBmb290ZXJMZWZ0KCk7dHJhY2sgZm9vdGVyKSB7XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgcHgtWzEycHhdIHB5LVs4cHhdIHt7IGZvb3Rlci5pZ25vcmVCb3JkZXJSaWdodCA/ICcnOiAnbGlicy11aS1ib3JkZXItcmlnaHQtZ2VuZXJhbCcgfX1cIlxuICAgICAgICAgICAgICBbbmdTdHlsZV09XCIoZm9vdGVyfExpYnNVaVRhYmxlQ2FsY3VsYXRvckNvbHVtblBpcGU6aGVhZGVyRWxlbWVudFJlZi5jbGllbnRXaWR0aDpmb290ZXJMZWZ0KCk6Zm9vdGVyUmlnaHQoKSkgfHwge31cIlxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJmb290ZXIubmdDbGFzcyB8fCB7fVwiPlxuICAgICAgICAgICAgICBAaWYgKGZvb3Rlci5jb2xUZW1wbGF0ZUNvbmZpZyAmJiBpdGVtRm9vdGVyKCkpIHtcbiAgICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLXRhYmxlLXRlbXBsYXRlcyBbaXRlbV09XCJpdGVtRm9vdGVyfExpYnNVaVBpcGVzQ29udmVydE9iamVjdFRvU2lnbmFsUGlwZVwiXG4gICAgICAgICAgICAgICAgICBbdGVtcGxhdGVDc3NXcmFwcGVyXT1cImZvb3Rlci50ZW1wbGF0ZUNzc1dyYXBwZXJcIlxuICAgICAgICAgICAgICAgICAgW2NvbmZpZ3NdPVwiZm9vdGVyLmNvbFRlbXBsYXRlQ29uZmlnXCIgLz5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICAgIEBpZiAoZm9vdGVyUmlnaHQoKSkge1xuICAgICAgICBAZm9yIChmb290ZXIgb2YgZm9vdGVyUmlnaHQoKTt0cmFjayBmb290ZXIpIHtcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgcHgtWzEycHhdIHB5LVs4cHhdXCJcbiAgICAgICAgICAgIFtuZ1N0eWxlXT1cIihmb290ZXJ8TGlic1VpVGFibGVDYWxjdWxhdG9yQ29sdW1uUGlwZTpoZWFkZXJFbGVtZW50UmVmLmNsaWVudFdpZHRoOmZvb3RlckxlZnQoKTpmb290ZXJSaWdodCgpKSB8fCB7fVwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJmb290ZXIubmdDbGFzcyB8fCB7fVwiPlxuICAgICAgICAgICAgQGlmIChmb290ZXIuY29sVGVtcGxhdGVDb25maWcgJiYgaXRlbUZvb3RlcigpKSB7XG4gICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtdGFibGUtdGVtcGxhdGVzIFtpdGVtXT1cIml0ZW1Gb290ZXJ8TGlic1VpUGlwZXNDb252ZXJ0T2JqZWN0VG9TaWduYWxQaXBlXCJcbiAgICAgICAgICAgICAgICBbdGVtcGxhdGVDc3NXcmFwcGVyXT1cImZvb3Rlci50ZW1wbGF0ZUNzc1dyYXBwZXJcIlxuICAgICAgICAgICAgICAgIFtjb25maWdzXT1cImZvb3Rlci5jb2xUZW1wbGF0ZUNvbmZpZ1wiIC8+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgIDwvZGl2PlxuICB9XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3RlbXBsYXRlTm9kYXRhUmVmPlxuICBAaWYgKCFrZXlTZWFyY2goKSAmJiB0ZW1wbGF0ZU5vRGF0YSgpOyBhcyB0ZW1wbGF0ZU5vRGF0YSkge1xuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZW1wbGF0ZU5vRGF0YVwiIC8+XG4gIH0gQGlmIChrZXlTZWFyY2goKSAmJiB0ZW1wbGF0ZU5vUmVzdWx0KCk7IGFzIHRlbXBsYXRlTm9SZXN1bHQpIHtcbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGVtcGxhdGVOb1Jlc3VsdFwiIC8+XG4gIH1cbiAgQGlmICghdGVtcGxhdGVOb0RhdGEoKSAmJiAhdGVtcGxhdGVOb1Jlc3VsdCgpICYmIG5vRGF0YUNvbmZpZygpOyBhcyBjb25maWcpIHtcbiAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgdy1mdWxsIGgtZnVsbCBhYnNvbHV0ZSBsZWZ0LTAgdG9wLTAgei1bMV1cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciB3LWZ1bGwgaC1mdWxsIHNocmluay0wXCJcbiAgICAgICAgTGlic1VpQ29tcG9uZW50c1Njcm9sbE92ZXJsYXlEaXJlY3RpdmU+XG4gICAgICAgIEBpZiAoIWtleVNlYXJjaCgpICYmICFvbmx5U2hvd05vUmVzdWx0KCkpIHtcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0NvbXBvbmVudE91dGxldD1cIiAoJ25vLWRhdGEnIHwgTGlic1VpSWNvbnNHZXRJY29uQ29tcG9uZW50UGlwZSB8IGFzeW5jKTtpbnB1dHM6e3NpemU6NjR9XCIgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibGlicy11aS10YWJsZS1uby1kYXRhLWNvbmZpZy10ZXh0XCJcbiAgICAgICAgICAgIFtuZ1N0eWxlXT1cImNvbmZpZy5uZ1N0eWxlIHx8IHt9XCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cImNvbmZpZy5uZ0NsYXNzIHx8IHt9XCJcbiAgICAgICAgICAgIFtpbm5lckh0bWxdPVwiY29uZmlnLnRleHROb0RhdGEgfCB0cmFuc2xhdGVcIj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgICBAaWYgKGtleVNlYXJjaCgpIHx8IG9ubHlTaG93Tm9SZXN1bHQoKSkge1xuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nQ29tcG9uZW50T3V0bGV0PVwiKCduby1yZXN1bHQnIHwgTGlic1VpSWNvbnNHZXRJY29uQ29tcG9uZW50UGlwZSB8IGFzeW5jKTtpbnB1dHM6e3NpemU6NjR9XCIgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibGlicy11aS10YWJsZS1uby1kYXRhLWNvbmZpZy10ZXh0XCJcbiAgICAgICAgICAgIFtuZ1N0eWxlXT1cImNvbmZpZy5uZ1N0eWxlIHx8IHt9XCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cImNvbmZpZy5uZ0NsYXNzIHx8IHt9XCJcbiAgICAgICAgICAgIFtpbm5lckh0bWxdPVwiY29uZmlnLnRleHRTZWFyY2hOb0RhdGEgfCB0cmFuc2xhdGVcIj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIH1cbjwvbmctdGVtcGxhdGU+XG4iXX0=