ag-psd 14.3.10 → 14.3.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +15 -0
- package/README.md +12 -2
- package/README_PSD.md +729 -0
- package/TODO +4 -0
- package/dist/additionalInfo.js +1 -3
- package/dist/bundle.js +26 -12
- package/dist/imageResources.js +12 -7
- package/dist/initializeCanvas.js +13 -5
- package/dist/jpeg.d.ts +1 -0
- package/dist/jpeg.js +1023 -0
- package/dist/psd.js +1 -1
- package/dist/psdReader.js +6 -1
- package/dist/psdWriter.js +11 -5
- package/dist-es/additionalInfo.js +1 -3
- package/dist-es/imageResources.js +12 -7
- package/dist-es/initializeCanvas.js +14 -6
- package/dist-es/jpeg.d.ts +1 -0
- package/dist-es/jpeg.js +1019 -0
- package/dist-es/psd.js +1 -1
- package/dist-es/psdReader.js +6 -1
- package/dist-es/psdWriter.js +11 -5
- package/package.json +1 -1
package/dist/jpeg.js
ADDED
|
@@ -0,0 +1,1023 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// based on https://github.com/jpeg-js/jpeg-js
|
|
3
|
+
/*
|
|
4
|
+
Copyright 2011 notmasteryet
|
|
5
|
+
|
|
6
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
|
7
|
+
you may not use this file except in compliance with the License.
|
|
8
|
+
You may obtain a copy of the License at
|
|
9
|
+
|
|
10
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
|
11
|
+
|
|
12
|
+
Unless required by applicable law or agreed to in writing, software
|
|
13
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
|
14
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
15
|
+
See the License for the specific language governing permissions and
|
|
16
|
+
limitations under the License.
|
|
17
|
+
*/
|
|
18
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
|
+
exports.decodeJpeg = void 0;
|
|
20
|
+
var dctZigZag = new Int32Array([
|
|
21
|
+
0,
|
|
22
|
+
1, 8,
|
|
23
|
+
16, 9, 2,
|
|
24
|
+
3, 10, 17, 24,
|
|
25
|
+
32, 25, 18, 11, 4,
|
|
26
|
+
5, 12, 19, 26, 33, 40,
|
|
27
|
+
48, 41, 34, 27, 20, 13, 6,
|
|
28
|
+
7, 14, 21, 28, 35, 42, 49, 56,
|
|
29
|
+
57, 50, 43, 36, 29, 22, 15,
|
|
30
|
+
23, 30, 37, 44, 51, 58,
|
|
31
|
+
59, 52, 45, 38, 31,
|
|
32
|
+
39, 46, 53, 60,
|
|
33
|
+
61, 54, 47,
|
|
34
|
+
55, 62,
|
|
35
|
+
63
|
|
36
|
+
]);
|
|
37
|
+
var dctCos1 = 4017; // cos(pi/16)
|
|
38
|
+
var dctSin1 = 799; // sin(pi/16)
|
|
39
|
+
var dctCos3 = 3406; // cos(3*pi/16)
|
|
40
|
+
var dctSin3 = 2276; // sin(3*pi/16)
|
|
41
|
+
var dctCos6 = 1567; // cos(6*pi/16)
|
|
42
|
+
var dctSin6 = 3784; // sin(6*pi/16)
|
|
43
|
+
var dctSqrt2 = 5793; // sqrt(2)
|
|
44
|
+
var dctSqrt1d2 = 2896; // sqrt(2) / 2
|
|
45
|
+
var maxResolutionInMP = 100; // Don't decode more than 100 megapixels
|
|
46
|
+
var maxMemoryUsageBytes = 64 * 1024 * 1024; // Don't decode if memory footprint is more than 64MB
|
|
47
|
+
var totalBytesAllocated = 0; // avoid unexpected OOMs from untrusted content.
|
|
48
|
+
function requestMemoryAllocation(increaseAmount) {
|
|
49
|
+
var totalMemoryImpactBytes = totalBytesAllocated + increaseAmount;
|
|
50
|
+
if (totalMemoryImpactBytes > maxMemoryUsageBytes) {
|
|
51
|
+
var exceededAmount = Math.ceil((totalMemoryImpactBytes - maxMemoryUsageBytes) / 1024 / 1024);
|
|
52
|
+
throw new Error("Max memory limit exceeded by at least " + exceededAmount + "MB");
|
|
53
|
+
}
|
|
54
|
+
totalBytesAllocated = totalMemoryImpactBytes;
|
|
55
|
+
}
|
|
56
|
+
function buildHuffmanTable(codeLengths, values) {
|
|
57
|
+
var length = 16;
|
|
58
|
+
while (length > 0 && !codeLengths[length - 1])
|
|
59
|
+
length--;
|
|
60
|
+
var code = [{ children: [], index: 0 }];
|
|
61
|
+
var k = 0;
|
|
62
|
+
var p = code[0];
|
|
63
|
+
for (var i = 0; i < length; i++) {
|
|
64
|
+
for (var j = 0; j < codeLengths[i]; j++) {
|
|
65
|
+
p = code.pop();
|
|
66
|
+
p.children[p.index] = values[k];
|
|
67
|
+
while (p.index > 0) {
|
|
68
|
+
if (code.length === 0)
|
|
69
|
+
throw new Error('Could not recreate Huffman Table');
|
|
70
|
+
p = code.pop();
|
|
71
|
+
}
|
|
72
|
+
p.index++;
|
|
73
|
+
code.push(p);
|
|
74
|
+
while (code.length <= i) {
|
|
75
|
+
var q = { children: [], index: 0 };
|
|
76
|
+
code.push(q);
|
|
77
|
+
p.children[p.index] = q.children;
|
|
78
|
+
p = q;
|
|
79
|
+
}
|
|
80
|
+
k++;
|
|
81
|
+
}
|
|
82
|
+
if (i + 1 < length) {
|
|
83
|
+
// p here points to last code
|
|
84
|
+
var q = { children: [], index: 0 };
|
|
85
|
+
code.push(q);
|
|
86
|
+
p.children[p.index] = q.children;
|
|
87
|
+
p = q;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return code[0].children;
|
|
91
|
+
}
|
|
92
|
+
function decodeScan(data, offset, frame, components, resetInterval, spectralStart, spectralEnd, successivePrev, successive) {
|
|
93
|
+
var mcusPerLine = frame.mcusPerLine;
|
|
94
|
+
var progressive = frame.progressive;
|
|
95
|
+
var startOffset = offset;
|
|
96
|
+
var bitsData = 0;
|
|
97
|
+
var bitsCount = 0;
|
|
98
|
+
function readBit() {
|
|
99
|
+
if (bitsCount > 0) {
|
|
100
|
+
bitsCount--;
|
|
101
|
+
return (bitsData >> bitsCount) & 1;
|
|
102
|
+
}
|
|
103
|
+
bitsData = data[offset++];
|
|
104
|
+
if (bitsData == 0xFF) {
|
|
105
|
+
var nextByte = data[offset++];
|
|
106
|
+
if (nextByte)
|
|
107
|
+
throw new Error("unexpected marker: " + ((bitsData << 8) | nextByte).toString(16));
|
|
108
|
+
// unstuff 0
|
|
109
|
+
}
|
|
110
|
+
bitsCount = 7;
|
|
111
|
+
return bitsData >>> 7;
|
|
112
|
+
}
|
|
113
|
+
function decodeHuffman(tree) {
|
|
114
|
+
var node = tree;
|
|
115
|
+
while (true) {
|
|
116
|
+
node = node[readBit()];
|
|
117
|
+
if (typeof node === 'number')
|
|
118
|
+
return node;
|
|
119
|
+
if (node === undefined)
|
|
120
|
+
throw new Error('invalid huffman sequence');
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
function receive(length) {
|
|
124
|
+
var n = 0;
|
|
125
|
+
while (length > 0) {
|
|
126
|
+
n = (n << 1) | readBit();
|
|
127
|
+
length--;
|
|
128
|
+
}
|
|
129
|
+
return n;
|
|
130
|
+
}
|
|
131
|
+
function receiveAndExtend(length) {
|
|
132
|
+
var n = receive(length);
|
|
133
|
+
if (n >= 1 << (length - 1))
|
|
134
|
+
return n;
|
|
135
|
+
return n + (-1 << length) + 1;
|
|
136
|
+
}
|
|
137
|
+
function decodeBaseline(component, zz) {
|
|
138
|
+
var t = decodeHuffman(component.huffmanTableDC);
|
|
139
|
+
var diff = t === 0 ? 0 : receiveAndExtend(t);
|
|
140
|
+
zz[0] = (component.pred += diff);
|
|
141
|
+
var k = 1;
|
|
142
|
+
while (k < 64) {
|
|
143
|
+
var rs = decodeHuffman(component.huffmanTableAC);
|
|
144
|
+
var s = rs & 15;
|
|
145
|
+
var r = rs >> 4;
|
|
146
|
+
if (s === 0) {
|
|
147
|
+
if (r < 15)
|
|
148
|
+
break;
|
|
149
|
+
k += 16;
|
|
150
|
+
continue;
|
|
151
|
+
}
|
|
152
|
+
k += r;
|
|
153
|
+
var z = dctZigZag[k];
|
|
154
|
+
zz[z] = receiveAndExtend(s);
|
|
155
|
+
k++;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
function decodeDCFirst(component, zz) {
|
|
159
|
+
var t = decodeHuffman(component.huffmanTableDC);
|
|
160
|
+
var diff = t === 0 ? 0 : (receiveAndExtend(t) << successive);
|
|
161
|
+
zz[0] = (component.pred += diff);
|
|
162
|
+
}
|
|
163
|
+
function decodeDCSuccessive(_component, zz) {
|
|
164
|
+
zz[0] |= readBit() << successive;
|
|
165
|
+
}
|
|
166
|
+
var eobrun = 0;
|
|
167
|
+
function decodeACFirst(component, zz) {
|
|
168
|
+
if (eobrun > 0) {
|
|
169
|
+
eobrun--;
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
var k = spectralStart, e = spectralEnd;
|
|
173
|
+
while (k <= e) {
|
|
174
|
+
var rs = decodeHuffman(component.huffmanTableAC);
|
|
175
|
+
var s = rs & 15;
|
|
176
|
+
var r = rs >> 4;
|
|
177
|
+
if (s === 0) {
|
|
178
|
+
if (r < 15) {
|
|
179
|
+
eobrun = receive(r) + (1 << r) - 1;
|
|
180
|
+
break;
|
|
181
|
+
}
|
|
182
|
+
k += 16;
|
|
183
|
+
continue;
|
|
184
|
+
}
|
|
185
|
+
k += r;
|
|
186
|
+
var z = dctZigZag[k];
|
|
187
|
+
zz[z] = receiveAndExtend(s) * (1 << successive);
|
|
188
|
+
k++;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
var successiveACState = 0;
|
|
192
|
+
var successiveACNextValue = 0;
|
|
193
|
+
function decodeACSuccessive(component, zz) {
|
|
194
|
+
var k = spectralStart;
|
|
195
|
+
var e = spectralEnd;
|
|
196
|
+
var r = 0;
|
|
197
|
+
while (k <= e) {
|
|
198
|
+
var z = dctZigZag[k];
|
|
199
|
+
var direction = zz[z] < 0 ? -1 : 1;
|
|
200
|
+
switch (successiveACState) {
|
|
201
|
+
case 0: // initial state
|
|
202
|
+
var rs = decodeHuffman(component.huffmanTableAC);
|
|
203
|
+
var s = rs & 15;
|
|
204
|
+
r = rs >> 4; // this was new variable in old code
|
|
205
|
+
if (s === 0) {
|
|
206
|
+
if (r < 15) {
|
|
207
|
+
eobrun = receive(r) + (1 << r);
|
|
208
|
+
successiveACState = 4;
|
|
209
|
+
}
|
|
210
|
+
else {
|
|
211
|
+
r = 16;
|
|
212
|
+
successiveACState = 1;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
else {
|
|
216
|
+
if (s !== 1)
|
|
217
|
+
throw new Error('invalid ACn encoding');
|
|
218
|
+
successiveACNextValue = receiveAndExtend(s);
|
|
219
|
+
successiveACState = r ? 2 : 3;
|
|
220
|
+
}
|
|
221
|
+
continue;
|
|
222
|
+
case 1: // skipping r zero items
|
|
223
|
+
case 2:
|
|
224
|
+
if (zz[z]) {
|
|
225
|
+
zz[z] += (readBit() << successive) * direction;
|
|
226
|
+
}
|
|
227
|
+
else {
|
|
228
|
+
r--;
|
|
229
|
+
if (r === 0)
|
|
230
|
+
successiveACState = successiveACState == 2 ? 3 : 0;
|
|
231
|
+
}
|
|
232
|
+
break;
|
|
233
|
+
case 3: // set value for a zero item
|
|
234
|
+
if (zz[z]) {
|
|
235
|
+
zz[z] += (readBit() << successive) * direction;
|
|
236
|
+
}
|
|
237
|
+
else {
|
|
238
|
+
zz[z] = successiveACNextValue << successive;
|
|
239
|
+
successiveACState = 0;
|
|
240
|
+
}
|
|
241
|
+
break;
|
|
242
|
+
case 4: // eob
|
|
243
|
+
if (zz[z]) {
|
|
244
|
+
zz[z] += (readBit() << successive) * direction;
|
|
245
|
+
}
|
|
246
|
+
break;
|
|
247
|
+
}
|
|
248
|
+
k++;
|
|
249
|
+
}
|
|
250
|
+
if (successiveACState === 4) {
|
|
251
|
+
eobrun--;
|
|
252
|
+
if (eobrun === 0)
|
|
253
|
+
successiveACState = 0;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
function decodeMcu(component, decode, mcu, row, col) {
|
|
257
|
+
var mcuRow = (mcu / mcusPerLine) | 0;
|
|
258
|
+
var mcuCol = mcu % mcusPerLine;
|
|
259
|
+
var blockRow = mcuRow * component.v + row;
|
|
260
|
+
var blockCol = mcuCol * component.h + col;
|
|
261
|
+
// If the block is missing, just skip it.
|
|
262
|
+
if (component.blocks[blockRow] === undefined)
|
|
263
|
+
return;
|
|
264
|
+
decode(component, component.blocks[blockRow][blockCol]);
|
|
265
|
+
}
|
|
266
|
+
function decodeBlock(component, decode, mcu) {
|
|
267
|
+
var blockRow = (mcu / component.blocksPerLine) | 0;
|
|
268
|
+
var blockCol = mcu % component.blocksPerLine;
|
|
269
|
+
// If the block is missing, just skip it.
|
|
270
|
+
if (component.blocks[blockRow] === undefined)
|
|
271
|
+
return;
|
|
272
|
+
decode(component, component.blocks[blockRow][blockCol]);
|
|
273
|
+
}
|
|
274
|
+
var componentsLength = components.length;
|
|
275
|
+
var component;
|
|
276
|
+
var decodeFn;
|
|
277
|
+
if (progressive) {
|
|
278
|
+
if (spectralStart === 0) {
|
|
279
|
+
decodeFn = successivePrev === 0 ? decodeDCFirst : decodeDCSuccessive;
|
|
280
|
+
}
|
|
281
|
+
else {
|
|
282
|
+
decodeFn = successivePrev === 0 ? decodeACFirst : decodeACSuccessive;
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
else {
|
|
286
|
+
decodeFn = decodeBaseline;
|
|
287
|
+
}
|
|
288
|
+
var mcu = 0;
|
|
289
|
+
var mcuExpected;
|
|
290
|
+
if (componentsLength == 1) {
|
|
291
|
+
mcuExpected = components[0].blocksPerLine * components[0].blocksPerColumn;
|
|
292
|
+
}
|
|
293
|
+
else {
|
|
294
|
+
mcuExpected = mcusPerLine * frame.mcusPerColumn;
|
|
295
|
+
}
|
|
296
|
+
if (!resetInterval)
|
|
297
|
+
resetInterval = mcuExpected;
|
|
298
|
+
var h;
|
|
299
|
+
var v;
|
|
300
|
+
var marker;
|
|
301
|
+
while (mcu < mcuExpected) {
|
|
302
|
+
// reset interval stuff
|
|
303
|
+
for (var i = 0; i < componentsLength; i++)
|
|
304
|
+
components[i].pred = 0;
|
|
305
|
+
eobrun = 0;
|
|
306
|
+
if (componentsLength == 1) {
|
|
307
|
+
component = components[0];
|
|
308
|
+
for (var n = 0; n < resetInterval; n++) {
|
|
309
|
+
decodeBlock(component, decodeFn, mcu);
|
|
310
|
+
mcu++;
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
else {
|
|
314
|
+
for (var n = 0; n < resetInterval; n++) {
|
|
315
|
+
for (var i = 0; i < componentsLength; i++) {
|
|
316
|
+
component = components[i];
|
|
317
|
+
h = component.h;
|
|
318
|
+
v = component.v;
|
|
319
|
+
for (var j = 0; j < v; j++) {
|
|
320
|
+
for (var k = 0; k < h; k++) {
|
|
321
|
+
decodeMcu(component, decodeFn, mcu, j, k);
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
mcu++;
|
|
326
|
+
// If we've reached our expected MCU's, stop decoding
|
|
327
|
+
if (mcu === mcuExpected)
|
|
328
|
+
break;
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
if (mcu === mcuExpected) {
|
|
332
|
+
// Skip trailing bytes at the end of the scan - until we reach the next marker
|
|
333
|
+
do {
|
|
334
|
+
if (data[offset] === 0xFF) {
|
|
335
|
+
if (data[offset + 1] !== 0x00) {
|
|
336
|
+
break;
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
offset += 1;
|
|
340
|
+
} while (offset < data.length - 2);
|
|
341
|
+
}
|
|
342
|
+
// find marker
|
|
343
|
+
bitsCount = 0;
|
|
344
|
+
marker = (data[offset] << 8) | data[offset + 1];
|
|
345
|
+
if (marker < 0xFF00)
|
|
346
|
+
throw new Error('marker was not found');
|
|
347
|
+
if (marker >= 0xFFD0 && marker <= 0xFFD7) { // RSTx
|
|
348
|
+
offset += 2;
|
|
349
|
+
}
|
|
350
|
+
else {
|
|
351
|
+
break;
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
return offset - startOffset;
|
|
355
|
+
}
|
|
356
|
+
function buildComponentData(component) {
|
|
357
|
+
var lines = [];
|
|
358
|
+
var blocksPerLine = component.blocksPerLine;
|
|
359
|
+
var blocksPerColumn = component.blocksPerColumn;
|
|
360
|
+
var samplesPerLine = blocksPerLine << 3;
|
|
361
|
+
// Only 1 used per invocation of this function and garbage collected after invocation, so no need to account for its memory footprint.
|
|
362
|
+
var R = new Int32Array(64);
|
|
363
|
+
var r = new Uint8Array(64);
|
|
364
|
+
// A port of poppler's IDCT method which in turn is taken from:
|
|
365
|
+
// Christoph Loeffler, Adriaan Ligtenberg, George S. Moschytz,
|
|
366
|
+
// "Practical Fast 1-D DCT Algorithms with 11 Multiplications",
|
|
367
|
+
// IEEE Intl. Conf. on Acoustics, Speech & Signal Processing, 1989,
|
|
368
|
+
// 988-991.
|
|
369
|
+
function quantizeAndInverse(zz, dataOut, dataIn) {
|
|
370
|
+
var qt = component.quantizationTable;
|
|
371
|
+
var p = dataIn;
|
|
372
|
+
// dequant
|
|
373
|
+
for (var i = 0; i < 64; i++) {
|
|
374
|
+
p[i] = zz[i] * qt[i];
|
|
375
|
+
}
|
|
376
|
+
// inverse DCT on rows
|
|
377
|
+
for (var i = 0; i < 8; ++i) {
|
|
378
|
+
var row = 8 * i;
|
|
379
|
+
// check for all-zero AC coefficients
|
|
380
|
+
if (p[1 + row] == 0 && p[2 + row] == 0 && p[3 + row] == 0 &&
|
|
381
|
+
p[4 + row] == 0 && p[5 + row] == 0 && p[6 + row] == 0 &&
|
|
382
|
+
p[7 + row] == 0) {
|
|
383
|
+
var t_1 = (dctSqrt2 * p[0 + row] + 512) >> 10;
|
|
384
|
+
p[0 + row] = t_1;
|
|
385
|
+
p[1 + row] = t_1;
|
|
386
|
+
p[2 + row] = t_1;
|
|
387
|
+
p[3 + row] = t_1;
|
|
388
|
+
p[4 + row] = t_1;
|
|
389
|
+
p[5 + row] = t_1;
|
|
390
|
+
p[6 + row] = t_1;
|
|
391
|
+
p[7 + row] = t_1;
|
|
392
|
+
continue;
|
|
393
|
+
}
|
|
394
|
+
// stage 4
|
|
395
|
+
var v0 = (dctSqrt2 * p[0 + row] + 128) >> 8;
|
|
396
|
+
var v1 = (dctSqrt2 * p[4 + row] + 128) >> 8;
|
|
397
|
+
var v2 = p[2 + row];
|
|
398
|
+
var v3 = p[6 + row];
|
|
399
|
+
var v4 = (dctSqrt1d2 * (p[1 + row] - p[7 + row]) + 128) >> 8;
|
|
400
|
+
var v7 = (dctSqrt1d2 * (p[1 + row] + p[7 + row]) + 128) >> 8;
|
|
401
|
+
var v5 = p[3 + row] << 4;
|
|
402
|
+
var v6 = p[5 + row] << 4;
|
|
403
|
+
// stage 3
|
|
404
|
+
var t = (v0 - v1 + 1) >> 1;
|
|
405
|
+
v0 = (v0 + v1 + 1) >> 1;
|
|
406
|
+
v1 = t;
|
|
407
|
+
t = (v2 * dctSin6 + v3 * dctCos6 + 128) >> 8;
|
|
408
|
+
v2 = (v2 * dctCos6 - v3 * dctSin6 + 128) >> 8;
|
|
409
|
+
v3 = t;
|
|
410
|
+
t = (v4 - v6 + 1) >> 1;
|
|
411
|
+
v4 = (v4 + v6 + 1) >> 1;
|
|
412
|
+
v6 = t;
|
|
413
|
+
t = (v7 + v5 + 1) >> 1;
|
|
414
|
+
v5 = (v7 - v5 + 1) >> 1;
|
|
415
|
+
v7 = t;
|
|
416
|
+
// stage 2
|
|
417
|
+
t = (v0 - v3 + 1) >> 1;
|
|
418
|
+
v0 = (v0 + v3 + 1) >> 1;
|
|
419
|
+
v3 = t;
|
|
420
|
+
t = (v1 - v2 + 1) >> 1;
|
|
421
|
+
v1 = (v1 + v2 + 1) >> 1;
|
|
422
|
+
v2 = t;
|
|
423
|
+
t = (v4 * dctSin3 + v7 * dctCos3 + 2048) >> 12;
|
|
424
|
+
v4 = (v4 * dctCos3 - v7 * dctSin3 + 2048) >> 12;
|
|
425
|
+
v7 = t;
|
|
426
|
+
t = (v5 * dctSin1 + v6 * dctCos1 + 2048) >> 12;
|
|
427
|
+
v5 = (v5 * dctCos1 - v6 * dctSin1 + 2048) >> 12;
|
|
428
|
+
v6 = t;
|
|
429
|
+
// stage 1
|
|
430
|
+
p[0 + row] = v0 + v7;
|
|
431
|
+
p[7 + row] = v0 - v7;
|
|
432
|
+
p[1 + row] = v1 + v6;
|
|
433
|
+
p[6 + row] = v1 - v6;
|
|
434
|
+
p[2 + row] = v2 + v5;
|
|
435
|
+
p[5 + row] = v2 - v5;
|
|
436
|
+
p[3 + row] = v3 + v4;
|
|
437
|
+
p[4 + row] = v3 - v4;
|
|
438
|
+
}
|
|
439
|
+
// inverse DCT on columns
|
|
440
|
+
for (var i = 0; i < 8; ++i) {
|
|
441
|
+
var col = i;
|
|
442
|
+
// check for all-zero AC coefficients
|
|
443
|
+
if (p[1 * 8 + col] == 0 && p[2 * 8 + col] == 0 && p[3 * 8 + col] == 0 &&
|
|
444
|
+
p[4 * 8 + col] == 0 && p[5 * 8 + col] == 0 && p[6 * 8 + col] == 0 &&
|
|
445
|
+
p[7 * 8 + col] == 0) {
|
|
446
|
+
var t_2 = (dctSqrt2 * dataIn[i + 0] + 8192) >> 14;
|
|
447
|
+
p[0 * 8 + col] = t_2;
|
|
448
|
+
p[1 * 8 + col] = t_2;
|
|
449
|
+
p[2 * 8 + col] = t_2;
|
|
450
|
+
p[3 * 8 + col] = t_2;
|
|
451
|
+
p[4 * 8 + col] = t_2;
|
|
452
|
+
p[5 * 8 + col] = t_2;
|
|
453
|
+
p[6 * 8 + col] = t_2;
|
|
454
|
+
p[7 * 8 + col] = t_2;
|
|
455
|
+
continue;
|
|
456
|
+
}
|
|
457
|
+
// stage 4
|
|
458
|
+
var v0 = (dctSqrt2 * p[0 * 8 + col] + 2048) >> 12;
|
|
459
|
+
var v1 = (dctSqrt2 * p[4 * 8 + col] + 2048) >> 12;
|
|
460
|
+
var v2 = p[2 * 8 + col];
|
|
461
|
+
var v3 = p[6 * 8 + col];
|
|
462
|
+
var v4 = (dctSqrt1d2 * (p[1 * 8 + col] - p[7 * 8 + col]) + 2048) >> 12;
|
|
463
|
+
var v7 = (dctSqrt1d2 * (p[1 * 8 + col] + p[7 * 8 + col]) + 2048) >> 12;
|
|
464
|
+
var v5 = p[3 * 8 + col];
|
|
465
|
+
var v6 = p[5 * 8 + col];
|
|
466
|
+
// stage 3
|
|
467
|
+
var t = (v0 - v1 + 1) >> 1;
|
|
468
|
+
v0 = (v0 + v1 + 1) >> 1;
|
|
469
|
+
v1 = t;
|
|
470
|
+
t = (v2 * dctSin6 + v3 * dctCos6 + 2048) >> 12;
|
|
471
|
+
v2 = (v2 * dctCos6 - v3 * dctSin6 + 2048) >> 12;
|
|
472
|
+
v3 = t;
|
|
473
|
+
t = (v4 - v6 + 1) >> 1;
|
|
474
|
+
v4 = (v4 + v6 + 1) >> 1;
|
|
475
|
+
v6 = t;
|
|
476
|
+
t = (v7 + v5 + 1) >> 1;
|
|
477
|
+
v5 = (v7 - v5 + 1) >> 1;
|
|
478
|
+
v7 = t;
|
|
479
|
+
// stage 2
|
|
480
|
+
t = (v0 - v3 + 1) >> 1;
|
|
481
|
+
v0 = (v0 + v3 + 1) >> 1;
|
|
482
|
+
v3 = t;
|
|
483
|
+
t = (v1 - v2 + 1) >> 1;
|
|
484
|
+
v1 = (v1 + v2 + 1) >> 1;
|
|
485
|
+
v2 = t;
|
|
486
|
+
t = (v4 * dctSin3 + v7 * dctCos3 + 2048) >> 12;
|
|
487
|
+
v4 = (v4 * dctCos3 - v7 * dctSin3 + 2048) >> 12;
|
|
488
|
+
v7 = t;
|
|
489
|
+
t = (v5 * dctSin1 + v6 * dctCos1 + 2048) >> 12;
|
|
490
|
+
v5 = (v5 * dctCos1 - v6 * dctSin1 + 2048) >> 12;
|
|
491
|
+
v6 = t;
|
|
492
|
+
// stage 1
|
|
493
|
+
p[0 * 8 + col] = v0 + v7;
|
|
494
|
+
p[7 * 8 + col] = v0 - v7;
|
|
495
|
+
p[1 * 8 + col] = v1 + v6;
|
|
496
|
+
p[6 * 8 + col] = v1 - v6;
|
|
497
|
+
p[2 * 8 + col] = v2 + v5;
|
|
498
|
+
p[5 * 8 + col] = v2 - v5;
|
|
499
|
+
p[3 * 8 + col] = v3 + v4;
|
|
500
|
+
p[4 * 8 + col] = v3 - v4;
|
|
501
|
+
}
|
|
502
|
+
// convert to 8-bit integers
|
|
503
|
+
for (var i = 0; i < 64; ++i) {
|
|
504
|
+
var sample = 128 + ((p[i] + 8) >> 4);
|
|
505
|
+
dataOut[i] = sample < 0 ? 0 : sample > 0xFF ? 0xFF : sample;
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
requestMemoryAllocation(samplesPerLine * blocksPerColumn * 8);
|
|
509
|
+
for (var blockRow = 0; blockRow < blocksPerColumn; blockRow++) {
|
|
510
|
+
var scanLine = blockRow << 3;
|
|
511
|
+
for (var i = 0; i < 8; i++)
|
|
512
|
+
lines.push(new Uint8Array(samplesPerLine));
|
|
513
|
+
for (var blockCol = 0; blockCol < blocksPerLine; blockCol++) {
|
|
514
|
+
quantizeAndInverse(component.blocks[blockRow][blockCol], r, R);
|
|
515
|
+
var offset = 0;
|
|
516
|
+
var sample = blockCol << 3;
|
|
517
|
+
for (var j = 0; j < 8; j++) {
|
|
518
|
+
var line = lines[scanLine + j];
|
|
519
|
+
for (var i = 0; i < 8; i++)
|
|
520
|
+
line[sample + i] = r[offset++];
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
return lines;
|
|
525
|
+
}
|
|
526
|
+
function clampTo8bit(a) {
|
|
527
|
+
return a < 0 ? 0 : a > 255 ? 255 : a;
|
|
528
|
+
}
|
|
529
|
+
function parse(data) {
|
|
530
|
+
var self = {
|
|
531
|
+
width: 0,
|
|
532
|
+
height: 0,
|
|
533
|
+
comments: [],
|
|
534
|
+
adobe: undefined,
|
|
535
|
+
components: [],
|
|
536
|
+
exifBuffer: undefined,
|
|
537
|
+
jfif: undefined,
|
|
538
|
+
};
|
|
539
|
+
var maxResolutionInPixels = maxResolutionInMP * 1000 * 1000;
|
|
540
|
+
var offset = 0;
|
|
541
|
+
function readUint16() {
|
|
542
|
+
var value = (data[offset] << 8) | data[offset + 1];
|
|
543
|
+
offset += 2;
|
|
544
|
+
return value;
|
|
545
|
+
}
|
|
546
|
+
function readDataBlock() {
|
|
547
|
+
var length = readUint16();
|
|
548
|
+
var array = data.subarray(offset, offset + length - 2);
|
|
549
|
+
offset += array.length;
|
|
550
|
+
return array;
|
|
551
|
+
}
|
|
552
|
+
function prepareComponents(frame) {
|
|
553
|
+
var maxH = 0, maxV = 0;
|
|
554
|
+
for (var componentId in frame.components) {
|
|
555
|
+
if (frame.components.hasOwnProperty(componentId)) {
|
|
556
|
+
var component = frame.components[componentId];
|
|
557
|
+
if (maxH < component.h)
|
|
558
|
+
maxH = component.h;
|
|
559
|
+
if (maxV < component.v)
|
|
560
|
+
maxV = component.v;
|
|
561
|
+
}
|
|
562
|
+
}
|
|
563
|
+
var mcusPerLine = Math.ceil(frame.samplesPerLine / 8 / maxH);
|
|
564
|
+
var mcusPerColumn = Math.ceil(frame.scanLines / 8 / maxV);
|
|
565
|
+
for (var componentId in frame.components) {
|
|
566
|
+
if (frame.components.hasOwnProperty(componentId)) {
|
|
567
|
+
var component = frame.components[componentId];
|
|
568
|
+
var blocksPerLine = Math.ceil(Math.ceil(frame.samplesPerLine / 8) * component.h / maxH);
|
|
569
|
+
var blocksPerColumn = Math.ceil(Math.ceil(frame.scanLines / 8) * component.v / maxV);
|
|
570
|
+
var blocksPerLineForMcu = mcusPerLine * component.h;
|
|
571
|
+
var blocksPerColumnForMcu = mcusPerColumn * component.v;
|
|
572
|
+
var blocksToAllocate = blocksPerColumnForMcu * blocksPerLineForMcu;
|
|
573
|
+
var blocks = [];
|
|
574
|
+
// Each block is a Int32Array of length 64 (4 x 64 = 256 bytes)
|
|
575
|
+
requestMemoryAllocation(blocksToAllocate * 256);
|
|
576
|
+
for (var i = 0; i < blocksPerColumnForMcu; i++) {
|
|
577
|
+
var row = [];
|
|
578
|
+
for (var j = 0; j < blocksPerLineForMcu; j++) {
|
|
579
|
+
row.push(new Int32Array(64));
|
|
580
|
+
}
|
|
581
|
+
blocks.push(row);
|
|
582
|
+
}
|
|
583
|
+
component.blocksPerLine = blocksPerLine;
|
|
584
|
+
component.blocksPerColumn = blocksPerColumn;
|
|
585
|
+
component.blocks = blocks;
|
|
586
|
+
}
|
|
587
|
+
}
|
|
588
|
+
frame.maxH = maxH;
|
|
589
|
+
frame.maxV = maxV;
|
|
590
|
+
frame.mcusPerLine = mcusPerLine;
|
|
591
|
+
frame.mcusPerColumn = mcusPerColumn;
|
|
592
|
+
}
|
|
593
|
+
var jfif = null;
|
|
594
|
+
var adobe = null;
|
|
595
|
+
var frame = undefined;
|
|
596
|
+
var resetInterval = 0;
|
|
597
|
+
var quantizationTables = [];
|
|
598
|
+
var frames = [];
|
|
599
|
+
var huffmanTablesAC = [];
|
|
600
|
+
var huffmanTablesDC = [];
|
|
601
|
+
var fileMarker = readUint16();
|
|
602
|
+
var malformedDataOffset = -1;
|
|
603
|
+
if (fileMarker != 0xFFD8) { // SOI (Start of Image)
|
|
604
|
+
throw new Error('SOI not found');
|
|
605
|
+
}
|
|
606
|
+
fileMarker = readUint16();
|
|
607
|
+
while (fileMarker != 0xFFD9) { // EOI (End of image)
|
|
608
|
+
switch (fileMarker) {
|
|
609
|
+
case 0xFF00: break;
|
|
610
|
+
case 0xFFE0: // APP0 (Application Specific)
|
|
611
|
+
case 0xFFE1: // APP1
|
|
612
|
+
case 0xFFE2: // APP2
|
|
613
|
+
case 0xFFE3: // APP3
|
|
614
|
+
case 0xFFE4: // APP4
|
|
615
|
+
case 0xFFE5: // APP5
|
|
616
|
+
case 0xFFE6: // APP6
|
|
617
|
+
case 0xFFE7: // APP7
|
|
618
|
+
case 0xFFE8: // APP8
|
|
619
|
+
case 0xFFE9: // APP9
|
|
620
|
+
case 0xFFEA: // APP10
|
|
621
|
+
case 0xFFEB: // APP11
|
|
622
|
+
case 0xFFEC: // APP12
|
|
623
|
+
case 0xFFED: // APP13
|
|
624
|
+
case 0xFFEE: // APP14
|
|
625
|
+
case 0xFFEF: // APP15
|
|
626
|
+
case 0xFFFE: { // COM (Comment)
|
|
627
|
+
var appData = readDataBlock();
|
|
628
|
+
if (fileMarker === 0xFFFE) {
|
|
629
|
+
var comment = '';
|
|
630
|
+
for (var ii = 0; ii < appData.byteLength; ii++) {
|
|
631
|
+
comment += String.fromCharCode(appData[ii]);
|
|
632
|
+
}
|
|
633
|
+
self.comments.push(comment);
|
|
634
|
+
}
|
|
635
|
+
if (fileMarker === 0xFFE0) {
|
|
636
|
+
if (appData[0] === 0x4A && appData[1] === 0x46 && appData[2] === 0x49 &&
|
|
637
|
+
appData[3] === 0x46 && appData[4] === 0) { // 'JFIF\x00'
|
|
638
|
+
jfif = {
|
|
639
|
+
version: { major: appData[5], minor: appData[6] },
|
|
640
|
+
densityUnits: appData[7],
|
|
641
|
+
xDensity: (appData[8] << 8) | appData[9],
|
|
642
|
+
yDensity: (appData[10] << 8) | appData[11],
|
|
643
|
+
thumbWidth: appData[12],
|
|
644
|
+
thumbHeight: appData[13],
|
|
645
|
+
thumbData: appData.subarray(14, 14 + 3 * appData[12] * appData[13])
|
|
646
|
+
};
|
|
647
|
+
}
|
|
648
|
+
}
|
|
649
|
+
// TODO APP1 - Exif
|
|
650
|
+
if (fileMarker === 0xFFE1) {
|
|
651
|
+
if (appData[0] === 0x45 &&
|
|
652
|
+
appData[1] === 0x78 &&
|
|
653
|
+
appData[2] === 0x69 &&
|
|
654
|
+
appData[3] === 0x66 &&
|
|
655
|
+
appData[4] === 0) { // 'EXIF\x00'
|
|
656
|
+
self.exifBuffer = appData.subarray(5, appData.length);
|
|
657
|
+
}
|
|
658
|
+
}
|
|
659
|
+
if (fileMarker === 0xFFEE) {
|
|
660
|
+
if (appData[0] === 0x41 && appData[1] === 0x64 && appData[2] === 0x6F &&
|
|
661
|
+
appData[3] === 0x62 && appData[4] === 0x65 && appData[5] === 0) { // 'Adobe\x00'
|
|
662
|
+
adobe = {
|
|
663
|
+
version: appData[6],
|
|
664
|
+
flags0: (appData[7] << 8) | appData[8],
|
|
665
|
+
flags1: (appData[9] << 8) | appData[10],
|
|
666
|
+
transformCode: appData[11]
|
|
667
|
+
};
|
|
668
|
+
}
|
|
669
|
+
}
|
|
670
|
+
break;
|
|
671
|
+
}
|
|
672
|
+
case 0xFFDB: { // DQT (Define Quantization Tables)
|
|
673
|
+
var quantizationTablesLength = readUint16();
|
|
674
|
+
var quantizationTablesEnd = quantizationTablesLength + offset - 2;
|
|
675
|
+
while (offset < quantizationTablesEnd) {
|
|
676
|
+
var quantizationTableSpec = data[offset++];
|
|
677
|
+
requestMemoryAllocation(64 * 4);
|
|
678
|
+
var tableData = new Int32Array(64);
|
|
679
|
+
if ((quantizationTableSpec >> 4) === 0) { // 8 bit values
|
|
680
|
+
for (var j = 0; j < 64; j++) {
|
|
681
|
+
var z = dctZigZag[j];
|
|
682
|
+
tableData[z] = data[offset++];
|
|
683
|
+
}
|
|
684
|
+
}
|
|
685
|
+
else if ((quantizationTableSpec >> 4) === 1) { //16 bit
|
|
686
|
+
for (var j = 0; j < 64; j++) {
|
|
687
|
+
var z = dctZigZag[j];
|
|
688
|
+
tableData[z] = readUint16();
|
|
689
|
+
}
|
|
690
|
+
}
|
|
691
|
+
else
|
|
692
|
+
throw new Error('DQT: invalid table spec');
|
|
693
|
+
quantizationTables[quantizationTableSpec & 15] = tableData;
|
|
694
|
+
}
|
|
695
|
+
break;
|
|
696
|
+
}
|
|
697
|
+
case 0xFFC0: // SOF0 (Start of Frame, Baseline DCT)
|
|
698
|
+
case 0xFFC1: // SOF1 (Start of Frame, Extended DCT)
|
|
699
|
+
case 0xFFC2: { // SOF2 (Start of Frame, Progressive DCT)
|
|
700
|
+
readUint16(); // skip data length
|
|
701
|
+
frame = {
|
|
702
|
+
extended: (fileMarker === 0xFFC1),
|
|
703
|
+
progressive: (fileMarker === 0xFFC2),
|
|
704
|
+
precision: data[offset++],
|
|
705
|
+
scanLines: readUint16(),
|
|
706
|
+
samplesPerLine: readUint16(),
|
|
707
|
+
components: {},
|
|
708
|
+
componentsOrder: [],
|
|
709
|
+
maxH: 0,
|
|
710
|
+
maxV: 0,
|
|
711
|
+
mcusPerLine: 0,
|
|
712
|
+
mcusPerColumn: 0,
|
|
713
|
+
};
|
|
714
|
+
var pixelsInFrame = frame.scanLines * frame.samplesPerLine;
|
|
715
|
+
if (pixelsInFrame > maxResolutionInPixels) {
|
|
716
|
+
var exceededAmount = Math.ceil((pixelsInFrame - maxResolutionInPixels) / 1e6);
|
|
717
|
+
throw new Error("maxResolutionInMP limit exceeded by " + exceededAmount + "MP");
|
|
718
|
+
}
|
|
719
|
+
var componentsCount = data[offset++];
|
|
720
|
+
for (var i = 0; i < componentsCount; i++) {
|
|
721
|
+
var componentId = data[offset];
|
|
722
|
+
var h = data[offset + 1] >> 4;
|
|
723
|
+
var v = data[offset + 1] & 15;
|
|
724
|
+
var qId = data[offset + 2];
|
|
725
|
+
frame.componentsOrder.push(componentId);
|
|
726
|
+
frame.components[componentId] = {
|
|
727
|
+
h: h,
|
|
728
|
+
v: v,
|
|
729
|
+
quantizationIdx: qId,
|
|
730
|
+
blocksPerColumn: 0,
|
|
731
|
+
blocksPerLine: 0,
|
|
732
|
+
blocks: [],
|
|
733
|
+
pred: 0,
|
|
734
|
+
};
|
|
735
|
+
offset += 3;
|
|
736
|
+
}
|
|
737
|
+
prepareComponents(frame);
|
|
738
|
+
frames.push(frame);
|
|
739
|
+
break;
|
|
740
|
+
}
|
|
741
|
+
case 0xFFC4: { // DHT (Define Huffman Tables)
|
|
742
|
+
var huffmanLength = readUint16();
|
|
743
|
+
for (var i = 2; i < huffmanLength;) {
|
|
744
|
+
var huffmanTableSpec = data[offset++];
|
|
745
|
+
var codeLengths = new Uint8Array(16);
|
|
746
|
+
var codeLengthSum = 0;
|
|
747
|
+
for (var j = 0; j < 16; j++, offset++) {
|
|
748
|
+
codeLengthSum += (codeLengths[j] = data[offset]);
|
|
749
|
+
}
|
|
750
|
+
requestMemoryAllocation(16 + codeLengthSum);
|
|
751
|
+
var huffmanValues = new Uint8Array(codeLengthSum);
|
|
752
|
+
for (var j = 0; j < codeLengthSum; j++, offset++) {
|
|
753
|
+
huffmanValues[j] = data[offset];
|
|
754
|
+
}
|
|
755
|
+
i += 17 + codeLengthSum;
|
|
756
|
+
var index = huffmanTableSpec & 15;
|
|
757
|
+
var table = (huffmanTableSpec >> 4) === 0 ? huffmanTablesDC : huffmanTablesAC;
|
|
758
|
+
table[index] = buildHuffmanTable(codeLengths, huffmanValues);
|
|
759
|
+
}
|
|
760
|
+
break;
|
|
761
|
+
}
|
|
762
|
+
case 0xFFDD: // DRI (Define Restart Interval)
|
|
763
|
+
readUint16(); // skip data length
|
|
764
|
+
resetInterval = readUint16();
|
|
765
|
+
break;
|
|
766
|
+
case 0xFFDC: // Number of Lines marker
|
|
767
|
+
readUint16(); // skip data length
|
|
768
|
+
readUint16(); // Ignore this data since it represents the image height
|
|
769
|
+
break;
|
|
770
|
+
case 0xFFDA: { // SOS (Start of Scan)
|
|
771
|
+
readUint16(); // skip data length
|
|
772
|
+
var selectorsCount = data[offset++];
|
|
773
|
+
var components = [];
|
|
774
|
+
for (var i = 0; i < selectorsCount; i++) {
|
|
775
|
+
var component = frame.components[data[offset++]];
|
|
776
|
+
var tableSpec = data[offset++];
|
|
777
|
+
component.huffmanTableDC = huffmanTablesDC[tableSpec >> 4];
|
|
778
|
+
component.huffmanTableAC = huffmanTablesAC[tableSpec & 15];
|
|
779
|
+
components.push(component);
|
|
780
|
+
}
|
|
781
|
+
var spectralStart = data[offset++];
|
|
782
|
+
var spectralEnd = data[offset++];
|
|
783
|
+
var successiveApproximation = data[offset++];
|
|
784
|
+
var processed = decodeScan(data, offset, frame, components, resetInterval, spectralStart, spectralEnd, successiveApproximation >> 4, successiveApproximation & 15);
|
|
785
|
+
offset += processed;
|
|
786
|
+
break;
|
|
787
|
+
}
|
|
788
|
+
case 0xFFFF: // Fill bytes
|
|
789
|
+
if (data[offset] !== 0xFF) { // Avoid skipping a valid marker.
|
|
790
|
+
offset--;
|
|
791
|
+
}
|
|
792
|
+
break;
|
|
793
|
+
default: {
|
|
794
|
+
if (data[offset - 3] == 0xFF && data[offset - 2] >= 0xC0 && data[offset - 2] <= 0xFE) {
|
|
795
|
+
// could be incorrect encoding -- last 0xFF byte of the previous
|
|
796
|
+
// block was eaten by the encoder
|
|
797
|
+
offset -= 3;
|
|
798
|
+
break;
|
|
799
|
+
}
|
|
800
|
+
else if (fileMarker === 0xE0 || fileMarker == 0xE1) {
|
|
801
|
+
// Recover from malformed APP1 markers popular in some phone models.
|
|
802
|
+
// See https://github.com/eugeneware/jpeg-js/issues/82
|
|
803
|
+
if (malformedDataOffset !== -1) {
|
|
804
|
+
throw new Error("first unknown JPEG marker at offset " + malformedDataOffset.toString(16) + ", second unknown JPEG marker " + fileMarker.toString(16) + " at offset " + (offset - 1).toString(16));
|
|
805
|
+
}
|
|
806
|
+
malformedDataOffset = offset - 1;
|
|
807
|
+
var nextOffset = readUint16();
|
|
808
|
+
if (data[offset + nextOffset - 2] === 0xFF) {
|
|
809
|
+
offset += nextOffset - 2;
|
|
810
|
+
break;
|
|
811
|
+
}
|
|
812
|
+
}
|
|
813
|
+
throw new Error('unknown JPEG marker ' + fileMarker.toString(16));
|
|
814
|
+
}
|
|
815
|
+
}
|
|
816
|
+
fileMarker = readUint16();
|
|
817
|
+
}
|
|
818
|
+
if (frames.length != 1)
|
|
819
|
+
throw new Error('only single frame JPEGs supported');
|
|
820
|
+
// set each frame's components quantization table
|
|
821
|
+
for (var i = 0; i < frames.length; i++) {
|
|
822
|
+
var cp = frames[i].components;
|
|
823
|
+
for (var j in cp) { // TODO: don't use `in`
|
|
824
|
+
cp[j].quantizationTable = quantizationTables[cp[j].quantizationIdx];
|
|
825
|
+
delete cp[j].quantizationIdx; // TODO: why ???
|
|
826
|
+
}
|
|
827
|
+
}
|
|
828
|
+
self.width = frame.samplesPerLine;
|
|
829
|
+
self.height = frame.scanLines;
|
|
830
|
+
self.jfif = jfif;
|
|
831
|
+
self.adobe = adobe;
|
|
832
|
+
self.components = [];
|
|
833
|
+
for (var i = 0; i < frame.componentsOrder.length; i++) {
|
|
834
|
+
var component = frame.components[frame.componentsOrder[i]];
|
|
835
|
+
self.components.push({
|
|
836
|
+
lines: buildComponentData(component),
|
|
837
|
+
scaleX: component.h / frame.maxH,
|
|
838
|
+
scaleY: component.v / frame.maxV
|
|
839
|
+
});
|
|
840
|
+
}
|
|
841
|
+
return self;
|
|
842
|
+
}
|
|
843
|
+
function getData(decoded) {
|
|
844
|
+
var offset = 0;
|
|
845
|
+
var colorTransform = false;
|
|
846
|
+
var width = decoded.width;
|
|
847
|
+
var height = decoded.height;
|
|
848
|
+
var dataLength = width * height * decoded.components.length;
|
|
849
|
+
requestMemoryAllocation(dataLength);
|
|
850
|
+
var data = new Uint8Array(dataLength);
|
|
851
|
+
switch (decoded.components.length) {
|
|
852
|
+
case 1: {
|
|
853
|
+
var component1 = decoded.components[0];
|
|
854
|
+
for (var y = 0; y < height; y++) {
|
|
855
|
+
var component1Line = component1.lines[0 | (y * component1.scaleY)];
|
|
856
|
+
for (var x = 0; x < width; x++) {
|
|
857
|
+
var Y = component1Line[0 | (x * component1.scaleX)];
|
|
858
|
+
data[offset++] = Y;
|
|
859
|
+
}
|
|
860
|
+
}
|
|
861
|
+
break;
|
|
862
|
+
}
|
|
863
|
+
case 2: {
|
|
864
|
+
// PDF might compress two component data in custom colorspace
|
|
865
|
+
var component1 = decoded.components[0];
|
|
866
|
+
var component2 = decoded.components[1];
|
|
867
|
+
for (var y = 0; y < height; y++) {
|
|
868
|
+
var component1Line = component1.lines[0 | (y * component1.scaleY)];
|
|
869
|
+
var component2Line = component2.lines[0 | (y * component2.scaleY)];
|
|
870
|
+
for (var x = 0; x < width; x++) {
|
|
871
|
+
var Y1 = component1Line[0 | (x * component1.scaleX)];
|
|
872
|
+
data[offset++] = Y1;
|
|
873
|
+
var Y2 = component2Line[0 | (x * component2.scaleX)];
|
|
874
|
+
data[offset++] = Y2;
|
|
875
|
+
}
|
|
876
|
+
}
|
|
877
|
+
break;
|
|
878
|
+
}
|
|
879
|
+
case 3: {
|
|
880
|
+
// The default transform for three components is true
|
|
881
|
+
colorTransform = true;
|
|
882
|
+
// The adobe transform marker overrides any previous setting
|
|
883
|
+
if (decoded.adobe && decoded.adobe.transformCode)
|
|
884
|
+
colorTransform = true;
|
|
885
|
+
var component1 = decoded.components[0];
|
|
886
|
+
var component2 = decoded.components[1];
|
|
887
|
+
var component3 = decoded.components[2];
|
|
888
|
+
for (var y = 0; y < height; y++) {
|
|
889
|
+
var component1Line = component1.lines[0 | (y * component1.scaleY)];
|
|
890
|
+
var component2Line = component2.lines[0 | (y * component2.scaleY)];
|
|
891
|
+
var component3Line = component3.lines[0 | (y * component3.scaleY)];
|
|
892
|
+
for (var x = 0; x < width; x++) {
|
|
893
|
+
var Y = void 0, Cb = void 0, Cr = void 0, R = void 0, G = void 0, B = void 0;
|
|
894
|
+
if (!colorTransform) {
|
|
895
|
+
R = component1Line[0 | (x * component1.scaleX)];
|
|
896
|
+
G = component2Line[0 | (x * component2.scaleX)];
|
|
897
|
+
B = component3Line[0 | (x * component3.scaleX)];
|
|
898
|
+
}
|
|
899
|
+
else {
|
|
900
|
+
Y = component1Line[0 | (x * component1.scaleX)];
|
|
901
|
+
Cb = component2Line[0 | (x * component2.scaleX)];
|
|
902
|
+
Cr = component3Line[0 | (x * component3.scaleX)];
|
|
903
|
+
R = clampTo8bit(Y + 1.402 * (Cr - 128));
|
|
904
|
+
G = clampTo8bit(Y - 0.3441363 * (Cb - 128) - 0.71413636 * (Cr - 128));
|
|
905
|
+
B = clampTo8bit(Y + 1.772 * (Cb - 128));
|
|
906
|
+
}
|
|
907
|
+
data[offset++] = R;
|
|
908
|
+
data[offset++] = G;
|
|
909
|
+
data[offset++] = B;
|
|
910
|
+
}
|
|
911
|
+
}
|
|
912
|
+
break;
|
|
913
|
+
}
|
|
914
|
+
case 4: {
|
|
915
|
+
if (!decoded.adobe)
|
|
916
|
+
throw new Error('Unsupported color mode (4 components)');
|
|
917
|
+
// The default transform for four components is false
|
|
918
|
+
colorTransform = false;
|
|
919
|
+
// The adobe transform marker overrides any previous setting
|
|
920
|
+
if (decoded.adobe && decoded.adobe.transformCode)
|
|
921
|
+
colorTransform = true;
|
|
922
|
+
var component1 = decoded.components[0];
|
|
923
|
+
var component2 = decoded.components[1];
|
|
924
|
+
var component3 = decoded.components[2];
|
|
925
|
+
var component4 = decoded.components[3];
|
|
926
|
+
for (var y = 0; y < height; y++) {
|
|
927
|
+
var component1Line = component1.lines[0 | (y * component1.scaleY)];
|
|
928
|
+
var component2Line = component2.lines[0 | (y * component2.scaleY)];
|
|
929
|
+
var component3Line = component3.lines[0 | (y * component3.scaleY)];
|
|
930
|
+
var component4Line = component4.lines[0 | (y * component4.scaleY)];
|
|
931
|
+
for (var x = 0; x < width; x++) {
|
|
932
|
+
var Y = void 0, Cb = void 0, Cr = void 0, K = void 0, C = void 0, M = void 0, Ye = void 0;
|
|
933
|
+
if (!colorTransform) {
|
|
934
|
+
C = component1Line[0 | (x * component1.scaleX)];
|
|
935
|
+
M = component2Line[0 | (x * component2.scaleX)];
|
|
936
|
+
Ye = component3Line[0 | (x * component3.scaleX)];
|
|
937
|
+
K = component4Line[0 | (x * component4.scaleX)];
|
|
938
|
+
}
|
|
939
|
+
else {
|
|
940
|
+
Y = component1Line[0 | (x * component1.scaleX)];
|
|
941
|
+
Cb = component2Line[0 | (x * component2.scaleX)];
|
|
942
|
+
Cr = component3Line[0 | (x * component3.scaleX)];
|
|
943
|
+
K = component4Line[0 | (x * component4.scaleX)];
|
|
944
|
+
C = 255 - clampTo8bit(Y + 1.402 * (Cr - 128));
|
|
945
|
+
M = 255 - clampTo8bit(Y - 0.3441363 * (Cb - 128) - 0.71413636 * (Cr - 128));
|
|
946
|
+
Ye = 255 - clampTo8bit(Y + 1.772 * (Cb - 128));
|
|
947
|
+
}
|
|
948
|
+
data[offset++] = 255 - C;
|
|
949
|
+
data[offset++] = 255 - M;
|
|
950
|
+
data[offset++] = 255 - Ye;
|
|
951
|
+
data[offset++] = 255 - K;
|
|
952
|
+
}
|
|
953
|
+
}
|
|
954
|
+
break;
|
|
955
|
+
}
|
|
956
|
+
default:
|
|
957
|
+
throw new Error('Unsupported color mode');
|
|
958
|
+
}
|
|
959
|
+
return data;
|
|
960
|
+
}
|
|
961
|
+
function decodeJpeg(encoded, createImageData) {
|
|
962
|
+
totalBytesAllocated = 0;
|
|
963
|
+
if (encoded.length === 0)
|
|
964
|
+
throw new Error('Empty jpeg buffer');
|
|
965
|
+
var decoded = parse(encoded);
|
|
966
|
+
requestMemoryAllocation(decoded.width * decoded.height * 4);
|
|
967
|
+
var data = getData(decoded);
|
|
968
|
+
var imageData = createImageData(decoded.width, decoded.height);
|
|
969
|
+
var width = imageData.width;
|
|
970
|
+
var height = imageData.height;
|
|
971
|
+
var imageDataArray = imageData.data;
|
|
972
|
+
var i = 0;
|
|
973
|
+
var j = 0;
|
|
974
|
+
switch (decoded.components.length) {
|
|
975
|
+
case 1:
|
|
976
|
+
for (var y = 0; y < height; y++) {
|
|
977
|
+
for (var x = 0; x < width; x++) {
|
|
978
|
+
var Y = data[i++];
|
|
979
|
+
imageDataArray[j++] = Y;
|
|
980
|
+
imageDataArray[j++] = Y;
|
|
981
|
+
imageDataArray[j++] = Y;
|
|
982
|
+
imageDataArray[j++] = 255;
|
|
983
|
+
}
|
|
984
|
+
}
|
|
985
|
+
break;
|
|
986
|
+
case 3:
|
|
987
|
+
for (var y = 0; y < height; y++) {
|
|
988
|
+
for (var x = 0; x < width; x++) {
|
|
989
|
+
var R = data[i++];
|
|
990
|
+
var G = data[i++];
|
|
991
|
+
var B = data[i++];
|
|
992
|
+
imageDataArray[j++] = R;
|
|
993
|
+
imageDataArray[j++] = G;
|
|
994
|
+
imageDataArray[j++] = B;
|
|
995
|
+
imageDataArray[j++] = 255;
|
|
996
|
+
}
|
|
997
|
+
}
|
|
998
|
+
break;
|
|
999
|
+
case 4:
|
|
1000
|
+
for (var y = 0; y < height; y++) {
|
|
1001
|
+
for (var x = 0; x < width; x++) {
|
|
1002
|
+
var C = data[i++];
|
|
1003
|
+
var M = data[i++];
|
|
1004
|
+
var Y = data[i++];
|
|
1005
|
+
var K = data[i++];
|
|
1006
|
+
var R = 255 - clampTo8bit(C * (1 - K / 255) + K);
|
|
1007
|
+
var G = 255 - clampTo8bit(M * (1 - K / 255) + K);
|
|
1008
|
+
var B = 255 - clampTo8bit(Y * (1 - K / 255) + K);
|
|
1009
|
+
imageDataArray[j++] = R;
|
|
1010
|
+
imageDataArray[j++] = G;
|
|
1011
|
+
imageDataArray[j++] = B;
|
|
1012
|
+
imageDataArray[j++] = 255;
|
|
1013
|
+
}
|
|
1014
|
+
}
|
|
1015
|
+
break;
|
|
1016
|
+
default:
|
|
1017
|
+
throw new Error('Unsupported color mode');
|
|
1018
|
+
}
|
|
1019
|
+
return imageData;
|
|
1020
|
+
}
|
|
1021
|
+
exports.decodeJpeg = decodeJpeg;
|
|
1022
|
+
|
|
1023
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,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RyxHQUFDLENBQUM7Z0JBQ2YsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFDLENBQUM7Z0JBQ2YsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFDLENBQUM7Z0JBQ2YsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFDLENBQUM7Z0JBQ2YsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFDLENBQUM7Z0JBQ2YsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFDLENBQUM7Z0JBQ2YsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFDLENBQUM7Z0JBQ2YsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFDLENBQUM7Z0JBQ2YsU0FBUzthQUNWO1lBRUQsVUFBVTtZQUNWLElBQUksRUFBRSxHQUFHLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzVDLElBQUksRUFBRSxHQUFHLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzVDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUM7WUFDcEIsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztZQUNwQixJQUFJLEVBQUUsR0FBRyxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM3RCxJQUFJLEVBQUUsR0FBRyxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcs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IGJhc2VkIG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9qcGVnLWpzL2pwZWctanNcclxuLypcclxuICAgQ29weXJpZ2h0IDIwMTEgbm90bWFzdGVyeWV0XHJcblxyXG4gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG5cclxuICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG5cclxuICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4qL1xyXG5cclxuaW50ZXJmYWNlIERlY29kZWRDb21wb25lbnQge1xyXG4gIGxpbmVzOiBVaW50OEFycmF5W107XHJcbiAgc2NhbGVYOiBudW1iZXI7XHJcbiAgc2NhbGVZOiBudW1iZXI7XHJcbn1cclxuXHJcbmludGVyZmFjZSBEZWNvZGVkIHtcclxuICB3aWR0aDogbnVtYmVyO1xyXG4gIGhlaWdodDogbnVtYmVyO1xyXG4gIGNvbW1lbnRzOiBzdHJpbmdbXTtcclxuICBleGlmQnVmZmVyOiBVaW50OEFycmF5IHwgdW5kZWZpbmVkO1xyXG4gIGpmaWY6IGFueTtcclxuICBhZG9iZTogYW55O1xyXG4gIGNvbXBvbmVudHM6IERlY29kZWRDb21wb25lbnRbXTtcclxufVxyXG5cclxuaW50ZXJmYWNlIENvbXBvbmVudCB7XHJcbiAgaDogbnVtYmVyO1xyXG4gIHY6IG51bWJlcjtcclxuICBibG9ja3NQZXJMaW5lOiBudW1iZXI7XHJcbiAgYmxvY2tzUGVyQ29sdW1uOiBudW1iZXI7XHJcbiAgYmxvY2tzOiBJbnQzMkFycmF5W11bXTtcclxuICBwcmVkOiBudW1iZXI7IC8vID8/P1xyXG4gIHF1YW50aXphdGlvbklkeD86IG51bWJlcjtcclxuICBxdWFudGl6YXRpb25UYWJsZT86IEludDMyQXJyYXk7XHJcbiAgaHVmZm1hblRhYmxlREM/OiBudW1iZXJbXSB8IG51bWJlcltdW107XHJcbiAgaHVmZm1hblRhYmxlQUM/OiBudW1iZXJbXSB8IG51bWJlcltdW107XHJcbn1cclxuXHJcbmludGVyZmFjZSBGcmFtZSB7XHJcbiAgZXh0ZW5kZWQ6IGJvb2xlYW47XHJcbiAgcHJvZ3Jlc3NpdmU6IGJvb2xlYW47XHJcbiAgcHJlY2lzaW9uOiBudW1iZXI7XHJcbiAgc2NhbkxpbmVzOiBudW1iZXI7XHJcbiAgc2FtcGxlc1BlckxpbmU6IG51bWJlcjtcclxuICBjb21wb25lbnRzOiB7IFtrZXk6IG51bWJlcl06IENvbXBvbmVudDsgfTtcclxuICBjb21wb25lbnRzT3JkZXI6IG51bWJlcltdO1xyXG4gIG1heEg6IG51bWJlcjtcclxuICBtYXhWOiBudW1iZXI7XHJcbiAgbWN1c1BlckxpbmU6IG51bWJlcjtcclxuICBtY3VzUGVyQ29sdW1uOiBudW1iZXI7XHJcbn1cclxuXHJcbmNvbnN0IGRjdFppZ1phZyA9IG5ldyBJbnQzMkFycmF5KFtcclxuICAwLFxyXG4gIDEsIDgsXHJcbiAgMTYsIDksIDIsXHJcbiAgMywgMTAsIDE3LCAyNCxcclxuICAzMiwgMjUsIDE4LCAxMSwgNCxcclxuICA1LCAxMiwgMTksIDI2LCAzMywgNDAsXHJcbiAgNDgsIDQxLCAzNCwgMjcsIDIwLCAxMywgNixcclxuICA3LCAxNCwgMjEsIDI4LCAzNSwgNDIsIDQ5LCA1NixcclxuICA1NywgNTAsIDQzLCAzNiwgMjksIDIyLCAxNSxcclxuICAyMywgMzAsIDM3LCA0NCwgNTEsIDU4LFxyXG4gIDU5LCA1MiwgNDUsIDM4LCAzMSxcclxuICAzOSwgNDYsIDUzLCA2MCxcclxuICA2MSwgNTQsIDQ3LFxyXG4gIDU1LCA2MixcclxuICA2M1xyXG5dKTtcclxuY29uc3QgZGN0Q29zMSA9IDQwMTc7IC8vIGNvcyhwaS8xNilcclxuY29uc3QgZGN0U2luMSA9IDc5OTsgLy8gc2luKHBpLzE2KVxyXG5jb25zdCBkY3RDb3MzID0gMzQwNjsgLy8gY29zKDMqcGkvMTYpXHJcbmNvbnN0IGRjdFNpbjMgPSAyMjc2OyAvLyBzaW4oMypwaS8xNilcclxuY29uc3QgZGN0Q29zNiA9IDE1Njc7IC8vIGNvcyg2KnBpLzE2KVxyXG5jb25zdCBkY3RTaW42ID0gMzc4NDsgLy8gc2luKDYqcGkvMTYpXHJcbmNvbnN0IGRjdFNxcnQyID0gNTc5MzsgLy8gc3FydCgyKVxyXG5jb25zdCBkY3RTcXJ0MWQyID0gMjg5NjsgLy8gc3FydCgyKSAvIDJcclxuXHJcbmNvbnN0IG1heFJlc29sdXRpb25Jbk1QID0gMTAwOyAvLyBEb24ndCBkZWNvZGUgbW9yZSB0aGFuIDEwMCBtZWdhcGl4ZWxzXHJcbmNvbnN0IG1heE1lbW9yeVVzYWdlQnl0ZXMgPSA2NCAqIDEwMjQgKiAxMDI0OyAvLyBEb24ndCBkZWNvZGUgaWYgbWVtb3J5IGZvb3RwcmludCBpcyBtb3JlIHRoYW4gNjRNQlxyXG5sZXQgdG90YWxCeXRlc0FsbG9jYXRlZCA9IDA7IC8vIGF2b2lkIHVuZXhwZWN0ZWQgT09NcyBmcm9tIHVudHJ1c3RlZCBjb250ZW50LlxyXG5cclxuZnVuY3Rpb24gcmVxdWVzdE1lbW9yeUFsbG9jYXRpb24oaW5jcmVhc2VBbW91bnQ6IG51bWJlcikge1xyXG4gIGNvbnN0IHRvdGFsTWVtb3J5SW1wYWN0Qnl0ZXMgPSB0b3RhbEJ5dGVzQWxsb2NhdGVkICsgaW5jcmVhc2VBbW91bnQ7XHJcbiAgaWYgKHRvdGFsTWVtb3J5SW1wYWN0Qnl0ZXMgPiBtYXhNZW1vcnlVc2FnZUJ5dGVzKSB7XHJcbiAgICBjb25zdCBleGNlZWRlZEFtb3VudCA9IE1hdGguY2VpbCgodG90YWxNZW1vcnlJbXBhY3RCeXRlcyAtIG1heE1lbW9yeVVzYWdlQnl0ZXMpIC8gMTAyNCAvIDEwMjQpO1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKGBNYXggbWVtb3J5IGxpbWl0IGV4Y2VlZGVkIGJ5IGF0IGxlYXN0ICR7ZXhjZWVkZWRBbW91bnR9TUJgKTtcclxuICB9XHJcblxyXG4gIHRvdGFsQnl0ZXNBbGxvY2F0ZWQgPSB0b3RhbE1lbW9yeUltcGFjdEJ5dGVzO1xyXG59XHJcblxyXG5mdW5jdGlvbiBidWlsZEh1ZmZtYW5UYWJsZShjb2RlTGVuZ3RoczogVWludDhBcnJheSwgdmFsdWVzOiBVaW50OEFycmF5KSB7XHJcbiAgbGV0IGxlbmd0aCA9IDE2O1xyXG5cclxuICB3aGlsZSAobGVuZ3RoID4gMCAmJiAhY29kZUxlbmd0aHNbbGVuZ3RoIC0gMV0pIGxlbmd0aC0tO1xyXG5cclxuICBpbnRlcmZhY2UgQ29kZSB7XHJcbiAgICBjaGlsZHJlbjogbnVtYmVyW10gfCBudW1iZXJbXVtdO1xyXG4gICAgaW5kZXg6IG51bWJlcjtcclxuICB9XHJcblxyXG4gIGNvbnN0IGNvZGU6IENvZGVbXSA9IFt7IGNoaWxkcmVuOiBbXSwgaW5kZXg6IDAgfV07XHJcbiAgbGV0IGsgPSAwO1xyXG4gIGxldCBwID0gY29kZVswXTtcclxuXHJcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xyXG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCBjb2RlTGVuZ3Roc1tpXTsgaisrKSB7XHJcbiAgICAgIHAgPSBjb2RlLnBvcCgpITtcclxuICAgICAgcC5jaGlsZHJlbltwLmluZGV4XSA9IHZhbHVlc1trXTtcclxuICAgICAgd2hpbGUgKHAuaW5kZXggPiAwKSB7XHJcbiAgICAgICAgaWYgKGNvZGUubGVuZ3RoID09PSAwKSB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCByZWNyZWF0ZSBIdWZmbWFuIFRhYmxlJyk7XHJcbiAgICAgICAgcCA9IGNvZGUucG9wKCkhO1xyXG4gICAgICB9XHJcbiAgICAgIHAuaW5kZXgrKztcclxuICAgICAgY29kZS5wdXNoKHApO1xyXG4gICAgICB3aGlsZSAoY29kZS5sZW5ndGggPD0gaSkge1xyXG4gICAgICAgIGNvbnN0IHE6IENvZGUgPSB7IGNoaWxkcmVuOiBbXSwgaW5kZXg6IDAgfTtcclxuICAgICAgICBjb2RlLnB1c2gocSk7XHJcbiAgICAgICAgcC5jaGlsZHJlbltwLmluZGV4XSA9IHEuY2hpbGRyZW4gYXMgbnVtYmVyW107XHJcbiAgICAgICAgcCA9IHE7XHJcbiAgICAgIH1cclxuICAgICAgaysrO1xyXG4gICAgfVxyXG4gICAgaWYgKGkgKyAxIDwgbGVuZ3RoKSB7XHJcbiAgICAgIC8vIHAgaGVyZSBwb2ludHMgdG8gbGFzdCBjb2RlXHJcbiAgICAgIGNvbnN0IHE6IENvZGUgPSB7IGNoaWxkcmVuOiBbXSwgaW5kZXg6IDAgfTtcclxuICAgICAgY29kZS5wdXNoKHEpO1xyXG4gICAgICBwLmNoaWxkcmVuW3AuaW5kZXhdID0gcS5jaGlsZHJlbiBhcyBudW1iZXJbXTtcclxuICAgICAgcCA9IHE7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZXR1cm4gY29kZVswXS5jaGlsZHJlbjtcclxufVxyXG5cclxuZnVuY3Rpb24gZGVjb2RlU2NhbihcclxuICBkYXRhOiBVaW50OEFycmF5LCBvZmZzZXQ6IG51bWJlciwgZnJhbWU6IEZyYW1lLCBjb21wb25lbnRzOiBDb21wb25lbnRbXSwgcmVzZXRJbnRlcnZhbDogbnVtYmVyLFxyXG4gIHNwZWN0cmFsU3RhcnQ6IG51bWJlciwgc3BlY3RyYWxFbmQ6IG51bWJlciwgc3VjY2Vzc2l2ZVByZXY6IG51bWJlciwgc3VjY2Vzc2l2ZTogbnVtYmVyXHJcbikge1xyXG4gIGNvbnN0IG1jdXNQZXJMaW5lID0gZnJhbWUubWN1c1BlckxpbmU7XHJcbiAgY29uc3QgcHJvZ3Jlc3NpdmUgPSBmcmFtZS5wcm9ncmVzc2l2ZTtcclxuICBjb25zdCBzdGFydE9mZnNldCA9IG9mZnNldDtcclxuICBsZXQgYml0c0RhdGEgPSAwO1xyXG4gIGxldCBiaXRzQ291bnQgPSAwO1xyXG5cclxuICBmdW5jdGlvbiByZWFkQml0KCkge1xyXG4gICAgaWYgKGJpdHNDb3VudCA+IDApIHtcclxuICAgICAgYml0c0NvdW50LS07XHJcbiAgICAgIHJldHVybiAoYml0c0RhdGEgPj4gYml0c0NvdW50KSAmIDE7XHJcbiAgICB9XHJcblxyXG4gICAgYml0c0RhdGEgPSBkYXRhW29mZnNldCsrXTtcclxuXHJcbiAgICBpZiAoYml0c0RhdGEgPT0gMHhGRikge1xyXG4gICAgICBjb25zdCBuZXh0Qnl0ZSA9IGRhdGFbb2Zmc2V0KytdO1xyXG4gICAgICBpZiAobmV4dEJ5dGUpIHRocm93IG5ldyBFcnJvcihgdW5leHBlY3RlZCBtYXJrZXI6ICR7KChiaXRzRGF0YSA8PCA4KSB8IG5leHRCeXRlKS50b1N0cmluZygxNil9YCk7XHJcbiAgICAgIC8vIHVuc3R1ZmYgMFxyXG4gICAgfVxyXG5cclxuICAgIGJpdHNDb3VudCA9IDc7XHJcbiAgICByZXR1cm4gYml0c0RhdGEgPj4+IDc7XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiBkZWNvZGVIdWZmbWFuKHRyZWU6IG51bWJlcltdIHwgbnVtYmVyW11bXSkge1xyXG4gICAgbGV0IG5vZGU6IG51bWJlciB8IG51bWJlcltdIHwgbnVtYmVyW11bXSA9IHRyZWU7XHJcblxyXG4gICAgd2hpbGUgKHRydWUpIHtcclxuICAgICAgbm9kZSA9IG5vZGVbcmVhZEJpdCgpXTtcclxuICAgICAgaWYgKHR5cGVvZiBub2RlID09PSAnbnVtYmVyJykgcmV0dXJuIG5vZGU7XHJcbiAgICAgIGlmIChub2RlID09PSB1bmRlZmluZWQpIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBodWZmbWFuIHNlcXVlbmNlJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiByZWNlaXZlKGxlbmd0aDogbnVtYmVyKSB7XHJcbiAgICBsZXQgbiA9IDA7XHJcbiAgICB3aGlsZSAobGVuZ3RoID4gMCkge1xyXG4gICAgICBuID0gKG4gPDwgMSkgfCByZWFkQml0KCk7XHJcbiAgICAgIGxlbmd0aC0tO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG47XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiByZWNlaXZlQW5kRXh0ZW5kKGxlbmd0aDogbnVtYmVyKSB7XHJcbiAgICBsZXQgbiA9IHJlY2VpdmUobGVuZ3RoKTtcclxuICAgIGlmIChuID49IDEgPDwgKGxlbmd0aCAtIDEpKSByZXR1cm4gbjtcclxuICAgIHJldHVybiBuICsgKC0xIDw8IGxlbmd0aCkgKyAxO1xyXG4gIH1cclxuXHJcbiAgdHlwZSBEZWNvZGVGbiA9IChjb21wb25lbnQ6IENvbXBvbmVudCwgeno6IEludDMyQXJyYXkpID0+IHZvaWQ7XHJcblxyXG4gIGZ1bmN0aW9uIGRlY29kZUJhc2VsaW5lKGNvbXBvbmVudDogQ29tcG9uZW50LCB6ejogSW50MzJBcnJheSkge1xyXG4gICAgY29uc3QgdCA9IGRlY29kZUh1ZmZtYW4oY29tcG9uZW50Lmh1ZmZtYW5UYWJsZURDISk7XHJcbiAgICBjb25zdCBkaWZmID0gdCA9PT0gMCA/IDAgOiByZWNlaXZlQW5kRXh0ZW5kKHQpO1xyXG4gICAgenpbMF0gPSAoY29tcG9uZW50LnByZWQgKz0gZGlmZik7XHJcbiAgICBsZXQgayA9IDE7XHJcblxyXG4gICAgd2hpbGUgKGsgPCA2NCkge1xyXG4gICAgICBjb25zdCBycyA9IGRlY29kZUh1ZmZtYW4oY29tcG9uZW50Lmh1ZmZtYW5UYWJsZUFDISk7XHJcbiAgICAgIGNvbnN0IHMgPSBycyAmIDE1O1xyXG4gICAgICBjb25zdCByID0gcnMgPj4gNDtcclxuICAgICAgaWYgKHMgPT09IDApIHtcclxuICAgICAgICBpZiAociA8IDE1KSBicmVhaztcclxuICAgICAgICBrICs9IDE2O1xyXG4gICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGsgKz0gcjtcclxuICAgICAgY29uc3QgeiA9IGRjdFppZ1phZ1trXTtcclxuICAgICAgenpbel0gPSByZWNlaXZlQW5kRXh0ZW5kKHMpO1xyXG4gICAgICBrKys7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiBkZWNvZGVEQ0ZpcnN0KGNvbXBvbmVudDogQ29tcG9uZW50LCB6ejogSW50MzJBcnJheSkge1xyXG4gICAgY29uc3QgdCA9IGRlY29kZUh1ZmZtYW4oY29tcG9uZW50Lmh1ZmZtYW5UYWJsZURDISk7XHJcbiAgICBjb25zdCBkaWZmID0gdCA9PT0gMCA/IDAgOiAocmVjZWl2ZUFuZEV4dGVuZCh0KSA8PCBzdWNjZXNzaXZlKTtcclxuICAgIHp6WzBdID0gKGNvbXBvbmVudC5wcmVkICs9IGRpZmYpO1xyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gZGVjb2RlRENTdWNjZXNzaXZlKF9jb21wb25lbnQ6IENvbXBvbmVudCwgeno6IEludDMyQXJyYXkpIHtcclxuICAgIHp6WzBdIHw9IHJlYWRCaXQoKSA8PCBzdWNjZXNzaXZlO1xyXG4gIH1cclxuXHJcbiAgbGV0IGVvYnJ1biA9IDA7XHJcblxyXG4gIGZ1bmN0aW9uIGRlY29kZUFDRmlyc3QoY29tcG9uZW50OiBDb21wb25lbnQsIHp6OiBJbnQzMkFycmF5KSB7XHJcbiAgICBpZiAoZW9icnVuID4gMCkge1xyXG4gICAgICBlb2JydW4tLTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgbGV0IGsgPSBzcGVjdHJhbFN0YXJ0LCBlID0gc3BlY3RyYWxFbmQ7XHJcbiAgICB3aGlsZSAoayA8PSBlKSB7XHJcbiAgICAgIGNvbnN0IHJzID0gZGVjb2RlSHVmZm1hbihjb21wb25lbnQuaHVmZm1hblRhYmxlQUMhKTtcclxuICAgICAgY29uc3QgcyA9IHJzICYgMTU7XHJcbiAgICAgIGNvbnN0IHIgPSBycyA+PiA0O1xyXG4gICAgICBpZiAocyA9PT0gMCkge1xyXG4gICAgICAgIGlmIChyIDwgMTUpIHtcclxuICAgICAgICAgIGVvYnJ1biA9IHJlY2VpdmUocikgKyAoMSA8PCByKSAtIDE7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgICAgayArPSAxNjtcclxuICAgICAgICBjb250aW51ZTtcclxuICAgICAgfVxyXG4gICAgICBrICs9IHI7XHJcbiAgICAgIGNvbnN0IHogPSBkY3RaaWdaYWdba107XHJcbiAgICAgIHp6W3pdID0gcmVjZWl2ZUFuZEV4dGVuZChzKSAqICgxIDw8IHN1Y2Nlc3NpdmUpO1xyXG4gICAgICBrKys7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBsZXQgc3VjY2Vzc2l2ZUFDU3RhdGUgPSAwO1xyXG4gIGxldCBzdWNjZXNzaXZlQUNOZXh0VmFsdWUgPSAwO1xyXG5cclxuICBmdW5jdGlvbiBkZWNvZGVBQ1N1Y2Nlc3NpdmUoY29tcG9uZW50OiBDb21wb25lbnQsIHp6OiBJbnQzMkFycmF5KSB7XHJcbiAgICBsZXQgayA9IHNwZWN0cmFsU3RhcnQ7XHJcbiAgICBsZXQgZSA9IHNwZWN0cmFsRW5kO1xyXG4gICAgbGV0IHIgPSAwO1xyXG5cclxuICAgIHdoaWxlIChrIDw9IGUpIHtcclxuICAgICAgY29uc3QgeiA9IGRjdFppZ1phZ1trXTtcclxuICAgICAgY29uc3QgZGlyZWN0aW9uID0genpbel0gPCAwID8gLTEgOiAxO1xyXG5cclxuICAgICAgc3dpdGNoIChzdWNjZXNzaXZlQUNTdGF0ZSkge1xyXG4gICAgICAgIGNhc2UgMDogLy8gaW5pdGlhbCBzdGF0ZVxyXG4gICAgICAgICAgY29uc3QgcnMgPSBkZWNvZGVIdWZmbWFuKGNvbXBvbmVudC5odWZmbWFuVGFibGVBQyEpO1xyXG4gICAgICAgICAgY29uc3QgcyA9IHJzICYgMTU7XHJcbiAgICAgICAgICByID0gcnMgPj4gNDsgLy8gdGhpcyB3YXMgbmV3IHZhcmlhYmxlIGluIG9sZCBjb2RlXHJcbiAgICAgICAgICBpZiAocyA9PT0gMCkge1xyXG4gICAgICAgICAgICBpZiAociA8IDE1KSB7XHJcbiAgICAgICAgICAgICAgZW9icnVuID0gcmVjZWl2ZShyKSArICgxIDw8IHIpO1xyXG4gICAgICAgICAgICAgIHN1Y2Nlc3NpdmVBQ1N0YXRlID0gNDtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICByID0gMTY7XHJcbiAgICAgICAgICAgICAgc3VjY2Vzc2l2ZUFDU3RhdGUgPSAxO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAocyAhPT0gMSkgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIEFDbiBlbmNvZGluZycpO1xyXG4gICAgICAgICAgICBzdWNjZXNzaXZlQUNOZXh0VmFsdWUgPSByZWNlaXZlQW5kRXh0ZW5kKHMpO1xyXG4gICAgICAgICAgICBzdWNjZXNzaXZlQUNTdGF0ZSA9IHIgPyAyIDogMztcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgIGNhc2UgMTogLy8gc2tpcHBpbmcgciB6ZXJvIGl0ZW1zXHJcbiAgICAgICAgY2FzZSAyOlxyXG4gICAgICAgICAgaWYgKHp6W3pdKSB7XHJcbiAgICAgICAgICAgIHp6W3pdICs9IChyZWFkQml0KCkgPDwgc3VjY2Vzc2l2ZSkgKiBkaXJlY3Rpb247XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByLS07XHJcbiAgICAgICAgICAgIGlmIChyID09PSAwKSBzdWNjZXNzaXZlQUNTdGF0ZSA9IHN1Y2Nlc3NpdmVBQ1N0YXRlID09IDIgPyAzIDogMDtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgMzogLy8gc2V0IHZhbHVlIGZvciBhIHplcm8gaXRlbVxyXG4gICAgICAgICAgaWYgKHp6W3pdKSB7XHJcbiAgICAgICAgICAgIHp6W3pdICs9IChyZWFkQml0KCkgPDwgc3VjY2Vzc2l2ZSkgKiBkaXJlY3Rpb247XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB6elt6XSA9IHN1Y2Nlc3NpdmVBQ05leHRWYWx1ZSA8PCBzdWNjZXNzaXZlO1xyXG4gICAgICAgICAgICBzdWNjZXNzaXZlQUNTdGF0ZSA9IDA7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIDQ6IC8vIGVvYlxyXG4gICAgICAgICAgaWYgKHp6W3pdKSB7XHJcbiAgICAgICAgICAgIHp6W3pdICs9IChyZWFkQml0KCkgPDwgc3VjY2Vzc2l2ZSkgKiBkaXJlY3Rpb247XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgICBrKys7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHN1Y2Nlc3NpdmVBQ1N0YXRlID09PSA0KSB7XHJcbiAgICAgIGVvYnJ1bi0tO1xyXG4gICAgICBpZiAoZW9icnVuID09PSAwKSBzdWNjZXNzaXZlQUNTdGF0ZSA9IDA7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiBkZWNvZGVNY3UoY29tcG9uZW50OiBDb21wb25lbnQsIGRlY29kZTogRGVjb2RlRm4sIG1jdTogbnVtYmVyLCByb3c6IG51bWJlciwgY29sOiBudW1iZXIpIHtcclxuICAgIGNvbnN0IG1jdVJvdyA9IChtY3UgLyBtY3VzUGVyTGluZSkgfCAwO1xyXG4gICAgY29uc3QgbWN1Q29sID0gbWN1ICUgbWN1c1BlckxpbmU7XHJcbiAgICBjb25zdCBibG9ja1JvdyA9IG1jdVJvdyAqIGNvbXBvbmVudC52ICsgcm93O1xyXG4gICAgY29uc3QgYmxvY2tDb2wgPSBtY3VDb2wgKiBjb21wb25lbnQuaCArIGNvbDtcclxuICAgIC8vIElmIHRoZSBibG9jayBpcyBtaXNzaW5nLCBqdXN0IHNraXAgaXQuXHJcbiAgICBpZiAoY29tcG9uZW50LmJsb2Nrc1tibG9ja1Jvd10gPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xyXG4gICAgZGVjb2RlKGNvbXBvbmVudCwgY29tcG9uZW50LmJsb2Nrc1tibG9ja1Jvd11bYmxvY2tDb2xdKTtcclxuICB9XHJcblxyXG4gIGZ1bmN0aW9uIGRlY29kZUJsb2NrKGNvbXBvbmVudDogQ29tcG9uZW50LCBkZWNvZGU6IERlY29kZUZuLCBtY3U6IG51bWJlcikge1xyXG4gICAgY29uc3QgYmxvY2tSb3cgPSAobWN1IC8gY29tcG9uZW50LmJsb2Nrc1BlckxpbmUpIHwgMDtcclxuICAgIGNvbnN0IGJsb2NrQ29sID0gbWN1ICUgY29tcG9uZW50LmJsb2Nrc1BlckxpbmU7XHJcbiAgICAvLyBJZiB0aGUgYmxvY2sgaXMgbWlzc2luZywganVzdCBza2lwIGl0LlxyXG4gICAgaWYgKGNvbXBvbmVudC5ibG9ja3NbYmxvY2tSb3ddID09PSB1bmRlZmluZWQpIHJldHVybjtcclxuICAgIGRlY29kZShjb21wb25lbnQsIGNvbXBvbmVudC5ibG9ja3NbYmxvY2tSb3ddW2Jsb2NrQ29sXSk7XHJcbiAgfVxyXG5cclxuICBjb25zdCBjb21wb25lbnRzTGVuZ3RoID0gY29tcG9uZW50cy5sZW5ndGg7XHJcbiAgbGV0IGNvbXBvbmVudDogQ29tcG9uZW50O1xyXG4gIGxldCBkZWNvZGVGbjogRGVjb2RlRm47XHJcblxyXG4gIGlmIChwcm9ncmVzc2l2ZSkge1xyXG4gICAgaWYgKHNwZWN0cmFsU3RhcnQgPT09IDApIHtcclxuICAgICAgZGVjb2RlRm4gPSBzdWNjZXNzaXZlUHJldiA9PT0gMCA/IGRlY29kZURDRmlyc3QgOiBkZWNvZGVEQ1N1Y2Nlc3NpdmU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBkZWNvZGVGbiA9IHN1Y2Nlc3NpdmVQcmV2ID09PSAwID8gZGVjb2RlQUNGaXJzdCA6IGRlY29kZUFDU3VjY2Vzc2l2ZTtcclxuICAgIH1cclxuICB9IGVsc2Uge1xyXG4gICAgZGVjb2RlRm4gPSBkZWNvZGVCYXNlbGluZTtcclxuICB9XHJcblxyXG4gIGxldCBtY3UgPSAwO1xyXG4gIGxldCBtY3VFeHBlY3RlZDogbnVtYmVyO1xyXG5cclxuICBpZiAoY29tcG9uZW50c0xlbmd0aCA9PSAxKSB7XHJcbiAgICBtY3VFeHBlY3RlZCA9IGNvbXBvbmVudHNbMF0uYmxvY2tzUGVyTGluZSAqIGNvbXBvbmVudHNbMF0uYmxvY2tzUGVyQ29sdW1uO1xyXG4gIH0gZWxzZSB7XHJcbiAgICBtY3VFeHBlY3RlZCA9IG1jdXNQZXJMaW5lICogZnJhbWUubWN1c1BlckNvbHVtbjtcclxuICB9XHJcblxyXG4gIGlmICghcmVzZXRJbnRlcnZhbCkgcmVzZXRJbnRlcnZhbCA9IG1jdUV4cGVjdGVkO1xyXG5cclxuICBsZXQgaDogbnVtYmVyO1xyXG4gIGxldCB2OiBudW1iZXI7XHJcbiAgbGV0IG1hcmtlcjogbnVtYmVyO1xyXG5cclxuICB3aGlsZSAobWN1IDwgbWN1RXhwZWN0ZWQpIHtcclxuICAgIC8vIHJlc2V0IGludGVydmFsIHN0dWZmXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbXBvbmVudHNMZW5ndGg7IGkrKykgY29tcG9uZW50c1tpXS5wcmVkID0gMDtcclxuICAgIGVvYnJ1biA9IDA7XHJcblxyXG4gICAgaWYgKGNvbXBvbmVudHNMZW5ndGggPT0gMSkge1xyXG4gICAgICBjb21wb25lbnQgPSBjb21wb25lbnRzWzBdO1xyXG4gICAgICBmb3IgKGxldCBuID0gMDsgbiA8IHJlc2V0SW50ZXJ2YWw7IG4rKykge1xyXG4gICAgICAgIGRlY29kZUJsb2NrKGNvbXBvbmVudCwgZGVjb2RlRm4sIG1jdSk7XHJcbiAgICAgICAgbWN1Kys7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGZvciAobGV0IG4gPSAwOyBuIDwgcmVzZXRJbnRlcnZhbDsgbisrKSB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb21wb25lbnRzTGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGNvbXBvbmVudCA9IGNvbXBvbmVudHNbaV07XHJcbiAgICAgICAgICBoID0gY29tcG9uZW50Lmg7XHJcbiAgICAgICAgICB2ID0gY29tcG9uZW50LnY7XHJcbiAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHY7IGorKykge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IGg7IGsrKykge1xyXG4gICAgICAgICAgICAgIGRlY29kZU1jdShjb21wb25lbnQsIGRlY29kZUZuLCBtY3UsIGosIGspO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG1jdSsrO1xyXG5cclxuICAgICAgICAvLyBJZiB3ZSd2ZSByZWFjaGVkIG91ciBleHBlY3RlZCBNQ1Uncywgc3RvcCBkZWNvZGluZ1xyXG4gICAgICAgIGlmIChtY3UgPT09IG1jdUV4cGVjdGVkKSBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChtY3UgPT09IG1jdUV4cGVjdGVkKSB7XHJcbiAgICAgIC8vIFNraXAgdHJhaWxpbmcgYnl0ZXMgYXQgdGhlIGVuZCBvZiB0aGUgc2NhbiAtIHVudGlsIHdlIHJlYWNoIHRoZSBuZXh0IG1hcmtlclxyXG4gICAgICBkbyB7XHJcbiAgICAgICAgaWYgKGRhdGFbb2Zmc2V0XSA9PT0gMHhGRikge1xyXG4gICAgICAgICAgaWYgKGRhdGFbb2Zmc2V0ICsgMV0gIT09IDB4MDApIHtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG9mZnNldCArPSAxO1xyXG4gICAgICB9IHdoaWxlIChvZmZzZXQgPCBkYXRhLmxlbmd0aCAtIDIpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGZpbmQgbWFya2VyXHJcbiAgICBiaXRzQ291bnQgPSAwO1xyXG4gICAgbWFya2VyID0gKGRhdGFbb2Zmc2V0XSA8PCA4KSB8IGRhdGFbb2Zmc2V0ICsgMV07XHJcblxyXG4gICAgaWYgKG1hcmtlciA8IDB4RkYwMCkgdGhyb3cgbmV3IEVycm9yKCdtYXJrZXIgd2FzIG5vdCBmb3VuZCcpO1xyXG5cclxuICAgIGlmIChtYXJrZXIgPj0gMHhGRkQwICYmIG1hcmtlciA8PSAweEZGRDcpIHsgLy8gUlNUeFxyXG4gICAgICBvZmZzZXQgKz0gMjtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIG9mZnNldCAtIHN0YXJ0T2Zmc2V0O1xyXG59XHJcblxyXG5mdW5jdGlvbiBidWlsZENvbXBvbmVudERhdGEoY29tcG9uZW50OiBDb21wb25lbnQpIHtcclxuICBjb25zdCBsaW5lcyA9IFtdO1xyXG4gIGNvbnN0IGJsb2Nrc1BlckxpbmUgPSBjb21wb25lbnQuYmxvY2tzUGVyTGluZTtcclxuICBjb25zdCBibG9ja3NQZXJDb2x1bW4gPSBjb21wb25lbnQuYmxvY2tzUGVyQ29sdW1uO1xyXG4gIGNvbnN0IHNhbXBsZXNQZXJMaW5lID0gYmxvY2tzUGVyTGluZSA8PCAzO1xyXG4gIC8vIE9ubHkgMSB1c2VkIHBlciBpbnZvY2F0aW9uIG9mIHRoaXMgZnVuY3Rpb24gYW5kIGdhcmJhZ2UgY29sbGVjdGVkIGFmdGVyIGludm9jYXRpb24sIHNvIG5vIG5lZWQgdG8gYWNjb3VudCBmb3IgaXRzIG1lbW9yeSBmb290cHJpbnQuXHJcbiAgY29uc3QgUiA9IG5ldyBJbnQzMkFycmF5KDY0KTtcclxuICBjb25zdCByID0gbmV3IFVpbnQ4QXJyYXkoNjQpO1xyXG5cclxuICAvLyBBIHBvcnQgb2YgcG9wcGxlcidzIElEQ1QgbWV0aG9kIHdoaWNoIGluIHR1cm4gaXMgdGFrZW4gZnJvbTpcclxuICAvLyAgIENocmlzdG9waCBMb2VmZmxlciwgQWRyaWFhbiBMaWd0ZW5iZXJnLCBHZW9yZ2UgUy4gTW9zY2h5dHosXHJcbiAgLy8gICBcIlByYWN0aWNhbCBGYXN0IDEtRCBEQ1QgQWxnb3JpdGhtcyB3aXRoIDExIE11bHRpcGxpY2F0aW9uc1wiLFxyXG4gIC8vICAgSUVFRSBJbnRsLiBDb25mLiBvbiBBY291c3RpY3MsIFNwZWVjaCAmIFNpZ25hbCBQcm9jZXNzaW5nLCAxOTg5LFxyXG4gIC8vICAgOTg4LTk5MS5cclxuICBmdW5jdGlvbiBxdWFudGl6ZUFuZEludmVyc2Uoeno6IEludDMyQXJyYXksIGRhdGFPdXQ6IFVpbnQ4QXJyYXksIGRhdGFJbjogSW50MzJBcnJheSkge1xyXG4gICAgY29uc3QgcXQgPSBjb21wb25lbnQucXVhbnRpemF0aW9uVGFibGUhO1xyXG4gICAgY29uc3QgcCA9IGRhdGFJbjtcclxuXHJcbiAgICAvLyBkZXF1YW50XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDY0OyBpKyspIHtcclxuICAgICAgcFtpXSA9IHp6W2ldICogcXRbaV07XHJcbiAgICB9XHJcblxyXG4gICAgLy8gaW52ZXJzZSBEQ1Qgb24gcm93c1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCA4OyArK2kpIHtcclxuICAgICAgY29uc3Qgcm93ID0gOCAqIGk7XHJcblxyXG4gICAgICAvLyBjaGVjayBmb3IgYWxsLXplcm8gQUMgY29lZmZpY2llbnRzXHJcbiAgICAgIGlmIChwWzEgKyByb3ddID09IDAgJiYgcFsyICsgcm93XSA9PSAwICYmIHBbMyArIHJvd10gPT0gMCAmJlxyXG4gICAgICAgIHBbNCArIHJvd10gPT0gMCAmJiBwWzUgKyByb3ddID09IDAgJiYgcFs2ICsgcm93XSA9PSAwICYmXHJcbiAgICAgICAgcFs3ICsgcm93XSA9PSAwKSB7XHJcbiAgICAgICAgY29uc3QgdCA9IChkY3RTcXJ0MiAqIHBbMCArIHJvd10gKyA1MTIpID4+IDEwO1xyXG4gICAgICAgIHBbMCArIHJvd10gPSB0O1xyXG4gICAgICAgIHBbMSArIHJvd10gPSB0O1xyXG4gICAgICAgIHBbMiArIHJvd10gPSB0O1xyXG4gICAgICAgIHBbMyArIHJvd10gPSB0O1xyXG4gICAgICAgIHBbNCArIHJvd10gPSB0O1xyXG4gICAgICAgIHBbNSArIHJvd10gPSB0O1xyXG4gICAgICAgIHBbNiArIHJvd10gPSB0O1xyXG4gICAgICAgIHBbNyArIHJvd10gPSB0O1xyXG4gICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBzdGFnZSA0XHJcbiAgICAgIGxldCB2MCA9IChkY3RTcXJ0MiAqIHBbMCArIHJvd10gKyAxMjgpID4+IDg7XHJcbiAgICAgIGxldCB2MSA9IChkY3RTcXJ0MiAqIHBbNCArIHJvd10gKyAxMjgpID4+IDg7XHJcbiAgICAgIGxldCB2MiA9IHBbMiArIHJvd107XHJcbiAgICAgIGxldCB2MyA9IHBbNiArIHJvd107XHJcbiAgICAgIGxldCB2NCA9IChkY3RTcXJ0MWQyICogKHBbMSArIHJvd10gLSBwWzcgKyByb3ddKSArIDEyOCkgPj4gODtcclxuICAgICAgbGV0IHY3ID0gKGRjdFNxcnQxZDIgKiAocFsxICsgcm93XSArIHBbNyArIHJvd10pICsgMTI4KSA+PiA4O1xyXG4gICAgICBsZXQgdjUgPSBwWzMgKyByb3ddIDw8IDQ7XHJcbiAgICAgIGxldCB2NiA9IHBbNSArIHJvd10gPDwgNDtcclxuXHJcbiAgICAgIC8vIHN0YWdlIDNcclxuICAgICAgbGV0IHQgPSAodjAgLSB2MSArIDEpID4+IDE7XHJcbiAgICAgIHYwID0gKHYwICsgdjEgKyAxKSA+PiAxO1xyXG4gICAgICB2MSA9IHQ7XHJcbiAgICAgIHQgPSAodjIgKiBkY3RTaW42ICsgdjMgKiBkY3RDb3M2ICsgMTI4KSA+PiA4O1xyXG4gICAgICB2MiA9ICh2MiAqIGRjdENvczYgLSB2MyAqIGRjdFNpbjYgKyAxMjgpID4+IDg7XHJcbiAgICAgIHYzID0gdDtcclxuICAgICAgdCA9ICh2NCAtIHY2ICsgMSkgPj4gMTtcclxuICAgICAgdjQgPSAodjQgKyB2NiArIDEpID4+IDE7XHJcbiAgICAgIHY2ID0gdDtcclxuICAgICAgdCA9ICh2NyArIHY1ICsgMSkgPj4gMTtcclxuICAgICAgdjUgPSAodjcgLSB2NSArIDEpID4+IDE7XHJcbiAgICAgIHY3ID0gdDtcclxuXHJcbiAgICAgIC8vIHN0YWdlIDJcclxuICAgICAgdCA9ICh2MCAtIHYzICsgMSkgPj4gMTtcclxuICAgICAgdjAgPSAodjAgKyB2MyArIDEpID4+IDE7XHJcbiAgICAgIHYzID0gdDtcclxuICAgICAgdCA9ICh2MSAtIHYyICsgMSkgPj4gMTtcclxuICAgICAgdjEgPSAodjEgKyB2MiArIDEpID4+IDE7XHJcbiAgICAgIHYyID0gdDtcclxuICAgICAgdCA9ICh2NCAqIGRjdFNpbjMgKyB2NyAqIGRjdENvczMgKyAyMDQ4KSA+PiAxMjtcclxuICAgICAgdjQgPSAodjQgKiBkY3RDb3MzIC0gdjcgKiBkY3RTaW4zICsgMjA0OCkgPj4gMTI7XHJcbiAgICAgIHY3ID0gdDtcclxuICAgICAgdCA9ICh2NSAqIGRjdFNpbjEgKyB2NiAqIGRjdENvczEgKyAyMDQ4KSA+PiAxMjtcclxuICAgICAgdjUgPSAodjUgKiBkY3RDb3MxIC0gdjYgKiBkY3RTaW4xICsgMjA0OCkgPj4gMTI7XHJcbiAgICAgIHY2ID0gdDtcclxuXHJcbiAgICAgIC8vIHN0YWdlIDFcclxuICAgICAgcFswICsgcm93XSA9IHYwICsgdjc7XHJcbiAgICAgIHBbNyArIHJvd10gPSB2MCAtIHY3O1xyXG4gICAgICBwWzEgKyByb3ddID0gdjEgKyB2NjtcclxuICAgICAgcFs2ICsgcm93XSA9IHYxIC0gdjY7XHJcbiAgICAgIHBbMiArIHJvd10gPSB2MiArIHY1O1xyXG4gICAgICBwWzUgKyByb3ddID0gdjIgLSB2NTtcclxuICAgICAgcFszICsgcm93XSA9IHYzICsgdjQ7XHJcbiAgICAgIHBbNCArIHJvd10gPSB2MyAtIHY0O1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGludmVyc2UgRENUIG9uIGNvbHVtbnNcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgODsgKytpKSB7XHJcbiAgICAgIGNvbnN0IGNvbCA9IGk7XHJcblxyXG4gICAgICAvLyBjaGVjayBmb3IgYWxsLXplcm8gQUMgY29lZmZpY2llbnRzXHJcbiAgICAgIGlmIChwWzEgKiA4ICsgY29sXSA9PSAwICYmIHBbMiAqIDggKyBjb2xdID09IDAgJiYgcFszICogOCArIGNvbF0gPT0gMCAmJlxyXG4gICAgICAgIHBbNCAqIDggKyBjb2xdID09IDAgJiYgcFs1ICogOCArIGNvbF0gPT0gMCAmJiBwWzYgKiA4ICsgY29sXSA9PSAwICYmXHJcbiAgICAgICAgcFs3ICogOCArIGNvbF0gPT0gMCkge1xyXG4gICAgICAgIGNvbnN0IHQgPSAoZGN0U3FydDIgKiBkYXRhSW5baSArIDBdICsgODE5MikgPj4gMTQ7XHJcbiAgICAgICAgcFswICogOCArIGNvbF0gPSB0O1xyXG4gICAgICAgIHBbMSAqIDggKyBjb2xdID0gdDtcclxuICAgICAgICBwWzIgKiA4ICsgY29sXSA9IHQ7XHJcbiAgICAgICAgcFszICogOCArIGNvbF0gPSB0O1xyXG4gICAgICAgIHBbNCAqIDggKyBjb2xdID0gdDtcclxuICAgICAgICBwWzUgKiA4ICsgY29sXSA9IHQ7XHJcbiAgICAgICAgcFs2ICogOCArIGNvbF0gPSB0O1xyXG4gICAgICAgIHBbNyAqIDggKyBjb2xdID0gdDtcclxuICAgICAgICBjb250aW51ZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gc3RhZ2UgNFxyXG4gICAgICBsZXQgdjAgPSAoZGN0U3FydDIgKiBwWzAgKiA4ICsgY29sXSArIDIwNDgpID4+IDEyO1xyXG4gICAgICBsZXQgdjEgPSAoZGN0U3FydDIgKiBwWzQgKiA4ICsgY29sXSArIDIwNDgpID4+IDEyO1xyXG4gICAgICBsZXQgdjIgPSBwWzIgKiA4ICsgY29sXTtcclxuICAgICAgbGV0IHYzID0gcFs2ICogOCArIGNvbF07XHJcbiAgICAgIGxldCB2NCA9IChkY3RTcXJ0MWQyICogKHBbMSAqIDggKyBjb2xdIC0gcFs3ICogOCArIGNvbF0pICsgMjA0OCkgPj4gMTI7XHJcbiAgICAgIGxldCB2NyA9IChkY3RTcXJ0MWQyICogKHBbMSAqIDggKyBjb2xdICsgcFs3ICogOCArIGNvbF0pICsgMjA0OCkgPj4gMTI7XHJcbiAgICAgIGxldCB2NSA9IHBbMyAqIDggKyBjb2xdO1xyXG4gICAgICBsZXQgdjYgPSBwWzUgKiA4ICsgY29sXTtcclxuXHJcbiAgICAgIC8vIHN0YWdlIDNcclxuICAgICAgbGV0IHQgPSAodjAgLSB2MSArIDEpID4+IDE7XHJcbiAgICAgIHYwID0gKHYwICsgdjEgKyAxKSA+PiAxO1xyXG4gICAgICB2MSA9IHQ7XHJcbiAgICAgIHQgPSAodjIgKiBkY3RTaW42ICsgdjMgKiBkY3RDb3M2ICsgMjA0OCkgPj4gMTI7XHJcbiAgICAgIHYyID0gKHYyICogZGN0Q29zNiAtIHYzICogZGN0U2luNiArIDIwNDgpID4+IDEyO1xyXG4gICAgICB2MyA9IHQ7XHJcbiAgICAgIHQgPSAodjQgLSB2NiArIDEpID4+IDE7XHJcbiAgICAgIHY0ID0gKHY0ICsgdjYgKyAxKSA+PiAxO1xyXG4gICAgICB2NiA9IHQ7XHJcbiAgICAgIHQgPSAodjcgKyB2NSArIDEpID4+IDE7XHJcbiAgICAgIHY1ID0gKHY3IC0gdjUgKyAxKSA+PiAxO1xyXG4gICAgICB2NyA9IHQ7XHJcblxyXG4gICAgICAvLyBzdGFnZSAyXHJcbiAgICAgIHQgPSAodjAgLSB2MyArIDEpID4+IDE7XHJcbiAgICAgIHYwID0gKHYwICsgdjMgKyAxKSA+PiAxO1xyXG4gICAgICB2MyA9IHQ7XHJcbiAgICAgIHQgPSAodjEgLSB2MiArIDEpID4+IDE7XHJcbiAgICAgIHYxID0gKHYxICsgdjIgKyAxKSA+PiAxO1xyXG4gICAgICB2MiA9IHQ7XHJcbiAgICAgIHQgPSAodjQgKiBkY3RTaW4zICsgdjcgKiBkY3RDb3MzICsgMjA0OCkgPj4gMTI7XHJcbiAgICAgIHY0ID0gKHY0ICogZGN0Q29zMyAtIHY3ICogZGN0U2luMyArIDIwNDgpID4+IDEyO1xyXG4gICAgICB2NyA9IHQ7XHJcbiAgICAgIHQgPSAodjUgKiBkY3RTaW4xICsgdjYgKiBkY3RDb3MxICsgMjA0OCkgPj4gMTI7XHJcbiAgICAgIHY1ID0gKHY1ICogZGN0Q29zMSAtIHY2ICogZGN0U2luMSArIDIwNDgpID4+IDEyO1xyXG4gICAgICB2NiA9IHQ7XHJcblxyXG4gICAgICAvLyBzdGFnZSAxXHJcbiAgICAgIHBbMCAqIDggKyBjb2xdID0gdjAgKyB2NztcclxuICAgICAgcFs3ICogOCArIGNvbF0gPSB2MCAtIHY3O1xyXG4gICAgICBwWzEgKiA4ICsgY29sXSA9IHYxICsgdjY7XHJcbiAgICAgIHBbNiAqIDggKyBjb2xdID0gdjEgLSB2NjtcclxuICAgICAgcFsyICogOCArIGNvbF0gPSB2MiArIHY1O1xyXG4gICAgICBwWzUgKiA4ICsgY29sXSA9IHYyIC0gdjU7XHJcbiAgICAgIHBbMyAqIDggKyBjb2xdID0gdjMgKyB2NDtcclxuICAgICAgcFs0ICogOCArIGNvbF0gPSB2MyAtIHY0O1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGNvbnZlcnQgdG8gOC1iaXQgaW50ZWdlcnNcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNjQ7ICsraSkge1xyXG4gICAgICBjb25zdCBzYW1wbGUgPSAxMjggKyAoKHBbaV0gKyA4KSA+PiA0KTtcclxuICAgICAgZGF0YU91dFtpXSA9IHNhbXBsZSA8IDAgPyAwIDogc2FtcGxlID4gMHhGRiA/IDB4RkYgOiBzYW1wbGU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZXF1ZXN0TWVtb3J5QWxsb2NhdGlvbihzYW1wbGVzUGVyTGluZSAqIGJsb2Nrc1BlckNvbHVtbiAqIDgpO1xyXG5cclxuICBmb3IgKGxldCBibG9ja1JvdyA9IDA7IGJsb2NrUm93IDwgYmxvY2tzUGVyQ29sdW1uOyBibG9ja1JvdysrKSB7XHJcbiAgICBjb25zdCBzY2FuTGluZSA9IGJsb2NrUm93IDw8IDM7XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCA4OyBpKyspXHJcbiAgICAgIGxpbmVzLnB1c2gobmV3IFVpbnQ4QXJyYXkoc2FtcGxlc1BlckxpbmUpKTtcclxuXHJcbiAgICBmb3IgKGxldCBibG9ja0NvbCA9IDA7IGJsb2NrQ29sIDwgYmxvY2tzUGVyTGluZTsgYmxvY2tDb2wrKykge1xyXG4gICAgICBxdWFudGl6ZUFuZEludmVyc2UoY29tcG9uZW50LmJsb2Nrc1tibG9ja1Jvd11bYmxvY2tDb2xdLCByLCBSKTtcclxuXHJcbiAgICAgIGxldCBvZmZzZXQgPSAwO1xyXG4gICAgICBjb25zdCBzYW1wbGUgPSBibG9ja0NvbCA8PCAzO1xyXG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IDg7IGorKykge1xyXG4gICAgICAgIGNvbnN0IGxpbmUgPSBsaW5lc1tzY2FuTGluZSArIGpdO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgODsgaSsrKVxyXG4gICAgICAgICAgbGluZVtzYW1wbGUgKyBpXSA9IHJbb2Zmc2V0KytdO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG4gIHJldHVybiBsaW5lcztcclxufVxyXG5cclxuZnVuY3Rpb24gY2xhbXBUbzhiaXQoYTogbnVtYmVyKSB7XHJcbiAgcmV0dXJuIGEgPCAwID8gMCA6IGEgPiAyNTUgPyAyNTUgOiBhO1xyXG59XHJcblxyXG5mdW5jdGlvbiBwYXJzZShkYXRhOiBVaW50OEFycmF5KSB7XHJcbiAgY29uc3Qgc2VsZjogRGVjb2RlZCA9IHtcclxuICAgIHdpZHRoOiAwLFxyXG4gICAgaGVpZ2h0OiAwLFxyXG4gICAgY29tbWVudHM6IFtdLFxyXG4gICAgYWRvYmU6IHVuZGVmaW5lZCxcclxuICAgIGNvbXBvbmVudHM6IFtdLFxyXG4gICAgZXhpZkJ1ZmZlcjogdW5kZWZpbmVkLFxyXG4gICAgamZpZjogdW5kZWZpbmVkLFxyXG4gIH07XHJcblxyXG4gIGNvbnN0IG1heFJlc29sdXRpb25JblBpeGVscyA9IG1heFJlc29sdXRpb25Jbk1QICogMTAwMCAqIDEwMDA7XHJcbiAgbGV0IG9mZnNldCA9IDA7XHJcblxyXG4gIGZ1bmN0aW9uIHJlYWRVaW50MTYoKSB7XHJcbiAgICBjb25zdCB2YWx1ZSA9IChkYXRhW29mZnNldF0gPDwgOCkgfCBkYXRhW29mZnNldCArIDFdO1xyXG4gICAgb2Zmc2V0ICs9IDI7XHJcbiAgICByZXR1cm4gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiByZWFkRGF0YUJsb2NrKCkge1xyXG4gICAgY29uc3QgbGVuZ3RoID0gcmVhZFVpbnQxNigpO1xyXG4gICAgY29uc3QgYXJyYXkgPSBkYXRhLnN1YmFycmF5KG9mZnNldCwgb2Zmc2V0ICsgbGVuZ3RoIC0gMik7XHJcbiAgICBvZmZzZXQgKz0gYXJyYXkubGVuZ3RoO1xyXG4gICAgcmV0dXJuIGFycmF5O1xyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gcHJlcGFyZUNvbXBvbmVudHMoZnJhbWU6IEZyYW1lKSB7XHJcbiAgICBsZXQgbWF4SCA9IDAsIG1heFYgPSAwO1xyXG5cclxuICAgIGZvciAobGV0IGNvbXBvbmVudElkIGluIGZyYW1lLmNvbXBvbmVudHMpIHtcclxuICAgICAgaWYgKGZyYW1lLmNvbXBvbmVudHMuaGFzT3duUHJvcGVydHkoY29tcG9uZW50SWQpKSB7XHJcbiAgICAgICAgY29uc3QgY29tcG9uZW50ID0gZnJhbWUuY29tcG9uZW50c1tjb21wb25lbnRJZF07XHJcbiAgICAgICAgaWYgKG1heEggPCBjb21wb25lbnQuaCkgbWF4SCA9IGNvbXBvbmVudC5oO1xyXG4gICAgICAgIGlmIChtYXhWIDwgY29tcG9uZW50LnYpIG1heFYgPSBjb21wb25lbnQudjtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IG1jdXNQZXJMaW5lID0gTWF0aC5jZWlsKGZyYW1lLnNhbXBsZXNQZXJMaW5lIC8gOCAvIG1heEgpO1xyXG4gICAgY29uc3QgbWN1c1BlckNvbHVtbiA9IE1hdGguY2VpbChmcmFtZS5zY2FuTGluZXMgLyA4IC8gbWF4Vik7XHJcblxyXG4gICAgZm9yIChsZXQgY29tcG9uZW50SWQgaW4gZnJhbWUuY29tcG9uZW50cykge1xyXG4gICAgICBpZiAoZnJhbWUuY29tcG9uZW50cy5oYXNPd25Qcm9wZXJ0eShjb21wb25lbnRJZCkpIHtcclxuICAgICAgICBjb25zdCBjb21wb25lbnQgPSBmcmFtZS5jb21wb25lbnRzW2NvbXBvbmVudElkXTtcclxuICAgICAgICBjb25zdCBibG9ja3NQZXJMaW5lID0gTWF0aC5jZWlsKE1hdGguY2VpbChmcmFtZS5zYW1wbGVzUGVyTGluZSAvIDgpICogY29tcG9uZW50LmggLyBtYXhIKTtcclxuICAgICAgICBjb25zdCBibG9ja3NQZXJDb2x1bW4gPSBNYXRoLmNlaWwoTWF0aC5jZWlsKGZyYW1lLnNjYW5MaW5lcyAvIDgpICogY29tcG9uZW50LnYgLyBtYXhWKTtcclxuICAgICAgICBjb25zdCBibG9ja3NQZXJMaW5lRm9yTWN1ID0gbWN1c1BlckxpbmUgKiBjb21wb25lbnQuaDtcclxuICAgICAgICBjb25zdCBibG9ja3NQZXJDb2x1bW5Gb3JNY3UgPSBtY3VzUGVyQ29sdW1uICogY29tcG9uZW50LnY7XHJcbiAgICAgICAgY29uc3QgYmxvY2tzVG9BbGxvY2F0ZSA9IGJsb2Nrc1BlckNvbHVtbkZvck1jdSAqIGJsb2Nrc1BlckxpbmVGb3JNY3U7XHJcbiAgICAgICAgY29uc3QgYmxvY2tzOiBJbnQzMkFycmF5W11bXSA9IFtdO1xyXG5cclxuICAgICAgICAvLyBFYWNoIGJsb2NrIGlzIGEgSW50MzJBcnJheSBvZiBsZW5ndGggNjQgKDQgeCA2NCA9IDI1NiBieXRlcylcclxuICAgICAgICByZXF1ZXN0TWVtb3J5QWxsb2NhdGlvbihibG9ja3NUb0FsbG9jYXRlICogMjU2KTtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBibG9ja3NQZXJDb2x1bW5Gb3JNY3U7IGkrKykge1xyXG4gICAgICAgICAgY29uc3Qgcm93OiBJbnQzMkFycmF5W10gPSBbXTtcclxuICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgYmxvY2tzUGVyTGluZUZvck1jdTsgaisrKSB7XHJcbiAgICAgICAgICAgIHJvdy5wdXNoKG5ldyBJbnQzMkFycmF5KDY0KSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBibG9ja3MucHVzaChyb3cpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb21wb25lbnQuYmxvY2tzUGVyTGluZSA9IGJsb2Nrc1BlckxpbmU7XHJcbiAgICAgICAgY29tcG9uZW50LmJsb2Nrc1BlckNvbHVtbiA9IGJsb2Nrc1BlckNvbHVtbjtcclxuICAgICAgICBjb21wb25lbnQuYmxvY2tzID0gYmxvY2tzO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZnJhbWUubWF4SCA9IG1heEg7XHJcbiAgICBmcmFtZS5tYXhWID0gbWF4VjtcclxuICAgIGZyYW1lLm1jdXNQZXJMaW5lID0gbWN1c1BlckxpbmU7XHJcbiAgICBmcmFtZS5tY3VzUGVyQ29sdW1uID0gbWN1c1BlckNvbHVtbjtcclxuICB9XHJcblxyXG4gIGxldCBqZmlmID0gbnVsbDtcclxuICBsZXQgYWRvYmUgPSBudWxsO1xyXG4gIGxldCBmcmFtZTogRnJhbWUgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XHJcbiAgbGV0IHJlc2V0SW50ZXJ2YWwgPSAwO1xyXG4gIGxldCBxdWFudGl6YXRpb25UYWJsZXMgPSBbXTtcclxuICBsZXQgZnJhbWVzOiBGcmFtZVtdID0gW107XHJcbiAgbGV0IGh1ZmZtYW5UYWJsZXNBQzogKG51bWJlcltdIHwgbnVtYmVyW11bXSlbXSA9IFtdO1xyXG4gIGxldCBodWZmbWFuVGFibGVzREM6IChudW1iZXJbXSB8IG51bWJlcltdW10pW10gPSBbXTtcclxuICBsZXQgZmlsZU1hcmtlciA9IHJlYWRVaW50MTYoKTtcclxuICBsZXQgbWFsZm9ybWVkRGF0YU9mZnNldCA9IC0xO1xyXG5cclxuICBpZiAoZmlsZU1hcmtlciAhPSAweEZGRDgpIHsgLy8gU09JIChTdGFydCBvZiBJbWFnZSlcclxuICAgIHRocm93IG5ldyBFcnJvcignU09JIG5vdCBmb3VuZCcpO1xyXG4gIH1cclxuXHJcbiAgZmlsZU1hcmtlciA9IHJlYWRVaW50MTYoKTtcclxuICB3aGlsZSAoZmlsZU1hcmtlciAhPSAweEZGRDkpIHsgLy8gRU9JIChFbmQgb2YgaW1hZ2UpXHJcbiAgICBzd2l0Y2ggKGZpbGVNYXJrZXIpIHtcclxuICAgICAgY2FzZSAweEZGMDA6IGJyZWFrO1xyXG4gICAgICBjYXNlIDB4RkZFMDogLy8gQVBQMCAoQXBwbGljYXRpb24gU3BlY2lmaWMpXHJcbiAgICAgIGNhc2UgMHhGRkUxOiAvLyBBUFAxXHJcbiAgICAgIGNhc2UgMHhGRkUyOiAvLyBBUFAyXHJcbiAgICAgIGNhc2UgMHhGRkUzOiAvLyBBUFAzXHJcbiAgICAgIGNhc2UgMHhGRkU0OiAvLyBBUFA0XHJcbiAgICAgIGNhc2UgMHhGRkU1OiAvLyBBUFA1XHJcbiAgICAgIGNhc2UgMHhGRkU2OiAvLyBBUFA2XHJcbiAgICAgIGNhc2UgMHhGRkU3OiAvLyBBUFA3XHJcbiAgICAgIGNhc2UgMHhGRkU4OiAvLyBBUFA4XHJcbiAgICAgIGNhc2UgMHhGRkU5OiAvLyBBUFA5XHJcbiAgICAgIGNhc2UgMHhGRkVBOiAvLyBBUFAxMFxyXG4gICAgICBjYXNlIDB4RkZFQjogLy8gQVBQMTFcclxuICAgICAgY2FzZSAweEZGRUM6IC8vIEFQUDEyXHJcbiAgICAgIGNhc2UgMHhGRkVEOiAvLyBBUFAxM1xyXG4gICAgICBjYXNlIDB4RkZFRTogLy8gQVBQMTRcclxuICAgICAgY2FzZSAweEZGRUY6IC8vIEFQUDE1XHJcbiAgICAgIGNhc2UgMHhGRkZFOiB7IC8vIENPTSAoQ29tbWVudClcclxuICAgICAgICBjb25zdCBhcHBEYXRhID0gcmVhZERhdGFCbG9jaygpO1xyXG5cclxuICAgICAgICBpZiAoZmlsZU1hcmtlciA9PT0gMHhGRkZFKSB7XHJcbiAgICAgICAgICBsZXQgY29tbWVudCA9ICcnO1xyXG4gICAgICAgICAgZm9yIChsZXQgaWkgPSAwOyBpaSA8IGFwcERhdGEuYnl0ZUxlbmd0aDsgaWkrKykge1xyXG4gICAgICAgICAgICBjb21tZW50ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYXBwRGF0YVtpaV0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgc2VsZi5jb21tZW50cy5wdXNoKGNvbW1lbnQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGZpbGVNYXJrZXIgPT09IDB4RkZFMCkge1xyXG4gICAgICAgICAgaWYgKGFwcERhdGFbMF0gPT09IDB4NEEgJiYgYXBwRGF0YVsxXSA9PT0gMHg0NiAmJiBhcHBEYXRhWzJdID09PSAweDQ5ICYmXHJcbiAgICAgICAgICAgIGFwcERhdGFbM10gPT09IDB4NDYgJiYgYXBwRGF0YVs0XSA9PT0gMCkgeyAvLyAnSkZJRlxceDAwJ1xyXG4gICAgICAgICAgICBqZmlmID0ge1xyXG4gICAgICAgICAgICAgIHZlcnNpb246IHsgbWFqb3I6IGFwcERhdGFbNV0sIG1pbm9yOiBhcHBEYXRhWzZdIH0sXHJcbiAgICAgICAgICAgICAgZGVuc2l0eVVuaXRzOiBhcHBEYXRhWzddLFxyXG4gICAgICAgICAgICAgIHhEZW5zaXR5OiAoYXBwRGF0YVs4XSA8PCA4KSB8IGFwcERhdGFbOV0sXHJcbiAgICAgICAgICAgICAgeURlbnNpdHk6IChhcHBEYXRhWzEwXSA8PCA4KSB8IGFwcERhdGFbMTFdLFxyXG4gICAgICAgICAgICAgIHRodW1iV2lkdGg6IGFwcERhdGFbMTJdLFxyXG4gICAgICAgICAgICAgIHRodW1iSGVpZ2h0OiBhcHBEYXRhWzEzXSxcclxuICAgICAgICAgICAgICB0aHVtYkRhdGE6IGFwcERhdGEuc3ViYXJyYXkoMTQsIDE0ICsgMyAqIGFwcERhdGFbMTJdICogYXBwRGF0YVsxM10pXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFRPRE8gQVBQMSAtIEV4aWZcclxuICAgICAgICBpZiAoZmlsZU1hcmtlciA9PT0gMHhGRkUxKSB7XHJcbiAgICAgICAgICBpZiAoYXBwRGF0YVswXSA9PT0gMHg0NSAmJlxyXG4gICAgICAgICAgICBhcHBEYXRhWzFdID09PSAweDc4ICYmXHJcbiAgICAgICAgICAgIGFwcERhdGFbMl0gPT09IDB4NjkgJiZcclxuICAgICAgICAgICAgYXBwRGF0YVszXSA9PT0gMHg2NiAmJlxyXG4gICAgICAgICAgICBhcHBEYXRhWzRdID09PSAwKSB7IC8vICdFWElGXFx4MDAnXHJcbiAgICAgICAgICAgIHNlbGYuZXhpZkJ1ZmZlciA9IGFwcERhdGEuc3ViYXJyYXkoNSwgYXBwRGF0YS5sZW5ndGgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGZpbGVNYXJrZXIgPT09IDB4RkZFRSkge1xyXG4gICAgICAgICAgaWYgKGFwcERhdGFbMF0gPT09IDB4NDEgJiYgYXBwRGF0YVsxXSA9PT0gMHg2NCAmJiBhcHBEYXRhWzJdID09PSAweDZGICYmXHJcbiAgICAgICAgICAgIGFwcERhdGFbM10gPT09IDB4NjIgJiYgYXBwRGF0YVs0XSA9PT0gMHg2NSAmJiBhcHBEYXRhWzVdID09PSAwKSB7IC8vICdBZG9iZVxceDAwJ1xyXG4gICAgICAgICAgICBhZG9iZSA9IHtcclxuICAgICAgICAgICAgICB2ZXJzaW9uOiBhcHBEYXRhWzZdLFxyXG4gICAgICAgICAgICAgIGZsYWdzMDogKGFwcERhdGFbN10gPDwgOCkgfCBhcHBEYXRhWzhdLFxyXG4gICAgICAgICAgICAgIGZsYWdzMTogKGFwcERhdGFbOV0gPDwgOCkgfCBhcHBEYXRhWzEwXSxcclxuICAgICAgICAgICAgICB0cmFuc2Zvcm1Db2RlOiBhcHBEYXRhWzExXVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgICBjYXNlIDB4RkZEQjogeyAvLyBEUVQgKERlZmluZSBRdWFudGl6YXRpb24gVGFibGVzKVxyXG4gICAgICAgIGNvbnN0IHF1YW50aXphdGlvblRhYmxlc0xlbmd0aCA9IHJlYWRVaW50MTYoKTtcclxuICAgICAgICBjb25zdCBxdWFudGl6YXRpb25UYWJsZXNFbmQgPSBxdWFudGl6YXRpb25UYWJsZXNMZW5ndGggKyBvZmZzZXQgLSAyO1xyXG4gICAgICAgIHdoaWxlIChvZmZzZXQgPCBxdWFudGl6YXRpb25UYWJsZXNFbmQpIHtcclxuICAgICAgICAgIGNvbnN0IHF1YW50aXphdGlvblRhYmxlU3BlYyA9IGRhdGFbb2Zmc2V0KytdO1xyXG4gICAgICAgICAgcmVxdWVzdE1lbW9yeUFsbG9jYXRpb24oNjQgKiA0KTtcclxuICAgICAgICAgIGNvbnN0IHRhYmxlRGF0YSA9IG5ldyBJbnQzMkFycmF5KDY0KTtcclxuICAgICAgICAgIGlmICgocXVhbnRpemF0aW9uVGFibGVTcGVjID4+IDQpID09PSAwKSB7IC8vIDggYml0IHZhbHVlc1xyXG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IDY0OyBqKyspIHtcclxuICAgICAgICAgICAgICBjb25zdCB6ID0gZGN0WmlnWmFnW2pdO1xyXG4gICAgICAgICAgICAgIHRhYmxlRGF0YVt6XSA9IGRhdGFbb2Zmc2V0KytdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKChxdWFudGl6YXRpb25UYWJsZVNwZWMgPj4gNCkgPT09IDEpIHsgLy8xNiBiaXRcclxuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCA2NDsgaisrKSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgeiA9IGRjdFppZ1phZ1tqXTtcclxuICAgICAgICAgICAgICB0YWJsZURhdGFbel0gPSByZWFkVWludDE2KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gZWxzZVxyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RRVDogaW52YWxpZCB0YWJsZSBzcGVjJyk7XHJcbiAgICAgICAgICBxdWFudGl6YXRpb25UYWJsZXNbcXVhbnRpemF0aW9uVGFibGVTcGVjICYgMTVdID0gdGFibGVEYXRhO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgICBjYXNlIDB4RkZDMDogLy8gU09GMCAoU3RhcnQgb2YgRnJhbWUsIEJhc2VsaW5lIERDVClcclxuICAgICAgY2FzZSAweEZGQzE6IC8vIFNPRjEgKFN0YXJ0IG9mIEZyYW1lLCBFeHRlbmRlZCBEQ1QpXHJcbiAgICAgIGNhc2UgMHhGRkMyOiB7IC8vIFNPRjIgKFN0YXJ0IG9mIEZyYW1lLCBQcm9ncmVzc2l2ZSBEQ1QpXHJcbiAgICAgICAgcmVhZFVpbnQxNigpOyAvLyBza2lwIGRhdGEgbGVuZ3RoXHJcbiAgICAgICAgZnJhbWUgPSB7XHJcbiAgICAgICAgICBleHRlbmRlZDogKGZpbGVNYXJrZXIgPT09IDB4RkZDMSksXHJcbiAgICAgICAgICBwcm9ncmVzc2l2ZTogKGZpbGVNYXJrZXIgPT09IDB4RkZDMiksXHJcbiAgICAgICAgICBwcmVjaXNpb246IGRhdGFbb2Zmc2V0KytdLFxyXG4gICAgICAgICAgc2NhbkxpbmVzOiByZWFkVWludDE2KCksXHJcbiAgICAgICAgICBzYW1wbGVzUGVyTGluZTogcmVhZFVpbnQxNigpLFxyXG4gICAgICAgICAgY29tcG9uZW50czoge30sXHJcbiAgICAgICAgICBjb21wb25lbnRzT3JkZXI6IFtdLFxyXG4gICAgICAgICAgbWF4SDogMCxcclxuICAgICAgICAgIG1heFY6IDAsXHJcbiAgICAgICAgICBtY3VzUGVyTGluZTogMCxcclxuICAgICAgICAgIG1jdXNQZXJDb2x1bW46IDAsXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgY29uc3QgcGl4ZWxzSW5GcmFtZSA9IGZyYW1lIS5zY2FuTGluZXMgKiBmcmFtZSEuc2FtcGxlc1BlckxpbmU7XHJcbiAgICAgICAgaWYgKHBpeGVsc0luRnJhbWUgPiBtYXhSZXNvbHV0aW9uSW5QaXhlbHMpIHtcclxuICAgICAgICAgIGNvbnN0IGV4Y2VlZGVkQW1vdW50ID0gTWF0aC5jZWlsKChwaXhlbHNJbkZyYW1lIC0gbWF4UmVzb2x1dGlvbkluUGl4ZWxzKSAvIDFlNik7XHJcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYG1heFJlc29sdXRpb25Jbk1QIGxpbWl0IGV4Y2VlZGVkIGJ5ICR7ZXhjZWVkZWRBbW91bnR9TVBgKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGNvbXBvbmVudHNDb3VudCA9IGRhdGFbb2Zmc2V0KytdO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbXBvbmVudHNDb3VudDsgaSsrKSB7XHJcbiAgICAgICAgICBjb25zdCBjb21wb25lbnRJZCA9IGRhdGFbb2Zmc2V0XTtcclxuICAgICAgICAgIGNvbnN0IGggPSBkYXRhW29mZnNldCArIDFdID4+IDQ7XHJcbiAgICAgICAgICBjb25zdCB2ID0gZGF0YVtvZmZzZXQgKyAxXSAmIDE1O1xyXG4gICAgICAgICAgY29uc3QgcUlkID0gZGF0YVtvZmZzZXQgKyAyXTtcclxuICAgICAgICAgIGZyYW1lIS5jb21wb25lbnRzT3JkZXIucHVzaChjb21wb25lbnRJZCk7XHJcbiAgICAgICAgICBmcmFtZSEuY29tcG9uZW50c1tjb21wb25lbnRJZF0gPSB7XHJcbiAgICAgICAgICAgIGg6IGgsXHJcbiAgICAgICAgICAgIHY6IHYsXHJcbiAgICAgICAgICAgIHF1YW50aXphdGlvbklkeDogcUlkLFxyXG4gICAgICAgICAgICBibG9ja3NQZXJDb2x1bW46IDAsXHJcbiAgICAgICAgICAgIGJsb2Nrc1BlckxpbmU6IDAsXHJcbiAgICAgICAgICAgIGJsb2NrczogW10sXHJcbiAgICAgICAgICAgIHByZWQ6IDAsXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgICAgb2Zmc2V0ICs9IDM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHByZXBhcmVDb21wb25lbnRzKGZyYW1lISk7XHJcbiAgICAgICAgZnJhbWVzLnB1c2goZnJhbWUpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICAgIGNhc2UgMHhGRkM0OiB7Ly8gREhUIChEZWZpbmUgSHVmZm1hbiBUYWJsZXMpXHJcbiAgICAgICAgY29uc3QgaHVmZm1hbkxlbmd0aCA9IHJlYWRVaW50MTYoKTtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDI7IGkgPCBodWZmbWFuTGVuZ3RoOykge1xyXG4gICAgICAgICAgY29uc3QgaHVmZm1hblRhYmxlU3BlYyA9IGRhdGFbb2Zmc2V0KytdO1xyXG4gICAgICAgICAgY29uc3QgY29kZUxlbmd0aHMgPSBuZXcgVWludDhBcnJheSgxNik7XHJcbiAgICAgICAgICBsZXQgY29kZUxlbmd0aFN1bSA9IDA7XHJcblxyXG4gICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCAxNjsgaisrLCBvZmZzZXQrKykge1xyXG4gICAgICAgICAgICBjb2RlTGVuZ3RoU3VtICs9IChjb2RlTGVuZ3Roc1tqXSA9IGRhdGFbb2Zmc2V0XSk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgcmVxdWVzdE1lbW9yeUFsbG9jYXRpb24oMTYgKyBjb2RlTGVuZ3RoU3VtKTtcclxuICAgICAgICAgIGNvbnN0IGh1ZmZtYW5WYWx1ZXMgPSBuZXcgVWludDhBcnJheShjb2RlTGVuZ3RoU3VtKTtcclxuXHJcbiAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGNvZGVMZW5ndGhTdW07IGorKywgb2Zmc2V0KyspIHtcclxuICAgICAgICAgICAgaHVmZm1hblZhbHVlc1tqXSA9IGRhdGFbb2Zmc2V0XTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpICs9IDE3ICsgY29kZUxlbmd0aFN1bTtcclxuXHJcbiAgICAgICAgICBjb25zdCBpbmRleCA9IGh1ZmZtYW5UYWJsZVNwZWMgJiAxNTtcclxuICAgICAgICAgIGNvbnN0IHRhYmxlID0gKGh1ZmZtYW5UYWJsZVNwZWMgPj4gNCkgPT09IDAgPyBodWZmbWFuVGFibGVzREMgOiBodWZmbWFuVGFibGVzQUM7XHJcbiAgICAgICAgICB0YWJsZVtpbmRleF0gPSBidWlsZEh1ZmZtYW5UYWJsZShjb2RlTGVuZ3RocywgaHVmZm1hblZhbHVlcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICAgIGNhc2UgMHhGRkREOiAvLyBEUkkgKERlZmluZSBSZXN0YXJ0IEludGVydmFsKVxyXG4gICAgICAgIHJlYWRVaW50MTYoKTsgLy8gc2tpcCBkYXRhIGxlbmd0aFxyXG4gICAgICAgIHJlc2V0SW50ZXJ2YWwgPSByZWFkVWludDE2KCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgMHhGRkRDOiAvLyBOdW1iZXIgb2YgTGluZXMgbWFya2VyXHJcbiAgICAgICAgcmVhZFVpbnQxNigpIC8vIHNraXAgZGF0YSBsZW5ndGhcclxuICAgICAgICByZWFkVWludDE2KCkgLy8gSWdub3JlIHRoaXMgZGF0YSBzaW5jZSBpdCByZXByZXNlbnRzIHRoZSBpbWFnZSBoZWlnaHRcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAweEZGREE6IHsgLy8gU09TIChTdGFydCBvZiBTY2FuKVxyXG4gICAgICAgIHJlYWRVaW50MTYoKTsgLy8gc2tpcCBkYXRhIGxlbmd0aFxyXG4gICAgICAgIGNvbnN0IHNlbGVjdG9yc0NvdW50ID0gZGF0YVtvZmZzZXQrK107XHJcbiAgICAgICAgY29uc3QgY29tcG9uZW50czogQ29tcG9uZW50W10gPSBbXTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNlbGVjdG9yc0NvdW50OyBpKyspIHtcclxuICAgICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IGZyYW1lIS5jb21wb25lbnRzW2RhdGFbb2Zmc2V0KytdXTtcclxuICAgICAgICAgIGNvbnN0IHRhYmxlU3BlYyA9IGRhdGFbb2Zmc2V0KytdO1xyXG4gICAgICAgICAgY29tcG9uZW50Lmh1ZmZtYW5UYWJsZURDID0gaHVmZm1hblRhYmxlc0RDW3RhYmxlU3BlYyA+PiA0XTtcclxuICAgICAgICAgIGNvbXBvbmVudC5odWZmbWFuVGFibGVBQyA9IGh1ZmZtYW5UYWJsZXNBQ1t0YWJsZVNwZWMgJiAxNV07XHJcbiAgICAgICAgICBjb21wb25lbnRzLnB1c2goY29tcG9uZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3Qgc3BlY3RyYWxTdGFydCA9IGRhdGFbb2Zmc2V0KytdO1xyXG4gICAgICAgIGNvbnN0IHNwZWN0cmFsRW5kID0gZGF0YVtvZmZzZXQrK107XHJcbiAgICAgICAgY29uc3Qgc3VjY2Vzc2l2ZUFwcHJveGltYXRpb24gPSBkYXRhW29mZnNldCsrXTtcclxuICAgICAgICBjb25zdCBwcm9jZXNzZWQgPSBkZWNvZGVTY2FuKFxyXG4gICAgICAgICAgZGF0YSwgb2Zmc2V0LCBmcmFtZSEsIGNvbXBvbmVudHMsIHJlc2V0SW50ZXJ2YWwsIHNwZWN0cmFsU3RhcnQsIHNwZWN0cmFsRW5kLFxyXG4gICAgICAgICAgc3VjY2Vzc2l2ZUFwcHJveGltYXRpb24gPj4gNCwgc3VjY2Vzc2l2ZUFwcHJveGltYXRpb24gJiAxNSk7XHJcbiAgICAgICAgb2Zmc2V0ICs9IHByb2Nlc3NlZDtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgICBjYXNlIDB4RkZGRjogLy8gRmlsbCBieXRlc1xyXG4gICAgICAgIGlmIChkYXRhW29mZnNldF0gIT09IDB4RkYpIHsgLy8gQXZvaWQgc2tpcHBpbmcgYSB2YWxpZCBtYXJrZXIuXHJcbiAgICAgICAgICBvZmZzZXQtLTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGRlZmF1bHQ6IHtcclxuICAgICAgICBpZiAoZGF0YVtvZmZzZXQgLSAzXSA9PSAweEZGICYmIGRhdGFbb2Zmc2V0IC0gMl0gPj0gMHhDMCAmJiBkYXRhW29mZnNldCAtIDJdIDw9IDB4RkUpIHtcclxuICAgICAgICAgIC8vIGNvdWxkIGJlIGluY29ycmVjdCBlbmNvZGluZyAtLSBsYXN0IDB4RkYgYnl0ZSBvZiB0aGUgcHJldmlvdXNcclxuICAgICAgICAgIC8vIGJsb2NrIHdhcyBlYXRlbiBieSB0aGUgZW5jb2RlclxyXG4gICAgICAgICAgb2Zmc2V0IC09IDM7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9IGVsc2UgaWYgKGZpbGVNYXJrZXIgPT09IDB4RTAgfHwgZmlsZU1hcmtlciA9PSAweEUxKSB7XHJcbiAgICAgICAgICAvLyBSZWNvdmVyIGZyb20gbWFsZm9ybWVkIEFQUDEgbWFya2VycyBwb3B1bGFyIGluIHNvbWUgcGhvbmUgbW9kZWxzLlxyXG4gICAgICAgICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9ldWdlbmV3YXJlL2pwZWctanMvaXNzdWVzLzgyXHJcbiAgICAgICAgICBpZiAobWFsZm9ybWVkRGF0YU9mZnNldCAhPT0gLTEpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBmaXJzdCB1bmtub3duIEpQRUcgbWFya2VyIGF0IG9mZnNldCAke21hbGZvcm1lZERhdGFPZmZzZXQudG9TdHJpbmcoMTYpfSwgc2Vjb25kIHVua25vd24gSlBFRyBtYXJrZXIgJHtmaWxlTWFya2VyLnRvU3RyaW5nKDE2KX0gYXQgb2Zmc2V0ICR7KG9mZnNldCAtIDEpLnRvU3RyaW5nKDE2KX1gKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIG1hbGZvcm1lZERhdGFPZmZzZXQgPSBvZmZzZXQgLSAxO1xyXG4gICAgICAgICAgY29uc3QgbmV4dE9mZnNldCA9IHJlYWRVaW50MTYoKTtcclxuICAgICAgICAgIGlmIChkYXRhW29mZnNldCArIG5leHRPZmZzZXQgLSAyXSA9PT0gMHhGRikge1xyXG4gICAgICAgICAgICBvZmZzZXQgKz0gbmV4dE9mZnNldCAtIDI7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bmtub3duIEpQRUcgbWFya2VyICcgKyBmaWxlTWFya2VyLnRvU3RyaW5nKDE2KSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBmaWxlTWFya2VyID0gcmVhZFVpbnQxNigpO1xyXG4gIH1cclxuXHJcbiAgaWYgKGZyYW1lcy5sZW5ndGggIT0gMSkgdGhyb3cgbmV3IEVycm9yKCdvbmx5IHNpbmdsZSBmcmFtZSBKUEVHcyBzdXBwb3J0ZWQnKTtcclxuXHJcbiAgLy8gc2V0IGVhY2ggZnJhbWUncyBjb21wb25lbnRzIHF1YW50aXphdGlvbiB0YWJsZVxyXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZnJhbWVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICBjb25zdCBjcCA9IGZyYW1lc1tpXS5jb21wb25lbnRzO1xyXG4gICAgZm9yIChsZXQgaiBpbiBjcCkgeyAvLyBUT0RPOiBkb24ndCB1c2UgYGluYFxyXG4gICAgICBjcFtqXS5xdWFudGl6YXRpb25UYWJsZSA9IHF1YW50aXphdGlvblRhYmxlc1tjcFtqXS5xdWFudGl6YXRpb25JZHghXTtcclxuICAgICAgZGVsZXRlIGNwW2pdLnF1YW50aXphdGlvbklkeDsgLy8gVE9ETzogd2h5ID8/P1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2VsZi53aWR0aCA9IGZyYW1lIS5zYW1wbGVzUGVyTGluZTtcclxuICBzZWxmLmhlaWdodCA9IGZyYW1lIS5zY2FuTGluZXM7XHJcbiAgc2VsZi5qZmlmID0gamZpZjtcclxuICBzZWxmLmFkb2JlID0gYWRvYmU7XHJcbiAgc2VsZi5jb21wb25lbnRzID0gW107XHJcblxyXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZnJhbWUhLmNvbXBvbmVudHNPcmRlci5sZW5ndGg7IGkrKykge1xyXG4gICAgY29uc3QgY29tcG9uZW50ID0gZnJhbWUhLmNvbXBvbmVudHNbZnJhbWUhLmNvbXBvbmVudHNPcmRlcltpXV07XHJcbiAgICBzZWxmLmNvbXBvbmVudHMucHVzaCh7XHJcbiAgICAgIGxpbmVzOiBidWlsZENvbXBvbmVudERhdGEoY29tcG9uZW50KSxcclxuICAgICAgc2NhbGVYOiBjb21wb25lbnQuaCAvIGZyYW1lIS5tYXhILFxyXG4gICAgICBzY2FsZVk6IGNvbXBvbmVudC52IC8gZnJhbWUhLm1heFZcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHNlbGY7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdldERhdGEoZGVjb2RlZDogRGVjb2RlZCkge1xyXG4gIGxldCBvZmZzZXQgPSAwO1xyXG4gIGxldCBjb2xvclRyYW5zZm9ybSA9IGZhbHNlO1xyXG5cclxuICBjb25zdCB3aWR0aCA9IGRlY29kZWQud2lkdGg7XHJcbiAgY29uc3QgaGVpZ2h0ID0gZGVjb2RlZC5oZWlnaHQ7XHJcbiAgY29uc3QgZGF0YUxlbmd0aCA9IHdpZHRoICogaGVpZ2h0ICogZGVjb2RlZC5jb21wb25lbnRzLmxlbmd0aDtcclxuICByZXF1ZXN0TWVtb3J5QWxsb2NhdGlvbihkYXRhTGVuZ3RoKTtcclxuICBjb25zdCBkYXRhID0gbmV3IFVpbnQ4QXJyYXkoZGF0YUxlbmd0aCk7XHJcblxyXG4gIHN3aXRjaCAoZGVjb2RlZC5jb21wb25lbnRzLmxlbmd0aCkge1xyXG4gICAgY2FzZSAxOiB7XHJcbiAgICAgIGNvbnN0IGNvbXBvbmVudDEgPSBkZWNvZGVkLmNvbXBvbmVudHNbMF07XHJcblxyXG4gICAgICBmb3IgKGxldCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7XHJcbiAgICAgICAgY29uc3QgY29tcG9uZW50MUxpbmUgPSBjb21wb25lbnQxLmxpbmVzWzAgfCAoeSAqIGNvbXBvbmVudDEuc2NhbGVZKV07XHJcblxyXG4gICAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgd2lkdGg7IHgrKykge1xyXG4gICAgICAgICAgY29uc3QgWSA9IGNvbXBvbmVudDFMaW5lWzAgfCAoeCAqIGNvbXBvbmVudDEuc2NhbGVYKV07XHJcbiAgICAgICAgICBkYXRhW29mZnNldCsrXSA9IFk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gICAgY2FzZSAyOiB7XHJcbiAgICAgIC8vIFBERiBtaWdodCBjb21wcmVzcyB0d28gY29tcG9uZW50IGRhdGEgaW4gY3VzdG9tIGNvbG9yc3BhY2VcclxuICAgICAgY29uc3QgY29tcG9uZW50MSA9IGRlY29kZWQuY29tcG9uZW50c1swXTtcclxuICAgICAgY29uc3QgY29tcG9uZW50MiA9IGRlY29kZWQuY29tcG9uZW50c1sxXTtcclxuXHJcbiAgICAgIGZvciAobGV0IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHtcclxuICAgICAgICBjb25zdCBjb21wb25lbnQxTGluZSA9IGNvbXBvbmVudDEubGluZXNbMCB8ICh5ICogY29tcG9uZW50MS5zY2FsZVkpXTtcclxuICAgICAgICBjb25zdCBjb21wb25lbnQyTGluZSA9IGNvbXBvbmVudDIubGluZXNbMCB8ICh5ICogY29tcG9uZW50Mi5zY2FsZVkpXTtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7XHJcbiAgICAgICAgICBjb25zdCBZMSA9IGNvbXBvbmVudDFMaW5lWzAgfCAoeCAqIGNvbXBvbmVudDEuc2NhbGVYKV07XHJcbiAgICAgICAgICBkYXRhW29mZnNldCsrXSA9IFkxO1xyXG4gICAgICAgICAgY29uc3QgWTIgPSBjb21wb25lbnQyTGluZVswIHwgKHggKiBjb21wb25lbnQyLnNjYWxlWCldO1xyXG4gICAgICAgICAgZGF0YVtvZmZzZXQrK10gPSBZMjtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgICBjYXNlIDM6IHtcclxuICAgICAgLy8gVGhlIGRlZmF1bHQgdHJhbnNmb3JtIGZvciB0aHJlZSBjb21wb25lbnRzIGlzIHRydWVcclxuICAgICAgY29sb3JUcmFuc2Zvcm0gPSB0cnVlO1xyXG4gICAgICAvLyBUaGUgYWRvYmUgdHJhbnNmb3JtIG1hcmtlciBvdmVycmlkZXMgYW55IHByZXZpb3VzIHNldHRpbmdcclxuICAgICAgaWYgKGRlY29kZWQuYWRvYmUgJiYgZGVjb2RlZC5hZG9iZS50cmFuc2Zvcm1Db2RlKSBjb2xvclRyYW5zZm9ybSA9IHRydWU7XHJcblxyXG4gICAgICBjb25zdCBjb21wb25lbnQxID0gZGVjb2RlZC5jb21wb25lbnRzWzBdO1xyXG4gICAgICBjb25zdCBjb21wb25lbnQyID0gZGVjb2RlZC5jb21wb25lbnRzWzFdO1xyXG4gICAgICBjb25zdCBjb21wb25lbnQzID0gZGVjb2RlZC5jb21wb25lbnRzWzJdO1xyXG5cclxuICAgICAgZm9yIChsZXQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykge1xyXG4gICAgICAgIGNvbnN0IGNvbXBvbmVudDFMaW5lID0gY29tcG9uZW50MS5saW5lc1swIHwgKHkgKiBjb21wb25lbnQxLnNjYWxlWSldO1xyXG4gICAgICAgIGNvbnN0IGNvbXBvbmVudDJMaW5lID0gY29tcG9uZW50Mi5saW5lc1swIHwgKHkgKiBjb21wb25lbnQyLnNjYWxlWSldO1xyXG4gICAgICAgIGNvbnN0IGNvbXBvbmVudDNMaW5lID0gY29tcG9uZW50My5saW5lc1swIHwgKHkgKiBjb21wb25lbnQzLnNjYWxlWSldO1xyXG5cclxuICAgICAgICBmb3IgKGxldCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHtcclxuICAgICAgICAgIGxldCBZLCBDYiwgQ3IsIFIsIEcsIEI7XHJcblxyXG4gICAgICAgICAgaWYgKCFjb2xvclRyYW5zZm9ybSkge1xyXG4gICAgICAgICAgICBSID0gY29tcG9uZW50MUxpbmVbMCB8ICh4ICogY29tcG9uZW50MS5zY2FsZVgpXTtcclxuICAgICAgICAgICAgRyA9IGNvbXBvbmVudDJMaW5lWzAgfCAoeCAqIGNvbXBvbmVudDIuc2NhbGVYKV07XHJcbiAgICAgICAgICAgIEIgPSBjb21wb25lbnQzTGluZVswIHwgKHggKiBjb21wb25lbnQzLnNjYWxlWCldO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgWSA9IGNvbXBvbmVudDFMaW5lWzAgfCAoeCAqIGNvbXBvbmVudDEuc2NhbGVYKV07XHJcbiAgICAgICAgICAgIENiID0gY29tcG9uZW50MkxpbmVbMCB8ICh4ICogY29tcG9uZW50Mi5zY2FsZVgpXTtcclxuICAgICAgICAgICAgQ3IgPSBjb21wb25lbnQzTGluZVswIHwgKHggKiBjb21wb25lbnQzLnNjYWxlWCldO1xyXG5cclxuICAgICAgICAgICAgUiA9IGNsYW1wVG84Yml0KFkgKyAxLjQwMiAqIChDciAtIDEyOCkpO1xyXG4gICAgICAgICAgICBHID0gY2xhbXBUbzhiaXQoWSAtIDAuMzQ0MTM2MyAqIChDYiAtIDEyOCkgLSAwLjcxNDEzNjM2ICogKENyIC0gMTI4KSk7XHJcbiAgICAgICAgICAgIEIgPSBjbGFtcFRvOGJpdChZICsgMS43NzIgKiAoQ2IgLSAxMjgpKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBkYXRhW29mZnNldCsrXSA9IFI7XHJcbiAgICAgICAgICBkYXRhW29mZnNldCsrXSA9IEc7XHJcbiAgICAgICAgICBkYXRhW29mZnNldCsrXSA9IEI7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gICAgY2FzZSA0OiB7XHJcbiAgICAgIGlmICghZGVjb2RlZC5hZG9iZSkgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCBjb2xvciBtb2RlICg0IGNvbXBvbmVudHMpJyk7XHJcbiAgICAgIC8vIFRoZSBkZWZhdWx0IHRyYW5zZm9ybSBmb3IgZm91ciBjb21wb25lbnRzIGlzIGZhbHNlXHJcbiAgICAgIGNvbG9yVHJhbnNmb3JtID0gZmFsc2U7XHJcbiAgICAgIC8vIFRoZSBhZG9iZSB0cmFuc2Zvcm0gbWFya2VyIG92ZXJyaWRlcyBhbnkgcHJldmlvdXMgc2V0dGluZ1xyXG4gICAgICBpZiAoZGVjb2RlZC5hZG9iZSAmJiBkZWNvZGVkLmFkb2JlLnRyYW5zZm9ybUNvZGUpIGNvbG9yVHJhbnNmb3JtID0gdHJ1ZTtcclxuXHJcbiAgICAgIGNvbnN0IGNvbXBvbmVudDEgPSBkZWNvZGVkLmNvbXBvbmVudHNbMF07XHJcbiAgICAgIGNvbnN0IGNvbXBvbmVudDIgPSBkZWNvZGVkLmNvbXBvbmVudHNbMV07XHJcbiAgICAgIGNvbnN0IGNvbXBvbmVudDMgPSBkZWNvZGVkLmNvbXBvbmVudHNbMl07XHJcbiAgICAgIGNvbnN0IGNvbXBvbmVudDQgPSBkZWNvZGVkLmNvbXBvbmVudHNbM107XHJcblxyXG4gICAgICBmb3IgKGxldCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7XHJcbiAgICAgICAgY29uc3QgY29tcG9uZW50MUxpbmUgPSBjb21wb25lbnQxLmxpbmVzWzAgfCAoeSAqIGNvbXBvbmVudDEuc2NhbGVZKV07XHJcbiAgICAgICAgY29uc3QgY29tcG9uZW50MkxpbmUgPSBjb21wb25lbnQyLmxpbmVzWzAgfCAoeSAqIGNvbXBvbmVudDIuc2NhbGVZKV07XHJcbiAgICAgICAgY29uc3QgY29tcG9uZW50M0xpbmUgPSBjb21wb25lbnQzLmxpbmVzWzAgfCAoeSAqIGNvbXBvbmVudDMuc2NhbGVZKV07XHJcbiAgICAgICAgY29uc3QgY29tcG9uZW50NExpbmUgPSBjb21wb25lbnQ0LmxpbmVzWzAgfCAoeSAqIGNvbXBvbmVudDQuc2NhbGVZKV07XHJcblxyXG4gICAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgd2lkdGg7IHgrKykge1xyXG4gICAgICAgICAgbGV0IFksIENiLCBDciwgSywgQywgTSwgWWU7XHJcblxyXG4gICAgICAgICAgaWYgKCFjb2xvclRyYW5zZm9ybSkge1xyXG4gICAgICAgICAgICBDID0gY29tcG9uZW50MUxpbmVbMCB8ICh4ICogY29tcG9uZW50MS5zY2FsZVgpXTtcclxuICAgICAgICAgICAgTSA9IGNvbXBvbmVudDJMaW5lWzAgfCAoeCAqIGNvbXBvbmVudDIuc2NhbGVYKV07XHJcbiAgICAgICAgICAgIFllID0gY29tcG9uZW50M0xpbmVbMCB8ICh4ICogY29tcG9uZW50My5zY2FsZVgpXTtcclxuICAgICAgICAgICAgSyA9IGNvbXBvbmVudDRMaW5lWzAgfCAoeCAqIGNvbXBvbmVudDQuc2NhbGVYKV07XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBZID0gY29tcG9uZW50MUxpbmVbMCB8ICh4ICogY29tcG9uZW50MS5zY2FsZVgpXTtcclxuICAgICAgICAgICAgQ2IgPSBjb21wb25lbnQyTGluZVswIHwgKHggKiBjb21wb25lbnQyLnNjYWxlWCldO1xyXG4gICAgICAgICAgICBDciA9IGNvbXBvbmVudDNMaW5lWzAgfCAoeCAqIGNvbXBvbmVudDMuc2NhbGVYKV07XHJcbiAgICAgICAgICAgIEsgPSBjb21wb25lbnQ0TGluZVswIHwgKHggKiBjb21wb25lbnQ0LnNjYWxlWCldO1xyXG5cclxuICAgICAgICAgICAgQyA9IDI1NSAtIGNsYW1wVG84Yml0KFkgKyAxLjQwMiAqIChDciAtIDEyOCkpO1xyXG4gICAgICAgICAgICBNID0gMjU1IC0gY2xhbXBUbzhiaXQoWSAtIDAuMzQ0MTM2MyAqIChDYiAtIDEyOCkgLSAwLjcxNDEzNjM2ICogKENyIC0gMTI4KSk7XHJcbiAgICAgICAgICAgIFllID0gMjU1IC0gY2xhbXBUbzhiaXQoWSArIDEuNzcyICogKENiIC0gMTI4KSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBkYXRhW29mZnNldCsrXSA9IDI1NSAtIEM7XHJcbiAgICAgICAgICBkYXRhW29mZnNldCsrXSA9IDI1NSAtIE07XHJcbiAgICAgICAgICBkYXRhW29mZnNldCsrXSA9IDI1NSAtIFllO1xyXG4gICAgICAgICAgZGF0YVtvZmZzZXQrK10gPSAyNTUgLSBLO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBicmVhaztcclxuICAgIH1cclxuICAgIGRlZmF1bHQ6XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgY29sb3IgbW9kZScpO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGRhdGE7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVKcGVnKGVuY29kZWQ6IFVpbnQ4QXJyYXksIGNyZWF0ZUltYWdlRGF0YTogKHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKSA9PiBJbWFnZURhdGEpIHtcclxuICB0b3RhbEJ5dGVzQWxsb2NhdGVkID0gMDtcclxuXHJcbiAgaWYgKGVuY29kZWQubGVuZ3RoID09PSAwKSB0aHJvdyBuZXcgRXJyb3IoJ0VtcHR5IGpwZWcgYnVmZmVyJyk7XHJcblxyXG4gIGNvbnN0IGRlY29kZWQgPSBwYXJzZShlbmNvZGVkKTtcclxuICByZXF1ZXN0TWVtb3J5QWxsb2NhdGlvbihkZWNvZGVkLndpZHRoICogZGVjb2RlZC5oZWlnaHQgKiA0KTtcclxuXHJcbiAgY29uc3QgZGF0YSA9IGdldERhdGEoZGVjb2RlZCk7XHJcblxyXG4gIGNvbnN0IGltYWdlRGF0YSA9IGNyZWF0ZUltYWdlRGF0YShkZWNvZGVkLndpZHRoLCBkZWNvZGVkLmhlaWdodCk7XHJcbiAgY29uc3Qgd2lkdGggPSBpbWFnZURhdGEud2lkdGg7XHJcbiAgY29uc3QgaGVpZ2h0ID0gaW1hZ2VEYXRhLmhlaWdodDtcclxuICBjb25zdCBpbWFnZURhdGFBcnJheSA9IGltYWdlRGF0YS5kYXRhO1xyXG5cclxuICBsZXQgaSA9IDA7XHJcbiAgbGV0IGogPSAwO1xyXG5cclxuICBzd2l0Y2ggKGRlY29kZWQuY29tcG9uZW50cy5sZW5ndGgpIHtcclxuICAgIGNhc2UgMTpcclxuICAgICAgZm9yIChsZXQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykge1xyXG4gICAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgd2lkdGg7IHgrKykge1xyXG4gICAgICAgICAgY29uc3QgWSA9IGRhdGFbaSsrXTtcclxuXHJcbiAgICAgICAgICBpbWFnZURhdGFBcnJheVtqKytdID0gWTtcclxuICAgICAgICAgIGltYWdlRGF0YUFycmF5W2orK10gPSBZO1xyXG4gICAgICAgICAgaW1hZ2VEYXRhQXJyYXlbaisrXSA9IFk7XHJcbiAgICAgICAgICBpbWFnZURhdGFBcnJheVtqKytdID0gMjU1O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBicmVhaztcclxuICAgIGNhc2UgMzpcclxuICAgICAgZm9yIChsZXQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykge1xyXG4gICAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgd2lkdGg7IHgrKykge1xyXG4gICAgICAgICAgY29uc3QgUiA9IGRhdGFbaSsrXTtcclxuICAgICAgICAgIGNvbnN0IEcgPSBkYXRhW2krK107XHJcbiAgICAgICAgICBjb25zdCBCID0gZGF0YVtpKytdO1xyXG5cclxuICAgICAgICAgIGltYWdlRGF0YUFycmF5W2orK10gPSBSO1xyXG4gICAgICAgICAgaW1hZ2VEYXRhQXJyYXlbaisrXSA9IEc7XHJcbiAgICAgICAgICBpbWFnZURhdGFBcnJheVtqKytdID0gQjtcclxuICAgICAgICAgIGltYWdlRGF0YUFycmF5W2orK10gPSAyNTU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGJyZWFrO1xyXG4gICAgY2FzZSA0OlxyXG4gICAgICBmb3IgKGxldCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7XHJcbiAgICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7XHJcbiAgICAgICAgICBjb25zdCBDID0gZGF0YVtpKytdO1xyXG4gICAgICAgICAgY29uc3QgTSA9IGRhdGFbaSsrXTtcclxuICAgICAgICAgIGNvbnN0IFkgPSBkYXRhW2krK107XHJcbiAgICAgICAgICBjb25zdCBLID0gZGF0YVtpKytdO1xyXG5cclxuICAgICAgICAgIGNvbnN0IFIgPSAyNTUgLSBjbGFtcFRvOGJpdChDICogKDEgLSBLIC8gMjU1KSArIEspO1xyXG4gICAgICAgICAgY29uc3QgRyA9IDI1NSAtIGNsYW1wVG84Yml0KE0gKiAoMSAtIEsgLyAyNTUpICsgSyk7XHJcbiAgICAgICAgICBjb25zdCBCID0gMjU1IC0gY2xhbXBUbzhiaXQoWSAqICgxIC0gSyAvIDI1NSkgKyBLKTtcclxuXHJcbiAgICAgICAgICBpbWFnZURhdGFBcnJheVtqKytdID0gUjtcclxuICAgICAgICAgIGltYWdlRGF0YUFycmF5W2orK10gPSBHO1xyXG4gICAgICAgICAgaW1hZ2VEYXRhQXJyYXlbaisrXSA9IEI7XHJcbiAgICAgICAgICBpbWFnZURhdGFBcnJheVtqKytdID0gMjU1O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBicmVhaztcclxuICAgIGRlZmF1bHQ6XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgY29sb3IgbW9kZScpO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGltYWdlRGF0YTtcclxufVxyXG4iXSwic291cmNlUm9vdCI6IkM6XFxQcm9qZWN0c1xcZ2l0aHViXFxhZy1wc2RcXHNyYyJ9
|