@solidev/data 0.0.9 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (123) hide show
  1. package/esm2022/lib/auth/auth-interceptor.service.mjs +118 -0
  2. package/{esm2020 → esm2022}/lib/auth/auth.service.mjs +2 -3
  3. package/{esm2020 → esm2022}/lib/data/data-backend.mjs +4 -4
  4. package/esm2022/lib/data/data-model.mjs +291 -0
  5. package/{esm2020 → esm2022}/lib/dispedit/choice.pipe.mjs +7 -7
  6. package/{esm2020 → esm2022}/lib/dispedit/dispedit/dispedit.component.mjs +4 -4
  7. package/{esm2020 → esm2022}/lib/dispedit/factor.pipe.mjs +7 -7
  8. package/{esm2020 → esm2022}/lib/dispedit/factorc.pipe.mjs +7 -7
  9. package/{esm2020 → esm2022}/lib/dispedit/fkselect/fkselect.component.mjs +4 -4
  10. package/{esm2020 → esm2022}/lib/dispedit/flags/flags.component.mjs +4 -4
  11. package/{esm2020 → esm2022}/lib/dispedit/m2mselect/m2mselect.component.mjs +10 -10
  12. package/{esm2020 → esm2022}/lib/dispedit/richedit/richedit.component.mjs +4 -4
  13. package/{esm2020 → esm2022}/lib/dispedit/sdelete/sdelete.component.mjs +4 -4
  14. package/esm2022/lib/messages/message-zone/message-zone.component.mjs +57 -0
  15. package/{esm2020 → esm2022}/lib/messages/message.service.mjs +4 -4
  16. package/{esm2020 → esm2022}/lib/modellist/model-list-fields/model-list-field-header/model-list-field-header.component.mjs +4 -4
  17. package/{esm2020 → esm2022}/lib/modellist/model-list-fields/model-list-fields-selector/model-list-fields-selector.component.mjs +4 -4
  18. package/{esm2020 → esm2022}/lib/modellist/model-list-filters/filters/model-list-autocomplete-filter/model-list-autocomplete-filter.component.mjs +4 -4
  19. package/{esm2020 → esm2022}/lib/modellist/model-list-filters/filters/model-list-autocomplete-multi-filter/model-list-autocomplete-multi-filter.component.mjs +4 -4
  20. package/{esm2020 → esm2022}/lib/modellist/model-list-filters/filters/model-list-date-filter/model-list-date-filter.component.mjs +4 -4
  21. package/{esm2020 → esm2022}/lib/modellist/model-list-filters/filters/model-list-datetime-filter/model-list-datetime-filter.component.mjs +4 -4
  22. package/{esm2020 → esm2022}/lib/modellist/model-list-filters/filters/model-list-datetimerange-filter/model-list-datetime-range-filter.component.mjs +4 -4
  23. package/{esm2020 → esm2022}/lib/modellist/model-list-filters/filters/model-list-flags-filter/model-list-flags-filter.component.mjs +4 -4
  24. package/{esm2020 → esm2022}/lib/modellist/model-list-filters/filters/model-list-geodistance-filter/model-list-geodistance-filter.component.mjs +4 -4
  25. package/{esm2020 → esm2022}/lib/modellist/model-list-filters/filters/model-list-number-filter/model-list-number-filter.component.mjs +4 -4
  26. package/{esm2020 → esm2022}/lib/modellist/model-list-filters/filters/model-list-select-filter/model-list-select-filter.component.mjs +4 -4
  27. package/{esm2020 → esm2022}/lib/modellist/model-list-filters/filters/model-list-select-multi-filter/model-list-select-multi-filter.component.mjs +4 -4
  28. package/{esm2020 → esm2022}/lib/modellist/model-list-filters/filters/model-list-text-filter/model-list-text-filter.component.mjs +4 -4
  29. package/{esm2020 → esm2022}/lib/modellist/model-list-filters/filters/model-list-tree-filter/model-list-tree-filter.component.mjs +4 -4
  30. package/{esm2020 → esm2022}/lib/modellist/model-list-filters/model-list-filters/model-list-filters.component.mjs +4 -4
  31. package/{esm2020 → esm2022}/lib/modellist/model-list-filters/model-list-filters-select/model-list-filters-select.component.mjs +4 -4
  32. package/{esm2020 → esm2022}/lib/modellist/model-list-paginator/model-list-paginator/model-list-paginator.component.mjs +4 -4
  33. package/{esm2020 → esm2022}/lib/modellist/model-list-sorter/model-list-sorter/model-list-sorter.component.mjs +4 -4
  34. package/{esm2020 → esm2022}/lib/modellist/model-list.service.mjs +4 -4
  35. package/{esm2020 → esm2022}/lib/routing/breadcrumb/breadcrumb.component.mjs +4 -4
  36. package/{esm2020 → esm2022}/lib/updates/update/update.component.mjs +4 -4
  37. package/{esm2020 → esm2022}/lib/updates/update.service.mjs +4 -4
  38. package/{esm2020 → esm2022}/lib/uploader/ng-file-drop.directive.mjs +4 -4
  39. package/{esm2020 → esm2022}/lib/uploader/ng-file-select.directive.mjs +4 -4
  40. package/{esm2020 → esm2022}/lib/uploader/ngx-uploader.module.mjs +5 -5
  41. package/{esm2020 → esm2022}/lib/utils/tab-memory.service.mjs +4 -4
  42. package/{fesm2020 → fesm2022}/solidev-data.mjs +181 -154
  43. package/fesm2022/solidev-data.mjs.map +1 -0
  44. package/lib/auth/auth-interceptor.service.d.ts +16 -2
  45. package/lib/dispedit/dispedit/dispedit.component.d.ts +1 -1
  46. package/lib/dispedit/fkselect/fkselect.component.d.ts +1 -1
  47. package/lib/dispedit/flags/flags.component.d.ts +1 -1
  48. package/lib/dispedit/m2mselect/m2mselect.component.d.ts +1 -1
  49. package/lib/dispedit/richedit/richedit.component.d.ts +1 -1
  50. package/lib/dispedit/sdelete/sdelete.component.d.ts +1 -1
  51. package/lib/messages/message-zone/message-zone.component.d.ts +1 -1
  52. package/lib/modellist/model-list-fields/model-list-field-header/model-list-field-header.component.d.ts +3 -3
  53. package/lib/modellist/model-list-fields/model-list-fields-selector/model-list-fields-selector.component.d.ts +1 -1
  54. package/lib/modellist/model-list-filters/filters/model-list-autocomplete-filter/model-list-autocomplete-filter.component.d.ts +1 -1
  55. package/lib/modellist/model-list-filters/filters/model-list-autocomplete-multi-filter/model-list-autocomplete-multi-filter.component.d.ts +1 -1
  56. package/lib/modellist/model-list-filters/filters/model-list-date-filter/model-list-date-filter.component.d.ts +1 -1
  57. package/lib/modellist/model-list-filters/filters/model-list-datetime-filter/model-list-datetime-filter.component.d.ts +1 -1
  58. package/lib/modellist/model-list-filters/filters/model-list-datetimerange-filter/model-list-datetime-range-filter.component.d.ts +1 -1
  59. package/lib/modellist/model-list-filters/filters/model-list-flags-filter/model-list-flags-filter.component.d.ts +1 -1
  60. package/lib/modellist/model-list-filters/filters/model-list-geodistance-filter/model-list-geodistance-filter.component.d.ts +1 -1
  61. package/lib/modellist/model-list-filters/filters/model-list-number-filter/model-list-number-filter.component.d.ts +1 -1
  62. package/lib/modellist/model-list-filters/filters/model-list-select-filter/model-list-select-filter.component.d.ts +1 -1
  63. package/lib/modellist/model-list-filters/filters/model-list-select-multi-filter/model-list-select-multi-filter.component.d.ts +1 -1
  64. package/lib/modellist/model-list-filters/filters/model-list-text-filter/model-list-text-filter.component.d.ts +1 -1
  65. package/lib/modellist/model-list-filters/filters/model-list-tree-filter/model-list-tree-filter.component.d.ts +1 -1
  66. package/lib/modellist/model-list-filters/model-list-filters/model-list-filters.component.d.ts +1 -1
  67. package/lib/modellist/model-list-filters/model-list-filters-select/model-list-filters-select.component.d.ts +1 -1
  68. package/lib/modellist/model-list-paginator/model-list-paginator/model-list-paginator.component.d.ts +1 -1
  69. package/lib/modellist/model-list-sorter/model-list-sorter/model-list-sorter.component.d.ts +1 -1
  70. package/lib/routing/breadcrumb/breadcrumb.component.d.ts +1 -1
  71. package/lib/uploader/ng-file-drop.directive.d.ts +1 -1
  72. package/lib/uploader/ng-file-select.directive.d.ts +1 -1
  73. package/package.json +8 -14
  74. package/esm2020/lib/auth/auth-interceptor.service.mjs +0 -91
  75. package/esm2020/lib/data/data-model.mjs +0 -291
  76. package/esm2020/lib/messages/message-zone/message-zone.component.mjs +0 -57
  77. package/fesm2015/solidev-data.mjs +0 -6228
  78. package/fesm2015/solidev-data.mjs.map +0 -1
  79. package/fesm2020/solidev-data.mjs.map +0 -1
  80. /package/{esm2020 → esm2022}/lib/auth/jwt.mjs +0 -0
  81. /package/{esm2020 → esm2022}/lib/data/data-collection.mjs +0 -0
  82. /package/{esm2020 → esm2022}/lib/data/data-collection.mock.mjs +0 -0
  83. /package/{esm2020 → esm2022}/lib/data/data-parameters.mjs +0 -0
  84. /package/{esm2020 → esm2022}/lib/data/data-query.mjs +0 -0
  85. /package/{esm2020 → esm2022}/lib/data/data-query.mock.mjs +0 -0
  86. /package/{esm2020 → esm2022}/lib/data/fields/base.mjs +0 -0
  87. /package/{esm2020 → esm2022}/lib/data/fields/boolean.mjs +0 -0
  88. /package/{esm2020 → esm2022}/lib/data/fields/computed.mjs +0 -0
  89. /package/{esm2020 → esm2022}/lib/data/fields/datetime.mjs +0 -0
  90. /package/{esm2020 → esm2022}/lib/data/fields/index.mjs +0 -0
  91. /package/{esm2020 → esm2022}/lib/data/fields/numbers.mjs +0 -0
  92. /package/{esm2020 → esm2022}/lib/data/fields/primaryfield.mjs +0 -0
  93. /package/{esm2020 → esm2022}/lib/data/fields/relations.mjs +0 -0
  94. /package/{esm2020 → esm2022}/lib/data/fields/stringfields.mjs +0 -0
  95. /package/{esm2020 → esm2022}/lib/dispedit/dispedit/dispedit.constants.mjs +0 -0
  96. /package/{esm2020 → esm2022}/lib/modellist/model-list-fields/model-list-field-header/messages.mjs +0 -0
  97. /package/{esm2020 → esm2022}/lib/modellist/model-list-fields/model-list-fields.mjs +0 -0
  98. /package/{esm2020 → esm2022}/lib/modellist/model-list-filters/filters/filtertypes.mjs +0 -0
  99. /package/{esm2020 → esm2022}/lib/modellist/model-list-filters/filters/model-list-autocomplete-filter/model-list-autocomplete-filter.mjs +0 -0
  100. /package/{esm2020 → esm2022}/lib/modellist/model-list-filters/filters/model-list-autocomplete-multi-filter/model-list-autocomplete-multi-filter.mjs +0 -0
  101. /package/{esm2020 → esm2022}/lib/modellist/model-list-filters/filters/model-list-date-filter/model-list-date-filter.mjs +0 -0
  102. /package/{esm2020 → esm2022}/lib/modellist/model-list-filters/filters/model-list-datetime-filter/model-list-datetime-filter.mjs +0 -0
  103. /package/{esm2020 → esm2022}/lib/modellist/model-list-filters/filters/model-list-datetimerange-filter/model-list-datetimerange-filter.mjs +0 -0
  104. /package/{esm2020 → esm2022}/lib/modellist/model-list-filters/filters/model-list-flags-filter/model-list-flags-filter.mjs +0 -0
  105. /package/{esm2020 → esm2022}/lib/modellist/model-list-filters/filters/model-list-geodistance-filter/adapters/ban.mjs +0 -0
  106. /package/{esm2020 → esm2022}/lib/modellist/model-list-filters/filters/model-list-geodistance-filter/model-list-geodistance-filter.mjs +0 -0
  107. /package/{esm2020 → esm2022}/lib/modellist/model-list-filters/filters/model-list-number-filter/model-list-number-filter.mjs +0 -0
  108. /package/{esm2020 → esm2022}/lib/modellist/model-list-filters/filters/model-list-select-filter/model-list-select-filter.mjs +0 -0
  109. /package/{esm2020 → esm2022}/lib/modellist/model-list-filters/filters/model-list-select-multi-filter/model-list-select-multi-filter.mjs +0 -0
  110. /package/{esm2020 → esm2022}/lib/modellist/model-list-filters/filters/model-list-text-filter/model-list-text-filter.mjs +0 -0
  111. /package/{esm2020 → esm2022}/lib/modellist/model-list-filters/filters/model-list-tree-filter/model-list-tree-filter.mjs +0 -0
  112. /package/{esm2020 → esm2022}/lib/modellist/model-list-filters/model-list-filter.mjs +0 -0
  113. /package/{esm2020 → esm2022}/lib/modellist/model-list-filters/model-list-filters.mjs +0 -0
  114. /package/{esm2020 → esm2022}/lib/modellist/model-list-paginator/model-list-paginator.mjs +0 -0
  115. /package/{esm2020 → esm2022}/lib/modellist/model-list-sorter/model-list-sorter.mjs +0 -0
  116. /package/{esm2020 → esm2022}/lib/routing/routing.mjs +0 -0
  117. /package/{esm2020 → esm2022}/lib/uploader/index.mjs +0 -0
  118. /package/{esm2020 → esm2022}/lib/uploader/interfaces.mjs +0 -0
  119. /package/{esm2020 → esm2022}/lib/uploader/ngx-uploader.class.mjs +0 -0
  120. /package/{esm2020 → esm2022}/lib/utils/slugify.mjs +0 -0
  121. /package/{esm2020 → esm2022}/lib/utils/template.mjs +0 -0
  122. /package/{esm2020 → esm2022}/public-api.mjs +0 -0
  123. /package/{esm2020 → esm2022}/solidev-data.mjs +0 -0
@@ -0,0 +1,291 @@
1
+ import { PROPERTY_METADATA_KEY, } from './fields/base';
2
+ import { FormControl, FormGroup } from '@angular/forms';
3
+ import { throwError } from 'rxjs';
4
+ import { tap } from 'rxjs/operators';
5
+ /**
6
+ * Base class for data model.
7
+ *
8
+ * Each class must have a static __name
9
+ * primary field is given with id field.
10
+ *
11
+ * Some methods are provided to be used with a collection, mostly for CRUD operations.
12
+ *
13
+ */
14
+ export class DataModel {
15
+ /**
16
+ * data model name
17
+ * this need to be given because class name is not fully available because of minification.
18
+ */
19
+ static { this.__name = ''; }
20
+ /**
21
+ * Constructor for data model instance.
22
+ * A matching collection can be provided.
23
+ * ___fields readonly property is also populated from Reflected metadata
24
+ *
25
+ * @param _coll collection used for CRUD, etc..
26
+ */
27
+ constructor(_coll) {
28
+ this._coll = _coll;
29
+ const md = Reflect.getMetadata(PROPERTY_METADATA_KEY, this);
30
+ // istanbul ignore if
31
+ if (!md) {
32
+ // This should never occur as all datamodel have at least id field
33
+ throw new Error('No property metadata found for this object; is there a property in current collection ?');
34
+ }
35
+ // Get all fields from current class and its parents
36
+ const fields = new Map();
37
+ let parent = Object.getPrototypeOf(this);
38
+ while (parent.constructor.name !== 'Object') {
39
+ for (const f of md.keys()) {
40
+ const fieldName = f.split('__')[1];
41
+ if (fields.has(fieldName)) {
42
+ continue;
43
+ }
44
+ if (f.indexOf(parent.constructor.__name + '__') === 0) {
45
+ fields.set(fieldName, md.get(f));
46
+ }
47
+ }
48
+ parent = Object.getPrototypeOf(parent);
49
+ }
50
+ this._F = Object.freeze(fields);
51
+ }
52
+ get _collection() {
53
+ return this._coll;
54
+ }
55
+ set _collection(coll) {
56
+ this._coll = coll;
57
+ }
58
+ /**
59
+ * HashMap of fields metadata (type, name, manager, etc...)
60
+ */
61
+ get F() {
62
+ // istanbul ignore if
63
+ if (!this._F) {
64
+ throw new Error('Invalid data model, fields metadata is missing');
65
+ }
66
+ return this._F;
67
+ }
68
+ // Return field names iterator
69
+ get FN() {
70
+ return this.F.keys();
71
+ }
72
+ /**
73
+ * Loads model data from json.
74
+ * If partial is true, only fields with matching data keys will be loaded
75
+ * @param data
76
+ * @param options
77
+ */
78
+ fromJson(data, { partial, check } = {
79
+ partial: false,
80
+ check: false,
81
+ }) {
82
+ const errors = {};
83
+ let haveError = false;
84
+ for (const f of this.FN) {
85
+ if (!partial || (partial && Object.keys(data).indexOf(f) !== -1)) {
86
+ const ferr = this.setFV(f, this.FM(f).fromJson(data[f]), check);
87
+ if (ferr !== null) {
88
+ errors[f] = ferr;
89
+ haveError = true;
90
+ }
91
+ }
92
+ }
93
+ return haveError ? errors : null;
94
+ }
95
+ toJson(fields) {
96
+ if (fields && !Array.isArray(fields)) {
97
+ fields = [fields];
98
+ }
99
+ const out = {};
100
+ const fl = this.F;
101
+ for (const f of this.FN) {
102
+ const mgr = this.FM(f);
103
+ if (!fields || fields.length === 0) {
104
+ if (mgr.readonly) {
105
+ continue;
106
+ }
107
+ out[f] = fl.get(f).manager.toJson(this.FV(f));
108
+ }
109
+ else {
110
+ if (fields.indexOf(f) !== -1) {
111
+ out[f] = fl.get(f).manager.toJson(this.FV(f));
112
+ }
113
+ }
114
+ }
115
+ return out;
116
+ }
117
+ action(method, name, { body = undefined, update = false, updatePartial = true, updateCheck = false,
118
+ // updateRaise = false,
119
+ params = {}, headers = {}, } = {}) {
120
+ if (this._coll === undefined) {
121
+ return throwError(() => new Error('Missing collection'));
122
+ }
123
+ return this._coll
124
+ .action(this, method, name, {
125
+ body,
126
+ params,
127
+ headers,
128
+ })
129
+ .pipe(tap((result) => {
130
+ if (update) {
131
+ this.fromJson(result, {
132
+ partial: updatePartial,
133
+ check: updateCheck,
134
+ });
135
+ return this;
136
+ }
137
+ return result;
138
+ }));
139
+ }
140
+ // Called on model, returns the manager for a field.
141
+ FM(field) {
142
+ if (this.F.has(field)) {
143
+ return this.F.get(field).manager;
144
+ }
145
+ throw new Error(`${field} not found in ${Object.keys(this.F).join(',')} model ${this}`);
146
+ }
147
+ // Return field value, without typing
148
+ FV(field) {
149
+ return this[field];
150
+ }
151
+ /**
152
+ * Set field value. If check is true, only set value if all validators pass.
153
+ * Skip setting field value if manager computed flag is true.
154
+ *
155
+ * The validation result is returned.
156
+ *
157
+ * @param field field name
158
+ * @param value field valued
159
+ * @param check default false
160
+ * @return null or ValidationError
161
+ */
162
+ setFV(field, value, check = false) {
163
+ if (this.FM(field).computed) {
164
+ return null;
165
+ }
166
+ if (check) {
167
+ const fc = new FormControl(value);
168
+ for (const v of this.FM(field).validators) {
169
+ const val = v(fc);
170
+ if (val !== null) {
171
+ console.error(val);
172
+ return val;
173
+ }
174
+ }
175
+ }
176
+ this[field] = value;
177
+ return null;
178
+ }
179
+ FC(field) {
180
+ if (field === undefined) {
181
+ field = Array.from(this.FN).filter((n) => !this.FM(n).readonly);
182
+ }
183
+ if (Array.isArray(field)) {
184
+ const fg = {};
185
+ for (const f of field) {
186
+ fg[f] = this.FC(f);
187
+ }
188
+ return new FormGroup(fg);
189
+ }
190
+ return this.FM(field).formControl(this);
191
+ }
192
+ save({ updateModel = true } = {
193
+ updateModel: true,
194
+ }) {
195
+ if (this._coll) {
196
+ return this._coll.save(this, { updateModel });
197
+ }
198
+ return throwError(() => new Error('Missing collection'));
199
+ }
200
+ update(fields = [], { updateModel = true } = {
201
+ updateModel: true,
202
+ }) {
203
+ if (this._coll) {
204
+ return this._coll.update(this, fields, { updateModel });
205
+ }
206
+ return throwError(() => new Error('Missing collection'));
207
+ }
208
+ }
209
+ //
210
+ // export class TreeDataModel extends DataModel {
211
+ // static override __name = 'TreeDataModel';
212
+ // @detailsField({
213
+ // model: this,
214
+ // many: true,
215
+ // description: 'Parents',
216
+ // })
217
+ // public parents_details?: this[];
218
+ //
219
+ // @foreignKeyField({
220
+ // required: false,
221
+ // description: 'Structure parente',
222
+ // related: 'Structure',
223
+ // })
224
+ // public parent?: number;
225
+ //
226
+ // @integerField({
227
+ // required: false,
228
+ // readonly: true,
229
+ // description: 'ID Tree',
230
+ // })
231
+ // public tree_id!: number;
232
+ //
233
+ // @integerField({
234
+ // required: false,
235
+ // readonly: true,
236
+ // description: 'MPTT left',
237
+ // })
238
+ // public lft!: number;
239
+ //
240
+ // @integerField({
241
+ // required: false,
242
+ // readonly: true,
243
+ // description: 'MPTT right',
244
+ // })
245
+ // public rght!: number;
246
+ //
247
+ // @integerField({
248
+ // required: false,
249
+ // readonly: true,
250
+ // description: 'Niveau hiérarchique',
251
+ // })
252
+ // public level!: number;
253
+ //
254
+ // public get parent_details(): this | null {
255
+ // if (this.parents_details) {
256
+ // const out = this.parents_details[this.parents_details.length - 1];
257
+ // out.parents_details = this.parents_details.slice(
258
+ // 0,
259
+ // this.parents_details.length - 1
260
+ // );
261
+ // return out;
262
+ // }
263
+ // return null;
264
+ // }
265
+ //
266
+ // public set parent_details(d: this | null) {
267
+ // console.log(d);
268
+ // this.parents_details = d?.parents_details;
269
+ // }
270
+ //
271
+ // public _display(): string {
272
+ // const out: string[] = [];
273
+ // if (this.parents_details) {
274
+ // for (const p of this.parents_details) {
275
+ // if ((p as any).code) {
276
+ // out.push(`[${(p as any).code}] ${(p as any).name}`);
277
+ // } else {
278
+ // out.push((p as any).name);
279
+ // }
280
+ // }
281
+ // }
282
+ // if ((this as any).code) {
283
+ // out.push(`[${(this as any).code}] ${(this as any).name}`);
284
+ // } else {
285
+ // out.push((this as any).name);
286
+ // }
287
+ //
288
+ // return out.join(' : ');
289
+ // }
290
+ // }
291
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2RhdGEvc3JjL2xpYi9kYXRhL2RhdGEtbW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUdMLHFCQUFxQixHQUN0QixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBb0IsTUFBTSxnQkFBZ0IsQ0FBQztBQUUxRSxPQUFPLEVBQWMsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzlDLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUlyQzs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sT0FBTyxTQUFTO0lBQ3BCOzs7T0FHRzthQUN1QixXQUFNLEdBQVcsRUFBRSxDQUFDO0lBWTlDOzs7Ozs7T0FNRztJQUNILFlBQXNCLEtBQXVCO1FBQXZCLFVBQUssR0FBTCxLQUFLLENBQWtCO1FBQzNDLE1BQU0sRUFBRSxHQUNOLE9BQU8sQ0FBQyxXQUFXLENBQUMscUJBQXFCLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDbkQscUJBQXFCO1FBQ3JCLElBQUksQ0FBQyxFQUFFLEVBQUU7WUFDUCxrRUFBa0U7WUFDbEUsTUFBTSxJQUFJLEtBQUssQ0FDYix5RkFBeUYsQ0FDMUYsQ0FBQztTQUNIO1FBQ0Qsb0RBQW9EO1FBQ3BELE1BQU0sTUFBTSxHQUFHLElBQUksR0FBRyxFQUFxQyxDQUFDO1FBQzVELElBQUksTUFBTSxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDekMsT0FBTyxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksS0FBSyxRQUFRLEVBQUU7WUFDM0MsS0FBSyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBQ3pCLE1BQU0sU0FBUyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMs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QztBQUMvQyxrQ0FBa0M7QUFDbEMsMkVBQTJFO0FBQzNFLDBEQUEwRDtBQUMxRCxhQUFhO0FBQ2IsMENBQTBDO0FBQzFDLFdBQVc7QUFDWCxvQkFBb0I7QUFDcEIsUUFBUTtBQUNSLG1CQUFtQjtBQUNuQixNQUFNO0FBQ04sRUFBRTtBQUNGLGdEQUFnRDtBQUNoRCxzQkFBc0I7QUFDdEIsaURBQWlEO0FBQ2pELE1BQU07QUFDTixFQUFFO0FBQ0YsZ0NBQWdDO0FBQ2hDLGdDQUFnQztBQUNoQyxrQ0FBa0M7QUFDbEMsZ0RBQWdEO0FBQ2hELGlDQUFpQztBQUNqQyxpRUFBaUU7QUFDakUsbUJBQW1CO0FBQ25CLHVDQUF1QztBQUN2QyxZQUFZO0FBQ1osVUFBVTtBQUNWLFFBQVE7QUFDUixnQ0FBZ0M7QUFDaEMsbUVBQW1FO0FBQ25FLGVBQWU7QUFDZixzQ0FBc0M7QUFDdEMsUUFBUTtBQUNSLEVBQUU7QUFDRiw4QkFBOEI7QUFDOUIsTUFBTTtBQUNOLElBQUkiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBCYXNlRmllbGRNYW5hZ2VyLFxuICBJRmllbGRTdG9yZWRNZXRhZGF0YSxcbiAgUFJPUEVSVFlfTUVUQURBVEFfS0VZLFxufSBmcm9tICcuL2ZpZWxkcy9iYXNlJztcbmltcG9ydCB7IEZvcm1Db250cm9sLCBGb3JtR3JvdXAsIFZhbGlkYXRpb25FcnJvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uIH0gZnJvbSAnLi9kYXRhLWNvbGxlY3Rpb24nO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgdGhyb3dFcnJvciB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5leHBvcnQgdHlwZSBEYXRhTW9kZWxGaWVsZHMgPSBSZWFkb25seTxNYXA8c3RyaW5nLCBJRmllbGRTdG9yZWRNZXRhZGF0YTxhbnk+Pj47XG5cbi8qKlxuICogQmFzZSBjbGFzcyBmb3IgZGF0YSBtb2RlbC5cbiAqXG4gKiBFYWNoIGNsYXNzIG11c3QgaGF2ZSBhIHN0YXRpYyBfX25hbWVcbiAqIHByaW1hcnkgZmllbGQgaXMgZ2l2ZW4gd2l0aCBpZCBmaWVsZC5cbiAqXG4gKiBTb21lIG1ldGhvZHMgYXJlIHByb3ZpZGVkIHRvIGJlIHVzZWQgd2l0aCBhIGNvbGxlY3Rpb24sIG1vc3RseSBmb3IgQ1JVRCBvcGVyYXRpb25zLlxuICpcbiAqL1xuZXhwb3J0IGNsYXNzIERhdGFNb2RlbCB7XG4gIC8qKlxuICAgKiBkYXRhIG1vZGVsIG5hbWVcbiAgICogdGhpcyBuZWVkIHRvIGJlIGdpdmVuIGJlY2F1c2UgY2xhc3MgbmFtZSBpcyBub3QgZnVsbHkgYXZhaWxhYmxlIGJlY2F1c2Ugb2YgbWluaWZpY2F0aW9uLlxuICAgKi9cbiAgcHJvdGVjdGVkIHN0YXRpYyByZWFkb25seSBfX25hbWU6IHN0cmluZyA9ICcnO1xuXG4gIC8qKlxuICAgKiBQcmltYXJ5IGZpZWxkOyByZWFkb25seTsgbXVzdCBiZSBjcmVhdGVkIGFuZCBhdXRvIGluY3JlbWVudGVkIG9uIGRiIHNpZGUuXG4gICAqL1xuICAvLyBAcHJpbWFyeUZpZWxkKHtcbiAgLy8gICBkZXNjcmlwdGlvbjogJ0lEJyxcbiAgLy8gICBoZWxwOiAnSWRlbnRpZmlhbnQgcHJpbWFpcmUnLFxuICAvLyB9KVxuICBwdWJsaWMgaWQhOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgX0Y6IERhdGFNb2RlbEZpZWxkcztcblxuICAvKipcbiAgICogQ29uc3RydWN0b3IgZm9yIGRhdGEgbW9kZWwgaW5zdGFuY2UuXG4gICAqIEEgbWF0Y2hpbmcgY29sbGVjdGlvbiBjYW4gYmUgcHJvdmlkZWQuXG4gICAqIF9fX2ZpZWxkcyByZWFkb25seSBwcm9wZXJ0eSBpcyBhbHNvIHBvcHVsYXRlZCBmcm9tIFJlZmxlY3RlZCBtZXRhZGF0YVxuICAgKlxuICAgKiBAcGFyYW0gX2NvbGwgY29sbGVjdGlvbiB1c2VkIGZvciBDUlVELCBldGMuLlxuICAgKi9cbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIF9jb2xsPzogQ29sbGVjdGlvbjxhbnk+KSB7XG4gICAgY29uc3QgbWQ6IE1hcDxzdHJpbmcsIElGaWVsZFN0b3JlZE1ldGFkYXRhPGFueT4+IHwgdW5kZWZpbmVkID1cbiAgICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEoUFJPUEVSVFlfTUVUQURBVEFfS0VZLCB0aGlzKTtcbiAgICAvLyBpc3RhbmJ1bCBpZ25vcmUgaWZcbiAgICBpZiAoIW1kKSB7XG4gICAgICAvLyBUaGlzIHNob3VsZCBuZXZlciBvY2N1ciBhcyBhbGwgZGF0YW1vZGVsIGhhdmUgYXQgbGVhc3QgaWQgZmllbGRcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ05vIHByb3BlcnR5IG1ldGFkYXRhIGZvdW5kIGZvciB0aGlzIG9iamVjdDsgaXMgdGhlcmUgYSBwcm9wZXJ0eSBpbiBjdXJyZW50IGNvbGxlY3Rpb24gPydcbiAgICAgICk7XG4gICAgfVxuICAgIC8vIEdldCBhbGwgZmllbGRzIGZyb20gY3VycmVudCBjbGFzcyBhbmQgaXRzIHBhcmVudHNcbiAgICBjb25zdCBmaWVsZHMgPSBuZXcgTWFwPHN0cmluZywgSUZpZWxkU3RvcmVkTWV0YWRhdGE8YW55Pj4oKTtcbiAgICBsZXQgcGFyZW50ID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHRoaXMpO1xuICAgIHdoaWxlIChwYXJlbnQuY29uc3RydWN0b3IubmFtZSAhPT0gJ09iamVjdCcpIHtcbiAgICAgIGZvciAoY29uc3QgZiBvZiBtZC5rZXlzKCkpIHtcbiAgICAgICAgY29uc3QgZmllbGROYW1lID0gZi5zcGxpdCgnX18nKVsxXTtcbiAgICAgICAgaWYgKGZpZWxkcy5oYXMoZmllbGROYW1lKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmLmluZGV4T2YocGFyZW50LmNvbnN0cnVjdG9yLl9fbmFtZSArICdfXycpID09PSAwKSB7XG4gICAgICAgICAgZmllbGRzLnNldChmaWVsZE5hbWUsIG1kLmdldChmKSEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBwYXJlbnQgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocGFyZW50KTtcbiAgICB9XG4gICAgdGhpcy5fRiA9IE9iamVjdC5mcmVlemUoZmllbGRzKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgX2NvbGxlY3Rpb24oKTogQ29sbGVjdGlvbjxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5fY29sbCBhcyBDb2xsZWN0aW9uPGFueT47XG4gIH1cblxuICBwdWJsaWMgc2V0IF9jb2xsZWN0aW9uKGNvbGw6IENvbGxlY3Rpb248YW55Pikge1xuICAgIHRoaXMuX2NvbGwgPSBjb2xsO1xuICB9XG5cbiAgLyoqXG4gICAqICBIYXNoTWFwIG9mIGZpZWxkcyBtZXRhZGF0YSAodHlwZSwgbmFtZSwgbWFuYWdlciwgZXRjLi4uKVxuICAgKi9cbiAgcHVibGljIGdldCBGKCk6IERhdGFNb2RlbEZpZWxkcyB7XG4gICAgLy8gaXN0YW5idWwgaWdub3JlIGlmXG4gICAgaWYgKCF0aGlzLl9GKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZGF0YSBtb2RlbCwgZmllbGRzIG1ldGFkYXRhIGlzIG1pc3NpbmcnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX0Y7XG4gIH1cblxuICAvLyBSZXR1cm4gZmllbGQgbmFtZXMgaXRlcmF0b3JcbiAgcHVibGljIGdldCBGTigpOiBJdGVyYWJsZUl0ZXJhdG9yPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLkYua2V5cygpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWRzIG1vZGVsIGRhdGEgZnJvbSBqc29uLlxuICAgKiBJZiBwYXJ0aWFsIGlzIHRydWUsIG9ubHkgZmllbGRzIHdpdGggbWF0Y2hpbmcgZGF0YSBrZXlzIHdpbGwgYmUgbG9hZGVkXG4gICAqIEBwYXJhbSBkYXRhXG4gICAqIEBwYXJhbSBvcHRpb25zXG4gICAqL1xuICBwdWJsaWMgZnJvbUpzb24oXG4gICAgZGF0YTogeyBbaW5kZXg6IHN0cmluZ106IGFueSB9LFxuICAgIHsgcGFydGlhbCwgY2hlY2sgfTogeyBwYXJ0aWFsPzogYm9vbGVhbjsgY2hlY2s/OiBib29sZWFuIH0gPSB7XG4gICAgICBwYXJ0aWFsOiBmYWxzZSxcbiAgICAgIGNoZWNrOiBmYWxzZSxcbiAgICB9XG4gICk6IG51bGwgfCBWYWxpZGF0aW9uRXJyb3JzIHtcbiAgICBjb25zdCBlcnJvcnM6IHsgW2luZGV4OiBzdHJpbmddOiBudWxsIHwgVmFsaWRhdGlvbkVycm9ycyB9ID0ge307XG4gICAgbGV0IGhhdmVFcnJvciA9IGZhbHNlO1xuICAgIGZvciAoY29uc3QgZiBvZiB0aGlzLkZOKSB7XG4gICAgICBpZiAoIXBhcnRpYWwgfHwgKHBhcnRpYWwgJiYgT2JqZWN0LmtleXMoZGF0YSkuaW5kZXhPZihmKSAhPT0gLTEpKSB7XG4gICAgICAgIGNvbnN0IGZlcnIgPSB0aGlzLnNldEZWKGYsIHRoaXMuRk0oZikuZnJvbUpzb24oZGF0YVtmXSksIGNoZWNrKTtcbiAgICAgICAgaWYgKGZlcnIgIT09IG51bGwpIHtcbiAgICAgICAgICBlcnJvcnNbZl0gPSBmZXJyO1xuICAgICAgICAgIGhhdmVFcnJvciA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGhhdmVFcnJvciA/IGVycm9ycyA6IG51bGw7XG4gIH1cblxuICBwdWJsaWMgdG9Kc29uKGZpZWxkcz86IHN0cmluZyB8IHN0cmluZ1tdKTogYW55IHtcbiAgICBpZiAoZmllbGRzICYmICFBcnJheS5pc0FycmF5KGZpZWxkcykpIHtcbiAgICAgIGZpZWxkcyA9IFtmaWVsZHNdO1xuICAgIH1cbiAgICBjb25zdCBvdXQ6IHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuICAgIGNvbnN0IGZsID0gdGhpcy5GO1xuICAgIGZvciAoY29uc3QgZiBvZiB0aGlzLkZOKSB7XG4gICAgICBjb25zdCBtZ3IgPSB0aGlzLkZNKGYpO1xuICAgICAgaWYgKCFmaWVsZHMgfHwgZmllbGRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBpZiAobWdyLnJlYWRvbmx5KSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgb3V0W2ZdID0gZmwuZ2V0KGYpIS5tYW5hZ2VyLnRvSnNvbih0aGlzLkZWKGYpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChmaWVsZHMuaW5kZXhPZihmKSAhPT0gLTEpIHtcbiAgICAgICAgICBvdXRbZl0gPSBmbC5nZXQoZikhLm1hbmFnZXIudG9Kc29uKHRoaXMuRlYoZikpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICBwdWJsaWMgYWN0aW9uPFQsIFJUIGV4dGVuZHMgeyBbaW5kZXg6IHN0cmluZ106IGFueSB9PihcbiAgICBtZXRob2Q6ICdQT1NUJyB8ICdQQVRDSCcgfCAnR0VUJyB8ICdERUxFVEUnIHwgJ1BVVCcsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHtcbiAgICAgIGJvZHkgPSB1bmRlZmluZWQsXG4gICAgICB1cGRhdGUgPSBmYWxzZSxcbiAgICAgIHVwZGF0ZVBhcnRpYWwgPSB0cnVlLFxuICAgICAgdXBkYXRlQ2hlY2sgPSBmYWxzZSxcbiAgICAgIC8vIHVwZGF0ZVJhaXNlID0gZmFsc2UsXG4gICAgICBwYXJhbXMgPSB7fSxcbiAgICAgIGhlYWRlcnMgPSB7fSxcbiAgICB9OiB7XG4gICAgICBib2R5PzogeyBbX2luZGV4OiBzdHJpbmddOiBhbnkgfTtcbiAgICAgIHVwZGF0ZT86IGJvb2xlYW47XG4gICAgICB1cGRhdGVQYXJ0aWFsPzogYm9vbGVhbjtcbiAgICAgIHVwZGF0ZUNoZWNrPzogYm9vbGVhbjtcbiAgICAgIC8vIHVwZGF0ZVJhaXNlPzogYm9vbGVhbjtcbiAgICAgIHBhcmFtcz86IHsgW19pbmRleDogc3RyaW5nXTogc3RyaW5nIH07XG4gICAgICBoZWFkZXJzPzogeyBbX2luZGV4OiBzdHJpbmddOiBzdHJpbmcgfTtcbiAgICB9ID0ge31cbiAgKTogT2JzZXJ2YWJsZTxSVD4ge1xuICAgIGlmICh0aGlzLl9jb2xsID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IG5ldyBFcnJvcignTWlzc2luZyBjb2xsZWN0aW9uJykpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fY29sbFxuICAgICAgLmFjdGlvbjxSVD4odGhpcywgbWV0aG9kLCBuYW1lLCB7XG4gICAgICAgIGJvZHksXG4gICAgICAgIHBhcmFtcyxcbiAgICAgICAgaGVhZGVycyxcbiAgICAgIH0pXG4gICAgICAucGlwZShcbiAgICAgICAgdGFwKChyZXN1bHQpID0+IHtcbiAgICAgICAgICBpZiAodXBkYXRlKSB7XG4gICAgICAgICAgICB0aGlzLmZyb21Kc29uKHJlc3VsdCwge1xuICAgICAgICAgICAgICBwYXJ0aWFsOiB1cGRhdGVQYXJ0aWFsLFxuICAgICAgICAgICAgICBjaGVjazogdXBkYXRlQ2hlY2ssXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgfVxuXG4gIC8vIENhbGxlZCBvbiBtb2RlbCwgcmV0dXJucyB0aGUgbWFuYWdlciBmb3IgYSBmaWVsZC5cbiAgcHVibGljIEZNPEZUPihmaWVsZDogc3RyaW5nKTogQmFzZUZpZWxkTWFuYWdlcjxGVD4ge1xuICAgIGlmICh0aGlzLkYuaGFzKGZpZWxkKSkge1xuICAgICAgcmV0dXJuIHRoaXMuRi5nZXQoZmllbGQpIS5tYW5hZ2VyO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgJHtmaWVsZH0gbm90IGZvdW5kIGluICR7T2JqZWN0LmtleXModGhpcy5GKS5qb2luKCcsJyl9IG1vZGVsICR7dGhpc31gXG4gICAgKTtcbiAgfVxuXG4gIC8vIFJldHVybiBmaWVsZCB2YWx1ZSwgd2l0aG91dCB0eXBpbmdcbiAgcHVibGljIEZWPEZUPihmaWVsZDogc3RyaW5nKTogRlQge1xuICAgIHJldHVybiAodGhpcyBhcyBhbnkpW2ZpZWxkXSBhcyBGVDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgZmllbGQgdmFsdWUuIElmIGNoZWNrIGlzIHRydWUsIG9ubHkgc2V0IHZhbHVlIGlmIGFsbCB2YWxpZGF0b3JzIHBhc3MuXG4gICAqIFNraXAgc2V0dGluZyBmaWVsZCB2YWx1ZSBpZiBtYW5hZ2VyIGNvbXB1dGVkIGZsYWcgaXMgdHJ1ZS5cbiAgICpcbiAgICogVGhlIHZhbGlkYXRpb24gcmVzdWx0IGlzIHJldHVybmVkLlxuICAgKlxuICAgKiBAcGFyYW0gZmllbGQgZmllbGQgbmFtZVxuICAgKiBAcGFyYW0gdmFsdWUgZmllbGQgdmFsdWVkXG4gICAqIEBwYXJhbSBjaGVjayBkZWZhdWx0IGZhbHNlXG4gICAqIEByZXR1cm4gbnVsbCBvciBWYWxpZGF0aW9uRXJyb3JcbiAgICovXG4gIHB1YmxpYyBzZXRGVjxGVD4oXG4gICAgZmllbGQ6IHN0cmluZyxcbiAgICB2YWx1ZTogRlQsXG4gICAgY2hlY2s6IGJvb2xlYW4gPSBmYWxzZVxuICApOiBudWxsIHwgVmFsaWRhdGlvbkVycm9ycyB7XG4gICAgaWYgKHRoaXMuRk0oZmllbGQpLmNvbXB1dGVkKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKGNoZWNrKSB7XG4gICAgICBjb25zdCBmYyA9IG5ldyBGb3JtQ29udHJvbCh2YWx1ZSk7XG5cbiAgICAgIGZvciAoY29uc3QgdiBvZiB0aGlzLkZNKGZpZWxkKS52YWxpZGF0b3JzKSB7XG4gICAgICAgIGNvbnN0IHZhbCA9IHYoZmMpO1xuICAgICAgICBpZiAodmFsICE9PSBudWxsKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcih2YWwpO1xuICAgICAgICAgIHJldHVybiB2YWw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgKHRoaXMgYXMgYW55KVtmaWVsZF0gPSB2YWx1ZTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8vIENhbGxlZCBvbiBtb2RlbCB3aXRoIGEgbGlzdCBvZiBmaWVsZHMsIHJldHVybnMgYSBGb3JtR3JvdXAgd2l0aFxuICAvLyB0aGVzZSBmaWVsZHMsIG9yIG9ubHkgdGhlIGZvcm0gY29udHJvbCBmb3Igb25lIGZpZWxkLlxuICBwdWJsaWMgRkMoKTogRm9ybUdyb3VwO1xuICBwdWJsaWMgRkMoZmllbGQ6IHN0cmluZyk6IEZvcm1Db250cm9sO1xuICBwdWJsaWMgRkMoZmllbGQ6IHN0cmluZ1tdKTogRm9ybUdyb3VwO1xuICBwdWJsaWMgRkMoZmllbGQ/OiBzdHJpbmcgfCBzdHJpbmdbXSk6IEZvcm1Db250cm9sIHwgRm9ybUdyb3VwIHtcbiAgICBpZiAoZmllbGQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgZmllbGQgPSBBcnJheS5mcm9tKHRoaXMuRk4pLmZpbHRlcigobikgPT4gIXRoaXMuRk0obikucmVhZG9ubHkpO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheShmaWVsZCkpIHtcbiAgICAgIGNvbnN0IGZnOiB7IFtpbmRleDogc3RyaW5nXTogRm9ybUNvbnRyb2wgfSA9IHt9O1xuICAgICAgZm9yIChjb25zdCBmIG9mIGZpZWxkKSB7XG4gICAgICAgIGZnW2ZdID0gdGhpcy5GQyhmKSBhcyBGb3JtQ29udHJvbDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgRm9ybUdyb3VwKGZnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuRk0oZmllbGQpLmZvcm1Db250cm9sKHRoaXMpO1xuICB9XG5cbiAgcHVibGljIHNhdmUoXG4gICAgeyB1cGRhdGVNb2RlbCA9IHRydWUgfTogeyB1cGRhdGVNb2RlbD86IGJvb2xlYW4gfSA9IHtcbiAgICAgIHVwZGF0ZU1vZGVsOiB0cnVlLFxuICAgIH1cbiAgKTogT2JzZXJ2YWJsZTx0aGlzPiB7XG4gICAgaWYgKHRoaXMuX2NvbGwpIHtcbiAgICAgIHJldHVybiB0aGlzLl9jb2xsLnNhdmUodGhpcywgeyB1cGRhdGVNb2RlbCB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gbmV3IEVycm9yKCdNaXNzaW5nIGNvbGxlY3Rpb24nKSk7XG4gIH1cblxuICBwdWJsaWMgdXBkYXRlKFxuICAgIGZpZWxkczogc3RyaW5nW10gPSBbXSxcbiAgICB7IHVwZGF0ZU1vZGVsID0gdHJ1ZSB9OiB7IHVwZGF0ZU1vZGVsPzogYm9vbGVhbiB9ID0ge1xuICAgICAgdXBkYXRlTW9kZWw6IHRydWUsXG4gICAgfVxuICApOiBPYnNlcnZhYmxlPHRoaXM+IHtcbiAgICBpZiAodGhpcy5fY29sbCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2NvbGwudXBkYXRlKHRoaXMsIGZpZWxkcywgeyB1cGRhdGVNb2RlbCB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gbmV3IEVycm9yKCdNaXNzaW5nIGNvbGxlY3Rpb24nKSk7XG4gIH1cbn1cblxuLy9cbi8vIGV4cG9ydCBjbGFzcyBUcmVlRGF0YU1vZGVsIGV4dGVuZHMgRGF0YU1vZGVsIHtcbi8vICAgc3RhdGljIG92ZXJyaWRlIF9fbmFtZSA9ICdUcmVlRGF0YU1vZGVsJztcbi8vICAgQGRldGFpbHNGaWVsZCh7XG4vLyAgICAgbW9kZWw6IHRoaXMsXG4vLyAgICAgbWFueTogdHJ1ZSxcbi8vICAgICBkZXNjcmlwdGlvbjogJ1BhcmVudHMnLFxuLy8gICB9KVxuLy8gICBwdWJsaWMgcGFyZW50c19kZXRhaWxzPzogdGhpc1tdO1xuLy9cbi8vICAgQGZvcmVpZ25LZXlGaWVsZCh7XG4vLyAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuLy8gICAgIGRlc2NyaXB0aW9uOiAnU3RydWN0dXJlIHBhcmVudGUnLFxuLy8gICAgIHJlbGF0ZWQ6ICdTdHJ1Y3R1cmUnLFxuLy8gICB9KVxuLy8gICBwdWJsaWMgcGFyZW50PzogbnVtYmVyO1xuLy9cbi8vICAgQGludGVnZXJGaWVsZCh7XG4vLyAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuLy8gICAgIHJlYWRvbmx5OiB0cnVlLFxuLy8gICAgIGRlc2NyaXB0aW9uOiAnSUQgVHJlZScsXG4vLyAgIH0pXG4vLyAgIHB1YmxpYyB0cmVlX2lkITogbnVtYmVyO1xuLy9cbi8vICAgQGludGVnZXJGaWVsZCh7XG4vLyAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuLy8gICAgIHJlYWRvbmx5OiB0cnVlLFxuLy8gICAgIGRlc2NyaXB0aW9uOiAnTVBUVCBsZWZ0Jyxcbi8vICAgfSlcbi8vICAgcHVibGljIGxmdCE6IG51bWJlcjtcbi8vXG4vLyAgIEBpbnRlZ2VyRmllbGQoe1xuLy8gICAgIHJlcXVpcmVkOiBmYWxzZSxcbi8vICAgICByZWFkb25seTogdHJ1ZSxcbi8vICAgICBkZXNjcmlwdGlvbjogJ01QVFQgcmlnaHQnLFxuLy8gICB9KVxuLy8gICBwdWJsaWMgcmdodCE6IG51bWJlcjtcbi8vXG4vLyAgIEBpbnRlZ2VyRmllbGQoe1xuLy8gICAgIHJlcXVpcmVkOiBmYWxzZSxcbi8vICAgICByZWFkb25seTogdHJ1ZSxcbi8vICAgICBkZXNjcmlwdGlvbjogJ05pdmVhdSBoacOpcmFyY2hpcXVlJyxcbi8vICAgfSlcbi8vICAgcHVibGljIGxldmVsITogbnVtYmVyO1xuLy9cbi8vICAgcHVibGljIGdldCBwYXJlbnRfZGV0YWlscygpOiB0aGlzIHwgbnVsbCB7XG4vLyAgICAgaWYgKHRoaXMucGFyZW50c19kZXRhaWxzKSB7XG4vLyAgICAgICBjb25zdCBvdXQgPSB0aGlzLnBhcmVudHNfZGV0YWlsc1t0aGlzLnBhcmVudHNfZGV0YWlscy5sZW5ndGggLSAxXTtcbi8vICAgICAgIG91dC5wYXJlbnRzX2RldGFpbHMgPSB0aGlzLnBhcmVudHNfZGV0YWlscy5zbGljZShcbi8vICAgICAgICAgMCxcbi8vICAgICAgICAgdGhpcy5wYXJlbnRzX2RldGFpbHMubGVuZ3RoIC0gMVxuLy8gICAgICAgKTtcbi8vICAgICAgIHJldHVybiBvdXQ7XG4vLyAgICAgfVxuLy8gICAgIHJldHVybiBudWxsO1xuLy8gICB9XG4vL1xuLy8gICBwdWJsaWMgc2V0IHBhcmVudF9kZXRhaWxzKGQ6IHRoaXMgfCBudWxsKSB7XG4vLyAgICAgY29uc29sZS5sb2coZCk7XG4vLyAgICAgdGhpcy5wYXJlbnRzX2RldGFpbHMgPSBkPy5wYXJlbnRzX2RldGFpbHM7XG4vLyAgIH1cbi8vXG4vLyAgIHB1YmxpYyBfZGlzcGxheSgpOiBzdHJpbmcge1xuLy8gICAgIGNvbnN0IG91dDogc3RyaW5nW10gPSBbXTtcbi8vICAgICBpZiAodGhpcy5wYXJlbnRzX2RldGFpbHMpIHtcbi8vICAgICAgIGZvciAoY29uc3QgcCBvZiB0aGlzLnBhcmVudHNfZGV0YWlscykge1xuLy8gICAgICAgICBpZiAoKHAgYXMgYW55KS5jb2RlKSB7XG4vLyAgICAgICAgICAgb3V0LnB1c2goYFskeyhwIGFzIGFueSkuY29kZX1dICR7KHAgYXMgYW55KS5uYW1lfWApO1xuLy8gICAgICAgICB9IGVsc2Uge1xuLy8gICAgICAgICAgIG91dC5wdXNoKChwIGFzIGFueSkubmFtZSk7XG4vLyAgICAgICAgIH1cbi8vICAgICAgIH1cbi8vICAgICB9XG4vLyAgICAgaWYgKCh0aGlzIGFzIGFueSkuY29kZSkge1xuLy8gICAgICAgb3V0LnB1c2goYFskeyh0aGlzIGFzIGFueSkuY29kZX1dICR7KHRoaXMgYXMgYW55KS5uYW1lfWApO1xuLy8gICAgIH0gZWxzZSB7XG4vLyAgICAgICBvdXQucHVzaCgodGhpcyBhcyBhbnkpLm5hbWUpO1xuLy8gICAgIH1cbi8vXG4vLyAgICAgcmV0dXJuIG91dC5qb2luKCcgOiAnKTtcbi8vICAgfVxuLy8gfVxuIl19
@@ -26,10 +26,10 @@ export class ChoicePipe {
26
26
  }
27
27
  return `[${fvalue}] ??`;
28
28
  }
29
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.2", ngImport: i0, type: ChoicePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
30
+ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "16.1.2", ngImport: i0, type: ChoicePipe, isStandalone: true, name: "choice" }); }
29
31
  }
30
- ChoicePipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.7", ngImport: i0, type: ChoicePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
31
- ChoicePipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "15.2.7", ngImport: i0, type: ChoicePipe, isStandalone: true, name: "choice" });
32
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.7", ngImport: i0, type: ChoicePipe, decorators: [{
32
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.2", ngImport: i0, type: ChoicePipe, decorators: [{
33
33
  type: Pipe,
34
34
  args: [{
35
35
  name: 'choice',
@@ -66,14 +66,14 @@ export class PChoicePipe {
66
66
  }
67
67
  return `[${fvalue}] ??`;
68
68
  }
69
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.2", ngImport: i0, type: PChoicePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
70
+ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "16.1.2", ngImport: i0, type: PChoicePipe, isStandalone: true, name: "pchoice" }); }
69
71
  }
70
- PChoicePipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.7", ngImport: i0, type: PChoicePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
71
- PChoicePipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "15.2.7", ngImport: i0, type: PChoicePipe, isStandalone: true, name: "pchoice" });
72
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.7", ngImport: i0, type: PChoicePipe, decorators: [{
72
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.2", ngImport: i0, type: PChoicePipe, decorators: [{
73
73
  type: Pipe,
74
74
  args: [{
75
75
  name: 'pchoice',
76
76
  standalone: true,
77
77
  }]
78
78
  }] });
79
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hvaWNlLnBpcGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kYXRhL3NyYy9saWIvZGlzcGVkaXQvY2hvaWNlLnBpcGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLElBQUksRUFBaUIsTUFBTSxlQUFlLENBQUM7O0FBT3BELE1BQU0sT0FBTyxVQUFVO0lBQ3JCLFNBQVMsQ0FDUCxLQUFRLEVBQ1IsS0FBYSxFQUNiLE9BQWlDLE1BQU07UUFFdkMsSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNWLE9BQU8sR0FBRyxDQUFDO1NBQ1o7UUFDRCxNQUFNLE1BQU0sR0FBSSxLQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDckMsSUFBSSxJQUFJLEtBQUssTUFBTSxFQUFFO1lBQ25CLE9BQU8sR0FBRyxNQUFNLEVBQUUsQ0FBQztTQUNwQjtRQUNELE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDaEMsTUFBTSxPQUFPLEdBQUksT0FBZSxDQUFDLE9BQU8sQ0FBQztRQUN6QyxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ1osT0FBTyxHQUFHLE1BQU0sRUFBRSxDQUFDO1NBQ3BCO1FBQ0QsS0FBSyxNQUFNLEVBQUUsSUFBSSxPQUFPLEVBQUU7WUFDeEIsSUFBSSxFQUFFLENBQUMsS0FBSyxLQUFLLE1BQU0sRUFBRTtnQkFDdkIsSUFBSSxJQUFJLEtBQUssTUFBTSxFQUFFO29CQUNuQixPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUM7aUJBQ2hCO3FCQUFNO29CQUNMLE9BQU8sSUFBSSxNQUFNLEtBQUssRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO2lCQUNqQzthQUNGO1NBQ0Y7UUFDRCxPQUFPLElBQUksTUFBTSxNQUFNLENBQUM7SUFDMUIsQ0FBQzs7dUdBNUJVLFVBQVU7cUdBQVYsVUFBVTsyRkFBVixVQUFVO2tCQUp0QixJQUFJO21CQUFDO29CQUNKLElBQUksRUFBRSxRQUFRO29CQUNkLFVBQVUsRUFBRSxJQUFJO2lCQUNqQjs7QUFvQ0QsTUFBTSxPQUFPLFdBQVc7SUFDdEIsU0FBUyxDQUNQLEtBQVUsRUFDVixLQUFRLEVBQ1IsS0FBYSxFQUNiLE9BQWlDLE1BQU07UUFFdkMsSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNWLE9BQU8sR0FBRyxDQUFDO1NBQ1o7UUFDRCxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ1YsT0FBTyxHQUFHLENBQUM7U0FDWjtRQUNELHVDQUF1QztRQUN2QyxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsQ0FBQywwQkFBMEI7UUFDaEQsSUFBSSxJQUFJLEtBQUssTUFBTSxFQUFFO1lBQ25CLE9BQU8sR0FBRyxNQUFNLEVBQUUsQ0FBQztTQUNwQjtRQUNELE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDaEMsTUFBTSxPQUFPLEdBQUksT0FBZSxDQUFDLE9BQU8sQ0FBQztRQUN6QyxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ1osT0FBTyxHQUFHLE1BQU0sRUFBRSxDQUFDO1NBQ3BCO1FBQ0QsS0FBSyxNQUFNLEVBQUUsSUFBSSxPQUFPLEVBQUU7WUFDeEIsSUFBSSxFQUFFLENBQUMsS0FBSyxLQUFLLE1BQU0sRUFBRTtnQkFDdkIsSUFBSSxJQUFJLEtBQUssTUFBTSxFQUFFO29CQUNuQixPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUM7aUJBQ2hCO3FCQUFNO29CQUNMLE9BQU8sSUFBSSxNQUFNLEtBQUssRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO2lCQUNqQzthQUNGO1NBQ0Y7UUFDRCxPQUFPLElBQUksTUFBTSxNQUFNLENBQUM7SUFDMUIsQ0FBQzs7d0dBakNVLFdBQVc7c0dBQVgsV0FBVzsyRkFBWCxXQUFXO2tCQUp2QixJQUFJO21CQUFDO29CQUNKLElBQUksRUFBRSxTQUFTO29CQUNmLFVBQVUsRUFBRSxJQUFJO2lCQUNqQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBpcGUsIFBpcGVUcmFuc2Zvcm0gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERhdGFNb2RlbCB9IGZyb20gJy4uL2RhdGEvZGF0YS1tb2RlbCc7XG5cbkBQaXBlKHtcbiAgbmFtZTogJ2Nob2ljZScsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG59KVxuZXhwb3J0IGNsYXNzIENob2ljZVBpcGU8VCBleHRlbmRzIERhdGFNb2RlbD4gaW1wbGVtZW50cyBQaXBlVHJhbnNmb3JtIHtcbiAgdHJhbnNmb3JtKFxuICAgIHZhbHVlOiBULFxuICAgIGZpZWxkOiBzdHJpbmcsXG4gICAgbW9kZTogJ2NvZGUnIHwgJ2Rlc2MnIHwgJ2JvdGgnID0gJ2Rlc2MnXG4gICk6IHN0cmluZyB7XG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgcmV0dXJuICctJztcbiAgICB9XG4gICAgY29uc3QgZnZhbHVlID0gKHZhbHVlIGFzIGFueSlbZmllbGRdO1xuICAgIGlmIChtb2RlID09PSAnY29kZScpIHtcbiAgICAgIHJldHVybiBgJHtmdmFsdWV9YDtcbiAgICB9XG4gICAgY29uc3QgbWFuYWdlciA9IHZhbHVlLkZNKGZpZWxkKTtcbiAgICBjb25zdCBjaG9pY2VzID0gKG1hbmFnZXIgYXMgYW55KS5jaG9pY2VzO1xuICAgIGlmICghY2hvaWNlcykge1xuICAgICAgcmV0dXJuIGAke2Z2YWx1ZX1gO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGNoIG9mIGNob2ljZXMpIHtcbiAgICAgIGlmIChjaC52YWx1ZSA9PT0gZnZhbHVlKSB7XG4gICAgICAgIGlmIChtb2RlID09PSAnZGVzYycpIHtcbiAgICAgICAgICByZXR1cm4gY2guZGVzYztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gYFske2Z2YWx1ZX1dICR7Y2guZGVzY31gO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBgWyR7ZnZhbHVlfV0gPz9gO1xuICB9XG59XG5cbkBQaXBlKHtcbiAgbmFtZTogJ3BjaG9pY2UnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxufSlcbmV4cG9ydCBjbGFzcyBQQ2hvaWNlUGlwZTxUIGV4dGVuZHMgRGF0YU1vZGVsPiBpbXBsZW1lbnRzIFBpcGVUcmFuc2Zvcm0ge1xuICB0cmFuc2Zvcm0oXG4gICAgdmFsdWU6IGFueSxcbiAgICBtb2RlbDogVCxcbiAgICBmaWVsZDogc3RyaW5nLFxuICAgIG1vZGU6ICdjb2RlJyB8ICdkZXNjJyB8ICdib3RoJyA9ICdkZXNjJ1xuICApOiBzdHJpbmcge1xuICAgIGlmICghbW9kZWwpIHtcbiAgICAgIHJldHVybiAnLSc7XG4gICAgfVxuICAgIGlmICghdmFsdWUpIHtcbiAgICAgIHJldHVybiAnLSc7XG4gICAgfVxuICAgIC8vIFVzZSB2YWx1ZSBmcm9tIGlucHV0LCBub3QgZnJvbSBmaWVsZFxuICAgIGNvbnN0IGZ2YWx1ZSA9IHZhbHVlOyAvLy0gKG1vZGVsIGFzIGFueSlbZmllbGRdO1xuICAgIGlmIChtb2RlID09PSAnY29kZScpIHtcbiAgICAgIHJldHVybiBgJHtmdmFsdWV9YDtcbiAgICB9XG4gICAgY29uc3QgbWFuYWdlciA9IG1vZGVsLkZNKGZpZWxkKTtcbiAgICBjb25zdCBjaG9pY2VzID0gKG1hbmFnZXIgYXMgYW55KS5jaG9pY2VzO1xuICAgIGlmICghY2hvaWNlcykge1xuICAgICAgcmV0dXJuIGAke2Z2YWx1ZX1gO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGNoIG9mIGNob2ljZXMpIHtcbiAgICAgIGlmIChjaC52YWx1ZSA9PT0gZnZhbHVlKSB7XG4gICAgICAgIGlmIChtb2RlID09PSAnZGVzYycpIHtcbiAgICAgICAgICByZXR1cm4gY2guZGVzYztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gYFske2Z2YWx1ZX1dICR7Y2guZGVzY31gO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBgWyR7ZnZhbHVlfV0gPz9gO1xuICB9XG59XG4iXX0=
79
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hvaWNlLnBpcGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kYXRhL3NyYy9saWIvZGlzcGVkaXQvY2hvaWNlLnBpcGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLElBQUksRUFBaUIsTUFBTSxlQUFlLENBQUM7O0FBT3BELE1BQU0sT0FBTyxVQUFVO0lBQ3JCLFNBQVMsQ0FDUCxLQUFRLEVBQ1IsS0FBYSxFQUNiLE9BQWlDLE1BQU07UUFFdkMsSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNWLE9BQU8sR0FBRyxDQUFDO1NBQ1o7UUFDRCxNQUFNLE1BQU0sR0FBSSxLQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDckMsSUFBSSxJQUFJLEtBQUssTUFBTSxFQUFFO1lBQ25CLE9BQU8sR0FBRyxNQUFNLEVBQUUsQ0FBQztTQUNwQjtRQUNELE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDaEMsTUFBTSxPQUFPLEdBQUksT0FBZSxDQUFDLE9BQU8sQ0FBQztRQUN6QyxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ1osT0FBTyxHQUFHLE1BQU0sRUFBRSxDQUFDO1NBQ3BCO1FBQ0QsS0FBSyxNQUFNLEVBQUUsSUFBSSxPQUFPLEVBQUU7WUFDeEIsSUFBSSxFQUFFLENBQUMsS0FBSyxLQUFLLE1BQU0sRUFBRTtnQkFDdkIsSUFBSSxJQUFJLEtBQUssTUFBTSxFQUFFO29CQUNuQixPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUM7aUJBQ2hCO3FCQUFNO29CQUNMLE9BQU8sSUFBSSxNQUFNLEtBQUssRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO2lCQUNqQzthQUNGO1NBQ0Y7UUFDRCxPQUFPLElBQUksTUFBTSxNQUFNLENBQUM7SUFDMUIsQ0FBQzs4R0E1QlUsVUFBVTs0R0FBVixVQUFVOzsyRkFBVixVQUFVO2tCQUp0QixJQUFJO21CQUFDO29CQUNKLElBQUksRUFBRSxRQUFRO29CQUNkLFVBQVUsRUFBRSxJQUFJO2lCQUNqQjs7QUFvQ0QsTUFBTSxPQUFPLFdBQVc7SUFDdEIsU0FBUyxDQUNQLEtBQVUsRUFDVixLQUFRLEVBQ1IsS0FBYSxFQUNiLE9BQWlDLE1BQU07UUFFdkMsSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNWLE9BQU8sR0FBRyxDQUFDO1NBQ1o7UUFDRCxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ1YsT0FBTyxHQUFHLENBQUM7U0FDWjtRQUNELHVDQUF1QztRQUN2QyxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsQ0FBQywwQkFBMEI7UUFDaEQsSUFBSSxJQUFJLEtBQUssTUFBTSxFQUFFO1lBQ25CLE9BQU8sR0FBRyxNQUFNLEVBQUUsQ0FBQztTQUNwQjtRQUNELE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDaEMsTUFBTSxPQUFPLEdBQUksT0FBZSxDQUFDLE9BQU8sQ0FBQztRQUN6QyxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ1osT0FBTyxHQUFHLE1BQU0sRUFBRSxDQUFDO1NBQ3BCO1FBQ0QsS0FBSyxNQUFNLEVBQUUsSUFBSSxPQUFPLEVBQUU7WUFDeEIsSUFBSSxFQUFFLENBQUMsS0FBSyxLQUFLLE1BQU0sRUFBRTtnQkFDdkIsSUFBSSxJQUFJLEtBQUssTUFBTSxFQUFFO29CQUNuQixPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUM7aUJBQ2hCO3FCQUFNO29CQUNMLE9BQU8sSUFBSSxNQUFNLEtBQUssRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO2lCQUNqQzthQUNGO1NBQ0Y7UUFDRCxPQUFPLElBQUksTUFBTSxNQUFNLENBQUM7SUFDMUIsQ0FBQzs4R0FqQ1UsV0FBVzs0R0FBWCxXQUFXOzsyRkFBWCxXQUFXO2tCQUp2QixJQUFJO21CQUFDO29CQUNKLElBQUksRUFBRSxTQUFTO29CQUNmLFVBQVUsRUFBRSxJQUFJO2lCQUNqQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBpcGUsIFBpcGVUcmFuc2Zvcm0gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERhdGFNb2RlbCB9IGZyb20gJy4uL2RhdGEvZGF0YS1tb2RlbCc7XG5cbkBQaXBlKHtcbiAgbmFtZTogJ2Nob2ljZScsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG59KVxuZXhwb3J0IGNsYXNzIENob2ljZVBpcGU8VCBleHRlbmRzIERhdGFNb2RlbD4gaW1wbGVtZW50cyBQaXBlVHJhbnNmb3JtIHtcbiAgdHJhbnNmb3JtKFxuICAgIHZhbHVlOiBULFxuICAgIGZpZWxkOiBzdHJpbmcsXG4gICAgbW9kZTogJ2NvZGUnIHwgJ2Rlc2MnIHwgJ2JvdGgnID0gJ2Rlc2MnXG4gICk6IHN0cmluZyB7XG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgcmV0dXJuICctJztcbiAgICB9XG4gICAgY29uc3QgZnZhbHVlID0gKHZhbHVlIGFzIGFueSlbZmllbGRdO1xuICAgIGlmIChtb2RlID09PSAnY29kZScpIHtcbiAgICAgIHJldHVybiBgJHtmdmFsdWV9YDtcbiAgICB9XG4gICAgY29uc3QgbWFuYWdlciA9IHZhbHVlLkZNKGZpZWxkKTtcbiAgICBjb25zdCBjaG9pY2VzID0gKG1hbmFnZXIgYXMgYW55KS5jaG9pY2VzO1xuICAgIGlmICghY2hvaWNlcykge1xuICAgICAgcmV0dXJuIGAke2Z2YWx1ZX1gO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGNoIG9mIGNob2ljZXMpIHtcbiAgICAgIGlmIChjaC52YWx1ZSA9PT0gZnZhbHVlKSB7XG4gICAgICAgIGlmIChtb2RlID09PSAnZGVzYycpIHtcbiAgICAgICAgICByZXR1cm4gY2guZGVzYztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gYFske2Z2YWx1ZX1dICR7Y2guZGVzY31gO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBgWyR7ZnZhbHVlfV0gPz9gO1xuICB9XG59XG5cbkBQaXBlKHtcbiAgbmFtZTogJ3BjaG9pY2UnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxufSlcbmV4cG9ydCBjbGFzcyBQQ2hvaWNlUGlwZTxUIGV4dGVuZHMgRGF0YU1vZGVsPiBpbXBsZW1lbnRzIFBpcGVUcmFuc2Zvcm0ge1xuICB0cmFuc2Zvcm0oXG4gICAgdmFsdWU6IGFueSxcbiAgICBtb2RlbDogVCxcbiAgICBmaWVsZDogc3RyaW5nLFxuICAgIG1vZGU6ICdjb2RlJyB8ICdkZXNjJyB8ICdib3RoJyA9ICdkZXNjJ1xuICApOiBzdHJpbmcge1xuICAgIGlmICghbW9kZWwpIHtcbiAgICAgIHJldHVybiAnLSc7XG4gICAgfVxuICAgIGlmICghdmFsdWUpIHtcbiAgICAgIHJldHVybiAnLSc7XG4gICAgfVxuICAgIC8vIFVzZSB2YWx1ZSBmcm9tIGlucHV0LCBub3QgZnJvbSBmaWVsZFxuICAgIGNvbnN0IGZ2YWx1ZSA9IHZhbHVlOyAvLy0gKG1vZGVsIGFzIGFueSlbZmllbGRdO1xuICAgIGlmIChtb2RlID09PSAnY29kZScpIHtcbiAgICAgIHJldHVybiBgJHtmdmFsdWV9YDtcbiAgICB9XG4gICAgY29uc3QgbWFuYWdlciA9IG1vZGVsLkZNKGZpZWxkKTtcbiAgICBjb25zdCBjaG9pY2VzID0gKG1hbmFnZXIgYXMgYW55KS5jaG9pY2VzO1xuICAgIGlmICghY2hvaWNlcykge1xuICAgICAgcmV0dXJuIGAke2Z2YWx1ZX1gO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGNoIG9mIGNob2ljZXMpIHtcbiAgICAgIGlmIChjaC52YWx1ZSA9PT0gZnZhbHVlKSB7XG4gICAgICAgIGlmIChtb2RlID09PSAnZGVzYycpIHtcbiAgICAgICAgICByZXR1cm4gY2guZGVzYztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gYFske2Z2YWx1ZX1dICR7Y2guZGVzY31gO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBgWyR7ZnZhbHVlfV0gPz9gO1xuICB9XG59XG4iXX0=