@vgip/meta-ui 1.5.6 → 1.5.8

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 (98) hide show
  1. package/esm2020/lib/fieldAbstract.mjs +6 -6
  2. package/esm2020/lib/fieldComposite/index.mjs +65 -0
  3. package/esm2020/lib/fieldList/index.mjs +68 -0
  4. package/esm2020/lib/fieldReference/index.mjs +823 -0
  5. package/esm2020/lib/fieldSelect/index.mjs +488 -0
  6. package/esm2020/lib/index.mjs +10 -18
  7. package/esm2020/lib/layout/index.mjs +151 -0
  8. package/esm2020/lib/metaField/index.mjs +139 -0
  9. package/esm2020/lib/refDialog/index.mjs +127 -0
  10. package/esm2020/lib/resource/index.mjs +480 -0
  11. package/esm2020/lib/resourceCard/index.mjs +42 -0
  12. package/esm2020/lib/services/metaReference/index.mjs +2 -3
  13. package/fesm2015/vgip-meta-ui-fieldAbstract-2d0882f1.mjs +382 -0
  14. package/fesm2015/vgip-meta-ui-fieldAbstract-2d0882f1.mjs.map +1 -0
  15. package/fesm2015/vgip-meta-ui-index-0068fb77.mjs +368 -0
  16. package/fesm2015/vgip-meta-ui-index-0068fb77.mjs.map +1 -0
  17. package/fesm2015/vgip-meta-ui-index-3488da98.mjs +130 -0
  18. package/fesm2015/vgip-meta-ui-index-3488da98.mjs.map +1 -0
  19. package/fesm2015/vgip-meta-ui-index-4d489d76.mjs +71 -0
  20. package/fesm2015/vgip-meta-ui-index-4d489d76.mjs.map +1 -0
  21. package/fesm2015/vgip-meta-ui-index-5615e618.mjs +95 -0
  22. package/fesm2015/vgip-meta-ui-index-5615e618.mjs.map +1 -0
  23. package/fesm2015/vgip-meta-ui-index-65c10356.mjs +57 -0
  24. package/fesm2015/vgip-meta-ui-index-65c10356.mjs.map +1 -0
  25. package/fesm2015/vgip-meta-ui-index-6a77fa96.mjs +74 -0
  26. package/fesm2015/vgip-meta-ui-index-6a77fa96.mjs.map +1 -0
  27. package/fesm2015/vgip-meta-ui-index-6bd006d4.mjs +496 -0
  28. package/fesm2015/vgip-meta-ui-index-6bd006d4.mjs.map +1 -0
  29. package/fesm2015/vgip-meta-ui-index-8f5be5a7.mjs +24 -0
  30. package/fesm2015/vgip-meta-ui-index-8f5be5a7.mjs.map +1 -0
  31. package/fesm2015/vgip-meta-ui-index-92be02c0.mjs +145 -0
  32. package/fesm2015/vgip-meta-ui-index-92be02c0.mjs.map +1 -0
  33. package/fesm2015/vgip-meta-ui-index-934aeabf.mjs +68 -0
  34. package/fesm2015/vgip-meta-ui-index-934aeabf.mjs.map +1 -0
  35. package/fesm2015/vgip-meta-ui-index-9b5ee0c4.mjs +88 -0
  36. package/fesm2015/vgip-meta-ui-index-9b5ee0c4.mjs.map +1 -0
  37. package/fesm2015/vgip-meta-ui-index-a308ba4f.mjs +856 -0
  38. package/fesm2015/vgip-meta-ui-index-a308ba4f.mjs.map +1 -0
  39. package/fesm2015/vgip-meta-ui-index-def34ca9.mjs +1882 -0
  40. package/fesm2015/vgip-meta-ui-index-def34ca9.mjs.map +1 -0
  41. package/fesm2015/vgip-meta-ui-index-fa0b1b8b.mjs +460 -0
  42. package/fesm2015/vgip-meta-ui-index-fa0b1b8b.mjs.map +1 -0
  43. package/fesm2015/vgip-meta-ui-metaModel.pipe-725f401c.mjs +28 -0
  44. package/fesm2015/vgip-meta-ui-metaModel.pipe-725f401c.mjs.map +1 -0
  45. package/fesm2015/vgip-meta-ui-relativeTimeBuilder-31791ce4.mjs +51 -0
  46. package/fesm2015/vgip-meta-ui-relativeTimeBuilder-31791ce4.mjs.map +1 -0
  47. package/fesm2015/vgip-meta-ui.mjs +40 -5083
  48. package/fesm2015/vgip-meta-ui.mjs.map +1 -1
  49. package/fesm2020/vgip-meta-ui-fieldAbstract-2d0882f1.mjs +382 -0
  50. package/fesm2020/vgip-meta-ui-fieldAbstract-2d0882f1.mjs.map +1 -0
  51. package/fesm2020/vgip-meta-ui-index-0068fb77.mjs +368 -0
  52. package/fesm2020/vgip-meta-ui-index-0068fb77.mjs.map +1 -0
  53. package/fesm2020/vgip-meta-ui-index-3488da98.mjs +130 -0
  54. package/fesm2020/vgip-meta-ui-index-3488da98.mjs.map +1 -0
  55. package/fesm2020/vgip-meta-ui-index-3907f4b1.mjs +1879 -0
  56. package/fesm2020/vgip-meta-ui-index-3907f4b1.mjs.map +1 -0
  57. package/fesm2020/vgip-meta-ui-index-3d8c2fcd.mjs +856 -0
  58. package/fesm2020/vgip-meta-ui-index-3d8c2fcd.mjs.map +1 -0
  59. package/fesm2020/vgip-meta-ui-index-5615e618.mjs +95 -0
  60. package/fesm2020/vgip-meta-ui-index-5615e618.mjs.map +1 -0
  61. package/fesm2020/vgip-meta-ui-index-65c10356.mjs +57 -0
  62. package/fesm2020/vgip-meta-ui-index-65c10356.mjs.map +1 -0
  63. package/fesm2020/vgip-meta-ui-index-6f96198b.mjs +70 -0
  64. package/fesm2020/vgip-meta-ui-index-6f96198b.mjs.map +1 -0
  65. package/fesm2020/vgip-meta-ui-index-710246ac.mjs +73 -0
  66. package/fesm2020/vgip-meta-ui-index-710246ac.mjs.map +1 -0
  67. package/fesm2020/vgip-meta-ui-index-8f5be5a7.mjs +24 -0
  68. package/fesm2020/vgip-meta-ui-index-8f5be5a7.mjs.map +1 -0
  69. package/fesm2020/vgip-meta-ui-index-934aeabf.mjs +68 -0
  70. package/fesm2020/vgip-meta-ui-index-934aeabf.mjs.map +1 -0
  71. package/fesm2020/vgip-meta-ui-index-9b5ee0c4.mjs +88 -0
  72. package/fesm2020/vgip-meta-ui-index-9b5ee0c4.mjs.map +1 -0
  73. package/fesm2020/vgip-meta-ui-index-e743527e.mjs +495 -0
  74. package/fesm2020/vgip-meta-ui-index-e743527e.mjs.map +1 -0
  75. package/fesm2020/vgip-meta-ui-index-e8e3b16a.mjs +142 -0
  76. package/fesm2020/vgip-meta-ui-index-e8e3b16a.mjs.map +1 -0
  77. package/fesm2020/vgip-meta-ui-index-fa0b1b8b.mjs +460 -0
  78. package/fesm2020/vgip-meta-ui-index-fa0b1b8b.mjs.map +1 -0
  79. package/fesm2020/vgip-meta-ui-metaModel.pipe-725f401c.mjs +28 -0
  80. package/fesm2020/vgip-meta-ui-metaModel.pipe-725f401c.mjs.map +1 -0
  81. package/fesm2020/vgip-meta-ui-relativeTimeBuilder-31791ce4.mjs +51 -0
  82. package/fesm2020/vgip-meta-ui-relativeTimeBuilder-31791ce4.mjs.map +1 -0
  83. package/fesm2020/vgip-meta-ui.mjs +39 -5083
  84. package/fesm2020/vgip-meta-ui.mjs.map +1 -1
  85. package/lib/fieldComposite/index.d.ts +12 -0
  86. package/lib/fieldList/index.d.ts +14 -0
  87. package/lib/fieldReference/index.d.ts +73 -0
  88. package/lib/fieldSelect/index.d.ts +48 -0
  89. package/lib/index.d.ts +31 -23
  90. package/lib/layout/index.d.ts +39 -0
  91. package/lib/metaField/index.d.ts +26 -0
  92. package/lib/refDialog/index.d.ts +33 -0
  93. package/lib/resource/index.d.ts +58 -0
  94. package/lib/resourceCard/index.d.ts +18 -0
  95. package/lib/services/metaReference/index.d.ts +1 -1
  96. package/package.json +1 -1
  97. package/esm2020/lib/field.mjs +0 -2325
  98. package/lib/field.d.ts +0 -292
@@ -0,0 +1,480 @@
1
+ import { Component, EventEmitter, Input, Output } from '@angular/core';
2
+ import { metaDark, metaLight } from '../common/utils/colorThemes';
3
+ import { metaNormalizer } from '../common/metaNormalizer';
4
+ import { templateBuilder } from '../common/utils/templateBuilder';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "../services/metaResource";
7
+ import * as i2 from "../services/metaContext";
8
+ import * as i3 from "../services/metaMsg";
9
+ import * as i4 from "@angular/common";
10
+ import * as i5 from "@angular/forms";
11
+ import * as i6 from "../layout/index";
12
+ import * as i7 from "../common/metaAutofocus.directive";
13
+ export class MetaResource {
14
+ constructor(ref, el, metaResourceService, metaContext, metaMsgService) {
15
+ this.ref = ref;
16
+ this.el = el;
17
+ this.metaResourceService = metaResourceService;
18
+ this.metaContext = metaContext;
19
+ this.metaMsgService = metaMsgService;
20
+ this.done = new EventEmitter();
21
+ this.edit = true;
22
+ this.contactsSuggestionsDone = false;
23
+ this.onMenuClickout = () => {
24
+ delete this.resourceMenuVisible;
25
+ document.removeEventListener('click', this.onMenuClickout);
26
+ };
27
+ }
28
+ get niceFields() {
29
+ if (!this.resource.niceFields
30
+ && this.resource.meta
31
+ && this.resource.meta.layout
32
+ && this.resource.meta.layout.sections) {
33
+ const extractSectionFields = (s) => {
34
+ for (const f of s.fields) {
35
+ if (f.name) {
36
+ this.resource.niceFields[f.name] = f;
37
+ }
38
+ if (f.fields && f.fields.length) {
39
+ extractSectionFields(f);
40
+ }
41
+ }
42
+ };
43
+ this.resource.niceFields = {};
44
+ for (const s of this.resource.meta.layout.sections) {
45
+ extractSectionFields(s);
46
+ }
47
+ }
48
+ return this.resource.niceFields;
49
+ }
50
+ get fieldNames() {
51
+ const names = Object.keys(this.niceFields);
52
+ if (this.resource.meta.layout.children) {
53
+ for (const child of this.resource.meta.layout.children) {
54
+ names.push(child.name);
55
+ }
56
+ }
57
+ return names;
58
+ }
59
+ ngOnInit() {
60
+ this.integrationCode = (this.resource.integrationCode || '').toUpperCase();
61
+ this.resourceType = this.resource.resourceType;
62
+ this.service = (this.metaResourceServiceDelegated || this.metaResourceService).new(this.resource);
63
+ if (!this.model) {
64
+ this.model = {};
65
+ }
66
+ if (this.resource.activity && this.resource.ref.editable === false && !this.resource.externalId) {
67
+ this.resource.externalId = 'MISSING_EXTERNAL_ID';
68
+ }
69
+ this.isPersistent = this.resource && this.resource.externalId;
70
+ if (!this.resource.meta) {
71
+ this.loadMetadata(this.resource.layoutId);
72
+ }
73
+ else {
74
+ // if (this.isPersistent && (!this.isEditable || this.resources[ref.name].meta.layout.children)) {
75
+ // this.edit = false;
76
+ // }
77
+ this.meta = this.resource.meta;
78
+ this.currentLayoutId = this.meta.layout.id;
79
+ this.getDetails();
80
+ this.getFieldsMap();
81
+ }
82
+ if (this.theme !== 'inherit') {
83
+ this.applyTheme();
84
+ }
85
+ }
86
+ ngOnChanges(changes) {
87
+ if (changes.theme) {
88
+ this.theme = changes.theme.currentValue;
89
+ if (this.theme !== 'inherit') {
90
+ this.applyTheme();
91
+ }
92
+ }
93
+ }
94
+ editMode() {
95
+ this.edit = true;
96
+ }
97
+ loadMetadata(layoutId, refresh = false) {
98
+ const layoutStoreKey = `vgis.layout_${this.metaContext.vgipUserId}_${this.integrationCode}_${this.resource.resourceType}`;
99
+ if (!layoutId) {
100
+ layoutId = localStorage.getItem(layoutStoreKey);
101
+ }
102
+ this.busy = true;
103
+ setTimeout(() => {
104
+ this.metaLoading = true;
105
+ }, 0);
106
+ delete this.resource.niceFields;
107
+ this.service.getMetadata(layoutId, refresh).subscribe({
108
+ next: (meta) => {
109
+ this.currentLayoutId = meta.layout.id;
110
+ if (layoutId !== meta.layout.id && !this.isPersistent) {
111
+ localStorage.removeItem(layoutStoreKey);
112
+ }
113
+ this.meta = metaNormalizer(meta, this.integrationCode, this.resource.resourceType);
114
+ this.isEditable = this.meta.layout && this.meta.layout.editable !== false;
115
+ this.resource.meta = this.meta;
116
+ if (this.isPersistent && (!this.isEditable || this.meta.layout.children)) {
117
+ this.edit = false;
118
+ }
119
+ delete this.busy;
120
+ this.getDetails();
121
+ this.getFieldsMap();
122
+ },
123
+ error: (metaError) => {
124
+ delete this.busy;
125
+ this.generalError = `Error loading resource metadata (${metaError.statusText})`;
126
+ },
127
+ complete: () => {
128
+ delete this.metaLoading;
129
+ this.forceUiUpdate();
130
+ }
131
+ });
132
+ }
133
+ changeLayout() {
134
+ localStorage.setItem(`vgis.layout_${this.metaContext.vgipUserId}_${this.integrationCode}_${this.resource.resourceType}`, this.currentLayoutId);
135
+ this.loadMetadata(this.currentLayoutId);
136
+ }
137
+ getDetails() {
138
+ if (this.resource && (this.resource.externalId || this.resource.id)) {
139
+ if (this.resource.parent && this.resource.activity // skip fetch
140
+ && this.meta.layout.editable === false && !this.meta.layout.children) {
141
+ for (const p in this.resource.activity) {
142
+ if (this.resource.activity[p] && this.fieldNames.indexOf(p) !== -1) {
143
+ this.model[p] = this.resource.activity[p];
144
+ }
145
+ }
146
+ }
147
+ else {
148
+ this.busy = true;
149
+ this.service.getDetails((this.resource.externalId || this.resource.id), {
150
+ eventId: this.resource.eventId !== 'NO_EVENT' ? this.resource.eventId : null, layoutId: this.resource.layoutId
151
+ }).subscribe({
152
+ next: (resource) => {
153
+ /* eslint-disable no-underscore-dangle */
154
+ if (resource._vgis) {
155
+ if (resource._vgis.eventId) {
156
+ this.metaContext.vgipEventId = resource._vgis.eventId;
157
+ }
158
+ if (resource.layoutId && resource._vgis.layoutId !== this.currentLayoutId) {
159
+ this.loadMetadata(resource._vgis.layoutId);
160
+ }
161
+ }
162
+ /* eslint-enable no-underscore-dangle */
163
+ for (const p in resource) {
164
+ if (typeof (resource[p] !== 'undefined') && (this.fieldNames.indexOf(p) !== -1 || p === '_vgis')) {
165
+ this.model[p] = resource[p];
166
+ }
167
+ }
168
+ delete this.busy;
169
+ },
170
+ error: (resourceError) => {
171
+ this.generalError = resourceError.error ? resourceError.error.message || resourceError.message : resourceError.message;
172
+ delete this.busy;
173
+ },
174
+ complete: () => {
175
+ this.forceUiUpdate();
176
+ }
177
+ });
178
+ }
179
+ }
180
+ else {
181
+ if (this.resource.ref && this.resource.ref.activity) { // reuse failed autoactivities data
182
+ for (const p in this.resource.ref.activity) {
183
+ if (this.resource.ref.activity && this.fieldNames.indexOf(p) !== -1) {
184
+ this.model[p] = this.resource.ref.activity[p]; // VGIS-7215 (copy only valid fields)
185
+ }
186
+ }
187
+ }
188
+ this.performAutoFill();
189
+ }
190
+ }
191
+ performAutoFill() {
192
+ this.metaMsgService.sendMessage(this.integrationCode, {
193
+ action: 'autoFill',
194
+ integration: this.integrationCode,
195
+ resourceType: this.resourceType,
196
+ resource: JSON.parse(JSON.stringify(this.model)),
197
+ fields: this.niceFields,
198
+ event: this.metaContext.context,
199
+ profile: this.metaContext.profiles[this.integrationCode]
200
+ }, (response) => {
201
+ if (!response.error) {
202
+ for (const afp in response.autoFill) {
203
+ if (!this.model[afp]) {
204
+ this.model[afp] = response.autoFill[afp];
205
+ }
206
+ }
207
+ }
208
+ });
209
+ }
210
+ getFieldsMap() {
211
+ if (this.meta.fieldsMap) {
212
+ this.fieldsMap = this.meta.fieldsMap;
213
+ this.markContactables();
214
+ this.buildContactsSuggestions();
215
+ if (!this.resource.externalId) {
216
+ this.buildSubjectTemplate();
217
+ this.execTransformer();
218
+ }
219
+ }
220
+ else {
221
+ this.metaMsgService.sendMessage(this.integrationCode, { action: 'fieldsMap', integration: this.integrationCode, resourceType: this.resourceType }, (response) => {
222
+ if (!response.error) {
223
+ this.fieldsMap = response.fieldsMap;
224
+ this.markContactables();
225
+ this.buildContactsSuggestions();
226
+ if (!this.resource.externalId) {
227
+ this.buildSubjectTemplate();
228
+ this.execTransformer();
229
+ }
230
+ }
231
+ else {
232
+ console.log('No fields map', this.integrationCode, this.resourceType, response.error);
233
+ }
234
+ });
235
+ }
236
+ }
237
+ openResourceMenu() {
238
+ this.resourceMenuVisible = true;
239
+ setTimeout(() => {
240
+ document.addEventListener('click', this.onMenuClickout);
241
+ }, 10);
242
+ }
243
+ close(result) {
244
+ this.done.emit(result);
245
+ }
246
+ showParsedError(resourceForm, parsedError) {
247
+ this.formErrors = parsedError.message || 'There is a problem with one or more fields';
248
+ if (parsedError.errors && parsedError.errors.length) {
249
+ this.formErrors += ` (${parsedError.errors.map(e => e.message).join(', ')})`;
250
+ for (const pe of parsedError.errors) {
251
+ if (resourceForm.controls[pe.field]) {
252
+ resourceForm.controls[pe.field].setErrors({ invalid: true, custom: pe.message });
253
+ }
254
+ }
255
+ setTimeout(() => {
256
+ const firstInvalid = this.el.nativeElement.querySelector('.Vlt-form__element--error .main:not(.standalone)');
257
+ if (firstInvalid) {
258
+ firstInvalid.focus();
259
+ }
260
+ });
261
+ }
262
+ }
263
+ submit(resourceForm) {
264
+ delete this.formErrors;
265
+ resourceForm.form.submitted = true;
266
+ if (resourceForm.valid) {
267
+ this.busy = true;
268
+ if (this.metaContext.vgipEventId) {
269
+ /* eslint-disable no-underscore-dangle */
270
+ if (!this.model._vgis) {
271
+ this.model._vgis = {
272
+ connector: this.integrationCode,
273
+ resourceType: this.resourceType
274
+ };
275
+ }
276
+ this.model._vgis.layoutId = this.currentLayoutId;
277
+ // eslint-disable-next-line max-len
278
+ // this.model._vgis.timeZoneOffsetInMinutes = 0; // we are not providing timezone anymore (as V3), instead the 'time' and 'date' objects are converted so the UTC time/date is correct
279
+ this.model._vgis.eventId = this.metaContext.vgipEventId;
280
+ /* eslint-enable no-underscore-dangle */
281
+ }
282
+ this.service.save(this.model).subscribe((result) => {
283
+ this.close(result);
284
+ delete this.busy;
285
+ }, (errorResult) => {
286
+ if ((errorResult.status === 422 && errorResult.error && !errorResult.error.errors && errorResult.error.integrationError)
287
+ || (errorResult.error && errorResult.error.errors && errorResult.error.errors.length && !errorResult.error.errors[0].field)
288
+ // backend implemented error parsing but broken VGIS-7366
289
+ ) {
290
+ this.formErrors = 'There is a problem with one or more fields';
291
+ try {
292
+ this.metaMsgService.sendMessage(this.integrationCode, {
293
+ action: 'parseErrorMessage',
294
+ integrationCode: this.integrationCode,
295
+ resourceType: errorResult.error.resourceType,
296
+ rawError: errorResult.error.integrationError,
297
+ profile: this.metaContext.profiles[this.integrationCode.toUpperCase()]
298
+ }, (response) => {
299
+ if (response.parsedError) {
300
+ this.showParsedError(resourceForm, response.parsedError);
301
+ }
302
+ else {
303
+ // eslint-disable-next-line no-underscore-dangle
304
+ console.error('No error parser for', this.integrationCode, errorResult.error.integrationError);
305
+ this.formErrors = errorResult.error;
306
+ }
307
+ });
308
+ }
309
+ catch (err) {
310
+ console.log('....', err);
311
+ }
312
+ ;
313
+ }
314
+ else if (errorResult.status === 422) {
315
+ this.showParsedError(resourceForm, errorResult.error);
316
+ }
317
+ else {
318
+ this.formErrors = errorResult.error;
319
+ }
320
+ delete this.busy;
321
+ });
322
+ }
323
+ else {
324
+ this.formErrors = Object.keys(resourceForm.controls)
325
+ .filter((c) => resourceForm.controls[c].invalid)
326
+ .map((f) => (this.niceFields[f] ? (this.niceFields[f].label || f) : f)).join(', ');
327
+ setTimeout(() => {
328
+ const selector = `form[name="${this.resourceType}"] .Vlt-form__element--error .main:not(.standalone)`;
329
+ const firstInvalid = this.el.nativeElement.querySelector(selector);
330
+ if (firstInvalid) {
331
+ firstInvalid.focus();
332
+ }
333
+ });
334
+ }
335
+ }
336
+ clearFormErrors() {
337
+ delete this.formErrors;
338
+ }
339
+ suggestFieldProperty(key, value) {
340
+ if (key && value) {
341
+ const fieldNames = this.fieldNames;
342
+ if (this.model) {
343
+ const nestMatch = key.match(/(\S+)\[\d\]\.(\S+)/);
344
+ if (nestMatch && fieldNames.indexOf(nestMatch[1]) !== -1) {
345
+ this.model[nestMatch[1]] = [];
346
+ const nestKeys = {};
347
+ nestKeys[nestMatch[2]] = value;
348
+ this.model[nestMatch[1]].push(nestKeys);
349
+ }
350
+ else if (fieldNames.indexOf(key) !== -1) {
351
+ this.model[key] = value;
352
+ }
353
+ }
354
+ }
355
+ }
356
+ execTransformer() {
357
+ if (this.metaContext && this.fieldsMap) {
358
+ setTimeout(() => {
359
+ this.suggestFieldProperty(this.fieldsMap.phoneNumber, this.metaContext.phoneNumber);
360
+ if (this.fieldsMap.firstName || this.fieldsMap.lastName) {
361
+ const names = (this.metaContext.displayName || '').split(' ');
362
+ this.suggestFieldProperty(this.fieldsMap.firstName, names[0]);
363
+ this.suggestFieldProperty(this.fieldsMap.lastName, names[1]);
364
+ }
365
+ else if (this.fieldsMap.displayName) {
366
+ this.suggestFieldProperty(this.fieldsMap.displayName, this.metaContext.displayName);
367
+ }
368
+ }, 100);
369
+ }
370
+ }
371
+ markContactables() {
372
+ if (this.fieldsMap.contactables && this.fieldsMap.contactables.length) {
373
+ for (const c of this.fieldsMap.contactables) {
374
+ const field = this.niceFields[c];
375
+ if (field) {
376
+ Object.defineProperty(field, '$isContactable', {
377
+ value: true,
378
+ configurable: true,
379
+ enumerable: false
380
+ });
381
+ }
382
+ }
383
+ }
384
+ }
385
+ buildSubjectTemplate() {
386
+ if (!this.model[this.fieldsMap.subject] && this.fieldsMap.subject && this.niceFields[this.fieldsMap.subject]) {
387
+ let subjectTemplate;
388
+ if (this.niceFields[this.fieldsMap.subject].default) {
389
+ subjectTemplate = this.niceFields[this.fieldsMap.subject].default.id || this.niceFields[this.fieldsMap.subject].default;
390
+ }
391
+ else if (this.metaContext.profiles[this.integrationCode]) {
392
+ const profile = this.metaContext.profiles[this.integrationCode] || {};
393
+ subjectTemplate = profile.defaultSubject ?
394
+ profile.defaultSubject[((this.metaContext.context || 'CALL').type || '').toUpperCase()] :
395
+ profile.activityDefaultSubjectTemplate;
396
+ }
397
+ if (subjectTemplate) {
398
+ this.model[this.fieldsMap.subject] = templateBuilder(this.metaContext, subjectTemplate);
399
+ }
400
+ }
401
+ }
402
+ buildContactsSuggestions() {
403
+ // let hasDefaultContact = false;
404
+ if (this.metaContext.contactables[this.integrationCode] && this.meta.layout && this.meta.layout.sections) {
405
+ for (const s of this.meta.layout.sections) {
406
+ for (const f of (s.fields || [])) {
407
+ if (f.type === 'reference') {
408
+ const refTypes = (f.reference.length ? f.reference : [f.reference]).map(r => r.name);
409
+ for (const c of this.metaContext.contactables[this.integrationCode]) {
410
+ if (refTypes.indexOf(c.resourceType || c.type) !== -1) {
411
+ if (!f.suggestions) {
412
+ f.suggestions = [];
413
+ }
414
+ else {
415
+ f.suggestions = f.suggestions.filter(sg => !sg.auto);
416
+ }
417
+ let tLabel = c.displayName || c.name;
418
+ if (c.phoneNumbers) {
419
+ tLabel += (' ✆' + c.phoneNumbers.map(p => p.phoneNumber).join(','));
420
+ }
421
+ f.suggestions.push({
422
+ id: c.externalId || c.identifier || c.id,
423
+ label: tLabel,
424
+ type: c.resourceType || c.type,
425
+ auto: true
426
+ });
427
+ }
428
+ }
429
+ if ((this.fieldsMap.contactables || []).indexOf(f.name) !== -1) { // evaluate usability?
430
+ f.alwaysVisible = true;
431
+ }
432
+ // if (
433
+ // !hasDefaultContact && this.metaContext.defaultContactables[this.integrationCode]
434
+ // && refTypes.indexOf(this.metaContext.defaultContactables[this.integrationCode].type) !== -1
435
+ // ) {
436
+ // this.resource[f.name] = this.metaContext.defaultContactables[this.integrationCode];
437
+ // hasDefaultContact = true;
438
+ // } else if (!hasDefaultContact && this.fieldsMap.contactables && f.suggestions && f.suggestions.length === 1) {
439
+ // if (this.fieldsMap.contactables.indexOf(f.name) !== -1 && !f.default) {
440
+ // f.default = f.suggestions[0];
441
+ // hasDefaultContact = true;
442
+ // }
443
+ // }
444
+ }
445
+ }
446
+ }
447
+ this.contactsSuggestionsDone = true;
448
+ }
449
+ }
450
+ applyTheme() {
451
+ const metaTheme = this.theme === 'dark' ? metaDark : metaLight;
452
+ console.log('resource apply theme', this.theme);
453
+ for (const key of Object.keys(metaTheme.properties)) {
454
+ this.el.nativeElement.style.setProperty(key, metaTheme.properties[key]);
455
+ }
456
+ }
457
+ forceUiUpdate() {
458
+ // this.ref.detectChanges();
459
+ const e = document.createEvent('Events');
460
+ e.initEvent('click', true, false);
461
+ this.el.nativeElement.dispatchEvent(e);
462
+ }
463
+ }
464
+ MetaResource.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: MetaResource, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.ElementRef }, { token: i1.MetaResourceService }, { token: i2.MetaContextService }, { token: i3.MetaMsgService }], target: i0.ɵɵFactoryTarget.Component });
465
+ MetaResource.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.1.0", type: MetaResource, selector: "vgip-meta-resource", inputs: { resource: "resource", model: "model", metaResourceServiceDelegated: "metaResourceServiceDelegated", theme: "theme" }, outputs: { done: "done" }, usesOnChanges: true, ngImport: i0, template: "<div *ngIf='generalError' class=\"Vlt-callout Vlt-callout--critical\" style='overflow: auto; margin: 20px;'>\n\t<i></i>\n\t<div class=\"Vlt-callout__content\">\n\t\t<p>{{generalError}}</p>\n\t</div>\n</div>\n<div *ngIf='!meta' class=\"Vlt-progress\">\n\t<div class=\"Vlt-progress__bar\" [ngClass]=\"{ loading: metaLoading }\" role=\"progressbar\" aria-valuemin=\"0\" aria-valuetext=\"Loading Metadata\" aria-valuemax=\"100\"></div>\n</div>\n<form [vgipMetaFormAutofocus]='!resource || !resource.externalId' *ngIf='meta && !generalError' #resourceForm=\"ngForm\" [name]='resource.resourceType' (ngSubmit)='submit(resourceForm)' novalidate>\n\t<div class='form-content' style='overflow: hidden;'>\n\t\t<div [ngClass]=\"{ 'Vlt-callout--dismissed': !formErrors }\" class=\"Vlt-callout Vlt-callout--banner Vlt-callout--critical\">\n\t\t\t<i></i>\n\t\t\t<div class=\"Vlt-callout__content\" style=\"margin-top: auto;\">\n\t\t\t\t<p>There is a problem with one or more fields</p>\n\t\t\t\t<small style='font-weight: 600; font-size: 1.0em;' *ngIf='formErrors'>{{ formErrors.message || formErrors }}</small>\n\t\t\t</div>\n\t\t\t<button type='button' class=\"Vlt-callout__dismiss\" (click)='clearFormErrors()' aria-label=\"Dismiss\"></button>\n\t\t</div>\n\t\t<div class=\"Vlt-card__content\" style='min-height: 40px;'>\n\t\t\t<vgip-meta-layout *ngIf='edit' [meta]='meta.layout' [resource]='model' [preview]='false' [integration]='meta.integration' [type]='resource.resourceType' theme='inherit'></vgip-meta-layout>\n\t\t\t<vgip-meta-layout *ngIf='!edit' [meta]='meta.layout' [resource]='model' [preview]='true' [integration]='meta.integration' [type]='resource.resourceType' theme='inherit'></vgip-meta-layout>\n\t\t</div>\n\t</div>\n\t<div class=\"Vlt-card__footer\">\n\t\t<button class=\"Vlt-btn Vlt-btn--secondary Vlt-btn--app Vlt-btn--outline\" type='button' aria-label='Cancel' (click)='close()'>\n\t\t\t{{ edit ? 'Cancel' : 'Close' }}\n\t\t</button>\n\t\t<button *ngIf='edit' class=\"Vlt-btn Vlt-btn--app\" [ngClass]=\"{ 'Vlt-btn--primary': isPersistent, 'Vlt-btn--secondary': !isPersistent }\" type='submit'>\n\t\t\t{{ (resource && resource.externalId) ? 'Update' : 'Create' }}\n\t\t</button>\n\t\t<button (click)='editMode()' *ngIf='!edit && isEditable' [disabled]='!isEditable' class=\"Vlt-btn Vlt-btn--app Vlt-btn--primary\" type='button' aria-label='Edit'>\n\t\t\tEdit\n\t\t</button>\n\t\t<div style='margin-right: 8px; flex: 1;'>\n\t\t\t<div *ngIf='meta.availableLayouts && meta.availableLayouts.length' class=\"Vlt-form__element Vlt-form__element--big\" style='padding: 0; margin: -8px -18px -8px 0;'>\n\t\t\t\t<div class=\"Vlt-select\">\n\t\t\t\t\t<label style='all: inherit;'>\n\t\t\t\t\t\t<select style='border: 0; margin-top: 3px; background: transparent;' (change)='changeLayout()' [(ngModel)]='currentLayoutId' [ngModelOptions]='{ standalone: true }' [disabled]='isPersistent'>\n\t\t\t\t\t\t\t<option selected disabled>Select layout</option>\n\t\t\t\t\t\t\t<option *ngFor='let layout of meta.availableLayouts' [ngValue]='layout.id'>{{layout.name}}</option>\n\t\t\t\t\t\t</select>\n\t\t\t\t\t\t<label>Layout</label>\n\t\t\t\t\t</label>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t\t<div class=\"Vlt-dropdown resource-menu\" [ngClass]=\"{ 'Vlt-dropdown--expanded': resourceMenuVisible }\" style='margin-left: 2px;'>\n\t\t\t<div class=\"Vlt-dropdown__panel\" style='bottom: 40px; right: -4px; top: initial;'>\n\t\t\t\t<div class=\"Vlt-dropdown__panel__content\">\n\t\t\t\t\t<a class=\"Vlt-dropdown__link\" (click)='loadMetadata(currentLayoutId, true)'>\n\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t<svg class='Vlt-icon Vlt-icon--smaller'><use xlink:href=\"volta/volta-icons.svg#Vlt-icon-refresh\"/></svg>&nbsp;&nbsp;Refresh metadata\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</a>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div class=\"Vlt-dropdown__trigger\">\n\t\t\t\t<button type='button' (click)='openResourceMenu()' class=\"Vlt-btn Vlt-btn--link\" aria-label='Resource menu'>\n\t\t\t\t\t<svg class='Vlt-icon Vlt-icon--small' style='margin: 0;'><use xlink:href=\"volta/volta-icons.svg#Vlt-icon-more-v-negative\"/></svg>\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</form>\n<div class='busy-mask' [ngClass]=\"{ active: busy }\">\n\t<div style='height: 100%; display: flex; flex-direction: column; align-items: center; justify-content: center;'>\n\t\t<div class=\"Vlt-spinner\"></div>\n\t</div>\n</div>", styles: [":host{flex:1;display:flex;flex-direction:column;min-height:0;color:var(--vgip-meta-resource-color)}.Vlt-callout--banner{justify-content:initial;text-align:initial;overflow-y:auto}.Vlt-callout--banner.Vlt-callout--dismissed{padding:0}.Vlt-callout--banner:not(.Vlt-callout--dismissed){min-height:78px}.Vlt-spinner:before,.Vlt-spinner:after{border:6px solid #616266;border-color:#616266 transparent transparent}.Vlt-card__content{padding:8px 8px 8px 16px;display:flex;flex-direction:column;min-height:0;flex:1;overflow-y:scroll;overflow-x:hidden;background-color:var(--vgip-meta-resource-bg-color)}@media (hover: none){.Vlt-card__content{padding-right:16px}}.Vlt-card__content::-webkit-scrollbar{width:8px}.Vlt-card__content::-webkit-scrollbar-thumb{background-color:var(--vgip-meta-scrollbar-color);border:2px solid transparent;border-radius:6px;background-clip:content-box}.Vlt-card__footer{background:var(--vgip-meta-resource-bar-color);border-top:1px solid var(--vgip-meta-separator-color);display:flex;flex-direction:row;margin:16px -24px -24px;padding:8px 8px 8px 16px;box-shadow:0 0 4px #00000040;z-index:1}.Vlt-card__footer .Vlt-select select{color:var(--vgip-meta-input-color)}.Vlt-card__footer .Vlt-select select:disabled{background:initial;cursor:not-allowed}.Vlt-card__footer .Vlt-select:after{background-image:var(--vgip-meta-dropdown-icon)}.Vlt-card__footer .resource-menu .Vlt-icon:not(:hover){fill:var(--vgip-meta-input-label-color)}.Vlt-card__footer button.Vlt-btn--secondary{border:none;box-shadow:inset 0 0 0 1px var(--vgip-meta-button-border-color)}.Vlt-card__footer button.Vlt-btn--secondary:not([type=submit]){color:var(--vgip-meta-input-color)}.Vlt-card__footer button.Vlt-btn--secondary:hover{box-shadow:inset 0 0 0 1px var(--vgip-meta-input-accent-color)}.Vlt-card__footer button.Vlt-btn--secondary:hover[type=submit]{background-color:var(--vgip-meta-submit-hover-bg-color)}.Vlt-progress{margin:0;position:sticky}.Vlt-progress .Vlt-progress__bar{width:0;transition:width 5s}.Vlt-progress .Vlt-progress__bar.loading{width:100%}form{border-radius:6px;padding:24px;display:flex;flex-direction:column;min-height:0;flex:1}form .form-content{margin:-24px -24px -16px;padding-bottom:0;flex:1;display:flex;flex-direction:column}.busy-mask{position:absolute;inset:0;background:rgba(0,0,0,.32);opacity:1;z-index:898;display:none;border-bottom-left-radius:6px;border-bottom-right-radius:6px;margin:1px;cursor:progress}.busy-mask.active{display:block}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i5.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i5.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i5.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i5.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i6.MetaLayout, selector: "vgip-meta-layout", inputs: ["meta", "resource", "integration", "type", "preview", "theme"] }, { kind: "directive", type: i7.MetaAutofocusDirective, selector: "[vgipMetaFormAutofocus]", inputs: ["vgipMetaFormAutofocus"] }] });
466
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: MetaResource, decorators: [{
467
+ type: Component,
468
+ args: [{ selector: 'vgip-meta-resource', template: "<div *ngIf='generalError' class=\"Vlt-callout Vlt-callout--critical\" style='overflow: auto; margin: 20px;'>\n\t<i></i>\n\t<div class=\"Vlt-callout__content\">\n\t\t<p>{{generalError}}</p>\n\t</div>\n</div>\n<div *ngIf='!meta' class=\"Vlt-progress\">\n\t<div class=\"Vlt-progress__bar\" [ngClass]=\"{ loading: metaLoading }\" role=\"progressbar\" aria-valuemin=\"0\" aria-valuetext=\"Loading Metadata\" aria-valuemax=\"100\"></div>\n</div>\n<form [vgipMetaFormAutofocus]='!resource || !resource.externalId' *ngIf='meta && !generalError' #resourceForm=\"ngForm\" [name]='resource.resourceType' (ngSubmit)='submit(resourceForm)' novalidate>\n\t<div class='form-content' style='overflow: hidden;'>\n\t\t<div [ngClass]=\"{ 'Vlt-callout--dismissed': !formErrors }\" class=\"Vlt-callout Vlt-callout--banner Vlt-callout--critical\">\n\t\t\t<i></i>\n\t\t\t<div class=\"Vlt-callout__content\" style=\"margin-top: auto;\">\n\t\t\t\t<p>There is a problem with one or more fields</p>\n\t\t\t\t<small style='font-weight: 600; font-size: 1.0em;' *ngIf='formErrors'>{{ formErrors.message || formErrors }}</small>\n\t\t\t</div>\n\t\t\t<button type='button' class=\"Vlt-callout__dismiss\" (click)='clearFormErrors()' aria-label=\"Dismiss\"></button>\n\t\t</div>\n\t\t<div class=\"Vlt-card__content\" style='min-height: 40px;'>\n\t\t\t<vgip-meta-layout *ngIf='edit' [meta]='meta.layout' [resource]='model' [preview]='false' [integration]='meta.integration' [type]='resource.resourceType' theme='inherit'></vgip-meta-layout>\n\t\t\t<vgip-meta-layout *ngIf='!edit' [meta]='meta.layout' [resource]='model' [preview]='true' [integration]='meta.integration' [type]='resource.resourceType' theme='inherit'></vgip-meta-layout>\n\t\t</div>\n\t</div>\n\t<div class=\"Vlt-card__footer\">\n\t\t<button class=\"Vlt-btn Vlt-btn--secondary Vlt-btn--app Vlt-btn--outline\" type='button' aria-label='Cancel' (click)='close()'>\n\t\t\t{{ edit ? 'Cancel' : 'Close' }}\n\t\t</button>\n\t\t<button *ngIf='edit' class=\"Vlt-btn Vlt-btn--app\" [ngClass]=\"{ 'Vlt-btn--primary': isPersistent, 'Vlt-btn--secondary': !isPersistent }\" type='submit'>\n\t\t\t{{ (resource && resource.externalId) ? 'Update' : 'Create' }}\n\t\t</button>\n\t\t<button (click)='editMode()' *ngIf='!edit && isEditable' [disabled]='!isEditable' class=\"Vlt-btn Vlt-btn--app Vlt-btn--primary\" type='button' aria-label='Edit'>\n\t\t\tEdit\n\t\t</button>\n\t\t<div style='margin-right: 8px; flex: 1;'>\n\t\t\t<div *ngIf='meta.availableLayouts && meta.availableLayouts.length' class=\"Vlt-form__element Vlt-form__element--big\" style='padding: 0; margin: -8px -18px -8px 0;'>\n\t\t\t\t<div class=\"Vlt-select\">\n\t\t\t\t\t<label style='all: inherit;'>\n\t\t\t\t\t\t<select style='border: 0; margin-top: 3px; background: transparent;' (change)='changeLayout()' [(ngModel)]='currentLayoutId' [ngModelOptions]='{ standalone: true }' [disabled]='isPersistent'>\n\t\t\t\t\t\t\t<option selected disabled>Select layout</option>\n\t\t\t\t\t\t\t<option *ngFor='let layout of meta.availableLayouts' [ngValue]='layout.id'>{{layout.name}}</option>\n\t\t\t\t\t\t</select>\n\t\t\t\t\t\t<label>Layout</label>\n\t\t\t\t\t</label>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t\t<div class=\"Vlt-dropdown resource-menu\" [ngClass]=\"{ 'Vlt-dropdown--expanded': resourceMenuVisible }\" style='margin-left: 2px;'>\n\t\t\t<div class=\"Vlt-dropdown__panel\" style='bottom: 40px; right: -4px; top: initial;'>\n\t\t\t\t<div class=\"Vlt-dropdown__panel__content\">\n\t\t\t\t\t<a class=\"Vlt-dropdown__link\" (click)='loadMetadata(currentLayoutId, true)'>\n\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t<svg class='Vlt-icon Vlt-icon--smaller'><use xlink:href=\"volta/volta-icons.svg#Vlt-icon-refresh\"/></svg>&nbsp;&nbsp;Refresh metadata\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</a>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div class=\"Vlt-dropdown__trigger\">\n\t\t\t\t<button type='button' (click)='openResourceMenu()' class=\"Vlt-btn Vlt-btn--link\" aria-label='Resource menu'>\n\t\t\t\t\t<svg class='Vlt-icon Vlt-icon--small' style='margin: 0;'><use xlink:href=\"volta/volta-icons.svg#Vlt-icon-more-v-negative\"/></svg>\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</form>\n<div class='busy-mask' [ngClass]=\"{ active: busy }\">\n\t<div style='height: 100%; display: flex; flex-direction: column; align-items: center; justify-content: center;'>\n\t\t<div class=\"Vlt-spinner\"></div>\n\t</div>\n</div>", styles: [":host{flex:1;display:flex;flex-direction:column;min-height:0;color:var(--vgip-meta-resource-color)}.Vlt-callout--banner{justify-content:initial;text-align:initial;overflow-y:auto}.Vlt-callout--banner.Vlt-callout--dismissed{padding:0}.Vlt-callout--banner:not(.Vlt-callout--dismissed){min-height:78px}.Vlt-spinner:before,.Vlt-spinner:after{border:6px solid #616266;border-color:#616266 transparent transparent}.Vlt-card__content{padding:8px 8px 8px 16px;display:flex;flex-direction:column;min-height:0;flex:1;overflow-y:scroll;overflow-x:hidden;background-color:var(--vgip-meta-resource-bg-color)}@media (hover: none){.Vlt-card__content{padding-right:16px}}.Vlt-card__content::-webkit-scrollbar{width:8px}.Vlt-card__content::-webkit-scrollbar-thumb{background-color:var(--vgip-meta-scrollbar-color);border:2px solid transparent;border-radius:6px;background-clip:content-box}.Vlt-card__footer{background:var(--vgip-meta-resource-bar-color);border-top:1px solid var(--vgip-meta-separator-color);display:flex;flex-direction:row;margin:16px -24px -24px;padding:8px 8px 8px 16px;box-shadow:0 0 4px #00000040;z-index:1}.Vlt-card__footer .Vlt-select select{color:var(--vgip-meta-input-color)}.Vlt-card__footer .Vlt-select select:disabled{background:initial;cursor:not-allowed}.Vlt-card__footer .Vlt-select:after{background-image:var(--vgip-meta-dropdown-icon)}.Vlt-card__footer .resource-menu .Vlt-icon:not(:hover){fill:var(--vgip-meta-input-label-color)}.Vlt-card__footer button.Vlt-btn--secondary{border:none;box-shadow:inset 0 0 0 1px var(--vgip-meta-button-border-color)}.Vlt-card__footer button.Vlt-btn--secondary:not([type=submit]){color:var(--vgip-meta-input-color)}.Vlt-card__footer button.Vlt-btn--secondary:hover{box-shadow:inset 0 0 0 1px var(--vgip-meta-input-accent-color)}.Vlt-card__footer button.Vlt-btn--secondary:hover[type=submit]{background-color:var(--vgip-meta-submit-hover-bg-color)}.Vlt-progress{margin:0;position:sticky}.Vlt-progress .Vlt-progress__bar{width:0;transition:width 5s}.Vlt-progress .Vlt-progress__bar.loading{width:100%}form{border-radius:6px;padding:24px;display:flex;flex-direction:column;min-height:0;flex:1}form .form-content{margin:-24px -24px -16px;padding-bottom:0;flex:1;display:flex;flex-direction:column}.busy-mask{position:absolute;inset:0;background:rgba(0,0,0,.32);opacity:1;z-index:898;display:none;border-bottom-left-radius:6px;border-bottom-right-radius:6px;margin:1px;cursor:progress}.busy-mask.active{display:block}\n"] }]
469
+ }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i0.ElementRef }, { type: i1.MetaResourceService }, { type: i2.MetaContextService }, { type: i3.MetaMsgService }]; }, propDecorators: { resource: [{
470
+ type: Input
471
+ }], model: [{
472
+ type: Input
473
+ }], metaResourceServiceDelegated: [{
474
+ type: Input
475
+ }], theme: [{
476
+ type: Input
477
+ }], done: [{
478
+ type: Output
479
+ }] } });
480
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9tZXRhLXVpL3NyYy9saWIvcmVzb3VyY2UvaW5kZXgudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9tZXRhLXVpL3NyYy9saWIvcmVzb3VyY2Uvdmlldy5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBcUIsU0FBUyxFQUFjLFlBQVksRUFBRSxLQUFLLEVBQXFCLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV6SCxPQUFPLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBR2xFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0saUNBQWlDLENBQUM7Ozs7Ozs7OztBQU9sRSxNQUFNLE9BQU8sWUFBWTtJQXVCdkIsWUFDVSxHQUFzQixFQUN0QixFQUFjLEVBQ2QsbUJBQXdDLEVBQ3hDLFdBQStCLEVBQy9CLGNBQThCO1FBSjlCLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBQ3RCLE9BQUUsR0FBRixFQUFFLENBQVk7UUFDZCx3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXFCO1FBQ3hDLGdCQUFXLEdBQVgsV0FBVyxDQUFvQjtRQUMvQixtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUF2QnZCLFNBQUksR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBUzNDLFNBQUksR0FBRyxJQUFJLENBQUM7UUFLWiw0QkFBdUIsR0FBRyxLQUFLLENBQUM7UUE2VnhCLG1CQUFjLEdBQUcsR0FBRyxFQUFFO1lBQzVCLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDO1lBQ2hDLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQzdELENBQUMsQ0FBQztJQXBWRixDQUFDO0lBRUQsSUFBSSxV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QUMsR0FBRyxDQUFDLHNCQUFzQixFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNoRCxLQUFLLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxFQUFFO1lBQ25ELElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLFNBQVMsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztTQUN6RTtJQUNILENBQUM7SUFFTyxhQUFhO1FBQ25CLDRCQUE0QjtRQUM1QixNQUFNLENBQUMsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3pDLENBQUMsQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNsQyxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDekMsQ0FBQzs7eUdBbGZVLFlBQVk7NkZBQVosWUFBWSwwT0NiekIsOHlJQXFFTTsyRkR4RE8sWUFBWTtrQkFMeEIsU0FBUzsrQkFDRSxvQkFBb0I7aU9BS3JCLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLDRCQUE0QjtzQkFBcEMsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ1csSUFBSTtzQkFBcEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uQ2hhbmdlcywgT25Jbml0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1ldGFSZXNvdXJjZVNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9tZXRhUmVzb3VyY2UnO1xuaW1wb3J0IHsgbWV0YURhcmssIG1ldGFMaWdodCB9IGZyb20gJy4uL2NvbW1vbi91dGlscy9jb2xvclRoZW1lcyc7XG5pbXBvcnQgeyBNZXRhQ29udGV4dFNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9tZXRhQ29udGV4dCc7XG5pbXBvcnQgeyBNZXRhTXNnU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL21ldGFNc2cnO1xuaW1wb3J0IHsgbWV0YU5vcm1hbGl6ZXIgfSBmcm9tICcuLi9jb21tb24vbWV0YU5vcm1hbGl6ZXInO1xuaW1wb3J0IHsgdGVtcGxhdGVCdWlsZGVyIH0gZnJvbSAnLi4vY29tbW9uL3V0aWxzL3RlbXBsYXRlQnVpbGRlcic7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3ZnaXAtbWV0YS1yZXNvdXJjZScsXG4gIHRlbXBsYXRlVXJsOiAnLi92aWV3Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9zdHlsZS5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgTWV0YVJlc291cmNlIGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuICBASW5wdXQoKSByZXNvdXJjZTogYW55O1xuICBASW5wdXQoKSBtb2RlbDogYW55O1xuICBASW5wdXQoKSBtZXRhUmVzb3VyY2VTZXJ2aWNlRGVsZWdhdGVkOiBNZXRhUmVzb3VyY2VTZXJ2aWNlOyAvLyBjYXJ5IGl0IGZyb20gdGhlIHBhcmVudCB0byBrZWVwIHRoZSBpbnRlcmNlcHRvcnNcbiAgQElucHV0KCkgdGhlbWU6IHN0cmluZztcbiAgQE91dHB1dCgpIHB1YmxpYyBkb25lID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIGludGVncmF0aW9uQ29kZTogc3RyaW5nO1xuICByZXNvdXJjZVR5cGU6IHN0cmluZztcbiAgbWV0YTogYW55O1xuICBzZXJ2aWNlOiBNZXRhUmVzb3VyY2VTZXJ2aWNlO1xuICBjdXJyZW50TGF5b3V0SWQ6IGFueTtcbiAgZm9ybUVycm9yczogYW55O1xuICBmaWVsZHNNYXA6IGFueTtcbiAgZWRpdCA9IHRydWU7XG4gIGJ1c3k6IGJvb2xlYW47XG4gIG1ldGFMb2FkaW5nOiBib29sZWFuO1xuICBnZW5lcmFsRXJyb3I6IHN0cmluZztcbiAgcmVzb3VyY2VNZW51VmlzaWJsZTogYm9vbGVhbjtcbiAgY29udGFjdHNTdWdnZXN0aW9uc0RvbmUgPSBmYWxzZTtcbiAgaXNFZGl0YWJsZTogYm9vbGVhbjtcbiAgaXNQZXJzaXN0ZW50OiBib29sZWFuO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcml2YXRlIGVsOiBFbGVtZW50UmVmLFxuICAgIHByaXZhdGUgbWV0YVJlc291cmNlU2VydmljZTogTWV0YVJlc291cmNlU2VydmljZSxcbiAgICBwcml2YXRlIG1ldGFDb250ZXh0OiBNZXRhQ29udGV4dFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBtZXRhTXNnU2VydmljZTogTWV0YU1zZ1NlcnZpY2VcbiAgKSB7XG5cbiAgfVxuXG4gIGdldCBuaWNlRmllbGRzKCkge1xuICAgIGlmIChcbiAgICAgICF0aGlzLnJlc291cmNlLm5pY2VGaWVsZHNcbiAgICAgICYmIHRoaXMucmVzb3VyY2UubWV0YVxuICAgICAgJiYgdGhpcy5yZXNvdXJjZS5tZXRhLmxheW91dFxuICAgICAgJiYgdGhpcy5yZXNvdXJjZS5tZXRhLmxheW91dC5zZWN0aW9uc1xuICAgICkge1xuICAgICAgY29uc3QgZXh0cmFjdFNlY3Rpb25GaWVsZHMgPSAocykgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IGYgb2Ygcy5maWVsZHMpIHtcbiAgICAgICAgICBpZiAoZi5uYW1lKSB7XG4gICAgICAgICAgICB0aGlzLnJlc291cmNlLm5pY2VGaWVsZHNbZi5uYW1lXSA9IGY7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChmLmZpZWxkcyAmJiBmLmZpZWxkcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGV4dHJhY3RTZWN0aW9uRmllbGRzKGYpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHRoaXMucmVzb3VyY2UubmljZUZpZWxkcyA9IHt9O1xuICAgICAgZm9yIChjb25zdCBzIG9mIHRoaXMucmVzb3VyY2UubWV0YS5sYXlvdXQuc2VjdGlvbnMpIHtcbiAgICAgICAgZXh0cmFjdFNlY3Rpb25GaWVsZHMocyk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnJlc291cmNlLm5pY2VGaWVsZHM7XG4gIH1cblxuICBnZXQgZmllbGROYW1lcygpIHtcbiAgICBjb25zdCBuYW1lcyA9IE9iamVjdC5rZXlzKHRoaXMubmljZUZpZWxkcyk7XG4gICAgaWYgKHRoaXMucmVzb3VyY2UubWV0YS5sYXlvdXQuY2hpbGRyZW4pIHtcbiAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgdGhpcy5yZXNvdXJjZS5tZXRhLmxheW91dC5jaGlsZHJlbikge1xuICAgICAgICBuYW1lcy5wdXNoKGNoaWxkLm5hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbmFtZXM7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmludGVncmF0aW9uQ29kZSA9ICh0aGlzLnJlc291cmNlLmludGVncmF0aW9uQ29kZSB8fCAnJykudG9VcHBlckNhc2UoKTtcbiAgICB0aGlzLnJlc291cmNlVHlwZSA9IHRoaXMucmVzb3VyY2UucmVzb3VyY2VUeXBlO1xuICAgIHRoaXMuc2VydmljZSA9ICh0aGlzLm1ldGFSZXNvdXJjZVNlcnZpY2VEZWxlZ2F0ZWQgfHwgdGhpcy5tZXRhUmVzb3VyY2VTZXJ2aWNlKS5uZXcodGhpcy5yZXNvdXJjZSk7XG4gICAgaWYgKCF0aGlzLm1vZGVsKSB7XG4gICAgICB0aGlzLm1vZGVsID0ge307XG4gICAgfVxuICAgIGlmICh0aGlzLnJlc291cmNlLmFjdGl2aXR5ICYmIHRoaXMucmVzb3VyY2UucmVmLmVkaXRhYmxlID09PSBmYWxzZSAmJiAhdGhpcy5yZXNvdXJjZS5leHRlcm5hbElkKSB7XG4gICAgICB0aGlzLnJlc291cmNlLmV4dGVybmFsSWQgPSAnTUlTU0lOR19FWFRFUk5BTF9JRCc7XG4gICAgfVxuICAgIHRoaXMuaXNQZXJzaXN0ZW50ID0gdGhpcy5yZXNvdXJjZSAmJiB0aGlzLnJlc291cmNlLmV4dGVybmFsSWQ7XG4gICAgaWYgKCF0aGlzLnJlc291cmNlLm1ldGEpIHtcbiAgICAgIHRoaXMubG9hZE1ldGFkYXRhKHRoaXMucmVzb3VyY2UubGF5b3V0SWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyAgIGlmICh0aGlzLmlzUGVyc2lzdGVudCAmJiAoIXRoaXMuaXNFZGl0YWJsZSB8fCB0aGlzLnJlc291cmNlc1tyZWYubmFtZV0ubWV0YS5sYXlvdXQuY2hpbGRyZW4pKSB7XG4gICAgICAvLyAgICAgdGhpcy5lZGl0ID0gZmFsc2U7XG4gICAgICAvLyAgIH1cbiAgICAgIHRoaXMubWV0YSA9IHRoaXMucmVzb3VyY2UubWV0YTtcbiAgICAgIHRoaXMuY3VycmVudExheW91dElkID0gdGhpcy5tZXRhLmxheW91dC5pZDtcbiAgICAgIHRoaXMuZ2V0RGV0YWlscygpO1xuICAgICAgdGhpcy5nZXRGaWVsZHNNYXAoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMudGhlbWUgIT09ICdpbmhlcml0Jykge1xuICAgICAgdGhpcy5hcHBseVRoZW1lKCk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogYW55KSB7XG4gICAgaWYgKGNoYW5nZXMudGhlbWUpIHtcbiAgICAgIHRoaXMudGhlbWUgPSBjaGFuZ2VzLnRoZW1lLmN1cnJlbnRWYWx1ZTtcbiAgICAgIGlmICh0aGlzLnRoZW1lICE9PSAnaW5oZXJpdCcpIHtcbiAgICAgICAgdGhpcy5hcHBseVRoZW1lKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZWRpdE1vZGUoKSB7XG4gICAgdGhpcy5lZGl0ID0gdHJ1ZTtcbiAgfVxuXG4gIGxvYWRNZXRhZGF0YShsYXlvdXRJZD8sIHJlZnJlc2ggPSBmYWxzZSkge1xuICAgIGNvbnN0IGxheW91dFN0b3JlS2V5ID0gYHZnaXMubGF5b3V0XyR7dGhpcy5tZXRhQ29udGV4dC52Z2lwVXNlcklkfV8ke3RoaXMuaW50ZWdyYXRpb25Db2RlfV8ke3RoaXMucmVzb3VyY2UucmVzb3VyY2VUeXBlfWA7XG4gICAgaWYgKCFsYXlvdXRJZCkge1xuICAgICAgbGF5b3V0SWQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShsYXlvdXRTdG9yZUtleSk7XG4gICAgfVxuICAgIHRoaXMuYnVzeSA9IHRydWU7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLm1ldGFMb2FkaW5nID0gdHJ1ZTtcbiAgICB9LCAwKTtcbiAgICBkZWxldGUgdGhpcy5yZXNvdXJjZS5uaWNlRmllbGRzO1xuICAgIHRoaXMuc2VydmljZS5nZXRNZXRhZGF0YShsYXlvdXRJZCwgcmVmcmVzaCkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChtZXRhOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5jdXJyZW50TGF5b3V0SWQgPSBtZXRhLmxheW91dC5pZDtcbiAgICAgICAgaWYgKGxheW91dElkICE9PSBtZXRhLmxheW91dC5pZCAmJiAhdGhpcy5pc1BlcnNpc3RlbnQpIHtcbiAgICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShsYXlvdXRTdG9yZUtleSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5tZXRhID0gbWV0YU5vcm1hbGl6ZXIobWV0YSwgdGhpcy5pbnRlZ3JhdGlvbkNvZGUsIHRoaXMucmVzb3VyY2UucmVzb3VyY2VUeXBlKTtcbiAgICAgICAgdGhpcy5pc0VkaXRhYmxlID0gdGhpcy5tZXRhLmxheW91dCAmJiB0aGlzLm1ldGEubGF5b3V0LmVkaXRhYmxlICE9PSBmYWxzZTtcbiAgICAgICAgdGhpcy5yZXNvdXJjZS5tZXRhID0gdGhpcy5tZXRhO1xuICAgICAgICBpZiAodGhpcy5pc1BlcnNpc3RlbnQgJiYgKCF0aGlzLmlzRWRpdGFibGUgfHwgdGhpcy5tZXRhLmxheW91dC5jaGlsZHJlbikpIHtcbiAgICAgICAgICB0aGlzLmVkaXQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBkZWxldGUgdGhpcy5idXN5O1xuICAgICAgICB0aGlzLmdldERldGFpbHMoKTtcbiAgICAgICAgdGhpcy5nZXRGaWVsZHNNYXAoKTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKG1ldGFFcnJvcjogYW55KSA9PiB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLmJ1c3k7XG4gICAgICAgIHRoaXMuZ2VuZXJhbEVycm9yID0gYEVycm9yIGxvYWRpbmcgcmVzb3VyY2UgbWV0YWRhdGEgKCR7bWV0YUVycm9yLnN0YXR1c1RleHR9KWA7XG4gICAgICB9LFxuICAgICAgY29tcGxldGU6ICgpID0+IHtcbiAgICAgICAgZGVsZXRlIHRoaXMubWV0YUxvYWRpbmc7XG4gICAgICAgIHRoaXMuZm9yY2VVaVVwZGF0ZSgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgY2hhbmdlTGF5b3V0KCkge1xuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFxuICAgICAgYHZnaXMubGF5b3V0XyR7dGhpcy5tZXRhQ29udGV4dC52Z2lwVXNlcklkfV8ke3RoaXMuaW50ZWdyYXRpb25Db2RlfV8ke3RoaXMucmVzb3VyY2UucmVzb3VyY2VUeXBlfWAsXG4gICAgICB0aGlzLmN1cnJlbnRMYXlvdXRJZFxuICAgICk7XG4gICAgdGhpcy5sb2FkTWV0YWRhdGEodGhpcy5jdXJyZW50TGF5b3V0SWQpO1xuICB9XG5cbiAgZ2V0RGV0YWlscygpIHtcbiAgICBpZiAodGhpcy5yZXNvdXJjZSAmJiAodGhpcy5yZXNvdXJjZS5leHRlcm5hbElkIHx8IHRoaXMucmVzb3VyY2UuaWQpKSB7XG4gICAgICBpZiAodGhpcy5yZXNvdXJjZS5wYXJlbnQgJiYgdGhpcy5yZXNvdXJjZS5hY3Rpdml0eSAvLyBza2lwIGZldGNoXG4gICAgICAgICYmIHRoaXMubWV0YS5sYXlvdXQuZWRpdGFibGUgPT09IGZhbHNlICYmICF0aGlzLm1ldGEubGF5b3V0LmNoaWxkcmVuXG4gICAgICApIHtcbiAgICAgICAgZm9yIChjb25zdCBwIGluIHRoaXMucmVzb3VyY2UuYWN0aXZpdHkpIHtcbiAgICAgICAgICBpZiAodGhpcy5yZXNvdXJjZS5hY3Rpdml0eVtwXSAmJiB0aGlzLmZpZWxkTmFtZXMuaW5kZXhPZihwKSAhPT0gLTEpIHtcbiAgICAgICAgICAgIHRoaXMubW9kZWxbcF0gPSB0aGlzLnJlc291cmNlLmFjdGl2aXR5W3BdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5idXN5ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zZXJ2aWNlLmdldERldGFpbHMoXG4gICAgICAgICAgKHRoaXMucmVzb3VyY2UuZXh0ZXJuYWxJZCB8fCB0aGlzLnJlc291cmNlLmlkKSwge1xuICAgICAgICAgIGV2ZW50SWQ6IHRoaXMucmVzb3VyY2UuZXZlbnRJZCAhPT0gJ05PX0VWRU5UJyA/IHRoaXMucmVzb3VyY2UuZXZlbnRJZCA6IG51bGwsIGxheW91dElkOiB0aGlzLnJlc291cmNlLmxheW91dElkXG4gICAgICAgIH1cbiAgICAgICAgKS5zdWJzY3JpYmUoe1xuICAgICAgICAgIG5leHQ6IChyZXNvdXJjZTogYW55KSA9PiB7XG4gICAgICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby11bmRlcnNjb3JlLWRhbmdsZSAqL1xuICAgICAgICAgICAgaWYgKHJlc291cmNlLl92Z2lzKSB7XG4gICAgICAgICAgICAgIGlmIChyZXNvdXJjZS5fdmdpcy5ldmVudElkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5tZXRhQ29udGV4dC52Z2lwRXZlbnRJZCA9IHJlc291cmNlLl92Z2lzLmV2ZW50SWQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKHJlc291cmNlLmxheW91dElkICYmIHJlc291cmNlLl92Z2lzLmxheW91dElkICE9PSB0aGlzLmN1cnJlbnRMYXlvdXRJZCkge1xuICAgICAgICAgICAgICAgIHRoaXMubG9hZE1ldGFkYXRhKHJlc291cmNlLl92Z2lzLmxheW91dElkKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLyogZXNsaW50LWVuYWJsZSBuby11bmRlcnNjb3JlLWRhbmdsZSAqL1xuICAgICAgICAgICAgZm9yIChjb25zdCBwIGluIHJlc291cmNlKSB7XG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgKHJlc291cmNlW3BdICE9PSAndW5kZWZpbmVkJykgJiYgKHRoaXMuZmllbGROYW1lcy5pbmRleE9mKHApICE9PSAtMSB8fCBwID09PSAnX3ZnaXMnKSkge1xuICAgICAgICAgICAgICAgIHRoaXMubW9kZWxbcF0gPSByZXNvdXJjZVtwXTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVsZXRlIHRoaXMuYnVzeTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGVycm9yOiAocmVzb3VyY2VFcnJvcikgPT4ge1xuICAgICAgICAgICAgdGhpcy5nZW5lcmFsRXJyb3IgPSByZXNvdXJjZUVycm9yLmVycm9yID8gcmVzb3VyY2VFcnJvci5lcnJvci5tZXNzYWdlIHx8IHJlc291cmNlRXJyb3IubWVzc2FnZSA6IHJlc291cmNlRXJyb3IubWVzc2FnZTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmJ1c3k7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBjb21wbGV0ZTogKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5mb3JjZVVpVXBkYXRlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMucmVzb3VyY2UucmVmICYmIHRoaXMucmVzb3VyY2UucmVmLmFjdGl2aXR5KSB7IC8vIHJldXNlIGZhaWxlZCBhdXRvYWN0aXZpdGllcyBkYXRhXG4gICAgICAgIGZvciAoY29uc3QgcCBpbiB0aGlzLnJlc291cmNlLnJlZi5hY3Rpdml0eSkge1xuICAgICAgICAgIGlmICh0aGlzLnJlc291cmNlLnJlZi5hY3Rpdml0eSAmJiB0aGlzLmZpZWxkTmFtZXMuaW5kZXhPZihwKSAhPT0gLTEpIHtcbiAgICAgICAgICAgIHRoaXMubW9kZWxbcF0gPSB0aGlzLnJlc291cmNlLnJlZi5hY3Rpdml0eVtwXTsgLy8gVkdJUy03MjE1IChjb3B5IG9ubHkgdmFsaWQgZmllbGRzKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5wZXJmb3JtQXV0b0ZpbGwoKTtcbiAgICB9XG4gIH1cblxuICBwZXJmb3JtQXV0b0ZpbGwoKSB7XG4gICAgdGhpcy5tZXRhTXNnU2VydmljZS5zZW5kTWVzc2FnZShcbiAgICAgIHRoaXMuaW50ZWdyYXRpb25Db2RlLFxuICAgICAge1xuICAgICAgICBhY3Rpb246ICdhdXRvRmlsbCcsXG4gICAgICAgIGludGVncmF0aW9uOiB0aGlzLmludGVncmF0aW9uQ29kZSxcbiAgICAgICAgcmVzb3VyY2VUeXBlOiB0aGlzLnJlc291cmNlVHlwZSxcbiAgICAgICAgcmVzb3VyY2U6IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5tb2RlbCkpLFxuICAgICAgICBmaWVsZHM6IHRoaXMubmljZUZpZWxkcyxcbiAgICAgICAgZXZlbnQ6IHRoaXMubWV0YUNvbnRleHQuY29udGV4dCxcbiAgICAgICAgcHJvZmlsZTogdGhpcy5tZXRhQ29udGV4dC5wcm9maWxlc1t0aGlzLmludGVncmF0aW9uQ29kZV1cbiAgICAgIH0sXG4gICAgICAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgaWYgKCFyZXNwb25zZS5lcnJvcikge1xuICAgICAgICAgIGZvciAoY29uc3QgYWZwIGluIHJlc3BvbnNlLmF1dG9GaWxsKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMubW9kZWxbYWZwXSkge1xuICAgICAgICAgICAgICB0aGlzLm1vZGVsW2FmcF0gPSByZXNwb25zZS5hdXRvRmlsbFthZnBdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICk7XG4gIH1cblxuICBnZXRGaWVsZHNNYXAoKSB7XG4gICAgaWYgKHRoaXMubWV0YS5maWVsZHNNYXApIHtcbiAgICAgIHRoaXMuZmllbGRzTWFwID0gdGhpcy5tZXRhLmZpZWxkc01hcDtcbiAgICAgIHRoaXMubWFya0NvbnRhY3RhYmxlcygpO1xuICAgICAgdGhpcy5idWlsZENvbnRhY3RzU3VnZ2VzdGlvbnMoKTtcbiAgICAgIGlmICghdGhpcy5yZXNvdXJjZS5leHRlcm5hbElkKSB7XG4gICAgICAgIHRoaXMuYnVpbGRTdWJqZWN0VGVtcGxhdGUoKTtcbiAgICAgICAgdGhpcy5leGVjVHJhbnNmb3JtZXIoKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5tZXRhTXNnU2VydmljZS5zZW5kTWVzc2FnZShcbiAgICAgICAgdGhpcy5pbnRlZ3JhdGlvbkNvZGUsXG4gICAgICAgIHsgYWN0aW9uOiAnZmllbGRzTWFwJywgaW50ZWdyYXRpb246IHRoaXMuaW50ZWdyYXRpb25Db2RlLCByZXNvdXJjZVR5cGU6IHRoaXMucmVzb3VyY2VUeXBlIH0sXG4gICAgICAgIChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgIGlmICghcmVzcG9uc2UuZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMuZmllbGRzTWFwID0gcmVzcG9uc2UuZmllbGRzTWFwO1xuICAgICAgICAgICAgdGhpcy5tYXJrQ29udGFjdGFibGVzKCk7XG4gICAgICAgICAgICB0aGlzLmJ1aWxkQ29udGFjdHNTdWdnZXN0aW9ucygpO1xuICAgICAgICAgICAgaWYgKCF0aGlzLnJlc291cmNlLmV4dGVybmFsSWQpIHtcbiAgICAgICAgICAgICAgdGhpcy5idWlsZFN1YmplY3RUZW1wbGF0ZSgpO1xuICAgICAgICAgICAgICB0aGlzLmV4ZWNUcmFuc2Zvcm1lcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnTm8gZmllbGRzIG1hcCcsIHRoaXMuaW50ZWdyYXRpb25Db2RlLCB0aGlzLnJlc291cmNlVHlwZSwgcmVzcG9uc2UuZXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBvcGVuUmVzb3VyY2VNZW51KCkge1xuICAgIHRoaXMucmVzb3VyY2VNZW51VmlzaWJsZSA9IHRydWU7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMub25NZW51Q2xpY2tvdXQpO1xuICAgIH0sIDEwKTtcbiAgfVxuXG4gIGNsb3NlKHJlc3VsdD8pIHtcbiAgICB0aGlzLmRvbmUuZW1pdChyZXN1bHQpO1xuICB9XG5cbiAgc2hvd1BhcnNlZEVycm9yKHJlc291cmNlRm9ybSwgcGFyc2VkRXJyb3IpIHtcbiAgICB0aGlzLmZvcm1FcnJvcnMgPSBwYXJzZWRFcnJvci5tZXNzYWdlIHx8ICdUaGVyZSBpcyBhIHByb2JsZW0gd2l0aCBvbmUgb3IgbW9yZSBmaWVsZHMnO1xuICAgIGlmIChwYXJzZWRFcnJvci5lcnJvcnMgJiYgcGFyc2VkRXJyb3IuZXJyb3JzLmxlbmd0aCkge1xuICAgICAgdGhpcy5mb3JtRXJyb3JzICs9IGAgKCR7cGFyc2VkRXJyb3IuZXJyb3JzLm1hcChlID0+IGUubWVzc2FnZSkuam9pbignLCAnKX0pYDtcbiAgICAgIGZvciAoY29uc3QgcGUgb2YgcGFyc2VkRXJyb3IuZXJyb3JzKSB7XG4gICAgICAgIGlmIChyZXNvdXJjZUZvcm0uY29udHJvbHNbcGUuZmllbGRdKSB7XG4gICAgICAgICAgcmVzb3VyY2VGb3JtLmNvbnRyb2xzW3BlLmZpZWxkXS5zZXRFcnJvcnMoeyBpbnZhbGlkOiB0cnVlLCBjdXN0b206IHBlLm1lc3NhZ2UgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBjb25zdCBmaXJzdEludmFsaWQ6IEhUTUxJbnB1dEVsZW1lbnQgPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignLlZsdC1mb3JtX19lbGVtZW50LS1lcnJvciAubWFpbjpub3QoLnN0YW5kYWxvbmUpJyk7XG4gICAgICAgIGlmIChmaXJzdEludmFsaWQpIHtcbiAgICAgICAgICBmaXJzdEludmFsaWQuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgc3VibWl0KHJlc291cmNlRm9ybSkge1xuICAgIGRlbGV0ZSB0aGlzLmZvcm1FcnJvcnM7XG4gICAgcmVzb3VyY2VGb3JtLmZvcm0uc3VibWl0dGVkID0gdHJ1ZTtcbiAgICBpZiAocmVzb3VyY2VGb3JtLnZhbGlkKSB7XG4gICAgICB0aGlzLmJ1c3kgPSB0cnVlO1xuICAgICAgaWYgKHRoaXMubWV0YUNvbnRleHQudmdpcEV2ZW50SWQpIHtcbiAgICAgICAgLyogZXNsaW50LWRpc2FibGUgbm8tdW5kZXJzY29yZS1kYW5nbGUgKi9cbiAgICAgICAgaWYgKCF0aGlzLm1vZGVsLl92Z2lzKSB7XG4gICAgICAgICAgdGhpcy5tb2RlbC5fdmdpcyA9IHtcbiAgICAgICAgICAgIGNvbm5lY3RvcjogdGhpcy5pbnRlZ3JhdGlvbkNvZGUsXG4gICAgICAgICAgICByZXNvdXJjZVR5cGU6IHRoaXMucmVzb3VyY2VUeXBlXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm1vZGVsLl92Z2lzLmxheW91dElkID0gdGhpcy5jdXJyZW50TGF5b3V0SWQ7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtbGVuXG4gICAgICAgIC8vIHRoaXMubW9kZWwuX3ZnaXMudGltZVpvbmVPZmZzZXRJbk1pbnV0ZXMgPSAwOyAvLyB3ZSBhcmUgbm90IHByb3ZpZGluZyB0aW1lem9uZSBhbnltb3JlIChhcyBWMyksIGluc3RlYWQgdGhlICd0aW1lJyBhbmQgJ2RhdGUnIG9iamVjdHMgYXJlIGNvbnZlcnRlZCBzbyB0aGUgVVRDIHRpbWUvZGF0ZSBpcyBjb3JyZWN0XG4gICAgICAgIHRoaXMubW9kZWwuX3ZnaXMuZXZlbnRJZCA9IHRoaXMubWV0YUNvbnRleHQudmdpcEV2ZW50SWQ7XG4gICAgICAgIC8qIGVzbGludC1lbmFibGUgbm8tdW5kZXJzY29yZS1kYW5nbGUgKi9cbiAgICAgIH1cbiAgICAgIHRoaXMuc2VydmljZS5zYXZlKHRoaXMubW9kZWwpLnN1YnNjcmliZSgocmVzdWx0OiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5jbG9zZShyZXN1bHQpO1xuICAgICAgICBkZWxldGUgdGhpcy5idXN5O1xuICAgICAgfSwgKGVycm9yUmVzdWx0KSA9PiB7XG4gICAgICAgIGlmICgoZXJyb3JSZXN1bHQuc3RhdHVzID09PSA0MjIgJiYgZXJyb3JSZXN1bHQuZXJyb3IgJiYgIWVycm9yUmVzdWx0LmVycm9yLmVycm9ycyAmJiBlcnJvclJlc3VsdC5lcnJvci5pbnRlZ3JhdGlvbkVycm9yKVxuICAgICAgICAgIHx8IChlcnJvclJlc3VsdC5lcnJvciAmJiBlcnJvclJlc3VsdC5lcnJvci5lcnJvcnMgJiYgZXJyb3JSZXN1bHQuZXJyb3IuZXJyb3JzLmxlbmd0aCAmJiAhZXJyb3JSZXN1bHQuZXJyb3IuZXJyb3JzWzBdLmZpZWxkKVxuICAgICAgICAgIC8vIGJhY2tlbmQgaW1wbGVtZW50ZWQgZXJyb3IgcGFyc2luZyBidXQgYnJva2VuIFZHSVMtNzM2NlxuICAgICAgICApIHtcbiAgICAgICAgICB0aGlzLmZvcm1FcnJvcnMgPSAnVGhlcmUgaXMgYSBwcm9ibGVtIHdpdGggb25lIG9yIG1vcmUgZmllbGRzJztcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5tZXRhTXNnU2VydmljZS5zZW5kTWVzc2FnZShcbiAgICAgICAgICAgICAgdGhpcy5pbnRlZ3JhdGlvbkNvZGUsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhY3Rpb246ICdwYXJzZUVycm9yTWVzc2FnZScsXG4gICAgICAgICAgICAgICAgaW50ZWdyYXRpb25Db2RlOiB0aGlzLmludGVncmF0aW9uQ29kZSxcbiAgICAgICAgICAgICAgICByZXNvdXJjZVR5cGU6IGVycm9yUmVzdWx0LmVycm9yLnJlc291cmNlVHlwZSxcbiAgICAgICAgICAgICAgICByYXdFcnJvcjogZXJyb3JSZXN1bHQuZXJyb3IuaW50ZWdyYXRpb25FcnJvcixcbiAgICAgICAgICAgICAgICBwcm9maWxlOiB0aGlzLm1ldGFDb250ZXh0LnByb2ZpbGVzW3RoaXMuaW50ZWdyYXRpb25Db2RlLnRvVXBwZXJDYXNlKCldXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5wYXJzZWRFcnJvcikge1xuICAgICAgICAgICAgICAgICAgdGhpcy5zaG93UGFyc2VkRXJyb3IocmVzb3VyY2VGb3JtLCByZXNwb25zZS5wYXJzZWRFcnJvcik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlcnNjb3JlLWRhbmdsZVxuICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignTm8gZXJyb3IgcGFyc2VyIGZvcicsIHRoaXMuaW50ZWdyYXRpb25Db2RlLCBlcnJvclJlc3VsdC5lcnJvci5pbnRlZ3JhdGlvbkVycm9yKTtcbiAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybUVycm9ycyA9IGVycm9yUmVzdWx0LmVycm9yO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCcuLi4uJywgZXJyKTtcbiAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2UgaWYgKGVycm9yUmVzdWx0LnN0YXR1cyA9PT0gNDIyKSB7XG4gICAgICAgICAgdGhpcy5zaG93UGFyc2VkRXJyb3IocmVzb3VyY2VGb3JtLCBlcnJvclJlc3VsdC5lcnJvcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5mb3JtRXJyb3JzID0gZXJyb3JSZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgZGVsZXRlIHRoaXMuYnVzeTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmZvcm1FcnJvcnMgPSBPYmplY3Qua2V5cyhyZXNvdXJjZUZvcm0uY29udHJvbHMpXG4gICAgICAgIC5maWx0ZXIoKGMpID0+IHJlc291cmNlRm9ybS5jb250cm9sc1tjXS5pbnZhbGlkKVxuICAgICAgICAubWFwKChmKSA9PiAodGhpcy5uaWNlRmllbGRzW2ZdID8gKHRoaXMubmljZUZpZWxkc1tmXS5sYWJlbCB8fCBmKSA6IGYpKS5qb2luKCcsICcpO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHNlbGVjdG9yID0gYGZvcm1bbmFtZT1cIiR7dGhpcy5yZXNvdXJjZVR5cGV9XCJdIC5WbHQtZm9ybV9fZWxlbWVudC0tZXJyb3IgLm1haW46bm90KC5zdGFuZGFsb25lKWA7XG4gICAgICAgIGNvbnN0IGZpcnN0SW52YWxpZDogSFRNTElucHV0RWxlbWVudCA9IHRoaXMuZWwubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTtcbiAgICAgICAgaWYgKGZpcnN0SW52YWxpZCkge1xuICAgICAgICAgIGZpcnN0SW52YWxpZC5mb2N1cygpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBjbGVhckZvcm1FcnJvcnMoKSB7XG4gICAgZGVsZXRlIHRoaXMuZm9ybUVycm9ycztcbiAgfVxuXG4gIHByaXZhdGUgb25NZW51Q2xpY2tvdXQgPSAoKSA9PiB7XG4gICAgZGVsZXRlIHRoaXMucmVzb3VyY2VNZW51VmlzaWJsZTtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMub25NZW51Q2xpY2tvdXQpO1xuICB9O1xuXG4gIHByaXZhdGUgc3VnZ2VzdEZpZWxkUHJvcGVydHkoa2V5LCB2YWx1ZSkge1xuICAgIGlmIChrZXkgJiYgdmFsdWUpIHtcbiAgICAgIGNvbnN0IGZpZWxkTmFtZXMgPSB0aGlzLmZpZWxkTmFtZXM7XG4gICAgICBpZiAodGhpcy5tb2RlbCkge1xuICAgICAgICBjb25zdCBuZXN0TWF0Y2ggPSBrZXkubWF0Y2goLyhcXFMrKVxcW1xcZFxcXVxcLihcXFMrKS8pO1xuICAgICAgICBpZiAobmVzdE1hdGNoICYmIGZpZWxkTmFtZXMuaW5kZXhPZihuZXN0TWF0Y2hbMV0pICE9PSAtMSkge1xuICAgICAgICAgIHRoaXMubW9kZWxbbmVzdE1hdGNoWzFdXSA9IFtdO1xuICAgICAgICAgIGNvbnN0IG5lc3RLZXlzOiBhbnkgPSB7fTtcbiAgICAgICAgICBuZXN0S2V5c1tuZXN0TWF0Y2hbMl1dID0gdmFsdWU7XG4gICAgICAgICAgdGhpcy5tb2RlbFtuZXN0TWF0Y2hbMV1dLnB1c2gobmVzdEtleXMpO1xuICAgICAgICB9IGVsc2UgaWYgKGZpZWxkTmFtZXMuaW5kZXhPZihrZXkpICE9PSAtMSkge1xuICAgICAgICAgIHRoaXMubW9kZWxba2V5XSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBleGVjVHJhbnNmb3JtZXIoKSB7XG4gICAgaWYgKHRoaXMubWV0YUNvbnRleHQgJiYgdGhpcy5maWVsZHNNYXApIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLnN1Z2dlc3RGaWVsZFByb3BlcnR5KHRoaXMuZmllbGRzTWFwLnBob25lTnVtYmVyLCB0aGlzLm1ldGFDb250ZXh0LnBob25lTnVtYmVyKTtcbiAgICAgICAgaWYgKHRoaXMuZmllbGRzTWFwLmZpcnN0TmFtZSB8fCB0aGlzLmZpZWxkc01hcC5sYXN0TmFtZSkge1xuICAgICAgICAgIGNvbnN0IG5hbWVzID0gKHRoaXMubWV0YUNvbnRleHQuZGlzcGxheU5hbWUgfHwgJycpLnNwbGl0KCcgJyk7XG4gICAgICAgICAgdGhpcy5zdWdnZXN0RmllbGRQcm9wZXJ0eSh0aGlzLmZpZWxkc01hcC5maXJzdE5hbWUsIG5hbWVzWzBdKTtcbiAgICAgICAgICB0aGlzLnN1Z2dlc3RGaWVsZFByb3BlcnR5KHRoaXMuZmllbGRzTWFwLmxhc3ROYW1lLCBuYW1lc1sxXSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5maWVsZHNNYXAuZGlzcGxheU5hbWUpIHtcbiAgICAgICAgICB0aGlzLnN1Z2dlc3RGaWVsZFByb3BlcnR5KHRoaXMuZmllbGRzTWFwLmRpc3BsYXlOYW1lLCB0aGlzLm1ldGFDb250ZXh0LmRpc3BsYXlOYW1lKTtcbiAgICAgICAgfVxuICAgICAgfSwgMTAwKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG1hcmtDb250YWN0YWJsZXMoKSB7XG4gICAgaWYgKHRoaXMuZmllbGRzTWFwLmNvbnRhY3RhYmxlcyAmJiB0aGlzLmZpZWxkc01hcC5jb250YWN0YWJsZXMubGVuZ3RoKSB7XG4gICAgICBmb3IgKGNvbnN0IGMgb2YgdGhpcy5maWVsZHNNYXAuY29udGFjdGFibGVzKSB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gdGhpcy5uaWNlRmllbGRzW2NdO1xuICAgICAgICBpZiAoZmllbGQpIHtcbiAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZmllbGQsICckaXNDb250YWN0YWJsZScsIHtcbiAgICAgICAgICAgIHZhbHVlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2VcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRTdWJqZWN0VGVtcGxhdGUoKSB7XG4gICAgaWYgKCF0aGlzLm1vZGVsW3RoaXMuZmllbGRzTWFwLnN1YmplY3RdICYmIHRoaXMuZmllbGRzTWFwLnN1YmplY3QgJiYgdGhpcy5uaWNlRmllbGRzW3RoaXMuZmllbGRzTWFwLnN1YmplY3RdKSB7XG4gICAgICBsZXQgc3ViamVjdFRlbXBsYXRlOiBzdHJpbmc7XG4gICAgICBpZiAodGhpcy5uaWNlRmllbGRzW3RoaXMuZmllbGRzTWFwLnN1YmplY3RdLmRlZmF1bHQpIHtcbiAgICAgICAgc3ViamVjdFRlbXBsYXRlID0gdGhpcy5uaWNlRmllbGRzW3RoaXMuZmllbGRzTWFwLnN1YmplY3RdLmRlZmF1bHQuaWQgfHwgdGhpcy5uaWNlRmllbGRzW3RoaXMuZmllbGRzTWFwLnN1YmplY3RdLmRlZmF1bHQ7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMubWV0YUNvbnRleHQucHJvZmlsZXNbdGhpcy5pbnRlZ3JhdGlvbkNvZGVdKSB7XG4gICAgICAgIGNvbnN0IHByb2ZpbGUgPSB0aGlzLm1ldGFDb250ZXh0LnByb2ZpbGVzW3RoaXMuaW50ZWdyYXRpb25Db2RlXSB8fCB7fTtcbiAgICAgICAgc3ViamVjdFRlbXBsYXRlID0gcHJvZmlsZS5kZWZhdWx0U3ViamVjdCA/XG4gICAgICAgICAgcHJvZmlsZS5kZWZhdWx0U3ViamVjdFsoKHRoaXMubWV0YUNvbnRleHQuY29udGV4dCB8fCAnQ0FMTCcpLnR5cGUgfHwgJycpLnRvVXBwZXJDYXNlKCldIDpcbiAgICAgICAgICBwcm9maWxlLmFjdGl2aXR5RGVmYXVsdFN1YmplY3RUZW1wbGF0ZTtcbiAgICAgIH1cbiAgICAgIGlmIChzdWJqZWN0VGVtcGxhdGUpIHtcbiAgICAgICAgdGhpcy5tb2RlbFt0aGlzLmZpZWxkc01hcC5zdWJqZWN0XSA9IHRlbXBsYXRlQnVpbGRlcih0aGlzLm1ldGFDb250ZXh0LCBzdWJqZWN0VGVtcGxhdGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRDb250YWN0c1N1Z2dlc3Rpb25zKCkge1xuICAgIC8vIGxldCBoYXNEZWZhdWx0Q29udGFjdCA9IGZhbHNlO1xuICAgIGlmICh0aGlzLm1ldGFDb250ZXh0LmNvbnRhY3RhYmxlc1t0aGlzLmludGVncmF0aW9uQ29kZV0gJiYgdGhpcy5tZXRhLmxheW91dCAmJiB0aGlzLm1ldGEubGF5b3V0LnNlY3Rpb25zKSB7XG4gICAgICBmb3IgKGNvbnN0IHMgb2YgdGhpcy5tZXRhLmxheW91dC5zZWN0aW9ucykge1xuICAgICAgICBmb3IgKGNvbnN0IGYgb2YgKHMuZmllbGRzIHx8IFtdKSkge1xuICAgICAgICAgIGlmIChmLnR5cGUgPT09ICdyZWZlcmVuY2UnKSB7XG4gICAgICAgICAgICBjb25zdCByZWZUeXBlcyA9IChmLnJlZmVyZW5jZS5sZW5ndGggPyBmLnJlZmVyZW5jZSA6IFtmLnJlZmVyZW5jZV0pLm1hcChyID0+IHIubmFtZSk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGMgb2YgdGhpcy5tZXRhQ29udGV4dC5jb250YWN0YWJsZXNbdGhpcy5pbnRlZ3JhdGlvbkNvZGVdKSB7XG4gICAgICAgICAgICAgIGlmIChyZWZUeXBlcy5pbmRleE9mKGMucmVzb3VyY2VUeXBlIHx8IGMudHlwZSkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFmLnN1Z2dlc3Rpb25zKSB7XG4gICAgICAgICAgICAgICAgICBmLnN1Z2dlc3Rpb25zID0gW107XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIGYuc3VnZ2VzdGlvbnMgPSBmLnN1Z2dlc3Rpb25zLmZpbHRlcihzZyA9PiAhc2cuYXV0byk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCB0TGFiZWwgPSBjLmRpc3BsYXlOYW1lIHx8IGMubmFtZTtcbiAgICAgICAgICAgICAgICBpZiAoYy5waG9uZU51bWJlcnMpIHtcbiAgICAgICAgICAgICAgICAgIHRMYWJlbCArPSAoJyDinIYnICsgYy5waG9uZU51bWJlcnMubWFwKHAgPT4gcC5waG9uZU51bWJlcikuam9pbignLCcpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZi5zdWdnZXN0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgIGlkOiBjLmV4dGVybmFsSWQgfHwgYy5pZGVudGlmaWVyIHx8IGMuaWQsXG4gICAgICAgICAgICAgICAgICBsYWJlbDogdExhYmVsLFxuICAgICAgICAgICAgICAgICAgdHlwZTogYy5yZXNvdXJjZVR5cGUgfHwgYy50eXBlLFxuICAgICAgICAgICAgICAgICAgYXV0bzogdHJ1ZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoKHRoaXMuZmllbGRzTWFwLmNvbnRhY3RhYmxlcyB8fCBbXSkuaW5kZXhPZihmLm5hbWUpICE9PSAtMSkgeyAvLyBldmFsdWF0ZSB1c2FiaWxpdHk/XG4gICAgICAgICAgICAgIGYuYWx3YXlzVmlzaWJsZSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBpZiAoXG4gICAgICAgICAgICAvLyAgICFoYXNEZWZhdWx0Q29udGFjdCAmJiB0aGlzLm1ldGFDb250ZXh0LmRlZmF1bHRDb250YWN0YWJsZXNbdGhpcy5pbnRlZ3JhdGlvbkNvZGVdXG4gICAgICAgICAgICAvLyAgICYmIHJlZlR5cGVzLmluZGV4T2YodGhpcy5tZXRhQ29udGV4dC5kZWZhdWx0Q29udGFjdGFibGVzW3RoaXMuaW50ZWdyYXRpb25Db2RlXS50eXBlKSAhPT0gLTFcbiAgICAgICAgICAgIC8vICkge1xuICAgICAgICAgICAgLy8gICB0aGlzLnJlc291cmNlW2YubmFtZV0gPSB0aGlzLm1ldGFDb250ZXh0LmRlZmF1bHRDb250YWN0YWJsZXNbdGhpcy5pbnRlZ3JhdGlvbkNvZGVdO1xuICAgICAgICAgICAgLy8gICBoYXNEZWZhdWx0Q29udGFjdCA9IHRydWU7XG4gICAgICAgICAgICAvLyB9IGVsc2UgaWYgKCFoYXNEZWZhdWx0Q29udGFjdCAmJiB0aGlzLmZpZWxkc01hcC5jb250YWN0YWJsZXMgJiYgZi5zdWdnZXN0aW9ucyAmJiBmLnN1Z2dlc3Rpb25zLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgLy8gICBpZiAodGhpcy5maWVsZHNNYXAuY29udGFjdGFibGVzLmluZGV4T2YoZi5uYW1lKSAhPT0gLTEgJiYgIWYuZGVmYXVsdCkge1xuICAgICAgICAgICAgLy8gICAgIGYuZGVmYXVsdCA9IGYuc3VnZ2VzdGlvbnNbMF07XG4gICAgICAgICAgICAvLyAgICAgaGFzRGVmYXVsdENvbnRhY3QgPSB0cnVlO1xuICAgICAgICAgICAgLy8gICB9XG4gICAgICAgICAgICAvLyB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLmNvbnRhY3RzU3VnZ2VzdGlvbnNEb25lID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFwcGx5VGhlbWUoKSB7XG4gICAgY29uc3QgbWV0YVRoZW1lID0gdGhpcy50aGVtZSA9PT0gJ2RhcmsnID8gbWV0YURhcmsgOiBtZXRhTGlnaHQ7XG4gICAgY29uc29sZS5sb2coJ3Jlc291cmNlIGFwcGx5IHRoZW1lJywgdGhpcy50aGVtZSk7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMobWV0YVRoZW1lLnByb3BlcnRpZXMpKSB7XG4gICAgICB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoa2V5LCBtZXRhVGhlbWUucHJvcGVydGllc1trZXldKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGZvcmNlVWlVcGRhdGUoKSB7IC8vIGlPUyB3ZWJ2aWV3IGRvZXMgbm90IHVwZGF0ZSB0aGUgVUkgYWZ0ZXIgYXN5YyBjaGFuZ2VzLiBUZW1wIGZpeCA6KFxuICAgIC8vIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICBjb25zdCBlID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0V2ZW50cycpO1xuICAgIGUuaW5pdEV2ZW50KCdjbGljaycsIHRydWUsIGZhbHNlKTtcbiAgICB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQuZGlzcGF0Y2hFdmVudChlKTtcbiAgfVxufVxuIiwiPGRpdiAqbmdJZj0nZ2VuZXJhbEVycm9yJyBjbGFzcz1cIlZsdC1jYWxsb3V0IFZsdC1jYWxsb3V0LS1jcml0aWNhbFwiIHN0eWxlPSdvdmVyZmxvdzogYXV0bzsgbWFyZ2luOiAyMHB4Oyc+XG5cdDxpPjwvaT5cblx0PGRpdiBjbGFzcz1cIlZsdC1jYWxsb3V0X19jb250ZW50XCI+XG5cdFx0PHA+e3tnZW5lcmFsRXJyb3J9fTwvcD5cblx0PC9kaXY+XG48L2Rpdj5cbjxkaXYgKm5nSWY9JyFtZXRhJyBjbGFzcz1cIlZsdC1wcm9ncmVzc1wiPlxuXHQ8ZGl2IGNsYXNzPVwiVmx0LXByb2dyZXNzX19iYXJcIiBbbmdDbGFzc109XCJ7IGxvYWRpbmc6IG1ldGFMb2FkaW5nIH1cIiByb2xlPVwicHJvZ3Jlc3NiYXJcIiBhcmlhLXZhbHVlbWluPVwiMFwiIGFyaWEtdmFsdWV0ZXh0PVwiTG9hZGluZyBNZXRhZGF0YVwiIGFyaWEtdmFsdWVtYXg9XCIxMDBcIj48L2Rpdj5cbjwvZGl2PlxuPGZvcm0gW3ZnaXBNZXRhRm9ybUF1dG9mb2N1c109JyFyZXNvdXJjZSB8fCAhcmVzb3VyY2UuZXh0ZXJuYWxJZCcgKm5nSWY9J21ldGEgJiYgIWdlbmVyYWxFcnJvcicgI3Jlc291cmNlRm9ybT1cIm5nRm9ybVwiIFtuYW1lXT0ncmVzb3VyY2UucmVzb3VyY2VUeXBlJyAobmdTdWJtaXQpPSdzdWJtaXQocmVzb3VyY2VGb3JtKScgbm92YWxpZGF0ZT5cblx0PGRpdiBjbGFzcz0nZm9ybS1jb250ZW50JyBzdHlsZT0nb3ZlcmZsb3c6IGhpZGRlbjsnPlxuXHRcdDxkaXYgW25nQ2xhc3NdPVwieyAnVmx0LWNhbGxvdXQtLWRpc21pc3NlZCc6ICFmb3JtRXJyb3JzIH1cIiBjbGFzcz1cIlZsdC1jYWxsb3V0IFZsdC1jYWxsb3V0LS1iYW5uZXIgVmx0LWNhbGxvdXQtLWNyaXRpY2FsXCI+XG5cdFx0XHQ8aT48L2k+XG5cdFx0XHQ8ZGl2IGNsYXNzPVwiVmx0LWNhbGxvdXRfX2NvbnRlbnRcIiBzdHlsZT1cIm1hcmdpbi10b3A6IGF1dG87XCI+XG5cdFx0XHRcdDxwPlRoZXJlIGlzIGEgcHJvYmxlbSB3aXRoIG9uZSBvciBtb3JlIGZpZWxkczwvcD5cblx0XHRcdFx0PHNtYWxsIHN0eWxlPSdmb250LXdlaWdodDogNjAwOyBmb250LXNpemU6IDEuMGVtOycgKm5nSWY9J2Zvcm1FcnJvcnMnPnt7IGZvcm1FcnJvcnMubWVzc2FnZSB8fCBmb3JtRXJyb3JzIH19PC9zbWFsbD5cblx0XHRcdDwvZGl2PlxuXHRcdFx0PGJ1dHRvbiB0eXBlPSdidXR0b24nIGNsYXNzPVwiVmx0LWNhbGxvdXRfX2Rpc21pc3NcIiAoY2xpY2spPSdjbGVhckZvcm1FcnJvcnMoKScgYXJpYS1sYWJlbD1cIkRpc21pc3NcIj48L2J1dHRvbj5cblx0XHQ8L2Rpdj5cblx0XHQ8ZGl2IGNsYXNzPVwiVmx0LWNhcmRfX2NvbnRlbnRcIiBzdHlsZT0nbWluLWhlaWdodDogNDBweDsnPlxuXHRcdFx0PHZnaXAtbWV0YS1sYXlvdXQgKm5nSWY9J2VkaXQnIFttZXRhXT0nbWV0YS5sYXlvdXQnIFtyZXNvdXJjZV09J21vZGVsJyBbcHJldmlld109J2ZhbHNlJyBbaW50ZWdyYXRpb25dPSdtZXRhLmludGVncmF0aW9uJyBbdHlwZV09J3Jlc291cmNlLnJlc291cmNlVHlwZScgdGhlbWU9J2luaGVyaXQnPjwvdmdpcC1tZXRhLWxheW91dD5cblx0XHRcdDx2Z2lwLW1ldGEtbGF5b3V0ICpuZ0lmPSchZWRpdCcgW21ldGFdPSdtZXRhLmxheW91dCcgW3Jlc291cmNlXT0nbW9kZWwnIFtwcmV2aWV3XT0ndHJ1ZScgW2ludGVncmF0aW9uXT0nbWV0YS5pbnRlZ3JhdGlvbicgW3R5cGVdPSdyZXNvdXJjZS5yZXNvdXJjZVR5cGUnIHRoZW1lPSdpbmhlcml0Jz48L3ZnaXAtbWV0YS1sYXlvdXQ+XG5cdFx0PC9kaXY+XG5cdDwvZGl2PlxuXHQ8ZGl2IGNsYXNzPVwiVmx0LWNhcmRfX2Zvb3RlclwiPlxuXHRcdDxidXR0b24gY2xhc3M9XCJWbHQtYnRuIFZsdC1idG4tLXNlY29uZGFyeSBWbHQtYnRuLS1hcHAgVmx0LWJ0bi0tb3V0bGluZVwiIHR5cGU9J2J1dHRvbicgYXJpYS1sYWJlbD0nQ2FuY2VsJyAoY2xpY2spPSdjbG9zZSgpJz5cblx0XHRcdHt7IGVkaXQgPyAnQ2FuY2VsJyA6ICdDbG9zZScgfX1cblx0XHQ8L2J1dHRvbj5cblx0XHQ8YnV0dG9uICpuZ0lmPSdlZGl0JyBjbGFzcz1cIlZsdC1idG4gVmx0LWJ0bi0tYXBwXCIgW25nQ2xhc3NdPVwieyAnVmx0LWJ0bi0tcHJpbWFyeSc6IGlzUGVyc2lzdGVudCwgJ1ZsdC1idG4tLXNlY29uZGFyeSc6ICFpc1BlcnNpc3RlbnQgfVwiIHR5cGU9J3N1Ym1pdCc+XG5cdFx0XHR7eyAocmVzb3VyY2UgJiYgcmVzb3VyY2UuZXh0ZXJuYWxJZCkgPyAnVXBkYXRlJyA6ICdDcmVhdGUnIH19XG5cdFx0PC9idXR0b24+XG5cdFx0PGJ1dHRvbiAoY2xpY2spPSdlZGl0TW9kZSgpJyAqbmdJZj0nIWVkaXQgJiYgaXNFZGl0YWJsZScgW2Rpc2FibGVkXT0nIWlzRWRpdGFibGUnIGNsYXNzPVwiVmx0LWJ0biBWbHQtYnRuLS1hcHAgVmx0LWJ0bi0tcHJpbWFyeVwiIHR5cGU9J2J1dHRvbicgYXJpYS1sYWJlbD0nRWRpdCc+XG5cdFx0XHRFZGl0XG5cdFx0PC9idXR0b24+XG5cdFx0PGRpdiBzdHlsZT0nbWFyZ2luLXJpZ2h0OiA4cHg7IGZsZXg6IDE7Jz5cblx0XHRcdDxkaXYgKm5nSWY9J21ldGEuYXZhaWxhYmxlTGF5b3V0cyAmJiBtZXRhLmF2YWlsYWJsZUxheW91dHMubGVuZ3RoJyBjbGFzcz1cIlZsdC1mb3JtX19lbGVtZW50IFZsdC1mb3JtX19lbGVtZW50LS1iaWdcIiBzdHlsZT0ncGFkZGluZzogMDsgbWFyZ2luOiAtOHB4IC0xOHB4IC04cHggMDsnPlxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVwiVmx0LXNlbGVjdFwiPlxuXHRcdFx0XHRcdDxsYWJlbCBzdHlsZT0nYWxsOiBpbmhlcml0Oyc+XG5cdFx0XHRcdFx0XHQ8c2VsZWN0IHN0eWxlPSdib3JkZXI6IDA7IG1hcmdpbi10b3A6IDNweDsgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7JyAoY2hhbmdlKT0nY2hhbmdlTGF5b3V0KCknIFsobmdNb2RlbCldPSdjdXJyZW50TGF5b3V0SWQnIFtuZ01vZGVsT3B0aW9uc109J3sgc3RhbmRhbG9uZTogdHJ1ZSB9JyBbZGlzYWJsZWRdPSdpc1BlcnNpc3RlbnQnPlxuXHRcdFx0XHRcdFx0XHQ8b3B0aW9uIHNlbGVjdGVkIGRpc2FibGVkPlNlbGVjdCBsYXlvdXQ8L29wdGlvbj5cblx0XHRcdFx0XHRcdFx0PG9wdGlvbiAqbmdGb3I9J2xldCBsYXlvdXQgb2YgbWV0YS5hdmFpbGFibGVMYXlvdXRzJyBbbmdWYWx1ZV09J2xheW91dC5pZCc+e3tsYXlvdXQubmFtZX19PC9vcHRpb24+XG5cdFx0XHRcdFx0XHQ8L3NlbGVjdD5cblx0XHRcdFx0XHRcdDxsYWJlbD5MYXlvdXQ8L2xhYmVsPlxuXHRcdFx0XHRcdDwvbGFiZWw+XG5cdFx0XHRcdDwvZGl2PlxuXHRcdFx0PC9kaXY+XG5cdFx0PC9kaXY+XG5cdFx0PGRpdiBjbGFzcz1cIlZsdC1kcm9wZG93biByZXNvdXJjZS1tZW51XCIgW25nQ2xhc3NdPVwieyAnVmx0LWRyb3Bkb3duLS1leHBhbmRlZCc6IHJlc291cmNlTWVudVZpc2libGUgfVwiIHN0eWxlPSdtYXJnaW4tbGVmdDogMnB4Oyc+XG5cdFx0XHQ8ZGl2IGNsYXNzPVwiVmx0LWRyb3Bkb3duX19wYW5lbFwiIHN0eWxlPSdib3R0b206IDQwcHg7IHJpZ2h0OiAtNHB4OyB0b3A6IGluaXRpYWw7Jz5cblx0XHRcdFx0PGRpdiBjbGFzcz1cIlZsdC1kcm9wZG93bl9fcGFuZWxfX2NvbnRlbnRcIj5cblx0XHRcdFx0XHQ8YSBjbGFzcz1cIlZsdC1kcm9wZG93bl9fbGlua1wiIChjbGljayk9J2xvYWRNZXRhZGF0YShjdXJyZW50TGF5b3V0SWQsIHRydWUpJz5cblx0XHRcdFx0XHRcdDxkaXY+XG5cdFx0XHRcdFx0XHRcdDxzdmcgY2xhc3M9J1ZsdC1pY29uIFZsdC1pY29uLS1zbWFsbGVyJz48dXNlIHhsaW5rOmhyZWY9XCJ2b2x0YS92b2x0YS1pY29ucy5zdmcjVmx0LWljb24tcmVmcmVzaFwiLz48L3N2Zz4mbmJzcDsmbmJzcDtSZWZyZXNoIG1ldGFkYXRhXG5cdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHQ8L2E+XG5cdFx0XHRcdDwvZGl2PlxuXHRcdFx0PC9kaXY+XG5cdFx0XHQ8ZGl2IGNsYXNzPVwiVmx0LWRyb3Bkb3duX190cmlnZ2VyXCI+XG5cdFx0XHRcdDxidXR0b24gdHlwZT0nYnV0dG9uJyAoY2xpY2spPSdvcGVuUmVzb3VyY2VNZW51KCknIGNsYXNzPVwiVmx0LWJ0biBWbHQtYnRuLS1saW5rXCIgYXJpYS1sYWJlbD0nUmVzb3VyY2UgbWVudSc+XG5cdFx0XHRcdFx0PHN2ZyBjbGFzcz0nVmx0LWljb24gVmx0LWljb24tLXNtYWxsJyBzdHlsZT0nbWFyZ2luOiAwOyc+PHVzZSB4bGluazpocmVmPVwidm9sdGEvdm9sdGEtaWNvbnMuc3ZnI1ZsdC1pY29uLW1vcmUtdi1uZWdhdGl2ZVwiLz48L3N2Zz5cblx0XHRcdFx0PC9idXR0b24+XG5cdFx0XHQ8L2Rpdj5cblx0XHQ8L2Rpdj5cblx0PC9kaXY+XG48L2Zvcm0+XG48ZGl2IGNsYXNzPSdidXN5LW1hc2snIFtuZ0NsYXNzXT1cInsgYWN0aXZlOiBidXN5IH1cIj5cblx0PGRpdiBzdHlsZT0naGVpZ2h0OiAxMDAlOyBkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBhbGlnbi1pdGVtczogY2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsnPlxuXHRcdDxkaXYgY2xhc3M9XCJWbHQtc3Bpbm5lclwiPjwvZGl2PlxuXHQ8L2Rpdj5cbjwvZGl2PiJdfQ==