@cubejs-client/ngx 0.28.51 → 0.30.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,149 +1,66 @@
1
- /**
2
- * @fileoverview added by tsickle
3
- * Generated from: src/query-builder/query-members.ts
4
- * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
5
- */
6
1
  import { moveItemInArray, } from '@cubejs-client/core';
7
2
  import { BehaviorSubject } from 'rxjs';
8
3
  import equal from 'fast-deep-equal';
9
4
  export class BaseMember {
10
- /**
11
- * @param {?} query
12
- * @param {?} field
13
- */
14
5
  constructor(query, field) {
15
6
  this.query = query;
16
7
  this.field = field;
17
8
  }
18
- /**
19
- * @private
20
- * @return {?}
21
- */
22
9
  get members() {
23
10
  return this.query.asCubeQuery()[this.field] || [];
24
11
  }
25
- /**
26
- * @param {?} name
27
- * @return {?}
28
- */
29
12
  add(name) {
30
13
  this.query.setPartialQuery({
31
14
  [this.field]: [...this.members, name],
32
15
  });
33
16
  }
34
- /**
35
- * @param {?} name
36
- * @param {?} replaceWithName
37
- * @return {?}
38
- */
39
17
  replace(name, replaceWithName) {
40
18
  this.query.setPartialQuery({
41
- [this.field]: this.members.map((/**
42
- * @param {?} currentName
43
- * @return {?}
44
- */
45
- (currentName) => currentName === name ? replaceWithName : currentName)),
19
+ [this.field]: this.members.map((currentName) => currentName === name ? replaceWithName : currentName),
46
20
  });
47
21
  }
48
- /**
49
- * @param {?} by
50
- * @return {?}
51
- */
52
22
  remove(by) {
53
23
  this.query.setPartialQuery({
54
24
  [this.field]: this.query
55
- .asCubeQuery()[this.field].filter((/**
56
- * @param {?} currentName
57
- * @param {?} index
58
- * @return {?}
59
- */
60
- (currentName, index) => {
25
+ .asCubeQuery()[this.field].filter((currentName, index) => {
61
26
  if (typeof by === 'string') {
62
27
  return currentName !== by;
63
28
  }
64
29
  return index !== by;
65
- })),
30
+ }),
66
31
  });
67
32
  }
68
- /**
69
- * @param {?} members
70
- * @return {?}
71
- */
72
33
  set(members) {
73
34
  this.query.setPartialQuery({
74
35
  [this.field]: members,
75
36
  });
76
37
  }
77
- /**
78
- * @return {?}
79
- */
80
38
  asArray() {
81
- return (this.query.asCubeQuery()[this.field] || []).map((/**
82
- * @param {?} name
83
- * @return {?}
84
- */
85
- (name) => this.query.meta.resolveMember(name, this.field)));
39
+ return (this.query.asCubeQuery()[this.field] || []).map((name) => this.query.meta.resolveMember(name, this.field));
86
40
  }
87
41
  }
88
- if (false) {
89
- /**
90
- * @type {?}
91
- * @private
92
- */
93
- BaseMember.prototype.query;
94
- /**
95
- * @type {?}
96
- * @private
97
- */
98
- BaseMember.prototype.field;
99
- }
100
42
  export class TimeDimensionMember {
101
- /**
102
- * @param {?} query
103
- */
104
43
  constructor(query) {
105
44
  this.query = query;
106
45
  }
107
- /**
108
- * @private
109
- * @return {?}
110
- */
111
46
  get members() {
112
47
  return this.query.asCubeQuery().timeDimensions || [];
113
48
  }
114
- /**
115
- * @return {?}
116
- */
117
49
  get granularity() {
118
50
  var _a;
119
51
  return (_a = this.members[0]) === null || _a === void 0 ? void 0 : _a.granularity;
120
52
  }
121
- /**
122
- * @param {?} by
123
- * @param {?} updateWith
124
- * @return {?}
125
- */
126
53
  updateTimeDimension(by, updateWith) {
127
- /** @type {?} */
128
- const timeDimensions = this.members.map((/**
129
- * @param {?} td
130
- * @param {?} index
131
- * @return {?}
132
- */
133
- (td, index) => {
54
+ const timeDimensions = this.members.map((td, index) => {
134
55
  if (td.dimension === by || index === by) {
135
56
  return Object.assign(Object.assign({}, td), updateWith);
136
57
  }
137
58
  return td;
138
- }));
59
+ });
139
60
  this.query.setPartialQuery({
140
61
  timeDimensions,
141
62
  });
142
63
  }
143
- /**
144
- * @param {?} name
145
- * @return {?}
146
- */
147
64
  add(name) {
148
65
  this.query.setPartialQuery({
149
66
  timeDimensions: [
@@ -153,301 +70,138 @@ export class TimeDimensionMember {
153
70
  ],
154
71
  });
155
72
  }
156
- /**
157
- * @param {?} name
158
- * @return {?}
159
- */
160
73
  remove(name) {
161
74
  this.query.setPartialQuery({
162
- timeDimensions: this.members.filter((/**
163
- * @param {?} __0
164
- * @return {?}
165
- */
166
- ({ dimension }) => dimension !== name)),
75
+ timeDimensions: this.members.filter(({ dimension }) => dimension !== name),
167
76
  });
168
77
  }
169
- /**
170
- * @param {?} timeDimensions
171
- * @return {?}
172
- */
173
78
  set(timeDimensions) {
174
79
  this.query.setPartialQuery({
175
80
  timeDimensions,
176
81
  });
177
82
  }
178
- /**
179
- * @param {?} by
180
- * @param {?} dateRange
181
- * @return {?}
182
- */
183
83
  setDateRange(by, dateRange) {
184
84
  this.updateTimeDimension(by, { dateRange });
185
85
  }
186
- /**
187
- * @param {?} by
188
- * @param {?} granularity
189
- * @return {?}
190
- */
191
86
  setGranularity(by, granularity) {
192
87
  this.updateTimeDimension(by, { granularity });
193
88
  }
194
- /**
195
- * @return {?}
196
- */
197
89
  asArray() {
198
- return (this.query.asCubeQuery().timeDimensions || []).map((/**
199
- * @param {?} td
200
- * @return {?}
201
- */
202
- (td) => {
90
+ return (this.query.asCubeQuery().timeDimensions || []).map((td) => {
203
91
  return Object.assign(Object.assign({}, this.query.meta.resolveMember(td.dimension, 'dimensions')), td);
204
- }));
92
+ });
205
93
  }
206
94
  }
207
- if (false) {
208
- /**
209
- * @type {?}
210
- * @private
211
- */
212
- TimeDimensionMember.prototype.query;
213
- }
214
95
  export class Order {
215
- /**
216
- * @param {?} query
217
- */
218
96
  constructor(query) {
219
97
  this.query = query;
220
98
  this.orderMembers = new BehaviorSubject([]);
221
99
  this.query.subject.subscribe(this.handleQueryChange.bind(this));
222
100
  this.orderMembers.subscribe(this.handleOrderMembersChange.bind(this));
223
101
  }
224
- /**
225
- * @private
226
- * @param {?} orderMembers
227
- * @return {?}
228
- */
229
102
  handleOrderMembersChange(orderMembers) {
230
- /** @type {?} */
231
- const order = (/** @type {?} */ (orderMembers
232
- .filter((/**
233
- * @param {?} __0
234
- * @return {?}
235
- */
236
- ({ order }) => order !== 'none'))
237
- .reduce((/**
238
- * @param {?} memo
239
- * @param {?} __1
240
- * @return {?}
241
- */
242
- (memo, { id, order }) => (Object.assign(Object.assign({}, memo), { [id]: order }))), {})));
103
+ const order = orderMembers
104
+ .filter(({ order }) => order !== 'none')
105
+ .reduce((memo, { id, order }) => (Object.assign(Object.assign({}, memo), { [id]: order })), {});
243
106
  if (!equal(order, this.asObject())) {
244
107
  this.query.setPartialQuery({ order });
245
108
  }
246
109
  }
247
- /**
248
- * @private
249
- * @return {?}
250
- */
251
110
  handleQueryChange() {
252
111
  this.orderMembers.next([
253
112
  ...this.query.measures.asArray(),
254
113
  ...this.query.dimensions.asArray(),
255
114
  ...this.query.timeDimensions.asArray(),
256
- ].map((/**
257
- * @param {?} __0
258
- * @return {?}
259
- */
260
- ({ name, title }) => {
115
+ ].map(({ name, title }) => {
261
116
  return {
262
117
  id: name,
263
118
  order: this.of(name),
264
119
  title,
265
120
  };
266
- })));
121
+ }));
267
122
  }
268
- /**
269
- * @param {?} id
270
- * @param {?} order
271
- * @return {?}
272
- */
273
123
  setMemberOrder(id, order) {
274
- this.orderMembers.next(this.orderMembers.getValue().map((/**
275
- * @param {?} orderMember
276
- * @return {?}
277
- */
278
- (orderMember) => {
124
+ this.orderMembers.next(this.orderMembers.getValue().map((orderMember) => {
279
125
  if (orderMember.id === id) {
280
126
  return Object.assign(Object.assign({}, orderMember), { order });
281
127
  }
282
128
  return orderMember;
283
- })));
129
+ }));
284
130
  }
285
- /**
286
- * @param {?} sourceIndex
287
- * @param {?} destinationIndex
288
- * @return {?}
289
- */
290
131
  reorder(sourceIndex, destinationIndex) {
291
132
  this.orderMembers.next(moveItemInArray(this.orderMembers.getValue(), sourceIndex, destinationIndex));
292
133
  }
293
- /**
294
- * @param {?} member
295
- * @return {?}
296
- */
297
134
  of(member) {
298
135
  return (this.query.asCubeQuery().order || {})[member] || 'none';
299
136
  }
300
- /**
301
- * @param {?} order
302
- * @return {?}
303
- */
304
137
  set(order) {
305
138
  this.query.setPartialQuery({ order });
306
139
  }
307
- /**
308
- * @return {?}
309
- */
310
140
  asArray() {
311
141
  if (Array.isArray(this.query.asCubeQuery().order)) {
312
- return (/** @type {?} */ (this.query.asCubeQuery().order));
142
+ return this.query.asCubeQuery().order;
313
143
  }
314
144
  return Object.entries(this.query.asCubeQuery().order || {});
315
145
  }
316
- /**
317
- * @return {?}
318
- */
319
146
  asObject() {
320
- return this.asArray().reduce((/**
321
- * @param {?} memo
322
- * @param {?} __1
323
- * @return {?}
324
- */
325
- (memo, [key, value]) => (Object.assign(Object.assign({}, memo), { [key]: value }))), {});
147
+ return this.asArray().reduce((memo, [key, value]) => (Object.assign(Object.assign({}, memo), { [key]: value })), {});
326
148
  }
327
149
  }
328
- if (false) {
329
- /** @type {?} */
330
- Order.prototype.orderMembers;
331
- /**
332
- * @type {?}
333
- * @private
334
- */
335
- Order.prototype.query;
336
- }
337
150
  export class FilterMember {
338
- /**
339
- * @param {?} query
340
- */
341
151
  constructor(query) {
342
152
  this.query = query;
343
153
  }
344
- /**
345
- * @private
346
- * @return {?}
347
- */
348
154
  get filters() {
349
155
  // TODO: update this type assertion once the QueryBuilder supports logical and/or
350
- return (/** @type {?} */ ((this.query.asCubeQuery().filters || [])));
156
+ return (this.query.asCubeQuery().filters || []);
351
157
  }
352
- /**
353
- * @param {?} by
354
- * @param {?} updateWith
355
- * @return {?}
356
- */
357
158
  update(by, updateWith) {
358
- /** @type {?} */
359
- const filters = this.filters.map((/**
360
- * @param {?} filter
361
- * @param {?} index
362
- * @return {?}
363
- */
364
- (filter, index) => {
159
+ const filters = this.filters.map((filter, index) => {
365
160
  if (index === by || filter.member === by || filter.dimension === by) {
366
161
  return Object.assign(Object.assign({}, filter), updateWith);
367
162
  }
368
163
  return filter;
369
- }));
164
+ });
370
165
  this.query.setPartialQuery({
371
- filters: (/** @type {?} */ (filters)),
166
+ filters: filters,
372
167
  });
373
168
  }
374
- /**
375
- * @param {?} filter
376
- * @return {?}
377
- */
378
169
  add(filter) {
379
170
  this.query.setPartialQuery({
380
171
  filters: [...this.filters, filter],
381
172
  });
382
173
  }
383
- /**
384
- * @param {?} by
385
- * @return {?}
386
- */
387
174
  remove(by) {
388
175
  this.query.setPartialQuery({
389
- filters: this.filters.filter((/**
390
- * @param {?} filter
391
- * @param {?} index
392
- * @return {?}
393
- */
394
- (filter, index) => {
176
+ filters: this.filters.filter((filter, index) => {
395
177
  if (filter.member === by || filter.dimension === by || index === by) {
396
178
  return false;
397
179
  }
398
180
  return true;
399
- })),
181
+ }),
400
182
  });
401
183
  }
402
- /**
403
- * @param {?} filters
404
- * @return {?}
405
- */
406
184
  set(filters) {
407
185
  this.query.setPartialQuery({
408
186
  filters,
409
187
  });
410
188
  }
411
- /**
412
- * @param {?} name
413
- * @param {?} replaceWithName
414
- * @return {?}
415
- */
416
189
  replace(name, replaceWithName) {
417
190
  this.query.setPartialQuery({
418
- filters: this.filters.map((/**
419
- * @param {?} filter
420
- * @return {?}
421
- */
422
- (filter) => {
423
- /** @type {?} */
191
+ filters: this.filters.map((filter) => {
424
192
  const field = filter.member ? 'member' : 'dimension';
425
193
  return filter.member === name || filter.dimension === name
426
194
  ? Object.assign(Object.assign({}, filter), { [field]: replaceWithName }) : filter;
427
- })),
195
+ }),
428
196
  });
429
197
  }
430
- /**
431
- * @return {?}
432
- */
433
198
  asArray() {
434
- return this.filters.map((/**
435
- * @param {?} filter
436
- * @return {?}
437
- */
438
- (filter) => {
199
+ return this.filters.map((filter) => {
439
200
  return Object.assign(Object.assign(Object.assign({}, this.query.meta.resolveMember(filter.member || filter.dimension, [
440
201
  'dimensions',
441
202
  'measures',
442
203
  ])), { operators: this.query.meta.filterOperatorsForMember(filter.member || filter.dimension, ['dimensions', 'measures']) }), filter);
443
- }));
204
+ });
444
205
  }
445
206
  }
446
- if (false) {
447
- /**
448
- * @type {?}
449
- * @private
450
- */
451
- FilterMember.prototype.query;
452
- }
453
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnktbWVtYmVycy5qcyIsInNvdXJjZVJvb3QiOiIvaG9tZS9ydW5uZXIvd29yay9jdWJlLmpzL2N1YmUuanMvcGFja2FnZXMvY3ViZWpzLWNsaWVudC1uZ3gvIiwic291cmNlcyI6WyJzcmMvcXVlcnktYnVpbGRlci9xdWVyeS1tZW1iZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUlMLGVBQWUsR0FJaEIsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3ZDLE9BQU8sS0FBSyxNQUFNLGlCQUFpQixDQUFDO0FBWXBDLE1BQU0sT0FBTyxVQUFVOzs7OztJQUNyQixZQUNVLEtBQVksRUFDWixLQUE2QztRQUQ3QyxVQUFLLEdBQUwsS0FBSyxDQUFPO1FBQ1osVUFBSyxHQUFMLEtBQUssQ0FBd0M7SUFDcEQsQ0FBQzs7Ozs7SUFFSixJQUFZLE9BQU87UUFDakIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDcEQsQ0FBQzs7Ozs7SUFFRCxHQUFHLENBQUMsSUFBWTtRQUNkLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDO1lBQ3pCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQztTQUN0QyxDQUFDLENBQUM7SUFDTCxDQUFDOzs7Ozs7SUFFRCxPQUFPLENBQUMsSUFBWSxFQUFFLGVBQXVCO1FBQzNDLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDO1lBQ3pCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRzs7OztZQUFDLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FDN0MsV0FBVyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsZUFBZSxD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QUFNLElBQUksTUFBTSxDQUFDLFNBQVMsRUFBRTtnQkFDbEUsWUFBWTtnQkFDWixVQUFVO2FBQ1gsQ0FBQyxLQUNGLFNBQVMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FDakQsTUFBTSxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsU0FBUyxFQUNqQyxDQUFDLFlBQVksRUFBRSxVQUFVLENBQUMsQ0FDM0IsS0FDRSxNQUFNLEVBQ1Q7UUFDSixDQUFDLEVBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjs7Ozs7O0lBNUVhLDZCQUFvQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIFRpbWVEaW1lbnNpb25HcmFudWxhcml0eSxcbiAgVFF1ZXJ5T3JkZXJPYmplY3QsXG4gIFRRdWVyeU9yZGVyQXJyYXksXG4gIG1vdmVJdGVtSW5BcnJheSxcbiAgRmlsdGVyLFxuICBVbmFyeUZpbHRlcixcbiAgQmluYXJ5RmlsdGVyLFxufSBmcm9tICdAY3ViZWpzLWNsaWVudC9jb3JlJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IGVxdWFsIGZyb20gJ2Zhc3QtZGVlcC1lcXVhbCc7XG5cbmltcG9ydCB7IFF1ZXJ5IH0gZnJvbSAnLi9xdWVyeSc7XG5cbmV4cG9ydCB0eXBlIFRPcmRlciA9ICdhc2MnIHwgJ2Rlc2MnIHwgJ25vbmUnO1xuXG5leHBvcnQgdHlwZSBUT3JkZXJNZW1iZXIgPSB7XG4gIGlkOiBzdHJpbmc7XG4gIG9yZGVyOiBUT3JkZXI7XG4gIHRpdGxlOiBzdHJpbmc7XG59O1xuXG5leHBvcnQgY2xhc3MgQmFzZU1lbWJlciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcXVlcnk6IFF1ZXJ5LFxuICAgIHByaXZhdGUgZmllbGQ6ICdtZWFzdXJlcycgfCAnZGltZW5zaW9ucycgfCAnc2VnbWVudHMnXG4gICkge31cblxuICBwcml2YXRlIGdldCBtZW1iZXJzKCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXJ5LmFzQ3ViZVF1ZXJ5KClbdGhpcy5maWVsZF0gfHwgW107XG4gIH1cblxuICBhZGQobmFtZTogc3RyaW5nKSB7XG4gICAgdGhpcy5xdWVyeS5zZXRQYXJ0aWFsUXVlcnkoe1xuICAgICAgW3RoaXMuZmllbGRdOiBbLi4udGhpcy5tZW1iZXJzLCBuYW1lXSxcbiAgICB9KTtcbiAgfVxuXG4gIHJlcGxhY2UobmFtZTogc3RyaW5nLCByZXBsYWNlV2l0aE5hbWU6IHN0cmluZykge1xuICAgIHRoaXMucXVlcnkuc2V0UGFydGlhbFF1ZXJ5KHtcbiAgICAgIFt0aGlzLmZpZWxkXTogdGhpcy5tZW1iZXJzLm1hcCgoY3VycmVudE5hbWUpID0+XG4gICAgICAgIGN1cnJlbnROYW1lID09PSBuYW1lID8gcmVwbGFjZVdpdGhOYW1lIDogY3VycmVudE5hbWVcbiAgICAgICksXG4gICAgfSk7XG4gIH1cblxuICByZW1vdmUoYnk6IHN0cmluZyB8IG51bWJlcikge1xuICAgIHRoaXMucXVlcnkuc2V0UGFydGlhbFF1ZXJ5KHtcbiAgICAgIFt0aGlzLmZpZWxkXTogdGhpcy5xdWVyeVxuICAgICAgICAuYXNDdWJlUXVlcnkoKVxuICAgICAgICBbdGhpcy5maWVsZF0uZmlsdGVyKChjdXJyZW50TmFtZSwgaW5kZXgpID0+IHtcbiAgICAgICAgICBpZiAodHlwZW9mIGJ5ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnROYW1lICE9PSBieTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gaW5kZXggIT09IGJ5O1xuICAgICAgICB9KSxcbiAgICB9KTtcbiAgfVxuXG4gIHNldChtZW1iZXJzOiBzdHJpbmdbXSkge1xuICAgIHRoaXMucXVlcnkuc2V0UGFydGlhbFF1ZXJ5KHtcbiAgICAgIFt0aGlzLmZpZWxkXTogbWVtYmVycyxcbiAgICB9KTtcbiAgfVxuXG4gIGFzQXJyYXkoKSB7XG4gICAgcmV0dXJuICh0aGlzLnF1ZXJ5LmFzQ3ViZVF1ZXJ5KClbdGhpcy5maWVsZF0gfHwgW10pLm1hcCgobmFtZSkgPT5cbiAgICAgIHRoaXMucXVlcnkubWV0YS5yZXNvbHZlTWVtYmVyKG5hbWUsIHRoaXMuZmllbGQpXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVGltZURpbWVuc2lvbk1lbWJlciB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcXVlcnk6IFF1ZXJ5KSB7fVxuXG4gIHByaXZhdGUgZ2V0IG1lbWJlcnMoKSB7XG4gICAgcmV0dXJuIHRoaXMucXVlcnkuYXNDdWJlUXVlcnkoKS50aW1lRGltZW5zaW9ucyB8fCBbXTtcbiAgfVxuXG4gIGdldCBncmFudWxhcml0eSgpIHtcbiAgICByZXR1cm4gdGhpcy5tZW1iZXJzWzBdPy5ncmFudWxhcml0eTtcbiAgfVxuXG4gIHVwZGF0ZVRpbWVEaW1lbnNpb24oYnk6IHN0cmluZyB8IG51bWJlciwgdXBkYXRlV2l0aDogYW55KSB7XG4gICAgY29uc3QgdGltZURpbWVuc2lvbnMgPSB0aGlzLm1lbWJlcnMubWFwKCh0ZCwgaW5kZXgpID0+IHtcbiAgICAgIGlmICh0ZC5kaW1lbnNpb24gPT09IGJ5IHx8IGluZGV4ID09PSBieSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLnRkLFxuICAgICAgICAgIC4uLnVwZGF0ZVdpdGgsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gdGQ7XG4gICAgfSk7XG5cbiAgICB0aGlzLnF1ZXJ5LnNldFBhcnRpYWxRdWVyeSh7XG4gICAgICB0aW1lRGltZW5zaW9ucyxcbiAgICB9KTtcbiAgfVxuXG4gIGFkZChuYW1lOiBzdHJpbmcpIHtcbiAgICB0aGlzLnF1ZXJ5LnNldFBhcnRpYWxRdWVyeSh7XG4gICAgICB0aW1lRGltZW5zaW9uczogW1xuICAgICAgICB7XG4gICAgICAgICAgZGltZW5zaW9uOiBuYW1lLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KTtcbiAgfVxuXG4gIHJlbW92ZShuYW1lOiBzdHJpbmcpIHtcbiAgICB0aGlzLnF1ZXJ5LnNldFBhcnRpYWxRdWVyeSh7XG4gICAgICB0aW1lRGltZW5zaW9uczogdGhpcy5tZW1iZXJzLmZpbHRlcihcbiAgICAgICAgKHsgZGltZW5zaW9uIH0pID0+IGRpbWVuc2lvbiAhPT0gbmFtZVxuICAgICAgKSxcbiAgICB9KTtcbiAgfVxuXG4gIHNldCh0aW1lRGltZW5zaW9uczogYW55W10pIHtcbiAgICB0aGlzLnF1ZXJ5LnNldFBhcnRpYWxRdWVyeSh7XG4gICAgICB0aW1lRGltZW5zaW9ucyxcbiAgICB9KTtcbiAgfVxuXG4gIHNldERhdGVSYW5nZShieTogc3RyaW5nIHwgbnVtYmVyLCBkYXRlUmFuZ2U6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgdGhpcy51cGRhdGVUaW1lRGltZW5zaW9uKGJ5LCB7IGRhdGVSYW5nZSB9KTtcbiAgfVxuXG4gIHNldEdyYW51bGFyaXR5KGJ5OiBzdHJpbmcgfCBudW1iZXIsIGdyYW51bGFyaXR5OiBUaW1lRGltZW5zaW9uR3JhbnVsYXJpdHkpIHtcbiAgICB0aGlzLnVwZGF0ZVRpbWVEaW1lbnNpb24oYnksIHsgZ3JhbnVsYXJpdHkgfSk7XG4gIH1cblxuICBhc0FycmF5KCk6IGFueVtdIHtcbiAgICByZXR1cm4gKHRoaXMucXVlcnkuYXNDdWJlUXVlcnkoKS50aW1lRGltZW5zaW9ucyB8fCBbXSkubWFwKCh0ZCkgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4udGhpcy5xdWVyeS5tZXRhLnJlc29sdmVNZW1iZXIodGQuZGltZW5zaW9uLCAnZGltZW5zaW9ucycpLFxuICAgICAgICAuLi50ZCxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE9yZGVyIHtcbiAgb3JkZXJNZW1iZXJzID0gbmV3IEJlaGF2aW9yU3ViamVjdDxUT3JkZXJNZW1iZXJbXT4oW10pO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcXVlcnk6IFF1ZXJ5KSB7XG4gICAgdGhpcy5xdWVyeS5zdWJqZWN0LnN1YnNjcmliZSh0aGlzLmhhbmRsZVF1ZXJ5Q2hhbmdlLmJpbmQodGhpcykpO1xuICAgIHRoaXMub3JkZXJNZW1iZXJzLnN1YnNjcmliZSh0aGlzLmhhbmRsZU9yZGVyTWVtYmVyc0NoYW5nZS5iaW5kKHRoaXMpKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlT3JkZXJNZW1iZXJzQ2hhbmdlKG9yZGVyTWVtYmVyczogVE9yZGVyTWVtYmVyW10pIHtcbiAgICBjb25zdCBvcmRlciA9IG9yZGVyTWVtYmVyc1xuICAgICAgLmZpbHRlcigoeyBvcmRlciB9KSA9PiBvcmRlciAhPT0gJ25vbmUnKVxuICAgICAgLnJlZHVjZShcbiAgICAgICAgKG1lbW8sIHsgaWQsIG9yZGVyIH0pID0+ICh7IC4uLm1lbW8sIFtpZF06IG9yZGVyIH0pLFxuICAgICAgICB7fVxuICAgICAgKSBhcyBUUXVlcnlPcmRlck9iamVjdDtcblxuICAgIGlmICghZXF1YWwob3JkZXIsIHRoaXMuYXNPYmplY3QoKSkpIHtcbiAgICAgIHRoaXMucXVlcnkuc2V0UGFydGlhbFF1ZXJ5KHsgb3JkZXIgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVRdWVyeUNoYW5nZSgpIHtcbiAgICB0aGlzLm9yZGVyTWVtYmVycy5uZXh0KFxuICAgICAgW1xuICAgICAgICAuLi50aGlzLnF1ZXJ5Lm1lYXN1cmVzLmFzQXJyYXkoKSxcbiAgICAgICAgLi4udGhpcy5xdWVyeS5kaW1lbnNpb25zLmFzQXJyYXkoKSxcbiAgICAgICAgLi4udGhpcy5xdWVyeS50aW1lRGltZW5zaW9ucy5hc0FycmF5KCksXG4gICAgICBdLm1hcDxUT3JkZXJNZW1iZXI+KCh7IG5hbWUsIHRpdGxlIH0pID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBpZDogbmFtZSxcbiAgICAgICAgICBvcmRlcjogdGhpcy5vZihuYW1lKSxcbiAgICAgICAgICB0aXRsZSxcbiAgICAgICAgfTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHNldE1lbWJlck9yZGVyKGlkOiBzdHJpbmcsIG9yZGVyOiBUT3JkZXIpIHtcbiAgICB0aGlzLm9yZGVyTWVtYmVycy5uZXh0KFxuICAgICAgdGhpcy5vcmRlck1lbWJlcnMuZ2V0VmFsdWUoKS5tYXAoKG9yZGVyTWVtYmVyKSA9PiB7XG4gICAgICAgIGlmIChvcmRlck1lbWJlci5pZCA9PT0gaWQpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4ub3JkZXJNZW1iZXIsXG4gICAgICAgICAgICBvcmRlcixcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvcmRlck1lbWJlcjtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHJlb3JkZXIoc291cmNlSW5kZXg6IG51bWJlciwgZGVzdGluYXRpb25JbmRleDogbnVtYmVyKSB7XG4gICAgdGhpcy5vcmRlck1lbWJlcnMubmV4dChcbiAgICAgIG1vdmVJdGVtSW5BcnJheShcbiAgICAgICAgdGhpcy5vcmRlck1lbWJlcnMuZ2V0VmFsdWUoKSxcbiAgICAgICAgc291cmNlSW5kZXgsXG4gICAgICAgIGRlc3RpbmF0aW9uSW5kZXhcbiAgICAgIClcbiAgICApO1xuICB9XG5cbiAgb2YobWVtYmVyOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gKHRoaXMucXVlcnkuYXNDdWJlUXVlcnkoKS5vcmRlciB8fCB7fSlbbWVtYmVyXSB8fCAnbm9uZSc7XG4gIH1cblxuICBzZXQob3JkZXI6IFRRdWVyeU9yZGVyT2JqZWN0IHwgVFF1ZXJ5T3JkZXJBcnJheSkge1xuICAgIHRoaXMucXVlcnkuc2V0UGFydGlhbFF1ZXJ5KHsgb3JkZXIgfSk7XG4gIH1cblxuICBhc0FycmF5KCk6IFRRdWVyeU9yZGVyQXJyYXkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMucXVlcnkuYXNDdWJlUXVlcnkoKS5vcmRlcikpIHtcbiAgICAgIHJldHVybiB0aGlzLnF1ZXJ5LmFzQ3ViZVF1ZXJ5KCkub3JkZXIgYXMgVFF1ZXJ5T3JkZXJBcnJheTtcbiAgICB9XG5cbiAgICByZXR1cm4gT2JqZWN0LmVudHJpZXModGhpcy5xdWVyeS5hc0N1YmVRdWVyeSgpLm9yZGVyIHx8IHt9KTtcbiAgfVxuXG4gIGFzT2JqZWN0KCk6IFRRdWVyeU9yZGVyT2JqZWN0IHtcbiAgICByZXR1cm4gdGhpcy5hc0FycmF5KCkucmVkdWNlKFxuICAgICAgKG1lbW8sIFtrZXksIHZhbHVlXSkgPT4gKHsgLi4ubWVtbywgW2tleV06IHZhbHVlIH0pLFxuICAgICAge31cbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBGaWx0ZXJNZW1iZXIge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHF1ZXJ5OiBRdWVyeSkge31cblxuICBwcml2YXRlIGdldCBmaWx0ZXJzKCkge1xuICAgIC8vIFRPRE86IHVwZGF0ZSB0aGlzIHR5cGUgYXNzZXJ0aW9uIG9uY2UgdGhlIFF1ZXJ5QnVpbGRlciBzdXBwb3J0cyBsb2dpY2FsIGFuZC9vclxuICAgIHJldHVybiAodGhpcy5xdWVyeS5hc0N1YmVRdWVyeSgpLmZpbHRlcnMgfHwgW10pIGFzIChVbmFyeUZpbHRlciB8IEJpbmFyeUZpbHRlcilbXTtcbiAgfVxuXG4gIHVwZGF0ZShieTogc3RyaW5nIHwgbnVtYmVyLCB1cGRhdGVXaXRoOiBQYXJ0aWFsPEZpbHRlcj4pIHtcbiAgICBjb25zdCBmaWx0ZXJzID0gdGhpcy5maWx0ZXJzLm1hcCgoZmlsdGVyLCBpbmRleCkgPT4ge1xuICAgICAgaWYgKGluZGV4ID09PSBieSB8fCBmaWx0ZXIubWVtYmVyID09PSBieSB8fCBmaWx0ZXIuZGltZW5zaW9uID09PSBieSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLmZpbHRlcixcbiAgICAgICAgICAuLi51cGRhdGVXaXRoLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZpbHRlcjtcbiAgICB9KTtcblxuICAgIHRoaXMucXVlcnkuc2V0UGFydGlhbFF1ZXJ5KHtcbiAgICAgIGZpbHRlcnM6IGZpbHRlcnMgYXMgRmlsdGVyW10sXG4gICAgfSk7XG4gIH1cblxuICBhZGQoZmlsdGVyOiBGaWx0ZXIpIHtcbiAgICB0aGlzLnF1ZXJ5LnNldFBhcnRpYWxRdWVyeSh7XG4gICAgICBmaWx0ZXJzOiBbLi4udGhpcy5maWx0ZXJzLCBmaWx0ZXJdLFxuICAgIH0pO1xuICB9XG5cbiAgcmVtb3ZlKGJ5OiBzdHJpbmcgfCBudW1iZXIpIHtcbiAgICB0aGlzLnF1ZXJ5LnNldFBhcnRpYWxRdWVyeSh7XG4gICAgICBmaWx0ZXJzOiB0aGlzLmZpbHRlcnMuZmlsdGVyKChmaWx0ZXIsIGluZGV4KSA9PiB7XG4gICAgICAgIGlmIChmaWx0ZXIubWVtYmVyID09PSBieSB8fCBmaWx0ZXIuZGltZW5zaW9uID09PSBieSB8fCBpbmRleCA9PT0gYnkpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0pLFxuICAgIH0pO1xuICB9XG5cbiAgc2V0KGZpbHRlcnM6IEZpbHRlcltdKSB7XG4gICAgdGhpcy5xdWVyeS5zZXRQYXJ0aWFsUXVlcnkoe1xuICAgICAgZmlsdGVycyxcbiAgICB9KTtcbiAgfVxuXG4gIHJlcGxhY2UobmFtZTogc3RyaW5nLCByZXBsYWNlV2l0aE5hbWU6IHN0cmluZykge1xuICAgIHRoaXMucXVlcnkuc2V0UGFydGlhbFF1ZXJ5KHtcbiAgICAgIGZpbHRlcnM6IHRoaXMuZmlsdGVycy5tYXAoKGZpbHRlcikgPT4ge1xuICAgICAgICBjb25zdCBmaWVsZCA9IGZpbHRlci5tZW1iZXIgPyAnbWVtYmVyJyA6ICdkaW1lbnNpb24nO1xuICAgICAgICByZXR1cm4gZmlsdGVyLm1lbWJlciA9PT0gbmFtZSB8fCBmaWx0ZXIuZGltZW5zaW9uID09PSBuYW1lXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICAgIC4uLmZpbHRlcixcbiAgICAgICAgICAgICAgW2ZpZWxkXTogcmVwbGFjZVdpdGhOYW1lLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIDogZmlsdGVyO1xuICAgICAgfSksXG4gICAgfSk7XG4gIH1cblxuICBhc0FycmF5KCk6IGFueVtdIHtcbiAgICByZXR1cm4gdGhpcy5maWx0ZXJzLm1hcCgoZmlsdGVyKSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi50aGlzLnF1ZXJ5Lm1ldGEucmVzb2x2ZU1lbWJlcihmaWx0ZXIubWVtYmVyIHx8IGZpbHRlci5kaW1lbnNpb24sIFtcbiAgICAgICAgICAnZGltZW5zaW9ucycsXG4gICAgICAgICAgJ21lYXN1cmVzJyxcbiAgICAgICAgXSksXG4gICAgICAgIG9wZXJhdG9yczogdGhpcy5xdWVyeS5tZXRhLmZpbHRlck9wZXJhdG9yc0Zvck1lbWJlcihcbiAgICAgICAgICBmaWx0ZXIubWVtYmVyIHx8IGZpbHRlci5kaW1lbnNpb24sXG4gICAgICAgICAgWydkaW1lbnNpb25zJywgJ21lYXN1cmVzJ11cbiAgICAgICAgKSxcbiAgICAgICAgLi4uZmlsdGVyLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxufVxuIl19
207
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnktbWVtYmVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9xdWVyeS1idWlsZGVyL3F1ZXJ5LW1lbWJlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUlMLGVBQWUsR0FJaEIsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3ZDLE9BQU8sS0FBSyxNQUFNLGlCQUFpQixDQUFDO0FBWXBDLE1BQU0sT0FBTyxVQUFVO0lBQ3JCLFlBQ1UsS0FBWSxFQUNaLEtBQTZDO1FBRDdDLFVBQUssR0FBTCxLQUFLLENBQU87UUFDWixVQUFLLEdBQUwsS0FBSyxDQUF3QztJQUNwRCxDQUFDO0lBRUosSUFBWSxPQUFPO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3BELENBQUM7SUFFRCxHQUFHLENBQUMsSUFBWTtRQUNkLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDO1lBQ3pCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQztTQUN0QyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsT0FBTyxDQUFDLElBQVksRUFBRSxlQUF1QjtRQUMzQyxJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQztZQUN6QixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQzdDLFdBQVcsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUNyRDtTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxNQUFNLENBQUMsRUFBbUI7UUFD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QUFPO1NBQ1IsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELE9BQU8sQ0FBQyxJQUFZLEVBQUUsZUFBdUI7UUFDM0MsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUM7WUFDekIsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7Z0JBQ25DLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDO2dCQUNyRCxPQUFPLE1BQU0sQ0FBQyxNQUFNLEtBQUssSUFBSSxJQUFJLE1BQU0sQ0FBQyxTQUFTLEtBQUssSUFBSTtvQkFDeEQsQ0FBQyxpQ0FDTSxNQUFNLEtBQ1QsQ0FBQyxLQUFLLENBQUMsRUFBRSxlQUFlLElBRTVCLENBQUMsQ0FBQyxNQUFNLENBQUM7WUFDYixDQUFDLENBQUM7U0FDSCxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsT0FBTztRQUNMLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtZQUNqQyxxREFDSyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsU0FBUyxFQUFFO2dCQUNsRSxZQUFZO2dCQUNaLFVBQVU7YUFDWCxDQUFDLEtBQ0YsU0FBUyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUNqRCxNQUFNLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxTQUFTLEVBQ2pDLENBQUMsWUFBWSxFQUFFLFVBQVUsQ0FBQyxDQUMzQixLQUNFLE1BQU0sRUFDVDtRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgVGltZURpbWVuc2lvbkdyYW51bGFyaXR5LFxuICBUUXVlcnlPcmRlck9iamVjdCxcbiAgVFF1ZXJ5T3JkZXJBcnJheSxcbiAgbW92ZUl0ZW1JbkFycmF5LFxuICBGaWx0ZXIsXG4gIFVuYXJ5RmlsdGVyLFxuICBCaW5hcnlGaWx0ZXIsXG59IGZyb20gJ0BjdWJlanMtY2xpZW50L2NvcmUnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgZXF1YWwgZnJvbSAnZmFzdC1kZWVwLWVxdWFsJztcblxuaW1wb3J0IHsgUXVlcnkgfSBmcm9tICcuL3F1ZXJ5JztcblxuZXhwb3J0IHR5cGUgVE9yZGVyID0gJ2FzYycgfCAnZGVzYycgfCAnbm9uZSc7XG5cbmV4cG9ydCB0eXBlIFRPcmRlck1lbWJlciA9IHtcbiAgaWQ6IHN0cmluZztcbiAgb3JkZXI6IFRPcmRlcjtcbiAgdGl0bGU6IHN0cmluZztcbn07XG5cbmV4cG9ydCBjbGFzcyBCYXNlTWVtYmVyIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBxdWVyeTogUXVlcnksXG4gICAgcHJpdmF0ZSBmaWVsZDogJ21lYXN1cmVzJyB8ICdkaW1lbnNpb25zJyB8ICdzZWdtZW50cydcbiAgKSB7fVxuXG4gIHByaXZhdGUgZ2V0IG1lbWJlcnMoKSB7XG4gICAgcmV0dXJuIHRoaXMucXVlcnkuYXNDdWJlUXVlcnkoKVt0aGlzLmZpZWxkXSB8fCBbXTtcbiAgfVxuXG4gIGFkZChuYW1lOiBzdHJpbmcpIHtcbiAgICB0aGlzLnF1ZXJ5LnNldFBhcnRpYWxRdWVyeSh7XG4gICAgICBbdGhpcy5maWVsZF06IFsuLi50aGlzLm1lbWJlcnMsIG5hbWVdLFxuICAgIH0pO1xuICB9XG5cbiAgcmVwbGFjZShuYW1lOiBzdHJpbmcsIHJlcGxhY2VXaXRoTmFtZTogc3RyaW5nKSB7XG4gICAgdGhpcy5xdWVyeS5zZXRQYXJ0aWFsUXVlcnkoe1xuICAgICAgW3RoaXMuZmllbGRdOiB0aGlzLm1lbWJlcnMubWFwKChjdXJyZW50TmFtZSkgPT5cbiAgICAgICAgY3VycmVudE5hbWUgPT09IG5hbWUgPyByZXBsYWNlV2l0aE5hbWUgOiBjdXJyZW50TmFtZVxuICAgICAgKSxcbiAgICB9KTtcbiAgfVxuXG4gIHJlbW92ZShieTogc3RyaW5nIHwgbnVtYmVyKSB7XG4gICAgdGhpcy5xdWVyeS5zZXRQYXJ0aWFsUXVlcnkoe1xuICAgICAgW3RoaXMuZmllbGRdOiB0aGlzLnF1ZXJ5XG4gICAgICAgIC5hc0N1YmVRdWVyeSgpXG4gICAgICAgIFt0aGlzLmZpZWxkXS5maWx0ZXIoKGN1cnJlbnROYW1lLCBpbmRleCkgPT4ge1xuICAgICAgICAgIGlmICh0eXBlb2YgYnkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gY3VycmVudE5hbWUgIT09IGJ5O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBpbmRleCAhPT0gYnk7XG4gICAgICAgIH0pLFxuICAgIH0pO1xuICB9XG5cbiAgc2V0KG1lbWJlcnM6IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5xdWVyeS5zZXRQYXJ0aWFsUXVlcnkoe1xuICAgICAgW3RoaXMuZmllbGRdOiBtZW1iZXJzLFxuICAgIH0pO1xuICB9XG5cbiAgYXNBcnJheSgpIHtcbiAgICByZXR1cm4gKHRoaXMucXVlcnkuYXNDdWJlUXVlcnkoKVt0aGlzLmZpZWxkXSB8fCBbXSkubWFwKChuYW1lKSA9PlxuICAgICAgdGhpcy5xdWVyeS5tZXRhLnJlc29sdmVNZW1iZXIobmFtZSwgdGhpcy5maWVsZClcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBUaW1lRGltZW5zaW9uTWVtYmVyIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBxdWVyeTogUXVlcnkpIHt9XG5cbiAgcHJpdmF0ZSBnZXQgbWVtYmVycygpIHtcbiAgICByZXR1cm4gdGhpcy5xdWVyeS5hc0N1YmVRdWVyeSgpLnRpbWVEaW1lbnNpb25zIHx8IFtdO1xuICB9XG5cbiAgZ2V0IGdyYW51bGFyaXR5KCkge1xuICAgIHJldHVybiB0aGlzLm1lbWJlcnNbMF0/LmdyYW51bGFyaXR5O1xuICB9XG5cbiAgdXBkYXRlVGltZURpbWVuc2lvbihieTogc3RyaW5nIHwgbnVtYmVyLCB1cGRhdGVXaXRoOiBhbnkpIHtcbiAgICBjb25zdCB0aW1lRGltZW5zaW9ucyA9IHRoaXMubWVtYmVycy5tYXAoKHRkLCBpbmRleCkgPT4ge1xuICAgICAgaWYgKHRkLmRpbWVuc2lvbiA9PT0gYnkgfHwgaW5kZXggPT09IGJ5KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4udGQsXG4gICAgICAgICAgLi4udXBkYXRlV2l0aCxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0ZDtcbiAgICB9KTtcblxuICAgIHRoaXMucXVlcnkuc2V0UGFydGlhbFF1ZXJ5KHtcbiAgICAgIHRpbWVEaW1lbnNpb25zLFxuICAgIH0pO1xuICB9XG5cbiAgYWRkKG5hbWU6IHN0cmluZykge1xuICAgIHRoaXMucXVlcnkuc2V0UGFydGlhbFF1ZXJ5KHtcbiAgICAgIHRpbWVEaW1lbnNpb25zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBkaW1lbnNpb246IG5hbWUsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0pO1xuICB9XG5cbiAgcmVtb3ZlKG5hbWU6IHN0cmluZykge1xuICAgIHRoaXMucXVlcnkuc2V0UGFydGlhbFF1ZXJ5KHtcbiAgICAgIHRpbWVEaW1lbnNpb25zOiB0aGlzLm1lbWJlcnMuZmlsdGVyKFxuICAgICAgICAoeyBkaW1lbnNpb24gfSkgPT4gZGltZW5zaW9uICE9PSBuYW1lXG4gICAgICApLFxuICAgIH0pO1xuICB9XG5cbiAgc2V0KHRpbWVEaW1lbnNpb25zOiBhbnlbXSkge1xuICAgIHRoaXMucXVlcnkuc2V0UGFydGlhbFF1ZXJ5KHtcbiAgICAgIHRpbWVEaW1lbnNpb25zLFxuICAgIH0pO1xuICB9XG5cbiAgc2V0RGF0ZVJhbmdlKGJ5OiBzdHJpbmcgfCBudW1iZXIsIGRhdGVSYW5nZTogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICB0aGlzLnVwZGF0ZVRpbWVEaW1lbnNpb24oYnksIHsgZGF0ZVJhbmdlIH0pO1xuICB9XG5cbiAgc2V0R3JhbnVsYXJpdHkoYnk6IHN0cmluZyB8IG51bWJlciwgZ3JhbnVsYXJpdHk6IFRpbWVEaW1lbnNpb25HcmFudWxhcml0eSkge1xuICAgIHRoaXMudXBkYXRlVGltZURpbWVuc2lvbihieSwgeyBncmFudWxhcml0eSB9KTtcbiAgfVxuXG4gIGFzQXJyYXkoKTogYW55W10ge1xuICAgIHJldHVybiAodGhpcy5xdWVyeS5hc0N1YmVRdWVyeSgpLnRpbWVEaW1lbnNpb25zIHx8IFtdKS5tYXAoKHRkKSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi50aGlzLnF1ZXJ5Lm1ldGEucmVzb2x2ZU1lbWJlcih0ZC5kaW1lbnNpb24sICdkaW1lbnNpb25zJyksXG4gICAgICAgIC4uLnRkLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgT3JkZXIge1xuICBvcmRlck1lbWJlcnMgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFRPcmRlck1lbWJlcltdPihbXSk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBxdWVyeTogUXVlcnkpIHtcbiAgICB0aGlzLnF1ZXJ5LnN1YmplY3Quc3Vic2NyaWJlKHRoaXMuaGFuZGxlUXVlcnlDaGFuZ2UuYmluZCh0aGlzKSk7XG4gICAgdGhpcy5vcmRlck1lbWJlcnMuc3Vic2NyaWJlKHRoaXMuaGFuZGxlT3JkZXJNZW1iZXJzQ2hhbmdlLmJpbmQodGhpcykpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVPcmRlck1lbWJlcnNDaGFuZ2Uob3JkZXJNZW1iZXJzOiBUT3JkZXJNZW1iZXJbXSkge1xuICAgIGNvbnN0IG9yZGVyID0gb3JkZXJNZW1iZXJzXG4gICAgICAuZmlsdGVyKCh7IG9yZGVyIH0pID0+IG9yZGVyICE9PSAnbm9uZScpXG4gICAgICAucmVkdWNlKFxuICAgICAgICAobWVtbywgeyBpZCwgb3JkZXIgfSkgPT4gKHsgLi4ubWVtbywgW2lkXTogb3JkZXIgfSksXG4gICAgICAgIHt9XG4gICAgICApIGFzIFRRdWVyeU9yZGVyT2JqZWN0O1xuXG4gICAgaWYgKCFlcXVhbChvcmRlciwgdGhpcy5hc09iamVjdCgpKSkge1xuICAgICAgdGhpcy5xdWVyeS5zZXRQYXJ0aWFsUXVlcnkoeyBvcmRlciB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVF1ZXJ5Q2hhbmdlKCkge1xuICAgIHRoaXMub3JkZXJNZW1iZXJzLm5leHQoXG4gICAgICBbXG4gICAgICAgIC4uLnRoaXMucXVlcnkubWVhc3VyZXMuYXNBcnJheSgpLFxuICAgICAgICAuLi50aGlzLnF1ZXJ5LmRpbWVuc2lvbnMuYXNBcnJheSgpLFxuICAgICAgICAuLi50aGlzLnF1ZXJ5LnRpbWVEaW1lbnNpb25zLmFzQXJyYXkoKSxcbiAgICAgIF0ubWFwPFRPcmRlck1lbWJlcj4oKHsgbmFtZSwgdGl0bGUgfSkgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGlkOiBuYW1lLFxuICAgICAgICAgIG9yZGVyOiB0aGlzLm9mKG5hbWUpLFxuICAgICAgICAgIHRpdGxlLFxuICAgICAgICB9O1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgc2V0TWVtYmVyT3JkZXIoaWQ6IHN0cmluZywgb3JkZXI6IFRPcmRlcikge1xuICAgIHRoaXMub3JkZXJNZW1iZXJzLm5leHQoXG4gICAgICB0aGlzLm9yZGVyTWVtYmVycy5nZXRWYWx1ZSgpLm1hcCgob3JkZXJNZW1iZXIpID0+IHtcbiAgICAgICAgaWYgKG9yZGVyTWVtYmVyLmlkID09PSBpZCkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5vcmRlck1lbWJlcixcbiAgICAgICAgICAgIG9yZGVyLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9yZGVyTWVtYmVyO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcmVvcmRlcihzb3VyY2VJbmRleDogbnVtYmVyLCBkZXN0aW5hdGlvbkluZGV4OiBudW1iZXIpIHtcbiAgICB0aGlzLm9yZGVyTWVtYmVycy5uZXh0KFxuICAgICAgbW92ZUl0ZW1JbkFycmF5KFxuICAgICAgICB0aGlzLm9yZGVyTWVtYmVycy5nZXRWYWx1ZSgpLFxuICAgICAgICBzb3VyY2VJbmRleCxcbiAgICAgICAgZGVzdGluYXRpb25JbmRleFxuICAgICAgKVxuICAgICk7XG4gIH1cblxuICBvZihtZW1iZXI6IHN0cmluZykge1xuICAgIHJldHVybiAodGhpcy5xdWVyeS5hc0N1YmVRdWVyeSgpLm9yZGVyIHx8IHt9KVttZW1iZXJdIHx8ICdub25lJztcbiAgfVxuXG4gIHNldChvcmRlcjogVFF1ZXJ5T3JkZXJPYmplY3QgfCBUUXVlcnlPcmRlckFycmF5KSB7XG4gICAgdGhpcy5xdWVyeS5zZXRQYXJ0aWFsUXVlcnkoeyBvcmRlciB9KTtcbiAgfVxuXG4gIGFzQXJyYXkoKTogVFF1ZXJ5T3JkZXJBcnJheSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5xdWVyeS5hc0N1YmVRdWVyeSgpLm9yZGVyKSkge1xuICAgICAgcmV0dXJuIHRoaXMucXVlcnkuYXNDdWJlUXVlcnkoKS5vcmRlciBhcyBUUXVlcnlPcmRlckFycmF5O1xuICAgIH1cblxuICAgIHJldHVybiBPYmplY3QuZW50cmllcyh0aGlzLnF1ZXJ5LmFzQ3ViZVF1ZXJ5KCkub3JkZXIgfHwge30pO1xuICB9XG5cbiAgYXNPYmplY3QoKTogVFF1ZXJ5T3JkZXJPYmplY3Qge1xuICAgIHJldHVybiB0aGlzLmFzQXJyYXkoKS5yZWR1Y2UoXG4gICAgICAobWVtbywgW2tleSwgdmFsdWVdKSA9PiAoeyAuLi5tZW1vLCBba2V5XTogdmFsdWUgfSksXG4gICAgICB7fVxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEZpbHRlck1lbWJlciB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcXVlcnk6IFF1ZXJ5KSB7fVxuXG4gIHByaXZhdGUgZ2V0IGZpbHRlcnMoKSB7XG4gICAgLy8gVE9ETzogdXBkYXRlIHRoaXMgdHlwZSBhc3NlcnRpb24gb25jZSB0aGUgUXVlcnlCdWlsZGVyIHN1cHBvcnRzIGxvZ2ljYWwgYW5kL29yXG4gICAgcmV0dXJuICh0aGlzLnF1ZXJ5LmFzQ3ViZVF1ZXJ5KCkuZmlsdGVycyB8fCBbXSkgYXMgKFVuYXJ5RmlsdGVyIHwgQmluYXJ5RmlsdGVyKVtdO1xuICB9XG5cbiAgdXBkYXRlKGJ5OiBzdHJpbmcgfCBudW1iZXIsIHVwZGF0ZVdpdGg6IFBhcnRpYWw8RmlsdGVyPikge1xuICAgIGNvbnN0IGZpbHRlcnMgPSB0aGlzLmZpbHRlcnMubWFwKChmaWx0ZXIsIGluZGV4KSA9PiB7XG4gICAgICBpZiAoaW5kZXggPT09IGJ5IHx8IGZpbHRlci5tZW1iZXIgPT09IGJ5IHx8IGZpbHRlci5kaW1lbnNpb24gPT09IGJ5KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uZmlsdGVyLFxuICAgICAgICAgIC4uLnVwZGF0ZVdpdGgsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gZmlsdGVyO1xuICAgIH0pO1xuXG4gICAgdGhpcy5xdWVyeS5zZXRQYXJ0aWFsUXVlcnkoe1xuICAgICAgZmlsdGVyczogZmlsdGVycyBhcyBGaWx0ZXJbXSxcbiAgICB9KTtcbiAgfVxuXG4gIGFkZChmaWx0ZXI6IEZpbHRlcikge1xuICAgIHRoaXMucXVlcnkuc2V0UGFydGlhbFF1ZXJ5KHtcbiAgICAgIGZpbHRlcnM6IFsuLi50aGlzLmZpbHRlcnMsIGZpbHRlcl0sXG4gICAgfSk7XG4gIH1cblxuICByZW1vdmUoYnk6IHN0cmluZyB8IG51bWJlcikge1xuICAgIHRoaXMucXVlcnkuc2V0UGFydGlhbFF1ZXJ5KHtcbiAgICAgIGZpbHRlcnM6IHRoaXMuZmlsdGVycy5maWx0ZXIoKGZpbHRlciwgaW5kZXgpID0+IHtcbiAgICAgICAgaWYgKGZpbHRlci5tZW1iZXIgPT09IGJ5IHx8IGZpbHRlci5kaW1lbnNpb24gPT09IGJ5IHx8IGluZGV4ID09PSBieSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSksXG4gICAgfSk7XG4gIH1cblxuICBzZXQoZmlsdGVyczogRmlsdGVyW10pIHtcbiAgICB0aGlzLnF1ZXJ5LnNldFBhcnRpYWxRdWVyeSh7XG4gICAgICBmaWx0ZXJzLFxuICAgIH0pO1xuICB9XG5cbiAgcmVwbGFjZShuYW1lOiBzdHJpbmcsIHJlcGxhY2VXaXRoTmFtZTogc3RyaW5nKSB7XG4gICAgdGhpcy5xdWVyeS5zZXRQYXJ0aWFsUXVlcnkoe1xuICAgICAgZmlsdGVyczogdGhpcy5maWx0ZXJzLm1hcCgoZmlsdGVyKSA9PiB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gZmlsdGVyLm1lbWJlciA/ICdtZW1iZXInIDogJ2RpbWVuc2lvbic7XG4gICAgICAgIHJldHVybiBmaWx0ZXIubWVtYmVyID09PSBuYW1lIHx8IGZpbHRlci5kaW1lbnNpb24gPT09IG5hbWVcbiAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgLi4uZmlsdGVyLFxuICAgICAgICAgICAgICBbZmllbGRdOiByZXBsYWNlV2l0aE5hbWUsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiBmaWx0ZXI7XG4gICAgICB9KSxcbiAgICB9KTtcbiAgfVxuXG4gIGFzQXJyYXkoKTogYW55W10ge1xuICAgIHJldHVybiB0aGlzLmZpbHRlcnMubWFwKChmaWx0ZXIpID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnRoaXMucXVlcnkubWV0YS5yZXNvbHZlTWVtYmVyKGZpbHRlci5tZW1iZXIgfHwgZmlsdGVyLmRpbWVuc2lvbiwgW1xuICAgICAgICAgICdkaW1lbnNpb25zJyxcbiAgICAgICAgICAnbWVhc3VyZXMnLFxuICAgICAgICBdKSxcbiAgICAgICAgb3BlcmF0b3JzOiB0aGlzLnF1ZXJ5Lm1ldGEuZmlsdGVyT3BlcmF0b3JzRm9yTWVtYmVyKFxuICAgICAgICAgIGZpbHRlci5tZW1iZXIgfHwgZmlsdGVyLmRpbWVuc2lvbixcbiAgICAgICAgICBbJ2RpbWVuc2lvbnMnLCAnbWVhc3VyZXMnXVxuICAgICAgICApLFxuICAgICAgICAuLi5maWx0ZXIsXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG59XG4iXX0=