@libs-ui/components-pages-template-full-screen 0.2.356-9 → 0.2.357-1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -47,10 +47,14 @@ export class LibsUiComponentsPagesTemplateFullScreenV2Component {
47
47
  outClickButton = output();
48
48
  // #endregion
49
49
  // #region --- INTERNAL STATE ---
50
+ functionsControl = signal({ emitClosePageFullEvent: () => this.emitClosePageFullEvent() });
50
51
  idOverlay = signal(uuid()).asReadonly();
51
52
  destroyRef = inject(DestroyRef);
52
53
  functionControlMenu;
53
54
  // #endregion
55
+ // #region --- INTERNAL STATE ---
56
+ pipeEmptyConfig = { valueIsEmpty: null };
57
+ // #endregion
54
58
  // #region --- COMPUTED ---
55
59
  /** State reactive để truyền vào component outlet */
56
60
  sectionData = computed(() => ({
@@ -88,6 +92,9 @@ export class LibsUiComponentsPagesTemplateFullScreenV2Component {
88
92
  }
89
93
  }
90
94
  }
95
+ get FunctionsControl() {
96
+ return this.functionsControl();
97
+ }
91
98
  // #region --- EVENT HANDLERS ---
92
99
  handlerEdit() {
93
100
  this.outEdit.emit();
@@ -96,13 +103,13 @@ export class LibsUiComponentsPagesTemplateFullScreenV2Component {
96
103
  this.outClose.emit();
97
104
  }
98
105
  async handlerClickButton(button) {
99
- if (button && button.action) {
106
+ if (button?.action) {
100
107
  await button.action();
101
108
  }
102
109
  this.outClickButton.emit(button);
103
110
  }
104
111
  async handlerSwitch(event, button) {
105
- if (button && button.action) {
112
+ if (button?.action) {
106
113
  await button.action(event);
107
114
  }
108
115
  }
@@ -114,21 +121,24 @@ export class LibsUiComponentsPagesTemplateFullScreenV2Component {
114
121
  this.functionControlMenu = event;
115
122
  }
116
123
  // #endregion
124
+ emitClosePageFullEvent() {
125
+ const data = {
126
+ type: UtilsCommunicateMicroKeyGlobal.KEY_MESSAGE_MODAL,
127
+ response: {
128
+ message: 'close',
129
+ state: false,
130
+ idOverlay: this.idOverlay(),
131
+ },
132
+ };
133
+ UtilsCommunicateMicro.PostMessageToParent(data);
134
+ }
117
135
  ngOnDestroy() {
118
136
  if (!this.ignoreClosePageFullEvent()) {
119
- const data = {
120
- type: UtilsCommunicateMicroKeyGlobal.KEY_MESSAGE_MODAL,
121
- response: {
122
- message: 'close',
123
- state: false,
124
- idOverlay: this.idOverlay(),
125
- },
126
- };
127
- UtilsCommunicateMicro.PostMessageToParent(data);
137
+ this.emitClosePageFullEvent();
128
138
  }
129
139
  }
130
140
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiComponentsPagesTemplateFullScreenV2Component, deps: [], target: i0.ɵɵFactoryTarget.Component });
131
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: LibsUiComponentsPagesTemplateFullScreenV2Component, isStandalone: true, selector: "libs_ui-components-pages_template_full_screen_v2", inputs: { classHeaderInclude: { classPropertyName: "classHeaderInclude", publicName: "classHeaderInclude", isSignal: true, isRequired: false, transformFunction: null }, labelLeft: { classPropertyName: "labelLeft", publicName: "labelLeft", isSignal: true, isRequired: false, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, buttonCenter: { classPropertyName: "buttonCenter", publicName: "buttonCenter", isSignal: true, isRequired: false, transformFunction: null }, buttonRight: { classPropertyName: "buttonRight", publicName: "buttonRight", isSignal: true, isRequired: false, transformFunction: null }, hasEdit: { classPropertyName: "hasEdit", publicName: "hasEdit", isSignal: true, isRequired: false, transformFunction: null }, menuDropDownConfigs: { classPropertyName: "menuDropDownConfigs", publicName: "menuDropDownConfigs", isSignal: true, isRequired: false, transformFunction: null }, zIndex: { classPropertyName: "zIndex", publicName: "zIndex", isSignal: true, isRequired: false, transformFunction: null }, ignoreClosePageFullEvent: { classPropertyName: "ignoreClosePageFullEvent", publicName: "ignoreClosePageFullEvent", isSignal: true, isRequired: false, transformFunction: null }, ignoreBackgroundColor: { classPropertyName: "ignoreBackgroundColor", publicName: "ignoreBackgroundColor", isSignal: true, isRequired: false, transformFunction: null }, divideClassHeader: { classPropertyName: "divideClassHeader", publicName: "divideClassHeader", isSignal: true, isRequired: false, transformFunction: null }, centerTemplate: { classPropertyName: "centerTemplate", publicName: "centerTemplate", isSignal: true, isRequired: false, transformFunction: null }, templateRight: { classPropertyName: "templateRight", publicName: "templateRight", isSignal: true, isRequired: false, transformFunction: null }, leftTemplate: { classPropertyName: "leftTemplate", publicName: "leftTemplate", isSignal: true, isRequired: false, transformFunction: null }, disable: { classPropertyName: "disable", publicName: "disable", isSignal: true, isRequired: false, transformFunction: null }, bodyConfig: { classPropertyName: "bodyConfig", publicName: "bodyConfig", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { outClose: "outClose", outEdit: "outEdit", outSelectedMenuDropdown: "outSelectedMenuDropdown", outClickButton: "outClickButton" }, ngImport: i0, template: "<div\n class=\"libs-ui-components-page_full overflow-hidden\"\n [style.zIndex]=\"zIndex()\"\n [style.background-color]=\"ignoreBackgroundColor() ? 'transparent' : '#f2f5f7'\">\n <!-- ===================== HEADER (gi\u1EEF nguy\u00EAn 100% t\u1EEB V1) ===================== -->\n <div [class]=\"'libs-ui-components-page_full-header ' + classHeaderInclude()\">\n <div class=\"{{ divideClassHeader()?.classButtonCancel || 'w-[25%]' }}\">\n @if (leftTemplate(); as leftTemplate) {\n <ng-container *ngTemplateOutlet=\"leftTemplate\" />\n }\n @if (labelLeft(); as labelLeft) {\n <libs_ui-components-buttons-button\n [label]=\"labelLeft\"\n [type]=\"'button-link-primary'\"\n [classIconLeft]=\"'libs-ui-icon-chevron-right rotate-[180deg] before:text-[16px]'\"\n [classLabel]=\"'libs-ui-font-h4r'\"\n (outClick)=\"cancel()\" />\n }\n </div>\n\n @if (centerTemplate(); as centerTemplate) {\n <div class=\"{{ divideClassHeader()?.classButtonCenter || 'w-[40%]' }} flex items-center justify-center\">\n <ng-container *ngTemplateOutlet=\"centerTemplate\" />\n </div>\n } @else {\n <div class=\"{{ divideClassHeader()?.classButtonCenter || 'w-[40%]' }} flex items-center justify-center\">\n <libs_ui-components-popover\n type=\"text\"\n [config]=\"{ maxWidth: 250, zIndex: zIndex() + 1 }\"\n [classInclude]=\"'libs-ui-font-h2s'\"\n [innerHtml]=\"title() ? (title() | LibsUiPipesEscapeHtmlPipe) : '&mdash;'\" />\n @if (hasEdit(); as hasEdit) {\n <libs_ui-components-buttons-button\n [type]=\"'button-link-primary'\"\n (outClick)=\"handlerEdit()\"\n [iconOnlyType]=\"true\"\n [classIconLeft]=\"'libs-ui-icon-edit-line'\"\n [classInclude]=\"'ml-[4px]'\" />\n }\n @for (button of buttonCenter(); track button.key) {\n <div class=\"ml-[12px] flex items-center\">\n @if (button.key === 'button') {\n <libs_ui-components-buttons-button\n [label]=\"button.label || ''\"\n [classLabel]=\"(button.classLabel || '') + ' libs-ui-font-head-4s'\"\n [type]=\"button.type || 'button-primary'\"\n [classInclude]=\"button.classInclude || ''\"\n [classIconLeft]=\"button.classIconLeft || ''\"\n [classIconRight]=\"button.classIconRight || ''\"\n [popover]=\"button.popover || {}\"\n [disable]=\"button.disable || disable()\"\n [isPending]=\"button.isPending || false\"\n (outClick)=\"handlerClickButton(button)\" />\n }\n @if (button.key === 'button-status' && button.configButtonStatus) {\n <libs_ui-components-buttons-status\n [class]=\"button.classInclude\"\n [config]=\"button.configButtonStatus\" />\n }\n @if (button.key === 'switch') {\n <libs_ui-components-switch\n [active]=\"button.active || false\"\n [disable]=\"button.disable || disable()\"\n class=\"{{ button.classInclude }}\"\n (outSwitch)=\"handlerSwitch($event, button)\" />\n }\n @if (button.key === 'label' && button.labelConfig) {\n <libs_ui-components-label\n [classInclude]=\"button.labelConfig.classInclude + ' pb-0 text-white'\"\n [labelLeft]=\"button.labelConfig.labelLeft\"\n [labelLeftClass]=\"button.labelConfig.labelLeftClass\"\n [required]=\"button.labelConfig.required\"\n [description]=\"button.labelConfig.description\"\n [labelRight]=\"button.labelConfig.labelRight\"\n [labelRightClass]=\"button.labelConfig.labelRightClass\"\n [onlyShowCount]=\"button.labelConfig.onlyShowCount\"\n [buttonsLeft]=\"button.labelConfig.buttonsLeft\"\n [disableButtonsLeft]=\"button.labelConfig.disableButtonsLeft\"\n [buttonsRight]=\"button.labelConfig.buttonsRight\"\n [disableButtonsRight]=\"button.labelConfig.disableButtonsRight\"\n [hasToggle]=\"button.labelConfig.hasToggle\"\n [toggleActive]=\"button.labelConfig.toggleActive\"\n [toggleDisable]=\"button.labelConfig.toggleDisable\"\n [popover]=\"button.labelConfig.popover\"\n [iconPopoverClass]=\"button.labelConfig.iconPopoverClass\"\n [limitLength]=\"button.labelConfig.limitLength\"\n [buttonsDescription]=\"button.labelConfig.buttonsDescription\"\n [disableButtonsDescription]=\"button.labelConfig.disableButtonsDescription\"\n [buttonsDescriptionContainerClass]=\"button.labelConfig.buttonsDescriptionContainerClass\"\n [count]=\"button.labelConfig.count\" />\n }\n </div>\n }\n </div>\n }\n\n <div class=\"{{ divideClassHeader()?.classButtonRight || 'w-[35%]' }} flex justify-end items-center\">\n @for (button of buttonRight(); track button.key) {\n <div [class.ml-[12px]]=\"!$first\">\n @if (button.key === 'label' && button.labelConfig) {\n <libs_ui-components-label\n [classInclude]=\"button.labelConfig.classInclude + ' pb-0'\"\n [labelLeft]=\"button.labelConfig.labelLeft\"\n [labelLeftClass]=\"button.labelConfig.labelLeftClass\"\n [required]=\"button.labelConfig.required\"\n [description]=\"button.labelConfig.description\"\n [labelRight]=\"button.labelConfig.labelRight\"\n [labelRightClass]=\"button.labelConfig.labelRightClass\"\n [onlyShowCount]=\"button.labelConfig.onlyShowCount\"\n [buttonsLeft]=\"button.labelConfig.buttonsLeft\"\n [disableButtonsLeft]=\"button.labelConfig.disableButtonsLeft\"\n [buttonsRight]=\"button.labelConfig.buttonsRight\"\n [disableButtonsRight]=\"button.labelConfig.disableButtonsRight\"\n [hasToggle]=\"button.labelConfig.hasToggle\"\n [toggleActive]=\"button.labelConfig.toggleActive\"\n [toggleDisable]=\"button.labelConfig.toggleDisable\"\n [popover]=\"button.labelConfig.popover\"\n [iconPopoverClass]=\"button.labelConfig.iconPopoverClass\"\n [limitLength]=\"button.labelConfig.limitLength\"\n [buttonsDescription]=\"button.labelConfig.buttonsDescription\"\n [disableButtonsDescription]=\"button.labelConfig.disableButtonsDescription\"\n [buttonsDescriptionContainerClass]=\"button.labelConfig.buttonsDescriptionContainerClass\"\n [count]=\"button.labelConfig.count\" />\n }\n @if (button.key === 'switch') {\n <libs_ui-components-switch\n [active]=\"button.active || false\"\n [disable]=\"button.disable || disable()\"\n class=\"{{ button.classInclude }}\"\n (outSwitch)=\"handlerSwitch($event, button)\" />\n }\n @if (button.key === 'button') {\n <libs_ui-components-buttons-button\n [label]=\"button?.label || ''\"\n [classLabel]=\"(button.classLabel || '') + ' libs-ui-font-h4s'\"\n [type]=\"button.type || 'button-primary'\"\n [classInclude]=\"button.classInclude || ''\"\n [classIconLeft]=\"button.classIconLeft || ''\"\n [classIconRight]=\"button.classIconRight || ''\"\n [popover]=\"button.popover || {}\"\n [disable]=\"button.disable || disable()\"\n [isPending]=\"button.isPending || false\"\n [iconOnlyType]=\"button.iconOnlyType || false\"\n (outClick)=\"handlerClickButton(button)\" />\n }\n @if (button.key === 'line-space') {\n <div\n class=\"bg-[#666b79] w-[1px] h-[28px]\"\n [class]=\"button.classInclude\">\n &nbsp;\n </div>\n }\n </div>\n }\n @if (menuDropDownConfigs(); as menuDropDownConfigs) {\n <div class=\"ml-[12px]\">\n <libs_ui-components-dropdown\n [isNgContent]=\"true\"\n [zIndex]=\"zIndex() + 1\"\n [listConfig]=\"menuDropDownConfigs.listConfig\"\n [listHiddenInputSearch]=\"true\"\n [popoverCustomConfig]=\"menuDropDownConfigs.popoverCustomConfig\"\n (outFunctionsControl)=\"handlerControlDropdownMenu($event)\"\n (outSelectKey)=\"handlerSelectedKey($event)\">\n <libs_ui-components-buttons-button\n [classInclude]=\"'p-[8px]'\"\n [type]=\"'button-third'\"\n [iconOnlyType]=\"true\"\n [classIconLeft]=\"'libs-ui-icon-more-vertical text-[#333333] text-[12px]'\"\n [popover]=\"{ config: { content: 'i18n_4x_other_operations' } }\"\n [ignoreStopPropagationEvent]=\"true\" />\n </libs_ui-components-dropdown>\n </div>\n }\n @if (templateRight(); as templateRight) {\n <ng-container *ngTemplateOutlet=\"templateRight\" />\n }\n </div>\n </div>\n\n <!-- ===================== BODY (V2: Lazy Load ho\u1EB7c ng-content) ===================== -->\n @if (bodyConfig().getComponentOutlet; as getBodyComponentOutlet) {\n <!-- Lazy load mode -->\n <div [class]=\"'libs-ui-components-page_full-body ' + (bodyConfig().classInclude || '')\">\n @let constHtmlCompBody = undefined | LibsUiPipesCallFunctionInTemplatePipe: getBodyComponentOutlet : sectionData() : null : { valueIsEmpty: null } | async;\n @let constHtmlInputsBody = undefined | LibsUiPipesCallFunctionInTemplatePipe: bodyConfig().getDataComponentOutlet : sectionData() : null : { valueIsEmpty: null } | async;\n @if (constHtmlCompBody) {\n @defer {\n <ng-container *ngComponentOutlet=\"constHtmlCompBody; inputs: constHtmlInputsBody\" />\n } @loading {\n <libs_ui-components-skeleton [config]=\"resolvedSkeletonBody()\" />\n }\n } @else {\n <libs_ui-components-skeleton [config]=\"resolvedSkeletonBody()\" />\n }\n </div>\n }\n</div>\n", styles: ["@-webkit-keyframes animation-slide-to-left{0%{right:-200px;opacity:0}to{right:12px;opacity:1}}@keyframes animation-slide-to-left{0%{right:-200px;opacity:0}to{right:0;opacity:1}}.libs-ui-components-page_full{position:absolute;width:100vw;height:100vh;left:0;top:0;display:flex;flex-direction:column;animation:animation-slide-to-left ease-out .3s}.libs-ui-components-page_full .libs-ui-components-page_full-header{height:50px;padding:14px 16px;border-bottom:solid 1px #e6e7ea;background-color:#fff;width:100%;display:flex;align-items:center}.libs-ui-components-page_full .libs-ui-components-page_full-body{height:100%}\n"], dependencies: [{ kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: TranslateModule }, { 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", "dropdownTemplateRefNotSearchNoData", "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: LibsUiComponentsSwitchComponent, selector: "libs_ui-components-switch", inputs: ["size", "disable", "active"], outputs: ["activeChange", "outSwitch"] }, { 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: "component", type: LibsUiComponentsButtonsStatusComponent, selector: "libs_ui-components-buttons-status", inputs: ["config"] }, { 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: "component", type: LibsUiComponentsSkeletonComponent, selector: "libs_ui-components-skeleton", inputs: ["config"] }, { kind: "pipe", type: LibsUiPipesCallFunctionInTemplatePipe, name: "LibsUiPipesCallFunctionInTemplatePipe" }, { kind: "pipe", type: LibsUiPipesEscapeHtmlPipe, name: "LibsUiPipesEscapeHtmlPipe" }, { kind: "component", type: LibsUiComponentsLabelComponent, selector: "libs_ui-components-label", inputs: ["iconPopoverClass", "classInclude", "labelLeft", "labelLeftClass", "labelLeftBehindToggleButton", "popover", "required", "buttonsLeft", "disableButtonsLeft", "buttonsRight", "disableButtonsRight", "labelRight", "labelRightClass", "labelRightRequired", "hasToggle", "toggleSize", "toggleActive", "toggleDisable", "description", "descriptionClass", "buttonsDescription", "disableButtonsDescription", "buttonsDescriptionContainerClass", "onlyShowCount", "zIndexPopover", "timerDestroyPopover", "count", "limitLength"], outputs: ["outClickButton", "outSwitchEvent", "outLabelRightClick", "outLabelLeftClick"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, deferBlockDependencies: [() => [NgComponentOutlet]] });
141
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: LibsUiComponentsPagesTemplateFullScreenV2Component, isStandalone: true, selector: "libs_ui-components-pages_template_full_screen_v2", inputs: { classHeaderInclude: { classPropertyName: "classHeaderInclude", publicName: "classHeaderInclude", isSignal: true, isRequired: false, transformFunction: null }, labelLeft: { classPropertyName: "labelLeft", publicName: "labelLeft", isSignal: true, isRequired: false, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, buttonCenter: { classPropertyName: "buttonCenter", publicName: "buttonCenter", isSignal: true, isRequired: false, transformFunction: null }, buttonRight: { classPropertyName: "buttonRight", publicName: "buttonRight", isSignal: true, isRequired: false, transformFunction: null }, hasEdit: { classPropertyName: "hasEdit", publicName: "hasEdit", isSignal: true, isRequired: false, transformFunction: null }, menuDropDownConfigs: { classPropertyName: "menuDropDownConfigs", publicName: "menuDropDownConfigs", isSignal: true, isRequired: false, transformFunction: null }, zIndex: { classPropertyName: "zIndex", publicName: "zIndex", isSignal: true, isRequired: false, transformFunction: null }, ignoreClosePageFullEvent: { classPropertyName: "ignoreClosePageFullEvent", publicName: "ignoreClosePageFullEvent", isSignal: true, isRequired: false, transformFunction: null }, ignoreBackgroundColor: { classPropertyName: "ignoreBackgroundColor", publicName: "ignoreBackgroundColor", isSignal: true, isRequired: false, transformFunction: null }, divideClassHeader: { classPropertyName: "divideClassHeader", publicName: "divideClassHeader", isSignal: true, isRequired: false, transformFunction: null }, centerTemplate: { classPropertyName: "centerTemplate", publicName: "centerTemplate", isSignal: true, isRequired: false, transformFunction: null }, templateRight: { classPropertyName: "templateRight", publicName: "templateRight", isSignal: true, isRequired: false, transformFunction: null }, leftTemplate: { classPropertyName: "leftTemplate", publicName: "leftTemplate", isSignal: true, isRequired: false, transformFunction: null }, disable: { classPropertyName: "disable", publicName: "disable", isSignal: true, isRequired: false, transformFunction: null }, bodyConfig: { classPropertyName: "bodyConfig", publicName: "bodyConfig", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { outClose: "outClose", outEdit: "outEdit", outSelectedMenuDropdown: "outSelectedMenuDropdown", outClickButton: "outClickButton" }, ngImport: i0, template: "<div\n class=\"libs-ui-components-page_full overflow-hidden\"\n [style.zIndex]=\"zIndex()\"\n [style.background-color]=\"ignoreBackgroundColor() ? 'transparent' : '#f2f5f7'\">\n <!-- ===================== HEADER (gi\u1EEF nguy\u00EAn 100% t\u1EEB V1) ===================== -->\n <div [class]=\"'libs-ui-components-page_full-header ' + classHeaderInclude()\">\n <div class=\"{{ divideClassHeader()?.classButtonCancel || 'w-[25%]' }}\">\n @if (leftTemplate(); as leftTemplate) {\n <ng-container *ngTemplateOutlet=\"leftTemplate\" />\n }\n @if (labelLeft(); as labelLeft) {\n <libs_ui-components-buttons-button\n [label]=\"labelLeft\"\n [type]=\"'button-link-primary'\"\n [classIconLeft]=\"'libs-ui-icon-chevron-right rotate-[180deg] before:text-[16px]'\"\n [classLabel]=\"'libs-ui-font-h4r'\"\n (outClick)=\"cancel()\" />\n }\n </div>\n\n @if (centerTemplate(); as centerTemplate) {\n <div class=\"{{ divideClassHeader()?.classButtonCenter || 'w-[40%]' }} flex items-center justify-center\">\n <ng-container *ngTemplateOutlet=\"centerTemplate\" />\n </div>\n } @else {\n <div class=\"{{ divideClassHeader()?.classButtonCenter || 'w-[40%]' }} flex items-center justify-center\">\n <libs_ui-components-popover\n type=\"text\"\n [config]=\"{ maxWidth: 250, zIndex: zIndex() + 1 }\"\n [classInclude]=\"'libs-ui-font-h2s'\"\n [innerHtml]=\"title() ? (title() | LibsUiPipesEscapeHtmlPipe) : '&mdash;'\" />\n @if (hasEdit(); as hasEdit) {\n <libs_ui-components-buttons-button\n [type]=\"'button-link-primary'\"\n (outClick)=\"handlerEdit()\"\n [iconOnlyType]=\"true\"\n [classIconLeft]=\"'libs-ui-icon-edit-line'\"\n [classInclude]=\"'ml-[4px]'\" />\n }\n @for (button of buttonCenter(); track button.key) {\n <div class=\"ml-[12px] flex items-center\">\n @if (button.key === 'button') {\n <libs_ui-components-buttons-button\n [label]=\"button.label || ''\"\n [classLabel]=\"(button.classLabel || '') + ' libs-ui-font-head-4s'\"\n [type]=\"button.type || 'button-primary'\"\n [classInclude]=\"button.classInclude || ''\"\n [classIconLeft]=\"button.classIconLeft || ''\"\n [classIconRight]=\"button.classIconRight || ''\"\n [popover]=\"button.popover || {}\"\n [disable]=\"button.disable || disable()\"\n [isPending]=\"button.isPending || false\"\n (outClick)=\"handlerClickButton(button)\" />\n }\n @if (button.key === 'button-status' && button.configButtonStatus) {\n <libs_ui-components-buttons-status\n [class]=\"button.classInclude\"\n [config]=\"button.configButtonStatus\" />\n }\n @if (button.key === 'switch') {\n <libs_ui-components-switch\n [active]=\"button.active || false\"\n [disable]=\"button.disable || disable()\"\n class=\"{{ button.classInclude }}\"\n (outSwitch)=\"handlerSwitch($event, button)\" />\n }\n @if (button.key === 'label' && button.labelConfig) {\n <libs_ui-components-label\n [classInclude]=\"button.labelConfig.classInclude + ' pb-0 text-white'\"\n [labelLeft]=\"button.labelConfig.labelLeft\"\n [labelLeftClass]=\"button.labelConfig.labelLeftClass\"\n [required]=\"button.labelConfig.required\"\n [description]=\"button.labelConfig.description\"\n [labelRight]=\"button.labelConfig.labelRight\"\n [labelRightClass]=\"button.labelConfig.labelRightClass\"\n [onlyShowCount]=\"button.labelConfig.onlyShowCount\"\n [buttonsLeft]=\"button.labelConfig.buttonsLeft\"\n [disableButtonsLeft]=\"button.labelConfig.disableButtonsLeft\"\n [buttonsRight]=\"button.labelConfig.buttonsRight\"\n [disableButtonsRight]=\"button.labelConfig.disableButtonsRight\"\n [hasToggle]=\"button.labelConfig.hasToggle\"\n [toggleActive]=\"button.labelConfig.toggleActive\"\n [toggleDisable]=\"button.labelConfig.toggleDisable\"\n [popover]=\"button.labelConfig.popover\"\n [iconPopoverClass]=\"button.labelConfig.iconPopoverClass\"\n [limitLength]=\"button.labelConfig.limitLength\"\n [buttonsDescription]=\"button.labelConfig.buttonsDescription\"\n [disableButtonsDescription]=\"button.labelConfig.disableButtonsDescription\"\n [buttonsDescriptionContainerClass]=\"button.labelConfig.buttonsDescriptionContainerClass\"\n [count]=\"button.labelConfig.count\" />\n }\n </div>\n }\n </div>\n }\n\n <div class=\"{{ divideClassHeader()?.classButtonRight || 'w-[35%]' }} flex justify-end items-center\">\n @for (button of buttonRight(); track button.key) {\n <div [class.ml-[12px]]=\"!$first\">\n @if (button.key === 'label' && button.labelConfig) {\n <libs_ui-components-label\n [classInclude]=\"button.labelConfig.classInclude + ' pb-0'\"\n [labelLeft]=\"button.labelConfig.labelLeft\"\n [labelLeftClass]=\"button.labelConfig.labelLeftClass\"\n [required]=\"button.labelConfig.required\"\n [description]=\"button.labelConfig.description\"\n [labelRight]=\"button.labelConfig.labelRight\"\n [labelRightClass]=\"button.labelConfig.labelRightClass\"\n [onlyShowCount]=\"button.labelConfig.onlyShowCount\"\n [buttonsLeft]=\"button.labelConfig.buttonsLeft\"\n [disableButtonsLeft]=\"button.labelConfig.disableButtonsLeft\"\n [buttonsRight]=\"button.labelConfig.buttonsRight\"\n [disableButtonsRight]=\"button.labelConfig.disableButtonsRight\"\n [hasToggle]=\"button.labelConfig.hasToggle\"\n [toggleActive]=\"button.labelConfig.toggleActive\"\n [toggleDisable]=\"button.labelConfig.toggleDisable\"\n [popover]=\"button.labelConfig.popover\"\n [iconPopoverClass]=\"button.labelConfig.iconPopoverClass\"\n [limitLength]=\"button.labelConfig.limitLength\"\n [buttonsDescription]=\"button.labelConfig.buttonsDescription\"\n [disableButtonsDescription]=\"button.labelConfig.disableButtonsDescription\"\n [buttonsDescriptionContainerClass]=\"button.labelConfig.buttonsDescriptionContainerClass\"\n [count]=\"button.labelConfig.count\" />\n }\n @if (button.key === 'switch') {\n <libs_ui-components-switch\n [active]=\"button.active || false\"\n [disable]=\"button.disable || disable()\"\n class=\"{{ button.classInclude }}\"\n (outSwitch)=\"handlerSwitch($event, button)\" />\n }\n @if (button.key === 'button') {\n <libs_ui-components-buttons-button\n [label]=\"button?.label || ''\"\n [classLabel]=\"(button.classLabel || '') + ' libs-ui-font-h4s'\"\n [type]=\"button.type || 'button-primary'\"\n [classInclude]=\"button.classInclude || ''\"\n [classIconLeft]=\"button.classIconLeft || ''\"\n [classIconRight]=\"button.classIconRight || ''\"\n [popover]=\"button.popover || {}\"\n [disable]=\"button.disable || disable()\"\n [isPending]=\"button.isPending || false\"\n [iconOnlyType]=\"button.iconOnlyType || false\"\n (outClick)=\"handlerClickButton(button)\" />\n }\n @if (button.key === 'line-space') {\n <div\n class=\"bg-[#666b79] w-[1px] h-[28px]\"\n [class]=\"button.classInclude\">\n &nbsp;\n </div>\n }\n </div>\n }\n @if (menuDropDownConfigs(); as menuDropDownConfigs) {\n <div class=\"ml-[12px]\">\n <libs_ui-components-dropdown\n [isNgContent]=\"true\"\n [zIndex]=\"zIndex() + 1\"\n [listConfig]=\"menuDropDownConfigs.listConfig\"\n [listHiddenInputSearch]=\"true\"\n [popoverCustomConfig]=\"menuDropDownConfigs.popoverCustomConfig\"\n (outFunctionsControl)=\"handlerControlDropdownMenu($event)\"\n (outSelectKey)=\"handlerSelectedKey($event)\">\n <libs_ui-components-buttons-button\n [classInclude]=\"'p-[8px]'\"\n [type]=\"'button-third'\"\n [iconOnlyType]=\"true\"\n [classIconLeft]=\"'libs-ui-icon-more-vertical text-[#333333] text-[12px]'\"\n [popover]=\"{ config: { content: 'i18n_4x_other_operations' } }\"\n [ignoreStopPropagationEvent]=\"true\" />\n </libs_ui-components-dropdown>\n </div>\n }\n @if (templateRight(); as templateRight) {\n <ng-container *ngTemplateOutlet=\"templateRight\" />\n }\n </div>\n </div>\n\n <!-- ===================== BODY (V2: Lazy Load ho\u1EB7c ng-content) ===================== -->\n @if (bodyConfig().getComponentOutlet; as getBodyComponentOutlet) {\n <!-- Lazy load mode -->\n <div [class]=\"'libs-ui-components-page_full-body ' + (bodyConfig().classInclude || '')\">\n @let constHtmlCompBody = undefined | LibsUiPipesCallFunctionInTemplatePipe: getBodyComponentOutlet : sectionData() : null : pipeEmptyConfig | async;\n @let constHtmlInputsBody = undefined | LibsUiPipesCallFunctionInTemplatePipe: bodyConfig().getDataComponentOutlet : sectionData() : null : pipeEmptyConfig | async;\n @if (constHtmlCompBody) {\n <ng-container *ngComponentOutlet=\"constHtmlCompBody; inputs: constHtmlInputsBody\" />\n } @else {\n <libs_ui-components-skeleton [config]=\"resolvedSkeletonBody()\" />\n }\n </div>\n }\n</div>\n", styles: ["@-webkit-keyframes animation-slide-to-left{0%{right:-200px;opacity:0}to{right:12px;opacity:1}}@keyframes animation-slide-to-left{0%{right:-200px;opacity:0}to{right:0;opacity:1}}.libs-ui-components-page_full{position:absolute;width:100vw;height:100vh;left:0;top:0;display:flex;flex-direction:column;animation:animation-slide-to-left ease-out .3s}.libs-ui-components-page_full .libs-ui-components-page_full-header{height:50px;padding:14px 16px;border-bottom:solid 1px #e6e7ea;background-color:#fff;width:100%;display:flex;align-items:center}.libs-ui-components-page_full .libs-ui-components-page_full-body{height:100%}\n"], dependencies: [{ kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "directive", type: NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: TranslateModule }, { 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", "dropdownTemplateRefNotSearchNoData", "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: LibsUiComponentsSwitchComponent, selector: "libs_ui-components-switch", inputs: ["size", "disable", "active"], outputs: ["activeChange", "outSwitch"] }, { 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: "component", type: LibsUiComponentsButtonsStatusComponent, selector: "libs_ui-components-buttons-status", inputs: ["config"] }, { 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: "component", type: LibsUiComponentsSkeletonComponent, selector: "libs_ui-components-skeleton", inputs: ["config"] }, { kind: "pipe", type: LibsUiPipesCallFunctionInTemplatePipe, name: "LibsUiPipesCallFunctionInTemplatePipe" }, { kind: "pipe", type: LibsUiPipesEscapeHtmlPipe, name: "LibsUiPipesEscapeHtmlPipe" }, { kind: "component", type: LibsUiComponentsLabelComponent, selector: "libs_ui-components-label", inputs: ["iconPopoverClass", "classInclude", "labelLeft", "labelLeftClass", "labelLeftBehindToggleButton", "popover", "required", "buttonsLeft", "disableButtonsLeft", "buttonsRight", "disableButtonsRight", "labelRight", "labelRightClass", "labelRightRequired", "hasToggle", "toggleSize", "toggleActive", "toggleDisable", "description", "descriptionClass", "buttonsDescription", "disableButtonsDescription", "buttonsDescriptionContainerClass", "onlyShowCount", "zIndexPopover", "timerDestroyPopover", "count", "limitLength"], outputs: ["outClickButton", "outSwitchEvent", "outLabelRightClick", "outLabelLeftClick"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
132
142
  }
133
143
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiComponentsPagesTemplateFullScreenV2Component, decorators: [{
134
144
  type: Component,
@@ -146,6 +156,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
146
156
  LibsUiPipesCallFunctionInTemplatePipe,
147
157
  LibsUiPipesEscapeHtmlPipe,
148
158
  LibsUiComponentsLabelComponent,
149
- ], template: "<div\n class=\"libs-ui-components-page_full overflow-hidden\"\n [style.zIndex]=\"zIndex()\"\n [style.background-color]=\"ignoreBackgroundColor() ? 'transparent' : '#f2f5f7'\">\n <!-- ===================== HEADER (gi\u1EEF nguy\u00EAn 100% t\u1EEB V1) ===================== -->\n <div [class]=\"'libs-ui-components-page_full-header ' + classHeaderInclude()\">\n <div class=\"{{ divideClassHeader()?.classButtonCancel || 'w-[25%]' }}\">\n @if (leftTemplate(); as leftTemplate) {\n <ng-container *ngTemplateOutlet=\"leftTemplate\" />\n }\n @if (labelLeft(); as labelLeft) {\n <libs_ui-components-buttons-button\n [label]=\"labelLeft\"\n [type]=\"'button-link-primary'\"\n [classIconLeft]=\"'libs-ui-icon-chevron-right rotate-[180deg] before:text-[16px]'\"\n [classLabel]=\"'libs-ui-font-h4r'\"\n (outClick)=\"cancel()\" />\n }\n </div>\n\n @if (centerTemplate(); as centerTemplate) {\n <div class=\"{{ divideClassHeader()?.classButtonCenter || 'w-[40%]' }} flex items-center justify-center\">\n <ng-container *ngTemplateOutlet=\"centerTemplate\" />\n </div>\n } @else {\n <div class=\"{{ divideClassHeader()?.classButtonCenter || 'w-[40%]' }} flex items-center justify-center\">\n <libs_ui-components-popover\n type=\"text\"\n [config]=\"{ maxWidth: 250, zIndex: zIndex() + 1 }\"\n [classInclude]=\"'libs-ui-font-h2s'\"\n [innerHtml]=\"title() ? (title() | LibsUiPipesEscapeHtmlPipe) : '&mdash;'\" />\n @if (hasEdit(); as hasEdit) {\n <libs_ui-components-buttons-button\n [type]=\"'button-link-primary'\"\n (outClick)=\"handlerEdit()\"\n [iconOnlyType]=\"true\"\n [classIconLeft]=\"'libs-ui-icon-edit-line'\"\n [classInclude]=\"'ml-[4px]'\" />\n }\n @for (button of buttonCenter(); track button.key) {\n <div class=\"ml-[12px] flex items-center\">\n @if (button.key === 'button') {\n <libs_ui-components-buttons-button\n [label]=\"button.label || ''\"\n [classLabel]=\"(button.classLabel || '') + ' libs-ui-font-head-4s'\"\n [type]=\"button.type || 'button-primary'\"\n [classInclude]=\"button.classInclude || ''\"\n [classIconLeft]=\"button.classIconLeft || ''\"\n [classIconRight]=\"button.classIconRight || ''\"\n [popover]=\"button.popover || {}\"\n [disable]=\"button.disable || disable()\"\n [isPending]=\"button.isPending || false\"\n (outClick)=\"handlerClickButton(button)\" />\n }\n @if (button.key === 'button-status' && button.configButtonStatus) {\n <libs_ui-components-buttons-status\n [class]=\"button.classInclude\"\n [config]=\"button.configButtonStatus\" />\n }\n @if (button.key === 'switch') {\n <libs_ui-components-switch\n [active]=\"button.active || false\"\n [disable]=\"button.disable || disable()\"\n class=\"{{ button.classInclude }}\"\n (outSwitch)=\"handlerSwitch($event, button)\" />\n }\n @if (button.key === 'label' && button.labelConfig) {\n <libs_ui-components-label\n [classInclude]=\"button.labelConfig.classInclude + ' pb-0 text-white'\"\n [labelLeft]=\"button.labelConfig.labelLeft\"\n [labelLeftClass]=\"button.labelConfig.labelLeftClass\"\n [required]=\"button.labelConfig.required\"\n [description]=\"button.labelConfig.description\"\n [labelRight]=\"button.labelConfig.labelRight\"\n [labelRightClass]=\"button.labelConfig.labelRightClass\"\n [onlyShowCount]=\"button.labelConfig.onlyShowCount\"\n [buttonsLeft]=\"button.labelConfig.buttonsLeft\"\n [disableButtonsLeft]=\"button.labelConfig.disableButtonsLeft\"\n [buttonsRight]=\"button.labelConfig.buttonsRight\"\n [disableButtonsRight]=\"button.labelConfig.disableButtonsRight\"\n [hasToggle]=\"button.labelConfig.hasToggle\"\n [toggleActive]=\"button.labelConfig.toggleActive\"\n [toggleDisable]=\"button.labelConfig.toggleDisable\"\n [popover]=\"button.labelConfig.popover\"\n [iconPopoverClass]=\"button.labelConfig.iconPopoverClass\"\n [limitLength]=\"button.labelConfig.limitLength\"\n [buttonsDescription]=\"button.labelConfig.buttonsDescription\"\n [disableButtonsDescription]=\"button.labelConfig.disableButtonsDescription\"\n [buttonsDescriptionContainerClass]=\"button.labelConfig.buttonsDescriptionContainerClass\"\n [count]=\"button.labelConfig.count\" />\n }\n </div>\n }\n </div>\n }\n\n <div class=\"{{ divideClassHeader()?.classButtonRight || 'w-[35%]' }} flex justify-end items-center\">\n @for (button of buttonRight(); track button.key) {\n <div [class.ml-[12px]]=\"!$first\">\n @if (button.key === 'label' && button.labelConfig) {\n <libs_ui-components-label\n [classInclude]=\"button.labelConfig.classInclude + ' pb-0'\"\n [labelLeft]=\"button.labelConfig.labelLeft\"\n [labelLeftClass]=\"button.labelConfig.labelLeftClass\"\n [required]=\"button.labelConfig.required\"\n [description]=\"button.labelConfig.description\"\n [labelRight]=\"button.labelConfig.labelRight\"\n [labelRightClass]=\"button.labelConfig.labelRightClass\"\n [onlyShowCount]=\"button.labelConfig.onlyShowCount\"\n [buttonsLeft]=\"button.labelConfig.buttonsLeft\"\n [disableButtonsLeft]=\"button.labelConfig.disableButtonsLeft\"\n [buttonsRight]=\"button.labelConfig.buttonsRight\"\n [disableButtonsRight]=\"button.labelConfig.disableButtonsRight\"\n [hasToggle]=\"button.labelConfig.hasToggle\"\n [toggleActive]=\"button.labelConfig.toggleActive\"\n [toggleDisable]=\"button.labelConfig.toggleDisable\"\n [popover]=\"button.labelConfig.popover\"\n [iconPopoverClass]=\"button.labelConfig.iconPopoverClass\"\n [limitLength]=\"button.labelConfig.limitLength\"\n [buttonsDescription]=\"button.labelConfig.buttonsDescription\"\n [disableButtonsDescription]=\"button.labelConfig.disableButtonsDescription\"\n [buttonsDescriptionContainerClass]=\"button.labelConfig.buttonsDescriptionContainerClass\"\n [count]=\"button.labelConfig.count\" />\n }\n @if (button.key === 'switch') {\n <libs_ui-components-switch\n [active]=\"button.active || false\"\n [disable]=\"button.disable || disable()\"\n class=\"{{ button.classInclude }}\"\n (outSwitch)=\"handlerSwitch($event, button)\" />\n }\n @if (button.key === 'button') {\n <libs_ui-components-buttons-button\n [label]=\"button?.label || ''\"\n [classLabel]=\"(button.classLabel || '') + ' libs-ui-font-h4s'\"\n [type]=\"button.type || 'button-primary'\"\n [classInclude]=\"button.classInclude || ''\"\n [classIconLeft]=\"button.classIconLeft || ''\"\n [classIconRight]=\"button.classIconRight || ''\"\n [popover]=\"button.popover || {}\"\n [disable]=\"button.disable || disable()\"\n [isPending]=\"button.isPending || false\"\n [iconOnlyType]=\"button.iconOnlyType || false\"\n (outClick)=\"handlerClickButton(button)\" />\n }\n @if (button.key === 'line-space') {\n <div\n class=\"bg-[#666b79] w-[1px] h-[28px]\"\n [class]=\"button.classInclude\">\n &nbsp;\n </div>\n }\n </div>\n }\n @if (menuDropDownConfigs(); as menuDropDownConfigs) {\n <div class=\"ml-[12px]\">\n <libs_ui-components-dropdown\n [isNgContent]=\"true\"\n [zIndex]=\"zIndex() + 1\"\n [listConfig]=\"menuDropDownConfigs.listConfig\"\n [listHiddenInputSearch]=\"true\"\n [popoverCustomConfig]=\"menuDropDownConfigs.popoverCustomConfig\"\n (outFunctionsControl)=\"handlerControlDropdownMenu($event)\"\n (outSelectKey)=\"handlerSelectedKey($event)\">\n <libs_ui-components-buttons-button\n [classInclude]=\"'p-[8px]'\"\n [type]=\"'button-third'\"\n [iconOnlyType]=\"true\"\n [classIconLeft]=\"'libs-ui-icon-more-vertical text-[#333333] text-[12px]'\"\n [popover]=\"{ config: { content: 'i18n_4x_other_operations' } }\"\n [ignoreStopPropagationEvent]=\"true\" />\n </libs_ui-components-dropdown>\n </div>\n }\n @if (templateRight(); as templateRight) {\n <ng-container *ngTemplateOutlet=\"templateRight\" />\n }\n </div>\n </div>\n\n <!-- ===================== BODY (V2: Lazy Load ho\u1EB7c ng-content) ===================== -->\n @if (bodyConfig().getComponentOutlet; as getBodyComponentOutlet) {\n <!-- Lazy load mode -->\n <div [class]=\"'libs-ui-components-page_full-body ' + (bodyConfig().classInclude || '')\">\n @let constHtmlCompBody = undefined | LibsUiPipesCallFunctionInTemplatePipe: getBodyComponentOutlet : sectionData() : null : { valueIsEmpty: null } | async;\n @let constHtmlInputsBody = undefined | LibsUiPipesCallFunctionInTemplatePipe: bodyConfig().getDataComponentOutlet : sectionData() : null : { valueIsEmpty: null } | async;\n @if (constHtmlCompBody) {\n @defer {\n <ng-container *ngComponentOutlet=\"constHtmlCompBody; inputs: constHtmlInputsBody\" />\n } @loading {\n <libs_ui-components-skeleton [config]=\"resolvedSkeletonBody()\" />\n }\n } @else {\n <libs_ui-components-skeleton [config]=\"resolvedSkeletonBody()\" />\n }\n </div>\n }\n</div>\n", styles: ["@-webkit-keyframes animation-slide-to-left{0%{right:-200px;opacity:0}to{right:12px;opacity:1}}@keyframes animation-slide-to-left{0%{right:-200px;opacity:0}to{right:0;opacity:1}}.libs-ui-components-page_full{position:absolute;width:100vw;height:100vh;left:0;top:0;display:flex;flex-direction:column;animation:animation-slide-to-left ease-out .3s}.libs-ui-components-page_full .libs-ui-components-page_full-header{height:50px;padding:14px 16px;border-bottom:solid 1px #e6e7ea;background-color:#fff;width:100%;display:flex;align-items:center}.libs-ui-components-page_full .libs-ui-components-page_full-body{height:100%}\n"] }]
159
+ ], template: "<div\n class=\"libs-ui-components-page_full overflow-hidden\"\n [style.zIndex]=\"zIndex()\"\n [style.background-color]=\"ignoreBackgroundColor() ? 'transparent' : '#f2f5f7'\">\n <!-- ===================== HEADER (gi\u1EEF nguy\u00EAn 100% t\u1EEB V1) ===================== -->\n <div [class]=\"'libs-ui-components-page_full-header ' + classHeaderInclude()\">\n <div class=\"{{ divideClassHeader()?.classButtonCancel || 'w-[25%]' }}\">\n @if (leftTemplate(); as leftTemplate) {\n <ng-container *ngTemplateOutlet=\"leftTemplate\" />\n }\n @if (labelLeft(); as labelLeft) {\n <libs_ui-components-buttons-button\n [label]=\"labelLeft\"\n [type]=\"'button-link-primary'\"\n [classIconLeft]=\"'libs-ui-icon-chevron-right rotate-[180deg] before:text-[16px]'\"\n [classLabel]=\"'libs-ui-font-h4r'\"\n (outClick)=\"cancel()\" />\n }\n </div>\n\n @if (centerTemplate(); as centerTemplate) {\n <div class=\"{{ divideClassHeader()?.classButtonCenter || 'w-[40%]' }} flex items-center justify-center\">\n <ng-container *ngTemplateOutlet=\"centerTemplate\" />\n </div>\n } @else {\n <div class=\"{{ divideClassHeader()?.classButtonCenter || 'w-[40%]' }} flex items-center justify-center\">\n <libs_ui-components-popover\n type=\"text\"\n [config]=\"{ maxWidth: 250, zIndex: zIndex() + 1 }\"\n [classInclude]=\"'libs-ui-font-h2s'\"\n [innerHtml]=\"title() ? (title() | LibsUiPipesEscapeHtmlPipe) : '&mdash;'\" />\n @if (hasEdit(); as hasEdit) {\n <libs_ui-components-buttons-button\n [type]=\"'button-link-primary'\"\n (outClick)=\"handlerEdit()\"\n [iconOnlyType]=\"true\"\n [classIconLeft]=\"'libs-ui-icon-edit-line'\"\n [classInclude]=\"'ml-[4px]'\" />\n }\n @for (button of buttonCenter(); track button.key) {\n <div class=\"ml-[12px] flex items-center\">\n @if (button.key === 'button') {\n <libs_ui-components-buttons-button\n [label]=\"button.label || ''\"\n [classLabel]=\"(button.classLabel || '') + ' libs-ui-font-head-4s'\"\n [type]=\"button.type || 'button-primary'\"\n [classInclude]=\"button.classInclude || ''\"\n [classIconLeft]=\"button.classIconLeft || ''\"\n [classIconRight]=\"button.classIconRight || ''\"\n [popover]=\"button.popover || {}\"\n [disable]=\"button.disable || disable()\"\n [isPending]=\"button.isPending || false\"\n (outClick)=\"handlerClickButton(button)\" />\n }\n @if (button.key === 'button-status' && button.configButtonStatus) {\n <libs_ui-components-buttons-status\n [class]=\"button.classInclude\"\n [config]=\"button.configButtonStatus\" />\n }\n @if (button.key === 'switch') {\n <libs_ui-components-switch\n [active]=\"button.active || false\"\n [disable]=\"button.disable || disable()\"\n class=\"{{ button.classInclude }}\"\n (outSwitch)=\"handlerSwitch($event, button)\" />\n }\n @if (button.key === 'label' && button.labelConfig) {\n <libs_ui-components-label\n [classInclude]=\"button.labelConfig.classInclude + ' pb-0 text-white'\"\n [labelLeft]=\"button.labelConfig.labelLeft\"\n [labelLeftClass]=\"button.labelConfig.labelLeftClass\"\n [required]=\"button.labelConfig.required\"\n [description]=\"button.labelConfig.description\"\n [labelRight]=\"button.labelConfig.labelRight\"\n [labelRightClass]=\"button.labelConfig.labelRightClass\"\n [onlyShowCount]=\"button.labelConfig.onlyShowCount\"\n [buttonsLeft]=\"button.labelConfig.buttonsLeft\"\n [disableButtonsLeft]=\"button.labelConfig.disableButtonsLeft\"\n [buttonsRight]=\"button.labelConfig.buttonsRight\"\n [disableButtonsRight]=\"button.labelConfig.disableButtonsRight\"\n [hasToggle]=\"button.labelConfig.hasToggle\"\n [toggleActive]=\"button.labelConfig.toggleActive\"\n [toggleDisable]=\"button.labelConfig.toggleDisable\"\n [popover]=\"button.labelConfig.popover\"\n [iconPopoverClass]=\"button.labelConfig.iconPopoverClass\"\n [limitLength]=\"button.labelConfig.limitLength\"\n [buttonsDescription]=\"button.labelConfig.buttonsDescription\"\n [disableButtonsDescription]=\"button.labelConfig.disableButtonsDescription\"\n [buttonsDescriptionContainerClass]=\"button.labelConfig.buttonsDescriptionContainerClass\"\n [count]=\"button.labelConfig.count\" />\n }\n </div>\n }\n </div>\n }\n\n <div class=\"{{ divideClassHeader()?.classButtonRight || 'w-[35%]' }} flex justify-end items-center\">\n @for (button of buttonRight(); track button.key) {\n <div [class.ml-[12px]]=\"!$first\">\n @if (button.key === 'label' && button.labelConfig) {\n <libs_ui-components-label\n [classInclude]=\"button.labelConfig.classInclude + ' pb-0'\"\n [labelLeft]=\"button.labelConfig.labelLeft\"\n [labelLeftClass]=\"button.labelConfig.labelLeftClass\"\n [required]=\"button.labelConfig.required\"\n [description]=\"button.labelConfig.description\"\n [labelRight]=\"button.labelConfig.labelRight\"\n [labelRightClass]=\"button.labelConfig.labelRightClass\"\n [onlyShowCount]=\"button.labelConfig.onlyShowCount\"\n [buttonsLeft]=\"button.labelConfig.buttonsLeft\"\n [disableButtonsLeft]=\"button.labelConfig.disableButtonsLeft\"\n [buttonsRight]=\"button.labelConfig.buttonsRight\"\n [disableButtonsRight]=\"button.labelConfig.disableButtonsRight\"\n [hasToggle]=\"button.labelConfig.hasToggle\"\n [toggleActive]=\"button.labelConfig.toggleActive\"\n [toggleDisable]=\"button.labelConfig.toggleDisable\"\n [popover]=\"button.labelConfig.popover\"\n [iconPopoverClass]=\"button.labelConfig.iconPopoverClass\"\n [limitLength]=\"button.labelConfig.limitLength\"\n [buttonsDescription]=\"button.labelConfig.buttonsDescription\"\n [disableButtonsDescription]=\"button.labelConfig.disableButtonsDescription\"\n [buttonsDescriptionContainerClass]=\"button.labelConfig.buttonsDescriptionContainerClass\"\n [count]=\"button.labelConfig.count\" />\n }\n @if (button.key === 'switch') {\n <libs_ui-components-switch\n [active]=\"button.active || false\"\n [disable]=\"button.disable || disable()\"\n class=\"{{ button.classInclude }}\"\n (outSwitch)=\"handlerSwitch($event, button)\" />\n }\n @if (button.key === 'button') {\n <libs_ui-components-buttons-button\n [label]=\"button?.label || ''\"\n [classLabel]=\"(button.classLabel || '') + ' libs-ui-font-h4s'\"\n [type]=\"button.type || 'button-primary'\"\n [classInclude]=\"button.classInclude || ''\"\n [classIconLeft]=\"button.classIconLeft || ''\"\n [classIconRight]=\"button.classIconRight || ''\"\n [popover]=\"button.popover || {}\"\n [disable]=\"button.disable || disable()\"\n [isPending]=\"button.isPending || false\"\n [iconOnlyType]=\"button.iconOnlyType || false\"\n (outClick)=\"handlerClickButton(button)\" />\n }\n @if (button.key === 'line-space') {\n <div\n class=\"bg-[#666b79] w-[1px] h-[28px]\"\n [class]=\"button.classInclude\">\n &nbsp;\n </div>\n }\n </div>\n }\n @if (menuDropDownConfigs(); as menuDropDownConfigs) {\n <div class=\"ml-[12px]\">\n <libs_ui-components-dropdown\n [isNgContent]=\"true\"\n [zIndex]=\"zIndex() + 1\"\n [listConfig]=\"menuDropDownConfigs.listConfig\"\n [listHiddenInputSearch]=\"true\"\n [popoverCustomConfig]=\"menuDropDownConfigs.popoverCustomConfig\"\n (outFunctionsControl)=\"handlerControlDropdownMenu($event)\"\n (outSelectKey)=\"handlerSelectedKey($event)\">\n <libs_ui-components-buttons-button\n [classInclude]=\"'p-[8px]'\"\n [type]=\"'button-third'\"\n [iconOnlyType]=\"true\"\n [classIconLeft]=\"'libs-ui-icon-more-vertical text-[#333333] text-[12px]'\"\n [popover]=\"{ config: { content: 'i18n_4x_other_operations' } }\"\n [ignoreStopPropagationEvent]=\"true\" />\n </libs_ui-components-dropdown>\n </div>\n }\n @if (templateRight(); as templateRight) {\n <ng-container *ngTemplateOutlet=\"templateRight\" />\n }\n </div>\n </div>\n\n <!-- ===================== BODY (V2: Lazy Load ho\u1EB7c ng-content) ===================== -->\n @if (bodyConfig().getComponentOutlet; as getBodyComponentOutlet) {\n <!-- Lazy load mode -->\n <div [class]=\"'libs-ui-components-page_full-body ' + (bodyConfig().classInclude || '')\">\n @let constHtmlCompBody = undefined | LibsUiPipesCallFunctionInTemplatePipe: getBodyComponentOutlet : sectionData() : null : pipeEmptyConfig | async;\n @let constHtmlInputsBody = undefined | LibsUiPipesCallFunctionInTemplatePipe: bodyConfig().getDataComponentOutlet : sectionData() : null : pipeEmptyConfig | async;\n @if (constHtmlCompBody) {\n <ng-container *ngComponentOutlet=\"constHtmlCompBody; inputs: constHtmlInputsBody\" />\n } @else {\n <libs_ui-components-skeleton [config]=\"resolvedSkeletonBody()\" />\n }\n </div>\n }\n</div>\n", styles: ["@-webkit-keyframes animation-slide-to-left{0%{right:-200px;opacity:0}to{right:12px;opacity:1}}@keyframes animation-slide-to-left{0%{right:-200px;opacity:0}to{right:0;opacity:1}}.libs-ui-components-page_full{position:absolute;width:100vw;height:100vh;left:0;top:0;display:flex;flex-direction:column;animation:animation-slide-to-left ease-out .3s}.libs-ui-components-page_full .libs-ui-components-page_full-header{height:50px;padding:14px 16px;border-bottom:solid 1px #e6e7ea;background-color:#fff;width:100%;display:flex;align-items:center}.libs-ui-components-page_full .libs-ui-components-page_full-body{height:100%}\n"] }]
150
160
  }] });
151
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnVsbC1zY3JlZW4tdjIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL3BhZ2VzLXRlbXBsYXRlL2Z1bGwtc2NyZWVuL3NyYy9mdWxsLXNjcmVlbi12Mi9mdWxsLXNjcmVlbi12Mi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvcGFnZXMtdGVtcGxhdGUvZnVsbC1zY3JlZW4vc3JjL2Z1bGwtc2NyZWVuLXYyL2Z1bGwtc2NyZWVuLXYyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsaUJBQWlCLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNqRixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBcUIsTUFBTSxFQUFVLE1BQU0sRUFBZSxNQUFNLGVBQWUsQ0FBQztBQUNoSyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsc0NBQXNDLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUM1RixPQUFPLEVBQUUsc0NBQXNDLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUM1RixPQUFPLEVBQTRELGlDQUFpQyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDM0ksT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDM0UsT0FBTyxFQUFFLGdDQUFnQyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDL0UsT0FBTyxFQUFtQixpQ0FBaUMsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2xHLE9BQU8sRUFBZ0IsK0JBQStCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUUzRixPQUFPLEVBQUUscUNBQXFD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RDs0RkFBbEQsa0RBQWtELDQvRUM5Qy9ELDBzVUFzTUEsK3BCRHZLSSxTQUFTLDhDQUVULGdCQUFnQixtSkFDaEIsZUFBZSwrQkFDZixpQ0FBaUMsdTNEQUNqQywrQkFBK0IscUpBQy9CLHNDQUFzQyxzakJBQ3RDLHNDQUFzQyxrR0FDdEMsZ0NBQWdDLG9nQkFDaEMsaUNBQWlDLHVGQUNqQyxxQ0FBcUMseUVBQ3JDLHlCQUF5QixrRUFDekIsOEJBQThCLHN1QkFYOUIsaUJBQWlCOzs0RkFjUixrREFBa0Q7a0JBdkI5RCxTQUFTOytCQUVFLGtEQUFrRCxjQUdoRCxJQUFJLG1CQUNDLHVCQUF1QixDQUFDLE1BQU0sV0FDdEM7d0JBQ1AsU0FBUzt3QkFDVCxpQkFBaUI7d0JBQ2pCLGdCQUFnQjt3QkFDaEIsZUFBZTt3QkFDZixpQ0FBaUM7d0JBQ2pDLCtCQUErQjt3QkFDL0Isc0NBQXNDO3dCQUN0QyxzQ0FBc0M7d0JBQ3RDLGdDQUFnQzt3QkFDaEMsaUNBQWlDO3dCQUNqQyxxQ0FBcUM7d0JBQ3JDLHlCQUF5Qjt3QkFDekIsOEJBQThCO3FCQUMvQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFzeW5jUGlwZSwgTmdDb21wb25lbnRPdXRsZXQsIE5nVGVtcGxhdGVPdXRsZXQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgY29tcHV0ZWQsIERlc3Ryb3lSZWYsIGluamVjdCwgaW5wdXQsIE9uRGVzdHJveSwgT25Jbml0LCBvdXRwdXQsIFNpZ25hbCwgc2lnbmFsLCBUZW1wbGF0ZVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c0J1dHRvbnNCdXR0b25Db21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNCdXR0b25zU3RhdHVzQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1idXR0b25zLXN0YXR1cyc7XG5pbXBvcnQgeyBJRHJvcGRvd24sIElEcm9wZG93bkZ1bmN0aW9uQ29udHJvbEV2ZW50LCBJRW1pdFNlbGVjdEtleSwgTGlic1VpQ29tcG9uZW50c0Ryb3Bkb3duQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1kcm9wZG93bic7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzTGFiZWxDb21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWxhYmVsJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNQb3BvdmVyQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1wb3BvdmVyJztcbmltcG9ydCB7IElTa2VsZXRvbkNvbmZpZywgTGlic1VpQ29tcG9uZW50c1NrZWxldG9uQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1za2VsZXRvbic7XG5pbXBvcnQgeyBJU3dpdGNoRXZlbnQsIExpYnNVaUNvbXBvbmVudHNTd2l0Y2hDb21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLXN3aXRjaCc7XG5pbXBvcnQgeyBUWVBFX1RFTVBMQVRFX1JFRiB9IGZyb20gJ0BsaWJzLXVpL2ludGVyZmFjZXMtdHlwZXMnO1xuaW1wb3J0IHsgTGlic1VpUGlwZXNDYWxsRnVuY3Rpb25JblRlbXBsYXRlUGlwZSB9IGZyb20gJ0BsaWJzLXVpL3BpcGVzLWNhbGwtZnVuY3Rpb24taW4tdGVtcGxhdGUnO1xuaW1wb3J0IHsgTGlic1VpUGlwZXNFc2NhcGVIdG1sUGlwZSB9IGZyb20gJ0BsaWJzLXVpL3BpcGVzLWVzY2FwZS1odG1sJztcbmltcG9ydCB7IGdldCwgZ2V0RGF5anMsIFV0aWxzQ29tbXVuaWNhdGVNaWNybywgVXRpbHNDb21tdW5pY2F0ZU1pY3JvS2V5R2xvYmFsLCB1dWlkIH0gZnJvbSAnQGxpYnMtdWkvdXRpbHMnO1xuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBpbnRlcnZhbCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgSVBhZ2VzVGVtcGxhdGVGdWxsU2NyZWVuQnV0dG9uIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9jb25maWcuaW50ZXJmYWNlJztcbmltcG9ydCB7IElGdWxsU2NyZWVuVjJCb2R5Q29uZmlnLCBJRnVsbFNjcmVlblYyU2VjdGlvbkRhdGEgfSBmcm9tICcuL2ludGVyZmFjZXMvZnVsbC1zY3JlZW4tdjIuaW50ZXJmYWNlJztcblxuLyoqXG4gKiBGdWxsIFNjcmVlbiBUZW1wbGF0ZSBWMiDigJQgS+G6vyB0aOG7q2EgdG/DoG4gYuG7mSBWMSwgYuG7lSBzdW5nIGxhenkgbG9hZGluZyBjaG8gYm9keS5cbiAqIEhlYWRlciBnaeG7ryBuZ3V5w6puIDEwMCUuIEJvZHkgaOG7lyB0cuG7oyBkeW5hbWljIGNvbXBvbmVudCBpbmplY3Rpb24gduG7m2kgc2tlbGV0b24gdOG7sSDEkeG7mW5nLlxuICovXG5AQ29tcG9uZW50KHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9jb21wb25lbnQtc2VsZWN0b3JcbiAgc2VsZWN0b3I6ICdsaWJzX3VpLWNvbXBvbmVudHMtcGFnZXNfdGVtcGxhdGVfZnVsbF9zY3JlZW5fdjInLFxuICB0ZW1wbGF0ZVVybDogJy4vZnVsbC1zY3JlZW4tdjIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9mdWxsLXNjcmVlbi12Mi5jb21wb25lbnQuc2NzcyddLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgaW1wb3J0czogW1xuICAgIEFzeW5jUGlwZSxcbiAgICBOZ0NvbXBvbmVudE91dGxldCxcbiAgICBOZ1RlbXBsYXRlT3V0bGV0LFxuICAgIFRyYW5zbGF0ZU1vZHVsZSxcbiAgICBMaWJzVWlDb21wb25lbnRzRHJvcGRvd25Db21wb25lbnQsXG4gICAgTGlic1VpQ29tcG9uZW50c1N3aXRjaENvbXBvbmVudCxcbiAgICBMaWJzVWlDb21wb25lbnRzQnV0dG9uc0J1dHRvbkNvbXBvbmVudCxcbiAgICBMaWJzVWlDb21wb25lbnRzQnV0dG9uc1N0YXR1c0NvbXBvbmVudCxcbiAgICBMaWJzVWlDb21wb25lbnRzUG9wb3ZlckNvbXBvbmVudCxcbiAgICBMaWJzVWlDb21wb25lbnRzU2tlbGV0b25Db21wb25lbnQsXG4gICAgTGlic1VpUGlwZXNDYWxsRnVuY3Rpb25JblRlbXBsYXRlUGlwZSxcbiAgICBMaWJzVWlQaXBlc0VzY2FwZUh0bWxQaXBlLFxuICAgIExpYnNVaUNvbXBvbmVudHNMYWJlbENvbXBvbmVudCxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgTGlic1VpQ29tcG9uZW50c1BhZ2VzVGVtcGxhdGVGdWxsU2NyZWVuVjJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIC8vICNyZWdpb24gLS0tIElOUFVUUyAoa+G6vyB0aOG7q2EgdOG7qyBWMSkgLS0tXG4gIHJlYWRvbmx5IGNsYXNzSGVhZGVySW5jbHVkZSA9IGlucHV0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgbGFiZWxMZWZ0ID0gaW5wdXQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KCdpMThuX2JhY2tfdG9fbGlzdCcsIHsgdHJhbnNmb3JtOiAodmFsKSA9PiB2YWwgPz8gJ2kxOG5fYmFja190b19saXN0JyB9KTtcbiAgcmVhZG9ubHkgdGl0bGUgPSBpbnB1dDxzdHJpbmc+KCk7XG4gIHJlYWRvbmx5IGJ1dHRvbkNlbnRlciA9IGlucHV0PEFycmF5PElQYWdlc1RlbXBsYXRlRnVsbFNjcmVlbkJ1dHRvbj4gfCB1bmRlZmluZWQ+KCk7XG4gIHJlYWRvbmx5IGJ1dHRvblJpZ2h0ID0gaW5wdXQ8QXJyYXk8SVBhZ2VzVGVtcGxhdGVGdWxsU2NyZWVuQnV0dG9uPj4oKTtcbiAgcmVhZG9ubHkgaGFzRWRpdCA9IGlucHV0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcmVhZG9ubHkgbWVudURyb3BEb3duQ29uZmlncyA9IGlucHV0PElEcm9wZG93bj4oKTtcbiAgcmVhZG9ubHkgekluZGV4ID0gaW5wdXQ8bnVtYmVyLCBudW1iZXIgfCB1bmRlZmluZWQ+KDEwMDAsIHsgdHJhbnNmb3JtOiAodmFsKSA9PiB2YWwgPz8gMTAwMCB9KTtcbiAgcmVhZG9ubHkgaWdub3JlQ2xvc2VQYWdlRnVsbEV2ZW50ID0gaW5wdXQ8Ym9vbGVhbiwgYm9vbGVhbiB8IHVuZGVmaW5lZD4oZmFsc2UsIHsgdHJhbnNmb3JtOiAodmFsKSA9PiB2YWwgPz8gZmFsc2UgfSk7XG4gIHJlYWRvbmx5IGlnbm9yZUJhY2tncm91bmRDb2xvciA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGRpdmlkZUNsYXNzSGVhZGVyID0gaW5wdXQ8eyBjbGFzc0J1dHRvbkNhbmNlbDogc3RyaW5nOyBjbGFzc0J1dHRvbkNlbnRlcjogc3RyaW5nOyBjbGFzc0J1dHRvblJpZ2h0OiBzdHJpbmcgfSB8IHVuZGVmaW5lZD4oKTtcbiAgcmVhZG9ubHkgY2VudGVyVGVtcGxhdGUgPSBpbnB1dDxUZW1wbGF0ZVJlZjxUWVBFX1RFTVBMQVRFX1JFRj4gfCB1bmRlZmluZWQ+KCk7XG4gIHJlYWRvbmx5IHRlbXBsYXRlUmlnaHQgPSBpbnB1dDxUZW1wbGF0ZVJlZjxUWVBFX1RFTVBMQVRFX1JFRj4gfCB1bmRlZmluZWQ+KCk7XG4gIHJlYWRvbmx5IGxlZnRUZW1wbGF0ZSA9IGlucHV0PFRlbXBsYXRlUmVmPFRZUEVfVEVNUExBVEVfUkVGPiB8IHVuZGVmaW5lZD4oKTtcbiAgcmVhZG9ubHkgZGlzYWJsZSA9IGlucHV0PGJvb2xlYW4sIGJvb2xlYW4gfCB1bmRlZmluZWQ+KGZhbHNlLCB7IHRyYW5zZm9ybTogKHZhbCkgPT4gdmFsID8/IGZhbHNlIH0pO1xuICAvLyAjZW5kcmVnaW9uXG5cbiAgLy8gI3JlZ2lvbiAtLS0gSU5QVVRTICht4bubaSB0cm9uZyBWMikgLS0tXG4gIC8qKiBDb25maWcgbGF6eSBsb2FkIGNvbXBvbmVudCB2w6BvIGJvZHkuIE7hur91IGtow7RuZyB0cnV54buBbiBnZXRDb21wb25lbnRPdXRsZXQg4oaSIHThu7EgxJHhu5luZyBkw7luZyBuZy1jb250ZW50LiAqL1xuICByZWFkb25seSBib2R5Q29uZmlnID0gaW5wdXQ8SUZ1bGxTY3JlZW5WMkJvZHlDb25maWcsIElGdWxsU2NyZWVuVjJCb2R5Q29uZmlnIHwgdW5kZWZpbmVkPih7fSwgeyB0cmFuc2Zvcm06ICh2KSA9PiB2IHx8IHt9IH0pO1xuICAvLyAjZW5kcmVnaW9uXG5cbiAgLy8gI3JlZ2lvbiAtLS0gT1VUUFVUUyAtLS1cbiAgcmVhZG9ubHkgb3V0Q2xvc2UgPSBvdXRwdXQ8dm9pZD4oKTtcbiAgcmVhZG9ubHkgb3V0RWRpdCA9IG91dHB1dDx2b2lkPigpO1xuICByZWFkb25seSBvdXRTZWxlY3RlZE1lbnVEcm9wZG93biA9IG91dHB1dDxJRW1pdFNlbGVjdEtleSB8IHVuZGVmaW5lZD4oKTtcbiAgcmVhZG9ubHkgb3V0Q2xpY2tCdXR0b24gPSBvdXRwdXQ8SVBhZ2VzVGVtcGxhdGVGdWxsU2NyZWVuQnV0dG9uPigpO1xuICAvLyAjZW5kcmVnaW9uXG5cbiAgLy8gI3JlZ2lvbiAtLS0gSU5URVJOQUwgU1RBVEUgLS0tXG4gIHByaXZhdGUgcmVhZG9ubHkgaWRPdmVybGF5ID0gc2lnbmFsPHN0cmluZz4odXVpZCgpKS5hc1JlYWRvbmx5KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcbiAgcHJpdmF0ZSBmdW5jdGlvbkNvbnRyb2xNZW51OiBJRHJvcGRvd25GdW5jdGlvbkNvbnRyb2xFdmVudCB8IHVuZGVmaW5lZDtcbiAgLy8gI2VuZHJlZ2lvblxuXG4gIC8vICNyZWdpb24gLS0tIENPTVBVVEVEIC0tLVxuICAvKiogU3RhdGUgcmVhY3RpdmUgxJHhu4MgdHJ1eeG7gW4gdsOgbyBjb21wb25lbnQgb3V0bGV0ICovXG4gIHByb3RlY3RlZCByZWFkb25seSBzZWN0aW9uRGF0YSA9IGNvbXB1dGVkPElGdWxsU2NyZWVuVjJTZWN0aW9uRGF0YT4oKCkgPT4gKHtcbiAgICBkaXNhYmxlOiB0aGlzLmRpc2FibGUoKSxcbiAgfSkpO1xuXG4gIC8qKiBTa2VsZXRvbiBib2R5IOKAlCBmYWxsYmFjayB24buBIGNvbmZpZyBt4bq3YyDEkeG7i25oIG7hur91IGtow7RuZyDEkcaw4bujYyB0cnV54buBbiAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcmVzb2x2ZWRTa2VsZXRvbkJvZHk6IFNpZ25hbDxJU2tlbGV0b25Db25maWc+ID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIHJldHVybiAoXG4gICAgICBnZXQodGhpcy5ib2R5Q29uZmlnLCAnc2tlbGV0b25Db25maWcnKSA/PyB7XG4gICAgICAgIHJlcGVhdDogMyxcbiAgICAgICAgc3R5bGVNYXJnaW5Cb3R0b206IDE2LFxuICAgICAgICByb3dzOiBbeyBpdGVtOiB7IGNsYXNzSW5jbHVkZTogJ3ctZnVsbCBoLVsxMjBweF0gcm91bmRlZC1bOHB4XScgfSB9XSxcbiAgICAgIH1cbiAgICApO1xuICB9KTtcbiAgLy8gI2VuZHJlZ2lvblxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pZ25vcmVDbG9zZVBhZ2VGdWxsRXZlbnQoKSkge1xuICAgICAgY29uc3QgZGF0YSA9IHtcbiAgICAgICAgdHlwZTogVXRpbHNDb21tdW5pY2F0ZU1pY3JvS2V5R2xvYmFsLktFWV9NRVNTQUdFX01PREFMLFxuICAgICAgICByZXNwb25zZToge1xuICAgICAgICAgIG1lc3NhZ2U6ICdvcGVuJyxcbiAgICAgICAgICBzdGF0ZTogdHJ1ZSxcbiAgICAgICAgICBpZE92ZXJsYXk6IHRoaXMuaWRPdmVybGF5KCksXG4gICAgICAgICAgdGltZUxpdmVVcGRhdGU6IGdldERheWpzKCkudW5peCgpLFxuICAgICAgICAgIGlnbm9yZUludGVydmFsVXBkYXRlVGltZUxpdmVFdmVudDogVXRpbHNDb21tdW5pY2F0ZU1pY3JvS2V5R2xvYmFsLklHTk9SRV9JTlRFUlZBTF9VUERBVEVfVElNRV9MSVZFX0VWRU5UX01PREFMLFxuICAgICAgICB9LFxuICAgICAgfTtcblxuICAgICAgVXRpbHNDb21tdW5pY2F0ZU1pY3JvLlBvc3RNZXNzYWdlVG9QYXJlbnQoZGF0YSk7XG5cbiAgICAgIGlmICghVXRpbHNDb21tdW5pY2F0ZU1pY3JvS2V5R2xvYmFsLklHTk9SRV9JTlRFUlZBTF9VUERBVEVfVElNRV9MSVZFX0VWRU5UX01PREFMKSB7XG4gICAgICAgIGludGVydmFsKDIwMDApXG4gICAgICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICBkYXRhLnJlc3BvbnNlLnRpbWVMaXZlVXBkYXRlID0gZ2V0RGF5anMoKS51bml4KCk7XG4gICAgICAgICAgICBVdGlsc0NvbW11bmljYXRlTWljcm8uUG9zdE1lc3NhZ2VUb1BhcmVudChkYXRhKTtcbiAgICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyAjcmVnaW9uIC0tLSBFVkVOVCBIQU5ETEVSUyAtLS1cbiAgcHJvdGVjdGVkIGhhbmRsZXJFZGl0KCkge1xuICAgIHRoaXMub3V0RWRpdC5lbWl0KCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2FuY2VsKCkge1xuICAgIHRoaXMub3V0Q2xvc2UuZW1pdCgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGhhbmRsZXJDbGlja0J1dHRvbihidXR0b246IElQYWdlc1RlbXBsYXRlRnVsbFNjcmVlbkJ1dHRvbikge1xuICAgIGlmIChidXR0b24gJiYgYnV0dG9uLmFjdGlvbikge1xuICAgICAgYXdhaXQgYnV0dG9uLmFjdGlvbigpO1xuICAgIH1cbiAgICB0aGlzLm91dENsaWNrQnV0dG9uLmVtaXQoYnV0dG9uKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVyU3dpdGNoKGV2ZW50OiBJU3dpdGNoRXZlbnQsIGJ1dHRvbjogSVBhZ2VzVGVtcGxhdGVGdWxsU2NyZWVuQnV0dG9uKSB7XG4gICAgaWYgKGJ1dHRvbiAmJiBidXR0b24uYWN0aW9uKSB7XG4gICAgICBhd2FpdCBidXR0b24uYWN0aW9uKGV2ZW50KTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlclNlbGVjdGVkS2V5KGV2ZW50OiBJRW1pdFNlbGVjdEtleSB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMub3V0U2VsZWN0ZWRNZW51RHJvcGRvd24uZW1pdChldmVudCk7XG4gICAgdGhpcy5mdW5jdGlvbkNvbnRyb2xNZW51Py5yZXNldCgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJDb250cm9sRHJvcGRvd25NZW51KGV2ZW50OiBJRHJvcGRvd25GdW5jdGlvbkNvbnRyb2xFdmVudCkge1xuICAgIHRoaXMuZnVuY3Rpb25Db250cm9sTWVudSA9IGV2ZW50O1xuICB9XG4gIC8vICNlbmRyZWdpb25cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaWdub3JlQ2xvc2VQYWdlRnVsbEV2ZW50KCkpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICAgIHR5cGU6IFV0aWxzQ29tbXVuaWNhdGVNaWNyb0tleUdsb2JhbC5LRVlfTUVTU0FHRV9NT0RBTCxcbiAgICAgICAgcmVzcG9uc2U6IHtcbiAgICAgICAgICBtZXNzYWdlOiAnY2xvc2UnLFxuICAgICAgICAgIHN0YXRlOiBmYWxzZSxcbiAgICAgICAgICBpZE92ZXJsYXk6IHRoaXMuaWRPdmVybGF5KCksXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgICAgVXRpbHNDb21tdW5pY2F0ZU1pY3JvLlBvc3RNZXNzYWdlVG9QYXJlbnQoZGF0YSk7XG4gICAgfVxuICB9XG59XG4iLCI8ZGl2XG4gIGNsYXNzPVwibGlicy11aS1jb21wb25lbnRzLXBhZ2VfZnVsbCBvdmVyZmxvdy1oaWRkZW5cIlxuICBbc3R5bGUuekluZGV4XT1cInpJbmRleCgpXCJcbiAgW3N0eWxlLmJhY2tncm91bmQtY29sb3JdPVwiaWdub3JlQmFja2dyb3VuZENvbG9yKCkgPyAndHJhbnNwYXJlbnQnIDogJyNmMmY1ZjcnXCI+XG4gIDwhLS0gPT09PT09PT09PT09PT09PT09PT09IEhFQURFUiAoZ2nhu68gbmd1ecOqbiAxMDAlIHThu6sgVjEpID09PT09PT09PT09PT09PT09PT09PSAtLT5cbiAgPGRpdiBbY2xhc3NdPVwiJ2xpYnMtdWktY29tcG9uZW50cy1wYWdlX2Z1bGwtaGVhZGVyICcgKyBjbGFzc0hlYWRlckluY2x1ZGUoKVwiPlxuICAgIDxkaXYgY2xhc3M9XCJ7eyBkaXZpZGVDbGFzc0hlYWRlcigpPy5jbGFzc0J1dHRvbkNhbmNlbCB8fCAndy1bMjUlXScgfX1cIj5cbiAgICAgIEBpZiAobGVmdFRlbXBsYXRlKCk7IGFzIGxlZnRUZW1wbGF0ZSkge1xuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibGVmdFRlbXBsYXRlXCIgLz5cbiAgICAgIH1cbiAgICAgIEBpZiAobGFiZWxMZWZ0KCk7IGFzIGxhYmVsTGVmdCkge1xuICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uXG4gICAgICAgICAgW2xhYmVsXT1cImxhYmVsTGVmdFwiXG4gICAgICAgICAgW3R5cGVdPVwiJ2J1dHRvbi1saW5rLXByaW1hcnknXCJcbiAgICAgICAgICBbY2xhc3NJY29uTGVmdF09XCInbGlicy11aS1pY29uLWNoZXZyb24tcmlnaHQgcm90YXRlLVsxODBkZWddIGJlZm9yZTp0ZXh0LVsxNnB4XSdcIlxuICAgICAgICAgIFtjbGFzc0xhYmVsXT1cIidsaWJzLXVpLWZvbnQtaDRyJ1wiXG4gICAgICAgICAgKG91dENsaWNrKT1cImNhbmNlbCgpXCIgLz5cbiAgICAgIH1cbiAgICA8L2Rpdj5cblxuICAgIEBpZiAoY2VudGVyVGVtcGxhdGUoKTsgYXMgY2VudGVyVGVtcGxhdGUpIHtcbiAgICAgIDxkaXYgY2xhc3M9XCJ7eyBkaXZpZGVDbGFzc0hlYWRlcigpPy5jbGFzc0J1dHRvbkNlbnRlciB8fCAndy1bNDAlXScgfX0gZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNlbnRlclRlbXBsYXRlXCIgLz5cbiAgICAgIDwvZGl2PlxuICAgIH0gQGVsc2Uge1xuICAgICAgPGRpdiBjbGFzcz1cInt7IGRpdmlkZUNsYXNzSGVhZGVyKCk/LmNsYXNzQnV0dG9uQ2VudGVyIHx8ICd3LVs0MCVdJyB9fSBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlclwiPlxuICAgICAgICA8bGlic191aS1jb21wb25lbnRzLXBvcG92ZXJcbiAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgW2NvbmZpZ109XCJ7IG1heFdpZHRoOiAyNTAsIHpJbmRleDogekluZGV4KCkgKyAxIH1cIlxuICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiJ2xpYnMtdWktZm9udC1oMnMnXCJcbiAgICAgICAgICBbaW5uZXJIdG1sXT1cInRpdGxlKCkgPyAodGl0bGUoKSB8IExpYnNVaVBpcGVzRXNjYXBlSHRtbFBpcGUpIDogJyZtZGFzaDsnXCIgLz5cbiAgICAgICAgQGlmIChoYXNFZGl0KCk7IGFzIGhhc0VkaXQpIHtcbiAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uXG4gICAgICAgICAgICBbdHlwZV09XCInYnV0dG9uLWxpbmstcHJpbWFyeSdcIlxuICAgICAgICAgICAgKG91dENsaWNrKT1cImhhbmRsZXJFZGl0KClcIlxuICAgICAgICAgICAgW2ljb25Pbmx5VHlwZV09XCJ0cnVlXCJcbiAgICAgICAgICAgIFtjbGFzc0ljb25MZWZ0XT1cIidsaWJzLXVpLWljb24tZWRpdC1saW5lJ1wiXG4gICAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cIidtbC1bNHB4XSdcIiAvPlxuICAgICAgICB9XG4gICAgICAgIEBmb3IgKGJ1dHRvbiBvZiBidXR0b25DZW50ZXIoKTsgdHJhY2sgYnV0dG9uLmtleSkge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtbC1bMTJweF0gZmxleCBpdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgIEBpZiAoYnV0dG9uLmtleSA9PT0gJ2J1dHRvbicpIHtcbiAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLWJ1dHRvblxuICAgICAgICAgICAgICAgIFtsYWJlbF09XCJidXR0b24ubGFiZWwgfHwgJydcIlxuICAgICAgICAgICAgICAgIFtjbGFzc0xhYmVsXT1cIihidXR0b24uY2xhc3NMYWJlbCB8fCAnJykgKyAnIGxpYnMtdWktZm9udC1oZWFkLTRzJ1wiXG4gICAgICAgICAgICAgICAgW3R5cGVdPVwiYnV0dG9uLnR5cGUgfHwgJ2J1dHRvbi1wcmltYXJ5J1wiXG4gICAgICAgICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCJidXR0b24uY2xhc3NJbmNsdWRlIHx8ICcnXCJcbiAgICAgICAgICAgICAgICBbY2xhc3NJY29uTGVmdF09XCJidXR0b24uY2xhc3NJY29uTGVmdCB8fCAnJ1wiXG4gICAgICAgICAgICAgICAgW2NsYXNzSWNvblJpZ2h0XT1cImJ1dHRvbi5jbGFzc0ljb25SaWdodCB8fCAnJ1wiXG4gICAgICAgICAgICAgICAgW3BvcG92ZXJdPVwiYnV0dG9uLnBvcG92ZXIgfHwge31cIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlXT1cImJ1dHRvbi5kaXNhYmxlIHx8IGRpc2FibGUoKVwiXG4gICAgICAgICAgICAgICAgW2lzUGVuZGluZ109XCJidXR0b24uaXNQZW5kaW5nIHx8IGZhbHNlXCJcbiAgICAgICAgICAgICAgICAob3V0Q2xpY2spPVwiaGFuZGxlckNsaWNrQnV0dG9uKGJ1dHRvbilcIiAvPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGlmIChidXR0b24ua2V5ID09PSAnYnV0dG9uLXN0YXR1cycgJiYgYnV0dG9uLmNvbmZpZ0J1dHRvblN0YXR1cykge1xuICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtc3RhdHVzXG4gICAgICAgICAgICAgICAgW2NsYXNzXT1cImJ1dHRvbi5jbGFzc0luY2x1ZGVcIlxuICAgICAgICAgICAgICAgIFtjb25maWddPVwiYnV0dG9uLmNvbmZpZ0J1dHRvblN0YXR1c1wiIC8+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAaWYgKGJ1dHRvbi5rZXkgPT09ICdzd2l0Y2gnKSB7XG4gICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtc3dpdGNoXG4gICAgICAgICAgICAgICAgW2FjdGl2ZV09XCJidXR0b24uYWN0aXZlIHx8IGZhbHNlXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZV09XCJidXR0b24uZGlzYWJsZSB8fCBkaXNhYmxlKClcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwie3sgYnV0dG9uLmNsYXNzSW5jbHVkZSB9fVwiXG4gICAgICAgICAgICAgICAgKG91dFN3aXRjaCk9XCJoYW5kbGVyU3dpdGNoKCRldmVudCwgYnV0dG9uKVwiIC8+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAaWYgKGJ1dHRvbi5rZXkgPT09ICdsYWJlbCcgJiYgYnV0dG9uLmxhYmVsQ29uZmlnKSB7XG4gICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtbGFiZWxcbiAgICAgICAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cImJ1dHRvbi5sYWJlbENvbmZpZy5jbGFzc0luY2x1ZGUgKyAnIHBiLTAgdGV4dC13aGl0ZSdcIlxuICAgICAgICAgICAgICAgIFtsYWJlbExlZnRdPVwiYnV0dG9uLmxhYmVsQ29uZmlnLmxhYmVsTGVmdFwiXG4gICAgICAgICAgICAgICAgW2xhYmVsTGVmdENsYXNzXT1cImJ1dHRvbi5sYWJlbENvbmZpZy5sYWJlbExlZnRDbGFzc1wiXG4gICAgICAgICAgICAgICAgW3JlcXVpcmVkXT1cImJ1dHRvbi5sYWJlbENvbmZpZy5yZXF1aXJlZFwiXG4gICAgICAgICAgICAgICAgW2Rlc2NyaXB0aW9uXT1cImJ1dHRvbi5sYWJlbENvbmZpZy5kZXNjcmlwdGlvblwiXG4gICAgICAgICAgICAgICAgW2xhYmVsUmlnaHRdPVwiYnV0dG9uLmxhYmVsQ29uZmlnLmxhYmVsUmlnaHRcIlxuICAgICAgICAgICAgICAgIFtsYWJlbFJpZ2h0Q2xhc3NdPVwiYnV0dG9uLmxhYmVsQ29uZmlnLmxhYmVsUmlnaHRDbGFzc1wiXG4gICAgICAgICAgICAgICAgW29ubHlTaG93Q291bnRdPVwiYnV0dG9uLmxhYmVsQ29uZmlnLm9ubHlTaG93Q291bnRcIlxuICAgICAgICAgICAgICAgIFtidXR0b25zTGVmdF09XCJidXR0b24ubGFiZWxDb25maWcuYnV0dG9uc0xlZnRcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlQnV0dG9uc0xlZnRdPVwiYnV0dG9uLmxhYmVsQ29uZmlnLmRpc2FibGVCdXR0b25zTGVmdFwiXG4gICAgICAgICAgICAgICAgW2J1dHRvbnNSaWdodF09XCJidXR0b24ubGFiZWxDb25maWcuYnV0dG9uc1JpZ2h0XCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZUJ1dHRvbnNSaWdodF09XCJidXR0b24ubGFiZWxDb25maWcuZGlzYWJsZUJ1dHRvbnNSaWdodFwiXG4gICAgICAgICAgICAgICAgW2hhc1RvZ2dsZV09XCJidXR0b24ubGFiZWxDb25maWcuaGFzVG9nZ2xlXCJcbiAgICAgICAgICAgICAgICBbdG9nZ2xlQWN0aXZlXT1cImJ1dHRvbi5sYWJlbENvbmZpZy50b2dnbGVBY3RpdmVcIlxuICAgICAgICAgICAgICAgIFt0b2dnbGVEaXNhYmxlXT1cImJ1dHRvbi5sYWJlbENvbmZpZy50b2dnbGVEaXNhYmxlXCJcbiAgICAgICAgICAgICAgICBbcG9wb3Zlcl09XCJidXR0b24ubGFiZWxDb25maWcucG9wb3ZlclwiXG4gICAgICAgICAgICAgICAgW2ljb25Qb3BvdmVyQ2xhc3NdPVwiYnV0dG9uLmxhYmVsQ29uZmlnLmljb25Qb3BvdmVyQ2xhc3NcIlxuICAgICAgICAgICAgICAgIFtsaW1pdExlbmd0aF09XCJidXR0b24ubGFiZWxDb25maWcubGltaXRMZW5ndGhcIlxuICAgICAgICAgICAgICAgIFtidXR0b25zRGVzY3JpcHRpb25dPVwiYnV0dG9uLmxhYmVsQ29uZmlnLmJ1dHRvbnNEZXNjcmlwdGlvblwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVCdXR0b25zRGVzY3JpcHRpb25dPVwiYnV0dG9uLmxhYmVsQ29uZmlnLmRpc2FibGVCdXR0b25zRGVzY3JpcHRpb25cIlxuICAgICAgICAgICAgICAgIFtidXR0b25zRGVzY3JpcHRpb25Db250YWluZXJDbGFzc109XCJidXR0b24ubGFiZWxDb25maWcuYnV0dG9uc0Rlc2NyaXB0aW9uQ29udGFpbmVyQ2xhc3NcIlxuICAgICAgICAgICAgICAgIFtjb3VudF09XCJidXR0b24ubGFiZWxDb25maWcuY291bnRcIiAvPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICB9XG5cbiAgICA8ZGl2IGNsYXNzPVwie3sgZGl2aWRlQ2xhc3NIZWFkZXIoKT8uY2xhc3NCdXR0b25SaWdodCB8fCAndy1bMzUlXScgfX0gZmxleCBqdXN0aWZ5LWVuZCBpdGVtcy1jZW50ZXJcIj5cbiAgICAgIEBmb3IgKGJ1dHRvbiBvZiBidXR0b25SaWdodCgpOyB0cmFjayBidXR0b24ua2V5KSB7XG4gICAgICAgIDxkaXYgW2NsYXNzLm1sLVsxMnB4XV09XCIhJGZpcnN0XCI+XG4gICAgICAgICAgQGlmIChidXR0b24ua2V5ID09PSAnbGFiZWwnICYmIGJ1dHRvbi5sYWJlbENvbmZpZykge1xuICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1sYWJlbFxuICAgICAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cImJ1dHRvbi5sYWJlbENvbmZpZy5jbGFzc0luY2x1ZGUgKyAnIHBiLTAnXCJcbiAgICAgICAgICAgICAgW2xhYmVsTGVmdF09XCJidXR0b24ubGFiZWxDb25maWcubGFiZWxMZWZ0XCJcbiAgICAgICAgICAgICAgW2xhYmVsTGVmdENsYXNzXT1cImJ1dHRvbi5sYWJlbENvbmZpZy5sYWJlbExlZnRDbGFzc1wiXG4gICAgICAgICAgICAgIFtyZXF1aXJlZF09XCJidXR0b24ubGFiZWxDb25maWcucmVxdWlyZWRcIlxuICAgICAgICAgICAgICBbZGVzY3JpcHRpb25dPVwiYnV0dG9uLmxhYmVsQ29uZmlnLmRlc2NyaXB0aW9uXCJcbiAgICAgICAgICAgICAgW2xhYmVsUmlnaHRdPVwiYnV0dG9uLmxhYmVsQ29uZmlnLmxhYmVsUmlnaHRcIlxuICAgICAgICAgICAgICBbbGFiZWxSaWdodENsYXNzXT1cImJ1dHRvbi5sYWJlbENvbmZpZy5sYWJlbFJpZ2h0Q2xhc3NcIlxuICAgICAgICAgICAgICBbb25seVNob3dDb3VudF09XCJidXR0b24ubGFiZWxDb25maWcub25seVNob3dDb3VudFwiXG4gICAgICAgICAgICAgIFtidXR0b25zTGVmdF09XCJidXR0b24ubGFiZWxDb25maWcuYnV0dG9uc0xlZnRcIlxuICAgICAgICAgICAgICBbZGlzYWJsZUJ1dHRvbnNMZWZ0XT1cImJ1dHRvbi5sYWJlbENvbmZpZy5kaXNhYmxlQnV0dG9uc0xlZnRcIlxuICAgICAgICAgICAgICBbYnV0dG9uc1JpZ2h0XT1cImJ1dHRvbi5sYWJlbENvbmZpZy5idXR0b25zUmlnaHRcIlxuICAgICAgICAgICAgICBbZGlzYWJsZUJ1dHRvbnNSaWdodF09XCJidXR0b24ubGFiZWxDb25maWcuZGlzYWJsZUJ1dHRvbnNSaWdodFwiXG4gICAgICAgICAgICAgIFtoYXNUb2dnbGVdPVwiYnV0dG9uLmxhYmVsQ29uZmlnLmhhc1RvZ2dsZVwiXG4gICAgICAgICAgICAgIFt0b2dnbGVBY3RpdmVdPVwiYnV0dG9uLmxhYmVsQ29uZmlnLnRvZ2dsZUFjdGl2ZVwiXG4gICAgICAgICAgICAgIFt0b2dnbGVEaXNhYmxlXT1cImJ1dHRvbi5sYWJlbENvbmZpZy50b2dnbGVEaXNhYmxlXCJcbiAgICAgICAgICAgICAgW3BvcG92ZXJdPVwiYnV0dG9uLmxhYmVsQ29uZmlnLnBvcG92ZXJcIlxuICAgICAgICAgICAgICBbaWNvblBvcG92ZXJDbGFzc109XCJidXR0b24ubGFiZWxDb25maWcuaWNvblBvcG92ZXJDbGFzc1wiXG4gICAgICAgICAgICAgIFtsaW1pdExlbmd0aF09XCJidXR0b24ubGFiZWxDb25maWcubGltaXRMZW5ndGhcIlxuICAgICAgICAgICAgICBbYnV0dG9uc0Rlc2NyaXB0aW9uXT1cImJ1dHRvbi5sYWJlbENvbmZpZy5idXR0b25zRGVzY3JpcHRpb25cIlxuICAgICAgICAgICAgICBbZGlzYWJsZUJ1dHRvbnNEZXNjcmlwdGlvbl09XCJidXR0b24ubGFiZWxDb25maWcuZGlzYWJsZUJ1dHRvbnNEZXNjcmlwdGlvblwiXG4gICAgICAgICAgICAgIFtidXR0b25zRGVzY3JpcHRpb25Db250YWluZXJDbGFzc109XCJidXR0b24ubGFiZWxDb25maWcuYnV0dG9uc0Rlc2NyaXB0aW9uQ29udGFpbmVyQ2xhc3NcIlxuICAgICAgICAgICAgICBbY291bnRdPVwiYnV0dG9uLmxhYmVsQ29uZmlnLmNvdW50XCIgLz5cbiAgICAgICAgICB9XG4gICAgICAgICAgQGlmIChidXR0b24ua2V5ID09PSAnc3dpdGNoJykge1xuICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1zd2l0Y2hcbiAgICAgICAgICAgICAgW2FjdGl2ZV09XCJidXR0b24uYWN0aXZlIHx8IGZhbHNlXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVdPVwiYnV0dG9uLmRpc2FibGUgfHwgZGlzYWJsZSgpXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJ7eyBidXR0b24uY2xhc3NJbmNsdWRlIH19XCJcbiAgICAgICAgICAgICAgKG91dFN3aXRjaCk9XCJoYW5kbGVyU3dpdGNoKCRldmVudCwgYnV0dG9uKVwiIC8+XG4gICAgICAgICAgfVxuICAgICAgICAgIEBpZiAoYnV0dG9uLmtleSA9PT0gJ2J1dHRvbicpIHtcbiAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1idXR0b25cbiAgICAgICAgICAgICAgW2xhYmVsXT1cImJ1dHRvbj8ubGFiZWwgfHwgJydcIlxuICAgICAgICAgICAgICBbY2xhc3NMYWJlbF09XCIoYnV0dG9uLmNsYXNzTGFiZWwgfHwgJycpICsgJyBsaWJzLXVpLWZvbnQtaDRzJ1wiXG4gICAgICAgICAgICAgIFt0eXBlXT1cImJ1dHRvbi50eXBlIHx8ICdidXR0b24tcHJpbWFyeSdcIlxuICAgICAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cImJ1dHRvbi5jbGFzc0luY2x1ZGUgfHwgJydcIlxuICAgICAgICAgICAgICBbY2xhc3NJY29uTGVmdF09XCJidXR0b24uY2xhc3NJY29uTGVmdCB8fCAnJ1wiXG4gICAgICAgICAgICAgIFtjbGFzc0ljb25SaWdodF09XCJidXR0b24uY2xhc3NJY29uUmlnaHQgfHwgJydcIlxuICAgICAgICAgICAgICBbcG9wb3Zlcl09XCJidXR0b24ucG9wb3ZlciB8fCB7fVwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlXT1cImJ1dHRvbi5kaXNhYmxlIHx8IGRpc2FibGUoKVwiXG4gICAgICAgICAgICAgIFtpc1BlbmRpbmddPVwiYnV0dG9uLmlzUGVuZGluZyB8fCBmYWxzZVwiXG4gICAgICAgICAgICAgIFtpY29uT25seVR5cGVdPVwiYnV0dG9uLmljb25Pbmx5VHlwZSB8fCBmYWxzZVwiXG4gICAgICAgICAgICAgIChvdXRDbGljayk9XCJoYW5kbGVyQ2xpY2tCdXR0b24oYnV0dG9uKVwiIC8+XG4gICAgICAgICAgfVxuICAgICAgICAgIEBpZiAoYnV0dG9uLmtleSA9PT0gJ2xpbmUtc3BhY2UnKSB7XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGNsYXNzPVwiYmctWyM2NjZiNzldIHctWzFweF0gaC1bMjhweF1cIlxuICAgICAgICAgICAgICBbY2xhc3NdPVwiYnV0dG9uLmNsYXNzSW5jbHVkZVwiPlxuICAgICAgICAgICAgICAmbmJzcDtcbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgICBAaWYgKG1lbnVEcm9wRG93bkNvbmZpZ3MoKTsgYXMgbWVudURyb3BEb3duQ29uZmlncykge1xuICAgICAgICA8ZGl2IGNsYXNzPVwibWwtWzEycHhdXCI+XG4gICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1kcm9wZG93blxuICAgICAgICAgICAgW2lzTmdDb250ZW50XT1cInRydWVcIlxuICAgICAgICAgICAgW3pJbmRleF09XCJ6SW5kZXgoKSArIDFcIlxuICAgICAgICAgICAgW2xpc3RDb25maWddPVwibWVudURyb3BEb3duQ29uZmlncy5saXN0Q29uZmlnXCJcbiAgICAgICAgICAgIFtsaXN0SGlkZGVuSW5wdXRTZWFyY2hdPVwidHJ1ZVwiXG4gICAgICAgICAgICBbcG9wb3ZlckN1c3RvbUNvbmZpZ109XCJtZW51RHJvcERvd25Db25maWdzLnBvcG92ZXJDdXN0b21Db25maWdcIlxuICAgICAgICAgICAgKG91dEZ1bmN0aW9uc0NvbnRyb2wpPVwiaGFuZGxlckNvbnRyb2xEcm9wZG93bk1lbnUoJGV2ZW50KVwiXG4gICAgICAgICAgICAob3V0U2VsZWN0S2V5KT1cImhhbmRsZXJTZWxlY3RlZEtleSgkZXZlbnQpXCI+XG4gICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uXG4gICAgICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiJ3AtWzhweF0nXCJcbiAgICAgICAgICAgICAgW3R5cGVdPVwiJ2J1dHRvbi10aGlyZCdcIlxuICAgICAgICAgICAgICBbaWNvbk9ubHlUeXBlXT1cInRydWVcIlxuICAgICAgICAgICAgICBbY2xhc3NJY29uTGVmdF09XCInbGlicy11aS1pY29uLW1vcmUtdmVydGljYWwgdGV4dC1bIzMzMzMzM10gdGV4dC1bMTJweF0nXCJcbiAgICAgICAgICAgICAgW3BvcG92ZXJdPVwieyBjb25maWc6IHsgY29udGVudDogJ2kxOG5fNHhfb3RoZXJfb3BlcmF0aW9ucycgfSB9XCJcbiAgICAgICAgICAgICAgW2lnbm9yZVN0b3BQcm9wYWdhdGlvbkV2ZW50XT1cInRydWVcIiAvPlxuICAgICAgICAgIDwvbGlic191aS1jb21wb25lbnRzLWRyb3Bkb3duPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICAgIEBpZiAodGVtcGxhdGVSaWdodCgpOyBhcyB0ZW1wbGF0ZVJpZ2h0KSB7XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZW1wbGF0ZVJpZ2h0XCIgLz5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT0gQk9EWSAoVjI6IExhenkgTG9hZCBob+G6t2MgbmctY29udGVudCkgPT09PT09PT09PT09PT09PT09PT09IC0tPlxuICBAaWYgKGJvZHlDb25maWcoKS5nZXRDb21wb25lbnRPdXRsZXQ7IGFzIGdldEJvZHlDb21wb25lbnRPdXRsZXQpIHtcbiAgICA8IS0tIExhenkgbG9hZCBtb2RlIC0tPlxuICAgIDxkaXYgW2NsYXNzXT1cIidsaWJzLXVpLWNvbXBvbmVudHMtcGFnZV9mdWxsLWJvZHkgJyArIChib2R5Q29uZmlnKCkuY2xhc3NJbmNsdWRlIHx8ICcnKVwiPlxuICAgICAgQGxldCBjb25zdEh0bWxDb21wQm9keSA9IHVuZGVmaW5lZCB8IExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGU6IGdldEJvZHlDb21wb25lbnRPdXRsZXQgOiBzZWN0aW9uRGF0YSgpIDogbnVsbCA6IHsgdmFsdWVJc0VtcHR5OiBudWxsIH0gfCBhc3luYztcbiAgICAgIEBsZXQgY29uc3RIdG1sSW5wdXRzQm9keSA9IHVuZGVmaW5lZCB8IExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGU6IGJvZHlDb25maWcoKS5nZXREYXRhQ29tcG9uZW50T3V0bGV0IDogc2VjdGlvbkRhdGEoKSA6IG51bGwgOiB7IHZhbHVlSXNFbXB0eTogbnVsbCB9IHwgYXN5bmM7XG4gICAgICBAaWYgKGNvbnN0SHRtbENvbXBCb2R5KSB7XG4gICAgICAgIEBkZWZlciB7XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdDb21wb25lbnRPdXRsZXQ9XCJjb25zdEh0bWxDb21wQm9keTsgaW5wdXRzOiBjb25zdEh0bWxJbnB1dHNCb2R5XCIgLz5cbiAgICAgICAgfSBAbG9hZGluZyB7XG4gICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1za2VsZXRvbiBbY29uZmlnXT1cInJlc29sdmVkU2tlbGV0b25Cb2R5KClcIiAvPlxuICAgICAgICB9XG4gICAgICB9IEBlbHNlIHtcbiAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1za2VsZXRvbiBbY29uZmlnXT1cInJlc29sdmVkU2tlbGV0b25Cb2R5KClcIiAvPlxuICAgICAgfVxuICAgIDwvZGl2PlxuICB9XG48L2Rpdj5cbiJdfQ==
161
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnVsbC1zY3JlZW4tdjIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL3BhZ2VzLXRlbXBsYXRlL2Z1bGwtc2NyZWVuL3NyYy9mdWxsLXNjcmVlbi12Mi9mdWxsLXNjcmVlbi12Mi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvcGFnZXMtdGVtcGxhdGUvZnVsbC1zY3JlZW4vc3JjL2Z1bGwtc2NyZWVuLXYyL2Z1bGwtc2NyZWVuLXYyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsaUJBQWlCLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNqRixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBcUIsTUFBTSxFQUFVLE1BQU0sRUFBZSxNQUFNLGVBQWUsQ0FBQztBQUNoSyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsc0NBQXNDLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUM1RixPQUFPLEVBQUUsc0NBQXNDLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUM1RixPQUFPLEVBQTRELGlDQUFpQyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDM0ksT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDM0UsT0FBTyxFQUFFLGdDQUFnQyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDL0UsT0FBTyxFQUFtQixpQ0FBaUMsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2xHLE9BQU8sRUFBZ0IsK0JBQStCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUUzRixPQUFPLEVBQUUscUNBQXFD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QU8sRUFBRSxPQUFPO2dCQUNoQixLQUFLLEVBQUUsS0FBSztnQkFDWixTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRTthQUM1QjtTQUNGLENBQUM7UUFDRixxQkFBcUIsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsRUFBRSxDQUFDO1lBQ3JDLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBQ2hDLENBQUM7SUFDSCxDQUFDO3dHQTFJVSxrREFBa0Q7NEZBQWxELGtEQUFrRCw0L0VDOUMvRCx3alVBa01BLCtwQkRuS0ksU0FBUyw4Q0FDVCxpQkFBaUIsb1BBQ2pCLGdCQUFnQixtSkFDaEIsZUFBZSwrQkFDZixpQ0FBaUMsdTNEQUNqQywrQkFBK0IscUpBQy9CLHNDQUFzQyxzakJBQ3RDLHNDQUFzQyxrR0FDdEMsZ0NBQWdDLG9nQkFDaEMsaUNBQWlDLHVGQUNqQyxxQ0FBcUMseUVBQ3JDLHlCQUF5QixrRUFDekIsOEJBQThCOzs0RkFHckIsa0RBQWtEO2tCQXZCOUQsU0FBUzsrQkFFRSxrREFBa0QsY0FHaEQsSUFBSSxtQkFDQyx1QkFBdUIsQ0FBQyxNQUFNLFdBQ3RDO3dCQUNQLFNBQVM7d0JBQ1QsaUJBQWlCO3dCQUNqQixnQkFBZ0I7d0JBQ2hCLGVBQWU7d0JBQ2YsaUNBQWlDO3dCQUNqQywrQkFBK0I7d0JBQy9CLHNDQUFzQzt3QkFDdEMsc0NBQXNDO3dCQUN0QyxnQ0FBZ0M7d0JBQ2hDLGlDQUFpQzt3QkFDakMscUNBQXFDO3dCQUNyQyx5QkFBeUI7d0JBQ3pCLDhCQUE4QjtxQkFDL0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBc3luY1BpcGUsIE5nQ29tcG9uZW50T3V0bGV0LCBOZ1RlbXBsYXRlT3V0bGV0IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIGNvbXB1dGVkLCBEZXN0cm95UmVmLCBpbmplY3QsIGlucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgb3V0cHV0LCBTaWduYWwsIHNpZ25hbCwgVGVtcGxhdGVSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNCdXR0b25zQnV0dG9uQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1idXR0b25zLWJ1dHRvbic7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzQnV0dG9uc1N0YXR1c0NvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtYnV0dG9ucy1zdGF0dXMnO1xuaW1wb3J0IHsgSURyb3Bkb3duLCBJRHJvcGRvd25GdW5jdGlvbkNvbnRyb2xFdmVudCwgSUVtaXRTZWxlY3RLZXksIExpYnNVaUNvbXBvbmVudHNEcm9wZG93bkNvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtZHJvcGRvd24nO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c0xhYmVsQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1sYWJlbCc7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzUG9wb3ZlckNvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtcG9wb3Zlcic7XG5pbXBvcnQgeyBJU2tlbGV0b25Db25maWcsIExpYnNVaUNvbXBvbmVudHNTa2VsZXRvbkNvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtc2tlbGV0b24nO1xuaW1wb3J0IHsgSVN3aXRjaEV2ZW50LCBMaWJzVWlDb21wb25lbnRzU3dpdGNoQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1zd2l0Y2gnO1xuaW1wb3J0IHsgVFlQRV9URU1QTEFURV9SRUYgfSBmcm9tICdAbGlicy11aS9pbnRlcmZhY2VzLXR5cGVzJztcbmltcG9ydCB7IExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGUgfSBmcm9tICdAbGlicy11aS9waXBlcy1jYWxsLWZ1bmN0aW9uLWluLXRlbXBsYXRlJztcbmltcG9ydCB7IExpYnNVaVBpcGVzRXNjYXBlSHRtbFBpcGUgfSBmcm9tICdAbGlicy11aS9waXBlcy1lc2NhcGUtaHRtbCc7XG5pbXBvcnQgeyBnZXQsIGdldERheWpzLCBVdGlsc0NvbW11bmljYXRlTWljcm8sIFV0aWxzQ29tbXVuaWNhdGVNaWNyb0tleUdsb2JhbCwgdXVpZCB9IGZyb20gJ0BsaWJzLXVpL3V0aWxzJztcbmltcG9ydCB7IFRyYW5zbGF0ZU1vZHVsZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgaW50ZXJ2YWwgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IElQYWdlc1RlbXBsYXRlRnVsbFNjcmVlbkJ1dHRvbiB9IGZyb20gJy4uL2ludGVyZmFjZXMvY29uZmlnLmludGVyZmFjZSc7XG5pbXBvcnQgeyBJRnVsbFNjcmVlblYyQm9keUNvbmZpZywgSUZ1bGxTY3JlZW5WMlNlY3Rpb25EYXRhLCBJRnVuY3Rpb25Db250cm9sUGFnZUZ1bGxTY3JlZW4gfSBmcm9tICcuL2ludGVyZmFjZXMvZnVsbC1zY3JlZW4tdjIuaW50ZXJmYWNlJztcblxuLyoqXG4gKiBGdWxsIFNjcmVlbiBUZW1wbGF0ZSBWMiDigJQgS+G6vyB0aOG7q2EgdG/DoG4gYuG7mSBWMSwgYuG7lSBzdW5nIGxhenkgbG9hZGluZyBjaG8gYm9keS5cbiAqIEhlYWRlciBnaeG7ryBuZ3V5w6puIDEwMCUuIEJvZHkgaOG7lyB0cuG7oyBkeW5hbWljIGNvbXBvbmVudCBpbmplY3Rpb24gduG7m2kgc2tlbGV0b24gdOG7sSDEkeG7mW5nLlxuICovXG5AQ29tcG9uZW50KHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9jb21wb25lbnQtc2VsZWN0b3JcbiAgc2VsZWN0b3I6ICdsaWJzX3VpLWNvbXBvbmVudHMtcGFnZXNfdGVtcGxhdGVfZnVsbF9zY3JlZW5fdjInLFxuICB0ZW1wbGF0ZVVybDogJy4vZnVsbC1zY3JlZW4tdjIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9mdWxsLXNjcmVlbi12Mi5jb21wb25lbnQuc2NzcyddLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgaW1wb3J0czogW1xuICAgIEFzeW5jUGlwZSxcbiAgICBOZ0NvbXBvbmVudE91dGxldCxcbiAgICBOZ1RlbXBsYXRlT3V0bGV0LFxuICAgIFRyYW5zbGF0ZU1vZHVsZSxcbiAgICBMaWJzVWlDb21wb25lbnRzRHJvcGRvd25Db21wb25lbnQsXG4gICAgTGlic1VpQ29tcG9uZW50c1N3aXRjaENvbXBvbmVudCxcbiAgICBMaWJzVWlDb21wb25lbnRzQnV0dG9uc0J1dHRvbkNvbXBvbmVudCxcbiAgICBMaWJzVWlDb21wb25lbnRzQnV0dG9uc1N0YXR1c0NvbXBvbmVudCxcbiAgICBMaWJzVWlDb21wb25lbnRzUG9wb3ZlckNvbXBvbmVudCxcbiAgICBMaWJzVWlDb21wb25lbnRzU2tlbGV0b25Db21wb25lbnQsXG4gICAgTGlic1VpUGlwZXNDYWxsRnVuY3Rpb25JblRlbXBsYXRlUGlwZSxcbiAgICBMaWJzVWlQaXBlc0VzY2FwZUh0bWxQaXBlLFxuICAgIExpYnNVaUNvbXBvbmVudHNMYWJlbENvbXBvbmVudCxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgTGlic1VpQ29tcG9uZW50c1BhZ2VzVGVtcGxhdGVGdWxsU2NyZWVuVjJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIC8vICNyZWdpb24gLS0tIElOUFVUUyAoa+G6vyB0aOG7q2EgdOG7qyBWMSkgLS0tXG4gIHJlYWRvbmx5IGNsYXNzSGVhZGVySW5jbHVkZSA9IGlucHV0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgbGFiZWxMZWZ0ID0gaW5wdXQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KCdpMThuX2JhY2tfdG9fbGlzdCcsIHsgdHJhbnNmb3JtOiAodmFsKSA9PiB2YWwgPz8gJ2kxOG5fYmFja190b19saXN0JyB9KTtcbiAgcmVhZG9ubHkgdGl0bGUgPSBpbnB1dDxzdHJpbmc+KCk7XG4gIHJlYWRvbmx5IGJ1dHRvbkNlbnRlciA9IGlucHV0PEFycmF5PElQYWdlc1RlbXBsYXRlRnVsbFNjcmVlbkJ1dHRvbj4gfCB1bmRlZmluZWQ+KCk7XG4gIHJlYWRvbmx5IGJ1dHRvblJpZ2h0ID0gaW5wdXQ8QXJyYXk8SVBhZ2VzVGVtcGxhdGVGdWxsU2NyZWVuQnV0dG9uPj4oKTtcbiAgcmVhZG9ubHkgaGFzRWRpdCA9IGlucHV0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcmVhZG9ubHkgbWVudURyb3BEb3duQ29uZmlncyA9IGlucHV0PElEcm9wZG93bj4oKTtcbiAgcmVhZG9ubHkgekluZGV4ID0gaW5wdXQ8bnVtYmVyLCBudW1iZXIgfCB1bmRlZmluZWQ+KDEwMDAsIHsgdHJhbnNmb3JtOiAodmFsKSA9PiB2YWwgPz8gMTAwMCB9KTtcbiAgcmVhZG9ubHkgaWdub3JlQ2xvc2VQYWdlRnVsbEV2ZW50ID0gaW5wdXQ8Ym9vbGVhbiwgYm9vbGVhbiB8IHVuZGVmaW5lZD4oZmFsc2UsIHsgdHJhbnNmb3JtOiAodmFsKSA9PiB2YWwgPz8gZmFsc2UgfSk7XG4gIHJlYWRvbmx5IGlnbm9yZUJhY2tncm91bmRDb2xvciA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGRpdmlkZUNsYXNzSGVhZGVyID0gaW5wdXQ8eyBjbGFzc0J1dHRvbkNhbmNlbDogc3RyaW5nOyBjbGFzc0J1dHRvbkNlbnRlcjogc3RyaW5nOyBjbGFzc0J1dHRvblJpZ2h0OiBzdHJpbmcgfSB8IHVuZGVmaW5lZD4oKTtcbiAgcmVhZG9ubHkgY2VudGVyVGVtcGxhdGUgPSBpbnB1dDxUZW1wbGF0ZVJlZjxUWVBFX1RFTVBMQVRFX1JFRj4gfCB1bmRlZmluZWQ+KCk7XG4gIHJlYWRvbmx5IHRlbXBsYXRlUmlnaHQgPSBpbnB1dDxUZW1wbGF0ZVJlZjxUWVBFX1RFTVBMQVRFX1JFRj4gfCB1bmRlZmluZWQ+KCk7XG4gIHJlYWRvbmx5IGxlZnRUZW1wbGF0ZSA9IGlucHV0PFRlbXBsYXRlUmVmPFRZUEVfVEVNUExBVEVfUkVGPiB8IHVuZGVmaW5lZD4oKTtcbiAgcmVhZG9ubHkgZGlzYWJsZSA9IGlucHV0PGJvb2xlYW4sIGJvb2xlYW4gfCB1bmRlZmluZWQ+KGZhbHNlLCB7IHRyYW5zZm9ybTogKHZhbCkgPT4gdmFsID8/IGZhbHNlIH0pO1xuICAvLyAjZW5kcmVnaW9uXG5cbiAgLy8gI3JlZ2lvbiAtLS0gSU5QVVRTICht4bubaSB0cm9uZyBWMikgLS0tXG4gIC8qKiBDb25maWcgbGF6eSBsb2FkIGNvbXBvbmVudCB2w6BvIGJvZHkuIE7hur91IGtow7RuZyB0cnV54buBbiBnZXRDb21wb25lbnRPdXRsZXQg4oaSIHThu7EgxJHhu5luZyBkw7luZyBuZy1jb250ZW50LiAqL1xuICByZWFkb25seSBib2R5Q29uZmlnID0gaW5wdXQ8SUZ1bGxTY3JlZW5WMkJvZHlDb25maWcsIElGdWxsU2NyZWVuVjJCb2R5Q29uZmlnIHwgdW5kZWZpbmVkPih7fSwgeyB0cmFuc2Zvcm06ICh2KSA9PiB2IHx8IHt9IH0pO1xuICAvLyAjZW5kcmVnaW9uXG5cbiAgLy8gI3JlZ2lvbiAtLS0gT1VUUFVUUyAtLS1cbiAgcmVhZG9ubHkgb3V0Q2xvc2UgPSBvdXRwdXQ8dm9pZD4oKTtcbiAgcmVhZG9ubHkgb3V0RWRpdCA9IG91dHB1dDx2b2lkPigpO1xuICByZWFkb25seSBvdXRTZWxlY3RlZE1lbnVEcm9wZG93biA9IG91dHB1dDxJRW1pdFNlbGVjdEtleSB8IHVuZGVmaW5lZD4oKTtcbiAgcmVhZG9ubHkgb3V0Q2xpY2tCdXR0b24gPSBvdXRwdXQ8SVBhZ2VzVGVtcGxhdGVGdWxsU2NyZWVuQnV0dG9uPigpO1xuICAvLyAjZW5kcmVnaW9uXG5cbiAgLy8gI3JlZ2lvbiAtLS0gSU5URVJOQUwgU1RBVEUgLS0tXG4gIHByaXZhdGUgcmVhZG9ubHkgZnVuY3Rpb25zQ29udHJvbCA9IHNpZ25hbDxJRnVuY3Rpb25Db250cm9sUGFnZUZ1bGxTY3JlZW4+KHsgZW1pdENsb3NlUGFnZUZ1bGxFdmVudDogKCkgPT4gdGhpcy5lbWl0Q2xvc2VQYWdlRnVsbEV2ZW50KCkgfSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgaWRPdmVybGF5ID0gc2lnbmFsPHN0cmluZz4odXVpZCgpKS5hc1JlYWRvbmx5KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcbiAgcHJpdmF0ZSBmdW5jdGlvbkNvbnRyb2xNZW51OiBJRHJvcGRvd25GdW5jdGlvbkNvbnRyb2xFdmVudCB8IHVuZGVmaW5lZDtcbiAgLy8gI2VuZHJlZ2lvblxuXG4gIC8vICNyZWdpb24gLS0tIElOVEVSTkFMIFNUQVRFIC0tLVxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcGlwZUVtcHR5Q29uZmlnID0geyB2YWx1ZUlzRW1wdHk6IG51bGwgfSBhcyBjb25zdDtcbiAgLy8gI2VuZHJlZ2lvblxuXG4gIC8vICNyZWdpb24gLS0tIENPTVBVVEVEIC0tLVxuICAvKiogU3RhdGUgcmVhY3RpdmUgxJHhu4MgdHJ1eeG7gW4gdsOgbyBjb21wb25lbnQgb3V0bGV0ICovXG4gIHByb3RlY3RlZCByZWFkb25seSBzZWN0aW9uRGF0YSA9IGNvbXB1dGVkPElGdWxsU2NyZWVuVjJTZWN0aW9uRGF0YT4oKCkgPT4gKHtcbiAgICBkaXNhYmxlOiB0aGlzLmRpc2FibGUoKSxcbiAgfSkpO1xuXG4gIC8qKiBTa2VsZXRvbiBib2R5IOKAlCBmYWxsYmFjayB24buBIGNvbmZpZyBt4bq3YyDEkeG7i25oIG7hur91IGtow7RuZyDEkcaw4bujYyB0cnV54buBbiAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcmVzb2x2ZWRTa2VsZXRvbkJvZHk6IFNpZ25hbDxJU2tlbGV0b25Db25maWc+ID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIHJldHVybiAoXG4gICAgICBnZXQodGhpcy5ib2R5Q29uZmlnLCAnc2tlbGV0b25Db25maWcnKSA/PyB7XG4gICAgICAgIHJlcGVhdDogMyxcbiAgICAgICAgc3R5bGVNYXJnaW5Cb3R0b206IDE2LFxuICAgICAgICByb3dzOiBbeyBpdGVtOiB7IGNsYXNzSW5jbHVkZTogJ3ctZnVsbCBoLVsxMjBweF0gcm91bmRlZC1bOHB4XScgfSB9XSxcbiAgICAgIH1cbiAgICApO1xuICB9KTtcbiAgLy8gI2VuZHJlZ2lvblxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pZ25vcmVDbG9zZVBhZ2VGdWxsRXZlbnQoKSkge1xuICAgICAgY29uc3QgZGF0YSA9IHtcbiAgICAgICAgdHlwZTogVXRpbHNDb21tdW5pY2F0ZU1pY3JvS2V5R2xvYmFsLktFWV9NRVNTQUdFX01PREFMLFxuICAgICAgICByZXNwb25zZToge1xuICAgICAgICAgIG1lc3NhZ2U6ICdvcGVuJyxcbiAgICAgICAgICBzdGF0ZTogdHJ1ZSxcbiAgICAgICAgICBpZE92ZXJsYXk6IHRoaXMuaWRPdmVybGF5KCksXG4gICAgICAgICAgdGltZUxpdmVVcGRhdGU6IGdldERheWpzKCkudW5peCgpLFxuICAgICAgICAgIGlnbm9yZUludGVydmFsVXBkYXRlVGltZUxpdmVFdmVudDogVXRpbHNDb21tdW5pY2F0ZU1pY3JvS2V5R2xvYmFsLklHTk9SRV9JTlRFUlZBTF9VUERBVEVfVElNRV9MSVZFX0VWRU5UX01PREFMLFxuICAgICAgICB9LFxuICAgICAgfTtcblxuICAgICAgVXRpbHNDb21tdW5pY2F0ZU1pY3JvLlBvc3RNZXNzYWdlVG9QYXJlbnQoZGF0YSk7XG5cbiAgICAgIGlmICghVXRpbHNDb21tdW5pY2F0ZU1pY3JvS2V5R2xvYmFsLklHTk9SRV9JTlRFUlZBTF9VUERBVEVfVElNRV9MSVZFX0VWRU5UX01PREFMKSB7XG4gICAgICAgIGludGVydmFsKDIwMDApXG4gICAgICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICBkYXRhLnJlc3BvbnNlLnRpbWVMaXZlVXBkYXRlID0gZ2V0RGF5anMoKS51bml4KCk7XG4gICAgICAgICAgICBVdGlsc0NvbW11bmljYXRlTWljcm8uUG9zdE1lc3NhZ2VUb1BhcmVudChkYXRhKTtcbiAgICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0IEZ1bmN0aW9uc0NvbnRyb2woKTogSUZ1bmN0aW9uQ29udHJvbFBhZ2VGdWxsU2NyZWVuIHtcbiAgICByZXR1cm4gdGhpcy5mdW5jdGlvbnNDb250cm9sKCk7XG4gIH1cblxuICAvLyAjcmVnaW9uIC0tLSBFVkVOVCBIQU5ETEVSUyAtLS1cbiAgcHJvdGVjdGVkIGhhbmRsZXJFZGl0KCkge1xuICAgIHRoaXMub3V0RWRpdC5lbWl0KCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2FuY2VsKCkge1xuICAgIHRoaXMub3V0Q2xvc2UuZW1pdCgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGhhbmRsZXJDbGlja0J1dHRvbihidXR0b246IElQYWdlc1RlbXBsYXRlRnVsbFNjcmVlbkJ1dHRvbikge1xuICAgIGlmIChidXR0b24/LmFjdGlvbikge1xuICAgICAgYXdhaXQgYnV0dG9uLmFjdGlvbigpO1xuICAgIH1cbiAgICB0aGlzLm91dENsaWNrQnV0dG9uLmVtaXQoYnV0dG9uKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVyU3dpdGNoKGV2ZW50OiBJU3dpdGNoRXZlbnQsIGJ1dHRvbjogSVBhZ2VzVGVtcGxhdGVGdWxsU2NyZWVuQnV0dG9uKSB7XG4gICAgaWYgKGJ1dHRvbj8uYWN0aW9uKSB7XG4gICAgICBhd2FpdCBidXR0b24uYWN0aW9uKGV2ZW50KTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlclNlbGVjdGVkS2V5KGV2ZW50OiBJRW1pdFNlbGVjdEtleSB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMub3V0U2VsZWN0ZWRNZW51RHJvcGRvd24uZW1pdChldmVudCk7XG4gICAgdGhpcy5mdW5jdGlvbkNvbnRyb2xNZW51Py5yZXNldCgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJDb250cm9sRHJvcGRvd25NZW51KGV2ZW50OiBJRHJvcGRvd25GdW5jdGlvbkNvbnRyb2xFdmVudCkge1xuICAgIHRoaXMuZnVuY3Rpb25Db250cm9sTWVudSA9IGV2ZW50O1xuICB9XG4gIC8vICNlbmRyZWdpb25cblxuICBwcml2YXRlIGVtaXRDbG9zZVBhZ2VGdWxsRXZlbnQoKSB7XG4gICAgY29uc3QgZGF0YSA9IHtcbiAgICAgIHR5cGU6IFV0aWxzQ29tbXVuaWNhdGVNaWNyb0tleUdsb2JhbC5LRVlfTUVTU0FHRV9NT0RBTCxcbiAgICAgIHJlc3BvbnNlOiB7XG4gICAgICAgIG1lc3NhZ2U6ICdjbG9zZScsXG4gICAgICAgIHN0YXRlOiBmYWxzZSxcbiAgICAgICAgaWRPdmVybGF5OiB0aGlzLmlkT3ZlcmxheSgpLFxuICAgICAgfSxcbiAgICB9O1xuICAgIFV0aWxzQ29tbXVuaWNhdGVNaWNyby5Qb3N0TWVzc2FnZVRvUGFyZW50KGRhdGEpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlnbm9yZUNsb3NlUGFnZUZ1bGxFdmVudCgpKSB7XG4gICAgICB0aGlzLmVtaXRDbG9zZVBhZ2VGdWxsRXZlbnQoKTtcbiAgICB9XG4gIH1cbn1cbiIsIjxkaXZcbiAgY2xhc3M9XCJsaWJzLXVpLWNvbXBvbmVudHMtcGFnZV9mdWxsIG92ZXJmbG93LWhpZGRlblwiXG4gIFtzdHlsZS56SW5kZXhdPVwiekluZGV4KClcIlxuICBbc3R5bGUuYmFja2dyb3VuZC1jb2xvcl09XCJpZ25vcmVCYWNrZ3JvdW5kQ29sb3IoKSA/ICd0cmFuc3BhcmVudCcgOiAnI2YyZjVmNydcIj5cbiAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT0gSEVBREVSIChnaeG7ryBuZ3V5w6puIDEwMCUgdOG7qyBWMSkgPT09PT09PT09PT09PT09PT09PT09IC0tPlxuICA8ZGl2IFtjbGFzc109XCInbGlicy11aS1jb21wb25lbnRzLXBhZ2VfZnVsbC1oZWFkZXIgJyArIGNsYXNzSGVhZGVySW5jbHVkZSgpXCI+XG4gICAgPGRpdiBjbGFzcz1cInt7IGRpdmlkZUNsYXNzSGVhZGVyKCk/LmNsYXNzQnV0dG9uQ2FuY2VsIHx8ICd3LVsyNSVdJyB9fVwiPlxuICAgICAgQGlmIChsZWZ0VGVtcGxhdGUoKTsgYXMgbGVmdFRlbXBsYXRlKSB7XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJsZWZ0VGVtcGxhdGVcIiAvPlxuICAgICAgfVxuICAgICAgQGlmIChsYWJlbExlZnQoKTsgYXMgbGFiZWxMZWZ0KSB7XG4gICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1idXR0b25cbiAgICAgICAgICBbbGFiZWxdPVwibGFiZWxMZWZ0XCJcbiAgICAgICAgICBbdHlwZV09XCInYnV0dG9uLWxpbmstcHJpbWFyeSdcIlxuICAgICAgICAgIFtjbGFzc0ljb25MZWZ0XT1cIidsaWJzLXVpLWljb24tY2hldnJvbi1yaWdodCByb3RhdGUtWzE4MGRlZ10gYmVmb3JlOnRleHQtWzE2cHhdJ1wiXG4gICAgICAgICAgW2NsYXNzTGFiZWxdPVwiJ2xpYnMtdWktZm9udC1oNHInXCJcbiAgICAgICAgICAob3V0Q2xpY2spPVwiY2FuY2VsKClcIiAvPlxuICAgICAgfVxuICAgIDwvZGl2PlxuXG4gICAgQGlmIChjZW50ZXJUZW1wbGF0ZSgpOyBhcyBjZW50ZXJUZW1wbGF0ZSkge1xuICAgICAgPGRpdiBjbGFzcz1cInt7IGRpdmlkZUNsYXNzSGVhZGVyKCk/LmNsYXNzQnV0dG9uQ2VudGVyIHx8ICd3LVs0MCVdJyB9fSBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlclwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY2VudGVyVGVtcGxhdGVcIiAvPlxuICAgICAgPC9kaXY+XG4gICAgfSBAZWxzZSB7XG4gICAgICA8ZGl2IGNsYXNzPVwie3sgZGl2aWRlQ2xhc3NIZWFkZXIoKT8uY2xhc3NCdXR0b25DZW50ZXIgfHwgJ3ctWzQwJV0nIH19IGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtcG9wb3ZlclxuICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICBbY29uZmlnXT1cInsgbWF4V2lkdGg6IDI1MCwgekluZGV4OiB6SW5kZXgoKSArIDEgfVwiXG4gICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCInbGlicy11aS1mb250LWgycydcIlxuICAgICAgICAgIFtpbm5lckh0bWxdPVwidGl0bGUoKSA/ICh0aXRsZSgpIHwgTGlic1VpUGlwZXNFc2NhcGVIdG1sUGlwZSkgOiAnJm1kYXNoOydcIiAvPlxuICAgICAgICBAaWYgKGhhc0VkaXQoKTsgYXMgaGFzRWRpdCkge1xuICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1idXR0b25cbiAgICAgICAgICAgIFt0eXBlXT1cIididXR0b24tbGluay1wcmltYXJ5J1wiXG4gICAgICAgICAgICAob3V0Q2xpY2spPVwiaGFuZGxlckVkaXQoKVwiXG4gICAgICAgICAgICBbaWNvbk9ubHlUeXBlXT1cInRydWVcIlxuICAgICAgICAgICAgW2NsYXNzSWNvbkxlZnRdPVwiJ2xpYnMtdWktaWNvbi1lZGl0LWxpbmUnXCJcbiAgICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiJ21sLVs0cHhdJ1wiIC8+XG4gICAgICAgIH1cbiAgICAgICAgQGZvciAoYnV0dG9uIG9mIGJ1dHRvbkNlbnRlcigpOyB0cmFjayBidXR0b24ua2V5KSB7XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1sLVsxMnB4XSBmbGV4IGl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgQGlmIChidXR0b24ua2V5ID09PSAnYnV0dG9uJykge1xuICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uXG4gICAgICAgICAgICAgICAgW2xhYmVsXT1cImJ1dHRvbi5sYWJlbCB8fCAnJ1wiXG4gICAgICAgICAgICAgICAgW2NsYXNzTGFiZWxdPVwiKGJ1dHRvbi5jbGFzc0xhYmVsIHx8ICcnKSArICcgbGlicy11aS1mb250LWhlYWQtNHMnXCJcbiAgICAgICAgICAgICAgICBbdHlwZV09XCJidXR0b24udHlwZSB8fCAnYnV0dG9uLXByaW1hcnknXCJcbiAgICAgICAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cImJ1dHRvbi5jbGFzc0luY2x1ZGUgfHwgJydcIlxuICAgICAgICAgICAgICAgIFtjbGFzc0ljb25MZWZ0XT1cImJ1dHRvbi5jbGFzc0ljb25MZWZ0IHx8ICcnXCJcbiAgICAgICAgICAgICAgICBbY2xhc3NJY29uUmlnaHRdPVwiYnV0dG9uLmNsYXNzSWNvblJpZ2h0IHx8ICcnXCJcbiAgICAgICAgICAgICAgICBbcG9wb3Zlcl09XCJidXR0b24ucG9wb3ZlciB8fCB7fVwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVdPVwiYnV0dG9uLmRpc2FibGUgfHwgZGlzYWJsZSgpXCJcbiAgICAgICAgICAgICAgICBbaXNQZW5kaW5nXT1cImJ1dHRvbi5pc1BlbmRpbmcgfHwgZmFsc2VcIlxuICAgICAgICAgICAgICAgIChvdXRDbGljayk9XCJoYW5kbGVyQ2xpY2tCdXR0b24oYnV0dG9uKVwiIC8+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAaWYgKGJ1dHRvbi5rZXkgPT09ICdidXR0b24tc3RhdHVzJyAmJiBidXR0b24uY29uZmlnQnV0dG9uU3RhdHVzKSB7XG4gICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1zdGF0dXNcbiAgICAgICAgICAgICAgICBbY2xhc3NdPVwiYnV0dG9uLmNsYXNzSW5jbHVkZVwiXG4gICAgICAgICAgICAgICAgW2NvbmZpZ109XCJidXR0b24uY29uZmlnQnV0dG9uU3RhdHVzXCIgLz5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBpZiAoYnV0dG9uLmtleSA9PT0gJ3N3aXRjaCcpIHtcbiAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1zd2l0Y2hcbiAgICAgICAgICAgICAgICBbYWN0aXZlXT1cImJ1dHRvbi5hY3RpdmUgfHwgZmFsc2VcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlXT1cImJ1dHRvbi5kaXNhYmxlIHx8IGRpc2FibGUoKVwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJ7eyBidXR0b24uY2xhc3NJbmNsdWRlIH19XCJcbiAgICAgICAgICAgICAgICAob3V0U3dpdGNoKT1cImhhbmRsZXJTd2l0Y2goJGV2ZW50LCBidXR0b24pXCIgLz5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBpZiAoYnV0dG9uLmtleSA9PT0gJ2xhYmVsJyAmJiBidXR0b24ubGFiZWxDb25maWcpIHtcbiAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1sYWJlbFxuICAgICAgICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiYnV0dG9uLmxhYmVsQ29uZmlnLmNsYXNzSW5jbHVkZSArICcgcGItMCB0ZXh0LXdoaXRlJ1wiXG4gICAgICAgICAgICAgICAgW2xhYmVsTGVmdF09XCJidXR0b24ubGFiZWxDb25maWcubGFiZWxMZWZ0XCJcbiAgICAgICAgICAgICAgICBbbGFiZWxMZWZ0Q2xhc3NdPVwiYnV0dG9uLmxhYmVsQ29uZmlnLmxhYmVsTGVmdENsYXNzXCJcbiAgICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwiYnV0dG9uLmxhYmVsQ29uZmlnLnJlcXVpcmVkXCJcbiAgICAgICAgICAgICAgICBbZGVzY3JpcHRpb25dPVwiYnV0dG9uLmxhYmVsQ29uZmlnLmRlc2NyaXB0aW9uXCJcbiAgICAgICAgICAgICAgICBbbGFiZWxSaWdodF09XCJidXR0b24ubGFiZWxDb25maWcubGFiZWxSaWdodFwiXG4gICAgICAgICAgICAgICAgW2xhYmVsUmlnaHRDbGFzc109XCJidXR0b24ubGFiZWxDb25maWcubGFiZWxSaWdodENsYXNzXCJcbiAgICAgICAgICAgICAgICBbb25seVNob3dDb3VudF09XCJidXR0b24ubGFiZWxDb25maWcub25seVNob3dDb3VudFwiXG4gICAgICAgICAgICAgICAgW2J1dHRvbnNMZWZ0XT1cImJ1dHRvbi5sYWJlbENvbmZpZy5idXR0b25zTGVmdFwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVCdXR0b25zTGVmdF09XCJidXR0b24ubGFiZWxDb25maWcuZGlzYWJsZUJ1dHRvbnNMZWZ0XCJcbiAgICAgICAgICAgICAgICBbYnV0dG9uc1JpZ2h0XT1cImJ1dHRvbi5sYWJlbENvbmZpZy5idXR0b25zUmlnaHRcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlQnV0dG9uc1JpZ2h0XT1cImJ1dHRvbi5sYWJlbENvbmZpZy5kaXNhYmxlQnV0dG9uc1JpZ2h0XCJcbiAgICAgICAgICAgICAgICBbaGFzVG9nZ2xlXT1cImJ1dHRvbi5sYWJlbENvbmZpZy5oYXNUb2dnbGVcIlxuICAgICAgICAgICAgICAgIFt0b2dnbGVBY3RpdmVdPVwiYnV0dG9uLmxhYmVsQ29uZmlnLnRvZ2dsZUFjdGl2ZVwiXG4gICAgICAgICAgICAgICAgW3RvZ2dsZURpc2FibGVdPVwiYnV0dG9uLmxhYmVsQ29uZmlnLnRvZ2dsZURpc2FibGVcIlxuICAgICAgICAgICAgICAgIFtwb3BvdmVyXT1cImJ1dHRvbi5sYWJlbENvbmZpZy5wb3BvdmVyXCJcbiAgICAgICAgICAgICAgICBbaWNvblBvcG92ZXJDbGFzc109XCJidXR0b24ubGFiZWxDb25maWcuaWNvblBvcG92ZXJDbGFzc1wiXG4gICAgICAgICAgICAgICAgW2xpbWl0TGVuZ3RoXT1cImJ1dHRvbi5sYWJlbENvbmZpZy5saW1pdExlbmd0aFwiXG4gICAgICAgICAgICAgICAgW2J1dHRvbnNEZXNjcmlwdGlvbl09XCJidXR0b24ubGFiZWxDb25maWcuYnV0dG9uc0Rlc2NyaXB0aW9uXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZUJ1dHRvbnNEZXNjcmlwdGlvbl09XCJidXR0b24ubGFiZWxDb25maWcuZGlzYWJsZUJ1dHRvbnNEZXNjcmlwdGlvblwiXG4gICAgICAgICAgICAgICAgW2J1dHRvbnNEZXNjcmlwdGlvbkNvbnRhaW5lckNsYXNzXT1cImJ1dHRvbi5sYWJlbENvbmZpZy5idXR0b25zRGVzY3JpcHRpb25Db250YWluZXJDbGFzc1wiXG4gICAgICAgICAgICAgICAgW2NvdW50XT1cImJ1dHRvbi5sYWJlbENvbmZpZy5jb3VudFwiIC8+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuICAgIH1cblxuICAgIDxkaXYgY2xhc3M9XCJ7eyBkaXZpZGVDbGFzc0hlYWRlcigpPy5jbGFzc0J1dHRvblJpZ2h0IHx8ICd3LVszNSVdJyB9fSBmbGV4IGp1c3RpZnktZW5kIGl0ZW1zLWNlbnRlclwiPlxuICAgICAgQGZvciAoYnV0dG9uIG9mIGJ1dHRvblJpZ2h0KCk7IHRyYWNrIGJ1dHRvbi5rZXkpIHtcbiAgICAgICAgPGRpdiBbY2xhc3MubWwtWzEycHhdXT1cIiEkZmlyc3RcIj5cbiAgICAgICAgICBAaWYgKGJ1dHRvbi5rZXkgPT09ICdsYWJlbCcgJiYgYnV0dG9uLmxhYmVsQ29uZmlnKSB7XG4gICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWxhYmVsXG4gICAgICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiYnV0dG9uLmxhYmVsQ29uZmlnLmNsYXNzSW5jbHVkZSArICcgcGItMCdcIlxuICAgICAgICAgICAgICBbbGFiZWxMZWZ0XT1cImJ1dHRvbi5sYWJlbENvbmZpZy5sYWJlbExlZnRcIlxuICAgICAgICAgICAgICBbbGFiZWxMZWZ0Q2xhc3NdPVwiYnV0dG9uLmxhYmVsQ29uZmlnLmxhYmVsTGVmdENsYXNzXCJcbiAgICAgICAgICAgICAgW3JlcXVpcmVkXT1cImJ1dHRvbi5sYWJlbENvbmZpZy5yZXF1aXJlZFwiXG4gICAgICAgICAgICAgIFtkZXNjcmlwdGlvbl09XCJidXR0b24ubGFiZWxDb25maWcuZGVzY3JpcHRpb25cIlxuICAgICAgICAgICAgICBbbGFiZWxSaWdodF09XCJidXR0b24ubGFiZWxDb25maWcubGFiZWxSaWdodFwiXG4gICAgICAgICAgICAgIFtsYWJlbFJpZ2h0Q2xhc3NdPVwiYnV0dG9uLmxhYmVsQ29uZmlnLmxhYmVsUmlnaHRDbGFzc1wiXG4gICAgICAgICAgICAgIFtvbmx5U2hvd0NvdW50XT1cImJ1dHRvbi5sYWJlbENvbmZpZy5vbmx5U2hvd0NvdW50XCJcbiAgICAgICAgICAgICAgW2J1dHRvbnNMZWZ0XT1cImJ1dHRvbi5sYWJlbENvbmZpZy5idXR0b25zTGVmdFwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlQnV0dG9uc0xlZnRdPVwiYnV0dG9uLmxhYmVsQ29uZmlnLmRpc2FibGVCdXR0b25zTGVmdFwiXG4gICAgICAgICAgICAgIFtidXR0b25zUmlnaHRdPVwiYnV0dG9uLmxhYmVsQ29uZmlnLmJ1dHRvbnNSaWdodFwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlQnV0dG9uc1JpZ2h0XT1cImJ1dHRvbi5sYWJlbENvbmZpZy5kaXNhYmxlQnV0dG9uc1JpZ2h0XCJcbiAgICAgICAgICAgICAgW2hhc1RvZ2dsZV09XCJidXR0b24ubGFiZWxDb25maWcuaGFzVG9nZ2xlXCJcbiAgICAgICAgICAgICAgW3RvZ2dsZUFjdGl2ZV09XCJidXR0b24ubGFiZWxDb25maWcudG9nZ2xlQWN0aXZlXCJcbiAgICAgICAgICAgICAgW3RvZ2dsZURpc2FibGVdPVwiYnV0dG9uLmxhYmVsQ29uZmlnLnRvZ2dsZURpc2FibGVcIlxuICAgICAgICAgICAgICBbcG9wb3Zlcl09XCJidXR0b24ubGFiZWxDb25maWcucG9wb3ZlclwiXG4gICAgICAgICAgICAgIFtpY29uUG9wb3ZlckNsYXNzXT1cImJ1dHRvbi5sYWJlbENvbmZpZy5pY29uUG9wb3ZlckNsYXNzXCJcbiAgICAgICAgICAgICAgW2xpbWl0TGVuZ3RoXT1cImJ1dHRvbi5sYWJlbENvbmZpZy5saW1pdExlbmd0aFwiXG4gICAgICAgICAgICAgIFtidXR0b25zRGVzY3JpcHRpb25dPVwiYnV0dG9uLmxhYmVsQ29uZmlnLmJ1dHRvbnNEZXNjcmlwdGlvblwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlQnV0dG9uc0Rlc2NyaXB0aW9uXT1cImJ1dHRvbi5sYWJlbENvbmZpZy5kaXNhYmxlQnV0dG9uc0Rlc2NyaXB0aW9uXCJcbiAgICAgICAgICAgICAgW2J1dHRvbnNEZXNjcmlwdGlvbkNvbnRhaW5lckNsYXNzXT1cImJ1dHRvbi5sYWJlbENvbmZpZy5idXR0b25zRGVzY3JpcHRpb25Db250YWluZXJDbGFzc1wiXG4gICAgICAgICAgICAgIFtjb3VudF09XCJidXR0b24ubGFiZWxDb25maWcuY291bnRcIiAvPlxuICAgICAgICAgIH1cbiAgICAgICAgICBAaWYgKGJ1dHRvbi5rZXkgPT09ICdzd2l0Y2gnKSB7XG4gICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLXN3aXRjaFxuICAgICAgICAgICAgICBbYWN0aXZlXT1cImJ1dHRvbi5hY3RpdmUgfHwgZmFsc2VcIlxuICAgICAgICAgICAgICBbZGlzYWJsZV09XCJidXR0b24uZGlzYWJsZSB8fCBkaXNhYmxlKClcIlxuICAgICAgICAgICAgICBjbGFzcz1cInt7IGJ1dHRvbi5jbGFzc0luY2x1ZGUgfX1cIlxuICAgICAgICAgICAgICAob3V0U3dpdGNoKT1cImhhbmRsZXJTd2l0Y2goJGV2ZW50LCBidXR0b24pXCIgLz5cbiAgICAgICAgICB9XG4gICAgICAgICAgQGlmIChidXR0b24ua2V5ID09PSAnYnV0dG9uJykge1xuICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLWJ1dHRvblxuICAgICAgICAgICAgICBbbGFiZWxdPVwiYnV0dG9uPy5sYWJlbCB8fCAnJ1wiXG4gICAgICAgICAgICAgIFtjbGFzc0xhYmVsXT1cIihidXR0b24uY2xhc3NMYWJlbCB8fCAnJykgKyAnIGxpYnMtdWktZm9udC1oNHMnXCJcbiAgICAgICAgICAgICAgW3R5cGVdPVwiYnV0dG9uLnR5cGUgfHwgJ2J1dHRvbi1wcmltYXJ5J1wiXG4gICAgICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiYnV0dG9uLmNsYXNzSW5jbHVkZSB8fCAnJ1wiXG4gICAgICAgICAgICAgIFtjbGFzc0ljb25MZWZ0XT1cImJ1dHRvbi5jbGFzc0ljb25MZWZ0IHx8ICcnXCJcbiAgICAgICAgICAgICAgW2NsYXNzSWNvblJpZ2h0XT1cImJ1dHRvbi5jbGFzc0ljb25SaWdodCB8fCAnJ1wiXG4gICAgICAgICAgICAgIFtwb3BvdmVyXT1cImJ1dHRvbi5wb3BvdmVyIHx8IHt9XCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVdPVwiYnV0dG9uLmRpc2FibGUgfHwgZGlzYWJsZSgpXCJcbiAgICAgICAgICAgICAgW2lzUGVuZGluZ109XCJidXR0b24uaXNQZW5kaW5nIHx8IGZhbHNlXCJcbiAgICAgICAgICAgICAgW2ljb25Pbmx5VHlwZV09XCJidXR0b24uaWNvbk9ubHlUeXBlIHx8IGZhbHNlXCJcbiAgICAgICAgICAgICAgKG91dENsaWNrKT1cImhhbmRsZXJDbGlja0J1dHRvbihidXR0b24pXCIgLz5cbiAgICAgICAgICB9XG4gICAgICAgICAgQGlmIChidXR0b24ua2V5ID09PSAnbGluZS1zcGFjZScpIHtcbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgY2xhc3M9XCJiZy1bIzY2NmI3OV0gdy1bMXB4XSBoLVsyOHB4XVwiXG4gICAgICAgICAgICAgIFtjbGFzc109XCJidXR0b24uY2xhc3NJbmNsdWRlXCI+XG4gICAgICAgICAgICAgICZuYnNwO1xuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICAgIEBpZiAobWVudURyb3BEb3duQ29uZmlncygpOyBhcyBtZW51RHJvcERvd25Db25maWdzKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtbC1bMTJweF1cIj5cbiAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWRyb3Bkb3duXG4gICAgICAgICAgICBbaXNOZ0NvbnRlbnRdPVwidHJ1ZVwiXG4gICAgICAgICAgICBbekluZGV4XT1cInpJbmRleCgpICsgMVwiXG4gICAgICAgICAgICBbbGlzdENvbmZpZ109XCJtZW51RHJvcERvd25Db25maWdzLmxpc3RDb25maWdcIlxuICAgICAgICAgICAgW2xpc3RIaWRkZW5JbnB1dFNlYXJjaF09XCJ0cnVlXCJcbiAgICAgICAgICAgIFtwb3BvdmVyQ3VzdG9tQ29uZmlnXT1cIm1lbnVEcm9wRG93bkNvbmZpZ3MucG9wb3ZlckN1c3RvbUNvbmZpZ1wiXG4gICAgICAgICAgICAob3V0RnVuY3Rpb25zQ29udHJvbCk9XCJoYW5kbGVyQ29udHJvbERyb3Bkb3duTWVudSgkZXZlbnQpXCJcbiAgICAgICAgICAgIChvdXRTZWxlY3RLZXkpPVwiaGFuZGxlclNlbGVjdGVkS2V5KCRldmVudClcIj5cbiAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1idXR0b25cbiAgICAgICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCIncC1bOHB4XSdcIlxuICAgICAgICAgICAgICBbdHlwZV09XCInYnV0dG9uLXRoaXJkJ1wiXG4gICAgICAgICAgICAgIFtpY29uT25seVR5cGVdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIFtjbGFzc0ljb25MZWZ0XT1cIidsaWJzLXVpLWljb24tbW9yZS12ZXJ0aWNhbCB0ZXh0LVsjMzMzMzMzXSB0ZXh0LVsxMnB4XSdcIlxuICAgICAgICAgICAgICBbcG9wb3Zlcl09XCJ7IGNvbmZpZzogeyBjb250ZW50OiAnaTE4bl80eF9vdGhlcl9vcGVyYXRpb25zJyB9IH1cIlxuICAgICAgICAgICAgICBbaWdub3JlU3RvcFByb3BhZ2F0aW9uRXZlbnRdPVwidHJ1ZVwiIC8+XG4gICAgICAgICAgPC9saWJzX3VpLWNvbXBvbmVudHMtZHJvcGRvd24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgICAgQGlmICh0ZW1wbGF0ZVJpZ2h0KCk7IGFzIHRlbXBsYXRlUmlnaHQpIHtcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRlbXBsYXRlUmlnaHRcIiAvPlxuICAgICAgfVxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8IS0tID09PT09PT09PT09PT09PT09PT09PSBCT0RZIChWMjogTGF6eSBMb2FkIGhv4bq3YyBuZy1jb250ZW50KSA9PT09PT09PT09PT09PT09PT09PT0gLS0+XG4gIEBpZiAoYm9keUNvbmZpZygpLmdldENvbXBvbmVudE91dGxldDsgYXMgZ2V0Qm9keUNvbXBvbmVudE91dGxldCkge1xuICAgIDwhLS0gTGF6eSBsb2FkIG1vZGUgLS0+XG4gICAgPGRpdiBbY2xhc3NdPVwiJ2xpYnMtdWktY29tcG9uZW50cy1wYWdlX2Z1bGwtYm9keSAnICsgKGJvZHlDb25maWcoKS5jbGFzc0luY2x1ZGUgfHwgJycpXCI+XG4gICAgICBAbGV0IGNvbnN0SHRtbENvbXBCb2R5ID0gdW5kZWZpbmVkIHwgTGlic1VpUGlwZXNDYWxsRnVuY3Rpb25JblRlbXBsYXRlUGlwZTogZ2V0Qm9keUNvbXBvbmVudE91dGxldCA6IHNlY3Rpb25EYXRhKCkgOiBudWxsIDogcGlwZUVtcHR5Q29uZmlnIHwgYXN5bmM7XG4gICAgICBAbGV0IGNvbnN0SHRtbElucHV0c0JvZHkgPSB1bmRlZmluZWQgfCBMaWJzVWlQaXBlc0NhbGxGdW5jdGlvbkluVGVtcGxhdGVQaXBlOiBib2R5Q29uZmlnKCkuZ2V0RGF0YUNvbXBvbmVudE91dGxldCA6IHNlY3Rpb25EYXRhKCkgOiBudWxsIDogcGlwZUVtcHR5Q29uZmlnIHwgYXN5bmM7XG4gICAgICBAaWYgKGNvbnN0SHRtbENvbXBCb2R5KSB7XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nQ29tcG9uZW50T3V0bGV0PVwiY29uc3RIdG1sQ29tcEJvZHk7IGlucHV0czogY29uc3RIdG1sSW5wdXRzQm9keVwiIC8+XG4gICAgICB9IEBlbHNlIHtcbiAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1za2VsZXRvbiBbY29uZmlnXT1cInJlc29sdmVkU2tlbGV0b25Cb2R5KClcIiAvPlxuICAgICAgfVxuICAgIDwvZGl2PlxuICB9XG48L2Rpdj5cbiJdfQ==
@@ -1,2 +1,2 @@
1
1
  export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnVsbC1zY3JlZW4tdjIuaW50ZXJmYWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL3BhZ2VzLXRlbXBsYXRlL2Z1bGwtc2NyZWVuL3NyYy9mdWxsLXNjcmVlbi12Mi9pbnRlcmZhY2VzL2Z1bGwtc2NyZWVuLXYyLmludGVyZmFjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuaW1wb3J0IHsgV3JpdGFibGVTaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IElTa2VsZXRvbkNvbmZpZyB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtc2tlbGV0b24nO1xuaW1wb3J0IHsgVFlQRV9GVU5DVElPTiB9IGZyb20gJ0BsaWJzLXVpL2ludGVyZmFjZXMtdHlwZXMnO1xuXG4vKipcbiAqIENvbmZpZyBkw6BuaCByacOqbmcgY2hvIHbDuW5nIGJvZHkgVjIg4oCUIGjhu5cgdHLhu6MgbGF6eSBsb2FkIGNvbXBvbmVudCDEkeG7mW5nLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElGdWxsU2NyZWVuVjJCb2R5Q29uZmlnIHtcbiAgLyoqIEjDoG0gdHLhuqMgduG7gSBPYnNlcnZhYmxlPFR5cGU8YW55Pj4gxJHhu4MgbGF6eSBsb2FkIGNvbXBvbmVudCB2w6BvIGJvZHkgKi9cbiAgZ2V0Q29tcG9uZW50T3V0bGV0PzogVFlQRV9GVU5DVElPTjxhbnk+O1xuICAvKiogSMOgbSB0cuG6oyB24buBIE9ic2VydmFibGU8UmVjb3JkPiDEkeG7gyB0cnV54buBbiBk4buvIGxp4buHdSAoaW5wdXRzKSB2w6BvIGNvbXBvbmVudCDEkcaw4bujYyBsb2FkICovXG4gIGdldERhdGFDb21wb25lbnRPdXRsZXQ/OiBUWVBFX0ZVTkNUSU9OPFJlY29yZDxzdHJpbmcsIHVua25vd24+PjtcbiAgLyoqIFNrZWxldG9uIHTDuXkgY2jhu4luaCB0cm9uZyBsw7pjIE9ic2VydmFibGUgY2jhu50gcmVzb2x2ZSDigJQgZMO5bmcgV3JpdGFibGVTaWduYWwgxJHhu4MgcmVhY3RpdmUgKi9cbiAgc2tlbGV0b25Db25maWc/OiBXcml0YWJsZVNpZ25hbDxJU2tlbGV0b25Db25maWc+O1xuICAvKiogQ2xhc3MgdGjDqm0gdsOgbyB2w7luZyBib2R5IHdyYXBwZXIgbmdvw6BpICovXG4gIGNsYXNzSW5jbHVkZT86IHN0cmluZztcbn1cblxuLyoqIEThu68gbGnhu4d1IHJlYWN0aXZlIHRydXnhu4FuIHbDoG8gQ29tcG9uZW50IE91dGxldCBib2R5ICovXG5leHBvcnQgaW50ZXJmYWNlIElGdWxsU2NyZWVuVjJTZWN0aW9uRGF0YSB7XG4gIGRpc2FibGU6IGJvb2xlYW47XG59XG4iXX0=
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnVsbC1zY3JlZW4tdjIuaW50ZXJmYWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL3BhZ2VzLXRlbXBsYXRlL2Z1bGwtc2NyZWVuL3NyYy9mdWxsLXNjcmVlbi12Mi9pbnRlcmZhY2VzL2Z1bGwtc2NyZWVuLXYyLmludGVyZmFjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuaW1wb3J0IHsgV3JpdGFibGVTaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IElTa2VsZXRvbkNvbmZpZyB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtc2tlbGV0b24nO1xuaW1wb3J0IHsgVFlQRV9GVU5DVElPTiB9IGZyb20gJ0BsaWJzLXVpL2ludGVyZmFjZXMtdHlwZXMnO1xuXG4vKipcbiAqIENvbmZpZyBkw6BuaCByacOqbmcgY2hvIHbDuW5nIGJvZHkgVjIg4oCUIGjhu5cgdHLhu6MgbGF6eSBsb2FkIGNvbXBvbmVudCDEkeG7mW5nLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElGdWxsU2NyZWVuVjJCb2R5Q29uZmlnIHtcbiAgLyoqIEjDoG0gdHLhuqMgduG7gSBPYnNlcnZhYmxlPFR5cGU8YW55Pj4gxJHhu4MgbGF6eSBsb2FkIGNvbXBvbmVudCB2w6BvIGJvZHkgKi9cbiAgZ2V0Q29tcG9uZW50T3V0bGV0PzogVFlQRV9GVU5DVElPTjxhbnk+O1xuICAvKiogSMOgbSB0cuG6oyB24buBIE9ic2VydmFibGU8UmVjb3JkPiDEkeG7gyB0cnV54buBbiBk4buvIGxp4buHdSAoaW5wdXRzKSB2w6BvIGNvbXBvbmVudCDEkcaw4bujYyBsb2FkICovXG4gIGdldERhdGFDb21wb25lbnRPdXRsZXQ/OiBUWVBFX0ZVTkNUSU9OPFJlY29yZDxzdHJpbmcsIHVua25vd24+PjtcbiAgLyoqIFNrZWxldG9uIHTDuXkgY2jhu4luaCB0cm9uZyBsw7pjIE9ic2VydmFibGUgY2jhu50gcmVzb2x2ZSDigJQgZMO5bmcgV3JpdGFibGVTaWduYWwgxJHhu4MgcmVhY3RpdmUgKi9cbiAgc2tlbGV0b25Db25maWc/OiBXcml0YWJsZVNpZ25hbDxJU2tlbGV0b25Db25maWc+O1xuICAvKiogQ2xhc3MgdGjDqm0gdsOgbyB2w7luZyBib2R5IHdyYXBwZXIgbmdvw6BpICovXG4gIGNsYXNzSW5jbHVkZT86IHN0cmluZztcbn1cblxuLyoqIEThu68gbGnhu4d1IHJlYWN0aXZlIHRydXnhu4FuIHbDoG8gQ29tcG9uZW50IE91dGxldCBib2R5ICovXG5leHBvcnQgaW50ZXJmYWNlIElGdWxsU2NyZWVuVjJTZWN0aW9uRGF0YSB7XG4gIGRpc2FibGU6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUZ1bmN0aW9uQ29udHJvbFBhZ2VGdWxsU2NyZWVuIHtcbiAgZW1pdENsb3NlUGFnZUZ1bGxFdmVudDogKCkgPT4gdm9pZDtcbn1cbiJdfQ==
@@ -11,6 +11,9 @@ import { getDayjs, UtilsCommunicateMicro, UtilsCommunicateMicroKeyGlobal, uuid }
11
11
  import { TranslateModule } from '@ngx-translate/core';
12
12
  import { interval, Subject, takeUntil } from 'rxjs';
13
13
  import * as i0 from "@angular/core";
14
+ /**
15
+ * @deprecated Use {@link LibsUiComponentsPagesTemplateFullScreenV2Component} instead.
16
+ */
14
17
  export class LibsUiComponentsPagesTemplateFullScreenComponent {
15
18
  idOverlay = signal(uuid());
16
19
  functionControlMenu;
@@ -66,13 +69,13 @@ export class LibsUiComponentsPagesTemplateFullScreenComponent {
66
69
  this.outClose.emit();
67
70
  }
68
71
  async handlerClickButton(button) {
69
- if (button && button.action) {
72
+ if (button?.action) {
70
73
  await button.action();
71
74
  }
72
75
  this.outClickButton.emit(button);
73
76
  }
74
77
  async handlerSwitch(event, button) {
75
- if (button && button.action) {
78
+ if (button?.action) {
76
79
  await button.action(event);
77
80
  }
78
81
  }
@@ -115,4 +118,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
115
118
  LibsUiComponentsLabelComponent,
116
119
  ], providers: [], template: "<div\n class=\"libs-ui-components-page_full overflow-hidden\"\n [style.zIndex]=\"zIndex()\"\n [style.background-color]=\"ignoreBackgroundColor() ? 'transparent' : '#f2f5f7'\">\n <div [class]=\"'libs-ui-components-page_full-header ' + classHeaderInclude()\">\n <div class=\"{{ divideClassHeader()?.classButtonCancel || 'w-[25%]' }}\">\n @if (leftTemplate(); as leftTemplate) {\n <ng-container *ngTemplateOutlet=\"leftTemplate\" />\n }\n @if (labelLeft(); as labelLeft) {\n <libs_ui-components-buttons-button\n [label]=\"labelLeft\"\n [type]=\"'button-link-primary'\"\n [classIconLeft]=\"'libs-ui-icon-chevron-right rotate-[180deg] before:text-[16px]'\"\n [classLabel]=\"'libs-ui-font-h4r'\"\n (outClick)=\"cancel()\" />\n }\n </div>\n\n @if (centerTemplate(); as centerTemplate) {\n <div class=\"{{ divideClassHeader()?.classButtonCenter || 'w-[40%]' }} flex items-center justify-center\">\n <ng-container *ngTemplateOutlet=\"centerTemplate\" />\n </div>\n } @else {\n <div class=\"{{ divideClassHeader()?.classButtonCenter || 'w-[40%]' }} flex items-center justify-center\">\n <libs_ui-components-popover\n type=\"text\"\n [config]=\"{\n maxWidth: 250,\n zIndex: zIndex() + 1,\n }\"\n [classInclude]=\"'libs-ui-font-h2s'\"\n [innerHtml]=\"title() ? (title() | LibsUiPipesEscapeHtmlPipe) : '&mdash;'\" />\n\n @if (hasEdit(); as hasEdit) {\n <libs_ui-components-buttons-button\n [type]=\"'button-link-primary'\"\n (outClick)=\"handlerEdit()\"\n [iconOnlyType]=\"true\"\n [classIconLeft]=\"'libs-ui-icon-edit-line'\"\n [classInclude]=\"'ml-[4px]'\" />\n }\n @for (button of buttonCenter(); track button.key) {\n <div class=\"ml-[12px] flex items-center\">\n @if (button.key === 'button') {\n <libs_ui-components-buttons-button\n [label]=\"button.label || ''\"\n [classLabel]=\"(button.classLabel || '') + ' libs-ui-font-head-4s'\"\n [type]=\"button.type || 'button-primary'\"\n [classInclude]=\"button.classInclude || ''\"\n [classIconLeft]=\"button.classIconLeft || ''\"\n [classIconRight]=\"button.classIconRight || ''\"\n [popover]=\"button.popover || {}\"\n [disable]=\"button.disable || disable()\"\n [isPending]=\"button.isPending || false\"\n (outClick)=\"handlerClickButton(button)\" />\n }\n @if (button.key === 'button-status' && button.configButtonStatus) {\n <libs_ui-components-buttons-status\n [class]=\"button.classInclude\"\n [config]=\"button.configButtonStatus\" />\n }\n @if (button.key === 'switch') {\n <libs_ui-components-switch\n [active]=\"button.active || false\"\n [disable]=\"button.disable || disable()\"\n class=\"{{ button.classInclude }}\"\n (outSwitch)=\"handlerSwitch($event, button)\" />\n }\n @if (button.key === 'label' && button.labelConfig) {\n <libs_ui-components-label\n [classInclude]=\"button.labelConfig.classInclude + ' pb-0 text-white'\"\n [labelLeft]=\"button.labelConfig.labelLeft\"\n [labelLeftClass]=\"button.labelConfig.labelLeftClass\"\n [required]=\"button.labelConfig.required\"\n [description]=\"button.labelConfig.description\"\n [labelRight]=\"button.labelConfig.labelRight\"\n [labelRightClass]=\"button.labelConfig.labelRightClass\"\n [onlyShowCount]=\"button.labelConfig.onlyShowCount\"\n [buttonsLeft]=\"button.labelConfig.buttonsLeft\"\n [disableButtonsLeft]=\"button.labelConfig.disableButtonsLeft\"\n [buttonsRight]=\"button.labelConfig.buttonsRight\"\n [disableButtonsRight]=\"button.labelConfig.disableButtonsRight\"\n [hasToggle]=\"button.labelConfig.hasToggle\"\n [toggleActive]=\"button.labelConfig.toggleActive\"\n [toggleDisable]=\"button.labelConfig.toggleDisable\"\n [popover]=\"button.labelConfig.popover\"\n [iconPopoverClass]=\"button.labelConfig.iconPopoverClass\"\n [onlyShowCount]=\"button.labelConfig.onlyShowCount\"\n [limitLength]=\"button.labelConfig.limitLength\"\n [buttonsDescription]=\"button.labelConfig.buttonsDescription\"\n [disableButtonsDescription]=\"button.labelConfig.disableButtonsDescription\"\n [buttonsDescriptionContainerClass]=\"button.labelConfig.buttonsDescriptionContainerClass\"\n [count]=\"button.labelConfig.count\" />\n }\n </div>\n }\n </div>\n }\n\n <div class=\"{{ divideClassHeader()?.classButtonRight || 'w-[35%]' }} flex justify-end items-center\">\n @for (button of buttonRight(); track button.key) {\n <div [class.ml-[12px]]=\"!$first\">\n @if (button.key === 'label' && button.labelConfig) {\n <libs_ui-components-label\n [classInclude]=\"button.labelConfig.classInclude + ' pb-0'\"\n [labelLeft]=\"button.labelConfig.labelLeft\"\n [labelLeftClass]=\"button.labelConfig.labelLeftClass\"\n [required]=\"button.labelConfig.required\"\n [description]=\"button.labelConfig.description\"\n [labelRight]=\"button.labelConfig.labelRight\"\n [labelRightClass]=\"button.labelConfig.labelRightClass\"\n [onlyShowCount]=\"button.labelConfig.onlyShowCount\"\n [buttonsLeft]=\"button.labelConfig.buttonsLeft\"\n [disableButtonsLeft]=\"button.labelConfig.disableButtonsLeft\"\n [buttonsRight]=\"button.labelConfig.buttonsRight\"\n [disableButtonsRight]=\"button.labelConfig.disableButtonsRight\"\n [hasToggle]=\"button.labelConfig.hasToggle\"\n [toggleActive]=\"button.labelConfig.toggleActive\"\n [toggleDisable]=\"button.labelConfig.toggleDisable\"\n [popover]=\"button.labelConfig.popover\"\n [iconPopoverClass]=\"button.labelConfig.iconPopoverClass\"\n [onlyShowCount]=\"button.labelConfig.onlyShowCount\"\n [limitLength]=\"button.labelConfig.limitLength\"\n [buttonsDescription]=\"button.labelConfig.buttonsDescription\"\n [disableButtonsDescription]=\"button.labelConfig.disableButtonsDescription\"\n [buttonsDescriptionContainerClass]=\"button.labelConfig.buttonsDescriptionContainerClass\"\n [count]=\"button.labelConfig.count\" />\n }\n @if (button.key === 'switch') {\n <libs_ui-components-switch\n [active]=\"button.active || false\"\n [disable]=\"button.disable || disable()\"\n class=\"{{ button.classInclude }}\"\n (outSwitch)=\"handlerSwitch($event, button)\" />\n }\n\n @if (button.key === 'button') {\n <libs_ui-components-buttons-button\n [label]=\"button?.label || ''\"\n [classLabel]=\"(button.classLabel || '') + ' libs-ui-font-h4s'\"\n [type]=\"button.type || 'button-primary'\"\n [classInclude]=\"button.classInclude || ''\"\n [classIconLeft]=\"button.classIconLeft || ''\"\n [classIconRight]=\"button.classIconRight || ''\"\n [popover]=\"button.popover || {}\"\n [disable]=\"button.disable || disable()\"\n [isPending]=\"button.isPending || false\"\n [iconOnlyType]=\"button.iconOnlyType || false\"\n (outClick)=\"handlerClickButton(button)\" />\n }\n <!-- th\u00EAm \u0111\u01B0\u1EDDng ph\u00E2n c\u00E1ch -->\n @if (button.key === 'line-space') {\n <div\n class=\"bg-[#666b79] w-[1px] h-[28px]\"\n [class]=\"button.classInclude\">\n &nbsp;\n </div>\n }\n </div>\n }\n @if (menuDropDownConfigs(); as menuDropDownConfigs) {\n <div class=\"ml-[12px]\">\n <libs_ui-components-dropdown\n [isNgContent]=\"true\"\n [zIndex]=\"zIndex() + 1\"\n [listConfig]=\"menuDropDownConfigs.listConfig\"\n [listHiddenInputSearch]=\"true\"\n [popoverCustomConfig]=\"menuDropDownConfigs.popoverCustomConfig\"\n (outFunctionsControl)=\"handlerControlDropdownMenu($event)\"\n (outSelectKey)=\"handlerSelectedKey($event)\">\n <libs_ui-components-buttons-button\n [classInclude]=\"'p-[8px]'\"\n [type]=\"'button-third'\"\n [iconOnlyType]=\"true\"\n [classIconLeft]=\"'libs-ui-icon-more-vertical text-[#333333] text-[12px]'\"\n [popover]=\"{\n config: {\n content: 'i18n_4x_other_operations',\n },\n }\"\n [ignoreStopPropagationEvent]=\"true\" />\n </libs_ui-components-dropdown>\n </div>\n }\n @if (templateRight(); as templateRight) {\n <ng-container *ngTemplateOutlet=\"templateRight\" />\n }\n </div>\n </div>\n <div [class]=\"'libs-ui-components-page_full-body ' + classBodyInclude()\">\n <ng-content />\n </div>\n</div>\n", styles: ["@-webkit-keyframes animation-slide-to-left{0%{right:-200px;opacity:0}to{right:12px;opacity:1}}@keyframes animation-slide-to-left{0%{right:-200px;opacity:0}to{right:0;opacity:1}}.libs-ui-components-page_full{position:absolute;width:100vw;height:100vh;left:0;top:0;display:flex;flex-direction:column;animation:animation-slide-to-left ease-out .3s}.libs-ui-components-page_full .libs-ui-components-page_full-header{height:50px;padding:14px 16px;border-bottom:solid 1px #e6e7ea;background-color:#fff;width:100%;display:flex;align-items:center}.libs-ui-components-page_full .libs-ui-components-page_full-body{height:100%}\n"] }]
117
120
  }] });
118
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnVsbC1zY3JlZW4uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL3BhZ2VzLXRlbXBsYXRlL2Z1bGwtc2NyZWVuL3NyYy9mdWxsLXNjcmVlbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvcGFnZXMtdGVtcGxhdGUvZnVsbC1zY3JlZW4vc3JjL2Z1bGwtc2NyZWVuLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQUUsTUFBTSxFQUFlLE1BQU0sZUFBZSxDQUFDO0FBQ2pHLE9BQU8sRUFBRSxzQ0FBc0MsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQzVGLE9BQU8sRUFBRSxzQ0FBc0MsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQzVGLE9BQU8sRUFBNEQsaUNBQWlDLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMzSSxPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUMzRSxPQUFPLEVBQUUsZ0NBQWdDLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMvRSxPQUFPLEVBQWdCLCtCQUErQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFM0YsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDdkUsT0FBTyxFQUFFLFFBQVEsRUFBRSxxQkFBcUIsRUFBRSw4QkFBOEIsRUFBRSxJQUFJLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN2RyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxD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LENBQUMsU0FBUyxFQUFFO2lCQUM1QjthQUNGLENBQUM7WUFFRixxQkFBcUIsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNsRCxDQUFDO0lBQ0gsQ0FBQzt3R0FyR1UsZ0RBQWdEOzRGQUFoRCxnREFBZ0QsOC9FQUZoRCxFQUFFLDBCQ2hDZiwwaFRBa01BLG1xQkQ1S0ksZUFBZSwrQkFDZixnQkFBZ0Isb0pBQ2hCLGlDQUFpQyx1M0RBQ2pDLCtCQUErQixxSkFDL0Isc0NBQXNDLHNqQkFDdEMsc0NBQXNDLGtHQUN0QyxnQ0FBZ0MsK2ZBQ2hDLHlCQUF5QixrRUFDekIsOEJBQThCOzs0RkFJckIsZ0RBQWdEO2tCQW5CNUQsU0FBUzsrQkFFRSwrQ0FBK0MsY0FHN0MsSUFBSSxXQUNQO3dCQUNQLGVBQWU7d0JBQ2YsZ0JBQWdCO3dCQUNoQixpQ0FBaUM7d0JBQ2pDLCtCQUErQjt3QkFDL0Isc0NBQXNDO3dCQUN0QyxzQ0FBc0M7d0JBQ3RDLGdDQUFnQzt3QkFDaEMseUJBQXlCO3dCQUN6Qiw4QkFBOEI7cUJBQy9CLGFBQ1UsRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nVGVtcGxhdGVPdXRsZXQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBpbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIG91dHB1dCwgc2lnbmFsLCBUZW1wbGF0ZVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c0J1dHRvbnNCdXR0b25Db21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNCdXR0b25zU3RhdHVzQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1idXR0b25zLXN0YXR1cyc7XG5pbXBvcnQgeyBJRHJvcGRvd24sIElEcm9wZG93bkZ1bmN0aW9uQ29udHJvbEV2ZW50LCBJRW1pdFNlbGVjdEtleSwgTGlic1VpQ29tcG9uZW50c0Ryb3Bkb3duQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1kcm9wZG93bic7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzTGFiZWxDb21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWxhYmVsJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNQb3BvdmVyQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1wb3BvdmVyJztcbmltcG9ydCB7IElTd2l0Y2hFdmVudCwgTGlic1VpQ29tcG9uZW50c1N3aXRjaENvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtc3dpdGNoJztcbmltcG9ydCB7IFRZUEVfVEVNUExBVEVfUkVGIH0gZnJvbSAnQGxpYnMtdWkvaW50ZXJmYWNlcy10eXBlcyc7XG5pbXBvcnQgeyBMaWJzVWlQaXBlc0VzY2FwZUh0bWxQaXBlIH0gZnJvbSAnQGxpYnMtdWkvcGlwZXMtZXNjYXBlLWh0bWwnO1xuaW1wb3J0IHsgZ2V0RGF5anMsIFV0aWxzQ29tbXVuaWNhdGVNaWNybywgVXRpbHNDb21tdW5pY2F0ZU1pY3JvS2V5R2xvYmFsLCB1dWlkIH0gZnJvbSAnQGxpYnMtdWkvdXRpbHMnO1xuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBpbnRlcnZhbCwgU3ViamVjdCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBJUGFnZXNUZW1wbGF0ZUZ1bGxTY3JlZW5CdXR0b24gfSBmcm9tICcuL2ludGVyZmFjZXMvY29uZmlnLmludGVyZmFjZSc7XG5cbkBDb21wb25lbnQoe1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L2NvbXBvbmVudC1zZWxlY3RvclxuICBzZWxlY3RvcjogJ2xpYnNfdWktY29tcG9uZW50cy1wYWdlc190ZW1wbGF0ZV9mdWxsX3NjcmVlbicsXG4gIHRlbXBsYXRlVXJsOiAnLi9mdWxsLXNjcmVlbi5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2Z1bGwtc2NyZWVuLmNvbXBvbmVudC5zY3NzJ10sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBUcmFuc2xhdGVNb2R1bGUsXG4gICAgTmdUZW1wbGF0ZU91dGxldCxcbiAgICBMaWJzVWlDb21wb25lbnRzRHJvcGRvd25Db21wb25lbnQsXG4gICAgTGlic1VpQ29tcG9uZW50c1N3aXRjaENvbXBvbmVudCxcbiAgICBMaWJzVWlDb21wb25lbnRzQnV0dG9uc0J1dHRvbkNvbXBvbmVudCxcbiAgICBMaWJzVWlDb21wb25lbnRzQnV0dG9uc1N0YXR1c0NvbXBvbmVudCxcbiAgICBMaWJzVWlDb21wb25lbnRzUG9wb3ZlckNvbXBvbmVudCxcbiAgICBMaWJzVWlQaXBlc0VzY2FwZUh0bWxQaXBlLFxuICAgIExpYnNVaUNvbXBvbmVudHNMYWJlbENvbXBvbmVudCxcbiAgXSxcbiAgcHJvdmlkZXJzOiBbXSxcbn0pXG5leHBvcnQgY2xhc3MgTGlic1VpQ29tcG9uZW50c1BhZ2VzVGVtcGxhdGVGdWxsU2NyZWVuQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBwcml2YXRlIGlkT3ZlcmxheSA9IHNpZ25hbDxzdHJpbmc+KHV1aWQoKSk7XG4gIHByaXZhdGUgZnVuY3Rpb25Db250cm9sTWVudTogSURyb3Bkb3duRnVuY3Rpb25Db250cm9sRXZlbnQgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgb25EZXN0cm95ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICByZWFkb25seSBjbGFzc0hlYWRlckluY2x1ZGUgPSBpbnB1dDxzdHJpbmc+KCk7XG4gIHJlYWRvbmx5IGxhYmVsTGVmdCA9IGlucHV0PHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPignaTE4bl9iYWNrX3RvX2xpc3QnLCB7IHRyYW5zZm9ybTogKHZhbCkgPT4gdmFsID8/ICdpMThuX2JhY2tfdG9fbGlzdCcgfSk7XG4gIHJlYWRvbmx5IGNsYXNzQm9keUluY2x1ZGUgPSBpbnB1dDxzdHJpbmc+KCk7XG4gIHJlYWRvbmx5IHRpdGxlID0gaW5wdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSBidXR0b25DZW50ZXIgPSBpbnB1dDxBcnJheTxJUGFnZXNUZW1wbGF0ZUZ1bGxTY3JlZW5CdXR0b24+IHwgdW5kZWZpbmVkPigpO1xuICByZWFkb25seSBidXR0b25SaWdodCA9IGlucHV0PEFycmF5PElQYWdlc1RlbXBsYXRlRnVsbFNjcmVlbkJ1dHRvbj4+KCk7XG4gIHJlYWRvbmx5IGhhc0VkaXQgPSBpbnB1dDxib29sZWFuPihmYWxzZSk7XG4gIHJlYWRvbmx5IG1lbnVEcm9wRG93bkNvbmZpZ3MgPSBpbnB1dDxJRHJvcGRvd24+KCk7XG4gIHJlYWRvbmx5IHpJbmRleCA9IGlucHV0PG51bWJlciwgbnVtYmVyIHwgdW5kZWZpbmVkPigxMDAwLCB7IHRyYW5zZm9ybTogKHZhbCkgPT4gdmFsID8/IDEwMDAgfSk7XG4gIHJlYWRvbmx5IGlnbm9yZUNsb3NlUGFnZUZ1bGxFdmVudCA9IGlucHV0PGJvb2xlYW4sIGJvb2xlYW4gfCB1bmRlZmluZWQ+KGZhbHNlLCB7IHRyYW5zZm9ybTogKHZhbCkgPT4gdmFsID8/IGZhbHNlIH0pO1xuICByZWFkb25seSBpZ25vcmVCYWNrZ3JvdW5kQ29sb3IgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBkaXZpZGVDbGFzc0hlYWRlciA9IGlucHV0PHsgY2xhc3NCdXR0b25DYW5jZWw6IHN0cmluZzsgY2xhc3NCdXR0b25DZW50ZXI6IHN0cmluZzsgY2xhc3NCdXR0b25SaWdodDogc3RyaW5nIH0gfCB1bmRlZmluZWQ+KCk7XG4gIHJlYWRvbmx5IGNlbnRlclRlbXBsYXRlID0gaW5wdXQ8VGVtcGxhdGVSZWY8VFlQRV9URU1QTEFURV9SRUY+IHwgdW5kZWZpbmVkPigpO1xuICByZWFkb25seSB0ZW1wbGF0ZVJpZ2h0ID0gaW5wdXQ8VGVtcGxhdGVSZWY8VFlQRV9URU1QTEFURV9SRUY+IHwgdW5kZWZpbmVkPigpO1xuICByZWFkb25seSBsZWZ0VGVtcGxhdGUgPSBpbnB1dDxUZW1wbGF0ZVJlZjxUWVBFX1RFTVBMQVRFX1JFRj4gfCB1bmRlZmluZWQ+KCk7XG4gIHJlYWRvbmx5IGRpc2FibGUgPSBpbnB1dDxib29sZWFuLCBib29sZWFuIHwgdW5kZWZpbmVkPihmYWxzZSwgeyB0cmFuc2Zvcm06ICh2YWwpID0+IHZhbCA/PyBmYWxzZSB9KTtcblxuICByZWFkb25seSBvdXRDbG9zZSA9IG91dHB1dDx2b2lkPigpO1xuICByZWFkb25seSBvdXRFZGl0ID0gb3V0cHV0PHZvaWQ+KCk7XG4gIHJlYWRvbmx5IG91dFNlbGVjdGVkTWVudURyb3Bkb3duID0gb3V0cHV0PElFbWl0U2VsZWN0S2V5IHwgdW5kZWZpbmVkPigpO1xuICByZWFkb25seSBvdXRDbGlja0J1dHRvbiA9IG91dHB1dDxJUGFnZXNUZW1wbGF0ZUZ1bGxTY3JlZW5CdXR0b24+KCk7XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlnbm9yZUNsb3NlUGFnZUZ1bGxFdmVudCgpKSB7XG4gICAgICBjb25zdCBkYXRhID0ge1xuICAgICAgICB0eXBlOiBVdGlsc0NvbW11bmljYXRlTWljcm9LZXlHbG9iYWwuS0VZX01FU1NBR0VfTU9EQUwsXG4gICAgICAgIHJlc3BvbnNlOiB7XG4gICAgICAgICAgbWVzc2FnZTogJ29wZW4nLFxuICAgICAgICAgIHN0YXRlOiB0cnVlLFxuICAgICAgICAgIGlkT3ZlcmxheTogdGhpcy5pZE92ZXJsYXkoKSxcbiAgICAgICAgICB0aW1lTGl2ZVVwZGF0ZTogZ2V0RGF5anMoKS51bml4KCksXG4gICAgICAgICAgaWdub3JlSW50ZXJ2YWxVcGRhdGVUaW1lTGl2ZUV2ZW50OiBVdGlsc0NvbW11bmljYXRlTWljcm9LZXlHbG9iYWwuSUdOT1JFX0lOVEVSVkFMX1VQREFURV9USU1FX0xJVkVfRVZFTlRfTU9EQUwsXG4gICAgICAgIH0sXG4gICAgICB9O1xuXG4gICAgICBVdGlsc0NvbW11bmljYXRlTWljcm8uUG9zdE1lc3NhZ2VUb1BhcmVudChkYXRhKTtcblxuICAgICAgaWYgKFV0aWxzQ29tbXVuaWNhdGVNaWNyb0tleUdsb2JhbC5JR05PUkVfSU5URVJWQUxfVVBEQVRFX1RJTUVfTElWRV9FVkVOVF9NT0RBTCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGludGVydmFsKDIwMDApXG4gICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLm9uRGVzdHJveSkpXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgIGRhdGEucmVzcG9uc2UudGltZUxpdmVVcGRhdGUgPSBnZXREYXlqcygpLnVuaXgoKTtcblxuICAgICAgICAgIFV0aWxzQ29tbXVuaWNhdGVNaWNyby5Qb3N0TWVzc2FnZVRvUGFyZW50KGRhdGEpO1xuICAgICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckVkaXQoKSB7XG4gICAgdGhpcy5vdXRFZGl0LmVtaXQoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjYW5jZWwoKSB7XG4gICAgdGhpcy5vdXRDbG9zZS5lbWl0KCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgaGFuZGxlckNsaWNrQnV0dG9uKGJ1dHRvbjogSVBhZ2VzVGVtcGxhdGVGdWxsU2NyZWVuQnV0dG9uKSB7XG4gICAgaWYgKGJ1dHRvbiAmJiBidXR0b24uYWN0aW9uKSB7XG4gICAgICBhd2FpdCBidXR0b24uYWN0aW9uKCk7XG4gICAgfVxuICAgIHRoaXMub3V0Q2xpY2tCdXR0b24uZW1pdChidXR0b24pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGhhbmRsZXJTd2l0Y2goZXZlbnQ6IElTd2l0Y2hFdmVudCwgYnV0dG9uOiBJUGFnZXNUZW1wbGF0ZUZ1bGxTY3JlZW5CdXR0b24pIHtcbiAgICBpZiAoYnV0dG9uICYmIGJ1dHRvbi5hY3Rpb24pIHtcbiAgICAgIGF3YWl0IGJ1dHRvbi5hY3Rpb24oZXZlbnQpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyU2VsZWN0ZWRLZXkoZXZlbnQ6IElFbWl0U2VsZWN0S2V5IHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5vdXRTZWxlY3RlZE1lbnVEcm9wZG93bi5lbWl0KGV2ZW50KTtcbiAgICB0aGlzLmZ1bmN0aW9uQ29udHJvbE1lbnU/LnJlc2V0KCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckNvbnRyb2xEcm9wZG93bk1lbnUoZXZlbnQ6IElEcm9wZG93bkZ1bmN0aW9uQ29udHJvbEV2ZW50KSB7XG4gICAgdGhpcy5mdW5jdGlvbkNvbnRyb2xNZW51ID0gZXZlbnQ7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLm9uRGVzdHJveS5uZXh0KCk7XG4gICAgdGhpcy5vbkRlc3Ryb3kuY29tcGxldGUoKTtcbiAgICBpZiAoIXRoaXMuaWdub3JlQ2xvc2VQYWdlRnVsbEV2ZW50KCkpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICAgIHR5cGU6IFV0aWxzQ29tbXVuaWNhdGVNaWNyb0tleUdsb2JhbC5LRVlfTUVTU0FHRV9NT0RBTCxcbiAgICAgICAgcmVzcG9uc2U6IHtcbiAgICAgICAgICBtZXNzYWdlOiAnY2xvc2UnLFxuICAgICAgICAgIHN0YXRlOiBmYWxzZSxcbiAgICAgICAgICBpZE92ZXJsYXk6IHRoaXMuaWRPdmVybGF5KCksXG4gICAgICAgIH0sXG4gICAgICB9O1xuXG4gICAgICBVdGlsc0NvbW11bmljYXRlTWljcm8uUG9zdE1lc3NhZ2VUb1BhcmVudChkYXRhKTtcbiAgICB9XG4gIH1cbn1cbiIsIjxkaXZcbiAgY2xhc3M9XCJsaWJzLXVpLWNvbXBvbmVudHMtcGFnZV9mdWxsIG92ZXJmbG93LWhpZGRlblwiXG4gIFtzdHlsZS56SW5kZXhdPVwiekluZGV4KClcIlxuICBbc3R5bGUuYmFja2dyb3VuZC1jb2xvcl09XCJpZ25vcmVCYWNrZ3JvdW5kQ29sb3IoKSA/ICd0cmFuc3BhcmVudCcgOiAnI2YyZjVmNydcIj5cbiAgPGRpdiBbY2xhc3NdPVwiJ2xpYnMtdWktY29tcG9uZW50cy1wYWdlX2Z1bGwtaGVhZGVyICcgKyBjbGFzc0hlYWRlckluY2x1ZGUoKVwiPlxuICAgIDxkaXYgY2xhc3M9XCJ7eyBkaXZpZGVDbGFzc0hlYWRlcigpPy5jbGFzc0J1dHRvbkNhbmNlbCB8fCAndy1bMjUlXScgfX1cIj5cbiAgICAgIEBpZiAobGVmdFRlbXBsYXRlKCk7IGFzIGxlZnRUZW1wbGF0ZSkge1xuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibGVmdFRlbXBsYXRlXCIgLz5cbiAgICAgIH1cbiAgICAgIEBpZiAobGFiZWxMZWZ0KCk7IGFzIGxhYmVsTGVmdCkge1xuICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uXG4gICAgICAgICAgW2xhYmVsXT1cImxhYmVsTGVmdFwiXG4gICAgICAgICAgW3R5cGVdPVwiJ2J1dHRvbi1saW5rLXByaW1hcnknXCJcbiAgICAgICAgICBbY2xhc3NJY29uTGVmdF09XCInbGlicy11aS1pY29uLWNoZXZyb24tcmlnaHQgcm90YXRlLVsxODBkZWddIGJlZm9yZTp0ZXh0LVsxNnB4XSdcIlxuICAgICAgICAgIFtjbGFzc0xhYmVsXT1cIidsaWJzLXVpLWZvbnQtaDRyJ1wiXG4gICAgICAgICAgKG91dENsaWNrKT1cImNhbmNlbCgpXCIgLz5cbiAgICAgIH1cbiAgICA8L2Rpdj5cblxuICAgIEBpZiAoY2VudGVyVGVtcGxhdGUoKTsgYXMgY2VudGVyVGVtcGxhdGUpIHtcbiAgICAgIDxkaXYgY2xhc3M9XCJ7eyBkaXZpZGVDbGFzc0hlYWRlcigpPy5jbGFzc0J1dHRvbkNlbnRlciB8fCAndy1bNDAlXScgfX0gZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNlbnRlclRlbXBsYXRlXCIgLz5cbiAgICAgIDwvZGl2PlxuICAgIH0gQGVsc2Uge1xuICAgICAgPGRpdiBjbGFzcz1cInt7IGRpdmlkZUNsYXNzSGVhZGVyKCk/LmNsYXNzQnV0dG9uQ2VudGVyIHx8ICd3LVs0MCVdJyB9fSBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlclwiPlxuICAgICAgICA8bGlic191aS1jb21wb25lbnRzLXBvcG92ZXJcbiAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgW2NvbmZpZ109XCJ7XG4gICAgICAgICAgICBtYXhXaWR0aDogMjUwLFxuICAgICAgICAgICAgekluZGV4OiB6SW5kZXgoKSArIDEsXG4gICAgICAgICAgfVwiXG4gICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCInbGlicy11aS1mb250LWgycydcIlxuICAgICAgICAgIFtpbm5lckh0bWxdPVwidGl0bGUoKSA/ICh0aXRsZSgpIHwgTGlic1VpUGlwZXNFc2NhcGVIdG1sUGlwZSkgOiAnJm1kYXNoOydcIiAvPlxuXG4gICAgICAgIEBpZiAoaGFzRWRpdCgpOyBhcyBoYXNFZGl0KSB7XG4gICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLWJ1dHRvblxuICAgICAgICAgICAgW3R5cGVdPVwiJ2J1dHRvbi1saW5rLXByaW1hcnknXCJcbiAgICAgICAgICAgIChvdXRDbGljayk9XCJoYW5kbGVyRWRpdCgpXCJcbiAgICAgICAgICAgIFtpY29uT25seVR5cGVdPVwidHJ1ZVwiXG4gICAgICAgICAgICBbY2xhc3NJY29uTGVmdF09XCInbGlicy11aS1pY29uLWVkaXQtbGluZSdcIlxuICAgICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCInbWwtWzRweF0nXCIgLz5cbiAgICAgICAgfVxuICAgICAgICBAZm9yIChidXR0b24gb2YgYnV0dG9uQ2VudGVyKCk7IHRyYWNrIGJ1dHRvbi5rZXkpIHtcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibWwtWzEycHhdIGZsZXggaXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICBAaWYgKGJ1dHRvbi5rZXkgPT09ICdidXR0b24nKSB7XG4gICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1idXR0b25cbiAgICAgICAgICAgICAgICBbbGFiZWxdPVwiYnV0dG9uLmxhYmVsIHx8ICcnXCJcbiAgICAgICAgICAgICAgICBbY2xhc3NMYWJlbF09XCIoYnV0dG9uLmNsYXNzTGFiZWwgfHwgJycpICsgJyBsaWJzLXVpLWZvbnQtaGVhZC00cydcIlxuICAgICAgICAgICAgICAgIFt0eXBlXT1cImJ1dHRvbi50eXBlIHx8ICdidXR0b24tcHJpbWFyeSdcIlxuICAgICAgICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiYnV0dG9uLmNsYXNzSW5jbHVkZSB8fCAnJ1wiXG4gICAgICAgICAgICAgICAgW2NsYXNzSWNvbkxlZnRdPVwiYnV0dG9uLmNsYXNzSWNvbkxlZnQgfHwgJydcIlxuICAgICAgICAgICAgICAgIFtjbGFzc0ljb25SaWdodF09XCJidXR0b24uY2xhc3NJY29uUmlnaHQgfHwgJydcIlxuICAgICAgICAgICAgICAgIFtwb3BvdmVyXT1cImJ1dHRvbi5wb3BvdmVyIHx8IHt9XCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZV09XCJidXR0b24uZGlzYWJsZSB8fCBkaXNhYmxlKClcIlxuICAgICAgICAgICAgICAgIFtpc1BlbmRpbmddPVwiYnV0dG9uLmlzUGVuZGluZyB8fCBmYWxzZVwiXG4gICAgICAgICAgICAgICAgKG91dENsaWNrKT1cImhhbmRsZXJDbGlja0J1dHRvbihidXR0b24pXCIgLz5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBpZiAoYnV0dG9uLmtleSA9PT0gJ2J1dHRvbi1zdGF0dXMnICYmIGJ1dHRvbi5jb25maWdCdXR0b25TdGF0dXMpIHtcbiAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLXN0YXR1c1xuICAgICAgICAgICAgICAgIFtjbGFzc109XCJidXR0b24uY2xhc3NJbmNsdWRlXCJcbiAgICAgICAgICAgICAgICBbY29uZmlnXT1cImJ1dHRvbi5jb25maWdCdXR0b25TdGF0dXNcIiAvPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGlmIChidXR0b24ua2V5ID09PSAnc3dpdGNoJykge1xuICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLXN3aXRjaFxuICAgICAgICAgICAgICAgIFthY3RpdmVdPVwiYnV0dG9uLmFjdGl2ZSB8fCBmYWxzZVwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVdPVwiYnV0dG9uLmRpc2FibGUgfHwgZGlzYWJsZSgpXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInt7IGJ1dHRvbi5jbGFzc0luY2x1ZGUgfX1cIlxuICAgICAgICAgICAgICAgIChvdXRTd2l0Y2gpPVwiaGFuZGxlclN3aXRjaCgkZXZlbnQsIGJ1dHRvbilcIiAvPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGlmIChidXR0b24ua2V5ID09PSAnbGFiZWwnICYmIGJ1dHRvbi5sYWJlbENvbmZpZykge1xuICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWxhYmVsXG4gICAgICAgICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCJidXR0b24ubGFiZWxDb25maWcuY2xhc3NJbmNsdWRlICsgJyBwYi0wIHRleHQtd2hpdGUnXCJcbiAgICAgICAgICAgICAgICBbbGFiZWxMZWZ0XT1cImJ1dHRvbi5sYWJlbENvbmZpZy5sYWJlbExlZnRcIlxuICAgICAgICAgICAgICAgIFtsYWJlbExlZnRDbGFzc109XCJidXR0b24ubGFiZWxDb25maWcubGFiZWxMZWZ0Q2xhc3NcIlxuICAgICAgICAgICAgICAgIFtyZXF1aXJlZF09XCJidXR0b24ubGFiZWxDb25maWcucmVxdWlyZWRcIlxuICAgICAgICAgICAgICAgIFtkZXNjcmlwdGlvbl09XCJidXR0b24ubGFiZWxDb25maWcuZGVzY3JpcHRpb25cIlxuICAgICAgICAgICAgICAgIFtsYWJlbFJpZ2h0XT1cImJ1dHRvbi5sYWJlbENvbmZpZy5sYWJlbFJpZ2h0XCJcbiAgICAgICAgICAgICAgICBbbGFiZWxSaWdodENsYXNzXT1cImJ1dHRvbi5sYWJlbENvbmZpZy5sYWJlbFJpZ2h0Q2xhc3NcIlxuICAgICAgICAgICAgICAgIFtvbmx5U2hvd0NvdW50XT1cImJ1dHRvbi5sYWJlbENvbmZpZy5vbmx5U2hvd0NvdW50XCJcbiAgICAgICAgICAgICAgICBbYnV0dG9uc0xlZnRdPVwiYnV0dG9uLmxhYmVsQ29uZmlnLmJ1dHRvbnNMZWZ0XCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZUJ1dHRvbnNMZWZ0XT1cImJ1dHRvbi5sYWJlbENvbmZpZy5kaXNhYmxlQnV0dG9uc0xlZnRcIlxuICAgICAgICAgICAgICAgIFtidXR0b25zUmlnaHRdPVwiYnV0dG9uLmxhYmVsQ29uZmlnLmJ1dHRvbnNSaWdodFwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVCdXR0b25zUmlnaHRdPVwiYnV0dG9uLmxhYmVsQ29uZmlnLmRpc2FibGVCdXR0b25zUmlnaHRcIlxuICAgICAgICAgICAgICAgIFtoYXNUb2dnbGVdPVwiYnV0dG9uLmxhYmVsQ29uZmlnLmhhc1RvZ2dsZVwiXG4gICAgICAgICAgICAgICAgW3RvZ2dsZUFjdGl2ZV09XCJidXR0b24ubGFiZWxDb25maWcudG9nZ2xlQWN0aXZlXCJcbiAgICAgICAgICAgICAgICBbdG9nZ2xlRGlzYWJsZV09XCJidXR0b24ubGFiZWxDb25maWcudG9nZ2xlRGlzYWJsZVwiXG4gICAgICAgICAgICAgICAgW3BvcG92ZXJdPVwiYnV0dG9uLmxhYmVsQ29uZmlnLnBvcG92ZXJcIlxuICAgICAgICAgICAgICAgIFtpY29uUG9wb3ZlckNsYXNzXT1cImJ1dHRvbi5sYWJlbENvbmZpZy5pY29uUG9wb3ZlckNsYXNzXCJcbiAgICAgICAgICAgICAgICBbb25seVNob3dDb3VudF09XCJidXR0b24ubGFiZWxDb25maWcub25seVNob3dDb3VudFwiXG4gICAgICAgICAgICAgICAgW2xpbWl0TGVuZ3RoXT1cImJ1dHRvbi5sYWJlbENvbmZpZy5saW1pdExlbmd0aFwiXG4gICAgICAgICAgICAgICAgW2J1dHRvbnNEZXNjcmlwdGlvbl09XCJidXR0b24ubGFiZWxDb25maWcuYnV0dG9uc0Rlc2NyaXB0aW9uXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZUJ1dHRvbnNEZXNjcmlwdGlvbl09XCJidXR0b24ubGFiZWxDb25maWcuZGlzYWJsZUJ1dHRvbnNEZXNjcmlwdGlvblwiXG4gICAgICAgICAgICAgICAgW2J1dHRvbnNEZXNjcmlwdGlvbkNvbnRhaW5lckNsYXNzXT1cImJ1dHRvbi5sYWJlbENvbmZpZy5idXR0b25zRGVzY3JpcHRpb25Db250YWluZXJDbGFzc1wiXG4gICAgICAgICAgICAgICAgW2NvdW50XT1cImJ1dHRvbi5sYWJlbENvbmZpZy5jb3VudFwiIC8+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuICAgIH1cblxuICAgIDxkaXYgY2xhc3M9XCJ7eyBkaXZpZGVDbGFzc0hlYWRlcigpPy5jbGFzc0J1dHRvblJpZ2h0IHx8ICd3LVszNSVdJyB9fSBmbGV4IGp1c3RpZnktZW5kIGl0ZW1zLWNlbnRlclwiPlxuICAgICAgQGZvciAoYnV0dG9uIG9mIGJ1dHRvblJpZ2h0KCk7IHRyYWNrIGJ1dHRvbi5rZXkpIHtcbiAgICAgICAgPGRpdiBbY2xhc3MubWwtWzEycHhdXT1cIiEkZmlyc3RcIj5cbiAgICAgICAgICBAaWYgKGJ1dHRvbi5rZXkgPT09ICdsYWJlbCcgJiYgYnV0dG9uLmxhYmVsQ29uZmlnKSB7XG4gICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWxhYmVsXG4gICAgICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiYnV0dG9uLmxhYmVsQ29uZmlnLmNsYXNzSW5jbHVkZSArICcgcGItMCdcIlxuICAgICAgICAgICAgICBbbGFiZWxMZWZ0XT1cImJ1dHRvbi5sYWJlbENvbmZpZy5sYWJlbExlZnRcIlxuICAgICAgICAgICAgICBbbGFiZWxMZWZ0Q2xhc3NdPVwiYnV0dG9uLmxhYmVsQ29uZmlnLmxhYmVsTGVmdENsYXNzXCJcbiAgICAgICAgICAgICAgW3JlcXVpcmVkXT1cImJ1dHRvbi5sYWJlbENvbmZpZy5yZXF1aXJlZFwiXG4gICAgICAgICAgICAgIFtkZXNjcmlwdGlvbl09XCJidXR0b24ubGFiZWxDb25maWcuZGVzY3JpcHRpb25cIlxuICAgICAgICAgICAgICBbbGFiZWxSaWdodF09XCJidXR0b24ubGFiZWxDb25maWcubGFiZWxSaWdodFwiXG4gICAgICAgICAgICAgIFtsYWJlbFJpZ2h0Q2xhc3NdPVwiYnV0dG9uLmxhYmVsQ29uZmlnLmxhYmVsUmlnaHRDbGFzc1wiXG4gICAgICAgICAgICAgIFtvbmx5U2hvd0NvdW50XT1cImJ1dHRvbi5sYWJlbENvbmZpZy5vbmx5U2hvd0NvdW50XCJcbiAgICAgICAgICAgICAgW2J1dHRvbnNMZWZ0XT1cImJ1dHRvbi5sYWJlbENvbmZpZy5idXR0b25zTGVmdFwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlQnV0dG9uc0xlZnRdPVwiYnV0dG9uLmxhYmVsQ29uZmlnLmRpc2FibGVCdXR0b25zTGVmdFwiXG4gICAgICAgICAgICAgIFtidXR0b25zUmlnaHRdPVwiYnV0dG9uLmxhYmVsQ29uZmlnLmJ1dHRvbnNSaWdodFwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlQnV0dG9uc1JpZ2h0XT1cImJ1dHRvbi5sYWJlbENvbmZpZy5kaXNhYmxlQnV0dG9uc1JpZ2h0XCJcbiAgICAgICAgICAgICAgW2hhc1RvZ2dsZV09XCJidXR0b24ubGFiZWxDb25maWcuaGFzVG9nZ2xlXCJcbiAgICAgICAgICAgICAgW3RvZ2dsZUFjdGl2ZV09XCJidXR0b24ubGFiZWxDb25maWcudG9nZ2xlQWN0aXZlXCJcbiAgICAgICAgICAgICAgW3RvZ2dsZURpc2FibGVdPVwiYnV0dG9uLmxhYmVsQ29uZmlnLnRvZ2dsZURpc2FibGVcIlxuICAgICAgICAgICAgICBbcG9wb3Zlcl09XCJidXR0b24ubGFiZWxDb25maWcucG9wb3ZlclwiXG4gICAgICAgICAgICAgIFtpY29uUG9wb3ZlckNsYXNzXT1cImJ1dHRvbi5sYWJlbENvbmZpZy5pY29uUG9wb3ZlckNsYXNzXCJcbiAgICAgICAgICAgICAgW29ubHlTaG93Q291bnRdPVwiYnV0dG9uLmxhYmVsQ29uZmlnLm9ubHlTaG93Q291bnRcIlxuICAgICAgICAgICAgICBbbGltaXRMZW5ndGhdPVwiYnV0dG9uLmxhYmVsQ29uZmlnLmxpbWl0TGVuZ3RoXCJcbiAgICAgICAgICAgICAgW2J1dHRvbnNEZXNjcmlwdGlvbl09XCJidXR0b24ubGFiZWxDb25maWcuYnV0dG9uc0Rlc2NyaXB0aW9uXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVCdXR0b25zRGVzY3JpcHRpb25dPVwiYnV0dG9uLmxhYmVsQ29uZmlnLmRpc2FibGVCdXR0b25zRGVzY3JpcHRpb25cIlxuICAgICAgICAgICAgICBbYnV0dG9uc0Rlc2NyaXB0aW9uQ29udGFpbmVyQ2xhc3NdPVwiYnV0dG9uLmxhYmVsQ29uZmlnLmJ1dHRvbnNEZXNjcmlwdGlvbkNvbnRhaW5lckNsYXNzXCJcbiAgICAgICAgICAgICAgW2NvdW50XT1cImJ1dHRvbi5sYWJlbENvbmZpZy5jb3VudFwiIC8+XG4gICAgICAgICAgfVxuICAgICAgICAgIEBpZiAoYnV0dG9uLmtleSA9PT0gJ3N3aXRjaCcpIHtcbiAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtc3dpdGNoXG4gICAgICAgICAgICAgIFthY3RpdmVdPVwiYnV0dG9uLmFjdGl2ZSB8fCBmYWxzZVwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlXT1cImJ1dHRvbi5kaXNhYmxlIHx8IGRpc2FibGUoKVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwie3sgYnV0dG9uLmNsYXNzSW5jbHVkZSB9fVwiXG4gICAgICAgICAgICAgIChvdXRTd2l0Y2gpPVwiaGFuZGxlclN3aXRjaCgkZXZlbnQsIGJ1dHRvbilcIiAvPlxuICAgICAgICAgIH1cblxuICAgICAgICAgIEBpZiAoYnV0dG9uLmtleSA9PT0gJ2J1dHRvbicpIHtcbiAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1idXR0b25cbiAgICAgICAgICAgICAgW2xhYmVsXT1cImJ1dHRvbj8ubGFiZWwgfHwgJydcIlxuICAgICAgICAgICAgICBbY2xhc3NMYWJlbF09XCIoYnV0dG9uLmNsYXNzTGFiZWwgfHwgJycpICsgJyBsaWJzLXVpLWZvbnQtaDRzJ1wiXG4gICAgICAgICAgICAgIFt0eXBlXT1cImJ1dHRvbi50eXBlIHx8ICdidXR0b24tcHJpbWFyeSdcIlxuICAgICAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cImJ1dHRvbi5jbGFzc0luY2x1ZGUgfHwgJydcIlxuICAgICAgICAgICAgICBbY2xhc3NJY29uTGVmdF09XCJidXR0b24uY2xhc3NJY29uTGVmdCB8fCAnJ1wiXG4gICAgICAgICAgICAgIFtjbGFzc0ljb25SaWdodF09XCJidXR0b24uY2xhc3NJY29uUmlnaHQgfHwgJydcIlxuICAgICAgICAgICAgICBbcG9wb3Zlcl09XCJidXR0b24ucG9wb3ZlciB8fCB7fVwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlXT1cImJ1dHRvbi5kaXNhYmxlIHx8IGRpc2FibGUoKVwiXG4gICAgICAgICAgICAgIFtpc1BlbmRpbmddPVwiYnV0dG9uLmlzUGVuZGluZyB8fCBmYWxzZVwiXG4gICAgICAgICAgICAgIFtpY29uT25seVR5cGVdPVwiYnV0dG9uLmljb25Pbmx5VHlwZSB8fCBmYWxzZVwiXG4gICAgICAgICAgICAgIChvdXRDbGljayk9XCJoYW5kbGVyQ2xpY2tCdXR0b24oYnV0dG9uKVwiIC8+XG4gICAgICAgICAgfVxuICAgICAgICAgIDwhLS0gIHRow6ptIMSRxrDhu51uZyBwaMOibiBjw6FjaCAtLT5cbiAgICAgICAgICBAaWYgKGJ1dHRvbi5rZXkgPT09ICdsaW5lLXNwYWNlJykge1xuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBjbGFzcz1cImJnLVsjNjY2Yjc5XSB3LVsxcHhdIGgtWzI4cHhdXCJcbiAgICAgICAgICAgICAgW2NsYXNzXT1cImJ1dHRvbi5jbGFzc0luY2x1ZGVcIj5cbiAgICAgICAgICAgICAgJm5ic3A7XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgICAgQGlmIChtZW51RHJvcERvd25Db25maWdzKCk7IGFzIG1lbnVEcm9wRG93bkNvbmZpZ3MpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1sLVsxMnB4XVwiPlxuICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtZHJvcGRvd25cbiAgICAgICAgICAgIFtpc05nQ29udGVudF09XCJ0cnVlXCJcbiAgICAgICAgICAgIFt6SW5kZXhdPVwiekluZGV4KCkgKyAxXCJcbiAgICAgICAgICAgIFtsaXN0Q29uZmlnXT1cIm1lbnVEcm9wRG93bkNvbmZpZ3MubGlzdENvbmZpZ1wiXG4gICAgICAgICAgICBbbGlzdEhpZGRlbklucHV0U2VhcmNoXT1cInRydWVcIlxuICAgICAgICAgICAgW3BvcG92ZXJDdXN0b21Db25maWddPVwibWVudURyb3BEb3duQ29uZmlncy5wb3BvdmVyQ3VzdG9tQ29uZmlnXCJcbiAgICAgICAgICAgIChvdXRGdW5jdGlvbnNDb250cm9sKT1cImhhbmRsZXJDb250cm9sRHJvcGRvd25NZW51KCRldmVudClcIlxuICAgICAgICAgICAgKG91dFNlbGVjdEtleSk9XCJoYW5kbGVyU2VsZWN0ZWRLZXkoJGV2ZW50KVwiPlxuICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLWJ1dHRvblxuICAgICAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cIidwLVs4cHhdJ1wiXG4gICAgICAgICAgICAgIFt0eXBlXT1cIididXR0b24tdGhpcmQnXCJcbiAgICAgICAgICAgICAgW2ljb25Pbmx5VHlwZV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgW2NsYXNzSWNvbkxlZnRdPVwiJ2xpYnMtdWktaWNvbi1tb3JlLXZlcnRpY2FsIHRleHQtWyMzMzMzMzNdIHRleHQtWzEycHhdJ1wiXG4gICAgICAgICAgICAgIFtwb3BvdmVyXT1cIntcbiAgICAgICAgICAgICAgICBjb25maWc6IHtcbiAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6ICdpMThuXzR4X290aGVyX29wZXJhdGlvbnMnLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICBbaWdub3JlU3RvcFByb3BhZ2F0aW9uRXZlbnRdPVwidHJ1ZVwiIC8+XG4gICAgICAgICAgPC9saWJzX3VpLWNvbXBvbmVudHMtZHJvcGRvd24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgICAgQGlmICh0ZW1wbGF0ZVJpZ2h0KCk7IGFzIHRlbXBsYXRlUmlnaHQpIHtcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRlbXBsYXRlUmlnaHRcIiAvPlxuICAgICAgfVxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbiAgPGRpdiBbY2xhc3NdPVwiJ2xpYnMtdWktY29tcG9uZW50cy1wYWdlX2Z1bGwtYm9keSAnICsgY2xhc3NCb2R5SW5jbHVkZSgpXCI+XG4gICAgPG5nLWNvbnRlbnQgLz5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
121
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnVsbC1zY3JlZW4uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL3BhZ2VzLXRlbXBsYXRlL2Z1bGwtc2NyZWVuL3NyYy9mdWxsLXNjcmVlbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvcGFnZXMtdGVtcGxhdGUvZnVsbC1zY3JlZW4vc3JjL2Z1bGwtc2NyZWVuLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQUUsTUFBTSxFQUFlLE1BQU0sZUFBZSxDQUFDO0FBQ2pHLE9BQU8sRUFBRSxzQ0FBc0MsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQzVGLE9BQU8sRUFBRSxzQ0FBc0MsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQzVGLE9BQU8sRUFBNEQsaUNBQWlDLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMzSSxPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUMzRSxPQUFPLEVBQUUsZ0NBQWdDLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMvRSxPQUFPLEVBQWdCLCtCQUErQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFM0YsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDdkUsT0FBTyxFQUFFLFFBQVEsRUFBRSxxQkFBcUIsRUFBRSw4QkFBOEIsRUFBRSxJQUFJLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN2RyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxD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UyxFQUFFO2lCQUM1QjthQUNGLENBQUM7WUFFRixxQkFBcUIsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNsRCxDQUFDO0lBQ0gsQ0FBQzt3R0FyR1UsZ0RBQWdEOzRGQUFoRCxnREFBZ0QsOC9FQUZoRCxFQUFFLDBCQ25DZiwwaFRBa01BLG1xQkR6S0ksZUFBZSwrQkFDZixnQkFBZ0Isb0pBQ2hCLGlDQUFpQyx1M0RBQ2pDLCtCQUErQixxSkFDL0Isc0NBQXNDLHNqQkFDdEMsc0NBQXNDLGtHQUN0QyxnQ0FBZ0MsK2ZBQ2hDLHlCQUF5QixrRUFDekIsOEJBQThCOzs0RkFJckIsZ0RBQWdEO2tCQW5CNUQsU0FBUzsrQkFFRSwrQ0FBK0MsY0FHN0MsSUFBSSxXQUNQO3dCQUNQLGVBQWU7d0JBQ2YsZ0JBQWdCO3dCQUNoQixpQ0FBaUM7d0JBQ2pDLCtCQUErQjt3QkFDL0Isc0NBQXNDO3dCQUN0QyxzQ0FBc0M7d0JBQ3RDLGdDQUFnQzt3QkFDaEMseUJBQXlCO3dCQUN6Qiw4QkFBOEI7cUJBQy9CLGFBQ1UsRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nVGVtcGxhdGVPdXRsZXQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBpbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIG91dHB1dCwgc2lnbmFsLCBUZW1wbGF0ZVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c0J1dHRvbnNCdXR0b25Db21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNCdXR0b25zU3RhdHVzQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1idXR0b25zLXN0YXR1cyc7XG5pbXBvcnQgeyBJRHJvcGRvd24sIElEcm9wZG93bkZ1bmN0aW9uQ29udHJvbEV2ZW50LCBJRW1pdFNlbGVjdEtleSwgTGlic1VpQ29tcG9uZW50c0Ryb3Bkb3duQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1kcm9wZG93bic7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzTGFiZWxDb21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWxhYmVsJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNQb3BvdmVyQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1wb3BvdmVyJztcbmltcG9ydCB7IElTd2l0Y2hFdmVudCwgTGlic1VpQ29tcG9uZW50c1N3aXRjaENvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtc3dpdGNoJztcbmltcG9ydCB7IFRZUEVfVEVNUExBVEVfUkVGIH0gZnJvbSAnQGxpYnMtdWkvaW50ZXJmYWNlcy10eXBlcyc7XG5pbXBvcnQgeyBMaWJzVWlQaXBlc0VzY2FwZUh0bWxQaXBlIH0gZnJvbSAnQGxpYnMtdWkvcGlwZXMtZXNjYXBlLWh0bWwnO1xuaW1wb3J0IHsgZ2V0RGF5anMsIFV0aWxzQ29tbXVuaWNhdGVNaWNybywgVXRpbHNDb21tdW5pY2F0ZU1pY3JvS2V5R2xvYmFsLCB1dWlkIH0gZnJvbSAnQGxpYnMtdWkvdXRpbHMnO1xuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBpbnRlcnZhbCwgU3ViamVjdCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBJUGFnZXNUZW1wbGF0ZUZ1bGxTY3JlZW5CdXR0b24gfSBmcm9tICcuL2ludGVyZmFjZXMvY29uZmlnLmludGVyZmFjZSc7XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBMaWJzVWlDb21wb25lbnRzUGFnZXNUZW1wbGF0ZUZ1bGxTY3JlZW5WMkNvbXBvbmVudH0gaW5zdGVhZC5cbiAqL1xuQENvbXBvbmVudCh7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvY29tcG9uZW50LXNlbGVjdG9yXG4gIHNlbGVjdG9yOiAnbGlic191aS1jb21wb25lbnRzLXBhZ2VzX3RlbXBsYXRlX2Z1bGxfc2NyZWVuJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2Z1bGwtc2NyZWVuLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZnVsbC1zY3JlZW4uY29tcG9uZW50LnNjc3MnXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIFRyYW5zbGF0ZU1vZHVsZSxcbiAgICBOZ1RlbXBsYXRlT3V0bGV0LFxuICAgIExpYnNVaUNvbXBvbmVudHNEcm9wZG93bkNvbXBvbmVudCxcbiAgICBMaWJzVWlDb21wb25lbnRzU3dpdGNoQ29tcG9uZW50LFxuICAgIExpYnNVaUNvbXBvbmVudHNCdXR0b25zQnV0dG9uQ29tcG9uZW50LFxuICAgIExpYnNVaUNvbXBvbmVudHNCdXR0b25zU3RhdHVzQ29tcG9uZW50LFxuICAgIExpYnNVaUNvbXBvbmVudHNQb3BvdmVyQ29tcG9uZW50LFxuICAgIExpYnNVaVBpcGVzRXNjYXBlSHRtbFBpcGUsXG4gICAgTGlic1VpQ29tcG9uZW50c0xhYmVsQ29tcG9uZW50LFxuICBdLFxuICBwcm92aWRlcnM6IFtdLFxufSlcbmV4cG9ydCBjbGFzcyBMaWJzVWlDb21wb25lbnRzUGFnZXNUZW1wbGF0ZUZ1bGxTY3JlZW5Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgaWRPdmVybGF5ID0gc2lnbmFsPHN0cmluZz4odXVpZCgpKTtcbiAgcHJpdmF0ZSBmdW5jdGlvbkNvbnRyb2xNZW51OiBJRHJvcGRvd25GdW5jdGlvbkNvbnRyb2xFdmVudCB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSByZWFkb25seSBvbkRlc3Ryb3kgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIHJlYWRvbmx5IGNsYXNzSGVhZGVySW5jbHVkZSA9IGlucHV0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgbGFiZWxMZWZ0ID0gaW5wdXQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KCdpMThuX2JhY2tfdG9fbGlzdCcsIHsgdHJhbnNmb3JtOiAodmFsKSA9PiB2YWwgPz8gJ2kxOG5fYmFja190b19saXN0JyB9KTtcbiAgcmVhZG9ubHkgY2xhc3NCb2R5SW5jbHVkZSA9IGlucHV0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgdGl0bGUgPSBpbnB1dDxzdHJpbmc+KCk7XG4gIHJlYWRvbmx5IGJ1dHRvbkNlbnRlciA9IGlucHV0PEFycmF5PElQYWdlc1RlbXBsYXRlRnVsbFNjcmVlbkJ1dHRvbj4gfCB1bmRlZmluZWQ+KCk7XG4gIHJlYWRvbmx5IGJ1dHRvblJpZ2h0ID0gaW5wdXQ8QXJyYXk8SVBhZ2VzVGVtcGxhdGVGdWxsU2NyZWVuQnV0dG9uPj4oKTtcbiAgcmVhZG9ubHkgaGFzRWRpdCA9IGlucHV0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcmVhZG9ubHkgbWVudURyb3BEb3duQ29uZmlncyA9IGlucHV0PElEcm9wZG93bj4oKTtcbiAgcmVhZG9ubHkgekluZGV4ID0gaW5wdXQ8bnVtYmVyLCBudW1iZXIgfCB1bmRlZmluZWQ+KDEwMDAsIHsgdHJhbnNmb3JtOiAodmFsKSA9PiB2YWwgPz8gMTAwMCB9KTtcbiAgcmVhZG9ubHkgaWdub3JlQ2xvc2VQYWdlRnVsbEV2ZW50ID0gaW5wdXQ8Ym9vbGVhbiwgYm9vbGVhbiB8IHVuZGVmaW5lZD4oZmFsc2UsIHsgdHJhbnNmb3JtOiAodmFsKSA9PiB2YWwgPz8gZmFsc2UgfSk7XG4gIHJlYWRvbmx5IGlnbm9yZUJhY2tncm91bmRDb2xvciA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGRpdmlkZUNsYXNzSGVhZGVyID0gaW5wdXQ8eyBjbGFzc0J1dHRvbkNhbmNlbDogc3RyaW5nOyBjbGFzc0J1dHRvbkNlbnRlcjogc3RyaW5nOyBjbGFzc0J1dHRvblJpZ2h0OiBzdHJpbmcgfSB8IHVuZGVmaW5lZD4oKTtcbiAgcmVhZG9ubHkgY2VudGVyVGVtcGxhdGUgPSBpbnB1dDxUZW1wbGF0ZVJlZjxUWVBFX1RFTVBMQVRFX1JFRj4gfCB1bmRlZmluZWQ+KCk7XG4gIHJlYWRvbmx5IHRlbXBsYXRlUmlnaHQgPSBpbnB1dDxUZW1wbGF0ZVJlZjxUWVBFX1RFTVBMQVRFX1JFRj4gfCB1bmRlZmluZWQ+KCk7XG4gIHJlYWRvbmx5IGxlZnRUZW1wbGF0ZSA9IGlucHV0PFRlbXBsYXRlUmVmPFRZUEVfVEVNUExBVEVfUkVGPiB8IHVuZGVmaW5lZD4oKTtcbiAgcmVhZG9ubHkgZGlzYWJsZSA9IGlucHV0PGJvb2xlYW4sIGJvb2xlYW4gfCB1bmRlZmluZWQ+KGZhbHNlLCB7IHRyYW5zZm9ybTogKHZhbCkgPT4gdmFsID8/IGZhbHNlIH0pO1xuXG4gIHJlYWRvbmx5IG91dENsb3NlID0gb3V0cHV0PHZvaWQ+KCk7XG4gIHJlYWRvbmx5IG91dEVkaXQgPSBvdXRwdXQ8dm9pZD4oKTtcbiAgcmVhZG9ubHkgb3V0U2VsZWN0ZWRNZW51RHJvcGRvd24gPSBvdXRwdXQ8SUVtaXRTZWxlY3RLZXkgfCB1bmRlZmluZWQ+KCk7XG4gIHJlYWRvbmx5IG91dENsaWNrQnV0dG9uID0gb3V0cHV0PElQYWdlc1RlbXBsYXRlRnVsbFNjcmVlbkJ1dHRvbj4oKTtcblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaWdub3JlQ2xvc2VQYWdlRnVsbEV2ZW50KCkpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICAgIHR5cGU6IFV0aWxzQ29tbXVuaWNhdGVNaWNyb0tleUdsb2JhbC5LRVlfTUVTU0FHRV9NT0RBTCxcbiAgICAgICAgcmVzcG9uc2U6IHtcbiAgICAgICAgICBtZXNzYWdlOiAnb3BlbicsXG4gICAgICAgICAgc3RhdGU6IHRydWUsXG4gICAgICAgICAgaWRPdmVybGF5OiB0aGlzLmlkT3ZlcmxheSgpLFxuICAgICAgICAgIHRpbWVMaXZlVXBkYXRlOiBnZXREYXlqcygpLnVuaXgoKSxcbiAgICAgICAgICBpZ25vcmVJbnRlcnZhbFVwZGF0ZVRpbWVMaXZlRXZlbnQ6IFV0aWxzQ29tbXVuaWNhdGVNaWNyb0tleUdsb2JhbC5JR05PUkVfSU5URVJWQUxfVVBEQVRFX1RJTUVfTElWRV9FVkVOVF9NT0RBTCxcbiAgICAgICAgfSxcbiAgICAgIH07XG5cbiAgICAgIFV0aWxzQ29tbXVuaWNhdGVNaWNyby5Qb3N0TWVzc2FnZVRvUGFyZW50KGRhdGEpO1xuXG4gICAgICBpZiAoVXRpbHNDb21tdW5pY2F0ZU1pY3JvS2V5R2xvYmFsLklHTk9SRV9JTlRFUlZBTF9VUERBVEVfVElNRV9MSVZFX0VWRU5UX01PREFMKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaW50ZXJ2YWwoMjAwMClcbiAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMub25EZXN0cm95KSlcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgZGF0YS5yZXNwb25zZS50aW1lTGl2ZVVwZGF0ZSA9IGdldERheWpzKCkudW5peCgpO1xuXG4gICAgICAgICAgVXRpbHNDb21tdW5pY2F0ZU1pY3JvLlBvc3RNZXNzYWdlVG9QYXJlbnQoZGF0YSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyRWRpdCgpIHtcbiAgICB0aGlzLm91dEVkaXQuZW1pdCgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNhbmNlbCgpIHtcbiAgICB0aGlzLm91dENsb3NlLmVtaXQoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVyQ2xpY2tCdXR0b24oYnV0dG9uOiBJUGFnZXNUZW1wbGF0ZUZ1bGxTY3JlZW5CdXR0b24pIHtcbiAgICBpZiAoYnV0dG9uPy5hY3Rpb24pIHtcbiAgICAgIGF3YWl0IGJ1dHRvbi5hY3Rpb24oKTtcbiAgICB9XG4gICAgdGhpcy5vdXRDbGlja0J1dHRvbi5lbWl0KGJ1dHRvbik7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgaGFuZGxlclN3aXRjaChldmVudDogSVN3aXRjaEV2ZW50LCBidXR0b246IElQYWdlc1RlbXBsYXRlRnVsbFNjcmVlbkJ1dHRvbikge1xuICAgIGlmIChidXR0b24/LmFjdGlvbikge1xuICAgICAgYXdhaXQgYnV0dG9uLmFjdGlvbihldmVudCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJTZWxlY3RlZEtleShldmVudDogSUVtaXRTZWxlY3RLZXkgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLm91dFNlbGVjdGVkTWVudURyb3Bkb3duLmVtaXQoZXZlbnQpO1xuICAgIHRoaXMuZnVuY3Rpb25Db250cm9sTWVudT8ucmVzZXQoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyQ29udHJvbERyb3Bkb3duTWVudShldmVudDogSURyb3Bkb3duRnVuY3Rpb25Db250cm9sRXZlbnQpIHtcbiAgICB0aGlzLmZ1bmN0aW9uQ29udHJvbE1lbnUgPSBldmVudDtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMub25EZXN0cm95Lm5leHQoKTtcbiAgICB0aGlzLm9uRGVzdHJveS5jb21wbGV0ZSgpO1xuICAgIGlmICghdGhpcy5pZ25vcmVDbG9zZVBhZ2VGdWxsRXZlbnQoKSkge1xuICAgICAgY29uc3QgZGF0YSA9IHtcbiAgICAgICAgdHlwZTogVXRpbHNDb21tdW5pY2F0ZU1pY3JvS2V5R2xvYmFsLktFWV9NRVNTQUdFX01PREFMLFxuICAgICAgICByZXNwb25zZToge1xuICAgICAgICAgIG1lc3NhZ2U6ICdjbG9zZScsXG4gICAgICAgICAgc3RhdGU6IGZhbHNlLFxuICAgICAgICAgIGlkT3ZlcmxheTogdGhpcy5pZE92ZXJsYXkoKSxcbiAgICAgICAgfSxcbiAgICAgIH07XG5cbiAgICAgIFV0aWxzQ29tbXVuaWNhdGVNaWNyby5Qb3N0TWVzc2FnZVRvUGFyZW50KGRhdGEpO1xuICAgIH1cbiAgfVxufVxuIiwiPGRpdlxuICBjbGFzcz1cImxpYnMtdWktY29tcG9uZW50cy1wYWdlX2Z1bGwgb3ZlcmZsb3ctaGlkZGVuXCJcbiAgW3N0eWxlLnpJbmRleF09XCJ6SW5kZXgoKVwiXG4gIFtzdHlsZS5iYWNrZ3JvdW5kLWNvbG9yXT1cImlnbm9yZUJhY2tncm91bmRDb2xvcigpID8gJ3RyYW5zcGFyZW50JyA6ICcjZjJmNWY3J1wiPlxuICA8ZGl2IFtjbGFzc109XCInbGlicy11aS1jb21wb25lbnRzLXBhZ2VfZnVsbC1oZWFkZXIgJyArIGNsYXNzSGVhZGVySW5jbHVkZSgpXCI+XG4gICAgPGRpdiBjbGFzcz1cInt7IGRpdmlkZUNsYXNzSGVhZGVyKCk/LmNsYXNzQnV0dG9uQ2FuY2VsIHx8ICd3LVsyNSVdJyB9fVwiPlxuICAgICAgQGlmIChsZWZ0VGVtcGxhdGUoKTsgYXMgbGVmdFRlbXBsYXRlKSB7XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJsZWZ0VGVtcGxhdGVcIiAvPlxuICAgICAgfVxuICAgICAgQGlmIChsYWJlbExlZnQoKTsgYXMgbGFiZWxMZWZ0KSB7XG4gICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1idXR0b25cbiAgICAgICAgICBbbGFiZWxdPVwibGFiZWxMZWZ0XCJcbiAgICAgICAgICBbdHlwZV09XCInYnV0dG9uLWxpbmstcHJpbWFyeSdcIlxuICAgICAgICAgIFtjbGFzc0ljb25MZWZ0XT1cIidsaWJzLXVpLWljb24tY2hldnJvbi1yaWdodCByb3RhdGUtWzE4MGRlZ10gYmVmb3JlOnRleHQtWzE2cHhdJ1wiXG4gICAgICAgICAgW2NsYXNzTGFiZWxdPVwiJ2xpYnMtdWktZm9udC1oNHInXCJcbiAgICAgICAgICAob3V0Q2xpY2spPVwiY2FuY2VsKClcIiAvPlxuICAgICAgfVxuICAgIDwvZGl2PlxuXG4gICAgQGlmIChjZW50ZXJUZW1wbGF0ZSgpOyBhcyBjZW50ZXJUZW1wbGF0ZSkge1xuICAgICAgPGRpdiBjbGFzcz1cInt7IGRpdmlkZUNsYXNzSGVhZGVyKCk/LmNsYXNzQnV0dG9uQ2VudGVyIHx8ICd3LVs0MCVdJyB9fSBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlclwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY2VudGVyVGVtcGxhdGVcIiAvPlxuICAgICAgPC9kaXY+XG4gICAgfSBAZWxzZSB7XG4gICAgICA8ZGl2IGNsYXNzPVwie3sgZGl2aWRlQ2xhc3NIZWFkZXIoKT8uY2xhc3NCdXR0b25DZW50ZXIgfHwgJ3ctWzQwJV0nIH19IGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtcG9wb3ZlclxuICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICBbY29uZmlnXT1cIntcbiAgICAgICAgICAgIG1heFdpZHRoOiAyNTAsXG4gICAgICAgICAgICB6SW5kZXg6IHpJbmRleCgpICsgMSxcbiAgICAgICAgICB9XCJcbiAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cIidsaWJzLXVpLWZvbnQtaDJzJ1wiXG4gICAgICAgICAgW2lubmVySHRtbF09XCJ0aXRsZSgpID8gKHRpdGxlKCkgfCBMaWJzVWlQaXBlc0VzY2FwZUh0bWxQaXBlKSA6ICcmbWRhc2g7J1wiIC8+XG5cbiAgICAgICAgQGlmIChoYXNFZGl0KCk7IGFzIGhhc0VkaXQpIHtcbiAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uXG4gICAgICAgICAgICBbdHlwZV09XCInYnV0dG9uLWxpbmstcHJpbWFyeSdcIlxuICAgICAgICAgICAgKG91dENsaWNrKT1cImhhbmRsZXJFZGl0KClcIlxuICAgICAgICAgICAgW2ljb25Pbmx5VHlwZV09XCJ0cnVlXCJcbiAgICAgICAgICAgIFtjbGFzc0ljb25MZWZ0XT1cIidsaWJzLXVpLWljb24tZWRpdC1saW5lJ1wiXG4gICAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cIidtbC1bNHB4XSdcIiAvPlxuICAgICAgICB9XG4gICAgICAgIEBmb3IgKGJ1dHRvbiBvZiBidXR0b25DZW50ZXIoKTsgdHJhY2sgYnV0dG9uLmtleSkge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtbC1bMTJweF0gZmxleCBpdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgIEBpZiAoYnV0dG9uLmtleSA9PT0gJ2J1dHRvbicpIHtcbiAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLWJ1dHRvblxuICAgICAgICAgICAgICAgIFtsYWJlbF09XCJidXR0b24ubGFiZWwgfHwgJydcIlxuICAgICAgICAgICAgICAgIFtjbGFzc0xhYmVsXT1cIihidXR0b24uY2xhc3NMYWJlbCB8fCAnJykgKyAnIGxpYnMtdWktZm9udC1oZWFkLTRzJ1wiXG4gICAgICAgICAgICAgICAgW3R5cGVdPVwiYnV0dG9uLnR5cGUgfHwgJ2J1dHRvbi1wcmltYXJ5J1wiXG4gICAgICAgICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCJidXR0b24uY2xhc3NJbmNsdWRlIHx8ICcnXCJcbiAgICAgICAgICAgICAgICBbY2xhc3NJY29uTGVmdF09XCJidXR0b24uY2xhc3NJY29uTGVmdCB8fCAnJ1wiXG4gICAgICAgICAgICAgICAgW2NsYXNzSWNvblJpZ2h0XT1cImJ1dHRvbi5jbGFzc0ljb25SaWdodCB8fCAnJ1wiXG4gICAgICAgICAgICAgICAgW3BvcG92ZXJdPVwiYnV0dG9uLnBvcG92ZXIgfHwge31cIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlXT1cImJ1dHRvbi5kaXNhYmxlIHx8IGRpc2FibGUoKVwiXG4gICAgICAgICAgICAgICAgW2lzUGVuZGluZ109XCJidXR0b24uaXNQZW5kaW5nIHx8IGZhbHNlXCJcbiAgICAgICAgICAgICAgICAob3V0Q2xpY2spPVwiaGFuZGxlckNsaWNrQnV0dG9uKGJ1dHRvbilcIiAvPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGlmIChidXR0b24ua2V5ID09PSAnYnV0dG9uLXN0YXR1cycgJiYgYnV0dG9uLmNvbmZpZ0J1dHRvblN0YXR1cykge1xuICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtc3RhdHVzXG4gICAgICAgICAgICAgICAgW2NsYXNzXT1cImJ1dHRvbi5jbGFzc0luY2x1ZGVcIlxuICAgICAgICAgICAgICAgIFtjb25maWddPVwiYnV0dG9uLmNvbmZpZ0J1dHRvblN0YXR1c1wiIC8+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAaWYgKGJ1dHRvbi5rZXkgPT09ICdzd2l0Y2gnKSB7XG4gICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtc3dpdGNoXG4gICAgICAgICAgICAgICAgW2FjdGl2ZV09XCJidXR0b24uYWN0aXZlIHx8IGZhbHNlXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZV09XCJidXR0b24uZGlzYWJsZSB8fCBkaXNhYmxlKClcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwie3sgYnV0dG9uLmNsYXNzSW5jbHVkZSB9fVwiXG4gICAgICAgICAgICAgICAgKG91dFN3aXRjaCk9XCJoYW5kbGVyU3dpdGNoKCRldmVudCwgYnV0dG9uKVwiIC8+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAaWYgKGJ1dHRvbi5rZXkgPT09ICdsYWJlbCcgJiYgYnV0dG9uLmxhYmVsQ29uZmlnKSB7XG4gICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtbGFiZWxcbiAgICAgICAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cImJ1dHRvbi5sYWJlbENvbmZpZy5jbGFzc0luY2x1ZGUgKyAnIHBiLTAgdGV4dC13aGl0ZSdcIlxuICAgICAgICAgICAgICAgIFtsYWJlbExlZnRdPVwiYnV0dG9uLmxhYmVsQ29uZmlnLmxhYmVsTGVmdFwiXG4gICAgICAgICAgICAgICAgW2xhYmVsTGVmdENsYXNzXT1cImJ1dHRvbi5sYWJlbENvbmZpZy5sYWJlbExlZnRDbGFzc1wiXG4gICAgICAgICAgICAgICAgW3JlcXVpcmVkXT1cImJ1dHRvbi5sYWJlbENvbmZpZy5yZXF1aXJlZFwiXG4gICAgICAgICAgICAgICAgW2Rlc2NyaXB0aW9uXT1cImJ1dHRvbi5sYWJlbENvbmZpZy5kZXNjcmlwdGlvblwiXG4gICAgICAgICAgICAgICAgW2xhYmVsUmlnaHRdPVwiYnV0dG9uLmxhYmVsQ29uZmlnLmxhYmVsUmlnaHRcIlxuICAgICAgICAgICAgICAgIFtsYWJlbFJpZ2h0Q2xhc3NdPVwiYnV0dG9uLmxhYmVsQ29uZmlnLmxhYmVsUmlnaHRDbGFzc1wiXG4gICAgICAgICAgICAgICAgW29ubHlTaG93Q291bnRdPVwiYnV0dG9uLmxhYmVsQ29uZmlnLm9ubHlTaG93Q291bnRcIlxuICAgICAgICAgICAgICAgIFtidXR0b25zTGVmdF09XCJidXR0b24ubGFiZWxDb25maWcuYnV0dG9uc0xlZnRcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlQnV0dG9uc0xlZnRdPVwiYnV0dG9uLmxhYmVsQ29uZmlnLmRpc2FibGVCdXR0b25zTGVmdFwiXG4gICAgICAgICAgICAgICAgW2J1dHRvbnNSaWdodF09XCJidXR0b24ubGFiZWxDb25maWcuYnV0dG9uc1JpZ2h0XCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZUJ1dHRvbnNSaWdodF09XCJidXR0b24ubGFiZWxDb25maWcuZGlzYWJsZUJ1dHRvbnNSaWdodFwiXG4gICAgICAgICAgICAgICAgW2hhc1RvZ2dsZV09XCJidXR0b24ubGFiZWxDb25maWcuaGFzVG9nZ2xlXCJcbiAgICAgICAgICAgICAgICBbdG9nZ2xlQWN0aXZlXT1cImJ1dHRvbi5sYWJlbENvbmZpZy50b2dnbGVBY3RpdmVcIlxuICAgICAgICAgICAgICAgIFt0b2dnbGVEaXNhYmxlXT1cImJ1dHRvbi5sYWJlbENvbmZpZy50b2dnbGVEaXNhYmxlXCJcbiAgICAgICAgICAgICAgICBbcG9wb3Zlcl09XCJidXR0b24ubGFiZWxDb25maWcucG9wb3ZlclwiXG4gICAgICAgICAgICAgICAgW2ljb25Qb3BvdmVyQ2xhc3NdPVwiYnV0dG9uLmxhYmVsQ29uZmlnLmljb25Qb3BvdmVyQ2xhc3NcIlxuICAgICAgICAgICAgICAgIFtvbmx5U2hvd0NvdW50XT1cImJ1dHRvbi5sYWJlbENvbmZpZy5vbmx5U2hvd0NvdW50XCJcbiAgICAgICAgICAgICAgICBbbGltaXRMZW5ndGhdPVwiYnV0dG9uLmxhYmVsQ29uZmlnLmxpbWl0TGVuZ3RoXCJcbiAgICAgICAgICAgICAgICBbYnV0dG9uc0Rlc2NyaXB0aW9uXT1cImJ1dHRvbi5sYWJlbENvbmZpZy5idXR0b25zRGVzY3JpcHRpb25cIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlQnV0dG9uc0Rlc2NyaXB0aW9uXT1cImJ1dHRvbi5sYWJlbENvbmZpZy5kaXNhYmxlQnV0dG9uc0Rlc2NyaXB0aW9uXCJcbiAgICAgICAgICAgICAgICBbYnV0dG9uc0Rlc2NyaXB0aW9uQ29udGFpbmVyQ2xhc3NdPVwiYnV0dG9uLmxhYmVsQ29uZmlnLmJ1dHRvbnNEZXNjcmlwdGlvbkNvbnRhaW5lckNsYXNzXCJcbiAgICAgICAgICAgICAgICBbY291bnRdPVwiYnV0dG9uLmxhYmVsQ29uZmlnLmNvdW50XCIgLz5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgfVxuXG4gICAgPGRpdiBjbGFzcz1cInt7IGRpdmlkZUNsYXNzSGVhZGVyKCk/LmNsYXNzQnV0dG9uUmlnaHQgfHwgJ3ctWzM1JV0nIH19IGZsZXgganVzdGlmeS1lbmQgaXRlbXMtY2VudGVyXCI+XG4gICAgICBAZm9yIChidXR0b24gb2YgYnV0dG9uUmlnaHQoKTsgdHJhY2sgYnV0dG9uLmtleSkge1xuICAgICAgICA8ZGl2IFtjbGFzcy5tbC1bMTJweF1dPVwiISRmaXJzdFwiPlxuICAgICAgICAgIEBpZiAoYnV0dG9uLmtleSA9PT0gJ2xhYmVsJyAmJiBidXR0b24ubGFiZWxDb25maWcpIHtcbiAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtbGFiZWxcbiAgICAgICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCJidXR0b24ubGFiZWxDb25maWcuY2xhc3NJbmNsdWRlICsgJyBwYi0wJ1wiXG4gICAgICAgICAgICAgIFtsYWJlbExlZnRdPVwiYnV0dG9uLmxhYmVsQ29uZmlnLmxhYmVsTGVmdFwiXG4gICAgICAgICAgICAgIFtsYWJlbExlZnRDbGFzc109XCJidXR0b24ubGFiZWxDb25maWcubGFiZWxMZWZ0Q2xhc3NcIlxuICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwiYnV0dG9uLmxhYmVsQ29uZmlnLnJlcXVpcmVkXCJcbiAgICAgICAgICAgICAgW2Rlc2NyaXB0aW9uXT1cImJ1dHRvbi5sYWJlbENvbmZpZy5kZXNjcmlwdGlvblwiXG4gICAgICAgICAgICAgIFtsYWJlbFJpZ2h0XT1cImJ1dHRvbi5sYWJlbENvbmZpZy5sYWJlbFJpZ2h0XCJcbiAgICAgICAgICAgICAgW2xhYmVsUmlnaHRDbGFzc109XCJidXR0b24ubGFiZWxDb25maWcubGFiZWxSaWdodENsYXNzXCJcbiAgICAgICAgICAgICAgW29ubHlTaG93Q291bnRdPVwiYnV0dG9uLmxhYmVsQ29uZmlnLm9ubHlTaG93Q291bnRcIlxuICAgICAgICAgICAgICBbYnV0dG9uc0xlZnRdPVwiYnV0dG9uLmxhYmVsQ29uZmlnLmJ1dHRvbnNMZWZ0XCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVCdXR0b25zTGVmdF09XCJidXR0b24ubGFiZWxDb25maWcuZGlzYWJsZUJ1dHRvbnNMZWZ0XCJcbiAgICAgICAgICAgICAgW2J1dHRvbnNSaWdodF09XCJidXR0b24ubGFiZWxDb25maWcuYnV0dG9uc1JpZ2h0XCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVCdXR0b25zUmlnaHRdPVwiYnV0dG9uLmxhYmVsQ29uZmlnLmRpc2FibGVCdXR0b25zUmlnaHRcIlxuICAgICAgICAgICAgICBbaGFzVG9nZ2xlXT1cImJ1dHRvbi5sYWJlbENvbmZpZy5oYXNUb2dnbGVcIlxuICAgICAgICAgICAgICBbdG9nZ2xlQWN0aXZlXT1cImJ1dHRvbi5sYWJlbENvbmZpZy50b2dnbGVBY3RpdmVcIlxuICAgICAgICAgICAgICBbdG9nZ2xlRGlzYWJsZV09XCJidXR0b24ubGFiZWxDb25maWcudG9nZ2xlRGlzYWJsZVwiXG4gICAgICAgICAgICAgIFtwb3BvdmVyXT1cImJ1dHRvbi5sYWJlbENvbmZpZy5wb3BvdmVyXCJcbiAgICAgICAgICAgICAgW2ljb25Qb3BvdmVyQ2xhc3NdPVwiYnV0dG9uLmxhYmVsQ29uZmlnLmljb25Qb3BvdmVyQ2xhc3NcIlxuICAgICAgICAgICAgICBbb25seVNob3dDb3VudF09XCJidXR0b24ubGFiZWxDb25maWcub25seVNob3dDb3VudFwiXG4gICAgICAgICAgICAgIFtsaW1pdExlbmd0aF09XCJidXR0b24ubGFiZWxDb25maWcubGltaXRMZW5ndGhcIlxuICAgICAgICAgICAgICBbYnV0dG9uc0Rlc2NyaXB0aW9uXT1cImJ1dHRvbi5sYWJlbENvbmZpZy5idXR0b25zRGVzY3JpcHRpb25cIlxuICAgICAgICAgICAgICBbZGlzYWJsZUJ1dHRvbnNEZXNjcmlwdGlvbl09XCJidXR0b24ubGFiZWxDb25maWcuZGlzYWJsZUJ1dHRvbnNEZXNjcmlwdGlvblwiXG4gICAgICAgICAgICAgIFtidXR0b25zRGVzY3JpcHRpb25Db250YWluZXJDbGFzc109XCJidXR0b24ubGFiZWxDb25maWcuYnV0dG9uc0Rlc2NyaXB0aW9uQ29udGFpbmVyQ2xhc3NcIlxuICAgICAgICAgICAgICBbY291bnRdPVwiYnV0dG9uLmxhYmVsQ29uZmlnLmNvdW50XCIgLz5cbiAgICAgICAgICB9XG4gICAgICAgICAgQGlmIChidXR0b24ua2V5ID09PSAnc3dpdGNoJykge1xuICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1zd2l0Y2hcbiAgICAgICAgICAgICAgW2FjdGl2ZV09XCJidXR0b24uYWN0aXZlIHx8IGZhbHNlXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVdPVwiYnV0dG9uLmRpc2FibGUgfHwgZGlzYWJsZSgpXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJ7eyBidXR0b24uY2xhc3NJbmNsdWRlIH19XCJcbiAgICAgICAgICAgICAgKG91dFN3aXRjaCk9XCJoYW5kbGVyU3dpdGNoKCRldmVudCwgYnV0dG9uKVwiIC8+XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgQGlmIChidXR0b24ua2V5ID09PSAnYnV0dG9uJykge1xuICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLWJ1dHRvblxuICAgICAgICAgICAgICBbbGFiZWxdPVwiYnV0dG9uPy5sYWJlbCB8fCAnJ1wiXG4gICAgICAgICAgICAgIFtjbGFzc0xhYmVsXT1cIihidXR0b24uY2xhc3NMYWJlbCB8fCAnJykgKyAnIGxpYnMtdWktZm9udC1oNHMnXCJcbiAgICAgICAgICAgICAgW3R5cGVdPVwiYnV0dG9uLnR5cGUgfHwgJ2J1dHRvbi1wcmltYXJ5J1wiXG4gICAgICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiYnV0dG9uLmNsYXNzSW5jbHVkZSB8fCAnJ1wiXG4gICAgICAgICAgICAgIFtjbGFzc0ljb25MZWZ0XT1cImJ1dHRvbi5jbGFzc0ljb25MZWZ0IHx8ICcnXCJcbiAgICAgICAgICAgICAgW2NsYXNzSWNvblJpZ2h0XT1cImJ1dHRvbi5jbGFzc0ljb25SaWdodCB8fCAnJ1wiXG4gICAgICAgICAgICAgIFtwb3BvdmVyXT1cImJ1dHRvbi5wb3BvdmVyIHx8IHt9XCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVdPVwiYnV0dG9uLmRpc2FibGUgfHwgZGlzYWJsZSgpXCJcbiAgICAgICAgICAgICAgW2lzUGVuZGluZ109XCJidXR0b24uaXNQZW5kaW5nIHx8IGZhbHNlXCJcbiAgICAgICAgICAgICAgW2ljb25Pbmx5VHlwZV09XCJidXR0b24uaWNvbk9ubHlUeXBlIHx8IGZhbHNlXCJcbiAgICAgICAgICAgICAgKG91dENsaWNrKT1cImhhbmRsZXJDbGlja0J1dHRvbihidXR0b24pXCIgLz5cbiAgICAgICAgICB9XG4gICAgICAgICAgPCEtLSAgdGjDqm0gxJHGsOG7nW5nIHBow6JuIGPDoWNoIC0tPlxuICAgICAgICAgIEBpZiAoYnV0dG9uLmtleSA9PT0gJ2xpbmUtc3BhY2UnKSB7XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGNsYXNzPVwiYmctWyM2NjZiNzldIHctWzFweF0gaC1bMjhweF1cIlxuICAgICAgICAgICAgICBbY2xhc3NdPVwiYnV0dG9uLmNsYXNzSW5jbHVkZVwiPlxuICAgICAgICAgICAgICAmbmJzcDtcbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgICBAaWYgKG1lbnVEcm9wRG93bkNvbmZpZ3MoKTsgYXMgbWVudURyb3BEb3duQ29uZmlncykge1xuICAgICAgICA8ZGl2IGNsYXNzPVwibWwtWzEycHhdXCI+XG4gICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1kcm9wZG93blxuICAgICAgICAgICAgW2lzTmdDb250ZW50XT1cInRydWVcIlxuICAgICAgICAgICAgW3pJbmRleF09XCJ6SW5kZXgoKSArIDFcIlxuICAgICAgICAgICAgW2xpc3RDb25maWddPVwibWVudURyb3BEb3duQ29uZmlncy5saXN0Q29uZmlnXCJcbiAgICAgICAgICAgIFtsaXN0SGlkZGVuSW5wdXRTZWFyY2hdPVwidHJ1ZVwiXG4gICAgICAgICAgICBbcG9wb3ZlckN1c3RvbUNvbmZpZ109XCJtZW51RHJvcERvd25Db25maWdzLnBvcG92ZXJDdXN0b21Db25maWdcIlxuICAgICAgICAgICAgKG91dEZ1bmN0aW9uc0NvbnRyb2wpPVwiaGFuZGxlckNvbnRyb2xEcm9wZG93bk1lbnUoJGV2ZW50KVwiXG4gICAgICAgICAgICAob3V0U2VsZWN0S2V5KT1cImhhbmRsZXJTZWxlY3RlZEtleSgkZXZlbnQpXCI+XG4gICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uXG4gICAgICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiJ3AtWzhweF0nXCJcbiAgICAgICAgICAgICAgW3R5cGVdPVwiJ2J1dHRvbi10aGlyZCdcIlxuICAgICAgICAgICAgICBbaWNvbk9ubHlUeXBlXT1cInRydWVcIlxuICAgICAgICAgICAgICBbY2xhc3NJY29uTGVmdF09XCInbGlicy11aS1pY29uLW1vcmUtdmVydGljYWwgdGV4dC1bIzMzMzMzM10gdGV4dC1bMTJweF0nXCJcbiAgICAgICAgICAgICAgW3BvcG92ZXJdPVwie1xuICAgICAgICAgICAgICAgIGNvbmZpZzoge1xuICAgICAgICAgICAgICAgICAgY29udGVudDogJ2kxOG5fNHhfb3RoZXJfb3BlcmF0aW9ucycsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgIFtpZ25vcmVTdG9wUHJvcGFnYXRpb25FdmVudF09XCJ0cnVlXCIgLz5cbiAgICAgICAgICA8L2xpYnNfdWktY29tcG9uZW50cy1kcm9wZG93bj5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgICBAaWYgKHRlbXBsYXRlUmlnaHQoKTsgYXMgdGVtcGxhdGVSaWdodCkge1xuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGVtcGxhdGVSaWdodFwiIC8+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICA8ZGl2IFtjbGFzc109XCInbGlicy11aS1jb21wb25lbnRzLXBhZ2VfZnVsbC1ib2R5ICcgKyBjbGFzc0JvZHlJbmNsdWRlKClcIj5cbiAgICA8bmctY29udGVudCAvPlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19