1 | <html><head><meta charset="utf-8"></head><body><pre id="__testling_output"></pre><script>(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
|
2 | (function (process){
|
3 | ;
|
4 |
|
5 | var defined = require('defined');
|
6 | var createDefaultStream = require('./lib/default_stream');
|
7 | var Test = require('./lib/test');
|
8 | var createResult = require('./lib/results');
|
9 | var through = require('through');
|
10 |
|
11 | var canEmitExit = typeof process !== 'undefined' && process
|
12 | && typeof process.on === 'function' && process.browser !== true;
|
13 | var canExit = typeof process !== 'undefined' && process
|
14 | && typeof process.exit === 'function';
|
15 |
|
16 | module.exports = (function () {
|
17 | var wait = false;
|
18 | var harness;
|
19 |
|
20 | function getHarness(opts) {
|
21 | if (!opts) { opts = {}; }
|
22 | opts.autoclose = !canEmitExit;
|
23 | // this override is here since tests fail via nyc if createHarness is moved upwards
|
24 | // eslint-disable-next-line no-use-before-define
|
25 | if (!harness) { harness = createExitHarness(opts, wait); }
|
26 | return harness;
|
27 | }
|
28 |
|
29 | function lazyLoad() {
|
30 | // eslint-disable-next-line no-invalid-this
|
31 | return getHarness().apply(this, arguments);
|
32 | }
|
33 |
|
34 | lazyLoad.wait = function () {
|
35 | wait = true;
|
36 | };
|
37 |
|
38 | lazyLoad.run = function () {
|
39 | var run = getHarness().run;
|
40 |
|
41 | if (run) { run(); }
|
42 | };
|
43 |
|
44 | lazyLoad.only = function () {
|
45 | return getHarness().only.apply(this, arguments);
|
46 | };
|
47 |
|
48 | lazyLoad.createStream = function (opts) {
|
49 | var options = opts || {};
|
50 | if (!harness) {
|
51 | var output = through();
|
52 | getHarness({ stream: output, objectMode: options.objectMode });
|
53 | return output;
|
54 | }
|
55 | return harness.createStream(options);
|
56 | };
|
57 |
|
58 | lazyLoad.onFinish = function () {
|
59 | return getHarness().onFinish.apply(this, arguments);
|
60 | };
|
61 |
|
62 | lazyLoad.onFailure = function () {
|
63 | return getHarness().onFailure.apply(this, arguments);
|
64 | };
|
65 |
|
66 | lazyLoad.getHarness = getHarness;
|
67 |
|
68 | return lazyLoad;
|
69 | }());
|
70 |
|
71 | function createHarness(conf_) {
|
72 | var results = createResult();
|
73 | if (!conf_ || conf_.autoclose !== false) {
|
74 | results.once('done', function () { results.close(); });
|
75 | }
|
76 |
|
77 | function test(name, conf, cb) {
|
78 | var t = new Test(name, conf, cb);
|
79 | test._tests.push(t);
|
80 |
|
81 | (function inspectCode(st) {
|
82 | st.on('test', function sub(st_) {
|
83 | inspectCode(st_);
|
84 | });
|
85 | st.on('result', function (r) {
|
86 | if (!r.todo && !r.ok && typeof r !== 'string') { test._exitCode = 1; }
|
87 | });
|
88 | }(t));
|
89 |
|
90 | results.push(t);
|
91 | return t;
|
92 | }
|
93 | test._results = results;
|
94 |
|
95 | test._tests = [];
|
96 |
|
97 | test.createStream = function (opts) {
|
98 | return results.createStream(opts);
|
99 | };
|
100 |
|
101 | test.onFinish = function (cb) {
|
102 | results.on('done', cb);
|
103 | };
|
104 |
|
105 | test.onFailure = function (cb) {
|
106 | results.on('fail', cb);
|
107 | };
|
108 |
|
109 | var only = false;
|
110 | test.only = function () {
|
111 | if (only) { throw new Error('there can only be one only test'); }
|
112 | if (conf_.noOnly) { throw new Error('`only` tests are prohibited'); }
|
113 | only = true;
|
114 | var t = test.apply(null, arguments);
|
115 | results.only(t);
|
116 | return t;
|
117 | };
|
118 | test._exitCode = 0;
|
119 |
|
120 | test.close = function () { results.close(); };
|
121 |
|
122 | return test;
|
123 | }
|
124 |
|
125 | function createExitHarness(conf, wait) {
|
126 | var config = conf || {};
|
127 | var harness = createHarness({
|
128 | autoclose: defined(config.autoclose, false),
|
129 | noOnly: defined(conf.noOnly, defined(process.env.NODE_TAPE_NO_ONLY_TEST, false))
|
130 | });
|
131 | var running = false;
|
132 | var ended = false;
|
133 |
|
134 | function run() {
|
135 | if (running) { return; }
|
136 | running = true;
|
137 | var stream = harness.createStream({ objectMode: config.objectMode });
|
138 | var es = stream.pipe(config.stream || createDefaultStream());
|
139 | if (canEmitExit && es) { // in node v0.4, `es` is `undefined`
|
140 | // TODO: use `err` arg?
|
141 | // eslint-disable-next-line no-unused-vars
|
142 | es.on('error', function (err) { harness._exitCode = 1; });
|
143 | }
|
144 | stream.on('end', function () { ended = true; });
|
145 | }
|
146 |
|
147 | if (wait) {
|
148 | harness.run = run;
|
149 | } else {
|
150 | run();
|
151 | }
|
152 |
|
153 | if (config.exit === false) { return harness; }
|
154 | if (!canEmitExit || !canExit) { return harness; }
|
155 |
|
156 | process.on('exit', function (code) {
|
157 | // let the process exit cleanly.
|
158 | if (typeof code === 'number' && code !== 0) {
|
159 | return;
|
160 | }
|
161 |
|
162 | if (!ended) {
|
163 | var only = harness._results._only;
|
164 | for (var i = 0; i < harness._tests.length; i++) {
|
165 | var t = harness._tests[i];
|
166 | if (!only || t === only) {
|
167 | t._exit();
|
168 | }
|
169 | }
|
170 | }
|
171 | harness.close();
|
172 |
|
173 | process.removeAllListeners('exit'); // necessary for node v0.6
|
174 | process.exit(code || harness._exitCode); // eslint-disable-line no-process-exit
|
175 | });
|
176 |
|
177 | return harness;
|
178 | }
|
179 |
|
180 | module.exports.createHarness = createHarness;
|
181 | module.exports.Test = Test;
|
182 | module.exports.test = module.exports; // tap compat
|
183 | module.exports.test.skip = Test.skip;
|
184 |
|
185 | }).call(this,require("KliubH"))
|
186 | },{"./lib/default_stream":2,"./lib/results":3,"./lib/test":4,"KliubH":91,"defined":14,"through":79}],2:[function(require,module,exports){
|
187 | (function (process){
|
188 | ;
|
189 |
|
190 | var through = require('through');
|
191 | var fs = require('fs');
|
192 |
|
193 | module.exports = function () {
|
194 | var line = '';
|
195 | var stream = through(write, flush);
|
196 | return stream;
|
197 |
|
198 | function write(buf) {
|
199 | for (var i = 0; i < buf.length; i++) {
|
200 | var c = typeof buf === 'string'
|
201 | ? buf.charAt(i)
|
202 | : String.fromCharCode(buf[i]);
|
203 | if (c === '\n') {
|
204 | flush();
|
205 | } else {
|
206 | line += c;
|
207 | }
|
208 | }
|
209 | }
|
210 |
|
211 | function flush() {
|
212 | if (fs.writeSync && (/^win/).test(process.platform)) {
|
213 | try {
|
214 | fs.writeSync(1, line + '\n');
|
215 | } catch (e) {
|
216 | stream.emit('error', e);
|
217 | }
|
218 | } else {
|
219 | try {
|
220 | console.log(line); // eslint-disable-line no-console
|
221 | } catch (e) {
|
222 | stream.emit('error', e);
|
223 | }
|
224 | }
|
225 | line = '';
|
226 | }
|
227 | };
|
228 |
|
229 | }).call(this,require("KliubH"))
|
230 | },{"KliubH":91,"fs":85,"through":79}],3:[function(require,module,exports){
|
231 | (function (process){
|
232 | ;
|
233 |
|
234 | var defined = require('defined');
|
235 | var EventEmitter = require('events').EventEmitter;
|
236 | var inherits = require('inherits');
|
237 | var through = require('through');
|
238 | var resumer = require('resumer');
|
239 | var inspect = require('object-inspect');
|
240 | var callBound = require('call-bind/callBound');
|
241 | var has = require('has');
|
242 | var $exec = callBound('RegExp.prototype.exec');
|
243 | var $split = callBound('String.prototype.split');
|
244 | var $replace = callBound('String.prototype.replace');
|
245 | var $shift = callBound('Array.prototype.shift');
|
246 | var $push = callBound('Array.prototype.push');
|
247 | var yamlIndicators = /:|-|\?/;
|
248 | var nextTick = typeof setImmediate !== 'undefined'
|
249 | ? setImmediate
|
250 | : process.nextTick;
|
251 |
|
252 | function coalesceWhiteSpaces(str) {
|
253 | return $replace(String(str), /\s+/g, ' ');
|
254 | }
|
255 |
|
256 | function getNextTest(results) {
|
257 | if (!results._only) {
|
258 | return $shift(results.tests);
|
259 | }
|
260 |
|
261 | do {
|
262 | var t = $shift(results.tests);
|
263 | if (t && results._only === t) {
|
264 | return t;
|
265 | }
|
266 | } while (results.tests.length !== 0);
|
267 |
|
268 | return void undefined;
|
269 | }
|
270 |
|
271 | function invalidYaml(str) {
|
272 | return $exec(yamlIndicators, str) !== null;
|
273 | }
|
274 |
|
275 | function encodeResult(res, count) {
|
276 | var output = '';
|
277 | output += (res.ok ? 'ok ' : 'not ok ') + count;
|
278 | output += res.name ? ' ' + coalesceWhiteSpaces(res.name) : '';
|
279 |
|
280 | if (res.skip) {
|
281 | output += ' # SKIP' + (typeof res.skip === 'string' ? ' ' + coalesceWhiteSpaces(res.skip) : '');
|
282 | } else if (res.todo) {
|
283 | output += ' # TODO' + (typeof res.todo === 'string' ? ' ' + coalesceWhiteSpaces(res.todo) : '');
|
284 | }
|
285 |
|
286 | output += '\n';
|
287 | if (res.ok) { return output; }
|
288 |
|
289 | var outer = ' ';
|
290 | var inner = outer + ' ';
|
291 | output += outer + '---\n';
|
292 | output += inner + 'operator: ' + res.operator + '\n';
|
293 |
|
294 | if (has(res, 'expected') || has(res, 'actual')) {
|
295 | var ex = inspect(res.expected, { depth: res.objectPrintDepth });
|
296 | var ac = inspect(res.actual, { depth: res.objectPrintDepth });
|
297 |
|
298 | if (Math.max(ex.length, ac.length) > 65 || invalidYaml(ex) || invalidYaml(ac)) {
|
299 | output += inner + 'expected: |-\n' + inner + ' ' + ex + '\n';
|
300 | output += inner + 'actual: |-\n' + inner + ' ' + ac + '\n';
|
301 | } else {
|
302 | output += inner + 'expected: ' + ex + '\n';
|
303 | output += inner + 'actual: ' + ac + '\n';
|
304 | }
|
305 | }
|
306 | if (res.at) {
|
307 | output += inner + 'at: ' + res.at + '\n';
|
308 | }
|
309 |
|
310 | var actualStack = res.actual && (typeof res.actual === 'object' || typeof res.actual === 'function') ? res.actual.stack : undefined;
|
311 | var errorStack = res.error && res.error.stack;
|
312 | var stack = defined(actualStack, errorStack);
|
313 | if (stack) {
|
314 | var lines = $split(String(stack), '\n');
|
315 | output += inner + 'stack: |-\n';
|
316 | for (var i = 0; i < lines.length; i++) {
|
317 | output += inner + ' ' + lines[i] + '\n';
|
318 | }
|
319 | }
|
320 |
|
321 | output += outer + '...\n';
|
322 | return output;
|
323 | }
|
324 |
|
325 | function Results() {
|
326 | if (!(this instanceof Results)) { return new Results(); }
|
327 | this.count = 0;
|
328 | this.fail = 0;
|
329 | this.pass = 0;
|
330 | this.todo = 0;
|
331 | this._stream = through();
|
332 | this.tests = [];
|
333 | this._only = null;
|
334 | this._isRunning = false;
|
335 | }
|
336 |
|
337 | inherits(Results, EventEmitter);
|
338 |
|
339 | Results.prototype.createStream = function (opts) {
|
340 | if (!opts) { opts = {}; }
|
341 | var self = this;
|
342 | var output;
|
343 | var testId = 0;
|
344 | if (opts.objectMode) {
|
345 | output = through();
|
346 | self.on('_push', function ontest(t, extra) {
|
347 | if (!extra) { extra = {}; }
|
348 | var id = testId++;
|
349 | t.once('prerun', function () {
|
350 | var row = {
|
351 | type: 'test',
|
352 | name: t.name,
|
353 | id: id,
|
354 | skip: t._skip,
|
355 | todo: t._todo
|
356 | };
|
357 | if (has(extra, 'parent')) {
|
358 | row.parent = extra.parent;
|
359 | }
|
360 | output.queue(row);
|
361 | });
|
362 | t.on('test', function (st) {
|
363 | ontest(st, { parent: id });
|
364 | });
|
365 | t.on('result', function (res) {
|
366 | if (res && typeof res === 'object') {
|
367 | res.test = id;
|
368 | res.type = 'assert';
|
369 | }
|
370 | output.queue(res);
|
371 | });
|
372 | t.on('end', function () {
|
373 | output.queue({ type: 'end', test: id });
|
374 | });
|
375 | });
|
376 | self.on('done', function () { output.queue(null); });
|
377 | } else {
|
378 | output = resumer();
|
379 | output.queue('TAP version 13\n');
|
380 | self._stream.pipe(output);
|
381 | }
|
382 |
|
383 | if (!this._isRunning) {
|
384 | this._isRunning = true;
|
385 | nextTick(function next() {
|
386 | var t;
|
387 | while (t = getNextTest(self)) {
|
388 | t.run();
|
389 | if (!t.ended) {
|
390 | t.once('end', function () { nextTick(next); });
|
391 | return;
|
392 | }
|
393 | }
|
394 | self.emit('done');
|
395 | });
|
396 | }
|
397 |
|
398 | return output;
|
399 | };
|
400 |
|
401 | Results.prototype.push = function (t) {
|
402 | var self = this;
|
403 | $push(self.tests, t);
|
404 | self._watch(t);
|
405 | self.emit('_push', t);
|
406 | };
|
407 |
|
408 | Results.prototype.only = function (t) {
|
409 | this._only = t;
|
410 | };
|
411 |
|
412 | Results.prototype._watch = function (t) {
|
413 | var self = this;
|
414 | function write(s) { self._stream.queue(s); }
|
415 |
|
416 | t.once('prerun', function () {
|
417 | var premsg = '';
|
418 | if (t._skip) {
|
419 | premsg = 'SKIP ';
|
420 | } else if (t._todo) {
|
421 | premsg = 'TODO ';
|
422 | }
|
423 | write('# ' + premsg + coalesceWhiteSpaces(t.name) + '\n');
|
424 | });
|
425 |
|
426 | t.on('result', function (res) {
|
427 | if (typeof res === 'string') {
|
428 | write('# ' + res + '\n');
|
429 | return;
|
430 | }
|
431 | write(encodeResult(res, self.count + 1));
|
432 | self.count++;
|
433 |
|
434 | if (res.ok || res.todo) {
|
435 | self.pass++;
|
436 | } else {
|
437 | self.fail++;
|
438 | self.emit('fail');
|
439 | }
|
440 | });
|
441 |
|
442 | t.on('test', function (st) { self._watch(st); });
|
443 | };
|
444 |
|
445 | Results.prototype.close = function () {
|
446 | var self = this;
|
447 | if (self.closed) { self._stream.emit('error', new Error('ALREADY CLOSED')); }
|
448 | self.closed = true;
|
449 |
|
450 | function write(s) { self._stream.queue(s); }
|
451 |
|
452 | write('\n1..' + self.count + '\n');
|
453 | write('# tests ' + self.count + '\n');
|
454 | write('# pass ' + (self.pass + self.todo) + '\n');
|
455 | if (self.todo) { write('# todo ' + self.todo + '\n'); }
|
456 | if (self.fail) {
|
457 | write('# fail ' + self.fail + '\n');
|
458 | } else {
|
459 | write('\n# ok\n');
|
460 | }
|
461 |
|
462 | self._stream.queue(null);
|
463 | };
|
464 |
|
465 | module.exports = Results;
|
466 |
|
467 | }).call(this,require("KliubH"))
|
468 | },{"KliubH":91,"call-bind/callBound":10,"defined":14,"events":87,"has":39,"inherits":40,"object-inspect":56,"resumer":73,"through":79}],4:[function(require,module,exports){
|
469 | (function (process,__dirname){
|
470 | ;
|
471 |
|
472 | var deepEqual = require('deep-equal');
|
473 | var defined = require('defined');
|
474 | var path = require('path');
|
475 | var inherits = require('inherits');
|
476 | var EventEmitter = require('events').EventEmitter;
|
477 | var has = require('has');
|
478 | var isRegExp = require('is-regex');
|
479 | var trim = require('string.prototype.trim');
|
480 | var callBound = require('call-bind/callBound');
|
481 | var forEach = require('for-each');
|
482 | var inspect = require('object-inspect');
|
483 | var is = require('object-is');
|
484 | var objectKeys = require('object-keys');
|
485 | var every = require('array.prototype.every');
|
486 |
|
487 | var isEnumerable = callBound('Object.prototype.propertyIsEnumerable');
|
488 | var toLowerCase = callBound('String.prototype.toLowerCase');
|
489 | var isProto = callBound('Object.prototype.isPrototypeOf');
|
490 | var $exec = callBound('RegExp.prototype.exec');
|
491 | var objectToString = callBound('Object.prototype.toString');
|
492 | var $split = callBound('String.prototype.split');
|
493 | var $replace = callBound('String.prototype.replace');
|
494 | var $strSlice = callBound('String.prototype.slice');
|
495 | var $push = callBound('Array.prototype.push');
|
496 | var $shift = callBound('Array.prototype.shift');
|
497 |
|
498 | var nextTick = typeof setImmediate !== 'undefined'
|
499 | ? setImmediate
|
500 | : process.nextTick;
|
501 | var safeSetTimeout = setTimeout;
|
502 | var safeClearTimeout = clearTimeout;
|
503 |
|
504 | // eslint-disable-next-line no-unused-vars
|
505 | function getTestArgs(name_, opts_, cb_) {
|
506 | var name = '(anonymous)';
|
507 | var opts = {};
|
508 | var cb;
|
509 |
|
510 | for (var i = 0; i < arguments.length; i++) {
|
511 | var arg = arguments[i];
|
512 | var t = typeof arg;
|
513 | if (t === 'string') {
|
514 | name = arg;
|
515 | } else if (t === 'object') {
|
516 | opts = arg || opts;
|
517 | } else if (t === 'function') {
|
518 | cb = arg;
|
519 | }
|
520 | }
|
521 | return {
|
522 | name: name,
|
523 | opts: opts,
|
524 | cb: cb
|
525 | };
|
526 | }
|
527 |
|
528 | function Test(name_, opts_, cb_) {
|
529 | if (!(this instanceof Test)) {
|
530 | return new Test(name_, opts_, cb_);
|
531 | }
|
532 |
|
533 | var args = getTestArgs(name_, opts_, cb_);
|
534 |
|
535 | this.readable = true;
|
536 | this.name = args.name || '(anonymous)';
|
537 | this.assertCount = 0;
|
538 | this.pendingCount = 0;
|
539 | this._skip = args.opts.skip || false;
|
540 | this._todo = args.opts.todo || false;
|
541 | this._timeout = args.opts.timeout;
|
542 | this._plan = undefined;
|
543 | this._cb = args.cb;
|
544 | this._progeny = [];
|
545 | this._teardown = [];
|
546 | this._ok = true;
|
547 | var depthEnvVar = process.env.NODE_TAPE_OBJECT_PRINT_DEPTH;
|
548 | if (args.opts.objectPrintDepth) {
|
549 | this._objectPrintDepth = args.opts.objectPrintDepth;
|
550 | } else if (depthEnvVar) {
|
551 | if (toLowerCase(depthEnvVar) === 'infinity') {
|
552 | this._objectPrintDepth = Infinity;
|
553 | } else {
|
554 | this._objectPrintDepth = depthEnvVar;
|
555 | }
|
556 | } else {
|
557 | this._objectPrintDepth = 5;
|
558 | }
|
559 |
|
560 | for (var prop in this) {
|
561 | this[prop] = (function bind(self, val) {
|
562 | if (typeof val === 'function') {
|
563 | return function bound() {
|
564 | return val.apply(self, arguments);
|
565 | };
|
566 | }
|
567 | return val;
|
568 | }(this, this[prop]));
|
569 | }
|
570 | }
|
571 |
|
572 | inherits(Test, EventEmitter);
|
573 |
|
574 | Test.prototype.run = function run() {
|
575 | this.emit('prerun');
|
576 | if (!this._cb || this._skip) {
|
577 | this._end();
|
578 | return;
|
579 | }
|
580 | if (this._timeout != null) {
|
581 | this.timeoutAfter(this._timeout);
|
582 | }
|
583 |
|
584 | var callbackReturn = this._cb(this);
|
585 |
|
586 | if (
|
587 | typeof Promise === 'function'
|
588 | && callbackReturn
|
589 | && typeof callbackReturn.then === 'function'
|
590 | ) {
|
591 | var self = this;
|
592 | Promise.resolve(callbackReturn).then(function onResolve() {
|
593 | if (!self.calledEnd) {
|
594 | self.end();
|
595 | }
|
596 | })['catch'](function onError(err) {
|
597 | if (err instanceof Error || objectToString(err) === '[object Error]') {
|
598 | self.ifError(err);
|
599 | } else {
|
600 | self.fail(err);
|
601 | }
|
602 | self.end();
|
603 | });
|
604 | return;
|
605 | }
|
606 |
|
607 | this.emit('run');
|
608 | };
|
609 |
|
610 | Test.prototype.test = function test(name, opts, cb) {
|
611 | var self = this;
|
612 | var t = new Test(name, opts, cb);
|
613 | $push(this._progeny, t);
|
614 | this.pendingCount++;
|
615 | this.emit('test', t);
|
616 | t.on('prerun', function () {
|
617 | self.assertCount++;
|
618 | });
|
619 |
|
620 | if (!self._pendingAsserts()) {
|
621 | nextTick(function () {
|
622 | self._end();
|
623 | });
|
624 | }
|
625 |
|
626 | nextTick(function () {
|
627 | if (!self._plan && self.pendingCount == self._progeny.length) {
|
628 | self._end();
|
629 | }
|
630 | });
|
631 | };
|
632 |
|
633 | Test.prototype.comment = function comment(msg) {
|
634 | var that = this;
|
635 | forEach($split(trim(msg), '\n'), function (aMsg) {
|
636 | that.emit('result', $replace(trim(aMsg), /^#\s*/, ''));
|
637 | });
|
638 | };
|
639 |
|
640 | Test.prototype.plan = function plan(n) {
|
641 | this._plan = n;
|
642 | this.emit('plan', n);
|
643 | };
|
644 |
|
645 | Test.prototype.timeoutAfter = function timeoutAfter(ms) {
|
646 | if (!ms) { throw new Error('timeoutAfter requires a timespan'); }
|
647 | var self = this;
|
648 | var timeout = safeSetTimeout(function () {
|
649 | self.fail(self.name + ' timed out after ' + ms + 'ms');
|
650 | self.end();
|
651 | }, ms);
|
652 | this.once('end', function () {
|
653 | safeClearTimeout(timeout);
|
654 | });
|
655 | };
|
656 |
|
657 | Test.prototype.end = function end(err) {
|
658 | if (arguments.length >= 1 && !!err) {
|
659 | this.ifError(err);
|
660 | }
|
661 |
|
662 | if (this.calledEnd) {
|
663 | this.fail('.end() already called');
|
664 | }
|
665 | this.calledEnd = true;
|
666 | this._end();
|
667 | };
|
668 |
|
669 | Test.prototype.teardown = function teardown(fn) {
|
670 | if (typeof fn !== 'function') {
|
671 | this.fail('teardown: ' + inspect(fn) + ' is not a function');
|
672 | } else {
|
673 | this._teardown.push(fn);
|
674 | }
|
675 | };
|
676 |
|
677 | Test.prototype._end = function _end(err) {
|
678 | var self = this;
|
679 |
|
680 | if (!this._cb && !this._todo && !this._skip) {
|
681 | this.fail('# TODO ' + this.name);
|
682 | }
|
683 |
|
684 | if (this._progeny.length) {
|
685 | var t = $shift(this._progeny);
|
686 | t.on('end', function () { self._end(); });
|
687 | t.run();
|
688 | return;
|
689 | }
|
690 |
|
691 | function completeEnd() {
|
692 | if (!self.ended) { self.emit('end'); }
|
693 | var pendingAsserts = self._pendingAsserts();
|
694 | if (!self._planError && self._plan !== undefined && pendingAsserts) {
|
695 | self._planError = true;
|
696 | self.fail('plan != count', {
|
697 | expected: self._plan,
|
698 | actual: self.assertCount
|
699 | });
|
700 | }
|
701 | self.ended = true;
|
702 | }
|
703 |
|
704 | function next() {
|
705 | if (self._teardown.length === 0) {
|
706 | completeEnd();
|
707 | return;
|
708 | }
|
709 | var fn = self._teardown.shift();
|
710 | var res;
|
711 | try {
|
712 | res = fn();
|
713 | } catch (e) {
|
714 | self.fail(e);
|
715 | }
|
716 | if (res && typeof res.then === 'function') {
|
717 | res.then(next, function (_err) {
|
718 | // TODO: wth?
|
719 | err = err || _err;
|
720 | });
|
721 | } else {
|
722 | next();
|
723 | }
|
724 | }
|
725 |
|
726 | next();
|
727 | };
|
728 |
|
729 | Test.prototype._exit = function _exit() {
|
730 | if (this._plan !== undefined && !this._planError && this.assertCount !== this._plan) {
|
731 | this._planError = true;
|
732 | this.fail('plan != count', {
|
733 | expected: this._plan,
|
734 | actual: this.assertCount,
|
735 | exiting: true
|
736 | });
|
737 | } else if (!this.ended) {
|
738 | this.fail('test exited without ending: ' + this.name, {
|
739 | exiting: true
|
740 | });
|
741 | }
|
742 | };
|
743 |
|
744 | Test.prototype._pendingAsserts = function _pendingAsserts() {
|
745 | if (this._plan === undefined) {
|
746 | return 1;
|
747 | }
|
748 | return this._plan - (this._progeny.length + this.assertCount);
|
749 | };
|
750 |
|
751 | Test.prototype._assert = function assert(ok, opts) {
|
752 | var self = this;
|
753 | var extra = opts.extra || {};
|
754 |
|
755 | ok = !!ok || !!extra.skip;
|
756 |
|
757 | var name = defined(extra.message, opts.message, '(unnamed assert)');
|
758 | if (this.calledEnd && opts.operator !== 'fail') {
|
759 | this.fail('.end() already called: ' + name);
|
760 | return;
|
761 | }
|
762 |
|
763 | var res = {
|
764 | id: self.assertCount++,
|
765 | ok: ok,
|
766 | skip: defined(extra.skip, opts.skip),
|
767 | todo: defined(extra.todo, opts.todo, self._todo),
|
768 | name: name,
|
769 | operator: defined(extra.operator, opts.operator),
|
770 | objectPrintDepth: self._objectPrintDepth
|
771 | };
|
772 | if (has(opts, 'actual') || has(extra, 'actual')) {
|
773 | res.actual = defined(extra.actual, opts.actual);
|
774 | }
|
775 | if (has(opts, 'expected') || has(extra, 'expected')) {
|
776 | res.expected = defined(extra.expected, opts.expected);
|
777 | }
|
778 | this._ok = !!(this._ok && ok);
|
779 |
|
780 | if (!ok && !res.todo) {
|
781 | res.error = defined(extra.error, opts.error, new Error(res.name));
|
782 | }
|
783 |
|
784 | if (!ok) {
|
785 | var e = new Error('exception');
|
786 | var err = $split(e.stack || '', '\n');
|
787 | var dir = __dirname + path.sep;
|
788 |
|
789 | for (var i = 0; i < err.length; i++) {
|
790 | /*
|
791 | Stack trace lines may resemble one of the following. We need
|
792 | to correctly extract a function name (if any) and path / line
|
793 | number for each line.
|
794 |
|
795 | at myFunction (/path/to/file.js:123:45)
|
796 | at myFunction (/path/to/file.other-ext:123:45)
|
797 | at myFunction (/path to/file.js:123:45)
|
798 | at myFunction (C:\path\to\file.js:123:45)
|
799 | at myFunction (/path/to/file.js:123)
|
800 | at Test.<anonymous> (/path/to/file.js:123:45)
|
801 | at Test.bound [as run] (/path/to/file.js:123:45)
|
802 | at /path/to/file.js:123:45
|
803 |
|
804 | Regex has three parts. First is non-capturing group for 'at '
|
805 | (plus anything preceding it).
|
806 |
|
807 | /^(?:[^\s]*\s*\bat\s+)/
|
808 |
|
809 | Second captures function call description (optional). This is
|
810 | not necessarily a valid JS function name, but just what the
|
811 | stack trace is using to represent a function call. It may look
|
812 | like `<anonymous>` or 'Test.bound [as run]'.
|
813 |
|
814 | For our purposes, we assume that, if there is a function
|
815 | name, it's everything leading up to the first open
|
816 | parentheses (trimmed) before our pathname.
|
817 |
|
818 | /(?:(.*)\s+\()?/
|
819 |
|
820 | Last part captures file path plus line no (and optional
|
821 | column no).
|
822 |
|
823 | /((?:\/|[a-zA-Z]:\\)[^:\)]+:(\d+)(?::(\d+))?)\)?/
|
824 | */
|
825 | var re = /^(?:[^\s]*\s*\bat\s+)(?:(.*)\s+\()?((?:\/|[a-zA-Z]:\\)[^:)]+:(\d+)(?::(\d+))?)\)?$/;
|
826 | var lineWithTokens = $replace($replace(err[i], process.cwd(), '/$CWD'), __dirname, '/$TEST');
|
827 | var m = re.exec(lineWithTokens);
|
828 |
|
829 | if (!m) {
|
830 | continue;
|
831 | }
|
832 |
|
833 | var callDescription = m[1] || '<anonymous>';
|
834 | var filePath = $replace($replace(m[2], '/$CWD', process.cwd()), '/$TEST', __dirname);
|
835 |
|
836 | if ($strSlice(filePath, 0, dir.length) === dir) {
|
837 | continue;
|
838 | }
|
839 |
|
840 | // Function call description may not (just) be a function name.
|
841 | // Try to extract function name by looking at first "word" only.
|
842 | res.functionName = $split(callDescription, /\s+/)[0];
|
843 | res.file = filePath;
|
844 | res.line = Number(m[3]);
|
845 | if (m[4]) { res.column = Number(m[4]); }
|
846 |
|
847 | res.at = callDescription + ' (' + filePath + ')';
|
848 | break;
|
849 | }
|
850 | }
|
851 |
|
852 | self.emit('result', res);
|
853 |
|
854 | var pendingAsserts = self._pendingAsserts();
|
855 | if (!pendingAsserts) {
|
856 | if (extra.exiting) {
|
857 | self._end();
|
858 | } else {
|
859 | nextTick(function () {
|
860 | self._end();
|
861 | });
|
862 | }
|
863 | }
|
864 |
|
865 | if (!self._planError && pendingAsserts < 0) {
|
866 | self._planError = true;
|
867 | self.fail('plan != count', {
|
868 | expected: self._plan,
|
869 | actual: self._plan - pendingAsserts
|
870 | });
|
871 | }
|
872 | };
|
873 |
|
874 | Test.prototype.fail = function fail(msg, extra) {
|
875 | this._assert(false, {
|
876 | message: msg,
|
877 | operator: 'fail',
|
878 | extra: extra
|
879 | });
|
880 | };
|
881 |
|
882 | Test.prototype.pass = function pass(msg, extra) {
|
883 | this._assert(true, {
|
884 | message: msg,
|
885 | operator: 'pass',
|
886 | extra: extra
|
887 | });
|
888 | };
|
889 |
|
890 | Test.prototype.skip = function skip(msg, extra) {
|
891 | this._assert(true, {
|
892 | message: msg,
|
893 | operator: 'skip',
|
894 | skip: true,
|
895 | extra: extra
|
896 | });
|
897 | };
|
898 |
|
899 | var testAssert = function assert(value, msg, extra) { // eslint-disable-line func-style
|
900 | this._assert(value, {
|
901 | message: defined(msg, 'should be truthy'),
|
902 | operator: 'ok',
|
903 | expected: true,
|
904 | actual: value,
|
905 | extra: extra
|
906 | });
|
907 | };
|
908 | Test.prototype.ok
|
909 | = Test.prototype['true']
|
910 | = Test.prototype.assert
|
911 | = testAssert;
|
912 |
|
913 | function notOK(value, msg, extra) {
|
914 | this._assert(!value, {
|
915 | message: defined(msg, 'should be falsy'),
|
916 | operator: 'notOk',
|
917 | expected: false,
|
918 | actual: value,
|
919 | extra: extra
|
920 | });
|
921 | }
|
922 | Test.prototype.notOk
|
923 | = Test.prototype['false']
|
924 | = Test.prototype.notok
|
925 | = notOK;
|
926 |
|
927 | function error(err, msg, extra) {
|
928 | this._assert(!err, {
|
929 | message: defined(msg, String(err)),
|
930 | operator: 'error',
|
931 | error: err,
|
932 | extra: extra
|
933 | });
|
934 | }
|
935 | Test.prototype.error
|
936 | = Test.prototype.ifError
|
937 | = Test.prototype.ifErr
|
938 | = Test.prototype.iferror
|
939 | = error;
|
940 |
|
941 | function strictEqual(a, b, msg, extra) {
|
942 | if (arguments.length < 2) {
|
943 | throw new TypeError('two arguments must be provided to compare');
|
944 | }
|
945 | this._assert(is(a, b), {
|
946 | message: defined(msg, 'should be strictly equal'),
|
947 | operator: 'equal',
|
948 | actual: a,
|
949 | expected: b,
|
950 | extra: extra
|
951 | });
|
952 | }
|
953 | Test.prototype.equal
|
954 | = Test.prototype.equals
|
955 | = Test.prototype.isEqual
|
956 | = Test.prototype.strictEqual
|
957 | = Test.prototype.strictEquals
|
958 | = Test.prototype.is
|
959 | = strictEqual;
|
960 |
|
961 | function notStrictEqual(a, b, msg, extra) {
|
962 | if (arguments.length < 2) {
|
963 | throw new TypeError('two arguments must be provided to compare');
|
964 | }
|
965 | this._assert(!is(a, b), {
|
966 | message: defined(msg, 'should not be strictly equal'),
|
967 | operator: 'notEqual',
|
968 | actual: a,
|
969 | expected: b,
|
970 | extra: extra
|
971 | });
|
972 | }
|
973 |
|
974 | Test.prototype.notEqual
|
975 | = Test.prototype.notEquals
|
976 | = Test.prototype.isNotEqual
|
977 | = Test.prototype.doesNotEqual
|
978 | = Test.prototype.isInequal
|
979 | = Test.prototype.notStrictEqual
|
980 | = Test.prototype.notStrictEquals
|
981 | = Test.prototype.isNot
|
982 | = Test.prototype.not
|
983 | = notStrictEqual;
|
984 |
|
985 | function looseEqual(a, b, msg, extra) {
|
986 | if (arguments.length < 2) {
|
987 | throw new TypeError('two arguments must be provided to compare');
|
988 | }
|
989 | this._assert(a == b, {
|
990 | message: defined(msg, 'should be loosely equal'),
|
991 | operator: 'looseEqual',
|
992 | actual: a,
|
993 | expected: b,
|
994 | extra: extra
|
995 | });
|
996 | }
|
997 |
|
998 | Test.prototype.looseEqual
|
999 | = Test.prototype.looseEquals
|
1000 | = looseEqual;
|
1001 |
|
1002 | function notLooseEqual(a, b, msg, extra) {
|
1003 | if (arguments.length < 2) {
|
1004 | throw new TypeError('two arguments must be provided to compare');
|
1005 | }
|
1006 | this._assert(a != b, {
|
1007 | message: defined(msg, 'should not be loosely equal'),
|
1008 | operator: 'notLooseEqual',
|
1009 | actual: a,
|
1010 | expected: b,
|
1011 | extra: extra
|
1012 | });
|
1013 | }
|
1014 | Test.prototype.notLooseEqual
|
1015 | = Test.prototype.notLooseEquals
|
1016 | = notLooseEqual;
|
1017 |
|
1018 | function tapeDeepEqual(a, b, msg, extra) {
|
1019 | if (arguments.length < 2) {
|
1020 | throw new TypeError('two arguments must be provided to compare');
|
1021 | }
|
1022 | this._assert(deepEqual(a, b, { strict: true }), {
|
1023 | message: defined(msg, 'should be deeply equivalent'),
|
1024 | operator: 'deepEqual',
|
1025 | actual: a,
|
1026 | expected: b,
|
1027 | extra: extra
|
1028 | });
|
1029 | }
|
1030 | Test.prototype.deepEqual
|
1031 | = Test.prototype.deepEquals
|
1032 | = Test.prototype.isEquivalent
|
1033 | = Test.prototype.same
|
1034 | = tapeDeepEqual;
|
1035 |
|
1036 | function notDeepEqual(a, b, msg, extra) {
|
1037 | if (arguments.length < 2) {
|
1038 | throw new TypeError('two arguments must be provided to compare');
|
1039 | }
|
1040 | this._assert(!deepEqual(a, b, { strict: true }), {
|
1041 | message: defined(msg, 'should not be deeply equivalent'),
|
1042 | operator: 'notDeepEqual',
|
1043 | actual: a,
|
1044 | expected: b,
|
1045 | extra: extra
|
1046 | });
|
1047 | }
|
1048 | Test.prototype.notDeepEqual
|
1049 | = Test.prototype.notDeepEquals
|
1050 | = Test.prototype.notEquivalent
|
1051 | = Test.prototype.notDeeply
|
1052 | = Test.prototype.notSame
|
1053 | = Test.prototype.isNotDeepEqual
|
1054 | = Test.prototype.isNotDeeply
|
1055 | = Test.prototype.isNotEquivalent
|
1056 | = Test.prototype.isInequivalent
|
1057 | = notDeepEqual;
|
1058 |
|
1059 | function deepLooseEqual(a, b, msg, extra) {
|
1060 | if (arguments.length < 2) {
|
1061 | throw new TypeError('two arguments must be provided to compare');
|
1062 | }
|
1063 | this._assert(deepEqual(a, b), {
|
1064 | message: defined(msg, 'should be loosely deeply equivalent'),
|
1065 | operator: 'deepLooseEqual',
|
1066 | actual: a,
|
1067 | expected: b,
|
1068 | extra: extra
|
1069 | });
|
1070 | }
|
1071 |
|
1072 | Test.prototype.deepLooseEqual
|
1073 | = deepLooseEqual;
|
1074 |
|
1075 | function notDeepLooseEqual(a, b, msg, extra) {
|
1076 | if (arguments.length < 2) {
|
1077 | throw new TypeError('two arguments must be provided to compare');
|
1078 | }
|
1079 | this._assert(!deepEqual(a, b), {
|
1080 | message: defined(msg, 'should not be loosely deeply equivalent'),
|
1081 | operator: 'notDeepLooseEqual',
|
1082 | actual: a,
|
1083 | expected: b,
|
1084 | extra: extra
|
1085 | });
|
1086 | }
|
1087 | Test.prototype.notDeepLooseEqual
|
1088 | = notDeepLooseEqual;
|
1089 |
|
1090 | Test.prototype['throws'] = function (fn, expected, msg, extra) {
|
1091 | if (typeof expected === 'string') {
|
1092 | msg = expected;
|
1093 | expected = undefined;
|
1094 | }
|
1095 |
|
1096 | var caught;
|
1097 |
|
1098 | try {
|
1099 | fn();
|
1100 | } catch (err) {
|
1101 | caught = { error: err };
|
1102 | if (Object(err) === err && (!isEnumerable(err, 'message') || !has(err, 'message'))) {
|
1103 | var message = err.message;
|
1104 | delete err.message;
|
1105 | err.message = message;
|
1106 | }
|
1107 | }
|
1108 |
|
1109 | var passed = caught;
|
1110 |
|
1111 | if (caught) {
|
1112 | if (typeof expected === 'string' && caught.error && caught.error.message === expected) {
|
1113 | throw new TypeError('The "error/message" argument is ambiguous. The error message ' + inspect(expected) + ' is identical to the message.');
|
1114 | }
|
1115 | if (typeof expected === 'function') {
|
1116 | if (typeof expected.prototype !== 'undefined' && caught.error instanceof expected) {
|
1117 | passed = true;
|
1118 | } else if (isProto(Error, expected)) {
|
1119 | passed = false;
|
1120 | } else {
|
1121 | passed = expected.call({}, caught.error) === true;
|
1122 | }
|
1123 | } else if (isRegExp(expected)) {
|
1124 | passed = $exec(expected, caught.error) !== null;
|
1125 | expected = inspect(expected);
|
1126 | } else if (expected && typeof expected === 'object') { // Handle validation objects.
|
1127 | var keys = objectKeys(expected);
|
1128 | // Special handle errors to make sure the name and the message are compared as well.
|
1129 | if (expected instanceof Error) {
|
1130 | $push(keys, 'name', 'message');
|
1131 | } else if (keys.length === 0) {
|
1132 | throw new TypeError('`throws` validation object must not be empty');
|
1133 | }
|
1134 | passed = every(keys, function (key) {
|
1135 | if (typeof caught.error[key] === 'string' && isRegExp(expected[key]) && $exec(expected[key], caught.error[key]) !== null) {
|
1136 | return true;
|
1137 | }
|
1138 | if (key in caught.error && deepEqual(caught.error[key], expected[key], { strict: true })) {
|
1139 | return true;
|
1140 | }
|
1141 | return false;
|
1142 | });
|
1143 | }
|
1144 | }
|
1145 |
|
1146 | this._assert(!!passed, {
|
1147 | message: defined(msg, 'should throw'),
|
1148 | operator: 'throws',
|
1149 | actual: caught && caught.error,
|
1150 | expected: expected,
|
1151 | error: !passed && caught && caught.error,
|
1152 | extra: extra
|
1153 | });
|
1154 | };
|
1155 |
|
1156 | Test.prototype.doesNotThrow = function doesNotThrow(fn, expected, msg, extra) {
|
1157 | if (typeof expected === 'string') {
|
1158 | msg = expected;
|
1159 | expected = undefined;
|
1160 | }
|
1161 | var caught;
|
1162 | try {
|
1163 | fn();
|
1164 | } catch (err) {
|
1165 | caught = { error: err };
|
1166 | }
|
1167 | this._assert(!caught, {
|
1168 | message: defined(msg, 'should not throw'),
|
1169 | operator: 'throws',
|
1170 | actual: caught && caught.error,
|
1171 | expected: expected,
|
1172 | error: caught && caught.error,
|
1173 | extra: extra
|
1174 | });
|
1175 | };
|
1176 |
|
1177 | Test.prototype.match = function match(string, regexp, msg, extra) {
|
1178 | if (!isRegExp(regexp)) {
|
1179 | this._assert(false, {
|
1180 | message: defined(msg, 'The "regexp" argument must be an instance of RegExp. Received type ' + typeof regexp + ' (' + inspect(regexp) + ')'),
|
1181 | operator: 'match',
|
1182 | actual: objectToString(regexp),
|
1183 | expected: '[object RegExp]',
|
1184 | extra: extra
|
1185 | });
|
1186 | } else if (typeof string !== 'string') {
|
1187 | this._assert(false, {
|
1188 | message: defined(msg, 'The "string" argument must be of type string. Received type ' + typeof string + ' (' + inspect(string) + ')'),
|
1189 | operator: 'match',
|
1190 | actual: string === null ? null : typeof string,
|
1191 | expected: 'string',
|
1192 | extra: extra
|
1193 | });
|
1194 | } else {
|
1195 | var matches = $exec(regexp, string) !== null;
|
1196 | var message = defined(
|
1197 | msg,
|
1198 | 'The input ' + (matches ? 'matched' : 'did not match') + ' the regular expression ' + inspect(regexp) + '. Input: ' + inspect(string)
|
1199 | );
|
1200 | this._assert(matches, {
|
1201 | message: message,
|
1202 | operator: 'match',
|
1203 | actual: string,
|
1204 | expected: regexp,
|
1205 | extra: extra
|
1206 | });
|
1207 | }
|
1208 | };
|
1209 |
|
1210 | Test.prototype.doesNotMatch = function doesNotMatch(string, regexp, msg, extra) {
|
1211 | if (!isRegExp(regexp)) {
|
1212 | this._assert(false, {
|
1213 | message: defined(msg, 'The "regexp" argument must be an instance of RegExp. Received type ' + typeof regexp + ' (' + inspect(regexp) + ')'),
|
1214 | operator: 'doesNotMatch',
|
1215 | actual: objectToString(regexp),
|
1216 | expected: '[object RegExp]',
|
1217 | extra: extra
|
1218 | });
|
1219 | } else if (typeof string !== 'string') {
|
1220 | this._assert(false, {
|
1221 | message: defined(msg, 'The "string" argument must be of type string. Received type ' + typeof string + ' (' + inspect(string) + ')'),
|
1222 | operator: 'doesNotMatch',
|
1223 | actual: string === null ? null : typeof string,
|
1224 | expected: 'string',
|
1225 | extra: extra
|
1226 | });
|
1227 | } else {
|
1228 | var matches = $exec(regexp, string) !== null;
|
1229 | var message = defined(
|
1230 | msg,
|
1231 | 'The input ' + (matches ? 'was expected to not match' : 'did not match') + ' the regular expression ' + inspect(regexp) + '. Input: ' + inspect(string)
|
1232 | );
|
1233 | this._assert(!matches, {
|
1234 | message: message,
|
1235 | operator: 'doesNotMatch',
|
1236 | actual: string,
|
1237 | expected: regexp,
|
1238 | extra: extra
|
1239 | });
|
1240 | }
|
1241 | };
|
1242 |
|
1243 | // eslint-disable-next-line no-unused-vars
|
1244 | Test.skip = function skip(name_, _opts, _cb) {
|
1245 | var args = getTestArgs.apply(null, arguments);
|
1246 | args.opts.skip = true;
|
1247 | return new Test(args.name, args.opts, args.cb);
|
1248 | };
|
1249 |
|
1250 | module.exports = Test;
|
1251 |
|
1252 | // vim: set softtabstop=4 shiftwidth=4:
|
1253 |
|
1254 | }).call(this,require("KliubH"),"/../../lib")
|
1255 | },{"KliubH":91,"array.prototype.every":6,"call-bind/callBound":10,"deep-equal":12,"defined":14,"events":87,"for-each":29,"has":39,"inherits":40,"is-regex":48,"object-inspect":56,"object-is":59,"object-keys":63,"path":90,"string.prototype.trim":76}],5:[function(require,module,exports){
|
1256 | ;
|
1257 |
|
1258 | var IsCallable = require('es-abstract/2021/IsCallable');
|
1259 | var ToObject = require('es-abstract/2021/ToObject');
|
1260 | var ToUint32 = require('es-abstract/2021/ToUint32');
|
1261 | var callBound = require('call-bind/callBound');
|
1262 | var isString = require('is-string');
|
1263 |
|
1264 | // Check failure of by-index access of string characters (IE < 9) and failure of `0 in boxedString` (Rhino)
|
1265 | var boxedString = Object('a');
|
1266 | var splitString = boxedString[0] !== 'a' || !(0 in boxedString);
|
1267 |
|
1268 | var $split = callBound('String.prototype.split');
|
1269 |
|
1270 | module.exports = function every(callbackfn) {
|
1271 | var O = ToObject(this);
|
1272 | var self = splitString && isString(O) ? $split(O, '') : O;
|
1273 | var len = ToUint32(self.length);
|
1274 | var T;
|
1275 | if (arguments.length > 1) {
|
1276 | T = arguments[1];
|
1277 | }
|
1278 |
|
1279 | // If no callback function or if callback is not a callable function
|
1280 | if (!IsCallable(callbackfn)) {
|
1281 | throw new TypeError('Array.prototype.every callback must be a function');
|
1282 | }
|
1283 |
|
1284 | for (var i = 0; i < len; i++) {
|
1285 | if (i in self && !(typeof T === 'undefined' ? callbackfn(self[i], i, O) : callbackfn.call(T, self[i], i, O))) {
|
1286 | return false;
|
1287 | }
|
1288 | }
|
1289 | return true;
|
1290 | };
|
1291 |
|
1292 | },{"call-bind/callBound":10,"es-abstract/2021/IsCallable":15,"es-abstract/2021/ToObject":18,"es-abstract/2021/ToUint32":21,"is-string":50}],6:[function(require,module,exports){
|
1293 | ;
|
1294 |
|
1295 | var define = require('define-properties');
|
1296 | var RequireObjectCoercible = require('es-abstract/2021/RequireObjectCoercible');
|
1297 | var callBound = require('call-bind/callBound');
|
1298 |
|
1299 | var implementation = require('./implementation');
|
1300 | var getPolyfill = require('./polyfill');
|
1301 | var polyfill = getPolyfill();
|
1302 | var shim = require('./shim');
|
1303 |
|
1304 | var $slice = callBound('Array.prototype.slice');
|
1305 |
|
1306 | // eslint-disable-next-line no-unused-vars
|
1307 | var boundEveryShim = function every(array, callbackfn) {
|
1308 | RequireObjectCoercible(array);
|
1309 | return polyfill.apply(array, $slice(arguments, 1));
|
1310 | };
|
1311 | define(boundEveryShim, {
|
1312 | getPolyfill: getPolyfill,
|
1313 | implementation: implementation,
|
1314 | shim: shim
|
1315 | });
|
1316 |
|
1317 | module.exports = boundEveryShim;
|
1318 |
|
1319 | },{"./implementation":5,"./polyfill":7,"./shim":8,"call-bind/callBound":10,"define-properties":13,"es-abstract/2021/RequireObjectCoercible":16}],7:[function(require,module,exports){
|
1320 | var implementation = require('./implementation');
|
1321 |
|
1322 | module.exports = function getPolyfill() {
|
1323 | if (typeof Array.prototype.every === 'function') {
|
1324 | var hasPrimitiveContextInStrict = [1].every(function () {
|
1325 | ;
|
1326 |
|
1327 | return typeof this === 'string' && this === 'x';
|
1328 | }, 'x');
|
1329 | if (hasPrimitiveContextInStrict) {
|
1330 | return Array.prototype.every;
|
1331 | }
|
1332 | }
|
1333 | return implementation;
|
1334 | };
|
1335 |
|
1336 | },{"./implementation":5}],8:[function(require,module,exports){
|
1337 | ;
|
1338 |
|
1339 | var define = require('define-properties');
|
1340 | var getPolyfill = require('./polyfill');
|
1341 |
|
1342 | module.exports = function shimArrayPrototypeEvery() {
|
1343 | var polyfill = getPolyfill();
|
1344 | define(
|
1345 | Array.prototype,
|
1346 | { every: polyfill },
|
1347 | { every: function () { return Array.prototype.every !== polyfill; } }
|
1348 | );
|
1349 | return polyfill;
|
1350 | };
|
1351 |
|
1352 | },{"./polyfill":7,"define-properties":13}],9:[function(require,module,exports){
|
1353 | (function (global){
|
1354 | ;
|
1355 |
|
1356 | var possibleNames = [
|
1357 | 'BigInt64Array',
|
1358 | 'BigUint64Array',
|
1359 | 'Float32Array',
|
1360 | 'Float64Array',
|
1361 | 'Int16Array',
|
1362 | 'Int32Array',
|
1363 | 'Int8Array',
|
1364 | 'Uint16Array',
|
1365 | 'Uint32Array',
|
1366 | 'Uint8Array',
|
1367 | 'Uint8ClampedArray'
|
1368 | ];
|
1369 |
|
1370 | var g = typeof globalThis === 'undefined' ? global : globalThis;
|
1371 |
|
1372 | module.exports = function availableTypedArrays() {
|
1373 | var out = [];
|
1374 | for (var i = 0; i < possibleNames.length; i++) {
|
1375 | if (typeof g[possibleNames[i]] === 'function') {
|
1376 | out[out.length] = possibleNames[i];
|
1377 | }
|
1378 | }
|
1379 | return out;
|
1380 | };
|
1381 |
|
1382 | }).call(this,typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
1383 | },{}],10:[function(require,module,exports){
|
1384 | ;
|
1385 |
|
1386 | var GetIntrinsic = require('get-intrinsic');
|
1387 |
|
1388 | var callBind = require('./');
|
1389 |
|
1390 | var $indexOf = callBind(GetIntrinsic('String.prototype.indexOf'));
|
1391 |
|
1392 | module.exports = function callBoundIntrinsic(name, allowMissing) {
|
1393 | var intrinsic = GetIntrinsic(name, !!allowMissing);
|
1394 | if (typeof intrinsic === 'function' && $indexOf(name, '.prototype.') > -1) {
|
1395 | return callBind(intrinsic);
|
1396 | }
|
1397 | return intrinsic;
|
1398 | };
|
1399 |
|
1400 | },{"./":11,"get-intrinsic":33}],11:[function(require,module,exports){
|
1401 | ;
|
1402 |
|
1403 | var bind = require('function-bind');
|
1404 | var GetIntrinsic = require('get-intrinsic');
|
1405 |
|
1406 | var $apply = GetIntrinsic('%Function.prototype.apply%');
|
1407 | var $call = GetIntrinsic('%Function.prototype.call%');
|
1408 | var $reflectApply = GetIntrinsic('%Reflect.apply%', true) || bind.call($call, $apply);
|
1409 |
|
1410 | var $gOPD = GetIntrinsic('%Object.getOwnPropertyDescriptor%', true);
|
1411 | var $defineProperty = GetIntrinsic('%Object.defineProperty%', true);
|
1412 | var $max = GetIntrinsic('%Math.max%');
|
1413 |
|
1414 | if ($defineProperty) {
|
1415 | try {
|
1416 | $defineProperty({}, 'a', { value: 1 });
|
1417 | } catch (e) {
|
1418 | // IE 8 has a broken defineProperty
|
1419 | $defineProperty = null;
|
1420 | }
|
1421 | }
|
1422 |
|
1423 | module.exports = function callBind(originalFunction) {
|
1424 | var func = $reflectApply(bind, $call, arguments);
|
1425 | if ($gOPD && $defineProperty) {
|
1426 | var desc = $gOPD(func, 'length');
|
1427 | if (desc.configurable) {
|
1428 | // original length, plus the receiver, minus any additional arguments (after the receiver)
|
1429 | $defineProperty(
|
1430 | func,
|
1431 | 'length',
|
1432 | { value: 1 + $max(0, originalFunction.length - (arguments.length - 1)) }
|
1433 | );
|
1434 | }
|
1435 | }
|
1436 | return func;
|
1437 | };
|
1438 |
|
1439 | var applyBind = function applyBind() {
|
1440 | return $reflectApply(bind, $apply, arguments);
|
1441 | };
|
1442 |
|
1443 | if ($defineProperty) {
|
1444 | $defineProperty(module.exports, 'apply', { value: applyBind });
|
1445 | } else {
|
1446 | module.exports.apply = applyBind;
|
1447 | }
|
1448 |
|
1449 | },{"function-bind":31,"get-intrinsic":33}],12:[function(require,module,exports){
|
1450 | ;
|
1451 |
|
1452 | var objectKeys = require('object-keys');
|
1453 | var isArguments = require('is-arguments');
|
1454 | var is = require('object-is');
|
1455 | var isRegex = require('is-regex');
|
1456 | var flags = require('regexp.prototype.flags');
|
1457 | var isArray = require('isarray');
|
1458 | var isDate = require('is-date-object');
|
1459 | var whichBoxedPrimitive = require('which-boxed-primitive');
|
1460 | var GetIntrinsic = require('get-intrinsic');
|
1461 | var callBound = require('call-bind/callBound');
|
1462 | var whichCollection = require('which-collection');
|
1463 | var getIterator = require('es-get-iterator');
|
1464 | var getSideChannel = require('side-channel');
|
1465 | var whichTypedArray = require('which-typed-array');
|
1466 | var assign = require('object.assign');
|
1467 |
|
1468 | var $getTime = callBound('Date.prototype.getTime');
|
1469 | var gPO = Object.getPrototypeOf;
|
1470 | var $objToString = callBound('Object.prototype.toString');
|
1471 |
|
1472 | var $Set = GetIntrinsic('%Set%', true);
|
1473 | var $mapHas = callBound('Map.prototype.has', true);
|
1474 | var $mapGet = callBound('Map.prototype.get', true);
|
1475 | var $mapSize = callBound('Map.prototype.size', true);
|
1476 | var $setAdd = callBound('Set.prototype.add', true);
|
1477 | var $setDelete = callBound('Set.prototype.delete', true);
|
1478 | var $setHas = callBound('Set.prototype.has', true);
|
1479 | var $setSize = callBound('Set.prototype.size', true);
|
1480 |
|
1481 | // taken from https://github.com/browserify/commonjs-assert/blob/bba838e9ba9e28edf3127ce6974624208502f6bc/internal/util/comparisons.js#L401-L414
|
1482 | function setHasEqualElement(set, val1, opts, channel) {
|
1483 | var i = getIterator(set);
|
1484 | var result;
|
1485 | while ((result = i.next()) && !result.done) {
|
1486 | if (internalDeepEqual(val1, result.value, opts, channel)) { // eslint-disable-line no-use-before-define
|
1487 | // Remove the matching element to make sure we do not check that again.
|
1488 | $setDelete(set, result.value);
|
1489 | return true;
|
1490 | }
|
1491 | }
|
1492 |
|
1493 | return false;
|
1494 | }
|
1495 |
|
1496 | // taken from https://github.com/browserify/commonjs-assert/blob/bba838e9ba9e28edf3127ce6974624208502f6bc/internal/util/comparisons.js#L416-L439
|
1497 | function findLooseMatchingPrimitives(prim) {
|
1498 | if (typeof prim === 'undefined') {
|
1499 | return null;
|
1500 | }
|
1501 | if (typeof prim === 'object') { // Only pass in null as object!
|
1502 | return void 0;
|
1503 | }
|
1504 | if (typeof prim === 'symbol') {
|
1505 | return false;
|
1506 | }
|
1507 | if (typeof prim === 'string' || typeof prim === 'number') {
|
1508 | // Loose equal entries exist only if the string is possible to convert to a regular number and not NaN.
|
1509 | return +prim === +prim; // eslint-disable-line no-implicit-coercion
|
1510 | }
|
1511 | return true;
|
1512 | }
|
1513 |
|
1514 | // taken from https://github.com/browserify/commonjs-assert/blob/bba838e9ba9e28edf3127ce6974624208502f6bc/internal/util/comparisons.js#L449-L460
|
1515 | function mapMightHaveLoosePrim(a, b, prim, item, opts, channel) {
|
1516 | var altValue = findLooseMatchingPrimitives(prim);
|
1517 | if (altValue != null) {
|
1518 | return altValue;
|
1519 | }
|
1520 | var curB = $mapGet(b, altValue);
|
1521 | var looseOpts = assign({}, opts, { strict: false });
|
1522 | if (
|
1523 | (typeof curB === 'undefined' && !$mapHas(b, altValue))
|
1524 | // eslint-disable-next-line no-use-before-define
|
1525 | || !internalDeepEqual(item, curB, looseOpts, channel)
|
1526 | ) {
|
1527 | return false;
|
1528 | }
|
1529 | // eslint-disable-next-line no-use-before-define
|
1530 | return !$mapHas(a, altValue) && internalDeepEqual(item, curB, looseOpts, channel);
|
1531 | }
|
1532 |
|
1533 | // taken from https://github.com/browserify/commonjs-assert/blob/bba838e9ba9e28edf3127ce6974624208502f6bc/internal/util/comparisons.js#L441-L447
|
1534 | function setMightHaveLoosePrim(a, b, prim) {
|
1535 | var altValue = findLooseMatchingPrimitives(prim);
|
1536 | if (altValue != null) {
|
1537 | return altValue;
|
1538 | }
|
1539 |
|
1540 | return $setHas(b, altValue) && !$setHas(a, altValue);
|
1541 | }
|
1542 |
|
1543 | // taken from https://github.com/browserify/commonjs-assert/blob/bba838e9ba9e28edf3127ce6974624208502f6bc/internal/util/comparisons.js#L518-L533
|
1544 | function mapHasEqualEntry(set, map, key1, item1, opts, channel) {
|
1545 | var i = getIterator(set);
|
1546 | var result;
|
1547 | var key2;
|
1548 | while ((result = i.next()) && !result.done) {
|
1549 | key2 = result.value;
|
1550 | if (
|
1551 | // eslint-disable-next-line no-use-before-define
|
1552 | internalDeepEqual(key1, key2, opts, channel)
|
1553 | // eslint-disable-next-line no-use-before-define
|
1554 | && internalDeepEqual(item1, $mapGet(map, key2), opts, channel)
|
1555 | ) {
|
1556 | $setDelete(set, key2);
|
1557 | return true;
|
1558 | }
|
1559 | }
|
1560 |
|
1561 | return false;
|
1562 | }
|
1563 |
|
1564 | function internalDeepEqual(actual, expected, options, channel) {
|
1565 | var opts = options || {};
|
1566 |
|
1567 | // 7.1. All identical values are equivalent, as determined by ===.
|
1568 | if (opts.strict ? is(actual, expected) : actual === expected) {
|
1569 | return true;
|
1570 | }
|
1571 |
|
1572 | var actualBoxed = whichBoxedPrimitive(actual);
|
1573 | var expectedBoxed = whichBoxedPrimitive(expected);
|
1574 | if (actualBoxed !== expectedBoxed) {
|
1575 | return false;
|
1576 | }
|
1577 |
|
1578 | // 7.3. Other pairs that do not both pass typeof value == 'object', equivalence is determined by ==.
|
1579 | if (!actual || !expected || (typeof actual !== 'object' && typeof expected !== 'object')) {
|
1580 | return opts.strict ? is(actual, expected) : actual == expected; // eslint-disable-line eqeqeq
|
1581 | }
|
1582 |
|
1583 | /*
|
1584 | * 7.4. For all other Object pairs, including Array objects, equivalence is
|
1585 | * determined by having the same number of owned properties (as verified
|
1586 | * with Object.prototype.hasOwnProperty.call), the same set of keys
|
1587 | * (although not necessarily the same order), equivalent values for every
|
1588 | * corresponding key, and an identical 'prototype' property. Note: this
|
1589 | * accounts for both named and indexed properties on Arrays.
|
1590 | */
|
1591 | // see https://github.com/nodejs/node/commit/d3aafd02efd3a403d646a3044adcf14e63a88d32 for memos/channel inspiration
|
1592 |
|
1593 | var hasActual = channel.has(actual);
|
1594 | var hasExpected = channel.has(expected);
|
1595 | var sentinel;
|
1596 | if (hasActual && hasExpected) {
|
1597 | if (channel.get(actual) === channel.get(expected)) {
|
1598 | return true;
|
1599 | }
|
1600 | } else {
|
1601 | sentinel = {};
|
1602 | }
|
1603 | if (!hasActual) { channel.set(actual, sentinel); }
|
1604 | if (!hasExpected) { channel.set(expected, sentinel); }
|
1605 |
|
1606 | // eslint-disable-next-line no-use-before-define
|
1607 | return objEquiv(actual, expected, opts, channel);
|
1608 | }
|
1609 |
|
1610 | function isBuffer(x) {
|
1611 | if (!x || typeof x !== 'object' || typeof x.length !== 'number') {
|
1612 | return false;
|
1613 | }
|
1614 | if (typeof x.copy !== 'function' || typeof x.slice !== 'function') {
|
1615 | return false;
|
1616 | }
|
1617 | if (x.length > 0 && typeof x[0] !== 'number') {
|
1618 | return false;
|
1619 | }
|
1620 |
|
1621 | return !!(x.constructor && x.constructor.isBuffer && x.constructor.isBuffer(x));
|
1622 | }
|
1623 |
|
1624 | function setEquiv(a, b, opts, channel) {
|
1625 | if ($setSize(a) !== $setSize(b)) {
|
1626 | return false;
|
1627 | }
|
1628 | var iA = getIterator(a);
|
1629 | var iB = getIterator(b);
|
1630 | var resultA;
|
1631 | var resultB;
|
1632 | var set;
|
1633 | while ((resultA = iA.next()) && !resultA.done) {
|
1634 | if (resultA.value && typeof resultA.value === 'object') {
|
1635 | if (!set) { set = new $Set(); }
|
1636 | $setAdd(set, resultA.value);
|
1637 | } else if (!$setHas(b, resultA.value)) {
|
1638 | if (opts.strict) { return false; }
|
1639 | if (!setMightHaveLoosePrim(a, b, resultA.value)) {
|
1640 | return false;
|
1641 | }
|
1642 | if (!set) { set = new $Set(); }
|
1643 | $setAdd(set, resultA.value);
|
1644 | }
|
1645 | }
|
1646 | if (set) {
|
1647 | while ((resultB = iB.next()) && !resultB.done) {
|
1648 | // We have to check if a primitive value is already matching and only if it's not, go hunting for it.
|
1649 | if (resultB.value && typeof resultB.value === 'object') {
|
1650 | if (!setHasEqualElement(set, resultB.value, opts.strict, channel)) {
|
1651 | return false;
|
1652 | }
|
1653 | } else if (
|
1654 | !opts.strict
|
1655 | && !$setHas(a, resultB.value)
|
1656 | && !setHasEqualElement(set, resultB.value, opts.strict, channel)
|
1657 | ) {
|
1658 | return false;
|
1659 | }
|
1660 | }
|
1661 | return $setSize(set) === 0;
|
1662 | }
|
1663 | return true;
|
1664 | }
|
1665 |
|
1666 | function mapEquiv(a, b, opts, channel) {
|
1667 | if ($mapSize(a) !== $mapSize(b)) {
|
1668 | return false;
|
1669 | }
|
1670 | var iA = getIterator(a);
|
1671 | var iB = getIterator(b);
|
1672 | var resultA;
|
1673 | var resultB;
|
1674 | var set;
|
1675 | var key;
|
1676 | var item1;
|
1677 | var item2;
|
1678 | while ((resultA = iA.next()) && !resultA.done) {
|
1679 | key = resultA.value[0];
|
1680 | item1 = resultA.value[1];
|
1681 | if (key && typeof key === 'object') {
|
1682 | if (!set) { set = new $Set(); }
|
1683 | $setAdd(set, key);
|
1684 | } else {
|
1685 | item2 = $mapGet(b, key);
|
1686 | if ((typeof item2 === 'undefined' && !$mapHas(b, key)) || !internalDeepEqual(item1, item2, opts, channel)) {
|
1687 | if (opts.strict) {
|
1688 | return false;
|
1689 | }
|
1690 | if (!mapMightHaveLoosePrim(a, b, key, item1, opts, channel)) {
|
1691 | return false;
|
1692 | }
|
1693 | if (!set) { set = new $Set(); }
|
1694 | $setAdd(set, key);
|
1695 | }
|
1696 | }
|
1697 | }
|
1698 |
|
1699 | if (set) {
|
1700 | while ((resultB = iB.next()) && !resultB.done) {
|
1701 | key = resultB.value[0];
|
1702 | item2 = resultB.value[1];
|
1703 | if (key && typeof key === 'object') {
|
1704 | if (!mapHasEqualEntry(set, a, key, item2, opts, channel)) {
|
1705 | return false;
|
1706 | }
|
1707 | } else if (
|
1708 | !opts.strict
|
1709 | && (!a.has(key) || !internalDeepEqual($mapGet(a, key), item2, opts, channel))
|
1710 | && !mapHasEqualEntry(set, a, key, item2, assign({}, opts, { strict: false }), channel)
|
1711 | ) {
|
1712 | return false;
|
1713 | }
|
1714 | }
|
1715 | return $setSize(set) === 0;
|
1716 | }
|
1717 | return true;
|
1718 | }
|
1719 |
|
1720 | function objEquiv(a, b, opts, channel) {
|
1721 | /* eslint max-statements: [2, 100], max-lines-per-function: [2, 120], max-depth: [2, 5] */
|
1722 | var i, key;
|
1723 |
|
1724 | if (typeof a !== typeof b) { return false; }
|
1725 | if (a == null || b == null) { return false; }
|
1726 |
|
1727 | if ($objToString(a) !== $objToString(b)) { return false; }
|
1728 |
|
1729 | if (isArguments(a) !== isArguments(b)) { return false; }
|
1730 |
|
1731 | var aIsArray = isArray(a);
|
1732 | var bIsArray = isArray(b);
|
1733 | if (aIsArray !== bIsArray) { return false; }
|
1734 |
|
1735 | // TODO: replace when a cross-realm brand check is available
|
1736 | var aIsError = a instanceof Error;
|
1737 | var bIsError = b instanceof Error;
|
1738 | if (aIsError !== bIsError) { return false; }
|
1739 | if (aIsError || bIsError) {
|
1740 | if (a.name !== b.name || a.message !== b.message) { return false; }
|
1741 | }
|
1742 |
|
1743 | var aIsRegex = isRegex(a);
|
1744 | var bIsRegex = isRegex(b);
|
1745 | if (aIsRegex !== bIsRegex) { return false; }
|
1746 | if ((aIsRegex || bIsRegex) && (a.source !== b.source || flags(a) !== flags(b))) {
|
1747 | return false;
|
1748 | }
|
1749 |
|
1750 | var aIsDate = isDate(a);
|
1751 | var bIsDate = isDate(b);
|
1752 | if (aIsDate !== bIsDate) { return false; }
|
1753 | if (aIsDate || bIsDate) { // && would work too, because both are true or both false here
|
1754 | if ($getTime(a) !== $getTime(b)) { return false; }
|
1755 | }
|
1756 | if (opts.strict && gPO && gPO(a) !== gPO(b)) { return false; }
|
1757 |
|
1758 | if (whichTypedArray(a) !== whichTypedArray(b)) {
|
1759 | return false;
|
1760 | }
|
1761 |
|
1762 | var aIsBuffer = isBuffer(a);
|
1763 | var bIsBuffer = isBuffer(b);
|
1764 | if (aIsBuffer !== bIsBuffer) { return false; }
|
1765 | if (aIsBuffer || bIsBuffer) { // && would work too, because both are true or both false here
|
1766 | if (a.length !== b.length) { return false; }
|
1767 | for (i = 0; i < a.length; i++) {
|
1768 | if (a[i] !== b[i]) { return false; }
|
1769 | }
|
1770 | return true;
|
1771 | }
|
1772 |
|
1773 | if (typeof a !== typeof b) { return false; }
|
1774 |
|
1775 | var ka = objectKeys(a);
|
1776 | var kb = objectKeys(b);
|
1777 | // having the same number of owned properties (keys incorporates hasOwnProperty)
|
1778 | if (ka.length !== kb.length) { return false; }
|
1779 |
|
1780 | // the same set of keys (although not necessarily the same order),
|
1781 | ka.sort();
|
1782 | kb.sort();
|
1783 | // ~~~cheap key test
|
1784 | for (i = ka.length - 1; i >= 0; i--) {
|
1785 | if (ka[i] != kb[i]) { return false; } // eslint-disable-line eqeqeq
|
1786 | }
|
1787 |
|
1788 | // equivalent values for every corresponding key, and ~~~possibly expensive deep test
|
1789 | for (i = ka.length - 1; i >= 0; i--) {
|
1790 | key = ka[i];
|
1791 | if (!internalDeepEqual(a[key], b[key], opts, channel)) { return false; }
|
1792 | }
|
1793 |
|
1794 | var aCollection = whichCollection(a);
|
1795 | var bCollection = whichCollection(b);
|
1796 | if (aCollection !== bCollection) {
|
1797 | return false;
|
1798 | }
|
1799 | if (aCollection === 'Set' || bCollection === 'Set') { // aCollection === bCollection
|
1800 | return setEquiv(a, b, opts, channel);
|
1801 | }
|
1802 | if (aCollection === 'Map') { // aCollection === bCollection
|
1803 | return mapEquiv(a, b, opts, channel);
|
1804 | }
|
1805 |
|
1806 | return true;
|
1807 | }
|
1808 |
|
1809 | module.exports = function deepEqual(a, b, opts) {
|
1810 | return internalDeepEqual(a, b, opts, getSideChannel());
|
1811 | };
|
1812 |
|
1813 | },{"call-bind/callBound":10,"es-get-iterator":26,"get-intrinsic":33,"is-arguments":41,"is-date-object":45,"is-regex":48,"isarray":55,"object-is":59,"object-keys":63,"object.assign":66,"regexp.prototype.flags":70,"side-channel":74,"which-boxed-primitive":80,"which-collection":81,"which-typed-array":82}],13:[function(require,module,exports){
|
1814 | ;
|
1815 |
|
1816 | var keys = require('object-keys');
|
1817 | var hasSymbols = typeof Symbol === 'function' && typeof Symbol('foo') === 'symbol';
|
1818 |
|
1819 | var toStr = Object.prototype.toString;
|
1820 | var concat = Array.prototype.concat;
|
1821 | var origDefineProperty = Object.defineProperty;
|
1822 |
|
1823 | var isFunction = function (fn) {
|
1824 | return typeof fn === 'function' && toStr.call(fn) === '[object Function]';
|
1825 | };
|
1826 |
|
1827 | var hasPropertyDescriptors = require('has-property-descriptors')();
|
1828 |
|
1829 | var supportsDescriptors = origDefineProperty && hasPropertyDescriptors;
|
1830 |
|
1831 | var defineProperty = function (object, name, value, predicate) {
|
1832 | if (name in object && (!isFunction(predicate) || !predicate())) {
|
1833 | return;
|
1834 | }
|
1835 | if (supportsDescriptors) {
|
1836 | origDefineProperty(object, name, {
|
1837 | configurable: true,
|
1838 | enumerable: false,
|
1839 | value: value,
|
1840 | writable: true
|
1841 | });
|
1842 | } else {
|
1843 | object[name] = value; // eslint-disable-line no-param-reassign
|
1844 | }
|
1845 | };
|
1846 |
|
1847 | var defineProperties = function (object, map) {
|
1848 | var predicates = arguments.length > 2 ? arguments[2] : {};
|
1849 | var props = keys(map);
|
1850 | if (hasSymbols) {
|
1851 | props = concat.call(props, Object.getOwnPropertySymbols(map));
|
1852 | }
|
1853 | for (var i = 0; i < props.length; i += 1) {
|
1854 | defineProperty(object, props[i], map[props[i]], predicates[props[i]]);
|
1855 | }
|
1856 | };
|
1857 |
|
1858 | defineProperties.supportsDescriptors = !!supportsDescriptors;
|
1859 |
|
1860 | module.exports = defineProperties;
|
1861 |
|
1862 | },{"has-property-descriptors":35,"object-keys":63}],14:[function(require,module,exports){
|
1863 | module.exports = function () {
|
1864 | for (var i = 0; i < arguments.length; i++) {
|
1865 | if (arguments[i] !== undefined) return arguments[i];
|
1866 | }
|
1867 | };
|
1868 |
|
1869 | },{}],15:[function(require,module,exports){
|
1870 | ;
|
1871 |
|
1872 | // http://262.ecma-international.org/5.1/#sec-9.11
|
1873 |
|
1874 | module.exports = require('is-callable');
|
1875 |
|
1876 | },{"is-callable":44}],16:[function(require,module,exports){
|
1877 | ;
|
1878 |
|
1879 | module.exports = require('../5/CheckObjectCoercible');
|
1880 |
|
1881 | },{"../5/CheckObjectCoercible":22}],17:[function(require,module,exports){
|
1882 | ;
|
1883 |
|
1884 | var GetIntrinsic = require('get-intrinsic');
|
1885 |
|
1886 | var $TypeError = GetIntrinsic('%TypeError%');
|
1887 | var $Number = GetIntrinsic('%Number%');
|
1888 | var $RegExp = GetIntrinsic('%RegExp%');
|
1889 | var $parseInteger = GetIntrinsic('%parseInt%');
|
1890 |
|
1891 | var callBound = require('call-bind/callBound');
|
1892 | var regexTester = require('../helpers/regexTester');
|
1893 | var isPrimitive = require('../helpers/isPrimitive');
|
1894 |
|
1895 | var $strSlice = callBound('String.prototype.slice');
|
1896 | var isBinary = regexTester(/^0b[01]+$/i);
|
1897 | var isOctal = regexTester(/^0o[0-7]+$/i);
|
1898 | var isInvalidHexLiteral = regexTester(/^[-+]0x[0-9a-f]+$/i);
|
1899 | var nonWS = ['\u0085', '\u200b', '\ufffe'].join('');
|
1900 | var nonWSregex = new $RegExp('[' + nonWS + ']', 'g');
|
1901 | var hasNonWS = regexTester(nonWSregex);
|
1902 |
|
1903 | // whitespace from: https://es5.github.io/#x15.5.4.20
|
1904 | // implementation from https://github.com/es-shims/es5-shim/blob/v3.4.0/es5-shim.js#L1304-L1324
|
1905 | var ws = [
|
1906 | '\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003',
|
1907 | '\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028',
|
1908 | '\u2029\uFEFF'
|
1909 | ].join('');
|
1910 | var trimRegex = new RegExp('(^[' + ws + ']+)|([' + ws + ']+$)', 'g');
|
1911 | var $replace = callBound('String.prototype.replace');
|
1912 | var $trim = function (value) {
|
1913 | return $replace(value, trimRegex, '');
|
1914 | };
|
1915 |
|
1916 | var ToPrimitive = require('./ToPrimitive');
|
1917 |
|
1918 | // https://ecma-international.org/ecma-262/6.0/#sec-tonumber
|
1919 |
|
1920 | module.exports = function ToNumber(argument) {
|
1921 | var value = isPrimitive(argument) ? argument : ToPrimitive(argument, $Number);
|
1922 | if (typeof value === 'symbol') {
|
1923 | throw new $TypeError('Cannot convert a Symbol value to a number');
|
1924 | }
|
1925 | if (typeof value === 'bigint') {
|
1926 | throw new $TypeError('Conversion from \'BigInt\' to \'number\' is not allowed.');
|
1927 | }
|
1928 | if (typeof value === 'string') {
|
1929 | if (isBinary(value)) {
|
1930 | return ToNumber($parseInteger($strSlice(value, 2), 2));
|
1931 | } else if (isOctal(value)) {
|
1932 | return ToNumber($parseInteger($strSlice(value, 2), 8));
|
1933 | } else if (hasNonWS(value) || isInvalidHexLiteral(value)) {
|
1934 | return NaN;
|
1935 | }
|
1936 | var trimmed = $trim(value);
|
1937 | if (trimmed !== value) {
|
1938 | return ToNumber(trimmed);
|
1939 | }
|
1940 |
|
1941 | }
|
1942 | return $Number(value);
|
1943 | };
|
1944 |
|
1945 | },{"../helpers/isPrimitive":24,"../helpers/regexTester":25,"./ToPrimitive":19,"call-bind/callBound":10,"get-intrinsic":33}],18:[function(require,module,exports){
|
1946 | ;
|
1947 |
|
1948 | var GetIntrinsic = require('get-intrinsic');
|
1949 |
|
1950 | var $Object = GetIntrinsic('%Object%');
|
1951 |
|
1952 | var RequireObjectCoercible = require('./RequireObjectCoercible');
|
1953 |
|
1954 | // https://ecma-international.org/ecma-262/6.0/#sec-toobject
|
1955 |
|
1956 | module.exports = function ToObject(value) {
|
1957 | RequireObjectCoercible(value);
|
1958 | return $Object(value);
|
1959 | };
|
1960 |
|
1961 | },{"./RequireObjectCoercible":16,"get-intrinsic":33}],19:[function(require,module,exports){
|
1962 | ;
|
1963 |
|
1964 | var toPrimitive = require('es-to-primitive/es2015');
|
1965 |
|
1966 | // https://ecma-international.org/ecma-262/6.0/#sec-toprimitive
|
1967 |
|
1968 | module.exports = function ToPrimitive(input) {
|
1969 | if (arguments.length > 1) {
|
1970 | return toPrimitive(input, arguments[1]);
|
1971 | }
|
1972 | return toPrimitive(input);
|
1973 | };
|
1974 |
|
1975 | },{"es-to-primitive/es2015":27}],20:[function(require,module,exports){
|
1976 | ;
|
1977 |
|
1978 | var GetIntrinsic = require('get-intrinsic');
|
1979 |
|
1980 | var $String = GetIntrinsic('%String%');
|
1981 | var $TypeError = GetIntrinsic('%TypeError%');
|
1982 |
|
1983 | // https://ecma-international.org/ecma-262/6.0/#sec-tostring
|
1984 |
|
1985 | module.exports = function ToString(argument) {
|
1986 | if (typeof argument === 'symbol') {
|
1987 | throw new $TypeError('Cannot convert a Symbol value to a string');
|
1988 | }
|
1989 | return $String(argument);
|
1990 | };
|
1991 |
|
1992 | },{"get-intrinsic":33}],21:[function(require,module,exports){
|
1993 | ;
|
1994 |
|
1995 | var ToNumber = require('./ToNumber');
|
1996 |
|
1997 | // http://262.ecma-international.org/5.1/#sec-9.6
|
1998 |
|
1999 | module.exports = function ToUint32(x) {
|
2000 | return ToNumber(x) >>> 0;
|
2001 | };
|
2002 |
|
2003 | },{"./ToNumber":17}],22:[function(require,module,exports){
|
2004 | ;
|
2005 |
|
2006 | var GetIntrinsic = require('get-intrinsic');
|
2007 |
|
2008 | var $TypeError = GetIntrinsic('%TypeError%');
|
2009 |
|
2010 | // http://262.ecma-international.org/5.1/#sec-9.10
|
2011 |
|
2012 | module.exports = function CheckObjectCoercible(value, optMessage) {
|
2013 | if (value == null) {
|
2014 | throw new $TypeError(optMessage || ('Cannot call method on ' + value));
|
2015 | }
|
2016 | return value;
|
2017 | };
|
2018 |
|
2019 | },{"get-intrinsic":33}],23:[function(require,module,exports){
|
2020 | ;
|
2021 |
|
2022 | var GetIntrinsic = require('get-intrinsic');
|
2023 |
|
2024 | var $gOPD = GetIntrinsic('%Object.getOwnPropertyDescriptor%', true);
|
2025 | if ($gOPD) {
|
2026 | try {
|
2027 | $gOPD([], 'length');
|
2028 | } catch (e) {
|
2029 | // IE 8 has a broken gOPD
|
2030 | $gOPD = null;
|
2031 | }
|
2032 | }
|
2033 |
|
2034 | module.exports = $gOPD;
|
2035 |
|
2036 | },{"get-intrinsic":33}],24:[function(require,module,exports){
|
2037 | ;
|
2038 |
|
2039 | module.exports = function isPrimitive(value) {
|
2040 | return value === null || (typeof value !== 'function' && typeof value !== 'object');
|
2041 | };
|
2042 |
|
2043 | },{}],25:[function(require,module,exports){
|
2044 | ;
|
2045 |
|
2046 | var callBound = require('call-bind/callBound');
|
2047 |
|
2048 | var $exec = callBound('RegExp.prototype.exec');
|
2049 |
|
2050 | module.exports = function regexTester(regex) {
|
2051 | return function test(s) { return $exec(regex, s) !== null; };
|
2052 | };
|
2053 |
|
2054 | },{"call-bind/callBound":10}],26:[function(require,module,exports){
|
2055 | (function (process){
|
2056 | ;
|
2057 |
|
2058 | /* eslint global-require: 0 */
|
2059 | // the code is structured this way so that bundlers can
|
2060 | // alias out `has-symbols` to `() => true` or `() => false` if your target
|
2061 | // environments' Symbol capabilities are known, and then use
|
2062 | // dead code elimination on the rest of this module.
|
2063 | //
|
2064 | // Similarly, `isarray` can be aliased to `Array.isArray` if
|
2065 | // available in all target environments.
|
2066 |
|
2067 | var isArguments = require('is-arguments');
|
2068 |
|
2069 | if (require('has-symbols')() || require('has-symbols/shams')()) {
|
2070 | var $iterator = Symbol.iterator;
|
2071 | // Symbol is available natively or shammed
|
2072 | // natively:
|
2073 | // - Chrome >= 38
|
2074 | // - Edge 12-14?, Edge >= 15 for sure
|
2075 | // - FF >= 36
|
2076 | // - Safari >= 9
|
2077 | // - node >= 0.12
|
2078 | module.exports = function getIterator(iterable) {
|
2079 | // alternatively, `iterable[$iterator]?.()`
|
2080 | if (iterable != null && typeof iterable[$iterator] !== 'undefined') {
|
2081 | return iterable[$iterator]();
|
2082 | }
|
2083 | if (isArguments(iterable)) {
|
2084 | // arguments objects lack Symbol.iterator
|
2085 | // - node 0.12
|
2086 | return Array.prototype[$iterator].call(iterable);
|
2087 | }
|
2088 | };
|
2089 | } else {
|
2090 | // Symbol is not available, native or shammed
|
2091 | var isArray = require('isarray');
|
2092 | var isString = require('is-string');
|
2093 | var GetIntrinsic = require('get-intrinsic');
|
2094 | var $Map = GetIntrinsic('%Map%', true);
|
2095 | var $Set = GetIntrinsic('%Set%', true);
|
2096 | var callBound = require('call-bind/callBound');
|
2097 | var $arrayPush = callBound('Array.prototype.push');
|
2098 | var $charCodeAt = callBound('String.prototype.charCodeAt');
|
2099 | var $stringSlice = callBound('String.prototype.slice');
|
2100 |
|
2101 | var advanceStringIndex = function advanceStringIndex(S, index) {
|
2102 | var length = S.length;
|
2103 | if ((index + 1) >= length) {
|
2104 | return index + 1;
|
2105 | }
|
2106 |
|
2107 | var first = $charCodeAt(S, index);
|
2108 | if (first < 0xD800 || first > 0xDBFF) {
|
2109 | return index + 1;
|
2110 | }
|
2111 |
|
2112 | var second = $charCodeAt(S, index + 1);
|
2113 | if (second < 0xDC00 || second > 0xDFFF) {
|
2114 | return index + 1;
|
2115 | }
|
2116 |
|
2117 | return index + 2;
|
2118 | };
|
2119 |
|
2120 | var getArrayIterator = function getArrayIterator(arraylike) {
|
2121 | var i = 0;
|
2122 | return {
|
2123 | next: function next() {
|
2124 | var done = i >= arraylike.length;
|
2125 | var value;
|
2126 | if (!done) {
|
2127 | value = arraylike[i];
|
2128 | i += 1;
|
2129 | }
|
2130 | return {
|
2131 | done: done,
|
2132 | value: value
|
2133 | };
|
2134 | }
|
2135 | };
|
2136 | };
|
2137 |
|
2138 | var getNonCollectionIterator = function getNonCollectionIterator(iterable, noPrimordialCollections) {
|
2139 | if (isArray(iterable) || isArguments(iterable)) {
|
2140 | return getArrayIterator(iterable);
|
2141 | }
|
2142 | if (isString(iterable)) {
|
2143 | var i = 0;
|
2144 | return {
|
2145 | next: function next() {
|
2146 | var nextIndex = advanceStringIndex(iterable, i);
|
2147 | var value = $stringSlice(iterable, i, nextIndex);
|
2148 | i = nextIndex;
|
2149 | return {
|
2150 | done: nextIndex > iterable.length,
|
2151 | value: value
|
2152 | };
|
2153 | }
|
2154 | };
|
2155 | }
|
2156 |
|
2157 | // es6-shim and es-shims' es-map use a string "_es6-shim iterator_" property on different iterables, such as MapIterator.
|
2158 | if (noPrimordialCollections && typeof iterable['_es6-shim iterator_'] !== 'undefined') {
|
2159 | return iterable['_es6-shim iterator_']();
|
2160 | }
|
2161 | };
|
2162 |
|
2163 | if (!$Map && !$Set) {
|
2164 | // the only language iterables are Array, String, arguments
|
2165 | // - Safari <= 6.0
|
2166 | // - Chrome < 38
|
2167 | // - node < 0.12
|
2168 | // - FF < 13
|
2169 | // - IE < 11
|
2170 | // - Edge < 11
|
2171 |
|
2172 | module.exports = function getIterator(iterable) {
|
2173 | if (iterable != null) {
|
2174 | return getNonCollectionIterator(iterable, true);
|
2175 | }
|
2176 | };
|
2177 | } else {
|
2178 | // either Map or Set are available, but Symbol is not
|
2179 | // - es6-shim on an ES5 browser
|
2180 | // - Safari 6.2 (maybe 6.1?)
|
2181 | // - FF v[13, 36)
|
2182 | // - IE 11
|
2183 | // - Edge 11
|
2184 | // - Safari v[6, 9)
|
2185 |
|
2186 | var isMap = require('is-map');
|
2187 | var isSet = require('is-set');
|
2188 |
|
2189 | // Firefox >= 27, IE 11, Safari 6.2 - 9, Edge 11, es6-shim in older envs, all have forEach
|
2190 | var $mapForEach = callBound('Map.prototype.forEach', true);
|
2191 | var $setForEach = callBound('Set.prototype.forEach', true);
|
2192 | if (typeof process === 'undefined' || !process.versions || !process.versions.node) { // "if is not node"
|
2193 |
|
2194 | // Firefox 17 - 26 has `.iterator()`, whose iterator `.next()` either
|
2195 | // returns a value, or throws a StopIteration object. These browsers
|
2196 | // do not have any other mechanism for iteration.
|
2197 | var $mapIterator = callBound('Map.prototype.iterator', true);
|
2198 | var $setIterator = callBound('Set.prototype.iterator', true);
|
2199 | var getStopIterationIterator = function (iterator) {
|
2200 | var done = false;
|
2201 | return {
|
2202 | next: function next() {
|
2203 | try {
|
2204 | return {
|
2205 | done: done,
|
2206 | value: done ? undefined : iterator.next()
|
2207 | };
|
2208 | } catch (e) {
|
2209 | done = true;
|
2210 | return {
|
2211 | done: true,
|
2212 | value: undefined
|
2213 | };
|
2214 | }
|
2215 | }
|
2216 | };
|
2217 | };
|
2218 | }
|
2219 | // Firefox 27-35, and some older es6-shim versions, use a string "@@iterator" property
|
2220 | // this returns a proper iterator object, so we should use it instead of forEach.
|
2221 | // newer es6-shim versions use a string "_es6-shim iterator_" property.
|
2222 | var $mapAtAtIterator = callBound('Map.prototype.@@iterator', true) || callBound('Map.prototype._es6-shim iterator_', true);
|
2223 | var $setAtAtIterator = callBound('Set.prototype.@@iterator', true) || callBound('Set.prototype._es6-shim iterator_', true);
|
2224 |
|
2225 | var getCollectionIterator = function getCollectionIterator(iterable) {
|
2226 | if (isMap(iterable)) {
|
2227 | if ($mapIterator) {
|
2228 | return getStopIterationIterator($mapIterator(iterable));
|
2229 | }
|
2230 | if ($mapAtAtIterator) {
|
2231 | return $mapAtAtIterator(iterable);
|
2232 | }
|
2233 | if ($mapForEach) {
|
2234 | var entries = [];
|
2235 | $mapForEach(iterable, function (v, k) {
|
2236 | $arrayPush(entries, [k, v]);
|
2237 | });
|
2238 | return getArrayIterator(entries);
|
2239 | }
|
2240 | }
|
2241 | if (isSet(iterable)) {
|
2242 | if ($setIterator) {
|
2243 | return getStopIterationIterator($setIterator(iterable));
|
2244 | }
|
2245 | if ($setAtAtIterator) {
|
2246 | return $setAtAtIterator(iterable);
|
2247 | }
|
2248 | if ($setForEach) {
|
2249 | var values = [];
|
2250 | $setForEach(iterable, function (v) {
|
2251 | $arrayPush(values, v);
|
2252 | });
|
2253 | return getArrayIterator(values);
|
2254 | }
|
2255 | }
|
2256 | };
|
2257 |
|
2258 | module.exports = function getIterator(iterable) {
|
2259 | return getCollectionIterator(iterable) || getNonCollectionIterator(iterable);
|
2260 | };
|
2261 | }
|
2262 | }
|
2263 |
|
2264 | }).call(this,require("KliubH"))
|
2265 | },{"KliubH":91,"call-bind/callBound":10,"get-intrinsic":33,"has-symbols":36,"has-symbols/shams":37,"is-arguments":41,"is-map":46,"is-set":49,"is-string":50,"isarray":55}],27:[function(require,module,exports){
|
2266 | ;
|
2267 |
|
2268 | var hasSymbols = typeof Symbol === 'function' && typeof Symbol.iterator === 'symbol';
|
2269 |
|
2270 | var isPrimitive = require('./helpers/isPrimitive');
|
2271 | var isCallable = require('is-callable');
|
2272 | var isDate = require('is-date-object');
|
2273 | var isSymbol = require('is-symbol');
|
2274 |
|
2275 | var ordinaryToPrimitive = function OrdinaryToPrimitive(O, hint) {
|
2276 | if (typeof O === 'undefined' || O === null) {
|
2277 | throw new TypeError('Cannot call method on ' + O);
|
2278 | }
|
2279 | if (typeof hint !== 'string' || (hint !== 'number' && hint !== 'string')) {
|
2280 | throw new TypeError('hint must be "string" or "number"');
|
2281 | }
|
2282 | var methodNames = hint === 'string' ? ['toString', 'valueOf'] : ['valueOf', 'toString'];
|
2283 | var method, result, i;
|
2284 | for (i = 0; i < methodNames.length; ++i) {
|
2285 | method = O[methodNames[i]];
|
2286 | if (isCallable(method)) {
|
2287 | result = method.call(O);
|
2288 | if (isPrimitive(result)) {
|
2289 | return result;
|
2290 | }
|
2291 | }
|
2292 | }
|
2293 | throw new TypeError('No default value');
|
2294 | };
|
2295 |
|
2296 | var GetMethod = function GetMethod(O, P) {
|
2297 | var func = O[P];
|
2298 | if (func !== null && typeof func !== 'undefined') {
|
2299 | if (!isCallable(func)) {
|
2300 | throw new TypeError(func + ' returned for property ' + P + ' of object ' + O + ' is not a function');
|
2301 | }
|
2302 | return func;
|
2303 | }
|
2304 | return void 0;
|
2305 | };
|
2306 |
|
2307 | // http://www.ecma-international.org/ecma-262/6.0/#sec-toprimitive
|
2308 | module.exports = function ToPrimitive(input) {
|
2309 | if (isPrimitive(input)) {
|
2310 | return input;
|
2311 | }
|
2312 | var hint = 'default';
|
2313 | if (arguments.length > 1) {
|
2314 | if (arguments[1] === String) {
|
2315 | hint = 'string';
|
2316 | } else if (arguments[1] === Number) {
|
2317 | hint = 'number';
|
2318 | }
|
2319 | }
|
2320 |
|
2321 | var exoticToPrim;
|
2322 | if (hasSymbols) {
|
2323 | if (Symbol.toPrimitive) {
|
2324 | exoticToPrim = GetMethod(input, Symbol.toPrimitive);
|
2325 | } else if (isSymbol(input)) {
|
2326 | exoticToPrim = Symbol.prototype.valueOf;
|
2327 | }
|
2328 | }
|
2329 | if (typeof exoticToPrim !== 'undefined') {
|
2330 | var result = exoticToPrim.call(input, hint);
|
2331 | if (isPrimitive(result)) {
|
2332 | return result;
|
2333 | }
|
2334 | throw new TypeError('unable to convert exotic object to primitive');
|
2335 | }
|
2336 | if (hint === 'default' && (isDate(input) || isSymbol(input))) {
|
2337 | hint = 'string';
|
2338 | }
|
2339 | return ordinaryToPrimitive(input, hint === 'default' ? 'number' : hint);
|
2340 | };
|
2341 |
|
2342 | },{"./helpers/isPrimitive":28,"is-callable":44,"is-date-object":45,"is-symbol":51}],28:[function(require,module,exports){
|
2343 | module.exports=require(24)
|
2344 | },{}],29:[function(require,module,exports){
|
2345 | ;
|
2346 |
|
2347 | var isCallable = require('is-callable');
|
2348 |
|
2349 | var toStr = Object.prototype.toString;
|
2350 | var hasOwnProperty = Object.prototype.hasOwnProperty;
|
2351 |
|
2352 | var forEachArray = function forEachArray(array, iterator, receiver) {
|
2353 | for (var i = 0, len = array.length; i < len; i++) {
|
2354 | if (hasOwnProperty.call(array, i)) {
|
2355 | if (receiver == null) {
|
2356 | iterator(array[i], i, array);
|
2357 | } else {
|
2358 | iterator.call(receiver, array[i], i, array);
|
2359 | }
|
2360 | }
|
2361 | }
|
2362 | };
|
2363 |
|
2364 | var forEachString = function forEachString(string, iterator, receiver) {
|
2365 | for (var i = 0, len = string.length; i < len; i++) {
|
2366 | // no such thing as a sparse string.
|
2367 | if (receiver == null) {
|
2368 | iterator(string.charAt(i), i, string);
|
2369 | } else {
|
2370 | iterator.call(receiver, string.charAt(i), i, string);
|
2371 | }
|
2372 | }
|
2373 | };
|
2374 |
|
2375 | var forEachObject = function forEachObject(object, iterator, receiver) {
|
2376 | for (var k in object) {
|
2377 | if (hasOwnProperty.call(object, k)) {
|
2378 | if (receiver == null) {
|
2379 | iterator(object[k], k, object);
|
2380 | } else {
|
2381 | iterator.call(receiver, object[k], k, object);
|
2382 | }
|
2383 | }
|
2384 | }
|
2385 | };
|
2386 |
|
2387 | var forEach = function forEach(list, iterator, thisArg) {
|
2388 | if (!isCallable(iterator)) {
|
2389 | throw new TypeError('iterator must be a function');
|
2390 | }
|
2391 |
|
2392 | var receiver;
|
2393 | if (arguments.length >= 3) {
|
2394 | receiver = thisArg;
|
2395 | }
|
2396 |
|
2397 | if (toStr.call(list) === '[object Array]') {
|
2398 | forEachArray(list, iterator, receiver);
|
2399 | } else if (typeof list === 'string') {
|
2400 | forEachString(list, iterator, receiver);
|
2401 | } else {
|
2402 | forEachObject(list, iterator, receiver);
|
2403 | }
|
2404 | };
|
2405 |
|
2406 | module.exports = forEach;
|
2407 |
|
2408 | },{"is-callable":44}],30:[function(require,module,exports){
|
2409 | ;
|
2410 |
|
2411 | /* eslint no-invalid-this: 1 */
|
2412 |
|
2413 | var ERROR_MESSAGE = 'Function.prototype.bind called on incompatible ';
|
2414 | var slice = Array.prototype.slice;
|
2415 | var toStr = Object.prototype.toString;
|
2416 | var funcType = '[object Function]';
|
2417 |
|
2418 | module.exports = function bind(that) {
|
2419 | var target = this;
|
2420 | if (typeof target !== 'function' || toStr.call(target) !== funcType) {
|
2421 | throw new TypeError(ERROR_MESSAGE + target);
|
2422 | }
|
2423 | var args = slice.call(arguments, 1);
|
2424 |
|
2425 | var bound;
|
2426 | var binder = function () {
|
2427 | if (this instanceof bound) {
|
2428 | var result = target.apply(
|
2429 | this,
|
2430 | args.concat(slice.call(arguments))
|
2431 | );
|
2432 | if (Object(result) === result) {
|
2433 | return result;
|
2434 | }
|
2435 | return this;
|
2436 | } else {
|
2437 | return target.apply(
|
2438 | that,
|
2439 | args.concat(slice.call(arguments))
|
2440 | );
|
2441 | }
|
2442 | };
|
2443 |
|
2444 | var boundLength = Math.max(0, target.length - args.length);
|
2445 | var boundArgs = [];
|
2446 | for (var i = 0; i < boundLength; i++) {
|
2447 | boundArgs.push('$' + i);
|
2448 | }
|
2449 |
|
2450 | bound = Function('binder', 'return function (' + boundArgs.join(',') + '){ return binder.apply(this,arguments); }')(binder);
|
2451 |
|
2452 | if (target.prototype) {
|
2453 | var Empty = function Empty() {};
|
2454 | Empty.prototype = target.prototype;
|
2455 | bound.prototype = new Empty();
|
2456 | Empty.prototype = null;
|
2457 | }
|
2458 |
|
2459 | return bound;
|
2460 | };
|
2461 |
|
2462 | },{}],31:[function(require,module,exports){
|
2463 | ;
|
2464 |
|
2465 | var implementation = require('./implementation');
|
2466 |
|
2467 | module.exports = Function.prototype.bind || implementation;
|
2468 |
|
2469 | },{"./implementation":30}],32:[function(require,module,exports){
|
2470 | ;
|
2471 |
|
2472 | var functionsHaveNames = function functionsHaveNames() {
|
2473 | return typeof function f() {}.name === 'string';
|
2474 | };
|
2475 |
|
2476 | var gOPD = Object.getOwnPropertyDescriptor;
|
2477 | if (gOPD) {
|
2478 | try {
|
2479 | gOPD([], 'length');
|
2480 | } catch (e) {
|
2481 | // IE 8 has a broken gOPD
|
2482 | gOPD = null;
|
2483 | }
|
2484 | }
|
2485 |
|
2486 | functionsHaveNames.functionsHaveConfigurableNames = function functionsHaveConfigurableNames() {
|
2487 | if (!functionsHaveNames() || !gOPD) {
|
2488 | return false;
|
2489 | }
|
2490 | var desc = gOPD(function () {}, 'name');
|
2491 | return !!desc && !!desc.configurable;
|
2492 | };
|
2493 |
|
2494 | var $bind = Function.prototype.bind;
|
2495 |
|
2496 | functionsHaveNames.boundFunctionsHaveNames = function boundFunctionsHaveNames() {
|
2497 | return functionsHaveNames() && typeof $bind === 'function' && function f() {}.bind().name !== '';
|
2498 | };
|
2499 |
|
2500 | module.exports = functionsHaveNames;
|
2501 |
|
2502 | },{}],33:[function(require,module,exports){
|
2503 | ;
|
2504 |
|
2505 | var undefined;
|
2506 |
|
2507 | var $SyntaxError = SyntaxError;
|
2508 | var $Function = Function;
|
2509 | var $TypeError = TypeError;
|
2510 |
|
2511 | // eslint-disable-next-line consistent-return
|
2512 | var getEvalledConstructor = function (expressionSyntax) {
|
2513 | try {
|
2514 | return $Function('"use strict"; return (' + expressionSyntax + ').constructor;')();
|
2515 | } catch (e) {}
|
2516 | };
|
2517 |
|
2518 | var $gOPD = Object.getOwnPropertyDescriptor;
|
2519 | if ($gOPD) {
|
2520 | try {
|
2521 | $gOPD({}, '');
|
2522 | } catch (e) {
|
2523 | $gOPD = null; // this is IE 8, which has a broken gOPD
|
2524 | }
|
2525 | }
|
2526 |
|
2527 | var throwTypeError = function () {
|
2528 | throw new $TypeError();
|
2529 | };
|
2530 | var ThrowTypeError = $gOPD
|
2531 | ? (function () {
|
2532 | try {
|
2533 | // eslint-disable-next-line no-unused-expressions, no-caller, no-restricted-properties
|
2534 | arguments.callee; // IE 8 does not throw here
|
2535 | return throwTypeError;
|
2536 | } catch (calleeThrows) {
|
2537 | try {
|
2538 | // IE 8 throws on Object.getOwnPropertyDescriptor(arguments, '')
|
2539 | return $gOPD(arguments, 'callee').get;
|
2540 | } catch (gOPDthrows) {
|
2541 | return throwTypeError;
|
2542 | }
|
2543 | }
|
2544 | }())
|
2545 | : throwTypeError;
|
2546 |
|
2547 | var hasSymbols = require('has-symbols')();
|
2548 |
|
2549 | var getProto = Object.getPrototypeOf || function (x) { return x.__proto__; }; // eslint-disable-line no-proto
|
2550 |
|
2551 | var needsEval = {};
|
2552 |
|
2553 | var TypedArray = typeof Uint8Array === 'undefined' ? undefined : getProto(Uint8Array);
|
2554 |
|
2555 | var INTRINSICS = {
|
2556 | '%AggregateError%': typeof AggregateError === 'undefined' ? undefined : AggregateError,
|
2557 | '%Array%': Array,
|
2558 | '%ArrayBuffer%': typeof ArrayBuffer === 'undefined' ? undefined : ArrayBuffer,
|
2559 | '%ArrayIteratorPrototype%': hasSymbols ? getProto([][Symbol.iterator]()) : undefined,
|
2560 | '%AsyncFromSyncIteratorPrototype%': undefined,
|
2561 | '%AsyncFunction%': needsEval,
|
2562 | '%AsyncGenerator%': needsEval,
|
2563 | '%AsyncGeneratorFunction%': needsEval,
|
2564 | '%AsyncIteratorPrototype%': needsEval,
|
2565 | '%Atomics%': typeof Atomics === 'undefined' ? undefined : Atomics,
|
2566 | '%BigInt%': typeof BigInt === 'undefined' ? undefined : BigInt,
|
2567 | '%Boolean%': Boolean,
|
2568 | '%DataView%': typeof DataView === 'undefined' ? undefined : DataView,
|
2569 | '%Date%': Date,
|
2570 | '%decodeURI%': decodeURI,
|
2571 | '%decodeURIComponent%': decodeURIComponent,
|
2572 | '%encodeURI%': encodeURI,
|
2573 | '%encodeURIComponent%': encodeURIComponent,
|
2574 | '%Error%': Error,
|
2575 | '%eval%': eval, // eslint-disable-line no-eval
|
2576 | '%EvalError%': EvalError,
|
2577 | '%Float32Array%': typeof Float32Array === 'undefined' ? undefined : Float32Array,
|
2578 | '%Float64Array%': typeof Float64Array === 'undefined' ? undefined : Float64Array,
|
2579 | '%FinalizationRegistry%': typeof FinalizationRegistry === 'undefined' ? undefined : FinalizationRegistry,
|
2580 | '%Function%': $Function,
|
2581 | '%GeneratorFunction%': needsEval,
|
2582 | '%Int8Array%': typeof Int8Array === 'undefined' ? undefined : Int8Array,
|
2583 | '%Int16Array%': typeof Int16Array === 'undefined' ? undefined : Int16Array,
|
2584 | '%Int32Array%': typeof Int32Array === 'undefined' ? undefined : Int32Array,
|
2585 | '%isFinite%': isFinite,
|
2586 | '%isNaN%': isNaN,
|
2587 | '%IteratorPrototype%': hasSymbols ? getProto(getProto([][Symbol.iterator]())) : undefined,
|
2588 | '%JSON%': typeof JSON === 'object' ? JSON : undefined,
|
2589 | '%Map%': typeof Map === 'undefined' ? undefined : Map,
|
2590 | '%MapIteratorPrototype%': typeof Map === 'undefined' || !hasSymbols ? undefined : getProto(new Map()[Symbol.iterator]()),
|
2591 | '%Math%': Math,
|
2592 | '%Number%': Number,
|
2593 | '%Object%': Object,
|
2594 | '%parseFloat%': parseFloat,
|
2595 | '%parseInt%': parseInt,
|
2596 | '%Promise%': typeof Promise === 'undefined' ? undefined : Promise,
|
2597 | '%Proxy%': typeof Proxy === 'undefined' ? undefined : Proxy,
|
2598 | '%RangeError%': RangeError,
|
2599 | '%ReferenceError%': ReferenceError,
|
2600 | '%Reflect%': typeof Reflect === 'undefined' ? undefined : Reflect,
|
2601 | '%RegExp%': RegExp,
|
2602 | '%Set%': typeof Set === 'undefined' ? undefined : Set,
|
2603 | '%SetIteratorPrototype%': typeof Set === 'undefined' || !hasSymbols ? undefined : getProto(new Set()[Symbol.iterator]()),
|
2604 | '%SharedArrayBuffer%': typeof SharedArrayBuffer === 'undefined' ? undefined : SharedArrayBuffer,
|
2605 | '%String%': String,
|
2606 | '%StringIteratorPrototype%': hasSymbols ? getProto(''[Symbol.iterator]()) : undefined,
|
2607 | '%Symbol%': hasSymbols ? Symbol : undefined,
|
2608 | '%SyntaxError%': $SyntaxError,
|
2609 | '%ThrowTypeError%': ThrowTypeError,
|
2610 | '%TypedArray%': TypedArray,
|
2611 | '%TypeError%': $TypeError,
|
2612 | '%Uint8Array%': typeof Uint8Array === 'undefined' ? undefined : Uint8Array,
|
2613 | '%Uint8ClampedArray%': typeof Uint8ClampedArray === 'undefined' ? undefined : Uint8ClampedArray,
|
2614 | '%Uint16Array%': typeof Uint16Array === 'undefined' ? undefined : Uint16Array,
|
2615 | '%Uint32Array%': typeof Uint32Array === 'undefined' ? undefined : Uint32Array,
|
2616 | '%URIError%': URIError,
|
2617 | '%WeakMap%': typeof WeakMap === 'undefined' ? undefined : WeakMap,
|
2618 | '%WeakRef%': typeof WeakRef === 'undefined' ? undefined : WeakRef,
|
2619 | '%WeakSet%': typeof WeakSet === 'undefined' ? undefined : WeakSet
|
2620 | };
|
2621 |
|
2622 | var doEval = function doEval(name) {
|
2623 | var value;
|
2624 | if (name === '%AsyncFunction%') {
|
2625 | value = getEvalledConstructor('async function () {}');
|
2626 | } else if (name === '%GeneratorFunction%') {
|
2627 | value = getEvalledConstructor('function* () {}');
|
2628 | } else if (name === '%AsyncGeneratorFunction%') {
|
2629 | value = getEvalledConstructor('async function* () {}');
|
2630 | } else if (name === '%AsyncGenerator%') {
|
2631 | var fn = doEval('%AsyncGeneratorFunction%');
|
2632 | if (fn) {
|
2633 | value = fn.prototype;
|
2634 | }
|
2635 | } else if (name === '%AsyncIteratorPrototype%') {
|
2636 | var gen = doEval('%AsyncGenerator%');
|
2637 | if (gen) {
|
2638 | value = getProto(gen.prototype);
|
2639 | }
|
2640 | }
|
2641 |
|
2642 | INTRINSICS[name] = value;
|
2643 |
|
2644 | return value;
|
2645 | };
|
2646 |
|
2647 | var LEGACY_ALIASES = {
|
2648 | '%ArrayBufferPrototype%': ['ArrayBuffer', 'prototype'],
|
2649 | '%ArrayPrototype%': ['Array', 'prototype'],
|
2650 | '%ArrayProto_entries%': ['Array', 'prototype', 'entries'],
|
2651 | '%ArrayProto_forEach%': ['Array', 'prototype', 'forEach'],
|
2652 | '%ArrayProto_keys%': ['Array', 'prototype', 'keys'],
|
2653 | '%ArrayProto_values%': ['Array', 'prototype', 'values'],
|
2654 | '%AsyncFunctionPrototype%': ['AsyncFunction', 'prototype'],
|
2655 | '%AsyncGenerator%': ['AsyncGeneratorFunction', 'prototype'],
|
2656 | '%AsyncGeneratorPrototype%': ['AsyncGeneratorFunction', 'prototype', 'prototype'],
|
2657 | '%BooleanPrototype%': ['Boolean', 'prototype'],
|
2658 | '%DataViewPrototype%': ['DataView', 'prototype'],
|
2659 | '%DatePrototype%': ['Date', 'prototype'],
|
2660 | '%ErrorPrototype%': ['Error', 'prototype'],
|
2661 | '%EvalErrorPrototype%': ['EvalError', 'prototype'],
|
2662 | '%Float32ArrayPrototype%': ['Float32Array', 'prototype'],
|
2663 | '%Float64ArrayPrototype%': ['Float64Array', 'prototype'],
|
2664 | '%FunctionPrototype%': ['Function', 'prototype'],
|
2665 | '%Generator%': ['GeneratorFunction', 'prototype'],
|
2666 | '%GeneratorPrototype%': ['GeneratorFunction', 'prototype', 'prototype'],
|
2667 | '%Int8ArrayPrototype%': ['Int8Array', 'prototype'],
|
2668 | '%Int16ArrayPrototype%': ['Int16Array', 'prototype'],
|
2669 | '%Int32ArrayPrototype%': ['Int32Array', 'prototype'],
|
2670 | '%JSONParse%': ['JSON', 'parse'],
|
2671 | '%JSONStringify%': ['JSON', 'stringify'],
|
2672 | '%MapPrototype%': ['Map', 'prototype'],
|
2673 | '%NumberPrototype%': ['Number', 'prototype'],
|
2674 | '%ObjectPrototype%': ['Object', 'prototype'],
|
2675 | '%ObjProto_toString%': ['Object', 'prototype', 'toString'],
|
2676 | '%ObjProto_valueOf%': ['Object', 'prototype', 'valueOf'],
|
2677 | '%PromisePrototype%': ['Promise', 'prototype'],
|
2678 | '%PromiseProto_then%': ['Promise', 'prototype', 'then'],
|
2679 | '%Promise_all%': ['Promise', 'all'],
|
2680 | '%Promise_reject%': ['Promise', 'reject'],
|
2681 | '%Promise_resolve%': ['Promise', 'resolve'],
|
2682 | '%RangeErrorPrototype%': ['RangeError', 'prototype'],
|
2683 | '%ReferenceErrorPrototype%': ['ReferenceError', 'prototype'],
|
2684 | '%RegExpPrototype%': ['RegExp', 'prototype'],
|
2685 | '%SetPrototype%': ['Set', 'prototype'],
|
2686 | '%SharedArrayBufferPrototype%': ['SharedArrayBuffer', 'prototype'],
|
2687 | '%StringPrototype%': ['String', 'prototype'],
|
2688 | '%SymbolPrototype%': ['Symbol', 'prototype'],
|
2689 | '%SyntaxErrorPrototype%': ['SyntaxError', 'prototype'],
|
2690 | '%TypedArrayPrototype%': ['TypedArray', 'prototype'],
|
2691 | '%TypeErrorPrototype%': ['TypeError', 'prototype'],
|
2692 | '%Uint8ArrayPrototype%': ['Uint8Array', 'prototype'],
|
2693 | '%Uint8ClampedArrayPrototype%': ['Uint8ClampedArray', 'prototype'],
|
2694 | '%Uint16ArrayPrototype%': ['Uint16Array', 'prototype'],
|
2695 | '%Uint32ArrayPrototype%': ['Uint32Array', 'prototype'],
|
2696 | '%URIErrorPrototype%': ['URIError', 'prototype'],
|
2697 | '%WeakMapPrototype%': ['WeakMap', 'prototype'],
|
2698 | '%WeakSetPrototype%': ['WeakSet', 'prototype']
|
2699 | };
|
2700 |
|
2701 | var bind = require('function-bind');
|
2702 | var hasOwn = require('has');
|
2703 | var $concat = bind.call(Function.call, Array.prototype.concat);
|
2704 | var $spliceApply = bind.call(Function.apply, Array.prototype.splice);
|
2705 | var $replace = bind.call(Function.call, String.prototype.replace);
|
2706 | var $strSlice = bind.call(Function.call, String.prototype.slice);
|
2707 |
|
2708 | /* adapted from https://github.com/lodash/lodash/blob/4.17.15/dist/lodash.js#L6735-L6744 */
|
2709 | var rePropName = /[^%.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|%$))/g;
|
2710 | var reEscapeChar = /\\(\\)?/g; /** Used to match backslashes in property paths. */
|
2711 | var stringToPath = function stringToPath(string) {
|
2712 | var first = $strSlice(string, 0, 1);
|
2713 | var last = $strSlice(string, -1);
|
2714 | if (first === '%' && last !== '%') {
|
2715 | throw new $SyntaxError('invalid intrinsic syntax, expected closing `%`');
|
2716 | } else if (last === '%' && first !== '%') {
|
2717 | throw new $SyntaxError('invalid intrinsic syntax, expected opening `%`');
|
2718 | }
|
2719 | var result = [];
|
2720 | $replace(string, rePropName, function (match, number, quote, subString) {
|
2721 | result[result.length] = quote ? $replace(subString, reEscapeChar, '$1') : number || match;
|
2722 | });
|
2723 | return result;
|
2724 | };
|
2725 | /* end adaptation */
|
2726 |
|
2727 | var getBaseIntrinsic = function getBaseIntrinsic(name, allowMissing) {
|
2728 | var intrinsicName = name;
|
2729 | var alias;
|
2730 | if (hasOwn(LEGACY_ALIASES, intrinsicName)) {
|
2731 | alias = LEGACY_ALIASES[intrinsicName];
|
2732 | intrinsicName = '%' + alias[0] + '%';
|
2733 | }
|
2734 |
|
2735 | if (hasOwn(INTRINSICS, intrinsicName)) {
|
2736 | var value = INTRINSICS[intrinsicName];
|
2737 | if (value === needsEval) {
|
2738 | value = doEval(intrinsicName);
|
2739 | }
|
2740 | if (typeof value === 'undefined' && !allowMissing) {
|
2741 | throw new $TypeError('intrinsic ' + name + ' exists, but is not available. Please file an issue!');
|
2742 | }
|
2743 |
|
2744 | return {
|
2745 | alias: alias,
|
2746 | name: intrinsicName,
|
2747 | value: value
|
2748 | };
|
2749 | }
|
2750 |
|
2751 | throw new $SyntaxError('intrinsic ' + name + ' does not exist!');
|
2752 | };
|
2753 |
|
2754 | module.exports = function GetIntrinsic(name, allowMissing) {
|
2755 | if (typeof name !== 'string' || name.length === 0) {
|
2756 | throw new $TypeError('intrinsic name must be a non-empty string');
|
2757 | }
|
2758 | if (arguments.length > 1 && typeof allowMissing !== 'boolean') {
|
2759 | throw new $TypeError('"allowMissing" argument must be a boolean');
|
2760 | }
|
2761 |
|
2762 | var parts = stringToPath(name);
|
2763 | var intrinsicBaseName = parts.length > 0 ? parts[0] : '';
|
2764 |
|
2765 | var intrinsic = getBaseIntrinsic('%' + intrinsicBaseName + '%', allowMissing);
|
2766 | var intrinsicRealName = intrinsic.name;
|
2767 | var value = intrinsic.value;
|
2768 | var skipFurtherCaching = false;
|
2769 |
|
2770 | var alias = intrinsic.alias;
|
2771 | if (alias) {
|
2772 | intrinsicBaseName = alias[0];
|
2773 | $spliceApply(parts, $concat([0, 1], alias));
|
2774 | }
|
2775 |
|
2776 | for (var i = 1, isOwn = true; i < parts.length; i += 1) {
|
2777 | var part = parts[i];
|
2778 | var first = $strSlice(part, 0, 1);
|
2779 | var last = $strSlice(part, -1);
|
2780 | if (
|
2781 | (
|
2782 | (first === '"' || first === "'" || first === '`')
|
2783 | || (last === '"' || last === "'" || last === '`')
|
2784 | )
|
2785 | && first !== last
|
2786 | ) {
|
2787 | throw new $SyntaxError('property names with quotes must have matching quotes');
|
2788 | }
|
2789 | if (part === 'constructor' || !isOwn) {
|
2790 | skipFurtherCaching = true;
|
2791 | }
|
2792 |
|
2793 | intrinsicBaseName += '.' + part;
|
2794 | intrinsicRealName = '%' + intrinsicBaseName + '%';
|
2795 |
|
2796 | if (hasOwn(INTRINSICS, intrinsicRealName)) {
|
2797 | value = INTRINSICS[intrinsicRealName];
|
2798 | } else if (value != null) {
|
2799 | if (!(part in value)) {
|
2800 | if (!allowMissing) {
|
2801 | throw new $TypeError('base intrinsic for ' + name + ' exists, but the property is not available.');
|
2802 | }
|
2803 | return void undefined;
|
2804 | }
|
2805 | if ($gOPD && (i + 1) >= parts.length) {
|
2806 | var desc = $gOPD(value, part);
|
2807 | isOwn = !!desc;
|
2808 |
|
2809 | // By convention, when a data property is converted to an accessor
|
2810 | // property to emulate a data property that does not suffer from
|
2811 | // the override mistake, that accessor's getter is marked with
|
2812 | // an `originalValue` property. Here, when we detect this, we
|
2813 | // uphold the illusion by pretending to see that original data
|
2814 | // property, i.e., returning the value rather than the getter
|
2815 | // itself.
|
2816 | if (isOwn && 'get' in desc && !('originalValue' in desc.get)) {
|
2817 | value = desc.get;
|
2818 | } else {
|
2819 | value = value[part];
|
2820 | }
|
2821 | } else {
|
2822 | isOwn = hasOwn(value, part);
|
2823 | value = value[part];
|
2824 | }
|
2825 |
|
2826 | if (isOwn && !skipFurtherCaching) {
|
2827 | INTRINSICS[intrinsicRealName] = value;
|
2828 | }
|
2829 | }
|
2830 | }
|
2831 | return value;
|
2832 | };
|
2833 |
|
2834 | },{"function-bind":31,"has":39,"has-symbols":36}],34:[function(require,module,exports){
|
2835 | ;
|
2836 |
|
2837 | var $BigInt = typeof BigInt !== 'undefined' && BigInt;
|
2838 |
|
2839 | module.exports = function hasNativeBigInts() {
|
2840 | return typeof $BigInt === 'function'
|
2841 | && typeof BigInt === 'function'
|
2842 | && typeof $BigInt(42) === 'bigint' // eslint-disable-line no-magic-numbers
|
2843 | && typeof BigInt(42) === 'bigint'; // eslint-disable-line no-magic-numbers
|
2844 | };
|
2845 |
|
2846 | },{}],35:[function(require,module,exports){
|
2847 | ;
|
2848 |
|
2849 | var GetIntrinsic = require('get-intrinsic');
|
2850 |
|
2851 | var $defineProperty = GetIntrinsic('%Object.defineProperty%', true);
|
2852 |
|
2853 | var hasPropertyDescriptors = function hasPropertyDescriptors() {
|
2854 | if ($defineProperty) {
|
2855 | try {
|
2856 | $defineProperty({}, 'a', { value: 1 });
|
2857 | return true;
|
2858 | } catch (e) {
|
2859 | // IE 8 has a broken defineProperty
|
2860 | return false;
|
2861 | }
|
2862 | }
|
2863 | return false;
|
2864 | };
|
2865 |
|
2866 | hasPropertyDescriptors.hasArrayLengthDefineBug = function hasArrayLengthDefineBug() {
|
2867 | // node v0.6 has a bug where array lengths can be Set but not Defined
|
2868 | if (!hasPropertyDescriptors()) {
|
2869 | return null;
|
2870 | }
|
2871 | try {
|
2872 | return $defineProperty([], 'length', { value: 1 }).length !== 1;
|
2873 | } catch (e) {
|
2874 | // In Firefox 4-22, defining length on an array throws an exception.
|
2875 | return true;
|
2876 | }
|
2877 | };
|
2878 |
|
2879 | module.exports = hasPropertyDescriptors;
|
2880 |
|
2881 | },{"get-intrinsic":33}],36:[function(require,module,exports){
|
2882 | ;
|
2883 |
|
2884 | var origSymbol = typeof Symbol !== 'undefined' && Symbol;
|
2885 | var hasSymbolSham = require('./shams');
|
2886 |
|
2887 | module.exports = function hasNativeSymbols() {
|
2888 | if (typeof origSymbol !== 'function') { return false; }
|
2889 | if (typeof Symbol !== 'function') { return false; }
|
2890 | if (typeof origSymbol('foo') !== 'symbol') { return false; }
|
2891 | if (typeof Symbol('bar') !== 'symbol') { return false; }
|
2892 |
|
2893 | return hasSymbolSham();
|
2894 | };
|
2895 |
|
2896 | },{"./shams":37}],37:[function(require,module,exports){
|
2897 | ;
|
2898 |
|
2899 | /* eslint complexity: [2, 18], max-statements: [2, 33] */
|
2900 | module.exports = function hasSymbols() {
|
2901 | if (typeof Symbol !== 'function' || typeof Object.getOwnPropertySymbols !== 'function') { return false; }
|
2902 | if (typeof Symbol.iterator === 'symbol') { return true; }
|
2903 |
|
2904 | var obj = {};
|
2905 | var sym = Symbol('test');
|
2906 | var symObj = Object(sym);
|
2907 | if (typeof sym === 'string') { return false; }
|
2908 |
|
2909 | if (Object.prototype.toString.call(sym) !== '[object Symbol]') { return false; }
|
2910 | if (Object.prototype.toString.call(symObj) !== '[object Symbol]') { return false; }
|
2911 |
|
2912 | // temp disabled per https://github.com/ljharb/object.assign/issues/17
|
2913 | // if (sym instanceof Symbol) { return false; }
|
2914 | // temp disabled per https://github.com/WebReflection/get-own-property-symbols/issues/4
|
2915 | // if (!(symObj instanceof Symbol)) { return false; }
|
2916 |
|
2917 | // if (typeof Symbol.prototype.toString !== 'function') { return false; }
|
2918 | // if (String(sym) !== Symbol.prototype.toString.call(sym)) { return false; }
|
2919 |
|
2920 | var symVal = 42;
|
2921 | obj[sym] = symVal;
|
2922 | for (sym in obj) { return false; } // eslint-disable-line no-restricted-syntax, no-unreachable-loop
|
2923 | if (typeof Object.keys === 'function' && Object.keys(obj).length !== 0) { return false; }
|
2924 |
|
2925 | if (typeof Object.getOwnPropertyNames === 'function' && Object.getOwnPropertyNames(obj).length !== 0) { return false; }
|
2926 |
|
2927 | var syms = Object.getOwnPropertySymbols(obj);
|
2928 | if (syms.length !== 1 || syms[0] !== sym) { return false; }
|
2929 |
|
2930 | if (!Object.prototype.propertyIsEnumerable.call(obj, sym)) { return false; }
|
2931 |
|
2932 | if (typeof Object.getOwnPropertyDescriptor === 'function') {
|
2933 | var descriptor = Object.getOwnPropertyDescriptor(obj, sym);
|
2934 | if (descriptor.value !== symVal || descriptor.enumerable !== true) { return false; }
|
2935 | }
|
2936 |
|
2937 | return true;
|
2938 | };
|
2939 |
|
2940 | },{}],38:[function(require,module,exports){
|
2941 | ;
|
2942 |
|
2943 | var hasSymbols = require('has-symbols/shams');
|
2944 |
|
2945 | module.exports = function hasToStringTagShams() {
|
2946 | return hasSymbols() && !!Symbol.toStringTag;
|
2947 | };
|
2948 |
|
2949 | },{"has-symbols/shams":37}],39:[function(require,module,exports){
|
2950 | ;
|
2951 |
|
2952 | var bind = require('function-bind');
|
2953 |
|
2954 | module.exports = bind.call(Function.call, Object.prototype.hasOwnProperty);
|
2955 |
|
2956 | },{"function-bind":31}],40:[function(require,module,exports){
|
2957 | if (typeof Object.create === 'function') {
|
2958 | // implementation from standard node.js 'util' module
|
2959 | module.exports = function inherits(ctor, superCtor) {
|
2960 | if (superCtor) {
|
2961 | ctor.super_ = superCtor
|
2962 | ctor.prototype = Object.create(superCtor.prototype, {
|
2963 | constructor: {
|
2964 | value: ctor,
|
2965 | enumerable: false,
|
2966 | writable: true,
|
2967 | configurable: true
|
2968 | }
|
2969 | })
|
2970 | }
|
2971 | };
|
2972 | } else {
|
2973 | // old school shim for old browsers
|
2974 | module.exports = function inherits(ctor, superCtor) {
|
2975 | if (superCtor) {
|
2976 | ctor.super_ = superCtor
|
2977 | var TempCtor = function () {}
|
2978 | TempCtor.prototype = superCtor.prototype
|
2979 | ctor.prototype = new TempCtor()
|
2980 | ctor.prototype.constructor = ctor
|
2981 | }
|
2982 | }
|
2983 | }
|
2984 |
|
2985 | },{}],41:[function(require,module,exports){
|
2986 | ;
|
2987 |
|
2988 | var hasToStringTag = require('has-tostringtag/shams')();
|
2989 | var callBound = require('call-bind/callBound');
|
2990 |
|
2991 | var $toString = callBound('Object.prototype.toString');
|
2992 |
|
2993 | var isStandardArguments = function isArguments(value) {
|
2994 | if (hasToStringTag && value && typeof value === 'object' && Symbol.toStringTag in value) {
|
2995 | return false;
|
2996 | }
|
2997 | return $toString(value) === '[object Arguments]';
|
2998 | };
|
2999 |
|
3000 | var isLegacyArguments = function isArguments(value) {
|
3001 | if (isStandardArguments(value)) {
|
3002 | return true;
|
3003 | }
|
3004 | return value !== null &&
|
3005 | typeof value === 'object' &&
|
3006 | typeof value.length === 'number' &&
|
3007 | value.length >= 0 &&
|
3008 | $toString(value) !== '[object Array]' &&
|
3009 | $toString(value.callee) === '[object Function]';
|
3010 | };
|
3011 |
|
3012 | var supportsStandardArguments = (function () {
|
3013 | return isStandardArguments(arguments);
|
3014 | }());
|
3015 |
|
3016 | isStandardArguments.isLegacyArguments = isLegacyArguments; // for tests
|
3017 |
|
3018 | module.exports = supportsStandardArguments ? isStandardArguments : isLegacyArguments;
|
3019 |
|
3020 | },{"call-bind/callBound":10,"has-tostringtag/shams":38}],42:[function(require,module,exports){
|
3021 | ;
|
3022 |
|
3023 | var hasBigInts = require('has-bigints')();
|
3024 |
|
3025 | if (hasBigInts) {
|
3026 | var bigIntValueOf = BigInt.prototype.valueOf;
|
3027 | var tryBigInt = function tryBigIntObject(value) {
|
3028 | try {
|
3029 | bigIntValueOf.call(value);
|
3030 | return true;
|
3031 | } catch (e) {
|
3032 | }
|
3033 | return false;
|
3034 | };
|
3035 |
|
3036 | module.exports = function isBigInt(value) {
|
3037 | if (
|
3038 | value === null
|
3039 | || typeof value === 'undefined'
|
3040 | || typeof value === 'boolean'
|
3041 | || typeof value === 'string'
|
3042 | || typeof value === 'number'
|
3043 | || typeof value === 'symbol'
|
3044 | || typeof value === 'function'
|
3045 | ) {
|
3046 | return false;
|
3047 | }
|
3048 | if (typeof value === 'bigint') {
|
3049 | return true;
|
3050 | }
|
3051 |
|
3052 | return tryBigInt(value);
|
3053 | };
|
3054 | } else {
|
3055 | module.exports = function isBigInt(value) {
|
3056 | return false && value;
|
3057 | };
|
3058 | }
|
3059 |
|
3060 | },{"has-bigints":34}],43:[function(require,module,exports){
|
3061 | ;
|
3062 |
|
3063 | var callBound = require('call-bind/callBound');
|
3064 | var $boolToStr = callBound('Boolean.prototype.toString');
|
3065 | var $toString = callBound('Object.prototype.toString');
|
3066 |
|
3067 | var tryBooleanObject = function booleanBrandCheck(value) {
|
3068 | try {
|
3069 | $boolToStr(value);
|
3070 | return true;
|
3071 | } catch (e) {
|
3072 | return false;
|
3073 | }
|
3074 | };
|
3075 | var boolClass = '[object Boolean]';
|
3076 | var hasToStringTag = require('has-tostringtag/shams')();
|
3077 |
|
3078 | module.exports = function isBoolean(value) {
|
3079 | if (typeof value === 'boolean') {
|
3080 | return true;
|
3081 | }
|
3082 | if (value === null || typeof value !== 'object') {
|
3083 | return false;
|
3084 | }
|
3085 | return hasToStringTag && Symbol.toStringTag in value ? tryBooleanObject(value) : $toString(value) === boolClass;
|
3086 | };
|
3087 |
|
3088 | },{"call-bind/callBound":10,"has-tostringtag/shams":38}],44:[function(require,module,exports){
|
3089 | ;
|
3090 |
|
3091 | var fnToStr = Function.prototype.toString;
|
3092 | var reflectApply = typeof Reflect === 'object' && Reflect !== null && Reflect.apply;
|
3093 | var badArrayLike;
|
3094 | var isCallableMarker;
|
3095 | if (typeof reflectApply === 'function' && typeof Object.defineProperty === 'function') {
|
3096 | try {
|
3097 | badArrayLike = Object.defineProperty({}, 'length', {
|
3098 | get: function () {
|
3099 | throw isCallableMarker;
|
3100 | }
|
3101 | });
|
3102 | isCallableMarker = {};
|
3103 | // eslint-disable-next-line no-throw-literal
|
3104 | reflectApply(function () { throw 42; }, null, badArrayLike);
|
3105 | } catch (_) {
|
3106 | if (_ !== isCallableMarker) {
|
3107 | reflectApply = null;
|
3108 | }
|
3109 | }
|
3110 | } else {
|
3111 | reflectApply = null;
|
3112 | }
|
3113 |
|
3114 | var constructorRegex = /^\s*class\b/;
|
3115 | var isES6ClassFn = function isES6ClassFunction(value) {
|
3116 | try {
|
3117 | var fnStr = fnToStr.call(value);
|
3118 | return constructorRegex.test(fnStr);
|
3119 | } catch (e) {
|
3120 | return false; // not a function
|
3121 | }
|
3122 | };
|
3123 |
|
3124 | var tryFunctionObject = function tryFunctionToStr(value) {
|
3125 | try {
|
3126 | if (isES6ClassFn(value)) { return false; }
|
3127 | fnToStr.call(value);
|
3128 | return true;
|
3129 | } catch (e) {
|
3130 | return false;
|
3131 | }
|
3132 | };
|
3133 | var toStr = Object.prototype.toString;
|
3134 | var fnClass = '[object Function]';
|
3135 | var genClass = '[object GeneratorFunction]';
|
3136 | var hasToStringTag = typeof Symbol === 'function' && !!Symbol.toStringTag; // better: use `has-tostringtag`
|
3137 | /* globals document: false */
|
3138 | var documentDotAll = typeof document === 'object' && typeof document.all === 'undefined' && document.all !== undefined ? document.all : {};
|
3139 |
|
3140 | module.exports = reflectApply
|
3141 | ? function isCallable(value) {
|
3142 | if (value === documentDotAll) { return true; }
|
3143 | if (!value) { return false; }
|
3144 | if (typeof value !== 'function' && typeof value !== 'object') { return false; }
|
3145 | if (typeof value === 'function' && !value.prototype) { return true; }
|
3146 | try {
|
3147 | reflectApply(value, null, badArrayLike);
|
3148 | } catch (e) {
|
3149 | if (e !== isCallableMarker) { return false; }
|
3150 | }
|
3151 | return !isES6ClassFn(value);
|
3152 | }
|
3153 | : function isCallable(value) {
|
3154 | if (value === documentDotAll) { return true; }
|
3155 | if (!value) { return false; }
|
3156 | if (typeof value !== 'function' && typeof value !== 'object') { return false; }
|
3157 | if (typeof value === 'function' && !value.prototype) { return true; }
|
3158 | if (hasToStringTag) { return tryFunctionObject(value); }
|
3159 | if (isES6ClassFn(value)) { return false; }
|
3160 | var strClass = toStr.call(value);
|
3161 | return strClass === fnClass || strClass === genClass;
|
3162 | };
|
3163 |
|
3164 | },{}],45:[function(require,module,exports){
|
3165 | ;
|
3166 |
|
3167 | var getDay = Date.prototype.getDay;
|
3168 | var tryDateObject = function tryDateGetDayCall(value) {
|
3169 | try {
|
3170 | getDay.call(value);
|
3171 | return true;
|
3172 | } catch (e) {
|
3173 | return false;
|
3174 | }
|
3175 | };
|
3176 |
|
3177 | var toStr = Object.prototype.toString;
|
3178 | var dateClass = '[object Date]';
|
3179 | var hasToStringTag = require('has-tostringtag/shams')();
|
3180 |
|
3181 | module.exports = function isDateObject(value) {
|
3182 | if (typeof value !== 'object' || value === null) {
|
3183 | return false;
|
3184 | }
|
3185 | return hasToStringTag ? tryDateObject(value) : toStr.call(value) === dateClass;
|
3186 | };
|
3187 |
|
3188 | },{"has-tostringtag/shams":38}],46:[function(require,module,exports){
|
3189 | ;
|
3190 |
|
3191 | var $Map = typeof Map === 'function' && Map.prototype ? Map : null;
|
3192 | var $Set = typeof Set === 'function' && Set.prototype ? Set : null;
|
3193 |
|
3194 | var exported;
|
3195 |
|
3196 | if (!$Map) {
|
3197 | // eslint-disable-next-line no-unused-vars
|
3198 | exported = function isMap(x) {
|
3199 | // `Map` is not present in this environment.
|
3200 | return false;
|
3201 | };
|
3202 | }
|
3203 |
|
3204 | var $mapHas = $Map ? Map.prototype.has : null;
|
3205 | var $setHas = $Set ? Set.prototype.has : null;
|
3206 | if (!exported && !$mapHas) {
|
3207 | // eslint-disable-next-line no-unused-vars
|
3208 | exported = function isMap(x) {
|
3209 | // `Map` does not have a `has` method
|
3210 | return false;
|
3211 | };
|
3212 | }
|
3213 |
|
3214 | module.exports = exported || function isMap(x) {
|
3215 | if (!x || typeof x !== 'object') {
|
3216 | return false;
|
3217 | }
|
3218 | try {
|
3219 | $mapHas.call(x);
|
3220 | if ($setHas) {
|
3221 | try {
|
3222 | $setHas.call(x);
|
3223 | } catch (e) {
|
3224 | return true;
|
3225 | }
|
3226 | }
|
3227 | return x instanceof $Map; // core-js workaround, pre-v2.5.0
|
3228 | } catch (e) {}
|
3229 | return false;
|
3230 | };
|
3231 |
|
3232 | },{}],47:[function(require,module,exports){
|
3233 | ;
|
3234 |
|
3235 | var numToStr = Number.prototype.toString;
|
3236 | var tryNumberObject = function tryNumberObject(value) {
|
3237 | try {
|
3238 | numToStr.call(value);
|
3239 | return true;
|
3240 | } catch (e) {
|
3241 | return false;
|
3242 | }
|
3243 | };
|
3244 | var toStr = Object.prototype.toString;
|
3245 | var numClass = '[object Number]';
|
3246 | var hasToStringTag = require('has-tostringtag/shams')();
|
3247 |
|
3248 | module.exports = function isNumberObject(value) {
|
3249 | if (typeof value === 'number') {
|
3250 | return true;
|
3251 | }
|
3252 | if (typeof value !== 'object') {
|
3253 | return false;
|
3254 | }
|
3255 | return hasToStringTag ? tryNumberObject(value) : toStr.call(value) === numClass;
|
3256 | };
|
3257 |
|
3258 | },{"has-tostringtag/shams":38}],48:[function(require,module,exports){
|
3259 | ;
|
3260 |
|
3261 | var callBound = require('call-bind/callBound');
|
3262 | var hasToStringTag = require('has-tostringtag/shams')();
|
3263 | var has;
|
3264 | var $exec;
|
3265 | var isRegexMarker;
|
3266 | var badStringifier;
|
3267 |
|
3268 | if (hasToStringTag) {
|
3269 | has = callBound('Object.prototype.hasOwnProperty');
|
3270 | $exec = callBound('RegExp.prototype.exec');
|
3271 | isRegexMarker = {};
|
3272 |
|
3273 | var throwRegexMarker = function () {
|
3274 | throw isRegexMarker;
|
3275 | };
|
3276 | badStringifier = {
|
3277 | toString: throwRegexMarker,
|
3278 | valueOf: throwRegexMarker
|
3279 | };
|
3280 |
|
3281 | if (typeof Symbol.toPrimitive === 'symbol') {
|
3282 | badStringifier[Symbol.toPrimitive] = throwRegexMarker;
|
3283 | }
|
3284 | }
|
3285 |
|
3286 | var $toString = callBound('Object.prototype.toString');
|
3287 | var gOPD = Object.getOwnPropertyDescriptor;
|
3288 | var regexClass = '[object RegExp]';
|
3289 |
|
3290 | module.exports = hasToStringTag
|
3291 | // eslint-disable-next-line consistent-return
|
3292 | ? function isRegex(value) {
|
3293 | if (!value || typeof value !== 'object') {
|
3294 | return false;
|
3295 | }
|
3296 |
|
3297 | var descriptor = gOPD(value, 'lastIndex');
|
3298 | var hasLastIndexDataProperty = descriptor && has(descriptor, 'value');
|
3299 | if (!hasLastIndexDataProperty) {
|
3300 | return false;
|
3301 | }
|
3302 |
|
3303 | try {
|
3304 | $exec(value, badStringifier);
|
3305 | } catch (e) {
|
3306 | return e === isRegexMarker;
|
3307 | }
|
3308 | }
|
3309 | : function isRegex(value) {
|
3310 | // In older browsers, typeof regex incorrectly returns 'function'
|
3311 | if (!value || (typeof value !== 'object' && typeof value !== 'function')) {
|
3312 | return false;
|
3313 | }
|
3314 |
|
3315 | return $toString(value) === regexClass;
|
3316 | };
|
3317 |
|
3318 | },{"call-bind/callBound":10,"has-tostringtag/shams":38}],49:[function(require,module,exports){
|
3319 | ;
|
3320 |
|
3321 | var $Map = typeof Map === 'function' && Map.prototype ? Map : null;
|
3322 | var $Set = typeof Set === 'function' && Set.prototype ? Set : null;
|
3323 |
|
3324 | var exported;
|
3325 |
|
3326 | if (!$Set) {
|
3327 | // eslint-disable-next-line no-unused-vars
|
3328 | exported = function isSet(x) {
|
3329 | // `Set` is not present in this environment.
|
3330 | return false;
|
3331 | };
|
3332 | }
|
3333 |
|
3334 | var $mapHas = $Map ? Map.prototype.has : null;
|
3335 | var $setHas = $Set ? Set.prototype.has : null;
|
3336 | if (!exported && !$setHas) {
|
3337 | // eslint-disable-next-line no-unused-vars
|
3338 | exported = function isSet(x) {
|
3339 | // `Set` does not have a `has` method
|
3340 | return false;
|
3341 | };
|
3342 | }
|
3343 |
|
3344 | module.exports = exported || function isSet(x) {
|
3345 | if (!x || typeof x !== 'object') {
|
3346 | return false;
|
3347 | }
|
3348 | try {
|
3349 | $setHas.call(x);
|
3350 | if ($mapHas) {
|
3351 | try {
|
3352 | $mapHas.call(x);
|
3353 | } catch (e) {
|
3354 | return true;
|
3355 | }
|
3356 | }
|
3357 | return x instanceof $Set; // core-js workaround, pre-v2.5.0
|
3358 | } catch (e) {}
|
3359 | return false;
|
3360 | };
|
3361 |
|
3362 | },{}],50:[function(require,module,exports){
|
3363 | ;
|
3364 |
|
3365 | var strValue = String.prototype.valueOf;
|
3366 | var tryStringObject = function tryStringObject(value) {
|
3367 | try {
|
3368 | strValue.call(value);
|
3369 | return true;
|
3370 | } catch (e) {
|
3371 | return false;
|
3372 | }
|
3373 | };
|
3374 | var toStr = Object.prototype.toString;
|
3375 | var strClass = '[object String]';
|
3376 | var hasToStringTag = require('has-tostringtag/shams')();
|
3377 |
|
3378 | module.exports = function isString(value) {
|
3379 | if (typeof value === 'string') {
|
3380 | return true;
|
3381 | }
|
3382 | if (typeof value !== 'object') {
|
3383 | return false;
|
3384 | }
|
3385 | return hasToStringTag ? tryStringObject(value) : toStr.call(value) === strClass;
|
3386 | };
|
3387 |
|
3388 | },{"has-tostringtag/shams":38}],51:[function(require,module,exports){
|
3389 | ;
|
3390 |
|
3391 | var toStr = Object.prototype.toString;
|
3392 | var hasSymbols = require('has-symbols')();
|
3393 |
|
3394 | if (hasSymbols) {
|
3395 | var symToStr = Symbol.prototype.toString;
|
3396 | var symStringRegex = /^Symbol\(.*\)$/;
|
3397 | var isSymbolObject = function isRealSymbolObject(value) {
|
3398 | if (typeof value.valueOf() !== 'symbol') {
|
3399 | return false;
|
3400 | }
|
3401 | return symStringRegex.test(symToStr.call(value));
|
3402 | };
|
3403 |
|
3404 | module.exports = function isSymbol(value) {
|
3405 | if (typeof value === 'symbol') {
|
3406 | return true;
|
3407 | }
|
3408 | if (toStr.call(value) !== '[object Symbol]') {
|
3409 | return false;
|
3410 | }
|
3411 | try {
|
3412 | return isSymbolObject(value);
|
3413 | } catch (e) {
|
3414 | return false;
|
3415 | }
|
3416 | };
|
3417 | } else {
|
3418 |
|
3419 | module.exports = function isSymbol(value) {
|
3420 | // this environment does not support Symbols.
|
3421 | return false && value;
|
3422 | };
|
3423 | }
|
3424 |
|
3425 | },{"has-symbols":36}],52:[function(require,module,exports){
|
3426 | (function (global){
|
3427 | ;
|
3428 |
|
3429 | var forEach = require('for-each');
|
3430 | var availableTypedArrays = require('available-typed-arrays');
|
3431 | var callBound = require('call-bind/callBound');
|
3432 |
|
3433 | var $toString = callBound('Object.prototype.toString');
|
3434 | var hasToStringTag = require('has-tostringtag/shams')();
|
3435 |
|
3436 | var g = typeof globalThis === 'undefined' ? global : globalThis;
|
3437 | var typedArrays = availableTypedArrays();
|
3438 |
|
3439 | var $indexOf = callBound('Array.prototype.indexOf', true) || function indexOf(array, value) {
|
3440 | for (var i = 0; i < array.length; i += 1) {
|
3441 | if (array[i] === value) {
|
3442 | return i;
|
3443 | }
|
3444 | }
|
3445 | return -1;
|
3446 | };
|
3447 | var $slice = callBound('String.prototype.slice');
|
3448 | var toStrTags = {};
|
3449 | var gOPD = require('es-abstract/helpers/getOwnPropertyDescriptor');
|
3450 | var getPrototypeOf = Object.getPrototypeOf; // require('getprototypeof');
|
3451 | if (hasToStringTag && gOPD && getPrototypeOf) {
|
3452 | forEach(typedArrays, function (typedArray) {
|
3453 | var arr = new g[typedArray]();
|
3454 | if (Symbol.toStringTag in arr) {
|
3455 | var proto = getPrototypeOf(arr);
|
3456 | var descriptor = gOPD(proto, Symbol.toStringTag);
|
3457 | if (!descriptor) {
|
3458 | var superProto = getPrototypeOf(proto);
|
3459 | descriptor = gOPD(superProto, Symbol.toStringTag);
|
3460 | }
|
3461 | toStrTags[typedArray] = descriptor.get;
|
3462 | }
|
3463 | });
|
3464 | }
|
3465 |
|
3466 | var tryTypedArrays = function tryAllTypedArrays(value) {
|
3467 | var anyTrue = false;
|
3468 | forEach(toStrTags, function (getter, typedArray) {
|
3469 | if (!anyTrue) {
|
3470 | try {
|
3471 | anyTrue = getter.call(value) === typedArray;
|
3472 | } catch (e) { /**/ }
|
3473 | }
|
3474 | });
|
3475 | return anyTrue;
|
3476 | };
|
3477 |
|
3478 | module.exports = function isTypedArray(value) {
|
3479 | if (!value || typeof value !== 'object') { return false; }
|
3480 | if (!hasToStringTag || !(Symbol.toStringTag in value)) {
|
3481 | var tag = $slice($toString(value), 8, -1);
|
3482 | return $indexOf(typedArrays, tag) > -1;
|
3483 | }
|
3484 | if (!gOPD) { return false; }
|
3485 | return tryTypedArrays(value);
|
3486 | };
|
3487 |
|
3488 | }).call(this,typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
3489 | },{"available-typed-arrays":9,"call-bind/callBound":10,"es-abstract/helpers/getOwnPropertyDescriptor":23,"for-each":29,"has-tostringtag/shams":38}],53:[function(require,module,exports){
|
3490 | ;
|
3491 |
|
3492 | var $WeakMap = typeof WeakMap === 'function' && WeakMap.prototype ? WeakMap : null;
|
3493 | var $WeakSet = typeof WeakSet === 'function' && WeakSet.prototype ? WeakSet : null;
|
3494 |
|
3495 | var exported;
|
3496 |
|
3497 | if (!$WeakMap) {
|
3498 | // eslint-disable-next-line no-unused-vars
|
3499 | exported = function isWeakMap(x) {
|
3500 | // `WeakMap` is not present in this environment.
|
3501 | return false;
|
3502 | };
|
3503 | }
|
3504 |
|
3505 | var $mapHas = $WeakMap ? $WeakMap.prototype.has : null;
|
3506 | var $setHas = $WeakSet ? $WeakSet.prototype.has : null;
|
3507 | if (!exported && !$mapHas) {
|
3508 | // eslint-disable-next-line no-unused-vars
|
3509 | exported = function isWeakMap(x) {
|
3510 | // `WeakMap` does not have a `has` method
|
3511 | return false;
|
3512 | };
|
3513 | }
|
3514 |
|
3515 | module.exports = exported || function isWeakMap(x) {
|
3516 | if (!x || typeof x !== 'object') {
|
3517 | return false;
|
3518 | }
|
3519 | try {
|
3520 | $mapHas.call(x, $mapHas);
|
3521 | if ($setHas) {
|
3522 | try {
|
3523 | $setHas.call(x, $setHas);
|
3524 | } catch (e) {
|
3525 | return true;
|
3526 | }
|
3527 | }
|
3528 | return x instanceof $WeakMap; // core-js workaround, pre-v3
|
3529 | } catch (e) {}
|
3530 | return false;
|
3531 | };
|
3532 |
|
3533 | },{}],54:[function(require,module,exports){
|
3534 | ;
|
3535 |
|
3536 | var GetIntrinsic = require('get-intrinsic');
|
3537 | var callBound = require('call-bind/callBound');
|
3538 |
|
3539 | var $WeakSet = GetIntrinsic('%WeakSet%', true);
|
3540 |
|
3541 | var $setHas = callBound('WeakSet.prototype.has', true);
|
3542 |
|
3543 | if ($setHas) {
|
3544 | var $mapHas = callBound('WeakMap.prototype.has', true);
|
3545 |
|
3546 | module.exports = function isWeakSet(x) {
|
3547 | if (!x || typeof x !== 'object') {
|
3548 | return false;
|
3549 | }
|
3550 | try {
|
3551 | $setHas(x, $setHas);
|
3552 | if ($mapHas) {
|
3553 | try {
|
3554 | $mapHas(x, $mapHas);
|
3555 | } catch (e) {
|
3556 | return true;
|
3557 | }
|
3558 | }
|
3559 | return x instanceof $WeakSet; // core-js workaround, pre-v3
|
3560 | } catch (e) {}
|
3561 | return false;
|
3562 | };
|
3563 | } else {
|
3564 | // eslint-disable-next-line no-unused-vars
|
3565 | module.exports = function isWeakSet(x) {
|
3566 | // `WeakSet` does not exist, or does not have a `has` method
|
3567 | return false;
|
3568 | };
|
3569 | }
|
3570 |
|
3571 | },{"call-bind/callBound":10,"get-intrinsic":33}],55:[function(require,module,exports){
|
3572 | var toString = {}.toString;
|
3573 |
|
3574 | module.exports = Array.isArray || function (arr) {
|
3575 | return toString.call(arr) == '[object Array]';
|
3576 | };
|
3577 |
|
3578 | },{}],56:[function(require,module,exports){
|
3579 | var hasMap = typeof Map === 'function' && Map.prototype;
|
3580 | var mapSizeDescriptor = Object.getOwnPropertyDescriptor && hasMap ? Object.getOwnPropertyDescriptor(Map.prototype, 'size') : null;
|
3581 | var mapSize = hasMap && mapSizeDescriptor && typeof mapSizeDescriptor.get === 'function' ? mapSizeDescriptor.get : null;
|
3582 | var mapForEach = hasMap && Map.prototype.forEach;
|
3583 | var hasSet = typeof Set === 'function' && Set.prototype;
|
3584 | var setSizeDescriptor = Object.getOwnPropertyDescriptor && hasSet ? Object.getOwnPropertyDescriptor(Set.prototype, 'size') : null;
|
3585 | var setSize = hasSet && setSizeDescriptor && typeof setSizeDescriptor.get === 'function' ? setSizeDescriptor.get : null;
|
3586 | var setForEach = hasSet && Set.prototype.forEach;
|
3587 | var hasWeakMap = typeof WeakMap === 'function' && WeakMap.prototype;
|
3588 | var weakMapHas = hasWeakMap ? WeakMap.prototype.has : null;
|
3589 | var hasWeakSet = typeof WeakSet === 'function' && WeakSet.prototype;
|
3590 | var weakSetHas = hasWeakSet ? WeakSet.prototype.has : null;
|
3591 | var hasWeakRef = typeof WeakRef === 'function' && WeakRef.prototype;
|
3592 | var weakRefDeref = hasWeakRef ? WeakRef.prototype.deref : null;
|
3593 | var booleanValueOf = Boolean.prototype.valueOf;
|
3594 | var objectToString = Object.prototype.toString;
|
3595 | var functionToString = Function.prototype.toString;
|
3596 | var $match = String.prototype.match;
|
3597 | var $slice = String.prototype.slice;
|
3598 | var $replace = String.prototype.replace;
|
3599 | var $toUpperCase = String.prototype.toUpperCase;
|
3600 | var $toLowerCase = String.prototype.toLowerCase;
|
3601 | var $test = RegExp.prototype.test;
|
3602 | var $concat = Array.prototype.concat;
|
3603 | var $join = Array.prototype.join;
|
3604 | var $arrSlice = Array.prototype.slice;
|
3605 | var $floor = Math.floor;
|
3606 | var bigIntValueOf = typeof BigInt === 'function' ? BigInt.prototype.valueOf : null;
|
3607 | var gOPS = Object.getOwnPropertySymbols;
|
3608 | var symToString = typeof Symbol === 'function' && typeof Symbol.iterator === 'symbol' ? Symbol.prototype.toString : null;
|
3609 | var hasShammedSymbols = typeof Symbol === 'function' && typeof Symbol.iterator === 'object';
|
3610 | // ie, `has-tostringtag/shams
|
3611 | var toStringTag = typeof Symbol === 'function' && Symbol.toStringTag && (typeof Symbol.toStringTag === hasShammedSymbols ? 'object' : 'symbol')
|
3612 | ? Symbol.toStringTag
|
3613 | : null;
|
3614 | var isEnumerable = Object.prototype.propertyIsEnumerable;
|
3615 |
|
3616 | var gPO = (typeof Reflect === 'function' ? Reflect.getPrototypeOf : Object.getPrototypeOf) || (
|
3617 | [].__proto__ === Array.prototype // eslint-disable-line no-proto
|
3618 | ? function (O) {
|
3619 | return O.__proto__; // eslint-disable-line no-proto
|
3620 | }
|
3621 | : null
|
3622 | );
|
3623 |
|
3624 | function addNumericSeparator(num, str) {
|
3625 | if (
|
3626 | num === Infinity
|
3627 | || num === -Infinity
|
3628 | || num !== num
|
3629 | || (num && num > -1000 && num < 1000)
|
3630 | || $test.call(/e/, str)
|
3631 | ) {
|
3632 | return str;
|
3633 | }
|
3634 | var sepRegex = /[0-9](?=(?:[0-9]{3})+(?![0-9]))/g;
|
3635 | if (typeof num === 'number') {
|
3636 | var int = num < 0 ? -$floor(-num) : $floor(num); // trunc(num)
|
3637 | if (int !== num) {
|
3638 | var intStr = String(int);
|
3639 | var dec = $slice.call(str, intStr.length + 1);
|
3640 | return $replace.call(intStr, sepRegex, '$&_') + '.' + $replace.call($replace.call(dec, /([0-9]{3})/g, '$&_'), /_$/, '');
|
3641 | }
|
3642 | }
|
3643 | return $replace.call(str, sepRegex, '$&_');
|
3644 | }
|
3645 |
|
3646 | var utilInspect = require('./util.inspect');
|
3647 | var inspectCustom = utilInspect.custom;
|
3648 | var inspectSymbol = isSymbol(inspectCustom) ? inspectCustom : null;
|
3649 |
|
3650 | module.exports = function inspect_(obj, options, depth, seen) {
|
3651 | var opts = options || {};
|
3652 |
|
3653 | if (has(opts, 'quoteStyle') && (opts.quoteStyle !== 'single' && opts.quoteStyle !== 'double')) {
|
3654 | throw new TypeError('option "quoteStyle" must be "single" or "double"');
|
3655 | }
|
3656 | if (
|
3657 | has(opts, 'maxStringLength') && (typeof opts.maxStringLength === 'number'
|
3658 | ? opts.maxStringLength < 0 && opts.maxStringLength !== Infinity
|
3659 | : opts.maxStringLength !== null
|
3660 | )
|
3661 | ) {
|
3662 | throw new TypeError('option "maxStringLength", if provided, must be a positive integer, Infinity, or `null`');
|
3663 | }
|
3664 | var customInspect = has(opts, 'customInspect') ? opts.customInspect : true;
|
3665 | if (typeof customInspect !== 'boolean' && customInspect !== 'symbol') {
|
3666 | throw new TypeError('option "customInspect", if provided, must be `true`, `false`, or `\'symbol\'`');
|
3667 | }
|
3668 |
|
3669 | if (
|
3670 | has(opts, 'indent')
|
3671 | && opts.indent !== null
|
3672 | && opts.indent !== '\t'
|
3673 | && !(parseInt(opts.indent, 10) === opts.indent && opts.indent > 0)
|
3674 | ) {
|
3675 | throw new TypeError('option "indent" must be "\\t", an integer > 0, or `null`');
|
3676 | }
|
3677 | if (has(opts, 'numericSeparator') && typeof opts.numericSeparator !== 'boolean') {
|
3678 | throw new TypeError('option "numericSeparator", if provided, must be `true` or `false`');
|
3679 | }
|
3680 | var numericSeparator = opts.numericSeparator;
|
3681 |
|
3682 | if (typeof obj === 'undefined') {
|
3683 | return 'undefined';
|
3684 | }
|
3685 | if (obj === null) {
|
3686 | return 'null';
|
3687 | }
|
3688 | if (typeof obj === 'boolean') {
|
3689 | return obj ? 'true' : 'false';
|
3690 | }
|
3691 |
|
3692 | if (typeof obj === 'string') {
|
3693 | return inspectString(obj, opts);
|
3694 | }
|
3695 | if (typeof obj === 'number') {
|
3696 | if (obj === 0) {
|
3697 | return Infinity / obj > 0 ? '0' : '-0';
|
3698 | }
|
3699 | var str = String(obj);
|
3700 | return numericSeparator ? addNumericSeparator(obj, str) : str;
|
3701 | }
|
3702 | if (typeof obj === 'bigint') {
|
3703 | var bigIntStr = String(obj) + 'n';
|
3704 | return numericSeparator ? addNumericSeparator(obj, bigIntStr) : bigIntStr;
|
3705 | }
|
3706 |
|
3707 | var maxDepth = typeof opts.depth === 'undefined' ? 5 : opts.depth;
|
3708 | if (typeof depth === 'undefined') { depth = 0; }
|
3709 | if (depth >= maxDepth && maxDepth > 0 && typeof obj === 'object') {
|
3710 | return isArray(obj) ? '[Array]' : '[Object]';
|
3711 | }
|
3712 |
|
3713 | var indent = getIndent(opts, depth);
|
3714 |
|
3715 | if (typeof seen === 'undefined') {
|
3716 | seen = [];
|
3717 | } else if (indexOf(seen, obj) >= 0) {
|
3718 | return '[Circular]';
|
3719 | }
|
3720 |
|
3721 | function inspect(value, from, noIndent) {
|
3722 | if (from) {
|
3723 | seen = $arrSlice.call(seen);
|
3724 | seen.push(from);
|
3725 | }
|
3726 | if (noIndent) {
|
3727 | var newOpts = {
|
3728 | depth: opts.depth
|
3729 | };
|
3730 | if (has(opts, 'quoteStyle')) {
|
3731 | newOpts.quoteStyle = opts.quoteStyle;
|
3732 | }
|
3733 | return inspect_(value, newOpts, depth + 1, seen);
|
3734 | }
|
3735 | return inspect_(value, opts, depth + 1, seen);
|
3736 | }
|
3737 |
|
3738 | if (typeof obj === 'function' && !isRegExp(obj)) { // in older engines, regexes are callable
|
3739 | var name = nameOf(obj);
|
3740 | var keys = arrObjKeys(obj, inspect);
|
3741 | return '[Function' + (name ? ': ' + name : ' (anonymous)') + ']' + (keys.length > 0 ? ' { ' + $join.call(keys, ', ') + ' }' : '');
|
3742 | }
|
3743 | if (isSymbol(obj)) {
|
3744 | var symString = hasShammedSymbols ? $replace.call(String(obj), /^(Symbol\(.*\))_[^)]*$/, '$1') : symToString.call(obj);
|
3745 | return typeof obj === 'object' && !hasShammedSymbols ? markBoxed(symString) : symString;
|
3746 | }
|
3747 | if (isElement(obj)) {
|
3748 | var s = '<' + $toLowerCase.call(String(obj.nodeName));
|
3749 | var attrs = obj.attributes || [];
|
3750 | for (var i = 0; i < attrs.length; i++) {
|
3751 | s += ' ' + attrs[i].name + '=' + wrapQuotes(quote(attrs[i].value), 'double', opts);
|
3752 | }
|
3753 | s += '>';
|
3754 | if (obj.childNodes && obj.childNodes.length) { s += '...'; }
|
3755 | s += '</' + $toLowerCase.call(String(obj.nodeName)) + '>';
|
3756 | return s;
|
3757 | }
|
3758 | if (isArray(obj)) {
|
3759 | if (obj.length === 0) { return '[]'; }
|
3760 | var xs = arrObjKeys(obj, inspect);
|
3761 | if (indent && !singleLineValues(xs)) {
|
3762 | return '[' + indentedJoin(xs, indent) + ']';
|
3763 | }
|
3764 | return '[ ' + $join.call(xs, ', ') + ' ]';
|
3765 | }
|
3766 | if (isError(obj)) {
|
3767 | var parts = arrObjKeys(obj, inspect);
|
3768 | if (!('cause' in Error.prototype) && 'cause' in obj && !isEnumerable.call(obj, 'cause')) {
|
3769 | return '{ [' + String(obj) + '] ' + $join.call($concat.call('[cause]: ' + inspect(obj.cause), parts), ', ') + ' }';
|
3770 | }
|
3771 | if (parts.length === 0) { return '[' + String(obj) + ']'; }
|
3772 | return '{ [' + String(obj) + '] ' + $join.call(parts, ', ') + ' }';
|
3773 | }
|
3774 | if (typeof obj === 'object' && customInspect) {
|
3775 | if (inspectSymbol && typeof obj[inspectSymbol] === 'function' && utilInspect) {
|
3776 | return utilInspect(obj, { depth: maxDepth - depth });
|
3777 | } else if (customInspect !== 'symbol' && typeof obj.inspect === 'function') {
|
3778 | return obj.inspect();
|
3779 | }
|
3780 | }
|
3781 | if (isMap(obj)) {
|
3782 | var mapParts = [];
|
3783 | mapForEach.call(obj, function (value, key) {
|
3784 | mapParts.push(inspect(key, obj, true) + ' => ' + inspect(value, obj));
|
3785 | });
|
3786 | return collectionOf('Map', mapSize.call(obj), mapParts, indent);
|
3787 | }
|
3788 | if (isSet(obj)) {
|
3789 | var setParts = [];
|
3790 | setForEach.call(obj, function (value) {
|
3791 | setParts.push(inspect(value, obj));
|
3792 | });
|
3793 | return collectionOf('Set', setSize.call(obj), setParts, indent);
|
3794 | }
|
3795 | if (isWeakMap(obj)) {
|
3796 | return weakCollectionOf('WeakMap');
|
3797 | }
|
3798 | if (isWeakSet(obj)) {
|
3799 | return weakCollectionOf('WeakSet');
|
3800 | }
|
3801 | if (isWeakRef(obj)) {
|
3802 | return weakCollectionOf('WeakRef');
|
3803 | }
|
3804 | if (isNumber(obj)) {
|
3805 | return markBoxed(inspect(Number(obj)));
|
3806 | }
|
3807 | if (isBigInt(obj)) {
|
3808 | return markBoxed(inspect(bigIntValueOf.call(obj)));
|
3809 | }
|
3810 | if (isBoolean(obj)) {
|
3811 | return markBoxed(booleanValueOf.call(obj));
|
3812 | }
|
3813 | if (isString(obj)) {
|
3814 | return markBoxed(inspect(String(obj)));
|
3815 | }
|
3816 | if (!isDate(obj) && !isRegExp(obj)) {
|
3817 | var ys = arrObjKeys(obj, inspect);
|
3818 | var isPlainObject = gPO ? gPO(obj) === Object.prototype : obj instanceof Object || obj.constructor === Object;
|
3819 | var protoTag = obj instanceof Object ? '' : 'null prototype';
|
3820 | var stringTag = !isPlainObject && toStringTag && Object(obj) === obj && toStringTag in obj ? $slice.call(toStr(obj), 8, -1) : protoTag ? 'Object' : '';
|
3821 | var constructorTag = isPlainObject || typeof obj.constructor !== 'function' ? '' : obj.constructor.name ? obj.constructor.name + ' ' : '';
|
3822 | var tag = constructorTag + (stringTag || protoTag ? '[' + $join.call($concat.call([], stringTag || [], protoTag || []), ': ') + '] ' : '');
|
3823 | if (ys.length === 0) { return tag + '{}'; }
|
3824 | if (indent) {
|
3825 | return tag + '{' + indentedJoin(ys, indent) + '}';
|
3826 | }
|
3827 | return tag + '{ ' + $join.call(ys, ', ') + ' }';
|
3828 | }
|
3829 | return String(obj);
|
3830 | };
|
3831 |
|
3832 | function wrapQuotes(s, defaultStyle, opts) {
|
3833 | var quoteChar = (opts.quoteStyle || defaultStyle) === 'double' ? '"' : "'";
|
3834 | return quoteChar + s + quoteChar;
|
3835 | }
|
3836 |
|
3837 | function quote(s) {
|
3838 | return $replace.call(String(s), /"/g, '"');
|
3839 | }
|
3840 |
|
3841 | function isArray(obj) { return toStr(obj) === '[object Array]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); }
|
3842 | function isDate(obj) { return toStr(obj) === '[object Date]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); }
|
3843 | function isRegExp(obj) { return toStr(obj) === '[object RegExp]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); }
|
3844 | function isError(obj) { return toStr(obj) === '[object Error]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); }
|
3845 | function isString(obj) { return toStr(obj) === '[object String]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); }
|
3846 | function isNumber(obj) { return toStr(obj) === '[object Number]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); }
|
3847 | function isBoolean(obj) { return toStr(obj) === '[object Boolean]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); }
|
3848 |
|
3849 | // Symbol and BigInt do have Symbol.toStringTag by spec, so that can't be used to eliminate false positives
|
3850 | function isSymbol(obj) {
|
3851 | if (hasShammedSymbols) {
|
3852 | return obj && typeof obj === 'object' && obj instanceof Symbol;
|
3853 | }
|
3854 | if (typeof obj === 'symbol') {
|
3855 | return true;
|
3856 | }
|
3857 | if (!obj || typeof obj !== 'object' || !symToString) {
|
3858 | return false;
|
3859 | }
|
3860 | try {
|
3861 | symToString.call(obj);
|
3862 | return true;
|
3863 | } catch (e) {}
|
3864 | return false;
|
3865 | }
|
3866 |
|
3867 | function isBigInt(obj) {
|
3868 | if (!obj || typeof obj !== 'object' || !bigIntValueOf) {
|
3869 | return false;
|
3870 | }
|
3871 | try {
|
3872 | bigIntValueOf.call(obj);
|
3873 | return true;
|
3874 | } catch (e) {}
|
3875 | return false;
|
3876 | }
|
3877 |
|
3878 | var hasOwn = Object.prototype.hasOwnProperty || function (key) { return key in this; };
|
3879 | function has(obj, key) {
|
3880 | return hasOwn.call(obj, key);
|
3881 | }
|
3882 |
|
3883 | function toStr(obj) {
|
3884 | return objectToString.call(obj);
|
3885 | }
|
3886 |
|
3887 | function nameOf(f) {
|
3888 | if (f.name) { return f.name; }
|
3889 | var m = $match.call(functionToString.call(f), /^function\s*([\w$]+)/);
|
3890 | if (m) { return m[1]; }
|
3891 | return null;
|
3892 | }
|
3893 |
|
3894 | function indexOf(xs, x) {
|
3895 | if (xs.indexOf) { return xs.indexOf(x); }
|
3896 | for (var i = 0, l = xs.length; i < l; i++) {
|
3897 | if (xs[i] === x) { return i; }
|
3898 | }
|
3899 | return -1;
|
3900 | }
|
3901 |
|
3902 | function isMap(x) {
|
3903 | if (!mapSize || !x || typeof x !== 'object') {
|
3904 | return false;
|
3905 | }
|
3906 | try {
|
3907 | mapSize.call(x);
|
3908 | try {
|
3909 | setSize.call(x);
|
3910 | } catch (s) {
|
3911 | return true;
|
3912 | }
|
3913 | return x instanceof Map; // core-js workaround, pre-v2.5.0
|
3914 | } catch (e) {}
|
3915 | return false;
|
3916 | }
|
3917 |
|
3918 | function isWeakMap(x) {
|
3919 | if (!weakMapHas || !x || typeof x !== 'object') {
|
3920 | return false;
|
3921 | }
|
3922 | try {
|
3923 | weakMapHas.call(x, weakMapHas);
|
3924 | try {
|
3925 | weakSetHas.call(x, weakSetHas);
|
3926 | } catch (s) {
|
3927 | return true;
|
3928 | }
|
3929 | return x instanceof WeakMap; // core-js workaround, pre-v2.5.0
|
3930 | } catch (e) {}
|
3931 | return false;
|
3932 | }
|
3933 |
|
3934 | function isWeakRef(x) {
|
3935 | if (!weakRefDeref || !x || typeof x !== 'object') {
|
3936 | return false;
|
3937 | }
|
3938 | try {
|
3939 | weakRefDeref.call(x);
|
3940 | return true;
|
3941 | } catch (e) {}
|
3942 | return false;
|
3943 | }
|
3944 |
|
3945 | function isSet(x) {
|
3946 | if (!setSize || !x || typeof x !== 'object') {
|
3947 | return false;
|
3948 | }
|
3949 | try {
|
3950 | setSize.call(x);
|
3951 | try {
|
3952 | mapSize.call(x);
|
3953 | } catch (m) {
|
3954 | return true;
|
3955 | }
|
3956 | return x instanceof Set; // core-js workaround, pre-v2.5.0
|
3957 | } catch (e) {}
|
3958 | return false;
|
3959 | }
|
3960 |
|
3961 | function isWeakSet(x) {
|
3962 | if (!weakSetHas || !x || typeof x !== 'object') {
|
3963 | return false;
|
3964 | }
|
3965 | try {
|
3966 | weakSetHas.call(x, weakSetHas);
|
3967 | try {
|
3968 | weakMapHas.call(x, weakMapHas);
|
3969 | } catch (s) {
|
3970 | return true;
|
3971 | }
|
3972 | return x instanceof WeakSet; // core-js workaround, pre-v2.5.0
|
3973 | } catch (e) {}
|
3974 | return false;
|
3975 | }
|
3976 |
|
3977 | function isElement(x) {
|
3978 | if (!x || typeof x !== 'object') { return false; }
|
3979 | if (typeof HTMLElement !== 'undefined' && x instanceof HTMLElement) {
|
3980 | return true;
|
3981 | }
|
3982 | return typeof x.nodeName === 'string' && typeof x.getAttribute === 'function';
|
3983 | }
|
3984 |
|
3985 | function inspectString(str, opts) {
|
3986 | if (str.length > opts.maxStringLength) {
|
3987 | var remaining = str.length - opts.maxStringLength;
|
3988 | var trailer = '... ' + remaining + ' more character' + (remaining > 1 ? 's' : '');
|
3989 | return inspectString($slice.call(str, 0, opts.maxStringLength), opts) + trailer;
|
3990 | }
|
3991 | // eslint-disable-next-line no-control-regex
|
3992 | var s = $replace.call($replace.call(str, /(['\\])/g, '\\$1'), /[\x00-\x1f]/g, lowbyte);
|
3993 | return wrapQuotes(s, 'single', opts);
|
3994 | }
|
3995 |
|
3996 | function lowbyte(c) {
|
3997 | var n = c.charCodeAt(0);
|
3998 | var x = {
|
3999 | 8: 'b',
|
4000 | 9: 't',
|
4001 | 10: 'n',
|
4002 | 12: 'f',
|
4003 | 13: 'r'
|
4004 | }[n];
|
4005 | if (x) { return '\\' + x; }
|
4006 | return '\\x' + (n < 0x10 ? '0' : '') + $toUpperCase.call(n.toString(16));
|
4007 | }
|
4008 |
|
4009 | function markBoxed(str) {
|
4010 | return 'Object(' + str + ')';
|
4011 | }
|
4012 |
|
4013 | function weakCollectionOf(type) {
|
4014 | return type + ' { ? }';
|
4015 | }
|
4016 |
|
4017 | function collectionOf(type, size, entries, indent) {
|
4018 | var joinedEntries = indent ? indentedJoin(entries, indent) : $join.call(entries, ', ');
|
4019 | return type + ' (' + size + ') {' + joinedEntries + '}';
|
4020 | }
|
4021 |
|
4022 | function singleLineValues(xs) {
|
4023 | for (var i = 0; i < xs.length; i++) {
|
4024 | if (indexOf(xs[i], '\n') >= 0) {
|
4025 | return false;
|
4026 | }
|
4027 | }
|
4028 | return true;
|
4029 | }
|
4030 |
|
4031 | function getIndent(opts, depth) {
|
4032 | var baseIndent;
|
4033 | if (opts.indent === '\t') {
|
4034 | baseIndent = '\t';
|
4035 | } else if (typeof opts.indent === 'number' && opts.indent > 0) {
|
4036 | baseIndent = $join.call(Array(opts.indent + 1), ' ');
|
4037 | } else {
|
4038 | return null;
|
4039 | }
|
4040 | return {
|
4041 | base: baseIndent,
|
4042 | prev: $join.call(Array(depth + 1), baseIndent)
|
4043 | };
|
4044 | }
|
4045 |
|
4046 | function indentedJoin(xs, indent) {
|
4047 | if (xs.length === 0) { return ''; }
|
4048 | var lineJoiner = '\n' + indent.prev + indent.base;
|
4049 | return lineJoiner + $join.call(xs, ',' + lineJoiner) + '\n' + indent.prev;
|
4050 | }
|
4051 |
|
4052 | function arrObjKeys(obj, inspect) {
|
4053 | var isArr = isArray(obj);
|
4054 | var xs = [];
|
4055 | if (isArr) {
|
4056 | xs.length = obj.length;
|
4057 | for (var i = 0; i < obj.length; i++) {
|
4058 | xs[i] = has(obj, i) ? inspect(obj[i], obj) : '';
|
4059 | }
|
4060 | }
|
4061 | var syms = typeof gOPS === 'function' ? gOPS(obj) : [];
|
4062 | var symMap;
|
4063 | if (hasShammedSymbols) {
|
4064 | symMap = {};
|
4065 | for (var k = 0; k < syms.length; k++) {
|
4066 | symMap['$' + syms[k]] = syms[k];
|
4067 | }
|
4068 | }
|
4069 |
|
4070 | for (var key in obj) { // eslint-disable-line no-restricted-syntax
|
4071 | if (!has(obj, key)) { continue; } // eslint-disable-line no-restricted-syntax, no-continue
|
4072 | if (isArr && String(Number(key)) === key && key < obj.length) { continue; } // eslint-disable-line no-restricted-syntax, no-continue
|
4073 | if (hasShammedSymbols && symMap['$' + key] instanceof Symbol) {
|
4074 | // this is to prevent shammed Symbols, which are stored as strings, from being included in the string key section
|
4075 | continue; // eslint-disable-line no-restricted-syntax, no-continue
|
4076 | } else if ($test.call(/[^\w$]/, key)) {
|
4077 | xs.push(inspect(key, obj) + ': ' + inspect(obj[key], obj));
|
4078 | } else {
|
4079 | xs.push(key + ': ' + inspect(obj[key], obj));
|
4080 | }
|
4081 | }
|
4082 | if (typeof gOPS === 'function') {
|
4083 | for (var j = 0; j < syms.length; j++) {
|
4084 | if (isEnumerable.call(obj, syms[j])) {
|
4085 | xs.push('[' + inspect(syms[j]) + ']: ' + inspect(obj[syms[j]], obj));
|
4086 | }
|
4087 | }
|
4088 | }
|
4089 | return xs;
|
4090 | }
|
4091 |
|
4092 | },{"./util.inspect":57}],57:[function(require,module,exports){
|
4093 | module.exports = require('util').inspect;
|
4094 |
|
4095 | },{"util":102}],58:[function(require,module,exports){
|
4096 | ;
|
4097 |
|
4098 | var numberIsNaN = function (value) {
|
4099 | return value !== value;
|
4100 | };
|
4101 |
|
4102 | module.exports = function is(a, b) {
|
4103 | if (a === 0 && b === 0) {
|
4104 | return 1 / a === 1 / b;
|
4105 | }
|
4106 | if (a === b) {
|
4107 | return true;
|
4108 | }
|
4109 | if (numberIsNaN(a) && numberIsNaN(b)) {
|
4110 | return true;
|
4111 | }
|
4112 | return false;
|
4113 | };
|
4114 |
|
4115 |
|
4116 | },{}],59:[function(require,module,exports){
|
4117 | ;
|
4118 |
|
4119 | var define = require('define-properties');
|
4120 | var callBind = require('call-bind');
|
4121 |
|
4122 | var implementation = require('./implementation');
|
4123 | var getPolyfill = require('./polyfill');
|
4124 | var shim = require('./shim');
|
4125 |
|
4126 | var polyfill = callBind(getPolyfill(), Object);
|
4127 |
|
4128 | define(polyfill, {
|
4129 | getPolyfill: getPolyfill,
|
4130 | implementation: implementation,
|
4131 | shim: shim
|
4132 | });
|
4133 |
|
4134 | module.exports = polyfill;
|
4135 |
|
4136 | },{"./implementation":58,"./polyfill":60,"./shim":61,"call-bind":11,"define-properties":13}],60:[function(require,module,exports){
|
4137 | ;
|
4138 |
|
4139 | var implementation = require('./implementation');
|
4140 |
|
4141 | module.exports = function getPolyfill() {
|
4142 | return typeof Object.is === 'function' ? Object.is : implementation;
|
4143 | };
|
4144 |
|
4145 | },{"./implementation":58}],61:[function(require,module,exports){
|
4146 | ;
|
4147 |
|
4148 | var getPolyfill = require('./polyfill');
|
4149 | var define = require('define-properties');
|
4150 |
|
4151 | module.exports = function shimObjectIs() {
|
4152 | var polyfill = getPolyfill();
|
4153 | define(Object, { is: polyfill }, {
|
4154 | is: function testObjectIs() {
|
4155 | return Object.is !== polyfill;
|
4156 | }
|
4157 | });
|
4158 | return polyfill;
|
4159 | };
|
4160 |
|
4161 | },{"./polyfill":60,"define-properties":13}],62:[function(require,module,exports){
|
4162 | ;
|
4163 |
|
4164 | var keysShim;
|
4165 | if (!Object.keys) {
|
4166 | // modified from https://github.com/es-shims/es5-shim
|
4167 | var has = Object.prototype.hasOwnProperty;
|
4168 | var toStr = Object.prototype.toString;
|
4169 | var isArgs = require('./isArguments'); // eslint-disable-line global-require
|
4170 | var isEnumerable = Object.prototype.propertyIsEnumerable;
|
4171 | var hasDontEnumBug = !isEnumerable.call({ toString: null }, 'toString');
|
4172 | var hasProtoEnumBug = isEnumerable.call(function () {}, 'prototype');
|
4173 | var dontEnums = [
|
4174 | 'toString',
|
4175 | 'toLocaleString',
|
4176 | 'valueOf',
|
4177 | 'hasOwnProperty',
|
4178 | 'isPrototypeOf',
|
4179 | 'propertyIsEnumerable',
|
4180 | 'constructor'
|
4181 | ];
|
4182 | var equalsConstructorPrototype = function (o) {
|
4183 | var ctor = o.constructor;
|
4184 | return ctor && ctor.prototype === o;
|
4185 | };
|
4186 | var excludedKeys = {
|
4187 | $applicationCache: true,
|
4188 | $console: true,
|
4189 | $external: true,
|
4190 | $frame: true,
|
4191 | $frameElement: true,
|
4192 | $frames: true,
|
4193 | $innerHeight: true,
|
4194 | $innerWidth: true,
|
4195 | $onmozfullscreenchange: true,
|
4196 | $onmozfullscreenerror: true,
|
4197 | $outerHeight: true,
|
4198 | $outerWidth: true,
|
4199 | $pageXOffset: true,
|
4200 | $pageYOffset: true,
|
4201 | $parent: true,
|
4202 | $scrollLeft: true,
|
4203 | $scrollTop: true,
|
4204 | $scrollX: true,
|
4205 | $scrollY: true,
|
4206 | $self: true,
|
4207 | $webkitIndexedDB: true,
|
4208 | $webkitStorageInfo: true,
|
4209 | $window: true
|
4210 | };
|
4211 | var hasAutomationEqualityBug = (function () {
|
4212 | /* global window */
|
4213 | if (typeof window === 'undefined') { return false; }
|
4214 | for (var k in window) {
|
4215 | try {
|
4216 | if (!excludedKeys['$' + k] && has.call(window, k) && window[k] !== null && typeof window[k] === 'object') {
|
4217 | try {
|
4218 | equalsConstructorPrototype(window[k]);
|
4219 | } catch (e) {
|
4220 | return true;
|
4221 | }
|
4222 | }
|
4223 | } catch (e) {
|
4224 | return true;
|
4225 | }
|
4226 | }
|
4227 | return false;
|
4228 | }());
|
4229 | var equalsConstructorPrototypeIfNotBuggy = function (o) {
|
4230 | /* global window */
|
4231 | if (typeof window === 'undefined' || !hasAutomationEqualityBug) {
|
4232 | return equalsConstructorPrototype(o);
|
4233 | }
|
4234 | try {
|
4235 | return equalsConstructorPrototype(o);
|
4236 | } catch (e) {
|
4237 | return false;
|
4238 | }
|
4239 | };
|
4240 |
|
4241 | keysShim = function keys(object) {
|
4242 | var isObject = object !== null && typeof object === 'object';
|
4243 | var isFunction = toStr.call(object) === '[object Function]';
|
4244 | var isArguments = isArgs(object);
|
4245 | var isString = isObject && toStr.call(object) === '[object String]';
|
4246 | var theKeys = [];
|
4247 |
|
4248 | if (!isObject && !isFunction && !isArguments) {
|
4249 | throw new TypeError('Object.keys called on a non-object');
|
4250 | }
|
4251 |
|
4252 | var skipProto = hasProtoEnumBug && isFunction;
|
4253 | if (isString && object.length > 0 && !has.call(object, 0)) {
|
4254 | for (var i = 0; i < object.length; ++i) {
|
4255 | theKeys.push(String(i));
|
4256 | }
|
4257 | }
|
4258 |
|
4259 | if (isArguments && object.length > 0) {
|
4260 | for (var j = 0; j < object.length; ++j) {
|
4261 | theKeys.push(String(j));
|
4262 | }
|
4263 | } else {
|
4264 | for (var name in object) {
|
4265 | if (!(skipProto && name === 'prototype') && has.call(object, name)) {
|
4266 | theKeys.push(String(name));
|
4267 | }
|
4268 | }
|
4269 | }
|
4270 |
|
4271 | if (hasDontEnumBug) {
|
4272 | var skipConstructor = equalsConstructorPrototypeIfNotBuggy(object);
|
4273 |
|
4274 | for (var k = 0; k < dontEnums.length; ++k) {
|
4275 | if (!(skipConstructor && dontEnums[k] === 'constructor') && has.call(object, dontEnums[k])) {
|
4276 | theKeys.push(dontEnums[k]);
|
4277 | }
|
4278 | }
|
4279 | }
|
4280 | return theKeys;
|
4281 | };
|
4282 | }
|
4283 | module.exports = keysShim;
|
4284 |
|
4285 | },{"./isArguments":64}],63:[function(require,module,exports){
|
4286 | ;
|
4287 |
|
4288 | var slice = Array.prototype.slice;
|
4289 | var isArgs = require('./isArguments');
|
4290 |
|
4291 | var origKeys = Object.keys;
|
4292 | var keysShim = origKeys ? function keys(o) { return origKeys(o); } : require('./implementation');
|
4293 |
|
4294 | var originalKeys = Object.keys;
|
4295 |
|
4296 | keysShim.shim = function shimObjectKeys() {
|
4297 | if (Object.keys) {
|
4298 | var keysWorksWithArguments = (function () {
|
4299 | // Safari 5.0 bug
|
4300 | var args = Object.keys(arguments);
|
4301 | return args && args.length === arguments.length;
|
4302 | }(1, 2));
|
4303 | if (!keysWorksWithArguments) {
|
4304 | Object.keys = function keys(object) { // eslint-disable-line func-name-matching
|
4305 | if (isArgs(object)) {
|
4306 | return originalKeys(slice.call(object));
|
4307 | }
|
4308 | return originalKeys(object);
|
4309 | };
|
4310 | }
|
4311 | } else {
|
4312 | Object.keys = keysShim;
|
4313 | }
|
4314 | return Object.keys || keysShim;
|
4315 | };
|
4316 |
|
4317 | module.exports = keysShim;
|
4318 |
|
4319 | },{"./implementation":62,"./isArguments":64}],64:[function(require,module,exports){
|
4320 | ;
|
4321 |
|
4322 | var toStr = Object.prototype.toString;
|
4323 |
|
4324 | module.exports = function isArguments(value) {
|
4325 | var str = toStr.call(value);
|
4326 | var isArgs = str === '[object Arguments]';
|
4327 | if (!isArgs) {
|
4328 | isArgs = str !== '[object Array]' &&
|
4329 | value !== null &&
|
4330 | typeof value === 'object' &&
|
4331 | typeof value.length === 'number' &&
|
4332 | value.length >= 0 &&
|
4333 | toStr.call(value.callee) === '[object Function]';
|
4334 | }
|
4335 | return isArgs;
|
4336 | };
|
4337 |
|
4338 | },{}],65:[function(require,module,exports){
|
4339 | ;
|
4340 |
|
4341 | // modified from https://github.com/es-shims/es6-shim
|
4342 | var objectKeys = require('object-keys');
|
4343 | var hasSymbols = require('has-symbols/shams')();
|
4344 | var callBound = require('call-bind/callBound');
|
4345 | var toObject = Object;
|
4346 | var $push = callBound('Array.prototype.push');
|
4347 | var $propIsEnumerable = callBound('Object.prototype.propertyIsEnumerable');
|
4348 | var originalGetSymbols = hasSymbols ? Object.getOwnPropertySymbols : null;
|
4349 |
|
4350 | // eslint-disable-next-line no-unused-vars
|
4351 | module.exports = function assign(target, source1) {
|
4352 | if (target == null) { throw new TypeError('target must be an object'); }
|
4353 | var to = toObject(target); // step 1
|
4354 | if (arguments.length === 1) {
|
4355 | return to; // step 2
|
4356 | }
|
4357 | for (var s = 1; s < arguments.length; ++s) {
|
4358 | var from = toObject(arguments[s]); // step 3.a.i
|
4359 |
|
4360 | // step 3.a.ii:
|
4361 | var keys = objectKeys(from);
|
4362 | var getSymbols = hasSymbols && (Object.getOwnPropertySymbols || originalGetSymbols);
|
4363 | if (getSymbols) {
|
4364 | var syms = getSymbols(from);
|
4365 | for (var j = 0; j < syms.length; ++j) {
|
4366 | var key = syms[j];
|
4367 | if ($propIsEnumerable(from, key)) {
|
4368 | $push(keys, key);
|
4369 | }
|
4370 | }
|
4371 | }
|
4372 |
|
4373 | // step 3.a.iii:
|
4374 | for (var i = 0; i < keys.length; ++i) {
|
4375 | var nextKey = keys[i];
|
4376 | if ($propIsEnumerable(from, nextKey)) { // step 3.a.iii.2
|
4377 | var propValue = from[nextKey]; // step 3.a.iii.2.a
|
4378 | to[nextKey] = propValue; // step 3.a.iii.2.b
|
4379 | }
|
4380 | }
|
4381 | }
|
4382 |
|
4383 | return to; // step 4
|
4384 | };
|
4385 |
|
4386 | },{"call-bind/callBound":10,"has-symbols/shams":37,"object-keys":63}],66:[function(require,module,exports){
|
4387 | ;
|
4388 |
|
4389 | var defineProperties = require('define-properties');
|
4390 | var callBind = require('call-bind');
|
4391 |
|
4392 | var implementation = require('./implementation');
|
4393 | var getPolyfill = require('./polyfill');
|
4394 | var shim = require('./shim');
|
4395 |
|
4396 | var polyfill = callBind.apply(getPolyfill());
|
4397 | // eslint-disable-next-line no-unused-vars
|
4398 | var bound = function assign(target, source1) {
|
4399 | return polyfill(Object, arguments);
|
4400 | };
|
4401 |
|
4402 | defineProperties(bound, {
|
4403 | getPolyfill: getPolyfill,
|
4404 | implementation: implementation,
|
4405 | shim: shim
|
4406 | });
|
4407 |
|
4408 | module.exports = bound;
|
4409 |
|
4410 | },{"./implementation":65,"./polyfill":67,"./shim":68,"call-bind":11,"define-properties":13}],67:[function(require,module,exports){
|
4411 | ;
|
4412 |
|
4413 | var implementation = require('./implementation');
|
4414 |
|
4415 | var lacksProperEnumerationOrder = function () {
|
4416 | if (!Object.assign) {
|
4417 | return false;
|
4418 | }
|
4419 | /*
|
4420 | * v8, specifically in node 4.x, has a bug with incorrect property enumeration order
|
4421 | * note: this does not detect the bug unless there's 20 characters
|
4422 | */
|
4423 | var str = 'abcdefghijklmnopqrst';
|
4424 | var letters = str.split('');
|
4425 | var map = {};
|
4426 | for (var i = 0; i < letters.length; ++i) {
|
4427 | map[letters[i]] = letters[i];
|
4428 | }
|
4429 | var obj = Object.assign({}, map);
|
4430 | var actual = '';
|
4431 | for (var k in obj) {
|
4432 | actual += k;
|
4433 | }
|
4434 | return str !== actual;
|
4435 | };
|
4436 |
|
4437 | var assignHasPendingExceptions = function () {
|
4438 | if (!Object.assign || !Object.preventExtensions) {
|
4439 | return false;
|
4440 | }
|
4441 | /*
|
4442 | * Firefox 37 still has "pending exception" logic in its Object.assign implementation,
|
4443 | * which is 72% slower than our shim, and Firefox 40's native implementation.
|
4444 | */
|
4445 | var thrower = Object.preventExtensions({ 1: 2 });
|
4446 | try {
|
4447 | Object.assign(thrower, 'xy');
|
4448 | } catch (e) {
|
4449 | return thrower[1] === 'y';
|
4450 | }
|
4451 | return false;
|
4452 | };
|
4453 |
|
4454 | module.exports = function getPolyfill() {
|
4455 | if (!Object.assign) {
|
4456 | return implementation;
|
4457 | }
|
4458 | if (lacksProperEnumerationOrder()) {
|
4459 | return implementation;
|
4460 | }
|
4461 | if (assignHasPendingExceptions()) {
|
4462 | return implementation;
|
4463 | }
|
4464 | return Object.assign;
|
4465 | };
|
4466 |
|
4467 | },{"./implementation":65}],68:[function(require,module,exports){
|
4468 | ;
|
4469 |
|
4470 | var define = require('define-properties');
|
4471 | var getPolyfill = require('./polyfill');
|
4472 |
|
4473 | module.exports = function shimAssign() {
|
4474 | var polyfill = getPolyfill();
|
4475 | define(
|
4476 | Object,
|
4477 | { assign: polyfill },
|
4478 | { assign: function () { return Object.assign !== polyfill; } }
|
4479 | );
|
4480 | return polyfill;
|
4481 | };
|
4482 |
|
4483 | },{"./polyfill":67,"define-properties":13}],69:[function(require,module,exports){
|
4484 | ;
|
4485 |
|
4486 | var functionsHaveConfigurableNames = require('functions-have-names').functionsHaveConfigurableNames();
|
4487 |
|
4488 | var $Object = Object;
|
4489 | var $TypeError = TypeError;
|
4490 |
|
4491 | module.exports = function flags() {
|
4492 | if (this != null && this !== $Object(this)) {
|
4493 | throw new $TypeError('RegExp.prototype.flags getter called on non-object');
|
4494 | }
|
4495 | var result = '';
|
4496 | if (this.hasIndices) {
|
4497 | result += 'd';
|
4498 | }
|
4499 | if (this.global) {
|
4500 | result += 'g';
|
4501 | }
|
4502 | if (this.ignoreCase) {
|
4503 | result += 'i';
|
4504 | }
|
4505 | if (this.multiline) {
|
4506 | result += 'm';
|
4507 | }
|
4508 | if (this.dotAll) {
|
4509 | result += 's';
|
4510 | }
|
4511 | if (this.unicode) {
|
4512 | result += 'u';
|
4513 | }
|
4514 | if (this.sticky) {
|
4515 | result += 'y';
|
4516 | }
|
4517 | return result;
|
4518 | };
|
4519 |
|
4520 | if (functionsHaveConfigurableNames && Object.defineProperty) {
|
4521 | Object.defineProperty(module.exports, 'name', { value: 'get flags' });
|
4522 | }
|
4523 |
|
4524 | },{"functions-have-names":32}],70:[function(require,module,exports){
|
4525 | ;
|
4526 |
|
4527 | var define = require('define-properties');
|
4528 | var callBind = require('call-bind');
|
4529 |
|
4530 | var implementation = require('./implementation');
|
4531 | var getPolyfill = require('./polyfill');
|
4532 | var shim = require('./shim');
|
4533 |
|
4534 | var flagsBound = callBind(getPolyfill());
|
4535 |
|
4536 | define(flagsBound, {
|
4537 | getPolyfill: getPolyfill,
|
4538 | implementation: implementation,
|
4539 | shim: shim
|
4540 | });
|
4541 |
|
4542 | module.exports = flagsBound;
|
4543 |
|
4544 | },{"./implementation":69,"./polyfill":71,"./shim":72,"call-bind":11,"define-properties":13}],71:[function(require,module,exports){
|
4545 | ;
|
4546 |
|
4547 | var implementation = require('./implementation');
|
4548 |
|
4549 | var supportsDescriptors = require('define-properties').supportsDescriptors;
|
4550 | var $gOPD = Object.getOwnPropertyDescriptor;
|
4551 |
|
4552 | module.exports = function getPolyfill() {
|
4553 | if (supportsDescriptors && (/a/mig).flags === 'gim') {
|
4554 | var descriptor = $gOPD(RegExp.prototype, 'flags');
|
4555 | if (
|
4556 | descriptor
|
4557 | && typeof descriptor.get === 'function'
|
4558 | && typeof RegExp.prototype.dotAll === 'boolean'
|
4559 | && typeof RegExp.prototype.hasIndices === 'boolean'
|
4560 | ) {
|
4561 | /* eslint getter-return: 0 */
|
4562 | var calls = '';
|
4563 | var o = {};
|
4564 | Object.defineProperty(o, 'hasIndices', {
|
4565 | get: function () {
|
4566 | calls += 'd';
|
4567 | }
|
4568 | });
|
4569 | Object.defineProperty(o, 'sticky', {
|
4570 | get: function () {
|
4571 | calls += 'y';
|
4572 | }
|
4573 | });
|
4574 | if (calls === 'dy') {
|
4575 | return descriptor.get;
|
4576 | }
|
4577 | }
|
4578 | }
|
4579 | return implementation;
|
4580 | };
|
4581 |
|
4582 | },{"./implementation":69,"define-properties":13}],72:[function(require,module,exports){
|
4583 | ;
|
4584 |
|
4585 | var supportsDescriptors = require('define-properties').supportsDescriptors;
|
4586 | var getPolyfill = require('./polyfill');
|
4587 | var gOPD = Object.getOwnPropertyDescriptor;
|
4588 | var defineProperty = Object.defineProperty;
|
4589 | var TypeErr = TypeError;
|
4590 | var getProto = Object.getPrototypeOf;
|
4591 | var regex = /a/;
|
4592 |
|
4593 | module.exports = function shimFlags() {
|
4594 | if (!supportsDescriptors || !getProto) {
|
4595 | throw new TypeErr('RegExp.prototype.flags requires a true ES5 environment that supports property descriptors');
|
4596 | }
|
4597 | var polyfill = getPolyfill();
|
4598 | var proto = getProto(regex);
|
4599 | var descriptor = gOPD(proto, 'flags');
|
4600 | if (!descriptor || descriptor.get !== polyfill) {
|
4601 | defineProperty(proto, 'flags', {
|
4602 | configurable: true,
|
4603 | enumerable: false,
|
4604 | get: polyfill
|
4605 | });
|
4606 | }
|
4607 | return polyfill;
|
4608 | };
|
4609 |
|
4610 | },{"./polyfill":71,"define-properties":13}],73:[function(require,module,exports){
|
4611 | (function (process){
|
4612 | var through = require('through');
|
4613 | var nextTick = typeof setImmediate !== 'undefined'
|
4614 | ? setImmediate
|
4615 | : process.nextTick
|
4616 | ;
|
4617 |
|
4618 | module.exports = function (write, end) {
|
4619 | var tr = through(write, end);
|
4620 | tr.pause();
|
4621 | var resume = tr.resume;
|
4622 | var pause = tr.pause;
|
4623 | var paused = false;
|
4624 |
|
4625 | tr.pause = function () {
|
4626 | paused = true;
|
4627 | return pause.apply(this, arguments);
|
4628 | };
|
4629 |
|
4630 | tr.resume = function () {
|
4631 | paused = false;
|
4632 | return resume.apply(this, arguments);
|
4633 | };
|
4634 |
|
4635 | nextTick(function () {
|
4636 | if (!paused) tr.resume();
|
4637 | });
|
4638 |
|
4639 | return tr;
|
4640 | };
|
4641 |
|
4642 | }).call(this,require("KliubH"))
|
4643 | },{"KliubH":91,"through":79}],74:[function(require,module,exports){
|
4644 | ;
|
4645 |
|
4646 | var GetIntrinsic = require('get-intrinsic');
|
4647 | var callBound = require('call-bind/callBound');
|
4648 | var inspect = require('object-inspect');
|
4649 |
|
4650 | var $TypeError = GetIntrinsic('%TypeError%');
|
4651 | var $WeakMap = GetIntrinsic('%WeakMap%', true);
|
4652 | var $Map = GetIntrinsic('%Map%', true);
|
4653 |
|
4654 | var $weakMapGet = callBound('WeakMap.prototype.get', true);
|
4655 | var $weakMapSet = callBound('WeakMap.prototype.set', true);
|
4656 | var $weakMapHas = callBound('WeakMap.prototype.has', true);
|
4657 | var $mapGet = callBound('Map.prototype.get', true);
|
4658 | var $mapSet = callBound('Map.prototype.set', true);
|
4659 | var $mapHas = callBound('Map.prototype.has', true);
|
4660 |
|
4661 | /*
|
4662 | * This function traverses the list returning the node corresponding to the
|
4663 | * given key.
|
4664 | *
|
4665 | * That node is also moved to the head of the list, so that if it's accessed
|
4666 | * again we don't need to traverse the whole list. By doing so, all the recently
|
4667 | * used nodes can be accessed relatively quickly.
|
4668 | */
|
4669 | var listGetNode = function (list, key) { // eslint-disable-line consistent-return
|
4670 | for (var prev = list, curr; (curr = prev.next) !== null; prev = curr) {
|
4671 | if (curr.key === key) {
|
4672 | prev.next = curr.next;
|
4673 | curr.next = list.next;
|
4674 | list.next = curr; // eslint-disable-line no-param-reassign
|
4675 | return curr;
|
4676 | }
|
4677 | }
|
4678 | };
|
4679 |
|
4680 | var listGet = function (objects, key) {
|
4681 | var node = listGetNode(objects, key);
|
4682 | return node && node.value;
|
4683 | };
|
4684 | var listSet = function (objects, key, value) {
|
4685 | var node = listGetNode(objects, key);
|
4686 | if (node) {
|
4687 | node.value = value;
|
4688 | } else {
|
4689 | // Prepend the new node to the beginning of the list
|
4690 | objects.next = { // eslint-disable-line no-param-reassign
|
4691 | key: key,
|
4692 | next: objects.next,
|
4693 | value: value
|
4694 | };
|
4695 | }
|
4696 | };
|
4697 | var listHas = function (objects, key) {
|
4698 | return !!listGetNode(objects, key);
|
4699 | };
|
4700 |
|
4701 | module.exports = function getSideChannel() {
|
4702 | var $wm;
|
4703 | var $m;
|
4704 | var $o;
|
4705 | var channel = {
|
4706 | assert: function (key) {
|
4707 | if (!channel.has(key)) {
|
4708 | throw new $TypeError('Side channel does not contain ' + inspect(key));
|
4709 | }
|
4710 | },
|
4711 | get: function (key) { // eslint-disable-line consistent-return
|
4712 | if ($WeakMap && key && (typeof key === 'object' || typeof key === 'function')) {
|
4713 | if ($wm) {
|
4714 | return $weakMapGet($wm, key);
|
4715 | }
|
4716 | } else if ($Map) {
|
4717 | if ($m) {
|
4718 | return $mapGet($m, key);
|
4719 | }
|
4720 | } else {
|
4721 | if ($o) { // eslint-disable-line no-lonely-if
|
4722 | return listGet($o, key);
|
4723 | }
|
4724 | }
|
4725 | },
|
4726 | has: function (key) {
|
4727 | if ($WeakMap && key && (typeof key === 'object' || typeof key === 'function')) {
|
4728 | if ($wm) {
|
4729 | return $weakMapHas($wm, key);
|
4730 | }
|
4731 | } else if ($Map) {
|
4732 | if ($m) {
|
4733 | return $mapHas($m, key);
|
4734 | }
|
4735 | } else {
|
4736 | if ($o) { // eslint-disable-line no-lonely-if
|
4737 | return listHas($o, key);
|
4738 | }
|
4739 | }
|
4740 | return false;
|
4741 | },
|
4742 | set: function (key, value) {
|
4743 | if ($WeakMap && key && (typeof key === 'object' || typeof key === 'function')) {
|
4744 | if (!$wm) {
|
4745 | $wm = new $WeakMap();
|
4746 | }
|
4747 | $weakMapSet($wm, key, value);
|
4748 | } else if ($Map) {
|
4749 | if (!$m) {
|
4750 | $m = new $Map();
|
4751 | }
|
4752 | $mapSet($m, key, value);
|
4753 | } else {
|
4754 | if (!$o) {
|
4755 | /*
|
4756 | * Initialize the linked list as an empty node, so that we don't have
|
4757 | * to special-case handling of the first node: we can always refer to
|
4758 | * it as (previous node).next, instead of something like (list).head
|
4759 | */
|
4760 | $o = { key: {}, next: null };
|
4761 | }
|
4762 | listSet($o, key, value);
|
4763 | }
|
4764 | }
|
4765 | };
|
4766 | return channel;
|
4767 | };
|
4768 |
|
4769 | },{"call-bind/callBound":10,"get-intrinsic":33,"object-inspect":56}],75:[function(require,module,exports){
|
4770 | ;
|
4771 |
|
4772 | var RequireObjectCoercible = require('es-abstract/2021/RequireObjectCoercible');
|
4773 | var ToString = require('es-abstract/2021/ToString');
|
4774 | var callBound = require('call-bind/callBound');
|
4775 | var $replace = callBound('String.prototype.replace');
|
4776 |
|
4777 | var mvsIsWS = (/^\s$/).test('\u180E');
|
4778 | /* eslint-disable no-control-regex */
|
4779 | var leftWhitespace = mvsIsWS
|
4780 | ? /^[\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029\uFEFF]+/
|
4781 | : /^[\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029\uFEFF]+/;
|
4782 | var rightWhitespace = mvsIsWS
|
4783 | ? /[\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029\uFEFF]+$/
|
4784 | : /[\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029\uFEFF]+$/;
|
4785 | /* eslint-enable no-control-regex */
|
4786 |
|
4787 | module.exports = function trim() {
|
4788 | var S = ToString(RequireObjectCoercible(this));
|
4789 | return $replace($replace(S, leftWhitespace, ''), rightWhitespace, '');
|
4790 | };
|
4791 |
|
4792 | },{"call-bind/callBound":10,"es-abstract/2021/RequireObjectCoercible":16,"es-abstract/2021/ToString":20}],76:[function(require,module,exports){
|
4793 | ;
|
4794 |
|
4795 | var callBind = require('call-bind');
|
4796 | var define = require('define-properties');
|
4797 | var RequireObjectCoercible = require('es-abstract/2021/RequireObjectCoercible');
|
4798 |
|
4799 | var implementation = require('./implementation');
|
4800 | var getPolyfill = require('./polyfill');
|
4801 | var shim = require('./shim');
|
4802 |
|
4803 | var bound = callBind(getPolyfill());
|
4804 | var boundMethod = function trim(receiver) {
|
4805 | RequireObjectCoercible(receiver);
|
4806 | return bound(receiver);
|
4807 | };
|
4808 |
|
4809 | define(boundMethod, {
|
4810 | getPolyfill: getPolyfill,
|
4811 | implementation: implementation,
|
4812 | shim: shim
|
4813 | });
|
4814 |
|
4815 | module.exports = boundMethod;
|
4816 |
|
4817 | },{"./implementation":75,"./polyfill":77,"./shim":78,"call-bind":11,"define-properties":13,"es-abstract/2021/RequireObjectCoercible":16}],77:[function(require,module,exports){
|
4818 | ;
|
4819 |
|
4820 | var implementation = require('./implementation');
|
4821 |
|
4822 | var zeroWidthSpace = '\u200b';
|
4823 | var mongolianVowelSeparator = '\u180E';
|
4824 |
|
4825 | module.exports = function getPolyfill() {
|
4826 | if (
|
4827 | String.prototype.trim
|
4828 | && zeroWidthSpace.trim() === zeroWidthSpace
|
4829 | && mongolianVowelSeparator.trim() === mongolianVowelSeparator
|
4830 | && ('_' + mongolianVowelSeparator).trim() === ('_' + mongolianVowelSeparator)
|
4831 | && (mongolianVowelSeparator + '_').trim() === (mongolianVowelSeparator + '_')
|
4832 | ) {
|
4833 | return String.prototype.trim;
|
4834 | }
|
4835 | return implementation;
|
4836 | };
|
4837 |
|
4838 | },{"./implementation":75}],78:[function(require,module,exports){
|
4839 | ;
|
4840 |
|
4841 | var define = require('define-properties');
|
4842 | var getPolyfill = require('./polyfill');
|
4843 |
|
4844 | module.exports = function shimStringTrim() {
|
4845 | var polyfill = getPolyfill();
|
4846 | define(String.prototype, { trim: polyfill }, {
|
4847 | trim: function testTrim() {
|
4848 | return String.prototype.trim !== polyfill;
|
4849 | }
|
4850 | });
|
4851 | return polyfill;
|
4852 | };
|
4853 |
|
4854 | },{"./polyfill":77,"define-properties":13}],79:[function(require,module,exports){
|
4855 | (function (process){
|
4856 | var Stream = require('stream')
|
4857 |
|
4858 | // through
|
4859 | //
|
4860 | // a stream that does nothing but re-emit the input.
|
4861 | // useful for aggregating a series of changing but not ending streams into one stream)
|
4862 |
|
4863 | exports = module.exports = through
|
4864 | through.through = through
|
4865 |
|
4866 | //create a readable writable stream.
|
4867 |
|
4868 | function through (write, end, opts) {
|
4869 | write = write || function (data) { this.queue(data) }
|
4870 | end = end || function () { this.queue(null) }
|
4871 |
|
4872 | var ended = false, destroyed = false, buffer = [], _ended = false
|
4873 | var stream = new Stream()
|
4874 | stream.readable = stream.writable = true
|
4875 | stream.paused = false
|
4876 |
|
4877 | // stream.autoPause = !(opts && opts.autoPause === false)
|
4878 | stream.autoDestroy = !(opts && opts.autoDestroy === false)
|
4879 |
|
4880 | stream.write = function (data) {
|
4881 | write.call(this, data)
|
4882 | return !stream.paused
|
4883 | }
|
4884 |
|
4885 | function drain() {
|
4886 | while(buffer.length && !stream.paused) {
|
4887 | var data = buffer.shift()
|
4888 | if(null === data)
|
4889 | return stream.emit('end')
|
4890 | else
|
4891 | stream.emit('data', data)
|
4892 | }
|
4893 | }
|
4894 |
|
4895 | stream.queue = stream.push = function (data) {
|
4896 | // console.error(ended)
|
4897 | if(_ended) return stream
|
4898 | if(data === null) _ended = true
|
4899 | buffer.push(data)
|
4900 | drain()
|
4901 | return stream
|
4902 | }
|
4903 |
|
4904 | //this will be registered as the first 'end' listener
|
4905 | //must call destroy next tick, to make sure we're after any
|
4906 | //stream piped from here.
|
4907 | //this is only a problem if end is not emitted synchronously.
|
4908 | //a nicer way to do this is to make sure this is the last listener for 'end'
|
4909 |
|
4910 | stream.on('end', function () {
|
4911 | stream.readable = false
|
4912 | if(!stream.writable && stream.autoDestroy)
|
4913 | process.nextTick(function () {
|
4914 | stream.destroy()
|
4915 | })
|
4916 | })
|
4917 |
|
4918 | function _end () {
|
4919 | stream.writable = false
|
4920 | end.call(stream)
|
4921 | if(!stream.readable && stream.autoDestroy)
|
4922 | stream.destroy()
|
4923 | }
|
4924 |
|
4925 | stream.end = function (data) {
|
4926 | if(ended) return
|
4927 | ended = true
|
4928 | if(arguments.length) stream.write(data)
|
4929 | _end() // will emit or queue
|
4930 | return stream
|
4931 | }
|
4932 |
|
4933 | stream.destroy = function () {
|
4934 | if(destroyed) return
|
4935 | destroyed = true
|
4936 | ended = true
|
4937 | buffer.length = 0
|
4938 | stream.writable = stream.readable = false
|
4939 | stream.emit('close')
|
4940 | return stream
|
4941 | }
|
4942 |
|
4943 | stream.pause = function () {
|
4944 | if(stream.paused) return
|
4945 | stream.paused = true
|
4946 | return stream
|
4947 | }
|
4948 |
|
4949 | stream.resume = function () {
|
4950 | if(stream.paused) {
|
4951 | stream.paused = false
|
4952 | stream.emit('resume')
|
4953 | }
|
4954 | drain()
|
4955 | //may have become paused again,
|
4956 | //as drain emits 'data'.
|
4957 | if(!stream.paused)
|
4958 | stream.emit('drain')
|
4959 | return stream
|
4960 | }
|
4961 | return stream
|
4962 | }
|
4963 |
|
4964 |
|
4965 | }).call(this,require("KliubH"))
|
4966 | },{"KliubH":91,"stream":93}],80:[function(require,module,exports){
|
4967 | ;
|
4968 |
|
4969 | var isString = require('is-string');
|
4970 | var isNumber = require('is-number-object');
|
4971 | var isBoolean = require('is-boolean-object');
|
4972 | var isSymbol = require('is-symbol');
|
4973 | var isBigInt = require('is-bigint');
|
4974 |
|
4975 | // eslint-disable-next-line consistent-return
|
4976 | module.exports = function whichBoxedPrimitive(value) {
|
4977 | // eslint-disable-next-line eqeqeq
|
4978 | if (value == null || (typeof value !== 'object' && typeof value !== 'function')) {
|
4979 | return null;
|
4980 | }
|
4981 | if (isString(value)) {
|
4982 | return 'String';
|
4983 | }
|
4984 | if (isNumber(value)) {
|
4985 | return 'Number';
|
4986 | }
|
4987 | if (isBoolean(value)) {
|
4988 | return 'Boolean';
|
4989 | }
|
4990 | if (isSymbol(value)) {
|
4991 | return 'Symbol';
|
4992 | }
|
4993 | if (isBigInt(value)) {
|
4994 | return 'BigInt';
|
4995 | }
|
4996 | };
|
4997 |
|
4998 | },{"is-bigint":42,"is-boolean-object":43,"is-number-object":47,"is-string":50,"is-symbol":51}],81:[function(require,module,exports){
|
4999 | ;
|
5000 |
|
5001 | var isMap = require('is-map');
|
5002 | var isSet = require('is-set');
|
5003 | var isWeakMap = require('is-weakmap');
|
5004 | var isWeakSet = require('is-weakset');
|
5005 |
|
5006 | module.exports = function whichCollection(value) {
|
5007 | if (value && typeof value === 'object') {
|
5008 | if (isMap(value)) {
|
5009 | return 'Map';
|
5010 | }
|
5011 | if (isSet(value)) {
|
5012 | return 'Set';
|
5013 | }
|
5014 | if (isWeakMap(value)) {
|
5015 | return 'WeakMap';
|
5016 | }
|
5017 | if (isWeakSet(value)) {
|
5018 | return 'WeakSet';
|
5019 | }
|
5020 | }
|
5021 | return false;
|
5022 | };
|
5023 |
|
5024 | },{"is-map":46,"is-set":49,"is-weakmap":53,"is-weakset":54}],82:[function(require,module,exports){
|
5025 | (function (global){
|
5026 | ;
|
5027 |
|
5028 | var forEach = require('for-each');
|
5029 | var availableTypedArrays = require('available-typed-arrays');
|
5030 | var callBound = require('call-bind/callBound');
|
5031 |
|
5032 | var $toString = callBound('Object.prototype.toString');
|
5033 | var hasToStringTag = require('has-tostringtag/shams')();
|
5034 |
|
5035 | var g = typeof globalThis === 'undefined' ? global : globalThis;
|
5036 | var typedArrays = availableTypedArrays();
|
5037 |
|
5038 | var $slice = callBound('String.prototype.slice');
|
5039 | var toStrTags = {};
|
5040 | var gOPD = require('es-abstract/helpers/getOwnPropertyDescriptor');
|
5041 | var getPrototypeOf = Object.getPrototypeOf; // require('getprototypeof');
|
5042 | if (hasToStringTag && gOPD && getPrototypeOf) {
|
5043 | forEach(typedArrays, function (typedArray) {
|
5044 | if (typeof g[typedArray] === 'function') {
|
5045 | var arr = new g[typedArray]();
|
5046 | if (Symbol.toStringTag in arr) {
|
5047 | var proto = getPrototypeOf(arr);
|
5048 | var descriptor = gOPD(proto, Symbol.toStringTag);
|
5049 | if (!descriptor) {
|
5050 | var superProto = getPrototypeOf(proto);
|
5051 | descriptor = gOPD(superProto, Symbol.toStringTag);
|
5052 | }
|
5053 | toStrTags[typedArray] = descriptor.get;
|
5054 | }
|
5055 | }
|
5056 | });
|
5057 | }
|
5058 |
|
5059 | var tryTypedArrays = function tryAllTypedArrays(value) {
|
5060 | var foundName = false;
|
5061 | forEach(toStrTags, function (getter, typedArray) {
|
5062 | if (!foundName) {
|
5063 | try {
|
5064 | var name = getter.call(value);
|
5065 | if (name === typedArray) {
|
5066 | foundName = name;
|
5067 | }
|
5068 | } catch (e) {}
|
5069 | }
|
5070 | });
|
5071 | return foundName;
|
5072 | };
|
5073 |
|
5074 | var isTypedArray = require('is-typed-array');
|
5075 |
|
5076 | module.exports = function whichTypedArray(value) {
|
5077 | if (!isTypedArray(value)) { return false; }
|
5078 | if (!hasToStringTag || !(Symbol.toStringTag in value)) { return $slice($toString(value), 8, -1); }
|
5079 | return tryTypedArrays(value);
|
5080 | };
|
5081 |
|
5082 | }).call(this,typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
5083 | },{"available-typed-arrays":9,"call-bind/callBound":10,"es-abstract/helpers/getOwnPropertyDescriptor":23,"for-each":29,"has-tostringtag/shams":38,"is-typed-array":52}],83:[function(require,module,exports){
|
5084 | ;
|
5085 |
|
5086 | var test = require('../../');
|
5087 |
|
5088 | test(function (t) {
|
5089 | t.plan(4);
|
5090 | t.ok(true);
|
5091 | t.equal(3, 1 + 2);
|
5092 | t.deepEqual([1, 2, [3, 4]], [1, 2, [3, 4]]);
|
5093 | t.notDeepEqual([1, 2, [3, 4, 5]], [1, 2, [3, 4]]);
|
5094 | });
|
5095 |
|
5096 | },{"../../":1}],84:[function(require,module,exports){
|
5097 | var lookup = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
|
5098 |
|
5099 | ;(function (exports) {
|
5100 | ;
|
5101 |
|
5102 | var Arr = (typeof Uint8Array !== 'undefined')
|
5103 | ? Uint8Array
|
5104 | : Array
|
5105 |
|
5106 | var PLUS = '+'.charCodeAt(0)
|
5107 | var SLASH = '/'.charCodeAt(0)
|
5108 | var NUMBER = '0'.charCodeAt(0)
|
5109 | var LOWER = 'a'.charCodeAt(0)
|
5110 | var UPPER = 'A'.charCodeAt(0)
|
5111 | var PLUS_URL_SAFE = '-'.charCodeAt(0)
|
5112 | var SLASH_URL_SAFE = '_'.charCodeAt(0)
|
5113 |
|
5114 | function decode (elt) {
|
5115 | var code = elt.charCodeAt(0)
|
5116 | if (code === PLUS ||
|
5117 | code === PLUS_URL_SAFE)
|
5118 | return 62 // '+'
|
5119 | if (code === SLASH ||
|
5120 | code === SLASH_URL_SAFE)
|
5121 | return 63 // '/'
|
5122 | if (code < NUMBER)
|
5123 | return -1 //no match
|
5124 | if (code < NUMBER + 10)
|
5125 | return code - NUMBER + 26 + 26
|
5126 | if (code < UPPER + 26)
|
5127 | return code - UPPER
|
5128 | if (code < LOWER + 26)
|
5129 | return code - LOWER + 26
|
5130 | }
|
5131 |
|
5132 | function b64ToByteArray (b64) {
|
5133 | var i, j, l, tmp, placeHolders, arr
|
5134 |
|
5135 | if (b64.length % 4 > 0) {
|
5136 | throw new Error('Invalid string. Length must be a multiple of 4')
|
5137 | }
|
5138 |
|
5139 | // the number of equal signs (place holders)
|
5140 | // if there are two placeholders, than the two characters before it
|
5141 | // represent one byte
|
5142 | // if there is only one, then the three characters before it represent 2 bytes
|
5143 | // this is just a cheap hack to not do indexOf twice
|
5144 | var len = b64.length
|
5145 | placeHolders = '=' === b64.charAt(len - 2) ? 2 : '=' === b64.charAt(len - 1) ? 1 : 0
|
5146 |
|
5147 | // base64 is 4/3 + up to two characters of the original data
|
5148 | arr = new Arr(b64.length * 3 / 4 - placeHolders)
|
5149 |
|
5150 | // if there are placeholders, only get up to the last complete 4 chars
|
5151 | l = placeHolders > 0 ? b64.length - 4 : b64.length
|
5152 |
|
5153 | var L = 0
|
5154 |
|
5155 | function push (v) {
|
5156 | arr[L++] = v
|
5157 | }
|
5158 |
|
5159 |
|
5160 | tmp = (decode(b64.charAt(i)) << 18) | (decode(b64.charAt(i + 1)) << 12) | (decode(b64.charAt(i + 2)) << 6) | decode(b64.charAt(i + 3))
|
5161 | push((tmp & 0xFF0000) >> 16)
|
5162 | push((tmp & 0xFF00) >> 8)
|
5163 | push(tmp & 0xFF)
|
5164 | }
|
5165 |
|
5166 | if (placeHolders === 2) {
|
5167 |
|
5168 | push(tmp & 0xFF)
|
5169 | } else if (placeHolders === 1) {
|
5170 |
|
5171 | push((tmp >> 8) & 0xFF)
|
5172 | push(tmp & 0xFF)
|
5173 | }
|
5174 |
|
5175 | return arr
|
5176 | }
|
5177 |
|
5178 | function uint8ToBase64 (uint8) {
|
5179 | var i,
|
5180 | extraBytes = uint8.length % 3, // if we have 1 byte left, pad 2 bytes
|
5181 | output = "",
|
5182 | temp, length
|
5183 |
|
5184 | function encode (num) {
|
5185 | return lookup.charAt(num)
|
5186 | }
|
5187 |
|
5188 | function tripletToBase64 (num) {
|
5189 | return encode(num >> 18 & 0x3F) + encode(num >> 12 & 0x3F) + encode(num >> 6 & 0x3F) + encode(num & 0x3F)
|
5190 | }
|
5191 |
|
5192 | // go through the array every three bytes, we'll deal with trailing stuff later
|
5193 | for (i = 0, length = uint8.length - extraBytes; i < length; i += 3) {
|
5194 | temp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2])
|
5195 | output += tripletToBase64(temp)
|
5196 | }
|
5197 |
|
5198 | // pad the end with zeros, but make sure to not forget the extra bytes
|
5199 | switch (extraBytes) {
|
5200 | case 1:
|
5201 | temp = uint8[uint8.length - 1]
|
5202 | output += encode(temp >> 2)
|
5203 | output += encode((temp << 4) & 0x3F)
|
5204 | output += '=='
|
5205 | break
|
5206 | case 2:
|
5207 | temp = (uint8[uint8.length - 2] << 8) + (uint8[uint8.length - 1])
|
5208 | output += encode(temp >> 10)
|
5209 | output += encode((temp >> 4) & 0x3F)
|
5210 | output += encode((temp << 2) & 0x3F)
|
5211 | output += '='
|
5212 | break
|
5213 | }
|
5214 |
|
5215 | return output
|
5216 | }
|
5217 |
|
5218 | exports.toByteArray = b64ToByteArray
|
5219 | exports.fromByteArray = uint8ToBase64
|
5220 | }(typeof exports === 'undefined' ? (this.base64js = {}) : exports))
|
5221 |
|
5222 | },{}],85:[function(require,module,exports){
|
5223 |
|
5224 | },{}],86:[function(require,module,exports){
|
5225 | /*!
|
5226 | * The buffer module from node.js, for the browser.
|
5227 | *
|
5228 |
|
5229 | * @license MIT
|
5230 | */
|
5231 |
|
5232 | var base64 = require('base64-js')
|
5233 | var ieee754 = require('ieee754')
|
5234 |
|
5235 | exports.Buffer = Buffer
|
5236 | exports.SlowBuffer = Buffer
|
5237 | exports.INSPECT_MAX_BYTES = 50
|
5238 | Buffer.poolSize = 8192
|
5239 |
|
5240 | /**
|
5241 | * If `Buffer._useTypedArrays`:
|
5242 | * === true Use Uint8Array implementation (fastest)
|
5243 | * === false Use Object implementation (compatible down to IE6)
|
5244 | */
|
5245 | Buffer._useTypedArrays = (function () {
|
5246 | // Detect if browser supports Typed Arrays. Supported browsers are IE 10+, Firefox 4+,
|
5247 | // Chrome 7+, Safari 5.1+, Opera 11.6+, iOS 4.2+. If the browser does not support adding
|
5248 | // properties to `Uint8Array` instances, then that's the same as no `Uint8Array` support
|
5249 | // because we need to be able to add all the node Buffer API methods. This is an issue
|
5250 | // in Firefox 4-29. Now fixed: https://bugzilla.mozilla.org/show_bug.cgi?id=695438
|
5251 | try {
|
5252 | var buf = new ArrayBuffer(0)
|
5253 | var arr = new Uint8Array(buf)
|
5254 | arr.foo = function () { return 42 }
|
5255 | return 42 === arr.foo() &&
|
5256 | typeof arr.subarray === 'function' // Chrome 9-10 lack `subarray`
|
5257 | } catch (e) {
|
5258 | return false
|
5259 | }
|
5260 | })()
|
5261 |
|
5262 | /**
|
5263 | * Class: Buffer
|
5264 | * =============
|
5265 | *
|
5266 | * The Buffer constructor returns instances of `Uint8Array` that are augmented
|
5267 | * with function properties for all the node `Buffer` API functions. We use
|
5268 | * `Uint8Array` so that square bracket notation works as expected -- it returns
|
5269 | * a single octet.
|
5270 | *
|
5271 | * By augmenting the instances, we can avoid modifying the `Uint8Array`
|
5272 | * prototype.
|
5273 | */
|
5274 | function Buffer (subject, encoding, noZero) {
|
5275 | if (!(this instanceof Buffer))
|
5276 | return new Buffer(subject, encoding, noZero)
|
5277 |
|
5278 | var type = typeof subject
|
5279 |
|
5280 | // Workaround: node's base64 implementation allows for non-padded strings
|
5281 | // while base64-js does not.
|
5282 | if (encoding === 'base64' && type === 'string') {
|
5283 | subject = stringtrim(subject)
|
5284 | while (subject.length % 4 !== 0) {
|
5285 | subject = subject + '='
|
5286 | }
|
5287 | }
|
5288 |
|
5289 | // Find the length
|
5290 | var length
|
5291 | if (type === 'number')
|
5292 | length = coerce(subject)
|
5293 | else if (type === 'string')
|
5294 | length = Buffer.byteLength(subject, encoding)
|
5295 | else if (type === 'object')
|
5296 | length = coerce(subject.length) // assume that object is array-like
|
5297 | else
|
5298 | throw new Error('First argument needs to be a number, array or string.')
|
5299 |
|
5300 | var buf
|
5301 | if (Buffer._useTypedArrays) {
|
5302 | // Preferred: Return an augmented `Uint8Array` instance for best performance
|
5303 | buf = Buffer._augment(new Uint8Array(length))
|
5304 | } else {
|
5305 | // Fallback: Return THIS instance of Buffer (created by `new`)
|
5306 | buf = this
|
5307 | buf.length = length
|
5308 | buf._isBuffer = true
|
5309 | }
|
5310 |
|
5311 | var i
|
5312 | if (Buffer._useTypedArrays && typeof subject.byteLength === 'number') {
|
5313 | // Speed optimization -- use set if we're copying from a typed array
|
5314 | buf._set(subject)
|
5315 | } else if (isArrayish(subject)) {
|
5316 | // Treat array-ish objects as a byte array
|
5317 | for (i = 0; i < length; i++) {
|
5318 | if (Buffer.isBuffer(subject))
|
5319 | buf[i] = subject.readUInt8(i)
|
5320 | else
|
5321 | buf[i] = subject[i]
|
5322 | }
|
5323 | } else if (type === 'string') {
|
5324 | buf.write(subject, 0, encoding)
|
5325 | } else if (type === 'number' && !Buffer._useTypedArrays && !noZero) {
|
5326 | for (i = 0; i < length; i++) {
|
5327 | buf[i] = 0
|
5328 | }
|
5329 | }
|
5330 |
|
5331 | return buf
|
5332 | }
|
5333 |
|
5334 | // STATIC METHODS
|
5335 | // ==============
|
5336 |
|
5337 | Buffer.isEncoding = function (encoding) {
|
5338 | switch (String(encoding).toLowerCase()) {
|
5339 | case 'hex':
|
5340 | case 'utf8':
|
5341 | case 'utf-8':
|
5342 | case 'ascii':
|
5343 | case 'binary':
|
5344 | case 'base64':
|
5345 | case 'raw':
|
5346 | case 'ucs2':
|
5347 | case 'ucs-2':
|
5348 | case 'utf16le':
|
5349 | case 'utf-16le':
|
5350 | return true
|
5351 | default:
|
5352 | return false
|
5353 | }
|
5354 | }
|
5355 |
|
5356 | Buffer.isBuffer = function (b) {
|
5357 | return !!(b !== null && b !== undefined && b._isBuffer)
|
5358 | }
|
5359 |
|
5360 | Buffer.byteLength = function (str, encoding) {
|
5361 | var ret
|
5362 | str = str + ''
|
5363 | switch (encoding || 'utf8') {
|
5364 | case 'hex':
|
5365 | ret = str.length / 2
|
5366 | break
|
5367 | case 'utf8':
|
5368 | case 'utf-8':
|
5369 | ret = utf8ToBytes(str).length
|
5370 | break
|
5371 | case 'ascii':
|
5372 | case 'binary':
|
5373 | case 'raw':
|
5374 | ret = str.length
|
5375 | break
|
5376 | case 'base64':
|
5377 | ret = base64ToBytes(str).length
|
5378 | break
|
5379 | case 'ucs2':
|
5380 | case 'ucs-2':
|
5381 | case 'utf16le':
|
5382 | case 'utf-16le':
|
5383 | ret = str.length * 2
|
5384 | break
|
5385 | default:
|
5386 | throw new Error('Unknown encoding')
|
5387 | }
|
5388 | return ret
|
5389 | }
|
5390 |
|
5391 | Buffer.concat = function (list, totalLength) {
|
5392 | assert(isArray(list), 'Usage: Buffer.concat(list, [totalLength])\n' +
|
5393 | 'list should be an Array.')
|
5394 |
|
5395 | if (list.length === 0) {
|
5396 | return new Buffer(0)
|
5397 | } else if (list.length === 1) {
|
5398 | return list[0]
|
5399 | }
|
5400 |
|
5401 | var i
|
5402 | if (typeof totalLength !== 'number') {
|
5403 | totalLength = 0
|
5404 | for (i = 0; i < list.length; i++) {
|
5405 | totalLength += list[i].length
|
5406 | }
|
5407 | }
|
5408 |
|
5409 | var buf = new Buffer(totalLength)
|
5410 | var pos = 0
|
5411 | for (i = 0; i < list.length; i++) {
|
5412 | var item = list[i]
|
5413 | item.copy(buf, pos)
|
5414 | pos += item.length
|
5415 | }
|
5416 | return buf
|
5417 | }
|
5418 |
|
5419 | // BUFFER INSTANCE METHODS
|
5420 | // =======================
|
5421 |
|
5422 | function _hexWrite (buf, string, offset, length) {
|
5423 | offset = Number(offset) || 0
|
5424 | var remaining = buf.length - offset
|
5425 | if (!length) {
|
5426 | length = remaining
|
5427 | } else {
|
5428 | length = Number(length)
|
5429 | if (length > remaining) {
|
5430 | length = remaining
|
5431 | }
|
5432 | }
|
5433 |
|
5434 | // must be an even number of digits
|
5435 | var strLen = string.length
|
5436 | assert(strLen % 2 === 0, 'Invalid hex string')
|
5437 |
|
5438 | if (length > strLen / 2) {
|
5439 | length = strLen / 2
|
5440 | }
|
5441 | for (var i = 0; i < length; i++) {
|
5442 | var byte = parseInt(string.substr(i * 2, 2), 16)
|
5443 | assert(!isNaN(byte), 'Invalid hex string')
|
5444 | buf[offset + i] = byte
|
5445 | }
|
5446 | Buffer._charsWritten = i * 2
|
5447 | return i
|
5448 | }
|
5449 |
|
5450 | function _utf8Write (buf, string, offset, length) {
|
5451 | var charsWritten = Buffer._charsWritten =
|
5452 | blitBuffer(utf8ToBytes(string), buf, offset, length)
|
5453 | return charsWritten
|
5454 | }
|
5455 |
|
5456 | function _asciiWrite (buf, string, offset, length) {
|
5457 | var charsWritten = Buffer._charsWritten =
|
5458 | blitBuffer(asciiToBytes(string), buf, offset, length)
|
5459 | return charsWritten
|
5460 | }
|
5461 |
|
5462 | function _binaryWrite (buf, string, offset, length) {
|
5463 | return _asciiWrite(buf, string, offset, length)
|
5464 | }
|
5465 |
|
5466 | function _base64Write (buf, string, offset, length) {
|
5467 | var charsWritten = Buffer._charsWritten =
|
5468 | blitBuffer(base64ToBytes(string), buf, offset, length)
|
5469 | return charsWritten
|
5470 | }
|
5471 |
|
5472 | function _utf16leWrite (buf, string, offset, length) {
|
5473 | var charsWritten = Buffer._charsWritten =
|
5474 | blitBuffer(utf16leToBytes(string), buf, offset, length)
|
5475 | return charsWritten
|
5476 | }
|
5477 |
|
5478 | Buffer.prototype.write = function (string, offset, length, encoding) {
|
5479 | // Support both (string, offset, length, encoding)
|
5480 | // and the legacy (string, encoding, offset, length)
|
5481 | if (isFinite(offset)) {
|
5482 | if (!isFinite(length)) {
|
5483 | encoding = length
|
5484 | length = undefined
|
5485 | }
|
5486 | } else { // legacy
|
5487 | var swap = encoding
|
5488 | encoding = offset
|
5489 | offset = length
|
5490 | length = swap
|
5491 | }
|
5492 |
|
5493 | offset = Number(offset) || 0
|
5494 | var remaining = this.length - offset
|
5495 | if (!length) {
|
5496 | length = remaining
|
5497 | } else {
|
5498 | length = Number(length)
|
5499 | if (length > remaining) {
|
5500 | length = remaining
|
5501 | }
|
5502 | }
|
5503 | encoding = String(encoding || 'utf8').toLowerCase()
|
5504 |
|
5505 | var ret
|
5506 | switch (encoding) {
|
5507 | case 'hex':
|
5508 | ret = _hexWrite(this, string, offset, length)
|
5509 | break
|
5510 | case 'utf8':
|
5511 | case 'utf-8':
|
5512 | ret = _utf8Write(this, string, offset, length)
|
5513 | break
|
5514 | case 'ascii':
|
5515 | ret = _asciiWrite(this, string, offset, length)
|
5516 | break
|
5517 | case 'binary':
|
5518 | ret = _binaryWrite(this, string, offset, length)
|
5519 | break
|
5520 | case 'base64':
|
5521 | ret = _base64Write(this, string, offset, length)
|
5522 | break
|
5523 | case 'ucs2':
|
5524 | case 'ucs-2':
|
5525 | case 'utf16le':
|
5526 | case 'utf-16le':
|
5527 | ret = _utf16leWrite(this, string, offset, length)
|
5528 | break
|
5529 | default:
|
5530 | throw new Error('Unknown encoding')
|
5531 | }
|
5532 | return ret
|
5533 | }
|
5534 |
|
5535 | Buffer.prototype.toString = function (encoding, start, end) {
|
5536 | var self = this
|
5537 |
|
5538 | encoding = String(encoding || 'utf8').toLowerCase()
|
5539 | start = Number(start) || 0
|
5540 | end = (end !== undefined)
|
5541 | ? Number(end)
|
5542 | : end = self.length
|
5543 |
|
5544 | // Fastpath empty strings
|
5545 | if (end === start)
|
5546 | return ''
|
5547 |
|
5548 | var ret
|
5549 | switch (encoding) {
|
5550 | case 'hex':
|
5551 | ret = _hexSlice(self, start, end)
|
5552 | break
|
5553 | case 'utf8':
|
5554 | case 'utf-8':
|
5555 | ret = _utf8Slice(self, start, end)
|
5556 | break
|
5557 | case 'ascii':
|
5558 | ret = _asciiSlice(self, start, end)
|
5559 | break
|
5560 | case 'binary':
|
5561 | ret = _binarySlice(self, start, end)
|
5562 | break
|
5563 | case 'base64':
|
5564 | ret = _base64Slice(self, start, end)
|
5565 | break
|
5566 | case 'ucs2':
|
5567 | case 'ucs-2':
|
5568 | case 'utf16le':
|
5569 | case 'utf-16le':
|
5570 | ret = _utf16leSlice(self, start, end)
|
5571 | break
|
5572 | default:
|
5573 | throw new Error('Unknown encoding')
|
5574 | }
|
5575 | return ret
|
5576 | }
|
5577 |
|
5578 | Buffer.prototype.toJSON = function () {
|
5579 | return {
|
5580 | type: 'Buffer',
|
5581 | data: Array.prototype.slice.call(this._arr || this, 0)
|
5582 | }
|
5583 | }
|
5584 |
|
5585 | // copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)
|
5586 | Buffer.prototype.copy = function (target, target_start, start, end) {
|
5587 | var source = this
|
5588 |
|
5589 | if (!start) start = 0
|
5590 | if (!end && end !== 0) end = this.length
|
5591 | if (!target_start) target_start = 0
|
5592 |
|
5593 | // Copy 0 bytes; we're done
|
5594 | if (end === start) return
|
5595 | if (target.length === 0 || source.length === 0) return
|
5596 |
|
5597 | // Fatal error conditions
|
5598 | assert(end >= start, 'sourceEnd < sourceStart')
|
5599 | assert(target_start >= 0 && target_start < target.length,
|
5600 | 'targetStart out of bounds')
|
5601 | assert(start >= 0 && start < source.length, 'sourceStart out of bounds')
|
5602 | assert(end >= 0 && end <= source.length, 'sourceEnd out of bounds')
|
5603 |
|
5604 | // Are we oob?
|
5605 | if (end > this.length)
|
5606 | end = this.length
|
5607 | if (target.length - target_start < end - start)
|
5608 | end = target.length - target_start + start
|
5609 |
|
5610 | var len = end - start
|
5611 |
|
5612 | if (len < 100 || !Buffer._useTypedArrays) {
|
5613 | for (var i = 0; i < len; i++)
|
5614 | target[i + target_start] = this[i + start]
|
5615 | } else {
|
5616 | target._set(this.subarray(start, start + len), target_start)
|
5617 | }
|
5618 | }
|
5619 |
|
5620 | function _base64Slice (buf, start, end) {
|
5621 | if (start === 0 && end === buf.length) {
|
5622 | return base64.fromByteArray(buf)
|
5623 | } else {
|
5624 | return base64.fromByteArray(buf.slice(start, end))
|
5625 | }
|
5626 | }
|
5627 |
|
5628 | function _utf8Slice (buf, start, end) {
|
5629 | var res = ''
|
5630 | var tmp = ''
|
5631 | end = Math.min(buf.length, end)
|
5632 |
|
5633 | for (var i = start; i < end; i++) {
|
5634 | if (buf[i] <= 0x7F) {
|
5635 | res += decodeUtf8Char(tmp) + String.fromCharCode(buf[i])
|
5636 | tmp = ''
|
5637 | } else {
|
5638 | tmp += '%' + buf[i].toString(16)
|
5639 | }
|
5640 | }
|
5641 |
|
5642 | return res + decodeUtf8Char(tmp)
|
5643 | }
|
5644 |
|
5645 | function _asciiSlice (buf, start, end) {
|
5646 | var ret = ''
|
5647 | end = Math.min(buf.length, end)
|
5648 |
|
5649 | for (var i = start; i < end; i++)
|
5650 | ret += String.fromCharCode(buf[i])
|
5651 | return ret
|
5652 | }
|
5653 |
|
5654 | function _binarySlice (buf, start, end) {
|
5655 | return _asciiSlice(buf, start, end)
|
5656 | }
|
5657 |
|
5658 | function _hexSlice (buf, start, end) {
|
5659 | var len = buf.length
|
5660 |
|
5661 | if (!start || start < 0) start = 0
|
5662 | if (!end || end < 0 || end > len) end = len
|
5663 |
|
5664 | var out = ''
|
5665 | for (var i = start; i < end; i++) {
|
5666 | out += toHex(buf[i])
|
5667 | }
|
5668 | return out
|
5669 | }
|
5670 |
|
5671 | function _utf16leSlice (buf, start, end) {
|
5672 | var bytes = buf.slice(start, end)
|
5673 | var res = ''
|
5674 | for (var i = 0; i < bytes.length; i += 2) {
|
5675 | res += String.fromCharCode(bytes[i] + bytes[i+1] * 256)
|
5676 | }
|
5677 | return res
|
5678 | }
|
5679 |
|
5680 | Buffer.prototype.slice = function (start, end) {
|
5681 | var len = this.length
|
5682 | start = clamp(start, len, 0)
|
5683 | end = clamp(end, len, len)
|
5684 |
|
5685 | if (Buffer._useTypedArrays) {
|
5686 | return Buffer._augment(this.subarray(start, end))
|
5687 | } else {
|
5688 | var sliceLen = end - start
|
5689 | var newBuf = new Buffer(sliceLen, undefined, true)
|
5690 | for (var i = 0; i < sliceLen; i++) {
|
5691 | newBuf[i] = this[i + start]
|
5692 | }
|
5693 | return newBuf
|
5694 | }
|
5695 | }
|
5696 |
|
5697 | // `get` will be removed in Node 0.13+
|
5698 | Buffer.prototype.get = function (offset) {
|
5699 | console.log('.get() is deprecated. Access using array indexes instead.')
|
5700 | return this.readUInt8(offset)
|
5701 | }
|
5702 |
|
5703 | // `set` will be removed in Node 0.13+
|
5704 | Buffer.prototype.set = function (v, offset) {
|
5705 | console.log('.set() is deprecated. Access using array indexes instead.')
|
5706 | return this.writeUInt8(v, offset)
|
5707 | }
|
5708 |
|
5709 | Buffer.prototype.readUInt8 = function (offset, noAssert) {
|
5710 | if (!noAssert) {
|
5711 | assert(offset !== undefined && offset !== null, 'missing offset')
|
5712 | assert(offset < this.length, 'Trying to read beyond buffer length')
|
5713 | }
|
5714 |
|
5715 | if (offset >= this.length)
|
5716 | return
|
5717 |
|
5718 | return this[offset]
|
5719 | }
|
5720 |
|
5721 | function _readUInt16 (buf, offset, littleEndian, noAssert) {
|
5722 | if (!noAssert) {
|
5723 | assert(typeof littleEndian === 'boolean', 'missing or invalid endian')
|
5724 | assert(offset !== undefined && offset !== null, 'missing offset')
|
5725 | assert(offset + 1 < buf.length, 'Trying to read beyond buffer length')
|
5726 | }
|
5727 |
|
5728 | var len = buf.length
|
5729 | if (offset >= len)
|
5730 | return
|
5731 |
|
5732 | var val
|
5733 | if (littleEndian) {
|
5734 | val = buf[offset]
|
5735 | if (offset + 1 < len)
|
5736 | val |= buf[offset + 1] << 8
|
5737 | } else {
|
5738 | val = buf[offset] << 8
|
5739 | if (offset + 1 < len)
|
5740 | val |= buf[offset + 1]
|
5741 | }
|
5742 | return val
|
5743 | }
|
5744 |
|
5745 | Buffer.prototype.readUInt16LE = function (offset, noAssert) {
|
5746 | return _readUInt16(this, offset, true, noAssert)
|
5747 | }
|
5748 |
|
5749 | Buffer.prototype.readUInt16BE = function (offset, noAssert) {
|
5750 | return _readUInt16(this, offset, false, noAssert)
|
5751 | }
|
5752 |
|
5753 | function _readUInt32 (buf, offset, littleEndian, noAssert) {
|
5754 | if (!noAssert) {
|
5755 | assert(typeof littleEndian === 'boolean', 'missing or invalid endian')
|
5756 | assert(offset !== undefined && offset !== null, 'missing offset')
|
5757 | assert(offset + 3 < buf.length, 'Trying to read beyond buffer length')
|
5758 | }
|
5759 |
|
5760 | var len = buf.length
|
5761 | if (offset >= len)
|
5762 | return
|
5763 |
|
5764 | var val
|
5765 | if (littleEndian) {
|
5766 | if (offset + 2 < len)
|
5767 | val = buf[offset + 2] << 16
|
5768 | if (offset + 1 < len)
|
5769 | val |= buf[offset + 1] << 8
|
5770 | val |= buf[offset]
|
5771 | if (offset + 3 < len)
|
5772 |
|
5773 | } else {
|
5774 | if (offset + 1 < len)
|
5775 | val = buf[offset + 1] << 16
|
5776 | if (offset + 2 < len)
|
5777 | val |= buf[offset + 2] << 8
|
5778 | if (offset + 3 < len)
|
5779 | val |= buf[offset + 3]
|
5780 |
|
5781 | }
|
5782 | return val
|
5783 | }
|
5784 |
|
5785 | Buffer.prototype.readUInt32LE = function (offset, noAssert) {
|
5786 | return _readUInt32(this, offset, true, noAssert)
|
5787 | }
|
5788 |
|
5789 | Buffer.prototype.readUInt32BE = function (offset, noAssert) {
|
5790 | return _readUInt32(this, offset, false, noAssert)
|
5791 | }
|
5792 |
|
5793 | Buffer.prototype.readInt8 = function (offset, noAssert) {
|
5794 | if (!noAssert) {
|
5795 | assert(offset !== undefined && offset !== null,
|
5796 | 'missing offset')
|
5797 | assert(offset < this.length, 'Trying to read beyond buffer length')
|
5798 | }
|
5799 |
|
5800 | if (offset >= this.length)
|
5801 | return
|
5802 |
|
5803 | var neg = this[offset] & 0x80
|
5804 | if (neg)
|
5805 | return (0xff - this[offset] + 1) * -1
|
5806 | else
|
5807 | return this[offset]
|
5808 | }
|
5809 |
|
5810 | function _readInt16 (buf, offset, littleEndian, noAssert) {
|
5811 | if (!noAssert) {
|
5812 | assert(typeof littleEndian === 'boolean', 'missing or invalid endian')
|
5813 | assert(offset !== undefined && offset !== null, 'missing offset')
|
5814 | assert(offset + 1 < buf.length, 'Trying to read beyond buffer length')
|
5815 | }
|
5816 |
|
5817 | var len = buf.length
|
5818 | if (offset >= len)
|
5819 | return
|
5820 |
|
5821 | var val = _readUInt16(buf, offset, littleEndian, true)
|
5822 | var neg = val & 0x8000
|
5823 | if (neg)
|
5824 | return (0xffff - val + 1) * -1
|
5825 | else
|
5826 | return val
|
5827 | }
|
5828 |
|
5829 | Buffer.prototype.readInt16LE = function (offset, noAssert) {
|
5830 | return _readInt16(this, offset, true, noAssert)
|
5831 | }
|
5832 |
|
5833 | Buffer.prototype.readInt16BE = function (offset, noAssert) {
|
5834 | return _readInt16(this, offset, false, noAssert)
|
5835 | }
|
5836 |
|
5837 | function _readInt32 (buf, offset, littleEndian, noAssert) {
|
5838 | if (!noAssert) {
|
5839 | assert(typeof littleEndian === 'boolean', 'missing or invalid endian')
|
5840 | assert(offset !== undefined && offset !== null, 'missing offset')
|
5841 | assert(offset + 3 < buf.length, 'Trying to read beyond buffer length')
|
5842 | }
|
5843 |
|
5844 | var len = buf.length
|
5845 | if (offset >= len)
|
5846 | return
|
5847 |
|
5848 | var val = _readUInt32(buf, offset, littleEndian, true)
|
5849 | var neg = val & 0x80000000
|
5850 | if (neg)
|
5851 | return (0xffffffff - val + 1) * -1
|
5852 | else
|
5853 | return val
|
5854 | }
|
5855 |
|
5856 | Buffer.prototype.readInt32LE = function (offset, noAssert) {
|
5857 | return _readInt32(this, offset, true, noAssert)
|
5858 | }
|
5859 |
|
5860 | Buffer.prototype.readInt32BE = function (offset, noAssert) {
|
5861 | return _readInt32(this, offset, false, noAssert)
|
5862 | }
|
5863 |
|
5864 | function _readFloat (buf, offset, littleEndian, noAssert) {
|
5865 | if (!noAssert) {
|
5866 | assert(typeof littleEndian === 'boolean', 'missing or invalid endian')
|
5867 | assert(offset + 3 < buf.length, 'Trying to read beyond buffer length')
|
5868 | }
|
5869 |
|
5870 | return ieee754.read(buf, offset, littleEndian, 23, 4)
|
5871 | }
|
5872 |
|
5873 | Buffer.prototype.readFloatLE = function (offset, noAssert) {
|
5874 | return _readFloat(this, offset, true, noAssert)
|
5875 | }
|
5876 |
|
5877 | Buffer.prototype.readFloatBE = function (offset, noAssert) {
|
5878 | return _readFloat(this, offset, false, noAssert)
|
5879 | }
|
5880 |
|
5881 | function _readDouble (buf, offset, littleEndian, noAssert) {
|
5882 | if (!noAssert) {
|
5883 | assert(typeof littleEndian === 'boolean', 'missing or invalid endian')
|
5884 | assert(offset + 7 < buf.length, 'Trying to read beyond buffer length')
|
5885 | }
|
5886 |
|
5887 | return ieee754.read(buf, offset, littleEndian, 52, 8)
|
5888 | }
|
5889 |
|
5890 | Buffer.prototype.readDoubleLE = function (offset, noAssert) {
|
5891 | return _readDouble(this, offset, true, noAssert)
|
5892 | }
|
5893 |
|
5894 | Buffer.prototype.readDoubleBE = function (offset, noAssert) {
|
5895 | return _readDouble(this, offset, false, noAssert)
|
5896 | }
|
5897 |
|
5898 | Buffer.prototype.writeUInt8 = function (value, offset, noAssert) {
|
5899 | if (!noAssert) {
|
5900 | assert(value !== undefined && value !== null, 'missing value')
|
5901 | assert(offset !== undefined && offset !== null, 'missing offset')
|
5902 | assert(offset < this.length, 'trying to write beyond buffer length')
|
5903 | verifuint(value, 0xff)
|
5904 | }
|
5905 |
|
5906 | if (offset >= this.length) return
|
5907 |
|
5908 | this[offset] = value
|
5909 | }
|
5910 |
|
5911 | function _writeUInt16 (buf, value, offset, littleEndian, noAssert) {
|
5912 | if (!noAssert) {
|
5913 | assert(value !== undefined && value !== null, 'missing value')
|
5914 | assert(typeof littleEndian === 'boolean', 'missing or invalid endian')
|
5915 | assert(offset !== undefined && offset !== null, 'missing offset')
|
5916 | assert(offset + 1 < buf.length, 'trying to write beyond buffer length')
|
5917 | verifuint(value, 0xffff)
|
5918 | }
|
5919 |
|
5920 | var len = buf.length
|
5921 | if (offset >= len)
|
5922 | return
|
5923 |
|
5924 | for (var i = 0, j = Math.min(len - offset, 2); i < j; i++) {
|
5925 | buf[offset + i] =
|
5926 |
|
5927 | (littleEndian ? i : 1 - i) * 8
|
5928 | }
|
5929 | }
|
5930 |
|
5931 | Buffer.prototype.writeUInt16LE = function (value, offset, noAssert) {
|
5932 | _writeUInt16(this, value, offset, true, noAssert)
|
5933 | }
|
5934 |
|
5935 | Buffer.prototype.writeUInt16BE = function (value, offset, noAssert) {
|
5936 | _writeUInt16(this, value, offset, false, noAssert)
|
5937 | }
|
5938 |
|
5939 | function _writeUInt32 (buf, value, offset, littleEndian, noAssert) {
|
5940 | if (!noAssert) {
|
5941 | assert(value !== undefined && value !== null, 'missing value')
|
5942 | assert(typeof littleEndian === 'boolean', 'missing or invalid endian')
|
5943 | assert(offset !== undefined && offset !== null, 'missing offset')
|
5944 | assert(offset + 3 < buf.length, 'trying to write beyond buffer length')
|
5945 | verifuint(value, 0xffffffff)
|
5946 | }
|
5947 |
|
5948 | var len = buf.length
|
5949 | if (offset >= len)
|
5950 | return
|
5951 |
|
5952 | for (var i = 0, j = Math.min(len - offset, 4); i < j; i++) {
|
5953 | buf[offset + i] =
|
5954 | (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff
|
5955 | }
|
5956 | }
|
5957 |
|
5958 | Buffer.prototype.writeUInt32LE = function (value, offset, noAssert) {
|
5959 | _writeUInt32(this, value, offset, true, noAssert)
|
5960 | }
|
5961 |
|
5962 | Buffer.prototype.writeUInt32BE = function (value, offset, noAssert) {
|
5963 | _writeUInt32(this, value, offset, false, noAssert)
|
5964 | }
|
5965 |
|
5966 | Buffer.prototype.writeInt8 = function (value, offset, noAssert) {
|
5967 | if (!noAssert) {
|
5968 | assert(value !== undefined && value !== null, 'missing value')
|
5969 | assert(offset !== undefined && offset !== null, 'missing offset')
|
5970 | assert(offset < this.length, 'Trying to write beyond buffer length')
|
5971 | verifsint(value, 0x7f, -0x80)
|
5972 | }
|
5973 |
|
5974 | if (offset >= this.length)
|
5975 | return
|
5976 |
|
5977 | if (value >= 0)
|
5978 | this.writeUInt8(value, offset, noAssert)
|
5979 | else
|
5980 | this.writeUInt8(0xff + value + 1, offset, noAssert)
|
5981 | }
|
5982 |
|
5983 | function _writeInt16 (buf, value, offset, littleEndian, noAssert) {
|
5984 | if (!noAssert) {
|
5985 | assert(value !== undefined && value !== null, 'missing value')
|
5986 | assert(typeof littleEndian === 'boolean', 'missing or invalid endian')
|
5987 | assert(offset !== undefined && offset !== null, 'missing offset')
|
5988 | assert(offset + 1 < buf.length, 'Trying to write beyond buffer length')
|
5989 | verifsint(value, 0x7fff, -0x8000)
|
5990 | }
|
5991 |
|
5992 | var len = buf.length
|
5993 | if (offset >= len)
|
5994 | return
|
5995 |
|
5996 | if (value >= 0)
|
5997 | _writeUInt16(buf, value, offset, littleEndian, noAssert)
|
5998 | else
|
5999 | _writeUInt16(buf, 0xffff + value + 1, offset, littleEndian, noAssert)
|
6000 | }
|
6001 |
|
6002 | Buffer.prototype.writeInt16LE = function (value, offset, noAssert) {
|
6003 | _writeInt16(this, value, offset, true, noAssert)
|
6004 | }
|
6005 |
|
6006 | Buffer.prototype.writeInt16BE = function (value, offset, noAssert) {
|
6007 | _writeInt16(this, value, offset, false, noAssert)
|
6008 | }
|
6009 |
|
6010 | function _writeInt32 (buf, value, offset, littleEndian, noAssert) {
|
6011 | if (!noAssert) {
|
6012 | assert(value !== undefined && value !== null, 'missing value')
|
6013 | assert(typeof littleEndian === 'boolean', 'missing or invalid endian')
|
6014 | assert(offset !== undefined && offset !== null, 'missing offset')
|
6015 | assert(offset + 3 < buf.length, 'Trying to write beyond buffer length')
|
6016 | verifsint(value, 0x7fffffff, -0x80000000)
|
6017 | }
|
6018 |
|
6019 | var len = buf.length
|
6020 | if (offset >= len)
|
6021 | return
|
6022 |
|
6023 | if (value >= 0)
|
6024 | _writeUInt32(buf, value, offset, littleEndian, noAssert)
|
6025 | else
|
6026 | _writeUInt32(buf, 0xffffffff + value + 1, offset, littleEndian, noAssert)
|
6027 | }
|
6028 |
|
6029 | Buffer.prototype.writeInt32LE = function (value, offset, noAssert) {
|
6030 | _writeInt32(this, value, offset, true, noAssert)
|
6031 | }
|
6032 |
|
6033 | Buffer.prototype.writeInt32BE = function (value, offset, noAssert) {
|
6034 | _writeInt32(this, value, offset, false, noAssert)
|
6035 | }
|
6036 |
|
6037 | function _writeFloat (buf, value, offset, littleEndian, noAssert) {
|
6038 | if (!noAssert) {
|
6039 | assert(value !== undefined && value !== null, 'missing value')
|
6040 | assert(typeof littleEndian === 'boolean', 'missing or invalid endian')
|
6041 | assert(offset !== undefined && offset !== null, 'missing offset')
|
6042 | assert(offset + 3 < buf.length, 'Trying to write beyond buffer length')
|
6043 | verifIEEE754(value, 3.4028234663852886e+38, -3.4028234663852886e+38)
|
6044 | }
|
6045 |
|
6046 | var len = buf.length
|
6047 | if (offset >= len)
|
6048 | return
|
6049 |
|
6050 | ieee754.write(buf, value, offset, littleEndian, 23, 4)
|
6051 | }
|
6052 |
|
6053 | Buffer.prototype.writeFloatLE = function (value, offset, noAssert) {
|
6054 | _writeFloat(this, value, offset, true, noAssert)
|
6055 | }
|
6056 |
|
6057 | Buffer.prototype.writeFloatBE = function (value, offset, noAssert) {
|
6058 | _writeFloat(this, value, offset, false, noAssert)
|
6059 | }
|
6060 |
|
6061 | function _writeDouble (buf, value, offset, littleEndian, noAssert) {
|
6062 | if (!noAssert) {
|
6063 | assert(value !== undefined && value !== null, 'missing value')
|
6064 | assert(typeof littleEndian === 'boolean', 'missing or invalid endian')
|
6065 | assert(offset !== undefined && offset !== null, 'missing offset')
|
6066 | assert(offset + 7 < buf.length,
|
6067 | 'Trying to write beyond buffer length')
|
6068 | verifIEEE754(value, 1.7976931348623157E+308, -1.7976931348623157E+308)
|
6069 | }
|
6070 |
|
6071 | var len = buf.length
|
6072 | if (offset >= len)
|
6073 | return
|
6074 |
|
6075 | ieee754.write(buf, value, offset, littleEndian, 52, 8)
|
6076 | }
|
6077 |
|
6078 | Buffer.prototype.writeDoubleLE = function (value, offset, noAssert) {
|
6079 | _writeDouble(this, value, offset, true, noAssert)
|
6080 | }
|
6081 |
|
6082 | Buffer.prototype.writeDoubleBE = function (value, offset, noAssert) {
|
6083 | _writeDouble(this, value, offset, false, noAssert)
|
6084 | }
|
6085 |
|
6086 | // fill(value, start=0, end=buffer.length)
|
6087 | Buffer.prototype.fill = function (value, start, end) {
|
6088 | if (!value) value = 0
|
6089 | if (!start) start = 0
|
6090 | if (!end) end = this.length
|
6091 |
|
6092 | if (typeof value === 'string') {
|
6093 | value = value.charCodeAt(0)
|
6094 | }
|
6095 |
|
6096 | assert(typeof value === 'number' && !isNaN(value), 'value is not a number')
|
6097 | assert(end >= start, 'end < start')
|
6098 |
|
6099 | // Fill 0 bytes; we're done
|
6100 | if (end === start) return
|
6101 | if (this.length === 0) return
|
6102 |
|
6103 | assert(start >= 0 && start < this.length, 'start out of bounds')
|
6104 | assert(end >= 0 && end <= this.length, 'end out of bounds')
|
6105 |
|
6106 | for (var i = start; i < end; i++) {
|
6107 | this[i] = value
|
6108 | }
|
6109 | }
|
6110 |
|
6111 | Buffer.prototype.inspect = function () {
|
6112 | var out = []
|
6113 | var len = this.length
|
6114 | for (var i = 0; i < len; i++) {
|
6115 | out[i] = toHex(this[i])
|
6116 | if (i === exports.INSPECT_MAX_BYTES) {
|
6117 | out[i + 1] = '...'
|
6118 | break
|
6119 | }
|
6120 | }
|
6121 | return '<Buffer ' + out.join(' ') + '>'
|
6122 | }
|
6123 |
|
6124 | /**
|
6125 | * Creates a new `ArrayBuffer` with the *copied* memory of the buffer instance.
|
6126 | * Added in Node 0.12. Only available in browsers that support ArrayBuffer.
|
6127 | */
|
6128 | Buffer.prototype.toArrayBuffer = function () {
|
6129 | if (typeof Uint8Array !== 'undefined') {
|
6130 | if (Buffer._useTypedArrays) {
|
6131 | return (new Buffer(this)).buffer
|
6132 | } else {
|
6133 | var buf = new Uint8Array(this.length)
|
6134 | for (var i = 0, len = buf.length; i < len; i += 1)
|
6135 | buf[i] = this[i]
|
6136 | return buf.buffer
|
6137 | }
|
6138 | } else {
|
6139 | throw new Error('Buffer.toArrayBuffer not supported in this browser')
|
6140 | }
|
6141 | }
|
6142 |
|
6143 | // HELPER FUNCTIONS
|
6144 | // ================
|
6145 |
|
6146 | function stringtrim (str) {
|
6147 | if (str.trim) return str.trim()
|
6148 | return str.replace(/^\s+|\s+$/g, '')
|
6149 | }
|
6150 |
|
6151 | var BP = Buffer.prototype
|
6152 |
|
6153 | /**
|
6154 | * Augment a Uint8Array *instance* (not the Uint8Array class!) with Buffer methods
|
6155 | */
|
6156 | Buffer._augment = function (arr) {
|
6157 | arr._isBuffer = true
|
6158 |
|
6159 | // save reference to original Uint8Array get/set methods before overwriting
|
6160 | arr._get = arr.get
|
6161 | arr._set = arr.set
|
6162 |
|
6163 | // deprecated, will be removed in node 0.13+
|
6164 | arr.get = BP.get
|
6165 | arr.set = BP.set
|
6166 |
|
6167 | arr.write = BP.write
|
6168 | arr.toString = BP.toString
|
6169 | arr.toLocaleString = BP.toString
|
6170 | arr.toJSON = BP.toJSON
|
6171 | arr.copy = BP.copy
|
6172 | arr.slice = BP.slice
|
6173 | arr.readUInt8 = BP.readUInt8
|
6174 | arr.readUInt16LE = BP.readUInt16LE
|
6175 | arr.readUInt16BE = BP.readUInt16BE
|
6176 | arr.readUInt32LE = BP.readUInt32LE
|
6177 | arr.readUInt32BE = BP.readUInt32BE
|
6178 | arr.readInt8 = BP.readInt8
|
6179 | arr.readInt16LE = BP.readInt16LE
|
6180 | arr.readInt16BE = BP.readInt16BE
|
6181 | arr.readInt32LE = BP.readInt32LE
|
6182 | arr.readInt32BE = BP.readInt32BE
|
6183 | arr.readFloatLE = BP.readFloatLE
|
6184 | arr.readFloatBE = BP.readFloatBE
|
6185 | arr.readDoubleLE = BP.readDoubleLE
|
6186 | arr.readDoubleBE = BP.readDoubleBE
|
6187 | arr.writeUInt8 = BP.writeUInt8
|
6188 | arr.writeUInt16LE = BP.writeUInt16LE
|
6189 | arr.writeUInt16BE = BP.writeUInt16BE
|
6190 | arr.writeUInt32LE = BP.writeUInt32LE
|
6191 | arr.writeUInt32BE = BP.writeUInt32BE
|
6192 | arr.writeInt8 = BP.writeInt8
|
6193 | arr.writeInt16LE = BP.writeInt16LE
|
6194 | arr.writeInt16BE = BP.writeInt16BE
|
6195 | arr.writeInt32LE = BP.writeInt32LE
|
6196 | arr.writeInt32BE = BP.writeInt32BE
|
6197 | arr.writeFloatLE = BP.writeFloatLE
|
6198 | arr.writeFloatBE = BP.writeFloatBE
|
6199 | arr.writeDoubleLE = BP.writeDoubleLE
|
6200 | arr.writeDoubleBE = BP.writeDoubleBE
|
6201 | arr.fill = BP.fill
|
6202 | arr.inspect = BP.inspect
|
6203 | arr.toArrayBuffer = BP.toArrayBuffer
|
6204 |
|
6205 | return arr
|
6206 | }
|
6207 |
|
6208 | // slice(start, end)
|
6209 | function clamp (index, len, defaultValue) {
|
6210 | if (typeof index !== 'number') return defaultValue
|
6211 | index = ~~index; // Coerce to integer.
|
6212 | if (index >= len) return len
|
6213 | if (index >= 0) return index
|
6214 | index += len
|
6215 | if (index >= 0) return index
|
6216 | return 0
|
6217 | }
|
6218 |
|
6219 | function coerce (length) {
|
6220 | // Coerce length to a number (possibly NaN), round up
|
6221 | // in case it's fractional (e.g. 123.456) then do a
|
6222 | // double negate to coerce a NaN to 0. Easy, right?
|
6223 | length = ~~Math.ceil(+length)
|
6224 | return length < 0 ? 0 : length
|
6225 | }
|
6226 |
|
6227 | function isArray (subject) {
|
6228 | return (Array.isArray || function (subject) {
|
6229 | return Object.prototype.toString.call(subject) === '[object Array]'
|
6230 | })(subject)
|
6231 | }
|
6232 |
|
6233 | function isArrayish (subject) {
|
6234 | return isArray(subject) || Buffer.isBuffer(subject) ||
|
6235 | subject && typeof subject === 'object' &&
|
6236 | typeof subject.length === 'number'
|
6237 | }
|
6238 |
|
6239 | function toHex (n) {
|
6240 | if (n < 16) return '0' + n.toString(16)
|
6241 | return n.toString(16)
|
6242 | }
|
6243 |
|
6244 | function utf8ToBytes (str) {
|
6245 | var byteArray = []
|
6246 | for (var i = 0; i < str.length; i++) {
|
6247 | var b = str.charCodeAt(i)
|
6248 | if (b <= 0x7F)
|
6249 | byteArray.push(str.charCodeAt(i))
|
6250 | else {
|
6251 | var start = i
|
6252 | if (b >= 0xD800 && b <= 0xDFFF) i++
|
6253 | var h = encodeURIComponent(str.slice(start, i+1)).substr(1).split('%')
|
6254 | for (var j = 0; j < h.length; j++)
|
6255 | byteArray.push(parseInt(h[j], 16))
|
6256 | }
|
6257 | }
|
6258 | return byteArray
|
6259 | }
|
6260 |
|
6261 | function asciiToBytes (str) {
|
6262 | var byteArray = []
|
6263 | for (var i = 0; i < str.length; i++) {
|
6264 | // Node's code seems to be doing this and not & 0x7F..
|
6265 | byteArray.push(str.charCodeAt(i) & 0xFF)
|
6266 | }
|
6267 | return byteArray
|
6268 | }
|
6269 |
|
6270 | function utf16leToBytes (str) {
|
6271 | var c, hi, lo
|
6272 | var byteArray = []
|
6273 | for (var i = 0; i < str.length; i++) {
|
6274 | c = str.charCodeAt(i)
|
6275 | hi = c >> 8
|
6276 | lo = c % 256
|
6277 | byteArray.push(lo)
|
6278 | byteArray.push(hi)
|
6279 | }
|
6280 |
|
6281 | return byteArray
|
6282 | }
|
6283 |
|
6284 | function base64ToBytes (str) {
|
6285 | return base64.toByteArray(str)
|
6286 | }
|
6287 |
|
6288 | function blitBuffer (src, dst, offset, length) {
|
6289 | var pos
|
6290 | for (var i = 0; i < length; i++) {
|
6291 | if ((i + offset >= dst.length) || (i >= src.length))
|
6292 | break
|
6293 | dst[i + offset] = src[i]
|
6294 | }
|
6295 | return i
|
6296 | }
|
6297 |
|
6298 | function decodeUtf8Char (str) {
|
6299 | try {
|
6300 | return decodeURIComponent(str)
|
6301 | } catch (err) {
|
6302 | return String.fromCharCode(0xFFFD) // UTF 8 invalid char
|
6303 | }
|
6304 | }
|
6305 |
|
6306 | /*
|
6307 | * We have to make sure that the value is a valid integer. This means that it
|
6308 | * is non-negative. It has no fractional component and that it does not
|
6309 | * exceed the maximum allowed value.
|
6310 | */
|
6311 | function verifuint (value, max) {
|
6312 | assert(typeof value === 'number', 'cannot write a non-number as a number')
|
6313 | assert(value >= 0, 'specified a negative value for writing an unsigned value')
|
6314 | assert(value <= max, 'value is larger than maximum value for type')
|
6315 | assert(Math.floor(value) === value, 'value has a fractional component')
|
6316 | }
|
6317 |
|
6318 | function verifsint (value, max, min) {
|
6319 | assert(typeof value === 'number', 'cannot write a non-number as a number')
|
6320 | assert(value <= max, 'value larger than maximum allowed value')
|
6321 | assert(value >= min, 'value smaller than minimum allowed value')
|
6322 | assert(Math.floor(value) === value, 'value has a fractional component')
|
6323 | }
|
6324 |
|
6325 | function verifIEEE754 (value, max, min) {
|
6326 | assert(typeof value === 'number', 'cannot write a non-number as a number')
|
6327 | assert(value <= max, 'value larger than maximum allowed value')
|
6328 | assert(value >= min, 'value smaller than minimum allowed value')
|
6329 | }
|
6330 |
|
6331 | function assert (test, message) {
|
6332 | if (!test) throw new Error(message || 'Failed assertion')
|
6333 | }
|
6334 |
|
6335 | },{"base64-js":84,"ieee754":88}],87:[function(require,module,exports){
|
6336 | // Copyright Joyent, Inc. and other Node contributors.
|
6337 | //
|
6338 | // Permission is hereby granted, free of charge, to any person obtaining a
|
6339 | // copy of this software and associated documentation files (the
|
6340 | // "Software"), to deal in the Software without restriction, including
|
6341 | // without limitation the rights to use, copy, modify, merge, publish,
|
6342 | // distribute, sublicense, and/or sell copies of the Software, and to permit
|
6343 | // persons to whom the Software is furnished to do so, subject to the
|
6344 | // following conditions:
|
6345 | //
|
6346 | // The above copyright notice and this permission notice shall be included
|
6347 | // in all copies or substantial portions of the Software.
|
6348 | //
|
6349 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
6350 | // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
6351 | // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
|
6352 | // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
6353 | // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
6354 | // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
6355 | // USE OR OTHER DEALINGS IN THE SOFTWARE.
|
6356 |
|
6357 | function EventEmitter() {
|
6358 | this._events = this._events || {};
|
6359 | this._maxListeners = this._maxListeners || undefined;
|
6360 | }
|
6361 | module.exports = EventEmitter;
|
6362 |
|
6363 | // Backwards-compat with node 0.10.x
|
6364 | EventEmitter.EventEmitter = EventEmitter;
|
6365 |
|
6366 | EventEmitter.prototype._events = undefined;
|
6367 | EventEmitter.prototype._maxListeners = undefined;
|
6368 |
|
6369 | // By default EventEmitters will print a warning if more than 10 listeners are
|
6370 | // added to it. This is a useful default which helps finding memory leaks.
|
6371 | EventEmitter.defaultMaxListeners = 10;
|
6372 |
|
6373 | // Obviously not all Emitters should be limited to 10. This function allows
|
6374 | // that to be increased. Set to zero for unlimited.
|
6375 | EventEmitter.prototype.setMaxListeners = function(n) {
|
6376 | if (!isNumber(n) || n < 0 || isNaN(n))
|
6377 | throw TypeError('n must be a positive number');
|
6378 | this._maxListeners = n;
|
6379 | return this;
|
6380 | };
|
6381 |
|
6382 | EventEmitter.prototype.emit = function(type) {
|
6383 | var er, handler, len, args, i, listeners;
|
6384 |
|
6385 | if (!this._events)
|
6386 | this._events = {};
|
6387 |
|
6388 | // If there is no 'error' event listener then throw.
|
6389 | if (type === 'error') {
|
6390 | if (!this._events.error ||
|
6391 | (isObject(this._events.error) && !this._events.error.length)) {
|
6392 | er = arguments[1];
|
6393 | if (er instanceof Error) {
|
6394 | throw er; // Unhandled 'error' event
|
6395 | }
|
6396 | throw TypeError('Uncaught, unspecified "error" event.');
|
6397 | }
|
6398 | }
|
6399 |
|
6400 | handler = this._events[type];
|
6401 |
|
6402 | if (isUndefined(handler))
|
6403 | return false;
|
6404 |
|
6405 | if (isFunction(handler)) {
|
6406 | switch (arguments.length) {
|
6407 | // fast cases
|
6408 | case 1:
|
6409 | handler.call(this);
|
6410 | break;
|
6411 | case 2:
|
6412 | handler.call(this, arguments[1]);
|
6413 | break;
|
6414 | case 3:
|
6415 | handler.call(this, arguments[1], arguments[2]);
|
6416 | break;
|
6417 | // slower
|
6418 | default:
|
6419 | len = arguments.length;
|
6420 | args = new Array(len - 1);
|
6421 | for (i = 1; i < len; i++)
|
6422 | args[i - 1] = arguments[i];
|
6423 | handler.apply(this, args);
|
6424 | }
|
6425 | } else if (isObject(handler)) {
|
6426 | len = arguments.length;
|
6427 | args = new Array(len - 1);
|
6428 | for (i = 1; i < len; i++)
|
6429 | args[i - 1] = arguments[i];
|
6430 |
|
6431 | listeners = handler.slice();
|
6432 | len = listeners.length;
|
6433 | for (i = 0; i < len; i++)
|
6434 | listeners[i].apply(this, args);
|
6435 | }
|
6436 |
|
6437 | return true;
|
6438 | };
|
6439 |
|
6440 | EventEmitter.prototype.addListener = function(type, listener) {
|
6441 | var m;
|
6442 |
|
6443 | if (!isFunction(listener))
|
6444 | throw TypeError('listener must be a function');
|
6445 |
|
6446 | if (!this._events)
|
6447 | this._events = {};
|
6448 |
|
6449 | // To avoid recursion in the case that type === "newListener"! Before
|
6450 | // adding it to the listeners, first emit "newListener".
|
6451 | if (this._events.newListener)
|
6452 | this.emit('newListener', type,
|
6453 | isFunction(listener.listener) ?
|
6454 | listener.listener : listener);
|
6455 |
|
6456 | if (!this._events[type])
|
6457 | // Optimize the case of one listener. Don't need the extra array object.
|
6458 | this._events[type] = listener;
|
6459 | else if (isObject(this._events[type]))
|
6460 | // If we've already got an array, just append.
|
6461 | this._events[type].push(listener);
|
6462 | else
|
6463 | // Adding the second element, need to change to array.
|
6464 | this._events[type] = [this._events[type], listener];
|
6465 |
|
6466 | // Check for listener leak
|
6467 | if (isObject(this._events[type]) && !this._events[type].warned) {
|
6468 | var m;
|
6469 | if (!isUndefined(this._maxListeners)) {
|
6470 | m = this._maxListeners;
|
6471 | } else {
|
6472 | m = EventEmitter.defaultMaxListeners;
|
6473 | }
|
6474 |
|
6475 | if (m && m > 0 && this._events[type].length > m) {
|
6476 | this._events[type].warned = true;
|
6477 | console.error('(node) warning: possible EventEmitter memory ' +
|
6478 | 'leak detected. %d listeners added. ' +
|
6479 | 'Use emitter.setMaxListeners() to increase limit.',
|
6480 | this._events[type].length);
|
6481 | if (typeof console.trace === 'function') {
|
6482 | // not supported in IE 10
|
6483 | console.trace();
|
6484 | }
|
6485 | }
|
6486 | }
|
6487 |
|
6488 | return this;
|
6489 | };
|
6490 |
|
6491 | EventEmitter.prototype.on = EventEmitter.prototype.addListener;
|
6492 |
|
6493 | EventEmitter.prototype.once = function(type, listener) {
|
6494 | if (!isFunction(listener))
|
6495 | throw TypeError('listener must be a function');
|
6496 |
|
6497 | var fired = false;
|
6498 |
|
6499 | function g() {
|
6500 | this.removeListener(type, g);
|
6501 |
|
6502 | if (!fired) {
|
6503 | fired = true;
|
6504 | listener.apply(this, arguments);
|
6505 | }
|
6506 | }
|
6507 |
|
6508 | g.listener = listener;
|
6509 | this.on(type, g);
|
6510 |
|
6511 | return this;
|
6512 | };
|
6513 |
|
6514 | // emits a 'removeListener' event iff the listener was removed
|
6515 | EventEmitter.prototype.removeListener = function(type, listener) {
|
6516 | var list, position, length, i;
|
6517 |
|
6518 | if (!isFunction(listener))
|
6519 | throw TypeError('listener must be a function');
|
6520 |
|
6521 | if (!this._events || !this._events[type])
|
6522 | return this;
|
6523 |
|
6524 | list = this._events[type];
|
6525 | length = list.length;
|
6526 | position = -1;
|
6527 |
|
6528 | if (list === listener ||
|
6529 | (isFunction(list.listener) && list.listener === listener)) {
|
6530 | delete this._events[type];
|
6531 | if (this._events.removeListener)
|
6532 | this.emit('removeListener', type, listener);
|
6533 |
|
6534 | } else if (isObject(list)) {
|
6535 | for (i = length; i-- > 0;) {
|
6536 | if (list[i] === listener ||
|
6537 | (list[i].listener && list[i].listener === listener)) {
|
6538 | position = i;
|
6539 | break;
|
6540 | }
|
6541 | }
|
6542 |
|
6543 | if (position < 0)
|
6544 | return this;
|
6545 |
|
6546 | if (list.length === 1) {
|
6547 | list.length = 0;
|
6548 | delete this._events[type];
|
6549 | } else {
|
6550 | list.splice(position, 1);
|
6551 | }
|
6552 |
|
6553 | if (this._events.removeListener)
|
6554 | this.emit('removeListener', type, listener);
|
6555 | }
|
6556 |
|
6557 | return this;
|
6558 | };
|
6559 |
|
6560 | EventEmitter.prototype.removeAllListeners = function(type) {
|
6561 | var key, listeners;
|
6562 |
|
6563 | if (!this._events)
|
6564 | return this;
|
6565 |
|
6566 | // not listening for removeListener, no need to emit
|
6567 | if (!this._events.removeListener) {
|
6568 | if (arguments.length === 0)
|
6569 | this._events = {};
|
6570 | else if (this._events[type])
|
6571 | delete this._events[type];
|
6572 | return this;
|
6573 | }
|
6574 |
|
6575 | // emit removeListener for all listeners on all events
|
6576 | if (arguments.length === 0) {
|
6577 | for (key in this._events) {
|
6578 | if (key === 'removeListener') continue;
|
6579 | this.removeAllListeners(key);
|
6580 | }
|
6581 | this.removeAllListeners('removeListener');
|
6582 | this._events = {};
|
6583 | return this;
|
6584 | }
|
6585 |
|
6586 | listeners = this._events[type];
|
6587 |
|
6588 | if (isFunction(listeners)) {
|
6589 | this.removeListener(type, listeners);
|
6590 | } else {
|
6591 | // LIFO order
|
6592 | while (listeners.length)
|
6593 | this.removeListener(type, listeners[listeners.length - 1]);
|
6594 | }
|
6595 | delete this._events[type];
|
6596 |
|
6597 | return this;
|
6598 | };
|
6599 |
|
6600 | EventEmitter.prototype.listeners = function(type) {
|
6601 | var ret;
|
6602 | if (!this._events || !this._events[type])
|
6603 | ret = [];
|
6604 | else if (isFunction(this._events[type]))
|
6605 | ret = [this._events[type]];
|
6606 | else
|
6607 | ret = this._events[type].slice();
|
6608 | return ret;
|
6609 | };
|
6610 |
|
6611 | EventEmitter.listenerCount = function(emitter, type) {
|
6612 | var ret;
|
6613 | if (!emitter._events || !emitter._events[type])
|
6614 | ret = 0;
|
6615 | else if (isFunction(emitter._events[type]))
|
6616 | ret = 1;
|
6617 | else
|
6618 | ret = emitter._events[type].length;
|
6619 | return ret;
|
6620 | };
|
6621 |
|
6622 | function isFunction(arg) {
|
6623 | return typeof arg === 'function';
|
6624 | }
|
6625 |
|
6626 | function isNumber(arg) {
|
6627 | return typeof arg === 'number';
|
6628 | }
|
6629 |
|
6630 | function isObject(arg) {
|
6631 | return typeof arg === 'object' && arg !== null;
|
6632 | }
|
6633 |
|
6634 | function isUndefined(arg) {
|
6635 | return arg === void 0;
|
6636 | }
|
6637 |
|
6638 | },{}],88:[function(require,module,exports){
|
6639 | exports.read = function (buffer, offset, isLE, mLen, nBytes) {
|
6640 | var e, m
|
6641 | var eLen = (nBytes * 8) - mLen - 1
|
6642 | var eMax = (1 << eLen) - 1
|
6643 | var eBias = eMax >> 1
|
6644 | var nBits = -7
|
6645 | var i = isLE ? (nBytes - 1) : 0
|
6646 | var d = isLE ? -1 : 1
|
6647 | var s = buffer[offset + i]
|
6648 |
|
6649 | i += d
|
6650 |
|
6651 | e = s & ((1 << (-nBits)) - 1)
|
6652 | s >>= (-nBits)
|
6653 | nBits += eLen
|
6654 | for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}
|
6655 |
|
6656 | m = e & ((1 << (-nBits)) - 1)
|
6657 | e >>= (-nBits)
|
6658 | nBits += mLen
|
6659 | for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}
|
6660 |
|
6661 | if (e === 0) {
|
6662 | e = 1 - eBias
|
6663 | } else if (e === eMax) {
|
6664 | return m ? NaN : ((s ? -1 : 1) * Infinity)
|
6665 | } else {
|
6666 | m = m + Math.pow(2, mLen)
|
6667 | e = e - eBias
|
6668 | }
|
6669 | return (s ? -1 : 1) * m * Math.pow(2, e - mLen)
|
6670 | }
|
6671 |
|
6672 | exports.write = function (buffer, value, offset, isLE, mLen, nBytes) {
|
6673 | var e, m, c
|
6674 | var eLen = (nBytes * 8) - mLen - 1
|
6675 | var eMax = (1 << eLen) - 1
|
6676 | var eBias = eMax >> 1
|
6677 | var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)
|
6678 | var i = isLE ? 0 : (nBytes - 1)
|
6679 | var d = isLE ? 1 : -1
|
6680 | var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0
|
6681 |
|
6682 | value = Math.abs(value)
|
6683 |
|
6684 | if (isNaN(value) || value === Infinity) {
|
6685 | m = isNaN(value) ? 1 : 0
|
6686 | e = eMax
|
6687 | } else {
|
6688 | e = Math.floor(Math.log(value) / Math.LN2)
|
6689 | if (value * (c = Math.pow(2, -e)) < 1) {
|
6690 | e--
|
6691 | c *= 2
|
6692 | }
|
6693 | if (e + eBias >= 1) {
|
6694 | value += rt / c
|
6695 | } else {
|
6696 | value += rt * Math.pow(2, 1 - eBias)
|
6697 | }
|
6698 | if (value * c >= 2) {
|
6699 | e++
|
6700 | c /= 2
|
6701 | }
|
6702 |
|
6703 | if (e + eBias >= eMax) {
|
6704 | m = 0
|
6705 | e = eMax
|
6706 | } else if (e + eBias >= 1) {
|
6707 | m = ((value * c) - 1) * Math.pow(2, mLen)
|
6708 | e = e + eBias
|
6709 | } else {
|
6710 | m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)
|
6711 | e = 0
|
6712 | }
|
6713 | }
|
6714 |
|
6715 | for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}
|
6716 |
|
6717 | e = (e << mLen) | m
|
6718 | eLen += mLen
|
6719 | for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}
|
6720 |
|
6721 | buffer[offset + i - d] |= s * 128
|
6722 | }
|
6723 |
|
6724 | },{}],89:[function(require,module,exports){
|
6725 | module.exports=require(40)
|
6726 | },{}],90:[function(require,module,exports){
|
6727 | (function (process){
|
6728 | // .dirname, .basename, and .extname methods are extracted from Node.js v8.11.1,
|
6729 | // backported and transplited with Babel, with backwards-compat fixes
|
6730 |
|
6731 | // Copyright Joyent, Inc. and other Node contributors.
|
6732 | //
|
6733 | // Permission is hereby granted, free of charge, to any person obtaining a
|
6734 | // copy of this software and associated documentation files (the
|
6735 | // "Software"), to deal in the Software without restriction, including
|
6736 | // without limitation the rights to use, copy, modify, merge, publish,
|
6737 | // distribute, sublicense, and/or sell copies of the Software, and to permit
|
6738 | // persons to whom the Software is furnished to do so, subject to the
|
6739 | // following conditions:
|
6740 | //
|
6741 | // The above copyright notice and this permission notice shall be included
|
6742 | // in all copies or substantial portions of the Software.
|
6743 | //
|
6744 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
6745 | // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
6746 | // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
|
6747 | // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
6748 | // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
6749 | // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
6750 | // USE OR OTHER DEALINGS IN THE SOFTWARE.
|
6751 |
|
6752 | // resolves . and .. elements in a path array with directory names there
|
6753 | // must be no slashes, empty elements, or device names (c:\) in the array
|
6754 | // (so also no leading and trailing slashes - it does not distinguish
|
6755 | // relative and absolute paths)
|
6756 | function normalizeArray(parts, allowAboveRoot) {
|
6757 | // if the path tries to go above the root, `up` ends up > 0
|
6758 | var up = 0;
|
6759 | for (var i = parts.length - 1; i >= 0; i--) {
|
6760 | var last = parts[i];
|
6761 | if (last === '.') {
|
6762 | parts.splice(i, 1);
|
6763 | } else if (last === '..') {
|
6764 | parts.splice(i, 1);
|
6765 | up++;
|
6766 | } else if (up) {
|
6767 | parts.splice(i, 1);
|
6768 | up--;
|
6769 | }
|
6770 | }
|
6771 |
|
6772 | // if the path is allowed to go above the root, restore leading ..s
|
6773 | if (allowAboveRoot) {
|
6774 | for (; up--; up) {
|
6775 | parts.unshift('..');
|
6776 | }
|
6777 | }
|
6778 |
|
6779 | return parts;
|
6780 | }
|
6781 |
|
6782 | // path.resolve([from ...], to)
|
6783 | // posix version
|
6784 | exports.resolve = function() {
|
6785 | var resolvedPath = '',
|
6786 | resolvedAbsolute = false;
|
6787 |
|
6788 | for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {
|
6789 | var path = (i >= 0) ? arguments[i] : process.cwd();
|
6790 |
|
6791 | // Skip empty and invalid entries
|
6792 | if (typeof path !== 'string') {
|
6793 | throw new TypeError('Arguments to path.resolve must be strings');
|
6794 | } else if (!path) {
|
6795 | continue;
|
6796 | }
|
6797 |
|
6798 | resolvedPath = path + '/' + resolvedPath;
|
6799 | resolvedAbsolute = path.charAt(0) === '/';
|
6800 | }
|
6801 |
|
6802 | // At this point the path should be resolved to a full absolute path, but
|
6803 | // handle relative paths to be safe (might happen when process.cwd() fails)
|
6804 |
|
6805 | // Normalize the path
|
6806 | resolvedPath = normalizeArray(filter(resolvedPath.split('/'), function(p) {
|
6807 | return !!p;
|
6808 | }), !resolvedAbsolute).join('/');
|
6809 |
|
6810 | return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.';
|
6811 | };
|
6812 |
|
6813 | // path.normalize(path)
|
6814 | // posix version
|
6815 | exports.normalize = function(path) {
|
6816 | var isAbsolute = exports.isAbsolute(path),
|
6817 | trailingSlash = substr(path, -1) === '/';
|
6818 |
|
6819 | // Normalize the path
|
6820 | path = normalizeArray(filter(path.split('/'), function(p) {
|
6821 | return !!p;
|
6822 | }), !isAbsolute).join('/');
|
6823 |
|
6824 | if (!path && !isAbsolute) {
|
6825 | path = '.';
|
6826 | }
|
6827 | if (path && trailingSlash) {
|
6828 | path += '/';
|
6829 | }
|
6830 |
|
6831 | return (isAbsolute ? '/' : '') + path;
|
6832 | };
|
6833 |
|
6834 | // posix version
|
6835 | exports.isAbsolute = function(path) {
|
6836 | return path.charAt(0) === '/';
|
6837 | };
|
6838 |
|
6839 | // posix version
|
6840 | exports.join = function() {
|
6841 | var paths = Array.prototype.slice.call(arguments, 0);
|
6842 | return exports.normalize(filter(paths, function(p, index) {
|
6843 | if (typeof p !== 'string') {
|
6844 | throw new TypeError('Arguments to path.join must be strings');
|
6845 | }
|
6846 | return p;
|
6847 | }).join('/'));
|
6848 | };
|
6849 |
|
6850 |
|
6851 | // path.relative(from, to)
|
6852 | // posix version
|
6853 | exports.relative = function(from, to) {
|
6854 | from = exports.resolve(from).substr(1);
|
6855 | to = exports.resolve(to).substr(1);
|
6856 |
|
6857 | function trim(arr) {
|
6858 | var start = 0;
|
6859 | for (; start < arr.length; start++) {
|
6860 | if (arr[start] !== '') break;
|
6861 | }
|
6862 |
|
6863 | var end = arr.length - 1;
|
6864 | for (; end >= 0; end--) {
|
6865 | if (arr[end] !== '') break;
|
6866 | }
|
6867 |
|
6868 | if (start > end) return [];
|
6869 | return arr.slice(start, end - start + 1);
|
6870 | }
|
6871 |
|
6872 | var fromParts = trim(from.split('/'));
|
6873 | var toParts = trim(to.split('/'));
|
6874 |
|
6875 | var length = Math.min(fromParts.length, toParts.length);
|
6876 | var samePartsLength = length;
|
6877 | for (var i = 0; i < length; i++) {
|
6878 | if (fromParts[i] !== toParts[i]) {
|
6879 | samePartsLength = i;
|
6880 | break;
|
6881 | }
|
6882 | }
|
6883 |
|
6884 | var outputParts = [];
|
6885 | for (var i = samePartsLength; i < fromParts.length; i++) {
|
6886 | outputParts.push('..');
|
6887 | }
|
6888 |
|
6889 | outputParts = outputParts.concat(toParts.slice(samePartsLength));
|
6890 |
|
6891 | return outputParts.join('/');
|
6892 | };
|
6893 |
|
6894 | exports.sep = '/';
|
6895 | exports.delimiter = ':';
|
6896 |
|
6897 | exports.dirname = function (path) {
|
6898 | if (typeof path !== 'string') path = path + '';
|
6899 | if (path.length === 0) return '.';
|
6900 | var code = path.charCodeAt(0);
|
6901 | var hasRoot = code === 47 /*/*/;
|
6902 | var end = -1;
|
6903 | var matchedSlash = true;
|
6904 | for (var i = path.length - 1; i >= 1; --i) {
|
6905 | code = path.charCodeAt(i);
|
6906 | if (code === 47 /*/*/) {
|
6907 | if (!matchedSlash) {
|
6908 | end = i;
|
6909 | break;
|
6910 | }
|
6911 | } else {
|
6912 | // We saw the first non-path separator
|
6913 | matchedSlash = false;
|
6914 | }
|
6915 | }
|
6916 |
|
6917 | if (end === -1) return hasRoot ? '/' : '.';
|
6918 | if (hasRoot && end === 1) {
|
6919 | // return '//';
|
6920 | // Backwards-compat fix:
|
6921 | return '/';
|
6922 | }
|
6923 | return path.slice(0, end);
|
6924 | };
|
6925 |
|
6926 | function basename(path) {
|
6927 | if (typeof path !== 'string') path = path + '';
|
6928 |
|
6929 | var start = 0;
|
6930 | var end = -1;
|
6931 | var matchedSlash = true;
|
6932 | var i;
|
6933 |
|
6934 | for (i = path.length - 1; i >= 0; --i) {
|
6935 | if (path.charCodeAt(i) === 47 /*/*/) {
|
6936 | // If we reached a path separator that was not part of a set of path
|
6937 | // separators at the end of the string, stop now
|
6938 | if (!matchedSlash) {
|
6939 | start = i + 1;
|
6940 | break;
|
6941 | }
|
6942 | } else if (end === -1) {
|
6943 | // We saw the first non-path separator, mark this as the end of our
|
6944 | // path component
|
6945 | matchedSlash = false;
|
6946 | end = i + 1;
|
6947 | }
|
6948 | }
|
6949 |
|
6950 | if (end === -1) return '';
|
6951 | return path.slice(start, end);
|
6952 | }
|
6953 |
|
6954 | // Uses a mixed approach for backwards-compatibility, as ext behavior changed
|
6955 | // in new Node.js versions, so only basename() above is backported here
|
6956 | exports.basename = function (path, ext) {
|
6957 | var f = basename(path);
|
6958 | if (ext && f.substr(-1 * ext.length) === ext) {
|
6959 | f = f.substr(0, f.length - ext.length);
|
6960 | }
|
6961 | return f;
|
6962 | };
|
6963 |
|
6964 | exports.extname = function (path) {
|
6965 | if (typeof path !== 'string') path = path + '';
|
6966 | var startDot = -1;
|
6967 | var startPart = 0;
|
6968 | var end = -1;
|
6969 | var matchedSlash = true;
|
6970 | // Track the state of characters (if any) we see before our first dot and
|
6971 | // after any path separator we find
|
6972 | var preDotState = 0;
|
6973 | for (var i = path.length - 1; i >= 0; --i) {
|
6974 | var code = path.charCodeAt(i);
|
6975 | if (code === 47 /*/*/) {
|
6976 | // If we reached a path separator that was not part of a set of path
|
6977 | // separators at the end of the string, stop now
|
6978 | if (!matchedSlash) {
|
6979 | startPart = i + 1;
|
6980 | break;
|
6981 | }
|
6982 | continue;
|
6983 | }
|
6984 | if (end === -1) {
|
6985 | // We saw the first non-path separator, mark this as the end of our
|
6986 | // extension
|
6987 | matchedSlash = false;
|
6988 | end = i + 1;
|
6989 | }
|
6990 | if (code === 46 /*.*/) {
|
6991 | // If this is our first dot, mark it as the start of our extension
|
6992 | if (startDot === -1)
|
6993 | startDot = i;
|
6994 | else if (preDotState !== 1)
|
6995 | preDotState = 1;
|
6996 | } else if (startDot !== -1) {
|
6997 | // We saw a non-dot and non-path separator before our dot, so we should
|
6998 | // have a good chance at having a non-empty extension
|
6999 | preDotState = -1;
|
7000 | }
|
7001 | }
|
7002 |
|
7003 | if (startDot === -1 || end === -1 ||
|
7004 | // We saw a non-dot character immediately before the dot
|
7005 | preDotState === 0 ||
|
7006 | // The (right-most) trimmed path component is exactly '..'
|
7007 | preDotState === 1 && startDot === end - 1 && startDot === startPart + 1) {
|
7008 | return '';
|
7009 | }
|
7010 | return path.slice(startDot, end);
|
7011 | };
|
7012 |
|
7013 | function filter (xs, f) {
|
7014 | if (xs.filter) return xs.filter(f);
|
7015 | var res = [];
|
7016 | for (var i = 0; i < xs.length; i++) {
|
7017 | if (f(xs[i], i, xs)) res.push(xs[i]);
|
7018 | }
|
7019 | return res;
|
7020 | }
|
7021 |
|
7022 | // String.prototype.substr - negative index don't work in IE8
|
7023 | var substr = 'ab'.substr(-1) === 'b'
|
7024 | ? function (str, start, len) { return str.substr(start, len) }
|
7025 | : function (str, start, len) {
|
7026 | if (start < 0) start = str.length + start;
|
7027 | return str.substr(start, len);
|
7028 | }
|
7029 | ;
|
7030 |
|
7031 | }).call(this,require("KliubH"))
|
7032 | },{"KliubH":91}],91:[function(require,module,exports){
|
7033 | // shim for using process in browser
|
7034 |
|
7035 | var process = module.exports = {};
|
7036 |
|
7037 | process.nextTick = (function () {
|
7038 | var canSetImmediate = typeof window !== 'undefined'
|
7039 | && window.setImmediate;
|
7040 | var canPost = typeof window !== 'undefined'
|
7041 | && window.postMessage && window.addEventListener
|
7042 | ;
|
7043 |
|
7044 | if (canSetImmediate) {
|
7045 | return function (f) { return window.setImmediate(f) };
|
7046 | }
|
7047 |
|
7048 | if (canPost) {
|
7049 | var queue = [];
|
7050 | window.addEventListener('message', function (ev) {
|
7051 | var source = ev.source;
|
7052 | if ((source === window || source === null) && ev.data === 'process-tick') {
|
7053 | ev.stopPropagation();
|
7054 | if (queue.length > 0) {
|
7055 | var fn = queue.shift();
|
7056 | fn();
|
7057 | }
|
7058 | }
|
7059 | }, true);
|
7060 |
|
7061 | return function nextTick(fn) {
|
7062 | queue.push(fn);
|
7063 | window.postMessage('process-tick', '*');
|
7064 | };
|
7065 | }
|
7066 |
|
7067 | return function nextTick(fn) {
|
7068 | setTimeout(fn, 0);
|
7069 | };
|
7070 | })();
|
7071 |
|
7072 | process.title = 'browser';
|
7073 | process.browser = true;
|
7074 | process.env = {};
|
7075 | process.argv = [];
|
7076 |
|
7077 | function noop() {}
|
7078 |
|
7079 | process.on = noop;
|
7080 | process.addListener = noop;
|
7081 | process.once = noop;
|
7082 | process.off = noop;
|
7083 | process.removeListener = noop;
|
7084 | process.removeAllListeners = noop;
|
7085 | process.emit = noop;
|
7086 |
|
7087 | process.binding = function (name) {
|
7088 | throw new Error('process.binding is not supported');
|
7089 | }
|
7090 |
|
7091 | // TODO(shtylman)
|
7092 | process.cwd = function () { return '/' };
|
7093 | process.chdir = function (dir) {
|
7094 | throw new Error('process.chdir is not supported');
|
7095 | };
|
7096 |
|
7097 | },{}],92:[function(require,module,exports){
|
7098 | // Copyright Joyent, Inc. and other Node contributors.
|
7099 | //
|
7100 | // Permission is hereby granted, free of charge, to any person obtaining a
|
7101 | // copy of this software and associated documentation files (the
|
7102 | // "Software"), to deal in the Software without restriction, including
|
7103 | // without limitation the rights to use, copy, modify, merge, publish,
|
7104 | // distribute, sublicense, and/or sell copies of the Software, and to permit
|
7105 | // persons to whom the Software is furnished to do so, subject to the
|
7106 | // following conditions:
|
7107 | //
|
7108 | // The above copyright notice and this permission notice shall be included
|
7109 | // in all copies or substantial portions of the Software.
|
7110 | //
|
7111 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
7112 | // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
7113 | // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
|
7114 | // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
7115 | // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
7116 | // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
7117 | // USE OR OTHER DEALINGS IN THE SOFTWARE.
|
7118 |
|
7119 | // a duplex stream is just a stream that is both readable and writable.
|
7120 | // Since JS doesn't have multiple prototypal inheritance, this class
|
7121 | // prototypally inherits from Readable, and then parasitically from
|
7122 | // Writable.
|
7123 |
|
7124 | module.exports = Duplex;
|
7125 | var inherits = require('inherits');
|
7126 | var setImmediate = require('process/browser.js').nextTick;
|
7127 | var Readable = require('./readable.js');
|
7128 | var Writable = require('./writable.js');
|
7129 |
|
7130 | inherits(Duplex, Readable);
|
7131 |
|
7132 | Duplex.prototype.write = Writable.prototype.write;
|
7133 | Duplex.prototype.end = Writable.prototype.end;
|
7134 | Duplex.prototype._write = Writable.prototype._write;
|
7135 |
|
7136 | function Duplex(options) {
|
7137 | if (!(this instanceof Duplex))
|
7138 | return new Duplex(options);
|
7139 |
|
7140 | Readable.call(this, options);
|
7141 | Writable.call(this, options);
|
7142 |
|
7143 | if (options && options.readable === false)
|
7144 | this.readable = false;
|
7145 |
|
7146 | if (options && options.writable === false)
|
7147 | this.writable = false;
|
7148 |
|
7149 | this.allowHalfOpen = true;
|
7150 | if (options && options.allowHalfOpen === false)
|
7151 | this.allowHalfOpen = false;
|
7152 |
|
7153 | this.once('end', onend);
|
7154 | }
|
7155 |
|
7156 | // the no-half-open enforcer
|
7157 | function onend() {
|
7158 | // if we allow half-open state, or if the writable side ended,
|
7159 | // then we're ok.
|
7160 | if (this.allowHalfOpen || this._writableState.ended)
|
7161 | return;
|
7162 |
|
7163 | // no more data can be written.
|
7164 | // But allow more writes to happen in this tick.
|
7165 | var self = this;
|
7166 | setImmediate(function () {
|
7167 | self.end();
|
7168 | });
|
7169 | }
|
7170 |
|
7171 | },{"./readable.js":96,"./writable.js":98,"inherits":89,"process/browser.js":94}],93:[function(require,module,exports){
|
7172 | // Copyright Joyent, Inc. and other Node contributors.
|
7173 | //
|
7174 | // Permission is hereby granted, free of charge, to any person obtaining a
|
7175 | // copy of this software and associated documentation files (the
|
7176 | // "Software"), to deal in the Software without restriction, including
|
7177 | // without limitation the rights to use, copy, modify, merge, publish,
|
7178 | // distribute, sublicense, and/or sell copies of the Software, and to permit
|
7179 | // persons to whom the Software is furnished to do so, subject to the
|
7180 | // following conditions:
|
7181 | //
|
7182 | // The above copyright notice and this permission notice shall be included
|
7183 | // in all copies or substantial portions of the Software.
|
7184 | //
|
7185 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
7186 | // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
7187 | // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
|
7188 | // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
7189 | // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
7190 | // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
7191 | // USE OR OTHER DEALINGS IN THE SOFTWARE.
|
7192 |
|
7193 | module.exports = Stream;
|
7194 |
|
7195 | var EE = require('events').EventEmitter;
|
7196 | var inherits = require('inherits');
|
7197 |
|
7198 | inherits(Stream, EE);
|
7199 | Stream.Readable = require('./readable.js');
|
7200 | Stream.Writable = require('./writable.js');
|
7201 | Stream.Duplex = require('./duplex.js');
|
7202 | Stream.Transform = require('./transform.js');
|
7203 | Stream.PassThrough = require('./passthrough.js');
|
7204 |
|
7205 | // Backwards-compat with node 0.4.x
|
7206 | Stream.Stream = Stream;
|
7207 |
|
7208 |
|
7209 |
|
7210 | // old-style streams. Note that the pipe method (the only relevant
|
7211 | // part of this class) is overridden in the Readable class.
|
7212 |
|
7213 | function Stream() {
|
7214 | EE.call(this);
|
7215 | }
|
7216 |
|
7217 | Stream.prototype.pipe = function(dest, options) {
|
7218 | var source = this;
|
7219 |
|
7220 | function ondata(chunk) {
|
7221 | if (dest.writable) {
|
7222 | if (false === dest.write(chunk) && source.pause) {
|
7223 | source.pause();
|
7224 | }
|
7225 | }
|
7226 | }
|
7227 |
|
7228 | source.on('data', ondata);
|
7229 |
|
7230 | function ondrain() {
|
7231 | if (source.readable && source.resume) {
|
7232 | source.resume();
|
7233 | }
|
7234 | }
|
7235 |
|
7236 | dest.on('drain', ondrain);
|
7237 |
|
7238 | // If the 'end' option is not supplied, dest.end() will be called when
|
7239 | // source gets the 'end' or 'close' events. Only dest.end() once.
|
7240 | if (!dest._isStdio && (!options || options.end !== false)) {
|
7241 | source.on('end', onend);
|
7242 | source.on('close', onclose);
|
7243 | }
|
7244 |
|
7245 | var didOnEnd = false;
|
7246 | function onend() {
|
7247 | if (didOnEnd) return;
|
7248 | didOnEnd = true;
|
7249 |
|
7250 | dest.end();
|
7251 | }
|
7252 |
|
7253 |
|
7254 | function onclose() {
|
7255 | if (didOnEnd) return;
|
7256 | didOnEnd = true;
|
7257 |
|
7258 | if (typeof dest.destroy === 'function') dest.destroy();
|
7259 | }
|
7260 |
|
7261 | // don't leave dangling pipes when there are errors.
|
7262 | function onerror(er) {
|
7263 | cleanup();
|
7264 | if (EE.listenerCount(this, 'error') === 0) {
|
7265 | throw er; // Unhandled stream error in pipe.
|
7266 | }
|
7267 | }
|
7268 |
|
7269 | source.on('error', onerror);
|
7270 | dest.on('error', onerror);
|
7271 |
|
7272 | // remove all the event listeners that were added.
|
7273 | function cleanup() {
|
7274 | source.removeListener('data', ondata);
|
7275 | dest.removeListener('drain', ondrain);
|
7276 |
|
7277 | source.removeListener('end', onend);
|
7278 | source.removeListener('close', onclose);
|
7279 |
|
7280 | source.removeListener('error', onerror);
|
7281 | dest.removeListener('error', onerror);
|
7282 |
|
7283 | source.removeListener('end', cleanup);
|
7284 | source.removeListener('close', cleanup);
|
7285 |
|
7286 | dest.removeListener('close', cleanup);
|
7287 | }
|
7288 |
|
7289 | source.on('end', cleanup);
|
7290 | source.on('close', cleanup);
|
7291 |
|
7292 | dest.on('close', cleanup);
|
7293 |
|
7294 | dest.emit('pipe', source);
|
7295 |
|
7296 | // Allow for unix-like usage: A.pipe(B).pipe(C)
|
7297 | return dest;
|
7298 | };
|
7299 |
|
7300 | },{"./duplex.js":92,"./passthrough.js":95,"./readable.js":96,"./transform.js":97,"./writable.js":98,"events":87,"inherits":89}],94:[function(require,module,exports){
|
7301 | // shim for using process in browser
|
7302 |
|
7303 | var process = module.exports = {};
|
7304 |
|
7305 | process.nextTick = (function () {
|
7306 | var canSetImmediate = typeof window !== 'undefined'
|
7307 | && window.setImmediate;
|
7308 | var canPost = typeof window !== 'undefined'
|
7309 | && window.postMessage && window.addEventListener
|
7310 | ;
|
7311 |
|
7312 | if (canSetImmediate) {
|
7313 | return function (f) { return window.setImmediate(f) };
|
7314 | }
|
7315 |
|
7316 | if (canPost) {
|
7317 | var queue = [];
|
7318 | window.addEventListener('message', function (ev) {
|
7319 | var source = ev.source;
|
7320 | if ((source === window || source === null) && ev.data === 'process-tick') {
|
7321 | ev.stopPropagation();
|
7322 | if (queue.length > 0) {
|
7323 | var fn = queue.shift();
|
7324 | fn();
|
7325 | }
|
7326 | }
|
7327 | }, true);
|
7328 |
|
7329 | return function nextTick(fn) {
|
7330 | queue.push(fn);
|
7331 | window.postMessage('process-tick', '*');
|
7332 | };
|
7333 | }
|
7334 |
|
7335 | return function nextTick(fn) {
|
7336 | setTimeout(fn, 0);
|
7337 | };
|
7338 | })();
|
7339 |
|
7340 | process.title = 'browser';
|
7341 | process.browser = true;
|
7342 | process.env = {};
|
7343 | process.argv = [];
|
7344 |
|
7345 | process.binding = function (name) {
|
7346 | throw new Error('process.binding is not supported');
|
7347 | }
|
7348 |
|
7349 | // TODO(shtylman)
|
7350 | process.cwd = function () { return '/' };
|
7351 | process.chdir = function (dir) {
|
7352 | throw new Error('process.chdir is not supported');
|
7353 | };
|
7354 |
|
7355 | },{}],95:[function(require,module,exports){
|
7356 | // Copyright Joyent, Inc. and other Node contributors.
|
7357 | //
|
7358 | // Permission is hereby granted, free of charge, to any person obtaining a
|
7359 | // copy of this software and associated documentation files (the
|
7360 | // "Software"), to deal in the Software without restriction, including
|
7361 | // without limitation the rights to use, copy, modify, merge, publish,
|
7362 | // distribute, sublicense, and/or sell copies of the Software, and to permit
|
7363 | // persons to whom the Software is furnished to do so, subject to the
|
7364 | // following conditions:
|
7365 | //
|
7366 | // The above copyright notice and this permission notice shall be included
|
7367 | // in all copies or substantial portions of the Software.
|
7368 | //
|
7369 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
7370 | // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
7371 | // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
|
7372 | // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
7373 | // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
7374 | // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
7375 | // USE OR OTHER DEALINGS IN THE SOFTWARE.
|
7376 |
|
7377 | // a passthrough stream.
|
7378 | // basically just the most minimal sort of Transform stream.
|
7379 | // Every written chunk gets output as-is.
|
7380 |
|
7381 | module.exports = PassThrough;
|
7382 |
|
7383 | var Transform = require('./transform.js');
|
7384 | var inherits = require('inherits');
|
7385 | inherits(PassThrough, Transform);
|
7386 |
|
7387 | function PassThrough(options) {
|
7388 | if (!(this instanceof PassThrough))
|
7389 | return new PassThrough(options);
|
7390 |
|
7391 | Transform.call(this, options);
|
7392 | }
|
7393 |
|
7394 | PassThrough.prototype._transform = function(chunk, encoding, cb) {
|
7395 | cb(null, chunk);
|
7396 | };
|
7397 |
|
7398 | },{"./transform.js":97,"inherits":89}],96:[function(require,module,exports){
|
7399 | (function (process){
|
7400 | // Copyright Joyent, Inc. and other Node contributors.
|
7401 | //
|
7402 | // Permission is hereby granted, free of charge, to any person obtaining a
|
7403 | // copy of this software and associated documentation files (the
|
7404 | // "Software"), to deal in the Software without restriction, including
|
7405 | // without limitation the rights to use, copy, modify, merge, publish,
|
7406 | // distribute, sublicense, and/or sell copies of the Software, and to permit
|
7407 | // persons to whom the Software is furnished to do so, subject to the
|
7408 | // following conditions:
|
7409 | //
|
7410 | // The above copyright notice and this permission notice shall be included
|
7411 | // in all copies or substantial portions of the Software.
|
7412 | //
|
7413 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
7414 | // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
7415 | // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
|
7416 | // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
7417 | // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
7418 | // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
7419 | // USE OR OTHER DEALINGS IN THE SOFTWARE.
|
7420 |
|
7421 | module.exports = Readable;
|
7422 | Readable.ReadableState = ReadableState;
|
7423 |
|
7424 | var EE = require('events').EventEmitter;
|
7425 | var Stream = require('./index.js');
|
7426 | var Buffer = require('buffer').Buffer;
|
7427 | var setImmediate = require('process/browser.js').nextTick;
|
7428 | var StringDecoder;
|
7429 |
|
7430 | var inherits = require('inherits');
|
7431 | inherits(Readable, Stream);
|
7432 |
|
7433 | function ReadableState(options, stream) {
|
7434 | options = options || {};
|
7435 |
|
7436 | // the point at which it stops calling _read() to fill the buffer
|
7437 | // Note: 0 is a valid value, means "don't call _read preemptively ever"
|
7438 | var hwm = options.highWaterMark;
|
7439 | this.highWaterMark = (hwm || hwm === 0) ? hwm : 16 * 1024;
|
7440 |
|
7441 | // cast to ints.
|
7442 | this.highWaterMark = ~~this.highWaterMark;
|
7443 |
|
7444 | this.buffer = [];
|
7445 | this.length = 0;
|
7446 | this.pipes = null;
|
7447 | this.pipesCount = 0;
|
7448 | this.flowing = false;
|
7449 | this.ended = false;
|
7450 | this.endEmitted = false;
|
7451 | this.reading = false;
|
7452 |
|
7453 | // In streams that never have any data, and do push(null) right away,
|
7454 | // the consumer can miss the 'end' event if they do some I/O before
|
7455 | // consuming the stream. So, we don't emit('end') until some reading
|
7456 | // happens.
|
7457 | this.calledRead = false;
|
7458 |
|
7459 | // a flag to be able to tell if the onwrite cb is called immediately,
|
7460 | // or on a later tick. We set this to true at first, becuase any
|
7461 | // actions that shouldn't happen until "later" should generally also
|
7462 | // not happen before the first write call.
|
7463 | this.sync = true;
|
7464 |
|
7465 | // whenever we return null, then we set a flag to say
|
7466 | // that we're awaiting a 'readable' event emission.
|
7467 | this.needReadable = false;
|
7468 | this.emittedReadable = false;
|
7469 | this.readableListening = false;
|
7470 |
|
7471 |
|
7472 | // object stream flag. Used to make read(n) ignore n and to
|
7473 | // make all the buffer merging and length checks go away
|
7474 | this.objectMode = !!options.objectMode;
|
7475 |
|
7476 | // Crypto is kind of old and crusty. Historically, its default string
|
7477 | // encoding is 'binary' so we have to make this configurable.
|
7478 | // Everything else in the universe uses 'utf8', though.
|
7479 | this.defaultEncoding = options.defaultEncoding || 'utf8';
|
7480 |
|
7481 | // when piping, we only care about 'readable' events that happen
|
7482 | // after read()ing all the bytes and not getting any pushback.
|
7483 | this.ranOut = false;
|
7484 |
|
7485 | // the number of writers that are awaiting a drain event in .pipe()s
|
7486 | this.awaitDrain = 0;
|
7487 |
|
7488 | // if true, a maybeReadMore has been scheduled
|
7489 | this.readingMore = false;
|
7490 |
|
7491 | this.decoder = null;
|
7492 | this.encoding = null;
|
7493 | if (options.encoding) {
|
7494 | if (!StringDecoder)
|
7495 | StringDecoder = require('string_decoder').StringDecoder;
|
7496 | this.decoder = new StringDecoder(options.encoding);
|
7497 | this.encoding = options.encoding;
|
7498 | }
|
7499 | }
|
7500 |
|
7501 | function Readable(options) {
|
7502 | if (!(this instanceof Readable))
|
7503 | return new Readable(options);
|
7504 |
|
7505 | this._readableState = new ReadableState(options, this);
|
7506 |
|
7507 | // legacy
|
7508 | this.readable = true;
|
7509 |
|
7510 | Stream.call(this);
|
7511 | }
|
7512 |
|
7513 | // Manually shove something into the read() buffer.
|
7514 | // This returns true if the highWaterMark has not been hit yet,
|
7515 | // similar to how Writable.write() returns true if you should
|
7516 | // write() some more.
|
7517 | Readable.prototype.push = function(chunk, encoding) {
|
7518 | var state = this._readableState;
|
7519 |
|
7520 | if (typeof chunk === 'string' && !state.objectMode) {
|
7521 | encoding = encoding || state.defaultEncoding;
|
7522 | if (encoding !== state.encoding) {
|
7523 | chunk = new Buffer(chunk, encoding);
|
7524 | encoding = '';
|
7525 | }
|
7526 | }
|
7527 |
|
7528 | return readableAddChunk(this, state, chunk, encoding, false);
|
7529 | };
|
7530 |
|
7531 | // Unshift should *always* be something directly out of read()
|
7532 | Readable.prototype.unshift = function(chunk) {
|
7533 | var state = this._readableState;
|
7534 | return readableAddChunk(this, state, chunk, '', true);
|
7535 | };
|
7536 |
|
7537 | function readableAddChunk(stream, state, chunk, encoding, addToFront) {
|
7538 | var er = chunkInvalid(state, chunk);
|
7539 | if (er) {
|
7540 | stream.emit('error', er);
|
7541 | } else if (chunk === null || chunk === undefined) {
|
7542 | state.reading = false;
|
7543 | if (!state.ended)
|
7544 | onEofChunk(stream, state);
|
7545 | } else if (state.objectMode || chunk && chunk.length > 0) {
|
7546 | if (state.ended && !addToFront) {
|
7547 | var e = new Error('stream.push() after EOF');
|
7548 | stream.emit('error', e);
|
7549 | } else if (state.endEmitted && addToFront) {
|
7550 | var e = new Error('stream.unshift() after end event');
|
7551 | stream.emit('error', e);
|
7552 | } else {
|
7553 | if (state.decoder && !addToFront && !encoding)
|
7554 | chunk = state.decoder.write(chunk);
|
7555 |
|
7556 | // update the buffer info.
|
7557 | state.length += state.objectMode ? 1 : chunk.length;
|
7558 | if (addToFront) {
|
7559 | state.buffer.unshift(chunk);
|
7560 | } else {
|
7561 | state.reading = false;
|
7562 | state.buffer.push(chunk);
|
7563 | }
|
7564 |
|
7565 | if (state.needReadable)
|
7566 | emitReadable(stream);
|
7567 |
|
7568 | maybeReadMore(stream, state);
|
7569 | }
|
7570 | } else if (!addToFront) {
|
7571 | state.reading = false;
|
7572 | }
|
7573 |
|
7574 | return needMoreData(state);
|
7575 | }
|
7576 |
|
7577 |
|
7578 |
|
7579 | // if it's past the high water mark, we can push in some more.
|
7580 | // Also, if we have no data yet, we can stand some
|
7581 | // more bytes. This is to work around cases where hwm=0,
|
7582 | // such as the repl. Also, if the push() triggered a
|
7583 | // readable event, and the user called read(largeNumber) such that
|
7584 | // needReadable was set, then we ought to push more, so that another
|
7585 | // 'readable' event will be triggered.
|
7586 | function needMoreData(state) {
|
7587 | return !state.ended &&
|
7588 | (state.needReadable ||
|
7589 | state.length < state.highWaterMark ||
|
7590 | state.length === 0);
|
7591 | }
|
7592 |
|
7593 | // backwards compatibility.
|
7594 | Readable.prototype.setEncoding = function(enc) {
|
7595 | if (!StringDecoder)
|
7596 | StringDecoder = require('string_decoder').StringDecoder;
|
7597 | this._readableState.decoder = new StringDecoder(enc);
|
7598 | this._readableState.encoding = enc;
|
7599 | };
|
7600 |
|
7601 | // Don't raise the hwm > 128MB
|
7602 | var MAX_HWM = 0x800000;
|
7603 | function roundUpToNextPowerOf2(n) {
|
7604 | if (n >= MAX_HWM) {
|
7605 | n = MAX_HWM;
|
7606 | } else {
|
7607 | // Get the next highest power of 2
|
7608 | n--;
|
7609 |
|
7610 | n++;
|
7611 | }
|
7612 | return n;
|
7613 | }
|
7614 |
|
7615 | function howMuchToRead(n, state) {
|
7616 | if (state.length === 0 && state.ended)
|
7617 | return 0;
|
7618 |
|
7619 | if (state.objectMode)
|
7620 | return n === 0 ? 0 : 1;
|
7621 |
|
7622 | if (isNaN(n) || n === null) {
|
7623 | // only flow one buffer at a time
|
7624 | if (state.flowing && state.buffer.length)
|
7625 | return state.buffer[0].length;
|
7626 | else
|
7627 | return state.length;
|
7628 | }
|
7629 |
|
7630 | if (n <= 0)
|
7631 | return 0;
|
7632 |
|
7633 | // If we're asking for more than the target buffer level,
|
7634 | // then raise the water mark. Bump up to the next highest
|
7635 | // power of 2, to prevent increasing it excessively in tiny
|
7636 | // amounts.
|
7637 | if (n > state.highWaterMark)
|
7638 | state.highWaterMark = roundUpToNextPowerOf2(n);
|
7639 |
|
7640 | // don't have that much. return null, unless we've ended.
|
7641 | if (n > state.length) {
|
7642 | if (!state.ended) {
|
7643 | state.needReadable = true;
|
7644 | return 0;
|
7645 | } else
|
7646 | return state.length;
|
7647 | }
|
7648 |
|
7649 | return n;
|
7650 | }
|
7651 |
|
7652 | // you can override either this method, or the async _read(n) below.
|
7653 | Readable.prototype.read = function(n) {
|
7654 | var state = this._readableState;
|
7655 | state.calledRead = true;
|
7656 | var nOrig = n;
|
7657 |
|
7658 | if (typeof n !== 'number' || n > 0)
|
7659 | state.emittedReadable = false;
|
7660 |
|
7661 | // if we're doing read(0) to trigger a readable event, but we
|
7662 | // already have a bunch of data in the buffer, then just trigger
|
7663 | // the 'readable' event and move on.
|
7664 | if (n === 0 &&
|
7665 | state.needReadable &&
|
7666 | (state.length >= state.highWaterMark || state.ended)) {
|
7667 | emitReadable(this);
|
7668 | return null;
|
7669 | }
|
7670 |
|
7671 | n = howMuchToRead(n, state);
|
7672 |
|
7673 | // if we've ended, and we're now clear, then finish it up.
|
7674 | if (n === 0 && state.ended) {
|
7675 | if (state.length === 0)
|
7676 | endReadable(this);
|
7677 | return null;
|
7678 | }
|
7679 |
|
7680 | // All the actual chunk generation logic needs to be
|
7681 | // *below* the call to _read. The reason is that in certain
|
7682 | // synthetic stream cases, such as passthrough streams, _read
|
7683 | // may be a completely synchronous operation which may change
|
7684 | // the state of the read buffer, providing enough data when
|
7685 | // before there was *not* enough.
|
7686 | //
|
7687 | // So, the steps are:
|
7688 | // 1. Figure out what the state of things will be after we do
|
7689 | // a read from the buffer.
|
7690 | //
|
7691 | // 2. If that resulting state will trigger a _read, then call _read.
|
7692 | // Note that this may be asynchronous, or synchronous. Yes, it is
|
7693 | // deeply ugly to write APIs this way, but that still doesn't mean
|
7694 | // that the Readable class should behave improperly, as streams are
|
7695 | // designed to be sync/async agnostic.
|
7696 | // Take note if the _read call is sync or async (ie, if the read call
|
7697 | // has returned yet), so that we know whether or not it's safe to emit
|
7698 | // 'readable' etc.
|
7699 | //
|
7700 | // 3. Actually pull the requested chunks out of the buffer and return.
|
7701 |
|
7702 | // if we need a readable event, then we need to do some reading.
|
7703 | var doRead = state.needReadable;
|
7704 |
|
7705 | // if we currently have less than the highWaterMark, then also read some
|
7706 | if (state.length - n <= state.highWaterMark)
|
7707 | doRead = true;
|
7708 |
|
7709 | // however, if we've ended, then there's no point, and if we're already
|
7710 | // reading, then it's unnecessary.
|
7711 | if (state.ended || state.reading)
|
7712 | doRead = false;
|
7713 |
|
7714 | if (doRead) {
|
7715 | state.reading = true;
|
7716 | state.sync = true;
|
7717 | // if the length is currently zero, then we *need* a readable event.
|
7718 | if (state.length === 0)
|
7719 | state.needReadable = true;
|
7720 | // call internal read method
|
7721 | this._read(state.highWaterMark);
|
7722 | state.sync = false;
|
7723 | }
|
7724 |
|
7725 | // If _read called its callback synchronously, then `reading`
|
7726 | // will be false, and we need to re-evaluate how much data we
|
7727 | // can return to the user.
|
7728 | if (doRead && !state.reading)
|
7729 | n = howMuchToRead(nOrig, state);
|
7730 |
|
7731 | var ret;
|
7732 | if (n > 0)
|
7733 | ret = fromList(n, state);
|
7734 | else
|
7735 | ret = null;
|
7736 |
|
7737 | if (ret === null) {
|
7738 | state.needReadable = true;
|
7739 | n = 0;
|
7740 | }
|
7741 |
|
7742 | state.length -= n;
|
7743 |
|
7744 | // If we have nothing in the buffer, then we want to know
|
7745 | // as soon as we *do* get something into the buffer.
|
7746 | if (state.length === 0 && !state.ended)
|
7747 | state.needReadable = true;
|
7748 |
|
7749 | // If we happened to read() exactly the remaining amount in the
|
7750 | // buffer, and the EOF has been seen at this point, then make sure
|
7751 | // that we emit 'end' on the very next tick.
|
7752 | if (state.ended && !state.endEmitted && state.length === 0)
|
7753 | endReadable(this);
|
7754 |
|
7755 | return ret;
|
7756 | };
|
7757 |
|
7758 | function chunkInvalid(state, chunk) {
|
7759 | var er = null;
|
7760 | if (!Buffer.isBuffer(chunk) &&
|
7761 | 'string' !== typeof chunk &&
|
7762 | chunk !== null &&
|
7763 | chunk !== undefined &&
|
7764 | !state.objectMode &&
|
7765 | !er) {
|
7766 | er = new TypeError('Invalid non-string/buffer chunk');
|
7767 | }
|
7768 | return er;
|
7769 | }
|
7770 |
|
7771 |
|
7772 | function onEofChunk(stream, state) {
|
7773 | if (state.decoder && !state.ended) {
|
7774 | var chunk = state.decoder.end();
|
7775 | if (chunk && chunk.length) {
|
7776 | state.buffer.push(chunk);
|
7777 | state.length += state.objectMode ? 1 : chunk.length;
|
7778 | }
|
7779 | }
|
7780 | state.ended = true;
|
7781 |
|
7782 | // if we've ended and we have some data left, then emit
|
7783 | // 'readable' now to make sure it gets picked up.
|
7784 | if (state.length > 0)
|
7785 | emitReadable(stream);
|
7786 | else
|
7787 | endReadable(stream);
|
7788 | }
|
7789 |
|
7790 | // Don't emit readable right away in sync mode, because this can trigger
|
7791 | // another read() call => stack overflow. This way, it might trigger
|
7792 | // a nextTick recursion warning, but that's not so bad.
|
7793 | function emitReadable(stream) {
|
7794 | var state = stream._readableState;
|
7795 | state.needReadable = false;
|
7796 | if (state.emittedReadable)
|
7797 | return;
|
7798 |
|
7799 | state.emittedReadable = true;
|
7800 | if (state.sync)
|
7801 | setImmediate(function() {
|
7802 | emitReadable_(stream);
|
7803 | });
|
7804 | else
|
7805 | emitReadable_(stream);
|
7806 | }
|
7807 |
|
7808 | function emitReadable_(stream) {
|
7809 | stream.emit('readable');
|
7810 | }
|
7811 |
|
7812 |
|
7813 | // at this point, the user has presumably seen the 'readable' event,
|
7814 | // and called read() to consume some data. that may have triggered
|
7815 | // in turn another _read(n) call, in which case reading = true if
|
7816 | // it's in progress.
|
7817 | // However, if we're not ended, or reading, and the length < hwm,
|
7818 | // then go ahead and try to read some more preemptively.
|
7819 | function maybeReadMore(stream, state) {
|
7820 | if (!state.readingMore) {
|
7821 | state.readingMore = true;
|
7822 | setImmediate(function() {
|
7823 | maybeReadMore_(stream, state);
|
7824 | });
|
7825 | }
|
7826 | }
|
7827 |
|
7828 | function maybeReadMore_(stream, state) {
|
7829 | var len = state.length;
|
7830 | while (!state.reading && !state.flowing && !state.ended &&
|
7831 | state.length < state.highWaterMark) {
|
7832 | stream.read(0);
|
7833 | if (len === state.length)
|
7834 | // didn't get any data, stop spinning.
|
7835 | break;
|
7836 | else
|
7837 | len = state.length;
|
7838 | }
|
7839 | state.readingMore = false;
|
7840 | }
|
7841 |
|
7842 | // abstract method. to be overridden in specific implementation classes.
|
7843 | // call cb(er, data) where data is <= n in length.
|
7844 | // for virtual (non-string, non-buffer) streams, "length" is somewhat
|
7845 | // arbitrary, and perhaps not very meaningful.
|
7846 | Readable.prototype._read = function(n) {
|
7847 | this.emit('error', new Error('not implemented'));
|
7848 | };
|
7849 |
|
7850 | Readable.prototype.pipe = function(dest, pipeOpts) {
|
7851 | var src = this;
|
7852 | var state = this._readableState;
|
7853 |
|
7854 | switch (state.pipesCount) {
|
7855 | case 0:
|
7856 | state.pipes = dest;
|
7857 | break;
|
7858 | case 1:
|
7859 | state.pipes = [state.pipes, dest];
|
7860 | break;
|
7861 | default:
|
7862 | state.pipes.push(dest);
|
7863 | break;
|
7864 | }
|
7865 | state.pipesCount += 1;
|
7866 |
|
7867 | var doEnd = (!pipeOpts || pipeOpts.end !== false) &&
|
7868 | dest !== process.stdout &&
|
7869 | dest !== process.stderr;
|
7870 |
|
7871 | var endFn = doEnd ? onend : cleanup;
|
7872 | if (state.endEmitted)
|
7873 | setImmediate(endFn);
|
7874 | else
|
7875 | src.once('end', endFn);
|
7876 |
|
7877 | dest.on('unpipe', onunpipe);
|
7878 | function onunpipe(readable) {
|
7879 | if (readable !== src) return;
|
7880 | cleanup();
|
7881 | }
|
7882 |
|
7883 | function onend() {
|
7884 | dest.end();
|
7885 | }
|
7886 |
|
7887 | // when the dest drains, it reduces the awaitDrain counter
|
7888 | // on the source. This would be more elegant with a .once()
|
7889 | // handler in flow(), but adding and removing repeatedly is
|
7890 | // too slow.
|
7891 | var ondrain = pipeOnDrain(src);
|
7892 | dest.on('drain', ondrain);
|
7893 |
|
7894 | function cleanup() {
|
7895 | // cleanup event handlers once the pipe is broken
|
7896 | dest.removeListener('close', onclose);
|
7897 | dest.removeListener('finish', onfinish);
|
7898 | dest.removeListener('drain', ondrain);
|
7899 | dest.removeListener('error', onerror);
|
7900 | dest.removeListener('unpipe', onunpipe);
|
7901 | src.removeListener('end', onend);
|
7902 | src.removeListener('end', cleanup);
|
7903 |
|
7904 | // if the reader is waiting for a drain event from this
|
7905 | // specific writer, then it would cause it to never start
|
7906 | // flowing again.
|
7907 | // So, if this is awaiting a drain, then we just call it now.
|
7908 | // If we don't know, then assume that we are waiting for one.
|
7909 | if (!dest._writableState || dest._writableState.needDrain)
|
7910 | ondrain();
|
7911 | }
|
7912 |
|
7913 | // if the dest has an error, then stop piping into it.
|
7914 | // however, don't suppress the throwing behavior for this.
|
7915 | // check for listeners before emit removes one-time listeners.
|
7916 | var errListeners = EE.listenerCount(dest, 'error');
|
7917 | function onerror(er) {
|
7918 | unpipe();
|
7919 | if (errListeners === 0 && EE.listenerCount(dest, 'error') === 0)
|
7920 | dest.emit('error', er);
|
7921 | }
|
7922 | dest.once('error', onerror);
|
7923 |
|
7924 | // Both close and finish should trigger unpipe, but only once.
|
7925 | function onclose() {
|
7926 | dest.removeListener('finish', onfinish);
|
7927 | unpipe();
|
7928 | }
|
7929 | dest.once('close', onclose);
|
7930 | function onfinish() {
|
7931 | dest.removeListener('close', onclose);
|
7932 | unpipe();
|
7933 | }
|
7934 | dest.once('finish', onfinish);
|
7935 |
|
7936 | function unpipe() {
|
7937 | src.unpipe(dest);
|
7938 | }
|
7939 |
|
7940 | // tell the dest that it's being piped to
|
7941 | dest.emit('pipe', src);
|
7942 |
|
7943 | // start the flow if it hasn't been started already.
|
7944 | if (!state.flowing) {
|
7945 | // the handler that waits for readable events after all
|
7946 | // the data gets sucked out in flow.
|
7947 | // This would be easier to follow with a .once() handler
|
7948 | // in flow(), but that is too slow.
|
7949 | this.on('readable', pipeOnReadable);
|
7950 |
|
7951 | state.flowing = true;
|
7952 | setImmediate(function() {
|
7953 | flow(src);
|
7954 | });
|
7955 | }
|
7956 |
|
7957 | return dest;
|
7958 | };
|
7959 |
|
7960 | function pipeOnDrain(src) {
|
7961 | return function() {
|
7962 | var dest = this;
|
7963 | var state = src._readableState;
|
7964 | state.awaitDrain--;
|
7965 | if (state.awaitDrain === 0)
|
7966 | flow(src);
|
7967 | };
|
7968 | }
|
7969 |
|
7970 | function flow(src) {
|
7971 | var state = src._readableState;
|
7972 | var chunk;
|
7973 | state.awaitDrain = 0;
|
7974 |
|
7975 | function write(dest, i, list) {
|
7976 | var written = dest.write(chunk);
|
7977 | if (false === written) {
|
7978 | state.awaitDrain++;
|
7979 | }
|
7980 | }
|
7981 |
|
7982 | while (state.pipesCount && null !== (chunk = src.read())) {
|
7983 |
|
7984 | if (state.pipesCount === 1)
|
7985 | write(state.pipes, 0, null);
|
7986 | else
|
7987 | forEach(state.pipes, write);
|
7988 |
|
7989 | src.emit('data', chunk);
|
7990 |
|
7991 | // if anyone needs a drain, then we have to wait for that.
|
7992 | if (state.awaitDrain > 0)
|
7993 | return;
|
7994 | }
|
7995 |
|
7996 | // if every destination was unpiped, either before entering this
|
7997 | // function, or in the while loop, then stop flowing.
|
7998 | //
|
7999 | // NB: This is a pretty rare edge case.
|
8000 | if (state.pipesCount === 0) {
|
8001 | state.flowing = false;
|
8002 |
|
8003 | // if there were data event listeners added, then switch to old mode.
|
8004 | if (EE.listenerCount(src, 'data') > 0)
|
8005 | emitDataEvents(src);
|
8006 | return;
|
8007 | }
|
8008 |
|
8009 | // at this point, no one needed a drain, so we just ran out of data
|
8010 | // on the next readable event, start it over again.
|
8011 | state.ranOut = true;
|
8012 | }
|
8013 |
|
8014 | function pipeOnReadable() {
|
8015 | if (this._readableState.ranOut) {
|
8016 | this._readableState.ranOut = false;
|
8017 | flow(this);
|
8018 | }
|
8019 | }
|
8020 |
|
8021 |
|
8022 | Readable.prototype.unpipe = function(dest) {
|
8023 | var state = this._readableState;
|
8024 |
|
8025 | // if we're not piping anywhere, then do nothing.
|
8026 | if (state.pipesCount === 0)
|
8027 | return this;
|
8028 |
|
8029 | // just one destination. most common case.
|
8030 | if (state.pipesCount === 1) {
|
8031 | // passed in one, but it's not the right one.
|
8032 | if (dest && dest !== state.pipes)
|
8033 | return this;
|
8034 |
|
8035 | if (!dest)
|
8036 | dest = state.pipes;
|
8037 |
|
8038 | // got a match.
|
8039 | state.pipes = null;
|
8040 | state.pipesCount = 0;
|
8041 | this.removeListener('readable', pipeOnReadable);
|
8042 | state.flowing = false;
|
8043 | if (dest)
|
8044 | dest.emit('unpipe', this);
|
8045 | return this;
|
8046 | }
|
8047 |
|
8048 | // slow case. multiple pipe destinations.
|
8049 |
|
8050 | if (!dest) {
|
8051 | // remove all.
|
8052 | var dests = state.pipes;
|
8053 | var len = state.pipesCount;
|
8054 | state.pipes = null;
|
8055 | state.pipesCount = 0;
|
8056 | this.removeListener('readable', pipeOnReadable);
|
8057 | state.flowing = false;
|
8058 |
|
8059 | for (var i = 0; i < len; i++)
|
8060 | dests[i].emit('unpipe', this);
|
8061 | return this;
|
8062 | }
|
8063 |
|
8064 | // try to find the right one.
|
8065 | var i = indexOf(state.pipes, dest);
|
8066 | if (i === -1)
|
8067 | return this;
|
8068 |
|
8069 | state.pipes.splice(i, 1);
|
8070 | state.pipesCount -= 1;
|
8071 | if (state.pipesCount === 1)
|
8072 | state.pipes = state.pipes[0];
|
8073 |
|
8074 | dest.emit('unpipe', this);
|
8075 |
|
8076 | return this;
|
8077 | };
|
8078 |
|
8079 | // set up data events if they are asked for
|
8080 | // Ensure readable listeners eventually get something
|
8081 | Readable.prototype.on = function(ev, fn) {
|
8082 | var res = Stream.prototype.on.call(this, ev, fn);
|
8083 |
|
8084 | if (ev === 'data' && !this._readableState.flowing)
|
8085 | emitDataEvents(this);
|
8086 |
|
8087 | if (ev === 'readable' && this.readable) {
|
8088 | var state = this._readableState;
|
8089 | if (!state.readableListening) {
|
8090 | state.readableListening = true;
|
8091 | state.emittedReadable = false;
|
8092 | state.needReadable = true;
|
8093 | if (!state.reading) {
|
8094 | this.read(0);
|
8095 | } else if (state.length) {
|
8096 | emitReadable(this, state);
|
8097 | }
|
8098 | }
|
8099 | }
|
8100 |
|
8101 | return res;
|
8102 | };
|
8103 | Readable.prototype.addListener = Readable.prototype.on;
|
8104 |
|
8105 | // pause() and resume() are remnants of the legacy readable stream API
|
8106 | // If the user uses them, then switch into old mode.
|
8107 | Readable.prototype.resume = function() {
|
8108 | emitDataEvents(this);
|
8109 | this.read(0);
|
8110 | this.emit('resume');
|
8111 | };
|
8112 |
|
8113 | Readable.prototype.pause = function() {
|
8114 | emitDataEvents(this, true);
|
8115 | this.emit('pause');
|
8116 | };
|
8117 |
|
8118 | function emitDataEvents(stream, startPaused) {
|
8119 | var state = stream._readableState;
|
8120 |
|
8121 | if (state.flowing) {
|
8122 | // https://github.com/isaacs/readable-stream/issues/16
|
8123 | throw new Error('Cannot switch to old mode now.');
|
8124 | }
|
8125 |
|
8126 | var paused = startPaused || false;
|
8127 | var readable = false;
|
8128 |
|
8129 | // convert to an old-style stream.
|
8130 | stream.readable = true;
|
8131 | stream.pipe = Stream.prototype.pipe;
|
8132 | stream.on = stream.addListener = Stream.prototype.on;
|
8133 |
|
8134 | stream.on('readable', function() {
|
8135 | readable = true;
|
8136 |
|
8137 | var c;
|
8138 | while (!paused && (null !== (c = stream.read())))
|
8139 | stream.emit('data', c);
|
8140 |
|
8141 | if (c === null) {
|
8142 | readable = false;
|
8143 | stream._readableState.needReadable = true;
|
8144 | }
|
8145 | });
|
8146 |
|
8147 | stream.pause = function() {
|
8148 | paused = true;
|
8149 | this.emit('pause');
|
8150 | };
|
8151 |
|
8152 | stream.resume = function() {
|
8153 | paused = false;
|
8154 | if (readable)
|
8155 | setImmediate(function() {
|
8156 | stream.emit('readable');
|
8157 | });
|
8158 | else
|
8159 | this.read(0);
|
8160 | this.emit('resume');
|
8161 | };
|
8162 |
|
8163 | // now make it start, just in case it hadn't already.
|
8164 | stream.emit('readable');
|
8165 | }
|
8166 |
|
8167 | // wrap an old-style stream as the async data source.
|
8168 | // This is *not* part of the readable stream interface.
|
8169 | // It is an ugly unfortunate mess of history.
|
8170 | Readable.prototype.wrap = function(stream) {
|
8171 | var state = this._readableState;
|
8172 | var paused = false;
|
8173 |
|
8174 | var self = this;
|
8175 | stream.on('end', function() {
|
8176 | if (state.decoder && !state.ended) {
|
8177 | var chunk = state.decoder.end();
|
8178 | if (chunk && chunk.length)
|
8179 | self.push(chunk);
|
8180 | }
|
8181 |
|
8182 | self.push(null);
|
8183 | });
|
8184 |
|
8185 | stream.on('data', function(chunk) {
|
8186 | if (state.decoder)
|
8187 | chunk = state.decoder.write(chunk);
|
8188 | if (!chunk || !state.objectMode && !chunk.length)
|
8189 | return;
|
8190 |
|
8191 | var ret = self.push(chunk);
|
8192 | if (!ret) {
|
8193 | paused = true;
|
8194 | stream.pause();
|
8195 | }
|
8196 | });
|
8197 |
|
8198 | // proxy all the other methods.
|
8199 | // important when wrapping filters and duplexes.
|
8200 | for (var i in stream) {
|
8201 | if (typeof stream[i] === 'function' &&
|
8202 | typeof this[i] === 'undefined') {
|
8203 | this[i] = function(method) { return function() {
|
8204 | return stream[method].apply(stream, arguments);
|
8205 | }}(i);
|
8206 | }
|
8207 | }
|
8208 |
|
8209 | // proxy certain important events.
|
8210 | var events = ['error', 'close', 'destroy', 'pause', 'resume'];
|
8211 | forEach(events, function(ev) {
|
8212 | stream.on(ev, function (x) {
|
8213 | return self.emit.apply(self, ev, x);
|
8214 | });
|
8215 | });
|
8216 |
|
8217 | // when we try to consume some more bytes, simply unpause the
|
8218 | // underlying stream.
|
8219 | self._read = function(n) {
|
8220 | if (paused) {
|
8221 | paused = false;
|
8222 | stream.resume();
|
8223 | }
|
8224 | };
|
8225 |
|
8226 | return self;
|
8227 | };
|
8228 |
|
8229 |
|
8230 |
|
8231 | // exposed for testing purposes only.
|
8232 | Readable._fromList = fromList;
|
8233 |
|
8234 | // Pluck off n bytes from an array of buffers.
|
8235 | // Length is the combined lengths of all the buffers in the list.
|
8236 | function fromList(n, state) {
|
8237 | var list = state.buffer;
|
8238 | var length = state.length;
|
8239 | var stringMode = !!state.decoder;
|
8240 | var objectMode = !!state.objectMode;
|
8241 | var ret;
|
8242 |
|
8243 | // nothing in the list, definitely empty.
|
8244 | if (list.length === 0)
|
8245 | return null;
|
8246 |
|
8247 | if (length === 0)
|
8248 | ret = null;
|
8249 | else if (objectMode)
|
8250 | ret = list.shift();
|
8251 | else if (!n || n >= length) {
|
8252 | // read it all, truncate the array.
|
8253 | if (stringMode)
|
8254 | ret = list.join('');
|
8255 | else
|
8256 | ret = Buffer.concat(list, length);
|
8257 | list.length = 0;
|
8258 | } else {
|
8259 | // read just some of it.
|
8260 | if (n < list[0].length) {
|
8261 | // just take a part of the first list item.
|
8262 | // slice is the same for buffers and strings.
|
8263 | var buf = list[0];
|
8264 | ret = buf.slice(0, n);
|
8265 | list[0] = buf.slice(n);
|
8266 | } else if (n === list[0].length) {
|
8267 | // first list is a perfect match
|
8268 | ret = list.shift();
|
8269 | } else {
|
8270 | // complex case.
|
8271 | // we have enough to cover it, but it spans past the first buffer.
|
8272 | if (stringMode)
|
8273 | ret = '';
|
8274 | else
|
8275 | ret = new Buffer(n);
|
8276 |
|
8277 | var c = 0;
|
8278 | for (var i = 0, l = list.length; i < l && c < n; i++) {
|
8279 | var buf = list[0];
|
8280 | var cpy = Math.min(n - c, buf.length);
|
8281 |
|
8282 | if (stringMode)
|
8283 | ret += buf.slice(0, cpy);
|
8284 | else
|
8285 | buf.copy(ret, c, 0, cpy);
|
8286 |
|
8287 | if (cpy < buf.length)
|
8288 | list[0] = buf.slice(cpy);
|
8289 | else
|
8290 | list.shift();
|
8291 |
|
8292 | c += cpy;
|
8293 | }
|
8294 | }
|
8295 | }
|
8296 |
|
8297 | return ret;
|
8298 | }
|
8299 |
|
8300 | function endReadable(stream) {
|
8301 | var state = stream._readableState;
|
8302 |
|
8303 | // If we get here before consuming all the bytes, then that is a
|
8304 | // bug in node. Should never happen.
|
8305 | if (state.length > 0)
|
8306 | throw new Error('endReadable called on non-empty stream');
|
8307 |
|
8308 | if (!state.endEmitted && state.calledRead) {
|
8309 | state.ended = true;
|
8310 | setImmediate(function() {
|
8311 | // Check that we didn't get one last unshift.
|
8312 | if (!state.endEmitted && state.length === 0) {
|
8313 | state.endEmitted = true;
|
8314 | stream.readable = false;
|
8315 | stream.emit('end');
|
8316 | }
|
8317 | });
|
8318 | }
|
8319 | }
|
8320 |
|
8321 | function forEach (xs, f) {
|
8322 | for (var i = 0, l = xs.length; i < l; i++) {
|
8323 | f(xs[i], i);
|
8324 | }
|
8325 | }
|
8326 |
|
8327 | function indexOf (xs, x) {
|
8328 | for (var i = 0, l = xs.length; i < l; i++) {
|
8329 | if (xs[i] === x) return i;
|
8330 | }
|
8331 | return -1;
|
8332 | }
|
8333 |
|
8334 | }).call(this,require("KliubH"))
|
8335 | },{"./index.js":93,"KliubH":91,"buffer":86,"events":87,"inherits":89,"process/browser.js":94,"string_decoder":99}],97:[function(require,module,exports){
|
8336 | // Copyright Joyent, Inc. and other Node contributors.
|
8337 | //
|
8338 | // Permission is hereby granted, free of charge, to any person obtaining a
|
8339 | // copy of this software and associated documentation files (the
|
8340 | // "Software"), to deal in the Software without restriction, including
|
8341 | // without limitation the rights to use, copy, modify, merge, publish,
|
8342 | // distribute, sublicense, and/or sell copies of the Software, and to permit
|
8343 | // persons to whom the Software is furnished to do so, subject to the
|
8344 | // following conditions:
|
8345 | //
|
8346 | // The above copyright notice and this permission notice shall be included
|
8347 | // in all copies or substantial portions of the Software.
|
8348 | //
|
8349 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
8350 | // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
8351 | // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
|
8352 | // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
8353 | // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
8354 | // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
8355 | // USE OR OTHER DEALINGS IN THE SOFTWARE.
|
8356 |
|
8357 | // a transform stream is a readable/writable stream where you do
|
8358 | // something with the data. Sometimes it's called a "filter",
|
8359 | // but that's not a great name for it, since that implies a thing where
|
8360 | // some bits pass through, and others are simply ignored. (That would
|
8361 | // be a valid example of a transform, of course.)
|
8362 | //
|
8363 | // While the output is causally related to the input, it's not a
|
8364 | // necessarily symmetric or synchronous transformation. For example,
|
8365 | // a zlib stream might take multiple plain-text writes(), and then
|
8366 | // emit a single compressed chunk some time in the future.
|
8367 | //
|
8368 | // Here's how this works:
|
8369 | //
|
8370 | // The Transform stream has all the aspects of the readable and writable
|
8371 | // stream classes. When you write(chunk), that calls _write(chunk,cb)
|
8372 | // internally, and returns false if there's a lot of pending writes
|
8373 | // buffered up. When you call read(), that calls _read(n) until
|
8374 | // there's enough pending readable data buffered up.
|
8375 | //
|
8376 | // In a transform stream, the written data is placed in a buffer. When
|
8377 | // _read(n) is called, it transforms the queued up data, calling the
|
8378 | // buffered _write cb's as it consumes chunks. If consuming a single
|
8379 | // written chunk would result in multiple output chunks, then the first
|
8380 | // outputted bit calls the readcb, and subsequent chunks just go into
|
8381 | // the read buffer, and will cause it to emit 'readable' if necessary.
|
8382 | //
|
8383 | // This way, back-pressure is actually determined by the reading side,
|
8384 | // since _read has to be called to start processing a new chunk. However,
|
8385 | // a pathological inflate type of transform can cause excessive buffering
|
8386 | // here. For example, imagine a stream where every byte of input is
|
8387 | // interpreted as an integer from 0-255, and then results in that many
|
8388 | // bytes of output. Writing the 4 bytes {ff,ff,ff,ff} would result in
|
8389 | // 1kb of data being output. In this case, you could write a very small
|
8390 | // amount of input, and end up with a very large amount of output. In
|
8391 | // such a pathological inflating mechanism, there'd be no way to tell
|
8392 | // the system to stop doing the transform. A single 4MB write could
|
8393 | // cause the system to run out of memory.
|
8394 | //
|
8395 | // However, even in such a pathological case, only a single written chunk
|
8396 | // would be consumed, and then the rest would wait (un-transformed) until
|
8397 | // the results of the previous transformed chunk were consumed.
|
8398 |
|
8399 | module.exports = Transform;
|
8400 |
|
8401 | var Duplex = require('./duplex.js');
|
8402 | var inherits = require('inherits');
|
8403 | inherits(Transform, Duplex);
|
8404 |
|
8405 |
|
8406 | function TransformState(options, stream) {
|
8407 | this.afterTransform = function(er, data) {
|
8408 | return afterTransform(stream, er, data);
|
8409 | };
|
8410 |
|
8411 | this.needTransform = false;
|
8412 | this.transforming = false;
|
8413 | this.writecb = null;
|
8414 | this.writechunk = null;
|
8415 | }
|
8416 |
|
8417 | function afterTransform(stream, er, data) {
|
8418 | var ts = stream._transformState;
|
8419 | ts.transforming = false;
|
8420 |
|
8421 | var cb = ts.writecb;
|
8422 |
|
8423 | if (!cb)
|
8424 | return stream.emit('error', new Error('no writecb in Transform class'));
|
8425 |
|
8426 | ts.writechunk = null;
|
8427 | ts.writecb = null;
|
8428 |
|
8429 | if (data !== null && data !== undefined)
|
8430 | stream.push(data);
|
8431 |
|
8432 | if (cb)
|
8433 | cb(er);
|
8434 |
|
8435 | var rs = stream._readableState;
|
8436 | rs.reading = false;
|
8437 | if (rs.needReadable || rs.length < rs.highWaterMark) {
|
8438 | stream._read(rs.highWaterMark);
|
8439 | }
|
8440 | }
|
8441 |
|
8442 |
|
8443 | function Transform(options) {
|
8444 | if (!(this instanceof Transform))
|
8445 | return new Transform(options);
|
8446 |
|
8447 | Duplex.call(this, options);
|
8448 |
|
8449 | var ts = this._transformState = new TransformState(options, this);
|
8450 |
|
8451 | // when the writable side finishes, then flush out anything remaining.
|
8452 | var stream = this;
|
8453 |
|
8454 | // start out asking for a readable event once data is transformed.
|
8455 | this._readableState.needReadable = true;
|
8456 |
|
8457 | // we have implemented the _read method, and done the other things
|
8458 | // that Readable wants before the first _read call, so unset the
|
8459 | // sync guard flag.
|
8460 | this._readableState.sync = false;
|
8461 |
|
8462 | this.once('finish', function() {
|
8463 | if ('function' === typeof this._flush)
|
8464 | this._flush(function(er) {
|
8465 | done(stream, er);
|
8466 | });
|
8467 | else
|
8468 | done(stream);
|
8469 | });
|
8470 | }
|
8471 |
|
8472 | Transform.prototype.push = function(chunk, encoding) {
|
8473 | this._transformState.needTransform = false;
|
8474 | return Duplex.prototype.push.call(this, chunk, encoding);
|
8475 | };
|
8476 |
|
8477 | // This is the part where you do stuff!
|
8478 | // override this function in implementation classes.
|
8479 | // 'chunk' is an input chunk.
|
8480 | //
|
8481 | // Call `push(newChunk)` to pass along transformed output
|
8482 | // to the readable side. You may call 'push' zero or more times.
|
8483 | //
|
8484 | // Call `cb(err)` when you are done with this chunk. If you pass
|
8485 | // an error, then that'll put the hurt on the whole operation. If you
|
8486 | // never call cb(), then you'll never get another chunk.
|
8487 | Transform.prototype._transform = function(chunk, encoding, cb) {
|
8488 | throw new Error('not implemented');
|
8489 | };
|
8490 |
|
8491 | Transform.prototype._write = function(chunk, encoding, cb) {
|
8492 | var ts = this._transformState;
|
8493 | ts.writecb = cb;
|
8494 | ts.writechunk = chunk;
|
8495 | ts.writeencoding = encoding;
|
8496 | if (!ts.transforming) {
|
8497 | var rs = this._readableState;
|
8498 | if (ts.needTransform ||
|
8499 | rs.needReadable ||
|
8500 | rs.length < rs.highWaterMark)
|
8501 | this._read(rs.highWaterMark);
|
8502 | }
|
8503 | };
|
8504 |
|
8505 | // Doesn't matter what the args are here.
|
8506 | // _transform does all the work.
|
8507 | // That we got here means that the readable side wants more data.
|
8508 | Transform.prototype._read = function(n) {
|
8509 | var ts = this._transformState;
|
8510 |
|
8511 | if (ts.writechunk && ts.writecb && !ts.transforming) {
|
8512 | ts.transforming = true;
|
8513 | this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform);
|
8514 | } else {
|
8515 | // mark that we need a transform, so that any data that comes in
|
8516 | // will get processed, now that we've asked for it.
|
8517 | ts.needTransform = true;
|
8518 | }
|
8519 | };
|
8520 |
|
8521 |
|
8522 | function done(stream, er) {
|
8523 | if (er)
|
8524 | return stream.emit('error', er);
|
8525 |
|
8526 | // if there's nothing in the write buffer, then that means
|
8527 | // that nothing more will ever be provided
|
8528 | var ws = stream._writableState;
|
8529 | var rs = stream._readableState;
|
8530 | var ts = stream._transformState;
|
8531 |
|
8532 | if (ws.length)
|
8533 | throw new Error('calling transform done when ws.length != 0');
|
8534 |
|
8535 | if (ts.transforming)
|
8536 | throw new Error('calling transform done when still transforming');
|
8537 |
|
8538 | return stream.push(null);
|
8539 | }
|
8540 |
|
8541 | },{"./duplex.js":92,"inherits":89}],98:[function(require,module,exports){
|
8542 | // Copyright Joyent, Inc. and other Node contributors.
|
8543 | //
|
8544 | // Permission is hereby granted, free of charge, to any person obtaining a
|
8545 | // copy of this software and associated documentation files (the
|
8546 | // "Software"), to deal in the Software without restriction, including
|
8547 | // without limitation the rights to use, copy, modify, merge, publish,
|
8548 | // distribute, sublicense, and/or sell copies of the Software, and to permit
|
8549 | // persons to whom the Software is furnished to do so, subject to the
|
8550 | // following conditions:
|
8551 | //
|
8552 | // The above copyright notice and this permission notice shall be included
|
8553 | // in all copies or substantial portions of the Software.
|
8554 | //
|
8555 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
8556 | // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
8557 | // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
|
8558 | // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
8559 | // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
8560 | // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
8561 | // USE OR OTHER DEALINGS IN THE SOFTWARE.
|
8562 |
|
8563 | // A bit simpler than readable streams.
|
8564 | // Implement an async ._write(chunk, cb), and it'll handle all
|
8565 | // the drain event emission and buffering.
|
8566 |
|
8567 | module.exports = Writable;
|
8568 | Writable.WritableState = WritableState;
|
8569 |
|
8570 | var isUint8Array = typeof Uint8Array !== 'undefined'
|
8571 | ? function (x) { return x instanceof Uint8Array }
|
8572 | : function (x) {
|
8573 | return x && x.constructor && x.constructor.name === 'Uint8Array'
|
8574 | }
|
8575 | ;
|
8576 | var isArrayBuffer = typeof ArrayBuffer !== 'undefined'
|
8577 | ? function (x) { return x instanceof ArrayBuffer }
|
8578 | : function (x) {
|
8579 | return x && x.constructor && x.constructor.name === 'ArrayBuffer'
|
8580 | }
|
8581 | ;
|
8582 |
|
8583 | var inherits = require('inherits');
|
8584 | var Stream = require('./index.js');
|
8585 | var setImmediate = require('process/browser.js').nextTick;
|
8586 | var Buffer = require('buffer').Buffer;
|
8587 |
|
8588 | inherits(Writable, Stream);
|
8589 |
|
8590 | function WriteReq(chunk, encoding, cb) {
|
8591 | this.chunk = chunk;
|
8592 | this.encoding = encoding;
|
8593 | this.callback = cb;
|
8594 | }
|
8595 |
|
8596 | function WritableState(options, stream) {
|
8597 | options = options || {};
|
8598 |
|
8599 | // the point at which write() starts returning false
|
8600 | // Note: 0 is a valid value, means that we always return false if
|
8601 | // the entire buffer is not flushed immediately on write()
|
8602 | var hwm = options.highWaterMark;
|
8603 | this.highWaterMark = (hwm || hwm === 0) ? hwm : 16 * 1024;
|
8604 |
|
8605 | // object stream flag to indicate whether or not this stream
|
8606 | // contains buffers or objects.
|
8607 | this.objectMode = !!options.objectMode;
|
8608 |
|
8609 | // cast to ints.
|
8610 | this.highWaterMark = ~~this.highWaterMark;
|
8611 |
|
8612 | this.needDrain = false;
|
8613 | // at the start of calling end()
|
8614 | this.ending = false;
|
8615 | // when end() has been called, and returned
|
8616 | this.ended = false;
|
8617 | // when 'finish' is emitted
|
8618 | this.finished = false;
|
8619 |
|
8620 | // should we decode strings into buffers before passing to _write?
|
8621 | // this is here so that some node-core streams can optimize string
|
8622 | // handling at a lower level.
|
8623 | var noDecode = options.decodeStrings === false;
|
8624 | this.decodeStrings = !noDecode;
|
8625 |
|
8626 | // Crypto is kind of old and crusty. Historically, its default string
|
8627 | // encoding is 'binary' so we have to make this configurable.
|
8628 | // Everything else in the universe uses 'utf8', though.
|
8629 | this.defaultEncoding = options.defaultEncoding || 'utf8';
|
8630 |
|
8631 | // not an actual buffer we keep track of, but a measurement
|
8632 | // of how much we're waiting to get pushed to some underlying
|
8633 | // socket or file.
|
8634 | this.length = 0;
|
8635 |
|
8636 | // a flag to see when we're in the middle of a write.
|
8637 | this.writing = false;
|
8638 |
|
8639 | // a flag to be able to tell if the onwrite cb is called immediately,
|
8640 | // or on a later tick. We set this to true at first, becuase any
|
8641 | // actions that shouldn't happen until "later" should generally also
|
8642 | // not happen before the first write call.
|
8643 | this.sync = true;
|
8644 |
|
8645 | // a flag to know if we're processing previously buffered items, which
|
8646 | // may call the _write() callback in the same tick, so that we don't
|
8647 | // end up in an overlapped onwrite situation.
|
8648 | this.bufferProcessing = false;
|
8649 |
|
8650 | // the callback that's passed to _write(chunk,cb)
|
8651 | this.onwrite = function(er) {
|
8652 | onwrite(stream, er);
|
8653 | };
|
8654 |
|
8655 | // the callback that the user supplies to write(chunk,encoding,cb)
|
8656 | this.writecb = null;
|
8657 |
|
8658 | // the amount that is being written when _write is called.
|
8659 | this.writelen = 0;
|
8660 |
|
8661 | this.buffer = [];
|
8662 | }
|
8663 |
|
8664 | function Writable(options) {
|
8665 | // Writable ctor is applied to Duplexes, though they're not
|
8666 | // instanceof Writable, they're instanceof Readable.
|
8667 | if (!(this instanceof Writable) && !(this instanceof Stream.Duplex))
|
8668 | return new Writable(options);
|
8669 |
|
8670 | this._writableState = new WritableState(options, this);
|
8671 |
|
8672 | // legacy.
|
8673 | this.writable = true;
|
8674 |
|
8675 | Stream.call(this);
|
8676 | }
|
8677 |
|
8678 | // Otherwise people can pipe Writable streams, which is just wrong.
|
8679 | Writable.prototype.pipe = function() {
|
8680 | this.emit('error', new Error('Cannot pipe. Not readable.'));
|
8681 | };
|
8682 |
|
8683 |
|
8684 | function writeAfterEnd(stream, state, cb) {
|
8685 | var er = new Error('write after end');
|
8686 | // TODO: defer error events consistently everywhere, not just the cb
|
8687 | stream.emit('error', er);
|
8688 | setImmediate(function() {
|
8689 | cb(er);
|
8690 | });
|
8691 | }
|
8692 |
|
8693 | // If we get something that is not a buffer, string, null, or undefined,
|
8694 | // and we're not in objectMode, then that's an error.
|
8695 | // Otherwise stream chunks are all considered to be of length=1, and the
|
8696 | // watermarks determine how many objects to keep in the buffer, rather than
|
8697 | // how many bytes or characters.
|
8698 | function validChunk(stream, state, chunk, cb) {
|
8699 | var valid = true;
|
8700 | if (!Buffer.isBuffer(chunk) &&
|
8701 | 'string' !== typeof chunk &&
|
8702 | chunk !== null &&
|
8703 | chunk !== undefined &&
|
8704 | !state.objectMode) {
|
8705 | var er = new TypeError('Invalid non-string/buffer chunk');
|
8706 | stream.emit('error', er);
|
8707 | setImmediate(function() {
|
8708 | cb(er);
|
8709 | });
|
8710 | valid = false;
|
8711 | }
|
8712 | return valid;
|
8713 | }
|
8714 |
|
8715 | Writable.prototype.write = function(chunk, encoding, cb) {
|
8716 | var state = this._writableState;
|
8717 | var ret = false;
|
8718 |
|
8719 | if (typeof encoding === 'function') {
|
8720 | cb = encoding;
|
8721 | encoding = null;
|
8722 | }
|
8723 |
|
8724 | if (!Buffer.isBuffer(chunk) && isUint8Array(chunk))
|
8725 | chunk = new Buffer(chunk);
|
8726 | if (isArrayBuffer(chunk) && typeof Uint8Array !== 'undefined')
|
8727 | chunk = new Buffer(new Uint8Array(chunk));
|
8728 |
|
8729 | if (Buffer.isBuffer(chunk))
|
8730 | encoding = 'buffer';
|
8731 | else if (!encoding)
|
8732 | encoding = state.defaultEncoding;
|
8733 |
|
8734 | if (typeof cb !== 'function')
|
8735 | cb = function() {};
|
8736 |
|
8737 | if (state.ended)
|
8738 | writeAfterEnd(this, state, cb);
|
8739 | else if (validChunk(this, state, chunk, cb))
|
8740 | ret = writeOrBuffer(this, state, chunk, encoding, cb);
|
8741 |
|
8742 | return ret;
|
8743 | };
|
8744 |
|
8745 | function decodeChunk(state, chunk, encoding) {
|
8746 | if (!state.objectMode &&
|
8747 | state.decodeStrings !== false &&
|
8748 | typeof chunk === 'string') {
|
8749 | chunk = new Buffer(chunk, encoding);
|
8750 | }
|
8751 | return chunk;
|
8752 | }
|
8753 |
|
8754 | // if we're already writing something, then just put this
|
8755 | // in the queue, and wait our turn. Otherwise, call _write
|
8756 | // If we return false, then we need a drain event, so set that flag.
|
8757 | function writeOrBuffer(stream, state, chunk, encoding, cb) {
|
8758 | chunk = decodeChunk(state, chunk, encoding);
|
8759 | var len = state.objectMode ? 1 : chunk.length;
|
8760 |
|
8761 | state.length += len;
|
8762 |
|
8763 | var ret = state.length < state.highWaterMark;
|
8764 | state.needDrain = !ret;
|
8765 |
|
8766 | if (state.writing)
|
8767 | state.buffer.push(new WriteReq(chunk, encoding, cb));
|
8768 | else
|
8769 | doWrite(stream, state, len, chunk, encoding, cb);
|
8770 |
|
8771 | return ret;
|
8772 | }
|
8773 |
|
8774 | function doWrite(stream, state, len, chunk, encoding, cb) {
|
8775 | state.writelen = len;
|
8776 | state.writecb = cb;
|
8777 | state.writing = true;
|
8778 | state.sync = true;
|
8779 | stream._write(chunk, encoding, state.onwrite);
|
8780 | state.sync = false;
|
8781 | }
|
8782 |
|
8783 | function onwriteError(stream, state, sync, er, cb) {
|
8784 | if (sync)
|
8785 | setImmediate(function() {
|
8786 | cb(er);
|
8787 | });
|
8788 | else
|
8789 | cb(er);
|
8790 |
|
8791 | stream.emit('error', er);
|
8792 | }
|
8793 |
|
8794 | function onwriteStateUpdate(state) {
|
8795 | state.writing = false;
|
8796 | state.writecb = null;
|
8797 | state.length -= state.writelen;
|
8798 | state.writelen = 0;
|
8799 | }
|
8800 |
|
8801 | function onwrite(stream, er) {
|
8802 | var state = stream._writableState;
|
8803 | var sync = state.sync;
|
8804 | var cb = state.writecb;
|
8805 |
|
8806 | onwriteStateUpdate(state);
|
8807 |
|
8808 | if (er)
|
8809 | onwriteError(stream, state, sync, er, cb);
|
8810 | else {
|
8811 | // Check if we're actually ready to finish, but don't emit yet
|
8812 | var finished = needFinish(stream, state);
|
8813 |
|
8814 | if (!finished && !state.bufferProcessing && state.buffer.length)
|
8815 | clearBuffer(stream, state);
|
8816 |
|
8817 | if (sync) {
|
8818 | setImmediate(function() {
|
8819 | afterWrite(stream, state, finished, cb);
|
8820 | });
|
8821 | } else {
|
8822 | afterWrite(stream, state, finished, cb);
|
8823 | }
|
8824 | }
|
8825 | }
|
8826 |
|
8827 | function afterWrite(stream, state, finished, cb) {
|
8828 | if (!finished)
|
8829 | onwriteDrain(stream, state);
|
8830 | cb();
|
8831 | if (finished)
|
8832 | finishMaybe(stream, state);
|
8833 | }
|
8834 |
|
8835 | // Must force callback to be called on nextTick, so that we don't
|
8836 | // emit 'drain' before the write() consumer gets the 'false' return
|
8837 | // value, and has a chance to attach a 'drain' listener.
|
8838 | function onwriteDrain(stream, state) {
|
8839 | if (state.length === 0 && state.needDrain) {
|
8840 | state.needDrain = false;
|
8841 | stream.emit('drain');
|
8842 | }
|
8843 | }
|
8844 |
|
8845 |
|
8846 | // if there's something in the buffer waiting, then process it
|
8847 | function clearBuffer(stream, state) {
|
8848 | state.bufferProcessing = true;
|
8849 |
|
8850 | for (var c = 0; c < state.buffer.length; c++) {
|
8851 | var entry = state.buffer[c];
|
8852 | var chunk = entry.chunk;
|
8853 | var encoding = entry.encoding;
|
8854 | var cb = entry.callback;
|
8855 | var len = state.objectMode ? 1 : chunk.length;
|
8856 |
|
8857 | doWrite(stream, state, len, chunk, encoding, cb);
|
8858 |
|
8859 | // if we didn't call the onwrite immediately, then
|
8860 | // it means that we need to wait until it does.
|
8861 | // also, that means that the chunk and cb are currently
|
8862 | // being processed, so move the buffer counter past them.
|
8863 | if (state.writing) {
|
8864 | c++;
|
8865 | break;
|
8866 | }
|
8867 | }
|
8868 |
|
8869 | state.bufferProcessing = false;
|
8870 | if (c < state.buffer.length)
|
8871 | state.buffer = state.buffer.slice(c);
|
8872 | else
|
8873 | state.buffer.length = 0;
|
8874 | }
|
8875 |
|
8876 | Writable.prototype._write = function(chunk, encoding, cb) {
|
8877 | cb(new Error('not implemented'));
|
8878 | };
|
8879 |
|
8880 | Writable.prototype.end = function(chunk, encoding, cb) {
|
8881 | var state = this._writableState;
|
8882 |
|
8883 | if (typeof chunk === 'function') {
|
8884 | cb = chunk;
|
8885 | chunk = null;
|
8886 | encoding = null;
|
8887 | } else if (typeof encoding === 'function') {
|
8888 | cb = encoding;
|
8889 | encoding = null;
|
8890 | }
|
8891 |
|
8892 | if (typeof chunk !== 'undefined' && chunk !== null)
|
8893 | this.write(chunk, encoding);
|
8894 |
|
8895 | // ignore unnecessary end() calls.
|
8896 | if (!state.ending && !state.finished)
|
8897 | endWritable(this, state, cb);
|
8898 | };
|
8899 |
|
8900 |
|
8901 | function needFinish(stream, state) {
|
8902 | return (state.ending &&
|
8903 | state.length === 0 &&
|
8904 | !state.finished &&
|
8905 | !state.writing);
|
8906 | }
|
8907 |
|
8908 | function finishMaybe(stream, state) {
|
8909 | var need = needFinish(stream, state);
|
8910 | if (need) {
|
8911 | state.finished = true;
|
8912 | stream.emit('finish');
|
8913 | }
|
8914 | return need;
|
8915 | }
|
8916 |
|
8917 | function endWritable(stream, state, cb) {
|
8918 | state.ending = true;
|
8919 | finishMaybe(stream, state);
|
8920 | if (cb) {
|
8921 | if (state.finished)
|
8922 | setImmediate(cb);
|
8923 | else
|
8924 | stream.once('finish', cb);
|
8925 | }
|
8926 | state.ended = true;
|
8927 | }
|
8928 |
|
8929 | },{"./index.js":93,"buffer":86,"inherits":89,"process/browser.js":94}],99:[function(require,module,exports){
|
8930 | // Copyright Joyent, Inc. and other Node contributors.
|
8931 | //
|
8932 | // Permission is hereby granted, free of charge, to any person obtaining a
|
8933 | // copy of this software and associated documentation files (the
|
8934 | // "Software"), to deal in the Software without restriction, including
|
8935 | // without limitation the rights to use, copy, modify, merge, publish,
|
8936 | // distribute, sublicense, and/or sell copies of the Software, and to permit
|
8937 | // persons to whom the Software is furnished to do so, subject to the
|
8938 | // following conditions:
|
8939 | //
|
8940 | // The above copyright notice and this permission notice shall be included
|
8941 | // in all copies or substantial portions of the Software.
|
8942 | //
|
8943 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
8944 | // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
8945 | // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
|
8946 | // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
8947 | // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
8948 | // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
8949 | // USE OR OTHER DEALINGS IN THE SOFTWARE.
|
8950 |
|
8951 | var Buffer = require('buffer').Buffer;
|
8952 |
|
8953 | function assertEncoding(encoding) {
|
8954 | if (encoding && !Buffer.isEncoding(encoding)) {
|
8955 | throw new Error('Unknown encoding: ' + encoding);
|
8956 | }
|
8957 | }
|
8958 |
|
8959 | var StringDecoder = exports.StringDecoder = function(encoding) {
|
8960 | this.encoding = (encoding || 'utf8').toLowerCase().replace(/[-_]/, '');
|
8961 | assertEncoding(encoding);
|
8962 | switch (this.encoding) {
|
8963 | case 'utf8':
|
8964 | // CESU-8 represents each of Surrogate Pair by 3-bytes
|
8965 | this.surrogateSize = 3;
|
8966 | break;
|
8967 | case 'ucs2':
|
8968 | case 'utf16le':
|
8969 | // UTF-16 represents each of Surrogate Pair by 2-bytes
|
8970 | this.surrogateSize = 2;
|
8971 | this.detectIncompleteChar = utf16DetectIncompleteChar;
|
8972 | break;
|
8973 | case 'base64':
|
8974 | // Base-64 stores 3 bytes in 4 chars, and pads the remainder.
|
8975 | this.surrogateSize = 3;
|
8976 | this.detectIncompleteChar = base64DetectIncompleteChar;
|
8977 | break;
|
8978 | default:
|
8979 | this.write = passThroughWrite;
|
8980 | return;
|
8981 | }
|
8982 |
|
8983 | this.charBuffer = new Buffer(6);
|
8984 | this.charReceived = 0;
|
8985 | this.charLength = 0;
|
8986 | };
|
8987 |
|
8988 |
|
8989 | StringDecoder.prototype.write = function(buffer) {
|
8990 | var charStr = '';
|
8991 | var offset = 0;
|
8992 |
|
8993 | // if our last write ended with an incomplete multibyte character
|
8994 | while (this.charLength) {
|
8995 | // determine how many remaining bytes this buffer has to offer for this char
|
8996 | var i = (buffer.length >= this.charLength - this.charReceived) ?
|
8997 | this.charLength - this.charReceived :
|
8998 | buffer.length;
|
8999 |
|
9000 | // add the new bytes to the char buffer
|
9001 | buffer.copy(this.charBuffer, this.charReceived, offset, i);
|
9002 | this.charReceived += (i - offset);
|
9003 | offset = i;
|
9004 |
|
9005 | if (this.charReceived < this.charLength) {
|
9006 | // still not enough chars in this buffer? wait for more ...
|
9007 | return '';
|
9008 | }
|
9009 |
|
9010 | // get the character that was split
|
9011 | charStr = this.charBuffer.slice(0, this.charLength).toString(this.encoding);
|
9012 |
|
9013 | // lead surrogate (D800-DBFF) is also the incomplete character
|
9014 | var charCode = charStr.charCodeAt(charStr.length - 1);
|
9015 | if (charCode >= 0xD800 && charCode <= 0xDBFF) {
|
9016 | this.charLength += this.surrogateSize;
|
9017 | charStr = '';
|
9018 | continue;
|
9019 | }
|
9020 | this.charReceived = this.charLength = 0;
|
9021 |
|
9022 | // if there are no more bytes in this buffer, just emit our char
|
9023 | if (i == buffer.length) return charStr;
|
9024 |
|
9025 | // otherwise cut off the characters end from the beginning of this buffer
|
9026 | buffer = buffer.slice(i, buffer.length);
|
9027 | break;
|
9028 | }
|
9029 |
|
9030 | var lenIncomplete = this.detectIncompleteChar(buffer);
|
9031 |
|
9032 | var end = buffer.length;
|
9033 | if (this.charLength) {
|
9034 | // buffer the incomplete character bytes we got
|
9035 | buffer.copy(this.charBuffer, 0, buffer.length - lenIncomplete, end);
|
9036 | this.charReceived = lenIncomplete;
|
9037 | end -= lenIncomplete;
|
9038 | }
|
9039 |
|
9040 | charStr += buffer.toString(this.encoding, 0, end);
|
9041 |
|
9042 | var end = charStr.length - 1;
|
9043 | var charCode = charStr.charCodeAt(end);
|
9044 | // lead surrogate (D800-DBFF) is also the incomplete character
|
9045 | if (charCode >= 0xD800 && charCode <= 0xDBFF) {
|
9046 | var size = this.surrogateSize;
|
9047 | this.charLength += size;
|
9048 | this.charReceived += size;
|
9049 | this.charBuffer.copy(this.charBuffer, size, 0, size);
|
9050 | this.charBuffer.write(charStr.charAt(charStr.length - 1), this.encoding);
|
9051 | return charStr.substring(0, end);
|
9052 | }
|
9053 |
|
9054 | // or just emit the charStr
|
9055 | return charStr;
|
9056 | };
|
9057 |
|
9058 | StringDecoder.prototype.detectIncompleteChar = function(buffer) {
|
9059 | // determine how many bytes we have to check at the end of this buffer
|
9060 | var i = (buffer.length >= 3) ? 3 : buffer.length;
|
9061 |
|
9062 | // Figure out if one of the last i bytes of our buffer announces an
|
9063 | // incomplete char.
|
9064 | for (; i > 0; i--) {
|
9065 | var c = buffer[buffer.length - i];
|
9066 |
|
9067 | // See http://en.wikipedia.org/wiki/UTF-8#Description
|
9068 |
|
9069 | // 110XXXXX
|
9070 | if (i == 1 && c >> 5 == 0x06) {
|
9071 | this.charLength = 2;
|
9072 | break;
|
9073 | }
|
9074 |
|
9075 | // 1110XXXX
|
9076 | if (i <= 2 && c >> 4 == 0x0E) {
|
9077 | this.charLength = 3;
|
9078 | break;
|
9079 | }
|
9080 |
|
9081 | // 11110XXX
|
9082 | if (i <= 3 && c >> 3 == 0x1E) {
|
9083 | this.charLength = 4;
|
9084 | break;
|
9085 | }
|
9086 | }
|
9087 |
|
9088 | return i;
|
9089 | };
|
9090 |
|
9091 | StringDecoder.prototype.end = function(buffer) {
|
9092 | var res = '';
|
9093 | if (buffer && buffer.length)
|
9094 | res = this.write(buffer);
|
9095 |
|
9096 | if (this.charReceived) {
|
9097 | var cr = this.charReceived;
|
9098 | var buf = this.charBuffer;
|
9099 | var enc = this.encoding;
|
9100 | res += buf.slice(0, cr).toString(enc);
|
9101 | }
|
9102 |
|
9103 | return res;
|
9104 | };
|
9105 |
|
9106 | function passThroughWrite(buffer) {
|
9107 | return buffer.toString(this.encoding);
|
9108 | }
|
9109 |
|
9110 | function utf16DetectIncompleteChar(buffer) {
|
9111 | var incomplete = this.charReceived = buffer.length % 2;
|
9112 | this.charLength = incomplete ? 2 : 0;
|
9113 | return incomplete;
|
9114 | }
|
9115 |
|
9116 | function base64DetectIncompleteChar(buffer) {
|
9117 | var incomplete = this.charReceived = buffer.length % 3;
|
9118 | this.charLength = incomplete ? 3 : 0;
|
9119 | return incomplete;
|
9120 | }
|
9121 |
|
9122 | },{"buffer":86}],100:[function(require,module,exports){
|
9123 | if (typeof Object.create === 'function') {
|
9124 | // implementation from standard node.js 'util' module
|
9125 | module.exports = function inherits(ctor, superCtor) {
|
9126 | ctor.super_ = superCtor
|
9127 | ctor.prototype = Object.create(superCtor.prototype, {
|
9128 | constructor: {
|
9129 | value: ctor,
|
9130 | enumerable: false,
|
9131 | writable: true,
|
9132 | configurable: true
|
9133 | }
|
9134 | });
|
9135 | };
|
9136 | } else {
|
9137 | // old school shim for old browsers
|
9138 | module.exports = function inherits(ctor, superCtor) {
|
9139 | ctor.super_ = superCtor
|
9140 | var TempCtor = function () {}
|
9141 | TempCtor.prototype = superCtor.prototype
|
9142 | ctor.prototype = new TempCtor()
|
9143 | ctor.prototype.constructor = ctor
|
9144 | }
|
9145 | }
|
9146 |
|
9147 | },{}],101:[function(require,module,exports){
|
9148 | module.exports = function isBuffer(arg) {
|
9149 | return arg && typeof arg === 'object'
|
9150 | && typeof arg.copy === 'function'
|
9151 | && typeof arg.fill === 'function'
|
9152 | && typeof arg.readUInt8 === 'function';
|
9153 | }
|
9154 | },{}],102:[function(require,module,exports){
|
9155 | (function (process,global){
|
9156 | // Copyright Joyent, Inc. and other Node contributors.
|
9157 | //
|
9158 | // Permission is hereby granted, free of charge, to any person obtaining a
|
9159 | // copy of this software and associated documentation files (the
|
9160 | // "Software"), to deal in the Software without restriction, including
|
9161 | // without limitation the rights to use, copy, modify, merge, publish,
|
9162 | // distribute, sublicense, and/or sell copies of the Software, and to permit
|
9163 | // persons to whom the Software is furnished to do so, subject to the
|
9164 | // following conditions:
|
9165 | //
|
9166 | // The above copyright notice and this permission notice shall be included
|
9167 | // in all copies or substantial portions of the Software.
|
9168 | //
|
9169 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
9170 | // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
9171 | // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
|
9172 | // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
9173 | // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
9174 | // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
9175 | // USE OR OTHER DEALINGS IN THE SOFTWARE.
|
9176 |
|
9177 | var formatRegExp = /%[sdj%]/g;
|
9178 | exports.format = function(f) {
|
9179 | if (!isString(f)) {
|
9180 | var objects = [];
|
9181 | for (var i = 0; i < arguments.length; i++) {
|
9182 | objects.push(inspect(arguments[i]));
|
9183 | }
|
9184 | return objects.join(' ');
|
9185 | }
|
9186 |
|
9187 | var i = 1;
|
9188 | var args = arguments;
|
9189 | var len = args.length;
|
9190 | var str = String(f).replace(formatRegExp, function(x) {
|
9191 | if (x === '%%') return '%';
|
9192 | if (i >= len) return x;
|
9193 | switch (x) {
|
9194 | case '%s': return String(args[i++]);
|
9195 | case '%d': return Number(args[i++]);
|
9196 | case '%j':
|
9197 | try {
|
9198 | return JSON.stringify(args[i++]);
|
9199 | } catch (_) {
|
9200 | return '[Circular]';
|
9201 | }
|
9202 | default:
|
9203 | return x;
|
9204 | }
|
9205 | });
|
9206 | for (var x = args[i]; i < len; x = args[++i]) {
|
9207 | if (isNull(x) || !isObject(x)) {
|
9208 | str += ' ' + x;
|
9209 | } else {
|
9210 | str += ' ' + inspect(x);
|
9211 | }
|
9212 | }
|
9213 | return str;
|
9214 | };
|
9215 |
|
9216 |
|
9217 | // Mark that a method should not be used.
|
9218 | // Returns a modified function which warns once by default.
|
9219 | // If --no-deprecation is set, then it is a no-op.
|
9220 | exports.deprecate = function(fn, msg) {
|
9221 | // Allow for deprecating things in the process of starting up.
|
9222 | if (isUndefined(global.process)) {
|
9223 | return function() {
|
9224 | return exports.deprecate(fn, msg).apply(this, arguments);
|
9225 | };
|
9226 | }
|
9227 |
|
9228 | if (process.noDeprecation === true) {
|
9229 | return fn;
|
9230 | }
|
9231 |
|
9232 | var warned = false;
|
9233 | function deprecated() {
|
9234 | if (!warned) {
|
9235 | if (process.throwDeprecation) {
|
9236 | throw new Error(msg);
|
9237 | } else if (process.traceDeprecation) {
|
9238 | console.trace(msg);
|
9239 | } else {
|
9240 | console.error(msg);
|
9241 | }
|
9242 | warned = true;
|
9243 | }
|
9244 | return fn.apply(this, arguments);
|
9245 | }
|
9246 |
|
9247 | return deprecated;
|
9248 | };
|
9249 |
|
9250 |
|
9251 | var debugs = {};
|
9252 | var debugEnviron;
|
9253 | exports.debuglog = function(set) {
|
9254 | if (isUndefined(debugEnviron))
|
9255 | debugEnviron = process.env.NODE_DEBUG || '';
|
9256 | set = set.toUpperCase();
|
9257 | if (!debugs[set]) {
|
9258 | if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) {
|
9259 | var pid = process.pid;
|
9260 | debugs[set] = function() {
|
9261 | var msg = exports.format.apply(exports, arguments);
|
9262 | console.error('%s %d: %s', set, pid, msg);
|
9263 | };
|
9264 | } else {
|
9265 | debugs[set] = function() {};
|
9266 | }
|
9267 | }
|
9268 | return debugs[set];
|
9269 | };
|
9270 |
|
9271 |
|
9272 | /**
|
9273 | * Echos the value of a value. Trys to print the value out
|
9274 | * in the best way possible given the different types.
|
9275 | *
|
9276 | * @param {Object} obj The object to print out.
|
9277 | * @param {Object} opts Optional options object that alters the output.
|
9278 | */
|
9279 | /* legacy: obj, showHidden, depth, colors*/
|
9280 | function inspect(obj, opts) {
|
9281 | // default options
|
9282 | var ctx = {
|
9283 | seen: [],
|
9284 | stylize: stylizeNoColor
|
9285 | };
|
9286 | // legacy...
|
9287 | if (arguments.length >= 3) ctx.depth = arguments[2];
|
9288 | if (arguments.length >= 4) ctx.colors = arguments[3];
|
9289 | if (isBoolean(opts)) {
|
9290 | // legacy...
|
9291 | ctx.showHidden = opts;
|
9292 | } else if (opts) {
|
9293 | // got an "options" object
|
9294 | exports._extend(ctx, opts);
|
9295 | }
|
9296 | // set default options
|
9297 | if (isUndefined(ctx.showHidden)) ctx.showHidden = false;
|
9298 | if (isUndefined(ctx.depth)) ctx.depth = 2;
|
9299 | if (isUndefined(ctx.colors)) ctx.colors = false;
|
9300 | if (isUndefined(ctx.customInspect)) ctx.customInspect = true;
|
9301 | if (ctx.colors) ctx.stylize = stylizeWithColor;
|
9302 | return formatValue(ctx, obj, ctx.depth);
|
9303 | }
|
9304 | exports.inspect = inspect;
|
9305 |
|
9306 |
|
9307 | // http://en.wikipedia.org/wiki/ANSI_escape_code#graphics
|
9308 | inspect.colors = {
|
9309 | 'bold' : [1, 22],
|
9310 | 'italic' : [3, 23],
|
9311 | 'underline' : [4, 24],
|
9312 | 'inverse' : [7, 27],
|
9313 | 'white' : [37, 39],
|
9314 | 'grey' : [90, 39],
|
9315 | 'black' : [30, 39],
|
9316 | 'blue' : [34, 39],
|
9317 | 'cyan' : [36, 39],
|
9318 | 'green' : [32, 39],
|
9319 | 'magenta' : [35, 39],
|
9320 | 'red' : [31, 39],
|
9321 | 'yellow' : [33, 39]
|
9322 | };
|
9323 |
|
9324 | // Don't use 'blue' not visible on cmd.exe
|
9325 | inspect.styles = {
|
9326 | 'special': 'cyan',
|
9327 | 'number': 'yellow',
|
9328 | 'boolean': 'yellow',
|
9329 | 'undefined': 'grey',
|
9330 | 'null': 'bold',
|
9331 | 'string': 'green',
|
9332 | 'date': 'magenta',
|
9333 | // "name": intentionally not styling
|
9334 | 'regexp': 'red'
|
9335 | };
|
9336 |
|
9337 |
|
9338 | function stylizeWithColor(str, styleType) {
|
9339 | var style = inspect.styles[styleType];
|
9340 |
|
9341 | if (style) {
|
9342 | return '\u001b[' + inspect.colors[style][0] + 'm' + str +
|
9343 | '\u001b[' + inspect.colors[style][1] + 'm';
|
9344 | } else {
|
9345 | return str;
|
9346 | }
|
9347 | }
|
9348 |
|
9349 |
|
9350 | function stylizeNoColor(str, styleType) {
|
9351 | return str;
|
9352 | }
|
9353 |
|
9354 |
|
9355 | function arrayToHash(array) {
|
9356 | var hash = {};
|
9357 |
|
9358 | array.forEach(function(val, idx) {
|
9359 | hash[val] = true;
|
9360 | });
|
9361 |
|
9362 | return hash;
|
9363 | }
|
9364 |
|
9365 |
|
9366 | function formatValue(ctx, value, recurseTimes) {
|
9367 | // Provide a hook for user-specified inspect functions.
|
9368 | // Check that value is an object with an inspect function on it
|
9369 | if (ctx.customInspect &&
|
9370 | value &&
|
9371 | isFunction(value.inspect) &&
|
9372 | // Filter out the util module, it's inspect function is special
|
9373 | value.inspect !== exports.inspect &&
|
9374 | // Also filter out any prototype objects using the circular check.
|
9375 | !(value.constructor && value.constructor.prototype === value)) {
|
9376 | var ret = value.inspect(recurseTimes, ctx);
|
9377 | if (!isString(ret)) {
|
9378 | ret = formatValue(ctx, ret, recurseTimes);
|
9379 | }
|
9380 | return ret;
|
9381 | }
|
9382 |
|
9383 | // Primitive types cannot have properties
|
9384 | var primitive = formatPrimitive(ctx, value);
|
9385 | if (primitive) {
|
9386 | return primitive;
|
9387 | }
|
9388 |
|
9389 | // Look up the keys of the object.
|
9390 | var keys = Object.keys(value);
|
9391 | var visibleKeys = arrayToHash(keys);
|
9392 |
|
9393 | if (ctx.showHidden) {
|
9394 | keys = Object.getOwnPropertyNames(value);
|
9395 | }
|
9396 |
|
9397 | // IE doesn't make error fields non-enumerable
|
9398 | // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx
|
9399 | if (isError(value)
|
9400 | && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) {
|
9401 | return formatError(value);
|
9402 | }
|
9403 |
|
9404 | // Some type of object without properties can be shortcutted.
|
9405 | if (keys.length === 0) {
|
9406 | if (isFunction(value)) {
|
9407 | var name = value.name ? ': ' + value.name : '';
|
9408 | return ctx.stylize('[Function' + name + ']', 'special');
|
9409 | }
|
9410 | if (isRegExp(value)) {
|
9411 | return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');
|
9412 | }
|
9413 | if (isDate(value)) {
|
9414 | return ctx.stylize(Date.prototype.toString.call(value), 'date');
|
9415 | }
|
9416 | if (isError(value)) {
|
9417 | return formatError(value);
|
9418 | }
|
9419 | }
|
9420 |
|
9421 | var base = '', array = false, braces = ['{', '}'];
|
9422 |
|
9423 | // Make Array say that they are Array
|
9424 | if (isArray(value)) {
|
9425 | array = true;
|
9426 | braces = ['[', ']'];
|
9427 | }
|
9428 |
|
9429 | // Make functions say that they are functions
|
9430 | if (isFunction(value)) {
|
9431 | var n = value.name ? ': ' + value.name : '';
|
9432 | base = ' [Function' + n + ']';
|
9433 | }
|
9434 |
|
9435 | // Make RegExps say that they are RegExps
|
9436 | if (isRegExp(value)) {
|
9437 | base = ' ' + RegExp.prototype.toString.call(value);
|
9438 | }
|
9439 |
|
9440 | // Make dates with properties first say the date
|
9441 | if (isDate(value)) {
|
9442 | base = ' ' + Date.prototype.toUTCString.call(value);
|
9443 | }
|
9444 |
|
9445 | // Make error with message first say the error
|
9446 | if (isError(value)) {
|
9447 | base = ' ' + formatError(value);
|
9448 | }
|
9449 |
|
9450 | if (keys.length === 0 && (!array || value.length == 0)) {
|
9451 | return braces[0] + base + braces[1];
|
9452 | }
|
9453 |
|
9454 | if (recurseTimes < 0) {
|
9455 | if (isRegExp(value)) {
|
9456 | return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');
|
9457 | } else {
|
9458 | return ctx.stylize('[Object]', 'special');
|
9459 | }
|
9460 | }
|
9461 |
|
9462 | ctx.seen.push(value);
|
9463 |
|
9464 | var output;
|
9465 | if (array) {
|
9466 | output = formatArray(ctx, value, recurseTimes, visibleKeys, keys);
|
9467 | } else {
|
9468 | output = keys.map(function(key) {
|
9469 | return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array);
|
9470 | });
|
9471 | }
|
9472 |
|
9473 | ctx.seen.pop();
|
9474 |
|
9475 | return reduceToSingleString(output, base, braces);
|
9476 | }
|
9477 |
|
9478 |
|
9479 | function formatPrimitive(ctx, value) {
|
9480 | if (isUndefined(value))
|
9481 | return ctx.stylize('undefined', 'undefined');
|
9482 | if (isString(value)) {
|
9483 | var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '')
|
9484 | .replace(/'/g, "\\'")
|
9485 | .replace(/\\"/g, '"') + '\'';
|
9486 | return ctx.stylize(simple, 'string');
|
9487 | }
|
9488 | if (isNumber(value))
|
9489 | return ctx.stylize('' + value, 'number');
|
9490 | if (isBoolean(value))
|
9491 | return ctx.stylize('' + value, 'boolean');
|
9492 | // For some reason typeof null is "object", so special case here.
|
9493 | if (isNull(value))
|
9494 | return ctx.stylize('null', 'null');
|
9495 | }
|
9496 |
|
9497 |
|
9498 | function formatError(value) {
|
9499 | return '[' + Error.prototype.toString.call(value) + ']';
|
9500 | }
|
9501 |
|
9502 |
|
9503 | function formatArray(ctx, value, recurseTimes, visibleKeys, keys) {
|
9504 | var output = [];
|
9505 | for (var i = 0, l = value.length; i < l; ++i) {
|
9506 | if (hasOwnProperty(value, String(i))) {
|
9507 | output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,
|
9508 | String(i), true));
|
9509 | } else {
|
9510 | output.push('');
|
9511 | }
|
9512 | }
|
9513 | keys.forEach(function(key) {
|
9514 | if (!key.match(/^\d+$/)) {
|
9515 | output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,
|
9516 | key, true));
|
9517 | }
|
9518 | });
|
9519 | return output;
|
9520 | }
|
9521 |
|
9522 |
|
9523 | function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) {
|
9524 | var name, str, desc;
|
9525 | desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] };
|
9526 | if (desc.get) {
|
9527 | if (desc.set) {
|
9528 | str = ctx.stylize('[Getter/Setter]', 'special');
|
9529 | } else {
|
9530 | str = ctx.stylize('[Getter]', 'special');
|
9531 | }
|
9532 | } else {
|
9533 | if (desc.set) {
|
9534 | str = ctx.stylize('[Setter]', 'special');
|
9535 | }
|
9536 | }
|
9537 | if (!hasOwnProperty(visibleKeys, key)) {
|
9538 | name = '[' + key + ']';
|
9539 | }
|
9540 | if (!str) {
|
9541 | if (ctx.seen.indexOf(desc.value) < 0) {
|
9542 | if (isNull(recurseTimes)) {
|
9543 | str = formatValue(ctx, desc.value, null);
|
9544 | } else {
|
9545 | str = formatValue(ctx, desc.value, recurseTimes - 1);
|
9546 | }
|
9547 | if (str.indexOf('\n') > -1) {
|
9548 | if (array) {
|
9549 | str = str.split('\n').map(function(line) {
|
9550 | return ' ' + line;
|
9551 | }).join('\n').substr(2);
|
9552 | } else {
|
9553 | str = '\n' + str.split('\n').map(function(line) {
|
9554 | return ' ' + line;
|
9555 | }).join('\n');
|
9556 | }
|
9557 | }
|
9558 | } else {
|
9559 | str = ctx.stylize('[Circular]', 'special');
|
9560 | }
|
9561 | }
|
9562 | if (isUndefined(name)) {
|
9563 | if (array && key.match(/^\d+$/)) {
|
9564 | return str;
|
9565 | }
|
9566 | name = JSON.stringify('' + key);
|
9567 | if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) {
|
9568 | name = name.substr(1, name.length - 2);
|
9569 | name = ctx.stylize(name, 'name');
|
9570 | } else {
|
9571 | name = name.replace(/'/g, "\\'")
|
9572 | .replace(/\\"/g, '"')
|
9573 | .replace(/(^"|"$)/g, "'");
|
9574 | name = ctx.stylize(name, 'string');
|
9575 | }
|
9576 | }
|
9577 |
|
9578 | return name + ': ' + str;
|
9579 | }
|
9580 |
|
9581 |
|
9582 | function reduceToSingleString(output, base, braces) {
|
9583 | var numLinesEst = 0;
|
9584 | var length = output.reduce(function(prev, cur) {
|
9585 | numLinesEst++;
|
9586 | if (cur.indexOf('\n') >= 0) numLinesEst++;
|
9587 | return prev + cur.replace(/\u001b\[\d\d?m/g, '').length + 1;
|
9588 | }, 0);
|
9589 |
|
9590 | if (length > 60) {
|
9591 | return braces[0] +
|
9592 | (base === '' ? '' : base + '\n ') +
|
9593 | ' ' +
|
9594 | output.join(',\n ') +
|
9595 | ' ' +
|
9596 | braces[1];
|
9597 | }
|
9598 |
|
9599 | return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1];
|
9600 | }
|
9601 |
|
9602 |
|
9603 | // NOTE: These type checking functions intentionally don't use `instanceof`
|
9604 | // because it is fragile and can be easily faked with `Object.create()`.
|
9605 | function isArray(ar) {
|
9606 | return Array.isArray(ar);
|
9607 | }
|
9608 | exports.isArray = isArray;
|
9609 |
|
9610 | function isBoolean(arg) {
|
9611 | return typeof arg === 'boolean';
|
9612 | }
|
9613 | exports.isBoolean = isBoolean;
|
9614 |
|
9615 | function isNull(arg) {
|
9616 | return arg === null;
|
9617 | }
|
9618 | exports.isNull = isNull;
|
9619 |
|
9620 | function isNullOrUndefined(arg) {
|
9621 | return arg == null;
|
9622 | }
|
9623 | exports.isNullOrUndefined = isNullOrUndefined;
|
9624 |
|
9625 | function isNumber(arg) {
|
9626 | return typeof arg === 'number';
|
9627 | }
|
9628 | exports.isNumber = isNumber;
|
9629 |
|
9630 | function isString(arg) {
|
9631 | return typeof arg === 'string';
|
9632 | }
|
9633 | exports.isString = isString;
|
9634 |
|
9635 | function isSymbol(arg) {
|
9636 | return typeof arg === 'symbol';
|
9637 | }
|
9638 | exports.isSymbol = isSymbol;
|
9639 |
|
9640 | function isUndefined(arg) {
|
9641 | return arg === void 0;
|
9642 | }
|
9643 | exports.isUndefined = isUndefined;
|
9644 |
|
9645 | function isRegExp(re) {
|
9646 | return isObject(re) && objectToString(re) === '[object RegExp]';
|
9647 | }
|
9648 | exports.isRegExp = isRegExp;
|
9649 |
|
9650 | function isObject(arg) {
|
9651 | return typeof arg === 'object' && arg !== null;
|
9652 | }
|
9653 | exports.isObject = isObject;
|
9654 |
|
9655 | function isDate(d) {
|
9656 | return isObject(d) && objectToString(d) === '[object Date]';
|
9657 | }
|
9658 | exports.isDate = isDate;
|
9659 |
|
9660 | function isError(e) {
|
9661 | return isObject(e) &&
|
9662 | (objectToString(e) === '[object Error]' || e instanceof Error);
|
9663 | }
|
9664 | exports.isError = isError;
|
9665 |
|
9666 | function isFunction(arg) {
|
9667 | return typeof arg === 'function';
|
9668 | }
|
9669 | exports.isFunction = isFunction;
|
9670 |
|
9671 | function isPrimitive(arg) {
|
9672 | return arg === null ||
|
9673 | typeof arg === 'boolean' ||
|
9674 | typeof arg === 'number' ||
|
9675 | typeof arg === 'string' ||
|
9676 | typeof arg === 'symbol' || // ES6 symbol
|
9677 | typeof arg === 'undefined';
|
9678 | }
|
9679 | exports.isPrimitive = isPrimitive;
|
9680 |
|
9681 | exports.isBuffer = require('./support/isBuffer');
|
9682 |
|
9683 | function objectToString(o) {
|
9684 | return Object.prototype.toString.call(o);
|
9685 | }
|
9686 |
|
9687 |
|
9688 | function pad(n) {
|
9689 | return n < 10 ? '0' + n.toString(10) : n.toString(10);
|
9690 | }
|
9691 |
|
9692 |
|
9693 | var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep',
|
9694 | 'Oct', 'Nov', 'Dec'];
|
9695 |
|
9696 | // 26 Feb 16:19:34
|
9697 | function timestamp() {
|
9698 | var d = new Date();
|
9699 | var time = [pad(d.getHours()),
|
9700 | pad(d.getMinutes()),
|
9701 | pad(d.getSeconds())].join(':');
|
9702 | return [d.getDate(), months[d.getMonth()], time].join(' ');
|
9703 | }
|
9704 |
|
9705 |
|
9706 | // log is just a thin wrapper to console.log that prepends a timestamp
|
9707 | exports.log = function() {
|
9708 | console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments));
|
9709 | };
|
9710 |
|
9711 |
|
9712 | /**
|
9713 | * Inherit the prototype methods from one constructor into another.
|
9714 | *
|
9715 | * The Function.prototype.inherits from lang.js rewritten as a standalone
|
9716 | * function (not on Function.prototype). NOTE: If this file is to be loaded
|
9717 | * during bootstrapping this function needs to be rewritten using some native
|
9718 | * functions as prototype setup using normal JavaScript does not work as
|
9719 | * expected during bootstrapping (see mirror.js in r114903).
|
9720 | *
|
9721 | * @param {function} ctor Constructor function which needs to inherit the
|
9722 | * prototype.
|
9723 | * @param {function} superCtor Constructor function to inherit prototype from.
|
9724 | */
|
9725 | exports.inherits = require('inherits');
|
9726 |
|
9727 | exports._extend = function(origin, add) {
|
9728 | // Don't do anything if add isn't an object
|
9729 | if (!add || !isObject(add)) return origin;
|
9730 |
|
9731 | var keys = Object.keys(add);
|
9732 | var i = keys.length;
|
9733 | while (i--) {
|
9734 | origin[keys[i]] = add[keys[i]];
|
9735 | }
|
9736 | return origin;
|
9737 | };
|
9738 |
|
9739 | function hasOwnProperty(obj, prop) {
|
9740 | return Object.prototype.hasOwnProperty.call(obj, prop);
|
9741 | }
|
9742 |
|
9743 | }).call(this,require("KliubH"),typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
9744 | },{"./support/isBuffer":101,"KliubH":91,"inherits":100}]},{},[83])
|
9745 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9samhhcmIvRHJvcGJveC9naXQvbGpoYXJiL3Rlc3RsaW5nLmdpdC9ub2RlX21vZHVsZXMvYnJvd3Nlci1wYWNrL19wcmVsdWRlLmpzIiwiL1VzZXJzL2xqaGFyYi9Ecm9wYm94L2dpdC9samhhcmIvdGFwZS5naXQvaW5kZXguanMiLCIvVXNlcnMvbGpoYXJiL0Ryb3Bib3gvZ2l0L2xqaGFyYi90YXBlLmdpdC9saWIvZGVmYXVsdF9zdHJlYW0uanMiLCIvVXNlcnMvbGpoYXJiL0Ryb3Bib3gvZ2l0L2xqaGFyYi90YXBlLmdpdC9saWIvcmVzdWx0cy5qcyIsIi9Vc2Vycy9samhhcmIvRHJvcGJveC9naXQvbGpoYXJiL3RhcGUuZ2l0L2xpYi90ZXN0LmpzIiwiL1VzZXJzL2xqaGFyYi9Ecm9wYm94L2dpdC9samhhcmIvdGFwZS5naXQvbm9kZV9tb2R1bGVzL2FycmF5LnByb3RvdHlwZS5ldmVyeS9pbXBsZW1lbnRhdGlvbi5qcyIsIi9Vc2Vycy9samhhcmIvRHJvcGJveC9naXQvbGpoYXJiL3RhcGUuZ2l0L25vZGVfbW9kdWxlcy9hcnJheS5wcm90b3R5cGUuZXZlcnkvaW5kZXguanMiLCIvVXNlcnMvbGpoYXJiL0Ryb3Bib3gvZ2l0L2xqaGFyYi90YXBlLmdpdC9ub2RlX21vZHVsZXMvYXJyYXkucHJvdG90eXBlLmV2ZXJ5L3BvbHlmaWxsLmpzIiwiL1VzZXJzL2xqaGFyYi9Ecm9wYm94L2dpdC9samhhcmIvdGFwZS5naXQvbm9kZV9tb2R1bGVzL2FycmF5LnByb3RvdHlwZS5ldmVyeS9zaGltLmpzIiwiL1VzZXJzL2xqaGFyYi9Ecm9wYm94L2dpdC9samhhcmIvdGFwZS5naXQvbm9kZV9tb2R1bGVzL2F2YWlsYWJsZS10eXBlZC1hcnJheXMvaW5kZXguanMiLCIvVXNlcnMvbGpoYXJiL0Ryb3Bib3gvZ2l0L2xqaGFyYi90YXBlLmdpdC9ub2RlX21vZHVsZXMvY2FsbC1iaW5kL2NhbGxCb3VuZC5qcyIsIi9Vc2Vycy9samhhcmIvRHJvcGJveC9naXQvbGpoYXJiL3RhcGUuZ2l0L25vZGVfbW9kdWxlcy9jYWxsLWJpbmQvaW5kZXguanMiLCIvVXNlcnMvbGpoYXJiL0Ryb3Bib3gvZ2l0L2xqaGFyYi90YXBlLmdpdC9ub2RlX21vZHVsZXMvZGVlcC1lcXVhbC9pbmRleC5qcyIsIi9Vc2Vycy9samhhcmIvRHJvcGJveC9naXQvbGpoYXJiL3RhcGUuZ2l0L25vZGVfbW9kdWxlcy9kZWZpbmUtcHJvcGVydGllcy9pbmRleC5qcyIsIi9Vc2Vycy9samhhcmIvRHJvcGJveC9naXQvbGpoYXJiL3RhcGUuZ2l0L25vZGVfbW9kdWxlcy9kZWZpbmVkL2luZGV4LmpzIiwiL1VzZXJzL2xqaGFyYi9Ecm9wYm94L2dpdC9samhhcmIvdGFwZS5naXQvbm9kZV9tb2R1bGVzL2VzLWFic3RyYWN0LzIwMjEvSXNDYWxsYWJsZS5qcyIsIi9Vc2Vycy9samhhcmIvRHJvcGJveC9naXQvbGpoYXJiL3RhcGUuZ2l0L25vZGVfbW9kdWxlcy9lcy1hYnN0cmFjdC8yMDIxL1JlcXVpcmVPYmplY3RDb2VyY2libGUuanMiLCIvVXNlcnMvbGpoYXJiL0Ryb3Bib3gvZ2l0L2xqaGFyYi90YXBlLmdpdC9ub2RlX21vZHVsZXMvZXMtYWJzdHJhY3QvMjAyMS9Ub051bWJlci5qcyIsIi9Vc2Vycy9samhhcmIvRHJvcGJveC9naXQvbGpoYXJiL3RhcGUuZ2l0L25vZGVfbW9kdWxlcy9lcy1hYnN0cmFjdC8yMDIxL1RvT2JqZWN0LmpzIiwiL1VzZXJzL2xqaGFyYi9Ecm9wYm94L2dpdC9samhhcmIvdGFwZS5naXQvbm9kZV9tb2R1bGVzL2VzLWFic3RyYWN0LzIwMjEvVG9QcmltaXRpdmUuanMiLCIvVXNlcnMvbGpoYXJiL0Ryb3Bib3gvZ2l0L2xqaGFyYi90YXBlLmdpdC9ub2RlX21vZHVsZXMvZXMtYWJzdHJhY3QvMjAyMS9Ub1N0cmluZy5qcyIsIi9Vc2Vycy9samhhcmIvRHJvcGJveC9naXQvbGpoYXJiL3RhcGUuZ2l0L25vZGVfbW9kdWxlcy9lcy1hYnN0cmFjdC8yMDIxL1RvVWludDMyLmpzIiwiL1VzZXJzL2xqaGFyYi9Ecm9wYm94L2dpdC9samhhcmIvdGFwZS5naXQvbm9kZV9tb2R1bGVzL2VzLWFic3RyYWN0LzUvQ2hlY2tPYmplY3RDb2VyY2libGUuanMiLCIvVXNlcnMvbGpoYXJiL0Ryb3Bib3gvZ2l0L2xqaGFyYi90YXBlLmdpdC9ub2RlX21vZHVsZXMvZXMtYWJzdHJhY3QvaGVscGVycy9nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IuanMiLCIvVXNlcnMvbGpoYXJiL0Ryb3Bib3gvZ2l0L2xqaGFyYi90YXBlLmdpdC9ub2RlX21vZHVsZXMvZXMtYWJzdHJhY3QvaGVscGVycy9pc1ByaW1pdGl2ZS5qcyIsIi9Vc2Vycy9samhhcmIvRHJvcGJveC9naXQvbGpoYXJiL3RhcGUuZ2l0L25vZGVfbW9kdWxlcy9lcy1hYnN0cmFjdC9oZWxwZXJzL3JlZ2V4VGVzdGVyLmpzIiwiL1VzZXJzL2xqaGFyYi9Ecm9wYm94L2dpdC9samhhcmIvdGFwZS5naXQvbm9kZV9tb2R1bGVzL2VzLWdldC1pdGVyYXRvci9pbmRleC5qcyIsIi9Vc2Vycy9samhhcmIvRHJvcGJveC9naXQvbGpoYXJiL3RhcGUuZ2l0L25vZGVfbW9kdWxlcy9lcy10by1wcmltaXRpdmUvZXMyMDE1LmpzIiwiL1VzZXJzL2xqaGFyYi9Ecm9wYm94L2dpdC9samhhcmIvdGFwZS5naXQvbm9kZV9tb2R1bGVzL2Zvci1lYWNoL2luZGV4LmpzIiwiL1VzZXJzL2xqaGFyYi9Ecm9wYm94L2dpdC9samhhcmIvdGFwZS5naXQvbm9kZV9tb2R1bGVzL2Z1bmN0aW9uLWJpbmQvaW1wbGVtZW50YXRpb24uanMiLCIvVXNlcnMvbGpoYXJiL0Ryb3Bib3gvZ2l0L2xqaGFyYi90YXBlLmdpdC9ub2RlX21vZHVsZXMvZnVuY3Rpb24tYmluZC9pbmRleC5qcyIsIi9Vc2Vycy9samhhcmIvRHJvcGJveC9naXQvbGpoYXJiL3RhcGUuZ2l0L25vZGVfbW9kdWxlcy9mdW5jdGlvbnMtaGF2ZS1uYW1lcy9pbmRleC5qcyIsIi9Vc2Vycy9samhhcmIvRHJvcGJveC9naXQvbGpoYXJiL3RhcGUuZ2l0L25vZGVfbW9kdWxlcy9nZXQtaW50cmluc2ljL2luZGV4LmpzIiwiL1VzZXJzL2xqaGFyYi9Ecm9wYm94L2dpdC9samhhcmIvdGFwZS5naXQvbm9kZV9tb2R1bGVzL2hhcy1iaWdpbnRzL2luZGV4LmpzIiwiL1VzZXJzL2xqaGFyYi9Ecm9wYm94L2dpdC9samhhcmIvdGFwZS5naXQvbm9kZV9tb2R1bGVzL2hhcy1wcm9wZXJ0eS1kZXNjcmlwdG9ycy9pbmRleC5qcyIsIi9Vc2Vycy9samhhcmIvRHJvcGJveC9naXQvbGpoYXJiL3RhcGUuZ2l0L25vZGVfbW9kdWxlcy9oYXMtc3ltYm9scy9pbmRleC5qcyIsIi9Vc2Vycy9samhhcmIvRHJvcGJveC9naXQvbGpoYXJiL3RhcGUuZ2l0L25vZGVfbW9kdWxlcy9oYXMtc3ltYm9scy9zaGFtcy5qcyIsIi9Vc2Vycy9samhhcmIvRHJvcGJveC9naXQvbGpoYXJiL3RhcGUuZ2l0L25vZGVfbW9kdWxlcy9oYXMtdG9zdHJpbmd0YWcvc2hhbXMuanMiLCIvVXNlcnMvbGpoYXJiL0Ryb3Bib3gvZ2l0L2xqaGFyYi90YXBlLmdpdC9ub2RlX21vZHVsZXMvaGFzL3NyYy9pbmRleC5qcyIsIi9Vc2Vycy9samhhcmIvRHJvcGJveC9naXQvbGpoYXJiL3RhcGUuZ2l0L25vZGVfbW9kdWxlcy9pbmhlcml0cy9pbmhlcml0c19icm93c2VyLmpzIiwiL1VzZXJzL2xqaGFyYi9Ecm9wYm94L2dpdC9samhhcmIvdGFwZS5naXQvbm9kZV9tb2R1bGVzL2lzLWFyZ3VtZW50cy9pbmRleC5qcyIsIi9Vc2Vycy9samhhcmIvRHJvcGJveC9naXQvbGpoYXJiL3RhcGUuZ2l0L25vZGVfbW9kdWxlcy9pcy1iaWdpbnQvaW5kZXguanMiLCIvVXNlcnMvbGpoYXJiL0Ryb3Bib3gvZ2l0L2xqaGFyYi90YXBlLmdpdC9ub2RlX21vZHVsZXMvaXMtYm9vbGVhbi1vYmplY3QvaW5kZXguanMiLCIvVXNlcnMvbGpoYXJiL0Ryb3Bib3gvZ2l0L2xqaGFyYi90YXBlLmdpdC9ub2RlX21vZHVsZXMvaXMtY2FsbGFibGUvaW5kZXguanMiLCIvVXNlcnMvbGpoYXJiL0Ryb3Bib3gvZ2l0L2xqaGFyYi90YXBlLmdpdC9ub2RlX21vZHVsZXMvaXMtZGF0ZS1vYmplY3QvaW5kZXguanMiLCIvVXNlcnMvbGpoYXJiL0Ryb3Bib3gvZ2l0L2xqaGFyYi90YXBlLmdpdC9ub2RlX21vZHVsZXMvaXMtbWFwL2luZGV4LmpzIiwiL1VzZXJzL2xqaGFyYi9Ecm9wYm94L2dpdC9samhhcmIvdGFwZS5naXQvbm9kZV9tb2R1bGVzL2lzLW51bWJlci1vYmplY3QvaW5kZXguanMiLCIvVXNlcnMvbGpoYXJiL0Ryb3Bib3gvZ2l0L2xqaGFyYi90YXBlLmdpdC9ub2RlX21vZHVsZXMvaXMtcmVnZXgvaW5kZXguanMiLCIvVXNlcnMvbGpoYXJiL0Ryb3Bib3gvZ2l0L2xqaGFyYi90YXBlLmdpdC9ub2RlX21vZHVsZXMvaXMtc2V0L2luZGV4LmpzIiwiL1VzZXJzL2xqaGFyYi9Ecm9wYm94L2dpdC9samhhcmIvdGFwZS5naXQvbm9kZV9tb2R1bGVzL2lzLXN0cmluZy9pbmRleC5qcyIsIi9Vc2Vycy9samhhcmIvRHJvcGJveC9naXQvbGpoYXJiL3RhcGUuZ2l0L25vZGVfbW9kdWxlcy9pcy1zeW1ib2wvaW5kZXguanMiLCIvVXNlcnMvbGpoYXJiL0Ryb3Bib3gvZ2l0L2xqaGFyYi90YXBlLmdpdC9ub2RlX21vZHVsZXMvaXMtdHlwZWQtYXJyYXkvaW5kZXguanMiLCIvVXNlcnMvbGpoYXJiL0Ryb3Bib3gvZ2l0L2xqaGFyYi90YXBlLmdpdC9ub2RlX21vZHVsZXMvaXMtd2Vha21hcC9pbmRleC5qcyIsIi9Vc2Vycy9samhhcmIvRHJvcGJveC9naXQvbGpoYXJiL3RhcGUuZ2l0L25vZGVfbW9kdWxlcy9pcy13ZWFrc2V0L2luZGV4LmpzIiwiL1VzZXJzL2xqaGFyYi9Ecm9wYm94L2dpdC9samhhcmIvdGFwZS5naXQvbm9kZV9tb2R1bGVzL2lzYXJyYXkvaW5kZXguanMiLCIvVXNlcnMvbGpoYXJiL0Ryb3Bib3gvZ2l0L2xqaGFyYi90YXBlLmdpdC9ub2RlX21vZHVsZXMvb2JqZWN0LWluc3BlY3QvaW5kZXguanMiLCIvVXNlcnMvbGpoYXJiL0Ryb3Bib3gvZ2l0L2xqaGFyYi90YXBlLmdpdC9ub2RlX21vZHVsZXMvb2JqZWN0LWluc3BlY3QvdXRpbC5pbnNwZWN0LmpzIiwiL1VzZXJzL2xqaGFyYi9Ecm9wYm94L2dpdC9samhhcmIvdGFwZS5naXQvbm9kZV9tb2R1bGVzL29iamVjdC1pcy9pbXBsZW1lbnRhdGlvbi5qcyIsIi9Vc2Vycy9samhhcmIvRHJvcGJveC9naXQvbGpoYXJiL3RhcGUuZ2l0L25vZGVfbW9kdWxlcy9vYmplY3QtaXMvaW5kZXguanMiLCIvVXNlcnMvbGpoYXJiL0Ryb3Bib3gvZ2l0L2xqaGFyYi90YXBlLmdpdC9ub2RlX21vZHVsZXMvb2JqZWN0LWlzL3BvbHlmaWxsLmpzIiwiL1VzZXJzL2xqaGFyYi9Ecm9wYm94L2dpdC9samhhcmIvdGFwZS5naXQvbm9kZV9tb2R1bGVzL29iamVjdC1pcy9zaGltLmpzIiwiL1VzZXJzL2xqaGFyYi9Ecm9wYm94L2dpdC9samhhcmIvdGFwZS5naXQvbm9kZV9tb2R1bGVzL29iamVjdC1rZXlzL2ltcGxlbWVudGF0aW9uLmpzIiwiL1VzZXJzL2xqaGFyYi9Ecm9wYm94L2dpdC9samhhcmIvdGFwZS5naXQvbm9kZV9tb2R1bGVzL29iamVjdC1rZXlzL2luZGV4LmpzIiwiL1VzZXJzL2xqaGFyYi9Ecm9wYm94L2dpdC9samhhcmIvdGFwZS5naXQvbm9kZV9tb2R1bGVzL29iamVjdC1rZXlzL2lzQXJndW1lbnRzLmpzIiwiL1VzZXJzL2xqaGFyYi9Ecm9wYm94L2dpdC9samhhcmIvdGFwZS5naXQvbm9kZV9tb2R1bGVzL29iamVjdC5hc3NpZ24vaW1wbGVtZW50YXRpb24uanMiLCIvVXNlcnMvbGpoYXJiL0Ryb3Bib3gvZ2l0L2xqaGFyYi90YXBlLmdpdC9ub2RlX21vZHVsZXMvb2JqZWN0LmFzc2lnbi9pbmRleC5qcyIsIi9Vc2Vycy9samhhcmIvRHJvcGJveC9naXQvbGpoYXJiL3RhcGUuZ2l0L25vZGVfbW9kdWxlcy9vYmplY3QuYXNzaWduL3BvbHlmaWxsLmpzIiwiL1VzZXJzL2xqaGFyYi9Ecm9wYm94L2dpdC9samhhcmIvdGFwZS5naXQvbm9kZV9tb2R1bGVzL29iamVjdC5hc3NpZ24vc2hpbS5qcyIsIi9Vc2Vycy9samhhcmIvRHJvcGJveC9naXQvbGpoYXJiL3RhcGUuZ2l0L25vZGVfbW9kdWxlcy9yZWdleHAucHJvdG90eXBlLmZsYWdzL2ltcGxlbWVudGF0aW9uLmpzIiwiL1VzZXJzL2xqaGFyYi9Ecm9wYm94L2dpdC9samhhcmIvdGFwZS5naXQvbm9kZV9tb2R1bGVzL3JlZ2V4cC5wcm90b3R5cGUuZmxhZ3MvaW5kZXguanMiLCIvVXNlcnMvbGpoYXJiL0Ryb3Bib3gvZ2l0L2xqaGFyYi90YXBlLmdpdC9ub2RlX21vZHVsZXMvcmVnZXhwLnByb3RvdHlwZS5mbGFncy9wb2x5ZmlsbC5qcyIsIi9Vc2Vycy9samhhcmIvRHJvcGJveC9naXQvbGpoYXJiL3RhcGUuZ2l0L25vZGVfbW9kdWxlcy9yZWdleHAucHJvdG90eXBlLmZsYWdzL3NoaW0uanMiLCIvVXNlcnMvbGpoYXJiL0Ryb3Bib3gvZ2l0L2xqaGFyYi90YXBlLmdpdC9ub2RlX21vZHVsZXMvcmVzdW1lci9pbmRleC5qcyIsIi9Vc2Vycy9samhhcmIvRHJvcGJveC9naXQvbGpoYXJiL3RhcGUuZ2l0L25vZGVfbW9kdWxlcy9zaWRlLWNoYW5uZWwvaW5kZXguanMiLCIvVXNlcnMvbGpoYXJiL0Ryb3Bib3gvZ2l0L2xqaGFyYi90YXBlLmdpdC9ub2RlX21vZHVsZXMvc3RyaW5nLnByb3RvdHlwZS50cmltL2ltcGxlbWVudGF0aW9uLmpzIiwiL1VzZXJzL2xqaGFyYi9Ecm9wYm94L2dpdC9samhhcmIvdGFwZS5naXQvbm9kZV9tb2R1bGVzL3N0cmluZy5wcm90b3R5cGUudHJpbS9pbmRleC5qcyIsIi9Vc2Vycy9samhhcmIvRHJvcGJveC9naXQvbGpoYXJiL3RhcGUuZ2l0L25vZGVfbW9kdWxlcy9zdHJpbmcucHJvdG90eXBlLnRyaW0vcG9seWZpbGwuanMiLCIvVXNlcnMvbGpoYXJiL0Ryb3Bib3gvZ2l0L2xqaGFyYi90YXBlLmdpdC9ub2RlX21vZHVsZXMvc3RyaW5nLnByb3RvdHlwZS50cmltL3NoaW0uanMiLCIvVXNlcnMvbGpoYXJiL0Ryb3Bib3gvZ2l0L2xqaGFyYi90YXBlLmdpdC9ub2RlX21vZHVsZXMvdGhyb3VnaC9pbmRleC5qcyIsIi9Vc2Vycy9samhhcmIvRHJvcGJveC9naXQvbGpoYXJiL3RhcGUuZ2l0L25vZGVfbW9kdWxlcy93aGljaC1ib3hlZC1wcmltaXRpdmUvaW5kZXguanMiLCIvVXNlcnMvbGpoYXJiL0Ryb3Bib3gvZ2l0L2xqaGFyYi90YXBlLmdpdC9ub2RlX21vZHVsZXMvd2hpY2gtY29sbGVjdGlvbi9pbmRleC5qcyIsIi9Vc2Vycy9samhhcmIvRHJvcGJveC9naXQvbGpoYXJiL3RhcGUuZ2l0L25vZGVfbW9kdWxlcy93aGljaC10eXBlZC1hcnJheS9pbmRleC5qcyIsIi9Vc2Vycy9samhhcmIvRHJvcGJveC9naXQvbGpoYXJiL3RhcGUuZ2l0L3Rlc3QvYnJvd3Nlci9hc3NlcnRzLmpzIiwiL1VzZXJzL2xqaGFyYi9Ecm9wYm94L2dpdC9samhhcmIvdGVzdGxpbmcuZ2l0L25vZGVfbW9kdWxlcy9iYXNlNjQtanMvbGliL2I2NC5qcyIsIi9Vc2Vycy9samhhcmIvRHJvcGJveC9naXQvbGpoYXJiL3Rlc3RsaW5nLmdpdC9ub2RlX21vZHVsZXMvYnJvd3Nlci1yZXNvbHZlL2VtcHR5LmpzIiwiL1VzZXJzL2xqaGFyYi9Ecm9wYm94L2dpdC9samhhcmIvdGVzdGxpbmcuZ2l0L25vZGVfbW9kdWxlcy9idWZmZXIvaW5kZXguanMiLCIvVXNlcnMvbGpoYXJiL0Ryb3Bib3gvZ2l0L2xqaGFyYi90ZXN0bGluZy5naXQvbm9kZV9tb2R1bGVzL2V2ZW50cy9ldmVudHMuanMiLCIvVXNlcnMvbGpoYXJiL0Ryb3Bib3gvZ2l0L2xqaGFyYi90ZXN0bGluZy5naXQvbm9kZV9tb2R1bGVzL2llZWU3NTQvaW5kZXguanMiLCIvVXNlcnMvbGpoYXJiL0Ryb3Bib3gvZ2l0L2xqaGFyYi90ZXN0bGluZy5naXQvbm9kZV9tb2R1bGVzL3BhdGgtYnJvd3NlcmlmeS9pbmRleC5qcyIsIi9Vc2Vycy9samhhcmIvRHJvcGJveC9naXQvbGpoYXJiL3Rlc3RsaW5nLmdpdC9ub2RlX21vZHVsZXMvcHJvY2Vzcy9icm93c2VyLmpzIiwiL1VzZXJzL2xqaGFyYi9Ecm9wYm94L2dpdC9samhhcmIvdGVzdGxpbmcuZ2l0L25vZGVfbW9kdWxlcy9zdHJlYW0tYnJvd3NlcmlmeS9kdXBsZXguanMiLCIvVXNlcnMvbGpoYXJiL0Ryb3Bib3gvZ2l0L2xqaGFyYi90ZXN0bGluZy5naXQvbm9kZV9tb2R1bGVzL3N0cmVhbS1icm93c2VyaWZ5L2luZGV4LmpzIiwiL1VzZXJzL2xqaGFyYi9Ecm9wYm94L2dpdC9samhhcmIvdGVzdGxpbmcuZ2l0L25vZGVfbW9kdWxlcy9zdHJlYW0tYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvcHJvY2Vzcy9icm93c2VyLmpzIiwiL1VzZXJzL2xqaGFyYi9Ecm9wYm94L2dpdC9samhhcmIvdGVzdGxpbmcuZ2l0L25vZGVfbW9kdWxlcy9zdHJlYW0tYnJvd3NlcmlmeS9wYXNzdGhyb3VnaC5qcyIsIi9Vc2Vycy9samhhcmIvRHJvcGJveC9naXQvbGpoYXJiL3Rlc3RsaW5nLmdpdC9ub2RlX21vZHVsZXMvc3RyZWFtLWJyb3dzZXJpZnkvcmVhZGFibGUuanMiLCIvVXNlcnMvbGpoYXJiL0Ryb3Bib3gvZ2l0L2xqaGFyYi90ZXN0bGluZy5naXQvbm9kZV9tb2R1bGVzL3N0cmVhbS1icm93c2VyaWZ5L3RyYW5zZm9ybS5qcyIsIi9Vc2Vycy9samhhcmIvRHJvcGJveC9naXQvbGpoYXJiL3Rlc3RsaW5nLmdpdC9ub2RlX21vZHVsZXMvc3RyZWFtLWJyb3dzZXJpZnkvd3JpdGFibGUuanMiLCIvVXNlcnMvbGpoYXJiL0Ryb3Bib3gvZ2l0L2xqaGFyYi90ZXN0bGluZy5naXQvbm9kZV9tb2R1bGVzL3N0cmluZ19kZWNvZGVyL2luZGV4LmpzIiwiL1VzZXJzL2xqaGFyYi9Ecm9wYm94L2dpdC9samhhcmIvdGVzdGxpbmcuZ2l0L25vZGVfbW9kdWxlcy91dGlsL25vZGVfbW9kdWxlcy9pbmhlcml0cy9pbmhlcml0c19icm93c2VyLmpzIiwiL1VzZXJzL2xqaGFyYi9Ecm9wYm94L2dpdC9samhhcmIvdGVzdGxpbmcuZ2l0L25vZGVfbW9kdWxlcy91dGlsL3N1cHBvcnQvaXNCdWZmZXJCcm93c2VyLmpzIiwiL1VzZXJzL2xqaGFyYi9Ecm9wYm94L2dpdC9samhhcmIvdGVzdGxpbmcuZ2l0L25vZGVfbW9kdWxlcy91dGlsL3V0aWwuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2TEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1T0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2p4QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25DQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNmQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNmQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxV0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9DQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0xBO0FBQ0E7QUFDQTtBQUNBOztBQ0hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNkQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNmQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDVEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQzNFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxVUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNWQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNiQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25DQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoZ0JBO0FBQ0E7O0FDREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNkQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNkQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNYQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVIQTs7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcmxDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdTQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ3BGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hUQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdjZCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1TUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xZQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gZSh0LG4scil7ZnVuY3Rpb24gcyhvLHUpe2lmKCFuW29dKXtpZighdFtvXSl7dmFyIGE9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtpZighdSYmYSlyZXR1cm4gYShvLCEwKTtpZihpKXJldHVybiBpKG8sITApO3Rocm93IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIrbytcIidcIil9dmFyIGY9bltvXT17ZXhwb3J0czp7fX07dFtvXVswXS5jYWxsKGYuZXhwb3J0cyxmdW5jdGlvbihlKXt2YXIgbj10W29dWzFdW2VdO3JldHVybiBzKG4/bjplKX0sZixmLmV4cG9ydHMsZSx0LG4scil9cmV0dXJuIG5bb10uZXhwb3J0c312YXIgaT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2Zvcih2YXIgbz0wO288ci5sZW5ndGg7bysrKXMocltvXSk7cmV0dXJuIHN9KSIsIihmdW5jdGlvbiAocHJvY2Vzcyl7XG4ndXNlIHN0cmljdCc7XG5cbnZhciBkZWZpbmVkID0gcmVxdWlyZSgnZGVmaW5lZCcpO1xudmFyIGNyZWF0ZURlZmF1bHRTdHJlYW0gPSByZXF1aXJlKCcuL2xpYi9kZWZhdWx0X3N0cmVhbScpO1xudmFyIFRlc3QgPSByZXF1aXJlKCcuL2xpYi90ZXN0Jyk7XG52YXIgY3JlYXRlUmVzdWx0ID0gcmVxdWlyZSgnLi9saWIvcmVzdWx0cycpO1xudmFyIHRocm91Z2ggPSByZXF1aXJlKCd0aHJvdWdoJyk7XG5cbnZhciBjYW5FbWl0RXhpdCA9IHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiBwcm9jZXNzXG4gICAgJiYgdHlwZW9mIHByb2Nlc3Mub24gPT09ICdmdW5jdGlvbicgJiYgcHJvY2Vzcy5icm93c2VyICE9PSB0cnVlO1xudmFyIGNhbkV4aXQgPSB0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYgcHJvY2Vzc1xuICAgICYmIHR5cGVvZiBwcm9jZXNzLmV4aXQgPT09ICdmdW5jdGlvbic7XG5cbm1vZHVsZS5leHBvcnRzID0gKGZ1bmN0aW9uICgpIHtcblx0dmFyIHdhaXQgPSBmYWxzZTtcblx0dmFyIGhhcm5lc3M7XG5cblx0ZnVuY3Rpb24gZ2V0SGFybmVzcyhvcHRzKSB7XG5cdFx0aWYgKCFvcHRzKSB7IG9wdHMgPSB7fTsgfVxuXHRcdG9wdHMuYXV0b2Nsb3NlID0gIWNhbkVtaXRFeGl0O1xuXHRcdC8vIHRoaXMgb3ZlcnJpZGUgaXMgaGVyZSBzaW5jZSB0ZXN0cyBmYWlsIHZpYSBueWMgaWYgY3JlYXRlSGFybmVzcyBpcyBtb3ZlZCB1cHdhcmRzXG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lXG5cdFx0aWYgKCFoYXJuZXNzKSB7IGhhcm5lc3MgPSBjcmVhdGVFeGl0SGFybmVzcyhvcHRzLCB3YWl0KTsgfVxuXHRcdHJldHVybiBoYXJuZXNzO1xuXHR9XG5cblx0ZnVuY3Rpb24gbGF6eUxvYWQoKSB7XG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWludmFsaWQtdGhpc1xuXHRcdHJldHVybiBnZXRIYXJuZXNzKCkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblx0fVxuXG5cdGxhenlMb2FkLndhaXQgPSBmdW5jdGlvbiAoKSB7XG5cdFx0d2FpdCA9IHRydWU7XG5cdH07XG5cblx0bGF6eUxvYWQucnVuID0gZnVuY3Rpb24gKCkge1xuXHRcdHZhciBydW4gPSBnZXRIYXJuZXNzKCkucnVuO1xuXG5cdFx0aWYgKHJ1bikgeyBydW4oKTsgfVxuXHR9O1xuXG5cdGxhenlMb2FkLm9ubHkgPSBmdW5jdGlvbiAoKSB7XG5cdFx0cmV0dXJuIGdldEhhcm5lc3MoKS5vbmx5LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cdH07XG5cblx0bGF6eUxvYWQuY3JlYXRlU3RyZWFtID0gZnVuY3Rpb24gKG9wdHMpIHtcblx0XHR2YXIgb3B0aW9ucyA9IG9wdHMgfHwge307XG5cdFx0aWYgKCFoYXJuZXNzKSB7XG5cdFx0XHR2YXIgb3V0cHV0ID0gdGhyb3VnaCgpO1xuXHRcdFx0Z2V0SGFybmVzcyh7IHN0cmVhbTogb3V0cHV0LCBvYmplY3RNb2RlOiBvcHRpb25zLm9iamVjdE1vZGUgfSk7XG5cdFx0XHRyZXR1cm4gb3V0cHV0O1xuXHRcdH1cblx0XHRyZXR1cm4gaGFybmVzcy5jcmVhdGVTdHJlYW0ob3B0aW9ucyk7XG5cdH07XG5cblx0bGF6eUxvYWQub25GaW5pc2ggPSBmdW5jdGlvbiAoKSB7XG5cdFx0cmV0dXJuIGdldEhhcm5lc3MoKS5vbkZpbmlzaC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXHR9O1xuXG5cdGxhenlMb2FkLm9uRmFpbHVyZSA9IGZ1bmN0aW9uICgpIHtcblx0XHRyZXR1cm4gZ2V0SGFybmVzcygpLm9uRmFpbHVyZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXHR9O1xuXG5cdGxhenlMb2FkLmdldEhhcm5lc3MgPSBnZXRIYXJuZXNzO1xuXG5cdHJldHVybiBsYXp5TG9hZDtcbn0oKSk7XG5cbmZ1bmN0aW9uIGNyZWF0ZUhhcm5lc3MoY29uZl8pIHtcblx0dmFyIHJlc3VsdHMgPSBjcmVhdGVSZXN1bHQoKTtcblx0aWYgKCFjb25mXyB8fCBjb25mXy5hdXRvY2xvc2UgIT09IGZhbHNlKSB7XG5cdFx0cmVzdWx0cy5vbmNlKCdkb25lJywgZnVuY3Rpb24gKCkgeyByZXN1bHRzLmNsb3NlKCk7IH0pO1xuXHR9XG5cblx0ZnVuY3Rpb24gdGVzdChuYW1lLCBjb25mLCBjYikge1xuXHRcdHZhciB0ID0gbmV3IFRlc3QobmFtZSwgY29uZiwgY2IpO1xuXHRcdHRlc3QuX3Rlc3RzLnB1c2godCk7XG5cblx0XHQoZnVuY3Rpb24gaW5zcGVjdENvZGUoc3QpIHtcblx0XHRcdHN0Lm9uKCd0ZXN0JywgZnVuY3Rpb24gc3ViKHN0Xykge1xuXHRcdFx0XHRpbnNwZWN0Q29kZShzdF8pO1xuXHRcdFx0fSk7XG5cdFx0XHRzdC5vbigncmVzdWx0JywgZnVuY3Rpb24gKHIpIHtcblx0XHRcdFx0aWYgKCFyLnRvZG8gJiYgIXIub2sgJiYgdHlwZW9mIHIgIT09ICdzdHJpbmcnKSB7IHRlc3QuX2V4aXRDb2RlID0gMTsgfVxuXHRcdFx0fSk7XG5cdFx0fSh0KSk7XG5cblx0XHRyZXN1bHRzLnB1c2godCk7XG5cdFx0cmV0dXJuIHQ7XG5cdH1cblx0dGVzdC5fcmVzdWx0cyA9IHJlc3VsdHM7XG5cblx0dGVzdC5fdGVzdHMgPSBbXTtcblxuXHR0ZXN0LmNyZWF0ZVN0cmVhbSA9IGZ1bmN0aW9uIChvcHRzKSB7XG5cdFx0cmV0dXJuIHJlc3VsdHMuY3JlYXRlU3RyZWFtKG9wdHMpO1xuXHR9O1xuXG5cdHRlc3Qub25GaW5pc2ggPSBmdW5jdGlvbiAoY2IpIHtcblx0XHRyZXN1bHRzLm9uKCdkb25lJywgY2IpO1xuXHR9O1xuXG5cdHRlc3Qub25GYWlsdXJlID0gZnVuY3Rpb24gKGNiKSB7XG5cdFx0cmVzdWx0cy5vbignZmFpbCcsIGNiKTtcblx0fTtcblxuXHR2YXIgb25seSA9IGZhbHNlO1xuXHR0ZXN0Lm9ubHkgPSBmdW5jdGlvbiAoKSB7XG5cdFx0aWYgKG9ubHkpIHsgdGhyb3cgbmV3IEVycm9yKCd0aGVyZSBjYW4gb25seSBiZSBvbmUgb25seSB0ZXN0Jyk7IH1cblx0XHRpZiAoY29uZl8ubm9Pbmx5KSB7IHRocm93IG5ldyBFcnJvcignYG9ubHlgIHRlc3RzIGFyZSBwcm9oaWJpdGVkJyk7IH1cblx0XHRvbmx5ID0gdHJ1ZTtcblx0XHR2YXIgdCA9IHRlc3QuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcblx0XHRyZXN1bHRzLm9ubHkodCk7XG5cdFx0cmV0dXJuIHQ7XG5cdH07XG5cdHRlc3QuX2V4aXRDb2RlID0gMDtcblxuXHR0ZXN0LmNsb3NlID0gZnVuY3Rpb24gKCkgeyByZXN1bHRzLmNsb3NlKCk7IH07XG5cblx0cmV0dXJuIHRlc3Q7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUV4aXRIYXJuZXNzKGNvbmYsIHdhaXQpIHtcblx0dmFyIGNvbmZpZyA9IGNvbmYgfHwge307XG5cdHZhciBoYXJuZXNzID0gY3JlYXRlSGFybmVzcyh7XG5cdFx0YXV0b2Nsb3NlOiBkZWZpbmVkKGNvbmZpZy5hdXRvY2xvc2UsIGZhbHNlKSxcblx0XHRub09ubHk6IGRlZmluZWQoY29uZi5ub09ubHksIGRlZmluZWQocHJvY2Vzcy5lbnYuTk9ERV9UQVBFX05PX09OTFlfVEVTVCwgZmFsc2UpKVxuXHR9KTtcblx0dmFyIHJ1bm5pbmcgPSBmYWxzZTtcblx0dmFyIGVuZGVkID0gZmFsc2U7XG5cblx0ZnVuY3Rpb24gcnVuKCkge1xuXHRcdGlmIChydW5uaW5nKSB7IHJldHVybjsgfVxuXHRcdHJ1bm5pbmcgPSB0cnVlO1xuXHRcdHZhciBzdHJlYW0gPSBoYXJuZXNzLmNyZWF0ZVN0cmVhbSh7IG9iamVjdE1vZGU6IGNvbmZpZy5vYmplY3RNb2RlIH0pO1xuXHRcdHZhciBlcyA9IHN0cmVhbS5waXBlKGNvbmZpZy5zdHJlYW0gfHwgY3JlYXRlRGVmYXVsdFN0cmVhbSgpKTtcblx0XHRpZiAoY2FuRW1pdEV4aXQgJiYgZXMpIHsgLy8gaW4gbm9kZSB2MC40LCBgZXNgIGlzIGB1bmRlZmluZWRgXG5cdFx0XHQvLyBUT0RPOiB1c2UgYGVycmAgYXJnP1xuXHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG5cdFx0XHRlcy5vbignZXJyb3InLCBmdW5jdGlvbiAoZXJyKSB7IGhhcm5lc3MuX2V4aXRDb2RlID0gMTsgfSk7XG5cdFx0fVxuXHRcdHN0cmVhbS5vbignZW5kJywgZnVuY3Rpb24gKCkgeyBlbmRlZCA9IHRydWU7IH0pO1xuXHR9XG5cblx0aWYgKHdhaXQpIHtcblx0XHRoYXJuZXNzLnJ1biA9IHJ1bjtcblx0fSBlbHNlIHtcblx0XHRydW4oKTtcblx0fVxuXG5cdGlmIChjb25maWcuZXhpdCA9PT0gZmFsc2UpIHsgcmV0dXJuIGhhcm5lc3M7IH1cblx0aWYgKCFjYW5FbWl0RXhpdCB8fCAhY2FuRXhpdCkgeyByZXR1cm4gaGFybmVzczsgfVxuXG5cdHByb2Nlc3Mub24oJ2V4aXQnLCBmdW5jdGlvbiAoY29kZSkge1xuXHRcdC8vIGxldCB0aGUgcHJvY2VzcyBleGl0IGNsZWFubHkuXG5cdFx0aWYgKHR5cGVvZiBjb2RlID09PSAnbnVtYmVyJyAmJiBjb2RlICE9PSAwKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKCFlbmRlZCkge1xuXHRcdFx0dmFyIG9ubHkgPSBoYXJuZXNzLl9yZXN1bHRzLl9vbmx5O1xuXHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBoYXJuZXNzLl90ZXN0cy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHR2YXIgdCA9IGhhcm5lc3MuX3Rlc3RzW2ldO1xuXHRcdFx0XHRpZiAoIW9ubHkgfHwgdCA9PT0gb25seSkge1xuXHRcdFx0XHRcdHQuX2V4aXQoKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRoYXJuZXNzLmNsb3NlKCk7XG5cblx0XHRwcm9jZXNzLnJlbW92ZUFsbExpc3RlbmVycygnZXhpdCcpOyAvLyBuZWNlc3NhcnkgZm9yIG5vZGUgdjAuNlxuXHRcdHByb2Nlc3MuZXhpdChjb2RlIHx8IGhhcm5lc3MuX2V4aXRDb2RlKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wcm9jZXNzLWV4aXRcblx0fSk7XG5cblx0cmV0dXJuIGhhcm5lc3M7XG59XG5cbm1vZHVsZS5leHBvcnRzLmNyZWF0ZUhhcm5lc3MgPSBjcmVhdGVIYXJuZXNzO1xubW9kdWxlLmV4cG9ydHMuVGVzdCA9IFRlc3Q7XG5tb2R1bGUuZXhwb3J0cy50ZXN0ID0gbW9kdWxlLmV4cG9ydHM7IC8vIHRhcCBjb21wYXRcbm1vZHVsZS5leHBvcnRzLnRlc3Quc2tpcCA9IFRlc3Quc2tpcDtcblxufSkuY2FsbCh0aGlzLHJlcXVpcmUoXCJLbGl1YkhcIikpIiwiKGZ1bmN0aW9uIChwcm9jZXNzKXtcbid1c2Ugc3RyaWN0JztcblxudmFyIHRocm91Z2ggPSByZXF1aXJlKCd0aHJvdWdoJyk7XG52YXIgZnMgPSByZXF1aXJlKCdmcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHtcblx0dmFyIGxpbmUgPSAnJztcblx0dmFyIHN0cmVhbSA9IHRocm91Z2god3JpdGUsIGZsdXNoKTtcblx0cmV0dXJuIHN0cmVhbTtcblxuXHRmdW5jdGlvbiB3cml0ZShidWYpIHtcblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGJ1Zi5sZW5ndGg7IGkrKykge1xuXHRcdFx0dmFyIGMgPSB0eXBlb2YgYnVmID09PSAnc3RyaW5nJ1xuXHRcdFx0XHQ/IGJ1Zi5jaGFyQXQoaSlcblx0XHRcdFx0OiBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ1ZltpXSk7XG5cdFx0XHRpZiAoYyA9PT0gJ1xcbicpIHtcblx0XHRcdFx0Zmx1c2goKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGxpbmUgKz0gYztcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRmdW5jdGlvbiBmbHVzaCgpIHtcblx0XHRpZiAoZnMud3JpdGVTeW5jICYmICgvXndpbi8pLnRlc3QocHJvY2Vzcy5wbGF0Zm9ybSkpIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGZzLndyaXRlU3luYygxLCBsaW5lICsgJ1xcbicpO1xuXHRcdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0XHRzdHJlYW0uZW1pdCgnZXJyb3InLCBlKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0Y29uc29sZS5sb2cobGluZSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tY29uc29sZVxuXHRcdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0XHRzdHJlYW0uZW1pdCgnZXJyb3InLCBlKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0bGluZSA9ICcnO1xuXHR9XG59O1xuXG59KS5jYWxsKHRoaXMscmVxdWlyZShcIktsaXViSFwiKSkiLCIoZnVuY3Rpb24gKHByb2Nlc3Mpe1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgZGVmaW5lZCA9IHJlcXVpcmUoJ2RlZmluZWQnKTtcbnZhciBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXI7XG52YXIgaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xudmFyIHRocm91Z2ggPSByZXF1aXJlKCd0aHJvdWdoJyk7XG52YXIgcmVzdW1lciA9IHJlcXVpcmUoJ3Jlc3VtZXInKTtcbnZhciBpbnNwZWN0ID0gcmVxdWlyZSgnb2JqZWN0LWluc3BlY3QnKTtcbnZhciBjYWxsQm91bmQgPSByZXF1aXJlKCdjYWxsLWJpbmQvY2FsbEJvdW5kJyk7XG52YXIgaGFzID0gcmVxdWlyZSgnaGFzJyk7XG52YXIgJGV4ZWMgPSBjYWxsQm91bmQoJ1JlZ0V4cC5wcm90b3R5cGUuZXhlYycpO1xudmFyICRzcGxpdCA9IGNhbGxCb3VuZCgnU3RyaW5nLnByb3RvdHlwZS5zcGxpdCcpO1xudmFyICRyZXBsYWNlID0gY2FsbEJvdW5kKCdTdHJpbmcucHJvdG90eXBlLnJlcGxhY2UnKTtcbnZhciAkc2hpZnQgPSBjYWxsQm91bmQoJ0FycmF5LnByb3RvdHlwZS5zaGlmdCcpO1xudmFyICRwdXNoID0gY2FsbEJvdW5kKCdBcnJheS5wcm90b3R5cGUucHVzaCcpO1xudmFyIHlhbWxJbmRpY2F0b3JzID0gLzp8LXxcXD8vO1xudmFyIG5leHRUaWNrID0gdHlwZW9mIHNldEltbWVkaWF0ZSAhPT0gJ3VuZGVmaW5lZCdcblx0PyBzZXRJbW1lZGlhdGVcblx0OiBwcm9jZXNzLm5leHRUaWNrO1xuXG5mdW5jdGlvbiBjb2FsZXNjZVdoaXRlU3BhY2VzKHN0cikge1xuXHRyZXR1cm4gJHJlcGxhY2UoU3RyaW5nKHN0ciksIC9cXHMrL2csICcgJyk7XG59XG5cbmZ1bmN0aW9uIGdldE5leHRUZXN0KHJlc3VsdHMpIHtcblx0aWYgKCFyZXN1bHRzLl9vbmx5KSB7XG5cdFx0cmV0dXJuICRzaGlmdChyZXN1bHRzLnRlc3RzKTtcblx0fVxuXG5cdGRvIHtcblx0XHR2YXIgdCA9ICRzaGlmdChyZXN1bHRzLnRlc3RzKTtcblx0XHRpZiAodCAmJiByZXN1bHRzLl9vbmx5ID09PSB0KSB7XG5cdFx0XHRyZXR1cm4gdDtcblx0XHR9XG5cdH0gd2hpbGUgKHJlc3VsdHMudGVzdHMubGVuZ3RoICE9PSAwKTtcblxuXHRyZXR1cm4gdm9pZCB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGludmFsaWRZYW1sKHN0cikge1xuXHRyZXR1cm4gJGV4ZWMoeWFtbEluZGljYXRvcnMsIHN0cikgIT09IG51bGw7XG59XG5cbmZ1bmN0aW9uIGVuY29kZVJlc3VsdChyZXMsIGNvdW50KSB7XG5cdHZhciBvdXRwdXQgPSAnJztcblx0b3V0cHV0ICs9IChyZXMub2sgPyAnb2sgJyA6ICdub3Qgb2sgJykgKyBjb3VudDtcblx0b3V0cHV0ICs9IHJlcy5uYW1lID8gJyAnICsgY29hbGVzY2VXaGl0ZVNwYWNlcyhyZXMubmFtZSkgOiAnJztcblxuXHRpZiAocmVzLnNraXApIHtcblx0XHRvdXRwdXQgKz0gJyAjIFNLSVAnICsgKHR5cGVvZiByZXMuc2tpcCA9PT0gJ3N0cmluZycgPyAnICcgKyBjb2FsZXNjZVdoaXRlU3BhY2VzKHJlcy5za2lwKSA6ICcnKTtcblx0fSBlbHNlIGlmIChyZXMudG9kbykge1xuXHRcdG91dHB1dCArPSAnICMgVE9ETycgKyAodHlwZW9mIHJlcy50b2RvID09PSAnc3RyaW5nJyA/ICcgJyArIGNvYWxlc2NlV2hpdGVTcGFjZXMocmVzLnRvZG8pIDogJycpO1xuXHR9XG5cblx0b3V0cHV0ICs9ICdcXG4nO1xuXHRpZiAocmVzLm9rKSB7IHJldHVybiBvdXRwdXQ7IH1cblxuXHR2YXIgb3V0ZXIgPSAnICAnO1xuXHR2YXIgaW5uZXIgPSBvdXRlciArICcgICc7XG5cdG91dHB1dCArPSBvdXRlciArICctLS1cXG4nO1xuXHRvdXRwdXQgKz0gaW5uZXIgKyAnb3BlcmF0b3I6ICcgKyByZXMub3BlcmF0b3IgKyAnXFxuJztcblxuXHRpZiAoaGFzKHJlcywgJ2V4cGVjdGVkJykgfHwgaGFzKHJlcywgJ2FjdHVhbCcpKSB7XG5cdFx0dmFyIGV4ID0gaW5zcGVjdChyZXMuZXhwZWN0ZWQsIHsgZGVwdGg6IHJlcy5vYmplY3RQcmludERlcHRoIH0pO1xuXHRcdHZhciBhYyA9IGluc3BlY3QocmVzLmFjdHVhbCwgeyBkZXB0aDogcmVzLm9iamVjdFByaW50RGVwdGggfSk7XG5cblx0XHRpZiAoTWF0aC5tYXgoZXgubGVuZ3RoLCBhYy5sZW5ndGgpID4gNjUgfHwgaW52YWxpZFlhbWwoZXgpIHx8IGludmFsaWRZYW1sKGFjKSkge1xuXHRcdFx0b3V0cHV0ICs9IGlubmVyICsgJ2V4cGVjdGVkOiB8LVxcbicgKyBpbm5lciArICcgICcgKyBleCArICdcXG4nO1xuXHRcdFx0b3V0cHV0ICs9IGlubmVyICsgJ2FjdHVhbDogfC1cXG4nICsgaW5uZXIgKyAnICAnICsgYWMgKyAnXFxuJztcblx0XHR9IGVsc2Uge1xuXHRcdFx0b3V0cHV0ICs9IGlubmVyICsgJ2V4cGVjdGVkOiAnICsgZXggKyAnXFxuJztcblx0XHRcdG91dHB1dCArPSBpbm5lciArICdhY3R1YWw6ICAgJyArIGFjICsgJ1xcbic7XG5cdFx0fVxuXHR9XG5cdGlmIChyZXMuYXQpIHtcblx0XHRvdXRwdXQgKz0gaW5uZXIgKyAnYXQ6ICcgKyByZXMuYXQgKyAnXFxuJztcblx0fVxuXG5cdHZhciBhY3R1YWxTdGFjayA9IHJlcy5hY3R1YWwgJiYgKHR5cGVvZiByZXMuYWN0dWFsID09PSAnb2JqZWN0JyB8fCB0eXBlb2YgcmVzLmFjdHVhbCA9PT0gJ2Z1bmN0aW9uJykgPyByZXMuYWN0dWFsLnN0YWNrIDogdW5kZWZpbmVkO1xuXHR2YXIgZXJyb3JTdGFjayA9IHJlcy5lcnJvciAmJiByZXMuZXJyb3Iuc3RhY2s7XG5cdHZhciBzdGFjayA9IGRlZmluZWQoYWN0dWFsU3RhY2ssIGVycm9yU3RhY2spO1xuXHRpZiAoc3RhY2spIHtcblx0XHR2YXIgbGluZXMgPSAkc3BsaXQoU3RyaW5nKHN0YWNrKSwgJ1xcbicpO1xuXHRcdG91dHB1dCArPSBpbm5lciArICdzdGFjazogfC1cXG4nO1xuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdG91dHB1dCArPSBpbm5lciArICcgICcgKyBsaW5lc1tpXSArICdcXG4nO1xuXHRcdH1cblx0fVxuXG5cdG91dHB1dCArPSBvdXRlciArICcuLi5cXG4nO1xuXHRyZXR1cm4gb3V0cHV0O1xufVxuXG5mdW5jdGlvbiBSZXN1bHRzKCkge1xuXHRpZiAoISh0aGlzIGluc3RhbmNlb2YgUmVzdWx0cykpIHsgcmV0dXJuIG5ldyBSZXN1bHRzKCk7IH1cblx0dGhpcy5jb3VudCA9IDA7XG5cdHRoaXMuZmFpbCA9IDA7XG5cdHRoaXMucGFzcyA9IDA7XG5cdHRoaXMudG9kbyA9IDA7XG5cdHRoaXMuX3N0cmVhbSA9IHRocm91Z2goKTtcblx0dGhpcy50ZXN0cyA9IFtdO1xuXHR0aGlzLl9vbmx5ID0gbnVsbDtcblx0dGhpcy5faXNSdW5uaW5nID0gZmFsc2U7XG59XG5cbmluaGVyaXRzKFJlc3VsdHMsIEV2ZW50RW1pdHRlcik7XG5cblJlc3VsdHMucHJvdG90eXBlLmNyZWF0ZVN0cmVhbSA9IGZ1bmN0aW9uIChvcHRzKSB7XG5cdGlmICghb3B0cykgeyBvcHRzID0ge307IH1cblx0dmFyIHNlbGYgPSB0aGlzO1xuXHR2YXIgb3V0cHV0O1xuXHR2YXIgdGVzdElkID0gMDtcblx0aWYgKG9wdHMub2JqZWN0TW9kZSkge1xuXHRcdG91dHB1dCA9IHRocm91Z2goKTtcblx0XHRzZWxmLm9uKCdfcHVzaCcsIGZ1bmN0aW9uIG9udGVzdCh0LCBleHRyYSkge1xuXHRcdFx0aWYgKCFleHRyYSkgeyBleHRyYSA9IHt9OyB9XG5cdFx0XHR2YXIgaWQgPSB0ZXN0SWQrKztcblx0XHRcdHQub25jZSgncHJlcnVuJywgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHR2YXIgcm93ID0ge1xuXHRcdFx0XHRcdHR5cGU6ICd0ZXN0Jyxcblx0XHRcdFx0XHRuYW1lOiB0Lm5hbWUsXG5cdFx0XHRcdFx0aWQ6IGlkLFxuXHRcdFx0XHRcdHNraXA6IHQuX3NraXAsXG5cdFx0XHRcdFx0dG9kbzogdC5fdG9kb1xuXHRcdFx0XHR9O1xuXHRcdFx0XHRpZiAoaGFzKGV4dHJhLCAncGFyZW50JykpIHtcblx0XHRcdFx0XHRyb3cucGFyZW50ID0gZXh0cmEucGFyZW50O1xuXHRcdFx0XHR9XG5cdFx0XHRcdG91dHB1dC5xdWV1ZShyb3cpO1xuXHRcdFx0fSk7XG5cdFx0XHR0Lm9uKCd0ZXN0JywgZnVuY3Rpb24gKHN0KSB7XG5cdFx0XHRcdG9udGVzdChzdCwgeyBwYXJlbnQ6IGlkIH0pO1xuXHRcdFx0fSk7XG5cdFx0XHR0Lm9uKCdyZXN1bHQnLCBmdW5jdGlvbiAocmVzKSB7XG5cdFx0XHRcdGlmIChyZXMgJiYgdHlwZW9mIHJlcyA9PT0gJ29iamVjdCcpIHtcblx0XHRcdFx0XHRyZXMudGVzdCA9IGlkO1xuXHRcdFx0XHRcdHJlcy50eXBlID0gJ2Fzc2VydCc7XG5cdFx0XHRcdH1cblx0XHRcdFx0b3V0cHV0LnF1ZXVlKHJlcyk7XG5cdFx0XHR9KTtcblx0XHRcdHQub24oJ2VuZCcsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0b3V0cHV0LnF1ZXVlKHsgdHlwZTogJ2VuZCcsIHRlc3Q6IGlkIH0pO1xuXHRcdFx0fSk7XG5cdFx0fSk7XG5cdFx0c2VsZi5vbignZG9uZScsIGZ1bmN0aW9uICgpIHsgb3V0cHV0LnF1ZXVlKG51bGwpOyB9KTtcblx0fSBlbHNlIHtcblx0XHRvdXRwdXQgPSByZXN1bWVyKCk7XG5cdFx0b3V0cHV0LnF1ZXVlKCdUQVAgdmVyc2lvbiAxM1xcbicpO1xuXHRcdHNlbGYuX3N0cmVhbS5waXBlKG91dHB1dCk7XG5cdH1cblxuXHRpZiAoIXRoaXMuX2lzUnVubmluZykge1xuXHRcdHRoaXMuX2lzUnVubmluZyA9IHRydWU7XG5cdFx0bmV4dFRpY2soZnVuY3Rpb24gbmV4dCgpIHtcblx0XHRcdHZhciB0O1xuXHRcdFx0d2hpbGUgKHQgPSBnZXROZXh0VGVzdChzZWxmKSkge1xuXHRcdFx0XHR0LnJ1bigpO1xuXHRcdFx0XHRpZiAoIXQuZW5kZWQpIHtcblx0XHRcdFx0XHR0Lm9uY2UoJ2VuZCcsIGZ1bmN0aW9uICgpIHsgbmV4dFRpY2sobmV4dCk7IH0pO1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0c2VsZi5lbWl0KCdkb25lJyk7XG5cdFx0fSk7XG5cdH1cblxuXHRyZXR1cm4gb3V0cHV0O1xufTtcblxuUmVzdWx0cy5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uICh0KSB7XG5cdHZhciBzZWxmID0gdGhpcztcblx0JHB1c2goc2VsZi50ZXN0cywgdCk7XG5cdHNlbGYuX3dhdGNoKHQpO1xuXHRzZWxmLmVtaXQoJ19wdXNoJywgdCk7XG59O1xuXG5SZXN1bHRzLnByb3RvdHlwZS5vbmx5ID0gZnVuY3Rpb24gKHQpIHtcblx0dGhpcy5fb25seSA9IHQ7XG59O1xuXG5SZXN1bHRzLnByb3RvdHlwZS5fd2F0Y2ggPSBmdW5jdGlvbiAodCkge1xuXHR2YXIgc2VsZiA9IHRoaXM7XG5cdGZ1bmN0aW9uIHdyaXRlKHMpIHsgc2VsZi5fc3RyZWFtLnF1ZXVlKHMpOyB9XG5cblx0dC5vbmNlKCdwcmVydW4nLCBmdW5jdGlvbiAoKSB7XG5cdFx0dmFyIHByZW1zZyA9ICcnO1xuXHRcdGlmICh0Ll9za2lwKSB7XG5cdFx0XHRwcmVtc2cgPSAnU0tJUCAnO1xuXHRcdH0gZWxzZSBpZiAodC5fdG9kbykge1xuXHRcdFx0cHJlbXNnID0gJ1RPRE8gJztcblx0XHR9XG5cdFx0d3JpdGUoJyMgJyArIHByZW1zZyArIGNvYWxlc2NlV2hpdGVTcGFjZXModC5uYW1lKSArICdcXG4nKTtcblx0fSk7XG5cblx0dC5vbigncmVzdWx0JywgZnVuY3Rpb24gKHJlcykge1xuXHRcdGlmICh0eXBlb2YgcmVzID09PSAnc3RyaW5nJykge1xuXHRcdFx0d3JpdGUoJyMgJyArIHJlcyArICdcXG4nKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0d3JpdGUoZW5jb2RlUmVzdWx0KHJlcywgc2VsZi5jb3VudCArIDEpKTtcblx0XHRzZWxmLmNvdW50Kys7XG5cblx0XHRpZiAocmVzLm9rIHx8IHJlcy50b2RvKSB7XG5cdFx0XHRzZWxmLnBhc3MrKztcblx0XHR9IGVsc2Uge1xuXHRcdFx0c2VsZi5mYWlsKys7XG5cdFx0XHRzZWxmLmVtaXQoJ2ZhaWwnKTtcblx0XHR9XG5cdH0pO1xuXG5cdHQub24oJ3Rlc3QnLCBmdW5jdGlvbiAoc3QpIHsgc2VsZi5fd2F0Y2goc3QpOyB9KTtcbn07XG5cblJlc3VsdHMucHJvdG90eXBlLmNsb3NlID0gZnVuY3Rpb24gKCkge1xuXHR2YXIgc2VsZiA9IHRoaXM7XG5cdGlmIChzZWxmLmNsb3NlZCkgeyBzZWxmLl9zdHJlYW0uZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IoJ0FMUkVBRFkgQ0xPU0VEJykpOyB9XG5cdHNlbGYuY2xvc2VkID0gdHJ1ZTtcblxuXHRmdW5jdGlvbiB3cml0ZShzKSB7IHNlbGYuX3N0cmVhbS5xdWV1ZShzKTsgfVxuXG5cdHdyaXRlKCdcXG4xLi4nICsgc2VsZi5jb3VudCArICdcXG4nKTtcblx0d3JpdGUoJyMgdGVzdHMgJyArIHNlbGYuY291bnQgKyAnXFxuJyk7XG5cdHdyaXRlKCcjIHBhc3MgICcgKyAoc2VsZi5wYXNzICsgc2VsZi50b2RvKSArICdcXG4nKTtcblx0aWYgKHNlbGYudG9kbykgeyB3cml0ZSgnIyB0b2RvICAnICsgc2VsZi50b2RvICsgJ1xcbicpOyB9XG5cdGlmIChzZWxmLmZhaWwpIHtcblx0XHR3cml0ZSgnIyBmYWlsICAnICsgc2VsZi5mYWlsICsgJ1xcbicpO1xuXHR9IGVsc2Uge1xuXHRcdHdyaXRlKCdcXG4jIG9rXFxuJyk7XG5cdH1cblxuXHRzZWxmLl9zdHJlYW0ucXVldWUobnVsbCk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlc3VsdHM7XG5cbn0pLmNhbGwodGhpcyxyZXF1aXJlKFwiS2xpdWJIXCIpKSIsIihmdW5jdGlvbiAocHJvY2VzcyxfX2Rpcm5hbWUpe1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgZGVlcEVxdWFsID0gcmVxdWlyZSgnZGVlcC1lcXVhbCcpO1xudmFyIGRlZmluZWQgPSByZXF1aXJlKCdkZWZpbmVkJyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKTtcbnZhciBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG52YXIgRXZlbnRFbWl0dGVyID0gcmVxdWlyZSgnZXZlbnRzJykuRXZlbnRFbWl0dGVyO1xudmFyIGhhcyA9IHJlcXVpcmUoJ2hhcycpO1xudmFyIGlzUmVnRXhwID0gcmVxdWlyZSgnaXMtcmVnZXgnKTtcbnZhciB0cmltID0gcmVxdWlyZSgnc3RyaW5nLnByb3RvdHlwZS50cmltJyk7XG52YXIgY2FsbEJvdW5kID0gcmVxdWlyZSgnY2FsbC1iaW5kL2NhbGxCb3VuZCcpO1xudmFyIGZvckVhY2ggPSByZXF1aXJlKCdmb3ItZWFjaCcpO1xudmFyIGluc3BlY3QgPSByZXF1aXJlKCdvYmplY3QtaW5zcGVjdCcpO1xudmFyIGlzID0gcmVxdWlyZSgnb2JqZWN0LWlzJyk7XG52YXIgb2JqZWN0S2V5cyA9IHJlcXVpcmUoJ29iamVjdC1rZXlzJyk7XG52YXIgZXZlcnkgPSByZXF1aXJlKCdhcnJheS5wcm90b3R5cGUuZXZlcnknKTtcblxudmFyIGlzRW51bWVyYWJsZSA9IGNhbGxCb3VuZCgnT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZScpO1xudmFyIHRvTG93ZXJDYXNlID0gY2FsbEJvdW5kKCdTdHJpbmcucHJvdG90eXBlLnRvTG93ZXJDYXNlJyk7XG52YXIgaXNQcm90byA9IGNhbGxCb3VuZCgnT2JqZWN0LnByb3RvdHlwZS5pc1Byb3RvdHlwZU9mJyk7XG52YXIgJGV4ZWMgPSBjYWxsQm91bmQoJ1JlZ0V4cC5wcm90b3R5cGUuZXhlYycpO1xudmFyIG9iamVjdFRvU3RyaW5nID0gY2FsbEJvdW5kKCdPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nJyk7XG52YXIgJHNwbGl0ID0gY2FsbEJvdW5kKCdTdHJpbmcucHJvdG90eXBlLnNwbGl0Jyk7XG52YXIgJHJlcGxhY2UgPSBjYWxsQm91bmQoJ1N0cmluZy5wcm90b3R5cGUucmVwbGFjZScpO1xudmFyICRzdHJTbGljZSA9IGNhbGxCb3VuZCgnU3RyaW5nLnByb3RvdHlwZS5zbGljZScpO1xudmFyICRwdXNoID0gY2FsbEJvdW5kKCdBcnJheS5wcm90b3R5cGUucHVzaCcpO1xudmFyICRzaGlmdCA9IGNhbGxCb3VuZCgnQXJyYXkucHJvdG90eXBlLnNoaWZ0Jyk7XG5cbnZhciBuZXh0VGljayA9IHR5cGVvZiBzZXRJbW1lZGlhdGUgIT09ICd1bmRlZmluZWQnXG5cdD8gc2V0SW1tZWRpYXRlXG5cdDogcHJvY2Vzcy5uZXh0VGljaztcbnZhciBzYWZlU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG52YXIgc2FmZUNsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG5mdW5jdGlvbiBnZXRUZXN0QXJncyhuYW1lXywgb3B0c18sIGNiXykge1xuXHR2YXIgbmFtZSA9ICcoYW5vbnltb3VzKSc7XG5cdHZhciBvcHRzID0ge307XG5cdHZhciBjYjtcblxuXHRmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuXHRcdHZhciBhcmcgPSBhcmd1bWVudHNbaV07XG5cdFx0dmFyIHQgPSB0eXBlb2YgYXJnO1xuXHRcdGlmICh0ID09PSAnc3RyaW5nJykge1xuXHRcdFx0bmFtZSA9IGFyZztcblx0XHR9IGVsc2UgaWYgKHQgPT09ICdvYmplY3QnKSB7XG5cdFx0XHRvcHRzID0gYXJnIHx8IG9wdHM7XG5cdFx0fSBlbHNlIGlmICh0ID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRjYiA9IGFyZztcblx0XHR9XG5cdH1cblx0cmV0dXJuIHtcblx0XHRuYW1lOiBuYW1lLFxuXHRcdG9wdHM6IG9wdHMsXG5cdFx0Y2I6IGNiXG5cdH07XG59XG5cbmZ1bmN0aW9uIFRlc3QobmFtZV8sIG9wdHNfLCBjYl8pIHtcblx0aWYgKCEodGhpcyBpbnN0YW5jZW9mIFRlc3QpKSB7XG5cdFx0cmV0dXJuIG5ldyBUZXN0KG5hbWVfLCBvcHRzXywgY2JfKTtcblx0fVxuXG5cdHZhciBhcmdzID0gZ2V0VGVzdEFyZ3MobmFtZV8sIG9wdHNfLCBjYl8pO1xuXG5cdHRoaXMucmVhZGFibGUgPSB0cnVlO1xuXHR0aGlzLm5hbWUgPSBhcmdzLm5hbWUgfHwgJyhhbm9ueW1vdXMpJztcblx0dGhpcy5hc3NlcnRDb3VudCA9IDA7XG5cdHRoaXMucGVuZGluZ0NvdW50ID0gMDtcblx0dGhpcy5fc2tpcCA9IGFyZ3Mub3B0cy5za2lwIHx8IGZhbHNlO1xuXHR0aGlzLl90b2RvID0gYXJncy5vcHRzLnRvZG8gfHwgZmFsc2U7XG5cdHRoaXMuX3RpbWVvdXQgPSBhcmdzLm9wdHMudGltZW91dDtcblx0dGhpcy5fcGxhbiA9IHVuZGVmaW5lZDtcblx0dGhpcy5fY2IgPSBhcmdzLmNiO1xuXHR0aGlzLl9wcm9nZW55ID0gW107XG5cdHRoaXMuX3RlYXJkb3duID0gW107XG5cdHRoaXMuX29rID0gdHJ1ZTtcblx0dmFyIGRlcHRoRW52VmFyID0gcHJvY2Vzcy5lbnYuTk9ERV9UQVBFX09CSkVDVF9QUklOVF9ERVBUSDtcblx0aWYgKGFyZ3Mub3B0cy5vYmplY3RQcmludERlcHRoKSB7XG5cdFx0dGhpcy5fb2JqZWN0UHJpbnREZXB0aCA9IGFyZ3Mub3B0cy5vYmplY3RQcmludERlcHRoO1xuXHR9IGVsc2UgaWYgKGRlcHRoRW52VmFyKSB7XG5cdFx0aWYgKHRvTG93ZXJDYXNlKGRlcHRoRW52VmFyKSA9PT0gJ2luZmluaXR5Jykge1xuXHRcdFx0dGhpcy5fb2JqZWN0UHJpbnREZXB0aCA9IEluZmluaXR5O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLl9vYmplY3RQcmludERlcHRoID0gZGVwdGhFbnZWYXI7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdHRoaXMuX29iamVjdFByaW50RGVwdGggPSA1O1xuXHR9XG5cblx0Zm9yICh2YXIgcHJvcCBpbiB0aGlzKSB7XG5cdFx0dGhpc1twcm9wXSA9IChmdW5jdGlvbiBiaW5kKHNlbGYsIHZhbCkge1xuXHRcdFx0aWYgKHR5cGVvZiB2YWwgPT09ICdmdW5jdGlvbicpIHtcblx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uIGJvdW5kKCkge1xuXHRcdFx0XHRcdHJldHVybiB2YWwuYXBwbHkoc2VsZiwgYXJndW1lbnRzKTtcblx0XHRcdFx0fTtcblx0XHRcdH1cblx0XHRcdHJldHVybiB2YWw7XG5cdFx0fSh0aGlzLCB0aGlzW3Byb3BdKSk7XG5cdH1cbn1cblxuaW5oZXJpdHMoVGVzdCwgRXZlbnRFbWl0dGVyKTtcblxuVGVzdC5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gcnVuKCkge1xuXHR0aGlzLmVtaXQoJ3ByZXJ1bicpO1xuXHRpZiAoIXRoaXMuX2NiIHx8IHRoaXMuX3NraXApIHtcblx0XHR0aGlzLl9lbmQoKTtcblx0XHRyZXR1cm47XG5cdH1cblx0aWYgKHRoaXMuX3RpbWVvdXQgIT0gbnVsbCkge1xuXHRcdHRoaXMudGltZW91dEFmdGVyKHRoaXMuX3RpbWVvdXQpO1xuXHR9XG5cblx0dmFyIGNhbGxiYWNrUmV0dXJuID0gdGhpcy5fY2IodGhpcyk7XG5cblx0aWYgKFxuXHRcdHR5cGVvZiBQcm9taXNlID09PSAnZnVuY3Rpb24nXG4gICAgICAgICYmIGNhbGxiYWNrUmV0dXJuXG4gICAgICAgICYmIHR5cGVvZiBjYWxsYmFja1JldHVybi50aGVuID09PSAnZnVuY3Rpb24nXG5cdCkge1xuXHRcdHZhciBzZWxmID0gdGhpcztcblx0XHRQcm9taXNlLnJlc29sdmUoY2FsbGJhY2tSZXR1cm4pLnRoZW4oZnVuY3Rpb24gb25SZXNvbHZlKCkge1xuXHRcdFx0aWYgKCFzZWxmLmNhbGxlZEVuZCkge1xuXHRcdFx0XHRzZWxmLmVuZCgpO1xuXHRcdFx0fVxuXHRcdH0pWydjYXRjaCddKGZ1bmN0aW9uIG9uRXJyb3IoZXJyKSB7XG5cdFx0XHRpZiAoZXJyIGluc3RhbmNlb2YgRXJyb3IgfHwgb2JqZWN0VG9TdHJpbmcoZXJyKSA9PT0gJ1tvYmplY3QgRXJyb3JdJykge1xuXHRcdFx0XHRzZWxmLmlmRXJyb3IoZXJyKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHNlbGYuZmFpbChlcnIpO1xuXHRcdFx0fVxuXHRcdFx0c2VsZi5lbmQoKTtcblx0XHR9KTtcblx0XHRyZXR1cm47XG5cdH1cblxuXHR0aGlzLmVtaXQoJ3J1bicpO1xufTtcblxuVGVzdC5wcm90b3R5cGUudGVzdCA9IGZ1bmN0aW9uIHRlc3QobmFtZSwgb3B0cywgY2IpIHtcblx0dmFyIHNlbGYgPSB0aGlzO1xuXHR2YXIgdCA9IG5ldyBUZXN0KG5hbWUsIG9wdHMsIGNiKTtcblx0JHB1c2godGhpcy5fcHJvZ2VueSwgdCk7XG5cdHRoaXMucGVuZGluZ0NvdW50Kys7XG5cdHRoaXMuZW1pdCgndGVzdCcsIHQpO1xuXHR0Lm9uKCdwcmVydW4nLCBmdW5jdGlvbiAoKSB7XG5cdFx0c2VsZi5hc3NlcnRDb3VudCsrO1xuXHR9KTtcblxuXHRpZiAoIXNlbGYuX3BlbmRpbmdBc3NlcnRzKCkpIHtcblx0XHRuZXh0VGljayhmdW5jdGlvbiAoKSB7XG5cdFx0XHRzZWxmLl9lbmQoKTtcblx0XHR9KTtcblx0fVxuXG5cdG5leHRUaWNrKGZ1bmN0aW9uICgpIHtcblx0XHRpZiAoIXNlbGYuX3BsYW4gJiYgc2VsZi5wZW5kaW5nQ291bnQgPT0gc2VsZi5fcHJvZ2VueS5sZW5ndGgpIHtcblx0XHRcdHNlbGYuX2VuZCgpO1xuXHRcdH1cblx0fSk7XG59O1xuXG5UZXN0LnByb3RvdHlwZS5jb21tZW50ID0gZnVuY3Rpb24gY29tbWVudChtc2cpIHtcblx0dmFyIHRoYXQgPSB0aGlzO1xuXHRmb3JFYWNoKCRzcGxpdCh0cmltKG1zZyksICdcXG4nKSwgZnVuY3Rpb24gKGFNc2cpIHtcblx0XHR0aGF0LmVtaXQoJ3Jlc3VsdCcsICRyZXBsYWNlKHRyaW0oYU1zZyksIC9eI1xccyovLCAnJykpO1xuXHR9KTtcbn07XG5cblRlc3QucHJvdG90eXBlLnBsYW4gPSBmdW5jdGlvbiBwbGFuKG4pIHtcblx0dGhpcy5fcGxhbiA9IG47XG5cdHRoaXMuZW1pdCgncGxhbicsIG4pO1xufTtcblxuVGVzdC5wcm90b3R5cGUudGltZW91dEFmdGVyID0gZnVuY3Rpb24gdGltZW91dEFmdGVyKG1zKSB7XG5cdGlmICghbXMpIHsgdGhyb3cgbmV3IEVycm9yKCd0aW1lb3V0QWZ0ZXIgcmVxdWlyZXMgYSB0aW1lc3BhbicpOyB9XG5cdHZhciBzZWxmID0gdGhpcztcblx0dmFyIHRpbWVvdXQgPSBzYWZlU2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG5cdFx0c2VsZi5mYWlsKHNlbGYubmFtZSArICcgdGltZWQgb3V0IGFmdGVyICcgKyBtcyArICdtcycpO1xuXHRcdHNlbGYuZW5kKCk7XG5cdH0sIG1zKTtcblx0dGhpcy5vbmNlKCdlbmQnLCBmdW5jdGlvbiAoKSB7XG5cdFx0c2FmZUNsZWFyVGltZW91dCh0aW1lb3V0KTtcblx0fSk7XG59O1xuXG5UZXN0LnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbiBlbmQoZXJyKSB7XG5cdGlmIChhcmd1bWVudHMubGVuZ3RoID49IDEgJiYgISFlcnIpIHtcblx0XHR0aGlzLmlmRXJyb3IoZXJyKTtcblx0fVxuXG5cdGlmICh0aGlzLmNhbGxlZEVuZCkge1xuXHRcdHRoaXMuZmFpbCgnLmVuZCgpIGFscmVhZHkgY2FsbGVkJyk7XG5cdH1cblx0dGhpcy5jYWxsZWRFbmQgPSB0cnVlO1xuXHR0aGlzLl9lbmQoKTtcbn07XG5cblRlc3QucHJvdG90eXBlLnRlYXJkb3duID0gZnVuY3Rpb24gdGVhcmRvd24oZm4pIHtcblx0aWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykge1xuXHRcdHRoaXMuZmFpbCgndGVhcmRvd246ICcgKyBpbnNwZWN0KGZuKSArICcgaXMgbm90IGEgZnVuY3Rpb24nKTtcblx0fSBlbHNlIHtcblx0XHR0aGlzLl90ZWFyZG93bi5wdXNoKGZuKTtcblx0fVxufTtcblxuVGVzdC5wcm90b3R5cGUuX2VuZCA9IGZ1bmN0aW9uIF9lbmQoZXJyKSB7XG5cdHZhciBzZWxmID0gdGhpcztcblxuXHRpZiAoIXRoaXMuX2NiICYmICF0aGlzLl90b2RvICYmICF0aGlzLl9za2lwKSB7XG5cdFx0dGhpcy5mYWlsKCcjIFRPRE8gJyArIHRoaXMubmFtZSk7XG5cdH1cblxuXHRpZiAodGhpcy5fcHJvZ2VueS5sZW5ndGgpIHtcblx0XHR2YXIgdCA9ICRzaGlmdCh0aGlzLl9wcm9nZW55KTtcblx0XHR0Lm9uKCdlbmQnLCBmdW5jdGlvbiAoKSB7IHNlbGYuX2VuZCgpOyB9KTtcblx0XHR0LnJ1bigpO1xuXHRcdHJldHVybjtcblx0fVxuXG5cdGZ1bmN0aW9uIGNvbXBsZXRlRW5kKCkge1xuXHRcdGlmICghc2VsZi5lbmRlZCkgeyBzZWxmLmVtaXQoJ2VuZCcpOyB9XG5cdFx0dmFyIHBlbmRpbmdBc3NlcnRzID0gc2VsZi5fcGVuZGluZ0Fzc2VydHMoKTtcblx0XHRpZiAoIXNlbGYuX3BsYW5FcnJvciAmJiBzZWxmLl9wbGFuICE9PSB1bmRlZmluZWQgJiYgcGVuZGluZ0Fzc2VydHMpIHtcblx0XHRcdHNlbGYuX3BsYW5FcnJvciA9IHRydWU7XG5cdFx0XHRzZWxmLmZhaWwoJ3BsYW4gIT0gY291bnQnLCB7XG5cdFx0XHRcdGV4cGVjdGVkOiBzZWxmLl9wbGFuLFxuXHRcdFx0XHRhY3R1YWw6IHNlbGYuYXNzZXJ0Q291bnRcblx0XHRcdH0pO1xuXHRcdH1cblx0XHRzZWxmLmVuZGVkID0gdHJ1ZTtcblx0fVxuXG5cdGZ1bmN0aW9uIG5leHQoKSB7XG5cdFx0aWYgKHNlbGYuX3RlYXJkb3duLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0Y29tcGxldGVFbmQoKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0dmFyIGZuID0gc2VsZi5fdGVhcmRvd24uc2hpZnQoKTtcblx0XHR2YXIgcmVzO1xuXHRcdHRyeSB7XG5cdFx0XHRyZXMgPSBmbigpO1xuXHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdHNlbGYuZmFpbChlKTtcblx0XHR9XG5cdFx0aWYgKHJlcyAmJiB0eXBlb2YgcmVzLnRoZW4gPT09ICdmdW5jdGlvbicpIHtcblx0XHRcdHJlcy50aGVuKG5leHQsIGZ1bmN0aW9uIChfZXJyKSB7XG5cdFx0XHRcdC8vIFRPRE86IHd0aD9cblx0XHRcdFx0ZXJyID0gZXJyIHx8IF9lcnI7XG5cdFx0XHR9KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bmV4dCgpO1xuXHRcdH1cblx0fVxuXG5cdG5leHQoKTtcbn07XG5cblRlc3QucHJvdG90eXBlLl9leGl0ID0gZnVuY3Rpb24gX2V4aXQoKSB7XG5cdGlmICh0aGlzLl9wbGFuICE9PSB1bmRlZmluZWQgJiYgIXRoaXMuX3BsYW5FcnJvciAmJiB0aGlzLmFzc2VydENvdW50ICE9PSB0aGlzLl9wbGFuKSB7XG5cdFx0dGhpcy5fcGxhbkVycm9yID0gdHJ1ZTtcblx0XHR0aGlzLmZhaWwoJ3BsYW4gIT0gY291bnQnLCB7XG5cdFx0XHRleHBlY3RlZDogdGhpcy5fcGxhbixcblx0XHRcdGFjdHVhbDogdGhpcy5hc3NlcnRDb3VudCxcblx0XHRcdGV4aXRpbmc6IHRydWVcblx0XHR9KTtcblx0fSBlbHNlIGlmICghdGhpcy5lbmRlZCkge1xuXHRcdHRoaXMuZmFpbCgndGVzdCBleGl0ZWQgd2l0aG91dCBlbmRpbmc6ICcgKyB0aGlzLm5hbWUsIHtcblx0XHRcdGV4aXRpbmc6IHRydWVcblx0XHR9KTtcblx0fVxufTtcblxuVGVzdC5wcm90b3R5cGUuX3BlbmRpbmdBc3NlcnRzID0gZnVuY3Rpb24gX3BlbmRpbmdBc3NlcnRzKCkge1xuXHRpZiAodGhpcy5fcGxhbiA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIDE7XG5cdH1cblx0cmV0dXJuIHRoaXMuX3BsYW4gLSAodGhpcy5fcHJvZ2VueS5sZW5ndGggKyB0aGlzLmFzc2VydENvdW50KTtcbn07XG5cblRlc3QucHJvdG90eXBlLl9hc3NlcnQgPSBmdW5jdGlvbiBhc3NlcnQob2ssIG9wdHMpIHtcblx0dmFyIHNlbGYgPSB0aGlzO1xuXHR2YXIgZXh0cmEgPSBvcHRzLmV4dHJhIHx8IHt9O1xuXG5cdG9rID0gISFvayB8fCAhIWV4dHJhLnNraXA7XG5cblx0dmFyIG5hbWUgPSBkZWZpbmVkKGV4dHJhLm1lc3NhZ2UsIG9wdHMubWVzc2FnZSwgJyh1bm5hbWVkIGFzc2VydCknKTtcblx0aWYgKHRoaXMuY2FsbGVkRW5kICYmIG9wdHMub3BlcmF0b3IgIT09ICdmYWlsJykge1xuXHRcdHRoaXMuZmFpbCgnLmVuZCgpIGFscmVhZHkgY2FsbGVkOiAnICsgbmFtZSk7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0dmFyIHJlcyA9IHtcblx0XHRpZDogc2VsZi5hc3NlcnRDb3VudCsrLFxuXHRcdG9rOiBvayxcblx0XHRza2lwOiBkZWZpbmVkKGV4dHJhLnNraXAsIG9wdHMuc2tpcCksXG5cdFx0dG9kbzogZGVmaW5lZChleHRyYS50b2RvLCBvcHRzLnRvZG8sIHNlbGYuX3RvZG8pLFxuXHRcdG5hbWU6IG5hbWUsXG5cdFx0b3BlcmF0b3I6IGRlZmluZWQoZXh0cmEub3BlcmF0b3IsIG9wdHMub3BlcmF0b3IpLFxuXHRcdG9iamVjdFByaW50RGVwdGg6IHNlbGYuX29iamVjdFByaW50RGVwdGhcblx0fTtcblx0aWYgKGhhcyhvcHRzLCAnYWN0dWFsJykgfHwgaGFzKGV4dHJhLCAnYWN0dWFsJykpIHtcblx0XHRyZXMuYWN0dWFsID0gZGVmaW5lZChleHRyYS5hY3R1YWwsIG9wdHMuYWN0dWFsKTtcblx0fVxuXHRpZiAoaGFzKG9wdHMsICdleHBlY3RlZCcpIHx8IGhhcyhleHRyYSwgJ2V4cGVjdGVkJykpIHtcblx0XHRyZXMuZXhwZWN0ZWQgPSBkZWZpbmVkKGV4dHJhLmV4cGVjdGVkLCBvcHRzLmV4cGVjdGVkKTtcblx0fVxuXHR0aGlzLl9vayA9ICEhKHRoaXMuX29rICYmIG9rKTtcblxuXHRpZiAoIW9rICYmICFyZXMudG9kbykge1xuXHRcdHJlcy5lcnJvciA9IGRlZmluZWQoZXh0cmEuZXJyb3IsIG9wdHMuZXJyb3IsIG5ldyBFcnJvcihyZXMubmFtZSkpO1xuXHR9XG5cblx0aWYgKCFvaykge1xuXHRcdHZhciBlID0gbmV3IEVycm9yKCdleGNlcHRpb24nKTtcblx0XHR2YXIgZXJyID0gJHNwbGl0KGUuc3RhY2sgfHwgJycsICdcXG4nKTtcblx0XHR2YXIgZGlyID0gX19kaXJuYW1lICsgcGF0aC5zZXA7XG5cblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGVyci5sZW5ndGg7IGkrKykge1xuXHRcdFx0LypcbiAgICAgICAgICAgICAgICBTdGFjayB0cmFjZSBsaW5lcyBtYXkgcmVzZW1ibGUgb25lIG9mIHRoZSBmb2xsb3dpbmcuIFdlIG5lZWRcbiAgICAgICAgICAgICAgICB0byBjb3JyZWN0bHkgZXh0cmFjdCBhIGZ1bmN0aW9uIG5hbWUgKGlmIGFueSkgYW5kIHBhdGggLyBsaW5lXG4gICAgICAgICAgICAgICAgbnVtYmVyIGZvciBlYWNoIGxpbmUuXG5cbiAgICAgICAgICAgICAgICAgICAgYXQgbXlGdW5jdGlvbiAoL3BhdGgvdG8vZmlsZS5qczoxMjM6NDUpXG4gICAgICAgICAgICAgICAgICAgIGF0IG15RnVuY3Rpb24gKC9wYXRoL3RvL2ZpbGUub3RoZXItZXh0OjEyMzo0NSlcbiAgICAgICAgICAgICAgICAgICAgYXQgbXlGdW5jdGlvbiAoL3BhdGggdG8vZmlsZS5qczoxMjM6NDUpXG4gICAgICAgICAgICAgICAgICAgIGF0IG15RnVuY3Rpb24gKEM6XFxwYXRoXFx0b1xcZmlsZS5qczoxMjM6NDUpXG4gICAgICAgICAgICAgICAgICAgIGF0IG15RnVuY3Rpb24gKC9wYXRoL3RvL2ZpbGUuanM6MTIzKVxuICAgICAgICAgICAgICAgICAgICBhdCBUZXN0Ljxhbm9ueW1vdXM+ICgvcGF0aC90by9maWxlLmpzOjEyMzo0NSlcbiAgICAgICAgICAgICAgICAgICAgYXQgVGVzdC5ib3VuZCBbYXMgcnVuXSAoL3BhdGgvdG8vZmlsZS5qczoxMjM6NDUpXG4gICAgICAgICAgICAgICAgICAgIGF0IC9wYXRoL3RvL2ZpbGUuanM6MTIzOjQ1XG5cbiAgICAgICAgICAgICAgICBSZWdleCBoYXMgdGhyZWUgcGFydHMuIEZpcnN0IGlzIG5vbi1jYXB0dXJpbmcgZ3JvdXAgZm9yICdhdCAnXG4gICAgICAgICAgICAgICAgKHBsdXMgYW55dGhpbmcgcHJlY2VkaW5nIGl0KS5cblxuICAgICAgICAgICAgICAgICAgICAvXig/OlteXFxzXSpcXHMqXFxiYXRcXHMrKS9cblxuICAgICAgICAgICAgICAgIFNlY29uZCBjYXB0dXJlcyBmdW5jdGlvbiBjYWxsIGRlc2NyaXB0aW9uIChvcHRpb25hbCkuIFRoaXMgaXNcbiAgICAgICAgICAgICAgICBub3QgbmVjZXNzYXJpbHkgYSB2YWxpZCBKUyBmdW5jdGlvbiBuYW1lLCBidXQganVzdCB3aGF0IHRoZVxuICAgICAgICAgICAgICAgIHN0YWNrIHRyYWNlIGlzIHVzaW5nIHRvIHJlcHJlc2VudCBhIGZ1bmN0aW9uIGNhbGwuIEl0IG1heSBsb29rXG4gICAgICAgICAgICAgICAgbGlrZSBgPGFub255bW91cz5gIG9yICdUZXN0LmJvdW5kIFthcyBydW5dJy5cblxuICAgICAgICAgICAgICAgIEZvciBvdXIgcHVycG9zZXMsIHdlIGFzc3VtZSB0aGF0LCBpZiB0aGVyZSBpcyBhIGZ1bmN0aW9uXG4gICAgICAgICAgICAgICAgbmFtZSwgaXQncyBldmVyeXRoaW5nIGxlYWRpbmcgdXAgdG8gdGhlIGZpcnN0IG9wZW5cbiAgICAgICAgICAgICAgICBwYXJlbnRoZXNlcyAodHJpbW1lZCkgYmVmb3JlIG91ciBwYXRobmFtZS5cblxuICAgICAgICAgICAgICAgICAgICAvKD86KC4qKVxccytcXCgpPy9cblxuICAgICAgICAgICAgICAgIExhc3QgcGFydCBjYXB0dXJlcyBmaWxlIHBhdGggcGx1cyBsaW5lIG5vIChhbmQgb3B0aW9uYWxcbiAgICAgICAgICAgICAgICBjb2x1bW4gbm8pLlxuXG4gICAgICAgICAgICAgICAgICAgIC8oKD86XFwvfFthLXpBLVpdOlxcXFwpW146XFwpXSs6KFxcZCspKD86OihcXGQrKSk/KVxcKT8vXG4gICAgICAgICAgICAqL1xuXHRcdFx0dmFyIHJlID0gL14oPzpbXlxcc10qXFxzKlxcYmF0XFxzKykoPzooLiopXFxzK1xcKCk/KCg/OlxcL3xbYS16QS1aXTpcXFxcKVteOildKzooXFxkKykoPzo6KFxcZCspKT8pXFwpPyQvO1xuXHRcdFx0dmFyIGxpbmVXaXRoVG9rZW5zID0gJHJlcGxhY2UoJHJlcGxhY2UoZXJyW2ldLCBwcm9jZXNzLmN3ZCgpLCAnLyRDV0QnKSwgX19kaXJuYW1lLCAnLyRURVNUJyk7XG5cdFx0XHR2YXIgbSA9IHJlLmV4ZWMobGluZVdpdGhUb2tlbnMpO1xuXG5cdFx0XHRpZiAoIW0pIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdHZhciBjYWxsRGVzY3JpcHRpb24gPSBtWzFdIHx8ICc8YW5vbnltb3VzPic7XG5cdFx0XHR2YXIgZmlsZVBhdGggPSAkcmVwbGFjZSgkcmVwbGFjZShtWzJdLCAnLyRDV0QnLCBwcm9jZXNzLmN3ZCgpKSwgJy8kVEVTVCcsIF9fZGlybmFtZSk7XG5cblx0XHRcdGlmICgkc3RyU2xpY2UoZmlsZVBhdGgsIDAsIGRpci5sZW5ndGgpID09PSBkaXIpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEZ1bmN0aW9uIGNhbGwgZGVzY3JpcHRpb24gbWF5IG5vdCAoanVzdCkgYmUgYSBmdW5jdGlvbiBuYW1lLlxuXHRcdFx0Ly8gVHJ5IHRvIGV4dHJhY3QgZnVuY3Rpb24gbmFtZSBieSBsb29raW5nIGF0IGZpcnN0IFwid29yZFwiIG9ubHkuXG5cdFx0XHRyZXMuZnVuY3Rpb25OYW1lID0gJHNwbGl0KGNhbGxEZXNjcmlwdGlvbiwgL1xccysvKVswXTtcblx0XHRcdHJlcy5maWxlID0gZmlsZVBhdGg7XG5cdFx0XHRyZXMubGluZSA9IE51bWJlcihtWzNdKTtcblx0XHRcdGlmIChtWzRdKSB7IHJlcy5jb2x1bW4gPSBOdW1iZXIobVs0XSk7IH1cblxuXHRcdFx0cmVzLmF0ID0gY2FsbERlc2NyaXB0aW9uICsgJyAoJyArIGZpbGVQYXRoICsgJyknO1xuXHRcdFx0YnJlYWs7XG5cdFx0fVxuXHR9XG5cblx0c2VsZi5lbWl0KCdyZXN1bHQnLCByZXMpO1xuXG5cdHZhciBwZW5kaW5nQXNzZXJ0cyA9IHNlbGYuX3BlbmRpbmdBc3NlcnRzKCk7XG5cdGlmICghcGVuZGluZ0Fzc2VydHMpIHtcblx0XHRpZiAoZXh0cmEuZXhpdGluZykge1xuXHRcdFx0c2VsZi5fZW5kKCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG5leHRUaWNrKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0c2VsZi5fZW5kKCk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdH1cblxuXHRpZiAoIXNlbGYuX3BsYW5FcnJvciAmJiBwZW5kaW5nQXNzZXJ0cyA8IDApIHtcblx0XHRzZWxmLl9wbGFuRXJyb3IgPSB0cnVlO1xuXHRcdHNlbGYuZmFpbCgncGxhbiAhPSBjb3VudCcsIHtcblx0XHRcdGV4cGVjdGVkOiBzZWxmLl9wbGFuLFxuXHRcdFx0YWN0dWFsOiBzZWxmLl9wbGFuIC0gcGVuZGluZ0Fzc2VydHNcblx0XHR9KTtcblx0fVxufTtcblxuVGVzdC5wcm90b3R5cGUuZmFpbCA9IGZ1bmN0aW9uIGZhaWwobXNnLCBleHRyYSkge1xuXHR0aGlzLl9hc3NlcnQoZmFsc2UsIHtcblx0XHRtZXNzYWdlOiBtc2csXG5cdFx0b3BlcmF0b3I6ICdmYWlsJyxcblx0XHRleHRyYTogZXh0cmFcblx0fSk7XG59O1xuXG5UZXN0LnByb3RvdHlwZS5wYXNzID0gZnVuY3Rpb24gcGFzcyhtc2csIGV4dHJhKSB7XG5cdHRoaXMuX2Fzc2VydCh0cnVlLCB7XG5cdFx0bWVzc2FnZTogbXNnLFxuXHRcdG9wZXJhdG9yOiAncGFzcycsXG5cdFx0ZXh0cmE6IGV4dHJhXG5cdH0pO1xufTtcblxuVGVzdC5wcm90b3R5cGUuc2tpcCA9IGZ1bmN0aW9uIHNraXAobXNnLCBleHRyYSkge1xuXHR0aGlzLl9hc3NlcnQodHJ1ZSwge1xuXHRcdG1lc3NhZ2U6IG1zZyxcblx0XHRvcGVyYXRvcjogJ3NraXAnLFxuXHRcdHNraXA6IHRydWUsXG5cdFx0ZXh0cmE6IGV4dHJhXG5cdH0pO1xufTtcblxudmFyIHRlc3RBc3NlcnQgPSBmdW5jdGlvbiBhc3NlcnQodmFsdWUsIG1zZywgZXh0cmEpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBmdW5jLXN0eWxlXG5cdHRoaXMuX2Fzc2VydCh2YWx1ZSwge1xuXHRcdG1lc3NhZ2U6IGRlZmluZWQobXNnLCAnc2hvdWxkIGJlIHRydXRoeScpLFxuXHRcdG9wZXJhdG9yOiAnb2snLFxuXHRcdGV4cGVjdGVkOiB0cnVlLFxuXHRcdGFjdHVhbDogdmFsdWUsXG5cdFx0ZXh0cmE6IGV4dHJhXG5cdH0pO1xufTtcblRlc3QucHJvdG90eXBlLm9rXG49IFRlc3QucHJvdG90eXBlWyd0cnVlJ11cbj0gVGVzdC5wcm90b3R5cGUuYXNzZXJ0XG49IHRlc3RBc3NlcnQ7XG5cbmZ1bmN0aW9uIG5vdE9LKHZhbHVlLCBtc2csIGV4dHJhKSB7XG5cdHRoaXMuX2Fzc2VydCghdmFsdWUsIHtcblx0XHRtZXNzYWdlOiBkZWZpbmVkKG1zZywgJ3Nob3VsZCBiZSBmYWxzeScpLFxuXHRcdG9wZXJhdG9yOiAnbm90T2snLFxuXHRcdGV4cGVjdGVkOiBmYWxzZSxcblx0XHRhY3R1YWw6IHZhbHVlLFxuXHRcdGV4dHJhOiBleHRyYVxuXHR9KTtcbn1cblRlc3QucHJvdG90eXBlLm5vdE9rXG49IFRlc3QucHJvdG90eXBlWydmYWxzZSddXG49IFRlc3QucHJvdG90eXBlLm5vdG9rXG49IG5vdE9LO1xuXG5mdW5jdGlvbiBlcnJvcihlcnIsIG1zZywgZXh0cmEpIHtcblx0dGhpcy5fYXNzZXJ0KCFlcnIsIHtcblx0XHRtZXNzYWdlOiBkZWZpbmVkKG1zZywgU3RyaW5nKGVycikpLFxuXHRcdG9wZXJhdG9yOiAnZXJyb3InLFxuXHRcdGVycm9yOiBlcnIsXG5cdFx0ZXh0cmE6IGV4dHJhXG5cdH0pO1xufVxuVGVzdC5wcm90b3R5cGUuZXJyb3Jcbj0gVGVzdC5wcm90b3R5cGUuaWZFcnJvclxuPSBUZXN0LnByb3RvdHlwZS5pZkVyclxuPSBUZXN0LnByb3RvdHlwZS5pZmVycm9yXG49IGVycm9yO1xuXG5mdW5jdGlvbiBzdHJpY3RFcXVhbChhLCBiLCBtc2csIGV4dHJhKSB7XG5cdGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ3R3byBhcmd1bWVudHMgbXVzdCBiZSBwcm92aWRlZCB0byBjb21wYXJlJyk7XG5cdH1cblx0dGhpcy5fYXNzZXJ0KGlzKGEsIGIpLCB7XG5cdFx0bWVzc2FnZTogZGVmaW5lZChtc2csICdzaG91bGQgYmUgc3RyaWN0bHkgZXF1YWwnKSxcblx0XHRvcGVyYXRvcjogJ2VxdWFsJyxcblx0XHRhY3R1YWw6IGEsXG5cdFx0ZXhwZWN0ZWQ6IGIsXG5cdFx0ZXh0cmE6IGV4dHJhXG5cdH0pO1xufVxuVGVzdC5wcm90b3R5cGUuZXF1YWxcbj0gVGVzdC5wcm90b3R5cGUuZXF1YWxzXG49IFRlc3QucHJvdG90eXBlLmlzRXF1YWxcbj0gVGVzdC5wcm90b3R5cGUuc3RyaWN0RXF1YWxcbj0gVGVzdC5wcm90b3R5cGUuc3RyaWN0RXF1YWxzXG49IFRlc3QucHJvdG90eXBlLmlzXG49IHN0cmljdEVxdWFsO1xuXG5mdW5jdGlvbiBub3RTdHJpY3RFcXVhbChhLCBiLCBtc2csIGV4dHJhKSB7XG5cdGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ3R3byBhcmd1bWVudHMgbXVzdCBiZSBwcm92aWRlZCB0byBjb21wYXJlJyk7XG5cdH1cblx0dGhpcy5fYXNzZXJ0KCFpcyhhLCBiKSwge1xuXHRcdG1lc3NhZ2U6IGRlZmluZWQobXNnLCAnc2hvdWxkIG5vdCBiZSBzdHJpY3RseSBlcXVhbCcpLFxuXHRcdG9wZXJhdG9yOiAnbm90RXF1YWwnLFxuXHRcdGFjdHVhbDogYSxcblx0XHRleHBlY3RlZDogYixcblx0XHRleHRyYTogZXh0cmFcblx0fSk7XG59XG5cblRlc3QucHJvdG90eXBlLm5vdEVxdWFsXG49IFRlc3QucHJvdG90eXBlLm5vdEVxdWFsc1xuPSBUZXN0LnByb3RvdHlwZS5pc05vdEVxdWFsXG49IFRlc3QucHJvdG90eXBlLmRvZXNOb3RFcXVhbFxuPSBUZXN0LnByb3RvdHlwZS5pc0luZXF1YWxcbj0gVGVzdC5wcm90b3R5cGUubm90U3RyaWN0RXF1YWxcbj0gVGVzdC5wcm90b3R5cGUubm90U3RyaWN0RXF1YWxzXG49IFRlc3QucHJvdG90eXBlLmlzTm90XG49IFRlc3QucHJvdG90eXBlLm5vdFxuPSBub3RTdHJpY3RFcXVhbDtcblxuZnVuY3Rpb24gbG9vc2VFcXVhbChhLCBiLCBtc2csIGV4dHJhKSB7XG5cdGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ3R3byBhcmd1bWVudHMgbXVzdCBiZSBwcm92aWRlZCB0byBjb21wYXJlJyk7XG5cdH1cblx0dGhpcy5fYXNzZXJ0KGEgPT0gYiwge1xuXHRcdG1lc3NhZ2U6IGRlZmluZWQobXNnLCAnc2hvdWxkIGJlIGxvb3NlbHkgZXF1YWwnKSxcblx0XHRvcGVyYXRvcjogJ2xvb3NlRXF1YWwnLFxuXHRcdGFjdHVhbDogYSxcblx0XHRleHBlY3RlZDogYixcblx0XHRleHRyYTogZXh0cmFcblx0fSk7XG59XG5cblRlc3QucHJvdG90eXBlLmxvb3NlRXF1YWxcbj0gVGVzdC5wcm90b3R5cGUubG9vc2VFcXVhbHNcbj0gbG9vc2VFcXVhbDtcblxuZnVuY3Rpb24gbm90TG9vc2VFcXVhbChhLCBiLCBtc2csIGV4dHJhKSB7XG5cdGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ3R3byBhcmd1bWVudHMgbXVzdCBiZSBwcm92aWRlZCB0byBjb21wYXJlJyk7XG5cdH1cblx0dGhpcy5fYXNzZXJ0KGEgIT0gYiwge1xuXHRcdG1lc3NhZ2U6IGRlZmluZWQobXNnLCAnc2hvdWxkIG5vdCBiZSBsb29zZWx5IGVxdWFsJyksXG5cdFx0b3BlcmF0b3I6ICdub3RMb29zZUVxdWFsJyxcblx0XHRhY3R1YWw6IGEsXG5cdFx0ZXhwZWN0ZWQ6IGIsXG5cdFx0ZXh0cmE6IGV4dHJhXG5cdH0pO1xufVxuVGVzdC5wcm90b3R5cGUubm90TG9vc2VFcXVhbFxuPSBUZXN0LnByb3RvdHlwZS5ub3RMb29zZUVxdWFsc1xuPSBub3RMb29zZUVxdWFsO1xuXG5mdW5jdGlvbiB0YXBlRGVlcEVxdWFsKGEsIGIsIG1zZywgZXh0cmEpIHtcblx0aWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcigndHdvIGFyZ3VtZW50cyBtdXN0IGJlIHByb3ZpZGVkIHRvIGNvbXBhcmUnKTtcblx0fVxuXHR0aGlzLl9hc3NlcnQoZGVlcEVxdWFsKGEsIGIsIHsgc3RyaWN0OiB0cnVlIH0pLCB7XG5cdFx0bWVzc2FnZTogZGVmaW5lZChtc2csICdzaG91bGQgYmUgZGVlcGx5IGVxdWl2YWxlbnQnKSxcblx0XHRvcGVyYXRvcjogJ2RlZXBFcXVhbCcsXG5cdFx0YWN0dWFsOiBhLFxuXHRcdGV4cGVjdGVkOiBiLFxuXHRcdGV4dHJhOiBleHRyYVxuXHR9KTtcbn1cblRlc3QucHJvdG90eXBlLmRlZXBFcXVhbFxuPSBUZXN0LnByb3RvdHlwZS5kZWVwRXF1YWxzXG49IFRlc3QucHJvdG90eXBlLmlzRXF1aXZhbGVudFxuPSBUZXN0LnByb3RvdHlwZS5zYW1lXG49IHRhcGVEZWVwRXF1YWw7XG5cbmZ1bmN0aW9uIG5vdERlZXBFcXVhbChhLCBiLCBtc2csIGV4dHJhKSB7XG5cdGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ3R3byBhcmd1bWVudHMgbXVzdCBiZSBwcm92aWRlZCB0byBjb21wYXJlJyk7XG5cdH1cblx0dGhpcy5fYXNzZXJ0KCFkZWVwRXF1YWwoYSwgYiwgeyBzdHJpY3Q6IHRydWUgfSksIHtcblx0XHRtZXNzYWdlOiBkZWZpbmVkKG1zZywgJ3Nob3VsZCBub3QgYmUgZGVlcGx5IGVxdWl2YWxlbnQnKSxcblx0XHRvcGVyYXRvcjogJ25vdERlZXBFcXVhbCcsXG5cdFx0YWN0dWFsOiBhLFxuXHRcdGV4cGVjdGVkOiBiLFxuXHRcdGV4dHJhOiBleHRyYVxuXHR9KTtcbn1cblRlc3QucHJvdG90eXBlLm5vdERlZXBFcXVhbFxuPSBUZXN0LnByb3RvdHlwZS5ub3REZWVwRXF1YWxzXG49IFRlc3QucHJvdG90eXBlLm5vdEVxdWl2YWxlbnRcbj0gVGVzdC5wcm90b3R5cGUubm90RGVlcGx5XG49IFRlc3QucHJvdG90eXBlLm5vdFNhbWVcbj0gVGVzdC5wcm90b3R5cGUuaXNOb3REZWVwRXF1YWxcbj0gVGVzdC5wcm90b3R5cGUuaXNOb3REZWVwbHlcbj0gVGVzdC5wcm90b3R5cGUuaXNOb3RFcXVpdmFsZW50XG49IFRlc3QucHJvdG90eXBlLmlzSW5lcXVpdmFsZW50XG49IG5vdERlZXBFcXVhbDtcblxuZnVuY3Rpb24gZGVlcExvb3NlRXF1YWwoYSwgYiwgbXNnLCBleHRyYSkge1xuXHRpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCd0d28gYXJndW1lbnRzIG11c3QgYmUgcHJvdmlkZWQgdG8gY29tcGFyZScpO1xuXHR9XG5cdHRoaXMuX2Fzc2VydChkZWVwRXF1YWwoYSwgYiksIHtcblx0XHRtZXNzYWdlOiBkZWZpbmVkKG1zZywgJ3Nob3VsZCBiZSBsb29zZWx5IGRlZXBseSBlcXVpdmFsZW50JyksXG5cdFx0b3BlcmF0b3I6ICdkZWVwTG9vc2VFcXVhbCcsXG5cdFx0YWN0dWFsOiBhLFxuXHRcdGV4cGVjdGVkOiBiLFxuXHRcdGV4dHJhOiBleHRyYVxuXHR9KTtcbn1cblxuVGVzdC5wcm90b3R5cGUuZGVlcExvb3NlRXF1YWxcbj0gZGVlcExvb3NlRXF1YWw7XG5cbmZ1bmN0aW9uIG5vdERlZXBMb29zZUVxdWFsKGEsIGIsIG1zZywgZXh0cmEpIHtcblx0aWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcigndHdvIGFyZ3VtZW50cyBtdXN0IGJlIHByb3ZpZGVkIHRvIGNvbXBhcmUnKTtcblx0fVxuXHR0aGlzLl9hc3NlcnQoIWRlZXBFcXVhbChhLCBiKSwge1xuXHRcdG1lc3NhZ2U6IGRlZmluZWQobXNnLCAnc2hvdWxkIG5vdCBiZSBsb29zZWx5IGRlZXBseSBlcXVpdmFsZW50JyksXG5cdFx0b3BlcmF0b3I6ICdub3REZWVwTG9vc2VFcXVhbCcsXG5cdFx0YWN0dWFsOiBhLFxuXHRcdGV4cGVjdGVkOiBiLFxuXHRcdGV4dHJhOiBleHRyYVxuXHR9KTtcbn1cblRlc3QucHJvdG90eXBlLm5vdERlZXBMb29zZUVxdWFsXG49IG5vdERlZXBMb29zZUVxdWFsO1xuXG5UZXN0LnByb3RvdHlwZVsndGhyb3dzJ10gPSBmdW5jdGlvbiAoZm4sIGV4cGVjdGVkLCBtc2csIGV4dHJhKSB7XG5cdGlmICh0eXBlb2YgZXhwZWN0ZWQgPT09ICdzdHJpbmcnKSB7XG5cdFx0bXNnID0gZXhwZWN0ZWQ7XG5cdFx0ZXhwZWN0ZWQgPSB1bmRlZmluZWQ7XG5cdH1cblxuXHR2YXIgY2F1Z2h0O1xuXG5cdHRyeSB7XG5cdFx0Zm4oKTtcblx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0Y2F1Z2h0ID0geyBlcnJvcjogZXJyIH07XG5cdFx0aWYgKE9iamVjdChlcnIpID09PSBlcnIgJiYgKCFpc0VudW1lcmFibGUoZXJyLCAnbWVzc2FnZScpIHx8ICFoYXMoZXJyLCAnbWVzc2FnZScpKSkge1xuXHRcdFx0dmFyIG1lc3NhZ2UgPSBlcnIubWVzc2FnZTtcblx0XHRcdGRlbGV0ZSBlcnIubWVzc2FnZTtcblx0XHRcdGVyci5tZXNzYWdlID0gbWVzc2FnZTtcblx0XHR9XG5cdH1cblxuXHR2YXIgcGFzc2VkID0gY2F1Z2h0O1xuXG5cdGlmIChjYXVnaHQpIHtcblx0XHRpZiAodHlwZW9mIGV4cGVjdGVkID09PSAnc3RyaW5nJyAmJiBjYXVnaHQuZXJyb3IgJiYgY2F1Z2h0LmVycm9yLm1lc3NhZ2UgPT09IGV4cGVjdGVkKSB7XG5cdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJlcnJvci9tZXNzYWdlXCIgYXJndW1lbnQgaXMgYW1iaWd1b3VzLiBUaGUgZXJyb3IgbWVzc2FnZSAnICsgaW5zcGVjdChleHBlY3RlZCkgKyAnIGlzIGlkZW50aWNhbCB0byB0aGUgbWVzc2FnZS4nKTtcblx0XHR9XG5cdFx0aWYgKHR5cGVvZiBleHBlY3RlZCA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0aWYgKHR5cGVvZiBleHBlY3RlZC5wcm90b3R5cGUgIT09ICd1bmRlZmluZWQnICYmIGNhdWdodC5lcnJvciBpbnN0YW5jZW9mIGV4cGVjdGVkKSB7XG5cdFx0XHRcdHBhc3NlZCA9IHRydWU7XG5cdFx0XHR9IGVsc2UgaWYgKGlzUHJvdG8oRXJyb3IsIGV4cGVjdGVkKSkge1xuXHRcdFx0XHRwYXNzZWQgPSBmYWxzZTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHBhc3NlZCA9IGV4cGVjdGVkLmNhbGwoe30sIGNhdWdodC5lcnJvcikgPT09IHRydWU7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChpc1JlZ0V4cChleHBlY3RlZCkpIHtcblx0XHRcdHBhc3NlZCA9ICRleGVjKGV4cGVjdGVkLCBjYXVnaHQuZXJyb3IpICE9PSBudWxsO1xuXHRcdFx0ZXhwZWN0ZWQgPSBpbnNwZWN0KGV4cGVjdGVkKTtcblx0XHR9IGVsc2UgaWYgKGV4cGVjdGVkICYmIHR5cGVvZiBleHBlY3RlZCA9PT0gJ29iamVjdCcpIHsgLy8gSGFuZGxlIHZhbGlkYXRpb24gb2JqZWN0cy5cblx0XHRcdHZhciBrZXlzID0gb2JqZWN0S2V5cyhleHBlY3RlZCk7XG5cdFx0XHQvLyBTcGVjaWFsIGhhbmRsZSBlcnJvcnMgdG8gbWFrZSBzdXJlIHRoZSBuYW1lIGFuZCB0aGUgbWVzc2FnZSBhcmUgY29tcGFyZWQgYXMgd2VsbC5cblx0XHRcdGlmIChleHBlY3RlZCBpbnN0YW5jZW9mIEVycm9yKSB7XG5cdFx0XHRcdCRwdXNoKGtleXMsICduYW1lJywgJ21lc3NhZ2UnKTtcblx0XHRcdH0gZWxzZSBpZiAoa2V5cy5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignYHRocm93c2AgdmFsaWRhdGlvbiBvYmplY3QgbXVzdCBub3QgYmUgZW1wdHknKTtcblx0XHRcdH1cblx0XHRcdHBhc3NlZCA9IGV2ZXJ5KGtleXMsIGZ1bmN0aW9uIChrZXkpIHtcblx0XHRcdFx0aWYgKHR5cGVvZiBjYXVnaHQuZXJyb3Jba2V5XSA9PT0gJ3N0cmluZycgJiYgaXNSZWdFeHAoZXhwZWN0ZWRba2V5XSkgJiYgJGV4ZWMoZXhwZWN0ZWRba2V5XSwgY2F1Z2h0LmVycm9yW2tleV0pICE9PSBudWxsKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKGtleSBpbiBjYXVnaHQuZXJyb3IgJiYgZGVlcEVxdWFsKGNhdWdodC5lcnJvcltrZXldLCBleHBlY3RlZFtrZXldLCB7IHN0cmljdDogdHJ1ZSB9KSkge1xuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH0pO1xuXHRcdH1cblx0fVxuXG5cdHRoaXMuX2Fzc2VydCghIXBhc3NlZCwge1xuXHRcdG1lc3NhZ2U6IGRlZmluZWQobXNnLCAnc2hvdWxkIHRocm93JyksXG5cdFx0b3BlcmF0b3I6ICd0aHJvd3MnLFxuXHRcdGFjdHVhbDogY2F1Z2h0ICYmIGNhdWdodC5lcnJvcixcblx0XHRleHBlY3RlZDogZXhwZWN0ZWQsXG5cdFx0ZXJyb3I6ICFwYXNzZWQgJiYgY2F1Z2h0ICYmIGNhdWdodC5lcnJvcixcblx0XHRleHRyYTogZXh0cmFcblx0fSk7XG59O1xuXG5UZXN0LnByb3RvdHlwZS5kb2VzTm90VGhyb3cgPSBmdW5jdGlvbiBkb2VzTm90VGhyb3coZm4sIGV4cGVjdGVkLCBtc2csIGV4dHJhKSB7XG5cdGlmICh0eXBlb2YgZXhwZWN0ZWQgPT09ICdzdHJpbmcnKSB7XG5cdFx0bXNnID0gZXhwZWN0ZWQ7XG5cdFx0ZXhwZWN0ZWQgPSB1bmRlZmluZWQ7XG5cdH1cblx0dmFyIGNhdWdodDtcblx0dHJ5IHtcblx0XHRmbigpO1xuXHR9IGNhdGNoIChlcnIpIHtcblx0XHRjYXVnaHQgPSB7IGVycm9yOiBlcnIgfTtcblx0fVxuXHR0aGlzLl9hc3NlcnQoIWNhdWdodCwge1xuXHRcdG1lc3NhZ2U6IGRlZmluZWQobXNnLCAnc2hvdWxkIG5vdCB0aHJvdycpLFxuXHRcdG9wZXJhdG9yOiAndGhyb3dzJyxcblx0XHRhY3R1YWw6IGNhdWdodCAmJiBjYXVnaHQuZXJyb3IsXG5cdFx0ZXhwZWN0ZWQ6IGV4cGVjdGVkLFxuXHRcdGVycm9yOiBjYXVnaHQgJiYgY2F1Z2h0LmVycm9yLFxuXHRcdGV4dHJhOiBleHRyYVxuXHR9KTtcbn07XG5cblRlc3QucHJvdG90eXBlLm1hdGNoID0gZnVuY3Rpb24gbWF0Y2goc3RyaW5nLCByZWdleHAsIG1zZywgZXh0cmEpIHtcblx0aWYgKCFpc1JlZ0V4cChyZWdleHApKSB7XG5cdFx0dGhpcy5fYXNzZXJ0KGZhbHNlLCB7XG5cdFx0XHRtZXNzYWdlOiBkZWZpbmVkKG1zZywgJ1RoZSBcInJlZ2V4cFwiIGFyZ3VtZW50IG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgUmVnRXhwLiBSZWNlaXZlZCB0eXBlICcgKyB0eXBlb2YgcmVnZXhwICsgJyAoJyArIGluc3BlY3QocmVnZXhwKSArICcpJyksXG5cdFx0XHRvcGVyYXRvcjogJ21hdGNoJyxcblx0XHRcdGFjdHVhbDogb2JqZWN0VG9TdHJpbmcocmVnZXhwKSxcblx0XHRcdGV4cGVjdGVkOiAnW29iamVjdCBSZWdFeHBdJyxcblx0XHRcdGV4dHJhOiBleHRyYVxuXHRcdH0pO1xuXHR9IGVsc2UgaWYgKHR5cGVvZiBzdHJpbmcgIT09ICdzdHJpbmcnKSB7XG5cdFx0dGhpcy5fYXNzZXJ0KGZhbHNlLCB7XG5cdFx0XHRtZXNzYWdlOiBkZWZpbmVkKG1zZywgJ1RoZSBcInN0cmluZ1wiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBzdHJpbmcuIFJlY2VpdmVkIHR5cGUgJyArIHR5cGVvZiBzdHJpbmcgKyAnICgnICsgaW5zcGVjdChzdHJpbmcpICsgJyknKSxcblx0XHRcdG9wZXJhdG9yOiAnbWF0Y2gnLFxuXHRcdFx0YWN0dWFsOiBzdHJpbmcgPT09IG51bGwgPyBudWxsIDogdHlwZW9mIHN0cmluZyxcblx0XHRcdGV4cGVjdGVkOiAnc3RyaW5nJyxcblx0XHRcdGV4dHJhOiBleHRyYVxuXHRcdH0pO1xuXHR9IGVsc2Uge1xuXHRcdHZhciBtYXRjaGVzID0gJGV4ZWMocmVnZXhwLCBzdHJpbmcpICE9PSBudWxsO1xuXHRcdHZhciBtZXNzYWdlID0gZGVmaW5lZChcblx0XHRcdG1zZyxcblx0XHRcdCdUaGUgaW5wdXQgJyArIChtYXRjaGVzID8gJ21hdGNoZWQnIDogJ2RpZCBub3QgbWF0Y2gnKSArICcgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiAnICsgaW5zcGVjdChyZWdleHApICsgJy4gSW5wdXQ6ICcgKyBpbnNwZWN0KHN0cmluZylcblx0XHQpO1xuXHRcdHRoaXMuX2Fzc2VydChtYXRjaGVzLCB7XG5cdFx0XHRtZXNzYWdlOiBtZXNzYWdlLFxuXHRcdFx0b3BlcmF0b3I6ICdtYXRjaCcsXG5cdFx0XHRhY3R1YWw6IHN0cmluZyxcblx0XHRcdGV4cGVjdGVkOiByZWdleHAsXG5cdFx0XHRleHRyYTogZXh0cmFcblx0XHR9KTtcblx0fVxufTtcblxuVGVzdC5wcm90b3R5cGUuZG9lc05vdE1hdGNoID0gZnVuY3Rpb24gZG9lc05vdE1hdGNoKHN0cmluZywgcmVnZXhwLCBtc2csIGV4dHJhKSB7XG5cdGlmICghaXNSZWdFeHAocmVnZXhwKSkge1xuXHRcdHRoaXMuX2Fzc2VydChmYWxzZSwge1xuXHRcdFx0bWVzc2FnZTogZGVmaW5lZChtc2csICdUaGUgXCJyZWdleHBcIiBhcmd1bWVudCBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIFJlZ0V4cC4gUmVjZWl2ZWQgdHlwZSAnICsgdHlwZW9mIHJlZ2V4cCArICcgKCcgKyBpbnNwZWN0KHJlZ2V4cCkgKyAnKScpLFxuXHRcdFx0b3BlcmF0b3I6ICdkb2VzTm90TWF0Y2gnLFxuXHRcdFx0YWN0dWFsOiBvYmplY3RUb1N0cmluZyhyZWdleHApLFxuXHRcdFx0ZXhwZWN0ZWQ6ICdbb2JqZWN0IFJlZ0V4cF0nLFxuXHRcdFx0ZXh0cmE6IGV4dHJhXG5cdFx0fSk7XG5cdH0gZWxzZSBpZiAodHlwZW9mIHN0cmluZyAhPT0gJ3N0cmluZycpIHtcblx0XHR0aGlzLl9hc3NlcnQoZmFsc2UsIHtcblx0XHRcdG1lc3NhZ2U6IGRlZmluZWQobXNnLCAnVGhlIFwic3RyaW5nXCIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIHN0cmluZy4gUmVjZWl2ZWQgdHlwZSAnICsgdHlwZW9mIHN0cmluZyArICcgKCcgKyBpbnNwZWN0KHN0cmluZykgKyAnKScpLFxuXHRcdFx0b3BlcmF0b3I6ICdkb2VzTm90TWF0Y2gnLFxuXHRcdFx0YWN0dWFsOiBzdHJpbmcgPT09IG51bGwgPyBudWxsIDogdHlwZW9mIHN0cmluZyxcblx0XHRcdGV4cGVjdGVkOiAnc3RyaW5nJyxcblx0XHRcdGV4dHJhOiBleHRyYVxuXHRcdH0pO1xuXHR9IGVsc2Uge1xuXHRcdHZhciBtYXRjaGVzID0gJGV4ZWMocmVnZXhwLCBzdHJpbmcpICE9PSBudWxsO1xuXHRcdHZhciBtZXNzYWdlID0gZGVmaW5lZChcblx0XHRcdG1zZyxcblx0XHRcdCdUaGUgaW5wdXQgJyArIChtYXRjaGVzID8gJ3dhcyBleHBlY3RlZCB0byBub3QgbWF0Y2gnIDogJ2RpZCBub3QgbWF0Y2gnKSArICcgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiAnICsgaW5zcGVjdChyZWdleHApICsgJy4gSW5wdXQ6ICcgKyBpbnNwZWN0KHN0cmluZylcblx0XHQpO1xuXHRcdHRoaXMuX2Fzc2VydCghbWF0Y2hlcywge1xuXHRcdFx0bWVzc2FnZTogbWVzc2FnZSxcblx0XHRcdG9wZXJhdG9yOiAnZG9lc05vdE1hdGNoJyxcblx0XHRcdGFjdHVhbDogc3RyaW5nLFxuXHRcdFx0ZXhwZWN0ZWQ6IHJlZ2V4cCxcblx0XHRcdGV4dHJhOiBleHRyYVxuXHRcdH0pO1xuXHR9XG59O1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcblRlc3Quc2tpcCA9IGZ1bmN0aW9uIHNraXAobmFtZV8sIF9vcHRzLCBfY2IpIHtcblx0dmFyIGFyZ3MgPSBnZXRUZXN0QXJncy5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuXHRhcmdzLm9wdHMuc2tpcCA9IHRydWU7XG5cdHJldHVybiBuZXcgVGVzdChhcmdzLm5hbWUsIGFyZ3Mub3B0cywgYXJncy5jYik7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFRlc3Q7XG5cbi8vIHZpbTogc2V0IHNvZnR0YWJzdG9wPTQgc2hpZnR3aWR0aD00OlxuXG59KS5jYWxsKHRoaXMscmVxdWlyZShcIktsaXViSFwiKSxcIi8uLi8uLi9saWJcIikiLCIndXNlIHN0cmljdCc7XG5cbnZhciBJc0NhbGxhYmxlID0gcmVxdWlyZSgnZXMtYWJzdHJhY3QvMjAyMS9Jc0NhbGxhYmxlJyk7XG52YXIgVG9PYmplY3QgPSByZXF1aXJlKCdlcy1hYnN0cmFjdC8yMDIxL1RvT2JqZWN0Jyk7XG52YXIgVG9VaW50MzIgPSByZXF1aXJlKCdlcy1hYnN0cmFjdC8yMDIxL1RvVWludDMyJyk7XG52YXIgY2FsbEJvdW5kID0gcmVxdWlyZSgnY2FsbC1iaW5kL2NhbGxCb3VuZCcpO1xudmFyIGlzU3RyaW5nID0gcmVxdWlyZSgnaXMtc3RyaW5nJyk7XG5cbi8vIENoZWNrIGZhaWx1cmUgb2YgYnktaW5kZXggYWNjZXNzIG9mIHN0cmluZyBjaGFyYWN0ZXJzIChJRSA8IDkpIGFuZCBmYWlsdXJlIG9mIGAwIGluIGJveGVkU3RyaW5nYCAoUmhpbm8pXG52YXIgYm94ZWRTdHJpbmcgPSBPYmplY3QoJ2EnKTtcbnZhciBzcGxpdFN0cmluZyA9IGJveGVkU3RyaW5nWzBdICE9PSAnYScgfHwgISgwIGluIGJveGVkU3RyaW5nKTtcblxudmFyICRzcGxpdCA9IGNhbGxCb3VuZCgnU3RyaW5nLnByb3RvdHlwZS5zcGxpdCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGV2ZXJ5KGNhbGxiYWNrZm4pIHtcblx0dmFyIE8gPSBUb09iamVjdCh0aGlzKTtcblx0dmFyIHNlbGYgPSBzcGxpdFN0cmluZyAmJiBpc1N0cmluZyhPKSA/ICRzcGxpdChPLCAnJykgOiBPO1xuXHR2YXIgbGVuID0gVG9VaW50MzIoc2VsZi5sZW5ndGgpO1xuXHR2YXIgVDtcblx0aWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG5cdFx0VCA9IGFyZ3VtZW50c1sxXTtcblx0fVxuXG5cdC8vIElmIG5vIGNhbGxiYWNrIGZ1bmN0aW9uIG9yIGlmIGNhbGxiYWNrIGlzIG5vdCBhIGNhbGxhYmxlIGZ1bmN0aW9uXG5cdGlmICghSXNDYWxsYWJsZShjYWxsYmFja2ZuKSkge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ0FycmF5LnByb3RvdHlwZS5ldmVyeSBjYWxsYmFjayBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcblx0fVxuXG5cdGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcblx0XHRpZiAoaSBpbiBzZWxmICYmICEodHlwZW9mIFQgPT09ICd1bmRlZmluZWQnID8gY2FsbGJhY2tmbihzZWxmW2ldLCBpLCBPKSA6IGNhbGxiYWNrZm4uY2FsbChULCBzZWxmW2ldLCBpLCBPKSkpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIHRydWU7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgZGVmaW5lID0gcmVxdWlyZSgnZGVmaW5lLXByb3BlcnRpZXMnKTtcbnZhciBSZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gcmVxdWlyZSgnZXMtYWJzdHJhY3QvMjAyMS9SZXF1aXJlT2JqZWN0Q29lcmNpYmxlJyk7XG52YXIgY2FsbEJvdW5kID0gcmVxdWlyZSgnY2FsbC1iaW5kL2NhbGxCb3VuZCcpO1xuXG52YXIgaW1wbGVtZW50YXRpb24gPSByZXF1aXJlKCcuL2ltcGxlbWVudGF0aW9uJyk7XG52YXIgZ2V0UG9seWZpbGwgPSByZXF1aXJlKCcuL3BvbHlmaWxsJyk7XG52YXIgcG9seWZpbGwgPSBnZXRQb2x5ZmlsbCgpO1xudmFyIHNoaW0gPSByZXF1aXJlKCcuL3NoaW0nKTtcblxudmFyICRzbGljZSA9IGNhbGxCb3VuZCgnQXJyYXkucHJvdG90eXBlLnNsaWNlJyk7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xudmFyIGJvdW5kRXZlcnlTaGltID0gZnVuY3Rpb24gZXZlcnkoYXJyYXksIGNhbGxiYWNrZm4pIHtcblx0UmVxdWlyZU9iamVjdENvZXJjaWJsZShhcnJheSk7XG5cdHJldHVybiBwb2x5ZmlsbC5hcHBseShhcnJheSwgJHNsaWNlKGFyZ3VtZW50cywgMSkpO1xufTtcbmRlZmluZShib3VuZEV2ZXJ5U2hpbSwge1xuXHRnZXRQb2x5ZmlsbDogZ2V0UG9seWZpbGwsXG5cdGltcGxlbWVudGF0aW9uOiBpbXBsZW1lbnRhdGlvbixcblx0c2hpbTogc2hpbVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gYm91bmRFdmVyeVNoaW07XG4iLCJ2YXIgaW1wbGVtZW50YXRpb24gPSByZXF1aXJlKCcuL2ltcGxlbWVudGF0aW9uJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZ2V0UG9seWZpbGwoKSB7XG5cdGlmICh0eXBlb2YgQXJyYXkucHJvdG90eXBlLmV2ZXJ5ID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0dmFyIGhhc1ByaW1pdGl2ZUNvbnRleHRJblN0cmljdCA9IFsxXS5ldmVyeShmdW5jdGlvbiAoKSB7XG5cdFx0XHQndXNlIHN0cmljdCc7XG5cblx0XHRcdHJldHVybiB0eXBlb2YgdGhpcyA9PT0gJ3N0cmluZycgJiYgdGhpcyA9PT0gJ3gnO1xuXHRcdH0sICd4Jyk7XG5cdFx0aWYgKGhhc1ByaW1pdGl2ZUNvbnRleHRJblN0cmljdCkge1xuXHRcdFx0cmV0dXJuIEFycmF5LnByb3RvdHlwZS5ldmVyeTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIGltcGxlbWVudGF0aW9uO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGRlZmluZSA9IHJlcXVpcmUoJ2RlZmluZS1wcm9wZXJ0aWVzJyk7XG52YXIgZ2V0UG9seWZpbGwgPSByZXF1aXJlKCcuL3BvbHlmaWxsJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gc2hpbUFycmF5UHJvdG90eXBlRXZlcnkoKSB7XG5cdHZhciBwb2x5ZmlsbCA9IGdldFBvbHlmaWxsKCk7XG5cdGRlZmluZShcblx0XHRBcnJheS5wcm90b3R5cGUsXG5cdFx0eyBldmVyeTogcG9seWZpbGwgfSxcblx0XHR7IGV2ZXJ5OiBmdW5jdGlvbiAoKSB7IHJldHVybiBBcnJheS5wcm90b3R5cGUuZXZlcnkgIT09IHBvbHlmaWxsOyB9IH1cblx0KTtcblx0cmV0dXJuIHBvbHlmaWxsO1xufTtcbiIsIihmdW5jdGlvbiAoZ2xvYmFsKXtcbid1c2Ugc3RyaWN0JztcblxudmFyIHBvc3NpYmxlTmFtZXMgPSBbXG5cdCdCaWdJbnQ2NEFycmF5Jyxcblx0J0JpZ1VpbnQ2NEFycmF5Jyxcblx0J0Zsb2F0MzJBcnJheScsXG5cdCdGbG9hdDY0QXJyYXknLFxuXHQnSW50MTZBcnJheScsXG5cdCdJbnQzMkFycmF5Jyxcblx0J0ludDhBcnJheScsXG5cdCdVaW50MTZBcnJheScsXG5cdCdVaW50MzJBcnJheScsXG5cdCdVaW50OEFycmF5Jyxcblx0J1VpbnQ4Q2xhbXBlZEFycmF5J1xuXTtcblxudmFyIGcgPSB0eXBlb2YgZ2xvYmFsVGhpcyA9PT0gJ3VuZGVmaW5lZCcgPyBnbG9iYWwgOiBnbG9iYWxUaGlzO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGF2YWlsYWJsZVR5cGVkQXJyYXlzKCkge1xuXHR2YXIgb3V0ID0gW107XG5cdGZvciAodmFyIGkgPSAwOyBpIDwgcG9zc2libGVOYW1lcy5sZW5ndGg7IGkrKykge1xuXHRcdGlmICh0eXBlb2YgZ1twb3NzaWJsZU5hbWVzW2ldXSA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0b3V0W291dC5sZW5ndGhdID0gcG9zc2libGVOYW1lc1tpXTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIG91dDtcbn07XG5cbn0pLmNhbGwodGhpcyx0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIiA/IHNlbGYgOiB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiID8gd2luZG93IDoge30pIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgR2V0SW50cmluc2ljID0gcmVxdWlyZSgnZ2V0LWludHJpbnNpYycpO1xuXG52YXIgY2FsbEJpbmQgPSByZXF1aXJlKCcuLycpO1xuXG52YXIgJGluZGV4T2YgPSBjYWxsQmluZChHZXRJbnRyaW5zaWMoJ1N0cmluZy5wcm90b3R5cGUuaW5kZXhPZicpKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBjYWxsQm91bmRJbnRyaW5zaWMobmFtZSwgYWxsb3dNaXNzaW5nKSB7XG5cdHZhciBpbnRyaW5zaWMgPSBHZXRJbnRyaW5zaWMobmFtZSwgISFhbGxvd01pc3NpbmcpO1xuXHRpZiAodHlwZW9mIGludHJpbnNpYyA9PT0gJ2Z1bmN0aW9uJyAmJiAkaW5kZXhPZihuYW1lLCAnLnByb3RvdHlwZS4nKSA+IC0xKSB7XG5cdFx0cmV0dXJuIGNhbGxCaW5kKGludHJpbnNpYyk7XG5cdH1cblx0cmV0dXJuIGludHJpbnNpYztcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBiaW5kID0gcmVxdWlyZSgnZnVuY3Rpb24tYmluZCcpO1xudmFyIEdldEludHJpbnNpYyA9IHJlcXVpcmUoJ2dldC1pbnRyaW5zaWMnKTtcblxudmFyICRhcHBseSA9IEdldEludHJpbnNpYygnJUZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseSUnKTtcbnZhciAkY2FsbCA9IEdldEludHJpbnNpYygnJUZ1bmN0aW9uLnByb3RvdHlwZS5jYWxsJScpO1xudmFyICRyZWZsZWN0QXBwbHkgPSBHZXRJbnRyaW5zaWMoJyVSZWZsZWN0LmFwcGx5JScsIHRydWUpIHx8IGJpbmQuY2FsbCgkY2FsbCwgJGFwcGx5KTtcblxudmFyICRnT1BEID0gR2V0SW50cmluc2ljKCclT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvciUnLCB0cnVlKTtcbnZhciAkZGVmaW5lUHJvcGVydHkgPSBHZXRJbnRyaW5zaWMoJyVPYmplY3QuZGVmaW5lUHJvcGVydHklJywgdHJ1ZSk7XG52YXIgJG1heCA9IEdldEludHJpbnNpYygnJU1hdGgubWF4JScpO1xuXG5pZiAoJGRlZmluZVByb3BlcnR5KSB7XG5cdHRyeSB7XG5cdFx0JGRlZmluZVByb3BlcnR5KHt9LCAnYScsIHsgdmFsdWU6IDEgfSk7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHQvLyBJRSA4IGhhcyBhIGJyb2tlbiBkZWZpbmVQcm9wZXJ0eVxuXHRcdCRkZWZpbmVQcm9wZXJ0eSA9IG51bGw7XG5cdH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBjYWxsQmluZChvcmlnaW5hbEZ1bmN0aW9uKSB7XG5cdHZhciBmdW5jID0gJHJlZmxlY3RBcHBseShiaW5kLCAkY2FsbCwgYXJndW1lbnRzKTtcblx0aWYgKCRnT1BEICYmICRkZWZpbmVQcm9wZXJ0eSkge1xuXHRcdHZhciBkZXNjID0gJGdPUEQoZnVuYywgJ2xlbmd0aCcpO1xuXHRcdGlmIChkZXNjLmNvbmZpZ3VyYWJsZSkge1xuXHRcdFx0Ly8gb3JpZ2luYWwgbGVuZ3RoLCBwbHVzIHRoZSByZWNlaXZlciwgbWludXMgYW55IGFkZGl0aW9uYWwgYXJndW1lbnRzIChhZnRlciB0aGUgcmVjZWl2ZXIpXG5cdFx0XHQkZGVmaW5lUHJvcGVydHkoXG5cdFx0XHRcdGZ1bmMsXG5cdFx0XHRcdCdsZW5ndGgnLFxuXHRcdFx0XHR7IHZhbHVlOiAxICsgJG1heCgwLCBvcmlnaW5hbEZ1bmN0aW9uLmxlbmd0aCAtIChhcmd1bWVudHMubGVuZ3RoIC0gMSkpIH1cblx0XHRcdCk7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBmdW5jO1xufTtcblxudmFyIGFwcGx5QmluZCA9IGZ1bmN0aW9uIGFwcGx5QmluZCgpIHtcblx0cmV0dXJuICRyZWZsZWN0QXBwbHkoYmluZCwgJGFwcGx5LCBhcmd1bWVudHMpO1xufTtcblxuaWYgKCRkZWZpbmVQcm9wZXJ0eSkge1xuXHQkZGVmaW5lUHJvcGVydHkobW9kdWxlLmV4cG9ydHMsICdhcHBseScsIHsgdmFsdWU6IGFwcGx5QmluZCB9KTtcbn0gZWxzZSB7XG5cdG1vZHVsZS5leHBvcnRzLmFwcGx5ID0gYXBwbHlCaW5kO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgb2JqZWN0S2V5cyA9IHJlcXVpcmUoJ29iamVjdC1rZXlzJyk7XG52YXIgaXNBcmd1bWVudHMgPSByZXF1aXJlKCdpcy1hcmd1bWVudHMnKTtcbnZhciBpcyA9IHJlcXVpcmUoJ29iamVjdC1pcycpO1xudmFyIGlzUmVnZXggPSByZXF1aXJlKCdpcy1yZWdleCcpO1xudmFyIGZsYWdzID0gcmVxdWlyZSgncmVnZXhwLnByb3RvdHlwZS5mbGFncycpO1xudmFyIGlzQXJyYXkgPSByZXF1aXJlKCdpc2FycmF5Jyk7XG52YXIgaXNEYXRlID0gcmVxdWlyZSgnaXMtZGF0ZS1vYmplY3QnKTtcbnZhciB3aGljaEJveGVkUHJpbWl0aXZlID0gcmVxdWlyZSgnd2hpY2gtYm94ZWQtcHJpbWl0aXZlJyk7XG52YXIgR2V0SW50cmluc2ljID0gcmVxdWlyZSgnZ2V0LWludHJpbnNpYycpO1xudmFyIGNhbGxCb3VuZCA9IHJlcXVpcmUoJ2NhbGwtYmluZC9jYWxsQm91bmQnKTtcbnZhciB3aGljaENvbGxlY3Rpb24gPSByZXF1aXJlKCd3aGljaC1jb2xsZWN0aW9uJyk7XG52YXIgZ2V0SXRlcmF0b3IgPSByZXF1aXJlKCdlcy1nZXQtaXRlcmF0b3InKTtcbnZhciBnZXRTaWRlQ2hhbm5lbCA9IHJlcXVpcmUoJ3NpZGUtY2hhbm5lbCcpO1xudmFyIHdoaWNoVHlwZWRBcnJheSA9IHJlcXVpcmUoJ3doaWNoLXR5cGVkLWFycmF5Jyk7XG52YXIgYXNzaWduID0gcmVxdWlyZSgnb2JqZWN0LmFzc2lnbicpO1xuXG52YXIgJGdldFRpbWUgPSBjYWxsQm91bmQoJ0RhdGUucHJvdG90eXBlLmdldFRpbWUnKTtcbnZhciBnUE8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Y7XG52YXIgJG9ialRvU3RyaW5nID0gY2FsbEJvdW5kKCdPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nJyk7XG5cbnZhciAkU2V0ID0gR2V0SW50cmluc2ljKCclU2V0JScsIHRydWUpO1xudmFyICRtYXBIYXMgPSBjYWxsQm91bmQoJ01hcC5wcm90b3R5cGUuaGFzJywgdHJ1ZSk7XG52YXIgJG1hcEdldCA9IGNhbGxCb3VuZCgnTWFwLnByb3RvdHlwZS5nZXQnLCB0cnVlKTtcbnZhciAkbWFwU2l6ZSA9IGNhbGxCb3VuZCgnTWFwLnByb3RvdHlwZS5zaXplJywgdHJ1ZSk7XG52YXIgJHNldEFkZCA9IGNhbGxCb3VuZCgnU2V0LnByb3RvdHlwZS5hZGQnLCB0cnVlKTtcbnZhciAkc2V0RGVsZXRlID0gY2FsbEJvdW5kKCdTZXQucHJvdG90eXBlLmRlbGV0ZScsIHRydWUpO1xudmFyICRzZXRIYXMgPSBjYWxsQm91bmQoJ1NldC5wcm90b3R5cGUuaGFzJywgdHJ1ZSk7XG52YXIgJHNldFNpemUgPSBjYWxsQm91bmQoJ1NldC5wcm90b3R5cGUuc2l6ZScsIHRydWUpO1xuXG4vLyB0YWtlbiBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9icm93c2VyaWZ5L2NvbW1vbmpzLWFzc2VydC9ibG9iL2JiYTgzOGU5YmE5ZTI4ZWRmMzEyN2NlNjk3NDYyNDIwODUwMmY2YmMvaW50ZXJuYWwvdXRpbC9jb21wYXJpc29ucy5qcyNMNDAxLUw0MTRcbmZ1bmN0aW9uIHNldEhhc0VxdWFsRWxlbWVudChzZXQsIHZhbDEsIG9wdHMsIGNoYW5uZWwpIHtcbiAgdmFyIGkgPSBnZXRJdGVyYXRvcihzZXQpO1xuICB2YXIgcmVzdWx0O1xuICB3aGlsZSAoKHJlc3VsdCA9IGkubmV4dCgpKSAmJiAhcmVzdWx0LmRvbmUpIHtcbiAgICBpZiAoaW50ZXJuYWxEZWVwRXF1YWwodmFsMSwgcmVzdWx0LnZhbHVlLCBvcHRzLCBjaGFubmVsKSkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lXG4gICAgICAvLyBSZW1vdmUgdGhlIG1hdGNoaW5nIGVsZW1lbnQgdG8gbWFrZSBzdXJlIHdlIGRvIG5vdCBjaGVjayB0aGF0IGFnYWluLlxuICAgICAgJHNldERlbGV0ZShzZXQsIHJlc3VsdC52YWx1ZSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8vIHRha2VuIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2Jyb3dzZXJpZnkvY29tbW9uanMtYXNzZXJ0L2Jsb2IvYmJhODM4ZTliYTllMjhlZGYzMTI3Y2U2OTc0NjI0MjA4NTAyZjZiYy9pbnRlcm5hbC91dGlsL2NvbXBhcmlzb25zLmpzI0w0MTYtTDQzOVxuZnVuY3Rpb24gZmluZExvb3NlTWF0Y2hpbmdQcmltaXRpdmVzKHByaW0pIHtcbiAgaWYgKHR5cGVvZiBwcmltID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGlmICh0eXBlb2YgcHJpbSA9PT0gJ29iamVjdCcpIHsgLy8gT25seSBwYXNzIGluIG51bGwgYXMgb2JqZWN0IVxuICAgIHJldHVybiB2b2lkIDA7XG4gIH1cbiAgaWYgKHR5cGVvZiBwcmltID09PSAnc3ltYm9sJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAodHlwZW9mIHByaW0gPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBwcmltID09PSAnbnVtYmVyJykge1xuICAgIC8vIExvb3NlIGVxdWFsIGVudHJpZXMgZXhpc3Qgb25seSBpZiB0aGUgc3RyaW5nIGlzIHBvc3NpYmxlIHRvIGNvbnZlcnQgdG8gYSByZWd1bGFyIG51bWJlciBhbmQgbm90IE5hTi5cbiAgICByZXR1cm4gK3ByaW0gPT09ICtwcmltOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWltcGxpY2l0LWNvZXJjaW9uXG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8vIHRha2VuIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2Jyb3dzZXJpZnkvY29tbW9uanMtYXNzZXJ0L2Jsb2IvYmJhODM4ZTliYTllMjhlZGYzMTI3Y2U2OTc0NjI0MjA4NTAyZjZiYy9pbnRlcm5hbC91dGlsL2NvbXBhcmlzb25zLmpzI0w0NDktTDQ2MFxuZnVuY3Rpb24gbWFwTWlnaHRIYXZlTG9vc2VQcmltKGEsIGIsIHByaW0sIGl0ZW0sIG9wdHMsIGNoYW5uZWwpIHtcbiAgdmFyIGFsdFZhbHVlID0gZmluZExvb3NlTWF0Y2hpbmdQcmltaXRpdmVzKHByaW0pO1xuICBpZiAoYWx0VmFsdWUgIT0gbnVsbCkge1xuICAgIHJldHVybiBhbHRWYWx1ZTtcbiAgfVxuICB2YXIgY3VyQiA9ICRtYXBHZXQoYiwgYWx0VmFsdWUpO1xuICB2YXIgbG9vc2VPcHRzID0gYXNzaWduKHt9LCBvcHRzLCB7IHN0cmljdDogZmFsc2UgfSk7XG4gIGlmIChcbiAgICAodHlwZW9mIGN1ckIgPT09ICd1bmRlZmluZWQnICYmICEkbWFwSGFzKGIsIGFsdFZhbHVlKSlcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmVcbiAgICB8fCAhaW50ZXJuYWxEZWVwRXF1YWwoaXRlbSwgY3VyQiwgbG9vc2VPcHRzLCBjaGFubmVsKVxuICApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lXG4gIHJldHVybiAhJG1hcEhhcyhhLCBhbHRWYWx1ZSkgJiYgaW50ZXJuYWxEZWVwRXF1YWwoaXRlbSwgY3VyQiwgbG9vc2VPcHRzLCBjaGFubmVsKTtcbn1cblxuLy8gdGFrZW4gZnJvbSBodHRwczovL2dpdGh1Yi5jb20vYnJvd3NlcmlmeS9jb21tb25qcy1hc3NlcnQvYmxvYi9iYmE4MzhlOWJhOWUyOGVkZjMxMjdjZTY5NzQ2MjQyMDg1MDJmNmJjL2ludGVybmFsL3V0aWwvY29tcGFyaXNvbnMuanMjTDQ0MS1MNDQ3XG5mdW5jdGlvbiBzZXRNaWdodEhhdmVMb29zZVByaW0oYSwgYiwgcHJpbSkge1xuICB2YXIgYWx0VmFsdWUgPSBmaW5kTG9vc2VNYXRjaGluZ1ByaW1pdGl2ZXMocHJpbSk7XG4gIGlmIChhbHRWYWx1ZSAhPSBudWxsKSB7XG4gICAgcmV0dXJuIGFsdFZhbHVlO1xuICB9XG5cbiAgcmV0dXJuICRzZXRIYXMoYiwgYWx0VmFsdWUpICYmICEkc2V0SGFzKGEsIGFsdFZhbHVlKTtcbn1cblxuLy8gdGFrZW4gZnJvbSBodHRwczovL2dpdGh1Yi5jb20vYnJvd3NlcmlmeS9jb21tb25qcy1hc3NlcnQvYmxvYi9iYmE4MzhlOWJhOWUyOGVkZjMxMjdjZTY5NzQ2MjQyMDg1MDJmNmJjL2ludGVybmFsL3V0aWwvY29tcGFyaXNvbnMuanMjTDUxOC1MNTMzXG5mdW5jdGlvbiBtYXBIYXNFcXVhbEVudHJ5KHNldCwgbWFwLCBrZXkxLCBpdGVtMSwgb3B0cywgY2hhbm5lbCkge1xuICB2YXIgaSA9IGdldEl0ZXJhdG9yKHNldCk7XG4gIHZhciByZXN1bHQ7XG4gIHZhciBrZXkyO1xuICB3aGlsZSAoKHJlc3VsdCA9IGkubmV4dCgpKSAmJiAhcmVzdWx0LmRvbmUpIHtcbiAgICBrZXkyID0gcmVzdWx0LnZhbHVlO1xuICAgIGlmIChcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZVxuICAgICAgaW50ZXJuYWxEZWVwRXF1YWwoa2V5MSwga2V5Miwgb3B0cywgY2hhbm5lbClcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZVxuICAgICAgJiYgaW50ZXJuYWxEZWVwRXF1YWwoaXRlbTEsICRtYXBHZXQobWFwLCBrZXkyKSwgb3B0cywgY2hhbm5lbClcbiAgICApIHtcbiAgICAgICRzZXREZWxldGUoc2V0LCBrZXkyKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gaW50ZXJuYWxEZWVwRXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgb3B0aW9ucywgY2hhbm5lbCkge1xuICB2YXIgb3B0cyA9IG9wdGlvbnMgfHwge307XG5cbiAgLy8gNy4xLiBBbGwgaWRlbnRpY2FsIHZhbHVlcyBhcmUgZXF1aXZhbGVudCwgYXMgZGV0ZXJtaW5lZCBieSA9PT0uXG4gIGlmIChvcHRzLnN0cmljdCA/IGlzKGFjdHVhbCwgZXhwZWN0ZWQpIDogYWN0dWFsID09PSBleHBlY3RlZCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgdmFyIGFjdHVhbEJveGVkID0gd2hpY2hCb3hlZFByaW1pdGl2ZShhY3R1YWwpO1xuICB2YXIgZXhwZWN0ZWRCb3hlZCA9IHdoaWNoQm94ZWRQcmltaXRpdmUoZXhwZWN0ZWQpO1xuICBpZiAoYWN0dWFsQm94ZWQgIT09IGV4cGVjdGVkQm94ZWQpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyA3LjMuIE90aGVyIHBhaXJzIHRoYXQgZG8gbm90IGJvdGggcGFzcyB0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCcsIGVxdWl2YWxlbmNlIGlzIGRldGVybWluZWQgYnkgPT0uXG4gIGlmICghYWN0dWFsIHx8ICFleHBlY3RlZCB8fCAodHlwZW9mIGFjdHVhbCAhPT0gJ29iamVjdCcgJiYgdHlwZW9mIGV4cGVjdGVkICE9PSAnb2JqZWN0JykpIHtcbiAgICByZXR1cm4gb3B0cy5zdHJpY3QgPyBpcyhhY3R1YWwsIGV4cGVjdGVkKSA6IGFjdHVhbCA9PSBleHBlY3RlZDsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBlcWVxZXFcbiAgfVxuXG4gIC8qXG4gICAqIDcuNC4gRm9yIGFsbCBvdGhlciBPYmplY3QgcGFpcnMsIGluY2x1ZGluZyBBcnJheSBvYmplY3RzLCBlcXVpdmFsZW5jZSBpc1xuICAgKiBkZXRlcm1pbmVkIGJ5IGhhdmluZyB0aGUgc2FtZSBudW1iZXIgb2Ygb3duZWQgcHJvcGVydGllcyAoYXMgdmVyaWZpZWRcbiAgICogd2l0aCBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwpLCB0aGUgc2FtZSBzZXQgb2Yga2V5c1xuICAgKiAoYWx0aG91Z2ggbm90IG5lY2Vzc2FyaWx5IHRoZSBzYW1lIG9yZGVyKSwgZXF1aXZhbGVudCB2YWx1ZXMgZm9yIGV2ZXJ5XG4gICAqIGNvcnJlc3BvbmRpbmcga2V5LCBhbmQgYW4gaWRlbnRpY2FsICdwcm90b3R5cGUnIHByb3BlcnR5LiBOb3RlOiB0aGlzXG4gICAqIGFjY291bnRzIGZvciBib3RoIG5hbWVkIGFuZCBpbmRleGVkIHByb3BlcnRpZXMgb24gQXJyYXlzLlxuICAgKi9cbiAgLy8gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9jb21taXQvZDNhYWZkMDJlZmQzYTQwM2Q2NDZhMzA0NGFkY2YxNGU2M2E4OGQzMiBmb3IgbWVtb3MvY2hhbm5lbCBpbnNwaXJhdGlvblxuXG4gIHZhciBoYXNBY3R1YWwgPSBjaGFubmVsLmhhcyhhY3R1YWwpO1xuICB2YXIgaGFzRXhwZWN0ZWQgPSBjaGFubmVsLmhhcyhleHBlY3RlZCk7XG4gIHZhciBzZW50aW5lbDtcbiAgaWYgKGhhc0FjdHVhbCAmJiBoYXNFeHBlY3RlZCkge1xuICAgIGlmIChjaGFubmVsLmdldChhY3R1YWwpID09PSBjaGFubmVsLmdldChleHBlY3RlZCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBzZW50aW5lbCA9IHt9O1xuICB9XG4gIGlmICghaGFzQWN0dWFsKSB7IGNoYW5uZWwuc2V0KGFjdHVhbCwgc2VudGluZWwpOyB9XG4gIGlmICghaGFzRXhwZWN0ZWQpIHsgY2hhbm5lbC5zZXQoZXhwZWN0ZWQsIHNlbnRpbmVsKTsgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZVxuICByZXR1cm4gb2JqRXF1aXYoYWN0dWFsLCBleHBlY3RlZCwgb3B0cywgY2hhbm5lbCk7XG59XG5cbmZ1bmN0aW9uIGlzQnVmZmVyKHgpIHtcbiAgaWYgKCF4IHx8IHR5cGVvZiB4ICE9PSAnb2JqZWN0JyB8fCB0eXBlb2YgeC5sZW5ndGggIT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICh0eXBlb2YgeC5jb3B5ICE9PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiB4LnNsaWNlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICh4Lmxlbmd0aCA+IDAgJiYgdHlwZW9mIHhbMF0gIT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuICEhKHguY29uc3RydWN0b3IgJiYgeC5jb25zdHJ1Y3Rvci5pc0J1ZmZlciAmJiB4LmNvbnN0cnVjdG9yLmlzQnVmZmVyKHgpKTtcbn1cblxuZnVuY3Rpb24gc2V0RXF1aXYoYSwgYiwgb3B0cywgY2hhbm5lbCkge1xuICBpZiAoJHNldFNpemUoYSkgIT09ICRzZXRTaXplKGIpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciBpQSA9IGdldEl0ZXJhdG9yKGEpO1xuICB2YXIgaUIgPSBnZXRJdGVyYXRvcihiKTtcbiAgdmFyIHJlc3VsdEE7XG4gIHZhciByZXN1bHRCO1xuICB2YXIgc2V0O1xuICB3aGlsZSAoKHJlc3VsdEEgPSBpQS5uZXh0KCkpICYmICFyZXN1bHRBLmRvbmUpIHtcbiAgICBpZiAocmVzdWx0QS52YWx1ZSAmJiB0eXBlb2YgcmVzdWx0QS52YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGlmICghc2V0KSB7IHNldCA9IG5ldyAkU2V0KCk7IH1cbiAgICAgICRzZXRBZGQoc2V0LCByZXN1bHRBLnZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKCEkc2V0SGFzKGIsIHJlc3VsdEEudmFsdWUpKSB7XG4gICAgICBpZiAob3B0cy5zdHJpY3QpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgICBpZiAoIXNldE1pZ2h0SGF2ZUxvb3NlUHJpbShhLCBiLCByZXN1bHRBLnZhbHVlKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAoIXNldCkgeyBzZXQgPSBuZXcgJFNldCgpOyB9XG4gICAgICAkc2V0QWRkKHNldCwgcmVzdWx0QS52YWx1ZSk7XG4gICAgfVxuICB9XG4gIGlmIChzZXQpIHtcbiAgICB3aGlsZSAoKHJlc3VsdEIgPSBpQi5uZXh0KCkpICYmICFyZXN1bHRCLmRvbmUpIHtcbiAgICAgIC8vIFdlIGhhdmUgdG8gY2hlY2sgaWYgYSBwcmltaXRpdmUgdmFsdWUgaXMgYWxyZWFkeSBtYXRjaGluZyBhbmQgb25seSBpZiBpdCdzIG5vdCwgZ28gaHVudGluZyBmb3IgaXQuXG4gICAgICBpZiAocmVzdWx0Qi52YWx1ZSAmJiB0eXBlb2YgcmVzdWx0Qi52YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgaWYgKCFzZXRIYXNFcXVhbEVsZW1lbnQoc2V0LCByZXN1bHRCLnZhbHVlLCBvcHRzLnN0cmljdCwgY2hhbm5lbCkpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICFvcHRzLnN0cmljdFxuICAgICAgICAmJiAhJHNldEhhcyhhLCByZXN1bHRCLnZhbHVlKVxuICAgICAgICAmJiAhc2V0SGFzRXF1YWxFbGVtZW50KHNldCwgcmVzdWx0Qi52YWx1ZSwgb3B0cy5zdHJpY3QsIGNoYW5uZWwpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gJHNldFNpemUoc2V0KSA9PT0gMDtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gbWFwRXF1aXYoYSwgYiwgb3B0cywgY2hhbm5lbCkge1xuICBpZiAoJG1hcFNpemUoYSkgIT09ICRtYXBTaXplKGIpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciBpQSA9IGdldEl0ZXJhdG9yKGEpO1xuICB2YXIgaUIgPSBnZXRJdGVyYXRvcihiKTtcbiAgdmFyIHJlc3VsdEE7XG4gIHZhciByZXN1bHRCO1xuICB2YXIgc2V0O1xuICB2YXIga2V5O1xuICB2YXIgaXRlbTE7XG4gIHZhciBpdGVtMjtcbiAgd2hpbGUgKChyZXN1bHRBID0gaUEubmV4dCgpKSAmJiAhcmVzdWx0QS5kb25lKSB7XG4gICAga2V5ID0gcmVzdWx0QS52YWx1ZVswXTtcbiAgICBpdGVtMSA9IHJlc3VsdEEudmFsdWVbMV07XG4gICAgaWYgKGtleSAmJiB0eXBlb2Yga2V5ID09PSAnb2JqZWN0Jykge1xuICAgICAgaWYgKCFzZXQpIHsgc2V0ID0gbmV3ICRTZXQoKTsgfVxuICAgICAgJHNldEFkZChzZXQsIGtleSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGl0ZW0yID0gJG1hcEdldChiLCBrZXkpO1xuICAgICAgaWYgKCh0eXBlb2YgaXRlbTIgPT09ICd1bmRlZmluZWQnICYmICEkbWFwSGFzKGIsIGtleSkpIHx8ICFpbnRlcm5hbERlZXBFcXVhbChpdGVtMSwgaXRlbTIsIG9wdHMsIGNoYW5uZWwpKSB7XG4gICAgICAgIGlmIChvcHRzLnN0cmljdCkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIW1hcE1pZ2h0SGF2ZUxvb3NlUHJpbShhLCBiLCBrZXksIGl0ZW0xLCBvcHRzLCBjaGFubmVsKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXNldCkgeyBzZXQgPSBuZXcgJFNldCgpOyB9XG4gICAgICAgICRzZXRBZGQoc2V0LCBrZXkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChzZXQpIHtcbiAgICB3aGlsZSAoKHJlc3VsdEIgPSBpQi5uZXh0KCkpICYmICFyZXN1bHRCLmRvbmUpIHtcbiAgICAgIGtleSA9IHJlc3VsdEIudmFsdWVbMF07XG4gICAgICBpdGVtMiA9IHJlc3VsdEIudmFsdWVbMV07XG4gICAgICBpZiAoa2V5ICYmIHR5cGVvZiBrZXkgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGlmICghbWFwSGFzRXF1YWxFbnRyeShzZXQsIGEsIGtleSwgaXRlbTIsIG9wdHMsIGNoYW5uZWwpKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAhb3B0cy5zdHJpY3RcbiAgICAgICAgJiYgKCFhLmhhcyhrZXkpIHx8ICFpbnRlcm5hbERlZXBFcXVhbCgkbWFwR2V0KGEsIGtleSksIGl0ZW0yLCBvcHRzLCBjaGFubmVsKSlcbiAgICAgICAgJiYgIW1hcEhhc0VxdWFsRW50cnkoc2V0LCBhLCBrZXksIGl0ZW0yLCBhc3NpZ24oe30sIG9wdHMsIHsgc3RyaWN0OiBmYWxzZSB9KSwgY2hhbm5lbClcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAkc2V0U2l6ZShzZXQpID09PSAwO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBvYmpFcXVpdihhLCBiLCBvcHRzLCBjaGFubmVsKSB7XG4gIC8qIGVzbGludCBtYXgtc3RhdGVtZW50czogWzIsIDEwMF0sIG1heC1saW5lcy1wZXItZnVuY3Rpb246IFsyLCAxMjBdLCBtYXgtZGVwdGg6IFsyLCA1XSAqL1xuICB2YXIgaSwga2V5O1xuXG4gIGlmICh0eXBlb2YgYSAhPT0gdHlwZW9mIGIpIHsgcmV0dXJuIGZhbHNlOyB9XG4gIGlmIChhID09IG51bGwgfHwgYiA9PSBudWxsKSB7IHJldHVybiBmYWxzZTsgfVxuXG4gIGlmICgkb2JqVG9TdHJpbmcoYSkgIT09ICRvYmpUb1N0cmluZyhiKSkgeyByZXR1cm4gZmFsc2U7IH1cblxuICBpZiAoaXNBcmd1bWVudHMoYSkgIT09IGlzQXJndW1lbnRzKGIpKSB7IHJldHVybiBmYWxzZTsgfVxuXG4gIHZhciBhSXNBcnJheSA9IGlzQXJyYXkoYSk7XG4gIHZhciBiSXNBcnJheSA9IGlzQXJyYXkoYik7XG4gIGlmIChhSXNBcnJheSAhPT0gYklzQXJyYXkpIHsgcmV0dXJuIGZhbHNlOyB9XG5cbiAgLy8gVE9ETzogcmVwbGFjZSB3aGVuIGEgY3Jvc3MtcmVhbG0gYnJhbmQgY2hlY2sgaXMgYXZhaWxhYmxlXG4gIHZhciBhSXNFcnJvciA9IGEgaW5zdGFuY2VvZiBFcnJvcjtcbiAgdmFyIGJJc0Vycm9yID0gYiBpbnN0YW5jZW9mIEVycm9yO1xuICBpZiAoYUlzRXJyb3IgIT09IGJJc0Vycm9yKSB7IHJldHVybiBmYWxzZTsgfVxuICBpZiAoYUlzRXJyb3IgfHwgYklzRXJyb3IpIHtcbiAgICBpZiAoYS5uYW1lICE9PSBiLm5hbWUgfHwgYS5tZXNzYWdlICE9PSBiLm1lc3NhZ2UpIHsgcmV0dXJuIGZhbHNlOyB9XG4gIH1cblxuICB2YXIgYUlzUmVnZXggPSBpc1JlZ2V4KGEpO1xuICB2YXIgYklzUmVnZXggPSBpc1JlZ2V4KGIpO1xuICBpZiAoYUlzUmVnZXggIT09IGJJc1JlZ2V4KSB7IHJldHVybiBmYWxzZTsgfVxuICBpZiAoKGFJc1JlZ2V4IHx8IGJJc1JlZ2V4KSAmJiAoYS5zb3VyY2UgIT09IGIuc291cmNlIHx8IGZsYWdzKGEpICE9PSBmbGFncyhiKSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgYUlzRGF0ZSA9IGlzRGF0ZShhKTtcbiAgdmFyIGJJc0RhdGUgPSBpc0RhdGUoYik7XG4gIGlmIChhSXNEYXRlICE9PSBiSXNEYXRlKSB7IHJldHVybiBmYWxzZTsgfVxuICBpZiAoYUlzRGF0ZSB8fCBiSXNEYXRlKSB7IC8vICYmIHdvdWxkIHdvcmsgdG9vLCBiZWNhdXNlIGJvdGggYXJlIHRydWUgb3IgYm90aCBmYWxzZSBoZXJlXG4gICAgaWYgKCRnZXRUaW1lKGEpICE9PSAkZ2V0VGltZShiKSkgeyByZXR1cm4gZmFsc2U7IH1cbiAgfVxuICBpZiAob3B0cy5zdHJpY3QgJiYgZ1BPICYmIGdQTyhhKSAhPT0gZ1BPKGIpKSB7IHJldHVybiBmYWxzZTsgfVxuXG4gIGlmICh3aGljaFR5cGVkQXJyYXkoYSkgIT09IHdoaWNoVHlwZWRBcnJheShiKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBhSXNCdWZmZXIgPSBpc0J1ZmZlcihhKTtcbiAgdmFyIGJJc0J1ZmZlciA9IGlzQnVmZmVyKGIpO1xuICBpZiAoYUlzQnVmZmVyICE9PSBiSXNCdWZmZXIpIHsgcmV0dXJuIGZhbHNlOyB9XG4gIGlmIChhSXNCdWZmZXIgfHwgYklzQnVmZmVyKSB7IC8vICYmIHdvdWxkIHdvcmsgdG9vLCBiZWNhdXNlIGJvdGggYXJlIHRydWUgb3IgYm90aCBmYWxzZSBoZXJlXG4gICAgaWYgKGEubGVuZ3RoICE9PSBiLmxlbmd0aCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICBmb3IgKGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGFbaV0gIT09IGJbaV0pIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBhICE9PSB0eXBlb2YgYikgeyByZXR1cm4gZmFsc2U7IH1cblxuICB2YXIga2EgPSBvYmplY3RLZXlzKGEpO1xuICB2YXIga2IgPSBvYmplY3RLZXlzKGIpO1xuICAvLyBoYXZpbmcgdGhlIHNhbWUgbnVtYmVyIG9mIG93bmVkIHByb3BlcnRpZXMgKGtleXMgaW5jb3Jwb3JhdGVzIGhhc093blByb3BlcnR5KVxuICBpZiAoa2EubGVuZ3RoICE9PSBrYi5sZW5ndGgpIHsgcmV0dXJuIGZhbHNlOyB9XG5cbiAgLy8gdGhlIHNhbWUgc2V0IG9mIGtleXMgKGFsdGhvdWdoIG5vdCBuZWNlc3NhcmlseSB0aGUgc2FtZSBvcmRlciksXG4gIGthLnNvcnQoKTtcbiAga2Iuc29ydCgpO1xuICAvLyB+fn5jaGVhcCBrZXkgdGVzdFxuICBmb3IgKGkgPSBrYS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIGlmIChrYVtpXSAhPSBrYltpXSkgeyByZXR1cm4gZmFsc2U7IH0gLy8gZXNsaW50LWRpc2FibGUtbGluZSBlcWVxZXFcbiAgfVxuXG4gIC8vIGVxdWl2YWxlbnQgdmFsdWVzIGZvciBldmVyeSBjb3JyZXNwb25kaW5nIGtleSwgYW5kIH5+fnBvc3NpYmx5IGV4cGVuc2l2ZSBkZWVwIHRlc3RcbiAgZm9yIChpID0ga2EubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBrZXkgPSBrYVtpXTtcbiAgICBpZiAoIWludGVybmFsRGVlcEVxdWFsKGFba2V5XSwgYltrZXldLCBvcHRzLCBjaGFubmVsKSkgeyByZXR1cm4gZmFsc2U7IH1cbiAgfVxuXG4gIHZhciBhQ29sbGVjdGlvbiA9IHdoaWNoQ29sbGVjdGlvbihhKTtcbiAgdmFyIGJDb2xsZWN0aW9uID0gd2hpY2hDb2xsZWN0aW9uKGIpO1xuICBpZiAoYUNvbGxlY3Rpb24gIT09IGJDb2xsZWN0aW9uKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChhQ29sbGVjdGlvbiA9PT0gJ1NldCcgfHwgYkNvbGxlY3Rpb24gPT09ICdTZXQnKSB7IC8vIGFDb2xsZWN0aW9uID09PSBiQ29sbGVjdGlvblxuICAgIHJldHVybiBzZXRFcXVpdihhLCBiLCBvcHRzLCBjaGFubmVsKTtcbiAgfVxuICBpZiAoYUNvbGxlY3Rpb24gPT09ICdNYXAnKSB7IC8vIGFDb2xsZWN0aW9uID09PSBiQ29sbGVjdGlvblxuICAgIHJldHVybiBtYXBFcXVpdihhLCBiLCBvcHRzLCBjaGFubmVsKTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGRlZXBFcXVhbChhLCBiLCBvcHRzKSB7XG4gIHJldHVybiBpbnRlcm5hbERlZXBFcXVhbChhLCBiLCBvcHRzLCBnZXRTaWRlQ2hhbm5lbCgpKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBrZXlzID0gcmVxdWlyZSgnb2JqZWN0LWtleXMnKTtcbnZhciBoYXNTeW1ib2xzID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgU3ltYm9sKCdmb28nKSA9PT0gJ3N5bWJvbCc7XG5cbnZhciB0b1N0ciA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG52YXIgY29uY2F0ID0gQXJyYXkucHJvdG90eXBlLmNvbmNhdDtcbnZhciBvcmlnRGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG5cbnZhciBpc0Z1bmN0aW9uID0gZnVuY3Rpb24gKGZuKSB7XG5cdHJldHVybiB0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicgJiYgdG9TdHIuY2FsbChmbikgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXSc7XG59O1xuXG52YXIgaGFzUHJvcGVydHlEZXNjcmlwdG9ycyA9IHJlcXVpcmUoJ2hhcy1wcm9wZXJ0eS1kZXNjcmlwdG9ycycpKCk7XG5cbnZhciBzdXBwb3J0c0Rlc2NyaXB0b3JzID0gb3JpZ0RlZmluZVByb3BlcnR5ICYmIGhhc1Byb3BlcnR5RGVzY3JpcHRvcnM7XG5cbnZhciBkZWZpbmVQcm9wZXJ0eSA9IGZ1bmN0aW9uIChvYmplY3QsIG5hbWUsIHZhbHVlLCBwcmVkaWNhdGUpIHtcblx0aWYgKG5hbWUgaW4gb2JqZWN0ICYmICghaXNGdW5jdGlvbihwcmVkaWNhdGUpIHx8ICFwcmVkaWNhdGUoKSkpIHtcblx0XHRyZXR1cm47XG5cdH1cblx0aWYgKHN1cHBvcnRzRGVzY3JpcHRvcnMpIHtcblx0XHRvcmlnRGVmaW5lUHJvcGVydHkob2JqZWN0LCBuYW1lLCB7XG5cdFx0XHRjb25maWd1cmFibGU6IHRydWUsXG5cdFx0XHRlbnVtZXJhYmxlOiBmYWxzZSxcblx0XHRcdHZhbHVlOiB2YWx1ZSxcblx0XHRcdHdyaXRhYmxlOiB0cnVlXG5cdFx0fSk7XG5cdH0gZWxzZSB7XG5cdFx0b2JqZWN0W25hbWVdID0gdmFsdWU7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cblx0fVxufTtcblxudmFyIGRlZmluZVByb3BlcnRpZXMgPSBmdW5jdGlvbiAob2JqZWN0LCBtYXApIHtcblx0dmFyIHByZWRpY2F0ZXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMiA/IGFyZ3VtZW50c1syXSA6IHt9O1xuXHR2YXIgcHJvcHMgPSBrZXlzKG1hcCk7XG5cdGlmIChoYXNTeW1ib2xzKSB7XG5cdFx0cHJvcHMgPSBjb25jYXQuY2FsbChwcm9wcywgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhtYXApKTtcblx0fVxuXHRmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSArPSAxKSB7XG5cdFx0ZGVmaW5lUHJvcGVydHkob2JqZWN0LCBwcm9wc1tpXSwgbWFwW3Byb3BzW2ldXSwgcHJlZGljYXRlc1twcm9wc1tpXV0pO1xuXHR9XG59O1xuXG5kZWZpbmVQcm9wZXJ0aWVzLnN1cHBvcnRzRGVzY3JpcHRvcnMgPSAhIXN1cHBvcnRzRGVzY3JpcHRvcnM7XG5cbm1vZHVsZS5leHBvcnRzID0gZGVmaW5lUHJvcGVydGllcztcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChhcmd1bWVudHNbaV0gIT09IHVuZGVmaW5lZCkgcmV0dXJuIGFyZ3VtZW50c1tpXTtcbiAgICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vLyBodHRwOi8vMjYyLmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvNS4xLyNzZWMtOS4xMVxuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJ2lzLWNhbGxhYmxlJyk7XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vNS9DaGVja09iamVjdENvZXJjaWJsZScpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgR2V0SW50cmluc2ljID0gcmVxdWlyZSgnZ2V0LWludHJpbnNpYycpO1xuXG52YXIgJFR5cGVFcnJvciA9IEdldEludHJpbnNpYygnJVR5cGVFcnJvciUnKTtcbnZhciAkTnVtYmVyID0gR2V0SW50cmluc2ljKCclTnVtYmVyJScpO1xudmFyICRSZWdFeHAgPSBHZXRJbnRyaW5zaWMoJyVSZWdFeHAlJyk7XG52YXIgJHBhcnNlSW50ZWdlciA9IEdldEludHJpbnNpYygnJXBhcnNlSW50JScpO1xuXG52YXIgY2FsbEJvdW5kID0gcmVxdWlyZSgnY2FsbC1iaW5kL2NhbGxCb3VuZCcpO1xudmFyIHJlZ2V4VGVzdGVyID0gcmVxdWlyZSgnLi4vaGVscGVycy9yZWdleFRlc3RlcicpO1xudmFyIGlzUHJpbWl0aXZlID0gcmVxdWlyZSgnLi4vaGVscGVycy9pc1ByaW1pdGl2ZScpO1xuXG52YXIgJHN0clNsaWNlID0gY2FsbEJvdW5kKCdTdHJpbmcucHJvdG90eXBlLnNsaWNlJyk7XG52YXIgaXNCaW5hcnkgPSByZWdleFRlc3RlcigvXjBiWzAxXSskL2kpO1xudmFyIGlzT2N0YWwgPSByZWdleFRlc3RlcigvXjBvWzAtN10rJC9pKTtcbnZhciBpc0ludmFsaWRIZXhMaXRlcmFsID0gcmVnZXhUZXN0ZXIoL15bLStdMHhbMC05YS1mXSskL2kpO1xudmFyIG5vbldTID0gWydcXHUwMDg1JywgJ1xcdTIwMGInLCAnXFx1ZmZmZSddLmpvaW4oJycpO1xudmFyIG5vbldTcmVnZXggPSBuZXcgJFJlZ0V4cCgnWycgKyBub25XUyArICddJywgJ2cnKTtcbnZhciBoYXNOb25XUyA9IHJlZ2V4VGVzdGVyKG5vbldTcmVnZXgpO1xuXG4vLyB3aGl0ZXNwYWNlIGZyb206IGh0dHBzOi8vZXM1LmdpdGh1Yi5pby8jeDE1LjUuNC4yMFxuLy8gaW1wbGVtZW50YXRpb24gZnJvbSBodHRwczovL2dpdGh1Yi5jb20vZXMtc2hpbXMvZXM1LXNoaW0vYmxvYi92My40LjAvZXM1LXNoaW0uanMjTDEzMDQtTDEzMjRcbnZhciB3cyA9IFtcblx0J1xceDA5XFx4MEFcXHgwQlxceDBDXFx4MERcXHgyMFxceEEwXFx1MTY4MFxcdTE4MEVcXHUyMDAwXFx1MjAwMVxcdTIwMDJcXHUyMDAzJyxcblx0J1xcdTIwMDRcXHUyMDA1XFx1MjAwNlxcdTIwMDdcXHUyMDA4XFx1MjAwOVxcdTIwMEFcXHUyMDJGXFx1MjA1RlxcdTMwMDBcXHUyMDI4Jyxcblx0J1xcdTIwMjlcXHVGRUZGJ1xuXS5qb2luKCcnKTtcbnZhciB0cmltUmVnZXggPSBuZXcgUmVnRXhwKCcoXlsnICsgd3MgKyAnXSspfChbJyArIHdzICsgJ10rJCknLCAnZycpO1xudmFyICRyZXBsYWNlID0gY2FsbEJvdW5kKCdTdHJpbmcucHJvdG90eXBlLnJlcGxhY2UnKTtcbnZhciAkdHJpbSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuXHRyZXR1cm4gJHJlcGxhY2UodmFsdWUsIHRyaW1SZWdleCwgJycpO1xufTtcblxudmFyIFRvUHJpbWl0aXZlID0gcmVxdWlyZSgnLi9Ub1ByaW1pdGl2ZScpO1xuXG4vLyBodHRwczovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wLyNzZWMtdG9udW1iZXJcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBUb051bWJlcihhcmd1bWVudCkge1xuXHR2YXIgdmFsdWUgPSBpc1ByaW1pdGl2ZShhcmd1bWVudCkgPyBhcmd1bWVudCA6IFRvUHJpbWl0aXZlKGFyZ3VtZW50LCAkTnVtYmVyKTtcblx0aWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N5bWJvbCcpIHtcblx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignQ2Fubm90IGNvbnZlcnQgYSBTeW1ib2wgdmFsdWUgdG8gYSBudW1iZXInKTtcblx0fVxuXHRpZiAodHlwZW9mIHZhbHVlID09PSAnYmlnaW50Jykge1xuXHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdDb252ZXJzaW9uIGZyb20gXFwnQmlnSW50XFwnIHRvIFxcJ251bWJlclxcJyBpcyBub3QgYWxsb3dlZC4nKTtcblx0fVxuXHRpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuXHRcdGlmIChpc0JpbmFyeSh2YWx1ZSkpIHtcblx0XHRcdHJldHVybiBUb051bWJlcigkcGFyc2VJbnRlZ2VyKCRzdHJTbGljZSh2YWx1ZSwgMiksIDIpKTtcblx0XHR9IGVsc2UgaWYgKGlzT2N0YWwodmFsdWUpKSB7XG5cdFx0XHRyZXR1cm4gVG9OdW1iZXIoJHBhcnNlSW50ZWdlcigkc3RyU2xpY2UodmFsdWUsIDIpLCA4KSk7XG5cdFx0fSBlbHNlIGlmIChoYXNOb25XUyh2YWx1ZSkgfHwgaXNJbnZhbGlkSGV4TGl0ZXJhbCh2YWx1ZSkpIHtcblx0XHRcdHJldHVybiBOYU47XG5cdFx0fVxuXHRcdHZhciB0cmltbWVkID0gJHRyaW0odmFsdWUpO1xuXHRcdGlmICh0cmltbWVkICE9PSB2YWx1ZSkge1xuXHRcdFx0cmV0dXJuIFRvTnVtYmVyKHRyaW1tZWQpO1xuXHRcdH1cblxuXHR9XG5cdHJldHVybiAkTnVtYmVyKHZhbHVlKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBHZXRJbnRyaW5zaWMgPSByZXF1aXJlKCdnZXQtaW50cmluc2ljJyk7XG5cbnZhciAkT2JqZWN0ID0gR2V0SW50cmluc2ljKCclT2JqZWN0JScpO1xuXG52YXIgUmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IHJlcXVpcmUoJy4vUmVxdWlyZU9iamVjdENvZXJjaWJsZScpO1xuXG4vLyBodHRwczovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wLyNzZWMtdG9vYmplY3RcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBUb09iamVjdCh2YWx1ZSkge1xuXHRSZXF1aXJlT2JqZWN0Q29lcmNpYmxlKHZhbHVlKTtcblx0cmV0dXJuICRPYmplY3QodmFsdWUpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHRvUHJpbWl0aXZlID0gcmVxdWlyZSgnZXMtdG8tcHJpbWl0aXZlL2VzMjAxNScpO1xuXG4vLyBodHRwczovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wLyNzZWMtdG9wcmltaXRpdmVcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBUb1ByaW1pdGl2ZShpbnB1dCkge1xuXHRpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcblx0XHRyZXR1cm4gdG9QcmltaXRpdmUoaW5wdXQsIGFyZ3VtZW50c1sxXSk7XG5cdH1cblx0cmV0dXJuIHRvUHJpbWl0aXZlKGlucHV0KTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBHZXRJbnRyaW5zaWMgPSByZXF1aXJlKCdnZXQtaW50cmluc2ljJyk7XG5cbnZhciAkU3RyaW5nID0gR2V0SW50cmluc2ljKCclU3RyaW5nJScpO1xudmFyICRUeXBlRXJyb3IgPSBHZXRJbnRyaW5zaWMoJyVUeXBlRXJyb3IlJyk7XG5cbi8vIGh0dHBzOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy10b3N0cmluZ1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIFRvU3RyaW5nKGFyZ3VtZW50KSB7XG5cdGlmICh0eXBlb2YgYXJndW1lbnQgPT09ICdzeW1ib2wnKSB7XG5cdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ0Nhbm5vdCBjb252ZXJ0IGEgU3ltYm9sIHZhbHVlIHRvIGEgc3RyaW5nJyk7XG5cdH1cblx0cmV0dXJuICRTdHJpbmcoYXJndW1lbnQpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIFRvTnVtYmVyID0gcmVxdWlyZSgnLi9Ub051bWJlcicpO1xuXG4vLyBodHRwOi8vMjYyLmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvNS4xLyNzZWMtOS42XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gVG9VaW50MzIoeCkge1xuXHRyZXR1cm4gVG9OdW1iZXIoeCkgPj4+IDA7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgR2V0SW50cmluc2ljID0gcmVxdWlyZSgnZ2V0LWludHJpbnNpYycpO1xuXG52YXIgJFR5cGVFcnJvciA9IEdldEludHJpbnNpYygnJVR5cGVFcnJvciUnKTtcblxuLy8gaHR0cDovLzI2Mi5lY21hLWludGVybmF0aW9uYWwub3JnLzUuMS8jc2VjLTkuMTBcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBDaGVja09iamVjdENvZXJjaWJsZSh2YWx1ZSwgb3B0TWVzc2FnZSkge1xuXHRpZiAodmFsdWUgPT0gbnVsbCkge1xuXHRcdHRocm93IG5ldyAkVHlwZUVycm9yKG9wdE1lc3NhZ2UgfHwgKCdDYW5ub3QgY2FsbCBtZXRob2Qgb24gJyArIHZhbHVlKSk7XG5cdH1cblx0cmV0dXJuIHZhbHVlO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIEdldEludHJpbnNpYyA9IHJlcXVpcmUoJ2dldC1pbnRyaW5zaWMnKTtcblxudmFyICRnT1BEID0gR2V0SW50cmluc2ljKCclT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvciUnLCB0cnVlKTtcbmlmICgkZ09QRCkge1xuXHR0cnkge1xuXHRcdCRnT1BEKFtdLCAnbGVuZ3RoJyk7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHQvLyBJRSA4IGhhcyBhIGJyb2tlbiBnT1BEXG5cdFx0JGdPUEQgPSBudWxsO1xuXHR9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gJGdPUEQ7XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaXNQcmltaXRpdmUodmFsdWUpIHtcblx0cmV0dXJuIHZhbHVlID09PSBudWxsIHx8ICh0eXBlb2YgdmFsdWUgIT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0Jyk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgY2FsbEJvdW5kID0gcmVxdWlyZSgnY2FsbC1iaW5kL2NhbGxCb3VuZCcpO1xuXG52YXIgJGV4ZWMgPSBjYWxsQm91bmQoJ1JlZ0V4cC5wcm90b3R5cGUuZXhlYycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHJlZ2V4VGVzdGVyKHJlZ2V4KSB7XG5cdHJldHVybiBmdW5jdGlvbiB0ZXN0KHMpIHsgcmV0dXJuICRleGVjKHJlZ2V4LCBzKSAhPT0gbnVsbDsgfTtcbn07XG4iLCIoZnVuY3Rpb24gKHByb2Nlc3Mpe1xuJ3VzZSBzdHJpY3QnO1xuXG4vKiBlc2xpbnQgZ2xvYmFsLXJlcXVpcmU6IDAgKi9cbi8vIHRoZSBjb2RlIGlzIHN0cnVjdHVyZWQgdGhpcyB3YXkgc28gdGhhdCBidW5kbGVycyBjYW5cbi8vIGFsaWFzIG91dCBgaGFzLXN5bWJvbHNgIHRvIGAoKSA9PiB0cnVlYCBvciBgKCkgPT4gZmFsc2VgIGlmIHlvdXIgdGFyZ2V0XG4vLyBlbnZpcm9ubWVudHMnIFN5bWJvbCBjYXBhYmlsaXRpZXMgYXJlIGtub3duLCBhbmQgdGhlbiB1c2Vcbi8vIGRlYWQgY29kZSBlbGltaW5hdGlvbiBvbiB0aGUgcmVzdCBvZiB0aGlzIG1vZHVsZS5cbi8vXG4vLyBTaW1pbGFybHksIGBpc2FycmF5YCBjYW4gYmUgYWxpYXNlZCB0byBgQXJyYXkuaXNBcnJheWAgaWZcbi8vIGF2YWlsYWJsZSBpbiBhbGwgdGFyZ2V0IGVudmlyb25tZW50cy5cblxudmFyIGlzQXJndW1lbnRzID0gcmVxdWlyZSgnaXMtYXJndW1lbnRzJyk7XG5cbmlmIChyZXF1aXJlKCdoYXMtc3ltYm9scycpKCkgfHwgcmVxdWlyZSgnaGFzLXN5bWJvbHMvc2hhbXMnKSgpKSB7XG5cdHZhciAkaXRlcmF0b3IgPSBTeW1ib2wuaXRlcmF0b3I7XG5cdC8vIFN5bWJvbCBpcyBhdmFpbGFibGUgbmF0aXZlbHkgb3Igc2hhbW1lZFxuXHQvLyBuYXRpdmVseTpcblx0Ly8gIC0gQ2hyb21lID49IDM4XG5cdC8vICAtIEVkZ2UgMTItMTQ/LCBFZGdlID49IDE1IGZvciBzdXJlXG5cdC8vICAtIEZGID49IDM2XG5cdC8vICAtIFNhZmFyaSA+PSA5XG5cdC8vICAtIG5vZGUgPj0gMC4xMlxuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGdldEl0ZXJhdG9yKGl0ZXJhYmxlKSB7XG5cdFx0Ly8gYWx0ZXJuYXRpdmVseSwgYGl0ZXJhYmxlWyRpdGVyYXRvcl0/LigpYFxuXHRcdGlmIChpdGVyYWJsZSAhPSBudWxsICYmIHR5cGVvZiBpdGVyYWJsZVskaXRlcmF0b3JdICE9PSAndW5kZWZpbmVkJykge1xuXHRcdFx0cmV0dXJuIGl0ZXJhYmxlWyRpdGVyYXRvcl0oKTtcblx0XHR9XG5cdFx0aWYgKGlzQXJndW1lbnRzKGl0ZXJhYmxlKSkge1xuXHRcdFx0Ly8gYXJndW1lbnRzIG9iamVjdHMgbGFjayBTeW1ib2wuaXRlcmF0b3Jcblx0XHRcdC8vIC0gbm9kZSAwLjEyXG5cdFx0XHRyZXR1cm4gQXJyYXkucHJvdG90eXBlWyRpdGVyYXRvcl0uY2FsbChpdGVyYWJsZSk7XG5cdFx0fVxuXHR9O1xufSBlbHNlIHtcblx0Ly8gU3ltYm9sIGlzIG5vdCBhdmFpbGFibGUsIG5hdGl2ZSBvciBzaGFtbWVkXG5cdHZhciBpc0FycmF5ID0gcmVxdWlyZSgnaXNhcnJheScpO1xuXHR2YXIgaXNTdHJpbmcgPSByZXF1aXJlKCdpcy1zdHJpbmcnKTtcblx0dmFyIEdldEludHJpbnNpYyA9IHJlcXVpcmUoJ2dldC1pbnRyaW5zaWMnKTtcblx0dmFyICRNYXAgPSBHZXRJbnRyaW5zaWMoJyVNYXAlJywgdHJ1ZSk7XG5cdHZhciAkU2V0ID0gR2V0SW50cmluc2ljKCclU2V0JScsIHRydWUpO1xuXHR2YXIgY2FsbEJvdW5kID0gcmVxdWlyZSgnY2FsbC1iaW5kL2NhbGxCb3VuZCcpO1xuXHR2YXIgJGFycmF5UHVzaCA9IGNhbGxCb3VuZCgnQXJyYXkucHJvdG90eXBlLnB1c2gnKTtcblx0dmFyICRjaGFyQ29kZUF0ID0gY2FsbEJvdW5kKCdTdHJpbmcucHJvdG90eXBlLmNoYXJDb2RlQXQnKTtcblx0dmFyICRzdHJpbmdTbGljZSA9IGNhbGxCb3VuZCgnU3RyaW5nLnByb3RvdHlwZS5zbGljZScpO1xuXG5cdHZhciBhZHZhbmNlU3RyaW5nSW5kZXggPSBmdW5jdGlvbiBhZHZhbmNlU3RyaW5nSW5kZXgoUywgaW5kZXgpIHtcblx0XHR2YXIgbGVuZ3RoID0gUy5sZW5ndGg7XG5cdFx0aWYgKChpbmRleCArIDEpID49IGxlbmd0aCkge1xuXHRcdFx0cmV0dXJuIGluZGV4ICsgMTtcblx0XHR9XG5cblx0XHR2YXIgZmlyc3QgPSAkY2hhckNvZGVBdChTLCBpbmRleCk7XG5cdFx0aWYgKGZpcnN0IDwgMHhEODAwIHx8IGZpcnN0ID4gMHhEQkZGKSB7XG5cdFx0XHRyZXR1cm4gaW5kZXggKyAxO1xuXHRcdH1cblxuXHRcdHZhciBzZWNvbmQgPSAkY2hhckNvZGVBdChTLCBpbmRleCArIDEpO1xuXHRcdGlmIChzZWNvbmQgPCAweERDMDAgfHwgc2Vjb25kID4gMHhERkZGKSB7XG5cdFx0XHRyZXR1cm4gaW5kZXggKyAxO1xuXHRcdH1cblxuXHRcdHJldHVybiBpbmRleCArIDI7XG5cdH07XG5cblx0dmFyIGdldEFycmF5SXRlcmF0b3IgPSBmdW5jdGlvbiBnZXRBcnJheUl0ZXJhdG9yKGFycmF5bGlrZSkge1xuXHRcdHZhciBpID0gMDtcblx0XHRyZXR1cm4ge1xuXHRcdFx0bmV4dDogZnVuY3Rpb24gbmV4dCgpIHtcblx0XHRcdFx0dmFyIGRvbmUgPSBpID49IGFycmF5bGlrZS5sZW5ndGg7XG5cdFx0XHRcdHZhciB2YWx1ZTtcblx0XHRcdFx0aWYgKCFkb25lKSB7XG5cdFx0XHRcdFx0dmFsdWUgPSBhcnJheWxpa2VbaV07XG5cdFx0XHRcdFx0aSArPSAxO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0ZG9uZTogZG9uZSxcblx0XHRcdFx0XHR2YWx1ZTogdmFsdWVcblx0XHRcdFx0fTtcblx0XHRcdH1cblx0XHR9O1xuXHR9O1xuXG5cdHZhciBnZXROb25Db2xsZWN0aW9uSXRlcmF0b3IgPSBmdW5jdGlvbiBnZXROb25Db2xsZWN0aW9uSXRlcmF0b3IoaXRlcmFibGUsIG5vUHJpbW9yZGlhbENvbGxlY3Rpb25zKSB7XG5cdFx0aWYgKGlzQXJyYXkoaXRlcmFibGUpIHx8IGlzQXJndW1lbnRzKGl0ZXJhYmxlKSkge1xuXHRcdFx0cmV0dXJuIGdldEFycmF5SXRlcmF0b3IoaXRlcmFibGUpO1xuXHRcdH1cblx0XHRpZiAoaXNTdHJpbmcoaXRlcmFibGUpKSB7XG5cdFx0XHR2YXIgaSA9IDA7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRuZXh0OiBmdW5jdGlvbiBuZXh0KCkge1xuXHRcdFx0XHRcdHZhciBuZXh0SW5kZXggPSBhZHZhbmNlU3RyaW5nSW5kZXgoaXRlcmFibGUsIGkpO1xuXHRcdFx0XHRcdHZhciB2YWx1ZSA9ICRzdHJpbmdTbGljZShpdGVyYWJsZSwgaSwgbmV4dEluZGV4KTtcblx0XHRcdFx0XHRpID0gbmV4dEluZGV4O1xuXHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHRkb25lOiBuZXh0SW5kZXggPiBpdGVyYWJsZS5sZW5ndGgsXG5cdFx0XHRcdFx0XHR2YWx1ZTogdmFsdWVcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdC8vIGVzNi1zaGltIGFuZCBlcy1zaGltcycgZXMtbWFwIHVzZSBhIHN0cmluZyBcIl9lczYtc2hpbSBpdGVyYXRvcl9cIiBwcm9wZXJ0eSBvbiBkaWZmZXJlbnQgaXRlcmFibGVzLCBzdWNoIGFzIE1hcEl0ZXJhdG9yLlxuXHRcdGlmIChub1ByaW1vcmRpYWxDb2xsZWN0aW9ucyAmJiB0eXBlb2YgaXRlcmFibGVbJ19lczYtc2hpbSBpdGVyYXRvcl8nXSAhPT0gJ3VuZGVmaW5lZCcpIHtcblx0XHRcdHJldHVybiBpdGVyYWJsZVsnX2VzNi1zaGltIGl0ZXJhdG9yXyddKCk7XG5cdFx0fVxuXHR9O1xuXG5cdGlmICghJE1hcCAmJiAhJFNldCkge1xuXHRcdC8vIHRoZSBvbmx5IGxhbmd1YWdlIGl0ZXJhYmxlcyBhcmUgQXJyYXksIFN0cmluZywgYXJndW1lbnRzXG5cdFx0Ly8gLSBTYWZhcmkgPD0gNi4wXG5cdFx0Ly8gLSBDaHJvbWUgPCAzOFxuXHRcdC8vIC0gbm9kZSA8IDAuMTJcblx0XHQvLyAtIEZGIDwgMTNcblx0XHQvLyAtIElFIDwgMTFcblx0XHQvLyAtIEVkZ2UgPCAxMVxuXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBnZXRJdGVyYXRvcihpdGVyYWJsZSkge1xuXHRcdFx0aWYgKGl0ZXJhYmxlICE9IG51bGwpIHtcblx0XHRcdFx0cmV0dXJuIGdldE5vbkNvbGxlY3Rpb25JdGVyYXRvcihpdGVyYWJsZSwgdHJ1ZSk7XG5cdFx0XHR9XG5cdFx0fTtcblx0fSBlbHNlIHtcblx0XHQvLyBlaXRoZXIgTWFwIG9yIFNldCBhcmUgYXZhaWxhYmxlLCBidXQgU3ltYm9sIGlzIG5vdFxuXHRcdC8vIC0gZXM2LXNoaW0gb24gYW4gRVM1IGJyb3dzZXJcblx0XHQvLyAtIFNhZmFyaSA2LjIgKG1heWJlIDYuMT8pXG5cdFx0Ly8gLSBGRiB2WzEzLCAzNilcblx0XHQvLyAtIElFIDExXG5cdFx0Ly8gLSBFZGdlIDExXG5cdFx0Ly8gLSBTYWZhcmkgdls2LCA5KVxuXG5cdFx0dmFyIGlzTWFwID0gcmVxdWlyZSgnaXMtbWFwJyk7XG5cdFx0dmFyIGlzU2V0ID0gcmVxdWlyZSgnaXMtc2V0Jyk7XG5cblx0XHQvLyBGaXJlZm94ID49IDI3LCBJRSAxMSwgU2FmYXJpIDYuMiAtIDksIEVkZ2UgMTEsIGVzNi1zaGltIGluIG9sZGVyIGVudnMsIGFsbCBoYXZlIGZvckVhY2hcblx0XHR2YXIgJG1hcEZvckVhY2ggPSBjYWxsQm91bmQoJ01hcC5wcm90b3R5cGUuZm9yRWFjaCcsIHRydWUpO1xuXHRcdHZhciAkc2V0Rm9yRWFjaCA9IGNhbGxCb3VuZCgnU2V0LnByb3RvdHlwZS5mb3JFYWNoJywgdHJ1ZSk7XG5cdFx0aWYgKHR5cGVvZiBwcm9jZXNzID09PSAndW5kZWZpbmVkJyB8fCAhcHJvY2Vzcy52ZXJzaW9ucyB8fCAhcHJvY2Vzcy52ZXJzaW9ucy5ub2RlKSB7IC8vIFwiaWYgaXMgbm90IG5vZGVcIlxuXG5cdFx0XHQvLyBGaXJlZm94IDE3IC0gMjYgaGFzIGAuaXRlcmF0b3IoKWAsIHdob3NlIGl0ZXJhdG9yIGAubmV4dCgpYCBlaXRoZXJcblx0XHRcdC8vIHJldHVybnMgYSB2YWx1ZSwgb3IgdGhyb3dzIGEgU3RvcEl0ZXJhdGlvbiBvYmplY3QuIFRoZXNlIGJyb3dzZXJzXG5cdFx0XHQvLyBkbyBub3QgaGF2ZSBhbnkgb3RoZXIgbWVjaGFuaXNtIGZvciBpdGVyYXRpb24uXG5cdFx0XHR2YXIgJG1hcEl0ZXJhdG9yID0gY2FsbEJvdW5kKCdNYXAucHJvdG90eXBlLml0ZXJhdG9yJywgdHJ1ZSk7XG5cdFx0XHR2YXIgJHNldEl0ZXJhdG9yID0gY2FsbEJvdW5kKCdTZXQucHJvdG90eXBlLml0ZXJhdG9yJywgdHJ1ZSk7XG5cdFx0XHR2YXIgZ2V0U3RvcEl0ZXJhdGlvbkl0ZXJhdG9yID0gZnVuY3Rpb24gKGl0ZXJhdG9yKSB7XG5cdFx0XHRcdHZhciBkb25lID0gZmFsc2U7XG5cdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0bmV4dDogZnVuY3Rpb24gbmV4dCgpIHtcblx0XHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHRcdFx0ZG9uZTogZG9uZSxcblx0XHRcdFx0XHRcdFx0XHR2YWx1ZTogZG9uZSA/IHVuZGVmaW5lZCA6IGl0ZXJhdG9yLm5leHQoKVxuXHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0XHRcdFx0XHRkb25lID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRcdFx0XHRkb25lOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRcdHZhbHVlOiB1bmRlZmluZWRcblx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH07XG5cdFx0XHR9O1xuXHRcdH1cblx0XHQvLyBGaXJlZm94IDI3LTM1LCBhbmQgc29tZSBvbGRlciBlczYtc2hpbSB2ZXJzaW9ucywgdXNlIGEgc3RyaW5nIFwiQEBpdGVyYXRvclwiIHByb3BlcnR5XG5cdFx0Ly8gdGhpcyByZXR1cm5zIGEgcHJvcGVyIGl0ZXJhdG9yIG9iamVjdCwgc28gd2Ugc2hvdWxkIHVzZSBpdCBpbnN0ZWFkIG9mIGZvckVhY2guXG5cdFx0Ly8gbmV3ZXIgZXM2LXNoaW0gdmVyc2lvbnMgdXNlIGEgc3RyaW5nIFwiX2VzNi1zaGltIGl0ZXJhdG9yX1wiIHByb3BlcnR5LlxuXHRcdHZhciAkbWFwQXRBdEl0ZXJhdG9yID0gY2FsbEJvdW5kKCdNYXAucHJvdG90eXBlLkBAaXRlcmF0b3InLCB0cnVlKSB8fCBjYWxsQm91bmQoJ01hcC5wcm90b3R5cGUuX2VzNi1zaGltIGl0ZXJhdG9yXycsIHRydWUpO1xuXHRcdHZhciAkc2V0QXRBdEl0ZXJhdG9yID0gY2FsbEJvdW5kKCdTZXQucHJvdG90eXBlLkBAaXRlcmF0b3InLCB0cnVlKSB8fCBjYWxsQm91bmQoJ1NldC5wcm90b3R5cGUuX2VzNi1zaGltIGl0ZXJhdG9yXycsIHRydWUpO1xuXG5cdFx0dmFyIGdldENvbGxlY3Rpb25JdGVyYXRvciA9IGZ1bmN0aW9uIGdldENvbGxlY3Rpb25JdGVyYXRvcihpdGVyYWJsZSkge1xuXHRcdFx0aWYgKGlzTWFwKGl0ZXJhYmxlKSkge1xuXHRcdFx0XHRpZiAoJG1hcEl0ZXJhdG9yKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGdldFN0b3BJdGVyYXRpb25JdGVyYXRvcigkbWFwSXRlcmF0b3IoaXRlcmFibGUpKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoJG1hcEF0QXRJdGVyYXRvcikge1xuXHRcdFx0XHRcdHJldHVybiAkbWFwQXRBdEl0ZXJhdG9yKGl0ZXJhYmxlKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoJG1hcEZvckVhY2gpIHtcblx0XHRcdFx0XHR2YXIgZW50cmllcyA9IFtdO1xuXHRcdFx0XHRcdCRtYXBGb3JFYWNoKGl0ZXJhYmxlLCBmdW5jdGlvbiAodiwgaykge1xuXHRcdFx0XHRcdFx0JGFycmF5UHVzaChlbnRyaWVzLCBbaywgdl0pO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdHJldHVybiBnZXRBcnJheUl0ZXJhdG9yKGVudHJpZXMpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZiAoaXNTZXQoaXRlcmFibGUpKSB7XG5cdFx0XHRcdGlmICgkc2V0SXRlcmF0b3IpIHtcblx0XHRcdFx0XHRyZXR1cm4gZ2V0U3RvcEl0ZXJhdGlvbkl0ZXJhdG9yKCRzZXRJdGVyYXRvcihpdGVyYWJsZSkpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICgkc2V0QXRBdEl0ZXJhdG9yKSB7XG5cdFx0XHRcdFx0cmV0dXJuICRzZXRBdEF0SXRlcmF0b3IoaXRlcmFibGUpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICgkc2V0Rm9yRWFjaCkge1xuXHRcdFx0XHRcdHZhciB2YWx1ZXMgPSBbXTtcblx0XHRcdFx0XHQkc2V0Rm9yRWFjaChpdGVyYWJsZSwgZnVuY3Rpb24gKHYpIHtcblx0XHRcdFx0XHRcdCRhcnJheVB1c2godmFsdWVzLCB2KTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRyZXR1cm4gZ2V0QXJyYXlJdGVyYXRvcih2YWx1ZXMpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZ2V0SXRlcmF0b3IoaXRlcmFibGUpIHtcblx0XHRcdHJldHVybiBnZXRDb2xsZWN0aW9uSXRlcmF0b3IoaXRlcmFibGUpIHx8IGdldE5vbkNvbGxlY3Rpb25JdGVyYXRvcihpdGVyYWJsZSk7XG5cdFx0fTtcblx0fVxufVxuXG59KS5jYWxsKHRoaXMscmVxdWlyZShcIktsaXViSFwiKSkiLCIndXNlIHN0cmljdCc7XG5cbnZhciBoYXNTeW1ib2xzID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSAnc3ltYm9sJztcblxudmFyIGlzUHJpbWl0aXZlID0gcmVxdWlyZSgnLi9oZWxwZXJzL2lzUHJpbWl0aXZlJyk7XG52YXIgaXNDYWxsYWJsZSA9IHJlcXVpcmUoJ2lzLWNhbGxhYmxlJyk7XG52YXIgaXNEYXRlID0gcmVxdWlyZSgnaXMtZGF0ZS1vYmplY3QnKTtcbnZhciBpc1N5bWJvbCA9IHJlcXVpcmUoJ2lzLXN5bWJvbCcpO1xuXG52YXIgb3JkaW5hcnlUb1ByaW1pdGl2ZSA9IGZ1bmN0aW9uIE9yZGluYXJ5VG9QcmltaXRpdmUoTywgaGludCkge1xuXHRpZiAodHlwZW9mIE8gPT09ICd1bmRlZmluZWQnIHx8IE8gPT09IG51bGwpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgY2FsbCBtZXRob2Qgb24gJyArIE8pO1xuXHR9XG5cdGlmICh0eXBlb2YgaGludCAhPT0gJ3N0cmluZycgfHwgKGhpbnQgIT09ICdudW1iZXInICYmIGhpbnQgIT09ICdzdHJpbmcnKSkge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ2hpbnQgbXVzdCBiZSBcInN0cmluZ1wiIG9yIFwibnVtYmVyXCInKTtcblx0fVxuXHR2YXIgbWV0aG9kTmFtZXMgPSBoaW50ID09PSAnc3RyaW5nJyA/IFsndG9TdHJpbmcnLCAndmFsdWVPZiddIDogWyd2YWx1ZU9mJywgJ3RvU3RyaW5nJ107XG5cdHZhciBtZXRob2QsIHJlc3VsdCwgaTtcblx0Zm9yIChpID0gMDsgaSA8IG1ldGhvZE5hbWVzLmxlbmd0aDsgKytpKSB7XG5cdFx0bWV0aG9kID0gT1ttZXRob2ROYW1lc1tpXV07XG5cdFx0aWYgKGlzQ2FsbGFibGUobWV0aG9kKSkge1xuXHRcdFx0cmVzdWx0ID0gbWV0aG9kLmNhbGwoTyk7XG5cdFx0XHRpZiAoaXNQcmltaXRpdmUocmVzdWx0KSkge1xuXHRcdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHR0aHJvdyBuZXcgVHlwZUVycm9yKCdObyBkZWZhdWx0IHZhbHVlJyk7XG59O1xuXG52YXIgR2V0TWV0aG9kID0gZnVuY3Rpb24gR2V0TWV0aG9kKE8sIFApIHtcblx0dmFyIGZ1bmMgPSBPW1BdO1xuXHRpZiAoZnVuYyAhPT0gbnVsbCAmJiB0eXBlb2YgZnVuYyAhPT0gJ3VuZGVmaW5lZCcpIHtcblx0XHRpZiAoIWlzQ2FsbGFibGUoZnVuYykpIHtcblx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoZnVuYyArICcgcmV0dXJuZWQgZm9yIHByb3BlcnR5ICcgKyBQICsgJyBvZiBvYmplY3QgJyArIE8gKyAnIGlzIG5vdCBhIGZ1bmN0aW9uJyk7XG5cdFx0fVxuXHRcdHJldHVybiBmdW5jO1xuXHR9XG5cdHJldHVybiB2b2lkIDA7XG59O1xuXG4vLyBodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wLyNzZWMtdG9wcmltaXRpdmVcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gVG9QcmltaXRpdmUoaW5wdXQpIHtcblx0aWYgKGlzUHJpbWl0aXZlKGlucHV0KSkge1xuXHRcdHJldHVybiBpbnB1dDtcblx0fVxuXHR2YXIgaGludCA9ICdkZWZhdWx0Jztcblx0aWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG5cdFx0aWYgKGFyZ3VtZW50c1sxXSA9PT0gU3RyaW5nKSB7XG5cdFx0XHRoaW50ID0gJ3N0cmluZyc7XG5cdFx0fSBlbHNlIGlmIChhcmd1bWVudHNbMV0gPT09IE51bWJlcikge1xuXHRcdFx0aGludCA9ICdudW1iZXInO1xuXHRcdH1cblx0fVxuXG5cdHZhciBleG90aWNUb1ByaW07XG5cdGlmIChoYXNTeW1ib2xzKSB7XG5cdFx0aWYgKFN5bWJvbC50b1ByaW1pdGl2ZSkge1xuXHRcdFx0ZXhvdGljVG9QcmltID0gR2V0TWV0aG9kKGlucHV0LCBTeW1ib2wudG9QcmltaXRpdmUpO1xuXHRcdH0gZWxzZSBpZiAoaXNTeW1ib2woaW5wdXQpKSB7XG5cdFx0XHRleG90aWNUb1ByaW0gPSBTeW1ib2wucHJvdG90eXBlLnZhbHVlT2Y7XG5cdFx0fVxuXHR9XG5cdGlmICh0eXBlb2YgZXhvdGljVG9QcmltICE9PSAndW5kZWZpbmVkJykge1xuXHRcdHZhciByZXN1bHQgPSBleG90aWNUb1ByaW0uY2FsbChpbnB1dCwgaGludCk7XG5cdFx0aWYgKGlzUHJpbWl0aXZlKHJlc3VsdCkpIHtcblx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0fVxuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ3VuYWJsZSB0byBjb252ZXJ0IGV4b3RpYyBvYmplY3QgdG8gcHJpbWl0aXZlJyk7XG5cdH1cblx0aWYgKGhpbnQgPT09ICdkZWZhdWx0JyAmJiAoaXNEYXRlKGlucHV0KSB8fCBpc1N5bWJvbChpbnB1dCkpKSB7XG5cdFx0aGludCA9ICdzdHJpbmcnO1xuXHR9XG5cdHJldHVybiBvcmRpbmFyeVRvUHJpbWl0aXZlKGlucHV0LCBoaW50ID09PSAnZGVmYXVsdCcgPyAnbnVtYmVyJyA6IGhpbnQpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGlzQ2FsbGFibGUgPSByZXF1aXJlKCdpcy1jYWxsYWJsZScpO1xuXG52YXIgdG9TdHIgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xudmFyIGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcblxudmFyIGZvckVhY2hBcnJheSA9IGZ1bmN0aW9uIGZvckVhY2hBcnJheShhcnJheSwgaXRlcmF0b3IsIHJlY2VpdmVyKSB7XG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGFycmF5Lmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGFycmF5LCBpKSkge1xuICAgICAgICAgICAgaWYgKHJlY2VpdmVyID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBpdGVyYXRvcihhcnJheVtpXSwgaSwgYXJyYXkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpdGVyYXRvci5jYWxsKHJlY2VpdmVyLCBhcnJheVtpXSwgaSwgYXJyYXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcblxudmFyIGZvckVhY2hTdHJpbmcgPSBmdW5jdGlvbiBmb3JFYWNoU3RyaW5nKHN0cmluZywgaXRlcmF0b3IsIHJlY2VpdmVyKSB7XG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHN0cmluZy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAvLyBubyBzdWNoIHRoaW5nIGFzIGEgc3BhcnNlIHN0cmluZy5cbiAgICAgICAgaWYgKHJlY2VpdmVyID09IG51bGwpIHtcbiAgICAgICAgICAgIGl0ZXJhdG9yKHN0cmluZy5jaGFyQXQoaSksIGksIHN0cmluZyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpdGVyYXRvci5jYWxsKHJlY2VpdmVyLCBzdHJpbmcuY2hhckF0KGkpLCBpLCBzdHJpbmcpO1xuICAgICAgICB9XG4gICAgfVxufTtcblxudmFyIGZvckVhY2hPYmplY3QgPSBmdW5jdGlvbiBmb3JFYWNoT2JqZWN0KG9iamVjdCwgaXRlcmF0b3IsIHJlY2VpdmVyKSB7XG4gICAgZm9yICh2YXIgayBpbiBvYmplY3QpIHtcbiAgICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrKSkge1xuICAgICAgICAgICAgaWYgKHJlY2VpdmVyID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBpdGVyYXRvcihvYmplY3Rba10sIGssIG9iamVjdCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGl0ZXJhdG9yLmNhbGwocmVjZWl2ZXIsIG9iamVjdFtrXSwgaywgb2JqZWN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5cbnZhciBmb3JFYWNoID0gZnVuY3Rpb24gZm9yRWFjaChsaXN0LCBpdGVyYXRvciwgdGhpc0FyZykge1xuICAgIGlmICghaXNDYWxsYWJsZShpdGVyYXRvcikpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignaXRlcmF0b3IgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG4gICAgfVxuXG4gICAgdmFyIHJlY2VpdmVyO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID49IDMpIHtcbiAgICAgICAgcmVjZWl2ZXIgPSB0aGlzQXJnO1xuICAgIH1cblxuICAgIGlmICh0b1N0ci5jYWxsKGxpc3QpID09PSAnW29iamVjdCBBcnJheV0nKSB7XG4gICAgICAgIGZvckVhY2hBcnJheShsaXN0LCBpdGVyYXRvciwgcmVjZWl2ZXIpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGxpc3QgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGZvckVhY2hTdHJpbmcobGlzdCwgaXRlcmF0b3IsIHJlY2VpdmVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBmb3JFYWNoT2JqZWN0KGxpc3QsIGl0ZXJhdG9yLCByZWNlaXZlcik7XG4gICAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmb3JFYWNoO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKiBlc2xpbnQgbm8taW52YWxpZC10aGlzOiAxICovXG5cbnZhciBFUlJPUl9NRVNTQUdFID0gJ0Z1bmN0aW9uLnByb3RvdHlwZS5iaW5kIGNhbGxlZCBvbiBpbmNvbXBhdGlibGUgJztcbnZhciBzbGljZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZTtcbnZhciB0b1N0ciA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG52YXIgZnVuY1R5cGUgPSAnW29iamVjdCBGdW5jdGlvbl0nO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGJpbmQodGhhdCkge1xuICAgIHZhciB0YXJnZXQgPSB0aGlzO1xuICAgIGlmICh0eXBlb2YgdGFyZ2V0ICE9PSAnZnVuY3Rpb24nIHx8IHRvU3RyLmNhbGwodGFyZ2V0KSAhPT0gZnVuY1R5cGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihFUlJPUl9NRVNTQUdFICsgdGFyZ2V0KTtcbiAgICB9XG4gICAgdmFyIGFyZ3MgPSBzbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG5cbiAgICB2YXIgYm91bmQ7XG4gICAgdmFyIGJpbmRlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBib3VuZCkge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHRhcmdldC5hcHBseShcbiAgICAgICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICAgICAgIGFyZ3MuY29uY2F0KHNsaWNlLmNhbGwoYXJndW1lbnRzKSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoT2JqZWN0KHJlc3VsdCkgPT09IHJlc3VsdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0YXJnZXQuYXBwbHkoXG4gICAgICAgICAgICAgICAgdGhhdCxcbiAgICAgICAgICAgICAgICBhcmdzLmNvbmNhdChzbGljZS5jYWxsKGFyZ3VtZW50cykpXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIHZhciBib3VuZExlbmd0aCA9IE1hdGgubWF4KDAsIHRhcmdldC5sZW5ndGggLSBhcmdzLmxlbmd0aCk7XG4gICAgdmFyIGJvdW5kQXJncyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYm91bmRMZW5ndGg7IGkrKykge1xuICAgICAgICBib3VuZEFyZ3MucHVzaCgnJCcgKyBpKTtcbiAgICB9XG5cbiAgICBib3VuZCA9IEZ1bmN0aW9uKCdiaW5kZXInLCAncmV0dXJuIGZ1bmN0aW9uICgnICsgYm91bmRBcmdzLmpvaW4oJywnKSArICcpeyByZXR1cm4gYmluZGVyLmFwcGx5KHRoaXMsYXJndW1lbnRzKTsgfScpKGJpbmRlcik7XG5cbiAgICBpZiAodGFyZ2V0LnByb3RvdHlwZSkge1xuICAgICAgICB2YXIgRW1wdHkgPSBmdW5jdGlvbiBFbXB0eSgpIHt9O1xuICAgICAgICBFbXB0eS5wcm90b3R5cGUgPSB0YXJnZXQucHJvdG90eXBlO1xuICAgICAgICBib3VuZC5wcm90b3R5cGUgPSBuZXcgRW1wdHkoKTtcbiAgICAgICAgRW1wdHkucHJvdG90eXBlID0gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gYm91bmQ7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgaW1wbGVtZW50YXRpb24gPSByZXF1aXJlKCcuL2ltcGxlbWVudGF0aW9uJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQgfHwgaW1wbGVtZW50YXRpb247XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBmdW5jdGlvbnNIYXZlTmFtZXMgPSBmdW5jdGlvbiBmdW5jdGlvbnNIYXZlTmFtZXMoKSB7XG5cdHJldHVybiB0eXBlb2YgZnVuY3Rpb24gZigpIHt9Lm5hbWUgPT09ICdzdHJpbmcnO1xufTtcblxudmFyIGdPUEQgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuaWYgKGdPUEQpIHtcblx0dHJ5IHtcblx0XHRnT1BEKFtdLCAnbGVuZ3RoJyk7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHQvLyBJRSA4IGhhcyBhIGJyb2tlbiBnT1BEXG5cdFx0Z09QRCA9IG51bGw7XG5cdH1cbn1cblxuZnVuY3Rpb25zSGF2ZU5hbWVzLmZ1bmN0aW9uc0hhdmVDb25maWd1cmFibGVOYW1lcyA9IGZ1bmN0aW9uIGZ1bmN0aW9uc0hhdmVDb25maWd1cmFibGVOYW1lcygpIHtcblx0aWYgKCFmdW5jdGlvbnNIYXZlTmFtZXMoKSB8fCAhZ09QRCkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXHR2YXIgZGVzYyA9IGdPUEQoZnVuY3Rpb24gKCkge30sICduYW1lJyk7XG5cdHJldHVybiAhIWRlc2MgJiYgISFkZXNjLmNvbmZpZ3VyYWJsZTtcbn07XG5cbnZhciAkYmluZCA9IEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kO1xuXG5mdW5jdGlvbnNIYXZlTmFtZXMuYm91bmRGdW5jdGlvbnNIYXZlTmFtZXMgPSBmdW5jdGlvbiBib3VuZEZ1bmN0aW9uc0hhdmVOYW1lcygpIHtcblx0cmV0dXJuIGZ1bmN0aW9uc0hhdmVOYW1lcygpICYmIHR5cGVvZiAkYmluZCA9PT0gJ2Z1bmN0aW9uJyAmJiBmdW5jdGlvbiBmKCkge30uYmluZCgpLm5hbWUgIT09ICcnO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbnNIYXZlTmFtZXM7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB1bmRlZmluZWQ7XG5cbnZhciAkU3ludGF4RXJyb3IgPSBTeW50YXhFcnJvcjtcbnZhciAkRnVuY3Rpb24gPSBGdW5jdGlvbjtcbnZhciAkVHlwZUVycm9yID0gVHlwZUVycm9yO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29uc2lzdGVudC1yZXR1cm5cbnZhciBnZXRFdmFsbGVkQ29uc3RydWN0b3IgPSBmdW5jdGlvbiAoZXhwcmVzc2lvblN5bnRheCkge1xuXHR0cnkge1xuXHRcdHJldHVybiAkRnVuY3Rpb24oJ1widXNlIHN0cmljdFwiOyByZXR1cm4gKCcgKyBleHByZXNzaW9uU3ludGF4ICsgJykuY29uc3RydWN0b3I7JykoKTtcblx0fSBjYXRjaCAoZSkge31cbn07XG5cbnZhciAkZ09QRCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG5pZiAoJGdPUEQpIHtcblx0dHJ5IHtcblx0XHQkZ09QRCh7fSwgJycpO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0JGdPUEQgPSBudWxsOyAvLyB0aGlzIGlzIElFIDgsIHdoaWNoIGhhcyBhIGJyb2tlbiBnT1BEXG5cdH1cbn1cblxudmFyIHRocm93VHlwZUVycm9yID0gZnVuY3Rpb24gKCkge1xuXHR0aHJvdyBuZXcgJFR5cGVFcnJvcigpO1xufTtcbnZhciBUaHJvd1R5cGVFcnJvciA9ICRnT1BEXG5cdD8gKGZ1bmN0aW9uICgpIHtcblx0XHR0cnkge1xuXHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC1leHByZXNzaW9ucywgbm8tY2FsbGVyLCBuby1yZXN0cmljdGVkLXByb3BlcnRpZXNcblx0XHRcdGFyZ3VtZW50cy5jYWxsZWU7IC8vIElFIDggZG9lcyBub3QgdGhyb3cgaGVyZVxuXHRcdFx0cmV0dXJuIHRocm93VHlwZUVycm9yO1xuXHRcdH0gY2F0Y2ggKGNhbGxlZVRocm93cykge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0Ly8gSUUgOCB0aHJvd3Mgb24gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihhcmd1bWVudHMsICcnKVxuXHRcdFx0XHRyZXR1cm4gJGdPUEQoYXJndW1lbnRzLCAnY2FsbGVlJykuZ2V0O1xuXHRcdFx0fSBjYXRjaCAoZ09QRHRocm93cykge1xuXHRcdFx0XHRyZXR1cm4gdGhyb3dUeXBlRXJyb3I7XG5cdFx0XHR9XG5cdFx0fVxuXHR9KCkpXG5cdDogdGhyb3dUeXBlRXJyb3I7XG5cbnZhciBoYXNTeW1ib2xzID0gcmVxdWlyZSgnaGFzLXN5bWJvbHMnKSgpO1xuXG52YXIgZ2V0UHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YgfHwgZnVuY3Rpb24gKHgpIHsgcmV0dXJuIHguX19wcm90b19fOyB9OyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXByb3RvXG5cbnZhciBuZWVkc0V2YWwgPSB7fTtcblxudmFyIFR5cGVkQXJyYXkgPSB0eXBlb2YgVWludDhBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBnZXRQcm90byhVaW50OEFycmF5KTtcblxudmFyIElOVFJJTlNJQ1MgPSB7XG5cdCclQWdncmVnYXRlRXJyb3IlJzogdHlwZW9mIEFnZ3JlZ2F0ZUVycm9yID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEFnZ3JlZ2F0ZUVycm9yLFxuXHQnJUFycmF5JSc6IEFycmF5LFxuXHQnJUFycmF5QnVmZmVyJSc6IHR5cGVvZiBBcnJheUJ1ZmZlciA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBBcnJheUJ1ZmZlcixcblx0JyVBcnJheUl0ZXJhdG9yUHJvdG90eXBlJSc6IGhhc1N5bWJvbHMgPyBnZXRQcm90byhbXVtTeW1ib2wuaXRlcmF0b3JdKCkpIDogdW5kZWZpbmVkLFxuXHQnJUFzeW5jRnJvbVN5bmNJdGVyYXRvclByb3RvdHlwZSUnOiB1bmRlZmluZWQsXG5cdCclQXN5bmNGdW5jdGlvbiUnOiBuZWVkc0V2YWwsXG5cdCclQXN5bmNHZW5lcmF0b3IlJzogbmVlZHNFdmFsLFxuXHQnJUFzeW5jR2VuZXJhdG9yRnVuY3Rpb24lJzogbmVlZHNFdmFsLFxuXHQnJUFzeW5jSXRlcmF0b3JQcm90b3R5cGUlJzogbmVlZHNFdmFsLFxuXHQnJUF0b21pY3MlJzogdHlwZW9mIEF0b21pY3MgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogQXRvbWljcyxcblx0JyVCaWdJbnQlJzogdHlwZW9mIEJpZ0ludCA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBCaWdJbnQsXG5cdCclQm9vbGVhbiUnOiBCb29sZWFuLFxuXHQnJURhdGFWaWV3JSc6IHR5cGVvZiBEYXRhVmlldyA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBEYXRhVmlldyxcblx0JyVEYXRlJSc6IERhdGUsXG5cdCclZGVjb2RlVVJJJSc6IGRlY29kZVVSSSxcblx0JyVkZWNvZGVVUklDb21wb25lbnQlJzogZGVjb2RlVVJJQ29tcG9uZW50LFxuXHQnJWVuY29kZVVSSSUnOiBlbmNvZGVVUkksXG5cdCclZW5jb2RlVVJJQ29tcG9uZW50JSc6IGVuY29kZVVSSUNvbXBvbmVudCxcblx0JyVFcnJvciUnOiBFcnJvcixcblx0JyVldmFsJSc6IGV2YWwsIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tZXZhbFxuXHQnJUV2YWxFcnJvciUnOiBFdmFsRXJyb3IsXG5cdCclRmxvYXQzMkFycmF5JSc6IHR5cGVvZiBGbG9hdDMyQXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogRmxvYXQzMkFycmF5LFxuXHQnJUZsb2F0NjRBcnJheSUnOiB0eXBlb2YgRmxvYXQ2NEFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEZsb2F0NjRBcnJheSxcblx0JyVGaW5hbGl6YXRpb25SZWdpc3RyeSUnOiB0eXBlb2YgRmluYWxpemF0aW9uUmVnaXN0cnkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogRmluYWxpemF0aW9uUmVnaXN0cnksXG5cdCclRnVuY3Rpb24lJzogJEZ1bmN0aW9uLFxuXHQnJUdlbmVyYXRvckZ1bmN0aW9uJSc6IG5lZWRzRXZhbCxcblx0JyVJbnQ4QXJyYXklJzogdHlwZW9mIEludDhBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBJbnQ4QXJyYXksXG5cdCclSW50MTZBcnJheSUnOiB0eXBlb2YgSW50MTZBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBJbnQxNkFycmF5LFxuXHQnJUludDMyQXJyYXklJzogdHlwZW9mIEludDMyQXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogSW50MzJBcnJheSxcblx0JyVpc0Zpbml0ZSUnOiBpc0Zpbml0ZSxcblx0JyVpc05hTiUnOiBpc05hTixcblx0JyVJdGVyYXRvclByb3RvdHlwZSUnOiBoYXNTeW1ib2xzID8gZ2V0UHJvdG8oZ2V0UHJvdG8oW11bU3ltYm9sLml0ZXJhdG9yXSgpKSkgOiB1bmRlZmluZWQsXG5cdCclSlNPTiUnOiB0eXBlb2YgSlNPTiA9PT0gJ29iamVjdCcgPyBKU09OIDogdW5kZWZpbmVkLFxuXHQnJU1hcCUnOiB0eXBlb2YgTWFwID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IE1hcCxcblx0JyVNYXBJdGVyYXRvclByb3RvdHlwZSUnOiB0eXBlb2YgTWFwID09PSAndW5kZWZpbmVkJyB8fCAhaGFzU3ltYm9scyA/IHVuZGVmaW5lZCA6IGdldFByb3RvKG5ldyBNYXAoKVtTeW1ib2wuaXRlcmF0b3JdKCkpLFxuXHQnJU1hdGglJzogTWF0aCxcblx0JyVOdW1iZXIlJzogTnVtYmVyLFxuXHQnJU9iamVjdCUnOiBPYmplY3QsXG5cdCclcGFyc2VGbG9hdCUnOiBwYXJzZUZsb2F0LFxuXHQnJXBhcnNlSW50JSc6IHBhcnNlSW50LFxuXHQnJVByb21pc2UlJzogdHlwZW9mIFByb21pc2UgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogUHJvbWlzZSxcblx0JyVQcm94eSUnOiB0eXBlb2YgUHJveHkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogUHJveHksXG5cdCclUmFuZ2VFcnJvciUnOiBSYW5nZUVycm9yLFxuXHQnJVJlZmVyZW5jZUVycm9yJSc6IFJlZmVyZW5jZUVycm9yLFxuXHQnJVJlZmxlY3QlJzogdHlwZW9mIFJlZmxlY3QgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogUmVmbGVjdCxcblx0JyVSZWdFeHAlJzogUmVnRXhwLFxuXHQnJVNldCUnOiB0eXBlb2YgU2V0ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFNldCxcblx0JyVTZXRJdGVyYXRvclByb3RvdHlwZSUnOiB0eXBlb2YgU2V0ID09PSAndW5kZWZpbmVkJyB8fCAhaGFzU3ltYm9scyA/IHVuZGVmaW5lZCA6IGdldFByb3RvKG5ldyBTZXQoKVtTeW1ib2wuaXRlcmF0b3JdKCkpLFxuXHQnJVNoYXJlZEFycmF5QnVmZmVyJSc6IHR5cGVvZiBTaGFyZWRBcnJheUJ1ZmZlciA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBTaGFyZWRBcnJheUJ1ZmZlcixcblx0JyVTdHJpbmclJzogU3RyaW5nLFxuXHQnJVN0cmluZ0l0ZXJhdG9yUHJvdG90eXBlJSc6IGhhc1N5bWJvbHMgPyBnZXRQcm90bygnJ1tTeW1ib2wuaXRlcmF0b3JdKCkpIDogdW5kZWZpbmVkLFxuXHQnJVN5bWJvbCUnOiBoYXNTeW1ib2xzID8gU3ltYm9sIDogdW5kZWZpbmVkLFxuXHQnJVN5bnRheEVycm9yJSc6ICRTeW50YXhFcnJvcixcblx0JyVUaHJvd1R5cGVFcnJvciUnOiBUaHJvd1R5cGVFcnJvcixcblx0JyVUeXBlZEFycmF5JSc6IFR5cGVkQXJyYXksXG5cdCclVHlwZUVycm9yJSc6ICRUeXBlRXJyb3IsXG5cdCclVWludDhBcnJheSUnOiB0eXBlb2YgVWludDhBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBVaW50OEFycmF5LFxuXHQnJVVpbnQ4Q2xhbXBlZEFycmF5JSc6IHR5cGVvZiBVaW50OENsYW1wZWRBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBVaW50OENsYW1wZWRBcnJheSxcblx0JyVVaW50MTZBcnJheSUnOiB0eXBlb2YgVWludDE2QXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogVWludDE2QXJyYXksXG5cdCclVWludDMyQXJyYXklJzogdHlwZW9mIFVpbnQzMkFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFVpbnQzMkFycmF5LFxuXHQnJVVSSUVycm9yJSc6IFVSSUVycm9yLFxuXHQnJVdlYWtNYXAlJzogdHlwZW9mIFdlYWtNYXAgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogV2Vha01hcCxcblx0JyVXZWFrUmVmJSc6IHR5cGVvZiBXZWFrUmVmID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFdlYWtSZWYsXG5cdCclV2Vha1NldCUnOiB0eXBlb2YgV2Vha1NldCA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBXZWFrU2V0XG59O1xuXG52YXIgZG9FdmFsID0gZnVuY3Rpb24gZG9FdmFsKG5hbWUpIHtcblx0dmFyIHZhbHVlO1xuXHRpZiAobmFtZSA9PT0gJyVBc3luY0Z1bmN0aW9uJScpIHtcblx0XHR2YWx1ZSA9IGdldEV2YWxsZWRDb25zdHJ1Y3RvcignYXN5bmMgZnVuY3Rpb24gKCkge30nKTtcblx0fSBlbHNlIGlmIChuYW1lID09PSAnJUdlbmVyYXRvckZ1bmN0aW9uJScpIHtcblx0XHR2YWx1ZSA9IGdldEV2YWxsZWRDb25zdHJ1Y3RvcignZnVuY3Rpb24qICgpIHt9Jyk7XG5cdH0gZWxzZSBpZiAobmFtZSA9PT0gJyVBc3luY0dlbmVyYXRvckZ1bmN0aW9uJScpIHtcblx0XHR2YWx1ZSA9IGdldEV2YWxsZWRDb25zdHJ1Y3RvcignYXN5bmMgZnVuY3Rpb24qICgpIHt9Jyk7XG5cdH0gZWxzZSBpZiAobmFtZSA9PT0gJyVBc3luY0dlbmVyYXRvciUnKSB7XG5cdFx0dmFyIGZuID0gZG9FdmFsKCclQXN5bmNHZW5lcmF0b3JGdW5jdGlvbiUnKTtcblx0XHRpZiAoZm4pIHtcblx0XHRcdHZhbHVlID0gZm4ucHJvdG90eXBlO1xuXHRcdH1cblx0fSBlbHNlIGlmIChuYW1lID09PSAnJUFzeW5jSXRlcmF0b3JQcm90b3R5cGUlJykge1xuXHRcdHZhciBnZW4gPSBkb0V2YWwoJyVBc3luY0dlbmVyYXRvciUnKTtcblx0XHRpZiAoZ2VuKSB7XG5cdFx0XHR2YWx1ZSA9IGdldFByb3RvKGdlbi5wcm90b3R5cGUpO1xuXHRcdH1cblx0fVxuXG5cdElOVFJJTlNJQ1NbbmFtZV0gPSB2YWx1ZTtcblxuXHRyZXR1cm4gdmFsdWU7XG59O1xuXG52YXIgTEVHQUNZX0FMSUFTRVMgPSB7XG5cdCclQXJyYXlCdWZmZXJQcm90b3R5cGUlJzogWydBcnJheUJ1ZmZlcicsICdwcm90b3R5cGUnXSxcblx0JyVBcnJheVByb3RvdHlwZSUnOiBbJ0FycmF5JywgJ3Byb3RvdHlwZSddLFxuXHQnJUFycmF5UHJvdG9fZW50cmllcyUnOiBbJ0FycmF5JywgJ3Byb3RvdHlwZScsICdlbnRyaWVzJ10sXG5cdCclQXJyYXlQcm90b19mb3JFYWNoJSc6IFsnQXJyYXknLCAncHJvdG90eXBlJywgJ2ZvckVhY2gnXSxcblx0JyVBcnJheVByb3RvX2tleXMlJzogWydBcnJheScsICdwcm90b3R5cGUnLCAna2V5cyddLFxuXHQnJUFycmF5UHJvdG9fdmFsdWVzJSc6IFsnQXJyYXknLCAncHJvdG90eXBlJywgJ3ZhbHVlcyddLFxuXHQnJUFzeW5jRnVuY3Rpb25Qcm90b3R5cGUlJzogWydBc3luY0Z1bmN0aW9uJywgJ3Byb3RvdHlwZSddLFxuXHQnJUFzeW5jR2VuZXJhdG9yJSc6IFsnQXN5bmNHZW5lcmF0b3JGdW5jdGlvbicsICdwcm90b3R5cGUnXSxcblx0JyVBc3luY0dlbmVyYXRvclByb3RvdHlwZSUnOiBbJ0FzeW5jR2VuZXJhdG9yRnVuY3Rpb24nLCAncHJvdG90eXBlJywgJ3Byb3RvdHlwZSddLFxuXHQnJUJvb2xlYW5Qcm90b3R5cGUlJzogWydCb29sZWFuJywgJ3Byb3RvdHlwZSddLFxuXHQnJURhdGFWaWV3UHJvdG90eXBlJSc6IFsnRGF0YVZpZXcnLCAncHJvdG90eXBlJ10sXG5cdCclRGF0ZVByb3RvdHlwZSUnOiBbJ0RhdGUnLCAncHJvdG90eXBlJ10sXG5cdCclRXJyb3JQcm90b3R5cGUlJzogWydFcnJvcicsICdwcm90b3R5cGUnXSxcblx0JyVFdmFsRXJyb3JQcm90b3R5cGUlJzogWydFdmFsRXJyb3InLCAncHJvdG90eXBlJ10sXG5cdCclRmxvYXQzMkFycmF5UHJvdG90eXBlJSc6IFsnRmxvYXQzMkFycmF5JywgJ3Byb3RvdHlwZSddLFxuXHQnJUZsb2F0NjRBcnJheVByb3RvdHlwZSUnOiBbJ0Zsb2F0NjRBcnJheScsICdwcm90b3R5cGUnXSxcblx0JyVGdW5jdGlvblByb3RvdHlwZSUnOiBbJ0Z1bmN0aW9uJywgJ3Byb3RvdHlwZSddLFxuXHQnJUdlbmVyYXRvciUnOiBbJ0dlbmVyYXRvckZ1bmN0aW9uJywgJ3Byb3RvdHlwZSddLFxuXHQnJUdlbmVyYXRvclByb3RvdHlwZSUnOiBbJ0dlbmVyYXRvckZ1bmN0aW9uJywgJ3Byb3RvdHlwZScsICdwcm90b3R5cGUnXSxcblx0JyVJbnQ4QXJyYXlQcm90b3R5cGUlJzogWydJbnQ4QXJyYXknLCAncHJvdG90eXBlJ10sXG5cdCclSW50MTZBcnJheVByb3RvdHlwZSUnOiBbJ0ludDE2QXJyYXknLCAncHJvdG90eXBlJ10sXG5cdCclSW50MzJBcnJheVByb3RvdHlwZSUnOiBbJ0ludDMyQXJyYXknLCAncHJvdG90eXBlJ10sXG5cdCclSlNPTlBhcnNlJSc6IFsnSlNPTicsICdwYXJzZSddLFxuXHQnJUpTT05TdHJpbmdpZnklJzogWydKU09OJywgJ3N0cmluZ2lmeSddLFxuXHQnJU1hcFByb3RvdHlwZSUnOiBbJ01hcCcsICdwcm90b3R5cGUnXSxcblx0JyVOdW1iZXJQcm90b3R5cGUlJzogWydOdW1iZXInLCAncHJvdG90eXBlJ10sXG5cdCclT2JqZWN0UHJvdG90eXBlJSc6IFsnT2JqZWN0JywgJ3Byb3RvdHlwZSddLFxuXHQnJU9ialByb3RvX3RvU3RyaW5nJSc6IFsnT2JqZWN0JywgJ3Byb3RvdHlwZScsICd0b1N0cmluZyddLFxuXHQnJU9ialByb3RvX3ZhbHVlT2YlJzogWydPYmplY3QnLCAncHJvdG90eXBlJywgJ3ZhbHVlT2YnXSxcblx0JyVQcm9taXNlUHJvdG90eXBlJSc6IFsnUHJvbWlzZScsICdwcm90b3R5cGUnXSxcblx0JyVQcm9taXNlUHJvdG9fdGhlbiUnOiBbJ1Byb21pc2UnLCAncHJvdG90eXBlJywgJ3RoZW4nXSxcblx0JyVQcm9taXNlX2FsbCUnOiBbJ1Byb21pc2UnLCAnYWxsJ10sXG5cdCclUHJvbWlzZV9yZWplY3QlJzogWydQcm9taXNlJywgJ3JlamVjdCddLFxuXHQnJVByb21pc2VfcmVzb2x2ZSUnOiBbJ1Byb21pc2UnLCAncmVzb2x2ZSddLFxuXHQnJVJhbmdlRXJyb3JQcm90b3R5cGUlJzogWydSYW5nZUVycm9yJywgJ3Byb3RvdHlwZSddLFxuXHQnJVJlZmVyZW5jZUVycm9yUHJvdG90eXBlJSc6IFsnUmVmZXJlbmNlRXJyb3InLCAncHJvdG90eXBlJ10sXG5cdCclUmVnRXhwUHJvdG90eXBlJSc6IFsnUmVnRXhwJywgJ3Byb3RvdHlwZSddLFxuXHQnJVNldFByb3RvdHlwZSUnOiBbJ1NldCcsICdwcm90b3R5cGUnXSxcblx0JyVTaGFyZWRBcnJheUJ1ZmZlclByb3RvdHlwZSUnOiBbJ1NoYXJlZEFycmF5QnVmZmVyJywgJ3Byb3RvdHlwZSddLFxuXHQnJVN0cmluZ1Byb3RvdHlwZSUnOiBbJ1N0cmluZycsICdwcm90b3R5cGUnXSxcblx0JyVTeW1ib2xQcm90b3R5cGUlJzogWydTeW1ib2wnLCAncHJvdG90eXBlJ10sXG5cdCclU3ludGF4RXJyb3JQcm90b3R5cGUlJzogWydTeW50YXhFcnJvcicsICdwcm90b3R5cGUnXSxcblx0JyVUeXBlZEFycmF5UHJvdG90eXBlJSc6IFsnVHlwZWRBcnJheScsICdwcm90b3R5cGUnXSxcblx0JyVUeXBlRXJyb3JQcm90b3R5cGUlJzogWydUeXBlRXJyb3InLCAncHJvdG90eXBlJ10sXG5cdCclVWludDhBcnJheVByb3RvdHlwZSUnOiBbJ1VpbnQ4QXJyYXknLCAncHJvdG90eXBlJ10sXG5cdCclVWludDhDbGFtcGVkQXJyYXlQcm90b3R5cGUlJzogWydVaW50OENsYW1wZWRBcnJheScsICdwcm90b3R5cGUnXSxcblx0JyVVaW50MTZBcnJheVByb3RvdHlwZSUnOiBbJ1VpbnQxNkFycmF5JywgJ3Byb3RvdHlwZSddLFxuXHQnJVVpbnQzMkFycmF5UHJvdG90eXBlJSc6IFsnVWludDMyQXJyYXknLCAncHJvdG90eXBlJ10sXG5cdCclVVJJRXJyb3JQcm90b3R5cGUlJzogWydVUklFcnJvcicsICdwcm90b3R5cGUnXSxcblx0JyVXZWFrTWFwUHJvdG90eXBlJSc6IFsnV2Vha01hcCcsICdwcm90b3R5cGUnXSxcblx0JyVXZWFrU2V0UHJvdG90eXBlJSc6IFsnV2Vha1NldCcsICdwcm90b3R5cGUnXVxufTtcblxudmFyIGJpbmQgPSByZXF1aXJlKCdmdW5jdGlvbi1iaW5kJyk7XG52YXIgaGFzT3duID0gcmVxdWlyZSgnaGFzJyk7XG52YXIgJGNvbmNhdCA9IGJpbmQuY2FsbChGdW5jdGlvbi5jYWxsLCBBcnJheS5wcm90b3R5cGUuY29uY2F0KTtcbnZhciAkc3BsaWNlQXBwbHkgPSBiaW5kLmNhbGwoRnVuY3Rpb24uYXBwbHksIEFycmF5LnByb3RvdHlwZS5zcGxpY2UpO1xudmFyICRyZXBsYWNlID0gYmluZC5jYWxsKEZ1bmN0aW9uLmNhbGwsIFN0cmluZy5wcm90b3R5cGUucmVwbGFjZSk7XG52YXIgJHN0clNsaWNlID0gYmluZC5jYWxsKEZ1bmN0aW9uLmNhbGwsIFN0cmluZy5wcm90b3R5cGUuc2xpY2UpO1xuXG4vKiBhZGFwdGVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2xvZGFzaC9sb2Rhc2gvYmxvYi80LjE3LjE1L2Rpc3QvbG9kYXNoLmpzI0w2NzM1LUw2NzQ0ICovXG52YXIgcmVQcm9wTmFtZSA9IC9bXiUuW1xcXV0rfFxcWyg/OigtP1xcZCsoPzpcXC5cXGQrKT8pfChbXCInXSkoKD86KD8hXFwyKVteXFxcXF18XFxcXC4pKj8pXFwyKVxcXXwoPz0oPzpcXC58XFxbXFxdKSg/OlxcLnxcXFtcXF18JSQpKS9nO1xudmFyIHJlRXNjYXBlQ2hhciA9IC9cXFxcKFxcXFwpPy9nOyAvKiogVXNlZCB0byBtYXRjaCBiYWNrc2xhc2hlcyBpbiBwcm9wZXJ0eSBwYXRocy4gKi9cbnZhciBzdHJpbmdUb1BhdGggPSBmdW5jdGlvbiBzdHJpbmdUb1BhdGgoc3RyaW5nKSB7XG5cdHZhciBmaXJzdCA9ICRzdHJTbGljZShzdHJpbmcsIDAsIDEpO1xuXHR2YXIgbGFzdCA9ICRzdHJTbGljZShzdHJpbmcsIC0xKTtcblx0aWYgKGZpcnN0ID09PSAnJScgJiYgbGFzdCAhPT0gJyUnKSB7XG5cdFx0dGhyb3cgbmV3ICRTeW50YXhFcnJvcignaW52YWxpZCBpbnRyaW5zaWMgc3ludGF4LCBleHBlY3RlZCBjbG9zaW5nIGAlYCcpO1xuXHR9IGVsc2UgaWYgKGxhc3QgPT09ICclJyAmJiBmaXJzdCAhPT0gJyUnKSB7XG5cdFx0dGhyb3cgbmV3ICRTeW50YXhFcnJvcignaW52YWxpZCBpbnRyaW5zaWMgc3ludGF4LCBleHBlY3RlZCBvcGVuaW5nIGAlYCcpO1xuXHR9XG5cdHZhciByZXN1bHQgPSBbXTtcblx0JHJlcGxhY2Uoc3RyaW5nLCByZVByb3BOYW1lLCBmdW5jdGlvbiAobWF0Y2gsIG51bWJlciwgcXVvdGUsIHN1YlN0cmluZykge1xuXHRcdHJlc3VsdFtyZXN1bHQubGVuZ3RoXSA9IHF1b3RlID8gJHJlcGxhY2Uoc3ViU3RyaW5nLCByZUVzY2FwZUNoYXIsICckMScpIDogbnVtYmVyIHx8IG1hdGNoO1xuXHR9KTtcblx0cmV0dXJuIHJlc3VsdDtcbn07XG4vKiBlbmQgYWRhcHRhdGlvbiAqL1xuXG52YXIgZ2V0QmFzZUludHJpbnNpYyA9IGZ1bmN0aW9uIGdldEJhc2VJbnRyaW5zaWMobmFtZSwgYWxsb3dNaXNzaW5nKSB7XG5cdHZhciBpbnRyaW5zaWNOYW1lID0gbmFtZTtcblx0dmFyIGFsaWFzO1xuXHRpZiAoaGFzT3duKExFR0FDWV9BTElBU0VTLCBpbnRyaW5zaWNOYW1lKSkge1xuXHRcdGFsaWFzID0gTEVHQUNZX0FMSUFTRVNbaW50cmluc2ljTmFtZV07XG5cdFx0aW50cmluc2ljTmFtZSA9ICclJyArIGFsaWFzWzBdICsgJyUnO1xuXHR9XG5cblx0aWYgKGhhc093bihJTlRSSU5TSUNTLCBpbnRyaW5zaWNOYW1lKSkge1xuXHRcdHZhciB2YWx1ZSA9IElOVFJJTlNJQ1NbaW50cmluc2ljTmFtZV07XG5cdFx0aWYgKHZhbHVlID09PSBuZWVkc0V2YWwpIHtcblx0XHRcdHZhbHVlID0gZG9FdmFsKGludHJpbnNpY05hbWUpO1xuXHRcdH1cblx0XHRpZiAodHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJyAmJiAhYWxsb3dNaXNzaW5nKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignaW50cmluc2ljICcgKyBuYW1lICsgJyBleGlzdHMsIGJ1dCBpcyBub3QgYXZhaWxhYmxlLiBQbGVhc2UgZmlsZSBhbiBpc3N1ZSEnKTtcblx0XHR9XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0YWxpYXM6IGFsaWFzLFxuXHRcdFx0bmFtZTogaW50cmluc2ljTmFtZSxcblx0XHRcdHZhbHVlOiB2YWx1ZVxuXHRcdH07XG5cdH1cblxuXHR0aHJvdyBuZXcgJFN5bnRheEVycm9yKCdpbnRyaW5zaWMgJyArIG5hbWUgKyAnIGRvZXMgbm90IGV4aXN0IScpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBHZXRJbnRyaW5zaWMobmFtZSwgYWxsb3dNaXNzaW5nKSB7XG5cdGlmICh0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycgfHwgbmFtZS5sZW5ndGggPT09IDApIHtcblx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignaW50cmluc2ljIG5hbWUgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcnKTtcblx0fVxuXHRpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgdHlwZW9mIGFsbG93TWlzc2luZyAhPT0gJ2Jvb2xlYW4nKSB7XG5cdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ1wiYWxsb3dNaXNzaW5nXCIgYXJndW1lbnQgbXVzdCBiZSBhIGJvb2xlYW4nKTtcblx0fVxuXG5cdHZhciBwYXJ0cyA9IHN0cmluZ1RvUGF0aChuYW1lKTtcblx0dmFyIGludHJpbnNpY0Jhc2VOYW1lID0gcGFydHMubGVuZ3RoID4gMCA/IHBhcnRzWzBdIDogJyc7XG5cblx0dmFyIGludHJpbnNpYyA9IGdldEJhc2VJbnRyaW5zaWMoJyUnICsgaW50cmluc2ljQmFzZU5hbWUgKyAnJScsIGFsbG93TWlzc2luZyk7XG5cdHZhciBpbnRyaW5zaWNSZWFsTmFtZSA9IGludHJpbnNpYy5uYW1lO1xuXHR2YXIgdmFsdWUgPSBpbnRyaW5zaWMudmFsdWU7XG5cdHZhciBza2lwRnVydGhlckNhY2hpbmcgPSBmYWxzZTtcblxuXHR2YXIgYWxpYXMgPSBpbnRyaW5zaWMuYWxpYXM7XG5cdGlmIChhbGlhcykge1xuXHRcdGludHJpbnNpY0Jhc2VOYW1lID0gYWxpYXNbMF07XG5cdFx0JHNwbGljZUFwcGx5KHBhcnRzLCAkY29uY2F0KFswLCAxXSwgYWxpYXMpKTtcblx0fVxuXG5cdGZvciAodmFyIGkgPSAxLCBpc093biA9IHRydWU7IGkgPCBwYXJ0cy5sZW5ndGg7IGkgKz0gMSkge1xuXHRcdHZhciBwYXJ0ID0gcGFydHNbaV07XG5cdFx0dmFyIGZpcnN0ID0gJHN0clNsaWNlKHBhcnQsIDAsIDEpO1xuXHRcdHZhciBsYXN0ID0gJHN0clNsaWNlKHBhcnQsIC0xKTtcblx0XHRpZiAoXG5cdFx0XHQoXG5cdFx0XHRcdChmaXJzdCA9PT0gJ1wiJyB8fCBmaXJzdCA9PT0gXCInXCIgfHwgZmlyc3QgPT09ICdgJylcblx0XHRcdFx0fHwgKGxhc3QgPT09ICdcIicgfHwgbGFzdCA9PT0gXCInXCIgfHwgbGFzdCA9PT0gJ2AnKVxuXHRcdFx0KVxuXHRcdFx0JiYgZmlyc3QgIT09IGxhc3Rcblx0XHQpIHtcblx0XHRcdHRocm93IG5ldyAkU3ludGF4RXJyb3IoJ3Byb3BlcnR5IG5hbWVzIHdpdGggcXVvdGVzIG11c3QgaGF2ZSBtYXRjaGluZyBxdW90ZXMnKTtcblx0XHR9XG5cdFx0aWYgKHBhcnQgPT09ICdjb25zdHJ1Y3RvcicgfHwgIWlzT3duKSB7XG5cdFx0XHRza2lwRnVydGhlckNhY2hpbmcgPSB0cnVlO1xuXHRcdH1cblxuXHRcdGludHJpbnNpY0Jhc2VOYW1lICs9ICcuJyArIHBhcnQ7XG5cdFx0aW50cmluc2ljUmVhbE5hbWUgPSAnJScgKyBpbnRyaW5zaWNCYXNlTmFtZSArICclJztcblxuXHRcdGlmIChoYXNPd24oSU5UUklOU0lDUywgaW50cmluc2ljUmVhbE5hbWUpKSB7XG5cdFx0XHR2YWx1ZSA9IElOVFJJTlNJQ1NbaW50cmluc2ljUmVhbE5hbWVdO1xuXHRcdH0gZWxzZSBpZiAodmFsdWUgIT0gbnVsbCkge1xuXHRcdFx0aWYgKCEocGFydCBpbiB2YWx1ZSkpIHtcblx0XHRcdFx0aWYgKCFhbGxvd01pc3NpbmcpIHtcblx0XHRcdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignYmFzZSBpbnRyaW5zaWMgZm9yICcgKyBuYW1lICsgJyBleGlzdHMsIGJ1dCB0aGUgcHJvcGVydHkgaXMgbm90IGF2YWlsYWJsZS4nKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gdm9pZCB1bmRlZmluZWQ7XG5cdFx0XHR9XG5cdFx0XHRpZiAoJGdPUEQgJiYgKGkgKyAxKSA+PSBwYXJ0cy5sZW5ndGgpIHtcblx0XHRcdFx0dmFyIGRlc2MgPSAkZ09QRCh2YWx1ZSwgcGFydCk7XG5cdFx0XHRcdGlzT3duID0gISFkZXNjO1xuXG5cdFx0XHRcdC8vIEJ5IGNvbnZlbnRpb24sIHdoZW4gYSBkYXRhIHByb3BlcnR5IGlzIGNvbnZlcnRlZCB0byBhbiBhY2Nlc3NvclxuXHRcdFx0XHQvLyBwcm9wZXJ0eSB0byBlbXVsYXRlIGEgZGF0YSBwcm9wZXJ0eSB0aGF0IGRvZXMgbm90IHN1ZmZlciBmcm9tXG5cdFx0XHRcdC8vIHRoZSBvdmVycmlkZSBtaXN0YWtlLCB0aGF0IGFjY2Vzc29yJ3MgZ2V0dGVyIGlzIG1hcmtlZCB3aXRoXG5cdFx0XHRcdC8vIGFuIGBvcmlnaW5hbFZhbHVlYCBwcm9wZXJ0eS4gSGVyZSwgd2hlbiB3ZSBkZXRlY3QgdGhpcywgd2Vcblx0XHRcdFx0Ly8gdXBob2xkIHRoZSBpbGx1c2lvbiBieSBwcmV0ZW5kaW5nIHRvIHNlZSB0aGF0IG9yaWdpbmFsIGRhdGFcblx0XHRcdFx0Ly8gcHJvcGVydHksIGkuZS4sIHJldHVybmluZyB0aGUgdmFsdWUgcmF0aGVyIHRoYW4gdGhlIGdldHRlclxuXHRcdFx0XHQvLyBpdHNlbGYuXG5cdFx0XHRcdGlmIChpc093biAmJiAnZ2V0JyBpbiBkZXNjICYmICEoJ29yaWdpbmFsVmFsdWUnIGluIGRlc2MuZ2V0KSkge1xuXHRcdFx0XHRcdHZhbHVlID0gZGVzYy5nZXQ7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dmFsdWUgPSB2YWx1ZVtwYXJ0XTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aXNPd24gPSBoYXNPd24odmFsdWUsIHBhcnQpO1xuXHRcdFx0XHR2YWx1ZSA9IHZhbHVlW3BhcnRdO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoaXNPd24gJiYgIXNraXBGdXJ0aGVyQ2FjaGluZykge1xuXHRcdFx0XHRJTlRSSU5TSUNTW2ludHJpbnNpY1JlYWxOYW1lXSA9IHZhbHVlO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHRyZXR1cm4gdmFsdWU7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgJEJpZ0ludCA9IHR5cGVvZiBCaWdJbnQgIT09ICd1bmRlZmluZWQnICYmIEJpZ0ludDtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBoYXNOYXRpdmVCaWdJbnRzKCkge1xuXHRyZXR1cm4gdHlwZW9mICRCaWdJbnQgPT09ICdmdW5jdGlvbidcblx0XHQmJiB0eXBlb2YgQmlnSW50ID09PSAnZnVuY3Rpb24nXG5cdFx0JiYgdHlwZW9mICRCaWdJbnQoNDIpID09PSAnYmlnaW50JyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW1hZ2ljLW51bWJlcnNcblx0XHQmJiB0eXBlb2YgQmlnSW50KDQyKSA9PT0gJ2JpZ2ludCc7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbWFnaWMtbnVtYmVyc1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIEdldEludHJpbnNpYyA9IHJlcXVpcmUoJ2dldC1pbnRyaW5zaWMnKTtcblxudmFyICRkZWZpbmVQcm9wZXJ0eSA9IEdldEludHJpbnNpYygnJU9iamVjdC5kZWZpbmVQcm9wZXJ0eSUnLCB0cnVlKTtcblxudmFyIGhhc1Byb3BlcnR5RGVzY3JpcHRvcnMgPSBmdW5jdGlvbiBoYXNQcm9wZXJ0eURlc2NyaXB0b3JzKCkge1xuXHRpZiAoJGRlZmluZVByb3BlcnR5KSB7XG5cdFx0dHJ5IHtcblx0XHRcdCRkZWZpbmVQcm9wZXJ0eSh7fSwgJ2EnLCB7IHZhbHVlOiAxIH0pO1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0Ly8gSUUgOCBoYXMgYSBicm9rZW4gZGVmaW5lUHJvcGVydHlcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIGZhbHNlO1xufTtcblxuaGFzUHJvcGVydHlEZXNjcmlwdG9ycy5oYXNBcnJheUxlbmd0aERlZmluZUJ1ZyA9IGZ1bmN0aW9uIGhhc0FycmF5TGVuZ3RoRGVmaW5lQnVnKCkge1xuXHQvLyBub2RlIHYwLjYgaGFzIGEgYnVnIHdoZXJlIGFycmF5IGxlbmd0aHMgY2FuIGJlIFNldCBidXQgbm90IERlZmluZWRcblx0aWYgKCFoYXNQcm9wZXJ0eURlc2NyaXB0b3JzKCkpIHtcblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXHR0cnkge1xuXHRcdHJldHVybiAkZGVmaW5lUHJvcGVydHkoW10sICdsZW5ndGgnLCB7IHZhbHVlOiAxIH0pLmxlbmd0aCAhPT0gMTtcblx0fSBjYXRjaCAoZSkge1xuXHRcdC8vIEluIEZpcmVmb3ggNC0yMiwgZGVmaW5pbmcgbGVuZ3RoIG9uIGFuIGFycmF5IHRocm93cyBhbiBleGNlcHRpb24uXG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gaGFzUHJvcGVydHlEZXNjcmlwdG9ycztcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIG9yaWdTeW1ib2wgPSB0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2w7XG52YXIgaGFzU3ltYm9sU2hhbSA9IHJlcXVpcmUoJy4vc2hhbXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBoYXNOYXRpdmVTeW1ib2xzKCkge1xuXHRpZiAodHlwZW9mIG9yaWdTeW1ib2wgIT09ICdmdW5jdGlvbicpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdGlmICh0eXBlb2YgU3ltYm9sICE9PSAnZnVuY3Rpb24nKSB7IHJldHVybiBmYWxzZTsgfVxuXHRpZiAodHlwZW9mIG9yaWdTeW1ib2woJ2ZvbycpICE9PSAnc3ltYm9sJykgeyByZXR1cm4gZmFsc2U7IH1cblx0aWYgKHR5cGVvZiBTeW1ib2woJ2JhcicpICE9PSAnc3ltYm9sJykgeyByZXR1cm4gZmFsc2U7IH1cblxuXHRyZXR1cm4gaGFzU3ltYm9sU2hhbSgpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyogZXNsaW50IGNvbXBsZXhpdHk6IFsyLCAxOF0sIG1heC1zdGF0ZW1lbnRzOiBbMiwgMzNdICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGhhc1N5bWJvbHMoKSB7XG5cdGlmICh0eXBlb2YgU3ltYm9sICE9PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzICE9PSAnZnVuY3Rpb24nKSB7IHJldHVybiBmYWxzZTsgfVxuXHRpZiAodHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gJ3N5bWJvbCcpIHsgcmV0dXJuIHRydWU7IH1cblxuXHR2YXIgb2JqID0ge307XG5cdHZhciBzeW0gPSBTeW1ib2woJ3Rlc3QnKTtcblx0dmFyIHN5bU9iaiA9IE9iamVjdChzeW0pO1xuXHRpZiAodHlwZW9mIHN5bSA9PT0gJ3N0cmluZycpIHsgcmV0dXJuIGZhbHNlOyB9XG5cblx0aWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChzeW0pICE9PSAnW29iamVjdCBTeW1ib2xdJykgeyByZXR1cm4gZmFsc2U7IH1cblx0aWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChzeW1PYmopICE9PSAnW29iamVjdCBTeW1ib2xdJykgeyByZXR1cm4gZmFsc2U7IH1cblxuXHQvLyB0ZW1wIGRpc2FibGVkIHBlciBodHRwczovL2dpdGh1Yi5jb20vbGpoYXJiL29iamVjdC5hc3NpZ24vaXNzdWVzLzE3XG5cdC8vIGlmIChzeW0gaW5zdGFuY2VvZiBTeW1ib2wpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdC8vIHRlbXAgZGlzYWJsZWQgcGVyIGh0dHBzOi8vZ2l0aHViLmNvbS9XZWJSZWZsZWN0aW9uL2dldC1vd24tcHJvcGVydHktc3ltYm9scy9pc3N1ZXMvNFxuXHQvLyBpZiAoIShzeW1PYmogaW5zdGFuY2VvZiBTeW1ib2wpKSB7IHJldHVybiBmYWxzZTsgfVxuXG5cdC8vIGlmICh0eXBlb2YgU3ltYm9sLnByb3RvdHlwZS50b1N0cmluZyAhPT0gJ2Z1bmN0aW9uJykgeyByZXR1cm4gZmFsc2U7IH1cblx0Ly8gaWYgKFN0cmluZyhzeW0pICE9PSBTeW1ib2wucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoc3ltKSkgeyByZXR1cm4gZmFsc2U7IH1cblxuXHR2YXIgc3ltVmFsID0gNDI7XG5cdG9ialtzeW1dID0gc3ltVmFsO1xuXHRmb3IgKHN5bSBpbiBvYmopIHsgcmV0dXJuIGZhbHNlOyB9IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXgsIG5vLXVucmVhY2hhYmxlLWxvb3Bcblx0aWYgKHR5cGVvZiBPYmplY3Qua2V5cyA9PT0gJ2Z1bmN0aW9uJyAmJiBPYmplY3Qua2V5cyhvYmopLmxlbmd0aCAhPT0gMCkgeyByZXR1cm4gZmFsc2U7IH1cblxuXHRpZiAodHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzID09PSAnZnVuY3Rpb24nICYmIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG9iaikubGVuZ3RoICE9PSAwKSB7IHJldHVybiBmYWxzZTsgfVxuXG5cdHZhciBzeW1zID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmopO1xuXHRpZiAoc3ltcy5sZW5ndGggIT09IDEgfHwgc3ltc1swXSAhPT0gc3ltKSB7IHJldHVybiBmYWxzZTsgfVxuXG5cdGlmICghT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKG9iaiwgc3ltKSkgeyByZXR1cm4gZmFsc2U7IH1cblxuXHRpZiAodHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPT09ICdmdW5jdGlvbicpIHtcblx0XHR2YXIgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBzeW0pO1xuXHRcdGlmIChkZXNjcmlwdG9yLnZhbHVlICE9PSBzeW1WYWwgfHwgZGVzY3JpcHRvci5lbnVtZXJhYmxlICE9PSB0cnVlKSB7IHJldHVybiBmYWxzZTsgfVxuXHR9XG5cblx0cmV0dXJuIHRydWU7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgaGFzU3ltYm9scyA9IHJlcXVpcmUoJ2hhcy1zeW1ib2xzL3NoYW1zJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaGFzVG9TdHJpbmdUYWdTaGFtcygpIHtcblx0cmV0dXJuIGhhc1N5bWJvbHMoKSAmJiAhIVN5bWJvbC50b1N0cmluZ1RhZztcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBiaW5kID0gcmVxdWlyZSgnZnVuY3Rpb24tYmluZCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGJpbmQuY2FsbChGdW5jdGlvbi5jYWxsLCBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5KTtcbiIsImlmICh0eXBlb2YgT2JqZWN0LmNyZWF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAvLyBpbXBsZW1lbnRhdGlvbiBmcm9tIHN0YW5kYXJkIG5vZGUuanMgJ3V0aWwnIG1vZHVsZVxuICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGluaGVyaXRzKGN0b3IsIHN1cGVyQ3Rvcikge1xuICAgIGlmIChzdXBlckN0b3IpIHtcbiAgICAgIGN0b3Iuc3VwZXJfID0gc3VwZXJDdG9yXG4gICAgICBjdG9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDdG9yLnByb3RvdHlwZSwge1xuICAgICAgICBjb25zdHJ1Y3Rvcjoge1xuICAgICAgICAgIHZhbHVlOiBjdG9yLFxuICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgfTtcbn0gZWxzZSB7XG4gIC8vIG9sZCBzY2hvb2wgc2hpbSBmb3Igb2xkIGJyb3dzZXJzXG4gIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaW5oZXJpdHMoY3Rvciwgc3VwZXJDdG9yKSB7XG4gICAgaWYgKHN1cGVyQ3Rvcikge1xuICAgICAgY3Rvci5zdXBlcl8gPSBzdXBlckN0b3JcbiAgICAgIHZhciBUZW1wQ3RvciA9IGZ1bmN0aW9uICgpIHt9XG4gICAgICBUZW1wQ3Rvci5wcm90b3R5cGUgPSBzdXBlckN0b3IucHJvdG90eXBlXG4gICAgICBjdG9yLnByb3RvdHlwZSA9IG5ldyBUZW1wQ3RvcigpXG4gICAgICBjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGN0b3JcbiAgICB9XG4gIH1cbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGhhc1RvU3RyaW5nVGFnID0gcmVxdWlyZSgnaGFzLXRvc3RyaW5ndGFnL3NoYW1zJykoKTtcbnZhciBjYWxsQm91bmQgPSByZXF1aXJlKCdjYWxsLWJpbmQvY2FsbEJvdW5kJyk7XG5cbnZhciAkdG9TdHJpbmcgPSBjYWxsQm91bmQoJ09iamVjdC5wcm90b3R5cGUudG9TdHJpbmcnKTtcblxudmFyIGlzU3RhbmRhcmRBcmd1bWVudHMgPSBmdW5jdGlvbiBpc0FyZ3VtZW50cyh2YWx1ZSkge1xuXHRpZiAoaGFzVG9TdHJpbmdUYWcgJiYgdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiBTeW1ib2wudG9TdHJpbmdUYWcgaW4gdmFsdWUpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0cmV0dXJuICR0b1N0cmluZyh2YWx1ZSkgPT09ICdbb2JqZWN0IEFyZ3VtZW50c10nO1xufTtcblxudmFyIGlzTGVnYWN5QXJndW1lbnRzID0gZnVuY3Rpb24gaXNBcmd1bWVudHModmFsdWUpIHtcblx0aWYgKGlzU3RhbmRhcmRBcmd1bWVudHModmFsdWUpKSB7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblx0cmV0dXJuIHZhbHVlICE9PSBudWxsICYmXG5cdFx0dHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxuXHRcdHR5cGVvZiB2YWx1ZS5sZW5ndGggPT09ICdudW1iZXInICYmXG5cdFx0dmFsdWUubGVuZ3RoID49IDAgJiZcblx0XHQkdG9TdHJpbmcodmFsdWUpICE9PSAnW29iamVjdCBBcnJheV0nICYmXG5cdFx0JHRvU3RyaW5nKHZhbHVlLmNhbGxlZSkgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXSc7XG59O1xuXG52YXIgc3VwcG9ydHNTdGFuZGFyZEFyZ3VtZW50cyA9IChmdW5jdGlvbiAoKSB7XG5cdHJldHVybiBpc1N0YW5kYXJkQXJndW1lbnRzKGFyZ3VtZW50cyk7XG59KCkpO1xuXG5pc1N0YW5kYXJkQXJndW1lbnRzLmlzTGVnYWN5QXJndW1lbnRzID0gaXNMZWdhY3lBcmd1bWVudHM7IC8vIGZvciB0ZXN0c1xuXG5tb2R1bGUuZXhwb3J0cyA9IHN1cHBvcnRzU3RhbmRhcmRBcmd1bWVudHMgPyBpc1N0YW5kYXJkQXJndW1lbnRzIDogaXNMZWdhY3lBcmd1bWVudHM7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBoYXNCaWdJbnRzID0gcmVxdWlyZSgnaGFzLWJpZ2ludHMnKSgpO1xuXG5pZiAoaGFzQmlnSW50cykge1xuXHR2YXIgYmlnSW50VmFsdWVPZiA9IEJpZ0ludC5wcm90b3R5cGUudmFsdWVPZjtcblx0dmFyIHRyeUJpZ0ludCA9IGZ1bmN0aW9uIHRyeUJpZ0ludE9iamVjdCh2YWx1ZSkge1xuXHRcdHRyeSB7XG5cdFx0XHRiaWdJbnRWYWx1ZU9mLmNhbGwodmFsdWUpO1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fSBjYXRjaCAoZSkge1xuXHRcdH1cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH07XG5cblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc0JpZ0ludCh2YWx1ZSkge1xuXHRcdGlmIChcblx0XHRcdHZhbHVlID09PSBudWxsXG5cdFx0XHR8fCB0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnXG5cdFx0XHR8fCB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJ1xuXHRcdFx0fHwgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJ1xuXHRcdFx0fHwgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJ1xuXHRcdFx0fHwgdHlwZW9mIHZhbHVlID09PSAnc3ltYm9sJ1xuXHRcdFx0fHwgdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nXG5cdFx0KSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHRcdGlmICh0eXBlb2YgdmFsdWUgPT09ICdiaWdpbnQnKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdHJ5QmlnSW50KHZhbHVlKTtcblx0fTtcbn0gZWxzZSB7XG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaXNCaWdJbnQodmFsdWUpIHtcblx0XHRyZXR1cm4gZmFsc2UgJiYgdmFsdWU7XG5cdH07XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBjYWxsQm91bmQgPSByZXF1aXJlKCdjYWxsLWJpbmQvY2FsbEJvdW5kJyk7XG52YXIgJGJvb2xUb1N0ciA9IGNhbGxCb3VuZCgnQm9vbGVhbi5wcm90b3R5cGUudG9TdHJpbmcnKTtcbnZhciAkdG9TdHJpbmcgPSBjYWxsQm91bmQoJ09iamVjdC5wcm90b3R5cGUudG9TdHJpbmcnKTtcblxudmFyIHRyeUJvb2xlYW5PYmplY3QgPSBmdW5jdGlvbiBib29sZWFuQnJhbmRDaGVjayh2YWx1ZSkge1xuXHR0cnkge1xuXHRcdCRib29sVG9TdHIodmFsdWUpO1xuXHRcdHJldHVybiB0cnVlO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG59O1xudmFyIGJvb2xDbGFzcyA9ICdbb2JqZWN0IEJvb2xlYW5dJztcbnZhciBoYXNUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJ2hhcy10b3N0cmluZ3RhZy9zaGFtcycpKCk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaXNCb29sZWFuKHZhbHVlKSB7XG5cdGlmICh0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykge1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cdGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cdHJldHVybiBoYXNUb1N0cmluZ1RhZyAmJiBTeW1ib2wudG9TdHJpbmdUYWcgaW4gdmFsdWUgPyB0cnlCb29sZWFuT2JqZWN0KHZhbHVlKSA6ICR0b1N0cmluZyh2YWx1ZSkgPT09IGJvb2xDbGFzcztcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBmblRvU3RyID0gRnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nO1xudmFyIHJlZmxlY3RBcHBseSA9IHR5cGVvZiBSZWZsZWN0ID09PSAnb2JqZWN0JyAmJiBSZWZsZWN0ICE9PSBudWxsICYmIFJlZmxlY3QuYXBwbHk7XG52YXIgYmFkQXJyYXlMaWtlO1xudmFyIGlzQ2FsbGFibGVNYXJrZXI7XG5pZiAodHlwZW9mIHJlZmxlY3RBcHBseSA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgT2JqZWN0LmRlZmluZVByb3BlcnR5ID09PSAnZnVuY3Rpb24nKSB7XG5cdHRyeSB7XG5cdFx0YmFkQXJyYXlMaWtlID0gT2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCAnbGVuZ3RoJywge1xuXHRcdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHRocm93IGlzQ2FsbGFibGVNYXJrZXI7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0aXNDYWxsYWJsZU1hcmtlciA9IHt9O1xuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby10aHJvdy1saXRlcmFsXG5cdFx0cmVmbGVjdEFwcGx5KGZ1bmN0aW9uICgpIHsgdGhyb3cgNDI7IH0sIG51bGwsIGJhZEFycmF5TGlrZSk7XG5cdH0gY2F0Y2ggKF8pIHtcblx0XHRpZiAoXyAhPT0gaXNDYWxsYWJsZU1hcmtlcikge1xuXHRcdFx0cmVmbGVjdEFwcGx5ID0gbnVsbDtcblx0XHR9XG5cdH1cbn0gZWxzZSB7XG5cdHJlZmxlY3RBcHBseSA9IG51bGw7XG59XG5cbnZhciBjb25zdHJ1Y3RvclJlZ2V4ID0gL15cXHMqY2xhc3NcXGIvO1xudmFyIGlzRVM2Q2xhc3NGbiA9IGZ1bmN0aW9uIGlzRVM2Q2xhc3NGdW5jdGlvbih2YWx1ZSkge1xuXHR0cnkge1xuXHRcdHZhciBmblN0ciA9IGZuVG9TdHIuY2FsbCh2YWx1ZSk7XG5cdFx0cmV0dXJuIGNvbnN0cnVjdG9yUmVnZXgudGVzdChmblN0cik7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHRyZXR1cm4gZmFsc2U7IC8vIG5vdCBhIGZ1bmN0aW9uXG5cdH1cbn07XG5cbnZhciB0cnlGdW5jdGlvbk9iamVjdCA9IGZ1bmN0aW9uIHRyeUZ1bmN0aW9uVG9TdHIodmFsdWUpIHtcblx0dHJ5IHtcblx0XHRpZiAoaXNFUzZDbGFzc0ZuKHZhbHVlKSkgeyByZXR1cm4gZmFsc2U7IH1cblx0XHRmblRvU3RyLmNhbGwodmFsdWUpO1xuXHRcdHJldHVybiB0cnVlO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG59O1xudmFyIHRvU3RyID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcbnZhciBmbkNsYXNzID0gJ1tvYmplY3QgRnVuY3Rpb25dJztcbnZhciBnZW5DbGFzcyA9ICdbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXSc7XG52YXIgaGFzVG9TdHJpbmdUYWcgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmICEhU3ltYm9sLnRvU3RyaW5nVGFnOyAvLyBiZXR0ZXI6IHVzZSBgaGFzLXRvc3RyaW5ndGFnYFxuLyogZ2xvYmFscyBkb2N1bWVudDogZmFsc2UgKi9cbnZhciBkb2N1bWVudERvdEFsbCA9IHR5cGVvZiBkb2N1bWVudCA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIGRvY3VtZW50LmFsbCA9PT0gJ3VuZGVmaW5lZCcgJiYgZG9jdW1lbnQuYWxsICE9PSB1bmRlZmluZWQgPyBkb2N1bWVudC5hbGwgOiB7fTtcblxubW9kdWxlLmV4cG9ydHMgPSByZWZsZWN0QXBwbHlcblx0PyBmdW5jdGlvbiBpc0NhbGxhYmxlKHZhbHVlKSB7XG5cdFx0aWYgKHZhbHVlID09PSBkb2N1bWVudERvdEFsbCkgeyByZXR1cm4gdHJ1ZTsgfVxuXHRcdGlmICghdmFsdWUpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdFx0aWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSB7IHJldHVybiBmYWxzZTsgfVxuXHRcdGlmICh0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicgJiYgIXZhbHVlLnByb3RvdHlwZSkgeyByZXR1cm4gdHJ1ZTsgfVxuXHRcdHRyeSB7XG5cdFx0XHRyZWZsZWN0QXBwbHkodmFsdWUsIG51bGwsIGJhZEFycmF5TGlrZSk7XG5cdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0aWYgKGUgIT09IGlzQ2FsbGFibGVNYXJrZXIpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdFx0fVxuXHRcdHJldHVybiAhaXNFUzZDbGFzc0ZuKHZhbHVlKTtcblx0fVxuXHQ6IGZ1bmN0aW9uIGlzQ2FsbGFibGUodmFsdWUpIHtcblx0XHRpZiAodmFsdWUgPT09IGRvY3VtZW50RG90QWxsKSB7IHJldHVybiB0cnVlOyB9XG5cdFx0aWYgKCF2YWx1ZSkgeyByZXR1cm4gZmFsc2U7IH1cblx0XHRpZiAodHlwZW9mIHZhbHVlICE9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdFx0aWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJyAmJiAhdmFsdWUucHJvdG90eXBlKSB7IHJldHVybiB0cnVlOyB9XG5cdFx0aWYgKGhhc1RvU3RyaW5nVGFnKSB7IHJldHVybiB0cnlGdW5jdGlvbk9iamVjdCh2YWx1ZSk7IH1cblx0XHRpZiAoaXNFUzZDbGFzc0ZuKHZhbHVlKSkgeyByZXR1cm4gZmFsc2U7IH1cblx0XHR2YXIgc3RyQ2xhc3MgPSB0b1N0ci5jYWxsKHZhbHVlKTtcblx0XHRyZXR1cm4gc3RyQ2xhc3MgPT09IGZuQ2xhc3MgfHwgc3RyQ2xhc3MgPT09IGdlbkNsYXNzO1xuXHR9O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgZ2V0RGF5ID0gRGF0ZS5wcm90b3R5cGUuZ2V0RGF5O1xudmFyIHRyeURhdGVPYmplY3QgPSBmdW5jdGlvbiB0cnlEYXRlR2V0RGF5Q2FsbCh2YWx1ZSkge1xuXHR0cnkge1xuXHRcdGdldERheS5jYWxsKHZhbHVlKTtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fSBjYXRjaCAoZSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxufTtcblxudmFyIHRvU3RyID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcbnZhciBkYXRlQ2xhc3MgPSAnW29iamVjdCBEYXRlXSc7XG52YXIgaGFzVG9TdHJpbmdUYWcgPSByZXF1aXJlKCdoYXMtdG9zdHJpbmd0YWcvc2hhbXMnKSgpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzRGF0ZU9iamVjdCh2YWx1ZSkge1xuXHRpZiAodHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JyB8fCB2YWx1ZSA9PT0gbnVsbCkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXHRyZXR1cm4gaGFzVG9TdHJpbmdUYWcgPyB0cnlEYXRlT2JqZWN0KHZhbHVlKSA6IHRvU3RyLmNhbGwodmFsdWUpID09PSBkYXRlQ2xhc3M7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgJE1hcCA9IHR5cGVvZiBNYXAgPT09ICdmdW5jdGlvbicgJiYgTWFwLnByb3RvdHlwZSA/IE1hcCA6IG51bGw7XG52YXIgJFNldCA9IHR5cGVvZiBTZXQgPT09ICdmdW5jdGlvbicgJiYgU2V0LnByb3RvdHlwZSA/IFNldCA6IG51bGw7XG5cbnZhciBleHBvcnRlZDtcblxuaWYgKCEkTWFwKSB7XG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuXHRleHBvcnRlZCA9IGZ1bmN0aW9uIGlzTWFwKHgpIHtcblx0XHQvLyBgTWFwYCBpcyBub3QgcHJlc2VudCBpbiB0aGlzIGVudmlyb25tZW50LlxuXHRcdHJldHVybiBmYWxzZTtcblx0fTtcbn1cblxudmFyICRtYXBIYXMgPSAkTWFwID8gTWFwLnByb3RvdHlwZS5oYXMgOiBudWxsO1xudmFyICRzZXRIYXMgPSAkU2V0ID8gU2V0LnByb3RvdHlwZS5oYXMgOiBudWxsO1xuaWYgKCFleHBvcnRlZCAmJiAhJG1hcEhhcykge1xuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcblx0ZXhwb3J0ZWQgPSBmdW5jdGlvbiBpc01hcCh4KSB7XG5cdFx0Ly8gYE1hcGAgZG9lcyBub3QgaGF2ZSBhIGBoYXNgIG1ldGhvZFxuXHRcdHJldHVybiBmYWxzZTtcblx0fTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRlZCB8fCBmdW5jdGlvbiBpc01hcCh4KSB7XG5cdGlmICgheCB8fCB0eXBlb2YgeCAhPT0gJ29iamVjdCcpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0dHJ5IHtcblx0XHQkbWFwSGFzLmNhbGwoeCk7XG5cdFx0aWYgKCRzZXRIYXMpIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdCRzZXRIYXMuY2FsbCh4KTtcblx0XHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiB4IGluc3RhbmNlb2YgJE1hcDsgLy8gY29yZS1qcyB3b3JrYXJvdW5kLCBwcmUtdjIuNS4wXG5cdH0gY2F0Y2ggKGUpIHt9XG5cdHJldHVybiBmYWxzZTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBudW1Ub1N0ciA9IE51bWJlci5wcm90b3R5cGUudG9TdHJpbmc7XG52YXIgdHJ5TnVtYmVyT2JqZWN0ID0gZnVuY3Rpb24gdHJ5TnVtYmVyT2JqZWN0KHZhbHVlKSB7XG5cdHRyeSB7XG5cdFx0bnVtVG9TdHIuY2FsbCh2YWx1ZSk7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cbn07XG52YXIgdG9TdHIgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xudmFyIG51bUNsYXNzID0gJ1tvYmplY3QgTnVtYmVyXSc7XG52YXIgaGFzVG9TdHJpbmdUYWcgPSByZXF1aXJlKCdoYXMtdG9zdHJpbmd0YWcvc2hhbXMnKSgpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzTnVtYmVyT2JqZWN0KHZhbHVlKSB7XG5cdGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblx0aWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0cmV0dXJuIGhhc1RvU3RyaW5nVGFnID8gdHJ5TnVtYmVyT2JqZWN0KHZhbHVlKSA6IHRvU3RyLmNhbGwodmFsdWUpID09PSBudW1DbGFzcztcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBjYWxsQm91bmQgPSByZXF1aXJlKCdjYWxsLWJpbmQvY2FsbEJvdW5kJyk7XG52YXIgaGFzVG9TdHJpbmdUYWcgPSByZXF1aXJlKCdoYXMtdG9zdHJpbmd0YWcvc2hhbXMnKSgpO1xudmFyIGhhcztcbnZhciAkZXhlYztcbnZhciBpc1JlZ2V4TWFya2VyO1xudmFyIGJhZFN0cmluZ2lmaWVyO1xuXG5pZiAoaGFzVG9TdHJpbmdUYWcpIHtcblx0aGFzID0gY2FsbEJvdW5kKCdPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5Jyk7XG5cdCRleGVjID0gY2FsbEJvdW5kKCdSZWdFeHAucHJvdG90eXBlLmV4ZWMnKTtcblx0aXNSZWdleE1hcmtlciA9IHt9O1xuXG5cdHZhciB0aHJvd1JlZ2V4TWFya2VyID0gZnVuY3Rpb24gKCkge1xuXHRcdHRocm93IGlzUmVnZXhNYXJrZXI7XG5cdH07XG5cdGJhZFN0cmluZ2lmaWVyID0ge1xuXHRcdHRvU3RyaW5nOiB0aHJvd1JlZ2V4TWFya2VyLFxuXHRcdHZhbHVlT2Y6IHRocm93UmVnZXhNYXJrZXJcblx0fTtcblxuXHRpZiAodHlwZW9mIFN5bWJvbC50b1ByaW1pdGl2ZSA9PT0gJ3N5bWJvbCcpIHtcblx0XHRiYWRTdHJpbmdpZmllcltTeW1ib2wudG9QcmltaXRpdmVdID0gdGhyb3dSZWdleE1hcmtlcjtcblx0fVxufVxuXG52YXIgJHRvU3RyaW5nID0gY2FsbEJvdW5kKCdPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nJyk7XG52YXIgZ09QRCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG52YXIgcmVnZXhDbGFzcyA9ICdbb2JqZWN0IFJlZ0V4cF0nO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGhhc1RvU3RyaW5nVGFnXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb25zaXN0ZW50LXJldHVyblxuXHQ/IGZ1bmN0aW9uIGlzUmVnZXgodmFsdWUpIHtcblx0XHRpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHR2YXIgZGVzY3JpcHRvciA9IGdPUEQodmFsdWUsICdsYXN0SW5kZXgnKTtcblx0XHR2YXIgaGFzTGFzdEluZGV4RGF0YVByb3BlcnR5ID0gZGVzY3JpcHRvciAmJiBoYXMoZGVzY3JpcHRvciwgJ3ZhbHVlJyk7XG5cdFx0aWYgKCFoYXNMYXN0SW5kZXhEYXRhUHJvcGVydHkpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHR0cnkge1xuXHRcdFx0JGV4ZWModmFsdWUsIGJhZFN0cmluZ2lmaWVyKTtcblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRyZXR1cm4gZSA9PT0gaXNSZWdleE1hcmtlcjtcblx0XHR9XG5cdH1cblx0OiBmdW5jdGlvbiBpc1JlZ2V4KHZhbHVlKSB7XG5cdFx0Ly8gSW4gb2xkZXIgYnJvd3NlcnMsIHR5cGVvZiByZWdleCBpbmNvcnJlY3RseSByZXR1cm5zICdmdW5jdGlvbidcblx0XHRpZiAoIXZhbHVlIHx8ICh0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnICYmIHR5cGVvZiB2YWx1ZSAhPT0gJ2Z1bmN0aW9uJykpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gJHRvU3RyaW5nKHZhbHVlKSA9PT0gcmVnZXhDbGFzcztcblx0fTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyICRNYXAgPSB0eXBlb2YgTWFwID09PSAnZnVuY3Rpb24nICYmIE1hcC5wcm90b3R5cGUgPyBNYXAgOiBudWxsO1xudmFyICRTZXQgPSB0eXBlb2YgU2V0ID09PSAnZnVuY3Rpb24nICYmIFNldC5wcm90b3R5cGUgPyBTZXQgOiBudWxsO1xuXG52YXIgZXhwb3J0ZWQ7XG5cbmlmICghJFNldCkge1xuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcblx0ZXhwb3J0ZWQgPSBmdW5jdGlvbiBpc1NldCh4KSB7XG5cdFx0Ly8gYFNldGAgaXMgbm90IHByZXNlbnQgaW4gdGhpcyBlbnZpcm9ubWVudC5cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH07XG59XG5cbnZhciAkbWFwSGFzID0gJE1hcCA/IE1hcC5wcm90b3R5cGUuaGFzIDogbnVsbDtcbnZhciAkc2V0SGFzID0gJFNldCA/IFNldC5wcm90b3R5cGUuaGFzIDogbnVsbDtcbmlmICghZXhwb3J0ZWQgJiYgISRzZXRIYXMpIHtcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG5cdGV4cG9ydGVkID0gZnVuY3Rpb24gaXNTZXQoeCkge1xuXHRcdC8vIGBTZXRgIGRvZXMgbm90IGhhdmUgYSBgaGFzYCBtZXRob2Rcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0ZWQgfHwgZnVuY3Rpb24gaXNTZXQoeCkge1xuXHRpZiAoIXggfHwgdHlwZW9mIHggIT09ICdvYmplY3QnKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cdHRyeSB7XG5cdFx0JHNldEhhcy5jYWxsKHgpO1xuXHRcdGlmICgkbWFwSGFzKSB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHQkbWFwSGFzLmNhbGwoeCk7XG5cdFx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4geCBpbnN0YW5jZW9mICRTZXQ7IC8vIGNvcmUtanMgd29ya2Fyb3VuZCwgcHJlLXYyLjUuMFxuXHR9IGNhdGNoIChlKSB7fVxuXHRyZXR1cm4gZmFsc2U7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgc3RyVmFsdWUgPSBTdHJpbmcucHJvdG90eXBlLnZhbHVlT2Y7XG52YXIgdHJ5U3RyaW5nT2JqZWN0ID0gZnVuY3Rpb24gdHJ5U3RyaW5nT2JqZWN0KHZhbHVlKSB7XG5cdHRyeSB7XG5cdFx0c3RyVmFsdWUuY2FsbCh2YWx1ZSk7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cbn07XG52YXIgdG9TdHIgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xudmFyIHN0ckNsYXNzID0gJ1tvYmplY3QgU3RyaW5nXSc7XG52YXIgaGFzVG9TdHJpbmdUYWcgPSByZXF1aXJlKCdoYXMtdG9zdHJpbmd0YWcvc2hhbXMnKSgpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzU3RyaW5nKHZhbHVlKSB7XG5cdGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblx0aWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0cmV0dXJuIGhhc1RvU3RyaW5nVGFnID8gdHJ5U3RyaW5nT2JqZWN0KHZhbHVlKSA6IHRvU3RyLmNhbGwodmFsdWUpID09PSBzdHJDbGFzcztcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB0b1N0ciA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG52YXIgaGFzU3ltYm9scyA9IHJlcXVpcmUoJ2hhcy1zeW1ib2xzJykoKTtcblxuaWYgKGhhc1N5bWJvbHMpIHtcblx0dmFyIHN5bVRvU3RyID0gU3ltYm9sLnByb3RvdHlwZS50b1N0cmluZztcblx0dmFyIHN5bVN0cmluZ1JlZ2V4ID0gL15TeW1ib2xcXCguKlxcKSQvO1xuXHR2YXIgaXNTeW1ib2xPYmplY3QgPSBmdW5jdGlvbiBpc1JlYWxTeW1ib2xPYmplY3QodmFsdWUpIHtcblx0XHRpZiAodHlwZW9mIHZhbHVlLnZhbHVlT2YoKSAhPT0gJ3N5bWJvbCcpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0cmV0dXJuIHN5bVN0cmluZ1JlZ2V4LnRlc3Qoc3ltVG9TdHIuY2FsbCh2YWx1ZSkpO1xuXHR9O1xuXG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaXNTeW1ib2wodmFsdWUpIHtcblx0XHRpZiAodHlwZW9mIHZhbHVlID09PSAnc3ltYm9sJykge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHRcdGlmICh0b1N0ci5jYWxsKHZhbHVlKSAhPT0gJ1tvYmplY3QgU3ltYm9sXScpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0dHJ5IHtcblx0XHRcdHJldHVybiBpc1N5bWJvbE9iamVjdCh2YWx1ZSk7XG5cdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0fTtcbn0gZWxzZSB7XG5cblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc1N5bWJvbCh2YWx1ZSkge1xuXHRcdC8vIHRoaXMgZW52aXJvbm1lbnQgZG9lcyBub3Qgc3VwcG9ydCBTeW1ib2xzLlxuXHRcdHJldHVybiBmYWxzZSAmJiB2YWx1ZTtcblx0fTtcbn1cbiIsIihmdW5jdGlvbiAoZ2xvYmFsKXtcbid1c2Ugc3RyaWN0JztcblxudmFyIGZvckVhY2ggPSByZXF1aXJlKCdmb3ItZWFjaCcpO1xudmFyIGF2YWlsYWJsZVR5cGVkQXJyYXlzID0gcmVxdWlyZSgnYXZhaWxhYmxlLXR5cGVkLWFycmF5cycpO1xudmFyIGNhbGxCb3VuZCA9IHJlcXVpcmUoJ2NhbGwtYmluZC9jYWxsQm91bmQnKTtcblxudmFyICR0b1N0cmluZyA9IGNhbGxCb3VuZCgnT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZycpO1xudmFyIGhhc1RvU3RyaW5nVGFnID0gcmVxdWlyZSgnaGFzLXRvc3RyaW5ndGFnL3NoYW1zJykoKTtcblxudmFyIGcgPSB0eXBlb2YgZ2xvYmFsVGhpcyA9PT0gJ3VuZGVmaW5lZCcgPyBnbG9iYWwgOiBnbG9iYWxUaGlzO1xudmFyIHR5cGVkQXJyYXlzID0gYXZhaWxhYmxlVHlwZWRBcnJheXMoKTtcblxudmFyICRpbmRleE9mID0gY2FsbEJvdW5kKCdBcnJheS5wcm90b3R5cGUuaW5kZXhPZicsIHRydWUpIHx8IGZ1bmN0aW9uIGluZGV4T2YoYXJyYXksIHZhbHVlKSB7XG5cdGZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpICs9IDEpIHtcblx0XHRpZiAoYXJyYXlbaV0gPT09IHZhbHVlKSB7XG5cdFx0XHRyZXR1cm4gaTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIC0xO1xufTtcbnZhciAkc2xpY2UgPSBjYWxsQm91bmQoJ1N0cmluZy5wcm90b3R5cGUuc2xpY2UnKTtcbnZhciB0b1N0clRhZ3MgPSB7fTtcbnZhciBnT1BEID0gcmVxdWlyZSgnZXMtYWJzdHJhY3QvaGVscGVycy9nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3InKTtcbnZhciBnZXRQcm90b3R5cGVPZiA9IE9iamVjdC5nZXRQcm90b3R5cGVPZjsgLy8gcmVxdWlyZSgnZ2V0cHJvdG90eXBlb2YnKTtcbmlmIChoYXNUb1N0cmluZ1RhZyAmJiBnT1BEICYmIGdldFByb3RvdHlwZU9mKSB7XG5cdGZvckVhY2godHlwZWRBcnJheXMsIGZ1bmN0aW9uICh0eXBlZEFycmF5KSB7XG5cdFx0dmFyIGFyciA9IG5ldyBnW3R5cGVkQXJyYXldKCk7XG5cdFx0aWYgKFN5bWJvbC50b1N0cmluZ1RhZyBpbiBhcnIpIHtcblx0XHRcdHZhciBwcm90byA9IGdldFByb3RvdHlwZU9mKGFycik7XG5cdFx0XHR2YXIgZGVzY3JpcHRvciA9IGdPUEQocHJvdG8sIFN5bWJvbC50b1N0cmluZ1RhZyk7XG5cdFx0XHRpZiAoIWRlc2NyaXB0b3IpIHtcblx0XHRcdFx0dmFyIHN1cGVyUHJvdG8gPSBnZXRQcm90b3R5cGVPZihwcm90byk7XG5cdFx0XHRcdGRlc2NyaXB0b3IgPSBnT1BEKHN1cGVyUHJvdG8sIFN5bWJvbC50b1N0cmluZ1RhZyk7XG5cdFx0XHR9XG5cdFx0XHR0b1N0clRhZ3NbdHlwZWRBcnJheV0gPSBkZXNjcmlwdG9yLmdldDtcblx0XHR9XG5cdH0pO1xufVxuXG52YXIgdHJ5VHlwZWRBcnJheXMgPSBmdW5jdGlvbiB0cnlBbGxUeXBlZEFycmF5cyh2YWx1ZSkge1xuXHR2YXIgYW55VHJ1ZSA9IGZhbHNlO1xuXHRmb3JFYWNoKHRvU3RyVGFncywgZnVuY3Rpb24gKGdldHRlciwgdHlwZWRBcnJheSkge1xuXHRcdGlmICghYW55VHJ1ZSkge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0YW55VHJ1ZSA9IGdldHRlci5jYWxsKHZhbHVlKSA9PT0gdHlwZWRBcnJheTtcblx0XHRcdH0gY2F0Y2ggKGUpIHsgLyoqLyB9XG5cdFx0fVxuXHR9KTtcblx0cmV0dXJuIGFueVRydWU7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzVHlwZWRBcnJheSh2YWx1ZSkge1xuXHRpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdGlmICghaGFzVG9TdHJpbmdUYWcgfHwgIShTeW1ib2wudG9TdHJpbmdUYWcgaW4gdmFsdWUpKSB7XG5cdFx0dmFyIHRhZyA9ICRzbGljZSgkdG9TdHJpbmcodmFsdWUpLCA4LCAtMSk7XG5cdFx0cmV0dXJuICRpbmRleE9mKHR5cGVkQXJyYXlzLCB0YWcpID4gLTE7XG5cdH1cblx0aWYgKCFnT1BEKSB7IHJldHVybiBmYWxzZTsgfVxuXHRyZXR1cm4gdHJ5VHlwZWRBcnJheXModmFsdWUpO1xufTtcblxufSkuY2FsbCh0aGlzLHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiID8gc2VsZiA6IHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgPyB3aW5kb3cgOiB7fSkiLCIndXNlIHN0cmljdCc7XG5cbnZhciAkV2Vha01hcCA9IHR5cGVvZiBXZWFrTWFwID09PSAnZnVuY3Rpb24nICYmIFdlYWtNYXAucHJvdG90eXBlID8gV2Vha01hcCA6IG51bGw7XG52YXIgJFdlYWtTZXQgPSB0eXBlb2YgV2Vha1NldCA9PT0gJ2Z1bmN0aW9uJyAmJiBXZWFrU2V0LnByb3RvdHlwZSA/IFdlYWtTZXQgOiBudWxsO1xuXG52YXIgZXhwb3J0ZWQ7XG5cbmlmICghJFdlYWtNYXApIHtcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG5cdGV4cG9ydGVkID0gZnVuY3Rpb24gaXNXZWFrTWFwKHgpIHtcblx0XHQvLyBgV2Vha01hcGAgaXMgbm90IHByZXNlbnQgaW4gdGhpcyBlbnZpcm9ubWVudC5cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH07XG59XG5cbnZhciAkbWFwSGFzID0gJFdlYWtNYXAgPyAkV2Vha01hcC5wcm90b3R5cGUuaGFzIDogbnVsbDtcbnZhciAkc2V0SGFzID0gJFdlYWtTZXQgPyAkV2Vha1NldC5wcm90b3R5cGUuaGFzIDogbnVsbDtcbmlmICghZXhwb3J0ZWQgJiYgISRtYXBIYXMpIHtcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG5cdGV4cG9ydGVkID0gZnVuY3Rpb24gaXNXZWFrTWFwKHgpIHtcblx0XHQvLyBgV2Vha01hcGAgZG9lcyBub3QgaGF2ZSBhIGBoYXNgIG1ldGhvZFxuXHRcdHJldHVybiBmYWxzZTtcblx0fTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRlZCB8fCBmdW5jdGlvbiBpc1dlYWtNYXAoeCkge1xuXHRpZiAoIXggfHwgdHlwZW9mIHggIT09ICdvYmplY3QnKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cdHRyeSB7XG5cdFx0JG1hcEhhcy5jYWxsKHgsICRtYXBIYXMpO1xuXHRcdGlmICgkc2V0SGFzKSB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHQkc2V0SGFzLmNhbGwoeCwgJHNldEhhcyk7XG5cdFx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4geCBpbnN0YW5jZW9mICRXZWFrTWFwOyAvLyBjb3JlLWpzIHdvcmthcm91bmQsIHByZS12M1xuXHR9IGNhdGNoIChlKSB7fVxuXHRyZXR1cm4gZmFsc2U7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgR2V0SW50cmluc2ljID0gcmVxdWlyZSgnZ2V0LWludHJpbnNpYycpO1xudmFyIGNhbGxCb3VuZCA9IHJlcXVpcmUoJ2NhbGwtYmluZC9jYWxsQm91bmQnKTtcblxudmFyICRXZWFrU2V0ID0gR2V0SW50cmluc2ljKCclV2Vha1NldCUnLCB0cnVlKTtcblxudmFyICRzZXRIYXMgPSBjYWxsQm91bmQoJ1dlYWtTZXQucHJvdG90eXBlLmhhcycsIHRydWUpO1xuXG5pZiAoJHNldEhhcykge1xuXHR2YXIgJG1hcEhhcyA9IGNhbGxCb3VuZCgnV2Vha01hcC5wcm90b3R5cGUuaGFzJywgdHJ1ZSk7XG5cblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc1dlYWtTZXQoeCkge1xuXHRcdGlmICgheCB8fCB0eXBlb2YgeCAhPT0gJ29iamVjdCcpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0dHJ5IHtcblx0XHRcdCRzZXRIYXMoeCwgJHNldEhhcyk7XG5cdFx0XHRpZiAoJG1hcEhhcykge1xuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdCRtYXBIYXMoeCwgJG1hcEhhcyk7XG5cdFx0XHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHggaW5zdGFuY2VvZiAkV2Vha1NldDsgLy8gY29yZS1qcyB3b3JrYXJvdW5kLCBwcmUtdjNcblx0XHR9IGNhdGNoIChlKSB7fVxuXHRcdHJldHVybiBmYWxzZTtcblx0fTtcbn0gZWxzZSB7XG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzV2Vha1NldCh4KSB7XG5cdFx0Ly8gYFdlYWtTZXRgIGRvZXMgbm90IGV4aXN0LCBvciBkb2VzIG5vdCBoYXZlIGEgYGhhc2AgbWV0aG9kXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9O1xufVxuIiwidmFyIHRvU3RyaW5nID0ge30udG9TdHJpbmc7XG5cbm1vZHVsZS5leHBvcnRzID0gQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbiAoYXJyKSB7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKGFycikgPT0gJ1tvYmplY3QgQXJyYXldJztcbn07XG4iLCJ2YXIgaGFzTWFwID0gdHlwZW9mIE1hcCA9PT0gJ2Z1bmN0aW9uJyAmJiBNYXAucHJvdG90eXBlO1xudmFyIG1hcFNpemVEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvciAmJiBoYXNNYXAgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE1hcC5wcm90b3R5cGUsICdzaXplJykgOiBudWxsO1xudmFyIG1hcFNpemUgPSBoYXNNYXAgJiYgbWFwU2l6ZURlc2NyaXB0b3IgJiYgdHlwZW9mIG1hcFNpemVEZXNjcmlwdG9yLmdldCA9PT0gJ2Z1bmN0aW9uJyA/IG1hcFNpemVEZXNjcmlwdG9yLmdldCA6IG51bGw7XG52YXIgbWFwRm9yRWFjaCA9IGhhc01hcCAmJiBNYXAucHJvdG90eXBlLmZvckVhY2g7XG52YXIgaGFzU2V0ID0gdHlwZW9mIFNldCA9PT0gJ2Z1bmN0aW9uJyAmJiBTZXQucHJvdG90eXBlO1xudmFyIHNldFNpemVEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvciAmJiBoYXNTZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFNldC5wcm90b3R5cGUsICdzaXplJykgOiBudWxsO1xudmFyIHNldFNpemUgPSBoYXNTZXQgJiYgc2V0U2l6ZURlc2NyaXB0b3IgJiYgdHlwZW9mIHNldFNpemVEZXNjcmlwdG9yLmdldCA9PT0gJ2Z1bmN0aW9uJyA/IHNldFNpemVEZXNjcmlwdG9yLmdldCA6IG51bGw7XG52YXIgc2V0Rm9yRWFjaCA9IGhhc1NldCAmJiBTZXQucHJvdG90eXBlLmZvckVhY2g7XG52YXIgaGFzV2Vha01hcCA9IHR5cGVvZiBXZWFrTWFwID09PSAnZnVuY3Rpb24nICYmIFdlYWtNYXAucHJvdG90eXBlO1xudmFyIHdlYWtNYXBIYXMgPSBoYXNXZWFrTWFwID8gV2Vha01hcC5wcm90b3R5cGUuaGFzIDogbnVsbDtcbnZhciBoYXNXZWFrU2V0ID0gdHlwZW9mIFdlYWtTZXQgPT09ICdmdW5jdGlvbicgJiYgV2Vha1NldC5wcm90b3R5cGU7XG52YXIgd2Vha1NldEhhcyA9IGhhc1dlYWtTZXQgPyBXZWFrU2V0LnByb3RvdHlwZS5oYXMgOiBudWxsO1xudmFyIGhhc1dlYWtSZWYgPSB0eXBlb2YgV2Vha1JlZiA9PT0gJ2Z1bmN0aW9uJyAmJiBXZWFrUmVmLnByb3RvdHlwZTtcbnZhciB3ZWFrUmVmRGVyZWYgPSBoYXNXZWFrUmVmID8gV2Vha1JlZi5wcm90b3R5cGUuZGVyZWYgOiBudWxsO1xudmFyIGJvb2xlYW5WYWx1ZU9mID0gQm9vbGVhbi5wcm90b3R5cGUudmFsdWVPZjtcbnZhciBvYmplY3RUb1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG52YXIgZnVuY3Rpb25Ub1N0cmluZyA9IEZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZztcbnZhciAkbWF0Y2ggPSBTdHJpbmcucHJvdG90eXBlLm1hdGNoO1xudmFyICRzbGljZSA9IFN0cmluZy5wcm90b3R5cGUuc2xpY2U7XG52YXIgJHJlcGxhY2UgPSBTdHJpbmcucHJvdG90eXBlLnJlcGxhY2U7XG52YXIgJHRvVXBwZXJDYXNlID0gU3RyaW5nLnByb3RvdHlwZS50b1VwcGVyQ2FzZTtcbnZhciAkdG9Mb3dlckNhc2UgPSBTdHJpbmcucHJvdG90eXBlLnRvTG93ZXJDYXNlO1xudmFyICR0ZXN0ID0gUmVnRXhwLnByb3RvdHlwZS50ZXN0O1xudmFyICRjb25jYXQgPSBBcnJheS5wcm90b3R5cGUuY29uY2F0O1xudmFyICRqb2luID0gQXJyYXkucHJvdG90eXBlLmpvaW47XG52YXIgJGFyclNsaWNlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlO1xudmFyICRmbG9vciA9IE1hdGguZmxvb3I7XG52YXIgYmlnSW50VmFsdWVPZiA9IHR5cGVvZiBCaWdJbnQgPT09ICdmdW5jdGlvbicgPyBCaWdJbnQucHJvdG90eXBlLnZhbHVlT2YgOiBudWxsO1xudmFyIGdPUFMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xudmFyIHN5bVRvU3RyaW5nID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSAnc3ltYm9sJyA/IFN5bWJvbC5wcm90b3R5cGUudG9TdHJpbmcgOiBudWxsO1xudmFyIGhhc1NoYW1tZWRTeW1ib2xzID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSAnb2JqZWN0Jztcbi8vIGllLCBgaGFzLXRvc3RyaW5ndGFnL3NoYW1zXG52YXIgdG9TdHJpbmdUYWcgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbC50b1N0cmluZ1RhZyAmJiAodHlwZW9mIFN5bWJvbC50b1N0cmluZ1RhZyA9PT0gaGFzU2hhbW1lZFN5bWJvbHMgPyAnb2JqZWN0JyA6ICdzeW1ib2wnKVxuICAgID8gU3ltYm9sLnRvU3RyaW5nVGFnXG4gICAgOiBudWxsO1xudmFyIGlzRW51bWVyYWJsZSA9IE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGU7XG5cbnZhciBnUE8gPSAodHlwZW9mIFJlZmxlY3QgPT09ICdmdW5jdGlvbicgPyBSZWZsZWN0LmdldFByb3RvdHlwZU9mIDogT2JqZWN0LmdldFByb3RvdHlwZU9mKSB8fCAoXG4gICAgW10uX19wcm90b19fID09PSBBcnJheS5wcm90b3R5cGUgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wcm90b1xuICAgICAgICA/IGZ1bmN0aW9uIChPKSB7XG4gICAgICAgICAgICByZXR1cm4gTy5fX3Byb3RvX187IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcHJvdG9cbiAgICAgICAgfVxuICAgICAgICA6IG51bGxcbik7XG5cbmZ1bmN0aW9uIGFkZE51bWVyaWNTZXBhcmF0b3IobnVtLCBzdHIpIHtcbiAgICBpZiAoXG4gICAgICAgIG51bSA9PT0gSW5maW5pdHlcbiAgICAgICAgfHwgbnVtID09PSAtSW5maW5pdHlcbiAgICAgICAgfHwgbnVtICE9PSBudW1cbiAgICAgICAgfHwgKG51bSAmJiBudW0gPiAtMTAwMCAmJiBudW0gPCAxMDAwKVxuICAgICAgICB8fCAkdGVzdC5jYWxsKC9lLywgc3RyKVxuICAgICkge1xuICAgICAgICByZXR1cm4gc3RyO1xuICAgIH1cbiAgICB2YXIgc2VwUmVnZXggPSAvWzAtOV0oPz0oPzpbMC05XXszfSkrKD8hWzAtOV0pKS9nO1xuICAgIGlmICh0eXBlb2YgbnVtID09PSAnbnVtYmVyJykge1xuICAgICAgICB2YXIgaW50ID0gbnVtIDwgMCA/IC0kZmxvb3IoLW51bSkgOiAkZmxvb3IobnVtKTsgLy8gdHJ1bmMobnVtKVxuICAgICAgICBpZiAoaW50ICE9PSBudW0pIHtcbiAgICAgICAgICAgIHZhciBpbnRTdHIgPSBTdHJpbmcoaW50KTtcbiAgICAgICAgICAgIHZhciBkZWMgPSAkc2xpY2UuY2FsbChzdHIsIGludFN0ci5sZW5ndGggKyAxKTtcbiAgICAgICAgICAgIHJldHVybiAkcmVwbGFjZS5jYWxsKGludFN0ciwgc2VwUmVnZXgsICckJl8nKSArICcuJyArICRyZXBsYWNlLmNhbGwoJHJlcGxhY2UuY2FsbChkZWMsIC8oWzAtOV17M30pL2csICckJl8nKSwgL18kLywgJycpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiAkcmVwbGFjZS5jYWxsKHN0ciwgc2VwUmVnZXgsICckJl8nKTtcbn1cblxudmFyIHV0aWxJbnNwZWN0ID0gcmVxdWlyZSgnLi91dGlsLmluc3BlY3QnKTtcbnZhciBpbnNwZWN0Q3VzdG9tID0gdXRpbEluc3BlY3QuY3VzdG9tO1xudmFyIGluc3BlY3RTeW1ib2wgPSBpc1N5bWJvbChpbnNwZWN0Q3VzdG9tKSA/IGluc3BlY3RDdXN0b20gOiBudWxsO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGluc3BlY3RfKG9iaiwgb3B0aW9ucywgZGVwdGgsIHNlZW4pIHtcbiAgICB2YXIgb3B0cyA9IG9wdGlvbnMgfHwge307XG5cbiAgICBpZiAoaGFzKG9wdHMsICdxdW90ZVN0eWxlJykgJiYgKG9wdHMucXVvdGVTdHlsZSAhPT0gJ3NpbmdsZScgJiYgb3B0cy5xdW90ZVN0eWxlICE9PSAnZG91YmxlJykpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignb3B0aW9uIFwicXVvdGVTdHlsZVwiIG11c3QgYmUgXCJzaW5nbGVcIiBvciBcImRvdWJsZVwiJyk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgICAgaGFzKG9wdHMsICdtYXhTdHJpbmdMZW5ndGgnKSAmJiAodHlwZW9mIG9wdHMubWF4U3RyaW5nTGVuZ3RoID09PSAnbnVtYmVyJ1xuICAgICAgICAgICAgPyBvcHRzLm1heFN0cmluZ0xlbmd0aCA8IDAgJiYgb3B0cy5tYXhTdHJpbmdMZW5ndGggIT09IEluZmluaXR5XG4gICAgICAgICAgICA6IG9wdHMubWF4U3RyaW5nTGVuZ3RoICE9PSBudWxsXG4gICAgICAgIClcbiAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignb3B0aW9uIFwibWF4U3RyaW5nTGVuZ3RoXCIsIGlmIHByb3ZpZGVkLCBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciwgSW5maW5pdHksIG9yIGBudWxsYCcpO1xuICAgIH1cbiAgICB2YXIgY3VzdG9tSW5zcGVjdCA9IGhhcyhvcHRzLCAnY3VzdG9tSW5zcGVjdCcpID8gb3B0cy5jdXN0b21JbnNwZWN0IDogdHJ1ZTtcbiAgICBpZiAodHlwZW9mIGN1c3RvbUluc3BlY3QgIT09ICdib29sZWFuJyAmJiBjdXN0b21JbnNwZWN0ICE9PSAnc3ltYm9sJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb24gXCJjdXN0b21JbnNwZWN0XCIsIGlmIHByb3ZpZGVkLCBtdXN0IGJlIGB0cnVlYCwgYGZhbHNlYCwgb3IgYFxcJ3N5bWJvbFxcJ2AnKTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICAgIGhhcyhvcHRzLCAnaW5kZW50JylcbiAgICAgICAgJiYgb3B0cy5pbmRlbnQgIT09IG51bGxcbiAgICAgICAgJiYgb3B0cy5pbmRlbnQgIT09ICdcXHQnXG4gICAgICAgICYmICEocGFyc2VJbnQob3B0cy5pbmRlbnQsIDEwKSA9PT0gb3B0cy5pbmRlbnQgJiYgb3B0cy5pbmRlbnQgPiAwKVxuICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb24gXCJpbmRlbnRcIiBtdXN0IGJlIFwiXFxcXHRcIiwgYW4gaW50ZWdlciA+IDAsIG9yIGBudWxsYCcpO1xuICAgIH1cbiAgICBpZiAoaGFzKG9wdHMsICdudW1lcmljU2VwYXJhdG9yJykgJiYgdHlwZW9mIG9wdHMubnVtZXJpY1NlcGFyYXRvciAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ29wdGlvbiBcIm51bWVyaWNTZXBhcmF0b3JcIiwgaWYgcHJvdmlkZWQsIG11c3QgYmUgYHRydWVgIG9yIGBmYWxzZWAnKTtcbiAgICB9XG4gICAgdmFyIG51bWVyaWNTZXBhcmF0b3IgPSBvcHRzLm51bWVyaWNTZXBhcmF0b3I7XG5cbiAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuICd1bmRlZmluZWQnO1xuICAgIH1cbiAgICBpZiAob2JqID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiAnbnVsbCc7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygb2JqID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgcmV0dXJuIG9iaiA/ICd0cnVlJyA6ICdmYWxzZSc7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBvYmogPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBpbnNwZWN0U3RyaW5nKG9iaiwgb3B0cyk7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygb2JqID09PSAnbnVtYmVyJykge1xuICAgICAgICBpZiAob2JqID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gSW5maW5pdHkgLyBvYmogPiAwID8gJzAnIDogJy0wJztcbiAgICAgICAgfVxuICAgICAgICB2YXIgc3RyID0gU3RyaW5nKG9iaik7XG4gICAgICAgIHJldHVybiBudW1lcmljU2VwYXJhdG9yID8gYWRkTnVtZXJpY1NlcGFyYXRvcihvYmosIHN0cikgOiBzdHI7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygb2JqID09PSAnYmlnaW50Jykge1xuICAgICAgICB2YXIgYmlnSW50U3RyID0gU3RyaW5nKG9iaikgKyAnbic7XG4gICAgICAgIHJldHVybiBudW1lcmljU2VwYXJhdG9yID8gYWRkTnVtZXJpY1NlcGFyYXRvcihvYmosIGJpZ0ludFN0cikgOiBiaWdJbnRTdHI7XG4gICAgfVxuXG4gICAgdmFyIG1heERlcHRoID0gdHlwZW9mIG9wdHMuZGVwdGggPT09ICd1bmRlZmluZWQnID8gNSA6IG9wdHMuZGVwdGg7XG4gICAgaWYgKHR5cGVvZiBkZXB0aCA9PT0gJ3VuZGVmaW5lZCcpIHsgZGVwdGggPSAwOyB9XG4gICAgaWYgKGRlcHRoID49IG1heERlcHRoICYmIG1heERlcHRoID4gMCAmJiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gaXNBcnJheShvYmopID8gJ1tBcnJheV0nIDogJ1tPYmplY3RdJztcbiAgICB9XG5cbiAgICB2YXIgaW5kZW50ID0gZ2V0SW5kZW50KG9wdHMsIGRlcHRoKTtcblxuICAgIGlmICh0eXBlb2Ygc2VlbiA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgc2VlbiA9IFtdO1xuICAgIH0gZWxzZSBpZiAoaW5kZXhPZihzZWVuLCBvYmopID49IDApIHtcbiAgICAgICAgcmV0dXJuICdbQ2lyY3VsYXJdJztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbnNwZWN0KHZhbHVlLCBmcm9tLCBub0luZGVudCkge1xuICAgICAgICBpZiAoZnJvbSkge1xuICAgICAgICAgICAgc2VlbiA9ICRhcnJTbGljZS5jYWxsKHNlZW4pO1xuICAgICAgICAgICAgc2Vlbi5wdXNoKGZyb20pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub0luZGVudCkge1xuICAgICAgICAgICAgdmFyIG5ld09wdHMgPSB7XG4gICAgICAgICAgICAgICAgZGVwdGg6IG9wdHMuZGVwdGhcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAoaGFzKG9wdHMsICdxdW90ZVN0eWxlJykpIHtcbiAgICAgICAgICAgICAgICBuZXdPcHRzLnF1b3RlU3R5bGUgPSBvcHRzLnF1b3RlU3R5bGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gaW5zcGVjdF8odmFsdWUsIG5ld09wdHMsIGRlcHRoICsgMSwgc2Vlbik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGluc3BlY3RfKHZhbHVlLCBvcHRzLCBkZXB0aCArIDEsIHNlZW4pO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygb2JqID09PSAnZnVuY3Rpb24nICYmICFpc1JlZ0V4cChvYmopKSB7IC8vIGluIG9sZGVyIGVuZ2luZXMsIHJlZ2V4ZXMgYXJlIGNhbGxhYmxlXG4gICAgICAgIHZhciBuYW1lID0gbmFtZU9mKG9iaik7XG4gICAgICAgIHZhciBrZXlzID0gYXJyT2JqS2V5cyhvYmosIGluc3BlY3QpO1xuICAgICAgICByZXR1cm4gJ1tGdW5jdGlvbicgKyAobmFtZSA/ICc6ICcgKyBuYW1lIDogJyAoYW5vbnltb3VzKScpICsgJ10nICsgKGtleXMubGVuZ3RoID4gMCA/ICcgeyAnICsgJGpvaW4uY2FsbChrZXlzLCAnLCAnKSArICcgfScgOiAnJyk7XG4gICAgfVxuICAgIGlmIChpc1N5bWJvbChvYmopKSB7XG4gICAgICAgIHZhciBzeW1TdHJpbmcgPSBoYXNTaGFtbWVkU3ltYm9scyA/ICRyZXBsYWNlLmNhbGwoU3RyaW5nKG9iaiksIC9eKFN5bWJvbFxcKC4qXFwpKV9bXildKiQvLCAnJDEnKSA6IHN5bVRvU3RyaW5nLmNhbGwob2JqKTtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmICFoYXNTaGFtbWVkU3ltYm9scyA/IG1hcmtCb3hlZChzeW1TdHJpbmcpIDogc3ltU3RyaW5nO1xuICAgIH1cbiAgICBpZiAoaXNFbGVtZW50KG9iaikpIHtcbiAgICAgICAgdmFyIHMgPSAnPCcgKyAkdG9Mb3dlckNhc2UuY2FsbChTdHJpbmcob2JqLm5vZGVOYW1lKSk7XG4gICAgICAgIHZhciBhdHRycyA9IG9iai5hdHRyaWJ1dGVzIHx8IFtdO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGF0dHJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBzICs9ICcgJyArIGF0dHJzW2ldLm5hbWUgKyAnPScgKyB3cmFwUXVvdGVzKHF1b3RlKGF0dHJzW2ldLnZhbHVlKSwgJ2RvdWJsZScsIG9wdHMpO1xuICAgICAgICB9XG4gICAgICAgIHMgKz0gJz4nO1xuICAgICAgICBpZiAob2JqLmNoaWxkTm9kZXMgJiYgb2JqLmNoaWxkTm9kZXMubGVuZ3RoKSB7IHMgKz0gJy4uLic7IH1cbiAgICAgICAgcyArPSAnPC8nICsgJHRvTG93ZXJDYXNlLmNhbGwoU3RyaW5nKG9iai5ub2RlTmFtZSkpICsgJz4nO1xuICAgICAgICByZXR1cm4gcztcbiAgICB9XG4gICAgaWYgKGlzQXJyYXkob2JqKSkge1xuICAgICAgICBpZiAob2JqLmxlbmd0aCA9PT0gMCkgeyByZXR1cm4gJ1tdJzsgfVxuICAgICAgICB2YXIgeHMgPSBhcnJPYmpLZXlzKG9iaiwgaW5zcGVjdCk7XG4gICAgICAgIGlmIChpbmRlbnQgJiYgIXNpbmdsZUxpbmVWYWx1ZXMoeHMpKSB7XG4gICAgICAgICAgICByZXR1cm4gJ1snICsgaW5kZW50ZWRKb2luKHhzLCBpbmRlbnQpICsgJ10nO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnWyAnICsgJGpvaW4uY2FsbCh4cywgJywgJykgKyAnIF0nO1xuICAgIH1cbiAgICBpZiAoaXNFcnJvcihvYmopKSB7XG4gICAgICAgIHZhciBwYXJ0cyA9IGFyck9iaktleXMob2JqLCBpbnNwZWN0KTtcbiAgICAgICAgaWYgKCEoJ2NhdXNlJyBpbiBFcnJvci5wcm90b3R5cGUpICYmICdjYXVzZScgaW4gb2JqICYmICFpc0VudW1lcmFibGUuY2FsbChvYmosICdjYXVzZScpKSB7XG4gICAgICAgICAgICByZXR1cm4gJ3sgWycgKyBTdHJpbmcob2JqKSArICddICcgKyAkam9pbi5jYWxsKCRjb25jYXQuY2FsbCgnW2NhdXNlXTogJyArIGluc3BlY3Qob2JqLmNhdXNlKSwgcGFydHMpLCAnLCAnKSArICcgfSc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCA9PT0gMCkgeyByZXR1cm4gJ1snICsgU3RyaW5nKG9iaikgKyAnXSc7IH1cbiAgICAgICAgcmV0dXJuICd7IFsnICsgU3RyaW5nKG9iaikgKyAnXSAnICsgJGpvaW4uY2FsbChwYXJ0cywgJywgJykgKyAnIH0nO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYgY3VzdG9tSW5zcGVjdCkge1xuICAgICAgICBpZiAoaW5zcGVjdFN5bWJvbCAmJiB0eXBlb2Ygb2JqW2luc3BlY3RTeW1ib2xdID09PSAnZnVuY3Rpb24nICYmIHV0aWxJbnNwZWN0KSB7XG4gICAgICAgICAgICByZXR1cm4gdXRpbEluc3BlY3Qob2JqLCB7IGRlcHRoOiBtYXhEZXB0aCAtIGRlcHRoIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKGN1c3RvbUluc3BlY3QgIT09ICdzeW1ib2wnICYmIHR5cGVvZiBvYmouaW5zcGVjdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcmV0dXJuIG9iai5pbnNwZWN0KCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzTWFwKG9iaikpIHtcbiAgICAgICAgdmFyIG1hcFBhcnRzID0gW107XG4gICAgICAgIG1hcEZvckVhY2guY2FsbChvYmosIGZ1bmN0aW9uICh2YWx1ZSwga2V5KSB7XG4gICAgICAgICAgICBtYXBQYXJ0cy5wdXNoKGluc3BlY3Qoa2V5LCBvYmosIHRydWUpICsgJyA9PiAnICsgaW5zcGVjdCh2YWx1ZSwgb2JqKSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gY29sbGVjdGlvbk9mKCdNYXAnLCBtYXBTaXplLmNhbGwob2JqKSwgbWFwUGFydHMsIGluZGVudCk7XG4gICAgfVxuICAgIGlmIChpc1NldChvYmopKSB7XG4gICAgICAgIHZhciBzZXRQYXJ0cyA9IFtdO1xuICAgICAgICBzZXRGb3JFYWNoLmNhbGwob2JqLCBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIHNldFBhcnRzLnB1c2goaW5zcGVjdCh2YWx1ZSwgb2JqKSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gY29sbGVjdGlvbk9mKCdTZXQnLCBzZXRTaXplLmNhbGwob2JqKSwgc2V0UGFydHMsIGluZGVudCk7XG4gICAgfVxuICAgIGlmIChpc1dlYWtNYXAob2JqKSkge1xuICAgICAgICByZXR1cm4gd2Vha0NvbGxlY3Rpb25PZignV2Vha01hcCcpO1xuICAgIH1cbiAgICBpZiAoaXNXZWFrU2V0KG9iaikpIHtcbiAgICAgICAgcmV0dXJuIHdlYWtDb2xsZWN0aW9uT2YoJ1dlYWtTZXQnKTtcbiAgICB9XG4gICAgaWYgKGlzV2Vha1JlZihvYmopKSB7XG4gICAgICAgIHJldHVybiB3ZWFrQ29sbGVjdGlvbk9mKCdXZWFrUmVmJyk7XG4gICAgfVxuICAgIGlmIChpc051bWJlcihvYmopKSB7XG4gICAgICAgIHJldHVybiBtYXJrQm94ZWQoaW5zcGVjdChOdW1iZXIob2JqKSkpO1xuICAgIH1cbiAgICBpZiAoaXNCaWdJbnQob2JqKSkge1xuICAgICAgICByZXR1cm4gbWFya0JveGVkKGluc3BlY3QoYmlnSW50VmFsdWVPZi5jYWxsKG9iaikpKTtcbiAgICB9XG4gICAgaWYgKGlzQm9vbGVhbihvYmopKSB7XG4gICAgICAgIHJldHVybiBtYXJrQm94ZWQoYm9vbGVhblZhbHVlT2YuY2FsbChvYmopKTtcbiAgICB9XG4gICAgaWYgKGlzU3RyaW5nKG9iaikpIHtcbiAgICAgICAgcmV0dXJuIG1hcmtCb3hlZChpbnNwZWN0KFN0cmluZyhvYmopKSk7XG4gICAgfVxuICAgIGlmICghaXNEYXRlKG9iaikgJiYgIWlzUmVnRXhwKG9iaikpIHtcbiAgICAgICAgdmFyIHlzID0gYXJyT2JqS2V5cyhvYmosIGluc3BlY3QpO1xuICAgICAgICB2YXIgaXNQbGFpbk9iamVjdCA9IGdQTyA/IGdQTyhvYmopID09PSBPYmplY3QucHJvdG90eXBlIDogb2JqIGluc3RhbmNlb2YgT2JqZWN0IHx8IG9iai5jb25zdHJ1Y3RvciA9PT0gT2JqZWN0O1xuICAgICAgICB2YXIgcHJvdG9UYWcgPSBvYmogaW5zdGFuY2VvZiBPYmplY3QgPyAnJyA6ICdudWxsIHByb3RvdHlwZSc7XG4gICAgICAgIHZhciBzdHJpbmdUYWcgPSAhaXNQbGFpbk9iamVjdCAmJiB0b1N0cmluZ1RhZyAmJiBPYmplY3Qob2JqKSA9PT0gb2JqICYmIHRvU3RyaW5nVGFnIGluIG9iaiA/ICRzbGljZS5jYWxsKHRvU3RyKG9iaiksIDgsIC0xKSA6IHByb3RvVGFnID8gJ09iamVjdCcgOiAnJztcbiAgICAgICAgdmFyIGNvbnN0cnVjdG9yVGFnID0gaXNQbGFpbk9iamVjdCB8fCB0eXBlb2Ygb2JqLmNvbnN0cnVjdG9yICE9PSAnZnVuY3Rpb24nID8gJycgOiBvYmouY29uc3RydWN0b3IubmFtZSA/IG9iai5jb25zdHJ1Y3Rvci5uYW1lICsgJyAnIDogJyc7XG4gICAgICAgIHZhciB0YWcgPSBjb25zdHJ1Y3RvclRhZyArIChzdHJpbmdUYWcgfHwgcHJvdG9UYWcgPyAnWycgKyAkam9pbi5jYWxsKCRjb25jYXQuY2FsbChbXSwgc3RyaW5nVGFnIHx8IFtdLCBwcm90b1RhZyB8fCBbXSksICc6ICcpICsgJ10gJyA6ICcnKTtcbiAgICAgICAgaWYgKHlzLmxlbmd0aCA9PT0gMCkgeyByZXR1cm4gdGFnICsgJ3t9JzsgfVxuICAgICAgICBpZiAoaW5kZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gdGFnICsgJ3snICsgaW5kZW50ZWRKb2luKHlzLCBpbmRlbnQpICsgJ30nO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0YWcgKyAneyAnICsgJGpvaW4uY2FsbCh5cywgJywgJykgKyAnIH0nO1xuICAgIH1cbiAgICByZXR1cm4gU3RyaW5nKG9iaik7XG59O1xuXG5mdW5jdGlvbiB3cmFwUXVvdGVzKHMsIGRlZmF1bHRTdHlsZSwgb3B0cykge1xuICAgIHZhciBxdW90ZUNoYXIgPSAob3B0cy5xdW90ZVN0eWxlIHx8IGRlZmF1bHRTdHlsZSkgPT09ICdkb3VibGUnID8gJ1wiJyA6IFwiJ1wiO1xuICAgIHJldHVybiBxdW90ZUNoYXIgKyBzICsgcXVvdGVDaGFyO1xufVxuXG5mdW5jdGlvbiBxdW90ZShzKSB7XG4gICAgcmV0dXJuICRyZXBsYWNlLmNhbGwoU3RyaW5nKHMpLCAvXCIvZywgJyZxdW90OycpO1xufVxuXG5mdW5jdGlvbiBpc0FycmF5KG9iaikgeyByZXR1cm4gdG9TdHIob2JqKSA9PT0gJ1tvYmplY3QgQXJyYXldJyAmJiAoIXRvU3RyaW5nVGFnIHx8ICEodHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYgdG9TdHJpbmdUYWcgaW4gb2JqKSk7IH1cbmZ1bmN0aW9uIGlzRGF0ZShvYmopIHsgcmV0dXJuIHRvU3RyKG9iaikgPT09ICdbb2JqZWN0IERhdGVdJyAmJiAoIXRvU3RyaW5nVGFnIHx8ICEodHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYgdG9TdHJpbmdUYWcgaW4gb2JqKSk7IH1cbmZ1bmN0aW9uIGlzUmVnRXhwKG9iaikgeyByZXR1cm4gdG9TdHIob2JqKSA9PT0gJ1tvYmplY3QgUmVnRXhwXScgJiYgKCF0b1N0cmluZ1RhZyB8fCAhKHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmIHRvU3RyaW5nVGFnIGluIG9iaikpOyB9XG5mdW5jdGlvbiBpc0Vycm9yKG9iaikgeyByZXR1cm4gdG9TdHIob2JqKSA9PT0gJ1tvYmplY3QgRXJyb3JdJyAmJiAoIXRvU3RyaW5nVGFnIHx8ICEodHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYgdG9TdHJpbmdUYWcgaW4gb2JqKSk7IH1cbmZ1bmN0aW9uIGlzU3RyaW5nKG9iaikgeyByZXR1cm4gdG9TdHIob2JqKSA9PT0gJ1tvYmplY3QgU3RyaW5nXScgJiYgKCF0b1N0cmluZ1RhZyB8fCAhKHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmIHRvU3RyaW5nVGFnIGluIG9iaikpOyB9XG5mdW5jdGlvbiBpc051bWJlcihvYmopIHsgcmV0dXJuIHRvU3RyKG9iaikgPT09ICdbb2JqZWN0IE51bWJlcl0nICYmICghdG9TdHJpbmdUYWcgfHwgISh0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJiB0b1N0cmluZ1RhZyBpbiBvYmopKTsgfVxuZnVuY3Rpb24gaXNCb29sZWFuKG9iaikgeyByZXR1cm4gdG9TdHIob2JqKSA9PT0gJ1tvYmplY3QgQm9vbGVhbl0nICYmICghdG9TdHJpbmdUYWcgfHwgISh0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJiB0b1N0cmluZ1RhZyBpbiBvYmopKTsgfVxuXG4vLyBTeW1ib2wgYW5kIEJpZ0ludCBkbyBoYXZlIFN5bWJvbC50b1N0cmluZ1RhZyBieSBzcGVjLCBzbyB0aGF0IGNhbid0IGJlIHVzZWQgdG8gZWxpbWluYXRlIGZhbHNlIHBvc2l0aXZlc1xuZnVuY3Rpb24gaXNTeW1ib2wob2JqKSB7XG4gICAgaWYgKGhhc1NoYW1tZWRTeW1ib2xzKSB7XG4gICAgICAgIHJldHVybiBvYmogJiYgdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYgb2JqIGluc3RhbmNlb2YgU3ltYm9sO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ3N5bWJvbCcpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmICghb2JqIHx8IHR5cGVvZiBvYmogIT09ICdvYmplY3QnIHx8ICFzeW1Ub1N0cmluZykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIHN5bVRvU3RyaW5nLmNhbGwob2JqKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZSkge31cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGlzQmlnSW50KG9iaikge1xuICAgIGlmICghb2JqIHx8IHR5cGVvZiBvYmogIT09ICdvYmplY3QnIHx8ICFiaWdJbnRWYWx1ZU9mKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgYmlnSW50VmFsdWVPZi5jYWxsKG9iaik7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG52YXIgaGFzT3duID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSB8fCBmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBrZXkgaW4gdGhpczsgfTtcbmZ1bmN0aW9uIGhhcyhvYmosIGtleSkge1xuICAgIHJldHVybiBoYXNPd24uY2FsbChvYmosIGtleSk7XG59XG5cbmZ1bmN0aW9uIHRvU3RyKG9iaikge1xuICAgIHJldHVybiBvYmplY3RUb1N0cmluZy5jYWxsKG9iaik7XG59XG5cbmZ1bmN0aW9uIG5hbWVPZihmKSB7XG4gICAgaWYgKGYubmFtZSkgeyByZXR1cm4gZi5uYW1lOyB9XG4gICAgdmFyIG0gPSAkbWF0Y2guY2FsbChmdW5jdGlvblRvU3RyaW5nLmNhbGwoZiksIC9eZnVuY3Rpb25cXHMqKFtcXHckXSspLyk7XG4gICAgaWYgKG0pIHsgcmV0dXJuIG1bMV07IH1cbiAgICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gaW5kZXhPZih4cywgeCkge1xuICAgIGlmICh4cy5pbmRleE9mKSB7IHJldHVybiB4cy5pbmRleE9mKHgpOyB9XG4gICAgZm9yICh2YXIgaSA9IDAsIGwgPSB4cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgaWYgKHhzW2ldID09PSB4KSB7IHJldHVybiBpOyB9XG4gICAgfVxuICAgIHJldHVybiAtMTtcbn1cblxuZnVuY3Rpb24gaXNNYXAoeCkge1xuICAgIGlmICghbWFwU2l6ZSB8fCAheCB8fCB0eXBlb2YgeCAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBtYXBTaXplLmNhbGwoeCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBzZXRTaXplLmNhbGwoeCk7XG4gICAgICAgIH0gY2F0Y2ggKHMpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB4IGluc3RhbmNlb2YgTWFwOyAvLyBjb3JlLWpzIHdvcmthcm91bmQsIHByZS12Mi41LjBcbiAgICB9IGNhdGNoIChlKSB7fVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gaXNXZWFrTWFwKHgpIHtcbiAgICBpZiAoIXdlYWtNYXBIYXMgfHwgIXggfHwgdHlwZW9mIHggIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgd2Vha01hcEhhcy5jYWxsKHgsIHdlYWtNYXBIYXMpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgd2Vha1NldEhhcy5jYWxsKHgsIHdlYWtTZXRIYXMpO1xuICAgICAgICB9IGNhdGNoIChzKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geCBpbnN0YW5jZW9mIFdlYWtNYXA7IC8vIGNvcmUtanMgd29ya2Fyb3VuZCwgcHJlLXYyLjUuMFxuICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBpc1dlYWtSZWYoeCkge1xuICAgIGlmICghd2Vha1JlZkRlcmVmIHx8ICF4IHx8IHR5cGVvZiB4ICE9PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIHdlYWtSZWZEZXJlZi5jYWxsKHgpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlKSB7fVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gaXNTZXQoeCkge1xuICAgIGlmICghc2V0U2l6ZSB8fCAheCB8fCB0eXBlb2YgeCAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBzZXRTaXplLmNhbGwoeCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBtYXBTaXplLmNhbGwoeCk7XG4gICAgICAgIH0gY2F0Y2ggKG0pIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB4IGluc3RhbmNlb2YgU2V0OyAvLyBjb3JlLWpzIHdvcmthcm91bmQsIHByZS12Mi41LjBcbiAgICB9IGNhdGNoIChlKSB7fVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gaXNXZWFrU2V0KHgpIHtcbiAgICBpZiAoIXdlYWtTZXRIYXMgfHwgIXggfHwgdHlwZW9mIHggIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgd2Vha1NldEhhcy5jYWxsKHgsIHdlYWtTZXRIYXMpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgd2Vha01hcEhhcy5jYWxsKHgsIHdlYWtNYXBIYXMpO1xuICAgICAgICB9IGNhdGNoIChzKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geCBpbnN0YW5jZW9mIFdlYWtTZXQ7IC8vIGNvcmUtanMgd29ya2Fyb3VuZCwgcHJlLXYyLjUuMFxuICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBpc0VsZW1lbnQoeCkge1xuICAgIGlmICgheCB8fCB0eXBlb2YgeCAhPT0gJ29iamVjdCcpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgaWYgKHR5cGVvZiBIVE1MRWxlbWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgeCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gdHlwZW9mIHgubm9kZU5hbWUgPT09ICdzdHJpbmcnICYmIHR5cGVvZiB4LmdldEF0dHJpYnV0ZSA9PT0gJ2Z1bmN0aW9uJztcbn1cblxuZnVuY3Rpb24gaW5zcGVjdFN0cmluZyhzdHIsIG9wdHMpIHtcbiAgICBpZiAoc3RyLmxlbmd0aCA+IG9wdHMubWF4U3RyaW5nTGVuZ3RoKSB7XG4gICAgICAgIHZhciByZW1haW5pbmcgPSBzdHIubGVuZ3RoIC0gb3B0cy5tYXhTdHJpbmdMZW5ndGg7XG4gICAgICAgIHZhciB0cmFpbGVyID0gJy4uLiAnICsgcmVtYWluaW5nICsgJyBtb3JlIGNoYXJhY3RlcicgKyAocmVtYWluaW5nID4gMSA/ICdzJyA6ICcnKTtcbiAgICAgICAgcmV0dXJuIGluc3BlY3RTdHJpbmcoJHNsaWNlLmNhbGwoc3RyLCAwLCBvcHRzLm1heFN0cmluZ0xlbmd0aCksIG9wdHMpICsgdHJhaWxlcjtcbiAgICB9XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnRyb2wtcmVnZXhcbiAgICB2YXIgcyA9ICRyZXBsYWNlLmNhbGwoJHJlcGxhY2UuY2FsbChzdHIsIC8oWydcXFxcXSkvZywgJ1xcXFwkMScpLCAvW1xceDAwLVxceDFmXS9nLCBsb3dieXRlKTtcbiAgICByZXR1cm4gd3JhcFF1b3RlcyhzLCAnc2luZ2xlJywgb3B0cyk7XG59XG5cbmZ1bmN0aW9uIGxvd2J5dGUoYykge1xuICAgIHZhciBuID0gYy5jaGFyQ29kZUF0KDApO1xuICAgIHZhciB4ID0ge1xuICAgICAgICA4OiAnYicsXG4gICAgICAgIDk6ICd0JyxcbiAgICAgICAgMTA6ICduJyxcbiAgICAgICAgMTI6ICdmJyxcbiAgICAgICAgMTM6ICdyJ1xuICAgIH1bbl07XG4gICAgaWYgKHgpIHsgcmV0dXJuICdcXFxcJyArIHg7IH1cbiAgICByZXR1cm4gJ1xcXFx4JyArIChuIDwgMHgxMCA/ICcwJyA6ICcnKSArICR0b1VwcGVyQ2FzZS5jYWxsKG4udG9TdHJpbmcoMTYpKTtcbn1cblxuZnVuY3Rpb24gbWFya0JveGVkKHN0cikge1xuICAgIHJldHVybiAnT2JqZWN0KCcgKyBzdHIgKyAnKSc7XG59XG5cbmZ1bmN0aW9uIHdlYWtDb2xsZWN0aW9uT2YodHlwZSkge1xuICAgIHJldHVybiB0eXBlICsgJyB7ID8gfSc7XG59XG5cbmZ1bmN0aW9uIGNvbGxlY3Rpb25PZih0eXBlLCBzaXplLCBlbnRyaWVzLCBpbmRlbnQpIHtcbiAgICB2YXIgam9pbmVkRW50cmllcyA9IGluZGVudCA/IGluZGVudGVkSm9pbihlbnRyaWVzLCBpbmRlbnQpIDogJGpvaW4uY2FsbChlbnRyaWVzLCAnLCAnKTtcbiAgICByZXR1cm4gdHlwZSArICcgKCcgKyBzaXplICsgJykgeycgKyBqb2luZWRFbnRyaWVzICsgJ30nO1xufVxuXG5mdW5jdGlvbiBzaW5nbGVMaW5lVmFsdWVzKHhzKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB4cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoaW5kZXhPZih4c1tpXSwgJ1xcbicpID49IDApIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gZ2V0SW5kZW50KG9wdHMsIGRlcHRoKSB7XG4gICAgdmFyIGJhc2VJbmRlbnQ7XG4gICAgaWYgKG9wdHMuaW5kZW50ID09PSAnXFx0Jykge1xuICAgICAgICBiYXNlSW5kZW50ID0gJ1xcdCc7XG4gICAgfSBlbHNlIGlmICh0eXBlb2Ygb3B0cy5pbmRlbnQgPT09ICdudW1iZXInICYmIG9wdHMuaW5kZW50ID4gMCkge1xuICAgICAgICBiYXNlSW5kZW50ID0gJGpvaW4uY2FsbChBcnJheShvcHRzLmluZGVudCArIDEpLCAnICcpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBiYXNlOiBiYXNlSW5kZW50LFxuICAgICAgICBwcmV2OiAkam9pbi5jYWxsKEFycmF5KGRlcHRoICsgMSksIGJhc2VJbmRlbnQpXG4gICAgfTtcbn1cblxuZnVuY3Rpb24gaW5kZW50ZWRKb2luKHhzLCBpbmRlbnQpIHtcbiAgICBpZiAoeHMubGVuZ3RoID09PSAwKSB7IHJldHVybiAnJzsgfVxuICAgIHZhciBsaW5lSm9pbmVyID0gJ1xcbicgKyBpbmRlbnQucHJldiArIGluZGVudC5iYXNlO1xuICAgIHJldHVybiBsaW5lSm9pbmVyICsgJGpvaW4uY2FsbCh4cywgJywnICsgbGluZUpvaW5lcikgKyAnXFxuJyArIGluZGVudC5wcmV2O1xufVxuXG5mdW5jdGlvbiBhcnJPYmpLZXlzKG9iaiwgaW5zcGVjdCkge1xuICAgIHZhciBpc0FyciA9IGlzQXJyYXkob2JqKTtcbiAgICB2YXIgeHMgPSBbXTtcbiAgICBpZiAoaXNBcnIpIHtcbiAgICAgICAgeHMubGVuZ3RoID0gb2JqLmxlbmd0aDtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvYmoubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHhzW2ldID0gaGFzKG9iaiwgaSkgPyBpbnNwZWN0KG9ialtpXSwgb2JqKSA6ICcnO1xuICAgICAgICB9XG4gICAgfVxuICAgIHZhciBzeW1zID0gdHlwZW9mIGdPUFMgPT09ICdmdW5jdGlvbicgPyBnT1BTKG9iaikgOiBbXTtcbiAgICB2YXIgc3ltTWFwO1xuICAgIGlmIChoYXNTaGFtbWVkU3ltYm9scykge1xuICAgICAgICBzeW1NYXAgPSB7fTtcbiAgICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCBzeW1zLmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgICBzeW1NYXBbJyQnICsgc3ltc1trXV0gPSBzeW1zW2tdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZm9yICh2YXIga2V5IGluIG9iaikgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4XG4gICAgICAgIGlmICghaGFzKG9iaiwga2V5KSkgeyBjb250aW51ZTsgfSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4LCBuby1jb250aW51ZVxuICAgICAgICBpZiAoaXNBcnIgJiYgU3RyaW5nKE51bWJlcihrZXkpKSA9PT0ga2V5ICYmIGtleSA8IG9iai5sZW5ndGgpIHsgY29udGludWU7IH0gLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheCwgbm8tY29udGludWVcbiAgICAgICAgaWYgKGhhc1NoYW1tZWRTeW1ib2xzICYmIHN5bU1hcFsnJCcgKyBrZXldIGluc3RhbmNlb2YgU3ltYm9sKSB7XG4gICAgICAgICAgICAvLyB0aGlzIGlzIHRvIHByZXZlbnQgc2hhbW1lZCBTeW1ib2xzLCB3aGljaCBhcmUgc3RvcmVkIGFzIHN0cmluZ3MsIGZyb20gYmVpbmcgaW5jbHVkZWQgaW4gdGhlIHN0cmluZyBrZXkgc2VjdGlvblxuICAgICAgICAgICAgY29udGludWU7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXgsIG5vLWNvbnRpbnVlXG4gICAgICAgIH0gZWxzZSBpZiAoJHRlc3QuY2FsbCgvW15cXHckXS8sIGtleSkpIHtcbiAgICAgICAgICAgIHhzLnB1c2goaW5zcGVjdChrZXksIG9iaikgKyAnOiAnICsgaW5zcGVjdChvYmpba2V5XSwgb2JqKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB4cy5wdXNoKGtleSArICc6ICcgKyBpbnNwZWN0KG9ialtrZXldLCBvYmopKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAodHlwZW9mIGdPUFMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBzeW1zLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBpZiAoaXNFbnVtZXJhYmxlLmNhbGwob2JqLCBzeW1zW2pdKSkge1xuICAgICAgICAgICAgICAgIHhzLnB1c2goJ1snICsgaW5zcGVjdChzeW1zW2pdKSArICddOiAnICsgaW5zcGVjdChvYmpbc3ltc1tqXV0sIG9iaikpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB4cztcbn1cbiIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgndXRpbCcpLmluc3BlY3Q7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBudW1iZXJJc05hTiA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuXHRyZXR1cm4gdmFsdWUgIT09IHZhbHVlO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpcyhhLCBiKSB7XG5cdGlmIChhID09PSAwICYmIGIgPT09IDApIHtcblx0XHRyZXR1cm4gMSAvIGEgPT09IDEgLyBiO1xuXHR9XG5cdGlmIChhID09PSBiKSB7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblx0aWYgKG51bWJlcklzTmFOKGEpICYmIG51bWJlcklzTmFOKGIpKSB7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblx0cmV0dXJuIGZhbHNlO1xufTtcblxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgZGVmaW5lID0gcmVxdWlyZSgnZGVmaW5lLXByb3BlcnRpZXMnKTtcbnZhciBjYWxsQmluZCA9IHJlcXVpcmUoJ2NhbGwtYmluZCcpO1xuXG52YXIgaW1wbGVtZW50YXRpb24gPSByZXF1aXJlKCcuL2ltcGxlbWVudGF0aW9uJyk7XG52YXIgZ2V0UG9seWZpbGwgPSByZXF1aXJlKCcuL3BvbHlmaWxsJyk7XG52YXIgc2hpbSA9IHJlcXVpcmUoJy4vc2hpbScpO1xuXG52YXIgcG9seWZpbGwgPSBjYWxsQmluZChnZXRQb2x5ZmlsbCgpLCBPYmplY3QpO1xuXG5kZWZpbmUocG9seWZpbGwsIHtcblx0Z2V0UG9seWZpbGw6IGdldFBvbHlmaWxsLFxuXHRpbXBsZW1lbnRhdGlvbjogaW1wbGVtZW50YXRpb24sXG5cdHNoaW06IHNoaW1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBvbHlmaWxsO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgaW1wbGVtZW50YXRpb24gPSByZXF1aXJlKCcuL2ltcGxlbWVudGF0aW9uJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZ2V0UG9seWZpbGwoKSB7XG5cdHJldHVybiB0eXBlb2YgT2JqZWN0LmlzID09PSAnZnVuY3Rpb24nID8gT2JqZWN0LmlzIDogaW1wbGVtZW50YXRpb247XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgZ2V0UG9seWZpbGwgPSByZXF1aXJlKCcuL3BvbHlmaWxsJyk7XG52YXIgZGVmaW5lID0gcmVxdWlyZSgnZGVmaW5lLXByb3BlcnRpZXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBzaGltT2JqZWN0SXMoKSB7XG5cdHZhciBwb2x5ZmlsbCA9IGdldFBvbHlmaWxsKCk7XG5cdGRlZmluZShPYmplY3QsIHsgaXM6IHBvbHlmaWxsIH0sIHtcblx0XHRpczogZnVuY3Rpb24gdGVzdE9iamVjdElzKCkge1xuXHRcdFx0cmV0dXJuIE9iamVjdC5pcyAhPT0gcG9seWZpbGw7XG5cdFx0fVxuXHR9KTtcblx0cmV0dXJuIHBvbHlmaWxsO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGtleXNTaGltO1xuaWYgKCFPYmplY3Qua2V5cykge1xuXHQvLyBtb2RpZmllZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9lcy1zaGltcy9lczUtc2hpbVxuXHR2YXIgaGFzID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcblx0dmFyIHRvU3RyID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcblx0dmFyIGlzQXJncyA9IHJlcXVpcmUoJy4vaXNBcmd1bWVudHMnKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBnbG9iYWwtcmVxdWlyZVxuXHR2YXIgaXNFbnVtZXJhYmxlID0gT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZTtcblx0dmFyIGhhc0RvbnRFbnVtQnVnID0gIWlzRW51bWVyYWJsZS5jYWxsKHsgdG9TdHJpbmc6IG51bGwgfSwgJ3RvU3RyaW5nJyk7XG5cdHZhciBoYXNQcm90b0VudW1CdWcgPSBpc0VudW1lcmFibGUuY2FsbChmdW5jdGlvbiAoKSB7fSwgJ3Byb3RvdHlwZScpO1xuXHR2YXIgZG9udEVudW1zID0gW1xuXHRcdCd0b1N0cmluZycsXG5cdFx0J3RvTG9jYWxlU3RyaW5nJyxcblx0XHQndmFsdWVPZicsXG5cdFx0J2hhc093blByb3BlcnR5Jyxcblx0XHQnaXNQcm90b3R5cGVPZicsXG5cdFx0J3Byb3BlcnR5SXNFbnVtZXJhYmxlJyxcblx0XHQnY29uc3RydWN0b3InXG5cdF07XG5cdHZhciBlcXVhbHNDb25zdHJ1Y3RvclByb3RvdHlwZSA9IGZ1bmN0aW9uIChvKSB7XG5cdFx0dmFyIGN0b3IgPSBvLmNvbnN0cnVjdG9yO1xuXHRcdHJldHVybiBjdG9yICYmIGN0b3IucHJvdG90eXBlID09PSBvO1xuXHR9O1xuXHR2YXIgZXhjbHVkZWRLZXlzID0ge1xuXHRcdCRhcHBsaWNhdGlvbkNhY2hlOiB0cnVlLFxuXHRcdCRjb25zb2xlOiB0cnVlLFxuXHRcdCRleHRlcm5hbDogdHJ1ZSxcblx0XHQkZnJhbWU6IHRydWUsXG5cdFx0JGZyYW1lRWxlbWVudDogdHJ1ZSxcblx0XHQkZnJhbWVzOiB0cnVlLFxuXHRcdCRpbm5lckhlaWdodDogdHJ1ZSxcblx0XHQkaW5uZXJXaWR0aDogdHJ1ZSxcblx0XHQkb25tb3pmdWxsc2NyZWVuY2hhbmdlOiB0cnVlLFxuXHRcdCRvbm1vemZ1bGxzY3JlZW5lcnJvcjogdHJ1ZSxcblx0XHQkb3V0ZXJIZWlnaHQ6IHRydWUsXG5cdFx0JG91dGVyV2lkdGg6IHRydWUsXG5cdFx0JHBhZ2VYT2Zmc2V0OiB0cnVlLFxuXHRcdCRwYWdlWU9mZnNldDogdHJ1ZSxcblx0XHQkcGFyZW50OiB0cnVlLFxuXHRcdCRzY3JvbGxMZWZ0OiB0cnVlLFxuXHRcdCRzY3JvbGxUb3A6IHRydWUsXG5cdFx0JHNjcm9sbFg6IHRydWUsXG5cdFx0JHNjcm9sbFk6IHRydWUsXG5cdFx0JHNlbGY6IHRydWUsXG5cdFx0JHdlYmtpdEluZGV4ZWREQjogdHJ1ZSxcblx0XHQkd2Via2l0U3RvcmFnZUluZm86IHRydWUsXG5cdFx0JHdpbmRvdzogdHJ1ZVxuXHR9O1xuXHR2YXIgaGFzQXV0b21hdGlvbkVxdWFsaXR5QnVnID0gKGZ1bmN0aW9uICgpIHtcblx0XHQvKiBnbG9iYWwgd2luZG93ICovXG5cdFx0aWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSB7IHJldHVybiBmYWxzZTsgfVxuXHRcdGZvciAodmFyIGsgaW4gd2luZG93KSB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRpZiAoIWV4Y2x1ZGVkS2V5c1snJCcgKyBrXSAmJiBoYXMuY2FsbCh3aW5kb3csIGspICYmIHdpbmRvd1trXSAhPT0gbnVsbCAmJiB0eXBlb2Ygd2luZG93W2tdID09PSAnb2JqZWN0Jykge1xuXHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRlcXVhbHNDb25zdHJ1Y3RvclByb3RvdHlwZSh3aW5kb3dba10pO1xuXHRcdFx0XHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9KCkpO1xuXHR2YXIgZXF1YWxzQ29uc3RydWN0b3JQcm90b3R5cGVJZk5vdEJ1Z2d5ID0gZnVuY3Rpb24gKG8pIHtcblx0XHQvKiBnbG9iYWwgd2luZG93ICovXG5cdFx0aWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8ICFoYXNBdXRvbWF0aW9uRXF1YWxpdHlCdWcpIHtcblx0XHRcdHJldHVybiBlcXVhbHNDb25zdHJ1Y3RvclByb3RvdHlwZShvKTtcblx0XHR9XG5cdFx0dHJ5IHtcblx0XHRcdHJldHVybiBlcXVhbHNDb25zdHJ1Y3RvclByb3RvdHlwZShvKTtcblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHR9O1xuXG5cdGtleXNTaGltID0gZnVuY3Rpb24ga2V5cyhvYmplY3QpIHtcblx0XHR2YXIgaXNPYmplY3QgPSBvYmplY3QgIT09IG51bGwgJiYgdHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCc7XG5cdFx0dmFyIGlzRnVuY3Rpb24gPSB0b1N0ci5jYWxsKG9iamVjdCkgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXSc7XG5cdFx0dmFyIGlzQXJndW1lbnRzID0gaXNBcmdzKG9iamVjdCk7XG5cdFx0dmFyIGlzU3RyaW5nID0gaXNPYmplY3QgJiYgdG9TdHIuY2FsbChvYmplY3QpID09PSAnW29iamVjdCBTdHJpbmddJztcblx0XHR2YXIgdGhlS2V5cyA9IFtdO1xuXG5cdFx0aWYgKCFpc09iamVjdCAmJiAhaXNGdW5jdGlvbiAmJiAhaXNBcmd1bWVudHMpIHtcblx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ09iamVjdC5rZXlzIGNhbGxlZCBvbiBhIG5vbi1vYmplY3QnKTtcblx0XHR9XG5cblx0XHR2YXIgc2tpcFByb3RvID0gaGFzUHJvdG9FbnVtQnVnICYmIGlzRnVuY3Rpb247XG5cdFx0aWYgKGlzU3RyaW5nICYmIG9iamVjdC5sZW5ndGggPiAwICYmICFoYXMuY2FsbChvYmplY3QsIDApKSB7XG5cdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IG9iamVjdC5sZW5ndGg7ICsraSkge1xuXHRcdFx0XHR0aGVLZXlzLnB1c2goU3RyaW5nKGkpKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoaXNBcmd1bWVudHMgJiYgb2JqZWN0Lmxlbmd0aCA+IDApIHtcblx0XHRcdGZvciAodmFyIGogPSAwOyBqIDwgb2JqZWN0Lmxlbmd0aDsgKytqKSB7XG5cdFx0XHRcdHRoZUtleXMucHVzaChTdHJpbmcoaikpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRmb3IgKHZhciBuYW1lIGluIG9iamVjdCkge1xuXHRcdFx0XHRpZiAoIShza2lwUHJvdG8gJiYgbmFtZSA9PT0gJ3Byb3RvdHlwZScpICYmIGhhcy5jYWxsKG9iamVjdCwgbmFtZSkpIHtcblx0XHRcdFx0XHR0aGVLZXlzLnB1c2goU3RyaW5nKG5hbWUpKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChoYXNEb250RW51bUJ1Zykge1xuXHRcdFx0dmFyIHNraXBDb25zdHJ1Y3RvciA9IGVxdWFsc0NvbnN0cnVjdG9yUHJvdG90eXBlSWZOb3RCdWdneShvYmplY3QpO1xuXG5cdFx0XHRmb3IgKHZhciBrID0gMDsgayA8IGRvbnRFbnVtcy5sZW5ndGg7ICsraykge1xuXHRcdFx0XHRpZiAoIShza2lwQ29uc3RydWN0b3IgJiYgZG9udEVudW1zW2tdID09PSAnY29uc3RydWN0b3InKSAmJiBoYXMuY2FsbChvYmplY3QsIGRvbnRFbnVtc1trXSkpIHtcblx0XHRcdFx0XHR0aGVLZXlzLnB1c2goZG9udEVudW1zW2tdKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gdGhlS2V5cztcblx0fTtcbn1cbm1vZHVsZS5leHBvcnRzID0ga2V5c1NoaW07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBzbGljZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZTtcbnZhciBpc0FyZ3MgPSByZXF1aXJlKCcuL2lzQXJndW1lbnRzJyk7XG5cbnZhciBvcmlnS2V5cyA9IE9iamVjdC5rZXlzO1xudmFyIGtleXNTaGltID0gb3JpZ0tleXMgPyBmdW5jdGlvbiBrZXlzKG8pIHsgcmV0dXJuIG9yaWdLZXlzKG8pOyB9IDogcmVxdWlyZSgnLi9pbXBsZW1lbnRhdGlvbicpO1xuXG52YXIgb3JpZ2luYWxLZXlzID0gT2JqZWN0LmtleXM7XG5cbmtleXNTaGltLnNoaW0gPSBmdW5jdGlvbiBzaGltT2JqZWN0S2V5cygpIHtcblx0aWYgKE9iamVjdC5rZXlzKSB7XG5cdFx0dmFyIGtleXNXb3Jrc1dpdGhBcmd1bWVudHMgPSAoZnVuY3Rpb24gKCkge1xuXHRcdFx0Ly8gU2FmYXJpIDUuMCBidWdcblx0XHRcdHZhciBhcmdzID0gT2JqZWN0LmtleXMoYXJndW1lbnRzKTtcblx0XHRcdHJldHVybiBhcmdzICYmIGFyZ3MubGVuZ3RoID09PSBhcmd1bWVudHMubGVuZ3RoO1xuXHRcdH0oMSwgMikpO1xuXHRcdGlmICgha2V5c1dvcmtzV2l0aEFyZ3VtZW50cykge1xuXHRcdFx0T2JqZWN0LmtleXMgPSBmdW5jdGlvbiBrZXlzKG9iamVjdCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGZ1bmMtbmFtZS1tYXRjaGluZ1xuXHRcdFx0XHRpZiAoaXNBcmdzKG9iamVjdCkpIHtcblx0XHRcdFx0XHRyZXR1cm4gb3JpZ2luYWxLZXlzKHNsaWNlLmNhbGwob2JqZWN0KSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIG9yaWdpbmFsS2V5cyhvYmplY3QpO1xuXHRcdFx0fTtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0T2JqZWN0LmtleXMgPSBrZXlzU2hpbTtcblx0fVxuXHRyZXR1cm4gT2JqZWN0LmtleXMgfHwga2V5c1NoaW07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGtleXNTaGltO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdG9TdHIgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzQXJndW1lbnRzKHZhbHVlKSB7XG5cdHZhciBzdHIgPSB0b1N0ci5jYWxsKHZhbHVlKTtcblx0dmFyIGlzQXJncyA9IHN0ciA9PT0gJ1tvYmplY3QgQXJndW1lbnRzXSc7XG5cdGlmICghaXNBcmdzKSB7XG5cdFx0aXNBcmdzID0gc3RyICE9PSAnW29iamVjdCBBcnJheV0nICYmXG5cdFx0XHR2YWx1ZSAhPT0gbnVsbCAmJlxuXHRcdFx0dHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxuXHRcdFx0dHlwZW9mIHZhbHVlLmxlbmd0aCA9PT0gJ251bWJlcicgJiZcblx0XHRcdHZhbHVlLmxlbmd0aCA+PSAwICYmXG5cdFx0XHR0b1N0ci5jYWxsKHZhbHVlLmNhbGxlZSkgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXSc7XG5cdH1cblx0cmV0dXJuIGlzQXJncztcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbi8vIG1vZGlmaWVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2VzLXNoaW1zL2VzNi1zaGltXG52YXIgb2JqZWN0S2V5cyA9IHJlcXVpcmUoJ29iamVjdC1rZXlzJyk7XG52YXIgaGFzU3ltYm9scyA9IHJlcXVpcmUoJ2hhcy1zeW1ib2xzL3NoYW1zJykoKTtcbnZhciBjYWxsQm91bmQgPSByZXF1aXJlKCdjYWxsLWJpbmQvY2FsbEJvdW5kJyk7XG52YXIgdG9PYmplY3QgPSBPYmplY3Q7XG52YXIgJHB1c2ggPSBjYWxsQm91bmQoJ0FycmF5LnByb3RvdHlwZS5wdXNoJyk7XG52YXIgJHByb3BJc0VudW1lcmFibGUgPSBjYWxsQm91bmQoJ09iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUnKTtcbnZhciBvcmlnaW5hbEdldFN5bWJvbHMgPSBoYXNTeW1ib2xzID8gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA6IG51bGw7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBhc3NpZ24odGFyZ2V0LCBzb3VyY2UxKSB7XG5cdGlmICh0YXJnZXQgPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCd0YXJnZXQgbXVzdCBiZSBhbiBvYmplY3QnKTsgfVxuXHR2YXIgdG8gPSB0b09iamVjdCh0YXJnZXQpOyAvLyBzdGVwIDFcblx0aWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHtcblx0XHRyZXR1cm4gdG87IC8vIHN0ZXAgMlxuXHR9XG5cdGZvciAodmFyIHMgPSAxOyBzIDwgYXJndW1lbnRzLmxlbmd0aDsgKytzKSB7XG5cdFx0dmFyIGZyb20gPSB0b09iamVjdChhcmd1bWVudHNbc10pOyAvLyBzdGVwIDMuYS5pXG5cblx0XHQvLyBzdGVwIDMuYS5paTpcblx0XHR2YXIga2V5cyA9IG9iamVjdEtleXMoZnJvbSk7XG5cdFx0dmFyIGdldFN5bWJvbHMgPSBoYXNTeW1ib2xzICYmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzIHx8IG9yaWdpbmFsR2V0U3ltYm9scyk7XG5cdFx0aWYgKGdldFN5bWJvbHMpIHtcblx0XHRcdHZhciBzeW1zID0gZ2V0U3ltYm9scyhmcm9tKTtcblx0XHRcdGZvciAodmFyIGogPSAwOyBqIDwgc3ltcy5sZW5ndGg7ICsraikge1xuXHRcdFx0XHR2YXIga2V5ID0gc3ltc1tqXTtcblx0XHRcdFx0aWYgKCRwcm9wSXNFbnVtZXJhYmxlKGZyb20sIGtleSkpIHtcblx0XHRcdFx0XHQkcHVzaChrZXlzLCBrZXkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gc3RlcCAzLmEuaWlpOlxuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7ICsraSkge1xuXHRcdFx0dmFyIG5leHRLZXkgPSBrZXlzW2ldO1xuXHRcdFx0aWYgKCRwcm9wSXNFbnVtZXJhYmxlKGZyb20sIG5leHRLZXkpKSB7IC8vIHN0ZXAgMy5hLmlpaS4yXG5cdFx0XHRcdHZhciBwcm9wVmFsdWUgPSBmcm9tW25leHRLZXldOyAvLyBzdGVwIDMuYS5paWkuMi5hXG5cdFx0XHRcdHRvW25leHRLZXldID0gcHJvcFZhbHVlOyAvLyBzdGVwIDMuYS5paWkuMi5iXG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHRvOyAvLyBzdGVwIDRcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBkZWZpbmVQcm9wZXJ0aWVzID0gcmVxdWlyZSgnZGVmaW5lLXByb3BlcnRpZXMnKTtcbnZhciBjYWxsQmluZCA9IHJlcXVpcmUoJ2NhbGwtYmluZCcpO1xuXG52YXIgaW1wbGVtZW50YXRpb24gPSByZXF1aXJlKCcuL2ltcGxlbWVudGF0aW9uJyk7XG52YXIgZ2V0UG9seWZpbGwgPSByZXF1aXJlKCcuL3BvbHlmaWxsJyk7XG52YXIgc2hpbSA9IHJlcXVpcmUoJy4vc2hpbScpO1xuXG52YXIgcG9seWZpbGwgPSBjYWxsQmluZC5hcHBseShnZXRQb2x5ZmlsbCgpKTtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xudmFyIGJvdW5kID0gZnVuY3Rpb24gYXNzaWduKHRhcmdldCwgc291cmNlMSkge1xuXHRyZXR1cm4gcG9seWZpbGwoT2JqZWN0LCBhcmd1bWVudHMpO1xufTtcblxuZGVmaW5lUHJvcGVydGllcyhib3VuZCwge1xuXHRnZXRQb2x5ZmlsbDogZ2V0UG9seWZpbGwsXG5cdGltcGxlbWVudGF0aW9uOiBpbXBsZW1lbnRhdGlvbixcblx0c2hpbTogc2hpbVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gYm91bmQ7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBpbXBsZW1lbnRhdGlvbiA9IHJlcXVpcmUoJy4vaW1wbGVtZW50YXRpb24nKTtcblxudmFyIGxhY2tzUHJvcGVyRW51bWVyYXRpb25PcmRlciA9IGZ1bmN0aW9uICgpIHtcblx0aWYgKCFPYmplY3QuYXNzaWduKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cdC8qXG5cdCAqIHY4LCBzcGVjaWZpY2FsbHkgaW4gbm9kZSA0LngsIGhhcyBhIGJ1ZyB3aXRoIGluY29ycmVjdCBwcm9wZXJ0eSBlbnVtZXJhdGlvbiBvcmRlclxuXHQgKiBub3RlOiB0aGlzIGRvZXMgbm90IGRldGVjdCB0aGUgYnVnIHVubGVzcyB0aGVyZSdzIDIwIGNoYXJhY3RlcnNcblx0ICovXG5cdHZhciBzdHIgPSAnYWJjZGVmZ2hpamtsbW5vcHFyc3QnO1xuXHR2YXIgbGV0dGVycyA9IHN0ci5zcGxpdCgnJyk7XG5cdHZhciBtYXAgPSB7fTtcblx0Zm9yICh2YXIgaSA9IDA7IGkgPCBsZXR0ZXJzLmxlbmd0aDsgKytpKSB7XG5cdFx0bWFwW2xldHRlcnNbaV1dID0gbGV0dGVyc1tpXTtcblx0fVxuXHR2YXIgb2JqID0gT2JqZWN0LmFzc2lnbih7fSwgbWFwKTtcblx0dmFyIGFjdHVhbCA9ICcnO1xuXHRmb3IgKHZhciBrIGluIG9iaikge1xuXHRcdGFjdHVhbCArPSBrO1xuXHR9XG5cdHJldHVybiBzdHIgIT09IGFjdHVhbDtcbn07XG5cbnZhciBhc3NpZ25IYXNQZW5kaW5nRXhjZXB0aW9ucyA9IGZ1bmN0aW9uICgpIHtcblx0aWYgKCFPYmplY3QuYXNzaWduIHx8ICFPYmplY3QucHJldmVudEV4dGVuc2lvbnMpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0Lypcblx0ICogRmlyZWZveCAzNyBzdGlsbCBoYXMgXCJwZW5kaW5nIGV4Y2VwdGlvblwiIGxvZ2ljIGluIGl0cyBPYmplY3QuYXNzaWduIGltcGxlbWVudGF0aW9uLFxuXHQgKiB3aGljaCBpcyA3MiUgc2xvd2VyIHRoYW4gb3VyIHNoaW0sIGFuZCBGaXJlZm94IDQwJ3MgbmF0aXZlIGltcGxlbWVudGF0aW9uLlxuXHQgKi9cblx0dmFyIHRocm93ZXIgPSBPYmplY3QucHJldmVudEV4dGVuc2lvbnMoeyAxOiAyIH0pO1xuXHR0cnkge1xuXHRcdE9iamVjdC5hc3NpZ24odGhyb3dlciwgJ3h5Jyk7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHRyZXR1cm4gdGhyb3dlclsxXSA9PT0gJ3knO1xuXHR9XG5cdHJldHVybiBmYWxzZTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZ2V0UG9seWZpbGwoKSB7XG5cdGlmICghT2JqZWN0LmFzc2lnbikge1xuXHRcdHJldHVybiBpbXBsZW1lbnRhdGlvbjtcblx0fVxuXHRpZiAobGFja3NQcm9wZXJFbnVtZXJhdGlvbk9yZGVyKCkpIHtcblx0XHRyZXR1cm4gaW1wbGVtZW50YXRpb247XG5cdH1cblx0aWYgKGFzc2lnbkhhc1BlbmRpbmdFeGNlcHRpb25zKCkpIHtcblx0XHRyZXR1cm4gaW1wbGVtZW50YXRpb247XG5cdH1cblx0cmV0dXJuIE9iamVjdC5hc3NpZ247XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgZGVmaW5lID0gcmVxdWlyZSgnZGVmaW5lLXByb3BlcnRpZXMnKTtcbnZhciBnZXRQb2x5ZmlsbCA9IHJlcXVpcmUoJy4vcG9seWZpbGwnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBzaGltQXNzaWduKCkge1xuXHR2YXIgcG9seWZpbGwgPSBnZXRQb2x5ZmlsbCgpO1xuXHRkZWZpbmUoXG5cdFx0T2JqZWN0LFxuXHRcdHsgYXNzaWduOiBwb2x5ZmlsbCB9LFxuXHRcdHsgYXNzaWduOiBmdW5jdGlvbiAoKSB7IHJldHVybiBPYmplY3QuYXNzaWduICE9PSBwb2x5ZmlsbDsgfSB9XG5cdCk7XG5cdHJldHVybiBwb2x5ZmlsbDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBmdW5jdGlvbnNIYXZlQ29uZmlndXJhYmxlTmFtZXMgPSByZXF1aXJlKCdmdW5jdGlvbnMtaGF2ZS1uYW1lcycpLmZ1bmN0aW9uc0hhdmVDb25maWd1cmFibGVOYW1lcygpO1xuXG52YXIgJE9iamVjdCA9IE9iamVjdDtcbnZhciAkVHlwZUVycm9yID0gVHlwZUVycm9yO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGZsYWdzKCkge1xuXHRpZiAodGhpcyAhPSBudWxsICYmIHRoaXMgIT09ICRPYmplY3QodGhpcykpIHtcblx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignUmVnRXhwLnByb3RvdHlwZS5mbGFncyBnZXR0ZXIgY2FsbGVkIG9uIG5vbi1vYmplY3QnKTtcblx0fVxuXHR2YXIgcmVzdWx0ID0gJyc7XG5cdGlmICh0aGlzLmhhc0luZGljZXMpIHtcblx0XHRyZXN1bHQgKz0gJ2QnO1xuXHR9XG5cdGlmICh0aGlzLmdsb2JhbCkge1xuXHRcdHJlc3VsdCArPSAnZyc7XG5cdH1cblx0aWYgKHRoaXMuaWdub3JlQ2FzZSkge1xuXHRcdHJlc3VsdCArPSAnaSc7XG5cdH1cblx0aWYgKHRoaXMubXVsdGlsaW5lKSB7XG5cdFx0cmVzdWx0ICs9ICdtJztcblx0fVxuXHRpZiAodGhpcy5kb3RBbGwpIHtcblx0XHRyZXN1bHQgKz0gJ3MnO1xuXHR9XG5cdGlmICh0aGlzLnVuaWNvZGUpIHtcblx0XHRyZXN1bHQgKz0gJ3UnO1xuXHR9XG5cdGlmICh0aGlzLnN0aWNreSkge1xuXHRcdHJlc3VsdCArPSAneSc7XG5cdH1cblx0cmV0dXJuIHJlc3VsdDtcbn07XG5cbmlmIChmdW5jdGlvbnNIYXZlQ29uZmlndXJhYmxlTmFtZXMgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KSB7XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtb2R1bGUuZXhwb3J0cywgJ25hbWUnLCB7IHZhbHVlOiAnZ2V0IGZsYWdzJyB9KTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGRlZmluZSA9IHJlcXVpcmUoJ2RlZmluZS1wcm9wZXJ0aWVzJyk7XG52YXIgY2FsbEJpbmQgPSByZXF1aXJlKCdjYWxsLWJpbmQnKTtcblxudmFyIGltcGxlbWVudGF0aW9uID0gcmVxdWlyZSgnLi9pbXBsZW1lbnRhdGlvbicpO1xudmFyIGdldFBvbHlmaWxsID0gcmVxdWlyZSgnLi9wb2x5ZmlsbCcpO1xudmFyIHNoaW0gPSByZXF1aXJlKCcuL3NoaW0nKTtcblxudmFyIGZsYWdzQm91bmQgPSBjYWxsQmluZChnZXRQb2x5ZmlsbCgpKTtcblxuZGVmaW5lKGZsYWdzQm91bmQsIHtcblx0Z2V0UG9seWZpbGw6IGdldFBvbHlmaWxsLFxuXHRpbXBsZW1lbnRhdGlvbjogaW1wbGVtZW50YXRpb24sXG5cdHNoaW06IHNoaW1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZsYWdzQm91bmQ7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBpbXBsZW1lbnRhdGlvbiA9IHJlcXVpcmUoJy4vaW1wbGVtZW50YXRpb24nKTtcblxudmFyIHN1cHBvcnRzRGVzY3JpcHRvcnMgPSByZXF1aXJlKCdkZWZpbmUtcHJvcGVydGllcycpLnN1cHBvcnRzRGVzY3JpcHRvcnM7XG52YXIgJGdPUEQgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGdldFBvbHlmaWxsKCkge1xuXHRpZiAoc3VwcG9ydHNEZXNjcmlwdG9ycyAmJiAoL2EvbWlnKS5mbGFncyA9PT0gJ2dpbScpIHtcblx0XHR2YXIgZGVzY3JpcHRvciA9ICRnT1BEKFJlZ0V4cC5wcm90b3R5cGUsICdmbGFncycpO1xuXHRcdGlmIChcblx0XHRcdGRlc2NyaXB0b3Jcblx0XHRcdCYmIHR5cGVvZiBkZXNjcmlwdG9yLmdldCA9PT0gJ2Z1bmN0aW9uJ1xuXHRcdFx0JiYgdHlwZW9mIFJlZ0V4cC5wcm90b3R5cGUuZG90QWxsID09PSAnYm9vbGVhbidcblx0XHRcdCYmIHR5cGVvZiBSZWdFeHAucHJvdG90eXBlLmhhc0luZGljZXMgPT09ICdib29sZWFuJ1xuXHRcdCkge1xuXHRcdFx0LyogZXNsaW50IGdldHRlci1yZXR1cm46IDAgKi9cblx0XHRcdHZhciBjYWxscyA9ICcnO1xuXHRcdFx0dmFyIG8gPSB7fTtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCAnaGFzSW5kaWNlcycsIHtcblx0XHRcdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0Y2FsbHMgKz0gJ2QnO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCAnc3RpY2t5Jywge1xuXHRcdFx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRjYWxscyArPSAneSc7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdFx0aWYgKGNhbGxzID09PSAnZHknKSB7XG5cdFx0XHRcdHJldHVybiBkZXNjcmlwdG9yLmdldDtcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0cmV0dXJuIGltcGxlbWVudGF0aW9uO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHN1cHBvcnRzRGVzY3JpcHRvcnMgPSByZXF1aXJlKCdkZWZpbmUtcHJvcGVydGllcycpLnN1cHBvcnRzRGVzY3JpcHRvcnM7XG52YXIgZ2V0UG9seWZpbGwgPSByZXF1aXJlKCcuL3BvbHlmaWxsJyk7XG52YXIgZ09QRCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG52YXIgZGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG52YXIgVHlwZUVyciA9IFR5cGVFcnJvcjtcbnZhciBnZXRQcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZjtcbnZhciByZWdleCA9IC9hLztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBzaGltRmxhZ3MoKSB7XG5cdGlmICghc3VwcG9ydHNEZXNjcmlwdG9ycyB8fCAhZ2V0UHJvdG8pIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycignUmVnRXhwLnByb3RvdHlwZS5mbGFncyByZXF1aXJlcyBhIHRydWUgRVM1IGVudmlyb25tZW50IHRoYXQgc3VwcG9ydHMgcHJvcGVydHkgZGVzY3JpcHRvcnMnKTtcblx0fVxuXHR2YXIgcG9seWZpbGwgPSBnZXRQb2x5ZmlsbCgpO1xuXHR2YXIgcHJvdG8gPSBnZXRQcm90byhyZWdleCk7XG5cdHZhciBkZXNjcmlwdG9yID0gZ09QRChwcm90bywgJ2ZsYWdzJyk7XG5cdGlmICghZGVzY3JpcHRvciB8fCBkZXNjcmlwdG9yLmdldCAhPT0gcG9seWZpbGwpIHtcblx0XHRkZWZpbmVQcm9wZXJ0eShwcm90bywgJ2ZsYWdzJywge1xuXHRcdFx0Y29uZmlndXJhYmxlOiB0cnVlLFxuXHRcdFx0ZW51bWVyYWJsZTogZmFsc2UsXG5cdFx0XHRnZXQ6IHBvbHlmaWxsXG5cdFx0fSk7XG5cdH1cblx0cmV0dXJuIHBvbHlmaWxsO1xufTtcbiIsIihmdW5jdGlvbiAocHJvY2Vzcyl7XG52YXIgdGhyb3VnaCA9IHJlcXVpcmUoJ3Rocm91Z2gnKTtcbnZhciBuZXh0VGljayA9IHR5cGVvZiBzZXRJbW1lZGlhdGUgIT09ICd1bmRlZmluZWQnXG4gICAgPyBzZXRJbW1lZGlhdGVcbiAgICA6IHByb2Nlc3MubmV4dFRpY2tcbjtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAod3JpdGUsIGVuZCkge1xuICAgIHZhciB0ciA9IHRocm91Z2god3JpdGUsIGVuZCk7XG4gICAgdHIucGF1c2UoKTtcbiAgICB2YXIgcmVzdW1lID0gdHIucmVzdW1lO1xuICAgIHZhciBwYXVzZSA9IHRyLnBhdXNlO1xuICAgIHZhciBwYXVzZWQgPSBmYWxzZTtcbiAgICBcbiAgICB0ci5wYXVzZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcGF1c2VkID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHBhdXNlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfTtcbiAgICBcbiAgICB0ci5yZXN1bWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHBhdXNlZCA9IGZhbHNlO1xuICAgICAgICByZXR1cm4gcmVzdW1lLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfTtcbiAgICBcbiAgICBuZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghcGF1c2VkKSB0ci5yZXN1bWUoKTtcbiAgICB9KTtcbiAgICBcbiAgICByZXR1cm4gdHI7XG59O1xuXG59KS5jYWxsKHRoaXMscmVxdWlyZShcIktsaXViSFwiKSkiLCIndXNlIHN0cmljdCc7XG5cbnZhciBHZXRJbnRyaW5zaWMgPSByZXF1aXJlKCdnZXQtaW50cmluc2ljJyk7XG52YXIgY2FsbEJvdW5kID0gcmVxdWlyZSgnY2FsbC1iaW5kL2NhbGxCb3VuZCcpO1xudmFyIGluc3BlY3QgPSByZXF1aXJlKCdvYmplY3QtaW5zcGVjdCcpO1xuXG52YXIgJFR5cGVFcnJvciA9IEdldEludHJpbnNpYygnJVR5cGVFcnJvciUnKTtcbnZhciAkV2Vha01hcCA9IEdldEludHJpbnNpYygnJVdlYWtNYXAlJywgdHJ1ZSk7XG52YXIgJE1hcCA9IEdldEludHJpbnNpYygnJU1hcCUnLCB0cnVlKTtcblxudmFyICR3ZWFrTWFwR2V0ID0gY2FsbEJvdW5kKCdXZWFrTWFwLnByb3RvdHlwZS5nZXQnLCB0cnVlKTtcbnZhciAkd2Vha01hcFNldCA9IGNhbGxCb3VuZCgnV2Vha01hcC5wcm90b3R5cGUuc2V0JywgdHJ1ZSk7XG52YXIgJHdlYWtNYXBIYXMgPSBjYWxsQm91bmQoJ1dlYWtNYXAucHJvdG90eXBlLmhhcycsIHRydWUpO1xudmFyICRtYXBHZXQgPSBjYWxsQm91bmQoJ01hcC5wcm90b3R5cGUuZ2V0JywgdHJ1ZSk7XG52YXIgJG1hcFNldCA9IGNhbGxCb3VuZCgnTWFwLnByb3RvdHlwZS5zZXQnLCB0cnVlKTtcbnZhciAkbWFwSGFzID0gY2FsbEJvdW5kKCdNYXAucHJvdG90eXBlLmhhcycsIHRydWUpO1xuXG4vKlxuICogVGhpcyBmdW5jdGlvbiB0cmF2ZXJzZXMgdGhlIGxpc3QgcmV0dXJuaW5nIHRoZSBub2RlIGNvcnJlc3BvbmRpbmcgdG8gdGhlXG4gKiBnaXZlbiBrZXkuXG4gKlxuICogVGhhdCBub2RlIGlzIGFsc28gbW92ZWQgdG8gdGhlIGhlYWQgb2YgdGhlIGxpc3QsIHNvIHRoYXQgaWYgaXQncyBhY2Nlc3NlZFxuICogYWdhaW4gd2UgZG9uJ3QgbmVlZCB0byB0cmF2ZXJzZSB0aGUgd2hvbGUgbGlzdC4gQnkgZG9pbmcgc28sIGFsbCB0aGUgcmVjZW50bHlcbiAqIHVzZWQgbm9kZXMgY2FuIGJlIGFjY2Vzc2VkIHJlbGF0aXZlbHkgcXVpY2tseS5cbiAqL1xudmFyIGxpc3RHZXROb2RlID0gZnVuY3Rpb24gKGxpc3QsIGtleSkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGNvbnNpc3RlbnQtcmV0dXJuXG5cdGZvciAodmFyIHByZXYgPSBsaXN0LCBjdXJyOyAoY3VyciA9IHByZXYubmV4dCkgIT09IG51bGw7IHByZXYgPSBjdXJyKSB7XG5cdFx0aWYgKGN1cnIua2V5ID09PSBrZXkpIHtcblx0XHRcdHByZXYubmV4dCA9IGN1cnIubmV4dDtcblx0XHRcdGN1cnIubmV4dCA9IGxpc3QubmV4dDtcblx0XHRcdGxpc3QubmV4dCA9IGN1cnI7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cblx0XHRcdHJldHVybiBjdXJyO1xuXHRcdH1cblx0fVxufTtcblxudmFyIGxpc3RHZXQgPSBmdW5jdGlvbiAob2JqZWN0cywga2V5KSB7XG5cdHZhciBub2RlID0gbGlzdEdldE5vZGUob2JqZWN0cywga2V5KTtcblx0cmV0dXJuIG5vZGUgJiYgbm9kZS52YWx1ZTtcbn07XG52YXIgbGlzdFNldCA9IGZ1bmN0aW9uIChvYmplY3RzLCBrZXksIHZhbHVlKSB7XG5cdHZhciBub2RlID0gbGlzdEdldE5vZGUob2JqZWN0cywga2V5KTtcblx0aWYgKG5vZGUpIHtcblx0XHRub2RlLnZhbHVlID0gdmFsdWU7XG5cdH0gZWxzZSB7XG5cdFx0Ly8gUHJlcGVuZCB0aGUgbmV3IG5vZGUgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGlzdFxuXHRcdG9iamVjdHMubmV4dCA9IHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuXHRcdFx0a2V5OiBrZXksXG5cdFx0XHRuZXh0OiBvYmplY3RzLm5leHQsXG5cdFx0XHR2YWx1ZTogdmFsdWVcblx0XHR9O1xuXHR9XG59O1xudmFyIGxpc3RIYXMgPSBmdW5jdGlvbiAob2JqZWN0cywga2V5KSB7XG5cdHJldHVybiAhIWxpc3RHZXROb2RlKG9iamVjdHMsIGtleSk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGdldFNpZGVDaGFubmVsKCkge1xuXHR2YXIgJHdtO1xuXHR2YXIgJG07XG5cdHZhciAkbztcblx0dmFyIGNoYW5uZWwgPSB7XG5cdFx0YXNzZXJ0OiBmdW5jdGlvbiAoa2V5KSB7XG5cdFx0XHRpZiAoIWNoYW5uZWwuaGFzKGtleSkpIHtcblx0XHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ1NpZGUgY2hhbm5lbCBkb2VzIG5vdCBjb250YWluICcgKyBpbnNwZWN0KGtleSkpO1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0Z2V0OiBmdW5jdGlvbiAoa2V5KSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgY29uc2lzdGVudC1yZXR1cm5cblx0XHRcdGlmICgkV2Vha01hcCAmJiBrZXkgJiYgKHR5cGVvZiBrZXkgPT09ICdvYmplY3QnIHx8IHR5cGVvZiBrZXkgPT09ICdmdW5jdGlvbicpKSB7XG5cdFx0XHRcdGlmICgkd20pIHtcblx0XHRcdFx0XHRyZXR1cm4gJHdlYWtNYXBHZXQoJHdtLCBrZXkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKCRNYXApIHtcblx0XHRcdFx0aWYgKCRtKSB7XG5cdFx0XHRcdFx0cmV0dXJuICRtYXBHZXQoJG0sIGtleSk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGlmICgkbykgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWxvbmVseS1pZlxuXHRcdFx0XHRcdHJldHVybiBsaXN0R2V0KCRvLCBrZXkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRoYXM6IGZ1bmN0aW9uIChrZXkpIHtcblx0XHRcdGlmICgkV2Vha01hcCAmJiBrZXkgJiYgKHR5cGVvZiBrZXkgPT09ICdvYmplY3QnIHx8IHR5cGVvZiBrZXkgPT09ICdmdW5jdGlvbicpKSB7XG5cdFx0XHRcdGlmICgkd20pIHtcblx0XHRcdFx0XHRyZXR1cm4gJHdlYWtNYXBIYXMoJHdtLCBrZXkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKCRNYXApIHtcblx0XHRcdFx0aWYgKCRtKSB7XG5cdFx0XHRcdFx0cmV0dXJuICRtYXBIYXMoJG0sIGtleSk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGlmICgkbykgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWxvbmVseS1pZlxuXHRcdFx0XHRcdHJldHVybiBsaXN0SGFzKCRvLCBrZXkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG5cdFx0XHRpZiAoJFdlYWtNYXAgJiYga2V5ICYmICh0eXBlb2Yga2V5ID09PSAnb2JqZWN0JyB8fCB0eXBlb2Yga2V5ID09PSAnZnVuY3Rpb24nKSkge1xuXHRcdFx0XHRpZiAoISR3bSkge1xuXHRcdFx0XHRcdCR3bSA9IG5ldyAkV2Vha01hcCgpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdCR3ZWFrTWFwU2V0KCR3bSwga2V5LCB2YWx1ZSk7XG5cdFx0XHR9IGVsc2UgaWYgKCRNYXApIHtcblx0XHRcdFx0aWYgKCEkbSkge1xuXHRcdFx0XHRcdCRtID0gbmV3ICRNYXAoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHQkbWFwU2V0KCRtLCBrZXksIHZhbHVlKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGlmICghJG8pIHtcblx0XHRcdFx0XHQvKlxuXHRcdFx0XHRcdCAqIEluaXRpYWxpemUgdGhlIGxpbmtlZCBsaXN0IGFzIGFuIGVtcHR5IG5vZGUsIHNvIHRoYXQgd2UgZG9uJ3QgaGF2ZVxuXHRcdFx0XHRcdCAqIHRvIHNwZWNpYWwtY2FzZSBoYW5kbGluZyBvZiB0aGUgZmlyc3Qgbm9kZTogd2UgY2FuIGFsd2F5cyByZWZlciB0b1xuXHRcdFx0XHRcdCAqIGl0IGFzIChwcmV2aW91cyBub2RlKS5uZXh0LCBpbnN0ZWFkIG9mIHNvbWV0aGluZyBsaWtlIChsaXN0KS5oZWFkXG5cdFx0XHRcdFx0ICovXG5cdFx0XHRcdFx0JG8gPSB7IGtleToge30sIG5leHQ6IG51bGwgfTtcblx0XHRcdFx0fVxuXHRcdFx0XHRsaXN0U2V0KCRvLCBrZXksIHZhbHVlKTtcblx0XHRcdH1cblx0XHR9XG5cdH07XG5cdHJldHVybiBjaGFubmVsO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIFJlcXVpcmVPYmplY3RDb2VyY2libGUgPSByZXF1aXJlKCdlcy1hYnN0cmFjdC8yMDIxL1JlcXVpcmVPYmplY3RDb2VyY2libGUnKTtcbnZhciBUb1N0cmluZyA9IHJlcXVpcmUoJ2VzLWFic3RyYWN0LzIwMjEvVG9TdHJpbmcnKTtcbnZhciBjYWxsQm91bmQgPSByZXF1aXJlKCdjYWxsLWJpbmQvY2FsbEJvdW5kJyk7XG52YXIgJHJlcGxhY2UgPSBjYWxsQm91bmQoJ1N0cmluZy5wcm90b3R5cGUucmVwbGFjZScpO1xuXG52YXIgbXZzSXNXUyA9ICgvXlxccyQvKS50ZXN0KCdcXHUxODBFJyk7XG4vKiBlc2xpbnQtZGlzYWJsZSBuby1jb250cm9sLXJlZ2V4ICovXG52YXIgbGVmdFdoaXRlc3BhY2UgPSBtdnNJc1dTXG5cdD8gL15bXFx4MDlcXHgwQVxceDBCXFx4MENcXHgwRFxceDIwXFx4QTBcXHUxNjgwXFx1MTgwRVxcdTIwMDBcXHUyMDAxXFx1MjAwMlxcdTIwMDNcXHUyMDA0XFx1MjAwNVxcdTIwMDZcXHUyMDA3XFx1MjAwOFxcdTIwMDlcXHUyMDBBXFx1MjAyRlxcdTIwNUZcXHUzMDAwXFx1MjAyOFxcdTIwMjlcXHVGRUZGXSsvXG5cdDogL15bXFx4MDlcXHgwQVxceDBCXFx4MENcXHgwRFxceDIwXFx4QTBcXHUxNjgwXFx1MjAwMFxcdTIwMDFcXHUyMDAyXFx1MjAwM1xcdTIwMDRcXHUyMDA1XFx1MjAwNlxcdTIwMDdcXHUyMDA4XFx1MjAwOVxcdTIwMEFcXHUyMDJGXFx1MjA1RlxcdTMwMDBcXHUyMDI4XFx1MjAyOVxcdUZFRkZdKy87XG52YXIgcmlnaHRXaGl0ZXNwYWNlID0gbXZzSXNXU1xuXHQ/IC9bXFx4MDlcXHgwQVxceDBCXFx4MENcXHgwRFxceDIwXFx4QTBcXHUxNjgwXFx1MTgwRVxcdTIwMDBcXHUyMDAxXFx1MjAwMlxcdTIwMDNcXHUyMDA0XFx1MjAwNVxcdTIwMDZcXHUyMDA3XFx1MjAwOFxcdTIwMDlcXHUyMDBBXFx1MjAyRlxcdTIwNUZcXHUzMDAwXFx1MjAyOFxcdTIwMjlcXHVGRUZGXSskL1xuXHQ6IC9bXFx4MDlcXHgwQVxceDBCXFx4MENcXHgwRFxceDIwXFx4QTBcXHUxNjgwXFx1MjAwMFxcdTIwMDFcXHUyMDAyXFx1MjAwM1xcdTIwMDRcXHUyMDA1XFx1MjAwNlxcdTIwMDdcXHUyMDA4XFx1MjAwOVxcdTIwMEFcXHUyMDJGXFx1MjA1RlxcdTMwMDBcXHUyMDI4XFx1MjAyOVxcdUZFRkZdKyQvO1xuLyogZXNsaW50LWVuYWJsZSBuby1jb250cm9sLXJlZ2V4ICovXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gdHJpbSgpIHtcblx0dmFyIFMgPSBUb1N0cmluZyhSZXF1aXJlT2JqZWN0Q29lcmNpYmxlKHRoaXMpKTtcblx0cmV0dXJuICRyZXBsYWNlKCRyZXBsYWNlKFMsIGxlZnRXaGl0ZXNwYWNlLCAnJyksIHJpZ2h0V2hpdGVzcGFjZSwgJycpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGNhbGxCaW5kID0gcmVxdWlyZSgnY2FsbC1iaW5kJyk7XG52YXIgZGVmaW5lID0gcmVxdWlyZSgnZGVmaW5lLXByb3BlcnRpZXMnKTtcbnZhciBSZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gcmVxdWlyZSgnZXMtYWJzdHJhY3QvMjAyMS9SZXF1aXJlT2JqZWN0Q29lcmNpYmxlJyk7XG5cbnZhciBpbXBsZW1lbnRhdGlvbiA9IHJlcXVpcmUoJy4vaW1wbGVtZW50YXRpb24nKTtcbnZhciBnZXRQb2x5ZmlsbCA9IHJlcXVpcmUoJy4vcG9seWZpbGwnKTtcbnZhciBzaGltID0gcmVxdWlyZSgnLi9zaGltJyk7XG5cbnZhciBib3VuZCA9IGNhbGxCaW5kKGdldFBvbHlmaWxsKCkpO1xudmFyIGJvdW5kTWV0aG9kID0gZnVuY3Rpb24gdHJpbShyZWNlaXZlcikge1xuXHRSZXF1aXJlT2JqZWN0Q29lcmNpYmxlKHJlY2VpdmVyKTtcblx0cmV0dXJuIGJvdW5kKHJlY2VpdmVyKTtcbn07XG5cbmRlZmluZShib3VuZE1ldGhvZCwge1xuXHRnZXRQb2x5ZmlsbDogZ2V0UG9seWZpbGwsXG5cdGltcGxlbWVudGF0aW9uOiBpbXBsZW1lbnRhdGlvbixcblx0c2hpbTogc2hpbVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gYm91bmRNZXRob2Q7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBpbXBsZW1lbnRhdGlvbiA9IHJlcXVpcmUoJy4vaW1wbGVtZW50YXRpb24nKTtcblxudmFyIHplcm9XaWR0aFNwYWNlID0gJ1xcdTIwMGInO1xudmFyIG1vbmdvbGlhblZvd2VsU2VwYXJhdG9yID0gJ1xcdTE4MEUnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGdldFBvbHlmaWxsKCkge1xuXHRpZiAoXG5cdFx0U3RyaW5nLnByb3RvdHlwZS50cmltXG5cdFx0JiYgemVyb1dpZHRoU3BhY2UudHJpbSgpID09PSB6ZXJvV2lkdGhTcGFjZVxuXHRcdCYmIG1vbmdvbGlhblZvd2VsU2VwYXJhdG9yLnRyaW0oKSA9PT0gbW9uZ29saWFuVm93ZWxTZXBhcmF0b3Jcblx0XHQmJiAoJ18nICsgbW9uZ29saWFuVm93ZWxTZXBhcmF0b3IpLnRyaW0oKSA9PT0gKCdfJyArIG1vbmdvbGlhblZvd2VsU2VwYXJhdG9yKVxuXHRcdCYmIChtb25nb2xpYW5Wb3dlbFNlcGFyYXRvciArICdfJykudHJpbSgpID09PSAobW9uZ29saWFuVm93ZWxTZXBhcmF0b3IgKyAnXycpXG5cdCkge1xuXHRcdHJldHVybiBTdHJpbmcucHJvdG90eXBlLnRyaW07XG5cdH1cblx0cmV0dXJuIGltcGxlbWVudGF0aW9uO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGRlZmluZSA9IHJlcXVpcmUoJ2RlZmluZS1wcm9wZXJ0aWVzJyk7XG52YXIgZ2V0UG9seWZpbGwgPSByZXF1aXJlKCcuL3BvbHlmaWxsJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gc2hpbVN0cmluZ1RyaW0oKSB7XG5cdHZhciBwb2x5ZmlsbCA9IGdldFBvbHlmaWxsKCk7XG5cdGRlZmluZShTdHJpbmcucHJvdG90eXBlLCB7IHRyaW06IHBvbHlmaWxsIH0sIHtcblx0XHR0cmltOiBmdW5jdGlvbiB0ZXN0VHJpbSgpIHtcblx0XHRcdHJldHVybiBTdHJpbmcucHJvdG90eXBlLnRyaW0gIT09IHBvbHlmaWxsO1xuXHRcdH1cblx0fSk7XG5cdHJldHVybiBwb2x5ZmlsbDtcbn07XG4iLCIoZnVuY3Rpb24gKHByb2Nlc3Mpe1xudmFyIFN0cmVhbSA9IHJlcXVpcmUoJ3N0cmVhbScpXG5cbi8vIHRocm91Z2hcbi8vXG4vLyBhIHN0cmVhbSB0aGF0IGRvZXMgbm90aGluZyBidXQgcmUtZW1pdCB0aGUgaW5wdXQuXG4vLyB1c2VmdWwgZm9yIGFnZ3JlZ2F0aW5nIGEgc2VyaWVzIG9mIGNoYW5naW5nIGJ1dCBub3QgZW5kaW5nIHN0cmVhbXMgaW50byBvbmUgc3RyZWFtKVxuXG5leHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSB0aHJvdWdoXG50aHJvdWdoLnRocm91Z2ggPSB0aHJvdWdoXG5cbi8vY3JlYXRlIGEgcmVhZGFibGUgd3JpdGFibGUgc3RyZWFtLlxuXG5mdW5jdGlvbiB0aHJvdWdoICh3cml0ZSwgZW5kLCBvcHRzKSB7XG4gIHdyaXRlID0gd3JpdGUgfHwgZnVuY3Rpb24gKGRhdGEpIHsgdGhpcy5xdWV1ZShkYXRhKSB9XG4gIGVuZCA9IGVuZCB8fCBmdW5jdGlvbiAoKSB7IHRoaXMucXVldWUobnVsbCkgfVxuXG4gIHZhciBlbmRlZCA9IGZhbHNlLCBkZXN0cm95ZWQgPSBmYWxzZSwgYnVmZmVyID0gW10sIF9lbmRlZCA9IGZhbHNlXG4gIHZhciBzdHJlYW0gPSBuZXcgU3RyZWFtKClcbiAgc3RyZWFtLnJlYWRhYmxlID0gc3RyZWFtLndyaXRhYmxlID0gdHJ1ZVxuICBzdHJlYW0ucGF1c2VkID0gZmFsc2VcblxuLy8gIHN0cmVhbS5hdXRvUGF1c2UgICA9ICEob3B0cyAmJiBvcHRzLmF1dG9QYXVzZSAgID09PSBmYWxzZSlcbiAgc3RyZWFtLmF1dG9EZXN0cm95ID0gIShvcHRzICYmIG9wdHMuYXV0b0Rlc3Ryb3kgPT09IGZhbHNlKVxuXG4gIHN0cmVhbS53cml0ZSA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgd3JpdGUuY2FsbCh0aGlzLCBkYXRhKVxuICAgIHJldHVybiAhc3RyZWFtLnBhdXNlZFxuICB9XG5cbiAgZnVuY3Rpb24gZHJhaW4oKSB7XG4gICAgd2hpbGUoYnVmZmVyLmxlbmd0aCAmJiAhc3RyZWFtLnBhdXNlZCkge1xuICAgICAgdmFyIGRhdGEgPSBidWZmZXIuc2hpZnQoKVxuICAgICAgaWYobnVsbCA9PT0gZGF0YSlcbiAgICAgICAgcmV0dXJuIHN0cmVhbS5lbWl0KCdlbmQnKVxuICAgICAgZWxzZVxuICAgICAgICBzdHJlYW0uZW1pdCgnZGF0YScsIGRhdGEpXG4gICAgfVxuICB9XG5cbiAgc3RyZWFtLnF1ZXVlID0gc3RyZWFtLnB1c2ggPSBmdW5jdGlvbiAoZGF0YSkge1xuLy8gICAgY29uc29sZS5lcnJvcihlbmRlZClcbiAgICBpZihfZW5kZWQpIHJldHVybiBzdHJlYW1cbiAgICBpZihkYXRhID09PSBudWxsKSBfZW5kZWQgPSB0cnVlXG4gICAgYnVmZmVyLnB1c2goZGF0YSlcbiAgICBkcmFpbigpXG4gICAgcmV0dXJuIHN0cmVhbVxuICB9XG5cbiAgLy90aGlzIHdpbGwgYmUgcmVnaXN0ZXJlZCBhcyB0aGUgZmlyc3QgJ2VuZCcgbGlzdGVuZXJcbiAgLy9tdXN0IGNhbGwgZGVzdHJveSBuZXh0IHRpY2ssIHRvIG1ha2Ugc3VyZSB3ZSdyZSBhZnRlciBhbnlcbiAgLy9zdHJlYW0gcGlwZWQgZnJvbSBoZXJlLlxuICAvL3RoaXMgaXMgb25seSBhIHByb2JsZW0gaWYgZW5kIGlzIG5vdCBlbWl0dGVkIHN5bmNocm9ub3VzbHkuXG4gIC8vYSBuaWNlciB3YXkgdG8gZG8gdGhpcyBpcyB0byBtYWtlIHN1cmUgdGhpcyBpcyB0aGUgbGFzdCBsaXN0ZW5lciBmb3IgJ2VuZCdcblxuICBzdHJlYW0ub24oJ2VuZCcsIGZ1bmN0aW9uICgpIHtcbiAgICBzdHJlYW0ucmVhZGFibGUgPSBmYWxzZVxuICAgIGlmKCFzdHJlYW0ud3JpdGFibGUgJiYgc3RyZWFtLmF1dG9EZXN0cm95KVxuICAgICAgcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgIHN0cmVhbS5kZXN0cm95KClcbiAgICAgIH0pXG4gIH0pXG5cbiAgZnVuY3Rpb24gX2VuZCAoKSB7XG4gICAgc3RyZWFtLndyaXRhYmxlID0gZmFsc2VcbiAgICBlbmQuY2FsbChzdHJlYW0pXG4gICAgaWYoIXN0cmVhbS5yZWFkYWJsZSAmJiBzdHJlYW0uYXV0b0Rlc3Ryb3kpXG4gICAgICBzdHJlYW0uZGVzdHJveSgpXG4gIH1cblxuICBzdHJlYW0uZW5kID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgICBpZihlbmRlZCkgcmV0dXJuXG4gICAgZW5kZWQgPSB0cnVlXG4gICAgaWYoYXJndW1lbnRzLmxlbmd0aCkgc3RyZWFtLndyaXRlKGRhdGEpXG4gICAgX2VuZCgpIC8vIHdpbGwgZW1pdCBvciBxdWV1ZVxuICAgIHJldHVybiBzdHJlYW1cbiAgfVxuXG4gIHN0cmVhbS5kZXN0cm95ID0gZnVuY3Rpb24gKCkge1xuICAgIGlmKGRlc3Ryb3llZCkgcmV0dXJuXG4gICAgZGVzdHJveWVkID0gdHJ1ZVxuICAgIGVuZGVkID0gdHJ1ZVxuICAgIGJ1ZmZlci5sZW5ndGggPSAwXG4gICAgc3RyZWFtLndyaXRhYmxlID0gc3RyZWFtLnJlYWRhYmxlID0gZmFsc2VcbiAgICBzdHJlYW0uZW1pdCgnY2xvc2UnKVxuICAgIHJldHVybiBzdHJlYW1cbiAgfVxuXG4gIHN0cmVhbS5wYXVzZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZihzdHJlYW0ucGF1c2VkKSByZXR1cm5cbiAgICBzdHJlYW0ucGF1c2VkID0gdHJ1ZVxuICAgIHJldHVybiBzdHJlYW1cbiAgfVxuXG4gIHN0cmVhbS5yZXN1bWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYoc3RyZWFtLnBhdXNlZCkge1xuICAgICAgc3RyZWFtLnBhdXNlZCA9IGZhbHNlXG4gICAgICBzdHJlYW0uZW1pdCgncmVzdW1lJylcbiAgICB9XG4gICAgZHJhaW4oKVxuICAgIC8vbWF5IGhhdmUgYmVjb21lIHBhdXNlZCBhZ2FpbixcbiAgICAvL2FzIGRyYWluIGVtaXRzICdkYXRhJy5cbiAgICBpZighc3RyZWFtLnBhdXNlZClcbiAgICAgIHN0cmVhbS5lbWl0KCdkcmFpbicpXG4gICAgcmV0dXJuIHN0cmVhbVxuICB9XG4gIHJldHVybiBzdHJlYW1cbn1cblxuXG59KS5jYWxsKHRoaXMscmVxdWlyZShcIktsaXViSFwiKSkiLCIndXNlIHN0cmljdCc7XG5cbnZhciBpc1N0cmluZyA9IHJlcXVpcmUoJ2lzLXN0cmluZycpO1xudmFyIGlzTnVtYmVyID0gcmVxdWlyZSgnaXMtbnVtYmVyLW9iamVjdCcpO1xudmFyIGlzQm9vbGVhbiA9IHJlcXVpcmUoJ2lzLWJvb2xlYW4tb2JqZWN0Jyk7XG52YXIgaXNTeW1ib2wgPSByZXF1aXJlKCdpcy1zeW1ib2wnKTtcbnZhciBpc0JpZ0ludCA9IHJlcXVpcmUoJ2lzLWJpZ2ludCcpO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29uc2lzdGVudC1yZXR1cm5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gd2hpY2hCb3hlZFByaW1pdGl2ZSh2YWx1ZSkge1xuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXFlcWVxXG5cdGlmICh2YWx1ZSA9PSBudWxsIHx8ICh0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnICYmIHR5cGVvZiB2YWx1ZSAhPT0gJ2Z1bmN0aW9uJykpIHtcblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXHRpZiAoaXNTdHJpbmcodmFsdWUpKSB7XG5cdFx0cmV0dXJuICdTdHJpbmcnO1xuXHR9XG5cdGlmIChpc051bWJlcih2YWx1ZSkpIHtcblx0XHRyZXR1cm4gJ051bWJlcic7XG5cdH1cblx0aWYgKGlzQm9vbGVhbih2YWx1ZSkpIHtcblx0XHRyZXR1cm4gJ0Jvb2xlYW4nO1xuXHR9XG5cdGlmIChpc1N5bWJvbCh2YWx1ZSkpIHtcblx0XHRyZXR1cm4gJ1N5bWJvbCc7XG5cdH1cblx0aWYgKGlzQmlnSW50KHZhbHVlKSkge1xuXHRcdHJldHVybiAnQmlnSW50Jztcblx0fVxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGlzTWFwID0gcmVxdWlyZSgnaXMtbWFwJyk7XG52YXIgaXNTZXQgPSByZXF1aXJlKCdpcy1zZXQnKTtcbnZhciBpc1dlYWtNYXAgPSByZXF1aXJlKCdpcy13ZWFrbWFwJyk7XG52YXIgaXNXZWFrU2V0ID0gcmVxdWlyZSgnaXMtd2Vha3NldCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHdoaWNoQ29sbGVjdGlvbih2YWx1ZSkge1xuXHRpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuXHRcdGlmIChpc01hcCh2YWx1ZSkpIHtcblx0XHRcdHJldHVybiAnTWFwJztcblx0XHR9XG5cdFx0aWYgKGlzU2V0KHZhbHVlKSkge1xuXHRcdFx0cmV0dXJuICdTZXQnO1xuXHRcdH1cblx0XHRpZiAoaXNXZWFrTWFwKHZhbHVlKSkge1xuXHRcdFx0cmV0dXJuICdXZWFrTWFwJztcblx0XHR9XG5cdFx0aWYgKGlzV2Vha1NldCh2YWx1ZSkpIHtcblx0XHRcdHJldHVybiAnV2Vha1NldCc7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBmYWxzZTtcbn07XG4iLCIoZnVuY3Rpb24gKGdsb2JhbCl7XG4ndXNlIHN0cmljdCc7XG5cbnZhciBmb3JFYWNoID0gcmVxdWlyZSgnZm9yLWVhY2gnKTtcbnZhciBhdmFpbGFibGVUeXBlZEFycmF5cyA9IHJlcXVpcmUoJ2F2YWlsYWJsZS10eXBlZC1hcnJheXMnKTtcbnZhciBjYWxsQm91bmQgPSByZXF1aXJlKCdjYWxsLWJpbmQvY2FsbEJvdW5kJyk7XG5cbnZhciAkdG9TdHJpbmcgPSBjYWxsQm91bmQoJ09iamVjdC5wcm90b3R5cGUudG9TdHJpbmcnKTtcbnZhciBoYXNUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJ2hhcy10b3N0cmluZ3RhZy9zaGFtcycpKCk7XG5cbnZhciBnID0gdHlwZW9mIGdsb2JhbFRoaXMgPT09ICd1bmRlZmluZWQnID8gZ2xvYmFsIDogZ2xvYmFsVGhpcztcbnZhciB0eXBlZEFycmF5cyA9IGF2YWlsYWJsZVR5cGVkQXJyYXlzKCk7XG5cbnZhciAkc2xpY2UgPSBjYWxsQm91bmQoJ1N0cmluZy5wcm90b3R5cGUuc2xpY2UnKTtcbnZhciB0b1N0clRhZ3MgPSB7fTtcbnZhciBnT1BEID0gcmVxdWlyZSgnZXMtYWJzdHJhY3QvaGVscGVycy9nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3InKTtcbnZhciBnZXRQcm90b3R5cGVPZiA9IE9iamVjdC5nZXRQcm90b3R5cGVPZjsgLy8gcmVxdWlyZSgnZ2V0cHJvdG90eXBlb2YnKTtcbmlmIChoYXNUb1N0cmluZ1RhZyAmJiBnT1BEICYmIGdldFByb3RvdHlwZU9mKSB7XG5cdGZvckVhY2godHlwZWRBcnJheXMsIGZ1bmN0aW9uICh0eXBlZEFycmF5KSB7XG5cdFx0aWYgKHR5cGVvZiBnW3R5cGVkQXJyYXldID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHR2YXIgYXJyID0gbmV3IGdbdHlwZWRBcnJheV0oKTtcblx0XHRcdGlmIChTeW1ib2wudG9TdHJpbmdUYWcgaW4gYXJyKSB7XG5cdFx0XHRcdHZhciBwcm90byA9IGdldFByb3RvdHlwZU9mKGFycik7XG5cdFx0XHRcdHZhciBkZXNjcmlwdG9yID0gZ09QRChwcm90bywgU3ltYm9sLnRvU3RyaW5nVGFnKTtcblx0XHRcdFx0aWYgKCFkZXNjcmlwdG9yKSB7XG5cdFx0XHRcdFx0dmFyIHN1cGVyUHJvdG8gPSBnZXRQcm90b3R5cGVPZihwcm90byk7XG5cdFx0XHRcdFx0ZGVzY3JpcHRvciA9IGdPUEQoc3VwZXJQcm90bywgU3ltYm9sLnRvU3RyaW5nVGFnKTtcblx0XHRcdFx0fVxuXHRcdFx0XHR0b1N0clRhZ3NbdHlwZWRBcnJheV0gPSBkZXNjcmlwdG9yLmdldDtcblx0XHRcdH1cblx0XHR9XG5cdH0pO1xufVxuXG52YXIgdHJ5VHlwZWRBcnJheXMgPSBmdW5jdGlvbiB0cnlBbGxUeXBlZEFycmF5cyh2YWx1ZSkge1xuXHR2YXIgZm91bmROYW1lID0gZmFsc2U7XG5cdGZvckVhY2godG9TdHJUYWdzLCBmdW5jdGlvbiAoZ2V0dGVyLCB0eXBlZEFycmF5KSB7XG5cdFx0aWYgKCFmb3VuZE5hbWUpIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdHZhciBuYW1lID0gZ2V0dGVyLmNhbGwodmFsdWUpO1xuXHRcdFx0XHRpZiAobmFtZSA9PT0gdHlwZWRBcnJheSkge1xuXHRcdFx0XHRcdGZvdW5kTmFtZSA9IG5hbWU7XG5cdFx0XHRcdH1cblx0XHRcdH0gY2F0Y2ggKGUpIHt9XG5cdFx0fVxuXHR9KTtcblx0cmV0dXJuIGZvdW5kTmFtZTtcbn07XG5cbnZhciBpc1R5cGVkQXJyYXkgPSByZXF1aXJlKCdpcy10eXBlZC1hcnJheScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHdoaWNoVHlwZWRBcnJheSh2YWx1ZSkge1xuXHRpZiAoIWlzVHlwZWRBcnJheSh2YWx1ZSkpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdGlmICghaGFzVG9TdHJpbmdUYWcgfHwgIShTeW1ib2wudG9TdHJpbmdUYWcgaW4gdmFsdWUpKSB7IHJldHVybiAkc2xpY2UoJHRvU3RyaW5nKHZhbHVlKSwgOCwgLTEpOyB9XG5cdHJldHVybiB0cnlUeXBlZEFycmF5cyh2YWx1ZSk7XG59O1xuXG59KS5jYWxsKHRoaXMsdHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIgPyBzZWxmIDogdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiA/IHdpbmRvdyA6IHt9KSIsIid1c2Ugc3RyaWN0JztcblxudmFyIHRlc3QgPSByZXF1aXJlKCcuLi8uLi8nKTtcblxudGVzdChmdW5jdGlvbiAodCkge1xuXHR0LnBsYW4oNCk7XG5cdHQub2sodHJ1ZSk7XG5cdHQuZXF1YWwoMywgMSArIDIpO1xuXHR0LmRlZXBFcXVhbChbMSwgMiwgWzMsIDRdXSwgWzEsIDIsIFszLCA0XV0pO1xuXHR0Lm5vdERlZXBFcXVhbChbMSwgMiwgWzMsIDQsIDVdXSwgWzEsIDIsIFszLCA0XV0pO1xufSk7XG4iLCJ2YXIgbG9va3VwID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8nO1xuXG47KGZ1bmN0aW9uIChleHBvcnRzKSB7XG5cdCd1c2Ugc3RyaWN0JztcblxuICB2YXIgQXJyID0gKHR5cGVvZiBVaW50OEFycmF5ICE9PSAndW5kZWZpbmVkJylcbiAgICA/IFVpbnQ4QXJyYXlcbiAgICA6IEFycmF5XG5cblx0dmFyIFBMVVMgICA9ICcrJy5jaGFyQ29kZUF0KDApXG5cdHZhciBTTEFTSCAgPSAnLycuY2hhckNvZGVBdCgwKVxuXHR2YXIgTlVNQkVSID0gJzAnLmNoYXJDb2RlQXQoMClcblx0dmFyIExPV0VSICA9ICdhJy5jaGFyQ29kZUF0KDApXG5cdHZhciBVUFBFUiAgPSAnQScuY2hhckNvZGVBdCgwKVxuXHR2YXIgUExVU19VUkxfU0FGRSA9ICctJy5jaGFyQ29kZUF0KDApXG5cdHZhciBTTEFTSF9VUkxfU0FGRSA9ICdfJy5jaGFyQ29kZUF0KDApXG5cblx0ZnVuY3Rpb24gZGVjb2RlIChlbHQpIHtcblx0XHR2YXIgY29kZSA9IGVsdC5jaGFyQ29kZUF0KDApXG5cdFx0aWYgKGNvZGUgPT09IFBMVVMgfHxcblx0XHQgICAgY29kZSA9PT0gUExVU19VUkxfU0FGRSlcblx0XHRcdHJldHVybiA2MiAvLyAnKydcblx0XHRpZiAoY29kZSA9PT0gU0xBU0ggfHxcblx0XHQgICAgY29kZSA9PT0gU0xBU0hfVVJMX1NBRkUpXG5cdFx0XHRyZXR1cm4gNjMgLy8gJy8nXG5cdFx0aWYgKGNvZGUgPCBOVU1CRVIpXG5cdFx0XHRyZXR1cm4gLTEgLy9ubyBtYXRjaFxuXHRcdGlmIChjb2RlIDwgTlVNQkVSICsgMTApXG5cdFx0XHRyZXR1cm4gY29kZSAtIE5VTUJFUiArIDI2ICsgMjZcblx0XHRpZiAoY29kZSA8IFVQUEVSICsgMjYpXG5cdFx0XHRyZXR1cm4gY29kZSAtIFVQUEVSXG5cdFx0aWYgKGNvZGUgPCBMT1dFUiArIDI2KVxuXHRcdFx0cmV0dXJuIGNvZGUgLSBMT1dFUiArIDI2XG5cdH1cblxuXHRmdW5jdGlvbiBiNjRUb0J5dGVBcnJheSAoYjY0KSB7XG5cdFx0dmFyIGksIGosIGwsIHRtcCwgcGxhY2VIb2xkZXJzLCBhcnJcblxuXHRcdGlmIChiNjQubGVuZ3RoICUgNCA+IDApIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignSW52YWxpZCBzdHJpbmcuIExlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCcpXG5cdFx0fVxuXG5cdFx0Ly8gdGhlIG51bWJlciBvZiBlcXVhbCBzaWducyAocGxhY2UgaG9sZGVycylcblx0XHQvLyBpZiB0aGVyZSBhcmUgdHdvIHBsYWNlaG9sZGVycywgdGhhbiB0aGUgdHdvIGNoYXJhY3RlcnMgYmVmb3JlIGl0XG5cdFx0Ly8gcmVwcmVzZW50IG9uZSBieXRlXG5cdFx0Ly8gaWYgdGhlcmUgaXMgb25seSBvbmUsIHRoZW4gdGhlIHRocmVlIGNoYXJhY3RlcnMgYmVmb3JlIGl0IHJlcHJlc2VudCAyIGJ5dGVzXG5cdFx0Ly8gdGhpcyBpcyBqdXN0IGEgY2hlYXAgaGFjayB0byBub3QgZG8gaW5kZXhPZiB0d2ljZVxuXHRcdHZhciBsZW4gPSBiNjQubGVuZ3RoXG5cdFx0cGxhY2VIb2xkZXJzID0gJz0nID09PSBiNjQuY2hhckF0KGxlbiAtIDIpID8gMiA6ICc9JyA9PT0gYjY0LmNoYXJBdChsZW4gLSAxKSA/IDEgOiAwXG5cblx0XHQvLyBiYXNlNjQgaXMgNC8zICsgdXAgdG8gdHdvIGNoYXJhY3RlcnMgb2YgdGhlIG9yaWdpbmFsIGRhdGFcblx0XHRhcnIgPSBuZXcgQXJyKGI2NC5sZW5ndGggKiAzIC8gNCAtIHBsYWNlSG9sZGVycylcblxuXHRcdC8vIGlmIHRoZXJlIGFyZSBwbGFjZWhvbGRlcnMsIG9ubHkgZ2V0IHVwIHRvIHRoZSBsYXN0IGNvbXBsZXRlIDQgY2hhcnNcblx0XHRsID0gcGxhY2VIb2xkZXJzID4gMCA/IGI2NC5sZW5ndGggLSA0IDogYjY0Lmxlbmd0aFxuXG5cdFx0dmFyIEwgPSAwXG5cblx0XHRmdW5jdGlvbiBwdXNoICh2KSB7XG5cdFx0XHRhcnJbTCsrXSA9IHZcblx0XHR9XG5cblx0XHRmb3IgKGkgPSAwLCBqID0gMDsgaSA8IGw7IGkgKz0gNCwgaiArPSAzKSB7XG5cdFx0XHR0bXAgPSAoZGVjb2RlKGI2NC5jaGFyQXQoaSkpIDw8IDE4KSB8IChkZWNvZGUoYjY0LmNoYXJBdChpICsgMSkpIDw8IDEyKSB8IChkZWNvZGUoYjY0LmNoYXJBdChpICsgMikpIDw8IDYpIHwgZGVjb2RlKGI2NC5jaGFyQXQoaSArIDMpKVxuXHRcdFx0cHVzaCgodG1wICYgMHhGRjAwMDApID4+IDE2KVxuXHRcdFx0cHVzaCgodG1wICYgMHhGRjAwKSA+PiA4KVxuXHRcdFx0cHVzaCh0bXAgJiAweEZGKVxuXHRcdH1cblxuXHRcdGlmIChwbGFjZUhvbGRlcnMgPT09IDIpIHtcblx0XHRcdHRtcCA9IChkZWNvZGUoYjY0LmNoYXJBdChpKSkgPDwgMikgfCAoZGVjb2RlKGI2NC5jaGFyQXQoaSArIDEpKSA+PiA0KVxuXHRcdFx0cHVzaCh0bXAgJiAweEZGKVxuXHRcdH0gZWxzZSBpZiAocGxhY2VIb2xkZXJzID09PSAxKSB7XG5cdFx0XHR0bXAgPSAoZGVjb2RlKGI2NC5jaGFyQXQoaSkpIDw8IDEwKSB8IChkZWNvZGUoYjY0LmNoYXJBdChpICsgMSkpIDw8IDQpIHwgKGRlY29kZShiNjQuY2hhckF0KGkgKyAyKSkgPj4gMilcblx0XHRcdHB1c2goKHRtcCA+PiA4KSAmIDB4RkYpXG5cdFx0XHRwdXNoKHRtcCAmIDB4RkYpXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGFyclxuXHR9XG5cblx0ZnVuY3Rpb24gdWludDhUb0Jhc2U2NCAodWludDgpIHtcblx0XHR2YXIgaSxcblx0XHRcdGV4dHJhQnl0ZXMgPSB1aW50OC5sZW5ndGggJSAzLCAvLyBpZiB3ZSBoYXZlIDEgYnl0ZSBsZWZ0LCBwYWQgMiBieXRlc1xuXHRcdFx0b3V0cHV0ID0gXCJcIixcblx0XHRcdHRlbXAsIGxlbmd0aFxuXG5cdFx0ZnVuY3Rpb24gZW5jb2RlIChudW0pIHtcblx0XHRcdHJldHVybiBsb29rdXAuY2hhckF0KG51bSlcblx0XHR9XG5cblx0XHRmdW5jdGlvbiB0cmlwbGV0VG9CYXNlNjQgKG51bSkge1xuXHRcdFx0cmV0dXJuIGVuY29kZShudW0gPj4gMTggJiAweDNGKSArIGVuY29kZShudW0gPj4gMTIgJiAweDNGKSArIGVuY29kZShudW0gPj4gNiAmIDB4M0YpICsgZW5jb2RlKG51bSAmIDB4M0YpXG5cdFx0fVxuXG5cdFx0Ly8gZ28gdGhyb3VnaCB0aGUgYXJyYXkgZXZlcnkgdGhyZWUgYnl0ZXMsIHdlJ2xsIGRlYWwgd2l0aCB0cmFpbGluZyBzdHVmZiBsYXRlclxuXHRcdGZvciAoaSA9IDAsIGxlbmd0aCA9IHVpbnQ4Lmxlbmd0aCAtIGV4dHJhQnl0ZXM7IGkgPCBsZW5ndGg7IGkgKz0gMykge1xuXHRcdFx0dGVtcCA9ICh1aW50OFtpXSA8PCAxNikgKyAodWludDhbaSArIDFdIDw8IDgpICsgKHVpbnQ4W2kgKyAyXSlcblx0XHRcdG91dHB1dCArPSB0cmlwbGV0VG9CYXNlNjQodGVtcClcblx0XHR9XG5cblx0XHQvLyBwYWQgdGhlIGVuZCB3aXRoIHplcm9zLCBidXQgbWFrZSBzdXJlIHRvIG5vdCBmb3JnZXQgdGhlIGV4dHJhIGJ5dGVzXG5cdFx0c3dpdGNoIChleHRyYUJ5dGVzKSB7XG5cdFx0XHRjYXNlIDE6XG5cdFx0XHRcdHRlbXAgPSB1aW50OFt1aW50OC5sZW5ndGggLSAxXVxuXHRcdFx0XHRvdXRwdXQgKz0gZW5jb2RlKHRlbXAgPj4gMilcblx0XHRcdFx0b3V0cHV0ICs9IGVuY29kZSgodGVtcCA8PCA0KSAmIDB4M0YpXG5cdFx0XHRcdG91dHB1dCArPSAnPT0nXG5cdFx0XHRcdGJyZWFrXG5cdFx0XHRjYXNlIDI6XG5cdFx0XHRcdHRlbXAgPSAodWludDhbdWludDgubGVuZ3RoIC0gMl0gPDwgOCkgKyAodWludDhbdWludDgubGVuZ3RoIC0gMV0pXG5cdFx0XHRcdG91dHB1dCArPSBlbmNvZGUodGVtcCA+PiAxMClcblx0XHRcdFx0b3V0cHV0ICs9IGVuY29kZSgodGVtcCA+PiA0KSAmIDB4M0YpXG5cdFx0XHRcdG91dHB1dCArPSBlbmNvZGUoKHRlbXAgPDwgMikgJiAweDNGKVxuXHRcdFx0XHRvdXRwdXQgKz0gJz0nXG5cdFx0XHRcdGJyZWFrXG5cdFx0fVxuXG5cdFx0cmV0dXJuIG91dHB1dFxuXHR9XG5cblx0ZXhwb3J0cy50b0J5dGVBcnJheSA9IGI2NFRvQnl0ZUFycmF5XG5cdGV4cG9ydHMuZnJvbUJ5dGVBcnJheSA9IHVpbnQ4VG9CYXNlNjRcbn0odHlwZW9mIGV4cG9ydHMgPT09ICd1bmRlZmluZWQnID8gKHRoaXMuYmFzZTY0anMgPSB7fSkgOiBleHBvcnRzKSlcbiIsbnVsbCwiLyohXG4gKiBUaGUgYnVmZmVyIG1vZHVsZSBmcm9tIG5vZGUuanMsIGZvciB0aGUgYnJvd3Nlci5cbiAqXG4gKiBAYXV0aG9yICAgRmVyb3NzIEFib3VraGFkaWplaCA8ZmVyb3NzQGZlcm9zcy5vcmc+IDxodHRwOi8vZmVyb3NzLm9yZz5cbiAqIEBsaWNlbnNlICBNSVRcbiAqL1xuXG52YXIgYmFzZTY0ID0gcmVxdWlyZSgnYmFzZTY0LWpzJylcbnZhciBpZWVlNzU0ID0gcmVxdWlyZSgnaWVlZTc1NCcpXG5cbmV4cG9ydHMuQnVmZmVyID0gQnVmZmVyXG5leHBvcnRzLlNsb3dCdWZmZXIgPSBCdWZmZXJcbmV4cG9ydHMuSU5TUEVDVF9NQVhfQllURVMgPSA1MFxuQnVmZmVyLnBvb2xTaXplID0gODE5MlxuXG4vKipcbiAqIElmIGBCdWZmZXIuX3VzZVR5cGVkQXJyYXlzYDpcbiAqICAgPT09IHRydWUgICAgVXNlIFVpbnQ4QXJyYXkgaW1wbGVtZW50YXRpb24gKGZhc3Rlc3QpXG4gKiAgID09PSBmYWxzZSAgIFVzZSBPYmplY3QgaW1wbGVtZW50YXRpb24gKGNvbXBhdGlibGUgZG93biB0byBJRTYpXG4gKi9cbkJ1ZmZlci5fdXNlVHlwZWRBcnJheXMgPSAoZnVuY3Rpb24gKCkge1xuICAvLyBEZXRlY3QgaWYgYnJvd3NlciBzdXBwb3J0cyBUeXBlZCBBcnJheXMuIFN1cHBvcnRlZCBicm93c2VycyBhcmUgSUUgMTArLCBGaXJlZm94IDQrLFxuICAvLyBDaHJvbWUgNyssIFNhZmFyaSA1LjErLCBPcGVyYSAxMS42KywgaU9TIDQuMisuIElmIHRoZSBicm93c2VyIGRvZXMgbm90IHN1cHBvcnQgYWRkaW5nXG4gIC8vIHByb3BlcnRpZXMgdG8gYFVpbnQ4QXJyYXlgIGluc3RhbmNlcywgdGhlbiB0aGF0J3MgdGhlIHNhbWUgYXMgbm8gYFVpbnQ4QXJyYXlgIHN1cHBvcnRcbiAgLy8gYmVjYXVzZSB3ZSBuZWVkIHRvIGJlIGFibGUgdG8gYWRkIGFsbCB0aGUgbm9kZSBCdWZmZXIgQVBJIG1ldGhvZHMuIFRoaXMgaXMgYW4gaXNzdWVcbiAgLy8gaW4gRmlyZWZveCA0LTI5LiBOb3cgZml4ZWQ6IGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTY5NTQzOFxuICB0cnkge1xuICAgIHZhciBidWYgPSBuZXcgQXJyYXlCdWZmZXIoMClcbiAgICB2YXIgYXJyID0gbmV3IFVpbnQ4QXJyYXkoYnVmKVxuICAgIGFyci5mb28gPSBmdW5jdGlvbiAoKSB7IHJldHVybiA0MiB9XG4gICAgcmV0dXJuIDQyID09PSBhcnIuZm9vKCkgJiZcbiAgICAgICAgdHlwZW9mIGFyci5zdWJhcnJheSA9PT0gJ2Z1bmN0aW9uJyAvLyBDaHJvbWUgOS0xMCBsYWNrIGBzdWJhcnJheWBcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG59KSgpXG5cbi8qKlxuICogQ2xhc3M6IEJ1ZmZlclxuICogPT09PT09PT09PT09PVxuICpcbiAqIFRoZSBCdWZmZXIgY29uc3RydWN0b3IgcmV0dXJucyBpbnN0YW5jZXMgb2YgYFVpbnQ4QXJyYXlgIHRoYXQgYXJlIGF1Z21lbnRlZFxuICogd2l0aCBmdW5jdGlvbiBwcm9wZXJ0aWVzIGZvciBhbGwgdGhlIG5vZGUgYEJ1ZmZlcmAgQVBJIGZ1bmN0aW9ucy4gV2UgdXNlXG4gKiBgVWludDhBcnJheWAgc28gdGhhdCBzcXVhcmUgYnJhY2tldCBub3RhdGlvbiB3b3JrcyBhcyBleHBlY3RlZCAtLSBpdCByZXR1cm5zXG4gKiBhIHNpbmdsZSBvY3RldC5cbiAqXG4gKiBCeSBhdWdtZW50aW5nIHRoZSBpbnN0YW5jZXMsIHdlIGNhbiBhdm9pZCBtb2RpZnlpbmcgdGhlIGBVaW50OEFycmF5YFxuICogcHJvdG90eXBlLlxuICovXG5mdW5jdGlvbiBCdWZmZXIgKHN1YmplY3QsIGVuY29kaW5nLCBub1plcm8pIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIEJ1ZmZlcikpXG4gICAgcmV0dXJuIG5ldyBCdWZmZXIoc3ViamVjdCwgZW5jb2RpbmcsIG5vWmVybylcblxuICB2YXIgdHlwZSA9IHR5cGVvZiBzdWJqZWN0XG5cbiAgLy8gV29ya2Fyb3VuZDogbm9kZSdzIGJhc2U2NCBpbXBsZW1lbnRhdGlvbiBhbGxvd3MgZm9yIG5vbi1wYWRkZWQgc3RyaW5nc1xuICAvLyB3aGlsZSBiYXNlNjQtanMgZG9lcyBub3QuXG4gIGlmIChlbmNvZGluZyA9PT0gJ2Jhc2U2NCcgJiYgdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICBzdWJqZWN0ID0gc3RyaW5ndHJpbShzdWJqZWN0KVxuICAgIHdoaWxlIChzdWJqZWN0Lmxlbmd0aCAlIDQgIT09IDApIHtcbiAgICAgIHN1YmplY3QgPSBzdWJqZWN0ICsgJz0nXG4gICAgfVxuICB9XG5cbiAgLy8gRmluZCB0aGUgbGVuZ3RoXG4gIHZhciBsZW5ndGhcbiAgaWYgKHR5cGUgPT09ICdudW1iZXInKVxuICAgIGxlbmd0aCA9IGNvZXJjZShzdWJqZWN0KVxuICBlbHNlIGlmICh0eXBlID09PSAnc3RyaW5nJylcbiAgICBsZW5ndGggPSBCdWZmZXIuYnl0ZUxlbmd0aChzdWJqZWN0LCBlbmNvZGluZylcbiAgZWxzZSBpZiAodHlwZSA9PT0gJ29iamVjdCcpXG4gICAgbGVuZ3RoID0gY29lcmNlKHN1YmplY3QubGVuZ3RoKSAvLyBhc3N1bWUgdGhhdCBvYmplY3QgaXMgYXJyYXktbGlrZVxuICBlbHNlXG4gICAgdGhyb3cgbmV3IEVycm9yKCdGaXJzdCBhcmd1bWVudCBuZWVkcyB0byBiZSBhIG51bWJlciwgYXJyYXkgb3Igc3RyaW5nLicpXG5cbiAgdmFyIGJ1ZlxuICBpZiAoQnVmZmVyLl91c2VUeXBlZEFycmF5cykge1xuICAgIC8vIFByZWZlcnJlZDogUmV0dXJuIGFuIGF1Z21lbnRlZCBgVWludDhBcnJheWAgaW5zdGFuY2UgZm9yIGJlc3QgcGVyZm9ybWFuY2VcbiAgICBidWYgPSBCdWZmZXIuX2F1Z21lbnQobmV3IFVpbnQ4QXJyYXkobGVuZ3RoKSlcbiAgfSBlbHNlIHtcbiAgICAvLyBGYWxsYmFjazogUmV0dXJuIFRISVMgaW5zdGFuY2Ugb2YgQnVmZmVyIChjcmVhdGVkIGJ5IGBuZXdgKVxuICAgIGJ1ZiA9IHRoaXNcbiAgICBidWYubGVuZ3RoID0gbGVuZ3RoXG4gICAgYnVmLl9pc0J1ZmZlciA9IHRydWVcbiAgfVxuXG4gIHZhciBpXG4gIGlmIChCdWZmZXIuX3VzZVR5cGVkQXJyYXlzICYmIHR5cGVvZiBzdWJqZWN0LmJ5dGVMZW5ndGggPT09ICdudW1iZXInKSB7XG4gICAgLy8gU3BlZWQgb3B0aW1pemF0aW9uIC0tIHVzZSBzZXQgaWYgd2UncmUgY29weWluZyBmcm9tIGEgdHlwZWQgYXJyYXlcbiAgICBidWYuX3NldChzdWJqZWN0KVxuICB9IGVsc2UgaWYgKGlzQXJyYXlpc2goc3ViamVjdCkpIHtcbiAgICAvLyBUcmVhdCBhcnJheS1pc2ggb2JqZWN0cyBhcyBhIGJ5dGUgYXJyYXlcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChCdWZmZXIuaXNCdWZmZXIoc3ViamVjdCkpXG4gICAgICAgIGJ1ZltpXSA9IHN1YmplY3QucmVhZFVJbnQ4KGkpXG4gICAgICBlbHNlXG4gICAgICAgIGJ1ZltpXSA9IHN1YmplY3RbaV1cbiAgICB9XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICBidWYud3JpdGUoc3ViamVjdCwgMCwgZW5jb2RpbmcpXG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ251bWJlcicgJiYgIUJ1ZmZlci5fdXNlVHlwZWRBcnJheXMgJiYgIW5vWmVybykge1xuICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgYnVmW2ldID0gMFxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBidWZcbn1cblxuLy8gU1RBVElDIE1FVEhPRFNcbi8vID09PT09PT09PT09PT09XG5cbkJ1ZmZlci5pc0VuY29kaW5nID0gZnVuY3Rpb24gKGVuY29kaW5nKSB7XG4gIHN3aXRjaCAoU3RyaW5nKGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgY2FzZSAnaGV4JzpcbiAgICBjYXNlICd1dGY4JzpcbiAgICBjYXNlICd1dGYtOCc6XG4gICAgY2FzZSAnYXNjaWknOlxuICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgY2FzZSAnYmFzZTY0JzpcbiAgICBjYXNlICdyYXcnOlxuICAgIGNhc2UgJ3VjczInOlxuICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICBjYXNlICd1dGYxNmxlJzpcbiAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5CdWZmZXIuaXNCdWZmZXIgPSBmdW5jdGlvbiAoYikge1xuICByZXR1cm4gISEoYiAhPT0gbnVsbCAmJiBiICE9PSB1bmRlZmluZWQgJiYgYi5faXNCdWZmZXIpXG59XG5cbkJ1ZmZlci5ieXRlTGVuZ3RoID0gZnVuY3Rpb24gKHN0ciwgZW5jb2RpbmcpIHtcbiAgdmFyIHJldFxuICBzdHIgPSBzdHIgKyAnJ1xuICBzd2l0Y2ggKGVuY29kaW5nIHx8ICd1dGY4Jykge1xuICAgIGNhc2UgJ2hleCc6XG4gICAgICByZXQgPSBzdHIubGVuZ3RoIC8gMlxuICAgICAgYnJlYWtcbiAgICBjYXNlICd1dGY4JzpcbiAgICBjYXNlICd1dGYtOCc6XG4gICAgICByZXQgPSB1dGY4VG9CeXRlcyhzdHIpLmxlbmd0aFxuICAgICAgYnJlYWtcbiAgICBjYXNlICdhc2NpaSc6XG4gICAgY2FzZSAnYmluYXJ5JzpcbiAgICBjYXNlICdyYXcnOlxuICAgICAgcmV0ID0gc3RyLmxlbmd0aFxuICAgICAgYnJlYWtcbiAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgcmV0ID0gYmFzZTY0VG9CeXRlcyhzdHIpLmxlbmd0aFxuICAgICAgYnJlYWtcbiAgICBjYXNlICd1Y3MyJzpcbiAgICBjYXNlICd1Y3MtMic6XG4gICAgY2FzZSAndXRmMTZsZSc6XG4gICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgcmV0ID0gc3RyLmxlbmd0aCAqIDJcbiAgICAgIGJyZWFrXG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biBlbmNvZGluZycpXG4gIH1cbiAgcmV0dXJuIHJldFxufVxuXG5CdWZmZXIuY29uY2F0ID0gZnVuY3Rpb24gKGxpc3QsIHRvdGFsTGVuZ3RoKSB7XG4gIGFzc2VydChpc0FycmF5KGxpc3QpLCAnVXNhZ2U6IEJ1ZmZlci5jb25jYXQobGlzdCwgW3RvdGFsTGVuZ3RoXSlcXG4nICtcbiAgICAgICdsaXN0IHNob3VsZCBiZSBhbiBBcnJheS4nKVxuXG4gIGlmIChsaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBuZXcgQnVmZmVyKDApXG4gIH0gZWxzZSBpZiAobGlzdC5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4gbGlzdFswXVxuICB9XG5cbiAgdmFyIGlcbiAgaWYgKHR5cGVvZiB0b3RhbExlbmd0aCAhPT0gJ251bWJlcicpIHtcbiAgICB0b3RhbExlbmd0aCA9IDBcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgdG90YWxMZW5ndGggKz0gbGlzdFtpXS5sZW5ndGhcbiAgICB9XG4gIH1cblxuICB2YXIgYnVmID0gbmV3IEJ1ZmZlcih0b3RhbExlbmd0aClcbiAgdmFyIHBvcyA9IDBcbiAgZm9yIChpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgaXRlbSA9IGxpc3RbaV1cbiAgICBpdGVtLmNvcHkoYnVmLCBwb3MpXG4gICAgcG9zICs9IGl0ZW0ubGVuZ3RoXG4gIH1cbiAgcmV0dXJuIGJ1ZlxufVxuXG4vLyBCVUZGRVIgSU5TVEFOQ0UgTUVUSE9EU1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT1cblxuZnVuY3Rpb24gX2hleFdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgb2Zmc2V0ID0gTnVtYmVyKG9mZnNldCkgfHwgMFxuICB2YXIgcmVtYWluaW5nID0gYnVmLmxlbmd0aCAtIG9mZnNldFxuICBpZiAoIWxlbmd0aCkge1xuICAgIGxlbmd0aCA9IHJlbWFpbmluZ1xuICB9IGVsc2Uge1xuICAgIGxlbmd0aCA9IE51bWJlcihsZW5ndGgpXG4gICAgaWYgKGxlbmd0aCA+IHJlbWFpbmluZykge1xuICAgICAgbGVuZ3RoID0gcmVtYWluaW5nXG4gICAgfVxuICB9XG5cbiAgLy8gbXVzdCBiZSBhbiBldmVuIG51bWJlciBvZiBkaWdpdHNcbiAgdmFyIHN0ckxlbiA9IHN0cmluZy5sZW5ndGhcbiAgYXNzZXJ0KHN0ckxlbiAlIDIgPT09IDAsICdJbnZhbGlkIGhleCBzdHJpbmcnKVxuXG4gIGlmIChsZW5ndGggPiBzdHJMZW4gLyAyKSB7XG4gICAgbGVuZ3RoID0gc3RyTGVuIC8gMlxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgYnl0ZSA9IHBhcnNlSW50KHN0cmluZy5zdWJzdHIoaSAqIDIsIDIpLCAxNilcbiAgICBhc3NlcnQoIWlzTmFOKGJ5dGUpLCAnSW52YWxpZCBoZXggc3RyaW5nJylcbiAgICBidWZbb2Zmc2V0ICsgaV0gPSBieXRlXG4gIH1cbiAgQnVmZmVyLl9jaGFyc1dyaXR0ZW4gPSBpICogMlxuICByZXR1cm4gaVxufVxuXG5mdW5jdGlvbiBfdXRmOFdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgdmFyIGNoYXJzV3JpdHRlbiA9IEJ1ZmZlci5fY2hhcnNXcml0dGVuID1cbiAgICBibGl0QnVmZmVyKHV0ZjhUb0J5dGVzKHN0cmluZyksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG4gIHJldHVybiBjaGFyc1dyaXR0ZW5cbn1cblxuZnVuY3Rpb24gX2FzY2lpV3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICB2YXIgY2hhcnNXcml0dGVuID0gQnVmZmVyLl9jaGFyc1dyaXR0ZW4gPVxuICAgIGJsaXRCdWZmZXIoYXNjaWlUb0J5dGVzKHN0cmluZyksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG4gIHJldHVybiBjaGFyc1dyaXR0ZW5cbn1cblxuZnVuY3Rpb24gX2JpbmFyeVdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIF9hc2NpaVdyaXRlKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gX2Jhc2U2NFdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgdmFyIGNoYXJzV3JpdHRlbiA9IEJ1ZmZlci5fY2hhcnNXcml0dGVuID1cbiAgICBibGl0QnVmZmVyKGJhc2U2NFRvQnl0ZXMoc3RyaW5nKSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbiAgcmV0dXJuIGNoYXJzV3JpdHRlblxufVxuXG5mdW5jdGlvbiBfdXRmMTZsZVdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgdmFyIGNoYXJzV3JpdHRlbiA9IEJ1ZmZlci5fY2hhcnNXcml0dGVuID1cbiAgICBibGl0QnVmZmVyKHV0ZjE2bGVUb0J5dGVzKHN0cmluZyksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG4gIHJldHVybiBjaGFyc1dyaXR0ZW5cbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uIChzdHJpbmcsIG9mZnNldCwgbGVuZ3RoLCBlbmNvZGluZykge1xuICAvLyBTdXBwb3J0IGJvdGggKHN0cmluZywgb2Zmc2V0LCBsZW5ndGgsIGVuY29kaW5nKVxuICAvLyBhbmQgdGhlIGxlZ2FjeSAoc3RyaW5nLCBlbmNvZGluZywgb2Zmc2V0LCBsZW5ndGgpXG4gIGlmIChpc0Zpbml0ZShvZmZzZXQpKSB7XG4gICAgaWYgKCFpc0Zpbml0ZShsZW5ndGgpKSB7XG4gICAgICBlbmNvZGluZyA9IGxlbmd0aFxuICAgICAgbGVuZ3RoID0gdW5kZWZpbmVkXG4gICAgfVxuICB9IGVsc2UgeyAgLy8gbGVnYWN5XG4gICAgdmFyIHN3YXAgPSBlbmNvZGluZ1xuICAgIGVuY29kaW5nID0gb2Zmc2V0XG4gICAgb2Zmc2V0ID0gbGVuZ3RoXG4gICAgbGVuZ3RoID0gc3dhcFxuICB9XG5cbiAgb2Zmc2V0ID0gTnVtYmVyKG9mZnNldCkgfHwgMFxuICB2YXIgcmVtYWluaW5nID0gdGhpcy5sZW5ndGggLSBvZmZzZXRcbiAgaWYgKCFsZW5ndGgpIHtcbiAgICBsZW5ndGggPSByZW1haW5pbmdcbiAgfSBlbHNlIHtcbiAgICBsZW5ndGggPSBOdW1iZXIobGVuZ3RoKVxuICAgIGlmIChsZW5ndGggPiByZW1haW5pbmcpIHtcbiAgICAgIGxlbmd0aCA9IHJlbWFpbmluZ1xuICAgIH1cbiAgfVxuICBlbmNvZGluZyA9IFN0cmluZyhlbmNvZGluZyB8fCAndXRmOCcpLnRvTG93ZXJDYXNlKClcblxuICB2YXIgcmV0XG4gIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICBjYXNlICdoZXgnOlxuICAgICAgcmV0ID0gX2hleFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG4gICAgICBicmVha1xuICAgIGNhc2UgJ3V0ZjgnOlxuICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgIHJldCA9IF91dGY4V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcbiAgICAgIGJyZWFrXG4gICAgY2FzZSAnYXNjaWknOlxuICAgICAgcmV0ID0gX2FzY2lpV3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcbiAgICAgIGJyZWFrXG4gICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgIHJldCA9IF9iaW5hcnlXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuICAgICAgYnJlYWtcbiAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgcmV0ID0gX2Jhc2U2NFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG4gICAgICBicmVha1xuICAgIGNhc2UgJ3VjczInOlxuICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICBjYXNlICd1dGYxNmxlJzpcbiAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICByZXQgPSBfdXRmMTZsZVdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG4gICAgICBicmVha1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gZW5jb2RpbmcnKVxuICB9XG4gIHJldHVybiByZXRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIChlbmNvZGluZywgc3RhcnQsIGVuZCkge1xuICB2YXIgc2VsZiA9IHRoaXNcblxuICBlbmNvZGluZyA9IFN0cmluZyhlbmNvZGluZyB8fCAndXRmOCcpLnRvTG93ZXJDYXNlKClcbiAgc3RhcnQgPSBOdW1iZXIoc3RhcnQpIHx8IDBcbiAgZW5kID0gKGVuZCAhPT0gdW5kZWZpbmVkKVxuICAgID8gTnVtYmVyKGVuZClcbiAgICA6IGVuZCA9IHNlbGYubGVuZ3RoXG5cbiAgLy8gRmFzdHBhdGggZW1wdHkgc3RyaW5nc1xuICBpZiAoZW5kID09PSBzdGFydClcbiAgICByZXR1cm4gJydcblxuICB2YXIgcmV0XG4gIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICBjYXNlICdoZXgnOlxuICAgICAgcmV0ID0gX2hleFNsaWNlKHNlbGYsIHN0YXJ0LCBlbmQpXG4gICAgICBicmVha1xuICAgIGNhc2UgJ3V0ZjgnOlxuICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgIHJldCA9IF91dGY4U2xpY2Uoc2VsZiwgc3RhcnQsIGVuZClcbiAgICAgIGJyZWFrXG4gICAgY2FzZSAnYXNjaWknOlxuICAgICAgcmV0ID0gX2FzY2lpU2xpY2Uoc2VsZiwgc3RhcnQsIGVuZClcbiAgICAgIGJyZWFrXG4gICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgIHJldCA9IF9iaW5hcnlTbGljZShzZWxmLCBzdGFydCwgZW5kKVxuICAgICAgYnJlYWtcbiAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgcmV0ID0gX2Jhc2U2NFNsaWNlKHNlbGYsIHN0YXJ0LCBlbmQpXG4gICAgICBicmVha1xuICAgIGNhc2UgJ3VjczInOlxuICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICBjYXNlICd1dGYxNmxlJzpcbiAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICByZXQgPSBfdXRmMTZsZVNsaWNlKHNlbGYsIHN0YXJ0LCBlbmQpXG4gICAgICBicmVha1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gZW5jb2RpbmcnKVxuICB9XG4gIHJldHVybiByZXRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogJ0J1ZmZlcicsXG4gICAgZGF0YTogQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy5fYXJyIHx8IHRoaXMsIDApXG4gIH1cbn1cblxuLy8gY29weSh0YXJnZXRCdWZmZXIsIHRhcmdldFN0YXJ0PTAsIHNvdXJjZVN0YXJ0PTAsIHNvdXJjZUVuZD1idWZmZXIubGVuZ3RoKVxuQnVmZmVyLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKHRhcmdldCwgdGFyZ2V0X3N0YXJ0LCBzdGFydCwgZW5kKSB7XG4gIHZhciBzb3VyY2UgPSB0aGlzXG5cbiAgaWYgKCFzdGFydCkgc3RhcnQgPSAwXG4gIGlmICghZW5kICYmIGVuZCAhPT0gMCkgZW5kID0gdGhpcy5sZW5ndGhcbiAgaWYgKCF0YXJnZXRfc3RhcnQpIHRhcmdldF9zdGFydCA9IDBcblxuICAvLyBDb3B5IDAgYnl0ZXM7IHdlJ3JlIGRvbmVcbiAgaWYgKGVuZCA9PT0gc3RhcnQpIHJldHVyblxuICBpZiAodGFyZ2V0Lmxlbmd0aCA9PT0gMCB8fCBzb3VyY2UubGVuZ3RoID09PSAwKSByZXR1cm5cblxuICAvLyBGYXRhbCBlcnJvciBjb25kaXRpb25zXG4gIGFzc2VydChlbmQgPj0gc3RhcnQsICdzb3VyY2VFbmQgPCBzb3VyY2VTdGFydCcpXG4gIGFzc2VydCh0YXJnZXRfc3RhcnQgPj0gMCAmJiB0YXJnZXRfc3RhcnQgPCB0YXJnZXQubGVuZ3RoLFxuICAgICAgJ3RhcmdldFN0YXJ0IG91dCBvZiBib3VuZHMnKVxuICBhc3NlcnQoc3RhcnQgPj0gMCAmJiBzdGFydCA8IHNvdXJjZS5sZW5ndGgsICdzb3VyY2VTdGFydCBvdXQgb2YgYm91bmRzJylcbiAgYXNzZXJ0KGVuZCA+PSAwICYmIGVuZCA8PSBzb3VyY2UubGVuZ3RoLCAnc291cmNlRW5kIG91dCBvZiBib3VuZHMnKVxuXG4gIC8vIEFyZSB3ZSBvb2I/XG4gIGlmIChlbmQgPiB0aGlzLmxlbmd0aClcbiAgICBlbmQgPSB0aGlzLmxlbmd0aFxuICBpZiAodGFyZ2V0Lmxlbmd0aCAtIHRhcmdldF9zdGFydCA8IGVuZCAtIHN0YXJ0KVxuICAgIGVuZCA9IHRhcmdldC5sZW5ndGggLSB0YXJnZXRfc3RhcnQgKyBzdGFydFxuXG4gIHZhciBsZW4gPSBlbmQgLSBzdGFydFxuXG4gIGlmIChsZW4gPCAxMDAgfHwgIUJ1ZmZlci5fdXNlVHlwZWRBcnJheXMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKVxuICAgICAgdGFyZ2V0W2kgKyB0YXJnZXRfc3RhcnRdID0gdGhpc1tpICsgc3RhcnRdXG4gIH0gZWxzZSB7XG4gICAgdGFyZ2V0Ll9zZXQodGhpcy5zdWJhcnJheShzdGFydCwgc3RhcnQgKyBsZW4pLCB0YXJnZXRfc3RhcnQpXG4gIH1cbn1cblxuZnVuY3Rpb24gX2Jhc2U2NFNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgaWYgKHN0YXJ0ID09PSAwICYmIGVuZCA9PT0gYnVmLmxlbmd0aCkge1xuICAgIHJldHVybiBiYXNlNjQuZnJvbUJ5dGVBcnJheShidWYpXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGJhc2U2NC5mcm9tQnl0ZUFycmF5KGJ1Zi5zbGljZShzdGFydCwgZW5kKSlcbiAgfVxufVxuXG5mdW5jdGlvbiBfdXRmOFNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIHJlcyA9ICcnXG4gIHZhciB0bXAgPSAnJ1xuICBlbmQgPSBNYXRoLm1pbihidWYubGVuZ3RoLCBlbmQpXG5cbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHtcbiAgICBpZiAoYnVmW2ldIDw9IDB4N0YpIHtcbiAgICAgIHJlcyArPSBkZWNvZGVVdGY4Q2hhcih0bXApICsgU3RyaW5nLmZyb21DaGFyQ29kZShidWZbaV0pXG4gICAgICB0bXAgPSAnJ1xuICAgIH0gZWxzZSB7XG4gICAgICB0bXAgKz0gJyUnICsgYnVmW2ldLnRvU3RyaW5nKDE2KVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXMgKyBkZWNvZGVVdGY4Q2hhcih0bXApXG59XG5cbmZ1bmN0aW9uIF9hc2NpaVNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIHJldCA9ICcnXG4gIGVuZCA9IE1hdGgubWluKGJ1Zi5sZW5ndGgsIGVuZClcblxuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKylcbiAgICByZXQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShidWZbaV0pXG4gIHJldHVybiByZXRcbn1cblxuZnVuY3Rpb24gX2JpbmFyeVNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgcmV0dXJuIF9hc2NpaVNsaWNlKGJ1Ziwgc3RhcnQsIGVuZClcbn1cblxuZnVuY3Rpb24gX2hleFNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGxlbiA9IGJ1Zi5sZW5ndGhcblxuICBpZiAoIXN0YXJ0IHx8IHN0YXJ0IDwgMCkgc3RhcnQgPSAwXG4gIGlmICghZW5kIHx8IGVuZCA8IDAgfHwgZW5kID4gbGVuKSBlbmQgPSBsZW5cblxuICB2YXIgb3V0ID0gJydcbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHtcbiAgICBvdXQgKz0gdG9IZXgoYnVmW2ldKVxuICB9XG4gIHJldHVybiBvdXRcbn1cblxuZnVuY3Rpb24gX3V0ZjE2bGVTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIHZhciBieXRlcyA9IGJ1Zi5zbGljZShzdGFydCwgZW5kKVxuICB2YXIgcmVzID0gJydcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkgKz0gMikge1xuICAgIHJlcyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ5dGVzW2ldICsgYnl0ZXNbaSsxXSAqIDI1NilcbiAgfVxuICByZXR1cm4gcmVzXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuc2xpY2UgPSBmdW5jdGlvbiAoc3RhcnQsIGVuZCkge1xuICB2YXIgbGVuID0gdGhpcy5sZW5ndGhcbiAgc3RhcnQgPSBjbGFtcChzdGFydCwgbGVuLCAwKVxuICBlbmQgPSBjbGFtcChlbmQsIGxlbiwgbGVuKVxuXG4gIGlmIChCdWZmZXIuX3VzZVR5cGVkQXJyYXlzKSB7XG4gICAgcmV0dXJuIEJ1ZmZlci5fYXVnbWVudCh0aGlzLnN1YmFycmF5KHN0YXJ0LCBlbmQpKVxuICB9IGVsc2Uge1xuICAgIHZhciBzbGljZUxlbiA9IGVuZCAtIHN0YXJ0XG4gICAgdmFyIG5ld0J1ZiA9IG5ldyBCdWZmZXIoc2xpY2VMZW4sIHVuZGVmaW5lZCwgdHJ1ZSlcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNsaWNlTGVuOyBpKyspIHtcbiAgICAgIG5ld0J1ZltpXSA9IHRoaXNbaSArIHN0YXJ0XVxuICAgIH1cbiAgICByZXR1cm4gbmV3QnVmXG4gIH1cbn1cblxuLy8gYGdldGAgd2lsbCBiZSByZW1vdmVkIGluIE5vZGUgMC4xMytcbkJ1ZmZlci5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKG9mZnNldCkge1xuICBjb25zb2xlLmxvZygnLmdldCgpIGlzIGRlcHJlY2F0ZWQuIEFjY2VzcyB1c2luZyBhcnJheSBpbmRleGVzIGluc3RlYWQuJylcbiAgcmV0dXJuIHRoaXMucmVhZFVJbnQ4KG9mZnNldClcbn1cblxuLy8gYHNldGAgd2lsbCBiZSByZW1vdmVkIGluIE5vZGUgMC4xMytcbkJ1ZmZlci5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gKHYsIG9mZnNldCkge1xuICBjb25zb2xlLmxvZygnLnNldCgpIGlzIGRlcHJlY2F0ZWQuIEFjY2VzcyB1c2luZyBhcnJheSBpbmRleGVzIGluc3RlYWQuJylcbiAgcmV0dXJuIHRoaXMud3JpdGVVSW50OCh2LCBvZmZzZXQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQ4ID0gZnVuY3Rpb24gKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGFzc2VydChvZmZzZXQgIT09IHVuZGVmaW5lZCAmJiBvZmZzZXQgIT09IG51bGwsICdtaXNzaW5nIG9mZnNldCcpXG4gICAgYXNzZXJ0KG9mZnNldCA8IHRoaXMubGVuZ3RoLCAnVHJ5aW5nIHRvIHJlYWQgYmV5b25kIGJ1ZmZlciBsZW5ndGgnKVxuICB9XG5cbiAgaWYgKG9mZnNldCA+PSB0aGlzLmxlbmd0aClcbiAgICByZXR1cm5cblxuICByZXR1cm4gdGhpc1tvZmZzZXRdXG59XG5cbmZ1bmN0aW9uIF9yZWFkVUludDE2IChidWYsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgYXNzZXJ0KHR5cGVvZiBsaXR0bGVFbmRpYW4gPT09ICdib29sZWFuJywgJ21pc3Npbmcgb3IgaW52YWxpZCBlbmRpYW4nKVxuICAgIGFzc2VydChvZmZzZXQgIT09IHVuZGVmaW5lZCAmJiBvZmZzZXQgIT09IG51bGwsICdtaXNzaW5nIG9mZnNldCcpXG4gICAgYXNzZXJ0KG9mZnNldCArIDEgPCBidWYubGVuZ3RoLCAnVHJ5aW5nIHRvIHJlYWQgYmV5b25kIGJ1ZmZlciBsZW5ndGgnKVxuICB9XG5cbiAgdmFyIGxlbiA9IGJ1Zi5sZW5ndGhcbiAgaWYgKG9mZnNldCA+PSBsZW4pXG4gICAgcmV0dXJuXG5cbiAgdmFyIHZhbFxuICBpZiAobGl0dGxlRW5kaWFuKSB7XG4gICAgdmFsID0gYnVmW29mZnNldF1cbiAgICBpZiAob2Zmc2V0ICsgMSA8IGxlbilcbiAgICAgIHZhbCB8PSBidWZbb2Zmc2V0ICsgMV0gPDwgOFxuICB9IGVsc2Uge1xuICAgIHZhbCA9IGJ1ZltvZmZzZXRdIDw8IDhcbiAgICBpZiAob2Zmc2V0ICsgMSA8IGxlbilcbiAgICAgIHZhbCB8PSBidWZbb2Zmc2V0ICsgMV1cbiAgfVxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQxNkxFID0gZnVuY3Rpb24gKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIF9yZWFkVUludDE2KHRoaXMsIG9mZnNldCwgdHJ1ZSwgbm9Bc3NlcnQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQxNkJFID0gZnVuY3Rpb24gKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIF9yZWFkVUludDE2KHRoaXMsIG9mZnNldCwgZmFsc2UsIG5vQXNzZXJ0KVxufVxuXG5mdW5jdGlvbiBfcmVhZFVJbnQzMiAoYnVmLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGFzc2VydCh0eXBlb2YgbGl0dGxlRW5kaWFuID09PSAnYm9vbGVhbicsICdtaXNzaW5nIG9yIGludmFsaWQgZW5kaWFuJylcbiAgICBhc3NlcnQob2Zmc2V0ICE9PSB1bmRlZmluZWQgJiYgb2Zmc2V0ICE9PSBudWxsLCAnbWlzc2luZyBvZmZzZXQnKVxuICAgIGFzc2VydChvZmZzZXQgKyAzIDwgYnVmLmxlbmd0aCwgJ1RyeWluZyB0byByZWFkIGJleW9uZCBidWZmZXIgbGVuZ3RoJylcbiAgfVxuXG4gIHZhciBsZW4gPSBidWYubGVuZ3RoXG4gIGlmIChvZmZzZXQgPj0gbGVuKVxuICAgIHJldHVyblxuXG4gIHZhciB2YWxcbiAgaWYgKGxpdHRsZUVuZGlhbikge1xuICAgIGlmIChvZmZzZXQgKyAyIDwgbGVuKVxuICAgICAgdmFsID0gYnVmW29mZnNldCArIDJdIDw8IDE2XG4gICAgaWYgKG9mZnNldCArIDEgPCBsZW4pXG4gICAgICB2YWwgfD0gYnVmW29mZnNldCArIDFdIDw8IDhcbiAgICB2YWwgfD0gYnVmW29mZnNldF1cbiAgICBpZiAob2Zmc2V0ICsgMyA8IGxlbilcbiAgICAgIHZhbCA9IHZhbCArIChidWZbb2Zmc2V0ICsgM10gPDwgMjQgPj4+IDApXG4gIH0gZWxzZSB7XG4gICAgaWYgKG9mZnNldCArIDEgPCBsZW4pXG4gICAgICB2YWwgPSBidWZbb2Zmc2V0ICsgMV0gPDwgMTZcbiAgICBpZiAob2Zmc2V0ICsgMiA8IGxlbilcbiAgICAgIHZhbCB8PSBidWZbb2Zmc2V0ICsgMl0gPDwgOFxuICAgIGlmIChvZmZzZXQgKyAzIDwgbGVuKVxuICAgICAgdmFsIHw9IGJ1ZltvZmZzZXQgKyAzXVxuICAgIHZhbCA9IHZhbCArIChidWZbb2Zmc2V0XSA8PCAyNCA+Pj4gMClcbiAgfVxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQzMkxFID0gZnVuY3Rpb24gKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIF9yZWFkVUludDMyKHRoaXMsIG9mZnNldCwgdHJ1ZSwgbm9Bc3NlcnQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQzMkJFID0gZnVuY3Rpb24gKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIF9yZWFkVUludDMyKHRoaXMsIG9mZnNldCwgZmFsc2UsIG5vQXNzZXJ0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQ4ID0gZnVuY3Rpb24gKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGFzc2VydChvZmZzZXQgIT09IHVuZGVmaW5lZCAmJiBvZmZzZXQgIT09IG51bGwsXG4gICAgICAgICdtaXNzaW5nIG9mZnNldCcpXG4gICAgYXNzZXJ0KG9mZnNldCA8IHRoaXMubGVuZ3RoLCAnVHJ5aW5nIHRvIHJlYWQgYmV5b25kIGJ1ZmZlciBsZW5ndGgnKVxuICB9XG5cbiAgaWYgKG9mZnNldCA+PSB0aGlzLmxlbmd0aClcbiAgICByZXR1cm5cblxuICB2YXIgbmVnID0gdGhpc1tvZmZzZXRdICYgMHg4MFxuICBpZiAobmVnKVxuICAgIHJldHVybiAoMHhmZiAtIHRoaXNbb2Zmc2V0XSArIDEpICogLTFcbiAgZWxzZVxuICAgIHJldHVybiB0aGlzW29mZnNldF1cbn1cblxuZnVuY3Rpb24gX3JlYWRJbnQxNiAoYnVmLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGFzc2VydCh0eXBlb2YgbGl0dGxlRW5kaWFuID09PSAnYm9vbGVhbicsICdtaXNzaW5nIG9yIGludmFsaWQgZW5kaWFuJylcbiAgICBhc3NlcnQob2Zmc2V0ICE9PSB1bmRlZmluZWQgJiYgb2Zmc2V0ICE9PSBudWxsLCAnbWlzc2luZyBvZmZzZXQnKVxuICAgIGFzc2VydChvZmZzZXQgKyAxIDwgYnVmLmxlbmd0aCwgJ1RyeWluZyB0byByZWFkIGJleW9uZCBidWZmZXIgbGVuZ3RoJylcbiAgfVxuXG4gIHZhciBsZW4gPSBidWYubGVuZ3RoXG4gIGlmIChvZmZzZXQgPj0gbGVuKVxuICAgIHJldHVyblxuXG4gIHZhciB2YWwgPSBfcmVhZFVJbnQxNihidWYsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCB0cnVlKVxuICB2YXIgbmVnID0gdmFsICYgMHg4MDAwXG4gIGlmIChuZWcpXG4gICAgcmV0dXJuICgweGZmZmYgLSB2YWwgKyAxKSAqIC0xXG4gIGVsc2VcbiAgICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDE2TEUgPSBmdW5jdGlvbiAob2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gX3JlYWRJbnQxNih0aGlzLCBvZmZzZXQsIHRydWUsIG5vQXNzZXJ0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQxNkJFID0gZnVuY3Rpb24gKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIF9yZWFkSW50MTYodGhpcywgb2Zmc2V0LCBmYWxzZSwgbm9Bc3NlcnQpXG59XG5cbmZ1bmN0aW9uIF9yZWFkSW50MzIgKGJ1Ziwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICBhc3NlcnQodHlwZW9mIGxpdHRsZUVuZGlhbiA9PT0gJ2Jvb2xlYW4nLCAnbWlzc2luZyBvciBpbnZhbGlkIGVuZGlhbicpXG4gICAgYXNzZXJ0KG9mZnNldCAhPT0gdW5kZWZpbmVkICYmIG9mZnNldCAhPT0gbnVsbCwgJ21pc3Npbmcgb2Zmc2V0JylcbiAgICBhc3NlcnQob2Zmc2V0ICsgMyA8IGJ1Zi5sZW5ndGgsICdUcnlpbmcgdG8gcmVhZCBiZXlvbmQgYnVmZmVyIGxlbmd0aCcpXG4gIH1cblxuICB2YXIgbGVuID0gYnVmLmxlbmd0aFxuICBpZiAob2Zmc2V0ID49IGxlbilcbiAgICByZXR1cm5cblxuICB2YXIgdmFsID0gX3JlYWRVSW50MzIoYnVmLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgdHJ1ZSlcbiAgdmFyIG5lZyA9IHZhbCAmIDB4ODAwMDAwMDBcbiAgaWYgKG5lZylcbiAgICByZXR1cm4gKDB4ZmZmZmZmZmYgLSB2YWwgKyAxKSAqIC0xXG4gIGVsc2VcbiAgICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDMyTEUgPSBmdW5jdGlvbiAob2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gX3JlYWRJbnQzMih0aGlzLCBvZmZzZXQsIHRydWUsIG5vQXNzZXJ0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQzMkJFID0gZnVuY3Rpb24gKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIF9yZWFkSW50MzIodGhpcywgb2Zmc2V0LCBmYWxzZSwgbm9Bc3NlcnQpXG59XG5cbmZ1bmN0aW9uIF9yZWFkRmxvYXQgKGJ1Ziwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICBhc3NlcnQodHlwZW9mIGxpdHRsZUVuZGlhbiA9PT0gJ2Jvb2xlYW4nLCAnbWlzc2luZyBvciBpbnZhbGlkIGVuZGlhbicpXG4gICAgYXNzZXJ0KG9mZnNldCArIDMgPCBidWYubGVuZ3RoLCAnVHJ5aW5nIHRvIHJlYWQgYmV5b25kIGJ1ZmZlciBsZW5ndGgnKVxuICB9XG5cbiAgcmV0dXJuIGllZWU3NTQucmVhZChidWYsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCAyMywgNClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRmxvYXRMRSA9IGZ1bmN0aW9uIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiBfcmVhZEZsb2F0KHRoaXMsIG9mZnNldCwgdHJ1ZSwgbm9Bc3NlcnQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEZsb2F0QkUgPSBmdW5jdGlvbiAob2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gX3JlYWRGbG9hdCh0aGlzLCBvZmZzZXQsIGZhbHNlLCBub0Fzc2VydClcbn1cblxuZnVuY3Rpb24gX3JlYWREb3VibGUgKGJ1Ziwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICBhc3NlcnQodHlwZW9mIGxpdHRsZUVuZGlhbiA9PT0gJ2Jvb2xlYW4nLCAnbWlzc2luZyBvciBpbnZhbGlkIGVuZGlhbicpXG4gICAgYXNzZXJ0KG9mZnNldCArIDcgPCBidWYubGVuZ3RoLCAnVHJ5aW5nIHRvIHJlYWQgYmV5b25kIGJ1ZmZlciBsZW5ndGgnKVxuICB9XG5cbiAgcmV0dXJuIGllZWU3NTQucmVhZChidWYsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCA1MiwgOClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRG91YmxlTEUgPSBmdW5jdGlvbiAob2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gX3JlYWREb3VibGUodGhpcywgb2Zmc2V0LCB0cnVlLCBub0Fzc2VydClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRG91YmxlQkUgPSBmdW5jdGlvbiAob2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gX3JlYWREb3VibGUodGhpcywgb2Zmc2V0LCBmYWxzZSwgbm9Bc3NlcnQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50OCA9IGZ1bmN0aW9uICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgYXNzZXJ0KHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IG51bGwsICdtaXNzaW5nIHZhbHVlJylcbiAgICBhc3NlcnQob2Zmc2V0ICE9PSB1bmRlZmluZWQgJiYgb2Zmc2V0ICE9PSBudWxsLCAnbWlzc2luZyBvZmZzZXQnKVxuICAgIGFzc2VydChvZmZzZXQgPCB0aGlzLmxlbmd0aCwgJ3RyeWluZyB0byB3cml0ZSBiZXlvbmQgYnVmZmVyIGxlbmd0aCcpXG4gICAgdmVyaWZ1aW50KHZhbHVlLCAweGZmKVxuICB9XG5cbiAgaWYgKG9mZnNldCA+PSB0aGlzLmxlbmd0aCkgcmV0dXJuXG5cbiAgdGhpc1tvZmZzZXRdID0gdmFsdWVcbn1cblxuZnVuY3Rpb24gX3dyaXRlVUludDE2IChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGFzc2VydCh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSBudWxsLCAnbWlzc2luZyB2YWx1ZScpXG4gICAgYXNzZXJ0KHR5cGVvZiBsaXR0bGVFbmRpYW4gPT09ICdib29sZWFuJywgJ21pc3Npbmcgb3IgaW52YWxpZCBlbmRpYW4nKVxuICAgIGFzc2VydChvZmZzZXQgIT09IHVuZGVmaW5lZCAmJiBvZmZzZXQgIT09IG51bGwsICdtaXNzaW5nIG9mZnNldCcpXG4gICAgYXNzZXJ0KG9mZnNldCArIDEgPCBidWYubGVuZ3RoLCAndHJ5aW5nIHRvIHdyaXRlIGJleW9uZCBidWZmZXIgbGVuZ3RoJylcbiAgICB2ZXJpZnVpbnQodmFsdWUsIDB4ZmZmZilcbiAgfVxuXG4gIHZhciBsZW4gPSBidWYubGVuZ3RoXG4gIGlmIChvZmZzZXQgPj0gbGVuKVxuICAgIHJldHVyblxuXG4gIGZvciAodmFyIGkgPSAwLCBqID0gTWF0aC5taW4obGVuIC0gb2Zmc2V0LCAyKTsgaSA8IGo7IGkrKykge1xuICAgIGJ1ZltvZmZzZXQgKyBpXSA9XG4gICAgICAgICh2YWx1ZSAmICgweGZmIDw8ICg4ICogKGxpdHRsZUVuZGlhbiA/IGkgOiAxIC0gaSkpKSkgPj4+XG4gICAgICAgICAgICAobGl0dGxlRW5kaWFuID8gaSA6IDEgLSBpKSAqIDhcbiAgfVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDE2TEUgPSBmdW5jdGlvbiAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgX3dyaXRlVUludDE2KHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUsIG5vQXNzZXJ0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDE2QkUgPSBmdW5jdGlvbiAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgX3dyaXRlVUludDE2KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlLCBub0Fzc2VydClcbn1cblxuZnVuY3Rpb24gX3dyaXRlVUludDMyIChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGFzc2VydCh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSBudWxsLCAnbWlzc2luZyB2YWx1ZScpXG4gICAgYXNzZXJ0KHR5cGVvZiBsaXR0bGVFbmRpYW4gPT09ICdib29sZWFuJywgJ21pc3Npbmcgb3IgaW52YWxpZCBlbmRpYW4nKVxuICAgIGFzc2VydChvZmZzZXQgIT09IHVuZGVmaW5lZCAmJiBvZmZzZXQgIT09IG51bGwsICdtaXNzaW5nIG9mZnNldCcpXG4gICAgYXNzZXJ0KG9mZnNldCArIDMgPCBidWYubGVuZ3RoLCAndHJ5aW5nIHRvIHdyaXRlIGJleW9uZCBidWZmZXIgbGVuZ3RoJylcbiAgICB2ZXJpZnVpbnQodmFsdWUsIDB4ZmZmZmZmZmYpXG4gIH1cblxuICB2YXIgbGVuID0gYnVmLmxlbmd0aFxuICBpZiAob2Zmc2V0ID49IGxlbilcbiAgICByZXR1cm5cblxuICBmb3IgKHZhciBpID0gMCwgaiA9IE1hdGgubWluKGxlbiAtIG9mZnNldCwgNCk7IGkgPCBqOyBpKyspIHtcbiAgICBidWZbb2Zmc2V0ICsgaV0gPVxuICAgICAgICAodmFsdWUgPj4+IChsaXR0bGVFbmRpYW4gPyBpIDogMyAtIGkpICogOCkgJiAweGZmXG4gIH1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQzMkxFID0gZnVuY3Rpb24gKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIF93cml0ZVVJbnQzMih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlLCBub0Fzc2VydClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQzMkJFID0gZnVuY3Rpb24gKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIF93cml0ZVVJbnQzMih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSwgbm9Bc3NlcnQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQ4ID0gZnVuY3Rpb24gKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICBhc3NlcnQodmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gbnVsbCwgJ21pc3NpbmcgdmFsdWUnKVxuICAgIGFzc2VydChvZmZzZXQgIT09IHVuZGVmaW5lZCAmJiBvZmZzZXQgIT09IG51bGwsICdtaXNzaW5nIG9mZnNldCcpXG4gICAgYXNzZXJ0KG9mZnNldCA8IHRoaXMubGVuZ3RoLCAnVHJ5aW5nIHRvIHdyaXRlIGJleW9uZCBidWZmZXIgbGVuZ3RoJylcbiAgICB2ZXJpZnNpbnQodmFsdWUsIDB4N2YsIC0weDgwKVxuICB9XG5cbiAgaWYgKG9mZnNldCA+PSB0aGlzLmxlbmd0aClcbiAgICByZXR1cm5cblxuICBpZiAodmFsdWUgPj0gMClcbiAgICB0aGlzLndyaXRlVUludDgodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpXG4gIGVsc2VcbiAgICB0aGlzLndyaXRlVUludDgoMHhmZiArIHZhbHVlICsgMSwgb2Zmc2V0LCBub0Fzc2VydClcbn1cblxuZnVuY3Rpb24gX3dyaXRlSW50MTYgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgYXNzZXJ0KHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IG51bGwsICdtaXNzaW5nIHZhbHVlJylcbiAgICBhc3NlcnQodHlwZW9mIGxpdHRsZUVuZGlhbiA9PT0gJ2Jvb2xlYW4nLCAnbWlzc2luZyBvciBpbnZhbGlkIGVuZGlhbicpXG4gICAgYXNzZXJ0KG9mZnNldCAhPT0gdW5kZWZpbmVkICYmIG9mZnNldCAhPT0gbnVsbCwgJ21pc3Npbmcgb2Zmc2V0JylcbiAgICBhc3NlcnQob2Zmc2V0ICsgMSA8IGJ1Zi5sZW5ndGgsICdUcnlpbmcgdG8gd3JpdGUgYmV5b25kIGJ1ZmZlciBsZW5ndGgnKVxuICAgIHZlcmlmc2ludCh2YWx1ZSwgMHg3ZmZmLCAtMHg4MDAwKVxuICB9XG5cbiAgdmFyIGxlbiA9IGJ1Zi5sZW5ndGhcbiAgaWYgKG9mZnNldCA+PSBsZW4pXG4gICAgcmV0dXJuXG5cbiAgaWYgKHZhbHVlID49IDApXG4gICAgX3dyaXRlVUludDE2KGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCBub0Fzc2VydClcbiAgZWxzZVxuICAgIF93cml0ZVVJbnQxNihidWYsIDB4ZmZmZiArIHZhbHVlICsgMSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIG5vQXNzZXJ0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MTZMRSA9IGZ1bmN0aW9uICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICBfd3JpdGVJbnQxNih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlLCBub0Fzc2VydClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDE2QkUgPSBmdW5jdGlvbiAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgX3dyaXRlSW50MTYodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UsIG5vQXNzZXJ0KVxufVxuXG5mdW5jdGlvbiBfd3JpdGVJbnQzMiAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICBhc3NlcnQodmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gbnVsbCwgJ21pc3NpbmcgdmFsdWUnKVxuICAgIGFzc2VydCh0eXBlb2YgbGl0dGxlRW5kaWFuID09PSAnYm9vbGVhbicsICdtaXNzaW5nIG9yIGludmFsaWQgZW5kaWFuJylcbiAgICBhc3NlcnQob2Zmc2V0ICE9PSB1bmRlZmluZWQgJiYgb2Zmc2V0ICE9PSBudWxsLCAnbWlzc2luZyBvZmZzZXQnKVxuICAgIGFzc2VydChvZmZzZXQgKyAzIDwgYnVmLmxlbmd0aCwgJ1RyeWluZyB0byB3cml0ZSBiZXlvbmQgYnVmZmVyIGxlbmd0aCcpXG4gICAgdmVyaWZzaW50KHZhbHVlLCAweDdmZmZmZmZmLCAtMHg4MDAwMDAwMClcbiAgfVxuXG4gIHZhciBsZW4gPSBidWYubGVuZ3RoXG4gIGlmIChvZmZzZXQgPj0gbGVuKVxuICAgIHJldHVyblxuXG4gIGlmICh2YWx1ZSA+PSAwKVxuICAgIF93cml0ZVVJbnQzMihidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgbm9Bc3NlcnQpXG4gIGVsc2VcbiAgICBfd3JpdGVVSW50MzIoYnVmLCAweGZmZmZmZmZmICsgdmFsdWUgKyAxLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgbm9Bc3NlcnQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQzMkxFID0gZnVuY3Rpb24gKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIF93cml0ZUludDMyKHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUsIG5vQXNzZXJ0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MzJCRSA9IGZ1bmN0aW9uICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICBfd3JpdGVJbnQzMih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSwgbm9Bc3NlcnQpXG59XG5cbmZ1bmN0aW9uIF93cml0ZUZsb2F0IChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGFzc2VydCh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSBudWxsLCAnbWlzc2luZyB2YWx1ZScpXG4gICAgYXNzZXJ0KHR5cGVvZiBsaXR0bGVFbmRpYW4gPT09ICdib29sZWFuJywgJ21pc3Npbmcgb3IgaW52YWxpZCBlbmRpYW4nKVxuICAgIGFzc2VydChvZmZzZXQgIT09IHVuZGVmaW5lZCAmJiBvZmZzZXQgIT09IG51bGwsICdtaXNzaW5nIG9mZnNldCcpXG4gICAgYXNzZXJ0KG9mZnNldCArIDMgPCBidWYubGVuZ3RoLCAnVHJ5aW5nIHRvIHdyaXRlIGJleW9uZCBidWZmZXIgbGVuZ3RoJylcbiAgICB2ZXJpZklFRUU3NTQodmFsdWUsIDMuNDAyODIzNDY2Mzg1Mjg4NmUrMzgsIC0zLjQwMjgyMzQ2NjM4NTI4ODZlKzM4KVxuICB9XG5cbiAgdmFyIGxlbiA9IGJ1Zi5sZW5ndGhcbiAgaWYgKG9mZnNldCA+PSBsZW4pXG4gICAgcmV0dXJuXG5cbiAgaWVlZTc1NC53cml0ZShidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgMjMsIDQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVGbG9hdExFID0gZnVuY3Rpb24gKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIF93cml0ZUZsb2F0KHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUsIG5vQXNzZXJ0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRmxvYXRCRSA9IGZ1bmN0aW9uICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICBfd3JpdGVGbG9hdCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSwgbm9Bc3NlcnQpXG59XG5cbmZ1bmN0aW9uIF93cml0ZURvdWJsZSAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICBhc3NlcnQodmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gbnVsbCwgJ21pc3NpbmcgdmFsdWUnKVxuICAgIGFzc2VydCh0eXBlb2YgbGl0dGxlRW5kaWFuID09PSAnYm9vbGVhbicsICdtaXNzaW5nIG9yIGludmFsaWQgZW5kaWFuJylcbiAgICBhc3NlcnQob2Zmc2V0ICE9PSB1bmRlZmluZWQgJiYgb2Zmc2V0ICE9PSBudWxsLCAnbWlzc2luZyBvZmZzZXQnKVxuICAgIGFzc2VydChvZmZzZXQgKyA3IDwgYnVmLmxlbmd0aCxcbiAgICAgICAgJ1RyeWluZyB0byB3cml0ZSBiZXlvbmQgYnVmZmVyIGxlbmd0aCcpXG4gICAgdmVyaWZJRUVFNzU0KHZhbHVlLCAxLjc5NzY5MzEzNDg2MjMxNTdFKzMwOCwgLTEuNzk3NjkzMTM0ODYyMzE1N0UrMzA4KVxuICB9XG5cbiAgdmFyIGxlbiA9IGJ1Zi5sZW5ndGhcbiAgaWYgKG9mZnNldCA+PSBsZW4pXG4gICAgcmV0dXJuXG5cbiAgaWVlZTc1NC53cml0ZShidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgNTIsIDgpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVEb3VibGVMRSA9IGZ1bmN0aW9uICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICBfd3JpdGVEb3VibGUodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSwgbm9Bc3NlcnQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVEb3VibGVCRSA9IGZ1bmN0aW9uICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICBfd3JpdGVEb3VibGUodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UsIG5vQXNzZXJ0KVxufVxuXG4vLyBmaWxsKHZhbHVlLCBzdGFydD0wLCBlbmQ9YnVmZmVyLmxlbmd0aClcbkJ1ZmZlci5wcm90b3R5cGUuZmlsbCA9IGZ1bmN0aW9uICh2YWx1ZSwgc3RhcnQsIGVuZCkge1xuICBpZiAoIXZhbHVlKSB2YWx1ZSA9IDBcbiAgaWYgKCFzdGFydCkgc3RhcnQgPSAwXG4gIGlmICghZW5kKSBlbmQgPSB0aGlzLmxlbmd0aFxuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgdmFsdWUgPSB2YWx1ZS5jaGFyQ29kZUF0KDApXG4gIH1cblxuICBhc3NlcnQodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiAhaXNOYU4odmFsdWUpLCAndmFsdWUgaXMgbm90IGEgbnVtYmVyJylcbiAgYXNzZXJ0KGVuZCA+PSBzdGFydCwgJ2VuZCA8IHN0YXJ0JylcblxuICAvLyBGaWxsIDAgYnl0ZXM7IHdlJ3JlIGRvbmVcbiAgaWYgKGVuZCA9PT0gc3RhcnQpIHJldHVyblxuICBpZiAodGhpcy5sZW5ndGggPT09IDApIHJldHVyblxuXG4gIGFzc2VydChzdGFydCA+PSAwICYmIHN0YXJ0IDwgdGhpcy5sZW5ndGgsICdzdGFydCBvdXQgb2YgYm91bmRzJylcbiAgYXNzZXJ0KGVuZCA+PSAwICYmIGVuZCA8PSB0aGlzLmxlbmd0aCwgJ2VuZCBvdXQgb2YgYm91bmRzJylcblxuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykge1xuICAgIHRoaXNbaV0gPSB2YWx1ZVxuICB9XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuaW5zcGVjdCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIG91dCA9IFtdXG4gIHZhciBsZW4gPSB0aGlzLmxlbmd0aFxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgb3V0W2ldID0gdG9IZXgodGhpc1tpXSlcbiAgICBpZiAoaSA9PT0gZXhwb3J0cy5JTlNQRUNUX01BWF9CWVRFUykge1xuICAgICAgb3V0W2kgKyAxXSA9ICcuLi4nXG4gICAgICBicmVha1xuICAgIH1cbiAgfVxuICByZXR1cm4gJzxCdWZmZXIgJyArIG91dC5qb2luKCcgJykgKyAnPidcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IGBBcnJheUJ1ZmZlcmAgd2l0aCB0aGUgKmNvcGllZCogbWVtb3J5IG9mIHRoZSBidWZmZXIgaW5zdGFuY2UuXG4gKiBBZGRlZCBpbiBOb2RlIDAuMTIuIE9ubHkgYXZhaWxhYmxlIGluIGJyb3dzZXJzIHRoYXQgc3VwcG9ydCBBcnJheUJ1ZmZlci5cbiAqL1xuQnVmZmVyLnByb3RvdHlwZS50b0FycmF5QnVmZmVyID0gZnVuY3Rpb24gKCkge1xuICBpZiAodHlwZW9mIFVpbnQ4QXJyYXkgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgaWYgKEJ1ZmZlci5fdXNlVHlwZWRBcnJheXMpIHtcbiAgICAgIHJldHVybiAobmV3IEJ1ZmZlcih0aGlzKSkuYnVmZmVyXG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBidWYgPSBuZXcgVWludDhBcnJheSh0aGlzLmxlbmd0aClcbiAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBidWYubGVuZ3RoOyBpIDwgbGVuOyBpICs9IDEpXG4gICAgICAgIGJ1ZltpXSA9IHRoaXNbaV1cbiAgICAgIHJldHVybiBidWYuYnVmZmVyXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcignQnVmZmVyLnRvQXJyYXlCdWZmZXIgbm90IHN1cHBvcnRlZCBpbiB0aGlzIGJyb3dzZXInKVxuICB9XG59XG5cbi8vIEhFTFBFUiBGVU5DVElPTlNcbi8vID09PT09PT09PT09PT09PT1cblxuZnVuY3Rpb24gc3RyaW5ndHJpbSAoc3RyKSB7XG4gIGlmIChzdHIudHJpbSkgcmV0dXJuIHN0ci50cmltKClcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC9eXFxzK3xcXHMrJC9nLCAnJylcbn1cblxudmFyIEJQID0gQnVmZmVyLnByb3RvdHlwZVxuXG4vKipcbiAqIEF1Z21lbnQgYSBVaW50OEFycmF5ICppbnN0YW5jZSogKG5vdCB0aGUgVWludDhBcnJheSBjbGFzcyEpIHdpdGggQnVmZmVyIG1ldGhvZHNcbiAqL1xuQnVmZmVyLl9hdWdtZW50ID0gZnVuY3Rpb24gKGFycikge1xuICBhcnIuX2lzQnVmZmVyID0gdHJ1ZVxuXG4gIC8vIHNhdmUgcmVmZXJlbmNlIHRvIG9yaWdpbmFsIFVpbnQ4QXJyYXkgZ2V0L3NldCBtZXRob2RzIGJlZm9yZSBvdmVyd3JpdGluZ1xuICBhcnIuX2dldCA9IGFyci5nZXRcbiAgYXJyLl9zZXQgPSBhcnIuc2V0XG5cbiAgLy8gZGVwcmVjYXRlZCwgd2lsbCBiZSByZW1vdmVkIGluIG5vZGUgMC4xMytcbiAgYXJyLmdldCA9IEJQLmdldFxuICBhcnIuc2V0ID0gQlAuc2V0XG5cbiAgYXJyLndyaXRlID0gQlAud3JpdGVcbiAgYXJyLnRvU3RyaW5nID0gQlAudG9TdHJpbmdcbiAgYXJyLnRvTG9jYWxlU3RyaW5nID0gQlAudG9TdHJpbmdcbiAgYXJyLnRvSlNPTiA9IEJQLnRvSlNPTlxuICBhcnIuY29weSA9IEJQLmNvcHlcbiAgYXJyLnNsaWNlID0gQlAuc2xpY2VcbiAgYXJyLnJlYWRVSW50OCA9IEJQLnJlYWRVSW50OFxuICBhcnIucmVhZFVJbnQxNkxFID0gQlAucmVhZFVJbnQxNkxFXG4gIGFyci5yZWFkVUludDE2QkUgPSBCUC5yZWFkVUludDE2QkVcbiAgYXJyLnJlYWRVSW50MzJMRSA9IEJQLnJlYWRVSW50MzJMRVxuICBhcnIucmVhZFVJbnQzMkJFID0gQlAucmVhZFVJbnQzMkJFXG4gIGFyci5yZWFkSW50OCA9IEJQLnJlYWRJbnQ4XG4gIGFyci5yZWFkSW50MTZMRSA9IEJQLnJlYWRJbnQxNkxFXG4gIGFyci5yZWFkSW50MTZCRSA9IEJQLnJlYWRJbnQxNkJFXG4gIGFyci5yZWFkSW50MzJMRSA9IEJQLnJlYWRJbnQzMkxFXG4gIGFyci5yZWFkSW50MzJCRSA9IEJQLnJlYWRJbnQzMkJFXG4gIGFyci5yZWFkRmxvYXRMRSA9IEJQLnJlYWRGbG9hdExFXG4gIGFyci5yZWFkRmxvYXRCRSA9IEJQLnJlYWRGbG9hdEJFXG4gIGFyci5yZWFkRG91YmxlTEUgPSBCUC5yZWFkRG91YmxlTEVcbiAgYXJyLnJlYWREb3VibGVCRSA9IEJQLnJlYWREb3VibGVCRVxuICBhcnIud3JpdGVVSW50OCA9IEJQLndyaXRlVUludDhcbiAgYXJyLndyaXRlVUludDE2TEUgPSBCUC53cml0ZVVJbnQxNkxFXG4gIGFyci53cml0ZVVJbnQxNkJFID0gQlAud3JpdGVVSW50MTZCRVxuICBhcnIud3JpdGVVSW50MzJMRSA9IEJQLndyaXRlVUludDMyTEVcbiAgYXJyLndyaXRlVUludDMyQkUgPSBCUC53cml0ZVVJbnQzMkJFXG4gIGFyci53cml0ZUludDggPSBCUC53cml0ZUludDhcbiAgYXJyLndyaXRlSW50MTZMRSA9IEJQLndyaXRlSW50MTZMRVxuICBhcnIud3JpdGVJbnQxNkJFID0gQlAud3JpdGVJbnQxNkJFXG4gIGFyci53cml0ZUludDMyTEUgPSBCUC53cml0ZUludDMyTEVcbiAgYXJyLndyaXRlSW50MzJCRSA9IEJQLndyaXRlSW50MzJCRVxuICBhcnIud3JpdGVGbG9hdExFID0gQlAud3JpdGVGbG9hdExFXG4gIGFyci53cml0ZUZsb2F0QkUgPSBCUC53cml0ZUZsb2F0QkVcbiAgYXJyLndyaXRlRG91YmxlTEUgPSBCUC53cml0ZURvdWJsZUxFXG4gIGFyci53cml0ZURvdWJsZUJFID0gQlAud3JpdGVEb3VibGVCRVxuICBhcnIuZmlsbCA9IEJQLmZpbGxcbiAgYXJyLmluc3BlY3QgPSBCUC5pbnNwZWN0XG4gIGFyci50b0FycmF5QnVmZmVyID0gQlAudG9BcnJheUJ1ZmZlclxuXG4gIHJldHVybiBhcnJcbn1cblxuLy8gc2xpY2Uoc3RhcnQsIGVuZClcbmZ1bmN0aW9uIGNsYW1wIChpbmRleCwgbGVuLCBkZWZhdWx0VmFsdWUpIHtcbiAgaWYgKHR5cGVvZiBpbmRleCAhPT0gJ251bWJlcicpIHJldHVybiBkZWZhdWx0VmFsdWVcbiAgaW5kZXggPSB+fmluZGV4OyAgLy8gQ29lcmNlIHRvIGludGVnZXIuXG4gIGlmIChpbmRleCA+PSBsZW4pIHJldHVybiBsZW5cbiAgaWYgKGluZGV4ID49IDApIHJldHVybiBpbmRleFxuICBpbmRleCArPSBsZW5cbiAgaWYgKGluZGV4ID49IDApIHJldHVybiBpbmRleFxuICByZXR1cm4gMFxufVxuXG5mdW5jdGlvbiBjb2VyY2UgKGxlbmd0aCkge1xuICAvLyBDb2VyY2UgbGVuZ3RoIHRvIGEgbnVtYmVyIChwb3NzaWJseSBOYU4pLCByb3VuZCB1cFxuICAvLyBpbiBjYXNlIGl0J3MgZnJhY3Rpb25hbCAoZS5nLiAxMjMuNDU2KSB0aGVuIGRvIGFcbiAgLy8gZG91YmxlIG5lZ2F0ZSB0byBjb2VyY2UgYSBOYU4gdG8gMC4gRWFzeSwgcmlnaHQ/XG4gIGxlbmd0aCA9IH5+TWF0aC5jZWlsKCtsZW5ndGgpXG4gIHJldHVybiBsZW5ndGggPCAwID8gMCA6IGxlbmd0aFxufVxuXG5mdW5jdGlvbiBpc0FycmF5IChzdWJqZWN0KSB7XG4gIHJldHVybiAoQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbiAoc3ViamVjdCkge1xuICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoc3ViamVjdCkgPT09ICdbb2JqZWN0IEFycmF5XSdcbiAgfSkoc3ViamVjdClcbn1cblxuZnVuY3Rpb24gaXNBcnJheWlzaCAoc3ViamVjdCkge1xuICByZXR1cm4gaXNBcnJheShzdWJqZWN0KSB8fCBCdWZmZXIuaXNCdWZmZXIoc3ViamVjdCkgfHxcbiAgICAgIHN1YmplY3QgJiYgdHlwZW9mIHN1YmplY3QgPT09ICdvYmplY3QnICYmXG4gICAgICB0eXBlb2Ygc3ViamVjdC5sZW5ndGggPT09ICdudW1iZXInXG59XG5cbmZ1bmN0aW9uIHRvSGV4IChuKSB7XG4gIGlmIChuIDwgMTYpIHJldHVybiAnMCcgKyBuLnRvU3RyaW5nKDE2KVxuICByZXR1cm4gbi50b1N0cmluZygxNilcbn1cblxuZnVuY3Rpb24gdXRmOFRvQnl0ZXMgKHN0cikge1xuICB2YXIgYnl0ZUFycmF5ID0gW11cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgYiA9IHN0ci5jaGFyQ29kZUF0KGkpXG4gICAgaWYgKGIgPD0gMHg3RilcbiAgICAgIGJ5dGVBcnJheS5wdXNoKHN0ci5jaGFyQ29kZUF0KGkpKVxuICAgIGVsc2Uge1xuICAgICAgdmFyIHN0YXJ0ID0gaVxuICAgICAgaWYgKGIgPj0gMHhEODAwICYmIGIgPD0gMHhERkZGKSBpKytcbiAgICAgIHZhciBoID0gZW5jb2RlVVJJQ29tcG9uZW50KHN0ci5zbGljZShzdGFydCwgaSsxKSkuc3Vic3RyKDEpLnNwbGl0KCclJylcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgaC5sZW5ndGg7IGorKylcbiAgICAgICAgYnl0ZUFycmF5LnB1c2gocGFyc2VJbnQoaFtqXSwgMTYpKVxuICAgIH1cbiAgfVxuICByZXR1cm4gYnl0ZUFycmF5XG59XG5cbmZ1bmN0aW9uIGFzY2lpVG9CeXRlcyAoc3RyKSB7XG4gIHZhciBieXRlQXJyYXkgPSBbXVxuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgIC8vIE5vZGUncyBjb2RlIHNlZW1zIHRvIGJlIGRvaW5nIHRoaXMgYW5kIG5vdCAmIDB4N0YuLlxuICAgIGJ5dGVBcnJheS5wdXNoKHN0ci5jaGFyQ29kZUF0KGkpICYgMHhGRilcbiAgfVxuICByZXR1cm4gYnl0ZUFycmF5XG59XG5cbmZ1bmN0aW9uIHV0ZjE2bGVUb0J5dGVzIChzdHIpIHtcbiAgdmFyIGMsIGhpLCBsb1xuICB2YXIgYnl0ZUFycmF5ID0gW11cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICBjID0gc3RyLmNoYXJDb2RlQXQoaSlcbiAgICBoaSA9IGMgPj4gOFxuICAgIGxvID0gYyAlIDI1NlxuICAgIGJ5dGVBcnJheS5wdXNoKGxvKVxuICAgIGJ5dGVBcnJheS5wdXNoKGhpKVxuICB9XG5cbiAgcmV0dXJuIGJ5dGVBcnJheVxufVxuXG5mdW5jdGlvbiBiYXNlNjRUb0J5dGVzIChzdHIpIHtcbiAgcmV0dXJuIGJhc2U2NC50b0J5dGVBcnJheShzdHIpXG59XG5cbmZ1bmN0aW9uIGJsaXRCdWZmZXIgKHNyYywgZHN0LCBvZmZzZXQsIGxlbmd0aCkge1xuICB2YXIgcG9zXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoKGkgKyBvZmZzZXQgPj0gZHN0Lmxlbmd0aCkgfHwgKGkgPj0gc3JjLmxlbmd0aCkpXG4gICAgICBicmVha1xuICAgIGRzdFtpICsgb2Zmc2V0XSA9IHNyY1tpXVxuICB9XG4gIHJldHVybiBpXG59XG5cbmZ1bmN0aW9uIGRlY29kZVV0ZjhDaGFyIChzdHIpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHN0cilcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoMHhGRkZEKSAvLyBVVEYgOCBpbnZhbGlkIGNoYXJcbiAgfVxufVxuXG4vKlxuICogV2UgaGF2ZSB0byBtYWtlIHN1cmUgdGhhdCB0aGUgdmFsdWUgaXMgYSB2YWxpZCBpbnRlZ2VyLiBUaGlzIG1lYW5zIHRoYXQgaXRcbiAqIGlzIG5vbi1uZWdhdGl2ZS4gSXQgaGFzIG5vIGZyYWN0aW9uYWwgY29tcG9uZW50IGFuZCB0aGF0IGl0IGRvZXMgbm90XG4gKiBleGNlZWQgdGhlIG1heGltdW0gYWxsb3dlZCB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gdmVyaWZ1aW50ICh2YWx1ZSwgbWF4KSB7XG4gIGFzc2VydCh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInLCAnY2Fubm90IHdyaXRlIGEgbm9uLW51bWJlciBhcyBhIG51bWJlcicpXG4gIGFzc2VydCh2YWx1ZSA+PSAwLCAnc3BlY2lmaWVkIGEgbmVnYXRpdmUgdmFsdWUgZm9yIHdyaXRpbmcgYW4gdW5zaWduZWQgdmFsdWUnKVxuICBhc3NlcnQodmFsdWUgPD0gbWF4LCAndmFsdWUgaXMgbGFyZ2VyIHRoYW4gbWF4aW11bSB2YWx1ZSBmb3IgdHlwZScpXG4gIGFzc2VydChNYXRoLmZsb29yKHZhbHVlKSA9PT0gdmFsdWUsICd2YWx1ZSBoYXMgYSBmcmFjdGlvbmFsIGNvbXBvbmVudCcpXG59XG5cbmZ1bmN0aW9uIHZlcmlmc2ludCAodmFsdWUsIG1heCwgbWluKSB7XG4gIGFzc2VydCh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInLCAnY2Fubm90IHdyaXRlIGEgbm9uLW51bWJlciBhcyBhIG51bWJlcicpXG4gIGFzc2VydCh2YWx1ZSA8PSBtYXgsICd2YWx1ZSBsYXJnZXIgdGhhbiBtYXhpbXVtIGFsbG93ZWQgdmFsdWUnKVxuICBhc3NlcnQodmFsdWUgPj0gbWluLCAndmFsdWUgc21hbGxlciB0aGFuIG1pbmltdW0gYWxsb3dlZCB2YWx1ZScpXG4gIGFzc2VydChNYXRoLmZsb29yKHZhbHVlKSA9PT0gdmFsdWUsICd2YWx1ZSBoYXMgYSBmcmFjdGlvbmFsIGNvbXBvbmVudCcpXG59XG5cbmZ1bmN0aW9uIHZlcmlmSUVFRTc1NCAodmFsdWUsIG1heCwgbWluKSB7XG4gIGFzc2VydCh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInLCAnY2Fubm90IHdyaXRlIGEgbm9uLW51bWJlciBhcyBhIG51bWJlcicpXG4gIGFzc2VydCh2YWx1ZSA8PSBtYXgsICd2YWx1ZSBsYXJnZXIgdGhhbiBtYXhpbXVtIGFsbG93ZWQgdmFsdWUnKVxuICBhc3NlcnQodmFsdWUgPj0gbWluLCAndmFsdWUgc21hbGxlciB0aGFuIG1pbmltdW0gYWxsb3dlZCB2YWx1ZScpXG59XG5cbmZ1bmN0aW9uIGFzc2VydCAodGVzdCwgbWVzc2FnZSkge1xuICBpZiAoIXRlc3QpIHRocm93IG5ldyBFcnJvcihtZXNzYWdlIHx8ICdGYWlsZWQgYXNzZXJ0aW9uJylcbn1cbiIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG5mdW5jdGlvbiBFdmVudEVtaXR0ZXIoKSB7XG4gIHRoaXMuX2V2ZW50cyA9IHRoaXMuX2V2ZW50cyB8fCB7fTtcbiAgdGhpcy5fbWF4TGlzdGVuZXJzID0gdGhpcy5fbWF4TGlzdGVuZXJzIHx8IHVuZGVmaW5lZDtcbn1cbm1vZHVsZS5leHBvcnRzID0gRXZlbnRFbWl0dGVyO1xuXG4vLyBCYWNrd2FyZHMtY29tcGF0IHdpdGggbm9kZSAwLjEwLnhcbkV2ZW50RW1pdHRlci5FdmVudEVtaXR0ZXIgPSBFdmVudEVtaXR0ZXI7XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuX2V2ZW50cyA9IHVuZGVmaW5lZDtcbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuX21heExpc3RlbmVycyA9IHVuZGVmaW5lZDtcblxuLy8gQnkgZGVmYXVsdCBFdmVudEVtaXR0ZXJzIHdpbGwgcHJpbnQgYSB3YXJuaW5nIGlmIG1vcmUgdGhhbiAxMCBsaXN0ZW5lcnMgYXJlXG4vLyBhZGRlZCB0byBpdC4gVGhpcyBpcyBhIHVzZWZ1bCBkZWZhdWx0IHdoaWNoIGhlbHBzIGZpbmRpbmcgbWVtb3J5IGxlYWtzLlxuRXZlbnRFbWl0dGVyLmRlZmF1bHRNYXhMaXN0ZW5lcnMgPSAxMDtcblxuLy8gT2J2aW91c2x5IG5vdCBhbGwgRW1pdHRlcnMgc2hvdWxkIGJlIGxpbWl0ZWQgdG8gMTAuIFRoaXMgZnVuY3Rpb24gYWxsb3dzXG4vLyB0aGF0IHRvIGJlIGluY3JlYXNlZC4gU2V0IHRvIHplcm8gZm9yIHVubGltaXRlZC5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuc2V0TWF4TGlzdGVuZXJzID0gZnVuY3Rpb24obikge1xuICBpZiAoIWlzTnVtYmVyKG4pIHx8IG4gPCAwIHx8IGlzTmFOKG4pKVxuICAgIHRocm93IFR5cGVFcnJvcignbiBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyJyk7XG4gIHRoaXMuX21heExpc3RlbmVycyA9IG47XG4gIHJldHVybiB0aGlzO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5lbWl0ID0gZnVuY3Rpb24odHlwZSkge1xuICB2YXIgZXIsIGhhbmRsZXIsIGxlbiwgYXJncywgaSwgbGlzdGVuZXJzO1xuXG4gIGlmICghdGhpcy5fZXZlbnRzKVxuICAgIHRoaXMuX2V2ZW50cyA9IHt9O1xuXG4gIC8vIElmIHRoZXJlIGlzIG5vICdlcnJvcicgZXZlbnQgbGlzdGVuZXIgdGhlbiB0aHJvdy5cbiAgaWYgKHR5cGUgPT09ICdlcnJvcicpIHtcbiAgICBpZiAoIXRoaXMuX2V2ZW50cy5lcnJvciB8fFxuICAgICAgICAoaXNPYmplY3QodGhpcy5fZXZlbnRzLmVycm9yKSAmJiAhdGhpcy5fZXZlbnRzLmVycm9yLmxlbmd0aCkpIHtcbiAgICAgIGVyID0gYXJndW1lbnRzWzFdO1xuICAgICAgaWYgKGVyIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgdGhyb3cgZXI7IC8vIFVuaGFuZGxlZCAnZXJyb3InIGV2ZW50XG4gICAgICB9XG4gICAgICB0aHJvdyBUeXBlRXJyb3IoJ1VuY2F1Z2h0LCB1bnNwZWNpZmllZCBcImVycm9yXCIgZXZlbnQuJyk7XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlciA9IHRoaXMuX2V2ZW50c1t0eXBlXTtcblxuICBpZiAoaXNVbmRlZmluZWQoaGFuZGxlcikpXG4gICAgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChpc0Z1bmN0aW9uKGhhbmRsZXIpKSB7XG4gICAgc3dpdGNoIChhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICAvLyBmYXN0IGNhc2VzXG4gICAgICBjYXNlIDE6XG4gICAgICAgIGhhbmRsZXIuY2FsbCh0aGlzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDI6XG4gICAgICAgIGhhbmRsZXIuY2FsbCh0aGlzLCBhcmd1bWVudHNbMV0pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMzpcbiAgICAgICAgaGFuZGxlci5jYWxsKHRoaXMsIGFyZ3VtZW50c1sxXSwgYXJndW1lbnRzWzJdKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICAvLyBzbG93ZXJcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgICAgIGFyZ3MgPSBuZXcgQXJyYXkobGVuIC0gMSk7XG4gICAgICAgIGZvciAoaSA9IDE7IGkgPCBsZW47IGkrKylcbiAgICAgICAgICBhcmdzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgaGFuZGxlci5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNPYmplY3QoaGFuZGxlcikpIHtcbiAgICBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIGFyZ3MgPSBuZXcgQXJyYXkobGVuIC0gMSk7XG4gICAgZm9yIChpID0gMTsgaSA8IGxlbjsgaSsrKVxuICAgICAgYXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07XG5cbiAgICBsaXN0ZW5lcnMgPSBoYW5kbGVyLnNsaWNlKCk7XG4gICAgbGVuID0gbGlzdGVuZXJzLmxlbmd0aDtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspXG4gICAgICBsaXN0ZW5lcnNbaV0uYXBwbHkodGhpcywgYXJncyk7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuYWRkTGlzdGVuZXIgPSBmdW5jdGlvbih0eXBlLCBsaXN0ZW5lcikge1xuICB2YXIgbTtcblxuICBpZiAoIWlzRnVuY3Rpb24obGlzdGVuZXIpKVxuICAgIHRocm93IFR5cGVFcnJvcignbGlzdGVuZXIgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG5cbiAgaWYgKCF0aGlzLl9ldmVudHMpXG4gICAgdGhpcy5fZXZlbnRzID0ge307XG5cbiAgLy8gVG8gYXZvaWQgcmVjdXJzaW9uIGluIHRoZSBjYXNlIHRoYXQgdHlwZSA9PT0gXCJuZXdMaXN0ZW5lclwiISBCZWZvcmVcbiAgLy8gYWRkaW5nIGl0IHRvIHRoZSBsaXN0ZW5lcnMsIGZpcnN0IGVtaXQgXCJuZXdMaXN0ZW5lclwiLlxuICBpZiAodGhpcy5fZXZlbnRzLm5ld0xpc3RlbmVyKVxuICAgIHRoaXMuZW1pdCgnbmV3TGlzdGVuZXInLCB0eXBlLFxuICAgICAgICAgICAgICBpc0Z1bmN0aW9uKGxpc3RlbmVyLmxpc3RlbmVyKSA/XG4gICAgICAgICAgICAgIGxpc3RlbmVyLmxpc3RlbmVyIDogbGlzdGVuZXIpO1xuXG4gIGlmICghdGhpcy5fZXZlbnRzW3R5cGVdKVxuICAgIC8vIE9wdGltaXplIHRoZSBjYXNlIG9mIG9uZSBsaXN0ZW5lci4gRG9uJ3QgbmVlZCB0aGUgZXh0cmEgYXJyYXkgb2JqZWN0LlxuICAgIHRoaXMuX2V2ZW50c1t0eXBlXSA9IGxpc3RlbmVyO1xuICBlbHNlIGlmIChpc09iamVjdCh0aGlzLl9ldmVudHNbdHlwZV0pKVxuICAgIC8vIElmIHdlJ3ZlIGFscmVhZHkgZ290IGFuIGFycmF5LCBqdXN0IGFwcGVuZC5cbiAgICB0aGlzLl9ldmVudHNbdHlwZV0ucHVzaChsaXN0ZW5lcik7XG4gIGVsc2VcbiAgICAvLyBBZGRpbmcgdGhlIHNlY29uZCBlbGVtZW50LCBuZWVkIHRvIGNoYW5nZSB0byBhcnJheS5cbiAgICB0aGlzLl9ldmVudHNbdHlwZV0gPSBbdGhpcy5fZXZlbnRzW3R5cGVdLCBsaXN0ZW5lcl07XG5cbiAgLy8gQ2hlY2sgZm9yIGxpc3RlbmVyIGxlYWtcbiAgaWYgKGlzT2JqZWN0KHRoaXMuX2V2ZW50c1t0eXBlXSkgJiYgIXRoaXMuX2V2ZW50c1t0eXBlXS53YXJuZWQpIHtcbiAgICB2YXIgbTtcbiAgICBpZiAoIWlzVW5kZWZpbmVkKHRoaXMuX21heExpc3RlbmVycykpIHtcbiAgICAgIG0gPSB0aGlzLl9tYXhMaXN0ZW5lcnM7XG4gICAgfSBlbHNlIHtcbiAgICAgIG0gPSBFdmVudEVtaXR0ZXIuZGVmYXVsdE1heExpc3RlbmVycztcbiAgICB9XG5cbiAgICBpZiAobSAmJiBtID4gMCAmJiB0aGlzLl9ldmVudHNbdHlwZV0ubGVuZ3RoID4gbSkge1xuICAgICAgdGhpcy5fZXZlbnRzW3R5cGVdLndhcm5lZCA9IHRydWU7XG4gICAgICBjb25zb2xlLmVycm9yKCcobm9kZSkgd2FybmluZzogcG9zc2libGUgRXZlbnRFbWl0dGVyIG1lbW9yeSAnICtcbiAgICAgICAgICAgICAgICAgICAgJ2xlYWsgZGV0ZWN0ZWQuICVkIGxpc3RlbmVycyBhZGRlZC4gJyArXG4gICAgICAgICAgICAgICAgICAgICdVc2UgZW1pdHRlci5zZXRNYXhMaXN0ZW5lcnMoKSB0byBpbmNyZWFzZSBsaW1pdC4nLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9ldmVudHNbdHlwZV0ubGVuZ3RoKTtcbiAgICAgIGlmICh0eXBlb2YgY29uc29sZS50cmFjZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBub3Qgc3VwcG9ydGVkIGluIElFIDEwXG4gICAgICAgIGNvbnNvbGUudHJhY2UoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUub24gPSBFdmVudEVtaXR0ZXIucHJvdG90eXBlLmFkZExpc3RlbmVyO1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLm9uY2UgPSBmdW5jdGlvbih0eXBlLCBsaXN0ZW5lcikge1xuICBpZiAoIWlzRnVuY3Rpb24obGlzdGVuZXIpKVxuICAgIHRocm93IFR5cGVFcnJvcignbGlzdGVuZXIgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG5cbiAgdmFyIGZpcmVkID0gZmFsc2U7XG5cbiAgZnVuY3Rpb24gZygpIHtcbiAgICB0aGlzLnJlbW92ZUxpc3RlbmVyKHR5cGUsIGcpO1xuXG4gICAgaWYgKCFmaXJlZCkge1xuICAgICAgZmlyZWQgPSB0cnVlO1xuICAgICAgbGlzdGVuZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9XG4gIH1cblxuICBnLmxpc3RlbmVyID0gbGlzdGVuZXI7XG4gIHRoaXMub24odHlwZSwgZyk7XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vLyBlbWl0cyBhICdyZW1vdmVMaXN0ZW5lcicgZXZlbnQgaWZmIHRoZSBsaXN0ZW5lciB3YXMgcmVtb3ZlZFxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lciA9IGZ1bmN0aW9uKHR5cGUsIGxpc3RlbmVyKSB7XG4gIHZhciBsaXN0LCBwb3NpdGlvbiwgbGVuZ3RoLCBpO1xuXG4gIGlmICghaXNGdW5jdGlvbihsaXN0ZW5lcikpXG4gICAgdGhyb3cgVHlwZUVycm9yKCdsaXN0ZW5lciBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcblxuICBpZiAoIXRoaXMuX2V2ZW50cyB8fCAhdGhpcy5fZXZlbnRzW3R5cGVdKVxuICAgIHJldHVybiB0aGlzO1xuXG4gIGxpc3QgPSB0aGlzLl9ldmVudHNbdHlwZV07XG4gIGxlbmd0aCA9IGxpc3QubGVuZ3RoO1xuICBwb3NpdGlvbiA9IC0xO1xuXG4gIGlmIChsaXN0ID09PSBsaXN0ZW5lciB8fFxuICAgICAgKGlzRnVuY3Rpb24obGlzdC5saXN0ZW5lcikgJiYgbGlzdC5saXN0ZW5lciA9PT0gbGlzdGVuZXIpKSB7XG4gICAgZGVsZXRlIHRoaXMuX2V2ZW50c1t0eXBlXTtcbiAgICBpZiAodGhpcy5fZXZlbnRzLnJlbW92ZUxpc3RlbmVyKVxuICAgICAgdGhpcy5lbWl0KCdyZW1vdmVMaXN0ZW5lcicsIHR5cGUsIGxpc3RlbmVyKTtcblxuICB9IGVsc2UgaWYgKGlzT2JqZWN0KGxpc3QpKSB7XG4gICAgZm9yIChpID0gbGVuZ3RoOyBpLS0gPiAwOykge1xuICAgICAgaWYgKGxpc3RbaV0gPT09IGxpc3RlbmVyIHx8XG4gICAgICAgICAgKGxpc3RbaV0ubGlzdGVuZXIgJiYgbGlzdFtpXS5saXN0ZW5lciA9PT0gbGlzdGVuZXIpKSB7XG4gICAgICAgIHBvc2l0aW9uID0gaTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHBvc2l0aW9uIDwgMClcbiAgICAgIHJldHVybiB0aGlzO1xuXG4gICAgaWYgKGxpc3QubGVuZ3RoID09PSAxKSB7XG4gICAgICBsaXN0Lmxlbmd0aCA9IDA7XG4gICAgICBkZWxldGUgdGhpcy5fZXZlbnRzW3R5cGVdO1xuICAgIH0gZWxzZSB7XG4gICAgICBsaXN0LnNwbGljZShwb3NpdGlvbiwgMSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2V2ZW50cy5yZW1vdmVMaXN0ZW5lcilcbiAgICAgIHRoaXMuZW1pdCgncmVtb3ZlTGlzdGVuZXInLCB0eXBlLCBsaXN0ZW5lcik7XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzID0gZnVuY3Rpb24odHlwZSkge1xuICB2YXIga2V5LCBsaXN0ZW5lcnM7XG5cbiAgaWYgKCF0aGlzLl9ldmVudHMpXG4gICAgcmV0dXJuIHRoaXM7XG5cbiAgLy8gbm90IGxpc3RlbmluZyBmb3IgcmVtb3ZlTGlzdGVuZXIsIG5vIG5lZWQgdG8gZW1pdFxuICBpZiAoIXRoaXMuX2V2ZW50cy5yZW1vdmVMaXN0ZW5lcikge1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKVxuICAgICAgdGhpcy5fZXZlbnRzID0ge307XG4gICAgZWxzZSBpZiAodGhpcy5fZXZlbnRzW3R5cGVdKVxuICAgICAgZGVsZXRlIHRoaXMuX2V2ZW50c1t0eXBlXTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIGVtaXQgcmVtb3ZlTGlzdGVuZXIgZm9yIGFsbCBsaXN0ZW5lcnMgb24gYWxsIGV2ZW50c1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgIGZvciAoa2V5IGluIHRoaXMuX2V2ZW50cykge1xuICAgICAgaWYgKGtleSA9PT0gJ3JlbW92ZUxpc3RlbmVyJykgY29udGludWU7XG4gICAgICB0aGlzLnJlbW92ZUFsbExpc3RlbmVycyhrZXkpO1xuICAgIH1cbiAgICB0aGlzLnJlbW92ZUFsbExpc3RlbmVycygncmVtb3ZlTGlzdGVuZXInKTtcbiAgICB0aGlzLl9ldmVudHMgPSB7fTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGxpc3RlbmVycyA9IHRoaXMuX2V2ZW50c1t0eXBlXTtcblxuICBpZiAoaXNGdW5jdGlvbihsaXN0ZW5lcnMpKSB7XG4gICAgdGhpcy5yZW1vdmVMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcnMpO1xuICB9IGVsc2Uge1xuICAgIC8vIExJRk8gb3JkZXJcbiAgICB3aGlsZSAobGlzdGVuZXJzLmxlbmd0aClcbiAgICAgIHRoaXMucmVtb3ZlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXJzW2xpc3RlbmVycy5sZW5ndGggLSAxXSk7XG4gIH1cbiAgZGVsZXRlIHRoaXMuX2V2ZW50c1t0eXBlXTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUubGlzdGVuZXJzID0gZnVuY3Rpb24odHlwZSkge1xuICB2YXIgcmV0O1xuICBpZiAoIXRoaXMuX2V2ZW50cyB8fCAhdGhpcy5fZXZlbnRzW3R5cGVdKVxuICAgIHJldCA9IFtdO1xuICBlbHNlIGlmIChpc0Z1bmN0aW9uKHRoaXMuX2V2ZW50c1t0eXBlXSkpXG4gICAgcmV0ID0gW3RoaXMuX2V2ZW50c1t0eXBlXV07XG4gIGVsc2VcbiAgICByZXQgPSB0aGlzLl9ldmVudHNbdHlwZV0uc2xpY2UoKTtcbiAgcmV0dXJuIHJldDtcbn07XG5cbkV2ZW50RW1pdHRlci5saXN0ZW5lckNvdW50ID0gZnVuY3Rpb24oZW1pdHRlciwgdHlwZSkge1xuICB2YXIgcmV0O1xuICBpZiAoIWVtaXR0ZXIuX2V2ZW50cyB8fCAhZW1pdHRlci5fZXZlbnRzW3R5cGVdKVxuICAgIHJldCA9IDA7XG4gIGVsc2UgaWYgKGlzRnVuY3Rpb24oZW1pdHRlci5fZXZlbnRzW3R5cGVdKSlcbiAgICByZXQgPSAxO1xuICBlbHNlXG4gICAgcmV0ID0gZW1pdHRlci5fZXZlbnRzW3R5cGVdLmxlbmd0aDtcbiAgcmV0dXJuIHJldDtcbn07XG5cbmZ1bmN0aW9uIGlzRnVuY3Rpb24oYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnZnVuY3Rpb24nO1xufVxuXG5mdW5jdGlvbiBpc051bWJlcihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdudW1iZXInO1xufVxuXG5mdW5jdGlvbiBpc09iamVjdChhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdvYmplY3QnICYmIGFyZyAhPT0gbnVsbDtcbn1cblxuZnVuY3Rpb24gaXNVbmRlZmluZWQoYXJnKSB7XG4gIHJldHVybiBhcmcgPT09IHZvaWQgMDtcbn1cbiIsImV4cG9ydHMucmVhZCA9IGZ1bmN0aW9uIChidWZmZXIsIG9mZnNldCwgaXNMRSwgbUxlbiwgbkJ5dGVzKSB7XG4gIHZhciBlLCBtXG4gIHZhciBlTGVuID0gKG5CeXRlcyAqIDgpIC0gbUxlbiAtIDFcbiAgdmFyIGVNYXggPSAoMSA8PCBlTGVuKSAtIDFcbiAgdmFyIGVCaWFzID0gZU1heCA+PiAxXG4gIHZhciBuQml0cyA9IC03XG4gIHZhciBpID0gaXNMRSA/IChuQnl0ZXMgLSAxKSA6IDBcbiAgdmFyIGQgPSBpc0xFID8gLTEgOiAxXG4gIHZhciBzID0gYnVmZmVyW29mZnNldCArIGldXG5cbiAgaSArPSBkXG5cbiAgZSA9IHMgJiAoKDEgPDwgKC1uQml0cykpIC0gMSlcbiAgcyA+Pj0gKC1uQml0cylcbiAgbkJpdHMgKz0gZUxlblxuICBmb3IgKDsgbkJpdHMgPiAwOyBlID0gKGUgKiAyNTYpICsgYnVmZmVyW29mZnNldCArIGldLCBpICs9IGQsIG5CaXRzIC09IDgpIHt9XG5cbiAgbSA9IGUgJiAoKDEgPDwgKC1uQml0cykpIC0gMSlcbiAgZSA+Pj0gKC1uQml0cylcbiAgbkJpdHMgKz0gbUxlblxuICBmb3IgKDsgbkJpdHMgPiAwOyBtID0gKG0gKiAyNTYpICsgYnVmZmVyW29mZnNldCArIGldLCBpICs9IGQsIG5CaXRzIC09IDgpIHt9XG5cbiAgaWYgKGUgPT09IDApIHtcbiAgICBlID0gMSAtIGVCaWFzXG4gIH0gZWxzZSBpZiAoZSA9PT0gZU1heCkge1xuICAgIHJldHVybiBtID8gTmFOIDogKChzID8gLTEgOiAxKSAqIEluZmluaXR5KVxuICB9IGVsc2Uge1xuICAgIG0gPSBtICsgTWF0aC5wb3coMiwgbUxlbilcbiAgICBlID0gZSAtIGVCaWFzXG4gIH1cbiAgcmV0dXJuIChzID8gLTEgOiAxKSAqIG0gKiBNYXRoLnBvdygyLCBlIC0gbUxlbilcbn1cblxuZXhwb3J0cy53cml0ZSA9IGZ1bmN0aW9uIChidWZmZXIsIHZhbHVlLCBvZmZzZXQsIGlzTEUsIG1MZW4sIG5CeXRlcykge1xuICB2YXIgZSwgbSwgY1xuICB2YXIgZUxlbiA9IChuQnl0ZXMgKiA4KSAtIG1MZW4gLSAxXG4gIHZhciBlTWF4ID0gKDEgPDwgZUxlbikgLSAxXG4gIHZhciBlQmlhcyA9IGVNYXggPj4gMVxuICB2YXIgcnQgPSAobUxlbiA9PT0gMjMgPyBNYXRoLnBvdygyLCAtMjQpIC0gTWF0aC5wb3coMiwgLTc3KSA6IDApXG4gIHZhciBpID0gaXNMRSA/IDAgOiAobkJ5dGVzIC0gMSlcbiAgdmFyIGQgPSBpc0xFID8gMSA6IC0xXG4gIHZhciBzID0gdmFsdWUgPCAwIHx8ICh2YWx1ZSA9PT0gMCAmJiAxIC8gdmFsdWUgPCAwKSA/IDEgOiAwXG5cbiAgdmFsdWUgPSBNYXRoLmFicyh2YWx1ZSlcblxuICBpZiAoaXNOYU4odmFsdWUpIHx8IHZhbHVlID09PSBJbmZpbml0eSkge1xuICAgIG0gPSBpc05hTih2YWx1ZSkgPyAxIDogMFxuICAgIGUgPSBlTWF4XG4gIH0gZWxzZSB7XG4gICAgZSA9IE1hdGguZmxvb3IoTWF0aC5sb2codmFsdWUpIC8gTWF0aC5MTjIpXG4gICAgaWYgKHZhbHVlICogKGMgPSBNYXRoLnBvdygyLCAtZSkpIDwgMSkge1xuICAgICAgZS0tXG4gICAgICBjICo9IDJcbiAgICB9XG4gICAgaWYgKGUgKyBlQmlhcyA+PSAxKSB7XG4gICAgICB2YWx1ZSArPSBydCAvIGNcbiAgICB9IGVsc2Uge1xuICAgICAgdmFsdWUgKz0gcnQgKiBNYXRoLnBvdygyLCAxIC0gZUJpYXMpXG4gICAgfVxuICAgIGlmICh2YWx1ZSAqIGMgPj0gMikge1xuICAgICAgZSsrXG4gICAgICBjIC89IDJcbiAgICB9XG5cbiAgICBpZiAoZSArIGVCaWFzID49IGVNYXgpIHtcbiAgICAgIG0gPSAwXG4gICAgICBlID0gZU1heFxuICAgIH0gZWxzZSBpZiAoZSArIGVCaWFzID49IDEpIHtcbiAgICAgIG0gPSAoKHZhbHVlICogYykgLSAxKSAqIE1hdGgucG93KDIsIG1MZW4pXG4gICAgICBlID0gZSArIGVCaWFzXG4gICAgfSBlbHNlIHtcbiAgICAgIG0gPSB2YWx1ZSAqIE1hdGgucG93KDIsIGVCaWFzIC0gMSkgKiBNYXRoLnBvdygyLCBtTGVuKVxuICAgICAgZSA9IDBcbiAgICB9XG4gIH1cblxuICBmb3IgKDsgbUxlbiA+PSA4OyBidWZmZXJbb2Zmc2V0ICsgaV0gPSBtICYgMHhmZiwgaSArPSBkLCBtIC89IDI1NiwgbUxlbiAtPSA4KSB7fVxuXG4gIGUgPSAoZSA8PCBtTGVuKSB8IG1cbiAgZUxlbiArPSBtTGVuXG4gIGZvciAoOyBlTGVuID4gMDsgYnVmZmVyW29mZnNldCArIGldID0gZSAmIDB4ZmYsIGkgKz0gZCwgZSAvPSAyNTYsIGVMZW4gLT0gOCkge31cblxuICBidWZmZXJbb2Zmc2V0ICsgaSAtIGRdIHw9IHMgKiAxMjhcbn1cbiIsIihmdW5jdGlvbiAocHJvY2Vzcyl7XG4vLyAuZGlybmFtZSwgLmJhc2VuYW1lLCBhbmQgLmV4dG5hbWUgbWV0aG9kcyBhcmUgZXh0cmFjdGVkIGZyb20gTm9kZS5qcyB2OC4xMS4xLFxuLy8gYmFja3BvcnRlZCBhbmQgdHJhbnNwbGl0ZWQgd2l0aCBCYWJlbCwgd2l0aCBiYWNrd2FyZHMtY29tcGF0IGZpeGVzXG5cbi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4vLyByZXNvbHZlcyAuIGFuZCAuLiBlbGVtZW50cyBpbiBhIHBhdGggYXJyYXkgd2l0aCBkaXJlY3RvcnkgbmFtZXMgdGhlcmVcbi8vIG11c3QgYmUgbm8gc2xhc2hlcywgZW1wdHkgZWxlbWVudHMsIG9yIGRldmljZSBuYW1lcyAoYzpcXCkgaW4gdGhlIGFycmF5XG4vLyAoc28gYWxzbyBubyBsZWFkaW5nIGFuZCB0cmFpbGluZyBzbGFzaGVzIC0gaXQgZG9lcyBub3QgZGlzdGluZ3Vpc2hcbi8vIHJlbGF0aXZlIGFuZCBhYnNvbHV0ZSBwYXRocylcbmZ1bmN0aW9uIG5vcm1hbGl6ZUFycmF5KHBhcnRzLCBhbGxvd0Fib3ZlUm9vdCkge1xuICAvLyBpZiB0aGUgcGF0aCB0cmllcyB0byBnbyBhYm92ZSB0aGUgcm9vdCwgYHVwYCBlbmRzIHVwID4gMFxuICB2YXIgdXAgPSAwO1xuICBmb3IgKHZhciBpID0gcGFydHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICB2YXIgbGFzdCA9IHBhcnRzW2ldO1xuICAgIGlmIChsYXN0ID09PSAnLicpIHtcbiAgICAgIHBhcnRzLnNwbGljZShpLCAxKTtcbiAgICB9IGVsc2UgaWYgKGxhc3QgPT09ICcuLicpIHtcbiAgICAgIHBhcnRzLnNwbGljZShpLCAxKTtcbiAgICAgIHVwKys7XG4gICAgfSBlbHNlIGlmICh1cCkge1xuICAgICAgcGFydHMuc3BsaWNlKGksIDEpO1xuICAgICAgdXAtLTtcbiAgICB9XG4gIH1cblxuICAvLyBpZiB0aGUgcGF0aCBpcyBhbGxvd2VkIHRvIGdvIGFib3ZlIHRoZSByb290LCByZXN0b3JlIGxlYWRpbmcgLi5zXG4gIGlmIChhbGxvd0Fib3ZlUm9vdCkge1xuICAgIGZvciAoOyB1cC0tOyB1cCkge1xuICAgICAgcGFydHMudW5zaGlmdCgnLi4nKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcGFydHM7XG59XG5cbi8vIHBhdGgucmVzb2x2ZShbZnJvbSAuLi5dLCB0bylcbi8vIHBvc2l4IHZlcnNpb25cbmV4cG9ydHMucmVzb2x2ZSA9IGZ1bmN0aW9uKCkge1xuICB2YXIgcmVzb2x2ZWRQYXRoID0gJycsXG4gICAgICByZXNvbHZlZEFic29sdXRlID0gZmFsc2U7XG5cbiAgZm9yICh2YXIgaSA9IGFyZ3VtZW50cy5sZW5ndGggLSAxOyBpID49IC0xICYmICFyZXNvbHZlZEFic29sdXRlOyBpLS0pIHtcbiAgICB2YXIgcGF0aCA9IChpID49IDApID8gYXJndW1lbnRzW2ldIDogcHJvY2Vzcy5jd2QoKTtcblxuICAgIC8vIFNraXAgZW1wdHkgYW5kIGludmFsaWQgZW50cmllc1xuICAgIGlmICh0eXBlb2YgcGF0aCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50cyB0byBwYXRoLnJlc29sdmUgbXVzdCBiZSBzdHJpbmdzJyk7XG4gICAgfSBlbHNlIGlmICghcGF0aCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgcmVzb2x2ZWRQYXRoID0gcGF0aCArICcvJyArIHJlc29sdmVkUGF0aDtcbiAgICByZXNvbHZlZEFic29sdXRlID0gcGF0aC5jaGFyQXQoMCkgPT09ICcvJztcbiAgfVxuXG4gIC8vIEF0IHRoaXMgcG9pbnQgdGhlIHBhdGggc2hvdWxkIGJlIHJlc29sdmVkIHRvIGEgZnVsbCBhYnNvbHV0ZSBwYXRoLCBidXRcbiAgLy8gaGFuZGxlIHJlbGF0aXZlIHBhdGhzIHRvIGJlIHNhZmUgKG1pZ2h0IGhhcHBlbiB3aGVuIHByb2Nlc3MuY3dkKCkgZmFpbHMpXG5cbiAgLy8gTm9ybWFsaXplIHRoZSBwYXRoXG4gIHJlc29sdmVkUGF0aCA9IG5vcm1hbGl6ZUFycmF5KGZpbHRlcihyZXNvbHZlZFBhdGguc3BsaXQoJy8nKSwgZnVuY3Rpb24ocCkge1xuICAgIHJldHVybiAhIXA7XG4gIH0pLCAhcmVzb2x2ZWRBYnNvbHV0ZSkuam9pbignLycpO1xuXG4gIHJldHVybiAoKHJlc29sdmVkQWJzb2x1dGUgPyAnLycgOiAnJykgKyByZXNvbHZlZFBhdGgpIHx8ICcuJztcbn07XG5cbi8vIHBhdGgubm9ybWFsaXplKHBhdGgpXG4vLyBwb3NpeCB2ZXJzaW9uXG5leHBvcnRzLm5vcm1hbGl6ZSA9IGZ1bmN0aW9uKHBhdGgpIHtcbiAgdmFyIGlzQWJzb2x1dGUgPSBleHBvcnRzLmlzQWJzb2x1dGUocGF0aCksXG4gICAgICB0cmFpbGluZ1NsYXNoID0gc3Vic3RyKHBhdGgsIC0xKSA9PT0gJy8nO1xuXG4gIC8vIE5vcm1hbGl6ZSB0aGUgcGF0aFxuICBwYXRoID0gbm9ybWFsaXplQXJyYXkoZmlsdGVyKHBhdGguc3BsaXQoJy8nKSwgZnVuY3Rpb24ocCkge1xuICAgIHJldHVybiAhIXA7XG4gIH0pLCAhaXNBYnNvbHV0ZSkuam9pbignLycpO1xuXG4gIGlmICghcGF0aCAmJiAhaXNBYnNvbHV0ZSkge1xuICAgIHBhdGggPSAnLic7XG4gIH1cbiAgaWYgKHBhdGggJiYgdHJhaWxpbmdTbGFzaCkge1xuICAgIHBhdGggKz0gJy8nO1xuICB9XG5cbiAgcmV0dXJuIChpc0Fic29sdXRlID8gJy8nIDogJycpICsgcGF0aDtcbn07XG5cbi8vIHBvc2l4IHZlcnNpb25cbmV4cG9ydHMuaXNBYnNvbHV0ZSA9IGZ1bmN0aW9uKHBhdGgpIHtcbiAgcmV0dXJuIHBhdGguY2hhckF0KDApID09PSAnLyc7XG59O1xuXG4vLyBwb3NpeCB2ZXJzaW9uXG5leHBvcnRzLmpvaW4gPSBmdW5jdGlvbigpIHtcbiAgdmFyIHBhdGhzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAwKTtcbiAgcmV0dXJuIGV4cG9ydHMubm9ybWFsaXplKGZpbHRlcihwYXRocywgZnVuY3Rpb24ocCwgaW5kZXgpIHtcbiAgICBpZiAodHlwZW9mIHAgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudHMgdG8gcGF0aC5qb2luIG11c3QgYmUgc3RyaW5ncycpO1xuICAgIH1cbiAgICByZXR1cm4gcDtcbiAgfSkuam9pbignLycpKTtcbn07XG5cblxuLy8gcGF0aC5yZWxhdGl2ZShmcm9tLCB0bylcbi8vIHBvc2l4IHZlcnNpb25cbmV4cG9ydHMucmVsYXRpdmUgPSBmdW5jdGlvbihmcm9tLCB0bykge1xuICBmcm9tID0gZXhwb3J0cy5yZXNvbHZlKGZyb20pLnN1YnN0cigxKTtcbiAgdG8gPSBleHBvcnRzLnJlc29sdmUodG8pLnN1YnN0cigxKTtcblxuICBmdW5jdGlvbiB0cmltKGFycikge1xuICAgIHZhciBzdGFydCA9IDA7XG4gICAgZm9yICg7IHN0YXJ0IDwgYXJyLmxlbmd0aDsgc3RhcnQrKykge1xuICAgICAgaWYgKGFycltzdGFydF0gIT09ICcnKSBicmVhaztcbiAgICB9XG5cbiAgICB2YXIgZW5kID0gYXJyLmxlbmd0aCAtIDE7XG4gICAgZm9yICg7IGVuZCA+PSAwOyBlbmQtLSkge1xuICAgICAgaWYgKGFycltlbmRdICE9PSAnJykgYnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKHN0YXJ0ID4gZW5kKSByZXR1cm4gW107XG4gICAgcmV0dXJuIGFyci5zbGljZShzdGFydCwgZW5kIC0gc3RhcnQgKyAxKTtcbiAgfVxuXG4gIHZhciBmcm9tUGFydHMgPSB0cmltKGZyb20uc3BsaXQoJy8nKSk7XG4gIHZhciB0b1BhcnRzID0gdHJpbSh0by5zcGxpdCgnLycpKTtcblxuICB2YXIgbGVuZ3RoID0gTWF0aC5taW4oZnJvbVBhcnRzLmxlbmd0aCwgdG9QYXJ0cy5sZW5ndGgpO1xuICB2YXIgc2FtZVBhcnRzTGVuZ3RoID0gbGVuZ3RoO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGZyb21QYXJ0c1tpXSAhPT0gdG9QYXJ0c1tpXSkge1xuICAgICAgc2FtZVBhcnRzTGVuZ3RoID0gaTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHZhciBvdXRwdXRQYXJ0cyA9IFtdO1xuICBmb3IgKHZhciBpID0gc2FtZVBhcnRzTGVuZ3RoOyBpIDwgZnJvbVBhcnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgb3V0cHV0UGFydHMucHVzaCgnLi4nKTtcbiAgfVxuXG4gIG91dHB1dFBhcnRzID0gb3V0cHV0UGFydHMuY29uY2F0KHRvUGFydHMuc2xpY2Uoc2FtZVBhcnRzTGVuZ3RoKSk7XG5cbiAgcmV0dXJuIG91dHB1dFBhcnRzLmpvaW4oJy8nKTtcbn07XG5cbmV4cG9ydHMuc2VwID0gJy8nO1xuZXhwb3J0cy5kZWxpbWl0ZXIgPSAnOic7XG5cbmV4cG9ydHMuZGlybmFtZSA9IGZ1bmN0aW9uIChwYXRoKSB7XG4gIGlmICh0eXBlb2YgcGF0aCAhPT0gJ3N0cmluZycpIHBhdGggPSBwYXRoICsgJyc7XG4gIGlmIChwYXRoLmxlbmd0aCA9PT0gMCkgcmV0dXJuICcuJztcbiAgdmFyIGNvZGUgPSBwYXRoLmNoYXJDb2RlQXQoMCk7XG4gIHZhciBoYXNSb290ID0gY29kZSA9PT0gNDcgLyovKi87XG4gIHZhciBlbmQgPSAtMTtcbiAgdmFyIG1hdGNoZWRTbGFzaCA9IHRydWU7XG4gIGZvciAodmFyIGkgPSBwYXRoLmxlbmd0aCAtIDE7IGkgPj0gMTsgLS1pKSB7XG4gICAgY29kZSA9IHBhdGguY2hhckNvZGVBdChpKTtcbiAgICBpZiAoY29kZSA9PT0gNDcgLyovKi8pIHtcbiAgICAgICAgaWYgKCFtYXRjaGVkU2xhc2gpIHtcbiAgICAgICAgICBlbmQgPSBpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgLy8gV2Ugc2F3IHRoZSBmaXJzdCBub24tcGF0aCBzZXBhcmF0b3JcbiAgICAgIG1hdGNoZWRTbGFzaCA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGlmIChlbmQgPT09IC0xKSByZXR1cm4gaGFzUm9vdCA/ICcvJyA6ICcuJztcbiAgaWYgKGhhc1Jvb3QgJiYgZW5kID09PSAxKSB7XG4gICAgLy8gcmV0dXJuICcvLyc7XG4gICAgLy8gQmFja3dhcmRzLWNvbXBhdCBmaXg6XG4gICAgcmV0dXJuICcvJztcbiAgfVxuICByZXR1cm4gcGF0aC5zbGljZSgwLCBlbmQpO1xufTtcblxuZnVuY3Rpb24gYmFzZW5hbWUocGF0aCkge1xuICBpZiAodHlwZW9mIHBhdGggIT09ICdzdHJpbmcnKSBwYXRoID0gcGF0aCArICcnO1xuXG4gIHZhciBzdGFydCA9IDA7XG4gIHZhciBlbmQgPSAtMTtcbiAgdmFyIG1hdGNoZWRTbGFzaCA9IHRydWU7XG4gIHZhciBpO1xuXG4gIGZvciAoaSA9IHBhdGgubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICBpZiAocGF0aC5jaGFyQ29kZUF0KGkpID09PSA0NyAvKi8qLykge1xuICAgICAgICAvLyBJZiB3ZSByZWFjaGVkIGEgcGF0aCBzZXBhcmF0b3IgdGhhdCB3YXMgbm90IHBhcnQgb2YgYSBzZXQgb2YgcGF0aFxuICAgICAgICAvLyBzZXBhcmF0b3JzIGF0IHRoZSBlbmQgb2YgdGhlIHN0cmluZywgc3RvcCBub3dcbiAgICAgICAgaWYgKCFtYXRjaGVkU2xhc2gpIHtcbiAgICAgICAgICBzdGFydCA9IGkgKyAxO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGVuZCA9PT0gLTEpIHtcbiAgICAgIC8vIFdlIHNhdyB0aGUgZmlyc3Qgbm9uLXBhdGggc2VwYXJhdG9yLCBtYXJrIHRoaXMgYXMgdGhlIGVuZCBvZiBvdXJcbiAgICAgIC8vIHBhdGggY29tcG9uZW50XG4gICAgICBtYXRjaGVkU2xhc2ggPSBmYWxzZTtcbiAgICAgIGVuZCA9IGkgKyAxO1xuICAgIH1cbiAgfVxuXG4gIGlmIChlbmQgPT09IC0xKSByZXR1cm4gJyc7XG4gIHJldHVybiBwYXRoLnNsaWNlKHN0YXJ0LCBlbmQpO1xufVxuXG4vLyBVc2VzIGEgbWl4ZWQgYXBwcm9hY2ggZm9yIGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5LCBhcyBleHQgYmVoYXZpb3IgY2hhbmdlZFxuLy8gaW4gbmV3IE5vZGUuanMgdmVyc2lvbnMsIHNvIG9ubHkgYmFzZW5hbWUoKSBhYm92ZSBpcyBiYWNrcG9ydGVkIGhlcmVcbmV4cG9ydHMuYmFzZW5hbWUgPSBmdW5jdGlvbiAocGF0aCwgZXh0KSB7XG4gIHZhciBmID0gYmFzZW5hbWUocGF0aCk7XG4gIGlmIChleHQgJiYgZi5zdWJzdHIoLTEgKiBleHQubGVuZ3RoKSA9PT0gZXh0KSB7XG4gICAgZiA9IGYuc3Vic3RyKDAsIGYubGVuZ3RoIC0gZXh0Lmxlbmd0aCk7XG4gIH1cbiAgcmV0dXJuIGY7XG59O1xuXG5leHBvcnRzLmV4dG5hbWUgPSBmdW5jdGlvbiAocGF0aCkge1xuICBpZiAodHlwZW9mIHBhdGggIT09ICdzdHJpbmcnKSBwYXRoID0gcGF0aCArICcnO1xuICB2YXIgc3RhcnREb3QgPSAtMTtcbiAgdmFyIHN0YXJ0UGFydCA9IDA7XG4gIHZhciBlbmQgPSAtMTtcbiAgdmFyIG1hdGNoZWRTbGFzaCA9IHRydWU7XG4gIC8vIFRyYWNrIHRoZSBzdGF0ZSBvZiBjaGFyYWN0ZXJzIChpZiBhbnkpIHdlIHNlZSBiZWZvcmUgb3VyIGZpcnN0IGRvdCBhbmRcbiAgLy8gYWZ0ZXIgYW55IHBhdGggc2VwYXJhdG9yIHdlIGZpbmRcbiAgdmFyIHByZURvdFN0YXRlID0gMDtcbiAgZm9yICh2YXIgaSA9IHBhdGgubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICB2YXIgY29kZSA9IHBhdGguY2hhckNvZGVBdChpKTtcbiAgICBpZiAoY29kZSA9PT0gNDcgLyovKi8pIHtcbiAgICAgICAgLy8gSWYgd2UgcmVhY2hlZCBhIHBhdGggc2VwYXJhdG9yIHRoYXQgd2FzIG5vdCBwYXJ0IG9mIGEgc2V0IG9mIHBhdGhcbiAgICAgICAgLy8gc2VwYXJhdG9ycyBhdCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcsIHN0b3Agbm93XG4gICAgICAgIGlmICghbWF0Y2hlZFNsYXNoKSB7XG4gICAgICAgICAgc3RhcnRQYXJ0ID0gaSArIDE7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgaWYgKGVuZCA9PT0gLTEpIHtcbiAgICAgIC8vIFdlIHNhdyB0aGUgZmlyc3Qgbm9uLXBhdGggc2VwYXJhdG9yLCBtYXJrIHRoaXMgYXMgdGhlIGVuZCBvZiBvdXJcbiAgICAgIC8vIGV4dGVuc2lvblxuICAgICAgbWF0Y2hlZFNsYXNoID0gZmFsc2U7XG4gICAgICBlbmQgPSBpICsgMTtcbiAgICB9XG4gICAgaWYgKGNvZGUgPT09IDQ2IC8qLiovKSB7XG4gICAgICAgIC8vIElmIHRoaXMgaXMgb3VyIGZpcnN0IGRvdCwgbWFyayBpdCBhcyB0aGUgc3RhcnQgb2Ygb3VyIGV4dGVuc2lvblxuICAgICAgICBpZiAoc3RhcnREb3QgPT09IC0xKVxuICAgICAgICAgIHN0YXJ0RG90ID0gaTtcbiAgICAgICAgZWxzZSBpZiAocHJlRG90U3RhdGUgIT09IDEpXG4gICAgICAgICAgcHJlRG90U3RhdGUgPSAxO1xuICAgIH0gZWxzZSBpZiAoc3RhcnREb3QgIT09IC0xKSB7XG4gICAgICAvLyBXZSBzYXcgYSBub24tZG90IGFuZCBub24tcGF0aCBzZXBhcmF0b3IgYmVmb3JlIG91ciBkb3QsIHNvIHdlIHNob3VsZFxuICAgICAgLy8gaGF2ZSBhIGdvb2QgY2hhbmNlIGF0IGhhdmluZyBhIG5vbi1lbXB0eSBleHRlbnNpb25cbiAgICAgIHByZURvdFN0YXRlID0gLTE7XG4gICAgfVxuICB9XG5cbiAgaWYgKHN0YXJ0RG90ID09PSAtMSB8fCBlbmQgPT09IC0xIHx8XG4gICAgICAvLyBXZSBzYXcgYSBub24tZG90IGNoYXJhY3RlciBpbW1lZGlhdGVseSBiZWZvcmUgdGhlIGRvdFxuICAgICAgcHJlRG90U3RhdGUgPT09IDAgfHxcbiAgICAgIC8vIFRoZSAocmlnaHQtbW9zdCkgdHJpbW1lZCBwYXRoIGNvbXBvbmVudCBpcyBleGFjdGx5ICcuLidcbiAgICAgIHByZURvdFN0YXRlID09PSAxICYmIHN0YXJ0RG90ID09PSBlbmQgLSAxICYmIHN0YXJ0RG90ID09PSBzdGFydFBhcnQgKyAxKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG4gIHJldHVybiBwYXRoLnNsaWNlKHN0YXJ0RG90LCBlbmQpO1xufTtcblxuZnVuY3Rpb24gZmlsdGVyICh4cywgZikge1xuICAgIGlmICh4cy5maWx0ZXIpIHJldHVybiB4cy5maWx0ZXIoZik7XG4gICAgdmFyIHJlcyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgeHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGYoeHNbaV0sIGksIHhzKSkgcmVzLnB1c2goeHNbaV0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xufVxuXG4vLyBTdHJpbmcucHJvdG90eXBlLnN1YnN0ciAtIG5lZ2F0aXZlIGluZGV4IGRvbid0IHdvcmsgaW4gSUU4XG52YXIgc3Vic3RyID0gJ2FiJy5zdWJzdHIoLTEpID09PSAnYidcbiAgICA/IGZ1bmN0aW9uIChzdHIsIHN0YXJ0LCBsZW4pIHsgcmV0dXJuIHN0ci5zdWJzdHIoc3RhcnQsIGxlbikgfVxuICAgIDogZnVuY3Rpb24gKHN0ciwgc3RhcnQsIGxlbikge1xuICAgICAgICBpZiAoc3RhcnQgPCAwKSBzdGFydCA9IHN0ci5sZW5ndGggKyBzdGFydDtcbiAgICAgICAgcmV0dXJuIHN0ci5zdWJzdHIoc3RhcnQsIGxlbik7XG4gICAgfVxuO1xuXG59KS5jYWxsKHRoaXMscmVxdWlyZShcIktsaXViSFwiKSkiLCIvLyBzaGltIGZvciB1c2luZyBwcm9jZXNzIGluIGJyb3dzZXJcblxudmFyIHByb2Nlc3MgPSBtb2R1bGUuZXhwb3J0cyA9IHt9O1xuXG5wcm9jZXNzLm5leHRUaWNrID0gKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgY2FuU2V0SW1tZWRpYXRlID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCdcbiAgICAmJiB3aW5kb3cuc2V0SW1tZWRpYXRlO1xuICAgIHZhciBjYW5Qb3N0ID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCdcbiAgICAmJiB3aW5kb3cucG9zdE1lc3NhZ2UgJiYgd2luZG93LmFkZEV2ZW50TGlzdGVuZXJcbiAgICA7XG5cbiAgICBpZiAoY2FuU2V0SW1tZWRpYXRlKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoZikgeyByZXR1cm4gd2luZG93LnNldEltbWVkaWF0ZShmKSB9O1xuICAgIH1cblxuICAgIGlmIChjYW5Qb3N0KSB7XG4gICAgICAgIHZhciBxdWV1ZSA9IFtdO1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGZ1bmN0aW9uIChldikge1xuICAgICAgICAgICAgdmFyIHNvdXJjZSA9IGV2LnNvdXJjZTtcbiAgICAgICAgICAgIGlmICgoc291cmNlID09PSB3aW5kb3cgfHwgc291cmNlID09PSBudWxsKSAmJiBldi5kYXRhID09PSAncHJvY2Vzcy10aWNrJykge1xuICAgICAgICAgICAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAgIGlmIChxdWV1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBmbiA9IHF1ZXVlLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgIGZuKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9LCB0cnVlKTtcblxuICAgICAgICByZXR1cm4gZnVuY3Rpb24gbmV4dFRpY2soZm4pIHtcbiAgICAgICAgICAgIHF1ZXVlLnB1c2goZm4pO1xuICAgICAgICAgICAgd2luZG93LnBvc3RNZXNzYWdlKCdwcm9jZXNzLXRpY2snLCAnKicpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiBmdW5jdGlvbiBuZXh0VGljayhmbikge1xuICAgICAgICBzZXRUaW1lb3V0KGZuLCAwKTtcbiAgICB9O1xufSkoKTtcblxucHJvY2Vzcy50aXRsZSA9ICdicm93c2VyJztcbnByb2Nlc3MuYnJvd3NlciA9IHRydWU7XG5wcm9jZXNzLmVudiA9IHt9O1xucHJvY2Vzcy5hcmd2ID0gW107XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG5wcm9jZXNzLm9uID0gbm9vcDtcbnByb2Nlc3MuYWRkTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5vbmNlID0gbm9vcDtcbnByb2Nlc3Mub2ZmID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVBbGxMaXN0ZW5lcnMgPSBub29wO1xucHJvY2Vzcy5lbWl0ID0gbm9vcDtcblxucHJvY2Vzcy5iaW5kaW5nID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkJyk7XG59XG5cbi8vIFRPRE8oc2h0eWxtYW4pXG5wcm9jZXNzLmN3ZCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICcvJyB9O1xucHJvY2Vzcy5jaGRpciA9IGZ1bmN0aW9uIChkaXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcbiIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4vLyBhIGR1cGxleCBzdHJlYW0gaXMganVzdCBhIHN0cmVhbSB0aGF0IGlzIGJvdGggcmVhZGFibGUgYW5kIHdyaXRhYmxlLlxuLy8gU2luY2UgSlMgZG9lc24ndCBoYXZlIG11bHRpcGxlIHByb3RvdHlwYWwgaW5oZXJpdGFuY2UsIHRoaXMgY2xhc3Ncbi8vIHByb3RvdHlwYWxseSBpbmhlcml0cyBmcm9tIFJlYWRhYmxlLCBhbmQgdGhlbiBwYXJhc2l0aWNhbGx5IGZyb21cbi8vIFdyaXRhYmxlLlxuXG5tb2R1bGUuZXhwb3J0cyA9IER1cGxleDtcbnZhciBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG52YXIgc2V0SW1tZWRpYXRlID0gcmVxdWlyZSgncHJvY2Vzcy9icm93c2VyLmpzJykubmV4dFRpY2s7XG52YXIgUmVhZGFibGUgPSByZXF1aXJlKCcuL3JlYWRhYmxlLmpzJyk7XG52YXIgV3JpdGFibGUgPSByZXF1aXJlKCcuL3dyaXRhYmxlLmpzJyk7XG5cbmluaGVyaXRzKER1cGxleCwgUmVhZGFibGUpO1xuXG5EdXBsZXgucHJvdG90eXBlLndyaXRlID0gV3JpdGFibGUucHJvdG90eXBlLndyaXRlO1xuRHVwbGV4LnByb3RvdHlwZS5lbmQgPSBXcml0YWJsZS5wcm90b3R5cGUuZW5kO1xuRHVwbGV4LnByb3RvdHlwZS5fd3JpdGUgPSBXcml0YWJsZS5wcm90b3R5cGUuX3dyaXRlO1xuXG5mdW5jdGlvbiBEdXBsZXgob3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgRHVwbGV4KSlcbiAgICByZXR1cm4gbmV3IER1cGxleChvcHRpb25zKTtcblxuICBSZWFkYWJsZS5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuICBXcml0YWJsZS5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuXG4gIGlmIChvcHRpb25zICYmIG9wdGlvbnMucmVhZGFibGUgPT09IGZhbHNlKVxuICAgIHRoaXMucmVhZGFibGUgPSBmYWxzZTtcblxuICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLndyaXRhYmxlID09PSBmYWxzZSlcbiAgICB0aGlzLndyaXRhYmxlID0gZmFsc2U7XG5cbiAgdGhpcy5hbGxvd0hhbGZPcGVuID0gdHJ1ZTtcbiAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5hbGxvd0hhbGZPcGVuID09PSBmYWxzZSlcbiAgICB0aGlzLmFsbG93SGFsZk9wZW4gPSBmYWxzZTtcblxuICB0aGlzLm9uY2UoJ2VuZCcsIG9uZW5kKTtcbn1cblxuLy8gdGhlIG5vLWhhbGYtb3BlbiBlbmZvcmNlclxuZnVuY3Rpb24gb25lbmQoKSB7XG4gIC8vIGlmIHdlIGFsbG93IGhhbGYtb3BlbiBzdGF0ZSwgb3IgaWYgdGhlIHdyaXRhYmxlIHNpZGUgZW5kZWQsXG4gIC8vIHRoZW4gd2UncmUgb2suXG4gIGlmICh0aGlzLmFsbG93SGFsZk9wZW4gfHwgdGhpcy5fd3JpdGFibGVTdGF0ZS5lbmRlZClcbiAgICByZXR1cm47XG5cbiAgLy8gbm8gbW9yZSBkYXRhIGNhbiBiZSB3cml0dGVuLlxuICAvLyBCdXQgYWxsb3cgbW9yZSB3cml0ZXMgdG8gaGFwcGVuIGluIHRoaXMgdGljay5cbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBzZXRJbW1lZGlhdGUoZnVuY3Rpb24gKCkge1xuICAgIHNlbGYuZW5kKCk7XG4gIH0pO1xufVxuIiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbm1vZHVsZS5leHBvcnRzID0gU3RyZWFtO1xuXG52YXIgRUUgPSByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXI7XG52YXIgaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuXG5pbmhlcml0cyhTdHJlYW0sIEVFKTtcblN0cmVhbS5SZWFkYWJsZSA9IHJlcXVpcmUoJy4vcmVhZGFibGUuanMnKTtcblN0cmVhbS5Xcml0YWJsZSA9IHJlcXVpcmUoJy4vd3JpdGFibGUuanMnKTtcblN0cmVhbS5EdXBsZXggPSByZXF1aXJlKCcuL2R1cGxleC5qcycpO1xuU3RyZWFtLlRyYW5zZm9ybSA9IHJlcXVpcmUoJy4vdHJhbnNmb3JtLmpzJyk7XG5TdHJlYW0uUGFzc1Rocm91Z2ggPSByZXF1aXJlKCcuL3Bhc3N0aHJvdWdoLmpzJyk7XG5cbi8vIEJhY2t3YXJkcy1jb21wYXQgd2l0aCBub2RlIDAuNC54XG5TdHJlYW0uU3RyZWFtID0gU3RyZWFtO1xuXG5cblxuLy8gb2xkLXN0eWxlIHN0cmVhbXMuICBOb3RlIHRoYXQgdGhlIHBpcGUgbWV0aG9kICh0aGUgb25seSByZWxldmFudFxuLy8gcGFydCBvZiB0aGlzIGNsYXNzKSBpcyBvdmVycmlkZGVuIGluIHRoZSBSZWFkYWJsZSBjbGFzcy5cblxuZnVuY3Rpb24gU3RyZWFtKCkge1xuICBFRS5jYWxsKHRoaXMpO1xufVxuXG5TdHJlYW0ucHJvdG90eXBlLnBpcGUgPSBmdW5jdGlvbihkZXN0LCBvcHRpb25zKSB7XG4gIHZhciBzb3VyY2UgPSB0aGlzO1xuXG4gIGZ1bmN0aW9uIG9uZGF0YShjaHVuaykge1xuICAgIGlmIChkZXN0LndyaXRhYmxlKSB7XG4gICAgICBpZiAoZmFsc2UgPT09IGRlc3Qud3JpdGUoY2h1bmspICYmIHNvdXJjZS5wYXVzZSkge1xuICAgICAgICBzb3VyY2UucGF1c2UoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzb3VyY2Uub24oJ2RhdGEnLCBvbmRhdGEpO1xuXG4gIGZ1bmN0aW9uIG9uZHJhaW4oKSB7XG4gICAgaWYgKHNvdXJjZS5yZWFkYWJsZSAmJiBzb3VyY2UucmVzdW1lKSB7XG4gICAgICBzb3VyY2UucmVzdW1lKCk7XG4gICAgfVxuICB9XG5cbiAgZGVzdC5vbignZHJhaW4nLCBvbmRyYWluKTtcblxuICAvLyBJZiB0aGUgJ2VuZCcgb3B0aW9uIGlzIG5vdCBzdXBwbGllZCwgZGVzdC5lbmQoKSB3aWxsIGJlIGNhbGxlZCB3aGVuXG4gIC8vIHNvdXJjZSBnZXRzIHRoZSAnZW5kJyBvciAnY2xvc2UnIGV2ZW50cy4gIE9ubHkgZGVzdC5lbmQoKSBvbmNlLlxuICBpZiAoIWRlc3QuX2lzU3RkaW8gJiYgKCFvcHRpb25zIHx8IG9wdGlvbnMuZW5kICE9PSBmYWxzZSkpIHtcbiAgICBzb3VyY2Uub24oJ2VuZCcsIG9uZW5kKTtcbiAgICBzb3VyY2Uub24oJ2Nsb3NlJywgb25jbG9zZSk7XG4gIH1cblxuICB2YXIgZGlkT25FbmQgPSBmYWxzZTtcbiAgZnVuY3Rpb24gb25lbmQoKSB7XG4gICAgaWYgKGRpZE9uRW5kKSByZXR1cm47XG4gICAgZGlkT25FbmQgPSB0cnVlO1xuXG4gICAgZGVzdC5lbmQoKTtcbiAgfVxuXG5cbiAgZnVuY3Rpb24gb25jbG9zZSgpIHtcbiAgICBpZiAoZGlkT25FbmQpIHJldHVybjtcbiAgICBkaWRPbkVuZCA9IHRydWU7XG5cbiAgICBpZiAodHlwZW9mIGRlc3QuZGVzdHJveSA9PT0gJ2Z1bmN0aW9uJykgZGVzdC5kZXN0cm95KCk7XG4gIH1cblxuICAvLyBkb24ndCBsZWF2ZSBkYW5nbGluZyBwaXBlcyB3aGVuIHRoZXJlIGFyZSBlcnJvcnMuXG4gIGZ1bmN0aW9uIG9uZXJyb3IoZXIpIHtcbiAgICBjbGVhbnVwKCk7XG4gICAgaWYgKEVFLmxpc3RlbmVyQ291bnQodGhpcywgJ2Vycm9yJykgPT09IDApIHtcbiAgICAgIHRocm93IGVyOyAvLyBVbmhhbmRsZWQgc3RyZWFtIGVycm9yIGluIHBpcGUuXG4gICAgfVxuICB9XG5cbiAgc291cmNlLm9uKCdlcnJvcicsIG9uZXJyb3IpO1xuICBkZXN0Lm9uKCdlcnJvcicsIG9uZXJyb3IpO1xuXG4gIC8vIHJlbW92ZSBhbGwgdGhlIGV2ZW50IGxpc3RlbmVycyB0aGF0IHdlcmUgYWRkZWQuXG4gIGZ1bmN0aW9uIGNsZWFudXAoKSB7XG4gICAgc291cmNlLnJlbW92ZUxpc3RlbmVyKCdkYXRhJywgb25kYXRhKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdkcmFpbicsIG9uZHJhaW4pO1xuXG4gICAgc291cmNlLnJlbW92ZUxpc3RlbmVyKCdlbmQnLCBvbmVuZCk7XG4gICAgc291cmNlLnJlbW92ZUxpc3RlbmVyKCdjbG9zZScsIG9uY2xvc2UpO1xuXG4gICAgc291cmNlLnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsIG9uZXJyb3IpO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgb25lcnJvcik7XG5cbiAgICBzb3VyY2UucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIGNsZWFudXApO1xuICAgIHNvdXJjZS5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCBjbGVhbnVwKTtcblxuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2Nsb3NlJywgY2xlYW51cCk7XG4gIH1cblxuICBzb3VyY2Uub24oJ2VuZCcsIGNsZWFudXApO1xuICBzb3VyY2Uub24oJ2Nsb3NlJywgY2xlYW51cCk7XG5cbiAgZGVzdC5vbignY2xvc2UnLCBjbGVhbnVwKTtcblxuICBkZXN0LmVtaXQoJ3BpcGUnLCBzb3VyY2UpO1xuXG4gIC8vIEFsbG93IGZvciB1bml4LWxpa2UgdXNhZ2U6IEEucGlwZShCKS5waXBlKEMpXG4gIHJldHVybiBkZXN0O1xufTtcbiIsIi8vIHNoaW0gZm9yIHVzaW5nIHByb2Nlc3MgaW4gYnJvd3NlclxuXG52YXIgcHJvY2VzcyA9IG1vZHVsZS5leHBvcnRzID0ge307XG5cbnByb2Nlc3MubmV4dFRpY2sgPSAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBjYW5TZXRJbW1lZGlhdGUgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJ1xuICAgICYmIHdpbmRvdy5zZXRJbW1lZGlhdGU7XG4gICAgdmFyIGNhblBvc3QgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJ1xuICAgICYmIHdpbmRvdy5wb3N0TWVzc2FnZSAmJiB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lclxuICAgIDtcblxuICAgIGlmIChjYW5TZXRJbW1lZGlhdGUpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChmKSB7IHJldHVybiB3aW5kb3cuc2V0SW1tZWRpYXRlKGYpIH07XG4gICAgfVxuXG4gICAgaWYgKGNhblBvc3QpIHtcbiAgICAgICAgdmFyIHF1ZXVlID0gW107XG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgICAgICB2YXIgc291cmNlID0gZXYuc291cmNlO1xuICAgICAgICAgICAgaWYgKChzb3VyY2UgPT09IHdpbmRvdyB8fCBzb3VyY2UgPT09IG51bGwpICYmIGV2LmRhdGEgPT09ICdwcm9jZXNzLXRpY2snKSB7XG4gICAgICAgICAgICAgICAgZXYuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgaWYgKHF1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGZuID0gcXVldWUuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgZm4oKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHRydWUpO1xuXG4gICAgICAgIHJldHVybiBmdW5jdGlvbiBuZXh0VGljayhmbikge1xuICAgICAgICAgICAgcXVldWUucHVzaChmbik7XG4gICAgICAgICAgICB3aW5kb3cucG9zdE1lc3NhZ2UoJ3Byb2Nlc3MtdGljaycsICcqJyk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIG5leHRUaWNrKGZuKSB7XG4gICAgICAgIHNldFRpbWVvdXQoZm4sIDApO1xuICAgIH07XG59KSgpO1xuXG5wcm9jZXNzLnRpdGxlID0gJ2Jyb3dzZXInO1xucHJvY2Vzcy5icm93c2VyID0gdHJ1ZTtcbnByb2Nlc3MuZW52ID0ge307XG5wcm9jZXNzLmFyZ3YgPSBbXTtcblxucHJvY2Vzcy5iaW5kaW5nID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkJyk7XG59XG5cbi8vIFRPRE8oc2h0eWxtYW4pXG5wcm9jZXNzLmN3ZCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICcvJyB9O1xucHJvY2Vzcy5jaGRpciA9IGZ1bmN0aW9uIChkaXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcbiIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4vLyBhIHBhc3N0aHJvdWdoIHN0cmVhbS5cbi8vIGJhc2ljYWxseSBqdXN0IHRoZSBtb3N0IG1pbmltYWwgc29ydCBvZiBUcmFuc2Zvcm0gc3RyZWFtLlxuLy8gRXZlcnkgd3JpdHRlbiBjaHVuayBnZXRzIG91dHB1dCBhcy1pcy5cblxubW9kdWxlLmV4cG9ydHMgPSBQYXNzVGhyb3VnaDtcblxudmFyIFRyYW5zZm9ybSA9IHJlcXVpcmUoJy4vdHJhbnNmb3JtLmpzJyk7XG52YXIgaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuaW5oZXJpdHMoUGFzc1Rocm91Z2gsIFRyYW5zZm9ybSk7XG5cbmZ1bmN0aW9uIFBhc3NUaHJvdWdoKG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFBhc3NUaHJvdWdoKSlcbiAgICByZXR1cm4gbmV3IFBhc3NUaHJvdWdoKG9wdGlvbnMpO1xuXG4gIFRyYW5zZm9ybS5jYWxsKHRoaXMsIG9wdGlvbnMpO1xufVxuXG5QYXNzVGhyb3VnaC5wcm90b3R5cGUuX3RyYW5zZm9ybSA9IGZ1bmN0aW9uKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgY2IobnVsbCwgY2h1bmspO1xufTtcbiIsIihmdW5jdGlvbiAocHJvY2Vzcyl7XG4vLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxubW9kdWxlLmV4cG9ydHMgPSBSZWFkYWJsZTtcblJlYWRhYmxlLlJlYWRhYmxlU3RhdGUgPSBSZWFkYWJsZVN0YXRlO1xuXG52YXIgRUUgPSByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXI7XG52YXIgU3RyZWFtID0gcmVxdWlyZSgnLi9pbmRleC5qcycpO1xudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ2J1ZmZlcicpLkJ1ZmZlcjtcbnZhciBzZXRJbW1lZGlhdGUgPSByZXF1aXJlKCdwcm9jZXNzL2Jyb3dzZXIuanMnKS5uZXh0VGljaztcbnZhciBTdHJpbmdEZWNvZGVyO1xuXG52YXIgaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuaW5oZXJpdHMoUmVhZGFibGUsIFN0cmVhbSk7XG5cbmZ1bmN0aW9uIFJlYWRhYmxlU3RhdGUob3B0aW9ucywgc3RyZWFtKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gIC8vIHRoZSBwb2ludCBhdCB3aGljaCBpdCBzdG9wcyBjYWxsaW5nIF9yZWFkKCkgdG8gZmlsbCB0aGUgYnVmZmVyXG4gIC8vIE5vdGU6IDAgaXMgYSB2YWxpZCB2YWx1ZSwgbWVhbnMgXCJkb24ndCBjYWxsIF9yZWFkIHByZWVtcHRpdmVseSBldmVyXCJcbiAgdmFyIGh3bSA9IG9wdGlvbnMuaGlnaFdhdGVyTWFyaztcbiAgdGhpcy5oaWdoV2F0ZXJNYXJrID0gKGh3bSB8fCBod20gPT09IDApID8gaHdtIDogMTYgKiAxMDI0O1xuXG4gIC8vIGNhc3QgdG8gaW50cy5cbiAgdGhpcy5oaWdoV2F0ZXJNYXJrID0gfn50aGlzLmhpZ2hXYXRlck1hcms7XG5cbiAgdGhpcy5idWZmZXIgPSBbXTtcbiAgdGhpcy5sZW5ndGggPSAwO1xuICB0aGlzLnBpcGVzID0gbnVsbDtcbiAgdGhpcy5waXBlc0NvdW50ID0gMDtcbiAgdGhpcy5mbG93aW5nID0gZmFsc2U7XG4gIHRoaXMuZW5kZWQgPSBmYWxzZTtcbiAgdGhpcy5lbmRFbWl0dGVkID0gZmFsc2U7XG4gIHRoaXMucmVhZGluZyA9IGZhbHNlO1xuXG4gIC8vIEluIHN0cmVhbXMgdGhhdCBuZXZlciBoYXZlIGFueSBkYXRhLCBhbmQgZG8gcHVzaChudWxsKSByaWdodCBhd2F5LFxuICAvLyB0aGUgY29uc3VtZXIgY2FuIG1pc3MgdGhlICdlbmQnIGV2ZW50IGlmIHRoZXkgZG8gc29tZSBJL08gYmVmb3JlXG4gIC8vIGNvbnN1bWluZyB0aGUgc3RyZWFtLiAgU28sIHdlIGRvbid0IGVtaXQoJ2VuZCcpIHVudGlsIHNvbWUgcmVhZGluZ1xuICAvLyBoYXBwZW5zLlxuICB0aGlzLmNhbGxlZFJlYWQgPSBmYWxzZTtcblxuICAvLyBhIGZsYWcgdG8gYmUgYWJsZSB0byB0ZWxsIGlmIHRoZSBvbndyaXRlIGNiIGlzIGNhbGxlZCBpbW1lZGlhdGVseSxcbiAgLy8gb3Igb24gYSBsYXRlciB0aWNrLiAgV2Ugc2V0IHRoaXMgdG8gdHJ1ZSBhdCBmaXJzdCwgYmVjdWFzZSBhbnlcbiAgLy8gYWN0aW9ucyB0aGF0IHNob3VsZG4ndCBoYXBwZW4gdW50aWwgXCJsYXRlclwiIHNob3VsZCBnZW5lcmFsbHkgYWxzb1xuICAvLyBub3QgaGFwcGVuIGJlZm9yZSB0aGUgZmlyc3Qgd3JpdGUgY2FsbC5cbiAgdGhpcy5zeW5jID0gdHJ1ZTtcblxuICAvLyB3aGVuZXZlciB3ZSByZXR1cm4gbnVsbCwgdGhlbiB3ZSBzZXQgYSBmbGFnIHRvIHNheVxuICAvLyB0aGF0IHdlJ3JlIGF3YWl0aW5nIGEgJ3JlYWRhYmxlJyBldmVudCBlbWlzc2lvbi5cbiAgdGhpcy5uZWVkUmVhZGFibGUgPSBmYWxzZTtcbiAgdGhpcy5lbWl0dGVkUmVhZGFibGUgPSBmYWxzZTtcbiAgdGhpcy5yZWFkYWJsZUxpc3RlbmluZyA9IGZhbHNlO1xuXG5cbiAgLy8gb2JqZWN0IHN0cmVhbSBmbGFnLiBVc2VkIHRvIG1ha2UgcmVhZChuKSBpZ25vcmUgbiBhbmQgdG9cbiAgLy8gbWFrZSBhbGwgdGhlIGJ1ZmZlciBtZXJnaW5nIGFuZCBsZW5ndGggY2hlY2tzIGdvIGF3YXlcbiAgdGhpcy5vYmplY3RNb2RlID0gISFvcHRpb25zLm9iamVjdE1vZGU7XG5cbiAgLy8gQ3J5cHRvIGlzIGtpbmQgb2Ygb2xkIGFuZCBjcnVzdHkuICBIaXN0b3JpY2FsbHksIGl0cyBkZWZhdWx0IHN0cmluZ1xuICAvLyBlbmNvZGluZyBpcyAnYmluYXJ5JyBzbyB3ZSBoYXZlIHRvIG1ha2UgdGhpcyBjb25maWd1cmFibGUuXG4gIC8vIEV2ZXJ5dGhpbmcgZWxzZSBpbiB0aGUgdW5pdmVyc2UgdXNlcyAndXRmOCcsIHRob3VnaC5cbiAgdGhpcy5kZWZhdWx0RW5jb2RpbmcgPSBvcHRpb25zLmRlZmF1bHRFbmNvZGluZyB8fCAndXRmOCc7XG5cbiAgLy8gd2hlbiBwaXBpbmcsIHdlIG9ubHkgY2FyZSBhYm91dCAncmVhZGFibGUnIGV2ZW50cyB0aGF0IGhhcHBlblxuICAvLyBhZnRlciByZWFkKClpbmcgYWxsIHRoZSBieXRlcyBhbmQgbm90IGdldHRpbmcgYW55IHB1c2hiYWNrLlxuICB0aGlzLnJhbk91dCA9IGZhbHNlO1xuXG4gIC8vIHRoZSBudW1iZXIgb2Ygd3JpdGVycyB0aGF0IGFyZSBhd2FpdGluZyBhIGRyYWluIGV2ZW50IGluIC5waXBlKClzXG4gIHRoaXMuYXdhaXREcmFpbiA9IDA7XG5cbiAgLy8gaWYgdHJ1ZSwgYSBtYXliZVJlYWRNb3JlIGhhcyBiZWVuIHNjaGVkdWxlZFxuICB0aGlzLnJlYWRpbmdNb3JlID0gZmFsc2U7XG5cbiAgdGhpcy5kZWNvZGVyID0gbnVsbDtcbiAgdGhpcy5lbmNvZGluZyA9IG51bGw7XG4gIGlmIChvcHRpb25zLmVuY29kaW5nKSB7XG4gICAgaWYgKCFTdHJpbmdEZWNvZGVyKVxuICAgICAgU3RyaW5nRGVjb2RlciA9IHJlcXVpcmUoJ3N0cmluZ19kZWNvZGVyJykuU3RyaW5nRGVjb2RlcjtcbiAgICB0aGlzLmRlY29kZXIgPSBuZXcgU3RyaW5nRGVjb2RlcihvcHRpb25zLmVuY29kaW5nKTtcbiAgICB0aGlzLmVuY29kaW5nID0gb3B0aW9ucy5lbmNvZGluZztcbiAgfVxufVxuXG5mdW5jdGlvbiBSZWFkYWJsZShvcHRpb25zKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBSZWFkYWJsZSkpXG4gICAgcmV0dXJuIG5ldyBSZWFkYWJsZShvcHRpb25zKTtcblxuICB0aGlzLl9yZWFkYWJsZVN0YXRlID0gbmV3IFJlYWRhYmxlU3RhdGUob3B0aW9ucywgdGhpcyk7XG5cbiAgLy8gbGVnYWN5XG4gIHRoaXMucmVhZGFibGUgPSB0cnVlO1xuXG4gIFN0cmVhbS5jYWxsKHRoaXMpO1xufVxuXG4vLyBNYW51YWxseSBzaG92ZSBzb21ldGhpbmcgaW50byB0aGUgcmVhZCgpIGJ1ZmZlci5cbi8vIFRoaXMgcmV0dXJucyB0cnVlIGlmIHRoZSBoaWdoV2F0ZXJNYXJrIGhhcyBub3QgYmVlbiBoaXQgeWV0LFxuLy8gc2ltaWxhciB0byBob3cgV3JpdGFibGUud3JpdGUoKSByZXR1cm5zIHRydWUgaWYgeW91IHNob3VsZFxuLy8gd3JpdGUoKSBzb21lIG1vcmUuXG5SZWFkYWJsZS5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uKGNodW5rLCBlbmNvZGluZykge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuXG4gIGlmICh0eXBlb2YgY2h1bmsgPT09ICdzdHJpbmcnICYmICFzdGF0ZS5vYmplY3RNb2RlKSB7XG4gICAgZW5jb2RpbmcgPSBlbmNvZGluZyB8fCBzdGF0ZS5kZWZhdWx0RW5jb2Rpbmc7XG4gICAgaWYgKGVuY29kaW5nICE9PSBzdGF0ZS5lbmNvZGluZykge1xuICAgICAgY2h1bmsgPSBuZXcgQnVmZmVyKGNodW5rLCBlbmNvZGluZyk7XG4gICAgICBlbmNvZGluZyA9ICcnO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZWFkYWJsZUFkZENodW5rKHRoaXMsIHN0YXRlLCBjaHVuaywgZW5jb2RpbmcsIGZhbHNlKTtcbn07XG5cbi8vIFVuc2hpZnQgc2hvdWxkICphbHdheXMqIGJlIHNvbWV0aGluZyBkaXJlY3RseSBvdXQgb2YgcmVhZCgpXG5SZWFkYWJsZS5wcm90b3R5cGUudW5zaGlmdCA9IGZ1bmN0aW9uKGNodW5rKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gIHJldHVybiByZWFkYWJsZUFkZENodW5rKHRoaXMsIHN0YXRlLCBjaHVuaywgJycsIHRydWUpO1xufTtcblxuZnVuY3Rpb24gcmVhZGFibGVBZGRDaHVuayhzdHJlYW0sIHN0YXRlLCBjaHVuaywgZW5jb2RpbmcsIGFkZFRvRnJvbnQpIHtcbiAgdmFyIGVyID0gY2h1bmtJbnZhbGlkKHN0YXRlLCBjaHVuayk7XG4gIGlmIChlcikge1xuICAgIHN0cmVhbS5lbWl0KCdlcnJvcicsIGVyKTtcbiAgfSBlbHNlIGlmIChjaHVuayA9PT0gbnVsbCB8fCBjaHVuayA9PT0gdW5kZWZpbmVkKSB7XG4gICAgc3RhdGUucmVhZGluZyA9IGZhbHNlO1xuICAgIGlmICghc3RhdGUuZW5kZWQpXG4gICAgICBvbkVvZkNodW5rKHN0cmVhbSwgc3RhdGUpO1xuICB9IGVsc2UgaWYgKHN0YXRlLm9iamVjdE1vZGUgfHwgY2h1bmsgJiYgY2h1bmsubGVuZ3RoID4gMCkge1xuICAgIGlmIChzdGF0ZS5lbmRlZCAmJiAhYWRkVG9Gcm9udCkge1xuICAgICAgdmFyIGUgPSBuZXcgRXJyb3IoJ3N0cmVhbS5wdXNoKCkgYWZ0ZXIgRU9GJyk7XG4gICAgICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlKTtcbiAgICB9IGVsc2UgaWYgKHN0YXRlLmVuZEVtaXR0ZWQgJiYgYWRkVG9Gcm9udCkge1xuICAgICAgdmFyIGUgPSBuZXcgRXJyb3IoJ3N0cmVhbS51bnNoaWZ0KCkgYWZ0ZXIgZW5kIGV2ZW50Jyk7XG4gICAgICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHN0YXRlLmRlY29kZXIgJiYgIWFkZFRvRnJvbnQgJiYgIWVuY29kaW5nKVxuICAgICAgICBjaHVuayA9IHN0YXRlLmRlY29kZXIud3JpdGUoY2h1bmspO1xuXG4gICAgICAvLyB1cGRhdGUgdGhlIGJ1ZmZlciBpbmZvLlxuICAgICAgc3RhdGUubGVuZ3RoICs9IHN0YXRlLm9iamVjdE1vZGUgPyAxIDogY2h1bmsubGVuZ3RoO1xuICAgICAgaWYgKGFkZFRvRnJvbnQpIHtcbiAgICAgICAgc3RhdGUuYnVmZmVyLnVuc2hpZnQoY2h1bmspO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RhdGUucmVhZGluZyA9IGZhbHNlO1xuICAgICAgICBzdGF0ZS5idWZmZXIucHVzaChjaHVuayk7XG4gICAgICB9XG5cbiAgICAgIGlmIChzdGF0ZS5uZWVkUmVhZGFibGUpXG4gICAgICAgIGVtaXRSZWFkYWJsZShzdHJlYW0pO1xuXG4gICAgICBtYXliZVJlYWRNb3JlKHN0cmVhbSwgc3RhdGUpO1xuICAgIH1cbiAgfSBlbHNlIGlmICghYWRkVG9Gcm9udCkge1xuICAgIHN0YXRlLnJlYWRpbmcgPSBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBuZWVkTW9yZURhdGEoc3RhdGUpO1xufVxuXG5cblxuLy8gaWYgaXQncyBwYXN0IHRoZSBoaWdoIHdhdGVyIG1hcmssIHdlIGNhbiBwdXNoIGluIHNvbWUgbW9yZS5cbi8vIEFsc28sIGlmIHdlIGhhdmUgbm8gZGF0YSB5ZXQsIHdlIGNhbiBzdGFuZCBzb21lXG4vLyBtb3JlIGJ5dGVzLiAgVGhpcyBpcyB0byB3b3JrIGFyb3VuZCBjYXNlcyB3aGVyZSBod209MCxcbi8vIHN1Y2ggYXMgdGhlIHJlcGwuICBBbHNvLCBpZiB0aGUgcHVzaCgpIHRyaWdnZXJlZCBhXG4vLyByZWFkYWJsZSBldmVudCwgYW5kIHRoZSB1c2VyIGNhbGxlZCByZWFkKGxhcmdlTnVtYmVyKSBzdWNoIHRoYXRcbi8vIG5lZWRSZWFkYWJsZSB3YXMgc2V0LCB0aGVuIHdlIG91Z2h0IHRvIHB1c2ggbW9yZSwgc28gdGhhdCBhbm90aGVyXG4vLyAncmVhZGFibGUnIGV2ZW50IHdpbGwgYmUgdHJpZ2dlcmVkLlxuZnVuY3Rpb24gbmVlZE1vcmVEYXRhKHN0YXRlKSB7XG4gIHJldHVybiAhc3RhdGUuZW5kZWQgJiZcbiAgICAgICAgIChzdGF0ZS5uZWVkUmVhZGFibGUgfHxcbiAgICAgICAgICBzdGF0ZS5sZW5ndGggPCBzdGF0ZS5oaWdoV2F0ZXJNYXJrIHx8XG4gICAgICAgICAgc3RhdGUubGVuZ3RoID09PSAwKTtcbn1cblxuLy8gYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuXG5SZWFkYWJsZS5wcm90b3R5cGUuc2V0RW5jb2RpbmcgPSBmdW5jdGlvbihlbmMpIHtcbiAgaWYgKCFTdHJpbmdEZWNvZGVyKVxuICAgIFN0cmluZ0RlY29kZXIgPSByZXF1aXJlKCdzdHJpbmdfZGVjb2RlcicpLlN0cmluZ0RlY29kZXI7XG4gIHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVjb2RlciA9IG5ldyBTdHJpbmdEZWNvZGVyKGVuYyk7XG4gIHRoaXMuX3JlYWRhYmxlU3RhdGUuZW5jb2RpbmcgPSBlbmM7XG59O1xuXG4vLyBEb24ndCByYWlzZSB0aGUgaHdtID4gMTI4TUJcbnZhciBNQVhfSFdNID0gMHg4MDAwMDA7XG5mdW5jdGlvbiByb3VuZFVwVG9OZXh0UG93ZXJPZjIobikge1xuICBpZiAobiA+PSBNQVhfSFdNKSB7XG4gICAgbiA9IE1BWF9IV007XG4gIH0gZWxzZSB7XG4gICAgLy8gR2V0IHRoZSBuZXh0IGhpZ2hlc3QgcG93ZXIgb2YgMlxuICAgIG4tLTtcbiAgICBmb3IgKHZhciBwID0gMTsgcCA8IDMyOyBwIDw8PSAxKSBuIHw9IG4gPj4gcDtcbiAgICBuKys7XG4gIH1cbiAgcmV0dXJuIG47XG59XG5cbmZ1bmN0aW9uIGhvd011Y2hUb1JlYWQobiwgc3RhdGUpIHtcbiAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCAmJiBzdGF0ZS5lbmRlZClcbiAgICByZXR1cm4gMDtcblxuICBpZiAoc3RhdGUub2JqZWN0TW9kZSlcbiAgICByZXR1cm4gbiA9PT0gMCA/IDAgOiAxO1xuXG4gIGlmIChpc05hTihuKSB8fCBuID09PSBudWxsKSB7XG4gICAgLy8gb25seSBmbG93IG9uZSBidWZmZXIgYXQgYSB0aW1lXG4gICAgaWYgKHN0YXRlLmZsb3dpbmcgJiYgc3RhdGUuYnVmZmVyLmxlbmd0aClcbiAgICAgIHJldHVybiBzdGF0ZS5idWZmZXJbMF0ubGVuZ3RoO1xuICAgIGVsc2VcbiAgICAgIHJldHVybiBzdGF0ZS5sZW5ndGg7XG4gIH1cblxuICBpZiAobiA8PSAwKVxuICAgIHJldHVybiAwO1xuXG4gIC8vIElmIHdlJ3JlIGFza2luZyBmb3IgbW9yZSB0aGFuIHRoZSB0YXJnZXQgYnVmZmVyIGxldmVsLFxuICAvLyB0aGVuIHJhaXNlIHRoZSB3YXRlciBtYXJrLiAgQnVtcCB1cCB0byB0aGUgbmV4dCBoaWdoZXN0XG4gIC8vIHBvd2VyIG9mIDIsIHRvIHByZXZlbnQgaW5jcmVhc2luZyBpdCBleGNlc3NpdmVseSBpbiB0aW55XG4gIC8vIGFtb3VudHMuXG4gIGlmIChuID4gc3RhdGUuaGlnaFdhdGVyTWFyaylcbiAgICBzdGF0ZS5oaWdoV2F0ZXJNYXJrID0gcm91bmRVcFRvTmV4dFBvd2VyT2YyKG4pO1xuXG4gIC8vIGRvbid0IGhhdmUgdGhhdCBtdWNoLiAgcmV0dXJuIG51bGwsIHVubGVzcyB3ZSd2ZSBlbmRlZC5cbiAgaWYgKG4gPiBzdGF0ZS5sZW5ndGgpIHtcbiAgICBpZiAoIXN0YXRlLmVuZGVkKSB7XG4gICAgICBzdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlO1xuICAgICAgcmV0dXJuIDA7XG4gICAgfSBlbHNlXG4gICAgICByZXR1cm4gc3RhdGUubGVuZ3RoO1xuICB9XG5cbiAgcmV0dXJuIG47XG59XG5cbi8vIHlvdSBjYW4gb3ZlcnJpZGUgZWl0aGVyIHRoaXMgbWV0aG9kLCBvciB0aGUgYXN5bmMgX3JlYWQobikgYmVsb3cuXG5SZWFkYWJsZS5wcm90b3R5cGUucmVhZCA9IGZ1bmN0aW9uKG4pIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgc3RhdGUuY2FsbGVkUmVhZCA9IHRydWU7XG4gIHZhciBuT3JpZyA9IG47XG5cbiAgaWYgKHR5cGVvZiBuICE9PSAnbnVtYmVyJyB8fCBuID4gMClcbiAgICBzdGF0ZS5lbWl0dGVkUmVhZGFibGUgPSBmYWxzZTtcblxuICAvLyBpZiB3ZSdyZSBkb2luZyByZWFkKDApIHRvIHRyaWdnZXIgYSByZWFkYWJsZSBldmVudCwgYnV0IHdlXG4gIC8vIGFscmVhZHkgaGF2ZSBhIGJ1bmNoIG9mIGRhdGEgaW4gdGhlIGJ1ZmZlciwgdGhlbiBqdXN0IHRyaWdnZXJcbiAgLy8gdGhlICdyZWFkYWJsZScgZXZlbnQgYW5kIG1vdmUgb24uXG4gIGlmIChuID09PSAwICYmXG4gICAgICBzdGF0ZS5uZWVkUmVhZGFibGUgJiZcbiAgICAgIChzdGF0ZS5sZW5ndGggPj0gc3RhdGUuaGlnaFdhdGVyTWFyayB8fCBzdGF0ZS5lbmRlZCkpIHtcbiAgICBlbWl0UmVhZGFibGUodGhpcyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBuID0gaG93TXVjaFRvUmVhZChuLCBzdGF0ZSk7XG5cbiAgLy8gaWYgd2UndmUgZW5kZWQsIGFuZCB3ZSdyZSBub3cgY2xlYXIsIHRoZW4gZmluaXNoIGl0IHVwLlxuICBpZiAobiA9PT0gMCAmJiBzdGF0ZS5lbmRlZCkge1xuICAgIGlmIChzdGF0ZS5sZW5ndGggPT09IDApXG4gICAgICBlbmRSZWFkYWJsZSh0aGlzKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8vIEFsbCB0aGUgYWN0dWFsIGNodW5rIGdlbmVyYXRpb24gbG9naWMgbmVlZHMgdG8gYmVcbiAgLy8gKmJlbG93KiB0aGUgY2FsbCB0byBfcmVhZC4gIFRoZSByZWFzb24gaXMgdGhhdCBpbiBjZXJ0YWluXG4gIC8vIHN5bnRoZXRpYyBzdHJlYW0gY2FzZXMsIHN1Y2ggYXMgcGFzc3Rocm91Z2ggc3RyZWFtcywgX3JlYWRcbiAgLy8gbWF5IGJlIGEgY29tcGxldGVseSBzeW5jaHJvbm91cyBvcGVyYXRpb24gd2hpY2ggbWF5IGNoYW5nZVxuICAvLyB0aGUgc3RhdGUgb2YgdGhlIHJlYWQgYnVmZmVyLCBwcm92aWRpbmcgZW5vdWdoIGRhdGEgd2hlblxuICAvLyBiZWZvcmUgdGhlcmUgd2FzICpub3QqIGVub3VnaC5cbiAgLy9cbiAgLy8gU28sIHRoZSBzdGVwcyBhcmU6XG4gIC8vIDEuIEZpZ3VyZSBvdXQgd2hhdCB0aGUgc3RhdGUgb2YgdGhpbmdzIHdpbGwgYmUgYWZ0ZXIgd2UgZG9cbiAgLy8gYSByZWFkIGZyb20gdGhlIGJ1ZmZlci5cbiAgLy9cbiAgLy8gMi4gSWYgdGhhdCByZXN1bHRpbmcgc3RhdGUgd2lsbCB0cmlnZ2VyIGEgX3JlYWQsIHRoZW4gY2FsbCBfcmVhZC5cbiAgLy8gTm90ZSB0aGF0IHRoaXMgbWF5IGJlIGFzeW5jaHJvbm91cywgb3Igc3luY2hyb25vdXMuICBZZXMsIGl0IGlzXG4gIC8vIGRlZXBseSB1Z2x5IHRvIHdyaXRlIEFQSXMgdGhpcyB3YXksIGJ1dCB0aGF0IHN0aWxsIGRvZXNuJ3QgbWVhblxuICAvLyB0aGF0IHRoZSBSZWFkYWJsZSBjbGFzcyBzaG91bGQgYmVoYXZlIGltcHJvcGVybHksIGFzIHN0cmVhbXMgYXJlXG4gIC8vIGRlc2lnbmVkIHRvIGJlIHN5bmMvYXN5bmMgYWdub3N0aWMuXG4gIC8vIFRha2Ugbm90ZSBpZiB0aGUgX3JlYWQgY2FsbCBpcyBzeW5jIG9yIGFzeW5jIChpZSwgaWYgdGhlIHJlYWQgY2FsbFxuICAvLyBoYXMgcmV0dXJuZWQgeWV0KSwgc28gdGhhdCB3ZSBrbm93IHdoZXRoZXIgb3Igbm90IGl0J3Mgc2FmZSB0byBlbWl0XG4gIC8vICdyZWFkYWJsZScgZXRjLlxuICAvL1xuICAvLyAzLiBBY3R1YWxseSBwdWxsIHRoZSByZXF1ZXN0ZWQgY2h1bmtzIG91dCBvZiB0aGUgYnVmZmVyIGFuZCByZXR1cm4uXG5cbiAgLy8gaWYgd2UgbmVlZCBhIHJlYWRhYmxlIGV2ZW50LCB0aGVuIHdlIG5lZWQgdG8gZG8gc29tZSByZWFkaW5nLlxuICB2YXIgZG9SZWFkID0gc3RhdGUubmVlZFJlYWRhYmxlO1xuXG4gIC8vIGlmIHdlIGN1cnJlbnRseSBoYXZlIGxlc3MgdGhhbiB0aGUgaGlnaFdhdGVyTWFyaywgdGhlbiBhbHNvIHJlYWQgc29tZVxuICBpZiAoc3RhdGUubGVuZ3RoIC0gbiA8PSBzdGF0ZS5oaWdoV2F0ZXJNYXJrKVxuICAgIGRvUmVhZCA9IHRydWU7XG5cbiAgLy8gaG93ZXZlciwgaWYgd2UndmUgZW5kZWQsIHRoZW4gdGhlcmUncyBubyBwb2ludCwgYW5kIGlmIHdlJ3JlIGFscmVhZHlcbiAgLy8gcmVhZGluZywgdGhlbiBpdCdzIHVubmVjZXNzYXJ5LlxuICBpZiAoc3RhdGUuZW5kZWQgfHwgc3RhdGUucmVhZGluZylcbiAgICBkb1JlYWQgPSBmYWxzZTtcblxuICBpZiAoZG9SZWFkKSB7XG4gICAgc3RhdGUucmVhZGluZyA9IHRydWU7XG4gICAgc3RhdGUuc3luYyA9IHRydWU7XG4gICAgLy8gaWYgdGhlIGxlbmd0aCBpcyBjdXJyZW50bHkgemVybywgdGhlbiB3ZSAqbmVlZCogYSByZWFkYWJsZSBldmVudC5cbiAgICBpZiAoc3RhdGUubGVuZ3RoID09PSAwKVxuICAgICAgc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICAvLyBjYWxsIGludGVybmFsIHJlYWQgbWV0aG9kXG4gICAgdGhpcy5fcmVhZChzdGF0ZS5oaWdoV2F0ZXJNYXJrKTtcbiAgICBzdGF0ZS5zeW5jID0gZmFsc2U7XG4gIH1cblxuICAvLyBJZiBfcmVhZCBjYWxsZWQgaXRzIGNhbGxiYWNrIHN5bmNocm9ub3VzbHksIHRoZW4gYHJlYWRpbmdgXG4gIC8vIHdpbGwgYmUgZmFsc2UsIGFuZCB3ZSBuZWVkIHRvIHJlLWV2YWx1YXRlIGhvdyBtdWNoIGRhdGEgd2VcbiAgLy8gY2FuIHJldHVybiB0byB0aGUgdXNlci5cbiAgaWYgKGRvUmVhZCAmJiAhc3RhdGUucmVhZGluZylcbiAgICBuID0gaG93TXVjaFRvUmVhZChuT3JpZywgc3RhdGUpO1xuXG4gIHZhciByZXQ7XG4gIGlmIChuID4gMClcbiAgICByZXQgPSBmcm9tTGlzdChuLCBzdGF0ZSk7XG4gIGVsc2VcbiAgICByZXQgPSBudWxsO1xuXG4gIGlmIChyZXQgPT09IG51bGwpIHtcbiAgICBzdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlO1xuICAgIG4gPSAwO1xuICB9XG5cbiAgc3RhdGUubGVuZ3RoIC09IG47XG5cbiAgLy8gSWYgd2UgaGF2ZSBub3RoaW5nIGluIHRoZSBidWZmZXIsIHRoZW4gd2Ugd2FudCB0byBrbm93XG4gIC8vIGFzIHNvb24gYXMgd2UgKmRvKiBnZXQgc29tZXRoaW5nIGludG8gdGhlIGJ1ZmZlci5cbiAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCAmJiAhc3RhdGUuZW5kZWQpXG4gICAgc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcblxuICAvLyBJZiB3ZSBoYXBwZW5lZCB0byByZWFkKCkgZXhhY3RseSB0aGUgcmVtYWluaW5nIGFtb3VudCBpbiB0aGVcbiAgLy8gYnVmZmVyLCBhbmQgdGhlIEVPRiBoYXMgYmVlbiBzZWVuIGF0IHRoaXMgcG9pbnQsIHRoZW4gbWFrZSBzdXJlXG4gIC8vIHRoYXQgd2UgZW1pdCAnZW5kJyBvbiB0aGUgdmVyeSBuZXh0IHRpY2suXG4gIGlmIChzdGF0ZS5lbmRlZCAmJiAhc3RhdGUuZW5kRW1pdHRlZCAmJiBzdGF0ZS5sZW5ndGggPT09IDApXG4gICAgZW5kUmVhZGFibGUodGhpcyk7XG5cbiAgcmV0dXJuIHJldDtcbn07XG5cbmZ1bmN0aW9uIGNodW5rSW52YWxpZChzdGF0ZSwgY2h1bmspIHtcbiAgdmFyIGVyID0gbnVsbDtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoY2h1bmspICYmXG4gICAgICAnc3RyaW5nJyAhPT0gdHlwZW9mIGNodW5rICYmXG4gICAgICBjaHVuayAhPT0gbnVsbCAmJlxuICAgICAgY2h1bmsgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgIXN0YXRlLm9iamVjdE1vZGUgJiZcbiAgICAgICFlcikge1xuICAgIGVyID0gbmV3IFR5cGVFcnJvcignSW52YWxpZCBub24tc3RyaW5nL2J1ZmZlciBjaHVuaycpO1xuICB9XG4gIHJldHVybiBlcjtcbn1cblxuXG5mdW5jdGlvbiBvbkVvZkNodW5rKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKHN0YXRlLmRlY29kZXIgJiYgIXN0YXRlLmVuZGVkKSB7XG4gICAgdmFyIGNodW5rID0gc3RhdGUuZGVjb2Rlci5lbmQoKTtcbiAgICBpZiAoY2h1bmsgJiYgY2h1bmsubGVuZ3RoKSB7XG4gICAgICBzdGF0ZS5idWZmZXIucHVzaChjaHVuayk7XG4gICAgICBzdGF0ZS5sZW5ndGggKz0gc3RhdGUub2JqZWN0TW9kZSA/IDEgOiBjaHVuay5sZW5ndGg7XG4gICAgfVxuICB9XG4gIHN0YXRlLmVuZGVkID0gdHJ1ZTtcblxuICAvLyBpZiB3ZSd2ZSBlbmRlZCBhbmQgd2UgaGF2ZSBzb21lIGRhdGEgbGVmdCwgdGhlbiBlbWl0XG4gIC8vICdyZWFkYWJsZScgbm93IHRvIG1ha2Ugc3VyZSBpdCBnZXRzIHBpY2tlZCB1cC5cbiAgaWYgKHN0YXRlLmxlbmd0aCA+IDApXG4gICAgZW1pdFJlYWRhYmxlKHN0cmVhbSk7XG4gIGVsc2VcbiAgICBlbmRSZWFkYWJsZShzdHJlYW0pO1xufVxuXG4vLyBEb24ndCBlbWl0IHJlYWRhYmxlIHJpZ2h0IGF3YXkgaW4gc3luYyBtb2RlLCBiZWNhdXNlIHRoaXMgY2FuIHRyaWdnZXJcbi8vIGFub3RoZXIgcmVhZCgpIGNhbGwgPT4gc3RhY2sgb3ZlcmZsb3cuICBUaGlzIHdheSwgaXQgbWlnaHQgdHJpZ2dlclxuLy8gYSBuZXh0VGljayByZWN1cnNpb24gd2FybmluZywgYnV0IHRoYXQncyBub3Qgc28gYmFkLlxuZnVuY3Rpb24gZW1pdFJlYWRhYmxlKHN0cmVhbSkge1xuICB2YXIgc3RhdGUgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGU7XG4gIHN0YXRlLm5lZWRSZWFkYWJsZSA9IGZhbHNlO1xuICBpZiAoc3RhdGUuZW1pdHRlZFJlYWRhYmxlKVxuICAgIHJldHVybjtcblxuICBzdGF0ZS5lbWl0dGVkUmVhZGFibGUgPSB0cnVlO1xuICBpZiAoc3RhdGUuc3luYylcbiAgICBzZXRJbW1lZGlhdGUoZnVuY3Rpb24oKSB7XG4gICAgICBlbWl0UmVhZGFibGVfKHN0cmVhbSk7XG4gICAgfSk7XG4gIGVsc2VcbiAgICBlbWl0UmVhZGFibGVfKHN0cmVhbSk7XG59XG5cbmZ1bmN0aW9uIGVtaXRSZWFkYWJsZV8oc3RyZWFtKSB7XG4gIHN0cmVhbS5lbWl0KCdyZWFkYWJsZScpO1xufVxuXG5cbi8vIGF0IHRoaXMgcG9pbnQsIHRoZSB1c2VyIGhhcyBwcmVzdW1hYmx5IHNlZW4gdGhlICdyZWFkYWJsZScgZXZlbnQsXG4vLyBhbmQgY2FsbGVkIHJlYWQoKSB0byBjb25zdW1lIHNvbWUgZGF0YS4gIHRoYXQgbWF5IGhhdmUgdHJpZ2dlcmVkXG4vLyBpbiB0dXJuIGFub3RoZXIgX3JlYWQobikgY2FsbCwgaW4gd2hpY2ggY2FzZSByZWFkaW5nID0gdHJ1ZSBpZlxuLy8gaXQncyBpbiBwcm9ncmVzcy5cbi8vIEhvd2V2ZXIsIGlmIHdlJ3JlIG5vdCBlbmRlZCwgb3IgcmVhZGluZywgYW5kIHRoZSBsZW5ndGggPCBod20sXG4vLyB0aGVuIGdvIGFoZWFkIGFuZCB0cnkgdG8gcmVhZCBzb21lIG1vcmUgcHJlZW1wdGl2ZWx5LlxuZnVuY3Rpb24gbWF5YmVSZWFkTW9yZShzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucmVhZGluZ01vcmUpIHtcbiAgICBzdGF0ZS5yZWFkaW5nTW9yZSA9IHRydWU7XG4gICAgc2V0SW1tZWRpYXRlKGZ1bmN0aW9uKCkge1xuICAgICAgbWF5YmVSZWFkTW9yZV8oc3RyZWFtLCBzdGF0ZSk7XG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbWF5YmVSZWFkTW9yZV8oc3RyZWFtLCBzdGF0ZSkge1xuICB2YXIgbGVuID0gc3RhdGUubGVuZ3RoO1xuICB3aGlsZSAoIXN0YXRlLnJlYWRpbmcgJiYgIXN0YXRlLmZsb3dpbmcgJiYgIXN0YXRlLmVuZGVkICYmXG4gICAgICAgICBzdGF0ZS5sZW5ndGggPCBzdGF0ZS5oaWdoV2F0ZXJNYXJrKSB7XG4gICAgc3RyZWFtLnJlYWQoMCk7XG4gICAgaWYgKGxlbiA9PT0gc3RhdGUubGVuZ3RoKVxuICAgICAgLy8gZGlkbid0IGdldCBhbnkgZGF0YSwgc3RvcCBzcGlubmluZy5cbiAgICAgIGJyZWFrO1xuICAgIGVsc2VcbiAgICAgIGxlbiA9IHN0YXRlLmxlbmd0aDtcbiAgfVxuICBzdGF0ZS5yZWFkaW5nTW9yZSA9IGZhbHNlO1xufVxuXG4vLyBhYnN0cmFjdCBtZXRob2QuICB0byBiZSBvdmVycmlkZGVuIGluIHNwZWNpZmljIGltcGxlbWVudGF0aW9uIGNsYXNzZXMuXG4vLyBjYWxsIGNiKGVyLCBkYXRhKSB3aGVyZSBkYXRhIGlzIDw9IG4gaW4gbGVuZ3RoLlxuLy8gZm9yIHZpcnR1YWwgKG5vbi1zdHJpbmcsIG5vbi1idWZmZXIpIHN0cmVhbXMsIFwibGVuZ3RoXCIgaXMgc29tZXdoYXRcbi8vIGFyYml0cmFyeSwgYW5kIHBlcmhhcHMgbm90IHZlcnkgbWVhbmluZ2Z1bC5cblJlYWRhYmxlLnByb3RvdHlwZS5fcmVhZCA9IGZ1bmN0aW9uKG4pIHtcbiAgdGhpcy5lbWl0KCdlcnJvcicsIG5ldyBFcnJvcignbm90IGltcGxlbWVudGVkJykpO1xufTtcblxuUmVhZGFibGUucHJvdG90eXBlLnBpcGUgPSBmdW5jdGlvbihkZXN0LCBwaXBlT3B0cykge1xuICB2YXIgc3JjID0gdGhpcztcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcblxuICBzd2l0Y2ggKHN0YXRlLnBpcGVzQ291bnQpIHtcbiAgICBjYXNlIDA6XG4gICAgICBzdGF0ZS5waXBlcyA9IGRlc3Q7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDE6XG4gICAgICBzdGF0ZS5waXBlcyA9IFtzdGF0ZS5waXBlcywgZGVzdF07XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgc3RhdGUucGlwZXMucHVzaChkZXN0KTtcbiAgICAgIGJyZWFrO1xuICB9XG4gIHN0YXRlLnBpcGVzQ291bnQgKz0gMTtcblxuICB2YXIgZG9FbmQgPSAoIXBpcGVPcHRzIHx8IHBpcGVPcHRzLmVuZCAhPT0gZmFsc2UpICYmXG4gICAgICAgICAgICAgIGRlc3QgIT09IHByb2Nlc3Muc3Rkb3V0ICYmXG4gICAgICAgICAgICAgIGRlc3QgIT09IHByb2Nlc3Muc3RkZXJyO1xuXG4gIHZhciBlbmRGbiA9IGRvRW5kID8gb25lbmQgOiBjbGVhbnVwO1xuICBpZiAoc3RhdGUuZW5kRW1pdHRlZClcbiAgICBzZXRJbW1lZGlhdGUoZW5kRm4pO1xuICBlbHNlXG4gICAgc3JjLm9uY2UoJ2VuZCcsIGVuZEZuKTtcblxuICBkZXN0Lm9uKCd1bnBpcGUnLCBvbnVucGlwZSk7XG4gIGZ1bmN0aW9uIG9udW5waXBlKHJlYWRhYmxlKSB7XG4gICAgaWYgKHJlYWRhYmxlICE9PSBzcmMpIHJldHVybjtcbiAgICBjbGVhbnVwKCk7XG4gIH1cblxuICBmdW5jdGlvbiBvbmVuZCgpIHtcbiAgICBkZXN0LmVuZCgpO1xuICB9XG5cbiAgLy8gd2hlbiB0aGUgZGVzdCBkcmFpbnMsIGl0IHJlZHVjZXMgdGhlIGF3YWl0RHJhaW4gY291bnRlclxuICAvLyBvbiB0aGUgc291cmNlLiAgVGhpcyB3b3VsZCBiZSBtb3JlIGVsZWdhbnQgd2l0aCBhIC5vbmNlKClcbiAgLy8gaGFuZGxlciBpbiBmbG93KCksIGJ1dCBhZGRpbmcgYW5kIHJlbW92aW5nIHJlcGVhdGVkbHkgaXNcbiAgLy8gdG9vIHNsb3cuXG4gIHZhciBvbmRyYWluID0gcGlwZU9uRHJhaW4oc3JjKTtcbiAgZGVzdC5vbignZHJhaW4nLCBvbmRyYWluKTtcblxuICBmdW5jdGlvbiBjbGVhbnVwKCkge1xuICAgIC8vIGNsZWFudXAgZXZlbnQgaGFuZGxlcnMgb25jZSB0aGUgcGlwZSBpcyBicm9rZW5cbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdjbG9zZScsIG9uY2xvc2UpO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2ZpbmlzaCcsIG9uZmluaXNoKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdkcmFpbicsIG9uZHJhaW4pO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgb25lcnJvcik7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcigndW5waXBlJywgb251bnBpcGUpO1xuICAgIHNyYy5yZW1vdmVMaXN0ZW5lcignZW5kJywgb25lbmQpO1xuICAgIHNyYy5yZW1vdmVMaXN0ZW5lcignZW5kJywgY2xlYW51cCk7XG5cbiAgICAvLyBpZiB0aGUgcmVhZGVyIGlzIHdhaXRpbmcgZm9yIGEgZHJhaW4gZXZlbnQgZnJvbSB0aGlzXG4gICAgLy8gc3BlY2lmaWMgd3JpdGVyLCB0aGVuIGl0IHdvdWxkIGNhdXNlIGl0IHRvIG5ldmVyIHN0YXJ0XG4gICAgLy8gZmxvd2luZyBhZ2Fpbi5cbiAgICAvLyBTbywgaWYgdGhpcyBpcyBhd2FpdGluZyBhIGRyYWluLCB0aGVuIHdlIGp1c3QgY2FsbCBpdCBub3cuXG4gICAgLy8gSWYgd2UgZG9uJ3Qga25vdywgdGhlbiBhc3N1bWUgdGhhdCB3ZSBhcmUgd2FpdGluZyBmb3Igb25lLlxuICAgIGlmICghZGVzdC5fd3JpdGFibGVTdGF0ZSB8fCBkZXN0Ll93cml0YWJsZVN0YXRlLm5lZWREcmFpbilcbiAgICAgIG9uZHJhaW4oKTtcbiAgfVxuXG4gIC8vIGlmIHRoZSBkZXN0IGhhcyBhbiBlcnJvciwgdGhlbiBzdG9wIHBpcGluZyBpbnRvIGl0LlxuICAvLyBob3dldmVyLCBkb24ndCBzdXBwcmVzcyB0aGUgdGhyb3dpbmcgYmVoYXZpb3IgZm9yIHRoaXMuXG4gIC8vIGNoZWNrIGZvciBsaXN0ZW5lcnMgYmVmb3JlIGVtaXQgcmVtb3ZlcyBvbmUtdGltZSBsaXN0ZW5lcnMuXG4gIHZhciBlcnJMaXN0ZW5lcnMgPSBFRS5saXN0ZW5lckNvdW50KGRlc3QsICdlcnJvcicpO1xuICBmdW5jdGlvbiBvbmVycm9yKGVyKSB7XG4gICAgdW5waXBlKCk7XG4gICAgaWYgKGVyckxpc3RlbmVycyA9PT0gMCAmJiBFRS5saXN0ZW5lckNvdW50KGRlc3QsICdlcnJvcicpID09PSAwKVxuICAgICAgZGVzdC5lbWl0KCdlcnJvcicsIGVyKTtcbiAgfVxuICBkZXN0Lm9uY2UoJ2Vycm9yJywgb25lcnJvcik7XG5cbiAgLy8gQm90aCBjbG9zZSBhbmQgZmluaXNoIHNob3VsZCB0cmlnZ2VyIHVucGlwZSwgYnV0IG9ubHkgb25jZS5cbiAgZnVuY3Rpb24gb25jbG9zZSgpIHtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdmaW5pc2gnLCBvbmZpbmlzaCk7XG4gICAgdW5waXBlKCk7XG4gIH1cbiAgZGVzdC5vbmNlKCdjbG9zZScsIG9uY2xvc2UpO1xuICBmdW5jdGlvbiBvbmZpbmlzaCgpIHtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdjbG9zZScsIG9uY2xvc2UpO1xuICAgIHVucGlwZSgpO1xuICB9XG4gIGRlc3Qub25jZSgnZmluaXNoJywgb25maW5pc2gpO1xuXG4gIGZ1bmN0aW9uIHVucGlwZSgpIHtcbiAgICBzcmMudW5waXBlKGRlc3QpO1xuICB9XG5cbiAgLy8gdGVsbCB0aGUgZGVzdCB0aGF0IGl0J3MgYmVpbmcgcGlwZWQgdG9cbiAgZGVzdC5lbWl0KCdwaXBlJywgc3JjKTtcblxuICAvLyBzdGFydCB0aGUgZmxvdyBpZiBpdCBoYXNuJ3QgYmVlbiBzdGFydGVkIGFscmVhZHkuXG4gIGlmICghc3RhdGUuZmxvd2luZykge1xuICAgIC8vIHRoZSBoYW5kbGVyIHRoYXQgd2FpdHMgZm9yIHJlYWRhYmxlIGV2ZW50cyBhZnRlciBhbGxcbiAgICAvLyB0aGUgZGF0YSBnZXRzIHN1Y2tlZCBvdXQgaW4gZmxvdy5cbiAgICAvLyBUaGlzIHdvdWxkIGJlIGVhc2llciB0byBmb2xsb3cgd2l0aCBhIC5vbmNlKCkgaGFuZGxlclxuICAgIC8vIGluIGZsb3coKSwgYnV0IHRoYXQgaXMgdG9vIHNsb3cuXG4gICAgdGhpcy5vbigncmVhZGFibGUnLCBwaXBlT25SZWFkYWJsZSk7XG5cbiAgICBzdGF0ZS5mbG93aW5nID0gdHJ1ZTtcbiAgICBzZXRJbW1lZGlhdGUoZnVuY3Rpb24oKSB7XG4gICAgICBmbG93KHNyYyk7XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gZGVzdDtcbn07XG5cbmZ1bmN0aW9uIHBpcGVPbkRyYWluKHNyYykge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGRlc3QgPSB0aGlzO1xuICAgIHZhciBzdGF0ZSA9IHNyYy5fcmVhZGFibGVTdGF0ZTtcbiAgICBzdGF0ZS5hd2FpdERyYWluLS07XG4gICAgaWYgKHN0YXRlLmF3YWl0RHJhaW4gPT09IDApXG4gICAgICBmbG93KHNyYyk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGZsb3coc3JjKSB7XG4gIHZhciBzdGF0ZSA9IHNyYy5fcmVhZGFibGVTdGF0ZTtcbiAgdmFyIGNodW5rO1xuICBzdGF0ZS5hd2FpdERyYWluID0gMDtcblxuICBmdW5jdGlvbiB3cml0ZShkZXN0LCBpLCBsaXN0KSB7XG4gICAgdmFyIHdyaXR0ZW4gPSBkZXN0LndyaXRlKGNodW5rKTtcbiAgICBpZiAoZmFsc2UgPT09IHdyaXR0ZW4pIHtcbiAgICAgIHN0YXRlLmF3YWl0RHJhaW4rKztcbiAgICB9XG4gIH1cblxuICB3aGlsZSAoc3RhdGUucGlwZXNDb3VudCAmJiBudWxsICE9PSAoY2h1bmsgPSBzcmMucmVhZCgpKSkge1xuXG4gICAgaWYgKHN0YXRlLnBpcGVzQ291bnQgPT09IDEpXG4gICAgICB3cml0ZShzdGF0ZS5waXBlcywgMCwgbnVsbCk7XG4gICAgZWxzZVxuICAgICAgZm9yRWFjaChzdGF0ZS5waXBlcywgd3JpdGUpO1xuXG4gICAgc3JjLmVtaXQoJ2RhdGEnLCBjaHVuayk7XG5cbiAgICAvLyBpZiBhbnlvbmUgbmVlZHMgYSBkcmFpbiwgdGhlbiB3ZSBoYXZlIHRvIHdhaXQgZm9yIHRoYXQuXG4gICAgaWYgKHN0YXRlLmF3YWl0RHJhaW4gPiAwKVxuICAgICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gaWYgZXZlcnkgZGVzdGluYXRpb24gd2FzIHVucGlwZWQsIGVpdGhlciBiZWZvcmUgZW50ZXJpbmcgdGhpc1xuICAvLyBmdW5jdGlvbiwgb3IgaW4gdGhlIHdoaWxlIGxvb3AsIHRoZW4gc3RvcCBmbG93aW5nLlxuICAvL1xuICAvLyBOQjogVGhpcyBpcyBhIHByZXR0eSByYXJlIGVkZ2UgY2FzZS5cbiAgaWYgKHN0YXRlLnBpcGVzQ291bnQgPT09IDApIHtcbiAgICBzdGF0ZS5mbG93aW5nID0gZmFsc2U7XG5cbiAgICAvLyBpZiB0aGVyZSB3ZXJlIGRhdGEgZXZlbnQgbGlzdGVuZXJzIGFkZGVkLCB0aGVuIHN3aXRjaCB0byBvbGQgbW9kZS5cbiAgICBpZiAoRUUubGlzdGVuZXJDb3VudChzcmMsICdkYXRhJykgPiAwKVxuICAgICAgZW1pdERhdGFFdmVudHMoc3JjKTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBhdCB0aGlzIHBvaW50LCBubyBvbmUgbmVlZGVkIGEgZHJhaW4sIHNvIHdlIGp1c3QgcmFuIG91dCBvZiBkYXRhXG4gIC8vIG9uIHRoZSBuZXh0IHJlYWRhYmxlIGV2ZW50LCBzdGFydCBpdCBvdmVyIGFnYWluLlxuICBzdGF0ZS5yYW5PdXQgPSB0cnVlO1xufVxuXG5mdW5jdGlvbiBwaXBlT25SZWFkYWJsZSgpIHtcbiAgaWYgKHRoaXMuX3JlYWRhYmxlU3RhdGUucmFuT3V0KSB7XG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5yYW5PdXQgPSBmYWxzZTtcbiAgICBmbG93KHRoaXMpO1xuICB9XG59XG5cblxuUmVhZGFibGUucHJvdG90eXBlLnVucGlwZSA9IGZ1bmN0aW9uKGRlc3QpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcblxuICAvLyBpZiB3ZSdyZSBub3QgcGlwaW5nIGFueXdoZXJlLCB0aGVuIGRvIG5vdGhpbmcuXG4gIGlmIChzdGF0ZS5waXBlc0NvdW50ID09PSAwKVxuICAgIHJldHVybiB0aGlzO1xuXG4gIC8vIGp1c3Qgb25lIGRlc3RpbmF0aW9uLiAgbW9zdCBjb21tb24gY2FzZS5cbiAgaWYgKHN0YXRlLnBpcGVzQ291bnQgPT09IDEpIHtcbiAgICAvLyBwYXNzZWQgaW4gb25lLCBidXQgaXQncyBub3QgdGhlIHJpZ2h0IG9uZS5cbiAgICBpZiAoZGVzdCAmJiBkZXN0ICE9PSBzdGF0ZS5waXBlcylcbiAgICAgIHJldHVybiB0aGlzO1xuXG4gICAgaWYgKCFkZXN0KVxuICAgICAgZGVzdCA9IHN0YXRlLnBpcGVzO1xuXG4gICAgLy8gZ290IGEgbWF0Y2guXG4gICAgc3RhdGUucGlwZXMgPSBudWxsO1xuICAgIHN0YXRlLnBpcGVzQ291bnQgPSAwO1xuICAgIHRoaXMucmVtb3ZlTGlzdGVuZXIoJ3JlYWRhYmxlJywgcGlwZU9uUmVhZGFibGUpO1xuICAgIHN0YXRlLmZsb3dpbmcgPSBmYWxzZTtcbiAgICBpZiAoZGVzdClcbiAgICAgIGRlc3QuZW1pdCgndW5waXBlJywgdGhpcyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBzbG93IGNhc2UuIG11bHRpcGxlIHBpcGUgZGVzdGluYXRpb25zLlxuXG4gIGlmICghZGVzdCkge1xuICAgIC8vIHJlbW92ZSBhbGwuXG4gICAgdmFyIGRlc3RzID0gc3RhdGUucGlwZXM7XG4gICAgdmFyIGxlbiA9IHN0YXRlLnBpcGVzQ291bnQ7XG4gICAgc3RhdGUucGlwZXMgPSBudWxsO1xuICAgIHN0YXRlLnBpcGVzQ291bnQgPSAwO1xuICAgIHRoaXMucmVtb3ZlTGlzdGVuZXIoJ3JlYWRhYmxlJywgcGlwZU9uUmVhZGFibGUpO1xuICAgIHN0YXRlLmZsb3dpbmcgPSBmYWxzZTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspXG4gICAgICBkZXN0c1tpXS5lbWl0KCd1bnBpcGUnLCB0aGlzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIHRyeSB0byBmaW5kIHRoZSByaWdodCBvbmUuXG4gIHZhciBpID0gaW5kZXhPZihzdGF0ZS5waXBlcywgZGVzdCk7XG4gIGlmIChpID09PSAtMSlcbiAgICByZXR1cm4gdGhpcztcblxuICBzdGF0ZS5waXBlcy5zcGxpY2UoaSwgMSk7XG4gIHN0YXRlLnBpcGVzQ291bnQgLT0gMTtcbiAgaWYgKHN0YXRlLnBpcGVzQ291bnQgPT09IDEpXG4gICAgc3RhdGUucGlwZXMgPSBzdGF0ZS5waXBlc1swXTtcblxuICBkZXN0LmVtaXQoJ3VucGlwZScsIHRoaXMpO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLy8gc2V0IHVwIGRhdGEgZXZlbnRzIGlmIHRoZXkgYXJlIGFza2VkIGZvclxuLy8gRW5zdXJlIHJlYWRhYmxlIGxpc3RlbmVycyBldmVudHVhbGx5IGdldCBzb21ldGhpbmdcblJlYWRhYmxlLnByb3RvdHlwZS5vbiA9IGZ1bmN0aW9uKGV2LCBmbikge1xuICB2YXIgcmVzID0gU3RyZWFtLnByb3RvdHlwZS5vbi5jYWxsKHRoaXMsIGV2LCBmbik7XG5cbiAgaWYgKGV2ID09PSAnZGF0YScgJiYgIXRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZylcbiAgICBlbWl0RGF0YUV2ZW50cyh0aGlzKTtcblxuICBpZiAoZXYgPT09ICdyZWFkYWJsZScgJiYgdGhpcy5yZWFkYWJsZSkge1xuICAgIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gICAgaWYgKCFzdGF0ZS5yZWFkYWJsZUxpc3RlbmluZykge1xuICAgICAgc3RhdGUucmVhZGFibGVMaXN0ZW5pbmcgPSB0cnVlO1xuICAgICAgc3RhdGUuZW1pdHRlZFJlYWRhYmxlID0gZmFsc2U7XG4gICAgICBzdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlO1xuICAgICAgaWYgKCFzdGF0ZS5yZWFkaW5nKSB7XG4gICAgICAgIHRoaXMucmVhZCgwKTtcbiAgICAgIH0gZWxzZSBpZiAoc3RhdGUubGVuZ3RoKSB7XG4gICAgICAgIGVtaXRSZWFkYWJsZSh0aGlzLCBzdGF0ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlcztcbn07XG5SZWFkYWJsZS5wcm90b3R5cGUuYWRkTGlzdGVuZXIgPSBSZWFkYWJsZS5wcm90b3R5cGUub247XG5cbi8vIHBhdXNlKCkgYW5kIHJlc3VtZSgpIGFyZSByZW1uYW50cyBvZiB0aGUgbGVnYWN5IHJlYWRhYmxlIHN0cmVhbSBBUElcbi8vIElmIHRoZSB1c2VyIHVzZXMgdGhlbSwgdGhlbiBzd2l0Y2ggaW50byBvbGQgbW9kZS5cblJlYWRhYmxlLnByb3RvdHlwZS5yZXN1bWUgPSBmdW5jdGlvbigpIHtcbiAgZW1pdERhdGFFdmVudHModGhpcyk7XG4gIHRoaXMucmVhZCgwKTtcbiAgdGhpcy5lbWl0KCdyZXN1bWUnKTtcbn07XG5cblJlYWRhYmxlLnByb3RvdHlwZS5wYXVzZSA9IGZ1bmN0aW9uKCkge1xuICBlbWl0RGF0YUV2ZW50cyh0aGlzLCB0cnVlKTtcbiAgdGhpcy5lbWl0KCdwYXVzZScpO1xufTtcblxuZnVuY3Rpb24gZW1pdERhdGFFdmVudHMoc3RyZWFtLCBzdGFydFBhdXNlZCkge1xuICB2YXIgc3RhdGUgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGU7XG5cbiAgaWYgKHN0YXRlLmZsb3dpbmcpIHtcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vaXNhYWNzL3JlYWRhYmxlLXN0cmVhbS9pc3N1ZXMvMTZcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBzd2l0Y2ggdG8gb2xkIG1vZGUgbm93LicpO1xuICB9XG5cbiAgdmFyIHBhdXNlZCA9IHN0YXJ0UGF1c2VkIHx8IGZhbHNlO1xuICB2YXIgcmVhZGFibGUgPSBmYWxzZTtcblxuICAvLyBjb252ZXJ0IHRvIGFuIG9sZC1zdHlsZSBzdHJlYW0uXG4gIHN0cmVhbS5yZWFkYWJsZSA9IHRydWU7XG4gIHN0cmVhbS5waXBlID0gU3RyZWFtLnByb3RvdHlwZS5waXBlO1xuICBzdHJlYW0ub24gPSBzdHJlYW0uYWRkTGlzdGVuZXIgPSBTdHJlYW0ucHJvdG90eXBlLm9uO1xuXG4gIHN0cmVhbS5vbigncmVhZGFibGUnLCBmdW5jdGlvbigpIHtcbiAgICByZWFkYWJsZSA9IHRydWU7XG5cbiAgICB2YXIgYztcbiAgICB3aGlsZSAoIXBhdXNlZCAmJiAobnVsbCAhPT0gKGMgPSBzdHJlYW0ucmVhZCgpKSkpXG4gICAgICBzdHJlYW0uZW1pdCgnZGF0YScsIGMpO1xuXG4gICAgaWYgKGMgPT09IG51bGwpIHtcbiAgICAgIHJlYWRhYmxlID0gZmFsc2U7XG4gICAgICBzdHJlYW0uX3JlYWRhYmxlU3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICB9XG4gIH0pO1xuXG4gIHN0cmVhbS5wYXVzZSA9IGZ1bmN0aW9uKCkge1xuICAgIHBhdXNlZCA9IHRydWU7XG4gICAgdGhpcy5lbWl0KCdwYXVzZScpO1xuICB9O1xuXG4gIHN0cmVhbS5yZXN1bWUgPSBmdW5jdGlvbigpIHtcbiAgICBwYXVzZWQgPSBmYWxzZTtcbiAgICBpZiAocmVhZGFibGUpXG4gICAgICBzZXRJbW1lZGlhdGUoZnVuY3Rpb24oKSB7XG4gICAgICAgIHN0cmVhbS5lbWl0KCdyZWFkYWJsZScpO1xuICAgICAgfSk7XG4gICAgZWxzZVxuICAgICAgdGhpcy5yZWFkKDApO1xuICAgIHRoaXMuZW1pdCgncmVzdW1lJyk7XG4gIH07XG5cbiAgLy8gbm93IG1ha2UgaXQgc3RhcnQsIGp1c3QgaW4gY2FzZSBpdCBoYWRuJ3QgYWxyZWFkeS5cbiAgc3RyZWFtLmVtaXQoJ3JlYWRhYmxlJyk7XG59XG5cbi8vIHdyYXAgYW4gb2xkLXN0eWxlIHN0cmVhbSBhcyB0aGUgYXN5bmMgZGF0YSBzb3VyY2UuXG4vLyBUaGlzIGlzICpub3QqIHBhcnQgb2YgdGhlIHJlYWRhYmxlIHN0cmVhbSBpbnRlcmZhY2UuXG4vLyBJdCBpcyBhbiB1Z2x5IHVuZm9ydHVuYXRlIG1lc3Mgb2YgaGlzdG9yeS5cblJlYWRhYmxlLnByb3RvdHlwZS53cmFwID0gZnVuY3Rpb24oc3RyZWFtKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gIHZhciBwYXVzZWQgPSBmYWxzZTtcblxuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHN0cmVhbS5vbignZW5kJywgZnVuY3Rpb24oKSB7XG4gICAgaWYgKHN0YXRlLmRlY29kZXIgJiYgIXN0YXRlLmVuZGVkKSB7XG4gICAgICB2YXIgY2h1bmsgPSBzdGF0ZS5kZWNvZGVyLmVuZCgpO1xuICAgICAgaWYgKGNodW5rICYmIGNodW5rLmxlbmd0aClcbiAgICAgICAgc2VsZi5wdXNoKGNodW5rKTtcbiAgICB9XG5cbiAgICBzZWxmLnB1c2gobnVsbCk7XG4gIH0pO1xuXG4gIHN0cmVhbS5vbignZGF0YScsIGZ1bmN0aW9uKGNodW5rKSB7XG4gICAgaWYgKHN0YXRlLmRlY29kZXIpXG4gICAgICBjaHVuayA9IHN0YXRlLmRlY29kZXIud3JpdGUoY2h1bmspO1xuICAgIGlmICghY2h1bmsgfHwgIXN0YXRlLm9iamVjdE1vZGUgJiYgIWNodW5rLmxlbmd0aClcbiAgICAgIHJldHVybjtcblxuICAgIHZhciByZXQgPSBzZWxmLnB1c2goY2h1bmspO1xuICAgIGlmICghcmV0KSB7XG4gICAgICBwYXVzZWQgPSB0cnVlO1xuICAgICAgc3RyZWFtLnBhdXNlKCk7XG4gICAgfVxuICB9KTtcblxuICAvLyBwcm94eSBhbGwgdGhlIG90aGVyIG1ldGhvZHMuXG4gIC8vIGltcG9ydGFudCB3aGVuIHdyYXBwaW5nIGZpbHRlcnMgYW5kIGR1cGxleGVzLlxuICBmb3IgKHZhciBpIGluIHN0cmVhbSkge1xuICAgIGlmICh0eXBlb2Ygc3RyZWFtW2ldID09PSAnZnVuY3Rpb24nICYmXG4gICAgICAgIHR5cGVvZiB0aGlzW2ldID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhpc1tpXSA9IGZ1bmN0aW9uKG1ldGhvZCkgeyByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBzdHJlYW1bbWV0aG9kXS5hcHBseShzdHJlYW0sIGFyZ3VtZW50cyk7XG4gICAgICB9fShpKTtcbiAgICB9XG4gIH1cblxuICAvLyBwcm94eSBjZXJ0YWluIGltcG9ydGFudCBldmVudHMuXG4gIHZhciBldmVudHMgPSBbJ2Vycm9yJywgJ2Nsb3NlJywgJ2Rlc3Ryb3knLCAncGF1c2UnLCAncmVzdW1lJ107XG4gIGZvckVhY2goZXZlbnRzLCBmdW5jdGlvbihldikge1xuICAgIHN0cmVhbS5vbihldiwgZnVuY3Rpb24gKHgpIHtcbiAgICAgIHJldHVybiBzZWxmLmVtaXQuYXBwbHkoc2VsZiwgZXYsIHgpO1xuICAgIH0pO1xuICB9KTtcblxuICAvLyB3aGVuIHdlIHRyeSB0byBjb25zdW1lIHNvbWUgbW9yZSBieXRlcywgc2ltcGx5IHVucGF1c2UgdGhlXG4gIC8vIHVuZGVybHlpbmcgc3RyZWFtLlxuICBzZWxmLl9yZWFkID0gZnVuY3Rpb24obikge1xuICAgIGlmIChwYXVzZWQpIHtcbiAgICAgIHBhdXNlZCA9IGZhbHNlO1xuICAgICAgc3RyZWFtLnJlc3VtZSgpO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gc2VsZjtcbn07XG5cblxuXG4vLyBleHBvc2VkIGZvciB0ZXN0aW5nIHB1cnBvc2VzIG9ubHkuXG5SZWFkYWJsZS5fZnJvbUxpc3QgPSBmcm9tTGlzdDtcblxuLy8gUGx1Y2sgb2ZmIG4gYnl0ZXMgZnJvbSBhbiBhcnJheSBvZiBidWZmZXJzLlxuLy8gTGVuZ3RoIGlzIHRoZSBjb21iaW5lZCBsZW5ndGhzIG9mIGFsbCB0aGUgYnVmZmVycyBpbiB0aGUgbGlzdC5cbmZ1bmN0aW9uIGZyb21MaXN0KG4sIHN0YXRlKSB7XG4gIHZhciBsaXN0ID0gc3RhdGUuYnVmZmVyO1xuICB2YXIgbGVuZ3RoID0gc3RhdGUubGVuZ3RoO1xuICB2YXIgc3RyaW5nTW9kZSA9ICEhc3RhdGUuZGVjb2RlcjtcbiAgdmFyIG9iamVjdE1vZGUgPSAhIXN0YXRlLm9iamVjdE1vZGU7XG4gIHZhciByZXQ7XG5cbiAgLy8gbm90aGluZyBpbiB0aGUgbGlzdCwgZGVmaW5pdGVseSBlbXB0eS5cbiAgaWYgKGxpc3QubGVuZ3RoID09PSAwKVxuICAgIHJldHVybiBudWxsO1xuXG4gIGlmIChsZW5ndGggPT09IDApXG4gICAgcmV0ID0gbnVsbDtcbiAgZWxzZSBpZiAob2JqZWN0TW9kZSlcbiAgICByZXQgPSBsaXN0LnNoaWZ0KCk7XG4gIGVsc2UgaWYgKCFuIHx8IG4gPj0gbGVuZ3RoKSB7XG4gICAgLy8gcmVhZCBpdCBhbGwsIHRydW5jYXRlIHRoZSBhcnJheS5cbiAgICBpZiAoc3RyaW5nTW9kZSlcbiAgICAgIHJldCA9IGxpc3Quam9pbignJyk7XG4gICAgZWxzZVxuICAgICAgcmV0ID0gQnVmZmVyLmNvbmNhdChsaXN0LCBsZW5ndGgpO1xuICAgIGxpc3QubGVuZ3RoID0gMDtcbiAgfSBlbHNlIHtcbiAgICAvLyByZWFkIGp1c3Qgc29tZSBvZiBpdC5cbiAgICBpZiAobiA8IGxpc3RbMF0ubGVuZ3RoKSB7XG4gICAgICAvLyBqdXN0IHRha2UgYSBwYXJ0IG9mIHRoZSBmaXJzdCBsaXN0IGl0ZW0uXG4gICAgICAvLyBzbGljZSBpcyB0aGUgc2FtZSBmb3IgYnVmZmVycyBhbmQgc3RyaW5ncy5cbiAgICAgIHZhciBidWYgPSBsaXN0WzBdO1xuICAgICAgcmV0ID0gYnVmLnNsaWNlKDAsIG4pO1xuICAgICAgbGlzdFswXSA9IGJ1Zi5zbGljZShuKTtcbiAgICB9IGVsc2UgaWYgKG4gPT09IGxpc3RbMF0ubGVuZ3RoKSB7XG4gICAgICAvLyBmaXJzdCBsaXN0IGlzIGEgcGVyZmVjdCBtYXRjaFxuICAgICAgcmV0ID0gbGlzdC5zaGlmdCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBjb21wbGV4IGNhc2UuXG4gICAgICAvLyB3ZSBoYXZlIGVub3VnaCB0byBjb3ZlciBpdCwgYnV0IGl0IHNwYW5zIHBhc3QgdGhlIGZpcnN0IGJ1ZmZlci5cbiAgICAgIGlmIChzdHJpbmdNb2RlKVxuICAgICAgICByZXQgPSAnJztcbiAgICAgIGVsc2VcbiAgICAgICAgcmV0ID0gbmV3IEJ1ZmZlcihuKTtcblxuICAgICAgdmFyIGMgPSAwO1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBsaXN0Lmxlbmd0aDsgaSA8IGwgJiYgYyA8IG47IGkrKykge1xuICAgICAgICB2YXIgYnVmID0gbGlzdFswXTtcbiAgICAgICAgdmFyIGNweSA9IE1hdGgubWluKG4gLSBjLCBidWYubGVuZ3RoKTtcblxuICAgICAgICBpZiAoc3RyaW5nTW9kZSlcbiAgICAgICAgICByZXQgKz0gYnVmLnNsaWNlKDAsIGNweSk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICBidWYuY29weShyZXQsIGMsIDAsIGNweSk7XG5cbiAgICAgICAgaWYgKGNweSA8IGJ1Zi5sZW5ndGgpXG4gICAgICAgICAgbGlzdFswXSA9IGJ1Zi5zbGljZShjcHkpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgbGlzdC5zaGlmdCgpO1xuXG4gICAgICAgIGMgKz0gY3B5O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIGVuZFJlYWRhYmxlKHN0cmVhbSkge1xuICB2YXIgc3RhdGUgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGU7XG5cbiAgLy8gSWYgd2UgZ2V0IGhlcmUgYmVmb3JlIGNvbnN1bWluZyBhbGwgdGhlIGJ5dGVzLCB0aGVuIHRoYXQgaXMgYVxuICAvLyBidWcgaW4gbm9kZS4gIFNob3VsZCBuZXZlciBoYXBwZW4uXG4gIGlmIChzdGF0ZS5sZW5ndGggPiAwKVxuICAgIHRocm93IG5ldyBFcnJvcignZW5kUmVhZGFibGUgY2FsbGVkIG9uIG5vbi1lbXB0eSBzdHJlYW0nKTtcblxuICBpZiAoIXN0YXRlLmVuZEVtaXR0ZWQgJiYgc3RhdGUuY2FsbGVkUmVhZCkge1xuICAgIHN0YXRlLmVuZGVkID0gdHJ1ZTtcbiAgICBzZXRJbW1lZGlhdGUoZnVuY3Rpb24oKSB7XG4gICAgICAvLyBDaGVjayB0aGF0IHdlIGRpZG4ndCBnZXQgb25lIGxhc3QgdW5zaGlmdC5cbiAgICAgIGlmICghc3RhdGUuZW5kRW1pdHRlZCAmJiBzdGF0ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgc3RhdGUuZW5kRW1pdHRlZCA9IHRydWU7XG4gICAgICAgIHN0cmVhbS5yZWFkYWJsZSA9IGZhbHNlO1xuICAgICAgICBzdHJlYW0uZW1pdCgnZW5kJyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZm9yRWFjaCAoeHMsIGYpIHtcbiAgZm9yICh2YXIgaSA9IDAsIGwgPSB4cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBmKHhzW2ldLCBpKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpbmRleE9mICh4cywgeCkge1xuICBmb3IgKHZhciBpID0gMCwgbCA9IHhzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGlmICh4c1tpXSA9PT0geCkgcmV0dXJuIGk7XG4gIH1cbiAgcmV0dXJuIC0xO1xufVxuXG59KS5jYWxsKHRoaXMscmVxdWlyZShcIktsaXViSFwiKSkiLCIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuLy8gYSB0cmFuc2Zvcm0gc3RyZWFtIGlzIGEgcmVhZGFibGUvd3JpdGFibGUgc3RyZWFtIHdoZXJlIHlvdSBkb1xuLy8gc29tZXRoaW5nIHdpdGggdGhlIGRhdGEuICBTb21ldGltZXMgaXQncyBjYWxsZWQgYSBcImZpbHRlclwiLFxuLy8gYnV0IHRoYXQncyBub3QgYSBncmVhdCBuYW1lIGZvciBpdCwgc2luY2UgdGhhdCBpbXBsaWVzIGEgdGhpbmcgd2hlcmVcbi8vIHNvbWUgYml0cyBwYXNzIHRocm91Z2gsIGFuZCBvdGhlcnMgYXJlIHNpbXBseSBpZ25vcmVkLiAgKFRoYXQgd291bGRcbi8vIGJlIGEgdmFsaWQgZXhhbXBsZSBvZiBhIHRyYW5zZm9ybSwgb2YgY291cnNlLilcbi8vXG4vLyBXaGlsZSB0aGUgb3V0cHV0IGlzIGNhdXNhbGx5IHJlbGF0ZWQgdG8gdGhlIGlucHV0LCBpdCdzIG5vdCBhXG4vLyBuZWNlc3NhcmlseSBzeW1tZXRyaWMgb3Igc3luY2hyb25vdXMgdHJhbnNmb3JtYXRpb24uICBGb3IgZXhhbXBsZSxcbi8vIGEgemxpYiBzdHJlYW0gbWlnaHQgdGFrZSBtdWx0aXBsZSBwbGFpbi10ZXh0IHdyaXRlcygpLCBhbmQgdGhlblxuLy8gZW1pdCBhIHNpbmdsZSBjb21wcmVzc2VkIGNodW5rIHNvbWUgdGltZSBpbiB0aGUgZnV0dXJlLlxuLy9cbi8vIEhlcmUncyBob3cgdGhpcyB3b3Jrczpcbi8vXG4vLyBUaGUgVHJhbnNmb3JtIHN0cmVhbSBoYXMgYWxsIHRoZSBhc3BlY3RzIG9mIHRoZSByZWFkYWJsZSBhbmQgd3JpdGFibGVcbi8vIHN0cmVhbSBjbGFzc2VzLiAgV2hlbiB5b3Ugd3JpdGUoY2h1bmspLCB0aGF0IGNhbGxzIF93cml0ZShjaHVuayxjYilcbi8vIGludGVybmFsbHksIGFuZCByZXR1cm5zIGZhbHNlIGlmIHRoZXJlJ3MgYSBsb3Qgb2YgcGVuZGluZyB3cml0ZXNcbi8vIGJ1ZmZlcmVkIHVwLiAgV2hlbiB5b3UgY2FsbCByZWFkKCksIHRoYXQgY2FsbHMgX3JlYWQobikgdW50aWxcbi8vIHRoZXJlJ3MgZW5vdWdoIHBlbmRpbmcgcmVhZGFibGUgZGF0YSBidWZmZXJlZCB1cC5cbi8vXG4vLyBJbiBhIHRyYW5zZm9ybSBzdHJlYW0sIHRoZSB3cml0dGVuIGRhdGEgaXMgcGxhY2VkIGluIGEgYnVmZmVyLiAgV2hlblxuLy8gX3JlYWQobikgaXMgY2FsbGVkLCBpdCB0cmFuc2Zvcm1zIHRoZSBxdWV1ZWQgdXAgZGF0YSwgY2FsbGluZyB0aGVcbi8vIGJ1ZmZlcmVkIF93cml0ZSBjYidzIGFzIGl0IGNvbnN1bWVzIGNodW5rcy4gIElmIGNvbnN1bWluZyBhIHNpbmdsZVxuLy8gd3JpdHRlbiBjaHVuayB3b3VsZCByZXN1bHQgaW4gbXVsdGlwbGUgb3V0cHV0IGNodW5rcywgdGhlbiB0aGUgZmlyc3Rcbi8vIG91dHB1dHRlZCBiaXQgY2FsbHMgdGhlIHJlYWRjYiwgYW5kIHN1YnNlcXVlbnQgY2h1bmtzIGp1c3QgZ28gaW50b1xuLy8gdGhlIHJlYWQgYnVmZmVyLCBhbmQgd2lsbCBjYXVzZSBpdCB0byBlbWl0ICdyZWFkYWJsZScgaWYgbmVjZXNzYXJ5LlxuLy9cbi8vIFRoaXMgd2F5LCBiYWNrLXByZXNzdXJlIGlzIGFjdHVhbGx5IGRldGVybWluZWQgYnkgdGhlIHJlYWRpbmcgc2lkZSxcbi8vIHNpbmNlIF9yZWFkIGhhcyB0byBiZSBjYWxsZWQgdG8gc3RhcnQgcHJvY2Vzc2luZyBhIG5ldyBjaHVuay4gIEhvd2V2ZXIsXG4vLyBhIHBhdGhvbG9naWNhbCBpbmZsYXRlIHR5cGUgb2YgdHJhbnNmb3JtIGNhbiBjYXVzZSBleGNlc3NpdmUgYnVmZmVyaW5nXG4vLyBoZXJlLiAgRm9yIGV4YW1wbGUsIGltYWdpbmUgYSBzdHJlYW0gd2hlcmUgZXZlcnkgYnl0ZSBvZiBpbnB1dCBpc1xuLy8gaW50ZXJwcmV0ZWQgYXMgYW4gaW50ZWdlciBmcm9tIDAtMjU1LCBhbmQgdGhlbiByZXN1bHRzIGluIHRoYXQgbWFueVxuLy8gYnl0ZXMgb2Ygb3V0cHV0LiAgV3JpdGluZyB0aGUgNCBieXRlcyB7ZmYsZmYsZmYsZmZ9IHdvdWxkIHJlc3VsdCBpblxuLy8gMWtiIG9mIGRhdGEgYmVpbmcgb3V0cHV0LiAgSW4gdGhpcyBjYXNlLCB5b3UgY291bGQgd3JpdGUgYSB2ZXJ5IHNtYWxsXG4vLyBhbW91bnQgb2YgaW5wdXQsIGFuZCBlbmQgdXAgd2l0aCBhIHZlcnkgbGFyZ2UgYW1vdW50IG9mIG91dHB1dC4gIEluXG4vLyBzdWNoIGEgcGF0aG9sb2dpY2FsIGluZmxhdGluZyBtZWNoYW5pc20sIHRoZXJlJ2QgYmUgbm8gd2F5IHRvIHRlbGxcbi8vIHRoZSBzeXN0ZW0gdG8gc3RvcCBkb2luZyB0aGUgdHJhbnNmb3JtLiAgQSBzaW5nbGUgNE1CIHdyaXRlIGNvdWxkXG4vLyBjYXVzZSB0aGUgc3lzdGVtIHRvIHJ1biBvdXQgb2YgbWVtb3J5LlxuLy9cbi8vIEhvd2V2ZXIsIGV2ZW4gaW4gc3VjaCBhIHBhdGhvbG9naWNhbCBjYXNlLCBvbmx5IGEgc2luZ2xlIHdyaXR0ZW4gY2h1bmtcbi8vIHdvdWxkIGJlIGNvbnN1bWVkLCBhbmQgdGhlbiB0aGUgcmVzdCB3b3VsZCB3YWl0ICh1bi10cmFuc2Zvcm1lZCkgdW50aWxcbi8vIHRoZSByZXN1bHRzIG9mIHRoZSBwcmV2aW91cyB0cmFuc2Zvcm1lZCBjaHVuayB3ZXJlIGNvbnN1bWVkLlxuXG5tb2R1bGUuZXhwb3J0cyA9IFRyYW5zZm9ybTtcblxudmFyIER1cGxleCA9IHJlcXVpcmUoJy4vZHVwbGV4LmpzJyk7XG52YXIgaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuaW5oZXJpdHMoVHJhbnNmb3JtLCBEdXBsZXgpO1xuXG5cbmZ1bmN0aW9uIFRyYW5zZm9ybVN0YXRlKG9wdGlvbnMsIHN0cmVhbSkge1xuICB0aGlzLmFmdGVyVHJhbnNmb3JtID0gZnVuY3Rpb24oZXIsIGRhdGEpIHtcbiAgICByZXR1cm4gYWZ0ZXJUcmFuc2Zvcm0oc3RyZWFtLCBlciwgZGF0YSk7XG4gIH07XG5cbiAgdGhpcy5uZWVkVHJhbnNmb3JtID0gZmFsc2U7XG4gIHRoaXMudHJhbnNmb3JtaW5nID0gZmFsc2U7XG4gIHRoaXMud3JpdGVjYiA9IG51bGw7XG4gIHRoaXMud3JpdGVjaHVuayA9IG51bGw7XG59XG5cbmZ1bmN0aW9uIGFmdGVyVHJhbnNmb3JtKHN0cmVhbSwgZXIsIGRhdGEpIHtcbiAgdmFyIHRzID0gc3RyZWFtLl90cmFuc2Zvcm1TdGF0ZTtcbiAgdHMudHJhbnNmb3JtaW5nID0gZmFsc2U7XG5cbiAgdmFyIGNiID0gdHMud3JpdGVjYjtcblxuICBpZiAoIWNiKVxuICAgIHJldHVybiBzdHJlYW0uZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IoJ25vIHdyaXRlY2IgaW4gVHJhbnNmb3JtIGNsYXNzJykpO1xuXG4gIHRzLndyaXRlY2h1bmsgPSBudWxsO1xuICB0cy53cml0ZWNiID0gbnVsbDtcblxuICBpZiAoZGF0YSAhPT0gbnVsbCAmJiBkYXRhICE9PSB1bmRlZmluZWQpXG4gICAgc3RyZWFtLnB1c2goZGF0YSk7XG5cbiAgaWYgKGNiKVxuICAgIGNiKGVyKTtcblxuICB2YXIgcnMgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGU7XG4gIHJzLnJlYWRpbmcgPSBmYWxzZTtcbiAgaWYgKHJzLm5lZWRSZWFkYWJsZSB8fCBycy5sZW5ndGggPCBycy5oaWdoV2F0ZXJNYXJrKSB7XG4gICAgc3RyZWFtLl9yZWFkKHJzLmhpZ2hXYXRlck1hcmspO1xuICB9XG59XG5cblxuZnVuY3Rpb24gVHJhbnNmb3JtKG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFRyYW5zZm9ybSkpXG4gICAgcmV0dXJuIG5ldyBUcmFuc2Zvcm0ob3B0aW9ucyk7XG5cbiAgRHVwbGV4LmNhbGwodGhpcywgb3B0aW9ucyk7XG5cbiAgdmFyIHRzID0gdGhpcy5fdHJhbnNmb3JtU3RhdGUgPSBuZXcgVHJhbnNmb3JtU3RhdGUob3B0aW9ucywgdGhpcyk7XG5cbiAgLy8gd2hlbiB0aGUgd3JpdGFibGUgc2lkZSBmaW5pc2hlcywgdGhlbiBmbHVzaCBvdXQgYW55dGhpbmcgcmVtYWluaW5nLlxuICB2YXIgc3RyZWFtID0gdGhpcztcblxuICAvLyBzdGFydCBvdXQgYXNraW5nIGZvciBhIHJlYWRhYmxlIGV2ZW50IG9uY2UgZGF0YSBpcyB0cmFuc2Zvcm1lZC5cbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlO1xuXG4gIC8vIHdlIGhhdmUgaW1wbGVtZW50ZWQgdGhlIF9yZWFkIG1ldGhvZCwgYW5kIGRvbmUgdGhlIG90aGVyIHRoaW5nc1xuICAvLyB0aGF0IFJlYWRhYmxlIHdhbnRzIGJlZm9yZSB0aGUgZmlyc3QgX3JlYWQgY2FsbCwgc28gdW5zZXQgdGhlXG4gIC8vIHN5bmMgZ3VhcmQgZmxhZy5cbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5zeW5jID0gZmFsc2U7XG5cbiAgdGhpcy5vbmNlKCdmaW5pc2gnLCBmdW5jdGlvbigpIHtcbiAgICBpZiAoJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIHRoaXMuX2ZsdXNoKVxuICAgICAgdGhpcy5fZmx1c2goZnVuY3Rpb24oZXIpIHtcbiAgICAgICAgZG9uZShzdHJlYW0sIGVyKTtcbiAgICAgIH0pO1xuICAgIGVsc2VcbiAgICAgIGRvbmUoc3RyZWFtKTtcbiAgfSk7XG59XG5cblRyYW5zZm9ybS5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uKGNodW5rLCBlbmNvZGluZykge1xuICB0aGlzLl90cmFuc2Zvcm1TdGF0ZS5uZWVkVHJhbnNmb3JtID0gZmFsc2U7XG4gIHJldHVybiBEdXBsZXgucHJvdG90eXBlLnB1c2guY2FsbCh0aGlzLCBjaHVuaywgZW5jb2RpbmcpO1xufTtcblxuLy8gVGhpcyBpcyB0aGUgcGFydCB3aGVyZSB5b3UgZG8gc3R1ZmYhXG4vLyBvdmVycmlkZSB0aGlzIGZ1bmN0aW9uIGluIGltcGxlbWVudGF0aW9uIGNsYXNzZXMuXG4vLyAnY2h1bmsnIGlzIGFuIGlucHV0IGNodW5rLlxuLy9cbi8vIENhbGwgYHB1c2gobmV3Q2h1bmspYCB0byBwYXNzIGFsb25nIHRyYW5zZm9ybWVkIG91dHB1dFxuLy8gdG8gdGhlIHJlYWRhYmxlIHNpZGUuICBZb3UgbWF5IGNhbGwgJ3B1c2gnIHplcm8gb3IgbW9yZSB0aW1lcy5cbi8vXG4vLyBDYWxsIGBjYihlcnIpYCB3aGVuIHlvdSBhcmUgZG9uZSB3aXRoIHRoaXMgY2h1bmsuICBJZiB5b3UgcGFzc1xuLy8gYW4gZXJyb3IsIHRoZW4gdGhhdCdsbCBwdXQgdGhlIGh1cnQgb24gdGhlIHdob2xlIG9wZXJhdGlvbi4gIElmIHlvdVxuLy8gbmV2ZXIgY2FsbCBjYigpLCB0aGVuIHlvdSdsbCBuZXZlciBnZXQgYW5vdGhlciBjaHVuay5cblRyYW5zZm9ybS5wcm90b3R5cGUuX3RyYW5zZm9ybSA9IGZ1bmN0aW9uKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgdGhyb3cgbmV3IEVycm9yKCdub3QgaW1wbGVtZW50ZWQnKTtcbn07XG5cblRyYW5zZm9ybS5wcm90b3R5cGUuX3dyaXRlID0gZnVuY3Rpb24oY2h1bmssIGVuY29kaW5nLCBjYikge1xuICB2YXIgdHMgPSB0aGlzLl90cmFuc2Zvcm1TdGF0ZTtcbiAgdHMud3JpdGVjYiA9IGNiO1xuICB0cy53cml0ZWNodW5rID0gY2h1bms7XG4gIHRzLndyaXRlZW5jb2RpbmcgPSBlbmNvZGluZztcbiAgaWYgKCF0cy50cmFuc2Zvcm1pbmcpIHtcbiAgICB2YXIgcnMgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICAgIGlmICh0cy5uZWVkVHJhbnNmb3JtIHx8XG4gICAgICAgIHJzLm5lZWRSZWFkYWJsZSB8fFxuICAgICAgICBycy5sZW5ndGggPCBycy5oaWdoV2F0ZXJNYXJrKVxuICAgICAgdGhpcy5fcmVhZChycy5oaWdoV2F0ZXJNYXJrKTtcbiAgfVxufTtcblxuLy8gRG9lc24ndCBtYXR0ZXIgd2hhdCB0aGUgYXJncyBhcmUgaGVyZS5cbi8vIF90cmFuc2Zvcm0gZG9lcyBhbGwgdGhlIHdvcmsuXG4vLyBUaGF0IHdlIGdvdCBoZXJlIG1lYW5zIHRoYXQgdGhlIHJlYWRhYmxlIHNpZGUgd2FudHMgbW9yZSBkYXRhLlxuVHJhbnNmb3JtLnByb3RvdHlwZS5fcmVhZCA9IGZ1bmN0aW9uKG4pIHtcbiAgdmFyIHRzID0gdGhpcy5fdHJhbnNmb3JtU3RhdGU7XG5cbiAgaWYgKHRzLndyaXRlY2h1bmsgJiYgdHMud3JpdGVjYiAmJiAhdHMudHJhbnNmb3JtaW5nKSB7XG4gICAgdHMudHJhbnNmb3JtaW5nID0gdHJ1ZTtcbiAgICB0aGlzLl90cmFuc2Zvcm0odHMud3JpdGVjaHVuaywgdHMud3JpdGVlbmNvZGluZywgdHMuYWZ0ZXJUcmFuc2Zvcm0pO1xuICB9IGVsc2Uge1xuICAgIC8vIG1hcmsgdGhhdCB3ZSBuZWVkIGEgdHJhbnNmb3JtLCBzbyB0aGF0IGFueSBkYXRhIHRoYXQgY29tZXMgaW5cbiAgICAvLyB3aWxsIGdldCBwcm9jZXNzZWQsIG5vdyB0aGF0IHdlJ3ZlIGFza2VkIGZvciBpdC5cbiAgICB0cy5uZWVkVHJhbnNmb3JtID0gdHJ1ZTtcbiAgfVxufTtcblxuXG5mdW5jdGlvbiBkb25lKHN0cmVhbSwgZXIpIHtcbiAgaWYgKGVyKVxuICAgIHJldHVybiBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcik7XG5cbiAgLy8gaWYgdGhlcmUncyBub3RoaW5nIGluIHRoZSB3cml0ZSBidWZmZXIsIHRoZW4gdGhhdCBtZWFuc1xuICAvLyB0aGF0IG5vdGhpbmcgbW9yZSB3aWxsIGV2ZXIgYmUgcHJvdmlkZWRcbiAgdmFyIHdzID0gc3RyZWFtLl93cml0YWJsZVN0YXRlO1xuICB2YXIgcnMgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGU7XG4gIHZhciB0cyA9IHN0cmVhbS5fdHJhbnNmb3JtU3RhdGU7XG5cbiAgaWYgKHdzLmxlbmd0aClcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2NhbGxpbmcgdHJhbnNmb3JtIGRvbmUgd2hlbiB3cy5sZW5ndGggIT0gMCcpO1xuXG4gIGlmICh0cy50cmFuc2Zvcm1pbmcpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdjYWxsaW5nIHRyYW5zZm9ybSBkb25lIHdoZW4gc3RpbGwgdHJhbnNmb3JtaW5nJyk7XG5cbiAgcmV0dXJuIHN0cmVhbS5wdXNoKG51bGwpO1xufVxuIiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbi8vIEEgYml0IHNpbXBsZXIgdGhhbiByZWFkYWJsZSBzdHJlYW1zLlxuLy8gSW1wbGVtZW50IGFuIGFzeW5jIC5fd3JpdGUoY2h1bmssIGNiKSwgYW5kIGl0J2xsIGhhbmRsZSBhbGxcbi8vIHRoZSBkcmFpbiBldmVudCBlbWlzc2lvbiBhbmQgYnVmZmVyaW5nLlxuXG5tb2R1bGUuZXhwb3J0cyA9IFdyaXRhYmxlO1xuV3JpdGFibGUuV3JpdGFibGVTdGF0ZSA9IFdyaXRhYmxlU3RhdGU7XG5cbnZhciBpc1VpbnQ4QXJyYXkgPSB0eXBlb2YgVWludDhBcnJheSAhPT0gJ3VuZGVmaW5lZCdcbiAgPyBmdW5jdGlvbiAoeCkgeyByZXR1cm4geCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkgfVxuICA6IGZ1bmN0aW9uICh4KSB7XG4gICAgcmV0dXJuIHggJiYgeC5jb25zdHJ1Y3RvciAmJiB4LmNvbnN0cnVjdG9yLm5hbWUgPT09ICdVaW50OEFycmF5J1xuICB9XG47XG52YXIgaXNBcnJheUJ1ZmZlciA9IHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCdcbiAgPyBmdW5jdGlvbiAoeCkgeyByZXR1cm4geCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyIH1cbiAgOiBmdW5jdGlvbiAoeCkge1xuICAgIHJldHVybiB4ICYmIHguY29uc3RydWN0b3IgJiYgeC5jb25zdHJ1Y3Rvci5uYW1lID09PSAnQXJyYXlCdWZmZXInXG4gIH1cbjtcblxudmFyIGluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcbnZhciBTdHJlYW0gPSByZXF1aXJlKCcuL2luZGV4LmpzJyk7XG52YXIgc2V0SW1tZWRpYXRlID0gcmVxdWlyZSgncHJvY2Vzcy9icm93c2VyLmpzJykubmV4dFRpY2s7XG52YXIgQnVmZmVyID0gcmVxdWlyZSgnYnVmZmVyJykuQnVmZmVyO1xuXG5pbmhlcml0cyhXcml0YWJsZSwgU3RyZWFtKTtcblxuZnVuY3Rpb24gV3JpdGVSZXEoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICB0aGlzLmNodW5rID0gY2h1bms7XG4gIHRoaXMuZW5jb2RpbmcgPSBlbmNvZGluZztcbiAgdGhpcy5jYWxsYmFjayA9IGNiO1xufVxuXG5mdW5jdGlvbiBXcml0YWJsZVN0YXRlKG9wdGlvbnMsIHN0cmVhbSkge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAvLyB0aGUgcG9pbnQgYXQgd2hpY2ggd3JpdGUoKSBzdGFydHMgcmV0dXJuaW5nIGZhbHNlXG4gIC8vIE5vdGU6IDAgaXMgYSB2YWxpZCB2YWx1ZSwgbWVhbnMgdGhhdCB3ZSBhbHdheXMgcmV0dXJuIGZhbHNlIGlmXG4gIC8vIHRoZSBlbnRpcmUgYnVmZmVyIGlzIG5vdCBmbHVzaGVkIGltbWVkaWF0ZWx5IG9uIHdyaXRlKClcbiAgdmFyIGh3bSA9IG9wdGlvbnMuaGlnaFdhdGVyTWFyaztcbiAgdGhpcy5oaWdoV2F0ZXJNYXJrID0gKGh3bSB8fCBod20gPT09IDApID8gaHdtIDogMTYgKiAxMDI0O1xuXG4gIC8vIG9iamVjdCBzdHJlYW0gZmxhZyB0byBpbmRpY2F0ZSB3aGV0aGVyIG9yIG5vdCB0aGlzIHN0cmVhbVxuICAvLyBjb250YWlucyBidWZmZXJzIG9yIG9iamVjdHMuXG4gIHRoaXMub2JqZWN0TW9kZSA9ICEhb3B0aW9ucy5vYmplY3RNb2RlO1xuXG4gIC8vIGNhc3QgdG8gaW50cy5cbiAgdGhpcy5oaWdoV2F0ZXJNYXJrID0gfn50aGlzLmhpZ2hXYXRlck1hcms7XG5cbiAgdGhpcy5uZWVkRHJhaW4gPSBmYWxzZTtcbiAgLy8gYXQgdGhlIHN0YXJ0IG9mIGNhbGxpbmcgZW5kKClcbiAgdGhpcy5lbmRpbmcgPSBmYWxzZTtcbiAgLy8gd2hlbiBlbmQoKSBoYXMgYmVlbiBjYWxsZWQsIGFuZCByZXR1cm5lZFxuICB0aGlzLmVuZGVkID0gZmFsc2U7XG4gIC8vIHdoZW4gJ2ZpbmlzaCcgaXMgZW1pdHRlZFxuICB0aGlzLmZpbmlzaGVkID0gZmFsc2U7XG5cbiAgLy8gc2hvdWxkIHdlIGRlY29kZSBzdHJpbmdzIGludG8gYnVmZmVycyBiZWZvcmUgcGFzc2luZyB0byBfd3JpdGU/XG4gIC8vIHRoaXMgaXMgaGVyZSBzbyB0aGF0IHNvbWUgbm9kZS1jb3JlIHN0cmVhbXMgY2FuIG9wdGltaXplIHN0cmluZ1xuICAvLyBoYW5kbGluZyBhdCBhIGxvd2VyIGxldmVsLlxuICB2YXIgbm9EZWNvZGUgPSBvcHRpb25zLmRlY29kZVN0cmluZ3MgPT09IGZhbHNlO1xuICB0aGlzLmRlY29kZVN0cmluZ3MgPSAhbm9EZWNvZGU7XG5cbiAgLy8gQ3J5cHRvIGlzIGtpbmQgb2Ygb2xkIGFuZCBjcnVzdHkuICBIaXN0b3JpY2FsbHksIGl0cyBkZWZhdWx0IHN0cmluZ1xuICAvLyBlbmNvZGluZyBpcyAnYmluYXJ5JyBzbyB3ZSBoYXZlIHRvIG1ha2UgdGhpcyBjb25maWd1cmFibGUuXG4gIC8vIEV2ZXJ5dGhpbmcgZWxzZSBpbiB0aGUgdW5pdmVyc2UgdXNlcyAndXRmOCcsIHRob3VnaC5cbiAgdGhpcy5kZWZhdWx0RW5jb2RpbmcgPSBvcHRpb25zLmRlZmF1bHRFbmNvZGluZyB8fCAndXRmOCc7XG5cbiAgLy8gbm90IGFuIGFjdHVhbCBidWZmZXIgd2Uga2VlcCB0cmFjayBvZiwgYnV0IGEgbWVhc3VyZW1lbnRcbiAgLy8gb2YgaG93IG11Y2ggd2UncmUgd2FpdGluZyB0byBnZXQgcHVzaGVkIHRvIHNvbWUgdW5kZXJseWluZ1xuICAvLyBzb2NrZXQgb3IgZmlsZS5cbiAgdGhpcy5sZW5ndGggPSAwO1xuXG4gIC8vIGEgZmxhZyB0byBzZWUgd2hlbiB3ZSdyZSBpbiB0aGUgbWlkZGxlIG9mIGEgd3JpdGUuXG4gIHRoaXMud3JpdGluZyA9IGZhbHNlO1xuXG4gIC8vIGEgZmxhZyB0byBiZSBhYmxlIHRvIHRlbGwgaWYgdGhlIG9ud3JpdGUgY2IgaXMgY2FsbGVkIGltbWVkaWF0ZWx5LFxuICAvLyBvciBvbiBhIGxhdGVyIHRpY2suICBXZSBzZXQgdGhpcyB0byB0cnVlIGF0IGZpcnN0LCBiZWN1YXNlIGFueVxuICAvLyBhY3Rpb25zIHRoYXQgc2hvdWxkbid0IGhhcHBlbiB1bnRpbCBcImxhdGVyXCIgc2hvdWxkIGdlbmVyYWxseSBhbHNvXG4gIC8vIG5vdCBoYXBwZW4gYmVmb3JlIHRoZSBmaXJzdCB3cml0ZSBjYWxsLlxuICB0aGlzLnN5bmMgPSB0cnVlO1xuXG4gIC8vIGEgZmxhZyB0byBrbm93IGlmIHdlJ3JlIHByb2Nlc3NpbmcgcHJldmlvdXNseSBidWZmZXJlZCBpdGVtcywgd2hpY2hcbiAgLy8gbWF5IGNhbGwgdGhlIF93cml0ZSgpIGNhbGxiYWNrIGluIHRoZSBzYW1lIHRpY2ssIHNvIHRoYXQgd2UgZG9uJ3RcbiAgLy8gZW5kIHVwIGluIGFuIG92ZXJsYXBwZWQgb253cml0ZSBzaXR1YXRpb24uXG4gIHRoaXMuYnVmZmVyUHJvY2Vzc2luZyA9IGZhbHNlO1xuXG4gIC8vIHRoZSBjYWxsYmFjayB0aGF0J3MgcGFzc2VkIHRvIF93cml0ZShjaHVuayxjYilcbiAgdGhpcy5vbndyaXRlID0gZnVuY3Rpb24oZXIpIHtcbiAgICBvbndyaXRlKHN0cmVhbSwgZXIpO1xuICB9O1xuXG4gIC8vIHRoZSBjYWxsYmFjayB0aGF0IHRoZSB1c2VyIHN1cHBsaWVzIHRvIHdyaXRlKGNodW5rLGVuY29kaW5nLGNiKVxuICB0aGlzLndyaXRlY2IgPSBudWxsO1xuXG4gIC8vIHRoZSBhbW91bnQgdGhhdCBpcyBiZWluZyB3cml0dGVuIHdoZW4gX3dyaXRlIGlzIGNhbGxlZC5cbiAgdGhpcy53cml0ZWxlbiA9IDA7XG5cbiAgdGhpcy5idWZmZXIgPSBbXTtcbn1cblxuZnVuY3Rpb24gV3JpdGFibGUob3B0aW9ucykge1xuICAvLyBXcml0YWJsZSBjdG9yIGlzIGFwcGxpZWQgdG8gRHVwbGV4ZXMsIHRob3VnaCB0aGV5J3JlIG5vdFxuICAvLyBpbnN0YW5jZW9mIFdyaXRhYmxlLCB0aGV5J3JlIGluc3RhbmNlb2YgUmVhZGFibGUuXG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBXcml0YWJsZSkgJiYgISh0aGlzIGluc3RhbmNlb2YgU3RyZWFtLkR1cGxleCkpXG4gICAgcmV0dXJuIG5ldyBXcml0YWJsZShvcHRpb25zKTtcblxuICB0aGlzLl93cml0YWJsZVN0YXRlID0gbmV3IFdyaXRhYmxlU3RhdGUob3B0aW9ucywgdGhpcyk7XG5cbiAgLy8gbGVnYWN5LlxuICB0aGlzLndyaXRhYmxlID0gdHJ1ZTtcblxuICBTdHJlYW0uY2FsbCh0aGlzKTtcbn1cblxuLy8gT3RoZXJ3aXNlIHBlb3BsZSBjYW4gcGlwZSBXcml0YWJsZSBzdHJlYW1zLCB3aGljaCBpcyBqdXN0IHdyb25nLlxuV3JpdGFibGUucHJvdG90eXBlLnBpcGUgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5lbWl0KCdlcnJvcicsIG5ldyBFcnJvcignQ2Fubm90IHBpcGUuIE5vdCByZWFkYWJsZS4nKSk7XG59O1xuXG5cbmZ1bmN0aW9uIHdyaXRlQWZ0ZXJFbmQoc3RyZWFtLCBzdGF0ZSwgY2IpIHtcbiAgdmFyIGVyID0gbmV3IEVycm9yKCd3cml0ZSBhZnRlciBlbmQnKTtcbiAgLy8gVE9ETzogZGVmZXIgZXJyb3IgZXZlbnRzIGNvbnNpc3RlbnRseSBldmVyeXdoZXJlLCBub3QganVzdCB0aGUgY2JcbiAgc3RyZWFtLmVtaXQoJ2Vycm9yJywgZXIpO1xuICBzZXRJbW1lZGlhdGUoZnVuY3Rpb24oKSB7XG4gICAgY2IoZXIpO1xuICB9KTtcbn1cblxuLy8gSWYgd2UgZ2V0IHNvbWV0aGluZyB0aGF0IGlzIG5vdCBhIGJ1ZmZlciwgc3RyaW5nLCBudWxsLCBvciB1bmRlZmluZWQsXG4vLyBhbmQgd2UncmUgbm90IGluIG9iamVjdE1vZGUsIHRoZW4gdGhhdCdzIGFuIGVycm9yLlxuLy8gT3RoZXJ3aXNlIHN0cmVhbSBjaHVua3MgYXJlIGFsbCBjb25zaWRlcmVkIHRvIGJlIG9mIGxlbmd0aD0xLCBhbmQgdGhlXG4vLyB3YXRlcm1hcmtzIGRldGVybWluZSBob3cgbWFueSBvYmplY3RzIHRvIGtlZXAgaW4gdGhlIGJ1ZmZlciwgcmF0aGVyIHRoYW5cbi8vIGhvdyBtYW55IGJ5dGVzIG9yIGNoYXJhY3RlcnMuXG5mdW5jdGlvbiB2YWxpZENodW5rKHN0cmVhbSwgc3RhdGUsIGNodW5rLCBjYikge1xuICB2YXIgdmFsaWQgPSB0cnVlO1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihjaHVuaykgJiZcbiAgICAgICdzdHJpbmcnICE9PSB0eXBlb2YgY2h1bmsgJiZcbiAgICAgIGNodW5rICE9PSBudWxsICYmXG4gICAgICBjaHVuayAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAhc3RhdGUub2JqZWN0TW9kZSkge1xuICAgIHZhciBlciA9IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgbm9uLXN0cmluZy9idWZmZXIgY2h1bmsnKTtcbiAgICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcik7XG4gICAgc2V0SW1tZWRpYXRlKGZ1bmN0aW9uKCkge1xuICAgICAgY2IoZXIpO1xuICAgIH0pO1xuICAgIHZhbGlkID0gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHZhbGlkO1xufVxuXG5Xcml0YWJsZS5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbihjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3dyaXRhYmxlU3RhdGU7XG4gIHZhciByZXQgPSBmYWxzZTtcblxuICBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2IgPSBlbmNvZGluZztcbiAgICBlbmNvZGluZyA9IG51bGw7XG4gIH1cblxuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihjaHVuaykgJiYgaXNVaW50OEFycmF5KGNodW5rKSlcbiAgICBjaHVuayA9IG5ldyBCdWZmZXIoY2h1bmspO1xuICBpZiAoaXNBcnJheUJ1ZmZlcihjaHVuaykgJiYgdHlwZW9mIFVpbnQ4QXJyYXkgIT09ICd1bmRlZmluZWQnKVxuICAgIGNodW5rID0gbmV3IEJ1ZmZlcihuZXcgVWludDhBcnJheShjaHVuaykpO1xuICBcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihjaHVuaykpXG4gICAgZW5jb2RpbmcgPSAnYnVmZmVyJztcbiAgZWxzZSBpZiAoIWVuY29kaW5nKVxuICAgIGVuY29kaW5nID0gc3RhdGUuZGVmYXVsdEVuY29kaW5nO1xuXG4gIGlmICh0eXBlb2YgY2IgIT09ICdmdW5jdGlvbicpXG4gICAgY2IgPSBmdW5jdGlvbigpIHt9O1xuXG4gIGlmIChzdGF0ZS5lbmRlZClcbiAgICB3cml0ZUFmdGVyRW5kKHRoaXMsIHN0YXRlLCBjYik7XG4gIGVsc2UgaWYgKHZhbGlkQ2h1bmsodGhpcywgc3RhdGUsIGNodW5rLCBjYikpXG4gICAgcmV0ID0gd3JpdGVPckJ1ZmZlcih0aGlzLCBzdGF0ZSwgY2h1bmssIGVuY29kaW5nLCBjYik7XG5cbiAgcmV0dXJuIHJldDtcbn07XG5cbmZ1bmN0aW9uIGRlY29kZUNodW5rKHN0YXRlLCBjaHVuaywgZW5jb2RpbmcpIHtcbiAgaWYgKCFzdGF0ZS5vYmplY3RNb2RlICYmXG4gICAgICBzdGF0ZS5kZWNvZGVTdHJpbmdzICE9PSBmYWxzZSAmJlxuICAgICAgdHlwZW9mIGNodW5rID09PSAnc3RyaW5nJykge1xuICAgIGNodW5rID0gbmV3IEJ1ZmZlcihjaHVuaywgZW5jb2RpbmcpO1xuICB9XG4gIHJldHVybiBjaHVuaztcbn1cblxuLy8gaWYgd2UncmUgYWxyZWFkeSB3cml0aW5nIHNvbWV0aGluZywgdGhlbiBqdXN0IHB1dCB0aGlzXG4vLyBpbiB0aGUgcXVldWUsIGFuZCB3YWl0IG91ciB0dXJuLiAgT3RoZXJ3aXNlLCBjYWxsIF93cml0ZVxuLy8gSWYgd2UgcmV0dXJuIGZhbHNlLCB0aGVuIHdlIG5lZWQgYSBkcmFpbiBldmVudCwgc28gc2V0IHRoYXQgZmxhZy5cbmZ1bmN0aW9uIHdyaXRlT3JCdWZmZXIoc3RyZWFtLCBzdGF0ZSwgY2h1bmssIGVuY29kaW5nLCBjYikge1xuICBjaHVuayA9IGRlY29kZUNodW5rKHN0YXRlLCBjaHVuaywgZW5jb2RpbmcpO1xuICB2YXIgbGVuID0gc3RhdGUub2JqZWN0TW9kZSA/IDEgOiBjaHVuay5sZW5ndGg7XG5cbiAgc3RhdGUubGVuZ3RoICs9IGxlbjtcblxuICB2YXIgcmV0ID0gc3RhdGUubGVuZ3RoIDwgc3RhdGUuaGlnaFdhdGVyTWFyaztcbiAgc3RhdGUubmVlZERyYWluID0gIXJldDtcblxuICBpZiAoc3RhdGUud3JpdGluZylcbiAgICBzdGF0ZS5idWZmZXIucHVzaChuZXcgV3JpdGVSZXEoY2h1bmssIGVuY29kaW5nLCBjYikpO1xuICBlbHNlXG4gICAgZG9Xcml0ZShzdHJlYW0sIHN0YXRlLCBsZW4sIGNodW5rLCBlbmNvZGluZywgY2IpO1xuXG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIGRvV3JpdGUoc3RyZWFtLCBzdGF0ZSwgbGVuLCBjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHN0YXRlLndyaXRlbGVuID0gbGVuO1xuICBzdGF0ZS53cml0ZWNiID0gY2I7XG4gIHN0YXRlLndyaXRpbmcgPSB0cnVlO1xuICBzdGF0ZS5zeW5jID0gdHJ1ZTtcbiAgc3RyZWFtLl93cml0ZShjaHVuaywgZW5jb2RpbmcsIHN0YXRlLm9ud3JpdGUpO1xuICBzdGF0ZS5zeW5jID0gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIG9ud3JpdGVFcnJvcihzdHJlYW0sIHN0YXRlLCBzeW5jLCBlciwgY2IpIHtcbiAgaWYgKHN5bmMpXG4gICAgc2V0SW1tZWRpYXRlKGZ1bmN0aW9uKCkge1xuICAgICAgY2IoZXIpO1xuICAgIH0pO1xuICBlbHNlXG4gICAgY2IoZXIpO1xuXG4gIHN0cmVhbS5lbWl0KCdlcnJvcicsIGVyKTtcbn1cblxuZnVuY3Rpb24gb253cml0ZVN0YXRlVXBkYXRlKHN0YXRlKSB7XG4gIHN0YXRlLndyaXRpbmcgPSBmYWxzZTtcbiAgc3RhdGUud3JpdGVjYiA9IG51bGw7XG4gIHN0YXRlLmxlbmd0aCAtPSBzdGF0ZS53cml0ZWxlbjtcbiAgc3RhdGUud3JpdGVsZW4gPSAwO1xufVxuXG5mdW5jdGlvbiBvbndyaXRlKHN0cmVhbSwgZXIpIHtcbiAgdmFyIHN0YXRlID0gc3RyZWFtLl93cml0YWJsZVN0YXRlO1xuICB2YXIgc3luYyA9IHN0YXRlLnN5bmM7XG4gIHZhciBjYiA9IHN0YXRlLndyaXRlY2I7XG5cbiAgb253cml0ZVN0YXRlVXBkYXRlKHN0YXRlKTtcblxuICBpZiAoZXIpXG4gICAgb253cml0ZUVycm9yKHN0cmVhbSwgc3RhdGUsIHN5bmMsIGVyLCBjYik7XG4gIGVsc2Uge1xuICAgIC8vIENoZWNrIGlmIHdlJ3JlIGFjdHVhbGx5IHJlYWR5IHRvIGZpbmlzaCwgYnV0IGRvbid0IGVtaXQgeWV0XG4gICAgdmFyIGZpbmlzaGVkID0gbmVlZEZpbmlzaChzdHJlYW0sIHN0YXRlKTtcblxuICAgIGlmICghZmluaXNoZWQgJiYgIXN0YXRlLmJ1ZmZlclByb2Nlc3NpbmcgJiYgc3RhdGUuYnVmZmVyLmxlbmd0aClcbiAgICAgIGNsZWFyQnVmZmVyKHN0cmVhbSwgc3RhdGUpO1xuXG4gICAgaWYgKHN5bmMpIHtcbiAgICAgIHNldEltbWVkaWF0ZShmdW5jdGlvbigpIHtcbiAgICAgICAgYWZ0ZXJXcml0ZShzdHJlYW0sIHN0YXRlLCBmaW5pc2hlZCwgY2IpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFmdGVyV3JpdGUoc3RyZWFtLCBzdGF0ZSwgZmluaXNoZWQsIGNiKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gYWZ0ZXJXcml0ZShzdHJlYW0sIHN0YXRlLCBmaW5pc2hlZCwgY2IpIHtcbiAgaWYgKCFmaW5pc2hlZClcbiAgICBvbndyaXRlRHJhaW4oc3RyZWFtLCBzdGF0ZSk7XG4gIGNiKCk7XG4gIGlmIChmaW5pc2hlZClcbiAgICBmaW5pc2hNYXliZShzdHJlYW0sIHN0YXRlKTtcbn1cblxuLy8gTXVzdCBmb3JjZSBjYWxsYmFjayB0byBiZSBjYWxsZWQgb24gbmV4dFRpY2ssIHNvIHRoYXQgd2UgZG9uJ3Rcbi8vIGVtaXQgJ2RyYWluJyBiZWZvcmUgdGhlIHdyaXRlKCkgY29uc3VtZXIgZ2V0cyB0aGUgJ2ZhbHNlJyByZXR1cm5cbi8vIHZhbHVlLCBhbmQgaGFzIGEgY2hhbmNlIHRvIGF0dGFjaCBhICdkcmFpbicgbGlzdGVuZXIuXG5mdW5jdGlvbiBvbndyaXRlRHJhaW4oc3RyZWFtLCBzdGF0ZSkge1xuICBpZiAoc3RhdGUubGVuZ3RoID09PSAwICYmIHN0YXRlLm5lZWREcmFpbikge1xuICAgIHN0YXRlLm5lZWREcmFpbiA9IGZhbHNlO1xuICAgIHN0cmVhbS5lbWl0KCdkcmFpbicpO1xuICB9XG59XG5cblxuLy8gaWYgdGhlcmUncyBzb21ldGhpbmcgaW4gdGhlIGJ1ZmZlciB3YWl0aW5nLCB0aGVuIHByb2Nlc3MgaXRcbmZ1bmN0aW9uIGNsZWFyQnVmZmVyKHN0cmVhbSwgc3RhdGUpIHtcbiAgc3RhdGUuYnVmZmVyUHJvY2Vzc2luZyA9IHRydWU7XG5cbiAgZm9yICh2YXIgYyA9IDA7IGMgPCBzdGF0ZS5idWZmZXIubGVuZ3RoOyBjKyspIHtcbiAgICB2YXIgZW50cnkgPSBzdGF0ZS5idWZmZXJbY107XG4gICAgdmFyIGNodW5rID0gZW50cnkuY2h1bms7XG4gICAgdmFyIGVuY29kaW5nID0gZW50cnkuZW5jb2Rpbmc7XG4gICAgdmFyIGNiID0gZW50cnkuY2FsbGJhY2s7XG4gICAgdmFyIGxlbiA9IHN0YXRlLm9iamVjdE1vZGUgPyAxIDogY2h1bmsubGVuZ3RoO1xuXG4gICAgZG9Xcml0ZShzdHJlYW0sIHN0YXRlLCBsZW4sIGNodW5rLCBlbmNvZGluZywgY2IpO1xuXG4gICAgLy8gaWYgd2UgZGlkbid0IGNhbGwgdGhlIG9ud3JpdGUgaW1tZWRpYXRlbHksIHRoZW5cbiAgICAvLyBpdCBtZWFucyB0aGF0IHdlIG5lZWQgdG8gd2FpdCB1bnRpbCBpdCBkb2VzLlxuICAgIC8vIGFsc28sIHRoYXQgbWVhbnMgdGhhdCB0aGUgY2h1bmsgYW5kIGNiIGFyZSBjdXJyZW50bHlcbiAgICAvLyBiZWluZyBwcm9jZXNzZWQsIHNvIG1vdmUgdGhlIGJ1ZmZlciBjb3VudGVyIHBhc3QgdGhlbS5cbiAgICBpZiAoc3RhdGUud3JpdGluZykge1xuICAgICAgYysrO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgc3RhdGUuYnVmZmVyUHJvY2Vzc2luZyA9IGZhbHNlO1xuICBpZiAoYyA8IHN0YXRlLmJ1ZmZlci5sZW5ndGgpXG4gICAgc3RhdGUuYnVmZmVyID0gc3RhdGUuYnVmZmVyLnNsaWNlKGMpO1xuICBlbHNlXG4gICAgc3RhdGUuYnVmZmVyLmxlbmd0aCA9IDA7XG59XG5cbldyaXRhYmxlLnByb3RvdHlwZS5fd3JpdGUgPSBmdW5jdGlvbihjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIGNiKG5ldyBFcnJvcignbm90IGltcGxlbWVudGVkJykpO1xufTtcblxuV3JpdGFibGUucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fd3JpdGFibGVTdGF0ZTtcblxuICBpZiAodHlwZW9mIGNodW5rID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2IgPSBjaHVuaztcbiAgICBjaHVuayA9IG51bGw7XG4gICAgZW5jb2RpbmcgPSBudWxsO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNiID0gZW5jb2Rpbmc7XG4gICAgZW5jb2RpbmcgPSBudWxsO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBjaHVuayAhPT0gJ3VuZGVmaW5lZCcgJiYgY2h1bmsgIT09IG51bGwpXG4gICAgdGhpcy53cml0ZShjaHVuaywgZW5jb2RpbmcpO1xuXG4gIC8vIGlnbm9yZSB1bm5lY2Vzc2FyeSBlbmQoKSBjYWxscy5cbiAgaWYgKCFzdGF0ZS5lbmRpbmcgJiYgIXN0YXRlLmZpbmlzaGVkKVxuICAgIGVuZFdyaXRhYmxlKHRoaXMsIHN0YXRlLCBjYik7XG59O1xuXG5cbmZ1bmN0aW9uIG5lZWRGaW5pc2goc3RyZWFtLCBzdGF0ZSkge1xuICByZXR1cm4gKHN0YXRlLmVuZGluZyAmJlxuICAgICAgICAgIHN0YXRlLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgICAgICFzdGF0ZS5maW5pc2hlZCAmJlxuICAgICAgICAgICFzdGF0ZS53cml0aW5nKTtcbn1cblxuZnVuY3Rpb24gZmluaXNoTWF5YmUoc3RyZWFtLCBzdGF0ZSkge1xuICB2YXIgbmVlZCA9IG5lZWRGaW5pc2goc3RyZWFtLCBzdGF0ZSk7XG4gIGlmIChuZWVkKSB7XG4gICAgc3RhdGUuZmluaXNoZWQgPSB0cnVlO1xuICAgIHN0cmVhbS5lbWl0KCdmaW5pc2gnKTtcbiAgfVxuICByZXR1cm4gbmVlZDtcbn1cblxuZnVuY3Rpb24gZW5kV3JpdGFibGUoc3RyZWFtLCBzdGF0ZSwgY2IpIHtcbiAgc3RhdGUuZW5kaW5nID0gdHJ1ZTtcbiAgZmluaXNoTWF5YmUoc3RyZWFtLCBzdGF0ZSk7XG4gIGlmIChjYikge1xuICAgIGlmIChzdGF0ZS5maW5pc2hlZClcbiAgICAgIHNldEltbWVkaWF0ZShjYik7XG4gICAgZWxzZVxuICAgICAgc3RyZWFtLm9uY2UoJ2ZpbmlzaCcsIGNiKTtcbiAgfVxuICBzdGF0ZS5lbmRlZCA9IHRydWU7XG59XG4iLCIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ2J1ZmZlcicpLkJ1ZmZlcjtcblxuZnVuY3Rpb24gYXNzZXJ0RW5jb2RpbmcoZW5jb2RpbmcpIHtcbiAgaWYgKGVuY29kaW5nICYmICFCdWZmZXIuaXNFbmNvZGluZyhlbmNvZGluZykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZyk7XG4gIH1cbn1cblxudmFyIFN0cmluZ0RlY29kZXIgPSBleHBvcnRzLlN0cmluZ0RlY29kZXIgPSBmdW5jdGlvbihlbmNvZGluZykge1xuICB0aGlzLmVuY29kaW5nID0gKGVuY29kaW5nIHx8ICd1dGY4JykudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bLV9dLywgJycpO1xuICBhc3NlcnRFbmNvZGluZyhlbmNvZGluZyk7XG4gIHN3aXRjaCAodGhpcy5lbmNvZGluZykge1xuICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgLy8gQ0VTVS04IHJlcHJlc2VudHMgZWFjaCBvZiBTdXJyb2dhdGUgUGFpciBieSAzLWJ5dGVzXG4gICAgICB0aGlzLnN1cnJvZ2F0ZVNpemUgPSAzO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAndWNzMic6XG4gICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICAvLyBVVEYtMTYgcmVwcmVzZW50cyBlYWNoIG9mIFN1cnJvZ2F0ZSBQYWlyIGJ5IDItYnl0ZXNcbiAgICAgIHRoaXMuc3Vycm9nYXRlU2l6ZSA9IDI7XG4gICAgICB0aGlzLmRldGVjdEluY29tcGxldGVDaGFyID0gdXRmMTZEZXRlY3RJbmNvbXBsZXRlQ2hhcjtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAvLyBCYXNlLTY0IHN0b3JlcyAzIGJ5dGVzIGluIDQgY2hhcnMsIGFuZCBwYWRzIHRoZSByZW1haW5kZXIuXG4gICAgICB0aGlzLnN1cnJvZ2F0ZVNpemUgPSAzO1xuICAgICAgdGhpcy5kZXRlY3RJbmNvbXBsZXRlQ2hhciA9IGJhc2U2NERldGVjdEluY29tcGxldGVDaGFyO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRoaXMud3JpdGUgPSBwYXNzVGhyb3VnaFdyaXRlO1xuICAgICAgcmV0dXJuO1xuICB9XG5cbiAgdGhpcy5jaGFyQnVmZmVyID0gbmV3IEJ1ZmZlcig2KTtcbiAgdGhpcy5jaGFyUmVjZWl2ZWQgPSAwO1xuICB0aGlzLmNoYXJMZW5ndGggPSAwO1xufTtcblxuXG5TdHJpbmdEZWNvZGVyLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uKGJ1ZmZlcikge1xuICB2YXIgY2hhclN0ciA9ICcnO1xuICB2YXIgb2Zmc2V0ID0gMDtcblxuICAvLyBpZiBvdXIgbGFzdCB3cml0ZSBlbmRlZCB3aXRoIGFuIGluY29tcGxldGUgbXVsdGlieXRlIGNoYXJhY3RlclxuICB3aGlsZSAodGhpcy5jaGFyTGVuZ3RoKSB7XG4gICAgLy8gZGV0ZXJtaW5lIGhvdyBtYW55IHJlbWFpbmluZyBieXRlcyB0aGlzIGJ1ZmZlciBoYXMgdG8gb2ZmZXIgZm9yIHRoaXMgY2hhclxuICAgIHZhciBpID0gKGJ1ZmZlci5sZW5ndGggPj0gdGhpcy5jaGFyTGVuZ3RoIC0gdGhpcy5jaGFyUmVjZWl2ZWQpID9cbiAgICAgICAgICAgICAgICB0aGlzLmNoYXJMZW5ndGggLSB0aGlzLmNoYXJSZWNlaXZlZCA6XG4gICAgICAgICAgICAgICAgYnVmZmVyLmxlbmd0aDtcblxuICAgIC8vIGFkZCB0aGUgbmV3IGJ5dGVzIHRvIHRoZSBjaGFyIGJ1ZmZlclxuICAgIGJ1ZmZlci5jb3B5KHRoaXMuY2hhckJ1ZmZlciwgdGhpcy5jaGFyUmVjZWl2ZWQsIG9mZnNldCwgaSk7XG4gICAgdGhpcy5jaGFyUmVjZWl2ZWQgKz0gKGkgLSBvZmZzZXQpO1xuICAgIG9mZnNldCA9IGk7XG5cbiAgICBpZiAodGhpcy5jaGFyUmVjZWl2ZWQgPCB0aGlzLmNoYXJMZW5ndGgpIHtcbiAgICAgIC8vIHN0aWxsIG5vdCBlbm91Z2ggY2hhcnMgaW4gdGhpcyBidWZmZXI/IHdhaXQgZm9yIG1vcmUgLi4uXG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgLy8gZ2V0IHRoZSBjaGFyYWN0ZXIgdGhhdCB3YXMgc3BsaXRcbiAgICBjaGFyU3RyID0gdGhpcy5jaGFyQnVmZmVyLnNsaWNlKDAsIHRoaXMuY2hhckxlbmd0aCkudG9TdHJpbmcodGhpcy5lbmNvZGluZyk7XG5cbiAgICAvLyBsZWFkIHN1cnJvZ2F0ZSAoRDgwMC1EQkZGKSBpcyBhbHNvIHRoZSBpbmNvbXBsZXRlIGNoYXJhY3RlclxuICAgIHZhciBjaGFyQ29kZSA9IGNoYXJTdHIuY2hhckNvZGVBdChjaGFyU3RyLmxlbmd0aCAtIDEpO1xuICAgIGlmIChjaGFyQ29kZSA+PSAweEQ4MDAgJiYgY2hhckNvZGUgPD0gMHhEQkZGKSB7XG4gICAgICB0aGlzLmNoYXJMZW5ndGggKz0gdGhpcy5zdXJyb2dhdGVTaXplO1xuICAgICAgY2hhclN0ciA9ICcnO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHRoaXMuY2hhclJlY2VpdmVkID0gdGhpcy5jaGFyTGVuZ3RoID0gMDtcblxuICAgIC8vIGlmIHRoZXJlIGFyZSBubyBtb3JlIGJ5dGVzIGluIHRoaXMgYnVmZmVyLCBqdXN0IGVtaXQgb3VyIGNoYXJcbiAgICBpZiAoaSA9PSBidWZmZXIubGVuZ3RoKSByZXR1cm4gY2hhclN0cjtcblxuICAgIC8vIG90aGVyd2lzZSBjdXQgb2ZmIHRoZSBjaGFyYWN0ZXJzIGVuZCBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhpcyBidWZmZXJcbiAgICBidWZmZXIgPSBidWZmZXIuc2xpY2UoaSwgYnVmZmVyLmxlbmd0aCk7XG4gICAgYnJlYWs7XG4gIH1cblxuICB2YXIgbGVuSW5jb21wbGV0ZSA9IHRoaXMuZGV0ZWN0SW5jb21wbGV0ZUNoYXIoYnVmZmVyKTtcblxuICB2YXIgZW5kID0gYnVmZmVyLmxlbmd0aDtcbiAgaWYgKHRoaXMuY2hhckxlbmd0aCkge1xuICAgIC8vIGJ1ZmZlciB0aGUgaW5jb21wbGV0ZSBjaGFyYWN0ZXIgYnl0ZXMgd2UgZ290XG4gICAgYnVmZmVyLmNvcHkodGhpcy5jaGFyQnVmZmVyLCAwLCBidWZmZXIubGVuZ3RoIC0gbGVuSW5jb21wbGV0ZSwgZW5kKTtcbiAgICB0aGlzLmNoYXJSZWNlaXZlZCA9IGxlbkluY29tcGxldGU7XG4gICAgZW5kIC09IGxlbkluY29tcGxldGU7XG4gIH1cblxuICBjaGFyU3RyICs9IGJ1ZmZlci50b1N0cmluZyh0aGlzLmVuY29kaW5nLCAwLCBlbmQpO1xuXG4gIHZhciBlbmQgPSBjaGFyU3RyLmxlbmd0aCAtIDE7XG4gIHZhciBjaGFyQ29kZSA9IGNoYXJTdHIuY2hhckNvZGVBdChlbmQpO1xuICAvLyBsZWFkIHN1cnJvZ2F0ZSAoRDgwMC1EQkZGKSBpcyBhbHNvIHRoZSBpbmNvbXBsZXRlIGNoYXJhY3RlclxuICBpZiAoY2hhckNvZGUgPj0gMHhEODAwICYmIGNoYXJDb2RlIDw9IDB4REJGRikge1xuICAgIHZhciBzaXplID0gdGhpcy5zdXJyb2dhdGVTaXplO1xuICAgIHRoaXMuY2hhckxlbmd0aCArPSBzaXplO1xuICAgIHRoaXMuY2hhclJlY2VpdmVkICs9IHNpemU7XG4gICAgdGhpcy5jaGFyQnVmZmVyLmNvcHkodGhpcy5jaGFyQnVmZmVyLCBzaXplLCAwLCBzaXplKTtcbiAgICB0aGlzLmNoYXJCdWZmZXIud3JpdGUoY2hhclN0ci5jaGFyQXQoY2hhclN0ci5sZW5ndGggLSAxKSwgdGhpcy5lbmNvZGluZyk7XG4gICAgcmV0dXJuIGNoYXJTdHIuc3Vic3RyaW5nKDAsIGVuZCk7XG4gIH1cblxuICAvLyBvciBqdXN0IGVtaXQgdGhlIGNoYXJTdHJcbiAgcmV0dXJuIGNoYXJTdHI7XG59O1xuXG5TdHJpbmdEZWNvZGVyLnByb3RvdHlwZS5kZXRlY3RJbmNvbXBsZXRlQ2hhciA9IGZ1bmN0aW9uKGJ1ZmZlcikge1xuICAvLyBkZXRlcm1pbmUgaG93IG1hbnkgYnl0ZXMgd2UgaGF2ZSB0byBjaGVjayBhdCB0aGUgZW5kIG9mIHRoaXMgYnVmZmVyXG4gIHZhciBpID0gKGJ1ZmZlci5sZW5ndGggPj0gMykgPyAzIDogYnVmZmVyLmxlbmd0aDtcblxuICAvLyBGaWd1cmUgb3V0IGlmIG9uZSBvZiB0aGUgbGFzdCBpIGJ5dGVzIG9mIG91ciBidWZmZXIgYW5ub3VuY2VzIGFuXG4gIC8vIGluY29tcGxldGUgY2hhci5cbiAgZm9yICg7IGkgPiAwOyBpLS0pIHtcbiAgICB2YXIgYyA9IGJ1ZmZlcltidWZmZXIubGVuZ3RoIC0gaV07XG5cbiAgICAvLyBTZWUgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9VVEYtOCNEZXNjcmlwdGlvblxuXG4gICAgLy8gMTEwWFhYWFhcbiAgICBpZiAoaSA9PSAxICYmIGMgPj4gNSA9PSAweDA2KSB7XG4gICAgICB0aGlzLmNoYXJMZW5ndGggPSAyO1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgLy8gMTExMFhYWFhcbiAgICBpZiAoaSA8PSAyICYmIGMgPj4gNCA9PSAweDBFKSB7XG4gICAgICB0aGlzLmNoYXJMZW5ndGggPSAzO1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgLy8gMTExMTBYWFhcbiAgICBpZiAoaSA8PSAzICYmIGMgPj4gMyA9PSAweDFFKSB7XG4gICAgICB0aGlzLmNoYXJMZW5ndGggPSA0O1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGk7XG59O1xuXG5TdHJpbmdEZWNvZGVyLnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbihidWZmZXIpIHtcbiAgdmFyIHJlcyA9ICcnO1xuICBpZiAoYnVmZmVyICYmIGJ1ZmZlci5sZW5ndGgpXG4gICAgcmVzID0gdGhpcy53cml0ZShidWZmZXIpO1xuXG4gIGlmICh0aGlzLmNoYXJSZWNlaXZlZCkge1xuICAgIHZhciBjciA9IHRoaXMuY2hhclJlY2VpdmVkO1xuICAgIHZhciBidWYgPSB0aGlzLmNoYXJCdWZmZXI7XG4gICAgdmFyIGVuYyA9IHRoaXMuZW5jb2Rpbmc7XG4gICAgcmVzICs9IGJ1Zi5zbGljZSgwLCBjcikudG9TdHJpbmcoZW5jKTtcbiAgfVxuXG4gIHJldHVybiByZXM7XG59O1xuXG5mdW5jdGlvbiBwYXNzVGhyb3VnaFdyaXRlKGJ1ZmZlcikge1xuICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKHRoaXMuZW5jb2RpbmcpO1xufVxuXG5mdW5jdGlvbiB1dGYxNkRldGVjdEluY29tcGxldGVDaGFyKGJ1ZmZlcikge1xuICB2YXIgaW5jb21wbGV0ZSA9IHRoaXMuY2hhclJlY2VpdmVkID0gYnVmZmVyLmxlbmd0aCAlIDI7XG4gIHRoaXMuY2hhckxlbmd0aCA9IGluY29tcGxldGUgPyAyIDogMDtcbiAgcmV0dXJuIGluY29tcGxldGU7XG59XG5cbmZ1bmN0aW9uIGJhc2U2NERldGVjdEluY29tcGxldGVDaGFyKGJ1ZmZlcikge1xuICB2YXIgaW5jb21wbGV0ZSA9IHRoaXMuY2hhclJlY2VpdmVkID0gYnVmZmVyLmxlbmd0aCAlIDM7XG4gIHRoaXMuY2hhckxlbmd0aCA9IGluY29tcGxldGUgPyAzIDogMDtcbiAgcmV0dXJuIGluY29tcGxldGU7XG59XG4iLCJpZiAodHlwZW9mIE9iamVjdC5jcmVhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgLy8gaW1wbGVtZW50YXRpb24gZnJvbSBzdGFuZGFyZCBub2RlLmpzICd1dGlsJyBtb2R1bGVcbiAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpbmhlcml0cyhjdG9yLCBzdXBlckN0b3IpIHtcbiAgICBjdG9yLnN1cGVyXyA9IHN1cGVyQ3RvclxuICAgIGN0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckN0b3IucHJvdG90eXBlLCB7XG4gICAgICBjb25zdHJ1Y3Rvcjoge1xuICAgICAgICB2YWx1ZTogY3RvcixcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcbn0gZWxzZSB7XG4gIC8vIG9sZCBzY2hvb2wgc2hpbSBmb3Igb2xkIGJyb3dzZXJzXG4gIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaW5oZXJpdHMoY3Rvciwgc3VwZXJDdG9yKSB7XG4gICAgY3Rvci5zdXBlcl8gPSBzdXBlckN0b3JcbiAgICB2YXIgVGVtcEN0b3IgPSBmdW5jdGlvbiAoKSB7fVxuICAgIFRlbXBDdG9yLnByb3RvdHlwZSA9IHN1cGVyQ3Rvci5wcm90b3R5cGVcbiAgICBjdG9yLnByb3RvdHlwZSA9IG5ldyBUZW1wQ3RvcigpXG4gICAgY3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBjdG9yXG4gIH1cbn1cbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaXNCdWZmZXIoYXJnKSB7XG4gIHJldHVybiBhcmcgJiYgdHlwZW9mIGFyZyA9PT0gJ29iamVjdCdcbiAgICAmJiB0eXBlb2YgYXJnLmNvcHkgPT09ICdmdW5jdGlvbidcbiAgICAmJiB0eXBlb2YgYXJnLmZpbGwgPT09ICdmdW5jdGlvbidcbiAgICAmJiB0eXBlb2YgYXJnLnJlYWRVSW50OCA9PT0gJ2Z1bmN0aW9uJztcbn0iLCIoZnVuY3Rpb24gKHByb2Nlc3MsZ2xvYmFsKXtcbi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG52YXIgZm9ybWF0UmVnRXhwID0gLyVbc2RqJV0vZztcbmV4cG9ydHMuZm9ybWF0ID0gZnVuY3Rpb24oZikge1xuICBpZiAoIWlzU3RyaW5nKGYpKSB7XG4gICAgdmFyIG9iamVjdHMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgb2JqZWN0cy5wdXNoKGluc3BlY3QoYXJndW1lbnRzW2ldKSk7XG4gICAgfVxuICAgIHJldHVybiBvYmplY3RzLmpvaW4oJyAnKTtcbiAgfVxuXG4gIHZhciBpID0gMTtcbiAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gIHZhciBsZW4gPSBhcmdzLmxlbmd0aDtcbiAgdmFyIHN0ciA9IFN0cmluZyhmKS5yZXBsYWNlKGZvcm1hdFJlZ0V4cCwgZnVuY3Rpb24oeCkge1xuICAgIGlmICh4ID09PSAnJSUnKSByZXR1cm4gJyUnO1xuICAgIGlmIChpID49IGxlbikgcmV0dXJuIHg7XG4gICAgc3dpdGNoICh4KSB7XG4gICAgICBjYXNlICclcyc6IHJldHVybiBTdHJpbmcoYXJnc1tpKytdKTtcbiAgICAgIGNhc2UgJyVkJzogcmV0dXJuIE51bWJlcihhcmdzW2krK10pO1xuICAgICAgY2FzZSAnJWonOlxuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShhcmdzW2krK10pO1xuICAgICAgICB9IGNhdGNoIChfKSB7XG4gICAgICAgICAgcmV0dXJuICdbQ2lyY3VsYXJdJztcbiAgICAgICAgfVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHg7XG4gICAgfVxuICB9KTtcbiAgZm9yICh2YXIgeCA9IGFyZ3NbaV07IGkgPCBsZW47IHggPSBhcmdzWysraV0pIHtcbiAgICBpZiAoaXNOdWxsKHgpIHx8ICFpc09iamVjdCh4KSkge1xuICAgICAgc3RyICs9ICcgJyArIHg7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0ciArPSAnICcgKyBpbnNwZWN0KHgpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gc3RyO1xufTtcblxuXG4vLyBNYXJrIHRoYXQgYSBtZXRob2Qgc2hvdWxkIG5vdCBiZSB1c2VkLlxuLy8gUmV0dXJucyBhIG1vZGlmaWVkIGZ1bmN0aW9uIHdoaWNoIHdhcm5zIG9uY2UgYnkgZGVmYXVsdC5cbi8vIElmIC0tbm8tZGVwcmVjYXRpb24gaXMgc2V0LCB0aGVuIGl0IGlzIGEgbm8tb3AuXG5leHBvcnRzLmRlcHJlY2F0ZSA9IGZ1bmN0aW9uKGZuLCBtc2cpIHtcbiAgLy8gQWxsb3cgZm9yIGRlcHJlY2F0aW5nIHRoaW5ncyBpbiB0aGUgcHJvY2VzcyBvZiBzdGFydGluZyB1cC5cbiAgaWYgKGlzVW5kZWZpbmVkKGdsb2JhbC5wcm9jZXNzKSkge1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBleHBvcnRzLmRlcHJlY2F0ZShmbiwgbXNnKS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG4gIH1cblxuICBpZiAocHJvY2Vzcy5ub0RlcHJlY2F0aW9uID09PSB0cnVlKSB7XG4gICAgcmV0dXJuIGZuO1xuICB9XG5cbiAgdmFyIHdhcm5lZCA9IGZhbHNlO1xuICBmdW5jdGlvbiBkZXByZWNhdGVkKCkge1xuICAgIGlmICghd2FybmVkKSB7XG4gICAgICBpZiAocHJvY2Vzcy50aHJvd0RlcHJlY2F0aW9uKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xuICAgICAgfSBlbHNlIGlmIChwcm9jZXNzLnRyYWNlRGVwcmVjYXRpb24pIHtcbiAgICAgICAgY29uc29sZS50cmFjZShtc2cpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihtc2cpO1xuICAgICAgfVxuICAgICAgd2FybmVkID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cblxuICByZXR1cm4gZGVwcmVjYXRlZDtcbn07XG5cblxudmFyIGRlYnVncyA9IHt9O1xudmFyIGRlYnVnRW52aXJvbjtcbmV4cG9ydHMuZGVidWdsb2cgPSBmdW5jdGlvbihzZXQpIHtcbiAgaWYgKGlzVW5kZWZpbmVkKGRlYnVnRW52aXJvbikpXG4gICAgZGVidWdFbnZpcm9uID0gcHJvY2Vzcy5lbnYuTk9ERV9ERUJVRyB8fCAnJztcbiAgc2V0ID0gc2V0LnRvVXBwZXJDYXNlKCk7XG4gIGlmICghZGVidWdzW3NldF0pIHtcbiAgICBpZiAobmV3IFJlZ0V4cCgnXFxcXGInICsgc2V0ICsgJ1xcXFxiJywgJ2knKS50ZXN0KGRlYnVnRW52aXJvbikpIHtcbiAgICAgIHZhciBwaWQgPSBwcm9jZXNzLnBpZDtcbiAgICAgIGRlYnVnc1tzZXRdID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBtc2cgPSBleHBvcnRzLmZvcm1hdC5hcHBseShleHBvcnRzLCBhcmd1bWVudHMpO1xuICAgICAgICBjb25zb2xlLmVycm9yKCclcyAlZDogJXMnLCBzZXQsIHBpZCwgbXNnKTtcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlYnVnc1tzZXRdID0gZnVuY3Rpb24oKSB7fTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRlYnVnc1tzZXRdO1xufTtcblxuXG4vKipcbiAqIEVjaG9zIHRoZSB2YWx1ZSBvZiBhIHZhbHVlLiBUcnlzIHRvIHByaW50IHRoZSB2YWx1ZSBvdXRcbiAqIGluIHRoZSBiZXN0IHdheSBwb3NzaWJsZSBnaXZlbiB0aGUgZGlmZmVyZW50IHR5cGVzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBwcmludCBvdXQuXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0cyBPcHRpb25hbCBvcHRpb25zIG9iamVjdCB0aGF0IGFsdGVycyB0aGUgb3V0cHV0LlxuICovXG4vKiBsZWdhY3k6IG9iaiwgc2hvd0hpZGRlbiwgZGVwdGgsIGNvbG9ycyovXG5mdW5jdGlvbiBpbnNwZWN0KG9iaiwgb3B0cykge1xuICAvLyBkZWZhdWx0IG9wdGlvbnNcbiAgdmFyIGN0eCA9IHtcbiAgICBzZWVuOiBbXSxcbiAgICBzdHlsaXplOiBzdHlsaXplTm9Db2xvclxuICB9O1xuICAvLyBsZWdhY3kuLi5cbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPj0gMykgY3R4LmRlcHRoID0gYXJndW1lbnRzWzJdO1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+PSA0KSBjdHguY29sb3JzID0gYXJndW1lbnRzWzNdO1xuICBpZiAoaXNCb29sZWFuKG9wdHMpKSB7XG4gICAgLy8gbGVnYWN5Li4uXG4gICAgY3R4LnNob3dIaWRkZW4gPSBvcHRzO1xuICB9IGVsc2UgaWYgKG9wdHMpIHtcbiAgICAvLyBnb3QgYW4gXCJvcHRpb25zXCIgb2JqZWN0XG4gICAgZXhwb3J0cy5fZXh0ZW5kKGN0eCwgb3B0cyk7XG4gIH1cbiAgLy8gc2V0IGRlZmF1bHQgb3B0aW9uc1xuICBpZiAoaXNVbmRlZmluZWQoY3R4LnNob3dIaWRkZW4pKSBjdHguc2hvd0hpZGRlbiA9IGZhbHNlO1xuICBpZiAoaXNVbmRlZmluZWQoY3R4LmRlcHRoKSkgY3R4LmRlcHRoID0gMjtcbiAgaWYgKGlzVW5kZWZpbmVkKGN0eC5jb2xvcnMpKSBjdHguY29sb3JzID0gZmFsc2U7XG4gIGlmIChpc1VuZGVmaW5lZChjdHguY3VzdG9tSW5zcGVjdCkpIGN0eC5jdXN0b21JbnNwZWN0ID0gdHJ1ZTtcbiAgaWYgKGN0eC5jb2xvcnMpIGN0eC5zdHlsaXplID0gc3R5bGl6ZVdpdGhDb2xvcjtcbiAgcmV0dXJuIGZvcm1hdFZhbHVlKGN0eCwgb2JqLCBjdHguZGVwdGgpO1xufVxuZXhwb3J0cy5pbnNwZWN0ID0gaW5zcGVjdDtcblxuXG4vLyBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0FOU0lfZXNjYXBlX2NvZGUjZ3JhcGhpY3Ncbmluc3BlY3QuY29sb3JzID0ge1xuICAnYm9sZCcgOiBbMSwgMjJdLFxuICAnaXRhbGljJyA6IFszLCAyM10sXG4gICd1bmRlcmxpbmUnIDogWzQsIDI0XSxcbiAgJ2ludmVyc2UnIDogWzcsIDI3XSxcbiAgJ3doaXRlJyA6IFszNywgMzldLFxuICAnZ3JleScgOiBbOTAsIDM5XSxcbiAgJ2JsYWNrJyA6IFszMCwgMzldLFxuICAnYmx1ZScgOiBbMzQsIDM5XSxcbiAgJ2N5YW4nIDogWzM2LCAzOV0sXG4gICdncmVlbicgOiBbMzIsIDM5XSxcbiAgJ21hZ2VudGEnIDogWzM1LCAzOV0sXG4gICdyZWQnIDogWzMxLCAzOV0sXG4gICd5ZWxsb3cnIDogWzMzLCAzOV1cbn07XG5cbi8vIERvbid0IHVzZSAnYmx1ZScgbm90IHZpc2libGUgb24gY21kLmV4ZVxuaW5zcGVjdC5zdHlsZXMgPSB7XG4gICdzcGVjaWFsJzogJ2N5YW4nLFxuICAnbnVtYmVyJzogJ3llbGxvdycsXG4gICdib29sZWFuJzogJ3llbGxvdycsXG4gICd1bmRlZmluZWQnOiAnZ3JleScsXG4gICdudWxsJzogJ2JvbGQnLFxuICAnc3RyaW5nJzogJ2dyZWVuJyxcbiAgJ2RhdGUnOiAnbWFnZW50YScsXG4gIC8vIFwibmFtZVwiOiBpbnRlbnRpb25hbGx5IG5vdCBzdHlsaW5nXG4gICdyZWdleHAnOiAncmVkJ1xufTtcblxuXG5mdW5jdGlvbiBzdHlsaXplV2l0aENvbG9yKHN0ciwgc3R5bGVUeXBlKSB7XG4gIHZhciBzdHlsZSA9IGluc3BlY3Quc3R5bGVzW3N0eWxlVHlwZV07XG5cbiAgaWYgKHN0eWxlKSB7XG4gICAgcmV0dXJuICdcXHUwMDFiWycgKyBpbnNwZWN0LmNvbG9yc1tzdHlsZV1bMF0gKyAnbScgKyBzdHIgK1xuICAgICAgICAgICAnXFx1MDAxYlsnICsgaW5zcGVjdC5jb2xvcnNbc3R5bGVdWzFdICsgJ20nO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBzdHI7XG4gIH1cbn1cblxuXG5mdW5jdGlvbiBzdHlsaXplTm9Db2xvcihzdHIsIHN0eWxlVHlwZSkge1xuICByZXR1cm4gc3RyO1xufVxuXG5cbmZ1bmN0aW9uIGFycmF5VG9IYXNoKGFycmF5KSB7XG4gIHZhciBoYXNoID0ge307XG5cbiAgYXJyYXkuZm9yRWFjaChmdW5jdGlvbih2YWwsIGlkeCkge1xuICAgIGhhc2hbdmFsXSA9IHRydWU7XG4gIH0pO1xuXG4gIHJldHVybiBoYXNoO1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdFZhbHVlKGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcykge1xuICAvLyBQcm92aWRlIGEgaG9vayBmb3IgdXNlci1zcGVjaWZpZWQgaW5zcGVjdCBmdW5jdGlvbnMuXG4gIC8vIENoZWNrIHRoYXQgdmFsdWUgaXMgYW4gb2JqZWN0IHdpdGggYW4gaW5zcGVjdCBmdW5jdGlvbiBvbiBpdFxuICBpZiAoY3R4LmN1c3RvbUluc3BlY3QgJiZcbiAgICAgIHZhbHVlICYmXG4gICAgICBpc0Z1bmN0aW9uKHZhbHVlLmluc3BlY3QpICYmXG4gICAgICAvLyBGaWx0ZXIgb3V0IHRoZSB1dGlsIG1vZHVsZSwgaXQncyBpbnNwZWN0IGZ1bmN0aW9uIGlzIHNwZWNpYWxcbiAgICAgIHZhbHVlLmluc3BlY3QgIT09IGV4cG9ydHMuaW5zcGVjdCAmJlxuICAgICAgLy8gQWxzbyBmaWx0ZXIgb3V0IGFueSBwcm90b3R5cGUgb2JqZWN0cyB1c2luZyB0aGUgY2lyY3VsYXIgY2hlY2suXG4gICAgICAhKHZhbHVlLmNvbnN0cnVjdG9yICYmIHZhbHVlLmNvbnN0cnVjdG9yLnByb3RvdHlwZSA9PT0gdmFsdWUpKSB7XG4gICAgdmFyIHJldCA9IHZhbHVlLmluc3BlY3QocmVjdXJzZVRpbWVzLCBjdHgpO1xuICAgIGlmICghaXNTdHJpbmcocmV0KSkge1xuICAgICAgcmV0ID0gZm9ybWF0VmFsdWUoY3R4LCByZXQsIHJlY3Vyc2VUaW1lcyk7XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICAvLyBQcmltaXRpdmUgdHlwZXMgY2Fubm90IGhhdmUgcHJvcGVydGllc1xuICB2YXIgcHJpbWl0aXZlID0gZm9ybWF0UHJpbWl0aXZlKGN0eCwgdmFsdWUpO1xuICBpZiAocHJpbWl0aXZlKSB7XG4gICAgcmV0dXJuIHByaW1pdGl2ZTtcbiAgfVxuXG4gIC8vIExvb2sgdXAgdGhlIGtleXMgb2YgdGhlIG9iamVjdC5cbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyh2YWx1ZSk7XG4gIHZhciB2aXNpYmxlS2V5cyA9IGFycmF5VG9IYXNoKGtleXMpO1xuXG4gIGlmIChjdHguc2hvd0hpZGRlbikge1xuICAgIGtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh2YWx1ZSk7XG4gIH1cblxuICAvLyBJRSBkb2Vzbid0IG1ha2UgZXJyb3IgZmllbGRzIG5vbi1lbnVtZXJhYmxlXG4gIC8vIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9pZS9kd3c1MnNidCh2PXZzLjk0KS5hc3B4XG4gIGlmIChpc0Vycm9yKHZhbHVlKVxuICAgICAgJiYgKGtleXMuaW5kZXhPZignbWVzc2FnZScpID49IDAgfHwga2V5cy5pbmRleE9mKCdkZXNjcmlwdGlvbicpID49IDApKSB7XG4gICAgcmV0dXJuIGZvcm1hdEVycm9yKHZhbHVlKTtcbiAgfVxuXG4gIC8vIFNvbWUgdHlwZSBvZiBvYmplY3Qgd2l0aG91dCBwcm9wZXJ0aWVzIGNhbiBiZSBzaG9ydGN1dHRlZC5cbiAgaWYgKGtleXMubGVuZ3RoID09PSAwKSB7XG4gICAgaWYgKGlzRnVuY3Rpb24odmFsdWUpKSB7XG4gICAgICB2YXIgbmFtZSA9IHZhbHVlLm5hbWUgPyAnOiAnICsgdmFsdWUubmFtZSA6ICcnO1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKCdbRnVuY3Rpb24nICsgbmFtZSArICddJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gICAgaWYgKGlzUmVnRXhwKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKFJlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSksICdyZWdleHAnKTtcbiAgICB9XG4gICAgaWYgKGlzRGF0ZSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZShEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSwgJ2RhdGUnKTtcbiAgICB9XG4gICAgaWYgKGlzRXJyb3IodmFsdWUpKSB7XG4gICAgICByZXR1cm4gZm9ybWF0RXJyb3IodmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBiYXNlID0gJycsIGFycmF5ID0gZmFsc2UsIGJyYWNlcyA9IFsneycsICd9J107XG5cbiAgLy8gTWFrZSBBcnJheSBzYXkgdGhhdCB0aGV5IGFyZSBBcnJheVxuICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICBhcnJheSA9IHRydWU7XG4gICAgYnJhY2VzID0gWydbJywgJ10nXTtcbiAgfVxuXG4gIC8vIE1ha2UgZnVuY3Rpb25zIHNheSB0aGF0IHRoZXkgYXJlIGZ1bmN0aW9uc1xuICBpZiAoaXNGdW5jdGlvbih2YWx1ZSkpIHtcbiAgICB2YXIgbiA9IHZhbHVlLm5hbWUgPyAnOiAnICsgdmFsdWUubmFtZSA6ICcnO1xuICAgIGJhc2UgPSAnIFtGdW5jdGlvbicgKyBuICsgJ10nO1xuICB9XG5cbiAgLy8gTWFrZSBSZWdFeHBzIHNheSB0aGF0IHRoZXkgYXJlIFJlZ0V4cHNcbiAgaWYgKGlzUmVnRXhwKHZhbHVlKSkge1xuICAgIGJhc2UgPSAnICcgKyBSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpO1xuICB9XG5cbiAgLy8gTWFrZSBkYXRlcyB3aXRoIHByb3BlcnRpZXMgZmlyc3Qgc2F5IHRoZSBkYXRlXG4gIGlmIChpc0RhdGUodmFsdWUpKSB7XG4gICAgYmFzZSA9ICcgJyArIERhdGUucHJvdG90eXBlLnRvVVRDU3RyaW5nLmNhbGwodmFsdWUpO1xuICB9XG5cbiAgLy8gTWFrZSBlcnJvciB3aXRoIG1lc3NhZ2UgZmlyc3Qgc2F5IHRoZSBlcnJvclxuICBpZiAoaXNFcnJvcih2YWx1ZSkpIHtcbiAgICBiYXNlID0gJyAnICsgZm9ybWF0RXJyb3IodmFsdWUpO1xuICB9XG5cbiAgaWYgKGtleXMubGVuZ3RoID09PSAwICYmICghYXJyYXkgfHwgdmFsdWUubGVuZ3RoID09IDApKSB7XG4gICAgcmV0dXJuIGJyYWNlc1swXSArIGJhc2UgKyBicmFjZXNbMV07XG4gIH1cblxuICBpZiAocmVjdXJzZVRpbWVzIDwgMCkge1xuICAgIGlmIChpc1JlZ0V4cCh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZShSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpLCAncmVnZXhwJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZSgnW09iamVjdF0nLCAnc3BlY2lhbCcpO1xuICAgIH1cbiAgfVxuXG4gIGN0eC5zZWVuLnB1c2godmFsdWUpO1xuXG4gIHZhciBvdXRwdXQ7XG4gIGlmIChhcnJheSkge1xuICAgIG91dHB1dCA9IGZvcm1hdEFycmF5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleXMpO1xuICB9IGVsc2Uge1xuICAgIG91dHB1dCA9IGtleXMubWFwKGZ1bmN0aW9uKGtleSkge1xuICAgICAgcmV0dXJuIGZvcm1hdFByb3BlcnR5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleSwgYXJyYXkpO1xuICAgIH0pO1xuICB9XG5cbiAgY3R4LnNlZW4ucG9wKCk7XG5cbiAgcmV0dXJuIHJlZHVjZVRvU2luZ2xlU3RyaW5nKG91dHB1dCwgYmFzZSwgYnJhY2VzKTtcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRQcmltaXRpdmUoY3R4LCB2YWx1ZSkge1xuICBpZiAoaXNVbmRlZmluZWQodmFsdWUpKVxuICAgIHJldHVybiBjdHguc3R5bGl6ZSgndW5kZWZpbmVkJywgJ3VuZGVmaW5lZCcpO1xuICBpZiAoaXNTdHJpbmcodmFsdWUpKSB7XG4gICAgdmFyIHNpbXBsZSA9ICdcXCcnICsgSlNPTi5zdHJpbmdpZnkodmFsdWUpLnJlcGxhY2UoL15cInxcIiQvZywgJycpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvJy9nLCBcIlxcXFwnXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxcXFwiL2csICdcIicpICsgJ1xcJyc7XG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKHNpbXBsZSwgJ3N0cmluZycpO1xuICB9XG4gIGlmIChpc051bWJlcih2YWx1ZSkpXG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKCcnICsgdmFsdWUsICdudW1iZXInKTtcbiAgaWYgKGlzQm9vbGVhbih2YWx1ZSkpXG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKCcnICsgdmFsdWUsICdib29sZWFuJyk7XG4gIC8vIEZvciBzb21lIHJlYXNvbiB0eXBlb2YgbnVsbCBpcyBcIm9iamVjdFwiLCBzbyBzcGVjaWFsIGNhc2UgaGVyZS5cbiAgaWYgKGlzTnVsbCh2YWx1ZSkpXG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKCdudWxsJywgJ251bGwnKTtcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRFcnJvcih2YWx1ZSkge1xuICByZXR1cm4gJ1snICsgRXJyb3IucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpICsgJ10nO1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdEFycmF5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleXMpIHtcbiAgdmFyIG91dHB1dCA9IFtdO1xuICBmb3IgKHZhciBpID0gMCwgbCA9IHZhbHVlLmxlbmd0aDsgaSA8IGw7ICsraSkge1xuICAgIGlmIChoYXNPd25Qcm9wZXJ0eSh2YWx1ZSwgU3RyaW5nKGkpKSkge1xuICAgICAgb3V0cHV0LnB1c2goZm9ybWF0UHJvcGVydHkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cyxcbiAgICAgICAgICBTdHJpbmcoaSksIHRydWUpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0cHV0LnB1c2goJycpO1xuICAgIH1cbiAgfVxuICBrZXlzLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XG4gICAgaWYgKCFrZXkubWF0Y2goL15cXGQrJC8pKSB7XG4gICAgICBvdXRwdXQucHVzaChmb3JtYXRQcm9wZXJ0eShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLFxuICAgICAgICAgIGtleSwgdHJ1ZSkpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBvdXRwdXQ7XG59XG5cblxuZnVuY3Rpb24gZm9ybWF0UHJvcGVydHkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cywga2V5LCBhcnJheSkge1xuICB2YXIgbmFtZSwgc3RyLCBkZXNjO1xuICBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih2YWx1ZSwga2V5KSB8fCB7IHZhbHVlOiB2YWx1ZVtrZXldIH07XG4gIGlmIChkZXNjLmdldCkge1xuICAgIGlmIChkZXNjLnNldCkge1xuICAgICAgc3RyID0gY3R4LnN0eWxpemUoJ1tHZXR0ZXIvU2V0dGVyXScsICdzcGVjaWFsJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0ciA9IGN0eC5zdHlsaXplKCdbR2V0dGVyXScsICdzcGVjaWFsJyk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChkZXNjLnNldCkge1xuICAgICAgc3RyID0gY3R4LnN0eWxpemUoJ1tTZXR0ZXJdJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gIH1cbiAgaWYgKCFoYXNPd25Qcm9wZXJ0eSh2aXNpYmxlS2V5cywga2V5KSkge1xuICAgIG5hbWUgPSAnWycgKyBrZXkgKyAnXSc7XG4gIH1cbiAgaWYgKCFzdHIpIHtcbiAgICBpZiAoY3R4LnNlZW4uaW5kZXhPZihkZXNjLnZhbHVlKSA8IDApIHtcbiAgICAgIGlmIChpc051bGwocmVjdXJzZVRpbWVzKSkge1xuICAgICAgICBzdHIgPSBmb3JtYXRWYWx1ZShjdHgsIGRlc2MudmFsdWUsIG51bGwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RyID0gZm9ybWF0VmFsdWUoY3R4LCBkZXNjLnZhbHVlLCByZWN1cnNlVGltZXMgLSAxKTtcbiAgICAgIH1cbiAgICAgIGlmIChzdHIuaW5kZXhPZignXFxuJykgPiAtMSkge1xuICAgICAgICBpZiAoYXJyYXkpIHtcbiAgICAgICAgICBzdHIgPSBzdHIuc3BsaXQoJ1xcbicpLm1hcChmdW5jdGlvbihsaW5lKSB7XG4gICAgICAgICAgICByZXR1cm4gJyAgJyArIGxpbmU7XG4gICAgICAgICAgfSkuam9pbignXFxuJykuc3Vic3RyKDIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0ciA9ICdcXG4nICsgc3RyLnNwbGl0KCdcXG4nKS5tYXAoZnVuY3Rpb24obGluZSkge1xuICAgICAgICAgICAgcmV0dXJuICcgICAnICsgbGluZTtcbiAgICAgICAgICB9KS5qb2luKCdcXG4nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzdHIgPSBjdHguc3R5bGl6ZSgnW0NpcmN1bGFyXScsICdzcGVjaWFsJyk7XG4gICAgfVxuICB9XG4gIGlmIChpc1VuZGVmaW5lZChuYW1lKSkge1xuICAgIGlmIChhcnJheSAmJiBrZXkubWF0Y2goL15cXGQrJC8pKSB7XG4gICAgICByZXR1cm4gc3RyO1xuICAgIH1cbiAgICBuYW1lID0gSlNPTi5zdHJpbmdpZnkoJycgKyBrZXkpO1xuICAgIGlmIChuYW1lLm1hdGNoKC9eXCIoW2EtekEtWl9dW2EtekEtWl8wLTldKilcIiQvKSkge1xuICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyKDEsIG5hbWUubGVuZ3RoIC0gMik7XG4gICAgICBuYW1lID0gY3R4LnN0eWxpemUobmFtZSwgJ25hbWUnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmFtZSA9IG5hbWUucmVwbGFjZSgvJy9nLCBcIlxcXFwnXCIpXG4gICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXFxcXCIvZywgJ1wiJylcbiAgICAgICAgICAgICAgICAgLnJlcGxhY2UoLyheXCJ8XCIkKS9nLCBcIidcIik7XG4gICAgICBuYW1lID0gY3R4LnN0eWxpemUobmFtZSwgJ3N0cmluZycpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuYW1lICsgJzogJyArIHN0cjtcbn1cblxuXG5mdW5jdGlvbiByZWR1Y2VUb1NpbmdsZVN0cmluZyhvdXRwdXQsIGJhc2UsIGJyYWNlcykge1xuICB2YXIgbnVtTGluZXNFc3QgPSAwO1xuICB2YXIgbGVuZ3RoID0gb3V0cHV0LnJlZHVjZShmdW5jdGlvbihwcmV2LCBjdXIpIHtcbiAgICBudW1MaW5lc0VzdCsrO1xuICAgIGlmIChjdXIuaW5kZXhPZignXFxuJykgPj0gMCkgbnVtTGluZXNFc3QrKztcbiAgICByZXR1cm4gcHJldiArIGN1ci5yZXBsYWNlKC9cXHUwMDFiXFxbXFxkXFxkP20vZywgJycpLmxlbmd0aCArIDE7XG4gIH0sIDApO1xuXG4gIGlmIChsZW5ndGggPiA2MCkge1xuICAgIHJldHVybiBicmFjZXNbMF0gK1xuICAgICAgICAgICAoYmFzZSA9PT0gJycgPyAnJyA6IGJhc2UgKyAnXFxuICcpICtcbiAgICAgICAgICAgJyAnICtcbiAgICAgICAgICAgb3V0cHV0LmpvaW4oJyxcXG4gICcpICtcbiAgICAgICAgICAgJyAnICtcbiAgICAgICAgICAgYnJhY2VzWzFdO1xuICB9XG5cbiAgcmV0dXJuIGJyYWNlc1swXSArIGJhc2UgKyAnICcgKyBvdXRwdXQuam9pbignLCAnKSArICcgJyArIGJyYWNlc1sxXTtcbn1cblxuXG4vLyBOT1RFOiBUaGVzZSB0eXBlIGNoZWNraW5nIGZ1bmN0aW9ucyBpbnRlbnRpb25hbGx5IGRvbid0IHVzZSBgaW5zdGFuY2VvZmBcbi8vIGJlY2F1c2UgaXQgaXMgZnJhZ2lsZSBhbmQgY2FuIGJlIGVhc2lseSBmYWtlZCB3aXRoIGBPYmplY3QuY3JlYXRlKClgLlxuZnVuY3Rpb24gaXNBcnJheShhcikge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheShhcik7XG59XG5leHBvcnRzLmlzQXJyYXkgPSBpc0FycmF5O1xuXG5mdW5jdGlvbiBpc0Jvb2xlYW4oYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnYm9vbGVhbic7XG59XG5leHBvcnRzLmlzQm9vbGVhbiA9IGlzQm9vbGVhbjtcblxuZnVuY3Rpb24gaXNOdWxsKGFyZykge1xuICByZXR1cm4gYXJnID09PSBudWxsO1xufVxuZXhwb3J0cy5pc051bGwgPSBpc051bGw7XG5cbmZ1bmN0aW9uIGlzTnVsbE9yVW5kZWZpbmVkKGFyZykge1xuICByZXR1cm4gYXJnID09IG51bGw7XG59XG5leHBvcnRzLmlzTnVsbE9yVW5kZWZpbmVkID0gaXNOdWxsT3JVbmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGlzTnVtYmVyKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ251bWJlcic7XG59XG5leHBvcnRzLmlzTnVtYmVyID0gaXNOdW1iZXI7XG5cbmZ1bmN0aW9uIGlzU3RyaW5nKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ3N0cmluZyc7XG59XG5leHBvcnRzLmlzU3RyaW5nID0gaXNTdHJpbmc7XG5cbmZ1bmN0aW9uIGlzU3ltYm9sKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ3N5bWJvbCc7XG59XG5leHBvcnRzLmlzU3ltYm9sID0gaXNTeW1ib2w7XG5cbmZ1bmN0aW9uIGlzVW5kZWZpbmVkKGFyZykge1xuICByZXR1cm4gYXJnID09PSB2b2lkIDA7XG59XG5leHBvcnRzLmlzVW5kZWZpbmVkID0gaXNVbmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGlzUmVnRXhwKHJlKSB7XG4gIHJldHVybiBpc09iamVjdChyZSkgJiYgb2JqZWN0VG9TdHJpbmcocmUpID09PSAnW29iamVjdCBSZWdFeHBdJztcbn1cbmV4cG9ydHMuaXNSZWdFeHAgPSBpc1JlZ0V4cDtcblxuZnVuY3Rpb24gaXNPYmplY3QoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnb2JqZWN0JyAmJiBhcmcgIT09IG51bGw7XG59XG5leHBvcnRzLmlzT2JqZWN0ID0gaXNPYmplY3Q7XG5cbmZ1bmN0aW9uIGlzRGF0ZShkKSB7XG4gIHJldHVybiBpc09iamVjdChkKSAmJiBvYmplY3RUb1N0cmluZyhkKSA9PT0gJ1tvYmplY3QgRGF0ZV0nO1xufVxuZXhwb3J0cy5pc0RhdGUgPSBpc0RhdGU7XG5cbmZ1bmN0aW9uIGlzRXJyb3IoZSkge1xuICByZXR1cm4gaXNPYmplY3QoZSkgJiZcbiAgICAgIChvYmplY3RUb1N0cmluZyhlKSA9PT0gJ1tvYmplY3QgRXJyb3JdJyB8fCBlIGluc3RhbmNlb2YgRXJyb3IpO1xufVxuZXhwb3J0cy5pc0Vycm9yID0gaXNFcnJvcjtcblxuZnVuY3Rpb24gaXNGdW5jdGlvbihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdmdW5jdGlvbic7XG59XG5leHBvcnRzLmlzRnVuY3Rpb24gPSBpc0Z1bmN0aW9uO1xuXG5mdW5jdGlvbiBpc1ByaW1pdGl2ZShhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gbnVsbCB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ2Jvb2xlYW4nIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnbnVtYmVyJyB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdzeW1ib2wnIHx8ICAvLyBFUzYgc3ltYm9sXG4gICAgICAgICB0eXBlb2YgYXJnID09PSAndW5kZWZpbmVkJztcbn1cbmV4cG9ydHMuaXNQcmltaXRpdmUgPSBpc1ByaW1pdGl2ZTtcblxuZXhwb3J0cy5pc0J1ZmZlciA9IHJlcXVpcmUoJy4vc3VwcG9ydC9pc0J1ZmZlcicpO1xuXG5mdW5jdGlvbiBvYmplY3RUb1N0cmluZyhvKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobyk7XG59XG5cblxuZnVuY3Rpb24gcGFkKG4pIHtcbiAgcmV0dXJuIG4gPCAxMCA/ICcwJyArIG4udG9TdHJpbmcoMTApIDogbi50b1N0cmluZygxMCk7XG59XG5cblxudmFyIG1vbnRocyA9IFsnSmFuJywgJ0ZlYicsICdNYXInLCAnQXByJywgJ01heScsICdKdW4nLCAnSnVsJywgJ0F1ZycsICdTZXAnLFxuICAgICAgICAgICAgICAnT2N0JywgJ05vdicsICdEZWMnXTtcblxuLy8gMjYgRmViIDE2OjE5OjM0XG5mdW5jdGlvbiB0aW1lc3RhbXAoKSB7XG4gIHZhciBkID0gbmV3IERhdGUoKTtcbiAgdmFyIHRpbWUgPSBbcGFkKGQuZ2V0SG91cnMoKSksXG4gICAgICAgICAgICAgIHBhZChkLmdldE1pbnV0ZXMoKSksXG4gICAgICAgICAgICAgIHBhZChkLmdldFNlY29uZHMoKSldLmpvaW4oJzonKTtcbiAgcmV0dXJuIFtkLmdldERhdGUoKSwgbW9udGhzW2QuZ2V0TW9udGgoKV0sIHRpbWVdLmpvaW4oJyAnKTtcbn1cblxuXG4vLyBsb2cgaXMganVzdCBhIHRoaW4gd3JhcHBlciB0byBjb25zb2xlLmxvZyB0aGF0IHByZXBlbmRzIGEgdGltZXN0YW1wXG5leHBvcnRzLmxvZyA9IGZ1bmN0aW9uKCkge1xuICBjb25zb2xlLmxvZygnJXMgLSAlcycsIHRpbWVzdGFtcCgpLCBleHBvcnRzLmZvcm1hdC5hcHBseShleHBvcnRzLCBhcmd1bWVudHMpKTtcbn07XG5cblxuLyoqXG4gKiBJbmhlcml0IHRoZSBwcm90b3R5cGUgbWV0aG9kcyBmcm9tIG9uZSBjb25zdHJ1Y3RvciBpbnRvIGFub3RoZXIuXG4gKlxuICogVGhlIEZ1bmN0aW9uLnByb3RvdHlwZS5pbmhlcml0cyBmcm9tIGxhbmcuanMgcmV3cml0dGVuIGFzIGEgc3RhbmRhbG9uZVxuICogZnVuY3Rpb24gKG5vdCBvbiBGdW5jdGlvbi5wcm90b3R5cGUpLiBOT1RFOiBJZiB0aGlzIGZpbGUgaXMgdG8gYmUgbG9hZGVkXG4gKiBkdXJpbmcgYm9vdHN0cmFwcGluZyB0aGlzIGZ1bmN0aW9uIG5lZWRzIHRvIGJlIHJld3JpdHRlbiB1c2luZyBzb21lIG5hdGl2ZVxuICogZnVuY3Rpb25zIGFzIHByb3RvdHlwZSBzZXR1cCB1c2luZyBub3JtYWwgSmF2YVNjcmlwdCBkb2VzIG5vdCB3b3JrIGFzXG4gKiBleHBlY3RlZCBkdXJpbmcgYm9vdHN0cmFwcGluZyAoc2VlIG1pcnJvci5qcyBpbiByMTE0OTAzKS5cbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBjdG9yIENvbnN0cnVjdG9yIGZ1bmN0aW9uIHdoaWNoIG5lZWRzIHRvIGluaGVyaXQgdGhlXG4gKiAgICAgcHJvdG90eXBlLlxuICogQHBhcmFtIHtmdW5jdGlvbn0gc3VwZXJDdG9yIENvbnN0cnVjdG9yIGZ1bmN0aW9uIHRvIGluaGVyaXQgcHJvdG90eXBlIGZyb20uXG4gKi9cbmV4cG9ydHMuaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuXG5leHBvcnRzLl9leHRlbmQgPSBmdW5jdGlvbihvcmlnaW4sIGFkZCkge1xuICAvLyBEb24ndCBkbyBhbnl0aGluZyBpZiBhZGQgaXNuJ3QgYW4gb2JqZWN0XG4gIGlmICghYWRkIHx8ICFpc09iamVjdChhZGQpKSByZXR1cm4gb3JpZ2luO1xuXG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMoYWRkKTtcbiAgdmFyIGkgPSBrZXlzLmxlbmd0aDtcbiAgd2hpbGUgKGktLSkge1xuICAgIG9yaWdpbltrZXlzW2ldXSA9IGFkZFtrZXlzW2ldXTtcbiAgfVxuICByZXR1cm4gb3JpZ2luO1xufTtcblxuZnVuY3Rpb24gaGFzT3duUHJvcGVydHkob2JqLCBwcm9wKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKTtcbn1cblxufSkuY2FsbCh0aGlzLHJlcXVpcmUoXCJLbGl1YkhcIiksdHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIgPyBzZWxmIDogdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiA/IHdpbmRvdyA6IHt9KSJdfQ==
|
9746 | </script></body></html>
|