sf-crud 12.0.1-beta2 → 12.0.1-beta21
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/bundles/sf-crud.umd.js +423 -47
- package/bundles/sf-crud.umd.js.map +1 -1
- package/esm2015/lib/components/control/control.component.js +76 -7
- package/esm2015/lib/components/registro/registro.component.js +125 -19
- package/esm2015/lib/components/registro-child/registro-child.component.js +137 -0
- package/esm2015/lib/components/tablero/tablero.component.js +3 -3
- package/esm2015/lib/sf-crud.module.js +28 -12
- package/esm2015/lib/shared/services/models/crud-config.model.js +1 -1
- package/esm2015/lib/shared/services/models/shema.model.js +1 -1
- package/esm2015/public-api.js +2 -1
- package/fesm2015/sf-crud.js +343 -32
- package/fesm2015/sf-crud.js.map +1 -1
- package/lib/components/control/control.component.d.ts +10 -1
- package/lib/components/registro/registro.component.d.ts +17 -7
- package/lib/components/registro-child/registro-child.component.d.ts +26 -0
- package/lib/components/tablero/tablero.component.d.ts +1 -1
- package/lib/sf-crud.module.d.ts +76 -73
- package/lib/shared/services/models/crud-config.model.d.ts +2 -0
- package/lib/shared/services/models/shema.model.d.ts +1 -0
- package/package.json +1 -1
- package/public-api.d.ts +1 -0
|
@@ -2,27 +2,63 @@ import { Component, Input, Output, EventEmitter } from '@angular/core';
|
|
|
2
2
|
import { Shema } from '../../shared/services/models/shema.model';
|
|
3
3
|
import * as i0 from "@angular/core";
|
|
4
4
|
import * as i1 from "../../shared/services/general.service";
|
|
5
|
-
import * as i2 from "primeng/
|
|
6
|
-
import * as i3 from "
|
|
7
|
-
import * as i4 from "
|
|
8
|
-
import * as i5 from "primeng/
|
|
5
|
+
import * as i2 from "primeng/inputmask";
|
|
6
|
+
import * as i3 from "primeng/dropdown";
|
|
7
|
+
import * as i4 from "primeng/autocomplete";
|
|
8
|
+
import * as i5 from "primeng/calendar";
|
|
9
|
+
import * as i6 from "primeng/inputnumber";
|
|
10
|
+
import * as i7 from "primeng/fileupload";
|
|
11
|
+
import * as i8 from "@angular/common";
|
|
12
|
+
import * as i9 from "@angular/forms";
|
|
13
|
+
import * as i10 from "primeng/inputtext";
|
|
14
|
+
import * as i11 from "primeng/api";
|
|
9
15
|
export class ControlComponent {
|
|
10
16
|
constructor(generalService) {
|
|
11
17
|
this.generalService = generalService;
|
|
12
18
|
this.control = new Shema();
|
|
13
19
|
this.label = '';
|
|
14
20
|
this.setValue = new EventEmitter();
|
|
21
|
+
this.sendNotification = new EventEmitter();
|
|
15
22
|
this.isLoading = false;
|
|
16
23
|
this.dataFromService = [];
|
|
24
|
+
this.uploadedFiles = [];
|
|
25
|
+
this.displayAdd = false;
|
|
17
26
|
}
|
|
18
27
|
ngOnInit() {
|
|
19
28
|
var _a;
|
|
20
|
-
if ((_a = this.control) === null || _a === void 0 ? void 0 : _a.config)
|
|
29
|
+
if (((_a = this.control) === null || _a === void 0 ? void 0 : _a.config) && this.control.subtype == 'dropdown')
|
|
21
30
|
this.loadDataFromService();
|
|
22
31
|
}
|
|
23
32
|
sendValue() {
|
|
24
33
|
this.setValue.emit(this.value);
|
|
25
34
|
}
|
|
35
|
+
sendValueFromObject(event) {
|
|
36
|
+
switch (typeof (this.control.config.optionValue)) {
|
|
37
|
+
case 'object':
|
|
38
|
+
this.control.config.optionValue.forEach((op) => op['value'] = event[op.key]);
|
|
39
|
+
this.setValue.emit(this.control.config.optionValue);
|
|
40
|
+
break;
|
|
41
|
+
default:
|
|
42
|
+
this.setValue.emit(event[this.control.config.optionValue]);
|
|
43
|
+
break;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
validateValue(type) {
|
|
47
|
+
switch (type) {
|
|
48
|
+
case 'email':
|
|
49
|
+
let regex = new RegExp(/([\w\.\-_]+)?\w+@[\w-_]+(\.\w+){1,}/igm);
|
|
50
|
+
if (regex.test(this.value))
|
|
51
|
+
this.sendValue();
|
|
52
|
+
else {
|
|
53
|
+
this.value = null;
|
|
54
|
+
this.sendValue();
|
|
55
|
+
this.sendNotification.emit({ severity: 'warn', detail: 'El correo no es válido' });
|
|
56
|
+
}
|
|
57
|
+
break;
|
|
58
|
+
default:
|
|
59
|
+
break;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
26
62
|
loadDataFromService() {
|
|
27
63
|
this.isLoading = true;
|
|
28
64
|
this.generalService.genericRequest(this.control.config.method, this.control.config.server, this.control.config.endpoint)
|
|
@@ -31,9 +67,38 @@ export class ControlComponent {
|
|
|
31
67
|
this.isLoading = false;
|
|
32
68
|
});
|
|
33
69
|
}
|
|
70
|
+
loadDataFromControlBusquedaService(event) {
|
|
71
|
+
this.isLoading = true;
|
|
72
|
+
this.generalService.genericRequest(this.control.config.method, this.control.config.server, this.control.config.endpoint.replace('@query', (event === null || event === void 0 ? void 0 : event.query) || ''))
|
|
73
|
+
.then((res) => {
|
|
74
|
+
this.dataFromService = res.data;
|
|
75
|
+
this.isLoading = false;
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
onUpload(event) {
|
|
79
|
+
let file = event.files[0];
|
|
80
|
+
let formData = new FormData();
|
|
81
|
+
let path = 'Imagenes/CRUD/temp';
|
|
82
|
+
formData.append('uploadFile', file);
|
|
83
|
+
formData.append('Ruta', `/${path}`);
|
|
84
|
+
this.isLoading = true;
|
|
85
|
+
this.generalService.genericRequest(this.control.config.method, this.control.config.server, this.control.config.endpoint, formData)
|
|
86
|
+
.then(() => {
|
|
87
|
+
this.sendNotification.emit({ severity: 'info', detail: `Archivo cargado correctamente!` });
|
|
88
|
+
this.uploadedFiles.push(file);
|
|
89
|
+
this.isLoading = false;
|
|
90
|
+
this.value = `${this.generalService.jsonConfig.Server}${path}/${file.name}`;
|
|
91
|
+
this.sendValue();
|
|
92
|
+
})
|
|
93
|
+
.catch(err => {
|
|
94
|
+
console.log(err);
|
|
95
|
+
this.isLoading = false;
|
|
96
|
+
this.sendNotification.emit({ severity: 'error', detail: `Error al cargar el archivo!` });
|
|
97
|
+
});
|
|
98
|
+
}
|
|
34
99
|
}
|
|
35
100
|
ControlComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: ControlComponent, deps: [{ token: i1.GeneralService }], target: i0.ɵɵFactoryTarget.Component });
|
|
36
|
-
ControlComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: ControlComponent, selector: "sf-control", inputs: { control: "control", label: "label", value: "value" }, outputs: { setValue: "setValue" }, ngImport: i0, template: "<ng-container [ngSwitch]=\"control.type\">\r\n <ng-container *ngSwitchCase=\"'string'\">\r\n <label>{{label}}</label>\r\n <ng-container [ngSwitch]=\"control.subtype\">\r\n <ng-container *ngSwitchCase=\"'input'\">\r\n <input pInputText type=\"text\" [(ngModel)]=\"value\" (focusout)=\"sendValue()\">\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'password'\">\r\n <input pInputText type=\"password\" [(ngModel)]=\"value\" (focusout)=\"sendValue()\">\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'enum'\">\r\n <p-dropdown [options]=\"control.enum\" [(ngModel)]=\"value\" (onChange)=\"sendValue()\"\r\n placeholder=\"Seleccione una opci\u00F3n\"></p-dropdown>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'dropdown'\">\r\n <p-dropdown [lazy]=\"isLoading\" [options]=\"dataFromService\" [(ngModel)]=\"value\" (onChange)=\"sendValue()\"\r\n [optionLabel]=\"control.config.optionLabel\" [optionValue]=\"control.config.optionValue\"\r\n placeholder=\"Seleccione una opci\u00F3n\"></p-dropdown>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n</ng-container>", components: [{ type: i2.Dropdown, selector: "p-dropdown", inputs: ["scrollHeight", "resetFilterOnHide", "dropdownIcon", "optionGroupChildren", "autoDisplayFirst", "emptyFilterMessage", "emptyMessage", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "autofocusFilter", "disabled", "options", "filterValue", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "filterPlaceholder", "filterLocale", "inputId", "selectId", "dataKey", "filterBy", "autofocus", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "group", "showClear", "virtualScroll", "itemSize", "ariaFilterLabel", "ariaLabelledBy", "maxlength", "tooltipStyleClass"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide"] }], directives: [{ type: i3.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i3.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i5.InputText, selector: "[pInputText]" }, { type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
|
|
101
|
+
ControlComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: ControlComponent, selector: "sf-control", inputs: { control: "control", label: "label", value: "value", appendTo: "appendTo" }, outputs: { setValue: "setValue", sendNotification: "sendNotification" }, ngImport: i0, template: "<!-- <p-blockUI [blocked]=\"isLoading\" [target]=\"cc\">\r\n <i class=\"pi pi-cog pi-spin\" style=\"font-size: 50px\"></i>\r\n</p-blockUI> -->\r\n\r\n<ng-container [ngSwitch]=\"control.type\">\r\n <label>{{label}}</label>\r\n <ng-container *ngSwitchCase=\"'string'\">\r\n <ng-container [ngSwitch]=\"control.subtype\">\r\n <ng-container *ngSwitchCase=\"'input'\">\r\n <input pInputText type=\"text\" [(ngModel)]=\"value\" (focusout)=\"sendValue()\">\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'password'\">\r\n <input pInputText type=\"password\" [(ngModel)]=\"value\" (focusout)=\"sendValue()\">\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'email'\">\r\n <input pInputText type=\"text\" [(ngModel)]=\"value\" placeholder=\"email@example.com\"\r\n (focusout)=\"validateValue('email')\">\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'phone'\">\r\n <p-inputMask mask=\"(999) 999-9999\" [(ngModel)]=\"value\" placeholder=\"(999) 999-9999\"\r\n (focusout)=\"sendValue()\"></p-inputMask>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'enum'\">\r\n <p-dropdown [options]=\"control.enum\" [(ngModel)]=\"value\" (onChange)=\"sendValue()\" [appendTo]=\"appendTo\"\r\n placeholder=\"Seleccione una opci\u00F3n\"></p-dropdown>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'dropdown'\">\r\n <p-dropdown [lazy]=\"isLoading\" [options]=\"dataFromService\" [(ngModel)]=\"value\" (onChange)=\"sendValue()\"\r\n [optionLabel]=\"control.config.optionLabel\" [optionValue]=\"control.config.optionValue\"\r\n [appendTo]=\"appendTo\" placeholder=\"Seleccione una opci\u00F3n\"></p-dropdown>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'autocomplete'\">\r\n <p-autoComplete [showEmptyMessage]=\"true\" [suggestions]=\"dataFromService\" [appendTo]=\"appendTo\"\r\n (completeMethod)=\"loadDataFromControlBusquedaService($event)\" [field]=\"control.field\"\r\n [minLength]=\"1\" (onSelect)=\"sendValueFromObject($event)\"></p-autoComplete>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'date'\">\r\n <ng-container [ngSwitch]=\"control.subtype\">\r\n <ng-container *ngSwitchCase=\"'calendar'\">\r\n <p-calendar [(ngModel)]=\"value\" (onSelect)=\"sendValue()\" [monthNavigator]=\"true\" [yearNavigator]=\"true\"\r\n yearRange=\"1900:2035\" [dateFormat]=\"control?.format || 'yy-mm-dd'\" [appendTo]=\"appendTo\"></p-calendar>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'numeric'\">\r\n <ng-container [ngSwitch]=\"control.subtype\">\r\n <ng-container *ngSwitchCase=\"'currency'\">\r\n <p-inputNumber [(ngModel)]=\"value\" mode=\"currency\" [minFractionDigits]=\"control?.minFractionDigits || 0\"\r\n [min]=\"control?.min || null\" [max]=\"control?.max || null\" (focusout)=\"sendValue()\"\r\n [currency]=\"control?.currency || 'USD'\"></p-inputNumber>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'decimal'\">\r\n <p-inputNumber [(ngModel)]=\"value\" mode=\"decimal\" (focusout)=\"sendValue()\" [min]=\"control?.min || null\"\r\n [max]=\"control?.max || null\" [minFractionDigits]=\"control?.minFractionDigits || 0\"></p-inputNumber>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'percentage'\">\r\n <p-inputNumber [(ngModel)]=\"value\" suffix=\" %\" (focusout)=\"sendValue()\" [min]=\"control?.min || null\"\r\n [max]=\"control?.max || null\" [minFractionDigits]=\"control?.minFractionDigits || 2\"></p-inputNumber>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'file'\">\r\n <ng-container [ngSwitch]=\"control.subtype\">\r\n <ng-container *ngSwitchCase=\"'filetmp'\">\r\n <p-fileUpload [accept]=\"control.config.accept\" [customUpload]=\"true\" (uploadHandler)=\"onUpload($event)\"\r\n [maxFileSize]=\"control.config?.maxFileSize || null\" fileLimit=\"1\">\r\n <ng-template pTemplate=\"content\">\r\n <ul *ngIf=\"uploadedFiles.length\">\r\n <li *ngFor=\"let file of uploadedFiles\">{{file.name}} - {{file.size}} bytes</li>\r\n </ul>\r\n </ng-template>\r\n </p-fileUpload>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n</ng-container>", components: [{ type: i2.InputMask, selector: "p-inputMask", inputs: ["type", "slotChar", "autoClear", "style", "inputId", "styleClass", "placeholder", "size", "maxlength", "tabindex", "title", "ariaLabel", "ariaRequired", "disabled", "readonly", "unmask", "name", "required", "characterPattern", "autoFocus", "autocomplete", "mask"], outputs: ["onComplete", "onFocus", "onBlur", "onInput", "onKeydown"] }, { type: i3.Dropdown, selector: "p-dropdown", inputs: ["scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "filterPlaceholder", "filterLocale", "inputId", "selectId", "dataKey", "filterBy", "autofocus", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "virtualScroll", "itemSize", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "ariaFilterLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "disabled", "options", "filterValue"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide"] }, { type: i4.AutoComplete, selector: "p-autoComplete", inputs: ["minLength", "delay", "style", "panelStyle", "styleClass", "panelStyleClass", "inputStyle", "inputId", "inputStyleClass", "placeholder", "readonly", "disabled", "virtualScroll", "itemSize", "maxlength", "name", "required", "size", "appendTo", "autoHighlight", "forceSelection", "type", "autoZIndex", "baseZIndex", "ariaLabel", "ariaLabelledBy", "dropdownIcon", "unique", "group", "completeOnFocus", "field", "scrollHeight", "dropdown", "showEmptyMessage", "dropdownMode", "multiple", "tabindex", "dataKey", "emptyMessage", "showTransitionOptions", "hideTransitionOptions", "autofocus", "autocomplete", "optionGroupChildren", "optionGroupLabel", "suggestions"], outputs: ["completeMethod", "onSelect", "onUnselect", "onFocus", "onBlur", "onDropdownClick", "onClear", "onKeyUp", "onShow", "onHide"] }, { type: i5.Calendar, selector: "p-calendar", inputs: ["style", "styleClass", "inputStyle", "inputId", "name", "inputStyleClass", "placeholder", "ariaLabelledBy", "disabled", "dateFormat", "multipleSeparator", "rangeSeparator", "inline", "showOtherMonths", "selectOtherMonths", "showIcon", "icon", "appendTo", "readonlyInput", "shortYearCutoff", "monthNavigator", "yearNavigator", "hourFormat", "timeOnly", "stepHour", "stepMinute", "stepSecond", "showSeconds", "required", "showOnFocus", "showWeek", "dataType", "selectionMode", "maxDateCount", "showButtonBar", "todayButtonStyleClass", "clearButtonStyleClass", "autoZIndex", "baseZIndex", "panelStyleClass", "panelStyle", "keepInvalid", "hideOnDateTimeSelect", "numberOfMonths", "view", "touchUI", "timeSeparator", "focusTrap", "firstDayOfWeek", "showTransitionOptions", "hideTransitionOptions", "tabindex", "defaultDate", "minDate", "maxDate", "disabledDates", "disabledDays", "yearRange", "showTime", "locale"], outputs: ["onFocus", "onBlur", "onClose", "onSelect", "onInput", "onTodayClick", "onClearClick", "onMonthChange", "onYearChange", "onClickOutside", "onShow"] }, { type: i6.InputNumber, selector: "p-inputNumber", inputs: ["showButtons", "format", "buttonLayout", "inputId", "styleClass", "style", "placeholder", "size", "maxlength", "tabindex", "title", "ariaLabel", "ariaRequired", "name", "required", "autocomplete", "min", "max", "incrementButtonClass", "decrementButtonClass", "incrementButtonIcon", "decrementButtonIcon", "step", "inputStyle", "inputStyleClass", "locale", "localeMatcher", "mode", "currency", "currencyDisplay", "useGrouping", "minFractionDigits", "maxFractionDigits", "prefix", "suffix", "disabled"], outputs: ["onInput", "onFocus", "onBlur", "onKeyDown"] }, { type: i7.FileUpload, selector: "p-fileUpload", inputs: ["name", "url", "method", "multiple", "accept", "disabled", "auto", "withCredentials", "maxFileSize", "invalidFileSizeMessageSummary", "invalidFileSizeMessageDetail", "invalidFileTypeMessageSummary", "invalidFileTypeMessageDetail", "invalidFileLimitMessageDetail", "invalidFileLimitMessageSummary", "style", "styleClass", "previewWidth", "chooseLabel", "uploadLabel", "cancelLabel", "chooseIcon", "uploadIcon", "cancelIcon", "showUploadButton", "showCancelButton", "mode", "headers", "customUpload", "fileLimit", "files"], outputs: ["onBeforeUpload", "onSend", "onUpload", "onError", "onClear", "onRemove", "onSelect", "onProgress", "uploadHandler"] }], directives: [{ type: i8.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i8.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { type: i9.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i10.InputText, selector: "[pInputText]" }, { type: i9.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i9.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i11.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
|
|
37
102
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: ControlComponent, decorators: [{
|
|
38
103
|
type: Component,
|
|
39
104
|
args: [{
|
|
@@ -46,7 +111,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImpo
|
|
|
46
111
|
type: Input
|
|
47
112
|
}], value: [{
|
|
48
113
|
type: Input
|
|
114
|
+
}], appendTo: [{
|
|
115
|
+
type: Input
|
|
49
116
|
}], setValue: [{
|
|
50
117
|
type: Output
|
|
118
|
+
}], sendNotification: [{
|
|
119
|
+
type: Output
|
|
51
120
|
}] } });
|
|
52
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJvbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zZi1jcnVkL3NyYy9saWIvY29tcG9uZW50cy9jb250cm9sL2NvbnRyb2wuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2YtY3J1ZC9zcmMvbGliL2NvbXBvbmVudHMvY29udHJvbC9jb250cm9sLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFL0UsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLDBDQUEwQyxDQUFDOzs7Ozs7O0FBTWpFLE1BQU0sT0FBTyxnQkFBZ0I7SUFVM0IsWUFDVSxjQUE4QjtRQUE5QixtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFUL0IsWUFBTyxHQUFVLElBQUksS0FBSyxFQUFFLENBQUM7UUFDN0IsVUFBSyxHQUFXLEVBQUUsQ0FBQztRQUVsQixhQUFRLEdBQXNCLElBQUksWUFBWSxFQUFPLENBQUM7UUFFekQsY0FBUyxHQUFZLEtBQUssQ0FBQztRQUMzQixvQkFBZSxHQUFVLEVBQUUsQ0FBQztJQUkvQixDQUFDO0lBRUwsUUFBUTs7UUFDTixJQUFJLE1BQUEsSUFBSSxDQUFDLE9BQU8sMENBQUUsTUFBTTtZQUFFLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO0lBQ3ZELENBQUM7SUFFRCxTQUFTO1FBQ1AsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFRCxtQkFBbUI7UUFDakIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7UUFDdEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUM7YUFDckgsSUFBSSxDQUFDLENBQUMsR0FBUSxFQUFFLEVBQUU7WUFDakIsSUFBSSxDQUFDLGVBQWUsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDO1lBQ2hDLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ3pCLENBQUMsQ0FBQyxDQUFBO0lBQ04sQ0FBQzs7OEdBN0JVLGdCQUFnQjtrR0FBaEIsZ0JBQWdCLHFKQ1I3Qiw2eUNBcUJlOzRGRGJGLGdCQUFnQjtrQkFKNUIsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsWUFBWTtvQkFDdEIsV0FBVyxFQUFFLDBCQUEwQjtpQkFDeEM7cUdBR1UsT0FBTztzQkFBZixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0ksUUFBUTtzQkFBakIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgR2VuZXJhbFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zaGFyZWQvc2VydmljZXMvZ2VuZXJhbC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU2hlbWEgfSBmcm9tICcuLi8uLi9zaGFyZWQvc2VydmljZXMvbW9kZWxzL3NoZW1hLm1vZGVsJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnc2YtY29udHJvbCcsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2NvbnRyb2wuY29tcG9uZW50Lmh0bWwnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDb250cm9sQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuXHJcbiAgQElucHV0KCkgY29udHJvbDogU2hlbWEgPSBuZXcgU2hlbWEoKTtcclxuICBASW5wdXQoKSBsYWJlbDogc3RyaW5nID0gJyc7XHJcbiAgQElucHV0KCkgdmFsdWU6IGFueTtcclxuICBAT3V0cHV0KCkgc2V0VmFsdWU6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG4gIHB1YmxpYyBpc0xvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgZGF0YUZyb21TZXJ2aWNlOiBhbnlbXSA9IFtdO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgZ2VuZXJhbFNlcnZpY2U6IEdlbmVyYWxTZXJ2aWNlXHJcbiAgKSB7IH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5jb250cm9sPy5jb25maWcpIHRoaXMubG9hZERhdGFGcm9tU2VydmljZSgpO1xyXG4gIH1cclxuXHJcbiAgc2VuZFZhbHVlKCkge1xyXG4gICAgdGhpcy5zZXRWYWx1ZS5lbWl0KHRoaXMudmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgbG9hZERhdGFGcm9tU2VydmljZSgpIHtcclxuICAgIHRoaXMuaXNMb2FkaW5nID0gdHJ1ZTtcclxuICAgIHRoaXMuZ2VuZXJhbFNlcnZpY2UuZ2VuZXJpY1JlcXVlc3QodGhpcy5jb250cm9sLmNvbmZpZy5tZXRob2QsIHRoaXMuY29udHJvbC5jb25maWcuc2VydmVyLCB0aGlzLmNvbnRyb2wuY29uZmlnLmVuZHBvaW50KVxyXG4gICAgICAudGhlbigocmVzOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLmRhdGFGcm9tU2VydmljZSA9IHJlcy5kYXRhO1xyXG4gICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgIH0pXHJcbiAgfVxyXG5cclxufVxyXG4iLCI8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJjb250cm9sLnR5cGVcIj5cclxuICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidzdHJpbmcnXCI+XHJcbiAgICAgICAgPGxhYmVsPnt7bGFiZWx9fTwvbGFiZWw+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwiY29udHJvbC5zdWJ0eXBlXCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidpbnB1dCdcIj5cclxuICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgWyhuZ01vZGVsKV09XCJ2YWx1ZVwiIChmb2N1c291dCk9XCJzZW5kVmFsdWUoKVwiPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3Bhc3N3b3JkJ1wiPlxyXG4gICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInBhc3N3b3JkXCIgWyhuZ01vZGVsKV09XCJ2YWx1ZVwiIChmb2N1c291dCk9XCJzZW5kVmFsdWUoKVwiPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2VudW0nXCI+XHJcbiAgICAgICAgICAgICAgICA8cC1kcm9wZG93biBbb3B0aW9uc109XCJjb250cm9sLmVudW1cIiBbKG5nTW9kZWwpXT1cInZhbHVlXCIgKG9uQ2hhbmdlKT1cInNlbmRWYWx1ZSgpXCJcclxuICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlbGVjY2lvbmUgdW5hIG9wY2nDs25cIj48L3AtZHJvcGRvd24+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInZHJvcGRvd24nXCI+XHJcbiAgICAgICAgICAgICAgICA8cC1kcm9wZG93biBbbGF6eV09XCJpc0xvYWRpbmdcIiBbb3B0aW9uc109XCJkYXRhRnJvbVNlcnZpY2VcIiBbKG5nTW9kZWwpXT1cInZhbHVlXCIgKG9uQ2hhbmdlKT1cInNlbmRWYWx1ZSgpXCJcclxuICAgICAgICAgICAgICAgICAgICBbb3B0aW9uTGFiZWxdPVwiY29udHJvbC5jb25maWcub3B0aW9uTGFiZWxcIiBbb3B0aW9uVmFsdWVdPVwiY29udHJvbC5jb25maWcub3B0aW9uVmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VsZWNjaW9uZSB1bmEgb3BjacOzblwiPjwvcC1kcm9wZG93bj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuPC9uZy1jb250YWluZXI+Il19
|
|
121
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJvbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zZi1jcnVkL3NyYy9saWIvY29tcG9uZW50cy9jb250cm9sL2NvbnRyb2wuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2YtY3J1ZC9zcmMvbGliL2NvbXBvbmVudHMvY29udHJvbC9jb250cm9sLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHL0UsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLDBDQUEwQyxDQUFDOzs7Ozs7Ozs7Ozs7O0FBTWpFLE1BQU0sT0FBTyxnQkFBZ0I7SUFjM0IsWUFDVSxjQUE4QjtRQUE5QixtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFiL0IsWUFBTyxHQUFVLElBQUksS0FBSyxFQUFFLENBQUM7UUFDN0IsVUFBSyxHQUFXLEVBQUUsQ0FBQztRQUdsQixhQUFRLEdBQXNCLElBQUksWUFBWSxFQUFPLENBQUM7UUFDdEQscUJBQWdCLEdBQTBCLElBQUksWUFBWSxFQUFXLENBQUM7UUFFekUsY0FBUyxHQUFZLEtBQUssQ0FBQztRQUMzQixvQkFBZSxHQUFVLEVBQUUsQ0FBQztRQUM1QixrQkFBYSxHQUFVLEVBQUUsQ0FBQztRQUMxQixlQUFVLEdBQVksS0FBSyxDQUFDO0lBSS9CLENBQUM7SUFFTCxRQUFROztRQUNOLElBQUksQ0FBQSxNQUFBLElBQUksQ0FBQyxPQUFPLDBDQUFFLE1BQU0sS0FBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sSUFBSSxVQUFVO1lBQUUsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7SUFDN0YsQ0FBQztJQUVELFNBQVM7UUFDUCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJ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QUFPLEVBQUUsTUFBTSxFQUFFLDZCQUE2QixFQUFFLENBQUMsQ0FBQTtRQUMxRixDQUFDLENBQUMsQ0FBQTtJQUNOLENBQUM7OzhHQTVGVSxnQkFBZ0I7a0dBQWhCLGdCQUFnQixpTkNUN0IsdzdKQTZFZTs0RkRwRUYsZ0JBQWdCO2tCQUo1QixTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxZQUFZO29CQUN0QixXQUFXLEVBQUUsMEJBQTBCO2lCQUN4QztxR0FHVSxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNJLFFBQVE7c0JBQWpCLE1BQU07Z0JBQ0csZ0JBQWdCO3NCQUF6QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBNZXNzYWdlIH0gZnJvbSAncHJpbWVuZy9hcGknO1xyXG5pbXBvcnQgeyBHZW5lcmFsU2VydmljZSB9IGZyb20gJy4uLy4uL3NoYXJlZC9zZXJ2aWNlcy9nZW5lcmFsLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBTaGVtYSB9IGZyb20gJy4uLy4uL3NoYXJlZC9zZXJ2aWNlcy9tb2RlbHMvc2hlbWEubW9kZWwnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdzZi1jb250cm9sJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vY29udHJvbC5jb21wb25lbnQuaHRtbCdcclxufSlcclxuZXhwb3J0IGNsYXNzIENvbnRyb2xDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG5cclxuICBASW5wdXQoKSBjb250cm9sOiBTaGVtYSA9IG5ldyBTaGVtYSgpO1xyXG4gIEBJbnB1dCgpIGxhYmVsOiBzdHJpbmcgPSAnJztcclxuICBASW5wdXQoKSB2YWx1ZTogYW55O1xyXG4gIEBJbnB1dCgpIGFwcGVuZFRvOiBhbnk7XHJcbiAgQE91dHB1dCgpIHNldFZhbHVlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKSBzZW5kTm90aWZpY2F0aW9uOiBFdmVudEVtaXR0ZXI8TWVzc2FnZT4gPSBuZXcgRXZlbnRFbWl0dGVyPE1lc3NhZ2U+KCk7XHJcblxyXG4gIHB1YmxpYyBpc0xvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgZGF0YUZyb21TZXJ2aWNlOiBhbnlbXSA9IFtdO1xyXG4gIHB1YmxpYyB1cGxvYWRlZEZpbGVzOiBhbnlbXSA9IFtdO1xyXG4gIHB1YmxpYyBkaXNwbGF5QWRkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBnZW5lcmFsU2VydmljZTogR2VuZXJhbFNlcnZpY2VcclxuICApIHsgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmNvbnRyb2w/LmNvbmZpZyAmJiB0aGlzLmNvbnRyb2wuc3VidHlwZSA9PSAnZHJvcGRvd24nKSB0aGlzLmxvYWREYXRhRnJvbVNlcnZpY2UoKTtcclxuICB9XHJcblxyXG4gIHNlbmRWYWx1ZSgpIHtcclxuICAgIHRoaXMuc2V0VmFsdWUuZW1pdCh0aGlzLnZhbHVlKTtcclxuICB9XHJcblxyXG4gIHNlbmRWYWx1ZUZyb21PYmplY3QoZXZlbnQ6IGFueSkge1xyXG4gICAgc3dpdGNoICh0eXBlb2YgKHRoaXMuY29udHJvbC5jb25maWcub3B0aW9uVmFsdWUpKSB7XHJcbiAgICAgIGNhc2UgJ29iamVjdCc6XHJcbiAgICAgICAgdGhpcy5jb250cm9sLmNvbmZpZy5vcHRpb25WYWx1ZS5mb3JFYWNoKChvcDogYW55KSA9PiBvcFsndmFsdWUnXSA9IGV2ZW50W29wLmtleV0pXHJcbiAgICAgICAgdGhpcy5zZXRWYWx1ZS5lbWl0KHRoaXMuY29udHJvbC5jb25maWcub3B0aW9uVmFsdWUpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHRoaXMuc2V0VmFsdWUuZW1pdChldmVudFt0aGlzLmNvbnRyb2wuY29uZmlnLm9wdGlvblZhbHVlXSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB2YWxpZGF0ZVZhbHVlKHR5cGU6IHN0cmluZykge1xyXG4gICAgc3dpdGNoICh0eXBlKSB7XHJcbiAgICAgIGNhc2UgJ2VtYWlsJzpcclxuICAgICAgICBsZXQgcmVnZXg6IFJlZ0V4cCA9IG5ldyBSZWdFeHAoLyhbXFx3XFwuXFwtX10rKT9cXHcrQFtcXHctX10rKFxcLlxcdyspezEsfS9pZ20pO1xyXG4gICAgICAgIGlmIChyZWdleC50ZXN0KHRoaXMudmFsdWUpKSB0aGlzLnNlbmRWYWx1ZSgpO1xyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy52YWx1ZSA9IG51bGw7XHJcbiAgICAgICAgICB0aGlzLnNlbmRWYWx1ZSgpXHJcbiAgICAgICAgICB0aGlzLnNlbmROb3RpZmljYXRpb24uZW1pdCh7IHNldmVyaXR5OiAnd2FybicsIGRldGFpbDogJ0VsIGNvcnJlbyBubyBlcyB2w6FsaWRvJyB9KVxyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGxvYWREYXRhRnJvbVNlcnZpY2UoKSB7XHJcbiAgICB0aGlzLmlzTG9hZGluZyA9IHRydWU7XHJcbiAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLmdlbmVyaWNSZXF1ZXN0KHRoaXMuY29udHJvbC5jb25maWcubWV0aG9kLCB0aGlzLmNvbnRyb2wuY29uZmlnLnNlcnZlciwgdGhpcy5jb250cm9sLmNvbmZpZy5lbmRwb2ludClcclxuICAgICAgLnRoZW4oKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy5kYXRhRnJvbVNlcnZpY2UgPSByZXMuZGF0YTtcclxuICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICB9KVxyXG4gIH1cclxuXHJcbiAgbG9hZERhdGFGcm9tQ29udHJvbEJ1c3F1ZWRhU2VydmljZShldmVudDogYW55KSB7XHJcbiAgICB0aGlzLmlzTG9hZGluZyA9IHRydWU7XHJcbiAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLmdlbmVyaWNSZXF1ZXN0KHRoaXMuY29udHJvbC5jb25maWcubWV0aG9kLCB0aGlzLmNvbnRyb2wuY29uZmlnLnNlcnZlciwgdGhpcy5jb250cm9sLmNvbmZpZy5lbmRwb2ludC5yZXBsYWNlKCdAcXVlcnknLCBldmVudD8ucXVlcnkgfHwgJycpKVxyXG4gICAgICAudGhlbigocmVzOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLmRhdGFGcm9tU2VydmljZSA9IHJlcy5kYXRhO1xyXG4gICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgIH0pXHJcbiAgfVxyXG5cclxuICBvblVwbG9hZChldmVudDogYW55KSB7XHJcbiAgICBsZXQgZmlsZSA9IGV2ZW50LmZpbGVzWzBdO1xyXG4gICAgbGV0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7XHJcbiAgICBsZXQgcGF0aCA9ICdJbWFnZW5lcy9DUlVEL3RlbXAnO1xyXG4gICAgZm9ybURhdGEuYXBwZW5kKCd1cGxvYWRGaWxlJywgZmlsZSk7XHJcbiAgICBmb3JtRGF0YS5hcHBlbmQoJ1J1dGEnLCBgLyR7cGF0aH1gKTtcclxuICAgIHRoaXMuaXNMb2FkaW5nID0gdHJ1ZTtcclxuICAgIHRoaXMuZ2VuZXJhbFNlcnZpY2UuZ2VuZXJpY1JlcXVlc3QodGhpcy5jb250cm9sLmNvbmZpZy5tZXRob2QsIHRoaXMuY29udHJvbC5jb25maWcuc2VydmVyLCB0aGlzLmNvbnRyb2wuY29uZmlnLmVuZHBvaW50LCBmb3JtRGF0YSlcclxuICAgICAgLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuc2VuZE5vdGlmaWNhdGlvbi5lbWl0KHsgc2V2ZXJpdHk6ICdpbmZvJywgZGV0YWlsOiBgQXJjaGl2byBjYXJnYWRvIGNvcnJlY3RhbWVudGUhYCB9KVxyXG4gICAgICAgIHRoaXMudXBsb2FkZWRGaWxlcy5wdXNoKGZpbGUpO1xyXG4gICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy52YWx1ZSA9IGAke3RoaXMuZ2VuZXJhbFNlcnZpY2UuanNvbkNvbmZpZy5TZXJ2ZXJ9JHtwYXRofS8ke2ZpbGUubmFtZX1gXHJcbiAgICAgICAgdGhpcy5zZW5kVmFsdWUoKVxyXG4gICAgICB9KVxyXG4gICAgICAuY2F0Y2goZXJyID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZyhlcnIpXHJcbiAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZVxyXG4gICAgICAgIHRoaXMuc2VuZE5vdGlmaWNhdGlvbi5lbWl0KHsgc2V2ZXJpdHk6ICdlcnJvcicsIGRldGFpbDogYEVycm9yIGFsIGNhcmdhciBlbCBhcmNoaXZvIWAgfSlcclxuICAgICAgfSlcclxuICB9XHJcbn1cclxuIiwiPCEtLSA8cC1ibG9ja1VJIFtibG9ja2VkXT1cImlzTG9hZGluZ1wiIFt0YXJnZXRdPVwiY2NcIj5cclxuICAgIDxpIGNsYXNzPVwicGkgcGktY29nIHBpLXNwaW5cIiBzdHlsZT1cImZvbnQtc2l6ZTogNTBweFwiPjwvaT5cclxuPC9wLWJsb2NrVUk+IC0tPlxyXG5cclxuPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwiY29udHJvbC50eXBlXCI+XHJcbiAgICA8bGFiZWw+e3tsYWJlbH19PC9sYWJlbD5cclxuICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidzdHJpbmcnXCI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwiY29udHJvbC5zdWJ0eXBlXCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidpbnB1dCdcIj5cclxuICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgWyhuZ01vZGVsKV09XCJ2YWx1ZVwiIChmb2N1c291dCk9XCJzZW5kVmFsdWUoKVwiPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3Bhc3N3b3JkJ1wiPlxyXG4gICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInBhc3N3b3JkXCIgWyhuZ01vZGVsKV09XCJ2YWx1ZVwiIChmb2N1c291dCk9XCJzZW5kVmFsdWUoKVwiPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2VtYWlsJ1wiPlxyXG4gICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cInZhbHVlXCIgcGxhY2Vob2xkZXI9XCJlbWFpbEBleGFtcGxlLmNvbVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGZvY3Vzb3V0KT1cInZhbGlkYXRlVmFsdWUoJ2VtYWlsJylcIj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidwaG9uZSdcIj5cclxuICAgICAgICAgICAgICAgIDxwLWlucHV0TWFzayBtYXNrPVwiKDk5OSkgOTk5LTk5OTlcIiBbKG5nTW9kZWwpXT1cInZhbHVlXCIgcGxhY2Vob2xkZXI9XCIoOTk5KSA5OTktOTk5OVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGZvY3Vzb3V0KT1cInNlbmRWYWx1ZSgpXCI+PC9wLWlucHV0TWFzaz5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidlbnVtJ1wiPlxyXG4gICAgICAgICAgICAgICAgPHAtZHJvcGRvd24gW29wdGlvbnNdPVwiY29udHJvbC5lbnVtXCIgWyhuZ01vZGVsKV09XCJ2YWx1ZVwiIChvbkNoYW5nZSk9XCJzZW5kVmFsdWUoKVwiIFthcHBlbmRUb109XCJhcHBlbmRUb1wiXHJcbiAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWxlY2Npb25lIHVuYSBvcGNpw7NuXCI+PC9wLWRyb3Bkb3duPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2Ryb3Bkb3duJ1wiPlxyXG4gICAgICAgICAgICAgICAgPHAtZHJvcGRvd24gW2xhenldPVwiaXNMb2FkaW5nXCIgW29wdGlvbnNdPVwiZGF0YUZyb21TZXJ2aWNlXCIgWyhuZ01vZGVsKV09XCJ2YWx1ZVwiIChvbkNoYW5nZSk9XCJzZW5kVmFsdWUoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW29wdGlvbkxhYmVsXT1cImNvbnRyb2wuY29uZmlnLm9wdGlvbkxhYmVsXCIgW29wdGlvblZhbHVlXT1cImNvbnRyb2wuY29uZmlnLm9wdGlvblZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICBbYXBwZW5kVG9dPVwiYXBwZW5kVG9cIiBwbGFjZWhvbGRlcj1cIlNlbGVjY2lvbmUgdW5hIG9wY2nDs25cIj48L3AtZHJvcGRvd24+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInYXV0b2NvbXBsZXRlJ1wiPlxyXG4gICAgICAgICAgICAgICAgPHAtYXV0b0NvbXBsZXRlIFtzaG93RW1wdHlNZXNzYWdlXT1cInRydWVcIiBbc3VnZ2VzdGlvbnNdPVwiZGF0YUZyb21TZXJ2aWNlXCIgW2FwcGVuZFRvXT1cImFwcGVuZFRvXCJcclxuICAgICAgICAgICAgICAgICAgICAoY29tcGxldGVNZXRob2QpPVwibG9hZERhdGFGcm9tQ29udHJvbEJ1c3F1ZWRhU2VydmljZSgkZXZlbnQpXCIgW2ZpZWxkXT1cImNvbnRyb2wuZmllbGRcIlxyXG4gICAgICAgICAgICAgICAgICAgIFttaW5MZW5ndGhdPVwiMVwiIChvblNlbGVjdCk9XCJzZW5kVmFsdWVGcm9tT2JqZWN0KCRldmVudClcIj48L3AtYXV0b0NvbXBsZXRlPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2RhdGUnXCI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwiY29udHJvbC5zdWJ0eXBlXCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidjYWxlbmRhcidcIj5cclxuICAgICAgICAgICAgICAgIDxwLWNhbGVuZGFyIFsobmdNb2RlbCldPVwidmFsdWVcIiAob25TZWxlY3QpPVwic2VuZFZhbHVlKClcIiBbbW9udGhOYXZpZ2F0b3JdPVwidHJ1ZVwiIFt5ZWFyTmF2aWdhdG9yXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgIHllYXJSYW5nZT1cIjE5MDA6MjAzNVwiIFtkYXRlRm9ybWF0XT1cImNvbnRyb2w/LmZvcm1hdCB8fCAneXktbW0tZGQnXCIgW2FwcGVuZFRvXT1cImFwcGVuZFRvXCI+PC9wLWNhbGVuZGFyPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ251bWVyaWMnXCI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwiY29udHJvbC5zdWJ0eXBlXCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidjdXJyZW5jeSdcIj5cclxuICAgICAgICAgICAgICAgIDxwLWlucHV0TnVtYmVyIFsobmdNb2RlbCldPVwidmFsdWVcIiBtb2RlPVwiY3VycmVuY3lcIiBbbWluRnJhY3Rpb25EaWdpdHNdPVwiY29udHJvbD8ubWluRnJhY3Rpb25EaWdpdHMgfHwgMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW21pbl09XCJjb250cm9sPy5taW4gfHwgbnVsbFwiIFttYXhdPVwiY29udHJvbD8ubWF4IHx8IG51bGxcIiAoZm9jdXNvdXQpPVwic2VuZFZhbHVlKClcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtjdXJyZW5jeV09XCJjb250cm9sPy5jdXJyZW5jeSB8fCAnVVNEJ1wiPjwvcC1pbnB1dE51bWJlcj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidkZWNpbWFsJ1wiPlxyXG4gICAgICAgICAgICAgICAgPHAtaW5wdXROdW1iZXIgWyhuZ01vZGVsKV09XCJ2YWx1ZVwiIG1vZGU9XCJkZWNpbWFsXCIgKGZvY3Vzb3V0KT1cInNlbmRWYWx1ZSgpXCIgW21pbl09XCJjb250cm9sPy5taW4gfHwgbnVsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW21heF09XCJjb250cm9sPy5tYXggfHwgbnVsbFwiIFttaW5GcmFjdGlvbkRpZ2l0c109XCJjb250cm9sPy5taW5GcmFjdGlvbkRpZ2l0cyB8fCAwXCI+PC9wLWlucHV0TnVtYmVyPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3BlcmNlbnRhZ2UnXCI+XHJcbiAgICAgICAgICAgICAgICA8cC1pbnB1dE51bWJlciBbKG5nTW9kZWwpXT1cInZhbHVlXCIgc3VmZml4PVwiICVcIiAoZm9jdXNvdXQpPVwic2VuZFZhbHVlKClcIiBbbWluXT1cImNvbnRyb2w/Lm1pbiB8fCBudWxsXCJcclxuICAgICAgICAgICAgICAgICAgICBbbWF4XT1cImNvbnRyb2w/Lm1heCB8fCBudWxsXCIgW21pbkZyYWN0aW9uRGlnaXRzXT1cImNvbnRyb2w/Lm1pbkZyYWN0aW9uRGlnaXRzIHx8IDJcIj48L3AtaW5wdXROdW1iZXI+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInZmlsZSdcIj5cclxuICAgICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJjb250cm9sLnN1YnR5cGVcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2ZpbGV0bXAnXCI+XHJcbiAgICAgICAgICAgICAgICA8cC1maWxlVXBsb2FkIFthY2NlcHRdPVwiY29udHJvbC5jb25maWcuYWNjZXB0XCIgW2N1c3RvbVVwbG9hZF09XCJ0cnVlXCIgKHVwbG9hZEhhbmRsZXIpPVwib25VcGxvYWQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW21heEZpbGVTaXplXT1cImNvbnRyb2wuY29uZmlnPy5tYXhGaWxlU2l6ZSB8fCBudWxsXCIgZmlsZUxpbWl0PVwiMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJjb250ZW50XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx1bCAqbmdJZj1cInVwbG9hZGVkRmlsZXMubGVuZ3RoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgKm5nRm9yPVwibGV0IGZpbGUgb2YgdXBsb2FkZWRGaWxlc1wiPnt7ZmlsZS5uYW1lfX0gLSB7e2ZpbGUuc2l6ZX19IGJ5dGVzPC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC91bD5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPC9wLWZpbGVVcGxvYWQ+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbjwvbmctY29udGFpbmVyPiJdfQ==
|
|
@@ -1,29 +1,36 @@
|
|
|
1
|
-
import { Component, Input } from '@angular/core';
|
|
1
|
+
import { Component, EventEmitter, Input, Output } from '@angular/core';
|
|
2
2
|
import { CrudConfig, Operations } from '../../shared/services/models/crud-config.model';
|
|
3
|
-
import
|
|
3
|
+
import { DialogService, DynamicDialogConfig, DynamicDialogRef } from 'primeng/dynamicdialog';
|
|
4
4
|
import { MessageService } from 'primeng/api';
|
|
5
|
+
import { RegistroChildComponent } from '../registro-child/registro-child.component';
|
|
6
|
+
import * as jsonpath from 'jsonpath';
|
|
5
7
|
import * as i0 from "@angular/core";
|
|
6
8
|
import * as i1 from "../../shared/services/general.service";
|
|
7
9
|
import * as i2 from "@angular/router";
|
|
8
10
|
import * as i3 from "primeng/api";
|
|
9
|
-
import * as i4 from "primeng/
|
|
10
|
-
import * as i5 from "primeng/
|
|
11
|
-
import * as i6 from "
|
|
12
|
-
import * as i7 from "
|
|
13
|
-
import * as i8 from "primeng/
|
|
14
|
-
import * as i9 from "
|
|
11
|
+
import * as i4 from "primeng/dynamicdialog";
|
|
12
|
+
import * as i5 from "primeng/blockui";
|
|
13
|
+
import * as i6 from "primeng/toast";
|
|
14
|
+
import * as i7 from "../control/control.component";
|
|
15
|
+
import * as i8 from "primeng/table";
|
|
16
|
+
import * as i9 from "@angular/common";
|
|
17
|
+
import * as i10 from "primeng/button";
|
|
18
|
+
import * as i11 from "primeng/ripple";
|
|
15
19
|
export class RegistroComponent {
|
|
16
|
-
constructor(generalService, router, messageSerice) {
|
|
20
|
+
constructor(generalService, router, messageSerice, dialogService) {
|
|
17
21
|
this.generalService = generalService;
|
|
18
22
|
this.router = router;
|
|
19
23
|
this.messageSerice = messageSerice;
|
|
24
|
+
this.dialogService = dialogService;
|
|
20
25
|
this.idKatios = '';
|
|
21
26
|
this.idEntidad = '';
|
|
22
27
|
this.trx = '';
|
|
23
28
|
this.id = '';
|
|
24
|
-
this.
|
|
29
|
+
this.sendData = new EventEmitter();
|
|
25
30
|
this.crudConfig = new CrudConfig();
|
|
31
|
+
this.enProceso = false;
|
|
26
32
|
this.configOperation = new Operations();
|
|
33
|
+
this.isLocal = false;
|
|
27
34
|
}
|
|
28
35
|
ngOnInit() {
|
|
29
36
|
this.loadConfigCrud();
|
|
@@ -34,6 +41,7 @@ export class RegistroComponent {
|
|
|
34
41
|
this.generalService.getCrudByEntidad(this.idKatios, this.idEntidad)
|
|
35
42
|
.then(res => {
|
|
36
43
|
this.crudConfig = res;
|
|
44
|
+
console.log(this.crudConfig);
|
|
37
45
|
if (this.trx != 'c')
|
|
38
46
|
this.getInfoRegistro(this.crudConfig.registro);
|
|
39
47
|
else {
|
|
@@ -82,16 +90,29 @@ export class RegistroComponent {
|
|
|
82
90
|
return jsonpath.query(this.data, scope.replace('.properties', ''))[0];
|
|
83
91
|
}
|
|
84
92
|
setValue(value, scope) {
|
|
85
|
-
|
|
93
|
+
switch (typeof (value)) {
|
|
94
|
+
case 'object':
|
|
95
|
+
value.forEach((val) => jsonpath.value(this.data, val.scope.replace('.properties', ''), val.value));
|
|
96
|
+
break;
|
|
97
|
+
default:
|
|
98
|
+
jsonpath.value(this.data, scope.replace('.properties', ''), value);
|
|
99
|
+
break;
|
|
100
|
+
}
|
|
86
101
|
}
|
|
87
102
|
createObject(esquema) {
|
|
88
103
|
let object = {};
|
|
89
104
|
switch (esquema.type) {
|
|
105
|
+
case 'numeric':
|
|
106
|
+
return (esquema === null || esquema === void 0 ? void 0 : esquema.default) || 0;
|
|
90
107
|
case 'string':
|
|
91
|
-
case '
|
|
92
|
-
return (esquema === null || esquema === void 0 ? void 0 : esquema.default)
|
|
108
|
+
case 'date':
|
|
109
|
+
return (esquema === null || esquema === void 0 ? void 0 : esquema.default) ? this.setDefaultValue(esquema.default) : null;
|
|
93
110
|
case 'boolean':
|
|
94
111
|
return (esquema === null || esquema === void 0 ? void 0 : esquema.default) || false;
|
|
112
|
+
case 'array':
|
|
113
|
+
return [];
|
|
114
|
+
case 'file':
|
|
115
|
+
return null;
|
|
95
116
|
case 'object':
|
|
96
117
|
for (const key in esquema === null || esquema === void 0 ? void 0 : esquema.properties) {
|
|
97
118
|
Object.defineProperty(object, key, { value: this.createObject(esquema === null || esquema === void 0 ? void 0 : esquema.properties[key]), writable: true, enumerable: true, configurable: true });
|
|
@@ -103,6 +124,7 @@ export class RegistroComponent {
|
|
|
103
124
|
return object;
|
|
104
125
|
}
|
|
105
126
|
submit() {
|
|
127
|
+
console.log(this.data);
|
|
106
128
|
if (!this.validateData())
|
|
107
129
|
return;
|
|
108
130
|
this.enProceso = true;
|
|
@@ -129,26 +151,108 @@ export class RegistroComponent {
|
|
|
129
151
|
return true;
|
|
130
152
|
}
|
|
131
153
|
validateDataLocal() {
|
|
154
|
+
var _a, _b;
|
|
132
155
|
let err = [];
|
|
133
|
-
this.configOperation.validations.required.forEach(x => {
|
|
156
|
+
(_a = this.configOperation.validations) === null || _a === void 0 ? void 0 : _a.required.forEach(x => {
|
|
134
157
|
if (!jsonpath.query(this.data, x.field)[0])
|
|
135
158
|
err.push(x.message);
|
|
136
159
|
});
|
|
160
|
+
(_b = this.configOperation.validations) === null || _b === void 0 ? void 0 : _b.operations.forEach();
|
|
137
161
|
if (err.length != 0)
|
|
138
162
|
this.messageSerice.add({ severity: 'warn', detail: err.join('. ') });
|
|
139
163
|
return err.length == 0;
|
|
140
164
|
}
|
|
165
|
+
setDefaultValue(value) {
|
|
166
|
+
let data = null;
|
|
167
|
+
let uactivo;
|
|
168
|
+
switch (value) {
|
|
169
|
+
case '@uactivo':
|
|
170
|
+
uactivo = JSON.parse(localStorage.getItem('oSessionTFM') || '{}');
|
|
171
|
+
if (!uactivo)
|
|
172
|
+
console.log('Validar configuracion de sesion');
|
|
173
|
+
else
|
|
174
|
+
data = `${uactivo.UsuarioSistema.TDOC}-${uactivo.UsuarioSistema.NDOC}`;
|
|
175
|
+
break;
|
|
176
|
+
case '@tdocactivo':
|
|
177
|
+
uactivo = JSON.parse(sessionStorage.getItem('usrSesion') || '{}');
|
|
178
|
+
if (!uactivo)
|
|
179
|
+
console.log('Validar configuracion de sesion');
|
|
180
|
+
else
|
|
181
|
+
data = uactivo.UsuarioSistema.TDOC;
|
|
182
|
+
break;
|
|
183
|
+
case '@ndocactivo':
|
|
184
|
+
uactivo = JSON.parse(sessionStorage.getItem('usrSesion') || '{}');
|
|
185
|
+
if (!uactivo)
|
|
186
|
+
console.log('Validar configuracion de sesion');
|
|
187
|
+
else
|
|
188
|
+
data = uactivo.UsuarioSistema.NDOC;
|
|
189
|
+
break;
|
|
190
|
+
case '@hoy':
|
|
191
|
+
data = new Date();
|
|
192
|
+
break;
|
|
193
|
+
default:
|
|
194
|
+
data = value;
|
|
195
|
+
break;
|
|
196
|
+
}
|
|
197
|
+
return data;
|
|
198
|
+
}
|
|
199
|
+
sendNotification(message) {
|
|
200
|
+
this.messageSerice.add(message);
|
|
201
|
+
}
|
|
202
|
+
addObjectArray(element) {
|
|
203
|
+
this.dialogRef = this.dialogService.open(RegistroChildComponent, {
|
|
204
|
+
header: `Detalle`,
|
|
205
|
+
width: '70%',
|
|
206
|
+
modal: true,
|
|
207
|
+
closable: false,
|
|
208
|
+
data: {
|
|
209
|
+
uiEsquema: Object.assign({}, element.elements),
|
|
210
|
+
esquema: this.getControl(element.scope),
|
|
211
|
+
id: this.getValue(element.scope).length + 1
|
|
212
|
+
}
|
|
213
|
+
});
|
|
214
|
+
this.dialogRef.onClose.subscribe((data) => {
|
|
215
|
+
if (data)
|
|
216
|
+
this.data[element.scope.replace('$..properties.', '')].push(data);
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
editRow(element, data) {
|
|
220
|
+
this.dialogRef = this.dialogService.open(RegistroChildComponent, {
|
|
221
|
+
header: `Detalle`,
|
|
222
|
+
width: '70%',
|
|
223
|
+
modal: true,
|
|
224
|
+
closable: false,
|
|
225
|
+
data: {
|
|
226
|
+
uiEsquema: Object.assign({}, element.elements),
|
|
227
|
+
esquema: this.getControl(element.scope),
|
|
228
|
+
data: Object.assign({}, data)
|
|
229
|
+
}
|
|
230
|
+
});
|
|
231
|
+
this.dialogRef.onClose.subscribe((data) => {
|
|
232
|
+
if (data)
|
|
233
|
+
this.data[element.scope.replace('$..properties.', '')][data.id - 1] = data;
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
deleteRow(element, index) {
|
|
237
|
+
this.data[element.scope.replace('$..properties.', '')].splice(index - 1, 1);
|
|
238
|
+
index = 1;
|
|
239
|
+
this.data[element.scope.replace('$..properties.', '')].forEach((el) => {
|
|
240
|
+
el.id = index;
|
|
241
|
+
index++;
|
|
242
|
+
});
|
|
243
|
+
}
|
|
141
244
|
}
|
|
142
|
-
RegistroComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: RegistroComponent, deps: [{ token: i1.GeneralService }, { token: i2.Router }, { token: i3.MessageService }], target: i0.ɵɵFactoryTarget.Component });
|
|
143
|
-
RegistroComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: RegistroComponent, selector: "sf-registro", inputs: { idKatios: "idKatios", idEntidad: "idEntidad", trx: "trx", id: "id" }, providers: [MessageService], ngImport: i0, template: "<p-blockUI [blocked]=\"enProceso\">\r\n <i class=\"pi pi-cog pi-spin\" style=\"font-size: 50px\"></i>\r\n</p-blockUI>\r\n\r\n<p-toast></p-toast>\r\n\r\n<div class=\"card\" *ngIf=\"!enProceso\">\r\n <h5 class=\"card-header mb-2\" style=\"display: flex; justify-content: space-between;align-items: center;\">\r\n <span>{{idEntidad}} {{id != '' ? '-' + id : ''}}</span>\r\n <button pButton pRipple type=\"button\" icon=\"pi pi-arrow-left\" (click)=\"back()\"></button>\r\n </h5>\r\n <div *ngFor=\"let element of crudConfig.uiEsquema.elements\" [class]=\"element?.class\">\r\n <ng-container [ngSwitch]=\"element.type\">\r\n <div *ngSwitchCase=\"'Label'\" [style]=\"element?.style\">\r\n {{element?.label}}\r\n </div>\r\n <ng-container *ngSwitchCase=\"'HorizontalLayout'\">\r\n <div *ngFor=\"let el of element.elements\" [class]=\"el?.class\">\r\n <ng-container [ngSwitch]=\"el.type\"
|
|
245
|
+
RegistroComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: RegistroComponent, deps: [{ token: i1.GeneralService }, { token: i2.Router }, { token: i3.MessageService }, { token: i4.DialogService }], target: i0.ɵɵFactoryTarget.Component });
|
|
246
|
+
RegistroComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: RegistroComponent, selector: "sf-registro", inputs: { idKatios: "idKatios", idEntidad: "idEntidad", trx: "trx", id: "id" }, outputs: { sendData: "sendData" }, providers: [MessageService, DialogService, DynamicDialogConfig, DynamicDialogRef], ngImport: i0, template: "<p-blockUI [blocked]=\"enProceso\">\r\n <i class=\"pi pi-cog pi-spin\" style=\"font-size: 50px\"></i>\r\n</p-blockUI>\r\n\r\n<p-toast></p-toast>\r\n\r\n<div class=\"card\" *ngIf=\"!enProceso\">\r\n <h5 class=\"card-header mb-2\" style=\"display: flex; justify-content: space-between;align-items: center;\">\r\n <span>{{crudConfig.registro?.label || idEntidad}} {{id != '' ? '-' + id : ''}}</span>\r\n <button pButton pRipple type=\"button\" icon=\"pi pi-arrow-left\" (click)=\"back()\"></button>\r\n </h5>\r\n <div *ngFor=\"let element of crudConfig.uiEsquema.elements\" [class]=\"element?.class\">\r\n <ng-container [ngSwitch]=\"element.type\">\r\n <div *ngSwitchCase=\"'Label'\" [style]=\"element?.style\">\r\n {{element?.label}}\r\n </div>\r\n <ng-container *ngSwitchCase=\"'HorizontalLayout'\">\r\n <div *ngFor=\"let el of element.elements\" [class]=\"el?.class\">\r\n <ng-container [ngSwitch]=\"el.type\">\r\n <sf-control *ngSwitchCase=\"'Control'\" [control]=\"getControl(el.scope)\" [label]=\"el.label\"\r\n [value]=\"getValue(el.scope)\" (setValue)=\"setValue($event, el.scope)\"\r\n (sendNotification)=\"sendNotification($event)\"></sf-control>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'VerticalLayout'\">\r\n <div *ngFor=\"let el of element.elements\" [class]=\"el?.class\">\r\n <ng-container [ngSwitch]=\"el.type\">\r\n <sf-control *ngSwitchCase=\"'Control'\" [control]=\"getControl(el.scope)\" [label]=\"el.label\"\r\n [value]=\"getValue(el.scope)\" (setValue)=\"setValue($event, el.scope)\"\r\n (sendNotification)=\"sendNotification($event)\"></sf-control>\r\n <ng-container *ngSwitchCase=\"'Table'\">\r\n <p-table [value]=\"getValue(el.scope)\" [columns]=\"getControl(el.scope).config.columns\">\r\n <ng-template pTemplate=\"caption\">\r\n <div class=\"flex align-items-center justify-content-between\">\r\n <button pButton pRipple icon=\"pi pi-plus\" (click)=\"addObjectArray(el)\"\r\n class=\"p-button-success\"></button>\r\n </div>\r\n </ng-template>\r\n <ng-template pTemplate=\"header\" let-columns>\r\n <tr>\r\n <th *ngFor=\"let col of columns\">\r\n {{col.label}}\r\n </th>\r\n <ng-container *ngIf=\"trx == 'c' || trx == 'u'\">\r\n <th></th>\r\n </ng-container>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-rowData let-columns=\"columns\" let-rowIndex=\"rowIndex\">\r\n <tr>\r\n <ng-container *ngFor=\"let col of columns\" [ngSwitch]=\"col.type\">\r\n <ng-container *ngSwitchCase=\"'text'\">\r\n <td>{{rowData[col.col]}}</td>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'currency:USD'\">\r\n <td>{{rowData[col.col] | currency: 'USD'}}</td>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"trx == 'c' || trx == 'u'\">\r\n <td>\r\n <!-- <button pButton pRipple type=\"button\" (click)=\"editRow(el, rowData)\" icon=\"pi pi-pencil\" class=\"p-button-rounded p-button-info mr-1\"></button> -->\r\n <button pButton pRipple type=\"button\" (click)=\"deleteRow(el, rowIndex)\" icon=\"pi pi-trash\" class=\"p-button-rounded p-button-danger\"></button>\r\n </td>\r\n </ng-container>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'Control'\">\r\n <sf-control [control]=\"getControl(element.scope)\" [label]=\"element.label\"></sf-control>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n <div class=\"card-footer mt-2\" *ngIf=\"btnSubmit\">\r\n <button pButton pRipple type=\"button\" [icon]=\"btnSubmit.icon\" [label]=\"btnSubmit.label\"\r\n (click)=\"submit()\"></button>\r\n </div>\r\n</div>\r\n", components: [{ type: i5.BlockUI, selector: "p-blockUI", inputs: ["target", "autoZIndex", "baseZIndex", "styleClass", "blocked"] }, { type: i6.Toast, selector: "p-toast", inputs: ["key", "autoZIndex", "baseZIndex", "style", "styleClass", "position", "preventOpenDuplicates", "preventDuplicates", "showTransformOptions", "hideTransformOptions", "showTransitionOptions", "hideTransitionOptions", "breakpoints"], outputs: ["onClose"] }, { type: i7.ControlComponent, selector: "sf-control", inputs: ["control", "label", "value", "appendTo"], outputs: ["setValue", "sendNotification"] }, { type: i8.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "style", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "scrollDirection", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollDelay", "virtualRowHeight", "frozenWidth", "responsive", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "autoLayout", "exportFunction", "stateKey", "stateStorage", "editMode", "groupRowsBy", "minBufferPx", "maxBufferPx", "responsiveLayout", "breakpoint", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection"], outputs: ["selectionChange", "contextMenuSelectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }], directives: [{ type: i9.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i10.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading"] }, { type: i11.Ripple, selector: "[pRipple]" }, { type: i9.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i9.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i9.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { type: i3.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }], pipes: { "currency": i9.CurrencyPipe } });
|
|
144
247
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: RegistroComponent, decorators: [{
|
|
145
248
|
type: Component,
|
|
146
249
|
args: [{
|
|
147
250
|
selector: 'sf-registro',
|
|
148
251
|
templateUrl: './registro.component.html',
|
|
149
|
-
providers: [MessageService]
|
|
252
|
+
providers: [MessageService, DialogService, DynamicDialogConfig, DynamicDialogRef],
|
|
253
|
+
entryComponents: [RegistroComponent]
|
|
150
254
|
}]
|
|
151
|
-
}], ctorParameters: function () { return [{ type: i1.GeneralService }, { type: i2.Router }, { type: i3.MessageService }]; }, propDecorators: { idKatios: [{
|
|
255
|
+
}], ctorParameters: function () { return [{ type: i1.GeneralService }, { type: i2.Router }, { type: i3.MessageService }, { type: i4.DialogService }]; }, propDecorators: { idKatios: [{
|
|
152
256
|
type: Input
|
|
153
257
|
}], idEntidad: [{
|
|
154
258
|
type: Input
|
|
@@ -156,5 +260,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImpo
|
|
|
156
260
|
type: Input
|
|
157
261
|
}], id: [{
|
|
158
262
|
type: Input
|
|
263
|
+
}], sendData: [{
|
|
264
|
+
type: Output
|
|
159
265
|
}] } });
|
|
160
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaXN0cm8uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2YtY3J1ZC9zcmMvbGliL2NvbXBvbmVudHMvcmVnaXN0cm8vcmVnaXN0cm8uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2YtY3J1ZC9zcmMvbGliL2NvbXBvbmVudHMvcmVnaXN0cm8vcmVnaXN0cm8uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFHekQsT0FBTyxFQUFrQixVQUFVLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFDeEcsT0FBTyxLQUFLLFFBQVEsTUFBTSxVQUFVLENBQUM7QUFFckMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGFBQWEsQ0FBQzs7Ozs7Ozs7Ozs7QUFRN0MsTUFBTSxPQUFPLGlCQUFpQjtJQWE1QixZQUNVLGNBQThCLEVBQzlCLE1BQWMsRUFDZCxhQUE2QjtRQUY3QixtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLGtCQUFhLEdBQWIsYUFBYSxDQUFnQjtRQWQ5QixhQUFRLEdBQVcsRUFBRSxDQUFDO1FBQ3RCLGNBQVMsR0FBVyxFQUFFLENBQUM7UUFDdkIsUUFBRyxHQUFXLEVBQUUsQ0FBQztRQUNqQixPQUFFLEdBQVcsRUFBRSxDQUFDO1FBRWxCLGNBQVMsR0FBWSxLQUFLLENBQUM7UUFDM0IsZUFBVSxHQUFlLElBQUksVUFBVSxFQUFFLENBQUM7UUFHMUMsb0JBQWUsR0FBZSxJQUFJLFVBQVUsRUFBRSxDQUFDO0lBTWxELENBQUM7SUFFTCxRQUFRO1FBQ04sSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUN4QixDQUFD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QUFDLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7UUFDekYsT0FBTyxHQUFHLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQztJQUN6QixDQUFDOzsrR0FySVUsaUJBQWlCO21HQUFqQixpQkFBaUIsc0hBRmpCLENBQUMsY0FBYyxDQUFDLDBCQ1o3QiwwdURBK0JNOzRGRGpCTyxpQkFBaUI7a0JBTDdCLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLGFBQWE7b0JBQ3ZCLFdBQVcsRUFBRSwyQkFBMkI7b0JBQ3hDLFNBQVMsRUFBRSxDQUFDLGNBQWMsQ0FBQztpQkFDNUI7dUpBR1UsUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLEdBQUc7c0JBQVgsS0FBSztnQkFDRyxFQUFFO3NCQUFWLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuaW1wb3J0IHsgR2VuZXJhbFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zaGFyZWQvc2VydmljZXMvZ2VuZXJhbC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ29uZmlnUmVnaXN0cm8sIENydWRDb25maWcsIE9wZXJhdGlvbnMgfSBmcm9tICcuLi8uLi9zaGFyZWQvc2VydmljZXMvbW9kZWxzL2NydWQtY29uZmlnLm1vZGVsJztcclxuaW1wb3J0ICogYXMganNvbnBhdGggZnJvbSAnanNvbnBhdGgnO1xyXG5pbXBvcnQgeyBTaGVtYSB9IGZyb20gJy4uLy4uL3NoYXJlZC9zZXJ2aWNlcy9tb2RlbHMvc2hlbWEubW9kZWwnO1xyXG5pbXBvcnQgeyBNZXNzYWdlU2VydmljZSB9IGZyb20gJ3ByaW1lbmcvYXBpJztcclxuXHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3NmLXJlZ2lzdHJvJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vcmVnaXN0cm8uY29tcG9uZW50Lmh0bWwnLFxyXG4gIHByb3ZpZGVyczogW01lc3NhZ2VTZXJ2aWNlXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgUmVnaXN0cm9Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG5cclxuICBASW5wdXQoKSBpZEthdGlvczogc3RyaW5nID0gJyc7XHJcbiAgQElucHV0KCkgaWRFbnRpZGFkOiBzdHJpbmcgPSAnJztcclxuICBASW5wdXQoKSB0cng6IHN0cmluZyA9ICcnO1xyXG4gIEBJbnB1dCgpIGlkOiBzdHJpbmcgPSAnJztcclxuXHJcbiAgcHVibGljIGVuUHJvY2VzbzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBjcnVkQ29uZmlnOiBDcnVkQ29uZmlnID0gbmV3IENydWRDb25maWcoKTtcclxuICBwdWJsaWMgYnRuU3VibWl0OiBhbnk7XHJcbiAgcHVibGljIGRhdGE6IGFueTtcclxuICBwdWJsaWMgY29uZmlnT3BlcmF0aW9uOiBPcGVyYXRpb25zID0gbmV3IE9wZXJhdGlvbnMoKTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGdlbmVyYWxTZXJ2aWNlOiBHZW5lcmFsU2VydmljZSxcclxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXHJcbiAgICBwcml2YXRlIG1lc3NhZ2VTZXJpY2U6IE1lc3NhZ2VTZXJ2aWNlLFxyXG4gICkgeyB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5sb2FkQ29uZmlnQ3J1ZCgpO1xyXG4gICAgdGhpcy5zZXRMYWJlbFN1bWJpdCgpO1xyXG4gIH1cclxuXHJcbiAgbG9hZENvbmZpZ0NydWQoKSB7XHJcbiAgICB0aGlzLmVuUHJvY2VzbyA9IHRydWU7XHJcbiAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLmdldENydWRCeUVudGlkYWQodGhpcy5pZEthdGlvcywgdGhpcy5pZEVudGlkYWQpXHJcbiAgICAgIC50aGVuKHJlcyA9PiB7XHJcbiAgICAgICAgdGhpcy5jcnVkQ29uZmlnID0gcmVzO1xyXG4gICAgICAgIGlmICh0aGlzLnRyeCAhPSAnYycpIHRoaXMuZ2V0SW5mb1JlZ2lzdHJvKHRoaXMuY3J1ZENvbmZpZy5yZWdpc3Rybyk7XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLmRhdGEgPSB0aGlzLmNyZWF0ZU9iamVjdCh0aGlzLmNydWRDb25maWcuZXNxdWVtYSk7XHJcbiAgICAgICAgICB0aGlzLmVuUHJvY2VzbyA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmNvbmZpZ09wZXJhdGlvbiA9IHRoaXMuY3J1ZENvbmZpZy5yZWdpc3Ryby5vcGVyYXRpb25zLmZpbmQoeCA9PiB4LnR5cGUuc3RhcnRzV2l0aCh0aGlzLnRyeCkpIHx8IG5ldyBPcGVyYXRpb25zKCk7XHJcbiAgICAgIH0pXHJcbiAgICAgIC5jYXRjaChlcnIgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGVycik7XHJcbiAgICAgICAgdGhpcy5lblByb2Nlc28gPSBmYWxzZTtcclxuICAgICAgfSlcclxuICB9XHJcblxyXG4gIHNldExhYmVsU3VtYml0KCkge1xyXG4gICAgaWYgKHRoaXMudHJ4ID09ICdjJykgdGhpcy5idG5TdWJtaXQgPSB7IGxhYmVsOiAnR3VhcmRhcicsIGljb246ICdwaSBwaS1zYXZlJyB9XHJcbiAgICBlbHNlIGlmICh0aGlzLnRyeCA9PSAncicpIHRoaXMuYnRuU3VibWl0ID0gdW5kZWZpbmVkO1xyXG4gICAgZWxzZSBpZiAodGhpcy50cnggPT0gJ3UnKSB0aGlzLmJ0blN1Ym1pdCA9IHsgbGFiZWw6ICdBY3R1YWxpemFyJywgaWNvbjogJ3BpIHBpLXN5bmMnIH1cclxuICAgIGVsc2UgaWYgKHRoaXMudHJ4ID09ICdkJykgdGhpcy5idG5TdWJtaXQgPSB7IGxhYmVsOiAnRWxpbWluYXInLCBpY29uOiAncGkgcGktdHJhc2gnIH1cclxuXHJcbiAgfVxyXG5cclxuICBnZXRJbmZvUmVnaXN0cm8oY29uZmlnUmVnaXN0cm86IENvbmZpZ1JlZ2lzdHJvKSB7XHJcbiAgICBsZXQgb3AgPSBjb25maWdSZWdpc3Ryby5vcGVyYXRpb25zLmZpbmQoeCA9PiB4LnR5cGUgPT0gJ3JlYWQnKTtcclxuICAgIGxldCBlbmRwb2ludCA9IG9wPy5lbmRwb2ludCB8fCAnJztcclxuICAgIGVuZHBvaW50ID0gZW5kcG9pbnQucmVwbGFjZSgnQGlkS2F0aW9zJywgdGhpcy5pZEthdGlvcyk7XHJcbiAgICBlbmRwb2ludCA9IGVuZHBvaW50LnJlcGxhY2UoJ0BpZCcsIHRoaXMuaWQpO1xyXG4gICAgdGhpcy5nZW5lcmFsU2VydmljZS5nZW5lcmljUmVxdWVzdChvcD8ubWV0aG9kIHx8ICcnLCBvcD8uc2VydmVyIHx8ICcnLCBlbmRwb2ludClcclxuICAgICAgLnRoZW4oKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy5kYXRhID0gcmVzLmRhdGE7XHJcbiAgICAgICAgdGhpcy5lblByb2Nlc28gPSBmYWxzZTtcclxuICAgICAgfSlcclxuICAgICAgLmNhdGNoKGVyciA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coZXJyKTtcclxuICAgICAgICB0aGlzLmVuUHJvY2VzbyA9IGZhbHNlO1xyXG4gICAgICB9KVxyXG4gIH1cclxuXHJcbiAgYmFjaygpIHtcclxuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlQnlVcmwodGhpcy5jcnVkQ29uZmlnLnJlZ2lzdHJvLmJ0bkJhY2spO1xyXG4gIH1cclxuXHJcbiAgZ2V0Q29udHJvbChzY29wZTogc3RyaW5nKSB7XHJcbiAgICByZXR1cm4ganNvbnBhdGgucXVlcnkodGhpcy5jcnVkQ29uZmlnLmVzcXVlbWEsIHNjb3BlKVswXTtcclxuICB9XHJcblxyXG4gIGdldFZhbHVlKHNjb3BlOiBzdHJpbmcpIHtcclxuICAgIHJldHVybiBqc29ucGF0aC5xdWVyeSh0aGlzLmRhdGEsIHNjb3BlLnJlcGxhY2UoJy5wcm9wZXJ0aWVzJywgJycpKVswXTtcclxuICB9XHJcblxyXG4gIHNldFZhbHVlKHZhbHVlOiBhbnksIHNjb3BlOiBzdHJpbmcpIHtcclxuICAgIGpzb25wYXRoLnZhbHVlKHRoaXMuZGF0YSwgc2NvcGUucmVwbGFjZSgnLnByb3BlcnRpZXMnLCAnJyksIHZhbHVlKTtcclxuICB9XHJcblxyXG4gIGNyZWF0ZU9iamVjdChlc3F1ZW1hOiBTaGVtYSkge1xyXG4gICAgbGV0IG9iamVjdCA9IHt9O1xyXG4gICAgc3dpdGNoIChlc3F1ZW1hLnR5cGUpIHtcclxuICAgICAgY2FzZSAnc3RyaW5nJzpcclxuICAgICAgY2FzZSAnbnVtYmVyJzpcclxuICAgICAgICByZXR1cm4gZXNxdWVtYT8uZGVmYXVsdCB8fCBudWxsO1xyXG4gICAgICBjYXNlICdib29sZWFuJzpcclxuICAgICAgICByZXR1cm4gZXNxdWVtYT8uZGVmYXVsdCB8fCBmYWxzZTtcclxuICAgICAgY2FzZSAnb2JqZWN0JzpcclxuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBlc3F1ZW1hPy5wcm9wZXJ0aWVzKSB7XHJcbiAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqZWN0LCBrZXksIHsgdmFsdWU6IHRoaXMuY3JlYXRlT2JqZWN0KGVzcXVlbWE/LnByb3BlcnRpZXNba2V5XSksIHdyaXRhYmxlOiB0cnVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSlcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gb2JqZWN0O1xyXG4gIH1cclxuXHJcbiAgc3VibWl0KCkge1xyXG4gICAgaWYgKCF0aGlzLnZhbGlkYXRlRGF0YSgpKSByZXR1cm47XHJcbiAgICB0aGlzLmVuUHJvY2VzbyA9IHRydWU7XHJcbiAgICBsZXQgZW5kcG9pbnQgPSB0aGlzLmNvbmZpZ09wZXJhdGlvbi5lbmRwb2ludDtcclxuICAgIGVuZHBvaW50ID0gZW5kcG9pbnQucmVwbGFjZSgnQGlkS2F0aW9zJywgdGhpcy5pZEthdGlvcylcclxuICAgIGVuZHBvaW50ID0gZW5kcG9pbnQucmVwbGFjZSgnQGlkJywgdGhpcy5pZClcclxuICAgIHRoaXMuZ2VuZXJhbFNlcnZpY2UuZ2VuZXJpY1JlcXVlc3QodGhpcy5jb25maWdPcGVyYXRpb24ubWV0aG9kLCB0aGlzLmNvbmZpZ09wZXJhdGlvbi5zZXJ2ZXIsIGVuZHBvaW50LCB0aGlzLmRhdGEpXHJcbiAgICAgIC50aGVuKCgpID0+IHtcclxuICAgICAgICB0aGlzLm1lc3NhZ2VTZXJpY2UuYWRkKHsgc2V2ZXJpdHk6ICdzdWNjZXNzJywgZGV0YWlsOiBgUHJvY2VzbyBleGl0b3NvIWAgfSlcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgIHRoaXMuZW5Qcm9jZXNvID0gZmFsc2U7XHJcbiAgICAgICAgICB0aGlzLmJhY2soKVxyXG4gICAgICAgIH0sIDIwMDApO1xyXG4gICAgICB9KVxyXG4gICAgICAuY2F0Y2goZXJyID0+IHtcclxuICAgICAgICB0aGlzLm1lc3NhZ2VTZXJpY2UuYWRkKHsgc2V2ZXJpdHk6ICd3YXJuJywgZGV0YWlsOiBgJHtlcnI/LmVycm9yPy5tZXNzYWdlIHx8ICdFcnJvciBubyBjb250cm9sYWRvLCBwb3IgZmF2b3IgY29tdW5pY2Fyc2UgY29uIGRlbCBhZG1pbi4nfWAgfSlcclxuICAgICAgICB0aGlzLmVuUHJvY2VzbyA9IGZhbHNlO1xyXG4gICAgICB9KVxyXG4gIH1cclxuXHJcbiAgdmFsaWRhdGVEYXRhKCkge1xyXG4gICAgaWYgKHRoaXMuY29uZmlnT3BlcmF0aW9uLnZhbGlkYXRpb25zLnR5cGUgPT0gJ2xvY2FsJykgcmV0dXJuIHRoaXMudmFsaWRhdGVEYXRhTG9jYWwoKTtcclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgdmFsaWRhdGVEYXRhTG9jYWwoKSB7XHJcbiAgICBsZXQgZXJyOiBzdHJpbmdbXSA9IFtdXHJcbiAgICB0aGlzLmNvbmZpZ09wZXJhdGlvbi52YWxpZGF0aW9ucy5yZXF1aXJlZC5mb3JFYWNoKHggPT4ge1xyXG4gICAgICBpZiAoIWpzb25wYXRoLnF1ZXJ5KHRoaXMuZGF0YSwgeC5maWVsZClbMF0pIGVyci5wdXNoKHgubWVzc2FnZSk7XHJcbiAgICB9KVxyXG4gICAgaWYgKGVyci5sZW5ndGggIT0gMCkgdGhpcy5tZXNzYWdlU2VyaWNlLmFkZCh7IHNldmVyaXR5OiAnd2FybicsIGRldGFpbDogZXJyLmpvaW4oJy4gJykgfSlcclxuICAgIHJldHVybiBlcnIubGVuZ3RoID09IDA7XHJcbiAgfVxyXG5cclxufVxyXG4iLCI8cC1ibG9ja1VJIFtibG9ja2VkXT1cImVuUHJvY2Vzb1wiPlxyXG4gICAgPGkgY2xhc3M9XCJwaSBwaS1jb2cgcGktc3BpblwiIHN0eWxlPVwiZm9udC1zaXplOiA1MHB4XCI+PC9pPlxyXG48L3AtYmxvY2tVST5cclxuXHJcbjxwLXRvYXN0PjwvcC10b2FzdD5cclxuXHJcbjxkaXYgY2xhc3M9XCJjYXJkXCIgKm5nSWY9XCIhZW5Qcm9jZXNvXCI+XHJcbiAgICA8aDUgY2xhc3M9XCJjYXJkLWhlYWRlciBtYi0yXCIgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47YWxpZ24taXRlbXM6IGNlbnRlcjtcIj5cclxuICAgICAgICA8c3Bhbj57e2lkRW50aWRhZH19IHt7aWQgIT0gJycgPyAnLScgKyBpZCA6ICcnfX08L3NwYW4+XHJcbiAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgdHlwZT1cImJ1dHRvblwiIGljb249XCJwaSBwaS1hcnJvdy1sZWZ0XCIgKGNsaWNrKT1cImJhY2soKVwiPjwvYnV0dG9uPlxyXG4gICAgPC9oNT5cclxuICAgIDxkaXYgKm5nRm9yPVwibGV0IGVsZW1lbnQgb2YgY3J1ZENvbmZpZy51aUVzcXVlbWEuZWxlbWVudHNcIiBbY2xhc3NdPVwiZWxlbWVudD8uY2xhc3NcIj5cclxuICAgICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJlbGVtZW50LnR5cGVcIj5cclxuICAgICAgICAgICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiJ0xhYmVsJ1wiIFtzdHlsZV09XCJlbGVtZW50Py5zdHlsZVwiPlxyXG4gICAgICAgICAgICAgICAge3tlbGVtZW50Py5sYWJlbH19XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInSG9yaXpvbnRhbExheW91dCdcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGVsIG9mIGVsZW1lbnQuZWxlbWVudHNcIiBbY2xhc3NdPVwiZWw/LmNsYXNzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwiZWwudHlwZVwiID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNmLWNvbnRyb2wgKm5nU3dpdGNoQ2FzZT1cIidDb250cm9sJ1wiIFtjb250cm9sXT1cImdldENvbnRyb2woZWwuc2NvcGUpXCIgW2xhYmVsXT1cImVsLmxhYmVsXCIgW3ZhbHVlXT1cImdldFZhbHVlKGVsLnNjb3BlKVwiIChzZXRWYWx1ZSk9XCJzZXRWYWx1ZSgkZXZlbnQsIGVsLnNjb3BlKVwiPjwvc2YtY29udHJvbD5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiJ0NvbnRyb2wnXCI+XHJcbiAgICAgICAgICAgICAgICA8c2YtY29udHJvbCAqbmdTd2l0Y2hDYXNlPVwiJ0NvbnRyb2wnXCIgW2NvbnRyb2xdPVwiZ2V0Q29udHJvbChlbGVtZW50LnNjb3BlKVwiIFtsYWJlbF09XCJlbGVtZW50LmxhYmVsXCI+PC9zZi1jb250cm9sPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImNhcmQtZm9vdGVyXCIgKm5nSWY9XCJidG5TdWJtaXRcIj5cclxuICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSB0eXBlPVwiYnV0dG9uXCIgW2ljb25dPVwiYnRuU3VibWl0Lmljb25cIiBbbGFiZWxdPVwiYnRuU3VibWl0LmxhYmVsXCIgKGNsaWNrKT1cInN1Ym1pdCgpXCI+PC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuPC9kaXY+Il19
|
|
266
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaXN0cm8uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2YtY3J1ZC9zcmMvbGliL2NvbXBvbmVudHMvcmVnaXN0cm8vcmVnaXN0cm8uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2YtY3J1ZC9zcmMvbGliL2NvbXBvbmVudHMvcmVnaXN0cm8vcmVnaXN0cm8uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvRSxPQUFPLEVBQWtCLFVBQVUsRUFBRSxVQUFVLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQztBQUN4RyxPQUFPLEVBQUUsYUFBYSxFQUFFLG1CQUFtQixFQUFFLGdCQUFnQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFN0YsT0FBTyxFQUFXLGNBQWMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN0RCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUdwRixPQUFPLEtBQUssUUFBUSxNQUFNLFVBQVUsQ0FBQzs7Ozs7Ozs7Ozs7OztBQVFyQyxNQUFNLE9BQU8saUJBQWlCO0lBZ0I1QixZQUNVLGNBQThCLEVBQzlCLE1BQWMsRUFDZCxhQUE2QixFQUM3QixhQUE0QjtRQUg1QixtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLGtCQUFhLEdBQWIsYUFBYSxDQUFnQjtRQUM3QixrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQWxCN0IsYUFBUSxHQUFXLEVBQUUsQ0FBQztRQUN0QixjQUFTLEdBQVcsRUFBRSxDQUFDO1FBQ3ZCLFFBQUcsR0FBVyxFQUFFLENBQUM7UUFDakIsT0FBRSxHQUFXLEVBQUUsQ0FBQztRQUNmLGFBQVEsR0FBc0Is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QUFLLEVBQUUsQ0FBQztRQUNWLENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQzs7K0dBcE9VLGlCQUFpQjttR0FBakIsaUJBQWlCLHlKQUhqQixDQUFDLGNBQWMsRUFBRSxhQUFhLEVBQUUsbUJBQW1CLEVBQUUsZ0JBQWdCLENBQUMsMEJDYm5GLHc0S0FrRkE7NEZEbEVhLGlCQUFpQjtrQkFON0IsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsYUFBYTtvQkFDdkIsV0FBVyxFQUFFLDJCQUEyQjtvQkFDeEMsU0FBUyxFQUFFLENBQUMsY0FBYyxFQUFFLGFBQWEsRUFBRSxtQkFBbUIsRUFBRSxnQkFBZ0IsQ0FBQztvQkFDakYsZUFBZSxFQUFFLG1CQUFtQjtpQkFDckM7bUxBR1UsUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLEdBQUc7c0JBQVgsS0FBSztnQkFDRyxFQUFFO3NCQUFWLEtBQUs7Z0JBQ0ksUUFBUTtzQkFBakIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29uZmlnUmVnaXN0cm8sIENydWRDb25maWcsIE9wZXJhdGlvbnMgfSBmcm9tICcuLi8uLi9zaGFyZWQvc2VydmljZXMvbW9kZWxzL2NydWQtY29uZmlnLm1vZGVsJztcclxuaW1wb3J0IHsgRGlhbG9nU2VydmljZSwgRHluYW1pY0RpYWxvZ0NvbmZpZywgRHluYW1pY0RpYWxvZ1JlZiB9IGZyb20gJ3ByaW1lbmcvZHluYW1pY2RpYWxvZyc7XHJcbmltcG9ydCB7IEdlbmVyYWxTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2hhcmVkL3NlcnZpY2VzL2dlbmVyYWwuc2VydmljZSc7XHJcbmltcG9ydCB7IE1lc3NhZ2UsIE1lc3NhZ2VTZXJ2aWNlIH0gZnJvbSAncHJpbWVuZy9hcGknO1xyXG5pbXBvcnQgeyBSZWdpc3Ryb0NoaWxkQ29tcG9uZW50IH0gZnJvbSAnLi4vcmVnaXN0cm8tY2hpbGQvcmVnaXN0cm8tY2hpbGQuY29tcG9uZW50JztcclxuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuaW1wb3J0IHsgU2hlbWEgfSBmcm9tICcuLi8uLi9zaGFyZWQvc2VydmljZXMvbW9kZWxzL3NoZW1hLm1vZGVsJztcclxuaW1wb3J0ICogYXMganNvbnBhdGggZnJvbSAnanNvbnBhdGgnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdzZi1yZWdpc3RybycsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3JlZ2lzdHJvLmNvbXBvbmVudC5odG1sJyxcclxuICBwcm92aWRlcnM6IFtNZXNzYWdlU2VydmljZSwgRGlhbG9nU2VydmljZSwgRHluYW1pY0RpYWxvZ0NvbmZpZywgRHluYW1pY0RpYWxvZ1JlZl0sXHJcbiAgZW50cnlDb21wb25lbnRzOiBbUmVnaXN0cm9Db21wb25lbnRdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBSZWdpc3Ryb0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcblxyXG4gIEBJbnB1dCgpIGlkS2F0aW9zOiBzdHJpbmcgPSAnJztcclxuICBASW5wdXQoKSBpZEVudGlkYWQ6IHN0cmluZyA9ICcnO1xyXG4gIEBJbnB1dCgpIHRyeDogc3RyaW5nID0gJyc7XHJcbiAgQElucHV0KCkgaWQ6IHN0cmluZyA9ICcnO1xyXG4gIEBPdXRwdXQoKSBzZW5kRGF0YTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgcHVibGljIGNydWRDb25maWc6IENydWRDb25maWcgPSBuZXcgQ3J1ZENvbmZpZygpO1xyXG4gIHB1YmxpYyBlblByb2Nlc286IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgYnRuU3VibWl0OiBhbnk7XHJcbiAgcHVibGljIGRhdGE6IGFueTtcclxuICBwdWJsaWMgY29uZmlnT3BlcmF0aW9uOiBPcGVyYXRpb25zID0gbmV3IE9wZXJhdGlvbnMoKTtcclxuICBwdWJsaWMgaXNMb2NhbDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBkaWFsb2dSZWY/OiBEeW5hbWljRGlhbG9nUmVmXHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBnZW5lcmFsU2VydmljZTogR2VuZXJhbFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxyXG4gICAgcHJpdmF0ZSBtZXNzYWdlU2VyaWNlOiBNZXNzYWdlU2VydmljZSxcclxuICAgIHByaXZhdGUgZGlhbG9nU2VydmljZTogRGlhbG9nU2VydmljZSxcclxuICApIHsgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMubG9hZENvbmZpZ0NydWQoKTtcclxuICAgIHRoaXMuc2V0TGFiZWxTdW1iaXQoKTtcclxuICB9XHJcblxyXG4gIGxvYWRDb25maWdDcnVkKCkge1xyXG4gICAgdGhpcy5lblByb2Nlc28gPSB0cnVlO1xyXG4gICAgdGhpcy5nZW5lcmFsU2VydmljZS5nZXRDcnVkQnlFbnRpZGFkKHRoaXMuaWRLYXRpb3MsIHRoaXMuaWRFbnRpZGFkKVxyXG4gICAgICAudGhlbihyZXMgPT4ge1xyXG4gICAgICAgIHRoaXMuY3J1ZENvbmZpZyA9IHJlcztcclxuICAgICAgICBjb25zb2xlLmxvZyh0aGlzLmNydWRDb25maWcpXHJcbiAgICAgICAgaWYgKHRoaXMudHJ4ICE9ICdjJykgdGhpcy5nZXRJbmZvUmVnaXN0cm8odGhpcy5jcnVkQ29uZmlnLnJlZ2lzdHJvKTtcclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuZGF0YSA9IHRoaXMuY3JlYXRlT2JqZWN0KHRoaXMuY3J1ZENvbmZpZy5lc3F1ZW1hKTtcclxuICAgICAgICAgIHRoaXMuZW5Qcm9jZXNvID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY29uZmlnT3BlcmF0aW9uID0gdGhpcy5jcnVkQ29uZmlnLnJlZ2lzdHJvLm9wZXJhdGlvbnMuZmluZCh4ID0+IHgudHlwZS5zdGFydHNXaXRoKHRoaXMudHJ4KSkgfHwgbmV3IE9wZXJhdGlvbnMoKTtcclxuICAgICAgfSlcclxuICAgICAgLmNhdGNoKGVyciA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coZXJyKTtcclxuICAgICAgICB0aGlzLmVuUHJvY2VzbyA9IGZhbHNlO1xyXG4gICAgICB9KVxyXG4gIH1cclxuXHJcbiAgc2V0TGFiZWxTdW1iaXQoKSB7XHJcbiAgICBpZiAodGhpcy50cnggPT0gJ2MnKSB0aGlzLmJ0blN1Ym1pdCA9IHsgbGFiZWw6ICdHdWFyZGFyJywgaWNvbjogJ3BpIHBpLXNhdmUnIH1cclxuICAgIGVsc2UgaWYgKHRoaXMudHJ4ID09ICdyJykgdGhpcy5idG5TdWJtaXQgPSB1bmRlZmluZWQ7XHJcbiAgICBlbHNlIGlmICh0aGlzLnRyeCA9PSAndScpIHRoaXMuYnRuU3VibWl0ID0geyBsYWJlbDogJ0FjdHVhbGl6YXInLCBpY29uOiAncGkgcGktc3luYycgfVxyXG4gICAgZWxzZSBpZiAodGhpcy50cnggPT0gJ2QnKSB0aGlzLmJ0blN1Ym1pdCA9IHsgbGFiZWw6ICdFbGltaW5hcicsIGljb246ICdwaSBwaS10cmFzaCcgfVxyXG4gIH1cclxuXHJcbiAgZ2V0SW5mb1JlZ2lzdHJvKGNvbmZpZ1JlZ2lzdHJvOiBDb25maWdSZWdpc3Rybykge1xyXG4gICAgbGV0IG9wID0gY29uZmlnUmVnaXN0cm8ub3BlcmF0aW9ucy5maW5kKHggPT4geC50eXBlID09ICdyZWFkJyk7XHJcbiAgICBsZXQgZW5kcG9pbnQgPSBvcD8uZW5kcG9pbnQgfHwgJyc7XHJcbiAgICBlbmRwb2ludCA9IGVuZHBvaW50LnJlcGxhY2UoJ0BpZEthdGlvcycsIHRoaXMuaWRLYXRpb3MpO1xyXG4gICAgZW5kcG9pbnQgPSBlbmRwb2ludC5yZXBsYWNlKCdAaWQnLCB0aGlzLmlkKTtcclxuICAgIHRoaXMuZ2VuZXJhbFNlcnZpY2UuZ2VuZXJpY1JlcXVlc3Qob3A/Lm1ldGhvZCB8fCAnJywgb3A/LnNlcnZlciB8fCAnJywgZW5kcG9pbnQpXHJcbiAgICAgIC50aGVuKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMuZGF0YSA9IHJlcy5kYXRhO1xyXG4gICAgICAgIHRoaXMuZW5Qcm9jZXNvID0gZmFsc2U7XHJcbiAgICAgIH0pXHJcbiAgICAgIC5jYXRjaChlcnIgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGVycik7XHJcbiAgICAgICAgdGhpcy5lblByb2Nlc28gPSBmYWxzZTtcclxuICAgICAgfSlcclxuICB9XHJcblxyXG4gIGJhY2soKSB7XHJcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZUJ5VXJsKHRoaXMuY3J1ZENvbmZpZy5yZWdpc3Ryby5idG5CYWNrKTtcclxuICB9XHJcblxyXG4gIGdldENvbnRyb2woc2NvcGU6IHN0cmluZykge1xyXG4gICAgcmV0dXJuIGpzb25wYXRoLnF1ZXJ5KHRoaXMuY3J1ZENvbmZpZy5lc3F1ZW1hLCBzY29wZSlbMF07XHJcbiAgfVxyXG5cclxuICBnZXRWYWx1ZShzY29wZTogc3RyaW5nKSB7XHJcbiAgICByZXR1cm4ganNvbnBhdGgucXVlcnkodGhpcy5kYXRhLCBzY29wZS5yZXBsYWNlKCcucHJvcGVydGllcycsICcnKSlbMF07XHJcbiAgfVxyXG5cclxuICBzZXRWYWx1ZSh2YWx1ZTogYW55LCBzY29wZTogc3RyaW5nKSB7XHJcbiAgICBzd2l0Y2ggKHR5cGVvZiAodmFsdWUpKSB7XHJcbiAgICAgIGNhc2UgJ29iamVjdCc6XHJcbiAgICAgICAgdmFsdWUuZm9yRWFjaCgodmFsOiBhbnkpID0+IGpzb25wYXRoLnZhbHVlKHRoaXMuZGF0YSwgdmFsLnNjb3BlLnJlcGxhY2UoJy5wcm9wZXJ0aWVzJywgJycpLCB2YWwudmFsdWUpKVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIGpzb25wYXRoLnZhbHVlKHRoaXMuZGF0YSwgc2NvcGUucmVwbGFjZSgnLnByb3BlcnRpZXMnLCAnJyksIHZhbHVlKTtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNyZWF0ZU9iamVjdChlc3F1ZW1hOiBTaGVtYSkge1xyXG4gICAgbGV0IG9iamVjdCA9IHt9O1xyXG4gICAgc3dpdGNoIChlc3F1ZW1hLnR5cGUpIHtcclxuICAgICAgY2FzZSAnbnVtZXJpYyc6XHJcbiAgICAgICAgcmV0dXJuIGVzcXVlbWE/LmRlZmF1bHQgfHwgMDtcclxuICAgICAgY2FzZSAnc3RyaW5nJzpcclxuICAgICAgY2FzZSAnZGF0ZSc6XHJcbiAgICAgICAgcmV0dXJuIGVzcXVlbWE/LmRlZmF1bHQgPyB0aGlzLnNldERlZmF1bHRWYWx1ZShlc3F1ZW1hLmRlZmF1bHQpIDogbnVsbDtcclxuICAgICAgY2FzZSAnYm9vbGVhbic6XHJcbiAgICAgICAgcmV0dXJuIGVzcXVlbWE/LmRlZmF1bHQgfHwgZmFsc2U7XHJcbiAgICAgIGNhc2UgJ2FycmF5JzpcclxuICAgICAgICByZXR1cm4gW107XHJcbiAgICAgIGNhc2UgJ2ZpbGUnOlxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICBjYXNlICdvYmplY3QnOlxyXG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGVzcXVlbWE/LnByb3BlcnRpZXMpIHtcclxuICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmplY3QsIGtleSwgeyB2YWx1ZTogdGhpcy5jcmVhdGVPYmplY3QoZXNxdWVtYT8ucHJvcGVydGllc1trZXldKSwgd3JpdGFibGU6IHRydWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9KVxyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICAgIHJldHVybiBvYmplY3Q7XHJcbiAgfVxyXG5cclxuICBzdWJtaXQoKSB7XHJcbiAgICBjb25zb2xlLmxvZyh0aGlzLmRhdGEpXHJcbiAgICBpZiAoIXRoaXMudmFsaWRhdGVEYXRhKCkpIHJldHVybjtcclxuICAgIHRoaXMuZW5Qcm9jZXNvID0gdHJ1ZTtcclxuICAgIGxldCBlbmRwb2ludCA9IHRoaXMuY29uZmlnT3BlcmF0aW9uLmVuZHBvaW50O1xyXG4gICAgZW5kcG9pbnQgPSBlbmRwb2ludC5yZXBsYWNlKCdAaWRLYXRpb3MnLCB0aGlzLmlkS2F0aW9zKVxyXG4gICAgZW5kcG9pbnQgPSBlbmRwb2ludC5yZXBsYWNlKCdAaWQnLCB0aGlzLmlkKVxyXG4gICAgdGhpcy5nZW5lcmFsU2VydmljZS5nZW5lcmljUmVxdWVzdCh0aGlzLmNvbmZpZ09wZXJhdGlvbi5tZXRob2QsIHRoaXMuY29uZmlnT3BlcmF0aW9uLnNlcnZlciwgZW5kcG9pbnQsIHRoaXMuZGF0YSlcclxuICAgICAgLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgIHRoaXMubWVzc2FnZVNlcmljZS5hZGQoeyBzZXZlcml0eTogJ3N1Y2Nlc3MnLCBkZXRhaWw6IGBQcm9jZXNvIGV4aXRvc28hYCB9KVxyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5lblByb2Nlc28gPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMuYmFjaygpXHJcbiAgICAgICAgfSwgMjAwMCk7XHJcbiAgICAgIH0pXHJcbiAgICAgIC5jYXRjaChlcnIgPT4ge1xyXG4gICAgICAgIHRoaXMubWVzc2FnZVNlcmljZS5hZGQoeyBzZXZlcml0eTogJ3dhcm4nLCBkZXRhaWw6IGAke2Vycj8uZXJyb3I/Lm1lc3NhZ2UgfHwgJ0Vycm9yIG5vIGNvbnRyb2xhZG8sIHBvciBmYXZvciBjb211bmljYXJzZSBjb24gZGVsIGFkbWluLid9YCB9KVxyXG4gICAgICAgIHRoaXMuZW5Qcm9jZXNvID0gZmFsc2U7XHJcbiAgICAgIH0pXHJcbiAgfVxyXG5cclxuICB2YWxpZGF0ZURhdGEoKSB7XHJcbiAgICBpZiAodGhpcy5jb25maWdPcGVyYXRpb24udmFsaWRhdGlvbnMudHlwZSA9PSAnbG9jYWwnKSByZXR1cm4gdGhpcy52YWxpZGF0ZURhdGFMb2NhbCgpO1xyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICB2YWxpZGF0ZURhdGFMb2NhbCgpIHtcclxuICAgIGxldCBlcnI6IHN0cmluZ1tdID0gW11cclxuICAgIHRoaXMuY29uZmlnT3BlcmF0aW9uLnZhbGlkYXRpb25zPy5yZXF1aXJlZC5mb3JFYWNoKHggPT4ge1xyXG4gICAgICBpZiAoIWpzb25wYXRoLnF1ZXJ5KHRoaXMuZGF0YSwgeC5maWVsZClbMF0pIGVyci5wdXNoKHgubWVzc2FnZSk7XHJcbiAgICB9KVxyXG4gICAgdGhpcy5jb25maWdPcGVyYXRpb24udmFsaWRhdGlvbnM/Lm9wZXJhdGlvbnMuZm9yRWFjaCgpXHJcbiAgICBpZiAoZXJyLmxlbmd0aCAhPSAwKSB0aGlzLm1lc3NhZ2VTZXJpY2UuYWRkKHsgc2V2ZXJpdHk6ICd3YXJuJywgZGV0YWlsOiBlcnIuam9pbignLiAnKSB9KVxyXG4gICAgcmV0dXJuIGVyci5sZW5ndGggPT0gMDtcclxuICB9XHJcblxyXG4gIHNldERlZmF1bHRWYWx1ZSh2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICBsZXQgZGF0YSA9IG51bGw7XHJcbiAgICBsZXQgdWFjdGl2bztcclxuICAgIHN3aXRjaCAodmFsdWUpIHtcclxuICAgICAgY2FzZSAnQHVhY3Rpdm8nOlxyXG4gICAgICAgIHVhY3Rpdm8gPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdvU2Vzc2lvblRGTScpIHx8ICd7fScpXHJcbiAgICAgICAgaWYgKCF1YWN0aXZvKSBjb25zb2xlLmxvZygnVmFsaWRhciBjb25maWd1cmFjaW9uIGRlIHNlc2lvbicpXHJcbiAgICAgICAgZWxzZSBkYXRhID0gYCR7dWFjdGl2by5Vc3VhcmlvU2lzdGVtYS5URE9DfS0ke3VhY3Rpdm8uVXN1YXJpb1Npc3RlbWEuTkRPQ31gXHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ0B0ZG9jYWN0aXZvJzpcclxuICAgICAgICB1YWN0aXZvID0gSlNPTi5wYXJzZShzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKCd1c3JTZXNpb24nKSB8fCAne30nKVxyXG4gICAgICAgIGlmICghdWFjdGl2bykgY29uc29sZS5sb2coJ1ZhbGlkYXIgY29uZmlndXJhY2lvbiBkZSBzZXNpb24nKVxyXG4gICAgICAgIGVsc2UgZGF0YSA9IHVhY3Rpdm8uVXN1YXJpb1Npc3RlbWEuVERPQ1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdAbmRvY2FjdGl2byc6XHJcbiAgICAgICAgdWFjdGl2byA9IEpTT04ucGFyc2Uoc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgndXNyU2VzaW9uJykgfHwgJ3t9JylcclxuICAgICAgICBpZiAoIXVhY3Rpdm8pIGNvbnNvbGUubG9nKCdWYWxpZGFyIGNvbmZpZ3VyYWNpb24gZGUgc2VzaW9uJylcclxuICAgICAgICBlbHNlIGRhdGEgPSB1YWN0aXZvLlVzdWFyaW9TaXN0ZW1hLk5ET0NcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnQGhveSc6XHJcbiAgICAgICAgZGF0YSA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgZGF0YSA9IHZhbHVlO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGRhdGFcclxuICB9XHJcblxyXG4gIHNlbmROb3RpZmljYXRpb24obWVzc2FnZTogTWVzc2FnZSkge1xyXG4gICAgdGhpcy5tZXNzYWdlU2VyaWNlLmFkZChtZXNzYWdlKVxyXG4gIH1cclxuXHJcbiAgYWRkT2JqZWN0QXJyYXkoZWxlbWVudDogYW55KSB7XHJcbiAgICB0aGlzLmRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nU2VydmljZS5vcGVuKFJlZ2lzdHJvQ2hpbGRDb21wb25lbnQsIHtcclxuICAgICAgaGVhZGVyOiBgRGV0YWxsZWAsXHJcbiAgICAgIHdpZHRoOiAnNzAlJyxcclxuICAgICAgbW9kYWw6IHRydWUsXHJcbiAgICAgIGNsb3NhYmxlOiBmYWxzZSxcclxuICAgICAgZGF0YToge1xyXG4gICAgICAgIHVpRXNxdWVtYTogeyAuLi5lbGVtZW50LmVsZW1lbnRzIH0sXHJcbiAgICAgICAgZXNxdWVtYTogdGhpcy5nZXRDb250cm9sKGVsZW1lbnQuc2NvcGUpLFxyXG4gICAgICAgIGlkOiB0aGlzLmdldFZhbHVlKGVsZW1lbnQuc2NvcGUpLmxlbmd0aCArIDFcclxuICAgICAgfVxyXG4gICAgfSlcclxuICAgIHRoaXMuZGlhbG9nUmVmLm9uQ2xvc2Uuc3Vic2NyaWJlKChkYXRhOiBhbnkpID0+IHtcclxuICAgICAgaWYgKGRhdGEpIHRoaXMuZGF0YVtlbGVtZW50LnNjb3BlLnJlcGxhY2UoJyQuLnByb3BlcnRpZXMuJywgJycpXS5wdXNoKGRhdGEpO1xyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGVkaXRSb3coZWxlbWVudDogYW55LCBkYXRhOiBhbnkpIHtcclxuICAgIHRoaXMuZGlhbG9nUmVmID0gdGhpcy5kaWFsb2dTZXJ2aWNlLm9wZW4oUmVnaXN0cm9DaGlsZENvbXBvbmVudCwge1xyXG4gICAgICBoZWFkZXI6IGBEZXRhbGxlYCxcclxuICAgICAgd2lkdGg6ICc3MCUnLFxyXG4gICAgICBtb2RhbDogdHJ1ZSxcclxuICAgICAgY2xvc2FibGU6IGZhbHNlLFxyXG4gICAgICBkYXRhOiB7XHJcbiAgICAgICAgdWlFc3F1ZW1hOiB7IC4uLmVsZW1lbnQuZWxlbWVudHMgfSxcclxuICAgICAgICBlc3F1ZW1hOiB0aGlzLmdldENvbnRyb2woZWxlbWVudC5zY29wZSksXHJcbiAgICAgICAgZGF0YTogeyAuLi5kYXRhIH1cclxuICAgICAgfVxyXG4gICAgfSlcclxuICAgIHRoaXMuZGlhbG9nUmVmLm9uQ2xvc2Uuc3Vic2NyaWJlKChkYXRhOiBhbnkpID0+IHtcclxuICAgICAgaWYgKGRhdGEpIHRoaXMuZGF0YVtlbGVtZW50LnNjb3BlLnJlcGxhY2UoJyQuLnByb3BlcnRpZXMuJywgJycpXVtkYXRhLmlkIC0gMV0gPSBkYXRhO1xyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGRlbGV0ZVJvdyhlbGVtZW50OiBhbnksIGluZGV4OiBudW1iZXIpIHtcclxuICAgIHRoaXMuZGF0YVtlbGVtZW50LnNjb3BlLnJlcGxhY2UoJyQuLnByb3BlcnRpZXMuJywgJycpXS5zcGxpY2UoaW5kZXggLSAxLCAxKTtcclxuICAgIGluZGV4ID0gMTtcclxuICAgIHRoaXMuZGF0YVtlbGVtZW50LnNjb3BlLnJlcGxhY2UoJyQuLnByb3BlcnRpZXMuJywgJycpXS5mb3JFYWNoKChlbDogYW55KSA9PiB7XHJcbiAgICAgIGVsLmlkID0gaW5kZXg7XHJcbiAgICAgIGluZGV4Kys7XHJcbiAgICB9KVxyXG4gIH1cclxufVxyXG4iLCI8cC1ibG9ja1VJIFtibG9ja2VkXT1cImVuUHJvY2Vzb1wiPlxyXG4gICAgPGkgY2xhc3M9XCJwaSBwaS1jb2cgcGktc3BpblwiIHN0eWxlPVwiZm9udC1zaXplOiA1MHB4XCI+PC9pPlxyXG48L3AtYmxvY2tVST5cclxuXHJcbjxwLXRvYXN0PjwvcC10b2FzdD5cclxuXHJcbjxkaXYgY2xhc3M9XCJjYXJkXCIgKm5nSWY9XCIhZW5Qcm9jZXNvXCI+XHJcbiAgICA8aDUgY2xhc3M9XCJjYXJkLWhlYWRlciBtYi0yXCIgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47YWxpZ24taXRlbXM6IGNlbnRlcjtcIj5cclxuICAgICAgICA8c3Bhbj57e2NydWRDb25maWcucmVnaXN0cm8/LmxhYmVsIHx8IGlkRW50aWRhZH19IHt7aWQgIT0gJycgPyAnLScgKyBpZCA6ICcnfX08L3NwYW4+XHJcbiAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgdHlwZT1cImJ1dHRvblwiIGljb249XCJwaSBwaS1hcnJvdy1sZWZ0XCIgKGNsaWNrKT1cImJhY2soKVwiPjwvYnV0dG9uPlxyXG4gICAgPC9oNT5cclxuICAgIDxkaXYgKm5nRm9yPVwibGV0IGVsZW1lbnQgb2YgY3J1ZENvbmZpZy51aUVzcXVlbWEuZWxlbWVudHNcIiBbY2xhc3NdPVwiZWxlbWVudD8uY2xhc3NcIj5cclxuICAgICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJlbGVtZW50LnR5cGVcIj5cclxuICAgICAgICAgICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiJ0xhYmVsJ1wiIFtzdHlsZV09XCJlbGVtZW50Py5zdHlsZVwiPlxyXG4gICAgICAgICAgICAgICAge3tlbGVtZW50Py5sYWJlbH19XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInSG9yaXpvbnRhbExheW91dCdcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGVsIG9mIGVsZW1lbnQuZWxlbWVudHNcIiBbY2xhc3NdPVwiZWw/LmNsYXNzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwiZWwudHlwZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c2YtY29udHJvbCAqbmdTd2l0Y2hDYXNlPVwiJ0NvbnRyb2wnXCIgW2NvbnRyb2xdPVwiZ2V0Q29udHJvbChlbC5zY29wZSlcIiBbbGFiZWxdPVwiZWwubGFiZWxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImdldFZhbHVlKGVsLnNjb3BlKVwiIChzZXRWYWx1ZSk9XCJzZXRWYWx1ZSgkZXZlbnQsIGVsLnNjb3BlKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VuZE5vdGlmaWNhdGlvbik9XCJzZW5kTm90aWZpY2F0aW9uKCRldmVudClcIj48L3NmLWNvbnRyb2w+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidWZXJ0aWNhbExheW91dCdcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGVsIG9mIGVsZW1lbnQuZWxlbWVudHNcIiBbY2xhc3NdPVwiZWw/LmNsYXNzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwiZWwudHlwZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c2YtY29udHJvbCAqbmdTd2l0Y2hDYXNlPVwiJ0NvbnRyb2wnXCIgW2NvbnRyb2xdPVwiZ2V0Q29udHJvbChlbC5zY29wZSlcIiBbbGFiZWxdPVwiZWwubGFiZWxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImdldFZhbHVlKGVsLnNjb3BlKVwiIChzZXRWYWx1ZSk9XCJzZXRWYWx1ZSgkZXZlbnQsIGVsLnNjb3BlKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VuZE5vdGlmaWNhdGlvbik9XCJzZW5kTm90aWZpY2F0aW9uKCRldmVudClcIj48L3NmLWNvbnRyb2w+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidUYWJsZSdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLXRhYmxlIFt2YWx1ZV09XCJnZXRWYWx1ZShlbC5zY29wZSlcIiBbY29sdW1uc109XCJnZXRDb250cm9sKGVsLnNjb3BlKS5jb25maWcuY29sdW1uc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJjYXB0aW9uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgaWNvbj1cInBpIHBpLXBsdXNcIiAoY2xpY2spPVwiYWRkT2JqZWN0QXJyYXkoZWwpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInAtYnV0dG9uLXN1Y2Nlc3NcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaGVhZGVyXCIgbGV0LWNvbHVtbnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCAqbmdGb3I9XCJsZXQgY29sIG9mIGNvbHVtbnNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2NvbC5sYWJlbH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInRyeCA9PSAnYycgfHwgdHJ4ID09ICd1J1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD48L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiYm9keVwiIGxldC1yb3dEYXRhIGxldC1jb2x1bW5zPVwiY29sdW1uc1wiIGxldC1yb3dJbmRleD1cInJvd0luZGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbCBvZiBjb2x1bW5zXCIgW25nU3dpdGNoXT1cImNvbC50eXBlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3RleHQnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57e3Jvd0RhdGFbY29sLmNvbF19fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2N1cnJlbmN5OlVTRCdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7cm93RGF0YVtjb2wuY29sXSB8IGN1cnJlbmN5OiAnVVNEJ319PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInRyeCA9PSAnYycgfHwgdHJ4ID09ICd1J1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImVkaXRSb3coZWwsIHJvd0RhdGEpXCIgaWNvbj1cInBpIHBpLXBlbmNpbFwiIGNsYXNzPVwicC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi1pbmZvIG1yLTFcIj48L2J1dHRvbj4gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiZGVsZXRlUm93KGVsLCByb3dJbmRleClcIiBpY29uPVwicGkgcGktdHJhc2hcIiBjbGFzcz1cInAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tZGFuZ2VyXCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtdGFibGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInQ29udHJvbCdcIj5cclxuICAgICAgICAgICAgICAgIDxzZi1jb250cm9sIFtjb250cm9sXT1cImdldENvbnRyb2woZWxlbWVudC5zY29wZSlcIiBbbGFiZWxdPVwiZWxlbWVudC5sYWJlbFwiPjwvc2YtY29udHJvbD5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJjYXJkLWZvb3RlciBtdC0yXCIgKm5nSWY9XCJidG5TdWJtaXRcIj5cclxuICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSB0eXBlPVwiYnV0dG9uXCIgW2ljb25dPVwiYnRuU3VibWl0Lmljb25cIiBbbGFiZWxdPVwiYnRuU3VibWl0LmxhYmVsXCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cInN1Ym1pdCgpXCI+PC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuPC9kaXY+XHJcbiJdfQ==
|