@stemy/ngx-dynamic-form 10.2.33 → 12.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/bundles/stemy-ngx-dynamic-form.umd.js +1787 -1206
  2. package/bundles/stemy-ngx-dynamic-form.umd.js.map +1 -1
  3. package/esm2015/ngx-dynamic-form/common-types.js +527 -29
  4. package/esm2015/ngx-dynamic-form/components/base/dynamic-form-base.component.js +89 -0
  5. package/esm2015/ngx-dynamic-form/components/dynamic-form/dynamic-form.component.js +91 -0
  6. package/esm2015/ngx-dynamic-form/components/dynamic-form-file/dynamic-form-file.component.js +112 -0
  7. package/esm2015/ngx-dynamic-form/components/dynamic-form-group/dynamic-form-group.component.js +19 -0
  8. package/esm2015/ngx-dynamic-form/components/dynamic-form-input/dynamic-form-input.component.js +69 -0
  9. package/esm2015/ngx-dynamic-form/components/dynamic-form-model/dynamic-form-model.component.js +23 -0
  10. package/esm2015/ngx-dynamic-form/components/dynamic-form-select/dynamic-form-select.component.js +73 -0
  11. package/esm2015/ngx-dynamic-form/components/dynamic-form-static/dynamic-form-static.component.js +20 -0
  12. package/esm2015/ngx-dynamic-form/components/dynamic-forms/dynamic-forms.component.js +134 -0
  13. package/esm2015/ngx-dynamic-form/directives/async-submit.directive.js +6 -17
  14. package/esm2015/ngx-dynamic-form/directives/dynamic-form-control.directive.js +32 -0
  15. package/esm2015/ngx-dynamic-form/directives/dynamic-form-group.directive.js +40 -0
  16. package/esm2015/ngx-dynamic-form/directives/dynamic-form-template.directive.js +38 -0
  17. package/esm2015/ngx-dynamic-form/ngx-dynamic-form.module.js +37 -41
  18. package/esm2015/ngx-dynamic-form/services/dynamic-form.service.js +39 -448
  19. package/esm2015/ngx-dynamic-form/services/form-utilities.js +108 -0
  20. package/esm2015/ngx-dynamic-form/services/open-api.service.js +130 -0
  21. package/esm2015/public_api.js +15 -10
  22. package/esm2015/stemy-ngx-dynamic-form.js +4 -2
  23. package/fesm2015/stemy-ngx-dynamic-form.js +1406 -901
  24. package/fesm2015/stemy-ngx-dynamic-form.js.map +1 -1
  25. package/ngx-dynamic-form/common-types.d.ts +265 -38
  26. package/ngx-dynamic-form/components/base/dynamic-form-base.component.d.ts +45 -0
  27. package/ngx-dynamic-form/components/dynamic-form/dynamic-form.component.d.ts +21 -0
  28. package/ngx-dynamic-form/components/dynamic-form-file/dynamic-form-file.component.d.ts +16 -0
  29. package/ngx-dynamic-form/components/dynamic-form-group/dynamic-form-group.component.d.ts +6 -0
  30. package/ngx-dynamic-form/components/dynamic-form-input/dynamic-form-input.component.d.ts +12 -0
  31. package/ngx-dynamic-form/components/dynamic-form-model/dynamic-form-model.component.d.ts +6 -0
  32. package/ngx-dynamic-form/components/dynamic-form-select/dynamic-form-select.component.d.ts +9 -0
  33. package/ngx-dynamic-form/components/dynamic-form-static/dynamic-form-static.component.d.ts +5 -0
  34. package/ngx-dynamic-form/components/dynamic-forms/dynamic-forms.component.d.ts +26 -0
  35. package/ngx-dynamic-form/directives/async-submit.directive.d.ts +3 -7
  36. package/ngx-dynamic-form/directives/dynamic-form-control.directive.d.ts +12 -0
  37. package/ngx-dynamic-form/directives/dynamic-form-group.directive.d.ts +14 -0
  38. package/ngx-dynamic-form/directives/dynamic-form-template.directive.d.ts +16 -0
  39. package/ngx-dynamic-form/ngx-dynamic-form.module.d.ts +15 -7
  40. package/ngx-dynamic-form/services/dynamic-form.service.d.ts +10 -44
  41. package/ngx-dynamic-form/services/form-utilities.d.ts +19 -0
  42. package/ngx-dynamic-form/services/open-api.service.d.ts +37 -0
  43. package/package.json +16 -17
  44. package/public_api.d.ts +14 -9
  45. package/stemy-ngx-dynamic-form.d.ts +3 -1
  46. package/stemy-ngx-dynamic-form.metadata.json +1 -1
  47. package/bundles/stemy-ngx-dynamic-form.umd.min.js +0 -2
  48. package/bundles/stemy-ngx-dynamic-form.umd.min.js.map +0 -1
  49. package/esm2015/ngx-dynamic-form/components/base/dynamic-base-form-array.component.js +0 -79
  50. package/esm2015/ngx-dynamic-form/components/base/dynamic-base-form-control-container.component.js +0 -102
  51. package/esm2015/ngx-dynamic-form/components/base/dynamic-base-form-group.component.js +0 -65
  52. package/esm2015/ngx-dynamic-form/components/base/dynamic-base-form.component.js +0 -140
  53. package/esm2015/ngx-dynamic-form/utils/dynamic-form-array.model.js +0 -16
  54. package/esm2015/ngx-dynamic-form/utils/form-select-subject.js +0 -24
  55. package/esm2015/ngx-dynamic-form/utils/form-subject.js +0 -29
  56. package/esm2015/ngx-dynamic-form/utils/misc.js +0 -18
  57. package/esm2015/ngx-dynamic-form/utils/validators.js +0 -56
  58. package/ngx-dynamic-form/components/base/dynamic-base-form-array.component.d.ts +0 -26
  59. package/ngx-dynamic-form/components/base/dynamic-base-form-control-container.component.d.ts +0 -38
  60. package/ngx-dynamic-form/components/base/dynamic-base-form-group.component.d.ts +0 -21
  61. package/ngx-dynamic-form/components/base/dynamic-base-form.component.d.ts +0 -38
  62. package/ngx-dynamic-form/utils/dynamic-form-array.model.d.ts +0 -22
  63. package/ngx-dynamic-form/utils/form-select-subject.d.ts +0 -6
  64. package/ngx-dynamic-form/utils/form-subject.d.ts +0 -10
  65. package/ngx-dynamic-form/utils/misc.d.ts +0 -3
  66. package/ngx-dynamic-form/utils/validators.d.ts +0 -8
@@ -1,457 +1,48 @@
1
- import { __awaiter } from "tslib";
2
- import { EventEmitter, Inject, Injectable, Injector } from "@angular/core";
3
- import { FormArray, FormGroup } from "@angular/forms";
4
- import { Subject } from "rxjs";
5
- import { DynamicCheckboxModel, DynamicFileUploadModel, DynamicFormArrayModel as DynamicFormArrayModelBase, DynamicFormComponentService, DynamicFormGroupModel, DynamicFormService as Base, DynamicFormValidationService, DynamicInputModel, DynamicSelectModel, DynamicTextAreaModel } from "@ng-dynamic-forms/core";
6
- import { ObjectUtils, OpenApiService, StringUtils } from "@stemy/ngx-utils";
7
- import { isStringWithVal } from "../utils/misc";
8
- import { FormSelectSubject } from "../utils/form-select-subject";
9
- import { FormSubject } from "../utils/form-subject";
10
- import { DynamicFormArrayModel } from "../utils/dynamic-form-array.model";
11
- export class DynamicFormService extends Base {
12
- constructor(cs, vs, openApi, injector) {
13
- super(cs, vs);
14
- this.openApi = openApi;
1
+ import { ComponentFactoryResolver, Inject, Injectable, Injector, Type } from "@angular/core";
2
+ import { FORM_CONTROL_PROVIDER, FORM_GROUP_TYPE } from "../common-types";
3
+ import { ObjectUtils } from "@stemy/ngx-utils";
4
+ export class DynamicFormService {
5
+ constructor(components, groupType, resolver, injector) {
6
+ this.components = components;
7
+ this.groupType = groupType;
8
+ this.resolver = resolver;
15
9
  this.injector = injector;
16
- this.onDetectChanges = new EventEmitter();
17
10
  }
18
- get api() {
19
- return this.openApi.api;
20
- }
21
- get language() {
22
- return this.api.language;
23
- }
24
- patchGroup(value, formModel, formGroup) {
25
- this.patchValueRecursive(value, formModel, formGroup);
26
- this.detectChanges();
27
- formGroup.patchValue(ObjectUtils.copy(value));
28
- }
29
- patchForm(value, component) {
30
- this.patchValueRecursive(value, component.model, component.group);
31
- this.detectChanges(component);
32
- component.group.patchValue(value);
33
- }
34
- serialize(formModel, formGroup) {
35
- return this.serializeRecursive(formModel, formGroup);
36
- }
37
- notifyChanges(formModel, formGroup, root) {
38
- this.notifyChangesRecursive(formModel, formGroup, root);
39
- }
40
- updateSelectOptions(formControlModel, formControl, root) {
41
- if (formControlModel instanceof DynamicSelectModel) {
42
- let options = formControlModel.options$;
43
- if (options instanceof FormSubject) {
44
- options.notify(formControlModel, formControl, root);
45
- return;
46
- }
47
- while (options instanceof Subject && options.source) {
48
- options = options.source;
49
- if (options instanceof FormSubject) {
50
- options.notify(formControlModel, formControl, root);
51
- }
52
- }
53
- }
54
- }
55
- showErrors(form) {
56
- this.showErrorsForGroup(form.group);
57
- this.detectChanges(form);
58
- }
59
- detectChanges(formComponent) {
60
- super.detectChanges(formComponent);
61
- this.onDetectChanges.emit(formComponent);
62
- }
63
- patchValueRecursive(value, formModel, formGroup) {
64
- Object.keys(value).forEach(key => {
65
- const subModel = this.findModelById(key, formModel);
66
- const subValue = value[key];
67
- if (!subModel)
68
- return;
69
- const subControl = this.findControlByModel(subModel, formGroup);
70
- if (subModel instanceof DynamicSelectModel && ObjectUtils.isObject(subValue)) {
71
- value[key] = subValue.id || subValue._id || subValue;
72
- return;
73
- }
74
- if (subModel instanceof DynamicFormArrayModelBase) {
75
- const length = Array.isArray(subValue) ? subValue.length : 0;
76
- const subArray = subControl;
77
- while (subModel.size > length) {
78
- this.removeFormArrayGroup(0, subArray, subModel);
79
- }
80
- while (subModel.size < length) {
81
- this.insertFormArrayGroup(subModel.size, subArray, subModel);
82
- }
83
- for (let i = 0; i < length; i++) {
84
- const itemModel = subModel.get(i);
85
- this.patchValueRecursive(subValue[i], itemModel.group, subArray.at(i));
86
- }
87
- return;
88
- }
89
- if (subModel instanceof DynamicFormGroupModel) {
90
- this.patchValueRecursive(subValue, subModel.group, subControl);
91
- }
92
- });
93
- }
94
- serializeRecursive(formModel, formGroup) {
95
- var _a, _b;
96
- return __awaiter(this, void 0, void 0, function* () {
97
- const result = {};
98
- if (!formModel || !formGroup || !formGroup.value)
99
- return result;
100
- for (const i in formModel) {
101
- const subModel = formModel[i];
102
- const subControl = this.findControlByModel(subModel, formGroup);
103
- const serializer = (_a = subModel.additional) === null || _a === void 0 ? void 0 : _a.serializer;
104
- if (ObjectUtils.isFunction(serializer)) {
105
- result[subModel.id] = yield serializer(subModel, subControl);
106
- continue;
107
- }
108
- if (subModel instanceof DynamicFormArrayModelBase) {
109
- const length = Array.isArray(subControl.value) ? subControl.value.length : 0;
110
- const subArray = subControl;
111
- const resArray = [];
112
- for (let i = 0; i < length; i++) {
113
- const itemModel = subModel.get(i);
114
- resArray.push(yield this.serializeRecursive(itemModel.group, subArray.at(i)));
115
- }
116
- result[subModel.id] = resArray;
117
- continue;
118
- }
119
- if (subModel instanceof DynamicFormGroupModel) {
120
- result[subModel.id] = yield this.serializeRecursive(subModel.group, subControl);
121
- continue;
122
- }
123
- if (subModel instanceof DynamicInputModel && !ObjectUtils.isNullOrUndefined(subControl.value)) {
124
- result[subModel.id] = subModel.inputType == "number"
125
- ? (_b = parseFloat((`${subControl.value}` || "0").replace(/,/gi, "."))) !== null && _b !== void 0 ? _b : null : subControl.value;
126
- continue;
127
- }
128
- result[subModel.id] = subControl.value;
129
- }
130
- return result;
131
- });
132
- }
133
- notifyChangesRecursive(formModel, formGroup, root) {
134
- if (!formModel || !formGroup)
135
- return;
136
- for (const i in formModel) {
137
- const subModel = formModel[i];
138
- const subControl = this.findControlByModel(subModel, formGroup);
139
- if (subModel instanceof DynamicFormArrayModelBase) {
140
- const length = Array.isArray(subControl.value) ? subControl.value.length : 0;
141
- const subArray = subControl;
142
- for (let i = 0; i < length; i++) {
143
- const itemModel = subModel.get(i);
144
- this.notifyChangesRecursive(itemModel.group, subArray.at(i), root);
145
- }
146
- continue;
147
- }
148
- if (subModel instanceof DynamicFormGroupModel) {
149
- this.notifyChangesRecursive(subModel.group, subControl, root);
150
- continue;
151
- }
152
- this.updateSelectOptions(subModel, subControl, root);
153
- }
154
- }
155
- showErrorsForGroup(formGroup) {
156
- if (!formGroup)
157
- return;
158
- formGroup.markAsTouched({ onlySelf: true });
159
- const controls = Object.keys(formGroup.controls).map(id => formGroup.controls[id]);
160
- this.showErrorsForControls(controls);
161
- }
162
- showErrorsForControls(controls) {
163
- controls.forEach(control => {
164
- if (control instanceof FormGroup) {
165
- this.showErrorsForGroup(control);
166
- return;
167
- }
168
- control.markAsTouched({ onlySelf: true });
169
- if (control instanceof FormArray) {
170
- this.showErrorsForControls(control.controls);
171
- }
172
- });
173
- }
174
- getFormModelForSchema(name, customizeModel) {
175
- return __awaiter(this, void 0, void 0, function* () {
176
- this.api.cache = {};
177
- this.schemas = yield this.openApi.getSchemas();
178
- const customizeModels = (property, schema, modelType, config) => {
179
- const model = new modelType(config);
180
- if (!ObjectUtils.isFunction(customizeModel))
181
- return [model];
182
- const res = customizeModel(property, schema, model, config, this.injector);
183
- return Array.isArray(res) ? res : [res];
184
- };
185
- return this.getFormModelForSchemaDef(this.schemas[name], customizeModels);
186
- });
187
- }
188
- getFormModelForSchemaDef(schema, customizeModels) {
189
- if (!schema)
190
- return [];
191
- const keys = Object.keys(schema.properties || {});
192
- const controls = [];
193
- for (const p of keys) {
194
- const property = schema.properties[p];
195
- controls.push(...this.getFormControlModels(property, schema, customizeModels));
196
- }
197
- return controls.filter(t => null !== t);
198
- }
199
- getFormControlModels(property, schema, customizeModels) {
200
- var _a, _b;
201
- const $enum = ((_a = property.items) === null || _a === void 0 ? void 0 : _a.enum) || property.enum;
202
- if (Array.isArray($enum) || isStringWithVal(property.optionsPath) || isStringWithVal(property.endpoint)) {
203
- return customizeModels(property, schema, DynamicSelectModel, this.getFormSelectConfig(property, schema));
204
- }
205
- switch (property.type) {
206
- case "string":
207
- case "number":
208
- case "integer":
209
- return customizeModels(property, schema, DynamicInputModel, this.getFormInputConfig(property, schema));
210
- case "textarea":
211
- return customizeModels(property, schema, DynamicTextAreaModel, this.getFormTextareaConfig(property, schema));
212
- case "boolean":
213
- return customizeModels(property, schema, DynamicCheckboxModel, this.getFormCheckboxConfig(property, schema));
214
- case "array":
215
- if (((_b = property.items) === null || _b === void 0 ? void 0 : _b.$ref) || property.$ref) {
216
- return customizeModels(property, schema, DynamicFormArrayModel, this.getFormArrayConfig(property, schema, customizeModels));
217
- }
218
- else {
219
- return customizeModels(property, schema, DynamicInputModel, this.getFormInputConfig(property, schema));
220
- }
221
- case "file":
222
- return customizeModels(property, schema, DynamicFileUploadModel, this.getFormUploadConfig(property, schema));
223
- }
224
- if (property.$ref) {
225
- return customizeModels(property, schema, DynamicFormGroupModel, this.getFormGroupConfig(property, schema, customizeModels));
226
- }
227
- return [];
228
- }
229
- findModelByPath(parent, path) {
230
- if (path.length == 0)
231
- return parent;
232
- const next = path.shift();
233
- if (Array.isArray(parent)) {
234
- return this.findModelByPath(parent.find(t => t.id == next), path);
235
- }
236
- if (parent instanceof DynamicFormGroupModel) {
237
- return this.findModelByPath(parent.group.find(t => t.id == next), path);
238
- }
239
- if (parent instanceof DynamicFormArrayModel) {
240
- return this.findModelByPath(parent.groups.find(t => t.index == next), path);
241
- }
242
- return parent;
243
- }
244
- getFormControlConfig(property, schema) {
245
- const validators = this.getValidators(property, schema);
246
- const errorMessages = Object.keys(validators).reduce((res, key) => {
247
- res[key] = `error.${key}`;
248
- return res;
249
- }, {});
250
- return {
251
- id: property.id,
252
- label: ObjectUtils.isString(property.label) ? property.label : property.id,
253
- hidden: property.hidden,
254
- disabled: property.disabled,
255
- validators,
256
- errorMessages,
257
- additional: Object.assign({}, property)
258
- };
259
- }
260
- getFormArrayConfig(property, schema, customizeModels) {
261
- var _a;
262
- const ref = ((_a = property.items) === null || _a === void 0 ? void 0 : _a.$ref) || property.$ref || "";
263
- const subSchema = this.schemas[ref.split("/").pop()];
264
- return Object.assign(this.getFormControlConfig(property, schema), {
265
- groupFactory: () => this.getFormModelForSchemaDef(subSchema, customizeModels),
266
- useTabs: property.useTabs || false
267
- });
268
- }
269
- getFormGroupConfig(property, schema, customizeModels) {
270
- const ref = property.$ref || "";
271
- const subSchema = this.schemas[ref.split("/").pop()];
272
- return Object.assign(this.getFormControlConfig(property, schema), { group: this.getFormModelForSchemaDef(subSchema, customizeModels) });
273
- }
274
- getFormInputConfig(property, schema) {
275
- var _a;
276
- let inputType = StringUtils.has(property.id, "password", "Password") ? "password" : (property.format || ((_a = property.items) === null || _a === void 0 ? void 0 : _a.type) || property.type);
277
- switch (inputType) {
278
- case "boolean":
279
- inputType = "checkbox";
280
- break;
281
- case "textarea":
282
- inputType = "textarea";
283
- break;
284
- case "integer":
285
- inputType = "number";
286
- break;
287
- }
288
- const sub = property.type == "array" ? property.items || property : property;
289
- return Object.assign(this.getFormControlConfig(property, schema), {
290
- inputType,
291
- autoComplete: property.autoComplete || "off",
292
- multiple: property.type == "array",
293
- accept: ObjectUtils.isString(property.accept) ? property.accept : null,
294
- mask: ObjectUtils.isString(property.mask) ? property.mask : null,
295
- pattern: ObjectUtils.isString(property.pattern) ? property.pattern : null,
296
- step: isNaN(sub.step) ? (isNaN(property.step) ? 1 : property.step) : sub.step,
297
- min: isNaN(sub.minimum) ? Number.MIN_SAFE_INTEGER : sub.minimum,
298
- max: isNaN(sub.maximum) ? Number.MAX_SAFE_INTEGER : sub.maximum,
299
- minLength: isNaN(sub.minLength) ? Number.MIN_SAFE_INTEGER : sub.minLength,
300
- maxLength: isNaN(sub.maxLength) ? Number.MAX_SAFE_INTEGER : sub.maxLength,
301
- placeholder: property.placeholder || ""
302
- });
303
- }
304
- getFormTextareaConfig(property, schema) {
305
- return Object.assign(this.getFormControlConfig(property, schema), {
306
- cols: property.cols || null,
307
- rows: property.rows || 10,
308
- wrap: property.wrap || false,
309
- autoComplete: property.autoComplete || "off",
310
- multiple: property.type == "array"
311
- });
312
- }
313
- getFormSelectConfig(property, schema) {
314
- return Object.assign(this.getFormControlConfig(property, schema), {
315
- options: this.getFormSelectOptions(property, schema),
316
- multiple: property.type == "array"
317
- });
318
- }
319
- getFormCheckboxConfig(property, schema) {
320
- return Object.assign(this.getFormControlConfig(property, schema), {
321
- indeterminate: property.indeterminate === true
322
- });
323
- }
324
- translateOptions(options) {
325
- return __awaiter(this, void 0, void 0, function* () {
326
- if (!options)
327
- return [];
328
- for (const option of options) {
329
- option.label = yield this.language.getTranslation(option.label);
330
- }
331
- return options;
332
- });
333
- }
334
- getFormSelectOptions(property, schema) {
335
- var _a;
336
- const $enum = ((_a = property.items) === null || _a === void 0 ? void 0 : _a.enum) || property.enum;
337
- if (Array.isArray($enum)) {
338
- return new FormSelectSubject(() => {
339
- const options = $enum.map(value => {
340
- const label = property.translatable ? `${property.id}.${value}` : `${value}`;
341
- return { value, label };
342
- });
343
- return this.translateOptions(options);
344
- });
345
- }
346
- if (isStringWithVal(property.optionsPath)) {
347
- return new FormSelectSubject((formModel, control, root, indexes) => {
348
- let path = property.optionsPath;
349
- let target = control;
350
- let model = formModel;
351
- if (path.startsWith("$root")) {
352
- path = path.substr(5);
353
- while (target.parent) {
354
- target = target.parent;
355
- }
356
- model = root;
357
- }
358
- while (path.startsWith(".")) {
359
- path = path.substr(1);
360
- if (target.parent) {
361
- target = target.parent;
362
- }
363
- model = model.parent || root;
364
- }
365
- Object.keys(indexes).forEach(key => {
366
- path = path.replace(key, indexes[key]);
367
- });
368
- model = this.findModelByPath(model, path.split("."));
369
- const modelOptions = (model instanceof DynamicSelectModel ? model.options : []);
370
- const value = ObjectUtils.getValue(target.value, path);
371
- const options = (!ObjectUtils.isArray(value) ? [] : value).map(value => {
372
- const modelOption = modelOptions.find(t => t.value == value);
373
- return { value, label: (modelOption === null || modelOption === void 0 ? void 0 : modelOption.label) || value };
374
- });
375
- return this.translateOptions(options);
376
- });
377
- }
378
- return new FormSelectSubject(() => __awaiter(this, void 0, void 0, function* () {
379
- this.api.cache[property.endpoint] = this.api.cache[property.endpoint] || this.api.list(property.endpoint, this.api.makeListParams(1, -1)).then(result => {
380
- return result.items.map(i => {
381
- return { value: i.id || i._id, label: i[property.labelField] || i.label || i.id || i._id };
382
- });
383
- });
384
- const options = (yield this.api.cache[property.endpoint]).map(t => Object.assign({}, t));
385
- return this.translateOptions(options);
386
- }));
387
- }
388
- getFormUploadConfig(property, schema) {
389
- const url = this.api.url(property.url || "assets");
390
- const { accept, autoUpload, maxSize, minSize, removeUrl, showFileList } = property;
391
- return Object.assign(this.getFormControlConfig(property, schema), {
392
- url,
393
- accept,
394
- autoUpload,
395
- maxSize,
396
- minSize,
397
- removeUrl,
398
- showFileList
399
- });
400
- }
401
- getValidators(property, schema) {
402
- const validators = {};
403
- if (ObjectUtils.isArray(schema.required) && schema.required.indexOf(property.id) >= 0) {
404
- validators.required = null;
405
- }
406
- this.addPropertyValidators(validators, property);
407
- this.addItemsValidators(validators, property.items);
408
- return validators;
409
- }
410
- addPropertyValidators(validators, property) {
411
- if (!property)
412
- return;
413
- if (!isNaN(property.minLength)) {
414
- validators.minLength = property.minLength;
415
- }
416
- if (!isNaN(property.maxLength)) {
417
- validators.maxLength = property.maxLength;
418
- }
419
- if (!isNaN(property.minimum)) {
420
- validators.min = property.minimum;
421
- }
422
- if (!isNaN(property.maximum)) {
423
- validators.max = property.maximum;
424
- }
425
- switch (property.format) {
426
- case "email":
427
- validators.email = null;
428
- break;
429
- }
430
- }
431
- addItemsValidators(validators, items) {
432
- if (!items)
433
- return;
434
- if (!isNaN(items.minLength)) {
435
- validators.itemsMinLength = items.minLength;
436
- }
437
- if (!isNaN(items.maxLength)) {
438
- validators.itemsMaxLength = items.maxLength;
439
- }
440
- if (!isNaN(items.minimum)) {
441
- validators.itemsMinValue = items.minimum;
442
- }
443
- if (!isNaN(items.maximum)) {
444
- validators.itemsMaxValue = items.maximum;
445
- }
11
+ findProvider(control) {
12
+ if (!control)
13
+ return null;
14
+ const providers = this.components.filter(p => p.acceptor(control));
15
+ if (providers.length == 0) {
16
+ throw new Error(`No component provider for control: ${JSON.stringify({
17
+ id: control.id,
18
+ type: control.type,
19
+ data: control.data
20
+ })}`);
21
+ }
22
+ // Sort providers
23
+ providers.sort((a, b) => ObjectUtils.compare(a.priority, b.priority));
24
+ return providers[0];
25
+ }
26
+ createComponent(vcr, provider) {
27
+ vcr.clear();
28
+ if (!provider)
29
+ return null;
30
+ const factory = this.resolver.resolveComponentFactory(provider.component);
31
+ return vcr.createComponent(factory).instance;
32
+ }
33
+ createGroup(vcr) {
34
+ vcr.clear();
35
+ const factory = this.resolver.resolveComponentFactory(this.groupType);
36
+ return vcr.createComponent(factory).instance;
446
37
  }
447
38
  }
448
39
  DynamicFormService.decorators = [
449
40
  { type: Injectable }
450
41
  ];
451
42
  DynamicFormService.ctorParameters = () => [
452
- { type: DynamicFormComponentService },
453
- { type: DynamicFormValidationService },
454
- { type: OpenApiService, decorators: [{ type: Inject, args: [OpenApiService,] }] },
455
- { type: Injector, decorators: [{ type: Inject, args: [Injector,] }] }
43
+ { type: Array, decorators: [{ type: Inject, args: [FORM_CONTROL_PROVIDER,] }] },
44
+ { type: Type, decorators: [{ type: Inject, args: [FORM_GROUP_TYPE,] }] },
45
+ { type: ComponentFactoryResolver },
46
+ { type: Injector }
456
47
  ];
457
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1mb3JtLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbmd4LWR5bmFtaWMtZm9ybS9zZXJ2aWNlcy9keW5hbWljLWZvcm0uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFDLFlBQVksRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN6RSxPQUFPLEVBQWtCLFNBQVMsRUFBRSxTQUFTLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyRSxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQzdCLE9BQU8sRUFDSCxvQkFBb0IsRUFFcEIsc0JBQXNCLEVBRXRCLHFCQUFxQixJQUFJLHlCQUF5QixFQUVsRCwyQkFBMkIsRUFHM0IscUJBQXFCLEVBSXJCLGtCQUFrQixJQUFJLElBQUksRUFDMUIsNEJBQTRCLEVBRzVCLGlCQUFpQixFQUVqQixrQkFBa0IsRUFFbEIsb0JBQW9CLEVBR3ZCLE1BQU0sd0JBQXdCLENBQUM7QUFDaEMsT0FBTyxFQU1ILFdBQVcsRUFDWCxjQUFjLEVBQ2QsV0FBVyxFQUNkLE1BQU0sa0JBQWtCLENBQUM7QUFJMUIsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUM5QyxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSw4QkFBOEIsQ0FBQztBQUMvRCxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDbEQsT0FBTyxFQUFDLHFCQUFxQixFQUE4QixNQUFNLG1DQUFtQyxDQUFDO0FBSXJHLE1BQU0sT0FBTyxrQkFBbUIsU0FBUSxJQUFJO0lBYXhDLFlBQVksRUFBK0IsRUFDL0IsRUFBZ0MsRUFDQyxPQUF1QixFQUM3QixRQUFrQjtRQUNyRCxLQUFLLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRjJCLFlBQU8sR0FBUCxPQUFP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QWEsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDO1NBQzVDO0lBQ0wsQ0FBQzs7O1lBdmRKLFVBQVU7OztZQXRDUCwyQkFBMkI7WUFRM0IsNEJBQTRCO1lBa0I1QixjQUFjLHVCQTRCRCxNQUFNLFNBQUMsY0FBYztZQWhFSSxRQUFRLHVCQWlFakMsTUFBTSxTQUFDLFFBQVEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0V2ZW50RW1pdHRlciwgSW5qZWN0LCBJbmplY3RhYmxlLCBJbmplY3Rvcn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHtBYnN0cmFjdENvbnRyb2wsIEZvcm1BcnJheSwgRm9ybUdyb3VwfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcclxuaW1wb3J0IHtTdWJqZWN0fSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQge1xyXG4gICAgRHluYW1pY0NoZWNrYm94TW9kZWwsXHJcbiAgICBEeW5hbWljQ2hlY2tib3hNb2RlbENvbmZpZyxcclxuICAgIER5bmFtaWNGaWxlVXBsb2FkTW9kZWwsXHJcbiAgICBEeW5hbWljRmlsZVVwbG9hZE1vZGVsQ29uZmlnLFxyXG4gICAgRHluYW1pY0Zvcm1BcnJheU1vZGVsIGFzIER5bmFtaWNGb3JtQXJyYXlNb2RlbEJhc2UsXHJcbiAgICBEeW5hbWljRm9ybUNvbXBvbmVudCxcclxuICAgIER5bmFtaWNGb3JtQ29tcG9uZW50U2VydmljZSxcclxuICAgIER5bmFtaWNGb3JtQ29udHJvbE1vZGVsLFxyXG4gICAgRHluYW1pY0Zvcm1Db250cm9sTW9kZWxDb25maWcsXHJcbiAgICBEeW5hbWljRm9ybUdyb3VwTW9kZWwsXHJcbiAgICBEeW5hbWljRm9ybUdyb3VwTW9kZWxDb25maWcsXHJcbiAgICBEeW5hbWljRm9ybU1vZGVsLCBEeW5hbWljRm9ybU9wdGlvbixcclxuICAgIER5bmFtaWNGb3JtT3B0aW9uQ29uZmlnLFxyXG4gICAgRHluYW1pY0Zvcm1TZXJ2aWNlIGFzIEJhc2UsXHJcbiAgICBEeW5hbWljRm9ybVZhbGlkYXRpb25TZXJ2aWNlLFxyXG4gICAgRHluYW1pY0Zvcm1WYWx1ZUNvbnRyb2xNb2RlbCxcclxuICAgIER5bmFtaWNGb3JtVmFsdWVDb250cm9sTW9kZWxDb25maWcsXHJcbiAgICBEeW5hbWljSW5wdXRNb2RlbCxcclxuICAgIER5bmFtaWNJbnB1dE1vZGVsQ29uZmlnLFxyXG4gICAgRHluYW1pY1NlbGVjdE1vZGVsLFxyXG4gICAgRHluYW1pY1NlbGVjdE1vZGVsQ29uZmlnLFxyXG4gICAgRHluYW1pY1RleHRBcmVhTW9kZWwsXHJcbiAgICBEeW5hbWljVGV4dEFyZWFNb2RlbENvbmZpZyxcclxuICAgIER5bmFtaWNWYWxpZGF0b3JzQ29uZmlnXHJcbn0gZnJvbSBcIkBuZy1keW5hbWljLWZvcm1zL2NvcmVcIjtcclxuaW1wb3J0IHtcclxuICAgIElBcGlTZXJ2aWNlLFxyXG4gICAgSUxhbmd1YWdlU2VydmljZSxcclxuICAgIElPcGVuQXBpU2NoZW1hLFxyXG4gICAgSU9wZW5BcGlTY2hlbWFQcm9wZXJ0eSxcclxuICAgIElPcGVuQXBpU2NoZW1hcyxcclxuICAgIE9iamVjdFV0aWxzLFxyXG4gICAgT3BlbkFwaVNlcnZpY2UsXHJcbiAgICBTdHJpbmdVdGlsc1xyXG59IGZyb20gXCJAc3RlbXkvbmd4LXV0aWxzXCI7XHJcblxyXG5pbXBvcnQge0Zvcm1Db250cm9sU2VyaWFsaXplciwgRm9ybU1vZGVsQ3VzdG9taXplciwgRm9ybU1vZGVsQ3VzdG9taXplcldyYXAsIE1vZGVsVHlwZX0gZnJvbSBcIi4uL2NvbW1vbi10eXBlc1wiO1xyXG5cclxuaW1wb3J0IHtpc1N0cmluZ1dpdGhWYWx9IGZyb20gXCIuLi91dGlscy9taXNjXCI7XHJcbmltcG9ydCB7Rm9ybVNlbGVjdFN1YmplY3R9IGZyb20gXCIuLi91dGlscy9mb3JtLXNlbGVjdC1zdWJqZWN0XCI7XHJcbmltcG9ydCB7Rm9ybVN1YmplY3R9IGZyb20gXCIuLi91dGlscy9mb3JtLXN1YmplY3RcIjtcclxuaW1wb3J0IHtEeW5hbWljRm9ybUFycmF5TW9kZWwsIER5bmFtaWNGb3JtQXJyYXlNb2RlbENvbmZpZ30gZnJvbSBcIi4uL3V0aWxzL2R5bmFtaWMtZm9ybS1hcnJheS5tb2RlbFwiO1xyXG5pbXBvcnQge0R5bmFtaWNQYXRoYWJsZX0gZnJvbSBcIkBuZy1keW5hbWljLWZvcm1zL2NvcmUvbGliL21vZGVsL21pc2MvZHluYW1pYy1mb3JtLWNvbnRyb2wtcGF0aC5tb2RlbFwiO1xyXG5cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgRHluYW1pY0Zvcm1TZXJ2aWNlIGV4dGVuZHMgQmFzZSB7XHJcblxyXG4gICAgZ2V0IGFwaSgpOiBJQXBpU2VydmljZSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMub3BlbkFwaS5hcGk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGxhbmd1YWdlKCk6IElMYW5ndWFnZVNlcnZpY2Uge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmFwaS5sYW5ndWFnZTtcclxuICAgIH1cclxuXHJcbiAgICByZWFkb25seSBvbkRldGVjdENoYW5nZXM6IEV2ZW50RW1pdHRlcjxEeW5hbWljRm9ybUNvbXBvbmVudD47XHJcbiAgICBwcm90ZWN0ZWQgc2NoZW1hczogSU9wZW5BcGlTY2hlbWFzO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGNzOiBEeW5hbWljRm9ybUNvbXBvbmVudFNlcnZpY2UsXHJcbiAgICAgICAgICAgICAgICB2czogRHluYW1pY0Zvcm1WYWxpZGF0aW9uU2VydmljZSxcclxuICAgICAgICAgICAgICAgIEBJbmplY3QoT3BlbkFwaVNlcnZpY2UpIHJlYWRvbmx5IG9wZW5BcGk6IE9wZW5BcGlTZXJ2aWNlLFxyXG4gICAgICAgICAgICAgICAgQEluamVjdChJbmplY3RvcikgcmVhZG9ubHkgaW5qZWN0b3I6IEluamVjdG9yKSB7XHJcbiAgICAgICAgc3VwZXIoY3MsIHZzKTtcclxuICAgICAgICB0aGlzLm9uRGV0ZWN0Q2hhbmdlcyA9IG5ldyBFdmVudEVtaXR0ZXI8RHluYW1pY0Zvcm1Db21wb25lbnQ+KCk7XHJcbiAgICB9XHJcblxyXG4gICAgcGF0Y2hHcm91cCh2YWx1ZTogYW55LCBmb3JtTW9kZWw6IER5bmFtaWNGb3JtTW9kZWwsIGZvcm1Hcm91cDogRm9ybUdyb3VwKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5wYXRjaFZhbHVlUmVjdXJzaXZlKHZhbHVlLCBmb3JtTW9kZWwsIGZvcm1Hcm91cCk7XHJcbiAgICAgICAgdGhpcy5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgZm9ybUdyb3VwLnBhdGNoVmFsdWUoT2JqZWN0VXRpbHMuY29weSh2YWx1ZSkpO1xyXG4gICAgfVxyXG5cclxuICAgIHBhdGNoRm9ybSh2YWx1ZTogYW55LCBjb21wb25lbnQ6IER5bmFtaWNGb3JtQ29tcG9uZW50KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5wYXRjaFZhbHVlUmVjdXJzaXZlKHZhbHVlLCBjb21wb25lbnQubW9kZWwsIGNvbXBvbmVudC5ncm91cCk7XHJcbiAgICAgICAgdGhpcy5kZXRlY3RDaGFuZ2VzKGNvbXBvbmVudCk7XHJcbiAgICAgICAgY29tcG9uZW50Lmdyb3VwLnBhdGNoVmFsdWUodmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHNlcmlhbGl6ZShmb3JtTW9kZWw6IER5bmFtaWNGb3JtTW9kZWwsIGZvcm1Hcm91cDogRm9ybUdyb3VwKTogUHJvbWlzZTxhbnk+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zZXJpYWxpemVSZWN1cnNpdmUoZm9ybU1vZGVsLCBmb3JtR3JvdXApO1xyXG4gICAgfVxyXG5cclxuICAgIG5vdGlmeUNoYW5nZXMoZm9ybU1vZGVsOiBEeW5hbWljRm9ybU1vZGVsLCBmb3JtR3JvdXA6IEZvcm1Hcm91cCwgcm9vdDogRHluYW1pY0Zvcm1Nb2RlbCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlc1JlY3Vyc2l2ZShmb3JtTW9kZWwsIGZvcm1Hcm91cCwgcm9vdCk7XHJcbiAgICB9XHJcblxyXG4gICAgdXBkYXRlU2VsZWN0T3B0aW9ucyhmb3JtQ29udHJvbE1vZGVsOiBEeW5hbWljRm9ybUNvbnRyb2xNb2RlbCwgZm9ybUNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCwgcm9vdDogRHluYW1pY0Zvcm1Nb2RlbCk6IHZvaWQge1xyXG4gICAgICAgIGlmIChmb3JtQ29udHJvbE1vZGVsIGluc3RhbmNlb2YgRHluYW1pY1NlbGVjdE1vZGVsKSB7XHJcbiAgICAgICAgICAgIGxldCBvcHRpb25zID0gZm9ybUNvbnRyb2xNb2RlbC5vcHRpb25zJDtcclxuICAgICAgICAgICAgaWYgKG9wdGlvbnMgaW5zdGFuY2VvZiBGb3JtU3ViamVjdCkge1xyXG4gICAgICAgICAgICAgICAgb3B0aW9ucy5ub3RpZnkoZm9ybUNvbnRyb2xNb2RlbCwgZm9ybUNvbnRyb2wsIHJvb3QpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHdoaWxlIChvcHRpb25zIGluc3RhbmNlb2YgU3ViamVjdCAmJiBvcHRpb25zLnNvdXJjZSkge1xyXG4gICAgICAgICAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMuc291cmNlO1xyXG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMgaW5zdGFuY2VvZiBGb3JtU3ViamVjdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMubm90aWZ5KGZvcm1Db250cm9sTW9kZWwsIGZvcm1Db250cm9sLCByb290KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzaG93RXJyb3JzKGZvcm06IER5bmFtaWNGb3JtQ29tcG9uZW50KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zaG93RXJyb3JzRm9yR3JvdXAoZm9ybS5ncm91cCk7XHJcbiAgICAgICAgdGhpcy5kZXRlY3RDaGFuZ2VzKGZvcm0pO1xyXG4gICAgfVxyXG5cclxuICAgIGRldGVjdENoYW5nZXMoZm9ybUNvbXBvbmVudD86IER5bmFtaWNGb3JtQ29tcG9uZW50KSB7XHJcbiAgICAgICAgc3VwZXIuZGV0ZWN0Q2hhbmdlcyhmb3JtQ29tcG9uZW50KTtcclxuICAgICAgICB0aGlzLm9uRGV0ZWN0Q2hhbmdlcy5lbWl0KGZvcm1Db21wb25lbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBwYXRjaFZhbHVlUmVjdXJzaXZlKHZhbHVlOiBhbnksIGZvcm1Nb2RlbDogRHluYW1pY0Zvcm1Nb2RlbCwgZm9ybUdyb3VwOiBGb3JtR3JvdXApOiB2b2lkIHtcclxuICAgICAgICBPYmplY3Qua2V5cyh2YWx1ZSkuZm9yRWFjaChrZXkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBzdWJNb2RlbCA9IHRoaXMuZmluZE1vZGVsQnlJZChrZXksIGZvcm1Nb2RlbCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHN1YlZhbHVlID0gdmFsdWVba2V5XTtcclxuICAgICAgICAgICAgaWYgKCFzdWJNb2RlbCkgcmV0dXJuO1xyXG4gICAgICAgICAgICBjb25zdCBzdWJDb250cm9sID0gdGhpcy5maW5kQ29udHJvbEJ5TW9kZWwoc3ViTW9kZWwsIGZvcm1Hcm91cCk7XHJcbiAgICAgICAgICAgIGlmIChzdWJNb2RlbCBpbnN0YW5jZW9mIER5bmFtaWNTZWxlY3RNb2RlbCAmJiBPYmplY3RVdGlscy5pc09iamVjdChzdWJWYWx1ZSkpIHtcclxuICAgICAgICAgICAgICAgIHZhbHVlW2tleV0gPSBzdWJWYWx1ZS5pZCB8fCBzdWJWYWx1ZS5faWQgfHwgc3ViVmFsdWU7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHN1Yk1vZGVsIGluc3RhbmNlb2YgRHluYW1pY0Zvcm1BcnJheU1vZGVsQmFzZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbGVuZ3RoID0gQXJyYXkuaXNBcnJheShzdWJWYWx1ZSkgPyBzdWJWYWx1ZS5sZW5ndGggOiAwO1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgc3ViQXJyYXkgPSBzdWJDb250cm9sIGFzIEZvcm1BcnJheTtcclxuICAgICAgICAgICAgICAgIHdoaWxlIChzdWJNb2RlbC5zaXplID4gbGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVGb3JtQXJyYXlHcm91cCgwLCBzdWJBcnJheSwgc3ViTW9kZWwpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgd2hpbGUgKHN1Yk1vZGVsLnNpemUgPCBsZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmluc2VydEZvcm1BcnJheUdyb3VwKHN1Yk1vZGVsLnNpemUsIHN1YkFycmF5LCBzdWJNb2RlbCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXRlbU1vZGVsID0gc3ViTW9kZWwuZ2V0KGkpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGF0Y2hWYWx1ZVJlY3Vyc2l2ZShzdWJWYWx1ZVtpXSwgaXRlbU1vZGVsLmdyb3VwLCBzdWJBcnJheS5hdChpKSBhcyBGb3JtR3JvdXApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChzdWJNb2RlbCBpbnN0YW5jZW9mIER5bmFtaWNGb3JtR3JvdXBNb2RlbCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wYXRjaFZhbHVlUmVjdXJzaXZlKHN1YlZhbHVlLCBzdWJNb2RlbC5ncm91cCwgc3ViQ29udHJvbCBhcyBGb3JtR3JvdXApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGFzeW5jIHNlcmlhbGl6ZVJlY3Vyc2l2ZShmb3JtTW9kZWw6IER5bmFtaWNGb3JtTW9kZWwsIGZvcm1Hcm91cDogRm9ybUdyb3VwKTogUHJvbWlzZTxhbnk+IHtcclxuICAgICAgICBjb25zdCByZXN1bHQgPSB7fTtcclxuICAgICAgICBpZiAoIWZvcm1Nb2RlbCB8fCAhZm9ybUdyb3VwIHx8ICFmb3JtR3JvdXAudmFsdWUpIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgZm9yIChjb25zdCBpIGluIGZvcm1Nb2RlbCkge1xyXG4gICAgICAgICAgICBjb25zdCBzdWJNb2RlbCA9IGZvcm1Nb2RlbFtpXSBhcyBEeW5hbWljRm9ybVZhbHVlQ29udHJvbE1vZGVsPGFueT47XHJcbiAgICAgICAgICAgIGNvbnN0IHN1YkNvbnRyb2wgPSB0aGlzLmZpbmRDb250cm9sQnlNb2RlbChzdWJNb2RlbCwgZm9ybUdyb3VwKTtcclxuICAgICAgICAgICAgY29uc3Qgc2VyaWFsaXplciA9IHN1Yk1vZGVsLmFkZGl0aW9uYWw/LnNlcmlhbGl6ZXIgYXMgRm9ybUNvbnRyb2xTZXJpYWxpemVyO1xyXG4gICAgICAgICAgICBpZiAoT2JqZWN0VXRpbHMuaXNGdW5jdGlvbihzZXJpYWxpemVyKSkge1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0W3N1Yk1vZGVsLmlkXSA9IGF3YWl0IHNlcmlhbGl6ZXIoc3ViTW9kZWwsIHN1YkNvbnRyb2wpO1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHN1Yk1vZGVsIGluc3RhbmNlb2YgRHluYW1pY0Zvcm1BcnJheU1vZGVsQmFzZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbGVuZ3RoID0gQXJyYXkuaXNBcnJheShzdWJDb250cm9sLnZhbHVlKSA/IHN1YkNvbnRyb2wudmFsdWUubGVuZ3RoIDogMDtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHN1YkFycmF5ID0gc3ViQ29udHJvbCBhcyBGb3JtQXJyYXk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByZXNBcnJheSA9IFtdO1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1Nb2RlbCA9IHN1Yk1vZGVsLmdldChpKTtcclxuICAgICAgICAgICAgICAgICAgICByZXNBcnJheS5wdXNoKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnNlcmlhbGl6ZVJlY3Vyc2l2ZShpdGVtTW9kZWwuZ3JvdXAsIHN1YkFycmF5LmF0KGkpIGFzIEZvcm1Hcm91cClcclxuICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmVzdWx0W3N1Yk1vZGVsLmlkXSA9IHJlc0FycmF5O1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHN1Yk1vZGVsIGluc3RhbmNlb2YgRHluYW1pY0Zvcm1Hcm91cE1vZGVsKSB7XHJcbiAgICAgICAgICAgICAgICByZXN1bHRbc3ViTW9kZWwuaWRdID0gYXdhaXQgdGhpcy5zZXJpYWxpemVSZWN1cnNpdmUoc3ViTW9kZWwuZ3JvdXAsIHN1YkNvbnRyb2wgYXMgRm9ybUdyb3VwKTtcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChzdWJNb2RlbCBpbnN0YW5jZW9mIER5bmFtaWNJbnB1dE1vZGVsICYmICFPYmplY3RVdGlscy5pc051bGxPclVuZGVmaW5lZChzdWJDb250cm9sLnZhbHVlKSkge1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0W3N1Yk1vZGVsLmlkXSA9IHN1Yk1vZGVsLmlucHV0VHlwZSA9PSBcIm51bWJlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgPyBwYXJzZUZsb2F0KChgJHtzdWJDb250cm9sLnZhbHVlfWAgfHwgXCIwXCIpLnJlcGxhY2UoLywvZ2ksIFwiLlwiKSkgPz8gbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgIDogc3ViQ29udHJvbC52YWx1ZTtcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJlc3VsdFtzdWJNb2RlbC5pZF0gPSBzdWJDb250cm9sLnZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBub3RpZnlDaGFuZ2VzUmVjdXJzaXZlKGZvcm1Nb2RlbDogRHluYW1pY0Zvcm1Nb2RlbCwgZm9ybUdyb3VwOiBGb3JtR3JvdXAsIHJvb3Q6IER5bmFtaWNGb3JtTW9kZWwpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIWZvcm1Nb2RlbCB8fCAhZm9ybUdyb3VwKSByZXR1cm47XHJcbiAgICAgICAgZm9yIChjb25zdCBpIGluIGZvcm1Nb2RlbCkge1xyXG4gICAgICAgICAgICBjb25zdCBzdWJNb2RlbCA9IGZvcm1Nb2RlbFtpXSBhcyBEeW5hbWljRm9ybVZhbHVlQ29udHJvbE1vZGVsPGFueT47XHJcbiAgICAgICAgICAgIGNvbnN0IHN1YkNvbnRyb2wgPSB0aGlzLmZpbmRDb250cm9sQnlNb2RlbChzdWJNb2RlbCwgZm9ybUdyb3VwKTtcclxuICAgICAgICAgICAgaWYgKHN1Yk1vZGVsIGluc3RhbmNlb2YgRHluYW1pY0Zvcm1BcnJheU1vZGVsQmFzZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbGVuZ3RoID0gQXJyYXkuaXNBcnJheShzdWJDb250cm9sLnZhbHVlKSA/IHN1YkNvbnRyb2wudmFsdWUubGVuZ3RoIDogMDtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHN1YkFycmF5ID0gc3ViQ29udHJvbCBhcyBGb3JtQXJyYXk7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXRlbU1vZGVsID0gc3ViTW9kZWwuZ2V0KGkpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlc1JlY3Vyc2l2ZShpdGVtTW9kZWwuZ3JvdXAsIHN1YkFycmF5LmF0KGkpIGFzIEZvcm1Hcm91cCwgcm9vdCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoc3ViTW9kZWwgaW5zdGFuY2VvZiBEeW5hbWljRm9ybUdyb3VwTW9kZWwpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlc1JlY3Vyc2l2ZShzdWJNb2RlbC5ncm91cCwgc3ViQ29udHJvbCBhcyBGb3JtR3JvdXAsIHJvb3QpO1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy51cGRhdGVTZWxlY3RPcHRpb25zKHN1Yk1vZGVsLCBzdWJDb250cm9sLCByb290KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHNob3dFcnJvcnNGb3JHcm91cChmb3JtR3JvdXA6IEZvcm1Hcm91cCk6IHZvaWQge1xyXG4gICAgICAgIGlmICghZm9ybUdyb3VwKSByZXR1cm47XHJcbiAgICAgICAgZm9ybUdyb3VwLm1hcmtBc1RvdWNoZWQoe29ubHlTZWxmOiB0cnVlfSk7XHJcbiAgICAgICAgY29uc3QgY29udHJvbHMgPSBPYmplY3Qua2V5cyhmb3JtR3JvdXAuY29udHJvbHMpLm1hcChpZCA9PiBmb3JtR3JvdXAuY29udHJvbHNbaWRdKTtcclxuICAgICAgICB0aGlzLnNob3dFcnJvcnNGb3JDb250cm9scyhjb250cm9scyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHNob3dFcnJvcnNGb3JDb250cm9scyhjb250cm9sczogQWJzdHJhY3RDb250cm9sW10pOiB2b2lkIHtcclxuICAgICAgICBjb250cm9scy5mb3JFYWNoKGNvbnRyb2wgPT4ge1xyXG4gICAgICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEZvcm1Hcm91cCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zaG93RXJyb3JzRm9yR3JvdXAoY29udHJvbCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29udHJvbC5tYXJrQXNUb3VjaGVkKHtvbmx5U2VsZjogdHJ1ZX0pO1xyXG4gICAgICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEZvcm1BcnJheSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zaG93RXJyb3JzRm9yQ29udHJvbHMoY29udHJvbC5jb250cm9scyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBnZXRGb3JtTW9kZWxGb3JTY2hlbWEobmFtZTogc3RyaW5nLCBjdXN0b21pemVNb2RlbD86IEZvcm1Nb2RlbEN1c3RvbWl6ZXIpOiBQcm9taXNlPER5bmFtaWNGb3JtTW9kZWw+IHtcclxuICAgICAgICB0aGlzLmFwaS5jYWNoZSA9IHt9O1xyXG4gICAgICAgIHRoaXMuc2NoZW1hcyA9IGF3YWl0IHRoaXMub3BlbkFwaS5nZXRTY2hlbWFzKCk7XHJcbiAgICAgICAgY29uc3QgY3VzdG9taXplTW9kZWxzOiBGb3JtTW9kZWxDdXN0b21pemVyV3JhcCA9IChcclxuICAgICAgICAgICAgcHJvcGVydHk6IElPcGVuQXBpU2NoZW1hUHJvcGVydHksIHNjaGVtYTogSU9wZW5BcGlTY2hlbWEsXHJcbiAgICAgICAgICAgIG1vZGVsVHlwZTogTW9kZWxUeXBlLCBjb25maWc6IER5bmFtaWNGb3JtQ29udHJvbE1vZGVsQ29uZmlnKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IG1vZGVsID0gbmV3IG1vZGVsVHlwZShjb25maWcpO1xyXG4gICAgICAgICAgICBpZiAoIU9iamVjdFV0aWxzLmlzRnVuY3Rpb24oY3VzdG9taXplTW9kZWwpKSByZXR1cm4gW21vZGVsXTtcclxuICAgICAgICAgICAgY29uc3QgcmVzID0gY3VzdG9taXplTW9kZWwocHJvcGVydHksIHNjaGVtYSwgbW9kZWwsIGNvbmZpZywgdGhpcy5pbmplY3Rvcik7XHJcbiAgICAgICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHJlcykgPyByZXMgOiBbcmVzXTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHJldHVybiB0aGlzLmdldEZvcm1Nb2RlbEZvclNjaGVtYURlZih0aGlzLnNjaGVtYXNbbmFtZV0sIGN1c3RvbWl6ZU1vZGVscyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGdldEZvcm1Nb2RlbEZvclNjaGVtYURlZihzY2hlbWE6IElPcGVuQXBpU2NoZW1hLCBjdXN0b21pemVNb2RlbHM6IEZvcm1Nb2RlbEN1c3RvbWl6ZXJXcmFwKTogRHluYW1pY0Zvcm1Nb2RlbCB7XHJcbiAgICAgICAgaWYgKCFzY2hlbWEpXHJcbiAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoc2NoZW1hLnByb3BlcnRpZXMgfHwge30pO1xyXG4gICAgICAgIGNvbnN0IGNvbnRyb2xzOiBEeW5hbWljRm9ybU1vZGVsID0gW107XHJcbiAgICAgICAgZm9yIChjb25zdCBwIG9mIGtleXMpIHtcclxuICAgICAgICAgICAgY29uc3QgcHJvcGVydHkgPSBzY2hlbWEucHJvcGVydGllc1twXTtcclxuICAgICAgICAgICAgY29udHJvbHMucHVzaCguLi50aGlzLmdldEZvcm1Db250cm9sTW9kZWxzKHByb3BlcnR5LCBzY2hlbWEsIGN1c3RvbWl6ZU1vZGVscykpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gY29udHJvbHMuZmlsdGVyKHQgPT4gbnVsbCAhPT0gdCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGdldEZvcm1Db250cm9sTW9kZWxzKHByb3BlcnR5OiBJT3BlbkFwaVNjaGVtYVByb3BlcnR5LCBzY2hlbWE6IElPcGVuQXBpU2NoZW1hLCBjdXN0b21pemVNb2RlbHM6IEZvcm1Nb2RlbEN1c3RvbWl6ZXJXcmFwKTogRHluYW1pY0Zvcm1Db250cm9sTW9kZWxbXSB7XHJcbiAgICAgICAgY29uc3QgJGVudW0gPSBwcm9wZXJ0eS5pdGVtcz8uZW51bSB8fCBwcm9wZXJ0eS5lbnVtO1xyXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KCRlbnVtKSB8fCBpc1N0cmluZ1dpdGhWYWwocHJvcGVydHkub3B0aW9uc1BhdGgpIHx8IGlzU3RyaW5nV2l0aFZhbChwcm9wZXJ0eS5lbmRwb2ludCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGN1c3RvbWl6ZU1vZGVscyhwcm9wZXJ0eSwgc2NoZW1hLCBEeW5hbWljU2VsZWN0TW9kZWwsIHRoaXMuZ2V0Rm9ybVNlbGVjdENvbmZpZyhwcm9wZXJ0eSwgc2NoZW1hKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHN3aXRjaCAocHJvcGVydHkudHlwZSkge1xyXG4gICAgICAgICAgICBjYXNlIFwic3RyaW5nXCI6XHJcbiAgICAgICAgICAgIGNhc2UgXCJudW1iZXJcIjpcclxuICAgICAgICAgICAgY2FzZSBcImludGVnZXJcIjpcclxuICAgICAgICAgICAgICAgIHJldHVybiBjdXN0b21pemVNb2RlbHMocHJvcGVydHksIHNjaGVtYSwgRHluYW1pY0lucHV0TW9kZWwsIHRoaXMuZ2V0Rm9ybUlucHV0Q29uZmlnKHByb3BlcnR5LCBzY2hlbWEpKTtcclxuICAgICAgICAgICAgY2FzZSBcInRleHRhcmVhXCI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY3VzdG9taXplTW9kZWxzKHByb3BlcnR5LCBzY2hlbWEsIER5bmFtaWNUZXh0QXJlYU1vZGVsLCB0aGlzLmdldEZvcm1UZXh0YXJlYUNvbmZpZyhwcm9wZXJ0eSwgc2NoZW1hKSk7XHJcbiAgICAgICAgICAgIGNhc2UgXCJib29sZWFuXCI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY3VzdG9taXplTW9kZWxzKHByb3BlcnR5LCBzY2hlbWEsIER5bmFtaWNDaGVja2JveE1vZGVsLCB0aGlzLmdldEZvcm1DaGVja2JveENvbmZpZyhwcm9wZXJ0eSwgc2NoZW1hKSk7XHJcbiAgICAgICAgICAgIGNhc2UgXCJhcnJheVwiOlxyXG4gICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5Lml0ZW1zPy4kcmVmIHx8IHByb3BlcnR5LiRyZWYpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3VzdG9taXplTW9kZWxzKHByb3BlcnR5LCBzY2hlbWEsIER5bmFtaWNGb3JtQXJyYXlNb2RlbCwgdGhpcy5nZXRGb3JtQXJyYXlDb25maWcocHJvcGVydHksIHNjaGVtYSwgY3VzdG9taXplTW9kZWxzKSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjdXN0b21pemVNb2RlbHMocHJvcGVydHksIHNjaGVtYSwgRHluYW1pY0lucHV0TW9kZWwsIHRoaXMuZ2V0Rm9ybUlucHV0Q29uZmlnKHByb3BlcnR5LCBzY2hlbWEpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2FzZSBcImZpbGVcIjpcclxuICAgICAgICAgICAgICAgIHJldHVybiBjdXN0b21pemVNb2RlbHMocHJvcGVydHksIHNjaGVtYSwgRHluYW1pY0ZpbGVVcGxvYWRNb2RlbCwgdGhpcy5nZXRGb3JtVXBsb2FkQ29uZmlnKHByb3BlcnR5LCBzY2hlbWEpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHByb3BlcnR5LiRyZWYpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGN1c3RvbWl6ZU1vZGVscyhwcm9wZXJ0eSwgc2NoZW1hLCBEeW5hbWljRm9ybUdyb3VwTW9kZWwsIHRoaXMuZ2V0Rm9ybUdyb3VwQ29uZmlnKHByb3BlcnR5LCBzY2hlbWEsIGN1c3RvbWl6ZU1vZGVscykpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gW107XHJcbiAgICB9XHJcblxyXG4gICAgZmluZE1vZGVsQnlQYXRoKHBhcmVudDogRHluYW1pY1BhdGhhYmxlIHwgRHluYW1pY0Zvcm1Nb2RlbCwgcGF0aDogc3RyaW5nW10pOiBEeW5hbWljUGF0aGFibGUge1xyXG4gICAgICAgIGlmIChwYXRoLmxlbmd0aCA9PSAwKSByZXR1cm4gcGFyZW50IGFzIER5bmFtaWNQYXRoYWJsZTtcclxuICAgICAgICBjb25zdCBuZXh0ID0gcGF0aC5zaGlmdCgpIGFzIGFueTtcclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShwYXJlbnQpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZpbmRNb2RlbEJ5UGF0aChwYXJlbnQuZmluZCh0ID0+IHQuaWQgPT0gbmV4dCksIHBhdGgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgRHluYW1pY0Zvcm1Hcm91cE1vZGVsKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZpbmRNb2RlbEJ5UGF0aChwYXJlbnQuZ3JvdXAuZmluZCh0ID0+IHQuaWQgPT0gbmV4dCksIHBhdGgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgRHluYW1pY0Zvcm1BcnJheU1vZGVsKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZpbmRNb2RlbEJ5UGF0aChwYXJlbnQuZ3JvdXBzLmZpbmQodCA9PiB0LmluZGV4ID09IG5leHQpLCBwYXRoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHBhcmVudDtcclxuICAgIH1cclxuXHJcbiAgICBnZXRGb3JtQ29udHJvbENvbmZpZyhwcm9wZXJ0eTogSU9wZW5BcGlTY2hlbWFQcm9wZXJ0eSwgc2NoZW1hOiBJT3BlbkFwaVNjaGVtYSk6IER5bmFtaWNGb3JtVmFsdWVDb250cm9sTW9kZWxDb25maWc8YW55PiB7XHJcbiAgICAgICAgY29uc3QgdmFsaWRhdG9ycyA9IHRoaXMuZ2V0VmFsaWRhdG9ycyhwcm9wZXJ0eSwgc2NoZW1hKTtcclxuICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2VzID0gT2JqZWN0LmtleXModmFsaWRhdG9ycykucmVkdWNlKChyZXMsIGtleSkgPT4ge1xyXG4gICAgICAgICAgICByZXNba2V5XSA9IGBlcnJvci4ke2tleX1gO1xyXG4gICAgICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgICAgIH0sIHt9KTtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBpZDogcHJvcGVydHkuaWQsXHJcbiAgICAgICAgICAgIGxhYmVsOiBPYmplY3RVdGlscy5pc1N0cmluZyhwcm9wZXJ0eS5sYWJlbCkgPyBwcm9wZXJ0eS5sYWJlbCA6IHByb3BlcnR5LmlkLFxyXG4gICAgICAgICAgICBoaWRkZW46IHByb3BlcnR5LmhpZGRlbixcclxuICAgICAgICAgICAgZGlzYWJsZWQ6IHByb3BlcnR5LmRpc2FibGVkLFxyXG4gICAgICAgICAgICB2YWxpZGF0b3JzLFxyXG4gICAgICAgICAgICBlcnJvck1lc3NhZ2VzLFxyXG4gICAgICAgICAgICBhZGRpdGlvbmFsOiBPYmplY3QuYXNzaWduKHt9LCBwcm9wZXJ0eSlcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIGdldEZvcm1BcnJheUNvbmZpZyhwcm9wZXJ0eTogSU9wZW5BcGlTY2hlbWFQcm9wZXJ0eSwgc2NoZW1hOiBJT3BlbkFwaVNjaGVtYSwgY3VzdG9taXplTW9kZWxzOiBGb3JtTW9kZWxDdXN0b21pemVyV3JhcCk6IER5bmFtaWNGb3JtQXJyYXlNb2RlbENvbmZpZyB7XHJcbiAgICAgICAgY29uc3QgcmVmID0gcHJvcGVydHkuaXRlbXM/LiRyZWYgfHwgcHJvcGVydHkuJHJlZiB8fCBcIlwiO1xyXG4gICAgICAgIGNvbnN0IHN1YlNjaGVtYSA9IHRoaXMuc2NoZW1hc1tyZWYuc3BsaXQoXCIvXCIpLnBvcCgpXTtcclxuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihcclxuICAgICAgICAgICAgdGhpcy5nZXRGb3JtQ29udHJvbENvbmZpZyhwcm9wZXJ0eSwgc2NoZW1hKSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgZ3JvdXBGYWN0b3J5OiAoKSA9PiB0aGlzLmdldEZvcm1Nb2RlbEZvclNjaGVtYURlZihzdWJTY2hlbWEsIGN1c3RvbWl6ZU1vZGVscyksXHJcbiAgICAgICAgICAgICAgICB1c2VUYWJzOiBwcm9wZXJ0eS51c2VUYWJzIHx8IGZhbHNlXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGdldEZvcm1Hcm91cENvbmZpZyhwcm9wZXJ0eTogSU9wZW5BcGlTY2hlbWFQcm9wZXJ0eSwgc2NoZW1hOiBJT3BlbkFwaVNjaGVtYSwgY3VzdG9taXplTW9kZWxzOiBGb3JtTW9kZWxDdXN0b21pemVyV3JhcCk6IER5bmFtaWNGb3JtR3JvdXBNb2RlbENvbmZpZyB7XHJcbiAgICAgICAgY29uc3QgcmVmID0gcHJvcGVydHkuJHJlZiB8fCBcIlwiO1xyXG4gICAgICAgIGNvbnN0IHN1YlNjaGVtYSA9IHRoaXMuc2NoZW1hc1tyZWYuc3BsaXQoXCIvXCIpLnBvcCgpXTtcclxuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih0aGlzLmdldEZvcm1Db250cm9sQ29uZmlnKHByb3BlcnR5LCBzY2hlbWEpLCB7Z3JvdXA6IHRoaXMuZ2V0Rm9ybU1vZGVsRm9yU2NoZW1hRGVmKHN1YlNjaGVtYSwgY3VzdG9taXplTW9kZWxzKX0pO1xyXG4gICAgfVxyXG5cclxuICAgIGdldEZvcm1JbnB1dENvbmZpZyhwcm9wZXJ0eTogSU9wZW5BcGlTY2hlbWFQcm9wZXJ0eSwgc2NoZW1hOiBJT3BlbkFwaVNjaGVtYSk6IER5bmFtaWNJbnB1dE1vZGVsQ29uZmlnIHtcclxuICAgICAgICBsZXQgaW5wdXRUeXBlID0gU3RyaW5nVXRpbHMuaGFzKHByb3BlcnR5LmlkLCBcInBhc3N3b3JkXCIsIFwiUGFzc3dvcmRcIikgPyBcInBhc3N3b3JkXCIgOiAocHJvcGVydHkuZm9ybWF0IHx8IHByb3BlcnR5Lml0ZW1zPy50eXBlIHx8IHByb3BlcnR5LnR5cGUpO1xyXG4gICAgICAgIHN3aXRjaCAoaW5wdXRUeXBlKSB7XHJcbiAgICAgICAgICAgIGNhc2UgXCJib29sZWFuXCI6XHJcbiAgICAgICAgICAgICAgICBpbnB1dFR5cGUgPSBcImNoZWNrYm94XCI7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBcInRleHRhcmVhXCI6XHJcbiAgICAgICAgICAgICAgICBpbnB1dFR5cGUgPSBcInRleHRhcmVhXCI7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBcImludGVnZXJcIjpcclxuICAgICAgICAgICAgICAgIGlucHV0VHlwZSA9IFwibnVtYmVyXCI7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3Qgc3ViID0gcHJvcGVydHkudHlwZSA9PSBcImFycmF5XCIgPyBwcm9wZXJ0eS5pdGVtcyB8fCBwcm9wZXJ0eSA6IHByb3BlcnR5O1xyXG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKFxyXG4gICAgICAgICAgICB0aGlzLmdldEZvcm1Db250cm9sQ29uZmlnKHByb3BlcnR5LCBzY2hlbWEpLFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpbnB1dFR5cGUsXHJcbiAgICAgICAgICAgICAgICBhdXRvQ29tcGxldGU6IHByb3BlcnR5LmF1dG9Db21wbGV0ZSB8fCBcIm9mZlwiLFxyXG4gICAgICAgICAgICAgICAgbXVsdGlwbGU6IHByb3BlcnR5LnR5cGUgPT0gXCJhcnJheVwiLFxyXG4gICAgICAgICAgICAgICAgYWNjZXB0OiBPYmplY3RVdGlscy5pc1N0cmluZyhwcm9wZXJ0eS5hY2NlcHQpID8gcHJvcGVydHkuYWNjZXB0IDogbnVsbCxcclxuICAgICAgICAgICAgICAgIG1hc2s6IE9iamVjdFV0aWxzLmlzU3RyaW5nKHByb3BlcnR5Lm1hc2spID8gcHJvcGVydHkubWFzayA6IG51bGwsXHJcbiAgICAgICAgICAgICAgICBwYXR0ZXJuOiBPYmplY3RVdGlscy5pc1N0cmluZyhwcm9wZXJ0eS5wYXR0ZXJuKSA/IHByb3BlcnR5LnBhdHRlcm4gOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgc3RlcDogaXNOYU4oc3ViLnN0ZXApID8gKGlzTmFOKHByb3BlcnR5LnN0ZXApID8gMSA6IHByb3BlcnR5LnN0ZXApIDogc3ViLnN0ZXAsXHJcbiAgICAgICAgICAgICAgICBtaW46IGlzTmFOKHN1Yi5taW5pbXVtKSA/IE51bWJlci5NSU5fU0FGRV9JTlRFR0VSIDogc3ViLm1pbmltdW0sXHJcbiAgICAgICAgICAgICAgICBtYXg6IGlzTmFOKHN1Yi5tYXhpbXVtKSA/IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSIDogc3ViLm1heGltdW0sXHJcbiAgICAgICAgICAgICAgICBtaW5MZW5ndGg6IGlzTmFOKHN1Yi5taW5MZW5ndGgpID8gTnVtYmVyLk1JTl9TQUZFX0lOVEVHRVIgOiBzdWIubWluTGVuZ3RoLFxyXG4gICAgICAgICAgICAgICAgbWF4TGVuZ3RoOiBpc05hTihzdWIubWF4TGVuZ3RoKSA/IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSIDogc3ViLm1heExlbmd0aCxcclxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyOiBwcm9wZXJ0eS5wbGFjZWhvbGRlciB8fCBcIlwiXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGdldEZvcm1UZXh0YXJlYUNvbmZpZyhwcm9wZXJ0eTogSU9wZW5BcGlTY2hlbWFQcm9wZXJ0eSwgc2NoZW1hOiBJT3BlbkFwaVNjaGVtYSk6IER5bmFtaWNUZXh0QXJlYU1vZGVsQ29uZmlnIHtcclxuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihcclxuICAgICAgICAgICAgdGhpcy5nZXRGb3JtQ29udHJvbENvbmZpZyhwcm9wZXJ0eSwgc2NoZW1hKSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgY29sczogcHJvcGVydHkuY29scyB8fCBudWxsLFxyXG4gICAgICAgICAgICAgICAgcm93czogcHJvcGVydHkucm93cyB8fCAxMCxcclxuICAgICAgICAgICAgICAgIHdyYXA6IHByb3BlcnR5LndyYXAgfHwgZmFsc2UsXHJcbiAgICAgICAgICAgICAgICBhdXRvQ29tcGxldGU6IHByb3BlcnR5LmF1dG9Db21wbGV0ZSB8fCBcIm9mZlwiLFxyXG4gICAgICAgICAgICAgICAgbXVsdGlwbGU6IHByb3BlcnR5LnR5cGUgPT0gXCJhcnJheVwiXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGdldEZvcm1TZWxlY3RDb25maWcocHJvcGVydHk6IElPcGVuQXBpU2NoZW1hUHJvcGVydHksIHNjaGVtYTogSU9wZW5BcGlTY2hlbWEpOiBEeW5hbWljU2VsZWN0TW9kZWxDb25maWc8YW55PiB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oXHJcbiAgICAgICAgICAgIHRoaXMuZ2V0Rm9ybUNvbnRyb2xDb25maWcocHJvcGVydHksIHNjaGVtYSksXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IHRoaXMuZ2V0Rm9ybVNlbGVjdE9wdGlvbnMocHJvcGVydHksIHNjaGVtYSksXHJcbiAgICAgICAgICAgICAgICBtdWx0aXBsZTogcHJvcGVydHkudHlwZSA9PSBcImFycmF5XCJcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0Rm9ybUNoZWNrYm94Q29uZmlnKHByb3BlcnR5OiBJT3BlbkFwaVNjaGVtYVByb3BlcnR5LCBzY2hlbWE6IElPcGVuQXBpU2NoZW1hKTogRHluYW1pY0NoZWNrYm94TW9kZWxDb25maWcge1xyXG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKFxyXG4gICAgICAgICAgICB0aGlzLmdldEZvcm1Db250cm9sQ29uZmlnKHByb3BlcnR5LCBzY2hlbWEpLFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpbmRldGVybWluYXRlOiBwcm9wZXJ0eS5pbmRldGVybWluYXRlID09PSB0cnVlXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBhc3luYyB0cmFuc2xhdGVPcHRpb25zKG9wdGlvbnM6IER5bmFtaWNGb3JtT3B0aW9uQ29uZmlnPGFueT5bXSk6IFByb21pc2U8RHluYW1pY0Zvcm1PcHRpb25Db25maWc8YW55PltdPiB7XHJcbiAgICAgICAgaWYgKCFvcHRpb25zKSByZXR1cm4gW107XHJcbiAgICAgICAgZm9yIChjb25zdCBvcHRpb24gb2Ygb3B0aW9ucykge1xyXG4gICAgICAgICAgICBvcHRpb24ubGFiZWwgPSBhd2FpdCB0aGlzLmxhbmd1YWdlLmdldFRyYW5zbGF0aW9uKG9wdGlvbi5sYWJlbCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBvcHRpb25zO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBnZXRGb3JtU2VsZWN0T3B0aW9ucyhwcm9wZXJ0eTogSU9wZW5BcGlTY2hlbWFQcm9wZXJ0eSwgc2NoZW1hOiBJT3BlbkFwaVNjaGVtYSkge1xyXG4gICAgICAgIGNvbnN0ICRlbnVtID0gcHJvcGVydHkuaXRlbXM/LmVudW0gfHwgcHJvcGVydHkuZW51bTtcclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSgkZW51bSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBGb3JtU2VsZWN0U3ViamVjdCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBvcHRpb25zID0gJGVudW0ubWFwKHZhbHVlID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBsYWJlbCA9IHByb3BlcnR5LnRyYW5zbGF0YWJsZSA/IGAke3Byb3BlcnR5LmlkfS4ke3ZhbHVlfWAgOiBgJHt2YWx1ZX1gO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7dmFsdWUsIGxhYmVsfTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNsYXRlT3B0aW9ucyhvcHRpb25zKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChpc1N0cmluZ1dpdGhWYWwocHJvcGVydHkub3B0aW9uc1BhdGgpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgRm9ybVNlbGVjdFN1YmplY3QoKGZvcm1Nb2RlbCwgY29udHJvbCwgcm9vdCwgaW5kZXhlcykgPT4ge1xyXG4gICAgICAgICAgICAgICAgbGV0IHBhdGggPSBwcm9wZXJ0eS5vcHRpb25zUGF0aCBhcyBzdHJpbmc7XHJcbiAgICAgICAgICAgICAgICBsZXQgdGFyZ2V0ID0gY29udHJvbDtcclxuICAgICAgICAgICAgICAgIGxldCBtb2RlbDogRHluYW1pY1BhdGhhYmxlIHwgRHluYW1pY0Zvcm1Nb2RlbCA9IGZvcm1Nb2RlbDtcclxuICAgICAgICAgICAgICAgIGlmIChwYXRoLnN0YXJ0c1dpdGgoXCIkcm9vdFwiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHBhdGggPSBwYXRoLnN1YnN0cig1KTtcclxuICAgICAgICAgICAgICAgICAgICB3aGlsZSAodGFyZ2V0LnBhcmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSB0YXJnZXQucGFyZW50O1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBtb2RlbCA9IHJvb3Q7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB3aGlsZSAocGF0aC5zdGFydHNXaXRoKFwiLlwiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHBhdGggPSBwYXRoLnN1YnN0cigxKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0LnBhcmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSB0YXJnZXQucGFyZW50O1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBtb2RlbCA9IChtb2RlbCBhcyBEeW5hbWljUGF0aGFibGUpLnBhcmVudCB8fCByb290O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXMoaW5kZXhlcykuZm9yRWFjaChrZXkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHBhdGggPSBwYXRoLnJlcGxhY2Uoa2V5LCBpbmRleGVzW2tleV0pO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICBtb2RlbCA9IHRoaXMuZmluZE1vZGVsQnlQYXRoKG1vZGVsLCBwYXRoLnNwbGl0KFwiLlwiKSk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBtb2RlbE9wdGlvbnMgPSAobW9kZWwgaW5zdGFuY2VvZiBEeW5hbWljU2VsZWN0TW9kZWwgPyBtb2RlbC5vcHRpb25zIDogW10pIGFzIER5bmFtaWNGb3JtT3B0aW9uPGFueT5bXTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gT2JqZWN0VXRpbHMuZ2V0VmFsdWUodGFyZ2V0LnZhbHVlLCBwYXRoKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSAoIU9iamVjdFV0aWxzLmlzQXJyYXkodmFsdWUpID8gW10gOiB2YWx1ZSkubWFwKHZhbHVlID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBtb2RlbE9wdGlvbiA9IG1vZGVsT3B0aW9ucy5maW5kKHQgPT4gdC52YWx1ZSA9PSB2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHt2YWx1ZSwgbGFiZWw6IG1vZGVsT3B0aW9uPy5sYWJlbCB8fCB2YWx1ZX07XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZU9wdGlvbnMob3B0aW9ucyk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbmV3IEZvcm1TZWxlY3RTdWJqZWN0KGFzeW5jICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5hcGkuY2FjaGVbcHJvcGVydHkuZW5kcG9pbnRdID0gdGhpcy5hcGkuY2FjaGVbcHJvcGVydHkuZW5kcG9pbnRdIHx8IHRoaXMuYXBpLmxpc3QocHJvcGVydHkuZW5kcG9pbnQsIHRoaXMuYXBpLm1ha2VMaXN0UGFyYW1zKDEsIC0xKSkudGhlbihyZXN1bHQgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5pdGVtcy5tYXAoaSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHt2YWx1ZTogaS5pZCB8fCBpLl9pZCwgbGFiZWw6IGlbcHJvcGVydHkubGFiZWxGaWVsZF0gfHwgaS5sYWJlbCB8fCBpLmlkIHx8IGkuX2lkfTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IChhd2FpdCB0aGlzLmFwaS5jYWNoZVtwcm9wZXJ0eS5lbmRwb2ludF0pLm1hcCh0ID0+IE9iamVjdC5hc3NpZ24oe30sIHQpKTtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNsYXRlT3B0aW9ucyhvcHRpb25zKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgZ2V0Rm9ybVVwbG9hZENvbmZpZyhwcm9wZXJ0eTogSU9wZW5BcGlTY2hlbWFQcm9wZXJ0eSwgc2NoZW1hOiBJT3BlbkFwaVNjaGVtYSk6IER5bmFtaWNGaWxlVXBsb2FkTW9kZWxDb25maWcge1xyXG4gICAgICAgIGNvbnN0IHVybCA9IHRoaXMuYXBpLnVybChwcm9wZXJ0eS51cmwgfHwgXCJhc3NldHNcIik7XHJcbiAgICAgICAgY29uc3Qge2FjY2VwdCwgYXV0b1VwbG9hZCwgbWF4U2l6ZSwgbWluU2l6ZSwgcmVtb3ZlVXJsLCBzaG93RmlsZUxpc3R9ID0gcHJvcGVydHk7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24odGhpcy5nZXRGb3JtQ29udHJvbENvbmZpZyhwcm9wZXJ0eSwgc2NoZW1hKSwge1xyXG4gICAgICAgICAgICB1cmwsXHJcbiAgICAgICAgICAgIGFjY2VwdCxcclxuICAgICAgICAgICAgYXV0b1VwbG9hZCxcclxuICAgICAgICAgICAgbWF4U2l6ZSxcclxuICAgICAgICAgICAgbWluU2l6ZSxcclxuICAgICAgICAgICAgcmVtb3ZlVXJsLFxyXG4gICAgICAgICAgICBzaG93RmlsZUxpc3RcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgZ2V0VmFsaWRhdG9ycyhwcm9wZXJ0eTogSU9wZW5BcGlTY2hlbWFQcm9wZXJ0eSwgc2NoZW1hOiBJT3BlbkFwaVNjaGVtYSk6IER5bmFtaWNWYWxpZGF0b3JzQ29uZmlnIHtcclxuICAgICAgICBjb25zdCB2YWxpZGF0b3JzOiBEeW5hbWljVmFsaWRhdG9yc0NvbmZpZyA9IHt9O1xyXG4gICAgICAgIGlmIChPYmplY3RVdGlscy5pc0FycmF5KHNjaGVtYS5yZXF1aXJlZCkgJiYgc2NoZW1hLnJlcXVpcmVkLmluZGV4T2YocHJvcGVydHkuaWQpID49IDApIHtcclxuICAgICAgICAgICAgdmFsaWRhdG9ycy5yZXF1aXJlZCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuYWRkUHJvcGVydHlWYWxpZGF0b3JzKHZhbGlkYXRvcnMsIHByb3BlcnR5KTtcclxuICAgICAgICB0aGlzLmFkZEl0ZW1zVmFsaWRhdG9ycyh2YWxpZGF0b3JzLCBwcm9wZXJ0eS5pdGVtcyk7XHJcbiAgICAgICAgcmV0dXJuIHZhbGlkYXRvcnM7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGFkZFByb3BlcnR5VmFsaWRhdG9ycyh2YWxpZGF0b3JzOiBEeW5hbWljVmFsaWRhdG9yc0NvbmZpZywgcHJvcGVydHk6IElPcGVuQXBpU2NoZW1hUHJvcGVydHkpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIXByb3BlcnR5KSByZXR1cm47XHJcbiAgICAgICAgaWYgKCFpc05hTihwcm9wZXJ0eS5taW5MZW5ndGgpKSB7XHJcbiAgICAgICAgICAgIHZhbGlkYXRvcnMubWluTGVuZ3RoID0gcHJvcGVydHkubWluTGVuZ3RoO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWlzTmFOKHByb3BlcnR5Lm1heExlbmd0aCkpIHtcclxuICAgICAgICAgICAgdmFsaWRhdG9ycy5tYXhMZW5ndGggPSBwcm9wZXJ0eS5tYXhMZW5ndGg7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghaXNOYU4ocHJvcGVydHkubWluaW11bSkpIHtcclxuICAgICAgICAgICAgdmFsaWRhdG9ycy5taW4gPSBwcm9wZXJ0eS5taW5pbXVtO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWlzTmFOKHByb3BlcnR5Lm1heGltdW0pKSB7XHJcbiAgICAgICAgICAgIHZhbGlkYXRvcnMubWF4ID0gcHJvcGVydHkubWF4aW11bTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc3dpdGNoIChwcm9wZXJ0eS5mb3JtYXQpIHtcclxuICAgICAgICAgICAgY2FzZSBcImVtYWlsXCI6XHJcbiAgICAgICAgICAgICAgICB2YWxpZGF0b3JzLmVtYWlsID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgYWRkSXRlbXNWYWxpZGF0b3JzKHZhbGlkYXRvcnM6IER5bmFtaWNWYWxpZGF0b3JzQ29uZmlnLCBpdGVtczogSU9wZW5BcGlTY2hlbWFQcm9wZXJ0eSk6IHZvaWQge1xyXG4gICAgICAgIGlmICghaXRlbXMpIHJldHVybjtcclxuICAgICAgICBpZiAoIWlzTmFOKGl0ZW1zLm1pbkxlbmd0aCkpIHtcclxuICAgICAgICAgICAgdmFsaWRhdG9ycy5pdGVtc01pbkxlbmd0aCA9IGl0ZW1zLm1pbkxlbmd0aDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFpc05hTihpdGVtcy5tYXhMZW5ndGgpKSB7XHJcbiAgICAgICAgICAgIHZhbGlkYXRvcnMuaXRlbXNNYXhMZW5ndGggPSBpdGVtcy5tYXhMZW5ndGg7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghaXNOYU4oaXRlbXMubWluaW11bSkpIHtcclxuICAgICAgICAgICAgdmFsaWRhdG9ycy5pdGVtc01pblZhbHVlID0gaXRlbXMubWluaW11bTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFpc05hTihpdGVtcy5tYXhpbXVtKSkge1xyXG4gICAgICAgICAgICB2YWxpZGF0b3JzLml0ZW1zTWF4VmFsdWUgPSBpdGVtcy5tYXhpbXVtO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4iXX0=
48
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1mb3JtLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbmd4LWR5bmFtaWMtZm9ybS9zZXJ2aWNlcy9keW5hbWljLWZvcm0uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsd0JBQXdCLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFtQixNQUFNLGVBQWUsQ0FBQztBQUM3RyxPQUFPLEVBQ0gscUJBQXFCLEVBQUUsZUFBZSxFQUt6QyxNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUc3QyxNQUFNLE9BQU8sa0JBQWtCO0lBRTNCLFlBQW1ELFVBQWtDLEVBQ3hDLFNBQW9DLEVBQzdELFFBQWtDLEVBQzFCLFFBQWtCO1FBSEssZUFBVSxHQUFWLFVBQVUsQ0FBd0I7UUFDeEMsY0FBUyxHQUFULFNBQVMsQ0FBMkI7UUFDN0QsYUFBUSxHQUFSLFFBQVEsQ0FBMEI7UUFDMUIsYUFBUSxHQUFSLFFBQVEsQ0FBVTtJQUM5QyxDQUFDO0lBRUQsWUFBWSxDQUFDLE9BQTRCO1FBQ3JDLElBQUksQ0FBQyxPQUFPO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDMUIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDbkUsSUFBSSxTQUFTLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBRTtZQUN2QixNQUFNLElBQUksS0FBSyxDQUFDLHNDQUFzQyxJQUFJLENBQUMsU0FBUyxDQUFDO2dCQUNqRSxFQUFFLEVBQUUsT0FBTyxDQUFDLEVBQUU7Z0JBQ2QsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJO2dCQUNsQixJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUk7YUFDckIsQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUNUO1FBQ0QsaUJBQWlCO1FBQ2pCLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUE7UUFDckUsT0FBTyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDeEIsQ0FBQztJQUVELGVBQWUsQ0FBQyxHQUFxQixFQUFFLFFBQThCO1FBQ2pFLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNaLElBQUksQ0FBQyxRQUFRO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDM0IsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyx1QkFBdUIsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDMUUsT0FBTyxHQUFHLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFFBQVEsQ0FBQztJQUNqRCxDQUFDO0lBRUQsV0FBVyxDQUFDLEdBQXFCO1FBQzdCLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNaLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3RFLE9BQU8sR0FBRyxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLENBQUM7SUFDakQsQ0FBQzs7O1lBbkNKLFVBQVU7Ozt3Q0FHTSxNQUFNLFNBQUMscUJBQXFCO1lBYm1CLElBQUksdUJBY25ELE1BQU0sU0FBQyxlQUFlO1lBZC9CLHdCQUF3QjtZQUFzQixRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsIEluamVjdCwgSW5qZWN0YWJsZSwgSW5qZWN0b3IsIFR5cGUsIFZpZXdDb250YWluZXJSZWZ9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7XHJcbiAgICBGT1JNX0NPTlRST0xfUFJPVklERVIsIEZPUk1fR1JPVVBfVFlQRSxcclxuICAgIElEeW5hbWljRm9ybUNvbnRyb2wsXHJcbiAgICBJRm9ybUNvbnRyb2xDb21wb25lbnQsXHJcbiAgICBJRm9ybUNvbnRyb2xQcm92aWRlcixcclxuICAgIElGb3JtR3JvdXBDb21wb25lbnRcclxufSBmcm9tIFwiLi4vY29tbW9uLXR5cGVzXCI7XHJcbmltcG9ydCB7T2JqZWN0VXRpbHN9IGZyb20gXCJAc3RlbXkvbmd4LXV0aWxzXCI7XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBEeW5hbWljRm9ybVNlcnZpY2Uge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKEBJbmplY3QoRk9STV9DT05UUk9MX1BST1ZJREVSKSBwcml2YXRlIGNvbXBvbmVudHM6IElGb3JtQ29udHJvbFByb3ZpZGVyW10sXHJcbiAgICAgICAgICAgICAgICBASW5qZWN0KEZPUk1fR1JPVVBfVFlQRSkgcHJpdmF0ZSBncm91cFR5cGU6IFR5cGU8SUZvcm1Hcm91cENvbXBvbmVudD4sXHJcbiAgICAgICAgICAgICAgICBwcml2YXRlIHJlc29sdmVyOiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXHJcbiAgICAgICAgICAgICAgICBwdWJsaWMgcmVhZG9ubHkgaW5qZWN0b3I6IEluamVjdG9yKSB7XHJcbiAgICB9XHJcblxyXG4gICAgZmluZFByb3ZpZGVyKGNvbnRyb2w6IElEeW5hbWljRm9ybUNvbnRyb2wpOiBJRm9ybUNvbnRyb2xQcm92aWRlciB7XHJcbiAgICAgICAgaWYgKCFjb250cm9sKSByZXR1cm4gbnVsbDtcclxuICAgICAgICBjb25zdCBwcm92aWRlcnMgPSB0aGlzLmNvbXBvbmVudHMuZmlsdGVyKHAgPT4gcC5hY2NlcHRvcihjb250cm9sKSk7XHJcbiAgICAgICAgaWYgKHByb3ZpZGVycy5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIGNvbXBvbmVudCBwcm92aWRlciBmb3IgY29udHJvbDogJHtKU09OLnN0cmluZ2lmeSh7XHJcbiAgICAgICAgICAgICAgICBpZDogY29udHJvbC5pZCxcclxuICAgICAgICAgICAgICAgIHR5cGU6IGNvbnRyb2wudHlwZSxcclxuICAgICAgICAgICAgICAgIGRhdGE6IGNvbnRyb2wuZGF0YVxyXG4gICAgICAgICAgICB9KX1gKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gU29ydCBwcm92aWRlcnNcclxuICAgICAgICBwcm92aWRlcnMuc29ydCgoYSwgYikgPT4gT2JqZWN0VXRpbHMuY29tcGFyZShhLnByaW9yaXR5LCBiLnByaW9yaXR5KSlcclxuICAgICAgICByZXR1cm4gcHJvdmlkZXJzWzBdO1xyXG4gICAgfVxyXG5cclxuICAgIGNyZWF0ZUNvbXBvbmVudCh2Y3I6IFZpZXdDb250YWluZXJSZWYsIHByb3ZpZGVyOiBJRm9ybUNvbnRyb2xQcm92aWRlcik6IElGb3JtQ29udHJvbENvbXBvbmVudCB7XHJcbiAgICAgICAgdmNyLmNsZWFyKCk7XHJcbiAgICAgICAgaWYgKCFwcm92aWRlcikgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgY29uc3QgZmFjdG9yeSA9IHRoaXMucmVzb2x2ZXIucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkocHJvdmlkZXIuY29tcG9uZW50KTtcclxuICAgICAgICByZXR1cm4gdmNyLmNyZWF0ZUNvbXBvbmVudChmYWN0b3J5KS5pbnN0YW5jZTtcclxuICAgIH1cclxuXHJcbiAgICBjcmVhdGVHcm91cCh2Y3I6IFZpZXdDb250YWluZXJSZWYpOiBJRm9ybUdyb3VwQ29tcG9uZW50IHtcclxuICAgICAgICB2Y3IuY2xlYXIoKTtcclxuICAgICAgICBjb25zdCBmYWN0b3J5ID0gdGhpcy5yZXNvbHZlci5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeSh0aGlzLmdyb3VwVHlwZSk7XHJcbiAgICAgICAgcmV0dXJuIHZjci5jcmVhdGVDb21wb25lbnQoZmFjdG9yeSkuaW5zdGFuY2U7XHJcbiAgICB9XHJcbn1cclxuIl19