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.
@@ -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 forward = initialArguments.pop(), back = initialArguments.pop(), length = array.length, index = 0;
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
- return count === 1 ? forward(...nextArguments) : back();
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, (exception = null)=>{
83
- if (exception !== null) {
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, ...callbackArguments);
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 forward = initialArguments.pop(), back = initialArguments.pop(), length = array.length;
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, (exception = null)=>{
106
- if (exception !== null) {
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
- }, forward, index);
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 forward = initialArguments.pop(), back = initialArguments.pop(), length = array.length, index = 0;
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
- return count !== 0 ? forward(...nextArguments) : back();
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, back, (...callbackArguments)=>{
131
+ return callback(element, ...nextArguments, (...forwardArguments)=>{
132
+ forwardArguments.pop(); ///
123
133
  count++;
124
- return next(index + 1, ...callbackArguments);
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 forward = initialArguments.pop(), back = initialArguments.pop(), length = array.length, index = 0;
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, back, (...callbackArguments)=>{
138
- return next(index + 1, ...callbackArguments);
139
- }, index);
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 forward = initialArguments.pop(), back = initialArguments.pop(), length = array.length, index = 0;
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, back, (elementB, ...callbackArguments)=>{
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, ...callbackArguments);
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 forward = initialArguments.pop(), back = initialArguments.pop(), length = array.length, index = 0;
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, (exception = null)=>{
169
- if (exception !== null) {
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 forward = initialArguments.pop(), back = initialArguments.pop(), length = array.length, index = 0;
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, back, (value, ...callbackArguments)=>{
187
- return next(index + 1, value, ...callbackArguments);
188
- }, index);
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 forward = initialArguments.pop(), back = initialArguments.pop(), length = array.length, index = 0;
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, back, (...callbackArguments)=>{
200
- return next(index + 1, ...callbackArguments);
201
- }, index);
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 forward = initialArguments.pop(), back = initialArguments.pop(), length = array.length, deletedElements = [], index = length - 1;
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, back, (passed, ...callbackArguments)=>{
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, ...callbackArguments);
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 forward = initialArguments.pop(), back = initialArguments.pop(), length = array.length, index = 0;
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, back, (passed, ...callbackArguments)=>{
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, ...callbackArguments);
253
+ return forward(deletedElement, ...forwardArguments, back);
236
254
  }
237
- return next(index + 1, ...callbackArguments);
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 forward = initialArguments.pop(), back = initialArguments.pop(), length = array.length, index = 0;
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, back, (passed, ...callbackArguments)=>{
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, ...callbackArguments);
273
+ return forward(deletedElement, ...forwardArguments, back);
255
274
  }
256
- return next(index + 1, ...callbackArguments);
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 forward = initialArguments.pop(), back = initialArguments.pop(), arrayALength = arrayA.length, arrayBLength = arrayB.length;
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, back, (...callbackArguments)=>{
273
- return next(index + 1, ...callbackArguments);
274
- }, index);
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 forward = initialArguments.pop(), back = initialArguments.pop();
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, (exception = null)=>{
303
- if (exception !== null) {
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 forward = initialArguments.pop(), back = initialArguments.pop(), length = array.length, index = 0;
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, back, (...callbackArguments)=>{
326
- return next(index + 1, ...callbackArguments);
327
- }, index);
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 forward = initialArguments.pop(), back = initialArguments.pop(), length = array.length, index = length - 1;
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, back, (...callbackArguments)=>{
339
- return next(index - 1, ...callbackArguments);
340
- }, index);
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 forward = initialArguments.pop(), back = initialArguments.pop(), length = array.length, index = 0;
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, back, (...callbackArguments)=>{
352
- return next(index + 1, ...callbackArguments);
353
- }, index);
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 forward = initialArguments.pop(), back = initialArguments.pop(), length = array.length, index = length - 1;
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, back, (...callbackArguments)=>{
365
- return next(index - 1, ...callbackArguments);
366
- }, index);
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+IHtcbiAgICByZXR1cm4gY2FsbGJhY2soLi4uY2FsbGJhY2tBcmd1bWVudHMpO1xuICB9LCAuLi5pbml0aWFsQXJndW1lbnRzKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICBvbmUsXG4gIHNvbWUsXG4gIGVhY2gsXG4gIGV2ZXJ5LFxuICBtYXAsXG4gIGZpbmQsXG4gIHJlZHVjZSxcbiAgZm9yRWFjaCxcbiAgZmlsdGVyLFxuICBwcnVuZSxcbiAgZXh0cmFjdCxcbiAgbWF0Y2gsXG4gIHJlc29sdmUsXG4gIGZvcndhcmRzRXZlcnksXG4gIGJhY2t3YXJkc0V2ZXJ5LFxuICBmb3J3YXJkc0ZvckVhY2gsXG4gIGJhY2t3YXJkc0ZvckVhY2gsXG4gIGFsbCxcbiAgZXhpc3RzXG59O1xuIl0sIm5hbWVzIjpbImFsbCIsImJhY2t3YXJkc0V2ZXJ5IiwiYmFja3dhcmRzRm9yRWFjaCIsImVhY2giLCJldmVyeSIsImV4aXN0cyIsImV4dHJhY3QiLCJmaWx0ZXIiLCJmaW5kIiwiZm9yRWFjaCIsImZvcndhcmRzRXZlcnkiLCJmb3J3YXJkc0ZvckVhY2giLCJtYXAiLCJtYXRjaCIsIm9uZSIsInBydW5lIiwicmVkdWNlIiwicmVzb2x2ZSIsInNvbWUiLCJhcnJheUZpbHRlciIsImFycmF5VXRpbGl0aWVzIiwiYXJyYXkiLCJjYWxsYmFjayIsImluaXRpYWxBcmd1bWVudHMiLCJmb3J3YXJkIiwicG9wIiwiYmFjayIsImxlbmd0aCIsImluZGV4IiwibmV4dCIsIm5leHRBcmd1bWVudHMiLCJjb3VudCIsImVsZW1lbnQiLCJleGNlcHRpb24iLCJjYWxsYmFja0FyZ3VtZW50cyIsImFycmF5QiIsImVsZW1lbnRBIiwiYXJyYXlBIiwiZWxlbWVudEIiLCJpbml0aWFsVmFsdWUiLCJ2YWx1ZSIsImRlbGV0ZWRFbGVtZW50cyIsInBhc3NlZCIsInN0YXJ0SW5kZXgiLCJkZWxldGVDb3VudCIsImRlbGV0ZWRFbGVtZW50Iiwic3BsaWNlIiwidW5zaGlmdCIsInVuZGVmaW5lZCIsImFycmF5QUxlbmd0aCIsImFycmF5Qkxlbmd0aCIsIm5leHRQYXNzIiwibmV4dFBhc3NBcmd1bWVudHMiLCJuZXh0RWxlbWVudCIsInN1Y2Nlc3MiLCJuZXh0RWxlbWVudEFyZ3VtZW50cyIsImFycmF5QkluY2x1ZGVzRWxlbWVudEEiLCJpbmNsdWRlcyIsInB1c2giLCJjYWxsYmFja3MiXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7OztRQTRrQmdCQTtlQUFBQTs7UUFqRkFDO2VBQUFBOztRQXNEQUM7ZUFBQUE7O1FBdUNoQjtlQUFBOztRQXZnQmdCQztlQUFBQTs7UUFpQ0FDO2VBQUFBOztRQWdlQUM7ZUFBQUE7O1FBN1BBQztlQUFBQTs7UUE3RUFDO2VBQUFBOztRQXhGQUM7ZUFBQUE7O1FBNkRBQztlQUFBQTs7UUFtUEFDO2VBQUFBOztRQXNEQUM7ZUFBQUE7O1FBellBQztlQUFBQTs7UUErT0FDO2VBQUFBOztRQXRYQUM7ZUFBQUE7O1FBd1NBQztlQUFBQTs7UUE3RkFDO2VBQUFBOztRQStNQUM7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
428
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlsaXRpZXMvY29udGludWF0aW9uLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG5pbXBvcnQgeyBhcnJheVV0aWxpdGllcyB9IGZyb20gXCJuZWNlc3NhcnlcIjtcblxuY29uc3QgeyBmaWx0ZXI6IGFycmF5RmlsdGVyIH0gPSBhcnJheVV0aWxpdGllcztcblxuZXhwb3J0IGZ1bmN0aW9uIG9uZShhcnJheSwgY2FsbGJhY2ssIC4uLmluaXRpYWxBcmd1bWVudHMpIHtcbiAgY29uc3QgYmFjayA9IGluaXRpYWxBcmd1bWVudHMucG9wKCksXG4gICAgICAgIGZvcndhcmQgPSBpbml0aWFsQXJndW1lbnRzLnBvcCgpLFxuICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICAgIGluZGV4ID0gMDtcblxuICBmdW5jdGlvbiBuZXh0KGluZGV4LCAuLi5uZXh0QXJndW1lbnRzKSB7XG4gICAgaWYgKGluZGV4ID09PSBsZW5ndGgpIHtcbiAgICAgIGlmIChjb3VudCAhPT0gMSkge1xuICAgICAgICByZXR1cm4gYmFjaygpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZm9yd2FyZCguLi5uZXh0QXJndW1lbnRzLCBiYWNrKTtcbiAgICB9XG5cbiAgICBjb25zdCBlbGVtZW50ID0gYXJyYXlbaW5kZXhdO1xuXG4gICAgcmV0dXJuIGNhbGxiYWNrKFxuICAgICAgZWxlbWVudCxcbiAgICAgIC4uLmluaXRpYWxBcmd1bWVudHMsXG4gICAgICAoLi4uZm9yd2FyZEFyZ3VtZW50cykgPT4ge1xuICAgICAgICBmb3J3YXJkQXJndW1lbnRzLnBvcCgpOyAgLy8vXG5cbiAgICAgICAgY291bnQrKztcblxuICAgICAgICBpZiAoY291bnQgPT09IDIpIHtcbiAgICAgICAgICByZXR1cm4gYmFjaygpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5leHQoaW5kZXggKyAxLCAuLi5mb3J3YXJkQXJndW1lbnRzKTtcbiAgICAgIH0sXG4gICAgICAoLi4uYmFja0FyZ3VtZW50cykgPT4ge1xuICAgICAgICBjb25zdCBleGNlcHRpb24gPSBiYWNrQXJndW1lbnRzLnBvcCgpO1xuXG4gICAgICAgIGlmIChleGNlcHRpb24pIHtcbiAgICAgICAgICByZXR1cm4gYmFjayhleGNlcHRpb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5leHQoaW5kZXggKyAxLCAuLi5uZXh0QXJndW1lbnRzKTtcbiAgICAgIH0sXG4gICAgICBpbmRleFxuICAgICk7XG4gIH1cblxuICBsZXQgY291bnQgPSAwO1xuXG4gIHJldHVybiBuZXh0KGluZGV4LCAuLi5pbml0aWFsQXJndW1lbnRzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNvbWUoYXJyYXksIGNhbGxiYWNrLCAuLi5pbml0aWFsQXJndW1lbnRzKSB7XG4gIGNvbnN0IGJhY2sgPSBpbml0aWFsQXJndW1lbnRzLnBvcCgpLFxuICAgICAgICBmb3J3YXJkID0gaW5pdGlhbEFyZ3VtZW50cy5wb3AoKSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gIGZ1bmN0aW9uIG5leHQoaW5kZXgpIHtcbiAgICBpZiAoaW5kZXggPT09IGxlbmd0aCkge1xuICAgICAgcmV0dXJuIGJhY2soKTtcbiAgICB9XG5cbiAgICBjb25zdCBlbGVtZW50ID0gYXJyYXlbaW5kZXhdO1xuXG4gICAgcmV0dXJuIGNhbGxiYWNrKFxuICAgICAgZWxlbWVudCxcbiAgICAgIC4uLmluaXRpYWxBcmd1bWVudHMsXG4gICAgICBmb3J3YXJkLFxuICAgICAgKC4uLmJhY2tBcmd1bWVudHMpID0+IHtcbiAgICAgICAgY29uc3QgZXhjZXB0aW9uID0gYmFja0FyZ3VtZW50cy5wb3AoKTtcblxuICAgICAgICBpZiAoZXhjZXB0aW9uKSB7XG4gICAgICAgICAgcmV0dXJuIGJhY2soZXhjZXB0aW9uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXh0KGluZGV4ICsgMSk7XG4gICAgICB9LFxuICAgICAgaW5kZXhcbiAgICApO1xuICB9XG5cbiAgY29uc3QgaW5kZXggPSAwO1xuXG4gIHJldHVybiBuZXh0KGluZGV4KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVhY2goYXJyYXksIGNhbGxiYWNrLCAuLi5pbml0aWFsQXJndW1lbnRzKSB7XG4gIGNvbnN0IGJhY2sgPSBpbml0aWFsQXJndW1lbnRzLnBvcCgpLFxuICAgICAgICBmb3J3YXJkID0gaW5pdGlhbEFyZ3VtZW50cy5wb3AoKSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgICBpbmRleCA9IDA7XG5cbiAgZnVuY3Rpb24gbmV4dChpbmRleCwgLi4ubmV4dEFyZ3VtZW50cykge1xuICAgIGlmIChpbmRleCA9PT0gbGVuZ3RoKSB7XG4gICAgICBpZiAoY291bnQgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIGJhY2soKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZvcndhcmQoLi4ubmV4dEFyZ3VtZW50cywgYmFjayk7XG4gICAgfVxuXG4gICAgY29uc3QgZWxlbWVudCA9IGFycmF5W2luZGV4XTtcblxuICAgIHJldHVybiBjYWxsYmFjayhcbiAgICAgIGVsZW1lbnQsXG4gICAgICAuLi5uZXh0QXJndW1lbnRzLFxuICAgICAgKC4uLmZvcndhcmRBcmd1bWVudHMpID0+IHtcbiAgICAgICAgZm9yd2FyZEFyZ3VtZW50cy5wb3AoKTsgIC8vL1xuXG4gICAgICAgIGNvdW50Kys7XG5cbiAgICAgICAgcmV0dXJuIG5leHQoaW5kZXggKyAxLCAuLi5mb3J3YXJkQXJndW1lbnRzKTtcbiAgICAgIH0sXG4gICAgICBiYWNrLFxuICAgICAgaW5kZXhcbiAgICApO1xuICB9XG5cbiAgbGV0IGNvdW50ID0gMDtcblxuICByZXR1cm4gbmV4dChpbmRleCwgLi4uaW5pdGlhbEFyZ3VtZW50cyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBldmVyeShhcnJheSwgY2FsbGJhY2ssIC4uLmluaXRpYWxBcmd1bWVudHMpIHtcbiAgY29uc3QgYmFjayA9IGluaXRpYWxBcmd1bWVudHMucG9wKCksXG4gICAgICAgIGZvcndhcmQgPSBpbml0aWFsQXJndW1lbnRzLnBvcCgpLFxuICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICAgIGluZGV4ID0gMDtcblxuICBmdW5jdGlvbiBuZXh0KGluZGV4LCAuLi5uZXh0QXJndW1lbnRzKSB7XG4gICAgaWYgKGluZGV4ID09PSBsZW5ndGgpIHtcbiAgICAgIHJldHVybiBmb3J3YXJkKC4uLm5leHRBcmd1bWVudHMsIGJhY2spO1xuICAgIH1cblxuICAgIGNvbnN0IGVsZW1lbnQgPSBhcnJheVtpbmRleF07XG5cbiAgICByZXR1cm4gY2FsbGJhY2soXG4gICAgICBlbGVtZW50LFxuICAgICAgLi4ubmV4dEFyZ3VtZW50cyxcbiAgICAgICguLi5mb3J3YXJkQXJndW1lbnRzKSA9PiB7XG4gICAgICAgIGZvcndhcmRBcmd1bWVudHMucG9wKCk7ICAvLy9cblxuICAgICAgICByZXR1cm4gbmV4dChpbmRleCArIDEsIC4uLmZvcndhcmRBcmd1bWVudHMpO1xuICAgICAgfSxcbiAgICAgIGJhY2ssXG4gICAgICBpbmRleFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gbmV4dChpbmRleCwgLi4uaW5pdGlhbEFyZ3VtZW50cyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtYXAoYXJyYXksIGNhbGxiYWNrLCAuLi5pbml0aWFsQXJndW1lbnRzKSB7XG4gIGNvbnN0IGJhY2sgPSBpbml0aWFsQXJndW1lbnRzLnBvcCgpLFxuICAgICAgICBmb3J3YXJkID0gaW5pdGlhbEFyZ3VtZW50cy5wb3AoKSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgICBpbmRleCA9IDA7XG5cbiAgZnVuY3Rpb24gbmV4dChpbmRleCwgYXJyYXlCLCAuLi5uZXh0QXJndW1lbnRzKSB7XG4gICAgaWYgKGluZGV4ID09PSBsZW5ndGgpIHtcbiAgICAgIHJldHVybiBmb3J3YXJkKGFycmF5QiwgLi4ubmV4dEFyZ3VtZW50cywgYmFjayk7XG4gICAgfVxuXG4gICAgY29uc3QgZWxlbWVudEEgPSBhcnJheUFbaW5kZXhdO1xuXG4gICAgcmV0dXJuIGNhbGxiYWNrKFxuICAgICAgZWxlbWVudEEsXG4gICAgICAuLi5uZXh0QXJndW1lbnRzLFxuICAgICAgKGVsZW1lbnRCLCAuLi5mb3J3YXJkQXJndW1lbnRzKSA9PiB7XG4gICAgICAgIGZvcndhcmRBcmd1bWVudHMucG9wKCk7ICAvLy9cblxuICAgICAgICBhcnJheUIgPSBbICAvLy9cbiAgICAgICAgICAuLi5hcnJheUIsXG4gICAgICAgICAgZWxlbWVudEJcbiAgICAgICAgXTtcblxuICAgICAgICByZXR1cm4gbmV4dChpbmRleCArIDEsIGFycmF5QiwgLi4uZm9yd2FyZEFyZ3VtZW50cyk7XG4gICAgICB9LFxuICAgICAgYmFjayxcbiAgICAgIGluZGV4XG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IGFycmF5QSA9IGFycmF5LCAvLy9cbiAgICAgICAgYXJyYXlCID0gW107XG5cbiAgcmV0dXJuIG5leHQoaW5kZXgsIGFycmF5QiwgLi4uaW5pdGlhbEFyZ3VtZW50cyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kKGFycmF5LCBjYWxsYmFjaywgLi4uaW5pdGlhbEFyZ3VtZW50cykge1xuICBjb25zdCBiYWNrID0gaW5pdGlhbEFyZ3VtZW50cy5wb3AoKSxcbiAgICAgICAgZm9yd2FyZCA9IGluaXRpYWxBcmd1bWVudHMucG9wKCksXG4gICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgaW5kZXggPSAwO1xuXG4gIGZ1bmN0aW9uIG5leHQoaW5kZXgsIC4uLm5leHRBcmd1bWVudHMpIHtcbiAgICBpZiAoaW5kZXggPT09IGxlbmd0aCkge1xuICAgICAgcmV0dXJuIGJhY2soKTtcbiAgICB9XG5cbiAgICBjb25zdCBlbGVtZW50ID0gYXJyYXlbaW5kZXhdO1xuXG4gICAgcmV0dXJuIGNhbGxiYWNrKFxuICAgICAgZWxlbWVudCxcbiAgICAgIC4uLm5leHRBcmd1bWVudHMsXG4gICAgICAoLi4uZm9yd2FyZEFyZ3VtZW50cykgPT4ge1xuICAgICAgICBmb3J3YXJkQXJndW1lbnRzLnBvcCgpOyAgLy8vXG5cbiAgICAgICAgcmV0dXJuIGZvcndhcmQoZWxlbWVudCwgLi4uZm9yd2FyZEFyZ3VtZW50cywgYmFjayk7XG4gICAgICB9LFxuICAgICAgKC4uLmJhY2tBcmd1bWVudHMpID0+IHtcbiAgICAgICAgY29uc3QgZXhjZXB0aW9uID0gYmFja0FyZ3VtZW50cy5wb3AoKTtcblxuICAgICAgICBpZiAoZXhjZXB0aW9uKSB7XG4gICAgICAgICAgcmV0dXJuIGJhY2soZXhjZXB0aW9uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXh0KGluZGV4ICsgMSwgLi4ubmV4dEFyZ3VtZW50cyk7XG4gICAgICB9LFxuICAgICAgaW5kZXhcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIG5leHQoaW5kZXgsIC4uLmluaXRpYWxBcmd1bWVudHMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVkdWNlKGFycmF5LCBpbml0aWFsVmFsdWUsIGNhbGxiYWNrLCAuLi5pbml0aWFsQXJndW1lbnRzKSB7XG4gIGNvbnN0IGJhY2sgPSBpbml0aWFsQXJndW1lbnRzLnBvcCgpLFxuICAgICAgICBmb3J3YXJkID0gaW5pdGlhbEFyZ3VtZW50cy5wb3AoKSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgICBpbmRleCA9IDA7XG5cbiAgZnVuY3Rpb24gbmV4dChpbmRleCwgdmFsdWUsIC4uLm5leHRBcmd1bWVudHMpIHtcbiAgICBpZiAoaW5kZXggPT09IGxlbmd0aCkge1xuICAgICAgcmV0dXJuIGZvcndhcmQodmFsdWUsIC4uLm5leHRBcmd1bWVudHMsIGJhY2spO1xuICAgIH1cblxuICAgIGNvbnN0IGVsZW1lbnQgPSBhcnJheVtpbmRleF07XG5cbiAgICByZXR1cm4gY2FsbGJhY2soXG4gICAgICBlbGVtZW50LFxuICAgICAgdmFsdWUsXG4gICAgICAuLi5uZXh0QXJndW1lbnRzLFxuICAgICAgKHZhbHVlLCAuLi5mb3J3YXJkQXJndW1lbnRzKSA9PiB7XG4gICAgICAgIGZvcndhcmRBcmd1bWVudHMucG9wKCk7ICAvLy9cblxuICAgICAgICByZXR1cm4gbmV4dChpbmRleCArIDEsIHZhbHVlLCAuLi5mb3J3YXJkQXJndW1lbnRzKTtcbiAgICAgIH0sXG4gICAgICBiYWNrLFxuICAgICAgaW5kZXhcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIG5leHQoaW5kZXgsIGluaXRpYWxWYWx1ZSwgLi4uaW5pdGlhbEFyZ3VtZW50cyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JFYWNoKGFycmF5LCBjYWxsYmFjaywgLi4uaW5pdGlhbEFyZ3VtZW50cykge1xuICBjb25zdCBiYWNrID0gaW5pdGlhbEFyZ3VtZW50cy5wb3AoKSxcbiAgICAgICAgZm9yd2FyZCA9IGluaXRpYWxBcmd1bWVudHMucG9wKCksXG4gICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgaW5kZXggPSAwO1xuXG4gIGZ1bmN0aW9uIG5leHQoaW5kZXgsIC4uLm5leHRBcmd1bWVudHMpIHtcbiAgICBpZiAoaW5kZXggPT09IGxlbmd0aCkge1xuICAgICAgcmV0dXJuIGZvcndhcmQoLi4ubmV4dEFyZ3VtZW50cywgYmFjayk7XG4gICAgfVxuXG4gICAgY29uc3QgZWxlbWVudCA9IGFycmF5W2luZGV4XTtcblxuICAgIHJldHVybiBjYWxsYmFjayhcbiAgICAgIGVsZW1lbnQsXG4gICAgICAuLi5uZXh0QXJndW1lbnRzLFxuICAgICAgKC4uLmZvcndhcmRBcmd1bWVudHMpID0+IHtcbiAgICAgICAgZm9yd2FyZEFyZ3VtZW50cy5wb3AoKTsgIC8vL1xuXG4gICAgICAgIHJldHVybiBuZXh0KGluZGV4ICsgMSwgLi4uZm9yd2FyZEFyZ3VtZW50cyk7XG4gICAgICB9LFxuICAgICAgYmFjayxcbiAgICAgIGluZGV4XG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBuZXh0KGluZGV4LCAuLi5pbml0aWFsQXJndW1lbnRzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbHRlcihhcnJheSwgY2FsbGJhY2ssIC4uLmluaXRpYWxBcmd1bWVudHMpIHtcbiAgY29uc3QgYmFjayA9IGluaXRpYWxBcmd1bWVudHMucG9wKCksXG4gICAgICAgIGZvcndhcmQgPSBpbml0aWFsQXJndW1lbnRzLnBvcCgpLFxuICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICAgIGRlbGV0ZWRFbGVtZW50cyA9IFtdLFxuICAgICAgICBpbmRleCA9IGxlbmd0aCAtIDE7XG5cbiAgZnVuY3Rpb24gbmV4dChpbmRleCwgLi4ubmV4dEFyZ3VtZW50cykge1xuICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgIHJldHVybiBmb3J3YXJkKGRlbGV0ZWRFbGVtZW50cywgLi4ubmV4dEFyZ3VtZW50cywgYmFjayk7XG4gICAgfVxuXG4gICAgY29uc3QgZWxlbWVudCA9IGFycmF5W2luZGV4XTtcblxuICAgIHJldHVybiBjYWxsYmFjayhcbiAgICAgIGVsZW1lbnQsXG4gICAgICAuLi5uZXh0QXJndW1lbnRzLFxuICAgICAgKHBhc3NlZCwgLi4uZm9yd2FyZEFyZ3VtZW50cykgPT4ge1xuICAgICAgICBmb3J3YXJkQXJndW1lbnRzLnBvcCgpOyAgLy8vXG5cbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICBjb25zdCBzdGFydEluZGV4ID0gaW5kZXgsIC8vL1xuICAgICAgICAgICAgICAgIGRlbGV0ZUNvdW50ID0gMSxcbiAgICAgICAgICAgICAgICBkZWxldGVkRWxlbWVudCA9IGVsZW1lbnQ7IC8vL1xuXG4gICAgICAgICAgYXJyYXkuc3BsaWNlKHN0YXJ0SW5kZXgsIGRlbGV0ZUNvdW50KTtcblxuICAgICAgICAgIGRlbGV0ZWRFbGVtZW50cy51bnNoaWZ0KGRlbGV0ZWRFbGVtZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXh0KGluZGV4IC0gMSwgLi4uZm9yd2FyZEFyZ3VtZW50cyk7XG4gICAgICB9LFxuICAgICAgYmFjayxcbiAgICAgIGluZGV4XG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBuZXh0KGluZGV4LCAuLi5pbml0aWFsQXJndW1lbnRzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBydW5lKGFycmF5LCBjYWxsYmFjaywgLi4uaW5pdGlhbEFyZ3VtZW50cykge1xuICBjb25zdCBiYWNrID0gaW5pdGlhbEFyZ3VtZW50cy5wb3AoKSxcbiAgICAgICAgZm9yd2FyZCA9IGluaXRpYWxBcmd1bWVudHMucG9wKCksXG4gICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgaW5kZXggPSAwO1xuXG4gIGZ1bmN0aW9uIG5leHQoaW5kZXgsIC4uLm5leHRBcmd1bWVudHMpIHtcbiAgICBpZiAoaW5kZXggPT09IGxlbmd0aCkge1xuICAgICAgY29uc3QgZGVsZXRlZEVsZW1lbnQgPSB1bmRlZmluZWQ7XG5cbiAgICAgIHJldHVybiBmb3J3YXJkKGRlbGV0ZWRFbGVtZW50LCAuLi5uZXh0QXJndW1lbnRzLCBiYWNrKTtcbiAgICB9XG5cbiAgICBjb25zdCBlbGVtZW50ID0gYXJyYXlbaW5kZXhdO1xuXG4gICAgcmV0dXJuIGNhbGxiYWNrKFxuICAgICAgZWxlbWVudCxcbiAgICAgIC4uLm5leHRBcmd1bWVudHMsXG4gICAgICAocGFzc2VkLCAuLi5mb3J3YXJkQXJndW1lbnRzKSA9PiB7XG4gICAgICAgIGZvcndhcmRBcmd1bWVudHMucG9wKCk7ICAvLy9cblxuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgIGNvbnN0IHN0YXJ0SW5kZXggPSBpbmRleCwgLy8vXG4gICAgICAgICAgICAgICAgZGVsZXRlQ291bnQgPSAxLFxuICAgICAgICAgICAgICAgIGRlbGV0ZWRFbGVtZW50ID0gZWxlbWVudDsgLy8vXG5cbiAgICAgICAgICBhcnJheS5zcGxpY2Uoc3RhcnRJbmRleCwgZGVsZXRlQ291bnQpO1xuXG4gICAgICAgICAgcmV0dXJuIGZvcndhcmQoZGVsZXRlZEVsZW1lbnQsIC4uLmZvcndhcmRBcmd1bWVudHMsIGJhY2spO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5leHQoaW5kZXggKyAxLCAuLi5mb3J3YXJkQXJndW1lbnRzKTtcbiAgICAgIH0sXG4gICAgICBiYWNrLFxuICAgICAgaW5kZXhcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIG5leHQoaW5kZXgsIC4uLmluaXRpYWxBcmd1bWVudHMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdChhcnJheSwgY2FsbGJhY2ssIC4uLmluaXRpYWxBcmd1bWVudHMpIHtcbiAgY29uc3QgYmFjayA9IGluaXRpYWxBcmd1bWVudHMucG9wKCksXG4gICAgICAgIGZvcndhcmQgPSBpbml0aWFsQXJndW1lbnRzLnBvcCgpLFxuICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICAgIGluZGV4ID0gMDtcblxuICBmdW5jdGlvbiBuZXh0KGluZGV4LCAuLi5uZXh0QXJndW1lbnRzKSB7XG4gICAgaWYgKGluZGV4ID09PSBsZW5ndGgpIHtcbiAgICAgIGNvbnN0IGRlbGV0ZWRFbGVtZW50ID0gdW5kZWZpbmVkO1xuXG4gICAgICByZXR1cm4gZm9yd2FyZChkZWxldGVkRWxlbWVudCwgLi4ubmV4dEFyZ3VtZW50cywgYmFjayk7XG4gICAgfVxuXG4gICAgY29uc3QgZWxlbWVudCA9IGFycmF5W2luZGV4XTtcblxuICAgIHJldHVybiBjYWxsYmFjayhcbiAgICAgIGVsZW1lbnQsXG4gICAgICAuLi5uZXh0QXJndW1lbnRzLFxuICAgICAgKHBhc3NlZCwgLi4uZm9yd2FyZEFyZ3VtZW50cykgPT4ge1xuICAgICAgICBmb3J3YXJkQXJndW1lbnRzLnBvcCgpOyAgLy8vXG5cbiAgICAgICAgaWYgKHBhc3NlZCkge1xuICAgICAgICAgIGNvbnN0IHN0YXJ0SW5kZXggPSBpbmRleCwgLy8vXG4gICAgICAgICAgICAgICAgZGVsZXRlQ291bnQgPSAxLFxuICAgICAgICAgICAgICAgIGRlbGV0ZWRFbGVtZW50ID0gZWxlbWVudDsgLy8vXG5cbiAgICAgICAgICBhcnJheS5zcGxpY2Uoc3RhcnRJbmRleCwgZGVsZXRlQ291bnQpO1xuXG4gICAgICAgICAgcmV0dXJuIGZvcndhcmQoZGVsZXRlZEVsZW1lbnQsIC4uLmZvcndhcmRBcmd1bWVudHMsIGJhY2spO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5leHQoaW5kZXggKyAxLCAuLi5mb3J3YXJkQXJndW1lbnRzKTtcbiAgICAgIH0sXG4gICAgICBiYWNrLFxuICAgICAgaW5kZXhcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIG5leHQoaW5kZXgsIC4uLmluaXRpYWxBcmd1bWVudHMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWF0Y2goYXJyYXlBLCBhcnJheUIsIGNhbGxiYWNrLCAuLi5pbml0aWFsQXJndW1lbnRzKSB7XG4gIGNvbnN0IGJhY2sgPSBpbml0aWFsQXJndW1lbnRzLnBvcCgpLFxuICAgICAgICBmb3J3YXJkID0gaW5pdGlhbEFyZ3VtZW50cy5wb3AoKSxcbiAgICAgICAgYXJyYXlBTGVuZ3RoID0gYXJyYXlBLmxlbmd0aCxcbiAgICAgICAgYXJyYXlCTGVuZ3RoID0gYXJyYXlCLmxlbmd0aDtcblxuICBpZiAoYXJyYXlBTGVuZ3RoICE9PSBhcnJheUJMZW5ndGgpIHtcbiAgICByZXR1cm4gYmFjaygpO1xuICB9XG5cbiAgY29uc3QgbGVuZ3RoID0gYXJyYXlBTGVuZ3RoLCAgLy8vXG4gICAgICAgIGluZGV4ID0gMDtcblxuICBmdW5jdGlvbiBuZXh0KGluZGV4LCAuLi5uZXh0QXJndW1lbnRzKSB7XG4gICAgaWYgKGluZGV4ID09PSBsZW5ndGgpIHtcbiAgICAgIHJldHVybiBmb3J3YXJkKC4uLm5leHRBcmd1bWVudHMsIGJhY2spO1xuICAgIH1cblxuICAgIGNvbnN0IGVsZW1lbnRBID0gYXJyYXlBW2luZGV4XSxcbiAgICAgICAgICBlbGVtZW50QiA9IGFycmF5QltpbmRleF07XG5cbiAgICByZXR1cm4gY2FsbGJhY2soXG4gICAgICBlbGVtZW50QSxcbiAgICAgIGVsZW1lbnRCLFxuICAgICAgLi4ubmV4dEFyZ3VtZW50cyxcbiAgICAgICguLi5mb3J3YXJkQXJndW1lbnRzKSA9PiB7XG4gICAgICAgIGZvcndhcmRBcmd1bWVudHMucG9wKCk7ICAvLy9cblxuICAgICAgICByZXR1cm4gbmV4dChpbmRleCArIDEsIC4uLmZvcndhcmRBcmd1bWVudHMpO1xuICAgICAgfSxcbiAgICAgIGJhY2ssXG4gICAgICBpbmRleFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gbmV4dChpbmRleCwgLi4uaW5pdGlhbEFyZ3VtZW50cyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlKGFycmF5QSwgYXJyYXlCLCBjYWxsYmFjaywgLi4uaW5pdGlhbEFyZ3VtZW50cykge1xuICBhcnJheUEgPSBbICAvLy9cbiAgICAuLi5hcnJheUFcbiAgXTtcblxuICBjb25zdCBiYWNrID0gaW5pdGlhbEFyZ3VtZW50cy5wb3AoKSxcbiAgICAgICAgZm9yd2FyZCA9IGluaXRpYWxBcmd1bWVudHMucG9wKCk7XG5cbiAgZnVuY3Rpb24gbmV4dFBhc3MoLi4ubmV4dFBhc3NBcmd1bWVudHMpIHtcbiAgICBjb25zdCBsZW5ndGggPSBhcnJheUEubGVuZ3RoOyAvLy9cblxuICAgIGlmIChsZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBmb3J3YXJkKC4uLm5leHRQYXNzQXJndW1lbnRzLCBiYWNrKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBuZXh0RWxlbWVudChpbmRleCwgc3VjY2VzcywgLi4ubmV4dEVsZW1lbnRBcmd1bWVudHMpIHtcbiAgICAgIGlmIChpbmRleCA9PT0gbGVuZ3RoKSB7XG4gICAgICAgIGlmICghc3VjY2Vzcykge1xuICAgICAgICAgIHJldHVybiBiYWNrKCk7XG4gICAgICAgIH1cblxuICAgICAgICBhcnJheUZpbHRlcihhcnJheUEsIChlbGVtZW50QSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGFycmF5QkluY2x1ZGVzRWxlbWVudEEgPSBhcnJheUIuaW5jbHVkZXMoZWxlbWVudEEpO1xuXG4gICAgICAgICAgaWYgKCFhcnJheUJJbmNsdWRlc0VsZW1lbnRBKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBuZXh0UGFzcyguLi5uZXh0RWxlbWVudEFyZ3VtZW50cyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVsZW1lbnRBID0gYXJyYXlBW2luZGV4XTtcblxuICAgICAgcmV0dXJuIGNhbGxiYWNrKFxuICAgICAgICBlbGVtZW50QSxcbiAgICAgICAgLi4ubmV4dEVsZW1lbnRBcmd1bWVudHMsXG4gICAgICAgICguLi5mb3J3YXJkQXJndW1lbnRzKSA9PiB7XG4gICAgICAgICAgZm9yd2FyZEFyZ3VtZW50cy5wb3AoKTsgIC8vL1xuXG4gICAgICAgICAgY29uc3QgZWxlbWVudEIgPSBlbGVtZW50QTsgIC8vL1xuXG4gICAgICAgICAgYXJyYXlCLnB1c2goZWxlbWVudEIpO1xuXG4gICAgICAgICAgcmV0dXJuIG5leHRFbGVtZW50KGluZGV4ICsgMSwgdHJ1ZSwgLi4uZm9yd2FyZEFyZ3VtZW50cyk7XG4gICAgICAgIH0sXG4gICAgICAgICguLi5iYWNrQXJndW1lbnRzKSA9PiB7XG4gICAgICAgICAgY29uc3QgZXhjZXB0aW9uID0gYmFja0FyZ3VtZW50cy5wb3AoKTtcblxuICAgICAgICAgIGlmIChleGNlcHRpb24pIHtcbiAgICAgICAgICAgIHJldHVybiBiYWNrKGV4Y2VwdGlvbik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIG5leHRFbGVtZW50KGluZGV4ICsgMSwgc3VjY2VzcywgLi4ubmV4dEVsZW1lbnRBcmd1bWVudHMpO1xuICAgICAgICB9LFxuICAgICAgICBpbmRleFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBpbmRleCA9IDAsXG4gICAgICAgICAgc3VjY2VzcyA9IGZhbHNlO1xuXG4gICAgcmV0dXJuIG5leHRFbGVtZW50KGluZGV4LCBzdWNjZXNzLCAuLi5uZXh0UGFzc0FyZ3VtZW50cyk7XG4gIH1cblxuICByZXR1cm4gbmV4dFBhc3MoLi4uaW5pdGlhbEFyZ3VtZW50cyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3J3YXJkc0V2ZXJ5KGFycmF5LCBjYWxsYmFjaywgLi4uaW5pdGlhbEFyZ3VtZW50cykge1xuICBjb25zdCBiYWNrID0gaW5pdGlhbEFyZ3VtZW50cy5wb3AoKSxcbiAgICAgICAgZm9yd2FyZCA9IGluaXRpYWxBcmd1bWVudHMucG9wKCksXG4gICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgaW5kZXggPSAwO1xuXG4gIGZ1bmN0aW9uIG5leHQoaW5kZXgsIC4uLm5leHRBcmd1bWVudHMpIHtcbiAgICBpZiAoaW5kZXggPT09IGxlbmd0aCkge1xuICAgICAgcmV0dXJuIGZvcndhcmQoLi4ubmV4dEFyZ3VtZW50cywgYmFjayk7XG4gICAgfVxuXG4gICAgY29uc3QgZWxlbWVudCA9IGFycmF5W2luZGV4XTtcblxuICAgIHJldHVybiBjYWxsYmFjayhcbiAgICAgIGVsZW1lbnQsXG4gICAgICAuLi5uZXh0QXJndW1lbnRzLFxuICAgICAgKC4uLmZvcndhcmRBcmd1bWVudHMpID0+IHtcbiAgICAgICAgZm9yd2FyZEFyZ3VtZW50cy5wb3AoKTsgIC8vL1xuXG4gICAgICAgIHJldHVybiBuZXh0KGluZGV4ICsgMSwgLi4uZm9yd2FyZEFyZ3VtZW50cyk7XG4gICAgICB9LFxuICAgICAgYmFjayxcbiAgICAgIGluZGV4XG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBuZXh0KGluZGV4LCAuLi5pbml0aWFsQXJndW1lbnRzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJhY2t3YXJkc0V2ZXJ5KGFycmF5LCBjYWxsYmFjaywgLi4uaW5pdGlhbEFyZ3VtZW50cykge1xuICBjb25zdCBiYWNrID0gaW5pdGlhbEFyZ3VtZW50cy5wb3AoKSxcbiAgICAgICAgZm9yd2FyZCA9IGluaXRpYWxBcmd1bWVudHMucG9wKCksXG4gICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgaW5kZXggPSBsZW5ndGggLSAxO1xuXG4gIGZ1bmN0aW9uIG5leHQoaW5kZXgsIC4uLm5leHRBcmd1bWVudHMpIHtcbiAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICByZXR1cm4gZm9yd2FyZCguLi5uZXh0QXJndW1lbnRzLCBiYWNrKTtcbiAgICB9XG5cbiAgICBjb25zdCBlbGVtZW50ID0gYXJyYXlbaW5kZXhdO1xuXG4gICAgcmV0dXJuIGNhbGxiYWNrKFxuICAgICAgZWxlbWVudCxcbiAgICAgIC4uLm5leHRBcmd1bWVudHMsXG4gICAgICAoLi4uZm9yd2FyZEFyZ3VtZW50cykgPT4ge1xuICAgICAgICBmb3J3YXJkQXJndW1lbnRzLnBvcCgpOyAgLy8vXG5cbiAgICAgICAgcmV0dXJuIG5leHQoaW5kZXggLSAxLCAuLi5mb3J3YXJkQXJndW1lbnRzKTtcbiAgICAgIH0sXG4gICAgICBiYWNrLFxuICAgICAgaW5kZXhcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIG5leHQoaW5kZXgsIC4uLmluaXRpYWxBcmd1bWVudHMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZm9yd2FyZHNGb3JFYWNoKGFycmF5LCBjYWxsYmFjaywgLi4uaW5pdGlhbEFyZ3VtZW50cykge1xuICBjb25zdCBiYWNrID0gaW5pdGlhbEFyZ3VtZW50cy5wb3AoKSxcbiAgICAgICAgZm9yd2FyZCA9IGluaXRpYWxBcmd1bWVudHMucG9wKCksXG4gICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgaW5kZXggPSAwO1xuXG4gIGZ1bmN0aW9uIG5leHQoaW5kZXgsIC4uLm5leHRBcmd1bWVudHMpIHtcbiAgICBpZiAoaW5kZXggPT09IGxlbmd0aCkge1xuICAgICAgcmV0dXJuIGZvcndhcmQoLi4ubmV4dEFyZ3VtZW50cywgYmFjayk7XG4gICAgfVxuXG4gICAgY29uc3QgZWxlbWVudCA9IGFycmF5W2luZGV4XTtcblxuICAgIHJldHVybiBjYWxsYmFjayhcbiAgICAgIGVsZW1lbnQsXG4gICAgICAuLi5uZXh0QXJndW1lbnRzLFxuICAgICAgKC4uLmZvcndhcmRBcmd1bWVudHMpID0+IHtcbiAgICAgICAgZm9yd2FyZEFyZ3VtZW50cy5wb3AoKTsgIC8vL1xuXG4gICAgICAgIHJldHVybiBuZXh0KGluZGV4ICsgMSwgLi4uZm9yd2FyZEFyZ3VtZW50cyk7XG4gICAgICB9LFxuICAgICAgYmFjayxcbiAgICAgIGluZGV4XG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBuZXh0KGluZGV4LCAuLi5pbml0aWFsQXJndW1lbnRzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJhY2t3YXJkc0ZvckVhY2goYXJyYXksIGNhbGxiYWNrLCAuLi5pbml0aWFsQXJndW1lbnRzKSB7XG4gIGNvbnN0IGJhY2sgPSBpbml0aWFsQXJndW1lbnRzLnBvcCgpLFxuICAgICAgICBmb3J3YXJkID0gaW5pdGlhbEFyZ3VtZW50cy5wb3AoKSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgICBpbmRleCA9IGxlbmd0aCAtIDE7XG5cbiAgZnVuY3Rpb24gbmV4dChpbmRleCwgLi4ubmV4dEFyZ3VtZW50cykge1xuICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgIHJldHVybiBmb3J3YXJkKC4uLm5leHRBcmd1bWVudHMsIGJhY2spO1xuICAgIH1cblxuICAgIGNvbnN0IGVsZW1lbnQgPSBhcnJheVtpbmRleF07XG5cbiAgICByZXR1cm4gY2FsbGJhY2soXG4gICAgICBlbGVtZW50LFxuICAgICAgLi4ubmV4dEFyZ3VtZW50cyxcbiAgICAgICguLi5mb3J3YXJkQXJndW1lbnRzKSA9PiB7XG4gICAgICAgIGZvcndhcmRBcmd1bWVudHMucG9wKCk7ICAvLy9cblxuICAgICAgICByZXR1cm4gbmV4dChpbmRleCAtIDEsIC4uLmZvcndhcmRBcmd1bWVudHMpO1xuICAgICAgfSxcbiAgICAgIGJhY2ssXG4gICAgICBpbmRleFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gbmV4dChpbmRleCwgLi4uaW5pdGlhbEFyZ3VtZW50cyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhbGwoY2FsbGJhY2tzLCAuLi5pbml0aWFsQXJndW1lbnRzKSB7XG4gIHJldHVybiBldmVyeShjYWxsYmFja3MsIChjYWxsYmFjaywgLi4uY2FsbGJhY2tBcmd1bWVudHMpID0+IHtcbiAgICByZXR1cm4gY2FsbGJhY2soLi4uY2FsbGJhY2tBcmd1bWVudHMpO1xuICB9LCAuLi5pbml0aWFsQXJndW1lbnRzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4aXN0cyhjYWxsYmFja3MsIC4uLmluaXRpYWxBcmd1bWVudHMpIHtcbiAgcmV0dXJuIHNvbWUoY2FsbGJhY2tzLCAoY2FsbGJhY2ssIC4uLmNhbGxiYWNrQXJndW1lbnRzKSA9PiB7XG4gICAgcmV0dXJuIGNhbGxiYWNrKC4uLmNhbGxiYWNrQXJndW1lbnRzKTtcbiAgfSwgLi4uaW5pdGlhbEFyZ3VtZW50cyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgb25lLFxuICBzb21lLFxuICBlYWNoLFxuICBldmVyeSxcbiAgbWFwLFxuICBmaW5kLFxuICByZWR1Y2UsXG4gIGZvckVhY2gsXG4gIGZpbHRlcixcbiAgcHJ1bmUsXG4gIGV4dHJhY3QsXG4gIG1hdGNoLFxuICByZXNvbHZlLFxuICBmb3J3YXJkc0V2ZXJ5LFxuICBiYWNrd2FyZHNFdmVyeSxcbiAgZm9yd2FyZHNGb3JFYWNoLFxuICBiYWNrd2FyZHNGb3JFYWNoLFxuICBhbGwsXG4gIGV4aXN0c1xufTtcbiJdLCJuYW1lcyI6WyJhbGwiLCJiYWNrd2FyZHNFdmVyeSIsImJhY2t3YXJkc0ZvckVhY2giLCJlYWNoIiwiZXZlcnkiLCJleGlzdHMiLCJleHRyYWN0IiwiZmlsdGVyIiwiZmluZCIsImZvckVhY2giLCJmb3J3YXJkc0V2ZXJ5IiwiZm9yd2FyZHNGb3JFYWNoIiwibWFwIiwibWF0Y2giLCJvbmUiLCJwcnVuZSIsInJlZHVjZSIsInJlc29sdmUiLCJzb21lIiwiYXJyYXlGaWx0ZXIiLCJhcnJheVV0aWxpdGllcyIsImFycmF5IiwiY2FsbGJhY2siLCJpbml0aWFsQXJndW1lbnRzIiwiYmFjayIsInBvcCIsImZvcndhcmQiLCJsZW5ndGgiLCJpbmRleCIsIm5leHQiLCJuZXh0QXJndW1lbnRzIiwiY291bnQiLCJlbGVtZW50IiwiZm9yd2FyZEFyZ3VtZW50cyIsImJhY2tBcmd1bWVudHMiLCJleGNlcHRpb24iLCJhcnJheUIiLCJlbGVtZW50QSIsImFycmF5QSIsImVsZW1lbnRCIiwiaW5pdGlhbFZhbHVlIiwidmFsdWUiLCJkZWxldGVkRWxlbWVudHMiLCJwYXNzZWQiLCJzdGFydEluZGV4IiwiZGVsZXRlQ291bnQiLCJkZWxldGVkRWxlbWVudCIsInNwbGljZSIsInVuc2hpZnQiLCJ1bmRlZmluZWQiLCJhcnJheUFMZW5ndGgiLCJhcnJheUJMZW5ndGgiLCJuZXh0UGFzcyIsIm5leHRQYXNzQXJndW1lbnRzIiwibmV4dEVsZW1lbnQiLCJzdWNjZXNzIiwibmV4dEVsZW1lbnRBcmd1bWVudHMiLCJhcnJheUJJbmNsdWRlc0VsZW1lbnRBIiwiaW5jbHVkZXMiLCJwdXNoIiwiY2FsbGJhY2tzIiwiY2FsbGJhY2tBcmd1bWVudHMiXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7OztRQXduQmdCQTtlQUFBQTs7UUF2RkFDO2VBQUFBOztRQTBEQUM7ZUFBQUE7O1FBeUNoQjtlQUFBOztRQTNpQmdCQztlQUFBQTs7UUFxQ0FDO2VBQUFBOztRQWdnQkFDO2VBQUFBOztRQTdRQUM7ZUFBQUE7O1FBakZBQztlQUFBQTs7UUFoR0FDO2VBQUFBOztRQW1FQUM7ZUFBQUE7O1FBaVFBQztlQUFBQTs7UUEwREFDO2VBQUFBOztRQW5hQUM7ZUFBQUE7O1FBK1BBQztlQUFBQTs7UUFwWkFDO2VBQUFBOztRQWtVQUM7ZUFBQUE7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