@ng-formworks/cssframework 16.3.0 → 17.3.0
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/esm2022/lib/css-framework.component.mjs +264 -264
- package/esm2022/lib/css-framework.defs.mjs +8 -8
- package/esm2022/lib/css-framework.module.mjs +44 -44
- package/esm2022/lib/css-framework.service.mjs +32 -32
- package/esm2022/lib/css.framework.mjs +84 -84
- package/esm2022/ng-formworks-cssframework.mjs +4 -4
- package/esm2022/public-api.mjs +8 -8
- package/fesm2022/ng-formworks-cssframework.mjs +409 -409
- package/fesm2022/ng-formworks-cssframework.mjs.map +1 -1
- package/index.d.ts +5 -5
- package/lib/css-framework.component.d.ts +41 -41
- package/lib/css-framework.defs.d.ts +69 -69
- package/lib/css-framework.module.d.ts +9 -9
- package/lib/css-framework.service.d.ts +12 -12
- package/lib/css.framework.d.ts +18 -18
- package/package.json +4 -4
- package/public-api.d.ts +5 -5
|
@@ -1,264 +1,264 @@
|
|
|
1
|
-
import { Component, Input, ViewEncapsulation } from '@angular/core';
|
|
2
|
-
import { addClasses, inArray } from '@ng-formworks/core';
|
|
3
|
-
import _, { cloneDeep, map } from 'lodash';
|
|
4
|
-
import * as i0 from "@angular/core";
|
|
5
|
-
import * as i1 from "@ng-formworks/core";
|
|
6
|
-
import * as i2 from "./css-framework.service";
|
|
7
|
-
import * as i3 from "@angular/common";
|
|
8
|
-
export class CssFrameworkComponent {
|
|
9
|
-
//TODO-move to ng-formworks/core utility.functions.ts
|
|
10
|
-
applyCssClasses(type, widgetOptions, styleOptions) {
|
|
11
|
-
//console.log("applyCssClasses for type:"+type);
|
|
12
|
-
let cssClasses = this.widgetStyles[type];
|
|
13
|
-
if (!cssClasses || _.isEmpty(cssClasses)) {
|
|
14
|
-
cssClasses = this.widgetStyles.default;
|
|
15
|
-
}
|
|
16
|
-
Object.keys(cssClasses).forEach(catName => {
|
|
17
|
-
let classList = cssClasses[catName];
|
|
18
|
-
if (classList.length) {
|
|
19
|
-
widgetOptions[catName] = addClasses(widgetOptions[catName], classList);
|
|
20
|
-
}
|
|
21
|
-
if (styleOptions) {
|
|
22
|
-
widgetOptions[catName] = addClasses(widgetOptions[catName], styleOptions);
|
|
23
|
-
}
|
|
24
|
-
});
|
|
25
|
-
}
|
|
26
|
-
flattenWidgetStyles(wstyles) {
|
|
27
|
-
var flattened = {};
|
|
28
|
-
let ignore = ['__themes__'];
|
|
29
|
-
Object.keys(wstyles).forEach(wkey => {
|
|
30
|
-
let wstyle = wstyles[wkey];
|
|
31
|
-
if (ignore.indexOf(wkey) >= 0) {
|
|
32
|
-
flattened[wkey] = wstyle;
|
|
33
|
-
return;
|
|
34
|
-
}
|
|
35
|
-
if (_.isArray(wstyle)) {
|
|
36
|
-
flattened[wkey] = wstyle.join(" ");
|
|
37
|
-
}
|
|
38
|
-
if (_.isObject(wstyle)) { //is csscategories
|
|
39
|
-
flattened[wkey] = flattened[wkey] || {};
|
|
40
|
-
Object.keys(wstyle).forEach(catName => {
|
|
41
|
-
let cssCat = wstyle[catName];
|
|
42
|
-
if (_.isArray(cssCat)) {
|
|
43
|
-
flattened[wkey][catName] = cssCat.join(" ");
|
|
44
|
-
}
|
|
45
|
-
else {
|
|
46
|
-
flattened[wkey][catName] = cssCat;
|
|
47
|
-
}
|
|
48
|
-
});
|
|
49
|
-
}
|
|
50
|
-
if (_.isString(wstyle)) {
|
|
51
|
-
flattened[wkey] = wstyle;
|
|
52
|
-
}
|
|
53
|
-
});
|
|
54
|
-
return flattened;
|
|
55
|
-
}
|
|
56
|
-
constructor(changeDetector, jsf, jsfFLService, cssFWService
|
|
57
|
-
/*@Inject(CSS_FRAMEWORK_CFG ) fwcfg: css_fw.frameworkcfg*/
|
|
58
|
-
) {
|
|
59
|
-
this.changeDetector = changeDetector;
|
|
60
|
-
this.jsf = jsf;
|
|
61
|
-
this.jsfFLService = jsfFLService;
|
|
62
|
-
this.cssFWService = cssFWService;
|
|
63
|
-
this.frameworkInitialized = false;
|
|
64
|
-
this.formControl = null;
|
|
65
|
-
this.debugOutput = '';
|
|
66
|
-
this.debug = '';
|
|
67
|
-
this.parentArray = null;
|
|
68
|
-
this.isOrderable = false;
|
|
69
|
-
this.defaultStyling = {
|
|
70
|
-
array: {},
|
|
71
|
-
default: { fieldHtmlClass: "cssfw-form-control" },
|
|
72
|
-
__themes__: [{ name: 'notheme', text: 'None' }],
|
|
73
|
-
__remove_item__: "cssfw-remove-item",
|
|
74
|
-
__array_item_nonref__: {
|
|
75
|
-
"htmlClass": "cssfw-array-item-nonref"
|
|
76
|
-
},
|
|
77
|
-
__active__: { activeClass: "cssfw-active" },
|
|
78
|
-
__array__: { htmlClass: "cssfw-array" },
|
|
79
|
-
__control_label__: { labelHtmlClass: "cssfw-control-label" },
|
|
80
|
-
__form_group__: { htmlClass: "cssfw-form-group" },
|
|
81
|
-
__field_addon_left__: "cssfw-addon-left",
|
|
82
|
-
__field_addon_right__: "cssfw-addon-right",
|
|
83
|
-
__help_block__: "cssfw-help-block",
|
|
84
|
-
__required_asterisk__: "cssfw-required-astersisk",
|
|
85
|
-
__screen_reader__: "cssfw-screen-reader"
|
|
86
|
-
};
|
|
87
|
-
let activeFramework = this.jsfFLService.activeFramework;
|
|
88
|
-
let fwcfg = activeFramework.config || {};
|
|
89
|
-
this.widgetStyles = Object.assign(this.defaultStyling, fwcfg.widgetstyles);
|
|
90
|
-
let defaultTheme = this.widgetStyles.__themes__[0];
|
|
91
|
-
let defaultThemeName = cssFWService.activeRequestedTheme || defaultTheme.name;
|
|
92
|
-
this.theme = this.options?.theme || defaultThemeName;
|
|
93
|
-
this.frameworkThemeSubs = cssFWService.frameworkTheme$.subscribe(newTheme => {
|
|
94
|
-
this.theme = newTheme;
|
|
95
|
-
});
|
|
96
|
-
}
|
|
97
|
-
ngOnDestroy() {
|
|
98
|
-
this.frameworkThemeSubs.unsubscribe();
|
|
99
|
-
this.frameworkThemeSubs = null;
|
|
100
|
-
}
|
|
101
|
-
get showRemoveButton() {
|
|
102
|
-
if (!this.options.removable || this.options.readonly ||
|
|
103
|
-
this.layoutNode.type === '$ref') {
|
|
104
|
-
return false;
|
|
105
|
-
}
|
|
106
|
-
if (this.layoutNode.recursiveReference) {
|
|
107
|
-
return true;
|
|
108
|
-
}
|
|
109
|
-
if (!this.layoutNode.arrayItem || !this.parentArray) {
|
|
110
|
-
return false;
|
|
111
|
-
}
|
|
112
|
-
// If array length <= minItems, don't allow removing any items
|
|
113
|
-
return this.parentArray.items.length - 1 <= this.parentArray.options.minItems ? false :
|
|
114
|
-
// For removable list items, allow removing any item
|
|
115
|
-
this.layoutNode.arrayItemType === 'list' ? true :
|
|
116
|
-
// For removable tuple items, only allow removing last item in list
|
|
117
|
-
this.layoutIndex[this.layoutIndex.length - 1] === this.parentArray.items.length - 2;
|
|
118
|
-
}
|
|
119
|
-
ngOnInit() {
|
|
120
|
-
this.initializeFramework();
|
|
121
|
-
if (this.layoutNode.arrayItem && this.layoutNode.type !== '$ref') {
|
|
122
|
-
this.parentArray = this.jsf.getParentNode(this);
|
|
123
|
-
if (this.parentArray) {
|
|
124
|
-
this.isOrderable = this.layoutNode.arrayItemType === 'list' &&
|
|
125
|
-
!this.options.readonly && this.parentArray.options.orderable;
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
ngOnChanges() {
|
|
130
|
-
if (!this.frameworkInitialized) {
|
|
131
|
-
this.initializeFramework();
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
initializeFramework() {
|
|
135
|
-
if (this.layoutNode) {
|
|
136
|
-
this.options = cloneDeep(this.layoutNode.options);
|
|
137
|
-
this.widgetLayoutNode = {
|
|
138
|
-
...this.layoutNode,
|
|
139
|
-
options: cloneDeep(this.layoutNode.options)
|
|
140
|
-
};
|
|
141
|
-
this.widgetOptions = this.widgetLayoutNode.options;
|
|
142
|
-
this.formControl = this.jsf.getFormControl(this);
|
|
143
|
-
this.options.isInputWidget = inArray(this.layoutNode.type, [
|
|
144
|
-
'button', 'checkbox', 'checkboxes-inline', 'checkboxes', 'color',
|
|
145
|
-
'date', 'datetime-local', 'datetime', 'email', 'file', 'hidden',
|
|
146
|
-
'image', 'integer', 'month', 'number', 'password', 'radio',
|
|
147
|
-
'radiobuttons', 'radios-inline', 'radios', 'range', 'reset', 'search',
|
|
148
|
-
'select', 'submit', 'tel', 'text', 'textarea', 'time', 'url', 'week'
|
|
149
|
-
]);
|
|
150
|
-
this.options.title = this.setTitle();
|
|
151
|
-
this.options.htmlClass =
|
|
152
|
-
addClasses(this.options.htmlClass, 'schema-form-' + this.layoutNode.type);
|
|
153
|
-
if (this.layoutNode.type === 'array') {
|
|
154
|
-
this.options.htmlClass = addClasses(this.options.htmlClass, this.widgetStyles.__array__.htmlClass);
|
|
155
|
-
}
|
|
156
|
-
else if (this.layoutNode.arrayItem && this.layoutNode.type !== '$ref') {
|
|
157
|
-
this.options.htmlClass = addClasses(this.options.htmlClass, this.widgetStyles.__array_item_nonref__.htmlClass);
|
|
158
|
-
}
|
|
159
|
-
else {
|
|
160
|
-
this.options.htmlClass = addClasses(this.options.htmlClass, this.widgetStyles.__form_group__.htmlClass);
|
|
161
|
-
}
|
|
162
|
-
/*
|
|
163
|
-
this.options.htmlClass =
|
|
164
|
-
this.layoutNode.type === 'array' ?
|
|
165
|
-
addClasses(this.options.htmlClass, ['border','shadow-md','p-1']) :
|
|
166
|
-
this.layoutNode.arrayItem && this.layoutNode.type !== '$ref' ?
|
|
167
|
-
addClasses(this.options.htmlClass, ['border','shadow-md','p-1']) :
|
|
168
|
-
addClasses(this.options.htmlClass, 'mb-1');
|
|
169
|
-
*/
|
|
170
|
-
/*
|
|
171
|
-
this.options.htmlClass =
|
|
172
|
-
this.layoutNode.type === 'array' ?
|
|
173
|
-
addClasses(this.options.htmlClass, this.widgetStyles.array.htmlClass):
|
|
174
|
-
this.layoutNode.arrayItem && this.layoutNode.type !== '$ref' ?
|
|
175
|
-
addClasses(this.options.htmlClass, this.widgetStyles.__array_item_nonref__.htmlClass):
|
|
176
|
-
addClasses(this.options.htmlClass, this.widgetStyles.__form_group__.htmlClass);
|
|
177
|
-
*/
|
|
178
|
-
this.widgetOptions.htmlClass = '';
|
|
179
|
-
this.options.labelHtmlClass =
|
|
180
|
-
addClasses(this.options.labelHtmlClass, this.widgetStyles.__control_label__.labelHtmlClass);
|
|
181
|
-
this.widgetOptions.activeClass =
|
|
182
|
-
addClasses(this.widgetOptions.activeClass, this.widgetStyles.__active__.activeClass);
|
|
183
|
-
this.options.fieldAddonLeft =
|
|
184
|
-
this.options.fieldAddonLeft || this.options.prepend;
|
|
185
|
-
this.options.fieldAddonRight =
|
|
186
|
-
this.options.fieldAddonRight || this.options.append;
|
|
187
|
-
// Add asterisk to titles if required
|
|
188
|
-
if (this.options.title && this.layoutNode.type !== 'tab' &&
|
|
189
|
-
!this.options.notitle && this.options.required &&
|
|
190
|
-
!this.options.title.includes('*')) {
|
|
191
|
-
let required_asterisk_class = this.widgetStyles.__required_asterisk__ || 'text-danger';
|
|
192
|
-
this.options.title += ` <strong class="${required_asterisk_class}">*</strong>`;
|
|
193
|
-
}
|
|
194
|
-
if (this.layoutNode.type == 'optionfieldset') {
|
|
195
|
-
this.options.messageLocation = 'top';
|
|
196
|
-
}
|
|
197
|
-
// Set miscelaneous styles and settings for each control type
|
|
198
|
-
this.applyCssClasses(this.layoutNode.type, this.widgetOptions, this.options.style);
|
|
199
|
-
if (this.formControl) {
|
|
200
|
-
this.updateHelpBlock(this.formControl.status);
|
|
201
|
-
this.formControl.statusChanges.subscribe(status => this.updateHelpBlock(status));
|
|
202
|
-
if (this.options.debug) {
|
|
203
|
-
const vars = [];
|
|
204
|
-
this.debugOutput = map(vars, thisVar => JSON.stringify(thisVar, null, 2)).join('\n');
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
this.frameworkInitialized = true;
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
updateHelpBlock(status) {
|
|
211
|
-
this.options.helpBlock = status === 'INVALID' &&
|
|
212
|
-
this.options.enableErrorState && this.formControl.errors &&
|
|
213
|
-
(this.formControl.dirty || this.options.feedbackOnRender) ?
|
|
214
|
-
this.jsf.formatErrors(this.formControl.errors, this.options.validationMessages) :
|
|
215
|
-
this.options.description || this.options.help || null;
|
|
216
|
-
}
|
|
217
|
-
setTitle() {
|
|
218
|
-
switch (this.layoutNode.type) {
|
|
219
|
-
case 'button':
|
|
220
|
-
case 'checkbox':
|
|
221
|
-
case 'section':
|
|
222
|
-
case 'help':
|
|
223
|
-
case 'msg':
|
|
224
|
-
case 'submit':
|
|
225
|
-
case 'message':
|
|
226
|
-
case 'tabarray':
|
|
227
|
-
case 'tabs':
|
|
228
|
-
case '$ref':
|
|
229
|
-
return null;
|
|
230
|
-
case 'advancedfieldset':
|
|
231
|
-
this.widgetOptions.expandable = true;
|
|
232
|
-
this.widgetOptions.title = 'Advanced options';
|
|
233
|
-
return null;
|
|
234
|
-
case 'authfieldset':
|
|
235
|
-
this.widgetOptions.expandable = true;
|
|
236
|
-
this.widgetOptions.title = 'Authentication settings';
|
|
237
|
-
return null;
|
|
238
|
-
case 'fieldset':
|
|
239
|
-
this.widgetOptions.title = this.options.title;
|
|
240
|
-
return null;
|
|
241
|
-
default:
|
|
242
|
-
this.widgetOptions.title = null;
|
|
243
|
-
return this.jsf.setItemTitle(this);
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
removeItem() {
|
|
247
|
-
this.jsf.removeItem(this);
|
|
248
|
-
}
|
|
249
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
250
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "
|
|
251
|
-
}
|
|
252
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
253
|
-
type: Component,
|
|
254
|
-
args: [{ selector: 'css-framework', encapsulation: ViewEncapsulation.None, template: "<div [attr.data-bs-theme]=\"theme\" [attr.data-theme]=\"theme\" [class]=\"options?.htmlClass || ''\" [class.has-feedback]=\"options?.feedback && options?.isInputWidget &&\r\n (formControl?.dirty || options?.feedbackOnRender)\" [class.has-error]=\"options?.enableErrorState && formControl?.errors &&\r\n (formControl?.dirty || options?.feedbackOnRender)\" [class.has-success]=\"options?.enableSuccessState && !formControl?.errors &&\r\n (formControl?.dirty || options?.feedbackOnRender)\">\r\n\r\n <button *ngIf=\"showRemoveButton\" [class]=\"widgetStyles.__remove_item__\" type=\"button\" (click)=\"removeItem()\">\r\n <span aria-hidden=\"true\">×</span>\r\n <span [class]=\"widgetStyles.__screen_reader__\">Close</span>\r\n </button>\r\n <div *ngIf=\"options?.messageLocation === 'top'\">\r\n <p *ngIf=\"options?.helpBlock\" [class]=\"widgetStyles.__help_block__\" [innerHTML]=\"options?.helpBlock\"></p>\r\n </div>\r\n\r\n <label *ngIf=\"options?.title && layoutNode?.type !== 'tab'\" [attr.for]=\"'control' + layoutNode?._id\" [class]=\"options?.labelHtmlClass || ''\" [class.sr-only]=\"options?.notitle\" [innerHTML]=\"options?.title\"></label>\r\n <p *ngIf=\"layoutNode?.type === 'submit' && jsf?.formOptions?.fieldsRequired\">\r\n <strong [class]=\"widgetStyles.__required_asterisk__\">*</strong> = required fields\r\n </p>\r\n <div [class.input-group]=\"options?.fieldAddonLeft || options?.fieldAddonRight\">\r\n <span *ngIf=\"options?.fieldAddonLeft\" [class]=\"widgetStyles.__field_addon_left__\" [innerHTML]=\"options?.fieldAddonLeft\"></span>\r\n\r\n <select-widget-widget [layoutNode]=\"widgetLayoutNode\" [dataIndex]=\"dataIndex\" [layoutIndex]=\"layoutIndex\"></select-widget-widget>\r\n\r\n <span *ngIf=\"options?.fieldAddonRight\" [class]=\"widgetStyles.__field_addon_right__\" [innerHTML]=\"options?.fieldAddonRight\"></span>\r\n </div>\r\n\r\n <span *ngIf=\"options?.feedback && options?.isInputWidget &&\r\n !options?.fieldAddonRight && !layoutNode.arrayItem &&\r\n (formControl?.dirty || options?.feedbackOnRender)\" [class.glyphicon-ok]=\"options?.enableSuccessState && !formControl?.errors\" [class.glyphicon-remove]=\"options?.enableErrorState && formControl?.errors\" aria-hidden=\"true\" class=\"form-control-feedback glyphicon\"></span>\r\n <div *ngIf=\"options?.messageLocation !== 'top'\">\r\n <p *ngIf=\"options?.helpBlock\" [class]=\"widgetStyles.__help_block__\" [innerHTML]=\"options?.helpBlock\"></p>\r\n </div>\r\n\r\n</div>\r\n\r\n<div *ngIf=\"debug && debugOutput\">debug:\r\n <pre>{{debugOutput}}</pre>\r\n</div>\r\n\r\n<!--\r\n<div class=\"btn input input-bordered input-primary w-full max-w-xs\r\nbtn-neutral\r\nbtn-primary\r\nbtn-secondary\r\nbtn-accent\r\nbtn-info\r\nbtn-success\r\nbtn-warning\r\nbtn-error\r\nbtn-ghost\r\nbtn-link\r\nbtn-outline\r\nbtn-active\r\nbtn-disabled\r\nglass\r\nno-animation\r\nbtn-lg\r\nbtn-md\r\nbtn-sm\r\nbtn-xs\r\nbtn-wide\r\nbtn-block\r\nbtn-circle\r\nbtn-square\r\nhidden\r\n\">defs al</div>\r\n-->\r\n<!--<input type=\"text\" placeholder=\"Type here\" class=\"input input-bordered input-primary w-full max-w-xs\" />-->", styles: [":host ::ng-deep .list-group-item .form-control-feedback{top:40px}:host ::ng-deep .checkbox,:host ::ng-deep .radio{margin-top:0;margin-bottom:0}:host ::ng-deep .checkbox-inline,:host ::ng-deep .checkbox-inline+.checkbox-inline,:host ::ng-deep .checkbox-inline+.radio-inline,:host ::ng-deep .radio-inline,:host ::ng-deep .radio-inline+.radio-inline,:host ::ng-deep .radio-inline+.checkbox-inline{margin-left:0;margin-right:10px}:host ::ng-deep .checkbox-inline:last-child,:host ::ng-deep .radio-inline:last-child{margin-right:0}:host ::ng-deep .ng-invalid.ng-touched{border:1px solid #f44336}.checkbox-inline,.checkbox-inline+.checkbox-inline,.checkbox-inline+.radio-inline,.radio-inline,.radio-inline+.radio-inline,.radio-inline+.checkbox-inline{margin-left:0;margin-right:10px}.checkbox-inline:last-child,.radio-inline:last-child{margin-right:0}.ng-invalid.ng-touched{border:1px solid #f44336}\n"] }]
|
|
255
|
-
}], ctorParameters:
|
|
256
|
-
type: Input
|
|
257
|
-
}], layoutIndex: [{
|
|
258
|
-
type: Input
|
|
259
|
-
}], dataIndex: [{
|
|
260
|
-
type: Input
|
|
261
|
-
}], widgetStyles: [{
|
|
262
|
-
type: Input
|
|
263
|
-
}] } });
|
|
264
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3NzLWZyYW1ld29yay5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1mb3Jtd29ya3MtY3NzZnJhbWV3b3JrL3NyYy9saWIvY3NzLWZyYW1ld29yay5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1mb3Jtd29ya3MtY3NzZnJhbWV3b3JrL3NyYy9saWIvY3NzLWZyYW1ld29yay5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQXFCLFNBQVMsRUFBRSxLQUFLLEVBQWdDLGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JILE9BQU8sRUFBa0QsVUFBVSxFQUFFLE9BQU8sRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3pHLE9BQU8sQ0FBQyxFQUFFLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLFFBQVEsQ0FBQzs7Ozs7QUFXM0MsTUFBTSxPQUFPLHFCQUFxQjtJQW9CaEMscURBQXFEO0lBQ3JELGVBQWUsQ0FBQyxJQUFJLEVBQUUsYUFBYSxFQUFFLFlBQVk7UUFDL0MsZ0RBQWdEO1FBQ2hELElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDekMsSUFBSSxDQUFDLFVBQVUsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUFHO1lBQ3pDLFVBQVUsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQztTQUN4QztRQUNELE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ3hDLElBQUksU0FBUyxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUVwQyxJQUFJLFNBQVMsQ0FBQyxNQUFNLEVBQUU7Z0JBQ3BCLGFBQWEsQ0FBQyxPQUFPLENBQUMsR0FBRyxVQUFVLENB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LENBQUM7Z0JBQ2hDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDdEM7SUFDSCxDQUFDO0lBRUQsVUFBVTtRQUNSLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzVCLENBQUM7K0dBalNVLHFCQUFxQjttR0FBckIscUJBQXFCLGtNQ2JsQywwcEdBa0UrRzs7NEZEckRsRyxxQkFBcUI7a0JBTmpDLFNBQVM7K0JBQ0UsZUFBZSxpQkFHVixpQkFBaUIsQ0FBQyxJQUFJO29OQVk1QixVQUFVO3NCQUFsQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFFRyxZQUFZO3NCQUFwQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgSW5wdXQsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBPbkluaXQsIFZpZXdFbmNhcHN1bGF0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZyYW1ld29ya0xpYnJhcnlTZXJ2aWNlLCBKc29uU2NoZW1hRm9ybVNlcnZpY2UsIGFkZENsYXNzZXMsIGluQXJyYXkgfSBmcm9tICdAbmctZm9ybXdvcmtzL2NvcmUnO1xyXG5pbXBvcnQgXywgeyBjbG9uZURlZXAsIG1hcCB9IGZyb20gJ2xvZGFzaCc7XHJcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBjc3NfZncgfSBmcm9tICcuL2Nzcy1mcmFtZXdvcmsuZGVmcyc7XHJcbmltcG9ydCB7IENzc2ZyYW1ld29ya1NlcnZpY2UgfSBmcm9tICcuL2Nzcy1mcmFtZXdvcmsuc2VydmljZSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2Nzcy1mcmFtZXdvcmsnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9jc3MtZnJhbWV3b3JrLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9jc3MtZnJhbWV3b3JrLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQ3NzRnJhbWV3b3JrQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsT25EZXN0cm95IHtcclxuICBmcmFtZXdvcmtJbml0aWFsaXplZCA9IGZhbHNlO1xyXG4gIHdpZGdldE9wdGlvbnM6IGFueTsgLy8gT3B0aW9ucyBwYXNzZWQgdG8gY2hpbGQgd2lkZ2V0XHJcbiAgd2lkZ2V0TGF5b3V0Tm9kZTogYW55OyAvLyBsYXlvdXROb2RlIHBhc3NlZCB0byBjaGlsZCB3aWRnZXRcclxuICBvcHRpb25zOiBhbnk7IC8vIE9wdGlvbnMgdXNlZCBpbiB0aGlzIGZyYW1ld29ya1xyXG4gIGZvcm1Db250cm9sOiBhbnkgPSBudWxsO1xyXG4gIGRlYnVnT3V0cHV0OiBhbnkgPSAnJztcclxuICBkZWJ1ZzogYW55ID0gJyc7XHJcbiAgcGFyZW50QXJyYXk6IGFueSA9IG51bGw7XHJcbiAgaXNPcmRlcmFibGUgPSBmYWxzZTtcclxuICBASW5wdXQoKSBsYXlvdXROb2RlOiBhbnk7XHJcbiAgQElucHV0KCkgbGF5b3V0SW5kZXg6IG51bWJlcltdO1xyXG4gIEBJbnB1dCgpIGRhdGFJbmRleDogbnVtYmVyW107XHJcblxyXG4gIEBJbnB1dCgpIHdpZGdldFN0eWxlczogY3NzX2Z3LndpZGdldHN0eWxlcztcclxuXHJcblxyXG5cclxuXHJcblxyXG4gIC8vVE9ETy1tb3ZlIHRvIG5nLWZvcm13b3Jrcy9jb3JlIHV0aWxpdHkuZnVuY3Rpb25zLnRzXHJcbiAgYXBwbHlDc3NDbGFzc2VzKHR5cGUsIHdpZGdldE9wdGlvbnMsIHN0eWxlT3B0aW9ucykge1xyXG4gICAgLy9jb25zb2xlLmxvZyhcImFwcGx5Q3NzQ2xhc3NlcyBmb3IgdHlwZTpcIit0eXBlKTtcclxuICAgIGxldCBjc3NDbGFzc2VzID0gdGhpcy53aWRnZXRTdHlsZXNbdHlwZV07XHJcbiAgICBpZiAoIWNzc0NsYXNzZXMgfHwgXy5pc0VtcHR5KGNzc0NsYXNzZXMpICkge1xyXG4gICAgICBjc3NDbGFzc2VzID0gdGhpcy53aWRnZXRTdHlsZXMuZGVmYXVsdDtcclxuICAgIH1cclxuICAgIE9iamVjdC5rZXlzKGNzc0NsYXNzZXMpLmZvckVhY2goY2F0TmFtZSA9PiB7XHJcbiAgICAgIGxldCBjbGFzc0xpc3QgPSBjc3NDbGFzc2VzW2NhdE5hbWVdO1xyXG5cclxuICAgICAgaWYgKGNsYXNzTGlzdC5sZW5ndGgpIHtcclxuICAgICAgICB3aWRnZXRPcHRpb25zW2NhdE5hbWVdID0gYWRkQ2xhc3Nlcyh3aWRnZXRPcHRpb25zW2NhdE5hbWVdLCBjbGFzc0xpc3QpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChzdHlsZU9wdGlvbnMpIHtcclxuICAgICAgICB3aWRnZXRPcHRpb25zW2NhdE5hbWVdID0gYWRkQ2xhc3Nlcyh3aWRnZXRPcHRpb25zW2NhdE5hbWVdLCBzdHlsZU9wdGlvbnMpO1xyXG4gICAgICB9XHJcblxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGZsYXR0ZW5XaWRnZXRTdHlsZXMod3N0eWxlczpjc3NfZncud2lkZ2V0c3R5bGVzKXtcclxuICAgIHZhciBmbGF0dGVuZWQ6YW55PXt9O1xyXG4gICAgbGV0IGlnbm9yZT1bJ19fdGhlbWVzX18nXTtcclxuICAgIE9iamVjdC5rZXlzKHdzdHlsZXMpLmZvckVhY2god2tleT0+e1xyXG4gICAgICBsZXQgd3N0eWxlPXdzdHlsZXNbd2tleV07XHJcbiAgICAgIGlmKGlnbm9yZS5pbmRleE9mKHdrZXkpPj0wKXtcclxuICAgICAgICBmbGF0dGVuZWRbd2tleV09d3N0eWxlO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBpZihfLmlzQXJyYXkod3N0eWxlKSl7XHJcbiAgICAgICAgXHJcbiAgICAgICAgZmxhdHRlbmVkW3drZXldPXdzdHlsZS5qb2luKFwiIFwiKTtcclxuICAgICAgfVxyXG4gICAgICBpZihfLmlzT2JqZWN0KHdzdHlsZSkpey8vaXMgY3NzY2F0ZWdvcmllc1xyXG4gICAgICAgICAgZmxhdHRlbmVkW3drZXldPWZsYXR0ZW5lZFt3a2V5XXx8e307XHJcbiAgICAgICAgT2JqZWN0LmtleXMod3N0eWxlKS5mb3JFYWNoKGNhdE5hbWU9PntcclxuICAgICAgICAgIGxldCBjc3NDYXQ9d3N0eWxlW2NhdE5hbWVdO1xyXG4gICAgICAgICAgXHJcbiAgICAgICAgICBpZihfLmlzQXJyYXkoY3NzQ2F0KSl7XHJcbiAgICAgICAgICAgIGZsYXR0ZW5lZFt3a2V5XVtjYXROYW1lXT1jc3NDYXQuam9pbihcIiBcIik7XHJcbiAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgZmxhdHRlbmVkW3drZXldW2NhdE5hbWVdPWNzc0NhdDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgICB9XHJcbiAgICAgIGlmKF8uaXNTdHJpbmcod3N0eWxlKSl7XHJcbiAgICAgICAgZmxhdHRlbmVkW3drZXldPXdzdHlsZTtcclxuICAgICAgfVxyXG4gICAgfSlcclxuICAgIHJldHVybiBmbGF0dGVuZWRcclxufVxyXG5cclxuZGVmYXVsdFN0eWxpbmc6Y3NzX2Z3LndpZGdldHN0eWxlcz17XHJcbiAgYXJyYXk6e30sXHJcbiAgZGVmYXVsdDp7ZmllbGRIdG1sQ2xhc3M6IFwiY3NzZnctZm9ybS1jb250cm9sXCJ9LFxyXG4gIF9fdGhlbWVzX186W3tuYW1lOidub3RoZW1lJyx0ZXh0OidOb25lJ31dLFxyXG4gIF9fcmVtb3ZlX2l0ZW1fXzpcImNzc2Z3LXJlbW92ZS1pdGVtXCIsXHJcbiAgICBfX2FycmF5X2l0ZW1fbm9ucmVmX186e1xyXG4gICAgICBcImh0bWxDbGFzc1wiOiAgIFwiY3NzZnctYXJyYXktaXRlbS1ub25yZWZcIlxyXG4gIH0sXHJcbiAgX19hY3RpdmVfXzp7YWN0aXZlQ2xhc3M6XCJjc3Nmdy1hY3RpdmVcIn0sXHJcbiAgX19hcnJheV9fOntodG1sQ2xhc3M6XCJjc3Nmdy1hcnJheVwifSxcclxuICBfX2NvbnRyb2xfbGFiZWxfXzp7bGFiZWxIdG1sQ2xhc3M6XCJjc3Nmdy1jb250cm9sLWxhYmVsXCJ9LFxyXG4gIF9fZm9ybV9ncm91cF9fOntodG1sQ2xhc3M6IFwiY3NzZnctZm9ybS1ncm91cFwifSxcclxuICBfX2ZpZWxkX2FkZG9uX2xlZnRfXzpcImNzc2Z3LWFkZG9uLWxlZnRcIixcclxuICBfX2ZpZWxkX2FkZG9uX3JpZ2h0X186XCJjc3Nmdy1hZGRvbi1yaWdodFwiLFxyXG4gIF9faGVscF9ibG9ja19fOlwiY3NzZnctaGVscC1ibG9ja1wiLFxyXG4gIF9fcmVxdWlyZWRfYXN0ZXJpc2tfXzpcImNzc2Z3LXJlcXVpcmVkLWFzdGVyc2lza1wiLFxyXG4gIF9fc2NyZWVuX3JlYWRlcl9fOiBcImNzc2Z3LXNjcmVlbi1yZWFkZXJcIlxyXG5cclxufVxyXG5cclxuXHJcblxyXG5cclxudGhlbWU6c3RyaW5nXHJcbmZyYW1ld29ya1RoZW1lU3ViczpTdWJzY3JpcHRpb247XHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwdWJsaWMgY2hhbmdlRGV0ZWN0b3I6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgcHVibGljIGpzZjogSnNvblNjaGVtYUZvcm1TZXJ2aWNlLFxyXG4gICAgcHVibGljIGpzZkZMU2VydmljZTpGcmFtZXdvcmtMaWJyYXJ5U2VydmljZSxcclxuICAgIHB1YmxpYyBjc3NGV1NlcnZpY2U6Q3NzZnJhbWV3b3JrU2VydmljZVxyXG4gICAgLypASW5qZWN0KENTU19GUkFNRVdPUktfQ0ZHICkgZndjZmc6IGNzc19mdy5mcmFtZXdvcmtjZmcqL1xyXG5cclxuICApIHtcclxuICAgIFxyXG4gICAgbGV0IGFjdGl2ZUZyYW1ld29yazphbnk9dGhpcy5qc2ZGTFNlcnZpY2UuYWN0aXZlRnJhbWV3b3JrO1xyXG4gICAgbGV0IGZ3Y2ZnPWFjdGl2ZUZyYW1ld29yay5jb25maWd8fHt9O1xyXG4gICAgdGhpcy53aWRnZXRTdHlsZXMgPSBPYmplY3QuYXNzaWduKHRoaXMuZGVmYXVsdFN0eWxpbmcsZndjZmcud2lkZ2V0c3R5bGVzKTtcclxuICAgIGxldCBkZWZhdWx0VGhlbWU9dGhpcy53aWRnZXRTdHlsZXMuX190aGVtZXNfX1swXTtcclxuICAgIGxldCBkZWZhdWx0VGhlbWVOYW1lPWNzc0ZXU2VydmljZS5hY3RpdmVSZXF1ZXN0ZWRUaGVtZXx8ZGVmYXVsdFRoZW1lLm5hbWU7XHJcbiAgICB0aGlzLnRoZW1lPXRoaXMub3B0aW9ucz8udGhlbWV8fCBkZWZhdWx0VGhlbWVOYW1lO1xyXG4gICAgdGhpcy5mcmFtZXdvcmtUaGVtZVN1YnM9Y3NzRldTZXJ2aWNlLmZyYW1ld29ya1RoZW1lJC5zdWJzY3JpYmUobmV3VGhlbWU9PntcclxuICAgICAgICB0aGlzLnRoZW1lPW5ld1RoZW1lO1xyXG4gICAgfSlcclxuIFxyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLmZyYW1ld29ya1RoZW1lU3Vicy51bnN1YnNjcmliZSgpO1xyXG4gICAgdGhpcy5mcmFtZXdvcmtUaGVtZVN1YnM9bnVsbDtcclxuICB9XHJcblxyXG5cclxuICBnZXQgc2hvd1JlbW92ZUJ1dHRvbigpOiBib29sZWFuIHtcclxuICAgIGlmICghdGhpcy5vcHRpb25zLnJlbW92YWJsZSB8fCB0aGlzLm9wdGlvbnMucmVhZG9ubHkgfHxcclxuICAgICAgdGhpcy5sYXlvdXROb2RlLnR5cGUgPT09ICckcmVmJ1xyXG4gICAgKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmxheW91dE5vZGUucmVjdXJzaXZlUmVmZXJlbmNlKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgaWYgKCF0aGlzLmxheW91dE5vZGUuYXJyYXlJdGVtIHx8ICF0aGlzLnBhcmVudEFycmF5KSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIC8vIElmIGFycmF5IGxlbmd0aCA8PSBtaW5JdGVtcywgZG9uJ3QgYWxsb3cgcmVtb3ZpbmcgYW55IGl0ZW1zXHJcbiAgICByZXR1cm4gdGhpcy5wYXJlbnRBcnJheS5pdGVtcy5sZW5ndGggLSAxIDw9IHRoaXMucGFyZW50QXJyYXkub3B0aW9ucy5taW5JdGVtcyA/IGZhbHNlIDpcclxuICAgICAgLy8gRm9yIHJlbW92YWJsZSBsaXN0IGl0ZW1zLCBhbGxvdyByZW1vdmluZyBhbnkgaXRlbVxyXG4gICAgICB0aGlzLmxheW91dE5vZGUuYXJyYXlJdGVtVHlwZSA9PT0gJ2xpc3QnID8gdHJ1ZSA6XHJcbiAgICAgICAgLy8gRm9yIHJlbW92YWJsZSB0dXBsZSBpdGVtcywgb25seSBhbGxvdyByZW1vdmluZyBsYXN0IGl0ZW0gaW4gbGlzdFxyXG4gICAgICAgIHRoaXMubGF5b3V0SW5kZXhbdGhpcy5sYXlvdXRJbmRleC5sZW5ndGggLSAxXSA9PT0gdGhpcy5wYXJlbnRBcnJheS5pdGVtcy5sZW5ndGggLSAyO1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLmluaXRpYWxpemVGcmFtZXdvcmsoKTtcclxuICAgIGlmICh0aGlzLmxheW91dE5vZGUuYXJyYXlJdGVtICYmIHRoaXMubGF5b3V0Tm9kZS50eXBlICE9PSAnJHJlZicpIHtcclxuICAgICAgdGhpcy5wYXJlbnRBcnJheSA9IHRoaXMuanNmLmdldFBhcmVudE5vZGUodGhpcyk7XHJcbiAgICAgIGlmICh0aGlzLnBhcmVudEFycmF5KSB7XHJcbiAgICAgICAgdGhpcy5pc09yZGVyYWJsZSA9IHRoaXMubGF5b3V0Tm9kZS5hcnJheUl0ZW1UeXBlID09PSAnbGlzdCcgJiZcclxuICAgICAgICAgICF0aGlzLm9wdGlvbnMucmVhZG9ubHkgJiYgdGhpcy5wYXJlbnRBcnJheS5vcHRpb25zLm9yZGVyYWJsZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoKSB7XHJcbiAgICBpZiAoIXRoaXMuZnJhbWV3b3JrSW5pdGlhbGl6ZWQpIHtcclxuICAgICAgdGhpcy5pbml0aWFsaXplRnJhbWV3b3JrKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBpbml0aWFsaXplRnJhbWV3b3JrKCkge1xyXG4gICAgaWYgKHRoaXMubGF5b3V0Tm9kZSkge1xyXG4gICAgICB0aGlzLm9wdGlvbnMgPSBjbG9uZURlZXAodGhpcy5sYXlvdXROb2RlLm9wdGlvbnMpO1xyXG4gICAgICB0aGlzLndpZGdldExheW91dE5vZGUgPSB7XHJcbiAgICAgICAgLi4udGhpcy5sYXlvdXROb2RlLFxyXG4gICAgICAgIG9wdGlvbnM6IGNsb25lRGVlcCh0aGlzLmxheW91dE5vZGUub3B0aW9ucylcclxuICAgICAgfTtcclxuICAgICAgdGhpcy53aWRnZXRPcHRpb25zID0gdGhpcy53aWRnZXRMYXlvdXROb2RlLm9wdGlvbnM7XHJcbiAgICAgIHRoaXMuZm9ybUNvbnRyb2wgPSB0aGlzLmpzZi5nZXRGb3JtQ29udHJvbCh0aGlzKTtcclxuXHJcbiAgICAgIHRoaXMub3B0aW9ucy5pc0lucHV0V2lkZ2V0ID0gaW5BcnJheSh0aGlzLmxheW91dE5vZGUudHlwZSwgW1xyXG4gICAgICAgICdidXR0b24nLCAnY2hlY2tib3gnLCAnY2hlY2tib3hlcy1pbmxpbmUnLCAnY2hlY2tib3hlcycsICdjb2xvcicsXHJcbiAgICAgICAgJ2RhdGUnLCAnZGF0ZXRpbWUtbG9jYWwnLCAnZGF0ZXRpbWUnLCAnZW1haWwnLCAnZmlsZScsICdoaWRkZW4nLFxyXG4gICAgICAgICdpbWFnZScsICdpbnRlZ2VyJywgJ21vbnRoJywgJ251bWJlcicsICdwYXNzd29yZCcsICdyYWRpbycsXHJcbiAgICAgICAgJ3JhZGlvYnV0dG9ucycsICdyYWRpb3MtaW5saW5lJywgJ3JhZGlvcycsICdyYW5nZScsICdyZXNldCcsICdzZWFyY2gnLFxyXG4gICAgICAgICdzZWxlY3QnLCAnc3VibWl0JywgJ3RlbCcsICd0ZXh0JywgJ3RleHRhcmVhJywgJ3RpbWUnLCAndXJsJywgJ3dlZWsnXHJcbiAgICAgIF0pO1xyXG5cclxuICAgICAgdGhpcy5vcHRpb25zLnRpdGxlID0gdGhpcy5zZXRUaXRsZSgpO1xyXG5cclxuICAgICAgdGhpcy5vcHRpb25zLmh0bWxDbGFzcyA9XHJcbiAgICAgICAgYWRkQ2xhc3Nlcyh0aGlzLm9wdGlvbnMuaHRtbENsYXNzLCAnc2NoZW1hLWZvcm0tJyArIHRoaXMubGF5b3V0Tm9kZS50eXBlKTtcclxuXHJcbiAgICAgIFxyXG4gICAgICBpZiAodGhpcy5sYXlvdXROb2RlLnR5cGUgPT09ICdhcnJheScpIHtcclxuICAgICAgICB0aGlzLm9wdGlvbnMuaHRtbENsYXNzID0gYWRkQ2xhc3Nlcyh0aGlzLm9wdGlvbnMuaHRtbENsYXNzLCB0aGlzLndpZGdldFN0eWxlcy5fX2FycmF5X18uaHRtbENsYXNzKTtcclxuICAgICAgfSBlbHNlIGlmICh0aGlzLmxheW91dE5vZGUuYXJyYXlJdGVtICYmIHRoaXMubGF5b3V0Tm9kZS50eXBlICE9PSAnJHJlZicpIHtcclxuICAgICAgICB0aGlzLm9wdGlvbnMuaHRtbENsYXNzID0gYWRkQ2xhc3Nlcyh0aGlzLm9wdGlvbnMuaHRtbENsYXNzLCB0aGlzLndpZGdldFN0eWxlcy5fX2FycmF5X2l0ZW1fbm9ucmVmX18uaHRtbENsYXNzKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLm9wdGlvbnMuaHRtbENsYXNzID0gYWRkQ2xhc3Nlcyh0aGlzLm9wdGlvbnMuaHRtbENsYXNzLCB0aGlzLndpZGdldFN0eWxlcy5fX2Zvcm1fZ3JvdXBfXy5odG1sQ2xhc3MpO1xyXG4gICAgICB9XHJcbiAgICAgIFxyXG5cclxuICAgICAgLypcclxuICAgICAgdGhpcy5vcHRpb25zLmh0bWxDbGFzcyA9XHJcbiAgICAgIHRoaXMubGF5b3V0Tm9kZS50eXBlID09PSAnYXJyYXknID9cclxuICAgICAgICBhZGRDbGFzc2VzKHRoaXMub3B0aW9ucy5odG1sQ2xhc3MsIFsnYm9yZGVyJywnc2hhZG93LW1kJywncC0xJ10pIDpcclxuICAgICAgICB0aGlzLmxheW91dE5vZGUuYXJyYXlJdGVtICYmIHRoaXMubGF5b3V0Tm9kZS50eXBlICE9PSAnJHJlZicgP1xyXG4gICAgICAgICAgYWRkQ2xhc3Nlcyh0aGlzLm9wdGlvbnMuaHRtbENsYXNzLCBbJ2JvcmRlcicsJ3NoYWRvdy1tZCcsJ3AtMSddKSA6XHJcbiAgICAgICAgICBhZGRDbGFzc2VzKHRoaXMub3B0aW9ucy5odG1sQ2xhc3MsICdtYi0xJyk7XHJcbiovXHJcblxyXG4vKlxyXG50aGlzLm9wdGlvbnMuaHRtbENsYXNzID1cclxudGhpcy5sYXlvdXROb2RlLnR5cGUgPT09ICdhcnJheScgP1xyXG5hZGRDbGFzc2VzKHRoaXMub3B0aW9ucy5odG1sQ2xhc3MsIHRoaXMud2lkZ2V0U3R5bGVzLmFycmF5Lmh0bWxDbGFzcyk6XHJcbiAgdGhpcy5sYXlvdXROb2RlLmFycmF5SXRlbSAmJiB0aGlzLmxheW91dE5vZGUudHlwZSAhPT0gJyRyZWYnID9cclxuICBhZGRDbGFzc2VzKHRoaXMub3B0aW9ucy5odG1sQ2xhc3MsIHRoaXMud2lkZ2V0U3R5bGVzLl9fYXJyYXlfaXRlbV9ub25yZWZfXy5odG1sQ2xhc3MpOlxyXG4gIGFkZENsYXNzZXModGhpcy5vcHRpb25zLmh0bWxDbGFzcywgdGhpcy53aWRnZXRTdHlsZXMuX19mb3JtX2dyb3VwX18uaHRtbENsYXNzKTtcclxuKi9cclxuICAgICAgICAgIFxyXG4gICAgICB0aGlzLndpZGdldE9wdGlvbnMuaHRtbENsYXNzID0gJyc7XHJcbiAgICAgIHRoaXMub3B0aW9ucy5sYWJlbEh0bWxDbGFzcyA9XHJcbiAgICAgICAgYWRkQ2xhc3Nlcyh0aGlzLm9wdGlvbnMubGFiZWxIdG1sQ2xhc3MsIHRoaXMud2lkZ2V0U3R5bGVzLl9fY29udHJvbF9sYWJlbF9fLmxhYmVsSHRtbENsYXNzKTtcclxuICAgICAgdGhpcy53aWRnZXRPcHRpb25zLmFjdGl2ZUNsYXNzID1cclxuICAgICAgICBhZGRDbGFzc2VzKHRoaXMud2lkZ2V0T3B0aW9ucy5hY3RpdmVDbGFzcywgdGhpcy53aWRnZXRTdHlsZXMuX19hY3RpdmVfXy5hY3RpdmVDbGFzcyk7XHJcbiAgICAgIHRoaXMub3B0aW9ucy5maWVsZEFkZG9uTGVmdCA9XHJcbiAgICAgICAgdGhpcy5vcHRpb25zLmZpZWxkQWRkb25MZWZ0IHx8IHRoaXMub3B0aW9ucy5wcmVwZW5kO1xyXG4gICAgICB0aGlzLm9wdGlvbnMuZmllbGRBZGRvblJpZ2h0ID1cclxuICAgICAgICB0aGlzLm9wdGlvbnMuZmllbGRBZGRvblJpZ2h0IHx8IHRoaXMub3B0aW9ucy5hcHBlbmQ7XHJcblxyXG4gICAgICAvLyBBZGQgYXN0ZXJpc2sgdG8gdGl0bGVzIGlmIHJlcXVpcmVkXHJcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMudGl0bGUgJiYgdGhpcy5sYXlvdXROb2RlLnR5cGUgIT09ICd0YWInICYmXHJcbiAgICAgICAgIXRoaXMub3B0aW9ucy5ub3RpdGxlICYmIHRoaXMub3B0aW9ucy5yZXF1aXJlZCAmJlxyXG4gICAgICAgICF0aGlzLm9wdGlvbnMudGl0bGUuaW5jbHVkZXMoJyonKVxyXG4gICAgICApIHtcclxuICAgICAgICBsZXQgcmVxdWlyZWRfYXN0ZXJpc2tfY2xhc3M9dGhpcy53aWRnZXRTdHlsZXMuX19yZXF1aXJlZF9hc3Rlcmlza19ffHwndGV4dC1kYW5nZXInXHJcbiAgICAgICAgdGhpcy5vcHRpb25zLnRpdGxlICs9IGAgPHN0cm9uZyBjbGFzcz1cIiR7cmVxdWlyZWRfYXN0ZXJpc2tfY2xhc3N9XCI+Kjwvc3Ryb25nPmA7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRoaXMubGF5b3V0Tm9kZS50eXBlID09ICdvcHRpb25maWVsZHNldCcpIHtcclxuICAgICAgICB0aGlzLm9wdGlvbnMubWVzc2FnZUxvY2F0aW9uID0gJ3RvcCc7XHJcbiAgICAgIH1cclxuICAgICAgLy8gU2V0IG1pc2NlbGFuZW91cyBzdHlsZXMgYW5kIHNldHRpbmdzIGZvciBlYWNoIGNvbnRyb2wgdHlwZVxyXG4gICAgICB0aGlzLmFwcGx5Q3NzQ2xhc3Nlcyh0aGlzLmxheW91dE5vZGUudHlwZSwgdGhpcy53aWRnZXRPcHRpb25zLCB0aGlzLm9wdGlvbnMuc3R5bGUpO1xyXG4gICAgICBpZiAodGhpcy5mb3JtQ29udHJvbCkge1xyXG4gICAgICAgIHRoaXMudXBkYXRlSGVscEJsb2NrKHRoaXMuZm9ybUNvbnRyb2wuc3RhdHVzKTtcclxuICAgICAgICB0aGlzLmZvcm1Db250cm9sLnN0YXR1c0NoYW5nZXMuc3Vic2NyaWJlKHN0YXR1cyA9PiB0aGlzLnVwZGF0ZUhlbHBCbG9jayhzdGF0dXMpKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5kZWJ1Zykge1xyXG4gICAgICAgICAgY29uc3QgdmFyczogYW55W10gPSBbXTtcclxuICAgICAgICAgIHRoaXMuZGVidWdPdXRwdXQgPSBtYXAodmFycywgdGhpc1ZhciA9PiBKU09OLnN0cmluZ2lmeSh0aGlzVmFyLCBudWxsLCAyKSkuam9pbignXFxuJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuZnJhbWV3b3JrSW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG4gIHVwZGF0ZUhlbHBCbG9jayhzdGF0dXMpIHtcclxuICAgIHRoaXMub3B0aW9ucy5oZWxwQmxvY2sgPSBzdGF0dXMgPT09ICdJTlZBTElEJyAmJlxyXG4gICAgICB0aGlzLm9wdGlvbnMuZW5hYmxlRXJyb3JTdGF0ZSAmJiB0aGlzLmZvcm1Db250cm9sLmVycm9ycyAmJlxyXG4gICAgICAodGhpcy5mb3JtQ29udHJvbC5kaXJ0eSB8fCB0aGlzLm9wdGlvbnMuZmVlZGJhY2tPblJlbmRlcikgP1xyXG4gICAgICB0aGlzLmpzZi5mb3JtYXRFcnJvcnModGhpcy5mb3JtQ29udHJvbC5lcnJvcnMsIHRoaXMub3B0aW9ucy52YWxpZGF0aW9uTWVzc2FnZXMpIDpcclxuICAgICAgdGhpcy5vcHRpb25zLmRlc2NyaXB0aW9uIHx8IHRoaXMub3B0aW9ucy5oZWxwIHx8IG51bGw7XHJcbiAgfVxyXG5cclxuICBzZXRUaXRsZSgpOiBzdHJpbmcge1xyXG4gICAgc3dpdGNoICh0aGlzLmxheW91dE5vZGUudHlwZSkge1xyXG4gICAgICBjYXNlICdidXR0b24nOlxyXG4gICAgICBjYXNlICdjaGVja2JveCc6XHJcbiAgICAgIGNhc2UgJ3NlY3Rpb24nOlxyXG4gICAgICBjYXNlICdoZWxwJzpcclxuICAgICAgY2FzZSAnbXNnJzpcclxuICAgICAgY2FzZSAnc3VibWl0JzpcclxuICAgICAgY2FzZSAnbWVzc2FnZSc6XHJcbiAgICAgIGNhc2UgJ3RhYmFycmF5JzpcclxuICAgICAgY2FzZSAndGFicyc6XHJcbiAgICAgIGNhc2UgJyRyZWYnOlxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICBjYXNlICdhZHZhbmNlZGZpZWxkc2V0JzpcclxuICAgICAgICB0aGlzLndpZGdldE9wdGlvbnMuZXhwYW5kYWJsZSA9IHRydWU7XHJcbiAgICAgICAgdGhpcy53aWRnZXRPcHRpb25zLnRpdGxlID0gJ0FkdmFuY2VkIG9wdGlvbnMnO1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICBjYXNlICdhdXRoZmllbGRzZXQnOlxyXG4gICAgICAgIHRoaXMud2lkZ2V0T3B0aW9ucy5leHBhbmRhYmxlID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLndpZGdldE9wdGlvbnMudGl0bGUgPSAnQXV0aGVudGljYXRpb24gc2V0dGluZ3MnO1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICBjYXNlICdmaWVsZHNldCc6XHJcbiAgICAgICAgdGhpcy53aWRnZXRPcHRpb25zLnRpdGxlID0gdGhpcy5vcHRpb25zLnRpdGxlO1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHRoaXMud2lkZ2V0T3B0aW9ucy50aXRsZSA9IG51bGw7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuanNmLnNldEl0ZW1UaXRsZSh0aGlzKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlbW92ZUl0ZW0oKSB7XHJcbiAgICB0aGlzLmpzZi5yZW1vdmVJdGVtKHRoaXMpO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2IFthdHRyLmRhdGEtYnMtdGhlbWVdPVwidGhlbWVcIiBbYXR0ci5kYXRhLXRoZW1lXT1cInRoZW1lXCIgW2NsYXNzXT1cIm9wdGlvbnM/Lmh0bWxDbGFzcyB8fCAnJ1wiIFtjbGFzcy5oYXMtZmVlZGJhY2tdPVwib3B0aW9ucz8uZmVlZGJhY2sgJiYgb3B0aW9ucz8uaXNJbnB1dFdpZGdldCAmJlxyXG4gICAgICAgIChmb3JtQ29udHJvbD8uZGlydHkgfHwgb3B0aW9ucz8uZmVlZGJhY2tPblJlbmRlcilcIiBbY2xhc3MuaGFzLWVycm9yXT1cIm9wdGlvbnM/LmVuYWJsZUVycm9yU3RhdGUgJiYgZm9ybUNvbnRyb2w/LmVycm9ycyAmJlxyXG4gICAgICAgIChmb3JtQ29udHJvbD8uZGlydHkgfHwgb3B0aW9ucz8uZmVlZGJhY2tPblJlbmRlcilcIiBbY2xhc3MuaGFzLXN1Y2Nlc3NdPVwib3B0aW9ucz8uZW5hYmxlU3VjY2Vzc1N0YXRlICYmICFmb3JtQ29udHJvbD8uZXJyb3JzICYmXHJcbiAgICAgICAgKGZvcm1Db250cm9sPy5kaXJ0eSB8fCBvcHRpb25zPy5mZWVkYmFja09uUmVuZGVyKVwiPlxyXG5cclxuICAgIDxidXR0b24gKm5nSWY9XCJzaG93UmVtb3ZlQnV0dG9uXCIgW2NsYXNzXT1cIndpZGdldFN0eWxlcy5fX3JlbW92ZV9pdGVtX19cIiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cInJlbW92ZUl0ZW0oKVwiPlxyXG4gICAgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCI+JnRpbWVzOzwvc3Bhbj5cclxuICAgIDxzcGFuIFtjbGFzc109XCJ3aWRnZXRTdHlsZXMuX19zY3JlZW5fcmVhZGVyX19cIj5DbG9zZTwvc3Bhbj5cclxuICA8L2J1dHRvbj5cclxuICAgIDxkaXYgKm5nSWY9XCJvcHRpb25zPy5tZXNzYWdlTG9jYXRpb24gPT09ICd0b3AnXCI+XHJcbiAgICAgICAgPHAgKm5nSWY9XCJvcHRpb25zPy5oZWxwQmxvY2tcIiBbY2xhc3NdPVwid2lkZ2V0U3R5bGVzLl9faGVscF9ibG9ja19fXCIgW2lubmVySFRNTF09XCJvcHRpb25zPy5oZWxwQmxvY2tcIj48L3A+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8bGFiZWwgKm5nSWY9XCJvcHRpb25zPy50aXRsZSAmJiBsYXlvdXROb2RlPy50eXBlICE9PSAndGFiJ1wiIFthdHRyLmZvcl09XCInY29udHJvbCcgKyBsYXlvdXROb2RlPy5faWRcIiBbY2xhc3NdPVwib3B0aW9ucz8ubGFiZWxIdG1sQ2xhc3MgfHwgJydcIiBbY2xhc3Muc3Itb25seV09XCJvcHRpb25zPy5ub3RpdGxlXCIgW2lubmVySFRNTF09XCJvcHRpb25zPy50aXRsZVwiPjwvbGFiZWw+XHJcbiAgICA8cCAqbmdJZj1cImxheW91dE5vZGU/LnR5cGUgPT09ICdzdWJtaXQnICYmIGpzZj8uZm9ybU9wdGlvbnM/LmZpZWxkc1JlcXVpcmVkXCI+XHJcbiAgICAgICAgPHN0cm9uZyBbY2xhc3NdPVwid2lkZ2V0U3R5bGVzLl9fcmVxdWlyZWRfYXN0ZXJpc2tfX1wiPio8L3N0cm9uZz4gPSByZXF1aXJlZCBmaWVsZHNcclxuICAgIDwvcD5cclxuICAgIDxkaXYgW2NsYXNzLmlucHV0LWdyb3VwXT1cIm9wdGlvbnM/LmZpZWxkQWRkb25MZWZ0IHx8IG9wdGlvbnM/LmZpZWxkQWRkb25SaWdodFwiPlxyXG4gICAgICAgIDxzcGFuICpuZ0lmPVwib3B0aW9ucz8uZmllbGRBZGRvbkxlZnRcIiBbY2xhc3NdPVwid2lkZ2V0U3R5bGVzLl9fZmllbGRfYWRkb25fbGVmdF9fXCIgW2lubmVySFRNTF09XCJvcHRpb25zPy5maWVsZEFkZG9uTGVmdFwiPjwvc3Bhbj5cclxuXHJcbiAgICAgICAgPHNlbGVjdC13aWRnZXQtd2lkZ2V0IFtsYXlvdXROb2RlXT1cIndpZGdldExheW91dE5vZGVcIiBbZGF0YUluZGV4XT1cImRhdGFJbmRleFwiIFtsYXlvdXRJbmRleF09XCJsYXlvdXRJbmRleFwiPjwvc2VsZWN0LXdpZGdldC13aWRnZXQ+XHJcblxyXG4gICAgICAgIDxzcGFuICpuZ0lmPVwib3B0aW9ucz8uZmllbGRBZGRvblJpZ2h0XCIgW2NsYXNzXT1cIndpZGdldFN0eWxlcy5fX2ZpZWxkX2FkZG9uX3JpZ2h0X19cIiBbaW5uZXJIVE1MXT1cIm9wdGlvbnM/LmZpZWxkQWRkb25SaWdodFwiPjwvc3Bhbj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxzcGFuICpuZ0lmPVwib3B0aW9ucz8uZmVlZGJhY2sgJiYgb3B0aW9ucz8uaXNJbnB1dFdpZGdldCAmJlxyXG4gICAgICAgICAgIW9wdGlvbnM/LmZpZWxkQWRkb25SaWdodCAmJiAhbGF5b3V0Tm9kZS5hcnJheUl0ZW0gJiZcclxuICAgICAgICAgIChmb3JtQ29udHJvbD8uZGlydHkgfHwgb3B0aW9ucz8uZmVlZGJhY2tPblJlbmRlcilcIiBbY2xhc3MuZ2x5cGhpY29uLW9rXT1cIm9wdGlvbnM/LmVuYWJsZVN1Y2Nlc3NTdGF0ZSAmJiAhZm9ybUNvbnRyb2w/LmVycm9yc1wiIFtjbGFzcy5nbHlwaGljb24tcmVtb3ZlXT1cIm9wdGlvbnM/LmVuYWJsZUVycm9yU3RhdGUgJiYgZm9ybUNvbnRyb2w/LmVycm9yc1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIGNsYXNzPVwiZm9ybS1jb250cm9sLWZlZWRiYWNrIGdseXBoaWNvblwiPjwvc3Bhbj5cclxuICAgIDxkaXYgKm5nSWY9XCJvcHRpb25zPy5tZXNzYWdlTG9jYXRpb24gIT09ICd0b3AnXCI+XHJcbiAgICAgICAgPHAgKm5nSWY9XCJvcHRpb25zPy5oZWxwQmxvY2tcIiBbY2xhc3NdPVwid2lkZ2V0U3R5bGVzLl9faGVscF9ibG9ja19fXCIgW2lubmVySFRNTF09XCJvcHRpb25zPy5oZWxwQmxvY2tcIj48L3A+XHJcbiAgICA8L2Rpdj5cclxuXHJcbjwvZGl2PlxyXG5cclxuPGRpdiAqbmdJZj1cImRlYnVnICYmIGRlYnVnT3V0cHV0XCI+ZGVidWc6XHJcbiAgICA8cHJlPnt7ZGVidWdPdXRwdXR9fTwvcHJlPlxyXG48L2Rpdj5cclxuXHJcbjwhLS1cclxuPGRpdiBjbGFzcz1cImJ0biBpbnB1dCBpbnB1dC1ib3JkZXJlZCBpbnB1dC1wcmltYXJ5IHctZnVsbCBtYXgtdy14c1xyXG5idG4tbmV1dHJhbFxyXG5idG4tcHJpbWFyeVxyXG5idG4tc2Vjb25kYXJ5XHJcbmJ0bi1hY2NlbnRcclxuYnRuLWluZm9cclxuYnRuLXN1Y2Nlc3NcclxuYnRuLXdhcm5pbmdcclxuYnRuLWVycm9yXHJcbmJ0bi1naG9zdFxyXG5idG4tbGlua1xyXG5idG4tb3V0bGluZVxyXG5idG4tYWN0aXZlXHJcbmJ0bi1kaXNhYmxlZFxyXG5nbGFzc1xyXG5uby1hbmltYXRpb25cclxuYnRuLWxnXHJcbmJ0bi1tZFxyXG5idG4tc21cclxuYnRuLXhzXHJcbmJ0bi13aWRlXHJcbmJ0bi1ibG9ja1xyXG5idG4tY2lyY2xlXHJcbmJ0bi1zcXVhcmVcclxuaGlkZGVuXHJcblwiPmRlZnMgYWw8L2Rpdj5cclxuLS0+XHJcbjwhLS08aW5wdXQgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj1cIlR5cGUgaGVyZVwiIGNsYXNzPVwiaW5wdXQgaW5wdXQtYm9yZGVyZWQgaW5wdXQtcHJpbWFyeSB3LWZ1bGwgbWF4LXcteHNcIiAvPi0tPiJdfQ==
|
|
1
|
+
import { Component, Input, ViewEncapsulation } from '@angular/core';
|
|
2
|
+
import { addClasses, inArray } from '@ng-formworks/core';
|
|
3
|
+
import _, { cloneDeep, map } from 'lodash';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
import * as i1 from "@ng-formworks/core";
|
|
6
|
+
import * as i2 from "./css-framework.service";
|
|
7
|
+
import * as i3 from "@angular/common";
|
|
8
|
+
export class CssFrameworkComponent {
|
|
9
|
+
//TODO-move to ng-formworks/core utility.functions.ts
|
|
10
|
+
applyCssClasses(type, widgetOptions, styleOptions) {
|
|
11
|
+
//console.log("applyCssClasses for type:"+type);
|
|
12
|
+
let cssClasses = this.widgetStyles[type];
|
|
13
|
+
if (!cssClasses || _.isEmpty(cssClasses)) {
|
|
14
|
+
cssClasses = this.widgetStyles.default;
|
|
15
|
+
}
|
|
16
|
+
Object.keys(cssClasses).forEach(catName => {
|
|
17
|
+
let classList = cssClasses[catName];
|
|
18
|
+
if (classList.length) {
|
|
19
|
+
widgetOptions[catName] = addClasses(widgetOptions[catName], classList);
|
|
20
|
+
}
|
|
21
|
+
if (styleOptions) {
|
|
22
|
+
widgetOptions[catName] = addClasses(widgetOptions[catName], styleOptions);
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
flattenWidgetStyles(wstyles) {
|
|
27
|
+
var flattened = {};
|
|
28
|
+
let ignore = ['__themes__'];
|
|
29
|
+
Object.keys(wstyles).forEach(wkey => {
|
|
30
|
+
let wstyle = wstyles[wkey];
|
|
31
|
+
if (ignore.indexOf(wkey) >= 0) {
|
|
32
|
+
flattened[wkey] = wstyle;
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
if (_.isArray(wstyle)) {
|
|
36
|
+
flattened[wkey] = wstyle.join(" ");
|
|
37
|
+
}
|
|
38
|
+
if (_.isObject(wstyle)) { //is csscategories
|
|
39
|
+
flattened[wkey] = flattened[wkey] || {};
|
|
40
|
+
Object.keys(wstyle).forEach(catName => {
|
|
41
|
+
let cssCat = wstyle[catName];
|
|
42
|
+
if (_.isArray(cssCat)) {
|
|
43
|
+
flattened[wkey][catName] = cssCat.join(" ");
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
flattened[wkey][catName] = cssCat;
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
if (_.isString(wstyle)) {
|
|
51
|
+
flattened[wkey] = wstyle;
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
return flattened;
|
|
55
|
+
}
|
|
56
|
+
constructor(changeDetector, jsf, jsfFLService, cssFWService
|
|
57
|
+
/*@Inject(CSS_FRAMEWORK_CFG ) fwcfg: css_fw.frameworkcfg*/
|
|
58
|
+
) {
|
|
59
|
+
this.changeDetector = changeDetector;
|
|
60
|
+
this.jsf = jsf;
|
|
61
|
+
this.jsfFLService = jsfFLService;
|
|
62
|
+
this.cssFWService = cssFWService;
|
|
63
|
+
this.frameworkInitialized = false;
|
|
64
|
+
this.formControl = null;
|
|
65
|
+
this.debugOutput = '';
|
|
66
|
+
this.debug = '';
|
|
67
|
+
this.parentArray = null;
|
|
68
|
+
this.isOrderable = false;
|
|
69
|
+
this.defaultStyling = {
|
|
70
|
+
array: {},
|
|
71
|
+
default: { fieldHtmlClass: "cssfw-form-control" },
|
|
72
|
+
__themes__: [{ name: 'notheme', text: 'None' }],
|
|
73
|
+
__remove_item__: "cssfw-remove-item",
|
|
74
|
+
__array_item_nonref__: {
|
|
75
|
+
"htmlClass": "cssfw-array-item-nonref"
|
|
76
|
+
},
|
|
77
|
+
__active__: { activeClass: "cssfw-active" },
|
|
78
|
+
__array__: { htmlClass: "cssfw-array" },
|
|
79
|
+
__control_label__: { labelHtmlClass: "cssfw-control-label" },
|
|
80
|
+
__form_group__: { htmlClass: "cssfw-form-group" },
|
|
81
|
+
__field_addon_left__: "cssfw-addon-left",
|
|
82
|
+
__field_addon_right__: "cssfw-addon-right",
|
|
83
|
+
__help_block__: "cssfw-help-block",
|
|
84
|
+
__required_asterisk__: "cssfw-required-astersisk",
|
|
85
|
+
__screen_reader__: "cssfw-screen-reader"
|
|
86
|
+
};
|
|
87
|
+
let activeFramework = this.jsfFLService.activeFramework;
|
|
88
|
+
let fwcfg = activeFramework.config || {};
|
|
89
|
+
this.widgetStyles = Object.assign(this.defaultStyling, fwcfg.widgetstyles);
|
|
90
|
+
let defaultTheme = this.widgetStyles.__themes__[0];
|
|
91
|
+
let defaultThemeName = cssFWService.activeRequestedTheme || defaultTheme.name;
|
|
92
|
+
this.theme = this.options?.theme || defaultThemeName;
|
|
93
|
+
this.frameworkThemeSubs = cssFWService.frameworkTheme$.subscribe(newTheme => {
|
|
94
|
+
this.theme = newTheme;
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
ngOnDestroy() {
|
|
98
|
+
this.frameworkThemeSubs.unsubscribe();
|
|
99
|
+
this.frameworkThemeSubs = null;
|
|
100
|
+
}
|
|
101
|
+
get showRemoveButton() {
|
|
102
|
+
if (!this.options.removable || this.options.readonly ||
|
|
103
|
+
this.layoutNode.type === '$ref') {
|
|
104
|
+
return false;
|
|
105
|
+
}
|
|
106
|
+
if (this.layoutNode.recursiveReference) {
|
|
107
|
+
return true;
|
|
108
|
+
}
|
|
109
|
+
if (!this.layoutNode.arrayItem || !this.parentArray) {
|
|
110
|
+
return false;
|
|
111
|
+
}
|
|
112
|
+
// If array length <= minItems, don't allow removing any items
|
|
113
|
+
return this.parentArray.items.length - 1 <= this.parentArray.options.minItems ? false :
|
|
114
|
+
// For removable list items, allow removing any item
|
|
115
|
+
this.layoutNode.arrayItemType === 'list' ? true :
|
|
116
|
+
// For removable tuple items, only allow removing last item in list
|
|
117
|
+
this.layoutIndex[this.layoutIndex.length - 1] === this.parentArray.items.length - 2;
|
|
118
|
+
}
|
|
119
|
+
ngOnInit() {
|
|
120
|
+
this.initializeFramework();
|
|
121
|
+
if (this.layoutNode.arrayItem && this.layoutNode.type !== '$ref') {
|
|
122
|
+
this.parentArray = this.jsf.getParentNode(this);
|
|
123
|
+
if (this.parentArray) {
|
|
124
|
+
this.isOrderable = this.layoutNode.arrayItemType === 'list' &&
|
|
125
|
+
!this.options.readonly && this.parentArray.options.orderable;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
ngOnChanges() {
|
|
130
|
+
if (!this.frameworkInitialized) {
|
|
131
|
+
this.initializeFramework();
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
initializeFramework() {
|
|
135
|
+
if (this.layoutNode) {
|
|
136
|
+
this.options = cloneDeep(this.layoutNode.options);
|
|
137
|
+
this.widgetLayoutNode = {
|
|
138
|
+
...this.layoutNode,
|
|
139
|
+
options: cloneDeep(this.layoutNode.options)
|
|
140
|
+
};
|
|
141
|
+
this.widgetOptions = this.widgetLayoutNode.options;
|
|
142
|
+
this.formControl = this.jsf.getFormControl(this);
|
|
143
|
+
this.options.isInputWidget = inArray(this.layoutNode.type, [
|
|
144
|
+
'button', 'checkbox', 'checkboxes-inline', 'checkboxes', 'color',
|
|
145
|
+
'date', 'datetime-local', 'datetime', 'email', 'file', 'hidden',
|
|
146
|
+
'image', 'integer', 'month', 'number', 'password', 'radio',
|
|
147
|
+
'radiobuttons', 'radios-inline', 'radios', 'range', 'reset', 'search',
|
|
148
|
+
'select', 'submit', 'tel', 'text', 'textarea', 'time', 'url', 'week'
|
|
149
|
+
]);
|
|
150
|
+
this.options.title = this.setTitle();
|
|
151
|
+
this.options.htmlClass =
|
|
152
|
+
addClasses(this.options.htmlClass, 'schema-form-' + this.layoutNode.type);
|
|
153
|
+
if (this.layoutNode.type === 'array') {
|
|
154
|
+
this.options.htmlClass = addClasses(this.options.htmlClass, this.widgetStyles.__array__.htmlClass);
|
|
155
|
+
}
|
|
156
|
+
else if (this.layoutNode.arrayItem && this.layoutNode.type !== '$ref') {
|
|
157
|
+
this.options.htmlClass = addClasses(this.options.htmlClass, this.widgetStyles.__array_item_nonref__.htmlClass);
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
this.options.htmlClass = addClasses(this.options.htmlClass, this.widgetStyles.__form_group__.htmlClass);
|
|
161
|
+
}
|
|
162
|
+
/*
|
|
163
|
+
this.options.htmlClass =
|
|
164
|
+
this.layoutNode.type === 'array' ?
|
|
165
|
+
addClasses(this.options.htmlClass, ['border','shadow-md','p-1']) :
|
|
166
|
+
this.layoutNode.arrayItem && this.layoutNode.type !== '$ref' ?
|
|
167
|
+
addClasses(this.options.htmlClass, ['border','shadow-md','p-1']) :
|
|
168
|
+
addClasses(this.options.htmlClass, 'mb-1');
|
|
169
|
+
*/
|
|
170
|
+
/*
|
|
171
|
+
this.options.htmlClass =
|
|
172
|
+
this.layoutNode.type === 'array' ?
|
|
173
|
+
addClasses(this.options.htmlClass, this.widgetStyles.array.htmlClass):
|
|
174
|
+
this.layoutNode.arrayItem && this.layoutNode.type !== '$ref' ?
|
|
175
|
+
addClasses(this.options.htmlClass, this.widgetStyles.__array_item_nonref__.htmlClass):
|
|
176
|
+
addClasses(this.options.htmlClass, this.widgetStyles.__form_group__.htmlClass);
|
|
177
|
+
*/
|
|
178
|
+
this.widgetOptions.htmlClass = '';
|
|
179
|
+
this.options.labelHtmlClass =
|
|
180
|
+
addClasses(this.options.labelHtmlClass, this.widgetStyles.__control_label__.labelHtmlClass);
|
|
181
|
+
this.widgetOptions.activeClass =
|
|
182
|
+
addClasses(this.widgetOptions.activeClass, this.widgetStyles.__active__.activeClass);
|
|
183
|
+
this.options.fieldAddonLeft =
|
|
184
|
+
this.options.fieldAddonLeft || this.options.prepend;
|
|
185
|
+
this.options.fieldAddonRight =
|
|
186
|
+
this.options.fieldAddonRight || this.options.append;
|
|
187
|
+
// Add asterisk to titles if required
|
|
188
|
+
if (this.options.title && this.layoutNode.type !== 'tab' &&
|
|
189
|
+
!this.options.notitle && this.options.required &&
|
|
190
|
+
!this.options.title.includes('*')) {
|
|
191
|
+
let required_asterisk_class = this.widgetStyles.__required_asterisk__ || 'text-danger';
|
|
192
|
+
this.options.title += ` <strong class="${required_asterisk_class}">*</strong>`;
|
|
193
|
+
}
|
|
194
|
+
if (this.layoutNode.type == 'optionfieldset') {
|
|
195
|
+
this.options.messageLocation = 'top';
|
|
196
|
+
}
|
|
197
|
+
// Set miscelaneous styles and settings for each control type
|
|
198
|
+
this.applyCssClasses(this.layoutNode.type, this.widgetOptions, this.options.style);
|
|
199
|
+
if (this.formControl) {
|
|
200
|
+
this.updateHelpBlock(this.formControl.status);
|
|
201
|
+
this.formControl.statusChanges.subscribe(status => this.updateHelpBlock(status));
|
|
202
|
+
if (this.options.debug) {
|
|
203
|
+
const vars = [];
|
|
204
|
+
this.debugOutput = map(vars, thisVar => JSON.stringify(thisVar, null, 2)).join('\n');
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
this.frameworkInitialized = true;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
updateHelpBlock(status) {
|
|
211
|
+
this.options.helpBlock = status === 'INVALID' &&
|
|
212
|
+
this.options.enableErrorState && this.formControl.errors &&
|
|
213
|
+
(this.formControl.dirty || this.options.feedbackOnRender) ?
|
|
214
|
+
this.jsf.formatErrors(this.formControl.errors, this.options.validationMessages) :
|
|
215
|
+
this.options.description || this.options.help || null;
|
|
216
|
+
}
|
|
217
|
+
setTitle() {
|
|
218
|
+
switch (this.layoutNode.type) {
|
|
219
|
+
case 'button':
|
|
220
|
+
case 'checkbox':
|
|
221
|
+
case 'section':
|
|
222
|
+
case 'help':
|
|
223
|
+
case 'msg':
|
|
224
|
+
case 'submit':
|
|
225
|
+
case 'message':
|
|
226
|
+
case 'tabarray':
|
|
227
|
+
case 'tabs':
|
|
228
|
+
case '$ref':
|
|
229
|
+
return null;
|
|
230
|
+
case 'advancedfieldset':
|
|
231
|
+
this.widgetOptions.expandable = true;
|
|
232
|
+
this.widgetOptions.title = 'Advanced options';
|
|
233
|
+
return null;
|
|
234
|
+
case 'authfieldset':
|
|
235
|
+
this.widgetOptions.expandable = true;
|
|
236
|
+
this.widgetOptions.title = 'Authentication settings';
|
|
237
|
+
return null;
|
|
238
|
+
case 'fieldset':
|
|
239
|
+
this.widgetOptions.title = this.options.title;
|
|
240
|
+
return null;
|
|
241
|
+
default:
|
|
242
|
+
this.widgetOptions.title = null;
|
|
243
|
+
return this.jsf.setItemTitle(this);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
removeItem() {
|
|
247
|
+
this.jsf.removeItem(this);
|
|
248
|
+
}
|
|
249
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CssFrameworkComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.JsonSchemaFormService }, { token: i1.FrameworkLibraryService }, { token: i2.CssframeworkService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
250
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: CssFrameworkComponent, selector: "css-framework", inputs: { layoutNode: "layoutNode", layoutIndex: "layoutIndex", dataIndex: "dataIndex", widgetStyles: "widgetStyles" }, usesOnChanges: true, ngImport: i0, template: "<div [attr.data-bs-theme]=\"theme\" [attr.data-theme]=\"theme\" [class]=\"options?.htmlClass || ''\" [class.has-feedback]=\"options?.feedback && options?.isInputWidget &&\r\n (formControl?.dirty || options?.feedbackOnRender)\" [class.has-error]=\"options?.enableErrorState && formControl?.errors &&\r\n (formControl?.dirty || options?.feedbackOnRender)\" [class.has-success]=\"options?.enableSuccessState && !formControl?.errors &&\r\n (formControl?.dirty || options?.feedbackOnRender)\">\r\n\r\n <button *ngIf=\"showRemoveButton\" [class]=\"widgetStyles.__remove_item__\" type=\"button\" (click)=\"removeItem()\">\r\n <span aria-hidden=\"true\">×</span>\r\n <span [class]=\"widgetStyles.__screen_reader__\">Close</span>\r\n </button>\r\n <div *ngIf=\"options?.messageLocation === 'top'\">\r\n <p *ngIf=\"options?.helpBlock\" [class]=\"widgetStyles.__help_block__\" [innerHTML]=\"options?.helpBlock\"></p>\r\n </div>\r\n\r\n <label *ngIf=\"options?.title && layoutNode?.type !== 'tab'\" [attr.for]=\"'control' + layoutNode?._id\" [class]=\"options?.labelHtmlClass || ''\" [class.sr-only]=\"options?.notitle\" [innerHTML]=\"options?.title\"></label>\r\n <p *ngIf=\"layoutNode?.type === 'submit' && jsf?.formOptions?.fieldsRequired\">\r\n <strong [class]=\"widgetStyles.__required_asterisk__\">*</strong> = required fields\r\n </p>\r\n <div [class.input-group]=\"options?.fieldAddonLeft || options?.fieldAddonRight\">\r\n <span *ngIf=\"options?.fieldAddonLeft\" [class]=\"widgetStyles.__field_addon_left__\" [innerHTML]=\"options?.fieldAddonLeft\"></span>\r\n\r\n <select-widget-widget [layoutNode]=\"widgetLayoutNode\" [dataIndex]=\"dataIndex\" [layoutIndex]=\"layoutIndex\"></select-widget-widget>\r\n\r\n <span *ngIf=\"options?.fieldAddonRight\" [class]=\"widgetStyles.__field_addon_right__\" [innerHTML]=\"options?.fieldAddonRight\"></span>\r\n </div>\r\n\r\n <span *ngIf=\"options?.feedback && options?.isInputWidget &&\r\n !options?.fieldAddonRight && !layoutNode.arrayItem &&\r\n (formControl?.dirty || options?.feedbackOnRender)\" [class.glyphicon-ok]=\"options?.enableSuccessState && !formControl?.errors\" [class.glyphicon-remove]=\"options?.enableErrorState && formControl?.errors\" aria-hidden=\"true\" class=\"form-control-feedback glyphicon\"></span>\r\n <div *ngIf=\"options?.messageLocation !== 'top'\">\r\n <p *ngIf=\"options?.helpBlock\" [class]=\"widgetStyles.__help_block__\" [innerHTML]=\"options?.helpBlock\"></p>\r\n </div>\r\n\r\n</div>\r\n\r\n<div *ngIf=\"debug && debugOutput\">debug:\r\n <pre>{{debugOutput}}</pre>\r\n</div>\r\n\r\n<!--\r\n<div class=\"btn input input-bordered input-primary w-full max-w-xs\r\nbtn-neutral\r\nbtn-primary\r\nbtn-secondary\r\nbtn-accent\r\nbtn-info\r\nbtn-success\r\nbtn-warning\r\nbtn-error\r\nbtn-ghost\r\nbtn-link\r\nbtn-outline\r\nbtn-active\r\nbtn-disabled\r\nglass\r\nno-animation\r\nbtn-lg\r\nbtn-md\r\nbtn-sm\r\nbtn-xs\r\nbtn-wide\r\nbtn-block\r\nbtn-circle\r\nbtn-square\r\nhidden\r\n\">defs al</div>\r\n-->\r\n<!--<input type=\"text\" placeholder=\"Type here\" class=\"input input-bordered input-primary w-full max-w-xs\" />-->", styles: [":host ::ng-deep .list-group-item .form-control-feedback{top:40px}:host ::ng-deep .checkbox,:host ::ng-deep .radio{margin-top:0;margin-bottom:0}:host ::ng-deep .checkbox-inline,:host ::ng-deep .checkbox-inline+.checkbox-inline,:host ::ng-deep .checkbox-inline+.radio-inline,:host ::ng-deep .radio-inline,:host ::ng-deep .radio-inline+.radio-inline,:host ::ng-deep .radio-inline+.checkbox-inline{margin-left:0;margin-right:10px}:host ::ng-deep .checkbox-inline:last-child,:host ::ng-deep .radio-inline:last-child{margin-right:0}:host ::ng-deep .ng-invalid.ng-touched{border:1px solid #f44336}.checkbox-inline,.checkbox-inline+.checkbox-inline,.checkbox-inline+.radio-inline,.radio-inline,.radio-inline+.radio-inline,.radio-inline+.checkbox-inline{margin-left:0;margin-right:10px}.checkbox-inline:last-child,.radio-inline:last-child{margin-right:0}.ng-invalid.ng-touched{border:1px solid #f44336}\n"], dependencies: [{ kind: "component", type: i1.SelectWidgetComponent, selector: "select-widget-widget", inputs: ["layoutNode", "layoutIndex", "dataIndex"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
251
|
+
}
|
|
252
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CssFrameworkComponent, decorators: [{
|
|
253
|
+
type: Component,
|
|
254
|
+
args: [{ selector: 'css-framework', encapsulation: ViewEncapsulation.None, template: "<div [attr.data-bs-theme]=\"theme\" [attr.data-theme]=\"theme\" [class]=\"options?.htmlClass || ''\" [class.has-feedback]=\"options?.feedback && options?.isInputWidget &&\r\n (formControl?.dirty || options?.feedbackOnRender)\" [class.has-error]=\"options?.enableErrorState && formControl?.errors &&\r\n (formControl?.dirty || options?.feedbackOnRender)\" [class.has-success]=\"options?.enableSuccessState && !formControl?.errors &&\r\n (formControl?.dirty || options?.feedbackOnRender)\">\r\n\r\n <button *ngIf=\"showRemoveButton\" [class]=\"widgetStyles.__remove_item__\" type=\"button\" (click)=\"removeItem()\">\r\n <span aria-hidden=\"true\">×</span>\r\n <span [class]=\"widgetStyles.__screen_reader__\">Close</span>\r\n </button>\r\n <div *ngIf=\"options?.messageLocation === 'top'\">\r\n <p *ngIf=\"options?.helpBlock\" [class]=\"widgetStyles.__help_block__\" [innerHTML]=\"options?.helpBlock\"></p>\r\n </div>\r\n\r\n <label *ngIf=\"options?.title && layoutNode?.type !== 'tab'\" [attr.for]=\"'control' + layoutNode?._id\" [class]=\"options?.labelHtmlClass || ''\" [class.sr-only]=\"options?.notitle\" [innerHTML]=\"options?.title\"></label>\r\n <p *ngIf=\"layoutNode?.type === 'submit' && jsf?.formOptions?.fieldsRequired\">\r\n <strong [class]=\"widgetStyles.__required_asterisk__\">*</strong> = required fields\r\n </p>\r\n <div [class.input-group]=\"options?.fieldAddonLeft || options?.fieldAddonRight\">\r\n <span *ngIf=\"options?.fieldAddonLeft\" [class]=\"widgetStyles.__field_addon_left__\" [innerHTML]=\"options?.fieldAddonLeft\"></span>\r\n\r\n <select-widget-widget [layoutNode]=\"widgetLayoutNode\" [dataIndex]=\"dataIndex\" [layoutIndex]=\"layoutIndex\"></select-widget-widget>\r\n\r\n <span *ngIf=\"options?.fieldAddonRight\" [class]=\"widgetStyles.__field_addon_right__\" [innerHTML]=\"options?.fieldAddonRight\"></span>\r\n </div>\r\n\r\n <span *ngIf=\"options?.feedback && options?.isInputWidget &&\r\n !options?.fieldAddonRight && !layoutNode.arrayItem &&\r\n (formControl?.dirty || options?.feedbackOnRender)\" [class.glyphicon-ok]=\"options?.enableSuccessState && !formControl?.errors\" [class.glyphicon-remove]=\"options?.enableErrorState && formControl?.errors\" aria-hidden=\"true\" class=\"form-control-feedback glyphicon\"></span>\r\n <div *ngIf=\"options?.messageLocation !== 'top'\">\r\n <p *ngIf=\"options?.helpBlock\" [class]=\"widgetStyles.__help_block__\" [innerHTML]=\"options?.helpBlock\"></p>\r\n </div>\r\n\r\n</div>\r\n\r\n<div *ngIf=\"debug && debugOutput\">debug:\r\n <pre>{{debugOutput}}</pre>\r\n</div>\r\n\r\n<!--\r\n<div class=\"btn input input-bordered input-primary w-full max-w-xs\r\nbtn-neutral\r\nbtn-primary\r\nbtn-secondary\r\nbtn-accent\r\nbtn-info\r\nbtn-success\r\nbtn-warning\r\nbtn-error\r\nbtn-ghost\r\nbtn-link\r\nbtn-outline\r\nbtn-active\r\nbtn-disabled\r\nglass\r\nno-animation\r\nbtn-lg\r\nbtn-md\r\nbtn-sm\r\nbtn-xs\r\nbtn-wide\r\nbtn-block\r\nbtn-circle\r\nbtn-square\r\nhidden\r\n\">defs al</div>\r\n-->\r\n<!--<input type=\"text\" placeholder=\"Type here\" class=\"input input-bordered input-primary w-full max-w-xs\" />-->", styles: [":host ::ng-deep .list-group-item .form-control-feedback{top:40px}:host ::ng-deep .checkbox,:host ::ng-deep .radio{margin-top:0;margin-bottom:0}:host ::ng-deep .checkbox-inline,:host ::ng-deep .checkbox-inline+.checkbox-inline,:host ::ng-deep .checkbox-inline+.radio-inline,:host ::ng-deep .radio-inline,:host ::ng-deep .radio-inline+.radio-inline,:host ::ng-deep .radio-inline+.checkbox-inline{margin-left:0;margin-right:10px}:host ::ng-deep .checkbox-inline:last-child,:host ::ng-deep .radio-inline:last-child{margin-right:0}:host ::ng-deep .ng-invalid.ng-touched{border:1px solid #f44336}.checkbox-inline,.checkbox-inline+.checkbox-inline,.checkbox-inline+.radio-inline,.radio-inline,.radio-inline+.radio-inline,.radio-inline+.checkbox-inline{margin-left:0;margin-right:10px}.checkbox-inline:last-child,.radio-inline:last-child{margin-right:0}.ng-invalid.ng-touched{border:1px solid #f44336}\n"] }]
|
|
255
|
+
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i1.JsonSchemaFormService }, { type: i1.FrameworkLibraryService }, { type: i2.CssframeworkService }], propDecorators: { layoutNode: [{
|
|
256
|
+
type: Input
|
|
257
|
+
}], layoutIndex: [{
|
|
258
|
+
type: Input
|
|
259
|
+
}], dataIndex: [{
|
|
260
|
+
type: Input
|
|
261
|
+
}], widgetStyles: [{
|
|
262
|
+
type: Input
|
|
263
|
+
}] } });
|
|
264
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3NzLWZyYW1ld29yay5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1mb3Jtd29ya3MtY3NzZnJhbWV3b3JrL3NyYy9saWIvY3NzLWZyYW1ld29yay5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1mb3Jtd29ya3MtY3NzZnJhbWV3b3JrL3NyYy9saWIvY3NzLWZyYW1ld29yay5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQXFCLFNBQVMsRUFBRSxLQUFLLEVBQWdDLGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JILE9BQU8sRUFBa0QsVUFBVSxFQUFFLE9BQU8sRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3pHLE9BQU8sQ0FBQyxFQUFFLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLFFBQVEsQ0FBQzs7Ozs7QUFXM0MsTUFBTSxPQUFPLHFCQUFxQjtJQW9CaEMscURBQXFEO0lBQ3JELGVBQWUsQ0FBQyxJQUFJLEVBQUUsYUFBYSxFQUFFLFlBQVk7UUFDL0MsZ0RBQWdEO1FBQ2hELElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDekMsSUFBSSxDQUFDLFVBQVUsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUFHO1lBQ3pDLFVBQVUsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQztTQUN4QztRQUNELE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ3hDLElBQUksU0FBUyxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUVwQyxJQUFJLFNBQVMsQ0FBQyxNQUFNLEVBQUU7Z0JBQ3BCLGFBQWEsQ0FBQyxPQUFPLENBQUMsR0FBRyxVQUFVLENB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LENBQUM7Z0JBQ2hDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDdEM7SUFDSCxDQUFDO0lBRUQsVUFBVTtRQUNSLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzVCLENBQUM7K0dBalNVLHFCQUFxQjttR0FBckIscUJBQXFCLGtNQ2JsQywwcEdBa0UrRzs7NEZEckRsRyxxQkFBcUI7a0JBTmpDLFNBQVM7K0JBQ0UsZUFBZSxpQkFHVixpQkFBaUIsQ0FBQyxJQUFJO2tNQVk1QixVQUFVO3NCQUFsQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFFRyxZQUFZO3NCQUFwQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgSW5wdXQsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBPbkluaXQsIFZpZXdFbmNhcHN1bGF0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZyYW1ld29ya0xpYnJhcnlTZXJ2aWNlLCBKc29uU2NoZW1hRm9ybVNlcnZpY2UsIGFkZENsYXNzZXMsIGluQXJyYXkgfSBmcm9tICdAbmctZm9ybXdvcmtzL2NvcmUnO1xyXG5pbXBvcnQgXywgeyBjbG9uZURlZXAsIG1hcCB9IGZyb20gJ2xvZGFzaCc7XHJcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBjc3NfZncgfSBmcm9tICcuL2Nzcy1mcmFtZXdvcmsuZGVmcyc7XHJcbmltcG9ydCB7IENzc2ZyYW1ld29ya1NlcnZpY2UgfSBmcm9tICcuL2Nzcy1mcmFtZXdvcmsuc2VydmljZSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2Nzcy1mcmFtZXdvcmsnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9jc3MtZnJhbWV3b3JrLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9jc3MtZnJhbWV3b3JrLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQ3NzRnJhbWV3b3JrQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsT25EZXN0cm95IHtcclxuICBmcmFtZXdvcmtJbml0aWFsaXplZCA9IGZhbHNlO1xyXG4gIHdpZGdldE9wdGlvbnM6IGFueTsgLy8gT3B0aW9ucyBwYXNzZWQgdG8gY2hpbGQgd2lkZ2V0XHJcbiAgd2lkZ2V0TGF5b3V0Tm9kZTogYW55OyAvLyBsYXlvdXROb2RlIHBhc3NlZCB0byBjaGlsZCB3aWRnZXRcclxuICBvcHRpb25zOiBhbnk7IC8vIE9wdGlvbnMgdXNlZCBpbiB0aGlzIGZyYW1ld29ya1xyXG4gIGZvcm1Db250cm9sOiBhbnkgPSBudWxsO1xyXG4gIGRlYnVnT3V0cHV0OiBhbnkgPSAnJztcclxuICBkZWJ1ZzogYW55ID0gJyc7XHJcbiAgcGFyZW50QXJyYXk6IGFueSA9IG51bGw7XHJcbiAgaXNPcmRlcmFibGUgPSBmYWxzZTtcclxuICBASW5wdXQoKSBsYXlvdXROb2RlOiBhbnk7XHJcbiAgQElucHV0KCkgbGF5b3V0SW5kZXg6IG51bWJlcltdO1xyXG4gIEBJbnB1dCgpIGRhdGFJbmRleDogbnVtYmVyW107XHJcblxyXG4gIEBJbnB1dCgpIHdpZGdldFN0eWxlczogY3NzX2Z3LndpZGdldHN0eWxlcztcclxuXHJcblxyXG5cclxuXHJcblxyXG4gIC8vVE9ETy1tb3ZlIHRvIG5nLWZvcm13b3Jrcy9jb3JlIHV0aWxpdHkuZnVuY3Rpb25zLnRzXHJcbiAgYXBwbHlDc3NDbGFzc2VzKHR5cGUsIHdpZGdldE9wdGlvbnMsIHN0eWxlT3B0aW9ucykge1xyXG4gICAgLy9jb25zb2xlLmxvZyhcImFwcGx5Q3NzQ2xhc3NlcyBmb3IgdHlwZTpcIit0eXBlKTtcclxuICAgIGxldCBjc3NDbGFzc2VzID0gdGhpcy53aWRnZXRTdHlsZXNbdHlwZV07XHJcbiAgICBpZiAoIWNzc0NsYXNzZXMgfHwgXy5pc0VtcHR5KGNzc0NsYXNzZXMpICkge1xyXG4gICAgICBjc3NDbGFzc2VzID0gdGhpcy53aWRnZXRTdHlsZXMuZGVmYXVsdDtcclxuICAgIH1cclxuICAgIE9iamVjdC5rZXlzKGNzc0NsYXNzZXMpLmZvckVhY2goY2F0TmFtZSA9PiB7XHJcbiAgICAgIGxldCBjbGFzc0xpc3QgPSBjc3NDbGFzc2VzW2NhdE5hbWVdO1xyXG5cclxuICAgICAgaWYgKGNsYXNzTGlzdC5sZW5ndGgpIHtcclxuICAgICAgICB3aWRnZXRPcHRpb25zW2NhdE5hbWVdID0gYWRkQ2xhc3Nlcyh3aWRnZXRPcHRpb25zW2NhdE5hbWVdLCBjbGFzc0xpc3QpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChzdHlsZU9wdGlvbnMpIHtcclxuICAgICAgICB3aWRnZXRPcHRpb25zW2NhdE5hbWVdID0gYWRkQ2xhc3Nlcyh3aWRnZXRPcHRpb25zW2NhdE5hbWVdLCBzdHlsZU9wdGlvbnMpO1xyXG4gICAgICB9XHJcblxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGZsYXR0ZW5XaWRnZXRTdHlsZXMod3N0eWxlczpjc3NfZncud2lkZ2V0c3R5bGVzKXtcclxuICAgIHZhciBmbGF0dGVuZWQ6YW55PXt9O1xyXG4gICAgbGV0IGlnbm9yZT1bJ19fdGhlbWVzX18nXTtcclxuICAgIE9iamVjdC5rZXlzKHdzdHlsZXMpLmZvckVhY2god2tleT0+e1xyXG4gICAgICBsZXQgd3N0eWxlPXdzdHlsZXNbd2tleV07XHJcbiAgICAgIGlmKGlnbm9yZS5pbmRleE9mKHdrZXkpPj0wKXtcclxuICAgICAgICBmbGF0dGVuZWRbd2tleV09d3N0eWxlO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBpZihfLmlzQXJyYXkod3N0eWxlKSl7XHJcbiAgICAgICAgXHJcbiAgICAgICAgZmxhdHRlbmVkW3drZXldPXdzdHlsZS5qb2luKFwiIFwiKTtcclxuICAgICAgfVxyXG4gICAgICBpZihfLmlzT2JqZWN0KHdzdHlsZSkpey8vaXMgY3NzY2F0ZWdvcmllc1xyXG4gICAgICAgICAgZmxhdHRlbmVkW3drZXldPWZsYXR0ZW5lZFt3a2V5XXx8e307XHJcbiAgICAgICAgT2JqZWN0LmtleXMod3N0eWxlKS5mb3JFYWNoKGNhdE5hbWU9PntcclxuICAgICAgICAgIGxldCBjc3NDYXQ9d3N0eWxlW2NhdE5hbWVdO1xyXG4gICAgICAgICAgXHJcbiAgICAgICAgICBpZihfLmlzQXJyYXkoY3NzQ2F0KSl7XHJcbiAgICAgICAgICAgIGZsYXR0ZW5lZFt3a2V5XVtjYXROYW1lXT1jc3NDYXQuam9pbihcIiBcIik7XHJcbiAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgZmxhdHRlbmVkW3drZXldW2NhdE5hbWVdPWNzc0NhdDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgICB9XHJcbiAgICAgIGlmKF8uaXNTdHJpbmcod3N0eWxlKSl7XHJcbiAgICAgICAgZmxhdHRlbmVkW3drZXldPXdzdHlsZTtcclxuICAgICAgfVxyXG4gICAgfSlcclxuICAgIHJldHVybiBmbGF0dGVuZWRcclxufVxyXG5cclxuZGVmYXVsdFN0eWxpbmc6Y3NzX2Z3LndpZGdldHN0eWxlcz17XHJcbiAgYXJyYXk6e30sXHJcbiAgZGVmYXVsdDp7ZmllbGRIdG1sQ2xhc3M6IFwiY3NzZnctZm9ybS1jb250cm9sXCJ9LFxyXG4gIF9fdGhlbWVzX186W3tuYW1lOidub3RoZW1lJyx0ZXh0OidOb25lJ31dLFxyXG4gIF9fcmVtb3ZlX2l0ZW1fXzpcImNzc2Z3LXJlbW92ZS1pdGVtXCIsXHJcbiAgICBfX2FycmF5X2l0ZW1fbm9ucmVmX186e1xyXG4gICAgICBcImh0bWxDbGFzc1wiOiAgIFwiY3NzZnctYXJyYXktaXRlbS1ub25yZWZcIlxyXG4gIH0sXHJcbiAgX19hY3RpdmVfXzp7YWN0aXZlQ2xhc3M6XCJjc3Nmdy1hY3RpdmVcIn0sXHJcbiAgX19hcnJheV9fOntodG1sQ2xhc3M6XCJjc3Nmdy1hcnJheVwifSxcclxuICBfX2NvbnRyb2xfbGFiZWxfXzp7bGFiZWxIdG1sQ2xhc3M6XCJjc3Nmdy1jb250cm9sLWxhYmVsXCJ9LFxyXG4gIF9fZm9ybV9ncm91cF9fOntodG1sQ2xhc3M6IFwiY3NzZnctZm9ybS1ncm91cFwifSxcclxuICBfX2ZpZWxkX2FkZG9uX2xlZnRfXzpcImNzc2Z3LWFkZG9uLWxlZnRcIixcclxuICBfX2ZpZWxkX2FkZG9uX3JpZ2h0X186XCJjc3Nmdy1hZGRvbi1yaWdodFwiLFxyXG4gIF9faGVscF9ibG9ja19fOlwiY3NzZnctaGVscC1ibG9ja1wiLFxyXG4gIF9fcmVxdWlyZWRfYXN0ZXJpc2tfXzpcImNzc2Z3LXJlcXVpcmVkLWFzdGVyc2lza1wiLFxyXG4gIF9fc2NyZWVuX3JlYWRlcl9fOiBcImNzc2Z3LXNjcmVlbi1yZWFkZXJcIlxyXG5cclxufVxyXG5cclxuXHJcblxyXG5cclxudGhlbWU6c3RyaW5nXHJcbmZyYW1ld29ya1RoZW1lU3ViczpTdWJzY3JpcHRpb247XHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwdWJsaWMgY2hhbmdlRGV0ZWN0b3I6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgcHVibGljIGpzZjogSnNvblNjaGVtYUZvcm1TZXJ2aWNlLFxyXG4gICAgcHVibGljIGpzZkZMU2VydmljZTpGcmFtZXdvcmtMaWJyYXJ5U2VydmljZSxcclxuICAgIHB1YmxpYyBjc3NGV1NlcnZpY2U6Q3NzZnJhbWV3b3JrU2VydmljZVxyXG4gICAgLypASW5qZWN0KENTU19GUkFNRVdPUktfQ0ZHICkgZndjZmc6IGNzc19mdy5mcmFtZXdvcmtjZmcqL1xyXG5cclxuICApIHtcclxuICAgIFxyXG4gICAgbGV0IGFjdGl2ZUZyYW1ld29yazphbnk9dGhpcy5qc2ZGTFNlcnZpY2UuYWN0aXZlRnJhbWV3b3JrO1xyXG4gICAgbGV0IGZ3Y2ZnPWFjdGl2ZUZyYW1ld29yay5jb25maWd8fHt9O1xyXG4gICAgdGhpcy53aWRnZXRTdHlsZXMgPSBPYmplY3QuYXNzaWduKHRoaXMuZGVmYXVsdFN0eWxpbmcsZndjZmcud2lkZ2V0c3R5bGVzKTtcclxuICAgIGxldCBkZWZhdWx0VGhlbWU9dGhpcy53aWRnZXRTdHlsZXMuX190aGVtZXNfX1swXTtcclxuICAgIGxldCBkZWZhdWx0VGhlbWVOYW1lPWNzc0ZXU2VydmljZS5hY3RpdmVSZXF1ZXN0ZWRUaGVtZXx8ZGVmYXVsdFRoZW1lLm5hbWU7XHJcbiAgICB0aGlzLnRoZW1lPXRoaXMub3B0aW9ucz8udGhlbWV8fCBkZWZhdWx0VGhlbWVOYW1lO1xyXG4gICAgdGhpcy5mcmFtZXdvcmtUaGVtZVN1YnM9Y3NzRldTZXJ2aWNlLmZyYW1ld29ya1RoZW1lJC5zdWJzY3JpYmUobmV3VGhlbWU9PntcclxuICAgICAgICB0aGlzLnRoZW1lPW5ld1RoZW1lO1xyXG4gICAgfSlcclxuIFxyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLmZyYW1ld29ya1RoZW1lU3Vicy51bnN1YnNjcmliZSgpO1xyXG4gICAgdGhpcy5mcmFtZXdvcmtUaGVtZVN1YnM9bnVsbDtcclxuICB9XHJcblxyXG5cclxuICBnZXQgc2hvd1JlbW92ZUJ1dHRvbigpOiBib29sZWFuIHtcclxuICAgIGlmICghdGhpcy5vcHRpb25zLnJlbW92YWJsZSB8fCB0aGlzLm9wdGlvbnMucmVhZG9ubHkgfHxcclxuICAgICAgdGhpcy5sYXlvdXROb2RlLnR5cGUgPT09ICckcmVmJ1xyXG4gICAgKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmxheW91dE5vZGUucmVjdXJzaXZlUmVmZXJlbmNlKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgaWYgKCF0aGlzLmxheW91dE5vZGUuYXJyYXlJdGVtIHx8ICF0aGlzLnBhcmVudEFycmF5KSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIC8vIElmIGFycmF5IGxlbmd0aCA8PSBtaW5JdGVtcywgZG9uJ3QgYWxsb3cgcmVtb3ZpbmcgYW55IGl0ZW1zXHJcbiAgICByZXR1cm4gdGhpcy5wYXJlbnRBcnJheS5pdGVtcy5sZW5ndGggLSAxIDw9IHRoaXMucGFyZW50QXJyYXkub3B0aW9ucy5taW5JdGVtcyA/IGZhbHNlIDpcclxuICAgICAgLy8gRm9yIHJlbW92YWJsZSBsaXN0IGl0ZW1zLCBhbGxvdyByZW1vdmluZyBhbnkgaXRlbVxyXG4gICAgICB0aGlzLmxheW91dE5vZGUuYXJyYXlJdGVtVHlwZSA9PT0gJ2xpc3QnID8gdHJ1ZSA6XHJcbiAgICAgICAgLy8gRm9yIHJlbW92YWJsZSB0dXBsZSBpdGVtcywgb25seSBhbGxvdyByZW1vdmluZyBsYXN0IGl0ZW0gaW4gbGlzdFxyXG4gICAgICAgIHRoaXMubGF5b3V0SW5kZXhbdGhpcy5sYXlvdXRJbmRleC5sZW5ndGggLSAxXSA9PT0gdGhpcy5wYXJlbnRBcnJheS5pdGVtcy5sZW5ndGggLSAyO1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLmluaXRpYWxpemVGcmFtZXdvcmsoKTtcclxuICAgIGlmICh0aGlzLmxheW91dE5vZGUuYXJyYXlJdGVtICYmIHRoaXMubGF5b3V0Tm9kZS50eXBlICE9PSAnJHJlZicpIHtcclxuICAgICAgdGhpcy5wYXJlbnRBcnJheSA9IHRoaXMuanNmLmdldFBhcmVudE5vZGUodGhpcyk7XHJcbiAgICAgIGlmICh0aGlzLnBhcmVudEFycmF5KSB7XHJcbiAgICAgICAgdGhpcy5pc09yZGVyYWJsZSA9IHRoaXMubGF5b3V0Tm9kZS5hcnJheUl0ZW1UeXBlID09PSAnbGlzdCcgJiZcclxuICAgICAgICAgICF0aGlzLm9wdGlvbnMucmVhZG9ubHkgJiYgdGhpcy5wYXJlbnRBcnJheS5vcHRpb25zLm9yZGVyYWJsZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoKSB7XHJcbiAgICBpZiAoIXRoaXMuZnJhbWV3b3JrSW5pdGlhbGl6ZWQpIHtcclxuICAgICAgdGhpcy5pbml0aWFsaXplRnJhbWV3b3JrKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBpbml0aWFsaXplRnJhbWV3b3JrKCkge1xyXG4gICAgaWYgKHRoaXMubGF5b3V0Tm9kZSkge1xyXG4gICAgICB0aGlzLm9wdGlvbnMgPSBjbG9uZURlZXAodGhpcy5sYXlvdXROb2RlLm9wdGlvbnMpO1xyXG4gICAgICB0aGlzLndpZGdldExheW91dE5vZGUgPSB7XHJcbiAgICAgICAgLi4udGhpcy5sYXlvdXROb2RlLFxyXG4gICAgICAgIG9wdGlvbnM6IGNsb25lRGVlcCh0aGlzLmxheW91dE5vZGUub3B0aW9ucylcclxuICAgICAgfTtcclxuICAgICAgdGhpcy53aWRnZXRPcHRpb25zID0gdGhpcy53aWRnZXRMYXlvdXROb2RlLm9wdGlvbnM7XHJcbiAgICAgIHRoaXMuZm9ybUNvbnRyb2wgPSB0aGlzLmpzZi5nZXRGb3JtQ29udHJvbCh0aGlzKTtcclxuXHJcbiAgICAgIHRoaXMub3B0aW9ucy5pc0lucHV0V2lkZ2V0ID0gaW5BcnJheSh0aGlzLmxheW91dE5vZGUudHlwZSwgW1xyXG4gICAgICAgICdidXR0b24nLCAnY2hlY2tib3gnLCAnY2hlY2tib3hlcy1pbmxpbmUnLCAnY2hlY2tib3hlcycsICdjb2xvcicsXHJcbiAgICAgICAgJ2RhdGUnLCAnZGF0ZXRpbWUtbG9jYWwnLCAnZGF0ZXRpbWUnLCAnZW1haWwnLCAnZmlsZScsICdoaWRkZW4nLFxyXG4gICAgICAgICdpbWFnZScsICdpbnRlZ2VyJywgJ21vbnRoJywgJ251bWJlcicsICdwYXNzd29yZCcsICdyYWRpbycsXHJcbiAgICAgICAgJ3JhZGlvYnV0dG9ucycsICdyYWRpb3MtaW5saW5lJywgJ3JhZGlvcycsICdyYW5nZScsICdyZXNldCcsICdzZWFyY2gnLFxyXG4gICAgICAgICdzZWxlY3QnLCAnc3VibWl0JywgJ3RlbCcsICd0ZXh0JywgJ3RleHRhcmVhJywgJ3RpbWUnLCAndXJsJywgJ3dlZWsnXHJcbiAgICAgIF0pO1xyXG5cclxuICAgICAgdGhpcy5vcHRpb25zLnRpdGxlID0gdGhpcy5zZXRUaXRsZSgpO1xyXG5cclxuICAgICAgdGhpcy5vcHRpb25zLmh0bWxDbGFzcyA9XHJcbiAgICAgICAgYWRkQ2xhc3Nlcyh0aGlzLm9wdGlvbnMuaHRtbENsYXNzLCAnc2NoZW1hLWZvcm0tJyArIHRoaXMubGF5b3V0Tm9kZS50eXBlKTtcclxuXHJcbiAgICAgIFxyXG4gICAgICBpZiAodGhpcy5sYXlvdXROb2RlLnR5cGUgPT09ICdhcnJheScpIHtcclxuICAgICAgICB0aGlzLm9wdGlvbnMuaHRtbENsYXNzID0gYWRkQ2xhc3Nlcyh0aGlzLm9wdGlvbnMuaHRtbENsYXNzLCB0aGlzLndpZGdldFN0eWxlcy5fX2FycmF5X18uaHRtbENsYXNzKTtcclxuICAgICAgfSBlbHNlIGlmICh0aGlzLmxheW91dE5vZGUuYXJyYXlJdGVtICYmIHRoaXMubGF5b3V0Tm9kZS50eXBlICE9PSAnJHJlZicpIHtcclxuICAgICAgICB0aGlzLm9wdGlvbnMuaHRtbENsYXNzID0gYWRkQ2xhc3Nlcyh0aGlzLm9wdGlvbnMuaHRtbENsYXNzLCB0aGlzLndpZGdldFN0eWxlcy5fX2FycmF5X2l0ZW1fbm9ucmVmX18uaHRtbENsYXNzKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLm9wdGlvbnMuaHRtbENsYXNzID0gYWRkQ2xhc3Nlcyh0aGlzLm9wdGlvbnMuaHRtbENsYXNzLCB0aGlzLndpZGdldFN0eWxlcy5fX2Zvcm1fZ3JvdXBfXy5odG1sQ2xhc3MpO1xyXG4gICAgICB9XHJcbiAgICAgIFxyXG5cclxuICAgICAgLypcclxuICAgICAgdGhpcy5vcHRpb25zLmh0bWxDbGFzcyA9XHJcbiAgICAgIHRoaXMubGF5b3V0Tm9kZS50eXBlID09PSAnYXJyYXknID9cclxuICAgICAgICBhZGRDbGFzc2VzKHRoaXMub3B0aW9ucy5odG1sQ2xhc3MsIFsnYm9yZGVyJywnc2hhZG93LW1kJywncC0xJ10pIDpcclxuICAgICAgICB0aGlzLmxheW91dE5vZGUuYXJyYXlJdGVtICYmIHRoaXMubGF5b3V0Tm9kZS50eXBlICE9PSAnJHJlZicgP1xyXG4gICAgICAgICAgYWRkQ2xhc3Nlcyh0aGlzLm9wdGlvbnMuaHRtbENsYXNzLCBbJ2JvcmRlcicsJ3NoYWRvdy1tZCcsJ3AtMSddKSA6XHJcbiAgICAgICAgICBhZGRDbGFzc2VzKHRoaXMub3B0aW9ucy5odG1sQ2xhc3MsICdtYi0xJyk7XHJcbiovXHJcblxyXG4vKlxyXG50aGlzLm9wdGlvbnMuaHRtbENsYXNzID1cclxudGhpcy5sYXlvdXROb2RlLnR5cGUgPT09ICdhcnJheScgP1xyXG5hZGRDbGFzc2VzKHRoaXMub3B0aW9ucy5odG1sQ2xhc3MsIHRoaXMud2lkZ2V0U3R5bGVzLmFycmF5Lmh0bWxDbGFzcyk6XHJcbiAgdGhpcy5sYXlvdXROb2RlLmFycmF5SXRlbSAmJiB0aGlzLmxheW91dE5vZGUudHlwZSAhPT0gJyRyZWYnID9cclxuICBhZGRDbGFzc2VzKHRoaXMub3B0aW9ucy5odG1sQ2xhc3MsIHRoaXMud2lkZ2V0U3R5bGVzLl9fYXJyYXlfaXRlbV9ub25yZWZfXy5odG1sQ2xhc3MpOlxyXG4gIGFkZENsYXNzZXModGhpcy5vcHRpb25zLmh0bWxDbGFzcywgdGhpcy53aWRnZXRTdHlsZXMuX19mb3JtX2dyb3VwX18uaHRtbENsYXNzKTtcclxuKi9cclxuICAgICAgICAgIFxyXG4gICAgICB0aGlzLndpZGdldE9wdGlvbnMuaHRtbENsYXNzID0gJyc7XHJcbiAgICAgIHRoaXMub3B0aW9ucy5sYWJlbEh0bWxDbGFzcyA9XHJcbiAgICAgICAgYWRkQ2xhc3Nlcyh0aGlzLm9wdGlvbnMubGFiZWxIdG1sQ2xhc3MsIHRoaXMud2lkZ2V0U3R5bGVzLl9fY29udHJvbF9sYWJlbF9fLmxhYmVsSHRtbENsYXNzKTtcclxuICAgICAgdGhpcy53aWRnZXRPcHRpb25zLmFjdGl2ZUNsYXNzID1cclxuICAgICAgICBhZGRDbGFzc2VzKHRoaXMud2lkZ2V0T3B0aW9ucy5hY3RpdmVDbGFzcywgdGhpcy53aWRnZXRTdHlsZXMuX19hY3RpdmVfXy5hY3RpdmVDbGFzcyk7XHJcbiAgICAgIHRoaXMub3B0aW9ucy5maWVsZEFkZG9uTGVmdCA9XHJcbiAgICAgICAgdGhpcy5vcHRpb25zLmZpZWxkQWRkb25MZWZ0IHx8IHRoaXMub3B0aW9ucy5wcmVwZW5kO1xyXG4gICAgICB0aGlzLm9wdGlvbnMuZmllbGRBZGRvblJpZ2h0ID1cclxuICAgICAgICB0aGlzLm9wdGlvbnMuZmllbGRBZGRvblJpZ2h0IHx8IHRoaXMub3B0aW9ucy5hcHBlbmQ7XHJcblxyXG4gICAgICAvLyBBZGQgYXN0ZXJpc2sgdG8gdGl0bGVzIGlmIHJlcXVpcmVkXHJcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMudGl0bGUgJiYgdGhpcy5sYXlvdXROb2RlLnR5cGUgIT09ICd0YWInICYmXHJcbiAgICAgICAgIXRoaXMub3B0aW9ucy5ub3RpdGxlICYmIHRoaXMub3B0aW9ucy5yZXF1aXJlZCAmJlxyXG4gICAgICAgICF0aGlzLm9wdGlvbnMudGl0bGUuaW5jbHVkZXMoJyonKVxyXG4gICAgICApIHtcclxuICAgICAgICBsZXQgcmVxdWlyZWRfYXN0ZXJpc2tfY2xhc3M9dGhpcy53aWRnZXRTdHlsZXMuX19yZXF1aXJlZF9hc3Rlcmlza19ffHwndGV4dC1kYW5nZXInXHJcbiAgICAgICAgdGhpcy5vcHRpb25zLnRpdGxlICs9IGAgPHN0cm9uZyBjbGFzcz1cIiR7cmVxdWlyZWRfYXN0ZXJpc2tfY2xhc3N9XCI+Kjwvc3Ryb25nPmA7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRoaXMubGF5b3V0Tm9kZS50eXBlID09ICdvcHRpb25maWVsZHNldCcpIHtcclxuICAgICAgICB0aGlzLm9wdGlvbnMubWVzc2FnZUxvY2F0aW9uID0gJ3RvcCc7XHJcbiAgICAgIH1cclxuICAgICAgLy8gU2V0IG1pc2NlbGFuZW91cyBzdHlsZXMgYW5kIHNldHRpbmdzIGZvciBlYWNoIGNvbnRyb2wgdHlwZVxyXG4gICAgICB0aGlzLmFwcGx5Q3NzQ2xhc3Nlcyh0aGlzLmxheW91dE5vZGUudHlwZSwgdGhpcy53aWRnZXRPcHRpb25zLCB0aGlzLm9wdGlvbnMuc3R5bGUpO1xyXG4gICAgICBpZiAodGhpcy5mb3JtQ29udHJvbCkge1xyXG4gICAgICAgIHRoaXMudXBkYXRlSGVscEJsb2NrKHRoaXMuZm9ybUNvbnRyb2wuc3RhdHVzKTtcclxuICAgICAgICB0aGlzLmZvcm1Db250cm9sLnN0YXR1c0NoYW5nZXMuc3Vic2NyaWJlKHN0YXR1cyA9PiB0aGlzLnVwZGF0ZUhlbHBCbG9jayhzdGF0dXMpKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5kZWJ1Zykge1xyXG4gICAgICAgICAgY29uc3QgdmFyczogYW55W10gPSBbXTtcclxuICAgICAgICAgIHRoaXMuZGVidWdPdXRwdXQgPSBtYXAodmFycywgdGhpc1ZhciA9PiBKU09OLnN0cmluZ2lmeSh0aGlzVmFyLCBudWxsLCAyKSkuam9pbignXFxuJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuZnJhbWV3b3JrSW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG4gIHVwZGF0ZUhlbHBCbG9jayhzdGF0dXMpIHtcclxuICAgIHRoaXMub3B0aW9ucy5oZWxwQmxvY2sgPSBzdGF0dXMgPT09ICdJTlZBTElEJyAmJlxyXG4gICAgICB0aGlzLm9wdGlvbnMuZW5hYmxlRXJyb3JTdGF0ZSAmJiB0aGlzLmZvcm1Db250cm9sLmVycm9ycyAmJlxyXG4gICAgICAodGhpcy5mb3JtQ29udHJvbC5kaXJ0eSB8fCB0aGlzLm9wdGlvbnMuZmVlZGJhY2tPblJlbmRlcikgP1xyXG4gICAgICB0aGlzLmpzZi5mb3JtYXRFcnJvcnModGhpcy5mb3JtQ29udHJvbC5lcnJvcnMsIHRoaXMub3B0aW9ucy52YWxpZGF0aW9uTWVzc2FnZXMpIDpcclxuICAgICAgdGhpcy5vcHRpb25zLmRlc2NyaXB0aW9uIHx8IHRoaXMub3B0aW9ucy5oZWxwIHx8IG51bGw7XHJcbiAgfVxyXG5cclxuICBzZXRUaXRsZSgpOiBzdHJpbmcge1xyXG4gICAgc3dpdGNoICh0aGlzLmxheW91dE5vZGUudHlwZSkge1xyXG4gICAgICBjYXNlICdidXR0b24nOlxyXG4gICAgICBjYXNlICdjaGVja2JveCc6XHJcbiAgICAgIGNhc2UgJ3NlY3Rpb24nOlxyXG4gICAgICBjYXNlICdoZWxwJzpcclxuICAgICAgY2FzZSAnbXNnJzpcclxuICAgICAgY2FzZSAnc3VibWl0JzpcclxuICAgICAgY2FzZSAnbWVzc2FnZSc6XHJcbiAgICAgIGNhc2UgJ3RhYmFycmF5JzpcclxuICAgICAgY2FzZSAndGFicyc6XHJcbiAgICAgIGNhc2UgJyRyZWYnOlxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICBjYXNlICdhZHZhbmNlZGZpZWxkc2V0JzpcclxuICAgICAgICB0aGlzLndpZGdldE9wdGlvbnMuZXhwYW5kYWJsZSA9IHRydWU7XHJcbiAgICAgICAgdGhpcy53aWRnZXRPcHRpb25zLnRpdGxlID0gJ0FkdmFuY2VkIG9wdGlvbnMnO1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICBjYXNlICdhdXRoZmllbGRzZXQnOlxyXG4gICAgICAgIHRoaXMud2lkZ2V0T3B0aW9ucy5leHBhbmRhYmxlID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLndpZGdldE9wdGlvbnMudGl0bGUgPSAnQXV0aGVudGljYXRpb24gc2V0dGluZ3MnO1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICBjYXNlICdmaWVsZHNldCc6XHJcbiAgICAgICAgdGhpcy53aWRnZXRPcHRpb25zLnRpdGxlID0gdGhpcy5vcHRpb25zLnRpdGxlO1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHRoaXMud2lkZ2V0T3B0aW9ucy50aXRsZSA9IG51bGw7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuanNmLnNldEl0ZW1UaXRsZSh0aGlzKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlbW92ZUl0ZW0oKSB7XHJcbiAgICB0aGlzLmpzZi5yZW1vdmVJdGVtKHRoaXMpO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2IFthdHRyLmRhdGEtYnMtdGhlbWVdPVwidGhlbWVcIiBbYXR0ci5kYXRhLXRoZW1lXT1cInRoZW1lXCIgW2NsYXNzXT1cIm9wdGlvbnM/Lmh0bWxDbGFzcyB8fCAnJ1wiIFtjbGFzcy5oYXMtZmVlZGJhY2tdPVwib3B0aW9ucz8uZmVlZGJhY2sgJiYgb3B0aW9ucz8uaXNJbnB1dFdpZGdldCAmJlxyXG4gICAgICAgIChmb3JtQ29udHJvbD8uZGlydHkgfHwgb3B0aW9ucz8uZmVlZGJhY2tPblJlbmRlcilcIiBbY2xhc3MuaGFzLWVycm9yXT1cIm9wdGlvbnM/LmVuYWJsZUVycm9yU3RhdGUgJiYgZm9ybUNvbnRyb2w/LmVycm9ycyAmJlxyXG4gICAgICAgIChmb3JtQ29udHJvbD8uZGlydHkgfHwgb3B0aW9ucz8uZmVlZGJhY2tPblJlbmRlcilcIiBbY2xhc3MuaGFzLXN1Y2Nlc3NdPVwib3B0aW9ucz8uZW5hYmxlU3VjY2Vzc1N0YXRlICYmICFmb3JtQ29udHJvbD8uZXJyb3JzICYmXHJcbiAgICAgICAgKGZvcm1Db250cm9sPy5kaXJ0eSB8fCBvcHRpb25zPy5mZWVkYmFja09uUmVuZGVyKVwiPlxyXG5cclxuICAgIDxidXR0b24gKm5nSWY9XCJzaG93UmVtb3ZlQnV0dG9uXCIgW2NsYXNzXT1cIndpZGdldFN0eWxlcy5fX3JlbW92ZV9pdGVtX19cIiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cInJlbW92ZUl0ZW0oKVwiPlxyXG4gICAgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCI+JnRpbWVzOzwvc3Bhbj5cclxuICAgIDxzcGFuIFtjbGFzc109XCJ3aWRnZXRTdHlsZXMuX19zY3JlZW5fcmVhZGVyX19cIj5DbG9zZTwvc3Bhbj5cclxuICA8L2J1dHRvbj5cclxuICAgIDxkaXYgKm5nSWY9XCJvcHRpb25zPy5tZXNzYWdlTG9jYXRpb24gPT09ICd0b3AnXCI+XHJcbiAgICAgICAgPHAgKm5nSWY9XCJvcHRpb25zPy5oZWxwQmxvY2tcIiBbY2xhc3NdPVwid2lkZ2V0U3R5bGVzLl9faGVscF9ibG9ja19fXCIgW2lubmVySFRNTF09XCJvcHRpb25zPy5oZWxwQmxvY2tcIj48L3A+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8bGFiZWwgKm5nSWY9XCJvcHRpb25zPy50aXRsZSAmJiBsYXlvdXROb2RlPy50eXBlICE9PSAndGFiJ1wiIFthdHRyLmZvcl09XCInY29udHJvbCcgKyBsYXlvdXROb2RlPy5faWRcIiBbY2xhc3NdPVwib3B0aW9ucz8ubGFiZWxIdG1sQ2xhc3MgfHwgJydcIiBbY2xhc3Muc3Itb25seV09XCJvcHRpb25zPy5ub3RpdGxlXCIgW2lubmVySFRNTF09XCJvcHRpb25zPy50aXRsZVwiPjwvbGFiZWw+XHJcbiAgICA8cCAqbmdJZj1cImxheW91dE5vZGU/LnR5cGUgPT09ICdzdWJtaXQnICYmIGpzZj8uZm9ybU9wdGlvbnM/LmZpZWxkc1JlcXVpcmVkXCI+XHJcbiAgICAgICAgPHN0cm9uZyBbY2xhc3NdPVwid2lkZ2V0U3R5bGVzLl9fcmVxdWlyZWRfYXN0ZXJpc2tfX1wiPio8L3N0cm9uZz4gPSByZXF1aXJlZCBmaWVsZHNcclxuICAgIDwvcD5cclxuICAgIDxkaXYgW2NsYXNzLmlucHV0LWdyb3VwXT1cIm9wdGlvbnM/LmZpZWxkQWRkb25MZWZ0IHx8IG9wdGlvbnM/LmZpZWxkQWRkb25SaWdodFwiPlxyXG4gICAgICAgIDxzcGFuICpuZ0lmPVwib3B0aW9ucz8uZmllbGRBZGRvbkxlZnRcIiBbY2xhc3NdPVwid2lkZ2V0U3R5bGVzLl9fZmllbGRfYWRkb25fbGVmdF9fXCIgW2lubmVySFRNTF09XCJvcHRpb25zPy5maWVsZEFkZG9uTGVmdFwiPjwvc3Bhbj5cclxuXHJcbiAgICAgICAgPHNlbGVjdC13aWRnZXQtd2lkZ2V0IFtsYXlvdXROb2RlXT1cIndpZGdldExheW91dE5vZGVcIiBbZGF0YUluZGV4XT1cImRhdGFJbmRleFwiIFtsYXlvdXRJbmRleF09XCJsYXlvdXRJbmRleFwiPjwvc2VsZWN0LXdpZGdldC13aWRnZXQ+XHJcblxyXG4gICAgICAgIDxzcGFuICpuZ0lmPVwib3B0aW9ucz8uZmllbGRBZGRvblJpZ2h0XCIgW2NsYXNzXT1cIndpZGdldFN0eWxlcy5fX2ZpZWxkX2FkZG9uX3JpZ2h0X19cIiBbaW5uZXJIVE1MXT1cIm9wdGlvbnM/LmZpZWxkQWRkb25SaWdodFwiPjwvc3Bhbj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxzcGFuICpuZ0lmPVwib3B0aW9ucz8uZmVlZGJhY2sgJiYgb3B0aW9ucz8uaXNJbnB1dFdpZGdldCAmJlxyXG4gICAgICAgICAgIW9wdGlvbnM/LmZpZWxkQWRkb25SaWdodCAmJiAhbGF5b3V0Tm9kZS5hcnJheUl0ZW0gJiZcclxuICAgICAgICAgIChmb3JtQ29udHJvbD8uZGlydHkgfHwgb3B0aW9ucz8uZmVlZGJhY2tPblJlbmRlcilcIiBbY2xhc3MuZ2x5cGhpY29uLW9rXT1cIm9wdGlvbnM/LmVuYWJsZVN1Y2Nlc3NTdGF0ZSAmJiAhZm9ybUNvbnRyb2w/LmVycm9yc1wiIFtjbGFzcy5nbHlwaGljb24tcmVtb3ZlXT1cIm9wdGlvbnM/LmVuYWJsZUVycm9yU3RhdGUgJiYgZm9ybUNvbnRyb2w/LmVycm9yc1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIGNsYXNzPVwiZm9ybS1jb250cm9sLWZlZWRiYWNrIGdseXBoaWNvblwiPjwvc3Bhbj5cclxuICAgIDxkaXYgKm5nSWY9XCJvcHRpb25zPy5tZXNzYWdlTG9jYXRpb24gIT09ICd0b3AnXCI+XHJcbiAgICAgICAgPHAgKm5nSWY9XCJvcHRpb25zPy5oZWxwQmxvY2tcIiBbY2xhc3NdPVwid2lkZ2V0U3R5bGVzLl9faGVscF9ibG9ja19fXCIgW2lubmVySFRNTF09XCJvcHRpb25zPy5oZWxwQmxvY2tcIj48L3A+XHJcbiAgICA8L2Rpdj5cclxuXHJcbjwvZGl2PlxyXG5cclxuPGRpdiAqbmdJZj1cImRlYnVnICYmIGRlYnVnT3V0cHV0XCI+ZGVidWc6XHJcbiAgICA8cHJlPnt7ZGVidWdPdXRwdXR9fTwvcHJlPlxyXG48L2Rpdj5cclxuXHJcbjwhLS1cclxuPGRpdiBjbGFzcz1cImJ0biBpbnB1dCBpbnB1dC1ib3JkZXJlZCBpbnB1dC1wcmltYXJ5IHctZnVsbCBtYXgtdy14c1xyXG5idG4tbmV1dHJhbFxyXG5idG4tcHJpbWFyeVxyXG5idG4tc2Vjb25kYXJ5XHJcbmJ0bi1hY2NlbnRcclxuYnRuLWluZm9cclxuYnRuLXN1Y2Nlc3NcclxuYnRuLXdhcm5pbmdcclxuYnRuLWVycm9yXHJcbmJ0bi1naG9zdFxyXG5idG4tbGlua1xyXG5idG4tb3V0bGluZVxyXG5idG4tYWN0aXZlXHJcbmJ0bi1kaXNhYmxlZFxyXG5nbGFzc1xyXG5uby1hbmltYXRpb25cclxuYnRuLWxnXHJcbmJ0bi1tZFxyXG5idG4tc21cclxuYnRuLXhzXHJcbmJ0bi13aWRlXHJcbmJ0bi1ibG9ja1xyXG5idG4tY2lyY2xlXHJcbmJ0bi1zcXVhcmVcclxuaGlkZGVuXHJcblwiPmRlZnMgYWw8L2Rpdj5cclxuLS0+XHJcbjwhLS08aW5wdXQgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj1cIlR5cGUgaGVyZVwiIGNsYXNzPVwiaW5wdXQgaW5wdXQtYm9yZGVyZWQgaW5wdXQtcHJpbWFyeSB3LWZ1bGwgbWF4LXcteHNcIiAvPi0tPiJdfQ==
|