occam-languages 3.0.28 → 3.0.30
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/lib/context/file.js +7 -7
- package/lib/context/release.js +7 -7
- package/lib/context.js +3 -3
- package/lib/element.js +5 -5
- package/lib/pass/continuation.js +14 -14
- package/lib/pass/continuationZip.js +15 -15
- package/lib/utilities/breakPoint.js +4 -4
- package/lib/utilities/continuation.js +120 -94
- package/lib/utilities/verification.js +24 -21
- package/lib/utilities/verify.js +5 -5
- package/package.json +1 -1
- package/src/context/file.js +6 -6
- package/src/context/release.js +6 -6
- package/src/context.js +1 -1
- package/src/element.js +4 -4
- package/src/pass/continuation.js +17 -17
- package/src/pass/continuationZip.js +20 -20
- package/src/utilities/breakPoint.js +3 -3
- package/src/utilities/continuation.js +162 -118
- package/src/utilities/verification.js +24 -22
- package/src/utilities/verify.js +4 -4
|
@@ -73,205 +73,225 @@ _export(exports, {
|
|
|
73
73
|
const _necessary = require("necessary");
|
|
74
74
|
const { filter: arrayFilter } = _necessary.arrayUtilities;
|
|
75
75
|
function one(array, callback, ...initialArguments) {
|
|
76
|
-
const
|
|
76
|
+
const back = initialArguments.pop(), forward = initialArguments.pop(), length = array.length, index = 0;
|
|
77
77
|
function next(index, ...nextArguments) {
|
|
78
78
|
if (index === length) {
|
|
79
|
-
|
|
79
|
+
if (count !== 1) {
|
|
80
|
+
return back();
|
|
81
|
+
}
|
|
82
|
+
return forward(...nextArguments, back);
|
|
80
83
|
}
|
|
81
84
|
const element = array[index];
|
|
82
|
-
return callback(element, ...initialArguments, (
|
|
83
|
-
|
|
84
|
-
return back(exception);
|
|
85
|
-
}
|
|
86
|
-
return next(index + 1, ...nextArguments);
|
|
87
|
-
}, (...callbackArguments)=>{
|
|
85
|
+
return callback(element, ...initialArguments, (...forwardArguments)=>{
|
|
86
|
+
forwardArguments.pop(); ///
|
|
88
87
|
count++;
|
|
89
88
|
if (count === 2) {
|
|
90
89
|
return back();
|
|
91
90
|
}
|
|
92
|
-
return next(index + 1, ...
|
|
91
|
+
return next(index + 1, ...forwardArguments);
|
|
92
|
+
}, (...backArguments)=>{
|
|
93
|
+
const exception = backArguments.pop();
|
|
94
|
+
if (exception) {
|
|
95
|
+
return back(exception);
|
|
96
|
+
}
|
|
97
|
+
return next(index + 1, ...nextArguments);
|
|
93
98
|
}, index);
|
|
94
99
|
}
|
|
95
100
|
let count = 0;
|
|
96
101
|
return next(index, ...initialArguments);
|
|
97
102
|
}
|
|
98
103
|
function some(array, callback, ...initialArguments) {
|
|
99
|
-
const
|
|
104
|
+
const back = initialArguments.pop(), forward = initialArguments.pop(), length = array.length;
|
|
100
105
|
function next(index) {
|
|
101
106
|
if (index === length) {
|
|
102
107
|
return back();
|
|
103
108
|
}
|
|
104
109
|
const element = array[index];
|
|
105
|
-
return callback(element, ...initialArguments, (
|
|
106
|
-
|
|
110
|
+
return callback(element, ...initialArguments, forward, (...backArguments)=>{
|
|
111
|
+
const exception = backArguments.pop();
|
|
112
|
+
if (exception) {
|
|
107
113
|
return back(exception);
|
|
108
114
|
}
|
|
109
115
|
return next(index + 1);
|
|
110
|
-
},
|
|
116
|
+
}, index);
|
|
111
117
|
}
|
|
112
118
|
const index = 0;
|
|
113
119
|
return next(index);
|
|
114
120
|
}
|
|
115
121
|
function each(array, callback, ...initialArguments) {
|
|
116
|
-
const
|
|
122
|
+
const back = initialArguments.pop(), forward = initialArguments.pop(), length = array.length, index = 0;
|
|
117
123
|
function next(index, ...nextArguments) {
|
|
118
124
|
if (index === length) {
|
|
119
|
-
|
|
125
|
+
if (count === 0) {
|
|
126
|
+
return back();
|
|
127
|
+
}
|
|
128
|
+
return forward(...nextArguments, back);
|
|
120
129
|
}
|
|
121
130
|
const element = array[index];
|
|
122
|
-
return callback(element, ...nextArguments,
|
|
131
|
+
return callback(element, ...nextArguments, (...forwardArguments)=>{
|
|
132
|
+
forwardArguments.pop(); ///
|
|
123
133
|
count++;
|
|
124
|
-
return next(index + 1, ...
|
|
125
|
-
}, index);
|
|
134
|
+
return next(index + 1, ...forwardArguments);
|
|
135
|
+
}, back, index);
|
|
126
136
|
}
|
|
127
137
|
let count = 0;
|
|
128
138
|
return next(index, ...initialArguments);
|
|
129
139
|
}
|
|
130
140
|
function every(array, callback, ...initialArguments) {
|
|
131
|
-
const
|
|
141
|
+
const back = initialArguments.pop(), forward = initialArguments.pop(), length = array.length, index = 0;
|
|
132
142
|
function next(index, ...nextArguments) {
|
|
133
143
|
if (index === length) {
|
|
134
|
-
return forward(...nextArguments);
|
|
144
|
+
return forward(...nextArguments, back);
|
|
135
145
|
}
|
|
136
146
|
const element = array[index];
|
|
137
|
-
return callback(element, ...nextArguments,
|
|
138
|
-
|
|
139
|
-
|
|
147
|
+
return callback(element, ...nextArguments, (...forwardArguments)=>{
|
|
148
|
+
forwardArguments.pop(); ///
|
|
149
|
+
return next(index + 1, ...forwardArguments);
|
|
150
|
+
}, back, index);
|
|
140
151
|
}
|
|
141
152
|
return next(index, ...initialArguments);
|
|
142
153
|
}
|
|
143
154
|
function map(array, callback, ...initialArguments) {
|
|
144
|
-
const
|
|
155
|
+
const back = initialArguments.pop(), forward = initialArguments.pop(), length = array.length, index = 0;
|
|
145
156
|
function next(index, arrayB, ...nextArguments) {
|
|
146
157
|
if (index === length) {
|
|
147
|
-
return forward(arrayB, ...nextArguments);
|
|
158
|
+
return forward(arrayB, ...nextArguments, back);
|
|
148
159
|
}
|
|
149
160
|
const elementA = arrayA[index];
|
|
150
|
-
return callback(elementA, ...nextArguments,
|
|
161
|
+
return callback(elementA, ...nextArguments, (elementB, ...forwardArguments)=>{
|
|
162
|
+
forwardArguments.pop(); ///
|
|
151
163
|
arrayB = [
|
|
152
164
|
...arrayB,
|
|
153
165
|
elementB
|
|
154
166
|
];
|
|
155
|
-
return next(index + 1, arrayB, ...
|
|
156
|
-
}, index);
|
|
167
|
+
return next(index + 1, arrayB, ...forwardArguments);
|
|
168
|
+
}, back, index);
|
|
157
169
|
}
|
|
158
170
|
const arrayA = array, arrayB = [];
|
|
159
171
|
return next(index, arrayB, ...initialArguments);
|
|
160
172
|
}
|
|
161
173
|
function find(array, callback, ...initialArguments) {
|
|
162
|
-
const
|
|
174
|
+
const back = initialArguments.pop(), forward = initialArguments.pop(), length = array.length, index = 0;
|
|
163
175
|
function next(index, ...nextArguments) {
|
|
164
176
|
if (index === length) {
|
|
165
177
|
return back();
|
|
166
178
|
}
|
|
167
179
|
const element = array[index];
|
|
168
|
-
return callback(element, ...nextArguments, (
|
|
169
|
-
|
|
180
|
+
return callback(element, ...nextArguments, (...forwardArguments)=>{
|
|
181
|
+
forwardArguments.pop(); ///
|
|
182
|
+
return forward(element, ...forwardArguments, back);
|
|
183
|
+
}, (...backArguments)=>{
|
|
184
|
+
const exception = backArguments.pop();
|
|
185
|
+
if (exception) {
|
|
170
186
|
return back(exception);
|
|
171
187
|
}
|
|
172
188
|
return next(index + 1, ...nextArguments);
|
|
173
|
-
}, (...callbackArguments)=>{
|
|
174
|
-
return forward(element, ...callbackArguments);
|
|
175
189
|
}, index);
|
|
176
190
|
}
|
|
177
191
|
return next(index, ...initialArguments);
|
|
178
192
|
}
|
|
179
193
|
function reduce(array, initialValue, callback, ...initialArguments) {
|
|
180
|
-
const
|
|
194
|
+
const back = initialArguments.pop(), forward = initialArguments.pop(), length = array.length, index = 0;
|
|
181
195
|
function next(index, value, ...nextArguments) {
|
|
182
196
|
if (index === length) {
|
|
183
|
-
return forward(value, ...nextArguments);
|
|
197
|
+
return forward(value, ...nextArguments, back);
|
|
184
198
|
}
|
|
185
199
|
const element = array[index];
|
|
186
|
-
return callback(element, value, ...nextArguments,
|
|
187
|
-
|
|
188
|
-
|
|
200
|
+
return callback(element, value, ...nextArguments, (value, ...forwardArguments)=>{
|
|
201
|
+
forwardArguments.pop(); ///
|
|
202
|
+
return next(index + 1, value, ...forwardArguments);
|
|
203
|
+
}, back, index);
|
|
189
204
|
}
|
|
190
205
|
return next(index, initialValue, ...initialArguments);
|
|
191
206
|
}
|
|
192
207
|
function forEach(array, callback, ...initialArguments) {
|
|
193
|
-
const
|
|
208
|
+
const back = initialArguments.pop(), forward = initialArguments.pop(), length = array.length, index = 0;
|
|
194
209
|
function next(index, ...nextArguments) {
|
|
195
210
|
if (index === length) {
|
|
196
|
-
return forward(...nextArguments);
|
|
211
|
+
return forward(...nextArguments, back);
|
|
197
212
|
}
|
|
198
213
|
const element = array[index];
|
|
199
|
-
return callback(element, ...nextArguments,
|
|
200
|
-
|
|
201
|
-
|
|
214
|
+
return callback(element, ...nextArguments, (...forwardArguments)=>{
|
|
215
|
+
forwardArguments.pop(); ///
|
|
216
|
+
return next(index + 1, ...forwardArguments);
|
|
217
|
+
}, back, index);
|
|
202
218
|
}
|
|
203
219
|
return next(index, ...initialArguments);
|
|
204
220
|
}
|
|
205
221
|
function filter(array, callback, ...initialArguments) {
|
|
206
|
-
const
|
|
222
|
+
const back = initialArguments.pop(), forward = initialArguments.pop(), length = array.length, deletedElements = [], index = length - 1;
|
|
207
223
|
function next(index, ...nextArguments) {
|
|
208
224
|
if (index === -1) {
|
|
209
|
-
return forward(deletedElements, ...nextArguments);
|
|
225
|
+
return forward(deletedElements, ...nextArguments, back);
|
|
210
226
|
}
|
|
211
227
|
const element = array[index];
|
|
212
|
-
return callback(element, ...nextArguments,
|
|
228
|
+
return callback(element, ...nextArguments, (passed, ...forwardArguments)=>{
|
|
229
|
+
forwardArguments.pop(); ///
|
|
213
230
|
if (!passed) {
|
|
214
231
|
const startIndex = index, deleteCount = 1, deletedElement = element; ///
|
|
215
232
|
array.splice(startIndex, deleteCount);
|
|
216
233
|
deletedElements.unshift(deletedElement);
|
|
217
234
|
}
|
|
218
|
-
return next(index - 1, ...
|
|
219
|
-
}, index);
|
|
235
|
+
return next(index - 1, ...forwardArguments);
|
|
236
|
+
}, back, index);
|
|
220
237
|
}
|
|
221
238
|
return next(index, ...initialArguments);
|
|
222
239
|
}
|
|
223
240
|
function prune(array, callback, ...initialArguments) {
|
|
224
|
-
const
|
|
241
|
+
const back = initialArguments.pop(), forward = initialArguments.pop(), length = array.length, index = 0;
|
|
225
242
|
function next(index, ...nextArguments) {
|
|
226
243
|
if (index === length) {
|
|
227
244
|
const deletedElement = undefined;
|
|
228
|
-
return forward(deletedElement, ...nextArguments);
|
|
245
|
+
return forward(deletedElement, ...nextArguments, back);
|
|
229
246
|
}
|
|
230
247
|
const element = array[index];
|
|
231
|
-
return callback(element, ...nextArguments,
|
|
248
|
+
return callback(element, ...nextArguments, (passed, ...forwardArguments)=>{
|
|
249
|
+
forwardArguments.pop(); ///
|
|
232
250
|
if (!passed) {
|
|
233
251
|
const startIndex = index, deleteCount = 1, deletedElement = element; ///
|
|
234
252
|
array.splice(startIndex, deleteCount);
|
|
235
|
-
return forward(deletedElement, ...
|
|
253
|
+
return forward(deletedElement, ...forwardArguments, back);
|
|
236
254
|
}
|
|
237
|
-
return next(index + 1, ...
|
|
238
|
-
}, index);
|
|
255
|
+
return next(index + 1, ...forwardArguments);
|
|
256
|
+
}, back, index);
|
|
239
257
|
}
|
|
240
258
|
return next(index, ...initialArguments);
|
|
241
259
|
}
|
|
242
260
|
function extract(array, callback, ...initialArguments) {
|
|
243
|
-
const
|
|
261
|
+
const back = initialArguments.pop(), forward = initialArguments.pop(), length = array.length, index = 0;
|
|
244
262
|
function next(index, ...nextArguments) {
|
|
245
263
|
if (index === length) {
|
|
246
264
|
const deletedElement = undefined;
|
|
247
|
-
return forward(deletedElement, ...nextArguments);
|
|
265
|
+
return forward(deletedElement, ...nextArguments, back);
|
|
248
266
|
}
|
|
249
267
|
const element = array[index];
|
|
250
|
-
return callback(element, ...nextArguments,
|
|
268
|
+
return callback(element, ...nextArguments, (passed, ...forwardArguments)=>{
|
|
269
|
+
forwardArguments.pop(); ///
|
|
251
270
|
if (passed) {
|
|
252
271
|
const startIndex = index, deleteCount = 1, deletedElement = element; ///
|
|
253
272
|
array.splice(startIndex, deleteCount);
|
|
254
|
-
return forward(deletedElement, ...
|
|
273
|
+
return forward(deletedElement, ...forwardArguments, back);
|
|
255
274
|
}
|
|
256
|
-
return next(index + 1, ...
|
|
257
|
-
}, index);
|
|
275
|
+
return next(index + 1, ...forwardArguments);
|
|
276
|
+
}, back, index);
|
|
258
277
|
}
|
|
259
278
|
return next(index, ...initialArguments);
|
|
260
279
|
}
|
|
261
280
|
function match(arrayA, arrayB, callback, ...initialArguments) {
|
|
262
|
-
const
|
|
281
|
+
const back = initialArguments.pop(), forward = initialArguments.pop(), arrayALength = arrayA.length, arrayBLength = arrayB.length;
|
|
263
282
|
if (arrayALength !== arrayBLength) {
|
|
264
283
|
return back();
|
|
265
284
|
}
|
|
266
285
|
const length = arrayALength, index = 0;
|
|
267
286
|
function next(index, ...nextArguments) {
|
|
268
287
|
if (index === length) {
|
|
269
|
-
return forward(...nextArguments);
|
|
288
|
+
return forward(...nextArguments, back);
|
|
270
289
|
}
|
|
271
290
|
const elementA = arrayA[index], elementB = arrayB[index];
|
|
272
|
-
return callback(elementA, elementB, ...nextArguments,
|
|
273
|
-
|
|
274
|
-
|
|
291
|
+
return callback(elementA, elementB, ...nextArguments, (...forwardArguments)=>{
|
|
292
|
+
forwardArguments.pop(); ///
|
|
293
|
+
return next(index + 1, ...forwardArguments);
|
|
294
|
+
}, back, index);
|
|
275
295
|
}
|
|
276
296
|
return next(index, ...initialArguments);
|
|
277
297
|
}
|
|
@@ -279,11 +299,11 @@ function resolve(arrayA, arrayB, callback, ...initialArguments) {
|
|
|
279
299
|
arrayA = [
|
|
280
300
|
...arrayA
|
|
281
301
|
];
|
|
282
|
-
const
|
|
302
|
+
const back = initialArguments.pop(), forward = initialArguments.pop();
|
|
283
303
|
function nextPass(...nextPassArguments) {
|
|
284
304
|
const length = arrayA.length; ///
|
|
285
305
|
if (length === 0) {
|
|
286
|
-
return forward(...nextPassArguments);
|
|
306
|
+
return forward(...nextPassArguments, back);
|
|
287
307
|
}
|
|
288
308
|
function nextElement(index, success, ...nextElementArguments) {
|
|
289
309
|
if (index === length) {
|
|
@@ -299,15 +319,17 @@ function resolve(arrayA, arrayB, callback, ...initialArguments) {
|
|
|
299
319
|
return nextPass(...nextElementArguments);
|
|
300
320
|
}
|
|
301
321
|
const elementA = arrayA[index];
|
|
302
|
-
return callback(elementA, ...nextElementArguments, (
|
|
303
|
-
|
|
322
|
+
return callback(elementA, ...nextElementArguments, (...forwardArguments)=>{
|
|
323
|
+
forwardArguments.pop(); ///
|
|
324
|
+
const elementB = elementA; ///
|
|
325
|
+
arrayB.push(elementB);
|
|
326
|
+
return nextElement(index + 1, true, ...forwardArguments);
|
|
327
|
+
}, (...backArguments)=>{
|
|
328
|
+
const exception = backArguments.pop();
|
|
329
|
+
if (exception) {
|
|
304
330
|
return back(exception);
|
|
305
331
|
}
|
|
306
332
|
return nextElement(index + 1, success, ...nextElementArguments);
|
|
307
|
-
}, (...callbackArguments)=>{
|
|
308
|
-
const elementB = elementA; ///
|
|
309
|
-
arrayB.push(elementB);
|
|
310
|
-
return nextElement(index + 1, true, ...callbackArguments);
|
|
311
333
|
}, index);
|
|
312
334
|
}
|
|
313
335
|
const index = 0, success = false;
|
|
@@ -316,54 +338,58 @@ function resolve(arrayA, arrayB, callback, ...initialArguments) {
|
|
|
316
338
|
return nextPass(...initialArguments);
|
|
317
339
|
}
|
|
318
340
|
function forwardsEvery(array, callback, ...initialArguments) {
|
|
319
|
-
const
|
|
341
|
+
const back = initialArguments.pop(), forward = initialArguments.pop(), length = array.length, index = 0;
|
|
320
342
|
function next(index, ...nextArguments) {
|
|
321
343
|
if (index === length) {
|
|
322
|
-
return forward(...nextArguments);
|
|
344
|
+
return forward(...nextArguments, back);
|
|
323
345
|
}
|
|
324
346
|
const element = array[index];
|
|
325
|
-
return callback(element, ...nextArguments,
|
|
326
|
-
|
|
327
|
-
|
|
347
|
+
return callback(element, ...nextArguments, (...forwardArguments)=>{
|
|
348
|
+
forwardArguments.pop(); ///
|
|
349
|
+
return next(index + 1, ...forwardArguments);
|
|
350
|
+
}, back, index);
|
|
328
351
|
}
|
|
329
352
|
return next(index, ...initialArguments);
|
|
330
353
|
}
|
|
331
354
|
function backwardsEvery(array, callback, ...initialArguments) {
|
|
332
|
-
const
|
|
355
|
+
const back = initialArguments.pop(), forward = initialArguments.pop(), length = array.length, index = length - 1;
|
|
333
356
|
function next(index, ...nextArguments) {
|
|
334
357
|
if (index === -1) {
|
|
335
|
-
return forward(...nextArguments);
|
|
358
|
+
return forward(...nextArguments, back);
|
|
336
359
|
}
|
|
337
360
|
const element = array[index];
|
|
338
|
-
return callback(element, ...nextArguments,
|
|
339
|
-
|
|
340
|
-
|
|
361
|
+
return callback(element, ...nextArguments, (...forwardArguments)=>{
|
|
362
|
+
forwardArguments.pop(); ///
|
|
363
|
+
return next(index - 1, ...forwardArguments);
|
|
364
|
+
}, back, index);
|
|
341
365
|
}
|
|
342
366
|
return next(index, ...initialArguments);
|
|
343
367
|
}
|
|
344
368
|
function forwardsForEach(array, callback, ...initialArguments) {
|
|
345
|
-
const
|
|
369
|
+
const back = initialArguments.pop(), forward = initialArguments.pop(), length = array.length, index = 0;
|
|
346
370
|
function next(index, ...nextArguments) {
|
|
347
371
|
if (index === length) {
|
|
348
|
-
return forward(...nextArguments);
|
|
372
|
+
return forward(...nextArguments, back);
|
|
349
373
|
}
|
|
350
374
|
const element = array[index];
|
|
351
|
-
return callback(element, ...nextArguments,
|
|
352
|
-
|
|
353
|
-
|
|
375
|
+
return callback(element, ...nextArguments, (...forwardArguments)=>{
|
|
376
|
+
forwardArguments.pop(); ///
|
|
377
|
+
return next(index + 1, ...forwardArguments);
|
|
378
|
+
}, back, index);
|
|
354
379
|
}
|
|
355
380
|
return next(index, ...initialArguments);
|
|
356
381
|
}
|
|
357
382
|
function backwardsForEach(array, callback, ...initialArguments) {
|
|
358
|
-
const
|
|
383
|
+
const back = initialArguments.pop(), forward = initialArguments.pop(), length = array.length, index = length - 1;
|
|
359
384
|
function next(index, ...nextArguments) {
|
|
360
385
|
if (index === -1) {
|
|
361
|
-
return forward(...nextArguments);
|
|
386
|
+
return forward(...nextArguments, back);
|
|
362
387
|
}
|
|
363
388
|
const element = array[index];
|
|
364
|
-
return callback(element, ...nextArguments,
|
|
365
|
-
|
|
366
|
-
|
|
389
|
+
return callback(element, ...nextArguments, (...forwardArguments)=>{
|
|
390
|
+
forwardArguments.pop(); ///
|
|
391
|
+
return next(index - 1, ...forwardArguments);
|
|
392
|
+
}, back, index);
|
|
367
393
|
}
|
|
368
394
|
return next(index, ...initialArguments);
|
|
369
395
|
}
|
|
@@ -399,4 +425,4 @@ const _default = {
|
|
|
399
425
|
exists
|
|
400
426
|
};
|
|
401
427
|
|
|
402
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlsaXRpZXMvY29udGludWF0aW9uLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG5pbXBvcnQgeyBhcnJheVV0aWxpdGllcyB9IGZyb20gXCJuZWNlc3NhcnlcIjtcblxuY29uc3QgeyBmaWx0ZXI6IGFycmF5RmlsdGVyIH0gPSBhcnJheVV0aWxpdGllcztcblxuZXhwb3J0IGZ1bmN0aW9uIG9uZShhcnJheSwgY2FsbGJhY2ssIC4uLmluaXRpYWxBcmd1bWVudHMpIHtcbiAgY29uc3QgZm9yd2FyZCA9IGluaXRpYWxBcmd1bWVudHMucG9wKCksXG4gICAgICAgIGJhY2sgPSBpbml0aWFsQXJndW1lbnRzLnBvcCgpLFxuICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICAgIGluZGV4ID0gMDtcblxuICBmdW5jdGlvbiBuZXh0KGluZGV4LCAuLi5uZXh0QXJndW1lbnRzKSB7XG4gICAgaWYgKGluZGV4ID09PSBsZW5ndGgpIHtcbiAgICAgIHJldHVybiAoY291bnQgPT09IDEpID9cbiAgICAgICAgICAgICAgIGZvcndhcmQoLi4ubmV4dEFyZ3VtZW50cykgOlxuICAgICAgICAgICAgICAgICBiYWNrKCk7XG4gICAgfVxuXG4gICAgY29uc3QgZWxlbWVudCA9IGFycmF5W2luZGV4XTtcblxuICAgIHJldHVybiBjYWxsYmFjayhcbiAgICAgIGVsZW1lbnQsXG4gICAgICAuLi5pbml0aWFsQXJndW1lbnRzLFxuICAgICAgKGV4Y2VwdGlvbiA9IG51bGwpID0+IHtcbiAgICAgICAgaWYgKGV4Y2VwdGlvbiAhPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBiYWNrKGV4Y2VwdGlvbik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV4dChpbmRleCArIDEsIC4uLm5leHRBcmd1bWVudHMpO1xuICAgICAgfSxcbiAgICAgICguLi5jYWxsYmFja0FyZ3VtZW50cykgPT4ge1xuICAgICAgICBjb3VudCsrO1xuXG4gICAgICAgIGlmIChjb3VudCA9PT0gMikge1xuICAgICAgICAgIHJldHVybiBiYWNrKCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV4dChpbmRleCArIDEsIC4uLmNhbGxiYWNrQXJndW1lbnRzKTtcbiAgICAgIH0sXG4gICAgICBpbmRleFxuICAgICk7XG4gIH1cblxuICBsZXQgY291bnQgPSAwO1xuXG4gIHJldHVybiBuZXh0KGluZGV4LCAuLi5pbml0aWFsQXJndW1lbnRzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNvbWUoYXJyYXksIGNhbGxiYWNrLCAuLi5pbml0aWFsQXJndW1lbnRzKSB7XG4gIGNvbnN0IGZvcndhcmQgPSBpbml0aWFsQXJndW1lbnRzLnBvcCgpLFxuICAgICAgICBiYWNrID0gaW5pdGlhbEFyZ3VtZW50cy5wb3AoKSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gIGZ1bmN0aW9uIG5leHQoaW5kZXgpIHtcbiAgICBpZiAoaW5kZXggPT09IGxlbmd0aCkge1xuICAgICAgcmV0dXJuIGJhY2soKTtcbiAgICB9XG5cbiAgICBjb25zdCBlbGVtZW50ID0gYXJyYXlbaW5kZXhdO1xuXG4gICAgcmV0dXJuIGNhbGxiYWNrKFxuICAgICAgZWxlbWVudCxcbiAgICAgIC4uLmluaXRpYWxBcmd1bWVudHMsXG4gICAgICAoZXhjZXB0aW9uID0gbnVsbCkgPT4ge1xuICAgICAgICBpZiAoZXhjZXB0aW9uICE9PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIGJhY2soZXhjZXB0aW9uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXh0KGluZGV4ICsgMSk7XG4gICAgICB9LFxuICAgICAgZm9yd2FyZCxcbiAgICAgIGluZGV4XG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IGluZGV4ID0gMDtcblxuICByZXR1cm4gbmV4dChpbmRleCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlYWNoKGFycmF5LCBjYWxsYmFjaywgLi4uaW5pdGlhbEFyZ3VtZW50cykge1xuICBjb25zdCBmb3J3YXJkID0gaW5pdGlhbEFyZ3VtZW50cy5wb3AoKSxcbiAgICAgICAgYmFjayA9IGluaXRpYWxBcmd1bWVudHMucG9wKCksXG4gICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgaW5kZXggPSAwO1xuXG4gIGZ1bmN0aW9uIG5leHQoaW5kZXgsIC4uLm5leHRBcmd1bWVudHMpIHtcbiAgICBpZiAoaW5kZXggPT09IGxlbmd0aCkge1xuICAgICAgcmV0dXJuIChjb3VudCAhPT0gMCkgP1xuICAgICAgICAgICAgICAgZm9yd2FyZCguLi5uZXh0QXJndW1lbnRzKSA6XG4gICAgICAgICAgICAgICAgIGJhY2soKTtcbiAgICB9XG5cbiAgICBjb25zdCBlbGVtZW50ID0gYXJyYXlbaW5kZXhdO1xuXG4gICAgcmV0dXJuIGNhbGxiYWNrKFxuICAgICAgZWxlbWVudCxcbiAgICAgIC4uLm5leHRBcmd1bWVudHMsXG4gICAgICBiYWNrLFxuICAgICAgKC4uLmNhbGxiYWNrQXJndW1lbnRzKSA9PiB7XG4gICAgICAgIGNvdW50Kys7XG5cbiAgICAgICAgcmV0dXJuIG5leHQoaW5kZXggKyAxLCAuLi5jYWxsYmFja0FyZ3VtZW50cyk7XG4gICAgICB9LFxuICAgICAgaW5kZXhcbiAgICApO1xuICB9XG5cbiAgbGV0IGNvdW50ID0gMDtcblxuICByZXR1cm4gbmV4dChpbmRleCwgLi4uaW5pdGlhbEFyZ3VtZW50cyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBldmVyeShhcnJheSwgY2FsbGJhY2ssIC4uLmluaXRpYWxBcmd1bWVudHMpIHtcbiAgY29uc3QgZm9yd2FyZCA9IGluaXRpYWxBcmd1bWVudHMucG9wKCksXG4gICAgICAgIGJhY2sgPSBpbml0aWFsQXJndW1lbnRzLnBvcCgpLFxuICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICAgIGluZGV4ID0gMDtcblxuICBmdW5jdGlvbiBuZXh0KGluZGV4LCAuLi5uZXh0QXJndW1lbnRzKSB7XG4gICAgaWYgKGluZGV4ID09PSBsZW5ndGgpIHtcbiAgICAgIHJldHVybiBmb3J3YXJkKC4uLm5leHRBcmd1bWVudHMpO1xuICAgIH1cblxuICAgIGNvbnN0IGVsZW1lbnQgPSBhcnJheVtpbmRleF07XG5cbiAgICByZXR1cm4gY2FsbGJhY2soXG4gICAgICBlbGVtZW50LFxuICAgICAgLi4ubmV4dEFyZ3VtZW50cyxcbiAgICAgIGJhY2ssXG4gICAgICAoLi4uY2FsbGJhY2tBcmd1bWVudHMpID0+IHtcbiAgICAgICAgcmV0dXJuIG5leHQoaW5kZXggKyAxLCAuLi5jYWxsYmFja0FyZ3VtZW50cyk7XG4gICAgICB9LFxuICAgICAgaW5kZXhcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIG5leHQoaW5kZXgsIC4uLmluaXRpYWxBcmd1bWVudHMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWFwKGFycmF5LCBjYWxsYmFjaywgLi4uaW5pdGlhbEFyZ3VtZW50cykge1xuICBjb25zdCBmb3J3YXJkID0gaW5pdGlhbEFyZ3VtZW50cy5wb3AoKSxcbiAgICAgICAgYmFjayA9IGluaXRpYWxBcmd1bWVudHMucG9wKCksXG4gICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgaW5kZXggPSAwO1xuXG4gIGZ1bmN0aW9uIG5leHQoaW5kZXgsIGFycmF5QiwgLi4ubmV4dEFyZ3VtZW50cykge1xuICAgIGlmIChpbmRleCA9PT0gbGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZm9yd2FyZChhcnJheUIsIC4uLm5leHRBcmd1bWVudHMpO1xuICAgIH1cblxuICAgIGNvbnN0IGVsZW1lbnRBID0gYXJyYXlBW2luZGV4XTtcblxuICAgIHJldHVybiBjYWxsYmFjayhcbiAgICAgIGVsZW1lbnRBLFxuICAgICAgLi4ubmV4dEFyZ3VtZW50cyxcbiAgICAgIGJhY2ssXG4gICAgICAoZWxlbWVudEIsIC4uLmNhbGxiYWNrQXJndW1lbnRzKSA9PiB7XG4gICAgICAgIGFycmF5QiA9IFsgIC8vL1xuICAgICAgICAgIC4uLmFycmF5QixcbiAgICAgICAgICBlbGVtZW50QlxuICAgICAgICBdO1xuXG4gICAgICAgIHJldHVybiBuZXh0KGluZGV4ICsgMSwgYXJyYXlCLCAuLi5jYWxsYmFja0FyZ3VtZW50cyk7XG4gICAgICB9LFxuICAgICAgaW5kZXhcbiAgICApO1xuICB9XG5cbiAgY29uc3QgYXJyYXlBID0gYXJyYXksIC8vL1xuICAgICAgICBhcnJheUIgPSBbXTtcblxuICByZXR1cm4gbmV4dChpbmRleCwgYXJyYXlCLCAuLi5pbml0aWFsQXJndW1lbnRzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmQoYXJyYXksIGNhbGxiYWNrLCAuLi5pbml0aWFsQXJndW1lbnRzKSB7XG4gIGNvbnN0IGZvcndhcmQgPSBpbml0aWFsQXJndW1lbnRzLnBvcCgpLFxuICAgICAgICBiYWNrID0gaW5pdGlhbEFyZ3VtZW50cy5wb3AoKSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgICBpbmRleCA9IDA7XG5cbiAgZnVuY3Rpb24gbmV4dChpbmRleCwgLi4ubmV4dEFyZ3VtZW50cykge1xuICAgIGlmIChpbmRleCA9PT0gbGVuZ3RoKSB7XG4gICAgICByZXR1cm4gYmFjaygpO1xuICAgIH1cblxuICAgIGNvbnN0IGVsZW1lbnQgPSBhcnJheVtpbmRleF07XG5cbiAgICByZXR1cm4gY2FsbGJhY2soXG4gICAgICBlbGVtZW50LFxuICAgICAgLi4ubmV4dEFyZ3VtZW50cyxcbiAgICAgIChleGNlcHRpb24gPSBudWxsKSA9PiB7XG4gICAgICAgIGlmIChleGNlcHRpb24gIT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gYmFjayhleGNlcHRpb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5leHQoaW5kZXggKyAxLCAuLi5uZXh0QXJndW1lbnRzKTtcbiAgICAgIH0sXG4gICAgICAoLi4uY2FsbGJhY2tBcmd1bWVudHMpID0+IHtcbiAgICAgICAgcmV0dXJuIGZvcndhcmQoZWxlbWVudCwgLi4uY2FsbGJhY2tBcmd1bWVudHMpO1xuICAgICAgfSxcbiAgICAgIGluZGV4XG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBuZXh0KGluZGV4LCAuLi5pbml0aWFsQXJndW1lbnRzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlZHVjZShhcnJheSwgaW5pdGlhbFZhbHVlLCBjYWxsYmFjaywgLi4uaW5pdGlhbEFyZ3VtZW50cykge1xuICBjb25zdCBmb3J3YXJkID0gaW5pdGlhbEFyZ3VtZW50cy5wb3AoKSxcbiAgICAgICAgYmFjayA9IGluaXRpYWxBcmd1bWVudHMucG9wKCksXG4gICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgaW5kZXggPSAwO1xuXG4gIGZ1bmN0aW9uIG5leHQoaW5kZXgsIHZhbHVlLCAuLi5uZXh0QXJndW1lbnRzKSB7XG4gICAgaWYgKGluZGV4ID09PSBsZW5ndGgpIHtcbiAgICAgIHJldHVybiBmb3J3YXJkKHZhbHVlLCAuLi5uZXh0QXJndW1lbnRzKTtcbiAgICB9XG5cbiAgICBjb25zdCBlbGVtZW50ID0gYXJyYXlbaW5kZXhdO1xuXG4gICAgcmV0dXJuIGNhbGxiYWNrKFxuICAgICAgZWxlbWVudCxcbiAgICAgIHZhbHVlLFxuICAgICAgLi4ubmV4dEFyZ3VtZW50cyxcbiAgICAgIGJhY2ssXG4gICAgICAodmFsdWUsIC4uLmNhbGxiYWNrQXJndW1lbnRzKSA9PiB7XG4gICAgICAgIHJldHVybiBuZXh0KGluZGV4ICsgMSwgdmFsdWUsIC4uLmNhbGxiYWNrQXJndW1lbnRzKTtcbiAgICAgIH0sXG4gICAgICBpbmRleFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gbmV4dChpbmRleCwgaW5pdGlhbFZhbHVlLCAuLi5pbml0aWFsQXJndW1lbnRzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZvckVhY2goYXJyYXksIGNhbGxiYWNrLCAuLi5pbml0aWFsQXJndW1lbnRzKSB7XG4gIGNvbnN0IGZvcndhcmQgPSBpbml0aWFsQXJndW1lbnRzLnBvcCgpLFxuICAgICAgICBiYWNrID0gaW5pdGlhbEFyZ3VtZW50cy5wb3AoKSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgICBpbmRleCA9IDA7XG5cbiAgZnVuY3Rpb24gbmV4dChpbmRleCwgLi4ubmV4dEFyZ3VtZW50cykge1xuICAgIGlmIChpbmRleCA9PT0gbGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZm9yd2FyZCguLi5uZXh0QXJndW1lbnRzKTtcbiAgICB9XG5cbiAgICBjb25zdCBlbGVtZW50ID0gYXJyYXlbaW5kZXhdO1xuXG4gICAgcmV0dXJuIGNhbGxiYWNrKFxuICAgICAgZWxlbWVudCxcbiAgICAgIC4uLm5leHRBcmd1bWVudHMsXG4gICAgICBiYWNrLFxuICAgICAgKC4uLmNhbGxiYWNrQXJndW1lbnRzKSA9PiB7XG4gICAgICAgIHJldHVybiBuZXh0KGluZGV4ICsgMSwgLi4uY2FsbGJhY2tBcmd1bWVudHMpO1xuICAgICAgfSxcbiAgICAgIGluZGV4XG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBuZXh0KGluZGV4LCAuLi5pbml0aWFsQXJndW1lbnRzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbHRlcihhcnJheSwgY2FsbGJhY2ssIC4uLmluaXRpYWxBcmd1bWVudHMpIHtcbiAgY29uc3QgZm9yd2FyZCA9IGluaXRpYWxBcmd1bWVudHMucG9wKCksXG4gICAgICAgIGJhY2sgPSBpbml0aWFsQXJndW1lbnRzLnBvcCgpLFxuICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICAgIGRlbGV0ZWRFbGVtZW50cyA9IFtdLFxuICAgICAgICBpbmRleCA9IGxlbmd0aCAtIDE7XG5cbiAgZnVuY3Rpb24gbmV4dChpbmRleCwgLi4ubmV4dEFyZ3VtZW50cykge1xuICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgIHJldHVybiBmb3J3YXJkKGRlbGV0ZWRFbGVtZW50cywgLi4ubmV4dEFyZ3VtZW50cyk7XG4gICAgfVxuXG4gICAgY29uc3QgZWxlbWVudCA9IGFycmF5W2luZGV4XTtcblxuICAgIHJldHVybiBjYWxsYmFjayhcbiAgICAgIGVsZW1lbnQsXG4gICAgICAuLi5uZXh0QXJndW1lbnRzLFxuICAgICAgYmFjayxcbiAgICAgIChwYXNzZWQsIC4uLmNhbGxiYWNrQXJndW1lbnRzKSA9PiB7XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgY29uc3Qgc3RhcnRJbmRleCA9IGluZGV4LCAvLy9cbiAgICAgICAgICAgICAgICBkZWxldGVDb3VudCA9IDEsXG4gICAgICAgICAgICAgICAgZGVsZXRlZEVsZW1lbnQgPSBlbGVtZW50OyAvLy9cblxuICAgICAgICAgIGFycmF5LnNwbGljZShzdGFydEluZGV4LCBkZWxldGVDb3VudCk7XG5cbiAgICAgICAgICBkZWxldGVkRWxlbWVudHMudW5zaGlmdChkZWxldGVkRWxlbWVudCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV4dChpbmRleCAtIDEsIC4uLmNhbGxiYWNrQXJndW1lbnRzKTtcbiAgICAgIH0sXG4gICAgICBpbmRleFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gbmV4dChpbmRleCwgLi4uaW5pdGlhbEFyZ3VtZW50cyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcnVuZShhcnJheSwgY2FsbGJhY2ssIC4uLmluaXRpYWxBcmd1bWVudHMpIHtcbiAgY29uc3QgZm9yd2FyZCA9IGluaXRpYWxBcmd1bWVudHMucG9wKCksXG4gICAgICAgIGJhY2sgPSBpbml0aWFsQXJndW1lbnRzLnBvcCgpLFxuICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICAgIGluZGV4ID0gMDtcblxuICBmdW5jdGlvbiBuZXh0KGluZGV4LCAuLi5uZXh0QXJndW1lbnRzKSB7XG4gICAgaWYgKGluZGV4ID09PSBsZW5ndGgpIHtcbiAgICAgIGNvbnN0IGRlbGV0ZWRFbGVtZW50ID0gdW5kZWZpbmVkO1xuXG4gICAgICByZXR1cm4gZm9yd2FyZChkZWxldGVkRWxlbWVudCwgLi4ubmV4dEFyZ3VtZW50cyk7XG4gICAgfVxuXG4gICAgY29uc3QgZWxlbWVudCA9IGFycmF5W2luZGV4XTtcblxuICAgIHJldHVybiBjYWxsYmFjayhcbiAgICAgIGVsZW1lbnQsXG4gICAgICAuLi5uZXh0QXJndW1lbnRzLFxuICAgICAgYmFjayxcbiAgICAgIChwYXNzZWQsIC4uLmNhbGxiYWNrQXJndW1lbnRzKSA9PiB7XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgY29uc3Qgc3RhcnRJbmRleCA9IGluZGV4LCAvLy9cbiAgICAgICAgICAgICAgICBkZWxldGVDb3VudCA9IDEsXG4gICAgICAgICAgICAgICAgZGVsZXRlZEVsZW1lbnQgPSBlbGVtZW50OyAvLy9cblxuICAgICAgICAgIGFycmF5LnNwbGljZShzdGFydEluZGV4LCBkZWxldGVDb3VudCk7XG5cbiAgICAgICAgICByZXR1cm4gZm9yd2FyZChkZWxldGVkRWxlbWVudCwgLi4uY2FsbGJhY2tBcmd1bWVudHMpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5leHQoaW5kZXggKyAxLCAuLi5jYWxsYmFja0FyZ3VtZW50cyk7XG4gICAgICB9LFxuICAgICAgaW5kZXhcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIG5leHQoaW5kZXgsIC4uLmluaXRpYWxBcmd1bWVudHMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdChhcnJheSwgY2FsbGJhY2ssIC4uLmluaXRpYWxBcmd1bWVudHMpIHtcbiAgY29uc3QgZm9yd2FyZCA9IGluaXRpYWxBcmd1bWVudHMucG9wKCksXG4gICAgICAgIGJhY2sgPSBpbml0aWFsQXJndW1lbnRzLnBvcCgpLFxuICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICAgIGluZGV4ID0gMDtcblxuICBmdW5jdGlvbiBuZXh0KGluZGV4LCAuLi5uZXh0QXJndW1lbnRzKSB7XG4gICAgaWYgKGluZGV4ID09PSBsZW5ndGgpIHtcbiAgICAgIGNvbnN0IGRlbGV0ZWRFbGVtZW50ID0gdW5kZWZpbmVkO1xuXG4gICAgICByZXR1cm4gZm9yd2FyZChkZWxldGVkRWxlbWVudCwgLi4ubmV4dEFyZ3VtZW50cyk7XG4gICAgfVxuXG4gICAgY29uc3QgZWxlbWVudCA9IGFycmF5W2luZGV4XTtcblxuICAgIHJldHVybiBjYWxsYmFjayhcbiAgICAgIGVsZW1lbnQsXG4gICAgICAuLi5uZXh0QXJndW1lbnRzLFxuICAgICAgYmFjayxcbiAgICAgIChwYXNzZWQsIC4uLmNhbGxiYWNrQXJndW1lbnRzKSA9PiB7XG4gICAgICAgIGlmIChwYXNzZWQpIHtcbiAgICAgICAgICBjb25zdCBzdGFydEluZGV4ID0gaW5kZXgsIC8vL1xuICAgICAgICAgICAgICAgIGRlbGV0ZUNvdW50ID0gMSxcbiAgICAgICAgICAgICAgICBkZWxldGVkRWxlbWVudCA9IGVsZW1lbnQ7IC8vL1xuXG4gICAgICAgICAgYXJyYXkuc3BsaWNlKHN0YXJ0SW5kZXgsIGRlbGV0ZUNvdW50KTtcblxuICAgICAgICAgIHJldHVybiBmb3J3YXJkKGRlbGV0ZWRFbGVtZW50LCAuLi5jYWxsYmFja0FyZ3VtZW50cyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV4dChpbmRleCArIDEsIC4uLmNhbGxiYWNrQXJndW1lbnRzKTtcbiAgICAgIH0sXG4gICAgICBpbmRleFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gbmV4dChpbmRleCwgLi4uaW5pdGlhbEFyZ3VtZW50cyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtYXRjaChhcnJheUEsIGFycmF5QiwgY2FsbGJhY2ssIC4uLmluaXRpYWxBcmd1bWVudHMpIHtcbiAgY29uc3QgZm9yd2FyZCA9IGluaXRpYWxBcmd1bWVudHMucG9wKCksXG4gICAgICAgIGJhY2sgPSBpbml0aWFsQXJndW1lbnRzLnBvcCgpLFxuICAgICAgICBhcnJheUFMZW5ndGggPSBhcnJheUEubGVuZ3RoLFxuICAgICAgICBhcnJheUJMZW5ndGggPSBhcnJheUIubGVuZ3RoO1xuXG4gIGlmIChhcnJheUFMZW5ndGggIT09IGFycmF5Qkxlbmd0aCkge1xuICAgIHJldHVybiBiYWNrKCk7XG4gIH1cblxuICBjb25zdCBsZW5ndGggPSBhcnJheUFMZW5ndGgsICAvLy9cbiAgICAgICAgaW5kZXggPSAwO1xuXG4gIGZ1bmN0aW9uIG5leHQoaW5kZXgsIC4uLm5leHRBcmd1bWVudHMpIHtcbiAgICBpZiAoaW5kZXggPT09IGxlbmd0aCkge1xuICAgICAgcmV0dXJuIGZvcndhcmQoLi4ubmV4dEFyZ3VtZW50cyk7XG4gICAgfVxuXG4gICAgY29uc3QgZWxlbWVudEEgPSBhcnJheUFbaW5kZXhdLFxuICAgICAgICAgIGVsZW1lbnRCID0gYXJyYXlCW2luZGV4XTtcblxuICAgIHJldHVybiBjYWxsYmFjayhcbiAgICAgIGVsZW1lbnRBLFxuICAgICAgZWxlbWVudEIsXG4gICAgICAuLi5uZXh0QXJndW1lbnRzLFxuICAgICAgYmFjayxcbiAgICAgICguLi5jYWxsYmFja0FyZ3VtZW50cykgPT4ge1xuICAgICAgICByZXR1cm4gbmV4dChpbmRleCArIDEsIC4uLmNhbGxiYWNrQXJndW1lbnRzKTtcbiAgICAgIH0sXG4gICAgICBpbmRleFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gbmV4dChpbmRleCwgLi4uaW5pdGlhbEFyZ3VtZW50cyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlKGFycmF5QSwgYXJyYXlCLCBjYWxsYmFjaywgLi4uaW5pdGlhbEFyZ3VtZW50cykge1xuICBhcnJheUEgPSBbICAvLy9cbiAgICAuLi5hcnJheUFcbiAgXTtcblxuICBjb25zdCBmb3J3YXJkID0gaW5pdGlhbEFyZ3VtZW50cy5wb3AoKSxcbiAgICAgICAgYmFjayA9IGluaXRpYWxBcmd1bWVudHMucG9wKCk7XG5cbiAgZnVuY3Rpb24gbmV4dFBhc3MoLi4ubmV4dFBhc3NBcmd1bWVudHMpIHtcbiAgICBjb25zdCBsZW5ndGggPSBhcnJheUEubGVuZ3RoOyAvLy9cblxuICAgIGlmIChsZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBmb3J3YXJkKC4uLm5leHRQYXNzQXJndW1lbnRzKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBuZXh0RWxlbWVudChpbmRleCwgc3VjY2VzcywgLi4ubmV4dEVsZW1lbnRBcmd1bWVudHMpIHtcbiAgICAgIGlmIChpbmRleCA9PT0gbGVuZ3RoKSB7XG4gICAgICAgIGlmICghc3VjY2Vzcykge1xuICAgICAgICAgIHJldHVybiBiYWNrKCk7XG4gICAgICAgIH1cblxuICAgICAgICBhcnJheUZpbHRlcihhcnJheUEsIChlbGVtZW50QSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGFycmF5QkluY2x1ZGVzRWxlbWVudEEgPSBhcnJheUIuaW5jbHVkZXMoZWxlbWVudEEpO1xuXG4gICAgICAgICAgaWYgKCFhcnJheUJJbmNsdWRlc0VsZW1lbnRBKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBuZXh0UGFzcyguLi5uZXh0RWxlbWVudEFyZ3VtZW50cyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVsZW1lbnRBID0gYXJyYXlBW2luZGV4XTtcblxuICAgICAgcmV0dXJuIGNhbGxiYWNrKFxuICAgICAgICBlbGVtZW50QSxcbiAgICAgICAgLi4ubmV4dEVsZW1lbnRBcmd1bWVudHMsXG4gICAgICAgIChleGNlcHRpb24gPSBudWxsKSA9PiB7XG4gICAgICAgICAgaWYgKGV4Y2VwdGlvbiAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGJhY2soZXhjZXB0aW9uKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gbmV4dEVsZW1lbnQoaW5kZXggKyAxLCBzdWNjZXNzLCAuLi5uZXh0RWxlbWVudEFyZ3VtZW50cyk7XG4gICAgICAgIH0sXG4gICAgICAgICguLi5jYWxsYmFja0FyZ3VtZW50cykgPT4ge1xuICAgICAgICAgIGNvbnN0IGVsZW1lbnRCID0gZWxlbWVudEE7ICAvLy9cblxuICAgICAgICAgIGFycmF5Qi5wdXNoKGVsZW1lbnRCKTtcblxuICAgICAgICAgIHJldHVybiBuZXh0RWxlbWVudChpbmRleCArIDEsIHRydWUsIC4uLmNhbGxiYWNrQXJndW1lbnRzKTtcbiAgICAgICAgfSxcbiAgICAgICAgaW5kZXhcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgaW5kZXggPSAwLFxuICAgICAgICAgIHN1Y2Nlc3MgPSBmYWxzZTtcblxuICAgIHJldHVybiBuZXh0RWxlbWVudChpbmRleCwgc3VjY2VzcywgLi4ubmV4dFBhc3NBcmd1bWVudHMpO1xuICB9XG5cbiAgcmV0dXJuIG5leHRQYXNzKC4uLmluaXRpYWxBcmd1bWVudHMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZm9yd2FyZHNFdmVyeShhcnJheSwgY2FsbGJhY2ssIC4uLmluaXRpYWxBcmd1bWVudHMpIHtcbiAgY29uc3QgZm9yd2FyZCA9IGluaXRpYWxBcmd1bWVudHMucG9wKCksXG4gICAgICAgIGJhY2sgPSBpbml0aWFsQXJndW1lbnRzLnBvcCgpLFxuICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICAgIGluZGV4ID0gMDtcblxuICBmdW5jdGlvbiBuZXh0KGluZGV4LCAuLi5uZXh0QXJndW1lbnRzKSB7XG4gICAgaWYgKGluZGV4ID09PSBsZW5ndGgpIHtcbiAgICAgIHJldHVybiBmb3J3YXJkKC4uLm5leHRBcmd1bWVudHMpO1xuICAgIH1cblxuICAgIGNvbnN0IGVsZW1lbnQgPSBhcnJheVtpbmRleF07XG5cbiAgICByZXR1cm4gY2FsbGJhY2soXG4gICAgICBlbGVtZW50LFxuICAgICAgLi4ubmV4dEFyZ3VtZW50cyxcbiAgICAgIGJhY2ssXG4gICAgICAoLi4uY2FsbGJhY2tBcmd1bWVudHMpID0+IHtcbiAgICAgICAgcmV0dXJuIG5leHQoaW5kZXggKyAxLCAuLi5jYWxsYmFja0FyZ3VtZW50cyk7XG4gICAgICB9LFxuICAgICAgaW5kZXhcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIG5leHQoaW5kZXgsIC4uLmluaXRpYWxBcmd1bWVudHMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYmFja3dhcmRzRXZlcnkoYXJyYXksIGNhbGxiYWNrLCAuLi5pbml0aWFsQXJndW1lbnRzKSB7XG4gIGNvbnN0IGZvcndhcmQgPSBpbml0aWFsQXJndW1lbnRzLnBvcCgpLFxuICAgICAgICBiYWNrID0gaW5pdGlhbEFyZ3VtZW50cy5wb3AoKSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgICBpbmRleCA9IGxlbmd0aCAtIDE7XG5cbiAgZnVuY3Rpb24gbmV4dChpbmRleCwgLi4ubmV4dEFyZ3VtZW50cykge1xuICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgIHJldHVybiBmb3J3YXJkKC4uLm5leHRBcmd1bWVudHMpO1xuICAgIH1cblxuICAgIGNvbnN0IGVsZW1lbnQgPSBhcnJheVtpbmRleF07XG5cbiAgICByZXR1cm4gY2FsbGJhY2soXG4gICAgICBlbGVtZW50LFxuICAgICAgLi4ubmV4dEFyZ3VtZW50cyxcbiAgICAgIGJhY2ssXG4gICAgICAoLi4uY2FsbGJhY2tBcmd1bWVudHMpID0+IHtcbiAgICAgICAgcmV0dXJuIG5leHQoaW5kZXggLSAxLCAuLi5jYWxsYmFja0FyZ3VtZW50cyk7XG4gICAgICB9LFxuICAgICAgaW5kZXhcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIG5leHQoaW5kZXgsIC4uLmluaXRpYWxBcmd1bWVudHMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZm9yd2FyZHNGb3JFYWNoKGFycmF5LCBjYWxsYmFjaywgLi4uaW5pdGlhbEFyZ3VtZW50cykge1xuICBjb25zdCBmb3J3YXJkID0gaW5pdGlhbEFyZ3VtZW50cy5wb3AoKSxcbiAgICAgICAgYmFjayA9IGluaXRpYWxBcmd1bWVudHMucG9wKCksXG4gICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgaW5kZXggPSAwO1xuXG4gIGZ1bmN0aW9uIG5leHQoaW5kZXgsIC4uLm5leHRBcmd1bWVudHMpIHtcbiAgICBpZiAoaW5kZXggPT09IGxlbmd0aCkge1xuICAgICAgcmV0dXJuIGZvcndhcmQoLi4ubmV4dEFyZ3VtZW50cyk7XG4gICAgfVxuXG4gICAgY29uc3QgZWxlbWVudCA9IGFycmF5W2luZGV4XTtcblxuICAgIHJldHVybiBjYWxsYmFjayhcbiAgICAgIGVsZW1lbnQsXG4gICAgICAuLi5uZXh0QXJndW1lbnRzLFxuICAgICAgYmFjayxcbiAgICAgICguLi5jYWxsYmFja0FyZ3VtZW50cykgPT4ge1xuICAgICAgICByZXR1cm4gbmV4dChpbmRleCArIDEsIC4uLmNhbGxiYWNrQXJndW1lbnRzKTtcbiAgICAgIH0sXG4gICAgICBpbmRleFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gbmV4dChpbmRleCwgLi4uaW5pdGlhbEFyZ3VtZW50cyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBiYWNrd2FyZHNGb3JFYWNoKGFycmF5LCBjYWxsYmFjaywgLi4uaW5pdGlhbEFyZ3VtZW50cykge1xuICBjb25zdCBmb3J3YXJkID0gaW5pdGlhbEFyZ3VtZW50cy5wb3AoKSxcbiAgICAgICAgYmFjayA9IGluaXRpYWxBcmd1bWVudHMucG9wKCksXG4gICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgaW5kZXggPSBsZW5ndGggLSAxO1xuXG4gIGZ1bmN0aW9uIG5leHQoaW5kZXgsIC4uLm5leHRBcmd1bWVudHMpIHtcbiAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICByZXR1cm4gZm9yd2FyZCguLi5uZXh0QXJndW1lbnRzKTtcbiAgICB9XG5cbiAgICBjb25zdCBlbGVtZW50ID0gYXJyYXlbaW5kZXhdO1xuXG4gICAgcmV0dXJuIGNhbGxiYWNrKFxuICAgICAgZWxlbWVudCxcbiAgICAgIC4uLm5leHRBcmd1bWVudHMsXG4gICAgICBiYWNrLFxuICAgICAgKC4uLmNhbGxiYWNrQXJndW1lbnRzKSA9PiB7XG4gICAgICAgIHJldHVybiBuZXh0KGluZGV4IC0gMSwgLi4uY2FsbGJhY2tBcmd1bWVudHMpO1xuICAgICAgfSxcbiAgICAgIGluZGV4XG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBuZXh0KGluZGV4LCAuLi5pbml0aWFsQXJndW1lbnRzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFsbChjYWxsYmFja3MsIC4uLmluaXRpYWxBcmd1bWVudHMpIHtcbiAgcmV0dXJuIGV2ZXJ5KGNhbGxiYWNrcywgKGNhbGxiYWNrLCAuLi5jYWxsYmFja0FyZ3VtZW50cykgPT4ge1xuICAgIHJldHVybiBjYWxsYmFjayguLi5jYWxsYmFja0FyZ3VtZW50cyk7XG4gIH0sIC4uLmluaXRpYWxBcmd1bWVudHMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXhpc3RzKGNhbGxiYWNrcywgLi4uaW5pdGlhbEFyZ3VtZW50cykge1xuICByZXR1cm4gc29tZShjYWxsYmFja3MsIChjYWxsYmFjaywgLi4uY2FsbGJhY2tBcmd1bWVudHMpID0+IHtcbiAgICByZXR1cm4gY2FsbGJhY2soLi4uY2FsbGJhY2tBcmd1bWVudHMpO1xuICB9LCAuLi5pbml0aWFsQXJndW1lbnRzKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICBvbmUsXG4gIHNvbWUsXG4gIGVhY2gsXG4gIGV2ZXJ5LFxuICBtYXAsXG4gIGZpbmQsXG4gIHJlZHVjZSxcbiAgZm9yRWFjaCxcbiAgZmlsdGVyLFxuICBwcnVuZSxcbiAgZXh0cmFjdCxcbiAgbWF0Y2gsXG4gIHJlc29sdmUsXG4gIGZvcndhcmRzRXZlcnksXG4gIGJhY2t3YXJkc0V2ZXJ5LFxuICBmb3J3YXJkc0ZvckVhY2gsXG4gIGJhY2t3YXJkc0ZvckVhY2gsXG4gIGFsbCxcbiAgZXhpc3RzXG59O1xuIl0sIm5hbWVzIjpbImFsbCIsImJhY2t3YXJkc0V2ZXJ5IiwiYmFja3dhcmRzRm9yRWFjaCIsImVhY2giLCJldmVyeSIsImV4aXN0cyIsImV4dHJhY3QiLCJmaWx0ZXIiLCJmaW5kIiwiZm9yRWFjaCIsImZvcndhcmRzRXZlcnkiLCJmb3J3YXJkc0ZvckVhY2giLCJtYXAiLCJtYXRjaCIsIm9uZSIsInBydW5lIiwicmVkdWNlIiwicmVzb2x2ZSIsInNvbWUiLCJhcnJheUZpbHRlciIsImFycmF5VXRpbGl0aWVzIiwiYXJyYXkiLCJjYWxsYmFjayIsImluaXRpYWxBcmd1bWVudHMiLCJmb3J3YXJkIiwicG9wIiwiYmFjayIsImxlbmd0aCIsImluZGV4IiwibmV4dCIsIm5leHRBcmd1bWVudHMiLCJjb3VudCIsImVsZW1lbnQiLCJleGNlcHRpb24iLCJjYWxsYmFja0FyZ3VtZW50cyIsImFycmF5QiIsImVsZW1lbnRBIiwiYXJyYXlBIiwiZWxlbWVudEIiLCJpbml0aWFsVmFsdWUiLCJ2YWx1ZSIsImRlbGV0ZWRFbGVtZW50cyIsInBhc3NlZCIsInN0YXJ0SW5kZXgiLCJkZWxldGVDb3VudCIsImRlbGV0ZWRFbGVtZW50Iiwic3BsaWNlIiwidW5zaGlmdCIsInVuZGVmaW5lZCIsImFycmF5QUxlbmd0aCIsImFycmF5Qkxlbmd0aCIsIm5leHRQYXNzIiwibmV4dFBhc3NBcmd1bWVudHMiLCJuZXh0RWxlbWVudCIsInN1Y2Nlc3MiLCJuZXh0RWxlbWVudEFyZ3VtZW50cyIsImFycmF5QkluY2x1ZGVzRWxlbWVudEEiLCJpbmNsdWRlcyIsInB1c2giLCJjYWxsYmFja3MiXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7OztRQTRrQmdCQTtlQUFBQTs7UUFqRkFDO2VBQUFBOztRQXNEQUM7ZUFBQUE7O1FBdUNoQjtlQUFBOztRQXZnQmdCQztlQUFBQTs7UUFpQ0FDO2VBQUFBOztRQWdlQUM7ZUFBQUE7O1FBN1BBQztlQUFBQTs7UUE3RUFDO2VBQUFBOztRQXhGQUM7ZUFBQUE7O1FBNkRBQztlQUFBQTs7UUFtUEFDO2VBQUFBOztRQXNEQUM7ZUFBQUE7O1FBellBQztlQUFBQTs7UUErT0FDO2VBQUFBOztRQXRYQUM7ZUFBQUE7O1FBd1NBQztlQUFBQTs7UUE3RkFDO2VBQUFBOztRQStNQUM7ZUFBQUE7O1FBL1dBQztlQUFBQTs7OzJCQS9DZTtBQUUvQixNQUFNLEVBQUVYLFFBQVFZLFdBQVcsRUFBRSxHQUFHQyx5QkFBYztBQUV2QyxTQUFTTixJQUFJTyxLQUFLLEVBQUVDLFFBQVEsRUFBRSxHQUFHQyxnQkFBZ0I7SUFDdEQsTUFBTUMsVUFBVUQsaUJBQWlCRSxHQUFHLElBQzlCQyxPQUFPSCxpQkFBaUJFLEdBQUcsSUFDM0JFLFNBQVNOLE1BQU1NLE1BQU0sRUFDckJDLFFBQVE7SUFFZCxTQUFTQyxLQUFLRCxLQUFLLEVBQUUsR0FBR0UsYUFBYTtRQUNuQyxJQUFJRixVQUFVRCxRQUFRO1lBQ3BCLE9BQU8sQUFBQ0ksVUFBVSxJQUNUUCxXQUFXTSxpQkFDVEo7UUFDYjtRQUVBLE1BQU1NLFVBQVVYLEtBQUssQ0FBQ08sTUFBTTtRQUU1QixPQUFPTixTQUNMVSxZQUNHVCxrQkFDSCxDQUFDVSxZQUFZLElBQUk7WUFDZixJQUFJQSxjQUFjLE1BQU07Z0JBQ3RCLE9BQU9QLEtBQUtPO1lBQ2Q7WUFFQSxPQUFPSixLQUFLRCxRQUFRLE1BQU1FO1FBQzVCLEdBQ0EsQ0FBQyxHQUFHSTtZQUNGSDtZQUVBLElBQUlBLFVBQVUsR0FBRztnQkFDZixPQUFPTDtZQUNUO1lBRUEsT0FBT0csS0FBS0QsUUFBUSxNQUFNTTtRQUM1QixHQUNBTjtJQUVKO0lBRUEsSUFBSUcsUUFBUTtJQUVaLE9BQU9GLEtBQUtELFVBQVVMO0FBQ3hCO0FBRU8sU0FBU0wsS0FBS0csS0FBSyxFQUFFQyxRQUFRLEVBQUUsR0FBR0MsZ0JBQWdCO0lBQ3ZELE1BQU1DLFVBQVVELGlCQUFpQkUsR0FBRyxJQUM5QkMsT0FBT0gsaUJBQWlCRSxHQUFHLElBQzNCRSxTQUFTTixNQUFNTSxNQUFNO0lBRTNCLFNBQVNFLEtBQUtELEtBQUs7UUFDakIsSUFBSUEsVUFBVUQsUUFBUTtZQUNwQixPQUFPRDtRQUNUO1FBRUEsTUFBTU0sVUFBVVgsS0FBSyxDQUFDTyxNQUFNO1FBRTVCLE9BQU9OLFNBQ0xVLFlBQ0dULGtCQUNILENBQUNVLFlBQVksSUFBSTtZQUNmLElBQUlBLGNBQWMsTUFBTTtnQkFDdEIsT0FBT1AsS0FBS087WUFDZDtZQUVBLE9BQU9KLEtBQUtELFFBQVE7UUFDdEIsR0FDQUosU0FDQUk7SUFFSjtJQUVBLE1BQU1BLFFBQVE7SUFFZCxPQUFPQyxLQUFLRDtBQUNkO0FBRU8sU0FBU3pCLEtBQUtrQixLQUFLLEVBQUVDLFFBQVEsRUFBRSxHQUFHQyxnQkFBZ0I7SUFDdkQsTUFBTUMsVUFBVUQsaUJBQWlCRSxHQUFHLElBQzlCQyxPQUFPSCxpQkFBaUJFLEdBQUcsSUFDM0JFLFNBQVNOLE1BQU1NLE1BQU0sRUFDckJDLFFBQVE7SUFFZCxTQUFTQyxLQUFLRCxLQUFLLEVBQUUsR0FBR0UsYUFBYTtRQUNuQyxJQUFJRixVQUFVRCxRQUFRO1lBQ3BCLE9BQU8sQUFBQ0ksVUFBVSxJQUNUUCxXQUFXTSxpQkFDVEo7UUFDYjtRQUVBLE1BQU1NLFVBQVVYLEtBQUssQ0FBQ08sTUFBTTtRQUU1QixPQUFPTixTQUNMVSxZQUNHRixlQUNISixNQUNBLENBQUMsR0FBR1E7WUFDRkg7WUFFQSxPQUFPRixLQUFLRCxRQUFRLE1BQU1NO1FBQzVCLEdBQ0FOO0lBRUo7SUFFQSxJQUFJRyxRQUFRO0lBRVosT0FBT0YsS0FBS0QsVUFBVUw7QUFDeEI7QUFFTyxTQUFTbkIsTUFBTWlCLEtBQUssRUFBRUMsUUFBUSxFQUFFLEdBQUdDLGdCQUFnQjtJQUN4RCxNQUFNQyxVQUFVRCxpQkFBaUJFLEdBQUcsSUFDOUJDLE9BQU9ILGlCQUFpQkUsR0FBRyxJQUMzQkUsU0FBU04sTUFBTU0sTUFBTSxFQUNyQkMsUUFBUTtJQUVkLFNBQVNDLEtBQUtELEtBQUssRUFBRSxHQUFHRSxhQUFhO1FBQ25DLElBQUlGLFVBQVVELFFBQVE7WUFDcEIsT0FBT0gsV0FBV007UUFDcEI7UUFFQSxNQUFNRSxVQUFVWCxLQUFLLENBQUNPLE1BQU07UUFFNUIsT0FBT04sU0FDTFUsWUFDR0YsZUFDSEosTUFDQSxDQUFDLEdBQUdRO1lBQ0YsT0FBT0wsS0FBS0QsUUFBUSxNQUFNTTtRQUM1QixHQUNBTjtJQUVKO0lBRUEsT0FBT0MsS0FBS0QsVUFBVUw7QUFDeEI7QUFFTyxTQUFTWCxJQUFJUyxLQUFLLEVBQUVDLFFBQVEsRUFBRSxHQUFHQyxnQkFBZ0I7SUFDdEQsTUFBTUMsVUFBVUQsaUJBQWlCRSxHQUFHLElBQzlCQyxPQUFPSCxpQkFBaUJFLEdBQUcsSUFDM0JFLFNBQVNOLE1BQU1NLE1BQU0sRUFDckJDLFFBQVE7SUFFZCxTQUFTQyxLQUFLRCxLQUFLLEVBQUVPLE1BQU0sRUFBRSxHQUFHTCxhQUFhO1FBQzNDLElBQUlGLFVBQVVELFFBQVE7WUFDcEIsT0FBT0gsUUFBUVcsV0FBV0w7UUFDNUI7UUFFQSxNQUFNTSxXQUFXQyxNQUFNLENBQUNULE1BQU07UUFFOUIsT0FBT04sU0FDTGMsYUFDR04sZUFDSEosTUFDQSxDQUFDWSxVQUFVLEdBQUdKO1lBQ1pDLFNBQVM7bUJBQ0pBO2dCQUNIRzthQUNEO1lBRUQsT0FBT1QsS0FBS0QsUUFBUSxHQUFHTyxXQUFXRDtRQUNwQyxHQUNBTjtJQUVKO0lBRUEsTUFBTVMsU0FBU2hCLE9BQ1RjLFNBQVMsRUFBRTtJQUVqQixPQUFPTixLQUFLRCxPQUFPTyxXQUFXWjtBQUNoQztBQUVPLFNBQVNmLEtBQUthLEtBQUssRUFBRUMsUUFBUSxFQUFFLEdBQUdDLGdCQUFnQjtJQUN2RCxNQUFNQyxVQUFVRCxpQkFBaUJFLEdBQUcsSUFDOUJDLE9BQU9ILGlCQUFpQkUsR0FBRyxJQUMzQkUsU0FBU04sTUFBTU0sTUFBTSxFQUNyQkMsUUFBUTtJQUVkLFNBQVNDLEtBQUtELEtBQUssRUFBRSxHQUFHRSxhQUFhO1FBQ25DLElBQUlGLFVBQVVELFFBQVE7WUFDcEIsT0FBT0Q7UUFDVDtRQUVBLE1BQU1NLFVBQVVYLEtBQUssQ0FBQ08sTUFBTTtRQUU1QixPQUFPTixTQUNMVSxZQUNHRixlQUNILENBQUNHLFlBQVksSUFBSTtZQUNmLElBQUlBLGNBQWMsTUFBTTtnQkFDdEIsT0FBT1AsS0FBS087WUFDZDtZQUVBLE9BQU9KLEtBQUtELFFBQVEsTUFBTUU7UUFDNUIsR0FDQSxDQUFDLEdBQUdJO1lBQ0YsT0FBT1YsUUFBUVEsWUFBWUU7UUFDN0IsR0FDQU47SUFFSjtJQUVBLE9BQU9DLEtBQUtELFVBQVVMO0FBQ3hCO0FBRU8sU0FBU1AsT0FBT0ssS0FBSyxFQUFFa0IsWUFBWSxFQUFFakIsUUFBUSxFQUFFLEdBQUdDLGdCQUFnQjtJQUN2RSxNQUFNQyxVQUFVRCxpQkFBaUJFLEdBQUcsSUFDOUJDLE9BQU9ILGlCQUFpQkUsR0FBRyxJQUMzQkUsU0FBU04sTUFBTU0sTUFBTSxFQUNyQkMsUUFBUTtJQUVkLFNBQVNDLEtBQUtELEtBQUssRUFBRVksS0FBSyxFQUFFLEdBQUdWLGFBQWE7UUFDMUMsSUFBSUYsVUFBVUQsUUFBUTtZQUNwQixPQUFPSCxRQUFRZ0IsVUFBVVY7UUFDM0I7UUFFQSxNQUFNRSxVQUFVWCxLQUFLLENBQUNPLE1BQU07UUFFNUIsT0FBT04sU0FDTFUsU0FDQVEsVUFDR1YsZUFDSEosTUFDQSxDQUFDYyxPQUFPLEdBQUdOO1lBQ1QsT0FBT0wsS0FBS0QsUUFBUSxHQUFHWSxVQUFVTjtRQUNuQyxHQUNBTjtJQUVKO0lBRUEsT0FBT0MsS0FBS0QsT0FBT1csaUJBQWlCaEI7QUFDdEM7QUFFTyxTQUFTZCxRQUFRWSxLQUFLLEVBQUVDLFFBQVEsRUFBRSxHQUFHQyxnQkFBZ0I7SUFDMUQsTUFBTUMsVUFBVUQsaUJBQWlCRSxHQUFHLElBQzlCQyxPQUFPSCxpQkFBaUJFLEdBQUcsSUFDM0JFLFNBQVNOLE1BQU1NLE1BQU0sRUFDckJDLFFBQVE7SUFFZCxTQUFTQyxLQUFLRCxLQUFLLEVBQUUsR0FBR0UsYUFBYTtRQUNuQyxJQUFJRixVQUFVRCxRQUFRO1lBQ3BCLE9BQU9ILFdBQVdNO1FBQ3BCO1FBRUEsTUFBTUUsVUFBVVgsS0FBSyxDQUFDTyxNQUFNO1FBRTVCLE9BQU9OLFNBQ0xVLFlBQ0dGLGVBQ0hKLE1BQ0EsQ0FBQyxHQUFHUTtZQUNGLE9BQU9MLEtBQUtELFFBQVEsTUFBTU07UUFDNUIsR0FDQU47SUFFSjtJQUVBLE9BQU9DLEtBQUtELFVBQVVMO0FBQ3hCO0FBRU8sU0FBU2hCLE9BQU9jLEtBQUssRUFBRUMsUUFBUSxFQUFFLEdBQUdDLGdCQUFnQjtJQUN6RCxNQUFNQyxVQUFVRCxpQkFBaUJFLEdBQUcsSUFDOUJDLE9BQU9ILGlCQUFpQkUsR0FBRyxJQUMzQkUsU0FBU04sTUFBTU0sTUFBTSxFQUNyQmMsa0JBQWtCLEVBQUUsRUFDcEJiLFFBQVFELFNBQVM7SUFFdkIsU0FBU0UsS0FBS0QsS0FBSyxFQUFFLEdBQUdFLGFBQWE7UUFDbkMsSUFBSUYsVUFBVSxDQUFDLEdBQUc7WUFDaEIsT0FBT0osUUFBUWlCLG9CQUFvQlg7UUFDckM7UUFFQSxNQUFNRSxVQUFVWCxLQUFLLENBQUNPLE1BQU07UUFFNUIsT0FBT04sU0FDTFUsWUFDR0YsZUFDSEosTUFDQSxDQUFDZ0IsUUFBUSxHQUFHUjtZQUNWLElBQUksQ0FBQ1EsUUFBUTtnQkFDWCxNQUFNQyxhQUFhZixPQUNiZ0IsY0FBYyxHQUNkQyxpQkFBaUJiLFNBQVMsR0FBRztnQkFFbkNYLE1BQU15QixNQUFNLENBQUNILFlBQVlDO2dCQUV6QkgsZ0JBQWdCTSxPQUFPLENBQUNGO1lBQzFCO1lBRUEsT0FBT2hCLEtBQUtELFFBQVEsTUFBTU07UUFDNUIsR0FDQU47SUFFSjtJQUVBLE9BQU9DLEtBQUtELFVBQVVMO0FBQ3hCO0FBRU8sU0FBU1IsTUFBTU0sS0FBSyxFQUFFQyxRQUFRLEVBQUUsR0FBR0MsZ0JBQWdCO0lBQ3hELE1BQU1DLFVBQVVELGlCQUFpQkUsR0FBRyxJQUM5QkMsT0FBT0gsaUJBQWlCRSxHQUFHLElBQzNCRSxTQUFTTixNQUFNTSxNQUFNLEVBQ3JCQyxRQUFRO0lBRWQsU0FBU0MsS0FBS0QsS0FBSyxFQUFFLEdBQUdFLGFBQWE7UUFDbkMsSUFBSUYsVUFBVUQsUUFBUTtZQUNwQixNQUFNa0IsaUJBQWlCRztZQUV2QixPQUFPeEIsUUFBUXFCLG1CQUFtQmY7UUFDcEM7UUFFQSxNQUFNRSxVQUFVWCxLQUFLLENBQUNPLE1BQU07UUFFNUIsT0FBT04sU0FDTFUsWUFDR0YsZUFDSEosTUFDQSxDQUFDZ0IsUUFBUSxHQUFHUjtZQUNWLElBQUksQ0FBQ1EsUUFBUTtnQkFDWCxNQUFNQyxhQUFhZixPQUNiZ0IsY0FBYyxHQUNkQyxpQkFBaUJiLFNBQVMsR0FBRztnQkFFbkNYLE1BQU15QixNQUFNLENBQUNILFlBQVlDO2dCQUV6QixPQUFPcEIsUUFBUXFCLG1CQUFtQlg7WUFDcEM7WUFFQSxPQUFPTCxLQUFLRCxRQUFRLE1BQU1NO1FBQzVCLEdBQ0FOO0lBRUo7SUFFQSxPQUFPQyxLQUFLRCxVQUFVTDtBQUN4QjtBQUVPLFNBQVNqQixRQUFRZSxLQUFLLEVBQUVDLFFBQVEsRUFBRSxHQUFHQyxnQkFBZ0I7SUFDMUQsTUFBTUMsVUFBVUQsaUJBQWlCRSxHQUFHLElBQzlCQyxPQUFPSCxpQkFBaUJFLEdBQUcsSUFDM0JFLFNBQVNOLE1BQU1NLE1BQU0sRUFDckJDLFFBQVE7SUFFZCxTQUFTQyxLQUFLRCxLQUFLLEVBQUUsR0FBR0UsYUFBYTtRQUNuQyxJQUFJRixVQUFVRCxRQUFRO1lBQ3BCLE1BQU1rQixpQkFBaUJHO1lBRXZCLE9BQU94QixRQUFRcUIsbUJBQW1CZjtRQUNwQztRQUVBLE1BQU1FLFVBQVVYLEtBQUssQ0FBQ08sTUFBTTtRQUU1QixPQUFPTixTQUNMVSxZQUNHRixlQUNISixNQUNBLENBQUNnQixRQUFRLEdBQUdSO1lBQ1YsSUFBSVEsUUFBUTtnQkFDVixNQUFNQyxhQUFhZixPQUNiZ0IsY0FBYyxHQUNkQyxpQkFBaUJiLFNBQVMsR0FBRztnQkFFbkNYLE1BQU15QixNQUFNLENBQUNILFlBQVlDO2dCQUV6QixPQUFPcEIsUUFBUXFCLG1CQUFtQlg7WUFDcEM7WUFFQSxPQUFPTCxLQUFLRCxRQUFRLE1BQU1NO1FBQzVCLEdBQ0FOO0lBRUo7SUFFQSxPQUFPQyxLQUFLRCxVQUFVTDtBQUN4QjtBQUVPLFNBQVNWLE1BQU13QixNQUFNLEVBQUVGLE1BQU0sRUFBRWIsUUFBUSxFQUFFLEdBQUdDLGdCQUFnQjtJQUNqRSxNQUFNQyxVQUFVRCxpQkFBaUJFLEdBQUcsSUFDOUJDLE9BQU9ILGlCQUFpQkUsR0FBRyxJQUMzQndCLGVBQWVaLE9BQU9WLE1BQU0sRUFDNUJ1QixlQUFlZixPQUFPUixNQUFNO0lBRWxDLElBQUlzQixpQkFBaUJDLGNBQWM7UUFDakMsT0FBT3hCO0lBQ1Q7SUFFQSxNQUFNQyxTQUFTc0IsY0FDVHJCLFFBQVE7SUFFZCxTQUFTQyxLQUFLRCxLQUFLLEVBQUUsR0FBR0UsYUFBYTtRQUNuQyxJQUFJRixVQUFVRCxRQUFRO1lBQ3BCLE9BQU9ILFdBQVdNO1FBQ3BCO1FBRUEsTUFBTU0sV0FBV0MsTUFBTSxDQUFDVCxNQUFNLEVBQ3hCVSxXQUFXSCxNQUFNLENBQUNQLE1BQU07UUFFOUIsT0FBT04sU0FDTGMsVUFDQUUsYUFDR1IsZUFDSEosTUFDQSxDQUFDLEdBQUdRO1lBQ0YsT0FBT0wsS0FBS0QsUUFBUSxNQUFNTTtRQUM1QixHQUNBTjtJQUVKO0lBRUEsT0FBT0MsS0FBS0QsVUFBVUw7QUFDeEI7QUFFTyxTQUFTTixRQUFRb0IsTUFBTSxFQUFFRixNQUFNLEVBQUViLFFBQVEsRUFBRSxHQUFHQyxnQkFBZ0I7SUFDbkVjLFNBQVM7V0FDSkE7S0FDSjtJQUVELE1BQU1iLFVBQVVELGlCQUFpQkUsR0FBRyxJQUM5QkMsT0FBT0gsaUJBQWlCRSxHQUFHO0lBRWpDLFNBQVMwQixTQUFTLEdBQUdDLGlCQUFpQjtRQUNwQyxNQUFNekIsU0FBU1UsT0FBT1YsTUFBTSxFQUFFLEdBQUc7UUFFakMsSUFBSUEsV0FBVyxHQUFHO1lBQ2hCLE9BQU9ILFdBQVc0QjtRQUNwQjtRQUVBLFNBQVNDLFlBQVl6QixLQUFLLEVBQUUwQixPQUFPLEVBQUUsR0FBR0Msb0JBQW9CO1lBQzFELElBQUkzQixVQUFVRCxRQUFRO2dCQUNwQixJQUFJLENBQUMyQixTQUFTO29CQUNaLE9BQU81QjtnQkFDVDtnQkFFQVAsWUFBWWtCLFFBQVEsQ0FBQ0Q7b0JBQ25CLE1BQU1vQix5QkFBeUJyQixPQUFPc0IsUUFBUSxDQUFDckI7b0JBRS9DLElBQUksQ0FBQ29CLHdCQUF3Qjt3QkFDM0IsT0FBTztvQkFDVDtnQkFDRjtnQkFFQSxPQUFPTCxZQUFZSTtZQUNyQjtZQUVBLE1BQU1uQixXQUFXQyxNQUFNLENBQUNULE1BQU07WUFFOUIsT0FBT04sU0FDTGMsYUFDR21CLHNCQUNILENBQUN0QixZQUFZLElBQUk7Z0JBQ2YsSUFBSUEsY0FBYyxNQUFNO29CQUN0QixPQUFPUCxLQUFLTztnQkFDZDtnQkFFQSxPQUFPb0IsWUFBWXpCLFFBQVEsR0FBRzBCLFlBQVlDO1lBQzVDLEdBQ0EsQ0FBQyxHQUFHckI7Z0JBQ0YsTUFBTUksV0FBV0YsVUFBVyxHQUFHO2dCQUUvQkQsT0FBT3VCLElBQUksQ0FBQ3BCO2dCQUVaLE9BQU9lLFlBQVl6QixRQUFRLEdBQUcsU0FBU007WUFDekMsR0FDQU47UUFFSjtRQUVBLE1BQU1BLFFBQVEsR0FDUjBCLFVBQVU7UUFFaEIsT0FBT0QsWUFBWXpCLE9BQU8wQixZQUFZRjtJQUN4QztJQUVBLE9BQU9ELFlBQVk1QjtBQUNyQjtBQUVPLFNBQVNiLGNBQWNXLEtBQUssRUFBRUMsUUFBUSxFQUFFLEdBQUdDLGdCQUFnQjtJQUNoRSxNQUFNQyxVQUFVRCxpQkFBaUJFLEdBQUcsSUFDOUJDLE9BQU9ILGlCQUFpQkUsR0FBRyxJQUMzQkUsU0FBU04sTUFBTU0sTUFBTSxFQUNyQkMsUUFBUTtJQUVkLFNBQVNDLEtBQUtELEtBQUssRUFBRSxHQUFHRSxhQUFhO1FBQ25DLElBQUlGLFVBQVVELFFBQVE7WUFDcEIsT0FBT0gsV0FBV007UUFDcEI7UUFFQSxNQUFNRSxVQUFVWCxLQUFLLENBQUNPLE1BQU07UUFFNUIsT0FBT04sU0FDTFUsWUFDR0YsZUFDSEosTUFDQSxDQUFDLEdBQUdRO1lBQ0YsT0FBT0wsS0FBS0QsUUFBUSxNQUFNTTtRQUM1QixHQUNBTjtJQUVKO0lBRUEsT0FBT0MsS0FBS0QsVUFBVUw7QUFDeEI7QUFFTyxTQUFTdEIsZUFBZW9CLEtBQUssRUFBRUMsUUFBUSxFQUFFLEdBQUdDLGdCQUFnQjtJQUNqRSxNQUFNQyxVQUFVRCxpQkFBaUJFLEdBQUcsSUFDOUJDLE9BQU9ILGlCQUFpQkUsR0FBRyxJQUMzQkUsU0FBU04sTUFBTU0sTUFBTSxFQUNyQkMsUUFBUUQsU0FBUztJQUV2QixTQUFTRSxLQUFLRCxLQUFLLEVBQUUsR0FBR0UsYUFBYTtRQUNuQyxJQUFJRixVQUFVLENBQUMsR0FBRztZQUNoQixPQUFPSixXQUFXTTtRQUNwQjtRQUVBLE1BQU1FLFVBQVVYLEtBQUssQ0FBQ08sTUFBTTtRQUU1QixPQUFPTixTQUNMVSxZQUNHRixlQUNISixNQUNBLENBQUMsR0FBR1E7WUFDRixPQUFPTCxLQUFLRCxRQUFRLE1BQU1NO1FBQzVCLEdBQ0FOO0lBRUo7SUFFQSxPQUFPQyxLQUFLRCxVQUFVTDtBQUN4QjtBQUVPLFNBQVNaLGdCQUFnQlUsS0FBSyxFQUFFQyxRQUFRLEVBQUUsR0FBR0MsZ0JBQWdCO0lBQ2xFLE1BQU1DLFVBQVVELGlCQUFpQkUsR0FBRyxJQUM5QkMsT0FBT0gsaUJBQWlCRSxHQUFHLElBQzNCRSxTQUFTTixNQUFNTSxNQUFNLEVBQ3JCQyxRQUFRO0lBRWQsU0FBU0MsS0FBS0QsS0FBSyxFQUFFLEdBQUdFLGFBQWE7UUFDbkMsSUFBSUYsVUFBVUQsUUFBUTtZQUNwQixPQUFPSCxXQUFXTTtRQUNwQjtRQUVBLE1BQU1FLFVBQVVYLEtBQUssQ0FBQ08sTUFBTTtRQUU1QixPQUFPTixTQUNMVSxZQUNHRixlQUNISixNQUNBLENBQUMsR0FBR1E7WUFDRixPQUFPTCxLQUFLRCxRQUFRLE1BQU1NO1FBQzVCLEdBQ0FOO0lBRUo7SUFFQSxPQUFPQyxLQUFLRCxVQUFVTDtBQUN4QjtBQUVPLFNBQVNyQixpQkFBaUJtQixLQUFLLEVBQUVDLFFBQVEsRUFBRSxHQUFHQyxnQkFBZ0I7SUFDbkUsTUFBTUMsVUFBVUQsaUJBQWlCRSxHQUFHLElBQzlCQyxPQUFPSCxpQkFBaUJFLEdBQUcsSUFDM0JFLFNBQVNOLE1BQU1NLE1BQU0sRUFDckJDLFFBQVFELFNBQVM7SUFFdkIsU0FBU0UsS0FBS0QsS0FBSyxFQUFFLEdBQUdFLGFBQWE7UUFDbkMsSUFBSUYsVUFBVSxDQUFDLEdBQUc7WUFDaEIsT0FBT0osV0FBV007UUFDcEI7UUFFQSxNQUFNRSxVQUFVWCxLQUFLLENBQUNPLE1BQU07UUFFNUIsT0FBT04sU0FDTFUsWUFDR0YsZUFDSEosTUFDQSxDQUFDLEdBQUdRO1lBQ0YsT0FBT0wsS0FBS0QsUUFBUSxNQUFNTTtRQUM1QixHQUNBTjtJQUVKO0lBRUEsT0FBT0MsS0FBS0QsVUFBVUw7QUFDeEI7QUFFTyxTQUFTdkIsSUFBSTJELFNBQVMsRUFBRSxHQUFHcEMsZ0JBQWdCO0lBQ2hELE9BQU9uQixNQUFNdUQsV0FBVyxDQUFDckMsVUFBVSxHQUFHWTtRQUNwQyxPQUFPWixZQUFZWTtJQUNyQixNQUFNWDtBQUNSO0FBRU8sU0FBU2xCLE9BQU9zRCxTQUFTLEVBQUUsR0FBR3BDLGdCQUFnQjtJQUNuRCxPQUFPTCxLQUFLeUMsV0FBVyxDQUFDckMsVUFBVSxHQUFHWTtRQUNuQyxPQUFPWixZQUFZWTtJQUNyQixNQUFNWDtBQUNSO01BRUEsV0FBZTtJQUNiVDtJQUNBSTtJQUNBZjtJQUNBQztJQUNBUTtJQUNBSjtJQUNBUTtJQUNBUDtJQUNBRjtJQUNBUTtJQUNBVDtJQUNBTztJQUNBSTtJQUNBUDtJQUNBVDtJQUNBVTtJQUNBVDtJQUNBRjtJQUNBSztBQUNGIn0=
|
|
428
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlsaXRpZXMvY29udGludWF0aW9uLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG5pbXBvcnQgeyBhcnJheVV0aWxpdGllcyB9IGZyb20gXCJuZWNlc3NhcnlcIjtcblxuY29uc3QgeyBmaWx0ZXI6IGFycmF5RmlsdGVyIH0gPSBhcnJheVV0aWxpdGllcztcblxuZXhwb3J0IGZ1bmN0aW9uIG9uZShhcnJheSwgY2FsbGJhY2ssIC4uLmluaXRpYWxBcmd1bWVudHMpIHtcbiAgY29uc3QgYmFjayA9IGluaXRpYWxBcmd1bWVudHMucG9wKCksXG4gICAgICAgIGZvcndhcmQgPSBpbml0aWFsQXJndW1lbnRzLnBvcCgpLFxuICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICAgIGluZGV4ID0gMDtcblxuICBmdW5jdGlvbiBuZXh0KGluZGV4LCAuLi5uZXh0QXJndW1lbnRzKSB7XG4gICAgaWYgKGluZGV4ID09PSBsZW5ndGgpIHtcbiAgICAgIGlmIChjb3VudCAhPT0gMSkge1xuICAgICAgICByZXR1cm4gYmFjaygpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZm9yd2FyZCguLi5uZXh0QXJndW1lbnRzLCBiYWNrKTtcbiAgICB9XG5cbiAgICBjb25zdCBlbGVtZW50ID0gYXJyYXlbaW5kZXhdO1xuXG4gICAgcmV0dXJuIGNhbGxiYWNrKFxuICAgICAgZWxlbWVudCxcbiAgICAgIC4uLmluaXRpYWxBcmd1bWVudHMsXG4gICAgICAoLi4uZm9yd2FyZEFyZ3VtZW50cykgPT4ge1xuICAgICAgICBmb3J3YXJkQXJndW1lbnRzLnBvcCgpOyAgLy8vXG5cbiAgICAgICAgY291bnQrKztcblxuICAgICAgICBpZiAoY291bnQgPT09IDIpIHtcbiAgICAgICAgICByZXR1cm4gYmFjaygpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5leHQoaW5kZXggKyAxLCAuLi5mb3J3YXJkQXJndW1lbnRzKTtcbiAgICAgIH0sXG4gICAgICAoLi4uYmFja0FyZ3VtZW50cykgPT4ge1xuICAgICAgICBjb25zdCBleGNlcHRpb24gPSBiYWNrQXJndW1lbnRzLnBvcCgpO1xuXG4gICAgICAgIGlmIChleGNlcHRpb24pIHtcbiAgICAgICAgICByZXR1cm4gYmFjayhleGNlcHRpb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5leHQoaW5kZXggKyAxLCAuLi5uZXh0QXJndW1lbnRzKTtcbiAgICAgIH0sXG4gICAgICBpbmRleFxuICAgICk7XG4gIH1cblxuICBsZXQgY291bnQgPSAwO1xuXG4gIHJldHVybiBuZXh0KGluZGV4LCAuLi5pbml0aWFsQXJndW1lbnRzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNvbWUoYXJyYXksIGNhbGxiYWNrLCAuLi5pbml0aWFsQXJndW1lbnRzKSB7XG4gIGNvbnN0IGJhY2sgPSBpbml0aWFsQXJndW1lbnRzLnBvcCgpLFxuICAgICAgICBmb3J3YXJkID0gaW5pdGlhbEFyZ3VtZW50cy5wb3AoKSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gIGZ1bmN0aW9uIG5leHQoaW5kZXgpIHtcbiAgICBpZiAoaW5kZXggPT09IGxlbmd0aCkge1xuICAgICAgcmV0dXJuIGJhY2soKTtcbiAgICB9XG5cbiAgICBjb25zdCBlbGVtZW50ID0gYXJyYXlbaW5kZXhdO1xuXG4gICAgcmV0dXJuIGNhbGxiYWNrKFxuICAgICAgZWxlbWVudCxcbiAgICAgIC4uLmluaXRpYWxBcmd1bWVudHMsXG4gICAgICBmb3J3YXJkLFxuICAgICAgKC4uLmJhY2tBcmd1bWVudHMpID0+IHtcbiAgICAgICAgY29uc3QgZXhjZXB0aW9uID0gYmFja0FyZ3VtZW50cy5wb3AoKTtcblxuICAgICAgICBpZiAoZXhjZXB0aW9uKSB7XG4gICAgICAgICAgcmV0dXJuIGJhY2soZXhjZXB0aW9uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXh0KGluZGV4ICsgMSk7XG4gICAgICB9LFxuICAgICAgaW5kZXhcbiAgICApO1xuICB9XG5cbiAgY29uc3QgaW5kZXggPSAwO1xuXG4gIHJldHVybiBuZXh0KGluZGV4KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVhY2goYXJyYXksIGNhbGxiYWNrLCAuLi5pbml0aWFsQXJndW1lbnRzKSB7XG4gIGNvbnN0IGJhY2sgPSBpbml0aWFsQXJndW1lbnRzLnBvcCgpLFxuICAgICAgICBmb3J3YXJkID0gaW5pdGlhbEFyZ3VtZW50cy5wb3AoKSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgICBpbmRleCA9IDA7XG5cbiAgZnVuY3Rpb24gbmV4dChpbmRleCwgLi4ubmV4dEFyZ3VtZW50cykge1xuICAgIGlmIChpbmRleCA9PT0gbGVuZ3RoKSB7XG4gICAgICBpZiAoY291bnQgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIGJhY2soKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZvcndhcmQoLi4ubmV4dEFyZ3VtZW50cywgYmFjayk7XG4gICAgfVxuXG4gICAgY29uc3QgZWxlbWVudCA9IGFycmF5W2luZGV4XTtcblxuICAgIHJldHVybiBjYWxsYmFjayhcbiAgICAgIGVsZW1lbnQsXG4gICAgICAuLi5uZXh0QXJndW1lbnRzLFxuICAgICAgKC4uLmZvcndhcmRBcmd1bWVudHMpID0+IHtcbiAgICAgICAgZm9yd2FyZEFyZ3VtZW50cy5wb3AoKTsgIC8vL1xuXG4gICAgICAgIGNvdW50Kys7XG5cbiAgICAgICAgcmV0dXJuIG5leHQoaW5kZXggKyAxLCAuLi5mb3J3YXJkQXJndW1lbnRzKTtcbiAgICAgIH0sXG4gICAgICBiYWNrLFxuICAgICAgaW5kZXhcbiAgICApO1xuICB9XG5cbiAgbGV0IGNvdW50ID0gMDtcblxuICByZXR1cm4gbmV4dChpbmRleCwgLi4uaW5pdGlhbEFyZ3VtZW50cyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBldmVyeShhcnJheSwgY2FsbGJhY2ssIC4uLmluaXRpYWxBcmd1bWVudHMpIHtcbiAgY29uc3QgYmFjayA9IGluaXRpYWxBcmd1bWVudHMucG9wKCksXG4gICAgICAgIGZvcndhcmQgPSBpbml0aWFsQXJndW1lbnRzLnBvcCgpLFxuICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICAgIGluZGV4ID0gMDtcblxuICBmdW5jdGlvbiBuZXh0KGluZGV4LCAuLi5uZXh0QXJndW1lbnRzKSB7XG4gICAgaWYgKGluZGV4ID09PSBsZW5ndGgpIHtcbiAgICAgIHJldHVybiBmb3J3YXJkKC4uLm5leHRBcmd1bWVudHMsIGJhY2spO1xuICAgIH1cblxuICAgIGNvbnN0IGVsZW1lbnQgPSBhcnJheVtpbmRleF07XG5cbiAgICByZXR1cm4gY2FsbGJhY2soXG4gICAgICBlbGVtZW50LFxuICAgICAgLi4ubmV4dEFyZ3VtZW50cyxcbiAgICAgICguLi5mb3J3YXJkQXJndW1lbnRzKSA9PiB7XG4gICAgICAgIGZvcndhcmRBcmd1bWVudHMucG9wKCk7ICAvLy9cblxuICAgICAgICByZXR1cm4gbmV4dChpbmRleCArIDEsIC4uLmZvcndhcmRBcmd1bWVudHMpO1xuICAgICAgfSxcbiAgICAgIGJhY2ssXG4gICAgICBpbmRleFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gbmV4dChpbmRleCwgLi4uaW5pdGlhbEFyZ3VtZW50cyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtYXAoYXJyYXksIGNhbGxiYWNrLCAuLi5pbml0aWFsQXJndW1lbnRzKSB7XG4gIGNvbnN0IGJhY2sgPSBpbml0aWFsQXJndW1lbnRzLnBvcCgpLFxuICAgICAgICBmb3J3YXJkID0gaW5pdGlhbEFyZ3VtZW50cy5wb3AoKSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgICBpbmRleCA9IDA7XG5cbiAgZnVuY3Rpb24gbmV4dChpbmRleCwgYXJyYXlCLCAuLi5uZXh0QXJndW1lbnRzKSB7XG4gICAgaWYgKGluZGV4ID09PSBsZW5ndGgpIHtcbiAgICAgIHJldHVybiBmb3J3YXJkKGFycmF5QiwgLi4ubmV4dEFyZ3VtZW50cywgYmFjayk7XG4gICAgfVxuXG4gICAgY29uc3QgZWxlbWVudEEgPSBhcnJheUFbaW5kZXhdO1xuXG4gICAgcmV0dXJuIGNhbGxiYWNrKFxuICAgICAgZWxlbWVudEEsXG4gICAgICAuLi5uZXh0QXJndW1lbnRzLFxuICAgICAgKGVsZW1lbnRCLCAuLi5mb3J3YXJkQXJndW1lbnRzKSA9PiB7XG4gICAgICAgIGZvcndhcmRBcmd1bWVudHMucG9wKCk7ICAvLy9cblxuICAgICAgICBhcnJheUIgPSBbICAvLy9cbiAgICAgICAgICAuLi5hcnJheUIsXG4gICAgICAgICAgZWxlbWVudEJcbiAgICAgICAgXTtcblxuICAgICAgICByZXR1cm4gbmV4dChpbmRleCArIDEsIGFycmF5QiwgLi4uZm9yd2FyZEFyZ3VtZW50cyk7XG4gICAgICB9LFxuICAgICAgYmFjayxcbiAgICAgIGluZGV4XG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IGFycmF5QSA9IGFycmF5LCAvLy9cbiAgICAgICAgYXJyYXlCID0gW107XG5cbiAgcmV0dXJuIG5leHQoaW5kZXgsIGFycmF5QiwgLi4uaW5pdGlhbEFyZ3VtZW50cyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kKGFycmF5LCBjYWxsYmFjaywgLi4uaW5pdGlhbEFyZ3VtZW50cykge1xuICBjb25zdCBiYWNrID0gaW5pdGlhbEFyZ3VtZW50cy5wb3AoKSxcbiAgICAgICAgZm9yd2FyZCA9IGluaXRpYWxBcmd1bWVudHMucG9wKCksXG4gICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgaW5kZXggPSAwO1xuXG4gIGZ1bmN0aW9uIG5leHQoaW5kZXgsIC4uLm5leHRBcmd1bWVudHMpIHtcbiAgICBpZiAoaW5kZXggPT09IGxlbmd0aCkge1xuICAgICAgcmV0dXJuIGJhY2soKTtcbiAgICB9XG5cbiAgICBjb25zdCBlbGVtZW50ID0gYXJyYXlbaW5kZXhdO1xuXG4gICAgcmV0dXJuIGNhbGxiYWNrKFxuICAgICAgZWxlbWVudCxcbiAgICAgIC4uLm5leHRBcmd1bWVudHMsXG4gICAgICAoLi4uZm9yd2FyZEFyZ3VtZW50cykgPT4ge1xuICAgICAgICBmb3J3YXJkQXJndW1lbnRzLnBvcCgpOyAgLy8vXG5cbiAgICAgICAgcmV0dXJuIGZvcndhcmQoZWxlbWVudCwgLi4uZm9yd2FyZEFyZ3VtZW50cywgYmFjayk7XG4gICAgICB9LFxuICAgICAgKC4uLmJhY2tBcmd1bWVudHMpID0+IHtcbiAgICAgICAgY29uc3QgZXhjZXB0aW9uID0gYmFja0FyZ3VtZW50cy5wb3AoKTtcblxuICAgICAgICBpZiAoZXhjZXB0aW9uKSB7XG4gICAgICAgICAgcmV0dXJuIGJhY2soZXhjZXB0aW9uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXh0KGluZGV4ICsgMSwgLi4ubmV4dEFyZ3VtZW50cyk7XG4gICAgICB9LFxuICAgICAgaW5kZXhcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIG5leHQoaW5kZXgsIC4uLmluaXRpYWxBcmd1bWVudHMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVkdWNlKGFycmF5LCBpbml0aWFsVmFsdWUsIGNhbGxiYWNrLCAuLi5pbml0aWFsQXJndW1lbnRzKSB7XG4gIGNvbnN0IGJhY2sgPSBpbml0aWFsQXJndW1lbnRzLnBvcCgpLFxuICAgICAgICBmb3J3YXJkID0gaW5pdGlhbEFyZ3VtZW50cy5wb3AoKSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgICBpbmRleCA9IDA7XG5cbiAgZnVuY3Rpb24gbmV4dChpbmRleCwgdmFsdWUsIC4uLm5leHRBcmd1bWVudHMpIHtcbiAgICBpZiAoaW5kZXggPT09IGxlbmd0aCkge1xuICAgICAgcmV0dXJuIGZvcndhcmQodmFsdWUsIC4uLm5leHRBcmd1bWVudHMsIGJhY2spO1xuICAgIH1cblxuICAgIGNvbnN0IGVsZW1lbnQgPSBhcnJheVtpbmRleF07XG5cbiAgICByZXR1cm4gY2FsbGJhY2soXG4gICAgICBlbGVtZW50LFxuICAgICAgdmFsdWUsXG4gICAgICAuLi5uZXh0QXJndW1lbnRzLFxuICAgICAgKHZhbHVlLCAuLi5mb3J3YXJkQXJndW1lbnRzKSA9PiB7XG4gICAgICAgIGZvcndhcmRBcmd1bWVudHMucG9wKCk7ICAvLy9cblxuICAgICAgICByZXR1cm4gbmV4dChpbmRleCArIDEsIHZhbHVlLCAuLi5mb3J3YXJkQXJndW1lbnRzKTtcbiAgICAgIH0sXG4gICAgICBiYWNrLFxuICAgICAgaW5kZXhcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIG5leHQoaW5kZXgsIGluaXRpYWxWYWx1ZSwgLi4uaW5pdGlhbEFyZ3VtZW50cyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JFYWNoKGFycmF5LCBjYWxsYmFjaywgLi4uaW5pdGlhbEFyZ3VtZW50cykge1xuICBjb25zdCBiYWNrID0gaW5pdGlhbEFyZ3VtZW50cy5wb3AoKSxcbiAgICAgICAgZm9yd2FyZCA9IGluaXRpYWxBcmd1bWVudHMucG9wKCksXG4gICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgaW5kZXggPSAwO1xuXG4gIGZ1bmN0aW9uIG5leHQoaW5kZXgsIC4uLm5leHRBcmd1bWVudHMpIHtcbiAgICBpZiAoaW5kZXggPT09IGxlbmd0aCkge1xuICAgICAgcmV0dXJuIGZvcndhcmQoLi4ubmV4dEFyZ3VtZW50cywgYmFjayk7XG4gICAgfVxuXG4gICAgY29uc3QgZWxlbWVudCA9IGFycmF5W2luZGV4XTtcblxuICAgIHJldHVybiBjYWxsYmFjayhcbiAgICAgIGVsZW1lbnQsXG4gICAgICAuLi5uZXh0QXJndW1lbnRzLFxuICAgICAgKC4uLmZvcndhcmRBcmd1bWVudHMpID0+IHtcbiAgICAgICAgZm9yd2FyZEFyZ3VtZW50cy5wb3AoKTsgIC8vL1xuXG4gICAgICAgIHJldHVybiBuZXh0KGluZGV4ICsgMSwgLi4uZm9yd2FyZEFyZ3VtZW50cyk7XG4gICAgICB9LFxuICAgICAgYmFjayxcbiAgICAgIGluZGV4XG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBuZXh0KGluZGV4LCAuLi5pbml0aWFsQXJndW1lbnRzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbHRlcihhcnJheSwgY2FsbGJhY2ssIC4uLmluaXRpYWxBcmd1bWVudHMpIHtcbiAgY29uc3QgYmFjayA9IGluaXRpYWxBcmd1bWVudHMucG9wKCksXG4gICAgICAgIGZvcndhcmQgPSBpbml0aWFsQXJndW1lbnRzLnBvcCgpLFxuICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICAgIGRlbGV0ZWRFbGVtZW50cyA9IFtdLFxuICAgICAgICBpbmRleCA9IGxlbmd0aCAtIDE7XG5cbiAgZnVuY3Rpb24gbmV4dChpbmRleCwgLi4ubmV4dEFyZ3VtZW50cykge1xuICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgIHJldHVybiBmb3J3YXJkKGRlbGV0ZWRFbGVtZW50cywgLi4ubmV4dEFyZ3VtZW50cywgYmFjayk7XG4gICAgfVxuXG4gICAgY29uc3QgZWxlbWVudCA9IGFycmF5W2luZGV4XTtcblxuICAgIHJldHVybiBjYWxsYmFjayhcbiAgICAgIGVsZW1lbnQsXG4gICAgICAuLi5uZXh0QXJndW1lbnRzLFxuICAgICAgKHBhc3NlZCwgLi4uZm9yd2FyZEFyZ3VtZW50cykgPT4ge1xuICAgICAgICBmb3J3YXJkQXJndW1lbnRzLnBvcCgpOyAgLy8vXG5cbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICBjb25zdCBzdGFydEluZGV4ID0gaW5kZXgsIC8vL1xuICAgICAgICAgICAgICAgIGRlbGV0ZUNvdW50ID0gMSxcbiAgICAgICAgICAgICAgICBkZWxldGVkRWxlbWVudCA9IGVsZW1lbnQ7IC8vL1xuXG4gICAgICAgICAgYXJyYXkuc3BsaWNlKHN0YXJ0SW5kZXgsIGRlbGV0ZUNvdW50KTtcblxuICAgICAgICAgIGRlbGV0ZWRFbGVtZW50cy51bnNoaWZ0KGRlbGV0ZWRFbGVtZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXh0KGluZGV4IC0gMSwgLi4uZm9yd2FyZEFyZ3VtZW50cyk7XG4gICAgICB9LFxuICAgICAgYmFjayxcbiAgICAgIGluZGV4XG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBuZXh0KGluZGV4LCAuLi5pbml0aWFsQXJndW1lbnRzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBydW5lKGFycmF5LCBjYWxsYmFjaywgLi4uaW5pdGlhbEFyZ3VtZW50cykge1xuICBjb25zdCBiYWNrID0gaW5pdGlhbEFyZ3VtZW50cy5wb3AoKSxcbiAgICAgICAgZm9yd2FyZCA9IGluaXRpYWxBcmd1bWVudHMucG9wKCksXG4gICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgaW5kZXggPSAwO1xuXG4gIGZ1bmN0aW9uIG5leHQoaW5kZXgsIC4uLm5leHRBcmd1bWVudHMpIHtcbiAgICBpZiAoaW5kZXggPT09IGxlbmd0aCkge1xuICAgICAgY29uc3QgZGVsZXRlZEVsZW1lbnQgPSB1bmRlZmluZWQ7XG5cbiAgICAgIHJldHVybiBmb3J3YXJkKGRlbGV0ZWRFbGVtZW50LCAuLi5uZXh0QXJndW1lbnRzLCBiYWNrKTtcbiAgICB9XG5cbiAgICBjb25zdCBlbGVtZW50ID0gYXJyYXlbaW5kZXhdO1xuXG4gICAgcmV0dXJuIGNhbGxiYWNrKFxuICAgICAgZWxlbWVudCxcbiAgICAgIC4uLm5leHRBcmd1bWVudHMsXG4gICAgICAocGFzc2VkLCAuLi5mb3J3YXJkQXJndW1lbnRzKSA9PiB7XG4gICAgICAgIGZvcndhcmRBcmd1bWVudHMucG9wKCk7ICAvLy9cblxuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgIGNvbnN0IHN0YXJ0SW5kZXggPSBpbmRleCwgLy8vXG4gICAgICAgICAgICAgICAgZGVsZXRlQ291bnQgPSAxLFxuICAgICAgICAgICAgICAgIGRlbGV0ZWRFbGVtZW50ID0gZWxlbWVudDsgLy8vXG5cbiAgICAgICAgICBhcnJheS5zcGxpY2Uoc3RhcnRJbmRleCwgZGVsZXRlQ291bnQpO1xuXG4gICAgICAgICAgcmV0dXJuIGZvcndhcmQoZGVsZXRlZEVsZW1lbnQsIC4uLmZvcndhcmRBcmd1bWVudHMsIGJhY2spO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5leHQoaW5kZXggKyAxLCAuLi5mb3J3YXJkQXJndW1lbnRzKTtcbiAgICAgIH0sXG4gICAgICBiYWNrLFxuICAgICAgaW5kZXhcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIG5leHQoaW5kZXgsIC4uLmluaXRpYWxBcmd1bWVudHMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdChhcnJheSwgY2FsbGJhY2ssIC4uLmluaXRpYWxBcmd1bWVudHMpIHtcbiAgY29uc3QgYmFjayA9IGluaXRpYWxBcmd1bWVudHMucG9wKCksXG4gICAgICAgIGZvcndhcmQgPSBpbml0aWFsQXJndW1lbnRzLnBvcCgpLFxuICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICAgIGluZGV4ID0gMDtcblxuICBmdW5jdGlvbiBuZXh0KGluZGV4LCAuLi5uZXh0QXJndW1lbnRzKSB7XG4gICAgaWYgKGluZGV4ID09PSBsZW5ndGgpIHtcbiAgICAgIGNvbnN0IGRlbGV0ZWRFbGVtZW50ID0gdW5kZWZpbmVkO1xuXG4gICAgICByZXR1cm4gZm9yd2FyZChkZWxldGVkRWxlbWVudCwgLi4ubmV4dEFyZ3VtZW50cywgYmFjayk7XG4gICAgfVxuXG4gICAgY29uc3QgZWxlbWVudCA9IGFycmF5W2luZGV4XTtcblxuICAgIHJldHVybiBjYWxsYmFjayhcbiAgICAgIGVsZW1lbnQsXG4gICAgICAuLi5uZXh0QXJndW1lbnRzLFxuICAgICAgKHBhc3NlZCwgLi4uZm9yd2FyZEFyZ3VtZW50cykgPT4ge1xuICAgICAgICBmb3J3YXJkQXJndW1lbnRzLnBvcCgpOyAgLy8vXG5cbiAgICAgICAgaWYgKHBhc3NlZCkge1xuICAgICAgICAgIGNvbnN0IHN0YXJ0SW5kZXggPSBpbmRleCwgLy8vXG4gICAgICAgICAgICAgICAgZGVsZXRlQ291bnQgPSAxLFxuICAgICAgICAgICAgICAgIGRlbGV0ZWRFbGVtZW50ID0gZWxlbWVudDsgLy8vXG5cbiAgICAgICAgICBhcnJheS5zcGxpY2Uoc3RhcnRJbmRleCwgZGVsZXRlQ291bnQpO1xuXG4gICAgICAgICAgcmV0dXJuIGZvcndhcmQoZGVsZXRlZEVsZW1lbnQsIC4uLmZvcndhcmRBcmd1bWVudHMsIGJhY2spO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5leHQoaW5kZXggKyAxLCAuLi5mb3J3YXJkQXJndW1lbnRzKTtcbiAgICAgIH0sXG4gICAgICBiYWNrLFxuICAgICAgaW5kZXhcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIG5leHQoaW5kZXgsIC4uLmluaXRpYWxBcmd1bWVudHMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWF0Y2goYXJyYXlBLCBhcnJheUIsIGNhbGxiYWNrLCAuLi5pbml0aWFsQXJndW1lbnRzKSB7XG4gIGNvbnN0IGJhY2sgPSBpbml0aWFsQXJndW1lbnRzLnBvcCgpLFxuICAgICAgICBmb3J3YXJkID0gaW5pdGlhbEFyZ3VtZW50cy5wb3AoKSxcbiAgICAgICAgYXJyYXlBTGVuZ3RoID0gYXJyYXlBLmxlbmd0aCxcbiAgICAgICAgYXJyYXlCTGVuZ3RoID0gYXJyYXlCLmxlbmd0aDtcblxuICBpZiAoYXJyYXlBTGVuZ3RoICE9PSBhcnJheUJMZW5ndGgpIHtcbiAgICByZXR1cm4gYmFjaygpO1xuICB9XG5cbiAgY29uc3QgbGVuZ3RoID0gYXJyYXlBTGVuZ3RoLCAgLy8vXG4gICAgICAgIGluZGV4ID0gMDtcblxuICBmdW5jdGlvbiBuZXh0KGluZGV4LCAuLi5uZXh0QXJndW1lbnRzKSB7XG4gICAgaWYgKGluZGV4ID09PSBsZW5ndGgpIHtcbiAgICAgIHJldHVybiBmb3J3YXJkKC4uLm5leHRBcmd1bWVudHMsIGJhY2spO1xuICAgIH1cblxuICAgIGNvbnN0IGVsZW1lbnRBID0gYXJyYXlBW2luZGV4XSxcbiAgICAgICAgICBlbGVtZW50QiA9IGFycmF5QltpbmRleF07XG5cbiAgICByZXR1cm4gY2FsbGJhY2soXG4gICAgICBlbGVtZW50QSxcbiAgICAgIGVsZW1lbnRCLFxuICAgICAgLi4ubmV4dEFyZ3VtZW50cyxcbiAgICAgICguLi5mb3J3YXJkQXJndW1lbnRzKSA9PiB7XG4gICAgICAgIGZvcndhcmRBcmd1bWVudHMucG9wKCk7ICAvLy9cblxuICAgICAgICByZXR1cm4gbmV4dChpbmRleCArIDEsIC4uLmZvcndhcmRBcmd1bWVudHMpO1xuICAgICAgfSxcbiAgICAgIGJhY2ssXG4gICAgICBpbmRleFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gbmV4dChpbmRleCwgLi4uaW5pdGlhbEFyZ3VtZW50cyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlKGFycmF5QSwgYXJyYXlCLCBjYWxsYmFjaywgLi4uaW5pdGlhbEFyZ3VtZW50cykge1xuICBhcnJheUEgPSBbICAvLy9cbiAgICAuLi5hcnJheUFcbiAgXTtcblxuICBjb25zdCBiYWNrID0gaW5pdGlhbEFyZ3VtZW50cy5wb3AoKSxcbiAgICAgICAgZm9yd2FyZCA9IGluaXRpYWxBcmd1bWVudHMucG9wKCk7XG5cbiAgZnVuY3Rpb24gbmV4dFBhc3MoLi4ubmV4dFBhc3NBcmd1bWVudHMpIHtcbiAgICBjb25zdCBsZW5ndGggPSBhcnJheUEubGVuZ3RoOyAvLy9cblxuICAgIGlmIChsZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBmb3J3YXJkKC4uLm5leHRQYXNzQXJndW1lbnRzLCBiYWNrKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBuZXh0RWxlbWVudChpbmRleCwgc3VjY2VzcywgLi4ubmV4dEVsZW1lbnRBcmd1bWVudHMpIHtcbiAgICAgIGlmIChpbmRleCA9PT0gbGVuZ3RoKSB7XG4gICAgICAgIGlmICghc3VjY2Vzcykge1xuICAgICAgICAgIHJldHVybiBiYWNrKCk7XG4gICAgICAgIH1cblxuICAgICAgICBhcnJheUZpbHRlcihhcnJheUEsIChlbGVtZW50QSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGFycmF5QkluY2x1ZGVzRWxlbWVudEEgPSBhcnJheUIuaW5jbHVkZXMoZWxlbWVudEEpO1xuXG4gICAgICAgICAgaWYgKCFhcnJheUJJbmNsdWRlc0VsZW1lbnRBKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBuZXh0UGFzcyguLi5uZXh0RWxlbWVudEFyZ3VtZW50cyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVsZW1lbnRBID0gYXJyYXlBW2luZGV4XTtcblxuICAgICAgcmV0dXJuIGNhbGxiYWNrKFxuICAgICAgICBlbGVtZW50QSxcbiAgICAgICAgLi4ubmV4dEVsZW1lbnRBcmd1bWVudHMsXG4gICAgICAgICguLi5mb3J3YXJkQXJndW1lbnRzKSA9PiB7XG4gICAgICAgICAgZm9yd2FyZEFyZ3VtZW50cy5wb3AoKTsgIC8vL1xuXG4gICAgICAgICAgY29uc3QgZWxlbWVudEIgPSBlbGVtZW50QTsgIC8vL1xuXG4gICAgICAgICAgYXJyYXlCLnB1c2goZWxlbWVudEIpO1xuXG4gICAgICAgICAgcmV0dXJuIG5leHRFbGVtZW50KGluZGV4ICsgMSwgdHJ1ZSwgLi4uZm9yd2FyZEFyZ3VtZW50cyk7XG4gICAgICAgIH0sXG4gICAgICAgICguLi5iYWNrQXJndW1lbnRzKSA9PiB7XG4gICAgICAgICAgY29uc3QgZXhjZXB0aW9uID0gYmFja0FyZ3VtZW50cy5wb3AoKTtcblxuICAgICAgICAgIGlmIChleGNlcHRpb24pIHtcbiAgICAgICAgICAgIHJldHVybiBiYWNrKGV4Y2VwdGlvbik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIG5leHRFbGVtZW50KGluZGV4ICsgMSwgc3VjY2VzcywgLi4ubmV4dEVsZW1lbnRBcmd1bWVudHMpO1xuICAgICAgICB9LFxuICAgICAgICBpbmRleFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBpbmRleCA9IDAsXG4gICAgICAgICAgc3VjY2VzcyA9IGZhbHNlO1xuXG4gICAgcmV0dXJuIG5leHRFbGVtZW50KGluZGV4LCBzdWNjZXNzLCAuLi5uZXh0UGFzc0FyZ3VtZW50cyk7XG4gIH1cblxuICByZXR1cm4gbmV4dFBhc3MoLi4uaW5pdGlhbEFyZ3VtZW50cyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3J3YXJkc0V2ZXJ5KGFycmF5LCBjYWxsYmFjaywgLi4uaW5pdGlhbEFyZ3VtZW50cykge1xuICBjb25zdCBiYWNrID0gaW5pdGlhbEFyZ3VtZW50cy5wb3AoKSxcbiAgICAgICAgZm9yd2FyZCA9IGluaXRpYWxBcmd1bWVudHMucG9wKCksXG4gICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgaW5kZXggPSAwO1xuXG4gIGZ1bmN0aW9uIG5leHQoaW5kZXgsIC4uLm5leHRBcmd1bWVudHMpIHtcbiAgICBpZiAoaW5kZXggPT09IGxlbmd0aCkge1xuICAgICAgcmV0dXJuIGZvcndhcmQoLi4ubmV4dEFyZ3VtZW50cywgYmFjayk7XG4gICAgfVxuXG4gICAgY29uc3QgZWxlbWVudCA9IGFycmF5W2luZGV4XTtcblxuICAgIHJldHVybiBjYWxsYmFjayhcbiAgICAgIGVsZW1lbnQsXG4gICAgICAuLi5uZXh0QXJndW1lbnRzLFxuICAgICAgKC4uLmZvcndhcmRBcmd1bWVudHMpID0+IHtcbiAgICAgICAgZm9yd2FyZEFyZ3VtZW50cy5wb3AoKTsgIC8vL1xuXG4gICAgICAgIHJldHVybiBuZXh0KGluZGV4ICsgMSwgLi4uZm9yd2FyZEFyZ3VtZW50cyk7XG4gICAgICB9LFxuICAgICAgYmFjayxcbiAgICAgIGluZGV4XG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBuZXh0KGluZGV4LCAuLi5pbml0aWFsQXJndW1lbnRzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJhY2t3YXJkc0V2ZXJ5KGFycmF5LCBjYWxsYmFjaywgLi4uaW5pdGlhbEFyZ3VtZW50cykge1xuICBjb25zdCBiYWNrID0gaW5pdGlhbEFyZ3VtZW50cy5wb3AoKSxcbiAgICAgICAgZm9yd2FyZCA9IGluaXRpYWxBcmd1bWVudHMucG9wKCksXG4gICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgaW5kZXggPSBsZW5ndGggLSAxO1xuXG4gIGZ1bmN0aW9uIG5leHQoaW5kZXgsIC4uLm5leHRBcmd1bWVudHMpIHtcbiAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICByZXR1cm4gZm9yd2FyZCguLi5uZXh0QXJndW1lbnRzLCBiYWNrKTtcbiAgICB9XG5cbiAgICBjb25zdCBlbGVtZW50ID0gYXJyYXlbaW5kZXhdO1xuXG4gICAgcmV0dXJuIGNhbGxiYWNrKFxuICAgICAgZWxlbWVudCxcbiAgICAgIC4uLm5leHRBcmd1bWVudHMsXG4gICAgICAoLi4uZm9yd2FyZEFyZ3VtZW50cykgPT4ge1xuICAgICAgICBmb3J3YXJkQXJndW1lbnRzLnBvcCgpOyAgLy8vXG5cbiAgICAgICAgcmV0dXJuIG5leHQoaW5kZXggLSAxLCAuLi5mb3J3YXJkQXJndW1lbnRzKTtcbiAgICAgIH0sXG4gICAgICBiYWNrLFxuICAgICAgaW5kZXhcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIG5leHQoaW5kZXgsIC4uLmluaXRpYWxBcmd1bWVudHMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZm9yd2FyZHNGb3JFYWNoKGFycmF5LCBjYWxsYmFjaywgLi4uaW5pdGlhbEFyZ3VtZW50cykge1xuICBjb25zdCBiYWNrID0gaW5pdGlhbEFyZ3VtZW50cy5wb3AoKSxcbiAgICAgICAgZm9yd2FyZCA9IGluaXRpYWxBcmd1bWVudHMucG9wKCksXG4gICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgaW5kZXggPSAwO1xuXG4gIGZ1bmN0aW9uIG5leHQoaW5kZXgsIC4uLm5leHRBcmd1bWVudHMpIHtcbiAgICBpZiAoaW5kZXggPT09IGxlbmd0aCkge1xuICAgICAgcmV0dXJuIGZvcndhcmQoLi4ubmV4dEFyZ3VtZW50cywgYmFjayk7XG4gICAgfVxuXG4gICAgY29uc3QgZWxlbWVudCA9IGFycmF5W2luZGV4XTtcblxuICAgIHJldHVybiBjYWxsYmFjayhcbiAgICAgIGVsZW1lbnQsXG4gICAgICAuLi5uZXh0QXJndW1lbnRzLFxuICAgICAgKC4uLmZvcndhcmRBcmd1bWVudHMpID0+IHtcbiAgICAgICAgZm9yd2FyZEFyZ3VtZW50cy5wb3AoKTsgIC8vL1xuXG4gICAgICAgIHJldHVybiBuZXh0KGluZGV4ICsgMSwgLi4uZm9yd2FyZEFyZ3VtZW50cyk7XG4gICAgICB9LFxuICAgICAgYmFjayxcbiAgICAgIGluZGV4XG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBuZXh0KGluZGV4LCAuLi5pbml0aWFsQXJndW1lbnRzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJhY2t3YXJkc0ZvckVhY2goYXJyYXksIGNhbGxiYWNrLCAuLi5pbml0aWFsQXJndW1lbnRzKSB7XG4gIGNvbnN0IGJhY2sgPSBpbml0aWFsQXJndW1lbnRzLnBvcCgpLFxuICAgICAgICBmb3J3YXJkID0gaW5pdGlhbEFyZ3VtZW50cy5wb3AoKSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgICBpbmRleCA9IGxlbmd0aCAtIDE7XG5cbiAgZnVuY3Rpb24gbmV4dChpbmRleCwgLi4ubmV4dEFyZ3VtZW50cykge1xuICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgIHJldHVybiBmb3J3YXJkKC4uLm5leHRBcmd1bWVudHMsIGJhY2spO1xuICAgIH1cblxuICAgIGNvbnN0IGVsZW1lbnQgPSBhcnJheVtpbmRleF07XG5cbiAgICByZXR1cm4gY2FsbGJhY2soXG4gICAgICBlbGVtZW50LFxuICAgICAgLi4ubmV4dEFyZ3VtZW50cyxcbiAgICAgICguLi5mb3J3YXJkQXJndW1lbnRzKSA9PiB7XG4gICAgICAgIGZvcndhcmRBcmd1bWVudHMucG9wKCk7ICAvLy9cblxuICAgICAgICByZXR1cm4gbmV4dChpbmRleCAtIDEsIC4uLmZvcndhcmRBcmd1bWVudHMpO1xuICAgICAgfSxcbiAgICAgIGJhY2ssXG4gICAgICBpbmRleFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gbmV4dChpbmRleCwgLi4uaW5pdGlhbEFyZ3VtZW50cyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhbGwoY2FsbGJhY2tzLCAuLi5pbml0aWFsQXJndW1lbnRzKSB7XG4gIHJldHVybiBldmVyeShjYWxsYmFja3MsIChjYWxsYmFjaywgLi4uY2FsbGJhY2tBcmd1bWVudHMpID0+IHtcbiAgICByZXR1cm4gY2FsbGJhY2soLi4uY2FsbGJhY2tBcmd1bWVudHMpO1xuICB9LCAuLi5pbml0aWFsQXJndW1lbnRzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4aXN0cyhjYWxsYmFja3MsIC4uLmluaXRpYWxBcmd1bWVudHMpIHtcbiAgcmV0dXJuIHNvbWUoY2FsbGJhY2tzLCAoY2FsbGJhY2ssIC4uLmNhbGxiYWNrQXJndW1lbnRzKSA9PiB7XG4gICAgcmV0dXJuIGNhbGxiYWNrKC4uLmNhbGxiYWNrQXJndW1lbnRzKTtcbiAgfSwgLi4uaW5pdGlhbEFyZ3VtZW50cyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgb25lLFxuICBzb21lLFxuICBlYWNoLFxuICBldmVyeSxcbiAgbWFwLFxuICBmaW5kLFxuICByZWR1Y2UsXG4gIGZvckVhY2gsXG4gIGZpbHRlcixcbiAgcHJ1bmUsXG4gIGV4dHJhY3QsXG4gIG1hdGNoLFxuICByZXNvbHZlLFxuICBmb3J3YXJkc0V2ZXJ5LFxuICBiYWNrd2FyZHNFdmVyeSxcbiAgZm9yd2FyZHNGb3JFYWNoLFxuICBiYWNrd2FyZHNGb3JFYWNoLFxuICBhbGwsXG4gIGV4aXN0c1xufTtcbiJdLCJuYW1lcyI6WyJhbGwiLCJiYWNrd2FyZHNFdmVyeSIsImJhY2t3YXJkc0ZvckVhY2giLCJlYWNoIiwiZXZlcnkiLCJleGlzdHMiLCJleHRyYWN0IiwiZmlsdGVyIiwiZmluZCIsImZvckVhY2giLCJmb3J3YXJkc0V2ZXJ5IiwiZm9yd2FyZHNGb3JFYWNoIiwibWFwIiwibWF0Y2giLCJvbmUiLCJwcnVuZSIsInJlZHVjZSIsInJlc29sdmUiLCJzb21lIiwiYXJyYXlGaWx0ZXIiLCJhcnJheVV0aWxpdGllcyIsImFycmF5IiwiY2FsbGJhY2siLCJpbml0aWFsQXJndW1lbnRzIiwiYmFjayIsInBvcCIsImZvcndhcmQiLCJsZW5ndGgiLCJpbmRleCIsIm5leHQiLCJuZXh0QXJndW1lbnRzIiwiY291bnQiLCJlbGVtZW50IiwiZm9yd2FyZEFyZ3VtZW50cyIsImJhY2tBcmd1bWVudHMiLCJleGNlcHRpb24iLCJhcnJheUIiLCJlbGVtZW50QSIsImFycmF5QSIsImVsZW1lbnRCIiwiaW5pdGlhbFZhbHVlIiwidmFsdWUiLCJkZWxldGVkRWxlbWVudHMiLCJwYXNzZWQiLCJzdGFydEluZGV4IiwiZGVsZXRlQ291bnQiLCJkZWxldGVkRWxlbWVudCIsInNwbGljZSIsInVuc2hpZnQiLCJ1bmRlZmluZWQiLCJhcnJheUFMZW5ndGgiLCJhcnJheUJMZW5ndGgiLCJuZXh0UGFzcyIsIm5leHRQYXNzQXJndW1lbnRzIiwibmV4dEVsZW1lbnQiLCJzdWNjZXNzIiwibmV4dEVsZW1lbnRBcmd1bWVudHMiLCJhcnJheUJJbmNsdWRlc0VsZW1lbnRBIiwiaW5jbHVkZXMiLCJwdXNoIiwiY2FsbGJhY2tzIiwiY2FsbGJhY2tBcmd1bWVudHMiXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7OztRQXduQmdCQTtlQUFBQTs7UUF2RkFDO2VBQUFBOztRQTBEQUM7ZUFBQUE7O1FBeUNoQjtlQUFBOztRQTNpQmdCQztlQUFBQTs7UUFxQ0FDO2VBQUFBOztRQWdnQkFDO2VBQUFBOztRQTdRQUM7ZUFBQUE7O1FBakZBQztlQUFBQTs7UUFoR0FDO2VBQUFBOztRQW1FQUM7ZUFBQUE7O1FBaVFBQztlQUFBQTs7UUEwREFDO2VBQUFBOztRQW5hQUM7ZUFBQUE7O1FBK1BBQztlQUFBQTs7UUFwWkFDO2VBQUFBOztRQWtVQUM7ZUFBQUE7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
|