@libs-ui/components-list 0.1.1-1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -0
- package/defines/list.define.d.ts +10 -0
- package/esm2022/defines/list.define.mjs +70 -0
- package/esm2022/highlight-key-search/highlight-key-search.directive.mjs +82 -0
- package/esm2022/index.mjs +4 -0
- package/esm2022/interfaces/config-item.interface.mjs +2 -0
- package/esm2022/interfaces/data-emit.interface.mjs +3 -0
- package/esm2022/interfaces/function-control-event.interface.mjs +2 -0
- package/esm2022/interfaces/index.mjs +6 -0
- package/esm2022/interfaces/tab.interface.mjs +2 -0
- package/esm2022/interfaces/templates-type.type.mjs +2 -0
- package/esm2022/libs-ui-components-list.mjs +5 -0
- package/esm2022/list.component.mjs +420 -0
- package/esm2022/pipes/check-selected-by-key.pipe.mjs +21 -0
- package/esm2022/templates/checkbox/checkbox.component.mjs +304 -0
- package/esm2022/templates/group/group.component.mjs +788 -0
- package/esm2022/templates/group/item/item.component.mjs +82 -0
- package/esm2022/templates/group/pipes/calculator-left-line-vertical-item.pipe.mjs +38 -0
- package/esm2022/templates/group/pipes/calculator-margin-left-item.pipe.mjs +40 -0
- package/esm2022/templates/group/pipes/calculator-padding-left-item.pipe.mjs +26 -0
- package/esm2022/templates/radio/radio.component.mjs +193 -0
- package/esm2022/templates/rows/rows.component.mjs +72 -0
- package/esm2022/templates/tag/tag.component.mjs +139 -0
- package/esm2022/templates/templates.component.abstract.mjs +350 -0
- package/esm2022/templates/text/text.component.mjs +247 -0
- package/fesm2022/libs-ui-components-list.mjs +2757 -0
- package/fesm2022/libs-ui-components-list.mjs.map +1 -0
- package/highlight-key-search/highlight-key-search.directive.d.ts +13 -0
- package/index.d.ts +3 -0
- package/interfaces/config-item.interface.d.ts +260 -0
- package/interfaces/data-emit.interface.d.ts +16 -0
- package/interfaces/function-control-event.interface.d.ts +15 -0
- package/interfaces/index.d.ts +5 -0
- package/interfaces/tab.interface.d.ts +4 -0
- package/interfaces/templates-type.type.d.ts +1 -0
- package/list.component.d.ts +93 -0
- package/package.json +50 -0
- package/pipes/check-selected-by-key.pipe.d.ts +7 -0
- package/templates/checkbox/checkbox.component.d.ts +24 -0
- package/templates/group/group.component.d.ts +48 -0
- package/templates/group/item/item.component.d.ts +27 -0
- package/templates/group/pipes/calculator-left-line-vertical-item.pipe.d.ts +7 -0
- package/templates/group/pipes/calculator-margin-left-item.pipe.d.ts +7 -0
- package/templates/group/pipes/calculator-padding-left-item.pipe.d.ts +7 -0
- package/templates/radio/radio.component.d.ts +20 -0
- package/templates/rows/rows.component.d.ts +23 -0
- package/templates/tag/tag.component.d.ts +16 -0
- package/templates/templates.component.abstract.d.ts +94 -0
- package/templates/text/text.component.d.ts +24 -0
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
|
+
import { NgClass, NgTemplateOutlet } from '@angular/common';
|
|
3
|
+
import { ChangeDetectionStrategy, Component, signal } from '@angular/core';
|
|
4
|
+
import { VirtualScrollerModule } from '@iharbeck/ngx-virtual-scroller';
|
|
5
|
+
import { LibsUiComponentsScrollOverlayDirective } from '@libs-ui/components-scroll-overlay';
|
|
6
|
+
import { LibsUiComponentsSpinnerComponent } from '@libs-ui/components-spinner';
|
|
7
|
+
import { cloneDeep, deleteUnicode } from '@libs-ui/utils';
|
|
8
|
+
import { TranslateModule } from '@ngx-translate/core';
|
|
9
|
+
import { LibsUiCheckSelectedByKeyPipe } from '../../pipes/check-selected-by-key.pipe';
|
|
10
|
+
import { LibsUiComponentsListTemplatesComponentAbstract } from '../templates.component.abstract';
|
|
11
|
+
import * as i0 from "@angular/core";
|
|
12
|
+
import * as i1 from "@ngx-translate/core";
|
|
13
|
+
export class LibsUiComponentsListTagComponent extends LibsUiComponentsListTemplatesComponentAbstract {
|
|
14
|
+
// #region PROPERTY
|
|
15
|
+
configTemplateTag = signal(undefined);
|
|
16
|
+
ngOnInit() {
|
|
17
|
+
if (!this.config()?.configTemplateTag?.()) {
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
super.ngOnInit();
|
|
21
|
+
this.configTemplateTag.set(this.config()?.configTemplateTag?.());
|
|
22
|
+
this.fieldKey.set(this.configTemplateTag()?.fieldKey ?? this.fieldKeyDefault());
|
|
23
|
+
this.callApiByService();
|
|
24
|
+
}
|
|
25
|
+
/* FUNCTIONS */
|
|
26
|
+
handlerSelectItem(e, item) {
|
|
27
|
+
if (e instanceof Event) {
|
|
28
|
+
e.stopPropagation();
|
|
29
|
+
e.preventDefault();
|
|
30
|
+
}
|
|
31
|
+
if (!item || (this.keysDisableItem() && this.keysDisableItem()?.some((key) => key === item[this.fieldKey()]))) {
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
const key = item[this.fieldKey()];
|
|
35
|
+
const indexOfKey = this.multiKeySelected()?.indexOf(key) ?? -1;
|
|
36
|
+
if (indexOfKey < 0) {
|
|
37
|
+
this.multiKeySelected.update((items) => [...(items || []), key]);
|
|
38
|
+
this.emitMoSelectMultiKey(this.multiKeySelected() || []);
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
this.multiKeySelected.update((items) => {
|
|
42
|
+
items?.splice(indexOfKey, 1);
|
|
43
|
+
return items;
|
|
44
|
+
});
|
|
45
|
+
this.outUnSelectMultiKey.emit([key]);
|
|
46
|
+
this.emitMoSelectMultiKey(this.multiKeySelected() || []);
|
|
47
|
+
}
|
|
48
|
+
async emitMoSelectMultiKey(multiKeySelected, isClickManual = true) {
|
|
49
|
+
const mapKeys = new Array();
|
|
50
|
+
if (!multiKeySelected || !multiKeySelected.length) {
|
|
51
|
+
return this.outSelectMultiKey.emit({ keys: [], mapKeys, isClickManual });
|
|
52
|
+
}
|
|
53
|
+
multiKeySelected.forEach((key) => {
|
|
54
|
+
const item = this.store().find((item) => item()[this.fieldKey()] === key);
|
|
55
|
+
mapKeys.push({ key, item, isClickManual });
|
|
56
|
+
});
|
|
57
|
+
this.outSelectMultiKey.emit({ keys: this.multiKeySelected() || [], mapKeys, isClickManual });
|
|
58
|
+
}
|
|
59
|
+
handlerScrollBottom() {
|
|
60
|
+
if (this.loadedLastItem()) {
|
|
61
|
+
this.loading.set(false);
|
|
62
|
+
this.outLoading.emit(this.loading());
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
if (this.loading() || this.loadedLastItem()) {
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
this.loading.set(true);
|
|
69
|
+
this.outLoading.emit(this.loading());
|
|
70
|
+
this.callApiByService(false);
|
|
71
|
+
}
|
|
72
|
+
processSearch() {
|
|
73
|
+
this.callApiByService(true);
|
|
74
|
+
}
|
|
75
|
+
processData(replace) {
|
|
76
|
+
const itemByKeySearch = [];
|
|
77
|
+
const keysHidden = this.keysHiddenItem() || [];
|
|
78
|
+
if (replace) {
|
|
79
|
+
this.items.set([]);
|
|
80
|
+
}
|
|
81
|
+
this.store().forEach((item) => {
|
|
82
|
+
const dataStore = cloneDeep(item);
|
|
83
|
+
dataStore.update((currentStore) => {
|
|
84
|
+
return { ...currentStore, ref: item() };
|
|
85
|
+
});
|
|
86
|
+
const key = keysHidden.find((key) => dataStore()[this.fieldKey()] === key);
|
|
87
|
+
if (key === undefined) {
|
|
88
|
+
const text = this.buildValueByConfig(dataStore, this.configTemplateTag());
|
|
89
|
+
if (text && deleteUnicode(text.toLocaleLowerCase()).includes(deleteUnicode(this.keySearch().toLocaleLowerCase())) && !this.items().find((dataItem) => dataItem()[this.fieldKey()] === dataStore()[this.fieldKey()])) {
|
|
90
|
+
itemByKeySearch.push(dataStore);
|
|
91
|
+
dataStore.update((currentStore) => {
|
|
92
|
+
return {
|
|
93
|
+
...currentStore,
|
|
94
|
+
classItem: item().classItem || this.configTemplateTag()?.getClassItem?.(dataStore()),
|
|
95
|
+
};
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
const indexItemRemove = this.items().findIndex((item) => item()[this.fieldKey()] === key);
|
|
101
|
+
if (indexItemRemove > -1) {
|
|
102
|
+
this.items.update((items) => {
|
|
103
|
+
items.splice(indexItemRemove, 1);
|
|
104
|
+
return items;
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
const checkLoadItem = (preStateHasScroll, currentHasScroll) => {
|
|
109
|
+
if (this.keysHiddenItem()?.length && preStateHasScroll && !currentHasScroll && this.isSearchOnline()) {
|
|
110
|
+
this.callApiByService(false);
|
|
111
|
+
}
|
|
112
|
+
};
|
|
113
|
+
if (replace) {
|
|
114
|
+
this.items.set(itemByKeySearch);
|
|
115
|
+
this.config()?.sort?.(this.items());
|
|
116
|
+
this.setHeightViewPort();
|
|
117
|
+
this.checkViewPortScroll(checkLoadItem);
|
|
118
|
+
this.loading.set(false);
|
|
119
|
+
this.outLoading.emit(this.loading());
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
this.items.update((items) => [...(items || []), ...itemByKeySearch]);
|
|
123
|
+
this.config()?.sort?.(this.items());
|
|
124
|
+
this.setHeightViewPort();
|
|
125
|
+
this.checkViewPortScroll(checkLoadItem);
|
|
126
|
+
this.loading.set(false);
|
|
127
|
+
this.outLoading.emit(this.loading());
|
|
128
|
+
}
|
|
129
|
+
getLengthItem() {
|
|
130
|
+
return this.items().length;
|
|
131
|
+
}
|
|
132
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiComponentsListTagComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
|
|
133
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: LibsUiComponentsListTagComponent, isStandalone: true, selector: "libs_ui-components-list-templates_tag", usesInheritance: true, ngImport: i0, template: "@if (configTemplateTag(); as configTemplateTag) {\n <div\n class=\"w-full h-full relative\"\n LibsUiComponentsScrollOverlayDirective\n (outScrollBottom)=\"handlerScrollBottom()\">\n <div\n class=\"relative max-h-[150px] h-full {{ configTemplateTag.classIncludeContainer }}\"\n [ngClass]=\"{ 'flex flex-wrap': !configTemplateTag.ignoreItemFlexWrap }\"\n [class.min-h-[45px]]=\"!loading() && (!items() || !items().length)\"\n [class.min-h-[94px]]=\"loading() && items()\">\n @for (item of items(); track item()[fieldKey()]) {\n <div\n [class.libs-ui-disable]=\"loading() || disable()\"\n [class.pointer-events-none]=\"loading() || disable()\"\n [class]=\"item().classContainerItem\">\n @if (item().bullet; as bullet) {\n <div\n [class]=\"item().classItem || 'rounded-[10px] px-[8px] py-[1px] mb-[8px] mr-[8px]'\"\n [class.w-max]=\"configTemplateTag?.ignoreItemFlexWrap\"\n [style.background-color]=\"bullet().backgroundColor\"\n [style.color]=\"bullet().color\"\n (click)=\"handlerSelectItem($event, item())\">\n <span [innerHTML]=\"item().fieldLabel\"></span>\n </div>\n } @else {\n @let constHtmlIsSelected = item()[fieldKey()] | LibsUiCheckSelectedByKeyPipe: multiKeySelected() : multiKeySelected().length;\n <div\n (click)=\"handlerSelectItem($event, item())\"\n [class]=\"item().classItem || 'rounded-[20px] mb-[8px] mr-[8px] py-[4px] px-[8px] flex items-center cursor-pointer'\"\n [class.bg-[var(--libs-ui-color-light-2)]]=\"constHtmlIsSelected\"\n [class.text-[var(--libs-ui-color-default)]]=\"constHtmlIsSelected\"\n [class.bg-white]=\"!constHtmlIsSelected\"\n [class.text-[#6a7383]]=\"!constHtmlIsSelected\"\n [class.libs-ui-border-general]=\"!constHtmlIsSelected\">\n @if (constHtmlIsSelected) {\n <div class=\"mr-[8px] text-[12px] libs-ui-icon-check before:text-[var(--libs-ui-color-default)]\"></div>\n }\n <span\n class=\"libs-ui-font-h6r break-word\"\n [innerHTML]=\"item().fieldLabel\"></span>\n </div>\n }\n </div>\n }\n @if (!items() || !items().length) {\n <div [class]=\"'libs-ui-font-h5r text-[#9ca2ad] ' + (config()?.textNoDataClassInclude ?? 'py-[4px] flex items-center justify-center w-full')\">\n @if (!keySearch() && !loading()) {\n @let constHtmlTextNoData = config()?.textNoData || 'i18n_have_no_selection';\n {{ constHtmlTextNoData | translate }}\n }\n @if (templateRefSearchNoData() && keySearch() && !loading()) {\n <ng-container *ngTemplateOutlet=\"templateRefSearchNoData() || null; context: { keySearch: keySearch() }\" />\n }\n @if (!templateRefSearchNoData() && keySearch() && !loading()) {\n @let constHtmlTextSearchNoData = config()?.textSearchNoData || 'i18n_no_result';\n {{ constHtmlTextSearchNoData | translate }}\n }\n @if (loading()) {\n \n }\n </div>\n }\n </div>\n @if (loading()) {\n <div class=\"w-full h-full absolute top-0\">\n <libs_ui-components-spinner [size]=\"'medium'\" />\n </div>\n }\n </div>\n}\n", dependencies: [{ kind: "ngmodule", type: VirtualScrollerModule }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: LibsUiComponentsSpinnerComponent, selector: "libs_ui-components-spinner", inputs: ["type", "size"] }, { kind: "directive", type: LibsUiComponentsScrollOverlayDirective, selector: "[LibsUiComponentsScrollOverlayDirective]", inputs: ["debugMode", "ignoreInit", "classContainer", "options", "elementCheckScrollX", "elementCheckScrollY", "elementScroll"], outputs: ["outScroll", "outScrollX", "outScrollY", "outScrollTop", "outScrollBottom"] }, { kind: "pipe", type: LibsUiCheckSelectedByKeyPipe, name: "LibsUiCheckSelectedByKeyPipe" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
134
|
+
}
|
|
135
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiComponentsListTagComponent, decorators: [{
|
|
136
|
+
type: Component,
|
|
137
|
+
args: [{ selector: 'libs_ui-components-list-templates_tag', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [VirtualScrollerModule, NgTemplateOutlet, TranslateModule, NgClass, LibsUiComponentsSpinnerComponent, LibsUiComponentsScrollOverlayDirective, LibsUiCheckSelectedByKeyPipe], template: "@if (configTemplateTag(); as configTemplateTag) {\n <div\n class=\"w-full h-full relative\"\n LibsUiComponentsScrollOverlayDirective\n (outScrollBottom)=\"handlerScrollBottom()\">\n <div\n class=\"relative max-h-[150px] h-full {{ configTemplateTag.classIncludeContainer }}\"\n [ngClass]=\"{ 'flex flex-wrap': !configTemplateTag.ignoreItemFlexWrap }\"\n [class.min-h-[45px]]=\"!loading() && (!items() || !items().length)\"\n [class.min-h-[94px]]=\"loading() && items()\">\n @for (item of items(); track item()[fieldKey()]) {\n <div\n [class.libs-ui-disable]=\"loading() || disable()\"\n [class.pointer-events-none]=\"loading() || disable()\"\n [class]=\"item().classContainerItem\">\n @if (item().bullet; as bullet) {\n <div\n [class]=\"item().classItem || 'rounded-[10px] px-[8px] py-[1px] mb-[8px] mr-[8px]'\"\n [class.w-max]=\"configTemplateTag?.ignoreItemFlexWrap\"\n [style.background-color]=\"bullet().backgroundColor\"\n [style.color]=\"bullet().color\"\n (click)=\"handlerSelectItem($event, item())\">\n <span [innerHTML]=\"item().fieldLabel\"></span>\n </div>\n } @else {\n @let constHtmlIsSelected = item()[fieldKey()] | LibsUiCheckSelectedByKeyPipe: multiKeySelected() : multiKeySelected().length;\n <div\n (click)=\"handlerSelectItem($event, item())\"\n [class]=\"item().classItem || 'rounded-[20px] mb-[8px] mr-[8px] py-[4px] px-[8px] flex items-center cursor-pointer'\"\n [class.bg-[var(--libs-ui-color-light-2)]]=\"constHtmlIsSelected\"\n [class.text-[var(--libs-ui-color-default)]]=\"constHtmlIsSelected\"\n [class.bg-white]=\"!constHtmlIsSelected\"\n [class.text-[#6a7383]]=\"!constHtmlIsSelected\"\n [class.libs-ui-border-general]=\"!constHtmlIsSelected\">\n @if (constHtmlIsSelected) {\n <div class=\"mr-[8px] text-[12px] libs-ui-icon-check before:text-[var(--libs-ui-color-default)]\"></div>\n }\n <span\n class=\"libs-ui-font-h6r break-word\"\n [innerHTML]=\"item().fieldLabel\"></span>\n </div>\n }\n </div>\n }\n @if (!items() || !items().length) {\n <div [class]=\"'libs-ui-font-h5r text-[#9ca2ad] ' + (config()?.textNoDataClassInclude ?? 'py-[4px] flex items-center justify-center w-full')\">\n @if (!keySearch() && !loading()) {\n @let constHtmlTextNoData = config()?.textNoData || 'i18n_have_no_selection';\n {{ constHtmlTextNoData | translate }}\n }\n @if (templateRefSearchNoData() && keySearch() && !loading()) {\n <ng-container *ngTemplateOutlet=\"templateRefSearchNoData() || null; context: { keySearch: keySearch() }\" />\n }\n @if (!templateRefSearchNoData() && keySearch() && !loading()) {\n @let constHtmlTextSearchNoData = config()?.textSearchNoData || 'i18n_no_result';\n {{ constHtmlTextSearchNoData | translate }}\n }\n @if (loading()) {\n \n }\n </div>\n }\n </div>\n @if (loading()) {\n <div class=\"w-full h-full absolute top-0\">\n <libs_ui-components-spinner [size]=\"'medium'\" />\n </div>\n }\n </div>\n}\n" }]
|
|
138
|
+
}] });
|
|
139
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFnLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMtdWkvY29tcG9uZW50cy9saXN0L3NyYy90ZW1wbGF0ZXMvdGFnL3RhZy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvbGlzdC9zcmMvdGVtcGxhdGVzL3RhZy90YWcuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsdURBQXVEO0FBQ3ZELE9BQU8sRUFBRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFVLE1BQU0sRUFBa0IsTUFBTSxlQUFlLENBQUM7QUFDbkcsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDdkUsT0FBTyxFQUFFLHNDQUFzQyxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDNUYsT0FBTyxFQUFFLGdDQUFnQyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDL0UsT0FBTyxFQUFFLFNBQVMsRUFBRSxhQUFhLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMxRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFHdEQsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDdEYsT0FBTyxFQUFFLDhDQUE4QyxFQUFFLE1BQU0saUNBQWlDLENBQUM7OztBQVVqRyxNQUFNLE9BQU8sZ0NBQWlDLFNBQVEsOENBQThDO0lBQ2xHLG1CQUFtQjtJQUNULGlCQUFpQixHQUFHLE1BQU0sQ0FBaUMsU0FBUyxDQUFDLENBQUM7SUFFdkUsUUFBUTtRQUNmLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsaUJBQWlCLEVBQUUsRUFBRSxFQUFFLENBQUM7WUFDMUMsT0FBTztRQUNULENBQUM7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LHFCQUFxQixFQUFFLGdCQUFnQixFQUFFLGVBQWUsRUFBRSxPQUFPLEVBQUUsZ0NBQWdDLEVBQUUsc0NBQXNDLEVBQUUsNEJBQTRCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG5pbXBvcnQgeyBOZ0NsYXNzLCBOZ1RlbXBsYXRlT3V0bGV0IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIE9uSW5pdCwgc2lnbmFsLCBXcml0YWJsZVNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVmlydHVhbFNjcm9sbGVyTW9kdWxlIH0gZnJvbSAnQGloYXJiZWNrL25neC12aXJ0dWFsLXNjcm9sbGVyJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNTY3JvbGxPdmVybGF5RGlyZWN0aXZlIH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1zY3JvbGwtb3ZlcmxheSc7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzU3Bpbm5lckNvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtc3Bpbm5lcic7XG5pbXBvcnQgeyBjbG9uZURlZXAsIGRlbGV0ZVVuaWNvZGUgfSBmcm9tICdAbGlicy11aS91dGlscyc7XG5pbXBvcnQgeyBUcmFuc2xhdGVNb2R1bGUgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IElMaXN0Q29uZmlnSXRlbVRhZyB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvY29uZmlnLWl0ZW0uaW50ZXJmYWNlJztcbmltcG9ydCB7IElMaXN0RGF0YUVtaXRLZXkgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL2RhdGEtZW1pdC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgTGlic1VpQ2hlY2tTZWxlY3RlZEJ5S2V5UGlwZSB9IGZyb20gJy4uLy4uL3BpcGVzL2NoZWNrLXNlbGVjdGVkLWJ5LWtleS5waXBlJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNMaXN0VGVtcGxhdGVzQ29tcG9uZW50QWJzdHJhY3QgfSBmcm9tICcuLi90ZW1wbGF0ZXMuY29tcG9uZW50LmFic3RyYWN0JztcblxuQENvbXBvbmVudCh7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvY29tcG9uZW50LXNlbGVjdG9yXG4gIHNlbGVjdG9yOiAnbGlic191aS1jb21wb25lbnRzLWxpc3QtdGVtcGxhdGVzX3RhZycsXG4gIHRlbXBsYXRlVXJsOiAnLi90YWcuY29tcG9uZW50Lmh0bWwnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgaW1wb3J0czogW1ZpcnR1YWxTY3JvbGxlck1vZHVsZSwgTmdUZW1wbGF0ZU91dGxldCwgVHJhbnNsYXRlTW9kdWxlLCBOZ0NsYXNzLCBMaWJzVWlDb21wb25lbnRzU3Bpbm5lckNvbXBvbmVudCwgTGlic1VpQ29tcG9uZW50c1Njcm9sbE92ZXJsYXlEaXJlY3RpdmUsIExpYnNVaUNoZWNrU2VsZWN0ZWRCeUtleVBpcGVdLFxufSlcbmV4cG9ydCBjbGFzcyBMaWJzVWlDb21wb25lbnRzTGlzdFRhZ0NvbXBvbmVudCBleHRlbmRzIExpYnNVaUNvbXBvbmVudHNMaXN0VGVtcGxhdGVzQ29tcG9uZW50QWJzdHJhY3QgaW1wbGVtZW50cyBPbkluaXQge1xuICAvLyAjcmVnaW9uIFBST1BFUlRZXG4gIHByb3RlY3RlZCBjb25maWdUZW1wbGF0ZVRhZyA9IHNpZ25hbDxJTGlzdENvbmZpZ0l0ZW1UYWcgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG5cbiAgb3ZlcnJpZGUgbmdPbkluaXQoKSB7XG4gICAgaWYgKCF0aGlzLmNvbmZpZygpPy5jb25maWdUZW1wbGF0ZVRhZz8uKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc3VwZXIubmdPbkluaXQoKTtcbiAgICB0aGlzLmNvbmZpZ1RlbXBsYXRlVGFnLnNldCh0aGlzLmNvbmZpZygpPy5jb25maWdUZW1wbGF0ZVRhZz8uKCkpO1xuICAgIHRoaXMuZmllbGRLZXkuc2V0KHRoaXMuY29uZmlnVGVtcGxhdGVUYWcoKT8uZmllbGRLZXkgPz8gdGhpcy5maWVsZEtleURlZmF1bHQoKSk7XG4gICAgdGhpcy5jYWxsQXBpQnlTZXJ2aWNlKCk7XG4gIH1cblxuICAvKiBGVU5DVElPTlMgKi9cbiAgcHJvdGVjdGVkIGhhbmRsZXJTZWxlY3RJdGVtKGU6IEV2ZW50LCBpdGVtOiBhbnkpIHtcbiAgICBpZiAoZSBpbnN0YW5jZW9mIEV2ZW50KSB7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgICBpZiAoIWl0ZW0gfHwgKHRoaXMua2V5c0Rpc2FibGVJdGVtKCkgJiYgdGhpcy5rZXlzRGlzYWJsZUl0ZW0oKT8uc29tZSgoa2V5KSA9PiBrZXkgPT09IGl0ZW1bdGhpcy5maWVsZEtleSgpXSkpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGtleSA9IGl0ZW1bdGhpcy5maWVsZEtleSgpXTtcbiAgICBjb25zdCBpbmRleE9mS2V5ID0gdGhpcy5tdWx0aUtleVNlbGVjdGVkKCk/LmluZGV4T2Yoa2V5KSA/PyAtMTtcblxuICAgIGlmIChpbmRleE9mS2V5IDwgMCkge1xuICAgICAgdGhpcy5tdWx0aUtleVNlbGVjdGVkLnVwZGF0ZSgoaXRlbXMpID0+IFsuLi4oaXRlbXMgfHwgW10pLCBrZXldKTtcbiAgICAgIHRoaXMuZW1pdE1vU2VsZWN0TXVsdGlLZXkodGhpcy5tdWx0aUtleVNlbGVjdGVkKCkgfHwgW10pO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMubXVsdGlLZXlTZWxlY3RlZC51cGRhdGUoKGl0ZW1zKSA9PiB7XG4gICAgICBpdGVtcz8uc3BsaWNlKGluZGV4T2ZLZXksIDEpO1xuXG4gICAgICByZXR1cm4gaXRlbXM7XG4gICAgfSk7XG4gICAgdGhpcy5vdXRVblNlbGVjdE11bHRpS2V5LmVtaXQoW2tleV0pO1xuICAgIHRoaXMuZW1pdE1vU2VsZWN0TXVsdGlLZXkodGhpcy5tdWx0aUtleVNlbGVjdGVkKCkgfHwgW10pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBlbWl0TW9TZWxlY3RNdWx0aUtleShtdWx0aUtleVNlbGVjdGVkOiBBcnJheTx1bmtub3duPiwgaXNDbGlja01hbnVhbCA9IHRydWUpIHtcbiAgICBjb25zdCBtYXBLZXlzID0gbmV3IEFycmF5PElMaXN0RGF0YUVtaXRLZXk+KCk7XG4gICAgaWYgKCFtdWx0aUtleVNlbGVjdGVkIHx8ICFtdWx0aUtleVNlbGVjdGVkLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHRoaXMub3V0U2VsZWN0TXVsdGlLZXkuZW1pdCh7IGtleXM6IFtdLCBtYXBLZXlzLCBpc0NsaWNrTWFudWFsIH0pO1xuICAgIH1cblxuICAgIG11bHRpS2V5U2VsZWN0ZWQuZm9yRWFjaCgoa2V5OiB1bmtub3duKSA9PiB7XG4gICAgICBjb25zdCBpdGVtID0gdGhpcy5zdG9yZSgpLmZpbmQoKGl0ZW0pID0+IGl0ZW0oKVt0aGlzLmZpZWxkS2V5KCldID09PSBrZXkpO1xuXG4gICAgICBtYXBLZXlzLnB1c2goeyBrZXksIGl0ZW0sIGlzQ2xpY2tNYW51YWwgfSk7XG4gICAgfSk7XG4gICAgdGhpcy5vdXRTZWxlY3RNdWx0aUtleS5lbWl0KHsga2V5czogdGhpcy5tdWx0aUtleVNlbGVjdGVkKCkgfHwgW10sIG1hcEtleXMsIGlzQ2xpY2tNYW51YWwgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlclNjcm9sbEJvdHRvbSgpIHtcbiAgICBpZiAodGhpcy5sb2FkZWRMYXN0SXRlbSgpKSB7XG4gICAgICB0aGlzLmxvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICAgIHRoaXMub3V0TG9hZGluZy5lbWl0KHRoaXMubG9hZGluZygpKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5sb2FkaW5nKCkgfHwgdGhpcy5sb2FkZWRMYXN0SXRlbSgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMubG9hZGluZy5zZXQodHJ1ZSk7XG4gICAgdGhpcy5vdXRMb2FkaW5nLmVtaXQodGhpcy5sb2FkaW5nKCkpO1xuICAgIHRoaXMuY2FsbEFwaUJ5U2VydmljZShmYWxzZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcHJvY2Vzc1NlYXJjaCgpIHtcbiAgICB0aGlzLmNhbGxBcGlCeVNlcnZpY2UodHJ1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcHJvY2Vzc0RhdGEocmVwbGFjZT86IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBjb25zdCBpdGVtQnlLZXlTZWFyY2g6IEFycmF5PFdyaXRhYmxlU2lnbmFsPGFueT4+ID0gW107XG4gICAgY29uc3Qga2V5c0hpZGRlbiA9IHRoaXMua2V5c0hpZGRlbkl0ZW0oKSB8fCBbXTtcblxuICAgIGlmIChyZXBsYWNlKSB7XG4gICAgICB0aGlzLml0ZW1zLnNldChbXSk7XG4gICAgfVxuICAgIHRoaXMuc3RvcmUoKS5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICBjb25zdCBkYXRhU3RvcmU6IFdyaXRhYmxlU2lnbmFsPGFueT4gPSBjbG9uZURlZXAoaXRlbSk7XG5cbiAgICAgIGRhdGFTdG9yZS51cGRhdGUoKGN1cnJlbnRTdG9yZSkgPT4ge1xuICAgICAgICByZXR1cm4geyAuLi5jdXJyZW50U3RvcmUsIHJlZjogaXRlbSgpIH07XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGtleSA9IGtleXNIaWRkZW4uZmluZCgoa2V5KSA9PiBkYXRhU3RvcmUoKVt0aGlzLmZpZWxkS2V5KCldID09PSBrZXkpO1xuXG4gICAgICBpZiAoa2V5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgdGV4dCA9IHRoaXMuYnVpbGRWYWx1ZUJ5Q29uZmlnKGRhdGFTdG9yZSwgdGhpcy5jb25maWdUZW1wbGF0ZVRhZygpKTtcblxuICAgICAgICBpZiAodGV4dCAmJiBkZWxldGVVbmljb2RlKHRleHQudG9Mb2NhbGVMb3dlckNhc2UoKSkuaW5jbHVkZXMoZGVsZXRlVW5pY29kZSh0aGlzLmtleVNlYXJjaCgpLnRvTG9jYWxlTG93ZXJDYXNlKCkpKSAmJiAhdGhpcy5pdGVtcygpLmZpbmQoKGRhdGFJdGVtKSA9PiBkYXRhSXRlbSgpW3RoaXMuZmllbGRLZXkoKV0gPT09IGRhdGFTdG9yZSgpW3RoaXMuZmllbGRLZXkoKV0pKSB7XG4gICAgICAgICAgaXRlbUJ5S2V5U2VhcmNoLnB1c2goZGF0YVN0b3JlKTtcbiAgICAgICAgICBkYXRhU3RvcmUudXBkYXRlKChjdXJyZW50U3RvcmUpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIC4uLmN1cnJlbnRTdG9yZSxcbiAgICAgICAgICAgICAgY2xhc3NJdGVtOiBpdGVtKCkuY2xhc3NJdGVtIHx8IHRoaXMuY29uZmlnVGVtcGxhdGVUYWcoKT8uZ2V0Q2xhc3NJdGVtPy4oZGF0YVN0b3JlKCkpLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGluZGV4SXRlbVJlbW92ZSA9IHRoaXMuaXRlbXMoKS5maW5kSW5kZXgoKGl0ZW0pID0+IGl0ZW0oKVt0aGlzLmZpZWxkS2V5KCldID09PSBrZXkpO1xuXG4gICAgICBpZiAoaW5kZXhJdGVtUmVtb3ZlID4gLTEpIHtcbiAgICAgICAgdGhpcy5pdGVtcy51cGRhdGUoKGl0ZW1zKSA9PiB7XG4gICAgICAgICAgaXRlbXMuc3BsaWNlKGluZGV4SXRlbVJlbW92ZSwgMSk7XG5cbiAgICAgICAgICByZXR1cm4gaXRlbXM7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IGNoZWNrTG9hZEl0ZW0gPSAocHJlU3RhdGVIYXNTY3JvbGw6IGJvb2xlYW4sIGN1cnJlbnRIYXNTY3JvbGw6IGJvb2xlYW4pID0+IHtcbiAgICAgIGlmICh0aGlzLmtleXNIaWRkZW5JdGVtKCk/Lmxlbmd0aCAmJiBwcmVTdGF0ZUhhc1Njcm9sbCAmJiAhY3VycmVudEhhc1Njcm9sbCAmJiB0aGlzLmlzU2VhcmNoT25saW5lKCkpIHtcbiAgICAgICAgdGhpcy5jYWxsQXBpQnlTZXJ2aWNlKGZhbHNlKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgaWYgKHJlcGxhY2UpIHtcbiAgICAgIHRoaXMuaXRlbXMuc2V0KGl0ZW1CeUtleVNlYXJjaCk7XG4gICAgICB0aGlzLmNvbmZpZygpPy5zb3J0Py4odGhpcy5pdGVtcygpKTtcbiAgICAgIHRoaXMuc2V0SGVpZ2h0Vmlld1BvcnQoKTtcbiAgICAgIHRoaXMuY2hlY2tWaWV3UG9ydFNjcm9sbChjaGVja0xvYWRJdGVtKTtcbiAgICAgIHRoaXMubG9hZGluZy5zZXQoZmFsc2UpO1xuICAgICAgdGhpcy5vdXRMb2FkaW5nLmVtaXQodGhpcy5sb2FkaW5nKCkpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuaXRlbXMudXBkYXRlKChpdGVtcykgPT4gWy4uLihpdGVtcyB8fCBbXSksIC4uLml0ZW1CeUtleVNlYXJjaF0pO1xuICAgIHRoaXMuY29uZmlnKCk/LnNvcnQ/Lih0aGlzLml0ZW1zKCkpO1xuICAgIHRoaXMuc2V0SGVpZ2h0Vmlld1BvcnQoKTtcbiAgICB0aGlzLmNoZWNrVmlld1BvcnRTY3JvbGwoY2hlY2tMb2FkSXRlbSk7XG4gICAgdGhpcy5sb2FkaW5nLnNldChmYWxzZSk7XG4gICAgdGhpcy5vdXRMb2FkaW5nLmVtaXQodGhpcy5sb2FkaW5nKCkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldExlbmd0aEl0ZW0oKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5pdGVtcygpLmxlbmd0aDtcbiAgfVxufVxuIiwiQGlmIChjb25maWdUZW1wbGF0ZVRhZygpOyBhcyBjb25maWdUZW1wbGF0ZVRhZykge1xuICA8ZGl2XG4gICAgY2xhc3M9XCJ3LWZ1bGwgaC1mdWxsIHJlbGF0aXZlXCJcbiAgICBMaWJzVWlDb21wb25lbnRzU2Nyb2xsT3ZlcmxheURpcmVjdGl2ZVxuICAgIChvdXRTY3JvbGxCb3R0b20pPVwiaGFuZGxlclNjcm9sbEJvdHRvbSgpXCI+XG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJyZWxhdGl2ZSBtYXgtaC1bMTUwcHhdIGgtZnVsbCB7eyBjb25maWdUZW1wbGF0ZVRhZy5jbGFzc0luY2x1ZGVDb250YWluZXIgfX1cIlxuICAgICAgW25nQ2xhc3NdPVwieyAnZmxleCBmbGV4LXdyYXAnOiAhY29uZmlnVGVtcGxhdGVUYWcuaWdub3JlSXRlbUZsZXhXcmFwIH1cIlxuICAgICAgW2NsYXNzLm1pbi1oLVs0NXB4XV09XCIhbG9hZGluZygpICYmICghaXRlbXMoKSB8fCAhaXRlbXMoKS5sZW5ndGgpXCJcbiAgICAgIFtjbGFzcy5taW4taC1bOTRweF1dPVwibG9hZGluZygpICYmIGl0ZW1zKClcIj5cbiAgICAgIEBmb3IgKGl0ZW0gb2YgaXRlbXMoKTsgdHJhY2sgaXRlbSgpW2ZpZWxkS2V5KCldKSB7XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBbY2xhc3MubGlicy11aS1kaXNhYmxlXT1cImxvYWRpbmcoKSB8fCBkaXNhYmxlKClcIlxuICAgICAgICAgIFtjbGFzcy5wb2ludGVyLWV2ZW50cy1ub25lXT1cImxvYWRpbmcoKSB8fCBkaXNhYmxlKClcIlxuICAgICAgICAgIFtjbGFzc109XCJpdGVtKCkuY2xhc3NDb250YWluZXJJdGVtXCI+XG4gICAgICAgICAgQGlmIChpdGVtKCkuYnVsbGV0OyBhcyBidWxsZXQpIHtcbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgW2NsYXNzXT1cIml0ZW0oKS5jbGFzc0l0ZW0gfHwgJ3JvdW5kZWQtWzEwcHhdIHB4LVs4cHhdIHB5LVsxcHhdIG1iLVs4cHhdIG1yLVs4cHhdJ1wiXG4gICAgICAgICAgICAgIFtjbGFzcy53LW1heF09XCJjb25maWdUZW1wbGF0ZVRhZz8uaWdub3JlSXRlbUZsZXhXcmFwXCJcbiAgICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmQtY29sb3JdPVwiYnVsbGV0KCkuYmFja2dyb3VuZENvbG9yXCJcbiAgICAgICAgICAgICAgW3N0eWxlLmNvbG9yXT1cImJ1bGxldCgpLmNvbG9yXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImhhbmRsZXJTZWxlY3RJdGVtKCRldmVudCwgaXRlbSgpKVwiPlxuICAgICAgICAgICAgICA8c3BhbiBbaW5uZXJIVE1MXT1cIml0ZW0oKS5maWVsZExhYmVsXCI+PC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICBAbGV0IGNvbnN0SHRtbElzU2VsZWN0ZWQgPSBpdGVtKClbZmllbGRLZXkoKV0gfCBMaWJzVWlDaGVja1NlbGVjdGVkQnlLZXlQaXBlOiBtdWx0aUtleVNlbGVjdGVkKCkgOiBtdWx0aUtleVNlbGVjdGVkKCkubGVuZ3RoO1xuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlclNlbGVjdEl0ZW0oJGV2ZW50LCBpdGVtKCkpXCJcbiAgICAgICAgICAgICAgW2NsYXNzXT1cIml0ZW0oKS5jbGFzc0l0ZW0gfHwgJ3JvdW5kZWQtWzIwcHhdIG1iLVs4cHhdIG1yLVs4cHhdIHB5LVs0cHhdIHB4LVs4cHhdIGZsZXggaXRlbXMtY2VudGVyIGN1cnNvci1wb2ludGVyJ1wiXG4gICAgICAgICAgICAgIFtjbGFzcy5iZy1bdmFyKC0tbGlicy11aS1jb2xvci1saWdodC0yKV1dPVwiY29uc3RIdG1sSXNTZWxlY3RlZFwiXG4gICAgICAgICAgICAgIFtjbGFzcy50ZXh0LVt2YXIoLS1saWJzLXVpLWNvbG9yLWRlZmF1bHQpXV09XCJjb25zdEh0bWxJc1NlbGVjdGVkXCJcbiAgICAgICAgICAgICAgW2NsYXNzLmJnLXdoaXRlXT1cIiFjb25zdEh0bWxJc1NlbGVjdGVkXCJcbiAgICAgICAgICAgICAgW2NsYXNzLnRleHQtWyM2YTczODNdXT1cIiFjb25zdEh0bWxJc1NlbGVjdGVkXCJcbiAgICAgICAgICAgICAgW2NsYXNzLmxpYnMtdWktYm9yZGVyLWdlbmVyYWxdPVwiIWNvbnN0SHRtbElzU2VsZWN0ZWRcIj5cbiAgICAgICAgICAgICAgQGlmIChjb25zdEh0bWxJc1NlbGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1yLVs4cHhdIHRleHQtWzEycHhdIGxpYnMtdWktaWNvbi1jaGVjayBiZWZvcmU6dGV4dC1bdmFyKC0tbGlicy11aS1jb2xvci1kZWZhdWx0KV1cIj48L2Rpdj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgIGNsYXNzPVwibGlicy11aS1mb250LWg2ciBicmVhay13b3JkXCJcbiAgICAgICAgICAgICAgICBbaW5uZXJIVE1MXT1cIml0ZW0oKS5maWVsZExhYmVsXCI+PC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICAgIEBpZiAoIWl0ZW1zKCkgfHwgIWl0ZW1zKCkubGVuZ3RoKSB7XG4gICAgICAgIDxkaXYgW2NsYXNzXT1cIidsaWJzLXVpLWZvbnQtaDVyIHRleHQtWyM5Y2EyYWRdICcgKyAoY29uZmlnKCk/LnRleHROb0RhdGFDbGFzc0luY2x1ZGUgPz8gJ3B5LVs0cHhdIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHctZnVsbCcpXCI+XG4gICAgICAgICAgQGlmICgha2V5U2VhcmNoKCkgJiYgIWxvYWRpbmcoKSkge1xuICAgICAgICAgICAgQGxldCBjb25zdEh0bWxUZXh0Tm9EYXRhID0gY29uZmlnKCk/LnRleHROb0RhdGEgfHwgJ2kxOG5faGF2ZV9ub19zZWxlY3Rpb24nO1xuICAgICAgICAgICAge3sgY29uc3RIdG1sVGV4dE5vRGF0YSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgIH1cbiAgICAgICAgICBAaWYgKHRlbXBsYXRlUmVmU2VhcmNoTm9EYXRhKCkgJiYga2V5U2VhcmNoKCkgJiYgIWxvYWRpbmcoKSkge1xuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRlbXBsYXRlUmVmU2VhcmNoTm9EYXRhKCkgfHwgbnVsbDsgY29udGV4dDogeyBrZXlTZWFyY2g6IGtleVNlYXJjaCgpIH1cIiAvPlxuICAgICAgICAgIH1cbiAgICAgICAgICBAaWYgKCF0ZW1wbGF0ZVJlZlNlYXJjaE5vRGF0YSgpICYmIGtleVNlYXJjaCgpICYmICFsb2FkaW5nKCkpIHtcbiAgICAgICAgICAgIEBsZXQgY29uc3RIdG1sVGV4dFNlYXJjaE5vRGF0YSA9IGNvbmZpZygpPy50ZXh0U2VhcmNoTm9EYXRhIHx8ICdpMThuX25vX3Jlc3VsdCc7XG4gICAgICAgICAgICB7eyBjb25zdEh0bWxUZXh0U2VhcmNoTm9EYXRhIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgfVxuICAgICAgICAgIEBpZiAobG9hZGluZygpKSB7XG4gICAgICAgICAgICAmbmJzcDtcbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgIDwvZGl2PlxuICAgIEBpZiAobG9hZGluZygpKSB7XG4gICAgICA8ZGl2IGNsYXNzPVwidy1mdWxsIGgtZnVsbCBhYnNvbHV0ZSB0b3AtMFwiPlxuICAgICAgICA8bGlic191aS1jb21wb25lbnRzLXNwaW5uZXIgW3NpemVdPVwiJ21lZGl1bSdcIiAvPlxuICAgICAgPC9kaXY+XG4gICAgfVxuICA8L2Rpdj5cbn1cbiJdfQ==
|