@datagrok-libraries/utils 0.0.9 → 0.0.10
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/README.md +2 -2
- package/package.json +29 -29
- package/src/bit-array.d.ts +81 -81
- package/src/bit-array.js +666 -666
- package/src/operations.d.ts +74 -65
- package/src/operations.d.ts.map +1 -1
- package/src/operations.js +155 -144
- package/src/reduce-dimensionality.d.ts +37 -37
- package/src/reduce-dimensionality.js +233 -233
- package/src/sequence-encoder.d.ts +58 -58
- package/src/sequence-encoder.d.ts.map +1 -1
- package/src/sequence-encoder.js +116 -117
- package/src/spe.d.ts +67 -67
- package/src/spe.js +151 -151
- package/src/string-measure.d.ts +32 -32
- package/src/string-measure.js +46 -46
- package/src/string-utils.d.ts +1 -1
- package/src/string-utils.js +9 -9
- package/src/table-validation.d.ts +1 -1
- package/src/table-validation.js +47 -47
- package/src/test-utils.d.ts +10 -10
- package/src/test-utils.js +81 -81
- package/src/type_declarations.d.ts +55 -55
- package/src/type_declarations.js +37 -37
- package/tsconfig.json +71 -71
package/src/bit-array.js
CHANGED
|
@@ -1,666 +1,666 @@
|
|
|
1
|
-
export default class BitArray {
|
|
2
|
-
constructor(arg, defaultValue = false) {
|
|
3
|
-
this._length = 0;
|
|
4
|
-
this._version = 0;
|
|
5
|
-
this._updateLevel = 0;
|
|
6
|
-
this._selectedCount = 0;
|
|
7
|
-
this._selectedCountVersion = -1;
|
|
8
|
-
this._selectedIndexesVersion = -1;
|
|
9
|
-
this._versionedName = '';
|
|
10
|
-
this._versionedNameVersion = -1;
|
|
11
|
-
this.SHRINK_THRESHOLD = 0x100;
|
|
12
|
-
if (typeof arg === 'number') {
|
|
13
|
-
const length = arg;
|
|
14
|
-
let buff = BitArray._createBuffer(length);
|
|
15
|
-
if (defaultValue)
|
|
16
|
-
for (let i = 0; i < buff.length; i++)
|
|
17
|
-
buff[i] = -1;
|
|
18
|
-
this._data = buff;
|
|
19
|
-
this._length = length;
|
|
20
|
-
}
|
|
21
|
-
else if (arg instanceof Uint32Array) {
|
|
22
|
-
this._data = arg;
|
|
23
|
-
this._length = defaultValue;
|
|
24
|
-
}
|
|
25
|
-
else {
|
|
26
|
-
throw new Error("Invalid constructor");
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
getRawData() { return this._data; }
|
|
30
|
-
assureGoez(num, argName) {
|
|
31
|
-
if (num < 0)
|
|
32
|
-
throw new Error(`${argName} should be greater than zero`);
|
|
33
|
-
}
|
|
34
|
-
assureInRange(value, min, max, argName) {
|
|
35
|
-
if ((value < min) || (value > max)) {
|
|
36
|
-
throw new Error(`Argument ${argName} (${value}) out of range (${min}, ${max})`);
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
copy(src, dst, count) {
|
|
40
|
-
for (let i = 0; i < count; i++) {
|
|
41
|
-
dst[i] = src[i];
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
copyFrom(other) {
|
|
45
|
-
if (this._length != other._length) {
|
|
46
|
-
throw new Error(`Lengths differ (${this._length} != ${other._length})`);
|
|
47
|
-
}
|
|
48
|
-
this.copy(other._data, this._data, this.lengthInInts);
|
|
49
|
-
this._version++;
|
|
50
|
-
}
|
|
51
|
-
get length() {
|
|
52
|
-
return this._length;
|
|
53
|
-
}
|
|
54
|
-
get buffer() {
|
|
55
|
-
return this._data;
|
|
56
|
-
}
|
|
57
|
-
set buffer(data) {
|
|
58
|
-
this._data = data;
|
|
59
|
-
this._version++;
|
|
60
|
-
}
|
|
61
|
-
get version() {
|
|
62
|
-
return this._version;
|
|
63
|
-
}
|
|
64
|
-
set version(value) {
|
|
65
|
-
this._version = value;
|
|
66
|
-
}
|
|
67
|
-
incrementVersion(notify = true) {
|
|
68
|
-
this._version++;
|
|
69
|
-
}
|
|
70
|
-
get lengthInInts() {
|
|
71
|
-
return Math.floor((this._length + 0x1f) / 0x20);
|
|
72
|
-
}
|
|
73
|
-
get versionedName() {
|
|
74
|
-
return this._version == this._versionedNameVersion ? this._versionedName : '';
|
|
75
|
-
}
|
|
76
|
-
set versionedName(name) {
|
|
77
|
-
this._versionedName = name;
|
|
78
|
-
this._versionedNameVersion = this._version;
|
|
79
|
-
}
|
|
80
|
-
get self() {
|
|
81
|
-
return this;
|
|
82
|
-
}
|
|
83
|
-
setLength(value) {
|
|
84
|
-
if (value < 0) {
|
|
85
|
-
throw new Error('should be >= 0');
|
|
86
|
-
}
|
|
87
|
-
if (value == this._length)
|
|
88
|
-
return;
|
|
89
|
-
const nIntsNeeded = Math.floor((value + 0x1f) / 0x20);
|
|
90
|
-
if ((nIntsNeeded > this._data.length) || ((nIntsNeeded + this.SHRINK_THRESHOLD) < this._data.length)) {
|
|
91
|
-
const newData = new Uint32Array(nIntsNeeded);
|
|
92
|
-
this.copy(this._data, newData, (nIntsNeeded > this._data.length) ? this._data.length : nIntsNeeded);
|
|
93
|
-
this._data = newData;
|
|
94
|
-
}
|
|
95
|
-
if (value > this._length) {
|
|
96
|
-
if (this._length % 0x20 > 0) {
|
|
97
|
-
this._data[this.lengthInInts - 1] &= (1 << ((this._length % 0x20) & 0x1f)) - 1;
|
|
98
|
-
}
|
|
99
|
-
this._data.fill(0, this.lengthInInts, nIntsNeeded);
|
|
100
|
-
}
|
|
101
|
-
this._length = value;
|
|
102
|
-
this._version++;
|
|
103
|
-
}
|
|
104
|
-
static fromAnd(set1, set2) {
|
|
105
|
-
if (set1._length != set2._length) {
|
|
106
|
-
throw new Error(`Lengths differ (${set1._length} != ${set2._length})`);
|
|
107
|
-
}
|
|
108
|
-
const temp = new BitArray(set1._length);
|
|
109
|
-
temp._length = set1._length;
|
|
110
|
-
temp._data = BitArray._createBuffer(temp._length);
|
|
111
|
-
temp._version = 0;
|
|
112
|
-
const len = set1.lengthInInts;
|
|
113
|
-
for (let i = 0; i < len; i++) {
|
|
114
|
-
temp._data[i] = set1._data[i] & set2._data[i];
|
|
115
|
-
}
|
|
116
|
-
return temp;
|
|
117
|
-
}
|
|
118
|
-
static _createBuffer(length) {
|
|
119
|
-
return new Uint32Array(Math.floor((length + 0x1f) / 0x20));
|
|
120
|
-
}
|
|
121
|
-
static fromValues(values) {
|
|
122
|
-
const temp = new BitArray(values.length);
|
|
123
|
-
temp._version = 0;
|
|
124
|
-
for (let i = 0; i < temp._length; i++) {
|
|
125
|
-
if (values[i]) {
|
|
126
|
-
temp._data[Math.floor(i / 0x20)] |= 1 << ((i % 0x20) & 0x1f);
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
return temp;
|
|
130
|
-
}
|
|
131
|
-
/// Constructs a [BitSet] of length [count], where idx-th bit is determined by a call to [flag] (idx).
|
|
132
|
-
static fromSeq(count, flag) {
|
|
133
|
-
const temp = new BitArray(count);
|
|
134
|
-
for (let i = 0; i < count; ++i) {
|
|
135
|
-
temp.setBit(i, flag(i));
|
|
136
|
-
}
|
|
137
|
-
temp._version = 0;
|
|
138
|
-
return temp;
|
|
139
|
-
}
|
|
140
|
-
/// Constructs a [BitSet] from a string [s] containing '0' or '1'.
|
|
141
|
-
static fromString(s) {
|
|
142
|
-
return BitArray.fromSeq(s.length, (i) => s.charAt(i) == '1');
|
|
143
|
-
}
|
|
144
|
-
/// Constructs a [BitSet], based on length [_length] and byte array [_data].
|
|
145
|
-
static fromUint32Array(_length, _data) {
|
|
146
|
-
const temp = new BitArray(_length);
|
|
147
|
-
temp._data = _data;
|
|
148
|
-
return temp;
|
|
149
|
-
}
|
|
150
|
-
/// Deserializes a [BitSet] from [bytes].
|
|
151
|
-
static fromBytes(bytes) {
|
|
152
|
-
const len = bytes.length;
|
|
153
|
-
const temp = new BitArray(len * 8);
|
|
154
|
-
temp._data = new Uint32Array(Math.floor((len + 3) / 4));
|
|
155
|
-
temp._length = len * 8;
|
|
156
|
-
let num1 = 0;
|
|
157
|
-
let num2 = 0;
|
|
158
|
-
while ((len - num2) >= 4) {
|
|
159
|
-
temp._data[num1++] = (((bytes[num2] & 0xff) |
|
|
160
|
-
((bytes[num2 + 1] & 0xff) << 8)) |
|
|
161
|
-
((bytes[num2 + 2] & 0xff) << 0x10)) |
|
|
162
|
-
((bytes[num2 + 3] & 0xff) << 0x18);
|
|
163
|
-
num2 += 4;
|
|
164
|
-
}
|
|
165
|
-
if (len - num2 == 3) {
|
|
166
|
-
temp._data[num1] = (bytes[num2 + 2] & 0xff) << 0x10;
|
|
167
|
-
}
|
|
168
|
-
if (len - num2 == 2) {
|
|
169
|
-
temp._data[num1] |= (bytes[num2 + 1] & 0xff) << 8;
|
|
170
|
-
}
|
|
171
|
-
if (len - num2 == 1) {
|
|
172
|
-
temp._data[num1] |= bytes[num2] & 0xff;
|
|
173
|
-
}
|
|
174
|
-
temp._version = 0;
|
|
175
|
-
return temp;
|
|
176
|
-
}
|
|
177
|
-
toString() {
|
|
178
|
-
return `${this._length} bits, ${this.countBits(true)} set`;
|
|
179
|
-
}
|
|
180
|
-
/// Performs deep comparison of two bitsets.
|
|
181
|
-
equals(other) {
|
|
182
|
-
if (this == other)
|
|
183
|
-
return true;
|
|
184
|
-
if (other == null)
|
|
185
|
-
return false;
|
|
186
|
-
if (this._length != other._length)
|
|
187
|
-
return false;
|
|
188
|
-
if (this._length == 0)
|
|
189
|
-
return true;
|
|
190
|
-
for (let i = 0; i < this._data.length - 1; i++) {
|
|
191
|
-
if (this._data[i] != other._data[i])
|
|
192
|
-
return false;
|
|
193
|
-
}
|
|
194
|
-
for (let i = (this._data.length - 1) * 8; i < this._length; i++) {
|
|
195
|
-
if (this.getBit(i) != other.getBit(i)) {
|
|
196
|
-
return false;
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
return true;
|
|
200
|
-
}
|
|
201
|
-
/** Clones a bitset. */
|
|
202
|
-
clone() {
|
|
203
|
-
const bitArray = new BitArray(0, false);
|
|
204
|
-
bitArray._data = Uint32Array.from(this._data); // effective length: (lengthInInts)
|
|
205
|
-
bitArray._length = this._length;
|
|
206
|
-
bitArray._version = this._version;
|
|
207
|
-
return bitArray;
|
|
208
|
-
}
|
|
209
|
-
/** Initializes a bitset. */
|
|
210
|
-
init(flag, notify) {
|
|
211
|
-
this.setAll(false, false);
|
|
212
|
-
for (let i = 0; i < this._length; i++) {
|
|
213
|
-
if (flag(i)) {
|
|
214
|
-
this._data[Math.floor(i / 0x20)] |= 1 << ((i % 0x20) & 0x1f);
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
this.incrementVersion(notify);
|
|
218
|
-
return this;
|
|
219
|
-
}
|
|
220
|
-
/// Inverts a bitset.
|
|
221
|
-
invert(notify = true) {
|
|
222
|
-
for (let i = 0; i < this._data.length; i++) {
|
|
223
|
-
this._data[i] ^= -1;
|
|
224
|
-
}
|
|
225
|
-
this.incrementVersion(notify);
|
|
226
|
-
}
|
|
227
|
-
/// Sets all bits to [value], optionally suppressing notifications.
|
|
228
|
-
setAll(value, notify = false) {
|
|
229
|
-
const flags = value ? -1 : 0;
|
|
230
|
-
const len = this.lengthInInts;
|
|
231
|
-
for (let i = 0; i < len; i++) {
|
|
232
|
-
this._data[i] = flags;
|
|
233
|
-
} //todo: optimize
|
|
234
|
-
this.incrementVersion(notify);
|
|
235
|
-
}
|
|
236
|
-
/// Sets bits at [indexes] position to [value].
|
|
237
|
-
/// Clears the bitset if [clear] flag is true.
|
|
238
|
-
/// Change notification is raised when [notify] is true.
|
|
239
|
-
setIndexes(indexes, value = true, clear = true, notify = true) {
|
|
240
|
-
if (clear) {
|
|
241
|
-
this.setAll(!value, false);
|
|
242
|
-
}
|
|
243
|
-
for (const i of indexes) {
|
|
244
|
-
this.setFast(i, value);
|
|
245
|
-
}
|
|
246
|
-
this.incrementVersion(notify);
|
|
247
|
-
}
|
|
248
|
-
everyIndex(indexes, value = true) {
|
|
249
|
-
for (const index of indexes) {
|
|
250
|
-
if (this.getBit(index) != value) {
|
|
251
|
-
return false;
|
|
252
|
-
}
|
|
253
|
-
}
|
|
254
|
-
return true;
|
|
255
|
-
}
|
|
256
|
-
anyIndex(indexes, value = true) {
|
|
257
|
-
for (const index of indexes) {
|
|
258
|
-
if (this.getBit(index) == value) {
|
|
259
|
-
return true;
|
|
260
|
-
}
|
|
261
|
-
}
|
|
262
|
-
return false;
|
|
263
|
-
}
|
|
264
|
-
setWhere(check, value = true, clear = true, notify = true, allowClear = true) {
|
|
265
|
-
if (clear && allowClear) {
|
|
266
|
-
this.setAll(!value, false);
|
|
267
|
-
}
|
|
268
|
-
if (allowClear) {
|
|
269
|
-
for (let i = 0; i < this._length; i++) {
|
|
270
|
-
if (check(i)) {
|
|
271
|
-
this.setFast(i, value);
|
|
272
|
-
}
|
|
273
|
-
}
|
|
274
|
-
}
|
|
275
|
-
else {
|
|
276
|
-
for (let i = 0; i < this._length; i++) {
|
|
277
|
-
this.setFast(i, check(i) ? value : !value);
|
|
278
|
-
}
|
|
279
|
-
}
|
|
280
|
-
this.incrementVersion(notify);
|
|
281
|
-
}
|
|
282
|
-
setRange(from, to, value, notify = true) {
|
|
283
|
-
this.assureInRange(from, 0, this._length - 1, 'from');
|
|
284
|
-
this.assureInRange(to, 0, this._length - 1, 'to');
|
|
285
|
-
const start = Math.min(from, to);
|
|
286
|
-
const end = Math.max(from, to);
|
|
287
|
-
//todo: optimize
|
|
288
|
-
if (value) {
|
|
289
|
-
for (let i = start; i <= end; i++) {
|
|
290
|
-
this.setTrue(i);
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
else {
|
|
294
|
-
for (let i = start; i <= end; i++) {
|
|
295
|
-
this.setFalse(i);
|
|
296
|
-
}
|
|
297
|
-
}
|
|
298
|
-
this.incrementVersion(notify);
|
|
299
|
-
return this;
|
|
300
|
-
}
|
|
301
|
-
/// Sets n randomly chosen bits to value, remaining bits to !value.
|
|
302
|
-
setRandom(n, value, notify = true) {
|
|
303
|
-
if (n < 0 || n > this._length) {
|
|
304
|
-
throw new Error('n must be >= 0 && <= Count');
|
|
305
|
-
}
|
|
306
|
-
if (n > this._length / 2) {
|
|
307
|
-
this.setRandom(this._length - n, !value);
|
|
308
|
-
}
|
|
309
|
-
this.setAll(!value);
|
|
310
|
-
for (let k = 0; k < n;) {
|
|
311
|
-
const i = Math.floor(Math.random() * this._length);
|
|
312
|
-
if (this.getBit(i) == value)
|
|
313
|
-
continue;
|
|
314
|
-
this.setFast(i, value);
|
|
315
|
-
k++;
|
|
316
|
-
}
|
|
317
|
-
this.incrementVersion(notify);
|
|
318
|
-
}
|
|
319
|
-
/// Modifies current bitset by performing the bitwise AND operation against the
|
|
320
|
-
/// corresponding elements in the specified bitset.
|
|
321
|
-
and(value, notify = true) {
|
|
322
|
-
if (this._length != value._length) {
|
|
323
|
-
throw new Error('Array lengths differ.');
|
|
324
|
-
}
|
|
325
|
-
for (let i = 0, len = this.lengthInInts; i < len; i++) {
|
|
326
|
-
this._data[i] &= value._data[i];
|
|
327
|
-
}
|
|
328
|
-
this.incrementVersion(notify);
|
|
329
|
-
return this;
|
|
330
|
-
}
|
|
331
|
-
/// Performs the bitwise AND NOT operation on the elements in the current bitset
|
|
332
|
-
/// against the corresponding elements in the specified bitset.
|
|
333
|
-
andNot(value, notify = true) {
|
|
334
|
-
if (this._length != value._length) {
|
|
335
|
-
throw new Error('Array lengths differ.');
|
|
336
|
-
}
|
|
337
|
-
const len = this.lengthInInts;
|
|
338
|
-
for (let num2 = 0; num2 < len; num2++) {
|
|
339
|
-
this._data[num2] &= ~value._data[num2];
|
|
340
|
-
}
|
|
341
|
-
this.incrementVersion(notify);
|
|
342
|
-
return this;
|
|
343
|
-
}
|
|
344
|
-
/// Performs the bitwise NOT AND operation on the elements in the current bitset
|
|
345
|
-
/// against the corresponding elements in the specified bitset.
|
|
346
|
-
notAnd(value, notify = true) {
|
|
347
|
-
if (this._length != value._length) {
|
|
348
|
-
throw new Error('Array lengths differ.');
|
|
349
|
-
}
|
|
350
|
-
for (let i = 0, len = this.lengthInInts; i < len; i++) {
|
|
351
|
-
this._data[i] = (~this._data[i]) & value._data[i];
|
|
352
|
-
}
|
|
353
|
-
this.incrementVersion(notify);
|
|
354
|
-
return this;
|
|
355
|
-
}
|
|
356
|
-
/// Inverts all bit values in the current bitset
|
|
357
|
-
not(notify = true) {
|
|
358
|
-
for (let i = 0, len = this.lengthInInts; i < len; i++) {
|
|
359
|
-
this._data[i] = ~this._data[i];
|
|
360
|
-
}
|
|
361
|
-
this.incrementVersion(notify);
|
|
362
|
-
return this;
|
|
363
|
-
}
|
|
364
|
-
/// Performs the bitwise OR operation on the elements in the current bitset
|
|
365
|
-
/// against the corresponding elements in the specified bitset.
|
|
366
|
-
or(value, notify = true) {
|
|
367
|
-
if (this._length != value._length) {
|
|
368
|
-
throw new Error('Array lengths differ.');
|
|
369
|
-
}
|
|
370
|
-
for (let i = 0, len = this.lengthInInts; i < len; i++) {
|
|
371
|
-
this._data[i] |= value._data[i];
|
|
372
|
-
}
|
|
373
|
-
this.incrementVersion(notify);
|
|
374
|
-
return this;
|
|
375
|
-
}
|
|
376
|
-
/// Performs the bitwise exclusive OR operation on the elements in the current bitset
|
|
377
|
-
/// against the corresponding elements in the specified bitset.
|
|
378
|
-
xor(value, notify = true) {
|
|
379
|
-
if (this._length != value._length) {
|
|
380
|
-
throw new Error('Array lengths differ.');
|
|
381
|
-
}
|
|
382
|
-
for (let i = 0, len = this.lengthInInts; i < len; i++) {
|
|
383
|
-
this._data[i] ^= value._data[i];
|
|
384
|
-
}
|
|
385
|
-
this.incrementVersion(notify);
|
|
386
|
-
return this;
|
|
387
|
-
}
|
|
388
|
-
/// Inserts n 0-bits at position pos, resizing self and shifting bits appropriately.
|
|
389
|
-
insertAt(pos, n, flag = false) {
|
|
390
|
-
this.assureInRange(pos, 0, this._length, 'pos');
|
|
391
|
-
if (n == 0)
|
|
392
|
-
return;
|
|
393
|
-
//TODO: optimize
|
|
394
|
-
//the most primitive implementation, optimize it later!
|
|
395
|
-
// beginUpdate();
|
|
396
|
-
const oldlength = this._length;
|
|
397
|
-
this.setLength(this._length + n);
|
|
398
|
-
//if (!contains(!flag)) return; // nothing to do
|
|
399
|
-
for (let i = oldlength - 1; i >= pos; i--) {
|
|
400
|
-
this.setBit(i + n, this.getBit(i));
|
|
401
|
-
}
|
|
402
|
-
for (let i = pos; i < pos + n; i++) {
|
|
403
|
-
this.setBit(i, flag);
|
|
404
|
-
}
|
|
405
|
-
// endUpdate();
|
|
406
|
-
}
|
|
407
|
-
/// Deletes n bits beginning at position pos, resizing self and shifting remaining
|
|
408
|
-
/// bits appropriately.
|
|
409
|
-
removeAt(pos, n = 1) {
|
|
410
|
-
// the most primitive implementation, optimize it later!
|
|
411
|
-
if (n < 0) {
|
|
412
|
-
throw new Error('n cannot be negative');
|
|
413
|
-
}
|
|
414
|
-
this.assureInRange(pos, 0, this._length - n, 'pos');
|
|
415
|
-
if (this.contains(true)) {
|
|
416
|
-
for (let i = pos; i < this._length - n; i++) {
|
|
417
|
-
this.setBit(i, this.getBit(i + n));
|
|
418
|
-
}
|
|
419
|
-
}
|
|
420
|
-
this.setLength(this._length - n);
|
|
421
|
-
}
|
|
422
|
-
removeByMask(mask, flag = true) {
|
|
423
|
-
if (this._length != mask.length) {
|
|
424
|
-
throw new Error('length != mask.length');
|
|
425
|
-
}
|
|
426
|
-
if (mask == this) { // no need to iterate
|
|
427
|
-
this.setLength(mask.countBits(!flag));
|
|
428
|
-
this.setAll(!flag);
|
|
429
|
-
}
|
|
430
|
-
else {
|
|
431
|
-
let dstIdx = 0;
|
|
432
|
-
for (let srcIdx = -1; (srcIdx = mask.findNext(srcIdx, !flag)) != -1;) {
|
|
433
|
-
this.setFast(dstIdx++, this.getBit(srcIdx));
|
|
434
|
-
}
|
|
435
|
-
this._length = dstIdx;
|
|
436
|
-
this._version++;
|
|
437
|
-
}
|
|
438
|
-
return this;
|
|
439
|
-
}
|
|
440
|
-
/// Similar to the [] operator.
|
|
441
|
-
getBit(pos) {
|
|
442
|
-
return (this._data[Math.floor(pos / 0x20)] & (1 << (pos & 0x1f))) != 0;
|
|
443
|
-
}
|
|
444
|
-
/// Similar to the [] operator.
|
|
445
|
-
setBit(pos, bit, notify = true) {
|
|
446
|
-
this.setFast(pos, bit);
|
|
447
|
-
if (notify) {
|
|
448
|
-
this._version++;
|
|
449
|
-
}
|
|
450
|
-
else {
|
|
451
|
-
this._version++;
|
|
452
|
-
}
|
|
453
|
-
}
|
|
454
|
-
/// Sets [i]-th bit to [value], does not check bounds, does not increment version
|
|
455
|
-
setFast(i, value) {
|
|
456
|
-
if (value) {
|
|
457
|
-
this._data[Math.floor(i / 0x20)] |= 1 << (i & 0x1f);
|
|
458
|
-
}
|
|
459
|
-
else {
|
|
460
|
-
this._data[Math.floor(i / 0x20)] &= ~(1 << (i & 0x1f));
|
|
461
|
-
}
|
|
462
|
-
}
|
|
463
|
-
setTrue(pos) {
|
|
464
|
-
this._data[Math.floor(pos / 0x20)] |= 1 << (pos & 0x1f);
|
|
465
|
-
}
|
|
466
|
-
setFalse(pos) {
|
|
467
|
-
this._data[Math.floor(pos / 0x20)] &= ~(1 << (pos & 0x1f));
|
|
468
|
-
}
|
|
469
|
-
trueCount() {
|
|
470
|
-
return this.countBits(true);
|
|
471
|
-
}
|
|
472
|
-
falseCount() {
|
|
473
|
-
return this.countBits(false);
|
|
474
|
-
}
|
|
475
|
-
/// Counts bits of the specified value.
|
|
476
|
-
countBits(value) {
|
|
477
|
-
if (this._length == 0)
|
|
478
|
-
return 0;
|
|
479
|
-
if (this._selectedCountVersion != this._version) {
|
|
480
|
-
this._selectedCount = 0;
|
|
481
|
-
const len = this.lengthInInts;
|
|
482
|
-
let i = 0;
|
|
483
|
-
for (; i < len - 1; i++) {
|
|
484
|
-
for (let k = this._data[i]; k != 0; k >>>= 8) { //todo: cast data[i] to uint
|
|
485
|
-
this._selectedCount += BitArray._onBitCount[k & 0xff];
|
|
486
|
-
}
|
|
487
|
-
}
|
|
488
|
-
// The last int.
|
|
489
|
-
let k = this._data[i];
|
|
490
|
-
const remainingBits = this._length & 0x1f;
|
|
491
|
-
if (remainingBits != 0) { // if remainingBits == 0, the last int is fully used and ALL bits should be left as is.
|
|
492
|
-
k &= ~((4294967295) << remainingBits);
|
|
493
|
-
}
|
|
494
|
-
for (; k != 0; k >>>= 8) {
|
|
495
|
-
this._selectedCount += BitArray._onBitCount[k & 0xff];
|
|
496
|
-
}
|
|
497
|
-
this._selectedCountVersion = this._version;
|
|
498
|
-
}
|
|
499
|
-
return (value ? this._selectedCount : this._length - this._selectedCount);
|
|
500
|
-
}
|
|
501
|
-
/// Returns a number of set bits where also [check] is true
|
|
502
|
-
countWhere(check) {
|
|
503
|
-
let result = 0;
|
|
504
|
-
if (this.trueCount() == this._length) {
|
|
505
|
-
for (let i = 0; i < this._length; i++) {
|
|
506
|
-
result += check(i) ? 1 : 0;
|
|
507
|
-
}
|
|
508
|
-
}
|
|
509
|
-
else {
|
|
510
|
-
for (let i = -1; (i = this.findNext(i, true)) != -1;) {
|
|
511
|
-
result += check(i) ? 1 : 0;
|
|
512
|
-
}
|
|
513
|
-
}
|
|
514
|
-
return result;
|
|
515
|
-
}
|
|
516
|
-
/// Performs bit "and" and counts bits of the specified value, without bitset modification.
|
|
517
|
-
andWithCountBits(second, value) {
|
|
518
|
-
if (this._length == 0)
|
|
519
|
-
return 0;
|
|
520
|
-
let count = 0;
|
|
521
|
-
const len = this.lengthInInts;
|
|
522
|
-
let i = 0;
|
|
523
|
-
for (; i < len - 1; i++) {
|
|
524
|
-
for (var k = this._data[i] & second._data[i]; k != 0; k >>>= 8) {
|
|
525
|
-
count += BitArray._onBitCount[k & 0xff];
|
|
526
|
-
}
|
|
527
|
-
}
|
|
528
|
-
// The last int.
|
|
529
|
-
var k = this._data[i] & second._data[i];
|
|
530
|
-
const remainingBits = this._length & 0x1f;
|
|
531
|
-
if (remainingBits != 0) {
|
|
532
|
-
k &= ~((4294967295) << remainingBits);
|
|
533
|
-
}
|
|
534
|
-
for (; k != 0; k >>>= 8) {
|
|
535
|
-
count += BitArray._onBitCount[k & 0xff];
|
|
536
|
-
}
|
|
537
|
-
return (value ? count : this._length - count);
|
|
538
|
-
}
|
|
539
|
-
clear() {
|
|
540
|
-
this.setLength(0);
|
|
541
|
-
}
|
|
542
|
-
contains(value) {
|
|
543
|
-
return this.findNext(-1, value) >= 0;
|
|
544
|
-
}
|
|
545
|
-
get allTrue() {
|
|
546
|
-
return this.countBits(true) == this._length;
|
|
547
|
-
}
|
|
548
|
-
get allFalse() {
|
|
549
|
-
return this.countBits(false) == this._length;
|
|
550
|
-
}
|
|
551
|
-
get anyTrue() {
|
|
552
|
-
return this.countBits(true) > 0;
|
|
553
|
-
}
|
|
554
|
-
get anyFalse() {
|
|
555
|
-
return this.countBits(false) > 0;
|
|
556
|
-
}
|
|
557
|
-
/// Returns the position of the next bit of the specified value, starting from the specified position.
|
|
558
|
-
/// Returns -1, if there are no such bits.
|
|
559
|
-
findNext(index, value = true) {
|
|
560
|
-
this.assureInRange(index, -1, this._length, 'index');
|
|
561
|
-
if (index >= this._length - 1)
|
|
562
|
-
return -1;
|
|
563
|
-
index = index < 0 ? 0 : index + 1; // skip start
|
|
564
|
-
let unusedBits = index & 0x1f;
|
|
565
|
-
const numInts = this.lengthInInts;
|
|
566
|
-
for (let i = Math.floor(index / 32); i < numInts; i++) {
|
|
567
|
-
let k = (value ? this._data[i] : ~this._data[i]); // uint cast
|
|
568
|
-
if (unusedBits != 0) {
|
|
569
|
-
k &= ((0xffffffff << unusedBits) & 0xffffffff);
|
|
570
|
-
unusedBits = 0;
|
|
571
|
-
}
|
|
572
|
-
else if (!value && k == -4294967296) // looking for false, all bits are set
|
|
573
|
-
{
|
|
574
|
-
continue;
|
|
575
|
-
}
|
|
576
|
-
for (let j = 0; k != 0; j += 8, k >>>= 8) {
|
|
577
|
-
const p = BitArray._firstOnBit[k & 0xff];
|
|
578
|
-
if (p >= 0) {
|
|
579
|
-
index = p + (i * 32) + j;
|
|
580
|
-
if (index >= this._length)
|
|
581
|
-
return -1;
|
|
582
|
-
return index;
|
|
583
|
-
}
|
|
584
|
-
}
|
|
585
|
-
}
|
|
586
|
-
return -1;
|
|
587
|
-
}
|
|
588
|
-
/// Finds previous bit of the specified value in the bitset.
|
|
589
|
-
findPrev(index, value = true) {
|
|
590
|
-
if (index == 0)
|
|
591
|
-
return -1;
|
|
592
|
-
this.assureInRange(index, -1, this._length, 'index');
|
|
593
|
-
index = index < 0 ? this._length - 1 : index - 1; // skip start
|
|
594
|
-
const lastIntIdx = Math.floor(index / 0x20);
|
|
595
|
-
let remainingBits = (index + 1) & 0x1f;
|
|
596
|
-
for (let i = lastIntIdx; i >= 0; i--) {
|
|
597
|
-
let k = (value ? this._data[i] : ~this._data[i]); // cast
|
|
598
|
-
if (remainingBits != 0) {
|
|
599
|
-
k &= ~((4294967295) << remainingBits);
|
|
600
|
-
remainingBits = 0;
|
|
601
|
-
}
|
|
602
|
-
for (let j = 24; k != 0; j -= 8, k <<= 8) {
|
|
603
|
-
const p = BitArray._lastOnBit[k >>> 0x18];
|
|
604
|
-
if (p >= 0) {
|
|
605
|
-
return p + (i * 32) + j;
|
|
606
|
-
}
|
|
607
|
-
}
|
|
608
|
-
}
|
|
609
|
-
return -1;
|
|
610
|
-
}
|
|
611
|
-
}
|
|
612
|
-
BitArray._onBitCount = Int8Array.from([
|
|
613
|
-
0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4,
|
|
614
|
-
1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
|
|
615
|
-
1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
|
|
616
|
-
2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
|
|
617
|
-
1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
|
|
618
|
-
2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
|
|
619
|
-
2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
|
|
620
|
-
3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
|
|
621
|
-
1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
|
|
622
|
-
2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
|
|
623
|
-
2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
|
|
624
|
-
3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
|
|
625
|
-
2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
|
|
626
|
-
3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
|
|
627
|
-
3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
|
|
628
|
-
4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8
|
|
629
|
-
]);
|
|
630
|
-
BitArray._firstOnBit = Int8Array.from([
|
|
631
|
-
-1, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
|
|
632
|
-
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
|
|
633
|
-
5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
|
|
634
|
-
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
|
|
635
|
-
6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
|
|
636
|
-
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
|
|
637
|
-
5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
|
|
638
|
-
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
|
|
639
|
-
7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
|
|
640
|
-
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
|
|
641
|
-
5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
|
|
642
|
-
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
|
|
643
|
-
6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
|
|
644
|
-
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
|
|
645
|
-
5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
|
|
646
|
-
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0
|
|
647
|
-
]);
|
|
648
|
-
BitArray._lastOnBit = Int8Array.from([
|
|
649
|
-
-1, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,
|
|
650
|
-
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
|
|
651
|
-
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
|
|
652
|
-
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
|
|
653
|
-
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
|
|
654
|
-
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
|
|
655
|
-
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
|
|
656
|
-
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
|
|
657
|
-
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
|
|
658
|
-
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
|
|
659
|
-
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
|
|
660
|
-
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
|
|
661
|
-
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
|
|
662
|
-
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
|
|
663
|
-
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
|
|
664
|
-
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7
|
|
665
|
-
]);
|
|
666
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYml0LWFycmF5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiYml0LWFycmF5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBQyxPQUFPLE9BQU8sUUFBUTtJQW9FM0IsWUFBWSxHQUF5QixFQUFFLGVBQWlDLEtBQUs7UUFackUsWUFBTyxHQUFHLENBQUMsQ0FBQztRQUNaLGFBQVEsR0FBRyxDQUFDLENBQUM7UUFDYixpQkFBWSxHQUFHLENBQUMsQ0FBQztRQUNqQixtQkFBYyxHQUFHLENBQUMsQ0FBQztRQUNuQiwwQkFBcUIsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUMzQiw0QkFBdUIsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUM3QixtQkFBYyxHQUFHLEVBQUUsQ0FBQztRQUNwQiwwQkFBcUIsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNuQyxxQkFBZ0IsR0FBRyxLQUFLLENBQUM7UUFLdkIsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLEVBQUU7WUFDM0IsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDO1lBQ25CLElBQUksSUFBSSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDMUMsSUFBSSxZQUFZO2dCQUNkLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRTtvQkFDbEMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ2pCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO1lBQ2xCLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO1NBQ3ZCO2FBQU0sSUFBSSxHQUFHLFlBQVksV0FBVyxFQUFFO1lBQ3JDLElBQUksQ0FBQyxLQUFLLEdBQUcsR0FBa0IsQ0FBQztZQUNoQyxJQUFJLENBQUMsT0FBTyxHQUFHLFlBQXNCLENBQUM7U0FDdkM7YUFBTTtZQUNMLE1BQU0sSUFBSSxLQUFLLENB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QUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQUMsQ0FBQyxDQUFDO0FBRTVDLG9CQUFXLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQztJQUNsQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDL0MsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FBQyxDQUFDLENBQUM7QUFFNUMsbUJBQVUsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDO0lBQ2pDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUMvQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBkZWZhdWx0IGNsYXNzIEJpdEFycmF5IHtcclxuICBzdGF0aWMgX29uQml0Q291bnQgPSBJbnQ4QXJyYXkuZnJvbShbXHJcbiAgICAwLCAxLCAxLCAyLCAxLCAyLCAyLCAzLCAxLCAyLCAyLCAzLCAyLCAzLCAzLCA0LFxyXG4gICAgMSwgMiwgMiwgMywgMiwgMywgMywgNCwgMiwgMywgMywgNCwgMywgNCwgNCwgNSxcclxuICAgIDEsIDIsIDIsIDMsIDIsIDMsIDMsIDQsIDIsIDMsIDMsIDQsIDMsIDQsIDQsIDUsXHJcbiAgICAyLCAzLCAzLCA0LCAzLCA0LCA0LCA1LCAzLCA0LCA0LCA1LCA0LCA1LCA1LCA2LFxyXG4gICAgMSwgMiwgMiwgMywgMiwgMywgMywgNCwgMiwgMywgMywgNCwgMywgNCwgNCwgNSxcclxuICAgIDIsIDMsIDMsIDQsIDMsIDQsIDQsIDUsIDMsIDQsIDQsIDUsIDQsIDUsIDUsIDYsXHJcbiAgICAyLCAzLCAzLCA0LCAzLCA0LCA0LCA1LCAzLCA0LCA0LCA1LCA0LCA1LCA1LCA2LFxyXG4gICAgMywgNCwgNCwgNSwgNCwgNSwgNSwgNiwgNCwgNSwgNSwgNiwgNSwgNiwgNiwgNyxcclxuICAgIDEsIDIsIDIsIDMsIDIsIDMsIDMsIDQsIDIsIDMsIDMsIDQsIDMsIDQsIDQsIDUsXHJcbiAgICAyLCAzLCAzLCA0LCAzLCA0LCA0LCA1LCAzLCA0LCA0LCA1LCA0LCA1LCA1LCA2LFxyXG4gICAgMiwgMywgMywgNCwgMywgNCwgNCwgNSwgMywgNCwgNCwgNSwgNCwgNSwgNSwgNixcclxuICAgIDMsIDQsIDQsIDUsIDQsIDUsIDUsIDYsIDQsIDUsIDUsIDYsIDUsIDYsIDYsIDcsXHJcbiAgICAyLCAzLCAzLCA0LCAzLCA0LCA0LCA1LCAzLCA0LCA0LCA1LCA0LCA1LCA1LCA2LFxyXG4gICAgMywgNCwgNCwgNSwgNCwgNSwgNSwgNiwgNCwgNSwgNSwgNiwgNSwgNiwgNiwgNyxcclxuICAgIDMsIDQsIDQsIDUsIDQsIDUsIDUsIDYsIDQsIDUsIDUsIDYsIDUsIDYsIDYsIDcsXHJcbiAgICA0LCA1LCA1LCA2LCA1LCA2LCA2LCA3LCA1LCA2LCA2LCA3LCA2LCA3LCA3LCA4XSk7XHJcblxyXG4gIHN0YXRpYyBfZmlyc3RPbkJpdCA9IEludDhBcnJheS5mcm9tKFtcclxuICAgIC0xLCAwLCAxLCAwLCAyLCAwLCAxLCAwLCAzLCAwLCAxLCAwLCAyLCAwLCAxLCAwLFxyXG4gICAgNCwgMCwgMSwgMCwgMiwgMCwgMSwgMCwgMywgMCwgMSwgMCwgMiwgMCwgMSwgMCxcclxuICAgIDUsIDAsIDEsIDAsIDIsIDAsIDEsIDAsIDMsIDAsIDEsIDAsIDIsIDAsIDEsIDAsXHJcbiAgICA0LCAwLCAxLCAwLCAyLCAwLCAxLCAwLCAzLCAwLCAxLCAwLCAyLCAwLCAxLCAwLFxyXG4gICAgNiwgMCwgMSwgMCwgMiwgMCwgMSwgMCwgMywgMCwgMSwgMCwgMiwgMCwgMSwgMCxcclxuICAgIDQsIDAsIDEsIDAsIDIsIDAsIDEsIDAsIDMsIDAsIDEsIDAsIDIsIDAsIDEsIDAsXHJcbiAgICA1LCAwLCAxLCAwLCAyLCAwLCAxLCAwLCAzLCAwLCAxLCAwLCAyLCAwLCAxLCAwLFxyXG4gICAgNCwgMCwgMSwgMCwgMiwgMCwgMSwgMCwgMywgMCwgMSwgMCwgMiwgMCwgMSwgMCxcclxuICAgIDcsIDAsIDEsIDAsIDIsIDAsIDEsIDAsIDMsIDAsIDEsIDAsIDIsIDAsIDEsIDAsXHJcbiAgICA0LCAwLCAxLCAwLCAyLCAwLCAxLCAwLCAzLCAwLCAxLCAwLCAyLCAwLCAxLCAwLFxyXG4gICAgNSwgMCwgMSwgMCwgMiwgMCwgMSwgMCwgMywgMCwgMSwgMCwgMiwgMCwgMSwgMCxcclxuICAgIDQsIDAsIDEsIDAsIDIsIDAsIDEsIDAsIDMsIDAsIDEsIDAsIDIsIDAsIDEsIDAsXHJcbiAgICA2LCAwLCAxLCAwLCAyLCAwLCAxLCAwLCAzLCAwLCAxLCAwLCAyLCAwLCAxLCAwLFxyXG4gICAgNCwgMCwgMSwgMCwgMiwgMCwgMSwgMCwgMywgMCwgMSwgMCwgMiwgMCwgMSwgMCxcclxuICAgIDUsIDAsIDEsIDAsIDIsIDAsIDEsIDAsIDMsIDAsIDEsIDAsIDIsIDAsIDEsIDAsXHJcbiAgICA0LCAwLCAxLCAwLCAyLCAwLCAxLCAwLCAzLCAwLCAxLCAwLCAyLCAwLCAxLCAwXSk7XHJcblxyXG4gIHN0YXRpYyBfbGFzdE9uQml0ID0gSW50OEFycmF5LmZyb20oW1xyXG4gICAgLTEsIDAsIDEsIDEsIDIsIDIsIDIsIDIsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsXHJcbiAgICA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LFxyXG4gICAgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSxcclxuICAgIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsXHJcbiAgICA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LFxyXG4gICAgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNixcclxuICAgIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsXHJcbiAgICA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LFxyXG4gICAgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNyxcclxuICAgIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsXHJcbiAgICA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LFxyXG4gICAgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNyxcclxuICAgIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsXHJcbiAgICA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LFxyXG4gICAgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNyxcclxuICAgIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDddKTtcclxuXHJcbiAgcHJpdmF0ZSBfZGF0YTogVWludDMyQXJyYXk7XHJcbiAgcHJpdmF0ZSBfbGVuZ3RoID0gMDtcclxuICBwcml2YXRlIF92ZXJzaW9uID0gMDtcclxuICBwcml2YXRlIF91cGRhdGVMZXZlbCA9IDA7XHJcbiAgcHJpdmF0ZSBfc2VsZWN0ZWRDb3VudCA9IDA7XHJcbiAgcHJpdmF0ZSBfc2VsZWN0ZWRDb3VudFZlcnNpb24gPSAtMTtcclxuICBwcml2YXRlIF9zZWxlY3RlZEluZGV4ZXNWZXJzaW9uID0gLTE7XHJcbiAgcHJpdmF0ZSBfdmVyc2lvbmVkTmFtZSA9ICcnO1xyXG4gIHByaXZhdGUgX3ZlcnNpb25lZE5hbWVWZXJzaW9uID0gLTE7XHJcbiAgU0hSSU5LX1RIUkVTSE9MRCA9IDB4MTAwO1xyXG5cclxuICBjb25zdHJ1Y3RvcihkYXRhOiBVaW50MzJBcnJheSwgbGVuZ3RoOiBudW1iZXIpXHJcbiAgY29uc3RydWN0b3IobGVuZ3RoOiBudW1iZXIsIGRlZmF1bHRWYWx1ZT86IGJvb2xlYW4pXHJcbiAgY29uc3RydWN0b3IoYXJnOiBudW1iZXIgfCBVaW50MzJBcnJheSwgZGVmYXVsdFZhbHVlOiBib29sZWFuIHwgbnVtYmVyID0gZmFsc2UpIHtcclxuICAgIGlmICh0eXBlb2YgYXJnID09PSAnbnVtYmVyJykge1xyXG4gICAgICBjb25zdCBsZW5ndGggPSBhcmc7XHJcbiAgICAgIGxldCBidWZmID0gQml0QXJyYXkuX2NyZWF0ZUJ1ZmZlcihsZW5ndGgpO1xyXG4gICAgICBpZiAoZGVmYXVsdFZhbHVlKVxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnVmZi5sZW5ndGg7IGkrKylcclxuICAgICAgICAgIGJ1ZmZbaV0gPSAtMTtcclxuICAgICAgdGhpcy5fZGF0YSA9IGJ1ZmY7XHJcbiAgICAgIHRoaXMuX2xlbmd0aCA9IGxlbmd0aDtcclxuICAgIH0gZWxzZSBpZiAoYXJnIGluc3RhbmNlb2YgVWludDMyQXJyYXkpIHtcclxuICAgICAgdGhpcy5fZGF0YSA9IGFyZyBhcyBVaW50MzJBcnJheTtcclxuICAgICAgdGhpcy5fbGVuZ3RoID0gZGVmYXVsdFZhbHVlIGFzIG51bWJlcjtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgY29uc3RydWN0b3JcIik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgZ2V0UmF3RGF0YSgpIHsgcmV0dXJuIHRoaXMuX2RhdGE7IH1cclxuXHJcbiAgYXNzdXJlR29leihudW06IG51bWJlciwgYXJnTmFtZTogU3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAobnVtIDwgMCkgdGhyb3cgbmV3IEVycm9yKGAke2FyZ05hbWV9IHNob3VsZCBiZSBncmVhdGVyIHRoYW4gemVyb2ApO1xyXG4gIH1cclxuXHJcbiAgYXNzdXJlSW5SYW5nZSh2YWx1ZTogbnVtYmVyLCBtaW46IG51bWJlciwgbWF4OiBudW1iZXIsIGFyZ05hbWU6IFN0cmluZyk6IHZvaWQge1xyXG4gICAgaWYgKCh2YWx1ZSA8IG1pbikgfHwgKHZhbHVlID4gbWF4KSkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEFyZ3VtZW50ICR7YXJnTmFtZX0gKCR7dmFsdWV9KSBvdXQgb2YgcmFuZ2UgKCR7bWlufSwgJHttYXh9KWApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY29weShzcmM6IFVpbnQzMkFycmF5LCBkc3Q6IFVpbnQzMkFycmF5LCBjb3VudDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcclxuICAgICAgZHN0W2ldID0gc3JjW2ldO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY29weUZyb20ob3RoZXI6IEJpdEFycmF5KTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fbGVuZ3RoICE9IG90aGVyLl9sZW5ndGgpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBMZW5ndGhzIGRpZmZlciAoJHt0aGlzLl9sZW5ndGh9ICE9ICR7b3RoZXIuX2xlbmd0aH0pYCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmNvcHkob3RoZXIuX2RhdGEsIHRoaXMuX2RhdGEsIHRoaXMubGVuZ3RoSW5JbnRzKTtcclxuICAgIHRoaXMuX3ZlcnNpb24rKztcclxuICB9XHJcblxyXG4gIGdldCBsZW5ndGgoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fbGVuZ3RoO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGJ1ZmZlcigpIHtcclxuICAgIHJldHVybiB0aGlzLl9kYXRhO1xyXG4gIH1cclxuXHJcbiAgc2V0IGJ1ZmZlcihkYXRhOiBVaW50MzJBcnJheSkge1xyXG4gICAgdGhpcy5fZGF0YSA9IGRhdGE7XHJcbiAgICB0aGlzLl92ZXJzaW9uKys7XHJcbiAgfVxyXG5cclxuICBnZXQgdmVyc2lvbigpIHtcclxuICAgIHJldHVybiB0aGlzLl92ZXJzaW9uO1xyXG4gIH1cclxuXHJcbiAgc2V0IHZlcnNpb24odmFsdWU6IG51bWJlcikge1xyXG4gICAgdGhpcy5fdmVyc2lvbiA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgaW5jcmVtZW50VmVyc2lvbihub3RpZnkgPSB0cnVlKTogdm9pZCB7XHJcbiAgICB0aGlzLl92ZXJzaW9uKys7XHJcbiAgfVxyXG5cclxuICBnZXQgbGVuZ3RoSW5JbnRzKCkge1xyXG4gICAgcmV0dXJuIE1hdGguZmxvb3IoKHRoaXMuX2xlbmd0aCArIDB4MWYpIC8gMHgyMCk7XHJcbiAgfVxyXG5cclxuICBnZXQgdmVyc2lvbmVkTmFtZSgpIHtcclxuICAgIHJldHVybiB0aGlzLl92ZXJzaW9uID09IHRoaXMuX3ZlcnNpb25lZE5hbWVWZXJzaW9uID8gdGhpcy5fdmVyc2lvbmVkTmFtZSA6ICcnO1xyXG4gIH1cclxuXHJcbiAgc2V0IHZlcnNpb25lZE5hbWUobmFtZTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLl92ZXJzaW9uZWROYW1lID0gbmFtZTtcclxuICAgIHRoaXMuX3ZlcnNpb25lZE5hbWVWZXJzaW9uID0gdGhpcy5fdmVyc2lvbjtcclxuICB9XHJcblxyXG4gIGdldCBzZWxmKCkge1xyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICBzZXRMZW5ndGgodmFsdWU6IG51bWJlcik6IHZvaWQge1xyXG4gICAgaWYgKHZhbHVlIDwgMCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Nob3VsZCBiZSA+PSAwJyk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHZhbHVlID09IHRoaXMuX2xlbmd0aCkgcmV0dXJuO1xyXG4gICAgY29uc3QgbkludHNOZWVkZWQgPSBNYXRoLmZsb29yKCh2YWx1ZSArIDB4MWYpIC8gMHgyMCk7XHJcbiAgICBpZiAoKG5JbnRzTmVlZGVkID4gdGhpcy5fZGF0YS5sZW5ndGgpIHx8ICgobkludHNOZWVkZWQgKyB0aGlzLlNIUklOS19USFJFU0hPTEQpIDwgdGhpcy5fZGF0YS5sZW5ndGgpKSB7XHJcbiAgICAgIGNvbnN0IG5ld0RhdGEgPSBuZXcgVWludDMyQXJyYXkobkludHNOZWVkZWQpO1xyXG4gICAgICB0aGlzLmNvcHkodGhpcy5fZGF0YSwgbmV3RGF0YSwgKG5JbnRzTmVlZGVkID4gdGhpcy5fZGF0YS5sZW5ndGgpID8gdGhpcy5fZGF0YS5sZW5ndGggOiBuSW50c05lZWRlZCk7XHJcbiAgICAgIHRoaXMuX2RhdGEgPSBuZXdEYXRhO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh2YWx1ZSA+IHRoaXMuX2xlbmd0aCkge1xyXG4gICAgICBpZiAodGhpcy5fbGVuZ3RoICUgMHgyMCA+IDApIHtcclxuICAgICAgICB0aGlzLl9kYXRhW3RoaXMubGVuZ3RoSW5JbnRzIC0gMV0gJj0gKDEgPDwgKCh0aGlzLl9sZW5ndGggJSAweDIwKSAmIDB4MWYpKSAtIDE7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5fZGF0YS5maWxsKDAsIHRoaXMubGVuZ3RoSW5JbnRzLCBuSW50c05lZWRlZCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9sZW5ndGggPSB2YWx1ZTtcclxuICAgIHRoaXMuX3ZlcnNpb24rKztcclxuICB9XHJcblxyXG4gIHN0YXRpYyBmcm9tQW5kKHNldDE6IEJpdEFycmF5LCBzZXQyOiBCaXRBcnJheSk6IEJpdEFycmF5IHtcclxuICAgIGlmIChzZXQxLl9sZW5ndGggIT0gc2V0Mi5fbGVuZ3RoKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTGVuZ3RocyBkaWZmZXIgKCR7c2V0MS5fbGVuZ3RofSAhPSAke3NldDIuX2xlbmd0aH0pYCk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgdGVtcCA9IG5ldyBCaXRBcnJheShzZXQxLl9sZW5ndGgpO1xyXG4gICAgdGVtcC5fbGVuZ3RoID0gc2V0MS5fbGVuZ3RoO1xyXG4gICAgdGVtcC5fZGF0YSA9IEJpdEFycmF5Ll9jcmVhdGVCdWZmZXIodGVtcC5fbGVuZ3RoKTtcclxuICAgIHRlbXAuX3ZlcnNpb24gPSAwO1xyXG5cclxuICAgIGNvbnN0IGxlbiA9IHNldDEubGVuZ3RoSW5JbnRzO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICB0ZW1wLl9kYXRhW2ldID0gc2V0MS5fZGF0YVtpXSAmIHNldDIuX2RhdGFbaV07XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGVtcDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3RhdGljIF9jcmVhdGVCdWZmZXIobGVuZ3RoOiBudW1iZXIpOiBVaW50MzJBcnJheSB7XHJcbiAgICByZXR1cm4gbmV3IFVpbnQzMkFycmF5KE1hdGguZmxvb3IoKGxlbmd0aCArIDB4MWYpIC8gMHgyMCkpO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGZyb21WYWx1ZXModmFsdWVzOiBBcnJheTxib29sZWFuPik6IEJpdEFycmF5IHtcclxuICAgIGNvbnN0IHRlbXAgPSBuZXcgQml0QXJyYXkodmFsdWVzLmxlbmd0aCk7XHJcbiAgICB0ZW1wLl92ZXJzaW9uID0gMDtcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRlbXAuX2xlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGlmICh2YWx1ZXNbaV0pIHtcclxuICAgICAgICB0ZW1wLl9kYXRhW01hdGguZmxvb3IoaSAvIDB4MjApXSB8PSAxIDw8ICgoaSAlIDB4MjApICYgMHgxZik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0ZW1wO1xyXG4gIH1cclxuXHJcbiAgLy8vIENvbnN0cnVjdHMgYSBbQml0U2V0XSBvZiBsZW5ndGggW2NvdW50XSwgd2hlcmUgaWR4LXRoIGJpdCBpcyBkZXRlcm1pbmVkIGJ5IGEgY2FsbCB0byBbZmxhZ10gKGlkeCkuXHJcbiAgc3RhdGljIGZyb21TZXEoY291bnQ6IG51bWJlciwgZmxhZzogRnVuY3Rpb24pOiBCaXRBcnJheSB7XHJcbiAgICBjb25zdCB0ZW1wID0gbmV3IEJpdEFycmF5KGNvdW50KTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7ICsraSkge1xyXG4gICAgICB0ZW1wLnNldEJpdChpLCBmbGFnKGkpKTtcclxuICAgIH1cclxuICAgIHRlbXAuX3ZlcnNpb24gPSAwO1xyXG4gICAgcmV0dXJuIHRlbXA7XHJcbiAgfVxyXG5cclxuICAvLy8gQ29uc3RydWN0cyBhIFtCaXRTZXRdIGZyb20gYSBzdHJpbmcgW3NdIGNvbnRhaW5pbmcgJzAnIG9yICcxJy5cclxuICBzdGF0aWMgZnJvbVN0cmluZyhzOiBzdHJpbmcpOiBCaXRBcnJheSB7XHJcbiAgICByZXR1cm4gQml0QXJyYXkuZnJvbVNlcShzLmxlbmd0aCwgKGk6IG51bWJlcikgPT4gcy5jaGFyQXQoaSkgPT0gJzEnKTtcclxuICB9XHJcblxyXG4gIC8vLyBDb25zdHJ1Y3RzIGEgW0JpdFNldF0sIGJhc2VkIG9uIGxlbmd0aCBbX2xlbmd0aF0gYW5kIGJ5dGUgYXJyYXkgW19kYXRhXS5cclxuICBzdGF0aWMgZnJvbVVpbnQzMkFycmF5KF9sZW5ndGg6IG51bWJlciwgX2RhdGE6IFVpbnQzMkFycmF5KTogQml0QXJyYXkge1xyXG4gICAgY29uc3QgdGVtcCA9IG5ldyBCaXRBcnJheShfbGVuZ3RoKTtcclxuICAgIHRlbXAuX2RhdGEgPSBfZGF0YTtcclxuICAgIHJldHVybiB0ZW1wO1xyXG4gIH1cclxuXHJcbiAgLy8vIERlc2VyaWFsaXplcyBhIFtCaXRTZXRdIGZyb20gW2J5dGVzXS5cclxuICBzdGF0aWMgZnJvbUJ5dGVzKGJ5dGVzOiBVaW50OEFycmF5KTogQml0QXJyYXkge1xyXG4gICAgY29uc3QgbGVuID0gYnl0ZXMubGVuZ3RoO1xyXG4gICAgY29uc3QgdGVtcCA9IG5ldyBCaXRBcnJheShsZW4gKiA4KTtcclxuICAgIHRlbXAuX2RhdGEgPSBuZXcgVWludDMyQXJyYXkoTWF0aC5mbG9vcigobGVuICsgMykgLyA0KSk7XHJcbiAgICB0ZW1wLl9sZW5ndGggPSBsZW4gKiA4O1xyXG4gICAgbGV0IG51bTEgPSAwOyBsZXQgbnVtMiA9IDA7XHJcblxyXG4gICAgd2hpbGUgKChsZW4gLSBudW0yKSA+PSA0KSB7XHJcbiAgICAgIHRlbXAuX2RhdGFbbnVtMSsrXSA9IChcclxuICAgICAgICAoKGJ5dGVzW251bTJdICYgMHhmZikgfFxyXG4gICAgICAgICgoYnl0ZXNbbnVtMiArIDFdICYgMHhmZikgPDwgOCkpIHxcclxuICAgICAgICAoKGJ5dGVzW251bTIgKyAyXSAmIDB4ZmYpIDw8IDB4MTApKSB8XHJcbiAgICAgICAgKChieXRlc1tudW0yICsgM10gJiAweGZmKSA8PCAweDE4KTtcclxuXHJcbiAgICAgIG51bTIgKz0gNDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAobGVuIC0gbnVtMiA9PSAzKSB7XHJcbiAgICAgIHRlbXAuX2RhdGFbbnVtMV0gPSAoYnl0ZXNbbnVtMiArIDJdICYgMHhmZikgPDwgMHgxMDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAobGVuIC0gbnVtMiA9PSAyKSB7XHJcbiAgICAgIHRlbXAuX2RhdGFbbnVtMV0gfD0gKGJ5dGVzW251bTIgKyAxXSAmIDB4ZmYpIDw8IDg7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGxlbiAtIG51bTIgPT0gMSkge1xyXG4gICAgICB0ZW1wLl9kYXRhW251bTFdIHw9IGJ5dGVzW251bTJdICYgMHhmZjtcclxuICAgIH1cclxuXHJcbiAgICB0ZW1wLl92ZXJzaW9uID0gMDtcclxuICAgIHJldHVybiB0ZW1wO1xyXG4gIH1cclxuXHJcbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBgJHt0aGlzLl9sZW5ndGh9IGJpdHMsICR7dGhpcy5jb3VudEJpdHModHJ1ZSl9IHNldGA7XHJcbiAgfVxyXG5cclxuICAvLy8gUGVyZm9ybXMgZGVlcCBjb21wYXJpc29uIG9mIHR3byBiaXRzZXRzLlxyXG4gIGVxdWFscyhvdGhlcjogQml0QXJyYXkpOiBib29sZWFuIHtcclxuICAgIGlmICh0aGlzID09IG90aGVyKSByZXR1cm4gdHJ1ZTtcclxuICAgIGlmIChvdGhlciA9PSBudWxsKSByZXR1cm4gZmFsc2U7XHJcbiAgICBpZiAodGhpcy5fbGVuZ3RoICE9IG90aGVyLl9sZW5ndGgpIHJldHVybiBmYWxzZTtcclxuICAgIGlmICh0aGlzLl9sZW5ndGggPT0gMCkgcmV0dXJuIHRydWU7XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9kYXRhLmxlbmd0aCAtIDE7IGkrKykge1xyXG4gICAgICBpZiAodGhpcy5fZGF0YVtpXSAhPSBvdGhlci5fZGF0YVtpXSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGZvciAobGV0IGkgPSAodGhpcy5fZGF0YS5sZW5ndGggLSAxKSAqIDg7IGkgPCB0aGlzLl9sZW5ndGg7IGkrKykge1xyXG4gICAgICBpZiAodGhpcy5nZXRCaXQoaSkgIT0gb3RoZXIuZ2V0Qml0KGkpKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8qKiBDbG9uZXMgYSBiaXRzZXQuICovXHJcbiAgY2xvbmUoKTogQml0QXJyYXkge1xyXG4gICAgY29uc3QgYml0QXJyYXkgPSBuZXcgQml0QXJyYXkoMCwgZmFsc2UpO1xyXG4gICAgYml0QXJyYXkuX2RhdGEgPSBVaW50MzJBcnJheS5mcm9tKHRoaXMuX2RhdGEpOyAvLyBlZmZlY3RpdmUgbGVuZ3RoOiAobGVuZ3RoSW5JbnRzKVxyXG4gICAgYml0QXJyYXkuX2xlbmd0aCA9IHRoaXMuX2xlbmd0aDtcclxuICAgIGJpdEFycmF5Ll92ZXJzaW9uID0gdGhpcy5fdmVyc2lvbjtcclxuICAgIHJldHVybiBiaXRBcnJheTtcclxuICB9XHJcblxyXG4gIC8qKiBJbml0aWFsaXplcyBhIGJpdHNldC4gKi9cclxuICBpbml0KGZsYWc6IEZ1bmN0aW9uLCBub3RpZnk6IGJvb2xlYW4pOiBCaXRBcnJheSB7XHJcbiAgICB0aGlzLnNldEFsbChmYWxzZSwgZmFsc2UpO1xyXG5cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fbGVuZ3RoOyBpKyspIHtcclxuICAgICAgaWYgKGZsYWcoaSkpIHtcclxuICAgICAgICB0aGlzLl9kYXRhW01hdGguZmxvb3IoaSAvIDB4MjApXSB8PSAxIDw8ICgoaSAlIDB4MjApICYgMHgxZik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmluY3JlbWVudFZlcnNpb24obm90aWZ5KTtcclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuXHJcbiAgLy8vIEludmVydHMgYSBiaXRzZXQuXHJcbiAgaW52ZXJ0KG5vdGlmeSA9IHRydWUpOiB2b2lkIHtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fZGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICB0aGlzLl9kYXRhW2ldIF49IC0xO1xyXG4gICAgfVxyXG4gICAgdGhpcy5pbmNyZW1lbnRWZXJzaW9uKG5vdGlmeSk7XHJcbiAgfVxyXG5cclxuICAvLy8gU2V0cyBhbGwgYml0cyB0byBbdmFsdWVdLCBvcHRpb25hbGx5IHN1cHByZXNzaW5nIG5vdGlmaWNhdGlvbnMuXHJcbiAgc2V0QWxsKHZhbHVlOiBib29sZWFuLCBub3RpZnkgPSBmYWxzZSk6IHZvaWQge1xyXG4gICAgY29uc3QgZmxhZ3MgPSB2YWx1ZSA/IC0xIDogMDtcclxuICAgIGNvbnN0IGxlbiA9IHRoaXMubGVuZ3RoSW5JbnRzO1xyXG5cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgdGhpcy5fZGF0YVtpXSA9IGZsYWdzO1xyXG4gICAgfSAvL3RvZG86IG9wdGltaXplXHJcblxyXG4gICAgdGhpcy5pbmNyZW1lbnRWZXJzaW9uKG5vdGlmeSk7XHJcbiAgfVxyXG5cclxuICAvLy8gU2V0cyBiaXRzIGF0IFtpbmRleGVzXSBwb3NpdGlvbiB0byBbdmFsdWVdLlxyXG4gIC8vLyBDbGVhcnMgdGhlIGJpdHNldCBpZiBbY2xlYXJdIGZsYWcgaXMgdHJ1ZS5cclxuICAvLy8gQ2hhbmdlIG5vdGlmaWNhdGlvbiBpcyByYWlzZWQgd2hlbiBbbm90aWZ5XSBpcyB0cnVlLlxyXG4gIHNldEluZGV4ZXMoaW5kZXhlczogQXJyYXk8bnVtYmVyPiwgdmFsdWU9dHJ1ZSwgY2xlYXI9dHJ1ZSwgbm90aWZ5PXRydWUpOiB2b2lkIHtcclxuICAgIGlmIChjbGVhcikge1xyXG4gICAgICB0aGlzLnNldEFsbCghdmFsdWUsIGZhbHNlKTtcclxuICAgIH1cclxuXHJcbiAgICBmb3IgKGNvbnN0IGkgb2YgaW5kZXhlcykge1xyXG4gICAgICB0aGlzLnNldEZhc3QoaSwgdmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaW5jcmVtZW50VmVyc2lvbihub3RpZnkpO1xyXG4gIH1cclxuXHJcbiAgZXZlcnlJbmRleChpbmRleGVzOiBBcnJheTxudW1iZXI+LCB2YWx1ZT10cnVlKTogYm9vbGVhbiB7XHJcbiAgICBmb3IgKGNvbnN0IGluZGV4IG9mIGluZGV4ZXMpIHtcclxuICAgICAgaWYgKHRoaXMuZ2V0Qml0KGluZGV4KSAhPSB2YWx1ZSkge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBhbnlJbmRleChpbmRleGVzOiBBcnJheTxudW1iZXI+LCB2YWx1ZT10cnVlKTogYm9vbGVhbiB7XHJcbiAgICBmb3IgKGNvbnN0IGluZGV4IG9mIGluZGV4ZXMpIHtcclxuICAgICAgaWYgKHRoaXMuZ2V0Qml0KGluZGV4KSA9PSB2YWx1ZSkge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBzZXRXaGVyZShjaGVjazogRnVuY3Rpb24sIHZhbHVlPXRydWUsIGNsZWFyPXRydWUsIG5vdGlmeT10cnVlLCBhbGxvd0NsZWFyPXRydWUpOiB2b2lkIHtcclxuICAgIGlmIChjbGVhciAmJiBhbGxvd0NsZWFyKSB7XHJcbiAgICAgIHRoaXMuc2V0QWxsKCF2YWx1ZSwgZmFsc2UpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChhbGxvd0NsZWFyKSB7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fbGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBpZiAoY2hlY2soaSkpIHtcclxuICAgICAgICAgIHRoaXMuc2V0RmFzdChpLCB2YWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2xlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgdGhpcy5zZXRGYXN0KGksIGNoZWNrKGkpID8gdmFsdWUgOiAhdmFsdWUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5pbmNyZW1lbnRWZXJzaW9uKG5vdGlmeSk7XHJcbiAgfVxyXG5cclxuICBzZXRSYW5nZShmcm9tOiBudW1iZXIsIHRvOiBudW1iZXIsIHZhbHVlOiBib29sZWFuLCBub3RpZnk9dHJ1ZSk6IEJpdEFycmF5IHtcclxuICAgIHRoaXMuYXNzdXJlSW5SYW5nZShmcm9tLCAwLCB0aGlzLl9sZW5ndGggLSAxLCAnZnJvbScpO1xyXG4gICAgdGhpcy5hc3N1cmVJblJhbmdlKHRvLCAwLCB0aGlzLl9sZW5ndGggLSAxLCAndG8nKTtcclxuXHJcbiAgICBjb25zdCBzdGFydCA9IE1hdGgubWluKGZyb20sIHRvKTtcclxuICAgIGNvbnN0IGVuZCA9IE1hdGgubWF4KGZyb20sIHRvKTtcclxuXHJcbiAgICAvL3RvZG86IG9wdGltaXplXHJcbiAgICBpZiAodmFsdWUpIHtcclxuICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDw9IGVuZDsgaSsrKSB7XHJcbiAgICAgICAgdGhpcy5zZXRUcnVlKGkpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPD0gZW5kOyBpKyspIHtcclxuICAgICAgICB0aGlzLnNldEZhbHNlKGkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5pbmNyZW1lbnRWZXJzaW9uKG5vdGlmeSk7XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcblxyXG4gIC8vLyBTZXRzIG4gcmFuZG9tbHkgY2hvc2VuIGJpdHMgdG8gdmFsdWUsIHJlbWFpbmluZyBiaXRzIHRvICF2YWx1ZS5cclxuICBzZXRSYW5kb20objogbnVtYmVyLCB2YWx1ZTogYm9vbGVhbiwgbm90aWZ5PXRydWUpOiB2b2lkIHtcclxuICAgIGlmIChuIDwgMCB8fCBuID4gdGhpcy5fbGVuZ3RoKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignbiBtdXN0IGJlID49IDAgJiYgPD0gQ291bnQnKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAobiA+IHRoaXMuX2xlbmd0aCAvIDIpIHtcclxuICAgICAgdGhpcy5zZXRSYW5kb20odGhpcy5fbGVuZ3RoIC0gbiwgIXZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnNldEFsbCghdmFsdWUpO1xyXG5cclxuICAgIGZvciAobGV0IGsgPSAwOyBrIDwgbjsgKSB7XHJcbiAgICAgIGNvbnN0IGkgPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiB0aGlzLl9sZW5ndGgpO1xyXG4gICAgICBpZiAodGhpcy5nZXRCaXQoaSkgPT0gdmFsdWUpIGNvbnRpbnVlO1xyXG4gICAgICB0aGlzLnNldEZhc3QoaSwgdmFsdWUpO1xyXG4gICAgICBrKys7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5pbmNyZW1lbnRWZXJzaW9uKG5vdGlmeSk7XHJcbiAgfVxyXG5cclxuICAvLy8gTW9kaWZpZXMgY3VycmVudCBiaXRzZXQgYnkgcGVyZm9ybWluZyB0aGUgYml0d2lzZSBBTkQgb3BlcmF0aW9uIGFnYWluc3QgdGhlXHJcbiAgLy8vIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBiaXRzZXQuXHJcbiAgYW5kKHZhbHVlOiBCaXRBcnJheSwgbm90aWZ5PXRydWUpOiBCaXRBcnJheSB7XHJcbiAgICBpZiAodGhpcy5fbGVuZ3RoICE9IHZhbHVlLl9sZW5ndGgpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBcnJheSBsZW5ndGhzIGRpZmZlci4nKTtcclxuICAgIH1cclxuXHJcbiAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gdGhpcy5sZW5ndGhJbkludHM7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICB0aGlzLl9kYXRhW2ldICY9IHZhbHVlLl9kYXRhW2ldO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaW5jcmVtZW50VmVyc2lvbihub3RpZnkpO1xyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICAvLy8gUGVyZm9ybXMgdGhlIGJpdHdpc2UgQU5EIE5PVCBvcGVyYXRpb24gb24gdGhlIGVsZW1lbnRzIGluIHRoZSBjdXJyZW50IGJpdHNldFxyXG4gIC8vLyBhZ2FpbnN0IHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQgYml0c2V0LlxyXG4gIGFuZE5vdCh2YWx1ZTogQml0QXJyYXksIG5vdGlmeT10cnVlKTogQml0QXJyYXkge1xyXG4gICAgaWYgKHRoaXMuX2xlbmd0aCAhPSB2YWx1ZS5fbGVuZ3RoKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignQXJyYXkgbGVuZ3RocyBkaWZmZXIuJyk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgbGVuID0gdGhpcy5sZW5ndGhJbkludHM7XHJcbiAgICBmb3IgKGxldCBudW0yID0gMDsgbnVtMiA8IGxlbjsgbnVtMisrKSB7XHJcbiAgICAgIHRoaXMuX2RhdGFbbnVtMl0gJj0gfnZhbHVlLl9kYXRhW251bTJdO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaW5jcmVtZW50VmVyc2lvbihub3RpZnkpO1xyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICAvLy8gUGVyZm9ybXMgdGhlIGJpdHdpc2UgTk9UIEFORCBvcGVyYXRpb24gb24gdGhlIGVsZW1lbnRzIGluIHRoZSBjdXJyZW50IGJpdHNldFxyXG4gIC8vLyBhZ2FpbnN0IHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQgYml0c2V0LlxyXG4gIG5vdEFuZCh2YWx1ZTogQml0QXJyYXksIG5vdGlmeT10cnVlKTogQml0QXJyYXkge1xyXG4gICAgaWYgKHRoaXMuX2xlbmd0aCAhPSB2YWx1ZS5fbGVuZ3RoKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignQXJyYXkgbGVuZ3RocyBkaWZmZXIuJyk7XHJcbiAgICB9XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHRoaXMubGVuZ3RoSW5JbnRzOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgdGhpcy5fZGF0YVtpXSA9ICh+dGhpcy5fZGF0YVtpXSkgJiB2YWx1ZS5fZGF0YVtpXTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmluY3JlbWVudFZlcnNpb24obm90aWZ5KTtcclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuXHJcbiAgLy8vIEludmVydHMgYWxsIGJpdCB2YWx1ZXMgaW4gdGhlIGN1cnJlbnQgYml0c2V0XHJcbiAgbm90KG5vdGlmeSA9IHRydWUpOiBCaXRBcnJheSB7XHJcbiAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gdGhpcy5sZW5ndGhJbkludHM7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICB0aGlzLl9kYXRhW2ldID0gfnRoaXMuX2RhdGFbaV07XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5pbmNyZW1lbnRWZXJzaW9uKG5vdGlmeSk7XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcblxyXG4gIC8vLyBQZXJmb3JtcyB0aGUgYml0d2lzZSBPUiBvcGVyYXRpb24gb24gdGhlIGVsZW1lbnRzIGluIHRoZSBjdXJyZW50IGJpdHNldFxyXG4gIC8vLyBhZ2FpbnN0IHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQgYml0c2V0LlxyXG4gIG9yKHZhbHVlOiBCaXRBcnJheSwgbm90aWZ5ID0gdHJ1ZSkge1xyXG4gICAgaWYgKHRoaXMuX2xlbmd0aCAhPSB2YWx1ZS5fbGVuZ3RoKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignQXJyYXkgbGVuZ3RocyBkaWZmZXIuJyk7XHJcbiAgICB9XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHRoaXMubGVuZ3RoSW5JbnRzOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgdGhpcy5fZGF0YVtpXSB8PSB2YWx1ZS5fZGF0YVtpXTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmluY3JlbWVudFZlcnNpb24obm90aWZ5KTtcclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuXHJcbiAgLy8vIFBlcmZvcm1zIHRoZSBiaXR3aXNlIGV4Y2x1c2l2ZSBPUiBvcGVyYXRpb24gb24gdGhlIGVsZW1lbnRzIGluIHRoZSBjdXJyZW50IGJpdHNldFxyXG4gIC8vLyBhZ2FpbnN0IHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQgYml0c2V0LlxyXG4gIHhvcih2YWx1ZTogQml0QXJyYXksIG5vdGlmeSA9IHRydWUpIHtcclxuICAgIGlmICh0aGlzLl9sZW5ndGggIT0gdmFsdWUuX2xlbmd0aCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FycmF5IGxlbmd0aHMgZGlmZmVyLicpO1xyXG4gICAgfVxyXG5cclxuICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSB0aGlzLmxlbmd0aEluSW50czsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgIHRoaXMuX2RhdGFbaV0gXj0gdmFsdWUuX2RhdGFbaV07XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5pbmNyZW1lbnRWZXJzaW9uKG5vdGlmeSk7XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcblxyXG4gIC8vLyBJbnNlcnRzIG4gMC1iaXRzIGF0IHBvc2l0aW9uIHBvcywgcmVzaXppbmcgc2VsZiBhbmQgc2hpZnRpbmcgYml0cyBhcHByb3ByaWF0ZWx5LlxyXG4gIGluc2VydEF0KHBvczogbnVtYmVyLCBuOiBudW1iZXIsIGZsYWcgPSBmYWxzZSk6IHZvaWQge1xyXG4gICAgdGhpcy5hc3N1cmVJblJhbmdlKHBvcywgMCwgdGhpcy5fbGVuZ3RoLCAncG9zJyk7XHJcblxyXG4gICAgaWYgKG4gPT0gMCkgcmV0dXJuO1xyXG5cclxuICAgIC8vVE9ETzogb3B0aW1pemVcclxuICAgIC8vdGhlIG1vc3QgcHJpbWl0aXZlIGltcGxlbWVudGF0aW9uLCBvcHRpbWl6ZSBpdCBsYXRlciFcclxuXHJcbiAgICAvLyBiZWdpblVwZGF0ZSgpO1xyXG4gICAgY29uc3Qgb2xkbGVuZ3RoID0gdGhpcy5fbGVuZ3RoO1xyXG4gICAgdGhpcy5zZXRMZW5ndGgodGhpcy5fbGVuZ3RoICsgbik7XHJcblxyXG4gICAgLy9pZiAoIWNvbnRhaW5zKCFmbGFnKSkgcmV0dXJuOyAvLyBub3RoaW5nIHRvIGRvXHJcblxyXG4gICAgZm9yIChsZXQgaSA9IG9sZGxlbmd0aCAtIDE7IGkgPj0gcG9zOyBpLS0pIHtcclxuICAgICAgdGhpcy5zZXRCaXQoaSArIG4sIHRoaXMuZ2V0Qml0KGkpKTtcclxuICAgIH1cclxuXHJcbiAgICBmb3IgKGxldCBpID0gcG9zOyBpIDwgcG9zICsgbjsgaSsrKSB7XHJcbiAgICAgIHRoaXMuc2V0Qml0KGksIGZsYWcpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGVuZFVwZGF0ZSgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIERlbGV0ZXMgbiBiaXRzIGJlZ2lubmluZyBhdCBwb3NpdGlvbiBwb3MsIHJlc2l6aW5nIHNlbGYgYW5kIHNoaWZ0aW5nIHJlbWFpbmluZ1xyXG4gIC8vLyBiaXRzIGFwcHJvcHJpYXRlbHkuXHJcbiAgcmVtb3ZlQXQocG9zOiBudW1iZXIsIG4gPSAxKTogdm9pZCB7XHJcbiAgICAvLyB0aGUgbW9zdCBwcmltaXRpdmUgaW1wbGVtZW50YXRpb24sIG9wdGltaXplIGl0IGxhdGVyIVxyXG4gICAgaWYgKG4gPCAwKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignbiBjYW5ub3QgYmUgbmVnYXRpdmUnKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmFzc3VyZUluUmFuZ2UocG9zLCAwLCB0aGlzLl9sZW5ndGggLSBuLCAncG9zJyk7XHJcblxyXG4gICAgaWYgKHRoaXMuY29udGFpbnModHJ1ZSkpIHtcclxuICAgICAgZm9yIChsZXQgaSA9IHBvczsgaSA8IHRoaXMuX2xlbmd0aCAtIG47IGkrKykge1xyXG4gICAgICAgIHRoaXMuc2V0Qml0KGksIHRoaXMuZ2V0Qml0KGkgKyBuKSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnNldExlbmd0aCh0aGlzLl9sZW5ndGggLSBuKTtcclxuICB9XHJcblxyXG4gIHJlbW92ZUJ5TWFzayhtYXNrOiBCaXRBcnJheSwgZmxhZyA9IHRydWUpOiBCaXRBcnJheSB7XHJcbiAgICBpZiAodGhpcy5fbGVuZ3RoICE9IG1hc2subGVuZ3RoKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignbGVuZ3RoICE9IG1hc2subGVuZ3RoJyk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKG1hc2sgPT0gdGhpcykgeyAvLyBubyBuZWVkIHRvIGl0ZXJhdGVcclxuICAgICAgdGhpcy5zZXRMZW5ndGgobWFzay5jb3VudEJpdHMoIWZsYWcpKTtcclxuICAgICAgdGhpcy5zZXRBbGwoIWZsYWcpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbGV0IGRzdElkeCA9IDA7XHJcblxyXG4gICAgICBmb3IgKGxldCBzcmNJZHggPSAtMTsgKHNyY0lkeCA9IG1hc2suZmluZE5leHQoc3JjSWR4LCAhZmxhZykpICE9IC0xOykge1xyXG4gICAgICAgIHRoaXMuc2V0RmFzdChkc3RJZHgrKywgdGhpcy5nZXRCaXQoc3JjSWR4KSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuX2xlbmd0aCA9IGRzdElkeDtcclxuICAgICAgdGhpcy5fdmVyc2lvbisrO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuXHJcbiAgLy8vIFNpbWlsYXIgdG8gdGhlIFtdIG9wZXJhdG9yLlxyXG4gIGdldEJpdChwb3M6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICh0aGlzLl9kYXRhW01hdGguZmxvb3IocG9zIC8gMHgyMCldICYgKDEgPDwgKHBvcyAmIDB4MWYpKSkgIT0gMDtcclxuICB9XHJcblxyXG4gIC8vLyBTaW1pbGFyIHRvIHRoZSBbXSBvcGVyYXRvci5cclxuICBzZXRCaXQocG9zOiBudW1iZXIsIGJpdDogYm9vbGVhbiwgbm90aWZ5ID0gdHJ1ZSkge1xyXG4gICAgdGhpcy5zZXRGYXN0KHBvcywgYml0KTtcclxuICAgIGlmIChub3RpZnkpIHtcclxuICAgICAgdGhpcy5fdmVyc2lvbisrO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5fdmVyc2lvbisrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIFNldHMgW2ldLXRoIGJpdCB0byBbdmFsdWVdLCBkb2VzIG5vdCBjaGVjayBib3VuZHMsIGRvZXMgbm90IGluY3JlbWVudCB2ZXJzaW9uXHJcbiAgc2V0RmFzdChpOiBudW1iZXIsIHZhbHVlOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBpZiAodmFsdWUpIHtcclxuICAgICAgdGhpcy5fZGF0YVtNYXRoLmZsb29yKGkgLyAweDIwKV0gfD0gMSA8PCAoaSAmIDB4MWYpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5fZGF0YVtNYXRoLmZsb29yKGkgLyAweDIwKV0gJj0gfigxIDw8IChpICYgMHgxZikpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2V0VHJ1ZShwb3M6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5fZGF0YVtNYXRoLmZsb29yKHBvcyAvIDB4MjApXSB8PSAxIDw8IChwb3MgJiAweDFmKTtcclxuICB9XHJcbiAgc2V0RmFsc2UocG9zOiBudW1iZXIpIHtcclxuICAgIHRoaXMuX2RhdGFbTWF0aC5mbG9vcihwb3MgLyAweDIwKV0gJj0gfigxIDw8IChwb3MgJiAweDFmKSk7XHJcbiAgfVxyXG5cclxuICB0cnVlQ291bnQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLmNvdW50Qml0cyh0cnVlKTtcclxuICB9XHJcbiAgZmFsc2VDb3VudCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuY291bnRCaXRzKGZhbHNlKTtcclxuICB9XHJcblxyXG4gIC8vLyBDb3VudHMgYml0cyBvZiB0aGUgc3BlY2lmaWVkIHZhbHVlLlxyXG4gIGNvdW50Qml0cyh2YWx1ZTogYm9vbGVhbik6IG51bWJlciB7XHJcbiAgICBpZiAodGhpcy5fbGVuZ3RoID09IDApIHJldHVybiAwO1xyXG5cclxuICAgIGlmICh0aGlzLl9zZWxlY3RlZENvdW50VmVyc2lvbiAhPSB0aGlzLl92ZXJzaW9uKSB7XHJcbiAgICAgIHRoaXMuX3NlbGVjdGVkQ291bnQgPSAwO1xyXG4gICAgICBjb25zdCBsZW4gPSB0aGlzLmxlbmd0aEluSW50cztcclxuICAgICAgbGV0IGkgPSAwO1xyXG4gICAgICBmb3IgKDsgaSA8IGxlbiAtIDE7IGkrKykge1xyXG4gICAgICAgIGZvciAobGV0IGsgPSB0aGlzLl9kYXRhW2ldOyBrICE9IDA7IGsgPj4+PSA4KSB7IC8vdG9kbzogY2FzdCBkYXRhW2ldIHRvIHVpbnRcclxuICAgICAgICAgIHRoaXMuX3NlbGVjdGVkQ291bnQgKz0gQml0QXJyYXkuX29uQml0Q291bnRbayAmIDB4ZmZdO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gVGhlIGxhc3QgaW50LlxyXG4gICAgICBsZXQgayA9IHRoaXMuX2RhdGFbaV07XHJcbiAgICAgIGNvbnN0IHJlbWFpbmluZ0JpdHMgPSB0aGlzLl9sZW5ndGggJiAweDFmO1xyXG4gICAgICBpZiAocmVtYWluaW5nQml0cyAhPSAwKSB7Ly8gaWYgcmVtYWluaW5nQml0cyA9PSAwLCB0aGUgbGFzdCBpbnQgaXMgZnVsbHkgdXNlZCBhbmQgQUxMIGJpdHMgc2hvdWxkIGJlIGxlZnQgYXMgaXMuXHJcbiAgICAgICAgayAmPSB+KCg0Mjk0OTY3Mjk1KSA8PCByZW1haW5pbmdCaXRzKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgZm9yICg7IGsgIT0gMDsgayA+Pj49IDgpIHtcclxuICAgICAgICB0aGlzLl9zZWxlY3RlZENvdW50ICs9IEJpdEFycmF5Ll9vbkJpdENvdW50W2sgJiAweGZmXTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5fc2VsZWN0ZWRDb3VudFZlcnNpb24gPSB0aGlzLl92ZXJzaW9uO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiAodmFsdWUgPyB0aGlzLl9zZWxlY3RlZENvdW50IDogdGhpcy5fbGVuZ3RoIC0gdGhpcy5fc2VsZWN0ZWRDb3VudCk7XHJcbiAgfVxyXG5cclxuICAvLy8gUmV0dXJucyBhIG51bWJlciBvZiBzZXQgYml0cyB3aGVyZSBhbHNvIFtjaGVja10gaXMgdHJ1ZVxyXG4gIGNvdW50V2hlcmUoY2hlY2s6IEZ1bmN0aW9uKTogbnVtYmVyIHtcclxuICAgIGxldCByZXN1bHQgPSAwO1xyXG4gICAgaWYgKHRoaXMudHJ1ZUNvdW50KCkgPT0gdGhpcy5fbGVuZ3RoKSB7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fbGVuZ3RoOyBpKyspIHtcclxuICAgICAgICByZXN1bHQgKz0gY2hlY2soaSkgPyAxIDogMDtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZm9yIChsZXQgaSA9IC0xOyAoaSA9IHRoaXMuZmluZE5leHQoaSwgdHJ1ZSkpICE9IC0xOykge1xyXG4gICAgICAgIHJlc3VsdCArPSBjaGVjayhpKSA/IDEgOiAwO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgLy8vIFBlcmZvcm1zIGJpdCBcImFuZFwiIGFuZCBjb3VudHMgYml0cyBvZiB0aGUgc3BlY2lmaWVkIHZhbHVlLCB3aXRob3V0IGJpdHNldCBtb2RpZmljYXRpb24uXHJcbiAgYW5kV2l0aENvdW50Qml0cyhzZWNvbmQ6IEJpdEFycmF5LCB2YWx1ZTogYm9vbGVhbik6IG51bWJlciB7XHJcbiAgICBpZiAodGhpcy5fbGVuZ3RoID09IDApIHJldHVybiAwO1xyXG5cclxuICAgIGxldCBjb3VudCA9IDA7IGNvbnN0IGxlbiA9IHRoaXMubGVuZ3RoSW5JbnRzOyBsZXQgaSA9IDA7XHJcbiAgICBmb3IgKDsgaSA8IGxlbiAtIDE7IGkrKykge1xyXG4gICAgICBmb3IgKHZhciBrID0gdGhpcy5fZGF0YVtpXSAmIHNlY29uZC5fZGF0YVtpXTsgayAhPSAwOyBrID4+Pj0gOCkge1xyXG4gICAgICAgIGNvdW50ICs9IEJpdEFycmF5Ll9vbkJpdENvdW50W2sgJiAweGZmXTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIFRoZSBsYXN0IGludC5cclxuICAgIHZhciBrID0gdGhpcy5fZGF0YVtpXSAmIHNlY29uZC5fZGF0YVtpXTtcclxuICAgIGNvbnN0IHJlbWFpbmluZ0JpdHMgPSB0aGlzLl9sZW5ndGggJiAweDFmO1xyXG4gICAgaWYgKHJlbWFpbmluZ0JpdHMgIT0gMCkge1xyXG4gICAgICBrICY9IH4oKDQyOTQ5NjcyOTUpIDw8IHJlbWFpbmluZ0JpdHMpO1xyXG4gICAgfVxyXG4gICAgZm9yICg7IGsgIT0gMDsgayA+Pj49IDgpIHtcclxuICAgICAgY291bnQgKz0gQml0QXJyYXkuX29uQml0Q291bnRbayAmIDB4ZmZdO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiAodmFsdWUgPyBjb3VudCA6IHRoaXMuX2xlbmd0aCAtIGNvdW50KTtcclxuICB9XHJcblxyXG4gIGNsZWFyKCk6IHZvaWQge1xyXG4gICAgdGhpcy5zZXRMZW5ndGgoMCk7XHJcbiAgfVxyXG4gIGNvbnRhaW5zKHZhbHVlOiBib29sZWFuKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5maW5kTmV4dCgtMSwgdmFsdWUpID49IDA7XHJcbiAgfVxyXG4gIGdldCBhbGxUcnVlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuY291bnRCaXRzKHRydWUpID09IHRoaXMuX2xlbmd0aDtcclxuICB9XHJcbiAgZ2V0IGFsbEZhbHNlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuY291bnRCaXRzKGZhbHNlKSA9PSB0aGlzLl9sZW5ndGg7XHJcbiAgfVxyXG4gIGdldCBhbnlUcnVlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuY291bnRCaXRzKHRydWUpID4gMDtcclxuICB9XHJcbiAgZ2V0IGFueUZhbHNlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuY291bnRCaXRzKGZhbHNlKSA+IDA7XHJcbiAgfVxyXG5cclxuICAvLy8gUmV0dXJucyB0aGUgcG9zaXRpb24gb2YgdGhlIG5leHQgYml0IG9mIHRoZSBzcGVjaWZpZWQgdmFsdWUsIHN0YXJ0aW5nIGZyb20gdGhlIHNwZWNpZmllZCBwb3NpdGlvbi5cclxuICAvLy8gUmV0dXJucyAtMSwgaWYgdGhlcmUgYXJlIG5vIHN1Y2ggYml0cy5cclxuICBmaW5kTmV4dChpbmRleDogbnVtYmVyLCB2YWx1ZSA9IHRydWUpOiBudW1iZXIge1xyXG4gICAgdGhpcy5hc3N1cmVJblJhbmdlKGluZGV4LCAtMSwgdGhpcy5fbGVuZ3RoLCAnaW5kZXgnKTtcclxuXHJcbiAgICBpZiAoaW5kZXggPj0gdGhpcy5fbGVuZ3RoIC0gMSkgcmV0dXJuIC0xO1xyXG4gICAgaW5kZXggPSBpbmRleCA8IDAgPyAwIDogaW5kZXggKyAxOyAvLyBza2lwIHN0YXJ0XHJcbiAgICBsZXQgdW51c2VkQml0cyA9IGluZGV4ICYgMHgxZjtcclxuICAgIGNvbnN0IG51bUludHMgPSB0aGlzLmxlbmd0aEluSW50cztcclxuXHJcbiAgICBmb3IgKGxldCBpID0gTWF0aC5mbG9vcihpbmRleCAvIDMyKTsgaSA8IG51bUludHM7IGkrKykge1xyXG4gICAgICBsZXQgayA9ICh2YWx1ZSA/IHRoaXMuX2RhdGFbaV0gOiB+dGhpcy5fZGF0YVtpXSk7IC8vIHVpbnQgY2FzdFxyXG4gICAgICBpZiAodW51c2VkQml0cyAhPSAwKSB7XHJcbiAgICAgICAgayAmPSAoKDB4ZmZmZmZmZmYgPDwgdW51c2VkQml0cykgJiAweGZmZmZmZmZmKTtcclxuICAgICAgICB1bnVzZWRCaXRzID0gMDtcclxuICAgICAgfSBlbHNlIGlmICghdmFsdWUgJiYgayA9PSAtNDI5NDk2NzI5NikgLy8gbG9va2luZyBmb3IgZmFsc2UsIGFsbCBiaXRzIGFyZSBzZXRcclxuICAgICAge1xyXG4gICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBmb3IgKGxldCBqID0gMDsgayAhPSAwOyBqICs9IDgsIGsgPj4+PSA4KSB7XHJcbiAgICAgICAgY29uc3QgcCA9IEJpdEFycmF5Ll9maXJzdE9uQml0W2sgJiAweGZmXTtcclxuICAgICAgICBpZiAocCA+PSAwKSB7XHJcbiAgICAgICAgICBpbmRleCA9IHAgKyAoaSAqIDMyKSArIGo7XHJcbiAgICAgICAgICBpZiAoaW5kZXggPj0gdGhpcy5fbGVuZ3RoKSByZXR1cm4gLTE7XHJcbiAgICAgICAgICByZXR1cm4gaW5kZXg7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gLTE7XHJcbiAgfVxyXG5cclxuICAvLy8gRmluZHMgcHJldmlvdXMgYml0IG9mIHRoZSBzcGVjaWZpZWQgdmFsdWUgaW4gdGhlIGJpdHNldC5cclxuICBmaW5kUHJldihpbmRleDogbnVtYmVyLCB2YWx1ZSA9IHRydWUpOiBudW1iZXIge1xyXG4gICAgaWYgKGluZGV4ID09IDApIHJldHVybiAtMTtcclxuICAgIHRoaXMuYXNzdXJlSW5SYW5nZShpbmRleCwgLTEsIHRoaXMuX2xlbmd0aCwgJ2luZGV4Jyk7XHJcblxyXG4gICAgaW5kZXggPSBpbmRleCA8IDAgPyB0aGlzLl9sZW5ndGggLSAxIDogaW5kZXggLSAxOyAvLyBza2lwIHN0YXJ0XHJcblxyXG4gICAgY29uc3QgbGFzdEludElkeCA9IE1hdGguZmxvb3IoaW5kZXggLyAweDIwKTtcclxuICAgIGxldCByZW1haW5pbmdCaXRzID0gKGluZGV4ICsgMSkgJiAweDFmO1xyXG5cclxuICAgIGZvciAobGV0IGkgPSBsYXN0SW50SWR4OyBpID49IDA7IGktLSkge1xyXG4gICAgICBsZXQgayA9ICh2YWx1ZSA/IHRoaXMuX2RhdGFbaV0gOiB+dGhpcy5fZGF0YVtpXSk7IC8vIGNhc3RcclxuICAgICAgaWYgKHJlbWFpbmluZ0JpdHMgIT0gMCkge1xyXG4gICAgICAgIGsgJj0gfigoNDI5NDk2NzI5NSkgPDwgcmVtYWluaW5nQml0cyk7XHJcbiAgICAgICAgcmVtYWluaW5nQml0cyA9IDA7XHJcbiAgICAgIH1cclxuICAgICAgZm9yIChsZXQgaiA9IDI0OyBrICE9IDA7IGogLT0gOCwgayA8PD0gOCkge1xyXG4gICAgICAgIGNvbnN0IHAgPSBCaXRBcnJheS5fbGFzdE9uQml0W2sgPj4+IDB4MThdO1xyXG4gICAgICAgIGlmIChwID49IDApIHtcclxuICAgICAgICAgIHJldHVybiBwICsgKGkgKiAzMikgKyBqO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIC0xO1xyXG4gIH1cclxufVxyXG4iXX0=
|
|
1
|
+
export default class BitArray {
|
|
2
|
+
constructor(arg, defaultValue = false) {
|
|
3
|
+
this._length = 0;
|
|
4
|
+
this._version = 0;
|
|
5
|
+
this._updateLevel = 0;
|
|
6
|
+
this._selectedCount = 0;
|
|
7
|
+
this._selectedCountVersion = -1;
|
|
8
|
+
this._selectedIndexesVersion = -1;
|
|
9
|
+
this._versionedName = '';
|
|
10
|
+
this._versionedNameVersion = -1;
|
|
11
|
+
this.SHRINK_THRESHOLD = 0x100;
|
|
12
|
+
if (typeof arg === 'number') {
|
|
13
|
+
const length = arg;
|
|
14
|
+
let buff = BitArray._createBuffer(length);
|
|
15
|
+
if (defaultValue)
|
|
16
|
+
for (let i = 0; i < buff.length; i++)
|
|
17
|
+
buff[i] = -1;
|
|
18
|
+
this._data = buff;
|
|
19
|
+
this._length = length;
|
|
20
|
+
}
|
|
21
|
+
else if (arg instanceof Uint32Array) {
|
|
22
|
+
this._data = arg;
|
|
23
|
+
this._length = defaultValue;
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
throw new Error("Invalid constructor");
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
getRawData() { return this._data; }
|
|
30
|
+
assureGoez(num, argName) {
|
|
31
|
+
if (num < 0)
|
|
32
|
+
throw new Error(`${argName} should be greater than zero`);
|
|
33
|
+
}
|
|
34
|
+
assureInRange(value, min, max, argName) {
|
|
35
|
+
if ((value < min) || (value > max)) {
|
|
36
|
+
throw new Error(`Argument ${argName} (${value}) out of range (${min}, ${max})`);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
copy(src, dst, count) {
|
|
40
|
+
for (let i = 0; i < count; i++) {
|
|
41
|
+
dst[i] = src[i];
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
copyFrom(other) {
|
|
45
|
+
if (this._length != other._length) {
|
|
46
|
+
throw new Error(`Lengths differ (${this._length} != ${other._length})`);
|
|
47
|
+
}
|
|
48
|
+
this.copy(other._data, this._data, this.lengthInInts);
|
|
49
|
+
this._version++;
|
|
50
|
+
}
|
|
51
|
+
get length() {
|
|
52
|
+
return this._length;
|
|
53
|
+
}
|
|
54
|
+
get buffer() {
|
|
55
|
+
return this._data;
|
|
56
|
+
}
|
|
57
|
+
set buffer(data) {
|
|
58
|
+
this._data = data;
|
|
59
|
+
this._version++;
|
|
60
|
+
}
|
|
61
|
+
get version() {
|
|
62
|
+
return this._version;
|
|
63
|
+
}
|
|
64
|
+
set version(value) {
|
|
65
|
+
this._version = value;
|
|
66
|
+
}
|
|
67
|
+
incrementVersion(notify = true) {
|
|
68
|
+
this._version++;
|
|
69
|
+
}
|
|
70
|
+
get lengthInInts() {
|
|
71
|
+
return Math.floor((this._length + 0x1f) / 0x20);
|
|
72
|
+
}
|
|
73
|
+
get versionedName() {
|
|
74
|
+
return this._version == this._versionedNameVersion ? this._versionedName : '';
|
|
75
|
+
}
|
|
76
|
+
set versionedName(name) {
|
|
77
|
+
this._versionedName = name;
|
|
78
|
+
this._versionedNameVersion = this._version;
|
|
79
|
+
}
|
|
80
|
+
get self() {
|
|
81
|
+
return this;
|
|
82
|
+
}
|
|
83
|
+
setLength(value) {
|
|
84
|
+
if (value < 0) {
|
|
85
|
+
throw new Error('should be >= 0');
|
|
86
|
+
}
|
|
87
|
+
if (value == this._length)
|
|
88
|
+
return;
|
|
89
|
+
const nIntsNeeded = Math.floor((value + 0x1f) / 0x20);
|
|
90
|
+
if ((nIntsNeeded > this._data.length) || ((nIntsNeeded + this.SHRINK_THRESHOLD) < this._data.length)) {
|
|
91
|
+
const newData = new Uint32Array(nIntsNeeded);
|
|
92
|
+
this.copy(this._data, newData, (nIntsNeeded > this._data.length) ? this._data.length : nIntsNeeded);
|
|
93
|
+
this._data = newData;
|
|
94
|
+
}
|
|
95
|
+
if (value > this._length) {
|
|
96
|
+
if (this._length % 0x20 > 0) {
|
|
97
|
+
this._data[this.lengthInInts - 1] &= (1 << ((this._length % 0x20) & 0x1f)) - 1;
|
|
98
|
+
}
|
|
99
|
+
this._data.fill(0, this.lengthInInts, nIntsNeeded);
|
|
100
|
+
}
|
|
101
|
+
this._length = value;
|
|
102
|
+
this._version++;
|
|
103
|
+
}
|
|
104
|
+
static fromAnd(set1, set2) {
|
|
105
|
+
if (set1._length != set2._length) {
|
|
106
|
+
throw new Error(`Lengths differ (${set1._length} != ${set2._length})`);
|
|
107
|
+
}
|
|
108
|
+
const temp = new BitArray(set1._length);
|
|
109
|
+
temp._length = set1._length;
|
|
110
|
+
temp._data = BitArray._createBuffer(temp._length);
|
|
111
|
+
temp._version = 0;
|
|
112
|
+
const len = set1.lengthInInts;
|
|
113
|
+
for (let i = 0; i < len; i++) {
|
|
114
|
+
temp._data[i] = set1._data[i] & set2._data[i];
|
|
115
|
+
}
|
|
116
|
+
return temp;
|
|
117
|
+
}
|
|
118
|
+
static _createBuffer(length) {
|
|
119
|
+
return new Uint32Array(Math.floor((length + 0x1f) / 0x20));
|
|
120
|
+
}
|
|
121
|
+
static fromValues(values) {
|
|
122
|
+
const temp = new BitArray(values.length);
|
|
123
|
+
temp._version = 0;
|
|
124
|
+
for (let i = 0; i < temp._length; i++) {
|
|
125
|
+
if (values[i]) {
|
|
126
|
+
temp._data[Math.floor(i / 0x20)] |= 1 << ((i % 0x20) & 0x1f);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
return temp;
|
|
130
|
+
}
|
|
131
|
+
/// Constructs a [BitSet] of length [count], where idx-th bit is determined by a call to [flag] (idx).
|
|
132
|
+
static fromSeq(count, flag) {
|
|
133
|
+
const temp = new BitArray(count);
|
|
134
|
+
for (let i = 0; i < count; ++i) {
|
|
135
|
+
temp.setBit(i, flag(i));
|
|
136
|
+
}
|
|
137
|
+
temp._version = 0;
|
|
138
|
+
return temp;
|
|
139
|
+
}
|
|
140
|
+
/// Constructs a [BitSet] from a string [s] containing '0' or '1'.
|
|
141
|
+
static fromString(s) {
|
|
142
|
+
return BitArray.fromSeq(s.length, (i) => s.charAt(i) == '1');
|
|
143
|
+
}
|
|
144
|
+
/// Constructs a [BitSet], based on length [_length] and byte array [_data].
|
|
145
|
+
static fromUint32Array(_length, _data) {
|
|
146
|
+
const temp = new BitArray(_length);
|
|
147
|
+
temp._data = _data;
|
|
148
|
+
return temp;
|
|
149
|
+
}
|
|
150
|
+
/// Deserializes a [BitSet] from [bytes].
|
|
151
|
+
static fromBytes(bytes) {
|
|
152
|
+
const len = bytes.length;
|
|
153
|
+
const temp = new BitArray(len * 8);
|
|
154
|
+
temp._data = new Uint32Array(Math.floor((len + 3) / 4));
|
|
155
|
+
temp._length = len * 8;
|
|
156
|
+
let num1 = 0;
|
|
157
|
+
let num2 = 0;
|
|
158
|
+
while ((len - num2) >= 4) {
|
|
159
|
+
temp._data[num1++] = (((bytes[num2] & 0xff) |
|
|
160
|
+
((bytes[num2 + 1] & 0xff) << 8)) |
|
|
161
|
+
((bytes[num2 + 2] & 0xff) << 0x10)) |
|
|
162
|
+
((bytes[num2 + 3] & 0xff) << 0x18);
|
|
163
|
+
num2 += 4;
|
|
164
|
+
}
|
|
165
|
+
if (len - num2 == 3) {
|
|
166
|
+
temp._data[num1] = (bytes[num2 + 2] & 0xff) << 0x10;
|
|
167
|
+
}
|
|
168
|
+
if (len - num2 == 2) {
|
|
169
|
+
temp._data[num1] |= (bytes[num2 + 1] & 0xff) << 8;
|
|
170
|
+
}
|
|
171
|
+
if (len - num2 == 1) {
|
|
172
|
+
temp._data[num1] |= bytes[num2] & 0xff;
|
|
173
|
+
}
|
|
174
|
+
temp._version = 0;
|
|
175
|
+
return temp;
|
|
176
|
+
}
|
|
177
|
+
toString() {
|
|
178
|
+
return `${this._length} bits, ${this.countBits(true)} set`;
|
|
179
|
+
}
|
|
180
|
+
/// Performs deep comparison of two bitsets.
|
|
181
|
+
equals(other) {
|
|
182
|
+
if (this == other)
|
|
183
|
+
return true;
|
|
184
|
+
if (other == null)
|
|
185
|
+
return false;
|
|
186
|
+
if (this._length != other._length)
|
|
187
|
+
return false;
|
|
188
|
+
if (this._length == 0)
|
|
189
|
+
return true;
|
|
190
|
+
for (let i = 0; i < this._data.length - 1; i++) {
|
|
191
|
+
if (this._data[i] != other._data[i])
|
|
192
|
+
return false;
|
|
193
|
+
}
|
|
194
|
+
for (let i = (this._data.length - 1) * 8; i < this._length; i++) {
|
|
195
|
+
if (this.getBit(i) != other.getBit(i)) {
|
|
196
|
+
return false;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
return true;
|
|
200
|
+
}
|
|
201
|
+
/** Clones a bitset. */
|
|
202
|
+
clone() {
|
|
203
|
+
const bitArray = new BitArray(0, false);
|
|
204
|
+
bitArray._data = Uint32Array.from(this._data); // effective length: (lengthInInts)
|
|
205
|
+
bitArray._length = this._length;
|
|
206
|
+
bitArray._version = this._version;
|
|
207
|
+
return bitArray;
|
|
208
|
+
}
|
|
209
|
+
/** Initializes a bitset. */
|
|
210
|
+
init(flag, notify) {
|
|
211
|
+
this.setAll(false, false);
|
|
212
|
+
for (let i = 0; i < this._length; i++) {
|
|
213
|
+
if (flag(i)) {
|
|
214
|
+
this._data[Math.floor(i / 0x20)] |= 1 << ((i % 0x20) & 0x1f);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
this.incrementVersion(notify);
|
|
218
|
+
return this;
|
|
219
|
+
}
|
|
220
|
+
/// Inverts a bitset.
|
|
221
|
+
invert(notify = true) {
|
|
222
|
+
for (let i = 0; i < this._data.length; i++) {
|
|
223
|
+
this._data[i] ^= -1;
|
|
224
|
+
}
|
|
225
|
+
this.incrementVersion(notify);
|
|
226
|
+
}
|
|
227
|
+
/// Sets all bits to [value], optionally suppressing notifications.
|
|
228
|
+
setAll(value, notify = false) {
|
|
229
|
+
const flags = value ? -1 : 0;
|
|
230
|
+
const len = this.lengthInInts;
|
|
231
|
+
for (let i = 0; i < len; i++) {
|
|
232
|
+
this._data[i] = flags;
|
|
233
|
+
} //todo: optimize
|
|
234
|
+
this.incrementVersion(notify);
|
|
235
|
+
}
|
|
236
|
+
/// Sets bits at [indexes] position to [value].
|
|
237
|
+
/// Clears the bitset if [clear] flag is true.
|
|
238
|
+
/// Change notification is raised when [notify] is true.
|
|
239
|
+
setIndexes(indexes, value = true, clear = true, notify = true) {
|
|
240
|
+
if (clear) {
|
|
241
|
+
this.setAll(!value, false);
|
|
242
|
+
}
|
|
243
|
+
for (const i of indexes) {
|
|
244
|
+
this.setFast(i, value);
|
|
245
|
+
}
|
|
246
|
+
this.incrementVersion(notify);
|
|
247
|
+
}
|
|
248
|
+
everyIndex(indexes, value = true) {
|
|
249
|
+
for (const index of indexes) {
|
|
250
|
+
if (this.getBit(index) != value) {
|
|
251
|
+
return false;
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
return true;
|
|
255
|
+
}
|
|
256
|
+
anyIndex(indexes, value = true) {
|
|
257
|
+
for (const index of indexes) {
|
|
258
|
+
if (this.getBit(index) == value) {
|
|
259
|
+
return true;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
return false;
|
|
263
|
+
}
|
|
264
|
+
setWhere(check, value = true, clear = true, notify = true, allowClear = true) {
|
|
265
|
+
if (clear && allowClear) {
|
|
266
|
+
this.setAll(!value, false);
|
|
267
|
+
}
|
|
268
|
+
if (allowClear) {
|
|
269
|
+
for (let i = 0; i < this._length; i++) {
|
|
270
|
+
if (check(i)) {
|
|
271
|
+
this.setFast(i, value);
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
else {
|
|
276
|
+
for (let i = 0; i < this._length; i++) {
|
|
277
|
+
this.setFast(i, check(i) ? value : !value);
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
this.incrementVersion(notify);
|
|
281
|
+
}
|
|
282
|
+
setRange(from, to, value, notify = true) {
|
|
283
|
+
this.assureInRange(from, 0, this._length - 1, 'from');
|
|
284
|
+
this.assureInRange(to, 0, this._length - 1, 'to');
|
|
285
|
+
const start = Math.min(from, to);
|
|
286
|
+
const end = Math.max(from, to);
|
|
287
|
+
//todo: optimize
|
|
288
|
+
if (value) {
|
|
289
|
+
for (let i = start; i <= end; i++) {
|
|
290
|
+
this.setTrue(i);
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
else {
|
|
294
|
+
for (let i = start; i <= end; i++) {
|
|
295
|
+
this.setFalse(i);
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
this.incrementVersion(notify);
|
|
299
|
+
return this;
|
|
300
|
+
}
|
|
301
|
+
/// Sets n randomly chosen bits to value, remaining bits to !value.
|
|
302
|
+
setRandom(n, value, notify = true) {
|
|
303
|
+
if (n < 0 || n > this._length) {
|
|
304
|
+
throw new Error('n must be >= 0 && <= Count');
|
|
305
|
+
}
|
|
306
|
+
if (n > this._length / 2) {
|
|
307
|
+
this.setRandom(this._length - n, !value);
|
|
308
|
+
}
|
|
309
|
+
this.setAll(!value);
|
|
310
|
+
for (let k = 0; k < n;) {
|
|
311
|
+
const i = Math.floor(Math.random() * this._length);
|
|
312
|
+
if (this.getBit(i) == value)
|
|
313
|
+
continue;
|
|
314
|
+
this.setFast(i, value);
|
|
315
|
+
k++;
|
|
316
|
+
}
|
|
317
|
+
this.incrementVersion(notify);
|
|
318
|
+
}
|
|
319
|
+
/// Modifies current bitset by performing the bitwise AND operation against the
|
|
320
|
+
/// corresponding elements in the specified bitset.
|
|
321
|
+
and(value, notify = true) {
|
|
322
|
+
if (this._length != value._length) {
|
|
323
|
+
throw new Error('Array lengths differ.');
|
|
324
|
+
}
|
|
325
|
+
for (let i = 0, len = this.lengthInInts; i < len; i++) {
|
|
326
|
+
this._data[i] &= value._data[i];
|
|
327
|
+
}
|
|
328
|
+
this.incrementVersion(notify);
|
|
329
|
+
return this;
|
|
330
|
+
}
|
|
331
|
+
/// Performs the bitwise AND NOT operation on the elements in the current bitset
|
|
332
|
+
/// against the corresponding elements in the specified bitset.
|
|
333
|
+
andNot(value, notify = true) {
|
|
334
|
+
if (this._length != value._length) {
|
|
335
|
+
throw new Error('Array lengths differ.');
|
|
336
|
+
}
|
|
337
|
+
const len = this.lengthInInts;
|
|
338
|
+
for (let num2 = 0; num2 < len; num2++) {
|
|
339
|
+
this._data[num2] &= ~value._data[num2];
|
|
340
|
+
}
|
|
341
|
+
this.incrementVersion(notify);
|
|
342
|
+
return this;
|
|
343
|
+
}
|
|
344
|
+
/// Performs the bitwise NOT AND operation on the elements in the current bitset
|
|
345
|
+
/// against the corresponding elements in the specified bitset.
|
|
346
|
+
notAnd(value, notify = true) {
|
|
347
|
+
if (this._length != value._length) {
|
|
348
|
+
throw new Error('Array lengths differ.');
|
|
349
|
+
}
|
|
350
|
+
for (let i = 0, len = this.lengthInInts; i < len; i++) {
|
|
351
|
+
this._data[i] = (~this._data[i]) & value._data[i];
|
|
352
|
+
}
|
|
353
|
+
this.incrementVersion(notify);
|
|
354
|
+
return this;
|
|
355
|
+
}
|
|
356
|
+
/// Inverts all bit values in the current bitset
|
|
357
|
+
not(notify = true) {
|
|
358
|
+
for (let i = 0, len = this.lengthInInts; i < len; i++) {
|
|
359
|
+
this._data[i] = ~this._data[i];
|
|
360
|
+
}
|
|
361
|
+
this.incrementVersion(notify);
|
|
362
|
+
return this;
|
|
363
|
+
}
|
|
364
|
+
/// Performs the bitwise OR operation on the elements in the current bitset
|
|
365
|
+
/// against the corresponding elements in the specified bitset.
|
|
366
|
+
or(value, notify = true) {
|
|
367
|
+
if (this._length != value._length) {
|
|
368
|
+
throw new Error('Array lengths differ.');
|
|
369
|
+
}
|
|
370
|
+
for (let i = 0, len = this.lengthInInts; i < len; i++) {
|
|
371
|
+
this._data[i] |= value._data[i];
|
|
372
|
+
}
|
|
373
|
+
this.incrementVersion(notify);
|
|
374
|
+
return this;
|
|
375
|
+
}
|
|
376
|
+
/// Performs the bitwise exclusive OR operation on the elements in the current bitset
|
|
377
|
+
/// against the corresponding elements in the specified bitset.
|
|
378
|
+
xor(value, notify = true) {
|
|
379
|
+
if (this._length != value._length) {
|
|
380
|
+
throw new Error('Array lengths differ.');
|
|
381
|
+
}
|
|
382
|
+
for (let i = 0, len = this.lengthInInts; i < len; i++) {
|
|
383
|
+
this._data[i] ^= value._data[i];
|
|
384
|
+
}
|
|
385
|
+
this.incrementVersion(notify);
|
|
386
|
+
return this;
|
|
387
|
+
}
|
|
388
|
+
/// Inserts n 0-bits at position pos, resizing self and shifting bits appropriately.
|
|
389
|
+
insertAt(pos, n, flag = false) {
|
|
390
|
+
this.assureInRange(pos, 0, this._length, 'pos');
|
|
391
|
+
if (n == 0)
|
|
392
|
+
return;
|
|
393
|
+
//TODO: optimize
|
|
394
|
+
//the most primitive implementation, optimize it later!
|
|
395
|
+
// beginUpdate();
|
|
396
|
+
const oldlength = this._length;
|
|
397
|
+
this.setLength(this._length + n);
|
|
398
|
+
//if (!contains(!flag)) return; // nothing to do
|
|
399
|
+
for (let i = oldlength - 1; i >= pos; i--) {
|
|
400
|
+
this.setBit(i + n, this.getBit(i));
|
|
401
|
+
}
|
|
402
|
+
for (let i = pos; i < pos + n; i++) {
|
|
403
|
+
this.setBit(i, flag);
|
|
404
|
+
}
|
|
405
|
+
// endUpdate();
|
|
406
|
+
}
|
|
407
|
+
/// Deletes n bits beginning at position pos, resizing self and shifting remaining
|
|
408
|
+
/// bits appropriately.
|
|
409
|
+
removeAt(pos, n = 1) {
|
|
410
|
+
// the most primitive implementation, optimize it later!
|
|
411
|
+
if (n < 0) {
|
|
412
|
+
throw new Error('n cannot be negative');
|
|
413
|
+
}
|
|
414
|
+
this.assureInRange(pos, 0, this._length - n, 'pos');
|
|
415
|
+
if (this.contains(true)) {
|
|
416
|
+
for (let i = pos; i < this._length - n; i++) {
|
|
417
|
+
this.setBit(i, this.getBit(i + n));
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
this.setLength(this._length - n);
|
|
421
|
+
}
|
|
422
|
+
removeByMask(mask, flag = true) {
|
|
423
|
+
if (this._length != mask.length) {
|
|
424
|
+
throw new Error('length != mask.length');
|
|
425
|
+
}
|
|
426
|
+
if (mask == this) { // no need to iterate
|
|
427
|
+
this.setLength(mask.countBits(!flag));
|
|
428
|
+
this.setAll(!flag);
|
|
429
|
+
}
|
|
430
|
+
else {
|
|
431
|
+
let dstIdx = 0;
|
|
432
|
+
for (let srcIdx = -1; (srcIdx = mask.findNext(srcIdx, !flag)) != -1;) {
|
|
433
|
+
this.setFast(dstIdx++, this.getBit(srcIdx));
|
|
434
|
+
}
|
|
435
|
+
this._length = dstIdx;
|
|
436
|
+
this._version++;
|
|
437
|
+
}
|
|
438
|
+
return this;
|
|
439
|
+
}
|
|
440
|
+
/// Similar to the [] operator.
|
|
441
|
+
getBit(pos) {
|
|
442
|
+
return (this._data[Math.floor(pos / 0x20)] & (1 << (pos & 0x1f))) != 0;
|
|
443
|
+
}
|
|
444
|
+
/// Similar to the [] operator.
|
|
445
|
+
setBit(pos, bit, notify = true) {
|
|
446
|
+
this.setFast(pos, bit);
|
|
447
|
+
if (notify) {
|
|
448
|
+
this._version++;
|
|
449
|
+
}
|
|
450
|
+
else {
|
|
451
|
+
this._version++;
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
/// Sets [i]-th bit to [value], does not check bounds, does not increment version
|
|
455
|
+
setFast(i, value) {
|
|
456
|
+
if (value) {
|
|
457
|
+
this._data[Math.floor(i / 0x20)] |= 1 << (i & 0x1f);
|
|
458
|
+
}
|
|
459
|
+
else {
|
|
460
|
+
this._data[Math.floor(i / 0x20)] &= ~(1 << (i & 0x1f));
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
setTrue(pos) {
|
|
464
|
+
this._data[Math.floor(pos / 0x20)] |= 1 << (pos & 0x1f);
|
|
465
|
+
}
|
|
466
|
+
setFalse(pos) {
|
|
467
|
+
this._data[Math.floor(pos / 0x20)] &= ~(1 << (pos & 0x1f));
|
|
468
|
+
}
|
|
469
|
+
trueCount() {
|
|
470
|
+
return this.countBits(true);
|
|
471
|
+
}
|
|
472
|
+
falseCount() {
|
|
473
|
+
return this.countBits(false);
|
|
474
|
+
}
|
|
475
|
+
/// Counts bits of the specified value.
|
|
476
|
+
countBits(value) {
|
|
477
|
+
if (this._length == 0)
|
|
478
|
+
return 0;
|
|
479
|
+
if (this._selectedCountVersion != this._version) {
|
|
480
|
+
this._selectedCount = 0;
|
|
481
|
+
const len = this.lengthInInts;
|
|
482
|
+
let i = 0;
|
|
483
|
+
for (; i < len - 1; i++) {
|
|
484
|
+
for (let k = this._data[i]; k != 0; k >>>= 8) { //todo: cast data[i] to uint
|
|
485
|
+
this._selectedCount += BitArray._onBitCount[k & 0xff];
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
// The last int.
|
|
489
|
+
let k = this._data[i];
|
|
490
|
+
const remainingBits = this._length & 0x1f;
|
|
491
|
+
if (remainingBits != 0) { // if remainingBits == 0, the last int is fully used and ALL bits should be left as is.
|
|
492
|
+
k &= ~((4294967295) << remainingBits);
|
|
493
|
+
}
|
|
494
|
+
for (; k != 0; k >>>= 8) {
|
|
495
|
+
this._selectedCount += BitArray._onBitCount[k & 0xff];
|
|
496
|
+
}
|
|
497
|
+
this._selectedCountVersion = this._version;
|
|
498
|
+
}
|
|
499
|
+
return (value ? this._selectedCount : this._length - this._selectedCount);
|
|
500
|
+
}
|
|
501
|
+
/// Returns a number of set bits where also [check] is true
|
|
502
|
+
countWhere(check) {
|
|
503
|
+
let result = 0;
|
|
504
|
+
if (this.trueCount() == this._length) {
|
|
505
|
+
for (let i = 0; i < this._length; i++) {
|
|
506
|
+
result += check(i) ? 1 : 0;
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
else {
|
|
510
|
+
for (let i = -1; (i = this.findNext(i, true)) != -1;) {
|
|
511
|
+
result += check(i) ? 1 : 0;
|
|
512
|
+
}
|
|
513
|
+
}
|
|
514
|
+
return result;
|
|
515
|
+
}
|
|
516
|
+
/// Performs bit "and" and counts bits of the specified value, without bitset modification.
|
|
517
|
+
andWithCountBits(second, value) {
|
|
518
|
+
if (this._length == 0)
|
|
519
|
+
return 0;
|
|
520
|
+
let count = 0;
|
|
521
|
+
const len = this.lengthInInts;
|
|
522
|
+
let i = 0;
|
|
523
|
+
for (; i < len - 1; i++) {
|
|
524
|
+
for (var k = this._data[i] & second._data[i]; k != 0; k >>>= 8) {
|
|
525
|
+
count += BitArray._onBitCount[k & 0xff];
|
|
526
|
+
}
|
|
527
|
+
}
|
|
528
|
+
// The last int.
|
|
529
|
+
var k = this._data[i] & second._data[i];
|
|
530
|
+
const remainingBits = this._length & 0x1f;
|
|
531
|
+
if (remainingBits != 0) {
|
|
532
|
+
k &= ~((4294967295) << remainingBits);
|
|
533
|
+
}
|
|
534
|
+
for (; k != 0; k >>>= 8) {
|
|
535
|
+
count += BitArray._onBitCount[k & 0xff];
|
|
536
|
+
}
|
|
537
|
+
return (value ? count : this._length - count);
|
|
538
|
+
}
|
|
539
|
+
clear() {
|
|
540
|
+
this.setLength(0);
|
|
541
|
+
}
|
|
542
|
+
contains(value) {
|
|
543
|
+
return this.findNext(-1, value) >= 0;
|
|
544
|
+
}
|
|
545
|
+
get allTrue() {
|
|
546
|
+
return this.countBits(true) == this._length;
|
|
547
|
+
}
|
|
548
|
+
get allFalse() {
|
|
549
|
+
return this.countBits(false) == this._length;
|
|
550
|
+
}
|
|
551
|
+
get anyTrue() {
|
|
552
|
+
return this.countBits(true) > 0;
|
|
553
|
+
}
|
|
554
|
+
get anyFalse() {
|
|
555
|
+
return this.countBits(false) > 0;
|
|
556
|
+
}
|
|
557
|
+
/// Returns the position of the next bit of the specified value, starting from the specified position.
|
|
558
|
+
/// Returns -1, if there are no such bits.
|
|
559
|
+
findNext(index, value = true) {
|
|
560
|
+
this.assureInRange(index, -1, this._length, 'index');
|
|
561
|
+
if (index >= this._length - 1)
|
|
562
|
+
return -1;
|
|
563
|
+
index = index < 0 ? 0 : index + 1; // skip start
|
|
564
|
+
let unusedBits = index & 0x1f;
|
|
565
|
+
const numInts = this.lengthInInts;
|
|
566
|
+
for (let i = Math.floor(index / 32); i < numInts; i++) {
|
|
567
|
+
let k = (value ? this._data[i] : ~this._data[i]); // uint cast
|
|
568
|
+
if (unusedBits != 0) {
|
|
569
|
+
k &= ((0xffffffff << unusedBits) & 0xffffffff);
|
|
570
|
+
unusedBits = 0;
|
|
571
|
+
}
|
|
572
|
+
else if (!value && k == -4294967296) // looking for false, all bits are set
|
|
573
|
+
{
|
|
574
|
+
continue;
|
|
575
|
+
}
|
|
576
|
+
for (let j = 0; k != 0; j += 8, k >>>= 8) {
|
|
577
|
+
const p = BitArray._firstOnBit[k & 0xff];
|
|
578
|
+
if (p >= 0) {
|
|
579
|
+
index = p + (i * 32) + j;
|
|
580
|
+
if (index >= this._length)
|
|
581
|
+
return -1;
|
|
582
|
+
return index;
|
|
583
|
+
}
|
|
584
|
+
}
|
|
585
|
+
}
|
|
586
|
+
return -1;
|
|
587
|
+
}
|
|
588
|
+
/// Finds previous bit of the specified value in the bitset.
|
|
589
|
+
findPrev(index, value = true) {
|
|
590
|
+
if (index == 0)
|
|
591
|
+
return -1;
|
|
592
|
+
this.assureInRange(index, -1, this._length, 'index');
|
|
593
|
+
index = index < 0 ? this._length - 1 : index - 1; // skip start
|
|
594
|
+
const lastIntIdx = Math.floor(index / 0x20);
|
|
595
|
+
let remainingBits = (index + 1) & 0x1f;
|
|
596
|
+
for (let i = lastIntIdx; i >= 0; i--) {
|
|
597
|
+
let k = (value ? this._data[i] : ~this._data[i]); // cast
|
|
598
|
+
if (remainingBits != 0) {
|
|
599
|
+
k &= ~((4294967295) << remainingBits);
|
|
600
|
+
remainingBits = 0;
|
|
601
|
+
}
|
|
602
|
+
for (let j = 24; k != 0; j -= 8, k <<= 8) {
|
|
603
|
+
const p = BitArray._lastOnBit[k >>> 0x18];
|
|
604
|
+
if (p >= 0) {
|
|
605
|
+
return p + (i * 32) + j;
|
|
606
|
+
}
|
|
607
|
+
}
|
|
608
|
+
}
|
|
609
|
+
return -1;
|
|
610
|
+
}
|
|
611
|
+
}
|
|
612
|
+
BitArray._onBitCount = Int8Array.from([
|
|
613
|
+
0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4,
|
|
614
|
+
1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
|
|
615
|
+
1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
|
|
616
|
+
2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
|
|
617
|
+
1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
|
|
618
|
+
2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
|
|
619
|
+
2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
|
|
620
|
+
3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
|
|
621
|
+
1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
|
|
622
|
+
2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
|
|
623
|
+
2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
|
|
624
|
+
3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
|
|
625
|
+
2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
|
|
626
|
+
3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
|
|
627
|
+
3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
|
|
628
|
+
4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8
|
|
629
|
+
]);
|
|
630
|
+
BitArray._firstOnBit = Int8Array.from([
|
|
631
|
+
-1, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
|
|
632
|
+
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
|
|
633
|
+
5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
|
|
634
|
+
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
|
|
635
|
+
6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
|
|
636
|
+
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
|
|
637
|
+
5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
|
|
638
|
+
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
|
|
639
|
+
7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
|
|
640
|
+
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
|
|
641
|
+
5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
|
|
642
|
+
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
|
|
643
|
+
6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
|
|
644
|
+
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
|
|
645
|
+
5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
|
|
646
|
+
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0
|
|
647
|
+
]);
|
|
648
|
+
BitArray._lastOnBit = Int8Array.from([
|
|
649
|
+
-1, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,
|
|
650
|
+
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
|
|
651
|
+
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
|
|
652
|
+
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
|
|
653
|
+
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
|
|
654
|
+
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
|
|
655
|
+
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
|
|
656
|
+
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
|
|
657
|
+
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
|
|
658
|
+
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
|
|
659
|
+
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
|
|
660
|
+
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
|
|
661
|
+
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
|
|
662
|
+
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
|
|
663
|
+
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
|
|
664
|
+
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7
|
|
665
|
+
]);
|
|
666
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYml0LWFycmF5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiYml0LWFycmF5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBQyxPQUFPLE9BQU8sUUFBUTtJQW9FM0IsWUFBWSxHQUF5QixFQUFFLGVBQWlDLEtBQUs7UUFackUsWUFBTyxHQUFHLENBQUMsQ0FBQztRQUNaLGFBQVEsR0FBRyxDQUFDLENBQUM7UUFDYixpQkFBWSxHQUFHLENBQUMsQ0FBQztRQUNqQixtQkFBYyxHQUFHLENBQUMsQ0FBQztRQUNuQiwwQkFBcUIsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUMzQiw0QkFBdUIsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUM3QixtQkFBYyxHQUFHLEVBQUUsQ0FBQztRQUNwQiwwQkFBcUIsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNuQyxxQkFBZ0IsR0FBRyxLQUFLLENBQUM7UUFLdkIsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLEVBQUU7WUFDM0IsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDO1lBQ25CLElBQUksSUFBSSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDMUMsSUFBSSxZQUFZO2dCQUNkLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRTtvQkFDbEMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ2pCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO1lBQ2xCLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO1NBQ3ZCO2FBQU0sSUFBSSxHQUFHLFlBQVksV0FBVyxFQUFFO1lBQ3JDLElBQUksQ0FBQyxLQUFLLEdBQUcsR0FBa0IsQ0FBQztZQUNoQyxJQUFJLENBQUMsT0FBTyxHQUFHLFlBQXNCLENBQUM7U0FDdkM7YUFBTTtZQUNMLE1BQU0sSUFBSSxLQUFLLENBQUMscUJBQXFCLENBQUMsQ0FBQztTQUN4QztJQUNILENBQUM7SUFHRCxVQUFVLEtBQUssT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUVuQyxVQUFVLENBQUMsR0FBVyxFQUFFLE9BQWU7UUFDckMsSUFBSSxHQUFHLEdBQUcsQ0FBQztZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxPQUFPLDhCQUE4QixDQUFDLENBQUM7SUFDekUsQ0FBQztJQUVELGFBQWEsQ0FBQyxLQUFhLEVBQUUsR0FBVyxFQUFFLEdBQVcsRUFBRSxPQUFlO1FBQ3BFLElBQUksQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDLEVBQUU7WUFDbEMsTUFBTSxJQUFJLEtBQUssQ0FBQyxZQUFZLE9BQU8sS0FBSyxLQUFLLG1CQUFtQixHQUFHLEtBQUssR0FBRyxHQUFHLENBQUMsQ0FBQztTQUNqRjtJQUNILENBQUM7SUFFRCxJQUFJLENBQUMsR0FBZ0IsRUFBRSxHQUFnQixFQUFFLEtBQWE7UUFDcEQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUM5QixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ2pCO0lBQ0gsQ0FBQztJQUVELFFBQVEsQ0FBQyxLQUFlO1FBQ3RCLElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFO1lBQ2pDLE1BQU0sSUFBSSxLQUFLLENBQUMsbUJBQW1CLElBQUksQ0FBQyxPQUFPLE9BQU8sS0FBSyxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUM7U0FDekU7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDdEQsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxJQUFJLE1BQU07UUFDUixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDdEIsQ0FBQztJQUVELElBQUksTUFBTTtRQUNSLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztJQUNwQixDQUFDO0lBRUQsSUFBSSxNQUFNLENBQUMsSUFBaUI7UUFDMUIsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7UUFDbEIsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxJQUFJLE9BQU87UUFDVCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkIsQ0FBQztJQUVELElBQUksT0FBTyxDQUFDLEtBQWE7UUFDdkIsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7SUFDeEIsQ0FBQztJQUVELGdCQUFnQixDQUFDLE1BQU0sR0FBRyxJQUFJO1FBQzVCLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNsQixDQUFDO0lBRUQsSUFBSSxZQUFZO1FBQ2QsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRUQsSUFBSSxhQUFhO1FBQ2YsT0FBTyxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ2hGLENBQUM7SUFFRCxJQUFJLGFBQWEsQ0FBQyxJQUFZO1FBQzVCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO1FBQzNCLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQzdDLENBQUM7SUFFRCxJQUFJLElBQUk7UUFDTixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxTQUFTLENBQUMsS0FBYTtRQUNyQixJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUU7WUFDYixNQUFNLElBQUksS0FBSyxDQUFDLGdCQUFnQixDQUFDLENBQUM7U0FDbkM7UUFFRCxJQUFJLEtBQUssSUFBSSxJQUFJLENBQUMsT0FBTztZQUFFLE9BQU87UUFDbEMsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztRQUN0RCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ3BHLE1BQU0sT0FBTyxHQUFHLElBQUksV0FBVyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQzdDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ3BHLElBQUksQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDO1NBQ3RCO1FBRUQsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUN4QixJQUFJLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxHQUFHLENBQUMsRUFBRTtnQkFDM0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQ2hGO1lBQ0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxZQUFZLEVBQUUsV0FBVyxDQUFDLENBQUM7U0FDcEQ7UUFDRCxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztRQUNyQixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDbEIsQ0FBQztJQUVELE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBYyxFQUFFLElBQWM7UUFDM0MsSUFBSSxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDaEMsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQkFBbUIsSUFBSSxDQUFDLE9BQU8sT0FBTyxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQztTQUN4RTtRQUVELE1BQU0sSUFBSSxHQUFHLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN4QyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDNUIsSUFBSSxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNsRCxJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQztRQUVsQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO1FBQzlCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDNUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDL0M7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFTyxNQUFNLENBQUMsYUFBYSxDQUFDLE1BQWM7UUFDekMsT0FBTyxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUVELE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBc0I7UUFDdEMsTUFBTSxJQUFJLEdBQUcsSUFBSSxRQUFRLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDO1FBRWxCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3JDLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFO2dCQUNiLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQzthQUM5RDtTQUNGO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsc0dBQXNHO0lBQ3RHLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBYSxFQUFFLElBQWM7UUFDMUMsTUFBTSxJQUFJLEdBQUcsSUFBSSxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssRUFBRSxFQUFFLENBQUMsRUFBRTtZQUM5QixJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUN6QjtRQUNELElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDO1FBQ2xCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELGtFQUFrRTtJQUNsRSxNQUFNLENBQUMsVUFBVSxDQUFDLENBQVM7UUFDekIsT0FBTyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFTLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7SUFDdkUsQ0FBQztJQUVELDRFQUE0RTtJQUM1RSxNQUFNLENBQUMsZUFBZSxDQUFDLE9BQWUsRUFBRSxLQUFrQjtRQUN4RCxNQUFNLElBQUksR0FBRyxJQUFJLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNuQyxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCx5Q0FBeUM7SUFDekMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFpQjtRQUNoQyxNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO1FBQ3pCLE1BQU0sSUFBSSxHQUFHLElBQUksUUFBUSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNuQyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4RCxJQUFJLENBQUMsT0FBTyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFDdkIsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDO1FBQUMsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDO1FBRTNCLE9BQU8sQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ3hCLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUNuQixDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQztnQkFDckIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7Z0JBQ2hDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDO2dCQUNuQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQztZQUVyQyxJQUFJLElBQUksQ0FBQyxDQUFDO1NBQ1g7UUFFRCxJQUFJLEdBQUcsR0FBRyxJQUFJLElBQUksQ0FBQyxFQUFFO1lBQ25CLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQztTQUNyRDtRQUVELElBQUksR0FBRyxHQUFHLElBQUksSUFBSSxDQUFDLEVBQUU7WUFDbkIsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ25EO1FBRUQsSUFBSSxHQUFHLEdBQUcsSUFBSSxJQUFJLENBQUMsRUFBRTtZQUNuQixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUM7U0FDeEM7UUFFRCxJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQztRQUNsQixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxRQUFRO1FBQ04sT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLFVBQVUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQzdELENBQUM7SUFFRCw0Q0FBNEM7SUFDNUMsTUFBTSxDQUFDLEtBQWU7UUFDcEIsSUFBSSxJQUFJLElBQUksS0FBSztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQy9CLElBQUksS0FBSyxJQUFJLElBQUk7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUNoQyxJQUFJLElBQUksQ0FBQyxPQUFPLElBQUksS0FBSyxDQUFDLE9BQU87WUFBRSxPQUFPLEtBQUssQ0FBQztRQUNoRCxJQUFJLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBRW5DLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDOUMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO2dCQUFFLE9BQU8sS0FBSyxDQUFDO1NBQ25EO1FBRUQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUMvRCxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDckMsT0FBTyxLQUFLLENBQUM7YUFDZDtTQUNGO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsdUJBQXVCO0lBQ3ZCLEtBQUs7UUFDSCxNQUFNLFFBQVEsR0FBRyxJQUFJLFFBQVEsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDeEMsUUFBUSxDQUFDLEtBQUssR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLG1DQUFtQztRQUNsRixRQUFRLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDaEMsUUFBUSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQ2xDLE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFFRCw0QkFBNEI7SUFDNUIsSUFBSSxDQUFDLElBQWMsRUFBRSxNQUFlO1FBQ2xDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRTFCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3JDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFO2dCQUNYLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQzthQUM5RDtTQUNGO1FBRUQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzlCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELHFCQUFxQjtJQUNyQixNQUFNLENBQUMsTUFBTSxHQUFHLElBQUk7UUFDbEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7U0FDckI7UUFDRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVELG1FQUFtRTtJQUNuRSxNQUFNLENBQUMsS0FBYyxFQUFFLE1BQU0sR0FBRyxLQUFLO1FBQ25DLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM3QixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO1FBRTlCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDNUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7U0FDdkIsQ0FBQyxnQkFBZ0I7UUFFbEIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRCwrQ0FBK0M7SUFDL0MsOENBQThDO0lBQzlDLHdEQUF3RDtJQUN4RCxVQUFVLENBQUMsT0FBc0IsRUFBRSxLQUFLLEdBQUMsSUFBSSxFQUFFLEtBQUssR0FBQyxJQUFJLEVBQUUsTUFBTSxHQUFDLElBQUk7UUFDcEUsSUFBSSxLQUFLLEVBQUU7WUFDVCxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO1NBQzVCO1FBRUQsS0FBSyxNQUFNLENBQUMsSUFBSSxPQUFPLEVBQUU7WUFDdkIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7U0FDeEI7UUFFRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVELFVBQVUsQ0FBQyxPQUFzQixFQUFFLEtBQUssR0FBQyxJQUFJO1FBQzNDLEtBQUssTUFBTSxLQUFLLElBQUksT0FBTyxFQUFFO1lBQzNCLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLEVBQUU7Z0JBQy9CLE9BQU8sS0FBSyxDQUFDO2FBQ2Q7U0FDRjtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELFFBQVEsQ0FBQyxPQUFzQixFQUFFLEtBQUssR0FBQyxJQUFJO1FBQ3pDLEtBQUssTUFBTSxLQUFLLElBQUksT0FBTyxFQUFFO1lBQzNCLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLEVBQUU7Z0JBQy9CLE9BQU8sSUFBSSxDQUFDO2FBQ2I7U0FDRjtRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELFFBQVEsQ0FBQyxLQUFlLEVBQUUsS0FBSyxHQUFDLElBQUksRUFBRSxLQUFLLEdBQUMsSUFBSSxFQUFFLE1BQU0sR0FBQyxJQUFJLEVBQUUsVUFBVSxHQUFDLElBQUk7UUFDNUUsSUFBSSxLQUFLLElBQUksVUFBVSxFQUFFO1lBQ3ZCLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7U0FDNUI7UUFFRCxJQUFJLFVBQVUsRUFBRTtZQUNkLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUNyQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRTtvQkFDWixJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztpQkFDeEI7YUFDRjtTQUNGO2FBQU07WUFDTCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDckMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDNUM7U0FDRjtRQUVELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBRUQsUUFBUSxDQUFDLElBQVksRUFBRSxFQUFVLEVBQUUsS0FBYyxFQUFFLE1BQU0sR0FBQyxJQUFJO1FBQzVELElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUN0RCxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFFbEQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDakMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFL0IsZ0JBQWdCO1FBQ2hCLElBQUksS0FBSyxFQUFFO1lBQ1QsS0FBSyxJQUFJLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDakMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNqQjtTQUNGO2FBQU07WUFDTCxLQUFLLElBQUksQ0FBQyxHQUFHLEtBQUssRUFBRSxDQUFDLElBQUksR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUNqQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ2xCO1NBQ0Y7UUFFRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDOUIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsbUVBQW1FO0lBQ25FLFNBQVMsQ0FBQyxDQUFTLEVBQUUsS0FBYyxFQUFFLE1BQU0sR0FBQyxJQUFJO1FBQzlDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUM3QixNQUFNLElBQUksS0FBSyxDQUFDLDRCQUE0QixDQUFDLENBQUM7U0FDL0M7UUFFRCxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsRUFBRTtZQUN4QixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDMUM7UUFFRCxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFcEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBSTtZQUN2QixNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDbkQsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUs7Z0JBQUUsU0FBUztZQUN0QyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUN2QixDQUFDLEVBQUUsQ0FBQztTQUNMO1FBRUQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRCwrRUFBK0U7SUFDL0UsbURBQW1EO0lBQ25ELEdBQUcsQ0FBQyxLQUFlLEVBQUUsTUFBTSxHQUFDLElBQUk7UUFDOUIsSUFBSSxJQUFJLENBQUMsT0FBTyxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUU7WUFDakMsTUFBTSxJQUFJLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1NBQzFDO1FBRUQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNyRCxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDakM7UUFFRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDOUIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsZ0ZBQWdGO0lBQ2hGLCtEQUErRDtJQUMvRCxNQUFNLENBQUMsS0FBZSxFQUFFLE1BQU0sR0FBQyxJQUFJO1FBQ2pDLElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFO1lBQ2pDLE1BQU0sSUFBSSxLQUFLLENBQUMsdUJBQXVCLENBQUMsQ0FBQztTQUMxQztRQUVELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7UUFDOUIsS0FBSyxJQUFJLElBQUksR0FBRyxDQUFDLEVBQUUsSUFBSSxHQUFHLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRTtZQUNyQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUN4QztRQUVELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM5QixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxnRkFBZ0Y7SUFDaEYsK0RBQStEO0lBQy9ELE1BQU0sQ0FBQyxLQUFlLEVBQUUsTUFBTSxHQUFDLElBQUk7UUFDakMsSUFBSSxJQUFJLENBQUMsT0FBTyxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUU7WUFDakMsTUFBTSxJQUFJLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1NBQzFDO1FBRUQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNyRCxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNuRDtRQUVELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM5QixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxnREFBZ0Q7SUFDaEQsR0FBRyxDQUFDLE1BQU0sR0FBRyxJQUFJO1FBQ2YsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNyRCxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNoQztRQUVELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM5QixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCwyRUFBMkU7SUFDM0UsK0RBQStEO0lBQy9ELEVBQUUsQ0FBQyxLQUFlLEVBQUUsTUFBTSxHQUFHLElBQUk7UUFDL0IsSUFBSSxJQUFJLENBQUMsT0FBTyxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUU7WUFDakMsTUFBTSxJQUFJLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1NBQzFDO1FBRUQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNyRCxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDakM7UUFFRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDOUIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQscUZBQXFGO0lBQ3JGLCtEQUErRDtJQUMvRCxHQUFHLENBQUMsS0FBZSxFQUFFLE1BQU0sR0FBRyxJQUFJO1FBQ2hDLElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFO1lBQ2pDLE1BQU0sSUFBSSxLQUFLLENBQUMsdUJBQXVCLENBQUMsQ0FBQztTQUMxQztRQUVELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDckQsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ2pDO1FBRUQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzlCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELG9GQUFvRjtJQUNwRixRQUFRLENBQUMsR0FBVyxFQUFFLENBQVMsRUFBRSxJQUFJLEdBQUcsS0FBSztRQUMzQyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztRQUVoRCxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQUUsT0FBTztRQUVuQixnQkFBZ0I7UUFDaEIsdURBQXVEO1FBRXZELGlCQUFpQjtRQUNqQixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQy9CLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQztRQUVqQyxnREFBZ0Q7UUFFaEQsS0FBSyxJQUFJLENBQUMsR0FBRyxTQUFTLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDekMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNwQztRQUVELEtBQUssSUFBSSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ2xDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQ3RCO1FBRUQsZUFBZTtJQUNqQixDQUFDO0lBRUQsa0ZBQWtGO0lBQ2xGLHVCQUF1QjtJQUN2QixRQUFRLENBQUMsR0FBVyxFQUFFLENBQUMsR0FBRyxDQUFDO1FBQ3pCLHdEQUF3RDtRQUN4RCxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDVCxNQUFNLElBQUksS0FBSyxDQUFDLHNCQUFzQixDQUFDLENBQUM7U0FDekM7UUFFRCxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFcEQsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ3ZCLEtBQUssSUFBSSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDM0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNwQztTQUNGO1FBRUQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRCxZQUFZLENBQUMsSUFBYyxFQUFFLElBQUksR0FBRyxJQUFJO1FBQ3RDLElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQy9CLE1BQU0sSUFBSSxLQUFLLENBQUMsdUJBQXVCLENBQUMsQ0FBQztTQUMxQztRQUVELElBQUksSUFBSSxJQUFJLElBQUksRUFBRSxFQUFFLHFCQUFxQjtZQUN2QyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ3RDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNwQjthQUFNO1lBQ0wsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDO1lBRWYsS0FBSyxJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUc7Z0JBQ3BFLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO2FBQzdDO1lBRUQsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7WUFDdEIsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1NBQ2pCO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsK0JBQStCO0lBQy9CLE1BQU0sQ0FBQyxHQUFXO1FBQ2hCLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN6RSxDQUFDO0lBRUQsK0JBQStCO0lBQy9CLE1BQU0sQ0FBQyxHQUFXLEVBQUUsR0FBWSxFQUFFLE1BQU0sR0FBRyxJQUFJO1FBQzdDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZCLElBQUksTUFBTSxFQUFFO1lBQ1YsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1NBQ2pCO2FBQU07WUFDTCxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7U0FDakI7SUFDSCxDQUFDO0lBRUQsaUZBQWlGO0lBQ2pGLE9BQU8sQ0FBQyxDQUFTLEVBQUUsS0FBYztRQUMvQixJQUFJLEtBQUssRUFBRTtZQUNULElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7U0FDckQ7YUFBTTtZQUNMLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7U0FDeEQ7SUFDSCxDQUFDO0lBRUQsT0FBTyxDQUFDLEdBQVc7UUFDakIsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBQ0QsUUFBUSxDQUFDLEdBQVc7UUFDbEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBRUQsU0FBUztRQUNQLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBQ0QsVUFBVTtRQUNSLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRUQsdUNBQXVDO0lBQ3ZDLFNBQVMsQ0FBQyxLQUFjO1FBQ3RCLElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDO1lBQUUsT0FBTyxDQUFDLENBQUM7UUFFaEMsSUFBSSxJQUFJLENBQUMscUJBQXFCLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUMvQyxJQUFJLENBQUMsY0FBYyxHQUFHLENBQUMsQ0FBQztZQUN4QixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO1lBQzlCLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNWLE9BQU8sQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ3ZCLEtBQUssSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSw0QkFBNEI7b0JBQzFFLElBQUksQ0FBQyxjQUFjLElBQUksUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7aUJBQ3ZEO2FBQ0Y7WUFFRCxnQkFBZ0I7WUFDaEIsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN0QixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztZQUMxQyxJQUFJLGFBQWEsSUFBSSxDQUFDLEVBQUUsRUFBQyx1RkFBdUY7Z0JBQzlHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxhQUFhLENBQUMsQ0FBQzthQUN2QztZQUVELE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFO2dCQUN2QixJQUFJLENBQUMsY0FBYyxJQUFJLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO2FBQ3ZEO1lBRUQsSUFBSSxDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7U0FDNUM7UUFFRCxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUM1RSxDQUFDO0lBRUQsMkRBQTJEO0lBQzNELFVBQVUsQ0FBQyxLQUFlO1FBQ3hCLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQztRQUNmLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDcEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ3JDLE1BQU0sSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQzVCO1NBQ0Y7YUFBTTtZQUNMLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRztnQkFDcEQsTUFBTSxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDNUI7U0FDRjtRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFRCwyRkFBMkY7SUFDM0YsZ0JBQWdCLENBQUMsTUFBZ0IsRUFBRSxLQUFjO1FBQy9DLElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDO1lBQUUsT0FBTyxDQUFDLENBQUM7UUFFaEMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO1FBQUMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztRQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN4RCxPQUFPLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3ZCLEtBQUssSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRTtnQkFDOUQsS0FBSyxJQUFJLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO2FBQ3pDO1NBQ0Y7UUFFRCxnQkFBZ0I7UUFDaEIsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hDLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBQzFDLElBQUksYUFBYSxJQUFJLENBQUMsRUFBRTtZQUN0QixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksYUFBYSxDQUFDLENBQUM7U0FDdkM7UUFDRCxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUN2QixLQUFLLElBQUksUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7U0FDekM7UUFFRCxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVELEtBQUs7UUFDSCxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BCLENBQUM7SUFDRCxRQUFRLENBQUMsS0FBYztRQUNyQixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFDRCxJQUFJLE9BQU87UUFDVCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUM5QyxDQUFDO0lBQ0QsSUFBSSxRQUFRO1FBQ1YsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDL0MsQ0FBQztJQUNELElBQUksT0FBTztRQUNULE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUNELElBQUksUUFBUTtRQUNWLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVELHNHQUFzRztJQUN0RywwQ0FBMEM7SUFDMUMsUUFBUSxDQUFDLEtBQWEsRUFBRSxLQUFLLEdBQUcsSUFBSTtRQUNsQyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBRXJELElBQUksS0FBSyxJQUFJLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQztZQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDekMsS0FBSyxHQUFHLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLGFBQWE7UUFDaEQsSUFBSSxVQUFVLEdBQUcsS0FBSyxHQUFHLElBQUksQ0FBQztRQUM5QixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO1FBRWxDLEtBQUssSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLE9BQU8sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNyRCxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZO1lBQzlELElBQUksVUFBVSxJQUFJLENBQUMsRUFBRTtnQkFDbkIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxVQUFVLElBQUksVUFBVSxDQUFDLEdBQUcsVUFBVSxDQUFDLENBQUM7Z0JBQy9DLFVBQVUsR0FBRyxDQUFDLENBQUM7YUFDaEI7aUJBQU0sSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsc0NBQXNDO2FBQzdFO2dCQUNFLFNBQVM7YUFDVjtZQUVELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFO2dCQUN4QyxNQUFNLENBQUMsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztnQkFDekMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFO29CQUNWLEtBQUssR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUN6QixJQUFJLEtBQUssSUFBSSxJQUFJLENBQUMsT0FBTzt3QkFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO29CQUNyQyxPQUFPLEtBQUssQ0FBQztpQkFDZDthQUNGO1NBQ0Y7UUFDRCxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQ1osQ0FBQztJQUVELDREQUE0RDtJQUM1RCxRQUFRLENBQUMsS0FBYSxFQUFFLEtBQUssR0FBRyxJQUFJO1FBQ2xDLElBQUksS0FBSyxJQUFJLENBQUM7WUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQzFCLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFFckQsS0FBSyxHQUFHLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsYUFBYTtRQUUvRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQztRQUM1QyxJQUFJLGFBQWEsR0FBRyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7UUFFdkMsS0FBSyxJQUFJLENBQUMsR0FBRyxVQUFVLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNwQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPO1lBQ3pELElBQUksYUFBYSxJQUFJLENBQUMsRUFBRTtnQkFDdEIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLGFBQWEsQ0FBQyxDQUFDO2dCQUN0QyxhQUFhLEdBQUcsQ0FBQyxDQUFDO2FBQ25CO1lBQ0QsS0FBSyxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQ3hDLE1BQU0sQ0FBQyxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDO2dCQUMxQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUU7b0JBQ1YsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2lCQUN6QjthQUNGO1NBQ0Y7UUFDRCxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQ1osQ0FBQzs7QUE1dkJNLG9CQUFXLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQztJQUNsQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQUMsQ0FBQyxDQUFDO0FBRTVDLG9CQUFXLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQztJQUNsQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDL0MsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FBQyxDQUFDLENBQUM7QUFFNUMsbUJBQVUsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDO0lBQ2pDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUMvQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBkZWZhdWx0IGNsYXNzIEJpdEFycmF5IHtcbiAgc3RhdGljIF9vbkJpdENvdW50ID0gSW50OEFycmF5LmZyb20oW1xuICAgIDAsIDEsIDEsIDIsIDEsIDIsIDIsIDMsIDEsIDIsIDIsIDMsIDIsIDMsIDMsIDQsXG4gICAgMSwgMiwgMiwgMywgMiwgMywgMywgNCwgMiwgMywgMywgNCwgMywgNCwgNCwgNSxcbiAgICAxLCAyLCAyLCAzLCAyLCAzLCAzLCA0LCAyLCAzLCAzLCA0LCAzLCA0LCA0LCA1LFxuICAgIDIsIDMsIDMsIDQsIDMsIDQsIDQsIDUsIDMsIDQsIDQsIDUsIDQsIDUsIDUsIDYsXG4gICAgMSwgMiwgMiwgMywgMiwgMywgMywgNCwgMiwgMywgMywgNCwgMywgNCwgNCwgNSxcbiAgICAyLCAzLCAzLCA0LCAzLCA0LCA0LCA1LCAzLCA0LCA0LCA1LCA0LCA1LCA1LCA2LFxuICAgIDIsIDMsIDMsIDQsIDMsIDQsIDQsIDUsIDMsIDQsIDQsIDUsIDQsIDUsIDUsIDYsXG4gICAgMywgNCwgNCwgNSwgNCwgNSwgNSwgNiwgNCwgNSwgNSwgNiwgNSwgNiwgNiwgNyxcbiAgICAxLCAyLCAyLCAzLCAyLCAzLCAzLCA0LCAyLCAzLCAzLCA0LCAzLCA0LCA0LCA1LFxuICAgIDIsIDMsIDMsIDQsIDMsIDQsIDQsIDUsIDMsIDQsIDQsIDUsIDQsIDUsIDUsIDYsXG4gICAgMiwgMywgMywgNCwgMywgNCwgNCwgNSwgMywgNCwgNCwgNSwgNCwgNSwgNSwgNixcbiAgICAzLCA0LCA0LCA1LCA0LCA1LCA1LCA2LCA0LCA1LCA1LCA2LCA1LCA2LCA2LCA3LFxuICAgIDIsIDMsIDMsIDQsIDMsIDQsIDQsIDUsIDMsIDQsIDQsIDUsIDQsIDUsIDUsIDYsXG4gICAgMywgNCwgNCwgNSwgNCwgNSwgNSwgNiwgNCwgNSwgNSwgNiwgNSwgNiwgNiwgNyxcbiAgICAzLCA0LCA0LCA1LCA0LCA1LCA1LCA2LCA0LCA1LCA1LCA2LCA1LCA2LCA2LCA3LFxuICAgIDQsIDUsIDUsIDYsIDUsIDYsIDYsIDcsIDUsIDYsIDYsIDcsIDYsIDcsIDcsIDhdKTtcblxuICBzdGF0aWMgX2ZpcnN0T25CaXQgPSBJbnQ4QXJyYXkuZnJvbShbXG4gICAgLTEsIDAsIDEsIDAsIDIsIDAsIDEsIDAsIDMsIDAsIDEsIDAsIDIsIDAsIDEsIDAsXG4gICAgNCwgMCwgMSwgMCwgMiwgMCwgMSwgMCwgMywgMCwgMSwgMCwgMiwgMCwgMSwgMCxcbiAgICA1LCAwLCAxLCAwLCAyLCAwLCAxLCAwLCAzLCAwLCAxLCAwLCAyLCAwLCAxLCAwLFxuICAgIDQsIDAsIDEsIDAsIDIsIDAsIDEsIDAsIDMsIDAsIDEsIDAsIDIsIDAsIDEsIDAsXG4gICAgNiwgMCwgMSwgMCwgMiwgMCwgMSwgMCwgMywgMCwgMSwgMCwgMiwgMCwgMSwgMCxcbiAgICA0LCAwLCAxLCAwLCAyLCAwLCAxLCAwLCAzLCAwLCAxLCAwLCAyLCAwLCAxLCAwLFxuICAgIDUsIDAsIDEsIDAsIDIsIDAsIDEsIDAsIDMsIDAsIDEsIDAsIDIsIDAsIDEsIDAsXG4gICAgNCwgMCwgMSwgMCwgMiwgMCwgMSwgMCwgMywgMCwgMSwgMCwgMiwgMCwgMSwgMCxcbiAgICA3LCAwLCAxLCAwLCAyLCAwLCAxLCAwLCAzLCAwLCAxLCAwLCAyLCAwLCAxLCAwLFxuICAgIDQsIDAsIDEsIDAsIDIsIDAsIDEsIDAsIDMsIDAsIDEsIDAsIDIsIDAsIDEsIDAsXG4gICAgNSwgMCwgMSwgMCwgMiwgMCwgMSwgMCwgMywgMCwgMSwgMCwgMiwgMCwgMSwgMCxcbiAgICA0LCAwLCAxLCAwLCAyLCAwLCAxLCAwLCAzLCAwLCAxLCAwLCAyLCAwLCAxLCAwLFxuICAgIDYsIDAsIDEsIDAsIDIsIDAsIDEsIDAsIDMsIDAsIDEsIDAsIDIsIDAsIDEsIDAsXG4gICAgNCwgMCwgMSwgMCwgMiwgMCwgMSwgMCwgMywgMCwgMSwgMCwgMiwgMCwgMSwgMCxcbiAgICA1LCAwLCAxLCAwLCAyLCAwLCAxLCAwLCAzLCAwLCAxLCAwLCAyLCAwLCAxLCAwLFxuICAgIDQsIDAsIDEsIDAsIDIsIDAsIDEsIDAsIDMsIDAsIDEsIDAsIDIsIDAsIDEsIDBdKTtcblxuICBzdGF0aWMgX2xhc3RPbkJpdCA9IEludDhBcnJheS5mcm9tKFtcbiAgICAtMSwgMCwgMSwgMSwgMiwgMiwgMiwgMiwgMywgMywgMywgMywgMywgMywgMywgMyxcbiAgICA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LFxuICAgIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsXG4gICAgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSxcbiAgICA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LFxuICAgIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsXG4gICAgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNixcbiAgICA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LFxuICAgIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsXG4gICAgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNyxcbiAgICA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LFxuICAgIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsXG4gICAgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNyxcbiAgICA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LFxuICAgIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsXG4gICAgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgN10pO1xuXG4gIHByaXZhdGUgX2RhdGE6IFVpbnQzMkFycmF5O1xuICBwcml2YXRlIF9sZW5ndGggPSAwO1xuICBwcml2YXRlIF92ZXJzaW9uID0gMDtcbiAgcHJpdmF0ZSBfdXBkYXRlTGV2ZWwgPSAwO1xuICBwcml2YXRlIF9zZWxlY3RlZENvdW50ID0gMDtcbiAgcHJpdmF0ZSBfc2VsZWN0ZWRDb3VudFZlcnNpb24gPSAtMTtcbiAgcHJpdmF0ZSBfc2VsZWN0ZWRJbmRleGVzVmVyc2lvbiA9IC0xO1xuICBwcml2YXRlIF92ZXJzaW9uZWROYW1lID0gJyc7XG4gIHByaXZhdGUgX3ZlcnNpb25lZE5hbWVWZXJzaW9uID0gLTE7XG4gIFNIUklOS19USFJFU0hPTEQgPSAweDEwMDtcblxuICBjb25zdHJ1Y3RvcihkYXRhOiBVaW50MzJBcnJheSwgbGVuZ3RoOiBudW1iZXIpXG4gIGNvbnN0cnVjdG9yKGxlbmd0aDogbnVtYmVyLCBkZWZhdWx0VmFsdWU/OiBib29sZWFuKVxuICBjb25zdHJ1Y3Rvcihhcmc6IG51bWJlciB8IFVpbnQzMkFycmF5LCBkZWZhdWx0VmFsdWU6IGJvb2xlYW4gfCBudW1iZXIgPSBmYWxzZSkge1xuICAgIGlmICh0eXBlb2YgYXJnID09PSAnbnVtYmVyJykge1xuICAgICAgY29uc3QgbGVuZ3RoID0gYXJnO1xuICAgICAgbGV0IGJ1ZmYgPSBCaXRBcnJheS5fY3JlYXRlQnVmZmVyKGxlbmd0aCk7XG4gICAgICBpZiAoZGVmYXVsdFZhbHVlKVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ1ZmYubGVuZ3RoOyBpKyspXG4gICAgICAgICAgYnVmZltpXSA9IC0xO1xuICAgICAgdGhpcy5fZGF0YSA9IGJ1ZmY7XG4gICAgICB0aGlzLl9sZW5ndGggPSBsZW5ndGg7XG4gICAgfSBlbHNlIGlmIChhcmcgaW5zdGFuY2VvZiBVaW50MzJBcnJheSkge1xuICAgICAgdGhpcy5fZGF0YSA9IGFyZyBhcyBVaW50MzJBcnJheTtcbiAgICAgIHRoaXMuX2xlbmd0aCA9IGRlZmF1bHRWYWx1ZSBhcyBudW1iZXI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgY29uc3RydWN0b3JcIik7XG4gICAgfVxuICB9XG5cblxuICBnZXRSYXdEYXRhKCkgeyByZXR1cm4gdGhpcy5fZGF0YTsgfVxuXG4gIGFzc3VyZUdvZXoobnVtOiBudW1iZXIsIGFyZ05hbWU6IFN0cmluZyk6IHZvaWQge1xuICAgIGlmIChudW0gPCAwKSB0aHJvdyBuZXcgRXJyb3IoYCR7YXJnTmFtZX0gc2hvdWxkIGJlIGdyZWF0ZXIgdGhhbiB6ZXJvYCk7XG4gIH1cblxuICBhc3N1cmVJblJhbmdlKHZhbHVlOiBudW1iZXIsIG1pbjogbnVtYmVyLCBtYXg6IG51bWJlciwgYXJnTmFtZTogU3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCh2YWx1ZSA8IG1pbikgfHwgKHZhbHVlID4gbWF4KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBBcmd1bWVudCAke2FyZ05hbWV9ICgke3ZhbHVlfSkgb3V0IG9mIHJhbmdlICgke21pbn0sICR7bWF4fSlgKTtcbiAgICB9XG4gIH1cblxuICBjb3B5KHNyYzogVWludDMyQXJyYXksIGRzdDogVWludDMyQXJyYXksIGNvdW50OiBudW1iZXIpOiB2b2lkIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcbiAgICAgIGRzdFtpXSA9IHNyY1tpXTtcbiAgICB9XG4gIH1cblxuICBjb3B5RnJvbShvdGhlcjogQml0QXJyYXkpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fbGVuZ3RoICE9IG90aGVyLl9sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTGVuZ3RocyBkaWZmZXIgKCR7dGhpcy5fbGVuZ3RofSAhPSAke290aGVyLl9sZW5ndGh9KWApO1xuICAgIH1cbiAgICB0aGlzLmNvcHkob3RoZXIuX2RhdGEsIHRoaXMuX2RhdGEsIHRoaXMubGVuZ3RoSW5JbnRzKTtcbiAgICB0aGlzLl92ZXJzaW9uKys7XG4gIH1cblxuICBnZXQgbGVuZ3RoKCkge1xuICAgIHJldHVybiB0aGlzLl9sZW5ndGg7XG4gIH1cblxuICBnZXQgYnVmZmVyKCkge1xuICAgIHJldHVybiB0aGlzLl9kYXRhO1xuICB9XG5cbiAgc2V0IGJ1ZmZlcihkYXRhOiBVaW50MzJBcnJheSkge1xuICAgIHRoaXMuX2RhdGEgPSBkYXRhO1xuICAgIHRoaXMuX3ZlcnNpb24rKztcbiAgfVxuXG4gIGdldCB2ZXJzaW9uKCkge1xuICAgIHJldHVybiB0aGlzLl92ZXJzaW9uO1xuICB9XG5cbiAgc2V0IHZlcnNpb24odmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX3ZlcnNpb24gPSB2YWx1ZTtcbiAgfVxuXG4gIGluY3JlbWVudFZlcnNpb24obm90aWZ5ID0gdHJ1ZSk6IHZvaWQge1xuICAgIHRoaXMuX3ZlcnNpb24rKztcbiAgfVxuXG4gIGdldCBsZW5ndGhJbkludHMoKSB7XG4gICAgcmV0dXJuIE1hdGguZmxvb3IoKHRoaXMuX2xlbmd0aCArIDB4MWYpIC8gMHgyMCk7XG4gIH1cblxuICBnZXQgdmVyc2lvbmVkTmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fdmVyc2lvbiA9PSB0aGlzLl92ZXJzaW9uZWROYW1lVmVyc2lvbiA/IHRoaXMuX3ZlcnNpb25lZE5hbWUgOiAnJztcbiAgfVxuXG4gIHNldCB2ZXJzaW9uZWROYW1lKG5hbWU6IHN0cmluZykge1xuICAgIHRoaXMuX3ZlcnNpb25lZE5hbWUgPSBuYW1lO1xuICAgIHRoaXMuX3ZlcnNpb25lZE5hbWVWZXJzaW9uID0gdGhpcy5fdmVyc2lvbjtcbiAgfVxuXG4gIGdldCBzZWxmKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0TGVuZ3RoKHZhbHVlOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAodmFsdWUgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Nob3VsZCBiZSA+PSAwJyk7XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlID09IHRoaXMuX2xlbmd0aCkgcmV0dXJuO1xuICAgIGNvbnN0IG5JbnRzTmVlZGVkID0gTWF0aC5mbG9vcigodmFsdWUgKyAweDFmKSAvIDB4MjApO1xuICAgIGlmICgobkludHNOZWVkZWQgPiB0aGlzLl9kYXRhLmxlbmd0aCkgfHwgKChuSW50c05lZWRlZCArIHRoaXMuU0hSSU5LX1RIUkVTSE9MRCkgPCB0aGlzLl9kYXRhLmxlbmd0aCkpIHtcbiAgICAgIGNvbnN0IG5ld0RhdGEgPSBuZXcgVWludDMyQXJyYXkobkludHNOZWVkZWQpO1xuICAgICAgdGhpcy5jb3B5KHRoaXMuX2RhdGEsIG5ld0RhdGEsIChuSW50c05lZWRlZCA+IHRoaXMuX2RhdGEubGVuZ3RoKSA/IHRoaXMuX2RhdGEubGVuZ3RoIDogbkludHNOZWVkZWQpO1xuICAgICAgdGhpcy5fZGF0YSA9IG5ld0RhdGE7XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlID4gdGhpcy5fbGVuZ3RoKSB7XG4gICAgICBpZiAodGhpcy5fbGVuZ3RoICUgMHgyMCA+IDApIHtcbiAgICAgICAgdGhpcy5fZGF0YVt0aGlzLmxlbmd0aEluSW50cyAtIDFdICY9ICgxIDw8ICgodGhpcy5fbGVuZ3RoICUgMHgyMCkgJiAweDFmKSkgLSAxO1xuICAgICAgfVxuICAgICAgdGhpcy5fZGF0YS5maWxsKDAsIHRoaXMubGVuZ3RoSW5JbnRzLCBuSW50c05lZWRlZCk7XG4gICAgfVxuICAgIHRoaXMuX2xlbmd0aCA9IHZhbHVlO1xuICAgIHRoaXMuX3ZlcnNpb24rKztcbiAgfVxuXG4gIHN0YXRpYyBmcm9tQW5kKHNldDE6IEJpdEFycmF5LCBzZXQyOiBCaXRBcnJheSk6IEJpdEFycmF5IHtcbiAgICBpZiAoc2V0MS5fbGVuZ3RoICE9IHNldDIuX2xlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBMZW5ndGhzIGRpZmZlciAoJHtzZXQxLl9sZW5ndGh9ICE9ICR7c2V0Mi5fbGVuZ3RofSlgKTtcbiAgICB9XG5cbiAgICBjb25zdCB0ZW1wID0gbmV3IEJpdEFycmF5KHNldDEuX2xlbmd0aCk7XG4gICAgdGVtcC5fbGVuZ3RoID0gc2V0MS5fbGVuZ3RoO1xuICAgIHRlbXAuX2RhdGEgPSBCaXRBcnJheS5fY3JlYXRlQnVmZmVyKHRlbXAuX2xlbmd0aCk7XG4gICAgdGVtcC5fdmVyc2lvbiA9IDA7XG5cbiAgICBjb25zdCBsZW4gPSBzZXQxLmxlbmd0aEluSW50cztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICB0ZW1wLl9kYXRhW2ldID0gc2V0MS5fZGF0YVtpXSAmIHNldDIuX2RhdGFbaV07XG4gICAgfVxuICAgIHJldHVybiB0ZW1wO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgX2NyZWF0ZUJ1ZmZlcihsZW5ndGg6IG51bWJlcik6IFVpbnQzMkFycmF5IHtcbiAgICByZXR1cm4gbmV3IFVpbnQzMkFycmF5KE1hdGguZmxvb3IoKGxlbmd0aCArIDB4MWYpIC8gMHgyMCkpO1xuICB9XG5cbiAgc3RhdGljIGZyb21WYWx1ZXModmFsdWVzOiBBcnJheTxib29sZWFuPik6IEJpdEFycmF5IHtcbiAgICBjb25zdCB0ZW1wID0gbmV3IEJpdEFycmF5KHZhbHVlcy5sZW5ndGgpO1xuICAgIHRlbXAuX3ZlcnNpb24gPSAwO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZW1wLl9sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHZhbHVlc1tpXSkge1xuICAgICAgICB0ZW1wLl9kYXRhW01hdGguZmxvb3IoaSAvIDB4MjApXSB8PSAxIDw8ICgoaSAlIDB4MjApICYgMHgxZik7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0ZW1wO1xuICB9XG5cbiAgLy8vIENvbnN0cnVjdHMgYSBbQml0U2V0XSBvZiBsZW5ndGggW2NvdW50XSwgd2hlcmUgaWR4LXRoIGJpdCBpcyBkZXRlcm1pbmVkIGJ5IGEgY2FsbCB0byBbZmxhZ10gKGlkeCkuXG4gIHN0YXRpYyBmcm9tU2VxKGNvdW50OiBudW1iZXIsIGZsYWc6IEZ1bmN0aW9uKTogQml0QXJyYXkge1xuICAgIGNvbnN0IHRlbXAgPSBuZXcgQml0QXJyYXkoY291bnQpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7ICsraSkge1xuICAgICAgdGVtcC5zZXRCaXQoaSwgZmxhZyhpKSk7XG4gICAgfVxuICAgIHRlbXAuX3ZlcnNpb24gPSAwO1xuICAgIHJldHVybiB0ZW1wO1xuICB9XG5cbiAgLy8vIENvbnN0cnVjdHMgYSBbQml0U2V0XSBmcm9tIGEgc3RyaW5nIFtzXSBjb250YWluaW5nICcwJyBvciAnMScuXG4gIHN0YXRpYyBmcm9tU3RyaW5nKHM6IHN0cmluZyk6IEJpdEFycmF5IHtcbiAgICByZXR1cm4gQml0QXJyYXkuZnJvbVNlcShzLmxlbmd0aCwgKGk6IG51bWJlcikgPT4gcy5jaGFyQXQoaSkgPT0gJzEnKTtcbiAgfVxuXG4gIC8vLyBDb25zdHJ1Y3RzIGEgW0JpdFNldF0sIGJhc2VkIG9uIGxlbmd0aCBbX2xlbmd0aF0gYW5kIGJ5dGUgYXJyYXkgW19kYXRhXS5cbiAgc3RhdGljIGZyb21VaW50MzJBcnJheShfbGVuZ3RoOiBudW1iZXIsIF9kYXRhOiBVaW50MzJBcnJheSk6IEJpdEFycmF5IHtcbiAgICBjb25zdCB0ZW1wID0gbmV3IEJpdEFycmF5KF9sZW5ndGgpO1xuICAgIHRlbXAuX2RhdGEgPSBfZGF0YTtcbiAgICByZXR1cm4gdGVtcDtcbiAgfVxuXG4gIC8vLyBEZXNlcmlhbGl6ZXMgYSBbQml0U2V0XSBmcm9tIFtieXRlc10uXG4gIHN0YXRpYyBmcm9tQnl0ZXMoYnl0ZXM6IFVpbnQ4QXJyYXkpOiBCaXRBcnJheSB7XG4gICAgY29uc3QgbGVuID0gYnl0ZXMubGVuZ3RoO1xuICAgIGNvbnN0IHRlbXAgPSBuZXcgQml0QXJyYXkobGVuICogOCk7XG4gICAgdGVtcC5fZGF0YSA9IG5ldyBVaW50MzJBcnJheShNYXRoLmZsb29yKChsZW4gKyAzKSAvIDQpKTtcbiAgICB0ZW1wLl9sZW5ndGggPSBsZW4gKiA4O1xuICAgIGxldCBudW0xID0gMDsgbGV0IG51bTIgPSAwO1xuXG4gICAgd2hpbGUgKChsZW4gLSBudW0yKSA+PSA0KSB7XG4gICAgICB0ZW1wLl9kYXRhW251bTErK10gPSAoXG4gICAgICAgICgoYnl0ZXNbbnVtMl0gJiAweGZmKSB8XG4gICAgICAgICgoYnl0ZXNbbnVtMiArIDFdICYgMHhmZikgPDwgOCkpIHxcbiAgICAgICAgKChieXRlc1tudW0yICsgMl0gJiAweGZmKSA8PCAweDEwKSkgfFxuICAgICAgICAoKGJ5dGVzW251bTIgKyAzXSAmIDB4ZmYpIDw8IDB4MTgpO1xuXG4gICAgICBudW0yICs9IDQ7XG4gICAgfVxuXG4gICAgaWYgKGxlbiAtIG51bTIgPT0gMykge1xuICAgICAgdGVtcC5fZGF0YVtudW0xXSA9IChieXRlc1tudW0yICsgMl0gJiAweGZmKSA8PCAweDEwO1xuICAgIH1cblxuICAgIGlmIChsZW4gLSBudW0yID09IDIpIHtcbiAgICAgIHRlbXAuX2RhdGFbbnVtMV0gfD0gKGJ5dGVzW251bTIgKyAxXSAmIDB4ZmYpIDw8IDg7XG4gICAgfVxuXG4gICAgaWYgKGxlbiAtIG51bTIgPT0gMSkge1xuICAgICAgdGVtcC5fZGF0YVtudW0xXSB8PSBieXRlc1tudW0yXSAmIDB4ZmY7XG4gICAgfVxuXG4gICAgdGVtcC5fdmVyc2lvbiA9IDA7XG4gICAgcmV0dXJuIHRlbXA7XG4gIH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLl9sZW5ndGh9IGJpdHMsICR7dGhpcy5jb3VudEJpdHModHJ1ZSl9IHNldGA7XG4gIH1cblxuICAvLy8gUGVyZm9ybXMgZGVlcCBjb21wYXJpc29uIG9mIHR3byBiaXRzZXRzLlxuICBlcXVhbHMob3RoZXI6IEJpdEFycmF5KTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMgPT0gb3RoZXIpIHJldHVybiB0cnVlO1xuICAgIGlmIChvdGhlciA9PSBudWxsKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHRoaXMuX2xlbmd0aCAhPSBvdGhlci5fbGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHRoaXMuX2xlbmd0aCA9PSAwKSByZXR1cm4gdHJ1ZTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fZGF0YS5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLl9kYXRhW2ldICE9IG90aGVyLl9kYXRhW2ldKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9ICh0aGlzLl9kYXRhLmxlbmd0aCAtIDEpICogODsgaSA8IHRoaXMuX2xlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5nZXRCaXQoaSkgIT0gb3RoZXIuZ2V0Qml0KGkpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKiogQ2xvbmVzIGEgYml0c2V0LiAqL1xuICBjbG9uZSgpOiBCaXRBcnJheSB7XG4gICAgY29uc3QgYml0QXJyYXkgPSBuZXcgQml0QXJyYXkoMCwgZmFsc2UpO1xuICAgIGJpdEFycmF5Ll9kYXRhID0gVWludDMyQXJyYXkuZnJvbSh0aGlzLl9kYXRhKTsgLy8gZWZmZWN0aXZlIGxlbmd0aDogKGxlbmd0aEluSW50cylcbiAgICBiaXRBcnJheS5fbGVuZ3RoID0gdGhpcy5fbGVuZ3RoO1xuICAgIGJpdEFycmF5Ll92ZXJzaW9uID0gdGhpcy5fdmVyc2lvbjtcbiAgICByZXR1cm4gYml0QXJyYXk7XG4gIH1cblxuICAvKiogSW5pdGlhbGl6ZXMgYSBiaXRzZXQuICovXG4gIGluaXQoZmxhZzogRnVuY3Rpb24sIG5vdGlmeTogYm9vbGVhbik6IEJpdEFycmF5IHtcbiAgICB0aGlzLnNldEFsbChmYWxzZSwgZmFsc2UpO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGZsYWcoaSkpIHtcbiAgICAgICAgdGhpcy5fZGF0YVtNYXRoLmZsb29yKGkgLyAweDIwKV0gfD0gMSA8PCAoKGkgJSAweDIwKSAmIDB4MWYpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuaW5jcmVtZW50VmVyc2lvbihub3RpZnkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8vIEludmVydHMgYSBiaXRzZXQuXG4gIGludmVydChub3RpZnkgPSB0cnVlKTogdm9pZCB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9kYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLl9kYXRhW2ldIF49IC0xO1xuICAgIH1cbiAgICB0aGlzLmluY3JlbWVudFZlcnNpb24obm90aWZ5KTtcbiAgfVxuXG4gIC8vLyBTZXRzIGFsbCBiaXRzIHRvIFt2YWx1ZV0sIG9wdGlvbmFsbHkgc3VwcHJlc3Npbmcgbm90aWZpY2F0aW9ucy5cbiAgc2V0QWxsKHZhbHVlOiBib29sZWFuLCBub3RpZnkgPSBmYWxzZSk6IHZvaWQge1xuICAgIGNvbnN0IGZsYWdzID0gdmFsdWUgPyAtMSA6IDA7XG4gICAgY29uc3QgbGVuID0gdGhpcy5sZW5ndGhJbkludHM7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICB0aGlzLl9kYXRhW2ldID0gZmxhZ3M7XG4gICAgfSAvL3RvZG86IG9wdGltaXplXG5cbiAgICB0aGlzLmluY3JlbWVudFZlcnNpb24obm90aWZ5KTtcbiAgfVxuXG4gIC8vLyBTZXRzIGJpdHMgYXQgW2luZGV4ZXNdIHBvc2l0aW9uIHRvIFt2YWx1ZV0uXG4gIC8vLyBDbGVhcnMgdGhlIGJpdHNldCBpZiBbY2xlYXJdIGZsYWcgaXMgdHJ1ZS5cbiAgLy8vIENoYW5nZSBub3RpZmljYXRpb24gaXMgcmFpc2VkIHdoZW4gW25vdGlmeV0gaXMgdHJ1ZS5cbiAgc2V0SW5kZXhlcyhpbmRleGVzOiBBcnJheTxudW1iZXI+LCB2YWx1ZT10cnVlLCBjbGVhcj10cnVlLCBub3RpZnk9dHJ1ZSk6IHZvaWQge1xuICAgIGlmIChjbGVhcikge1xuICAgICAgdGhpcy5zZXRBbGwoIXZhbHVlLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBpIG9mIGluZGV4ZXMpIHtcbiAgICAgIHRoaXMuc2V0RmFzdChpLCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgdGhpcy5pbmNyZW1lbnRWZXJzaW9uKG5vdGlmeSk7XG4gIH1cblxuICBldmVyeUluZGV4KGluZGV4ZXM6IEFycmF5PG51bWJlcj4sIHZhbHVlPXRydWUpOiBib29sZWFuIHtcbiAgICBmb3IgKGNvbnN0IGluZGV4IG9mIGluZGV4ZXMpIHtcbiAgICAgIGlmICh0aGlzLmdldEJpdChpbmRleCkgIT0gdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGFueUluZGV4KGluZGV4ZXM6IEFycmF5PG51bWJlcj4sIHZhbHVlPXRydWUpOiBib29sZWFuIHtcbiAgICBmb3IgKGNvbnN0IGluZGV4IG9mIGluZGV4ZXMpIHtcbiAgICAgIGlmICh0aGlzLmdldEJpdChpbmRleCkgPT0gdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHNldFdoZXJlKGNoZWNrOiBGdW5jdGlvbiwgdmFsdWU9dHJ1ZSwgY2xlYXI9dHJ1ZSwgbm90aWZ5PXRydWUsIGFsbG93Q2xlYXI9dHJ1ZSk6IHZvaWQge1xuICAgIGlmIChjbGVhciAmJiBhbGxvd0NsZWFyKSB7XG4gICAgICB0aGlzLnNldEFsbCghdmFsdWUsIGZhbHNlKTtcbiAgICB9XG5cbiAgICBpZiAoYWxsb3dDbGVhcikge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoY2hlY2soaSkpIHtcbiAgICAgICAgICB0aGlzLnNldEZhc3QoaSwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdGhpcy5zZXRGYXN0KGksIGNoZWNrKGkpID8gdmFsdWUgOiAhdmFsdWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuaW5jcmVtZW50VmVyc2lvbihub3RpZnkpO1xuICB9XG5cbiAgc2V0UmFuZ2UoZnJvbTogbnVtYmVyLCB0bzogbnVtYmVyLCB2YWx1ZTogYm9vbGVhbiwgbm90aWZ5PXRydWUpOiBCaXRBcnJheSB7XG4gICAgdGhpcy5hc3N1cmVJblJhbmdlKGZyb20sIDAsIHRoaXMuX2xlbmd0aCAtIDEsICdmcm9tJyk7XG4gICAgdGhpcy5hc3N1cmVJblJhbmdlKHRvLCAwLCB0aGlzLl9sZW5ndGggLSAxLCAndG8nKTtcblxuICAgIGNvbnN0IHN0YXJ0ID0gTWF0aC5taW4oZnJvbSwgdG8pO1xuICAgIGNvbnN0IGVuZCA9IE1hdGgubWF4KGZyb20sIHRvKTtcblxuICAgIC8vdG9kbzogb3B0aW1pemVcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIGZvciAobGV0IGkgPSBzdGFydDsgaSA8PSBlbmQ7IGkrKykge1xuICAgICAgICB0aGlzLnNldFRydWUoaSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAobGV0IGkgPSBzdGFydDsgaSA8PSBlbmQ7IGkrKykge1xuICAgICAgICB0aGlzLnNldEZhbHNlKGkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuaW5jcmVtZW50VmVyc2lvbihub3RpZnkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8vIFNldHMgbiByYW5kb21seSBjaG9zZW4gYml0cyB0byB2YWx1ZSwgcmVtYWluaW5nIGJpdHMgdG8gIXZhbHVlLlxuICBzZXRSYW5kb20objogbnVtYmVyLCB2YWx1ZTogYm9vbGVhbiwgbm90aWZ5PXRydWUpOiB2b2lkIHtcbiAgICBpZiAobiA8IDAgfHwgbiA+IHRoaXMuX2xlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCduIG11c3QgYmUgPj0gMCAmJiA8PSBDb3VudCcpO1xuICAgIH1cblxuICAgIGlmIChuID4gdGhpcy5fbGVuZ3RoIC8gMikge1xuICAgICAgdGhpcy5zZXRSYW5kb20odGhpcy5fbGVuZ3RoIC0gbiwgIXZhbHVlKTtcbiAgICB9XG5cbiAgICB0aGlzLnNldEFsbCghdmFsdWUpO1xuXG4gICAgZm9yIChsZXQgayA9IDA7IGsgPCBuOyApIHtcbiAgICAgIGNvbnN0IGkgPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiB0aGlzLl9sZW5ndGgpO1xuICAgICAgaWYgKHRoaXMuZ2V0Qml0KGkpID09IHZhbHVlKSBjb250aW51ZTtcbiAgICAgIHRoaXMuc2V0RmFzdChpLCB2YWx1ZSk7XG4gICAgICBrKys7XG4gICAgfVxuXG4gICAgdGhpcy5pbmNyZW1lbnRWZXJzaW9uKG5vdGlmeSk7XG4gIH1cblxuICAvLy8gTW9kaWZpZXMgY3VycmVudCBiaXRzZXQgYnkgcGVyZm9ybWluZyB0aGUgYml0d2lzZSBBTkQgb3BlcmF0aW9uIGFnYWluc3QgdGhlXG4gIC8vLyBjb3JyZXNwb25kaW5nIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQgYml0c2V0LlxuICBhbmQodmFsdWU6IEJpdEFycmF5LCBub3RpZnk9dHJ1ZSk6IEJpdEFycmF5IHtcbiAgICBpZiAodGhpcy5fbGVuZ3RoICE9IHZhbHVlLl9sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQXJyYXkgbGVuZ3RocyBkaWZmZXIuJyk7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHRoaXMubGVuZ3RoSW5JbnRzOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIHRoaXMuX2RhdGFbaV0gJj0gdmFsdWUuX2RhdGFbaV07XG4gICAgfVxuXG4gICAgdGhpcy5pbmNyZW1lbnRWZXJzaW9uKG5vdGlmeSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLy8gUGVyZm9ybXMgdGhlIGJpdHdpc2UgQU5EIE5PVCBvcGVyYXRpb24gb24gdGhlIGVsZW1lbnRzIGluIHRoZSBjdXJyZW50IGJpdHNldFxuICAvLy8gYWdhaW5zdCB0aGUgY29ycmVzcG9uZGluZyBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGJpdHNldC5cbiAgYW5kTm90KHZhbHVlOiBCaXRBcnJheSwgbm90aWZ5PXRydWUpOiBCaXRBcnJheSB7XG4gICAgaWYgKHRoaXMuX2xlbmd0aCAhPSB2YWx1ZS5fbGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FycmF5IGxlbmd0aHMgZGlmZmVyLicpO1xuICAgIH1cblxuICAgIGNvbnN0IGxlbiA9IHRoaXMubGVuZ3RoSW5JbnRzO1xuICAgIGZvciAobGV0IG51bTIgPSAwOyBudW0yIDwgbGVuOyBudW0yKyspIHtcbiAgICAgIHRoaXMuX2RhdGFbbnVtMl0gJj0gfnZhbHVlLl9kYXRhW251bTJdO1xuICAgIH1cblxuICAgIHRoaXMuaW5jcmVtZW50VmVyc2lvbihub3RpZnkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8vIFBlcmZvcm1zIHRoZSBiaXR3aXNlIE5PVCBBTkQgb3BlcmF0aW9uIG9uIHRoZSBlbGVtZW50cyBpbiB0aGUgY3VycmVudCBiaXRzZXRcbiAgLy8vIGFnYWluc3QgdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBiaXRzZXQuXG4gIG5vdEFuZCh2YWx1ZTogQml0QXJyYXksIG5vdGlmeT10cnVlKTogQml0QXJyYXkge1xuICAgIGlmICh0aGlzLl9sZW5ndGggIT0gdmFsdWUuX2xlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBcnJheSBsZW5ndGhzIGRpZmZlci4nKTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gdGhpcy5sZW5ndGhJbkludHM7IGkgPCBsZW47IGkrKykge1xuICAgICAgdGhpcy5fZGF0YVtpXSA9ICh+dGhpcy5fZGF0YVtpXSkgJiB2YWx1ZS5fZGF0YVtpXTtcbiAgICB9XG5cbiAgICB0aGlzLmluY3JlbWVudFZlcnNpb24obm90aWZ5KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vLyBJbnZlcnRzIGFsbCBiaXQgdmFsdWVzIGluIHRoZSBjdXJyZW50IGJpdHNldFxuICBub3Qobm90aWZ5ID0gdHJ1ZSk6IEJpdEFycmF5IHtcbiAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gdGhpcy5sZW5ndGhJbkludHM7IGkgPCBsZW47IGkrKykge1xuICAgICAgdGhpcy5fZGF0YVtpXSA9IH50aGlzLl9kYXRhW2ldO1xuICAgIH1cblxuICAgIHRoaXMuaW5jcmVtZW50VmVyc2lvbihub3RpZnkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8vIFBlcmZvcm1zIHRoZSBiaXR3aXNlIE9SIG9wZXJhdGlvbiBvbiB0aGUgZWxlbWVudHMgaW4gdGhlIGN1cnJlbnQgYml0c2V0XG4gIC8vLyBhZ2FpbnN0IHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQgYml0c2V0LlxuICBvcih2YWx1ZTogQml0QXJyYXksIG5vdGlmeSA9IHRydWUpIHtcbiAgICBpZiAodGhpcy5fbGVuZ3RoICE9IHZhbHVlLl9sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQXJyYXkgbGVuZ3RocyBkaWZmZXIuJyk7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHRoaXMubGVuZ3RoSW5JbnRzOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIHRoaXMuX2RhdGFbaV0gfD0gdmFsdWUuX2RhdGFbaV07XG4gICAgfVxuXG4gICAgdGhpcy5pbmNyZW1lbnRWZXJzaW9uKG5vdGlmeSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLy8gUGVyZm9ybXMgdGhlIGJpdHdpc2UgZXhjbHVzaXZlIE9SIG9wZXJhdGlvbiBvbiB0aGUgZWxlbWVudHMgaW4gdGhlIGN1cnJlbnQgYml0c2V0XG4gIC8vLyBhZ2FpbnN0IHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQgYml0c2V0LlxuICB4b3IodmFsdWU6IEJpdEFycmF5LCBub3RpZnkgPSB0cnVlKSB7XG4gICAgaWYgKHRoaXMuX2xlbmd0aCAhPSB2YWx1ZS5fbGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FycmF5IGxlbmd0aHMgZGlmZmVyLicpO1xuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSB0aGlzLmxlbmd0aEluSW50czsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICB0aGlzLl9kYXRhW2ldIF49IHZhbHVlLl9kYXRhW2ldO1xuICAgIH1cblxuICAgIHRoaXMuaW5jcmVtZW50VmVyc2lvbihub3RpZnkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8vIEluc2VydHMgbiAwLWJpdHMgYXQgcG9zaXRpb24gcG9zLCByZXNpemluZyBzZWxmIGFuZCBzaGlmdGluZyBiaXRzIGFwcHJvcHJpYXRlbHkuXG4gIGluc2VydEF0KHBvczogbnVtYmVyLCBuOiBudW1iZXIsIGZsYWcgPSBmYWxzZSk6IHZvaWQge1xuICAgIHRoaXMuYXNzdXJlSW5SYW5nZShwb3MsIDAsIHRoaXMuX2xlbmd0aCwgJ3BvcycpO1xuXG4gICAgaWYgKG4gPT0gMCkgcmV0dXJuO1xuXG4gICAgLy9UT0RPOiBvcHRpbWl6ZVxuICAgIC8vdGhlIG1vc3QgcHJpbWl0aXZlIGltcGxlbWVudGF0aW9uLCBvcHRpbWl6ZSBpdCBsYXRlciFcblxuICAgIC8vIGJlZ2luVXBkYXRlKCk7XG4gICAgY29uc3Qgb2xkbGVuZ3RoID0gdGhpcy5fbGVuZ3RoO1xuICAgIHRoaXMuc2V0TGVuZ3RoKHRoaXMuX2xlbmd0aCArIG4pO1xuXG4gICAgLy9pZiAoIWNvbnRhaW5zKCFmbGFnKSkgcmV0dXJuOyAvLyBub3RoaW5nIHRvIGRvXG5cbiAgICBmb3IgKGxldCBpID0gb2xkbGVuZ3RoIC0gMTsgaSA+PSBwb3M7IGktLSkge1xuICAgICAgdGhpcy5zZXRCaXQoaSArIG4sIHRoaXMuZ2V0Qml0KGkpKTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gcG9zOyBpIDwgcG9zICsgbjsgaSsrKSB7XG4gICAgICB0aGlzLnNldEJpdChpLCBmbGFnKTtcbiAgICB9XG5cbiAgICAvLyBlbmRVcGRhdGUoKTtcbiAgfVxuXG4gIC8vLyBEZWxldGVzIG4gYml0cyBiZWdpbm5pbmcgYXQgcG9zaXRpb24gcG9zLCByZXNpemluZyBzZWxmIGFuZCBzaGlmdGluZyByZW1haW5pbmdcbiAgLy8vIGJpdHMgYXBwcm9wcmlhdGVseS5cbiAgcmVtb3ZlQXQocG9zOiBudW1iZXIsIG4gPSAxKTogdm9pZCB7XG4gICAgLy8gdGhlIG1vc3QgcHJpbWl0aXZlIGltcGxlbWVudGF0aW9uLCBvcHRpbWl6ZSBpdCBsYXRlciFcbiAgICBpZiAobiA8IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbiBjYW5ub3QgYmUgbmVnYXRpdmUnKTtcbiAgICB9XG5cbiAgICB0aGlzLmFzc3VyZUluUmFuZ2UocG9zLCAwLCB0aGlzLl9sZW5ndGggLSBuLCAncG9zJyk7XG5cbiAgICBpZiAodGhpcy5jb250YWlucyh0cnVlKSkge1xuICAgICAgZm9yIChsZXQgaSA9IHBvczsgaSA8IHRoaXMuX2xlbmd0aCAtIG47IGkrKykge1xuICAgICAgICB0aGlzLnNldEJpdChpLCB0aGlzLmdldEJpdChpICsgbikpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuc2V0TGVuZ3RoKHRoaXMuX2xlbmd0aCAtIG4pO1xuICB9XG5cbiAgcmVtb3ZlQnlNYXNrKG1hc2s6IEJpdEFycmF5LCBmbGFnID0gdHJ1ZSk6IEJpdEFycmF5IHtcbiAgICBpZiAodGhpcy5fbGVuZ3RoICE9IG1hc2subGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2xlbmd0aCAhPSBtYXNrLmxlbmd0aCcpO1xuICAgIH1cblxuICAgIGlmIChtYXNrID09IHRoaXMpIHsgLy8gbm8gbmVlZCB0byBpdGVyYXRlXG4gICAgICB0aGlzLnNldExlbmd0aChtYXNrLmNvdW50Qml0cyghZmxhZykpO1xuICAgICAgdGhpcy5zZXRBbGwoIWZsYWcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgZHN0SWR4ID0gMDtcblxuICAgICAgZm9yIChsZXQgc3JjSWR4ID0gLTE7IChzcmNJZHggPSBtYXNrLmZpbmROZXh0KHNyY0lkeCwgIWZsYWcpKSAhPSAtMTspIHtcbiAgICAgICAgdGhpcy5zZXRGYXN0KGRzdElkeCsrLCB0aGlzLmdldEJpdChzcmNJZHgpKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fbGVuZ3RoID0gZHN0SWR4O1xuICAgICAgdGhpcy5fdmVyc2lvbisrO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8vIFNpbWlsYXIgdG8gdGhlIFtdIG9wZXJhdG9yLlxuICBnZXRCaXQocG9zOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKHRoaXMuX2RhdGFbTWF0aC5mbG9vcihwb3MgLyAweDIwKV0gJiAoMSA8PCAocG9zICYgMHgxZikpKSAhPSAwO1xuICB9XG5cbiAgLy8vIFNpbWlsYXIgdG8gdGhlIFtdIG9wZXJhdG9yLlxuICBzZXRCaXQocG9zOiBudW1iZXIsIGJpdDogYm9vbGVhbiwgbm90aWZ5ID0gdHJ1ZSkge1xuICAgIHRoaXMuc2V0RmFzdChwb3MsIGJpdCk7XG4gICAgaWYgKG5vdGlmeSkge1xuICAgICAgdGhpcy5fdmVyc2lvbisrO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl92ZXJzaW9uKys7XG4gICAgfVxuICB9XG5cbiAgLy8vIFNldHMgW2ldLXRoIGJpdCB0byBbdmFsdWVdLCBkb2VzIG5vdCBjaGVjayBib3VuZHMsIGRvZXMgbm90IGluY3JlbWVudCB2ZXJzaW9uXG4gIHNldEZhc3QoaTogbnVtYmVyLCB2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmICh2YWx1ZSkge1xuICAgICAgdGhpcy5fZGF0YVtNYXRoLmZsb29yKGkgLyAweDIwKV0gfD0gMSA8PCAoaSAmIDB4MWYpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9kYXRhW01hdGguZmxvb3IoaSAvIDB4MjApXSAmPSB+KDEgPDwgKGkgJiAweDFmKSk7XG4gICAgfVxuICB9XG5cbiAgc2V0VHJ1ZShwb3M6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuX2RhdGFbTWF0aC5mbG9vcihwb3MgLyAweDIwKV0gfD0gMSA8PCAocG9zICYgMHgxZik7XG4gIH1cbiAgc2V0RmFsc2UocG9zOiBudW1iZXIpIHtcbiAgICB0aGlzLl9kYXRhW01hdGguZmxvb3IocG9zIC8gMHgyMCldICY9IH4oMSA8PCAocG9zICYgMHgxZikpO1xuICB9XG5cbiAgdHJ1ZUNvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuY291bnRCaXRzKHRydWUpO1xuICB9XG4gIGZhbHNlQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5jb3VudEJpdHMoZmFsc2UpO1xuICB9XG5cbiAgLy8vIENvdW50cyBiaXRzIG9mIHRoZSBzcGVjaWZpZWQgdmFsdWUuXG4gIGNvdW50Qml0cyh2YWx1ZTogYm9vbGVhbik6IG51bWJlciB7XG4gICAgaWYgKHRoaXMuX2xlbmd0aCA9PSAwKSByZXR1cm4gMDtcblxuICAgIGlmICh0aGlzLl9zZWxlY3RlZENvdW50VmVyc2lvbiAhPSB0aGlzLl92ZXJzaW9uKSB7XG4gICAgICB0aGlzLl9zZWxlY3RlZENvdW50ID0gMDtcbiAgICAgIGNvbnN0IGxlbiA9IHRoaXMubGVuZ3RoSW5JbnRzO1xuICAgICAgbGV0IGkgPSAwO1xuICAgICAgZm9yICg7IGkgPCBsZW4gLSAxOyBpKyspIHtcbiAgICAgICAgZm9yIChsZXQgayA9IHRoaXMuX2RhdGFbaV07IGsgIT0gMDsgayA+Pj49IDgpIHsgLy90b2RvOiBjYXN0IGRhdGFbaV0gdG8gdWludFxuICAgICAgICAgIHRoaXMuX3NlbGVjdGVkQ291bnQgKz0gQml0QXJyYXkuX29uQml0Q291bnRbayAmIDB4ZmZdO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZSBsYXN0IGludC5cbiAgICAgIGxldCBrID0gdGhpcy5fZGF0YVtpXTtcbiAgICAgIGNvbnN0IHJlbWFpbmluZ0JpdHMgPSB0aGlzLl9sZW5ndGggJiAweDFmO1xuICAgICAgaWYgKHJlbWFpbmluZ0JpdHMgIT0gMCkgey8vIGlmIHJlbWFpbmluZ0JpdHMgPT0gMCwgdGhlIGxhc3QgaW50IGlzIGZ1bGx5IHVzZWQgYW5kIEFMTCBiaXRzIHNob3VsZCBiZSBsZWZ0IGFzIGlzLlxuICAgICAgICBrICY9IH4oKDQyOTQ5NjcyOTUpIDw8IHJlbWFpbmluZ0JpdHMpO1xuICAgICAgfVxuXG4gICAgICBmb3IgKDsgayAhPSAwOyBrID4+Pj0gOCkge1xuICAgICAgICB0aGlzLl9zZWxlY3RlZENvdW50ICs9IEJpdEFycmF5Ll9vbkJpdENvdW50W2sgJiAweGZmXTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fc2VsZWN0ZWRDb3VudFZlcnNpb24gPSB0aGlzLl92ZXJzaW9uO1xuICAgIH1cblxuICAgIHJldHVybiAodmFsdWUgPyB0aGlzLl9zZWxlY3RlZENvdW50IDogdGhpcy5fbGVuZ3RoIC0gdGhpcy5fc2VsZWN0ZWRDb3VudCk7XG4gIH1cblxuICAvLy8gUmV0dXJucyBhIG51bWJlciBvZiBzZXQgYml0cyB3aGVyZSBhbHNvIFtjaGVja10gaXMgdHJ1ZVxuICBjb3VudFdoZXJlKGNoZWNrOiBGdW5jdGlvbik6IG51bWJlciB7XG4gICAgbGV0IHJlc3VsdCA9IDA7XG4gICAgaWYgKHRoaXMudHJ1ZUNvdW50KCkgPT0gdGhpcy5fbGVuZ3RoKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2xlbmd0aDsgaSsrKSB7XG4gICAgICAgIHJlc3VsdCArPSBjaGVjayhpKSA/IDEgOiAwO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGxldCBpID0gLTE7IChpID0gdGhpcy5maW5kTmV4dChpLCB0cnVlKSkgIT0gLTE7KSB7XG4gICAgICAgIHJlc3VsdCArPSBjaGVjayhpKSA/IDEgOiAwO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLy8vIFBlcmZvcm1zIGJpdCBcImFuZFwiIGFuZCBjb3VudHMgYml0cyBvZiB0aGUgc3BlY2lmaWVkIHZhbHVlLCB3aXRob3V0IGJpdHNldCBtb2RpZmljYXRpb24uXG4gIGFuZFdpdGhDb3VudEJpdHMoc2Vjb25kOiBCaXRBcnJheSwgdmFsdWU6IGJvb2xlYW4pOiBudW1iZXIge1xuICAgIGlmICh0aGlzLl9sZW5ndGggPT0gMCkgcmV0dXJuIDA7XG5cbiAgICBsZXQgY291bnQgPSAwOyBjb25zdCBsZW4gPSB0aGlzLmxlbmd0aEluSW50czsgbGV0IGkgPSAwO1xuICAgIGZvciAoOyBpIDwgbGVuIC0gMTsgaSsrKSB7XG4gICAgICBmb3IgKHZhciBrID0gdGhpcy5fZGF0YVtpXSAmIHNlY29uZC5fZGF0YVtpXTsgayAhPSAwOyBrID4+Pj0gOCkge1xuICAgICAgICBjb3VudCArPSBCaXRBcnJheS5fb25CaXRDb3VudFtrICYgMHhmZl07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVGhlIGxhc3QgaW50LlxuICAgIHZhciBrID0gdGhpcy5fZGF0YVtpXSAmIHNlY29uZC5fZGF0YVtpXTtcbiAgICBjb25zdCByZW1haW5pbmdCaXRzID0gdGhpcy5fbGVuZ3RoICYgMHgxZjtcbiAgICBpZiAocmVtYWluaW5nQml0cyAhPSAwKSB7XG4gICAgICBrICY9IH4oKDQyOTQ5NjcyOTUpIDw8IHJlbWFpbmluZ0JpdHMpO1xuICAgIH1cbiAgICBmb3IgKDsgayAhPSAwOyBrID4+Pj0gOCkge1xuICAgICAgY291bnQgKz0gQml0QXJyYXkuX29uQml0Q291bnRbayAmIDB4ZmZdO1xuICAgIH1cblxuICAgIHJldHVybiAodmFsdWUgPyBjb3VudCA6IHRoaXMuX2xlbmd0aCAtIGNvdW50KTtcbiAgfVxuXG4gIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMuc2V0TGVuZ3RoKDApO1xuICB9XG4gIGNvbnRhaW5zKHZhbHVlOiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZmluZE5leHQoLTEsIHZhbHVlKSA+PSAwO1xuICB9XG4gIGdldCBhbGxUcnVlKCkge1xuICAgIHJldHVybiB0aGlzLmNvdW50Qml0cyh0cnVlKSA9PSB0aGlzLl9sZW5ndGg7XG4gIH1cbiAgZ2V0IGFsbEZhbHNlKCkge1xuICAgIHJldHVybiB0aGlzLmNvdW50Qml0cyhmYWxzZSkgPT0gdGhpcy5fbGVuZ3RoO1xuICB9XG4gIGdldCBhbnlUcnVlKCkge1xuICAgIHJldHVybiB0aGlzLmNvdW50Qml0cyh0cnVlKSA+IDA7XG4gIH1cbiAgZ2V0IGFueUZhbHNlKCkge1xuICAgIHJldHVybiB0aGlzLmNvdW50Qml0cyhmYWxzZSkgPiAwO1xuICB9XG5cbiAgLy8vIFJldHVybnMgdGhlIHBvc2l0aW9uIG9mIHRoZSBuZXh0IGJpdCBvZiB0aGUgc3BlY2lmaWVkIHZhbHVlLCBzdGFydGluZyBmcm9tIHRoZSBzcGVjaWZpZWQgcG9zaXRpb24uXG4gIC8vLyBSZXR1cm5zIC0xLCBpZiB0aGVyZSBhcmUgbm8gc3VjaCBiaXRzLlxuICBmaW5kTmV4dChpbmRleDogbnVtYmVyLCB2YWx1ZSA9IHRydWUpOiBudW1iZXIge1xuICAgIHRoaXMuYXNzdXJlSW5SYW5nZShpbmRleCwgLTEsIHRoaXMuX2xlbmd0aCwgJ2luZGV4Jyk7XG5cbiAgICBpZiAoaW5kZXggPj0gdGhpcy5fbGVuZ3RoIC0gMSkgcmV0dXJuIC0xO1xuICAgIGluZGV4ID0gaW5kZXggPCAwID8gMCA6IGluZGV4ICsgMTsgLy8gc2tpcCBzdGFydFxuICAgIGxldCB1bnVzZWRCaXRzID0gaW5kZXggJiAweDFmO1xuICAgIGNvbnN0IG51bUludHMgPSB0aGlzLmxlbmd0aEluSW50cztcblxuICAgIGZvciAobGV0IGkgPSBNYXRoLmZsb29yKGluZGV4IC8gMzIpOyBpIDwgbnVtSW50czsgaSsrKSB7XG4gICAgICBsZXQgayA9ICh2YWx1ZSA/IHRoaXMuX2RhdGFbaV0gOiB+dGhpcy5fZGF0YVtpXSk7IC8vIHVpbnQgY2FzdFxuICAgICAgaWYgKHVudXNlZEJpdHMgIT0gMCkge1xuICAgICAgICBrICY9ICgoMHhmZmZmZmZmZiA8PCB1bnVzZWRCaXRzKSAmIDB4ZmZmZmZmZmYpO1xuICAgICAgICB1bnVzZWRCaXRzID0gMDtcbiAgICAgIH0gZWxzZSBpZiAoIXZhbHVlICYmIGsgPT0gLTQyOTQ5NjcyOTYpIC8vIGxvb2tpbmcgZm9yIGZhbHNlLCBhbGwgYml0cyBhcmUgc2V0XG4gICAgICB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGxldCBqID0gMDsgayAhPSAwOyBqICs9IDgsIGsgPj4+PSA4KSB7XG4gICAgICAgIGNvbnN0IHAgPSBCaXRBcnJheS5fZmlyc3RPbkJpdFtrICYgMHhmZl07XG4gICAgICAgIGlmIChwID49IDApIHtcbiAgICAgICAgICBpbmRleCA9IHAgKyAoaSAqIDMyKSArIGo7XG4gICAgICAgICAgaWYgKGluZGV4ID49IHRoaXMuX2xlbmd0aCkgcmV0dXJuIC0xO1xuICAgICAgICAgIHJldHVybiBpbmRleDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gLTE7XG4gIH1cblxuICAvLy8gRmluZHMgcHJldmlvdXMgYml0IG9mIHRoZSBzcGVjaWZpZWQgdmFsdWUgaW4gdGhlIGJpdHNldC5cbiAgZmluZFByZXYoaW5kZXg6IG51bWJlciwgdmFsdWUgPSB0cnVlKTogbnVtYmVyIHtcbiAgICBpZiAoaW5kZXggPT0gMCkgcmV0dXJuIC0xO1xuICAgIHRoaXMuYXNzdXJlSW5SYW5nZShpbmRleCwgLTEsIHRoaXMuX2xlbmd0aCwgJ2luZGV4Jyk7XG5cbiAgICBpbmRleCA9IGluZGV4IDwgMCA/IHRoaXMuX2xlbmd0aCAtIDEgOiBpbmRleCAtIDE7IC8vIHNraXAgc3RhcnRcblxuICAgIGNvbnN0IGxhc3RJbnRJZHggPSBNYXRoLmZsb29yKGluZGV4IC8gMHgyMCk7XG4gICAgbGV0IHJlbWFpbmluZ0JpdHMgPSAoaW5kZXggKyAxKSAmIDB4MWY7XG5cbiAgICBmb3IgKGxldCBpID0gbGFzdEludElkeDsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGxldCBrID0gKHZhbHVlID8gdGhpcy5fZGF0YVtpXSA6IH50aGlzLl9kYXRhW2ldKTsgLy8gY2FzdFxuICAgICAgaWYgKHJlbWFpbmluZ0JpdHMgIT0gMCkge1xuICAgICAgICBrICY9IH4oKDQyOTQ5NjcyOTUpIDw8IHJlbWFpbmluZ0JpdHMpO1xuICAgICAgICByZW1haW5pbmdCaXRzID0gMDtcbiAgICAgIH1cbiAgICAgIGZvciAobGV0IGogPSAyNDsgayAhPSAwOyBqIC09IDgsIGsgPDw9IDgpIHtcbiAgICAgICAgY29uc3QgcCA9IEJpdEFycmF5Ll9sYXN0T25CaXRbayA+Pj4gMHgxOF07XG4gICAgICAgIGlmIChwID49IDApIHtcbiAgICAgICAgICByZXR1cm4gcCArIChpICogMzIpICsgajtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gLTE7XG4gIH1cbn1cbiJdfQ==
|