@libs-ui/components-inputs-quill 0.2.138 → 0.2.140
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.
|
@@ -52,7 +52,8 @@ export class LibsUiComponentsInputsQuillComponent {
|
|
|
52
52
|
translate = inject(TranslateService);
|
|
53
53
|
isShowToolBar = input(true, { transform: val => val ?? true });
|
|
54
54
|
isToolbarPositonFixed = input(false, { transform: val => val ?? false });
|
|
55
|
-
classIncludeToolbar = input('
|
|
55
|
+
classIncludeToolbar = input('');
|
|
56
|
+
stylesIncludeToolbar = input();
|
|
56
57
|
toolbarConfig = input();
|
|
57
58
|
placeholder = input('i18n_import_content', { transform: (value) => value || 'i18n_import_content' });
|
|
58
59
|
label = input();
|
|
@@ -123,7 +124,7 @@ export class LibsUiComponentsInputsQuillComponent {
|
|
|
123
124
|
setTimeout(() => this.display.set(true), 400);
|
|
124
125
|
}
|
|
125
126
|
this.setClassIncludeAndReadOnly();
|
|
126
|
-
this.setContent(get(this.item(), this.fieldNameBind(), ''));
|
|
127
|
+
this.setContent(get(this.item(), this.fieldNameBind(), '').replace(/[\u200B-\u200D\uFEFF]/g, ''));
|
|
127
128
|
this.handlerTextChange();
|
|
128
129
|
this.handlerSelectionChange();
|
|
129
130
|
this.handlerPaste();
|
|
@@ -684,7 +685,7 @@ export class LibsUiComponentsInputsQuillComponent {
|
|
|
684
685
|
clearTimeout(this.timeCalculationToolBar());
|
|
685
686
|
}
|
|
686
687
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LibsUiComponentsInputsQuillComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
687
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: LibsUiComponentsInputsQuillComponent, isStandalone: true, selector: "libs_ui-components-inputs-quill", inputs: { isShowToolBar: { classPropertyName: "isShowToolBar", publicName: "isShowToolBar", isSignal: true, isRequired: false, transformFunction: null }, isToolbarPositonFixed: { classPropertyName: "isToolbarPositonFixed", publicName: "isToolbarPositonFixed", isSignal: true, isRequired: false, transformFunction: null }, classIncludeToolbar: { classPropertyName: "classIncludeToolbar", publicName: "classIncludeToolbar", isSignal: true, isRequired: false, transformFunction: null }, toolbarConfig: { classPropertyName: "toolbarConfig", publicName: "toolbarConfig", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, item: { classPropertyName: "item", publicName: "item", isSignal: true, isRequired: false, transformFunction: null }, fieldNameBind: { classPropertyName: "fieldNameBind", publicName: "fieldNameBind", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, showErrorLabel: { classPropertyName: "showErrorLabel", publicName: "showErrorLabel", isSignal: true, isRequired: false, transformFunction: null }, showErrorBorder: { classPropertyName: "showErrorBorder", publicName: "showErrorBorder", isSignal: true, isRequired: false, transformFunction: null }, onlyShowErrorBorderInContent: { classPropertyName: "onlyShowErrorBorderInContent", publicName: "onlyShowErrorBorderInContent", isSignal: true, isRequired: false, transformFunction: null }, classIncludeTemplate: { classPropertyName: "classIncludeTemplate", publicName: "classIncludeTemplate", isSignal: true, isRequired: false, transformFunction: null }, classInclude: { classPropertyName: "classInclude", publicName: "classInclude", isSignal: true, isRequired: false, transformFunction: null }, handlersExpand: { classPropertyName: "handlersExpand", publicName: "handlersExpand", isSignal: true, isRequired: false, transformFunction: null }, validRequired: { classPropertyName: "validRequired", publicName: "validRequired", isSignal: true, isRequired: false, transformFunction: null }, validMinLength: { classPropertyName: "validMinLength", publicName: "validMinLength", isSignal: true, isRequired: false, transformFunction: null }, validMaxLength: { classPropertyName: "validMaxLength", publicName: "validMaxLength", isSignal: true, isRequired: false, transformFunction: null }, zIndex: { classPropertyName: "zIndex", publicName: "zIndex", isSignal: true, isRequired: false, transformFunction: null }, dataConfigMention: { classPropertyName: "dataConfigMention", publicName: "dataConfigMention", isSignal: true, isRequired: false, transformFunction: null }, blotsRegister: { classPropertyName: "blotsRegister", publicName: "blotsRegister", isSignal: true, isRequired: false, transformFunction: null }, heightAuto: { classPropertyName: "heightAuto", publicName: "heightAuto", isSignal: true, isRequired: false, transformFunction: null }, autoFocus: { classPropertyName: "autoFocus", publicName: "autoFocus", isSignal: true, isRequired: false, transformFunction: null }, autoFocusBottom: { classPropertyName: "autoFocusBottom", publicName: "autoFocusBottom", isSignal: true, isRequired: false, transformFunction: null }, templateToolBarPersonalize: { classPropertyName: "templateToolBarPersonalize", publicName: "templateToolBarPersonalize", isSignal: true, isRequired: false, transformFunction: null }, template: { classPropertyName: "template", publicName: "template", isSignal: true, isRequired: false, transformFunction: null }, uploadImageConfig: { classPropertyName: "uploadImageConfig", publicName: "uploadImageConfig", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { item: "itemChange", outMessageError: "outMessageError", outBlur: "outBlur", outFocus: "outFocus", outChange: "outChange", outFunctionsControl: "outFunctionsControl", outSelectionChange: "outSelectionChange", outTextChange: "outTextChange", outContextMenu: "outContextMenu" }, viewQueries: [{ propertyName: "wrapperEditorEl", first: true, predicate: ["wrapperEditor"], descendants: true, isSignal: true }, { propertyName: "editorEl", first: true, predicate: ["editor"], descendants: true, isSignal: true }, { propertyName: "quillOptionEl", first: true, predicate: ["quillOption"], descendants: true, isSignal: true }, { propertyName: "quillEditorEl", first: true, predicate: ["quillEditor"], descendants: true, isSignal: true }, { propertyName: "toolbarItemsEl", first: true, predicate: ["toolbarItems"], descendants: true, isSignal: true }, { propertyName: "itemsEl", predicate: ["item"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"flex flex-col w-full h-full\">\n @if (label(); as label) {\n <libs_ui-components-label [classInclude]=\"label.classInclude\"\n [required]=\"label.required\"\n [labelLeft]=\"label.labelLeft\" />\n }\n <div #wrapperEditor\n [attr.heightAuto]=\"heightAuto()\"\n [attr.isToolbarPositonFixed]=\"isToolbarPositonFixed()\"\n class=\"libs-ui-quill-wrapper w-full h-full relative flex flex-col\"\n [class.libs-ui-border-error-general]=\"messageError() && showErrorBorder() && !onlyShowErrorBorderInContent()\"\n [class.rounded-[4px]]=\"messageError() && showErrorBorder() && !onlyShowErrorBorderInContent()\">\n <div #editor\n class=\"libs-ui-quill\"\n [attr.showError]=\"messageError() && showErrorBorder() && onlyShowErrorBorderInContent()\"\n [class.!hidden]=\"!display()\">\n <div #quillOption\n [class.!hidden]=\"!isShowToolBar()\"\n class=\"bg-[#f8f9fa] {{isToolbarPositonFixed() ? 'fixed px-[8px] py-[4px] p-0 w-[500px] rounded-[4px] bg-[#ffffff] libs-ui-quill-toolbar-animation':''}} {{ classIncludeToolbar() }}\">\n <ng-container *ngTemplateOutlet=\"toolbar\"></ng-container>\n </div>\n <div #quillEditor\n LibsUiComponentsInputsMentionDirective\n [mentionConfig]=\"dataConfigMention()\"\n (outToggle)=\"handleToggleMention($event)\"\n (outInsertMention)=\"handlerInsertMention($event)\"></div>\n </div>\n @if (template(); as template) {\n <div [class]=\"classIncludeTemplate()\">\n <ng-container *ngTemplateOutlet=\"template\"></ng-container>\n </div>\n }\n </div>\n @if (messageError() && showErrorLabel()) {\n <div class=\"flex items-center leading-normal mt-[8px]\">\n <span class=\"text-[#ff5454] libs-ui-font-h7r\"> {{ messageError() | translate }}</span>\n </div>\n }\n</div>\n\n<ng-template #toolbar>\n <div class=\"toolbar\"\n #toolbarItems>\n <div class=\"ql-formats items-center\">\n @for (option of toolbarOptionsConfig(); track option) {\n <div #item\n [id]=\"option.type+'_'+$index\"\n class=\"items-center\"\n [class.hidden]=\"itemHidden().includes($index) || itemHiddenExpand().includes($index)\"\n [class.flex]=\"!itemHidden().includes($index)\">\n <ng-container *ngTemplateOutlet=\"itemTemplate;context:{option, $index, $last}\"></ng-container>\n </div>\n }\n <div class=\"relative\">\n @if (itemHidden().length) {\n <libs_ui-components-buttons-button [type]=\"showMoreAction() ? 'button-secondary' : 'button-third'\"\n [iconOnlyType]=\"true\"\n [classInclude]=\"'!p-[1px] !h-[20px] ml-[8px]'\"\n [classIconLeft]=\"'libs-ui-icon-move-right rotate-90'\"\n (outClick)=\"handlerChangeShowMoreAction($event)\" />\n }\n <!-- Build toolbar khi click xem th\u00EAm-->\n <div [class.hidden]=\"!showMoreAction() || !itemHidden().length\"\n class=\"absolute bg-[#ffffff] shadow-md z-[1] flex items-center pl-[8px] pr-[16px] py-[4px] rounded-[8px] top-[31px] right-[0px]\">\n @for (option of toolbarOptionsConfig(); track option) {\n <div class=\"items-center\"\n [class.hidden]=\"!itemHidden().includes($index)\"\n [class.flex]=\"itemHidden().includes($index)\">\n <ng-container *ngTemplateOutlet=\"itemTemplate;context:{option, $index, $last}\"></ng-container>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n</ng-template>\n\n\n<ng-template #itemTemplate\n let-$index=\"$index\"\n let-$last=\"$last\"\n let-option=\"option\">\n @if (option.type === 'undo') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button LibsUiComponentsPopoverDirective\n [config]=\"{content: 'i18n_undo', zIndex: 1250}\"\n class=\"ql-undo\"></button>\n </div>\n }\n @if (option.type === 'redo') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button LibsUiComponentsPopoverDirective\n [config]=\"{content: 'i18n_redo', zIndex: 1250}\"\n class=\"ql-redo\"></button>\n </div>\n }\n @if (option.type === 'fontFamily') {\n <div\n class=\"relative w-[117px] h-full bg-[#ffffff] rounded-[4px] libs-ui-border-general {{ option.classInclude || 'mx-[8px]' }}\">\n <libs_ui-components-dropdown [isNgContent]=\"true\"\n [labelPopoverFullWidth]=\"true\"\n [listConfig]=\"listConfigFont()\"\n [listHasButtonUnSelectOption]=\"false\"\n [listHiddenInputSearch]=\"true\"\n [listMaxItemShow]=\"8\"\n [zIndex]=\"1250\"\n (outSelectKey)=\"handleSelectFont($event)\">\n @if (fontSelected(); as fontSelected) {\n <div\n class=\"flex items-center cursor-pointer py-[8px] libs-ui-font-h5r pl-[16px] pr-[40px] {{ option.classInclude || 'mx-[8px]' }}\">\n <libs_ui-components-popover [type]=\"'text'\"\n [ignoreStopPropagationEvent]=\"true\"\n [config]=\"{zIndex:1250}\">\n {{ labelFontSelectedComputed() }}\n </libs_ui-components-popover>\n <i class=\"libs-ui-icon-move-right rotate-90 absolute right-[12px] text-[#6a7383] text-[16px]\"></i>\n </div>\n }\n </libs_ui-components-dropdown>\n </div>\n }\n @if (option.type === 'fontSize') {\n <div class=\"ql-picker {{ option.classInclude || 'mx-[8px]' }}\">\n <libs_ui-components-inputs-valid [dataType]=\"'int'\"\n [(item)]=\"size\"\n [fieldNameBind]=\"'value'\"\n [valueUpDownNumber]=\"1\"\n [maxValueNumber]=\"72\"\n [minValueNumber]=\"8\"\n [readonly]=\"readonly()\"\n [classContainerInput]=\"'w-[72px] h-[32px]'\"\n (outValueChange)=\"handlerValueChange($event)\" />\n </div>\n }\n @if (option.type === 'color') {\n <div class=\"ql-color ql-picker ql-color-picker !flex items-center {{ option.classInclude || 'mx-[8px]' }}\">\n <libs_ui-components-popover [config]=\"{content:'i18n_text_color', zIndex:1250}\">\n <libs_ui-components-buttons-select_color [zIndex]=\"zIndex()\"\n [direction]=\"'top'\"\n [externalContent]=\"true\"\n [applyNow]=\"true\"\n (outColorChange)=\"setStyle('color', $event)\">\n <div\n class=\"libs-ui-icon-editor-color-text libs-ui-buttons-select-color text-[#6a7383] text-[16px] hover:text-[var(--libs-ui-color-light-1)]\">\n </div>\n </libs_ui-components-buttons-select_color>\n </libs_ui-components-popover>\n </div>\n }\n @if (option.type === 'background') {\n <div class=\"ql-background ql-picker ql-color-picker !flex items-center {{ option.classInclude || 'mx-[8px]' }}\">\n <libs_ui-components-popover [config]=\"{content:'i18n_background_color', zIndex:1250}\">\n <libs_ui-components-buttons-select_color [zIndex]=\"zIndex()\"\n [direction]=\"'top'\"\n [externalContent]=\"true\"\n [applyNow]=\"true\"\n (outColorChange)=\"setStyle('background', $event)\">\n <div\n class=\"libs-ui-icon-editor-color-background libs-ui-buttons-select-color text-[#6a7383] text-[16px] hover:text-[var(--libs-ui-color-light-1)]\">\n </div>\n </libs_ui-components-buttons-select_color>\n </libs_ui-components-popover>\n </div>\n }\n @if (option.type === 'bold') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button LibsUiComponentsPopoverDirective\n [config]=\"{content:'i18n_font_weight_bold', zIndex:1250}\"\n class=\"ql-bold\"></button>\n </div>\n }\n @if (option.type === 'italic') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button LibsUiComponentsPopoverDirective\n [config]=\"{content:'i18n_font_style_italic', zIndex:1250}\"\n class=\"ql-italic\"></button>\n </div>\n }\n @if (option.type === 'underline') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button LibsUiComponentsPopoverDirective\n [config]=\"{content:'i18n_text_decoration_underline', zIndex:1250}\"\n class=\"ql-underline\"></button>\n </div>\n }\n @if (option.type === 'strikeThrough') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button LibsUiComponentsPopoverDirective\n [config]=\"{content:'i18n_text_line_through', zIndex:1250}\"\n class=\"ql-strike\"></button>\n </div>\n }\n @if (option.type === 'adjust') {\n <div\n class=\"relative !flex items-center ql-align ql-picker ql-icon-picker !w-max {{ option.classInclude || 'mx-[8px]' }}\">\n <libs_ui-components-popover [config]=\"{content:'i18n_adjust', zIndex:1250}\">\n <libs_ui-components-dropdown [isNgContent]=\"true\"\n [ignoreStopPropagationEvent]=\"true\"\n [labelPopoverFullWidth]=\"true\"\n [listConfig]=\"listConfigAlign()\"\n [listHiddenInputSearch]=\"true\"\n [popoverCustomConfig]=\"{ignoreArrow: true, classInclude: '!w-[32px] overflow-hidden !py-[4px]', position: {mode: 'start', distance: 0}, paddingLeftItem: false}\"\n [listHasButtonUnSelectOption]=\"false\"\n [listMaxItemShow]=\"8\"\n [zIndex]=\"1250\"\n (outSelectKey)=\"handleSelectAlign($event)\">\n @if (alignSelected(); as alignSelected) {\n <div class=\"flex items-center cursor-pointer\">\n <i [class]=\"iconAlignSelectedComputed()\"></i>\n <i class=\"libs-ui-icon-move-right rotate-90 text-[#6a7383] text-[16px] ml-[4px]\"></i>\n </div>\n }\n </libs_ui-components-dropdown>\n </libs_ui-components-popover>\n </div>\n }\n @if (option.type === 'indentIncrease') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button LibsUiComponentsPopoverDirective\n [config]=\"{content:'i18n_indent_increase', zIndex:1250}\"\n class=\"ql-indent\"\n value=\"+1\"></button>\n </div>\n }\n @if (option.type === 'indentDecrease') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button LibsUiComponentsPopoverDirective\n [config]=\"{content:'i18n_indent_decrease', zIndex:1250}\"\n class=\"ql-indent\"\n value=\"-1\"></button>\n </div>\n }\n @if (option.type === 'listBulleted') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button LibsUiComponentsPopoverDirective\n [config]=\"{content:'i18n_list_bulleted', zIndex:1250}\"\n class=\"ql-list ql-bullet\"\n value=\"bullet\"></button>\n </div>\n }\n @if (option.type === 'listNumbered') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button LibsUiComponentsPopoverDirective\n [config]=\"{content:'i18n_list_numbered', zIndex:1250}\"\n class=\"ql-list ql-ordered\"\n value=\"ordered\"></button>\n </div>\n }\n @if (option.type === 'personalize' && templateToolBarPersonalize(); as templateToolBarPersonalize) {\n <div class=\"flex items-center {{ option.classInclude || 'mx-[8px]' }}\">\n <ng-container *ngTemplateOutlet=\"templateToolBarPersonalize\"></ng-container>\n </div>\n }\n @if (option.type === 'blockquote') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button LibsUiComponentsPopoverDirective\n [config]=\"{content:'i18n_quote', zIndex:1250}\"\n class=\"ql-blockquote\"></button>\n </div>\n }\n @if (option.type === 'link') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button LibsUiComponentsPopoverDirective\n [config]=\"{content:'i18n_insert_link', zIndex:1250}\"\n class=\"ql-link\"></button>\n </div>\n }\n @if (option.type === 'unLink') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button LibsUiComponentsPopoverDirective\n [config]=\"{content:'i18n_unlink', zIndex:1250}\"\n class=\"ql-unLink\"></button>\n </div>\n }\n @if (option.type === 'image') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button LibsUiComponentsPopoverDirective\n [config]=\"{content:'i18n_image', zIndex:1250}\"\n class=\"ql-image\"></button>\n </div>\n }\n @if (option.type === 'emoji') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <libs_ui-components-emoji [zIndex]=\"1250\"\n [isNgContent]=\"true\"\n (outEventEmoji)=\"handlerAddEmoji($event)\">\n <button class=\"ql-emoji\"></button>\n </libs_ui-components-emoji>\n </div>\n }\n @if (option.type === 'line') {\n <div class=\"w-[1px] h-[16px] libs-ui-border-right-general\"></div>\n }\n</ng-template>\n\n<libs_ui-components-popover [mode]=\"'click'\"\n [ignoreHiddenPopoverContentWhenMouseLeave]=\"true\"\n [config]=\"{template: viewLink, whiteTheme: true, ignoreArrow: true}\"\n (outEvent)=\"handlerPopoverEvent($event)\"\n (outFunctionsControl)=\"handlerPopoverFunctionControl($event)\" />\n\n<ng-template #viewLink>\n <div class=\"flex justify-between items-center px-[16px] py-[8px] rounded-[8px]\">\n <div class=\"w-full min-w-0 libs-ui-font-h5r\"\n [type]=\"'text'\"\n LibsUiComponentsPopoverDirective>{{ link().url }}</div>\n <div class=\"flex items-center ml-[16px]\">\n <libs_ui-components-buttons-button [type]=\"'button-link-primary'\"\n [iconOnlyType]=\"true\"\n [classIconLeft]=\"'libs-ui-icon-edit-line'\"\n [classInclude]=\"'!p-0'\"\n (outClick)=\"handlerEdit($event)\" />\n <libs_ui-components-buttons-button [type]=\"'button-link-custom'\"\n [buttonCustom]=\"{\n configStepColor: {\n text: '#071631',\n text_hover: '#ee2d41',\n text_active: '#ee2d41',\n text_disable: '071631'\n },\n rootColor: '#071631'\n }\"\n [classInclude]=\"'!p-0 ml-[12px]'\"\n [iconOnlyType]=\"true\"\n [classIconLeft]=\"'libs-ui-icon-link-broken'\"\n (outClick)=\"handlerUnlink($event)\" />\n </div>\n </div>\n</ng-template>\n", styles: ["@-webkit-keyframes animation-move{0%{transform:translateY(-12px)}to{transform:translateY(0)}}@keyframes animation-move{0%{transform:translateY(-12px)}to{transform:translateY(0)}}.libs-ui-quill{height:100%;width:100%;display:flex;flex-direction:column}.libs-ui-quill-toolbar-animation{animation:animation-move .4s ease}.libs-ui-quill-wrapper[heightAuto=true]{overflow:auto}.libs-ui-quill-wrapper[heightAuto=true] .libs-ui-quill{height:auto}.libs-ui-quill-wrapper[heightAuto=true] .libs-ui-quill ::ng-deep .ql-container{height:auto}.libs-ui-quill-wrapper[heightAuto=true] .libs-ui-quill ::ng-deep .ql-container .ql-editor{position:relative!important}.libs-ui-quill-wrapper[isToolbarPositonFixed=true] .libs-ui-quill ::ng-deep .ql-container.ql-snow{border:0px!important}.libs-ui-quill-wrapper[isToolbarPositonFixed=false] .libs-ui-quill ::ng-deep .ql-container.ql-snow{border:solid 1px #e6e8ed!important;border-radius:0 0 4px 4px}.libs-ui-quill-wrapper[isToolbarPositonFixed=false] .libs-ui-quill ::ng-deep .ql-toolbar.ql-snow{border:solid 1px #e6e8ed!important;border-radius:4px 4px 0 0;border-bottom:unset!important}.libs-ui-quill-wrapper[isToolbarPositonFixed=false] .libs-ui-quill[showError=true] ::ng-deep .ql-container.ql-snow{border:solid 1px #ee2d41!important}:host ::ng-deep .toolbar,:host ::ng-deep .ql-formats{position:relative;width:100%}:host ::ng-deep .ql-toolbar.ql-snow .ql-formats{display:flex}:host ::ng-deep .ql-container.ql-snow{width:100%;height:100%;position:relative}:host ::ng-deep .ql-editor{font-family:var(--libs-ui-font-family-name),\"Arial, Helvetica, sans-serif\"!important;font-weight:400}:host ::ng-deep .ql-editor b{font-family:var(--libs-ui-font-family-name),\"Arial, Helvetica, sans-serif\"!important;font-weight:600}:host ::ng-deep .ql-toolbar.ql-snow{border:none;border-radius:8px;padding:4px 16px}:host ::ng-deep .ql-toolbar.ql-snow .ql-picker-label{color:#071631;border:none!important;margin-top:5px}:host ::ng-deep .ql-toolbar.ql-snow .ql-picker-label:hover{color:var(--libs-ui-color-light-1)!important}:host ::ng-deep .ql-toolbar.ql-snow .ql-picker-label:hover .ql-stroke{stroke:var(--libs-ui-color-light-1)!important}:host ::ng-deep .ql-snow.ql-toolbar .ql-picker-item:hover{color:var(--libs-ui-color-light-1)!important}:host ::ng-deep .ql-snow.ql-toolbar .ql-picker-label.ql-active{color:#071631}:host ::ng-deep .ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-stroke{stroke:#071631}:host ::ng-deep .ql-editor{height:100%;width:100%;position:absolute;line-height:1.42!important}:host ::ng-deep .ql-editor:before{font-family:var(--libs-ui-font-family-name),\"Arial, Helvetica, sans-serif\"!important;color:#9ca2ad!important;font-size:12px}:host ::ng-deep .ql-editor img{height:auto;max-width:100%}:host ::ng-deep .ql-toolbar.ql-snow .ql-picker.ql-expanded .ql-picker-label{border:none!important}:host ::ng-deep .ql-snow .ql-picker.ql-bold{width:36px!important}:host ::ng-deep .ql-editor.ql-blank{font-size:11px!important;letter-spacing:.05px;font-family:var(--libs-ui-font-family-name),\"Arial, Helvetica, sans-serif\"!important;line-height:16px}:host ::ng-deep .ql-editor.ql-blank:before{font-style:normal!important;color:#9ca2ad!important}:host ::ng-deep .ql-snow.ql-toolbar .ql-picker-label :hover{color:red!important}:host ::ng-deep .ql-formats{margin-right:12px!important}:host ::ng-deep .ql-formats .ql-size.ql-picker,:host ::ng-deep .ql-formats .ql-header.ql-picker,:host ::ng-deep .ql-formats .ql-font.ql-picker{border:solid 1px #e6e8ed!important;border-radius:4px}:host ::ng-deep .ql-formats .ql-align.ql-picker .ql-picker-label{width:24px}:host ::ng-deep .ql-formats .ql-align.ql-picker .ql-picker-label:hover{color:red!important}:host ::ng-deep .ql-formats .ql-header.ql-picker .ql-picker-label:before{font-size:12px}:host ::ng-deep .ql-picker-item:before{font-size:12px}:host ::ng-deep .ql-picker-label:before{font-size:12px}:host ::ng-deep .ql-snow.ql-toolbar button,:host ::ng-deep .ql-snow .ql-toolbar button{background:none;border:none;cursor:pointer;display:flex;align-items:center;float:none;padding:0;width:inherit}:host ::ng-deep ul{padding-left:1rem!important}:host ::ng-deep li{padding-left:0!important}:host ::ng-deep .ql-tooltip{display:none!important}.ql-picker-options{max-height:130px;overflow-y:auto}.ql-snow .ql-picker.ql-size{border:1px solid #e6e7ea;box-shadow:#00000005 0 1px 3px,#1b1f2326 0 0 0 1px;border-radius:2px}.ql-snow .ql-picker.ql-font{border:1px solid #e6e7ea!important;margin-right:8px;border-radius:4px}.ql-snow .ql-picker.ql-font .ql-picker-options:before{font-size:12px}.ql-snow .ql-picker.ql-font .ql-picker-label:before{font-size:12px}.ql-font-Arial{font-family:Arial}.ql-font-sans-serif{font-family:\"sans-serif\"}.ql-font-Helvetica{font-family:Helvetica}.libs-ui-quill-mention{font-weight:500!important;color:#7239ea;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:var(--libs-ui-font-family-name),\"Arial, Helvetica, sans-serif\"!important;font-weight:600}.ql-snow .ql-picker.ql-expanded .ql-picker-options{overflow:hidden}.ql-formats{margin-right:0!important}.ql-formats .ql-header{position:relative!important}.ql-formats .ql-header .ql-picker-options{position:absolute!important;top:-151px!important}.ql-formats .ql-font{position:relative!important}.ql-formats .ql-font .ql-picker-options{position:absolute!important;top:-93px!important}.ql-formats .ql-color{position:relative!important}.ql-formats .ql-color .ql-picker-options{position:absolute!important;top:-108px}.ql-formats .ql-background{position:relative!important}.ql-formats .ql-background .ql-picker-options{position:absolute!important;top:-108px}.ql-formats .ql-align{position:relative!important}.ql-formats .ql-align .ql-picker-label{padding:3px 4px!important}.ql-formats .ql-align .ql-picker-options{position:absolute!important;top:-106px}.ql-snow .ql-picker{font-size:12px!important;height:32px;float:none;width:auto}\n"], dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: LibsUiComponentsInputsMentionDirective, selector: "[LibsUiComponentsInputsMentionDirective]", inputs: ["mentionConfig", "mentionListTemplate"], outputs: ["outSearchTerm", "outItemSelected", "outToggle", "outInsertMention", "outFunctionControl"] }, { kind: "component", type: LibsUiComponentsLabelComponent, selector: "libs_ui-components-label", inputs: ["iconPopoverClass", "classInclude", "labelLeft", "labelLeftClass", "labelLeftBehindToggleButton", "popover", "required", "buttonsLeft", "disableButtonsLeft", "buttonsRight", "disableButtonsRight", "labelRight", "labelRightClass", "labelRightRequired", "hasToggle", "toggleSize", "toggleActive", "toggleDisable", "description", "descriptionClass", "buttonsDescription", "disableButtonsDescription", "buttonsDescriptionContainerClass", "onlyShowCount", "zIndexPopover", "timerDestroyPopover", "count", "limitLength"], outputs: ["outClickButton", "outSwitchEvent", "outLabelRightClick", "outLabelLeftClick"] }, { 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", "fieldGetLabel", "labelPopoverConfig", "labelPopoverFullWidth", "hasContentUnitRight", "listSearchNoDataTemplateRef", "fieldGetImage", "imageSize", "typeShape", "fieldGetIcon", "fieldGetTextAvatar", "fieldGetColorAvatar", "classAvatarInclude", "getLastTextAfterSpace", "linkImageError", "showError", "showBorderError", "disable", "readonly", "labelConfig", "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: LibsUiComponentsPopoverComponent, selector: "libs_ui-components-popover,[LibsUiComponentsPopoverDirective]", inputs: ["debugId", "flagMouse", "type", "mode", "config", "ignoreShowPopover", "elementRefCustom", "classInclude", "ignoreHiddenPopoverContentWhenMouseLeave", "ignoreStopPropagationEvent", "ignoreCursorPointerModeLikeClick", "isAddContentToParentDocument", "ignoreClickOutside"], outputs: ["outEvent", "outChangStageFlagMouse", "outEventPopoverContent", "outFunctionsControl"] }, { kind: "component", type: LibsUiComponentsButtonsSelectColorComponent, selector: "libs_ui-components-buttons-select_color", inputs: ["zIndex", "customOptions", "externalContent", "direction", "button", "applyNow"], outputs: ["zIndexChange", "outColorChange"] }, { kind: "component", type: LibsUiComponentsInputsValidComponent, selector: "libs_ui-components-inputs-valid", inputs: ["item", "labelConfig", "emitEmptyInDataTypeNumber", "ignoreBlockInputMaxValue", "fieldNameBind", "showCount", "typeComponentSelectItem", "valueComponentSelectItem", "disableComponentSelectItem", "tagInput", "dataType", "resetAutoCompletePassword", "textAreaEnterNotNewLine", "hiddenContent", "fixedFloat", "acceptNegativeValue", "valueUpDownNumber", "ignoreWidthInput100", "classIncludeInput", "classContainerInput", "readonly", "disable", "noBorder", "backgroundNone", "useColorModeExist", "placeholder", "keepPlaceholderOnly", "classContainerBottomInput", "autoRemoveEmoji", "defaultHeight", "maxHeightTextArea", "minHeightTextArea", "ignoreShowError", "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"], outputs: ["itemChange", "outValueChange", "outSelect", "outIconLeft", "outIconRight", "outClickButtonLabel", "outSwitchEventLabel", "outLabelRightClick", "outEnterInputEvent", "outHeightAreaChange", "outFunctionsControl", "outFocusAndBlur", "outChangeValueByButtonUpDown"] }, { kind: "component", type: LibsUiComponentsEmojiComponent, selector: "libs_ui-components-emoji", inputs: ["configPopover", "isNgContent", "zIndex", "modePopoverPosition", "classPopup", "classInclude", "classIconInclude"], outputs: ["outEventEmoji", "moFunctionsControl"] }, { 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"], outputs: ["outClick", "outPopoverEvent", "outFunctionsControl"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
688
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: LibsUiComponentsInputsQuillComponent, isStandalone: true, selector: "libs_ui-components-inputs-quill", inputs: { isShowToolBar: { classPropertyName: "isShowToolBar", publicName: "isShowToolBar", isSignal: true, isRequired: false, transformFunction: null }, isToolbarPositonFixed: { classPropertyName: "isToolbarPositonFixed", publicName: "isToolbarPositonFixed", isSignal: true, isRequired: false, transformFunction: null }, classIncludeToolbar: { classPropertyName: "classIncludeToolbar", publicName: "classIncludeToolbar", isSignal: true, isRequired: false, transformFunction: null }, stylesIncludeToolbar: { classPropertyName: "stylesIncludeToolbar", publicName: "stylesIncludeToolbar", isSignal: true, isRequired: false, transformFunction: null }, toolbarConfig: { classPropertyName: "toolbarConfig", publicName: "toolbarConfig", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, item: { classPropertyName: "item", publicName: "item", isSignal: true, isRequired: false, transformFunction: null }, fieldNameBind: { classPropertyName: "fieldNameBind", publicName: "fieldNameBind", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, showErrorLabel: { classPropertyName: "showErrorLabel", publicName: "showErrorLabel", isSignal: true, isRequired: false, transformFunction: null }, showErrorBorder: { classPropertyName: "showErrorBorder", publicName: "showErrorBorder", isSignal: true, isRequired: false, transformFunction: null }, onlyShowErrorBorderInContent: { classPropertyName: "onlyShowErrorBorderInContent", publicName: "onlyShowErrorBorderInContent", isSignal: true, isRequired: false, transformFunction: null }, classIncludeTemplate: { classPropertyName: "classIncludeTemplate", publicName: "classIncludeTemplate", isSignal: true, isRequired: false, transformFunction: null }, classInclude: { classPropertyName: "classInclude", publicName: "classInclude", isSignal: true, isRequired: false, transformFunction: null }, handlersExpand: { classPropertyName: "handlersExpand", publicName: "handlersExpand", isSignal: true, isRequired: false, transformFunction: null }, validRequired: { classPropertyName: "validRequired", publicName: "validRequired", isSignal: true, isRequired: false, transformFunction: null }, validMinLength: { classPropertyName: "validMinLength", publicName: "validMinLength", isSignal: true, isRequired: false, transformFunction: null }, validMaxLength: { classPropertyName: "validMaxLength", publicName: "validMaxLength", isSignal: true, isRequired: false, transformFunction: null }, zIndex: { classPropertyName: "zIndex", publicName: "zIndex", isSignal: true, isRequired: false, transformFunction: null }, dataConfigMention: { classPropertyName: "dataConfigMention", publicName: "dataConfigMention", isSignal: true, isRequired: false, transformFunction: null }, blotsRegister: { classPropertyName: "blotsRegister", publicName: "blotsRegister", isSignal: true, isRequired: false, transformFunction: null }, heightAuto: { classPropertyName: "heightAuto", publicName: "heightAuto", isSignal: true, isRequired: false, transformFunction: null }, autoFocus: { classPropertyName: "autoFocus", publicName: "autoFocus", isSignal: true, isRequired: false, transformFunction: null }, autoFocusBottom: { classPropertyName: "autoFocusBottom", publicName: "autoFocusBottom", isSignal: true, isRequired: false, transformFunction: null }, templateToolBarPersonalize: { classPropertyName: "templateToolBarPersonalize", publicName: "templateToolBarPersonalize", isSignal: true, isRequired: false, transformFunction: null }, template: { classPropertyName: "template", publicName: "template", isSignal: true, isRequired: false, transformFunction: null }, uploadImageConfig: { classPropertyName: "uploadImageConfig", publicName: "uploadImageConfig", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { item: "itemChange", outMessageError: "outMessageError", outBlur: "outBlur", outFocus: "outFocus", outChange: "outChange", outFunctionsControl: "outFunctionsControl", outSelectionChange: "outSelectionChange", outTextChange: "outTextChange", outContextMenu: "outContextMenu" }, viewQueries: [{ propertyName: "wrapperEditorEl", first: true, predicate: ["wrapperEditor"], descendants: true, isSignal: true }, { propertyName: "editorEl", first: true, predicate: ["editor"], descendants: true, isSignal: true }, { propertyName: "quillOptionEl", first: true, predicate: ["quillOption"], descendants: true, isSignal: true }, { propertyName: "quillEditorEl", first: true, predicate: ["quillEditor"], descendants: true, isSignal: true }, { propertyName: "toolbarItemsEl", first: true, predicate: ["toolbarItems"], descendants: true, isSignal: true }, { propertyName: "itemsEl", predicate: ["item"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"flex flex-col w-full h-full\">\n @if (label(); as label) {\n <libs_ui-components-label [classInclude]=\"label.classInclude\"\n [required]=\"label.required\"\n [labelLeft]=\"label.labelLeft\" />\n }\n <div #wrapperEditor\n [attr.heightAuto]=\"heightAuto()\"\n [attr.isToolbarPositonFixed]=\"isToolbarPositonFixed()\"\n class=\"libs-ui-quill-wrapper w-full h-full relative flex flex-col\"\n [class.libs-ui-border-error-general]=\"messageError() && showErrorBorder() && !onlyShowErrorBorderInContent()\"\n [class.rounded-[4px]]=\"messageError() && showErrorBorder() && !onlyShowErrorBorderInContent()\">\n <div #editor\n class=\"libs-ui-quill\"\n [attr.showError]=\"messageError() && showErrorBorder() && onlyShowErrorBorderInContent()\"\n [class.!hidden]=\"!display()\">\n <div #quillOption\n [class.!hidden]=\"!isShowToolBar()\"\n [style]=\"stylesIncludeToolbar()\"\n class=\"bg-[#f8f9fa] {{ isToolbarPositonFixed() ? 'fixed !z-10 px-[8px] py-[4px] p-0 w-[500px] rounded-[4px] bg-[#ffffff] libs-ui-quill-toolbar-animation':'' }} {{ classIncludeToolbar() }}\">\n <ng-container *ngTemplateOutlet=\"toolbar\"></ng-container>\n </div>\n <div #quillEditor\n LibsUiComponentsInputsMentionDirective\n [mentionConfig]=\"dataConfigMention()\"\n (outToggle)=\"handleToggleMention($event)\"\n (outInsertMention)=\"handlerInsertMention($event)\"></div>\n </div>\n @if (template(); as template) {\n <div [class]=\"classIncludeTemplate()\">\n <ng-container *ngTemplateOutlet=\"template\"></ng-container>\n </div>\n }\n </div>\n @if (messageError() && showErrorLabel()) {\n <div class=\"flex items-center leading-normal mt-[8px]\">\n <span class=\"text-[#ff5454] libs-ui-font-h7r\"> {{ messageError() | translate }}</span>\n </div>\n }\n</div>\n\n<ng-template #toolbar>\n <div class=\"toolbar\"\n #toolbarItems>\n <div class=\"ql-formats items-center\">\n @for (option of toolbarOptionsConfig(); track option) {\n <div #item\n [id]=\"option.type+'_'+$index\"\n class=\"items-center\"\n [class.hidden]=\"itemHidden().includes($index) || itemHiddenExpand().includes($index)\"\n [class.flex]=\"!itemHidden().includes($index)\">\n <ng-container *ngTemplateOutlet=\"itemTemplate;context:{option, $index, $last}\"></ng-container>\n </div>\n }\n <div class=\"relative\">\n @if (itemHidden().length) {\n <libs_ui-components-buttons-button [type]=\"showMoreAction() ? 'button-secondary' : 'button-third'\"\n [iconOnlyType]=\"true\"\n [classInclude]=\"'!p-[1px] !h-[20px] ml-[8px]'\"\n [classIconLeft]=\"'libs-ui-icon-move-right rotate-90'\"\n (outClick)=\"handlerChangeShowMoreAction($event)\" />\n }\n <!-- Build toolbar khi click xem th\u00EAm-->\n <div [class.hidden]=\"!showMoreAction() || !itemHidden().length\"\n class=\"absolute bg-[#ffffff] shadow-md z-[1] flex items-center pl-[8px] pr-[16px] py-[4px] rounded-[8px] top-[31px] right-[0px]\">\n @for (option of toolbarOptionsConfig(); track option) {\n <div class=\"items-center\"\n [class.hidden]=\"!itemHidden().includes($index)\"\n [class.flex]=\"itemHidden().includes($index)\">\n <ng-container *ngTemplateOutlet=\"itemTemplate;context:{option, $index, $last}\"></ng-container>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n</ng-template>\n\n\n<ng-template #itemTemplate\n let-$index=\"$index\"\n let-$last=\"$last\"\n let-option=\"option\">\n @if (option.type === 'undo') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button LibsUiComponentsPopoverDirective\n [config]=\"{content: 'i18n_undo', zIndex: 1250}\"\n class=\"ql-undo\"></button>\n </div>\n }\n @if (option.type === 'redo') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button LibsUiComponentsPopoverDirective\n [config]=\"{content: 'i18n_redo', zIndex: 1250}\"\n class=\"ql-redo\"></button>\n </div>\n }\n @if (option.type === 'fontFamily') {\n <div\n class=\"relative w-[117px] h-full bg-[#ffffff] rounded-[4px] libs-ui-border-general {{ option.classInclude || 'mx-[8px]' }}\">\n <libs_ui-components-dropdown [isNgContent]=\"true\"\n [labelPopoverFullWidth]=\"true\"\n [listConfig]=\"listConfigFont()\"\n [listHasButtonUnSelectOption]=\"false\"\n [listHiddenInputSearch]=\"true\"\n [listMaxItemShow]=\"8\"\n [zIndex]=\"1250\"\n (outSelectKey)=\"handleSelectFont($event)\">\n @if (fontSelected(); as fontSelected) {\n <div\n class=\"flex items-center cursor-pointer py-[8px] libs-ui-font-h5r pl-[16px] pr-[40px] {{ option.classInclude || 'mx-[8px]' }}\">\n <libs_ui-components-popover [type]=\"'text'\"\n [ignoreStopPropagationEvent]=\"true\"\n [config]=\"{zIndex:1250}\">\n {{ labelFontSelectedComputed() }}\n </libs_ui-components-popover>\n <i class=\"libs-ui-icon-move-right rotate-90 absolute right-[12px] text-[#6a7383] text-[16px]\"></i>\n </div>\n }\n </libs_ui-components-dropdown>\n </div>\n }\n @if (option.type === 'fontSize') {\n <div class=\"ql-picker {{ option.classInclude || 'mx-[8px]' }}\">\n <libs_ui-components-inputs-valid [dataType]=\"'int'\"\n [(item)]=\"size\"\n [fieldNameBind]=\"'value'\"\n [valueUpDownNumber]=\"1\"\n [maxValueNumber]=\"72\"\n [minValueNumber]=\"8\"\n [readonly]=\"readonly()\"\n [classContainerInput]=\"'w-[72px] h-[32px]'\"\n (outValueChange)=\"handlerValueChange($event)\" />\n </div>\n }\n @if (option.type === 'color') {\n <div class=\"ql-color ql-picker ql-color-picker !flex items-center {{ option.classInclude || 'mx-[8px]' }}\">\n <libs_ui-components-popover [config]=\"{content:'i18n_text_color', zIndex:1250}\">\n <libs_ui-components-buttons-select_color [zIndex]=\"zIndex()\"\n [direction]=\"'top'\"\n [externalContent]=\"true\"\n [applyNow]=\"true\"\n (outColorChange)=\"setStyle('color', $event)\">\n <div\n class=\"libs-ui-icon-editor-color-text libs-ui-buttons-select-color text-[#6a7383] text-[16px] hover:text-[var(--libs-ui-color-light-1)]\">\n </div>\n </libs_ui-components-buttons-select_color>\n </libs_ui-components-popover>\n </div>\n }\n @if (option.type === 'background') {\n <div class=\"ql-background ql-picker ql-color-picker !flex items-center {{ option.classInclude || 'mx-[8px]' }}\">\n <libs_ui-components-popover [config]=\"{content:'i18n_background_color', zIndex:1250}\">\n <libs_ui-components-buttons-select_color [zIndex]=\"zIndex()\"\n [direction]=\"'top'\"\n [externalContent]=\"true\"\n [applyNow]=\"true\"\n (outColorChange)=\"setStyle('background', $event)\">\n <div\n class=\"libs-ui-icon-editor-color-background libs-ui-buttons-select-color text-[#6a7383] text-[16px] hover:text-[var(--libs-ui-color-light-1)]\">\n </div>\n </libs_ui-components-buttons-select_color>\n </libs_ui-components-popover>\n </div>\n }\n @if (option.type === 'bold') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button LibsUiComponentsPopoverDirective\n [config]=\"{content:'i18n_font_weight_bold', zIndex:1250}\"\n class=\"ql-bold\"></button>\n </div>\n }\n @if (option.type === 'italic') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button LibsUiComponentsPopoverDirective\n [config]=\"{content:'i18n_font_style_italic', zIndex:1250}\"\n class=\"ql-italic\"></button>\n </div>\n }\n @if (option.type === 'underline') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button LibsUiComponentsPopoverDirective\n [config]=\"{content:'i18n_text_decoration_underline', zIndex:1250}\"\n class=\"ql-underline\"></button>\n </div>\n }\n @if (option.type === 'strikeThrough') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button LibsUiComponentsPopoverDirective\n [config]=\"{content:'i18n_text_line_through', zIndex:1250}\"\n class=\"ql-strike\"></button>\n </div>\n }\n @if (option.type === 'adjust') {\n <div\n class=\"relative !flex items-center ql-align ql-picker ql-icon-picker !w-max {{ option.classInclude || 'mx-[8px]' }}\">\n <libs_ui-components-popover [config]=\"{content:'i18n_adjust', zIndex:1250}\">\n <libs_ui-components-dropdown [isNgContent]=\"true\"\n [ignoreStopPropagationEvent]=\"true\"\n [labelPopoverFullWidth]=\"true\"\n [listConfig]=\"listConfigAlign()\"\n [listHiddenInputSearch]=\"true\"\n [popoverCustomConfig]=\"{ignoreArrow: true, classInclude: '!w-[32px] overflow-hidden !py-[4px]', position: {mode: 'start', distance: 0}, paddingLeftItem: false}\"\n [listHasButtonUnSelectOption]=\"false\"\n [listMaxItemShow]=\"8\"\n [zIndex]=\"1250\"\n (outSelectKey)=\"handleSelectAlign($event)\">\n @if (alignSelected(); as alignSelected) {\n <div class=\"flex items-center cursor-pointer\">\n <i [class]=\"iconAlignSelectedComputed()\"></i>\n <i class=\"libs-ui-icon-move-right rotate-90 text-[#6a7383] text-[16px] ml-[4px]\"></i>\n </div>\n }\n </libs_ui-components-dropdown>\n </libs_ui-components-popover>\n </div>\n }\n @if (option.type === 'indentIncrease') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button LibsUiComponentsPopoverDirective\n [config]=\"{content:'i18n_indent_increase', zIndex:1250}\"\n class=\"ql-indent\"\n value=\"+1\"></button>\n </div>\n }\n @if (option.type === 'indentDecrease') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button LibsUiComponentsPopoverDirective\n [config]=\"{content:'i18n_indent_decrease', zIndex:1250}\"\n class=\"ql-indent\"\n value=\"-1\"></button>\n </div>\n }\n @if (option.type === 'listBulleted') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button LibsUiComponentsPopoverDirective\n [config]=\"{content:'i18n_list_bulleted', zIndex:1250}\"\n class=\"ql-list ql-bullet\"\n value=\"bullet\"></button>\n </div>\n }\n @if (option.type === 'listNumbered') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button LibsUiComponentsPopoverDirective\n [config]=\"{content:'i18n_list_numbered', zIndex:1250}\"\n class=\"ql-list ql-ordered\"\n value=\"ordered\"></button>\n </div>\n }\n @if (option.type === 'personalize' && templateToolBarPersonalize(); as templateToolBarPersonalize) {\n <div class=\"flex items-center {{ option.classInclude || 'mx-[8px]' }}\">\n <ng-container *ngTemplateOutlet=\"templateToolBarPersonalize\"></ng-container>\n </div>\n }\n @if (option.type === 'blockquote') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button LibsUiComponentsPopoverDirective\n [config]=\"{content:'i18n_quote', zIndex:1250}\"\n class=\"ql-blockquote\"></button>\n </div>\n }\n @if (option.type === 'link') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button LibsUiComponentsPopoverDirective\n [config]=\"{content:'i18n_insert_link', zIndex:1250}\"\n class=\"ql-link\"></button>\n </div>\n }\n @if (option.type === 'unLink') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button LibsUiComponentsPopoverDirective\n [config]=\"{content:'i18n_unlink', zIndex:1250}\"\n class=\"ql-unLink\"></button>\n </div>\n }\n @if (option.type === 'image') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button LibsUiComponentsPopoverDirective\n [config]=\"{content:'i18n_image', zIndex:1250}\"\n class=\"ql-image\"></button>\n </div>\n }\n @if (option.type === 'emoji') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <libs_ui-components-emoji [zIndex]=\"1250\"\n [isNgContent]=\"true\"\n (outEventEmoji)=\"handlerAddEmoji($event)\">\n <button class=\"ql-emoji\"></button>\n </libs_ui-components-emoji>\n </div>\n }\n @if (option.type === 'line') {\n <div class=\"w-[1px] h-[16px] libs-ui-border-right-general\"></div>\n }\n</ng-template>\n\n<libs_ui-components-popover [mode]=\"'click'\"\n [ignoreHiddenPopoverContentWhenMouseLeave]=\"true\"\n [config]=\"{template: viewLink, whiteTheme: true, ignoreArrow: true}\"\n (outEvent)=\"handlerPopoverEvent($event)\"\n (outFunctionsControl)=\"handlerPopoverFunctionControl($event)\" />\n\n<ng-template #viewLink>\n <div class=\"flex justify-between items-center px-[16px] py-[8px] rounded-[8px]\">\n <div class=\"w-full min-w-0 libs-ui-font-h5r\"\n [type]=\"'text'\"\n LibsUiComponentsPopoverDirective>{{ link().url }}</div>\n <div class=\"flex items-center ml-[16px]\">\n <libs_ui-components-buttons-button [type]=\"'button-link-primary'\"\n [iconOnlyType]=\"true\"\n [classIconLeft]=\"'libs-ui-icon-edit-line'\"\n [classInclude]=\"'!p-0'\"\n (outClick)=\"handlerEdit($event)\" />\n <libs_ui-components-buttons-button [type]=\"'button-link-custom'\"\n [buttonCustom]=\"{\n configStepColor: {\n text: '#071631',\n text_hover: '#ee2d41',\n text_active: '#ee2d41',\n text_disable: '071631'\n },\n rootColor: '#071631'\n }\"\n [classInclude]=\"'!p-0 ml-[12px]'\"\n [iconOnlyType]=\"true\"\n [classIconLeft]=\"'libs-ui-icon-link-broken'\"\n (outClick)=\"handlerUnlink($event)\" />\n </div>\n </div>\n</ng-template>\n", styles: ["@-webkit-keyframes animation-move{0%{transform:translateY(-12px)}to{transform:translateY(0)}}@keyframes animation-move{0%{transform:translateY(-12px)}to{transform:translateY(0)}}.libs-ui-quill{height:100%;width:100%;display:flex;flex-direction:column}.libs-ui-quill-toolbar-animation{animation:animation-move .4s ease}.libs-ui-quill-wrapper[heightAuto=true]{overflow:auto}.libs-ui-quill-wrapper[heightAuto=true] .libs-ui-quill{height:auto}.libs-ui-quill-wrapper[heightAuto=true] .libs-ui-quill ::ng-deep .ql-container{height:auto}.libs-ui-quill-wrapper[heightAuto=true] .libs-ui-quill ::ng-deep .ql-container .ql-editor{position:relative!important}.libs-ui-quill-wrapper[isToolbarPositonFixed=true] .libs-ui-quill ::ng-deep .ql-container.ql-snow{border:0px!important}.libs-ui-quill-wrapper[isToolbarPositonFixed=false] .libs-ui-quill ::ng-deep .ql-container.ql-snow{border:solid 1px #e6e8ed!important;border-radius:0 0 4px 4px}.libs-ui-quill-wrapper[isToolbarPositonFixed=false] .libs-ui-quill ::ng-deep .ql-toolbar.ql-snow{border:solid 1px #e6e8ed!important;border-radius:4px 4px 0 0;border-bottom:unset!important}.libs-ui-quill-wrapper[isToolbarPositonFixed=false] .libs-ui-quill[showError=true] ::ng-deep .ql-container.ql-snow{border:solid 1px #ee2d41!important}:host ::ng-deep .toolbar,:host ::ng-deep .ql-formats{position:relative;width:100%}:host ::ng-deep .ql-toolbar.ql-snow .ql-formats{display:flex}:host ::ng-deep .ql-container.ql-snow{width:100%;height:100%;position:relative}:host ::ng-deep .ql-editor{font-family:var(--libs-ui-font-family-name),\"Arial, Helvetica, sans-serif\"!important;font-weight:400}:host ::ng-deep .ql-editor b{font-family:var(--libs-ui-font-family-name),\"Arial, Helvetica, sans-serif\"!important;font-weight:600}:host ::ng-deep .ql-toolbar.ql-snow{border:none;border-radius:8px;padding:4px 16px}:host ::ng-deep .ql-toolbar.ql-snow .ql-picker-label{color:#071631;border:none!important;margin-top:5px}:host ::ng-deep .ql-toolbar.ql-snow .ql-picker-label:hover{color:var(--libs-ui-color-light-1)!important}:host ::ng-deep .ql-toolbar.ql-snow .ql-picker-label:hover .ql-stroke{stroke:var(--libs-ui-color-light-1)!important}:host ::ng-deep .ql-snow.ql-toolbar .ql-picker-item:hover{color:var(--libs-ui-color-light-1)!important}:host ::ng-deep .ql-snow.ql-toolbar .ql-picker-label.ql-active{color:#071631}:host ::ng-deep .ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-stroke{stroke:#071631}:host ::ng-deep .ql-editor{height:100%;width:100%;position:absolute;line-height:1.42!important}:host ::ng-deep .ql-editor:before{font-family:var(--libs-ui-font-family-name),\"Arial, Helvetica, sans-serif\"!important;color:#9ca2ad!important;font-size:12px}:host ::ng-deep .ql-editor img{height:auto;max-width:100%}:host ::ng-deep .ql-toolbar.ql-snow .ql-picker.ql-expanded .ql-picker-label{border:none!important}:host ::ng-deep .ql-snow .ql-picker.ql-bold{width:36px!important}:host ::ng-deep .ql-editor.ql-blank{font-size:11px!important;letter-spacing:.05px;font-family:var(--libs-ui-font-family-name),\"Arial, Helvetica, sans-serif\"!important;line-height:16px}:host ::ng-deep .ql-editor.ql-blank:before{font-style:normal!important;color:#9ca2ad!important}:host ::ng-deep .ql-snow.ql-toolbar .ql-picker-label :hover{color:red!important}:host ::ng-deep .ql-formats{margin-right:12px!important}:host ::ng-deep .ql-formats .ql-size.ql-picker,:host ::ng-deep .ql-formats .ql-header.ql-picker,:host ::ng-deep .ql-formats .ql-font.ql-picker{border:solid 1px #e6e8ed!important;border-radius:4px}:host ::ng-deep .ql-formats .ql-align.ql-picker .ql-picker-label{width:24px}:host ::ng-deep .ql-formats .ql-align.ql-picker .ql-picker-label:hover{color:red!important}:host ::ng-deep .ql-formats .ql-header.ql-picker .ql-picker-label:before{font-size:12px}:host ::ng-deep .ql-picker-item:before{font-size:12px}:host ::ng-deep .ql-picker-label:before{font-size:12px}:host ::ng-deep .ql-snow.ql-toolbar button,:host ::ng-deep .ql-snow .ql-toolbar button{background:none;border:none;cursor:pointer;display:flex;align-items:center;float:none;padding:0;width:inherit}:host ::ng-deep ul{padding-left:1rem!important}:host ::ng-deep li{padding-left:0!important}:host ::ng-deep .ql-tooltip{display:none!important}.ql-picker-options{max-height:130px;overflow-y:auto}.ql-snow .ql-picker.ql-size{border:1px solid #e6e7ea;box-shadow:#00000005 0 1px 3px,#1b1f2326 0 0 0 1px;border-radius:2px}.ql-snow .ql-picker.ql-font{border:1px solid #e6e7ea!important;margin-right:8px;border-radius:4px}.ql-snow .ql-picker.ql-font .ql-picker-options:before{font-size:12px}.ql-snow .ql-picker.ql-font .ql-picker-label:before{font-size:12px}.ql-font-Arial{font-family:Arial}.ql-font-sans-serif{font-family:\"sans-serif\"}.ql-font-Helvetica{font-family:Helvetica}.libs-ui-quill-mention{font-weight:500!important;color:#7239ea;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:var(--libs-ui-font-family-name),\"Arial, Helvetica, sans-serif\"!important;font-weight:600}.ql-snow .ql-picker.ql-expanded .ql-picker-options{overflow:hidden}.ql-formats{margin-right:0!important}.ql-formats .ql-header{position:relative!important}.ql-formats .ql-header .ql-picker-options{position:absolute!important;top:-151px!important}.ql-formats .ql-font{position:relative!important}.ql-formats .ql-font .ql-picker-options{position:absolute!important;top:-93px!important}.ql-formats .ql-color{position:relative!important}.ql-formats .ql-color .ql-picker-options{position:absolute!important;top:-108px}.ql-formats .ql-background{position:relative!important}.ql-formats .ql-background .ql-picker-options{position:absolute!important;top:-108px}.ql-formats .ql-align{position:relative!important}.ql-formats .ql-align .ql-picker-label{padding:3px 4px!important}.ql-formats .ql-align .ql-picker-options{position:absolute!important;top:-106px}.ql-snow .ql-picker{font-size:12px!important;height:32px;float:none;width:auto}\n"], dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: LibsUiComponentsInputsMentionDirective, selector: "[LibsUiComponentsInputsMentionDirective]", inputs: ["mentionConfig", "mentionListTemplate"], outputs: ["outSearchTerm", "outItemSelected", "outToggle", "outInsertMention", "outFunctionControl"] }, { kind: "component", type: LibsUiComponentsLabelComponent, selector: "libs_ui-components-label", inputs: ["iconPopoverClass", "classInclude", "labelLeft", "labelLeftClass", "labelLeftBehindToggleButton", "popover", "required", "buttonsLeft", "disableButtonsLeft", "buttonsRight", "disableButtonsRight", "labelRight", "labelRightClass", "labelRightRequired", "hasToggle", "toggleSize", "toggleActive", "toggleDisable", "description", "descriptionClass", "buttonsDescription", "disableButtonsDescription", "buttonsDescriptionContainerClass", "onlyShowCount", "zIndexPopover", "timerDestroyPopover", "count", "limitLength"], outputs: ["outClickButton", "outSwitchEvent", "outLabelRightClick", "outLabelLeftClick"] }, { 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", "fieldGetLabel", "labelPopoverConfig", "labelPopoverFullWidth", "hasContentUnitRight", "listSearchNoDataTemplateRef", "fieldGetImage", "imageSize", "typeShape", "fieldGetIcon", "fieldGetTextAvatar", "fieldGetColorAvatar", "classAvatarInclude", "getLastTextAfterSpace", "linkImageError", "showError", "showBorderError", "disable", "readonly", "labelConfig", "disableLabel", "listSearchConfig", "isSearchOnline", "listHiddenInputSearch", "listSearchPadding", "listKeySearch", "listDividerClassInclude", "listConfig", "listButtonsOther", "listHasButtonUnSelectOption", "listClickExactly", "listBackgroundCustom", "listMaxItemShow", "listKeySelected", "listMultiKeySelected", "listKeysDisable", "listKeysHidden", "validRequired", "validMaxItemSelected", "changeValidUndefinedResetError", "allowSelectItemMultiple", "focusInputSearch", "onlyEmitDataWhenReset", "resetKeyWhenSelectAllKey", "listConfigHasDivider", "classIncludeIcon", "classIncludeContent", "listIgnoreClassDisableDefaultWhenUseKeysDisableItem", "tabKeyActive", "tabsConfig", "ignoreBorderBottom"], outputs: ["flagMouseChange", "flagMouseContentChange", "lengthKeysChange", "showBorderErrorChange", "listKeySelectedChange", "listMultiKeySelectedChange", "tabKeyActiveChange", "outSelectKey", "outSelectMultiKey", "outFunctionsControl", "outValidEvent", "outChangStageFlagMouse", "outDataChange", "outClickButtonOther", "outShowList", "outChangeTabKeyActive"] }, { kind: "component", type: LibsUiComponentsPopoverComponent, selector: "libs_ui-components-popover,[LibsUiComponentsPopoverDirective]", inputs: ["debugId", "flagMouse", "type", "mode", "config", "ignoreShowPopover", "elementRefCustom", "classInclude", "ignoreHiddenPopoverContentWhenMouseLeave", "ignoreStopPropagationEvent", "ignoreCursorPointerModeLikeClick", "isAddContentToParentDocument", "ignoreClickOutside"], outputs: ["outEvent", "outChangStageFlagMouse", "outEventPopoverContent", "outFunctionsControl"] }, { kind: "component", type: LibsUiComponentsButtonsSelectColorComponent, selector: "libs_ui-components-buttons-select_color", inputs: ["zIndex", "customOptions", "externalContent", "direction", "button", "applyNow"], outputs: ["zIndexChange", "outColorChange"] }, { kind: "component", type: LibsUiComponentsInputsValidComponent, selector: "libs_ui-components-inputs-valid", inputs: ["item", "labelConfig", "emitEmptyInDataTypeNumber", "ignoreBlockInputMaxValue", "fieldNameBind", "showCount", "typeComponentSelectItem", "valueComponentSelectItem", "disableComponentSelectItem", "tagInput", "dataType", "resetAutoCompletePassword", "textAreaEnterNotNewLine", "hiddenContent", "fixedFloat", "acceptNegativeValue", "valueUpDownNumber", "ignoreWidthInput100", "classIncludeInput", "classContainerInput", "readonly", "disable", "noBorder", "backgroundNone", "useColorModeExist", "placeholder", "keepPlaceholderOnly", "classContainerBottomInput", "autoRemoveEmoji", "defaultHeight", "maxHeightTextArea", "minHeightTextArea", "ignoreShowError", "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"], outputs: ["itemChange", "outValueChange", "outSelect", "outIconLeft", "outIconRight", "outClickButtonLabel", "outSwitchEventLabel", "outLabelRightClick", "outEnterInputEvent", "outHeightAreaChange", "outFunctionsControl", "outFocusAndBlur", "outChangeValueByButtonUpDown"] }, { kind: "component", type: LibsUiComponentsEmojiComponent, selector: "libs_ui-components-emoji", inputs: ["configPopover", "isNgContent", "zIndex", "modePopoverPosition", "classPopup", "classInclude", "classIconInclude"], outputs: ["outEventEmoji", "moFunctionsControl"] }, { 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"], outputs: ["outClick", "outPopoverEvent", "outFunctionsControl"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
688
689
|
}
|
|
689
690
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LibsUiComponentsInputsQuillComponent, decorators: [{
|
|
690
691
|
type: Component,
|
|
@@ -694,6 +695,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
694
695
|
LibsUiComponentsPopoverComponent, LibsUiComponentsButtonsSelectColorComponent,
|
|
695
696
|
LibsUiComponentsInputsValidComponent, LibsUiComponentsEmojiComponent,
|
|
696
697
|
LibsUiComponentsButtonsButtonComponent
|
|
697
|
-
], template: "<div class=\"flex flex-col w-full h-full\">\n @if (label(); as label) {\n <libs_ui-components-label [classInclude]=\"label.classInclude\"\n [required]=\"label.required\"\n [labelLeft]=\"label.labelLeft\" />\n }\n <div #wrapperEditor\n [attr.heightAuto]=\"heightAuto()\"\n [attr.isToolbarPositonFixed]=\"isToolbarPositonFixed()\"\n class=\"libs-ui-quill-wrapper w-full h-full relative flex flex-col\"\n [class.libs-ui-border-error-general]=\"messageError() && showErrorBorder() && !onlyShowErrorBorderInContent()\"\n [class.rounded-[4px]]=\"messageError() && showErrorBorder() && !onlyShowErrorBorderInContent()\">\n <div #editor\n class=\"libs-ui-quill\"\n [attr.showError]=\"messageError() && showErrorBorder() && onlyShowErrorBorderInContent()\"\n [class.!hidden]=\"!display()\">\n <div #quillOption\n [class.!hidden]=\"!isShowToolBar()\"\n class=\"bg-[#f8f9fa] {{isToolbarPositonFixed() ? 'fixed px-[8px] py-[4px] p-0 w-[500px] rounded-[4px] bg-[#ffffff] libs-ui-quill-toolbar-animation':''}} {{ classIncludeToolbar() }}\">\n <ng-container *ngTemplateOutlet=\"toolbar\"></ng-container>\n </div>\n <div #quillEditor\n LibsUiComponentsInputsMentionDirective\n [mentionConfig]=\"dataConfigMention()\"\n (outToggle)=\"handleToggleMention($event)\"\n (outInsertMention)=\"handlerInsertMention($event)\"></div>\n </div>\n @if (template(); as template) {\n <div [class]=\"classIncludeTemplate()\">\n <ng-container *ngTemplateOutlet=\"template\"></ng-container>\n </div>\n }\n </div>\n @if (messageError() && showErrorLabel()) {\n <div class=\"flex items-center leading-normal mt-[8px]\">\n <span class=\"text-[#ff5454] libs-ui-font-h7r\"> {{ messageError() | translate }}</span>\n </div>\n }\n</div>\n\n<ng-template #toolbar>\n <div class=\"toolbar\"\n #toolbarItems>\n <div class=\"ql-formats items-center\">\n @for (option of toolbarOptionsConfig(); track option) {\n <div #item\n [id]=\"option.type+'_'+$index\"\n class=\"items-center\"\n [class.hidden]=\"itemHidden().includes($index) || itemHiddenExpand().includes($index)\"\n [class.flex]=\"!itemHidden().includes($index)\">\n <ng-container *ngTemplateOutlet=\"itemTemplate;context:{option, $index, $last}\"></ng-container>\n </div>\n }\n <div class=\"relative\">\n @if (itemHidden().length) {\n <libs_ui-components-buttons-button [type]=\"showMoreAction() ? 'button-secondary' : 'button-third'\"\n [iconOnlyType]=\"true\"\n [classInclude]=\"'!p-[1px] !h-[20px] ml-[8px]'\"\n [classIconLeft]=\"'libs-ui-icon-move-right rotate-90'\"\n (outClick)=\"handlerChangeShowMoreAction($event)\" />\n }\n <!-- Build toolbar khi click xem th\u00EAm-->\n <div [class.hidden]=\"!showMoreAction() || !itemHidden().length\"\n class=\"absolute bg-[#ffffff] shadow-md z-[1] flex items-center pl-[8px] pr-[16px] py-[4px] rounded-[8px] top-[31px] right-[0px]\">\n @for (option of toolbarOptionsConfig(); track option) {\n <div class=\"items-center\"\n [class.hidden]=\"!itemHidden().includes($index)\"\n [class.flex]=\"itemHidden().includes($index)\">\n <ng-container *ngTemplateOutlet=\"itemTemplate;context:{option, $index, $last}\"></ng-container>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n</ng-template>\n\n\n<ng-template #itemTemplate\n let-$index=\"$index\"\n let-$last=\"$last\"\n let-option=\"option\">\n @if (option.type === 'undo') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button LibsUiComponentsPopoverDirective\n [config]=\"{content: 'i18n_undo', zIndex: 1250}\"\n class=\"ql-undo\"></button>\n </div>\n }\n @if (option.type === 'redo') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button LibsUiComponentsPopoverDirective\n [config]=\"{content: 'i18n_redo', zIndex: 1250}\"\n class=\"ql-redo\"></button>\n </div>\n }\n @if (option.type === 'fontFamily') {\n <div\n class=\"relative w-[117px] h-full bg-[#ffffff] rounded-[4px] libs-ui-border-general {{ option.classInclude || 'mx-[8px]' }}\">\n <libs_ui-components-dropdown [isNgContent]=\"true\"\n [labelPopoverFullWidth]=\"true\"\n [listConfig]=\"listConfigFont()\"\n [listHasButtonUnSelectOption]=\"false\"\n [listHiddenInputSearch]=\"true\"\n [listMaxItemShow]=\"8\"\n [zIndex]=\"1250\"\n (outSelectKey)=\"handleSelectFont($event)\">\n @if (fontSelected(); as fontSelected) {\n <div\n class=\"flex items-center cursor-pointer py-[8px] libs-ui-font-h5r pl-[16px] pr-[40px] {{ option.classInclude || 'mx-[8px]' }}\">\n <libs_ui-components-popover [type]=\"'text'\"\n [ignoreStopPropagationEvent]=\"true\"\n [config]=\"{zIndex:1250}\">\n {{ labelFontSelectedComputed() }}\n </libs_ui-components-popover>\n <i class=\"libs-ui-icon-move-right rotate-90 absolute right-[12px] text-[#6a7383] text-[16px]\"></i>\n </div>\n }\n </libs_ui-components-dropdown>\n </div>\n }\n @if (option.type === 'fontSize') {\n <div class=\"ql-picker {{ option.classInclude || 'mx-[8px]' }}\">\n <libs_ui-components-inputs-valid [dataType]=\"'int'\"\n [(item)]=\"size\"\n [fieldNameBind]=\"'value'\"\n [valueUpDownNumber]=\"1\"\n [maxValueNumber]=\"72\"\n [minValueNumber]=\"8\"\n [readonly]=\"readonly()\"\n [classContainerInput]=\"'w-[72px] h-[32px]'\"\n (outValueChange)=\"handlerValueChange($event)\" />\n </div>\n }\n @if (option.type === 'color') {\n <div class=\"ql-color ql-picker ql-color-picker !flex items-center {{ option.classInclude || 'mx-[8px]' }}\">\n <libs_ui-components-popover [config]=\"{content:'i18n_text_color', zIndex:1250}\">\n <libs_ui-components-buttons-select_color [zIndex]=\"zIndex()\"\n [direction]=\"'top'\"\n [externalContent]=\"true\"\n [applyNow]=\"true\"\n (outColorChange)=\"setStyle('color', $event)\">\n <div\n class=\"libs-ui-icon-editor-color-text libs-ui-buttons-select-color text-[#6a7383] text-[16px] hover:text-[var(--libs-ui-color-light-1)]\">\n </div>\n </libs_ui-components-buttons-select_color>\n </libs_ui-components-popover>\n </div>\n }\n @if (option.type === 'background') {\n <div class=\"ql-background ql-picker ql-color-picker !flex items-center {{ option.classInclude || 'mx-[8px]' }}\">\n <libs_ui-components-popover [config]=\"{content:'i18n_background_color', zIndex:1250}\">\n <libs_ui-components-buttons-select_color [zIndex]=\"zIndex()\"\n [direction]=\"'top'\"\n [externalContent]=\"true\"\n [applyNow]=\"true\"\n (outColorChange)=\"setStyle('background', $event)\">\n <div\n class=\"libs-ui-icon-editor-color-background libs-ui-buttons-select-color text-[#6a7383] text-[16px] hover:text-[var(--libs-ui-color-light-1)]\">\n </div>\n </libs_ui-components-buttons-select_color>\n </libs_ui-components-popover>\n </div>\n }\n @if (option.type === 'bold') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button LibsUiComponentsPopoverDirective\n [config]=\"{content:'i18n_font_weight_bold', zIndex:1250}\"\n class=\"ql-bold\"></button>\n </div>\n }\n @if (option.type === 'italic') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button LibsUiComponentsPopoverDirective\n [config]=\"{content:'i18n_font_style_italic', zIndex:1250}\"\n class=\"ql-italic\"></button>\n </div>\n }\n @if (option.type === 'underline') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button LibsUiComponentsPopoverDirective\n [config]=\"{content:'i18n_text_decoration_underline', zIndex:1250}\"\n class=\"ql-underline\"></button>\n </div>\n }\n @if (option.type === 'strikeThrough') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button LibsUiComponentsPopoverDirective\n [config]=\"{content:'i18n_text_line_through', zIndex:1250}\"\n class=\"ql-strike\"></button>\n </div>\n }\n @if (option.type === 'adjust') {\n <div\n class=\"relative !flex items-center ql-align ql-picker ql-icon-picker !w-max {{ option.classInclude || 'mx-[8px]' }}\">\n <libs_ui-components-popover [config]=\"{content:'i18n_adjust', zIndex:1250}\">\n <libs_ui-components-dropdown [isNgContent]=\"true\"\n [ignoreStopPropagationEvent]=\"true\"\n [labelPopoverFullWidth]=\"true\"\n [listConfig]=\"listConfigAlign()\"\n [listHiddenInputSearch]=\"true\"\n [popoverCustomConfig]=\"{ignoreArrow: true, classInclude: '!w-[32px] overflow-hidden !py-[4px]', position: {mode: 'start', distance: 0}, paddingLeftItem: false}\"\n [listHasButtonUnSelectOption]=\"false\"\n [listMaxItemShow]=\"8\"\n [zIndex]=\"1250\"\n (outSelectKey)=\"handleSelectAlign($event)\">\n @if (alignSelected(); as alignSelected) {\n <div class=\"flex items-center cursor-pointer\">\n <i [class]=\"iconAlignSelectedComputed()\"></i>\n <i class=\"libs-ui-icon-move-right rotate-90 text-[#6a7383] text-[16px] ml-[4px]\"></i>\n </div>\n }\n </libs_ui-components-dropdown>\n </libs_ui-components-popover>\n </div>\n }\n @if (option.type === 'indentIncrease') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button LibsUiComponentsPopoverDirective\n [config]=\"{content:'i18n_indent_increase', zIndex:1250}\"\n class=\"ql-indent\"\n value=\"+1\"></button>\n </div>\n }\n @if (option.type === 'indentDecrease') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button LibsUiComponentsPopoverDirective\n [config]=\"{content:'i18n_indent_decrease', zIndex:1250}\"\n class=\"ql-indent\"\n value=\"-1\"></button>\n </div>\n }\n @if (option.type === 'listBulleted') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button LibsUiComponentsPopoverDirective\n [config]=\"{content:'i18n_list_bulleted', zIndex:1250}\"\n class=\"ql-list ql-bullet\"\n value=\"bullet\"></button>\n </div>\n }\n @if (option.type === 'listNumbered') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button LibsUiComponentsPopoverDirective\n [config]=\"{content:'i18n_list_numbered', zIndex:1250}\"\n class=\"ql-list ql-ordered\"\n value=\"ordered\"></button>\n </div>\n }\n @if (option.type === 'personalize' && templateToolBarPersonalize(); as templateToolBarPersonalize) {\n <div class=\"flex items-center {{ option.classInclude || 'mx-[8px]' }}\">\n <ng-container *ngTemplateOutlet=\"templateToolBarPersonalize\"></ng-container>\n </div>\n }\n @if (option.type === 'blockquote') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button LibsUiComponentsPopoverDirective\n [config]=\"{content:'i18n_quote', zIndex:1250}\"\n class=\"ql-blockquote\"></button>\n </div>\n }\n @if (option.type === 'link') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button LibsUiComponentsPopoverDirective\n [config]=\"{content:'i18n_insert_link', zIndex:1250}\"\n class=\"ql-link\"></button>\n </div>\n }\n @if (option.type === 'unLink') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button LibsUiComponentsPopoverDirective\n [config]=\"{content:'i18n_unlink', zIndex:1250}\"\n class=\"ql-unLink\"></button>\n </div>\n }\n @if (option.type === 'image') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button LibsUiComponentsPopoverDirective\n [config]=\"{content:'i18n_image', zIndex:1250}\"\n class=\"ql-image\"></button>\n </div>\n }\n @if (option.type === 'emoji') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <libs_ui-components-emoji [zIndex]=\"1250\"\n [isNgContent]=\"true\"\n (outEventEmoji)=\"handlerAddEmoji($event)\">\n <button class=\"ql-emoji\"></button>\n </libs_ui-components-emoji>\n </div>\n }\n @if (option.type === 'line') {\n <div class=\"w-[1px] h-[16px] libs-ui-border-right-general\"></div>\n }\n</ng-template>\n\n<libs_ui-components-popover [mode]=\"'click'\"\n [ignoreHiddenPopoverContentWhenMouseLeave]=\"true\"\n [config]=\"{template: viewLink, whiteTheme: true, ignoreArrow: true}\"\n (outEvent)=\"handlerPopoverEvent($event)\"\n (outFunctionsControl)=\"handlerPopoverFunctionControl($event)\" />\n\n<ng-template #viewLink>\n <div class=\"flex justify-between items-center px-[16px] py-[8px] rounded-[8px]\">\n <div class=\"w-full min-w-0 libs-ui-font-h5r\"\n [type]=\"'text'\"\n LibsUiComponentsPopoverDirective>{{ link().url }}</div>\n <div class=\"flex items-center ml-[16px]\">\n <libs_ui-components-buttons-button [type]=\"'button-link-primary'\"\n [iconOnlyType]=\"true\"\n [classIconLeft]=\"'libs-ui-icon-edit-line'\"\n [classInclude]=\"'!p-0'\"\n (outClick)=\"handlerEdit($event)\" />\n <libs_ui-components-buttons-button [type]=\"'button-link-custom'\"\n [buttonCustom]=\"{\n configStepColor: {\n text: '#071631',\n text_hover: '#ee2d41',\n text_active: '#ee2d41',\n text_disable: '071631'\n },\n rootColor: '#071631'\n }\"\n [classInclude]=\"'!p-0 ml-[12px]'\"\n [iconOnlyType]=\"true\"\n [classIconLeft]=\"'libs-ui-icon-link-broken'\"\n (outClick)=\"handlerUnlink($event)\" />\n </div>\n </div>\n</ng-template>\n", styles: ["@-webkit-keyframes animation-move{0%{transform:translateY(-12px)}to{transform:translateY(0)}}@keyframes animation-move{0%{transform:translateY(-12px)}to{transform:translateY(0)}}.libs-ui-quill{height:100%;width:100%;display:flex;flex-direction:column}.libs-ui-quill-toolbar-animation{animation:animation-move .4s ease}.libs-ui-quill-wrapper[heightAuto=true]{overflow:auto}.libs-ui-quill-wrapper[heightAuto=true] .libs-ui-quill{height:auto}.libs-ui-quill-wrapper[heightAuto=true] .libs-ui-quill ::ng-deep .ql-container{height:auto}.libs-ui-quill-wrapper[heightAuto=true] .libs-ui-quill ::ng-deep .ql-container .ql-editor{position:relative!important}.libs-ui-quill-wrapper[isToolbarPositonFixed=true] .libs-ui-quill ::ng-deep .ql-container.ql-snow{border:0px!important}.libs-ui-quill-wrapper[isToolbarPositonFixed=false] .libs-ui-quill ::ng-deep .ql-container.ql-snow{border:solid 1px #e6e8ed!important;border-radius:0 0 4px 4px}.libs-ui-quill-wrapper[isToolbarPositonFixed=false] .libs-ui-quill ::ng-deep .ql-toolbar.ql-snow{border:solid 1px #e6e8ed!important;border-radius:4px 4px 0 0;border-bottom:unset!important}.libs-ui-quill-wrapper[isToolbarPositonFixed=false] .libs-ui-quill[showError=true] ::ng-deep .ql-container.ql-snow{border:solid 1px #ee2d41!important}:host ::ng-deep .toolbar,:host ::ng-deep .ql-formats{position:relative;width:100%}:host ::ng-deep .ql-toolbar.ql-snow .ql-formats{display:flex}:host ::ng-deep .ql-container.ql-snow{width:100%;height:100%;position:relative}:host ::ng-deep .ql-editor{font-family:var(--libs-ui-font-family-name),\"Arial, Helvetica, sans-serif\"!important;font-weight:400}:host ::ng-deep .ql-editor b{font-family:var(--libs-ui-font-family-name),\"Arial, Helvetica, sans-serif\"!important;font-weight:600}:host ::ng-deep .ql-toolbar.ql-snow{border:none;border-radius:8px;padding:4px 16px}:host ::ng-deep .ql-toolbar.ql-snow .ql-picker-label{color:#071631;border:none!important;margin-top:5px}:host ::ng-deep .ql-toolbar.ql-snow .ql-picker-label:hover{color:var(--libs-ui-color-light-1)!important}:host ::ng-deep .ql-toolbar.ql-snow .ql-picker-label:hover .ql-stroke{stroke:var(--libs-ui-color-light-1)!important}:host ::ng-deep .ql-snow.ql-toolbar .ql-picker-item:hover{color:var(--libs-ui-color-light-1)!important}:host ::ng-deep .ql-snow.ql-toolbar .ql-picker-label.ql-active{color:#071631}:host ::ng-deep .ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-stroke{stroke:#071631}:host ::ng-deep .ql-editor{height:100%;width:100%;position:absolute;line-height:1.42!important}:host ::ng-deep .ql-editor:before{font-family:var(--libs-ui-font-family-name),\"Arial, Helvetica, sans-serif\"!important;color:#9ca2ad!important;font-size:12px}:host ::ng-deep .ql-editor img{height:auto;max-width:100%}:host ::ng-deep .ql-toolbar.ql-snow .ql-picker.ql-expanded .ql-picker-label{border:none!important}:host ::ng-deep .ql-snow .ql-picker.ql-bold{width:36px!important}:host ::ng-deep .ql-editor.ql-blank{font-size:11px!important;letter-spacing:.05px;font-family:var(--libs-ui-font-family-name),\"Arial, Helvetica, sans-serif\"!important;line-height:16px}:host ::ng-deep .ql-editor.ql-blank:before{font-style:normal!important;color:#9ca2ad!important}:host ::ng-deep .ql-snow.ql-toolbar .ql-picker-label :hover{color:red!important}:host ::ng-deep .ql-formats{margin-right:12px!important}:host ::ng-deep .ql-formats .ql-size.ql-picker,:host ::ng-deep .ql-formats .ql-header.ql-picker,:host ::ng-deep .ql-formats .ql-font.ql-picker{border:solid 1px #e6e8ed!important;border-radius:4px}:host ::ng-deep .ql-formats .ql-align.ql-picker .ql-picker-label{width:24px}:host ::ng-deep .ql-formats .ql-align.ql-picker .ql-picker-label:hover{color:red!important}:host ::ng-deep .ql-formats .ql-header.ql-picker .ql-picker-label:before{font-size:12px}:host ::ng-deep .ql-picker-item:before{font-size:12px}:host ::ng-deep .ql-picker-label:before{font-size:12px}:host ::ng-deep .ql-snow.ql-toolbar button,:host ::ng-deep .ql-snow .ql-toolbar button{background:none;border:none;cursor:pointer;display:flex;align-items:center;float:none;padding:0;width:inherit}:host ::ng-deep ul{padding-left:1rem!important}:host ::ng-deep li{padding-left:0!important}:host ::ng-deep .ql-tooltip{display:none!important}.ql-picker-options{max-height:130px;overflow-y:auto}.ql-snow .ql-picker.ql-size{border:1px solid #e6e7ea;box-shadow:#00000005 0 1px 3px,#1b1f2326 0 0 0 1px;border-radius:2px}.ql-snow .ql-picker.ql-font{border:1px solid #e6e7ea!important;margin-right:8px;border-radius:4px}.ql-snow .ql-picker.ql-font .ql-picker-options:before{font-size:12px}.ql-snow .ql-picker.ql-font .ql-picker-label:before{font-size:12px}.ql-font-Arial{font-family:Arial}.ql-font-sans-serif{font-family:\"sans-serif\"}.ql-font-Helvetica{font-family:Helvetica}.libs-ui-quill-mention{font-weight:500!important;color:#7239ea;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:var(--libs-ui-font-family-name),\"Arial, Helvetica, sans-serif\"!important;font-weight:600}.ql-snow .ql-picker.ql-expanded .ql-picker-options{overflow:hidden}.ql-formats{margin-right:0!important}.ql-formats .ql-header{position:relative!important}.ql-formats .ql-header .ql-picker-options{position:absolute!important;top:-151px!important}.ql-formats .ql-font{position:relative!important}.ql-formats .ql-font .ql-picker-options{position:absolute!important;top:-93px!important}.ql-formats .ql-color{position:relative!important}.ql-formats .ql-color .ql-picker-options{position:absolute!important;top:-108px}.ql-formats .ql-background{position:relative!important}.ql-formats .ql-background .ql-picker-options{position:absolute!important;top:-108px}.ql-formats .ql-align{position:relative!important}.ql-formats .ql-align .ql-picker-label{padding:3px 4px!important}.ql-formats .ql-align .ql-picker-options{position:absolute!important;top:-106px}.ql-snow .ql-picker{font-size:12px!important;height:32px;float:none;width:auto}\n"] }]
|
|
698
|
+
], template: "<div class=\"flex flex-col w-full h-full\">\n @if (label(); as label) {\n <libs_ui-components-label [classInclude]=\"label.classInclude\"\n [required]=\"label.required\"\n [labelLeft]=\"label.labelLeft\" />\n }\n <div #wrapperEditor\n [attr.heightAuto]=\"heightAuto()\"\n [attr.isToolbarPositonFixed]=\"isToolbarPositonFixed()\"\n class=\"libs-ui-quill-wrapper w-full h-full relative flex flex-col\"\n [class.libs-ui-border-error-general]=\"messageError() && showErrorBorder() && !onlyShowErrorBorderInContent()\"\n [class.rounded-[4px]]=\"messageError() && showErrorBorder() && !onlyShowErrorBorderInContent()\">\n <div #editor\n class=\"libs-ui-quill\"\n [attr.showError]=\"messageError() && showErrorBorder() && onlyShowErrorBorderInContent()\"\n [class.!hidden]=\"!display()\">\n <div #quillOption\n [class.!hidden]=\"!isShowToolBar()\"\n [style]=\"stylesIncludeToolbar()\"\n class=\"bg-[#f8f9fa] {{ isToolbarPositonFixed() ? 'fixed !z-10 px-[8px] py-[4px] p-0 w-[500px] rounded-[4px] bg-[#ffffff] libs-ui-quill-toolbar-animation':'' }} {{ classIncludeToolbar() }}\">\n <ng-container *ngTemplateOutlet=\"toolbar\"></ng-container>\n </div>\n <div #quillEditor\n LibsUiComponentsInputsMentionDirective\n [mentionConfig]=\"dataConfigMention()\"\n (outToggle)=\"handleToggleMention($event)\"\n (outInsertMention)=\"handlerInsertMention($event)\"></div>\n </div>\n @if (template(); as template) {\n <div [class]=\"classIncludeTemplate()\">\n <ng-container *ngTemplateOutlet=\"template\"></ng-container>\n </div>\n }\n </div>\n @if (messageError() && showErrorLabel()) {\n <div class=\"flex items-center leading-normal mt-[8px]\">\n <span class=\"text-[#ff5454] libs-ui-font-h7r\"> {{ messageError() | translate }}</span>\n </div>\n }\n</div>\n\n<ng-template #toolbar>\n <div class=\"toolbar\"\n #toolbarItems>\n <div class=\"ql-formats items-center\">\n @for (option of toolbarOptionsConfig(); track option) {\n <div #item\n [id]=\"option.type+'_'+$index\"\n class=\"items-center\"\n [class.hidden]=\"itemHidden().includes($index) || itemHiddenExpand().includes($index)\"\n [class.flex]=\"!itemHidden().includes($index)\">\n <ng-container *ngTemplateOutlet=\"itemTemplate;context:{option, $index, $last}\"></ng-container>\n </div>\n }\n <div class=\"relative\">\n @if (itemHidden().length) {\n <libs_ui-components-buttons-button [type]=\"showMoreAction() ? 'button-secondary' : 'button-third'\"\n [iconOnlyType]=\"true\"\n [classInclude]=\"'!p-[1px] !h-[20px] ml-[8px]'\"\n [classIconLeft]=\"'libs-ui-icon-move-right rotate-90'\"\n (outClick)=\"handlerChangeShowMoreAction($event)\" />\n }\n <!-- Build toolbar khi click xem th\u00EAm-->\n <div [class.hidden]=\"!showMoreAction() || !itemHidden().length\"\n class=\"absolute bg-[#ffffff] shadow-md z-[1] flex items-center pl-[8px] pr-[16px] py-[4px] rounded-[8px] top-[31px] right-[0px]\">\n @for (option of toolbarOptionsConfig(); track option) {\n <div class=\"items-center\"\n [class.hidden]=\"!itemHidden().includes($index)\"\n [class.flex]=\"itemHidden().includes($index)\">\n <ng-container *ngTemplateOutlet=\"itemTemplate;context:{option, $index, $last}\"></ng-container>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n</ng-template>\n\n\n<ng-template #itemTemplate\n let-$index=\"$index\"\n let-$last=\"$last\"\n let-option=\"option\">\n @if (option.type === 'undo') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button LibsUiComponentsPopoverDirective\n [config]=\"{content: 'i18n_undo', zIndex: 1250}\"\n class=\"ql-undo\"></button>\n </div>\n }\n @if (option.type === 'redo') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button LibsUiComponentsPopoverDirective\n [config]=\"{content: 'i18n_redo', zIndex: 1250}\"\n class=\"ql-redo\"></button>\n </div>\n }\n @if (option.type === 'fontFamily') {\n <div\n class=\"relative w-[117px] h-full bg-[#ffffff] rounded-[4px] libs-ui-border-general {{ option.classInclude || 'mx-[8px]' }}\">\n <libs_ui-components-dropdown [isNgContent]=\"true\"\n [labelPopoverFullWidth]=\"true\"\n [listConfig]=\"listConfigFont()\"\n [listHasButtonUnSelectOption]=\"false\"\n [listHiddenInputSearch]=\"true\"\n [listMaxItemShow]=\"8\"\n [zIndex]=\"1250\"\n (outSelectKey)=\"handleSelectFont($event)\">\n @if (fontSelected(); as fontSelected) {\n <div\n class=\"flex items-center cursor-pointer py-[8px] libs-ui-font-h5r pl-[16px] pr-[40px] {{ option.classInclude || 'mx-[8px]' }}\">\n <libs_ui-components-popover [type]=\"'text'\"\n [ignoreStopPropagationEvent]=\"true\"\n [config]=\"{zIndex:1250}\">\n {{ labelFontSelectedComputed() }}\n </libs_ui-components-popover>\n <i class=\"libs-ui-icon-move-right rotate-90 absolute right-[12px] text-[#6a7383] text-[16px]\"></i>\n </div>\n }\n </libs_ui-components-dropdown>\n </div>\n }\n @if (option.type === 'fontSize') {\n <div class=\"ql-picker {{ option.classInclude || 'mx-[8px]' }}\">\n <libs_ui-components-inputs-valid [dataType]=\"'int'\"\n [(item)]=\"size\"\n [fieldNameBind]=\"'value'\"\n [valueUpDownNumber]=\"1\"\n [maxValueNumber]=\"72\"\n [minValueNumber]=\"8\"\n [readonly]=\"readonly()\"\n [classContainerInput]=\"'w-[72px] h-[32px]'\"\n (outValueChange)=\"handlerValueChange($event)\" />\n </div>\n }\n @if (option.type === 'color') {\n <div class=\"ql-color ql-picker ql-color-picker !flex items-center {{ option.classInclude || 'mx-[8px]' }}\">\n <libs_ui-components-popover [config]=\"{content:'i18n_text_color', zIndex:1250}\">\n <libs_ui-components-buttons-select_color [zIndex]=\"zIndex()\"\n [direction]=\"'top'\"\n [externalContent]=\"true\"\n [applyNow]=\"true\"\n (outColorChange)=\"setStyle('color', $event)\">\n <div\n class=\"libs-ui-icon-editor-color-text libs-ui-buttons-select-color text-[#6a7383] text-[16px] hover:text-[var(--libs-ui-color-light-1)]\">\n </div>\n </libs_ui-components-buttons-select_color>\n </libs_ui-components-popover>\n </div>\n }\n @if (option.type === 'background') {\n <div class=\"ql-background ql-picker ql-color-picker !flex items-center {{ option.classInclude || 'mx-[8px]' }}\">\n <libs_ui-components-popover [config]=\"{content:'i18n_background_color', zIndex:1250}\">\n <libs_ui-components-buttons-select_color [zIndex]=\"zIndex()\"\n [direction]=\"'top'\"\n [externalContent]=\"true\"\n [applyNow]=\"true\"\n (outColorChange)=\"setStyle('background', $event)\">\n <div\n class=\"libs-ui-icon-editor-color-background libs-ui-buttons-select-color text-[#6a7383] text-[16px] hover:text-[var(--libs-ui-color-light-1)]\">\n </div>\n </libs_ui-components-buttons-select_color>\n </libs_ui-components-popover>\n </div>\n }\n @if (option.type === 'bold') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button LibsUiComponentsPopoverDirective\n [config]=\"{content:'i18n_font_weight_bold', zIndex:1250}\"\n class=\"ql-bold\"></button>\n </div>\n }\n @if (option.type === 'italic') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button LibsUiComponentsPopoverDirective\n [config]=\"{content:'i18n_font_style_italic', zIndex:1250}\"\n class=\"ql-italic\"></button>\n </div>\n }\n @if (option.type === 'underline') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button LibsUiComponentsPopoverDirective\n [config]=\"{content:'i18n_text_decoration_underline', zIndex:1250}\"\n class=\"ql-underline\"></button>\n </div>\n }\n @if (option.type === 'strikeThrough') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button LibsUiComponentsPopoverDirective\n [config]=\"{content:'i18n_text_line_through', zIndex:1250}\"\n class=\"ql-strike\"></button>\n </div>\n }\n @if (option.type === 'adjust') {\n <div\n class=\"relative !flex items-center ql-align ql-picker ql-icon-picker !w-max {{ option.classInclude || 'mx-[8px]' }}\">\n <libs_ui-components-popover [config]=\"{content:'i18n_adjust', zIndex:1250}\">\n <libs_ui-components-dropdown [isNgContent]=\"true\"\n [ignoreStopPropagationEvent]=\"true\"\n [labelPopoverFullWidth]=\"true\"\n [listConfig]=\"listConfigAlign()\"\n [listHiddenInputSearch]=\"true\"\n [popoverCustomConfig]=\"{ignoreArrow: true, classInclude: '!w-[32px] overflow-hidden !py-[4px]', position: {mode: 'start', distance: 0}, paddingLeftItem: false}\"\n [listHasButtonUnSelectOption]=\"false\"\n [listMaxItemShow]=\"8\"\n [zIndex]=\"1250\"\n (outSelectKey)=\"handleSelectAlign($event)\">\n @if (alignSelected(); as alignSelected) {\n <div class=\"flex items-center cursor-pointer\">\n <i [class]=\"iconAlignSelectedComputed()\"></i>\n <i class=\"libs-ui-icon-move-right rotate-90 text-[#6a7383] text-[16px] ml-[4px]\"></i>\n </div>\n }\n </libs_ui-components-dropdown>\n </libs_ui-components-popover>\n </div>\n }\n @if (option.type === 'indentIncrease') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button LibsUiComponentsPopoverDirective\n [config]=\"{content:'i18n_indent_increase', zIndex:1250}\"\n class=\"ql-indent\"\n value=\"+1\"></button>\n </div>\n }\n @if (option.type === 'indentDecrease') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button LibsUiComponentsPopoverDirective\n [config]=\"{content:'i18n_indent_decrease', zIndex:1250}\"\n class=\"ql-indent\"\n value=\"-1\"></button>\n </div>\n }\n @if (option.type === 'listBulleted') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button LibsUiComponentsPopoverDirective\n [config]=\"{content:'i18n_list_bulleted', zIndex:1250}\"\n class=\"ql-list ql-bullet\"\n value=\"bullet\"></button>\n </div>\n }\n @if (option.type === 'listNumbered') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button LibsUiComponentsPopoverDirective\n [config]=\"{content:'i18n_list_numbered', zIndex:1250}\"\n class=\"ql-list ql-ordered\"\n value=\"ordered\"></button>\n </div>\n }\n @if (option.type === 'personalize' && templateToolBarPersonalize(); as templateToolBarPersonalize) {\n <div class=\"flex items-center {{ option.classInclude || 'mx-[8px]' }}\">\n <ng-container *ngTemplateOutlet=\"templateToolBarPersonalize\"></ng-container>\n </div>\n }\n @if (option.type === 'blockquote') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button LibsUiComponentsPopoverDirective\n [config]=\"{content:'i18n_quote', zIndex:1250}\"\n class=\"ql-blockquote\"></button>\n </div>\n }\n @if (option.type === 'link') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button LibsUiComponentsPopoverDirective\n [config]=\"{content:'i18n_insert_link', zIndex:1250}\"\n class=\"ql-link\"></button>\n </div>\n }\n @if (option.type === 'unLink') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button LibsUiComponentsPopoverDirective\n [config]=\"{content:'i18n_unlink', zIndex:1250}\"\n class=\"ql-unLink\"></button>\n </div>\n }\n @if (option.type === 'image') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button LibsUiComponentsPopoverDirective\n [config]=\"{content:'i18n_image', zIndex:1250}\"\n class=\"ql-image\"></button>\n </div>\n }\n @if (option.type === 'emoji') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <libs_ui-components-emoji [zIndex]=\"1250\"\n [isNgContent]=\"true\"\n (outEventEmoji)=\"handlerAddEmoji($event)\">\n <button class=\"ql-emoji\"></button>\n </libs_ui-components-emoji>\n </div>\n }\n @if (option.type === 'line') {\n <div class=\"w-[1px] h-[16px] libs-ui-border-right-general\"></div>\n }\n</ng-template>\n\n<libs_ui-components-popover [mode]=\"'click'\"\n [ignoreHiddenPopoverContentWhenMouseLeave]=\"true\"\n [config]=\"{template: viewLink, whiteTheme: true, ignoreArrow: true}\"\n (outEvent)=\"handlerPopoverEvent($event)\"\n (outFunctionsControl)=\"handlerPopoverFunctionControl($event)\" />\n\n<ng-template #viewLink>\n <div class=\"flex justify-between items-center px-[16px] py-[8px] rounded-[8px]\">\n <div class=\"w-full min-w-0 libs-ui-font-h5r\"\n [type]=\"'text'\"\n LibsUiComponentsPopoverDirective>{{ link().url }}</div>\n <div class=\"flex items-center ml-[16px]\">\n <libs_ui-components-buttons-button [type]=\"'button-link-primary'\"\n [iconOnlyType]=\"true\"\n [classIconLeft]=\"'libs-ui-icon-edit-line'\"\n [classInclude]=\"'!p-0'\"\n (outClick)=\"handlerEdit($event)\" />\n <libs_ui-components-buttons-button [type]=\"'button-link-custom'\"\n [buttonCustom]=\"{\n configStepColor: {\n text: '#071631',\n text_hover: '#ee2d41',\n text_active: '#ee2d41',\n text_disable: '071631'\n },\n rootColor: '#071631'\n }\"\n [classInclude]=\"'!p-0 ml-[12px]'\"\n [iconOnlyType]=\"true\"\n [classIconLeft]=\"'libs-ui-icon-link-broken'\"\n (outClick)=\"handlerUnlink($event)\" />\n </div>\n </div>\n</ng-template>\n", styles: ["@-webkit-keyframes animation-move{0%{transform:translateY(-12px)}to{transform:translateY(0)}}@keyframes animation-move{0%{transform:translateY(-12px)}to{transform:translateY(0)}}.libs-ui-quill{height:100%;width:100%;display:flex;flex-direction:column}.libs-ui-quill-toolbar-animation{animation:animation-move .4s ease}.libs-ui-quill-wrapper[heightAuto=true]{overflow:auto}.libs-ui-quill-wrapper[heightAuto=true] .libs-ui-quill{height:auto}.libs-ui-quill-wrapper[heightAuto=true] .libs-ui-quill ::ng-deep .ql-container{height:auto}.libs-ui-quill-wrapper[heightAuto=true] .libs-ui-quill ::ng-deep .ql-container .ql-editor{position:relative!important}.libs-ui-quill-wrapper[isToolbarPositonFixed=true] .libs-ui-quill ::ng-deep .ql-container.ql-snow{border:0px!important}.libs-ui-quill-wrapper[isToolbarPositonFixed=false] .libs-ui-quill ::ng-deep .ql-container.ql-snow{border:solid 1px #e6e8ed!important;border-radius:0 0 4px 4px}.libs-ui-quill-wrapper[isToolbarPositonFixed=false] .libs-ui-quill ::ng-deep .ql-toolbar.ql-snow{border:solid 1px #e6e8ed!important;border-radius:4px 4px 0 0;border-bottom:unset!important}.libs-ui-quill-wrapper[isToolbarPositonFixed=false] .libs-ui-quill[showError=true] ::ng-deep .ql-container.ql-snow{border:solid 1px #ee2d41!important}:host ::ng-deep .toolbar,:host ::ng-deep .ql-formats{position:relative;width:100%}:host ::ng-deep .ql-toolbar.ql-snow .ql-formats{display:flex}:host ::ng-deep .ql-container.ql-snow{width:100%;height:100%;position:relative}:host ::ng-deep .ql-editor{font-family:var(--libs-ui-font-family-name),\"Arial, Helvetica, sans-serif\"!important;font-weight:400}:host ::ng-deep .ql-editor b{font-family:var(--libs-ui-font-family-name),\"Arial, Helvetica, sans-serif\"!important;font-weight:600}:host ::ng-deep .ql-toolbar.ql-snow{border:none;border-radius:8px;padding:4px 16px}:host ::ng-deep .ql-toolbar.ql-snow .ql-picker-label{color:#071631;border:none!important;margin-top:5px}:host ::ng-deep .ql-toolbar.ql-snow .ql-picker-label:hover{color:var(--libs-ui-color-light-1)!important}:host ::ng-deep .ql-toolbar.ql-snow .ql-picker-label:hover .ql-stroke{stroke:var(--libs-ui-color-light-1)!important}:host ::ng-deep .ql-snow.ql-toolbar .ql-picker-item:hover{color:var(--libs-ui-color-light-1)!important}:host ::ng-deep .ql-snow.ql-toolbar .ql-picker-label.ql-active{color:#071631}:host ::ng-deep .ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-stroke{stroke:#071631}:host ::ng-deep .ql-editor{height:100%;width:100%;position:absolute;line-height:1.42!important}:host ::ng-deep .ql-editor:before{font-family:var(--libs-ui-font-family-name),\"Arial, Helvetica, sans-serif\"!important;color:#9ca2ad!important;font-size:12px}:host ::ng-deep .ql-editor img{height:auto;max-width:100%}:host ::ng-deep .ql-toolbar.ql-snow .ql-picker.ql-expanded .ql-picker-label{border:none!important}:host ::ng-deep .ql-snow .ql-picker.ql-bold{width:36px!important}:host ::ng-deep .ql-editor.ql-blank{font-size:11px!important;letter-spacing:.05px;font-family:var(--libs-ui-font-family-name),\"Arial, Helvetica, sans-serif\"!important;line-height:16px}:host ::ng-deep .ql-editor.ql-blank:before{font-style:normal!important;color:#9ca2ad!important}:host ::ng-deep .ql-snow.ql-toolbar .ql-picker-label :hover{color:red!important}:host ::ng-deep .ql-formats{margin-right:12px!important}:host ::ng-deep .ql-formats .ql-size.ql-picker,:host ::ng-deep .ql-formats .ql-header.ql-picker,:host ::ng-deep .ql-formats .ql-font.ql-picker{border:solid 1px #e6e8ed!important;border-radius:4px}:host ::ng-deep .ql-formats .ql-align.ql-picker .ql-picker-label{width:24px}:host ::ng-deep .ql-formats .ql-align.ql-picker .ql-picker-label:hover{color:red!important}:host ::ng-deep .ql-formats .ql-header.ql-picker .ql-picker-label:before{font-size:12px}:host ::ng-deep .ql-picker-item:before{font-size:12px}:host ::ng-deep .ql-picker-label:before{font-size:12px}:host ::ng-deep .ql-snow.ql-toolbar button,:host ::ng-deep .ql-snow .ql-toolbar button{background:none;border:none;cursor:pointer;display:flex;align-items:center;float:none;padding:0;width:inherit}:host ::ng-deep ul{padding-left:1rem!important}:host ::ng-deep li{padding-left:0!important}:host ::ng-deep .ql-tooltip{display:none!important}.ql-picker-options{max-height:130px;overflow-y:auto}.ql-snow .ql-picker.ql-size{border:1px solid #e6e7ea;box-shadow:#00000005 0 1px 3px,#1b1f2326 0 0 0 1px;border-radius:2px}.ql-snow .ql-picker.ql-font{border:1px solid #e6e7ea!important;margin-right:8px;border-radius:4px}.ql-snow .ql-picker.ql-font .ql-picker-options:before{font-size:12px}.ql-snow .ql-picker.ql-font .ql-picker-label:before{font-size:12px}.ql-font-Arial{font-family:Arial}.ql-font-sans-serif{font-family:\"sans-serif\"}.ql-font-Helvetica{font-family:Helvetica}.libs-ui-quill-mention{font-weight:500!important;color:#7239ea;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:var(--libs-ui-font-family-name),\"Arial, Helvetica, sans-serif\"!important;font-weight:600}.ql-snow .ql-picker.ql-expanded .ql-picker-options{overflow:hidden}.ql-formats{margin-right:0!important}.ql-formats .ql-header{position:relative!important}.ql-formats .ql-header .ql-picker-options{position:absolute!important;top:-151px!important}.ql-formats .ql-font{position:relative!important}.ql-formats .ql-font .ql-picker-options{position:absolute!important;top:-93px!important}.ql-formats .ql-color{position:relative!important}.ql-formats .ql-color .ql-picker-options{position:absolute!important;top:-108px}.ql-formats .ql-background{position:relative!important}.ql-formats .ql-background .ql-picker-options{position:absolute!important;top:-108px}.ql-formats .ql-align{position:relative!important}.ql-formats .ql-align .ql-picker-label{padding:3px 4px!important}.ql-formats .ql-align .ql-picker-options{position:absolute!important;top:-106px}.ql-snow .ql-picker{font-size:12px!important;height:32px;float:none;width:auto}\n"] }]
|
|
698
699
|
}], ctorParameters: () => [] });
|
|
699
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVpbGwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL2lucHV0cy9xdWlsbC9zcmMvcXVpbGwuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL2lucHV0cy9xdWlsbC9zcmMvcXVpbGwuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbkQsT0FBTyxFQUFpQix1QkFBdUIsRUFBRSxTQUFTLEVBQWdCLFFBQVEsRUFBRSxNQUFNLEVBQWMsTUFBTSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQXFCLE1BQU0sRUFBRSxNQUFNLEVBQWUsU0FBUyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDeE8sT0FBTyxFQUFFLHNDQUFzQyxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDNUYsT0FBTyxFQUFFLDJDQUEyQyxFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFDdkcsT0FBTyxFQUFrQixpQ0FBaUMsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2pHLE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ2xGLE9BQU8sRUFBa0Msc0NBQXNDLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUM1SCxPQUFPLEVBQWdDLG9DQUFvQyxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDdEgsT0FBTyxFQUFVLDhCQUE4QixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFbkYsT0FBTyxFQUFnQyxnQ0FBZ0MsRUFBc0IsTUFBTSw2QkFBNkIsQ0FBQztBQUVqSSxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUNwRixPQUFPLEVBQUUseUJBQXlCLEVBQUUsd0JBQXdCLEVBQUUsd0JBQXdC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LE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztRQUN4aEIsS0FBSyxDQUFDLFNBQVMsR0FBRyw0QkFBNEIsQ0FBQztRQUMvQyxLQUFLLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztRQUN0QixNQUFNLENBQUMsT0FBTyxHQUFHLEdBQUcsQ0FBQztRQUNyQixJQUFJLENBQUMsT0FBTyxHQUFHLEdBQUcsQ0FBQztRQUNuQixLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztRQUMzQixLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztRQUM3QixLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztRQUMzQixLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztRQUM1QixLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztRQUM1QixLQUFLLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNqQyxLQUFLLENBQUMsUUFBUSxDQUFDLGdCQUFn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c0NBQXNDO3dCQUN6RSw4QkFBOEIsRUFBRSxpQ0FBaUM7d0JBQ2pFLGdDQUFnQyxFQUFFLDJDQUEyQzt3QkFDN0Usb0NBQW9DLEVBQUUsOEJBQThCO3dCQUNwRSxzQ0FBc0M7cUJBQ3ZDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdUZW1wbGF0ZU91dGxldCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBBZnRlclZpZXdJbml0LCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBDb21wb25lbnRSZWYsIGNvbXB1dGVkLCBlZmZlY3QsIEVsZW1lbnRSZWYsIGluamVjdCwgaW5wdXQsIG1vZGVsLCBPbkRlc3Ryb3ksIE9uSW5pdCwgb3V0cHV0LCBzaWduYWwsIFRlbXBsYXRlUmVmLCB1bnRyYWNrZWQsIHZpZXdDaGlsZCwgdmlld0NoaWxkcmVuIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzQnV0dG9uc0J1dHRvbkNvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtYnV0dG9ucy1idXR0b24nO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c0J1dHRvbnNTZWxlY3RDb2xvckNvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtYnV0dG9ucy1zZWxlY3QtY29sb3InO1xuaW1wb3J0IHsgSUVtaXRTZWxlY3RLZXksIExpYnNVaUNvbXBvbmVudHNEcm9wZG93bkNvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtZHJvcGRvd24nO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c0Vtb2ppQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1pbnB1dHMtZW1vamknO1xuaW1wb3J0IHsgSU1lbnRpb25Db25maWcsIElNZW50aW9uSW5zZXJ0LCBMaWJzVWlDb21wb25lbnRzSW5wdXRzTWVudGlvbkRpcmVjdGl2ZSB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtaW5wdXRzLW1lbnRpb24nO1xuaW1wb3J0IHsgSVZhbGlkTGVuZ3RoLCBJVmFsaWRSZXF1aXJlZCwgTGlic1VpQ29tcG9uZW50c0lucHV0c1ZhbGlkQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1pbnB1dHMtdmFsaWQnO1xuaW1wb3J0IHsgSUxhYmVsLCBMaWJzVWlDb21wb25lbnRzTGFiZWxDb21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWxhYmVsJztcbmltcG9ydCB7IElMaXN0Q29uZmlnSXRlbSB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtbGlzdCc7XG5pbXBvcnQgeyBJUG9wb3ZlckZ1bmN0aW9uQ29udHJvbEV2ZW50LCBMaWJzVWlDb21wb25lbnRzUG9wb3ZlckNvbXBvbmVudCwgVFlQRV9QT1BPVkVSX0VWRU5UIH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1wb3BvdmVyJztcbmltcG9ydCB7IFRZUEVfVEVNUExBVEVfUkVGIH0gZnJvbSAnQGxpYnMtdWkvaW50ZXJmYWNlcy10eXBlcyc7XG5pbXBvcnQgeyBMaWJzVWlEeW5hbWljQ29tcG9uZW50U2VydmljZSB9IGZyb20gJ0BsaWJzLXVpL3NlcnZpY2VzLWR5bmFtaWMtY29tcG9uZW50JztcbmltcG9ydCB7IEVSUk9SX01FU1NBR0VfRU1QVFlfVkFMSUQsIEVSUk9SX01FU1NBR0VfTUFYX0xFTkdUSCwgRVJST1JfTUVTU0FHRV9NSU5fTEVOR1RILCBnZXQsIGlzTmlsLCBwYXR0ZXJuVXJsLCBzZXQsIHhzc0ZpbHRlciB9IGZyb20gJ0BsaWJzLXVpL3V0aWxzJztcbmltcG9ydCB7IFRyYW5zbGF0ZU1vZHVsZSwgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IFF1aWxsLCB7IFJhbmdlU3RhdGljLCBTb3VyY2VzLCBTdHJpbmdNYXAgfSBmcm9tICdxdWlsbCc7XG5pbXBvcnQgeyBmcm9tRXZlbnQsIFN1YmplY3QsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgaW5kZW50U3R5bGUgfSBmcm9tICcuL2luZGVudC1hdHRyaWJ1dG9yL2luZGVudC1hdHRyaWJ1dG9yLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJUXVpbGxCbG90UmVnaXN0ZXIsIElRdWlsbEZ1bmN0aW9uQ29udHJvbEV2ZW50LCBJUXVpbGxMaW5rLCBJUXVpbGxTZWxlY3Rpb25DaGFuZ2UsIElRdWlsbFRleHRDaGFuZ2UsIElRdWlsbFRvb2xiYXJDb25maWcsIElRdWlsbFVwbG9hZEltYWdlQ29uZmlnLCBUWVBFX01PREVfQkFSX0NPTkZJR19PUFRJT04gfSBmcm9tICcuL2ludGVyZmFjZXMvcXVpbGwuaW50ZXJmYWNlJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNJbnB1dHNRdWlsbExpbmtDb21wb25lbnQgfSBmcm9tICcuL2xpbmsvbGluay5jb21wb25lbnQnO1xuaW1wb3J0IHsgUXVpbGxNZW50aW9uQmxvdCB9IGZyb20gJy4vbWVudGlvbi9tZW50aW9uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzSW5wdXRzUXVpbGxVcGxvYWRJbWFnZUNvbXBvbmVudCB9IGZyb20gJy4vdXBsb2FkLWltYWdlL3VwbG9hZC1pbWFnZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgaWNvbkxpc3QsIGxpbmtEZWZhdWx0LCBsaXN0Q29uZmlnQWxpZ24sIGxpc3RDb25maWdGb250LCBsaXN0Rm9udCwgdG9vbEJhck9wdGlvbnMsIHVwbG9hZEltYWdlQ29uZmlnRGVmYXVsdCB9IGZyb20gJy4vdXRpbHMvcXVpbGwuZGVmaW5lJztcblxuQENvbXBvbmVudCh7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvY29tcG9uZW50LXNlbGVjdG9yXG4gIHNlbGVjdG9yOiAnbGlic191aS1jb21wb25lbnRzLWlucHV0cy1xdWlsbCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICB0ZW1wbGF0ZVVybDogJy4vcXVpbGwuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vcXVpbGwuY29tcG9uZW50LnNjc3MnLFxuICBpbXBvcnRzOiBbXG4gICAgVHJhbnNsYXRlTW9kdWxlLCBOZ1RlbXBsYXRlT3V0bGV0LCBMaWJzVWlDb21wb25lbnRzSW5wdXRzTWVudGlvbkRpcmVjdGl2ZSxcbiAgICBMaWJzVWlDb21wb25lbnRzTGFiZWxDb21wb25lbnQsIExpYnNVaUNvbXBvbmVudHNEcm9wZG93bkNvbXBvbmVudCxcbiAgICBMaWJzVWlDb21wb25lbnRzUG9wb3ZlckNvbXBvbmVudCwgTGlic1VpQ29tcG9uZW50c0J1dHRvbnNTZWxlY3RDb2xvckNvbXBvbmVudCxcbiAgICBMaWJzVWlDb21wb25lbnRzSW5wdXRzVmFsaWRDb21wb25lbnQsIExpYnNVaUNvbXBvbmVudHNFbW9qaUNvbXBvbmVudCxcbiAgICBMaWJzVWlDb21wb25lbnRzQnV0dG9uc0J1dHRvbkNvbXBvbmVudFxuICBdXG59KVxuZXhwb3J0IGNsYXNzIExpYnNVaUNvbXBvbmVudHNJbnB1dHNRdWlsbENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcbiAgcHJvdGVjdGVkIG1lc3NhZ2VFcnJvciA9IHNpZ25hbDxzdHJpbmc+KCcnKTtcbiAgcHJvdGVjdGVkIGRpc3BsYXkgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuICBwcm90ZWN0ZWQgbGlzdENvbmZpZ0FsaWduID0gc2lnbmFsPElMaXN0Q29uZmlnSXRlbT4obGlzdENvbmZpZ0FsaWduKCkpO1xuICBwcm90ZWN0ZWQgYWxpZ25TZWxlY3RlZCA9IHNpZ25hbDxJRW1pdFNlbGVjdEtleSB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgcHJvdGVjdGVkIGljb25BbGlnblNlbGVjdGVkQ29tcHV0ZWQgPSBjb21wdXRlZCgoKSA9PiBnZXQodGhpcy5hbGlnblNlbGVjdGVkKCksICdpdGVtLmljb24nKSk7XG4gIHByb3RlY3RlZCBsaXN0Q29uZmlnRm9udCA9IHNpZ25hbDxJTGlzdENvbmZpZ0l0ZW0+KGxpc3RDb25maWdGb250KCkpO1xuICBwcm90ZWN0ZWQgZm9udFNlbGVjdGVkID0gc2lnbmFsPElFbWl0U2VsZWN0S2V5IHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcm90ZWN0ZWQgbGFiZWxGb250U2VsZWN0ZWRDb21wdXRlZCA9IGNvbXB1dGVkKCgpID0+IGdldCh0aGlzLmZvbnRTZWxlY3RlZCgpLCAnaXRlbS5sYWJlbCcpIHx8ICdTYW5zIFNlcmlmJyk7XG4gIHByb3RlY3RlZCBzaXplID0gc2lnbmFsPHsgdmFsdWU6IG51bWJlciB9Pih7IHZhbHVlOiAxNCB9KTtcbiAgcHJvdGVjdGVkIGl0ZW1IaWRkZW5FeHBhbmQgPSBzaWduYWw8QXJyYXk8bnVtYmVyPj4oW10pO1xuICBwcm90ZWN0ZWQgaXRlbUhpZGRlbiA9IHNpZ25hbDxBcnJheTxudW1iZXI+PihbXSk7XG4gIHByb3RlY3RlZCBzaG93TW9yZUFjdGlvbiA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIHByb3RlY3RlZCBsaW5rID0gc2lnbmFsPElRdWlsbExpbms+KGxpbmtEZWZhdWx0KCkpO1xuICBwcm90ZWN0ZWQgdG9vbGJhck9wdGlvbnNDb25maWcgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgdHlwZSA9IHRoaXMudG9vbGJhckNvbmZpZygpPy50eXBlIHx8ICdkZWZhdWx0JztcbiAgICBjb25zdCBoYXNJY29uSW1hZ2UgPSB0aGlzLnVwbG9hZEltYWdlQ29uZmlnKCkuc2hvd0ljb24gPz8gZmFsc2U7XG4gICAgY29uc3QgaGFzSWNvblBlcnNvbmFsaXplID0gISF0aGlzLnRlbXBsYXRlVG9vbEJhclBlcnNvbmFsaXplKCk7XG5cbiAgICByZXR1cm4gdGhpcy50b29sYmFyQ29uZmlnKCk/LmNvbmZpZyB8fCB0b29sQmFyT3B0aW9ucyh0eXBlLCBoYXNJY29uSW1hZ2UsIGhhc0ljb25QZXJzb25hbGl6ZSk7XG4gIH0pO1xuXG4gIHByaXZhdGUgdGltZUNhbGN1bGF0aW9uVG9vbEJhciA9IHNpZ25hbDxudW1iZXIgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIHByaXZhdGUgcG9wb3ZlckZ1bmN0aW9uQ29udHJvbCA9IHNpZ25hbDxJUG9wb3ZlckZ1bmN0aW9uQ29udHJvbEV2ZW50IHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcml2YXRlIHF1aWxsID0gc2lnbmFsPFF1aWxsIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcml2YXRlIGhhbmRsZXJzID0gc2lnbmFsPFJlY29yZDxzdHJpbmcsICguLi5wYXJhbXM6IEFycmF5PHVua25vd24+KSA9PiB2b2lkPj4oeyB1bmRvOiB0aGlzLmhhbmRsZVVuZG8uYmluZCh0aGlzKSwgcmVkbzogdGhpcy5oYW5kbGVSZWRvLmJpbmQodGhpcykgfSk7XG4gIHByaXZhdGUgc2hvd01lbnRpb24gPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuICBwcml2YXRlIGFkZEVkaXRMaW5rQ29tcG9uZW50UmVmID0gc2lnbmFsPENvbXBvbmVudFJlZjxMaWJzVWlDb21wb25lbnRzSW5wdXRzUXVpbGxMaW5rQ29tcG9uZW50PiB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgcHJpdmF0ZSB1cGxvYWRJbWFnZUNvbXBvbmVudFJlZiA9IHNpZ25hbDxDb21wb25lbnRSZWY8TGlic1VpQ29tcG9uZW50c0lucHV0c1F1aWxsVXBsb2FkSW1hZ2VDb21wb25lbnQ+IHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcml2YXRlIG9uRGVzdHJveSA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIHByaXZhdGUgZHluYW1pY0NvbXBvbmVudFNlcnZpY2UgPSBpbmplY3QoTGlic1VpRHluYW1pY0NvbXBvbmVudFNlcnZpY2UpO1xuICBwcml2YXRlIHRyYW5zbGF0ZSA9IGluamVjdChUcmFuc2xhdGVTZXJ2aWNlKTtcblxuICByZWFkb25seSBpc1Nob3dUb29sQmFyID0gaW5wdXQ8Ym9vbGVhbiwgYm9vbGVhbiB8IHVuZGVmaW5lZD4odHJ1ZSwgeyB0cmFuc2Zvcm06IHZhbCA9PiB2YWwgPz8gdHJ1ZSB9KTtcbiAgcmVhZG9ubHkgaXNUb29sYmFyUG9zaXRvbkZpeGVkID0gaW5wdXQ8Ym9vbGVhbiwgYm9vbGVhbiB8IHVuZGVmaW5lZD4oZmFsc2UsIHsgdHJhbnNmb3JtOiB2YWwgPT4gdmFsID8/IGZhbHNlIH0pO1xuICByZWFkb25seSBjbGFzc0luY2x1ZGVUb29sYmFyID0gaW5wdXQ8c3RyaW5nPignYm90dG9tLVstNjZweF0gbGVmdC1bMThweF0nKTtcbiAgcmVhZG9ubHkgdG9vbGJhckNvbmZpZyA9IGlucHV0PHtcbiAgICB0eXBlOiBUWVBFX01PREVfQkFSX0NPTkZJR19PUFRJT047XG4gICAgY29uZmlnPzogQXJyYXk8SVF1aWxsVG9vbGJhckNvbmZpZz47XG4gIH0+KCk7XG4gIHJlYWRvbmx5IHBsYWNlaG9sZGVyID0gaW5wdXQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KCdpMThuX2ltcG9ydF9jb250ZW50JywgeyB0cmFuc2Zvcm06ICh2YWx1ZSkgPT4gdmFsdWUgfHwgJ2kxOG5faW1wb3J0X2NvbnRlbnQnIH0pO1xuICByZWFkb25seSBsYWJlbCA9IGlucHV0PElMYWJlbCB8IHVuZGVmaW5lZD4oKTtcbiAgcmVhZG9ubHkgaXRlbSA9IG1vZGVsPFJlY29yZDxzdHJpbmcsIHVua25vd24+PigpO1xuICByZWFkb25seSBmaWVsZE5hbWVCaW5kID0gaW5wdXQ8c3RyaW5nPigndmFsdWUnKTtcbiAgcmVhZG9ubHkgcmVhZG9ubHkgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBzaG93RXJyb3JMYWJlbCA9IGlucHV0PGJvb2xlYW4+KHRydWUpO1xuICByZWFkb25seSBzaG93RXJyb3JCb3JkZXIgPSBpbnB1dDxib29sZWFuPihmYWxzZSk7XG4gIHJlYWRvbmx5IG9ubHlTaG93RXJyb3JCb3JkZXJJbkNvbnRlbnQgPSBpbnB1dDxib29sZWFuPihmYWxzZSk7XG4gIHJlYWRvbmx5IGNsYXNzSW5jbHVkZVRlbXBsYXRlID0gaW5wdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSBjbGFzc0luY2x1ZGUgPSBpbnB1dDxzdHJpbmc+KCk7XG4gIHJlYWRvbmx5IGhhbmRsZXJzRXhwYW5kID0gaW5wdXQ8QXJyYXk8eyB0aXRsZTogc3RyaW5nLCBhY3Rpb246ICgpID0+IHZvaWQgfT4+KCk7XG4gIHJlYWRvbmx5IHZhbGlkUmVxdWlyZWQgPSBpbnB1dDxJVmFsaWRSZXF1aXJlZD4oKTtcbiAgcmVhZG9ubHkgdmFsaWRNaW5MZW5ndGggPSBpbnB1dDxJVmFsaWRMZW5ndGg+KCk7XG4gIHJlYWRvbmx5IHZhbGlkTWF4TGVuZ3RoID0gaW5wdXQ8SVZhbGlkTGVuZ3RoPigpO1xuICByZWFkb25seSB6SW5kZXggPSBpbnB1dDxudW1iZXIsIG51bWJlciB8IHVuZGVmaW5lZD4oMTIwMSwgeyB0cmFuc2Zvcm06ICh2YWx1ZSkgPT4gdmFsdWUgfHwgMTIwMSB9KTtcbiAgcmVhZG9ubHkgZGF0YUNvbmZpZ01lbnRpb24gPSBpbnB1dDxJTWVudGlvbkNvbmZpZz4oKTtcbiAgcmVhZG9ubHkgYmxvdHNSZWdpc3RlciA9IGlucHV0PEFycmF5PElRdWlsbEJsb3RSZWdpc3Rlcj4+KCk7XG4gIHJlYWRvbmx5IGhlaWdodEF1dG8gPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBhdXRvRm9jdXMgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBhdXRvRm9jdXNCb3R0b20gPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSB0ZW1wbGF0ZVRvb2xCYXJQZXJzb25hbGl6ZSA9IGlucHV0PFRlbXBsYXRlUmVmPFRZUEVfVEVNUExBVEVfUkVGPj4oKTtcbiAgcmVhZG9ubHkgdGVtcGxhdGUgPSBpbnB1dDxUZW1wbGF0ZVJlZjxUWVBFX1RFTVBMQVRFX1JFRj4+KCk7XG4gIHJlYWRvbmx5IHVwbG9hZEltYWdlQ29uZmlnID0gaW5wdXQ8SVF1aWxsVXBsb2FkSW1hZ2VDb25maWcsIElRdWlsbFVwbG9hZEltYWdlQ29uZmlnIHwgdW5kZWZpbmVkPih1cGxvYWRJbWFnZUNvbmZpZ0RlZmF1bHQoKSwgeyB0cmFuc2Zvcm06ICh2YWx1ZSkgPT4gdmFsdWUgfHwgdXBsb2FkSW1hZ2VDb25maWdEZWZhdWx0KCkgfSk7XG5cbiAgcmVhZG9ubHkgb3V0TWVzc2FnZUVycm9yID0gb3V0cHV0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgb3V0Qmx1ciA9IG91dHB1dDx2b2lkPigpO1xuICByZWFkb25seSBvdXRGb2N1cyA9IG91dHB1dDx2b2lkPigpO1xuICByZWFkb25seSBvdXRDaGFuZ2UgPSBvdXRwdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSBvdXRGdW5jdGlvbnNDb250cm9sID0gb3V0cHV0PElRdWlsbEZ1bmN0aW9uQ29udHJvbEV2ZW50PigpO1xuICByZWFkb25seSBvdXRTZWxlY3Rpb25DaGFuZ2UgPSBvdXRwdXQ8SVF1aWxsU2VsZWN0aW9uQ2hhbmdlPigpO1xuICByZWFkb25seSBvdXRUZXh0Q2hhbmdlID0gb3V0cHV0PElRdWlsbFRleHRDaGFuZ2U+KCk7XG4gIHJlYWRvbmx5IG91dENvbnRleHRNZW51ID0gb3V0cHV0PE1vdXNlRXZlbnQ+KCk7XG4gIHJlYWRvbmx5IHdyYXBwZXJFZGl0b3JFbCA9IHZpZXdDaGlsZDxFbGVtZW50UmVmPignd3JhcHBlckVkaXRvcicpO1xuICByZWFkb25seSBlZGl0b3JFbCA9IHZpZXdDaGlsZDxFbGVtZW50UmVmPignZWRpdG9yJyk7XG4gIHJlYWRvbmx5IHF1aWxsT3B0aW9uRWwgPSB2aWV3Q2hpbGQ8RWxlbWVudFJlZj4oJ3F1aWxsT3B0aW9uJyk7XG4gIHJlYWRvbmx5IHF1aWxsRWRpdG9yRWwgPSB2aWV3Q2hpbGQ8RWxlbWVudFJlZj4oJ3F1aWxsRWRpdG9yJyk7XG4gIHJlYWRvbmx5IHRvb2xiYXJJdGVtc0VsID0gdmlld0NoaWxkPEVsZW1lbnRSZWY+KCd0b29sYmFySXRlbXMnKTtcbiAgcmVhZG9ubHkgaXRlbXNFbCA9IHZpZXdDaGlsZHJlbjxFbGVtZW50UmVmPignaXRlbScpO1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMudG9vbGJhckl0ZW1zRWwoKT8ubmF0aXZlRWxlbWVudCkge1xuICAgICAgICB1bnRyYWNrZWQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuY2FsY3VsYXRvclRvb2xiYXIoKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLm91dEZ1bmN0aW9uc0NvbnRyb2wuZW1pdCh7XG4gICAgICBjaGVja0lzVmFsaWQ6IHRoaXMudmFsaWRhdGUuYmluZCh0aGlzKSxcbiAgICAgIHNldENvbnRlbnQ6IHRoaXMuc2V0Q29udGVudC5iaW5kKHRoaXMpLFxuICAgICAgaW5zZXJ0VGV4dDogdGhpcy5pbnNlcnRUZXh0LmJpbmQodGhpcyksXG4gICAgICBpbnNlcnRMaW5rOiB0aGlzLmluc2VydExpbmsuYmluZCh0aGlzKSxcbiAgICAgIGluc2VydEltYWdlOiB0aGlzLmluc2VydEltYWdlLmJpbmQodGhpcyksXG4gICAgICBzZXRGb250U2l6ZTogdGhpcy5zZXRGb250U2l6ZS5iaW5kKHRoaXMpLFxuICAgICAgc2V0Q29sb3I6IGFzeW5jIChjb2xvcjogc3RyaW5nKSA9PiB0aGlzLnNldFN0eWxlKCdjb2xvcicsIGNvbG9yKSxcbiAgICAgIHNldEJhY2tncm91bmQ6IGFzeW5jIChjb2xvcjogc3RyaW5nKSA9PiB0aGlzLnNldFN0eWxlKCdiYWNrZ3JvdW5kJywgY29sb3IpLFxuICAgICAgcXVpbGw6ICgpID0+IHRoaXMucXVpbGwoKSBhcyBRdWlsbFxuICAgIH0pO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmF1dG9Gb2N1cygpKSB7XG4gICAgICB0aGlzLmRpc3BsYXkuc2V0KHRydWUpO1xuICAgIH1cbiAgICB0aGlzLnNldEhhbmRsZXJGdW5jdGlvbigpO1xuICAgIHRoaXMuaW5pdFF1aWxsKCk7XG4gICAgaWYgKCF0aGlzLmF1dG9Gb2N1cygpKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuZGlzcGxheS5zZXQodHJ1ZSksIDQwMCk7XG4gICAgfVxuICAgIHRoaXMuc2V0Q2xhc3NJbmNsdWRlQW5kUmVhZE9ubHkoKTtcbiAgICB0aGlzLnNldENvbnRlbnQoZ2V0KHRoaXMuaXRlbSgpLCB0aGlzLmZpZWxkTmFtZUJpbmQoKSwgJycpKTtcbiAgICB0aGlzLmhhbmRsZXJUZXh0Q2hhbmdlKCk7XG4gICAgdGhpcy5oYW5kbGVyU2VsZWN0aW9uQ2hhbmdlKCk7XG4gICAgdGhpcy5oYW5kbGVyUGFzdGUoKTtcbiAgICBpZiAodGhpcy5hdXRvRm9jdXMoKSkge1xuICAgICAgdGhpcy5xdWlsbCgpPy5mb2N1cygpO1xuICAgIH1cbiAgICBmcm9tRXZlbnQod2luZG93LCAncmVzaXplJykucGlwZSh0YWtlVW50aWwodGhpcy5vbkRlc3Ryb3kpKS5zdWJzY3JpYmUodGhpcy5jYWxjdWxhdG9yVG9vbGJhci5iaW5kKHRoaXMpKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdFF1aWxsKCkge1xuICAgIGNvbnN0IHNpemUgPSBRdWlsbC5pbXBvcnQoJ2F0dHJpYnV0b3JzL3N0eWxlL3NpemUnKTtcbiAgICBjb25zdCBpbWFnZSA9IFF1aWxsLmltcG9ydCgnZm9ybWF0cy9pbWFnZScpO1xuICAgIGNvbnN0IHBhcmNobWVudCA9IFF1aWxsLmltcG9ydCgncGFyY2htZW50Jyk7XG4gICAgY29uc3QgYWxpZ25TdHlsZSA9IFF1aWxsLmltcG9ydCgnYXR0cmlidXRvcnMvc3R5bGUvYWxpZ24nKTtcbiAgICBjb25zdCBpY29ucyA9IFF1aWxsLmltcG9ydCgndWkvaWNvbnMnKTtcbiAgICBjb25zdCBibG9jayA9IHBhcmNobWVudC5xdWVyeSgnYmxvY2snKTtcbiAgICBjb25zdCBpdGFsaWMgPSBRdWlsbC5pbXBvcnQoJ2Zvcm1hdHMvaXRhbGljJyk7XG4gICAgY29uc3QgYm9sZCA9IFF1aWxsLmltcG9ydCgnZm9ybWF0cy9ib2xkJyk7XG4gICAgc2l6ZS53aGl0ZWxpc3QgPSBbJzhweCcsICc5cHgnLCAnMTBweCcsICcxMXB4JywgJzEycHgnLCAnMTNweCcsICcxNHB4JywgJzE1cHgnLCAnMTZweCcsICcxN3B4JywgJzE4cHgnLCAnMTlweCcsICcyMHB4JywgJzIxcHgnLCAnMjJweCcsICcyM3B4JywgJzI0cHgnLCAnMjVweCcsICcyNnB4JywgJzI3cHgnLCAnMjhweCcsICcyOXB4JywgJzMwcHgnLCAnMzFweCcsICczMnB4JywgJzMzcHgnLCAnMzRweCcsICczNXB4JywgJzM2cHgnLCAnMzdweCcsICczOHB4JywgJzM5cHgnLCAnNDBweCcsICc0MXB4JywgJzQycHgnLCAnNDNweCcsICc0NHB4JywgJzQ1cHgnLCAnNDZweCcsICc0N3B4JywgJzQ4cHgnLCAnNDlweCcsICc1MHB4JywgJzUxcHgnLCAnNTJweCcsICc1M3B4JywgJzU0cHgnLCAnNTVweCcsICc1NnB4JywgJzU3cHgnLCAnNThweCcsICc1OXB4JywgJzYwcHgnLCAnNjFweCcsICc2MnB4JywgJzYzcHgnLCAnNjRweCcsICc2NXB4JywgJzY2cHgnLCAnNjdweCcsICc2OHB4JywgJzY5cHgnLCAnNzBweCcsICc3MXB4JywgJzcycHgnXTtcbiAgICBpbWFnZS5jbGFzc05hbWUgPSAnbGlicy11aS1xdWlsbC1mb3JtYXQtaW1hZ2UnO1xuICAgIGJsb2NrLnRhZ05hbWUgPSAnRElWJztcbiAgICBpdGFsaWMudGFnTmFtZSA9ICdpJztcbiAgICBib2xkLnRhZ05hbWUgPSAnQic7XG4gICAgUXVpbGwucmVnaXN0ZXIoYm9sZCwgdHJ1ZSk7XG4gICAgUXVpbGwucmVnaXN0ZXIoaXRhbGljLCB0cnVlKTtcbiAgICBRdWlsbC5yZWdpc3RlcihzaXplLCB0cnVlKTtcbiAgICBRdWlsbC5yZWdpc3RlcihpbWFnZSwgdHJ1ZSk7XG4gICAgUXVpbGwucmVnaXN0ZXIoYmxvY2ssIHRydWUpO1xuICAgIFF1aWxsLnJlZ2lzdGVyKGFsaWduU3R5bGUsIHRydWUpO1xuICAgIFF1aWxsLnJlZ2lzdGVyKFF1aWxsTWVudGlvbkJsb3QsIHRydWUpO1xuICAgIHRoaXMuYmxvdHNSZWdpc3RlcigpPy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgUXVpbGwucmVnaXN0ZXIoaXRlbS5jb21wb25lbnQsIHRydWUpO1xuICAgIH0pO1xuICAgIFF1aWxsLnJlZ2lzdGVyKHsgJ2Zvcm1hdHMvaW5kZW50JzogaW5kZW50U3R5bGUgfSwgdHJ1ZSk7XG4gICAgZnJvbUV2ZW50PE1vdXNlRXZlbnQ+KHRoaXMucXVpbGxFZGl0b3JFbCgpPy5uYXRpdmVFbGVtZW50LCAnY29udGV4dG1lbnUnKS5waXBlKHRha2VVbnRpbCh0aGlzLm9uRGVzdHJveSkpLnN1YnNjcmliZShlID0+IHRoaXMub3V0Q29udGV4dE1lbnUuZW1pdChlKSk7XG4gICAgaWNvbkxpc3QoKS5mb3JFYWNoKGVsZW1lbnQgPT4gc2V0KGljb25zLCBlbGVtZW50LmtleSwgYDxzcGFuIGNsYXNzPVwiJHtlbGVtZW50Lmljb259IGhvdmVyOnRleHQtW3ZhcigtLWxpYnMtdWktY29sb3ItbGlnaHQtMSldIHRleHQtWzE2cHhdIHRleHQtWyM2YTczODNdXCI+PC9zcGFuPmApKTtcbiAgICB0aGlzLnF1aWxsLnNldChuZXcgUXVpbGwodGhpcy5xdWlsbEVkaXRvckVsKCk/Lm5hdGl2ZUVsZW1lbnQsIHtcbiAgICAgIG1vZHVsZXM6IHtcbiAgICAgICAgdG9vbGJhcjoge1xuICAgICAgICAgIGNvbnRhaW5lcjogdGhpcy5xdWlsbE9wdGlvbkVsKCk/Lm5hdGl2ZUVsZW1lbnQsXG4gICAgICAgICAgaGFuZGxlcnM6IHRoaXMuaGFuZGxlcnMoKVxuICAgICAgICB9LFxuICAgICAgICBjbGlwYm9hcmQ6IHtcbiAgICAgICAgICBtYXRjaFZpc3VhbDogZmFsc2VcbiAgICAgICAgfSxcbiAgICAgICAgaGlzdG9yeToge1xuICAgICAgICAgIGRlbGF5OiAxMDAwLFxuICAgICAgICAgIG1heFN0YWNrOiAxMDAsXG4gICAgICAgICAgdXNlck9ubHk6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIGtleWJvYXJkOiB7XG4gICAgICAgICAgYmluZGluZ3M6IHtcbiAgICAgICAgICAgIGVudGVyOiB7XG4gICAgICAgICAgICAgIGtleTogMTMsXG4gICAgICAgICAgICAgIGhhbmRsZXI6ICgpID0+IHRoaXMuc2hvd01lbnRpb24oKSA/IGZhbHNlIDogdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHJlYWRPbmx5OiB0aGlzLnJlYWRvbmx5KCksXG4gICAgICBwbGFjZWhvbGRlcjogdGhpcy50cmFuc2xhdGUuaW5zdGFudCh0aGlzLnBsYWNlaG9sZGVyKCkpLFxuICAgICAgdGhlbWU6ICdzbm93JyxcbiAgICAgIGJvdW5kczogdGhpcy5oZWlnaHRBdXRvKCkgPyB0aGlzLndyYXBwZXJFZGl0b3JFbCgpPy5uYXRpdmVFbGVtZW50IDogdGhpcy5xdWlsbEVkaXRvckVsKCk/Lm5hdGl2ZUVsZW1lbnQsXG4gICAgICBzY3JvbGxpbmdDb250YWluZXI6IHRoaXMuaGVpZ2h0QXV0bygpID8gdGhpcy53cmFwcGVyRWRpdG9yRWwoKT8ubmF0aXZlRWxlbWVudCA6IG51bGxcbiAgICB9KSk7XG5cbiAgICB0aGlzLnF1aWxsKCk/LmtleWJvYXJkLmFkZEJpbmRpbmcoeyBrZXk6ICdCYWNrc3BhY2UnIH0sIHRoaXMucHJldmVudEVtYmVkRGVsZXRpb24uYmluZCh0aGlzKSk7XG4gICAgdGhpcy5xdWlsbCgpPy5rZXlib2FyZC5hZGRCaW5kaW5nKHsga2V5OiAnRGVsZXRlJyB9LCB0aGlzLnByZXZlbnRFbWJlZERlbGV0aW9uLmJpbmQodGhpcykpO1xuICB9XG5cbiAgcHJpdmF0ZSBwcmV2ZW50RW1iZWREZWxldGlvbihyYW5nZTogUmFuZ2VTdGF0aWMpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMucXVpbGwoKSkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IGRlbHRhID0gdGhpcy5xdWlsbCgpPy5nZXRDb250ZW50cyhyYW5nZS5pbmRleCwgMSk7XG4gICAgaWYgKGRlbHRhPy5vcHMuc29tZShvcHRpb24gPT4gdGhpcy5ibG90c1JlZ2lzdGVyKCk/LmZpbmQoaXRlbSA9PiBnZXQob3B0aW9uLmluc2VydCwgaXRlbS5jb21wb25lbnRbJ2Jsb3ROYW1lJ10pICYmIGl0ZW0uaWdub3JlRGVsZXRlKSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTsgLy8gTmfEg24ga2jDtG5nIGNobyBRdWlsbCB44butIGzDvSB4w7NhXG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuXG4gIH1cblxuICBwcml2YXRlIHNldEhhbmRsZXJGdW5jdGlvbigpIHtcbiAgICB0aGlzLmhhbmRsZXJzLnVwZGF0ZShpdGVtID0+ICh7IC4uLml0ZW0sIGltYWdlOiB0aGlzLmhhbmRsZXJTaG93VXBsb2FkSW1hZ2UuYmluZCh0aGlzKSwgZW1vamk6ICgpID0+IHsgcmV0dXJuIH0gfSkpXG4gICAgbGV0IGxpbmsgPSBmYWxzZTtcbiAgICBjb25zdCBoYW5kbGVyc0V4cGFuZCA9IHRoaXMuaGFuZGxlcnNFeHBhbmQoKTtcbiAgICBpZiAoaGFuZGxlcnNFeHBhbmQgJiYgaGFuZGxlcnNFeHBhbmQubGVuZ3RoKSB7XG4gICAgICBoYW5kbGVyc0V4cGFuZC5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgICBpZiAoZWxlbWVudC50aXRsZSAmJiBlbGVtZW50LmFjdGlvbikge1xuICAgICAgICAgIGlmIChlbGVtZW50LnRpdGxlID09PSAnbGluaycpIHtcbiAgICAgICAgICAgIGxpbmsgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmhhbmRsZXJzLnVwZGF0ZShpdGVtID0+ICh7IC4uLml0ZW0sIFtlbGVtZW50LnRpdGxlXTogZWxlbWVudC5hY3Rpb24gfSkpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKCFsaW5rKSB7XG4gICAgICB0aGlzLmhhbmRsZXJzLnVwZGF0ZShpdGVtID0+ICh7IC4uLml0ZW0sIGxpbms6IHRoaXMuaGFuZGxlU2hvd1VwbG9hZExpbmsuYmluZCh0aGlzKSwgdW5MaW5rOiB0aGlzLmhhbmRsZXJVbkluc2VydExpbmsuYmluZCh0aGlzKSB9KSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXRDbGFzc0luY2x1ZGVBbmRSZWFkT25seSgpIHtcbiAgICBjb25zdCBlZGl0b3JFbCA9IHRoaXMuZWRpdG9yRWwoKTtcbiAgICBjb25zdCBjbGFzc0luY2x1ZGUgPSB0aGlzLmNsYXNzSW5jbHVkZSgpO1xuICAgIGNvbnN0IHJlYWRvbmx5ID0gdGhpcy5yZWFkb25seSgpO1xuICAgIGlmIChlZGl0b3JFbCkge1xuICAgICAgaWYgKGNsYXNzSW5jbHVkZSB8fCByZWFkb25seSkge1xuICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnROb2RlIG9mIGVkaXRvckVsLm5hdGl2ZUVsZW1lbnQubGFzdEVsZW1lbnRDaGlsZC5jaGlsZHJlbikge1xuICAgICAgICAgIGlmICghZWxlbWVudE5vZGUuY2xhc3NOYW1lLmluY2x1ZGVzKCdxbC1lZGl0b3InKSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChjbGFzc0luY2x1ZGUpIHtcbiAgICAgICAgICAgIGVsZW1lbnROb2RlLmNsYXNzTGlzdC5hZGQoY2xhc3NJbmNsdWRlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHJlYWRvbmx5KSB7XG4gICAgICAgICAgICBlbGVtZW50Tm9kZS5jbGFzc0xpc3QuYWRkKCchYmctWyNmOGY5ZmFdJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAocmVhZG9ubHkpIHtcbiAgICAgICAgZm9yIChjb25zdCBlbGVtZW50Tm9kZSBvZiBlZGl0b3JFbC5uYXRpdmVFbGVtZW50LmNoaWxkcmVuKSB7XG4gICAgICAgICAgaWYgKGVsZW1lbnROb2RlLmNsYXNzTmFtZS5pbmNsdWRlcygncWwtdG9vbGJhcicpKSB7XG4gICAgICAgICAgICBlbGVtZW50Tm9kZS5jbGFzc0xpc3QuYWRkKCdwb2ludGVyLWV2ZW50cy1ub25lJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhZGp1c3RJbmRleEZvckltYWdlcyhpbmRleDogbnVtYmVyKSB7XG4gICAgY29uc3QgY29udGVudCA9IHRoaXMucXVpbGwoKT8ucm9vdDtcbiAgICBsZXQgaW1hZ2VDb3VudCA9IDA7XG4gICAgbGV0IGFkanVzdGVkSW5kZXggPSAwO1xuICAgIGNvbnN0IGFkanVzdFRleHRJbmRleCA9IChub2RlOiBOb2RlKSA9PiB7XG4gICAgICBpZiAoYWRqdXN0ZWRJbmRleCA+IGluZGV4KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xuICAgICAgICBhZGp1c3RlZEluZGV4ICs9IG5vZGUudGV4dENvbnRlbnQ/Lmxlbmd0aCB8fCAwO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUgJiYgbm9kZS5ub2RlTmFtZSA9PT0gJ0lNRycpIHtcbiAgICAgICAgaWYgKGFkanVzdGVkSW5kZXggPD0gaW5kZXgpIHtcbiAgICAgICAgICBpbWFnZUNvdW50Kys7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFKSB7XG4gICAgICAgIEFycmF5LmZyb20obm9kZS5jaGlsZE5vZGVzKS5mb3JFYWNoKGFkanVzdFRleHRJbmRleCk7XG4gICAgICB9XG4gICAgfTtcbiAgICBhZGp1c3RUZXh0SW5kZXgoY29udGVudCBhcyBOb2RlKTtcbiAgICByZXR1cm4gaW1hZ2VDb3VudDtcbiAgfTtcblxuXG4gIHByaXZhdGUgaGFuZGxlclNlbGVjdGlvbkNoYW5nZSgpIHtcbiAgICB0aGlzLnF1aWxsKCk/Lm9uKCdzZWxlY3Rpb24tY2hhbmdlJywgKHJhbmdlOiBSYW5nZVN0YXRpYywgb2xkUmFuZ2U6IFJhbmdlU3RhdGljLCBzb3VyY2U6IFNvdXJjZXMpID0+IHtcbiAgICAgIGlmICh0aGlzLnJlYWRvbmx5KCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHJhbmdlID09PSBudWxsICYmIG9sZFJhbmdlICE9PSBudWxsKSB7XG4gICAgICAgIHRoaXMub3V0Qmx1ci5lbWl0KCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChyYW5nZSAhPT0gbnVsbCAmJiBvbGRSYW5nZSA9PT0gbnVsbCkge1xuICAgICAgICB0aGlzLm91dEZvY3VzLmVtaXQoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgZm9ybWF0ID0gdGhpcy5xdWlsbCgpPy5nZXRGb3JtYXQoKTtcbiAgICAgIGlmIChmb3JtYXQpIHtcbiAgICAgICAgdGhpcy5nZXRGb250KGZvcm1hdCk7XG4gICAgICAgIHRoaXMuZ2V0Rm9udFNpemUoZm9ybWF0KTtcbiAgICAgIH1cbiAgICAgIHRoaXMub3V0U2VsZWN0aW9uQ2hhbmdlLmVtaXQoe1xuICAgICAgICBxdWlsbDogdGhpcy5xdWlsbCgpIGFzIFF1aWxsLFxuICAgICAgICByYW5nZSxcbiAgICAgICAgb2xkUmFuZ2UsXG4gICAgICAgIHNvdXJjZVxuICAgICAgfSk7XG4gICAgICBpZiAocmFuZ2UubGVuZ3RoID09PSAwICYmIGZvcm1hdD8ubGluayAmJiBzb3VyY2UgPT09ICd1c2VyJykge1xuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSBkb2N1bWVudC5nZXRTZWxlY3Rpb24oKTtcbiAgICAgICAgY29uc3QgYW5jaG9yTm9kZSA9IHNlbGVjdGlvbj8uYW5jaG9yTm9kZTtcbiAgICAgICAgbGV0IGxpbmtOb2RlID0gYW5jaG9yTm9kZSBhcyBIVE1MQW5jaG9yRWxlbWVudDtcbiAgICAgICAgd2hpbGUgKGxpbmtOb2RlICYmIGxpbmtOb2RlLnRhZ05hbWUgIT09ICdBJykge1xuICAgICAgICAgIGxpbmtOb2RlID0gbGlua05vZGUucGFyZW50Tm9kZSBhcyBIVE1MQW5jaG9yRWxlbWVudDtcbiAgICAgICAgfVxuICAgICAgICBpZiAobGlua05vZGUgJiYgbGlua05vZGUudGFnTmFtZSA9PT0gJ0EnKSB7XG4gICAgICAgICAgY29uc3QgbGlua1RleHQgPSBsaW5rTm9kZS5pbm5lclRleHQ7XG4gICAgICAgICAgY29uc3QgbGlua3NJbmRpY2VzOiBBcnJheTxudW1iZXI+ID0gW107XG4gICAgICAgICAgbGV0IGluZGV4UmV0dXJuOiBudW1iZXIgfCB1bmRlZmluZWQgPSAtMTtcbiAgICAgICAgICB3aGlsZSAoIWlzTmlsKGluZGV4UmV0dXJuKSAmJiBpbmRleFJldHVybiA8IHJhbmdlLmluZGV4KSB7XG4gICAgICAgICAgICBjb25zdCB0ZXh0Q29udGVudCA9IHRoaXMucXVpbGwoKT8uZ2V0VGV4dCgpO1xuICAgICAgICAgICAgY29uc3QgbGlua0luZGV4ID0gdGV4dENvbnRlbnQ/LmluZGV4T2YobGlua1RleHQsIGxpbmtzSW5kaWNlcy5sZW5ndGggPiAwID8gbGlua3NJbmRpY2VzW2xpbmtzSW5kaWNlcy5sZW5ndGggLSAxXSArIGxpbmtUZXh0Lmxlbmd0aCA6IDApO1xuICAgICAgICAgICAgaWYgKCFpc05pbChsaW5rSW5kZXgpKSB7XG4gICAgICAgICAgICAgIGlmIChsaW5rSW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgbGlua3NJbmRpY2VzLnB1c2gobGlua0luZGV4KTtcbiAgICAgICAgICAgICAgICBpbmRleFJldHVybiA9IGxpbmtJbmRleCArIGxpbmtUZXh0Lmxlbmd0aDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAobGlua0luZGV4ID09PSAtMSkge1xuICAgICAgICAgICAgICAgIGluZGV4UmV0dXJuID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChsaW5rc0luZGljZXMgJiYgbGlua3NJbmRpY2VzLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgcmFuZ2VJbmRleCA9IGxpbmtzSW5kaWNlc1tsaW5rc0luZGljZXMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICBjb25zdCBjb3VudEltYWdlID0gdGhpcy5hZGp1c3RJbmRleEZvckltYWdlcyhyYW5nZUluZGV4KVxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMubGluay5zZXQoe1xuICAgICAgICAgICAgICAgIHRpdGxlOiBsaW5rVGV4dCxcbiAgICAgICAgICAgICAgICB1cmw6IGxpbmtOb2RlLmhyZWYsXG4gICAgICAgICAgICAgICAgcmFuZ2U6IHtcbiAgICAgICAgICAgICAgICAgIGluZGV4OiByYW5nZUluZGV4ICsgY291bnRJbWFnZSxcbiAgICAgICAgICAgICAgICAgIGxlbmd0aDogbGlua1RleHQubGVuZ3RoXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICB0aGlzLnBvcG92ZXJGdW5jdGlvbkNvbnRyb2woKT8uc2hvd1BvcG92ZXIobGlua05vZGUpXG4gICAgICAgICAgICB9LCAyNTApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVyUGFzdGUoKSB7XG4gICAgc2V0KHRoaXMucXVpbGwsICdyb290Lm9ucGFzdGUnLCBhc3luYyAoZXZlbnQ6IENsaXBib2FyZEV2ZW50KSA9PiB7XG4gICAgICBpZiAoIWV2ZW50IHx8ICFldmVudC5jbGlwYm9hcmREYXRhKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGZpbGVzID0gZXZlbnQuY2xpcGJvYXJkRGF0YS5maWxlcztcbiAgICAgIGlmICghZmlsZXMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBjb25zdCBpbWFnZXM6IEFycmF5PEZpbGU+ID0gW107XG4gICAgICBBcnJheS5mcm9tKGZpbGVzKS5mb3JFYWNoKChmaWxlKSA9PiB7XG4gICAgICAgIGlmIChmaWxlICYmIGZpbGUudHlwZS5zcGxpdCgnLycpWzBdID09PSAnaW1hZ2UnKSB7XG4gICAgICAgICAgaW1hZ2VzLnB1c2goZmlsZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgY29uc3QgbGlua3MgPSBhd2FpdCB0aGlzLnVwbG9hZEltYWdlQ29uZmlnKCkuZnVuY3Rpb25VcGxvYWRJbWFnZT8uKGltYWdlcyk7XG4gICAgICBpZiAobGlua3MgJiYgbGlua3MubGVuZ3RoKSB7XG4gICAgICAgIGxpbmtzLmZvckVhY2gobGluayA9PiB7XG4gICAgICAgICAgaWYgKCFsaW5rIHx8ICh0aGlzLnVwbG9hZEltYWdlQ29uZmlnKCkub25seUFjY2VwdEltYWdlSHR0cHNMaW5rICYmIChsaW5rIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIgfHwgIW5ldyBSZWdFeHAocGF0dGVyblVybCgpKS50ZXN0KGxpbmspKSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5pbnNlcnRJbWFnZShsaW5rIGFzIHN0cmluZyk7XG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZXJUZXh0Q2hhbmdlKCkge1xuICAgIHRoaXMucXVpbGwoKT8ub24oJ3RleHQtY2hhbmdlJywgKGV2ZW50KSA9PiB7XG4gICAgICB0aGlzLm91dFRleHRDaGFuZ2UuZW1pdCh7XG4gICAgICAgIHF1aWxsOiB0aGlzLnF1aWxsKCkgYXMgUXVpbGwsXG4gICAgICAgIGRlbHRhOiBldmVudFxuICAgICAgfSk7XG4gICAgICBjb25zdCBodG1sID0gdGhpcy5xdWlsbCgpPy5yb290LmlubmVySFRNTDtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBpZiAoZXZlbnQ/Lm9wc1sxXT8uaW5zZXJ0ID09PSAnXFxuJykge1xuICAgICAgICAgIGNvbnN0IHJhbmdlID0geyBpbmRleDogZXZlbnQ/Lm9wc1swXS5yZXRhaW4gYXMgbnVtYmVyIH07XG4gICAgICAgICAgY29uc3QgY3VycmVudExlYWYgPSB0aGlzLnF1aWxsKCk/LmdldExlYWYocmFuZ2UuaW5kZXgpWzBdO1xuICAgICAgICAgIGNvbnN0IG5leHRMZWFmID0gdGhpcy5xdWlsbCgpPy5nZXRMZWFmKHJhbmdlLmluZGV4ICsgMSlbMF07XG4gICAgICAgICAgdGhpcy5xdWlsbCgpPy5pbnNlcnRFbWJlZChyYW5nZS5pbmRleCwgJ2JyZWFrJywgdHJ1ZSwgJ3VzZXInKTtcbiAgICAgICAgICBpZiAobmV4dExlYWYgPT09IG51bGwgfHwgY3VycmVudExlYWYucGFyZW50ICE9PSBuZXh0TGVhZi5wYXJlbnQpIHtcbiAgICAgICAgICAgIHRoaXMucXVpbGwoKT8uaW5zZXJ0RW1iZWQocmFuZ2UuaW5kZXgsICdicmVhaycsIHRydWUsICd1c2VyJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMucXVpbGwoKT8uc2V0U2VsZWN0aW9uKChyYW5nZS5pbmRleCB8fCAwKSArIDEsIDAsIFF1aWxsLnNvdXJjZXMuU0lMRU5UKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBpZiAoaHRtbCA9PT0gJzxkaXY+PGJyPjwvZGl2PicgfHwgaHRtbCA9PT0gJzxkaXYgc3R5bGU9XCJ0ZXh0LWFsaWduOiBqdXN0aWZ5O1wiPjxicj48L2Rpdj4nIHx8ICF0aGlzLnF1aWxsKCk/LmdldFRleHQoKSkge1xuICAgICAgICBzZXQodGhpcy5pdGVtKCksIHRoaXMuZmllbGROYW1lQmluZCgpLCAnJyk7XG4gICAgICAgIHRoaXMudmFsaWRhdGUoKTtcbiAgICAgICAgdGhpcy5vdXRDaGFuZ2UuZW1pdChnZXQodGhpcy5pdGVtKCksIHRoaXMuZmllbGROYW1lQmluZCgpKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuY29udmVydElubmVySFRNTCgpO1xuICAgICAgdGhpcy52YWxpZGF0ZSgpO1xuICAgICAgdGhpcy5vdXRDaGFuZ2UuZW1pdChnZXQodGhpcy5pdGVtKCksIHRoaXMuZmllbGROYW1lQmluZCgpKSk7XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlclBvcG92ZXJGdW5jdGlvbkNvbnRyb2woZXZlbnQ6IElQb3BvdmVyRnVuY3Rpb25Db250cm9sRXZlbnQpIHtcbiAgICB0aGlzLnBvcG92ZXJGdW5jdGlvbkNvbnRyb2wuc2V0KGV2ZW50KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyUG9wb3ZlckV2ZW50KGV2ZW50OiBUWVBFX1BPUE9WRVJfRVZFTlQpIHtcbiAgICBpZiAoZXZlbnQgPT09ICdyZW1vdmUnKSB7XG4gICAgICB0aGlzLmxpbmsuc2V0KGxpbmtEZWZhdWx0KCkpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyVW5saW5rKGV2ZW50OiBFdmVudCkge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGNvbnN0IGxpbmsgPSB0aGlzLmxpbmsoKTtcbiAgICB0aGlzLnF1aWxsKCk/LmZvcm1hdFRleHQobGluay5yYW5nZS5pbmRleCwgbGluay5yYW5nZS5sZW5ndGgsIHsgbGluazogZmFsc2UgfSk7XG4gICAgdGhpcy5wb3BvdmVyRnVuY3Rpb25Db250cm9sKCk/LnJlbW92ZVBvcG92ZXJPdmVybGF5KCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckVkaXQoZXZlbnQ6IEV2ZW50KSB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgY29uc3QgbGluayA9IHRoaXMubGluaygpO1xuICAgIHRoaXMuaGFuZGxlU2hvd1VwbG9hZExpbmsobGluayk7XG4gICAgdGhpcy5wb3BvdmVyRnVuY3Rpb25Db250cm9sKCk/LnJlbW92ZVBvcG92ZXJPdmVybGF5KCk7XG4gIH1cblxuICBwcml2YXRlIGNhbGN1bGF0b3JUb29sYmFyKCkge1xuICAgIHRoaXMudGltZUNhbGN1bGF0aW9uVG9vbEJhci5zZXQoc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBjb25zdCB0b29sYmFyV2lkdGggPSB0aGlzLnRvb2xiYXJJdGVtc0VsKCk/Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGggfHwgMDtcblxuICAgICAgbGV0IHRvdGFsV2lkdGggPSAyODtcbiAgICAgIGNvbnN0IGhpZGRlbkl0ZW1zOiBBcnJheTxudW1iZXI+ID0gW107XG4gICAgICBjb25zdCBoaWRkZW5JdGVtc0V4cGFuZDogQXJyYXk8bnVtYmVyPiA9IFtdO1xuXG4gICAgICB0aGlzLnRvb2xiYXJPcHRpb25zQ29uZmlnKCkuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgICAgdG90YWxXaWR0aCArPSBpdGVtLndpZHRoO1xuICAgICAgICBpZiAoaXRlbS50eXBlID09PSAnbGluZScpIHtcbiAgICAgICAgICBjb25zdCBuZXh0SXRlbVdpZHRoID0gdG90YWxXaWR0aCArIHRoaXMudG9vbGJhck9wdGlvbnNDb25maWcoKVsraW5kZXggKyAxXS53aWR0aDtcbiAgICAgICAgICBpZiAobmV4dEl0ZW1XaWR0aCA+IHRvb2xiYXJXaWR0aCkge1xuICAgICAgICAgICAgaGlkZGVuSXRlbXNFeHBhbmQucHVzaCgraW5kZXgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodG90YWxXaWR0aCA+IHRvb2xiYXJXaWR0aCkge1xuICAgICAgICAgIGhpZGRlbkl0ZW1zLnB1c2goK2luZGV4KTtcblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB0aGlzLml0ZW1IaWRkZW4uc2V0KGhpZGRlbkl0ZW1zKTtcbiAgICAgIHRoaXMuaXRlbUhpZGRlbkV4cGFuZC5zZXQoaGlkZGVuSXRlbXNFeHBhbmQpO1xuICAgIH0sIDUwMCkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNldFN0eWxlKHR5cGU6IHN0cmluZywgZGF0YTogc3RyaW5nIHwgbnVtYmVyKSB7XG4gICAgdGhpcy5xdWlsbCgpPy5mb3JtYXQodHlwZSwgZGF0YSk7XG4gIH1cblxuICBwcml2YXRlIGdldEZvbnRTaXplKGZvcm1hdDogU3RyaW5nTWFwKSB7XG4gICAgY29uc3QgZm9udFNpemUgPSBmb3JtYXQ/LnNpemU/LnRvU3RyaW5nKCk/LnJlcGxhY2UoJ3B4JywgJycpO1xuICAgIGlmIChpc05hTihwYXJzZUZsb2F0KGZvbnRTaXplKSkpIHtcbiAgICAgIHRoaXMuc2l6ZS5zZXQoeyB2YWx1ZTogMTQgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc2l6ZS5zZXQoeyB2YWx1ZTogcGFyc2VGbG9hdChmb250U2l6ZSkgfSk7XG4gIH1cblxuICBwcml2YXRlIGdldEZvbnQoZm9ybWF0OiBTdHJpbmdNYXApIHtcbiAgICBjb25zdCBmb250ID0gbGlzdEZvbnQoKS5maW5kKChpdGVtKSA9PiBpdGVtLmtleSA9PT0gZm9ybWF0LmZvbnQpO1xuICAgIGlmICghZm9udCkge1xuICAgICAgdGhpcy5mb250U2VsZWN0ZWQuc2V0KHsga2V5OiAnJywgaXRlbTogbGlzdEZvbnQoKS5maW5kKChpdGVtKSA9PiBpdGVtLmtleSA9PT0gJycpIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmZvbnRTZWxlY3RlZC5zZXQoeyBrZXk6IGZvcm1hdC5mb250LCBpdGVtOiBmb250IH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZVVuZG8oKSB7XG4gICAgdGhpcy5xdWlsbCgpPy5oaXN0b3J5Py51bmRvKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlUmVkbygpIHtcbiAgICB0aGlzLnF1aWxsKCk/Lmhpc3Rvcnk/LnJlZG8oKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBzZXRDb250ZW50KGNvbnRlbnQ6IHN0cmluZykge1xuICAgIGlmICghY29udGVudCkge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiBzZXQodGhpcy5xdWlsbCwgJ3Jvb3QuaW5uZXJIVE1MJywgJycpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgY29udGVudFhzc0ZpbHRlciA9IGF3YWl0IHhzc0ZpbHRlcihjb250ZW50KTtcblxuICAgIHNldFRpbWVvdXQoKCkgPT4gc2V0KHRoaXMucXVpbGwsICdyb290LmlubmVySFRNTCcsIGNvbnRlbnRYc3NGaWx0ZXIpKTtcbiAgICBpZiAoIXRoaXMuYXV0b0ZvY3VzQm90dG9tKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnF1aWxsKCk/LmJsdXIoKTtcbiAgICAgIGNvbnN0IHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcbiAgICAgIGNvbnN0IHNlbCA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcbiAgICAgIGNvbnN0IHRhcmdldCA9IHRoaXMucXVpbGxFZGl0b3JFbCgpPy5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tjb250ZW50ZWRpdGFibGU9XCJ0cnVlXCJdJyk7XG4gICAgICBjb25zdCBjb250ZW50U2Nyb2xsID0gdGhpcy5oZWlnaHRBdXRvKCkgPyB0aGlzLndyYXBwZXJFZGl0b3JFbCgpPy5uYXRpdmVFbGVtZW50IDogdGFyZ2V0O1xuICAgICAgcmFuZ2Uuc2VsZWN0Tm9kZUNvbnRlbnRzKHRhcmdldCk7XG4gICAgICByYW5nZS5jb2xsYXBzZShmYWxzZSk7XG4gICAgICBzZWw/LnJlbW92ZUFsbFJhbmdlcygpO1xuICAgICAgc2VsPy5hZGRSYW5nZShyYW5nZSk7XG4gICAgICB0YXJnZXQuZm9jdXMoKTtcbiAgICAgIGNvbnRlbnRTY3JvbGwuc2Nyb2xsVG9wID0gY29udGVudFNjcm9sbC5zY3JvbGxIZWlnaHQ7XG4gICAgfSwgMTAwKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyQWRkRW1vamkoZW1vamk6IHVua25vd24pIHtcbiAgICBjb25zdCBzZWxlY3Rpb24gPSB0aGlzLnF1aWxsKCk/LmdldFNlbGVjdGlvbih0cnVlKS5pbmRleDtcbiAgICBpZiAoIWlzTmlsKHNlbGVjdGlvbikpIHtcbiAgICAgIHRoaXMucXVpbGwoKT8uaW5zZXJ0VGV4dChzZWxlY3Rpb24sIGVtb2ppIGFzIHN0cmluZyk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZVNob3dVcGxvYWRMaW5rKGV2ZW50OiB1bmtub3duKSB7XG4gICAgdGhpcy5hZGRFZGl0TGlua0NvbXBvbmVudFJlZi5zZXQodGhpcy5keW5hbWljQ29tcG9uZW50U2VydmljZS5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShMaWJzVWlDb21wb25lbnRzSW5wdXRzUXVpbGxMaW5rQ29tcG9uZW50KSk7XG4gICAgY29uc3QgaW5zdGFuY2UgPSB0aGlzLmFkZEVkaXRMaW5rQ29tcG9uZW50UmVmKCk/Lmluc3RhbmNlO1xuICAgIGNvbnN0IHNlbGVjdGlvbiA9IHRoaXMucXVpbGwoKT8uZ2V0U2VsZWN0aW9uKCk7XG4gICAgY29uc3QgdGV4dFNlbGVjdGVkID0gc2VsZWN0aW9uPy5sZW5ndGggPyB0aGlzLnF1aWxsKCk/LmdldFRleHQoc2VsZWN0aW9uPy5pbmRleCwgc2VsZWN0aW9uPy5sZW5ndGgpIDogJyc7XG4gICAgY29uc3QgZGF0YSA9IGV2ZW50IGFzIElRdWlsbExpbmsgfCB1bmRlZmluZWQ7XG4gICAgdGhpcy5hZGRFZGl0TGlua0NvbXBvbmVudFJlZigpPy5zZXRJbnB1dCgnekluZGV4JywgdGhpcy56SW5kZXgoKSk7XG4gICAgdGhpcy5hZGRFZGl0TGlua0NvbXBvbmVudFJlZigpPy5zZXRJbnB1dCgndGl0bGUnLCBkYXRhPy50aXRsZSB8fCB0ZXh0U2VsZWN0ZWQpO1xuICAgIHRoaXMuYWRkRWRpdExpbmtDb21wb25lbnRSZWYoKT8uc2V0SW5wdXQoJ2xpbmsnLCBkYXRhPy51cmwgfHwgJycpO1xuICAgIGluc3RhbmNlPy5vdXRTYXZlTGluay5zdWJzY3JpYmUoKGl0ZW06IHsgdGl0bGU6IHN0cmluZywgbGluazogc3RyaW5nIH0pID0+IHtcbiAgICAgIGlmIChkYXRhIGluc3RhbmNlb2YgT2JqZWN0ICYmIGRhdGEudXJsKSB7XG4gICAgICAgIHRoaXMucXVpbGwoKT8uZGVsZXRlVGV4dChkYXRhLnJhbmdlLmluZGV4LCBkYXRhLnJhbmdlLmxlbmd0aCwgUXVpbGwuc291cmNlcy5VU0VSKTtcbiAgICAgICAgdGhpcy5xdWlsbCgpPy5pbnNlcnRUZXh0KGRhdGEucmFuZ2UuaW5kZXgsIGl0ZW0udGl0bGUsICdsaW5rJywgaXRlbS5saW5rKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5pbnNlcnRMaW5rKGl0ZW0udGl0bGUsIGl0ZW0ubGluayk7XG4gICAgfSk7XG4gICAgaW5zdGFuY2U/Lm91dENsb3NlLnN1YnNjcmliZSgoKSA9PiB0aGlzLmR5bmFtaWNDb21wb25lbnRTZXJ2aWNlLnJlbW92ZSh0aGlzLmFkZEVkaXRMaW5rQ29tcG9uZW50UmVmKCkpKTtcbiAgICB0aGlzLmR5bmFtaWNDb21wb25lbnRTZXJ2aWNlLmFkZFRvQm9keSh0aGlzLmFkZEVkaXRMaW5rQ29tcG9uZW50UmVmKCkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJVbkluc2VydExpbmsoKSB7XG4gICAgY29uc3Qgc2VsZWN0aW9uID0gdGhpcy5xdWlsbCgpPy5nZXRTZWxlY3Rpb24odHJ1ZSk7XG4gICAgaWYgKCFpc05pbChzZWxlY3Rpb24pKSB7XG4gICAgICB0aGlzLnF1aWxsKCk/LmZvcm1hdFRleHQoc2VsZWN0aW9uLCAnbGluaycsIGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgdmFsaWRhdGUoKSB7XG4gICAgdGhpcy5tZXNzYWdlRXJyb3Iuc2V0KCcnKTtcbiAgICBjb25zdCB2YWxpZFJlcXVpcmVkID0gdGhpcy52YWxpZFJlcXVpcmVkKCk7XG4gICAgY29uc3QgaXRlbSA9IHRoaXMuaXRlbSgpO1xuICAgIGNvbnN0IGZpZWxkTmFtZUJpbmQgPSB0aGlzLmZpZWxkTmFtZUJpbmQoKTtcbiAgICBjb25zdCB2YWx1ZSA9IGdldChpdGVtLCBmaWVsZE5hbWVCaW5kKTtcbiAgICBpZiAodmFsaWRSZXF1aXJlZCAmJiB2YWxpZFJlcXVpcmVkLmlzUmVxdWlyZWQgJiYgKCFmaWVsZE5hbWVCaW5kIHx8ICF2YWx1ZSB8fCAhdmFsdWUudHJpbSgpKSkge1xuICAgICAgdGhpcy5tZXNzYWdlRXJyb3Iuc2V0KHZhbGlkUmVxdWlyZWQubWVzc2FnZSB8fCBFUlJPUl9NRVNTQUdFX0VNUFRZX1ZBTElEKTtcbiAgICAgIHRoaXMub3V0TWVzc2FnZUVycm9yLmVtaXQodGhpcy5tZXNzYWdlRXJyb3IoKSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IHZhbGlkTWluTGVuZ3RoID0gdGhpcy52YWxpZE1pbkxlbmd0aCgpO1xuICAgIGlmICh2YWxpZE1pbkxlbmd0aCAmJiBmaWVsZE5hbWVCaW5kICYmIHZhbHVlICYmIHZhbHVlLnRyaW0oKS5sZW5ndGggPCB2YWxpZE1pbkxlbmd0aC5sZW5ndGgpIHtcbiAgICAgIHRoaXMubWVzc2FnZUVycm9yLnNldCh2YWxpZE1pbkxlbmd0aC5tZXNzYWdlIHx8IEVSUk9SX01FU1NBR0VfTUlOX0xFTkdUSCk7XG4gICAgICB0aGlzLm91dE1lc3NhZ2VFcnJvci5lbWl0KHRoaXMubWVzc2FnZUVycm9yKCkpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCB2YWxpZE1heExlbmd0aCA9IHRoaXMudmFsaWRNYXhMZW5ndGgoKTtcbiAgICBpZiAodmFsaWRNYXhMZW5ndGggJiYgZmllbGROYW1lQmluZCAmJiB2YWx1ZSAmJiB2YWx1ZS50cmltKCkubGVuZ3RoID4gdGhpcy52YWxpZE1heExlbmd0aC5sZW5ndGgpIHtcbiAgICAgIHRoaXMubWVzc2FnZUVycm9yLnNldCh2YWxpZE1heExlbmd0aC5tZXNzYWdlIHx8IEVSUk9SX01FU1NBR0VfTUFYX0xFTkdUSCk7XG4gICAgICB0aGlzLm91dE1lc3NhZ2VFcnJvci5lbWl0KHRoaXMubWVzc2FnZUVycm9yKCkpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLm91dE1lc3NhZ2VFcnJvci5lbWl0KHRoaXMubWVzc2FnZUVycm9yKCkpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGluc2VydEltYWdlKGNvbnRlbnQ6IHN0cmluZywgaW5kZXg/OiBudW1iZXIpIHtcbiAgICBjb25zdCBzZWxlY3Rpb24gPSBpbmRleCA/PyB0aGlzLnF1aWxsKCk/LmdldFNlbGVjdGlvbih0cnVlKS5pbmRleDtcbiAgICBpZiAoIWlzTmlsKHNlbGVjdGlvbikpIHtcbiAgICAgIHRoaXMucXVpbGwoKT8uaW5zZXJ0RW1iZWQoc2VsZWN0aW9uLCAnaW1hZ2UnLCBjb250ZW50KTtcbiAgICAgIHRoaXMucXVpbGwoKT8uc2V0U2VsZWN0aW9uKHNlbGVjdGlvbiArIDEsIDApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaW5zZXJ0VGV4dChjb250ZW50OiBzdHJpbmcsIGluZGV4PzogbnVtYmVyKSB7XG4gICAgY29uc3Qgc2VsZWN0aW9uID0gaW5kZXggPz8gdGhpcy5xdWlsbCgpPy5nZXRTZWxlY3Rpb24odHJ1ZSkuaW5kZXg7XG4gICAgaWYgKCFpc05pbChzZWxlY3Rpb24pKSB7XG4gICAgICB0aGlzLnF1aWxsKCk/Lmluc2VydFRleHQoc2VsZWN0aW9uLCBjb250ZW50KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGluc2VydExpbmsodGV4dDogc3RyaW5nLCB1cmw6IHN0cmluZywgaW5kZXg/OiBudW1iZXIpIHtcbiAgICBjb25zdCBzZWxlY3Rpb24gPSB0aGlzLnF1aWxsKCk/LmdldFNlbGVjdGlvbih0cnVlKTtcbiAgICBjb25zdCBpbmRleEluc2VydCA9IGluZGV4ID8/IHNlbGVjdGlvbj8uaW5kZXg7XG4gICAgaWYgKHNlbGVjdGlvbj8ubGVuZ3RoKSB7XG4gICAgICB0aGlzLnF1aWxsKCk/LmRlbGV0ZVRleHQoc2VsZWN0aW9uLmluZGV4LCBzZWxlY3Rpb24ubGVuZ3RoLCBRdWlsbC5zb3VyY2VzLlVTRVIpO1xuICAgIH1cbiAgICBpZiAoIWlzTmlsKGluZGV4SW5zZXJ0KSkge1xuICAgICAgdGhpcy5xdWlsbCgpPy5pbnNlcnRUZXh0KGluZGV4SW5zZXJ0LCB0ZXh0LCAnbGluaycsIHVybCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0SW5uZXJIVE1MKCkge1xuICAgIHRoaXMuc2V0U3R5bGVGb3JDb250ZW50KCk7XG4gICAgc2V0KHRoaXMuaXRlbSgpLCB0aGlzLmZpZWxkTmFtZUJpbmQoKSwgdGhpcy5xdWlsbCgpPy5yb290LmlubmVySFRNTCk7XG4gIH1cblxuICBwcml2YXRlIHNldFN0eWxlRm9yQ29udGVudCgpIHtcbiAgICBjb25zdCBzdHlsZUFycmF5ID0gW1xuICAgICAgeyBzZWxlY3RvcjogJy5xbC1mb250LUFyaWFsJywgc3R5bGU6ICdmb250LWZhbWlseTogQXJpYWwnIH0sXG4gICAgICB7IHNlbGVjdG9yOiAnLnFsLWZvbnQtc2Fucy1zZXJpZicsIHN0eWxlOiAnZm9udC1mYW1pbHk6IHNhbnMtc2VyaWYnIH0sXG4gICAgICB7IHNlbGVjdG9yOiAnLnFsLWZvbnQtc2VyaWYnLCBzdHlsZTogJ2ZvbnQtZmFtaWx5OiBzZXJpZicgfSxcbiAgICAgIHsgc2VsZWN0b3I6ICcucWwtZm9udC1tb25vc3BhY2UnLCBzdHlsZTogJ2ZvbnQtZmFtaWx5OiBtb25vc3BhY2UnIH0sXG4gICAgICB7IHNlbGVjdG9yOiAnLnFsLWZvbnQtSGVsdmV0aWNhJywgc3R5bGU6ICdmb250LWZhbWlseTogSGVsdmV0aWNhJyB9LFxuICAgICAgeyBzZWxlY3RvcjogJy5saWJzLXVpLXF1aWxsLWZvcm1hdC1pbWFnZScsIHN0eWxlOiAnbWF4LXdpZHRoOiAxMDAlOyBoZWlnaHQ6IGF1dG8nLCBvdmVycmlkZVN0eWxlOiB0cnVlIH0sXG4gICAgICB7IHNlbGVjdG9yOiAnLmxpYnMtdWktcXVpbGwtbWVudGlvbicsIHN0eWxlOiAnZm9udC13ZWlnaHQ6IDYwMDstbW96LW9zeC1mb250LXNtb290aGluZzogZ3JheXNjYWxlOy13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkOyBjb2xvcjogIzcyMzlFQScsIG92ZXJyaWRlU3R5bGU6IHRydWUgfSxcbiAgICAgIHsgc2VsZWN0b3I6ICdibG9ja3F1b3RlJywgc3R5bGU6ICdib3JkZXItbGVmdDogNHB4IHNvbGlkICNjY2M7IG1hcmdpbi1ib3R0b206IDVweDsgbWFyZ2luLXRvcDogNXB4OyBwYWRkaW5nLWxlZnQ6IDE2cHgnLCBvdmVycmlkZVN0eWxlOiB0cnVlIH1cbiAgICBdO1xuICAgIHRoaXMuYmxvdHNSZWdpc3RlcigpPy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgc3R5bGVBcnJheS5wdXNoKHsgc2VsZWN0b3I6IGAuJHtpdGVtLmNsYXNzTmFtZX1gLCBzdHlsZTogaXRlbS5zdHlsZSwgb3ZlcnJpZGVTdHlsZTogdHJ1ZSB9KTtcbiAgICB9KTtcbiAgICBzdHlsZUFycmF5LmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIGNvbnN0IGVsZW1lbnRzID0gdGhpcy5xdWlsbCgpPy5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoaXRlbS5zZWxlY3Rvcik7XG4gICAgICBlbGVtZW50cz8uZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICBpZiAoaXRlbS5vdmVycmlkZVN0eWxlKSB7XG4gICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgaXRlbS5zdHlsZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIEZpeGJ1ZyBpc3N1ZTogaHR0cHM6Ly9hZG1pbi1jdi5tb2Jpby52bi9pc3N1ZXMvNDkwOTJcbiAgICAgICAgbGV0IHN0eWxlRXhpc3QgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnc3R5bGUnKTtcbiAgICAgICAgaWYgKHN0eWxlRXhpc3QpIHtcbiAgICAgICAgICBbJ2ZvbnQtZmFtaWx5OiBBcmlhbCcsICdmb250LWZhbWlseTogc2Fucy1zZXJpZicsICdmb250LWZhbWlseTogc2VyaWYnLCAnZm9udC1mYW1pbHk6IG1vbm9zcGFjZScsICdmb250LWZhbWlseTogSGVsdmV0aWNhJ10uZm9yRWFjaChmb250ID0+IHtcbiAgICAgICAgICAgIHN0eWxlRXhpc3QgPSAoc3R5bGVFeGlzdD8uaW5jbHVkZXMoYCR7Zm9udH07YCkgPyBzdHlsZUV4aXN0Py5yZXBsYWNlKGAke2ZvbnR9O2AsICcnKSA6IHN0eWxlRXhpc3Q/LnJlcGxhY2UoZm9udCwgJycpKSBhcyBzdHJpbmc7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgc3R5bGVFeGlzdCA/IGAke3N0eWxlRXhpc3R9JHtzdHlsZUV4aXN0W3N0eWxlRXhpc3QubGVuZ3RoIC0gMV0gPT09ICc7JyA/ICcnIDogJzsnfSR7aXRlbS5zdHlsZX07YCA6IGl0ZW0uc3R5bGUpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlVG9nZ2xlTWVudGlvbihzaG93OiBib29sZWFuKSB7XG4gICAgdGhpcy5zaG93TWVudGlvbi5zZXQoc2hvdyk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZXJTaG93VXBsb2FkSW1hZ2UoKSB7XG4gICAgaWYgKHRoaXMudXBsb2FkSW1hZ2VDb25maWcoKS5tb2RlQ3VzdG9tKSB7XG4gICAgICB0aGlzLnVwbG9hZEltYWdlQ29tcG9uZW50UmVmLnNldCh0aGlzLmR5bmFtaWNDb21wb25lbnRTZXJ2aWNlLnJlc29sdmVDb21wb25lbnRGYWN0b3J5KExpYnNVaUNvbXBvbmVudHNJbnB1dHNRdWlsbFVwbG9hZEltYWdlQ29tcG9uZW50KSk7XG4gICAgICBjb25zdCBpbnN0YW5jZSA9IHRoaXMudXBsb2FkSW1hZ2VDb21wb25lbnRSZWYoKT8uaW5zdGFuY2U7XG4gICAgICB0aGlzLnVwbG9hZEltYWdlQ29tcG9uZW50UmVmKCk/LnNldElucHV0KCd1cGxvYWRJbWFnZUNvbmZpZycsIHRoaXMudXBsb2FkSW1hZ2VDb25maWcoKSk7XG4gICAgICBpbnN0YW5jZT8ub3V0Q2xvc2Uuc3Vic2NyaWJlKChsaW5rOiBzdHJpbmcgfCB2b2lkKSA9PiB7XG4gICAgICAgIHRoaXMuZHluYW1pY0NvbXBvbmVudFNlcnZpY2UucmVtb3ZlKHRoaXMudXBsb2FkSW1hZ2VDb21wb25lbnRSZWYoKSk7XG4gICAgICAgIGlmIChsaW5rKSB7XG4gICAgICAgICAgdGhpcy5pbnNlcnRJbWFnZShsaW5rKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB0aGlzLmR5bmFtaWNDb21wb25lbnRTZXJ2aWNlLmFkZFRvQm9keSh0aGlzLnVwbG9hZEltYWdlQ29tcG9uZW50UmVmKCkpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgaW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpO1xuICAgIGlucHV0LnNldEF0dHJpYnV0ZSgndHlwZScsICdmaWxlJyk7XG4gICAgaW5wdXQuc2V0QXR0cmlidXRlKCdhY2NlcHQnLCAnaW1hZ2UvKicpO1xuICAgIGlucHV0LmNsaWNrKCk7XG4gICAgaW5wdXQub25jaGFuZ2UgPSBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBmaWxlID0gaW5wdXQ/LmZpbGVzPy5bMF07XG5cbiAgICAgIGlmICghZmlsZSB8fCBmaWxlLnR5cGUuc3BsaXQoJy8nKVswXSAhPT0gJ2ltYWdlJykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBsaW5rcyA9IGF3YWl0IHRoaXMudXBsb2FkSW1hZ2VDb25maWcoKS5mdW5jdGlvblVwbG9hZEltYWdlPy4oW2ZpbGVdKTtcbiAgICAgIGlmIChsaW5rcyAmJiBsaW5rcy5sZW5ndGgpIHtcbiAgICAgICAgbGlua3MuZm9yRWFjaChsaW5rID0+IHtcbiAgICAgICAgICBpZiAoIWxpbmsgfHwgKHRoaXMudXBsb2FkSW1hZ2VDb25maWcoKS5vbmx5QWNjZXB0SW1hZ2VIdHRwc0xpbmsgJiYgKGxpbmsgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlciB8fCAhbmV3IFJlZ0V4cChwYXR0ZXJuVXJsKCkpLnRlc3QobGluaykpKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmluc2VydEltYWdlKGxpbmsgYXMgc3RyaW5nKTtcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGluc2VydE1lbnRpb24oZXZlbnQ6IElNZW50aW9uSW5zZXJ0KSB7XG4gICAgY29uc3QgcmFuZ2UgPSB0aGlzLnF1aWxsKCk/LmdldFNlbGVjdGlvbigpO1xuICAgIGlmICghcmFuZ2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgY3Vyc29yUG9zID0gcmFuZ2UuaW5kZXg7XG4gICAgY29uc3Qgc3RhcnRQb3NJbnNlcnQgPSBjdXJzb3JQb3MgLSBldmVudC5sZW5ndGhLZXk7XG4gICAgdGhpcy5xdWlsbCgpPy5kZWxldGVUZXh0KHN0YXJ0UG9zSW5zZXJ0LCBldmVudC5sZW5ndGhLZXksIFF1aWxsLnNvdXJjZXMuVVNFUik7XG4gICAgdGhpcy5xdWlsbCgpPy5pbnNlcnRFbWJlZChzdGFydFBvc0luc2VydCwgJ21lbnRpb24nLCBldmVudC5kYXRhLCBRdWlsbC5zb3VyY2VzLlVTRVIpO1xuICAgIHRoaXMucXVpbGwoKT8uaW5zZXJ0VGV4dChzdGFydFBvc0luc2VydCArIDEsICcgJywgUXVpbGwuc291cmNlcy5VU0VSKTtcbiAgICB0aGlzLnF1aWxsKCk/LnNldFNlbGVjdGlvbihzdGFydFBvc0luc2VydCArIDIsIDAsIFF1aWxsLnNvdXJjZXMuVVNFUik7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckluc2VydE1lbnRpb24oZGF0YTogSU1lbnRpb25JbnNlcnQpIHtcbiAgICB0aGlzLmluc2VydE1lbnRpb24oZGF0YSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgc2V0Rm9udFNpemUoc2l6ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5xdWlsbCgpPy5mb3JtYXQoJ3NpemUnLCBgJHtzaXplfXB4YCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlclZhbHVlQ2hhbmdlKHZhbHVlOiBudW1iZXIgfCBzdHJpbmcpIHtcbiAgICB0aGlzLnNpemUudXBkYXRlKGl0ZW0gPT4gKHsgLi4uaXRlbSwgdmFsdWU6IHZhbHVlIGFzIG51bWJlciB9KSk7XG4gICAgdGhpcy5xdWlsbCgpPy5mb3JtYXQoJ3NpemUnLCBgJHt0aGlzLnNpemUoKS52YWx1ZX1weGApO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZVNlbGVjdEFsaWduKGV2ZW50OiBJRW1pdFNlbGVjdEtleSB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuYWxpZ25TZWxlY3RlZC5zZXQoZXZlbnQpO1xuICAgIHRoaXMuc2V0U3R5bGUoJ2FsaWduJywgZXZlbnQ/LmtleSBhcyBzdHJpbmcpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZVNlbGVjdEZvbnQoZXZlbnQ6IElFbWl0U2VsZWN0S2V5IHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5mb250U2VsZWN0ZWQuc2V0KGV2ZW50KTtcbiAgICB0aGlzLnNldFN0eWxlKCdmb250JywgZXZlbnQ/LmtleSBhcyBzdHJpbmcpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJDaGFuZ2VTaG93TW9yZUFjdGlvbihldmVudDogRXZlbnQpIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLnNob3dNb3JlQWN0aW9uLnVwZGF0ZShpdGVtID0+ICFpdGVtKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMub25EZXN0cm95Lm5leHQoKTtcbiAgICB0aGlzLm9uRGVzdHJveS5jb21wbGV0ZSgpO1xuICAgIHRoaXMuZHluYW1pY0NvbXBvbmVudFNlcnZpY2UucmVtb3ZlKHRoaXMuYWRkRWRpdExpbmtDb21wb25lbnRSZWYoKSk7XG4gICAgdGhpcy5keW5hbWljQ29tcG9uZW50U2VydmljZS5yZW1vdmUodGhpcy51cGxvYWRJbWFnZUNvbXBvbmVudFJlZigpKTtcbiAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lQ2FsY3VsYXRpb25Ub29sQmFyKCkpO1xuICB9XG59XG5cbiIsIjxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIHctZnVsbCBoLWZ1bGxcIj5cbiAgQGlmIChsYWJlbCgpOyBhcyBsYWJlbCkge1xuICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtbGFiZWwgW2NsYXNzSW5jbHVkZV09XCJsYWJlbC5jbGFzc0luY2x1ZGVcIlxuICAgICAgW3JlcXVpcmVkXT1cImxhYmVsLnJlcXVpcmVkXCJcbiAgICAgIFtsYWJlbExlZnRdPVwibGFiZWwubGFiZWxMZWZ0XCIgLz5cbiAgfVxuICA8ZGl2ICN3cmFwcGVyRWRpdG9yXG4gICAgW2F0dHIuaGVpZ2h0QXV0b109XCJoZWlnaHRBdXRvKClcIlxuICAgIFthdHRyLmlzVG9vbGJhclBvc2l0b25GaXhlZF09XCJpc1Rvb2xiYXJQb3NpdG9uRml4ZWQoKVwiXG4gICAgY2xhc3M9XCJsaWJzLXVpLXF1aWxsLXdyYXBwZXIgdy1mdWxsIGgtZnVsbCByZWxhdGl2ZSBmbGV4IGZsZXgtY29sXCJcbiAgICBbY2xhc3MubGlicy11aS1ib3JkZXItZXJyb3ItZ2VuZXJhbF09XCJtZXNzYWdlRXJyb3IoKSAmJiBzaG93RXJyb3JCb3JkZXIoKSAmJiAhb25seVNob3dFcnJvckJvcmRlckluQ29udGVudCgpXCJcbiAgICBbY2xhc3Mucm91bmRlZC1bNHB4XV09XCJtZXNzYWdlRXJyb3IoKSAmJiBzaG93RXJyb3JCb3JkZXIoKSAmJiAhb25seVNob3dFcnJvckJvcmRlckluQ29udGVudCgpXCI+XG4gICAgPGRpdiAjZWRpdG9yXG4gICAgICBjbGFzcz1cImxpYnMtdWktcXVpbGxcIlxuICAgICAgW2F0dHIuc2hvd0Vycm9yXT1cIm1lc3NhZ2VFcnJvcigpICYmIHNob3dFcnJvckJvcmRlcigpICYmIG9ubHlTaG93RXJyb3JCb3JkZXJJbkNvbnRlbnQoKVwiXG4gICAgICBbY2xhc3MuIWhpZGRlbl09XCIhZGlzcGxheSgpXCI+XG4gICAgICAgIDxkaXYgI3F1aWxsT3B0aW9uXG4gICAgICAgICAgW2NsYXNzLiFoaWRkZW5dPVwiIWlzU2hvd1Rvb2xCYXIoKVwiXG4gICAgICAgICAgY2xhc3M9XCJiZy1bI2Y4ZjlmYV0ge3tpc1Rvb2xiYXJQb3NpdG9uRml4ZWQoKSA/ICdmaXhlZCBweC1bOHB4XSBweS1bNHB4XSBwLTAgdy1bNTAwcHhdIHJvdW5kZWQtWzRweF0gYmctWyNmZmZmZmZdIGxpYnMtdWktcXVpbGwtdG9vbGJhci1hbmltYXRpb24nOicnfX0ge3sgY2xhc3NJbmNsdWRlVG9vbGJhcigpIH19XCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRvb2xiYXJcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8ZGl2ICNxdWlsbEVkaXRvclxuICAgICAgICBMaWJzVWlDb21wb25lbnRzSW5wdXRzTWVudGlvbkRpcmVjdGl2ZVxuICAgICAgICBbbWVudGlvbkNvbmZpZ109XCJkYXRhQ29uZmlnTWVudGlvbigpXCJcbiAgICAgICAgKG91dFRvZ2dsZSk9XCJoYW5kbGVUb2dnbGVNZW50aW9uKCRldmVudClcIlxuICAgICAgICAob3V0SW5zZXJ0TWVudGlvbik9XCJoYW5kbGVySW5zZXJ0TWVudGlvbigkZXZlbnQpXCI+PC9kaXY+XG4gICAgPC9kaXY+XG4gICAgQGlmICh0ZW1wbGF0ZSgpOyBhcyB0ZW1wbGF0ZSkge1xuICAgICAgPGRpdiBbY2xhc3NdPVwiY2xhc3NJbmNsdWRlVGVtcGxhdGUoKVwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvZGl2PlxuICAgIH1cbiAgPC9kaXY+XG4gIEBpZiAobWVzc2FnZUVycm9yKCkgJiYgc2hvd0Vycm9yTGFiZWwoKSkge1xuICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBsZWFkaW5nLW5vcm1hbCBtdC1bOHB4XVwiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LVsjZmY1NDU0XSBsaWJzLXVpLWZvbnQtaDdyXCI+IHt7IG1lc3NhZ2VFcnJvcigpIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgIDwvZGl2PlxuICB9XG48L2Rpdj5cblxuPG5nLXRlbXBsYXRlICN0b29sYmFyPlxuICA8ZGl2IGNsYXNzPVwidG9vbGJhclwiXG4gICAgI3Rvb2xiYXJJdGVtcz5cbiAgICA8ZGl2IGNsYXNzPVwicWwtZm9ybWF0cyBpdGVtcy1jZW50ZXJcIj5cbiAgICAgIEBmb3IgKG9wdGlvbiBvZiB0b29sYmFyT3B0aW9uc0NvbmZpZygpOyB0cmFjayBvcHRpb24pIHtcbiAgICAgICAgPGRpdiAjaXRlbVxuICAgICAgICAgIFtpZF09XCJvcHRpb24udHlwZSsnXycrJGluZGV4XCJcbiAgICAgICAgICBjbGFzcz1cIml0ZW1zLWNlbnRlclwiXG4gICAgICAgICAgW2NsYXNzLmhpZGRlbl09XCJpdGVtSGlkZGVuKCkuaW5jbHVkZXMoJGluZGV4KSB8fCBpdGVtSGlkZGVuRXhwYW5kKCkuaW5jbHVkZXMoJGluZGV4KVwiXG4gICAgICAgICAgW2NsYXNzLmZsZXhdPVwiIWl0ZW1IaWRkZW4oKS5pbmNsdWRlcygkaW5kZXgpXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIml0ZW1UZW1wbGF0ZTtjb250ZXh0OntvcHRpb24sICRpbmRleCwgJGxhc3R9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgICAgPGRpdiBjbGFzcz1cInJlbGF0aXZlXCI+XG4gICAgICAgIEBpZiAoaXRlbUhpZGRlbigpLmxlbmd0aCkge1xuICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1idXR0b24gW3R5cGVdPVwic2hvd01vcmVBY3Rpb24oKSA/ICdidXR0b24tc2Vjb25kYXJ5JyA6ICdidXR0b24tdGhpcmQnXCJcbiAgICAgICAgICAgIFtpY29uT25seVR5cGVdPVwidHJ1ZVwiXG4gICAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cIichcC1bMXB4XSAhaC1bMjBweF0gbWwtWzhweF0nXCJcbiAgICAgICAgICAgIFtjbGFzc0ljb25MZWZ0XT1cIidsaWJzLXVpLWljb24tbW92ZS1yaWdodCByb3RhdGUtOTAnXCJcbiAgICAgICAgICAgIChvdXRDbGljayk9XCJoYW5kbGVyQ2hhbmdlU2hvd01vcmVBY3Rpb24oJGV2ZW50KVwiIC8+XG4gICAgICAgIH1cbiAgICAgICAgPCEtLSBCdWlsZCB0b29sYmFyIGtoaSBjbGljayB4ZW0gdGjDqm0tLT5cbiAgICAgICAgPGRpdiBbY2xhc3MuaGlkZGVuXT1cIiFzaG93TW9yZUFjdGlvbigpIHx8ICFpdGVtSGlkZGVuKCkubGVuZ3RoXCJcbiAgICAgICAgICBjbGFzcz1cImFic29sdXRlIGJnLVsjZmZmZmZmXSBzaGFkb3ctbWQgei1bMV0gZmxleCBpdGVtcy1jZW50ZXIgcGwtWzhweF0gcHItWzE2cHhdIHB5LVs0cHhdIHJvdW5kZWQtWzhweF0gdG9wLVszMXB4XSByaWdodC1bMHB4XVwiPlxuICAgICAgICAgIEBmb3IgKG9wdGlvbiBvZiB0b29sYmFyT3B0aW9uc0NvbmZpZygpOyB0cmFjayBvcHRpb24pIHtcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpdGVtcy1jZW50ZXJcIlxuICAgICAgICAgICAgICBbY2xhc3MuaGlkZGVuXT1cIiFpdGVtSGlkZGVuKCkuaW5jbHVkZXMoJGluZGV4KVwiXG4gICAgICAgICAgICAgIFtjbGFzcy5mbGV4XT1cIml0ZW1IaWRkZW4oKS5pbmNsdWRlcygkaW5kZXgpXCI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpdGVtVGVtcGxhdGU7Y29udGV4dDp7b3B0aW9uLCAkaW5kZXgsICRsYXN0fVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cblxuPG5nLXRlbXBsYXRlICNpdGVtVGVtcGxhdGVcbiAgbGV0LSRpbmRleD1cIiRpbmRleFwiXG4gIGxldC0kbGFzdD1cIiRsYXN0XCJcbiAgbGV0LW9wdGlvbj1cIm9wdGlvblwiPlxuICBAaWYgKG9wdGlvbi50eXBlID09PSAndW5kbycpIHtcbiAgICA8ZGl2IFtjbGFzc109XCJvcHRpb24uY2xhc3NJbmNsdWRlIHx8ICdteC1bOHB4XSdcIj5cbiAgICAgIDxidXR0b24gTGlic1VpQ29tcG9uZW50c1BvcG92ZXJEaXJlY3RpdmVcbiAgICAgICAgW2NvbmZpZ109XCJ7Y29udGVudDogJ2kxOG5fdW5kbycsIHpJbmRleDogMTI1MH1cIlxuICAgICAgICBjbGFzcz1cInFsLXVuZG9cIj48L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgfVxuICBAaWYgKG9wdGlvbi50eXBlID09PSAncmVkbycpIHtcbiAgICA8ZGl2IFtjbGFzc109XCJvcHRpb24uY2xhc3NJbmNsdWRlIHx8ICdteC1bOHB4XSdcIj5cbiAgICAgIDxidXR0b24gTGlic1VpQ29tcG9uZW50c1BvcG92ZXJEaXJlY3RpdmVcbiAgICAgICAgW2NvbmZpZ109XCJ7Y29udGVudDogJ2kxOG5fcmVkbycsIHpJbmRleDogMTI1MH1cIlxuICAgICAgICBjbGFzcz1cInFsLXJlZG9cIj48L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgfVxuICBAaWYgKG9wdGlvbi50eXBlID09PSAnZm9udEZhbWlseScpIHtcbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cInJlbGF0aXZlIHctWzExN3B4XSBoLWZ1bGwgYmctWyNmZmZmZmZdIHJvdW5kZWQtWzRweF0gbGlicy11aS1ib3JkZXItZ2VuZXJhbCB7eyBvcHRpb24uY2xhc3NJbmNsdWRlIHx8ICdteC1bOHB4XScgfX1cIj5cbiAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtZHJvcGRvd24gW2lzTmdDb250ZW50XT1cInRydWVcIlxuICAgICAgICBbbGFiZWxQb3BvdmVyRnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICBbbGlzdENvbmZpZ109XCJsaXN0Q29uZmlnRm9udCgpXCJcbiAgICAgICAgW2xpc3RIYXNCdXR0b25VblNlbGVjdE9wdGlvbl09XCJmYWxzZVwiXG4gICAgICAgIFtsaXN0SGlkZGVuSW5wdXRTZWFyY2hdPVwidHJ1ZVwiXG4gICAgICAgIFtsaXN0TWF4SXRlbVNob3ddPVwiOFwiXG4gICAgICAgIFt6SW5kZXhdPVwiMTI1MFwiXG4gICAgICAgIChvdXRTZWxlY3RLZXkpPVwiaGFuZGxlU2VsZWN0Rm9udCgkZXZlbnQpXCI+XG4gICAgICAgIEBpZiAoZm9udFNlbGVjdGVkKCk7IGFzIGZvbnRTZWxlY3RlZCkge1xuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgY3Vyc29yLXBvaW50ZXIgcHktWzhweF0gbGlicy11aS1mb250LWg1ciBwbC1bMTZweF0gcHItWzQwcHhdIHt7IG9wdGlvbi5jbGFzc0luY2x1ZGUgfHwgJ214LVs4cHhdJyB9fVwiPlxuICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1wb3BvdmVyIFt0eXBlXT1cIid0ZXh0J1wiXG4gICAgICAgICAgICAgIFtpZ25vcmVTdG9wUHJvcGFnYXRpb25FdmVudF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgW2NvbmZpZ109XCJ7ekluZGV4OjEyNTB9XCI+XG4gICAgICAgICAgICAgIHt7IGxhYmVsRm9udFNlbGVjdGVkQ29tcHV0ZWQoKSB9fVxuICAgICAgICAgICAgPC9saWJzX3VpLWNvbXBvbmVudHMtcG9wb3Zlcj5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwibGlicy11aS1pY29uLW1vdmUtcmlnaHQgcm90YXRlLTkwIGFic29sdXRlIHJpZ2h0LVsxMnB4XSB0ZXh0LVsjNmE3MzgzXSB0ZXh0LVsxNnB4XVwiPjwvaT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgPC9saWJzX3VpLWNvbXBvbmVudHMtZHJvcGRvd24+XG4gICAgPC9kaXY+XG4gIH1cbiAgQGlmIChvcHRpb24udHlwZSA9PT0gJ2ZvbnRTaXplJykge1xuICAgIDxkaXYgY2xhc3M9XCJxbC1waWNrZXIge3sgb3B0aW9uLmNsYXNzSW5jbHVkZSB8fCAnbXgtWzhweF0nIH19XCI+XG4gICAgICA8bGlic191aS1jb21wb25lbnRzLWlucHV0cy12YWxpZCBbZGF0YVR5cGVdPVwiJ2ludCdcIlxuICAgICAgICBbKGl0ZW0pXT1cInNpemVcIlxuICAgICAgICBbZmllbGROYW1lQmluZF09XCIndmFsdWUnXCJcbiAgICAgICAgW3ZhbHVlVXBEb3duTnVtYmVyXT1cIjFcIlxuICAgICAgICBbbWF4VmFsdWVOdW1iZXJdPVwiNzJcIlxuICAgICAgICBbbWluVmFsdWVOdW1iZXJdPVwiOFwiXG4gICAgICAgIFtyZWFkb25seV09XCJyZWFkb25seSgpXCJcbiAgICAgICAgW2NsYXNzQ29udGFpbmVySW5wdXRdPVwiJ3ctWzcycHhdIGgtWzMycHhdJ1wiXG4gICAgICAgIChvdXRWYWx1ZUNoYW5nZSk9XCJoYW5kbGVyVmFsdWVDaGFuZ2UoJGV2ZW50KVwiIC8+XG4gICAgPC9kaXY+XG4gIH1cbiAgQGlmIChvcHRpb24udHlwZSA9PT0gJ2NvbG9yJykge1xuICAgIDxkaXYgY2xhc3M9XCJxbC1jb2xvciBxbC1waWNrZXIgcWwtY29sb3ItcGlja2VyICFmbGV4IGl0ZW1zLWNlbnRlciB7eyBvcHRpb24uY2xhc3NJbmNsdWRlIHx8ICdteC1bOHB4XScgfX1cIj5cbiAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtcG9wb3ZlciBbY29uZmlnXT1cIntjb250ZW50OidpMThuX3RleHRfY29sb3InLCB6SW5kZXg6MTI1MH1cIj5cbiAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLXNlbGVjdF9jb2xvciBbekluZGV4XT1cInpJbmRleCgpXCJcbiAgICAgICAgICBbZGlyZWN0aW9uXT1cIid0b3AnXCJcbiAgICAgICAgICBbZXh0ZXJuYWxDb250ZW50XT1cInRydWVcIlxuICAgICAgICAgIFthcHBseU5vd109XCJ0cnVlXCJcbiAgICAgICAgICAob3V0Q29sb3JDaGFuZ2UpPVwic2V0U3R5bGUoJ2NvbG9yJywgJGV2ZW50KVwiPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwibGlicy11aS1pY29uLWVkaXRvci1jb2xvci10ZXh0IGxpYnMtdWktYnV0dG9ucy1zZWxlY3QtY29sb3IgdGV4dC1bIzZhNzM4M10gdGV4dC1bMTZweF0gaG92ZXI6dGV4dC1bdmFyKC0tbGlicy11aS1jb2xvci1saWdodC0xKV1cIj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9saWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1zZWxlY3RfY29sb3I+XG4gICAgICA8L2xpYnNfdWktY29tcG9uZW50cy1wb3BvdmVyPlxuICAgIDwvZGl2PlxuICB9XG4gIEBpZiAob3B0aW9uLnR5cGUgPT09ICdiYWNrZ3JvdW5kJykge1xuICAgIDxkaXYgY2xhc3M9XCJxbC1iYWNrZ3JvdW5kIHFsLXBpY2tlciBxbC1jb2xvci1waWNrZXIgIWZsZXggaXRlbXMtY2VudGVyIHt7IG9wdGlvbi5jbGFzc0luY2x1ZGUgfHwgJ214LVs4cHhdJyB9fVwiPlxuICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1wb3BvdmVyIFtjb25maWddPVwie2NvbnRlbnQ6J2kxOG5fYmFja2dyb3VuZF9jb2xvcicsIHpJbmRleDoxMjUwfVwiPlxuICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtc2VsZWN0X2NvbG9yIFt6SW5kZXhdPVwiekluZGV4KClcIlxuICAgICAgICAgIFtkaXJlY3Rpb25dPVwiJ3RvcCdcIlxuICAgICAgICAgIFtleHRlcm5hbENvbnRlbnRdPVwidHJ1ZVwiXG4gICAgICAgICAgW2FwcGx5Tm93XT1cInRydWVcIlxuICAgICAgICAgIChvdXRDb2xvckNoYW5nZSk9XCJzZXRTdHlsZSgnYmFja2dyb3VuZCcsICRldmVudClcIj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cImxpYnMtdWktaWNvbi1lZGl0b3ItY29sb3ItYmFja2dyb3VuZCBsaWJzLXVpLWJ1dHRvbnMtc2VsZWN0LWNvbG9yIHRleHQtWyM2YTczODNdIHRleHQtWzE2cHhdIGhvdmVyOnRleHQtW3ZhcigtLWxpYnMtdWktY29sb3ItbGlnaHQtMSldXCI+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtc2VsZWN0X2NvbG9yPlxuICAgICAgPC9saWJzX3VpLWNvbXBvbmVudHMtcG9wb3Zlcj5cbiAgICA8L2Rpdj5cbiAgfVxuICBAaWYgKG9wdGlvbi50eXBlID09PSAnYm9sZCcpIHtcbiAgICA8ZGl2IFtjbGFzc109XCJvcHRpb24uY2xhc3NJbmNsdWRlIHx8ICdteC1bOHB4XSdcIj5cbiAgICAgIDxidXR0b24gTGlic1VpQ29tcG9uZW50c1BvcG92ZXJEaXJlY3RpdmVcbiAgICAgICAgW2NvbmZpZ109XCJ7Y29udGVudDonaTE4bl9mb250X3dlaWdodF9ib2xkJywgekluZGV4OjEyNTB9XCJcbiAgICAgICAgY2xhc3M9XCJxbC1ib2xkXCI+PC9idXR0b24+XG4gICAgPC9kaXY+XG4gIH1cbiAgQGlmIChvcHRpb24udHlwZSA9PT0gJ2l0YWxpYycpIHtcbiAgICA8ZGl2IFtjbGFzc109XCJvcHRpb24uY2xhc3NJbmNsdWRlIHx8ICdteC1bOHB4XSdcIj5cbiAgICAgIDxidXR0b24gTGlic1VpQ29tcG9uZW50c1BvcG92ZXJEaXJlY3RpdmVcbiAgICAgICAgW2NvbmZpZ109XCJ7Y29udGVudDonaTE4bl9mb250X3N0eWxlX2l0YWxpYycsIHpJbmRleDoxMjUwfVwiXG4gICAgICAgIGNsYXNzPVwicWwtaXRhbGljXCI+PC9idXR0b24+XG4gICAgPC9kaXY+XG4gIH1cbiAgQGlmIChvcHRpb24udHlwZSA9PT0gJ3VuZGVybGluZScpIHtcbiAgICA8ZGl2IFtjbGFzc109XCJvcHRpb24uY2xhc3NJbmNsdWRlIHx8ICdteC1bOHB4XSdcIj5cbiAgICAgIDxidXR0b24gTGlic1VpQ29tcG9uZW50c1BvcG92ZXJEaXJlY3RpdmVcbiAgICAgICAgW2NvbmZpZ109XCJ7Y29udGVudDonaTE4bl90ZXh0X2RlY29yYXRpb25fdW5kZXJsaW5lJywgekluZGV4OjEyNTB9XCJcbiAgICAgICAgY2xhc3M9XCJxbC11bmRlcmxpbmVcIj48L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgfVxuICBAaWYgKG9wdGlvbi50eXBlID09PSAnc3RyaWtlVGhyb3VnaCcpIHtcbiAgICA8ZGl2IFtjbGFzc109XCJvcHRpb24uY2xhc3NJbmNsdWRlIHx8ICdteC1bOHB4XSdcIj5cbiAgICAgIDxidXR0b24gTGlic1VpQ29tcG9uZW50c1BvcG92ZXJEaXJlY3RpdmVcbiAgICAgICAgW2NvbmZpZ109XCJ7Y29udGVudDonaTE4bl90ZXh0X2xpbmVfdGhyb3VnaCcsIHpJbmRleDoxMjUwfVwiXG4gICAgICAgIGNsYXNzPVwicWwtc3RyaWtlXCI+PC9idXR0b24+XG4gICAgPC9kaXY+XG4gIH1cbiAgQGlmIChvcHRpb24udHlwZSA9PT0gJ2FkanVzdCcpIHtcbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cInJlbGF0aXZlICFmbGV4IGl0ZW1zLWNlbnRlciBxbC1hbGlnbiBxbC1waWNrZXIgcWwtaWNvbi1waWNrZXIgIXctbWF4IHt7IG9wdGlvbi5jbGFzc0luY2x1ZGUgfHwgJ214LVs4cHhdJyB9fVwiPlxuICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1wb3BvdmVyIFtjb25maWddPVwie2NvbnRlbnQ6J2kxOG5fYWRqdXN0JywgekluZGV4OjEyNTB9XCI+XG4gICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtZHJvcGRvd24gW2lzTmdDb250ZW50XT1cInRydWVcIlxuICAgICAgICAgIFtpZ25vcmVTdG9wUHJvcGFnYXRpb25FdmVudF09XCJ0cnVlXCJcbiAgICAgICAgICBbbGFiZWxQb3BvdmVyRnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICAgIFtsaXN0Q29uZmlnXT1cImxpc3RDb25maWdBbGlnbigpXCJcbiAgICAgICAgICBbbGlzdEhpZGRlbklucHV0U2VhcmNoXT1cInRydWVcIlxuICAgICAgICAgIFtwb3BvdmVyQ3VzdG9tQ29uZmlnXT1cIntpZ25vcmVBcnJvdzogdHJ1ZSwgY2xhc3NJbmNsdWRlOiAnIXctWzMycHhdIG92ZXJmbG93LWhpZGRlbiAhcHktWzRweF0nLCBwb3NpdGlvbjoge21vZGU6ICdzdGFydCcsIGRpc3RhbmNlOiAwfSwgcGFkZGluZ0xlZnRJdGVtOiBmYWxzZX1cIlxuICAgICAgICAgIFtsaXN0SGFzQnV0dG9uVW5TZWxlY3RPcHRpb25dPVwiZmFsc2VcIlxuICAgICAgICAgIFtsaXN0TWF4SXRlbVNob3ddPVwiOFwiXG4gICAgICAgICAgW3pJbmRleF09XCIxMjUwXCJcbiAgICAgICAgICAob3V0U2VsZWN0S2V5KT1cImhhbmRsZVNlbGVjdEFsaWduKCRldmVudClcIj5cbiAgICAgICAgICBAaWYgKGFsaWduU2VsZWN0ZWQoKTsgYXMgYWxpZ25TZWxlY3RlZCkge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGN1cnNvci1wb2ludGVyXCI+XG4gICAgICAgICAgICAgIDxpIFtjbGFzc109XCJpY29uQWxpZ25TZWxlY3RlZENvbXB1dGVkKClcIj48L2k+XG4gICAgICAgICAgICAgIDxpIGNsYXNzPVwibGlicy11aS1pY29uLW1vdmUtcmlnaHQgcm90YXRlLTkwIHRleHQtWyM2YTczODNdIHRleHQtWzE2cHhdIG1sLVs0cHhdXCI+PC9pPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfVxuICAgICAgICA8L2xpYnNfdWktY29tcG9uZW50cy1kcm9wZG93bj5cbiAgICAgIDwvbGlic191aS1jb21wb25lbnRzLXBvcG92ZXI+XG4gICAgPC9kaXY+XG4gIH1cbiAgQGlmIChvcHRpb24udHlwZSA9PT0gJ2luZGVudEluY3JlYXNlJykge1xuICAgIDxkaXYgW2NsYXNzXT1cIm9wdGlvbi5jbGFzc0luY2x1ZGUgfHwgJ214LVs4cHhdJ1wiPlxuICAgICAgPGJ1dHRvbiBMaWJzVWlDb21wb25lbnRzUG9wb3ZlckRpcmVjdGl2ZVxuICAgICAgICBbY29uZmlnXT1cIntjb250ZW50OidpMThuX2luZGVudF9pbmNyZWFzZScsIHpJbmRleDoxMjUwfVwiXG4gICAgICAgIGNsYXNzPVwicWwtaW5kZW50XCJcbiAgICAgICAgdmFsdWU9XCIrMVwiPjwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICB9XG4gIEBpZiAob3B0aW9uLnR5cGUgPT09ICdpbmRlbnREZWNyZWFzZScpIHtcbiAgICA8ZGl2IFtjbGFzc109XCJvcHRpb24uY2xhc3NJbmNsdWRlIHx8ICdteC1bOHB4XSdcIj5cbiAgICAgIDxidXR0b24gTGlic1VpQ29tcG9uZW50c1BvcG92ZXJEaXJlY3RpdmVcbiAgICAgICAgW2NvbmZpZ109XCJ7Y29udGVudDonaTE4bl9pbmRlbnRfZGVjcmVhc2UnLCB6SW5kZXg6MTI1MH1cIlxuICAgICAgICBjbGFzcz1cInFsLWluZGVudFwiXG4gICAgICAgIHZhbHVlPVwiLTFcIj48L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgfVxuICBAaWYgKG9wdGlvbi50eXBlID09PSAnbGlzdEJ1bGxldGVkJykge1xuICAgIDxkaXYgW2NsYXNzXT1cIm9wdGlvbi5jbGFzc0luY2x1ZGUgfHwgJ214LVs4cHhdJ1wiPlxuICAgICAgPGJ1dHRvbiBMaWJzVWlDb21wb25lbnRzUG9wb3ZlckRpcmVjdGl2ZVxuICAgICAgICBbY29uZmlnXT1cIntjb250ZW50OidpMThuX2xpc3RfYnVsbGV0ZWQnLCB6SW5kZXg6MTI1MH1cIlxuICAgICAgICBjbGFzcz1cInFsLWxpc3QgcWwtYnVsbGV0XCJcbiAgICAgICAgdmFsdWU9XCJidWxsZXRcIj48L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgfVxuICBAaWYgKG9wdGlvbi50eXBlID09PSAnbGlzdE51bWJlcmVkJykge1xuICAgIDxkaXYgW2NsYXNzXT1cIm9wdGlvbi5jbGFzc0luY2x1ZGUgfHwgJ214LVs4cHhdJ1wiPlxuICAgICAgPGJ1dHRvbiBMaWJzVWlDb21wb25lbnRzUG9wb3ZlckRpcmVjdGl2ZVxuICAgICAgICBbY29uZmlnXT1cIntjb250ZW50OidpMThuX2xpc3RfbnVtYmVyZWQnLCB6SW5kZXg6MTI1MH1cIlxuICAgICAgICBjbGFzcz1cInFsLWxpc3QgcWwtb3JkZXJlZFwiXG4gICAgICAgIHZhbHVlPVwib3JkZXJlZFwiPjwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICB9XG4gIEBpZiAob3B0aW9uLnR5cGUgPT09ICdwZXJzb25hbGl6ZScgJiYgdGVtcGxhdGVUb29sQmFyUGVyc29uYWxpemUoKTsgYXMgdGVtcGxhdGVUb29sQmFyUGVyc29uYWxpemUpIHtcbiAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIge3sgb3B0aW9uLmNsYXNzSW5jbHVkZSB8fCAnbXgtWzhweF0nIH19XCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGVtcGxhdGVUb29sQmFyUGVyc29uYWxpemVcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbiAgfVxuICBAaWYgKG9wdGlvbi50eXBlID09PSAnYmxvY2txdW90ZScpIHtcbiAgICA8ZGl2IFtjbGFzc109XCJvcHRpb24uY2xhc3NJbmNsdWRlIHx8ICdteC1bOHB4XSdcIj5cbiAgICAgIDxidXR0b24gTGlic1VpQ29tcG9uZW50c1BvcG92ZXJEaXJlY3RpdmVcbiAgICAgICAgW2NvbmZpZ109XCJ7Y29udGVudDonaTE4bl9xdW90ZScsIHpJbmRleDoxMjUwfVwiXG4gICAgICAgIGNsYXNzPVwicWwtYmxvY2txdW90ZVwiPjwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICB9XG4gIEBpZiAob3B0aW9uLnR5cGUgPT09ICdsaW5rJykge1xuICAgIDxkaXYgW2NsYXNzXT1cIm9wdGlvbi5jbGFzc0luY2x1ZGUgfHwgJ214LVs4cHhdJ1wiPlxuICAgICAgPGJ1dHRvbiBMaWJzVWlDb21wb25lbnRzUG9wb3ZlckRpcmVjdGl2ZVxuICAgICAgICBbY29uZmlnXT1cIntjb250ZW50OidpMThuX2luc2VydF9saW5rJywgekluZGV4OjEyNTB9XCJcbiAgICAgICAgY2xhc3M9XCJxbC1saW5rXCI+PC9idXR0b24+XG4gICAgPC9kaXY+XG4gIH1cbiAgQGlmIChvcHRpb24udHlwZSA9PT0gJ3VuTGluaycpIHtcbiAgICA8ZGl2IFtjbGFzc109XCJvcHRpb24uY2xhc3NJbmNsdWRlIHx8ICdteC1bOHB4XSdcIj5cbiAgICAgIDxidXR0b24gTGlic1VpQ29tcG9uZW50c1BvcG92ZXJEaXJlY3RpdmVcbiAgICAgICAgW2NvbmZpZ109XCJ7Y29udGVudDonaTE4bl91bmxpbmsnLCB6SW5kZXg6MTI1MH1cIlxuICAgICAgICBjbGFzcz1cInFsLXVuTGlua1wiPjwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICB9XG4gIEBpZiAob3B0aW9uLnR5cGUgPT09ICdpbWFnZScpIHtcbiAgICA8ZGl2IFtjbGFzc109XCJvcHRpb24uY2xhc3NJbmNsdWRlIHx8ICdteC1bOHB4XSdcIj5cbiAgICAgIDxidXR0b24gTGlic1VpQ29tcG9uZW50c1BvcG92ZXJEaXJlY3RpdmVcbiAgICAgICAgW2NvbmZpZ109XCJ7Y29udGVudDonaTE4bl9pbWFnZScsIHpJbmRleDoxMjUwfVwiXG4gICAgICAgIGNsYXNzPVwicWwtaW1hZ2VcIj48L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgfVxuICBAaWYgKG9wdGlvbi50eXBlID09PSAnZW1vamknKSB7XG4gICAgPGRpdiBbY2xhc3NdPVwib3B0aW9uLmNsYXNzSW5jbHVkZSB8fCAnbXgtWzhweF0nXCI+XG4gICAgICA8bGlic191aS1jb21wb25lbnRzLWVtb2ppIFt6SW5kZXhdPVwiMTI1MFwiXG4gICAgICAgIFtpc05nQ29udGVudF09XCJ0cnVlXCJcbiAgICAgICAgKG91dEV2ZW50RW1vamkpPVwiaGFuZGxlckFkZEVtb2ppKCRldmVudClcIj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInFsLWVtb2ppXCI+PC9idXR0b24+XG4gICAgICA8L2xpYnNfdWktY29tcG9uZW50cy1lbW9qaT5cbiAgICA8L2Rpdj5cbiAgfVxuICBAaWYgKG9wdGlvbi50eXBlID09PSAnbGluZScpIHtcbiAgICA8ZGl2IGNsYXNzPVwidy1bMXB4XSBoLVsxNnB4XSBsaWJzLXVpLWJvcmRlci1yaWdodC1nZW5lcmFsXCI+PC9kaXY+XG4gIH1cbjwvbmctdGVtcGxhdGU+XG5cbjxsaWJzX3VpLWNvbXBvbmVudHMtcG9wb3ZlciBbbW9kZV09XCInY2xpY2snXCJcbiAgW2lnbm9yZUhpZGRlblBvcG92ZXJDb250ZW50V2hlbk1vdXNlTGVhdmVdPVwidHJ1ZVwiXG4gIFtjb25maWddPVwie3RlbXBsYXRlOiB2aWV3TGluaywgd2hpdGVUaGVtZTogdHJ1ZSwgaWdub3JlQXJyb3c6IHRydWV9XCJcbiAgKG91dEV2ZW50KT1cImhhbmRsZXJQb3BvdmVyRXZlbnQoJGV2ZW50KVwiXG4gIChvdXRGdW5jdGlvbnNDb250cm9sKT1cImhhbmRsZXJQb3BvdmVyRnVuY3Rpb25Db250cm9sKCRldmVudClcIiAvPlxuXG48bmctdGVtcGxhdGUgI3ZpZXdMaW5rPlxuICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWJldHdlZW4gaXRlbXMtY2VudGVyIHB4LVsxNnB4XSBweS1bOHB4XSByb3VuZGVkLVs4cHhdXCI+XG4gICAgPGRpdiBjbGFzcz1cInctZnVsbCBtaW4tdy0wIGxpYnMtdWktZm9udC1oNXJcIlxuICAgICAgW3R5cGVdPVwiJ3RleHQnXCJcbiAgICAgIExpYnNVaUNvbXBvbmVudHNQb3BvdmVyRGlyZWN0aXZlPnt7IGxpbmsoKS51cmwgfX08L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgbWwtWzE2cHhdXCI+XG4gICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uIFt0eXBlXT1cIididXR0b24tbGluay1wcmltYXJ5J1wiXG4gICAgICAgIFtpY29uT25seVR5cGVdPVwidHJ1ZVwiXG4gICAgICAgIFtjbGFzc0ljb25MZWZ0XT1cIidsaWJzLXVpLWljb24tZWRpdC1saW5lJ1wiXG4gICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiJyFwLTAnXCJcbiAgICAgICAgKG91dENsaWNrKT1cImhhbmRsZXJFZGl0KCRldmVudClcIiAvPlxuICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLWJ1dHRvbiBbdHlwZV09XCInYnV0dG9uLWxpbmstY3VzdG9tJ1wiXG4gICAgICAgIFtidXR0b25DdXN0b21dPVwie1xuICAgICAgICAgIGNvbmZpZ1N0ZXBDb2xvcjoge1xuICAgICAgICAgICAgdGV4dDogJyMwNzE2MzEnLFxuICAgICAgICAgICAgdGV4dF9ob3ZlcjogJyNlZTJkNDEnLFxuICAgICAgICAgICAgdGV4dF9hY3RpdmU6ICcjZWUyZDQxJyxcbiAgICAgICAgICAgIHRleHRfZGlzYWJsZTogJzA3MTYzMSdcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJvb3RDb2xvcjogJyMwNzE2MzEnXG4gICAgICAgIH1cIlxuICAgICAgICBbY2xhc3NJbmNsdWRlXT1cIichcC0wIG1sLVsxMnB4XSdcIlxuICAgICAgICBbaWNvbk9ubHlUeXBlXT1cInRydWVcIlxuICAgICAgICBbY2xhc3NJY29uTGVmdF09XCInbGlicy11aS1pY29uLWxpbmstYnJva2VuJ1wiXG4gICAgICAgIChvdXRDbGljayk9XCJoYW5kbGVyVW5saW5rKCRldmVudClcIiAvPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
|
|
700
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVpbGwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL2lucHV0cy9xdWlsbC9zcmMvcXVpbGwuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL2lucHV0cy9xdWlsbC9zcmMvcXVpbGwuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbkQsT0FBTyxFQUFpQix1QkFBdUIsRUFBRSxTQUFTLEVBQWdCLFFBQVEsRUFBRSxNQUFNLEVBQWMsTUFBTSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQXFCLE1BQU0sRUFBRSxNQUFNLEVBQWUsU0FBUyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDeE8sT0FBTyxFQUFFLHNDQUFzQyxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDNUYsT0FBTyxFQUFFLDJDQUEyQyxFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFDdkcsT0FBTyxFQUFrQixpQ0FBaUMsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2pHLE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ2xGLE9BQU8sRUFBa0Msc0NBQXNDLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUM1SCxPQUFPLEVBQWdDLG9DQUFvQyxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDdEgsT0FBTyxFQUFVLDhCQUE4QixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFbkYsT0FBTyxFQUFnQyxnQ0FBZ0MsRUFBc0IsTUFBTSw2QkFBNkIsQ0FBQztBQUVqSSxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUNwRixPQUFPLEVBQUUseUJBQXlCLEVBQUUsd0JBQXdCLEVBQUUsd0JBQXdC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QUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3hoQixLQUFLLENBQUMsU0FBUyxHQUFHLDRCQUE0QixDQUFDO1FBQy9DLEtBQUssQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ3RCLE1BQU0sQ0FBQyxPQUFPLEdBQUcsR0FBRyxDQUFDO1FBQ3JCLElBQUksQ0FBQyxPQUFPLEdBQUcsR0FBRyxDQUFDO1FBQ25CLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzNCLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzdCLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzNCLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzVCLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzVCLEtBQUssQ0FB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Y0FDL0IsSUFBSSxtQkFDQyx1QkFBdUIsQ0FBQyxNQUFNLFdBR3RDO3dCQUNQLGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSxzQ0FBc0M7d0JBQ3pFLDhCQUE4QixFQUFFLGlDQUFpQzt3QkFDakUsZ0NBQWdDLEVBQUUsMkNBQTJDO3dCQUM3RSxvQ0FBb0MsRUFBRSw4QkFBOEI7d0JBQ3BFLHNDQUFzQztxQkFDdkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ1RlbXBsYXRlT3V0bGV0IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEFmdGVyVmlld0luaXQsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIENvbXBvbmVudFJlZiwgY29tcHV0ZWQsIGVmZmVjdCwgRWxlbWVudFJlZiwgaW5qZWN0LCBpbnB1dCwgbW9kZWwsIE9uRGVzdHJveSwgT25Jbml0LCBvdXRwdXQsIHNpZ25hbCwgVGVtcGxhdGVSZWYsIHVudHJhY2tlZCwgdmlld0NoaWxkLCB2aWV3Q2hpbGRyZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNCdXR0b25zQnV0dG9uQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1idXR0b25zLWJ1dHRvbic7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzQnV0dG9uc1NlbGVjdENvbG9yQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1idXR0b25zLXNlbGVjdC1jb2xvcic7XG5pbXBvcnQgeyBJRW1pdFNlbGVjdEtleSwgTGlic1VpQ29tcG9uZW50c0Ryb3Bkb3duQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1kcm9wZG93bic7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzRW1vamlDb21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWlucHV0cy1lbW9qaSc7XG5pbXBvcnQgeyBJTWVudGlvbkNvbmZpZywgSU1lbnRpb25JbnNlcnQsIExpYnNVaUNvbXBvbmVudHNJbnB1dHNNZW50aW9uRGlyZWN0aXZlIH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1pbnB1dHMtbWVudGlvbic7XG5pbXBvcnQgeyBJVmFsaWRMZW5ndGgsIElWYWxpZFJlcXVpcmVkLCBMaWJzVWlDb21wb25lbnRzSW5wdXRzVmFsaWRDb21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWlucHV0cy12YWxpZCc7XG5pbXBvcnQgeyBJTGFiZWwsIExpYnNVaUNvbXBvbmVudHNMYWJlbENvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtbGFiZWwnO1xuaW1wb3J0IHsgSUxpc3RDb25maWdJdGVtIH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1saXN0JztcbmltcG9ydCB7IElQb3BvdmVyRnVuY3Rpb25Db250cm9sRXZlbnQsIExpYnNVaUNvbXBvbmVudHNQb3BvdmVyQ29tcG9uZW50LCBUWVBFX1BPUE9WRVJfRVZFTlQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLXBvcG92ZXInO1xuaW1wb3J0IHsgVFlQRV9PQkpFQ1QsIFRZUEVfVEVNUExBVEVfUkVGIH0gZnJvbSAnQGxpYnMtdWkvaW50ZXJmYWNlcy10eXBlcyc7XG5pbXBvcnQgeyBMaWJzVWlEeW5hbWljQ29tcG9uZW50U2VydmljZSB9IGZyb20gJ0BsaWJzLXVpL3NlcnZpY2VzLWR5bmFtaWMtY29tcG9uZW50JztcbmltcG9ydCB7IEVSUk9SX01FU1NBR0VfRU1QVFlfVkFMSUQsIEVSUk9SX01FU1NBR0VfTUFYX0xFTkdUSCwgRVJST1JfTUVTU0FHRV9NSU5fTEVOR1RILCBnZXQsIGlzTmlsLCBwYXR0ZXJuVXJsLCBzZXQsIHhzc0ZpbHRlciB9IGZyb20gJ0BsaWJzLXVpL3V0aWxzJztcbmltcG9ydCB7IFRyYW5zbGF0ZU1vZHVsZSwgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IFF1aWxsLCB7IFJhbmdlU3RhdGljLCBTb3VyY2VzLCBTdHJpbmdNYXAgfSBmcm9tICdxdWlsbCc7XG5pbXBvcnQgeyBmcm9tRXZlbnQsIFN1YmplY3QsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgaW5kZW50U3R5bGUgfSBmcm9tICcuL2luZGVudC1hdHRyaWJ1dG9yL2luZGVudC1hdHRyaWJ1dG9yLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJUXVpbGxCbG90UmVnaXN0ZXIsIElRdWlsbEZ1bmN0aW9uQ29udHJvbEV2ZW50LCBJUXVpbGxMaW5rLCBJUXVpbGxTZWxlY3Rpb25DaGFuZ2UsIElRdWlsbFRleHRDaGFuZ2UsIElRdWlsbFRvb2xiYXJDb25maWcsIElRdWlsbFVwbG9hZEltYWdlQ29uZmlnLCBUWVBFX01PREVfQkFSX0NPTkZJR19PUFRJT04gfSBmcm9tICcuL2ludGVyZmFjZXMvcXVpbGwuaW50ZXJmYWNlJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNJbnB1dHNRdWlsbExpbmtDb21wb25lbnQgfSBmcm9tICcuL2xpbmsvbGluay5jb21wb25lbnQnO1xuaW1wb3J0IHsgUXVpbGxNZW50aW9uQmxvdCB9IGZyb20gJy4vbWVudGlvbi9tZW50aW9uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzSW5wdXRzUXVpbGxVcGxvYWRJbWFnZUNvbXBvbmVudCB9IGZyb20gJy4vdXBsb2FkLWltYWdlL3VwbG9hZC1pbWFnZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgaWNvbkxpc3QsIGxpbmtEZWZhdWx0LCBsaXN0Q29uZmlnQWxpZ24sIGxpc3RDb25maWdGb250LCBsaXN0Rm9udCwgdG9vbEJhck9wdGlvbnMsIHVwbG9hZEltYWdlQ29uZmlnRGVmYXVsdCB9IGZyb20gJy4vdXRpbHMvcXVpbGwuZGVmaW5lJztcblxuQENvbXBvbmVudCh7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvY29tcG9uZW50LXNlbGVjdG9yXG4gIHNlbGVjdG9yOiAnbGlic191aS1jb21wb25lbnRzLWlucHV0cy1xdWlsbCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICB0ZW1wbGF0ZVVybDogJy4vcXVpbGwuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vcXVpbGwuY29tcG9uZW50LnNjc3MnLFxuICBpbXBvcnRzOiBbXG4gICAgVHJhbnNsYXRlTW9kdWxlLCBOZ1RlbXBsYXRlT3V0bGV0LCBMaWJzVWlDb21wb25lbnRzSW5wdXRzTWVudGlvbkRpcmVjdGl2ZSxcbiAgICBMaWJzVWlDb21wb25lbnRzTGFiZWxDb21wb25lbnQsIExpYnNVaUNvbXBvbmVudHNEcm9wZG93bkNvbXBvbmVudCxcbiAgICBMaWJzVWlDb21wb25lbnRzUG9wb3ZlckNvbXBvbmVudCwgTGlic1VpQ29tcG9uZW50c0J1dHRvbnNTZWxlY3RDb2xvckNvbXBvbmVudCxcbiAgICBMaWJzVWlDb21wb25lbnRzSW5wdXRzVmFsaWRDb21wb25lbnQsIExpYnNVaUNvbXBvbmVudHNFbW9qaUNvbXBvbmVudCxcbiAgICBMaWJzVWlDb21wb25lbnRzQnV0dG9uc0J1dHRvbkNvbXBvbmVudFxuICBdXG59KVxuZXhwb3J0IGNsYXNzIExpYnNVaUNvbXBvbmVudHNJbnB1dHNRdWlsbENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcbiAgcHJvdGVjdGVkIG1lc3NhZ2VFcnJvciA9IHNpZ25hbDxzdHJpbmc+KCcnKTtcbiAgcHJvdGVjdGVkIGRpc3BsYXkgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuICBwcm90ZWN0ZWQgbGlzdENvbmZpZ0FsaWduID0gc2lnbmFsPElMaXN0Q29uZmlnSXRlbT4obGlzdENvbmZpZ0FsaWduKCkpO1xuICBwcm90ZWN0ZWQgYWxpZ25TZWxlY3RlZCA9IHNpZ25hbDxJRW1pdFNlbGVjdEtleSB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgcHJvdGVjdGVkIGljb25BbGlnblNlbGVjdGVkQ29tcHV0ZWQgPSBjb21wdXRlZCgoKSA9PiBnZXQodGhpcy5hbGlnblNlbGVjdGVkKCksICdpdGVtLmljb24nKSk7XG4gIHByb3RlY3RlZCBsaXN0Q29uZmlnRm9udCA9IHNpZ25hbDxJTGlzdENvbmZpZ0l0ZW0+KGxpc3RDb25maWdGb250KCkpO1xuICBwcm90ZWN0ZWQgZm9udFNlbGVjdGVkID0gc2lnbmFsPElFbWl0U2VsZWN0S2V5IHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcm90ZWN0ZWQgbGFiZWxGb250U2VsZWN0ZWRDb21wdXRlZCA9IGNvbXB1dGVkKCgpID0+IGdldCh0aGlzLmZvbnRTZWxlY3RlZCgpLCAnaXRlbS5sYWJlbCcpIHx8ICdTYW5zIFNlcmlmJyk7XG4gIHByb3RlY3RlZCBzaXplID0gc2lnbmFsPHsgdmFsdWU6IG51bWJlciB9Pih7IHZhbHVlOiAxNCB9KTtcbiAgcHJvdGVjdGVkIGl0ZW1IaWRkZW5FeHBhbmQgPSBzaWduYWw8QXJyYXk8bnVtYmVyPj4oW10pO1xuICBwcm90ZWN0ZWQgaXRlbUhpZGRlbiA9IHNpZ25hbDxBcnJheTxudW1iZXI+PihbXSk7XG4gIHByb3RlY3RlZCBzaG93TW9yZUFjdGlvbiA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIHByb3RlY3RlZCBsaW5rID0gc2lnbmFsPElRdWlsbExpbms+KGxpbmtEZWZhdWx0KCkpO1xuICBwcm90ZWN0ZWQgdG9vbGJhck9wdGlvbnNDb25maWcgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgdHlwZSA9IHRoaXMudG9vbGJhckNvbmZpZygpPy50eXBlIHx8ICdkZWZhdWx0JztcbiAgICBjb25zdCBoYXNJY29uSW1hZ2UgPSB0aGlzLnVwbG9hZEltYWdlQ29uZmlnKCkuc2hvd0ljb24gPz8gZmFsc2U7XG4gICAgY29uc3QgaGFzSWNvblBlcnNvbmFsaXplID0gISF0aGlzLnRlbXBsYXRlVG9vbEJhclBlcnNvbmFsaXplKCk7XG5cbiAgICByZXR1cm4gdGhpcy50b29sYmFyQ29uZmlnKCk/LmNvbmZpZyB8fCB0b29sQmFyT3B0aW9ucyh0eXBlLCBoYXNJY29uSW1hZ2UsIGhhc0ljb25QZXJzb25hbGl6ZSk7XG4gIH0pO1xuXG4gIHByaXZhdGUgdGltZUNhbGN1bGF0aW9uVG9vbEJhciA9IHNpZ25hbDxudW1iZXIgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIHByaXZhdGUgcG9wb3ZlckZ1bmN0aW9uQ29udHJvbCA9IHNpZ25hbDxJUG9wb3ZlckZ1bmN0aW9uQ29udHJvbEV2ZW50IHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcml2YXRlIHF1aWxsID0gc2lnbmFsPFF1aWxsIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcml2YXRlIGhhbmRsZXJzID0gc2lnbmFsPFJlY29yZDxzdHJpbmcsICguLi5wYXJhbXM6IEFycmF5PHVua25vd24+KSA9PiB2b2lkPj4oeyB1bmRvOiB0aGlzLmhhbmRsZVVuZG8uYmluZCh0aGlzKSwgcmVkbzogdGhpcy5oYW5kbGVSZWRvLmJpbmQodGhpcykgfSk7XG4gIHByaXZhdGUgc2hvd01lbnRpb24gPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuICBwcml2YXRlIGFkZEVkaXRMaW5rQ29tcG9uZW50UmVmID0gc2lnbmFsPENvbXBvbmVudFJlZjxMaWJzVWlDb21wb25lbnRzSW5wdXRzUXVpbGxMaW5rQ29tcG9uZW50PiB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgcHJpdmF0ZSB1cGxvYWRJbWFnZUNvbXBvbmVudFJlZiA9IHNpZ25hbDxDb21wb25lbnRSZWY8TGlic1VpQ29tcG9uZW50c0lucHV0c1F1aWxsVXBsb2FkSW1hZ2VDb21wb25lbnQ+IHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcml2YXRlIG9uRGVzdHJveSA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIHByaXZhdGUgZHluYW1pY0NvbXBvbmVudFNlcnZpY2UgPSBpbmplY3QoTGlic1VpRHluYW1pY0NvbXBvbmVudFNlcnZpY2UpO1xuICBwcml2YXRlIHRyYW5zbGF0ZSA9IGluamVjdChUcmFuc2xhdGVTZXJ2aWNlKTtcblxuICByZWFkb25seSBpc1Nob3dUb29sQmFyID0gaW5wdXQ8Ym9vbGVhbiwgYm9vbGVhbiB8IHVuZGVmaW5lZD4odHJ1ZSwgeyB0cmFuc2Zvcm06IHZhbCA9PiB2YWwgPz8gdHJ1ZSB9KTtcbiAgcmVhZG9ubHkgaXNUb29sYmFyUG9zaXRvbkZpeGVkID0gaW5wdXQ8Ym9vbGVhbiwgYm9vbGVhbiB8IHVuZGVmaW5lZD4oZmFsc2UsIHsgdHJhbnNmb3JtOiB2YWwgPT4gdmFsID8/IGZhbHNlIH0pO1xuICByZWFkb25seSBjbGFzc0luY2x1ZGVUb29sYmFyID0gaW5wdXQ8c3RyaW5nPignJyk7XG4gIHJlYWRvbmx5IHN0eWxlc0luY2x1ZGVUb29sYmFyID0gaW5wdXQ8VFlQRV9PQkpFQ1Q+KCk7XG4gIHJlYWRvbmx5IHRvb2xiYXJDb25maWcgPSBpbnB1dDx7XG4gICAgdHlwZTogVFlQRV9NT0RFX0JBUl9DT05GSUdfT1BUSU9OO1xuICAgIGNvbmZpZz86IEFycmF5PElRdWlsbFRvb2xiYXJDb25maWc+O1xuICB9PigpO1xuICByZWFkb25seSBwbGFjZWhvbGRlciA9IGlucHV0PHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPignaTE4bl9pbXBvcnRfY29udGVudCcsIHsgdHJhbnNmb3JtOiAodmFsdWUpID0+IHZhbHVlIHx8ICdpMThuX2ltcG9ydF9jb250ZW50JyB9KTtcbiAgcmVhZG9ubHkgbGFiZWwgPSBpbnB1dDxJTGFiZWwgfCB1bmRlZmluZWQ+KCk7XG4gIHJlYWRvbmx5IGl0ZW0gPSBtb2RlbDxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oKTtcbiAgcmVhZG9ubHkgZmllbGROYW1lQmluZCA9IGlucHV0PHN0cmluZz4oJ3ZhbHVlJyk7XG4gIHJlYWRvbmx5IHJlYWRvbmx5ID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgc2hvd0Vycm9yTGFiZWwgPSBpbnB1dDxib29sZWFuPih0cnVlKTtcbiAgcmVhZG9ubHkgc2hvd0Vycm9yQm9yZGVyID0gaW5wdXQ8Ym9vbGVhbj4oZmFsc2UpO1xuICByZWFkb25seSBvbmx5U2hvd0Vycm9yQm9yZGVySW5Db250ZW50ID0gaW5wdXQ8Ym9vbGVhbj4oZmFsc2UpO1xuICByZWFkb25seSBjbGFzc0luY2x1ZGVUZW1wbGF0ZSA9IGlucHV0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgY2xhc3NJbmNsdWRlID0gaW5wdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSBoYW5kbGVyc0V4cGFuZCA9IGlucHV0PEFycmF5PHsgdGl0bGU6IHN0cmluZywgYWN0aW9uOiAoKSA9PiB2b2lkIH0+PigpO1xuICByZWFkb25seSB2YWxpZFJlcXVpcmVkID0gaW5wdXQ8SVZhbGlkUmVxdWlyZWQ+KCk7XG4gIHJlYWRvbmx5IHZhbGlkTWluTGVuZ3RoID0gaW5wdXQ8SVZhbGlkTGVuZ3RoPigpO1xuICByZWFkb25seSB2YWxpZE1heExlbmd0aCA9IGlucHV0PElWYWxpZExlbmd0aD4oKTtcbiAgcmVhZG9ubHkgekluZGV4ID0gaW5wdXQ8bnVtYmVyLCBudW1iZXIgfCB1bmRlZmluZWQ+KDEyMDEsIHsgdHJhbnNmb3JtOiAodmFsdWUpID0+IHZhbHVlIHx8IDEyMDEgfSk7XG4gIHJlYWRvbmx5IGRhdGFDb25maWdNZW50aW9uID0gaW5wdXQ8SU1lbnRpb25Db25maWc+KCk7XG4gIHJlYWRvbmx5IGJsb3RzUmVnaXN0ZXIgPSBpbnB1dDxBcnJheTxJUXVpbGxCbG90UmVnaXN0ZXI+PigpO1xuICByZWFkb25seSBoZWlnaHRBdXRvID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgYXV0b0ZvY3VzID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgYXV0b0ZvY3VzQm90dG9tID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgdGVtcGxhdGVUb29sQmFyUGVyc29uYWxpemUgPSBpbnB1dDxUZW1wbGF0ZVJlZjxUWVBFX1RFTVBMQVRFX1JFRj4+KCk7XG4gIHJlYWRvbmx5IHRlbXBsYXRlID0gaW5wdXQ8VGVtcGxhdGVSZWY8VFlQRV9URU1QTEFURV9SRUY+PigpO1xuICByZWFkb25seSB1cGxvYWRJbWFnZUNvbmZpZyA9IGlucHV0PElRdWlsbFVwbG9hZEltYWdlQ29uZmlnLCBJUXVpbGxVcGxvYWRJbWFnZUNvbmZpZyB8IHVuZGVmaW5lZD4odXBsb2FkSW1hZ2VDb25maWdEZWZhdWx0KCksIHsgdHJhbnNmb3JtOiAodmFsdWUpID0+IHZhbHVlIHx8IHVwbG9hZEltYWdlQ29uZmlnRGVmYXVsdCgpIH0pO1xuXG4gIHJlYWRvbmx5IG91dE1lc3NhZ2VFcnJvciA9IG91dHB1dDxzdHJpbmc+KCk7XG4gIHJlYWRvbmx5IG91dEJsdXIgPSBvdXRwdXQ8dm9pZD4oKTtcbiAgcmVhZG9ubHkgb3V0Rm9jdXMgPSBvdXRwdXQ8dm9pZD4oKTtcbiAgcmVhZG9ubHkgb3V0Q2hhbmdlID0gb3V0cHV0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgb3V0RnVuY3Rpb25zQ29udHJvbCA9IG91dHB1dDxJUXVpbGxGdW5jdGlvbkNvbnRyb2xFdmVudD4oKTtcbiAgcmVhZG9ubHkgb3V0U2VsZWN0aW9uQ2hhbmdlID0gb3V0cHV0PElRdWlsbFNlbGVjdGlvbkNoYW5nZT4oKTtcbiAgcmVhZG9ubHkgb3V0VGV4dENoYW5nZSA9IG91dHB1dDxJUXVpbGxUZXh0Q2hhbmdlPigpO1xuICByZWFkb25seSBvdXRDb250ZXh0TWVudSA9IG91dHB1dDxNb3VzZUV2ZW50PigpO1xuICByZWFkb25seSB3cmFwcGVyRWRpdG9yRWwgPSB2aWV3Q2hpbGQ8RWxlbWVudFJlZj4oJ3dyYXBwZXJFZGl0b3InKTtcbiAgcmVhZG9ubHkgZWRpdG9yRWwgPSB2aWV3Q2hpbGQ8RWxlbWVudFJlZj4oJ2VkaXRvcicpO1xuICByZWFkb25seSBxdWlsbE9wdGlvbkVsID0gdmlld0NoaWxkPEVsZW1lbnRSZWY+KCdxdWlsbE9wdGlvbicpO1xuICByZWFkb25seSBxdWlsbEVkaXRvckVsID0gdmlld0NoaWxkPEVsZW1lbnRSZWY+KCdxdWlsbEVkaXRvcicpO1xuICByZWFkb25seSB0b29sYmFySXRlbXNFbCA9IHZpZXdDaGlsZDxFbGVtZW50UmVmPigndG9vbGJhckl0ZW1zJyk7XG4gIHJlYWRvbmx5IGl0ZW1zRWwgPSB2aWV3Q2hpbGRyZW48RWxlbWVudFJlZj4oJ2l0ZW0nKTtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLnRvb2xiYXJJdGVtc0VsKCk/Lm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgdW50cmFja2VkKCgpID0+IHtcbiAgICAgICAgICB0aGlzLmNhbGN1bGF0b3JUb29sYmFyKCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5vdXRGdW5jdGlvbnNDb250cm9sLmVtaXQoe1xuICAgICAgY2hlY2tJc1ZhbGlkOiB0aGlzLnZhbGlkYXRlLmJpbmQodGhpcyksXG4gICAgICBzZXRDb250ZW50OiB0aGlzLnNldENvbnRlbnQuYmluZCh0aGlzKSxcbiAgICAgIGluc2VydFRleHQ6IHRoaXMuaW5zZXJ0VGV4dC5iaW5kKHRoaXMpLFxuICAgICAgaW5zZXJ0TGluazogdGhpcy5pbnNlcnRMaW5rLmJpbmQodGhpcyksXG4gICAgICBpbnNlcnRJbWFnZTogdGhpcy5pbnNlcnRJbWFnZS5iaW5kKHRoaXMpLFxuICAgICAgc2V0Rm9udFNpemU6IHRoaXMuc2V0Rm9udFNpemUuYmluZCh0aGlzKSxcbiAgICAgIHNldENvbG9yOiBhc3luYyAoY29sb3I6IHN0cmluZykgPT4gdGhpcy5zZXRTdHlsZSgnY29sb3InLCBjb2xvciksXG4gICAgICBzZXRCYWNrZ3JvdW5kOiBhc3luYyAoY29sb3I6IHN0cmluZykgPT4gdGhpcy5zZXRTdHlsZSgnYmFja2dyb3VuZCcsIGNvbG9yKSxcbiAgICAgIHF1aWxsOiAoKSA9PiB0aGlzLnF1aWxsKCkgYXMgUXVpbGxcbiAgICB9KTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5hdXRvRm9jdXMoKSkge1xuICAgICAgdGhpcy5kaXNwbGF5LnNldCh0cnVlKTtcbiAgICB9XG4gICAgdGhpcy5zZXRIYW5kbGVyRnVuY3Rpb24oKTtcbiAgICB0aGlzLmluaXRRdWlsbCgpO1xuICAgIGlmICghdGhpcy5hdXRvRm9jdXMoKSkge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmRpc3BsYXkuc2V0KHRydWUpLCA0MDApO1xuICAgIH1cbiAgICB0aGlzLnNldENsYXNzSW5jbHVkZUFuZFJlYWRPbmx5KCk7XG4gICAgdGhpcy5zZXRDb250ZW50KGdldCh0aGlzLml0ZW0oKSwgdGhpcy5maWVsZE5hbWVCaW5kKCksICcnKS5yZXBsYWNlKC9bXFx1MjAwQi1cXHUyMDBEXFx1RkVGRl0vZywgJycpKTtcbiAgICB0aGlzLmhhbmRsZXJUZXh0Q2hhbmdlKCk7XG4gICAgdGhpcy5oYW5kbGVyU2VsZWN0aW9uQ2hhbmdlKCk7XG4gICAgdGhpcy5oYW5kbGVyUGFzdGUoKTtcbiAgICBpZiAodGhpcy5hdXRvRm9jdXMoKSkge1xuICAgICAgdGhpcy5xdWlsbCgpPy5mb2N1cygpO1xuICAgIH1cbiAgICBmcm9tRXZlbnQod2luZG93LCAncmVzaXplJykucGlwZSh0YWtlVW50aWwodGhpcy5vbkRlc3Ryb3kpKS5zdWJzY3JpYmUodGhpcy5jYWxjdWxhdG9yVG9vbGJhci5iaW5kKHRoaXMpKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdFF1aWxsKCkge1xuICAgIGNvbnN0IHNpemUgPSBRdWlsbC5pbXBvcnQoJ2F0dHJpYnV0b3JzL3N0eWxlL3NpemUnKTtcbiAgICBjb25zdCBpbWFnZSA9IFF1aWxsLmltcG9ydCgnZm9ybWF0cy9pbWFnZScpO1xuICAgIGNvbnN0IHBhcmNobWVudCA9IFF1aWxsLmltcG9ydCgncGFyY2htZW50Jyk7XG4gICAgY29uc3QgYWxpZ25TdHlsZSA9IFF1aWxsLmltcG9ydCgnYXR0cmlidXRvcnMvc3R5bGUvYWxpZ24nKTtcbiAgICBjb25zdCBpY29ucyA9IFF1aWxsLmltcG9ydCgndWkvaWNvbnMnKTtcbiAgICBjb25zdCBibG9jayA9IHBhcmNobWVudC5xdWVyeSgnYmxvY2snKTtcbiAgICBjb25zdCBpdGFsaWMgPSBRdWlsbC5pbXBvcnQoJ2Zvcm1hdHMvaXRhbGljJyk7XG4gICAgY29uc3QgYm9sZCA9IFF1aWxsLmltcG9ydCgnZm9ybWF0cy9ib2xkJyk7XG4gICAgc2l6ZS53aGl0ZWxpc3QgPSBbJzhweCcsICc5cHgnLCAnMTBweCcsICcxMXB4JywgJzEycHgnLCAnMTNweCcsICcxNHB4JywgJzE1cHgnLCAnMTZweCcsICcxN3B4JywgJzE4cHgnLCAnMTlweCcsICcyMHB4JywgJzIxcHgnLCAnMjJweCcsICcyM3B4JywgJzI0cHgnLCAnMjVweCcsICcyNnB4JywgJzI3cHgnLCAnMjhweCcsICcyOXB4JywgJzMwcHgnLCAnMzFweCcsICczMnB4JywgJzMzcHgnLCAnMzRweCcsICczNXB4JywgJzM2cHgnLCAnMzdweCcsICczOHB4JywgJzM5cHgnLCAnNDBweCcsICc0MXB4JywgJzQycHgnLCAnNDNweCcsICc0NHB4JywgJzQ1cHgnLCAnNDZweCcsICc0N3B4JywgJzQ4cHgnLCAnNDlweCcsICc1MHB4JywgJzUxcHgnLCAnNTJweCcsICc1M3B4JywgJzU0cHgnLCAnNTVweCcsICc1NnB4JywgJzU3cHgnLCAnNThweCcsICc1OXB4JywgJzYwcHgnLCAnNjFweCcsICc2MnB4JywgJzYzcHgnLCAnNjRweCcsICc2NXB4JywgJzY2cHgnLCAnNjdweCcsICc2OHB4JywgJzY5cHgnLCAnNzBweCcsICc3MXB4JywgJzcycHgnXTtcbiAgICBpbWFnZS5jbGFzc05hbWUgPSAnbGlicy11aS1xdWlsbC1mb3JtYXQtaW1hZ2UnO1xuICAgIGJsb2NrLnRhZ05hbWUgPSAnRElWJztcbiAgICBpdGFsaWMudGFnTmFtZSA9ICdpJztcbiAgICBib2xkLnRhZ05hbWUgPSAnQic7XG4gICAgUXVpbGwucmVnaXN0ZXIoYm9sZCwgdHJ1ZSk7XG4gICAgUXVpbGwucmVnaXN0ZXIoaXRhbGljLCB0cnVlKTtcbiAgICBRdWlsbC5yZWdpc3RlcihzaXplLCB0cnVlKTtcbiAgICBRdWlsbC5yZWdpc3RlcihpbWFnZSwgdHJ1ZSk7XG4gICAgUXVpbGwucmVnaXN0ZXIoYmxvY2ssIHRydWUpO1xuICAgIFF1aWxsLnJlZ2lzdGVyKGFsaWduU3R5bGUsIHRydWUpO1xuICAgIFF1aWxsLnJlZ2lzdGVyKFF1aWxsTWVudGlvbkJsb3QsIHRydWUpO1xuICAgIHRoaXMuYmxvdHNSZWdpc3RlcigpPy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgUXVpbGwucmVnaXN0ZXIoaXRlbS5jb21wb25lbnQsIHRydWUpO1xuICAgIH0pO1xuICAgIFF1aWxsLnJlZ2lzdGVyKHsgJ2Zvcm1hdHMvaW5kZW50JzogaW5kZW50U3R5bGUgfSwgdHJ1ZSk7XG4gICAgZnJvbUV2ZW50PE1vdXNlRXZlbnQ+KHRoaXMucXVpbGxFZGl0b3JFbCgpPy5uYXRpdmVFbGVtZW50LCAnY29udGV4dG1lbnUnKS5waXBlKHRha2VVbnRpbCh0aGlzLm9uRGVzdHJveSkpLnN1YnNjcmliZShlID0+IHRoaXMub3V0Q29udGV4dE1lbnUuZW1pdChlKSk7XG4gICAgaWNvbkxpc3QoKS5mb3JFYWNoKGVsZW1lbnQgPT4gc2V0KGljb25zLCBlbGVtZW50LmtleSwgYDxzcGFuIGNsYXNzPVwiJHtlbGVtZW50Lmljb259IGhvdmVyOnRleHQtW3ZhcigtLWxpYnMtdWktY29sb3ItbGlnaHQtMSldIHRleHQtWzE2cHhdIHRleHQtWyM2YTczODNdXCI+PC9zcGFuPmApKTtcbiAgICB0aGlzLnF1aWxsLnNldChuZXcgUXVpbGwodGhpcy5xdWlsbEVkaXRvckVsKCk/Lm5hdGl2ZUVsZW1lbnQsIHtcbiAgICAgIG1vZHVsZXM6IHtcbiAgICAgICAgdG9vbGJhcjoge1xuICAgICAgICAgIGNvbnRhaW5lcjogdGhpcy5xdWlsbE9wdGlvbkVsKCk/Lm5hdGl2ZUVsZW1lbnQsXG4gICAgICAgICAgaGFuZGxlcnM6IHRoaXMuaGFuZGxlcnMoKVxuICAgICAgICB9LFxuICAgICAgICBjbGlwYm9hcmQ6IHtcbiAgICAgICAgICBtYXRjaFZpc3VhbDogZmFsc2VcbiAgICAgICAgfSxcbiAgICAgICAgaGlzdG9yeToge1xuICAgICAgICAgIGRlbGF5OiAxMDAwLFxuICAgICAgICAgIG1heFN0YWNrOiAxMDAsXG4gICAgICAgICAgdXNlck9ubHk6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIGtleWJvYXJkOiB7XG4gICAgICAgICAgYmluZGluZ3M6IHtcbiAgICAgICAgICAgIGVudGVyOiB7XG4gICAgICAgICAgICAgIGtleTogMTMsXG4gICAgICAgICAgICAgIGhhbmRsZXI6ICgpID0+IHRoaXMuc2hvd01lbnRpb24oKSA/IGZhbHNlIDogdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHJlYWRPbmx5OiB0aGlzLnJlYWRvbmx5KCksXG4gICAgICBwbGFjZWhvbGRlcjogdGhpcy50cmFuc2xhdGUuaW5zdGFudCh0aGlzLnBsYWNlaG9sZGVyKCkpLFxuICAgICAgdGhlbWU6ICdzbm93JyxcbiAgICAgIGJvdW5kczogdGhpcy5oZWlnaHRBdXRvKCkgPyB0aGlzLndyYXBwZXJFZGl0b3JFbCgpPy5uYXRpdmVFbGVtZW50IDogdGhpcy5xdWlsbEVkaXRvckVsKCk/Lm5hdGl2ZUVsZW1lbnQsXG4gICAgICBzY3JvbGxpbmdDb250YWluZXI6IHRoaXMuaGVpZ2h0QXV0bygpID8gdGhpcy53cmFwcGVyRWRpdG9yRWwoKT8ubmF0aXZlRWxlbWVudCA6IG51bGxcbiAgICB9KSk7XG5cbiAgICB0aGlzLnF1aWxsKCk/LmtleWJvYXJkLmFkZEJpbmRpbmcoeyBrZXk6ICdCYWNrc3BhY2UnIH0sIHRoaXMucHJldmVudEVtYmVkRGVsZXRpb24uYmluZCh0aGlzKSk7XG4gICAgdGhpcy5xdWlsbCgpPy5rZXlib2FyZC5hZGRCaW5kaW5nKHsga2V5OiAnRGVsZXRlJyB9LCB0aGlzLnByZXZlbnRFbWJlZERlbGV0aW9uLmJpbmQodGhpcykpO1xuICB9XG5cbiAgcHJpdmF0ZSBwcmV2ZW50RW1iZWREZWxldGlvbihyYW5nZTogUmFuZ2VTdGF0aWMpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMucXVpbGwoKSkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IGRlbHRhID0gdGhpcy5xdWlsbCgpPy5nZXRDb250ZW50cyhyYW5nZS5pbmRleCwgMSk7XG5cbiAgICBpZiAoZGVsdGE/Lm9wcy5zb21lKG9wdGlvbiA9PiB0aGlzLmJsb3RzUmVnaXN0ZXIoKT8uZmluZChpdGVtID0+IGdldChvcHRpb24uaW5zZXJ0LCBpdGVtLmNvbXBvbmVudFsnYmxvdE5hbWUnXSkgJiYgaXRlbS5pZ25vcmVEZWxldGUpKSkge1xuICAgICAgcmV0dXJuIGZhbHNlOyAvLyBOZ8SDbiBraMO0bmcgY2hvIFF1aWxsIHjhu60gbMO9IHjDs2FcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcblxuICB9XG5cbiAgcHJpdmF0ZSBzZXRIYW5kbGVyRnVuY3Rpb24oKSB7XG4gICAgdGhpcy5oYW5kbGVycy51cGRhdGUoaXRlbSA9PiAoeyAuLi5pdGVtLCBpbWFnZTogdGhpcy5oYW5kbGVyU2hvd1VwbG9hZEltYWdlLmJpbmQodGhpcyksIGVtb2ppOiAoKSA9PiB7IHJldHVybiB9IH0pKVxuICAgIGxldCBsaW5rID0gZmFsc2U7XG4gICAgY29uc3QgaGFuZGxlcnNFeHBhbmQgPSB0aGlzLmhhbmRsZXJzRXhwYW5kKCk7XG4gICAgaWYgKGhhbmRsZXJzRXhwYW5kICYmIGhhbmRsZXJzRXhwYW5kLmxlbmd0aCkge1xuICAgICAgaGFuZGxlcnNFeHBhbmQuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgICAgaWYgKGVsZW1lbnQudGl0bGUgJiYgZWxlbWVudC5hY3Rpb24pIHtcbiAgICAgICAgICBpZiAoZWxlbWVudC50aXRsZSA9PT0gJ2xpbmsnKSB7XG4gICAgICAgICAgICBsaW5rID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5oYW5kbGVycy51cGRhdGUoaXRlbSA9PiAoeyAuLi5pdGVtLCBbZWxlbWVudC50aXRsZV06IGVsZW1lbnQuYWN0aW9uIH0pKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmICghbGluaykge1xuICAgICAgdGhpcy5oYW5kbGVycy51cGRhdGUoaXRlbSA9PiAoeyAuLi5pdGVtLCBsaW5rOiB0aGlzLmhhbmRsZVNob3dVcGxvYWRMaW5rLmJpbmQodGhpcyksIHVuTGluazogdGhpcy5oYW5kbGVyVW5JbnNlcnRMaW5rLmJpbmQodGhpcykgfSkpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2V0Q2xhc3NJbmNsdWRlQW5kUmVhZE9ubHkoKSB7XG4gICAgY29uc3QgZWRpdG9yRWwgPSB0aGlzLmVkaXRvckVsKCk7XG4gICAgY29uc3QgY2xhc3NJbmNsdWRlID0gdGhpcy5jbGFzc0luY2x1ZGUoKTtcbiAgICBjb25zdCByZWFkb25seSA9IHRoaXMucmVhZG9ubHkoKTtcbiAgICBpZiAoZWRpdG9yRWwpIHtcbiAgICAgIGlmIChjbGFzc0luY2x1ZGUgfHwgcmVhZG9ubHkpIHtcbiAgICAgICAgZm9yIChjb25zdCBlbGVtZW50Tm9kZSBvZiBlZGl0b3JFbC5uYXRpdmVFbGVtZW50Lmxhc3RFbGVtZW50Q2hpbGQuY2hpbGRyZW4pIHtcbiAgICAgICAgICBpZiAoIWVsZW1lbnROb2RlLmNsYXNzTmFtZS5pbmNsdWRlcygncWwtZWRpdG9yJykpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoY2xhc3NJbmNsdWRlKSB7XG4gICAgICAgICAgICBlbGVtZW50Tm9kZS5jbGFzc0xpc3QuYWRkKGNsYXNzSW5jbHVkZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChyZWFkb25seSkge1xuICAgICAgICAgICAgZWxlbWVudE5vZGUuY2xhc3NMaXN0LmFkZCgnIWJnLVsjZjhmOWZhXScpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHJlYWRvbmx5KSB7XG4gICAgICAgIGZvciAoY29uc3QgZWxlbWVudE5vZGUgb2YgZWRpdG9yRWwubmF0aXZlRWxlbWVudC5jaGlsZHJlbikge1xuICAgICAgICAgIGlmIChlbGVtZW50Tm9kZS5jbGFzc05hbWUuaW5jbHVkZXMoJ3FsLXRvb2xiYXInKSkge1xuICAgICAgICAgICAgZWxlbWVudE5vZGUuY2xhc3NMaXN0LmFkZCgncG9pbnRlci1ldmVudHMtbm9uZScpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYWRqdXN0SW5kZXhGb3JJbWFnZXMoaW5kZXg6IG51bWJlcikge1xuICAgIGNvbnN0IGNvbnRlbnQgPSB0aGlzLnF1aWxsKCk/LnJvb3Q7XG4gICAgbGV0IGltYWdlQ291bnQgPSAwO1xuICAgIGxldCBhZGp1c3RlZEluZGV4ID0gMDtcbiAgICBjb25zdCBhZGp1c3RUZXh0SW5kZXggPSAobm9kZTogTm9kZSkgPT4ge1xuICAgICAgaWYgKGFkanVzdGVkSW5kZXggPiBpbmRleCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUpIHtcbiAgICAgICAgYWRqdXN0ZWRJbmRleCArPSBub2RlLnRleHRDb250ZW50Py5sZW5ndGggfHwgMDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFICYmIG5vZGUubm9kZU5hbWUgPT09ICdJTUcnKSB7XG4gICAgICAgIGlmIChhZGp1c3RlZEluZGV4IDw9IGluZGV4KSB7XG4gICAgICAgICAgaW1hZ2VDb3VudCsrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERSkge1xuICAgICAgICBBcnJheS5mcm9tKG5vZGUuY2hpbGROb2RlcykuZm9yRWFjaChhZGp1c3RUZXh0SW5kZXgpO1xuICAgICAgfVxuICAgIH07XG4gICAgYWRqdXN0VGV4dEluZGV4KGNvbnRlbnQgYXMgTm9kZSk7XG4gICAgcmV0dXJuIGltYWdlQ291bnQ7XG4gIH07XG5cblxuICBwcml2YXRlIGhhbmRsZXJTZWxlY3Rpb25DaGFuZ2UoKSB7XG4gICAgdGhpcy5xdWlsbCgpPy5vbignc2VsZWN0aW9uLWNoYW5nZScsIChyYW5nZTogUmFuZ2VTdGF0aWMsIG9sZFJhbmdlOiBSYW5nZVN0YXRpYywgc291cmNlOiBTb3VyY2VzKSA9PiB7XG4gICAgICBpZiAodGhpcy5yZWFkb25seSgpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChyYW5nZSA9PT0gbnVsbCAmJiBvbGRSYW5nZSAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLm91dEJsdXIuZW1pdCgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAocmFuZ2UgIT09IG51bGwgJiYgb2xkUmFuZ2UgPT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5vdXRGb2N1cy5lbWl0KCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGZvcm1hdCA9IHRoaXMucXVpbGwoKT8uZ2V0Rm9ybWF0KCk7XG4gICAgICBpZiAoZm9ybWF0KSB7XG4gICAgICAgIHRoaXMuZ2V0Rm9udChmb3JtYXQpO1xuICAgICAgICB0aGlzLmdldEZvbnRTaXplKGZvcm1hdCk7XG4gICAgICB9XG4gICAgICB0aGlzLm91dFNlbGVjdGlvbkNoYW5nZS5lbWl0KHtcbiAgICAgICAgcXVpbGw6IHRoaXMucXVpbGwoKSBhcyBRdWlsbCxcbiAgICAgICAgcmFuZ2UsXG4gICAgICAgIG9sZFJhbmdlLFxuICAgICAgICBzb3VyY2VcbiAgICAgIH0pO1xuICAgICAgaWYgKHJhbmdlLmxlbmd0aCA9PT0gMCAmJiBmb3JtYXQ/LmxpbmsgJiYgc291cmNlID09PSAndXNlcicpIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gZG9jdW1lbnQuZ2V0U2VsZWN0aW9uKCk7XG4gICAgICAgIGNvbnN0IGFuY2hvck5vZGUgPSBzZWxlY3Rpb24/LmFuY2hvck5vZGU7XG4gICAgICAgIGxldCBsaW5rTm9kZSA9IGFuY2hvck5vZGUgYXMgSFRNTEFuY2hvckVsZW1lbnQ7XG4gICAgICAgIHdoaWxlIChsaW5rTm9kZSAmJiBsaW5rTm9kZS50YWdOYW1lICE9PSAnQScpIHtcbiAgICAgICAgICBsaW5rTm9kZSA9IGxpbmtOb2RlLnBhcmVudE5vZGUgYXMgSFRNTEFuY2hvckVsZW1lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxpbmtOb2RlICYmIGxpbmtOb2RlLnRhZ05hbWUgPT09ICdBJykge1xuICAgICAgICAgIGNvbnN0IGxpbmtUZXh0ID0gbGlua05vZGUuaW5uZXJUZXh0O1xuICAgICAgICAgIGNvbnN0IGxpbmtzSW5kaWNlczogQXJyYXk8bnVtYmVyPiA9IFtdO1xuICAgICAgICAgIGxldCBpbmRleFJldHVybjogbnVtYmVyIHwgdW5kZWZpbmVkID0gLTE7XG4gICAgICAgICAgd2hpbGUgKCFpc05pbChpbmRleFJldHVybikgJiYgaW5kZXhSZXR1cm4gPCByYW5nZS5pbmRleCkge1xuICAgICAgICAgICAgY29uc3QgdGV4dENvbnRlbnQgPSB0aGlzLnF1aWxsKCk/LmdldFRleHQoKTtcbiAgICAgICAgICAgIGNvbnN0IGxpbmtJbmRleCA9IHRleHRDb250ZW50Py5pbmRleE9mKGxpbmtUZXh0LCBsaW5rc0luZGljZXMubGVuZ3RoID4gMCA/IGxpbmtzSW5kaWNlc1tsaW5rc0luZGljZXMubGVuZ3RoIC0gMV0gKyBsaW5rVGV4dC5sZW5ndGggOiAwKTtcbiAgICAgICAgICAgIGlmICghaXNOaWwobGlua0luZGV4KSkge1xuICAgICAgICAgICAgICBpZiAobGlua0luZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgIGxpbmtzSW5kaWNlcy5wdXNoKGxpbmtJbmRleCk7XG4gICAgICAgICAgICAgICAgaW5kZXhSZXR1cm4gPSBsaW5rSW5kZXggKyBsaW5rVGV4dC5sZW5ndGg7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKGxpbmtJbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBpbmRleFJldHVybiA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAobGlua3NJbmRpY2VzICYmIGxpbmtzSW5kaWNlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlSW5kZXggPSBsaW5rc0luZGljZXNbbGlua3NJbmRpY2VzLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgY29uc3QgY291bnRJbWFnZSA9IHRoaXMuYWRqdXN0SW5kZXhGb3JJbWFnZXMocmFuZ2VJbmRleClcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLmxpbmsuc2V0KHtcbiAgICAgICAgICAgICAgICB0aXRsZTogbGlua1RleHQsXG4gICAgICAgICAgICAgICAgdXJsOiBsaW5rTm9kZS5ocmVmLFxuICAgICAgICAgICAgICAgIHJhbmdlOiB7XG4gICAgICAgICAgICAgICAgICBpbmRleDogcmFuZ2VJbmRleCArIGNvdW50SW1hZ2UsXG4gICAgICAgICAgICAgICAgICBsZW5ndGg6IGxpbmtUZXh0Lmxlbmd0aFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgdGhpcy5wb3BvdmVyRnVuY3Rpb25Db250cm9sKCk/LnNob3dQb3BvdmVyKGxpbmtOb2RlKVxuICAgICAgICAgICAgfSwgMjUwKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlclBhc3RlKCkge1xuICAgIHNldCh0aGlzLnF1aWxsLCAncm9vdC5vbnBhc3RlJywgYXN5bmMgKGV2ZW50OiBDbGlwYm9hcmRFdmVudCkgPT4ge1xuICAgICAgaWYgKCFldmVudCB8fCAhZXZlbnQuY2xpcGJvYXJkRGF0YSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBmaWxlcyA9IGV2ZW50LmNsaXBib2FyZERhdGEuZmlsZXM7XG4gICAgICBpZiAoIWZpbGVzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgY29uc3QgaW1hZ2VzOiBBcnJheTxGaWxlPiA9IFtdO1xuICAgICAgQXJyYXkuZnJvbShmaWxlcykuZm9yRWFjaCgoZmlsZSkgPT4ge1xuICAgICAgICBpZiAoZmlsZSAmJiBmaWxlLnR5cGUuc3BsaXQoJy8nKVswXSA9PT0gJ2ltYWdlJykge1xuICAgICAgICAgIGltYWdlcy5wdXNoKGZpbGUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGxpbmtzID0gYXdhaXQgdGhpcy51cGxvYWRJbWFnZUNvbmZpZygpLmZ1bmN0aW9uVXBsb2FkSW1hZ2U/LihpbWFnZXMpO1xuICAgICAgaWYgKGxpbmtzICYmIGxpbmtzLmxlbmd0aCkge1xuICAgICAgICBsaW5rcy5mb3JFYWNoKGxpbmsgPT4ge1xuICAgICAgICAgIGlmICghbGluayB8fCAodGhpcy51cGxvYWRJbWFnZUNvbmZpZygpLm9ubHlBY2NlcHRJbWFnZUh0dHBzTGluayAmJiAobGluayBpbnN0YW5jZW9mIEFycmF5QnVmZmVyIHx8ICFuZXcgUmVnRXhwKHBhdHRlcm5VcmwoKSkudGVzdChsaW5rKSkpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuaW5zZXJ0SW1hZ2UobGluayBhcyBzdHJpbmcpO1xuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVyVGV4dENoYW5nZSgpIHtcbiAgICB0aGlzLnF1aWxsKCk/Lm9uKCd0ZXh0LWNoYW5nZScsIChldmVudCkgPT4ge1xuICAgICAgdGhpcy5vdXRUZXh0Q2hhbmdlLmVtaXQoe1xuICAgICAgICBxdWlsbDogdGhpcy5xdWlsbCgpIGFzIFF1aWxsLFxuICAgICAgICBkZWx0YTogZXZlbnRcbiAgICAgIH0pO1xuICAgICAgY29uc3QgaHRtbCA9IHRoaXMucXVpbGwoKT8ucm9vdC5pbm5lckhUTUw7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKGV2ZW50Py5vcHNbMV0/Lmluc2VydCA9PT0gJ1xcbicpIHtcbiAgICAgICAgICBjb25zdCByYW5nZSA9IHsgaW5kZXg6IGV2ZW50Py5vcHNbMF0ucmV0YWluIGFzIG51bWJlciB9O1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRMZWFmID0gdGhpcy5xdWlsbCgpPy5nZXRMZWFmKHJhbmdlLmluZGV4KVswXTtcbiAgICAgICAgICBjb25zdCBuZXh0TGVhZiA9IHRoaXMucXVpbGwoKT8uZ2V0TGVhZihyYW5nZS5pbmRleCArIDEpWzBdO1xuICAgICAgICAgIHRoaXMucXVpbGwoKT8uaW5zZXJ0RW1iZWQocmFuZ2UuaW5kZXgsICdicmVhaycsIHRydWUsICd1c2VyJyk7XG4gICAgICAgICAgaWYgKG5leHRMZWFmID09PSBudWxsIHx8IGN1cnJlbnRMZWFmLnBhcmVudCAhPT0gbmV4dExlYWYucGFyZW50KSB7XG4gICAgICAgICAgICB0aGlzLnF1aWxsKCk/Lmluc2VydEVtYmVkKHJhbmdlLmluZGV4LCAnYnJlYWsnLCB0cnVlLCAndXNlcicpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLnF1aWxsKCk/LnNldFNlbGVjdGlvbigocmFuZ2UuaW5kZXggfHwgMCkgKyAxLCAwLCBRdWlsbC5zb3VyY2VzLlNJTEVOVCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgaWYgKGh0bWwgPT09ICc8ZGl2Pjxicj48L2Rpdj4nIHx8IGh0bWwgPT09ICc8ZGl2IHN0eWxlPVwidGV4dC1hbGlnbjoganVzdGlmeTtcIj48YnI+PC9kaXY+JyB8fCAhdGhpcy5xdWlsbCgpPy5nZXRUZXh0KCkpIHtcbiAgICAgICAgc2V0KHRoaXMuaXRlbSgpLCB0aGlzLmZpZWxkTmFtZUJpbmQoKSwgJycpO1xuICAgICAgICB0aGlzLnZhbGlkYXRlKCk7XG4gICAgICAgIHRoaXMub3V0Q2hhbmdlLmVtaXQoZ2V0KHRoaXMuaXRlbSgpLCB0aGlzLmZpZWxkTmFtZUJpbmQoKSkpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLmNvbnZlcnRJbm5lckhUTUwoKTtcbiAgICAgIHRoaXMudmFsaWRhdGUoKTtcbiAgICAgIHRoaXMub3V0Q2hhbmdlLmVtaXQoZ2V0KHRoaXMuaXRlbSgpLCB0aGlzLmZpZWxkTmFtZUJpbmQoKSkpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJQb3BvdmVyRnVuY3Rpb25Db250cm9sKGV2ZW50OiBJUG9wb3ZlckZ1bmN0aW9uQ29udHJvbEV2ZW50KSB7XG4gICAgdGhpcy5wb3BvdmVyRnVuY3Rpb25Db250cm9sLnNldChldmVudCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlclBvcG92ZXJFdmVudChldmVudDogVFlQRV9QT1BPVkVSX0VWRU5UKSB7XG4gICAgaWYgKGV2ZW50ID09PSAncmVtb3ZlJykge1xuICAgICAgdGhpcy5saW5rLnNldChsaW5rRGVmYXVsdCgpKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlclVubGluayhldmVudDogRXZlbnQpIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBjb25zdCBsaW5rID0gdGhpcy5saW5rKCk7XG4gICAgdGhpcy5xdWlsbCgpPy5mb3JtYXRUZXh0KGxpbmsucmFuZ2UuaW5kZXgsIGxpbmsucmFuZ2UubGVuZ3RoLCB7IGxpbms6IGZhbHNlIH0pO1xuICAgIHRoaXMucG9wb3ZlckZ1bmN0aW9uQ29udHJvbCgpPy5yZW1vdmVQb3BvdmVyT3ZlcmxheSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJFZGl0KGV2ZW50OiBFdmVudCkge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGNvbnN0IGxpbmsgPSB0aGlzLmxpbmsoKTtcbiAgICB0aGlzLmhhbmRsZVNob3dVcGxvYWRMaW5rKGxpbmspO1xuICAgIHRoaXMucG9wb3ZlckZ1bmN0aW9uQ29udHJvbCgpPy5yZW1vdmVQb3BvdmVyT3ZlcmxheSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBjYWxjdWxhdG9yVG9vbGJhcigpIHtcbiAgICB0aGlzLnRpbWVDYWxjdWxhdGlvblRvb2xCYXIuc2V0KHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY29uc3QgdG9vbGJhcldpZHRoID0gdGhpcy50b29sYmFySXRlbXNFbCgpPy5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoIHx8IDA7XG5cbiAgICAgIGxldCB0b3RhbFdpZHRoID0gMjg7XG4gICAgICBjb25zdCBoaWRkZW5JdGVtczogQXJyYXk8bnVtYmVyPiA9IFtdO1xuICAgICAgY29uc3QgaGlkZGVuSXRlbXNFeHBhbmQ6IEFycmF5PG51bWJlcj4gPSBbXTtcblxuICAgICAgdGhpcy50b29sYmFyT3B0aW9uc0NvbmZpZygpLmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICAgIHRvdGFsV2lkdGggKz0gaXRlbS53aWR0aDtcbiAgICAgICAgaWYgKGl0ZW0udHlwZSA9PT0gJ2xpbmUnKSB7XG4gICAgICAgICAgY29uc3QgbmV4dEl0ZW1XaWR0aCA9IHRvdGFsV2lkdGggKyB0aGlzLnRvb2xiYXJPcHRpb25zQ29uZmlnKClbK2luZGV4ICsgMV0ud2lkdGg7XG4gICAgICAgICAgaWYgKG5leHRJdGVtV2lkdGggPiB0b29sYmFyV2lkdGgpIHtcbiAgICAgICAgICAgIGhpZGRlbkl0ZW1zRXhwYW5kLnB1c2goK2luZGV4KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRvdGFsV2lkdGggPiB0b29sYmFyV2lkdGgpIHtcbiAgICAgICAgICBoaWRkZW5JdGVtcy5wdXNoKCtpbmRleCk7XG5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgdGhpcy5pdGVtSGlkZGVuLnNldChoaWRkZW5JdGVtcyk7XG4gICAgICB0aGlzLml0ZW1IaWRkZW5FeHBhbmQuc2V0KGhpZGRlbkl0ZW1zRXhwYW5kKTtcbiAgICB9LCA1MDApKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzZXRTdHlsZSh0eXBlOiBzdHJpbmcsIGRhdGE6IHN0cmluZyB8IG51bWJlcikge1xuICAgIHRoaXMucXVpbGwoKT8uZm9ybWF0KHR5cGUsIGRhdGEpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRGb250U2l6ZShmb3JtYXQ6IFN0cmluZ01hcCkge1xuICAgIGNvbnN0IGZvbnRTaXplID0gZm9ybWF0Py5zaXplPy50b1N0cmluZygpPy5yZXBsYWNlKCdweCcsICcnKTtcbiAgICBpZiAoaXNOYU4ocGFyc2VGbG9hdChmb250U2l6ZSkpKSB7XG4gICAgICB0aGlzLnNpemUuc2V0KHsgdmFsdWU6IDE0IH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnNpemUuc2V0KHsgdmFsdWU6IHBhcnNlRmxvYXQoZm9udFNpemUpIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRGb250KGZvcm1hdDogU3RyaW5nTWFwKSB7XG4gICAgY29uc3QgZm9udCA9IGxpc3RGb250KCkuZmluZCgoaXRlbSkgPT4gaXRlbS5rZXkgPT09IGZvcm1hdC5mb250KTtcbiAgICBpZiAoIWZvbnQpIHtcbiAgICAgIHRoaXMuZm9udFNlbGVjdGVkLnNldCh7IGtleTogJycsIGl0ZW06IGxpc3RGb250KCkuZmluZCgoaXRlbSkgPT4gaXRlbS5rZXkgPT09ICcnKSB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5mb250U2VsZWN0ZWQuc2V0KHsga2V5OiBmb3JtYXQuZm9udCwgaXRlbTogZm9udCB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVVbmRvKCkge1xuICAgIHRoaXMucXVpbGwoKT8uaGlzdG9yeT8udW5kbygpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZVJlZG8oKSB7XG4gICAgdGhpcy5xdWlsbCgpPy5oaXN0b3J5Py5yZWRvKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgc2V0Q29udGVudChjb250ZW50OiBzdHJpbmcpIHtcbiAgICBpZiAoIWNvbnRlbnQpIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gc2V0KHRoaXMucXVpbGwsICdyb290LmlubmVySFRNTCcsICcnKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGNvbnRlbnRYc3NGaWx0ZXIgPSBhd2FpdCB4c3NGaWx0ZXIoY29udGVudCk7XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHNldCh0aGlzLnF1aWxsLCAncm9vdC5pbm5lckhUTUwnLCBjb250ZW50WHNzRmlsdGVyKSk7XG4gICAgaWYgKCF0aGlzLmF1dG9Gb2N1c0JvdHRvbSgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5xdWlsbCgpPy5ibHVyKCk7XG4gICAgICBjb25zdCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG4gICAgICBjb25zdCBzZWwgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gICAgICBjb25zdCB0YXJnZXQgPSB0aGlzLnF1aWxsRWRpdG9yRWwoKT8ubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCdbY29udGVudGVkaXRhYmxlPVwidHJ1ZVwiXScpO1xuICAgICAgY29uc3QgY29udGVudFNjcm9sbCA9IHRoaXMuaGVpZ2h0QXV0bygpID8gdGhpcy53cmFwcGVyRWRpdG9yRWwoKT8ubmF0aXZlRWxlbWVudCA6IHRhcmdldDtcbiAgICAgIHJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyh0YXJnZXQpO1xuICAgICAgcmFuZ2UuY29sbGFwc2UoZmFsc2UpO1xuICAgICAgc2VsPy5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICAgIHNlbD8uYWRkUmFuZ2UocmFuZ2UpO1xuICAgICAgdGFyZ2V0LmZvY3VzKCk7XG4gICAgICBjb250ZW50U2Nyb2xsLnNjcm9sbFRvcCA9IGNvbnRlbnRTY3JvbGwuc2Nyb2xsSGVpZ2h0O1xuICAgIH0sIDEwMCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckFkZEVtb2ppKGVtb2ppOiB1bmtub3duKSB7XG4gICAgY29uc3Qgc2VsZWN0aW9uID0gdGhpcy5xdWlsbCgpPy5nZXRTZWxlY3Rpb24odHJ1ZSkuaW5kZXg7XG4gICAgaWYgKCFpc05pbChzZWxlY3Rpb24pKSB7XG4gICAgICB0aGlzLnF1aWxsKCk/Lmluc2VydFRleHQoc2VsZWN0aW9uLCBlbW9qaSBhcyBzdHJpbmcpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVTaG93VXBsb2FkTGluayhldmVudDogdW5rbm93bikge1xuICAgIHRoaXMuYWRkRWRpdExpbmtDb21wb25lbnRSZWYuc2V0KHRoaXMuZHluYW1pY0NvbXBvbmVudFNlcnZpY2UucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkoTGlic1VpQ29tcG9uZW50c0lucHV0c1F1aWxsTGlua0NvbXBvbmVudCkpO1xuICAgIGNvbnN0IGluc3RhbmNlID0gdGhpcy5hZGRFZGl0TGlua0NvbXBvbmVudFJlZigpPy5pbnN0YW5jZTtcbiAgICBjb25zdCBzZWxlY3Rpb24gPSB0aGlzLnF1aWxsKCk/LmdldFNlbGVjdGlvbigpO1xuICAgIGNvbnN0IHRleHRTZWxlY3RlZCA9IHNlbGVjdGlvbj8ubGVuZ3RoID8gdGhpcy5xdWlsbCgpPy5nZXRUZXh0KHNlbGVjdGlvbj8uaW5kZXgsIHNlbGVjdGlvbj8ubGVuZ3RoKSA6ICcnO1xuICAgIGNvbnN0IGRhdGEgPSBldmVudCBhcyBJUXVpbGxMaW5rIHwgdW5kZWZpbmVkO1xuICAgIHRoaXMuYWRkRWRpdExpbmtDb21wb25lbnRSZWYoKT8uc2V0SW5wdXQoJ3pJbmRleCcsIHRoaXMuekluZGV4KCkpO1xuICAgIHRoaXMuYWRkRWRpdExpbmtDb21wb25lbnRSZWYoKT8uc2V0SW5wdXQoJ3RpdGxlJywgZGF0YT8udGl0bGUgfHwgdGV4dFNlbGVjdGVkKTtcbiAgICB0aGlzLmFkZEVkaXRMaW5rQ29tcG9uZW50UmVmKCk/LnNldElucHV0KCdsaW5rJywgZGF0YT8udXJsIHx8ICcnKTtcbiAgICBpbnN0YW5jZT8ub3V0U2F2ZUxpbmsuc3Vic2NyaWJlKChpdGVtOiB7IHRpdGxlOiBzdHJpbmcsIGxpbms6IHN0cmluZyB9KSA9PiB7XG4gICAgICBpZiAoZGF0YSBpbnN0YW5jZW9mIE9iamVjdCAmJiBkYXRhLnVybCkge1xuICAgICAgICB0aGlzLnF1aWxsKCk/LmRlbGV0ZVRleHQoZGF0YS5yYW5nZS5pbmRleCwgZGF0YS5yYW5nZS5sZW5ndGgsIFF1aWxsLnNvdXJjZXMuVVNFUik7XG4gICAgICAgIHRoaXMucXVpbGwoKT8uaW5zZXJ0VGV4dChkYXRhLnJhbmdlLmluZGV4LCBpdGVtLnRpdGxlLCAnbGluaycsIGl0ZW0ubGluayk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuaW5zZXJ0TGluayhpdGVtLnRpdGxlLCBpdGVtLmxpbmspO1xuICAgIH0pO1xuICAgIGluc3RhbmNlPy5vdXRDbG9zZS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5keW5hbWljQ29tcG9uZW50U2VydmljZS5yZW1vdmUodGhpcy5hZGRFZGl0TGlua0NvbXBvbmVudFJlZigpKSk7XG4gICAgdGhpcy5keW5hbWljQ29tcG9uZW50U2VydmljZS5hZGRUb0JvZHkodGhpcy5hZGRFZGl0TGlua0NvbXBvbmVudFJlZigpKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyVW5JbnNlcnRMaW5rKCkge1xuICAgIGNvbnN0IHNlbGVjdGlvbiA9IHRoaXMucXVpbGwoKT8uZ2V0U2VsZWN0aW9uKHRydWUpO1xuICAgIGlmICghaXNOaWwoc2VsZWN0aW9uKSkge1xuICAgICAgdGhpcy5xdWlsbCgpPy5mb3JtYXRUZXh0KHNlbGVjdGlvbiwgJ2xpbmsnLCBmYWxzZSk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIHZhbGlkYXRlKCkge1xuICAgIHRoaXMubWVzc2FnZUVycm9yLnNldCgnJyk7XG4gICAgY29uc3QgdmFsaWRSZXF1aXJlZCA9IHRoaXMudmFsaWRSZXF1aXJlZCgpO1xuICAgIGNvbnN0IGl0ZW0gPSB0aGlzLml0ZW0oKTtcbiAgICBjb25zdCBmaWVsZE5hbWVCaW5kID0gdGhpcy5maWVsZE5hbWVCaW5kKCk7XG4gICAgY29uc3QgdmFsdWUgPSBnZXQoaXRlbSwgZmllbGROYW1lQmluZCk7XG4gICAgaWYgKHZhbGlkUmVxdWlyZWQgJiYgdmFsaWRSZXF1aXJlZC5pc1JlcXVpcmVkICYmICghZmllbGROYW1lQmluZCB8fCAhdmFsdWUgfHwgIXZhbHVlLnRyaW0oKSkpIHtcbiAgICAgIHRoaXMubWVzc2FnZUVycm9yLnNldCh2YWxpZFJlcXVpcmVkLm1lc3NhZ2UgfHwgRVJST1JfTUVTU0FHRV9FTVBUWV9WQUxJRCk7XG4gICAgICB0aGlzLm91dE1lc3NhZ2VFcnJvci5lbWl0KHRoaXMubWVzc2FnZUVycm9yKCkpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCB2YWxpZE1pbkxlbmd0aCA9IHRoaXMudmFsaWRNaW5MZW5ndGgoKTtcbiAgICBpZiAodmFsaWRNaW5MZW5ndGggJiYgZmllbGROYW1lQmluZCAmJiB2YWx1ZSAmJiB2YWx1ZS50cmltKCkubGVuZ3RoIDwgdmFsaWRNaW5MZW5ndGgubGVuZ3RoKSB7XG4gICAgICB0aGlzLm1lc3NhZ2VFcnJvci5zZXQodmFsaWRNaW5MZW5ndGgubWVzc2FnZSB8fCBFUlJPUl9NRVNTQUdFX01JTl9MRU5HVEgpO1xuICAgICAgdGhpcy5vdXRNZXNzYWdlRXJyb3IuZW1pdCh0aGlzLm1lc3NhZ2VFcnJvcigpKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgdmFsaWRNYXhMZW5ndGggPSB0aGlzLnZhbGlkTWF4TGVuZ3RoKCk7XG4gICAgaWYgKHZhbGlkTWF4TGVuZ3RoICYmIGZpZWxkTmFtZUJpbmQgJiYgdmFsdWUgJiYgdmFsdWUudHJpbSgpLmxlbmd0aCA+IHRoaXMudmFsaWRNYXhMZW5ndGgubGVuZ3RoKSB7XG4gICAgICB0aGlzLm1lc3NhZ2VFcnJvci5zZXQodmFsaWRNYXhMZW5ndGgubWVzc2FnZSB8fCBFUlJPUl9NRVNTQUdFX01BWF9MRU5HVEgpO1xuICAgICAgdGhpcy5vdXRNZXNzYWdlRXJyb3IuZW1pdCh0aGlzLm1lc3NhZ2VFcnJvcigpKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy5vdXRNZXNzYWdlRXJyb3IuZW1pdCh0aGlzLm1lc3NhZ2VFcnJvcigpKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBpbnNlcnRJbWFnZShjb250ZW50OiBzdHJpbmcsIGluZGV4PzogbnVtYmVyKSB7XG4gICAgY29uc3Qgc2VsZWN0aW9uID0gaW5kZXggPz8gdGhpcy5xdWlsbCgpPy5nZXRTZWxlY3Rpb24odHJ1ZSkuaW5kZXg7XG4gICAgaWYgKCFpc05pbChzZWxlY3Rpb24pKSB7XG4gICAgICB0aGlzLnF1aWxsKCk/Lmluc2VydEVtYmVkKHNlbGVjdGlvbiwgJ2ltYWdlJywgY29udGVudCk7XG4gICAgICB0aGlzLnF1aWxsKCk/LnNldFNlbGVjdGlvbihzZWxlY3Rpb24gKyAxLCAwKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGluc2VydFRleHQoY29udGVudDogc3RyaW5nLCBpbmRleD86IG51bWJlcikge1xuICAgIGNvbnN0IHNlbGVjdGlvbiA9IGluZGV4ID8/IHRoaXMucXVpbGwoKT8uZ2V0U2VsZWN0aW9uKHRydWUpLmluZGV4O1xuICAgIGlmICghaXNOaWwoc2VsZWN0aW9uKSkge1xuICAgICAgdGhpcy5xdWlsbCgpPy5pbnNlcnRUZXh0KHNlbGVjdGlvbiwgY29udGVudCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBpbnNlcnRMaW5rKHRleHQ6IHN0cmluZywgdXJsOiBzdHJpbmcsIGluZGV4PzogbnVtYmVyKSB7XG4gICAgY29uc3Qgc2VsZWN0aW9uID0gdGhpcy5xdWlsbCgpPy5nZXRTZWxlY3Rpb24odHJ1ZSk7XG4gICAgY29uc3QgaW5kZXhJbnNlcnQgPSBpbmRleCA/PyBzZWxlY3Rpb24/LmluZGV4O1xuICAgIGlmIChzZWxlY3Rpb24/Lmxlbmd0aCkge1xuICAgICAgdGhpcy5xdWlsbCgpPy5kZWxldGVUZXh0KHNlbGVjdGlvbi5pbmRleCwgc2VsZWN0aW9uLmxlbmd0aCwgUXVpbGwuc291cmNlcy5VU0VSKTtcbiAgICB9XG4gICAgaWYgKCFpc05pbChpbmRleEluc2VydCkpIHtcbiAgICAgIHRoaXMucXVpbGwoKT8uaW5zZXJ0VGV4dChpbmRleEluc2VydCwgdGV4dCwgJ2xpbmsnLCB1cmwpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY29udmVydElubmVySFRNTCgpIHtcbiAgICB0aGlzLnNldFN0eWxlRm9yQ29udGVudCgpO1xuICAgIHNldCh0aGlzLml0ZW0oKSwgdGhpcy5maWVsZE5hbWVCaW5kKCksIHRoaXMucXVpbGwoKT8ucm9vdC5pbm5lckhUTUwpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRTdHlsZUZvckNvbnRlbnQoKSB7XG4gICAgY29uc3Qgc3R5bGVBcnJheSA9IFtcbiAgICAgIHsgc2VsZWN0b3I6ICcucWwtZm9udC1BcmlhbCcsIHN0eWxlOiAnZm9udC1mYW1pbHk6IEFyaWFsJyB9LFxuICAgICAgeyBzZWxlY3RvcjogJy5xbC1mb250LXNhbnMtc2VyaWYnLCBzdHlsZTogJ2ZvbnQtZmFtaWx5OiBzYW5zLXNlcmlmJyB9LFxuICAgICAgeyBzZWxlY3RvcjogJy5xbC1mb250LXNlcmlmJywgc3R5bGU6ICdmb250LWZhbWlseTogc2VyaWYnIH0sXG4gICAgICB7IHNlbGVjdG9yOiAnLnFsLWZvbnQtbW9ub3NwYWNlJywgc3R5bGU6ICdmb250LWZhbWlseTogbW9ub3NwYWNlJyB9LFxuICAgICAgeyBzZWxlY3RvcjogJy5xbC1mb250LUhlbHZldGljYScsIHN0eWxlOiAnZm9udC1mYW1pbHk6IEhlbHZldGljYScgfSxcbiAgICAgIHsgc2VsZWN0b3I6ICcubGlicy11aS1xdWlsbC1mb3JtYXQtaW1hZ2UnLCBzdHlsZTogJ21heC13aWR0aDogMTAwJTsgaGVpZ2h0OiBhdXRvJywgb3ZlcnJpZGVTdHlsZTogdHJ1ZSB9LFxuICAgICAgeyBzZWxlY3RvcjogJy5saWJzLXVpLXF1aWxsLW1lbnRpb24nLCBzdHlsZTogJ2ZvbnQtd2VpZ2h0OiA2MDA7LW1vei1vc3gtZm9udC1zbW9vdGhpbmc6IGdyYXlzY2FsZTstd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsgY29sb3I6ICM3MjM5RUEnLCBvdmVycmlkZVN0eWxlOiB0cnVlIH0sXG4gICAgICB7IHNlbGVjdG9yOiAnYmxvY2txdW90ZScsIHN0eWxlOiAnYm9yZGVyLWxlZnQ6IDRweCBzb2xpZCAjY2NjOyBtYXJnaW4tYm90dG9tOiA1cHg7IG1hcmdpbi10b3A6IDVweDsgcGFkZGluZy1sZWZ0OiAxNnB4Jywgb3ZlcnJpZGVTdHlsZTogdHJ1ZSB9XG4gICAgXTtcbiAgICB0aGlzLmJsb3RzUmVnaXN0ZXIoKT8uZm9yRWFjaChpdGVtID0+IHtcbiAgICAgIHN0eWxlQXJyYXkucHVzaCh7IHNlbGVjdG9yOiBgLiR7aXRlbS5jbGFzc05hbWV9YCwgc3R5bGU6IGl0ZW0uc3R5bGUsIG92ZXJyaWRlU3R5bGU6IHRydWUgfSk7XG4gICAgfSk7XG4gICAgc3R5bGVBcnJheS5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICBjb25zdCBlbGVtZW50cyA9IHRoaXMucXVpbGwoKT8ucm9vdC5xdWVyeVNlbGVjdG9yQWxsKGl0ZW0uc2VsZWN0b3IpO1xuICAgICAgZWxlbWVudHM/LmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgaWYgKGl0ZW0ub3ZlcnJpZGVTdHlsZSkge1xuICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdzdHlsZScsIGl0ZW0uc3R5bGUpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBGaXhidWcgaXNzdWU6IGh0dHBzOi8vYWRtaW4tY3YubW9iaW8udm4vaXNzdWVzLzQ5MDkyXG4gICAgICAgIGxldCBzdHlsZUV4aXN0ID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3N0eWxlJyk7XG4gICAgICAgIGlmIChzdHlsZUV4aXN0KSB7XG4gICAgICAgICAgWydmb250LWZhbWlseTogQXJpYWwnLCAnZm9udC1mYW1pbHk6IHNhbnMtc2VyaWYnLCAnZm9udC1mYW1pbHk6IHNlcmlmJywgJ2ZvbnQtZmFtaWx5OiBtb25vc3BhY2UnLCAnZm9udC1mYW1pbHk6IEhlbHZldGljYSddLmZvckVhY2goZm9udCA9PiB7XG4gICAgICAgICAgICBzdHlsZUV4aXN0ID0gKHN0eWxlRXhpc3Q/LmluY2x1ZGVzKGAke2ZvbnR9O2ApID8gc3R5bGVFeGlzdD8ucmVwbGFjZShgJHtmb250fTtgLCAnJykgOiBzdHlsZUV4aXN0Py5yZXBsYWNlKGZvbnQsICcnKSkgYXMgc3RyaW5nO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdzdHlsZScsIHN0eWxlRXhpc3QgPyBgJHtzdHlsZUV4aXN0fSR7c3R5bGVFeGlzdFtzdHlsZUV4aXN0Lmxlbmd0aCAtIDFdID09PSAnOycgPyAnJyA6ICc7J30ke2l0ZW0uc3R5bGV9O2AgOiBpdGVtLnN0eWxlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZVRvZ2dsZU1lbnRpb24oc2hvdzogYm9vbGVhbikge1xuICAgIHRoaXMuc2hvd01lbnRpb24uc2V0KHNob3cpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVyU2hvd1VwbG9hZEltYWdlKCkge1xuICAgIGlmICh0aGlzLnVwbG9hZEltYWdlQ29uZmlnKCkubW9kZUN1c3RvbSkge1xuICAgICAgdGhpcy51cGxvYWRJbWFnZUNvbXBvbmVudFJlZi5zZXQodGhpcy5keW5hbWljQ29tcG9uZW50U2VydmljZS5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShMaWJzVWlDb21wb25lbnRzSW5wdXRzUXVpbGxVcGxvYWRJbWFnZUNvbXBvbmVudCkpO1xuICAgICAgY29uc3QgaW5zdGFuY2UgPSB0aGlzLnVwbG9hZEltYWdlQ29tcG9uZW50UmVmKCk/Lmluc3RhbmNlO1xuICAgICAgdGhpcy51cGxvYWRJbWFnZUNvbXBvbmVudFJlZigpPy5zZXRJbnB1dCgndXBsb2FkSW1hZ2VDb25maWcnLCB0aGlzLnVwbG9hZEltYWdlQ29uZmlnKCkpO1xuICAgICAgaW5zdGFuY2U/Lm91dENsb3NlLnN1YnNjcmliZSgobGluazogc3RyaW5nIHwgdm9pZCkgPT4ge1xuICAgICAgICB0aGlzLmR5bmFtaWNDb21wb25lbnRTZXJ2aWNlLnJlbW92ZSh0aGlzLnVwbG9hZEltYWdlQ29tcG9uZW50UmVmKCkpO1xuICAgICAgICBpZiAobGluaykge1xuICAgICAgICAgIHRoaXMuaW5zZXJ0SW1hZ2UobGluayk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgdGhpcy5keW5hbWljQ29tcG9uZW50U2VydmljZS5hZGRUb0JvZHkodGhpcy51cGxvYWRJbWFnZUNvbXBvbmVudFJlZigpKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcbiAgICBpbnB1dC5zZXRBdHRyaWJ1dGUoJ3R5cGUnLCAnZmlsZScpO1xuICAgIGlucHV0LnNldEF0dHJpYnV0ZSgnYWNjZXB0JywgJ2ltYWdlLyonKTtcbiAgICBpbnB1dC5jbGljaygpO1xuICAgIGlucHV0Lm9uY2hhbmdlID0gYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZmlsZSA9IGlucHV0Py5maWxlcz8uWzBdO1xuXG4gICAgICBpZiAoIWZpbGUgfHwgZmlsZS50eXBlLnNwbGl0KCcvJylbMF0gIT09ICdpbWFnZScpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgbGlua3MgPSBhd2FpdCB0aGlzLnVwbG9hZEltYWdlQ29uZmlnKCkuZnVuY3Rpb25VcGxvYWRJbWFnZT8uKFtmaWxlXSk7XG4gICAgICBpZiAobGlua3MgJiYgbGlua3MubGVuZ3RoKSB7XG4gICAgICAgIGxpbmtzLmZvckVhY2gobGluayA9PiB7XG4gICAgICAgICAgaWYgKCFsaW5rIHx8ICh0aGlzLnVwbG9hZEltYWdlQ29uZmlnKCkub25seUFjY2VwdEltYWdlSHR0cHNMaW5rICYmIChsaW5rIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIgfHwgIW5ldyBSZWdFeHAocGF0dGVyblVybCgpKS50ZXN0KGxpbmspKSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5pbnNlcnRJbWFnZShsaW5rIGFzIHN0cmluZyk7XG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpbnNlcnRNZW50aW9uKGV2ZW50OiBJTWVudGlvbkluc2VydCkge1xuICAgIGNvbnN0IHJhbmdlID0gdGhpcy5xdWlsbCgpPy5nZXRTZWxlY3Rpb24oKTtcbiAgICBpZiAoIXJhbmdlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGN1cnNvclBvcyA9IHJhbmdlLmluZGV4O1xuICAgIGNvbnN0IHN0YXJ0UG9zSW5zZXJ0ID0gY3Vyc29yUG9zIC0gZXZlbnQubGVuZ3RoS2V5O1xuICAgIHRoaXMucXVpbGwoKT8uZGVsZXRlVGV4dChzdGFydFBvc0luc2VydCwgZXZlbnQubGVuZ3RoS2V5LCBRdWlsbC5zb3VyY2VzLlVTRVIpO1xuICAgIHRoaXMucXVpbGwoKT8uaW5zZXJ0RW1iZWQoc3RhcnRQb3NJbnNlcnQsICdtZW50aW9uJywgZXZlbnQuZGF0YSwgUXVpbGwuc291cmNlcy5VU0VSKTtcbiAgICB0aGlzLnF1aWxsKCk/Lmluc2VydFRleHQoc3RhcnRQb3NJbnNlcnQgKyAxLCAnICcsIFF1aWxsLnNvdXJjZXMuVVNFUik7XG4gICAgdGhpcy5xdWlsbCgpPy5zZXRTZWxlY3Rpb24oc3RhcnRQb3NJbnNlcnQgKyAyLCAwLCBRdWlsbC5zb3VyY2VzLlVTRVIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJJbnNlcnRNZW50aW9uKGRhdGE6IElNZW50aW9uSW5zZXJ0KSB7XG4gICAgdGhpcy5pbnNlcnRNZW50aW9uKGRhdGEpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIHNldEZvbnRTaXplKHNpemU6IG51bWJlcikge1xuICAgIHRoaXMucXVpbGwoKT8uZm9ybWF0KCdzaXplJywgYCR7c2l6ZX1weGApO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJWYWx1ZUNoYW5nZSh2YWx1ZTogbnVtYmVyIHwgc3RyaW5nKSB7XG4gICAgdGhpcy5zaXplLnVwZGF0ZShpdGVtID0+ICh7IC4uLml0ZW0sIHZhbHVlOiB2YWx1ZSBhcyBudW1iZXIgfSkpO1xuICAgIHRoaXMucXVpbGwoKT8uZm9ybWF0KCdzaXplJywgYCR7dGhpcy5zaXplKCkudmFsdWV9cHhgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVTZWxlY3RBbGlnbihldmVudDogSUVtaXRTZWxlY3RLZXkgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLmFsaWduU2VsZWN0ZWQuc2V0KGV2ZW50KTtcbiAgICB0aGlzLnNldFN0eWxlKCdhbGlnbicsIGV2ZW50Py5rZXkgYXMgc3RyaW5nKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVTZWxlY3RGb250KGV2ZW50OiBJRW1pdFNlbGVjdEtleSB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuZm9udFNlbGVjdGVkLnNldChldmVudCk7XG4gICAgdGhpcy5zZXRTdHlsZSgnZm9udCcsIGV2ZW50Py5rZXkgYXMgc3RyaW5nKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyQ2hhbmdlU2hvd01vcmVBY3Rpb24oZXZlbnQ6IEV2ZW50KSB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5zaG93TW9yZUFjdGlvbi51cGRhdGUoaXRlbSA9PiAhaXRlbSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLm9uRGVzdHJveS5uZXh0KCk7XG4gICAgdGhpcy5vbkRlc3Ryb3kuY29tcGxldGUoKTtcbiAgICB0aGlzLmR5bmFtaWNDb21wb25lbnRTZXJ2aWNlLnJlbW92ZSh0aGlzLmFkZEVkaXRMaW5rQ29tcG9uZW50UmVmKCkpO1xuICAgIHRoaXMuZHluYW1pY0NvbXBvbmVudFNlcnZpY2UucmVtb3ZlKHRoaXMudXBsb2FkSW1hZ2VDb21wb25lbnRSZWYoKSk7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZUNhbGN1bGF0aW9uVG9vbEJhcigpKTtcbiAgfVxufVxuXG4iLCI8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCB3LWZ1bGwgaC1mdWxsXCI+XG4gIEBpZiAobGFiZWwoKTsgYXMgbGFiZWwpIHtcbiAgICA8bGlic191aS1jb21wb25lbnRzLWxhYmVsIFtjbGFzc0luY2x1ZGVdPVwibGFiZWwuY2xhc3NJbmNsdWRlXCJcbiAgICAgIFtyZXF1aXJlZF09XCJsYWJlbC5yZXF1aXJlZFwiXG4gICAgICBbbGFiZWxMZWZ0XT1cImxhYmVsLmxhYmVsTGVmdFwiIC8+XG4gIH1cbiAgPGRpdiAjd3JhcHBlckVkaXRvclxuICAgIFthdHRyLmhlaWdodEF1dG9dPVwiaGVpZ2h0QXV0bygpXCJcbiAgICBbYXR0ci5pc1Rvb2xiYXJQb3NpdG9uRml4ZWRdPVwiaXNUb29sYmFyUG9zaXRvbkZpeGVkKClcIlxuICAgIGNsYXNzPVwibGlicy11aS1xdWlsbC13cmFwcGVyIHctZnVsbCBoLWZ1bGwgcmVsYXRpdmUgZmxleCBmbGV4LWNvbFwiXG4gICAgW2NsYXNzLmxpYnMtdWktYm9yZGVyLWVycm9yLWdlbmVyYWxdPVwibWVzc2FnZUVycm9yKCkgJiYgc2hvd0Vycm9yQm9yZGVyKCkgJiYgIW9ubHlTaG93RXJyb3JCb3JkZXJJbkNvbnRlbnQoKVwiXG4gICAgW2NsYXNzLnJvdW5kZWQtWzRweF1dPVwibWVzc2FnZUVycm9yKCkgJiYgc2hvd0Vycm9yQm9yZGVyKCkgJiYgIW9ubHlTaG93RXJyb3JCb3JkZXJJbkNvbnRlbnQoKVwiPlxuICAgIDxkaXYgI2VkaXRvclxuICAgICAgY2xhc3M9XCJsaWJzLXVpLXF1aWxsXCJcbiAgICAgIFthdHRyLnNob3dFcnJvcl09XCJtZXNzYWdlRXJyb3IoKSAmJiBzaG93RXJyb3JCb3JkZXIoKSAmJiBvbmx5U2hvd0Vycm9yQm9yZGVySW5Db250ZW50KClcIlxuICAgICAgW2NsYXNzLiFoaWRkZW5dPVwiIWRpc3BsYXkoKVwiPlxuICAgICAgPGRpdiAjcXVpbGxPcHRpb25cbiAgICAgICAgW2NsYXNzLiFoaWRkZW5dPVwiIWlzU2hvd1Rvb2xCYXIoKVwiXG4gICAgICAgIFtzdHlsZV09XCJzdHlsZXNJbmNsdWRlVG9vbGJhcigpXCJcbiAgICAgICAgY2xhc3M9XCJiZy1bI2Y4ZjlmYV0ge3sgaXNUb29sYmFyUG9zaXRvbkZpeGVkKCkgPyAnZml4ZWQgIXotMTAgcHgtWzhweF0gcHktWzRweF0gcC0wIHctWzUwMHB4XSByb3VuZGVkLVs0cHhdIGJnLVsjZmZmZmZmXSBsaWJzLXVpLXF1aWxsLXRvb2xiYXItYW5pbWF0aW9uJzonJyB9fSB7eyBjbGFzc0luY2x1ZGVUb29sYmFyKCkgfX1cIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRvb2xiYXJcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiAjcXVpbGxFZGl0b3JcbiAgICAgICAgTGlic1VpQ29tcG9uZW50c0lucHV0c01lbnRpb25EaXJlY3RpdmVcbiAgICAgICAgW21lbnRpb25Db25maWddPVwiZGF0YUNvbmZpZ01lbnRpb24oKVwiXG4gICAgICAgIChvdXRUb2dnbGUpPVwiaGFuZGxlVG9nZ2xlTWVudGlvbigkZXZlbnQpXCJcbiAgICAgICAgKG91dEluc2VydE1lbnRpb24pPVwiaGFuZGxlckluc2VydE1lbnRpb24oJGV2ZW50KVwiPjwvZGl2PlxuICAgIDwvZGl2PlxuICAgIEBpZiAodGVtcGxhdGUoKTsgYXMgdGVtcGxhdGUpIHtcbiAgICAgIDxkaXYgW2NsYXNzXT1cImNsYXNzSW5jbHVkZVRlbXBsYXRlKClcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICA8L2Rpdj5cbiAgICB9XG4gIDwvZGl2PlxuICBAaWYgKG1lc3NhZ2VFcnJvcigpICYmIHNob3dFcnJvckxhYmVsKCkpIHtcbiAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgbGVhZGluZy1ub3JtYWwgbXQtWzhweF1cIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1bI2ZmNTQ1NF0gbGlicy11aS1mb250LWg3clwiPiB7eyBtZXNzYWdlRXJyb3IoKSB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgfVxuPC9kaXY+XG5cbjxuZy10ZW1wbGF0ZSAjdG9vbGJhcj5cbiAgPGRpdiBjbGFzcz1cInRvb2xiYXJcIlxuICAgICN0b29sYmFySXRlbXM+XG4gICAgPGRpdiBjbGFzcz1cInFsLWZvcm1hdHMgaXRlbXMtY2VudGVyXCI+XG4gICAgICBAZm9yIChvcHRpb24gb2YgdG9vbGJhck9wdGlvbnNDb25maWcoKTsgdHJhY2sgb3B0aW9uKSB7XG4gICAgICAgIDxkaXYgI2l0ZW1cbiAgICAgICAgICBbaWRdPVwib3B0aW9uLnR5cGUrJ18nKyRpbmRleFwiXG4gICAgICAgICAgY2xhc3M9XCJpdGVtcy1jZW50ZXJcIlxuICAgICAgICAgIFtjbGFzcy5oaWRkZW5dPVwiaXRlbUhpZGRlbigpLmluY2x1ZGVzKCRpbmRleCkgfHwgaXRlbUhpZGRlbkV4cGFuZCgpLmluY2x1ZGVzKCRpbmRleClcIlxuICAgICAgICAgIFtjbGFzcy5mbGV4XT1cIiFpdGVtSGlkZGVuKCkuaW5jbHVkZXMoJGluZGV4KVwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpdGVtVGVtcGxhdGU7Y29udGV4dDp7b3B0aW9uLCAkaW5kZXgsICRsYXN0fVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICAgIDxkaXYgY2xhc3M9XCJyZWxhdGl2ZVwiPlxuICAgICAgICBAaWYgKGl0ZW1IaWRkZW4oKS5sZW5ndGgpIHtcbiAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uIFt0eXBlXT1cInNob3dNb3JlQWN0aW9uKCkgPyAnYnV0dG9uLXNlY29uZGFyeScgOiAnYnV0dG9uLXRoaXJkJ1wiXG4gICAgICAgICAgICBbaWNvbk9ubHlUeXBlXT1cInRydWVcIlxuICAgICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCInIXAtWzFweF0gIWgtWzIwcHhdIG1sLVs4cHhdJ1wiXG4gICAgICAgICAgICBbY2xhc3NJY29uTGVmdF09XCInbGlicy11aS1pY29uLW1vdmUtcmlnaHQgcm90YXRlLTkwJ1wiXG4gICAgICAgICAgICAob3V0Q2xpY2spPVwiaGFuZGxlckNoYW5nZVNob3dNb3JlQWN0aW9uKCRldmVudClcIiAvPlxuICAgICAgICB9XG4gICAgICAgIDwhLS0gQnVpbGQgdG9vbGJhciBraGkgY2xpY2sgeGVtIHRow6ptLS0+XG4gICAgICAgIDxkaXYgW2NsYXNzLmhpZGRlbl09XCIhc2hvd01vcmVBY3Rpb24oKSB8fCAhaXRlbUhpZGRlbigpLmxlbmd0aFwiXG4gICAgICAgICAgY2xhc3M9XCJhYnNvbHV0ZSBiZy1bI2ZmZmZmZl0gc2hhZG93LW1kIHotWzFdIGZsZXggaXRlbXMtY2VudGVyIHBsLVs4cHhdIHByLVsxNnB4XSBweS1bNHB4XSByb3VuZGVkLVs4cHhdIHRvcC1bMzFweF0gcmlnaHQtWzBweF1cIj5cbiAgICAgICAgICBAZm9yIChvcHRpb24gb2YgdG9vbGJhck9wdGlvbnNDb25maWcoKTsgdHJhY2sgb3B0aW9uKSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaXRlbXMtY2VudGVyXCJcbiAgICAgICAgICAgICAgW2NsYXNzLmhpZGRlbl09XCIhaXRlbUhpZGRlbigpLmluY2x1ZGVzKCRpbmRleClcIlxuICAgICAgICAgICAgICBbY2xhc3MuZmxleF09XCJpdGVtSGlkZGVuKCkuaW5jbHVkZXMoJGluZGV4KVwiPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaXRlbVRlbXBsYXRlO2NvbnRleHQ6e29wdGlvbiwgJGluZGV4LCAkbGFzdH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG5cbjxuZy10ZW1wbGF0ZSAjaXRlbVRlbXBsYXRlXG4gIGxldC0kaW5kZXg9XCIkaW5kZXhcIlxuICBsZXQtJGxhc3Q9XCIkbGFzdFwiXG4gIGxldC1vcHRpb249XCJvcHRpb25cIj5cbiAgQGlmIChvcHRpb24udHlwZSA9PT0gJ3VuZG8nKSB7XG4gICAgPGRpdiBbY2xhc3NdPVwib3B0aW9uLmNsYXNzSW5jbHVkZSB8fCAnbXgtWzhweF0nXCI+XG4gICAgICA8YnV0dG9uIExpYnNVaUNvbXBvbmVudHNQb3BvdmVyRGlyZWN0aXZlXG4gICAgICAgIFtjb25maWddPVwie2NvbnRlbnQ6ICdpMThuX3VuZG8nLCB6SW5kZXg6IDEyNTB9XCJcbiAgICAgICAgY2xhc3M9XCJxbC11bmRvXCI+PC9idXR0b24+XG4gICAgPC9kaXY+XG4gIH1cbiAgQGlmIChvcHRpb24udHlwZSA9PT0gJ3JlZG8nKSB7XG4gICAgPGRpdiBbY2xhc3NdPVwib3B0aW9uLmNsYXNzSW5jbHVkZSB8fCAnbXgtWzhweF0nXCI+XG4gICAgICA8YnV0dG9uIExpYnNVaUNvbXBvbmVudHNQb3BvdmVyRGlyZWN0aXZlXG4gICAgICAgIFtjb25maWddPVwie2NvbnRlbnQ6ICdpMThuX3JlZG8nLCB6SW5kZXg6IDEyNTB9XCJcbiAgICAgICAgY2xhc3M9XCJxbC1yZWRvXCI+PC9idXR0b24+XG4gICAgPC9kaXY+XG4gIH1cbiAgQGlmIChvcHRpb24udHlwZSA9PT0gJ2ZvbnRGYW1pbHknKSB7XG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJyZWxhdGl2ZSB3LVsxMTdweF0gaC1mdWxsIGJnLVsjZmZmZmZmXSByb3VuZGVkLVs0cHhdIGxpYnMtdWktYm9yZGVyLWdlbmVyYWwge3sgb3B0aW9uLmNsYXNzSW5jbHVkZSB8fCAnbXgtWzhweF0nIH19XCI+XG4gICAgICA8bGlic191aS1jb21wb25lbnRzLWRyb3Bkb3duIFtpc05nQ29udGVudF09XCJ0cnVlXCJcbiAgICAgICAgW2xhYmVsUG9wb3ZlckZ1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgW2xpc3RDb25maWddPVwibGlzdENvbmZpZ0ZvbnQoKVwiXG4gICAgICAgIFtsaXN0SGFzQnV0dG9uVW5TZWxlY3RPcHRpb25dPVwiZmFsc2VcIlxuICAgICAgICBbbGlzdEhpZGRlbklucHV0U2VhcmNoXT1cInRydWVcIlxuICAgICAgICBbbGlzdE1heEl0ZW1TaG93XT1cIjhcIlxuICAgICAgICBbekluZGV4XT1cIjEyNTBcIlxuICAgICAgICAob3V0U2VsZWN0S2V5KT1cImhhbmRsZVNlbGVjdEZvbnQoJGV2ZW50KVwiPlxuICAgICAgICBAaWYgKGZvbnRTZWxlY3RlZCgpOyBhcyBmb250U2VsZWN0ZWQpIHtcbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGN1cnNvci1wb2ludGVyIHB5LVs4cHhdIGxpYnMtdWktZm9udC1oNXIgcGwtWzE2cHhdIHByLVs0MHB4XSB7eyBvcHRpb24uY2xhc3NJbmNsdWRlIHx8ICdteC1bOHB4XScgfX1cIj5cbiAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtcG9wb3ZlciBbdHlwZV09XCIndGV4dCdcIlxuICAgICAgICAgICAgICBbaWdub3JlU3RvcFByb3BhZ2F0aW9uRXZlbnRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIFtjb25maWddPVwie3pJbmRleDoxMjUwfVwiPlxuICAgICAgICAgICAgICB7eyBsYWJlbEZvbnRTZWxlY3RlZENvbXB1dGVkKCkgfX1cbiAgICAgICAgICAgIDwvbGlic191aS1jb21wb25lbnRzLXBvcG92ZXI+XG4gICAgICAgICAgICA8aSBjbGFzcz1cImxpYnMtdWktaWNvbi1tb3ZlLXJpZ2h0IHJvdGF0ZS05MCBhYnNvbHV0ZSByaWdodC1bMTJweF0gdGV4dC1bIzZhNzM4M10gdGV4dC1bMTZweF1cIj48L2k+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgIDwvbGlic191aS1jb21wb25lbnRzLWRyb3Bkb3duPlxuICAgIDwvZGl2PlxuICB9XG4gIEBpZiAob3B0aW9uLnR5cGUgPT09ICdmb250U2l6ZScpIHtcbiAgICA8ZGl2IGNsYXNzPVwicWwtcGlja2VyIHt7IG9wdGlvbi5jbGFzc0luY2x1ZGUgfHwgJ214LVs4cHhdJyB9fVwiPlxuICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1pbnB1dHMtdmFsaWQgW2RhdGFUeXBlXT1cIidpbnQnXCJcbiAgICAgICAgWyhpdGVtKV09XCJzaXplXCJcbiAgICAgICAgW2ZpZWxkTmFtZUJpbmRdPVwiJ3ZhbHVlJ1wiXG4gICAgICAgIFt2YWx1ZVVwRG93bk51bWJlcl09XCIxXCJcbiAgICAgICAgW21heFZhbHVlTnVtYmVyXT1cIjcyXCJcbiAgICAgICAgW21pblZhbHVlTnVtYmVyXT1cIjhcIlxuICAgICAgICBbcmVhZG9ubHldPVwicmVhZG9ubHkoKVwiXG4gICAgICAgIFtjbGFzc0NvbnRhaW5lcklucHV0XT1cIid3LVs3MnB4XSBoLVszMnB4XSdcIlxuICAgICAgICAob3V0VmFsdWVDaGFuZ2UpPVwiaGFuZGxlclZhbHVlQ2hhbmdlKCRldmVudClcIiAvPlxuICAgIDwvZGl2PlxuICB9XG4gIEBpZiAob3B0aW9uLnR5cGUgPT09ICdjb2xvcicpIHtcbiAgICA8ZGl2IGNsYXNzPVwicWwtY29sb3IgcWwtcGlja2VyIHFsLWNvbG9yLXBpY2tlciAhZmxleCBpdGVtcy1jZW50ZXIge3sgb3B0aW9uLmNsYXNzSW5jbHVkZSB8fCAnbXgtWzhweF0nIH19XCI+XG4gICAgICA8bGlic191aS1jb21wb25lbnRzLXBvcG92ZXIgW2NvbmZpZ109XCJ7Y29udGVudDonaTE4bl90ZXh0X2NvbG9yJywgekluZGV4OjEyNTB9XCI+XG4gICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1zZWxlY3RfY29sb3IgW3pJbmRleF09XCJ6SW5kZXgoKVwiXG4gICAgICAgICAgW2RpcmVjdGlvbl09XCIndG9wJ1wiXG4gICAgICAgICAgW2V4dGVybmFsQ29udGVudF09XCJ0cnVlXCJcbiAgICAgICAgICBbYXBwbHlOb3ddPVwidHJ1ZVwiXG4gICAgICAgICAgKG91dENvbG9yQ2hhbmdlKT1cInNldFN0eWxlKCdjb2xvcicsICRldmVudClcIj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cImxpYnMtdWktaWNvbi1lZGl0b3ItY29sb3ItdGV4dCBsaWJzLXVpLWJ1dHRvbnMtc2VsZWN0LWNvbG9yIHRleHQtWyM2YTczODNdIHRleHQtWzE2cHhdIGhvdmVyOnRleHQtW3ZhcigtLWxpYnMtdWktY29sb3ItbGlnaHQtMSldXCI+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtc2VsZWN0X2NvbG9yPlxuICAgICAgPC9saWJzX3VpLWNvbXBvbmVudHMtcG9wb3Zlcj5cbiAgICA8L2Rpdj5cbiAgfVxuICBAaWYgKG9wdGlvbi50eXBlID09PSAnYmFja2dyb3VuZCcpIHtcbiAgICA8ZGl2IGNsYXNzPVwicWwtYmFja2dyb3VuZCBxbC1waWNrZXIgcWwtY29sb3ItcGlja2VyICFmbGV4IGl0ZW1zLWNlbnRlciB7eyBvcHRpb24uY2xhc3NJbmNsdWRlIHx8ICdteC1bOHB4XScgfX1cIj5cbiAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtcG9wb3ZlciBbY29uZmlnXT1cIntjb250ZW50OidpMThuX2JhY2tncm91bmRfY29sb3InLCB6SW5kZXg6MTI1MH1cIj5cbiAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLXNlbGVjdF9jb2xvciBbekluZGV4XT1cInpJbmRleCgpXCJcbiAgICAgICAgICBbZGlyZWN0aW9uXT1cIid0b3AnXCJcbiAgICAgICAgICBbZXh0ZXJuYWxDb250ZW50XT1cInRydWVcIlxuICAgICAgICAgIFthcHBseU5vd109XCJ0cnVlXCJcbiAgICAgICAgICAob3V0Q29sb3JDaGFuZ2UpPVwic2V0U3R5bGUoJ2JhY2tncm91bmQnLCAkZXZlbnQpXCI+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJsaWJzLXVpLWljb24tZWRpdG9yLWNvbG9yLWJhY2tncm91bmQgbGlicy11aS1idXR0b25zLXNlbGVjdC1jb2xvciB0ZXh0LVsjNmE3MzgzXSB0ZXh0LVsxNnB4XSBob3Zlcjp0ZXh0LVt2YXIoLS1saWJzLXVpLWNvbG9yLWxpZ2h0LTEpXVwiPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2xpYnNfdWktY29tcG9uZW50cy1idXR0b25zLXNlbGVjdF9jb2xvcj5cbiAgICAgIDwvbGlic191aS1jb21wb25lbnRzLXBvcG92ZXI+XG4gICAgPC9kaXY+XG4gIH1cbiAgQGlmIChvcHRpb24udHlwZSA9PT0gJ2JvbGQnKSB7XG4gICAgPGRpdiBbY2xhc3NdPVwib3B0aW9uLmNsYXNzSW5jbHVkZSB8fCAnbXgtWzhweF0nXCI+XG4gICAgICA8YnV0dG9uIExpYnNVaUNvbXBvbmVudHNQb3BvdmVyRGlyZWN0aXZlXG4gICAgICAgIFtjb25maWddPVwie2NvbnRlbnQ6J2kxOG5fZm9udF93ZWlnaHRfYm9sZCcsIHpJbmRleDoxMjUwfVwiXG4gICAgICAgIGNsYXNzPVwicWwtYm9sZFwiPjwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICB9XG4gIEBpZiAob3B0aW9uLnR5cGUgPT09ICdpdGFsaWMnKSB7XG4gICAgPGRpdiBbY2xhc3NdPVwib3B0aW9uLmNsYXNzSW5jbHVkZSB8fCAnbXgtWzhweF0nXCI+XG4gICAgICA8YnV0dG9uIExpYnNVaUNvbXBvbmVudHNQb3BvdmVyRGlyZWN0aXZlXG4gICAgICAgIFtjb25maWddPVwie2NvbnRlbnQ6J2kxOG5fZm9udF9zdHlsZV9pdGFsaWMnLCB6SW5kZXg6MTI1MH1cIlxuICAgICAgICBjbGFzcz1cInFsLWl0YWxpY1wiPjwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICB9XG4gIEBpZiAob3B0aW9uLnR5cGUgPT09ICd1bmRlcmxpbmUnKSB7XG4gICAgPGRpdiBbY2xhc3NdPVwib3B0aW9uLmNsYXNzSW5jbHVkZSB8fCAnbXgtWzhweF0nXCI+XG4gICAgICA8YnV0dG9uIExpYnNVaUNvbXBvbmVudHNQb3BvdmVyRGlyZWN0aXZlXG4gICAgICAgIFtjb25maWddPVwie2NvbnRlbnQ6J2kxOG5fdGV4dF9kZWNvcmF0aW9uX3VuZGVybGluZScsIHpJbmRleDoxMjUwfVwiXG4gICAgICAgIGNsYXNzPVwicWwtdW5kZXJsaW5lXCI+PC9idXR0b24+XG4gICAgPC9kaXY+XG4gIH1cbiAgQGlmIChvcHRpb24udHlwZSA9PT0gJ3N0cmlrZVRocm91Z2gnKSB7XG4gICAgPGRpdiBbY2xhc3NdPVwib3B0aW9uLmNsYXNzSW5jbHVkZSB8fCAnbXgtWzhweF0nXCI+XG4gICAgICA8YnV0dG9uIExpYnNVaUNvbXBvbmVudHNQb3BvdmVyRGlyZWN0aXZlXG4gICAgICAgIFtjb25maWddPVwie2NvbnRlbnQ6J2kxOG5fdGV4dF9saW5lX3Rocm91Z2gnLCB6SW5kZXg6MTI1MH1cIlxuICAgICAgICBjbGFzcz1cInFsLXN0cmlrZVwiPjwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICB9XG4gIEBpZiAob3B0aW9uLnR5cGUgPT09ICdhZGp1c3QnKSB7XG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJyZWxhdGl2ZSAhZmxleCBpdGVtcy1jZW50ZXIgcWwtYWxpZ24gcWwtcGlja2VyIHFsLWljb24tcGlja2VyICF3LW1heCB7eyBvcHRpb24uY2xhc3NJbmNsdWRlIHx8ICdteC1bOHB4XScgfX1cIj5cbiAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtcG9wb3ZlciBbY29uZmlnXT1cIntjb250ZW50OidpMThuX2FkanVzdCcsIHpJbmRleDoxMjUwfVwiPlxuICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWRyb3Bkb3duIFtpc05nQ29udGVudF09XCJ0cnVlXCJcbiAgICAgICAgICBbaWdub3JlU3RvcFByb3BhZ2F0aW9uRXZlbnRdPVwidHJ1ZVwiXG4gICAgICAgICAgW2xhYmVsUG9wb3ZlckZ1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgICBbbGlzdENvbmZpZ109XCJsaXN0Q29uZmlnQWxpZ24oKVwiXG4gICAgICAgICAgW2xpc3RIaWRkZW5JbnB1dFNlYXJjaF09XCJ0cnVlXCJcbiAgICAgICAgICBbcG9wb3ZlckN1c3RvbUNvbmZpZ109XCJ7aWdub3JlQXJyb3c6IHRydWUsIGNsYXNzSW5jbHVkZTogJyF3LVszMnB4XSBvdmVyZmxvdy1oaWRkZW4gIXB5LVs0cHhdJywgcG9zaXRpb246IHttb2RlOiAnc3RhcnQnLCBkaXN0YW5jZTogMH0sIHBhZGRpbmdMZWZ0SXRlbTogZmFsc2V9XCJcbiAgICAgICAgICBbbGlzdEhhc0J1dHRvblVuU2VsZWN0T3B0aW9uXT1cImZhbHNlXCJcbiAgICAgICAgICBbbGlzdE1heEl0ZW1TaG93XT1cIjhcIlxuICAgICAgICAgIFt6SW5kZXhdPVwiMTI1MFwiXG4gICAgICAgICAgKG91dFNlbGVjdEtleSk9XCJoYW5kbGVTZWxlY3RBbGlnbigkZXZlbnQpXCI+XG4gICAgICAgICAgQGlmIChhbGlnblNlbGVjdGVkKCk7IGFzIGFsaWduU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBjdXJzb3ItcG9pbnRlclwiPlxuICAgICAgICAgICAgICA8aSBbY2xhc3NdPVwiaWNvbkFsaWduU2VsZWN0ZWRDb21wdXRlZCgpXCI+PC9pPlxuICAgICAgICAgICAgICA8aSBjbGFzcz1cImxpYnMtdWktaWNvbi1tb3ZlLXJpZ2h0IHJvdGF0ZS05MCB0ZXh0LVsjNmE3MzgzXSB0ZXh0LVsxNnB4XSBtbC1bNHB4XVwiPjwvaT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cbiAgICAgICAgPC9saWJzX3VpLWNvbXBvbmVudHMtZHJvcGRvd24+XG4gICAgICA8L2xpYnNfdWktY29tcG9uZW50cy1wb3BvdmVyPlxuICAgIDwvZGl2PlxuICB9XG4gIEBpZiAob3B0aW9uLnR5cGUgPT09ICdpbmRlbnRJbmNyZWFzZScpIHtcbiAgICA8ZGl2IFtjbGFzc109XCJvcHRpb24uY2xhc3NJbmNsdWRlIHx8ICdteC1bOHB4XSdcIj5cbiAgICAgIDxidXR0b24gTGlic1VpQ29tcG9uZW50c1BvcG92ZXJEaXJlY3RpdmVcbiAgICAgICAgW2NvbmZpZ109XCJ7Y29udGVudDonaTE4bl9pbmRlbnRfaW5jcmVhc2UnLCB6SW5kZXg6MTI1MH1cIlxuICAgICAgICBjbGFzcz1cInFsLWluZGVudFwiXG4gICAgICAgIHZhbHVlPVwiKzFcIj48L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgfVxuICBAaWYgKG9wdGlvbi50eXBlID09PSAnaW5kZW50RGVjcmVhc2UnKSB7XG4gICAgPGRpdiBbY2xhc3NdPVwib3B0aW9uLmNsYXNzSW5jbHVkZSB8fCAnbXgtWzhweF0nXCI+XG4gICAgICA8YnV0dG9uIExpYnNVaUNvbXBvbmVudHNQb3BvdmVyRGlyZWN0aXZlXG4gICAgICAgIFtjb25maWddPVwie2NvbnRlbnQ6J2kxOG5faW5kZW50X2RlY3JlYXNlJywgekluZGV4OjEyNTB9XCJcbiAgICAgICAgY2xhc3M9XCJxbC1pbmRlbnRcIlxuICAgICAgICB2YWx1ZT1cIi0xXCI+PC9idXR0b24+XG4gICAgPC9kaXY+XG4gIH1cbiAgQGlmIChvcHRpb24udHlwZSA9PT0gJ2xpc3RCdWxsZXRlZCcpIHtcbiAgICA8ZGl2IFtjbGFzc109XCJvcHRpb24uY2xhc3NJbmNsdWRlIHx8ICdteC1bOHB4XSdcIj5cbiAgICAgIDxidXR0b24gTGlic1VpQ29tcG9uZW50c1BvcG92ZXJEaXJlY3RpdmVcbiAgICAgICAgW2NvbmZpZ109XCJ7Y29udGVudDonaTE4bl9saXN0X2J1bGxldGVkJywgekluZGV4OjEyNTB9XCJcbiAgICAgICAgY2xhc3M9XCJxbC1saXN0IHFsLWJ1bGxldFwiXG4gICAgICAgIHZhbHVlPVwiYnVsbGV0XCI+PC9idXR0b24+XG4gICAgPC9kaXY+XG4gIH1cbiAgQGlmIChvcHRpb24udHlwZSA9PT0gJ2xpc3ROdW1iZXJlZCcpIHtcbiAgICA8ZGl2IFtjbGFzc109XCJvcHRpb24uY2xhc3NJbmNsdWRlIHx8ICdteC1bOHB4XSdcIj5cbiAgICAgIDxidXR0b24gTGlic1VpQ29tcG9uZW50c1BvcG92ZXJEaXJlY3RpdmVcbiAgICAgICAgW2NvbmZpZ109XCJ7Y29udGVudDonaTE4bl9saXN0X251bWJlcmVkJywgekluZGV4OjEyNTB9XCJcbiAgICAgICAgY2xhc3M9XCJxbC1saXN0IHFsLW9yZGVyZWRcIlxuICAgICAgICB2YWx1ZT1cIm9yZGVyZWRcIj48L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgfVxuICBAaWYgKG9wdGlvbi50eXBlID09PSAncGVyc29uYWxpemUnICYmIHRlbXBsYXRlVG9vbEJhclBlcnNvbmFsaXplKCk7IGFzIHRlbXBsYXRlVG9vbEJhclBlcnNvbmFsaXplKSB7XG4gICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIHt7IG9wdGlvbi5jbGFzc0luY2x1ZGUgfHwgJ214LVs4cHhdJyB9fVwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRlbXBsYXRlVG9vbEJhclBlcnNvbmFsaXplXCI+PC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG4gIH1cbiAgQGlmIChvcHRpb24udHlwZSA9PT0gJ2Jsb2NrcXVvdGUnKSB7XG4gICAgPGRpdiBbY2xhc3NdPVwib3B0aW9uLmNsYXNzSW5jbHVkZSB8fCAnbXgtWzhweF0nXCI+XG4gICAgICA8YnV0dG9uIExpYnNVaUNvbXBvbmVudHNQb3BvdmVyRGlyZWN0aXZlXG4gICAgICAgIFtjb25maWddPVwie2NvbnRlbnQ6J2kxOG5fcXVvdGUnLCB6SW5kZXg6MTI1MH1cIlxuICAgICAgICBjbGFzcz1cInFsLWJsb2NrcXVvdGVcIj48L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgfVxuICBAaWYgKG9wdGlvbi50eXBlID09PSAnbGluaycpIHtcbiAgICA8ZGl2IFtjbGFzc109XCJvcHRpb24uY2xhc3NJbmNsdWRlIHx8ICdteC1bOHB4XSdcIj5cbiAgICAgIDxidXR0b24gTGlic1VpQ29tcG9uZW50c1BvcG92ZXJEaXJlY3RpdmVcbiAgICAgICAgW2NvbmZpZ109XCJ7Y29udGVudDonaTE4bl9pbnNlcnRfbGluaycsIHpJbmRleDoxMjUwfVwiXG4gICAgICAgIGNsYXNzPVwicWwtbGlua1wiPjwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICB9XG4gIEBpZiAob3B0aW9uLnR5cGUgPT09ICd1bkxpbmsnKSB7XG4gICAgPGRpdiBbY2xhc3NdPVwib3B0aW9uLmNsYXNzSW5jbHVkZSB8fCAnbXgtWzhweF0nXCI+XG4gICAgICA8YnV0dG9uIExpYnNVaUNvbXBvbmVudHNQb3BvdmVyRGlyZWN0aXZlXG4gICAgICAgIFtjb25maWddPVwie2NvbnRlbnQ6J2kxOG5fdW5saW5rJywgekluZGV4OjEyNTB9XCJcbiAgICAgICAgY2xhc3M9XCJxbC11bkxpbmtcIj48L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgfVxuICBAaWYgKG9wdGlvbi50eXBlID09PSAnaW1hZ2UnKSB7XG4gICAgPGRpdiBbY2xhc3NdPVwib3B0aW9uLmNsYXNzSW5jbHVkZSB8fCAnbXgtWzhweF0nXCI+XG4gICAgICA8YnV0dG9uIExpYnNVaUNvbXBvbmVudHNQb3BvdmVyRGlyZWN0aXZlXG4gICAgICAgIFtjb25maWddPVwie2NvbnRlbnQ6J2kxOG5faW1hZ2UnLCB6SW5kZXg6MTI1MH1cIlxuICAgICAgICBjbGFzcz1cInFsLWltYWdlXCI+PC9idXR0b24+XG4gICAgPC9kaXY+XG4gIH1cbiAgQGlmIChvcHRpb24udHlwZSA9PT0gJ2Vtb2ppJykge1xuICAgIDxkaXYgW2NsYXNzXT1cIm9wdGlvbi5jbGFzc0luY2x1ZGUgfHwgJ214LVs4cHhdJ1wiPlxuICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1lbW9qaSBbekluZGV4XT1cIjEyNTBcIlxuICAgICAgICBbaXNOZ0NvbnRlbnRdPVwidHJ1ZVwiXG4gICAgICAgIChvdXRFdmVudEVtb2ppKT1cImhhbmRsZXJBZGRFbW9qaSgkZXZlbnQpXCI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJxbC1lbW9qaVwiPjwvYnV0dG9uPlxuICAgICAgPC9saWJzX3VpLWNvbXBvbmVudHMtZW1vamk+XG4gICAgPC9kaXY+XG4gIH1cbiAgQGlmIChvcHRpb24udHlwZSA9PT0gJ2xpbmUnKSB7XG4gICAgPGRpdiBjbGFzcz1cInctWzFweF0gaC1bMTZweF0gbGlicy11aS1ib3JkZXItcmlnaHQtZ2VuZXJhbFwiPjwvZGl2PlxuICB9XG48L25nLXRlbXBsYXRlPlxuXG48bGlic191aS1jb21wb25lbnRzLXBvcG92ZXIgW21vZGVdPVwiJ2NsaWNrJ1wiXG4gIFtpZ25vcmVIaWRkZW5Qb3BvdmVyQ29udGVudFdoZW5Nb3VzZUxlYXZlXT1cInRydWVcIlxuICBbY29uZmlnXT1cInt0ZW1wbGF0ZTogdmlld0xpbmssIHdoaXRlVGhlbWU6IHRydWUsIGlnbm9yZUFycm93OiB0cnVlfVwiXG4gIChvdXRFdmVudCk9XCJoYW5kbGVyUG9wb3ZlckV2ZW50KCRldmVudClcIlxuICAob3V0RnVuY3Rpb25zQ29udHJvbCk9XCJoYW5kbGVyUG9wb3ZlckZ1bmN0aW9uQ29udHJvbCgkZXZlbnQpXCIgLz5cblxuPG5nLXRlbXBsYXRlICN2aWV3TGluaz5cbiAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1iZXR3ZWVuIGl0ZW1zLWNlbnRlciBweC1bMTZweF0gcHktWzhweF0gcm91bmRlZC1bOHB4XVwiPlxuICAgIDxkaXYgY2xhc3M9XCJ3LWZ1bGwgbWluLXctMCBsaWJzLXVpLWZvbnQtaDVyXCJcbiAgICAgIFt0eXBlXT1cIid0ZXh0J1wiXG4gICAgICBMaWJzVWlDb21wb25lbnRzUG9wb3ZlckRpcmVjdGl2ZT57eyBsaW5rKCkudXJsIH19PC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIG1sLVsxNnB4XVwiPlxuICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLWJ1dHRvbiBbdHlwZV09XCInYnV0dG9uLWxpbmstcHJpbWFyeSdcIlxuICAgICAgICBbaWNvbk9ubHlUeXBlXT1cInRydWVcIlxuICAgICAgICBbY2xhc3NJY29uTGVmdF09XCInbGlicy11aS1pY29uLWVkaXQtbGluZSdcIlxuICAgICAgICBbY2xhc3NJbmNsdWRlXT1cIichcC0wJ1wiXG4gICAgICAgIChvdXRDbGljayk9XCJoYW5kbGVyRWRpdCgkZXZlbnQpXCIgLz5cbiAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1idXR0b24gW3R5cGVdPVwiJ2J1dHRvbi1saW5rLWN1c3RvbSdcIlxuICAgICAgICBbYnV0dG9uQ3VzdG9tXT1cIntcbiAgICAgICAgICBjb25maWdTdGVwQ29sb3I6IHtcbiAgICAgICAgICAgIHRleHQ6ICcjMDcxNjMxJyxcbiAgICAgICAgICAgIHRleHRfaG92ZXI6ICcjZWUyZDQxJyxcbiAgICAgICAgICAgIHRleHRfYWN0aXZlOiAnI2VlMmQ0MScsXG4gICAgICAgICAgICB0ZXh0X2Rpc2FibGU6ICcwNzE2MzEnXG4gICAgICAgICAgfSxcbiAgICAgICAgICByb290Q29sb3I6ICcjMDcxNjMxJ1xuICAgICAgICB9XCJcbiAgICAgICAgW2NsYXNzSW5jbHVkZV09XCInIXAtMCBtbC1bMTJweF0nXCJcbiAgICAgICAgW2ljb25Pbmx5VHlwZV09XCJ0cnVlXCJcbiAgICAgICAgW2NsYXNzSWNvbkxlZnRdPVwiJ2xpYnMtdWktaWNvbi1saW5rLWJyb2tlbidcIlxuICAgICAgICAob3V0Q2xpY2spPVwiaGFuZGxlclVubGluaygkZXZlbnQpXCIgLz5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19
|