@abp/utils 5.0.10 → 5.1.3

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,289 +1,289 @@
1
- /* tslint:disable:no-non-null-assertion */
2
- import compare from 'just-compare';
3
- export class ListNode {
4
- constructor(value) {
5
- this.value = value;
6
- }
7
- }
8
- export class LinkedList {
9
- constructor() {
10
- this.size = 0;
11
- }
12
- get head() {
13
- return this.first;
14
- }
15
- get tail() {
16
- return this.last;
17
- }
18
- get length() {
19
- return this.size;
20
- }
21
- attach(value, previousNode, nextNode) {
22
- if (!previousNode)
23
- return this.addHead(value);
24
- if (!nextNode)
25
- return this.addTail(value);
26
- const node = new ListNode(value);
27
- node.previous = previousNode;
28
- previousNode.next = node;
29
- node.next = nextNode;
30
- nextNode.previous = node;
31
- this.size++;
32
- return node;
33
- }
34
- attachMany(values, previousNode, nextNode) {
35
- if (!values.length)
36
- return [];
37
- if (!previousNode)
38
- return this.addManyHead(values);
39
- if (!nextNode)
40
- return this.addManyTail(values);
41
- const list = new LinkedList();
42
- list.addManyTail(values);
43
- list.first.previous = previousNode;
44
- previousNode.next = list.first;
45
- list.last.next = nextNode;
46
- nextNode.previous = list.last;
47
- this.size += values.length;
48
- return list.toNodeArray();
49
- }
50
- detach(node) {
51
- if (!node.previous)
52
- return this.dropHead();
53
- if (!node.next)
54
- return this.dropTail();
55
- node.previous.next = node.next;
56
- node.next.previous = node.previous;
57
- this.size--;
58
- return node;
59
- }
60
- add(value) {
61
- return {
62
- after: (...params) => this.addAfter.call(this, value, ...params),
63
- before: (...params) => this.addBefore.call(this, value, ...params),
64
- byIndex: (position) => this.addByIndex(value, position),
65
- head: () => this.addHead(value),
66
- tail: () => this.addTail(value),
67
- };
68
- }
69
- addMany(values) {
70
- return {
71
- after: (...params) => this.addManyAfter.call(this, values, ...params),
72
- before: (...params) => this.addManyBefore.call(this, values, ...params),
73
- byIndex: (position) => this.addManyByIndex(values, position),
74
- head: () => this.addManyHead(values),
75
- tail: () => this.addManyTail(values),
76
- };
77
- }
78
- addAfter(value, previousValue, compareFn = compare) {
79
- const previous = this.find(node => compareFn(node.value, previousValue));
80
- return previous ? this.attach(value, previous, previous.next) : this.addTail(value);
81
- }
82
- addBefore(value, nextValue, compareFn = compare) {
83
- const next = this.find(node => compareFn(node.value, nextValue));
84
- return next ? this.attach(value, next.previous, next) : this.addHead(value);
85
- }
86
- addByIndex(value, position) {
87
- if (position < 0)
88
- position += this.size;
89
- else if (position >= this.size)
90
- return this.addTail(value);
91
- if (position <= 0)
92
- return this.addHead(value);
93
- const next = this.get(position);
94
- return this.attach(value, next.previous, next);
95
- }
96
- addHead(value) {
97
- const node = new ListNode(value);
98
- node.next = this.first;
99
- if (this.first)
100
- this.first.previous = node;
101
- else
102
- this.last = node;
103
- this.first = node;
104
- this.size++;
105
- return node;
106
- }
107
- addTail(value) {
108
- const node = new ListNode(value);
109
- if (this.first) {
110
- node.previous = this.last;
111
- this.last.next = node;
112
- this.last = node;
113
- }
114
- else {
115
- this.first = node;
116
- this.last = node;
117
- }
118
- this.size++;
119
- return node;
120
- }
121
- addManyAfter(values, previousValue, compareFn = compare) {
122
- const previous = this.find(node => compareFn(node.value, previousValue));
123
- return previous ? this.attachMany(values, previous, previous.next) : this.addManyTail(values);
124
- }
125
- addManyBefore(values, nextValue, compareFn = compare) {
126
- const next = this.find(node => compareFn(node.value, nextValue));
127
- return next ? this.attachMany(values, next.previous, next) : this.addManyHead(values);
128
- }
129
- addManyByIndex(values, position) {
130
- if (position < 0)
131
- position += this.size;
132
- if (position <= 0)
133
- return this.addManyHead(values);
134
- if (position >= this.size)
135
- return this.addManyTail(values);
136
- const next = this.get(position);
137
- return this.attachMany(values, next.previous, next);
138
- }
139
- addManyHead(values) {
140
- return values.reduceRight((nodes, value) => {
141
- nodes.unshift(this.addHead(value));
142
- return nodes;
143
- }, []);
144
- }
145
- addManyTail(values) {
146
- return values.map(value => this.addTail(value));
147
- }
148
- drop() {
149
- return {
150
- byIndex: (position) => this.dropByIndex(position),
151
- byValue: (...params) => this.dropByValue.apply(this, params),
152
- byValueAll: (...params) => this.dropByValueAll.apply(this, params),
153
- head: () => this.dropHead(),
154
- tail: () => this.dropTail(),
155
- };
156
- }
157
- dropMany(count) {
158
- return {
159
- byIndex: (position) => this.dropManyByIndex(count, position),
160
- head: () => this.dropManyHead(count),
161
- tail: () => this.dropManyTail(count),
162
- };
163
- }
164
- dropByIndex(position) {
165
- if (position < 0)
166
- position += this.size;
167
- const current = this.get(position);
168
- return current ? this.detach(current) : undefined;
169
- }
170
- dropByValue(value, compareFn = compare) {
171
- const position = this.findIndex(node => compareFn(node.value, value));
172
- return position < 0 ? undefined : this.dropByIndex(position);
173
- }
174
- dropByValueAll(value, compareFn = compare) {
175
- const dropped = [];
176
- for (let current = this.first, position = 0; current; position++, current = current.next) {
177
- if (compareFn(current.value, value)) {
178
- dropped.push(this.dropByIndex(position - dropped.length));
179
- }
180
- }
181
- return dropped;
182
- }
183
- dropHead() {
184
- const head = this.first;
185
- if (head) {
186
- this.first = head.next;
187
- if (this.first)
188
- this.first.previous = undefined;
189
- else
190
- this.last = undefined;
191
- this.size--;
192
- return head;
193
- }
194
- return undefined;
195
- }
196
- dropTail() {
197
- const tail = this.last;
198
- if (tail) {
199
- this.last = tail.previous;
200
- if (this.last)
201
- this.last.next = undefined;
202
- else
203
- this.first = undefined;
204
- this.size--;
205
- return tail;
206
- }
207
- return undefined;
208
- }
209
- dropManyByIndex(count, position) {
210
- if (count <= 0)
211
- return [];
212
- if (position < 0)
213
- position = Math.max(position + this.size, 0);
214
- else if (position >= this.size)
215
- return [];
216
- count = Math.min(count, this.size - position);
217
- const dropped = [];
218
- while (count--) {
219
- const current = this.get(position);
220
- dropped.push(this.detach(current));
221
- }
222
- return dropped;
223
- }
224
- dropManyHead(count) {
225
- if (count <= 0)
226
- return [];
227
- count = Math.min(count, this.size);
228
- const dropped = [];
229
- while (count--)
230
- dropped.unshift(this.dropHead());
231
- return dropped;
232
- }
233
- dropManyTail(count) {
234
- if (count <= 0)
235
- return [];
236
- count = Math.min(count, this.size);
237
- const dropped = [];
238
- while (count--)
239
- dropped.push(this.dropTail());
240
- return dropped;
241
- }
242
- find(predicate) {
243
- for (let current = this.first, position = 0; current; position++, current = current.next) {
244
- if (predicate(current, position, this))
245
- return current;
246
- }
247
- return undefined;
248
- }
249
- findIndex(predicate) {
250
- for (let current = this.first, position = 0; current; position++, current = current.next) {
251
- if (predicate(current, position, this))
252
- return position;
253
- }
254
- return -1;
255
- }
256
- forEach(iteratorFn) {
257
- for (let node = this.first, position = 0; node; position++, node = node.next) {
258
- iteratorFn(node, position, this);
259
- }
260
- }
261
- get(position) {
262
- return this.find((_, index) => position === index);
263
- }
264
- indexOf(value, compareFn = compare) {
265
- return this.findIndex(node => compareFn(node.value, value));
266
- }
267
- toArray() {
268
- const array = new Array(this.size);
269
- this.forEach((node, index) => (array[index] = node.value));
270
- return array;
271
- }
272
- toNodeArray() {
273
- const array = new Array(this.size);
274
- this.forEach((node, index) => (array[index] = node));
275
- return array;
276
- }
277
- toString(mapperFn = JSON.stringify) {
278
- return this.toArray()
279
- .map(value => mapperFn(value))
280
- .join(' <-> ');
281
- }
282
- // Cannot use Generator type because of ng-packagr
283
- *[Symbol.iterator]() {
284
- for (let node = this.first, position = 0; node; position++, node = node.next) {
285
- yield node.value;
286
- }
287
- }
288
- }
289
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlua2VkLWxpc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9wcm9qZWN0cy91dGlscy9zcmMvbGliL2xpbmtlZC1saXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDBDQUEwQztBQUUxQyxPQUFPLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFFbkMsTUFBTSxPQUFPLFFBQVE7SUFHbkIsWUFBNEIsS0FBUTtRQUFSLFVBQUssR0FBTCxLQUFLLENBQUc7SUFBRyxDQUFDO0NBQ3pDO0FBRUQsTUFBTSxPQUFPLFVBQVU7SUFBdkI7UUFHVSxTQUFJLEdBQUcsQ0FBQyxDQUFDO0lBK1huQixDQUFDO0lBN1hDLElBQUksSUFBSTtRQUNOLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztJQUNwQixDQUFDO0lBQ0QsSUFBSSxJQUFJO1FBQ04sT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQ25CLENBQUM7SUFDRCxJQUFJLE1BQU07UUFDUixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDbkIsQ0FBQztJQUVPLE1BQU0sQ0FDWixLQUFRLEVBQ1IsWUFBcUMsRUFDckMsUUFBaUM7UUFFakMsSUFBSSxDQUFDLFlBQVk7WUFBRSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFOUMsSUFBSSxDQUFDLFFBQVE7WUFBRSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFMUMsTUFBTSxJQUFJLEdBQUcsSUFBSSxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakMsSUFBSSxDQUFDLFFBQVEsR0FBRyxZQUFZLENBQUM7UUFDN0IsWUFBWSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDekIsSUFBSSxDQUFDLElBQUksR0FBRyxRQUFRLENBQUM7UUFDckIsUUFBUSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7UUFFekIsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBRVosT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRU8sVUFBVSxDQUNoQixNQUFXLEVBQ1gsWUFBcUMsRUFDckMsUUFBaUM7UUFFakMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNO1lBQUUsT0FBTyxFQUFFLENBQUM7UUFFOUIsSUFBSSxDQUFDLFlBQVk7WUFBRSxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFbkQsSUFBSSxDQUFDLFFBQVE7WUFBRSxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFL0MsTUFBTSxJQUFJLEdBQUcsSUFBSSxVQUFVLEVBQUssQ0FBQztRQUNqQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3pCLElBQUksQ0FBQyxLQUFNLENBQUMsUUFBUSxHQUFHLFlBQVksQ0FBQztRQUNwQyxZQUFZLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDL0IsSUFBSSxDQUFDLElBQUssQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDO1FBQzNCLFFBQVEsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztRQUU5QixJQUFJLENBQUMsSUFBSSxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUM7UUFFM0IsT0FBTyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVPLE1BQU0sQ0FBQyxJQUFpQjtRQUM5QixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVE7WUFBRSxPQUFPLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUUzQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUk7WUFBRSxPQUFPLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUV2QyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQy9CLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7UUFFbkMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBRVosT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsR0FBRyxDQUFDLEtBQVE7UUFDVixPQUFPO1lBQ0wsS0FBSyxFQUFFLENBQUMsR0FBRyxNQUF3QyxFQUFFLEVBQUUsQ0FDckQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxHQUFHLE1BQU0sQ0FBQztZQUM1QyxNQUFNLEVBQUUsQ0FBQyxHQUFHLE1BQXdDLEVBQUUsRUFBRSxDQUN0RCxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEdBQUcsTUFBTSxDQUFDO1lBQzdDLE9BQU8sRUFBRSxDQUFDLFFBQWdCLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQztZQUMvRCxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7WUFDL0IsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO1NBQ2hDLENBQUM7SUFDSixDQUFDO0lBRUQsT0FBTyxDQUFDLE1BQVc7UUFDakIsT0FBTztZQUNMLEtBQUssRUFBRSxDQUFDLEdBQUcsTUFBd0MsRUFBRSxFQUFFLENBQ3JELElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsR0FBRyxNQUFNLENBQUM7WUFDakQsTUFBTSxFQUFFLENBQUMsR0FBRyxNQUF3QyxFQUFFLEVBQUUsQ0FDdEQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxHQUFHLE1BQU0sQ0FBQztZQUNsRCxPQUFPLEVBQUUsQ0FBQyxRQUFnQixFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUM7WUFDcEUsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDO1lBQ3BDLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQztTQUNyQyxDQUFDO0lBQ0osQ0FBQztJQUlELFFBQVEsQ0FBQyxLQUFRLEVBQUUsYUFBa0IsRUFBRSxZQUFpQyxPQUFPO1FBQzdFLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDO1FBRXpFLE9BQU8sUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3RGLENBQUM7SUFJRCxTQUFTLENBQUMsS0FBUSxFQUFFLFNBQWMsRUFBRSxZQUFpQyxPQUFPO1FBQzFFLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBRWpFLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzlFLENBQUM7SUFFRCxVQUFVLENBQUMsS0FBUSxFQUFFLFFBQWdCO1FBQ25DLElBQUksUUFBUSxHQUFHLENBQUM7WUFBRSxRQUFRLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQzthQUNuQyxJQUFJLFFBQVEsSUFBSSxJQUFJLENBQUMsSUFBSTtZQUFFLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUUzRCxJQUFJLFFBQVEsSUFBSSxDQUFDO1lBQUUsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRTlDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFFLENBQUM7UUFFakMsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFFRCxPQUFPLENBQUMsS0FBUTtRQUNkLE1BQU0sSUFBSSxHQUFHLElBQUksUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRWpDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUV2QixJQUFJLElBQUksQ0FBQyxLQUFLO1lBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDOztZQUN0QyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUV0QixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztRQUNsQixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFFWixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxPQUFPLENBQUMsS0FBUTtRQUNkLE1BQU0sSUFBSSxHQUFHLElBQUksUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRWpDLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNkLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztZQUMxQixJQUFJLENBQUMsSUFBSyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7WUFDdkIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7U0FDbEI7YUFBTTtZQUNMLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO1lBQ2xCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1NBQ2xCO1FBRUQsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBRVosT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBSUQsWUFBWSxDQUNWLE1BQVcsRUFDWCxhQUFrQixFQUNsQixZQUFpQyxPQUFPO1FBRXhDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDO1FBRXpFLE9BQU8sUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2hHLENBQUM7SUFJRCxhQUFhLENBQ1gsTUFBVyxFQUNYLFNBQWMsRUFDZCxZQUFpQyxPQUFPO1FBRXhDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBRWpFLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3hGLENBQUM7SUFFRCxjQUFjLENBQUMsTUFBVyxFQUFFLFFBQWdCO1FBQzFDLElBQUksUUFBUSxHQUFHLENBQUM7WUFBRSxRQUFRLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQztRQUV4QyxJQUFJLFFBQVEsSUFBSSxDQUFDO1lBQUUsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRW5ELElBQUksUUFBUSxJQUFJLElBQUksQ0FBQyxJQUFJO1lBQUUsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRTNELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFFLENBQUM7UUFFakMsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFRCxXQUFXLENBQUMsTUFBVztRQUNyQixPQUFPLE1BQU0sQ0FBQyxXQUFXLENBQWdCLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQ3hELEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQ25DLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ1QsQ0FBQztJQUVELFdBQVcsQ0FBQyxNQUFXO1FBQ3JCLE9BQU8sTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRUQsSUFBSTtRQUNGLE9BQU87WUFDTCxPQUFPLEVBQUUsQ0FBQyxRQUFnQixFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQztZQUN6RCxPQUFPLEVBQUUsQ0FBQyxHQUFHLE1BQXdDLEVBQUUsRUFBRSxDQUN2RCxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDO1lBQ3RDLFVBQVUsRUFBRSxDQUFDLEdBQUcsTUFBd0MsRUFBRSxFQUFFLENBQzFELElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUM7WUFDekMsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDM0IsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUU7U0FDNUIsQ0FBQztJQUNKLENBQUM7SUFFRCxRQUFRLENBQUMsS0FBYTtRQUNwQixPQUFPO1lBQ0wsT0FBTyxFQUFFLENBQUMsUUFBZ0IsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDO1lBQ3BFLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQztZQUNwQyxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUM7U0FDckMsQ0FBQztJQUNKLENBQUM7SUFFRCxXQUFXLENBQUMsUUFBZ0I7UUFDMUIsSUFBSSxRQUFRLEdBQUcsQ0FBQztZQUFFLFFBQVEsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDO1FBRXhDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFbkMsT0FBTyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUNwRCxDQUFDO0lBSUQsV0FBVyxDQUFDLEtBQVUsRUFBRSxZQUFpQyxPQUFPO1FBQzlELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBRXRFLE9BQU8sUUFBUSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQy9ELENBQUM7SUFJRCxjQUFjLENBQUMsS0FBVSxFQUFFLFlBQWlDLE9BQU87UUFDakUsTUFBTSxPQUFPLEdBQWtCLEVBQUUsQ0FBQztRQUVsQyxLQUFLLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsUUFBUSxHQUFHLENBQUMsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLEVBQUUsT0FBTyxHQUFHLE9BQU8sQ0FBQyxJQUFJLEVBQUU7WUFDeEYsSUFBSSxTQUFTLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsRUFBRTtnQkFDbkMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFFLENBQUMsQ0FBQzthQUM1RDtTQUNGO1FBRUQsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVELFFBQVE7UUFDTixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBRXhCLElBQUksSUFBSSxFQUFFO1lBQ1IsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1lBRXZCLElBQUksSUFBSSxDQUFDLEtBQUs7Z0JBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLEdBQUcsU0FBUyxDQUFDOztnQkFDM0MsSUFBSSxDQUFDLElBQUksR0FBRyxTQUFTLENBQUM7WUFFM0IsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBRVosT0FBTyxJQUFJLENBQUM7U0FDYjtRQUVELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFRCxRQUFRO1FBQ04sTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztRQUV2QixJQUFJLElBQUksRUFBRTtZQUNSLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztZQUUxQixJQUFJLElBQUksQ0FBQyxJQUFJO2dCQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLFNBQVMsQ0FBQzs7Z0JBQ3JDLElBQUksQ0FBQyxLQUFLLEdBQUcsU0FBUyxDQUFDO1lBRTVCLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUVaLE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFFRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQsZUFBZSxDQUFDLEtBQWEsRUFBRSxRQUFnQjtRQUM3QyxJQUFJLEtBQUssSUFBSSxDQUFDO1lBQUUsT0FBTyxFQUFFLENBQUM7UUFFMUIsSUFBSSxRQUFRLEdBQUcsQ0FBQztZQUFFLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO2FBQzFELElBQUksUUFBUSxJQUFJLElBQUksQ0FBQyxJQUFJO1lBQUUsT0FBTyxFQUFFLENBQUM7UUFFMUMsS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDLENBQUM7UUFFOUMsTUFBTSxPQUFPLEdBQWtCLEVBQUUsQ0FBQztRQUVsQyxPQUFPLEtBQUssRUFBRSxFQUFFO1lBQ2QsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNuQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBUSxDQUFFLENBQUMsQ0FBQztTQUN0QztRQUVELE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFRCxZQUFZLENBQUMsS0FBeUI7UUFDcEMsSUFBSSxLQUFLLElBQUksQ0FBQztZQUFFLE9BQU8sRUFBRSxDQUFDO1FBRTFCLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFbkMsTUFBTSxPQUFPLEdBQWtCLEVBQUUsQ0FBQztRQUVsQyxPQUFPLEtBQUssRUFBRTtZQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRyxDQUFDLENBQUM7UUFFbEQsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVELFlBQVksQ0FBQyxLQUF5QjtRQUNwQyxJQUFJLEtBQUssSUFBSSxDQUFDO1lBQUUsT0FBTyxFQUFFLENBQUM7UUFFMUIsS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVuQyxNQUFNLE9BQU8sR0FBa0IsRUFBRSxDQUFDO1FBRWxDLE9BQU8sS0FBSyxFQUFFO1lBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFHLENBQUMsQ0FBQztRQUUvQyxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBRUQsSUFBSSxDQUFDLFNBQTRCO1FBQy9CLEtBQUssSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxRQUFRLEdBQUcsQ0FBQyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsRUFBRSxPQUFPLEdBQUcsT0FBTyxDQUFDLElBQUksRUFBRTtZQUN4RixJQUFJLFNBQVMsQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQztnQkFBRSxPQUFPLE9BQU8sQ0FBQztTQUN4RDtRQUVELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFRCxTQUFTLENBQUMsU0FBNEI7UUFDcEMsS0FBSyxJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLFFBQVEsR0FBRyxDQUFDLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxFQUFFLE9BQU8sR0FBRyxPQUFPLENBQUMsSUFBSSxFQUFFO1lBQ3hGLElBQUksU0FBUyxDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDO2dCQUFFLE9BQU8sUUFBUSxDQUFDO1NBQ3pEO1FBRUQsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUNaLENBQUM7SUFFRCxPQUFPLENBQWMsVUFBZ0M7UUFDbkQsS0FBSyxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLFFBQVEsR0FBRyxDQUFDLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxFQUFFLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQzVFLFVBQVUsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQ2xDO0lBQ0gsQ0FBQztJQUVELEdBQUcsQ0FBQyxRQUFnQjtRQUNsQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxRQUFRLEtBQUssS0FBSyxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUlELE9BQU8sQ0FBQyxLQUFVLEVBQUUsWUFBaUMsT0FBTztRQUMxRCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFFRCxPQUFPO1FBQ0wsTUFBTSxLQUFLLEdBQUcsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRW5DLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUU1RCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxXQUFXO1FBQ1QsTUFBTSxLQUFLLEdBQUcsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRW5DLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBRXRELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELFFBQVEsQ0FBQyxXQUE0QixJQUFJLENBQUMsU0FBUztRQUNqRCxPQUFPLElBQUksQ0FBQyxPQUFPLEVBQUU7YUFDbEIsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQzdCLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNuQixDQUFDO0lBRUQsa0RBQWtEO0lBQ2xELENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDO1FBQ2hCLEtBQUssSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxRQUFRLEdBQUcsQ0FBQyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsRUFBRSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRTtZQUM1RSxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUM7U0FDbEI7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKiB0c2xpbnQ6ZGlzYWJsZTpuby1ub24tbnVsbC1hc3NlcnRpb24gKi9cblxuaW1wb3J0IGNvbXBhcmUgZnJvbSAnanVzdC1jb21wYXJlJztcblxuZXhwb3J0IGNsYXNzIExpc3ROb2RlPFQgPSBhbnk+IHtcbiAgbmV4dDogTGlzdE5vZGUgfCB1bmRlZmluZWQ7XG4gIHByZXZpb3VzOiBMaXN0Tm9kZSB8IHVuZGVmaW5lZDtcbiAgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IHZhbHVlOiBUKSB7fVxufVxuXG5leHBvcnQgY2xhc3MgTGlua2VkTGlzdDxUID0gYW55PiB7XG4gIHByaXZhdGUgZmlyc3Q6IExpc3ROb2RlPFQ+IHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIGxhc3Q6IExpc3ROb2RlPFQ+IHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHNpemUgPSAwO1xuXG4gIGdldCBoZWFkKCk6IExpc3ROb2RlPFQ+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5maXJzdDtcbiAgfVxuICBnZXQgdGFpbCgpOiBMaXN0Tm9kZTxUPiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMubGFzdDtcbiAgfVxuICBnZXQgbGVuZ3RoKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuc2l6ZTtcbiAgfVxuXG4gIHByaXZhdGUgYXR0YWNoKFxuICAgIHZhbHVlOiBULFxuICAgIHByZXZpb3VzTm9kZTogTGlzdE5vZGU8VD4gfCB1bmRlZmluZWQsXG4gICAgbmV4dE5vZGU6IExpc3ROb2RlPFQ+IHwgdW5kZWZpbmVkLFxuICApOiBMaXN0Tm9kZTxUPiB7XG4gICAgaWYgKCFwcmV2aW91c05vZGUpIHJldHVybiB0aGlzLmFkZEhlYWQodmFsdWUpO1xuXG4gICAgaWYgKCFuZXh0Tm9kZSkgcmV0dXJuIHRoaXMuYWRkVGFpbCh2YWx1ZSk7XG5cbiAgICBjb25zdCBub2RlID0gbmV3IExpc3ROb2RlKHZhbHVlKTtcbiAgICBub2RlLnByZXZpb3VzID0gcHJldmlvdXNOb2RlO1xuICAgIHByZXZpb3VzTm9kZS5uZXh0ID0gbm9kZTtcbiAgICBub2RlLm5leHQgPSBuZXh0Tm9kZTtcbiAgICBuZXh0Tm9kZS5wcmV2aW91cyA9IG5vZGU7XG5cbiAgICB0aGlzLnNpemUrKztcblxuICAgIHJldHVybiBub2RlO1xuICB9XG5cbiAgcHJpdmF0ZSBhdHRhY2hNYW55KFxuICAgIHZhbHVlczogVFtdLFxuICAgIHByZXZpb3VzTm9kZTogTGlzdE5vZGU8VD4gfCB1bmRlZmluZWQsXG4gICAgbmV4dE5vZGU6IExpc3ROb2RlPFQ+IHwgdW5kZWZpbmVkLFxuICApOiBMaXN0Tm9kZTxUPltdIHtcbiAgICBpZiAoIXZhbHVlcy5sZW5ndGgpIHJldHVybiBbXTtcblxuICAgIGlmICghcHJldmlvdXNOb2RlKSByZXR1cm4gdGhpcy5hZGRNYW55SGVhZCh2YWx1ZXMpO1xuXG4gICAgaWYgKCFuZXh0Tm9kZSkgcmV0dXJuIHRoaXMuYWRkTWFueVRhaWwodmFsdWVzKTtcblxuICAgIGNvbnN0IGxpc3QgPSBuZXcgTGlua2VkTGlzdDxUPigpO1xuICAgIGxpc3QuYWRkTWFueVRhaWwodmFsdWVzKTtcbiAgICBsaXN0LmZpcnN0IS5wcmV2aW91cyA9IHByZXZpb3VzTm9kZTtcbiAgICBwcmV2aW91c05vZGUubmV4dCA9IGxpc3QuZmlyc3Q7XG4gICAgbGlzdC5sYXN0IS5uZXh0ID0gbmV4dE5vZGU7XG4gICAgbmV4dE5vZGUucHJldmlvdXMgPSBsaXN0Lmxhc3Q7XG5cbiAgICB0aGlzLnNpemUgKz0gdmFsdWVzLmxlbmd0aDtcblxuICAgIHJldHVybiBsaXN0LnRvTm9kZUFycmF5KCk7XG4gIH1cblxuICBwcml2YXRlIGRldGFjaChub2RlOiBMaXN0Tm9kZTxUPikge1xuICAgIGlmICghbm9kZS5wcmV2aW91cykgcmV0dXJuIHRoaXMuZHJvcEhlYWQoKTtcblxuICAgIGlmICghbm9kZS5uZXh0KSByZXR1cm4gdGhpcy5kcm9wVGFpbCgpO1xuXG4gICAgbm9kZS5wcmV2aW91cy5uZXh0ID0gbm9kZS5uZXh0O1xuICAgIG5vZGUubmV4dC5wcmV2aW91cyA9IG5vZGUucHJldmlvdXM7XG5cbiAgICB0aGlzLnNpemUtLTtcblxuICAgIHJldHVybiBub2RlO1xuICB9XG5cbiAgYWRkKHZhbHVlOiBUKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFmdGVyOiAoLi4ucGFyYW1zOiBbVF0gfCBbYW55LCBMaXN0Q29tcGFyaXNvbkZuPFQ+XSkgPT5cbiAgICAgICAgdGhpcy5hZGRBZnRlci5jYWxsKHRoaXMsIHZhbHVlLCAuLi5wYXJhbXMpLFxuICAgICAgYmVmb3JlOiAoLi4ucGFyYW1zOiBbVF0gfCBbYW55LCBMaXN0Q29tcGFyaXNvbkZuPFQ+XSkgPT5cbiAgICAgICAgdGhpcy5hZGRCZWZvcmUuY2FsbCh0aGlzLCB2YWx1ZSwgLi4ucGFyYW1zKSxcbiAgICAgIGJ5SW5kZXg6IChwb3NpdGlvbjogbnVtYmVyKSA9PiB0aGlzLmFkZEJ5SW5kZXgodmFsdWUsIHBvc2l0aW9uKSxcbiAgICAgIGhlYWQ6ICgpID0+IHRoaXMuYWRkSGVhZCh2YWx1ZSksXG4gICAgICB0YWlsOiAoKSA9PiB0aGlzLmFkZFRhaWwodmFsdWUpLFxuICAgIH07XG4gIH1cblxuICBhZGRNYW55KHZhbHVlczogVFtdKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFmdGVyOiAoLi4ucGFyYW1zOiBbVF0gfCBbYW55LCBMaXN0Q29tcGFyaXNvbkZuPFQ+XSkgPT5cbiAgICAgICAgdGhpcy5hZGRNYW55QWZ0ZXIuY2FsbCh0aGlzLCB2YWx1ZXMsIC4uLnBhcmFtcyksXG4gICAgICBiZWZvcmU6ICguLi5wYXJhbXM6IFtUXSB8IFthbnksIExpc3RDb21wYXJpc29uRm48VD5dKSA9PlxuICAgICAgICB0aGlzLmFkZE1hbnlCZWZvcmUuY2FsbCh0aGlzLCB2YWx1ZXMsIC4uLnBhcmFtcyksXG4gICAgICBieUluZGV4OiAocG9zaXRpb246IG51bWJlcikgPT4gdGhpcy5hZGRNYW55QnlJbmRleCh2YWx1ZXMsIHBvc2l0aW9uKSxcbiAgICAgIGhlYWQ6ICgpID0+IHRoaXMuYWRkTWFueUhlYWQodmFsdWVzKSxcbiAgICAgIHRhaWw6ICgpID0+IHRoaXMuYWRkTWFueVRhaWwodmFsdWVzKSxcbiAgICB9O1xuICB9XG5cbiAgYWRkQWZ0ZXIodmFsdWU6IFQsIHByZXZpb3VzVmFsdWU6IFQpOiBMaXN0Tm9kZTxUPjtcbiAgYWRkQWZ0ZXIodmFsdWU6IFQsIHByZXZpb3VzVmFsdWU6IGFueSwgY29tcGFyZUZuOiBMaXN0Q29tcGFyaXNvbkZuPFQ+KTogTGlzdE5vZGU8VD47XG4gIGFkZEFmdGVyKHZhbHVlOiBULCBwcmV2aW91c1ZhbHVlOiBhbnksIGNvbXBhcmVGbjogTGlzdENvbXBhcmlzb25GbjxUPiA9IGNvbXBhcmUpOiBMaXN0Tm9kZTxUPiB7XG4gICAgY29uc3QgcHJldmlvdXMgPSB0aGlzLmZpbmQobm9kZSA9PiBjb21wYXJlRm4obm9kZS52YWx1ZSwgcHJldmlvdXNWYWx1ZSkpO1xuXG4gICAgcmV0dXJuIHByZXZpb3VzID8gdGhpcy5hdHRhY2godmFsdWUsIHByZXZpb3VzLCBwcmV2aW91cy5uZXh0KSA6IHRoaXMuYWRkVGFpbCh2YWx1ZSk7XG4gIH1cblxuICBhZGRCZWZvcmUodmFsdWU6IFQsIG5leHRWYWx1ZTogVCk6IExpc3ROb2RlPFQ+O1xuICBhZGRCZWZvcmUodmFsdWU6IFQsIG5leHRWYWx1ZTogYW55LCBjb21wYXJlRm46IExpc3RDb21wYXJpc29uRm48VD4pOiBMaXN0Tm9kZTxUPjtcbiAgYWRkQmVmb3JlKHZhbHVlOiBULCBuZXh0VmFsdWU6IGFueSwgY29tcGFyZUZuOiBMaXN0Q29tcGFyaXNvbkZuPFQ+ID0gY29tcGFyZSk6IExpc3ROb2RlPFQ+IHtcbiAgICBjb25zdCBuZXh0ID0gdGhpcy5maW5kKG5vZGUgPT4gY29tcGFyZUZuKG5vZGUudmFsdWUsIG5leHRWYWx1ZSkpO1xuXG4gICAgcmV0dXJuIG5leHQgPyB0aGlzLmF0dGFjaCh2YWx1ZSwgbmV4dC5wcmV2aW91cywgbmV4dCkgOiB0aGlzLmFkZEhlYWQodmFsdWUpO1xuICB9XG5cbiAgYWRkQnlJbmRleCh2YWx1ZTogVCwgcG9zaXRpb246IG51bWJlcik6IExpc3ROb2RlPFQ+IHtcbiAgICBpZiAocG9zaXRpb24gPCAwKSBwb3NpdGlvbiArPSB0aGlzLnNpemU7XG4gICAgZWxzZSBpZiAocG9zaXRpb24gPj0gdGhpcy5zaXplKSByZXR1cm4gdGhpcy5hZGRUYWlsKHZhbHVlKTtcblxuICAgIGlmIChwb3NpdGlvbiA8PSAwKSByZXR1cm4gdGhpcy5hZGRIZWFkKHZhbHVlKTtcblxuICAgIGNvbnN0IG5leHQgPSB0aGlzLmdldChwb3NpdGlvbikhO1xuXG4gICAgcmV0dXJuIHRoaXMuYXR0YWNoKHZhbHVlLCBuZXh0LnByZXZpb3VzLCBuZXh0KTtcbiAgfVxuXG4gIGFkZEhlYWQodmFsdWU6IFQpOiBMaXN0Tm9kZTxUPiB7XG4gICAgY29uc3Qgbm9kZSA9IG5ldyBMaXN0Tm9kZSh2YWx1ZSk7XG5cbiAgICBub2RlLm5leHQgPSB0aGlzLmZpcnN0O1xuXG4gICAgaWYgKHRoaXMuZmlyc3QpIHRoaXMuZmlyc3QucHJldmlvdXMgPSBub2RlO1xuICAgIGVsc2UgdGhpcy5sYXN0ID0gbm9kZTtcblxuICAgIHRoaXMuZmlyc3QgPSBub2RlO1xuICAgIHRoaXMuc2l6ZSsrO1xuXG4gICAgcmV0dXJuIG5vZGU7XG4gIH1cblxuICBhZGRUYWlsKHZhbHVlOiBUKTogTGlzdE5vZGU8VD4ge1xuICAgIGNvbnN0IG5vZGUgPSBuZXcgTGlzdE5vZGUodmFsdWUpO1xuXG4gICAgaWYgKHRoaXMuZmlyc3QpIHtcbiAgICAgIG5vZGUucHJldmlvdXMgPSB0aGlzLmxhc3Q7XG4gICAgICB0aGlzLmxhc3QhLm5leHQgPSBub2RlO1xuICAgICAgdGhpcy5sYXN0ID0gbm9kZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5maXJzdCA9IG5vZGU7XG4gICAgICB0aGlzLmxhc3QgPSBub2RlO1xuICAgIH1cblxuICAgIHRoaXMuc2l6ZSsrO1xuXG4gICAgcmV0dXJuIG5vZGU7XG4gIH1cblxuICBhZGRNYW55QWZ0ZXIodmFsdWVzOiBUW10sIHByZXZpb3VzVmFsdWU6IFQpOiBMaXN0Tm9kZTxUPltdO1xuICBhZGRNYW55QWZ0ZXIodmFsdWVzOiBUW10sIHByZXZpb3VzVmFsdWU6IGFueSwgY29tcGFyZUZuOiBMaXN0Q29tcGFyaXNvbkZuPFQ+KTogTGlzdE5vZGU8VD5bXTtcbiAgYWRkTWFueUFmdGVyKFxuICAgIHZhbHVlczogVFtdLFxuICAgIHByZXZpb3VzVmFsdWU6IGFueSxcbiAgICBjb21wYXJlRm46IExpc3RDb21wYXJpc29uRm48VD4gPSBjb21wYXJlLFxuICApOiBMaXN0Tm9kZTxUPltdIHtcbiAgICBjb25zdCBwcmV2aW91cyA9IHRoaXMuZmluZChub2RlID0+IGNvbXBhcmVGbihub2RlLnZhbHVlLCBwcmV2aW91c1ZhbHVlKSk7XG5cbiAgICByZXR1cm4gcHJldmlvdXMgPyB0aGlzLmF0dGFjaE1hbnkodmFsdWVzLCBwcmV2aW91cywgcHJldmlvdXMubmV4dCkgOiB0aGlzLmFkZE1hbnlUYWlsKHZhbHVlcyk7XG4gIH1cblxuICBhZGRNYW55QmVmb3JlKHZhbHVlczogVFtdLCBuZXh0VmFsdWU6IFQpOiBMaXN0Tm9kZTxUPltdO1xuICBhZGRNYW55QmVmb3JlKHZhbHVlczogVFtdLCBuZXh0VmFsdWU6IGFueSwgY29tcGFyZUZuOiBMaXN0Q29tcGFyaXNvbkZuPFQ+KTogTGlzdE5vZGU8VD5bXTtcbiAgYWRkTWFueUJlZm9yZShcbiAgICB2YWx1ZXM6IFRbXSxcbiAgICBuZXh0VmFsdWU6IGFueSxcbiAgICBjb21wYXJlRm46IExpc3RDb21wYXJpc29uRm48VD4gPSBjb21wYXJlLFxuICApOiBMaXN0Tm9kZTxUPltdIHtcbiAgICBjb25zdCBuZXh0ID0gdGhpcy5maW5kKG5vZGUgPT4gY29tcGFyZUZuKG5vZGUudmFsdWUsIG5leHRWYWx1ZSkpO1xuXG4gICAgcmV0dXJuIG5leHQgPyB0aGlzLmF0dGFjaE1hbnkodmFsdWVzLCBuZXh0LnByZXZpb3VzLCBuZXh0KSA6IHRoaXMuYWRkTWFueUhlYWQodmFsdWVzKTtcbiAgfVxuXG4gIGFkZE1hbnlCeUluZGV4KHZhbHVlczogVFtdLCBwb3NpdGlvbjogbnVtYmVyKTogTGlzdE5vZGU8VD5bXSB7XG4gICAgaWYgKHBvc2l0aW9uIDwgMCkgcG9zaXRpb24gKz0gdGhpcy5zaXplO1xuXG4gICAgaWYgKHBvc2l0aW9uIDw9IDApIHJldHVybiB0aGlzLmFkZE1hbnlIZWFkKHZhbHVlcyk7XG5cbiAgICBpZiAocG9zaXRpb24gPj0gdGhpcy5zaXplKSByZXR1cm4gdGhpcy5hZGRNYW55VGFpbCh2YWx1ZXMpO1xuXG4gICAgY29uc3QgbmV4dCA9IHRoaXMuZ2V0KHBvc2l0aW9uKSE7XG5cbiAgICByZXR1cm4gdGhpcy5hdHRhY2hNYW55KHZhbHVlcywgbmV4dC5wcmV2aW91cywgbmV4dCk7XG4gIH1cblxuICBhZGRNYW55SGVhZCh2YWx1ZXM6IFRbXSk6IExpc3ROb2RlPFQ+W10ge1xuICAgIHJldHVybiB2YWx1ZXMucmVkdWNlUmlnaHQ8TGlzdE5vZGU8VD5bXT4oKG5vZGVzLCB2YWx1ZSkgPT4ge1xuICAgICAgbm9kZXMudW5zaGlmdCh0aGlzLmFkZEhlYWQodmFsdWUpKTtcbiAgICAgIHJldHVybiBub2RlcztcbiAgICB9LCBbXSk7XG4gIH1cblxuICBhZGRNYW55VGFpbCh2YWx1ZXM6IFRbXSk6IExpc3ROb2RlPFQ+W10ge1xuICAgIHJldHVybiB2YWx1ZXMubWFwKHZhbHVlID0+IHRoaXMuYWRkVGFpbCh2YWx1ZSkpO1xuICB9XG5cbiAgZHJvcCgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgYnlJbmRleDogKHBvc2l0aW9uOiBudW1iZXIpID0+IHRoaXMuZHJvcEJ5SW5kZXgocG9zaXRpb24pLFxuICAgICAgYnlWYWx1ZTogKC4uLnBhcmFtczogW1RdIHwgW2FueSwgTGlzdENvbXBhcmlzb25GbjxUPl0pID0+XG4gICAgICAgIHRoaXMuZHJvcEJ5VmFsdWUuYXBwbHkodGhpcywgcGFyYW1zKSxcbiAgICAgIGJ5VmFsdWVBbGw6ICguLi5wYXJhbXM6IFtUXSB8IFthbnksIExpc3RDb21wYXJpc29uRm48VD5dKSA9PlxuICAgICAgICB0aGlzLmRyb3BCeVZhbHVlQWxsLmFwcGx5KHRoaXMsIHBhcmFtcyksXG4gICAgICBoZWFkOiAoKSA9PiB0aGlzLmRyb3BIZWFkKCksXG4gICAgICB0YWlsOiAoKSA9PiB0aGlzLmRyb3BUYWlsKCksXG4gICAgfTtcbiAgfVxuXG4gIGRyb3BNYW55KGNvdW50OiBudW1iZXIpIHtcbiAgICByZXR1cm4ge1xuICAgICAgYnlJbmRleDogKHBvc2l0aW9uOiBudW1iZXIpID0+IHRoaXMuZHJvcE1hbnlCeUluZGV4KGNvdW50LCBwb3NpdGlvbiksXG4gICAgICBoZWFkOiAoKSA9PiB0aGlzLmRyb3BNYW55SGVhZChjb3VudCksXG4gICAgICB0YWlsOiAoKSA9PiB0aGlzLmRyb3BNYW55VGFpbChjb3VudCksXG4gICAgfTtcbiAgfVxuXG4gIGRyb3BCeUluZGV4KHBvc2l0aW9uOiBudW1iZXIpOiBMaXN0Tm9kZTxUPiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHBvc2l0aW9uIDwgMCkgcG9zaXRpb24gKz0gdGhpcy5zaXplO1xuXG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMuZ2V0KHBvc2l0aW9uKTtcblxuICAgIHJldHVybiBjdXJyZW50ID8gdGhpcy5kZXRhY2goY3VycmVudCkgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBkcm9wQnlWYWx1ZSh2YWx1ZTogVCk6IExpc3ROb2RlPFQ+IHwgdW5kZWZpbmVkO1xuICBkcm9wQnlWYWx1ZSh2YWx1ZTogYW55LCBjb21wYXJlRm46IExpc3RDb21wYXJpc29uRm48VD4pOiBMaXN0Tm9kZTxUPiB8IHVuZGVmaW5lZDtcbiAgZHJvcEJ5VmFsdWUodmFsdWU6IGFueSwgY29tcGFyZUZuOiBMaXN0Q29tcGFyaXNvbkZuPFQ+ID0gY29tcGFyZSk6IExpc3ROb2RlPFQ+IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBwb3NpdGlvbiA9IHRoaXMuZmluZEluZGV4KG5vZGUgPT4gY29tcGFyZUZuKG5vZGUudmFsdWUsIHZhbHVlKSk7XG5cbiAgICByZXR1cm4gcG9zaXRpb24gPCAwID8gdW5kZWZpbmVkIDogdGhpcy5kcm9wQnlJbmRleChwb3NpdGlvbik7XG4gIH1cblxuICBkcm9wQnlWYWx1ZUFsbCh2YWx1ZTogVCk6IExpc3ROb2RlPFQ+W107XG4gIGRyb3BCeVZhbHVlQWxsKHZhbHVlOiBhbnksIGNvbXBhcmVGbjogTGlzdENvbXBhcmlzb25GbjxUPik6IExpc3ROb2RlPFQ+W107XG4gIGRyb3BCeVZhbHVlQWxsKHZhbHVlOiBhbnksIGNvbXBhcmVGbjogTGlzdENvbXBhcmlzb25GbjxUPiA9IGNvbXBhcmUpOiBMaXN0Tm9kZTxUPltdIHtcbiAgICBjb25zdCBkcm9wcGVkOiBMaXN0Tm9kZTxUPltdID0gW107XG5cbiAgICBmb3IgKGxldCBjdXJyZW50ID0gdGhpcy5maXJzdCwgcG9zaXRpb24gPSAwOyBjdXJyZW50OyBwb3NpdGlvbisrLCBjdXJyZW50ID0gY3VycmVudC5uZXh0KSB7XG4gICAgICBpZiAoY29tcGFyZUZuKGN1cnJlbnQudmFsdWUsIHZhbHVlKSkge1xuICAgICAgICBkcm9wcGVkLnB1c2godGhpcy5kcm9wQnlJbmRleChwb3NpdGlvbiAtIGRyb3BwZWQubGVuZ3RoKSEpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBkcm9wcGVkO1xuICB9XG5cbiAgZHJvcEhlYWQoKTogTGlzdE5vZGU8VD4gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGhlYWQgPSB0aGlzLmZpcnN0O1xuXG4gICAgaWYgKGhlYWQpIHtcbiAgICAgIHRoaXMuZmlyc3QgPSBoZWFkLm5leHQ7XG5cbiAgICAgIGlmICh0aGlzLmZpcnN0KSB0aGlzLmZpcnN0LnByZXZpb3VzID0gdW5kZWZpbmVkO1xuICAgICAgZWxzZSB0aGlzLmxhc3QgPSB1bmRlZmluZWQ7XG5cbiAgICAgIHRoaXMuc2l6ZS0tO1xuXG4gICAgICByZXR1cm4gaGVhZDtcbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgZHJvcFRhaWwoKTogTGlzdE5vZGU8VD4gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHRhaWwgPSB0aGlzLmxhc3Q7XG5cbiAgICBpZiAodGFpbCkge1xuICAgICAgdGhpcy5sYXN0ID0gdGFpbC5wcmV2aW91cztcblxuICAgICAgaWYgKHRoaXMubGFzdCkgdGhpcy5sYXN0Lm5leHQgPSB1bmRlZmluZWQ7XG4gICAgICBlbHNlIHRoaXMuZmlyc3QgPSB1bmRlZmluZWQ7XG5cbiAgICAgIHRoaXMuc2l6ZS0tO1xuXG4gICAgICByZXR1cm4gdGFpbDtcbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgZHJvcE1hbnlCeUluZGV4KGNvdW50OiBudW1iZXIsIHBvc2l0aW9uOiBudW1iZXIpOiBMaXN0Tm9kZTxUPltdIHtcbiAgICBpZiAoY291bnQgPD0gMCkgcmV0dXJuIFtdO1xuXG4gICAgaWYgKHBvc2l0aW9uIDwgMCkgcG9zaXRpb24gPSBNYXRoLm1heChwb3NpdGlvbiArIHRoaXMuc2l6ZSwgMCk7XG4gICAgZWxzZSBpZiAocG9zaXRpb24gPj0gdGhpcy5zaXplKSByZXR1cm4gW107XG5cbiAgICBjb3VudCA9IE1hdGgubWluKGNvdW50LCB0aGlzLnNpemUgLSBwb3NpdGlvbik7XG5cbiAgICBjb25zdCBkcm9wcGVkOiBMaXN0Tm9kZTxUPltdID0gW107XG5cbiAgICB3aGlsZSAoY291bnQtLSkge1xuICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMuZ2V0KHBvc2l0aW9uKTtcbiAgICAgIGRyb3BwZWQucHVzaCh0aGlzLmRldGFjaChjdXJyZW50ISkhKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZHJvcHBlZDtcbiAgfVxuXG4gIGRyb3BNYW55SGVhZChjb3VudDogRXhjbHVkZTxudW1iZXIsIDA+KTogTGlzdE5vZGU8VD5bXSB7XG4gICAgaWYgKGNvdW50IDw9IDApIHJldHVybiBbXTtcblxuICAgIGNvdW50ID0gTWF0aC5taW4oY291bnQsIHRoaXMuc2l6ZSk7XG5cbiAgICBjb25zdCBkcm9wcGVkOiBMaXN0Tm9kZTxUPltdID0gW107XG5cbiAgICB3aGlsZSAoY291bnQtLSkgZHJvcHBlZC51bnNoaWZ0KHRoaXMuZHJvcEhlYWQoKSEpO1xuXG4gICAgcmV0dXJuIGRyb3BwZWQ7XG4gIH1cblxuICBkcm9wTWFueVRhaWwoY291bnQ6IEV4Y2x1ZGU8bnVtYmVyLCAwPik6IExpc3ROb2RlPFQ+W10ge1xuICAgIGlmIChjb3VudCA8PSAwKSByZXR1cm4gW107XG5cbiAgICBjb3VudCA9IE1hdGgubWluKGNvdW50LCB0aGlzLnNpemUpO1xuXG4gICAgY29uc3QgZHJvcHBlZDogTGlzdE5vZGU8VD5bXSA9IFtdO1xuXG4gICAgd2hpbGUgKGNvdW50LS0pIGRyb3BwZWQucHVzaCh0aGlzLmRyb3BUYWlsKCkhKTtcblxuICAgIHJldHVybiBkcm9wcGVkO1xuICB9XG5cbiAgZmluZChwcmVkaWNhdGU6IExpc3RJdGVyYXRvckZuPFQ+KTogTGlzdE5vZGU8VD4gfCB1bmRlZmluZWQge1xuICAgIGZvciAobGV0IGN1cnJlbnQgPSB0aGlzLmZpcnN0LCBwb3NpdGlvbiA9IDA7IGN1cnJlbnQ7IHBvc2l0aW9uKyssIGN1cnJlbnQgPSBjdXJyZW50Lm5leHQpIHtcbiAgICAgIGlmIChwcmVkaWNhdGUoY3VycmVudCwgcG9zaXRpb24sIHRoaXMpKSByZXR1cm4gY3VycmVudDtcbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgZmluZEluZGV4KHByZWRpY2F0ZTogTGlzdEl0ZXJhdG9yRm48VD4pOiBudW1iZXIge1xuICAgIGZvciAobGV0IGN1cnJlbnQgPSB0aGlzLmZpcnN0LCBwb3NpdGlvbiA9IDA7IGN1cnJlbnQ7IHBvc2l0aW9uKyssIGN1cnJlbnQgPSBjdXJyZW50Lm5leHQpIHtcbiAgICAgIGlmIChwcmVkaWNhdGUoY3VycmVudCwgcG9zaXRpb24sIHRoaXMpKSByZXR1cm4gcG9zaXRpb247XG4gICAgfVxuXG4gICAgcmV0dXJuIC0xO1xuICB9XG5cbiAgZm9yRWFjaDxSID0gYm9vbGVhbj4oaXRlcmF0b3JGbjogTGlzdEl0ZXJhdG9yRm48VCwgUj4pIHtcbiAgICBmb3IgKGxldCBub2RlID0gdGhpcy5maXJzdCwgcG9zaXRpb24gPSAwOyBub2RlOyBwb3NpdGlvbisrLCBub2RlID0gbm9kZS5uZXh0KSB7XG4gICAgICBpdGVyYXRvckZuKG5vZGUsIHBvc2l0aW9uLCB0aGlzKTtcbiAgICB9XG4gIH1cblxuICBnZXQocG9zaXRpb246IG51bWJlcik6IExpc3ROb2RlPFQ+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5maW5kKChfLCBpbmRleCkgPT4gcG9zaXRpb24gPT09IGluZGV4KTtcbiAgfVxuXG4gIGluZGV4T2YodmFsdWU6IFQpOiBudW1iZXI7XG4gIGluZGV4T2YodmFsdWU6IGFueSwgY29tcGFyZUZuOiBMaXN0Q29tcGFyaXNvbkZuPFQ+KTogbnVtYmVyO1xuICBpbmRleE9mKHZhbHVlOiBhbnksIGNvbXBhcmVGbjogTGlzdENvbXBhcmlzb25GbjxUPiA9IGNvbXBhcmUpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmZpbmRJbmRleChub2RlID0+IGNvbXBhcmVGbihub2RlLnZhbHVlLCB2YWx1ZSkpO1xuICB9XG5cbiAgdG9BcnJheSgpOiBUW10ge1xuICAgIGNvbnN0IGFycmF5ID0gbmV3IEFycmF5KHRoaXMuc2l6ZSk7XG5cbiAgICB0aGlzLmZvckVhY2goKG5vZGUsIGluZGV4KSA9PiAoYXJyYXlbaW5kZXghXSA9IG5vZGUudmFsdWUpKTtcblxuICAgIHJldHVybiBhcnJheTtcbiAgfVxuXG4gIHRvTm9kZUFycmF5KCk6IExpc3ROb2RlPFQ+W10ge1xuICAgIGNvbnN0IGFycmF5ID0gbmV3IEFycmF5KHRoaXMuc2l6ZSk7XG5cbiAgICB0aGlzLmZvckVhY2goKG5vZGUsIGluZGV4KSA9PiAoYXJyYXlbaW5kZXghXSA9IG5vZGUpKTtcblxuICAgIHJldHVybiBhcnJheTtcbiAgfVxuXG4gIHRvU3RyaW5nKG1hcHBlckZuOiBMaXN0TWFwcGVyRm48VD4gPSBKU09OLnN0cmluZ2lmeSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudG9BcnJheSgpXG4gICAgICAubWFwKHZhbHVlID0+IG1hcHBlckZuKHZhbHVlKSlcbiAgICAgIC5qb2luKCcgPC0+ICcpO1xuICB9XG5cbiAgLy8gQ2Fubm90IHVzZSBHZW5lcmF0b3IgdHlwZSBiZWNhdXNlIG9mIG5nLXBhY2thZ3JcbiAgKltTeW1ib2wuaXRlcmF0b3JdKCk6IGFueSB7XG4gICAgZm9yIChsZXQgbm9kZSA9IHRoaXMuZmlyc3QsIHBvc2l0aW9uID0gMDsgbm9kZTsgcG9zaXRpb24rKywgbm9kZSA9IG5vZGUubmV4dCkge1xuICAgICAgeWllbGQgbm9kZS52YWx1ZTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IHR5cGUgTGlzdE1hcHBlckZuPFQgPSBhbnk+ID0gKHZhbHVlOiBUKSA9PiBhbnk7XG5cbmV4cG9ydCB0eXBlIExpc3RDb21wYXJpc29uRm48VCA9IGFueT4gPSAodmFsdWUxOiBULCB2YWx1ZTI6IGFueSkgPT4gYm9vbGVhbjtcblxuZXhwb3J0IHR5cGUgTGlzdEl0ZXJhdG9yRm48VCA9IGFueSwgUiA9IGJvb2xlYW4+ID0gKFxuICBub2RlOiBMaXN0Tm9kZTxUPixcbiAgaW5kZXg/OiBudW1iZXIsXG4gIGxpc3Q/OiBMaW5rZWRMaXN0LFxuKSA9PiBSO1xuIl19
1
+ /* tslint:disable:no-non-null-assertion */
2
+ import compare from 'just-compare';
3
+ export class ListNode {
4
+ constructor(value) {
5
+ this.value = value;
6
+ }
7
+ }
8
+ export class LinkedList {
9
+ constructor() {
10
+ this.size = 0;
11
+ }
12
+ get head() {
13
+ return this.first;
14
+ }
15
+ get tail() {
16
+ return this.last;
17
+ }
18
+ get length() {
19
+ return this.size;
20
+ }
21
+ attach(value, previousNode, nextNode) {
22
+ if (!previousNode)
23
+ return this.addHead(value);
24
+ if (!nextNode)
25
+ return this.addTail(value);
26
+ const node = new ListNode(value);
27
+ node.previous = previousNode;
28
+ previousNode.next = node;
29
+ node.next = nextNode;
30
+ nextNode.previous = node;
31
+ this.size++;
32
+ return node;
33
+ }
34
+ attachMany(values, previousNode, nextNode) {
35
+ if (!values.length)
36
+ return [];
37
+ if (!previousNode)
38
+ return this.addManyHead(values);
39
+ if (!nextNode)
40
+ return this.addManyTail(values);
41
+ const list = new LinkedList();
42
+ list.addManyTail(values);
43
+ list.first.previous = previousNode;
44
+ previousNode.next = list.first;
45
+ list.last.next = nextNode;
46
+ nextNode.previous = list.last;
47
+ this.size += values.length;
48
+ return list.toNodeArray();
49
+ }
50
+ detach(node) {
51
+ if (!node.previous)
52
+ return this.dropHead();
53
+ if (!node.next)
54
+ return this.dropTail();
55
+ node.previous.next = node.next;
56
+ node.next.previous = node.previous;
57
+ this.size--;
58
+ return node;
59
+ }
60
+ add(value) {
61
+ return {
62
+ after: (...params) => this.addAfter.call(this, value, ...params),
63
+ before: (...params) => this.addBefore.call(this, value, ...params),
64
+ byIndex: (position) => this.addByIndex(value, position),
65
+ head: () => this.addHead(value),
66
+ tail: () => this.addTail(value),
67
+ };
68
+ }
69
+ addMany(values) {
70
+ return {
71
+ after: (...params) => this.addManyAfter.call(this, values, ...params),
72
+ before: (...params) => this.addManyBefore.call(this, values, ...params),
73
+ byIndex: (position) => this.addManyByIndex(values, position),
74
+ head: () => this.addManyHead(values),
75
+ tail: () => this.addManyTail(values),
76
+ };
77
+ }
78
+ addAfter(value, previousValue, compareFn = compare) {
79
+ const previous = this.find(node => compareFn(node.value, previousValue));
80
+ return previous ? this.attach(value, previous, previous.next) : this.addTail(value);
81
+ }
82
+ addBefore(value, nextValue, compareFn = compare) {
83
+ const next = this.find(node => compareFn(node.value, nextValue));
84
+ return next ? this.attach(value, next.previous, next) : this.addHead(value);
85
+ }
86
+ addByIndex(value, position) {
87
+ if (position < 0)
88
+ position += this.size;
89
+ else if (position >= this.size)
90
+ return this.addTail(value);
91
+ if (position <= 0)
92
+ return this.addHead(value);
93
+ const next = this.get(position);
94
+ return this.attach(value, next.previous, next);
95
+ }
96
+ addHead(value) {
97
+ const node = new ListNode(value);
98
+ node.next = this.first;
99
+ if (this.first)
100
+ this.first.previous = node;
101
+ else
102
+ this.last = node;
103
+ this.first = node;
104
+ this.size++;
105
+ return node;
106
+ }
107
+ addTail(value) {
108
+ const node = new ListNode(value);
109
+ if (this.first) {
110
+ node.previous = this.last;
111
+ this.last.next = node;
112
+ this.last = node;
113
+ }
114
+ else {
115
+ this.first = node;
116
+ this.last = node;
117
+ }
118
+ this.size++;
119
+ return node;
120
+ }
121
+ addManyAfter(values, previousValue, compareFn = compare) {
122
+ const previous = this.find(node => compareFn(node.value, previousValue));
123
+ return previous ? this.attachMany(values, previous, previous.next) : this.addManyTail(values);
124
+ }
125
+ addManyBefore(values, nextValue, compareFn = compare) {
126
+ const next = this.find(node => compareFn(node.value, nextValue));
127
+ return next ? this.attachMany(values, next.previous, next) : this.addManyHead(values);
128
+ }
129
+ addManyByIndex(values, position) {
130
+ if (position < 0)
131
+ position += this.size;
132
+ if (position <= 0)
133
+ return this.addManyHead(values);
134
+ if (position >= this.size)
135
+ return this.addManyTail(values);
136
+ const next = this.get(position);
137
+ return this.attachMany(values, next.previous, next);
138
+ }
139
+ addManyHead(values) {
140
+ return values.reduceRight((nodes, value) => {
141
+ nodes.unshift(this.addHead(value));
142
+ return nodes;
143
+ }, []);
144
+ }
145
+ addManyTail(values) {
146
+ return values.map(value => this.addTail(value));
147
+ }
148
+ drop() {
149
+ return {
150
+ byIndex: (position) => this.dropByIndex(position),
151
+ byValue: (...params) => this.dropByValue.apply(this, params),
152
+ byValueAll: (...params) => this.dropByValueAll.apply(this, params),
153
+ head: () => this.dropHead(),
154
+ tail: () => this.dropTail(),
155
+ };
156
+ }
157
+ dropMany(count) {
158
+ return {
159
+ byIndex: (position) => this.dropManyByIndex(count, position),
160
+ head: () => this.dropManyHead(count),
161
+ tail: () => this.dropManyTail(count),
162
+ };
163
+ }
164
+ dropByIndex(position) {
165
+ if (position < 0)
166
+ position += this.size;
167
+ const current = this.get(position);
168
+ return current ? this.detach(current) : undefined;
169
+ }
170
+ dropByValue(value, compareFn = compare) {
171
+ const position = this.findIndex(node => compareFn(node.value, value));
172
+ return position < 0 ? undefined : this.dropByIndex(position);
173
+ }
174
+ dropByValueAll(value, compareFn = compare) {
175
+ const dropped = [];
176
+ for (let current = this.first, position = 0; current; position++, current = current.next) {
177
+ if (compareFn(current.value, value)) {
178
+ dropped.push(this.dropByIndex(position - dropped.length));
179
+ }
180
+ }
181
+ return dropped;
182
+ }
183
+ dropHead() {
184
+ const head = this.first;
185
+ if (head) {
186
+ this.first = head.next;
187
+ if (this.first)
188
+ this.first.previous = undefined;
189
+ else
190
+ this.last = undefined;
191
+ this.size--;
192
+ return head;
193
+ }
194
+ return undefined;
195
+ }
196
+ dropTail() {
197
+ const tail = this.last;
198
+ if (tail) {
199
+ this.last = tail.previous;
200
+ if (this.last)
201
+ this.last.next = undefined;
202
+ else
203
+ this.first = undefined;
204
+ this.size--;
205
+ return tail;
206
+ }
207
+ return undefined;
208
+ }
209
+ dropManyByIndex(count, position) {
210
+ if (count <= 0)
211
+ return [];
212
+ if (position < 0)
213
+ position = Math.max(position + this.size, 0);
214
+ else if (position >= this.size)
215
+ return [];
216
+ count = Math.min(count, this.size - position);
217
+ const dropped = [];
218
+ while (count--) {
219
+ const current = this.get(position);
220
+ dropped.push(this.detach(current));
221
+ }
222
+ return dropped;
223
+ }
224
+ dropManyHead(count) {
225
+ if (count <= 0)
226
+ return [];
227
+ count = Math.min(count, this.size);
228
+ const dropped = [];
229
+ while (count--)
230
+ dropped.unshift(this.dropHead());
231
+ return dropped;
232
+ }
233
+ dropManyTail(count) {
234
+ if (count <= 0)
235
+ return [];
236
+ count = Math.min(count, this.size);
237
+ const dropped = [];
238
+ while (count--)
239
+ dropped.push(this.dropTail());
240
+ return dropped;
241
+ }
242
+ find(predicate) {
243
+ for (let current = this.first, position = 0; current; position++, current = current.next) {
244
+ if (predicate(current, position, this))
245
+ return current;
246
+ }
247
+ return undefined;
248
+ }
249
+ findIndex(predicate) {
250
+ for (let current = this.first, position = 0; current; position++, current = current.next) {
251
+ if (predicate(current, position, this))
252
+ return position;
253
+ }
254
+ return -1;
255
+ }
256
+ forEach(iteratorFn) {
257
+ for (let node = this.first, position = 0; node; position++, node = node.next) {
258
+ iteratorFn(node, position, this);
259
+ }
260
+ }
261
+ get(position) {
262
+ return this.find((_, index) => position === index);
263
+ }
264
+ indexOf(value, compareFn = compare) {
265
+ return this.findIndex(node => compareFn(node.value, value));
266
+ }
267
+ toArray() {
268
+ const array = new Array(this.size);
269
+ this.forEach((node, index) => (array[index] = node.value));
270
+ return array;
271
+ }
272
+ toNodeArray() {
273
+ const array = new Array(this.size);
274
+ this.forEach((node, index) => (array[index] = node));
275
+ return array;
276
+ }
277
+ toString(mapperFn = JSON.stringify) {
278
+ return this.toArray()
279
+ .map(value => mapperFn(value))
280
+ .join(' <-> ');
281
+ }
282
+ // Cannot use Generator type because of ng-packagr
283
+ *[Symbol.iterator]() {
284
+ for (let node = this.first, position = 0; node; position++, node = node.next) {
285
+ yield node.value;
286
+ }
287
+ }
288
+ }
289
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlua2VkLWxpc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9wcm9qZWN0cy91dGlscy9zcmMvbGliL2xpbmtlZC1saXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDBDQUEwQztBQUUxQyxPQUFPLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFFbkMsTUFBTSxPQUFPLFFBQVE7SUFHbkIsWUFBNEIsS0FBUTtRQUFSLFVBQUssR0FBTCxLQUFLLENBQUc7SUFBRyxDQUFDO0NBQ3pDO0FBRUQsTUFBTSxPQUFPLFVBQVU7SUFBdkI7UUFHVSxTQUFJLEdBQUcsQ0FBQyxDQUFDO0lBK1huQixDQUFDO0lBN1hDLElBQUksSUFBSTtRQUNOLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztJQUNwQixDQUFDO0lBQ0QsSUFBSSxJQUFJO1FBQ04sT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQ25CLENBQUM7SUFDRCxJQUFJLE1BQU07UUFDUixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDbkIsQ0FBQztJQUVPLE1BQU0sQ0FDWixLQUFRLEVBQ1IsWUFBcUMsRUFDckMsUUFBaUM7UUFFakMsSUFBSSxDQUFDLFlBQVk7WUFBRSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFOUMsSUFBSSxDQUFDLFFBQVE7WUFBRSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFMUMsTUFBTSxJQUFJLEdBQUcsSUFBSSxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakMsSUFBSSxDQUFDLFFBQVEsR0FBRyxZQUFZLENBQUM7UUFDN0IsWUFBWSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDekIsSUFBSSxDQUFDLElBQUksR0FBRyxRQUFRLENBQUM7UUFDckIsUUFBUSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7UUFFekIsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBRVosT0FB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LEVBQUUsRUFBRSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRTtZQUM1RSxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUM7U0FDbEI7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKiB0c2xpbnQ6ZGlzYWJsZTpuby1ub24tbnVsbC1hc3NlcnRpb24gKi9cclxuXHJcbmltcG9ydCBjb21wYXJlIGZyb20gJ2p1c3QtY29tcGFyZSc7XHJcblxyXG5leHBvcnQgY2xhc3MgTGlzdE5vZGU8VCA9IGFueT4ge1xyXG4gIG5leHQ6IExpc3ROb2RlIHwgdW5kZWZpbmVkO1xyXG4gIHByZXZpb3VzOiBMaXN0Tm9kZSB8IHVuZGVmaW5lZDtcclxuICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgdmFsdWU6IFQpIHt9XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBMaW5rZWRMaXN0PFQgPSBhbnk+IHtcclxuICBwcml2YXRlIGZpcnN0OiBMaXN0Tm9kZTxUPiB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIGxhc3Q6IExpc3ROb2RlPFQ+IHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgc2l6ZSA9IDA7XHJcblxyXG4gIGdldCBoZWFkKCk6IExpc3ROb2RlPFQ+IHwgdW5kZWZpbmVkIHtcclxuICAgIHJldHVybiB0aGlzLmZpcnN0O1xyXG4gIH1cclxuICBnZXQgdGFpbCgpOiBMaXN0Tm9kZTxUPiB8IHVuZGVmaW5lZCB7XHJcbiAgICByZXR1cm4gdGhpcy5sYXN0O1xyXG4gIH1cclxuICBnZXQgbGVuZ3RoKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5zaXplO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhdHRhY2goXHJcbiAgICB2YWx1ZTogVCxcclxuICAgIHByZXZpb3VzTm9kZTogTGlzdE5vZGU8VD4gfCB1bmRlZmluZWQsXHJcbiAgICBuZXh0Tm9kZTogTGlzdE5vZGU8VD4gfCB1bmRlZmluZWQsXHJcbiAgKTogTGlzdE5vZGU8VD4ge1xyXG4gICAgaWYgKCFwcmV2aW91c05vZGUpIHJldHVybiB0aGlzLmFkZEhlYWQodmFsdWUpO1xyXG5cclxuICAgIGlmICghbmV4dE5vZGUpIHJldHVybiB0aGlzLmFkZFRhaWwodmFsdWUpO1xyXG5cclxuICAgIGNvbnN0IG5vZGUgPSBuZXcgTGlzdE5vZGUodmFsdWUpO1xyXG4gICAgbm9kZS5wcmV2aW91cyA9IHByZXZpb3VzTm9kZTtcclxuICAgIHByZXZpb3VzTm9kZS5uZXh0ID0gbm9kZTtcclxuICAgIG5vZGUubmV4dCA9IG5leHROb2RlO1xyXG4gICAgbmV4dE5vZGUucHJldmlvdXMgPSBub2RlO1xyXG5cclxuICAgIHRoaXMuc2l6ZSsrO1xyXG5cclxuICAgIHJldHVybiBub2RlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhdHRhY2hNYW55KFxyXG4gICAgdmFsdWVzOiBUW10sXHJcbiAgICBwcmV2aW91c05vZGU6IExpc3ROb2RlPFQ+IHwgdW5kZWZpbmVkLFxyXG4gICAgbmV4dE5vZGU6IExpc3ROb2RlPFQ+IHwgdW5kZWZpbmVkLFxyXG4gICk6IExpc3ROb2RlPFQ+W10ge1xyXG4gICAgaWYgKCF2YWx1ZXMubGVuZ3RoKSByZXR1cm4gW107XHJcblxyXG4gICAgaWYgKCFwcmV2aW91c05vZGUpIHJldHVybiB0aGlzLmFkZE1hbnlIZWFkKHZhbHVlcyk7XHJcblxyXG4gICAgaWYgKCFuZXh0Tm9kZSkgcmV0dXJuIHRoaXMuYWRkTWFueVRhaWwodmFsdWVzKTtcclxuXHJcbiAgICBjb25zdCBsaXN0ID0gbmV3IExpbmtlZExpc3Q8VD4oKTtcclxuICAgIGxpc3QuYWRkTWFueVRhaWwodmFsdWVzKTtcclxuICAgIGxpc3QuZmlyc3QhLnByZXZpb3VzID0gcHJldmlvdXNOb2RlO1xyXG4gICAgcHJldmlvdXNOb2RlLm5leHQgPSBsaXN0LmZpcnN0O1xyXG4gICAgbGlzdC5sYXN0IS5uZXh0ID0gbmV4dE5vZGU7XHJcbiAgICBuZXh0Tm9kZS5wcmV2aW91cyA9IGxpc3QubGFzdDtcclxuXHJcbiAgICB0aGlzLnNpemUgKz0gdmFsdWVzLmxlbmd0aDtcclxuXHJcbiAgICByZXR1cm4gbGlzdC50b05vZGVBcnJheSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBkZXRhY2gobm9kZTogTGlzdE5vZGU8VD4pIHtcclxuICAgIGlmICghbm9kZS5wcmV2aW91cykgcmV0dXJuIHRoaXMuZHJvcEhlYWQoKTtcclxuXHJcbiAgICBpZiAoIW5vZGUubmV4dCkgcmV0dXJuIHRoaXMuZHJvcFRhaWwoKTtcclxuXHJcbiAgICBub2RlLnByZXZpb3VzLm5leHQgPSBub2RlLm5leHQ7XHJcbiAgICBub2RlLm5leHQucHJldmlvdXMgPSBub2RlLnByZXZpb3VzO1xyXG5cclxuICAgIHRoaXMuc2l6ZS0tO1xyXG5cclxuICAgIHJldHVybiBub2RlO1xyXG4gIH1cclxuXHJcbiAgYWRkKHZhbHVlOiBUKSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBhZnRlcjogKC4uLnBhcmFtczogW1RdIHwgW2FueSwgTGlzdENvbXBhcmlzb25GbjxUPl0pID0+XHJcbiAgICAgICAgdGhpcy5hZGRBZnRlci5jYWxsKHRoaXMsIHZhbHVlLCAuLi5wYXJhbXMpLFxyXG4gICAgICBiZWZvcmU6ICguLi5wYXJhbXM6IFtUXSB8IFthbnksIExpc3RDb21wYXJpc29uRm48VD5dKSA9PlxyXG4gICAgICAgIHRoaXMuYWRkQmVmb3JlLmNhbGwodGhpcywgdmFsdWUsIC4uLnBhcmFtcyksXHJcbiAgICAgIGJ5SW5kZXg6IChwb3NpdGlvbjogbnVtYmVyKSA9PiB0aGlzLmFkZEJ5SW5kZXgodmFsdWUsIHBvc2l0aW9uKSxcclxuICAgICAgaGVhZDogKCkgPT4gdGhpcy5hZGRIZWFkKHZhbHVlKSxcclxuICAgICAgdGFpbDogKCkgPT4gdGhpcy5hZGRUYWlsKHZhbHVlKSxcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBhZGRNYW55KHZhbHVlczogVFtdKSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBhZnRlcjogKC4uLnBhcmFtczogW1RdIHwgW2FueSwgTGlzdENvbXBhcmlzb25GbjxUPl0pID0+XHJcbiAgICAgICAgdGhpcy5hZGRNYW55QWZ0ZXIuY2FsbCh0aGlzLCB2YWx1ZXMsIC4uLnBhcmFtcyksXHJcbiAgICAgIGJlZm9yZTogKC4uLnBhcmFtczogW1RdIHwgW2FueSwgTGlzdENvbXBhcmlzb25GbjxUPl0pID0+XHJcbiAgICAgICAgdGhpcy5hZGRNYW55QmVmb3JlLmNhbGwodGhpcywgdmFsdWVzLCAuLi5wYXJhbXMpLFxyXG4gICAgICBieUluZGV4OiAocG9zaXRpb246IG51bWJlcikgPT4gdGhpcy5hZGRNYW55QnlJbmRleCh2YWx1ZXMsIHBvc2l0aW9uKSxcclxuICAgICAgaGVhZDogKCkgPT4gdGhpcy5hZGRNYW55SGVhZCh2YWx1ZXMpLFxyXG4gICAgICB0YWlsOiAoKSA9PiB0aGlzLmFkZE1hbnlUYWlsKHZhbHVlcyksXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgYWRkQWZ0ZXIodmFsdWU6IFQsIHByZXZpb3VzVmFsdWU6IFQpOiBMaXN0Tm9kZTxUPjtcclxuICBhZGRBZnRlcih2YWx1ZTogVCwgcHJldmlvdXNWYWx1ZTogYW55LCBjb21wYXJlRm46IExpc3RDb21wYXJpc29uRm48VD4pOiBMaXN0Tm9kZTxUPjtcclxuICBhZGRBZnRlcih2YWx1ZTogVCwgcHJldmlvdXNWYWx1ZTogYW55LCBjb21wYXJlRm46IExpc3RDb21wYXJpc29uRm48VD4gPSBjb21wYXJlKTogTGlzdE5vZGU8VD4ge1xyXG4gICAgY29uc3QgcHJldmlvdXMgPSB0aGlzLmZpbmQobm9kZSA9PiBjb21wYXJlRm4obm9kZS52YWx1ZSwgcHJldmlvdXNWYWx1ZSkpO1xyXG5cclxuICAgIHJldHVybiBwcmV2aW91cyA/IHRoaXMuYXR0YWNoKHZhbHVlLCBwcmV2aW91cywgcHJldmlvdXMubmV4dCkgOiB0aGlzLmFkZFRhaWwodmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgYWRkQmVmb3JlKHZhbHVlOiBULCBuZXh0VmFsdWU6IFQpOiBMaXN0Tm9kZTxUPjtcclxuICBhZGRCZWZvcmUodmFsdWU6IFQsIG5leHRWYWx1ZTogYW55LCBjb21wYXJlRm46IExpc3RDb21wYXJpc29uRm48VD4pOiBMaXN0Tm9kZTxUPjtcclxuICBhZGRCZWZvcmUodmFsdWU6IFQsIG5leHRWYWx1ZTogYW55LCBjb21wYXJlRm46IExpc3RDb21wYXJpc29uRm48VD4gPSBjb21wYXJlKTogTGlzdE5vZGU8VD4ge1xyXG4gICAgY29uc3QgbmV4dCA9IHRoaXMuZmluZChub2RlID0+IGNvbXBhcmVGbihub2RlLnZhbHVlLCBuZXh0VmFsdWUpKTtcclxuXHJcbiAgICByZXR1cm4gbmV4dCA/IHRoaXMuYXR0YWNoKHZhbHVlLCBuZXh0LnByZXZpb3VzLCBuZXh0KSA6IHRoaXMuYWRkSGVhZCh2YWx1ZSk7XHJcbiAgfVxyXG5cclxuICBhZGRCeUluZGV4KHZhbHVlOiBULCBwb3NpdGlvbjogbnVtYmVyKTogTGlzdE5vZGU8VD4ge1xyXG4gICAgaWYgKHBvc2l0aW9uIDwgMCkgcG9zaXRpb24gKz0gdGhpcy5zaXplO1xyXG4gICAgZWxzZSBpZiAocG9zaXRpb24gPj0gdGhpcy5zaXplKSByZXR1cm4gdGhpcy5hZGRUYWlsKHZhbHVlKTtcclxuXHJcbiAgICBpZiAocG9zaXRpb24gPD0gMCkgcmV0dXJuIHRoaXMuYWRkSGVhZCh2YWx1ZSk7XHJcblxyXG4gICAgY29uc3QgbmV4dCA9IHRoaXMuZ2V0KHBvc2l0aW9uKSE7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuYXR0YWNoKHZhbHVlLCBuZXh0LnByZXZpb3VzLCBuZXh0KTtcclxuICB9XHJcblxyXG4gIGFkZEhlYWQodmFsdWU6IFQpOiBMaXN0Tm9kZTxUPiB7XHJcbiAgICBjb25zdCBub2RlID0gbmV3IExpc3ROb2RlKHZhbHVlKTtcclxuXHJcbiAgICBub2RlLm5leHQgPSB0aGlzLmZpcnN0O1xyXG5cclxuICAgIGlmICh0aGlzLmZpcnN0KSB0aGlzLmZpcnN0LnByZXZpb3VzID0gbm9kZTtcclxuICAgIGVsc2UgdGhpcy5sYXN0ID0gbm9kZTtcclxuXHJcbiAgICB0aGlzLmZpcnN0ID0gbm9kZTtcclxuICAgIHRoaXMuc2l6ZSsrO1xyXG5cclxuICAgIHJldHVybiBub2RlO1xyXG4gIH1cclxuXHJcbiAgYWRkVGFpbCh2YWx1ZTogVCk6IExpc3ROb2RlPFQ+IHtcclxuICAgIGNvbnN0IG5vZGUgPSBuZXcgTGlzdE5vZGUodmFsdWUpO1xyXG5cclxuICAgIGlmICh0aGlzLmZpcnN0KSB7XHJcbiAgICAgIG5vZGUucHJldmlvdXMgPSB0aGlzLmxhc3Q7XHJcbiAgICAgIHRoaXMubGFzdCEubmV4dCA9IG5vZGU7XHJcbiAgICAgIHRoaXMubGFzdCA9IG5vZGU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmZpcnN0ID0gbm9kZTtcclxuICAgICAgdGhpcy5sYXN0ID0gbm9kZTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnNpemUrKztcclxuXHJcbiAgICByZXR1cm4gbm9kZTtcclxuICB9XHJcblxyXG4gIGFkZE1hbnlBZnRlcih2YWx1ZXM6IFRbXSwgcHJldmlvdXNWYWx1ZTogVCk6IExpc3ROb2RlPFQ+W107XHJcbiAgYWRkTWFueUFmdGVyKHZhbHVlczogVFtdLCBwcmV2aW91c1ZhbHVlOiBhbnksIGNvbXBhcmVGbjogTGlzdENvbXBhcmlzb25GbjxUPik6IExpc3ROb2RlPFQ+W107XHJcbiAgYWRkTWFueUFmdGVyKFxyXG4gICAgdmFsdWVzOiBUW10sXHJcbiAgICBwcmV2aW91c1ZhbHVlOiBhbnksXHJcbiAgICBjb21wYXJlRm46IExpc3RDb21wYXJpc29uRm48VD4gPSBjb21wYXJlLFxyXG4gICk6IExpc3ROb2RlPFQ+W10ge1xyXG4gICAgY29uc3QgcHJldmlvdXMgPSB0aGlzLmZpbmQobm9kZSA9PiBjb21wYXJlRm4obm9kZS52YWx1ZSwgcHJldmlvdXNWYWx1ZSkpO1xyXG5cclxuICAgIHJldHVybiBwcmV2aW91cyA/IHRoaXMuYXR0YWNoTWFueSh2YWx1ZXMsIHByZXZpb3VzLCBwcmV2aW91cy5uZXh0KSA6IHRoaXMuYWRkTWFueVRhaWwodmFsdWVzKTtcclxuICB9XHJcblxyXG4gIGFkZE1hbnlCZWZvcmUodmFsdWVzOiBUW10sIG5leHRWYWx1ZTogVCk6IExpc3ROb2RlPFQ+W107XHJcbiAgYWRkTWFueUJlZm9yZSh2YWx1ZXM6IFRbXSwgbmV4dFZhbHVlOiBhbnksIGNvbXBhcmVGbjogTGlzdENvbXBhcmlzb25GbjxUPik6IExpc3ROb2RlPFQ+W107XHJcbiAgYWRkTWFueUJlZm9yZShcclxuICAgIHZhbHVlczogVFtdLFxyXG4gICAgbmV4dFZhbHVlOiBhbnksXHJcbiAgICBjb21wYXJlRm46IExpc3RDb21wYXJpc29uRm48VD4gPSBjb21wYXJlLFxyXG4gICk6IExpc3ROb2RlPFQ+W10ge1xyXG4gICAgY29uc3QgbmV4dCA9IHRoaXMuZmluZChub2RlID0+IGNvbXBhcmVGbihub2RlLnZhbHVlLCBuZXh0VmFsdWUpKTtcclxuXHJcbiAgICByZXR1cm4gbmV4dCA/IHRoaXMuYXR0YWNoTWFueSh2YWx1ZXMsIG5leHQucHJldmlvdXMsIG5leHQpIDogdGhpcy5hZGRNYW55SGVhZCh2YWx1ZXMpO1xyXG4gIH1cclxuXHJcbiAgYWRkTWFueUJ5SW5kZXgodmFsdWVzOiBUW10sIHBvc2l0aW9uOiBudW1iZXIpOiBMaXN0Tm9kZTxUPltdIHtcclxuICAgIGlmIChwb3NpdGlvbiA8IDApIHBvc2l0aW9uICs9IHRoaXMuc2l6ZTtcclxuXHJcbiAgICBpZiAocG9zaXRpb24gPD0gMCkgcmV0dXJuIHRoaXMuYWRkTWFueUhlYWQodmFsdWVzKTtcclxuXHJcbiAgICBpZiAocG9zaXRpb24gPj0gdGhpcy5zaXplKSByZXR1cm4gdGhpcy5hZGRNYW55VGFpbCh2YWx1ZXMpO1xyXG5cclxuICAgIGNvbnN0IG5leHQgPSB0aGlzLmdldChwb3NpdGlvbikhO1xyXG5cclxuICAgIHJldHVybiB0aGlzLmF0dGFjaE1hbnkodmFsdWVzLCBuZXh0LnByZXZpb3VzLCBuZXh0KTtcclxuICB9XHJcblxyXG4gIGFkZE1hbnlIZWFkKHZhbHVlczogVFtdKTogTGlzdE5vZGU8VD5bXSB7XHJcbiAgICByZXR1cm4gdmFsdWVzLnJlZHVjZVJpZ2h0PExpc3ROb2RlPFQ+W10+KChub2RlcywgdmFsdWUpID0+IHtcclxuICAgICAgbm9kZXMudW5zaGlmdCh0aGlzLmFkZEhlYWQodmFsdWUpKTtcclxuICAgICAgcmV0dXJuIG5vZGVzO1xyXG4gICAgfSwgW10pO1xyXG4gIH1cclxuXHJcbiAgYWRkTWFueVRhaWwodmFsdWVzOiBUW10pOiBMaXN0Tm9kZTxUPltdIHtcclxuICAgIHJldHVybiB2YWx1ZXMubWFwKHZhbHVlID0+IHRoaXMuYWRkVGFpbCh2YWx1ZSkpO1xyXG4gIH1cclxuXHJcbiAgZHJvcCgpIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGJ5SW5kZXg6IChwb3NpdGlvbjogbnVtYmVyKSA9PiB0aGlzLmRyb3BCeUluZGV4KHBvc2l0aW9uKSxcclxuICAgICAgYnlWYWx1ZTogKC4uLnBhcmFtczogW1RdIHwgW2FueSwgTGlzdENvbXBhcmlzb25GbjxUPl0pID0+XHJcbiAgICAgICAgdGhpcy5kcm9wQnlWYWx1ZS5hcHBseSh0aGlzLCBwYXJhbXMpLFxyXG4gICAgICBieVZhbHVlQWxsOiAoLi4ucGFyYW1zOiBbVF0gfCBbYW55LCBMaXN0Q29tcGFyaXNvbkZuPFQ+XSkgPT5cclxuICAgICAgICB0aGlzLmRyb3BCeVZhbHVlQWxsLmFwcGx5KHRoaXMsIHBhcmFtcyksXHJcbiAgICAgIGhlYWQ6ICgpID0+IHRoaXMuZHJvcEhlYWQoKSxcclxuICAgICAgdGFpbDogKCkgPT4gdGhpcy5kcm9wVGFpbCgpLFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIGRyb3BNYW55KGNvdW50OiBudW1iZXIpIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGJ5SW5kZXg6IChwb3NpdGlvbjogbnVtYmVyKSA9PiB0aGlzLmRyb3BNYW55QnlJbmRleChjb3VudCwgcG9zaXRpb24pLFxyXG4gICAgICBoZWFkOiAoKSA9PiB0aGlzLmRyb3BNYW55SGVhZChjb3VudCksXHJcbiAgICAgIHRhaWw6ICgpID0+IHRoaXMuZHJvcE1hbnlUYWlsKGNvdW50KSxcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBkcm9wQnlJbmRleChwb3NpdGlvbjogbnVtYmVyKTogTGlzdE5vZGU8VD4gfCB1bmRlZmluZWQge1xyXG4gICAgaWYgKHBvc2l0aW9uIDwgMCkgcG9zaXRpb24gKz0gdGhpcy5zaXplO1xyXG5cclxuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmdldChwb3NpdGlvbik7XHJcblxyXG4gICAgcmV0dXJuIGN1cnJlbnQgPyB0aGlzLmRldGFjaChjdXJyZW50KSA6IHVuZGVmaW5lZDtcclxuICB9XHJcblxyXG4gIGRyb3BCeVZhbHVlKHZhbHVlOiBUKTogTGlzdE5vZGU8VD4gfCB1bmRlZmluZWQ7XHJcbiAgZHJvcEJ5VmFsdWUodmFsdWU6IGFueSwgY29tcGFyZUZuOiBMaXN0Q29tcGFyaXNvbkZuPFQ+KTogTGlzdE5vZGU8VD4gfCB1bmRlZmluZWQ7XHJcbiAgZHJvcEJ5VmFsdWUodmFsdWU6IGFueSwgY29tcGFyZUZuOiBMaXN0Q29tcGFyaXNvbkZuPFQ+ID0gY29tcGFyZSk6IExpc3ROb2RlPFQ+IHwgdW5kZWZpbmVkIHtcclxuICAgIGNvbnN0IHBvc2l0aW9uID0gdGhpcy5maW5kSW5kZXgobm9kZSA9PiBjb21wYXJlRm4obm9kZS52YWx1ZSwgdmFsdWUpKTtcclxuXHJcbiAgICByZXR1cm4gcG9zaXRpb24gPCAwID8gdW5kZWZpbmVkIDogdGhpcy5kcm9wQnlJbmRleChwb3NpdGlvbik7XHJcbiAgfVxyXG5cclxuICBkcm9wQnlWYWx1ZUFsbCh2YWx1ZTogVCk6IExpc3ROb2RlPFQ+W107XHJcbiAgZHJvcEJ5VmFsdWVBbGwodmFsdWU6IGFueSwgY29tcGFyZUZuOiBMaXN0Q29tcGFyaXNvbkZuPFQ+KTogTGlzdE5vZGU8VD5bXTtcclxuICBkcm9wQnlWYWx1ZUFsbCh2YWx1ZTogYW55LCBjb21wYXJlRm46IExpc3RDb21wYXJpc29uRm48VD4gPSBjb21wYXJlKTogTGlzdE5vZGU8VD5bXSB7XHJcbiAgICBjb25zdCBkcm9wcGVkOiBMaXN0Tm9kZTxUPltdID0gW107XHJcblxyXG4gICAgZm9yIChsZXQgY3VycmVudCA9IHRoaXMuZmlyc3QsIHBvc2l0aW9uID0gMDsgY3VycmVudDsgcG9zaXRpb24rKywgY3VycmVudCA9IGN1cnJlbnQubmV4dCkge1xyXG4gICAgICBpZiAoY29tcGFyZUZuKGN1cnJlbnQudmFsdWUsIHZhbHVlKSkge1xyXG4gICAgICAgIGRyb3BwZWQucHVzaCh0aGlzLmRyb3BCeUluZGV4KHBvc2l0aW9uIC0gZHJvcHBlZC5sZW5ndGgpISk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZHJvcHBlZDtcclxuICB9XHJcblxyXG4gIGRyb3BIZWFkKCk6IExpc3ROb2RlPFQ+IHwgdW5kZWZpbmVkIHtcclxuICAgIGNvbnN0IGhlYWQgPSB0aGlzLmZpcnN0O1xyXG5cclxuICAgIGlmIChoZWFkKSB7XHJcbiAgICAgIHRoaXMuZmlyc3QgPSBoZWFkLm5leHQ7XHJcblxyXG4gICAgICBpZiAodGhpcy5maXJzdCkgdGhpcy5maXJzdC5wcmV2aW91cyA9IHVuZGVmaW5lZDtcclxuICAgICAgZWxzZSB0aGlzLmxhc3QgPSB1bmRlZmluZWQ7XHJcblxyXG4gICAgICB0aGlzLnNpemUtLTtcclxuXHJcbiAgICAgIHJldHVybiBoZWFkO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICBkcm9wVGFpbCgpOiBMaXN0Tm9kZTxUPiB8IHVuZGVmaW5lZCB7XHJcbiAgICBjb25zdCB0YWlsID0gdGhpcy5sYXN0O1xyXG5cclxuICAgIGlmICh0YWlsKSB7XHJcbiAgICAgIHRoaXMubGFzdCA9IHRhaWwucHJldmlvdXM7XHJcblxyXG4gICAgICBpZiAodGhpcy5sYXN0KSB0aGlzLmxhc3QubmV4dCA9IHVuZGVmaW5lZDtcclxuICAgICAgZWxzZSB0aGlzLmZpcnN0ID0gdW5kZWZpbmVkO1xyXG5cclxuICAgICAgdGhpcy5zaXplLS07XHJcblxyXG4gICAgICByZXR1cm4gdGFpbDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgZHJvcE1hbnlCeUluZGV4KGNvdW50OiBudW1iZXIsIHBvc2l0aW9uOiBudW1iZXIpOiBMaXN0Tm9kZTxUPltdIHtcclxuICAgIGlmIChjb3VudCA8PSAwKSByZXR1cm4gW107XHJcblxyXG4gICAgaWYgKHBvc2l0aW9uIDwgMCkgcG9zaXRpb24gPSBNYXRoLm1heChwb3NpdGlvbiArIHRoaXMuc2l6ZSwgMCk7XHJcbiAgICBlbHNlIGlmIChwb3NpdGlvbiA+PSB0aGlzLnNpemUpIHJldHVybiBbXTtcclxuXHJcbiAgICBjb3VudCA9IE1hdGgubWluKGNvdW50LCB0aGlzLnNpemUgLSBwb3NpdGlvbik7XHJcblxyXG4gICAgY29uc3QgZHJvcHBlZDogTGlzdE5vZGU8VD5bXSA9IFtdO1xyXG5cclxuICAgIHdoaWxlIChjb3VudC0tKSB7XHJcbiAgICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmdldChwb3NpdGlvbik7XHJcbiAgICAgIGRyb3BwZWQucHVzaCh0aGlzLmRldGFjaChjdXJyZW50ISkhKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZHJvcHBlZDtcclxuICB9XHJcblxyXG4gIGRyb3BNYW55SGVhZChjb3VudDogRXhjbHVkZTxudW1iZXIsIDA+KTogTGlzdE5vZGU8VD5bXSB7XHJcbiAgICBpZiAoY291bnQgPD0gMCkgcmV0dXJuIFtdO1xyXG5cclxuICAgIGNvdW50ID0gTWF0aC5taW4oY291bnQsIHRoaXMuc2l6ZSk7XHJcblxyXG4gICAgY29uc3QgZHJvcHBlZDogTGlzdE5vZGU8VD5bXSA9IFtdO1xyXG5cclxuICAgIHdoaWxlIChjb3VudC0tKSBkcm9wcGVkLnVuc2hpZnQodGhpcy5kcm9wSGVhZCgpISk7XHJcblxyXG4gICAgcmV0dXJuIGRyb3BwZWQ7XHJcbiAgfVxyXG5cclxuICBkcm9wTWFueVRhaWwoY291bnQ6IEV4Y2x1ZGU8bnVtYmVyLCAwPik6IExpc3ROb2RlPFQ+W10ge1xyXG4gICAgaWYgKGNvdW50IDw9IDApIHJldHVybiBbXTtcclxuXHJcbiAgICBjb3VudCA9IE1hdGgubWluKGNvdW50LCB0aGlzLnNpemUpO1xyXG5cclxuICAgIGNvbnN0IGRyb3BwZWQ6IExpc3ROb2RlPFQ+W10gPSBbXTtcclxuXHJcbiAgICB3aGlsZSAoY291bnQtLSkgZHJvcHBlZC5wdXNoKHRoaXMuZHJvcFRhaWwoKSEpO1xyXG5cclxuICAgIHJldHVybiBkcm9wcGVkO1xyXG4gIH1cclxuXHJcbiAgZmluZChwcmVkaWNhdGU6IExpc3RJdGVyYXRvckZuPFQ+KTogTGlzdE5vZGU8VD4gfCB1bmRlZmluZWQge1xyXG4gICAgZm9yIChsZXQgY3VycmVudCA9IHRoaXMuZmlyc3QsIHBvc2l0aW9uID0gMDsgY3VycmVudDsgcG9zaXRpb24rKywgY3VycmVudCA9IGN1cnJlbnQubmV4dCkge1xyXG4gICAgICBpZiAocHJlZGljYXRlKGN1cnJlbnQsIHBvc2l0aW9uLCB0aGlzKSkgcmV0dXJuIGN1cnJlbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICB9XHJcblxyXG4gIGZpbmRJbmRleChwcmVkaWNhdGU6IExpc3RJdGVyYXRvckZuPFQ+KTogbnVtYmVyIHtcclxuICAgIGZvciAobGV0IGN1cnJlbnQgPSB0aGlzLmZpcnN0LCBwb3NpdGlvbiA9IDA7IGN1cnJlbnQ7IHBvc2l0aW9uKyssIGN1cnJlbnQgPSBjdXJyZW50Lm5leHQpIHtcclxuICAgICAgaWYgKHByZWRpY2F0ZShjdXJyZW50LCBwb3NpdGlvbiwgdGhpcykpIHJldHVybiBwb3NpdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gLTE7XHJcbiAgfVxyXG5cclxuICBmb3JFYWNoPFIgPSBib29sZWFuPihpdGVyYXRvckZuOiBMaXN0SXRlcmF0b3JGbjxULCBSPikge1xyXG4gICAgZm9yIChsZXQgbm9kZSA9IHRoaXMuZmlyc3QsIHBvc2l0aW9uID0gMDsgbm9kZTsgcG9zaXRpb24rKywgbm9kZSA9IG5vZGUubmV4dCkge1xyXG4gICAgICBpdGVyYXRvckZuKG5vZGUsIHBvc2l0aW9uLCB0aGlzKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldChwb3NpdGlvbjogbnVtYmVyKTogTGlzdE5vZGU8VD4gfCB1bmRlZmluZWQge1xyXG4gICAgcmV0dXJuIHRoaXMuZmluZCgoXywgaW5kZXgpID0+IHBvc2l0aW9uID09PSBpbmRleCk7XHJcbiAgfVxyXG5cclxuICBpbmRleE9mKHZhbHVlOiBUKTogbnVtYmVyO1xyXG4gIGluZGV4T2YodmFsdWU6IGFueSwgY29tcGFyZUZuOiBMaXN0Q29tcGFyaXNvbkZuPFQ+KTogbnVtYmVyO1xyXG4gIGluZGV4T2YodmFsdWU6IGFueSwgY29tcGFyZUZuOiBMaXN0Q29tcGFyaXNvbkZuPFQ+ID0gY29tcGFyZSk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5maW5kSW5kZXgobm9kZSA9PiBjb21wYXJlRm4obm9kZS52YWx1ZSwgdmFsdWUpKTtcclxuICB9XHJcblxyXG4gIHRvQXJyYXkoKTogVFtdIHtcclxuICAgIGNvbnN0IGFycmF5ID0gbmV3IEFycmF5KHRoaXMuc2l6ZSk7XHJcblxyXG4gICAgdGhpcy5mb3JFYWNoKChub2RlLCBpbmRleCkgPT4gKGFycmF5W2luZGV4IV0gPSBub2RlLnZhbHVlKSk7XHJcblxyXG4gICAgcmV0dXJuIGFycmF5O1xyXG4gIH1cclxuXHJcbiAgdG9Ob2RlQXJyYXkoKTogTGlzdE5vZGU8VD5bXSB7XHJcbiAgICBjb25zdCBhcnJheSA9IG5ldyBBcnJheSh0aGlzLnNpemUpO1xyXG5cclxuICAgIHRoaXMuZm9yRWFjaCgobm9kZSwgaW5kZXgpID0+IChhcnJheVtpbmRleCFdID0gbm9kZSkpO1xyXG5cclxuICAgIHJldHVybiBhcnJheTtcclxuICB9XHJcblxyXG4gIHRvU3RyaW5nKG1hcHBlckZuOiBMaXN0TWFwcGVyRm48VD4gPSBKU09OLnN0cmluZ2lmeSk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy50b0FycmF5KClcclxuICAgICAgLm1hcCh2YWx1ZSA9PiBtYXBwZXJGbih2YWx1ZSkpXHJcbiAgICAgIC5qb2luKCcgPC0+ICcpO1xyXG4gIH1cclxuXHJcbiAgLy8gQ2Fubm90IHVzZSBHZW5lcmF0b3IgdHlwZSBiZWNhdXNlIG9mIG5nLXBhY2thZ3JcclxuICAqW1N5bWJvbC5pdGVyYXRvcl0oKTogYW55IHtcclxuICAgIGZvciAobGV0IG5vZGUgPSB0aGlzLmZpcnN0LCBwb3NpdGlvbiA9IDA7IG5vZGU7IHBvc2l0aW9uKyssIG5vZGUgPSBub2RlLm5leHQpIHtcclxuICAgICAgeWllbGQgbm9kZS52YWx1ZTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIExpc3RNYXBwZXJGbjxUID0gYW55PiA9ICh2YWx1ZTogVCkgPT4gYW55O1xyXG5cclxuZXhwb3J0IHR5cGUgTGlzdENvbXBhcmlzb25GbjxUID0gYW55PiA9ICh2YWx1ZTE6IFQsIHZhbHVlMjogYW55KSA9PiBib29sZWFuO1xyXG5cclxuZXhwb3J0IHR5cGUgTGlzdEl0ZXJhdG9yRm48VCA9IGFueSwgUiA9IGJvb2xlYW4+ID0gKFxyXG4gIG5vZGU6IExpc3ROb2RlPFQ+LFxyXG4gIGluZGV4PzogbnVtYmVyLFxyXG4gIGxpc3Q/OiBMaW5rZWRMaXN0LFxyXG4pID0+IFI7XHJcbiJdfQ==