@libs-ui/components-inputs-multi-language 0.2.357-14 → 0.2.357-15

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.
@@ -371,7 +371,7 @@ export class LibsUiComponentsInputsMultiLanguageComponent {
371
371
  this.onDestroy.complete();
372
372
  }
373
373
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiComponentsInputsMultiLanguageComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
374
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: LibsUiComponentsInputsMultiLanguageComponent, isStandalone: true, selector: "libs_ui-components-inputs-multi_language", inputs: { optionsLanguage: { classPropertyName: "optionsLanguage", publicName: "optionsLanguage", isSignal: true, isRequired: false, transformFunction: null }, zIndex: { classPropertyName: "zIndex", publicName: "zIndex", isSignal: true, isRequired: false, transformFunction: null }, viewType: { classPropertyName: "viewType", publicName: "viewType", isSignal: true, isRequired: false, transformFunction: null }, singleLanguage: { classPropertyName: "singleLanguage", publicName: "singleLanguage", isSignal: true, isRequired: false, transformFunction: null }, data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: false, transformFunction: null }, validRequired: { classPropertyName: "validRequired", publicName: "validRequired", isSignal: true, isRequired: false, transformFunction: null }, ignoreAdd: { classPropertyName: "ignoreAdd", publicName: "ignoreAdd", isSignal: true, isRequired: false, transformFunction: null }, titleField: { classPropertyName: "titleField", publicName: "titleField", isSignal: true, isRequired: false, transformFunction: null }, keyHeader: { classPropertyName: "keyHeader", publicName: "keyHeader", isSignal: true, isRequired: false, transformFunction: null }, textArea: { classPropertyName: "textArea", publicName: "textArea", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, extendClass: { classPropertyName: "extendClass", publicName: "extendClass", isSignal: true, isRequired: false, transformFunction: null }, extendClassContent: { classPropertyName: "extendClassContent", publicName: "extendClassContent", isSignal: true, isRequired: false, transformFunction: null }, viewPosition: { classPropertyName: "viewPosition", publicName: "viewPosition", isSignal: true, isRequired: false, transformFunction: null }, ignoreRemove: { classPropertyName: "ignoreRemove", publicName: "ignoreRemove", isSignal: true, isRequired: false, transformFunction: null }, validMaxLength: { classPropertyName: "validMaxLength", publicName: "validMaxLength", isSignal: true, isRequired: false, transformFunction: null }, validMinLength: { classPropertyName: "validMinLength", publicName: "validMinLength", isSignal: true, isRequired: false, transformFunction: null }, countCharacters: { classPropertyName: "countCharacters", publicName: "countCharacters", isSignal: true, isRequired: false, transformFunction: null }, viewContent: { classPropertyName: "viewContent", publicName: "viewContent", isSignal: true, isRequired: false, transformFunction: null }, classIncludeKey: { classPropertyName: "classIncludeKey", publicName: "classIncludeKey", isSignal: true, isRequired: false, transformFunction: null }, classIncludeValue: { classPropertyName: "classIncludeValue", publicName: "classIncludeValue", isSignal: true, isRequired: false, transformFunction: null }, dataLanguage: { classPropertyName: "dataLanguage", publicName: "dataLanguage", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, acceptNegativeValue: { classPropertyName: "acceptNegativeValue", publicName: "acceptNegativeValue", isSignal: true, isRequired: false, transformFunction: null }, valueUpDownNumber: { classPropertyName: "valueUpDownNumber", publicName: "valueUpDownNumber", isSignal: true, isRequired: false, transformFunction: null }, maxValueNumber: { classPropertyName: "maxValueNumber", publicName: "maxValueNumber", isSignal: true, isRequired: false, transformFunction: null }, onlyAcceptNegativeValue: { classPropertyName: "onlyAcceptNegativeValue", publicName: "onlyAcceptNegativeValue", isSignal: true, isRequired: false, transformFunction: null }, validOneDefaultMultiLanguage: { classPropertyName: "validOneDefaultMultiLanguage", publicName: "validOneDefaultMultiLanguage", isSignal: true, isRequired: false, transformFunction: null }, classIconAddLanguage: { classPropertyName: "classIconAddLanguage", publicName: "classIconAddLanguage", isSignal: true, isRequired: false, transformFunction: null }, validPattern: { classPropertyName: "validPattern", publicName: "validPattern", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { data: "dataChange", ignoreAdd: "ignoreAddChange", extendClass: "extendClassChange", dataLanguage: "dataLanguageChange", outEventMultiLanguage: "outEventMultiLanguage", outChangeTypeLanguage: "outChangeTypeLanguage", outChangeValueInput: "outChangeValueInput" }, viewQueries: [{ propertyName: "inputComponentRefs", predicate: LibsUiComponentsInputsValidComponent, descendants: true, isSignal: true }, { propertyName: "quillComponentRefs", predicate: LibsUiComponentsInputsQuill2xComponent, descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"w-full flex flex-col gap-[8px]\">\n @if (titleField(); as titleField) {\n <div class=\"libs-ui-font-h6m\">{{ titleField | translate }}</div>\n }\n <div\n class=\"flex flex-col gap-[8px]\"\n [class.gap-[8px]]=\"viewPosition() === 'row'\"\n [class.gap-[16px]]=\"viewPosition() === 'column'\">\n @for (key of languageDisplay(); track key) {\n @if (!viewContent()) {\n <div class=\"flex gap-[8px] w-full {{ extendClass() }}\">\n @if (!singleLanguage()) {\n <div>\n <libs_ui-components-dropdown\n [listConfig]=\"listConfigItem()\"\n [httpRequestDetailItemById]=\"httpRequestDetail()\"\n [listKeysDisable]=\"languageDisplay() | LibsUiComponentsInputsMultiLanguageGetDisableKeyPipe: key\"\n [readonly]=\"$index === 0 || readonly()\"\n [listKeySelected]=\"key\"\n [zIndex]=\"zIndex()\"\n [classInclude]=\"'w-[150px]'\"\n [listHiddenInputSearch]=\"true\"\n [listHasButtonUnSelectOption]=\"false\"\n (outSelectKey)=\"handlerSelectChange($event, key)\" />\n </div>\n }\n <div class=\"flex flex-1 gap-[12px] {{ extendClassContent() }}\">\n @for (item of data(); track item) {\n @if (item.type === 'editor') {\n <div class=\"w-full min-w-0\">\n @if (item.keyBindData | LibsUiComponentsInputsMultiLanguageGetItemPipe: dataLanguageChange; as itemMap) {\n @let constHtmlPlaceholder = item.placeholder || ' ';\n <libs_ui-components-inputs-quill2x\n [(item)]=\"itemMap\"\n [fieldBind]=\"key\"\n [resize]=\"item.resize || 'vertical'\"\n [minHeightEditorContentDefault]=\"item.minHeightEditorContentDefault || 160\"\n [maxHeightEditorContentDefault]=\"item.maxHeightEditorContentDefault\"\n [heightEditorContentDefault]=\"item.heightEditorContentDefault\"\n [validRequired]=\"$index === 0 && data().length <= 1 ? validRequiredDefault() : validRequired()\"\n [placeholder]=\"constHtmlPlaceholder | translate\"\n [readonly]=\"readonly()\"\n (outFocus)=\"handlerInputChange()\"\n (outChange)=\"handlerInputChange()\" />\n }\n </div>\n } @else {\n <div class=\"w-full min-w-0 {{ item.classIncludeInput }}\">\n @if (item.keyBindData | LibsUiComponentsInputsMultiLanguageGetItemPipe: dataLanguageChange; as itemMap) {\n @let constHtmlPlaceholder = item.placeholder || ' ';\n <libs_ui-components-inputs-valid\n [dataType]=\"item.type === 'number' ? 'int' : item.type === 'text' ? 'string' : item.type === 'bigint' ? 'bigint' : 'float'\"\n [(item)]=\"itemMap\"\n [fieldNameBind]=\"key\"\n [tagInput]=\"textArea() ? 'textarea' : 'input'\"\n [placeholder]=\"constHtmlPlaceholder | translate\"\n [emitEmptyInDataTypeNumber]=\"true\"\n [validRequired]=\"\n validOneDefaultMultiLanguage()\n ? { isRequired: validOneDefaultMultiLanguage() === key ? true : false }\n : $index === 0 && data().length <= 1\n ? validRequiredDefault()\n : $index === 0 && data().length > 1 && item.validRequiredLangDefault\n ? item.validRequiredLangDefault\n : item.validRequired\n ? item.validRequired\n : validRequired() || { isRequired: false }\n \"\n [unitsRight]=\"currencyUnits()\"\n [keySelectedUnitRight]=\"key\"\n [readonly]=\"readonly()\"\n [showCount]=\"countCharacters()\"\n [maxLength]=\"validMaxLength().length ? validMaxLength().length : undefined\"\n [fixedFloat]=\"item.type === 'bigint' ? 4 : 14\"\n [validMinLength]=\"\n validOneDefaultMultiLanguage() && validOneDefaultMultiLanguage() !== key && !itemMap()[key]\n ? undefined\n : { length: validMinLength()?.length || -1, message: 'i18n_minimum_length_number', interpolateParams: { number: validMinLength()?.length } }\n \"\n [validPattern]=\"validPattern()\"\n [acceptNegativeValue]=\"acceptNegativeValue()\"\n [valueUpDownNumber]=\"valueUpDownNumber()\"\n [maxValueNumber]=\"maxValueNumber()\"\n [onlyAcceptNegativeValue]=\"onlyAcceptNegativeValue()\"\n (outValueChange)=\"handlerInputChange()\" />\n }\n </div>\n }\n }\n @if (!singleLanguage()) {\n <div\n class=\"flex items-center w-[16px] shrink-0\"\n [class.h-[32px]]=\"data()[0].type !== 'editor'\"\n [class.h-[44px]]=\"data()[0].type === 'editor'\">\n @if ($index > 0 && data().length === 1 && !ignoreRemove() && !readonly()) {\n <libs_ui-components-buttons-button\n [type]=\"'button-link-custom'\"\n [buttonCustom]=\"{\n configStepColor: {\n text: '#6a7383',\n text_hover: '#ee2d41',\n text_active: '#ee2d41',\n text_disable: '#6a7383',\n },\n rootColor: '#6a7383',\n }\"\n [iconOnlyType]=\"true\"\n [popover]=\"{ config: { content: 'i18n_delete', zIndex: 1205 } }\"\n [classIconLeft]=\"'libs-ui-icon-remove'\"\n [classInclude]=\"'!p-0'\"\n (outClick)=\"handlerRemoveLanguage($event, key)\" />\n }\n @if ($index === 0 && options().length !== languageDisplay().length && viewType() !== 'integer' && !readonly()) {\n <libs_ui-components-buttons-button\n [type]=\"'button-link-third'\"\n [iconOnlyType]=\"true\"\n [classIconLeft]=\"classIconAddLanguage()\"\n [classInclude]=\"'!p-0'\"\n (outClick)=\"handlerAddLanguage($event)\" />\n }\n </div>\n }\n </div>\n </div>\n }\n @if (viewContent()) {\n <div class=\"flex gap-[4px]\">\n @if (!singleLanguage()) {\n <div class=\"flex\">\n <libs_ui-components-popover\n [type]=\"'text'\"\n [classInclude]=\"classIncludeKey()\"\n [innerHTML]=\"key | LibsUiComponentsInputsMultiLanguageDisplayLanguagePipe: options()\" />\n </div>\n }\n <div class=\"flex flex-1 min-w-0\">\n <libs_ui-components-popover\n [type]=\"'text'\"\n [classInclude]=\"classIncludeValue()\"\n [innerHTML]=\"(dataLanguageChange()[key] || dataLanguageChange()[key] === 0 ? dataLanguageChange()[key] + '' : '') | LibsUiPipesEscapeHtmlPipe\"\n [config]=\"{ zIndex: zIndex() }\" />\n </div>\n </div>\n }\n }\n </div>\n @if (viewType() === 'integer' && !this.ignoreAdd() && !readonly()) {\n <libs_ui-components-buttons-button\n [type]=\"'button-link-primary'\"\n [classIconLeft]=\"'libs-ui-icon-add'\"\n [classLabel]=\"'libs-ui-font-h6mi'\"\n [classInclude]=\"'!px-0 !py-[2px]'\"\n [label]=\"'i18n_add_new'\"\n (outClick)=\"handlerAddLanguage($event)\" />\n }\n</div>\n", dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { 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: LibsUiComponentsInputsValidComponent, selector: "libs_ui-components-inputs-valid", inputs: ["item", "labelConfig", "emitEmptyInDataTypeNumber", "ignoreBlockInputMaxValue", "fieldNameBind", "showCount", "typeComponentSelectItem", "valueComponentSelectItem", "disableComponentSelectItem", "tagInput", "dataType", "typeInput", "modeInput", "resetAutoCompletePassword", "textAreaEnterNotNewLine", "fixedFloat", "acceptNegativeValue", "valueUpDownNumber", "ignoreWidthInput100", "classIncludeInput", "classContainerInput", "readonly", "disable", "noBorder", "backgroundNone", "useColorModeExist", "placeholder", "keepPlaceholderOnly", "classContainerBottomInput", "autoRemoveEmoji", "defaultHeight", "maxHeightTextArea", "minHeightTextArea", "ignoreShowError", "ignoreShowMessageError", "borderError", "iconLeftClass", "popoverContentIconLeft", "iconRightClass", "popoverContentIconRight", "zIndexPopoverContent", "unitsLeft", "configUnitLeft", "keySelectedUnitLeft", "unitsRight", "configUnitRight", "keySelectedUnitRight", "maxValueNumber", "minValueNumber", "ignoreContentLeft", "ignoreContentRight", "isBaselineStyle", "valuePatternShowError", "validPattern", "validRequired", "validMinLength", "validMinValue", "validMaxValue", "validMaxLength", "functionValid", "maxLength", "positionMessageErrorStartInput", "classInclude", "resize", "templateLeftBottomInput", "templateRightBottomInput", "onlyAcceptNegativeValue", "autoAddZeroLessThan10InTypeInt", "maxLengthNumberCount", "classMessageErrorInclude", "ignoreStopPropagationEvent", "ignoreUnitRightClassReadOnly", "paddingRightCustomSpecific", "focusTimeOut", "debounceTimeValidate"], outputs: ["itemChange", "outValueChange", "outSelect", "outIconLeft", "outIconRight", "outClickButtonLabel", "outSwitchEventLabel", "outLabelRightClick", "outEnterInputEvent", "outHeightAreaChange", "outFunctionsControl", "outFocusAndBlur", "outChangeValueByButtonUpDown"] }, { 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: 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: "pipe", type: LibsUiComponentsInputsMultiLanguageGetDisableKeyPipe, name: "LibsUiComponentsInputsMultiLanguageGetDisableKeyPipe" }, { kind: "pipe", type: LibsUiComponentsInputsMultiLanguageDisplayLanguagePipe, name: "LibsUiComponentsInputsMultiLanguageDisplayLanguagePipe" }, { kind: "pipe", type: LibsUiComponentsInputsMultiLanguageGetItemPipe, name: "LibsUiComponentsInputsMultiLanguageGetItemPipe" }, { kind: "pipe", type: LibsUiPipesEscapeHtmlPipe, name: "LibsUiPipesEscapeHtmlPipe" }, { kind: "component", type: LibsUiComponentsInputsQuill2xComponent, selector: "libs_ui-components-inputs-quill2x", inputs: ["uploadImageConfig", "displayToolbar", "placeholder", "blotsRegister", "readonly", "quillCustomConfig", "label", "item", "fieldBind", "dataConfigMention", "templateToolBarPersonalize", "mentionListTemplate", "zIndex", "ignoreShowPopupEditLink", "ignoreCommunicateMicroEventPopup", "handlersExpand", "resizeImagePlugin", "customStylesConvertInline", "fontSizeDefault", "heightEditorContentDefault", "minHeightEditorContentDefault", "maxHeightEditorContentDefault", "removeNearWhiteColorsOnPaste", "resize", "autoFocus", "focusTimerOnInit", "focusBottom", "validRequired", "validMinLength", "validMaxLength", "showErrorLabel", "showErrorBorder", "ignoreShowBorderErrorToolbar"], outputs: ["itemChange", "outShowPopupEditLink", "outMessageError", "outBlur", "outFocus", "outChange", "outSelectionChange", "outTextChange", "outContextMenu", "outFunctionsControl"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
374
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: LibsUiComponentsInputsMultiLanguageComponent, isStandalone: true, selector: "libs_ui-components-inputs-multi_language", inputs: { optionsLanguage: { classPropertyName: "optionsLanguage", publicName: "optionsLanguage", isSignal: true, isRequired: false, transformFunction: null }, zIndex: { classPropertyName: "zIndex", publicName: "zIndex", isSignal: true, isRequired: false, transformFunction: null }, viewType: { classPropertyName: "viewType", publicName: "viewType", isSignal: true, isRequired: false, transformFunction: null }, singleLanguage: { classPropertyName: "singleLanguage", publicName: "singleLanguage", isSignal: true, isRequired: false, transformFunction: null }, data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: false, transformFunction: null }, validRequired: { classPropertyName: "validRequired", publicName: "validRequired", isSignal: true, isRequired: false, transformFunction: null }, ignoreAdd: { classPropertyName: "ignoreAdd", publicName: "ignoreAdd", isSignal: true, isRequired: false, transformFunction: null }, titleField: { classPropertyName: "titleField", publicName: "titleField", isSignal: true, isRequired: false, transformFunction: null }, keyHeader: { classPropertyName: "keyHeader", publicName: "keyHeader", isSignal: true, isRequired: false, transformFunction: null }, textArea: { classPropertyName: "textArea", publicName: "textArea", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, extendClass: { classPropertyName: "extendClass", publicName: "extendClass", isSignal: true, isRequired: false, transformFunction: null }, extendClassContent: { classPropertyName: "extendClassContent", publicName: "extendClassContent", isSignal: true, isRequired: false, transformFunction: null }, viewPosition: { classPropertyName: "viewPosition", publicName: "viewPosition", isSignal: true, isRequired: false, transformFunction: null }, ignoreRemove: { classPropertyName: "ignoreRemove", publicName: "ignoreRemove", isSignal: true, isRequired: false, transformFunction: null }, validMaxLength: { classPropertyName: "validMaxLength", publicName: "validMaxLength", isSignal: true, isRequired: false, transformFunction: null }, validMinLength: { classPropertyName: "validMinLength", publicName: "validMinLength", isSignal: true, isRequired: false, transformFunction: null }, countCharacters: { classPropertyName: "countCharacters", publicName: "countCharacters", isSignal: true, isRequired: false, transformFunction: null }, viewContent: { classPropertyName: "viewContent", publicName: "viewContent", isSignal: true, isRequired: false, transformFunction: null }, classIncludeKey: { classPropertyName: "classIncludeKey", publicName: "classIncludeKey", isSignal: true, isRequired: false, transformFunction: null }, classIncludeValue: { classPropertyName: "classIncludeValue", publicName: "classIncludeValue", isSignal: true, isRequired: false, transformFunction: null }, dataLanguage: { classPropertyName: "dataLanguage", publicName: "dataLanguage", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, acceptNegativeValue: { classPropertyName: "acceptNegativeValue", publicName: "acceptNegativeValue", isSignal: true, isRequired: false, transformFunction: null }, valueUpDownNumber: { classPropertyName: "valueUpDownNumber", publicName: "valueUpDownNumber", isSignal: true, isRequired: false, transformFunction: null }, maxValueNumber: { classPropertyName: "maxValueNumber", publicName: "maxValueNumber", isSignal: true, isRequired: false, transformFunction: null }, onlyAcceptNegativeValue: { classPropertyName: "onlyAcceptNegativeValue", publicName: "onlyAcceptNegativeValue", isSignal: true, isRequired: false, transformFunction: null }, validOneDefaultMultiLanguage: { classPropertyName: "validOneDefaultMultiLanguage", publicName: "validOneDefaultMultiLanguage", isSignal: true, isRequired: false, transformFunction: null }, classIconAddLanguage: { classPropertyName: "classIconAddLanguage", publicName: "classIconAddLanguage", isSignal: true, isRequired: false, transformFunction: null }, validPattern: { classPropertyName: "validPattern", publicName: "validPattern", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { data: "dataChange", ignoreAdd: "ignoreAddChange", extendClass: "extendClassChange", dataLanguage: "dataLanguageChange", outEventMultiLanguage: "outEventMultiLanguage", outChangeTypeLanguage: "outChangeTypeLanguage", outChangeValueInput: "outChangeValueInput" }, viewQueries: [{ propertyName: "inputComponentRefs", predicate: LibsUiComponentsInputsValidComponent, descendants: true, isSignal: true }, { propertyName: "quillComponentRefs", predicate: LibsUiComponentsInputsQuill2xComponent, descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"w-full flex flex-col gap-[8px]\">\n @if (titleField(); as titleField) {\n <div class=\"libs-ui-font-h6m\">{{ titleField | translate }}</div>\n }\n <div\n class=\"flex flex-col gap-[8px]\"\n [class.gap-[8px]]=\"viewPosition() === 'row'\"\n [class.gap-[16px]]=\"viewPosition() === 'column'\">\n @for (key of languageDisplay(); track key) {\n @if (!viewContent()) {\n <div class=\"flex gap-[8px] w-full {{ extendClass() }}\">\n @if (!singleLanguage()) {\n <div>\n <libs_ui-components-dropdown\n [listConfig]=\"listConfigItem()\"\n [httpRequestDetailItemById]=\"httpRequestDetail()\"\n [listKeysDisable]=\"languageDisplay() | LibsUiComponentsInputsMultiLanguageGetDisableKeyPipe: key\"\n [readonly]=\"$index === 0 || readonly()\"\n [listKeySelected]=\"key\"\n [zIndex]=\"zIndex()\"\n [classInclude]=\"'w-[150px]'\"\n [listHiddenInputSearch]=\"true\"\n [listHasButtonUnSelectOption]=\"false\"\n (outSelectKey)=\"handlerSelectChange($event, key)\" />\n </div>\n }\n <div class=\"flex flex-1 gap-[12px] {{ extendClassContent() }}\">\n @for (item of data(); track item) {\n @if (item.type === 'editor') {\n <div class=\"w-full min-w-0\">\n @if (item.keyBindData | LibsUiComponentsInputsMultiLanguageGetItemPipe: dataLanguageChange; as itemMap) {\n @let constHtmlPlaceholder = item.placeholder || ' ';\n <libs_ui-components-inputs-quill2x\n [(item)]=\"itemMap\"\n [fieldBind]=\"key\"\n [resize]=\"item.resize || 'vertical'\"\n [minHeightEditorContentDefault]=\"item.minHeightEditorContentDefault || 160\"\n [maxHeightEditorContentDefault]=\"item.maxHeightEditorContentDefault\"\n [heightEditorContentDefault]=\"item.heightEditorContentDefault\"\n [validRequired]=\"$index === 0 && data().length <= 1 ? validRequiredDefault() : validRequired()\"\n [placeholder]=\"constHtmlPlaceholder | translate\"\n [readonly]=\"readonly()\"\n (outFocus)=\"handlerInputChange()\"\n (outChange)=\"handlerInputChange()\" />\n }\n </div>\n } @else {\n <div class=\"w-full min-w-0 {{ item.classIncludeInput }}\">\n @if (item.keyBindData | LibsUiComponentsInputsMultiLanguageGetItemPipe: dataLanguageChange; as itemMap) {\n @let constHtmlPlaceholder = item.placeholder || ' ';\n <libs_ui-components-inputs-valid\n [dataType]=\"item.type === 'number' ? 'int' : item.type === 'text' ? 'string' : item.type === 'bigint' ? 'bigint' : 'float'\"\n [(item)]=\"itemMap\"\n [fieldNameBind]=\"key\"\n [tagInput]=\"textArea() ? 'textarea' : 'input'\"\n [placeholder]=\"constHtmlPlaceholder | translate\"\n [emitEmptyInDataTypeNumber]=\"true\"\n [validRequired]=\"\n validOneDefaultMultiLanguage()\n ? { isRequired: validOneDefaultMultiLanguage() === key ? true : false }\n : $index === 0 && data().length <= 1\n ? validRequiredDefault()\n : $index === 0 && data().length > 1 && item.validRequiredLangDefault\n ? item.validRequiredLangDefault\n : item.validRequired\n ? item.validRequired\n : validRequired() || { isRequired: false }\n \"\n [unitsRight]=\"currencyUnits()\"\n [keySelectedUnitRight]=\"key\"\n [readonly]=\"readonly()\"\n [showCount]=\"countCharacters()\"\n [maxLength]=\"validMaxLength().length ? validMaxLength().length : undefined\"\n [fixedFloat]=\"item.type === 'bigint' ? 4 : 14\"\n [validMinLength]=\"\n validOneDefaultMultiLanguage() && validOneDefaultMultiLanguage() !== key && !itemMap()[key]\n ? undefined\n : { length: validMinLength()?.length || -1, message: 'i18n_minimum_length_number', interpolateParams: { number: validMinLength()?.length } }\n \"\n [validPattern]=\"validPattern()\"\n [acceptNegativeValue]=\"acceptNegativeValue()\"\n [valueUpDownNumber]=\"valueUpDownNumber()\"\n [maxValueNumber]=\"maxValueNumber()\"\n [onlyAcceptNegativeValue]=\"onlyAcceptNegativeValue()\"\n (outValueChange)=\"handlerInputChange()\" />\n }\n </div>\n }\n }\n @if (!singleLanguage()) {\n <div\n class=\"flex items-center w-[16px] shrink-0\"\n [class.h-[32px]]=\"data()[0].type !== 'editor'\"\n [class.h-[44px]]=\"data()[0].type === 'editor'\">\n @if ($index > 0 && data().length === 1 && !ignoreRemove() && !readonly()) {\n <libs_ui-components-buttons-button\n [type]=\"'button-link-custom'\"\n [buttonCustom]=\"{\n configStepColor: {\n text: '#6a7383',\n text_hover: '#ee2d41',\n text_active: '#ee2d41',\n text_disable: '#6a7383',\n },\n rootColor: '#6a7383',\n }\"\n [iconOnlyType]=\"true\"\n [popover]=\"{ config: { content: 'i18n_delete', zIndex: 1205 } }\"\n [classIconLeft]=\"'libs-ui-icon-remove'\"\n [classInclude]=\"'!p-0'\"\n (outClick)=\"handlerRemoveLanguage($event, key)\" />\n }\n @if ($index === 0 && options().length !== languageDisplay().length && viewType() !== 'integer' && !readonly()) {\n <libs_ui-components-buttons-button\n [type]=\"'button-link-third'\"\n [iconOnlyType]=\"true\"\n [classIconLeft]=\"classIconAddLanguage()\"\n [classInclude]=\"'!p-0'\"\n (outClick)=\"handlerAddLanguage($event)\" />\n }\n </div>\n }\n </div>\n </div>\n }\n @if (viewContent()) {\n <div class=\"flex gap-[4px]\">\n @if (!singleLanguage()) {\n <div class=\"flex\">\n <libs_ui-components-popover\n [type]=\"'text'\"\n [classInclude]=\"classIncludeKey()\"\n [innerHTML]=\"key | LibsUiComponentsInputsMultiLanguageDisplayLanguagePipe: options()\" />\n </div>\n }\n <div class=\"flex flex-1 min-w-0\">\n <libs_ui-components-popover\n [type]=\"'text'\"\n [classInclude]=\"classIncludeValue()\"\n [innerHTML]=\"(dataLanguageChange()[key] || dataLanguageChange()[key] === 0 ? dataLanguageChange()[key] + '' : '') | LibsUiPipesEscapeHtmlPipe\"\n [config]=\"{ zIndex: zIndex() }\" />\n </div>\n </div>\n }\n }\n </div>\n @if (viewType() === 'integer' && !this.ignoreAdd() && !readonly()) {\n <libs_ui-components-buttons-button\n [type]=\"'button-link-primary'\"\n [classIconLeft]=\"'libs-ui-icon-add'\"\n [classLabel]=\"'libs-ui-font-h6mi'\"\n [classInclude]=\"'!px-0 !py-[2px]'\"\n [label]=\"'i18n_add_new'\"\n (outClick)=\"handlerAddLanguage($event)\" />\n }\n</div>\n", dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { 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", "onlyEmitMultiKeyWhenManualClick", "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: LibsUiComponentsInputsValidComponent, selector: "libs_ui-components-inputs-valid", inputs: ["item", "labelConfig", "emitEmptyInDataTypeNumber", "ignoreBlockInputMaxValue", "fieldNameBind", "showCount", "typeComponentSelectItem", "valueComponentSelectItem", "disableComponentSelectItem", "tagInput", "dataType", "typeInput", "modeInput", "resetAutoCompletePassword", "textAreaEnterNotNewLine", "fixedFloat", "acceptNegativeValue", "valueUpDownNumber", "ignoreWidthInput100", "classIncludeInput", "classContainerInput", "readonly", "disable", "noBorder", "backgroundNone", "useColorModeExist", "placeholder", "keepPlaceholderOnly", "classContainerBottomInput", "autoRemoveEmoji", "defaultHeight", "maxHeightTextArea", "minHeightTextArea", "ignoreShowError", "ignoreShowMessageError", "borderError", "iconLeftClass", "popoverContentIconLeft", "iconRightClass", "popoverContentIconRight", "zIndexPopoverContent", "unitsLeft", "configUnitLeft", "keySelectedUnitLeft", "unitsRight", "configUnitRight", "keySelectedUnitRight", "maxValueNumber", "minValueNumber", "ignoreContentLeft", "ignoreContentRight", "isBaselineStyle", "valuePatternShowError", "validPattern", "validRequired", "validMinLength", "validMinValue", "validMaxValue", "validMaxLength", "functionValid", "maxLength", "positionMessageErrorStartInput", "classInclude", "resize", "templateLeftBottomInput", "templateRightBottomInput", "onlyAcceptNegativeValue", "autoAddZeroLessThan10InTypeInt", "maxLengthNumberCount", "classMessageErrorInclude", "ignoreStopPropagationEvent", "ignoreUnitRightClassReadOnly", "paddingRightCustomSpecific", "focusTimeOut", "debounceTimeValidate"], outputs: ["itemChange", "outValueChange", "outSelect", "outIconLeft", "outIconRight", "outClickButtonLabel", "outSwitchEventLabel", "outLabelRightClick", "outEnterInputEvent", "outHeightAreaChange", "outFunctionsControl", "outFocusAndBlur", "outChangeValueByButtonUpDown"] }, { 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: 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: "pipe", type: LibsUiComponentsInputsMultiLanguageGetDisableKeyPipe, name: "LibsUiComponentsInputsMultiLanguageGetDisableKeyPipe" }, { kind: "pipe", type: LibsUiComponentsInputsMultiLanguageDisplayLanguagePipe, name: "LibsUiComponentsInputsMultiLanguageDisplayLanguagePipe" }, { kind: "pipe", type: LibsUiComponentsInputsMultiLanguageGetItemPipe, name: "LibsUiComponentsInputsMultiLanguageGetItemPipe" }, { kind: "pipe", type: LibsUiPipesEscapeHtmlPipe, name: "LibsUiPipesEscapeHtmlPipe" }, { kind: "component", type: LibsUiComponentsInputsQuill2xComponent, selector: "libs_ui-components-inputs-quill2x", inputs: ["uploadImageConfig", "displayToolbar", "placeholder", "blotsRegister", "readonly", "quillCustomConfig", "label", "item", "fieldBind", "dataConfigMention", "templateToolBarPersonalize", "mentionListTemplate", "zIndex", "ignoreShowPopupEditLink", "ignoreCommunicateMicroEventPopup", "handlersExpand", "resizeImagePlugin", "customStylesConvertInline", "fontSizeDefault", "heightEditorContentDefault", "minHeightEditorContentDefault", "maxHeightEditorContentDefault", "removeNearWhiteColorsOnPaste", "resize", "autoFocus", "focusTimerOnInit", "focusBottom", "validRequired", "validMinLength", "validMaxLength", "showErrorLabel", "showErrorBorder", "ignoreShowBorderErrorToolbar"], outputs: ["itemChange", "outShowPopupEditLink", "outMessageError", "outBlur", "outFocus", "outChange", "outSelectionChange", "outTextChange", "outContextMenu", "outFunctionsControl"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
375
375
  }
376
376
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiComponentsInputsMultiLanguageComponent, decorators: [{
377
377
  type: Component,
@@ -388,4 +388,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
388
388
  LibsUiComponentsInputsQuill2xComponent,
389
389
  ], template: "<div class=\"w-full flex flex-col gap-[8px]\">\n @if (titleField(); as titleField) {\n <div class=\"libs-ui-font-h6m\">{{ titleField | translate }}</div>\n }\n <div\n class=\"flex flex-col gap-[8px]\"\n [class.gap-[8px]]=\"viewPosition() === 'row'\"\n [class.gap-[16px]]=\"viewPosition() === 'column'\">\n @for (key of languageDisplay(); track key) {\n @if (!viewContent()) {\n <div class=\"flex gap-[8px] w-full {{ extendClass() }}\">\n @if (!singleLanguage()) {\n <div>\n <libs_ui-components-dropdown\n [listConfig]=\"listConfigItem()\"\n [httpRequestDetailItemById]=\"httpRequestDetail()\"\n [listKeysDisable]=\"languageDisplay() | LibsUiComponentsInputsMultiLanguageGetDisableKeyPipe: key\"\n [readonly]=\"$index === 0 || readonly()\"\n [listKeySelected]=\"key\"\n [zIndex]=\"zIndex()\"\n [classInclude]=\"'w-[150px]'\"\n [listHiddenInputSearch]=\"true\"\n [listHasButtonUnSelectOption]=\"false\"\n (outSelectKey)=\"handlerSelectChange($event, key)\" />\n </div>\n }\n <div class=\"flex flex-1 gap-[12px] {{ extendClassContent() }}\">\n @for (item of data(); track item) {\n @if (item.type === 'editor') {\n <div class=\"w-full min-w-0\">\n @if (item.keyBindData | LibsUiComponentsInputsMultiLanguageGetItemPipe: dataLanguageChange; as itemMap) {\n @let constHtmlPlaceholder = item.placeholder || ' ';\n <libs_ui-components-inputs-quill2x\n [(item)]=\"itemMap\"\n [fieldBind]=\"key\"\n [resize]=\"item.resize || 'vertical'\"\n [minHeightEditorContentDefault]=\"item.minHeightEditorContentDefault || 160\"\n [maxHeightEditorContentDefault]=\"item.maxHeightEditorContentDefault\"\n [heightEditorContentDefault]=\"item.heightEditorContentDefault\"\n [validRequired]=\"$index === 0 && data().length <= 1 ? validRequiredDefault() : validRequired()\"\n [placeholder]=\"constHtmlPlaceholder | translate\"\n [readonly]=\"readonly()\"\n (outFocus)=\"handlerInputChange()\"\n (outChange)=\"handlerInputChange()\" />\n }\n </div>\n } @else {\n <div class=\"w-full min-w-0 {{ item.classIncludeInput }}\">\n @if (item.keyBindData | LibsUiComponentsInputsMultiLanguageGetItemPipe: dataLanguageChange; as itemMap) {\n @let constHtmlPlaceholder = item.placeholder || ' ';\n <libs_ui-components-inputs-valid\n [dataType]=\"item.type === 'number' ? 'int' : item.type === 'text' ? 'string' : item.type === 'bigint' ? 'bigint' : 'float'\"\n [(item)]=\"itemMap\"\n [fieldNameBind]=\"key\"\n [tagInput]=\"textArea() ? 'textarea' : 'input'\"\n [placeholder]=\"constHtmlPlaceholder | translate\"\n [emitEmptyInDataTypeNumber]=\"true\"\n [validRequired]=\"\n validOneDefaultMultiLanguage()\n ? { isRequired: validOneDefaultMultiLanguage() === key ? true : false }\n : $index === 0 && data().length <= 1\n ? validRequiredDefault()\n : $index === 0 && data().length > 1 && item.validRequiredLangDefault\n ? item.validRequiredLangDefault\n : item.validRequired\n ? item.validRequired\n : validRequired() || { isRequired: false }\n \"\n [unitsRight]=\"currencyUnits()\"\n [keySelectedUnitRight]=\"key\"\n [readonly]=\"readonly()\"\n [showCount]=\"countCharacters()\"\n [maxLength]=\"validMaxLength().length ? validMaxLength().length : undefined\"\n [fixedFloat]=\"item.type === 'bigint' ? 4 : 14\"\n [validMinLength]=\"\n validOneDefaultMultiLanguage() && validOneDefaultMultiLanguage() !== key && !itemMap()[key]\n ? undefined\n : { length: validMinLength()?.length || -1, message: 'i18n_minimum_length_number', interpolateParams: { number: validMinLength()?.length } }\n \"\n [validPattern]=\"validPattern()\"\n [acceptNegativeValue]=\"acceptNegativeValue()\"\n [valueUpDownNumber]=\"valueUpDownNumber()\"\n [maxValueNumber]=\"maxValueNumber()\"\n [onlyAcceptNegativeValue]=\"onlyAcceptNegativeValue()\"\n (outValueChange)=\"handlerInputChange()\" />\n }\n </div>\n }\n }\n @if (!singleLanguage()) {\n <div\n class=\"flex items-center w-[16px] shrink-0\"\n [class.h-[32px]]=\"data()[0].type !== 'editor'\"\n [class.h-[44px]]=\"data()[0].type === 'editor'\">\n @if ($index > 0 && data().length === 1 && !ignoreRemove() && !readonly()) {\n <libs_ui-components-buttons-button\n [type]=\"'button-link-custom'\"\n [buttonCustom]=\"{\n configStepColor: {\n text: '#6a7383',\n text_hover: '#ee2d41',\n text_active: '#ee2d41',\n text_disable: '#6a7383',\n },\n rootColor: '#6a7383',\n }\"\n [iconOnlyType]=\"true\"\n [popover]=\"{ config: { content: 'i18n_delete', zIndex: 1205 } }\"\n [classIconLeft]=\"'libs-ui-icon-remove'\"\n [classInclude]=\"'!p-0'\"\n (outClick)=\"handlerRemoveLanguage($event, key)\" />\n }\n @if ($index === 0 && options().length !== languageDisplay().length && viewType() !== 'integer' && !readonly()) {\n <libs_ui-components-buttons-button\n [type]=\"'button-link-third'\"\n [iconOnlyType]=\"true\"\n [classIconLeft]=\"classIconAddLanguage()\"\n [classInclude]=\"'!p-0'\"\n (outClick)=\"handlerAddLanguage($event)\" />\n }\n </div>\n }\n </div>\n </div>\n }\n @if (viewContent()) {\n <div class=\"flex gap-[4px]\">\n @if (!singleLanguage()) {\n <div class=\"flex\">\n <libs_ui-components-popover\n [type]=\"'text'\"\n [classInclude]=\"classIncludeKey()\"\n [innerHTML]=\"key | LibsUiComponentsInputsMultiLanguageDisplayLanguagePipe: options()\" />\n </div>\n }\n <div class=\"flex flex-1 min-w-0\">\n <libs_ui-components-popover\n [type]=\"'text'\"\n [classInclude]=\"classIncludeValue()\"\n [innerHTML]=\"(dataLanguageChange()[key] || dataLanguageChange()[key] === 0 ? dataLanguageChange()[key] + '' : '') | LibsUiPipesEscapeHtmlPipe\"\n [config]=\"{ zIndex: zIndex() }\" />\n </div>\n </div>\n }\n }\n </div>\n @if (viewType() === 'integer' && !this.ignoreAdd() && !readonly()) {\n <libs_ui-components-buttons-button\n [type]=\"'button-link-primary'\"\n [classIconLeft]=\"'libs-ui-icon-add'\"\n [classLabel]=\"'libs-ui-font-h6mi'\"\n [classInclude]=\"'!px-0 !py-[2px]'\"\n [label]=\"'i18n_add_new'\"\n (outClick)=\"handlerAddLanguage($event)\" />\n }\n</div>\n" }]
390
390
  }], ctorParameters: () => [] });
391
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGktbGFuZ3VhZ2UuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL2lucHV0cy9tdWx0aS1sYW5ndWFnZS9zcmMvbXVsdGktbGFuZ3VhZ2UuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL2lucHV0cy9tdWx0aS1sYW5ndWFnZS9zcmMvbXVsdGktbGFuZ3VhZ2UuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsdURBQXVEO0FBQ3ZELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDL0osT0FBTyxFQUFFLHNDQUFzQyxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDNUYsT0FBTyxFQUFrQixpQ0FBaUMsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2pHLE9BQU8sRUFBRSxzQ0FBc0MsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQzVGLE9BQU8sRUFBK0Msb0NBQW9DLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNySSxPQUFPLEVBQUUsZ0NBQWdDLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMvRSxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN2RSxPQUFPLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRWpELE9BQU8sRUFBRSxzREFBc0QsRUFB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QUMzQyxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUM1QixDQUFDO3dHQWhZVSw0Q0FBNEM7NEZBQTVDLDRDQUE0QyxtcUpBVUosb0NBQW9DLHdGQUNwQyxzQ0FBc0MsZ0VDL0MzRix3aVFBNEpBLDJDRHBJSSxlQUFlLDRGQUNmLGlDQUFpQyx1M0RBQ2pDLG9DQUFvQyxnM0RBQ3BDLHNDQUFzQyxzakJBQ3RDLGdDQUFnQywrZkFDaEMsb0RBQW9ELHdGQUNwRCxzREFBc0QsMEZBQ3RELDhDQUE4QyxrRkFDOUMseUJBQXlCLGtFQUN6QixzQ0FBc0M7OzRGQUc3Qiw0Q0FBNEM7a0JBbkJ4RCxTQUFTOytCQUVFLDBDQUEwQyxjQUV4QyxJQUFJLG1CQUNDLHVCQUF1QixDQUFDLE1BQU0sV0FDdEM7d0JBQ1AsZUFBZTt3QkFDZixpQ0FBaUM7d0JBQ2pDLG9DQUFvQzt3QkFDcEMsc0NBQXNDO3dCQUN0QyxnQ0FBZ0M7d0JBQ2hDLG9EQUFvRDt3QkFDcEQsc0RBQXNEO3dCQUN0RCw4Q0FBOEM7d0JBQzlDLHlCQUF5Qjt3QkFDekIsc0NBQXNDO3FCQUN2QyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbmltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIGNvbXB1dGVkLCBlZmZlY3QsIGlucHV0LCBtb2RlbCwgT25EZXN0cm95LCBPbkluaXQsIG91dHB1dCwgc2lnbmFsLCB1bnRyYWNrZWQsIHZpZXdDaGlsZHJlbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c0J1dHRvbnNCdXR0b25Db21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uJztcbmltcG9ydCB7IElFbWl0U2VsZWN0S2V5LCBMaWJzVWlDb21wb25lbnRzRHJvcGRvd25Db21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWRyb3Bkb3duJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNJbnB1dHNRdWlsbDJ4Q29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1pbnB1dHMtcXVpbGwyeCc7XG5pbXBvcnQgeyBJVmFsaWRMZW5ndGgsIElWYWxpZFBhdHRlcm4sIElWYWxpZFJlcXVpcmVkLCBMaWJzVWlDb21wb25lbnRzSW5wdXRzVmFsaWRDb21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWlucHV0cy12YWxpZCc7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzUG9wb3ZlckNvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtcG9wb3Zlcic7XG5pbXBvcnQgeyBMaWJzVWlQaXBlc0VzY2FwZUh0bWxQaXBlIH0gZnJvbSAnQGxpYnMtdWkvcGlwZXMtZXNjYXBlLWh0bWwnO1xuaW1wb3J0IHsgY2xvbmVEZWVwLCBnZXQsIGlzTmlsIH0gZnJvbSAnQGxpYnMtdWkvdXRpbHMnO1xuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBTdWJqZWN0LCB0YWtlVW50aWwsIHRpbWVyIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBJQ3VycmVuY3lVbml0LCBJRGF0YUl0ZW0sIElEYXRhTXVsdGlMYW5ndWFnZSwgSUV2ZW50TXVsdGlMYW5ndWFnZSwgSUlucHV0TXVsdGlMYW5ndWFnZUZ1bmN0aW9uQ29udHJvbEV2ZW50LCBJT3B0aW9uLCBUWVBFX1ZJRVdfTVVMVElfTEFOR1VBR0UgfSBmcm9tICcuL2ludGVyZmFjZXMvbXVsdGktbGFuZ3VhZ2UuaW50ZXJmYWNlJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNJbnB1dHNNdWx0aUxhbmd1YWdlRGlzcGxheUxhbmd1YWdlUGlwZSB9IGZyb20gJy4vcGlwZXMvZGlzcGxheS1sYW5ndWFnZS5waXBlJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNJbnB1dHNNdWx0aUxhbmd1YWdlR2V0RGlzYWJsZUtleVBpcGUgfSBmcm9tICcuL3BpcGVzL2dldC1kaXNhYmxlLWtleS5waXBlJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNJbnB1dHNNdWx0aUxhbmd1YWdlR2V0SXRlbVBpcGUgfSBmcm9tICcuL3BpcGVzL2dldC1pdGVtLnBpcGUnO1xuaW1wb3J0IHsgY3VycmVuY2llc09wdGlvbnMsIGN1cnJlbmNpZXNTdXBwb3J0LCBodHRwUmVxdWVzdERldGFpbCwgbGFuZ09wdGlvbnMsIGxhbmd1YWdlU3VwcG9ydCwgbGlzdENvbmZpZ0l0ZW0sIHZhbGlkUmVxdWlyZWQgfSBmcm9tICcuL3V0aWxzL211bHRpLWxhbmd1YWdlJztcblxuQENvbXBvbmVudCh7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvY29tcG9uZW50LXNlbGVjdG9yXG4gIHNlbGVjdG9yOiAnbGlic191aS1jb21wb25lbnRzLWlucHV0cy1tdWx0aV9sYW5ndWFnZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9tdWx0aS1sYW5ndWFnZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBpbXBvcnRzOiBbXG4gICAgVHJhbnNsYXRlTW9kdWxlLFxuICAgIExpYnNVaUNvbXBvbmVudHNEcm9wZG93bkNvbXBvbmVudCxcbiAgICBMaWJzVWlDb21wb25lbnRzSW5wdXRzVmFsaWRDb21wb25lbnQsXG4gICAgTGlic1VpQ29tcG9uZW50c0J1dHRvbnNCdXR0b25Db21wb25lbnQsXG4gICAgTGlic1VpQ29tcG9uZW50c1BvcG92ZXJDb21wb25lbnQsXG4gICAgTGlic1VpQ29tcG9uZW50c0lucHV0c011bHRpTGFuZ3VhZ2VHZXREaXNhYmxlS2V5UGlwZSxcbiAgICBMaWJzVWlDb21wb25lbnRzSW5wdXRzTXVsdGlMYW5ndWFnZURpc3BsYXlMYW5ndWFnZVBpcGUsXG4gICAgTGlic1VpQ29tcG9uZW50c0lucHV0c011bHRpTGFuZ3VhZ2VHZXRJdGVtUGlwZSxcbiAgICBMaWJzVWlQaXBlc0VzY2FwZUh0bWxQaXBlLFxuICAgIExpYnNVaUNvbXBvbmVudHNJbnB1dHNRdWlsbDJ4Q29tcG9uZW50LFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBMaWJzVWlDb21wb25lbnRzSW5wdXRzTXVsdGlMYW5ndWFnZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgcHJvdGVjdGVkIGxhbmd1YWdlRGlzcGxheSA9IHNpZ25hbDxBcnJheTxzdHJpbmc+PihbXSk7XG4gIHByb3RlY3RlZCBkYXRhTGFuZ3VhZ2VDaGFuZ2UgPSBzaWduYWw8SURhdGFNdWx0aUxhbmd1YWdlPih7fSk7XG4gIHByb3RlY3RlZCBsYW5nRGVmYXVsdCA9IHNpZ25hbDxBcnJheTxzdHJpbmc+PihsYW5ndWFnZVN1cHBvcnQoKSk7XG4gIHByb3RlY3RlZCBjdXJyZW5jeVVuaXRzID0gc2lnbmFsPEFycmF5PElDdXJyZW5jeVVuaXQ+PihbXSk7XG4gIHByb3RlY3RlZCBvcHRpb25zID0gc2lnbmFsPEFycmF5PElPcHRpb24+PihsYW5nT3B0aW9ucygpKTtcbiAgcHJvdGVjdGVkIHZhbGlkUmVxdWlyZWREZWZhdWx0ID0gc2lnbmFsPElWYWxpZFJlcXVpcmVkPih2YWxpZFJlcXVpcmVkKCkpO1xuICBwcm90ZWN0ZWQgbGlzdENvbmZpZ0l0ZW0gPSBjb21wdXRlZCgoKSA9PiBsaXN0Q29uZmlnSXRlbSh0aGlzLm9wdGlvbnMoKSkpO1xuICBwcm90ZWN0ZWQgaHR0cFJlcXVlc3REZXRhaWwgPSBjb21wdXRlZCgoKSA9PiBodHRwUmVxdWVzdERldGFpbCh0aGlzLm9wdGlvbnMoKSkpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgaW5wdXRDb21wb25lbnRSZWZzID0gdmlld0NoaWxkcmVuKExpYnNVaUNvbXBvbmVudHNJbnB1dHNWYWxpZENvbXBvbmVudCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgcXVpbGxDb21wb25lbnRSZWZzID0gdmlld0NoaWxkcmVuKExpYnNVaUNvbXBvbmVudHNJbnB1dHNRdWlsbDJ4Q29tcG9uZW50KTtcbiAgcHJpdmF0ZSByZWFkb25seSBvbkRlc3Ryb3kgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIHJlYWRvbmx5IG9wdGlvbnNMYW5ndWFnZSA9IGlucHV0PEFycmF5PElPcHRpb24+PihsYW5nT3B0aW9ucygpKTtcbiAgcmVhZG9ubHkgekluZGV4ID0gaW5wdXQ8bnVtYmVyPigpO1xuICByZWFkb25seSB2aWV3VHlwZSA9IGlucHV0PFRZUEVfVklFV19NVUxUSV9MQU5HVUFHRSwgVFlQRV9WSUVXX01VTFRJX0xBTkdVQUdFIHwgdW5kZWZpbmVkPigndGV4dCcsIHsgdHJhbnNmb3JtOiAodmFsdWUpID0+IHZhbHVlID8/ICd0ZXh0JyB9KTtcbiAgcmVhZG9ubHkgc2luZ2xlTGFuZ3VhZ2UgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBkYXRhID0gbW9kZWw8QXJyYXk8SURhdGFJdGVtPj4oW10pO1xuICByZWFkb25seSB2YWxpZFJlcXVpcmVkID0gaW5wdXQ8SVZhbGlkUmVxdWlyZWQsIElWYWxpZFJlcXVpcmVkIHwgdW5kZWZpbmVkPih2YWxpZFJlcXVpcmVkKCksIHsgdHJhbnNmb3JtOiAodmFsdWUpID0+IHZhbHVlID8/IHZhbGlkUmVxdWlyZWQoKSB9KTtcbiAgcmVhZG9ubHkgaWdub3JlQWRkID0gbW9kZWw8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgdGl0bGVGaWVsZCA9IGlucHV0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkga2V5SGVhZGVyID0gaW5wdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSB0ZXh0QXJlYSA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IHBsYWNlaG9sZGVyID0gaW5wdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSBleHRlbmRDbGFzcyA9IG1vZGVsPHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgZXh0ZW5kQ2xhc3NDb250ZW50ID0gaW5wdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSB2aWV3UG9zaXRpb24gPSBpbnB1dDwncm93JyB8ICdjb2x1bW4nPigncm93Jyk7XG4gIHJlYWRvbmx5IGlnbm9yZVJlbW92ZSA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IHZhbGlkTWF4TGVuZ3RoID0gaW5wdXQ8SVZhbGlkTGVuZ3RoLCBJVmFsaWRMZW5ndGggfCB1bmRlZmluZWQ+KHsgbGVuZ3RoOiAwIH0sIHsgdHJhbnNmb3JtOiAodmFsdWUpID0+IHZhbHVlID8/IHsgbGVuZ3RoOiAwIH0gfSk7XG4gIHJlYWRvbmx5IHZhbGlkTWluTGVuZ3RoID0gaW5wdXQ8SVZhbGlkTGVuZ3RoPigpO1xuICByZWFkb25seSBjb3VudENoYXJhY3RlcnMgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSB2aWV3Q29udGVudCA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGNsYXNzSW5jbHVkZUtleSA9IGlucHV0PHN0cmluZz4oJ2xpYnMtdWktZm9udC1oNHInKTtcbiAgcmVhZG9ubHkgY2xhc3NJbmNsdWRlVmFsdWUgPSBpbnB1dDxzdHJpbmc+KCdsaWJzLXVpLWZvbnQtaDRzJyk7XG4gIHJlYWRvbmx5IGRhdGFMYW5ndWFnZSA9IG1vZGVsPElEYXRhTXVsdGlMYW5ndWFnZT4oe30pO1xuICByZWFkb25seSByZWFkb25seSA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGFjY2VwdE5lZ2F0aXZlVmFsdWUgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSB2YWx1ZVVwRG93bk51bWJlciA9IGlucHV0PG51bWJlcj4oKTtcbiAgcmVhZG9ubHkgbWF4VmFsdWVOdW1iZXIgPSBpbnB1dDxudW1iZXI+KCk7XG4gIHJlYWRvbmx5IG9ubHlBY2NlcHROZWdhdGl2ZVZhbHVlID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgdmFsaWRPbmVEZWZhdWx0TXVsdGlMYW5ndWFnZSA9IGlucHV0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgY2xhc3NJY29uQWRkTGFuZ3VhZ2UgPSBpbnB1dDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4oJ2xpYnMtdWktaWNvbi1hZGQnLCB7IHRyYW5zZm9ybTogKHZhbHVlKSA9PiB2YWx1ZSB8fCAnbGlicy11aS1pY29uLWFkZCcgfSk7XG4gIHJlYWRvbmx5IHZhbGlkUGF0dGVybiA9IGlucHV0PEFycmF5PElWYWxpZFBhdHRlcm4+PigpO1xuXG4gIHJlYWRvbmx5IG91dEV2ZW50TXVsdGlMYW5ndWFnZSA9IG91dHB1dDxJRXZlbnRNdWx0aUxhbmd1YWdlPigpO1xuICByZWFkb25seSBvdXRDaGFuZ2VUeXBlTGFuZ3VhZ2UgPSBvdXRwdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgb3V0Q2hhbmdlVmFsdWVJbnB1dCA9IG91dHB1dDx2b2lkPigpO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5vcHRpb25zTGFuZ3VhZ2UoKSkge1xuICAgICAgICB1bnRyYWNrZWQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMub3B0aW9ucy5zZXQodGhpcy5vcHRpb25zTGFuZ3VhZ2UoKSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGNvbnN0IHZpZXdUeXBlID0gdGhpcy52aWV3VHlwZSgpO1xuICAgICAgdW50cmFja2VkKCgpID0+IHtcbiAgICAgICAgaWYgKHZpZXdUeXBlID09PSAnaW50ZWdlcicpIHtcbiAgICAgICAgICB0aGlzLmxhbmdEZWZhdWx0LnNldChjdXJyZW5jaWVzU3VwcG9ydCgpKTtcbiAgICAgICAgICBjb25zdCBvcHRzID0gY3VycmVuY2llc09wdGlvbnMoKTtcbiAgICAgICAgICB0aGlzLm9wdGlvbnMuc2V0KG9wdHMpO1xuICAgICAgICAgIHRoaXMuY3VycmVuY3lVbml0cy5zZXQoXG4gICAgICAgICAgICBvcHRzLm1hcCgoaXRlbSkgPT4gKHtcbiAgICAgICAgICAgICAgbGFiZWw6IGl0ZW0ubGFiZWwsXG4gICAgICAgICAgICAgIGlkOiBpdGVtLmtleSxcbiAgICAgICAgICAgICAgdHlwZTogaXRlbS5sYWJlbCxcbiAgICAgICAgICAgIH0pKVxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubGFuZ0RlZmF1bHQuc2V0KGxhbmd1YWdlU3VwcG9ydCgpKTtcbiAgICAgICAgdGhpcy5vcHRpb25zLnNldCh0aGlzLm9wdGlvbnNMYW5ndWFnZSgpKTtcbiAgICAgICAgdGhpcy5jdXJyZW5jeVVuaXRzLnNldChbXSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICB1bnRyYWNrZWQoKCkgPT4ge1xuICAgICAgICBjb25zdCBkYXRhTGFuZ3VhZ2UgPSB0aGlzLmRhdGFMYW5ndWFnZSgpO1xuICAgICAgICB0aGlzLmRhdGFMYW5ndWFnZUNoYW5nZS5zZXQoY2xvbmVEZWVwKGRhdGFMYW5ndWFnZSkpO1xuICAgICAgICB0aGlzLmdlbmVyYXRlRGF0YSgpO1xuICAgICAgICB0aGlzLmxhbmd1YWdlRGlzcGxheS5zZXQodGhpcy5jb21wdXRlTGFuZ3VhZ2VEaXNwbGF5S2V5cygpKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGNvbnN0IHNpbmdsZUxhbmd1YWdlID0gdGhpcy5zaW5nbGVMYW5ndWFnZSgpO1xuICAgICAgdW50cmFja2VkKCgpID0+IHtcbiAgICAgICAgdGhpcy5vdXRDaGFuZ2VUeXBlTGFuZ3VhZ2UuZW1pdCh0cnVlKTtcbiAgICAgICAgaWYgKCFzaW5nbGVMYW5ndWFnZSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBrZXkgPSB0aGlzLmxhbmdEZWZhdWx0KClbMF07XG4gICAgICAgIHRoaXMuZGF0YUxhbmd1YWdlLnVwZGF0ZSgodmFsdWUpID0+ICh7IC4uLnZhbHVlLCBba2V5XTogZ2V0KHRoaXMuZGF0YUxhbmd1YWdlQ2hhbmdlKCksIGtleSkgfSkpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgY29uc3QgdmFsaWRSZXF1aXJlZElucHV0ID0gdGhpcy52YWxpZFJlcXVpcmVkKCk7XG4gICAgICB1bnRyYWNrZWQoKCkgPT4ge1xuICAgICAgICBpZiAoIXZhbGlkUmVxdWlyZWRJbnB1dCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZhbGlkUmVxdWlyZWREZWZhdWx0LnVwZGF0ZSgodmFsdWUpID0+ICh7IC4uLnZhbHVlLCBpc1JlcXVpcmVkOiB2YWxpZFJlcXVpcmVkSW5wdXQuaXNSZXF1aXJlZCB9KSk7XG4gICAgICAgIGlmICghdmFsaWRSZXF1aXJlZElucHV0LmlzUmVxdWlyZWQpIHtcbiAgICAgICAgICB2b2lkIHRoaXMudmFsaWRhdGUoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmV4dGVuZENsYXNzLnVwZGF0ZSgodmFsdWUpID0+IGAke3ZhbHVlIHx8ICcnfSAke3RoaXMudmlld1Bvc2l0aW9uKCkgPT09ICdyb3cnID8gJ2ZsZXgtcm93JyA6ICdmbGV4LWNvbCd9YCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IEZ1bmN0aW9uc0NvbnRyb2woKTogSUlucHV0TXVsdGlMYW5ndWFnZUZ1bmN0aW9uQ29udHJvbEV2ZW50IHtcbiAgICByZXR1cm4ge1xuICAgICAgY2hlY2tJc1ZhbGlkOiB0aGlzLnZhbGlkYXRlLmJpbmQodGhpcyksXG4gICAgICBnZXREYXRhOiB0aGlzLmdldERhdGEuYmluZCh0aGlzKSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIEPDoWMga2V5IG5nw7RuIG5n4buvIC8gdGnhu4FuIHThu4cgY+G6p24gaGnhu4NuIHRo4buLIHRoZW8gZOG7ryBsaeG7h3UgKyBj4bqldSBow6xuaCBvcHRpb25zLiAqL1xuICBwcml2YXRlIGNvbXB1dGVMYW5ndWFnZURpc3BsYXlLZXlzKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBkYyA9IHRoaXMuZGF0YUxhbmd1YWdlQ2hhbmdlKCk7XG4gICAgY29uc3Qgb3B0cyA9IHRoaXMub3B0aW9ucygpO1xuICAgIGNvbnN0IGxhbmdzID0gdGhpcy5sYW5nRGVmYXVsdCgpO1xuICAgIGNvbnN0IHNlbGVjdGVkID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICBmb3IgKGNvbnN0IGsgb2YgT2JqZWN0LmtleXMoZGMpKSB7XG4gICAgICBpZiAob3B0cy5zb21lKChvKSA9PiBvLmtleSA9PT0gaykpIHtcbiAgICAgICAgc2VsZWN0ZWQuYWRkKGspO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IGsgb2YgbGFuZ3MpIHtcbiAgICAgIGlmICghaXNOaWwoZ2V0KGRjLCBrKSkpIHtcbiAgICAgICAgc2VsZWN0ZWQuYWRkKGspO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gQXJyYXkuZnJvbShzZWxlY3RlZCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlclNlbGVjdENoYW5nZShldmVudDogSUVtaXRTZWxlY3RLZXkgfCB1bmRlZmluZWQsIGtleU9sZDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCFldmVudCB8fCBldmVudC5rZXkgPT09IGtleU9sZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmxhbmd1YWdlRGlzcGxheS51cGRhdGUoKHZhbHVlKSA9PiB2YWx1ZS5tYXAoKGl0ZW0pID0+IChpdGVtID09PSBrZXlPbGQgPyAoZXZlbnQua2V5IGFzIHN0cmluZykgOiBpdGVtKSkpO1xuICAgIGRlbGV0ZSB0aGlzLmRhdGFMYW5ndWFnZUNoYW5nZSgpW2tleU9sZF07XG4gICAgZGVsZXRlIHRoaXMuZGF0YUxhbmd1YWdlKClba2V5T2xkXTtcbiAgICB0aGlzLnNldERlZmF1bHREYXRhKGV2ZW50LmtleSBhcyBzdHJpbmcpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJBZGRMYW5ndWFnZShldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBjb25zdCBsYW5nID0gdGhpcy5vcHRpb25zKCkuZmluZCgoaXRlbSkgPT4gIXRoaXMubGFuZ3VhZ2VEaXNwbGF5KCkuaW5jbHVkZXMoaXRlbS5rZXkpKTtcbiAgICBpZiAoIWxhbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5sYW5ndWFnZURpc3BsYXkudXBkYXRlKCh2YWx1ZSkgPT4gWy4uLnZhbHVlLCBsYW5nLmtleV0pO1xuICAgIHRoaXMuc2V0RGVmYXVsdERhdGEobGFuZy5rZXkpO1xuICAgIGlmICh0aGlzLm9wdGlvbnMoKS5sZW5ndGggPT09IHRoaXMubGFuZ3VhZ2VEaXNwbGF5KCkubGVuZ3RoKSB7XG4gICAgICB0aGlzLmlnbm9yZUFkZC5zZXQodHJ1ZSk7XG4gICAgfVxuICAgIHRoaXMub3V0RXZlbnRNdWx0aUxhbmd1YWdlLmVtaXQoeyBhY3Rpb246ICdhZGQnLCBkYXRhOiB0aGlzLmRhdGFMYW5ndWFnZUNoYW5nZSgpIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJSZW1vdmVMYW5ndWFnZShldmVudDogRXZlbnQsIGtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5pZ25vcmVBZGQuc2V0KGZhbHNlKTtcbiAgICB0aGlzLmRhdGFMYW5ndWFnZUNoYW5nZS51cGRhdGUoKHZhbHVlKSA9PiB7XG4gICAgICBkZWxldGUgdmFsdWVba2V5XTtcbiAgICAgIHJldHVybiB7IC4uLnZhbHVlIH07XG4gICAgfSk7XG4gICAgdGhpcy52YWxpZGF0ZUlzTXVsdGlLZXkoKTtcbiAgICB0aGlzLmxhbmd1YWdlRGlzcGxheS51cGRhdGUoKHZhbHVlKSA9PiB2YWx1ZS5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0gIT09IGtleSkpO1xuICAgIHRoaXMub3V0RXZlbnRNdWx0aUxhbmd1YWdlLmVtaXQoeyBhY3Rpb246ICdyZW1vdmUnLCBkYXRhOiB0aGlzLmRhdGFMYW5ndWFnZUNoYW5nZSgpIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXREYXRhKCk6IElEYXRhTXVsdGlMYW5ndWFnZSB8IElEYXRhTXVsdGlMYW5ndWFnZVtdIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5zaW5nbGVMYW5ndWFnZSgpKSB7XG4gICAgICBjb25zdCBrZXkgPSB0aGlzLmxhbmdEZWZhdWx0KClbMF07XG4gICAgICB0aGlzLmRhdGFMYW5ndWFnZS51cGRhdGUoKHZhbHVlKSA9PiAoeyAuLi52YWx1ZSwgW2tleV06IGdldCh0aGlzLmRhdGFMYW5ndWFnZUNoYW5nZSgpLCBrZXkpIH0pKTtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFMYW5ndWFnZSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5kYXRhKCkubGVuZ3RoID4gMSkge1xuICAgICAgY29uc3QgZGVmYXVsdExhbmcgPSB0aGlzLmxhbmdEZWZhdWx0KClbMF07XG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy5kYXRhKCkpIHtcbiAgICAgICAgY29uc3Qga2V5QmluZCA9IGl0ZW0ua2V5QmluZERhdGE7XG4gICAgICAgIGNvbnN0IGRhdGFCeUtleSA9IGtleUJpbmQgPyBnZXQodGhpcy5kYXRhTGFuZ3VhZ2VDaGFuZ2UoKSwga2V5QmluZCkgOiB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChrZXlCaW5kICYmIGRhdGFCeUtleSAmJiBkZWZhdWx0TGFuZyAmJiAhZ2V0PGFueT4oZGF0YUJ5S2V5LCBkZWZhdWx0TGFuZykgJiYgIWdldCh0aGlzLmRhdGFMYW5ndWFnZUNoYW5nZSgpLCBkZWZhdWx0TGFuZykpIHtcbiAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZGF0YUxhbmd1YWdlQ2hhbmdlKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2VuZXJhdGVEYXRhKCk6IHZvaWQge1xuICAgIGNvbnN0IGxhbmcgPSB0aGlzLmxhbmdEZWZhdWx0KClbMF07XG4gICAgY29uc3QgZGF0YUl0ZW1zID0gdGhpcy5kYXRhKCk7XG4gICAgaWYgKGRhdGFJdGVtcy5sZW5ndGgpIHtcbiAgICAgIGRhdGFJdGVtcy5mb3JFYWNoKChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgICBjb25zdCBrZXkgPSBpdGVtLmtleUJpbmREYXRhO1xuICAgICAgICBpZiAoIWluZGV4ICYmIGlzTmlsKGdldCh0aGlzLmRhdGFMYW5ndWFnZUNoYW5nZSgpLCBsYW5nKSkpIHtcbiAgICAgICAgICB0aGlzLnNldERlZmF1bHREYXRhKGxhbmcpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWtleSB8fCAhaXNOaWwoZ2V0KHRoaXMuZGF0YUxhbmd1YWdlQ2hhbmdlKCksIGtleSkpKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGF0YUxhbmd1YWdlQ2hhbmdlLnVwZGF0ZSgodmFsdWUpID0+ICh7IC4uLnZhbHVlLCBba2V5XTogeyBbbGFuZ106ICcnIH0gfSkpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGlmICghZGF0YUl0ZW1zLmxlbmd0aCkge1xuICAgICAgaWYgKCF0aGlzLmRhdGFMYW5ndWFnZSgpIHx8ICFPYmplY3Qua2V5cyh0aGlzLmRhdGFMYW5ndWFnZSgpKS5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5zZXREZWZhdWx0RGF0YShsYW5nKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZGF0YS5zZXQoW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogdGhpcy52aWV3VHlwZSgpLFxuICAgICAgICAgIHBsYWNlaG9sZGVyOiB0aGlzLnBsYWNlaG9sZGVyKCksXG4gICAgICAgICAgaXNPbmVWYWx1ZTogZmFsc2UsXG4gICAgICAgICAga2V5QmluZERhdGE6ICcnLFxuICAgICAgICB9LFxuICAgICAgXSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXREZWZhdWx0RGF0YShrZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuZGF0YUxhbmd1YWdlQ2hhbmdlLnVwZGF0ZSgodmFsdWUpID0+ICh7IC4uLnZhbHVlLCBba2V5XTogJycgfSkpO1xuICAgIHRoaXMuZGF0YUxhbmd1YWdlLnVwZGF0ZSgodmFsdWUpID0+ICh7IC4uLnZhbHVlLCBba2V5XTogJycgfSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB2YWxpZGF0ZSgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBsZXQgdmFsaWQgPSB0cnVlO1xuICAgIGZvciAoY29uc3QgY29udHJvbCBvZiB0aGlzLmlucHV0Q29tcG9uZW50UmVmcygpKSB7XG4gICAgICBpZiAoIShhd2FpdCBjb250cm9sLkZ1bmN0aW9uc0NvbnRyb2wuY2hlY2tJc1ZhbGlkKCkpKSB7XG4gICAgICAgIHZhbGlkID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3QgcXVpbGxDbXAgb2YgdGhpcy5xdWlsbENvbXBvbmVudFJlZnMoKSkge1xuICAgICAgaWYgKCEoYXdhaXQgcXVpbGxDbXAuRnVuY3Rpb25zQ29udHJvbC5jaGVja0lzVmFsaWQoKSkpIHtcbiAgICAgICAgdmFsaWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMuc2luZ2xlTGFuZ3VhZ2UoKSkge1xuICAgICAgcmV0dXJuIHZhbGlkO1xuICAgIH1cbiAgICBpZiAodGhpcy5kYXRhKCkubGVuZ3RoID09PSAxKSB7XG4gICAgICBjb25zdCBkZWZhdWx0T2sgPSBhd2FpdCB0aGlzLnZhbGlkYXRlRGVmYXVsdCgpO1xuICAgICAgaWYgKCFkZWZhdWx0T2spIHtcbiAgICAgICAgdmFsaWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgYXdhaXQgdGhpcy52YWxpZGF0ZUlzTXVsdGlLZXkoKTtcbiAgICByZXR1cm4gdmFsaWQ7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHZhbGlkYXRlRGVmYXVsdCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBsZXQgdmFsaWQgPSB0cnVlO1xuICAgIGlmICh0aGlzLnZhbGlkUmVxdWlyZWQoKS5pc1JlcXVpcmVkKSB7XG4gICAgICB0aGlzLnZhbGlkUmVxdWlyZWREZWZhdWx0LnVwZGF0ZSgodmFsdWUpID0+ICh7IC4uLnZhbHVlLCBpc1JlcXVpcmVkOiB0cnVlIH0pKTtcbiAgICAgIGlmICghKGF3YWl0IHRoaXMuY2hlY2tWYWxpZElucHV0KCkpKSB7XG4gICAgICAgIHZhbGlkID0gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsaWQ7XG4gICAgfVxuICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLmRhdGFMYW5ndWFnZUNoYW5nZSgpKS5sZW5ndGggPT09IDEpIHtcbiAgICAgIHRoaXMudmFsaWRSZXF1aXJlZERlZmF1bHQudXBkYXRlKCh2YWx1ZSkgPT4gKHsgLi4udmFsdWUsIGlzUmVxdWlyZWQ6IGZhbHNlIH0pKTtcbiAgICAgIGlmICghKGF3YWl0IHRoaXMuY2hlY2tWYWxpZElucHV0KCkpKSB7XG4gICAgICAgIHZhbGlkID0gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsaWQ7XG4gICAgfVxuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHRoaXMuZGF0YUxhbmd1YWdlQ2hhbmdlKCkpKSB7XG4gICAgICBpZiAoa2V5ICE9PSAnaWQnICYmIGtleSAhPT0gdGhpcy5rZXlIZWFkZXIoKSAmJiBnZXQodGhpcy5kYXRhTGFuZ3VhZ2VDaGFuZ2UoKSwga2V5KSAmJiBrZXkgIT09IHRoaXMubGFuZ0RlZmF1bHQoKVswXSkge1xuICAgICAgICB0aGlzLnZhbGlkUmVxdWlyZWREZWZhdWx0LnVwZGF0ZSgodmFsdWUpID0+ICh7IC4uLnZhbHVlLCBpc1JlcXVpcmVkOiB0cnVlIH0pKTtcbiAgICAgICAgaWYgKCEoYXdhaXQgdGhpcy5jaGVja1ZhbGlkSW5wdXQoKSkpIHtcbiAgICAgICAgICB2YWxpZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWxpZDtcbiAgICAgIH1cbiAgICAgIHRoaXMudmFsaWRSZXF1aXJlZERlZmF1bHQudXBkYXRlKCh2YWx1ZSkgPT4gKHsgLi4udmFsdWUsIGlzUmVxdWlyZWQ6IGZhbHNlIH0pKTtcbiAgICAgIGlmICghKGF3YWl0IHRoaXMuY2hlY2tWYWxpZElucHV0KCkpKSB7XG4gICAgICAgIHZhbGlkID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB2YWxpZDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY2hlY2tWYWxpZElucHV0KCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGxldCB2YWxpZCA9IHRydWU7XG4gICAgZm9yIChjb25zdCBjb250cm9sIG9mIHRoaXMuaW5wdXRDb21wb25lbnRSZWZzKCkpIHtcbiAgICAgIGlmICghKGF3YWl0IGNvbnRyb2wuRnVuY3Rpb25zQ29udHJvbC5jaGVja0lzVmFsaWQoKSkpIHtcbiAgICAgICAgdmFsaWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHZhbGlkO1xuICB9XG5cbiAgLyoqXG4gICAqIEtoaSBjw7Mgbmhp4buBdSBgSURhdGFJdGVtYCAobmhp4buBdSBmaWVsZCBiaW5kKSwgY+G6rXAgbmjhuq10IGB2YWxpZFJlcXVpcmVkTGFuZ0RlZmF1bHRgIHRoZW8gZOG7ryBsaeG7h3UgxJHDoyBuaOG6rXAuXG4gICAqIEdp4buvIG5ndXnDqm4gdGjhu6kgdOG7sSDEkWnhu4F1IGtp4buHbiAvIG5ow6FuaCBuaMawIHBoacOqbiBi4bqjbiB0csaw4bubYyAoZm9yRWFjaCBhc3luYyksIG5oxrBuZyBhd2FpdCDEkcO6bmcgxJHhu4MgdmFsaWRhdGUga2jDtG5nIGvhur90IHRow7pjIHPhu5ttLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB2YWxpZGF0ZUlzTXVsdGlLZXkoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuZGF0YSgpLmxlbmd0aCA8PSAxKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLmRhdGEoKVswXS52YWxpZFJlcXVpcmVkPy5pc1JlcXVpcmVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZGF0YUl0ZW1zID0gdGhpcy5kYXRhKCk7XG4gICAgY29uc3QgZGMgPSB0aGlzLmRhdGFMYW5ndWFnZUNoYW5nZSgpO1xuXG4gICAgZm9yIChjb25zdCBpdGVtIG9mIGRhdGFJdGVtcykge1xuICAgICAgaWYgKCFpdGVtLmtleUJpbmREYXRhKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgbmVzdGVkID0gZ2V0KGRjLCBpdGVtLmtleUJpbmREYXRhKTtcbiAgICAgIGlmICghbmVzdGVkIHx8IHR5cGVvZiBuZXN0ZWQgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBsYW5nS2V5OiBmb3IgKGNvbnN0IGxhbmdOZXN0ZWRLZXkgb2YgT2JqZWN0LmtleXMobmVzdGVkIGFzIG9iamVjdCkpIHtcbiAgICAgICAgZm9yIChjb25zdCB0b3BLZXkgb2YgT2JqZWN0LmtleXMoZGMpKSB7XG4gICAgICAgICAgaWYgKHRvcEtleSA9PT0gaXRlbS5rZXlCaW5kRGF0YSB8fCB0b3BLZXkgPT09IGxhbmdOZXN0ZWRLZXkpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZ2V0KGRjLCB0b3BLZXkpICYmIHRoaXMub3B0aW9ucygpLmZpbmQoKG9wdCkgPT4gb3B0LmtleSA9PT0gdG9wS2V5KSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBjb25maWcgb2YgZGF0YUl0ZW1zKSB7XG4gICAgICAgICAgICAgIGlmIChjb25maWc/LnZhbGlkUmVxdWlyZWRMYW5nRGVmYXVsdCkge1xuICAgICAgICAgICAgICAgIGNvbmZpZy52YWxpZFJlcXVpcmVkTGFuZ0RlZmF1bHQuaXNSZXF1aXJlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jaGVja1ZhbGlkSW5wdXQoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29udGludWUgbGFuZ0tleTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZm9yIChjb25zdCBjb25maWcgb2YgZGF0YUl0ZW1zKSB7XG4gICAgICAgICAgICBpZiAoY29uZmlnPy52YWxpZFJlcXVpcmVkTGFuZ0RlZmF1bHQpIHtcbiAgICAgICAgICAgICAgY29uZmlnLnZhbGlkUmVxdWlyZWRMYW5nRGVmYXVsdC5pc1JlcXVpcmVkID0gZmFsc2U7XG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuY2hlY2tWYWxpZElucHV0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGF0YUxhbmd1YWdlQ2hhbmdlQnlLZXlCaW5kID0gZ2V0KGRjLCBsYW5nTmVzdGVkS2V5KTtcbiAgICAgICAgY29uc3QgZGF0YUJ5SXRlbUtleSA9IGl0ZW0ua2V5QmluZERhdGEgPyBnZXQoZGMsIGl0ZW0ua2V5QmluZERhdGEpIDogdW5kZWZpbmVkO1xuICAgICAgICBpZiAoKCFkYXRhTGFuZ3VhZ2VDaGFuZ2VCeUtleUJpbmQgJiYgIWdldChkYXRhQnlJdGVtS2V5LCBsYW5nTmVzdGVkS2V5KSkgfHwgKGRhdGFMYW5ndWFnZUNoYW5nZUJ5S2V5QmluZCAmJiBnZXQoZGF0YUJ5SXRlbUtleSwgbGFuZ05lc3RlZEtleSkpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFkYXRhTGFuZ3VhZ2VDaGFuZ2VCeUtleUJpbmQpIHtcbiAgICAgICAgICBjb25zdCBkYXRhRmlyc3QgPSBkYXRhSXRlbXNbMF07XG4gICAgICAgICAgaWYgKGRhdGFGaXJzdD8udmFsaWRSZXF1aXJlZExhbmdEZWZhdWx0KSB7XG4gICAgICAgICAgICBkYXRhRmlyc3QudmFsaWRSZXF1aXJlZExhbmdEZWZhdWx0LmlzUmVxdWlyZWQgPSB0cnVlO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5jaGVja1ZhbGlkSW5wdXQoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFnZXQoZGF0YUJ5SXRlbUtleSwgbGFuZ05lc3RlZEtleSkpIHtcbiAgICAgICAgICBjb25zdCBkYXRhU2Vjb25kID0gZGF0YUl0ZW1zWzFdO1xuICAgICAgICAgIGlmIChkYXRhU2Vjb25kPy52YWxpZFJlcXVpcmVkTGFuZ0RlZmF1bHQpIHtcbiAgICAgICAgICAgIGRhdGFTZWNvbmQudmFsaWRSZXF1aXJlZExhbmdEZWZhdWx0LmlzUmVxdWlyZWQgPSB0cnVlO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5jaGVja1ZhbGlkSW5wdXQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlcklucHV0Q2hhbmdlKCk6IHZvaWQge1xuICAgIHRoaXMub3V0Q2hhbmdlVmFsdWVJbnB1dC5lbWl0KCk7XG4gICAgdGltZXIoNTAwKVxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMub25EZXN0cm95KSlcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdm9pZCB0aGlzLnZhbGlkYXRlKCkpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5vbkRlc3Ryb3kubmV4dCgpO1xuICAgIHRoaXMub25EZXN0cm95LmNvbXBsZXRlKCk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJ3LWZ1bGwgZmxleCBmbGV4LWNvbCBnYXAtWzhweF1cIj5cbiAgQGlmICh0aXRsZUZpZWxkKCk7IGFzIHRpdGxlRmllbGQpIHtcbiAgICA8ZGl2IGNsYXNzPVwibGlicy11aS1mb250LWg2bVwiPnt7IHRpdGxlRmllbGQgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgfVxuICA8ZGl2XG4gICAgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC1bOHB4XVwiXG4gICAgW2NsYXNzLmdhcC1bOHB4XV09XCJ2aWV3UG9zaXRpb24oKSA9PT0gJ3JvdydcIlxuICAgIFtjbGFzcy5nYXAtWzE2cHhdXT1cInZpZXdQb3NpdGlvbigpID09PSAnY29sdW1uJ1wiPlxuICAgIEBmb3IgKGtleSBvZiBsYW5ndWFnZURpc3BsYXkoKTsgdHJhY2sga2V5KSB7XG4gICAgICBAaWYgKCF2aWV3Q29udGVudCgpKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGdhcC1bOHB4XSB3LWZ1bGwge3sgZXh0ZW5kQ2xhc3MoKSB9fVwiPlxuICAgICAgICAgIEBpZiAoIXNpbmdsZUxhbmd1YWdlKCkpIHtcbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtZHJvcGRvd25cbiAgICAgICAgICAgICAgICBbbGlzdENvbmZpZ109XCJsaXN0Q29uZmlnSXRlbSgpXCJcbiAgICAgICAgICAgICAgICBbaHR0cFJlcXVlc3REZXRhaWxJdGVtQnlJZF09XCJodHRwUmVxdWVzdERldGFpbCgpXCJcbiAgICAgICAgICAgICAgICBbbGlzdEtleXNEaXNhYmxlXT1cImxhbmd1YWdlRGlzcGxheSgpIHwgTGlic1VpQ29tcG9uZW50c0lucHV0c011bHRpTGFuZ3VhZ2VHZXREaXNhYmxlS2V5UGlwZToga2V5XCJcbiAgICAgICAgICAgICAgICBbcmVhZG9ubHldPVwiJGluZGV4ID09PSAwIHx8IHJlYWRvbmx5KClcIlxuICAgICAgICAgICAgICAgIFtsaXN0S2V5U2VsZWN0ZWRdPVwia2V5XCJcbiAgICAgICAgICAgICAgICBbekluZGV4XT1cInpJbmRleCgpXCJcbiAgICAgICAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cIid3LVsxNTBweF0nXCJcbiAgICAgICAgICAgICAgICBbbGlzdEhpZGRlbklucHV0U2VhcmNoXT1cInRydWVcIlxuICAgICAgICAgICAgICAgIFtsaXN0SGFzQnV0dG9uVW5TZWxlY3RPcHRpb25dPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgIChvdXRTZWxlY3RLZXkpPVwiaGFuZGxlclNlbGVjdENoYW5nZSgkZXZlbnQsIGtleSlcIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfVxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtMSBnYXAtWzEycHhdIHt7IGV4dGVuZENsYXNzQ29udGVudCgpIH19XCI+XG4gICAgICAgICAgICBAZm9yIChpdGVtIG9mIGRhdGEoKTsgdHJhY2sgaXRlbSkge1xuICAgICAgICAgICAgICBAaWYgKGl0ZW0udHlwZSA9PT0gJ2VkaXRvcicpIHtcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy1mdWxsIG1pbi13LTBcIj5cbiAgICAgICAgICAgICAgICAgIEBpZiAoaXRlbS5rZXlCaW5kRGF0YSB8IExpYnNVaUNvbXBvbmVudHNJbnB1dHNNdWx0aUxhbmd1YWdlR2V0SXRlbVBpcGU6IGRhdGFMYW5ndWFnZUNoYW5nZTsgYXMgaXRlbU1hcCkge1xuICAgICAgICAgICAgICAgICAgICBAbGV0IGNvbnN0SHRtbFBsYWNlaG9sZGVyID0gaXRlbS5wbGFjZWhvbGRlciB8fCAnICc7XG4gICAgICAgICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtaW5wdXRzLXF1aWxsMnhcbiAgICAgICAgICAgICAgICAgICAgICBbKGl0ZW0pXT1cIml0ZW1NYXBcIlxuICAgICAgICAgICAgICAgICAgICAgIFtmaWVsZEJpbmRdPVwia2V5XCJcbiAgICAgICAgICAgICAgICAgICAgICBbcmVzaXplXT1cIml0ZW0ucmVzaXplIHx8ICd2ZXJ0aWNhbCdcIlxuICAgICAgICAgICAgICAgICAgICAgIFttaW5IZWlnaHRFZGl0b3JDb250ZW50RGVmYXVsdF09XCJpdGVtLm1pbkhlaWdodEVkaXRvckNvbnRlbnREZWZhdWx0IHx8IDE2MFwiXG4gICAgICAgICAgICAgICAgICAgICAgW21heEhlaWdodEVkaXRvckNvbnRlbnREZWZhdWx0XT1cIml0ZW0ubWF4SGVpZ2h0RWRpdG9yQ29udGVudERlZmF1bHRcIlxuICAgICAgICAgICAgICAgICAgICAgIFtoZWlnaHRFZGl0b3JDb250ZW50RGVmYXVsdF09XCJpdGVtLmhlaWdodEVkaXRvckNvbnRlbnREZWZhdWx0XCJcbiAgICAgICAgICAgICAgICAgICAgICBbdmFsaWRSZXF1aXJlZF09XCIkaW5kZXggPT09IDAgJiYgZGF0YSgpLmxlbmd0aCA8PSAxID8gdmFsaWRSZXF1aXJlZERlZmF1bHQoKSA6IHZhbGlkUmVxdWlyZWQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImNvbnN0SHRtbFBsYWNlaG9sZGVyIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICBbcmVhZG9ubHldPVwicmVhZG9ubHkoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgKG91dEZvY3VzKT1cImhhbmRsZXJJbnB1dENoYW5nZSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAob3V0Q2hhbmdlKT1cImhhbmRsZXJJbnB1dENoYW5nZSgpXCIgLz5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctZnVsbCBtaW4tdy0wIHt7IGl0ZW0uY2xhc3NJbmNsdWRlSW5wdXQgfX1cIj5cbiAgICAgICAgICAgICAgICAgIEBpZiAoaXRlbS5rZXlCaW5kRGF0YSB8IExpYnNVaUNvbXBvbmVudHNJbnB1dHNNdWx0aUxhbmd1YWdlR2V0SXRlbVBpcGU6IGRhdGFMYW5ndWFnZUNoYW5nZTsgYXMgaXRlbU1hcCkge1xuICAgICAgICAgICAgICAgICAgICBAbGV0IGNvbnN0SHRtbFBsYWNlaG9sZGVyID0gaXRlbS5wbGFjZWhvbGRlciB8fCAnICc7XG4gICAgICAgICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtaW5wdXRzLXZhbGlkXG4gICAgICAgICAgICAgICAgICAgICAgW2RhdGFUeXBlXT1cIml0ZW0udHlwZSA9PT0gJ251bWJlcicgPyAnaW50JyA6IGl0ZW0udHlwZSA9PT0gJ3RleHQnID8gJ3N0cmluZycgOiBpdGVtLnR5cGUgPT09ICdiaWdpbnQnID8gJ2JpZ2ludCcgOiAnZmxvYXQnXCJcbiAgICAgICAgICAgICAgICAgICAgICBbKGl0ZW0pXT1cIml0ZW1NYXBcIlxuICAgICAgICAgICAgICAgICAgICAgIFtmaWVsZE5hbWVCaW5kXT1cImtleVwiXG4gICAgICAgICAgICAgICAgICAgICAgW3RhZ0lucHV0XT1cInRleHRBcmVhKCkgPyAndGV4dGFyZWEnIDogJ2lucHV0J1wiXG4gICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImNvbnN0SHRtbFBsYWNlaG9sZGVyIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICBbZW1pdEVtcHR5SW5EYXRhVHlwZU51bWJlcl09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICBbdmFsaWRSZXF1aXJlZF09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkT25lRGVmYXVsdE11bHRpTGFuZ3VhZ2UoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICA/IHsgaXNSZXF1aXJlZDogdmFsaWRPbmVEZWZhdWx0TXVsdGlMYW5ndWFnZSgpID09PSBrZXkgPyB0cnVlIDogZmFsc2UgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICA6ICRpbmRleCA9PT0gMCAmJiBkYXRhKCkubGVuZ3RoIDw9IDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHZhbGlkUmVxdWlyZWREZWZhdWx0KClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICRpbmRleCA9PT0gMCAmJiBkYXRhKCkubGVuZ3RoID4gMSAmJiBpdGVtLnZhbGlkUmVxdWlyZWRMYW5nRGVmYXVsdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBpdGVtLnZhbGlkUmVxdWlyZWRMYW5nRGVmYXVsdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBpdGVtLnZhbGlkUmVxdWlyZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBpdGVtLnZhbGlkUmVxdWlyZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB2YWxpZFJlcXVpcmVkKCkgfHwgeyBpc1JlcXVpcmVkOiBmYWxzZSB9XG4gICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICBbdW5pdHNSaWdodF09XCJjdXJyZW5jeVVuaXRzKClcIlxuICAgICAgICAgICAgICAgICAgICAgIFtrZXlTZWxlY3RlZFVuaXRSaWdodF09XCJrZXlcIlxuICAgICAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCJyZWFkb25seSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICBbc2hvd0NvdW50XT1cImNvdW50Q2hhcmFjdGVycygpXCJcbiAgICAgICAgICAgICAgICAgICAgICBbbWF4TGVuZ3RoXT1cInZhbGlkTWF4TGVuZ3RoKCkubGVuZ3RoID8gdmFsaWRNYXhMZW5ndGgoKS5sZW5ndGggOiB1bmRlZmluZWRcIlxuICAgICAgICAgICAgICAgICAgICAgIFtmaXhlZEZsb2F0XT1cIml0ZW0udHlwZSA9PT0gJ2JpZ2ludCcgPyA0IDogMTRcIlxuICAgICAgICAgICAgICAgICAgICAgIFt2YWxpZE1pbkxlbmd0aF09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkT25lRGVmYXVsdE11bHRpTGFuZ3VhZ2UoKSAmJiB2YWxpZE9uZURlZmF1bHRNdWx0aUxhbmd1YWdlKCkgIT09IGtleSAmJiAhaXRlbU1hcCgpW2tleV1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiB7IGxlbmd0aDogdmFsaWRNaW5MZW5ndGgoKT8ubGVuZ3RoIHx8IC0xLCBtZXNzYWdlOiAnaTE4bl9taW5pbXVtX2xlbmd0aF9udW1iZXInLCBpbnRlcnBvbGF0ZVBhcmFtczogeyBudW1iZXI6IHZhbGlkTWluTGVuZ3RoKCk/Lmxlbmd0aCB9IH1cbiAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgIFt2YWxpZFBhdHRlcm5dPVwidmFsaWRQYXR0ZXJuKClcIlxuICAgICAgICAgICAgICAgICAgICAgIFthY2NlcHROZWdhdGl2ZVZhbHVlXT1cImFjY2VwdE5lZ2F0aXZlVmFsdWUoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlVXBEb3duTnVtYmVyXT1cInZhbHVlVXBEb3duTnVtYmVyKClcIlxuICAgICAgICAgICAgICAgICAgICAgIFttYXhWYWx1ZU51bWJlcl09XCJtYXhWYWx1ZU51bWJlcigpXCJcbiAgICAgICAgICAgICAgICAgICAgICBbb25seUFjY2VwdE5lZ2F0aXZlVmFsdWVdPVwib25seUFjY2VwdE5lZ2F0aXZlVmFsdWUoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgKG91dFZhbHVlQ2hhbmdlKT1cImhhbmRsZXJJbnB1dENoYW5nZSgpXCIgLz5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGlmICghc2luZ2xlTGFuZ3VhZ2UoKSkge1xuICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciB3LVsxNnB4XSBzaHJpbmstMFwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmgtWzMycHhdXT1cImRhdGEoKVswXS50eXBlICE9PSAnZWRpdG9yJ1wiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmgtWzQ0cHhdXT1cImRhdGEoKVswXS50eXBlID09PSAnZWRpdG9yJ1wiPlxuICAgICAgICAgICAgICAgIEBpZiAoJGluZGV4ID4gMCAmJiBkYXRhKCkubGVuZ3RoID09PSAxICYmICFpZ25vcmVSZW1vdmUoKSAmJiAhcmVhZG9ubHkoKSkge1xuICAgICAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICBbdHlwZV09XCInYnV0dG9uLWxpbmstY3VzdG9tJ1wiXG4gICAgICAgICAgICAgICAgICAgIFtidXR0b25DdXN0b21dPVwie1xuICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ1N0ZXBDb2xvcjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogJyM2YTczODMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF9ob3ZlcjogJyNlZTJkNDEnLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF9hY3RpdmU6ICcjZWUyZDQxJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfZGlzYWJsZTogJyM2YTczODMnLFxuICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgcm9vdENvbG9yOiAnIzZhNzM4MycsXG4gICAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgICAgICBbaWNvbk9ubHlUeXBlXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICBbcG9wb3Zlcl09XCJ7IGNvbmZpZzogeyBjb250ZW50OiAnaTE4bl9kZWxldGUnLCB6SW5kZXg6IDEyMDUgfSB9XCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzSWNvbkxlZnRdPVwiJ2xpYnMtdWktaWNvbi1yZW1vdmUnXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCInIXAtMCdcIlxuICAgICAgICAgICAgICAgICAgICAob3V0Q2xpY2spPVwiaGFuZGxlclJlbW92ZUxhbmd1YWdlKCRldmVudCwga2V5KVwiIC8+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIEBpZiAoJGluZGV4ID09PSAwICYmIG9wdGlvbnMoKS5sZW5ndGggIT09IGxhbmd1YWdlRGlzcGxheSgpLmxlbmd0aCAmJiB2aWV3VHlwZSgpICE9PSAnaW50ZWdlcicgJiYgIXJlYWRvbmx5KCkpIHtcbiAgICAgICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1idXR0b25cbiAgICAgICAgICAgICAgICAgICAgW3R5cGVdPVwiJ2J1dHRvbi1saW5rLXRoaXJkJ1wiXG4gICAgICAgICAgICAgICAgICAgIFtpY29uT25seVR5cGVdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzc0ljb25MZWZ0XT1cImNsYXNzSWNvbkFkZExhbmd1YWdlKClcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cIichcC0wJ1wiXG4gICAgICAgICAgICAgICAgICAgIChvdXRDbGljayk9XCJoYW5kbGVyQWRkTGFuZ3VhZ2UoJGV2ZW50KVwiIC8+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgICBAaWYgKHZpZXdDb250ZW50KCkpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZ2FwLVs0cHhdXCI+XG4gICAgICAgICAgQGlmICghc2luZ2xlTGFuZ3VhZ2UoKSkge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXhcIj5cbiAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1wb3BvdmVyXG4gICAgICAgICAgICAgICAgW3R5cGVdPVwiJ3RleHQnXCJcbiAgICAgICAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cImNsYXNzSW5jbHVkZUtleSgpXCJcbiAgICAgICAgICAgICAgICBbaW5uZXJIVE1MXT1cImtleSB8IExpYnNVaUNvbXBvbmVudHNJbnB1dHNNdWx0aUxhbmd1YWdlRGlzcGxheUxhbmd1YWdlUGlwZTogb3B0aW9ucygpXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LTEgbWluLXctMFwiPlxuICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1wb3BvdmVyXG4gICAgICAgICAgICAgIFt0eXBlXT1cIid0ZXh0J1wiXG4gICAgICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiY2xhc3NJbmNsdWRlVmFsdWUoKVwiXG4gICAgICAgICAgICAgIFtpbm5lckhUTUxdPVwiKGRhdGFMYW5ndWFnZUNoYW5nZSgpW2tleV0gfHwgZGF0YUxhbmd1YWdlQ2hhbmdlKClba2V5XSA9PT0gMCA/IGRhdGFMYW5ndWFnZUNoYW5nZSgpW2tleV0gKyAnJyA6ICcnKSB8IExpYnNVaVBpcGVzRXNjYXBlSHRtbFBpcGVcIlxuICAgICAgICAgICAgICBbY29uZmlnXT1cInsgekluZGV4OiB6SW5kZXgoKSB9XCIgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgfVxuICA8L2Rpdj5cbiAgQGlmICh2aWV3VHlwZSgpID09PSAnaW50ZWdlcicgJiYgIXRoaXMuaWdub3JlQWRkKCkgJiYgIXJlYWRvbmx5KCkpIHtcbiAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uXG4gICAgICBbdHlwZV09XCInYnV0dG9uLWxpbmstcHJpbWFyeSdcIlxuICAgICAgW2NsYXNzSWNvbkxlZnRdPVwiJ2xpYnMtdWktaWNvbi1hZGQnXCJcbiAgICAgIFtjbGFzc0xhYmVsXT1cIidsaWJzLXVpLWZvbnQtaDZtaSdcIlxuICAgICAgW2NsYXNzSW5jbHVkZV09XCInIXB4LTAgIXB5LVsycHhdJ1wiXG4gICAgICBbbGFiZWxdPVwiJ2kxOG5fYWRkX25ldydcIlxuICAgICAgKG91dENsaWNrKT1cImhhbmRsZXJBZGRMYW5ndWFnZSgkZXZlbnQpXCIgLz5cbiAgfVxuPC9kaXY+XG4iXX0=
391
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGktbGFuZ3VhZ2UuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL2lucHV0cy9tdWx0aS1sYW5ndWFnZS9zcmMvbXVsdGktbGFuZ3VhZ2UuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL2lucHV0cy9tdWx0aS1sYW5ndWFnZS9zcmMvbXVsdGktbGFuZ3VhZ2UuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsdURBQXVEO0FBQ3ZELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDL0osT0FBTyxFQUFFLHNDQUFzQyxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDNUYsT0FBTyxFQUFrQixpQ0FBaUMsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2pHLE9BQU8sRUFBRSxzQ0FBc0MsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQzVGLE9BQU8sRUFBK0Msb0NBQW9DLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNySSxPQUFPLEVBQUUsZ0NBQWdDLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMvRSxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN2RSxPQUFPLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRWpELE9BQU8sRUFBRSxzREFBc0QsRUFB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QUMzQyxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUM1QixDQUFDO3dHQWhZVSw0Q0FBNEM7NEZBQTVDLDRDQUE0QyxtcUpBVUosb0NBQW9DLHdGQUNwQyxzQ0FBc0MsZ0VDL0MzRix3aVFBNEpBLDJDRHBJSSxlQUFlLDRGQUNmLGlDQUFpQywwNURBQ2pDLG9DQUFvQyxnM0RBQ3BDLHNDQUFzQyxzakJBQ3RDLGdDQUFnQywrZkFDaEMsb0RBQW9ELHdGQUNwRCxzREFBc0QsMEZBQ3RELDhDQUE4QyxrRkFDOUMseUJBQXlCLGtFQUN6QixzQ0FBc0M7OzRGQUc3Qiw0Q0FBNEM7a0JBbkJ4RCxTQUFTOytCQUVFLDBDQUEwQyxjQUV4QyxJQUFJLG1CQUNDLHVCQUF1QixDQUFDLE1BQU0sV0FDdEM7d0JBQ1AsZUFBZTt3QkFDZixpQ0FBaUM7d0JBQ2pDLG9DQUFvQzt3QkFDcEMsc0NBQXNDO3dCQUN0QyxnQ0FBZ0M7d0JBQ2hDLG9EQUFvRDt3QkFDcEQsc0RBQXNEO3dCQUN0RCw4Q0FBOEM7d0JBQzlDLHlCQUF5Qjt3QkFDekIsc0NBQXNDO3FCQUN2QyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbmltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIGNvbXB1dGVkLCBlZmZlY3QsIGlucHV0LCBtb2RlbCwgT25EZXN0cm95LCBPbkluaXQsIG91dHB1dCwgc2lnbmFsLCB1bnRyYWNrZWQsIHZpZXdDaGlsZHJlbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c0J1dHRvbnNCdXR0b25Db21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uJztcbmltcG9ydCB7IElFbWl0U2VsZWN0S2V5LCBMaWJzVWlDb21wb25lbnRzRHJvcGRvd25Db21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWRyb3Bkb3duJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNJbnB1dHNRdWlsbDJ4Q29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1pbnB1dHMtcXVpbGwyeCc7XG5pbXBvcnQgeyBJVmFsaWRMZW5ndGgsIElWYWxpZFBhdHRlcm4sIElWYWxpZFJlcXVpcmVkLCBMaWJzVWlDb21wb25lbnRzSW5wdXRzVmFsaWRDb21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWlucHV0cy12YWxpZCc7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzUG9wb3ZlckNvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtcG9wb3Zlcic7XG5pbXBvcnQgeyBMaWJzVWlQaXBlc0VzY2FwZUh0bWxQaXBlIH0gZnJvbSAnQGxpYnMtdWkvcGlwZXMtZXNjYXBlLWh0bWwnO1xuaW1wb3J0IHsgY2xvbmVEZWVwLCBnZXQsIGlzTmlsIH0gZnJvbSAnQGxpYnMtdWkvdXRpbHMnO1xuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBTdWJqZWN0LCB0YWtlVW50aWwsIHRpbWVyIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBJQ3VycmVuY3lVbml0LCBJRGF0YUl0ZW0sIElEYXRhTXVsdGlMYW5ndWFnZSwgSUV2ZW50TXVsdGlMYW5ndWFnZSwgSUlucHV0TXVsdGlMYW5ndWFnZUZ1bmN0aW9uQ29udHJvbEV2ZW50LCBJT3B0aW9uLCBUWVBFX1ZJRVdfTVVMVElfTEFOR1VBR0UgfSBmcm9tICcuL2ludGVyZmFjZXMvbXVsdGktbGFuZ3VhZ2UuaW50ZXJmYWNlJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNJbnB1dHNNdWx0aUxhbmd1YWdlRGlzcGxheUxhbmd1YWdlUGlwZSB9IGZyb20gJy4vcGlwZXMvZGlzcGxheS1sYW5ndWFnZS5waXBlJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNJbnB1dHNNdWx0aUxhbmd1YWdlR2V0RGlzYWJsZUtleVBpcGUgfSBmcm9tICcuL3BpcGVzL2dldC1kaXNhYmxlLWtleS5waXBlJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNJbnB1dHNNdWx0aUxhbmd1YWdlR2V0SXRlbVBpcGUgfSBmcm9tICcuL3BpcGVzL2dldC1pdGVtLnBpcGUnO1xuaW1wb3J0IHsgY3VycmVuY2llc09wdGlvbnMsIGN1cnJlbmNpZXNTdXBwb3J0LCBodHRwUmVxdWVzdERldGFpbCwgbGFuZ09wdGlvbnMsIGxhbmd1YWdlU3VwcG9ydCwgbGlzdENvbmZpZ0l0ZW0sIHZhbGlkUmVxdWlyZWQgfSBmcm9tICcuL3V0aWxzL211bHRpLWxhbmd1YWdlJztcblxuQENvbXBvbmVudCh7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvY29tcG9uZW50LXNlbGVjdG9yXG4gIHNlbGVjdG9yOiAnbGlic191aS1jb21wb25lbnRzLWlucHV0cy1tdWx0aV9sYW5ndWFnZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9tdWx0aS1sYW5ndWFnZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBpbXBvcnRzOiBbXG4gICAgVHJhbnNsYXRlTW9kdWxlLFxuICAgIExpYnNVaUNvbXBvbmVudHNEcm9wZG93bkNvbXBvbmVudCxcbiAgICBMaWJzVWlDb21wb25lbnRzSW5wdXRzVmFsaWRDb21wb25lbnQsXG4gICAgTGlic1VpQ29tcG9uZW50c0J1dHRvbnNCdXR0b25Db21wb25lbnQsXG4gICAgTGlic1VpQ29tcG9uZW50c1BvcG92ZXJDb21wb25lbnQsXG4gICAgTGlic1VpQ29tcG9uZW50c0lucHV0c011bHRpTGFuZ3VhZ2VHZXREaXNhYmxlS2V5UGlwZSxcbiAgICBMaWJzVWlDb21wb25lbnRzSW5wdXRzTXVsdGlMYW5ndWFnZURpc3BsYXlMYW5ndWFnZVBpcGUsXG4gICAgTGlic1VpQ29tcG9uZW50c0lucHV0c011bHRpTGFuZ3VhZ2VHZXRJdGVtUGlwZSxcbiAgICBMaWJzVWlQaXBlc0VzY2FwZUh0bWxQaXBlLFxuICAgIExpYnNVaUNvbXBvbmVudHNJbnB1dHNRdWlsbDJ4Q29tcG9uZW50LFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBMaWJzVWlDb21wb25lbnRzSW5wdXRzTXVsdGlMYW5ndWFnZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgcHJvdGVjdGVkIGxhbmd1YWdlRGlzcGxheSA9IHNpZ25hbDxBcnJheTxzdHJpbmc+PihbXSk7XG4gIHByb3RlY3RlZCBkYXRhTGFuZ3VhZ2VDaGFuZ2UgPSBzaWduYWw8SURhdGFNdWx0aUxhbmd1YWdlPih7fSk7XG4gIHByb3RlY3RlZCBsYW5nRGVmYXVsdCA9IHNpZ25hbDxBcnJheTxzdHJpbmc+PihsYW5ndWFnZVN1cHBvcnQoKSk7XG4gIHByb3RlY3RlZCBjdXJyZW5jeVVuaXRzID0gc2lnbmFsPEFycmF5PElDdXJyZW5jeVVuaXQ+PihbXSk7XG4gIHByb3RlY3RlZCBvcHRpb25zID0gc2lnbmFsPEFycmF5PElPcHRpb24+PihsYW5nT3B0aW9ucygpKTtcbiAgcHJvdGVjdGVkIHZhbGlkUmVxdWlyZWREZWZhdWx0ID0gc2lnbmFsPElWYWxpZFJlcXVpcmVkPih2YWxpZFJlcXVpcmVkKCkpO1xuICBwcm90ZWN0ZWQgbGlzdENvbmZpZ0l0ZW0gPSBjb21wdXRlZCgoKSA9PiBsaXN0Q29uZmlnSXRlbSh0aGlzLm9wdGlvbnMoKSkpO1xuICBwcm90ZWN0ZWQgaHR0cFJlcXVlc3REZXRhaWwgPSBjb21wdXRlZCgoKSA9PiBodHRwUmVxdWVzdERldGFpbCh0aGlzLm9wdGlvbnMoKSkpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgaW5wdXRDb21wb25lbnRSZWZzID0gdmlld0NoaWxkcmVuKExpYnNVaUNvbXBvbmVudHNJbnB1dHNWYWxpZENvbXBvbmVudCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgcXVpbGxDb21wb25lbnRSZWZzID0gdmlld0NoaWxkcmVuKExpYnNVaUNvbXBvbmVudHNJbnB1dHNRdWlsbDJ4Q29tcG9uZW50KTtcbiAgcHJpdmF0ZSByZWFkb25seSBvbkRlc3Ryb3kgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIHJlYWRvbmx5IG9wdGlvbnNMYW5ndWFnZSA9IGlucHV0PEFycmF5PElPcHRpb24+PihsYW5nT3B0aW9ucygpKTtcbiAgcmVhZG9ubHkgekluZGV4ID0gaW5wdXQ8bnVtYmVyPigpO1xuICByZWFkb25seSB2aWV3VHlwZSA9IGlucHV0PFRZUEVfVklFV19NVUxUSV9MQU5HVUFHRSwgVFlQRV9WSUVXX01VTFRJX0xBTkdVQUdFIHwgdW5kZWZpbmVkPigndGV4dCcsIHsgdHJhbnNmb3JtOiAodmFsdWUpID0+IHZhbHVlID8/ICd0ZXh0JyB9KTtcbiAgcmVhZG9ubHkgc2luZ2xlTGFuZ3VhZ2UgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBkYXRhID0gbW9kZWw8QXJyYXk8SURhdGFJdGVtPj4oW10pO1xuICByZWFkb25seSB2YWxpZFJlcXVpcmVkID0gaW5wdXQ8SVZhbGlkUmVxdWlyZWQsIElWYWxpZFJlcXVpcmVkIHwgdW5kZWZpbmVkPih2YWxpZFJlcXVpcmVkKCksIHsgdHJhbnNmb3JtOiAodmFsdWUpID0+IHZhbHVlID8/IHZhbGlkUmVxdWlyZWQoKSB9KTtcbiAgcmVhZG9ubHkgaWdub3JlQWRkID0gbW9kZWw8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgdGl0bGVGaWVsZCA9IGlucHV0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkga2V5SGVhZGVyID0gaW5wdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSB0ZXh0QXJlYSA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IHBsYWNlaG9sZGVyID0gaW5wdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSBleHRlbmRDbGFzcyA9IG1vZGVsPHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgZXh0ZW5kQ2xhc3NDb250ZW50ID0gaW5wdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSB2aWV3UG9zaXRpb24gPSBpbnB1dDwncm93JyB8ICdjb2x1bW4nPigncm93Jyk7XG4gIHJlYWRvbmx5IGlnbm9yZVJlbW92ZSA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IHZhbGlkTWF4TGVuZ3RoID0gaW5wdXQ8SVZhbGlkTGVuZ3RoLCBJVmFsaWRMZW5ndGggfCB1bmRlZmluZWQ+KHsgbGVuZ3RoOiAwIH0sIHsgdHJhbnNmb3JtOiAodmFsdWUpID0+IHZhbHVlID8/IHsgbGVuZ3RoOiAwIH0gfSk7XG4gIHJlYWRvbmx5IHZhbGlkTWluTGVuZ3RoID0gaW5wdXQ8SVZhbGlkTGVuZ3RoPigpO1xuICByZWFkb25seSBjb3VudENoYXJhY3RlcnMgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSB2aWV3Q29udGVudCA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGNsYXNzSW5jbHVkZUtleSA9IGlucHV0PHN0cmluZz4oJ2xpYnMtdWktZm9udC1oNHInKTtcbiAgcmVhZG9ubHkgY2xhc3NJbmNsdWRlVmFsdWUgPSBpbnB1dDxzdHJpbmc+KCdsaWJzLXVpLWZvbnQtaDRzJyk7XG4gIHJlYWRvbmx5IGRhdGFMYW5ndWFnZSA9IG1vZGVsPElEYXRhTXVsdGlMYW5ndWFnZT4oe30pO1xuICByZWFkb25seSByZWFkb25seSA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGFjY2VwdE5lZ2F0aXZlVmFsdWUgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSB2YWx1ZVVwRG93bk51bWJlciA9IGlucHV0PG51bWJlcj4oKTtcbiAgcmVhZG9ubHkgbWF4VmFsdWVOdW1iZXIgPSBpbnB1dDxudW1iZXI+KCk7XG4gIHJlYWRvbmx5IG9ubHlBY2NlcHROZWdhdGl2ZVZhbHVlID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgdmFsaWRPbmVEZWZhdWx0TXVsdGlMYW5ndWFnZSA9IGlucHV0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgY2xhc3NJY29uQWRkTGFuZ3VhZ2UgPSBpbnB1dDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4oJ2xpYnMtdWktaWNvbi1hZGQnLCB7IHRyYW5zZm9ybTogKHZhbHVlKSA9PiB2YWx1ZSB8fCAnbGlicy11aS1pY29uLWFkZCcgfSk7XG4gIHJlYWRvbmx5IHZhbGlkUGF0dGVybiA9IGlucHV0PEFycmF5PElWYWxpZFBhdHRlcm4+PigpO1xuXG4gIHJlYWRvbmx5IG91dEV2ZW50TXVsdGlMYW5ndWFnZSA9IG91dHB1dDxJRXZlbnRNdWx0aUxhbmd1YWdlPigpO1xuICByZWFkb25seSBvdXRDaGFuZ2VUeXBlTGFuZ3VhZ2UgPSBvdXRwdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgb3V0Q2hhbmdlVmFsdWVJbnB1dCA9IG91dHB1dDx2b2lkPigpO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5vcHRpb25zTGFuZ3VhZ2UoKSkge1xuICAgICAgICB1bnRyYWNrZWQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMub3B0aW9ucy5zZXQodGhpcy5vcHRpb25zTGFuZ3VhZ2UoKSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGNvbnN0IHZpZXdUeXBlID0gdGhpcy52aWV3VHlwZSgpO1xuICAgICAgdW50cmFja2VkKCgpID0+IHtcbiAgICAgICAgaWYgKHZpZXdUeXBlID09PSAnaW50ZWdlcicpIHtcbiAgICAgICAgICB0aGlzLmxhbmdEZWZhdWx0LnNldChjdXJyZW5jaWVzU3VwcG9ydCgpKTtcbiAgICAgICAgICBjb25zdCBvcHRzID0gY3VycmVuY2llc09wdGlvbnMoKTtcbiAgICAgICAgICB0aGlzLm9wdGlvbnMuc2V0KG9wdHMpO1xuICAgICAgICAgIHRoaXMuY3VycmVuY3lVbml0cy5zZXQoXG4gICAgICAgICAgICBvcHRzLm1hcCgoaXRlbSkgPT4gKHtcbiAgICAgICAgICAgICAgbGFiZWw6IGl0ZW0ubGFiZWwsXG4gICAgICAgICAgICAgIGlkOiBpdGVtLmtleSxcbiAgICAgICAgICAgICAgdHlwZTogaXRlbS5sYWJlbCxcbiAgICAgICAgICAgIH0pKVxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubGFuZ0RlZmF1bHQuc2V0KGxhbmd1YWdlU3VwcG9ydCgpKTtcbiAgICAgICAgdGhpcy5vcHRpb25zLnNldCh0aGlzLm9wdGlvbnNMYW5ndWFnZSgpKTtcbiAgICAgICAgdGhpcy5jdXJyZW5jeVVuaXRzLnNldChbXSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICB1bnRyYWNrZWQoKCkgPT4ge1xuICAgICAgICBjb25zdCBkYXRhTGFuZ3VhZ2UgPSB0aGlzLmRhdGFMYW5ndWFnZSgpO1xuICAgICAgICB0aGlzLmRhdGFMYW5ndWFnZUNoYW5nZS5zZXQoY2xvbmVEZWVwKGRhdGFMYW5ndWFnZSkpO1xuICAgICAgICB0aGlzLmdlbmVyYXRlRGF0YSgpO1xuICAgICAgICB0aGlzLmxhbmd1YWdlRGlzcGxheS5zZXQodGhpcy5jb21wdXRlTGFuZ3VhZ2VEaXNwbGF5S2V5cygpKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGNvbnN0IHNpbmdsZUxhbmd1YWdlID0gdGhpcy5zaW5nbGVMYW5ndWFnZSgpO1xuICAgICAgdW50cmFja2VkKCgpID0+IHtcbiAgICAgICAgdGhpcy5vdXRDaGFuZ2VUeXBlTGFuZ3VhZ2UuZW1pdCh0cnVlKTtcbiAgICAgICAgaWYgKCFzaW5nbGVMYW5ndWFnZSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBrZXkgPSB0aGlzLmxhbmdEZWZhdWx0KClbMF07XG4gICAgICAgIHRoaXMuZGF0YUxhbmd1YWdlLnVwZGF0ZSgodmFsdWUpID0+ICh7IC4uLnZhbHVlLCBba2V5XTogZ2V0KHRoaXMuZGF0YUxhbmd1YWdlQ2hhbmdlKCksIGtleSkgfSkpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgY29uc3QgdmFsaWRSZXF1aXJlZElucHV0ID0gdGhpcy52YWxpZFJlcXVpcmVkKCk7XG4gICAgICB1bnRyYWNrZWQoKCkgPT4ge1xuICAgICAgICBpZiAoIXZhbGlkUmVxdWlyZWRJbnB1dCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZhbGlkUmVxdWlyZWREZWZhdWx0LnVwZGF0ZSgodmFsdWUpID0+ICh7IC4uLnZhbHVlLCBpc1JlcXVpcmVkOiB2YWxpZFJlcXVpcmVkSW5wdXQuaXNSZXF1aXJlZCB9KSk7XG4gICAgICAgIGlmICghdmFsaWRSZXF1aXJlZElucHV0LmlzUmVxdWlyZWQpIHtcbiAgICAgICAgICB2b2lkIHRoaXMudmFsaWRhdGUoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmV4dGVuZENsYXNzLnVwZGF0ZSgodmFsdWUpID0+IGAke3ZhbHVlIHx8ICcnfSAke3RoaXMudmlld1Bvc2l0aW9uKCkgPT09ICdyb3cnID8gJ2ZsZXgtcm93JyA6ICdmbGV4LWNvbCd9YCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IEZ1bmN0aW9uc0NvbnRyb2woKTogSUlucHV0TXVsdGlMYW5ndWFnZUZ1bmN0aW9uQ29udHJvbEV2ZW50IHtcbiAgICByZXR1cm4ge1xuICAgICAgY2hlY2tJc1ZhbGlkOiB0aGlzLnZhbGlkYXRlLmJpbmQodGhpcyksXG4gICAgICBnZXREYXRhOiB0aGlzLmdldERhdGEuYmluZCh0aGlzKSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIEPDoWMga2V5IG5nw7RuIG5n4buvIC8gdGnhu4FuIHThu4cgY+G6p24gaGnhu4NuIHRo4buLIHRoZW8gZOG7ryBsaeG7h3UgKyBj4bqldSBow6xuaCBvcHRpb25zLiAqL1xuICBwcml2YXRlIGNvbXB1dGVMYW5ndWFnZURpc3BsYXlLZXlzKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBkYyA9IHRoaXMuZGF0YUxhbmd1YWdlQ2hhbmdlKCk7XG4gICAgY29uc3Qgb3B0cyA9IHRoaXMub3B0aW9ucygpO1xuICAgIGNvbnN0IGxhbmdzID0gdGhpcy5sYW5nRGVmYXVsdCgpO1xuICAgIGNvbnN0IHNlbGVjdGVkID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICBmb3IgKGNvbnN0IGsgb2YgT2JqZWN0LmtleXMoZGMpKSB7XG4gICAgICBpZiAob3B0cy5zb21lKChvKSA9PiBvLmtleSA9PT0gaykpIHtcbiAgICAgICAgc2VsZWN0ZWQuYWRkKGspO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IGsgb2YgbGFuZ3MpIHtcbiAgICAgIGlmICghaXNOaWwoZ2V0KGRjLCBrKSkpIHtcbiAgICAgICAgc2VsZWN0ZWQuYWRkKGspO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gQXJyYXkuZnJvbShzZWxlY3RlZCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlclNlbGVjdENoYW5nZShldmVudDogSUVtaXRTZWxlY3RLZXkgfCB1bmRlZmluZWQsIGtleU9sZDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCFldmVudCB8fCBldmVudC5rZXkgPT09IGtleU9sZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmxhbmd1YWdlRGlzcGxheS51cGRhdGUoKHZhbHVlKSA9PiB2YWx1ZS5tYXAoKGl0ZW0pID0+IChpdGVtID09PSBrZXlPbGQgPyAoZXZlbnQua2V5IGFzIHN0cmluZykgOiBpdGVtKSkpO1xuICAgIGRlbGV0ZSB0aGlzLmRhdGFMYW5ndWFnZUNoYW5nZSgpW2tleU9sZF07XG4gICAgZGVsZXRlIHRoaXMuZGF0YUxhbmd1YWdlKClba2V5T2xkXTtcbiAgICB0aGlzLnNldERlZmF1bHREYXRhKGV2ZW50LmtleSBhcyBzdHJpbmcpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJBZGRMYW5ndWFnZShldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBjb25zdCBsYW5nID0gdGhpcy5vcHRpb25zKCkuZmluZCgoaXRlbSkgPT4gIXRoaXMubGFuZ3VhZ2VEaXNwbGF5KCkuaW5jbHVkZXMoaXRlbS5rZXkpKTtcbiAgICBpZiAoIWxhbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5sYW5ndWFnZURpc3BsYXkudXBkYXRlKCh2YWx1ZSkgPT4gWy4uLnZhbHVlLCBsYW5nLmtleV0pO1xuICAgIHRoaXMuc2V0RGVmYXVsdERhdGEobGFuZy5rZXkpO1xuICAgIGlmICh0aGlzLm9wdGlvbnMoKS5sZW5ndGggPT09IHRoaXMubGFuZ3VhZ2VEaXNwbGF5KCkubGVuZ3RoKSB7XG4gICAgICB0aGlzLmlnbm9yZUFkZC5zZXQodHJ1ZSk7XG4gICAgfVxuICAgIHRoaXMub3V0RXZlbnRNdWx0aUxhbmd1YWdlLmVtaXQoeyBhY3Rpb246ICdhZGQnLCBkYXRhOiB0aGlzLmRhdGFMYW5ndWFnZUNoYW5nZSgpIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJSZW1vdmVMYW5ndWFnZShldmVudDogRXZlbnQsIGtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5pZ25vcmVBZGQuc2V0KGZhbHNlKTtcbiAgICB0aGlzLmRhdGFMYW5ndWFnZUNoYW5nZS51cGRhdGUoKHZhbHVlKSA9PiB7XG4gICAgICBkZWxldGUgdmFsdWVba2V5XTtcbiAgICAgIHJldHVybiB7IC4uLnZhbHVlIH07XG4gICAgfSk7XG4gICAgdGhpcy52YWxpZGF0ZUlzTXVsdGlLZXkoKTtcbiAgICB0aGlzLmxhbmd1YWdlRGlzcGxheS51cGRhdGUoKHZhbHVlKSA9PiB2YWx1ZS5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0gIT09IGtleSkpO1xuICAgIHRoaXMub3V0RXZlbnRNdWx0aUxhbmd1YWdlLmVtaXQoeyBhY3Rpb246ICdyZW1vdmUnLCBkYXRhOiB0aGlzLmRhdGFMYW5ndWFnZUNoYW5nZSgpIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXREYXRhKCk6IElEYXRhTXVsdGlMYW5ndWFnZSB8IElEYXRhTXVsdGlMYW5ndWFnZVtdIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5zaW5nbGVMYW5ndWFnZSgpKSB7XG4gICAgICBjb25zdCBrZXkgPSB0aGlzLmxhbmdEZWZhdWx0KClbMF07XG4gICAgICB0aGlzLmRhdGFMYW5ndWFnZS51cGRhdGUoKHZhbHVlKSA9PiAoeyAuLi52YWx1ZSwgW2tleV06IGdldCh0aGlzLmRhdGFMYW5ndWFnZUNoYW5nZSgpLCBrZXkpIH0pKTtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFMYW5ndWFnZSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5kYXRhKCkubGVuZ3RoID4gMSkge1xuICAgICAgY29uc3QgZGVmYXVsdExhbmcgPSB0aGlzLmxhbmdEZWZhdWx0KClbMF07XG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy5kYXRhKCkpIHtcbiAgICAgICAgY29uc3Qga2V5QmluZCA9IGl0ZW0ua2V5QmluZERhdGE7XG4gICAgICAgIGNvbnN0IGRhdGFCeUtleSA9IGtleUJpbmQgPyBnZXQodGhpcy5kYXRhTGFuZ3VhZ2VDaGFuZ2UoKSwga2V5QmluZCkgOiB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChrZXlCaW5kICYmIGRhdGFCeUtleSAmJiBkZWZhdWx0TGFuZyAmJiAhZ2V0PGFueT4oZGF0YUJ5S2V5LCBkZWZhdWx0TGFuZykgJiYgIWdldCh0aGlzLmRhdGFMYW5ndWFnZUNoYW5nZSgpLCBkZWZhdWx0TGFuZykpIHtcbiAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZGF0YUxhbmd1YWdlQ2hhbmdlKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2VuZXJhdGVEYXRhKCk6IHZvaWQge1xuICAgIGNvbnN0IGxhbmcgPSB0aGlzLmxhbmdEZWZhdWx0KClbMF07XG4gICAgY29uc3QgZGF0YUl0ZW1zID0gdGhpcy5kYXRhKCk7XG4gICAgaWYgKGRhdGFJdGVtcy5sZW5ndGgpIHtcbiAgICAgIGRhdGFJdGVtcy5mb3JFYWNoKChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgICBjb25zdCBrZXkgPSBpdGVtLmtleUJpbmREYXRhO1xuICAgICAgICBpZiAoIWluZGV4ICYmIGlzTmlsKGdldCh0aGlzLmRhdGFMYW5ndWFnZUNoYW5nZSgpLCBsYW5nKSkpIHtcbiAgICAgICAgICB0aGlzLnNldERlZmF1bHREYXRhKGxhbmcpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWtleSB8fCAhaXNOaWwoZ2V0KHRoaXMuZGF0YUxhbmd1YWdlQ2hhbmdlKCksIGtleSkpKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGF0YUxhbmd1YWdlQ2hhbmdlLnVwZGF0ZSgodmFsdWUpID0+ICh7IC4uLnZhbHVlLCBba2V5XTogeyBbbGFuZ106ICcnIH0gfSkpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGlmICghZGF0YUl0ZW1zLmxlbmd0aCkge1xuICAgICAgaWYgKCF0aGlzLmRhdGFMYW5ndWFnZSgpIHx8ICFPYmplY3Qua2V5cyh0aGlzLmRhdGFMYW5ndWFnZSgpKS5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5zZXREZWZhdWx0RGF0YShsYW5nKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZGF0YS5zZXQoW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogdGhpcy52aWV3VHlwZSgpLFxuICAgICAgICAgIHBsYWNlaG9sZGVyOiB0aGlzLnBsYWNlaG9sZGVyKCksXG4gICAgICAgICAgaXNPbmVWYWx1ZTogZmFsc2UsXG4gICAgICAgICAga2V5QmluZERhdGE6ICcnLFxuICAgICAgICB9LFxuICAgICAgXSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXREZWZhdWx0RGF0YShrZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuZGF0YUxhbmd1YWdlQ2hhbmdlLnVwZGF0ZSgodmFsdWUpID0+ICh7IC4uLnZhbHVlLCBba2V5XTogJycgfSkpO1xuICAgIHRoaXMuZGF0YUxhbmd1YWdlLnVwZGF0ZSgodmFsdWUpID0+ICh7IC4uLnZhbHVlLCBba2V5XTogJycgfSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB2YWxpZGF0ZSgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBsZXQgdmFsaWQgPSB0cnVlO1xuICAgIGZvciAoY29uc3QgY29udHJvbCBvZiB0aGlzLmlucHV0Q29tcG9uZW50UmVmcygpKSB7XG4gICAgICBpZiAoIShhd2FpdCBjb250cm9sLkZ1bmN0aW9uc0NvbnRyb2wuY2hlY2tJc1ZhbGlkKCkpKSB7XG4gICAgICAgIHZhbGlkID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3QgcXVpbGxDbXAgb2YgdGhpcy5xdWlsbENvbXBvbmVudFJlZnMoKSkge1xuICAgICAgaWYgKCEoYXdhaXQgcXVpbGxDbXAuRnVuY3Rpb25zQ29udHJvbC5jaGVja0lzVmFsaWQoKSkpIHtcbiAgICAgICAgdmFsaWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMuc2luZ2xlTGFuZ3VhZ2UoKSkge1xuICAgICAgcmV0dXJuIHZhbGlkO1xuICAgIH1cbiAgICBpZiAodGhpcy5kYXRhKCkubGVuZ3RoID09PSAxKSB7XG4gICAgICBjb25zdCBkZWZhdWx0T2sgPSBhd2FpdCB0aGlzLnZhbGlkYXRlRGVmYXVsdCgpO1xuICAgICAgaWYgKCFkZWZhdWx0T2spIHtcbiAgICAgICAgdmFsaWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgYXdhaXQgdGhpcy52YWxpZGF0ZUlzTXVsdGlLZXkoKTtcbiAgICByZXR1cm4gdmFsaWQ7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHZhbGlkYXRlRGVmYXVsdCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBsZXQgdmFsaWQgPSB0cnVlO1xuICAgIGlmICh0aGlzLnZhbGlkUmVxdWlyZWQoKS5pc1JlcXVpcmVkKSB7XG4gICAgICB0aGlzLnZhbGlkUmVxdWlyZWREZWZhdWx0LnVwZGF0ZSgodmFsdWUpID0+ICh7IC4uLnZhbHVlLCBpc1JlcXVpcmVkOiB0cnVlIH0pKTtcbiAgICAgIGlmICghKGF3YWl0IHRoaXMuY2hlY2tWYWxpZElucHV0KCkpKSB7XG4gICAgICAgIHZhbGlkID0gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsaWQ7XG4gICAgfVxuICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLmRhdGFMYW5ndWFnZUNoYW5nZSgpKS5sZW5ndGggPT09IDEpIHtcbiAgICAgIHRoaXMudmFsaWRSZXF1aXJlZERlZmF1bHQudXBkYXRlKCh2YWx1ZSkgPT4gKHsgLi4udmFsdWUsIGlzUmVxdWlyZWQ6IGZhbHNlIH0pKTtcbiAgICAgIGlmICghKGF3YWl0IHRoaXMuY2hlY2tWYWxpZElucHV0KCkpKSB7XG4gICAgICAgIHZhbGlkID0gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsaWQ7XG4gICAgfVxuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHRoaXMuZGF0YUxhbmd1YWdlQ2hhbmdlKCkpKSB7XG4gICAgICBpZiAoa2V5ICE9PSAnaWQnICYmIGtleSAhPT0gdGhpcy5rZXlIZWFkZXIoKSAmJiBnZXQodGhpcy5kYXRhTGFuZ3VhZ2VDaGFuZ2UoKSwga2V5KSAmJiBrZXkgIT09IHRoaXMubGFuZ0RlZmF1bHQoKVswXSkge1xuICAgICAgICB0aGlzLnZhbGlkUmVxdWlyZWREZWZhdWx0LnVwZGF0ZSgodmFsdWUpID0+ICh7IC4uLnZhbHVlLCBpc1JlcXVpcmVkOiB0cnVlIH0pKTtcbiAgICAgICAgaWYgKCEoYXdhaXQgdGhpcy5jaGVja1ZhbGlkSW5wdXQoKSkpIHtcbiAgICAgICAgICB2YWxpZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWxpZDtcbiAgICAgIH1cbiAgICAgIHRoaXMudmFsaWRSZXF1aXJlZERlZmF1bHQudXBkYXRlKCh2YWx1ZSkgPT4gKHsgLi4udmFsdWUsIGlzUmVxdWlyZWQ6IGZhbHNlIH0pKTtcbiAgICAgIGlmICghKGF3YWl0IHRoaXMuY2hlY2tWYWxpZElucHV0KCkpKSB7XG4gICAgICAgIHZhbGlkID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB2YWxpZDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY2hlY2tWYWxpZElucHV0KCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGxldCB2YWxpZCA9IHRydWU7XG4gICAgZm9yIChjb25zdCBjb250cm9sIG9mIHRoaXMuaW5wdXRDb21wb25lbnRSZWZzKCkpIHtcbiAgICAgIGlmICghKGF3YWl0IGNvbnRyb2wuRnVuY3Rpb25zQ29udHJvbC5jaGVja0lzVmFsaWQoKSkpIHtcbiAgICAgICAgdmFsaWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHZhbGlkO1xuICB9XG5cbiAgLyoqXG4gICAqIEtoaSBjw7Mgbmhp4buBdSBgSURhdGFJdGVtYCAobmhp4buBdSBmaWVsZCBiaW5kKSwgY+G6rXAgbmjhuq10IGB2YWxpZFJlcXVpcmVkTGFuZ0RlZmF1bHRgIHRoZW8gZOG7ryBsaeG7h3UgxJHDoyBuaOG6rXAuXG4gICAqIEdp4buvIG5ndXnDqm4gdGjhu6kgdOG7sSDEkWnhu4F1IGtp4buHbiAvIG5ow6FuaCBuaMawIHBoacOqbiBi4bqjbiB0csaw4bubYyAoZm9yRWFjaCBhc3luYyksIG5oxrBuZyBhd2FpdCDEkcO6bmcgxJHhu4MgdmFsaWRhdGUga2jDtG5nIGvhur90IHRow7pjIHPhu5ttLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB2YWxpZGF0ZUlzTXVsdGlLZXkoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuZGF0YSgpLmxlbmd0aCA8PSAxKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLmRhdGEoKVswXS52YWxpZFJlcXVpcmVkPy5pc1JlcXVpcmVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZGF0YUl0ZW1zID0gdGhpcy5kYXRhKCk7XG4gICAgY29uc3QgZGMgPSB0aGlzLmRhdGFMYW5ndWFnZUNoYW5nZSgpO1xuXG4gICAgZm9yIChjb25zdCBpdGVtIG9mIGRhdGFJdGVtcykge1xuICAgICAgaWYgKCFpdGVtLmtleUJpbmREYXRhKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgbmVzdGVkID0gZ2V0KGRjLCBpdGVtLmtleUJpbmREYXRhKTtcbiAgICAgIGlmICghbmVzdGVkIHx8IHR5cGVvZiBuZXN0ZWQgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBsYW5nS2V5OiBmb3IgKGNvbnN0IGxhbmdOZXN0ZWRLZXkgb2YgT2JqZWN0LmtleXMobmVzdGVkIGFzIG9iamVjdCkpIHtcbiAgICAgICAgZm9yIChjb25zdCB0b3BLZXkgb2YgT2JqZWN0LmtleXMoZGMpKSB7XG4gICAgICAgICAgaWYgKHRvcEtleSA9PT0gaXRlbS5rZXlCaW5kRGF0YSB8fCB0b3BLZXkgPT09IGxhbmdOZXN0ZWRLZXkpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZ2V0KGRjLCB0b3BLZXkpICYmIHRoaXMub3B0aW9ucygpLmZpbmQoKG9wdCkgPT4gb3B0LmtleSA9PT0gdG9wS2V5KSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBjb25maWcgb2YgZGF0YUl0ZW1zKSB7XG4gICAgICAgICAgICAgIGlmIChjb25maWc/LnZhbGlkUmVxdWlyZWRMYW5nRGVmYXVsdCkge1xuICAgICAgICAgICAgICAgIGNvbmZpZy52YWxpZFJlcXVpcmVkTGFuZ0RlZmF1bHQuaXNSZXF1aXJlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jaGVja1ZhbGlkSW5wdXQoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29udGludWUgbGFuZ0tleTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZm9yIChjb25zdCBjb25maWcgb2YgZGF0YUl0ZW1zKSB7XG4gICAgICAgICAgICBpZiAoY29uZmlnPy52YWxpZFJlcXVpcmVkTGFuZ0RlZmF1bHQpIHtcbiAgICAgICAgICAgICAgY29uZmlnLnZhbGlkUmVxdWlyZWRMYW5nRGVmYXVsdC5pc1JlcXVpcmVkID0gZmFsc2U7XG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuY2hlY2tWYWxpZElucHV0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGF0YUxhbmd1YWdlQ2hhbmdlQnlLZXlCaW5kID0gZ2V0KGRjLCBsYW5nTmVzdGVkS2V5KTtcbiAgICAgICAgY29uc3QgZGF0YUJ5SXRlbUtleSA9IGl0ZW0ua2V5QmluZERhdGEgPyBnZXQoZGMsIGl0ZW0ua2V5QmluZERhdGEpIDogdW5kZWZpbmVkO1xuICAgICAgICBpZiAoKCFkYXRhTGFuZ3VhZ2VDaGFuZ2VCeUtleUJpbmQgJiYgIWdldChkYXRhQnlJdGVtS2V5LCBsYW5nTmVzdGVkS2V5KSkgfHwgKGRhdGFMYW5ndWFnZUNoYW5nZUJ5S2V5QmluZCAmJiBnZXQoZGF0YUJ5SXRlbUtleSwgbGFuZ05lc3RlZEtleSkpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFkYXRhTGFuZ3VhZ2VDaGFuZ2VCeUtleUJpbmQpIHtcbiAgICAgICAgICBjb25zdCBkYXRhRmlyc3QgPSBkYXRhSXRlbXNbMF07XG4gICAgICAgICAgaWYgKGRhdGFGaXJzdD8udmFsaWRSZXF1aXJlZExhbmdEZWZhdWx0KSB7XG4gICAgICAgICAgICBkYXRhRmlyc3QudmFsaWRSZXF1aXJlZExhbmdEZWZhdWx0LmlzUmVxdWlyZWQgPSB0cnVlO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5jaGVja1ZhbGlkSW5wdXQoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFnZXQoZGF0YUJ5SXRlbUtleSwgbGFuZ05lc3RlZEtleSkpIHtcbiAgICAgICAgICBjb25zdCBkYXRhU2Vjb25kID0gZGF0YUl0ZW1zWzFdO1xuICAgICAgICAgIGlmIChkYXRhU2Vjb25kPy52YWxpZFJlcXVpcmVkTGFuZ0RlZmF1bHQpIHtcbiAgICAgICAgICAgIGRhdGFTZWNvbmQudmFsaWRSZXF1aXJlZExhbmdEZWZhdWx0LmlzUmVxdWlyZWQgPSB0cnVlO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5jaGVja1ZhbGlkSW5wdXQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlcklucHV0Q2hhbmdlKCk6IHZvaWQge1xuICAgIHRoaXMub3V0Q2hhbmdlVmFsdWVJbnB1dC5lbWl0KCk7XG4gICAgdGltZXIoNTAwKVxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMub25EZXN0cm95KSlcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdm9pZCB0aGlzLnZhbGlkYXRlKCkpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5vbkRlc3Ryb3kubmV4dCgpO1xuICAgIHRoaXMub25EZXN0cm95LmNvbXBsZXRlKCk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJ3LWZ1bGwgZmxleCBmbGV4LWNvbCBnYXAtWzhweF1cIj5cbiAgQGlmICh0aXRsZUZpZWxkKCk7IGFzIHRpdGxlRmllbGQpIHtcbiAgICA8ZGl2IGNsYXNzPVwibGlicy11aS1mb250LWg2bVwiPnt7IHRpdGxlRmllbGQgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgfVxuICA8ZGl2XG4gICAgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC1bOHB4XVwiXG4gICAgW2NsYXNzLmdhcC1bOHB4XV09XCJ2aWV3UG9zaXRpb24oKSA9PT0gJ3JvdydcIlxuICAgIFtjbGFzcy5nYXAtWzE2cHhdXT1cInZpZXdQb3NpdGlvbigpID09PSAnY29sdW1uJ1wiPlxuICAgIEBmb3IgKGtleSBvZiBsYW5ndWFnZURpc3BsYXkoKTsgdHJhY2sga2V5KSB7XG4gICAgICBAaWYgKCF2aWV3Q29udGVudCgpKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGdhcC1bOHB4XSB3LWZ1bGwge3sgZXh0ZW5kQ2xhc3MoKSB9fVwiPlxuICAgICAgICAgIEBpZiAoIXNpbmdsZUxhbmd1YWdlKCkpIHtcbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtZHJvcGRvd25cbiAgICAgICAgICAgICAgICBbbGlzdENvbmZpZ109XCJsaXN0Q29uZmlnSXRlbSgpXCJcbiAgICAgICAgICAgICAgICBbaHR0cFJlcXVlc3REZXRhaWxJdGVtQnlJZF09XCJodHRwUmVxdWVzdERldGFpbCgpXCJcbiAgICAgICAgICAgICAgICBbbGlzdEtleXNEaXNhYmxlXT1cImxhbmd1YWdlRGlzcGxheSgpIHwgTGlic1VpQ29tcG9uZW50c0lucHV0c011bHRpTGFuZ3VhZ2VHZXREaXNhYmxlS2V5UGlwZToga2V5XCJcbiAgICAgICAgICAgICAgICBbcmVhZG9ubHldPVwiJGluZGV4ID09PSAwIHx8IHJlYWRvbmx5KClcIlxuICAgICAgICAgICAgICAgIFtsaXN0S2V5U2VsZWN0ZWRdPVwia2V5XCJcbiAgICAgICAgICAgICAgICBbekluZGV4XT1cInpJbmRleCgpXCJcbiAgICAgICAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cIid3LVsxNTBweF0nXCJcbiAgICAgICAgICAgICAgICBbbGlzdEhpZGRlbklucHV0U2VhcmNoXT1cInRydWVcIlxuICAgICAgICAgICAgICAgIFtsaXN0SGFzQnV0dG9uVW5TZWxlY3RPcHRpb25dPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgIChvdXRTZWxlY3RLZXkpPVwiaGFuZGxlclNlbGVjdENoYW5nZSgkZXZlbnQsIGtleSlcIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfVxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtMSBnYXAtWzEycHhdIHt7IGV4dGVuZENsYXNzQ29udGVudCgpIH19XCI+XG4gICAgICAgICAgICBAZm9yIChpdGVtIG9mIGRhdGEoKTsgdHJhY2sgaXRlbSkge1xuICAgICAgICAgICAgICBAaWYgKGl0ZW0udHlwZSA9PT0gJ2VkaXRvcicpIHtcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy1mdWxsIG1pbi13LTBcIj5cbiAgICAgICAgICAgICAgICAgIEBpZiAoaXRlbS5rZXlCaW5kRGF0YSB8IExpYnNVaUNvbXBvbmVudHNJbnB1dHNNdWx0aUxhbmd1YWdlR2V0SXRlbVBpcGU6IGRhdGFMYW5ndWFnZUNoYW5nZTsgYXMgaXRlbU1hcCkge1xuICAgICAgICAgICAgICAgICAgICBAbGV0IGNvbnN0SHRtbFBsYWNlaG9sZGVyID0gaXRlbS5wbGFjZWhvbGRlciB8fCAnICc7XG4gICAgICAgICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtaW5wdXRzLXF1aWxsMnhcbiAgICAgICAgICAgICAgICAgICAgICBbKGl0ZW0pXT1cIml0ZW1NYXBcIlxuICAgICAgICAgICAgICAgICAgICAgIFtmaWVsZEJpbmRdPVwia2V5XCJcbiAgICAgICAgICAgICAgICAgICAgICBbcmVzaXplXT1cIml0ZW0ucmVzaXplIHx8ICd2ZXJ0aWNhbCdcIlxuICAgICAgICAgICAgICAgICAgICAgIFttaW5IZWlnaHRFZGl0b3JDb250ZW50RGVmYXVsdF09XCJpdGVtLm1pbkhlaWdodEVkaXRvckNvbnRlbnREZWZhdWx0IHx8IDE2MFwiXG4gICAgICAgICAgICAgICAgICAgICAgW21heEhlaWdodEVkaXRvckNvbnRlbnREZWZhdWx0XT1cIml0ZW0ubWF4SGVpZ2h0RWRpdG9yQ29udGVudERlZmF1bHRcIlxuICAgICAgICAgICAgICAgICAgICAgIFtoZWlnaHRFZGl0b3JDb250ZW50RGVmYXVsdF09XCJpdGVtLmhlaWdodEVkaXRvckNvbnRlbnREZWZhdWx0XCJcbiAgICAgICAgICAgICAgICAgICAgICBbdmFsaWRSZXF1aXJlZF09XCIkaW5kZXggPT09IDAgJiYgZGF0YSgpLmxlbmd0aCA8PSAxID8gdmFsaWRSZXF1aXJlZERlZmF1bHQoKSA6IHZhbGlkUmVxdWlyZWQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImNvbnN0SHRtbFBsYWNlaG9sZGVyIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICBbcmVhZG9ubHldPVwicmVhZG9ubHkoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgKG91dEZvY3VzKT1cImhhbmRsZXJJbnB1dENoYW5nZSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAob3V0Q2hhbmdlKT1cImhhbmRsZXJJbnB1dENoYW5nZSgpXCIgLz5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctZnVsbCBtaW4tdy0wIHt7IGl0ZW0uY2xhc3NJbmNsdWRlSW5wdXQgfX1cIj5cbiAgICAgICAgICAgICAgICAgIEBpZiAoaXRlbS5rZXlCaW5kRGF0YSB8IExpYnNVaUNvbXBvbmVudHNJbnB1dHNNdWx0aUxhbmd1YWdlR2V0SXRlbVBpcGU6IGRhdGFMYW5ndWFnZUNoYW5nZTsgYXMgaXRlbU1hcCkge1xuICAgICAgICAgICAgICAgICAgICBAbGV0IGNvbnN0SHRtbFBsYWNlaG9sZGVyID0gaXRlbS5wbGFjZWhvbGRlciB8fCAnICc7XG4gICAgICAgICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtaW5wdXRzLXZhbGlkXG4gICAgICAgICAgICAgICAgICAgICAgW2RhdGFUeXBlXT1cIml0ZW0udHlwZSA9PT0gJ251bWJlcicgPyAnaW50JyA6IGl0ZW0udHlwZSA9PT0gJ3RleHQnID8gJ3N0cmluZycgOiBpdGVtLnR5cGUgPT09ICdiaWdpbnQnID8gJ2JpZ2ludCcgOiAnZmxvYXQnXCJcbiAgICAgICAgICAgICAgICAgICAgICBbKGl0ZW0pXT1cIml0ZW1NYXBcIlxuICAgICAgICAgICAgICAgICAgICAgIFtmaWVsZE5hbWVCaW5kXT1cImtleVwiXG4gICAgICAgICAgICAgICAgICAgICAgW3RhZ0lucHV0XT1cInRleHRBcmVhKCkgPyAndGV4dGFyZWEnIDogJ2lucHV0J1wiXG4gICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImNvbnN0SHRtbFBsYWNlaG9sZGVyIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICBbZW1pdEVtcHR5SW5EYXRhVHlwZU51bWJlcl09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICBbdmFsaWRSZXF1aXJlZF09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkT25lRGVmYXVsdE11bHRpTGFuZ3VhZ2UoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICA/IHsgaXNSZXF1aXJlZDogdmFsaWRPbmVEZWZhdWx0TXVsdGlMYW5ndWFnZSgpID09PSBrZXkgPyB0cnVlIDogZmFsc2UgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICA6ICRpbmRleCA9PT0gMCAmJiBkYXRhKCkubGVuZ3RoIDw9IDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHZhbGlkUmVxdWlyZWREZWZhdWx0KClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICRpbmRleCA9PT0gMCAmJiBkYXRhKCkubGVuZ3RoID4gMSAmJiBpdGVtLnZhbGlkUmVxdWlyZWRMYW5nRGVmYXVsdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBpdGVtLnZhbGlkUmVxdWlyZWRMYW5nRGVmYXVsdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBpdGVtLnZhbGlkUmVxdWlyZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBpdGVtLnZhbGlkUmVxdWlyZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB2YWxpZFJlcXVpcmVkKCkgfHwgeyBpc1JlcXVpcmVkOiBmYWxzZSB9XG4gICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICBbdW5pdHNSaWdodF09XCJjdXJyZW5jeVVuaXRzKClcIlxuICAgICAgICAgICAgICAgICAgICAgIFtrZXlTZWxlY3RlZFVuaXRSaWdodF09XCJrZXlcIlxuICAgICAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCJyZWFkb25seSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICBbc2hvd0NvdW50XT1cImNvdW50Q2hhcmFjdGVycygpXCJcbiAgICAgICAgICAgICAgICAgICAgICBbbWF4TGVuZ3RoXT1cInZhbGlkTWF4TGVuZ3RoKCkubGVuZ3RoID8gdmFsaWRNYXhMZW5ndGgoKS5sZW5ndGggOiB1bmRlZmluZWRcIlxuICAgICAgICAgICAgICAgICAgICAgIFtmaXhlZEZsb2F0XT1cIml0ZW0udHlwZSA9PT0gJ2JpZ2ludCcgPyA0IDogMTRcIlxuICAgICAgICAgICAgICAgICAgICAgIFt2YWxpZE1pbkxlbmd0aF09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkT25lRGVmYXVsdE11bHRpTGFuZ3VhZ2UoKSAmJiB2YWxpZE9uZURlZmF1bHRNdWx0aUxhbmd1YWdlKCkgIT09IGtleSAmJiAhaXRlbU1hcCgpW2tleV1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiB7IGxlbmd0aDogdmFsaWRNaW5MZW5ndGgoKT8ubGVuZ3RoIHx8IC0xLCBtZXNzYWdlOiAnaTE4bl9taW5pbXVtX2xlbmd0aF9udW1iZXInLCBpbnRlcnBvbGF0ZVBhcmFtczogeyBudW1iZXI6IHZhbGlkTWluTGVuZ3RoKCk/Lmxlbmd0aCB9IH1cbiAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgIFt2YWxpZFBhdHRlcm5dPVwidmFsaWRQYXR0ZXJuKClcIlxuICAgICAgICAgICAgICAgICAgICAgIFthY2NlcHROZWdhdGl2ZVZhbHVlXT1cImFjY2VwdE5lZ2F0aXZlVmFsdWUoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlVXBEb3duTnVtYmVyXT1cInZhbHVlVXBEb3duTnVtYmVyKClcIlxuICAgICAgICAgICAgICAgICAgICAgIFttYXhWYWx1ZU51bWJlcl09XCJtYXhWYWx1ZU51bWJlcigpXCJcbiAgICAgICAgICAgICAgICAgICAgICBbb25seUFjY2VwdE5lZ2F0aXZlVmFsdWVdPVwib25seUFjY2VwdE5lZ2F0aXZlVmFsdWUoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgKG91dFZhbHVlQ2hhbmdlKT1cImhhbmRsZXJJbnB1dENoYW5nZSgpXCIgLz5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGlmICghc2luZ2xlTGFuZ3VhZ2UoKSkge1xuICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciB3LVsxNnB4XSBzaHJpbmstMFwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmgtWzMycHhdXT1cImRhdGEoKVswXS50eXBlICE9PSAnZWRpdG9yJ1wiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmgtWzQ0cHhdXT1cImRhdGEoKVswXS50eXBlID09PSAnZWRpdG9yJ1wiPlxuICAgICAgICAgICAgICAgIEBpZiAoJGluZGV4ID4gMCAmJiBkYXRhKCkubGVuZ3RoID09PSAxICYmICFpZ25vcmVSZW1vdmUoKSAmJiAhcmVhZG9ubHkoKSkge1xuICAgICAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICBbdHlwZV09XCInYnV0dG9uLWxpbmstY3VzdG9tJ1wiXG4gICAgICAgICAgICAgICAgICAgIFtidXR0b25DdXN0b21dPVwie1xuICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ1N0ZXBDb2xvcjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogJyM2YTczODMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF9ob3ZlcjogJyNlZTJkNDEnLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF9hY3RpdmU6ICcjZWUyZDQxJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfZGlzYWJsZTogJyM2YTczODMnLFxuICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgcm9vdENvbG9yOiAnIzZhNzM4MycsXG4gICAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgICAgICBbaWNvbk9ubHlUeXBlXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICBbcG9wb3Zlcl09XCJ7IGNvbmZpZzogeyBjb250ZW50OiAnaTE4bl9kZWxldGUnLCB6SW5kZXg6IDEyMDUgfSB9XCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzSWNvbkxlZnRdPVwiJ2xpYnMtdWktaWNvbi1yZW1vdmUnXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCInIXAtMCdcIlxuICAgICAgICAgICAgICAgICAgICAob3V0Q2xpY2spPVwiaGFuZGxlclJlbW92ZUxhbmd1YWdlKCRldmVudCwga2V5KVwiIC8+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIEBpZiAoJGluZGV4ID09PSAwICYmIG9wdGlvbnMoKS5sZW5ndGggIT09IGxhbmd1YWdlRGlzcGxheSgpLmxlbmd0aCAmJiB2aWV3VHlwZSgpICE9PSAnaW50ZWdlcicgJiYgIXJlYWRvbmx5KCkpIHtcbiAgICAgICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1idXR0b25cbiAgICAgICAgICAgICAgICAgICAgW3R5cGVdPVwiJ2J1dHRvbi1saW5rLXRoaXJkJ1wiXG4gICAgICAgICAgICAgICAgICAgIFtpY29uT25seVR5cGVdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzc0ljb25MZWZ0XT1cImNsYXNzSWNvbkFkZExhbmd1YWdlKClcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cIichcC0wJ1wiXG4gICAgICAgICAgICAgICAgICAgIChvdXRDbGljayk9XCJoYW5kbGVyQWRkTGFuZ3VhZ2UoJGV2ZW50KVwiIC8+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgICBAaWYgKHZpZXdDb250ZW50KCkpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZ2FwLVs0cHhdXCI+XG4gICAgICAgICAgQGlmICghc2luZ2xlTGFuZ3VhZ2UoKSkge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXhcIj5cbiAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1wb3BvdmVyXG4gICAgICAgICAgICAgICAgW3R5cGVdPVwiJ3RleHQnXCJcbiAgICAgICAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cImNsYXNzSW5jbHVkZUtleSgpXCJcbiAgICAgICAgICAgICAgICBbaW5uZXJIVE1MXT1cImtleSB8IExpYnNVaUNvbXBvbmVudHNJbnB1dHNNdWx0aUxhbmd1YWdlRGlzcGxheUxhbmd1YWdlUGlwZTogb3B0aW9ucygpXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LTEgbWluLXctMFwiPlxuICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1wb3BvdmVyXG4gICAgICAgICAgICAgIFt0eXBlXT1cIid0ZXh0J1wiXG4gICAgICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiY2xhc3NJbmNsdWRlVmFsdWUoKVwiXG4gICAgICAgICAgICAgIFtpbm5lckhUTUxdPVwiKGRhdGFMYW5ndWFnZUNoYW5nZSgpW2tleV0gfHwgZGF0YUxhbmd1YWdlQ2hhbmdlKClba2V5XSA9PT0gMCA/IGRhdGFMYW5ndWFnZUNoYW5nZSgpW2tleV0gKyAnJyA6ICcnKSB8IExpYnNVaVBpcGVzRXNjYXBlSHRtbFBpcGVcIlxuICAgICAgICAgICAgICBbY29uZmlnXT1cInsgekluZGV4OiB6SW5kZXgoKSB9XCIgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgfVxuICA8L2Rpdj5cbiAgQGlmICh2aWV3VHlwZSgpID09PSAnaW50ZWdlcicgJiYgIXRoaXMuaWdub3JlQWRkKCkgJiYgIXJlYWRvbmx5KCkpIHtcbiAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uXG4gICAgICBbdHlwZV09XCInYnV0dG9uLWxpbmstcHJpbWFyeSdcIlxuICAgICAgW2NsYXNzSWNvbkxlZnRdPVwiJ2xpYnMtdWktaWNvbi1hZGQnXCJcbiAgICAgIFtjbGFzc0xhYmVsXT1cIidsaWJzLXVpLWZvbnQtaDZtaSdcIlxuICAgICAgW2NsYXNzSW5jbHVkZV09XCInIXB4LTAgIXB5LVsycHhdJ1wiXG4gICAgICBbbGFiZWxdPVwiJ2kxOG5fYWRkX25ldydcIlxuICAgICAgKG91dENsaWNrKT1cImhhbmRsZXJBZGRMYW5ndWFnZSgkZXZlbnQpXCIgLz5cbiAgfVxuPC9kaXY+XG4iXX0=
@@ -833,7 +833,7 @@ class LibsUiComponentsInputsMultiLanguageComponent {
833
833
  this.onDestroy.complete();
834
834
  }
835
835
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiComponentsInputsMultiLanguageComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
836
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: LibsUiComponentsInputsMultiLanguageComponent, isStandalone: true, selector: "libs_ui-components-inputs-multi_language", inputs: { optionsLanguage: { classPropertyName: "optionsLanguage", publicName: "optionsLanguage", isSignal: true, isRequired: false, transformFunction: null }, zIndex: { classPropertyName: "zIndex", publicName: "zIndex", isSignal: true, isRequired: false, transformFunction: null }, viewType: { classPropertyName: "viewType", publicName: "viewType", isSignal: true, isRequired: false, transformFunction: null }, singleLanguage: { classPropertyName: "singleLanguage", publicName: "singleLanguage", isSignal: true, isRequired: false, transformFunction: null }, data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: false, transformFunction: null }, validRequired: { classPropertyName: "validRequired", publicName: "validRequired", isSignal: true, isRequired: false, transformFunction: null }, ignoreAdd: { classPropertyName: "ignoreAdd", publicName: "ignoreAdd", isSignal: true, isRequired: false, transformFunction: null }, titleField: { classPropertyName: "titleField", publicName: "titleField", isSignal: true, isRequired: false, transformFunction: null }, keyHeader: { classPropertyName: "keyHeader", publicName: "keyHeader", isSignal: true, isRequired: false, transformFunction: null }, textArea: { classPropertyName: "textArea", publicName: "textArea", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, extendClass: { classPropertyName: "extendClass", publicName: "extendClass", isSignal: true, isRequired: false, transformFunction: null }, extendClassContent: { classPropertyName: "extendClassContent", publicName: "extendClassContent", isSignal: true, isRequired: false, transformFunction: null }, viewPosition: { classPropertyName: "viewPosition", publicName: "viewPosition", isSignal: true, isRequired: false, transformFunction: null }, ignoreRemove: { classPropertyName: "ignoreRemove", publicName: "ignoreRemove", isSignal: true, isRequired: false, transformFunction: null }, validMaxLength: { classPropertyName: "validMaxLength", publicName: "validMaxLength", isSignal: true, isRequired: false, transformFunction: null }, validMinLength: { classPropertyName: "validMinLength", publicName: "validMinLength", isSignal: true, isRequired: false, transformFunction: null }, countCharacters: { classPropertyName: "countCharacters", publicName: "countCharacters", isSignal: true, isRequired: false, transformFunction: null }, viewContent: { classPropertyName: "viewContent", publicName: "viewContent", isSignal: true, isRequired: false, transformFunction: null }, classIncludeKey: { classPropertyName: "classIncludeKey", publicName: "classIncludeKey", isSignal: true, isRequired: false, transformFunction: null }, classIncludeValue: { classPropertyName: "classIncludeValue", publicName: "classIncludeValue", isSignal: true, isRequired: false, transformFunction: null }, dataLanguage: { classPropertyName: "dataLanguage", publicName: "dataLanguage", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, acceptNegativeValue: { classPropertyName: "acceptNegativeValue", publicName: "acceptNegativeValue", isSignal: true, isRequired: false, transformFunction: null }, valueUpDownNumber: { classPropertyName: "valueUpDownNumber", publicName: "valueUpDownNumber", isSignal: true, isRequired: false, transformFunction: null }, maxValueNumber: { classPropertyName: "maxValueNumber", publicName: "maxValueNumber", isSignal: true, isRequired: false, transformFunction: null }, onlyAcceptNegativeValue: { classPropertyName: "onlyAcceptNegativeValue", publicName: "onlyAcceptNegativeValue", isSignal: true, isRequired: false, transformFunction: null }, validOneDefaultMultiLanguage: { classPropertyName: "validOneDefaultMultiLanguage", publicName: "validOneDefaultMultiLanguage", isSignal: true, isRequired: false, transformFunction: null }, classIconAddLanguage: { classPropertyName: "classIconAddLanguage", publicName: "classIconAddLanguage", isSignal: true, isRequired: false, transformFunction: null }, validPattern: { classPropertyName: "validPattern", publicName: "validPattern", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { data: "dataChange", ignoreAdd: "ignoreAddChange", extendClass: "extendClassChange", dataLanguage: "dataLanguageChange", outEventMultiLanguage: "outEventMultiLanguage", outChangeTypeLanguage: "outChangeTypeLanguage", outChangeValueInput: "outChangeValueInput" }, viewQueries: [{ propertyName: "inputComponentRefs", predicate: LibsUiComponentsInputsValidComponent, descendants: true, isSignal: true }, { propertyName: "quillComponentRefs", predicate: LibsUiComponentsInputsQuill2xComponent, descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"w-full flex flex-col gap-[8px]\">\n @if (titleField(); as titleField) {\n <div class=\"libs-ui-font-h6m\">{{ titleField | translate }}</div>\n }\n <div\n class=\"flex flex-col gap-[8px]\"\n [class.gap-[8px]]=\"viewPosition() === 'row'\"\n [class.gap-[16px]]=\"viewPosition() === 'column'\">\n @for (key of languageDisplay(); track key) {\n @if (!viewContent()) {\n <div class=\"flex gap-[8px] w-full {{ extendClass() }}\">\n @if (!singleLanguage()) {\n <div>\n <libs_ui-components-dropdown\n [listConfig]=\"listConfigItem()\"\n [httpRequestDetailItemById]=\"httpRequestDetail()\"\n [listKeysDisable]=\"languageDisplay() | LibsUiComponentsInputsMultiLanguageGetDisableKeyPipe: key\"\n [readonly]=\"$index === 0 || readonly()\"\n [listKeySelected]=\"key\"\n [zIndex]=\"zIndex()\"\n [classInclude]=\"'w-[150px]'\"\n [listHiddenInputSearch]=\"true\"\n [listHasButtonUnSelectOption]=\"false\"\n (outSelectKey)=\"handlerSelectChange($event, key)\" />\n </div>\n }\n <div class=\"flex flex-1 gap-[12px] {{ extendClassContent() }}\">\n @for (item of data(); track item) {\n @if (item.type === 'editor') {\n <div class=\"w-full min-w-0\">\n @if (item.keyBindData | LibsUiComponentsInputsMultiLanguageGetItemPipe: dataLanguageChange; as itemMap) {\n @let constHtmlPlaceholder = item.placeholder || ' ';\n <libs_ui-components-inputs-quill2x\n [(item)]=\"itemMap\"\n [fieldBind]=\"key\"\n [resize]=\"item.resize || 'vertical'\"\n [minHeightEditorContentDefault]=\"item.minHeightEditorContentDefault || 160\"\n [maxHeightEditorContentDefault]=\"item.maxHeightEditorContentDefault\"\n [heightEditorContentDefault]=\"item.heightEditorContentDefault\"\n [validRequired]=\"$index === 0 && data().length <= 1 ? validRequiredDefault() : validRequired()\"\n [placeholder]=\"constHtmlPlaceholder | translate\"\n [readonly]=\"readonly()\"\n (outFocus)=\"handlerInputChange()\"\n (outChange)=\"handlerInputChange()\" />\n }\n </div>\n } @else {\n <div class=\"w-full min-w-0 {{ item.classIncludeInput }}\">\n @if (item.keyBindData | LibsUiComponentsInputsMultiLanguageGetItemPipe: dataLanguageChange; as itemMap) {\n @let constHtmlPlaceholder = item.placeholder || ' ';\n <libs_ui-components-inputs-valid\n [dataType]=\"item.type === 'number' ? 'int' : item.type === 'text' ? 'string' : item.type === 'bigint' ? 'bigint' : 'float'\"\n [(item)]=\"itemMap\"\n [fieldNameBind]=\"key\"\n [tagInput]=\"textArea() ? 'textarea' : 'input'\"\n [placeholder]=\"constHtmlPlaceholder | translate\"\n [emitEmptyInDataTypeNumber]=\"true\"\n [validRequired]=\"\n validOneDefaultMultiLanguage()\n ? { isRequired: validOneDefaultMultiLanguage() === key ? true : false }\n : $index === 0 && data().length <= 1\n ? validRequiredDefault()\n : $index === 0 && data().length > 1 && item.validRequiredLangDefault\n ? item.validRequiredLangDefault\n : item.validRequired\n ? item.validRequired\n : validRequired() || { isRequired: false }\n \"\n [unitsRight]=\"currencyUnits()\"\n [keySelectedUnitRight]=\"key\"\n [readonly]=\"readonly()\"\n [showCount]=\"countCharacters()\"\n [maxLength]=\"validMaxLength().length ? validMaxLength().length : undefined\"\n [fixedFloat]=\"item.type === 'bigint' ? 4 : 14\"\n [validMinLength]=\"\n validOneDefaultMultiLanguage() && validOneDefaultMultiLanguage() !== key && !itemMap()[key]\n ? undefined\n : { length: validMinLength()?.length || -1, message: 'i18n_minimum_length_number', interpolateParams: { number: validMinLength()?.length } }\n \"\n [validPattern]=\"validPattern()\"\n [acceptNegativeValue]=\"acceptNegativeValue()\"\n [valueUpDownNumber]=\"valueUpDownNumber()\"\n [maxValueNumber]=\"maxValueNumber()\"\n [onlyAcceptNegativeValue]=\"onlyAcceptNegativeValue()\"\n (outValueChange)=\"handlerInputChange()\" />\n }\n </div>\n }\n }\n @if (!singleLanguage()) {\n <div\n class=\"flex items-center w-[16px] shrink-0\"\n [class.h-[32px]]=\"data()[0].type !== 'editor'\"\n [class.h-[44px]]=\"data()[0].type === 'editor'\">\n @if ($index > 0 && data().length === 1 && !ignoreRemove() && !readonly()) {\n <libs_ui-components-buttons-button\n [type]=\"'button-link-custom'\"\n [buttonCustom]=\"{\n configStepColor: {\n text: '#6a7383',\n text_hover: '#ee2d41',\n text_active: '#ee2d41',\n text_disable: '#6a7383',\n },\n rootColor: '#6a7383',\n }\"\n [iconOnlyType]=\"true\"\n [popover]=\"{ config: { content: 'i18n_delete', zIndex: 1205 } }\"\n [classIconLeft]=\"'libs-ui-icon-remove'\"\n [classInclude]=\"'!p-0'\"\n (outClick)=\"handlerRemoveLanguage($event, key)\" />\n }\n @if ($index === 0 && options().length !== languageDisplay().length && viewType() !== 'integer' && !readonly()) {\n <libs_ui-components-buttons-button\n [type]=\"'button-link-third'\"\n [iconOnlyType]=\"true\"\n [classIconLeft]=\"classIconAddLanguage()\"\n [classInclude]=\"'!p-0'\"\n (outClick)=\"handlerAddLanguage($event)\" />\n }\n </div>\n }\n </div>\n </div>\n }\n @if (viewContent()) {\n <div class=\"flex gap-[4px]\">\n @if (!singleLanguage()) {\n <div class=\"flex\">\n <libs_ui-components-popover\n [type]=\"'text'\"\n [classInclude]=\"classIncludeKey()\"\n [innerHTML]=\"key | LibsUiComponentsInputsMultiLanguageDisplayLanguagePipe: options()\" />\n </div>\n }\n <div class=\"flex flex-1 min-w-0\">\n <libs_ui-components-popover\n [type]=\"'text'\"\n [classInclude]=\"classIncludeValue()\"\n [innerHTML]=\"(dataLanguageChange()[key] || dataLanguageChange()[key] === 0 ? dataLanguageChange()[key] + '' : '') | LibsUiPipesEscapeHtmlPipe\"\n [config]=\"{ zIndex: zIndex() }\" />\n </div>\n </div>\n }\n }\n </div>\n @if (viewType() === 'integer' && !this.ignoreAdd() && !readonly()) {\n <libs_ui-components-buttons-button\n [type]=\"'button-link-primary'\"\n [classIconLeft]=\"'libs-ui-icon-add'\"\n [classLabel]=\"'libs-ui-font-h6mi'\"\n [classInclude]=\"'!px-0 !py-[2px]'\"\n [label]=\"'i18n_add_new'\"\n (outClick)=\"handlerAddLanguage($event)\" />\n }\n</div>\n", dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { 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: LibsUiComponentsInputsValidComponent, selector: "libs_ui-components-inputs-valid", inputs: ["item", "labelConfig", "emitEmptyInDataTypeNumber", "ignoreBlockInputMaxValue", "fieldNameBind", "showCount", "typeComponentSelectItem", "valueComponentSelectItem", "disableComponentSelectItem", "tagInput", "dataType", "typeInput", "modeInput", "resetAutoCompletePassword", "textAreaEnterNotNewLine", "fixedFloat", "acceptNegativeValue", "valueUpDownNumber", "ignoreWidthInput100", "classIncludeInput", "classContainerInput", "readonly", "disable", "noBorder", "backgroundNone", "useColorModeExist", "placeholder", "keepPlaceholderOnly", "classContainerBottomInput", "autoRemoveEmoji", "defaultHeight", "maxHeightTextArea", "minHeightTextArea", "ignoreShowError", "ignoreShowMessageError", "borderError", "iconLeftClass", "popoverContentIconLeft", "iconRightClass", "popoverContentIconRight", "zIndexPopoverContent", "unitsLeft", "configUnitLeft", "keySelectedUnitLeft", "unitsRight", "configUnitRight", "keySelectedUnitRight", "maxValueNumber", "minValueNumber", "ignoreContentLeft", "ignoreContentRight", "isBaselineStyle", "valuePatternShowError", "validPattern", "validRequired", "validMinLength", "validMinValue", "validMaxValue", "validMaxLength", "functionValid", "maxLength", "positionMessageErrorStartInput", "classInclude", "resize", "templateLeftBottomInput", "templateRightBottomInput", "onlyAcceptNegativeValue", "autoAddZeroLessThan10InTypeInt", "maxLengthNumberCount", "classMessageErrorInclude", "ignoreStopPropagationEvent", "ignoreUnitRightClassReadOnly", "paddingRightCustomSpecific", "focusTimeOut", "debounceTimeValidate"], outputs: ["itemChange", "outValueChange", "outSelect", "outIconLeft", "outIconRight", "outClickButtonLabel", "outSwitchEventLabel", "outLabelRightClick", "outEnterInputEvent", "outHeightAreaChange", "outFunctionsControl", "outFocusAndBlur", "outChangeValueByButtonUpDown"] }, { 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: 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: "pipe", type: LibsUiComponentsInputsMultiLanguageGetDisableKeyPipe, name: "LibsUiComponentsInputsMultiLanguageGetDisableKeyPipe" }, { kind: "pipe", type: LibsUiComponentsInputsMultiLanguageDisplayLanguagePipe, name: "LibsUiComponentsInputsMultiLanguageDisplayLanguagePipe" }, { kind: "pipe", type: LibsUiComponentsInputsMultiLanguageGetItemPipe, name: "LibsUiComponentsInputsMultiLanguageGetItemPipe" }, { kind: "pipe", type: LibsUiPipesEscapeHtmlPipe, name: "LibsUiPipesEscapeHtmlPipe" }, { kind: "component", type: LibsUiComponentsInputsQuill2xComponent, selector: "libs_ui-components-inputs-quill2x", inputs: ["uploadImageConfig", "displayToolbar", "placeholder", "blotsRegister", "readonly", "quillCustomConfig", "label", "item", "fieldBind", "dataConfigMention", "templateToolBarPersonalize", "mentionListTemplate", "zIndex", "ignoreShowPopupEditLink", "ignoreCommunicateMicroEventPopup", "handlersExpand", "resizeImagePlugin", "customStylesConvertInline", "fontSizeDefault", "heightEditorContentDefault", "minHeightEditorContentDefault", "maxHeightEditorContentDefault", "removeNearWhiteColorsOnPaste", "resize", "autoFocus", "focusTimerOnInit", "focusBottom", "validRequired", "validMinLength", "validMaxLength", "showErrorLabel", "showErrorBorder", "ignoreShowBorderErrorToolbar"], outputs: ["itemChange", "outShowPopupEditLink", "outMessageError", "outBlur", "outFocus", "outChange", "outSelectionChange", "outTextChange", "outContextMenu", "outFunctionsControl"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
836
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: LibsUiComponentsInputsMultiLanguageComponent, isStandalone: true, selector: "libs_ui-components-inputs-multi_language", inputs: { optionsLanguage: { classPropertyName: "optionsLanguage", publicName: "optionsLanguage", isSignal: true, isRequired: false, transformFunction: null }, zIndex: { classPropertyName: "zIndex", publicName: "zIndex", isSignal: true, isRequired: false, transformFunction: null }, viewType: { classPropertyName: "viewType", publicName: "viewType", isSignal: true, isRequired: false, transformFunction: null }, singleLanguage: { classPropertyName: "singleLanguage", publicName: "singleLanguage", isSignal: true, isRequired: false, transformFunction: null }, data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: false, transformFunction: null }, validRequired: { classPropertyName: "validRequired", publicName: "validRequired", isSignal: true, isRequired: false, transformFunction: null }, ignoreAdd: { classPropertyName: "ignoreAdd", publicName: "ignoreAdd", isSignal: true, isRequired: false, transformFunction: null }, titleField: { classPropertyName: "titleField", publicName: "titleField", isSignal: true, isRequired: false, transformFunction: null }, keyHeader: { classPropertyName: "keyHeader", publicName: "keyHeader", isSignal: true, isRequired: false, transformFunction: null }, textArea: { classPropertyName: "textArea", publicName: "textArea", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, extendClass: { classPropertyName: "extendClass", publicName: "extendClass", isSignal: true, isRequired: false, transformFunction: null }, extendClassContent: { classPropertyName: "extendClassContent", publicName: "extendClassContent", isSignal: true, isRequired: false, transformFunction: null }, viewPosition: { classPropertyName: "viewPosition", publicName: "viewPosition", isSignal: true, isRequired: false, transformFunction: null }, ignoreRemove: { classPropertyName: "ignoreRemove", publicName: "ignoreRemove", isSignal: true, isRequired: false, transformFunction: null }, validMaxLength: { classPropertyName: "validMaxLength", publicName: "validMaxLength", isSignal: true, isRequired: false, transformFunction: null }, validMinLength: { classPropertyName: "validMinLength", publicName: "validMinLength", isSignal: true, isRequired: false, transformFunction: null }, countCharacters: { classPropertyName: "countCharacters", publicName: "countCharacters", isSignal: true, isRequired: false, transformFunction: null }, viewContent: { classPropertyName: "viewContent", publicName: "viewContent", isSignal: true, isRequired: false, transformFunction: null }, classIncludeKey: { classPropertyName: "classIncludeKey", publicName: "classIncludeKey", isSignal: true, isRequired: false, transformFunction: null }, classIncludeValue: { classPropertyName: "classIncludeValue", publicName: "classIncludeValue", isSignal: true, isRequired: false, transformFunction: null }, dataLanguage: { classPropertyName: "dataLanguage", publicName: "dataLanguage", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, acceptNegativeValue: { classPropertyName: "acceptNegativeValue", publicName: "acceptNegativeValue", isSignal: true, isRequired: false, transformFunction: null }, valueUpDownNumber: { classPropertyName: "valueUpDownNumber", publicName: "valueUpDownNumber", isSignal: true, isRequired: false, transformFunction: null }, maxValueNumber: { classPropertyName: "maxValueNumber", publicName: "maxValueNumber", isSignal: true, isRequired: false, transformFunction: null }, onlyAcceptNegativeValue: { classPropertyName: "onlyAcceptNegativeValue", publicName: "onlyAcceptNegativeValue", isSignal: true, isRequired: false, transformFunction: null }, validOneDefaultMultiLanguage: { classPropertyName: "validOneDefaultMultiLanguage", publicName: "validOneDefaultMultiLanguage", isSignal: true, isRequired: false, transformFunction: null }, classIconAddLanguage: { classPropertyName: "classIconAddLanguage", publicName: "classIconAddLanguage", isSignal: true, isRequired: false, transformFunction: null }, validPattern: { classPropertyName: "validPattern", publicName: "validPattern", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { data: "dataChange", ignoreAdd: "ignoreAddChange", extendClass: "extendClassChange", dataLanguage: "dataLanguageChange", outEventMultiLanguage: "outEventMultiLanguage", outChangeTypeLanguage: "outChangeTypeLanguage", outChangeValueInput: "outChangeValueInput" }, viewQueries: [{ propertyName: "inputComponentRefs", predicate: LibsUiComponentsInputsValidComponent, descendants: true, isSignal: true }, { propertyName: "quillComponentRefs", predicate: LibsUiComponentsInputsQuill2xComponent, descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"w-full flex flex-col gap-[8px]\">\n @if (titleField(); as titleField) {\n <div class=\"libs-ui-font-h6m\">{{ titleField | translate }}</div>\n }\n <div\n class=\"flex flex-col gap-[8px]\"\n [class.gap-[8px]]=\"viewPosition() === 'row'\"\n [class.gap-[16px]]=\"viewPosition() === 'column'\">\n @for (key of languageDisplay(); track key) {\n @if (!viewContent()) {\n <div class=\"flex gap-[8px] w-full {{ extendClass() }}\">\n @if (!singleLanguage()) {\n <div>\n <libs_ui-components-dropdown\n [listConfig]=\"listConfigItem()\"\n [httpRequestDetailItemById]=\"httpRequestDetail()\"\n [listKeysDisable]=\"languageDisplay() | LibsUiComponentsInputsMultiLanguageGetDisableKeyPipe: key\"\n [readonly]=\"$index === 0 || readonly()\"\n [listKeySelected]=\"key\"\n [zIndex]=\"zIndex()\"\n [classInclude]=\"'w-[150px]'\"\n [listHiddenInputSearch]=\"true\"\n [listHasButtonUnSelectOption]=\"false\"\n (outSelectKey)=\"handlerSelectChange($event, key)\" />\n </div>\n }\n <div class=\"flex flex-1 gap-[12px] {{ extendClassContent() }}\">\n @for (item of data(); track item) {\n @if (item.type === 'editor') {\n <div class=\"w-full min-w-0\">\n @if (item.keyBindData | LibsUiComponentsInputsMultiLanguageGetItemPipe: dataLanguageChange; as itemMap) {\n @let constHtmlPlaceholder = item.placeholder || ' ';\n <libs_ui-components-inputs-quill2x\n [(item)]=\"itemMap\"\n [fieldBind]=\"key\"\n [resize]=\"item.resize || 'vertical'\"\n [minHeightEditorContentDefault]=\"item.minHeightEditorContentDefault || 160\"\n [maxHeightEditorContentDefault]=\"item.maxHeightEditorContentDefault\"\n [heightEditorContentDefault]=\"item.heightEditorContentDefault\"\n [validRequired]=\"$index === 0 && data().length <= 1 ? validRequiredDefault() : validRequired()\"\n [placeholder]=\"constHtmlPlaceholder | translate\"\n [readonly]=\"readonly()\"\n (outFocus)=\"handlerInputChange()\"\n (outChange)=\"handlerInputChange()\" />\n }\n </div>\n } @else {\n <div class=\"w-full min-w-0 {{ item.classIncludeInput }}\">\n @if (item.keyBindData | LibsUiComponentsInputsMultiLanguageGetItemPipe: dataLanguageChange; as itemMap) {\n @let constHtmlPlaceholder = item.placeholder || ' ';\n <libs_ui-components-inputs-valid\n [dataType]=\"item.type === 'number' ? 'int' : item.type === 'text' ? 'string' : item.type === 'bigint' ? 'bigint' : 'float'\"\n [(item)]=\"itemMap\"\n [fieldNameBind]=\"key\"\n [tagInput]=\"textArea() ? 'textarea' : 'input'\"\n [placeholder]=\"constHtmlPlaceholder | translate\"\n [emitEmptyInDataTypeNumber]=\"true\"\n [validRequired]=\"\n validOneDefaultMultiLanguage()\n ? { isRequired: validOneDefaultMultiLanguage() === key ? true : false }\n : $index === 0 && data().length <= 1\n ? validRequiredDefault()\n : $index === 0 && data().length > 1 && item.validRequiredLangDefault\n ? item.validRequiredLangDefault\n : item.validRequired\n ? item.validRequired\n : validRequired() || { isRequired: false }\n \"\n [unitsRight]=\"currencyUnits()\"\n [keySelectedUnitRight]=\"key\"\n [readonly]=\"readonly()\"\n [showCount]=\"countCharacters()\"\n [maxLength]=\"validMaxLength().length ? validMaxLength().length : undefined\"\n [fixedFloat]=\"item.type === 'bigint' ? 4 : 14\"\n [validMinLength]=\"\n validOneDefaultMultiLanguage() && validOneDefaultMultiLanguage() !== key && !itemMap()[key]\n ? undefined\n : { length: validMinLength()?.length || -1, message: 'i18n_minimum_length_number', interpolateParams: { number: validMinLength()?.length } }\n \"\n [validPattern]=\"validPattern()\"\n [acceptNegativeValue]=\"acceptNegativeValue()\"\n [valueUpDownNumber]=\"valueUpDownNumber()\"\n [maxValueNumber]=\"maxValueNumber()\"\n [onlyAcceptNegativeValue]=\"onlyAcceptNegativeValue()\"\n (outValueChange)=\"handlerInputChange()\" />\n }\n </div>\n }\n }\n @if (!singleLanguage()) {\n <div\n class=\"flex items-center w-[16px] shrink-0\"\n [class.h-[32px]]=\"data()[0].type !== 'editor'\"\n [class.h-[44px]]=\"data()[0].type === 'editor'\">\n @if ($index > 0 && data().length === 1 && !ignoreRemove() && !readonly()) {\n <libs_ui-components-buttons-button\n [type]=\"'button-link-custom'\"\n [buttonCustom]=\"{\n configStepColor: {\n text: '#6a7383',\n text_hover: '#ee2d41',\n text_active: '#ee2d41',\n text_disable: '#6a7383',\n },\n rootColor: '#6a7383',\n }\"\n [iconOnlyType]=\"true\"\n [popover]=\"{ config: { content: 'i18n_delete', zIndex: 1205 } }\"\n [classIconLeft]=\"'libs-ui-icon-remove'\"\n [classInclude]=\"'!p-0'\"\n (outClick)=\"handlerRemoveLanguage($event, key)\" />\n }\n @if ($index === 0 && options().length !== languageDisplay().length && viewType() !== 'integer' && !readonly()) {\n <libs_ui-components-buttons-button\n [type]=\"'button-link-third'\"\n [iconOnlyType]=\"true\"\n [classIconLeft]=\"classIconAddLanguage()\"\n [classInclude]=\"'!p-0'\"\n (outClick)=\"handlerAddLanguage($event)\" />\n }\n </div>\n }\n </div>\n </div>\n }\n @if (viewContent()) {\n <div class=\"flex gap-[4px]\">\n @if (!singleLanguage()) {\n <div class=\"flex\">\n <libs_ui-components-popover\n [type]=\"'text'\"\n [classInclude]=\"classIncludeKey()\"\n [innerHTML]=\"key | LibsUiComponentsInputsMultiLanguageDisplayLanguagePipe: options()\" />\n </div>\n }\n <div class=\"flex flex-1 min-w-0\">\n <libs_ui-components-popover\n [type]=\"'text'\"\n [classInclude]=\"classIncludeValue()\"\n [innerHTML]=\"(dataLanguageChange()[key] || dataLanguageChange()[key] === 0 ? dataLanguageChange()[key] + '' : '') | LibsUiPipesEscapeHtmlPipe\"\n [config]=\"{ zIndex: zIndex() }\" />\n </div>\n </div>\n }\n }\n </div>\n @if (viewType() === 'integer' && !this.ignoreAdd() && !readonly()) {\n <libs_ui-components-buttons-button\n [type]=\"'button-link-primary'\"\n [classIconLeft]=\"'libs-ui-icon-add'\"\n [classLabel]=\"'libs-ui-font-h6mi'\"\n [classInclude]=\"'!px-0 !py-[2px]'\"\n [label]=\"'i18n_add_new'\"\n (outClick)=\"handlerAddLanguage($event)\" />\n }\n</div>\n", dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { 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", "onlyEmitMultiKeyWhenManualClick", "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: LibsUiComponentsInputsValidComponent, selector: "libs_ui-components-inputs-valid", inputs: ["item", "labelConfig", "emitEmptyInDataTypeNumber", "ignoreBlockInputMaxValue", "fieldNameBind", "showCount", "typeComponentSelectItem", "valueComponentSelectItem", "disableComponentSelectItem", "tagInput", "dataType", "typeInput", "modeInput", "resetAutoCompletePassword", "textAreaEnterNotNewLine", "fixedFloat", "acceptNegativeValue", "valueUpDownNumber", "ignoreWidthInput100", "classIncludeInput", "classContainerInput", "readonly", "disable", "noBorder", "backgroundNone", "useColorModeExist", "placeholder", "keepPlaceholderOnly", "classContainerBottomInput", "autoRemoveEmoji", "defaultHeight", "maxHeightTextArea", "minHeightTextArea", "ignoreShowError", "ignoreShowMessageError", "borderError", "iconLeftClass", "popoverContentIconLeft", "iconRightClass", "popoverContentIconRight", "zIndexPopoverContent", "unitsLeft", "configUnitLeft", "keySelectedUnitLeft", "unitsRight", "configUnitRight", "keySelectedUnitRight", "maxValueNumber", "minValueNumber", "ignoreContentLeft", "ignoreContentRight", "isBaselineStyle", "valuePatternShowError", "validPattern", "validRequired", "validMinLength", "validMinValue", "validMaxValue", "validMaxLength", "functionValid", "maxLength", "positionMessageErrorStartInput", "classInclude", "resize", "templateLeftBottomInput", "templateRightBottomInput", "onlyAcceptNegativeValue", "autoAddZeroLessThan10InTypeInt", "maxLengthNumberCount", "classMessageErrorInclude", "ignoreStopPropagationEvent", "ignoreUnitRightClassReadOnly", "paddingRightCustomSpecific", "focusTimeOut", "debounceTimeValidate"], outputs: ["itemChange", "outValueChange", "outSelect", "outIconLeft", "outIconRight", "outClickButtonLabel", "outSwitchEventLabel", "outLabelRightClick", "outEnterInputEvent", "outHeightAreaChange", "outFunctionsControl", "outFocusAndBlur", "outChangeValueByButtonUpDown"] }, { 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: 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: "pipe", type: LibsUiComponentsInputsMultiLanguageGetDisableKeyPipe, name: "LibsUiComponentsInputsMultiLanguageGetDisableKeyPipe" }, { kind: "pipe", type: LibsUiComponentsInputsMultiLanguageDisplayLanguagePipe, name: "LibsUiComponentsInputsMultiLanguageDisplayLanguagePipe" }, { kind: "pipe", type: LibsUiComponentsInputsMultiLanguageGetItemPipe, name: "LibsUiComponentsInputsMultiLanguageGetItemPipe" }, { kind: "pipe", type: LibsUiPipesEscapeHtmlPipe, name: "LibsUiPipesEscapeHtmlPipe" }, { kind: "component", type: LibsUiComponentsInputsQuill2xComponent, selector: "libs_ui-components-inputs-quill2x", inputs: ["uploadImageConfig", "displayToolbar", "placeholder", "blotsRegister", "readonly", "quillCustomConfig", "label", "item", "fieldBind", "dataConfigMention", "templateToolBarPersonalize", "mentionListTemplate", "zIndex", "ignoreShowPopupEditLink", "ignoreCommunicateMicroEventPopup", "handlersExpand", "resizeImagePlugin", "customStylesConvertInline", "fontSizeDefault", "heightEditorContentDefault", "minHeightEditorContentDefault", "maxHeightEditorContentDefault", "removeNearWhiteColorsOnPaste", "resize", "autoFocus", "focusTimerOnInit", "focusBottom", "validRequired", "validMinLength", "validMaxLength", "showErrorLabel", "showErrorBorder", "ignoreShowBorderErrorToolbar"], outputs: ["itemChange", "outShowPopupEditLink", "outMessageError", "outBlur", "outFocus", "outChange", "outSelectionChange", "outTextChange", "outContextMenu", "outFunctionsControl"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
837
837
  }
838
838
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiComponentsInputsMultiLanguageComponent, decorators: [{
839
839
  type: Component,