raise-common-lib 0.0.25 → 0.0.27
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/assets/language/fr.d.ts +3377 -0
- package/assets/language/ja.d.ts +3351 -0
- package/assets/language/ko.d.ts +3351 -0
- package/assets/language/zh-CN.d.ts +3064 -0
- package/assets/language/zh-TW.d.ts +3354 -0
- package/bundles/raise-common-lib.umd.js +18418 -468
- package/bundles/raise-common-lib.umd.js.map +1 -1
- package/bundles/raise-common-lib.umd.min.js +2 -2
- package/bundles/raise-common-lib.umd.min.js.map +1 -1
- package/esm2015/assets/language/fr.js +3384 -0
- package/esm2015/assets/language/ja.js +3358 -0
- package/esm2015/assets/language/ko.js +3358 -0
- package/esm2015/assets/language/zh-CN.js +3071 -0
- package/esm2015/assets/language/zh-TW.js +3361 -0
- package/esm2015/lib/form/checkbox-group/index.component.js +1 -1
- package/esm2015/lib/form/drawer-form/constants.js +29 -0
- package/esm2015/lib/form/drawer-form/drawer-form.component.js +524 -0
- package/esm2015/lib/form/radio-group/index.component.js +1 -1
- package/esm2015/lib/form/tag-input/index.component.js +44 -11
- package/esm2015/lib/layout/drawer/index.component.js +211 -0
- package/esm2015/lib/layout/main-container/index.component.js +48 -6
- package/esm2015/lib/layout/multi-tab/index.component.js +31 -6
- package/esm2015/lib/layout/rs-header/index.component.js +22 -5
- package/esm2015/lib/raise-common-lib.module.js +13 -2
- package/esm2015/lib/service/drawer.service.js +191 -0
- package/esm2015/lib/service/translation.service.js +142 -0
- package/esm2015/public-api.js +25 -20
- package/esm2015/raise-common-lib.js +2 -2
- package/esm5/assets/language/fr.js +3384 -0
- package/esm5/assets/language/ja.js +3358 -0
- package/esm5/assets/language/ko.js +3358 -0
- package/esm5/assets/language/zh-CN.js +3071 -0
- package/esm5/assets/language/zh-TW.js +3361 -0
- package/esm5/lib/form/checkbox-group/index.component.js +1 -1
- package/esm5/lib/form/drawer-form/constants.js +30 -0
- package/esm5/lib/form/drawer-form/drawer-form.component.js +634 -0
- package/esm5/lib/form/radio-group/index.component.js +1 -1
- package/esm5/lib/form/tag-input/index.component.js +60 -12
- package/esm5/lib/layout/drawer/index.component.js +255 -0
- package/esm5/lib/layout/main-container/index.component.js +52 -9
- package/esm5/lib/layout/multi-tab/index.component.js +32 -8
- package/esm5/lib/layout/rs-header/index.component.js +20 -5
- package/esm5/lib/raise-common-lib.module.js +13 -2
- package/esm5/lib/service/drawer.service.js +229 -0
- package/esm5/lib/service/translation.service.js +157 -0
- package/esm5/public-api.js +25 -20
- package/esm5/raise-common-lib.js +2 -2
- package/fesm2015/raise-common-lib.js +17825 -93
- package/fesm2015/raise-common-lib.js.map +1 -1
- package/fesm5/raise-common-lib.js +18415 -469
- package/fesm5/raise-common-lib.js.map +1 -1
- package/lib/form/drawer-form/constants.d.ts +34 -0
- package/lib/form/drawer-form/drawer-form.component.d.ts +63 -0
- package/lib/form/tag-input/index.component.d.ts +8 -2
- package/lib/layout/drawer/index.component.d.ts +24 -0
- package/lib/layout/main-container/index.component.d.ts +7 -0
- package/lib/layout/multi-tab/index.component.d.ts +4 -2
- package/lib/layout/rs-header/index.component.d.ts +4 -1
- package/lib/service/drawer.service.d.ts +33 -0
- package/lib/service/translation.service.d.ts +9 -0
- package/package.json +1 -1
- package/public-api.d.ts +24 -19
- package/raise-common-lib.metadata.json +1 -1
- package/src/assets/img/down-arrow.svg +3 -0
- package/src/assets/img/drawer-back.svg +4 -0
- package/src/assets/img/tooltip-icon.svg +4 -0
- package/src/assets/language/fr.ts +3603 -0
- package/src/assets/language/ja.ts +3501 -0
- package/src/assets/language/ko.ts +3478 -0
- package/src/assets/language/zh-CN.ts +3115 -0
- package/src/assets/language/zh-TW.ts +3411 -0
- package/src/assets/style/reset/dropdown.scss +12 -3
- package/src/assets/style/reset/input.scss +18 -3
|
@@ -0,0 +1,634 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview added by tsickle
|
|
3
|
+
* Generated from: lib/form/drawer-form/drawer-form.component.ts
|
|
4
|
+
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
|
|
5
|
+
*/
|
|
6
|
+
import * as tslib_1 from "tslib";
|
|
7
|
+
import { ChangeDetectorRef, Component, ElementRef, EventEmitter, Input, Output, QueryList, TemplateRef, ViewChild, ViewChildren, ViewContainerRef, } from "@angular/core";
|
|
8
|
+
import { DatePipe } from "@angular/common";
|
|
9
|
+
import { Query } from "@syncfusion/ej2-data";
|
|
10
|
+
import { EmailPattern } from "./constants";
|
|
11
|
+
var DrawerFormComponent = /** @class */ (function () {
|
|
12
|
+
function DrawerFormComponent(datePipe, ref) {
|
|
13
|
+
this.datePipe = datePipe;
|
|
14
|
+
this.ref = ref;
|
|
15
|
+
this.sections = [];
|
|
16
|
+
this.optionsMap = {};
|
|
17
|
+
this.formDisabled = false;
|
|
18
|
+
this.showAnchor = true;
|
|
19
|
+
this.optionFields = {
|
|
20
|
+
text: "text",
|
|
21
|
+
value: "code",
|
|
22
|
+
disabled: "disabled",
|
|
23
|
+
groupBy: null,
|
|
24
|
+
};
|
|
25
|
+
this.showFilterNumber = 10;
|
|
26
|
+
this.form = {};
|
|
27
|
+
this.formChange = new EventEmitter();
|
|
28
|
+
this.fieldChange = new EventEmitter();
|
|
29
|
+
this.filterOptionsMap = {};
|
|
30
|
+
this.fieldValidMap = {};
|
|
31
|
+
this.scrollIndex = 0;
|
|
32
|
+
this.isClickAnchor = false;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* @return {?}
|
|
36
|
+
*/
|
|
37
|
+
DrawerFormComponent.prototype.ngOnInit = /**
|
|
38
|
+
* @return {?}
|
|
39
|
+
*/
|
|
40
|
+
function () { };
|
|
41
|
+
/**
|
|
42
|
+
* @param {?} changes
|
|
43
|
+
* @return {?}
|
|
44
|
+
*/
|
|
45
|
+
DrawerFormComponent.prototype.ngOnChanges = /**
|
|
46
|
+
* @param {?} changes
|
|
47
|
+
* @return {?}
|
|
48
|
+
*/
|
|
49
|
+
function (changes) {
|
|
50
|
+
if (changes.sections) {
|
|
51
|
+
this.formatForm(changes.sections.currentValue);
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
/**
|
|
55
|
+
* @return {?}
|
|
56
|
+
*/
|
|
57
|
+
DrawerFormComponent.prototype.ngAfterViewInit = /**
|
|
58
|
+
* @return {?}
|
|
59
|
+
*/
|
|
60
|
+
function () {
|
|
61
|
+
var _this = this;
|
|
62
|
+
this.customTemplateRender(this.containers);
|
|
63
|
+
this.customSectionRender(this.sectionContainers);
|
|
64
|
+
this.containers.changes.subscribe((/**
|
|
65
|
+
* @param {?} containers
|
|
66
|
+
* @return {?}
|
|
67
|
+
*/
|
|
68
|
+
function (containers) {
|
|
69
|
+
_this.containers = containers;
|
|
70
|
+
_this.customTemplateRender(containers);
|
|
71
|
+
}));
|
|
72
|
+
this.sectionContainers.changes.subscribe((/**
|
|
73
|
+
* @param {?} containers
|
|
74
|
+
* @return {?}
|
|
75
|
+
*/
|
|
76
|
+
function (containers) {
|
|
77
|
+
_this.sectionContainers = containers;
|
|
78
|
+
_this.customSectionRender(containers);
|
|
79
|
+
}));
|
|
80
|
+
if (this.showAnchor) {
|
|
81
|
+
this.initAnchorScrollHandler();
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
/**
|
|
85
|
+
* @param {?} containers
|
|
86
|
+
* @return {?}
|
|
87
|
+
*/
|
|
88
|
+
DrawerFormComponent.prototype.customTemplateRender = /**
|
|
89
|
+
* @param {?} containers
|
|
90
|
+
* @return {?}
|
|
91
|
+
*/
|
|
92
|
+
function (containers) {
|
|
93
|
+
var _this = this;
|
|
94
|
+
if (this.customTemplate && containers.length > 0) {
|
|
95
|
+
/** @type {?} */
|
|
96
|
+
var customFields_1 = [];
|
|
97
|
+
this.sections.forEach((/**
|
|
98
|
+
* @param {?} section
|
|
99
|
+
* @return {?}
|
|
100
|
+
*/
|
|
101
|
+
function (section) {
|
|
102
|
+
section.fields.forEach((/**
|
|
103
|
+
* @param {?} field
|
|
104
|
+
* @return {?}
|
|
105
|
+
*/
|
|
106
|
+
function (field) {
|
|
107
|
+
if (field.fieldFormType === "Custom") {
|
|
108
|
+
customFields_1.push(field);
|
|
109
|
+
}
|
|
110
|
+
}));
|
|
111
|
+
}));
|
|
112
|
+
containers.forEach((/**
|
|
113
|
+
* @param {?} container
|
|
114
|
+
* @param {?} index
|
|
115
|
+
* @return {?}
|
|
116
|
+
*/
|
|
117
|
+
function (container, index) {
|
|
118
|
+
container.clear();
|
|
119
|
+
container.createEmbeddedView(_this.customTemplate, {
|
|
120
|
+
$implicit: customFields_1[index],
|
|
121
|
+
});
|
|
122
|
+
}));
|
|
123
|
+
}
|
|
124
|
+
};
|
|
125
|
+
/**
|
|
126
|
+
* @param {?} containers
|
|
127
|
+
* @return {?}
|
|
128
|
+
*/
|
|
129
|
+
DrawerFormComponent.prototype.customSectionRender = /**
|
|
130
|
+
* @param {?} containers
|
|
131
|
+
* @return {?}
|
|
132
|
+
*/
|
|
133
|
+
function (containers) {
|
|
134
|
+
var _this = this;
|
|
135
|
+
if (this.customSectionTemplate && containers.length > 0) {
|
|
136
|
+
/** @type {?} */
|
|
137
|
+
var customSections_1 = this.sections.filter((/**
|
|
138
|
+
* @param {?} section
|
|
139
|
+
* @return {?}
|
|
140
|
+
*/
|
|
141
|
+
function (section) { return section.customKey; }));
|
|
142
|
+
containers.forEach((/**
|
|
143
|
+
* @param {?} container
|
|
144
|
+
* @param {?} index
|
|
145
|
+
* @return {?}
|
|
146
|
+
*/
|
|
147
|
+
function (container, index) {
|
|
148
|
+
container.clear();
|
|
149
|
+
/** @type {?} */
|
|
150
|
+
var customKey = customSections_1[index].customKey;
|
|
151
|
+
container.createEmbeddedView(_this.customSectionTemplate[customKey], {
|
|
152
|
+
$implicit: customSections_1[index],
|
|
153
|
+
});
|
|
154
|
+
}));
|
|
155
|
+
}
|
|
156
|
+
};
|
|
157
|
+
/**
|
|
158
|
+
* @param {?} sections
|
|
159
|
+
* @return {?}
|
|
160
|
+
*/
|
|
161
|
+
DrawerFormComponent.prototype.formatForm = /**
|
|
162
|
+
* @param {?} sections
|
|
163
|
+
* @return {?}
|
|
164
|
+
*/
|
|
165
|
+
function (sections) {
|
|
166
|
+
var _this = this;
|
|
167
|
+
sections.forEach((/**
|
|
168
|
+
* @param {?} section
|
|
169
|
+
* @return {?}
|
|
170
|
+
*/
|
|
171
|
+
function (section) {
|
|
172
|
+
section.fields.forEach((/**
|
|
173
|
+
* @param {?} field
|
|
174
|
+
* @return {?}
|
|
175
|
+
*/
|
|
176
|
+
function (field) {
|
|
177
|
+
if (_this.form[field.formKey] === undefined) {
|
|
178
|
+
switch (field.fieldFormType) {
|
|
179
|
+
case "Text":
|
|
180
|
+
case "Email":
|
|
181
|
+
case "Textarea":
|
|
182
|
+
_this.form[field.formKey] = "";
|
|
183
|
+
break;
|
|
184
|
+
case "Tags":
|
|
185
|
+
case "Checkbox":
|
|
186
|
+
case "MultiSelect":
|
|
187
|
+
_this.form[field.formKey] = [];
|
|
188
|
+
break;
|
|
189
|
+
case "Switch":
|
|
190
|
+
_this.form[field.formKey] = false;
|
|
191
|
+
break;
|
|
192
|
+
default:
|
|
193
|
+
_this.form[field.formKey] = null;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}));
|
|
197
|
+
}));
|
|
198
|
+
};
|
|
199
|
+
// 表单提交前会触发这个函数
|
|
200
|
+
// 表单提交前会触发这个函数
|
|
201
|
+
/**
|
|
202
|
+
* @param {?} value
|
|
203
|
+
* @param {?} field
|
|
204
|
+
* @return {?}
|
|
205
|
+
*/
|
|
206
|
+
DrawerFormComponent.prototype.updateForm =
|
|
207
|
+
// 表单提交前会触发这个函数
|
|
208
|
+
/**
|
|
209
|
+
* @param {?} value
|
|
210
|
+
* @param {?} field
|
|
211
|
+
* @return {?}
|
|
212
|
+
*/
|
|
213
|
+
function (value, field) {
|
|
214
|
+
var _a;
|
|
215
|
+
/** @type {?} */
|
|
216
|
+
var newForm = tslib_1.__assign({}, this.form, (_a = {}, _a[field.formKey] = value, _a));
|
|
217
|
+
// 修复错误提示显示 bug,不设置一下有概率拿不到最新的值
|
|
218
|
+
this.form = newForm;
|
|
219
|
+
this.fieldChange.emit({ field: field, value: value });
|
|
220
|
+
this.formChange.emit(newForm);
|
|
221
|
+
};
|
|
222
|
+
/**
|
|
223
|
+
* @param {?} field
|
|
224
|
+
* @param {?=} isAuto
|
|
225
|
+
* @return {?}
|
|
226
|
+
*/
|
|
227
|
+
DrawerFormComponent.prototype.formItemValidator = /**
|
|
228
|
+
* @param {?} field
|
|
229
|
+
* @param {?=} isAuto
|
|
230
|
+
* @return {?}
|
|
231
|
+
*/
|
|
232
|
+
function (field, isAuto) {
|
|
233
|
+
if (isAuto === void 0) { isAuto = false; }
|
|
234
|
+
/** @type {?} */
|
|
235
|
+
var value = this.form[field.formKey];
|
|
236
|
+
/** @type {?} */
|
|
237
|
+
var isValid = true;
|
|
238
|
+
if (field.required) {
|
|
239
|
+
isValid = Array.isArray(value)
|
|
240
|
+
? value.length !== 0
|
|
241
|
+
: ![null, undefined, ""].includes(value);
|
|
242
|
+
}
|
|
243
|
+
if (isValid && field.fieldFormType === "Email" && value) {
|
|
244
|
+
isValid = EmailPattern.test(value);
|
|
245
|
+
}
|
|
246
|
+
if (isValid && field.maxlength) {
|
|
247
|
+
isValid = String(value).length <= field.maxlength;
|
|
248
|
+
}
|
|
249
|
+
if (isValid && field.minlength) {
|
|
250
|
+
isValid = String(value).length >= field.minlength;
|
|
251
|
+
}
|
|
252
|
+
if (isValid && field.max) {
|
|
253
|
+
isValid = value <= field.max;
|
|
254
|
+
}
|
|
255
|
+
if (isValid && field.min) {
|
|
256
|
+
isValid = value >= field.min;
|
|
257
|
+
}
|
|
258
|
+
if (isValid && typeof field.validator === "function") {
|
|
259
|
+
isValid = field.validator.call(null, value, field);
|
|
260
|
+
}
|
|
261
|
+
if (!isAuto) {
|
|
262
|
+
this.fieldValidMap[field.formKey] = isValid;
|
|
263
|
+
}
|
|
264
|
+
return isValid;
|
|
265
|
+
};
|
|
266
|
+
/**
|
|
267
|
+
* @return {?}
|
|
268
|
+
*/
|
|
269
|
+
DrawerFormComponent.prototype.preCheckFormIsValid = /**
|
|
270
|
+
* @return {?}
|
|
271
|
+
*/
|
|
272
|
+
function () {
|
|
273
|
+
var _this = this;
|
|
274
|
+
/** @type {?} */
|
|
275
|
+
var formIsValid = true;
|
|
276
|
+
this.sections.forEach((/**
|
|
277
|
+
* @param {?} section
|
|
278
|
+
* @return {?}
|
|
279
|
+
*/
|
|
280
|
+
function (section) {
|
|
281
|
+
return section.fields.forEach((/**
|
|
282
|
+
* @param {?} field
|
|
283
|
+
* @return {?}
|
|
284
|
+
*/
|
|
285
|
+
function (field) {
|
|
286
|
+
formIsValid = _this.formItemValidator(field) && formIsValid;
|
|
287
|
+
}));
|
|
288
|
+
}));
|
|
289
|
+
return formIsValid;
|
|
290
|
+
};
|
|
291
|
+
Object.defineProperty(DrawerFormComponent.prototype, "formIsValid", {
|
|
292
|
+
get: /**
|
|
293
|
+
* @return {?}
|
|
294
|
+
*/
|
|
295
|
+
function () {
|
|
296
|
+
var _this = this;
|
|
297
|
+
return this.sections.every((/**
|
|
298
|
+
* @param {?} section
|
|
299
|
+
* @return {?}
|
|
300
|
+
*/
|
|
301
|
+
function (section) {
|
|
302
|
+
return section.fields.every((/**
|
|
303
|
+
* @param {?} field
|
|
304
|
+
* @return {?}
|
|
305
|
+
*/
|
|
306
|
+
function (field) { return _this.formItemValidator(field, true); }));
|
|
307
|
+
}));
|
|
308
|
+
},
|
|
309
|
+
enumerable: true,
|
|
310
|
+
configurable: true
|
|
311
|
+
});
|
|
312
|
+
/**
|
|
313
|
+
* @param {?} formKey
|
|
314
|
+
* @return {?}
|
|
315
|
+
*/
|
|
316
|
+
DrawerFormComponent.prototype.getField = /**
|
|
317
|
+
* @param {?} formKey
|
|
318
|
+
* @return {?}
|
|
319
|
+
*/
|
|
320
|
+
function (formKey) {
|
|
321
|
+
/** @type {?} */
|
|
322
|
+
var fieldItem = null;
|
|
323
|
+
this.sections.find((/**
|
|
324
|
+
* @param {?} section
|
|
325
|
+
* @return {?}
|
|
326
|
+
*/
|
|
327
|
+
function (section) {
|
|
328
|
+
fieldItem = section.fields.find((/**
|
|
329
|
+
* @param {?} field
|
|
330
|
+
* @return {?}
|
|
331
|
+
*/
|
|
332
|
+
function (field) { return field.formKey === formKey; }));
|
|
333
|
+
return fieldItem;
|
|
334
|
+
}));
|
|
335
|
+
return fieldItem;
|
|
336
|
+
};
|
|
337
|
+
/**
|
|
338
|
+
* @private
|
|
339
|
+
* @param {?} fn
|
|
340
|
+
* @param {...?} args
|
|
341
|
+
* @return {?}
|
|
342
|
+
*/
|
|
343
|
+
DrawerFormComponent.prototype.callFunction = /**
|
|
344
|
+
* @private
|
|
345
|
+
* @param {?} fn
|
|
346
|
+
* @param {...?} args
|
|
347
|
+
* @return {?}
|
|
348
|
+
*/
|
|
349
|
+
function (fn) {
|
|
350
|
+
var args = [];
|
|
351
|
+
for (var _i = 1; _i < arguments.length; _i++) {
|
|
352
|
+
args[_i - 1] = arguments[_i];
|
|
353
|
+
}
|
|
354
|
+
this.formItemValidator(args[1] || args[0]);
|
|
355
|
+
if (typeof fn === "function") {
|
|
356
|
+
fn.apply(null, args);
|
|
357
|
+
}
|
|
358
|
+
};
|
|
359
|
+
/**
|
|
360
|
+
* @param {?} value
|
|
361
|
+
* @param {?} field
|
|
362
|
+
* @return {?}
|
|
363
|
+
*/
|
|
364
|
+
DrawerFormComponent.prototype.onInput = /**
|
|
365
|
+
* @param {?} value
|
|
366
|
+
* @param {?} field
|
|
367
|
+
* @return {?}
|
|
368
|
+
*/
|
|
369
|
+
function (value, field) {
|
|
370
|
+
this.callFunction(field.onInput, value, field);
|
|
371
|
+
};
|
|
372
|
+
/**
|
|
373
|
+
* @param {?} value
|
|
374
|
+
* @param {?} field
|
|
375
|
+
* @return {?}
|
|
376
|
+
*/
|
|
377
|
+
DrawerFormComponent.prototype.onChange = /**
|
|
378
|
+
* @param {?} value
|
|
379
|
+
* @param {?} field
|
|
380
|
+
* @return {?}
|
|
381
|
+
*/
|
|
382
|
+
function (value, field) {
|
|
383
|
+
if (field.fieldFormType === "Datepicker") {
|
|
384
|
+
value = this.datePipe.transform(value, "yyyy-MM-dd");
|
|
385
|
+
}
|
|
386
|
+
this.updateForm(value, field);
|
|
387
|
+
this.callFunction(field.onChange, value, field);
|
|
388
|
+
};
|
|
389
|
+
/**
|
|
390
|
+
* @param {?} field
|
|
391
|
+
* @return {?}
|
|
392
|
+
*/
|
|
393
|
+
DrawerFormComponent.prototype.onFocus = /**
|
|
394
|
+
* @param {?} field
|
|
395
|
+
* @return {?}
|
|
396
|
+
*/
|
|
397
|
+
function (field) {
|
|
398
|
+
this.callFunction(field.onFocus, field);
|
|
399
|
+
};
|
|
400
|
+
/**
|
|
401
|
+
* @param {?} field
|
|
402
|
+
* @return {?}
|
|
403
|
+
*/
|
|
404
|
+
DrawerFormComponent.prototype.onBlur = /**
|
|
405
|
+
* @param {?} field
|
|
406
|
+
* @return {?}
|
|
407
|
+
*/
|
|
408
|
+
function (field) {
|
|
409
|
+
this.callFunction(field.onBlur, field);
|
|
410
|
+
};
|
|
411
|
+
/**
|
|
412
|
+
* @param {?} event
|
|
413
|
+
* @param {?} field
|
|
414
|
+
* @return {?}
|
|
415
|
+
*/
|
|
416
|
+
DrawerFormComponent.prototype.onFiltering = /**
|
|
417
|
+
* @param {?} event
|
|
418
|
+
* @param {?} field
|
|
419
|
+
* @return {?}
|
|
420
|
+
*/
|
|
421
|
+
function (event, field) {
|
|
422
|
+
/** @type {?} */
|
|
423
|
+
var query = new Query();
|
|
424
|
+
if (event.text) {
|
|
425
|
+
query.where(this.optionFields.text, "contains", event.text, true);
|
|
426
|
+
}
|
|
427
|
+
event.updateData(this.optionsMap[field.optionKey] || [], query);
|
|
428
|
+
};
|
|
429
|
+
/**
|
|
430
|
+
* @param {?} field
|
|
431
|
+
* @return {?}
|
|
432
|
+
*/
|
|
433
|
+
DrawerFormComponent.prototype.getDisabled = /**
|
|
434
|
+
* @param {?} field
|
|
435
|
+
* @return {?}
|
|
436
|
+
*/
|
|
437
|
+
function (field) {
|
|
438
|
+
if (this.formDisabled) {
|
|
439
|
+
return true;
|
|
440
|
+
}
|
|
441
|
+
if (typeof field.disabled === "function") {
|
|
442
|
+
return field.disabled();
|
|
443
|
+
}
|
|
444
|
+
return field.disabled;
|
|
445
|
+
};
|
|
446
|
+
/**
|
|
447
|
+
* @param {?} field
|
|
448
|
+
* @return {?}
|
|
449
|
+
*/
|
|
450
|
+
DrawerFormComponent.prototype.getOptionFields = /**
|
|
451
|
+
* @param {?} field
|
|
452
|
+
* @return {?}
|
|
453
|
+
*/
|
|
454
|
+
function (field) {
|
|
455
|
+
if (field.fieldFormType === "Dropdown") {
|
|
456
|
+
return tslib_1.__assign({}, this.optionFields, { groupBy: field.groupKey || null });
|
|
457
|
+
}
|
|
458
|
+
return this.optionFields;
|
|
459
|
+
};
|
|
460
|
+
/**
|
|
461
|
+
* @param {?} index
|
|
462
|
+
* @return {?}
|
|
463
|
+
*/
|
|
464
|
+
DrawerFormComponent.prototype.onClickAnchor = /**
|
|
465
|
+
* @param {?} index
|
|
466
|
+
* @return {?}
|
|
467
|
+
*/
|
|
468
|
+
function (index) {
|
|
469
|
+
/** @type {?} */
|
|
470
|
+
var sectionItems = this.sectionEls.toArray();
|
|
471
|
+
sectionItems[index].nativeElement.scrollIntoView(true);
|
|
472
|
+
this.scrollIndex = index;
|
|
473
|
+
this.isClickAnchor = true;
|
|
474
|
+
};
|
|
475
|
+
/**
|
|
476
|
+
* @param {?} el
|
|
477
|
+
* @return {?}
|
|
478
|
+
*/
|
|
479
|
+
DrawerFormComponent.prototype.findScrollViewEl = /**
|
|
480
|
+
* @param {?} el
|
|
481
|
+
* @return {?}
|
|
482
|
+
*/
|
|
483
|
+
function (el) {
|
|
484
|
+
if (el === document.body) {
|
|
485
|
+
return el;
|
|
486
|
+
}
|
|
487
|
+
if (el.scrollHeight && el.scrollHeight !== el.offsetHeight) {
|
|
488
|
+
return el;
|
|
489
|
+
}
|
|
490
|
+
return this.findScrollViewEl(el.parentElement);
|
|
491
|
+
};
|
|
492
|
+
/**
|
|
493
|
+
* @return {?}
|
|
494
|
+
*/
|
|
495
|
+
DrawerFormComponent.prototype.initAnchorScrollHandler = /**
|
|
496
|
+
* @return {?}
|
|
497
|
+
*/
|
|
498
|
+
function () {
|
|
499
|
+
var _this = this;
|
|
500
|
+
/** @type {?} */
|
|
501
|
+
var scrollViewEl = this.findScrollViewEl(this.rootEl.nativeElement);
|
|
502
|
+
/** @type {?} */
|
|
503
|
+
var scrollHeight = scrollViewEl.scrollHeight - scrollViewEl.offsetHeight;
|
|
504
|
+
/** @type {?} */
|
|
505
|
+
var sectionViewRatio = this.sectionEls.toArray().map((/**
|
|
506
|
+
* @param {?} section
|
|
507
|
+
* @return {?}
|
|
508
|
+
*/
|
|
509
|
+
function (section) {
|
|
510
|
+
/** @type {?} */
|
|
511
|
+
var ratio = section.nativeElement.offsetHeight / scrollViewEl.scrollHeight;
|
|
512
|
+
return scrollHeight * ratio;
|
|
513
|
+
}));
|
|
514
|
+
/** @type {?} */
|
|
515
|
+
var onScroll = (/**
|
|
516
|
+
* @return {?}
|
|
517
|
+
*/
|
|
518
|
+
function () {
|
|
519
|
+
if (_this.isClickAnchor) {
|
|
520
|
+
_this.isClickAnchor = false;
|
|
521
|
+
return;
|
|
522
|
+
}
|
|
523
|
+
/** @type {?} */
|
|
524
|
+
var scrollTop = scrollViewEl.scrollTop > scrollHeight
|
|
525
|
+
? scrollHeight
|
|
526
|
+
: scrollViewEl.scrollTop;
|
|
527
|
+
/** @type {?} */
|
|
528
|
+
var radioScrollHeight = 0;
|
|
529
|
+
for (var index = 0; index < sectionViewRatio.length; index++) {
|
|
530
|
+
radioScrollHeight += sectionViewRatio[index];
|
|
531
|
+
if (radioScrollHeight >= scrollTop) {
|
|
532
|
+
_this.scrollIndex = index;
|
|
533
|
+
break;
|
|
534
|
+
}
|
|
535
|
+
}
|
|
536
|
+
while (_this.sections[_this.scrollIndex] &&
|
|
537
|
+
!_this.sections[_this.scrollIndex].title) {
|
|
538
|
+
_this.scrollIndex++;
|
|
539
|
+
}
|
|
540
|
+
_this.ref.markForCheck();
|
|
541
|
+
});
|
|
542
|
+
onScroll();
|
|
543
|
+
scrollViewEl.addEventListener("scroll", onScroll);
|
|
544
|
+
};
|
|
545
|
+
DrawerFormComponent.decorators = [
|
|
546
|
+
{ type: Component, args: [{
|
|
547
|
+
selector: "rs-drawer-form",
|
|
548
|
+
template: "<div #drawerFormEl class=\"rs-drawer-form-container\">\r\n <div class=\"section-container\">\r\n <div #sectionEl class=\"section-item\" *ngFor=\"let section of sections\">\r\n <input\r\n type=\"checkbox\"\r\n class=\"section-expand-checkbox\"\r\n *ngIf=\"section.title\"\r\n />\r\n <div class=\"section-title\" *ngIf=\"section.title\">\r\n <span>{{ section.title }}</span>\r\n </div>\r\n <div class=\"section-form\" *ngIf=\"!section.customKey\">\r\n <div\r\n class=\"form-item\"\r\n *ngFor=\"let field of section.fields\"\r\n [attr.data-required]=\"field.required ? 'yes' : 'no'\"\r\n [attr.data-disabled]=\"field.disabled || formDisabled ? 'yes' : 'no'\"\r\n [attr.data-error]=\"\r\n fieldValidMap[field.formKey] === false ? 'yes' : 'no'\r\n \"\r\n >\r\n <div class=\"form-label\">\r\n <span>{{ field.label }}</span>\r\n <ejs-tooltip\r\n class=\"form-tooltip\"\r\n cssClass=\"rs-drawer-tooltip\"\r\n *ngIf=\"field.tooltip\"\r\n position=\"RightCenter\"\r\n [content]=\"field.tooltip\"\r\n >\r\n <span class=\"tooltip-icon\"></span>\r\n </ejs-tooltip>\r\n </div>\r\n <div class=\"form-content\">\r\n <!-- Radio -->\r\n <rs-radio-group\r\n *ngIf=\"field.fieldFormType === 'Radio'\"\r\n [value]=\"form[field.formKey]\"\r\n [dataSource]=\"optionsMap[field.optionKey]\"\r\n [fields]=\"getOptionFields(field)\"\r\n [disabled]=\"getDisabled(field)\"\r\n [error]=\"fieldValidMap[field.formKey] === false\"\r\n (valueChange)=\"onChange($event, field)\"\r\n ></rs-radio-group>\r\n <!-- Checkbox -->\r\n <rs-checkbox-group\r\n *ngIf=\"field.fieldFormType === 'Checkbox'\"\r\n [value]=\"form[field.formKey]\"\r\n [dataSource]=\"optionsMap[field.optionKey]\"\r\n [fields]=\"getOptionFields(field)\"\r\n [disabled]=\"getDisabled(field)\"\r\n [error]=\"fieldValidMap[field.formKey] === false\"\r\n (valueChange)=\"onChange($event, field)\"\r\n ></rs-checkbox-group>\r\n <!-- Switch -->\r\n <rs-switch-input\r\n *ngIf=\"field.fieldFormType === 'Switch'\"\r\n [value]=\"form[field.formKey]\"\r\n [disabled]=\"getDisabled(field)\"\r\n (valueChange)=\"onChange($event, field)\"\r\n ></rs-switch-input>\r\n <!-- Input -->\r\n <input\r\n class=\"e-input\"\r\n *ngIf=\"\r\n field.fieldFormType === 'Text' ||\r\n field.fieldFormType === 'Email'\r\n \"\r\n [value]=\"form[field.formKey]\"\r\n [disabled]=\"getDisabled(field)\"\r\n [required]=\"field.required\"\r\n [attr.maxlength]=\"field.maxlength\"\r\n [attr.minlength]=\"field.minlength\"\r\n [class.error]=\"fieldValidMap[field.formKey] === false\"\r\n (input)=\"onInput($event.target.value, field)\"\r\n (change)=\"onChange($event.target.value, field)\"\r\n (focus)=\"onFocus(field)\"\r\n (blur)=\"onBlur(field)\"\r\n autocomplete=\"off\"\r\n />\r\n <!-- Textarea -->\r\n <textarea\r\n class=\"e-input\"\r\n *ngIf=\"field.fieldFormType === 'Textarea'\"\r\n [value]=\"form[field.formKey]\"\r\n [disabled]=\"getDisabled(field)\"\r\n [required]=\"field.required\"\r\n [attr.maxlength]=\"field.maxlength\"\r\n [attr.minlength]=\"field.minlength\"\r\n [class.error]=\"fieldValidMap[field.formKey] === false\"\r\n (input)=\"onInput($event.target.value, field)\"\r\n (change)=\"onChange($event.target.value, field)\"\r\n (focus)=\"onFocus(field)\"\r\n (blur)=\"onBlur(field)\"\r\n autocomplete=\"off\"\r\n rows=\"3\"\r\n ></textarea>\r\n <!-- Number Input -->\r\n <ejs-numerictextbox\r\n *ngIf=\"field.fieldFormType === 'Number'\"\r\n [value]=\"form[field.formKey]\"\r\n [max]=\"field.max\"\r\n [min]=\"field.min\"\r\n [format]=\"field.format\"\r\n [enabled]=\"!getDisabled(field)\"\r\n [class.error]=\"fieldValidMap[field.formKey] === false\"\r\n (change)=\"$event.isInteracted && onChange($event.value, field)\"\r\n (focus)=\"onFocus(field)\"\r\n (blur)=\"onBlur(field)\"\r\n ></ejs-numerictextbox>\r\n <!-- Tags Input -->\r\n <rs-tag-input\r\n *ngIf=\"field.fieldFormType === 'Tags'\"\r\n [value]=\"form[field.formKey]\"\r\n [fields]=\"getOptionFields(field)\"\r\n [inputMaxlength]=\"field.maxlength\"\r\n [inputMinlength]=\"field.minlength\"\r\n [disabled]=\"getDisabled(field)\"\r\n [error]=\"fieldValidMap[field.formKey] === false\"\r\n (valueChange)=\"onChange($event, field)\"\r\n (focus)=\"onFocus(field)\"\r\n (blur)=\"onBlur(field)\"\r\n ></rs-tag-input>\r\n <!-- AutoComplete -->\r\n <ejs-autocomplete\r\n *ngIf=\"field.fieldFormType === 'AutoComplete'\"\r\n [value]=\"form[field.formKey]\"\r\n [dataSource]=\"optionsMap[field.optionKey]\"\r\n [fields]=\"getOptionFields(field)\"\r\n [enabled]=\"!getDisabled(field)\"\r\n [class.error]=\"fieldValidMap[field.formKey] === false\"\r\n (filtering)=\"onFiltering($event, field)\"\r\n (change)=\"$event.isInteracted && onChange($event.value, field)\"\r\n (focus)=\"onFocus(field)\"\r\n (blur)=\"onBlur(field)\"\r\n ></ejs-autocomplete>\r\n <!-- Dropdown -->\r\n <ejs-dropdownlist\r\n *ngIf=\"field.fieldFormType === 'Dropdown'\"\r\n [value]=\"form[field.formKey]\"\r\n [dataSource]=\"optionsMap[field.optionKey]\"\r\n [fields]=\"getOptionFields(field)\"\r\n [allowFiltering]=\"\r\n optionsMap[field.optionKey]?.length >= showFilterNumber\r\n \"\r\n [showClearButton]=\"true\"\r\n [enabled]=\"!getDisabled(field)\"\r\n [class.error]=\"fieldValidMap[field.formKey] === false\"\r\n (filtering)=\"onFiltering($event, field)\"\r\n (change)=\"$event.isInteracted && onChange($event.value, field)\"\r\n (focus)=\"onFocus(field)\"\r\n (blur)=\"onBlur(field)\"\r\n ></ejs-dropdownlist>\r\n <!-- MultiSelect -->\r\n <ejs-multiselect\r\n *ngIf=\"field.fieldFormType === 'MultiSelect'\"\r\n mode=\"CheckBox\"\r\n [value]=\"form[field.formKey]\"\r\n [dataSource]=\"optionsMap[field.optionKey]\"\r\n [fields]=\"getOptionFields(field)\"\r\n [allowFiltering]=\"\r\n optionsMap[field.optionKey]?.length >= showFilterNumber\r\n \"\r\n [showDropDownIcon]=\"true\"\r\n [enabled]=\"!getDisabled(field)\"\r\n [class.error]=\"fieldValidMap[field.formKey] === false\"\r\n (filtering)=\"onFiltering($event, field)\"\r\n (change)=\"$event.isInteracted && onChange($event.value, field)\"\r\n (focus)=\"onFocus(field)\"\r\n (blur)=\"onBlur(field)\"\r\n >\r\n </ejs-multiselect>\r\n <!-- Datepicker -->\r\n <ejs-datepicker\r\n *ngIf=\"field.fieldFormType === 'Datepicker'\"\r\n [value]=\"form[field.formKey]\"\r\n [format]=\"field.format || 'dd-MMM-yyyy'\"\r\n [enabled]=\"!getDisabled(field)\"\r\n [class.error]=\"fieldValidMap[field.formKey] === false\"\r\n (change)=\"$event.isInteracted && onChange($event.value, field)\"\r\n (focus)=\"onFocus(field)\"\r\n (blur)=\"onBlur(field)\"\r\n ></ejs-datepicker>\r\n <ng-template\r\n #customTemplateContainer\r\n *ngIf=\"field.fieldFormType === 'Custom'\"\r\n ></ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"section-form\" *ngIf=\"section.customKey\">\r\n <ng-template #customSectionContainer></ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"sections.length > 1 && showAnchor\" class=\"anchor-container\">\r\n <div\r\n class=\"anchor-item\"\r\n *ngFor=\"let section of sections; let index = index\"\r\n [style.display]=\"section.title ? 'block' : 'none'\"\r\n [attr.data-active]=\"scrollIndex === index ? 'yes' : 'no'\"\r\n [attr.data-content]=\"section.title\"\r\n (click)=\"onClickAnchor(index)\"\r\n ></div>\r\n </div>\r\n</div>\r\n",
|
|
549
|
+
providers: [DatePipe],
|
|
550
|
+
styles: [":host{display:block;margin-top:16px}.rs-drawer-form-container{display:flex;flex-flow:row nowrap;align-items:flex-start;gap:32px}.rs-drawer-form-container .section-container{flex:auto;display:flex;flex-flow:column nowrap;max-width:1576px}.rs-drawer-form-container .section-item{position:relative}.rs-drawer-form-container .section-item:not(:first-child){border-top:1px solid #eaedf0}.rs-drawer-form-container .section-expand-checkbox{display:block;width:100%;height:28px;-webkit-appearance:none;-moz-appearance:none;appearance:none;cursor:pointer;position:absolute;top:0;left:0}.rs-drawer-form-container .section-expand-checkbox:checked+.section-title::before{transform:rotate(-90deg)}.rs-drawer-form-container .section-expand-checkbox:checked+.section-title+.section-form{max-height:0;overflow:hidden}.rs-drawer-form-container .section-title{padding:6px 0;margin-bottom:12px;color:#44566c;font-family:Arial;font-size:13px;font-style:normal;font-weight:700;line-height:16px;display:flex;flex-flow:row nowrap;align-items:center;pointer-events:none}.rs-drawer-form-container .section-title::before{content:url(../../assets/img/down-arrow.svg);display:block;height:16px;width:16px;margin-right:8px}.rs-drawer-form-container .section-form{display:flex;flex-flow:row wrap;justify-content:space-between;gap:12px 56px;max-width:1576px;padding:0 24px;margin-bottom:20px}.rs-drawer-form-container .section-form .form-item{min-height:28px;min-width:400px;max-width:700px;width:calc((100% - 56px)/ 2);display:flex;flex-flow:row nowrap;justify-content:flex-start;align-items:flex-start}.rs-drawer-form-container .section-form .form-item[data-required=yes] .form-label>span:first-child::after{content:\"*\"}.rs-drawer-form-container .section-form .form-item .form-label{flex:none;width:144px;height:28px;margin-right:16px;color:#43566c;font-family:Arial;font-size:12px;font-style:normal;font-weight:400;line-height:14px;display:flex;flex-flow:row nowrap;align-items:center}.rs-drawer-form-container .section-form .form-item .form-label .form-tooltip{margin-left:4px}.rs-drawer-form-container .section-form .form-item .form-label .form-tooltip .tooltip-icon::before{content:\" \";display:block;width:14px;height:14px;background-image:url(../../assets/img/tooltip-icon.svg);background-size:contain;cursor:pointer}.rs-drawer-form-container .section-form .form-item .form-content{flex:auto}@media (max-width:1420px){.rs-drawer-form-container .section-form .form-item{width:100%}}.rs-drawer-form-container .anchor-container{flex:none;display:flex;flex-flow:column nowrap;gap:4px;min-width:120px;height:auto;position:-webkit-sticky;position:sticky;top:56px}.rs-drawer-form-container .anchor-item{min-width:120px;padding:4px 12px;border-left:1px solid #eaedf0;cursor:pointer;color:#44566c;font-family:Arial;font-size:11px;font-style:normal;font-weight:400;line-height:16px;position:relative}.rs-drawer-form-container .anchor-item::before{content:attr(data-content);color:#44566c;font-weight:400;position:absolute;left:12px}.rs-drawer-form-container .anchor-item::after{content:attr(data-content);visibility:hidden;color:#1364b3;font-weight:700}.rs-drawer-form-container .anchor-item[data-active=yes]{border-color:#1f7bff}.rs-drawer-form-container .anchor-item[data-active=yes]::before{visibility:hidden}.rs-drawer-form-container .anchor-item[data-active=yes]::after{visibility:visible}.rs-drawer-tooltip.e-tooltip-wrap{border:none;background-color:#44566c}.rs-drawer-tooltip.e-tooltip-wrap .e-arrow-tip{height:4px;visibility:hidden}"]
|
|
551
|
+
}] }
|
|
552
|
+
];
|
|
553
|
+
/** @nocollapse */
|
|
554
|
+
DrawerFormComponent.ctorParameters = function () { return [
|
|
555
|
+
{ type: DatePipe },
|
|
556
|
+
{ type: ChangeDetectorRef }
|
|
557
|
+
]; };
|
|
558
|
+
DrawerFormComponent.propDecorators = {
|
|
559
|
+
sections: [{ type: Input, args: ["sections",] }],
|
|
560
|
+
optionsMap: [{ type: Input, args: ["optionsMap",] }],
|
|
561
|
+
customTemplate: [{ type: Input, args: ["customTemplate",] }],
|
|
562
|
+
customSectionTemplate: [{ type: Input, args: ["customSectionTemplate",] }],
|
|
563
|
+
formDisabled: [{ type: Input, args: ["disabled",] }],
|
|
564
|
+
showAnchor: [{ type: Input, args: ["showAnchor",] }],
|
|
565
|
+
optionFields: [{ type: Input, args: ["optionFields",] }],
|
|
566
|
+
showFilterNumber: [{ type: Input, args: ["showFilterNumber",] }],
|
|
567
|
+
form: [{ type: Input, args: ["form",] }],
|
|
568
|
+
formChange: [{ type: Output, args: ["formChange",] }],
|
|
569
|
+
fieldChange: [{ type: Output, args: ["fieldChange",] }],
|
|
570
|
+
rootEl: [{ type: ViewChild, args: ["drawerFormEl", { static: false },] }],
|
|
571
|
+
containers: [{ type: ViewChildren, args: ["customTemplateContainer", { read: ViewContainerRef },] }],
|
|
572
|
+
sectionContainers: [{ type: ViewChildren, args: ["customSectionContainer", { read: ViewContainerRef },] }],
|
|
573
|
+
sectionEls: [{ type: ViewChildren, args: ["sectionEl",] }]
|
|
574
|
+
};
|
|
575
|
+
return DrawerFormComponent;
|
|
576
|
+
}());
|
|
577
|
+
export { DrawerFormComponent };
|
|
578
|
+
if (false) {
|
|
579
|
+
/** @type {?} */
|
|
580
|
+
DrawerFormComponent.prototype.sections;
|
|
581
|
+
/** @type {?} */
|
|
582
|
+
DrawerFormComponent.prototype.optionsMap;
|
|
583
|
+
/** @type {?} */
|
|
584
|
+
DrawerFormComponent.prototype.customTemplate;
|
|
585
|
+
/** @type {?} */
|
|
586
|
+
DrawerFormComponent.prototype.customSectionTemplate;
|
|
587
|
+
/** @type {?} */
|
|
588
|
+
DrawerFormComponent.prototype.formDisabled;
|
|
589
|
+
/** @type {?} */
|
|
590
|
+
DrawerFormComponent.prototype.showAnchor;
|
|
591
|
+
/** @type {?} */
|
|
592
|
+
DrawerFormComponent.prototype.optionFields;
|
|
593
|
+
/** @type {?} */
|
|
594
|
+
DrawerFormComponent.prototype.showFilterNumber;
|
|
595
|
+
/** @type {?} */
|
|
596
|
+
DrawerFormComponent.prototype.form;
|
|
597
|
+
/** @type {?} */
|
|
598
|
+
DrawerFormComponent.prototype.formChange;
|
|
599
|
+
/** @type {?} */
|
|
600
|
+
DrawerFormComponent.prototype.fieldChange;
|
|
601
|
+
/** @type {?} */
|
|
602
|
+
DrawerFormComponent.prototype.rootEl;
|
|
603
|
+
/**
|
|
604
|
+
* @type {?}
|
|
605
|
+
* @private
|
|
606
|
+
*/
|
|
607
|
+
DrawerFormComponent.prototype.containers;
|
|
608
|
+
/**
|
|
609
|
+
* @type {?}
|
|
610
|
+
* @private
|
|
611
|
+
*/
|
|
612
|
+
DrawerFormComponent.prototype.sectionContainers;
|
|
613
|
+
/** @type {?} */
|
|
614
|
+
DrawerFormComponent.prototype.filterOptionsMap;
|
|
615
|
+
/** @type {?} */
|
|
616
|
+
DrawerFormComponent.prototype.fieldValidMap;
|
|
617
|
+
/** @type {?} */
|
|
618
|
+
DrawerFormComponent.prototype.sectionEls;
|
|
619
|
+
/** @type {?} */
|
|
620
|
+
DrawerFormComponent.prototype.scrollIndex;
|
|
621
|
+
/** @type {?} */
|
|
622
|
+
DrawerFormComponent.prototype.isClickAnchor;
|
|
623
|
+
/**
|
|
624
|
+
* @type {?}
|
|
625
|
+
* @private
|
|
626
|
+
*/
|
|
627
|
+
DrawerFormComponent.prototype.datePipe;
|
|
628
|
+
/**
|
|
629
|
+
* @type {?}
|
|
630
|
+
* @private
|
|
631
|
+
*/
|
|
632
|
+
DrawerFormComponent.prototype.ref;
|
|
633
|
+
}
|
|
634
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhd2VyLWZvcm0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vcmFpc2UtY29tbW9uLWxpYi8iLCJzb3VyY2VzIjpbImxpYi9mb3JtL2RyYXdlci1mb3JtL2RyYXdlci1mb3JtLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxPQUFPLEVBRUwsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEVBQ04sU0FBUyxFQUVULFdBQVcsRUFDWCxTQUFTLEVBQ1QsWUFBWSxFQUNaLGdCQUFnQixHQUNqQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRTdDLE9BQU8sRUFBRSxZQUFZLEVBQTBCLE1BQU0sYUFBYSxDQUFDO0FBRW5FO0lBeUNFLDZCQUFvQixRQUFrQixFQUFVLEdBQXNCO1FBQWxELGFBQVEsR0FBUixRQUFRLENBQVU7UUFBVSxRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQWxDbkQsYUFBUSxHQUFrQixFQUFFLENBQUM7UUFDM0IsZUFBVSxHQUEwQixFQUFFLENBQUM7UUFNekMsaUJBQVksR0FBRyxLQUFLLENBQUM7UUFDbkIsZUFBVSxHQUFHLElBQUksQ0FBQztRQUNoQixpQkFBWSxHQUFHO1lBQ3BDLElBQUksRUFBRSxNQUFNO1lBQ1osS0FBSyxFQUFFLE1BQU07WUFDYixRQUFRLEVBQUUsVUFBVTtZQUNwQixPQUFPLEVBQUUsSUFBSTtTQUNkLENBQUM7UUFDeUIscUJBQWdCLEdBQUcsRUFBRSxDQUFDO1FBRWxDLFNBQUksR0FBd0IsRUFBRSxDQUFDO1FBQ3hCLGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBdUIsQ0FBQztRQUNwRCxnQkFBVyxHQUFHLElBQUksWUFBWSxFQUdqRCxDQUFDO1FBU0wscUJBQWdCLEdBQTBC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Q0FBNEM7O0lBd041Qyx5Q0FDa0Q7O0lBQ2xELDBDQUFnQjs7SUFDaEIsNENBQXNCOzs7OztJQXpOVix1Q0FBMEI7Ozs7O0lBQUUsa0NBQThCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBBZnRlclZpZXdJbml0LFxyXG4gIENoYW5nZURldGVjdG9yUmVmLFxyXG4gIENvbXBvbmVudCxcclxuICBFbGVtZW50UmVmLFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBJbnB1dCxcclxuICBPbkNoYW5nZXMsXHJcbiAgT25Jbml0LFxyXG4gIE91dHB1dCxcclxuICBRdWVyeUxpc3QsXHJcbiAgU2ltcGxlQ2hhbmdlcyxcclxuICBUZW1wbGF0ZVJlZixcclxuICBWaWV3Q2hpbGQsXHJcbiAgVmlld0NoaWxkcmVuLFxyXG4gIFZpZXdDb250YWluZXJSZWYsXHJcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgRGF0ZVBpcGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uXCI7XHJcbmltcG9ydCB7IFF1ZXJ5IH0gZnJvbSBcIkBzeW5jZnVzaW9uL2VqMi1kYXRhXCI7XHJcbmltcG9ydCB7IEZpbHRlcmluZ0V2ZW50QXJncyB9IGZyb20gXCJAc3luY2Z1c2lvbi9lajItYW5ndWxhci1kcm9wZG93bnNcIjtcclxuaW1wb3J0IHsgRW1haWxQYXR0ZXJuLCBGaWVsZEl0ZW0sIFNlY3Rpb25JdGVtIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogXCJycy1kcmF3ZXItZm9ybVwiLFxyXG4gIHRlbXBsYXRlVXJsOiBcIi4vZHJhd2VyLWZvcm0uY29tcG9uZW50Lmh0bWxcIixcclxuICBzdHlsZVVybHM6IFtcIi4vZHJhd2VyLWZvcm0uY29tcG9uZW50LnNjc3NcIl0sXHJcbiAgcHJvdmlkZXJzOiBbRGF0ZVBpcGVdLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgRHJhd2VyRm9ybUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0IHtcclxuICBASW5wdXQoXCJzZWN0aW9uc1wiKSBzZWN0aW9uczogU2VjdGlvbkl0ZW1bXSA9IFtdO1xyXG4gIEBJbnB1dChcIm9wdGlvbnNNYXBcIikgb3B0aW9uc01hcDogUmVjb3JkPHN0cmluZywgYW55W10+ID0ge307XHJcblxyXG4gIEBJbnB1dChcImN1c3RvbVRlbXBsYXRlXCIpIGN1c3RvbVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIEBJbnB1dChcImN1c3RvbVNlY3Rpb25UZW1wbGF0ZVwiKVxyXG4gIGN1c3RvbVNlY3Rpb25UZW1wbGF0ZTogUmVjb3JkPHN0cmluZywgVGVtcGxhdGVSZWY8YW55Pj47XHJcblxyXG4gIEBJbnB1dChcImRpc2FibGVkXCIpIGZvcm1EaXNhYmxlZCA9IGZhbHNlO1xyXG4gIEBJbnB1dChcInNob3dBbmNob3JcIikgc2hvd0FuY2hvciA9IHRydWU7XHJcbiAgQElucHV0KFwib3B0aW9uRmllbGRzXCIpIG9wdGlvbkZpZWxkcyA9IHtcclxuICAgIHRleHQ6IFwidGV4dFwiLFxyXG4gICAgdmFsdWU6IFwiY29kZVwiLFxyXG4gICAgZGlzYWJsZWQ6IFwiZGlzYWJsZWRcIixcclxuICAgIGdyb3VwQnk6IG51bGwsXHJcbiAgfTtcclxuICBASW5wdXQoXCJzaG93RmlsdGVyTnVtYmVyXCIpIHNob3dGaWx0ZXJOdW1iZXIgPSAxMDtcclxuXHJcbiAgQElucHV0KFwiZm9ybVwiKSBmb3JtOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XHJcbiAgQE91dHB1dChcImZvcm1DaGFuZ2VcIikgZm9ybUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8UmVjb3JkPHN0cmluZywgYW55Pj4oKTtcclxuICBAT3V0cHV0KFwiZmllbGRDaGFuZ2VcIikgZmllbGRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHtcclxuICAgIGZpZWxkOiBGaWVsZEl0ZW07XHJcbiAgICB2YWx1ZTogYW55O1xyXG4gIH0+KCk7XHJcblxyXG4gIEBWaWV3Q2hpbGQoXCJkcmF3ZXJGb3JtRWxcIiwgeyBzdGF0aWM6IGZhbHNlIH0pXHJcbiAgcm9vdEVsOiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PjtcclxuICBAVmlld0NoaWxkcmVuKFwiY3VzdG9tVGVtcGxhdGVDb250YWluZXJcIiwgeyByZWFkOiBWaWV3Q29udGFpbmVyUmVmIH0pXHJcbiAgcHJpdmF0ZSBjb250YWluZXJzOiBRdWVyeUxpc3Q8Vmlld0NvbnRhaW5lclJlZj47XHJcbiAgQFZpZXdDaGlsZHJlbihcImN1c3RvbVNlY3Rpb25Db250YWluZXJcIiwgeyByZWFkOiBWaWV3Q29udGFpbmVyUmVmIH0pXHJcbiAgcHJpdmF0ZSBzZWN0aW9uQ29udGFpbmVyczogUXVlcnlMaXN0PFZpZXdDb250YWluZXJSZWY+O1xyXG5cclxuICBmaWx0ZXJPcHRpb25zTWFwOiBSZWNvcmQ8c3RyaW5nLCBhbnlbXT4gPSB7fTtcclxuICBmaWVsZFZhbGlkTWFwOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPiA9IHt9O1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGRhdGVQaXBlOiBEYXRlUGlwZSwgcHJpdmF0ZSByZWY6IENoYW5nZURldGVjdG9yUmVmKSB7fVxyXG5cclxuICBuZ09uSW5pdCgpIHt9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcclxuICAgIGlmIChjaGFuZ2VzLnNlY3Rpb25zKSB7XHJcbiAgICAgIHRoaXMuZm9ybWF0Rm9ybShjaGFuZ2VzLnNlY3Rpb25zLmN1cnJlbnRWYWx1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgICB0aGlzLmN1c3RvbVRlbXBsYXRlUmVuZGVyKHRoaXMuY29udGFpbmVycyk7XHJcbiAgICB0aGlzLmN1c3RvbVNlY3Rpb25SZW5kZXIodGhpcy5zZWN0aW9uQ29udGFpbmVycyk7XHJcbiAgICB0aGlzLmNvbnRhaW5lcnMuY2hhbmdlcy5zdWJzY3JpYmUoXHJcbiAgICAgIChjb250YWluZXJzOiBRdWVyeUxpc3Q8Vmlld0NvbnRhaW5lclJlZj4pID0+IHtcclxuICAgICAgICB0aGlzLmNvbnRhaW5lcnMgPSBjb250YWluZXJzO1xyXG4gICAgICAgIHRoaXMuY3VzdG9tVGVtcGxhdGVSZW5kZXIoY29udGFpbmVycyk7XHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgICB0aGlzLnNlY3Rpb25Db250YWluZXJzLmNoYW5nZXMuc3Vic2NyaWJlKFxyXG4gICAgICAoY29udGFpbmVyczogUXVlcnlMaXN0PFZpZXdDb250YWluZXJSZWY+KSA9PiB7XHJcbiAgICAgICAgdGhpcy5zZWN0aW9uQ29udGFpbmVycyA9IGNvbnRhaW5lcnM7XHJcbiAgICAgICAgdGhpcy5jdXN0b21TZWN0aW9uUmVuZGVyKGNvbnRhaW5lcnMpO1xyXG4gICAgICB9XHJcbiAgICApO1xyXG4gICAgaWYgKHRoaXMuc2hvd0FuY2hvcikge1xyXG4gICAgICB0aGlzLmluaXRBbmNob3JTY3JvbGxIYW5kbGVyKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjdXN0b21UZW1wbGF0ZVJlbmRlcihjb250YWluZXJzOiBRdWVyeUxpc3Q8Vmlld0NvbnRhaW5lclJlZj4pIHtcclxuICAgIGlmICh0aGlzLmN1c3RvbVRlbXBsYXRlICYmIGNvbnRhaW5lcnMubGVuZ3RoID4gMCkge1xyXG4gICAgICBjb25zdCBjdXN0b21GaWVsZHMgPSBbXTtcclxuICAgICAgdGhpcy5zZWN0aW9ucy5mb3JFYWNoKChzZWN0aW9uKSA9PiB7XHJcbiAgICAgICAgc2VjdGlvbi5maWVsZHMuZm9yRWFjaCgoZmllbGQpID0+IHtcclxuICAgICAgICAgIGlmIChmaWVsZC5maWVsZEZvcm1UeXBlID09PSBcIkN1c3RvbVwiKSB7XHJcbiAgICAgICAgICAgIGN1c3RvbUZpZWxkcy5wdXNoKGZpZWxkKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcbiAgICAgIGNvbnRhaW5lcnMuZm9yRWFjaCgoY29udGFpbmVyLCBpbmRleCkgPT4ge1xyXG4gICAgICAgIGNvbnRhaW5lci5jbGVhcigpO1xyXG4gICAgICAgIGNvbnRhaW5lci5jcmVhdGVFbWJlZGRlZFZpZXcodGhpcy5jdXN0b21UZW1wbGF0ZSwge1xyXG4gICAgICAgICAgJGltcGxpY2l0OiBjdXN0b21GaWVsZHNbaW5kZXhdLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGN1c3RvbVNlY3Rpb25SZW5kZXIoY29udGFpbmVyczogUXVlcnlMaXN0PFZpZXdDb250YWluZXJSZWY+KSB7XHJcbiAgICBpZiAodGhpcy5jdXN0b21TZWN0aW9uVGVtcGxhdGUgJiYgY29udGFpbmVycy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGNvbnN0IGN1c3RvbVNlY3Rpb25zID0gdGhpcy5zZWN0aW9ucy5maWx0ZXIoXHJcbiAgICAgICAgKHNlY3Rpb24pID0+IHNlY3Rpb24uY3VzdG9tS2V5XHJcbiAgICAgICk7XHJcbiAgICAgIGNvbnRhaW5lcnMuZm9yRWFjaCgoY29udGFpbmVyLCBpbmRleCkgPT4ge1xyXG4gICAgICAgIGNvbnRhaW5lci5jbGVhcigpO1xyXG4gICAgICAgIGNvbnN0IGN1c3RvbUtleSA9IGN1c3RvbVNlY3Rpb25zW2luZGV4XS5jdXN0b21LZXk7XHJcbiAgICAgICAgY29udGFpbmVyLmNyZWF0ZUVtYmVkZGVkVmlldyh0aGlzLmN1c3RvbVNlY3Rpb25UZW1wbGF0ZVtjdXN0b21LZXldLCB7XHJcbiAgICAgICAgICAkaW1wbGljaXQ6IGN1c3RvbVNlY3Rpb25zW2luZGV4XSxcclxuICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBmb3JtYXRGb3JtKHNlY3Rpb25zOiBTZWN0aW9uSXRlbVtdKSB7XHJcbiAgICBzZWN0aW9ucy5mb3JFYWNoKChzZWN0aW9uOiBTZWN0aW9uSXRlbSkgPT4ge1xyXG4gICAgICBzZWN0aW9uLmZpZWxkcy5mb3JFYWNoKChmaWVsZCkgPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLmZvcm1bZmllbGQuZm9ybUtleV0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgc3dpdGNoIChmaWVsZC5maWVsZEZvcm1UeXBlKSB7XHJcbiAgICAgICAgICAgIGNhc2UgXCJUZXh0XCI6XHJcbiAgICAgICAgICAgIGNhc2UgXCJFbWFpbFwiOlxyXG4gICAgICAgICAgICBjYXNlIFwiVGV4dGFyZWFcIjpcclxuICAgICAgICAgICAgICB0aGlzLmZvcm1bZmllbGQuZm9ybUtleV0gPSBcIlwiO1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSBcIlRhZ3NcIjpcclxuICAgICAgICAgICAgY2FzZSBcIkNoZWNrYm94XCI6XHJcbiAgICAgICAgICAgIGNhc2UgXCJNdWx0aVNlbGVjdFwiOlxyXG4gICAgICAgICAgICAgIHRoaXMuZm9ybVtmaWVsZC5mb3JtS2V5XSA9IFtdO1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSBcIlN3aXRjaFwiOlxyXG4gICAgICAgICAgICAgIHRoaXMuZm9ybVtmaWVsZC5mb3JtS2V5XSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICB0aGlzLmZvcm1bZmllbGQuZm9ybUtleV0gPSBudWxsO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8vIOihqOWNleaPkOS6pOWJjeS8muinpuWPkei/meS4quWHveaVsFxyXG4gIHVwZGF0ZUZvcm0odmFsdWU6IGFueSwgZmllbGQ6IEZpZWxkSXRlbSkge1xyXG4gICAgY29uc3QgbmV3Rm9ybSA9IHtcclxuICAgICAgLi4udGhpcy5mb3JtLFxyXG4gICAgICBbZmllbGQuZm9ybUtleV06IHZhbHVlLFxyXG4gICAgfTtcclxuICAgIC8vIOS/ruWkjemUmeivr+aPkOekuuaYvuekuiBidWfvvIzkuI3orr7nva7kuIDkuIvmnInmpoLnjofmi7/kuI3liLDmnIDmlrDnmoTlgLxcclxuICAgIHRoaXMuZm9ybSA9IG5ld0Zvcm07XHJcbiAgICB0aGlzLmZpZWxkQ2hhbmdlLmVtaXQoeyBmaWVsZCwgdmFsdWUgfSk7XHJcbiAgICB0aGlzLmZvcm1DaGFuZ2UuZW1pdChuZXdGb3JtKTtcclxuICB9XHJcblxyXG4gIGZvcm1JdGVtVmFsaWRhdG9yKGZpZWxkOiBGaWVsZEl0ZW0sIGlzQXV0byA9IGZhbHNlKSB7XHJcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZm9ybVtmaWVsZC5mb3JtS2V5XTtcclxuICAgIGxldCBpc1ZhbGlkID0gdHJ1ZTtcclxuICAgIGlmIChmaWVsZC5yZXF1aXJlZCkge1xyXG4gICAgICBpc1ZhbGlkID0gQXJyYXkuaXNBcnJheSh2YWx1ZSlcclxuICAgICAgICA/IHZhbHVlLmxlbmd0aCAhPT0gMFxyXG4gICAgICAgIDogIVtudWxsLCB1bmRlZmluZWQsIFwiXCJdLmluY2x1ZGVzKHZhbHVlKTtcclxuICAgIH1cclxuICAgIGlmIChpc1ZhbGlkICYmIGZpZWxkLmZpZWxkRm9ybVR5cGUgPT09IFwiRW1haWxcIiAmJiB2YWx1ZSkge1xyXG4gICAgICBpc1ZhbGlkID0gRW1haWxQYXR0ZXJuLnRlc3QodmFsdWUpO1xyXG4gICAgfVxyXG4gICAgaWYgKGlzVmFsaWQgJiYgZmllbGQubWF4bGVuZ3RoKSB7XHJcbiAgICAgIGlzVmFsaWQgPSBTdHJpbmcodmFsdWUpLmxlbmd0aCA8PSBmaWVsZC5tYXhsZW5ndGg7XHJcbiAgICB9XHJcbiAgICBpZiAoaXNWYWxpZCAmJiBmaWVsZC5taW5sZW5ndGgpIHtcclxuICAgICAgaXNWYWxpZCA9IFN0cmluZyh2YWx1ZSkubGVuZ3RoID49IGZpZWxkLm1pbmxlbmd0aDtcclxuICAgIH1cclxuICAgIGlmIChpc1ZhbGlkICYmIGZpZWxkLm1heCkge1xyXG4gICAgICBpc1ZhbGlkID0gdmFsdWUgPD0gZmllbGQubWF4O1xyXG4gICAgfVxyXG4gICAgaWYgKGlzVmFsaWQgJiYgZmllbGQubWluKSB7XHJcbiAgICAgIGlzVmFsaWQgPSB2YWx1ZSA+PSBmaWVsZC5taW47XHJcbiAgICB9XHJcbiAgICBpZiAoaXNWYWxpZCAmJiB0eXBlb2YgZmllbGQudmFsaWRhdG9yID09PSBcImZ1bmN0aW9uXCIpIHtcclxuICAgICAgaXNWYWxpZCA9IGZpZWxkLnZhbGlkYXRvci5jYWxsKG51bGwsIHZhbHVlLCBmaWVsZCk7XHJcbiAgICB9XHJcbiAgICBpZiAoIWlzQXV0bykge1xyXG4gICAgICB0aGlzLmZpZWxkVmFsaWRNYXBbZmllbGQuZm9ybUtleV0gPSBpc1ZhbGlkO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGlzVmFsaWQ7XHJcbiAgfVxyXG5cclxuICBwcmVDaGVja0Zvcm1Jc1ZhbGlkKCkge1xyXG4gICAgbGV0IGZvcm1Jc1ZhbGlkID0gdHJ1ZTtcclxuICAgIHRoaXMuc2VjdGlvbnMuZm9yRWFjaCgoc2VjdGlvbikgPT5cclxuICAgICAgc2VjdGlvbi5maWVsZHMuZm9yRWFjaCgoZmllbGQpID0+IHtcclxuICAgICAgICBmb3JtSXNWYWxpZCA9IHRoaXMuZm9ybUl0ZW1WYWxpZGF0b3IoZmllbGQpICYmIGZvcm1Jc1ZhbGlkO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICAgIHJldHVybiBmb3JtSXNWYWxpZDtcclxuICB9XHJcblxyXG4gIGdldCBmb3JtSXNWYWxpZCgpIHtcclxuICAgIHJldHVybiB0aGlzLnNlY3Rpb25zLmV2ZXJ5KChzZWN0aW9uKSA9PlxyXG4gICAgICBzZWN0aW9uLmZpZWxkcy5ldmVyeSgoZmllbGQpID0+IHRoaXMuZm9ybUl0ZW1WYWxpZGF0b3IoZmllbGQsIHRydWUpKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGdldEZpZWxkKGZvcm1LZXk6IHN0cmluZykge1xyXG4gICAgbGV0IGZpZWxkSXRlbTogRmllbGRJdGVtID0gbnVsbDtcclxuICAgIHRoaXMuc2VjdGlvbnMuZmluZCgoc2VjdGlvbikgPT4ge1xyXG4gICAgICBmaWVsZEl0ZW0gPSBzZWN0aW9uLmZpZWxkcy5maW5kKChmaWVsZCkgPT4gZmllbGQuZm9ybUtleSA9PT0gZm9ybUtleSk7XHJcbiAgICAgIHJldHVybiBmaWVsZEl0ZW07XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBmaWVsZEl0ZW07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNhbGxGdW5jdGlvbihmbjogRnVuY3Rpb24sIC4uLmFyZ3M6IGFueVtdKSB7XHJcbiAgICB0aGlzLmZvcm1JdGVtVmFsaWRhdG9yKGFyZ3NbMV0gfHwgYXJnc1swXSk7XHJcbiAgICBpZiAodHlwZW9mIGZuID09PSBcImZ1bmN0aW9uXCIpIHtcclxuICAgICAgZm4uYXBwbHkobnVsbCwgYXJncyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbklucHV0KHZhbHVlOiBzdHJpbmcsIGZpZWxkOiBGaWVsZEl0ZW0pIHtcclxuICAgIHRoaXMuY2FsbEZ1bmN0aW9uKGZpZWxkLm9uSW5wdXQsIHZhbHVlLCBmaWVsZCk7XHJcbiAgfVxyXG5cclxuICBvbkNoYW5nZSh2YWx1ZTogYW55LCBmaWVsZDogRmllbGRJdGVtKSB7XHJcbiAgICBpZiAoZmllbGQuZmllbGRGb3JtVHlwZSA9PT0gXCJEYXRlcGlja2VyXCIpIHtcclxuICAgICAgdmFsdWUgPSB0aGlzLmRhdGVQaXBlLnRyYW5zZm9ybSh2YWx1ZSwgXCJ5eXl5LU1NLWRkXCIpO1xyXG4gICAgfVxyXG4gICAgdGhpcy51cGRhdGVGb3JtKHZhbHVlLCBmaWVsZCk7XHJcbiAgICB0aGlzLmNhbGxGdW5jdGlvbihmaWVsZC5vbkNoYW5nZSwgdmFsdWUsIGZpZWxkKTtcclxuICB9XHJcblxyXG4gIG9uRm9jdXMoZmllbGQ6IEZpZWxkSXRlbSkge1xyXG4gICAgdGhpcy5jYWxsRnVuY3Rpb24oZmllbGQub25Gb2N1cywgZmllbGQpO1xyXG4gIH1cclxuXHJcbiAgb25CbHVyKGZpZWxkOiBGaWVsZEl0ZW0pIHtcclxuICAgIHRoaXMuY2FsbEZ1bmN0aW9uKGZpZWxkLm9uQmx1ciwgZmllbGQpO1xyXG4gIH1cclxuXHJcbiAgb25GaWx0ZXJpbmcoZXZlbnQ6IEZpbHRlcmluZ0V2ZW50QXJncywgZmllbGQ6IEZpZWxkSXRlbSkge1xyXG4gICAgY29uc3QgcXVlcnkgPSBuZXcgUXVlcnkoKTtcclxuICAgIGlmIChldmVudC50ZXh0KSB7XHJcbiAgICAgIHF1ZXJ5LndoZXJlKHRoaXMub3B0aW9uRmllbGRzLnRleHQsIFwiY29udGFpbnNcIiwgZXZlbnQudGV4dCwgdHJ1ZSk7XHJcbiAgICB9XHJcbiAgICBldmVudC51cGRhdGVEYXRhKHRoaXMub3B0aW9uc01hcFtmaWVsZC5vcHRpb25LZXldIHx8IFtdLCBxdWVyeSk7XHJcbiAgfVxyXG5cclxuICBnZXREaXNhYmxlZChmaWVsZDogRmllbGRJdGVtKSB7XHJcbiAgICBpZiAodGhpcy5mb3JtRGlzYWJsZWQpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICBpZiAodHlwZW9mIGZpZWxkLmRpc2FibGVkID09PSBcImZ1bmN0aW9uXCIpIHtcclxuICAgICAgcmV0dXJuIGZpZWxkLmRpc2FibGVkKCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmllbGQuZGlzYWJsZWQ7XHJcbiAgfVxyXG5cclxuICBnZXRPcHRpb25GaWVsZHMoZmllbGQ6IEZpZWxkSXRlbSkge1xyXG4gICAgaWYgKGZpZWxkLmZpZWxkRm9ybVR5cGUgPT09IFwiRHJvcGRvd25cIikge1xyXG4gICAgICByZXR1cm4geyAuLi50aGlzLm9wdGlvbkZpZWxkcywgZ3JvdXBCeTogZmllbGQuZ3JvdXBLZXkgfHwgbnVsbCB9O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9uRmllbGRzO1xyXG4gIH1cclxuXHJcbiAgQFZpZXdDaGlsZHJlbihcInNlY3Rpb25FbFwiKVxyXG4gIHNlY3Rpb25FbHM6IFF1ZXJ5TGlzdDxFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50Pj47XHJcbiAgc2Nyb2xsSW5kZXggPSAwO1xyXG4gIGlzQ2xpY2tBbmNob3IgPSBmYWxzZTtcclxuXHJcbiAgb25DbGlja0FuY2hvcihpbmRleDogbnVtYmVyKSB7XHJcbiAgICBjb25zdCBzZWN0aW9uSXRlbXMgPSB0aGlzLnNlY3Rpb25FbHMudG9BcnJheSgpO1xyXG4gICAgc2VjdGlvbkl0ZW1zW2luZGV4XS5uYXRpdmVFbGVtZW50LnNjcm9sbEludG9WaWV3KHRydWUpO1xyXG4gICAgdGhpcy5zY3JvbGxJbmRleCA9IGluZGV4O1xyXG4gICAgdGhpcy5pc0NsaWNrQW5jaG9yID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIGZpbmRTY3JvbGxWaWV3RWwoZWw6IEhUTUxFbGVtZW50KTogSFRNTEVsZW1lbnQge1xyXG4gICAgaWYgKGVsID09PSBkb2N1bWVudC5ib2R5KSB7XHJcbiAgICAgIHJldHVybiBlbDtcclxuICAgIH1cclxuICAgIGlmIChlbC5zY3JvbGxIZWlnaHQgJiYgZWwuc2Nyb2xsSGVpZ2h0ICE9PSBlbC5vZmZzZXRIZWlnaHQpIHtcclxuICAgICAgcmV0dXJuIGVsO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuZmluZFNjcm9sbFZpZXdFbChlbC5wYXJlbnRFbGVtZW50KTtcclxuICB9XHJcblxyXG4gIGluaXRBbmNob3JTY3JvbGxIYW5kbGVyKCkge1xyXG4gICAgY29uc3Qgc2Nyb2xsVmlld0VsID0gdGhpcy5maW5kU2Nyb2xsVmlld0VsKHRoaXMucm9vdEVsLm5hdGl2ZUVsZW1lbnQpO1xyXG4gICAgY29uc3Qgc2Nyb2xsSGVpZ2h0ID0gc2Nyb2xsVmlld0VsLnNjcm9sbEhlaWdodCAtIHNjcm9sbFZpZXdFbC5vZmZzZXRIZWlnaHQ7XHJcbiAgICBjb25zdCBzZWN0aW9uVmlld1JhdGlvID0gdGhpcy5zZWN0aW9uRWxzLnRvQXJyYXkoKS5tYXAoKHNlY3Rpb24pID0+IHtcclxuICAgICAgY29uc3QgcmF0aW8gPVxyXG4gICAgICAgIHNlY3Rpb24ubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHQgLyBzY3JvbGxWaWV3RWwuc2Nyb2xsSGVpZ2h0O1xyXG4gICAgICByZXR1cm4gc2Nyb2xsSGVpZ2h0ICogcmF0aW87XHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCBvblNjcm9sbCA9ICgpID0+IHtcclxuICAgICAgaWYgKHRoaXMuaXNDbGlja0FuY2hvcikge1xyXG4gICAgICAgIHRoaXMuaXNDbGlja0FuY2hvciA9IGZhbHNlO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBzY3JvbGxUb3AgPVxyXG4gICAgICAgIHNjcm9sbFZpZXdFbC5zY3JvbGxUb3AgPiBzY3JvbGxIZWlnaHRcclxuICAgICAgICAgID8gc2Nyb2xsSGVpZ2h0XHJcbiAgICAgICAgICA6IHNjcm9sbFZpZXdFbC5zY3JvbGxUb3A7XHJcbiAgICAgIGxldCByYWRpb1Njcm9sbEhlaWdodCA9IDA7XHJcbiAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBzZWN0aW9uVmlld1JhdGlvLmxlbmd0aDsgaW5kZXgrKykge1xyXG4gICAgICAgIHJhZGlvU2Nyb2xsSGVpZ2h0ICs9IHNlY3Rpb25WaWV3UmF0aW9baW5kZXhdO1xyXG4gICAgICAgIGlmIChyYWRpb1Njcm9sbEhlaWdodCA+PSBzY3JvbGxUb3ApIHtcclxuICAgICAgICAgIHRoaXMuc2Nyb2xsSW5kZXggPSBpbmRleDtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICB3aGlsZSAoXHJcbiAgICAgICAgdGhpcy5zZWN0aW9uc1t0aGlzLnNjcm9sbEluZGV4XSAmJlxyXG4gICAgICAgICF0aGlzLnNlY3Rpb25zW3RoaXMuc2Nyb2xsSW5kZXhdLnRpdGxlXHJcbiAgICAgICkge1xyXG4gICAgICAgIHRoaXMuc2Nyb2xsSW5kZXgrKztcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnJlZi5tYXJrRm9yQ2hlY2soKTtcclxuICAgIH07XHJcblxyXG4gICAgb25TY3JvbGwoKTtcclxuICAgIHNjcm9sbFZpZXdFbC5hZGRFdmVudExpc3RlbmVyKFwic2Nyb2xsXCIsIG9uU2Nyb2xsKTtcclxuICB9XHJcbn1cclxuIl19
|