@cubejs-client/ngx 0.28.51 → 0.29.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.
- package/CHANGELOG.md +16 -0
- package/dist/bundles/cubejs-client-ngx.umd.js +106 -639
- package/dist/bundles/cubejs-client-ngx.umd.js.map +1 -1
- package/dist/esm2015/cubejs-client-ngx.js +2 -7
- package/dist/esm2015/index.js +2 -7
- package/dist/esm2015/src/client.js +18 -77
- package/dist/esm2015/src/module.js +2 -10
- package/dist/esm2015/src/public_api.js +8 -13
- package/dist/esm2015/src/query-builder/builder-meta.js +7 -46
- package/dist/esm2015/src/query-builder/chart-type.js +1 -9
- package/dist/esm2015/src/query-builder/common.js +1 -23
- package/dist/esm2015/src/query-builder/pivot-config.js +1 -20
- package/dist/esm2015/src/query-builder/query-builder.service.js +23 -156
- package/dist/esm2015/src/query-builder/query-members.js +29 -275
- package/dist/esm2015/src/query-builder/query.js +11 -68
- package/dist/fesm2015/cubejs-client-ngx.js +88 -686
- package/dist/fesm2015/cubejs-client-ngx.js.map +1 -1
- package/dist/src/query-builder/query-members.d.ts +1 -1
- package/package.json +17 -19
- package/dist/CHANGELOG.md +0 -914
- package/dist/bundles/cubejs-client-ngx.umd.min.js +0 -2
- package/dist/bundles/cubejs-client-ngx.umd.min.js.map +0 -1
|
@@ -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
|
-
|
|
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
|
-
|
|
231
|
-
|
|
232
|
-
.
|
|
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
|
|
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 (
|
|
156
|
+
return (this.query.asCubeQuery().filters || []);
|
|
351
157
|
}
|
|
352
|
-
/**
|
|
353
|
-
* @param {?} by
|
|
354
|
-
* @param {?} updateWith
|
|
355
|
-
* @return {?}
|
|
356
|
-
*/
|
|
357
158
|
update(by, updateWith) {
|
|
358
|
-
|
|
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:
|
|
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=
|