@mediusinc/mng-commons 0.3.3 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/esm2020/lib/api/models/builders/query-param.builder.mjs +7 -2
  2. package/esm2020/lib/api/services/api.abstract.service.mjs +21 -10
  3. package/esm2020/lib/api/utils/object-serializer.util.mjs +7 -1
  4. package/esm2020/lib/components/action/action.component.mjs +3 -3
  5. package/esm2020/lib/components/form/formly/fields/formly-field-input/formly-field-input.component.mjs +3 -3
  6. package/esm2020/lib/components/form/formly/fields/formly-field-lookup-dialog/formly-field-lookup-dialog.component.mjs +3 -3
  7. package/esm2020/lib/components/layout/main-layout.component.mjs +1 -1
  8. package/esm2020/lib/components/layout/topbar.component.mjs +1 -1
  9. package/esm2020/lib/components/tableview/route/tableview-route.abstract.component.mjs +17 -5
  10. package/esm2020/lib/components/tableview/table/column-filter/column-filter.component.mjs +1 -10
  11. package/esm2020/lib/components/tableview/table/column-value/column-value.component.mjs +21 -7
  12. package/esm2020/lib/components/tableview/table/table.component.mjs +3 -3
  13. package/esm2020/lib/components/tableview/tableview.component.mjs +3 -3
  14. package/esm2020/lib/descriptors/column.descriptor.mjs +197 -0
  15. package/esm2020/lib/descriptors/editor.descriptor.mjs +3 -755
  16. package/esm2020/lib/descriptors/field.descriptor.interface.mjs +2 -0
  17. package/esm2020/lib/descriptors/field.descriptor.mjs +755 -0
  18. package/esm2020/lib/descriptors/filter.descriptor.mjs +237 -0
  19. package/esm2020/lib/descriptors/index.mjs +5 -1
  20. package/esm2020/lib/descriptors/table.descriptor.mjs +4 -403
  21. package/esm2020/lib/descriptors/tableview.descriptor.mjs +3 -3
  22. package/esm2020/lib/directives/component.directive.mjs +18 -2
  23. package/esm2020/lib/mng-commons.module.mjs +5 -5
  24. package/esm2020/lib/models/column-value.model.mjs +2 -0
  25. package/esm2020/lib/models/index.mjs +2 -1
  26. package/esm2020/lib/pipes/index.mjs +2 -2
  27. package/esm2020/lib/pipes/json-path.pipe.mjs +80 -0
  28. package/esm2020/lib/utils/model.util.mjs +16 -15
  29. package/esm2020/public-api.mjs +2 -1
  30. package/fesm2015/mediusinc-mng-commons.mjs +1416 -1282
  31. package/fesm2015/mediusinc-mng-commons.mjs.map +1 -1
  32. package/fesm2020/mediusinc-mng-commons.mjs +1411 -1279
  33. package/fesm2020/mediusinc-mng-commons.mjs.map +1 -1
  34. package/lib/api/models/builders/query-param.builder.d.ts +2 -1
  35. package/lib/api/services/api.abstract.service.d.ts +10 -5
  36. package/lib/api/utils/object-serializer.util.d.ts +4 -2
  37. package/lib/components/form/formly/fields/formly-field-lookup-dialog/formly-field-lookup-dialog.component.d.ts +1 -2
  38. package/lib/components/tableview/route/tableview-route.abstract.component.d.ts +5 -1
  39. package/lib/components/tableview/table/column-value/column-value.component.d.ts +5 -1
  40. package/lib/descriptors/column.descriptor.d.ts +66 -0
  41. package/lib/descriptors/editor.descriptor.d.ts +1 -299
  42. package/lib/descriptors/field.descriptor.d.ts +301 -0
  43. package/lib/descriptors/{editor.descriptor.interface.d.ts → field.descriptor.interface.d.ts} +0 -0
  44. package/lib/descriptors/filter.descriptor.d.ts +108 -0
  45. package/lib/descriptors/index.d.ts +4 -0
  46. package/lib/descriptors/table.descriptor.d.ts +5 -164
  47. package/lib/descriptors/tableview.descriptor.d.ts +4 -2
  48. package/lib/directives/component.directive.d.ts +5 -1
  49. package/lib/mng-commons.module.d.ts +2 -2
  50. package/lib/models/column-value.model.d.ts +4 -0
  51. package/lib/models/index.d.ts +1 -0
  52. package/lib/pipes/index.d.ts +1 -1
  53. package/lib/pipes/json-path.pipe.d.ts +13 -0
  54. package/lib/utils/model.util.d.ts +1 -0
  55. package/package.json +1 -1
  56. package/public-api.d.ts +1 -0
  57. package/scss/mng-overrides/_layout_action.scss +7 -0
  58. package/scss/mng-overrides/_layout_dialog.scss +17 -6
  59. package/scss/mng-overrides/_mixins.scss +60 -0
  60. package/scss/theme/default/_mng-variables-theme-dark.scss +2 -3
  61. package/scss/theme/default/_mng-variables-theme-light.scss +2 -3
  62. package/scss/theme/default/_mng-variables.scss +12 -0
  63. package/esm2020/lib/descriptors/editor.descriptor.interface.mjs +0 -2
  64. package/esm2020/lib/pipes/property-path.pipe.mjs +0 -36
  65. package/lib/pipes/property-path.pipe.d.ts +0 -7
@@ -0,0 +1,755 @@
1
+ import { Validators } from '@angular/forms';
2
+ import { Subject, of } from 'rxjs';
3
+ import { MngFormFieldEvent } from '../components/form/models';
4
+ import { LookupDataProvider, TableviewDataProvider } from '../data-providers';
5
+ import { EnumUtil, I18nUtil, ModelUtil, TypeUtil } from '../utils';
6
+ import { EditorDescriptor, FieldValidator, FilterLookupDescriptor } from './';
7
+ export class AGenericFieldDescriptor {
8
+ constructor(editor) {
9
+ this._config = {};
10
+ this._editor = editor;
11
+ }
12
+ get editor() {
13
+ return this._editor;
14
+ }
15
+ get config() {
16
+ return this._config;
17
+ }
18
+ withConfig(config) {
19
+ this._config = config;
20
+ return this;
21
+ }
22
+ }
23
+ export class AFieldDescriptor extends AGenericFieldDescriptor {
24
+ constructor(editor, property) {
25
+ super(editor);
26
+ this._required = false;
27
+ this._disabled = false;
28
+ this._validators = [];
29
+ this._className = '';
30
+ this._labelClassName = '';
31
+ this._inputClassName = '';
32
+ this._size = FieldDescriptor.SizeEnum.Normal;
33
+ this._eventsSubject = new Subject();
34
+ this._property = property;
35
+ this._label = I18nUtil.getModelPropertyKey(this._editor.model, property);
36
+ }
37
+ get property() {
38
+ return this._property;
39
+ }
40
+ get group() {
41
+ return this._group;
42
+ }
43
+ get label() {
44
+ return this._label;
45
+ }
46
+ get placeholder() {
47
+ return this._placeholder;
48
+ }
49
+ get helpText() {
50
+ return this._helpText;
51
+ }
52
+ get required() {
53
+ return this._required;
54
+ }
55
+ get disabled() {
56
+ return this._disabled;
57
+ }
58
+ get defaultValue() {
59
+ return this._defaultValue;
60
+ }
61
+ get getter() {
62
+ return this._getter;
63
+ }
64
+ get setter() {
65
+ return this._setter;
66
+ }
67
+ get validators() {
68
+ return this._validators;
69
+ }
70
+ get requiredExpression() {
71
+ return this._requiredExpression;
72
+ }
73
+ get disabledExpression() {
74
+ return this._disabledExpression;
75
+ }
76
+ get hiddenExpression() {
77
+ return this._hiddenExpression;
78
+ }
79
+ get className() {
80
+ return this._className;
81
+ }
82
+ get labelClassName() {
83
+ return this._labelClassName;
84
+ }
85
+ get inputClassName() {
86
+ return this._inputClassName;
87
+ }
88
+ get size() {
89
+ return this._size;
90
+ }
91
+ get isSizeSmall() {
92
+ return this._size === FieldDescriptor.SizeEnum.Small;
93
+ }
94
+ get isSizeLarge() {
95
+ return this._size === FieldDescriptor.SizeEnum.Large;
96
+ }
97
+ withLabel(label) {
98
+ this._label = label;
99
+ return this;
100
+ }
101
+ withPlaceholder(placeholder) {
102
+ this._placeholder = placeholder;
103
+ return this;
104
+ }
105
+ withHelpText(helpText) {
106
+ this._helpText = helpText;
107
+ return this;
108
+ }
109
+ withRequired(required = true, requiredExpression) {
110
+ this._required = required;
111
+ if (requiredExpression) {
112
+ this._requiredExpression = requiredExpression;
113
+ }
114
+ return this;
115
+ }
116
+ withDisabled(disabled = true, disabledExpression) {
117
+ this._disabled = disabled;
118
+ if (disabledExpression) {
119
+ this._disabledExpression = disabledExpression;
120
+ }
121
+ return this;
122
+ }
123
+ withHidden(hiddenExpression) {
124
+ this._hiddenExpression = hiddenExpression;
125
+ return this;
126
+ }
127
+ withDefaultValue(defaultValue) {
128
+ this._defaultValue = defaultValue;
129
+ return this;
130
+ }
131
+ withGetter(getter) {
132
+ this._getter = getter;
133
+ return this;
134
+ }
135
+ withSetter(setter) {
136
+ this._setter = setter;
137
+ return this;
138
+ }
139
+ withValidator(name, expression, message) {
140
+ this._validators.push(new FieldValidator(name, expression, message));
141
+ return this;
142
+ }
143
+ withClassName(className, labelClassName = '', inputClassName = '') {
144
+ this._className = className;
145
+ this._labelClassName = labelClassName;
146
+ this._inputClassName = inputClassName;
147
+ return this;
148
+ }
149
+ withSize(size = FieldDescriptor.SizeEnum.Normal) {
150
+ this._size = size;
151
+ return this;
152
+ }
153
+ nextEvent(type, cmpType, cmpInstance, data) {
154
+ this._eventsSubject.next(new MngFormFieldEvent(type, cmpType, cmpInstance, data));
155
+ }
156
+ get events$() {
157
+ return this._eventsSubject.asObservable();
158
+ }
159
+ copyFieldsTo(obj) {
160
+ obj._label = this._label;
161
+ obj._placeholder = this._placeholder;
162
+ obj._helpText = this._helpText;
163
+ obj._required = this._required;
164
+ obj._disabled = this._disabled;
165
+ obj._defaultValue = this._defaultValue;
166
+ obj._requiredExpression = this._requiredExpression;
167
+ obj._hiddenExpression = this._hiddenExpression;
168
+ obj._disabledExpression = this._disabledExpression;
169
+ obj._className = this._className;
170
+ obj._size = this.size;
171
+ obj._getter = this._getter;
172
+ obj._setter = this._setter;
173
+ obj._validators = this._validators;
174
+ }
175
+ }
176
+ export var FieldDescriptor;
177
+ (function (FieldDescriptor) {
178
+ let SizeEnum;
179
+ (function (SizeEnum) {
180
+ SizeEnum[SizeEnum["Small"] = 0] = "Small";
181
+ SizeEnum[SizeEnum["Normal"] = 1] = "Normal";
182
+ SizeEnum[SizeEnum["Large"] = 2] = "Large";
183
+ })(SizeEnum = FieldDescriptor.SizeEnum || (FieldDescriptor.SizeEnum = {}));
184
+ })(FieldDescriptor || (FieldDescriptor = {}));
185
+ export class FieldInputDescriptor extends AFieldDescriptor {
186
+ constructor(editor, property) {
187
+ super(editor, property);
188
+ this._fieldType = FieldInputDescriptor.TypeEnum.Text;
189
+ this._numberUseGrouping = true;
190
+ // radio specific properties
191
+ this._radioOptions = [];
192
+ this._datePickerShowTime = false;
193
+ }
194
+ get fieldType() {
195
+ return this._fieldType;
196
+ }
197
+ get rows() {
198
+ return this._rows;
199
+ }
200
+ get numberMin() {
201
+ return this._numberMin;
202
+ }
203
+ get numberMax() {
204
+ return this._numberMax;
205
+ }
206
+ get numberStep() {
207
+ return this._numberStep;
208
+ }
209
+ get numberMinFractionDigits() {
210
+ return this._numberMinFractionDigits;
211
+ }
212
+ get numberMaxFractionDigits() {
213
+ return this._numberMaxFractionDigits;
214
+ }
215
+ get numberUseGrouping() {
216
+ return this._numberUseGrouping;
217
+ }
218
+ get radioOptions() {
219
+ return this._radioOptions;
220
+ }
221
+ get datePickerFormat() {
222
+ return this._datePickerFormat;
223
+ }
224
+ get datePickerMin() {
225
+ return this._datePickerMin;
226
+ }
227
+ get datePickerMax() {
228
+ return this._datePickerMax;
229
+ }
230
+ get datePickerShowTime() {
231
+ return this._datePickerShowTime;
232
+ }
233
+ get maxLength() {
234
+ return this._maxLength;
235
+ }
236
+ get minLength() {
237
+ return this._minLength;
238
+ }
239
+ get pattern() {
240
+ return this._pattern;
241
+ }
242
+ get mask() {
243
+ return this._mask;
244
+ }
245
+ get slotChar() {
246
+ return this._slotChar;
247
+ }
248
+ get customComponentName() {
249
+ return this._customComponentName;
250
+ }
251
+ asHidden() {
252
+ this._fieldType = FieldInputDescriptor.TypeEnum.Hidden;
253
+ return this;
254
+ }
255
+ asText(minLength, maxLength, pattern, isEmail) {
256
+ this._fieldType = FieldInputDescriptor.TypeEnum.Text;
257
+ this._minLength = minLength;
258
+ this._maxLength = maxLength;
259
+ this._pattern = pattern;
260
+ if (isEmail) {
261
+ this.withValidator('email', control => !Validators.email(control));
262
+ }
263
+ return this;
264
+ }
265
+ asTextarea(rows = 3, minLength, maxLength, pattern) {
266
+ this._fieldType = FieldInputDescriptor.TypeEnum.Textarea;
267
+ this._rows = rows;
268
+ this._minLength = minLength;
269
+ this._maxLength = maxLength;
270
+ this._pattern = pattern;
271
+ return this;
272
+ }
273
+ asNumber(step, min, max, minFractionDigits, maxFractionDigits, numberUseGrouping = true) {
274
+ this._fieldType = FieldInputDescriptor.TypeEnum.Number;
275
+ this._numberStep = step;
276
+ this._numberMinFractionDigits = minFractionDigits;
277
+ this._numberMaxFractionDigits = maxFractionDigits;
278
+ this._numberMin = min ?? Number.MIN_SAFE_INTEGER;
279
+ this._numberMax = max ?? Number.MAX_SAFE_INTEGER;
280
+ this._numberUseGrouping = numberUseGrouping;
281
+ return this;
282
+ }
283
+ asSwitch() {
284
+ this._fieldType = FieldInputDescriptor.TypeEnum.Switch;
285
+ return this;
286
+ }
287
+ asRadio(options, optionsTitlePath) {
288
+ this._fieldType = FieldInputDescriptor.TypeEnum.Radio;
289
+ this._radioOptions = options.map(o => ({ value: o, title: `${optionsTitlePath ? `${optionsTitlePath}.` : ''}${o}` }));
290
+ return this;
291
+ }
292
+ asRadioFromEnum(enumType, optionsTitlePath, values, nameAsValue = false) {
293
+ this._fieldType = FieldInputDescriptor.TypeEnum.Radio;
294
+ if (typeof optionsTitlePath === 'undefined') {
295
+ optionsTitlePath = TypeUtil.findEnumName(enumType);
296
+ }
297
+ this._radioOptions = Array.isArray(values)
298
+ ? EnumUtil.fromValuesAsEnumValueArray(enumType, values, nameAsValue, optionsTitlePath ?? undefined)
299
+ : EnumUtil.fromConstantsAsEnumValueArray(enumType, nameAsValue, optionsTitlePath ?? undefined);
300
+ return this;
301
+ }
302
+ asDatePicker(format, min, max, showTime) {
303
+ this._fieldType = FieldInputDescriptor.TypeEnum.Datepicker;
304
+ this._datePickerFormat = format ? format : 'dd.mm.yy';
305
+ this._datePickerMin = min;
306
+ this._datePickerMax = max;
307
+ this._datePickerShowTime = showTime ?? false;
308
+ return this;
309
+ }
310
+ asMask(mask, slotChar) {
311
+ this._fieldType = FieldInputDescriptor.TypeEnum.Mask;
312
+ this._mask = mask;
313
+ this._slotChar = slotChar;
314
+ return this;
315
+ }
316
+ asCustomComponent(customComponentName) {
317
+ this._fieldType = FieldInputDescriptor.TypeEnum.Custom;
318
+ this._customComponentName = customComponentName;
319
+ return this;
320
+ }
321
+ copy() {
322
+ const field = new FieldInputDescriptor(this._editor, this._property);
323
+ this.copyFieldsTo(field);
324
+ field._fieldType = this._fieldType;
325
+ field._rows = this._rows;
326
+ field._numberMin = this._numberMin;
327
+ field._numberMax = this._numberMax;
328
+ field._numberStep = this._numberStep;
329
+ field._numberMinFractionDigits = this._numberMinFractionDigits;
330
+ field._numberMaxFractionDigits = this._numberMaxFractionDigits;
331
+ field._numberUseGrouping = this._numberUseGrouping;
332
+ field._radioOptions = [...this._radioOptions];
333
+ field._datePickerFormat = this._datePickerFormat;
334
+ field._datePickerMin = this._datePickerMin;
335
+ field._datePickerMax = this._datePickerMax;
336
+ field._datePickerShowTime = this._datePickerShowTime;
337
+ field._maxLength = this._maxLength;
338
+ field._minLength = this._minLength;
339
+ field._pattern = this._pattern;
340
+ field._mask = this._mask;
341
+ field._slotChar = this._slotChar;
342
+ field._customComponentName = this._customComponentName;
343
+ return field;
344
+ }
345
+ }
346
+ (function (FieldInputDescriptor) {
347
+ let TypeEnum;
348
+ (function (TypeEnum) {
349
+ TypeEnum[TypeEnum["Hidden"] = 0] = "Hidden";
350
+ TypeEnum[TypeEnum["Text"] = 1] = "Text";
351
+ TypeEnum[TypeEnum["Textarea"] = 2] = "Textarea";
352
+ TypeEnum[TypeEnum["Number"] = 3] = "Number";
353
+ TypeEnum[TypeEnum["Switch"] = 4] = "Switch";
354
+ TypeEnum[TypeEnum["Radio"] = 5] = "Radio";
355
+ TypeEnum[TypeEnum["Datepicker"] = 6] = "Datepicker";
356
+ TypeEnum[TypeEnum["Mask"] = 7] = "Mask";
357
+ TypeEnum[TypeEnum["Custom"] = 8] = "Custom";
358
+ })(TypeEnum = FieldInputDescriptor.TypeEnum || (FieldInputDescriptor.TypeEnum = {}));
359
+ })(FieldInputDescriptor || (FieldInputDescriptor = {}));
360
+ export class FieldLookupDescriptor extends AFieldDescriptor {
361
+ constructor(editor, property, modelType) {
362
+ super(editor, property);
363
+ this._lookupType = FieldLookupDescriptor.LookupTypeEnum.Dropdown;
364
+ this._itemsLabelTranslate = false;
365
+ this._dropdownClassName = 'mng-filter-lookup-dropdown';
366
+ this._autocompleteOpenOnFocus = false;
367
+ this._autocompleteInlineSearch = false;
368
+ this._modelType = modelType;
369
+ ModelUtil.trySetLookupItemsProperties(this);
370
+ }
371
+ get lookupType() {
372
+ return this._lookupType;
373
+ }
374
+ get itemsLabelProperty() {
375
+ return this._itemsLabelProperty;
376
+ }
377
+ get itemsLabelTranslate() {
378
+ return this._itemsLabelTranslate;
379
+ }
380
+ get itemsValueProperty() {
381
+ return this._itemsValueProperty;
382
+ }
383
+ get itemsDisabledProperty() {
384
+ return this._itemsDisabledProperty;
385
+ }
386
+ get dataKeyProperty() {
387
+ return this._dataKeyProperty;
388
+ }
389
+ get dataProvider() {
390
+ return this._dataProvider;
391
+ }
392
+ get autocompleteOpenOnFocus() {
393
+ return this._autocompleteOpenOnFocus;
394
+ }
395
+ get autocompleteInlineSearch() {
396
+ return this._autocompleteInlineSearch;
397
+ }
398
+ get dropdownClassName() {
399
+ return this._dropdownClassName;
400
+ }
401
+ get modelType() {
402
+ return this._modelType;
403
+ }
404
+ get dialogTableDescriptor() {
405
+ return this._dialogTableDescriptor;
406
+ }
407
+ get dialogTableDataProvider() {
408
+ return this._dialogTableDataProvider;
409
+ }
410
+ withItemsLabelProperty(itemsLabelProperty, translate = false) {
411
+ this._itemsLabelProperty = itemsLabelProperty;
412
+ this._itemsLabelTranslate = translate;
413
+ return this;
414
+ }
415
+ withItemsValueProperty(itemsValueProperty) {
416
+ this._itemsValueProperty = itemsValueProperty;
417
+ this._dataKeyProperty = undefined;
418
+ return this;
419
+ }
420
+ withItemsDisabledProperty(itemsDisabledProperty) {
421
+ this._itemsDisabledProperty = itemsDisabledProperty;
422
+ return this;
423
+ }
424
+ withDataKeyProperty(property) {
425
+ this._dataKeyProperty = property;
426
+ this._itemsValueProperty = undefined;
427
+ return this;
428
+ }
429
+ withLookup(lookup, serviceType) {
430
+ const dataProvider = new LookupDataProvider(this._modelType);
431
+ if (serviceType) {
432
+ dataProvider.withServiceType(serviceType);
433
+ }
434
+ dataProvider.withLookup(lookup);
435
+ this._dataProvider = dataProvider;
436
+ return this;
437
+ }
438
+ withLookupDataProvider(dataProvider) {
439
+ this._dataProvider = dataProvider;
440
+ return this;
441
+ }
442
+ withConfig(config) {
443
+ return super.withConfig(config);
444
+ }
445
+ asAutocomplete(openOnFocus = false, inlineSearch = false) {
446
+ this._lookupType = FilterLookupDescriptor.LookupTypeEnum.Autocomplete;
447
+ this._autocompleteOpenOnFocus = openOnFocus;
448
+ this._autocompleteInlineSearch = inlineSearch;
449
+ return this;
450
+ }
451
+ asDialog(lookupTableDescriptor, tableDataProvider) {
452
+ this._lookupType = FieldLookupDescriptor.LookupTypeEnum.Dialog;
453
+ this._dialogTableDescriptor = lookupTableDescriptor;
454
+ this._dialogTableDataProvider = tableDataProvider;
455
+ return this;
456
+ }
457
+ copy() {
458
+ const field = new FieldLookupDescriptor(this._editor, this._property, this._modelType);
459
+ this.copyFieldsTo(field);
460
+ field._lookupType = this._lookupType;
461
+ field._itemsLabelProperty = this._itemsLabelProperty;
462
+ field._itemsLabelTranslate = this._itemsLabelTranslate;
463
+ field._itemsValueProperty = this._itemsValueProperty;
464
+ field._itemsDisabledProperty = this._itemsDisabledProperty;
465
+ field._dataKeyProperty = this._dataKeyProperty;
466
+ field._dataProvider = this._dataProvider;
467
+ field._dropdownClassName = this._dropdownClassName;
468
+ field._autocompleteOpenOnFocus = this._autocompleteOpenOnFocus;
469
+ field._autocompleteInlineSearch = this._autocompleteInlineSearch;
470
+ field._dialogTableDescriptor = this._dialogTableDescriptor;
471
+ return field;
472
+ }
473
+ }
474
+ (function (FieldLookupDescriptor) {
475
+ let LookupTypeEnum;
476
+ (function (LookupTypeEnum) {
477
+ LookupTypeEnum[LookupTypeEnum["Dropdown"] = 0] = "Dropdown";
478
+ LookupTypeEnum[LookupTypeEnum["Autocomplete"] = 1] = "Autocomplete";
479
+ LookupTypeEnum[LookupTypeEnum["Dialog"] = 2] = "Dialog";
480
+ })(LookupTypeEnum = FieldLookupDescriptor.LookupTypeEnum || (FieldLookupDescriptor.LookupTypeEnum = {}));
481
+ })(FieldLookupDescriptor || (FieldLookupDescriptor = {}));
482
+ export class FieldLookupEnumDescriptor extends FieldLookupDescriptor {
483
+ constructor(editor, property, enumType, options, nameAsValue = false, optionsTitlePath) {
484
+ super(editor, property, null);
485
+ this._nameAsValue = false;
486
+ this._enumType = enumType;
487
+ this._nameAsValue = nameAsValue;
488
+ if (typeof optionsTitlePath === 'undefined') {
489
+ optionsTitlePath = TypeUtil.findEnumName(enumType);
490
+ }
491
+ this._optionEnumValues = Array.isArray(options)
492
+ ? EnumUtil.fromValuesAsEnumValueArray(enumType, options, nameAsValue, optionsTitlePath ?? undefined)
493
+ : EnumUtil.fromConstantsAsEnumValueArray(enumType, nameAsValue, optionsTitlePath ?? undefined);
494
+ const dataProvider = new LookupDataProvider(null).withLookup(() => of(this._optionEnumValues));
495
+ this.withLookupDataProvider(dataProvider);
496
+ this.withItemsLabelProperty('title', optionsTitlePath !== null);
497
+ this.withItemsValueProperty('value');
498
+ this.withItemsDisabledProperty('disabled');
499
+ }
500
+ get enumType() {
501
+ return this._enumType;
502
+ }
503
+ withDisabledOptions(...disabledOptions) {
504
+ for (const disabledOption of disabledOptions) {
505
+ const disabledOptionValue = this._nameAsValue ? EnumUtil.getConstantName(this._enumType, disabledOption) : disabledOption;
506
+ if (disabledOptionValue) {
507
+ const option = this._optionEnumValues.find(o => o.value === disabledOptionValue);
508
+ if (option) {
509
+ option.disabled = true;
510
+ }
511
+ }
512
+ }
513
+ return this;
514
+ }
515
+ asAutocomplete(openOnFocus = true) {
516
+ super.asAutocomplete(openOnFocus, true);
517
+ return this;
518
+ }
519
+ copy() {
520
+ const field = new FieldLookupEnumDescriptor(this._editor, this._property, this._enumType, []);
521
+ this.copyFieldsTo(field);
522
+ field._lookupType = this._lookupType;
523
+ field._itemsLabelProperty = this._itemsLabelProperty;
524
+ field._itemsValueProperty = this._itemsValueProperty;
525
+ field._itemsDisabledProperty = this._itemsDisabledProperty;
526
+ field._dataKeyProperty = this._dataKeyProperty;
527
+ field._dataProvider = this._dataProvider;
528
+ return field;
529
+ }
530
+ }
531
+ export class FieldManyToManyEditorDescriptor extends AFieldDescriptor {
532
+ constructor(editor, property, mainTableDescriptor, lookupTableDescriptor) {
533
+ super(editor, property);
534
+ this._fieldType = FieldManyToManyEditorDescriptor.TypeEnum.DialogTableMultiselect;
535
+ this._lookupTableDataProvider = null;
536
+ this._actions = [];
537
+ this._hasLookupExcludeValues = false;
538
+ this._excludeFilterProperty = '';
539
+ this._excludeValueProperty = '';
540
+ this._mainTableDescriptor = mainTableDescriptor;
541
+ this._lookupTableDescriptor = lookupTableDescriptor;
542
+ this._actions.push(FieldManyToManyEditorDescriptor.ActionEnum.Add, FieldManyToManyEditorDescriptor.ActionEnum.Delete);
543
+ }
544
+ get fieldType() {
545
+ return this._fieldType;
546
+ }
547
+ get lookupTableDataProvider() {
548
+ return this._lookupTableDataProvider;
549
+ }
550
+ get actions() {
551
+ return this._actions;
552
+ }
553
+ get hasLookupExcludeValues() {
554
+ return this._hasLookupExcludeValues;
555
+ }
556
+ get excludeFilterProperty() {
557
+ return this._excludeFilterProperty;
558
+ }
559
+ get excludeValueProperty() {
560
+ return this._excludeValueProperty;
561
+ }
562
+ get mainTableDescriptor() {
563
+ return this._mainTableDescriptor;
564
+ }
565
+ get lookupTableDescriptor() {
566
+ return this._lookupTableDescriptor;
567
+ }
568
+ withLookup(getAll, serviceType) {
569
+ const dataProvider = new TableviewDataProvider(this._mainTableDescriptor.model.type);
570
+ if (serviceType) {
571
+ dataProvider.withServiceType(serviceType);
572
+ }
573
+ dataProvider.withGetAll(getAll);
574
+ this._lookupTableDataProvider = dataProvider;
575
+ return this;
576
+ }
577
+ withLookupDataProvider(dataProvider) {
578
+ this._lookupTableDataProvider = dataProvider;
579
+ return this;
580
+ }
581
+ withActions(actions = []) {
582
+ this.actions.push(...actions);
583
+ return this;
584
+ }
585
+ withLookupExclude(filterProperty, valueProperty, hasLookupExclude = true) {
586
+ this._hasLookupExcludeValues = hasLookupExclude;
587
+ this._excludeFilterProperty = filterProperty;
588
+ this._excludeValueProperty = valueProperty;
589
+ return this;
590
+ }
591
+ copy() {
592
+ const field = new FieldManyToManyEditorDescriptor(this._editor, this._property, this._mainTableDescriptor.copy(), this._lookupTableDescriptor.copy());
593
+ this.copyFieldsTo(field);
594
+ field._fieldType = this._fieldType;
595
+ field._actions = this._actions.map(a => a);
596
+ field._lookupTableDataProvider = this._lookupTableDataProvider;
597
+ field._hasLookupExcludeValues = this._hasLookupExcludeValues;
598
+ field._excludeFilterProperty = this._excludeFilterProperty;
599
+ field._excludeValueProperty = this._excludeValueProperty;
600
+ return field;
601
+ }
602
+ }
603
+ (function (FieldManyToManyEditorDescriptor) {
604
+ let TypeEnum;
605
+ (function (TypeEnum) {
606
+ TypeEnum[TypeEnum["DialogTableMultiselect"] = 0] = "DialogTableMultiselect";
607
+ })(TypeEnum = FieldManyToManyEditorDescriptor.TypeEnum || (FieldManyToManyEditorDescriptor.TypeEnum = {}));
608
+ let ActionEnum;
609
+ (function (ActionEnum) {
610
+ ActionEnum[ActionEnum["Add"] = 0] = "Add";
611
+ ActionEnum[ActionEnum["Delete"] = 1] = "Delete";
612
+ })(ActionEnum = FieldManyToManyEditorDescriptor.ActionEnum || (FieldManyToManyEditorDescriptor.ActionEnum = {}));
613
+ })(FieldManyToManyEditorDescriptor || (FieldManyToManyEditorDescriptor = {}));
614
+ export class FieldManyEditorDescriptor extends AFieldDescriptor {
615
+ constructor(editor, property, tableviewDescriptor) {
616
+ super(editor, property);
617
+ this._fieldType = FieldManyEditorDescriptor.TypeEnum.DialogEditor;
618
+ this._fieldActions = [];
619
+ this._actions = [];
620
+ // this._modelType = modelType;
621
+ this._tableviewDescriptor = tableviewDescriptor;
622
+ this._fieldActions.push(FieldManyEditorDescriptor.ActionEnum.View, FieldManyEditorDescriptor.ActionEnum.Add, FieldManyEditorDescriptor.ActionEnum.Edit, FieldManyEditorDescriptor.ActionEnum.Delete);
623
+ }
624
+ get fieldType() {
625
+ return this._fieldType;
626
+ }
627
+ get fieldActions() {
628
+ return this._fieldActions;
629
+ }
630
+ get actions() {
631
+ return this._actions;
632
+ }
633
+ get tableviewDescriptor() {
634
+ return this._tableviewDescriptor;
635
+ }
636
+ get tableDescriptor() {
637
+ return this._tableviewDescriptor.table;
638
+ }
639
+ get editorForCreate() {
640
+ return this._tableviewDescriptor.addEditor;
641
+ }
642
+ get editorForRead() {
643
+ return this._tableviewDescriptor.viewEditor;
644
+ }
645
+ get editorForUpdate() {
646
+ return this._tableviewDescriptor.editEditor;
647
+ }
648
+ withFieldAction(action) {
649
+ this._fieldActions.push(action);
650
+ return this;
651
+ }
652
+ withFieldActions(actions) {
653
+ this._fieldActions = actions;
654
+ return this;
655
+ }
656
+ withAction(action) {
657
+ this._actions.push(action);
658
+ return this;
659
+ }
660
+ copy() {
661
+ const field = new FieldManyEditorDescriptor(this._editor, this._property, this._tableviewDescriptor.copy());
662
+ this.copyFieldsTo(field);
663
+ field._fieldType = this._fieldType;
664
+ field._fieldActions = this._fieldActions.map(a => a);
665
+ return field;
666
+ }
667
+ }
668
+ (function (FieldManyEditorDescriptor) {
669
+ let TypeEnum;
670
+ (function (TypeEnum) {
671
+ TypeEnum[TypeEnum["DialogEditor"] = 0] = "DialogEditor";
672
+ })(TypeEnum = FieldManyEditorDescriptor.TypeEnum || (FieldManyEditorDescriptor.TypeEnum = {}));
673
+ let ActionEnum;
674
+ (function (ActionEnum) {
675
+ ActionEnum[ActionEnum["View"] = 0] = "View";
676
+ ActionEnum[ActionEnum["Add"] = 1] = "Add";
677
+ ActionEnum[ActionEnum["Edit"] = 2] = "Edit";
678
+ ActionEnum[ActionEnum["Delete"] = 3] = "Delete";
679
+ })(ActionEnum = FieldManyEditorDescriptor.ActionEnum || (FieldManyEditorDescriptor.ActionEnum = {}));
680
+ })(FieldManyEditorDescriptor || (FieldManyEditorDescriptor = {}));
681
+ export class AFieldGroupDescriptor extends AGenericFieldDescriptor {
682
+ constructor(editor, name) {
683
+ super(editor);
684
+ this._fields = [];
685
+ this._validators = [];
686
+ this._name = `${this.baseName}${name}`;
687
+ this._default = name === EditorDescriptor.defaultGroupName;
688
+ }
689
+ get title() {
690
+ return this._title;
691
+ }
692
+ get validators() {
693
+ return this._validators;
694
+ }
695
+ get baseName() {
696
+ return `${this.groupName()}_`;
697
+ }
698
+ get name() {
699
+ return this._name;
700
+ }
701
+ get default() {
702
+ return this._default;
703
+ }
704
+ withTitle(title) {
705
+ this._title = title;
706
+ return this;
707
+ }
708
+ withValidator(name, expression) {
709
+ this._validators.push(new FieldValidator(name, expression, undefined));
710
+ return this;
711
+ }
712
+ }
713
+ export class FieldTabGroupDescriptor extends AFieldGroupDescriptor {
714
+ constructor(editor, name) {
715
+ super(editor, name);
716
+ }
717
+ get fields() {
718
+ return this._fields;
719
+ }
720
+ groupName() {
721
+ return 'tab';
722
+ }
723
+ addField(field) {
724
+ this._fields.push(field);
725
+ return this;
726
+ }
727
+ copy() {
728
+ const tab = new FieldTabGroupDescriptor(this._editor, this.name.substring(this.baseName.length));
729
+ tab._title = this._title;
730
+ tab._fields = this.fields.map(f => f.copy());
731
+ return tab;
732
+ }
733
+ }
734
+ export class FieldGroupDescriptor extends AFieldGroupDescriptor {
735
+ constructor(editor, name) {
736
+ super(editor, name);
737
+ }
738
+ get fields() {
739
+ return this._fields;
740
+ }
741
+ groupName() {
742
+ return 'group';
743
+ }
744
+ addField(field) {
745
+ this._fields.push(field);
746
+ return this;
747
+ }
748
+ copy() {
749
+ const group = new FieldGroupDescriptor(this._editor, this.name.substring(this.baseName.length));
750
+ group._title = this._title;
751
+ group._fields = this.fields.map(f => f.copy());
752
+ return group;
753
+ }
754
+ }
755
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmllbGQuZGVzY3JpcHRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvZGVzY3JpcHRvcnMvZmllbGQuZGVzY3JpcHRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQWtCLFVBQVUsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRzNELE9BQU8sRUFBYSxPQUFPLEVBQUUsRUFBRSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBRzdDLE9BQU8sRUFBQyxpQkFBaUIsRUFBbUQsTUFBTSwyQkFBMkIsQ0FBQztBQUM5RyxPQUFPLEVBQTBDLGtCQUFrQixFQUFFLHFCQUFxQixFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFHckgsT0FBTyxFQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUNqRSxPQUFPLEVBQW1CLGdCQUFnQixFQUFFLGNBQWMsRUFBRSxzQkFBc0IsRUFBMEQsTUFBTSxJQUFJLENBQUM7QUFHdkosTUFBTSxPQUFnQix1QkFBdUI7SUFJekMsWUFBc0IsTUFBNEI7UUFGeEMsWUFBTyxHQUFnQixFQUFFLENBQUM7UUFHaEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7SUFDMUIsQ0FBQztJQUVELElBQVcsTUFBTTtRQUNiLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN4QixDQUFDO0lBRUQsSUFBVyxNQUFNO1FBQ2IsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3hCLENBQUM7SUFFTSxVQUFVLENBQUMsTUFBbUI7UUFDakMsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7UUFDdEIsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztDQUNKO0FBRUQsTUFBTSxPQUFnQixnQkFBd0IsU0FBUSx1QkFBMkI7SUF5QjdFLFlBQXNCLE1BQTRCLEVBQUUsUUFBZ0I7UUFDaEUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFD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SUFBSSxDQUFDLE1BQU0sQ0FBQztRQUMzQixLQUFLLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFDL0MsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtUeXBlfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7QWJzdHJhY3RDb250cm9sLCBWYWxpZGF0b3JzfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmltcG9ydCB7Rm9ybWx5RmllbGRDb25maWd9IGZyb20gJ0BuZ3gtZm9ybWx5L2NvcmUnO1xuaW1wb3J0IHtPYnNlcnZhYmxlLCBTdWJqZWN0LCBvZn0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7TWVkaXVzUXVlcnlQYXJhbSwgTWVkaXVzUXVlcnlSZXN1bHR9IGZyb20gJy4uL2FwaS9tb2RlbHMnO1xuaW1wb3J0IHtNbmdGb3JtRmllbGRFdmVudCwgTW5nRm9ybUZpZWxkRXZlbnREYXRhLCBNbmdGb3JtRmllbGRFdmVudFR5cGVFbnVtfSBmcm9tICcuLi9jb21wb25lbnRzL2Zvcm0vbW9kZWxzJztcbmltcG9ydCB7SUxvb2t1cERhdGFQcm92aWRlciwgSVRhYmxlRGF0YVByb3ZpZGVyLCBMb29rdXBEYXRhUHJvdmlkZXIsIFRhYmxldmlld0RhdGFQcm92aWRlcn0gZnJvbSAnLi4vZGF0YS1wcm92aWRlcnMnO1xuaW1wb3J0IHtFbnVtVmFsdWV9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQge0NsYXNzVHlwZSwgRW51bUNvbnN0YW50VHlwZSwgRW51bVR5cGV9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7RW51bVV0aWwsIEkxOG5VdGlsLCBNb2RlbFV0aWwsIFR5cGVVdGlsfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQge0FjdGlvbkRlc2NyaXB0b3IsIEVkaXRvckRlc2NyaXB0b3IsIEZpZWxkVmFsaWRhdG9yLCBGaWx0ZXJMb29rdXBEZXNjcmlwdG9yLCBJTG9va3VwRGVzY3JpcHRvciwgVGFibGVEZXNjcmlwdG9yLCBUYWJsZXZpZXdEZXNjcmlwdG9yfSBmcm9tICcuLyc7XG5pbXBvcnQge0ZpZWxkQ29uZmlnLCBGaWVsZExvb2t1cENvbmZpZ30gZnJvbSAnLi9maWVsZC5kZXNjcmlwdG9yLmludGVyZmFjZSc7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBR2VuZXJpY0ZpZWxkRGVzY3JpcHRvcjxFVD4ge1xuICAgIHByb3RlY3RlZCByZWFkb25seSBfZWRpdG9yOiBFZGl0b3JEZXNjcmlwdG9yPEVUPjtcbiAgICBwcm90ZWN0ZWQgX2NvbmZpZzogRmllbGRDb25maWcgPSB7fTtcblxuICAgIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihlZGl0b3I6IEVkaXRvckRlc2NyaXB0b3I8RVQ+KSB7XG4gICAgICAgIHRoaXMuX2VkaXRvciA9IGVkaXRvcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGVkaXRvcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2VkaXRvcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGNvbmZpZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbmZpZztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aENvbmZpZyhjb25maWc6IEZpZWxkQ29uZmlnKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2NvbmZpZyA9IGNvbmZpZztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQUZpZWxkRGVzY3JpcHRvcjxULCBFVD4gZXh0ZW5kcyBBR2VuZXJpY0ZpZWxkRGVzY3JpcHRvcjxFVD4ge1xuICAgIHByb3RlY3RlZCByZWFkb25seSBfcHJvcGVydHk6IHN0cmluZztcbiAgICBwcm90ZWN0ZWQgX2dyb3VwPzogQUZpZWxkR3JvdXBEZXNjcmlwdG9yPEVUPjtcbiAgICBwcm90ZWN0ZWQgX2xhYmVsPzogc3RyaW5nO1xuXG4gICAgcHJvdGVjdGVkIF9wbGFjZWhvbGRlcj86IHN0cmluZztcbiAgICBwcm90ZWN0ZWQgX2hlbHBUZXh0Pzogc3RyaW5nO1xuXG4gICAgcHJvdGVjdGVkIF9yZXF1aXJlZCA9IGZhbHNlO1xuICAgIHByb3RlY3RlZCBfZGlzYWJsZWQgPSBmYWxzZTtcbiAgICBwcm90ZWN0ZWQgX2RlZmF1bHRWYWx1ZT86IFQ7XG4gICAgcHJvdGVjdGVkIF9nZXR0ZXI/OiAoaXRlbTogRVQpID0+IFQ7XG4gICAgcHJvdGVjdGVkIF9zZXR0ZXI/OiAoaXRlbTogRVQsIHZhbHVlOiBUKSA9PiB2b2lkO1xuICAgIHByb3RlY3RlZCBfdmFsaWRhdG9yczogQXJyYXk8RmllbGRWYWxpZGF0b3I+ID0gW107XG4gICAgcHJvdGVjdGVkIF9yZXF1aXJlZEV4cHJlc3Npb24/OiBzdHJpbmcgfCAoKG1vZGVsOiBhbnksIGZvcm1TdGF0ZT86IGFueSwgZmllbGQ/OiBGb3JtbHlGaWVsZENvbmZpZykgPT4gYm9vbGVhbikgfCBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuICAgIHByb3RlY3RlZCBfZGlzYWJsZWRFeHByZXNzaW9uPzogc3RyaW5nIHwgKChtb2RlbDogYW55LCBmb3JtU3RhdGU/OiBhbnksIGZpZWxkPzogRm9ybWx5RmllbGRDb25maWcpID0+IGJvb2xlYW4pIHwgT2JzZXJ2YWJsZTxib29sZWFuPjtcbiAgICBwcm90ZWN0ZWQgX2hpZGRlbkV4cHJlc3Npb24/OiBzdHJpbmcgfCAoKG1vZGVsOiBhbnksIGZvcm1TdGF0ZT86IGFueSwgZmllbGQ/OiBGb3JtbHlGaWVsZENvbmZpZykgPT4gYm9vbGVhbikgfCBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuXG4gICAgcHJvdGVjdGVkIF9jbGFzc05hbWUgPSAnJztcbiAgICBwcm90ZWN0ZWQgX2xhYmVsQ2xhc3NOYW1lID0gJyc7XG4gICAgcHJvdGVjdGVkIF9pbnB1dENsYXNzTmFtZSA9ICcnO1xuICAgIHByb3RlY3RlZCBfc2l6ZTogRmllbGREZXNjcmlwdG9yLlNpemVFbnVtID0gRmllbGREZXNjcmlwdG9yLlNpemVFbnVtLk5vcm1hbDtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSBfZXZlbnRzU3ViamVjdCA9IG5ldyBTdWJqZWN0PE1uZ0Zvcm1GaWVsZEV2ZW50PFQsIEVUPj4oKTtcblxuICAgIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihlZGl0b3I6IEVkaXRvckRlc2NyaXB0b3I8RVQ+LCBwcm9wZXJ0eTogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKGVkaXRvcik7XG4gICAgICAgIHRoaXMuX3Byb3BlcnR5ID0gcHJvcGVydHk7XG4gICAgICAgIHRoaXMuX2xhYmVsID0gSTE4blV0aWwuZ2V0TW9kZWxQcm9wZXJ0eUtleSh0aGlzLl9lZGl0b3IubW9kZWwsIHByb3BlcnR5KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHByb3BlcnR5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcHJvcGVydHk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBncm91cCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dyb3VwO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbGFiZWwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sYWJlbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHBsYWNlaG9sZGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGxhY2Vob2xkZXI7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBoZWxwVGV4dCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hlbHBUZXh0O1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcmVxdWlyZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZXF1aXJlZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGRpc2FibGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGlzYWJsZWQ7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBkZWZhdWx0VmFsdWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWZhdWx0VmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBnZXR0ZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXR0ZXI7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBzZXR0ZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZXR0ZXI7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCB2YWxpZGF0b3JzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdmFsaWRhdG9ycztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHJlcXVpcmVkRXhwcmVzc2lvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlcXVpcmVkRXhwcmVzc2lvbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGRpc2FibGVkRXhwcmVzc2lvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Rpc2FibGVkRXhwcmVzc2lvbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGhpZGRlbkV4cHJlc3Npb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9oaWRkZW5FeHByZXNzaW9uO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgY2xhc3NOYW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2xhc3NOYW1lO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbGFiZWxDbGFzc05hbWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sYWJlbENsYXNzTmFtZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGlucHV0Q2xhc3NOYW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faW5wdXRDbGFzc05hbWU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBzaXplKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2l6ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGlzU2l6ZVNtYWxsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2l6ZSA9PT0gRmllbGREZXNjcmlwdG9yLlNpemVFbnVtLlNtYWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaXNTaXplTGFyZ2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zaXplID09PSBGaWVsZERlc2NyaXB0b3IuU2l6ZUVudW0uTGFyZ2U7XG4gICAgfVxuXG4gICAgcHVibGljIGFic3RyYWN0IGNvcHkoKTogQUZpZWxkRGVzY3JpcHRvcjxULCBFVD47XG5cbiAgICBwdWJsaWMgd2l0aExhYmVsKGxhYmVsOiBzdHJpbmcpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fbGFiZWwgPSBsYWJlbDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhQbGFjZWhvbGRlcihwbGFjZWhvbGRlcjogc3RyaW5nKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX3BsYWNlaG9sZGVyID0gcGxhY2Vob2xkZXI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoSGVscFRleHQoaGVscFRleHQ6IHN0cmluZyk6IHRoaXMge1xuICAgICAgICB0aGlzLl9oZWxwVGV4dCA9IGhlbHBUZXh0O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aFJlcXVpcmVkKHJlcXVpcmVkID0gdHJ1ZSwgcmVxdWlyZWRFeHByZXNzaW9uPzogc3RyaW5nIHwgKChtb2RlbDogYW55LCBmb3JtU3RhdGU/OiBhbnksIGZpZWxkPzogRm9ybWx5RmllbGRDb25maWcpID0+IGJvb2xlYW4pIHwgT2JzZXJ2YWJsZTxib29sZWFuPik6IHRoaXMge1xuICAgICAgICB0aGlzLl9yZXF1aXJlZCA9IHJlcXVpcmVkO1xuICAgICAgICBpZiAocmVxdWlyZWRFeHByZXNzaW9uKSB7XG4gICAgICAgICAgICB0aGlzLl9yZXF1aXJlZEV4cHJlc3Npb24gPSByZXF1aXJlZEV4cHJlc3Npb247XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhEaXNhYmxlZChkaXNhYmxlZCA9IHRydWUsIGRpc2FibGVkRXhwcmVzc2lvbj86IHN0cmluZyB8ICgobW9kZWw6IGFueSwgZm9ybVN0YXRlPzogYW55LCBmaWVsZD86IEZvcm1seUZpZWxkQ29uZmlnKSA9PiBib29sZWFuKSB8IE9ic2VydmFibGU8Ym9vbGVhbj4pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fZGlzYWJsZWQgPSBkaXNhYmxlZDtcbiAgICAgICAgaWYgKGRpc2FibGVkRXhwcmVzc2lvbikge1xuICAgICAgICAgICAgdGhpcy5fZGlzYWJsZWRFeHByZXNzaW9uID0gZGlzYWJsZWRFeHByZXNzaW9uO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoSGlkZGVuKGhpZGRlbkV4cHJlc3Npb246IHN0cmluZyB8ICgobW9kZWw6IGFueSwgZm9ybVN0YXRlPzogYW55LCBmaWVsZD86IEZvcm1seUZpZWxkQ29uZmlnKSA9PiBib29sZWFuKSB8IE9ic2VydmFibGU8Ym9vbGVhbj4pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5faGlkZGVuRXhwcmVzc2lvbiA9IGhpZGRlbkV4cHJlc3Npb247XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoRGVmYXVsdFZhbHVlKGRlZmF1bHRWYWx1ZTogVCk6IHRoaXMge1xuICAgICAgICB0aGlzLl9kZWZhdWx0VmFsdWUgPSBkZWZhdWx0VmFsdWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoR2V0dGVyKGdldHRlcjogKGl0ZW06IEVUKSA9PiBUKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2dldHRlciA9IGdldHRlcjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhTZXR0ZXIoc2V0dGVyOiAoaXRlbTogRVQsIHZhbHVlOiBUKSA9PiB2b2lkKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX3NldHRlciA9IHNldHRlcjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhWYWxpZGF0b3IobmFtZTogc3RyaW5nLCBleHByZXNzaW9uOiAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKSA9PiBib29sZWFuLCBtZXNzYWdlPzogKGVycjogYW55LCBmaWVsZDogRm9ybWx5RmllbGRDb25maWcpID0+IHN0cmluZyk6IHRoaXMge1xuICAgICAgICB0aGlzLl92YWxpZGF0b3JzLnB1c2gobmV3IEZpZWxkVmFsaWRhdG9yKG5hbWUsIGV4cHJlc3Npb24sIG1lc3NhZ2UpKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhDbGFzc05hbWUoY2xhc3NOYW1lOiBzdHJpbmcsIGxhYmVsQ2xhc3NOYW1lID0gJycsIGlucHV0Q2xhc3NOYW1lID0gJycpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fY2xhc3NOYW1lID0gY2xhc3NOYW1lO1xuICAgICAgICB0aGlzLl9sYWJlbENsYXNzTmFtZSA9IGxhYmVsQ2xhc3NOYW1lO1xuICAgICAgICB0aGlzLl9pbnB1dENsYXNzTmFtZSA9IGlucHV0Q2xhc3NOYW1lO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aFNpemUoc2l6ZTogRmllbGREZXNjcmlwdG9yLlNpemVFbnVtID0gRmllbGREZXNjcmlwdG9yLlNpemVFbnVtLk5vcm1hbCk6IHRoaXMge1xuICAgICAgICB0aGlzLl9zaXplID0gc2l6ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIG5leHRFdmVudCh0eXBlOiBNbmdGb3JtRmllbGRFdmVudFR5cGVFbnVtLCBjbXBUeXBlOiBUeXBlPGFueT4sIGNtcEluc3RhbmNlOiBhbnksIGRhdGE/OiBNbmdGb3JtRmllbGRFdmVudERhdGE8VCwgRVQ+KSB7XG4gICAgICAgIHRoaXMuX2V2ZW50c1N1YmplY3QubmV4dChuZXcgTW5nRm9ybUZpZWxkRXZlbnQodHlwZSwgY21wVHlwZSwgY21wSW5zdGFuY2UsIGRhdGEpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGV2ZW50cyQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9ldmVudHNTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBjb3B5RmllbGRzVG8ob2JqOiBBRmllbGREZXNjcmlwdG9yPFQsIEVUPikge1xuICAgICAgICBvYmouX2xhYmVsID0gdGhpcy5fbGFiZWw7XG4gICAgICAgIG9iai5fcGxhY2Vob2xkZXIgPSB0aGlzLl9wbGFjZWhvbGRlcjtcbiAgICAgICAgb2JqLl9oZWxwVGV4dCA9IHRoaXMuX2hlbHBUZXh0O1xuICAgICAgICBvYmouX3JlcXVpcmVkID0gdGhpcy5fcmVxdWlyZWQ7XG4gICAgICAgIG9iai5fZGlzYWJsZWQgPSB0aGlzLl9kaXNhYmxlZDtcbiAgICAgICAgb2JqLl9kZWZhdWx0VmFsdWUgPSB0aGlzLl9kZWZhdWx0VmFsdWU7XG4gICAgICAgIG9iai5fcmVxdWlyZWRFeHByZXNzaW9uID0gdGhpcy5fcmVxdWlyZWRFeHByZXNzaW9uO1xuICAgICAgICBvYmouX2hpZGRlbkV4cHJlc3Npb24gPSB0aGlzLl9oaWRkZW5FeHByZXNzaW9uO1xuICAgICAgICBvYmouX2Rpc2FibGVkRXhwcmVzc2lvbiA9IHRoaXMuX2Rpc2FibGVkRXhwcmVzc2lvbjtcbiAgICAgICAgb2JqLl9jbGFzc05hbWUgPSB0aGlzLl9jbGFzc05hbWU7XG4gICAgICAgIG9iai5fc2l6ZSA9IHRoaXMuc2l6ZTtcbiAgICAgICAgb2JqLl9nZXR0ZXIgPSB0aGlzLl9nZXR0ZXI7XG4gICAgICAgIG9iai5fc2V0dGVyID0gdGhpcy5fc2V0dGVyO1xuICAgICAgICBvYmouX3ZhbGlkYXRvcnMgPSB0aGlzLl92YWxpZGF0b3JzO1xuICAgIH1cbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBGaWVsZERlc2NyaXB0b3Ige1xuICAgIGV4cG9ydCBlbnVtIFNpemVFbnVtIHtcbiAgICAgICAgU21hbGwsXG4gICAgICAgIE5vcm1hbCxcbiAgICAgICAgTGFyZ2VcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBGaWVsZElucHV0RGVzY3JpcHRvcjxFVD4gZXh0ZW5kcyBBRmllbGREZXNjcmlwdG9yPHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBEYXRlLCBFVD4ge1xuICAgIHByaXZhdGUgX2ZpZWxkVHlwZTogRmllbGRJbnB1dERlc2NyaXB0b3IuVHlwZUVudW0gPSBGaWVsZElucHV0RGVzY3JpcHRvci5UeXBlRW51bS5UZXh0O1xuXG4gICAgLy8gdGV4dGFyZWEgc3BlY2lmaWMgcHJvcGVydGllc1xuICAgIHByaXZhdGUgX3Jvd3M/OiBudW1iZXI7XG5cbiAgICAvLyBudW1iZXIgc3BlY2lmaWMgcHJvcGVydGllc1xuICAgIHByaXZhdGUgX251bWJlck1pbj86IG51bWJlcjtcbiAgICBwcml2YXRlIF9udW1iZXJNYXg/OiBudW1iZXI7XG4gICAgcHJpdmF0ZSBfbnVtYmVyU3RlcD86IG51bWJlcjtcbiAgICBwcml2YXRlIF9udW1iZXJNaW5GcmFjdGlvbkRpZ2l0cz86IG51bWJlcjtcbiAgICBwcml2YXRlIF9udW1iZXJNYXhGcmFjdGlvbkRpZ2l0cz86IG51bWJlcjtcbiAgICBwcml2YXRlIF9udW1iZXJVc2VHcm91cGluZyA9IHRydWU7XG5cbiAgICAvLyByYWRpbyBzcGVjaWZpYyBwcm9wZXJ0aWVzXG4gICAgcHJpdmF0ZSBfcmFkaW9PcHRpb25zOiBBcnJheTxFbnVtVmFsdWU8c3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IERhdGU+PiA9IFtdO1xuXG4gICAgLy8gZGF0ZXBpY2tlciBzcGVjaWZpYyBwcm9wZXJ0aWVzXG4gICAgcHJpdmF0ZSBfZGF0ZVBpY2tlckZvcm1hdD86IHN0cmluZztcbiAgICBwcml2YXRlIF9kYXRlUGlja2VyTWluPzogRGF0ZTtcbiAgICBwcml2YXRlIF9kYXRlUGlja2VyTWF4PzogRGF0ZTtcbiAgICBwcml2YXRlIF9kYXRlUGlja2VyU2hvd1RpbWUgPSBmYWxzZTtcblxuICAgIC8vIGlucHV0IHNwZWNpZmljIHByb3BlcnRpZXNcbiAgICBwcml2YXRlIF9tYXhMZW5ndGg/OiBudW1iZXI7XG4gICAgcHJpdmF0ZSBfbWluTGVuZ3RoPzogbnVtYmVyO1xuICAgIHByaXZhdGUgX3BhdHRlcm4/OiBzdHJpbmcgfCBSZWdFeHA7XG5cbiAgICAvLyBtYXNrIHNwZWNpZmljIHByb3BlcnRpZXNcbiAgICBwcml2YXRlIF9tYXNrPzogc3RyaW5nO1xuICAgIHByaXZhdGUgX3Nsb3RDaGFyPzogc3RyaW5nO1xuXG4gICAgLy8gY3VzdG9tIGNvbXBvbmVudCBwcm9wZXJ0aWVzXG4gICAgcHJpdmF0ZSBfY3VzdG9tQ29tcG9uZW50TmFtZT86IHN0cmluZztcblxuICAgIGNvbnN0cnVjdG9yKGVkaXRvcjogRWRpdG9yRGVzY3JpcHRvcjxFVD4sIHByb3BlcnR5OiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoZWRpdG9yLCBwcm9wZXJ0eSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBmaWVsZFR5cGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9maWVsZFR5cGU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCByb3dzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcm93cztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IG51bWJlck1pbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX251bWJlck1pbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IG51bWJlck1heCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX251bWJlck1heDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IG51bWJlclN0ZXAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9udW1iZXJTdGVwO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbnVtYmVyTWluRnJhY3Rpb25EaWdpdHMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9udW1iZXJNaW5GcmFjdGlvbkRpZ2l0cztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IG51bWJlck1heEZyYWN0aW9uRGlnaXRzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbnVtYmVyTWF4RnJhY3Rpb25EaWdpdHM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBudW1iZXJVc2VHcm91cGluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX251bWJlclVzZUdyb3VwaW5nO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcmFkaW9PcHRpb25zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmFkaW9PcHRpb25zO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZGF0ZVBpY2tlckZvcm1hdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGVQaWNrZXJGb3JtYXQ7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBkYXRlUGlja2VyTWluKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF0ZVBpY2tlck1pbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGRhdGVQaWNrZXJNYXgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRlUGlja2VyTWF4O1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZGF0ZVBpY2tlclNob3dUaW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF0ZVBpY2tlclNob3dUaW1lO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbWF4TGVuZ3RoKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWF4TGVuZ3RoO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbWluTGVuZ3RoKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWluTGVuZ3RoO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcGF0dGVybigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhdHRlcm47XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBtYXNrKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWFzaztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHNsb3RDaGFyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2xvdENoYXI7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBjdXN0b21Db21wb25lbnROYW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY3VzdG9tQ29tcG9uZW50TmFtZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXNIaWRkZW4oKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2ZpZWxkVHlwZSA9IEZpZWxkSW5wdXREZXNjcmlwdG9yLlR5cGVFbnVtLkhpZGRlbjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIGFzVGV4dChtaW5MZW5ndGg/OiBudW1iZXIsIG1heExlbmd0aD86IG51bWJlciwgcGF0dGVybj86IHN0cmluZyB8IFJlZ0V4cCwgaXNFbWFpbD86IGJvb2xlYW4pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fZmllbGRUeXBlID0gRmllbGRJbnB1dERlc2NyaXB0b3IuVHlwZUVudW0uVGV4dDtcbiAgICAgICAgdGhpcy5fbWluTGVuZ3RoID0gbWluTGVuZ3RoO1xuICAgICAgICB0aGlzLl9tYXhMZW5ndGggPSBtYXhMZW5ndGg7XG4gICAgICAgIHRoaXMuX3BhdHRlcm4gPSBwYXR0ZXJuO1xuICAgICAgICBpZiAoaXNFbWFpbCkge1xuICAgICAgICAgICAgdGhpcy53aXRoVmFsaWRhdG9yKCdlbWFpbCcsIGNvbnRyb2wgPT4gIVZhbGlkYXRvcnMuZW1haWwoY29udHJvbCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc1RleHRhcmVhKHJvd3MgPSAzLCBtaW5MZW5ndGg/OiBudW1iZXIsIG1heExlbmd0aD86IG51bWJlciwgcGF0dGVybj86IHN0cmluZyB8IFJlZ0V4cCk6IHRoaXMge1xuICAgICAgICB0aGlzLl9maWVsZFR5cGUgPSBGaWVsZElucHV0RGVzY3JpcHRvci5UeXBlRW51bS5UZXh0YXJlYTtcbiAgICAgICAgdGhpcy5fcm93cyA9IHJvd3M7XG4gICAgICAgIHRoaXMuX21pbkxlbmd0aCA9IG1pbkxlbmd0aDtcbiAgICAgICAgdGhpcy5fbWF4TGVuZ3RoID0gbWF4TGVuZ3RoO1xuICAgICAgICB0aGlzLl9wYXR0ZXJuID0gcGF0dGVybjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIGFzTnVtYmVyKHN0ZXA/OiBudW1iZXIsIG1pbj86IG51bWJlciwgbWF4PzogbnVtYmVyLCBtaW5GcmFjdGlvbkRpZ2l0cz86IG51bWJlciwgbWF4RnJhY3Rpb25EaWdpdHM/OiBudW1iZXIsIG51bWJlclVzZUdyb3VwaW5nID0gdHJ1ZSk6IHRoaXMge1xuICAgICAgICB0aGlzLl9maWVsZFR5cGUgPSBGaWVsZElucHV0RGVzY3JpcHRvci5UeXBlRW51bS5OdW1iZXI7XG4gICAgICAgIHRoaXMuX251bWJlclN0ZXAgPSBzdGVwO1xuICAgICAgICB0aGlzLl9udW1iZXJNaW5GcmFjdGlvbkRpZ2l0cyA9IG1pbkZyYWN0aW9uRGlnaXRzO1xuICAgICAgICB0aGlzLl9udW1iZXJNYXhGcmFjdGlvbkRpZ2l0cyA9IG1heEZyYWN0aW9uRGlnaXRzO1xuICAgICAgICB0aGlzLl9udW1iZXJNaW4gPSBtaW4gPz8gTnVtYmVyLk1JTl9TQUZFX0lOVEVHRVI7XG4gICAgICAgIHRoaXMuX251bWJlck1heCA9IG1heCA/PyBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUjtcbiAgICAgICAgdGhpcy5fbnVtYmVyVXNlR3JvdXBpbmcgPSBudW1iZXJVc2VHcm91cGluZztcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgYXNTd2l0Y2goKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2ZpZWxkVHlwZSA9IEZpZWxkSW5wdXREZXNjcmlwdG9yLlR5cGVFbnVtLlN3aXRjaDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIGFzUmFkaW8ob3B0aW9uczogQXJyYXk8c3RyaW5nIHwgbnVtYmVyPiwgb3B0aW9uc1RpdGxlUGF0aD86IHN0cmluZyk6IHRoaXMge1xuICAgICAgICB0aGlzLl9maWVsZFR5cGUgPSBGaWVsZElucHV0RGVzY3JpcHRvci5UeXBlRW51bS5SYWRpbztcbiAgICAgICAgdGhpcy5fcmFkaW9PcHRpb25zID0gb3B0aW9ucy5tYXAobyA9PiA8RW51bVZhbHVlPHN0cmluZyB8IG51bWJlcj4+e3ZhbHVlOiBvLCB0aXRsZTogYCR7b3B0aW9uc1RpdGxlUGF0aCA/IGAke29wdGlvbnNUaXRsZVBhdGh9LmAgOiAnJ30ke299YH0pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgYXNSYWRpb0Zyb21FbnVtKGVudW1UeXBlOiBFbnVtVHlwZSwgb3B0aW9uc1RpdGxlUGF0aD86IHN0cmluZyB8IG51bGwsIHZhbHVlcz86IEFycmF5PEVudW1Db25zdGFudFR5cGU+LCBuYW1lQXNWYWx1ZSA9IGZhbHNlKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2ZpZWxkVHlwZSA9IEZpZWxkSW5wdXREZXNjcmlwdG9yLlR5cGVFbnVtLlJhZGlvO1xuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnNUaXRsZVBhdGggPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBvcHRpb25zVGl0bGVQYXRoID0gVHlwZVV0aWwuZmluZEVudW1OYW1lKGVudW1UeXBlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9yYWRpb09wdGlvbnMgPSBBcnJheS5pc0FycmF5KHZhbHVlcylcbiAgICAgICAgICAgID8gRW51bVV0aWwuZnJvbVZhbHVlc0FzRW51bVZhbHVlQXJyYXkoZW51bVR5cGUsIHZhbHVlcywgbmFtZUFzVmFsdWUsIG9wdGlvbnNUaXRsZVBhdGggPz8gdW5kZWZpbmVkKVxuICAgICAgICAgICAgOiBFbnVtVXRpbC5mcm9tQ29uc3RhbnRzQXNFbnVtVmFsdWVBcnJheShlbnVtVHlwZSwgbmFtZUFzVmFsdWUsIG9wdGlvbnNUaXRsZVBhdGggPz8gdW5kZWZpbmVkKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIGFzRGF0ZVBpY2tlcihmb3JtYXQ/OiBzdHJpbmcsIG1pbj86IERhdGUsIG1heD86IERhdGUsIHNob3dUaW1lPzogYm9vbGVhbik6IHRoaXMge1xuICAgICAgICB0aGlzLl9maWVsZFR5cGUgPSBGaWVsZElucHV0RGVzY3JpcHRvci5UeXBlRW51bS5EYXRlcGlja2VyO1xuICAgICAgICB0aGlzLl9kYXRlUGlja2VyRm9ybWF0ID0gZm9ybWF0ID8gZm9ybWF0IDogJ2RkLm1tLnl5JztcbiAgICAgICAgdGhpcy5fZGF0ZVBpY2tlck1pbiA9IG1pbjtcbiAgICAgICAgdGhpcy5fZGF0ZVBpY2tlck1heCA9IG1heDtcbiAgICAgICAgdGhpcy5fZGF0ZVBpY2tlclNob3dUaW1lID0gc2hvd1RpbWUgPz8gZmFsc2U7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc01hc2sobWFzazogc3RyaW5nLCBzbG90Q2hhcjogc3RyaW5nKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2ZpZWxkVHlwZSA9IEZpZWxkSW5wdXREZXNjcmlwdG9yLlR5cGVFbnVtLk1hc2s7XG4gICAgICAgIHRoaXMuX21hc2sgPSBtYXNrO1xuICAgICAgICB0aGlzLl9zbG90Q2hhciA9IHNsb3RDaGFyO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgYXNDdXN0b21Db21wb25lbnQoY3VzdG9tQ29tcG9uZW50TmFtZTogc3RyaW5nKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2ZpZWxkVHlwZSA9IEZpZWxkSW5wdXREZXNjcmlwdG9yLlR5cGVFbnVtLkN1c3RvbTtcbiAgICAgICAgdGhpcy5fY3VzdG9tQ29tcG9uZW50TmFtZSA9IGN1c3RvbUNvbXBvbmVudE5hbWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBjb3B5KCk6IEZpZWxkSW5wdXREZXNjcmlwdG9yPEVUPiB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gbmV3IEZpZWxkSW5wdXREZXNjcmlwdG9yPEVUPih0aGlzLl9lZGl0b3IsIHRoaXMuX3Byb3BlcnR5KTtcbiAgICAgICAgdGhpcy5jb3B5RmllbGRzVG8oZmllbGQpO1xuICAgICAgICBmaWVsZC5fZmllbGRUeXBlID0gdGhpcy5fZmllbGRUeXBlO1xuICAgICAgICBmaWVsZC5fcm93cyA9IHRoaXMuX3Jvd3M7XG4gICAgICAgIGZpZWxkLl9udW1iZXJNaW4gPSB0aGlzLl9udW1iZXJNaW47XG4gICAgICAgIGZpZWxkLl9udW1iZXJNYXggPSB0aGlzLl9udW1iZXJNYXg7XG4gICAgICAgIGZpZWxkLl9udW1iZXJTdGVwID0gdGhpcy5fbnVtYmVyU3RlcDtcbiAgICAgICAgZmllbGQuX251bWJlck1pbkZyYWN0aW9uRGlnaXRzID0gdGhpcy5fbnVtYmVyTWluRnJhY3Rpb25EaWdpdHM7XG4gICAgICAgIGZpZWxkLl9udW1iZXJNYXhGcmFjdGlvbkRpZ2l0cyA9IHRoaXMuX251bWJlck1heEZyYWN0aW9uRGlnaXRzO1xuICAgICAgICBmaWVsZC5fbnVtYmVyVXNlR3JvdXBpbmcgPSB0aGlzLl9udW1iZXJVc2VHcm91cGluZztcbiAgICAgICAgZmllbGQuX3JhZGlvT3B0aW9ucyA9IFsuLi50aGlzLl9yYWRpb09wdGlvbnNdO1xuICAgICAgICBmaWVsZC5fZGF0ZVBpY2tlckZvcm1hdCA9IHRoaXMuX2RhdGVQaWNrZXJGb3JtYXQ7XG4gICAgICAgIGZpZWxkLl9kYXRlUGlja2VyTWluID0gdGhpcy5fZGF0ZVBpY2tlck1pbjtcbiAgICAgICAgZmllbGQuX2RhdGVQaWNrZXJNYXggPSB0aGlzLl9kYXRlUGlja2VyTWF4O1xuICAgICAgICBmaWVsZC5fZGF0ZVBpY2tlclNob3dUaW1lID0gdGhpcy5fZGF0ZVBpY2tlclNob3dUaW1lO1xuICAgICAgICBmaWVsZC5fbWF4TGVuZ3RoID0gdGhpcy5fbWF4TGVuZ3RoO1xuICAgICAgICBmaWVsZC5fbWluTGVuZ3RoID0gdGhpcy5fbWluTGVuZ3RoO1xuICAgICAgICBmaWVsZC5fcGF0dGVybiA9IHRoaXMuX3BhdHRlcm47XG4gICAgICAgIGZpZWxkLl9tYXNrID0gdGhpcy5fbWFzaztcbiAgICAgICAgZmllbGQuX3Nsb3RDaGFyID0gdGhpcy5fc2xvdENoYXI7XG4gICAgICAgIGZpZWxkLl9jdXN0b21Db21wb25lbnROYW1lID0gdGhpcy5fY3VzdG9tQ29tcG9uZW50TmFtZTtcbiAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgIH1cbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBGaWVsZElucHV0RGVzY3JpcHRvciB7XG4gICAgZXhwb3J0IGVudW0gVHlwZUVudW0ge1xuICAgICAgICBIaWRkZW4sXG4gICAgICAgIFRleHQsXG4gICAgICAgIFRleHRhcmVhLFxuICAgICAgICBOdW1iZXIsXG4gICAgICAgIFN3aXRjaCxcbiAgICAgICAgUmFkaW8sXG4gICAgICAgIERhdGVwaWNrZXIsXG4gICAgICAgIE1hc2ssXG4gICAgICAgIEN1c3RvbVxuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEZpZWxkTG9va3VwRGVzY3JpcHRvcjxULCBFVD4gZXh0ZW5kcyBBRmllbGREZXNjcmlwdG9yPFQsIEVUPiBpbXBsZW1lbnRzIElMb29rdXBEZXNjcmlwdG9yPFQ+IHtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgX21vZGVsVHlwZTogQ2xhc3NUeXBlPFQ+IHwgbnVsbDtcbiAgICBwcm90ZWN0ZWQgX2xvb2t1cFR5cGU6IEZpZWxkTG9va3VwRGVzY3JpcHRvci5Mb29rdXBUeXBlRW51bSA9IEZpZWxkTG9va3VwRGVzY3JpcHRvci5Mb29rdXBUeXBlRW51bS5Ecm9wZG93bjtcbiAgICBwcm90ZWN0ZWQgX2l0ZW1zTGFiZWxQcm9wZXJ0eT86IHN0cmluZztcbiAgICBwcm90ZWN0ZWQgX2l0ZW1zTGFiZWxUcmFuc2xhdGUgPSBmYWxzZTtcbiAgICBwcm90ZWN0ZWQgX2l0ZW1zVmFsdWVQcm9wZXJ0eT86IHN0cmluZztcbiAgICBwcm90ZWN0ZWQgX2l0ZW1zRGlzYWJsZWRQcm9wZXJ0eT86IHN0cmluZztcbiAgICBwcm90ZWN0ZWQgX2RhdGFLZXlQcm9wZXJ0eT86IHN0cmluZztcbiAgICBwcm90ZWN0ZWQgX2RhdGFQcm92aWRlcj86IElMb29rdXBEYXRhUHJvdmlkZXI8VCwgYW55PjtcblxuICAgIHByb3RlY3RlZCBfZHJvcGRvd25DbGFzc05hbWUgPSAnbW5nLWZpbHRlci1sb29rdXAtZHJvcGRvd24nO1xuXG4gICAgcHJvdGVjdGVkIF9hdXRvY29tcGxldGVPcGVuT25Gb2N1cyA9IGZhbHNlO1xuICAgIHByb3RlY3RlZCBfYXV0b2NvbXBsZXRlSW5saW5lU2VhcmNoID0gZmFsc2U7XG5cbiAgICBwcm90ZWN0ZWQgX2RpYWxvZ1RhYmxlRGVzY3JpcHRvcj86IFRhYmxlRGVzY3JpcHRvcjxUPjtcbiAgICBwcm90ZWN0ZWQgX2RpYWxvZ1RhYmxlRGF0YVByb3ZpZGVyPzogSVRhYmxlRGF0YVByb3ZpZGVyPFQsIGFueT47XG5cbiAgICBjb25zdHJ1Y3RvcihlZGl0b3I6IEVkaXRvckRlc2NyaXB0b3I8RVQ+LCBwcm9wZXJ0eTogc3RyaW5nLCBtb2RlbFR5cGU6IENsYXNzVHlwZTxUPiB8IG51bGwpIHtcbiAgICAgICAgc3VwZXIoZWRpdG9yLCBwcm9wZXJ0eSk7XG4gICAgICAgIHRoaXMuX21vZGVsVHlwZSA9IG1vZGVsVHlwZTtcbiAgICAgICAgTW9kZWxVdGlsLnRyeVNldExvb2t1cEl0ZW1zUHJvcGVydGllcyh0aGlzKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGxvb2t1cFR5cGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sb29rdXBUeXBlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaXRlbXNMYWJlbFByb3BlcnR5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faXRlbXNMYWJlbFByb3BlcnR5O1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaXRlbXNMYWJlbFRyYW5zbGF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2l0ZW1zTGFiZWxUcmFuc2xhdGU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBpdGVtc1ZhbHVlUHJvcGVydHkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pdGVtc1ZhbHVlUHJvcGVydHk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBpdGVtc0Rpc2FibGVkUHJvcGVydHkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pdGVtc0Rpc2FibGVkUHJvcGVydHk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBkYXRhS2V5UHJvcGVydHkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRhS2V5UHJvcGVydHk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBkYXRhUHJvdmlkZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRhUHJvdmlkZXI7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBhdXRvY29tcGxldGVPcGVuT25Gb2N1cygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2F1dG9jb21wbGV0ZU9wZW5PbkZvY3VzO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgYXV0b2NvbXBsZXRlSW5saW5lU2VhcmNoKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYXV0b2NvbXBsZXRlSW5saW5lU2VhcmNoO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZHJvcGRvd25DbGFzc05hbWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kcm9wZG93bkNsYXNzTmFtZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IG1vZGVsVHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21vZGVsVHlwZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGRpYWxvZ1RhYmxlRGVzY3JpcHRvcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RpYWxvZ1RhYmxlRGVzY3JpcHRvcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGRpYWxvZ1RhYmxlRGF0YVByb3ZpZGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGlhbG9nVGFibGVEYXRhUHJvdmlkZXI7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhJdGVtc0xhYmVsUHJvcGVydHkoaXRlbXNMYWJlbFByb3BlcnR5OiBzdHJpbmcsIHRyYW5zbGF0ZSA9IGZhbHNlKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2l0ZW1zTGFiZWxQcm9wZXJ0eSA9IGl0ZW1zTGFiZWxQcm9wZXJ0eTtcbiAgICAgICAgdGhpcy5faXRlbXNMYWJlbFRyYW5zbGF0ZSA9IHRyYW5zbGF0ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhJdGVtc1ZhbHVlUHJvcGVydHkoaXRlbXNWYWx1ZVByb3BlcnR5OiBzdHJpbmcpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5faXRlbXNWYWx1ZVByb3BlcnR5ID0gaXRlbXNWYWx1ZVByb3BlcnR5O1xuICAgICAgICB0aGlzLl9kYXRhS2V5UHJvcGVydHkgPSB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoSXRlbXNEaXNhYmxlZFByb3BlcnR5KGl0ZW1zRGlzYWJsZWRQcm9wZXJ0eTogc3RyaW5nKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2l0ZW1zRGlzYWJsZWRQcm9wZXJ0eSA9IGl0ZW1zRGlzYWJsZWRQcm9wZXJ0eTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhEYXRhS2V5UHJvcGVydHkocHJvcGVydHk6IHN0cmluZyk6IHRoaXMge1xuICAgICAgICB0aGlzLl9kYXRhS2V5UHJvcGVydHkgPSBwcm9wZXJ0eTtcbiAgICAgICAgdGhpcy5faXRlbXNWYWx1ZVByb3BlcnR5ID0gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aExvb2t1cDxTPihsb29rdXA6IChxdWVyeVBhcmFtPzogTWVkaXVzUXVlcnlQYXJhbSwgc2VydmljZT86IFMsIHNlYXJjaD86IHN0cmluZykgPT4gT2JzZXJ2YWJsZTxBcnJheTxUPj4sIHNlcnZpY2VUeXBlPzogVHlwZTxTPik6IHRoaXMge1xuICAgICAgICBjb25zdCBkYXRhUHJvdmlkZXIgPSBuZXcgTG9va3VwRGF0YVByb3ZpZGVyPFQsIFM+KHRoaXMuX21vZGVsVHlwZSk7XG4gICAgICAgIGlmIChzZXJ2aWNlVHlwZSkge1xuICAgICAgICAgICAgZGF0YVByb3ZpZGVyLndpdGhTZXJ2aWNlVHlwZShzZXJ2aWNlVHlwZSk7XG4gICAgICAgIH1cbiAgICAgICAgZGF0YVByb3ZpZGVyLndpdGhMb29rdXAobG9va3VwKTtcbiAgICAgICAgdGhpcy5fZGF0YVByb3ZpZGVyID0gZGF0YVByb3ZpZGVyO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aExvb2t1cERhdGFQcm92aWRlcihkYXRhUHJvdmlkZXI6IElMb29rdXBEYXRhUHJvdmlkZXI8VCwgYW55Pik6IHRoaXMge1xuICAgICAgICB0aGlzLl9kYXRhUHJvdmlkZXIgPSBkYXRhUHJvdmlkZXI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBvdmVycmlkZSB3aXRoQ29uZmlnKGNvbmZpZzogRmllbGRMb29rdXBDb25maWcpOiB0aGlzIHtcbiAgICAgICAgcmV0dXJuIHN1cGVyLndpdGhDb25maWcoY29uZmlnKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXNBdXRvY29tcGxldGUob3Blbk9uRm9jdXMgPSBmYWxzZSwgaW5saW5lU2VhcmNoID0gZmFsc2UpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fbG9va3VwVHlwZSA9IEZpbHRlckxvb2t1cERlc2NyaXB0b3IuTG9va3VwVHlwZUVudW0uQXV0b2NvbXBsZXRlO1xuICAgICAgICB0aGlzLl9hdXRvY29tcGxldGVPcGVuT25Gb2N1cyA9IG9wZW5PbkZvY3VzO1xuICAgICAgICB0aGlzLl9hdXRvY29tcGxldGVJbmxpbmVTZWFyY2ggPSBpbmxpbmVTZWFyY2g7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc0RpYWxvZyhsb29rdXBUYWJsZURlc2NyaXB0b3I6IFRhYmxlRGVzY3JpcHRvcjxUPiwgdGFibGVEYXRhUHJvdmlkZXI/OiBJVGFibGVEYXRhUHJvdmlkZXI8VCwgYW55Pik6IHRoaXMge1xuICAgICAgICB0aGlzLl9sb29rdXBUeXBlID0gRmllbGRMb29rdXBEZXNjcmlwdG9yLkxvb2t1cFR5cGVFbnVtLkRpYWxvZztcbiAgICAgICAgdGhpcy5fZGlhbG9nVGFibGVEZXNjcmlwdG9yID0gbG9va3VwVGFibGVEZXNjcmlwdG9yO1xuICAgICAgICB0aGlzLl9kaWFsb2dUYWJsZURhdGFQcm92aWRlciA9IHRhYmxlRGF0YVByb3ZpZGVyO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgY29weSgpOiBGaWVsZExvb2t1cERlc2NyaXB0b3I8VCwgRVQ+IHtcbiAgICAgICAgY29uc3QgZmllbGQgPSBuZXcgRmllbGRMb29rdXBEZXNjcmlwdG9yKHRoaXMuX2VkaXRvciwgdGhpcy5fcHJvcGVydHksIHRoaXMuX21vZGVsVHlwZSk7XG4gICAgICAgIHRoaXMuY29weUZpZWxkc1RvKGZpZWxkKTtcbiAgICAgICAgZmllbGQuX2xvb2t1cFR5cGUgPSB0aGlzLl9sb29rdXBUeXBlO1xuICAgICAgICBmaWVsZC5faXRlbXNMYWJlbFByb3BlcnR5ID0gdGhpcy5faXRlbXNMYWJlbFByb3BlcnR5O1xuICAgICAgICBmaWVsZC5faXRlbXNMYWJlbFRyYW5zbGF0ZSA9IHRoaXMuX2l0ZW1zTGFiZWxUcmFuc2xhdGU7XG4gICAgICAgIGZpZWxkLl9pdGVtc1ZhbHVlUHJvcGVydHkgPSB0aGlzLl9pdGVtc1ZhbHVlUHJvcGVydHk7XG4gICAgICAgIGZpZWxkLl9pdGVtc0Rpc2FibGVkUHJvcGVydHkgPSB0aGlzLl9pdGVtc0Rpc2FibGVkUHJvcGVydHk7XG4gICAgICAgIGZpZWxkLl9kYXRhS2V5UHJvcGVydHkgPSB0aGlzLl9kYXRhS2V5UHJvcGVydHk7XG4gICAgICAgIGZpZWxkLl9kYXRhUHJvdmlkZXIgPSB0aGlzLl9kYXRhUHJvdmlkZXI7XG4gICAgICAgIGZpZWxkLl9kcm9wZG93bkNsYXNzTmFtZSA9IHRoaXMuX2Ryb3Bkb3duQ2xhc3NOYW1lO1xuICAgICAgICBmaWVsZC5fYXV0b2NvbXBsZXRlT3Blbk9uRm9jdXMgPSB0aGlzLl9hdXRvY29tcGxldGVPcGVuT25Gb2N1cztcbiAgICAgICAgZmllbGQuX2F1dG9jb21wbGV0ZUlubGluZVNlYXJjaCA9IHRoaXMuX2F1dG9jb21wbGV0ZUlubGluZVNlYXJjaDtcbiAgICAgICAgZmllbGQuX2RpYWxvZ1RhYmxlRGVzY3JpcHRvciA9IHRoaXMuX2RpYWxvZ1RhYmxlRGVzY3JpcHRvcjtcbiAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgIH1cbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBGaWVsZExvb2t1cERlc2NyaXB0b3Ige1xuICAgIGV4cG9ydCBlbnVtIExvb2t1cFR5cGVFbnVtIHtcbiAgICAgICAgRHJvcGRvd24sXG4gICAgICAgIEF1dG9jb21wbGV0ZSxcbiAgICAgICAgRGlhbG9nXG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgRmllbGRMb29rdXBFbnVtRGVzY3JpcHRvcjxFVD4gZXh0ZW5kcyBGaWVsZExvb2t1cERlc2NyaXB0b3I8RW51bVZhbHVlPHN0cmluZyB8IG51bWJlcj4sIEVUPiB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBfZW51bVR5cGU6IEVudW1UeXBlO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX29wdGlvbkVudW1WYWx1ZXM6IEVudW1WYWx1ZTxzdHJpbmcgfCBudW1iZXI+W107XG4gICAgcHJpdmF0ZSByZWFkb25seSBfbmFtZUFzVmFsdWU6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIGNvbnN0cnVjdG9yKGVkaXRvcjogRWRpdG9yRGVzY3JpcHRvcjxFVD4sIHByb3BlcnR5OiBzdHJpbmcsIGVudW1UeXBlOiBFbnVtVHlwZSwgb3B0aW9ucz86IEFycmF5PEVudW1Db25zdGFudFR5cGU+LCBuYW1lQXNWYWx1ZSA9IGZhbHNlLCBvcHRpb25zVGl0bGVQYXRoPzogc3RyaW5nIHwgbnVsbCkge1xuICAgICAgICBzdXBlcihlZGl0b3IsIHByb3BlcnR5LCBudWxsKTtcbiAgICAgICAgdGhpcy5fZW51bVR5cGUgPSBlbnVtVHlwZTtcbiAgICAgICAgdGhpcy5fbmFtZUFzVmFsdWUgPSBuYW1lQXNWYWx1ZTtcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zVGl0bGVQYXRoID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgb3B0aW9uc1RpdGxlUGF0aCA9IFR5cGVVdGlsLmZpbmRFbnVtTmFtZShlbnVtVHlwZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fb3B0aW9uRW51bVZhbHVlcyA9IEFycmF5LmlzQXJyYXkob3B0aW9ucylcbiAgICAgICAgICAgID8gRW51bVV0aWwuZnJvbVZhbHVlc0FzRW51bVZhbHVlQXJyYXkoZW51bVR5cGUsIG9wdGlvbnMsIG5hbWVBc1ZhbHVlLCBvcHRpb25zVGl0bGVQYXRoID8/IHVuZGVmaW5lZClcbiAgICAgICAgICAgIDogRW51bVV0aWwuZnJvbUNvbnN0YW50c0FzRW51bVZhbHVlQXJyYXkoZW51bVR5cGUsIG5hbWVBc1ZhbHVlLCBvcHRpb25zVGl0bGVQYXRoID8/IHVuZGVmaW5lZCk7XG4gICAgICAgIGNvbnN0IGRhdGFQcm92aWRlciA9IG5ldyBMb29rdXBEYXRhUHJvdmlkZXI8RW51bVZhbHVlPHN0cmluZyB8IG51bWJlcj4sIGFueT4obnVsbCkud2l0aExvb2t1cCgoKSA9PiBvZih0aGlzLl9vcHRpb25FbnVtVmFsdWVzKSk7XG4gICAgICAgIHRoaXMud2l0aExvb2t1cERhdGFQcm92aWRlcihkYXRhUHJvdmlkZXIpO1xuICAgICAgICB0aGlzLndpdGhJdGVtc0xhYmVsUHJvcGVydHkoJ3RpdGxlJywgb3B0aW9uc1RpdGxlUGF0aCAhPT0gbnVsbCk7XG4gICAgICAgIHRoaXMud2l0aEl0ZW1zVmFsdWVQcm9wZXJ0eSgndmFsdWUnKTtcbiAgICAgICAgdGhpcy53aXRoSXRlbXNEaXNhYmxlZFByb3BlcnR5KCdkaXNhYmxlZCcpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZW51bVR5cGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9lbnVtVHlwZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aERpc2FibGVkT3B0aW9ucyguLi5kaXNhYmxlZE9wdGlvbnM6IEFycmF5PEVudW1Db25zdGFudFR5cGU+KTogdGhpcyB7XG4gICAgICAgIGZvciAoY29uc3QgZGlzYWJsZWRPcHRpb24gb2YgZGlzYWJsZWRPcHRpb25zKSB7XG4gICAgICAgICAgICBjb25zdCBkaXNhYmxlZE9wdGlvblZhbHVlID0gdGhpcy5fbmFtZUFzVmFsdWUgPyBFbnVtVXRpbC5nZXRDb25zdGFudE5hbWUodGhpcy5fZW51bVR5cGUsIGRpc2FibGVkT3B0aW9uKSA6IGRpc2FibGVkT3B0aW9uO1xuICAgICAgICAgICAgaWYgKGRpc2FibGVkT3B0aW9uVmFsdWUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBvcHRpb24gPSB0aGlzLl9vcHRpb25FbnVtVmFsdWVzLmZpbmQobyA9PiBvLnZhbHVlID09PSBkaXNhYmxlZE9wdGlvblZhbHVlKTtcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbi5kaXNhYmxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBvdmVycmlkZSBhc0F1dG9jb21wbGV0ZShvcGVuT25Gb2N1cyA9IHRydWUpOiB0aGlzIHtcbiAgICAgICAgc3VwZXIuYXNBdXRvY29tcGxldGUob3Blbk9uRm9jdXMsIHRydWUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgb3ZlcnJpZGUgY29weSgpOiBGaWVsZExvb2t1cEVudW1EZXNjcmlwdG9yPEVUPiB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gbmV3IEZpZWxkTG9va3VwRW51bURlc2NyaXB0b3I8RVQ+KHRoaXMuX2VkaXRvciwgdGhpcy5fcHJvcGVydHksIHRoaXMuX2VudW1UeXBlLCBbXSk7XG4gICAgICAgIHRoaXMuY29weUZpZWxkc1RvKGZpZWxkKTtcbiAgICAgICAgZmllbGQuX2xvb2t1cFR5cGUgPSB0aGlzLl9sb29rdXBUeXBlO1xuICAgICAgICBmaWVsZC5faXRlbXNMYWJlbFByb3BlcnR5ID0gdGhpcy5faXRlbXNMYWJlbFByb3BlcnR5O1xuICAgICAgICBmaWVsZC5faXRlbXNWYWx1ZVByb3BlcnR5ID0gdGhpcy5faXRlbXNWYWx1ZVByb3BlcnR5O1xuICAgICAgICBmaWVsZC5faXRlbXNEaXNhYmxlZFByb3BlcnR5ID0gdGhpcy5faXRlbXNEaXNhYmxlZFByb3BlcnR5O1xuICAgICAgICBmaWVsZC5fZGF0YUtleVByb3BlcnR5ID0gdGhpcy5fZGF0YUtleVByb3BlcnR5O1xuICAgICAgICBmaWVsZC5fZGF0YVByb3ZpZGVyID0gdGhpcy5fZGF0YVByb3ZpZGVyO1xuICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgRmllbGRNYW55VG9NYW55RWRpdG9yRGVzY3JpcHRvcjxULCBFVD4gZXh0ZW5kcyBBRmllbGREZXNjcmlwdG9yPFQsIEVUPiB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBfbWFpblRhYmxlRGVzY3JpcHRvcjogVGFibGVEZXNjcmlwdG9yPFQ+OyAvLyB0YWJsZSBkZXNjcmlwdG9yIGZvciBtYWluIHRhYmxlIGNvbXBvbmVudFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2xvb2t1cFRhYmxlRGVzY3JpcHRvcjogVGFibGVEZXNjcmlwdG9yPFQ+OyAvLyB0YWJsZSBkZXNjcmlwdG9yIGZvciB3aGVyZSBzZWxlY3Qgd2lsbCBiZSBhcHBsaWVkXG4gICAgcHJpdmF0ZSBfZmllbGRUeXBlOiBGaWVsZE1hbnlUb01hbnlFZGl0b3JEZXNjcmlwdG9yLlR5cGVFbnVtID0gRmllbGRNYW55VG9NYW55RWRpdG9yRGVzY3JpcHRvci5UeXBlRW51bS5EaWFsb2dUYWJsZU11bHRpc2VsZWN0O1xuICAgIHByaXZhdGUgX2xvb2t1cFRhYmxlRGF0YVByb3ZpZGVyOiBJVGFibGVEYXRhUHJvdmlkZXI8VCwgYW55PiB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgX2FjdGlvbnM6IEFycmF5PEZpZWxkTWFueVRvTWFueUVkaXRvckRlc2NyaXB0b3IuQWN0aW9uRW51bT4gPSBbXTtcbiAgICBwcml2YXRlIF9oYXNMb29rdXBFeGNsdWRlVmFsdWVzID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfZXhjbHVkZUZpbHRlclByb3BlcnR5ID0gJyc7XG4gICAgcHJpdmF0ZSBfZXhjbHVkZVZhbHVlUHJvcGVydHkgPSAnJztcblxuICAgIGNvbnN0cnVjdG9yKGVkaXRvcjogRWRpdG9yRGVzY3JpcHRvcjxFVD4sIHByb3BlcnR5OiBzdHJpbmcsIG1haW5UYWJsZURlc2NyaXB0b3I6IFRhYmxlRGVzY3JpcHRvcjxUPiwgbG9va3VwVGFibGVEZXNjcmlwdG9yOiBUYWJsZURlc2NyaXB0b3I8VD4pIHtcbiAgICAgICAgc3VwZXIoZWRpdG9yLCBwcm9wZXJ0eSk7XG4gICAgICAgIHRoaXMuX21haW5UYWJsZURlc2NyaXB0b3IgPSBtYWluVGFibGVEZXNjcmlwdG9yO1xuICAgICAgICB0aGlzLl9sb29rdXBUYWJsZURlc2NyaXB0b3IgPSBsb29rdXBUYWJsZURlc2NyaXB0b3I7XG4gICAgICAgIHRoaXMuX2FjdGlvbnMucHVzaChGaWVsZE1hbnlUb01hbnlFZGl0b3JEZXNjcmlwdG9yLkFjdGlvbkVudW0uQWRkLCBGaWVsZE1hbnlUb01hbnlFZGl0b3JEZXNjcmlwdG9yLkFjdGlvbkVudW0uRGVsZXRlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGZpZWxkVHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpZWxkVHlwZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGxvb2t1cFRhYmxlRGF0YVByb3ZpZGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbG9va3VwVGFibGVEYXRhUHJvdmlkZXI7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBhY3Rpb25zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWN0aW9ucztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGhhc0xvb2t1cEV4Y2x1ZGVWYWx1ZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9oYXNMb29rdXBFeGNsdWRlVmFsdWVzO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZXhjbHVkZUZpbHRlclByb3BlcnR5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZXhjbHVkZUZpbHRlclByb3BlcnR5O1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZXhjbHVkZVZhbHVlUHJvcGVydHkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9leGNsdWRlVmFsdWVQcm9wZXJ0eTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IG1haW5UYWJsZURlc2NyaXB0b3IoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tYWluVGFibGVEZXNjcmlwdG9yO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbG9va3VwVGFibGVEZXNjcmlwdG9yKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbG9va3VwVGFibGVEZXNjcmlwdG9yO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoTG9va3VwPFM+KGdldEFsbDogKHF1ZXJ5UGFyYW06IE1lZGl1c1F1ZXJ5UGFyYW0sIHNlcnZpY2U/OiBTKSA9PiBPYnNlcnZhYmxlPE1lZGl1c1F1ZXJ5UmVzdWx0PFQ+Piwgc2VydmljZVR5cGU/OiBUeXBlPFM+KTogdGhpcyB7XG4gICAgICAgIGNvbnN0IGRhdGFQcm92aWRlciA9IG5ldyBUYWJsZXZpZXdEYXRhUHJvdmlkZXI8VCwgUz4odGhpcy5fbWFpblRhYmxlRGVzY3JpcHRvci5tb2RlbC50eXBlKTtcbiAgICAgICAgaWYgKHNlcnZpY2VUeXBlKSB7XG4gICAgICAgICAgICBkYXRhUHJvdmlkZXIud2l0aFNlcnZpY2VUeXBlKHNlcnZpY2VUeXBlKTtcbiAgICAgICAgfVxuICAgICAgICBkYXRhUHJvdmlkZXIud2l0aEdldEFsbChnZXRBbGwpO1xuICAgICAgICB0aGlzLl9sb29rdXBUYWJsZURhdGFQcm92aWRlciA9IGRhdGFQcm92aWRlcjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhMb29rdXBEYXRhUHJvdmlkZXIoZGF0YVByb3ZpZGVyOiBJVGFibGVEYXRhUHJvdmlkZXI8VCwgYW55Pik6IHRoaXMge1xuICAgICAgICB0aGlzLl9sb29rdXBUYWJsZURhdGFQcm92aWRlciA9IGRhdGFQcm92aWRlcjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhBY3Rpb25zKGFjdGlvbnM6IEFycmF5PEZpZWxkTWFueVRvTWFueUVkaXRvckRlc2NyaXB0b3IuQWN0aW9uRW51bT4gPSBbXSk6IHRoaXMge1xuICAgICAgICB0aGlzLmFjdGlvbnMucHVzaCguLi5hY3Rpb25zKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhMb29rdXBFeGNsdWRlKGZpbHRlclByb3BlcnR5OiBzdHJpbmcsIHZhbHVlUHJvcGVydHk6IHN0cmluZywgaGFzTG9va3VwRXhjbHVkZSA9IHRydWUpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5faGFzTG9va3VwRXhjbHVkZVZhbHVlcyA9IGhhc0xvb2t1cEV4Y2x1ZGU7XG4gICAgICAgIHRoaXMuX2V4Y2x1ZGVGaWx0ZXJQcm9wZXJ0eSA9IGZpbHRlclByb3BlcnR5O1xuICAgICAgICB0aGlzLl9leGNsdWRlVmFsdWVQcm9wZXJ0eSA9IHZhbHVlUHJvcGVydHk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBjb3B5KCk6IEZpZWxkTWFueVRvTWFueUVkaXRvckRlc2NyaXB0b3I8VCwgRVQ+IHtcbiAgICAgICAgY29uc3QgZmllbGQgPSBuZXcgRmllbGRNYW55VG9NYW55RWRpdG9yRGVzY3JpcHRvcih0aGlzLl9lZGl0b3IsIHRoaXMuX3Byb3BlcnR5LCB0aGlzLl9tYWluVGFibGVEZXNjcmlwdG9yLmNvcHkoKSwgdGhpcy5fbG9va3VwVGFibGVEZXNjcmlwdG9yLmNvcHkoKSk7XG4gICAgICAgIHRoaXMuY29weUZpZWxkc1RvKGZpZWxkKTtcbiAgICAgICAgZmllbGQuX2ZpZWxkVHlwZSA9IHRoaXMuX2ZpZWxkVHlwZTtcbiAgICAgICAgZmllbGQuX2FjdGlvbnMgPSB0aGlzLl9hY3Rpb25zLm1hcChhID0+IGEpO1xuICAgICAgICBmaWVsZC5fbG9va3VwVGFibGVEYXRhUHJvdmlkZXIgPSB0aGlzLl9sb29rdXBUYWJsZURhdGFQcm92aWRlcjtcbiAgICAgICAgZmllbGQuX2hhc0xvb2t1cEV4Y2x1ZGVWYWx1ZXMgPSB0aGlzLl9oYXNMb29rdXBFeGNsdWRlVmFsdWVzO1xuICAgICAgICBmaWVsZC5fZXhjbHVkZUZpbHRlclByb3BlcnR5ID0gdGhpcy5fZXhjbHVkZUZpbHRlclByb3BlcnR5O1xuICAgICAgICBmaWVsZC5fZXhjbHVkZVZhbHVlUHJvcGVydHkgPSB0aGlzLl9leGNsdWRlVmFsdWVQcm9wZXJ0eTtcbiAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgIH1cbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBGaWVsZE1hbnlUb01hbnlFZGl0b3JEZXNjcmlwdG9yIHtcbiAgICBleHBvcnQgZW51bSBUeXBlRW51bSB7XG4gICAgICAgIERpYWxvZ1RhYmxlTXVsdGlzZWxlY3RcbiAgICB9XG5cbiAgICBleHBvcnQgZW51bSBBY3Rpb25FbnVtIHtcbiAgICAgICAgQWRkLFxuICAgICAgICBEZWxldGVcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBGaWVsZE1hbnlFZGl0b3JEZXNjcmlwdG9yPFQsIEVUPiBleHRlbmRzIEFGaWVsZERlc2NyaXB0b3I8VCwgRVQ+IHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IF90YWJsZXZpZXdEZXNjcmlwdG9yOiBUYWJsZXZpZXdEZXNjcmlwdG9yPFQ+O1xuICAgIHByaXZhdGUgX2ZpZWxkVHlwZTogRmllbGRNYW55RWRpdG9yRGVzY3JpcHRvci5UeXBlRW51bSA9IEZpZWxkTWFueUVkaXRvckRlc2NyaXB0b3IuVHlwZUVudW0uRGlhbG9nRWRpdG9yO1xuICAgIHByaXZhdGUgX2ZpZWxkQWN0aW9uczogQXJyYXk8RmllbGRNYW55RWRpdG9yRGVzY3JpcHRvci5BY3Rpb25FbnVtPiA9IFtdO1xuICAgIHByaXZhdGUgX2FjdGlvbnM6IEFycmF5PEFjdGlvbkRlc2NyaXB0b3I8VD4+ID0gW107XG5cbiAgICBjb25zdHJ1Y3RvcihlZGl0b3I6IEVkaXRvckRlc2NyaXB0b3I8RVQ+LCBwcm9wZXJ0eTogc3RyaW5nLCB0YWJsZXZpZXdEZXNjcmlwdG9yOiBUYWJsZXZpZXdEZXNjcmlwdG9yPFQ+KSB7XG4gICAgICAgIHN1cGVyKGVkaXRvciwgcHJvcGVydHkpO1xuICAgICAgICAvLyB0aGlzLl9tb2RlbFR5cGUgPSBtb2RlbFR5cGU7XG4gICAgICAgIHRoaXMuX3RhYmxldmlld0Rlc2NyaXB0b3IgPSB0YWJsZXZpZXdEZXNjcmlwdG9yO1xuICAgICAgICB0aGlzLl9maWVsZEFjdGlvbnMucHVzaChcbiAgICAgICAgICAgIEZpZWxkTWFueUVkaXRvckRlc2NyaXB0b3IuQWN0aW9uRW51bS5WaWV3LFxuICAgICAgICAgICAgRmllbGRNYW55RWRpdG9yRGVzY3JpcHRvci5BY3Rpb25FbnVtLkFkZCxcbiAgICAgICAgICAgIEZpZWxkTWFueUVkaXRvckRlc2NyaXB0b3IuQWN0aW9uRW51bS5FZGl0LFxuICAgICAgICAgICAgRmllbGRNYW55RWRpdG9yRGVzY3JpcHRvci5BY3Rpb25FbnVtLkRlbGV0ZVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZmllbGRUeXBlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZmllbGRUeXBlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZmllbGRBY3Rpb25zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZmllbGRBY3Rpb25zO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgYWN0aW9ucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FjdGlvbnM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCB0YWJsZXZpZXdEZXNjcmlwdG9yKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdGFibGV2aWV3RGVzY3JpcHRvcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHRhYmxlRGVzY3JpcHRvcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RhYmxldmlld0Rlc2NyaXB0b3IudGFibGU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBlZGl0b3JGb3JDcmVhdGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90YWJsZXZpZXdEZXNjcmlwdG9yLmFkZEVkaXRvcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGVkaXRvckZvclJlYWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90YWJsZXZpZXdEZXNjcmlwdG9yLnZpZXdFZGl0b3I7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBlZGl0b3JGb3JVcGRhdGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90YWJsZXZpZXdEZXNjcmlwdG9yLmVkaXRFZGl0b3I7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhGaWVsZEFjdGlvbihhY3Rpb246IEZpZWxkTWFueUVkaXRvckRlc2NyaXB0b3IuQWN0aW9uRW51bSk6IHRoaXMge1xuICAgICAgICB0aGlzLl9maWVsZEFjdGlvbnMucHVzaChhY3Rpb24pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aEZpZWxkQWN0aW9ucyhhY3Rpb25zOiBGaWVsZE1hbnlFZGl0b3JEZXNjcmlwdG9yLkFjdGlvbkVudW1bXSk6IHRoaXMge1xuICAgICAgICB0aGlzLl9maWVsZEFjdGlvbnMgPSBhY3Rpb25zO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aEFjdGlvbihhY3Rpb246IEFjdGlvbkRlc2NyaXB0b3I8VD4pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fYWN0aW9ucy5wdXNoKGFjdGlvbik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBjb3B5KCk6IEZpZWxkTWFueUVkaXRvckRlc2NyaXB0b3I8VCwgRVQ+IHtcbiAgICAgICAgY29uc3QgZmllbGQgPSBuZXcgRmllbGRNYW55RWRpdG9yRGVzY3JpcHRvcih0aGlzLl9lZGl0b3IsIHRoaXMuX3Byb3BlcnR5LCB0aGlzLl90YWJsZXZpZXdEZXNjcmlwdG9yLmNvcHkoKSk7XG4gICAgICAgIHRoaXMuY29weUZpZWxkc1RvKGZpZWxkKTtcbiAgICAgICAgZmllbGQuX2ZpZWxkVHlwZSA9IHRoaXMuX2ZpZWxkVHlwZTtcbiAgICAgICAgZmllbGQuX2ZpZWxkQWN0aW9ucyA9IHRoaXMuX2ZpZWxkQWN0aW9ucy5tYXAoYSA9PiBhKTtcbiAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgIH1cbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBGaWVsZE1hbnlFZGl0b3JEZXNjcmlwdG9yIHtcbiAgICBleHBvcnQgZW51bSBUeXBlRW51bSB7XG4gICAgICAgIERpYWxvZ0VkaXRvclxuICAgIH1cblxuICAgIGV4cG9ydCBlbnVtIEFjdGlvbkVudW0ge1xuICAgICAgICBWaWV3LFxuICAgICAgICBBZGQsXG4gICAgICAgIEVkaXQsXG4gICAgICAgIERlbGV0ZVxuICAgIH1cbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFGaWVsZEdyb3VwRGVzY3JpcHRvcjxFVD4gZXh0ZW5kcyBBR2VuZXJpY0ZpZWxkRGVzY3JpcHRvcjxFVD4ge1xuICAgIHByb3RlY3RlZCByZWFkb25seSBfbmFtZTogc3RyaW5nO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBfZGVmYXVsdDogYm9vbGVhbjtcbiAgICBwcm90ZWN0ZWQgX3RpdGxlPzogc3RyaW5nO1xuICAgIHByb3RlY3RlZCBfZmllbGRzOiBBR2VuZXJpY0ZpZWxkRGVzY3JpcHRvcjxFVD5bXSA9IFtdO1xuICAgIHByb3RlY3RlZCBfdmFsaWRhdG9yczogQXJyYXk8RmllbGRWYWxpZGF0b3I+ID0gW107XG5cbiAgICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoZWRpdG9yOiBFZGl0b3JEZXNjcmlwdG9yPEVUPiwgbmFtZTogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKGVkaXRvcik7XG4gICAgICAgIHRoaXMuX25hbWUgPSBgJHt0aGlzLmJhc2VOYW1lfSR7bmFtZX1gO1xuICAgICAgICB0aGlzLl9kZWZhdWx0ID0gbmFtZSA9PT0gRWRpdG9yRGVzY3JpcHRvci5kZWZhdWx0R3JvdXBOYW1lO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgdGl0bGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90aXRsZTtcbiAgICB9XG5cbiAgICBhYnN0cmFjdCBnZXQgZmllbGRzKCk6IEFHZW5lcmljRmllbGREZXNjcmlwdG9yPEVUPltdO1xuXG4gICAgcHVibGljIGdldCB2YWxpZGF0b3JzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdmFsaWRhdG9ycztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGJhc2VOYW1lKCkge1xuICAgICAgICByZXR1cm4gYCR7dGhpcy5ncm91cE5hbWUoKX1fYDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IG5hbWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9uYW1lO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZGVmYXVsdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZmF1bHQ7XG4gICAgfVxuXG4gICAgYWJzdHJhY3QgZ3JvdXBOYW1lKCk6IHN0cmluZztcblxuICAgIGFic3RyYWN0IGFkZEZpZWxkKGZpZWxkOiBBR2VuZXJpY0ZpZWxkRGVzY3JpcHRvcjxFVD4pOiB0aGlzO1xuXG4gICAgYWJzdHJhY3QgY29weSgpOiBBRmllbGRHcm91cERlc2NyaXB0b3I8RVQ+O1xuXG4gICAgcHVibGljIHdpdGhUaXRsZSh0aXRsZTogc3RyaW5nKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX3RpdGxlID0gdGl0bGU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoVmFsaWRhdG9yKG5hbWU6IHN0cmluZywgZXhwcmVzc2lvbjogKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCkgPT4gYm9vbGVhbikge1xuICAgICAgICB0aGlzLl92YWxpZGF0b3JzLnB1c2gobmV3IEZpZWxkVmFsaWRhdG9yKG5hbWUsIGV4cHJlc3Npb24sIHVuZGVmaW5lZCkpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBGaWVsZFRhYkdyb3VwRGVzY3JpcHRvcjxFVD4gZXh0ZW5kcyBBRmllbGRHcm91cERlc2NyaXB0b3I8RVQ+IHtcbiAgICBjb25zdHJ1Y3RvcihlZGl0b3I6IEVkaXRvckRlc2NyaXB0b3I8RVQ+LCBuYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoZWRpdG9yLCBuYW1lKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGZpZWxkcygpOiBBcnJheTxGaWVsZEdyb3VwRGVzY3JpcHRvcjxFVD4+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpZWxkcyBhcyBBcnJheTxGaWVsZEdyb3VwRGVzY3JpcHRvcjxFVD4+O1xuICAgIH1cblxuICAgIHB1YmxpYyBncm91cE5hbWUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuICd0YWInO1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGRGaWVsZChmaWVsZDogRmllbGRHcm91cERlc2NyaXB0b3I8RVQ+KTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2ZpZWxkcy5wdXNoKGZpZWxkKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIGNvcHkoKTogRmllbGRUYWJHcm91cERlc2NyaXB0b3I8RVQ+IHtcbiAgICAgICAgY29uc3QgdGFiID0gbmV3IEZpZWxkVGFiR3JvdXBEZXNjcmlwdG9yPEVUPih0aGlzLl9lZGl0b3IsIHRoaXMubmFtZS5zdWJzdHJpbmcodGhpcy5iYXNlTmFtZS5sZW5ndGgpKTtcbiAgICAgICAgdGFiLl90aXRsZSA9IHRoaXMuX3RpdGxlO1xuICAgICAgICB0YWIuX2ZpZWxkcyA9IHRoaXMuZmllbGRzLm1hcChmID0+IGYuY29weSgpKTtcbiAgICAgICAgcmV0dXJuIHRhYjtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBGaWVsZEdyb3VwRGVzY3JpcHRvcjxFVD4gZXh0ZW5kcyBBRmllbGRHcm91cERlc2NyaXB0b3I8RVQ+IHtcbiAgICBjb25zdHJ1Y3RvcihlZGl0b3I6IEVkaXRvckRlc2NyaXB0b3I8RVQ+LCBuYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoZWRpdG9yLCBuYW1lKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGZpZWxkcygpOiBBcnJheTxBRmllbGREZXNjcmlwdG9yPGFueSwgRVQ+PiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9maWVsZHMgYXMgQXJyYXk8QUZpZWxkRGVzY3JpcHRvcjxhbnksIEVUPj47XG4gICAgfVxuXG4gICAgcHVibGljIGdyb3VwTmFtZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gJ2dyb3VwJztcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkRmllbGQoZmllbGQ6IEFGaWVsZERlc2NyaXB0b3I8YW55LCBFVD4pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fZmllbGRzLnB1c2goZmllbGQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgY29weSgpOiBGaWVsZEdyb3VwRGVzY3JpcHRvcjxFVD4ge1xuICAgICAgICBjb25zdCBncm91cCA9IG5ldyBGaWVsZEdyb3VwRGVzY3JpcHRvcjxFVD4odGhpcy5fZWRpdG9yLCB0aGlzLm5hbWUuc3Vic3RyaW5nKHRoaXMuYmFzZU5hbWUubGVuZ3RoKSk7XG4gICAgICAgIGdyb3VwLl90aXRsZSA9IHRoaXMuX3RpdGxlO1xuICAgICAgICBncm91cC5fZmllbGRzID0gdGhpcy5maWVsZHMubWFwKGYgPT4gZi5jb3B5KCkpO1xuICAgICAgICByZXR1cm4gZ3JvdXA7XG4gICAgfVxufVxuIl19