You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

7015 rivejä
1.2 MiB

  1. (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);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.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. // vim:ts=4:sts=4:sw=4:
  4. /*!
  5. *
  6. * Copyright 2009-2012 Kris Kowal under the terms of the MIT
  7. * license found at http://github.com/kriskowal/q/raw/master/LICENSE
  8. *
  9. * With parts by Tyler Close
  10. * Copyright 2007-2009 Tyler Close under the terms of the MIT X license found
  11. * at http://www.opensource.org/licenses/mit-license.html
  12. * Forked at ref_send.js version: 2009-05-11
  13. *
  14. * With parts by Mark Miller
  15. * Copyright (C) 2011 Google Inc.
  16. *
  17. * Licensed under the Apache License, Version 2.0 (the "License");
  18. * you may not use this file except in compliance with the License.
  19. * You may obtain a copy of the License at
  20. *
  21. * http://www.apache.org/licenses/LICENSE-2.0
  22. *
  23. * Unless required by applicable law or agreed to in writing, software
  24. * distributed under the License is distributed on an "AS IS" BASIS,
  25. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  26. * See the License for the specific language governing permissions and
  27. * limitations under the License.
  28. *
  29. */
  30. (function (definition) {
  31. "use strict";
  32. // This file will function properly as a <script> tag, or a module
  33. // using CommonJS and NodeJS or RequireJS module formats. In
  34. // Common/Node/RequireJS, the module exports the Q API and when
  35. // executed as a simple <script>, it creates a Q global instead.
  36. // Montage Require
  37. if (typeof bootstrap === "function") {
  38. bootstrap("promise", definition);
  39. // CommonJS
  40. } else if (typeof exports === "object" && typeof module === "object") {
  41. module.exports = definition();
  42. // RequireJS
  43. } else if (typeof define === "function" && define.amd) {
  44. define(definition);
  45. // SES (Secure EcmaScript)
  46. } else if (typeof ses !== "undefined") {
  47. if (!ses.ok()) {
  48. return;
  49. } else {
  50. ses.makeQ = definition;
  51. }
  52. // <script>
  53. } else if (typeof window !== "undefined" || typeof self !== "undefined") {
  54. // Prefer window over self for add-on scripts. Use self for
  55. // non-windowed contexts.
  56. var global = typeof window !== "undefined" ? window : self;
  57. // Get the `window` object, save the previous Q global
  58. // and initialize Q as a global.
  59. var previousQ = global.Q;
  60. global.Q = definition();
  61. // Add a noConflict function so Q can be removed from the
  62. // global namespace.
  63. global.Q.noConflict = function () {
  64. global.Q = previousQ;
  65. return this;
  66. };
  67. } else {
  68. throw new Error("This environment was not anticipated by Q. Please file a bug.");
  69. }
  70. })(function () {
  71. "use strict";
  72. var hasStacks = false;
  73. try {
  74. throw new Error();
  75. } catch (e) {
  76. hasStacks = !!e.stack;
  77. }
  78. // All code after this point will be filtered from stack traces reported
  79. // by Q.
  80. var qStartingLine = captureLine();
  81. var qFileName;
  82. // shims
  83. // used for fallback in "allResolved"
  84. var noop = function () {};
  85. // Use the fastest possible means to execute a task in a future turn
  86. // of the event loop.
  87. var nextTick =(function () {
  88. // linked list of tasks (single, with head node)
  89. var head = {task: void 0, next: null};
  90. var tail = head;
  91. var flushing = false;
  92. var requestTick = void 0;
  93. var isNodeJS = false;
  94. // queue for late tasks, used by unhandled rejection tracking
  95. var laterQueue = [];
  96. function flush() {
  97. /* jshint loopfunc: true */
  98. var task, domain;
  99. while (head.next) {
  100. head = head.next;
  101. task = head.task;
  102. head.task = void 0;
  103. domain = head.domain;
  104. if (domain) {
  105. head.domain = void 0;
  106. domain.enter();
  107. }
  108. runSingle(task, domain);
  109. }
  110. while (laterQueue.length) {
  111. task = laterQueue.pop();
  112. runSingle(task);
  113. }
  114. flushing = false;
  115. }
  116. // runs a single function in the async queue
  117. function runSingle(task, domain) {
  118. try {
  119. task();
  120. } catch (e) {
  121. if (isNodeJS) {
  122. // In node, uncaught exceptions are considered fatal errors.
  123. // Re-throw them synchronously to interrupt flushing!
  124. // Ensure continuation if the uncaught exception is suppressed
  125. // listening "uncaughtException" events (as domains does).
  126. // Continue in next event to avoid tick recursion.
  127. if (domain) {
  128. domain.exit();
  129. }
  130. setTimeout(flush, 0);
  131. if (domain) {
  132. domain.enter();
  133. }
  134. throw e;
  135. } else {
  136. // In browsers, uncaught exceptions are not fatal.
  137. // Re-throw them asynchronously to avoid slow-downs.
  138. setTimeout(function () {
  139. throw e;
  140. }, 0);
  141. }
  142. }
  143. if (domain) {
  144. domain.exit();
  145. }
  146. }
  147. nextTick = function (task) {
  148. tail = tail.next = {
  149. task: task,
  150. domain: isNodeJS && process.domain,
  151. next: null
  152. };
  153. if (!flushing) {
  154. flushing = true;
  155. requestTick();
  156. }
  157. };
  158. if (typeof process === "object" &&
  159. process.toString() === "[object process]" && process.nextTick) {
  160. // Ensure Q is in a real Node environment, with a `process.nextTick`.
  161. // To see through fake Node environments:
  162. // * Mocha test runner - exposes a `process` global without a `nextTick`
  163. // * Browserify - exposes a `process.nexTick` function that uses
  164. // `setTimeout`. In this case `setImmediate` is preferred because
  165. // it is faster. Browserify's `process.toString()` yields
  166. // "[object Object]", while in a real Node environment
  167. // `process.nextTick()` yields "[object process]".
  168. isNodeJS = true;
  169. requestTick = function () {
  170. process.nextTick(flush);
  171. };
  172. } else if (typeof setImmediate === "function") {
  173. // In IE10, Node.js 0.9+, or https://github.com/NobleJS/setImmediate
  174. if (typeof window !== "undefined") {
  175. requestTick = setImmediate.bind(window, flush);
  176. } else {
  177. requestTick = function () {
  178. setImmediate(flush);
  179. };
  180. }
  181. } else if (typeof MessageChannel !== "undefined") {
  182. // modern browsers
  183. // http://www.nonblocking.io/2011/06/windownexttick.html
  184. var channel = new MessageChannel();
  185. // At least Safari Version 6.0.5 (8536.30.1) intermittently cannot create
  186. // working message ports the first time a page loads.
  187. channel.port1.onmessage = function () {
  188. requestTick = requestPortTick;
  189. channel.port1.onmessage = flush;
  190. flush();
  191. };
  192. var requestPortTick = function () {
  193. // Opera requires us to provide a message payload, regardless of
  194. // whether we use it.
  195. channel.port2.postMessage(0);
  196. };
  197. requestTick = function () {
  198. setTimeout(flush, 0);
  199. requestPortTick();
  200. };
  201. } else {
  202. // old browsers
  203. requestTick = function () {
  204. setTimeout(flush, 0);
  205. };
  206. }
  207. // runs a task after all other tasks have been run
  208. // this is useful for unhandled rejection tracking that needs to happen
  209. // after all `then`d tasks have been run.
  210. nextTick.runAfter = function (task) {
  211. laterQueue.push(task);
  212. if (!flushing) {
  213. flushing = true;
  214. requestTick();
  215. }
  216. };
  217. return nextTick;
  218. })();
  219. // Attempt to make generics safe in the face of downstream
  220. // modifications.
  221. // There is no situation where this is necessary.
  222. // If you need a security guarantee, these primordials need to be
  223. // deeply frozen anyway, and if you don’t need a security guarantee,
  224. // this is just plain paranoid.
  225. // However, this **might** have the nice side-effect of reducing the size of
  226. // the minified code by reducing x.call() to merely x()
  227. // See Mark Miller’s explanation of what this does.
  228. // http://wiki.ecmascript.org/doku.php?id=conventions:safe_meta_programming
  229. var call = Function.call;
  230. function uncurryThis(f) {
  231. return function () {
  232. return call.apply(f, arguments);
  233. };
  234. }
  235. // This is equivalent, but slower:
  236. // uncurryThis = Function_bind.bind(Function_bind.call);
  237. // http://jsperf.com/uncurrythis
  238. var array_slice = uncurryThis(Array.prototype.slice);
  239. var array_reduce = uncurryThis(
  240. Array.prototype.reduce || function (callback, basis) {
  241. var index = 0,
  242. length = this.length;
  243. // concerning the initial value, if one is not provided
  244. if (arguments.length === 1) {
  245. // seek to the first value in the array, accounting
  246. // for the possibility that is is a sparse array
  247. do {
  248. if (index in this) {
  249. basis = this[index++];
  250. break;
  251. }
  252. if (++index >= length) {
  253. throw new TypeError();
  254. }
  255. } while (1);
  256. }
  257. // reduce
  258. for (; index < length; index++) {
  259. // account for the possibility that the array is sparse
  260. if (index in this) {
  261. basis = callback(basis, this[index], index);
  262. }
  263. }
  264. return basis;
  265. }
  266. );
  267. var array_indexOf = uncurryThis(
  268. Array.prototype.indexOf || function (value) {
  269. // not a very good shim, but good enough for our one use of it
  270. for (var i = 0; i < this.length; i++) {
  271. if (this[i] === value) {
  272. return i;
  273. }
  274. }
  275. return -1;
  276. }
  277. );
  278. var array_map = uncurryThis(
  279. Array.prototype.map || function (callback, thisp) {
  280. var self = this;
  281. var collect = [];
  282. array_reduce(self, function (undefined, value, index) {
  283. collect.push(callback.call(thisp, value, index, self));
  284. }, void 0);
  285. return collect;
  286. }
  287. );
  288. var object_create = Object.create || function (prototype) {
  289. function Type() { }
  290. Type.prototype = prototype;
  291. return new Type();
  292. };
  293. var object_hasOwnProperty = uncurryThis(Object.prototype.hasOwnProperty);
  294. var object_keys = Object.keys || function (object) {
  295. var keys = [];
  296. for (var key in object) {
  297. if (object_hasOwnProperty(object, key)) {
  298. keys.push(key);
  299. }
  300. }
  301. return keys;
  302. };
  303. var object_toString = uncurryThis(Object.prototype.toString);
  304. function isObject(value) {
  305. return value === Object(value);
  306. }
  307. // generator related shims
  308. // FIXME: Remove this function once ES6 generators are in SpiderMonkey.
  309. function isStopIteration(exception) {
  310. return (
  311. object_toString(exception) === "[object StopIteration]" ||
  312. exception instanceof QReturnValue
  313. );
  314. }
  315. // FIXME: Remove this helper and Q.return once ES6 generators are in
  316. // SpiderMonkey.
  317. var QReturnValue;
  318. if (typeof ReturnValue !== "undefined") {
  319. QReturnValue = ReturnValue;
  320. } else {
  321. QReturnValue = function (value) {
  322. this.value = value;
  323. };
  324. }
  325. // long stack traces
  326. var STACK_JUMP_SEPARATOR = "From previous event:";
  327. function makeStackTraceLong(error, promise) {
  328. // If possible, transform the error stack trace by removing Node and Q
  329. // cruft, then concatenating with the stack trace of `promise`. See #57.
  330. if (hasStacks &&
  331. promise.stack &&
  332. typeof error === "object" &&
  333. error !== null &&
  334. error.stack &&
  335. error.stack.indexOf(STACK_JUMP_SEPARATOR) === -1
  336. ) {
  337. var stacks = [];
  338. for (var p = promise; !!p; p = p.source) {
  339. if (p.stack) {
  340. stacks.unshift(p.stack);
  341. }
  342. }
  343. stacks.unshift(error.stack);
  344. var concatedStacks = stacks.join("\n" + STACK_JUMP_SEPARATOR + "\n");
  345. error.stack = filterStackString(concatedStacks);
  346. }
  347. }
  348. function filterStackString(stackString) {
  349. var lines = stackString.split("\n");
  350. var desiredLines = [];
  351. for (var i = 0; i < lines.length; ++i) {
  352. var line = lines[i];
  353. if (!isInternalFrame(line) && !isNodeFrame(line) && line) {
  354. desiredLines.push(line);
  355. }
  356. }
  357. return desiredLines.join("\n");
  358. }
  359. function isNodeFrame(stackLine) {
  360. return stackLine.indexOf("(module.js:") !== -1 ||
  361. stackLine.indexOf("(node.js:") !== -1;
  362. }
  363. function getFileNameAndLineNumber(stackLine) {
  364. // Named functions: "at functionName (filename:lineNumber:columnNumber)"
  365. // In IE10 function name can have spaces ("Anonymous function") O_o
  366. var attempt1 = /at .+ \((.+):(\d+):(?:\d+)\)$/.exec(stackLine);
  367. if (attempt1) {
  368. return [attempt1[1], Number(attempt1[2])];
  369. }
  370. // Anonymous functions: "at filename:lineNumber:columnNumber"
  371. var attempt2 = /at ([^ ]+):(\d+):(?:\d+)$/.exec(stackLine);
  372. if (attempt2) {
  373. return [attempt2[1], Number(attempt2[2])];
  374. }
  375. // Firefox style: "function@filename:lineNumber or @filename:lineNumber"
  376. var attempt3 = /.*@(.+):(\d+)$/.exec(stackLine);
  377. if (attempt3) {
  378. return [attempt3[1], Number(attempt3[2])];
  379. }
  380. }
  381. function isInternalFrame(stackLine) {
  382. var fileNameAndLineNumber = getFileNameAndLineNumber(stackLine);
  383. if (!fileNameAndLineNumber) {
  384. return false;
  385. }
  386. var fileName = fileNameAndLineNumber[0];
  387. var lineNumber = fileNameAndLineNumber[1];
  388. return fileName === qFileName &&
  389. lineNumber >= qStartingLine &&
  390. lineNumber <= qEndingLine;
  391. }
  392. // discover own file name and line number range for filtering stack
  393. // traces
  394. function captureLine() {
  395. if (!hasStacks) {
  396. return;
  397. }
  398. try {
  399. throw new Error();
  400. } catch (e) {
  401. var lines = e.stack.split("\n");
  402. var firstLine = lines[0].indexOf("@") > 0 ? lines[1] : lines[2];
  403. var fileNameAndLineNumber = getFileNameAndLineNumber(firstLine);
  404. if (!fileNameAndLineNumber) {
  405. return;
  406. }
  407. qFileName = fileNameAndLineNumber[0];
  408. return fileNameAndLineNumber[1];
  409. }
  410. }
  411. function deprecate(callback, name, alternative) {
  412. return function () {
  413. if (typeof console !== "undefined" &&
  414. typeof console.warn === "function") {
  415. console.warn(name + " is deprecated, use " + alternative +
  416. " instead.", new Error("").stack);
  417. }
  418. return callback.apply(callback, arguments);
  419. };
  420. }
  421. // end of shims
  422. // beginning of real work
  423. /**
  424. * Constructs a promise for an immediate reference, passes promises through, or
  425. * coerces promises from different systems.
  426. * @param value immediate reference or promise
  427. */
  428. function Q(value) {
  429. // If the object is already a Promise, return it directly. This enables
  430. // the resolve function to both be used to created references from objects,
  431. // but to tolerably coerce non-promises to promises.
  432. if (value instanceof Promise) {
  433. return value;
  434. }
  435. // assimilate thenables
  436. if (isPromiseAlike(value)) {
  437. return coerce(value);
  438. } else {
  439. return fulfill(value);
  440. }
  441. }
  442. Q.resolve = Q;
  443. /**
  444. * Performs a task in a future turn of the event loop.
  445. * @param {Function} task
  446. */
  447. Q.nextTick = nextTick;
  448. /**
  449. * Controls whether or not long stack traces will be on
  450. */
  451. Q.longStackSupport = false;
  452. // enable long stacks if Q_DEBUG is set
  453. if (typeof process === "object" && process && process.env && process.env.Q_DEBUG) {
  454. Q.longStackSupport = true;
  455. }
  456. /**
  457. * Constructs a {promise, resolve, reject} object.
  458. *
  459. * `resolve` is a callback to invoke with a more resolved value for the
  460. * promise. To fulfill the promise, invoke `resolve` with any value that is
  461. * not a thenable. To reject the promise, invoke `resolve` with a rejected
  462. * thenable, or invoke `reject` with the reason directly. To resolve the
  463. * promise to another thenable, thus putting it in the same state, invoke
  464. * `resolve` with that other thenable.
  465. */
  466. Q.defer = defer;
  467. function defer() {
  468. // if "messages" is an "Array", that indicates that the promise has not yet
  469. // been resolved. If it is "undefined", it has been resolved. Each
  470. // element of the messages array is itself an array of complete arguments to
  471. // forward to the resolved promise. We coerce the resolution value to a
  472. // promise using the `resolve` function because it handles both fully
  473. // non-thenable values and other thenables gracefully.
  474. var messages = [], progressListeners = [], resolvedPromise;
  475. var deferred = object_create(defer.prototype);
  476. var promise = object_create(Promise.prototype);
  477. promise.promiseDispatch = function (resolve, op, operands) {
  478. var args = array_slice(arguments);
  479. if (messages) {
  480. messages.push(args);
  481. if (op === "when" && operands[1]) { // progress operand
  482. progressListeners.push(operands[1]);
  483. }
  484. } else {
  485. Q.nextTick(function () {
  486. resolvedPromise.promiseDispatch.apply(resolvedPromise, args);
  487. });
  488. }
  489. };
  490. // XXX deprecated
  491. promise.valueOf = function () {
  492. if (messages) {
  493. return promise;
  494. }
  495. var nearerValue = nearer(resolvedPromise);
  496. if (isPromise(nearerValue)) {
  497. resolvedPromise = nearerValue; // shorten chain
  498. }
  499. return nearerValue;
  500. };
  501. promise.inspect = function () {
  502. if (!resolvedPromise) {
  503. return { state: "pending" };
  504. }
  505. return resolvedPromise.inspect();
  506. };
  507. if (Q.longStackSupport && hasStacks) {
  508. try {
  509. throw new Error();
  510. } catch (e) {
  511. // NOTE: don't try to use `Error.captureStackTrace` or transfer the
  512. // accessor around; that causes memory leaks as per GH-111. Just
  513. // reify the stack trace as a string ASAP.
  514. //
  515. // At the same time, cut off the first line; it's always just
  516. // "[object Promise]\n", as per the `toString`.
  517. promise.stack = e.stack.substring(e.stack.indexOf("\n") + 1);
  518. }
  519. }
  520. // NOTE: we do the checks for `resolvedPromise` in each method, instead of
  521. // consolidating them into `become`, since otherwise we'd create new
  522. // promises with the lines `become(whatever(value))`. See e.g. GH-252.
  523. function become(newPromise) {
  524. resolvedPromise = newPromise;
  525. promise.source = newPromise;
  526. array_reduce(messages, function (undefined, message) {
  527. Q.nextTick(function () {
  528. newPromise.promiseDispatch.apply(newPromise, message);
  529. });
  530. }, void 0);
  531. messages = void 0;
  532. progressListeners = void 0;
  533. }
  534. deferred.promise = promise;
  535. deferred.resolve = function (value) {
  536. if (resolvedPromise) {
  537. return;
  538. }
  539. become(Q(value));
  540. };
  541. deferred.fulfill = function (value) {
  542. if (resolvedPromise) {
  543. return;
  544. }
  545. become(fulfill(value));
  546. };
  547. deferred.reject = function (reason) {
  548. if (resolvedPromise) {
  549. return;
  550. }
  551. become(reject(reason));
  552. };
  553. deferred.notify = function (progress) {
  554. if (resolvedPromise) {
  555. return;
  556. }
  557. array_reduce(progressListeners, function (undefined, progressListener) {
  558. Q.nextTick(function () {
  559. progressListener(progress);
  560. });
  561. }, void 0);
  562. };
  563. return deferred;
  564. }
  565. /**
  566. * Creates a Node-style callback that will resolve or reject the deferred
  567. * promise.
  568. * @returns a nodeback
  569. */
  570. defer.prototype.makeNodeResolver = function () {
  571. var self = this;
  572. return function (error, value) {
  573. if (error) {
  574. self.reject(error);
  575. } else if (arguments.length > 2) {
  576. self.resolve(array_slice(arguments, 1));
  577. } else {
  578. self.resolve(value);
  579. }
  580. };
  581. };
  582. /**
  583. * @param resolver {Function} a function that returns nothing and accepts
  584. * the resolve, reject, and notify functions for a deferred.
  585. * @returns a promise that may be resolved with the given resolve and reject
  586. * functions, or rejected by a thrown exception in resolver
  587. */
  588. Q.Promise = promise; // ES6
  589. Q.promise = promise;
  590. function promise(resolver) {
  591. if (typeof resolver !== "function") {
  592. throw new TypeError("resolver must be a function.");
  593. }
  594. var deferred = defer();
  595. try {
  596. resolver(deferred.resolve, deferred.reject, deferred.notify);
  597. } catch (reason) {
  598. deferred.reject(reason);
  599. }
  600. return deferred.promise;
  601. }
  602. promise.race = race; // ES6
  603. promise.all = all; // ES6
  604. promise.reject = reject; // ES6
  605. promise.resolve = Q; // ES6
  606. // XXX experimental. This method is a way to denote that a local value is
  607. // serializable and should be immediately dispatched to a remote upon request,
  608. // instead of passing a reference.
  609. Q.passByCopy = function (object) {
  610. //freeze(object);
  611. //passByCopies.set(object, true);
  612. return object;
  613. };
  614. Promise.prototype.passByCopy = function () {
  615. //freeze(object);
  616. //passByCopies.set(object, true);
  617. return this;
  618. };
  619. /**
  620. * If two promises eventually fulfill to the same value, promises that value,
  621. * but otherwise rejects.
  622. * @param x {Any*}
  623. * @param y {Any*}
  624. * @returns {Any*} a promise for x and y if they are the same, but a rejection
  625. * otherwise.
  626. *
  627. */
  628. Q.join = function (x, y) {
  629. return Q(x).join(y);
  630. };
  631. Promise.prototype.join = function (that) {
  632. return Q([this, that]).spread(function (x, y) {
  633. if (x === y) {
  634. // TODO: "===" should be Object.is or equiv
  635. return x;
  636. } else {
  637. throw new Error("Can't join: not the same: " + x + " " + y);
  638. }
  639. });
  640. };
  641. /**
  642. * Returns a promise for the first of an array of promises to become settled.
  643. * @param answers {Array[Any*]} promises to race
  644. * @returns {Any*} the first promise to be settled
  645. */
  646. Q.race = race;
  647. function race(answerPs) {
  648. return promise(function (resolve, reject) {
  649. // Switch to this once we can assume at least ES5
  650. // answerPs.forEach(function (answerP) {
  651. // Q(answerP).then(resolve, reject);
  652. // });
  653. // Use this in the meantime
  654. for (var i = 0, len = answerPs.length; i < len; i++) {
  655. Q(answerPs[i]).then(resolve, reject);
  656. }
  657. });
  658. }
  659. Promise.prototype.race = function () {
  660. return this.then(Q.race);
  661. };
  662. /**
  663. * Constructs a Promise with a promise descriptor object and optional fallback
  664. * function. The descriptor contains methods like when(rejected), get(name),
  665. * set(name, value), post(name, args), and delete(name), which all
  666. * return either a value, a promise for a value, or a rejection. The fallback
  667. * accepts the operation name, a resolver, and any further arguments that would
  668. * have been forwarded to the appropriate method above had a method been
  669. * provided with the proper name. The API makes no guarantees about the nature
  670. * of the returned object, apart from that it is usable whereever promises are
  671. * bought and sold.
  672. */
  673. Q.makePromise = Promise;
  674. function Promise(descriptor, fallback, inspect) {
  675. if (fallback === void 0) {
  676. fallback = function (op) {
  677. return reject(new Error(
  678. "Promise does not support operation: " + op
  679. ));
  680. };
  681. }
  682. if (inspect === void 0) {
  683. inspect = function () {
  684. return {state: "unknown"};
  685. };
  686. }
  687. var promise = object_create(Promise.prototype);
  688. promise.promiseDispatch = function (resolve, op, args) {
  689. var result;
  690. try {
  691. if (descriptor[op]) {
  692. result = descriptor[op].apply(promise, args);
  693. } else {
  694. result = fallback.call(promise, op, args);
  695. }
  696. } catch (exception) {
  697. result = reject(exception);
  698. }
  699. if (resolve) {
  700. resolve(result);
  701. }
  702. };
  703. promise.inspect = inspect;
  704. // XXX deprecated `valueOf` and `exception` support
  705. if (inspect) {
  706. var inspected = inspect();
  707. if (inspected.state === "rejected") {
  708. promise.exception = inspected.reason;
  709. }
  710. promise.valueOf = function () {
  711. var inspected = inspect();
  712. if (inspected.state === "pending" ||
  713. inspected.state === "rejected") {
  714. return promise;
  715. }
  716. return inspected.value;
  717. };
  718. }
  719. return promise;
  720. }
  721. Promise.prototype.toString = function () {
  722. return "[object Promise]";
  723. };
  724. Promise.prototype.then = function (fulfilled, rejected, progressed) {
  725. var self = this;
  726. var deferred = defer();
  727. var done = false; // ensure the untrusted promise makes at most a
  728. // single call to one of the callbacks
  729. function _fulfilled(value) {
  730. try {
  731. return typeof fulfilled === "function" ? fulfilled(value) : value;
  732. } catch (exception) {
  733. return reject(exception);
  734. }
  735. }
  736. function _rejected(exception) {
  737. if (typeof rejected === "function") {
  738. makeStackTraceLong(exception, self);
  739. try {
  740. return rejected(exception);
  741. } catch (newException) {
  742. return reject(newException);
  743. }
  744. }
  745. return reject(exception);
  746. }
  747. function _progressed(value) {
  748. return typeof progressed === "function" ? progressed(value) : value;
  749. }
  750. Q.nextTick(function () {
  751. self.promiseDispatch(function (value) {
  752. if (done) {
  753. return;
  754. }
  755. done = true;
  756. deferred.resolve(_fulfilled(value));
  757. }, "when", [function (exception) {
  758. if (done) {
  759. return;
  760. }
  761. done = true;
  762. deferred.resolve(_rejected(exception));
  763. }]);
  764. });
  765. // Progress propagator need to be attached in the current tick.
  766. self.promiseDispatch(void 0, "when", [void 0, function (value) {
  767. var newValue;
  768. var threw = false;
  769. try {
  770. newValue = _progressed(value);
  771. } catch (e) {
  772. threw = true;
  773. if (Q.onerror) {
  774. Q.onerror(e);
  775. } else {
  776. throw e;
  777. }
  778. }
  779. if (!threw) {
  780. deferred.notify(newValue);
  781. }
  782. }]);
  783. return deferred.promise;
  784. };
  785. Q.tap = function (promise, callback) {
  786. return Q(promise).tap(callback);
  787. };
  788. /**
  789. * Works almost like "finally", but not called for rejections.
  790. * Original resolution value is passed through callback unaffected.
  791. * Callback may return a promise that will be awaited for.
  792. * @param {Function} callback
  793. * @returns {Q.Promise}
  794. * @example
  795. * doSomething()
  796. * .then(...)
  797. * .tap(console.log)
  798. * .then(...);
  799. */
  800. Promise.prototype.tap = function (callback) {
  801. callback = Q(callback);
  802. return this.then(function (value) {
  803. return callback.fcall(value).thenResolve(value);
  804. });
  805. };
  806. /**
  807. * Registers an observer on a promise.
  808. *
  809. * Guarantees:
  810. *
  811. * 1. that fulfilled and rejected will be called only once.
  812. * 2. that either the fulfilled callback or the rejected callback will be
  813. * called, but not both.
  814. * 3. that fulfilled and rejected will not be called in this turn.
  815. *
  816. * @param value promise or immediate reference to observe
  817. * @param fulfilled function to be called with the fulfilled value
  818. * @param rejected function to be called with the rejection exception
  819. * @param progressed function to be called on any progress notifications
  820. * @return promise for the return value from the invoked callback
  821. */
  822. Q.when = when;
  823. function when(value, fulfilled, rejected, progressed) {
  824. return Q(value).then(fulfilled, rejected, progressed);
  825. }
  826. Promise.prototype.thenResolve = function (value) {
  827. return this.then(function () { return value; });
  828. };
  829. Q.thenResolve = function (promise, value) {
  830. return Q(promise).thenResolve(value);
  831. };
  832. Promise.prototype.thenReject = function (reason) {
  833. return this.then(function () { throw reason; });
  834. };
  835. Q.thenReject = function (promise, reason) {
  836. return Q(promise).thenReject(reason);
  837. };
  838. /**
  839. * If an object is not a promise, it is as "near" as possible.
  840. * If a promise is rejected, it is as "near" as possible too.
  841. * If it’s a fulfilled promise, the fulfillment value is nearer.
  842. * If it’s a deferred promise and the deferred has been resolved, the
  843. * resolution is "nearer".
  844. * @param object
  845. * @returns most resolved (nearest) form of the object
  846. */
  847. // XXX should we re-do this?
  848. Q.nearer = nearer;
  849. function nearer(value) {
  850. if (isPromise(value)) {
  851. var inspected = value.inspect();
  852. if (inspected.state === "fulfilled") {
  853. return inspected.value;
  854. }
  855. }
  856. return value;
  857. }
  858. /**
  859. * @returns whether the given object is a promise.
  860. * Otherwise it is a fulfilled value.
  861. */
  862. Q.isPromise = isPromise;
  863. function isPromise(object) {
  864. return object instanceof Promise;
  865. }
  866. Q.isPromiseAlike = isPromiseAlike;
  867. function isPromiseAlike(object) {
  868. return isObject(object) && typeof object.then === "function";
  869. }
  870. /**
  871. * @returns whether the given object is a pending promise, meaning not
  872. * fulfilled or rejected.
  873. */
  874. Q.isPending = isPending;
  875. function isPending(object) {
  876. return isPromise(object) && object.inspect().state === "pending";
  877. }
  878. Promise.prototype.isPending = function () {
  879. return this.inspect().state === "pending";
  880. };
  881. /**
  882. * @returns whether the given object is a value or fulfilled
  883. * promise.
  884. */
  885. Q.isFulfilled = isFulfilled;
  886. function isFulfilled(object) {
  887. return !isPromise(object) || object.inspect().state === "fulfilled";
  888. }
  889. Promise.prototype.isFulfilled = function () {
  890. return this.inspect().state === "fulfilled";
  891. };
  892. /**
  893. * @returns whether the given object is a rejected promise.
  894. */
  895. Q.isRejected = isRejected;
  896. function isRejected(object) {
  897. return isPromise(object) && object.inspect().state === "rejected";
  898. }
  899. Promise.prototype.isRejected = function () {
  900. return this.inspect().state === "rejected";
  901. };
  902. //// BEGIN UNHANDLED REJECTION TRACKING
  903. // This promise library consumes exceptions thrown in handlers so they can be
  904. // handled by a subsequent promise. The exceptions get added to this array when
  905. // they are created, and removed when they are handled. Note that in ES6 or
  906. // shimmed environments, this would naturally be a `Set`.
  907. var unhandledReasons = [];
  908. var unhandledRejections = [];
  909. var reportedUnhandledRejections = [];
  910. var trackUnhandledRejections = true;
  911. function resetUnhandledRejections() {
  912. unhandledReasons.length = 0;
  913. unhandledRejections.length = 0;
  914. if (!trackUnhandledRejections) {
  915. trackUnhandledRejections = true;
  916. }
  917. }
  918. function trackRejection(promise, reason) {
  919. if (!trackUnhandledRejections) {
  920. return;
  921. }
  922. if (typeof process === "object" && typeof process.emit === "function") {
  923. Q.nextTick.runAfter(function () {
  924. if (array_indexOf(unhandledRejections, promise) !== -1) {
  925. process.emit("unhandledRejection", reason, promise);
  926. reportedUnhandledRejections.push(promise);
  927. }
  928. });
  929. }
  930. unhandledRejections.push(promise);
  931. if (reason && typeof reason.stack !== "undefined") {
  932. unhandledReasons.push(reason.stack);
  933. } else {
  934. unhandledReasons.push("(no stack) " + reason);
  935. }
  936. }
  937. function untrackRejection(promise) {
  938. if (!trackUnhandledRejections) {
  939. return;
  940. }
  941. var at = array_indexOf(unhandledRejections, promise);
  942. if (at !== -1) {
  943. if (typeof process === "object" && typeof process.emit === "function") {
  944. Q.nextTick.runAfter(function () {
  945. var atReport = array_indexOf(reportedUnhandledRejections, promise);
  946. if (atReport !== -1) {
  947. process.emit("rejectionHandled", unhandledReasons[at], promise);
  948. reportedUnhandledRejections.splice(atReport, 1);
  949. }
  950. });
  951. }
  952. unhandledRejections.splice(at, 1);
  953. unhandledReasons.splice(at, 1);
  954. }
  955. }
  956. Q.resetUnhandledRejections = resetUnhandledRejections;
  957. Q.getUnhandledReasons = function () {
  958. // Make a copy so that consumers can't interfere with our internal state.
  959. return unhandledReasons.slice();
  960. };
  961. Q.stopUnhandledRejectionTracking = function () {
  962. resetUnhandledRejections();
  963. trackUnhandledRejections = false;
  964. };
  965. resetUnhandledRejections();
  966. //// END UNHANDLED REJECTION TRACKING
  967. /**
  968. * Constructs a rejected promise.
  969. * @param reason value describing the failure
  970. */
  971. Q.reject = reject;
  972. function reject(reason) {
  973. var rejection = Promise({
  974. "when": function (rejected) {
  975. // note that the error has been handled
  976. if (rejected) {
  977. untrackRejection(this);
  978. }
  979. return rejected ? rejected(reason) : this;
  980. }
  981. }, function fallback() {
  982. return this;
  983. }, function inspect() {
  984. return { state: "rejected", reason: reason };
  985. });
  986. // Note that the reason has not been handled.
  987. trackRejection(rejection, reason);
  988. return rejection;
  989. }
  990. /**
  991. * Constructs a fulfilled promise for an immediate reference.
  992. * @param value immediate reference
  993. */
  994. Q.fulfill = fulfill;
  995. function fulfill(value) {
  996. return Promise({
  997. "when": function () {
  998. return value;
  999. },
  1000. "get": function (name) {
  1001. return value[name];
  1002. },
  1003. "set": function (name, rhs) {
  1004. value[name] = rhs;
  1005. },
  1006. "delete": function (name) {
  1007. delete value[name];
  1008. },
  1009. "post": function (name, args) {
  1010. // Mark Miller proposes that post with no name should apply a
  1011. // promised function.
  1012. if (name === null || name === void 0) {
  1013. return value.apply(void 0, args);
  1014. } else {
  1015. return value[name].apply(value, args);
  1016. }
  1017. },
  1018. "apply": function (thisp, args) {
  1019. return value.apply(thisp, args);
  1020. },
  1021. "keys": function () {
  1022. return object_keys(value);
  1023. }
  1024. }, void 0, function inspect() {
  1025. return { state: "fulfilled", value: value };
  1026. });
  1027. }
  1028. /**
  1029. * Converts thenables to Q promises.
  1030. * @param promise thenable promise
  1031. * @returns a Q promise
  1032. */
  1033. function coerce(promise) {
  1034. var deferred = defer();
  1035. Q.nextTick(function () {
  1036. try {
  1037. promise.then(deferred.resolve, deferred.reject, deferred.notify);
  1038. } catch (exception) {
  1039. deferred.reject(exception);
  1040. }
  1041. });
  1042. return deferred.promise;
  1043. }
  1044. /**
  1045. * Annotates an object such that it will never be
  1046. * transferred away from this process over any promise
  1047. * communication channel.
  1048. * @param object
  1049. * @returns promise a wrapping of that object that
  1050. * additionally responds to the "isDef" message
  1051. * without a rejection.
  1052. */
  1053. Q.master = master;
  1054. function master(object) {
  1055. return Promise({
  1056. "isDef": function () {}
  1057. }, function fallback(op, args) {
  1058. return dispatch(object, op, args);
  1059. }, function () {
  1060. return Q(object).inspect();
  1061. });
  1062. }
  1063. /**
  1064. * Spreads the values of a promised array of arguments into the
  1065. * fulfillment callback.
  1066. * @param fulfilled callback that receives variadic arguments from the
  1067. * promised array
  1068. * @param rejected callback that receives the exception if the promise
  1069. * is rejected.
  1070. * @returns a promise for the return value or thrown exception of
  1071. * either callback.
  1072. */
  1073. Q.spread = spread;
  1074. function spread(value, fulfilled, rejected) {
  1075. return Q(value).spread(fulfilled, rejected);
  1076. }
  1077. Promise.prototype.spread = function (fulfilled, rejected) {
  1078. return this.all().then(function (array) {
  1079. return fulfilled.apply(void 0, array);
  1080. }, rejected);
  1081. };
  1082. /**
  1083. * The async function is a decorator for generator functions, turning
  1084. * them into asynchronous generators. Although generators are only part
  1085. * of the newest ECMAScript 6 drafts, this code does not cause syntax
  1086. * errors in older engines. This code should continue to work and will
  1087. * in fact improve over time as the language improves.
  1088. *
  1089. * ES6 generators are currently part of V8 version 3.19 with the
  1090. * --harmony-generators runtime flag enabled. SpiderMonkey has had them
  1091. * for longer, but under an older Python-inspired form. This function
  1092. * works on both kinds of generators.
  1093. *
  1094. * Decorates a generator function such that:
  1095. * - it may yield promises
  1096. * - execution will continue when that promise is fulfilled
  1097. * - the value of the yield expression will be the fulfilled value
  1098. * - it returns a promise for the return value (when the generator
  1099. * stops iterating)
  1100. * - the decorated function returns a promise for the return value
  1101. * of the generator or the first rejected promise among those
  1102. * yielded.
  1103. * - if an error is thrown in the generator, it propagates through
  1104. * every following yield until it is caught, or until it escapes
  1105. * the generator function altogether, and is translated into a
  1106. * rejection for the promise returned by the decorated generator.
  1107. */
  1108. Q.async = async;
  1109. function async(makeGenerator) {
  1110. return function () {
  1111. // when verb is "send", arg is a value
  1112. // when verb is "throw", arg is an exception
  1113. function continuer(verb, arg) {
  1114. var result;
  1115. // Until V8 3.19 / Chromium 29 is released, SpiderMonkey is the only
  1116. // engine that has a deployed base of browsers that support generators.
  1117. // However, SM's generators use the Python-inspired semantics of
  1118. // outdated ES6 drafts. We would like to support ES6, but we'd also
  1119. // like to make it possible to use generators in deployed browsers, so
  1120. // we also support Python-style generators. At some point we can remove
  1121. // this block.
  1122. if (typeof StopIteration === "undefined") {
  1123. // ES6 Generators
  1124. try {
  1125. result = generator[verb](arg);
  1126. } catch (exception) {
  1127. return reject(exception);
  1128. }
  1129. if (result.done) {
  1130. return Q(result.value);
  1131. } else {
  1132. return when(result.value, callback, errback);
  1133. }
  1134. } else {
  1135. // SpiderMonkey Generators
  1136. // FIXME: Remove this case when SM does ES6 generators.
  1137. try {
  1138. result = generator[verb](arg);
  1139. } catch (exception) {
  1140. if (isStopIteration(exception)) {
  1141. return Q(exception.value);
  1142. } else {
  1143. return reject(exception);
  1144. }
  1145. }
  1146. return when(result, callback, errback);
  1147. }
  1148. }
  1149. var generator = makeGenerator.apply(this, arguments);
  1150. var callback = continuer.bind(continuer, "next");
  1151. var errback = continuer.bind(continuer, "throw");
  1152. return callback();
  1153. };
  1154. }
  1155. /**
  1156. * The spawn function is a small wrapper around async that immediately
  1157. * calls the generator and also ends the promise chain, so that any
  1158. * unhandled errors are thrown instead of forwarded to the error
  1159. * handler. This is useful because it's extremely common to run
  1160. * generators at the top-level to work with libraries.
  1161. */
  1162. Q.spawn = spawn;
  1163. function spawn(makeGenerator) {
  1164. Q.done(Q.async(makeGenerator)());
  1165. }
  1166. // FIXME: Remove this interface once ES6 generators are in SpiderMonkey.
  1167. /**
  1168. * Throws a ReturnValue exception to stop an asynchronous generator.
  1169. *
  1170. * This interface is a stop-gap measure to support generator return
  1171. * values in older Firefox/SpiderMonkey. In browsers that support ES6
  1172. * generators like Chromium 29, just use "return" in your generator
  1173. * functions.
  1174. *
  1175. * @param value the return value for the surrounding generator
  1176. * @throws ReturnValue exception with the value.
  1177. * @example
  1178. * // ES6 style
  1179. * Q.async(function* () {
  1180. * var foo = yield getFooPromise();
  1181. * var bar = yield getBarPromise();
  1182. * return foo + bar;
  1183. * })
  1184. * // Older SpiderMonkey style
  1185. * Q.async(function () {
  1186. * var foo = yield getFooPromise();
  1187. * var bar = yield getBarPromise();
  1188. * Q.return(foo + bar);
  1189. * })
  1190. */
  1191. Q["return"] = _return;
  1192. function _return(value) {
  1193. throw new QReturnValue(value);
  1194. }
  1195. /**
  1196. * The promised function decorator ensures that any promise arguments
  1197. * are settled and passed as values (`this` is also settled and passed
  1198. * as a value). It will also ensure that the result of a function is
  1199. * always a promise.
  1200. *
  1201. * @example
  1202. * var add = Q.promised(function (a, b) {
  1203. * return a + b;
  1204. * });
  1205. * add(Q(a), Q(B));
  1206. *
  1207. * @param {function} callback The function to decorate
  1208. * @returns {function} a function that has been decorated.
  1209. */
  1210. Q.promised = promised;
  1211. function promised(callback) {
  1212. return function () {
  1213. return spread([this, all(arguments)], function (self, args) {
  1214. return callback.apply(self, args);
  1215. });
  1216. };
  1217. }
  1218. /**
  1219. * sends a message to a value in a future turn
  1220. * @param object* the recipient
  1221. * @param op the name of the message operation, e.g., "when",
  1222. * @param args further arguments to be forwarded to the operation
  1223. * @returns result {Promise} a promise for the result of the operation
  1224. */
  1225. Q.dispatch = dispatch;
  1226. function dispatch(object, op, args) {
  1227. return Q(object).dispatch(op, args);
  1228. }
  1229. Promise.prototype.dispatch = function (op, args) {
  1230. var self = this;
  1231. var deferred = defer();
  1232. Q.nextTick(function () {
  1233. self.promiseDispatch(deferred.resolve, op, args);
  1234. });
  1235. return deferred.promise;
  1236. };
  1237. /**
  1238. * Gets the value of a property in a future turn.
  1239. * @param object promise or immediate reference for target object
  1240. * @param name name of property to get
  1241. * @return promise for the property value
  1242. */
  1243. Q.get = function (object, key) {
  1244. return Q(object).dispatch("get", [key]);
  1245. };
  1246. Promise.prototype.get = function (key) {
  1247. return this.dispatch("get", [key]);
  1248. };
  1249. /**
  1250. * Sets the value of a property in a future turn.
  1251. * @param object promise or immediate reference for object object
  1252. * @param name name of property to set
  1253. * @param value new value of property
  1254. * @return promise for the return value
  1255. */
  1256. Q.set = function (object, key, value) {
  1257. return Q(object).dispatch("set", [key, value]);
  1258. };
  1259. Promise.prototype.set = function (key, value) {
  1260. return this.dispatch("set", [key, value]);
  1261. };
  1262. /**
  1263. * Deletes a property in a future turn.
  1264. * @param object promise or immediate reference for target object
  1265. * @param name name of property to delete
  1266. * @return promise for the return value
  1267. */
  1268. Q.del = // XXX legacy
  1269. Q["delete"] = function (object, key) {
  1270. return Q(object).dispatch("delete", [key]);
  1271. };
  1272. Promise.prototype.del = // XXX legacy
  1273. Promise.prototype["delete"] = function (key) {
  1274. return this.dispatch("delete", [key]);
  1275. };
  1276. /**
  1277. * Invokes a method in a future turn.
  1278. * @param object promise or immediate reference for target object
  1279. * @param name name of method to invoke
  1280. * @param value a value to post, typically an array of
  1281. * invocation arguments for promises that
  1282. * are ultimately backed with `resolve` values,
  1283. * as opposed to those backed with URLs
  1284. * wherein the posted value can be any
  1285. * JSON serializable object.
  1286. * @return promise for the return value
  1287. */
  1288. // bound locally because it is used by other methods
  1289. Q.mapply = // XXX As proposed by "Redsandro"
  1290. Q.post = function (object, name, args) {
  1291. return Q(object).dispatch("post", [name, args]);
  1292. };
  1293. Promise.prototype.mapply = // XXX As proposed by "Redsandro"
  1294. Promise.prototype.post = function (name, args) {
  1295. return this.dispatch("post", [name, args]);
  1296. };
  1297. /**
  1298. * Invokes a method in a future turn.
  1299. * @param object promise or immediate reference for target object
  1300. * @param name name of method to invoke
  1301. * @param ...args array of invocation arguments
  1302. * @return promise for the return value
  1303. */
  1304. Q.send = // XXX Mark Miller's proposed parlance
  1305. Q.mcall = // XXX As proposed by "Redsandro"
  1306. Q.invoke = function (object, name /*...args*/) {
  1307. return Q(object).dispatch("post", [name, array_slice(arguments, 2)]);
  1308. };
  1309. Promise.prototype.send = // XXX Mark Miller's proposed parlance
  1310. Promise.prototype.mcall = // XXX As proposed by "Redsandro"
  1311. Promise.prototype.invoke = function (name /*...args*/) {
  1312. return this.dispatch("post", [name, array_slice(arguments, 1)]);
  1313. };
  1314. /**
  1315. * Applies the promised function in a future turn.
  1316. * @param object promise or immediate reference for target function
  1317. * @param args array of application arguments
  1318. */
  1319. Q.fapply = function (object, args) {
  1320. return Q(object).dispatch("apply", [void 0, args]);
  1321. };
  1322. Promise.prototype.fapply = function (args) {
  1323. return this.dispatch("apply", [void 0, args]);
  1324. };
  1325. /**
  1326. * Calls the promised function in a future turn.
  1327. * @param object promise or immediate reference for target function
  1328. * @param ...args array of application arguments
  1329. */
  1330. Q["try"] =
  1331. Q.fcall = function (object /* ...args*/) {
  1332. return Q(object).dispatch("apply", [void 0, array_slice(arguments, 1)]);
  1333. };
  1334. Promise.prototype.fcall = function (/*...args*/) {
  1335. return this.dispatch("apply", [void 0, array_slice(arguments)]);
  1336. };
  1337. /**
  1338. * Binds the promised function, transforming return values into a fulfilled
  1339. * promise and thrown errors into a rejected one.
  1340. * @param object promise or immediate reference for target function
  1341. * @param ...args array of application arguments
  1342. */
  1343. Q.fbind = function (object /*...args*/) {
  1344. var promise = Q(object);
  1345. var args = array_slice(arguments, 1);
  1346. return function fbound() {
  1347. return promise.dispatch("apply", [
  1348. this,
  1349. args.concat(array_slice(arguments))
  1350. ]);
  1351. };
  1352. };
  1353. Promise.prototype.fbind = function (/*...args*/) {
  1354. var promise = this;
  1355. var args = array_slice(arguments);
  1356. return function fbound() {
  1357. return promise.dispatch("apply", [
  1358. this,
  1359. args.concat(array_slice(arguments))
  1360. ]);
  1361. };
  1362. };
  1363. /**
  1364. * Requests the names of the owned properties of a promised
  1365. * object in a future turn.
  1366. * @param object promise or immediate reference for target object
  1367. * @return promise for the keys of the eventually settled object
  1368. */
  1369. Q.keys = function (object) {
  1370. return Q(object).dispatch("keys", []);
  1371. };
  1372. Promise.prototype.keys = function () {
  1373. return this.dispatch("keys", []);
  1374. };
  1375. /**
  1376. * Turns an array of promises into a promise for an array. If any of
  1377. * the promises gets rejected, the whole array is rejected immediately.
  1378. * @param {Array*} an array (or promise for an array) of values (or
  1379. * promises for values)
  1380. * @returns a promise for an array of the corresponding values
  1381. */
  1382. // By Mark Miller
  1383. // http://wiki.ecmascript.org/doku.php?id=strawman:concurrency&rev=1308776521#allfulfilled
  1384. Q.all = all;
  1385. function all(promises) {
  1386. return when(promises, function (promises) {
  1387. var pendingCount = 0;
  1388. var deferred = defer();
  1389. array_reduce(promises, function (undefined, promise, index) {
  1390. var snapshot;
  1391. if (
  1392. isPromise(promise) &&
  1393. (snapshot = promise.inspect()).state === "fulfilled"
  1394. ) {
  1395. promises[index] = snapshot.value;
  1396. } else {
  1397. ++pendingCount;
  1398. when(
  1399. promise,
  1400. function (value) {
  1401. promises[index] = value;
  1402. if (--pendingCount === 0) {
  1403. deferred.resolve(promises);
  1404. }
  1405. },
  1406. deferred.reject,
  1407. function (progress) {
  1408. deferred.notify({ index: index, value: progress });
  1409. }
  1410. );
  1411. }
  1412. }, void 0);
  1413. if (pendingCount === 0) {
  1414. deferred.resolve(promises);
  1415. }
  1416. return deferred.promise;
  1417. });
  1418. }
  1419. Promise.prototype.all = function () {
  1420. return all(this);
  1421. };
  1422. /**
  1423. * Returns the first resolved promise of an array. Prior rejected promises are
  1424. * ignored. Rejects only if all promises are rejected.
  1425. * @param {Array*} an array containing values or promises for values
  1426. * @returns a promise fulfilled with the value of the first resolved promise,
  1427. * or a rejected promise if all promises are rejected.
  1428. */
  1429. Q.any = any;
  1430. function any(promises) {
  1431. if (promises.length === 0) {
  1432. return Q.resolve();
  1433. }
  1434. var deferred = Q.defer();
  1435. var pendingCount = 0;
  1436. array_reduce(promises, function (prev, current, index) {
  1437. var promise = promises[index];
  1438. pendingCount++;
  1439. when(promise, onFulfilled, onRejected, onProgress);
  1440. function onFulfilled(result) {
  1441. deferred.resolve(result);
  1442. }
  1443. function onRejected() {
  1444. pendingCount--;
  1445. if (pendingCount === 0) {
  1446. deferred.reject(new Error(
  1447. "Can't get fulfillment value from any promise, all " +
  1448. "promises were rejected."
  1449. ));
  1450. }
  1451. }
  1452. function onProgress(progress) {
  1453. deferred.notify({
  1454. index: index,
  1455. value: progress
  1456. });
  1457. }
  1458. }, undefined);
  1459. return deferred.promise;
  1460. }
  1461. Promise.prototype.any = function () {
  1462. return any(this);
  1463. };
  1464. /**
  1465. * Waits for all promises to be settled, either fulfilled or
  1466. * rejected. This is distinct from `all` since that would stop
  1467. * waiting at the first rejection. The promise returned by
  1468. * `allResolved` will never be rejected.
  1469. * @param promises a promise for an array (or an array) of promises
  1470. * (or values)
  1471. * @return a promise for an array of promises
  1472. */
  1473. Q.allResolved = deprecate(allResolved, "allResolved", "allSettled");
  1474. function allResolved(promises) {
  1475. return when(promises, function (promises) {
  1476. promises = array_map(promises, Q);
  1477. return when(all(array_map(promises, function (promise) {
  1478. return when(promise, noop, noop);
  1479. })), function () {
  1480. return promises;
  1481. });
  1482. });
  1483. }
  1484. Promise.prototype.allResolved = function () {
  1485. return allResolved(this);
  1486. };
  1487. /**
  1488. * @see Promise#allSettled
  1489. */
  1490. Q.allSettled = allSettled;
  1491. function allSettled(promises) {
  1492. return Q(promises).allSettled();
  1493. }
  1494. /**
  1495. * Turns an array of promises into a promise for an array of their states (as
  1496. * returned by `inspect`) when they have all settled.
  1497. * @param {Array[Any*]} values an array (or promise for an array) of values (or
  1498. * promises for values)
  1499. * @returns {Array[State]} an array of states for the respective values.
  1500. */
  1501. Promise.prototype.allSettled = function () {
  1502. return this.then(function (promises) {
  1503. return all(array_map(promises, function (promise) {
  1504. promise = Q(promise);
  1505. function regardless() {
  1506. return promise.inspect();
  1507. }
  1508. return promise.then(regardless, regardless);
  1509. }));
  1510. });
  1511. };
  1512. /**
  1513. * Captures the failure of a promise, giving an oportunity to recover
  1514. * with a callback. If the given promise is fulfilled, the returned
  1515. * promise is fulfilled.
  1516. * @param {Any*} promise for something
  1517. * @param {Function} callback to fulfill the returned promise if the
  1518. * given promise is rejected
  1519. * @returns a promise for the return value of the callback
  1520. */
  1521. Q.fail = // XXX legacy
  1522. Q["catch"] = function (object, rejected) {
  1523. return Q(object).then(void 0, rejected);
  1524. };
  1525. Promise.prototype.fail = // XXX legacy
  1526. Promise.prototype["catch"] = function (rejected) {
  1527. return this.then(void 0, rejected);
  1528. };
  1529. /**
  1530. * Attaches a listener that can respond to progress notifications from a
  1531. * promise's originating deferred. This listener receives the exact arguments
  1532. * passed to ``deferred.notify``.
  1533. * @param {Any*} promise for something
  1534. * @param {Function} callback to receive any progress notifications
  1535. * @returns the given promise, unchanged
  1536. */
  1537. Q.progress = progress;
  1538. function progress(object, progressed) {
  1539. return Q(object).then(void 0, void 0, progressed);
  1540. }
  1541. Promise.prototype.progress = function (progressed) {
  1542. return this.then(void 0, void 0, progressed);
  1543. };
  1544. /**
  1545. * Provides an opportunity to observe the settling of a promise,
  1546. * regardless of whether the promise is fulfilled or rejected. Forwards
  1547. * the resolution to the returned promise when the callback is done.
  1548. * The callback can return a promise to defer completion.
  1549. * @param {Any*} promise
  1550. * @param {Function} callback to observe the resolution of the given
  1551. * promise, takes no arguments.
  1552. * @returns a promise for the resolution of the given promise when
  1553. * ``fin`` is done.
  1554. */
  1555. Q.fin = // XXX legacy
  1556. Q["finally"] = function (object, callback) {
  1557. return Q(object)["finally"](callback);
  1558. };
  1559. Promise.prototype.fin = // XXX legacy
  1560. Promise.prototype["finally"] = function (callback) {
  1561. callback = Q(callback);
  1562. return this.then(function (value) {
  1563. return callback.fcall().then(function () {
  1564. return value;
  1565. });
  1566. }, function (reason) {
  1567. // TODO attempt to recycle the rejection with "this".
  1568. return callback.fcall().then(function () {
  1569. throw reason;
  1570. });
  1571. });
  1572. };
  1573. /**
  1574. * Terminates a chain of promises, forcing rejections to be
  1575. * thrown as exceptions.
  1576. * @param {Any*} promise at the end of a chain of promises
  1577. * @returns nothing
  1578. */
  1579. Q.done = function (object, fulfilled, rejected, progress) {
  1580. return Q(object).done(fulfilled, rejected, progress);
  1581. };
  1582. Promise.prototype.done = function (fulfilled, rejected, progress) {
  1583. var onUnhandledError = function (error) {
  1584. // forward to a future turn so that ``when``
  1585. // does not catch it and turn it into a rejection.
  1586. Q.nextTick(function () {
  1587. makeStackTraceLong(error, promise);
  1588. if (Q.onerror) {
  1589. Q.onerror(error);
  1590. } else {
  1591. throw error;
  1592. }
  1593. });
  1594. };
  1595. // Avoid unnecessary `nextTick`ing via an unnecessary `when`.
  1596. var promise = fulfilled || rejected || progress ?
  1597. this.then(fulfilled, rejected, progress) :
  1598. this;
  1599. if (typeof process === "object" && process && process.domain) {
  1600. onUnhandledError = process.domain.bind(onUnhandledError);
  1601. }
  1602. promise.then(void 0, onUnhandledError);
  1603. };
  1604. /**
  1605. * Causes a promise to be rejected if it does not get fulfilled before
  1606. * some milliseconds time out.
  1607. * @param {Any*} promise
  1608. * @param {Number} milliseconds timeout
  1609. * @param {Any*} custom error message or Error object (optional)
  1610. * @returns a promise for the resolution of the given promise if it is
  1611. * fulfilled before the timeout, otherwise rejected.
  1612. */
  1613. Q.timeout = function (object, ms, error) {
  1614. return Q(object).timeout(ms, error);
  1615. };
  1616. Promise.prototype.timeout = function (ms, error) {
  1617. var deferred = defer();
  1618. var timeoutId = setTimeout(function () {
  1619. if (!error || "string" === typeof error) {
  1620. error = new Error(error || "Timed out after " + ms + " ms");
  1621. error.code = "ETIMEDOUT";
  1622. }
  1623. deferred.reject(error);
  1624. }, ms);
  1625. this.then(function (value) {
  1626. clearTimeout(timeoutId);
  1627. deferred.resolve(value);
  1628. }, function (exception) {
  1629. clearTimeout(timeoutId);
  1630. deferred.reject(exception);
  1631. }, deferred.notify);
  1632. return deferred.promise;
  1633. };
  1634. /**
  1635. * Returns a promise for the given value (or promised value), some
  1636. * milliseconds after it resolved. Passes rejections immediately.
  1637. * @param {Any*} promise
  1638. * @param {Number} milliseconds
  1639. * @returns a promise for the resolution of the given promise after milliseconds
  1640. * time has elapsed since the resolution of the given promise.
  1641. * If the given promise rejects, that is passed immediately.
  1642. */
  1643. Q.delay = function (object, timeout) {
  1644. if (timeout === void 0) {
  1645. timeout = object;
  1646. object = void 0;
  1647. }
  1648. return Q(object).delay(timeout);
  1649. };
  1650. Promise.prototype.delay = function (timeout) {
  1651. return this.then(function (value) {
  1652. var deferred = defer();
  1653. setTimeout(function () {
  1654. deferred.resolve(value);
  1655. }, timeout);
  1656. return deferred.promise;
  1657. });
  1658. };
  1659. /**
  1660. * Passes a continuation to a Node function, which is called with the given
  1661. * arguments provided as an array, and returns a promise.
  1662. *
  1663. * Q.nfapply(FS.readFile, [__filename])
  1664. * .then(function (content) {
  1665. * })
  1666. *
  1667. */
  1668. Q.nfapply = function (callback, args) {
  1669. return Q(callback).nfapply(args);
  1670. };
  1671. Promise.prototype.nfapply = function (args) {
  1672. var deferred = defer();
  1673. var nodeArgs = array_slice(args);
  1674. nodeArgs.push(deferred.makeNodeResolver());
  1675. this.fapply(nodeArgs).fail(deferred.reject);
  1676. return deferred.promise;
  1677. };
  1678. /**
  1679. * Passes a continuation to a Node function, which is called with the given
  1680. * arguments provided individually, and returns a promise.
  1681. * @example
  1682. * Q.nfcall(FS.readFile, __filename)
  1683. * .then(function (content) {
  1684. * })
  1685. *
  1686. */
  1687. Q.nfcall = function (callback /*...args*/) {
  1688. var args = array_slice(arguments, 1);
  1689. return Q(callback).nfapply(args);
  1690. };
  1691. Promise.prototype.nfcall = function (/*...args*/) {
  1692. var nodeArgs = array_slice(arguments);
  1693. var deferred = defer();
  1694. nodeArgs.push(deferred.makeNodeResolver());
  1695. this.fapply(nodeArgs).fail(deferred.reject);
  1696. return deferred.promise;
  1697. };
  1698. /**
  1699. * Wraps a NodeJS continuation passing function and returns an equivalent
  1700. * version that returns a promise.
  1701. * @example
  1702. * Q.nfbind(FS.readFile, __filename)("utf-8")
  1703. * .then(console.log)
  1704. * .done()
  1705. */
  1706. Q.nfbind =
  1707. Q.denodeify = function (callback /*...args*/) {
  1708. var baseArgs = array_slice(arguments, 1);
  1709. return function () {
  1710. var nodeArgs = baseArgs.concat(array_slice(arguments));
  1711. var deferred = defer();
  1712. nodeArgs.push(deferred.makeNodeResolver());
  1713. Q(callback).fapply(nodeArgs).fail(deferred.reject);
  1714. return deferred.promise;
  1715. };
  1716. };
  1717. Promise.prototype.nfbind =
  1718. Promise.prototype.denodeify = function (/*...args*/) {
  1719. var args = array_slice(arguments);
  1720. args.unshift(this);
  1721. return Q.denodeify.apply(void 0, args);
  1722. };
  1723. Q.nbind = function (callback, thisp /*...args*/) {
  1724. var baseArgs = array_slice(arguments, 2);
  1725. return function () {
  1726. var nodeArgs = baseArgs.concat(array_slice(arguments));
  1727. var deferred = defer();
  1728. nodeArgs.push(deferred.makeNodeResolver());
  1729. function bound() {
  1730. return callback.apply(thisp, arguments);
  1731. }
  1732. Q(bound).fapply(nodeArgs).fail(deferred.reject);
  1733. return deferred.promise;
  1734. };
  1735. };
  1736. Promise.prototype.nbind = function (/*thisp, ...args*/) {
  1737. var args = array_slice(arguments, 0);
  1738. args.unshift(this);
  1739. return Q.nbind.apply(void 0, args);
  1740. };
  1741. /**
  1742. * Calls a method of a Node-style object that accepts a Node-style
  1743. * callback with a given array of arguments, plus a provided callback.
  1744. * @param object an object that has the named method
  1745. * @param {String} name name of the method of object
  1746. * @param {Array} args arguments to pass to the method; the callback
  1747. * will be provided by Q and appended to these arguments.
  1748. * @returns a promise for the value or error
  1749. */
  1750. Q.nmapply = // XXX As proposed by "Redsandro"
  1751. Q.npost = function (object, name, args) {
  1752. return Q(object).npost(name, args);
  1753. };
  1754. Promise.prototype.nmapply = // XXX As proposed by "Redsandro"
  1755. Promise.prototype.npost = function (name, args) {
  1756. var nodeArgs = array_slice(args || []);
  1757. var deferred = defer();
  1758. nodeArgs.push(deferred.makeNodeResolver());
  1759. this.dispatch("post", [name, nodeArgs]).fail(deferred.reject);
  1760. return deferred.promise;
  1761. };
  1762. /**
  1763. * Calls a method of a Node-style object that accepts a Node-style
  1764. * callback, forwarding the given variadic arguments, plus a provided
  1765. * callback argument.
  1766. * @param object an object that has the named method
  1767. * @param {String} name name of the method of object
  1768. * @param ...args arguments to pass to the method; the callback will
  1769. * be provided by Q and appended to these arguments.
  1770. * @returns a promise for the value or error
  1771. */
  1772. Q.nsend = // XXX Based on Mark Miller's proposed "send"
  1773. Q.nmcall = // XXX Based on "Redsandro's" proposal
  1774. Q.ninvoke = function (object, name /*...args*/) {
  1775. var nodeArgs = array_slice(arguments, 2);
  1776. var deferred = defer();
  1777. nodeArgs.push(deferred.makeNodeResolver());
  1778. Q(object).dispatch("post", [name, nodeArgs]).fail(deferred.reject);
  1779. return deferred.promise;
  1780. };
  1781. Promise.prototype.nsend = // XXX Based on Mark Miller's proposed "send"
  1782. Promise.prototype.nmcall = // XXX Based on "Redsandro's" proposal
  1783. Promise.prototype.ninvoke = function (name /*...args*/) {
  1784. var nodeArgs = array_slice(arguments, 1);
  1785. var deferred = defer();
  1786. nodeArgs.push(deferred.makeNodeResolver());
  1787. this.dispatch("post", [name, nodeArgs]).fail(deferred.reject);
  1788. return deferred.promise;
  1789. };
  1790. /**
  1791. * If a function would like to support both Node continuation-passing-style and
  1792. * promise-returning-style, it can end its internal promise chain with
  1793. * `nodeify(nodeback)`, forwarding the optional nodeback argument. If the user
  1794. * elects to use a nodeback, the result will be sent there. If they do not
  1795. * pass a nodeback, they will receive the result promise.
  1796. * @param object a result (or a promise for a result)
  1797. * @param {Function} nodeback a Node.js-style callback
  1798. * @returns either the promise or nothing
  1799. */
  1800. Q.nodeify = nodeify;
  1801. function nodeify(object, nodeback) {
  1802. return Q(object).nodeify(nodeback);
  1803. }
  1804. Promise.prototype.nodeify = function (nodeback) {
  1805. if (nodeback) {
  1806. this.then(function (value) {
  1807. Q.nextTick(function () {
  1808. nodeback(null, value);
  1809. });
  1810. }, function (error) {
  1811. Q.nextTick(function () {
  1812. nodeback(error);
  1813. });
  1814. });
  1815. } else {
  1816. return this;
  1817. }
  1818. };
  1819. Q.noConflict = function() {
  1820. throw new Error("Q.noConflict only works when Q is used as a global");
  1821. };
  1822. // All code before this point will be filtered from stack traces.
  1823. var qEndingLine = captureLine();
  1824. return Q;
  1825. });
  1826. }).call(this,require('_process'))
  1827. },{"_process":14}],2:[function(require,module,exports){
  1828. // Copyright Joyent, Inc. and other Node contributors.
  1829. //
  1830. // Permission is hereby granted, free of charge, to any person obtaining a
  1831. // copy of this software and associated documentation files (the
  1832. // "Software"), to deal in the Software without restriction, including
  1833. // without limitation the rights to use, copy, modify, merge, publish,
  1834. // distribute, sublicense, and/or sell copies of the Software, and to permit
  1835. // persons to whom the Software is furnished to do so, subject to the
  1836. // following conditions:
  1837. //
  1838. // The above copyright notice and this permission notice shall be included
  1839. // in all copies or substantial portions of the Software.
  1840. //
  1841. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  1842. // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  1843. // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
  1844. // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
  1845. // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
  1846. // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
  1847. // USE OR OTHER DEALINGS IN THE SOFTWARE.
  1848. 'use strict';
  1849. var punycode = require('punycode');
  1850. var util = require('./util');
  1851. exports.parse = urlParse;
  1852. exports.resolve = urlResolve;
  1853. exports.resolveObject = urlResolveObject;
  1854. exports.format = urlFormat;
  1855. exports.Url = Url;
  1856. function Url() {
  1857. this.protocol = null;
  1858. this.slashes = null;
  1859. this.auth = null;
  1860. this.host = null;
  1861. this.port = null;
  1862. this.hostname = null;
  1863. this.hash = null;
  1864. this.search = null;
  1865. this.query = null;
  1866. this.pathname = null;
  1867. this.path = null;
  1868. this.href = null;
  1869. }
  1870. // Reference: RFC 3986, RFC 1808, RFC 2396
  1871. // define these here so at least they only have to be
  1872. // compiled once on the first module load.
  1873. var protocolPattern = /^([a-z0-9.+-]+:)/i,
  1874. portPattern = /:[0-9]*$/,
  1875. // Special case for a simple path URL
  1876. simplePathPattern = /^(\/\/?(?!\/)[^\?\s]*)(\?[^\s]*)?$/,
  1877. // RFC 2396: characters reserved for delimiting URLs.
  1878. // We actually just auto-escape these.
  1879. delims = ['<', '>', '"', '`', ' ', '\r', '\n', '\t'],
  1880. // RFC 2396: characters not allowed for various reasons.
  1881. unwise = ['{', '}', '|', '\\', '^', '`'].concat(delims),
  1882. // Allowed by RFCs, but cause of XSS attacks. Always escape these.
  1883. autoEscape = ['\''].concat(unwise),
  1884. // Characters that are never ever allowed in a hostname.
  1885. // Note that any invalid chars are also handled, but these
  1886. // are the ones that are *expected* to be seen, so we fast-path
  1887. // them.
  1888. nonHostChars = ['%', '/', '?', ';', '#'].concat(autoEscape),
  1889. hostEndingChars = ['/', '?', '#'],
  1890. hostnameMaxLen = 255,
  1891. hostnamePartPattern = /^[+a-z0-9A-Z_-]{0,63}$/,
  1892. hostnamePartStart = /^([+a-z0-9A-Z_-]{0,63})(.*)$/,
  1893. // protocols that can allow "unsafe" and "unwise" chars.
  1894. unsafeProtocol = {
  1895. 'javascript': true,
  1896. 'javascript:': true
  1897. },
  1898. // protocols that never have a hostname.
  1899. hostlessProtocol = {
  1900. 'javascript': true,
  1901. 'javascript:': true
  1902. },
  1903. // protocols that always contain a // bit.
  1904. slashedProtocol = {
  1905. 'http': true,
  1906. 'https': true,
  1907. 'ftp': true,
  1908. 'gopher': true,
  1909. 'file': true,
  1910. 'http:': true,
  1911. 'https:': true,
  1912. 'ftp:': true,
  1913. 'gopher:': true,
  1914. 'file:': true
  1915. },
  1916. querystring = require('querystring');
  1917. function urlParse(url, parseQueryString, slashesDenoteHost) {
  1918. if (url && util.isObject(url) && url instanceof Url) return url;
  1919. var u = new Url;
  1920. u.parse(url, parseQueryString, slashesDenoteHost);
  1921. return u;
  1922. }
  1923. Url.prototype.parse = function(url, parseQueryString, slashesDenoteHost) {
  1924. if (!util.isString(url)) {
  1925. throw new TypeError("Parameter 'url' must be a string, not " + typeof url);
  1926. }
  1927. // Copy chrome, IE, opera backslash-handling behavior.
  1928. // Back slashes before the query string get converted to forward slashes
  1929. // See: https://code.google.com/p/chromium/issues/detail?id=25916
  1930. var queryIndex = url.indexOf('?'),
  1931. splitter =
  1932. (queryIndex !== -1 && queryIndex < url.indexOf('#')) ? '?' : '#',
  1933. uSplit = url.split(splitter),
  1934. slashRegex = /\\/g;
  1935. uSplit[0] = uSplit[0].replace(slashRegex, '/');
  1936. url = uSplit.join(splitter);
  1937. var rest = url;
  1938. // trim before proceeding.
  1939. // This is to support parse stuff like " http://foo.com \n"
  1940. rest = rest.trim();
  1941. if (!slashesDenoteHost && url.split('#').length === 1) {
  1942. // Try fast path regexp
  1943. var simplePath = simplePathPattern.exec(rest);
  1944. if (simplePath) {
  1945. this.path = rest;
  1946. this.href = rest;
  1947. this.pathname = simplePath[1];
  1948. if (simplePath[2]) {
  1949. this.search = simplePath[2];
  1950. if (parseQueryString) {
  1951. this.query = querystring.parse(this.search.substr(1));
  1952. } else {
  1953. this.query = this.search.substr(1);
  1954. }
  1955. } else if (parseQueryString) {
  1956. this.search = '';
  1957. this.query = {};
  1958. }
  1959. return this;
  1960. }
  1961. }
  1962. var proto = protocolPattern.exec(rest);
  1963. if (proto) {
  1964. proto = proto[0];
  1965. var lowerProto = proto.toLowerCase();
  1966. this.protocol = lowerProto;
  1967. rest = rest.substr(proto.length);
  1968. }
  1969. // figure out if it's got a host
  1970. // user@server is *always* interpreted as a hostname, and url
  1971. // resolution will treat //foo/bar as host=foo,path=bar because that's
  1972. // how the browser resolves relative URLs.
  1973. if (slashesDenoteHost || proto || rest.match(/^\/\/[^@\/]+@[^@\/]+/)) {
  1974. var slashes = rest.substr(0, 2) === '//';
  1975. if (slashes && !(proto && hostlessProtocol[proto])) {
  1976. rest = rest.substr(2);
  1977. this.slashes = true;
  1978. }
  1979. }
  1980. if (!hostlessProtocol[proto] &&
  1981. (slashes || (proto && !slashedProtocol[proto]))) {
  1982. // there's a hostname.
  1983. // the first instance of /, ?, ;, or # ends the host.
  1984. //
  1985. // If there is an @ in the hostname, then non-host chars *are* allowed
  1986. // to the left of the last @ sign, unless some host-ending character
  1987. // comes *before* the @-sign.
  1988. // URLs are obnoxious.
  1989. //
  1990. // ex:
  1991. // http://a@b@c/ => user:a@b host:c
  1992. // http://a@b?@c => user:a host:c path:/?@c
  1993. // v0.12 TODO(isaacs): This is not quite how Chrome does things.
  1994. // Review our test case against browsers more comprehensively.
  1995. // find the first instance of any hostEndingChars
  1996. var hostEnd = -1;
  1997. for (var i = 0; i < hostEndingChars.length; i++) {
  1998. var hec = rest.indexOf(hostEndingChars[i]);
  1999. if (hec !== -1 && (hostEnd === -1 || hec < hostEnd))
  2000. hostEnd = hec;
  2001. }
  2002. // at this point, either we have an explicit point where the
  2003. // auth portion cannot go past, or the last @ char is the decider.
  2004. var auth, atSign;
  2005. if (hostEnd === -1) {
  2006. // atSign can be anywhere.
  2007. atSign = rest.lastIndexOf('@');
  2008. } else {
  2009. // atSign must be in auth portion.
  2010. // http://a@b/c@d => host:b auth:a path:/c@d
  2011. atSign = rest.lastIndexOf('@', hostEnd);
  2012. }
  2013. // Now we have a portion which is definitely the auth.
  2014. // Pull that off.
  2015. if (atSign !== -1) {
  2016. auth = rest.slice(0, atSign);
  2017. rest = rest.slice(atSign + 1);
  2018. this.auth = decodeURIComponent(auth);
  2019. }
  2020. // the host is the remaining to the left of the first non-host char
  2021. hostEnd = -1;
  2022. for (var i = 0; i < nonHostChars.length; i++) {
  2023. var hec = rest.indexOf(nonHostChars[i]);
  2024. if (hec !== -1 && (hostEnd === -1 || hec < hostEnd))
  2025. hostEnd = hec;
  2026. }
  2027. // if we still have not hit it, then the entire thing is a host.
  2028. if (hostEnd === -1)
  2029. hostEnd = rest.length;
  2030. this.host = rest.slice(0, hostEnd);
  2031. rest = rest.slice(hostEnd);
  2032. // pull out port.
  2033. this.parseHost();
  2034. // we've indicated that there is a hostname,
  2035. // so even if it's empty, it has to be present.
  2036. this.hostname = this.hostname || '';
  2037. // if hostname begins with [ and ends with ]
  2038. // assume that it's an IPv6 address.
  2039. var ipv6Hostname = this.hostname[0] === '[' &&
  2040. this.hostname[this.hostname.length - 1] === ']';
  2041. // validate a little.
  2042. if (!ipv6Hostname) {
  2043. var hostparts = this.hostname.split(/\./);
  2044. for (var i = 0, l = hostparts.length; i < l; i++) {
  2045. var part = hostparts[i];
  2046. if (!part) continue;
  2047. if (!part.match(hostnamePartPattern)) {
  2048. var newpart = '';
  2049. for (var j = 0, k = part.length; j < k; j++) {
  2050. if (part.charCodeAt(j) > 127) {
  2051. // we replace non-ASCII char with a temporary placeholder
  2052. // we need this to make sure size of hostname is not
  2053. // broken by replacing non-ASCII by nothing
  2054. newpart += 'x';
  2055. } else {
  2056. newpart += part[j];
  2057. }
  2058. }
  2059. // we test again with ASCII char only
  2060. if (!newpart.match(hostnamePartPattern)) {
  2061. var validParts = hostparts.slice(0, i);
  2062. var notHost = hostparts.slice(i + 1);
  2063. var bit = part.match(hostnamePartStart);
  2064. if (bit) {
  2065. validParts.push(bit[1]);
  2066. notHost.unshift(bit[2]);
  2067. }
  2068. if (notHost.length) {
  2069. rest = '/' + notHost.join('.') + rest;
  2070. }
  2071. this.hostname = validParts.join('.');
  2072. break;
  2073. }
  2074. }
  2075. }
  2076. }
  2077. if (this.hostname.length > hostnameMaxLen) {
  2078. this.hostname = '';
  2079. } else {
  2080. // hostnames are always lower case.
  2081. this.hostname = this.hostname.toLowerCase();
  2082. }
  2083. if (!ipv6Hostname) {
  2084. // IDNA Support: Returns a punycoded representation of "domain".
  2085. // It only converts parts of the domain name that
  2086. // have non-ASCII characters, i.e. it doesn't matter if
  2087. // you call it with a domain that already is ASCII-only.
  2088. this.hostname = punycode.toASCII(this.hostname);
  2089. }
  2090. var p = this.port ? ':' + this.port : '';
  2091. var h = this.hostname || '';
  2092. this.host = h + p;
  2093. this.href += this.host;
  2094. // strip [ and ] from the hostname
  2095. // the host field still retains them, though
  2096. if (ipv6Hostname) {
  2097. this.hostname = this.hostname.substr(1, this.hostname.length - 2);
  2098. if (rest[0] !== '/') {
  2099. rest = '/' + rest;
  2100. }
  2101. }
  2102. }
  2103. // now rest is set to the post-host stuff.
  2104. // chop off any delim chars.
  2105. if (!unsafeProtocol[lowerProto]) {
  2106. // First, make 100% sure that any "autoEscape" chars get
  2107. // escaped, even if encodeURIComponent doesn't think they
  2108. // need to be.
  2109. for (var i = 0, l = autoEscape.length; i < l; i++) {
  2110. var ae = autoEscape[i];
  2111. if (rest.indexOf(ae) === -1)
  2112. continue;
  2113. var esc = encodeURIComponent(ae);
  2114. if (esc === ae) {
  2115. esc = escape(ae);
  2116. }
  2117. rest = rest.split(ae).join(esc);
  2118. }
  2119. }
  2120. // chop off from the tail first.
  2121. var hash = rest.indexOf('#');
  2122. if (hash !== -1) {
  2123. // got a fragment string.
  2124. this.hash = rest.substr(hash);
  2125. rest = rest.slice(0, hash);
  2126. }
  2127. var qm = rest.indexOf('?');
  2128. if (qm !== -1) {
  2129. this.search = rest.substr(qm);
  2130. this.query = rest.substr(qm + 1);
  2131. if (parseQueryString) {
  2132. this.query = querystring.parse(this.query);
  2133. }
  2134. rest = rest.slice(0, qm);
  2135. } else if (parseQueryString) {
  2136. // no query string, but parseQueryString still requested
  2137. this.search = '';
  2138. this.query = {};
  2139. }
  2140. if (rest) this.pathname = rest;
  2141. if (slashedProtocol[lowerProto] &&
  2142. this.hostname && !this.pathname) {
  2143. this.pathname = '/';
  2144. }
  2145. //to support http.request
  2146. if (this.pathname || this.search) {
  2147. var p = this.pathname || '';
  2148. var s = this.search || '';
  2149. this.path = p + s;
  2150. }
  2151. // finally, reconstruct the href based on what has been validated.
  2152. this.href = this.format();
  2153. return this;
  2154. };
  2155. // format a parsed object into a url string
  2156. function urlFormat(obj) {
  2157. // ensure it's an object, and not a string url.
  2158. // If it's an obj, this is a no-op.
  2159. // this way, you can call url_format() on strings
  2160. // to clean up potentially wonky urls.
  2161. if (util.isString(obj)) obj = urlParse(obj);
  2162. if (!(obj instanceof Url)) return Url.prototype.format.call(obj);
  2163. return obj.format();
  2164. }
  2165. Url.prototype.format = function() {
  2166. var auth = this.auth || '';
  2167. if (auth) {
  2168. auth = encodeURIComponent(auth);
  2169. auth = auth.replace(/%3A/i, ':');
  2170. auth += '@';
  2171. }
  2172. var protocol = this.protocol || '',
  2173. pathname = this.pathname || '',
  2174. hash = this.hash || '',
  2175. host = false,
  2176. query = '';
  2177. if (this.host) {
  2178. host = auth + this.host;
  2179. } else if (this.hostname) {
  2180. host = auth + (this.hostname.indexOf(':') === -1 ?
  2181. this.hostname :
  2182. '[' + this.hostname + ']');
  2183. if (this.port) {
  2184. host += ':' + this.port;
  2185. }
  2186. }
  2187. if (this.query &&
  2188. util.isObject(this.query) &&
  2189. Object.keys(this.query).length) {
  2190. query = querystring.stringify(this.query);
  2191. }
  2192. var search = this.search || (query && ('?' + query)) || '';
  2193. if (protocol && protocol.substr(-1) !== ':') protocol += ':';
  2194. // only the slashedProtocols get the //. Not mailto:, xmpp:, etc.
  2195. // unless they had them to begin with.
  2196. if (this.slashes ||
  2197. (!protocol || slashedProtocol[protocol]) && host !== false) {
  2198. host = '//' + (host || '');
  2199. if (pathname && pathname.charAt(0) !== '/') pathname = '/' + pathname;
  2200. } else if (!host) {
  2201. host = '';
  2202. }
  2203. if (hash && hash.charAt(0) !== '#') hash = '#' + hash;
  2204. if (search && search.charAt(0) !== '?') search = '?' + search;
  2205. pathname = pathname.replace(/[?#]/g, function(match) {
  2206. return encodeURIComponent(match);
  2207. });
  2208. search = search.replace('#', '%23');
  2209. return protocol + host + pathname + search + hash;
  2210. };
  2211. function urlResolve(source, relative) {
  2212. return urlParse(source, false, true).resolve(relative);
  2213. }
  2214. Url.prototype.resolve = function(relative) {
  2215. return this.resolveObject(urlParse(relative, false, true)).format();
  2216. };
  2217. function urlResolveObject(source, relative) {
  2218. if (!source) return relative;
  2219. return urlParse(source, false, true).resolveObject(relative);
  2220. }
  2221. Url.prototype.resolveObject = function(relative) {
  2222. if (util.isString(relative)) {
  2223. var rel = new Url();
  2224. rel.parse(relative, false, true);
  2225. relative = rel;
  2226. }
  2227. var result = new Url();
  2228. var tkeys = Object.keys(this);
  2229. for (var tk = 0; tk < tkeys.length; tk++) {
  2230. var tkey = tkeys[tk];
  2231. result[tkey] = this[tkey];
  2232. }
  2233. // hash is always overridden, no matter what.
  2234. // even href="" will remove it.
  2235. result.hash = relative.hash;
  2236. // if the relative url is empty, then there's nothing left to do here.
  2237. if (relative.href === '') {
  2238. result.href = result.format();
  2239. return result;
  2240. }
  2241. // hrefs like //foo/bar always cut to the protocol.
  2242. if (relative.slashes && !relative.protocol) {
  2243. // take everything except the protocol from relative
  2244. var rkeys = Object.keys(relative);
  2245. for (var rk = 0; rk < rkeys.length; rk++) {
  2246. var rkey = rkeys[rk];
  2247. if (rkey !== 'protocol')
  2248. result[rkey] = relative[rkey];
  2249. }
  2250. //urlParse appends trailing / to urls like http://www.example.com
  2251. if (slashedProtocol[result.protocol] &&
  2252. result.hostname && !result.pathname) {
  2253. result.path = result.pathname = '/';
  2254. }
  2255. result.href = result.format();
  2256. return result;
  2257. }
  2258. if (relative.protocol && relative.protocol !== result.protocol) {
  2259. // if it's a known url protocol, then changing
  2260. // the protocol does weird things
  2261. // first, if it's not file:, then we MUST have a host,
  2262. // and if there was a path
  2263. // to begin with, then we MUST have a path.
  2264. // if it is file:, then the host is dropped,
  2265. // because that's known to be hostless.
  2266. // anything else is assumed to be absolute.
  2267. if (!slashedProtocol[relative.protocol]) {
  2268. var keys = Object.keys(relative);
  2269. for (var v = 0; v < keys.length; v++) {
  2270. var k = keys[v];
  2271. result[k] = relative[k];
  2272. }
  2273. result.href = result.format();
  2274. return result;
  2275. }
  2276. result.protocol = relative.protocol;
  2277. if (!relative.host && !hostlessProtocol[relative.protocol]) {
  2278. var relPath = (relative.pathname || '').split('/');
  2279. while (relPath.length && !(relative.host = relPath.shift()));
  2280. if (!relative.host) relative.host = '';
  2281. if (!relative.hostname) relative.hostname = '';
  2282. if (relPath[0] !== '') relPath.unshift('');
  2283. if (relPath.length < 2) relPath.unshift('');
  2284. result.pathname = relPath.join('/');
  2285. } else {
  2286. result.pathname = relative.pathname;
  2287. }
  2288. result.search = relative.search;
  2289. result.query = relative.query;
  2290. result.host = relative.host || '';
  2291. result.auth = relative.auth;
  2292. result.hostname = relative.hostname || relative.host;
  2293. result.port = relative.port;
  2294. // to support http.request
  2295. if (result.pathname || result.search) {
  2296. var p = result.pathname || '';
  2297. var s = result.search || '';
  2298. result.path = p + s;
  2299. }
  2300. result.slashes = result.slashes || relative.slashes;
  2301. result.href = result.format();
  2302. return result;
  2303. }
  2304. var isSourceAbs = (result.pathname && result.pathname.charAt(0) === '/'),
  2305. isRelAbs = (
  2306. relative.host ||
  2307. relative.pathname && relative.pathname.charAt(0) === '/'
  2308. ),
  2309. mustEndAbs = (isRelAbs || isSourceAbs ||
  2310. (result.host && relative.pathname)),
  2311. removeAllDots = mustEndAbs,
  2312. srcPath = result.pathname && result.pathname.split('/') || [],
  2313. relPath = relative.pathname && relative.pathname.split('/') || [],
  2314. psychotic = result.protocol && !slashedProtocol[result.protocol];
  2315. // if the url is a non-slashed url, then relative
  2316. // links like ../.. should be able
  2317. // to crawl up to the hostname, as well. This is strange.
  2318. // result.protocol has already been set by now.
  2319. // Later on, put the first path part into the host field.
  2320. if (psychotic) {
  2321. result.hostname = '';
  2322. result.port = null;
  2323. if (result.host) {
  2324. if (srcPath[0] === '') srcPath[0] = result.host;
  2325. else srcPath.unshift(result.host);
  2326. }
  2327. result.host = '';
  2328. if (relative.protocol) {
  2329. relative.hostname = null;
  2330. relative.port = null;
  2331. if (relative.host) {
  2332. if (relPath[0] === '') relPath[0] = relative.host;
  2333. else relPath.unshift(relative.host);
  2334. }
  2335. relative.host = null;
  2336. }
  2337. mustEndAbs = mustEndAbs && (relPath[0] === '' || srcPath[0] === '');
  2338. }
  2339. if (isRelAbs) {
  2340. // it's absolute.
  2341. result.host = (relative.host || relative.host === '') ?
  2342. relative.host : result.host;
  2343. result.hostname = (relative.hostname || relative.hostname === '') ?
  2344. relative.hostname : result.hostname;
  2345. result.search = relative.search;
  2346. result.query = relative.query;
  2347. srcPath = relPath;
  2348. // fall through to the dot-handling below.
  2349. } else if (relPath.length) {
  2350. // it's relative
  2351. // throw away the existing file, and take the new path instead.
  2352. if (!srcPath) srcPath = [];
  2353. srcPath.pop();
  2354. srcPath = srcPath.concat(relPath);
  2355. result.search = relative.search;
  2356. result.query = relative.query;
  2357. } else if (!util.isNullOrUndefined(relative.search)) {
  2358. // just pull out the search.
  2359. // like href='?foo'.
  2360. // Put this after the other two cases because it simplifies the booleans
  2361. if (psychotic) {
  2362. result.hostname = result.host = srcPath.shift();
  2363. //occationaly the auth can get stuck only in host
  2364. //this especially happens in cases like
  2365. //url.resolveObject('mailto:local1@domain1', 'local2@domain2')
  2366. var authInHost = result.host && result.host.indexOf('@') > 0 ?
  2367. result.host.split('@') : false;
  2368. if (authInHost) {
  2369. result.auth = authInHost.shift();
  2370. result.host = result.hostname = authInHost.shift();
  2371. }
  2372. }
  2373. result.search = relative.search;
  2374. result.query = relative.query;
  2375. //to support http.request
  2376. if (!util.isNull(result.pathname) || !util.isNull(result.search)) {
  2377. result.path = (result.pathname ? result.pathname : '') +
  2378. (result.search ? result.search : '');
  2379. }
  2380. result.href = result.format();
  2381. return result;
  2382. }
  2383. if (!srcPath.length) {
  2384. // no path at all. easy.
  2385. // we've already handled the other stuff above.
  2386. result.pathname = null;
  2387. //to support http.request
  2388. if (result.search) {
  2389. result.path = '/' + result.search;
  2390. } else {
  2391. result.path = null;
  2392. }
  2393. result.href = result.format();
  2394. return result;
  2395. }
  2396. // if a url ENDs in . or .., then it must get a trailing slash.
  2397. // however, if it ends in anything else non-slashy,
  2398. // then it must NOT get a trailing slash.
  2399. var last = srcPath.slice(-1)[0];
  2400. var hasTrailingSlash = (
  2401. (result.host || relative.host || srcPath.length > 1) &&
  2402. (last === '.' || last === '..') || last === '');
  2403. // strip single dots, resolve double dots to parent dir
  2404. // if the path tries to go above the root, `up` ends up > 0
  2405. var up = 0;
  2406. for (var i = srcPath.length; i >= 0; i--) {
  2407. last = srcPath[i];
  2408. if (last === '.') {
  2409. srcPath.splice(i, 1);
  2410. } else if (last === '..') {
  2411. srcPath.splice(i, 1);
  2412. up++;
  2413. } else if (up) {
  2414. srcPath.splice(i, 1);
  2415. up--;
  2416. }
  2417. }
  2418. // if the path is allowed to go above the root, restore leading ..s
  2419. if (!mustEndAbs && !removeAllDots) {
  2420. for (; up--; up) {
  2421. srcPath.unshift('..');
  2422. }
  2423. }
  2424. if (mustEndAbs && srcPath[0] !== '' &&
  2425. (!srcPath[0] || srcPath[0].charAt(0) !== '/')) {
  2426. srcPath.unshift('');
  2427. }
  2428. if (hasTrailingSlash && (srcPath.join('/').substr(-1) !== '/')) {
  2429. srcPath.push('');
  2430. }
  2431. var isAbsolute = srcPath[0] === '' ||
  2432. (srcPath[0] && srcPath[0].charAt(0) === '/');
  2433. // put the host back
  2434. if (psychotic) {
  2435. result.hostname = result.host = isAbsolute ? '' :
  2436. srcPath.length ? srcPath.shift() : '';
  2437. //occationaly the auth can get stuck only in host
  2438. //this especially happens in cases like
  2439. //url.resolveObject('mailto:local1@domain1', 'local2@domain2')
  2440. var authInHost = result.host && result.host.indexOf('@') > 0 ?
  2441. result.host.split('@') : false;
  2442. if (authInHost) {
  2443. result.auth = authInHost.shift();
  2444. result.host = result.hostname = authInHost.shift();
  2445. }
  2446. }
  2447. mustEndAbs = mustEndAbs || (result.host && srcPath.length);
  2448. if (mustEndAbs && !isAbsolute) {
  2449. srcPath.unshift('');
  2450. }
  2451. if (!srcPath.length) {
  2452. result.pathname = null;
  2453. result.path = null;
  2454. } else {
  2455. result.pathname = srcPath.join('/');
  2456. }
  2457. //to support request.http
  2458. if (!util.isNull(result.pathname) || !util.isNull(result.search)) {
  2459. result.path = (result.pathname ? result.pathname : '') +
  2460. (result.search ? result.search : '');
  2461. }
  2462. result.auth = relative.auth || result.auth;
  2463. result.slashes = result.slashes || relative.slashes;
  2464. result.href = result.format();
  2465. return result;
  2466. };
  2467. Url.prototype.parseHost = function() {
  2468. var host = this.host;
  2469. var port = portPattern.exec(host);
  2470. if (port) {
  2471. port = port[0];
  2472. if (port !== ':') {
  2473. this.port = port.substr(1);
  2474. }
  2475. host = host.substr(0, host.length - port.length);
  2476. }
  2477. if (host) this.hostname = host;
  2478. };
  2479. },{"./util":3,"punycode":15,"querystring":18}],3:[function(require,module,exports){
  2480. 'use strict';
  2481. module.exports = {
  2482. isString: function(arg) {
  2483. return typeof(arg) === 'string';
  2484. },
  2485. isObject: function(arg) {
  2486. return typeof(arg) === 'object' && arg !== null;
  2487. },
  2488. isNull: function(arg) {
  2489. return arg === null;
  2490. },
  2491. isNullOrUndefined: function(arg) {
  2492. return arg == null;
  2493. }
  2494. };
  2495. },{}],4:[function(require,module,exports){
  2496. // Copyright (c) Microsoft Corporation. All rights reserved.
  2497. /* global io:false */
  2498. var livereload = require('./live-reload-client');
  2499. var Messages = require('messages');
  2500. var telemetry = require('telemetry-helper');
  2501. var cordova;
  2502. var socket = io();
  2503. var nextExecCacheIndex = 0;
  2504. // Details of each plugin that has app-host code is injected when this file is served.
  2505. var plugins = {
  2506. 'events': require('events'),
  2507. 'cordova-plugin-device': require('cordova-plugin-device')
  2508. };
  2509. var pluginHandlersDefinitions = {
  2510. 'cordova-plugin-camera': require('cordova-plugin-camera-handlers'),
  2511. 'cordova-plugin-file': require('cordova-plugin-file-handlers'),
  2512. 'android-platform-core': require('android-platform-core-handlers')
  2513. };
  2514. var pluginClobberDefinitions = {
  2515. 'cordova-plugin-geolocation': require('cordova-plugin-geolocation-clobbers')
  2516. };
  2517. var execCache = {};
  2518. var pluginMessages = {};
  2519. var pluginHandlers = {};
  2520. var serviceToPluginMap = {};
  2521. function clobber(clobbers, scope, clobberToPluginMap, pluginId) {
  2522. Object.keys(clobbers).forEach(function (key) {
  2523. if (clobberToPluginMap && pluginId) {
  2524. clobberToPluginMap[key] = pluginId;
  2525. }
  2526. if (clobbers[key] && typeof clobbers[key] === 'object') {
  2527. scope[key] = scope[key] || {};
  2528. clobber(clobbers[key], scope[key]);
  2529. } else {
  2530. scope[key] = clobbers[key];
  2531. }
  2532. });
  2533. }
  2534. function applyPlugins(plugins, clobberScope, clobberToPluginMap) {
  2535. Object.keys(plugins).forEach(function (pluginId) {
  2536. var plugin = plugins[pluginId];
  2537. if (plugin) {
  2538. if (typeof plugin === 'function') {
  2539. pluginMessages[pluginId] = pluginMessages[pluginId] || new Messages(pluginId, socket);
  2540. plugin = plugin(pluginMessages[pluginId], exec);
  2541. plugins[pluginId] = plugin;
  2542. }
  2543. if (clobberScope) {
  2544. clobber(plugin, clobberScope, clobberToPluginMap, pluginId);
  2545. }
  2546. }
  2547. });
  2548. }
  2549. /*
  2550. * This function is used as setter for window.cordova property. Besides setting
  2551. * the global property, it overrides some cordova definitions and sets up the
  2552. * communication protocol with the server and the sim-host.
  2553. */
  2554. function setCordovaAndInitialize(originalCordova) {
  2555. var channel,
  2556. platform,
  2557. platformBootstrap;
  2558. if (cordova) {
  2559. return;
  2560. }
  2561. cordova = originalCordova;
  2562. cordova.define.remove('cordova/exec');
  2563. cordova.define('cordova/exec', function (require, exports, module) {
  2564. module.exports = exec;
  2565. });
  2566. platform = cordova.require('cordova/platform');
  2567. platformBootstrap = platform.bootstrap;
  2568. platform.bootstrap = function () {
  2569. };
  2570. // default Windows bootstrap function tries to load WinJS which is not
  2571. // available and not required in simulation mode so we override bootstrap
  2572. if (cordova.platformId === 'windows') {
  2573. platformBootstrap = function () {
  2574. cordova.require('cordova/modulemapper')
  2575. .clobbers('cordova/exec/proxy', 'cordova.commandProxy');
  2576. };
  2577. }
  2578. channel = cordova.require('cordova/channel');
  2579. // define our own channel to delay the initialization until sim-host tells
  2580. // us everything's ready (fired in 'start' event handler).
  2581. channel.createSticky('onCordovaSimulateReady');
  2582. channel.waitForInitialization('onCordovaSimulateReady');
  2583. socket.on('start-live-reload', function () {
  2584. livereload.start(socket);
  2585. });
  2586. socket.on('init-telemetry', function () {
  2587. telemetry.init(socket);
  2588. });
  2589. socket.on('init-xhr-proxy', function () {
  2590. require('xhr-proxy').init();
  2591. });
  2592. socket.on('init-touch-events', function () {
  2593. require('./touch-events').init();
  2594. });
  2595. socket.on('refresh', function () {
  2596. document.location.reload(true);
  2597. });
  2598. // firing of onNativeReady is delayed until SIM_HOST tells us it's ready
  2599. socket.once('init', function () {
  2600. // sim-host is ready, register exec handlers, fire onNativeReady and send
  2601. // the list of plugins
  2602. socket.on('exec-success', function (data) {
  2603. var execCacheInfo = execCache[data.index];
  2604. if (execCacheInfo && typeof execCacheInfo.success === 'function') {
  2605. execCacheInfo.success(data.result);
  2606. }
  2607. });
  2608. socket.on('exec-failure', function (data) {
  2609. var execCacheInfo = execCache[data.index];
  2610. if (execCacheInfo && typeof execCacheInfo.fail === 'function') {
  2611. execCacheInfo.fail(data.error);
  2612. }
  2613. });
  2614. if (cordova.platformId !== 'browser') {
  2615. channel.onPluginsReady.subscribe(function () {
  2616. var pluginList;
  2617. try {
  2618. pluginList = cordova.require('cordova/plugin_list').metadata;
  2619. } catch (ex) {
  2620. // when the app doesn't contain any plugin, the module "cordova/plugin_list"
  2621. // is not loaded and cordova.require throws an exception
  2622. pluginList = {};
  2623. }
  2624. socket.emit('app-plugin-list', pluginList);
  2625. });
  2626. } else {
  2627. socket.emit('app-plugin-list', {});
  2628. }
  2629. applyPlugins(plugins);
  2630. applyPlugins(pluginHandlersDefinitions, pluginHandlers, serviceToPluginMap);
  2631. applyPlugins(pluginClobberDefinitions, window);
  2632. telemetry.registerPluginServices(serviceToPluginMap);
  2633. platformBootstrap();
  2634. switch (cordova.platformId) {
  2635. // these platform fire onNativeReady in their bootstrap
  2636. case 'ios':
  2637. case 'browser':
  2638. case 'blackberry10':
  2639. case 'firefoxos':
  2640. case 'ubuntu':
  2641. case 'webos':
  2642. break;
  2643. // windows has an overridden bootstrap which does not fire
  2644. // onNativeReady
  2645. case 'windows':
  2646. // android specified here just to be explicit about it
  2647. /* falls through */
  2648. case 'android':
  2649. default:
  2650. channel.onNativeReady.fire();
  2651. break;
  2652. }
  2653. });
  2654. socket.once('start', function () {
  2655. // all set, fire onCordovaSimulate ready (which up to this point was
  2656. // delaying onDeviceReady).
  2657. channel.onCordovaSimulateReady.fire();
  2658. // an init after start means reload. it is only sent if sim-host was
  2659. // reloaded
  2660. socket.once('init', function () {
  2661. window.location.reload(true);
  2662. });
  2663. });
  2664. // register app-host
  2665. socket.emit('register-app-host');
  2666. }
  2667. function getCordova() {
  2668. return cordova;
  2669. }
  2670. function exec(success, fail, service, action, args) {
  2671. // If we have a local handler, call that. Otherwise pass it to the simulation host.
  2672. var handler = pluginHandlers[service] && pluginHandlers[service][action];
  2673. if (handler) {
  2674. telemetry.sendClientTelemetry('exec', { handled: 'app-host', service: service, action: action });
  2675. // Ensure local handlers are executed asynchronously.
  2676. setTimeout(function () {
  2677. handler(success, fail, args);
  2678. }, 0);
  2679. } else {
  2680. var execIndex = nextExecCacheIndex++;
  2681. execCache[execIndex] = { index: execIndex, success: success, fail: fail };
  2682. socket.emit('exec', { index: execIndex, service: service, action: action, args: args, hasSuccess: !!success, hasFail: !!fail });
  2683. }
  2684. }
  2685. // have this stub function always, some platforms require it
  2686. exec.init = function () {
  2687. };
  2688. // Setup for cordova patching
  2689. Object.defineProperty(window, 'cordova', {
  2690. set: setCordovaAndInitialize,
  2691. get: getCordova
  2692. });
  2693. var originalUserAgent = window.navigator.userAgent;
  2694. Object.defineProperty(window.navigator, 'userAgent', {
  2695. get: function () {
  2696. // The user agent is inserted here by the server when this file is served up.
  2697. var userAgent = '/** USER-AGENT **/';
  2698. return userAgent || originalUserAgent;
  2699. }
  2700. });
  2701. },{"./live-reload-client":5,"./touch-events":6,"android-platform-core-handlers":"android-platform-core-handlers","cordova-plugin-camera-handlers":"cordova-plugin-camera-handlers","cordova-plugin-device":"cordova-plugin-device","cordova-plugin-file-handlers":"cordova-plugin-file-handlers","cordova-plugin-geolocation-clobbers":"cordova-plugin-geolocation-clobbers","events":"events","messages":"messages","telemetry-helper":"telemetry-helper","xhr-proxy":"xhr-proxy"}],5:[function(require,module,exports){
  2702. // Copyright (c) Microsoft Corporation. All rights reserved.
  2703. // Based in part on code from Vogue (https://github.com/andrewdavey/vogue)
  2704. var url = require('url');
  2705. var URL_ATTRIB_NAME = 'url';
  2706. var HREF_ATTRIB_NAME = 'href';
  2707. var SRC_ATTRIB_NAME = 'src';
  2708. var referenceAttributes = [
  2709. URL_ATTRIB_NAME,
  2710. HREF_ATTRIB_NAME,
  2711. SRC_ATTRIB_NAME
  2712. ];
  2713. module.exports.start = function (sock) {
  2714. var serverUrl = window.location.protocol + '//' + window.location.host;
  2715. var localUrlPrefixes = [
  2716. serverUrl,
  2717. serverUrl + '/',
  2718. '/',
  2719. ''
  2720. ];
  2721. var socket = sock;
  2722. /**
  2723. * Returns the name of the reference attribute (either "url", "href" or "src") that is defined for the given node.
  2724. * If the node defines more than one, returns the first encountered, in that order.
  2725. *
  2726. * @param {Element} domNode The DOM node to check.
  2727. * @returns {String} "url", "href" or "src", or null if none of these attributes is defined.
  2728. */
  2729. function getReferenceAttributeForNode(domNode) {
  2730. if (domNode.getAttribute(URL_ATTRIB_NAME)) {
  2731. return URL_ATTRIB_NAME;
  2732. }
  2733. if (domNode.getAttribute(HREF_ATTRIB_NAME)) {
  2734. return HREF_ATTRIB_NAME;
  2735. }
  2736. if (domNode.getAttribute(SRC_ATTRIB_NAME)) {
  2737. return SRC_ATTRIB_NAME;
  2738. }
  2739. return null;
  2740. }
  2741. /**
  2742. * Checks whether the given URL corresponds to a given file path from the server.
  2743. *
  2744. * @param {String} url The URL to check.
  2745. * @param {String} fileRelativePath The path of the modified file to check, relative to the webRoot.
  2746. * @returns {boolean} Whether the URL points to the modified file from the server.
  2747. */
  2748. function urlMatchesPath(url, fileRelativePath) {
  2749. return localUrlPrefixes.some(function (prefix) {
  2750. return (prefix + fileRelativePath) === url;
  2751. });
  2752. }
  2753. /**
  2754. * Finds all the DOM elements that have a reference attribute ("url", "href" or "src") pointing to the given
  2755. * relative path. Excludes <script> tags.
  2756. *
  2757. * @param {String} fileRelativePath The URL of the file to check, relative to the webRoot.
  2758. * @returns {{ domNode: Element, referenceAttribute: string }[]} An array of "resources" referencing the given file.
  2759. */
  2760. function findDomNodesForFilePath(fileRelativePath) {
  2761. // To use querySelectorAll to query elements based on their attributes, the selector's syntax is:
  2762. // '[attrib1], [attrib2], ...'.
  2763. var selectorString = '[' + referenceAttributes.join('], [') + ']';
  2764. var rawNodes = document.querySelectorAll(selectorString);
  2765. var filteredNodes = [];
  2766. // querySelectorAll() does not return an array, so we can't use Array.prototype.filter().
  2767. for (var i = 0; i < rawNodes.length; ++i) {
  2768. var currentNode = rawNodes[i];
  2769. // Ignore <script> tags (we need to do a full reload for scripts).
  2770. if (currentNode.tagName.toLowerCase() === 'script') {
  2771. continue;
  2772. }
  2773. // Verify if the node is referencing the modified file
  2774. var referenceAttribute = getReferenceAttributeForNode(currentNode);
  2775. var nodeReference = currentNode.getAttribute(referenceAttribute);
  2776. // If the node's url / href / src doesn't reference the modified file on the server, ignore the node.
  2777. if (!urlMatchesPath(url.parse(nodeReference).pathname, fileRelativePath)) {
  2778. continue;
  2779. }
  2780. // We care about this node.
  2781. filteredNodes.push({
  2782. domNode: currentNode,
  2783. referenceAttribute: referenceAttribute
  2784. });
  2785. }
  2786. return filteredNodes;
  2787. }
  2788. /**
  2789. * Determines whether the changes form the specified file can be applied to the app without a full page reload.
  2790. * Then, based on that, either updates the reference attribute of the appropriate node, or does a full page
  2791. * reload.
  2792. *
  2793. * @param {String} fileRelativePath The URL of the file that changed, relative to the webRoot.
  2794. */
  2795. function onFileChanged(fileRelativePath) {
  2796. var associatedNodes = findDomNodesForFilePath(fileRelativePath);
  2797. if (associatedNodes.length) {
  2798. refreshFile(fileRelativePath, associatedNodes);
  2799. } else {
  2800. reloadPage();
  2801. }
  2802. }
  2803. /**
  2804. * Refreshes a file by updating the associated nodes' querystring with a new _livereload parameter.
  2805. *
  2806. * @param {String} fileRelativePath The URL of the file to be refreshed, relative to the webRoot.
  2807. */
  2808. function refreshFile(fileRelativePath, nodesToRefresh) {
  2809. nodesToRefresh = nodesToRefresh || findDomNodesForFilePath(fileRelativePath);
  2810. if (!nodesToRefresh) {
  2811. // The modified file doesn't appear to be referenced in the DOM anymore. Do a full reload.
  2812. reloadPage();
  2813. return;
  2814. }
  2815. // Update the nodes' url / href / src attribute with a new _livereload querystring parameter.
  2816. nodesToRefresh.forEach(function (nodeInfo) {
  2817. var previousUrl = nodeInfo.domNode.getAttribute(nodeInfo.referenceAttribute);
  2818. var parsedUrl = url.parse(previousUrl, true);
  2819. parsedUrl.query._livereload = (new Date).getTime();
  2820. delete parsedUrl.search;
  2821. nodeInfo.domNode.setAttribute(nodeInfo.referenceAttribute, url.format(parsedUrl));
  2822. });
  2823. }
  2824. /**
  2825. * Reload the page. Currently, only does a naive window.location.reload().
  2826. */
  2827. function reloadPage() {
  2828. window.location.reload(true);
  2829. }
  2830. socket.on('lr-file-changed', function (data) {
  2831. onFileChanged(data.fileRelativePath);
  2832. });
  2833. };
  2834. },{"url":2}],6:[function(require,module,exports){
  2835. // Copyright (c) Microsoft Corporation. All rights reserved.
  2836. // Based in part on code from Apache Ripple, https://github.com/apache/incubator-ripple
  2837. var utils = require('utils');
  2838. var _lastMouseEvent,
  2839. _isMouseDown;
  2840. // NOTE: missing view, detail, touches, targetTouches, scale and rotation
  2841. function _createTouchEvent(type, canBubble, cancelable, eventData) {
  2842. var touchEvent = window.document.createEvent('Event');
  2843. touchEvent.initEvent(type, canBubble, cancelable);
  2844. utils.mixin(eventData, touchEvent);
  2845. return touchEvent;
  2846. }
  2847. function _simulateTouchEvent(type, mouseevent) {
  2848. if (_lastMouseEvent &&
  2849. mouseevent.type === _lastMouseEvent.type &&
  2850. mouseevent.pageX === _lastMouseEvent.pageX &&
  2851. mouseevent.pageY === _lastMouseEvent.pageY) {
  2852. return;
  2853. }
  2854. _lastMouseEvent = mouseevent;
  2855. var touchObj = {
  2856. clientX: mouseevent.pageX,
  2857. clientY: mouseevent.pageY,
  2858. pageX: mouseevent.pageX,
  2859. pageY: mouseevent.pageY,
  2860. screenX: mouseevent.pageX,
  2861. screenY: mouseevent.pageY,
  2862. target: mouseevent.target,
  2863. identifier: ''
  2864. };
  2865. var eventData = {
  2866. altKey: mouseevent.altKey,
  2867. ctrlKey: mouseevent.ctrlKey,
  2868. shiftKey: mouseevent.shiftKey,
  2869. metaKey: mouseevent.metaKey,
  2870. changedTouches: [touchObj],
  2871. targetTouches: type === 'touchend' ? [] : [touchObj],
  2872. touches: type === 'touchend' ? [] : [touchObj]
  2873. };
  2874. utils.mixin(touchObj, eventData);
  2875. var itemFn = function (index) {
  2876. return this[index];
  2877. };
  2878. eventData.touches.item = itemFn;
  2879. eventData.changedTouches.item = itemFn;
  2880. eventData.targetTouches.item = itemFn;
  2881. var listenerName = 'on' + type,
  2882. simulatedEvent = _createTouchEvent(type, true, true, eventData);
  2883. mouseevent.target.dispatchEvent(simulatedEvent);
  2884. if (typeof mouseevent.target[listenerName] === 'function') {
  2885. mouseevent.target[listenerName].apply(mouseevent.target, [simulatedEvent]);
  2886. }
  2887. }
  2888. function init() {
  2889. window.document.addEventListener('mousedown', function (event) {
  2890. _isMouseDown = true;
  2891. _simulateTouchEvent('touchstart', event);
  2892. }, true);
  2893. window.document.addEventListener('mousemove', function (event) {
  2894. if (_isMouseDown) {
  2895. _simulateTouchEvent('touchmove', event);
  2896. }
  2897. }, true);
  2898. window.document.addEventListener('mouseup', function (event) {
  2899. _isMouseDown = false;
  2900. _simulateTouchEvent('touchend', event);
  2901. }, true);
  2902. window.Node.prototype.ontouchstart = null;
  2903. window.Node.prototype.ontouchend = null;
  2904. window.Node.prototype.ontouchmove = null;
  2905. }
  2906. module.exports.init = init;
  2907. },{"utils":"utils"}],7:[function(require,module,exports){
  2908. // Copyright (c) Microsoft Corporation. All rights reserved.
  2909. /**
  2910. * Interface to wrap the native File interface.
  2911. *
  2912. * This interface is necessary for creating zero-length (empty) files,
  2913. * something the Filesystem API allows you to do. Unfortunately, File's
  2914. * constructor cannot be called directly, making it impossible to instantiate
  2915. * an empty File in JS.
  2916. *
  2917. * @param {Object} opts Initial values.
  2918. * @constructor
  2919. */
  2920. function MyFile(opts) {
  2921. var blob_ = new Blob();
  2922. this.size = opts.size || 0;
  2923. this.name = opts.name || '';
  2924. this.type = opts.type || '';
  2925. this.lastModifiedDate = opts.lastModifiedDate || null;
  2926. this.storagePath = opts.storagePath || '';
  2927. // Need some black magic to correct the object's size/name/type based on the
  2928. // blob that is saved.
  2929. Object.defineProperty(this, 'blob_', {
  2930. enumerable: true,
  2931. get: function() {
  2932. return blob_;
  2933. },
  2934. set: function(val) {
  2935. blob_ = val;
  2936. this.size = blob_.size;
  2937. this.name = blob_.name;
  2938. this.type = blob_.type;
  2939. this.lastModifiedDate = blob_.lastModifiedDate;
  2940. }.bind(this)
  2941. });
  2942. }
  2943. MyFile.prototype.constructor = MyFile;
  2944. module.exports = MyFile;
  2945. },{}],8:[function(require,module,exports){
  2946. // Copyright (c) Microsoft Corporation. All rights reserved.
  2947. /*global Uint8Array: false */
  2948. if (!window.indexedDB) {
  2949. throw new Error('indexedDB not supported');
  2950. }
  2951. // Since we are using browser implementation
  2952. // of cordova-file-plugin for non-webkit browsers,
  2953. // we should reference MyFile, because currently loaded
  2954. // simulation platform might not be the 'browser'.
  2955. // (browser platform uses this file in its implementation).
  2956. var MyFile = require('./MyFile');
  2957. // Since we are using browser implementation
  2958. // of cordova-file-plugin for non-webkit browsers,
  2959. // we should reference Indexed DB, because currently loaded
  2960. // simulation platform might not be the 'browser'.
  2961. // (browser platform uses this file in its implementation).
  2962. var indexedDB = require('./indexedDB');
  2963. var DIR_SEPARATOR = '/';
  2964. var FILESYSTEM_PREFIX = 'file:///';
  2965. var fileSystem = null;
  2966. var pathsPrefix = {
  2967. // Read-only directory where the application is installed.
  2968. applicationDirectory: window.location.origin + '/',
  2969. // Where to put app-specific data files.
  2970. dataDirectory: 'file:///persistent/',
  2971. // Cached files that should survive app restarts.
  2972. // Apps should not rely on the OS to delete files in here.
  2973. cacheDirectory: 'file:///temporary/',
  2974. // Read-only directory where the application is installed.
  2975. // Android: the application space on external storage.
  2976. externalApplicationStorageDirectory: null,
  2977. // Android: Where to put app-specific data files on external storage.
  2978. externalDataDirectory: null,
  2979. // Android: the application cache on external storage.
  2980. externalCacheDirectory: null,
  2981. // Android: the external storage (SD card) root.
  2982. externalRootDirectory: null,
  2983. // iOS: Temp directory that the OS can clear at will.
  2984. tempDirectory: null,
  2985. // iOS: Holds app-specific files that should be synced (e.g. to iCloud).
  2986. syncedDataDirectory: null,
  2987. // iOS: Files private to the app, but that are meaningful to other applciations (e.g. Office files)
  2988. documentsDirectory: null,
  2989. // BlackBerry10: Files globally available to all apps
  2990. sharedDirectory: null
  2991. };
  2992. // We must override some functionality so that plugin can work properly,
  2993. // for example, we cannot call 'cordova' or file-plugin related files before deviceready
  2994. // event fired since app-host-handler's files initializes before them.
  2995. document.addEventListener('deviceready', function () {
  2996. // We must override getFs function since we are using browser implementation
  2997. // of cordova-plugin-file so everything will work as expected.
  2998. window.cordova.require('cordova-plugin-file.fileSystems').getFs = function (name, callback) {
  2999. callback(new window.FileSystem(name, fileSystem.root));
  3000. };
  3001. // Special functionality for proper Firefox work.
  3002. window.FileSystem.prototype.__format__ = function(fullPath) {
  3003. return (FILESYSTEM_PREFIX + this.name + (fullPath[0] === '/' ? '' : '/') + encodeURI(fullPath));
  3004. };
  3005. }, false);
  3006. /*** Helpers ***/
  3007. // When saving an entry, the fullPath should always lead with a slash and never
  3008. // end with one (e.g. a directory). Also, resolve '.' and '..' to an absolute
  3009. // one. This method ensures path is legit!
  3010. function resolveToFullPath_(cwdFullPath, path) {
  3011. path = path || '';
  3012. var fullPath = path;
  3013. var prefix = '';
  3014. cwdFullPath = cwdFullPath || DIR_SEPARATOR;
  3015. if (cwdFullPath.indexOf(FILESYSTEM_PREFIX) === 0) {
  3016. prefix = cwdFullPath.substring(0, cwdFullPath.indexOf(DIR_SEPARATOR, FILESYSTEM_PREFIX.length));
  3017. cwdFullPath = cwdFullPath.substring(cwdFullPath.indexOf(DIR_SEPARATOR, FILESYSTEM_PREFIX.length));
  3018. }
  3019. var relativePath = path[0] !== DIR_SEPARATOR;
  3020. if (relativePath) {
  3021. fullPath = cwdFullPath;
  3022. if (cwdFullPath !== DIR_SEPARATOR) {
  3023. fullPath += DIR_SEPARATOR + path;
  3024. } else {
  3025. fullPath += path;
  3026. }
  3027. }
  3028. // Remove doubled separator substrings
  3029. var re = new RegExp(DIR_SEPARATOR + DIR_SEPARATOR, 'g');
  3030. fullPath = fullPath.replace(re, DIR_SEPARATOR);
  3031. // Adjust '..'s by removing parent directories when '..' flows in path.
  3032. var parts = fullPath.split(DIR_SEPARATOR);
  3033. for (var i = 0; i < parts.length; ++i) {
  3034. var part = parts[i];
  3035. if (part === '..') {
  3036. parts[i - 1] = '';
  3037. parts[i] = '';
  3038. }
  3039. }
  3040. fullPath = parts.filter(function(el) {
  3041. return el;
  3042. }).join(DIR_SEPARATOR);
  3043. // Add back in leading slash.
  3044. if (fullPath[0] !== DIR_SEPARATOR) {
  3045. fullPath = DIR_SEPARATOR + fullPath;
  3046. }
  3047. // Replace './' by current dir. ('./one/./two' -> one/two)
  3048. fullPath = fullPath.replace(/\.\//g, DIR_SEPARATOR);
  3049. // Replace '//' with '/'.
  3050. fullPath = fullPath.replace(/\/\//g, DIR_SEPARATOR);
  3051. // Replace '/.' with '/'.
  3052. fullPath = fullPath.replace(/\/\./g, DIR_SEPARATOR);
  3053. // Remove '/' if it appears on the end.
  3054. if (fullPath[fullPath.length - 1] === DIR_SEPARATOR &&
  3055. fullPath !== DIR_SEPARATOR) {
  3056. fullPath = fullPath.substring(0, fullPath.length - 1);
  3057. }
  3058. var storagePath = prefix + fullPath;
  3059. storagePath = decodeURI(storagePath);
  3060. fullPath = decodeURI(fullPath);
  3061. return {
  3062. storagePath: storagePath,
  3063. fullPath: fullPath,
  3064. fileName: fullPath.split(DIR_SEPARATOR).pop(),
  3065. fsName: prefix.split(DIR_SEPARATOR).pop()
  3066. };
  3067. }
  3068. function fileEntryFromIdbEntry(fileEntry) {
  3069. // IDB won't save methods, so we need re-create the FileEntry.
  3070. var clonedFileEntry = new window.FileEntry(fileEntry.name, fileEntry.fullPath, fileEntry.filesystem);
  3071. clonedFileEntry.file_ = fileEntry.file_;
  3072. return clonedFileEntry;
  3073. }
  3074. function readAs(what, fullPath, encoding, startPos, endPos, successCallback, errorCallback) {
  3075. getFile(function(fileEntry) {
  3076. var fileReader = new FileReader(),
  3077. blob = fileEntry.file_.blob_.slice(startPos, endPos);
  3078. fileReader.onload = function(e) {
  3079. successCallback(e.target.result);
  3080. };
  3081. fileReader.onerror = errorCallback;
  3082. switch (what) {
  3083. case 'text':
  3084. fileReader.readAsText(blob, encoding);
  3085. break;
  3086. case 'dataURL':
  3087. fileReader.readAsDataURL(blob);
  3088. break;
  3089. case 'arrayBuffer':
  3090. fileReader.readAsArrayBuffer(blob);
  3091. break;
  3092. case 'binaryString':
  3093. fileReader.readAsBinaryString(blob);
  3094. break;
  3095. }
  3096. }, errorCallback, [fullPath, null]);
  3097. }
  3098. /*** Handlers ***/
  3099. function requestFileSystem(successCallback, errorCallback, args) {
  3100. var type = args[0];
  3101. // Size is ignored since IDB filesystem size depends
  3102. // on browser implementation and can't be set up by user
  3103. var size = args[1]; // eslint-disable-line no-unused-vars
  3104. if (type !== window.LocalFileSystem.TEMPORARY && type !== window.LocalFileSystem.PERSISTENT) {
  3105. errorCallback && errorCallback(window.FileError.INVALID_MODIFICATION_ERR);
  3106. return;
  3107. }
  3108. var name = type === window.LocalFileSystem.TEMPORARY ? 'temporary' : 'persistent';
  3109. var storageName = (location.protocol + location.host).replace(/:/g, '_');
  3110. var root = new window.DirectoryEntry('', DIR_SEPARATOR);
  3111. fileSystem = new window.FileSystem(name, root);
  3112. indexedDB.open(storageName, function() {
  3113. successCallback(fileSystem);
  3114. }, errorCallback);
  3115. }
  3116. function requestFileSystemHandler(successCallback, errorCallback, module, event, args) {
  3117. requestFileSystem(successCallback, errorCallback, args);
  3118. }
  3119. // list a directory's contents (files and folders).
  3120. function readEntries(successCallback, errorCallback, args) {
  3121. var fullPath = args[0];
  3122. if (typeof successCallback !== 'function') {
  3123. throw Error('Expected successCallback argument.');
  3124. }
  3125. var path = resolveToFullPath_(fullPath);
  3126. getDirectory(function() {
  3127. indexedDB.getAllEntries(path.fullPath + DIR_SEPARATOR, path.storagePath, function(entries) {
  3128. successCallback(entries);
  3129. }, errorCallback);
  3130. }, function() {
  3131. if (errorCallback) {
  3132. errorCallback(window.FileError.NOT_FOUND_ERR);
  3133. }
  3134. }, [path.storagePath, path.fullPath, {create: false}]);
  3135. }
  3136. function readEntriesHandler(successCallback, errorCallback, module, event, args) {
  3137. readEntries(successCallback, errorCallback, args);
  3138. }
  3139. function getFile(successCallback, errorCallback, args) {
  3140. var fullPath = args[0];
  3141. var path = args[1];
  3142. var options = args[2] || {};
  3143. // Create an absolute path if we were handed a relative one.
  3144. path = resolveToFullPath_(fullPath, path);
  3145. indexedDB.get(path.storagePath, function(fileEntry) {
  3146. if (options.create === true && options.exclusive === true && fileEntry) {
  3147. // If create and exclusive are both true, and the path already exists,
  3148. // getFile must fail.
  3149. if (errorCallback) {
  3150. errorCallback(window.FileError.PATH_EXISTS_ERR);
  3151. }
  3152. } else if (options.create === true && !fileEntry) {
  3153. // If create is true, the path doesn't exist, and no other error occurs,
  3154. // getFile must create it as a zero-length file and return a corresponding
  3155. // FileEntry.
  3156. var newFileEntry = new window.FileEntry(path.fileName, path.fullPath, new window.FileSystem(path.fsName, fileSystem.root));
  3157. newFileEntry.file_ = new MyFile({
  3158. size: 0,
  3159. name: newFileEntry.name,
  3160. lastModifiedDate: new Date(),
  3161. storagePath: path.storagePath
  3162. });
  3163. indexedDB.put(newFileEntry, path.storagePath, successCallback, errorCallback);
  3164. } else if (options.create === true && fileEntry) {
  3165. if (fileEntry.isFile) {
  3166. // Overwrite file, delete then create new.
  3167. indexedDB['delete'](path.storagePath, function() {
  3168. var newFileEntry = new window.FileEntry(path.fileName, path.fullPath, new window.FileSystem(path.fsName, fileSystem.root));
  3169. newFileEntry.file_ = new MyFile({
  3170. size: 0,
  3171. name: newFileEntry.name,
  3172. lastModifiedDate: new Date(),
  3173. storagePath: path.storagePath
  3174. });
  3175. indexedDB.put(newFileEntry, path.storagePath, successCallback, errorCallback);
  3176. }, errorCallback);
  3177. } else {
  3178. if (errorCallback) {
  3179. errorCallback(window.FileError.INVALID_MODIFICATION_ERR);
  3180. }
  3181. }
  3182. } else if ((!options.create || options.create === false) && !fileEntry) {
  3183. // If create is not true and the path doesn't exist, getFile must fail.
  3184. if (errorCallback) {
  3185. errorCallback(window.FileError.NOT_FOUND_ERR);
  3186. }
  3187. } else if ((!options.create || options.create === false) && fileEntry &&
  3188. fileEntry.isDirectory) {
  3189. // If create is not true and the path exists, but is a directory, getFile
  3190. // must fail.
  3191. if (errorCallback) {
  3192. errorCallback(window.FileError.TYPE_MISMATCH_ERR);
  3193. }
  3194. } else {
  3195. // Otherwise, if no other error occurs, getFile must return a FileEntry
  3196. // corresponding to path.
  3197. successCallback(fileEntryFromIdbEntry(fileEntry));
  3198. }
  3199. }, errorCallback);
  3200. }
  3201. function getFileHandler(successCallback, errorCallback, module, event, args) {
  3202. getFile(successCallback, errorCallback, args);
  3203. }
  3204. function getFileMetadata(successCallback, errorCallback, module, event, args) {
  3205. var fullPath = args[0];
  3206. getFile(function(fileEntry) {
  3207. successCallback(new window.File(fileEntry.file_.name, fileEntry.fullPath, '', fileEntry.file_.lastModifiedDate,
  3208. fileEntry.file_.size));
  3209. }, errorCallback, [fullPath, null]);
  3210. }
  3211. function setMetadata(successCallback, errorCallback, module, event, args) {
  3212. var fullPath = args[0];
  3213. var metadataObject = args[1];
  3214. getFile(function (fileEntry) {
  3215. fileEntry.file_.lastModifiedDate = metadataObject.modificationTime;
  3216. indexedDB.put(fileEntry, fileEntry.file_.storagePath, successCallback, errorCallback);
  3217. }, errorCallback, [fullPath, null]);
  3218. }
  3219. function write(successCallback, errorCallback, args) {
  3220. var fileName = args[0],
  3221. data = args[1],
  3222. position = args[2],
  3223. isBinary = args[3]; // eslint-disable-line no-unused-vars
  3224. if (!data) {
  3225. errorCallback && errorCallback(window.FileError.INVALID_MODIFICATION_ERR);
  3226. return;
  3227. }
  3228. if (typeof data === 'string' || data instanceof String) {
  3229. data = new Blob([data]);
  3230. }
  3231. getFile(function(fileEntry) {
  3232. var blob_ = fileEntry.file_.blob_;
  3233. if (!blob_) {
  3234. blob_ = new Blob([data], {type: data.type});
  3235. } else {
  3236. // Calc the head and tail fragments
  3237. var head = blob_.slice(0, position);
  3238. var tail = blob_.slice(position + (data.size || data.byteLength));
  3239. // Calc the padding
  3240. var padding = position - head.size;
  3241. if (padding < 0) {
  3242. padding = 0;
  3243. }
  3244. // Do the 'write'. In fact, a full overwrite of the Blob.
  3245. blob_ = new Blob([head, new Uint8Array(padding), data, tail],
  3246. {type: data.type});
  3247. }
  3248. // Set the blob we're writing on this file entry so we can recall it later.
  3249. fileEntry.file_.blob_ = blob_;
  3250. fileEntry.file_.lastModifiedDate = new Date() || null;
  3251. fileEntry.file_.size = blob_.size;
  3252. fileEntry.file_.name = blob_.name;
  3253. fileEntry.file_.type = blob_.type;
  3254. indexedDB.put(fileEntry, fileEntry.file_.storagePath, function() {
  3255. successCallback(data.size || data.byteLength);
  3256. }, errorCallback);
  3257. }, errorCallback, [fileName, null]);
  3258. }
  3259. function writeHandler(successCallback, errorCallback, module, event, args) {
  3260. write(successCallback, errorCallback, args);
  3261. }
  3262. function readAsTextHandler(successCallback, errorCallback, module, event, args) {
  3263. var fileName = args[0],
  3264. enc = args[1],
  3265. startPos = args[2],
  3266. endPos = args[3];
  3267. readAs('text', fileName, enc, startPos, endPos, successCallback, errorCallback);
  3268. }
  3269. function readAsDataURLHandler(successCallback, errorCallback, module, event, args) {
  3270. var fileName = args[0],
  3271. startPos = args[1],
  3272. endPos = args[2];
  3273. readAs('dataURL', fileName, null, startPos, endPos, successCallback, errorCallback);
  3274. }
  3275. function readAsBinaryStringHandler(successCallback, errorCallback, module, event, args) {
  3276. var fileName = args[0],
  3277. startPos = args[1],
  3278. endPos = args[2];
  3279. readAs('binaryString', fileName, null, startPos, endPos, successCallback, errorCallback);
  3280. }
  3281. function readAsArrayBufferHandler(successCallback, errorCallback, module, event, args) {
  3282. var fileName = args[0],
  3283. startPos = args[1],
  3284. endPos = args[2];
  3285. readAs('arrayBuffer', fileName, null, startPos, endPos, successCallback, errorCallback);
  3286. }
  3287. function removeRecursively(successCallback, errorCallback, module, event, args) {
  3288. removeHandler(successCallback, errorCallback, module, event, args);
  3289. }
  3290. function remove(successCallback, errorCallback, args) {
  3291. var fullPath = resolveToFullPath_(args[0]).storagePath;
  3292. if (fullPath === pathsPrefix.cacheDirectory || fullPath === pathsPrefix.dataDirectory) {
  3293. errorCallback(window.FileError.NO_MODIFICATION_ALLOWED_ERR);
  3294. return;
  3295. }
  3296. function deleteEntry(isDirectory) {
  3297. // TODO: This doesn't protect against directories that have content in it.
  3298. // Should throw an error instead if the dirEntry is not empty.
  3299. indexedDB['delete'](fullPath, function() {
  3300. successCallback && successCallback();
  3301. }, function() {
  3302. errorCallback && errorCallback();
  3303. }, isDirectory);
  3304. }
  3305. // We need to to understand what we are deleting:
  3306. getDirectory(function(entry) {
  3307. deleteEntry(entry.isDirectory);
  3308. }, function(){
  3309. //DirectoryEntry was already deleted or entry is FileEntry
  3310. deleteEntry(false);
  3311. }, [fullPath, null, {create: false}]);
  3312. }
  3313. function removeHandler(successCallback, errorCallback, module, event, args) {
  3314. remove(successCallback, errorCallback, args);
  3315. }
  3316. function getDirectory(successCallback, errorCallback, args) {
  3317. var fullPath = args[0];
  3318. var path = args[1];
  3319. var options = args[2];
  3320. // Create an absolute path if we were handed a relative one.
  3321. path = resolveToFullPath_(fullPath, path);
  3322. indexedDB.get(path.storagePath, function(folderEntry) {
  3323. if (!options) {
  3324. options = {};
  3325. }
  3326. if (options.create === true && options.exclusive === true && folderEntry) {
  3327. // If create and exclusive are both true, and the path already exists,
  3328. // getDirectory must fail.
  3329. if (errorCallback) {
  3330. errorCallback(window.FileError.PATH_EXISTS_ERR);
  3331. }
  3332. // There is a strange bug in mobilespec + FF, which results in coming to multiple else-if's
  3333. // so we are shielding from it with returns.
  3334. return;
  3335. }
  3336. if (options.create === true && !folderEntry) {
  3337. // If create is true, the path doesn't exist, and no other error occurs,
  3338. // getDirectory must create it as a zero-length file and return a corresponding
  3339. // MyDirectoryEntry.
  3340. var dirEntry = new window.DirectoryEntry(path.fileName, path.fullPath, new window.FileSystem(path.fsName, fileSystem.root));
  3341. indexedDB.put(dirEntry, path.storagePath, successCallback, errorCallback);
  3342. return;
  3343. }
  3344. if (options.create === true && folderEntry) {
  3345. if (folderEntry.isDirectory) {
  3346. // IDB won't save methods, so we need re-create the MyDirectoryEntry.
  3347. successCallback(new window.DirectoryEntry(folderEntry.name, folderEntry.fullPath, folderEntry.filesystem));
  3348. } else {
  3349. if (errorCallback) {
  3350. errorCallback(window.FileError.INVALID_MODIFICATION_ERR);
  3351. }
  3352. }
  3353. return;
  3354. }
  3355. if ((!options.create || options.create === false) && !folderEntry) {
  3356. // Handle root special. It should always exist.
  3357. if (path.fullPath === DIR_SEPARATOR) {
  3358. successCallback(fileSystem.root);
  3359. return;
  3360. }
  3361. // If create is not true and the path doesn't exist, getDirectory must fail.
  3362. if (errorCallback) {
  3363. errorCallback(window.FileError.NOT_FOUND_ERR);
  3364. }
  3365. return;
  3366. }
  3367. if ((!options.create || options.create === false) && folderEntry && folderEntry.isFile) {
  3368. // If create is not true and the path exists, but is a file, getDirectory
  3369. // must fail.
  3370. if (errorCallback) {
  3371. errorCallback(window.FileError.TYPE_MISMATCH_ERR);
  3372. }
  3373. return;
  3374. }
  3375. // Otherwise, if no other error occurs, getDirectory must return a
  3376. // MyDirectoryEntry corresponding to path.
  3377. // IDB won't' save methods, so we need re-create MyDirectoryEntry.
  3378. successCallback(new window.DirectoryEntry(folderEntry.name, folderEntry.fullPath, folderEntry.filesystem));
  3379. }, errorCallback);
  3380. }
  3381. function getDirectoryHandler(successCallback, errorCallback, module, event, args) {
  3382. getDirectory(successCallback, errorCallback, args);
  3383. }
  3384. function getParentHandler(successCallback, errorCallback, module, args) {
  3385. if (typeof successCallback !== 'function') {
  3386. throw Error('Expected successCallback argument.');
  3387. }
  3388. var fullPath = args[0];
  3389. //fullPath is like this:
  3390. //file:///persistent/path/to/file or
  3391. //file:///persistent/path/to/directory/
  3392. if (fullPath === DIR_SEPARATOR || fullPath === pathsPrefix.cacheDirectory ||
  3393. fullPath === pathsPrefix.dataDirectory) {
  3394. successCallback(fileSystem.root);
  3395. return;
  3396. }
  3397. //To delete all slashes at the end
  3398. while (fullPath[fullPath.length - 1] === '/') {
  3399. fullPath = fullPath.substr(0, fullPath.length - 1);
  3400. }
  3401. var pathArr = fullPath.split(DIR_SEPARATOR);
  3402. pathArr.pop();
  3403. var parentName = pathArr.pop();
  3404. var path = pathArr.join(DIR_SEPARATOR) + DIR_SEPARATOR;
  3405. //To get parent of root files
  3406. var joined = path + parentName + DIR_SEPARATOR;//is like this: file:///persistent/
  3407. if (joined === pathsPrefix.cacheDirectory || joined === pathsPrefix.dataDirectory) {
  3408. getDirectory(successCallback, errorCallback, [joined, DIR_SEPARATOR, {create: false}]);
  3409. return;
  3410. }
  3411. getDirectory(successCallback, errorCallback, [path, parentName, {create: false}]);
  3412. }
  3413. function copyTo(successCallback, errorCallback, args) {
  3414. var srcPath = args[0];
  3415. var parentFullPath = args[1];
  3416. var name = args[2];
  3417. if (name.indexOf('/') !== -1 || srcPath === parentFullPath + name) {
  3418. if (errorCallback) {
  3419. errorCallback(window.FileError.INVALID_MODIFICATION_ERR);
  3420. }
  3421. return;
  3422. }
  3423. // Read src file
  3424. getFile(function(srcFileEntry) {
  3425. var path = resolveToFullPath_(parentFullPath);
  3426. //Check directory
  3427. getDirectory(function() {
  3428. // Create dest file
  3429. getFile(function(dstFileEntry) {
  3430. write(function() {
  3431. successCallback(dstFileEntry);
  3432. }, errorCallback, [dstFileEntry.file_.storagePath, srcFileEntry.file_.blob_, 0]);
  3433. }, errorCallback, [parentFullPath, name, {create: true}]);
  3434. }, function() { if (errorCallback) { errorCallback(window.FileError.NOT_FOUND_ERR); }},
  3435. [path.storagePath, null, {create:false}]);
  3436. }, errorCallback, [srcPath, null]);
  3437. }
  3438. function copyToHandler(successCallback, errorCallback, module, event, args) {
  3439. copyTo(successCallback, errorCallback, args);
  3440. }
  3441. function moveToHandler(successCallback, errorCallback, module, event, args) {
  3442. var srcPath = args[0];
  3443. // parentFullPath and name parameters is ignored because
  3444. // args is being passed downstream to exports.copyTo method
  3445. var parentFullPath = args[1]; // eslint-disable-line no-unused-vars
  3446. var name = args[2]; // eslint-disable-line no-unused-vars
  3447. copyTo(function (fileEntry) {
  3448. remove(function () {
  3449. successCallback(fileEntry);
  3450. }, errorCallback, [srcPath]);
  3451. }, errorCallback, args);
  3452. }
  3453. function resolveLocalFileSystemURI(successCallback, errorCallback, args) {
  3454. var path = args[0];
  3455. // Ignore parameters
  3456. if (path.indexOf('?') !== -1) {
  3457. path = String(path).split('?')[0];
  3458. }
  3459. // support for encodeURI
  3460. if (/\%5/g.test(path) || /\%20/g.test(path)) {
  3461. path = decodeURI(path);
  3462. }
  3463. if (path.trim()[0] === '/') {
  3464. errorCallback && errorCallback(window.FileError.ENCODING_ERR);
  3465. return;
  3466. }
  3467. //support for cdvfile
  3468. if (path.trim().substr(0,7) === 'cdvfile') {
  3469. if (path.indexOf('cdvfile://localhost') === -1) {
  3470. errorCallback && errorCallback(window.FileError.ENCODING_ERR);
  3471. return;
  3472. }
  3473. var indexPersistent = path.indexOf('persistent');
  3474. var indexTemporary = path.indexOf('temporary');
  3475. //cdvfile://localhost/persistent/path/to/file
  3476. if (indexPersistent !== -1) {
  3477. path = 'file:///persistent' + path.substr(indexPersistent + 10);
  3478. } else if (indexTemporary !== -1) {
  3479. path = 'file:///temporary' + path.substr(indexTemporary + 9);
  3480. } else {
  3481. errorCallback && errorCallback(window.FileError.ENCODING_ERR);
  3482. return;
  3483. }
  3484. }
  3485. // to avoid path form of '///path/to/file'
  3486. function handlePathSlashes(path) {
  3487. var cutIndex = 0;
  3488. for (var i = 0; i < path.length - 1; i++) {
  3489. if (path[i] === DIR_SEPARATOR && path[i + 1] === DIR_SEPARATOR) {
  3490. cutIndex = i + 1;
  3491. } else break;
  3492. }
  3493. return path.substr(cutIndex);
  3494. }
  3495. // Handle localhost containing paths (see specs )
  3496. if (path.indexOf('file://localhost/') === 0) {
  3497. path = path.replace('file://localhost/', 'file:///');
  3498. }
  3499. if (path.indexOf(pathsPrefix.dataDirectory) === 0) {
  3500. path = path.substring(pathsPrefix.dataDirectory.length - 1);
  3501. path = handlePathSlashes(path);
  3502. requestFileSystem(function() {
  3503. getFile(successCallback, function() {
  3504. getDirectory(successCallback, errorCallback, [pathsPrefix.dataDirectory, path,
  3505. {create: false}]);
  3506. }, [pathsPrefix.dataDirectory, path, {create: false}]);
  3507. }, errorCallback, [window.LocalFileSystem.PERSISTENT]);
  3508. } else if (path.indexOf(pathsPrefix.cacheDirectory) === 0) {
  3509. path = path.substring(pathsPrefix.cacheDirectory.length - 1);
  3510. path = handlePathSlashes(path);
  3511. requestFileSystem(function() {
  3512. getFile(successCallback, function() {
  3513. getDirectory(successCallback, errorCallback, [pathsPrefix.cacheDirectory, path,
  3514. {create: false}]);
  3515. }, [pathsPrefix.cacheDirectory, path, {create: false}]);
  3516. }, errorCallback, [window.LocalFileSystem.TEMPORARY]);
  3517. } else if (path.indexOf(pathsPrefix.applicationDirectory) === 0) {
  3518. path = path.substring(pathsPrefix.applicationDirectory.length);
  3519. //TODO: need to cut out redundant slashes?
  3520. var xhr = new XMLHttpRequest();
  3521. xhr.open('GET', path, true);
  3522. xhr.onreadystatechange = function () {
  3523. if (xhr.status === 200 && xhr.readyState === 4) {
  3524. requestFileSystem(function(fs) {
  3525. fs.name = location.hostname;
  3526. //TODO: need to call exports.getFile(...) to handle errors correct
  3527. fs.root.getFile(path, {create: true}, writeFile, errorCallback);
  3528. }, errorCallback, [window.LocalFileSystem.PERSISTENT]);
  3529. }
  3530. };
  3531. xhr.onerror = function () {
  3532. errorCallback && errorCallback(window.FileError.NOT_READABLE_ERR);
  3533. };
  3534. xhr.send();
  3535. } else {
  3536. errorCallback && errorCallback(window.FileError.NOT_FOUND_ERR);
  3537. }
  3538. function writeFile(entry) {
  3539. entry.createWriter(function (fileWriter) {
  3540. fileWriter.onwriteend = function (evt) {
  3541. if (!evt.target.error) {
  3542. entry.filesystemName = location.hostname;
  3543. successCallback(entry);
  3544. }
  3545. };
  3546. fileWriter.onerror = function () {
  3547. errorCallback && errorCallback(window.FileError.NOT_READABLE_ERR);
  3548. };
  3549. fileWriter.write(new Blob([xhr.response]));
  3550. }, errorCallback);
  3551. }
  3552. }
  3553. function resolveLocalFileSystemURIHandler(successCallback, errorCallback, module, event, args) {
  3554. resolveLocalFileSystemURI(successCallback, errorCallback, args);
  3555. }
  3556. function requestAllPathsHandler(successCallback, errorCallback, module, event, args) {
  3557. successCallback(pathsPrefix);
  3558. }
  3559. // This handler is required for tests and backwards compatibility
  3560. function _getLocalFilesystemPathHandler(successCallback, errorCallback, module, event, args) {
  3561. var url = args[0];
  3562. var stringToCut = 'file://';
  3563. var fileIndex = url.indexOf(stringToCut);
  3564. if (fileIndex !== -1) {
  3565. url = url.substr(stringToCut.length, url.length-stringToCut.length);
  3566. }
  3567. successCallback(url);
  3568. }
  3569. function notifyNotSupported(success, fail, args) {
  3570. fail('This method is not supported yet');
  3571. }
  3572. module.exports = {
  3573. 'File': {
  3574. 'requestAllPaths': requestAllPathsHandler,
  3575. 'getDirectory': getDirectoryHandler,
  3576. 'removeRecursively': removeRecursively,
  3577. 'getFile': getFileHandler,
  3578. 'readEntries': readEntriesHandler,
  3579. 'getFileMetadata': getFileMetadata,
  3580. 'setMetadata': setMetadata,
  3581. 'moveTo': moveToHandler,
  3582. 'copyTo': copyToHandler,
  3583. 'remove': removeHandler,
  3584. 'getParent': getParentHandler,
  3585. 'readAsDataURL': readAsDataURLHandler,
  3586. 'readAsBinaryString': readAsBinaryStringHandler,
  3587. 'readAsArrayBuffer': readAsArrayBufferHandler,
  3588. 'readAsText': readAsTextHandler,
  3589. 'write': writeHandler,
  3590. 'requestFileSystem': requestFileSystemHandler,
  3591. 'resolveLocalFileSystemURI': resolveLocalFileSystemURIHandler,
  3592. // exec's below are not implemented in browser platform
  3593. 'truncate': notifyNotSupported,
  3594. 'requestAllFileSystems': notifyNotSupported,
  3595. // method below is used for backward compatibility w/ old File plugin implementation
  3596. '_getLocalFilesystemPath': _getLocalFilesystemPathHandler
  3597. }
  3598. };
  3599. },{"./MyFile":7,"./indexedDB":10}],9:[function(require,module,exports){
  3600. // Copyright (c) Microsoft Corporation. All rights reserved.
  3601. var filePluginIsReadyEvent = new Event('filePluginIsReady');
  3602. var PERSISTENT_FS_QUOTA = 5 * 1024 * 1024;
  3603. var entryFunctionsCreated = false;
  3604. var quotaWasRequested = false;
  3605. var eventWasThrown = false;
  3606. window.initPersistentFileSystem = function(size, win, fail) {
  3607. if (navigator.webkitPersistentStorage) {
  3608. navigator.webkitPersistentStorage.requestQuota(size, win, fail);
  3609. return;
  3610. }
  3611. fail('This browser does not support this function');
  3612. };
  3613. window.isFilePluginReadyRaised = function () { return eventWasThrown; };
  3614. window.initPersistentFileSystem(PERSISTENT_FS_QUOTA, function() {
  3615. console.log('Persistent fs quota granted');
  3616. quotaWasRequested = true;
  3617. }, function(e){
  3618. console.log('Error occured while trying to request Persistent fs quota: ' + JSON.stringify(e));
  3619. });
  3620. function dispatchEventIfReady() {
  3621. if (entryFunctionsCreated && quotaWasRequested) {
  3622. window.dispatchEvent(filePluginIsReadyEvent);
  3623. eventWasThrown = true;
  3624. } else {
  3625. setTimeout(dispatchEventIfReady, 100);
  3626. }
  3627. }
  3628. // We create and fire event 'filePluginIsReady' when file system persistent file quota
  3629. // is granted and entry functions are overriden, so we can already work with file system properly.
  3630. dispatchEventIfReady();
  3631. // We must override some functionality so that plugin can work properly,
  3632. // for example, if we override window.requestFileSystem or window.resolveLocalFileSystemURL,
  3633. // they might be overrided later, and if we will wait for deviceready event, we assume that
  3634. // these functions will not be overrided later.
  3635. document.addEventListener('deviceready', function () {
  3636. window.requestFileSystem = window.webkitRequestFileSystem;
  3637. if (!window.requestFileSystem) {
  3638. window.requestFileSystem = function(type, size, win, fail) {
  3639. if (fail) {
  3640. fail('Not supported');
  3641. }
  3642. };
  3643. } else {
  3644. window.requestFileSystem(window.TEMPORARY, 1, createFileEntryFunctions, function() {});
  3645. }
  3646. function createFileEntryFunctions(fs) {
  3647. fs.root.getFile('todelete_658674_833_4_cdv', {create: true}, function(fileEntry) {
  3648. var fileEntryType = Object.getPrototypeOf(fileEntry);
  3649. var entryType = Object.getPrototypeOf(fileEntryType);
  3650. // Save the original method
  3651. var origToURL = entryType.toURL;
  3652. entryType.toURL = function () {
  3653. var origURL = origToURL.call(this);
  3654. if (this.isDirectory && origURL.substr(-1) !== '/') {
  3655. return origURL + '/';
  3656. }
  3657. return origURL;
  3658. };
  3659. entryType.toNativeURL = function () {
  3660. console.warn('DEPRECATED: Update your code to use \'toURL\'');
  3661. return this.toURL();
  3662. };
  3663. entryType.toInternalURL = function() {
  3664. if (this.toURL().indexOf('persistent') > -1) {
  3665. return 'cdvfile://localhost/persistent' + this.fullPath;
  3666. }
  3667. if (this.toURL().indexOf('temporary') > -1) {
  3668. return 'cdvfile://localhost/temporary' + this.fullPath;
  3669. }
  3670. };
  3671. entryType.setMetadata = function(win, fail /*, metadata*/) {
  3672. fail && fail('Not supported');
  3673. };
  3674. fileEntry.createWriter(function(writer) {
  3675. var originalWrite = writer.write;
  3676. var writerProto = Object.getPrototypeOf(writer);
  3677. writerProto.write = function(blob) {
  3678. if(blob instanceof Blob) {
  3679. originalWrite.apply(this, [blob]);
  3680. } else {
  3681. var realBlob = new Blob([blob]);
  3682. originalWrite.apply(this, [realBlob]);
  3683. }
  3684. };
  3685. fileEntry.remove(function(){ entryFunctionsCreated = true; }, function(){ /* empty callback */ });
  3686. });
  3687. });
  3688. }
  3689. if (!window.resolveLocalFileSystemURL) {
  3690. window.resolveLocalFileSystemURL = function(url, win, fail) {
  3691. if(fail) {
  3692. fail('Not supported');
  3693. }
  3694. };
  3695. }
  3696. // Resolves a filesystem entry by its path - which is passed either in standard (filesystem:file://) or
  3697. // Cordova-specific (cdvfile://) universal way.
  3698. // Aligns with specification: http://www.w3.org/TR/2011/WD-file-system-api-20110419/#widl-LocalFileSystem-resolveLocalFileSystemURL
  3699. var nativeResolveLocalFileSystemURL = window.webkitResolveLocalFileSystemURL || window.resolveLocalFileSystemURL;
  3700. window.resolveLocalFileSystemURL = function(url, win, fail) {
  3701. /* If url starts with `cdvfile` then we need convert it to Chrome real url first:
  3702. cdvfile://localhost/persistent/path/to/file -> filesystem:file://persistent/path/to/file */
  3703. if (url.trim().substr(0,7) === 'cdvfile') {
  3704. /* Quirk:
  3705. Plugin supports cdvfile://localhost (local resources) only.
  3706. I.e. external resources are not supported via cdvfile. */
  3707. if (url.indexOf('cdvfile://localhost') !== -1) {
  3708. // Browser supports temporary and persistent only
  3709. var indexPersistent = url.indexOf('persistent');
  3710. var indexTemporary = url.indexOf('temporary');
  3711. /* Chrome urls start with 'filesystem:' prefix. See quirk:
  3712. toURL function in Chrome returns filesystem:-prefixed path depending on application host.
  3713. For example, filesystem:file:///persistent/somefile.txt,
  3714. filesystem:http://localhost:8080/persistent/somefile.txt. */
  3715. var prefix = 'filesystem:file:///';
  3716. if (location.protocol !== 'file:') {
  3717. prefix = 'filesystem:' + location.origin + '/';
  3718. }
  3719. var result;
  3720. if (indexPersistent !== -1) {
  3721. // cdvfile://localhost/persistent/path/to/file -> filesystem:file://persistent/path/to/file
  3722. // or filesystem:http://localhost:8080/persistent/path/to/file
  3723. result = prefix + 'persistent' + url.substr(indexPersistent + 10);
  3724. nativeResolveLocalFileSystemURL(result, win, fail);
  3725. return;
  3726. }
  3727. if (indexTemporary !== -1) {
  3728. // cdvfile://localhost/temporary/path/to/file -> filesystem:file://temporary/path/to/file
  3729. // or filesystem:http://localhost:8080/temporary/path/to/file
  3730. result = prefix + 'temporary' + url.substr(indexTemporary + 9);
  3731. nativeResolveLocalFileSystemURL(result, win, fail);
  3732. return;
  3733. }
  3734. }
  3735. // cdvfile other than local file resource is not supported
  3736. fail && fail(function () {throw new window.FileError(window.FileError.ENCODING_ERR);});
  3737. } else if (url.trim().indexOf('file://') === 0) {
  3738. // ADDED
  3739. url = 'filesystem:http://' + url.replace('file://', '');
  3740. nativeResolveLocalFileSystemURL(url, win, fail);
  3741. } else {
  3742. nativeResolveLocalFileSystemURL(url, win, fail);
  3743. }
  3744. };
  3745. }, false);
  3746. // This handler is required for tests and backwards compatibility
  3747. function _getLocalFilesystemPathHandler(successCallback, errorCallback, module, event, args) {
  3748. var url = args[0];
  3749. var localhostIndex = url.indexOf('localhost');
  3750. if (localhostIndex !== -1) {
  3751. url = url.substr(localhostIndex, url.length-localhostIndex);
  3752. }
  3753. successCallback(url);
  3754. }
  3755. function requestAllPathsHandler(successCallback, errorCallback, module, event, args) {
  3756. var pathsPrefix = {
  3757. // Read-only directory where the application is installed.
  3758. applicationDirectory: location.origin + '/',
  3759. // Where to put app-specific data files.
  3760. dataDirectory: 'filesystem:file:///persistent/',
  3761. // Cached files that should survive app restarts.
  3762. // Apps should not rely on the OS to delete files in here.
  3763. cacheDirectory: 'filesystem:file:///temporary/'
  3764. };
  3765. successCallback(pathsPrefix);
  3766. }
  3767. module.exports = {
  3768. 'File': {
  3769. '_getLocalFilesystemPath': _getLocalFilesystemPathHandler,
  3770. 'requestAllPaths': requestAllPathsHandler
  3771. }
  3772. };
  3773. },{}],10:[function(require,module,exports){
  3774. // Copyright (c) Microsoft Corporation. All rights reserved.
  3775. var indexedDB = {
  3776. db: null
  3777. };
  3778. var FILE_STORE_ = 'entries',
  3779. DIR_SEPARATOR = '/',
  3780. unicodeLastChar = 65535;
  3781. indexedDB.open = function(dbName, successCallback, errorCallback) {
  3782. var self = this;
  3783. // TODO: FF 12.0a1 isn't liking a db name with : in it.
  3784. var request = window.indexedDB.open(dbName.replace(':', '_')/*, 1 /*version*/);
  3785. request.onerror = errorCallback || onError;
  3786. request.onupgradeneeded = function(e) {
  3787. // First open was called or higher db version was used.
  3788. // console.log('onupgradeneeded: oldVersion:' + e.oldVersion,
  3789. // 'newVersion:' + e.newVersion);
  3790. self.db = e.target.result;
  3791. self.db.onerror = onError;
  3792. if (!self.db.objectStoreNames.contains(FILE_STORE_)) {
  3793. self.db.createObjectStore(FILE_STORE_/*,{keyPath: 'id', autoIncrement: true}*/);
  3794. }
  3795. };
  3796. request.onsuccess = function(e) {
  3797. self.db = e.target.result;
  3798. self.db.onerror = onError;
  3799. successCallback(e);
  3800. };
  3801. request.onblocked = errorCallback || onError;
  3802. };
  3803. indexedDB.close = function() {
  3804. this.db.close();
  3805. this.db = null;
  3806. };
  3807. indexedDB.get = function(fullPath, successCallback, errorCallback) {
  3808. if (!this.db) {
  3809. errorCallback && errorCallback(window.FileError.INVALID_MODIFICATION_ERR);
  3810. return;
  3811. }
  3812. var tx = this.db.transaction([FILE_STORE_], 'readonly');
  3813. var request = tx.objectStore(FILE_STORE_).get(fullPath);
  3814. tx.onabort = errorCallback || onError;
  3815. tx.oncomplete = function() {
  3816. successCallback(request.result);
  3817. };
  3818. };
  3819. indexedDB.getAllEntries = function(fullPath, storagePath, successCallback, errorCallback) {
  3820. if (!this.db) {
  3821. errorCallback && errorCallback(window.FileError.INVALID_MODIFICATION_ERR);
  3822. return;
  3823. }
  3824. var results = [];
  3825. if (storagePath[storagePath.length - 1] === DIR_SEPARATOR) {
  3826. storagePath = storagePath.substring(0, storagePath.length - 1);
  3827. }
  3828. var range = window.IDBKeyRange.bound(storagePath + DIR_SEPARATOR + ' ',
  3829. storagePath + DIR_SEPARATOR + String.fromCharCode(unicodeLastChar));
  3830. var tx = this.db.transaction([FILE_STORE_], 'readonly');
  3831. tx.onabort = errorCallback || onError;
  3832. tx.oncomplete = function() {
  3833. results = results.filter(function(val) {
  3834. var pathWithoutSlash = val.fullPath;
  3835. if (val.fullPath[val.fullPath.length - 1] === DIR_SEPARATOR) {
  3836. pathWithoutSlash = pathWithoutSlash.substr(0, pathWithoutSlash.length - 1);
  3837. }
  3838. var valPartsLen = pathWithoutSlash.split(DIR_SEPARATOR).length;
  3839. var fullPathPartsLen = fullPath.split(DIR_SEPARATOR).length;
  3840. /* Input fullPath parameter equals '//' for root folder */
  3841. /* Entries in root folder has valPartsLen equals 2 (see below) */
  3842. if (fullPath[fullPath.length -1] === DIR_SEPARATOR && fullPath.trim().length === 2) {
  3843. fullPathPartsLen = 1;
  3844. } else if (fullPath[fullPath.length -1] === DIR_SEPARATOR) {
  3845. fullPathPartsLen = fullPath.substr(0, fullPath.length - 1).split(DIR_SEPARATOR).length;
  3846. } else {
  3847. fullPathPartsLen = fullPath.split(DIR_SEPARATOR).length;
  3848. }
  3849. if (valPartsLen === fullPathPartsLen + 1) {
  3850. // If this a subfolder and entry is a direct child, include it in
  3851. // the results. Otherwise, it's not an entry of this folder.
  3852. return val;
  3853. } else return false;
  3854. });
  3855. successCallback(results);
  3856. };
  3857. var request = tx.objectStore(FILE_STORE_).openCursor(range);
  3858. request.onsuccess = function(e) {
  3859. var cursor = e.target.result;
  3860. if (cursor) {
  3861. var val = cursor.value;
  3862. results.push(val.isFile ? fileEntryFromIdbEntry(val) : new window.DirectoryEntry(val.name, val.fullPath, val.filesystem));
  3863. cursor['continue']();
  3864. }
  3865. };
  3866. };
  3867. indexedDB['delete'] = function(fullPath, successCallback, errorCallback, isDirectory) {
  3868. if (!indexedDB.db) {
  3869. errorCallback && errorCallback(window.FileError.INVALID_MODIFICATION_ERR);
  3870. return;
  3871. }
  3872. var tx = this.db.transaction([FILE_STORE_], 'readwrite');
  3873. tx.oncomplete = successCallback;
  3874. tx.onabort = errorCallback || onError;
  3875. tx.oncomplete = function() {
  3876. if (isDirectory) {
  3877. //We delete nested files and folders after deleting parent folder
  3878. //We use ranges: https://developer.mozilla.org/en-US/docs/Web/API/IDBKeyRange
  3879. fullPath = fullPath + DIR_SEPARATOR;
  3880. //Range contains all entries in the form fullPath<symbol> where
  3881. //symbol in the range from ' ' to symbol which has code `unicodeLastChar`
  3882. var range = window.IDBKeyRange.bound(fullPath + ' ', fullPath + String.fromCharCode(unicodeLastChar));
  3883. var newTx = this.db.transaction([FILE_STORE_], 'readwrite');
  3884. newTx.oncomplete = successCallback;
  3885. newTx.onabort = errorCallback || onError;
  3886. newTx.objectStore(FILE_STORE_)['delete'](range);
  3887. } else {
  3888. successCallback();
  3889. }
  3890. };
  3891. tx.objectStore(FILE_STORE_)['delete'](fullPath);
  3892. };
  3893. indexedDB.put = function(entry, storagePath, successCallback, errorCallback) {
  3894. if (!this.db) {
  3895. errorCallback && errorCallback(window.FileError.INVALID_MODIFICATION_ERR);
  3896. return;
  3897. }
  3898. var tx = this.db.transaction([FILE_STORE_], 'readwrite');
  3899. tx.onabort = onError;
  3900. tx.oncomplete = function() {
  3901. // TODO: Error is thrown if we pass the request event back instead.
  3902. successCallback(entry);
  3903. };
  3904. tx.objectStore(FILE_STORE_).put(entry, storagePath);
  3905. };
  3906. function onError(e) {
  3907. switch (e.target.errorCode) {
  3908. case 12:
  3909. console.log('Error - Attempt to open db with a lower version than the ' +
  3910. 'current one.');
  3911. break;
  3912. default:
  3913. console.log('errorCode: ' + e.target.errorCode);
  3914. }
  3915. console.log(e, e.code, e.message);
  3916. }
  3917. function fileEntryFromIdbEntry(fileEntry) {
  3918. // IDB won't save methods, so we need re-create the FileEntry.
  3919. var clonedFileEntry = new window.FileEntry(fileEntry.name, fileEntry.fullPath, fileEntry.filesystem);
  3920. clonedFileEntry.file_ = fileEntry.file_;
  3921. return clonedFileEntry;
  3922. }
  3923. module.exports = indexedDB;
  3924. },{}],11:[function(require,module,exports){
  3925. // Copyright (c) Microsoft Corporation. All rights reserved.
  3926. // Based on Apache Cordova geolocation plugin's Coordinates implementation.
  3927. // See https://github.com/apache/cordova-plugin-geolocation/blob/master/www/Coordinates.js
  3928. /**
  3929. * This class contains position information.
  3930. * @param {Object} lat
  3931. * @param {Object} lng
  3932. * @param {Object} alt
  3933. * @param {Object} acc
  3934. * @param {Object} head
  3935. * @param {Object} vel
  3936. * @param {Object} altacc
  3937. * @constructor
  3938. */
  3939. var Coordinates = function(lat, lng, alt, acc, head, vel, altacc) {
  3940. /**
  3941. * The latitude of the position.
  3942. */
  3943. this.latitude = lat;
  3944. /**
  3945. * The longitude of the position,
  3946. */
  3947. this.longitude = lng;
  3948. /**
  3949. * The accuracy of the position.
  3950. */
  3951. this.accuracy = acc;
  3952. /**
  3953. * The altitude of the position.
  3954. */
  3955. this.altitude = (alt !== undefined ? alt : null);
  3956. /**
  3957. * The direction the device is moving at the position.
  3958. */
  3959. this.heading = (head !== undefined ? head : null);
  3960. /**
  3961. * The velocity with which the device is moving at the position.
  3962. */
  3963. this.speed = (vel !== undefined ? vel : null);
  3964. if (this.speed === 0 || this.speed === null) {
  3965. this.heading = NaN;
  3966. }
  3967. /**
  3968. * The altitude accuracy of the position.
  3969. */
  3970. this.altitudeAccuracy = (altacc !== undefined) ? altacc : null;
  3971. };
  3972. module.exports = Coordinates;
  3973. },{}],12:[function(require,module,exports){
  3974. // Copyright (c) Microsoft Corporation. All rights reserved.
  3975. // Based on Apache Cordova geolocation plugin's Position implementation.
  3976. // See https://github.com/apache/cordova-plugin-geolocation/blob/master/www/Position.js
  3977. var Coordinates = require('./Coordinates');
  3978. var Position = function(coords, timestamp) {
  3979. if (coords) {
  3980. this.coords = new Coordinates(coords.latitude, coords.longitude, coords.altitude, coords.accuracy, coords.heading, coords.velocity, coords.altitudeAccuracy);
  3981. } else {
  3982. this.coords = new Coordinates();
  3983. }
  3984. this.timestamp = (timestamp !== undefined) ? timestamp : new Date();
  3985. };
  3986. module.exports = Position;
  3987. },{"./Coordinates":11}],13:[function(require,module,exports){
  3988. // Copyright (c) Microsoft Corporation. All rights reserved.
  3989. // Based on Apache Cordova geolocation plugin's PositionError implementation.
  3990. // See https://github.com/apache/cordova-plugin-geolocation/blob/master/www/PositionError.js
  3991. /**
  3992. * Position error object
  3993. *
  3994. * @constructor
  3995. * @param code
  3996. * @param message
  3997. */
  3998. var PositionError = function(code, message) {
  3999. this.code = code || null;
  4000. this.message = message || '';
  4001. };
  4002. PositionError.prototype.PERMISSION_DENIED = PositionError.PERMISSION_DENIED = 1;
  4003. PositionError.prototype.POSITION_UNAVAILABLE = PositionError.POSITION_UNAVAILABLE = 2;
  4004. PositionError.prototype.TIMEOUT = PositionError.TIMEOUT = 3;
  4005. module.exports = PositionError;
  4006. },{}],14:[function(require,module,exports){
  4007. // shim for using process in browser
  4008. var process = module.exports = {};
  4009. // cached from whatever global is present so that test runners that stub it
  4010. // don't break things. But we need to wrap it in a try catch in case it is
  4011. // wrapped in strict mode code which doesn't define any globals. It's inside a
  4012. // function because try/catches deoptimize in certain engines.
  4013. var cachedSetTimeout;
  4014. var cachedClearTimeout;
  4015. (function () {
  4016. try {
  4017. cachedSetTimeout = setTimeout;
  4018. } catch (e) {
  4019. cachedSetTimeout = function () {
  4020. throw new Error('setTimeout is not defined');
  4021. }
  4022. }
  4023. try {
  4024. cachedClearTimeout = clearTimeout;
  4025. } catch (e) {
  4026. cachedClearTimeout = function () {
  4027. throw new Error('clearTimeout is not defined');
  4028. }
  4029. }
  4030. } ())
  4031. function runTimeout(fun) {
  4032. if (cachedSetTimeout === setTimeout) {
  4033. //normal enviroments in sane situations
  4034. return setTimeout(fun, 0);
  4035. }
  4036. try {
  4037. // when when somebody has screwed with setTimeout but no I.E. maddness
  4038. return cachedSetTimeout(fun, 0);
  4039. } catch(e){
  4040. try {
  4041. // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
  4042. return cachedSetTimeout.call(null, fun, 0);
  4043. } catch(e){
  4044. // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error
  4045. return cachedSetTimeout.call(this, fun, 0);
  4046. }
  4047. }
  4048. }
  4049. function runClearTimeout(marker) {
  4050. if (cachedClearTimeout === clearTimeout) {
  4051. //normal enviroments in sane situations
  4052. return clearTimeout(marker);
  4053. }
  4054. try {
  4055. // when when somebody has screwed with setTimeout but no I.E. maddness
  4056. return cachedClearTimeout(marker);
  4057. } catch (e){
  4058. try {
  4059. // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
  4060. return cachedClearTimeout.call(null, marker);
  4061. } catch (e){
  4062. // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.
  4063. // Some versions of I.E. have different rules for clearTimeout vs setTimeout
  4064. return cachedClearTimeout.call(this, marker);
  4065. }
  4066. }
  4067. }
  4068. var queue = [];
  4069. var draining = false;
  4070. var currentQueue;
  4071. var queueIndex = -1;
  4072. function cleanUpNextTick() {
  4073. if (!draining || !currentQueue) {
  4074. return;
  4075. }
  4076. draining = false;
  4077. if (currentQueue.length) {
  4078. queue = currentQueue.concat(queue);
  4079. } else {
  4080. queueIndex = -1;
  4081. }
  4082. if (queue.length) {
  4083. drainQueue();
  4084. }
  4085. }
  4086. function drainQueue() {
  4087. if (draining) {
  4088. return;
  4089. }
  4090. var timeout = runTimeout(cleanUpNextTick);
  4091. draining = true;
  4092. var len = queue.length;
  4093. while(len) {
  4094. currentQueue = queue;
  4095. queue = [];
  4096. while (++queueIndex < len) {
  4097. if (currentQueue) {
  4098. currentQueue[queueIndex].run();
  4099. }
  4100. }
  4101. queueIndex = -1;
  4102. len = queue.length;
  4103. }
  4104. currentQueue = null;
  4105. draining = false;
  4106. runClearTimeout(timeout);
  4107. }
  4108. process.nextTick = function (fun) {
  4109. var args = new Array(arguments.length - 1);
  4110. if (arguments.length > 1) {
  4111. for (var i = 1; i < arguments.length; i++) {
  4112. args[i - 1] = arguments[i];
  4113. }
  4114. }
  4115. queue.push(new Item(fun, args));
  4116. if (queue.length === 1 && !draining) {
  4117. runTimeout(drainQueue);
  4118. }
  4119. };
  4120. // v8 likes predictible objects
  4121. function Item(fun, array) {
  4122. this.fun = fun;
  4123. this.array = array;
  4124. }
  4125. Item.prototype.run = function () {
  4126. this.fun.apply(null, this.array);
  4127. };
  4128. process.title = 'browser';
  4129. process.browser = true;
  4130. process.env = {};
  4131. process.argv = [];
  4132. process.version = ''; // empty string to avoid regexp issues
  4133. process.versions = {};
  4134. function noop() {}
  4135. process.on = noop;
  4136. process.addListener = noop;
  4137. process.once = noop;
  4138. process.off = noop;
  4139. process.removeListener = noop;
  4140. process.removeAllListeners = noop;
  4141. process.emit = noop;
  4142. process.binding = function (name) {
  4143. throw new Error('process.binding is not supported');
  4144. };
  4145. process.cwd = function () { return '/' };
  4146. process.chdir = function (dir) {
  4147. throw new Error('process.chdir is not supported');
  4148. };
  4149. process.umask = function() { return 0; };
  4150. },{}],15:[function(require,module,exports){
  4151. (function (global){
  4152. /*! https://mths.be/punycode v1.4.1 by @mathias */
  4153. ;(function(root) {
  4154. /** Detect free variables */
  4155. var freeExports = typeof exports == 'object' && exports &&
  4156. !exports.nodeType && exports;
  4157. var freeModule = typeof module == 'object' && module &&
  4158. !module.nodeType && module;
  4159. var freeGlobal = typeof global == 'object' && global;
  4160. if (
  4161. freeGlobal.global === freeGlobal ||
  4162. freeGlobal.window === freeGlobal ||
  4163. freeGlobal.self === freeGlobal
  4164. ) {
  4165. root = freeGlobal;
  4166. }
  4167. /**
  4168. * The `punycode` object.
  4169. * @name punycode
  4170. * @type Object
  4171. */
  4172. var punycode,
  4173. /** Highest positive signed 32-bit float value */
  4174. maxInt = 2147483647, // aka. 0x7FFFFFFF or 2^31-1
  4175. /** Bootstring parameters */
  4176. base = 36,
  4177. tMin = 1,
  4178. tMax = 26,
  4179. skew = 38,
  4180. damp = 700,
  4181. initialBias = 72,
  4182. initialN = 128, // 0x80
  4183. delimiter = '-', // '\x2D'
  4184. /** Regular expressions */
  4185. regexPunycode = /^xn--/,
  4186. regexNonASCII = /[^\x20-\x7E]/, // unprintable ASCII chars + non-ASCII chars
  4187. regexSeparators = /[\x2E\u3002\uFF0E\uFF61]/g, // RFC 3490 separators
  4188. /** Error messages */
  4189. errors = {
  4190. 'overflow': 'Overflow: input needs wider integers to process',
  4191. 'not-basic': 'Illegal input >= 0x80 (not a basic code point)',
  4192. 'invalid-input': 'Invalid input'
  4193. },
  4194. /** Convenience shortcuts */
  4195. baseMinusTMin = base - tMin,
  4196. floor = Math.floor,
  4197. stringFromCharCode = String.fromCharCode,
  4198. /** Temporary variable */
  4199. key;
  4200. /*--------------------------------------------------------------------------*/
  4201. /**
  4202. * A generic error utility function.
  4203. * @private
  4204. * @param {String} type The error type.
  4205. * @returns {Error} Throws a `RangeError` with the applicable error message.
  4206. */
  4207. function error(type) {
  4208. throw new RangeError(errors[type]);
  4209. }
  4210. /**
  4211. * A generic `Array#map` utility function.
  4212. * @private
  4213. * @param {Array} array The array to iterate over.
  4214. * @param {Function} callback The function that gets called for every array
  4215. * item.
  4216. * @returns {Array} A new array of values returned by the callback function.
  4217. */
  4218. function map(array, fn) {
  4219. var length = array.length;
  4220. var result = [];
  4221. while (length--) {
  4222. result[length] = fn(array[length]);
  4223. }
  4224. return result;
  4225. }
  4226. /**
  4227. * A simple `Array#map`-like wrapper to work with domain name strings or email
  4228. * addresses.
  4229. * @private
  4230. * @param {String} domain The domain name or email address.
  4231. * @param {Function} callback The function that gets called for every
  4232. * character.
  4233. * @returns {Array} A new string of characters returned by the callback
  4234. * function.
  4235. */
  4236. function mapDomain(string, fn) {
  4237. var parts = string.split('@');
  4238. var result = '';
  4239. if (parts.length > 1) {
  4240. // In email addresses, only the domain name should be punycoded. Leave
  4241. // the local part (i.e. everything up to `@`) intact.
  4242. result = parts[0] + '@';
  4243. string = parts[1];
  4244. }
  4245. // Avoid `split(regex)` for IE8 compatibility. See #17.
  4246. string = string.replace(regexSeparators, '\x2E');
  4247. var labels = string.split('.');
  4248. var encoded = map(labels, fn).join('.');
  4249. return result + encoded;
  4250. }
  4251. /**
  4252. * Creates an array containing the numeric code points of each Unicode
  4253. * character in the string. While JavaScript uses UCS-2 internally,
  4254. * this function will convert a pair of surrogate halves (each of which
  4255. * UCS-2 exposes as separate characters) into a single code point,
  4256. * matching UTF-16.
  4257. * @see `punycode.ucs2.encode`
  4258. * @see <https://mathiasbynens.be/notes/javascript-encoding>
  4259. * @memberOf punycode.ucs2
  4260. * @name decode
  4261. * @param {String} string The Unicode input string (UCS-2).
  4262. * @returns {Array} The new array of code points.
  4263. */
  4264. function ucs2decode(string) {
  4265. var output = [],
  4266. counter = 0,
  4267. length = string.length,
  4268. value,
  4269. extra;
  4270. while (counter < length) {
  4271. value = string.charCodeAt(counter++);
  4272. if (value >= 0xD800 && value <= 0xDBFF && counter < length) {
  4273. // high surrogate, and there is a next character
  4274. extra = string.charCodeAt(counter++);
  4275. if ((extra & 0xFC00) == 0xDC00) { // low surrogate
  4276. output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);
  4277. } else {
  4278. // unmatched surrogate; only append this code unit, in case the next
  4279. // code unit is the high surrogate of a surrogate pair
  4280. output.push(value);
  4281. counter--;
  4282. }
  4283. } else {
  4284. output.push(value);
  4285. }
  4286. }
  4287. return output;
  4288. }
  4289. /**
  4290. * Creates a string based on an array of numeric code points.
  4291. * @see `punycode.ucs2.decode`
  4292. * @memberOf punycode.ucs2
  4293. * @name encode
  4294. * @param {Array} codePoints The array of numeric code points.
  4295. * @returns {String} The new Unicode string (UCS-2).
  4296. */
  4297. function ucs2encode(array) {
  4298. return map(array, function(value) {
  4299. var output = '';
  4300. if (value > 0xFFFF) {
  4301. value -= 0x10000;
  4302. output += stringFromCharCode(value >>> 10 & 0x3FF | 0xD800);
  4303. value = 0xDC00 | value & 0x3FF;
  4304. }
  4305. output += stringFromCharCode(value);
  4306. return output;
  4307. }).join('');
  4308. }
  4309. /**
  4310. * Converts a basic code point into a digit/integer.
  4311. * @see `digitToBasic()`
  4312. * @private
  4313. * @param {Number} codePoint The basic numeric code point value.
  4314. * @returns {Number} The numeric value of a basic code point (for use in
  4315. * representing integers) in the range `0` to `base - 1`, or `base` if
  4316. * the code point does not represent a value.
  4317. */
  4318. function basicToDigit(codePoint) {
  4319. if (codePoint - 48 < 10) {
  4320. return codePoint - 22;
  4321. }
  4322. if (codePoint - 65 < 26) {
  4323. return codePoint - 65;
  4324. }
  4325. if (codePoint - 97 < 26) {
  4326. return codePoint - 97;
  4327. }
  4328. return base;
  4329. }
  4330. /**
  4331. * Converts a digit/integer into a basic code point.
  4332. * @see `basicToDigit()`
  4333. * @private
  4334. * @param {Number} digit The numeric value of a basic code point.
  4335. * @returns {Number} The basic code point whose value (when used for
  4336. * representing integers) is `digit`, which needs to be in the range
  4337. * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is
  4338. * used; else, the lowercase form is used. The behavior is undefined
  4339. * if `flag` is non-zero and `digit` has no uppercase form.
  4340. */
  4341. function digitToBasic(digit, flag) {
  4342. // 0..25 map to ASCII a..z or A..Z
  4343. // 26..35 map to ASCII 0..9
  4344. return digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5);
  4345. }
  4346. /**
  4347. * Bias adaptation function as per section 3.4 of RFC 3492.
  4348. * https://tools.ietf.org/html/rfc3492#section-3.4
  4349. * @private
  4350. */
  4351. function adapt(delta, numPoints, firstTime) {
  4352. var k = 0;
  4353. delta = firstTime ? floor(delta / damp) : delta >> 1;
  4354. delta += floor(delta / numPoints);
  4355. for (/* no initialization */; delta > baseMinusTMin * tMax >> 1; k += base) {
  4356. delta = floor(delta / baseMinusTMin);
  4357. }
  4358. return floor(k + (baseMinusTMin + 1) * delta / (delta + skew));
  4359. }
  4360. /**
  4361. * Converts a Punycode string of ASCII-only symbols to a string of Unicode
  4362. * symbols.
  4363. * @memberOf punycode
  4364. * @param {String} input The Punycode string of ASCII-only symbols.
  4365. * @returns {String} The resulting string of Unicode symbols.
  4366. */
  4367. function decode(input) {
  4368. // Don't use UCS-2
  4369. var output = [],
  4370. inputLength = input.length,
  4371. out,
  4372. i = 0,
  4373. n = initialN,
  4374. bias = initialBias,
  4375. basic,
  4376. j,
  4377. index,
  4378. oldi,
  4379. w,
  4380. k,
  4381. digit,
  4382. t,
  4383. /** Cached calculation results */
  4384. baseMinusT;
  4385. // Handle the basic code points: let `basic` be the number of input code
  4386. // points before the last delimiter, or `0` if there is none, then copy
  4387. // the first basic code points to the output.
  4388. basic = input.lastIndexOf(delimiter);
  4389. if (basic < 0) {
  4390. basic = 0;
  4391. }
  4392. for (j = 0; j < basic; ++j) {
  4393. // if it's not a basic code point
  4394. if (input.charCodeAt(j) >= 0x80) {
  4395. error('not-basic');
  4396. }
  4397. output.push(input.charCodeAt(j));
  4398. }
  4399. // Main decoding loop: start just after the last delimiter if any basic code
  4400. // points were copied; start at the beginning otherwise.
  4401. for (index = basic > 0 ? basic + 1 : 0; index < inputLength; /* no final expression */) {
  4402. // `index` is the index of the next character to be consumed.
  4403. // Decode a generalized variable-length integer into `delta`,
  4404. // which gets added to `i`. The overflow checking is easier
  4405. // if we increase `i` as we go, then subtract off its starting
  4406. // value at the end to obtain `delta`.
  4407. for (oldi = i, w = 1, k = base; /* no condition */; k += base) {
  4408. if (index >= inputLength) {
  4409. error('invalid-input');
  4410. }
  4411. digit = basicToDigit(input.charCodeAt(index++));
  4412. if (digit >= base || digit > floor((maxInt - i) / w)) {
  4413. error('overflow');
  4414. }
  4415. i += digit * w;
  4416. t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);
  4417. if (digit < t) {
  4418. break;
  4419. }
  4420. baseMinusT = base - t;
  4421. if (w > floor(maxInt / baseMinusT)) {
  4422. error('overflow');
  4423. }
  4424. w *= baseMinusT;
  4425. }
  4426. out = output.length + 1;
  4427. bias = adapt(i - oldi, out, oldi == 0);
  4428. // `i` was supposed to wrap around from `out` to `0`,
  4429. // incrementing `n` each time, so we'll fix that now:
  4430. if (floor(i / out) > maxInt - n) {
  4431. error('overflow');
  4432. }
  4433. n += floor(i / out);
  4434. i %= out;
  4435. // Insert `n` at position `i` of the output
  4436. output.splice(i++, 0, n);
  4437. }
  4438. return ucs2encode(output);
  4439. }
  4440. /**
  4441. * Converts a string of Unicode symbols (e.g. a domain name label) to a
  4442. * Punycode string of ASCII-only symbols.
  4443. * @memberOf punycode
  4444. * @param {String} input The string of Unicode symbols.
  4445. * @returns {String} The resulting Punycode string of ASCII-only symbols.
  4446. */
  4447. function encode(input) {
  4448. var n,
  4449. delta,
  4450. handledCPCount,
  4451. basicLength,
  4452. bias,
  4453. j,
  4454. m,
  4455. q,
  4456. k,
  4457. t,
  4458. currentValue,
  4459. output = [],
  4460. /** `inputLength` will hold the number of code points in `input`. */
  4461. inputLength,
  4462. /** Cached calculation results */
  4463. handledCPCountPlusOne,
  4464. baseMinusT,
  4465. qMinusT;
  4466. // Convert the input in UCS-2 to Unicode
  4467. input = ucs2decode(input);
  4468. // Cache the length
  4469. inputLength = input.length;
  4470. // Initialize the state
  4471. n = initialN;
  4472. delta = 0;
  4473. bias = initialBias;
  4474. // Handle the basic code points
  4475. for (j = 0; j < inputLength; ++j) {
  4476. currentValue = input[j];
  4477. if (currentValue < 0x80) {
  4478. output.push(stringFromCharCode(currentValue));
  4479. }
  4480. }
  4481. handledCPCount = basicLength = output.length;
  4482. // `handledCPCount` is the number of code points that have been handled;
  4483. // `basicLength` is the number of basic code points.
  4484. // Finish the basic string - if it is not empty - with a delimiter
  4485. if (basicLength) {
  4486. output.push(delimiter);
  4487. }
  4488. // Main encoding loop:
  4489. while (handledCPCount < inputLength) {
  4490. // All non-basic code points < n have been handled already. Find the next
  4491. // larger one:
  4492. for (m = maxInt, j = 0; j < inputLength; ++j) {
  4493. currentValue = input[j];
  4494. if (currentValue >= n && currentValue < m) {
  4495. m = currentValue;
  4496. }
  4497. }
  4498. // Increase `delta` enough to advance the decoder's <n,i> state to <m,0>,
  4499. // but guard against overflow
  4500. handledCPCountPlusOne = handledCPCount + 1;
  4501. if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {
  4502. error('overflow');
  4503. }
  4504. delta += (m - n) * handledCPCountPlusOne;
  4505. n = m;
  4506. for (j = 0; j < inputLength; ++j) {
  4507. currentValue = input[j];
  4508. if (currentValue < n && ++delta > maxInt) {
  4509. error('overflow');
  4510. }
  4511. if (currentValue == n) {
  4512. // Represent delta as a generalized variable-length integer
  4513. for (q = delta, k = base; /* no condition */; k += base) {
  4514. t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);
  4515. if (q < t) {
  4516. break;
  4517. }
  4518. qMinusT = q - t;
  4519. baseMinusT = base - t;
  4520. output.push(
  4521. stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0))
  4522. );
  4523. q = floor(qMinusT / baseMinusT);
  4524. }
  4525. output.push(stringFromCharCode(digitToBasic(q, 0)));
  4526. bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength);
  4527. delta = 0;
  4528. ++handledCPCount;
  4529. }
  4530. }
  4531. ++delta;
  4532. ++n;
  4533. }
  4534. return output.join('');
  4535. }
  4536. /**
  4537. * Converts a Punycode string representing a domain name or an email address
  4538. * to Unicode. Only the Punycoded parts of the input will be converted, i.e.
  4539. * it doesn't matter if you call it on a string that has already been
  4540. * converted to Unicode.
  4541. * @memberOf punycode
  4542. * @param {String} input The Punycoded domain name or email address to
  4543. * convert to Unicode.
  4544. * @returns {String} The Unicode representation of the given Punycode
  4545. * string.
  4546. */
  4547. function toUnicode(input) {
  4548. return mapDomain(input, function(string) {
  4549. return regexPunycode.test(string)
  4550. ? decode(string.slice(4).toLowerCase())
  4551. : string;
  4552. });
  4553. }
  4554. /**
  4555. * Converts a Unicode string representing a domain name or an email address to
  4556. * Punycode. Only the non-ASCII parts of the domain name will be converted,
  4557. * i.e. it doesn't matter if you call it with a domain that's already in
  4558. * ASCII.
  4559. * @memberOf punycode
  4560. * @param {String} input The domain name or email address to convert, as a
  4561. * Unicode string.
  4562. * @returns {String} The Punycode representation of the given domain name or
  4563. * email address.
  4564. */
  4565. function toASCII(input) {
  4566. return mapDomain(input, function(string) {
  4567. return regexNonASCII.test(string)
  4568. ? 'xn--' + encode(string)
  4569. : string;
  4570. });
  4571. }
  4572. /*--------------------------------------------------------------------------*/
  4573. /** Define the public API */
  4574. punycode = {
  4575. /**
  4576. * A string representing the current Punycode.js version number.
  4577. * @memberOf punycode
  4578. * @type String
  4579. */
  4580. 'version': '1.4.1',
  4581. /**
  4582. * An object of methods to convert from JavaScript's internal character
  4583. * representation (UCS-2) to Unicode code points, and back.
  4584. * @see <https://mathiasbynens.be/notes/javascript-encoding>
  4585. * @memberOf punycode
  4586. * @type Object
  4587. */
  4588. 'ucs2': {
  4589. 'decode': ucs2decode,
  4590. 'encode': ucs2encode
  4591. },
  4592. 'decode': decode,
  4593. 'encode': encode,
  4594. 'toASCII': toASCII,
  4595. 'toUnicode': toUnicode
  4596. };
  4597. /** Expose `punycode` */
  4598. // Some AMD build optimizers, like r.js, check for specific condition patterns
  4599. // like the following:
  4600. if (
  4601. typeof define == 'function' &&
  4602. typeof define.amd == 'object' &&
  4603. define.amd
  4604. ) {
  4605. define('punycode', function() {
  4606. return punycode;
  4607. });
  4608. } else if (freeExports && freeModule) {
  4609. if (module.exports == freeExports) {
  4610. // in Node.js, io.js, or RingoJS v0.8.0+
  4611. freeModule.exports = punycode;
  4612. } else {
  4613. // in Narwhal or RingoJS v0.7.0-
  4614. for (key in punycode) {
  4615. punycode.hasOwnProperty(key) && (freeExports[key] = punycode[key]);
  4616. }
  4617. }
  4618. } else {
  4619. // in Rhino or a web browser
  4620. root.punycode = punycode;
  4621. }
  4622. }(this));
  4623. }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
  4624. },{}],16:[function(require,module,exports){
  4625. // Copyright Joyent, Inc. and other Node contributors.
  4626. //
  4627. // Permission is hereby granted, free of charge, to any person obtaining a
  4628. // copy of this software and associated documentation files (the
  4629. // "Software"), to deal in the Software without restriction, including
  4630. // without limitation the rights to use, copy, modify, merge, publish,
  4631. // distribute, sublicense, and/or sell copies of the Software, and to permit
  4632. // persons to whom the Software is furnished to do so, subject to the
  4633. // following conditions:
  4634. //
  4635. // The above copyright notice and this permission notice shall be included
  4636. // in all copies or substantial portions of the Software.
  4637. //
  4638. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  4639. // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  4640. // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
  4641. // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
  4642. // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
  4643. // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
  4644. // USE OR OTHER DEALINGS IN THE SOFTWARE.
  4645. 'use strict';
  4646. // If obj.hasOwnProperty has been overridden, then calling
  4647. // obj.hasOwnProperty(prop) will break.
  4648. // See: https://github.com/joyent/node/issues/1707
  4649. function hasOwnProperty(obj, prop) {
  4650. return Object.prototype.hasOwnProperty.call(obj, prop);
  4651. }
  4652. module.exports = function(qs, sep, eq, options) {
  4653. sep = sep || '&';
  4654. eq = eq || '=';
  4655. var obj = {};
  4656. if (typeof qs !== 'string' || qs.length === 0) {
  4657. return obj;
  4658. }
  4659. var regexp = /\+/g;
  4660. qs = qs.split(sep);
  4661. var maxKeys = 1000;
  4662. if (options && typeof options.maxKeys === 'number') {
  4663. maxKeys = options.maxKeys;
  4664. }
  4665. var len = qs.length;
  4666. // maxKeys <= 0 means that we should not limit keys count
  4667. if (maxKeys > 0 && len > maxKeys) {
  4668. len = maxKeys;
  4669. }
  4670. for (var i = 0; i < len; ++i) {
  4671. var x = qs[i].replace(regexp, '%20'),
  4672. idx = x.indexOf(eq),
  4673. kstr, vstr, k, v;
  4674. if (idx >= 0) {
  4675. kstr = x.substr(0, idx);
  4676. vstr = x.substr(idx + 1);
  4677. } else {
  4678. kstr = x;
  4679. vstr = '';
  4680. }
  4681. k = decodeURIComponent(kstr);
  4682. v = decodeURIComponent(vstr);
  4683. if (!hasOwnProperty(obj, k)) {
  4684. obj[k] = v;
  4685. } else if (isArray(obj[k])) {
  4686. obj[k].push(v);
  4687. } else {
  4688. obj[k] = [obj[k], v];
  4689. }
  4690. }
  4691. return obj;
  4692. };
  4693. var isArray = Array.isArray || function (xs) {
  4694. return Object.prototype.toString.call(xs) === '[object Array]';
  4695. };
  4696. },{}],17:[function(require,module,exports){
  4697. // Copyright Joyent, Inc. and other Node contributors.
  4698. //
  4699. // Permission is hereby granted, free of charge, to any person obtaining a
  4700. // copy of this software and associated documentation files (the
  4701. // "Software"), to deal in the Software without restriction, including
  4702. // without limitation the rights to use, copy, modify, merge, publish,
  4703. // distribute, sublicense, and/or sell copies of the Software, and to permit
  4704. // persons to whom the Software is furnished to do so, subject to the
  4705. // following conditions:
  4706. //
  4707. // The above copyright notice and this permission notice shall be included
  4708. // in all copies or substantial portions of the Software.
  4709. //
  4710. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  4711. // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  4712. // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
  4713. // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
  4714. // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
  4715. // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
  4716. // USE OR OTHER DEALINGS IN THE SOFTWARE.
  4717. 'use strict';
  4718. var stringifyPrimitive = function(v) {
  4719. switch (typeof v) {
  4720. case 'string':
  4721. return v;
  4722. case 'boolean':
  4723. return v ? 'true' : 'false';
  4724. case 'number':
  4725. return isFinite(v) ? v : '';
  4726. default:
  4727. return '';
  4728. }
  4729. };
  4730. module.exports = function(obj, sep, eq, name) {
  4731. sep = sep || '&';
  4732. eq = eq || '=';
  4733. if (obj === null) {
  4734. obj = undefined;
  4735. }
  4736. if (typeof obj === 'object') {
  4737. return map(objectKeys(obj), function(k) {
  4738. var ks = encodeURIComponent(stringifyPrimitive(k)) + eq;
  4739. if (isArray(obj[k])) {
  4740. return map(obj[k], function(v) {
  4741. return ks + encodeURIComponent(stringifyPrimitive(v));
  4742. }).join(sep);
  4743. } else {
  4744. return ks + encodeURIComponent(stringifyPrimitive(obj[k]));
  4745. }
  4746. }).join(sep);
  4747. }
  4748. if (!name) return '';
  4749. return encodeURIComponent(stringifyPrimitive(name)) + eq +
  4750. encodeURIComponent(stringifyPrimitive(obj));
  4751. };
  4752. var isArray = Array.isArray || function (xs) {
  4753. return Object.prototype.toString.call(xs) === '[object Array]';
  4754. };
  4755. function map (xs, f) {
  4756. if (xs.map) return xs.map(f);
  4757. var res = [];
  4758. for (var i = 0; i < xs.length; i++) {
  4759. res.push(f(xs[i], i));
  4760. }
  4761. return res;
  4762. }
  4763. var objectKeys = Object.keys || function (obj) {
  4764. var res = [];
  4765. for (var key in obj) {
  4766. if (Object.prototype.hasOwnProperty.call(obj, key)) res.push(key);
  4767. }
  4768. return res;
  4769. };
  4770. },{}],18:[function(require,module,exports){
  4771. 'use strict';
  4772. exports.decode = exports.parse = require('./decode');
  4773. exports.encode = exports.stringify = require('./encode');
  4774. },{"./decode":16,"./encode":17}],"android-platform-core-handlers":[function(require,module,exports){
  4775. // Copyright (c) Microsoft Corporation. All rights reserved.
  4776. module.exports = {
  4777. 'CoreAndroid': {
  4778. 'backHistory': function (success, fail, service, action, args) {
  4779. window.history.go(-1);
  4780. success && success();
  4781. }
  4782. }
  4783. };
  4784. },{}],"argscheck":[function(require,module,exports){
  4785. // Copyright (c) Microsoft Corporation. All rights reserved.
  4786. // Based in part on code from Apache Cordova (https://github.com/apache/cordova-js)
  4787. var utils = require('utils');
  4788. var moduleExports = module.exports;
  4789. var typeMap = {
  4790. 'A': 'Array',
  4791. 'D': 'Date',
  4792. 'N': 'Number',
  4793. 'S': 'String',
  4794. 'F': 'Function',
  4795. 'O': 'Object'
  4796. };
  4797. function extractParamName(callee, argIndex) {
  4798. return (/.*?\((.*?)\)/).exec(callee)[1].split(', ')[argIndex];
  4799. }
  4800. function checkArgs(spec, functionName, args, opt_callee) {
  4801. if (!moduleExports.enableChecks) {
  4802. return;
  4803. }
  4804. var errMsg = null;
  4805. var typeName;
  4806. for (var i = 0; i < spec.length; ++i) {
  4807. var c = spec.charAt(i),
  4808. cUpper = c.toUpperCase(),
  4809. arg = args[i];
  4810. // Asterix means allow anything.
  4811. if (c == '*') {
  4812. continue;
  4813. }
  4814. typeName = utils.typeName(arg);
  4815. if ((arg === null || arg === undefined) && c == cUpper) {
  4816. continue;
  4817. }
  4818. if (typeName != typeMap[cUpper]) {
  4819. errMsg = 'Expected ' + typeMap[cUpper];
  4820. break;
  4821. }
  4822. }
  4823. if (errMsg) {
  4824. errMsg += ', but got ' + typeName + '.';
  4825. errMsg = 'Wrong type for parameter "' + extractParamName(opt_callee || args.callee, i) + '" of ' + functionName + ': ' + errMsg;
  4826. throw TypeError(errMsg);
  4827. }
  4828. }
  4829. function getValue(value, defaultValue) {
  4830. return value === undefined ? defaultValue : value;
  4831. }
  4832. moduleExports.checkArgs = checkArgs;
  4833. moduleExports.getValue = getValue;
  4834. moduleExports.enableChecks = true;
  4835. },{"utils":"utils"}],"cordova-plugin-camera-handlers":[function(require,module,exports){
  4836. // Copyright (c) Microsoft Corporation. All rights reserved.
  4837. module.exports = function (messages) {
  4838. return {
  4839. Camera: {
  4840. takePicture: function (success, fail, args) {
  4841. messages.call('takePicture', args).then(function (result) {
  4842. if (args && args[1] === 0) {
  4843. /* Destination type is DATA_URL */
  4844. success(result);
  4845. } else {
  4846. // 'result' should be {data: <ArrayBuffer>, type: <mimeType>}, from which we'll create a blob
  4847. var blob = new Blob([result.data], { type: result.type });
  4848. success(URL.createObjectURL(blob));
  4849. }
  4850. }, function (error) {
  4851. fail(error);
  4852. });
  4853. }
  4854. }
  4855. };
  4856. };
  4857. },{}],"cordova-plugin-device":[function(require,module,exports){
  4858. // Copyright (c) Microsoft Corporation. All rights reserved.
  4859. module.exports = function(messages) {
  4860. messages.register('cordova-version', function (callback) {
  4861. if (window.cordova) {
  4862. callback(null, window.cordova.version);
  4863. } else {
  4864. callback(null, 'You must have cordova.js included in your projects, to be able to get cordova version');
  4865. }
  4866. });
  4867. };
  4868. },{}],"cordova-plugin-file-handlers":[function(require,module,exports){
  4869. // Copyright (c) Microsoft Corporation. All rights reserved.
  4870. module.exports = function (messages) {
  4871. var isWebkit = window.webkitRequestFileSystem && window.webkitResolveLocalFileSystemURL;
  4872. return isWebkit ? require('./app-host-webkit-handlers') : require('./app-host-non-webkit-handlers');
  4873. };
  4874. },{"./app-host-non-webkit-handlers":8,"./app-host-webkit-handlers":9}],"cordova-plugin-geolocation-clobbers":[function(require,module,exports){
  4875. // Copyright (c) Microsoft Corporation. All rights reserved.
  4876. // Based on Apache Cordova geolocation plugin's navigator.geolocation implementation.
  4877. // See https://github.com/apache/cordova-plugin-geolocation/blob/master/www/geolocation.js
  4878. var utils = require('utils'),
  4879. PositionError = require('./PositionError'),
  4880. Position = require('./Position');
  4881. var timers = {}; // list of timers in use
  4882. // Returns default params, overrides if provided with values
  4883. function parseParameters(options) {
  4884. var opt = {
  4885. maximumAge: 0,
  4886. enableHighAccuracy: false,
  4887. timeout: Infinity
  4888. };
  4889. if (options) {
  4890. if (options.maximumAge !== undefined && !isNaN(options.maximumAge) && options.maximumAge > 0) {
  4891. opt.maximumAge = options.maximumAge;
  4892. }
  4893. if (options.enableHighAccuracy !== undefined) {
  4894. opt.enableHighAccuracy = options.enableHighAccuracy;
  4895. }
  4896. if (options.timeout !== undefined && !isNaN(options.timeout)) {
  4897. if (options.timeout < 0) {
  4898. opt.timeout = 0;
  4899. } else {
  4900. opt.timeout = options.timeout;
  4901. }
  4902. }
  4903. }
  4904. return opt;
  4905. }
  4906. // Returns a timeout failure, closed over a specified timeout value and error callback.
  4907. function createTimeout(errorCallback, timeout) {
  4908. var t = setTimeout(function () {
  4909. clearTimeout(t);
  4910. t = null;
  4911. errorCallback({
  4912. code: PositionError.TIMEOUT,
  4913. message: 'Position retrieval timed out.'
  4914. });
  4915. }, timeout);
  4916. return t;
  4917. }
  4918. module.exports = function (messages, exec) {
  4919. var geolocation = {
  4920. lastPosition: null, // reference to last known (cached) position returned
  4921. /**
  4922. * Asynchronously acquires the current position.
  4923. *
  4924. * @param {Function} successCallback The function to call when the position data is available
  4925. * @param {Function} errorCallback The function to call when there is an error getting the heading position. (OPTIONAL)
  4926. * @param {PositionOptions} options The options for getting the position data. (OPTIONAL)
  4927. */
  4928. getCurrentPosition: function (successCallback, errorCallback, options) {
  4929. options = parseParameters(options);
  4930. // Timer var that will fire an error callback if no position is retrieved from native
  4931. // before the "timeout" param provided expires
  4932. var timeoutTimer = {timer: null};
  4933. var win = function (p) {
  4934. clearTimeout(timeoutTimer.timer);
  4935. if (!(timeoutTimer.timer)) {
  4936. // Timeout already happened, or native fired error callback for
  4937. // this geo request.
  4938. // Don't continue with success callback.
  4939. return;
  4940. }
  4941. var pos = new Position(
  4942. {
  4943. latitude: p.latitude,
  4944. longitude: p.longitude,
  4945. altitude: p.altitude,
  4946. accuracy: p.accuracy,
  4947. heading: p.heading,
  4948. velocity: p.velocity,
  4949. altitudeAccuracy: p.altitudeAccuracy
  4950. },
  4951. (p.timestamp === undefined ? new Date() : ((p.timestamp instanceof Date) ? p.timestamp : new Date(p.timestamp)))
  4952. );
  4953. geolocation.lastPosition = pos;
  4954. successCallback(pos);
  4955. };
  4956. var fail = function (e) {
  4957. clearTimeout(timeoutTimer.timer);
  4958. timeoutTimer.timer = null;
  4959. var err = new PositionError(e.code, e.message);
  4960. if (errorCallback) {
  4961. errorCallback(err);
  4962. }
  4963. };
  4964. // Check our cached position, if its timestamp difference with current time is less than the maximumAge, then just
  4965. // fire the success callback with the cached position.
  4966. if (geolocation.lastPosition && options.maximumAge && (((new Date()).getTime() - geolocation.lastPosition.timestamp.getTime()) <= options.maximumAge)) {
  4967. successCallback(geolocation.lastPosition);
  4968. // If the cached position check failed and the timeout was set to 0, error out with a TIMEOUT error object.
  4969. } else if (options.timeout === 0) {
  4970. fail({
  4971. code: PositionError.TIMEOUT,
  4972. message: 'timeout value in PositionOptions set to 0 and no cached Position object available, or cached Position object\'s age exceeds provided PositionOptions.maximumAge parameter.'
  4973. });
  4974. // Otherwise we have to call into native to retrieve a position.
  4975. } else {
  4976. if (options.timeout !== Infinity) {
  4977. // If the timeout value was not set to Infinity (default), then
  4978. // set up a timeout function that will fire the error callback
  4979. // if no successful position was retrieved before timeout expired.
  4980. timeoutTimer.timer = createTimeout(fail, options.timeout);
  4981. } else {
  4982. // This is here so the check in the win function doesn't mess stuff up
  4983. // may seem weird but this guarantees timeoutTimer is
  4984. // always truthy before we call into native
  4985. timeoutTimer.timer = true;
  4986. }
  4987. exec(win, fail, 'Geolocation', 'getLocation', [options.enableHighAccuracy, options.maximumAge]);
  4988. }
  4989. return timeoutTimer;
  4990. },
  4991. /**
  4992. * Asynchronously watches the geolocation for changes to geolocation. When a change occurs,
  4993. * the successCallback is called with the new location.
  4994. *
  4995. * @param {Function} successCallback The function to call each time the location data is available
  4996. * @param {Function} errorCallback The function to call when there is an error getting the location data. (OPTIONAL)
  4997. * @param {PositionOptions} options The options for getting the location data such as frequency. (OPTIONAL)
  4998. * @return String The watch id that must be passed to #clearWatch to stop watching.
  4999. */
  5000. watchPosition: function (successCallback, errorCallback, options) {
  5001. options = parseParameters(options);
  5002. var id = utils.createUUID();
  5003. // Tell device to get a position ASAP, and also retrieve a reference to the timeout timer generated in getCurrentPosition
  5004. timers[id] = geolocation.getCurrentPosition(successCallback, errorCallback, options);
  5005. var fail = function (e) {
  5006. clearTimeout(timers[id].timer);
  5007. var err = new PositionError(e.code, e.message);
  5008. if (errorCallback) {
  5009. errorCallback(err);
  5010. }
  5011. };
  5012. var win = function (p) {
  5013. clearTimeout(timers[id].timer);
  5014. if (options.timeout !== Infinity) {
  5015. timers[id].timer = createTimeout(fail, options.timeout);
  5016. }
  5017. var pos = new Position(
  5018. {
  5019. latitude: p.latitude,
  5020. longitude: p.longitude,
  5021. altitude: p.altitude,
  5022. accuracy: p.accuracy,
  5023. heading: p.heading,
  5024. velocity: p.velocity,
  5025. altitudeAccuracy: p.altitudeAccuracy
  5026. },
  5027. (p.timestamp === undefined ? new Date() : ((p.timestamp instanceof Date) ? p.timestamp : new Date(p.timestamp)))
  5028. );
  5029. geolocation.lastPosition = pos;
  5030. successCallback(pos);
  5031. };
  5032. exec(win, fail, 'Geolocation', 'addWatch', [id, options.enableHighAccuracy]);
  5033. return id;
  5034. },
  5035. /**
  5036. * Clears the specified heading watch.
  5037. *
  5038. * @param {String} id The ID of the watch returned from #watchPosition
  5039. */
  5040. clearWatch: function (id) {
  5041. if (id && timers[id] !== undefined) {
  5042. clearTimeout(timers[id].timer);
  5043. timers[id].timer = false;
  5044. exec(null, null, 'Geolocation', 'clearWatch', [id]);
  5045. }
  5046. },
  5047. getPermission: function (success, fail, args) {
  5048. success();
  5049. }
  5050. };
  5051. return {
  5052. navigator: {
  5053. geolocation: geolocation
  5054. }
  5055. };
  5056. };
  5057. },{"./Position":12,"./PositionError":13,"utils":"utils"}],"db":[function(require,module,exports){
  5058. // Copyright (c) Microsoft Corporation. All rights reserved.
  5059. // Based in part on code from Apache Ripple, https://github.com/apache/incubator-ripple
  5060. var Q = require('q'),
  5061. utils = require('utils'),
  5062. constants = require('sim-constants'),
  5063. event = require('event'),
  5064. DB_NAME = 'ripple',
  5065. cache,
  5066. self,
  5067. opendb;
  5068. // TODO: This could use some refactoring..
  5069. function saveToStorage() {
  5070. localStorage[DB_NAME] = JSON.stringify(cache);
  5071. }
  5072. function validateAndSetPrefix(prefix) {
  5073. if (prefix) {
  5074. utils.validateArgumentType(prefix, 'string');
  5075. }
  5076. return prefix || constants.COMMON.PREFIX;
  5077. }
  5078. function createKey(key, prefix) {
  5079. return validateAndSetPrefix(prefix) + key;
  5080. }
  5081. function createItem(key, value, prefix) {
  5082. return {
  5083. id: createKey(key, prefix),
  5084. key: key,
  5085. value: value,
  5086. prefix: validateAndSetPrefix(prefix)
  5087. };
  5088. }
  5089. function save(key, value, prefix, callback) {
  5090. var item = createItem(key, value, prefix);
  5091. cache[item.id] = item;
  5092. if (!window.openDatabase) {
  5093. saveToStorage();
  5094. if (callback) { callback(); }
  5095. } else {
  5096. opendb.transaction(function (tx) {
  5097. tx.executeSql('REPLACE INTO persistence (id, key, value, prefix) VALUES (?, ?, ?, ?)', [item.id, item.key, item.value, item.prefix], function () {
  5098. return callback && callback();
  5099. });
  5100. });
  5101. }
  5102. }
  5103. function retrieve(key, prefix) {
  5104. var item = cache[createKey(key, prefix)];
  5105. return item ? item.value : undefined;
  5106. }
  5107. function retrieveAll(prefix, callback) {
  5108. var result = {};
  5109. if (prefix) {
  5110. utils.forEach(cache, function (value) {
  5111. if (value.prefix === prefix) {
  5112. result[value.key] = value.value;
  5113. }
  5114. });
  5115. }
  5116. if (callback) { callback(result); }
  5117. }
  5118. function remove(key, prefix, callback) {
  5119. var id = createKey(key, prefix);
  5120. delete cache[id];
  5121. if (!window.openDatabase) {
  5122. saveToStorage();
  5123. if (callback) { callback(); }
  5124. } else {
  5125. opendb.transaction(function (tx) {
  5126. tx.executeSql('DELETE FROM persistence WHERE key = ? AND prefix = ?', [key, validateAndSetPrefix(prefix)], function () {
  5127. return callback && callback();
  5128. });
  5129. });
  5130. }
  5131. }
  5132. function removeAll(callback) {
  5133. cache = {};
  5134. if (!window.openDatabase) {
  5135. delete localStorage[DB_NAME];
  5136. saveToStorage();
  5137. } else {
  5138. opendb.transaction(function (tx) {
  5139. tx.executeSql('DELETE FROM persistence', [], function () {
  5140. return callback && callback();
  5141. });
  5142. });
  5143. }
  5144. }
  5145. self = {
  5146. save: function (key, value, prefix, callback) {
  5147. save(key, value, prefix, callback);
  5148. event.trigger('StorageUpdatedEvent');
  5149. },
  5150. saveObject: function (key, obj, prefix, callback) {
  5151. save(key, JSON.stringify(obj), prefix, callback);
  5152. event.trigger('StorageUpdatedEvent');
  5153. },
  5154. retrieve: function (key, prefix) {
  5155. return retrieve(key, prefix);
  5156. },
  5157. retrieveObject: function (key, prefix) {
  5158. var retrievedValue = retrieve(key, prefix);
  5159. return retrievedValue ? JSON.parse(retrievedValue) : retrievedValue;
  5160. },
  5161. retrieveAll: function (prefix, callback) {
  5162. return retrieveAll(prefix, callback);
  5163. },
  5164. remove: function (key, prefix, callback) {
  5165. event.trigger('StorageUpdatedEvent');
  5166. remove(key, prefix, callback);
  5167. },
  5168. removeAll: function (callback) {
  5169. removeAll(callback);
  5170. event.trigger('StorageUpdatedEvent');
  5171. },
  5172. initialize: function () {
  5173. var d = Q.defer();
  5174. if (!window.openDatabase) {
  5175. var store = localStorage[DB_NAME];
  5176. cache = store ? JSON.parse(store) : {};
  5177. saveToStorage();
  5178. d.resolve();
  5179. } else {
  5180. cache = {};
  5181. opendb = openDatabase('tinyHippos', '1.0', 'tiny Hippos persistence', 2 * 1024 * 1024);
  5182. opendb.transaction(function (tx) {
  5183. tx.executeSql('CREATE TABLE IF NOT EXISTS persistence (id unique, key, value, prefix)');
  5184. tx.executeSql('SELECT id, key, value, prefix FROM persistence', [], function (tx, results) {
  5185. var len = results.rows.length, i, item;
  5186. for (i = 0; i < len; i++) {
  5187. item = results.rows.item(i);
  5188. cache[item.id] = item;
  5189. }
  5190. d.resolve();
  5191. });
  5192. });
  5193. }
  5194. return d.promise;
  5195. }
  5196. };
  5197. module.exports = self;
  5198. },{"event":"event","q":1,"sim-constants":"sim-constants","utils":"utils"}],"events":[function(require,module,exports){
  5199. // Copyright (c) Microsoft Corporation. All rights reserved.
  5200. module.exports = function(messages) {
  5201. messages.register('event', function (event, callback) {
  5202. if (!window.cordova) {
  5203. callback(null, 'You must have cordova.js included in your projects, to be able to trigger events');
  5204. } else {
  5205. try {
  5206. window.cordova.fireDocumentEvent(event);
  5207. callback(null, event);
  5208. } catch (e) {
  5209. callback(e);
  5210. }
  5211. }
  5212. });
  5213. };
  5214. },{}],"event":[function(require,module,exports){
  5215. // Copyright (c) Microsoft Corporation. All rights reserved.
  5216. // Based in part on code from Apache Ripple, https://github.com/apache/incubator-ripple
  5217. var utils = require('utils'),
  5218. exception = require('exception'),
  5219. _listeners = {};
  5220. function _on(eventType, listener, scope, once) {
  5221. if (!eventType) {
  5222. throw 'eventType must be truthy';
  5223. }
  5224. _listeners[eventType] = _listeners[eventType] || [];
  5225. _listeners[eventType].push({
  5226. func: listener,
  5227. scope: scope,
  5228. once: !!once
  5229. });
  5230. }
  5231. function _trigger(listener, args, sync) {
  5232. try {
  5233. if (sync) {
  5234. listener.func.apply(listener.scope, args);
  5235. }
  5236. else {
  5237. setTimeout(function () {
  5238. listener.func.apply(listener.scope, args);
  5239. }, 1);
  5240. }
  5241. }
  5242. catch (e) {
  5243. exception.handle(e);
  5244. }
  5245. }
  5246. module.exports = {
  5247. on: function (eventType, listener, scope) {
  5248. _on(eventType, listener, scope, false);
  5249. },
  5250. once: function (eventType, listener, scope) {
  5251. _on(eventType, listener, scope, true);
  5252. },
  5253. trigger: function (eventType, args, sync) {
  5254. args = args || [];
  5255. sync = sync || false;
  5256. var listeners = _listeners[eventType];
  5257. if (listeners) {
  5258. listeners.forEach(function (listener) {
  5259. _trigger(listener, args, sync);
  5260. });
  5261. _listeners[eventType] = listeners.filter(function (listener) {
  5262. return !listener.once;
  5263. });
  5264. }
  5265. },
  5266. eventHasSubscriber: function (eventType) {
  5267. return !!_listeners[eventType];
  5268. },
  5269. getEventSubscribers: function (eventType) {
  5270. return utils.copy(_listeners[eventType]) || [];
  5271. },
  5272. clear: function (eventType) {
  5273. if (eventType) {
  5274. delete _listeners[eventType];
  5275. }
  5276. }
  5277. };
  5278. },{"exception":"exception","utils":"utils"}],"exception":[function(require,module,exports){
  5279. // Copyright (c) Microsoft Corporation. All rights reserved.
  5280. // Based in part on code from Apache Ripple, https://github.com/apache/incubator-ripple
  5281. function _getStack(depth) {
  5282. var caller,
  5283. stack = '',
  5284. count = 0;
  5285. try {
  5286. /*jshint noarg:false*/ // THIS SHOULD NOT be a common occurrence..
  5287. caller = arguments.callee.caller.arguments.callee.caller;
  5288. while (count <= depth && caller) {
  5289. stack += 'function: ' + caller.toString().match(/function\s?(.*)\{/)[1] + '\n';
  5290. caller = caller.arguments.callee.caller;
  5291. count++;
  5292. }
  5293. } catch (e) {
  5294. stack = 'failed to determine stack trace (' + (e.name || e.type) + ' :: ' + e.message + ')';
  5295. }
  5296. return stack;
  5297. }
  5298. module.exports = {
  5299. types: {
  5300. Application: 'Application',
  5301. ArgumentLength: 'ArgumentLength',
  5302. ArgumentType: 'ArgumentType',
  5303. Argument: 'Argument',
  5304. NotificationType: 'NotificationType',
  5305. NotificationStateType: 'NotificationStateType',
  5306. DomObjectNotFound: 'DomObjectNotFound',
  5307. LayoutType: 'LayoutType',
  5308. DeviceNotFound: 'DeviceNotFound',
  5309. tinyHipposMaskedException: 'tinyHipposMaskedException',
  5310. Geo: 'Geo',
  5311. Accelerometer: 'Accelerometer',
  5312. MethodNotImplemented: 'MethodNotImplemented',
  5313. InvalidState: 'InvalidState',
  5314. ApplicationState: 'ApplicationState'
  5315. },
  5316. handle: function handle(exception, reThrow) {
  5317. reThrow = reThrow || false;
  5318. var eMsg = exception.message || 'exception caught!',
  5319. msg = eMsg + '\n\n' + (exception.stack || '*no stack provided*') + '\n\n';
  5320. console.error(msg);
  5321. if (reThrow) {
  5322. throw exception;
  5323. }
  5324. },
  5325. raise: function raise(exceptionType, message, customExceptionObject) {
  5326. var obj = customExceptionObject || {
  5327. type: '',
  5328. message: '',
  5329. toString: function () {
  5330. var result = this.name + ': \'' + this.message + '\'';
  5331. if (this.stack) {
  5332. result += '\n' + this.stack;
  5333. }
  5334. return result;
  5335. }
  5336. };
  5337. message = message || '';
  5338. obj.name = exceptionType;
  5339. obj.type = exceptionType;
  5340. // TODO: include the exception objects original message if exists
  5341. obj.message = message;
  5342. obj.stack = _getStack(5);
  5343. throw obj;
  5344. }
  5345. };
  5346. },{}],"jquery.min":[function(require,module,exports){
  5347. /*! jQuery v2.1.4 | (c) 2005, 2015 jQuery Foundation, Inc. | jquery.org/license */
  5348. !function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l=a.document,m="2.1.4",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return n.each(this,a,b)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(n.isPlainObject(d)||(e=n.isArray(d)))?(e?(e=!1,f=c&&n.isArray(c)?c:[]):f=c&&n.isPlainObject(c)?c:{},g[b]=n.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){return!n.isArray(a)&&a-parseFloat(a)+1>=0},isPlainObject:function(a){return"object"!==n.type(a)||a.nodeType||n.isWindow(a)?!1:a.constructor&&!j.call(a.constructor.prototype,"isPrototypeOf")?!1:!0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(a){var b,c=eval;a=n.trim(a),a&&(1===a.indexOf("use strict")?(b=l.createElement("script"),b.text=a,l.head.appendChild(b).parentNode.removeChild(b)):c(a))},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=s(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:g.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;c>d;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=s(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(c=a[b],b=a,a=c),n.isFunction(a)?(e=d.call(arguments,2),f=function(){return a.apply(b||this,e.concat(d.call(arguments)))},f.guid=a.guid=a.guid||n.guid++,f):void 0},now:Date.now,support:k}),n.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function s(a){var b="length"in a&&a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N=M.replace("w","w#"),O="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+N+"))|)"+L+"*\\]",P=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+O+")*)|.*)\\)|)",Q=new RegExp(L+"+","g"),R=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),S=new RegExp("^"+L+"*,"+L+"*"),T=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),U=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),V=new RegExp(P),W=new RegExp("^"+N+"$"),X={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M.replace("w","w*")+")"),ATTR:new RegExp("^"+O),PSEUDO:new RegExp("^"+P),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,aa=/[+~]/,ba=/'|\\/g,ca=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),da=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ea=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(fa){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],k=b.nodeType,"string"!=typeof a||!a||1!==k&&9!==k&&11!==k)return d;if(!e&&p){if(11!==k&&(f=_.exec(a)))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return H.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName)return H.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=1!==k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(ba,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+ra(o[l]);w=aa.test(a)&&pa(b.parentNode)||b,x=o.join(",")}if(x)try{return H.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function pa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=g.documentElement,e=g.defaultView,e&&e!==e.top&&(e.addEventListener?e.addEventListener("unload",ea,!1):e.attachEvent&&e.attachEvent("onunload",ea)),p=!f(g),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(g.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(g.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!g.getElementsByName||!g.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(g.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="<a id='"+u+"'></a><select id='"+u+"-\f]' msallowcapture=''><option selected=''></option></select>",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){var b=g.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",P)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===g||a.ownerDocument===v&&t(v,a)?-1:b===g||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,h=[a],i=[b];if(!e||!f)return a===g?-1:b===g?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?la(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},g):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ca,da),a[3]=(a[3]||a[4]||a[5]||"").replace(ca,da),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ca,da).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(Q," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(ca,da),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return W.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(ca,da).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:oa(function(){return[0]}),last:oa(function(a,b){return[b-1]}),eq:oa(function(a,b,c){return[0>c?c+b:c]}),even:oa(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:oa(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:oa(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:oa(function(a,b,c){for(var d=0>c?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=ma(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=na(b);function qa(){}qa.prototype=d.filters=d.pseudos,d.setFilters=new qa,g=ga.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){(!c||(e=S.exec(h)))&&(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=T.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(R," ")}),h=h.slice(c.length));for(g in d.filter)!(e=X[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?ga.error(a):z(a,i).slice(0)};function ra(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}function sa(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function ta(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ua(a,b,c){for(var d=0,e=b.length;e>d;d++)ga(a,b[d],c);return c}function va(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function wa(a,b,c,d,e,f){return d&&!d[u]&&(d=wa(d)),e&&!e[u]&&(e=wa(e,f)),ia(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ua(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:va(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=va(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=va(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function xa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=sa(function(a){return a===b},h,!0),l=sa(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[sa(ta(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return wa(i>1&&ta(m),i>1&&ra(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&xa(a.slice(i,e)),f>e&&xa(a=a.slice(e)),f>e&&ra(a))}m.push(c)}return ta(m)}function ya(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=F.call(i));s=va(s)}H.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&ga.uniqueSort(i)}return k&&(w=v,j=t),r};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=xa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,ya(e,d)),f.selector=a}return f},i=ga.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ca,da),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ca,da),aa.test(j[0].type)&&pa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&ra(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,aa.test(a)&&pa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ja(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=n.expr.match.needsContext,v=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,w=/^.[^:#\[\.,]*$/;function x(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(w.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return g.call(b,a)>=0!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=this.length,d=[],e=this;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;c>b;b++)if(n.contains(e[b],this))return!0}));for(b=0;c>b;b++)n.find(a,e[b],d);return d=this.pushStack(c>1?n.unique(d):d),d.selector=this.selector?this.selector+" "+a:a,d},filter:function(a){return this.pushStack(x(this,a||[],!1))},not:function(a){return this.pushStack(x(this,a||[],!0))},is:function(a){return!!x(this,"string"==typeof a&&u.test(a)?n(a):a||[],!1).length}});var y,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=n.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||y).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:l,!0)),v.test(c[1])&&n.isPlainObject(b))for(c in b)n.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}return d=l.getElementById(c[2]),d&&d.parentNode&&(this.length=1,this[0]=d),this.context=l,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?"undefined"!=typeof y.ready?y.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};A.prototype=n.fn,y=n(l);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};n.extend({dir:function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&n(a).is(c))break;d.push(a)}return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),n.fn.extend({has:function(a){var b=n(a,this),c=b.length;return this.filter(function(){for(var a=0;c>a;a++)if(n.contains(this,b[a]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=u.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.unique(f):f)},index:function(a){return a?"string"==typeof a?g.call(n(a),this[0]):g.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.unique(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){while((a=a[b])&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return n.dir(a,"parentNode")},parentsUntil:function(a,b,c){return n.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return n.dir(a,"nextSibling")},prevAll:function(a){return n.dir(a,"previousSibling")},nextUntil:function(a,b,c){return n.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return n.dir(a,"previousSibling",c)},siblings:function(a){return n.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return n.sibling(a.firstChild)},contents:function(a){return a.contentDocument||n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(C[a]||n.unique(e),B.test(a)&&e.reverse()),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return n.each(a.match(E)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):n.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(b=a.memory&&l,c=!0,g=e||0,e=0,f=h.length,d=!0;h&&f>g;g++)if(h[g].apply(l[0],l[1])===!1&&a.stopOnFalse){b=!1;break}d=!1,h&&(i?i.length&&j(i.shift()):b?h=[]:k.disable())},k={add:function(){if(h){var c=h.length;!function g(b){n.each(b,function(b,c){var d=n.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&g(c)})}(arguments),d?f=h.length:b&&(e=c,j(b))}return this},remove:function(){return h&&n.each(arguments,function(a,b){var c;while((c=n.inArray(b,h,c))>-1)h.splice(c,1),d&&(f>=c&&f--,g>=c&&g--)}),this},has:function(a){return a?n.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],f=0,this},disable:function(){return h=i=b=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,b||k.disable(),this},locked:function(){return!i},fireWith:function(a,b){return!h||c&&!i||(b=b||[],b=[a,b.slice?b.slice():b],d?i.push(b):j(b)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!c}};return k},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&n.isFunction(a.promise)?e:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){(a===!0?--n.readyWait:n.isReady)||(n.isReady=!0,a!==!0&&--n.readyWait>0||(H.resolveWith(l,[n]),n.fn.triggerHandler&&(n(l).triggerHandler("ready"),n(l).off("ready"))))}});function I(){l.removeEventListener("DOMContentLoaded",I,!1),a.removeEventListener("load",I,!1),n.ready()}n.ready.promise=function(b){return H||(H=n.Deferred(),"complete"===l.readyState?setTimeout(n.ready):(l.addEventListener("DOMContentLoaded",I,!1),a.addEventListener("load",I,!1))),H.promise(b)},n.ready.promise();var J=n.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===n.type(c)){e=!0;for(h in c)n.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,n.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(n(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f};n.acceptData=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function K(){Object.defineProperty(this.cache={},0,{get:function(){return{}}}),this.expando=n.expando+K.uid++}K.uid=1,K.accepts=n.acceptData,K.prototype={key:function(a){if(!K.accepts(a))return 0;var b={},c=a[this.expando];if(!c){c=K.uid++;try{b[this.expando]={value:c},Object.defineProperties(a,b)}catch(d){b[this.expando]=c,n.extend(a,b)}}return this.cache[c]||(this.cache[c]={}),c},set:function(a,b,c){var d,e=this.key(a),f=this.cache[e];if("string"==typeof b)f[b]=c;else if(n.isEmptyObject(f))n.extend(this.cache[e],b);else for(d in b)f[d]=b[d];return f},get:function(a,b){var c=this.cache[this.key(a)];return void 0===b?c:c[b]},access:function(a,b,c){var d;return void 0===b||b&&"string"==typeof b&&void 0===c?(d=this.get(a,b),void 0!==d?d:this.get(a,n.camelCase(b))):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d,e,f=this.key(a),g=this.cache[f];if(void 0===b)this.cache[f]={};else{n.isArray(b)?d=b.concat(b.map(n.camelCase)):(e=n.camelCase(b),b in g?d=[b,e]:(d=e,d=d in g?[d]:d.match(E)||[])),c=d.length;while(c--)delete g[d[c]]}},hasData:function(a){return!n.isEmptyObject(this.cache[a[this.expando]]||{})},discard:function(a){a[this.expando]&&delete this.cache[a[this.expando]]}};var L=new K,M=new K,N=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,O=/([A-Z])/g;function P(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(O,"-$1").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:N.test(c)?n.parseJSON(c):c}catch(e){}M.set(a,b,c)}else c=void 0;return c}n.extend({hasData:function(a){return M.hasData(a)||L.hasData(a)},data:function(a,b,c){
  5349. return M.access(a,b,c)},removeData:function(a,b){M.remove(a,b)},_data:function(a,b,c){return L.access(a,b,c)},_removeData:function(a,b){L.remove(a,b)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=M.get(f),1===f.nodeType&&!L.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),P(f,d,e[d])));L.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){M.set(this,a)}):J(this,function(b){var c,d=n.camelCase(a);if(f&&void 0===b){if(c=M.get(f,a),void 0!==c)return c;if(c=M.get(f,d),void 0!==c)return c;if(c=P(f,d,void 0),void 0!==c)return c}else this.each(function(){var c=M.get(this,d);M.set(this,d,b),-1!==a.indexOf("-")&&void 0!==c&&M.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){M.remove(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=L.get(a,b),c&&(!d||n.isArray(c)?d=L.access(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return L.get(a,c)||L.access(a,c,{empty:n.Callbacks("once memory").add(function(){L.remove(a,[b+"queue",c])})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?n.queue(this[0],a):void 0===b?this:this.each(function(){var c=n.queue(this,a,b);n._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&n.dequeue(this,a)})},dequeue:function(a){return this.each(function(){n.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=n.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=L.get(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var Q=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,R=["Top","Right","Bottom","Left"],S=function(a,b){return a=b||a,"none"===n.css(a,"display")||!n.contains(a.ownerDocument,a)},T=/^(?:checkbox|radio)$/i;!function(){var a=l.createDocumentFragment(),b=a.appendChild(l.createElement("div")),c=l.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="<textarea>x</textarea>",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var U="undefined";k.focusinBubbles="onfocusin"in a;var V=/^key/,W=/^(?:mouse|pointer|contextmenu)|click/,X=/^(?:focusinfocus|focusoutblur)$/,Y=/^([^.]*)(?:\.(.+)|)$/;function Z(){return!0}function $(){return!1}function _(){try{return l.activeElement}catch(a){}}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=L.get(a);if(r){c.handler&&(f=c,c=f.handler,e=f.selector),c.guid||(c.guid=n.guid++),(i=r.events)||(i=r.events={}),(g=r.handle)||(g=r.handle=function(b){return typeof n!==U&&n.event.triggered!==b.type?n.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(E)||[""],j=b.length;while(j--)h=Y.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o&&(l=n.event.special[o]||{},o=(e?l.delegateType:l.bindType)||o,l=n.event.special[o]||{},k=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},f),(m=i[o])||(m=i[o]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,p,g)!==!1||a.addEventListener&&a.addEventListener(o,g,!1)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),n.event.global[o]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=L.hasData(a)&&L.get(a);if(r&&(i=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=Y.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=i[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&q!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete i[o])}else for(o in i)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(i)&&(delete r.handle,L.remove(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,m,o,p=[d||l],q=j.call(b,"type")?b.type:b,r=j.call(b,"namespace")?b.namespace.split("."):[];if(g=h=d=d||l,3!==d.nodeType&&8!==d.nodeType&&!X.test(q+n.event.triggered)&&(q.indexOf(".")>=0&&(r=q.split("."),q=r.shift(),r.sort()),k=q.indexOf(":")<0&&"on"+q,b=b[n.expando]?b:new n.Event(q,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=r.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+r.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:n.makeArray(c,[b]),o=n.event.special[q]||{},e||!o.trigger||o.trigger.apply(d,c)!==!1)){if(!e&&!o.noBubble&&!n.isWindow(d)){for(i=o.delegateType||q,X.test(i+q)||(g=g.parentNode);g;g=g.parentNode)p.push(g),h=g;h===(d.ownerDocument||l)&&p.push(h.defaultView||h.parentWindow||a)}f=0;while((g=p[f++])&&!b.isPropagationStopped())b.type=f>1?i:o.bindType||q,m=(L.get(g,"events")||{})[b.type]&&L.get(g,"handle"),m&&m.apply(g,c),m=k&&g[k],m&&m.apply&&n.acceptData(g)&&(b.result=m.apply(g,c),b.result===!1&&b.preventDefault());return b.type=q,e||b.isDefaultPrevented()||o._default&&o._default.apply(p.pop(),c)!==!1||!n.acceptData(d)||k&&n.isFunction(d[q])&&!n.isWindow(d)&&(h=d[k],h&&(d[k]=null),n.event.triggered=q,d[q](),n.event.triggered=void 0,h&&(d[k]=h)),b.result}},dispatch:function(a){a=n.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(L.get(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(g.namespace))&&(a.handleObj=g,a.data=g.data,e=((n.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==e&&(a.result=e)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!==this;i=i.parentNode||this)if(i.disabled!==!0||"click"!==a.type){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?n(e,this).index(i)>=0:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){return null==a.which&&(a.which=null!=b.charCode?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,b){var c,d,e,f=b.button;return null==a.pageX&&null!=b.clientX&&(c=a.target.ownerDocument||l,d=c.documentElement,e=c.body,a.pageX=b.clientX+(d&&d.scrollLeft||e&&e.scrollLeft||0)-(d&&d.clientLeft||e&&e.clientLeft||0),a.pageY=b.clientY+(d&&d.scrollTop||e&&e.scrollTop||0)-(d&&d.clientTop||e&&e.clientTop||0)),a.which||void 0===f||(a.which=1&f?1:2&f?3:4&f?2:0),a}},fix:function(a){if(a[n.expando])return a;var b,c,d,e=a.type,f=a,g=this.fixHooks[e];g||(this.fixHooks[e]=g=W.test(e)?this.mouseHooks:V.test(e)?this.keyHooks:{}),d=g.props?this.props.concat(g.props):this.props,a=new n.Event(f),b=d.length;while(b--)c=d[b],a[c]=f[c];return a.target||(a.target=l),3===a.target.nodeType&&(a.target=a.target.parentNode),g.filter?g.filter(a,f):a},special:{load:{noBubble:!0},focus:{trigger:function(){return this!==_()&&this.focus?(this.focus(),!1):void 0},delegateType:"focusin"},blur:{trigger:function(){return this===_()&&this.blur?(this.blur(),!1):void 0},delegateType:"focusout"},click:{trigger:function(){return"checkbox"===this.type&&this.click&&n.nodeName(this,"input")?(this.click(),!1):void 0},_default:function(a){return n.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}},simulate:function(a,b,c,d){var e=n.extend(new n.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?n.event.trigger(e,null,b):n.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},n.removeEvent=function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)},n.Event=function(a,b){return this instanceof n.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?Z:$):this.type=a,b&&n.extend(this,b),this.timeStamp=a&&a.timeStamp||n.now(),void(this[n.expando]=!0)):new n.Event(a,b)},n.Event.prototype={isDefaultPrevented:$,isPropagationStopped:$,isImmediatePropagationStopped:$,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=Z,a&&a.preventDefault&&a.preventDefault()},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=Z,a&&a.stopPropagation&&a.stopPropagation()},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=Z,a&&a.stopImmediatePropagation&&a.stopImmediatePropagation(),this.stopPropagation()}},n.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){n.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return(!e||e!==d&&!n.contains(d,e))&&(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),k.focusinBubbles||n.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){n.event.simulate(b,a.target,n.event.fix(a),!0)};n.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=L.access(d,b);e||d.addEventListener(a,c,!0),L.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=L.access(d,b)-1;e?L.access(d,b,e):(d.removeEventListener(a,c,!0),L.remove(d,b))}}}),n.fn.extend({on:function(a,b,c,d,e){var f,g;if("object"==typeof a){"string"!=typeof b&&(c=c||b,b=void 0);for(g in a)this.on(g,b,c,a[g],e);return this}if(null==c&&null==d?(d=b,c=b=void 0):null==d&&("string"==typeof b?(d=c,c=void 0):(d=c,c=b,b=void 0)),d===!1)d=$;else if(!d)return this;return 1===e&&(f=d,d=function(a){return n().off(a),f.apply(this,arguments)},d.guid=f.guid||(f.guid=n.guid++)),this.each(function(){n.event.add(this,a,d,c,b)})},one:function(a,b,c,d){return this.on(a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,n(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return(b===!1||"function"==typeof b)&&(c=b,b=void 0),c===!1&&(c=$),this.each(function(){n.event.remove(this,a,c,b)})},trigger:function(a,b){return this.each(function(){n.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];return c?n.event.trigger(a,b,c,!0):void 0}});var aa=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,ba=/<([\w:]+)/,ca=/<|&#?\w+;/,da=/<(?:script|style|link)/i,ea=/checked\s*(?:[^=]|=\s*.checked.)/i,fa=/^$|\/(?:java|ecma)script/i,ga=/^true\/(.*)/,ha=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,ia={option:[1,"<select multiple='multiple'>","</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};ia.optgroup=ia.option,ia.tbody=ia.tfoot=ia.colgroup=ia.caption=ia.thead,ia.th=ia.td;function ja(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function ka(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function la(a){var b=ga.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function ma(a,b){for(var c=0,d=a.length;d>c;c++)L.set(a[c],"globalEval",!b||L.get(b[c],"globalEval"))}function na(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(L.hasData(a)&&(f=L.access(a),g=L.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;d>c;c++)n.event.add(b,e,j[e][c])}M.hasData(a)&&(h=M.access(a),i=n.extend({},h),M.set(b,i))}}function oa(a,b){var c=a.getElementsByTagName?a.getElementsByTagName(b||"*"):a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&n.nodeName(a,b)?n.merge([a],c):c}function pa(a,b){var c=b.nodeName.toLowerCase();"input"===c&&T.test(a.type)?b.checked=a.checked:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}n.extend({clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=n.contains(a.ownerDocument,a);if(!(k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(g=oa(h),f=oa(a),d=0,e=f.length;e>d;d++)pa(f[d],g[d]);if(b)if(c)for(f=f||oa(a),g=g||oa(h),d=0,e=f.length;e>d;d++)na(f[d],g[d]);else na(a,h);return g=oa(h,"script"),g.length>0&&ma(g,!i&&oa(a,"script")),h},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,k=b.createDocumentFragment(),l=[],m=0,o=a.length;o>m;m++)if(e=a[m],e||0===e)if("object"===n.type(e))n.merge(l,e.nodeType?[e]:e);else if(ca.test(e)){f=f||k.appendChild(b.createElement("div")),g=(ba.exec(e)||["",""])[1].toLowerCase(),h=ia[g]||ia._default,f.innerHTML=h[1]+e.replace(aa,"<$1></$2>")+h[2],j=h[0];while(j--)f=f.lastChild;n.merge(l,f.childNodes),f=k.firstChild,f.textContent=""}else l.push(b.createTextNode(e));k.textContent="",m=0;while(e=l[m++])if((!d||-1===n.inArray(e,d))&&(i=n.contains(e.ownerDocument,e),f=oa(k.appendChild(e),"script"),i&&ma(f),c)){j=0;while(e=f[j++])fa.test(e.type||"")&&c.push(e)}return k},cleanData:function(a){for(var b,c,d,e,f=n.event.special,g=0;void 0!==(c=a[g]);g++){if(n.acceptData(c)&&(e=c[L.expando],e&&(b=L.cache[e]))){if(b.events)for(d in b.events)f[d]?n.event.remove(c,d):n.removeEvent(c,d,b.handle);L.cache[e]&&delete L.cache[e]}delete M.cache[c[M.expando]]}}}),n.fn.extend({text:function(a){return J(this,function(a){return void 0===a?n.text(this):this.empty().each(function(){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&(this.textContent=a)})},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=ja(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=ja(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?n.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||n.cleanData(oa(c)),c.parentNode&&(b&&n.contains(c.ownerDocument,c)&&ma(oa(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(n.cleanData(oa(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return J(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!da.test(a)&&!ia[(ba.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(aa,"<$1></$2>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(oa(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,n.cleanData(oa(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,m=this,o=l-1,p=a[0],q=n.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&ea.test(p))return this.each(function(c){var d=m.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(c=n.buildFragment(a,this[0].ownerDocument,!1,this),d=c.firstChild,1===c.childNodes.length&&(c=d),d)){for(f=n.map(oa(c,"script"),ka),g=f.length;l>j;j++)h=c,j!==o&&(h=n.clone(h,!0,!0),g&&n.merge(f,oa(h,"script"))),b.call(this[j],h,j);if(g)for(i=f[f.length-1].ownerDocument,n.map(f,la),j=0;g>j;j++)h=f[j],fa.test(h.type||"")&&!L.access(h,"globalEval")&&n.contains(i,h)&&(h.src?n._evalUrl&&n._evalUrl(h.src):n.globalEval(h.textContent.replace(ha,"")))}return this}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=[],e=n(a),g=e.length-1,h=0;g>=h;h++)c=h===g?this:this.clone(!0),n(e[h])[b](c),f.apply(d,c.get());return this.pushStack(d)}});var qa,ra={};function sa(b,c){var d,e=n(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:n.css(e[0],"display");return e.detach(),f}function ta(a){var b=l,c=ra[a];return c||(c=sa(a,b),"none"!==c&&c||(qa=(qa||n("<iframe frameborder='0' width='0' height='0'/>")).appendTo(b.documentElement),b=qa[0].contentDocument,b.write(),b.close(),c=sa(a,b),qa.detach()),ra[a]=c),c}var ua=/^margin/,va=new RegExp("^("+Q+")(?!px)[a-z%]+$","i"),wa=function(b){return b.ownerDocument.defaultView.opener?b.ownerDocument.defaultView.getComputedStyle(b,null):a.getComputedStyle(b,null)};function xa(a,b,c){var d,e,f,g,h=a.style;return c=c||wa(a),c&&(g=c.getPropertyValue(b)||c[b]),c&&(""!==g||n.contains(a.ownerDocument,a)||(g=n.style(a,b)),va.test(g)&&ua.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0!==g?g+"":g}function ya(a,b){return{get:function(){return a()?void delete this.get:(this.get=b).apply(this,arguments)}}}!function(){var b,c,d=l.documentElement,e=l.createElement("div"),f=l.createElement("div");if(f.style){f.style.backgroundClip="content-box",f.cloneNode(!0).style.backgroundClip="",k.clearCloneStyle="content-box"===f.style.backgroundClip,e.style.cssText="border:0;width:0;height:0;top:0;left:-9999px;margin-top:1px;position:absolute",e.appendChild(f);function g(){f.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:block;margin-top:1%;top:1%;border:1px;padding:1px;width:4px;position:absolute",f.innerHTML="",d.appendChild(e);var g=a.getComputedStyle(f,null);b="1%"!==g.top,c="4px"===g.width,d.removeChild(e)}a.getComputedStyle&&n.extend(k,{pixelPosition:function(){return g(),b},boxSizingReliable:function(){return null==c&&g(),c},reliableMarginRight:function(){var b,c=f.appendChild(l.createElement("div"));return c.style.cssText=f.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",c.style.marginRight=c.style.width="0",f.style.width="1px",d.appendChild(e),b=!parseFloat(a.getComputedStyle(c,null).marginRight),d.removeChild(e),f.removeChild(c),b}})}}(),n.swap=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};var za=/^(none|table(?!-c[ea]).+)/,Aa=new RegExp("^("+Q+")(.*)$","i"),Ba=new RegExp("^([+-])=("+Q+")","i"),Ca={position:"absolute",visibility:"hidden",display:"block"},Da={letterSpacing:"0",fontWeight:"400"},Ea=["Webkit","O","Moz","ms"];function Fa(a,b){if(b in a)return b;var c=b[0].toUpperCase()+b.slice(1),d=b,e=Ea.length;while(e--)if(b=Ea[e]+c,b in a)return b;return d}function Ga(a,b,c){var d=Aa.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function Ha(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=n.css(a,c+R[f],!0,e)),d?("content"===c&&(g-=n.css(a,"padding"+R[f],!0,e)),"margin"!==c&&(g-=n.css(a,"border"+R[f]+"Width",!0,e))):(g+=n.css(a,"padding"+R[f],!0,e),"padding"!==c&&(g+=n.css(a,"border"+R[f]+"Width",!0,e)));return g}function Ia(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f=wa(a),g="border-box"===n.css(a,"boxSizing",!1,f);if(0>=e||null==e){if(e=xa(a,b,f),(0>e||null==e)&&(e=a.style[b]),va.test(e))return e;d=g&&(k.boxSizingReliable()||e===a.style[b]),e=parseFloat(e)||0}return e+Ha(a,b,c||(g?"border":"content"),d,f)+"px"}function Ja(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=L.get(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&S(d)&&(f[g]=L.access(d,"olddisplay",ta(d.nodeName)))):(e=S(d),"none"===c&&e||L.set(d,"olddisplay",e?c:n.css(d,"display"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&"none"!==d.style.display&&""!==d.style.display||(d.style.display=b?f[g]||"":"none"));return a}n.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=xa(a,"opacity");return""===c?"1":c}}}},cssNumber:{columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":"cssFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=n.camelCase(b),i=a.style;return b=n.cssProps[h]||(n.cssProps[h]=Fa(i,h)),g=n.cssHooks[b]||n.cssHooks[h],void 0===c?g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b]:(f=typeof c,"string"===f&&(e=Ba.exec(c))&&(c=(e[1]+1)*e[2]+parseFloat(n.css(a,b)),f="number"),null!=c&&c===c&&("number"!==f||n.cssNumber[h]||(c+="px"),k.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),g&&"set"in g&&void 0===(c=g.set(a,c,d))||(i[b]=c)),void 0)}},css:function(a,b,c,d){var e,f,g,h=n.camelCase(b);return b=n.cssProps[h]||(n.cssProps[h]=Fa(a.style,h)),g=n.cssHooks[b]||n.cssHooks[h],g&&"get"in g&&(e=g.get(a,!0,c)),void 0===e&&(e=xa(a,b,d)),"normal"===e&&b in Da&&(e=Da[b]),""===c||c?(f=parseFloat(e),c===!0||n.isNumeric(f)?f||0:e):e}}),n.each(["height","width"],function(a,b){n.cssHooks[b]={get:function(a,c,d){return c?za.test(n.css(a,"display"))&&0===a.offsetWidth?n.swap(a,Ca,function(){return Ia(a,b,d)}):Ia(a,b,d):void 0},set:function(a,c,d){var e=d&&wa(a);return Ga(a,c,d?Ha(a,b,d,"border-box"===n.css(a,"boxSizing",!1,e),e):0)}}}),n.cssHooks.marginRight=ya(k.reliableMarginRight,function(a,b){return b?n.swap(a,{display:"inline-block"},xa,[a,"marginRight"]):void 0}),n.each({margin:"",padding:"",border:"Width"},function(a,b){n.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+R[d]+b]=f[d]||f[d-2]||f[0];return e}},ua.test(a)||(n.cssHooks[a+b].set=Ga)}),n.fn.extend({css:function(a,b){return J(this,function(a,b,c){var d,e,f={},g=0;if(n.isArray(b)){for(d=wa(a),e=b.length;e>g;g++)f[b[g]]=n.css(a,b[g],!1,d);return f}return void 0!==c?n.style(a,b,c):n.css(a,b)},a,b,arguments.length>1)},show:function(){return Ja(this,!0)},hide:function(){return Ja(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){S(this)?n(this).show():n(this).hide()})}});function Ka(a,b,c,d,e){return new Ka.prototype.init(a,b,c,d,e)}n.Tween=Ka,Ka.prototype={constructor:Ka,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||"swing",this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(n.cssNumber[c]?"":"px")},cur:function(){var a=Ka.propHooks[this.prop];return a&&a.get?a.get(this):Ka.propHooks._default.get(this)},run:function(a){var b,c=Ka.propHooks[this.prop];return this.options.duration?this.pos=b=n.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Ka.propHooks._default.set(this),this}},Ka.prototype.init.prototype=Ka.prototype,Ka.propHooks={_default:{get:function(a){var b;return null==a.elem[a.prop]||a.elem.style&&null!=a.elem.style[a.prop]?(b=n.css(a.elem,a.prop,""),b&&"auto"!==b?b:0):a.elem[a.prop]},set:function(a){n.fx.step[a.prop]?n.fx.step[a.prop](a):a.elem.style&&(null!=a.elem.style[n.cssProps[a.prop]]||n.cssHooks[a.prop])?n.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}},Ka.propHooks.scrollTop=Ka.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},n.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}},n.fx=Ka.prototype.init,n.fx.step={};var La,Ma,Na=/^(?:toggle|show|hide)$/,Oa=new RegExp("^(?:([+-])=|)("+Q+")([a-z%]*)$","i"),Pa=/queueHooks$/,Qa=[Va],Ra={"*":[function(a,b){var c=this.createTween(a,b),d=c.cur(),e=Oa.exec(b),f=e&&e[3]||(n.cssNumber[a]?"":"px"),g=(n.cssNumber[a]||"px"!==f&&+d)&&Oa.exec(n.css(c.elem,a)),h=1,i=20;if(g&&g[3]!==f){f=f||g[3],e=e||[],g=+d||1;do h=h||".5",g/=h,n.style(c.elem,a,g+f);while(h!==(h=c.cur()/d)&&1!==h&&--i)}return e&&(g=c.start=+g||+d||0,c.unit=f,c.end=e[1]?g+(e[1]+1)*e[2]:+e[2]),c}]};function Sa(){return setTimeout(function(){La=void 0}),La=n.now()}function Ta(a,b){var c,d=0,e={height:a};for(b=b?1:0;4>d;d+=2-b)c=R[d],e["margin"+c]=e["padding"+c]=a;return b&&(e.opacity=e.width=a),e}function Ua(a,b,c){for(var d,e=(Ra[b]||[]).concat(Ra["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function Va(a,b,c){var d,e,f,g,h,i,j,k,l=this,m={},o=a.style,p=a.nodeType&&S(a),q=L.get(a,"fxshow");c.queue||(h=n._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,l.always(function(){l.always(function(){h.unqueued--,n.queue(a,"fx").length||h.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[o.overflow,o.overflowX,o.overflowY],j=n.css(a,"display"),k="none"===j?L.get(a,"olddisplay")||ta(a.nodeName):j,"inline"===k&&"none"===n.css(a,"float")&&(o.display="inline-block")),c.overflow&&(o.overflow="hidden",l.always(function(){o.overflow=c.overflow[0],o.overflowX=c.overflow[1],o.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],Na.exec(e)){if(delete b[d],f=f||"toggle"===e,e===(p?"hide":"show")){if("show"!==e||!q||void 0===q[d])continue;p=!0}m[d]=q&&q[d]||n.style(a,d)}else j=void 0;if(n.isEmptyObject(m))"inline"===("none"===j?ta(a.nodeName):j)&&(o.display=j);else{q?"hidden"in q&&(p=q.hidden):q=L.access(a,"fxshow",{}),f&&(q.hidden=!p),p?n(a).show():l.done(function(){n(a).hide()}),l.done(function(){var b;L.remove(a,"fxshow");for(b in m)n.style(a,b,m[b])});for(d in m)g=Ua(p?q[d]:0,d,l),d in q||(q[d]=g.start,p&&(g.end=g.start,g.start="width"===d||"height"===d?1:0))}}function Wa(a,b){var c,d,e,f,g;for(c in a)if(d=n.camelCase(c),e=b[d],f=a[c],n.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=n.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function Xa(a,b,c){var d,e,f=0,g=Qa.length,h=n.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=La||Sa(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:n.extend({},b),opts:n.extend(!0,{specialEasing:{}},c),originalProperties:b,originalOptions:c,startTime:La||Sa(),duration:c.duration,tweens:[],createTween:function(b,c){var d=n.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?h.resolveWith(a,[j,b]):h.rejectWith(a,[j,b]),this}}),k=j.props;for(Wa(k,j.opts.specialEasing);g>f;f++)if(d=Qa[f].call(j,a,k,j.opts))return d;return n.map(k,Ua,j),n.isFunction(j.opts.start)&&j.opts.start.call(a,j),n.fx.timer(n.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}n.Animation=n.extend(Xa,{tweener:function(a,b){n.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");for(var c,d=0,e=a.length;e>d;d++)c=a[d],Ra[c]=Ra[c]||[],Ra[c].unshift(b)},prefilter:function(a,b){b?Qa.unshift(a):Qa.push(a)}}),n.speed=function(a,b,c){var d=a&&"object"==typeof a?n.extend({},a):{complete:c||!c&&b||n.isFunction(a)&&a,duration:a,easing:c&&b||b&&!n.isFunction(b)&&b};return d.duration=n.fx.off?0:"number"==typeof d.duration?d.duration:d.duration in n.fx.speeds?n.fx.speeds[d.duration]:n.fx.speeds._default,(null==d.queue||d.queue===!0)&&(d.queue="fx"),d.old=d.complete,d.complete=function(){n.isFunction(d.old)&&d.old.call(this),d.queue&&n.dequeue(this,d.queue)},d},n.fn.extend({fadeTo:function(a,b,c,d){return this.filter(S).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=n.isEmptyObject(a),f=n.speed(b,c,d),g=function(){var b=Xa(this,n.extend({},a),f);(e||L.get(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=n.timers,g=L.get(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&Pa.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));(b||!c)&&n.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=L.get(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=n.timers,g=d?d.length:0;for(c.finish=!0,n.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),n.each(["toggle","show","hide"],function(a,b){var c=n.fn[b];n.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(Ta(b,!0),a,d,e)}}),n.each({slideDown:Ta("show"),slideUp:Ta("hide"),slideToggle:Ta("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){n.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),n.timers=[],n.fx.tick=function(){var a,b=0,c=n.timers;for(La=n.now();b<c.length;b++)a=c[b],a()||c[b]!==a||c.splice(b--,1);c.length||n.fx.stop(),La=void 0},n.fx.timer=function(a){n.timers.push(a),a()?n.fx.start():n.timers.pop()},n.fx.interval=13,n.fx.start=function(){Ma||(Ma=setInterval(n.fx.tick,n.fx.interval))},n.fx.stop=function(){clearInterval(Ma),Ma=null},n.fx.speeds={slow:600,fast:200,_default:400},n.fn.delay=function(a,b){return a=n.fx?n.fx.speeds[a]||a:a,b=b||"fx",this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},function(){var a=l.createElement("input"),b=l.createElement("select"),c=b.appendChild(l.createElement("option"));a.type="checkbox",k.checkOn=""!==a.value,k.optSelected=c.selected,b.disabled=!0,k.optDisabled=!c.disabled,a=l.createElement("input"),a.value="t",a.type="radio",k.radioValue="t"===a.value}();var Ya,Za,$a=n.expr.attrHandle;n.fn.extend({attr:function(a,b){return J(this,n.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){n.removeAttr(this,a)})}}),n.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(a&&3!==f&&8!==f&&2!==f)return typeof a.getAttribute===U?n.prop(a,b,c):(1===f&&n.isXMLDoc(a)||(b=b.toLowerCase(),d=n.attrHooks[b]||(n.expr.match.bool.test(b)?Za:Ya)),
  5350. void 0===c?d&&"get"in d&&null!==(e=d.get(a,b))?e:(e=n.find.attr(a,b),null==e?void 0:e):null!==c?d&&"set"in d&&void 0!==(e=d.set(a,c,b))?e:(a.setAttribute(b,c+""),c):void n.removeAttr(a,b))},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(E);if(f&&1===a.nodeType)while(c=f[e++])d=n.propFix[c]||c,n.expr.match.bool.test(c)&&(a[d]=!1),a.removeAttribute(c)},attrHooks:{type:{set:function(a,b){if(!k.radioValue&&"radio"===b&&n.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}}}),Za={set:function(a,b,c){return b===!1?n.removeAttr(a,c):a.setAttribute(c,c),c}},n.each(n.expr.match.bool.source.match(/\w+/g),function(a,b){var c=$a[b]||n.find.attr;$a[b]=function(a,b,d){var e,f;return d||(f=$a[b],$a[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,$a[b]=f),e}});var _a=/^(?:input|select|textarea|button)$/i;n.fn.extend({prop:function(a,b){return J(this,n.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[n.propFix[a]||a]})}}),n.extend({propFix:{"for":"htmlFor","class":"className"},prop:function(a,b,c){var d,e,f,g=a.nodeType;if(a&&3!==g&&8!==g&&2!==g)return f=1!==g||!n.isXMLDoc(a),f&&(b=n.propFix[b]||b,e=n.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){return a.hasAttribute("tabindex")||_a.test(a.nodeName)||a.href?a.tabIndex:-1}}}}),k.optSelected||(n.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null}}),n.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){n.propFix[this.toLowerCase()]=this});var ab=/[\t\r\n\f]/g;n.fn.extend({addClass:function(a){var b,c,d,e,f,g,h="string"==typeof a&&a,i=0,j=this.length;if(n.isFunction(a))return this.each(function(b){n(this).addClass(a.call(this,b,this.className))});if(h)for(b=(a||"").match(E)||[];j>i;i++)if(c=this[i],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(ab," "):" ")){f=0;while(e=b[f++])d.indexOf(" "+e+" ")<0&&(d+=e+" ");g=n.trim(d),c.className!==g&&(c.className=g)}return this},removeClass:function(a){var b,c,d,e,f,g,h=0===arguments.length||"string"==typeof a&&a,i=0,j=this.length;if(n.isFunction(a))return this.each(function(b){n(this).removeClass(a.call(this,b,this.className))});if(h)for(b=(a||"").match(E)||[];j>i;i++)if(c=this[i],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(ab," "):"")){f=0;while(e=b[f++])while(d.indexOf(" "+e+" ")>=0)d=d.replace(" "+e+" "," ");g=a?n.trim(d):"",c.className!==g&&(c.className=g)}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):this.each(n.isFunction(a)?function(c){n(this).toggleClass(a.call(this,c,this.className,b),b)}:function(){if("string"===c){var b,d=0,e=n(this),f=a.match(E)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else(c===U||"boolean"===c)&&(this.className&&L.set(this,"__className__",this.className),this.className=this.className||a===!1?"":L.get(this,"__className__")||"")})},hasClass:function(a){for(var b=" "+a+" ",c=0,d=this.length;d>c;c++)if(1===this[c].nodeType&&(" "+this[c].className+" ").replace(ab," ").indexOf(b)>=0)return!0;return!1}});var bb=/\r/g;n.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=n.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,n(this).val()):a,null==e?e="":"number"==typeof e?e+="":n.isArray(e)&&(e=n.map(e,function(a){return null==a?"":a+""})),b=n.valHooks[this.type]||n.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=n.valHooks[e.type]||n.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(bb,""):null==c?"":c)}}}),n.extend({valHooks:{option:{get:function(a){var b=n.find.attr(a,"value");return null!=b?b:n.trim(n.text(a))}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||0>e,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],!(!c.selected&&i!==e||(k.optDisabled?c.disabled:null!==c.getAttribute("disabled"))||c.parentNode.disabled&&n.nodeName(c.parentNode,"optgroup"))){if(b=n(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=n.makeArray(b),g=e.length;while(g--)d=e[g],(d.selected=n.inArray(d.value,f)>=0)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),n.each(["radio","checkbox"],function(){n.valHooks[this]={set:function(a,b){return n.isArray(b)?a.checked=n.inArray(n(a).val(),b)>=0:void 0}},k.checkOn||(n.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})}),n.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){n.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),n.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}});var cb=n.now(),db=/\?/;n.parseJSON=function(a){return JSON.parse(a+"")},n.parseXML=function(a){var b,c;if(!a||"string"!=typeof a)return null;try{c=new DOMParser,b=c.parseFromString(a,"text/xml")}catch(d){b=void 0}return(!b||b.getElementsByTagName("parsererror").length)&&n.error("Invalid XML: "+a),b};var eb=/#.*$/,fb=/([?&])_=[^&]*/,gb=/^(.*?):[ \t]*([^\r\n]*)$/gm,hb=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,ib=/^(?:GET|HEAD)$/,jb=/^\/\//,kb=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,lb={},mb={},nb="*/".concat("*"),ob=a.location.href,pb=kb.exec(ob.toLowerCase())||[];function qb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(E)||[];if(n.isFunction(c))while(d=f[e++])"+"===d[0]?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function rb(a,b,c,d){var e={},f=a===mb;function g(h){var i;return e[h]=!0,n.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function sb(a,b){var c,d,e=n.ajaxSettings.flatOptions||{};for(c in b)void 0!==b[c]&&((e[c]?a:d||(d={}))[c]=b[c]);return d&&n.extend(!0,a,d),a}function tb(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===d&&(d=a.mimeType||b.getResponseHeader("Content-Type"));if(d)for(e in h)if(h[e]&&h[e].test(d)){i.unshift(e);break}if(i[0]in c)f=i[0];else{for(e in c){if(!i[0]||a.converters[e+" "+i[0]]){f=e;break}g||(g=e)}f=f||g}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function ub(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}n.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:ob,type:"GET",isLocal:hb.test(pb[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":nb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":n.parseJSON,"text xml":n.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?sb(sb(a,n.ajaxSettings),b):sb(n.ajaxSettings,a)},ajaxPrefilter:qb(lb),ajaxTransport:qb(mb),ajax:function(a,b){"object"==typeof a&&(b=a,a=void 0),b=b||{};var c,d,e,f,g,h,i,j,k=n.ajaxSetup({},b),l=k.context||k,m=k.context&&(l.nodeType||l.jquery)?n(l):n.event,o=n.Deferred(),p=n.Callbacks("once memory"),q=k.statusCode||{},r={},s={},t=0,u="canceled",v={readyState:0,getResponseHeader:function(a){var b;if(2===t){if(!f){f={};while(b=gb.exec(e))f[b[1].toLowerCase()]=b[2]}b=f[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===t?e:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return t||(a=s[c]=s[c]||a,r[a]=b),this},overrideMimeType:function(a){return t||(k.mimeType=a),this},statusCode:function(a){var b;if(a)if(2>t)for(b in a)q[b]=[q[b],a[b]];else v.always(a[v.status]);return this},abort:function(a){var b=a||u;return c&&c.abort(b),x(0,b),this}};if(o.promise(v).complete=p.add,v.success=v.done,v.error=v.fail,k.url=((a||k.url||ob)+"").replace(eb,"").replace(jb,pb[1]+"//"),k.type=b.method||b.type||k.method||k.type,k.dataTypes=n.trim(k.dataType||"*").toLowerCase().match(E)||[""],null==k.crossDomain&&(h=kb.exec(k.url.toLowerCase()),k.crossDomain=!(!h||h[1]===pb[1]&&h[2]===pb[2]&&(h[3]||("http:"===h[1]?"80":"443"))===(pb[3]||("http:"===pb[1]?"80":"443")))),k.data&&k.processData&&"string"!=typeof k.data&&(k.data=n.param(k.data,k.traditional)),rb(lb,k,b,v),2===t)return v;i=n.event&&k.global,i&&0===n.active++&&n.event.trigger("ajaxStart"),k.type=k.type.toUpperCase(),k.hasContent=!ib.test(k.type),d=k.url,k.hasContent||(k.data&&(d=k.url+=(db.test(d)?"&":"?")+k.data,delete k.data),k.cache===!1&&(k.url=fb.test(d)?d.replace(fb,"$1_="+cb++):d+(db.test(d)?"&":"?")+"_="+cb++)),k.ifModified&&(n.lastModified[d]&&v.setRequestHeader("If-Modified-Since",n.lastModified[d]),n.etag[d]&&v.setRequestHeader("If-None-Match",n.etag[d])),(k.data&&k.hasContent&&k.contentType!==!1||b.contentType)&&v.setRequestHeader("Content-Type",k.contentType),v.setRequestHeader("Accept",k.dataTypes[0]&&k.accepts[k.dataTypes[0]]?k.accepts[k.dataTypes[0]]+("*"!==k.dataTypes[0]?", "+nb+"; q=0.01":""):k.accepts["*"]);for(j in k.headers)v.setRequestHeader(j,k.headers[j]);if(k.beforeSend&&(k.beforeSend.call(l,v,k)===!1||2===t))return v.abort();u="abort";for(j in{success:1,error:1,complete:1})v[j](k[j]);if(c=rb(mb,k,b,v)){v.readyState=1,i&&m.trigger("ajaxSend",[v,k]),k.async&&k.timeout>0&&(g=setTimeout(function(){v.abort("timeout")},k.timeout));try{t=1,c.send(r,x)}catch(w){if(!(2>t))throw w;x(-1,w)}}else x(-1,"No Transport");function x(a,b,f,h){var j,r,s,u,w,x=b;2!==t&&(t=2,g&&clearTimeout(g),c=void 0,e=h||"",v.readyState=a>0?4:0,j=a>=200&&300>a||304===a,f&&(u=tb(k,v,f)),u=ub(k,u,v,j),j?(k.ifModified&&(w=v.getResponseHeader("Last-Modified"),w&&(n.lastModified[d]=w),w=v.getResponseHeader("etag"),w&&(n.etag[d]=w)),204===a||"HEAD"===k.type?x="nocontent":304===a?x="notmodified":(x=u.state,r=u.data,s=u.error,j=!s)):(s=x,(a||!x)&&(x="error",0>a&&(a=0))),v.status=a,v.statusText=(b||x)+"",j?o.resolveWith(l,[r,x,v]):o.rejectWith(l,[v,x,s]),v.statusCode(q),q=void 0,i&&m.trigger(j?"ajaxSuccess":"ajaxError",[v,k,j?r:s]),p.fireWith(l,[v,x]),i&&(m.trigger("ajaxComplete",[v,k]),--n.active||n.event.trigger("ajaxStop")))}return v},getJSON:function(a,b,c){return n.get(a,b,c,"json")},getScript:function(a,b){return n.get(a,void 0,b,"script")}}),n.each(["get","post"],function(a,b){n[b]=function(a,c,d,e){return n.isFunction(c)&&(e=e||d,d=c,c=void 0),n.ajax({url:a,type:b,dataType:e,data:c,success:d})}}),n._evalUrl=function(a){return n.ajax({url:a,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})},n.fn.extend({wrapAll:function(a){var b;return n.isFunction(a)?this.each(function(b){n(this).wrapAll(a.call(this,b))}):(this[0]&&(b=n(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this)},wrapInner:function(a){return this.each(n.isFunction(a)?function(b){n(this).wrapInner(a.call(this,b))}:function(){var b=n(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=n.isFunction(a);return this.each(function(c){n(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){n.nodeName(this,"body")||n(this).replaceWith(this.childNodes)}).end()}}),n.expr.filters.hidden=function(a){return a.offsetWidth<=0&&a.offsetHeight<=0},n.expr.filters.visible=function(a){return!n.expr.filters.hidden(a)};var vb=/%20/g,wb=/\[\]$/,xb=/\r?\n/g,yb=/^(?:submit|button|image|reset|file)$/i,zb=/^(?:input|select|textarea|keygen)/i;function Ab(a,b,c,d){var e;if(n.isArray(b))n.each(b,function(b,e){c||wb.test(a)?d(a,e):Ab(a+"["+("object"==typeof e?b:"")+"]",e,c,d)});else if(c||"object"!==n.type(b))d(a,b);else for(e in b)Ab(a+"["+e+"]",b[e],c,d)}n.param=function(a,b){var c,d=[],e=function(a,b){b=n.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=n.ajaxSettings&&n.ajaxSettings.traditional),n.isArray(a)||a.jquery&&!n.isPlainObject(a))n.each(a,function(){e(this.name,this.value)});else for(c in a)Ab(c,a[c],b,e);return d.join("&").replace(vb,"+")},n.fn.extend({serialize:function(){return n.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=n.prop(this,"elements");return a?n.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!n(this).is(":disabled")&&zb.test(this.nodeName)&&!yb.test(a)&&(this.checked||!T.test(a))}).map(function(a,b){var c=n(this).val();return null==c?null:n.isArray(c)?n.map(c,function(a){return{name:b.name,value:a.replace(xb,"\r\n")}}):{name:b.name,value:c.replace(xb,"\r\n")}}).get()}}),n.ajaxSettings.xhr=function(){try{return new XMLHttpRequest}catch(a){}};var Bb=0,Cb={},Db={0:200,1223:204},Eb=n.ajaxSettings.xhr();a.attachEvent&&a.attachEvent("onunload",function(){for(var a in Cb)Cb[a]()}),k.cors=!!Eb&&"withCredentials"in Eb,k.ajax=Eb=!!Eb,n.ajaxTransport(function(a){var b;return k.cors||Eb&&!a.crossDomain?{send:function(c,d){var e,f=a.xhr(),g=++Bb;if(f.open(a.type,a.url,a.async,a.username,a.password),a.xhrFields)for(e in a.xhrFields)f[e]=a.xhrFields[e];a.mimeType&&f.overrideMimeType&&f.overrideMimeType(a.mimeType),a.crossDomain||c["X-Requested-With"]||(c["X-Requested-With"]="XMLHttpRequest");for(e in c)f.setRequestHeader(e,c[e]);b=function(a){return function(){b&&(delete Cb[g],b=f.onload=f.onerror=null,"abort"===a?f.abort():"error"===a?d(f.status,f.statusText):d(Db[f.status]||f.status,f.statusText,"string"==typeof f.responseText?{text:f.responseText}:void 0,f.getAllResponseHeaders()))}},f.onload=b(),f.onerror=b("error"),b=Cb[g]=b("abort");try{f.send(a.hasContent&&a.data||null)}catch(h){if(b)throw h}},abort:function(){b&&b()}}:void 0}),n.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(a){return n.globalEval(a),a}}}),n.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET")}),n.ajaxTransport("script",function(a){if(a.crossDomain){var b,c;return{send:function(d,e){b=n("<script>").prop({async:!0,charset:a.scriptCharset,src:a.url}).on("load error",c=function(a){b.remove(),c=null,a&&e("error"===a.type?404:200,a.type)}),l.head.appendChild(b[0])},abort:function(){c&&c()}}}});var Fb=[],Gb=/(=)\?(?=&|$)|\?\?/;n.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=Fb.pop()||n.expando+"_"+cb++;return this[a]=!0,a}}),n.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(Gb.test(b.url)?"url":"string"==typeof b.data&&!(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&Gb.test(b.data)&&"data");return h||"jsonp"===b.dataTypes[0]?(e=b.jsonpCallback=n.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(Gb,"$1"+e):b.jsonp!==!1&&(b.url+=(db.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||n.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,Fb.push(e)),g&&n.isFunction(f)&&f(g[0]),g=f=void 0}),"script"):void 0}),n.parseHTML=function(a,b,c){if(!a||"string"!=typeof a)return null;"boolean"==typeof b&&(c=b,b=!1),b=b||l;var d=v.exec(a),e=!c&&[];return d?[b.createElement(d[1])]:(d=n.buildFragment([a],b,e),e&&e.length&&n(e).remove(),n.merge([],d.childNodes))};var Hb=n.fn.load;n.fn.load=function(a,b,c){if("string"!=typeof a&&Hb)return Hb.apply(this,arguments);var d,e,f,g=this,h=a.indexOf(" ");return h>=0&&(d=n.trim(a.slice(h)),a=a.slice(0,h)),n.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(e="POST"),g.length>0&&n.ajax({url:a,type:e,dataType:"html",data:b}).done(function(a){f=arguments,g.html(d?n("<div>").append(n.parseHTML(a)).find(d):a)}).complete(c&&function(a,b){g.each(c,f||[a.responseText,b,a])}),this},n.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){n.fn[b]=function(a){return this.on(b,a)}}),n.expr.filters.animated=function(a){return n.grep(n.timers,function(b){return a===b.elem}).length};var Ib=a.document.documentElement;function Jb(a){return n.isWindow(a)?a:9===a.nodeType&&a.defaultView}n.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=n.css(a,"position"),l=n(a),m={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=n.css(a,"top"),i=n.css(a,"left"),j=("absolute"===k||"fixed"===k)&&(f+i).indexOf("auto")>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),n.isFunction(b)&&(b=b.call(a,c,h)),null!=b.top&&(m.top=b.top-h.top+g),null!=b.left&&(m.left=b.left-h.left+e),"using"in b?b.using.call(a,m):l.css(m)}},n.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){n.offset.setOffset(this,a,b)});var b,c,d=this[0],e={top:0,left:0},f=d&&d.ownerDocument;if(f)return b=f.documentElement,n.contains(b,d)?(typeof d.getBoundingClientRect!==U&&(e=d.getBoundingClientRect()),c=Jb(f),{top:e.top+c.pageYOffset-b.clientTop,left:e.left+c.pageXOffset-b.clientLeft}):e},position:function(){if(this[0]){var a,b,c=this[0],d={top:0,left:0};return"fixed"===n.css(c,"position")?b=c.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),n.nodeName(a[0],"html")||(d=a.offset()),d.top+=n.css(a[0],"borderTopWidth",!0),d.left+=n.css(a[0],"borderLeftWidth",!0)),{top:b.top-d.top-n.css(c,"marginTop",!0),left:b.left-d.left-n.css(c,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||Ib;while(a&&!n.nodeName(a,"html")&&"static"===n.css(a,"position"))a=a.offsetParent;return a||Ib})}}),n.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(b,c){var d="pageYOffset"===c;n.fn[b]=function(e){return J(this,function(b,e,f){var g=Jb(b);return void 0===f?g?g[c]:b[e]:void(g?g.scrollTo(d?a.pageXOffset:f,d?f:a.pageYOffset):b[e]=f)},b,e,arguments.length,null)}}),n.each(["top","left"],function(a,b){n.cssHooks[b]=ya(k.pixelPosition,function(a,c){return c?(c=xa(a,b),va.test(c)?n(a).position()[b]+"px":c):void 0})}),n.each({Height:"height",Width:"width"},function(a,b){n.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){n.fn[d]=function(d,e){var f=arguments.length&&(c||"boolean"!=typeof d),g=c||(d===!0||e===!0?"margin":"border");return J(this,function(b,c,d){var e;return n.isWindow(b)?b.document.documentElement["client"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body["scroll"+a],e["scroll"+a],b.body["offset"+a],e["offset"+a],e["client"+a])):void 0===d?n.css(b,c,g):n.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),n.fn.size=function(){return this.length},n.fn.andSelf=n.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return n});var Kb=a.jQuery,Lb=a.$;return n.noConflict=function(b){return a.$===n&&(a.$=Lb),b&&a.jQuery===n&&(a.jQuery=Kb),n},typeof b===U&&(a.jQuery=a.$=n),n});
  5351. },{}],"messages":[function(require,module,exports){
  5352. // Copyright (c) Microsoft Corporation. All rights reserved.
  5353. var Q = require('q');
  5354. // Plugin communications layer. Two types of communication are supported:
  5355. // 1. Messages - when emitted, any local handlers are notified, and it is also sent across to web sockets connection
  5356. // where any remote handlers are notified. There can be any number of local and/or remote handlers. There is no
  5357. // opportunity to respond.
  5358. // 2. Methods - calls across the web socket connection where there can be a single handler that can return a single
  5359. // value or error value.
  5360. function Messages(pluginId, socket) {
  5361. this.pluginId = pluginId;
  5362. this.socket = socket;
  5363. this.messages = {};
  5364. this.methods = {};
  5365. var that = this;
  5366. socket.on('plugin-message', function (data) {
  5367. if (data.pluginId === pluginId) {
  5368. notify.call(that, that.messages, data.message, data.data);
  5369. }
  5370. });
  5371. socket.on('plugin-method', function (data, callback) {
  5372. if (data.pluginId === pluginId) {
  5373. var handler = that.methods && that.methods[data.method];
  5374. if (handler) {
  5375. var args = data.args;
  5376. args.push(callback);
  5377. handler.apply(this, args);
  5378. }
  5379. }
  5380. });
  5381. }
  5382. Messages._globalMessages = {};
  5383. function notify(messagesObj, message, data) {
  5384. // Notifies local listeners of a message
  5385. var handlers = messagesObj && messagesObj[message];
  5386. if (handlers) {
  5387. handlers.forEach(function (handler) {
  5388. handler.call(this, message, data);
  5389. });
  5390. }
  5391. }
  5392. Messages.prototype = {
  5393. // Call and register for methods
  5394. /**
  5395. * @desc Calls the specified method, with any number of parameters. Return a promise.
  5396. * @param method
  5397. */
  5398. call: function (method) {
  5399. var d = Q.defer();
  5400. this.socket.emit('plugin-method', {
  5401. pluginId: this.pluginId,
  5402. method: method,
  5403. args: Array.prototype.slice.call(arguments, 1)
  5404. }, function (err, result) {
  5405. if (err) {
  5406. d.reject(err);
  5407. } else {
  5408. d.resolve(result);
  5409. }
  5410. });
  5411. return d.promise;
  5412. },
  5413. register: function(method, handler) {
  5414. // Can only ever have one handler for a method. Cancel by calling with handler null or undefined.
  5415. this.methods[method] = handler;
  5416. return this;
  5417. },
  5418. // Emit and handle messages
  5419. emit: function (message, data, isGlobal) {
  5420. // Pass the message across the socket
  5421. var eventName,
  5422. messagesObj;
  5423. if (isGlobal) {
  5424. eventName = 'global-plugin-message';
  5425. messagesObj = Messages._globalMessages;
  5426. } else {
  5427. eventName = 'plugin-message';
  5428. messagesObj = this.messages;
  5429. }
  5430. this.socket.emit(eventName, {
  5431. pluginId: this.pluginId,
  5432. message: message,
  5433. data: data
  5434. });
  5435. // Notify any local listeners
  5436. notify.call(this, messagesObj, message, data);
  5437. },
  5438. // Emit messages destined to external debug-hosts
  5439. emitDebug: function(message, data) {
  5440. this.socket.emit('debug-message', {
  5441. pluginId: this.pluginId,
  5442. message: message,
  5443. data: data
  5444. });
  5445. },
  5446. refreshAppHost: function (device) {
  5447. this.socket.emit('refresh-app-host', device);
  5448. },
  5449. on: function (message, handler, isGlobal) {
  5450. var messagesObj = (!isGlobal) ? this.messages : Messages._globalMessages;
  5451. if (!messagesObj[message]) {
  5452. messagesObj[message] = [handler];
  5453. } else {
  5454. messagesObj[message].push(handler);
  5455. }
  5456. return this;
  5457. },
  5458. off: function (message, handler) {
  5459. var handlers = this.messages[message];
  5460. if (!handlers) {
  5461. // try on the global messages handlers
  5462. handlers = Messages._globalMessages[message];
  5463. if (!handlers) {
  5464. return this;
  5465. }
  5466. }
  5467. var pos = handlers.indexOf(handler);
  5468. while (pos > -1) {
  5469. handlers.splice(pos, 1);
  5470. pos = handlers.indexOf(handler);
  5471. }
  5472. }
  5473. };
  5474. module.exports = Messages;
  5475. },{"q":1}],"polyfills":[function(require,module,exports){
  5476. // Copyright (c) Microsoft Corporation. All rights reserved.
  5477. // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign
  5478. if (typeof Object.assign != 'function') {
  5479. (function () {
  5480. Object.assign = function (target) {
  5481. 'use strict';
  5482. if (target === undefined || target === null) {
  5483. throw new TypeError('Cannot convert undefined or null to object');
  5484. }
  5485. var output = Object(target);
  5486. for (var index = 1; index < arguments.length; index++) {
  5487. var source = arguments[index];
  5488. if (source !== undefined && source !== null) {
  5489. for (var nextKey in source) {
  5490. if (Object.prototype.hasOwnProperty.call(source, nextKey)) {
  5491. output[nextKey] = source[nextKey];
  5492. }
  5493. }
  5494. }
  5495. }
  5496. return output;
  5497. };
  5498. })();
  5499. }
  5500. },{}],"sim-constants":[function(require,module,exports){
  5501. // Copyright (c) Microsoft Corporation. All rights reserved.
  5502. // Based in part on code from Apache Ripple, https://github.com/apache/incubator-ripple
  5503. module.exports = {
  5504. 'API_URL': 'https://rippleapi.herokuapp.com',
  5505. 'SERVICES': {
  5506. 'GOOGLE_MAPS_URI': 'http://maps.google.com/maps/api/staticmap?size=476x476&maptype=roadmap',
  5507. 'GOOGLE_MAPS_API_KEY': 'ABQIAAAA-CaPZHXR-0Tzhui_h6gpjhSE_2rGlnYiB7L-ZGVwgaut5s7OYRSlBAaHCzBuZf2_23_vrCOfPxXHjA'
  5508. },
  5509. 'FS_SIZE': 1024 * 1024 * 10,
  5510. 'COMMON': {
  5511. 'APPLICATION_STATE': 'ui-application-state-',
  5512. 'PREFIX': 'tinyhippos-',
  5513. 'MENU_BUTTON' : 'menu-button',
  5514. 'BACK_BUTTON' : 'back-button',
  5515. 'HTML_CONTAINER' : 'document',
  5516. 'INFO_SECTION': 'information-sub-container',
  5517. 'ORIENTATION_SELECT_PORTRAIT_ID' : 'layout-portrait',
  5518. 'ORIENTATION_SELECT_LANDSCAPE_ID' : 'layout-landscape',
  5519. 'PLATFORM_SELECT_ID': 'platform-select',
  5520. 'DEVICE_SELECT_ID': 'device-select',
  5521. 'STORAGE_TABLE_BODY_CLASS': 'preferences-list-body',
  5522. 'STORAGE_COUNT_CONTAINER_ID': 'preferences-count',
  5523. 'GEO_MAP_CONTAINER_ID': 'geo-map',
  5524. 'FILESYSTEM_UPDATE_BUTTON_ID_WITH_HASH': '#update-filesystem-button',
  5525. 'APPLICATIONS_CONTAINER_ID': 'widget-applications-content',
  5526. 'STORAGE_CLEAR_BUTTON_ID': 'preferences-clear-button',
  5527. 'CHANGE_PLATFORM_BUTTON_ID': 'change-platform',
  5528. 'AJAX_LOADER_CONTAINER_CLASS': '.loader',
  5529. 'IRRELEVANT_CLASS': 'irrelevant',
  5530. 'MULTIMEDIA_VOLUME_SLIDER_ID': 'media-volume',
  5531. 'MULTIMEDIA_VOLUME_FIELD_ID': 'media-volume-value',
  5532. 'MULTIMEDIA_AUDIO_STATE_FIELD_ID': 'media-audio-state',
  5533. 'MULTIMEDIA_AUDIO_PLAYING_FIELD_ID': 'multimedia-isaudioplaying',
  5534. 'MULTIMEDIA_AUDIO_PROGRESS_ID': 'media-audio-progress',
  5535. 'MULTIMEDIA_AUDIO_FILE_FIELD_ID': 'media-audio-file',
  5536. 'MULTIMEDIA_VIDEO_STATE_FIELD_ID': 'media-video-state',
  5537. 'MULTIMEDIA_VIDEO_PLAYING_FIELD_ID': 'multimedia-isvideoplaying',
  5538. 'MULTIMEDIA_VIDEO_PROGRESS_ID': 'media-video-progress',
  5539. 'MULTIMEDIA_VIDEO_FILE_FIELD_ID': 'media-video-file',
  5540. 'EXTENSION_URL_CONTAINER': 'extension-url',
  5541. 'SECURITY_LEVEL': 'security-level'
  5542. },
  5543. 'FILESYSTEM': {
  5544. 'PERSISTENCE_KEY': 'filesystem',
  5545. 'INPUT_PREFIX_ID': '#panel-filesystem-'
  5546. },
  5547. 'PLATFORM': {
  5548. 'DEFAULT': {
  5549. 'name': 'cordova',
  5550. 'version': '1.0.0'
  5551. }
  5552. },
  5553. 'ENCAPSULATOR': {
  5554. 'DEFAULT_HEIGHT': 684,
  5555. 'DEFAULT_WIDTH': 480
  5556. },
  5557. 'GEO': {
  5558. 'OPTIONS' : {
  5559. 'LATITUDE' : 'geo-latitude',
  5560. 'LONGITUDE' : 'geo-longitude',
  5561. 'ALTITUDE' : 'geo-altitude',
  5562. 'CELL_ID' : 'geo-cellid',
  5563. 'ACCURACY' : 'geo-accuracy',
  5564. 'ALTITUDE_ACCURACY' : 'geo-altitude-accuracy',
  5565. 'HEADING' : 'geo-heading',
  5566. 'SPEED' : 'geo-speed',
  5567. 'TIME_STAMP' : 'geo-timestamp',
  5568. 'DELAY' : 'geo-delay',
  5569. 'DELAY_LABEL' : 'geo-delay-label',
  5570. 'HEADING_LABEL' : 'geo-heading-label',
  5571. 'HEADING_MAP_LABEL' : 'geo-map-direction-label',
  5572. 'IMAGE' : 'geo-map-img',
  5573. 'MAP_MARKER' : 'geo-map-marker',
  5574. 'MAP_CONTAINER' : 'geo-map-container',
  5575. 'TIMEOUT' : 'geo-timeout',
  5576. 'GPXFILE': 'geo-gpxfile',
  5577. 'GPXGO': 'geo-gpx-go',
  5578. 'GPXMULTIPLIER': 'geo-gpxmultiplier-select',
  5579. 'GPXREPLAYSTATUS': 'geo-gpxreplaystatus'
  5580. },
  5581. 'MAP_ZOOM_MAX': 18,
  5582. 'MAP_ZOOM_MIN': 0,
  5583. 'MAP_ZOOM_LEVEL_CONTAINER': 'geo-map-zoomlevel-value',
  5584. 'MAP_ZOOM_KEY': 'geo-map-zoom-key',
  5585. 'GPXGO_LABELS': {
  5586. 'GO': 'Go',
  5587. 'STOP': 'Stop'
  5588. }
  5589. },
  5590. 'PUSH': {
  5591. 'OPTIONS' : {
  5592. 'PAYLOAD' : 'push-text'
  5593. }
  5594. },
  5595. 'TELEPHONY': {
  5596. 'CALL_LIST_KEY': 'telephony-call-list-key'
  5597. },
  5598. 'PIM': {
  5599. 'ADDRESS_LIST_KEY': 'pim-address-list-key',
  5600. 'CALENDAR_LIST_KEY': 'pim-calendar-list-key'
  5601. },
  5602. 'CAMERA': {
  5603. 'WINDOW_ANIMATION': 'images/dance.gif',
  5604. 'WARNING_TEXT': 'The runtime simulated saving the camera file to {file}. If you need to access this file in your application, please copy a file to the saved location'
  5605. },
  5606. 'AUDIOPLAYER' : {
  5607. 'WARNING_TEXT': 'The runtime simulated saving the audio file to {file}. If you need to access this file in your application, please copy a file to the saved location'
  5608. },
  5609. 'API_APPLICATION': {
  5610. 'NO_APPLICATIONS_MESSAGE': 'No applications available for your platform'
  5611. },
  5612. 'NOTIFICATIONS': {
  5613. 'MESSAGE_CONTAINER_CLASS': 'notification-message-div',
  5614. 'MAIN_CONTAINER_CLASS': 'panel-notification',
  5615. 'CLOSE_BUTTON_CLASS': 'panel-notification-closebtn',
  5616. 'MESSAGE_TEXT_CONTAINER_CLASS': 'panel-notification-text',
  5617. 'CSS_PREFIX': 'panel-notification-',
  5618. 'STATE_TYPES': {
  5619. 'OPEN': 1,
  5620. 'CLOSE': 2
  5621. }
  5622. },
  5623. 'BATTERY_STATUS' : {
  5624. 'BATTERY_STATUS_KEY': 'battery-status-key',
  5625. 'IS_PLUGGED_KEY' : 'is-plugged-key',
  5626. 'LEVEL_LABEL' : 'battery-level-label',
  5627. 'LEVEL_VALUE' : 'battery-level',
  5628. 'IS_PLUGGED_CHECKBOX' : 'is-plugged'
  5629. },
  5630. 'CSS_PREFIX': {
  5631. 'IRRELEVANT' : 'irrelevant'
  5632. },
  5633. 'STORAGE': {
  5634. 'PAIR_DELIMETER' : ',',
  5635. 'KEY_VALUE_DELIMETER' : '|'
  5636. },
  5637. 'REGEX': {
  5638. 'GEO' : /^geo-/,
  5639. 'URL': /^((https?|ftp|gopher|telnet|file|notes|ms-help):((\/\/)|(\\\\))+[\w\d:#@%\/;$()~_?\+-=\\\.&]*)$/,
  5640. //'Email': /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/
  5641. 'EMAIL': /^([^@\s]+)@((?:[\-a-z0-9]+\.)+[a-z]{2,})$/,
  5642. 'WC3_DTF': /^((\d{4})-(\d\d)-(\d\d)T(\d\d):(\d\d):(\d\d)|(\d{4})-(\d\d)-(\d\d)T(\d\d):(\d\d)|(\d{4})-(\d\d)-(\d\d)|(\d{4})-(\d\d)|(\d\d\d\d))$/,
  5643. 'NON_RELATIVE_URI': /^https?:\/\/|^file:\/\//
  5644. },
  5645. 'CONFIG': {
  5646. 'SUCCESS_CSS': {
  5647. 'true': 'ui-text-pass',
  5648. 'false': 'ui-text-fail',
  5649. 'missing': 'ui-text-missing'
  5650. }
  5651. },
  5652. 'SETTINGS': {
  5653. 'TOOLTIPS_TOGGLE_DIV': '#settings-toggletooltips',
  5654. 'TOOLTIPS_KEY': 'tool-tips-key'
  5655. },
  5656. 'UI': {
  5657. 'JQUERY_UI_BUTTON_CLASSES': 'ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only',
  5658. 'JQUERY_UI_INPUT_CLASSES': 'ui-state-default ui-corner-all',
  5659. 'PANEL_TABLE_CLASS': 'panel-table',
  5660. 'RIGHT_RANGE_LABEL_CLASS': 'range-label',
  5661. 'LEFT_RANGE_LABEL_CLASS': 'range-label-left',
  5662. 'TEXT_LABEL_CLASS': 'ui-text-label',
  5663. 'SCREEN_PPI': 96
  5664. },
  5665. 'MULTIMEDIA': {
  5666. 'AUDIO_STATES': {
  5667. 'OPENED': 'opened',
  5668. 'STOPPED': 'stopped',
  5669. 'PAUSED': 'paused',
  5670. 'PLAYING': 'playing',
  5671. 'COMPLETED': 'completed'
  5672. }
  5673. },
  5674. 'LANG': {
  5675. 'ISO6392_LIST': ['abk', 'ace', 'ach', 'ada', 'ady', 'aar', 'afh', 'afr', 'afa', 'ain', 'aka', 'akk', 'alb/sqi', 'gsw', 'ale', 'alg', 'tut', 'amh', 'anp', 'apa', 'ara', 'arg', 'arp', 'arw', 'arm/hye', 'rup', 'art', 'asm', 'ast', 'ath', 'aus', 'map', 'ava', 'ave', 'awa', 'aym', 'aze', 'ban', 'bat', 'bal', 'bam', 'bai', 'bad', 'bnt', 'bas', 'bak', 'baq/eus', 'btk', 'bej', 'bel', 'bem', 'ben', 'ber', 'bho', 'bih', 'bik', 'byn', 'bin', 'bis', 'zbl', 'nob', 'bos', 'bra', 'bre', 'bug', 'bul', 'bua', 'bur/mya', 'cad', 'spa', 'cat', 'cau', 'ceb', 'cel', 'cai', 'khm', 'chg', 'cmc', 'cha', 'che', 'chr', 'nya', 'chy', 'chb', 'chi/zho', 'chn', 'chp', 'cho', 'zha', 'chu', 'chk', 'chv', 'nwc', 'syc', 'rar', 'cop', 'cor', 'cos', 'cre', 'mus', 'crp', 'cpe', 'cpf', 'cpp', 'crh', 'hrv', 'cus', 'cze/ces', 'dak', 'dan', 'dar', 'del', 'div', 'zza', 'din', 'doi', 'dgr', 'dra', 'dua', 'dut/nld', 'dum', 'dyu', 'dzo', 'frs', 'efi', 'egy', 'eka', 'elx', 'eng', 'enm', 'ang', 'myv', 'epo', 'est', 'ewe', 'ewo', 'fan', 'fat', 'fao', 'fij', 'fil', 'fin', 'fiu', 'fon', 'fre/fra', 'frm', 'fro', 'fur', 'ful', 'gaa', 'gla', 'car', 'glg', 'lug', 'gay', 'gba', 'gez', 'geo/kat', 'ger/deu', 'nds', 'gmh', 'goh', 'gem', 'kik', 'gil', 'gon', 'gor', 'got', 'grb', 'grc', 'gre/ell', 'kal', 'grn', 'guj', 'gwi', 'hai', 'hat', 'hau', 'haw', 'heb', 'her', 'hil', 'him', 'hin', 'hmo', 'hit', 'hmn', 'hun', 'hup', 'iba', 'ice/isl', 'ido', 'ibo', 'ijo', 'ilo', 'arc', 'smn', 'inc', 'ine', 'ind', 'inh', 'ina', 'ile', 'iku', 'ipk', 'ira', 'gle', 'mga', 'sga', 'iro', 'ita', 'jpn', 'jav', 'kac', 'jrb', 'jpr', 'kbd', 'kab', 'xal', 'kam', 'kan', 'kau', 'pam', 'kaa', 'krc', 'krl', 'kar', 'kas', 'csb', 'kaw', 'kaz', 'kha', 'khi', 'kho', 'kmb', 'kin', 'kir', 'tlh', 'kom', 'kon', 'kok', 'kor', 'kos', 'kpe', 'kro', 'kua', 'kum', 'kur', 'kru', 'kut', 'lad', 'lah', 'lam', 'day', 'lao', 'lat', 'lav', 'ltz', 'lez', 'lim', 'lin', 'lit', 'jbo', 'dsb', 'loz', 'lub', 'lua', 'lui', 'smj', 'lun', 'luo', 'lus', 'mac/mkd', 'mad', 'mag', 'mai', 'mak', 'mlg', 'may/msa', 'mal', 'mlt', 'mnc', 'mdr', 'man', 'mni', 'mno', 'glv', 'mao/mri', 'arn', 'mar', 'chm', 'mah', 'mwr', 'mas', 'myn', 'men', 'mic', 'min', 'mwl', 'moh', 'mdf', 'rum/ron', 'mkh', 'lol', 'mon', 'mos', 'mul', 'mun', 'nqo', 'nah', 'nau', 'nav', 'nde', 'nbl', 'ndo', 'nap', 'new', 'nep', 'nia', 'nic', 'ssa', 'niu', 'zxx', 'nog', 'non', 'nai', 'frr', 'sme', 'nso', 'nor', 'nno', 'nub', 'iii', 'nym', 'nyn', 'nyo', 'nzi', 'oci', 'pro', 'oji', 'ori', 'orm', 'osa', 'oss', 'oto', 'pal', 'pau', 'pli', 'pag', 'pan', 'pap', 'paa', 'pus', 'per/fas', 'peo', 'phi', 'phn', 'pon', 'pol', 'por', 'pra', 'que', 'raj', 'rap', 'qaa-qtz', 'roa', 'roh', 'rom', 'run', 'rus', 'sal', 'sam', 'smi', 'smo', 'sad', 'sag', 'san', 'sat', 'srd', 'sas', 'sco', 'sel', 'sem', 'srp', 'srr', 'shn', 'sna', 'scn', 'sid', 'sgn', 'bla', 'snd', 'sin', 'sit', 'sio', 'sms', 'den', 'sla', 'slo/slk', 'slv', 'sog', 'som', 'son', 'snk', 'wen', 'sot', 'sai', 'alt', 'sma', 'srn', 'suk', 'sux', 'sun', 'sus', 'swa', 'ssw', 'swe', 'syr', 'tgl', 'tah', 'tai', 'tgk', 'tmh', 'tam', 'tat', 'tel', 'ter', 'tet', 'tha', 'tib/bod', 'tig', 'tir', 'tem', 'tiv', 'tli', 'tpi', 'tkl', 'tog', 'ton', 'tsi', 'tso', 'tsn', 'tum', 'tup', 'tur', 'ota', 'tuk', 'tvl', 'tyv', 'twi', 'udm', 'uga', 'uig', 'ukr', 'umb', 'mis', 'und', 'hsb', 'urd', 'uzb', 'vai', 'ven', 'vie', 'vol', 'vot', 'wak', 'wln', 'war', 'was', 'wel/cym', 'fry', 'wal', 'wol', 'xho', 'sah', 'yao', 'yap', 'yid', 'yor', 'ypk', 'znd', 'zap', 'zen', 'zul', 'zun']
  5676. },
  5677. 'XHR': {
  5678. PROXY_SETTING: 'settings-xhr-proxy-setting',
  5679. PROXY_SETTINGS_LIST: {
  5680. remote: 'remote',
  5681. local: 'local',
  5682. disabled: 'disabled'
  5683. },
  5684. DEFAULT_LOCAL_PORT: 4400,
  5685. DEFAULT_LOCAL_ROUTE: '/ripple',
  5686. LOCAL_PROXY_PORT_SETTING: 'settings-xhr-proxy-local-port',
  5687. LOCAL_PROXY_ROUTE_SETTING: 'settings-xhr-proxy-local-route'
  5688. }
  5689. };
  5690. },{}],"socket.io":[function(require,module,exports){
  5691. (function (global){
  5692. /* @version 1.4.5 */
  5693. (function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.io=f()}})(function(){var define,module,exports;return 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);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.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(_dereq_,module,exports){module.exports=_dereq_("./lib/")},{"./lib/":2}],2:[function(_dereq_,module,exports){module.exports=_dereq_("./socket");module.exports.parser=_dereq_("engine.io-parser")},{"./socket":3,"engine.io-parser":19}],3:[function(_dereq_,module,exports){(function(global){var transports=_dereq_("./transports");var Emitter=_dereq_("component-emitter");var debug=_dereq_("debug")("engine.io-client:socket");var index=_dereq_("indexof");var parser=_dereq_("engine.io-parser");var parseuri=_dereq_("parseuri");var parsejson=_dereq_("parsejson");var parseqs=_dereq_("parseqs");module.exports=Socket;function noop(){}function Socket(uri,opts){if(!(this instanceof Socket))return new Socket(uri,opts);opts=opts||{};if(uri&&"object"==typeof uri){opts=uri;uri=null}if(uri){uri=parseuri(uri);opts.hostname=uri.host;opts.secure=uri.protocol=="https"||uri.protocol=="wss";opts.port=uri.port;if(uri.query)opts.query=uri.query}else if(opts.host){opts.hostname=parseuri(opts.host).host}this.secure=null!=opts.secure?opts.secure:global.location&&"https:"==location.protocol;if(opts.hostname&&!opts.port){opts.port=this.secure?"443":"80"}this.agent=opts.agent||false;this.hostname=opts.hostname||(global.location?location.hostname:"localhost");this.port=opts.port||(global.location&&location.port?location.port:this.secure?443:80);this.query=opts.query||{};if("string"==typeof this.query)this.query=parseqs.decode(this.query);this.upgrade=false!==opts.upgrade;this.path=(opts.path||"/engine.io").replace(/\/$/,"")+"/";this.forceJSONP=!!opts.forceJSONP;this.jsonp=false!==opts.jsonp;this.forceBase64=!!opts.forceBase64;this.enablesXDR=!!opts.enablesXDR;this.timestampParam=opts.timestampParam||"t";this.timestampRequests=opts.timestampRequests;this.transports=opts.transports||["polling","websocket"];this.readyState="";this.writeBuffer=[];this.policyPort=opts.policyPort||843;this.rememberUpgrade=opts.rememberUpgrade||false;this.binaryType=null;this.onlyBinaryUpgrades=opts.onlyBinaryUpgrades;this.perMessageDeflate=false!==opts.perMessageDeflate?opts.perMessageDeflate||{}:false;if(true===this.perMessageDeflate)this.perMessageDeflate={};if(this.perMessageDeflate&&null==this.perMessageDeflate.threshold){this.perMessageDeflate.threshold=1024}this.pfx=opts.pfx||null;this.key=opts.key||null;this.passphrase=opts.passphrase||null;this.cert=opts.cert||null;this.ca=opts.ca||null;this.ciphers=opts.ciphers||null;this.rejectUnauthorized=opts.rejectUnauthorized===undefined?null:opts.rejectUnauthorized;var freeGlobal=typeof global=="object"&&global;if(freeGlobal.global===freeGlobal){if(opts.extraHeaders&&Object.keys(opts.extraHeaders).length>0){this.extraHeaders=opts.extraHeaders}}this.open()}Socket.priorWebsocketSuccess=false;Emitter(Socket.prototype);Socket.protocol=parser.protocol;Socket.Socket=Socket;Socket.Transport=_dereq_("./transport");Socket.transports=_dereq_("./transports");Socket.parser=_dereq_("engine.io-parser");Socket.prototype.createTransport=function(name){debug('creating transport "%s"',name);var query=clone(this.query);query.EIO=parser.protocol;query.transport=name;if(this.id)query.sid=this.id;var transport=new transports[name]({agent:this.agent,hostname:this.hostname,port:this.port,secure:this.secure,path:this.path,query:query,forceJSONP:this.forceJSONP,jsonp:this.jsonp,forceBase64:this.forceBase64,enablesXDR:this.enablesXDR,timestampRequests:this.timestampRequests,timestampParam:this.timestampParam,policyPort:this.policyPort,socket:this,pfx:this.pfx,key:this.key,passphrase:this.passphrase,cert:this.cert,ca:this.ca,ciphers:this.ciphers,rejectUnauthorized:this.rejectUnauthorized,perMessageDeflate:this.perMessageDeflate,extraHeaders:this.extraHeaders});return transport};function clone(obj){var o={};for(var i in obj){if(obj.hasOwnProperty(i)){o[i]=obj[i]}}return o}Socket.prototype.open=function(){var transport;if(this.rememberUpgrade&&Socket.priorWebsocketSuccess&&this.transports.indexOf("websocket")!=-1){transport="websocket"}else if(0===this.transports.length){var self=this;setTimeout(function(){self.emit("error","No transports available")},0);return}else{transport=this.transports[0]}this.readyState="opening";try{transport=this.createTransport(transport)}catch(e){this.transports.shift();this.open();return}transport.open();this.setTransport(transport)};Socket.prototype.setTransport=function(transport){debug("setting transport %s",transport.name);var self=this;if(this.transport){debug("clearing existing transport %s",this.transport.name);this.transport.removeAllListeners()}this.transport=transport;transport.on("drain",function(){self.onDrain()}).on("packet",function(packet){self.onPacket(packet)}).on("error",function(e){self.onError(e)}).on("close",function(){self.onClose("transport close")})};Socket.prototype.probe=function(name){debug('probing transport "%s"',name);var transport=this.createTransport(name,{probe:1}),failed=false,self=this;Socket.priorWebsocketSuccess=false;function onTransportOpen(){if(self.onlyBinaryUpgrades){var upgradeLosesBinary=!this.supportsBinary&&self.transport.supportsBinary;failed=failed||upgradeLosesBinary}if(failed)return;debug('probe transport "%s" opened',name);transport.send([{type:"ping",data:"probe"}]);transport.once("packet",function(msg){if(failed)return;if("pong"==msg.type&&"probe"==msg.data){debug('probe transport "%s" pong',name);self.upgrading=true;self.emit("upgrading",transport);if(!transport)return;Socket.priorWebsocketSuccess="websocket"==transport.name;debug('pausing current transport "%s"',self.transport.name);self.transport.pause(function(){if(failed)return;if("closed"==self.readyState)return;debug("changing transport and sending upgrade packet");cleanup();self.setTransport(transport);transport.send([{type:"upgrade"}]);self.emit("upgrade",transport);transport=null;self.upgrading=false;self.flush()})}else{debug('probe transport "%s" failed',name);var err=new Error("probe error");err.transport=transport.name;self.emit("upgradeError",err)}})}function freezeTransport(){if(failed)return;failed=true;cleanup();transport.close();transport=null}function onerror(err){var error=new Error("probe error: "+err);error.transport=transport.name;freezeTransport();debug('probe transport "%s" failed because of error: %s',name,err);self.emit("upgradeError",error)}function onTransportClose(){onerror("transport closed")}function onclose(){onerror("socket closed")}function onupgrade(to){if(transport&&to.name!=transport.name){debug('"%s" works - aborting "%s"',to.name,transport.name);freezeTransport()}}function cleanup(){transport.removeListener("open",onTransportOpen);transport.removeListener("error",onerror);transport.removeListener("close",onTransportClose);self.removeListener("close",onclose);self.removeListener("upgrading",onupgrade)}transport.once("open",onTransportOpen);transport.once("error",onerror);transport.once("close",onTransportClose);this.once("close",onclose);this.once("upgrading",onupgrade);transport.open()};Socket.prototype.onOpen=function(){debug("socket open");this.readyState="open";Socket.priorWebsocketSuccess="websocket"==this.transport.name;this.emit("open");this.flush();if("open"==this.readyState&&this.upgrade&&this.transport.pause){debug("starting upgrade probes");for(var i=0,l=this.upgrades.length;i<l;i++){this.probe(this.upgrades[i])}}};Socket.prototype.onPacket=function(packet){if("opening"==this.readyState||"open"==this.readyState){debug('socket receive: type "%s", data "%s"',packet.type,packet.data);this.emit("packet",packet);this.emit("heartbeat");switch(packet.type){case"open":this.onHandshake(parsejson(packet.data));break;case"pong":this.setPing();this.emit("pong");break;case"error":var err=new Error("server error");err.code=packet.data;this.onError(err);break;case"message":this.emit("data",packet.data);this.emit("message",packet.data);break}}else{debug('packet received with socket readyState "%s"',this.readyState)}};Socket.prototype.onHandshake=function(data){this.emit("handshake",data);this.id=data.sid;this.transport.query.sid=data.sid;this.upgrades=this.filterUpgrades(data.upgrades);this.pingInterval=data.pingInterval;this.pingTimeout=data.pingTimeout;this.onOpen();if("closed"==this.readyState)return;this.setPing();this.removeListener("heartbeat",this.onHeartbeat);this.on("heartbeat",this.onHeartbeat)};Socket.prototype.onHeartbeat=function(timeout){clearTimeout(this.pingTimeoutTimer);var self=this;self.pingTimeoutTimer=setTimeout(function(){if("closed"==self.readyState)return;self.onClose("ping timeout")},timeout||self.pingInterval+self.pingTimeout)};Socket.prototype.setPing=function(){var self=this;clearTimeout(self.pingIntervalTimer);self.pingIntervalTimer=setTimeout(function(){debug("writing ping packet - expecting pong within %sms",self.pingTimeout);self.ping();self.onHeartbeat(self.pingTimeout)},self.pingInterval)};Socket.prototype.ping=function(){var self=this;this.sendPacket("ping",function(){self.emit("ping")})};Socket.prototype.onDrain=function(){this.writeBuffer.splice(0,this.prevBufferLen);this.prevBufferLen=0;if(0===this.writeBuffer.length){this.emit("drain")}else{this.flush()}};Socket.prototype.flush=function(){if("closed"!=this.readyState&&this.transport.writable&&!this.upgrading&&this.writeBuffer.length){debug("flushing %d packets in socket",this.writeBuffer.length);this.transport.send(this.writeBuffer);this.prevBufferLen=this.writeBuffer.length;this.emit("flush")}};Socket.prototype.write=Socket.prototype.send=function(msg,options,fn){this.sendPacket("message",msg,options,fn);return this};Socket.prototype.sendPacket=function(type,data,options,fn){if("function"==typeof data){fn=data;data=undefined}if("function"==typeof options){fn=options;options=null}if("closing"==this.readyState||"closed"==this.readyState){return}options=options||{};options.compress=false!==options.compress;var packet={type:type,data:data,options:options};this.emit("packetCreate",packet);this.writeBuffer.push(packet);if(fn)this.once("flush",fn);this.flush()};Socket.prototype.close=function(){if("opening"==this.readyState||"open"==this.readyState){this.readyState="closing";var self=this;if(this.writeBuffer.length){this.once("drain",function(){if(this.upgrading){waitForUpgrade()}else{close()}})}else if(this.upgrading){waitForUpgrade()}else{close()}}function close(){self.onClose("forced close");debug("socket closing - telling transport to close");self.transport.close()}function cleanupAndClose(){self.removeListener("upgrade",cleanupAndClose);self.removeListener("upgradeError",cleanupAndClose);close()}function waitForUpgrade(){self.once("upgrade",cleanupAndClose);self.once("upgradeError",cleanupAndClose)}return this};Socket.prototype.onError=function(err){debug("socket error %j",err);Socket.priorWebsocketSuccess=false;this.emit("error",err);this.onClose("transport error",err)};Socket.prototype.onClose=function(reason,desc){if("opening"==this.readyState||"open"==this.readyState||"closing"==this.readyState){debug('socket close with reason: "%s"',reason);var self=this;clearTimeout(this.pingIntervalTimer);clearTimeout(this.pingTimeoutTimer);this.transport.removeAllListeners("close");this.transport.close();this.transport.removeAllListeners();this.readyState="closed";this.id=null;this.emit("close",reason,desc);self.writeBuffer=[];self.prevBufferLen=0}};Socket.prototype.filterUpgrades=function(upgrades){var filteredUpgrades=[];for(var i=0,j=upgrades.length;i<j;i++){if(~index(this.transports,upgrades[i]))filteredUpgrades.push(upgrades[i])}return filteredUpgrades}}).call(this,typeof self!=="undefined"?self:typeof window!=="undefined"?window:typeof global!=="undefined"?global:{})},{"./transport":4,"./transports":5,"component-emitter":15,debug:17,"engine.io-parser":19,indexof:23,parsejson:26,parseqs:27,parseuri:28}],4:[function(_dereq_,module,exports){var parser=_dereq_("engine.io-parser");var Emitter=_dereq_("component-emitter");module.exports=Transport;function Transport(opts){this.path=opts.path;this.hostname=opts.hostname;this.port=opts.port;this.secure=opts.secure;this.query=opts.query;this.timestampParam=opts.timestampParam;this.timestampRequests=opts.timestampRequests;this.readyState="";this.agent=opts.agent||false;this.socket=opts.socket;this.enablesXDR=opts.enablesXDR;this.pfx=opts.pfx;this.key=opts.key;this.passphrase=opts.passphrase;this.cert=opts.cert;this.ca=opts.ca;this.ciphers=opts.ciphers;this.rejectUnauthorized=opts.rejectUnauthorized;this.extraHeaders=opts.extraHeaders}Emitter(Transport.prototype);Transport.prototype.onError=function(msg,desc){var err=new Error(msg);err.type="TransportError";err.description=desc;this.emit("error",err);return this};Transport.prototype.open=function(){if("closed"==this.readyState||""==this.readyState){this.readyState="opening";this.doOpen()}return this};Transport.prototype.close=function(){if("opening"==this.readyState||"open"==this.readyState){this.doClose();this.onClose()}return this};Transport.prototype.send=function(packets){if("open"==this.readyState){this.write(packets)}else{throw new Error("Transport not open")}};Transport.prototype.onOpen=function(){this.readyState="open";this.writable=true;this.emit("open")};Transport.prototype.onData=function(data){var packet=parser.decodePacket(data,this.socket.binaryType);this.onPacket(packet)};Transport.prototype.onPacket=function(packet){this.emit("packet",packet)};Transport.prototype.onClose=function(){this.readyState="closed";this.emit("close")}},{"component-emitter":15,"engine.io-parser":19}],5:[function(_dereq_,module,exports){(function(global){var XMLHttpRequest=_dereq_("xmlhttprequest-ssl");var XHR=_dereq_("./polling-xhr");var JSONP=_dereq_("./polling-jsonp");var websocket=_dereq_("./websocket");exports.polling=polling;exports.websocket=websocket;function polling(opts){var xhr;var xd=false;var xs=false;var jsonp=false!==opts.jsonp;if(global.location){var isSSL="https:"==location.protocol;var port=location.port;if(!port){port=isSSL?443:80}xd=opts.hostname!=location.hostname||port!=opts.port;xs=opts.secure!=isSSL}opts.xdomain=xd;opts.xscheme=xs;xhr=new XMLHttpRequest(opts);if("open"in xhr&&!opts.forceJSONP){return new XHR(opts)}else{if(!jsonp)throw new Error("JSONP disabled");return new JSONP(opts)}}}).call(this,typeof self!=="undefined"?self:typeof window!=="undefined"?window:typeof global!=="undefined"?global:{})},{"./polling-jsonp":6,"./polling-xhr":7,"./websocket":9,"xmlhttprequest-ssl":10}],6:[function(_dereq_,module,exports){(function(global){var Polling=_dereq_("./polling");var inherit=_dereq_("component-inherit");module.exports=JSONPPolling;var rNewline=/\n/g;var rEscapedNewline=/\\n/g;var callbacks;var index=0;function empty(){}function JSONPPolling(opts){Polling.call(this,opts);this.query=this.query||{};if(!callbacks){if(!global.___eio)global.___eio=[];callbacks=global.___eio}this.index=callbacks.length;var self=this;callbacks.push(function(msg){self.onData(msg)});this.query.j=this.index;if(global.document&&global.addEventListener){global.addEventListener("beforeunload",function(){if(self.script)self.script.onerror=empty},false)}}inherit(JSONPPolling,Polling);JSONPPolling.prototype.supportsBinary=false;JSONPPolling.prototype.doClose=function(){if(this.script){this.script.parentNode.removeChild(this.script);this.script=null}if(this.form){this.form.parentNode.removeChild(this.form);this.form=null;this.iframe=null}Polling.prototype.doClose.call(this)};JSONPPolling.prototype.doPoll=function(){var self=this;var script=document.createElement("script");if(this.script){this.script.parentNode.removeChild(this.script);this.script=null}script.async=true;script.src=this.uri();script.onerror=function(e){self.onError("jsonp poll error",e)};var insertAt=document.getElementsByTagName("script")[0];if(insertAt){insertAt.parentNode.insertBefore(script,insertAt)}else{(document.head||document.body).appendChild(script)}this.script=script;var isUAgecko="undefined"!=typeof navigator&&/gecko/i.test(navigator.userAgent);if(isUAgecko){setTimeout(function(){var iframe=document.createElement("iframe");document.body.appendChild(iframe);document.body.removeChild(iframe)},100)}};JSONPPolling.prototype.doWrite=function(data,fn){var self=this;if(!this.form){var form=document.createElement("form");var area=document.createElement("textarea");var id=this.iframeId="eio_iframe_"+this.index;var iframe;form.className="socketio";form.style.position="absolute";form.style.top="-1000px";form.style.left="-1000px";form.target=id;form.method="POST";form.setAttribute("accept-charset","utf-8");area.name="d";form.appendChild(area);document.body.appendChild(form);this.form=form;this.area=area}this.form.action=this.uri();function complete(){initIframe();fn()}function initIframe(){if(self.iframe){try{self.form.removeChild(self.iframe)}catch(e){self.onError("jsonp polling iframe removal error",e)}}try{var html='<iframe src="javascript:0" name="'+self.iframeId+'">';iframe=document.createElement(html)}catch(e){iframe=document.createElement("iframe");iframe.name=self.iframeId;iframe.src="javascript:0"}iframe.id=self.iframeId;self.form.appendChild(iframe);self.iframe=iframe}initIframe();data=data.replace(rEscapedNewline,"\\\n");this.area.value=data.replace(rNewline,"\\n");try{this.form.submit()}catch(e){}if(this.iframe.attachEvent){this.iframe.onreadystatechange=function(){if(self.iframe.readyState=="complete"){complete()}}}else{this.iframe.onload=complete}}}).call(this,typeof self!=="undefined"?self:typeof window!=="undefined"?window:typeof global!=="undefined"?global:{})},{"./polling":8,"component-inherit":16}],7:[function(_dereq_,module,exports){(function(global){var XMLHttpRequest=_dereq_("xmlhttprequest-ssl");var Polling=_dereq_("./polling");var Emitter=_dereq_("component-emitter");var inherit=_dereq_("component-inherit");var debug=_dereq_("debug")("engine.io-client:polling-xhr");module.exports=XHR;module.exports.Request=Request;function empty(){}function XHR(opts){Polling.call(this,opts);if(global.location){var isSSL="https:"==location.protocol;var port=location.port;if(!port){port=isSSL?443:80}this.xd=opts.hostname!=global.location.hostname||port!=opts.port;this.xs=opts.secure!=isSSL}else{this.extraHeaders=opts.extraHeaders}}inherit(XHR,Polling);XHR.prototype.supportsBinary=true;XHR.prototype.request=function(opts){opts=opts||{};opts.uri=this.uri();opts.xd=this.xd;opts.xs=this.xs;opts.agent=this.agent||false;opts.supportsBinary=this.supportsBinary;opts.enablesXDR=this.enablesXDR;opts.pfx=this.pfx;opts.key=this.key;opts.passphrase=this.passphrase;opts.cert=this.cert;opts.ca=this.ca;opts.ciphers=this.ciphers;opts.rejectUnauthorized=this.rejectUnauthorized;opts.extraHeaders=this.extraHeaders;return new Request(opts)};XHR.prototype.doWrite=function(data,fn){var isBinary=typeof data!=="string"&&data!==undefined;var req=this.request({method:"POST",data:data,isBinary:isBinary});var self=this;req.on("success",fn);req.on("error",function(err){self.onError("xhr post error",err)});this.sendXhr=req};XHR.prototype.doPoll=function(){debug("xhr poll");var req=this.request();var self=this;req.on("data",function(data){self.onData(data)});req.on("error",function(err){self.onError("xhr poll error",err)});this.pollXhr=req};function Request(opts){this.method=opts.method||"GET";this.uri=opts.uri;this.xd=!!opts.xd;this.xs=!!opts.xs;this.async=false!==opts.async;this.data=undefined!=opts.data?opts.data:null;this.agent=opts.agent;this.isBinary=opts.isBinary;this.supportsBinary=opts.supportsBinary;this.enablesXDR=opts.enablesXDR;this.pfx=opts.pfx;this.key=opts.key;this.passphrase=opts.passphrase;this.cert=opts.cert;this.ca=opts.ca;this.ciphers=opts.ciphers;this.rejectUnauthorized=opts.rejectUnauthorized;this.extraHeaders=opts.extraHeaders;this.create()}Emitter(Request.prototype);Request.prototype.create=function(){var opts={agent:this.agent,xdomain:this.xd,xscheme:this.xs,enablesXDR:this.enablesXDR};opts.pfx=this.pfx;opts.key=this.key;opts.passphrase=this.passphrase;opts.cert=this.cert;opts.ca=this.ca;opts.ciphers=this.ciphers;opts.rejectUnauthorized=this.rejectUnauthorized;var xhr=this.xhr=new XMLHttpRequest(opts);var self=this;try{debug("xhr open %s: %s",this.method,this.uri);xhr.open(this.method,this.uri,this.async);try{if(this.extraHeaders){xhr.setDisableHeaderCheck(true);for(var i in this.extraHeaders){if(this.extraHeaders.hasOwnProperty(i)){xhr.setRequestHeader(i,this.extraHeaders[i])}}}}catch(e){}if(this.supportsBinary){xhr.responseType="arraybuffer"}if("POST"==this.method){try{if(this.isBinary){xhr.setRequestHeader("Content-type","application/octet-stream")}else{xhr.setRequestHeader("Content-type","text/plain;charset=UTF-8")}}catch(e){}}if("withCredentials"in xhr){xhr.withCredentials=true}if(this.hasXDR()){xhr.onload=function(){self.onLoad()};xhr.onerror=function(){self.onError(xhr.responseText)}}else{xhr.onreadystatechange=function(){if(4!=xhr.readyState)return;if(200==xhr.status||1223==xhr.status){self.onLoad()}else{setTimeout(function(){self.onError(xhr.status)},0)}}}debug("xhr data %s",this.data);xhr.send(this.data)}catch(e){setTimeout(function(){self.onError(e)},0);return}if(global.document){this.index=Request.requestsCount++;Request.requests[this.index]=this}};Request.prototype.onSuccess=function(){this.emit("success");this.cleanup()};Request.prototype.onData=function(data){this.emit("data",data);this.onSuccess()};Request.prototype.onError=function(err){this.emit("error",err);this.cleanup(true)};Request.prototype.cleanup=function(fromError){if("undefined"==typeof this.xhr||null===this.xhr){return}if(this.hasXDR()){this.xhr.onload=this.xhr.onerror=empty}else{this.xhr.onreadystatechange=empty}if(fromError){try{this.xhr.abort()}catch(e){}}if(global.document){delete Request.requests[this.index]}this.xhr=null};Request.prototype.onLoad=function(){var data;try{var contentType;try{contentType=this.xhr.getResponseHeader("Content-Type").split(";")[0]}catch(e){}if(contentType==="application/octet-stream"){data=this.xhr.response}else{if(!this.supportsBinary){data=this.xhr.responseText}else{try{data=String.fromCharCode.apply(null,new Uint8Array(this.xhr.response))}catch(e){var ui8Arr=new Uint8Array(this.xhr.response);var dataArray=[];for(var idx=0,length=ui8Arr.length;idx<length;idx++){dataArray.push(ui8Arr[idx])}data=String.fromCharCode.apply(null,dataArray)}}}}catch(e){this.onError(e)}if(null!=data){this.onData(data)}};Request.prototype.hasXDR=function(){return"undefined"!==typeof global.XDomainRequest&&!this.xs&&this.enablesXDR};Request.prototype.abort=function(){this.cleanup()};if(global.document){Request.requestsCount=0;Request.requests={};if(global.attachEvent){global.attachEvent("onunload",unloadHandler)}else if(global.addEventListener){global.addEventListener("beforeunload",unloadHandler,false)}}function unloadHandler(){for(var i in Request.requests){if(Request.requests.hasOwnProperty(i)){Request.requests[i].abort()}}}}).call(this,typeof self!=="undefined"?self:typeof window!=="undefined"?window:typeof global!=="undefined"?global:{})},{"./polling":8,"component-emitter":15,"component-inherit":16,debug:17,"xmlhttprequest-ssl":10}],8:[function(_dereq_,module,exports){var Transport=_dereq_("../transport");var parseqs=_dereq_("parseqs");var parser=_dereq_("engine.io-parser");var inherit=_dereq_("component-inherit");var yeast=_dereq_("yeast");var debug=_dereq_("debug")("engine.io-client:polling");module.exports=Polling;var hasXHR2=function(){var XMLHttpRequest=_dereq_("xmlhttprequest-ssl");var xhr=new XMLHttpRequest({xdomain:false});return null!=xhr.responseType}();function Polling(opts){var forceBase64=opts&&opts.forceBase64;if(!hasXHR2||forceBase64){this.supportsBinary=false}Transport.call(this,opts)}inherit(Polling,Transport);Polling.prototype.name="polling";Polling.prototype.doOpen=function(){this.poll()};Polling.prototype.pause=function(onPause){var pending=0;var self=this;this.readyState="pausing";function pause(){debug("paused");self.readyState="paused";onPause()}if(this.polling||!this.writable){var total=0;if(this.polling){debug("we are currently polling - waiting to pause");total++;this.once("pollComplete",function(){debug("pre-pause polling complete");--total||pause()})}if(!this.writable){debug("we are currently writing - waiting to pause");total++;this.once("drain",function(){debug("pre-pause writing complete");--total||pause()})}}else{pause()}};Polling.prototype.poll=function(){debug("polling");this.polling=true;this.doPoll();this.emit("poll")};Polling.prototype.onData=function(data){var self=this;debug("polling got data %s",data);var callback=function(packet,index,total){if("opening"==self.readyState){self.onOpen()}if("close"==packet.type){self.onClose();return false}self.onPacket(packet)};parser.decodePayload(data,this.socket.binaryType,callback);if("closed"!=this.readyState){this.polling=false;this.emit("pollComplete");if("open"==this.readyState){this.poll()}else{debug('ignoring poll - transport state "%s"',this.readyState)}}};Polling.prototype.doClose=function(){var self=this;function close(){debug("writing close packet");self.write([{type:"close"}])}if("open"==this.readyState){debug("transport open - closing");close()}else{debug("transport not open - deferring close");this.once("open",close)}};Polling.prototype.write=function(packets){var self=this;this.writable=false;var callbackfn=function(){self.writable=true;self.emit("drain")};var self=this;parser.encodePayload(packets,this.supportsBinary,function(data){self.doWrite(data,callbackfn)})};Polling.prototype.uri=function(){var query=this.query||{};var schema=this.secure?"https":"http";var port="";if(false!==this.timestampRequests){query[this.timestampParam]=yeast()}if(!this.supportsBinary&&!query.sid){query.b64=1}query=parseqs.encode(query);if(this.port&&("https"==schema&&this.port!=443||"http"==schema&&this.port!=80)){port=":"+this.port}if(query.length){query="?"+query}var ipv6=this.hostname.indexOf(":")!==-1;return schema+"://"+(ipv6?"["+this.hostname+"]":this.hostname)+port+this.path+query}},{"../transport":4,"component-inherit":16,debug:17,"engine.io-parser":19,parseqs:27,"xmlhttprequest-ssl":10,yeast:30}],9:[function(_dereq_,module,exports){(function(global){var Transport=_dereq_("../transport");var parser=_dereq_("engine.io-parser");var parseqs=_dereq_("parseqs");var inherit=_dereq_("component-inherit");var yeast=_dereq_("yeast");var debug=_dereq_("debug")("engine.io-client:websocket");var BrowserWebSocket=global.WebSocket||global.MozWebSocket;var WebSocket=BrowserWebSocket;if(!WebSocket&&typeof window==="undefined"){try{WebSocket=_dereq_("ws")}catch(e){}}module.exports=WS;function WS(opts){var forceBase64=opts&&opts.forceBase64;if(forceBase64){this.supportsBinary=false}this.perMessageDeflate=opts.perMessageDeflate;Transport.call(this,opts)}inherit(WS,Transport);WS.prototype.name="websocket";WS.prototype.supportsBinary=true;WS.prototype.doOpen=function(){if(!this.check()){return}var self=this;var uri=this.uri();var protocols=void 0;var opts={agent:this.agent,perMessageDeflate:this.perMessageDeflate};opts.pfx=this.pfx;opts.key=this.key;opts.passphrase=this.passphrase;opts.cert=this.cert;opts.ca=this.ca;opts.ciphers=this.ciphers;opts.rejectUnauthorized=this.rejectUnauthorized;if(this.extraHeaders){opts.headers=this.extraHeaders}this.ws=BrowserWebSocket?new WebSocket(uri):new WebSocket(uri,protocols,opts);if(this.ws.binaryType===undefined){this.supportsBinary=false}if(this.ws.supports&&this.ws.supports.binary){this.supportsBinary=true;this.ws.binaryType="buffer"}else{this.ws.binaryType="arraybuffer"}this.addEventListeners()};WS.prototype.addEventListeners=function(){var self=this;this.ws.onopen=function(){self.onOpen()};this.ws.onclose=function(){self.onClose()};this.ws.onmessage=function(ev){self.onData(ev.data)};this.ws.onerror=function(e){self.onError("websocket error",e)}};if("undefined"!=typeof navigator&&/iPad|iPhone|iPod/i.test(navigator.userAgent)){WS.prototype.onData=function(data){var self=this;setTimeout(function(){Transport.prototype.onData.call(self,data)},0)}}WS.prototype.write=function(packets){var self=this;this.writable=false;var total=packets.length;for(var i=0,l=total;i<l;i++){(function(packet){parser.encodePacket(packet,self.supportsBinary,function(data){if(!BrowserWebSocket){var opts={};if(packet.options){opts.compress=packet.options.compress}if(self.perMessageDeflate){var len="string"==typeof data?global.Buffer.byteLength(data):data.length;if(len<self.perMessageDeflate.threshold){opts.compress=false}}}try{if(BrowserWebSocket){self.ws.send(data)}else{self.ws.send(data,opts)}}catch(e){debug("websocket closed before onclose event")}--total||done()})})(packets[i])}function done(){self.emit("flush");setTimeout(function(){self.writable=true;self.emit("drain")},0)}};WS.prototype.onClose=function(){Transport.prototype.onClose.call(this)};WS.prototype.doClose=function(){if(typeof this.ws!=="undefined"){this.ws.close()}};WS.prototype.uri=function(){var query=this.query||{};var schema=this.secure?"wss":"ws";var port="";if(this.port&&("wss"==schema&&this.port!=443||"ws"==schema&&this.port!=80)){port=":"+this.port}if(this.timestampRequests){query[this.timestampParam]=yeast()}if(!this.supportsBinary){query.b64=1}query=parseqs.encode(query);if(query.length){query="?"+query}var ipv6=this.hostname.indexOf(":")!==-1;return schema+"://"+(ipv6?"["+this.hostname+"]":this.hostname)+port+this.path+query};WS.prototype.check=function(){return!!WebSocket&&!("__initialize"in WebSocket&&this.name===WS.prototype.name)}}).call(this,typeof self!=="undefined"?self:typeof window!=="undefined"?window:typeof global!=="undefined"?global:{})},{"../transport":4,"component-inherit":16,debug:17,"engine.io-parser":19,parseqs:27,ws:undefined,yeast:30}],10:[function(_dereq_,module,exports){var hasCORS=_dereq_("has-cors");module.exports=function(opts){var xdomain=opts.xdomain;var xscheme=opts.xscheme;var enablesXDR=opts.enablesXDR;try{if("undefined"!=typeof XMLHttpRequest&&(!xdomain||hasCORS)){return new XMLHttpRequest}}catch(e){}try{if("undefined"!=typeof XDomainRequest&&!xscheme&&enablesXDR){return new XDomainRequest}}catch(e){}if(!xdomain){try{return new ActiveXObject("Microsoft.XMLHTTP")}catch(e){}}}},{"has-cors":22}],11:[function(_dereq_,module,exports){module.exports=after;function after(count,callback,err_cb){var bail=false;err_cb=err_cb||noop;proxy.count=count;return count===0?callback():proxy;function proxy(err,result){if(proxy.count<=0){throw new Error("after called too many times")}--proxy.count;if(err){bail=true;callback(err);callback=err_cb}else if(proxy.count===0&&!bail){callback(null,result)}}}function noop(){}},{}],12:[function(_dereq_,module,exports){module.exports=function(arraybuffer,start,end){var bytes=arraybuffer.byteLength;start=start||0;end=end||bytes;if(arraybuffer.slice){return arraybuffer.slice(start,end)}if(start<0){start+=bytes}if(end<0){end+=bytes}if(end>bytes){end=bytes}if(start>=bytes||start>=end||bytes===0){return new ArrayBuffer(0)}var abv=new Uint8Array(arraybuffer);var result=new Uint8Array(end-start);for(var i=start,ii=0;i<end;i++,ii++){result[ii]=abv[i]}return result.buffer}},{}],13:[function(_dereq_,module,exports){(function(chars){"use strict";exports.encode=function(arraybuffer){var bytes=new Uint8Array(arraybuffer),i,len=bytes.length,base64="";for(i=0;i<len;i+=3){base64+=chars[bytes[i]>>2];
  5694. base64+=chars[(bytes[i]&3)<<4|bytes[i+1]>>4];base64+=chars[(bytes[i+1]&15)<<2|bytes[i+2]>>6];base64+=chars[bytes[i+2]&63]}if(len%3===2){base64=base64.substring(0,base64.length-1)+"="}else if(len%3===1){base64=base64.substring(0,base64.length-2)+"=="}return base64};exports.decode=function(base64){var bufferLength=base64.length*.75,len=base64.length,i,p=0,encoded1,encoded2,encoded3,encoded4;if(base64[base64.length-1]==="="){bufferLength--;if(base64[base64.length-2]==="="){bufferLength--}}var arraybuffer=new ArrayBuffer(bufferLength),bytes=new Uint8Array(arraybuffer);for(i=0;i<len;i+=4){encoded1=chars.indexOf(base64[i]);encoded2=chars.indexOf(base64[i+1]);encoded3=chars.indexOf(base64[i+2]);encoded4=chars.indexOf(base64[i+3]);bytes[p++]=encoded1<<2|encoded2>>4;bytes[p++]=(encoded2&15)<<4|encoded3>>2;bytes[p++]=(encoded3&3)<<6|encoded4&63}return arraybuffer}})("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/")},{}],14:[function(_dereq_,module,exports){(function(global){var BlobBuilder=global.BlobBuilder||global.WebKitBlobBuilder||global.MSBlobBuilder||global.MozBlobBuilder;var blobSupported=function(){try{var a=new Blob(["hi"]);return a.size===2}catch(e){return false}}();var blobSupportsArrayBufferView=blobSupported&&function(){try{var b=new Blob([new Uint8Array([1,2])]);return b.size===2}catch(e){return false}}();var blobBuilderSupported=BlobBuilder&&BlobBuilder.prototype.append&&BlobBuilder.prototype.getBlob;function mapArrayBufferViews(ary){for(var i=0;i<ary.length;i++){var chunk=ary[i];if(chunk.buffer instanceof ArrayBuffer){var buf=chunk.buffer;if(chunk.byteLength!==buf.byteLength){var copy=new Uint8Array(chunk.byteLength);copy.set(new Uint8Array(buf,chunk.byteOffset,chunk.byteLength));buf=copy.buffer}ary[i]=buf}}}function BlobBuilderConstructor(ary,options){options=options||{};var bb=new BlobBuilder;mapArrayBufferViews(ary);for(var i=0;i<ary.length;i++){bb.append(ary[i])}return options.type?bb.getBlob(options.type):bb.getBlob()}function BlobConstructor(ary,options){mapArrayBufferViews(ary);return new Blob(ary,options||{})}module.exports=function(){if(blobSupported){return blobSupportsArrayBufferView?global.Blob:BlobConstructor}else if(blobBuilderSupported){return BlobBuilderConstructor}else{return undefined}}()}).call(this,typeof self!=="undefined"?self:typeof window!=="undefined"?window:typeof global!=="undefined"?global:{})},{}],15:[function(_dereq_,module,exports){module.exports=Emitter;function Emitter(obj){if(obj)return mixin(obj)}function mixin(obj){for(var key in Emitter.prototype){obj[key]=Emitter.prototype[key]}return obj}Emitter.prototype.on=Emitter.prototype.addEventListener=function(event,fn){this._callbacks=this._callbacks||{};(this._callbacks[event]=this._callbacks[event]||[]).push(fn);return this};Emitter.prototype.once=function(event,fn){var self=this;this._callbacks=this._callbacks||{};function on(){self.off(event,on);fn.apply(this,arguments)}on.fn=fn;this.on(event,on);return this};Emitter.prototype.off=Emitter.prototype.removeListener=Emitter.prototype.removeAllListeners=Emitter.prototype.removeEventListener=function(event,fn){this._callbacks=this._callbacks||{};if(0==arguments.length){this._callbacks={};return this}var callbacks=this._callbacks[event];if(!callbacks)return this;if(1==arguments.length){delete this._callbacks[event];return this}var cb;for(var i=0;i<callbacks.length;i++){cb=callbacks[i];if(cb===fn||cb.fn===fn){callbacks.splice(i,1);break}}return this};Emitter.prototype.emit=function(event){this._callbacks=this._callbacks||{};var args=[].slice.call(arguments,1),callbacks=this._callbacks[event];if(callbacks){callbacks=callbacks.slice(0);for(var i=0,len=callbacks.length;i<len;++i){callbacks[i].apply(this,args)}}return this};Emitter.prototype.listeners=function(event){this._callbacks=this._callbacks||{};return this._callbacks[event]||[]};Emitter.prototype.hasListeners=function(event){return!!this.listeners(event).length}},{}],16:[function(_dereq_,module,exports){module.exports=function(a,b){var fn=function(){};fn.prototype=b.prototype;a.prototype=new fn;a.prototype.constructor=a}},{}],17:[function(_dereq_,module,exports){exports=module.exports=_dereq_("./debug");exports.log=log;exports.formatArgs=formatArgs;exports.save=save;exports.load=load;exports.useColors=useColors;exports.storage="undefined"!=typeof chrome&&"undefined"!=typeof chrome.storage?chrome.storage.local:localstorage();exports.colors=["lightseagreen","forestgreen","goldenrod","dodgerblue","darkorchid","crimson"];function useColors(){return"WebkitAppearance"in document.documentElement.style||window.console&&(console.firebug||console.exception&&console.table)||navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/)&&parseInt(RegExp.$1,10)>=31}exports.formatters.j=function(v){return JSON.stringify(v)};function formatArgs(){var args=arguments;var useColors=this.useColors;args[0]=(useColors?"%c":"")+this.namespace+(useColors?" %c":" ")+args[0]+(useColors?"%c ":" ")+"+"+exports.humanize(this.diff);if(!useColors)return args;var c="color: "+this.color;args=[args[0],c,"color: inherit"].concat(Array.prototype.slice.call(args,1));var index=0;var lastC=0;args[0].replace(/%[a-z%]/g,function(match){if("%%"===match)return;index++;if("%c"===match){lastC=index}});args.splice(lastC,0,c);return args}function log(){return"object"===typeof console&&console.log&&Function.prototype.apply.call(console.log,console,arguments)}function save(namespaces){try{if(null==namespaces){exports.storage.removeItem("debug")}else{exports.storage.debug=namespaces}}catch(e){}}function load(){var r;try{r=exports.storage.debug}catch(e){}return r}exports.enable(load());function localstorage(){try{return window.localStorage}catch(e){}}},{"./debug":18}],18:[function(_dereq_,module,exports){exports=module.exports=debug;exports.coerce=coerce;exports.disable=disable;exports.enable=enable;exports.enabled=enabled;exports.humanize=_dereq_("ms");exports.names=[];exports.skips=[];exports.formatters={};var prevColor=0;var prevTime;function selectColor(){return exports.colors[prevColor++%exports.colors.length]}function debug(namespace){function disabled(){}disabled.enabled=false;function enabled(){var self=enabled;var curr=+new Date;var ms=curr-(prevTime||curr);self.diff=ms;self.prev=prevTime;self.curr=curr;prevTime=curr;if(null==self.useColors)self.useColors=exports.useColors();if(null==self.color&&self.useColors)self.color=selectColor();var args=Array.prototype.slice.call(arguments);args[0]=exports.coerce(args[0]);if("string"!==typeof args[0]){args=["%o"].concat(args)}var index=0;args[0]=args[0].replace(/%([a-z%])/g,function(match,format){if(match==="%%")return match;index++;var formatter=exports.formatters[format];if("function"===typeof formatter){var val=args[index];match=formatter.call(self,val);args.splice(index,1);index--}return match});if("function"===typeof exports.formatArgs){args=exports.formatArgs.apply(self,args)}var logFn=enabled.log||exports.log||console.log.bind(console);logFn.apply(self,args)}enabled.enabled=true;var fn=exports.enabled(namespace)?enabled:disabled;fn.namespace=namespace;return fn}function enable(namespaces){exports.save(namespaces);var split=(namespaces||"").split(/[\s,]+/);var len=split.length;for(var i=0;i<len;i++){if(!split[i])continue;namespaces=split[i].replace(/\*/g,".*?");if(namespaces[0]==="-"){exports.skips.push(new RegExp("^"+namespaces.substr(1)+"$"))}else{exports.names.push(new RegExp("^"+namespaces+"$"))}}}function disable(){exports.enable("")}function enabled(name){var i,len;for(i=0,len=exports.skips.length;i<len;i++){if(exports.skips[i].test(name)){return false}}for(i=0,len=exports.names.length;i<len;i++){if(exports.names[i].test(name)){return true}}return false}function coerce(val){if(val instanceof Error)return val.stack||val.message;return val}},{ms:25}],19:[function(_dereq_,module,exports){(function(global){var keys=_dereq_("./keys");var hasBinary=_dereq_("has-binary");var sliceBuffer=_dereq_("arraybuffer.slice");var base64encoder=_dereq_("base64-arraybuffer");var after=_dereq_("after");var utf8=_dereq_("utf8");var isAndroid=navigator.userAgent.match(/Android/i);var isPhantomJS=/PhantomJS/i.test(navigator.userAgent);var dontSendBlobs=isAndroid||isPhantomJS;exports.protocol=3;var packets=exports.packets={open:0,close:1,ping:2,pong:3,message:4,upgrade:5,noop:6};var packetslist=keys(packets);var err={type:"error",data:"parser error"};var Blob=_dereq_("blob");exports.encodePacket=function(packet,supportsBinary,utf8encode,callback){if("function"==typeof supportsBinary){callback=supportsBinary;supportsBinary=false}if("function"==typeof utf8encode){callback=utf8encode;utf8encode=null}var data=packet.data===undefined?undefined:packet.data.buffer||packet.data;if(global.ArrayBuffer&&data instanceof ArrayBuffer){return encodeArrayBuffer(packet,supportsBinary,callback)}else if(Blob&&data instanceof global.Blob){return encodeBlob(packet,supportsBinary,callback)}if(data&&data.base64){return encodeBase64Object(packet,callback)}var encoded=packets[packet.type];if(undefined!==packet.data){encoded+=utf8encode?utf8.encode(String(packet.data)):String(packet.data)}return callback(""+encoded)};function encodeBase64Object(packet,callback){var message="b"+exports.packets[packet.type]+packet.data.data;return callback(message)}function encodeArrayBuffer(packet,supportsBinary,callback){if(!supportsBinary){return exports.encodeBase64Packet(packet,callback)}var data=packet.data;var contentArray=new Uint8Array(data);var resultBuffer=new Uint8Array(1+data.byteLength);resultBuffer[0]=packets[packet.type];for(var i=0;i<contentArray.length;i++){resultBuffer[i+1]=contentArray[i]}return callback(resultBuffer.buffer)}function encodeBlobAsArrayBuffer(packet,supportsBinary,callback){if(!supportsBinary){return exports.encodeBase64Packet(packet,callback)}var fr=new FileReader;fr.onload=function(){packet.data=fr.result;exports.encodePacket(packet,supportsBinary,true,callback)};return fr.readAsArrayBuffer(packet.data)}function encodeBlob(packet,supportsBinary,callback){if(!supportsBinary){return exports.encodeBase64Packet(packet,callback)}if(dontSendBlobs){return encodeBlobAsArrayBuffer(packet,supportsBinary,callback)}var length=new Uint8Array(1);length[0]=packets[packet.type];var blob=new Blob([length.buffer,packet.data]);return callback(blob)}exports.encodeBase64Packet=function(packet,callback){var message="b"+exports.packets[packet.type];if(Blob&&packet.data instanceof global.Blob){var fr=new FileReader;fr.onload=function(){var b64=fr.result.split(",")[1];callback(message+b64)};return fr.readAsDataURL(packet.data)}var b64data;try{b64data=String.fromCharCode.apply(null,new Uint8Array(packet.data))}catch(e){var typed=new Uint8Array(packet.data);var basic=new Array(typed.length);for(var i=0;i<typed.length;i++){basic[i]=typed[i]}b64data=String.fromCharCode.apply(null,basic)}message+=global.btoa(b64data);return callback(message)};exports.decodePacket=function(data,binaryType,utf8decode){if(typeof data=="string"||data===undefined){if(data.charAt(0)=="b"){return exports.decodeBase64Packet(data.substr(1),binaryType)}if(utf8decode){try{data=utf8.decode(data)}catch(e){return err}}var type=data.charAt(0);if(Number(type)!=type||!packetslist[type]){return err}if(data.length>1){return{type:packetslist[type],data:data.substring(1)}}else{return{type:packetslist[type]}}}var asArray=new Uint8Array(data);var type=asArray[0];var rest=sliceBuffer(data,1);if(Blob&&binaryType==="blob"){rest=new Blob([rest])}return{type:packetslist[type],data:rest}};exports.decodeBase64Packet=function(msg,binaryType){var type=packetslist[msg.charAt(0)];if(!global.ArrayBuffer){return{type:type,data:{base64:true,data:msg.substr(1)}}}var data=base64encoder.decode(msg.substr(1));if(binaryType==="blob"&&Blob){data=new Blob([data])}return{type:type,data:data}};exports.encodePayload=function(packets,supportsBinary,callback){if(typeof supportsBinary=="function"){callback=supportsBinary;supportsBinary=null}var isBinary=hasBinary(packets);if(supportsBinary&&isBinary){if(Blob&&!dontSendBlobs){return exports.encodePayloadAsBlob(packets,callback)}return exports.encodePayloadAsArrayBuffer(packets,callback)}if(!packets.length){return callback("0:")}function setLengthHeader(message){return message.length+":"+message}function encodeOne(packet,doneCallback){exports.encodePacket(packet,!isBinary?false:supportsBinary,true,function(message){doneCallback(null,setLengthHeader(message))})}map(packets,encodeOne,function(err,results){return callback(results.join(""))})};function map(ary,each,done){var result=new Array(ary.length);var next=after(ary.length,done);var eachWithIndex=function(i,el,cb){each(el,function(error,msg){result[i]=msg;cb(error,result)})};for(var i=0;i<ary.length;i++){eachWithIndex(i,ary[i],next)}}exports.decodePayload=function(data,binaryType,callback){if(typeof data!="string"){return exports.decodePayloadAsBinary(data,binaryType,callback)}if(typeof binaryType==="function"){callback=binaryType;binaryType=null}var packet;if(data==""){return callback(err,0,1)}var length="",n,msg;for(var i=0,l=data.length;i<l;i++){var chr=data.charAt(i);if(":"!=chr){length+=chr}else{if(""==length||length!=(n=Number(length))){return callback(err,0,1)}msg=data.substr(i+1,n);if(length!=msg.length){return callback(err,0,1)}if(msg.length){packet=exports.decodePacket(msg,binaryType,true);if(err.type==packet.type&&err.data==packet.data){return callback(err,0,1)}var ret=callback(packet,i+n,l);if(false===ret)return}i+=n;length=""}}if(length!=""){return callback(err,0,1)}};exports.encodePayloadAsArrayBuffer=function(packets,callback){if(!packets.length){return callback(new ArrayBuffer(0))}function encodeOne(packet,doneCallback){exports.encodePacket(packet,true,true,function(data){return doneCallback(null,data)})}map(packets,encodeOne,function(err,encodedPackets){var totalLength=encodedPackets.reduce(function(acc,p){var len;if(typeof p==="string"){len=p.length}else{len=p.byteLength}return acc+len.toString().length+len+2},0);var resultArray=new Uint8Array(totalLength);var bufferIndex=0;encodedPackets.forEach(function(p){var isString=typeof p==="string";var ab=p;if(isString){var view=new Uint8Array(p.length);for(var i=0;i<p.length;i++){view[i]=p.charCodeAt(i)}ab=view.buffer}if(isString){resultArray[bufferIndex++]=0}else{resultArray[bufferIndex++]=1}var lenStr=ab.byteLength.toString();for(var i=0;i<lenStr.length;i++){resultArray[bufferIndex++]=parseInt(lenStr[i])}resultArray[bufferIndex++]=255;var view=new Uint8Array(ab);for(var i=0;i<view.length;i++){resultArray[bufferIndex++]=view[i]}});return callback(resultArray.buffer)})};exports.encodePayloadAsBlob=function(packets,callback){function encodeOne(packet,doneCallback){exports.encodePacket(packet,true,true,function(encoded){var binaryIdentifier=new Uint8Array(1);binaryIdentifier[0]=1;if(typeof encoded==="string"){var view=new Uint8Array(encoded.length);for(var i=0;i<encoded.length;i++){view[i]=encoded.charCodeAt(i)}encoded=view.buffer;binaryIdentifier[0]=0}var len=encoded instanceof ArrayBuffer?encoded.byteLength:encoded.size;var lenStr=len.toString();var lengthAry=new Uint8Array(lenStr.length+1);for(var i=0;i<lenStr.length;i++){lengthAry[i]=parseInt(lenStr[i])}lengthAry[lenStr.length]=255;if(Blob){var blob=new Blob([binaryIdentifier.buffer,lengthAry.buffer,encoded]);doneCallback(null,blob)}})}map(packets,encodeOne,function(err,results){return callback(new Blob(results))})};exports.decodePayloadAsBinary=function(data,binaryType,callback){if(typeof binaryType==="function"){callback=binaryType;binaryType=null}var bufferTail=data;var buffers=[];var numberTooLong=false;while(bufferTail.byteLength>0){var tailArray=new Uint8Array(bufferTail);var isString=tailArray[0]===0;var msgLength="";for(var i=1;;i++){if(tailArray[i]==255)break;if(msgLength.length>310){numberTooLong=true;break}msgLength+=tailArray[i]}if(numberTooLong)return callback(err,0,1);bufferTail=sliceBuffer(bufferTail,2+msgLength.length);msgLength=parseInt(msgLength);var msg=sliceBuffer(bufferTail,0,msgLength);if(isString){try{msg=String.fromCharCode.apply(null,new Uint8Array(msg))}catch(e){var typed=new Uint8Array(msg);msg="";for(var i=0;i<typed.length;i++){msg+=String.fromCharCode(typed[i])}}}buffers.push(msg);bufferTail=sliceBuffer(bufferTail,msgLength)}var total=buffers.length;buffers.forEach(function(buffer,i){callback(exports.decodePacket(buffer,binaryType,true),i,total)})}}).call(this,typeof self!=="undefined"?self:typeof window!=="undefined"?window:typeof global!=="undefined"?global:{})},{"./keys":20,after:11,"arraybuffer.slice":12,"base64-arraybuffer":13,blob:14,"has-binary":21,utf8:29}],20:[function(_dereq_,module,exports){module.exports=Object.keys||function keys(obj){var arr=[];var has=Object.prototype.hasOwnProperty;for(var i in obj){if(has.call(obj,i)){arr.push(i)}}return arr}},{}],21:[function(_dereq_,module,exports){(function(global){var isArray=_dereq_("isarray");module.exports=hasBinary;function hasBinary(data){function _hasBinary(obj){if(!obj)return false;if(global.Buffer&&global.Buffer.isBuffer(obj)||global.ArrayBuffer&&obj instanceof ArrayBuffer||global.Blob&&obj instanceof Blob||global.File&&obj instanceof File){return true}if(isArray(obj)){for(var i=0;i<obj.length;i++){if(_hasBinary(obj[i])){return true}}}else if(obj&&"object"==typeof obj){if(obj.toJSON){obj=obj.toJSON()}for(var key in obj){if(Object.prototype.hasOwnProperty.call(obj,key)&&_hasBinary(obj[key])){return true}}}return false}return _hasBinary(data)}}).call(this,typeof self!=="undefined"?self:typeof window!=="undefined"?window:typeof global!=="undefined"?global:{})},{isarray:24}],22:[function(_dereq_,module,exports){try{module.exports=typeof XMLHttpRequest!=="undefined"&&"withCredentials"in new XMLHttpRequest}catch(err){module.exports=false}},{}],23:[function(_dereq_,module,exports){var indexOf=[].indexOf;module.exports=function(arr,obj){if(indexOf)return arr.indexOf(obj);for(var i=0;i<arr.length;++i){if(arr[i]===obj)return i}return-1}},{}],24:[function(_dereq_,module,exports){module.exports=Array.isArray||function(arr){return Object.prototype.toString.call(arr)=="[object Array]"}},{}],25:[function(_dereq_,module,exports){var s=1e3;var m=s*60;var h=m*60;var d=h*24;var y=d*365.25;module.exports=function(val,options){options=options||{};if("string"==typeof val)return parse(val);return options.long?long(val):short(val)};function parse(str){str=""+str;if(str.length>1e4)return;var match=/^((?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec(str);if(!match)return;var n=parseFloat(match[1]);var type=(match[2]||"ms").toLowerCase();switch(type){case"years":case"year":case"yrs":case"yr":case"y":return n*y;case"days":case"day":case"d":return n*d;case"hours":case"hour":case"hrs":case"hr":case"h":return n*h;case"minutes":case"minute":case"mins":case"min":case"m":return n*m;case"seconds":case"second":case"secs":case"sec":case"s":return n*s;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return n}}function short(ms){if(ms>=d)return Math.round(ms/d)+"d";if(ms>=h)return Math.round(ms/h)+"h";if(ms>=m)return Math.round(ms/m)+"m";if(ms>=s)return Math.round(ms/s)+"s";return ms+"ms"}function long(ms){return plural(ms,d,"day")||plural(ms,h,"hour")||plural(ms,m,"minute")||plural(ms,s,"second")||ms+" ms"}function plural(ms,n,name){if(ms<n)return;if(ms<n*1.5)return Math.floor(ms/n)+" "+name;return Math.ceil(ms/n)+" "+name+"s"}},{}],26:[function(_dereq_,module,exports){(function(global){var rvalidchars=/^[\],:{}\s]*$/;var rvalidescape=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g;var rvalidtokens=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g;var rvalidbraces=/(?:^|:|,)(?:\s*\[)+/g;var rtrimLeft=/^\s+/;var rtrimRight=/\s+$/;module.exports=function parsejson(data){if("string"!=typeof data||!data){return null}data=data.replace(rtrimLeft,"").replace(rtrimRight,"");if(global.JSON&&JSON.parse){return JSON.parse(data)}if(rvalidchars.test(data.replace(rvalidescape,"@").replace(rvalidtokens,"]").replace(rvalidbraces,""))){return new Function("return "+data)()}}}).call(this,typeof self!=="undefined"?self:typeof window!=="undefined"?window:typeof global!=="undefined"?global:{})},{}],27:[function(_dereq_,module,exports){exports.encode=function(obj){var str="";for(var i in obj){if(obj.hasOwnProperty(i)){if(str.length)str+="&";str+=encodeURIComponent(i)+"="+encodeURIComponent(obj[i])}}return str};exports.decode=function(qs){var qry={};var pairs=qs.split("&");for(var i=0,l=pairs.length;i<l;i++){var pair=pairs[i].split("=");qry[decodeURIComponent(pair[0])]=decodeURIComponent(pair[1])}return qry}},{}],28:[function(_dereq_,module,exports){var re=/^(?:(?![^:@]+:[^:@\/]*@)(http|https|ws|wss):\/\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?((?:[a-f0-9]{0,4}:){2,7}[a-f0-9]{0,4}|[^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/;var parts=["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"];module.exports=function parseuri(str){var src=str,b=str.indexOf("["),e=str.indexOf("]");if(b!=-1&&e!=-1){str=str.substring(0,b)+str.substring(b,e).replace(/:/g,";")+str.substring(e,str.length)}var m=re.exec(str||""),uri={},i=14;while(i--){uri[parts[i]]=m[i]||""}if(b!=-1&&e!=-1){uri.source=src;uri.host=uri.host.substring(1,uri.host.length-1).replace(/;/g,":");uri.authority=uri.authority.replace("[","").replace("]","").replace(/;/g,":");uri.ipv6uri=true}return uri}},{}],29:[function(_dereq_,module,exports){(function(global){(function(root){var freeExports=typeof exports=="object"&&exports;var freeModule=typeof module=="object"&&module&&module.exports==freeExports&&module;var freeGlobal=typeof global=="object"&&global;if(freeGlobal.global===freeGlobal||freeGlobal.window===freeGlobal){root=freeGlobal}var stringFromCharCode=String.fromCharCode;function ucs2decode(string){var output=[];var counter=0;var length=string.length;var value;var extra;while(counter<length){value=string.charCodeAt(counter++);if(value>=55296&&value<=56319&&counter<length){extra=string.charCodeAt(counter++);if((extra&64512)==56320){output.push(((value&1023)<<10)+(extra&1023)+65536)}else{output.push(value);counter--}}else{output.push(value)}}return output}function ucs2encode(array){var length=array.length;var index=-1;var value;var output="";while(++index<length){value=array[index];if(value>65535){value-=65536;output+=stringFromCharCode(value>>>10&1023|55296);value=56320|value&1023}output+=stringFromCharCode(value)}return output}function checkScalarValue(codePoint){if(codePoint>=55296&&codePoint<=57343){throw Error("Lone surrogate U+"+codePoint.toString(16).toUpperCase()+" is not a scalar value")}}function createByte(codePoint,shift){return stringFromCharCode(codePoint>>shift&63|128)}function encodeCodePoint(codePoint){if((codePoint&4294967168)==0){return stringFromCharCode(codePoint)}var symbol="";if((codePoint&4294965248)==0){symbol=stringFromCharCode(codePoint>>6&31|192)}else if((codePoint&4294901760)==0){checkScalarValue(codePoint);symbol=stringFromCharCode(codePoint>>12&15|224);symbol+=createByte(codePoint,6)}else if((codePoint&4292870144)==0){symbol=stringFromCharCode(codePoint>>18&7|240);symbol+=createByte(codePoint,12);symbol+=createByte(codePoint,6)}symbol+=stringFromCharCode(codePoint&63|128);return symbol}function utf8encode(string){var codePoints=ucs2decode(string);var length=codePoints.length;var index=-1;var codePoint;var byteString="";while(++index<length){codePoint=codePoints[index];byteString+=encodeCodePoint(codePoint)}return byteString}function readContinuationByte(){if(byteIndex>=byteCount){throw Error("Invalid byte index")}var continuationByte=byteArray[byteIndex]&255;byteIndex++;if((continuationByte&192)==128){return continuationByte&63}throw Error("Invalid continuation byte")}function decodeSymbol(){var byte1;var byte2;var byte3;var byte4;var codePoint;if(byteIndex>byteCount){throw Error("Invalid byte index")}if(byteIndex==byteCount){return false}byte1=byteArray[byteIndex]&255;byteIndex++;if((byte1&128)==0){return byte1}if((byte1&224)==192){var byte2=readContinuationByte();codePoint=(byte1&31)<<6|byte2;if(codePoint>=128){return codePoint}else{throw Error("Invalid continuation byte")}}if((byte1&240)==224){byte2=readContinuationByte();byte3=readContinuationByte();codePoint=(byte1&15)<<12|byte2<<6|byte3;if(codePoint>=2048){checkScalarValue(codePoint);return codePoint}else{throw Error("Invalid continuation byte")}}if((byte1&248)==240){byte2=readContinuationByte();byte3=readContinuationByte();byte4=readContinuationByte();codePoint=(byte1&15)<<18|byte2<<12|byte3<<6|byte4;if(codePoint>=65536&&codePoint<=1114111){return codePoint}}throw Error("Invalid UTF-8 detected")}var byteArray;var byteCount;var byteIndex;function utf8decode(byteString){byteArray=ucs2decode(byteString);byteCount=byteArray.length;byteIndex=0;var codePoints=[];var tmp;while((tmp=decodeSymbol())!==false){codePoints.push(tmp)}return ucs2encode(codePoints)}var utf8={version:"2.0.0",encode:utf8encode,decode:utf8decode};if(typeof define=="function"&&typeof define.amd=="object"&&define.amd){define(function(){return utf8})}else if(freeExports&&!freeExports.nodeType){if(freeModule){freeModule.exports=utf8}else{var object={};var hasOwnProperty=object.hasOwnProperty;for(var key in utf8){hasOwnProperty.call(utf8,key)&&(freeExports[key]=utf8[key])}}}else{root.utf8=utf8}})(this)}).call(this,typeof self!=="undefined"?self:typeof window!=="undefined"?window:typeof global!=="undefined"?global:{})},{}],30:[function(_dereq_,module,exports){"use strict";var alphabet="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-_".split(""),length=64,map={},seed=0,i=0,prev;function encode(num){var encoded="";do{encoded=alphabet[num%length]+encoded;num=Math.floor(num/length)}while(num>0);return encoded}function decode(str){var decoded=0;for(i=0;i<str.length;i++){decoded=decoded*length+map[str.charAt(i)]}return decoded}function yeast(){var now=encode(+new Date);if(now!==prev)return seed=0,prev=now;return now+"."+encode(seed++)}for(;i<length;i++)map[alphabet[i]]=i;yeast.encode=encode;yeast.decode=decode;module.exports=yeast},{}],31:[function(_dereq_,module,exports){var url=_dereq_("./url");var parser=_dereq_("socket.io-parser");var Manager=_dereq_("./manager");var debug=_dereq_("debug")("socket.io-client");module.exports=exports=lookup;var cache=exports.managers={};function lookup(uri,opts){if(typeof uri=="object"){opts=uri;uri=undefined}opts=opts||{};var parsed=url(uri);var source=parsed.source;var id=parsed.id;var path=parsed.path;var sameNamespace=cache[id]&&path in cache[id].nsps;var newConnection=opts.forceNew||opts["force new connection"]||false===opts.multiplex||sameNamespace;var io;if(newConnection){debug("ignoring socket cache for %s",source);io=Manager(source,opts)}else{if(!cache[id]){debug("new io instance for %s",source);cache[id]=Manager(source,opts)}io=cache[id]}return io.socket(parsed.path)}exports.protocol=parser.protocol;exports.connect=lookup;exports.Manager=_dereq_("./manager");exports.Socket=_dereq_("./socket")},{"./manager":32,"./socket":34,"./url":35,debug:39,"socket.io-parser":47}],32:[function(_dereq_,module,exports){var eio=_dereq_("engine.io-client");var Socket=_dereq_("./socket");var Emitter=_dereq_("component-emitter");var parser=_dereq_("socket.io-parser");var on=_dereq_("./on");var bind=_dereq_("component-bind");var debug=_dereq_("debug")("socket.io-client:manager");var indexOf=_dereq_("indexof");var Backoff=_dereq_("backo2");var has=Object.prototype.hasOwnProperty;module.exports=Manager;function Manager(uri,opts){if(!(this instanceof Manager))return new Manager(uri,opts);if(uri&&"object"==typeof uri){opts=uri;uri=undefined}opts=opts||{};opts.path=opts.path||"/socket.io";this.nsps={};this.subs=[];this.opts=opts;this.reconnection(opts.reconnection!==false);this.reconnectionAttempts(opts.reconnectionAttempts||Infinity);this.reconnectionDelay(opts.reconnectionDelay||1e3);this.reconnectionDelayMax(opts.reconnectionDelayMax||5e3);this.randomizationFactor(opts.randomizationFactor||.5);this.backoff=new Backoff({min:this.reconnectionDelay(),max:this.reconnectionDelayMax(),jitter:this.randomizationFactor()});this.timeout(null==opts.timeout?2e4:opts.timeout);this.readyState="closed";this.uri=uri;this.connecting=[];this.lastPing=null;this.encoding=false;this.packetBuffer=[];this.encoder=new parser.Encoder;this.decoder=new parser.Decoder;this.autoConnect=opts.autoConnect!==false;if(this.autoConnect)this.open()}Manager.prototype.emitAll=function(){this.emit.apply(this,arguments);for(var nsp in this.nsps){if(has.call(this.nsps,nsp)){this.nsps[nsp].emit.apply(this.nsps[nsp],arguments)}}};Manager.prototype.updateSocketIds=function(){for(var nsp in this.nsps){if(has.call(this.nsps,nsp)){this.nsps[nsp].id=this.engine.id}}};Emitter(Manager.prototype);Manager.prototype.reconnection=function(v){if(!arguments.length)return this._reconnection;this._reconnection=!!v;return this};Manager.prototype.reconnectionAttempts=function(v){if(!arguments.length)return this._reconnectionAttempts;this._reconnectionAttempts=v;return this};Manager.prototype.reconnectionDelay=function(v){if(!arguments.length)return this._reconnectionDelay;this._reconnectionDelay=v;this.backoff&&this.backoff.setMin(v);return this};Manager.prototype.randomizationFactor=function(v){if(!arguments.length)return this._randomizationFactor;this._randomizationFactor=v;this.backoff&&this.backoff.setJitter(v);return this};Manager.prototype.reconnectionDelayMax=function(v){if(!arguments.length)return this._reconnectionDelayMax;this._reconnectionDelayMax=v;this.backoff&&this.backoff.setMax(v);return this};Manager.prototype.timeout=function(v){if(!arguments.length)return this._timeout;this._timeout=v;return this};Manager.prototype.maybeReconnectOnOpen=function(){if(!this.reconnecting&&this._reconnection&&this.backoff.attempts===0){this.reconnect()}};Manager.prototype.open=Manager.prototype.connect=function(fn){debug("readyState %s",this.readyState);if(~this.readyState.indexOf("open"))return this;debug("opening %s",this.uri);this.engine=eio(this.uri,this.opts);var socket=this.engine;var self=this;this.readyState="opening";this.skipReconnect=false;var openSub=on(socket,"open",function(){self.onopen();fn&&fn()});var errorSub=on(socket,"error",function(data){debug("connect_error");self.cleanup();self.readyState="closed";self.emitAll("connect_error",data);if(fn){var err=new Error("Connection error");err.data=data;fn(err)}else{self.maybeReconnectOnOpen()}});if(false!==this._timeout){var timeout=this._timeout;debug("connect attempt will timeout after %d",timeout);var timer=setTimeout(function(){debug("connect attempt timed out after %d",timeout);openSub.destroy();socket.close();socket.emit("error","timeout");self.emitAll("connect_timeout",timeout)},timeout);this.subs.push({destroy:function(){clearTimeout(timer)}})}this.subs.push(openSub);this.subs.push(errorSub);return this};Manager.prototype.onopen=function(){debug("open");this.cleanup();this.readyState="open";this.emit("open");var socket=this.engine;this.subs.push(on(socket,"data",bind(this,"ondata")));this.subs.push(on(socket,"ping",bind(this,"onping")));this.subs.push(on(socket,"pong",bind(this,"onpong")));this.subs.push(on(socket,"error",bind(this,"onerror")));this.subs.push(on(socket,"close",bind(this,"onclose")));this.subs.push(on(this.decoder,"decoded",bind(this,"ondecoded")))};Manager.prototype.onping=function(){this.lastPing=new Date;this.emitAll("ping")};Manager.prototype.onpong=function(){this.emitAll("pong",new Date-this.lastPing)};Manager.prototype.ondata=function(data){this.decoder.add(data)};Manager.prototype.ondecoded=function(packet){this.emit("packet",packet)};Manager.prototype.onerror=function(err){debug("error",err);this.emitAll("error",err)};Manager.prototype.socket=function(nsp){var socket=this.nsps[nsp];if(!socket){socket=new Socket(this,nsp);this.nsps[nsp]=socket;var self=this;socket.on("connecting",onConnecting);
  5695. socket.on("connect",function(){socket.id=self.engine.id});if(this.autoConnect){onConnecting()}}function onConnecting(){if(!~indexOf(self.connecting,socket)){self.connecting.push(socket)}}return socket};Manager.prototype.destroy=function(socket){var index=indexOf(this.connecting,socket);if(~index)this.connecting.splice(index,1);if(this.connecting.length)return;this.close()};Manager.prototype.packet=function(packet){debug("writing packet %j",packet);var self=this;if(!self.encoding){self.encoding=true;this.encoder.encode(packet,function(encodedPackets){for(var i=0;i<encodedPackets.length;i++){self.engine.write(encodedPackets[i],packet.options)}self.encoding=false;self.processPacketQueue()})}else{self.packetBuffer.push(packet)}};Manager.prototype.processPacketQueue=function(){if(this.packetBuffer.length>0&&!this.encoding){var pack=this.packetBuffer.shift();this.packet(pack)}};Manager.prototype.cleanup=function(){debug("cleanup");var sub;while(sub=this.subs.shift())sub.destroy();this.packetBuffer=[];this.encoding=false;this.lastPing=null;this.decoder.destroy()};Manager.prototype.close=Manager.prototype.disconnect=function(){debug("disconnect");this.skipReconnect=true;this.reconnecting=false;if("opening"==this.readyState){this.cleanup()}this.backoff.reset();this.readyState="closed";if(this.engine)this.engine.close()};Manager.prototype.onclose=function(reason){debug("onclose");this.cleanup();this.backoff.reset();this.readyState="closed";this.emit("close",reason);if(this._reconnection&&!this.skipReconnect){this.reconnect()}};Manager.prototype.reconnect=function(){if(this.reconnecting||this.skipReconnect)return this;var self=this;if(this.backoff.attempts>=this._reconnectionAttempts){debug("reconnect failed");this.backoff.reset();this.emitAll("reconnect_failed");this.reconnecting=false}else{var delay=this.backoff.duration();debug("will wait %dms before reconnect attempt",delay);this.reconnecting=true;var timer=setTimeout(function(){if(self.skipReconnect)return;debug("attempting reconnect");self.emitAll("reconnect_attempt",self.backoff.attempts);self.emitAll("reconnecting",self.backoff.attempts);if(self.skipReconnect)return;self.open(function(err){if(err){debug("reconnect attempt error");self.reconnecting=false;self.reconnect();self.emitAll("reconnect_error",err.data)}else{debug("reconnect success");self.onreconnect()}})},delay);this.subs.push({destroy:function(){clearTimeout(timer)}})}};Manager.prototype.onreconnect=function(){var attempt=this.backoff.attempts;this.reconnecting=false;this.backoff.reset();this.updateSocketIds();this.emitAll("reconnect",attempt)}},{"./on":33,"./socket":34,backo2:36,"component-bind":37,"component-emitter":38,debug:39,"engine.io-client":1,indexof:42,"socket.io-parser":47}],33:[function(_dereq_,module,exports){module.exports=on;function on(obj,ev,fn){obj.on(ev,fn);return{destroy:function(){obj.removeListener(ev,fn)}}}},{}],34:[function(_dereq_,module,exports){var parser=_dereq_("socket.io-parser");var Emitter=_dereq_("component-emitter");var toArray=_dereq_("to-array");var on=_dereq_("./on");var bind=_dereq_("component-bind");var debug=_dereq_("debug")("socket.io-client:socket");var hasBin=_dereq_("has-binary");module.exports=exports=Socket;var events={connect:1,connect_error:1,connect_timeout:1,connecting:1,disconnect:1,error:1,reconnect:1,reconnect_attempt:1,reconnect_failed:1,reconnect_error:1,reconnecting:1,ping:1,pong:1};var emit=Emitter.prototype.emit;function Socket(io,nsp){this.io=io;this.nsp=nsp;this.json=this;this.ids=0;this.acks={};this.receiveBuffer=[];this.sendBuffer=[];this.connected=false;this.disconnected=true;if(this.io.autoConnect)this.open()}Emitter(Socket.prototype);Socket.prototype.subEvents=function(){if(this.subs)return;var io=this.io;this.subs=[on(io,"open",bind(this,"onopen")),on(io,"packet",bind(this,"onpacket")),on(io,"close",bind(this,"onclose"))]};Socket.prototype.open=Socket.prototype.connect=function(){if(this.connected)return this;this.subEvents();this.io.open();if("open"==this.io.readyState)this.onopen();this.emit("connecting");return this};Socket.prototype.send=function(){var args=toArray(arguments);args.unshift("message");this.emit.apply(this,args);return this};Socket.prototype.emit=function(ev){if(events.hasOwnProperty(ev)){emit.apply(this,arguments);return this}var args=toArray(arguments);var parserType=parser.EVENT;if(hasBin(args)){parserType=parser.BINARY_EVENT}var packet={type:parserType,data:args};packet.options={};packet.options.compress=!this.flags||false!==this.flags.compress;if("function"==typeof args[args.length-1]){debug("emitting packet with ack id %d",this.ids);this.acks[this.ids]=args.pop();packet.id=this.ids++}if(this.connected){this.packet(packet)}else{this.sendBuffer.push(packet)}delete this.flags;return this};Socket.prototype.packet=function(packet){packet.nsp=this.nsp;this.io.packet(packet)};Socket.prototype.onopen=function(){debug("transport is open - connecting");if("/"!=this.nsp){this.packet({type:parser.CONNECT})}};Socket.prototype.onclose=function(reason){debug("close (%s)",reason);this.connected=false;this.disconnected=true;delete this.id;this.emit("disconnect",reason)};Socket.prototype.onpacket=function(packet){if(packet.nsp!=this.nsp)return;switch(packet.type){case parser.CONNECT:this.onconnect();break;case parser.EVENT:this.onevent(packet);break;case parser.BINARY_EVENT:this.onevent(packet);break;case parser.ACK:this.onack(packet);break;case parser.BINARY_ACK:this.onack(packet);break;case parser.DISCONNECT:this.ondisconnect();break;case parser.ERROR:this.emit("error",packet.data);break}};Socket.prototype.onevent=function(packet){var args=packet.data||[];debug("emitting event %j",args);if(null!=packet.id){debug("attaching ack callback to event");args.push(this.ack(packet.id))}if(this.connected){emit.apply(this,args)}else{this.receiveBuffer.push(args)}};Socket.prototype.ack=function(id){var self=this;var sent=false;return function(){if(sent)return;sent=true;var args=toArray(arguments);debug("sending ack %j",args);var type=hasBin(args)?parser.BINARY_ACK:parser.ACK;self.packet({type:type,id:id,data:args})}};Socket.prototype.onack=function(packet){var ack=this.acks[packet.id];if("function"==typeof ack){debug("calling ack %s with %j",packet.id,packet.data);ack.apply(this,packet.data);delete this.acks[packet.id]}else{debug("bad ack %s",packet.id)}};Socket.prototype.onconnect=function(){this.connected=true;this.disconnected=false;this.emit("connect");this.emitBuffered()};Socket.prototype.emitBuffered=function(){var i;for(i=0;i<this.receiveBuffer.length;i++){emit.apply(this,this.receiveBuffer[i])}this.receiveBuffer=[];for(i=0;i<this.sendBuffer.length;i++){this.packet(this.sendBuffer[i])}this.sendBuffer=[]};Socket.prototype.ondisconnect=function(){debug("server disconnect (%s)",this.nsp);this.destroy();this.onclose("io server disconnect")};Socket.prototype.destroy=function(){if(this.subs){for(var i=0;i<this.subs.length;i++){this.subs[i].destroy()}this.subs=null}this.io.destroy(this)};Socket.prototype.close=Socket.prototype.disconnect=function(){if(this.connected){debug("performing disconnect (%s)",this.nsp);this.packet({type:parser.DISCONNECT})}this.destroy();if(this.connected){this.onclose("io client disconnect")}return this};Socket.prototype.compress=function(compress){this.flags=this.flags||{};this.flags.compress=compress;return this}},{"./on":33,"component-bind":37,"component-emitter":38,debug:39,"has-binary":41,"socket.io-parser":47,"to-array":51}],35:[function(_dereq_,module,exports){(function(global){var parseuri=_dereq_("parseuri");var debug=_dereq_("debug")("socket.io-client:url");module.exports=url;function url(uri,loc){var obj=uri;var loc=loc||global.location;if(null==uri)uri=loc.protocol+"//"+loc.host;if("string"==typeof uri){if("/"==uri.charAt(0)){if("/"==uri.charAt(1)){uri=loc.protocol+uri}else{uri=loc.host+uri}}if(!/^(https?|wss?):\/\//.test(uri)){debug("protocol-less url %s",uri);if("undefined"!=typeof loc){uri=loc.protocol+"//"+uri}else{uri="https://"+uri}}debug("parse %s",uri);obj=parseuri(uri)}if(!obj.port){if(/^(http|ws)$/.test(obj.protocol)){obj.port="80"}else if(/^(http|ws)s$/.test(obj.protocol)){obj.port="443"}}obj.path=obj.path||"/";var ipv6=obj.host.indexOf(":")!==-1;var host=ipv6?"["+obj.host+"]":obj.host;obj.id=obj.protocol+"://"+host+":"+obj.port;obj.href=obj.protocol+"://"+host+(loc&&loc.port==obj.port?"":":"+obj.port);return obj}}).call(this,typeof self!=="undefined"?self:typeof window!=="undefined"?window:typeof global!=="undefined"?global:{})},{debug:39,parseuri:45}],36:[function(_dereq_,module,exports){module.exports=Backoff;function Backoff(opts){opts=opts||{};this.ms=opts.min||100;this.max=opts.max||1e4;this.factor=opts.factor||2;this.jitter=opts.jitter>0&&opts.jitter<=1?opts.jitter:0;this.attempts=0}Backoff.prototype.duration=function(){var ms=this.ms*Math.pow(this.factor,this.attempts++);if(this.jitter){var rand=Math.random();var deviation=Math.floor(rand*this.jitter*ms);ms=(Math.floor(rand*10)&1)==0?ms-deviation:ms+deviation}return Math.min(ms,this.max)|0};Backoff.prototype.reset=function(){this.attempts=0};Backoff.prototype.setMin=function(min){this.ms=min};Backoff.prototype.setMax=function(max){this.max=max};Backoff.prototype.setJitter=function(jitter){this.jitter=jitter}},{}],37:[function(_dereq_,module,exports){var slice=[].slice;module.exports=function(obj,fn){if("string"==typeof fn)fn=obj[fn];if("function"!=typeof fn)throw new Error("bind() requires a function");var args=slice.call(arguments,2);return function(){return fn.apply(obj,args.concat(slice.call(arguments)))}}},{}],38:[function(_dereq_,module,exports){module.exports=Emitter;function Emitter(obj){if(obj)return mixin(obj)}function mixin(obj){for(var key in Emitter.prototype){obj[key]=Emitter.prototype[key]}return obj}Emitter.prototype.on=Emitter.prototype.addEventListener=function(event,fn){this._callbacks=this._callbacks||{};(this._callbacks["$"+event]=this._callbacks["$"+event]||[]).push(fn);return this};Emitter.prototype.once=function(event,fn){function on(){this.off(event,on);fn.apply(this,arguments)}on.fn=fn;this.on(event,on);return this};Emitter.prototype.off=Emitter.prototype.removeListener=Emitter.prototype.removeAllListeners=Emitter.prototype.removeEventListener=function(event,fn){this._callbacks=this._callbacks||{};if(0==arguments.length){this._callbacks={};return this}var callbacks=this._callbacks["$"+event];if(!callbacks)return this;if(1==arguments.length){delete this._callbacks["$"+event];return this}var cb;for(var i=0;i<callbacks.length;i++){cb=callbacks[i];if(cb===fn||cb.fn===fn){callbacks.splice(i,1);break}}return this};Emitter.prototype.emit=function(event){this._callbacks=this._callbacks||{};var args=[].slice.call(arguments,1),callbacks=this._callbacks["$"+event];if(callbacks){callbacks=callbacks.slice(0);for(var i=0,len=callbacks.length;i<len;++i){callbacks[i].apply(this,args)}}return this};Emitter.prototype.listeners=function(event){this._callbacks=this._callbacks||{};return this._callbacks["$"+event]||[]};Emitter.prototype.hasListeners=function(event){return!!this.listeners(event).length}},{}],39:[function(_dereq_,module,exports){arguments[4][17][0].apply(exports,arguments)},{"./debug":40,dup:17}],40:[function(_dereq_,module,exports){arguments[4][18][0].apply(exports,arguments)},{dup:18,ms:44}],41:[function(_dereq_,module,exports){(function(global){var isArray=_dereq_("isarray");module.exports=hasBinary;function hasBinary(data){function _hasBinary(obj){if(!obj)return false;if(global.Buffer&&global.Buffer.isBuffer&&global.Buffer.isBuffer(obj)||global.ArrayBuffer&&obj instanceof ArrayBuffer||global.Blob&&obj instanceof Blob||global.File&&obj instanceof File){return true}if(isArray(obj)){for(var i=0;i<obj.length;i++){if(_hasBinary(obj[i])){return true}}}else if(obj&&"object"==typeof obj){if(obj.toJSON&&"function"==typeof obj.toJSON){obj=obj.toJSON()}for(var key in obj){if(Object.prototype.hasOwnProperty.call(obj,key)&&_hasBinary(obj[key])){return true}}}return false}return _hasBinary(data)}}).call(this,typeof self!=="undefined"?self:typeof window!=="undefined"?window:typeof global!=="undefined"?global:{})},{isarray:43}],42:[function(_dereq_,module,exports){arguments[4][23][0].apply(exports,arguments)},{dup:23}],43:[function(_dereq_,module,exports){arguments[4][24][0].apply(exports,arguments)},{dup:24}],44:[function(_dereq_,module,exports){arguments[4][25][0].apply(exports,arguments)},{dup:25}],45:[function(_dereq_,module,exports){arguments[4][28][0].apply(exports,arguments)},{dup:28}],46:[function(_dereq_,module,exports){(function(global){var isArray=_dereq_("isarray");var isBuf=_dereq_("./is-buffer");exports.deconstructPacket=function(packet){var buffers=[];var packetData=packet.data;function _deconstructPacket(data){if(!data)return data;if(isBuf(data)){var placeholder={_placeholder:true,num:buffers.length};buffers.push(data);return placeholder}else if(isArray(data)){var newData=new Array(data.length);for(var i=0;i<data.length;i++){newData[i]=_deconstructPacket(data[i])}return newData}else if("object"==typeof data&&!(data instanceof Date)){var newData={};for(var key in data){newData[key]=_deconstructPacket(data[key])}return newData}return data}var pack=packet;pack.data=_deconstructPacket(packetData);pack.attachments=buffers.length;return{packet:pack,buffers:buffers}};exports.reconstructPacket=function(packet,buffers){var curPlaceHolder=0;function _reconstructPacket(data){if(data&&data._placeholder){var buf=buffers[data.num];return buf}else if(isArray(data)){for(var i=0;i<data.length;i++){data[i]=_reconstructPacket(data[i])}return data}else if(data&&"object"==typeof data){for(var key in data){data[key]=_reconstructPacket(data[key])}return data}return data}packet.data=_reconstructPacket(packet.data);packet.attachments=undefined;return packet};exports.removeBlobs=function(data,callback){function _removeBlobs(obj,curKey,containingObject){if(!obj)return obj;if(global.Blob&&obj instanceof Blob||global.File&&obj instanceof File){pendingBlobs++;var fileReader=new FileReader;fileReader.onload=function(){if(containingObject){containingObject[curKey]=this.result}else{bloblessData=this.result}if(!--pendingBlobs){callback(bloblessData)}};fileReader.readAsArrayBuffer(obj)}else if(isArray(obj)){for(var i=0;i<obj.length;i++){_removeBlobs(obj[i],i,obj)}}else if(obj&&"object"==typeof obj&&!isBuf(obj)){for(var key in obj){_removeBlobs(obj[key],key,obj)}}}var pendingBlobs=0;var bloblessData=data;_removeBlobs(bloblessData);if(!pendingBlobs){callback(bloblessData)}}}).call(this,typeof self!=="undefined"?self:typeof window!=="undefined"?window:typeof global!=="undefined"?global:{})},{"./is-buffer":48,isarray:43}],47:[function(_dereq_,module,exports){var debug=_dereq_("debug")("socket.io-parser");var json=_dereq_("json3");var isArray=_dereq_("isarray");var Emitter=_dereq_("component-emitter");var binary=_dereq_("./binary");var isBuf=_dereq_("./is-buffer");exports.protocol=4;exports.types=["CONNECT","DISCONNECT","EVENT","BINARY_EVENT","ACK","BINARY_ACK","ERROR"];exports.CONNECT=0;exports.DISCONNECT=1;exports.EVENT=2;exports.ACK=3;exports.ERROR=4;exports.BINARY_EVENT=5;exports.BINARY_ACK=6;exports.Encoder=Encoder;exports.Decoder=Decoder;function Encoder(){}Encoder.prototype.encode=function(obj,callback){debug("encoding packet %j",obj);if(exports.BINARY_EVENT==obj.type||exports.BINARY_ACK==obj.type){encodeAsBinary(obj,callback)}else{var encoding=encodeAsString(obj);callback([encoding])}};function encodeAsString(obj){var str="";var nsp=false;str+=obj.type;if(exports.BINARY_EVENT==obj.type||exports.BINARY_ACK==obj.type){str+=obj.attachments;str+="-"}if(obj.nsp&&"/"!=obj.nsp){nsp=true;str+=obj.nsp}if(null!=obj.id){if(nsp){str+=",";nsp=false}str+=obj.id}if(null!=obj.data){if(nsp)str+=",";str+=json.stringify(obj.data)}debug("encoded %j as %s",obj,str);return str}function encodeAsBinary(obj,callback){function writeEncoding(bloblessData){var deconstruction=binary.deconstructPacket(bloblessData);var pack=encodeAsString(deconstruction.packet);var buffers=deconstruction.buffers;buffers.unshift(pack);callback(buffers)}binary.removeBlobs(obj,writeEncoding)}function Decoder(){this.reconstructor=null}Emitter(Decoder.prototype);Decoder.prototype.add=function(obj){var packet;if("string"==typeof obj){packet=decodeString(obj);if(exports.BINARY_EVENT==packet.type||exports.BINARY_ACK==packet.type){this.reconstructor=new BinaryReconstructor(packet);if(this.reconstructor.reconPack.attachments===0){this.emit("decoded",packet)}}else{this.emit("decoded",packet)}}else if(isBuf(obj)||obj.base64){if(!this.reconstructor){throw new Error("got binary data when not reconstructing a packet")}else{packet=this.reconstructor.takeBinaryData(obj);if(packet){this.reconstructor=null;this.emit("decoded",packet)}}}else{throw new Error("Unknown type: "+obj)}};function decodeString(str){var p={};var i=0;p.type=Number(str.charAt(0));if(null==exports.types[p.type])return error();if(exports.BINARY_EVENT==p.type||exports.BINARY_ACK==p.type){var buf="";while(str.charAt(++i)!="-"){buf+=str.charAt(i);if(i==str.length)break}if(buf!=Number(buf)||str.charAt(i)!="-"){throw new Error("Illegal attachments")}p.attachments=Number(buf)}if("/"==str.charAt(i+1)){p.nsp="";while(++i){var c=str.charAt(i);if(","==c)break;p.nsp+=c;if(i==str.length)break}}else{p.nsp="/"}var next=str.charAt(i+1);if(""!==next&&Number(next)==next){p.id="";while(++i){var c=str.charAt(i);if(null==c||Number(c)!=c){--i;break}p.id+=str.charAt(i);if(i==str.length)break}p.id=Number(p.id)}if(str.charAt(++i)){try{p.data=json.parse(str.substr(i))}catch(e){return error()}}debug("decoded %s as %j",str,p);return p}Decoder.prototype.destroy=function(){if(this.reconstructor){this.reconstructor.finishedReconstruction()}};function BinaryReconstructor(packet){this.reconPack=packet;this.buffers=[]}BinaryReconstructor.prototype.takeBinaryData=function(binData){this.buffers.push(binData);if(this.buffers.length==this.reconPack.attachments){var packet=binary.reconstructPacket(this.reconPack,this.buffers);this.finishedReconstruction();return packet}return null};BinaryReconstructor.prototype.finishedReconstruction=function(){this.reconPack=null;this.buffers=[]};function error(data){return{type:exports.ERROR,data:"parser error"}}},{"./binary":46,"./is-buffer":48,"component-emitter":49,debug:39,isarray:43,json3:50}],48:[function(_dereq_,module,exports){(function(global){module.exports=isBuf;function isBuf(obj){return global.Buffer&&global.Buffer.isBuffer(obj)||global.ArrayBuffer&&obj instanceof ArrayBuffer}}).call(this,typeof self!=="undefined"?self:typeof window!=="undefined"?window:typeof global!=="undefined"?global:{})},{}],49:[function(_dereq_,module,exports){arguments[4][15][0].apply(exports,arguments)},{dup:15}],50:[function(_dereq_,module,exports){(function(global){(function(){var isLoader=typeof define==="function"&&define.amd;var objectTypes={"function":true,object:true};var freeExports=objectTypes[typeof exports]&&exports&&!exports.nodeType&&exports;var root=objectTypes[typeof window]&&window||this,freeGlobal=freeExports&&objectTypes[typeof module]&&module&&!module.nodeType&&typeof global=="object"&&global;if(freeGlobal&&(freeGlobal["global"]===freeGlobal||freeGlobal["window"]===freeGlobal||freeGlobal["self"]===freeGlobal)){root=freeGlobal}function runInContext(context,exports){context||(context=root["Object"]());exports||(exports=root["Object"]());var Number=context["Number"]||root["Number"],String=context["String"]||root["String"],Object=context["Object"]||root["Object"],Date=context["Date"]||root["Date"],SyntaxError=context["SyntaxError"]||root["SyntaxError"],TypeError=context["TypeError"]||root["TypeError"],Math=context["Math"]||root["Math"],nativeJSON=context["JSON"]||root["JSON"];if(typeof nativeJSON=="object"&&nativeJSON){exports.stringify=nativeJSON.stringify;exports.parse=nativeJSON.parse}var objectProto=Object.prototype,getClass=objectProto.toString,isProperty,forEach,undef;var isExtended=new Date(-0xc782b5b800cec);try{isExtended=isExtended.getUTCFullYear()==-109252&&isExtended.getUTCMonth()===0&&isExtended.getUTCDate()===1&&isExtended.getUTCHours()==10&&isExtended.getUTCMinutes()==37&&isExtended.getUTCSeconds()==6&&isExtended.getUTCMilliseconds()==708}catch(exception){}function has(name){if(has[name]!==undef){return has[name]}var isSupported;if(name=="bug-string-char-index"){isSupported="a"[0]!="a"}else if(name=="json"){isSupported=has("json-stringify")&&has("json-parse")}else{var value,serialized='{"a":[1,true,false,null,"\\u0000\\b\\n\\f\\r\\t"]}';if(name=="json-stringify"){var stringify=exports.stringify,stringifySupported=typeof stringify=="function"&&isExtended;if(stringifySupported){(value=function(){return 1}).toJSON=value;try{stringifySupported=stringify(0)==="0"&&stringify(new Number)==="0"&&stringify(new String)=='""'&&stringify(getClass)===undef&&stringify(undef)===undef&&stringify()===undef&&stringify(value)==="1"&&stringify([value])=="[1]"&&stringify([undef])=="[null]"&&stringify(null)=="null"&&stringify([undef,getClass,null])=="[null,null,null]"&&stringify({a:[value,true,false,null,"\x00\b\n\f\r "]})==serialized&&stringify(null,value)==="1"&&stringify([1,2],null,1)=="[\n 1,\n 2\n]"&&stringify(new Date(-864e13))=='"-271821-04-20T00:00:00.000Z"'&&stringify(new Date(864e13))=='"+275760-09-13T00:00:00.000Z"'&&stringify(new Date(-621987552e5))=='"-000001-01-01T00:00:00.000Z"'&&stringify(new Date(-1))=='"1969-12-31T23:59:59.999Z"'}catch(exception){stringifySupported=false}}isSupported=stringifySupported}if(name=="json-parse"){var parse=exports.parse;if(typeof parse=="function"){try{if(parse("0")===0&&!parse(false)){value=parse(serialized);var parseSupported=value["a"].length==5&&value["a"][0]===1;if(parseSupported){try{parseSupported=!parse('" "')}catch(exception){}if(parseSupported){try{parseSupported=parse("01")!==1}catch(exception){}}if(parseSupported){try{parseSupported=parse("1.")!==1}catch(exception){}}}}}catch(exception){parseSupported=false}}isSupported=parseSupported}}return has[name]=!!isSupported}if(!has("json")){var functionClass="[object Function]",dateClass="[object Date]",numberClass="[object Number]",stringClass="[object String]",arrayClass="[object Array]",booleanClass="[object Boolean]";var charIndexBuggy=has("bug-string-char-index");if(!isExtended){var floor=Math.floor;var Months=[0,31,59,90,120,151,181,212,243,273,304,334];var getDay=function(year,month){return Months[month]+365*(year-1970)+floor((year-1969+(month=+(month>1)))/4)-floor((year-1901+month)/100)+floor((year-1601+month)/400)}}if(!(isProperty=objectProto.hasOwnProperty)){isProperty=function(property){var members={},constructor;if((members.__proto__=null,members.__proto__={toString:1},members).toString!=getClass){isProperty=function(property){var original=this.__proto__,result=property in(this.__proto__=null,this);this.__proto__=original;return result}}else{constructor=members.constructor;isProperty=function(property){var parent=(this.constructor||constructor).prototype;return property in this&&!(property in parent&&this[property]===parent[property])}}members=null;return isProperty.call(this,property)}}forEach=function(object,callback){var size=0,Properties,members,property;(Properties=function(){this.valueOf=0}).prototype.valueOf=0;members=new Properties;for(property in members){if(isProperty.call(members,property)){size++}}Properties=members=null;if(!size){members=["valueOf","toString","toLocaleString","propertyIsEnumerable","isPrototypeOf","hasOwnProperty","constructor"];forEach=function(object,callback){var isFunction=getClass.call(object)==functionClass,property,length;var hasProperty=!isFunction&&typeof object.constructor!="function"&&objectTypes[typeof object.hasOwnProperty]&&object.hasOwnProperty||isProperty;for(property in object){if(!(isFunction&&property=="prototype")&&hasProperty.call(object,property)){callback(property)}}for(length=members.length;property=members[--length];hasProperty.call(object,property)&&callback(property));}}else if(size==2){forEach=function(object,callback){var members={},isFunction=getClass.call(object)==functionClass,property;for(property in object){if(!(isFunction&&property=="prototype")&&!isProperty.call(members,property)&&(members[property]=1)&&isProperty.call(object,property)){callback(property)}}}}else{forEach=function(object,callback){var isFunction=getClass.call(object)==functionClass,property,isConstructor;for(property in object){if(!(isFunction&&property=="prototype")&&isProperty.call(object,property)&&!(isConstructor=property==="constructor")){callback(property)}}if(isConstructor||isProperty.call(object,property="constructor")){callback(property)}}}return forEach(object,callback)};if(!has("json-stringify")){var Escapes={92:"\\\\",34:'\\"',8:"\\b",12:"\\f",10:"\\n",13:"\\r",9:"\\t"};var leadingZeroes="000000";var toPaddedString=function(width,value){return(leadingZeroes+(value||0)).slice(-width)};var unicodePrefix="\\u00";var quote=function(value){var result='"',index=0,length=value.length,useCharIndex=!charIndexBuggy||length>10;var symbols=useCharIndex&&(charIndexBuggy?value.split(""):value);for(;index<length;index++){var charCode=value.charCodeAt(index);switch(charCode){case 8:case 9:case 10:case 12:case 13:case 34:case 92:result+=Escapes[charCode];break;default:if(charCode<32){result+=unicodePrefix+toPaddedString(2,charCode.toString(16));break}result+=useCharIndex?symbols[index]:value.charAt(index)}}return result+'"'};var serialize=function(property,object,callback,properties,whitespace,indentation,stack){var value,className,year,month,date,time,hours,minutes,seconds,milliseconds,results,element,index,length,prefix,result;try{value=object[property]}catch(exception){}if(typeof value=="object"&&value){className=getClass.call(value);if(className==dateClass&&!isProperty.call(value,"toJSON")){if(value>-1/0&&value<1/0){if(getDay){date=floor(value/864e5);for(year=floor(date/365.2425)+1970-1;getDay(year+1,0)<=date;year++);for(month=floor((date-getDay(year,0))/30.42);getDay(year,month+1)<=date;month++);date=1+date-getDay(year,month);time=(value%864e5+864e5)%864e5;hours=floor(time/36e5)%24;minutes=floor(time/6e4)%60;seconds=floor(time/1e3)%60;milliseconds=time%1e3}else{year=value.getUTCFullYear();month=value.getUTCMonth();date=value.getUTCDate();hours=value.getUTCHours();minutes=value.getUTCMinutes();seconds=value.getUTCSeconds();milliseconds=value.getUTCMilliseconds()}value=(year<=0||year>=1e4?(year<0?"-":"+")+toPaddedString(6,year<0?-year:year):toPaddedString(4,year))+"-"+toPaddedString(2,month+1)+"-"+toPaddedString(2,date)+"T"+toPaddedString(2,hours)+":"+toPaddedString(2,minutes)+":"+toPaddedString(2,seconds)+"."+toPaddedString(3,milliseconds)+"Z"}else{value=null}}else if(typeof value.toJSON=="function"&&(className!=numberClass&&className!=stringClass&&className!=arrayClass||isProperty.call(value,"toJSON"))){value=value.toJSON(property)}}if(callback){value=callback.call(object,property,value)}if(value===null){return"null"}className=getClass.call(value);if(className==booleanClass){return""+value}else if(className==numberClass){return value>-1/0&&value<1/0?""+value:"null"}else if(className==stringClass){return quote(""+value)}if(typeof value=="object"){for(length=stack.length;length--;){if(stack[length]===value){throw TypeError()}}stack.push(value);results=[];prefix=indentation;indentation+=whitespace;if(className==arrayClass){for(index=0,length=value.length;index<length;index++){element=serialize(index,value,callback,properties,whitespace,indentation,stack);results.push(element===undef?"null":element)}result=results.length?whitespace?"[\n"+indentation+results.join(",\n"+indentation)+"\n"+prefix+"]":"["+results.join(",")+"]":"[]"}else{forEach(properties||value,function(property){var element=serialize(property,value,callback,properties,whitespace,indentation,stack);if(element!==undef){results.push(quote(property)+":"+(whitespace?" ":"")+element)}});result=results.length?whitespace?"{\n"+indentation+results.join(",\n"+indentation)+"\n"+prefix+"}":"{"+results.join(",")+"}":"{}"}stack.pop();return result}};exports.stringify=function(source,filter,width){var whitespace,callback,properties,className;if(objectTypes[typeof filter]&&filter){if((className=getClass.call(filter))==functionClass){callback=filter}else if(className==arrayClass){properties={};for(var index=0,length=filter.length,value;index<length;value=filter[index++],(className=getClass.call(value),className==stringClass||className==numberClass)&&(properties[value]=1));}}if(width){if((className=getClass.call(width))==numberClass){if((width-=width%1)>0){for(whitespace="",width>10&&(width=10);whitespace.length<width;whitespace+=" ");}}else if(className==stringClass){whitespace=width.length<=10?width:width.slice(0,10)}}return serialize("",(value={},value[""]=source,value),callback,properties,whitespace,"",[])}}if(!has("json-parse")){var fromCharCode=String.fromCharCode;var Unescapes={92:"\\",34:'"',47:"/",98:"\b",116:" ",110:"\n",102:"\f",114:"\r"};var Index,Source;var abort=function(){Index=Source=null;throw SyntaxError()};var lex=function(){var source=Source,length=source.length,value,begin,position,isSigned,charCode;while(Index<length){charCode=source.charCodeAt(Index);switch(charCode){case 9:case 10:case 13:case 32:Index++;break;case 123:case 125:case 91:case 93:case 58:case 44:value=charIndexBuggy?source.charAt(Index):source[Index];Index++;return value;case 34:for(value="@",Index++;Index<length;){charCode=source.charCodeAt(Index);if(charCode<32){abort()}else if(charCode==92){charCode=source.charCodeAt(++Index);switch(charCode){case 92:case 34:case 47:case 98:case 116:case 110:case 102:case 114:value+=Unescapes[charCode];Index++;break;case 117:begin=++Index;for(position=Index+4;Index<position;Index++){charCode=source.charCodeAt(Index);if(!(charCode>=48&&charCode<=57||charCode>=97&&charCode<=102||charCode>=65&&charCode<=70)){abort()}}value+=fromCharCode("0x"+source.slice(begin,Index));break;default:abort()}}else{if(charCode==34){break}charCode=source.charCodeAt(Index);begin=Index;while(charCode>=32&&charCode!=92&&charCode!=34){charCode=source.charCodeAt(++Index)}value+=source.slice(begin,Index)}}if(source.charCodeAt(Index)==34){Index++;return value}abort();default:begin=Index;if(charCode==45){isSigned=true;charCode=source.charCodeAt(++Index)}if(charCode>=48&&charCode<=57){if(charCode==48&&(charCode=source.charCodeAt(Index+1),charCode>=48&&charCode<=57)){abort()}isSigned=false;for(;Index<length&&(charCode=source.charCodeAt(Index),charCode>=48&&charCode<=57);Index++);if(source.charCodeAt(Index)==46){position=++Index;for(;position<length&&(charCode=source.charCodeAt(position),charCode>=48&&charCode<=57);position++);if(position==Index){abort()}Index=position}charCode=source.charCodeAt(Index);if(charCode==101||charCode==69){charCode=source.charCodeAt(++Index);if(charCode==43||charCode==45){Index++}for(position=Index;position<length&&(charCode=source.charCodeAt(position),charCode>=48&&charCode<=57);position++);if(position==Index){abort()}Index=position}return+source.slice(begin,Index)}if(isSigned){abort()}if(source.slice(Index,Index+4)=="true"){Index+=4;return true}else if(source.slice(Index,Index+5)=="false"){Index+=5;return false}else if(source.slice(Index,Index+4)=="null"){Index+=4;return null}abort()}}return"$"};var get=function(value){var results,hasMembers;if(value=="$"){abort()}if(typeof value=="string"){if((charIndexBuggy?value.charAt(0):value[0])=="@"){return value.slice(1)}if(value=="["){results=[];for(;;hasMembers||(hasMembers=true)){value=lex();if(value=="]"){break}if(hasMembers){if(value==","){value=lex();if(value=="]"){abort()}}else{abort()}}if(value==","){abort()}results.push(get(value))}return results}else if(value=="{"){results={};for(;;hasMembers||(hasMembers=true)){value=lex();if(value=="}"){break}if(hasMembers){if(value==","){value=lex();if(value=="}"){abort()}}else{abort()}}if(value==","||typeof value!="string"||(charIndexBuggy?value.charAt(0):value[0])!="@"||lex()!=":"){abort()}results[value.slice(1)]=get(lex())
  5696. }return results}abort()}return value};var update=function(source,property,callback){var element=walk(source,property,callback);if(element===undef){delete source[property]}else{source[property]=element}};var walk=function(source,property,callback){var value=source[property],length;if(typeof value=="object"&&value){if(getClass.call(value)==arrayClass){for(length=value.length;length--;){update(value,length,callback)}}else{forEach(value,function(property){update(value,property,callback)})}}return callback.call(source,property,value)};exports.parse=function(source,callback){var result,value;Index=0;Source=""+source;result=get(lex());if(lex()!="$"){abort()}Index=Source=null;return callback&&getClass.call(callback)==functionClass?walk((value={},value[""]=result,value),"",callback):result}}}exports["runInContext"]=runInContext;return exports}if(freeExports&&!isLoader){runInContext(root,freeExports)}else{var nativeJSON=root.JSON,previousJSON=root["JSON3"],isRestored=false;var JSON3=runInContext(root,root["JSON3"]={noConflict:function(){if(!isRestored){isRestored=true;root.JSON=nativeJSON;root["JSON3"]=previousJSON;nativeJSON=previousJSON=null}return JSON3}});root.JSON={parse:JSON3.parse,stringify:JSON3.stringify}}if(isLoader){define(function(){return JSON3})}}).call(this)}).call(this,typeof self!=="undefined"?self:typeof window!=="undefined"?window:typeof global!=="undefined"?global:{})},{}],51:[function(_dereq_,module,exports){module.exports=toArray;function toArray(list,index){var array=[];index=index||0;for(var i=index||0;i<list.length;i++){array[i-index]=list[i]}return array}},{}]},{},[31])(31)});
  5697. }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
  5698. },{}],"telemetry-helper":[function(require,module,exports){
  5699. // Copyright (c) Microsoft Corporation. All rights reserved.
  5700. var clientSocket;
  5701. var serviceToPluginMap;
  5702. var pendingTelemetryEvents = [];
  5703. function init(socket) {
  5704. clientSocket = socket;
  5705. trySendPendingEvents();
  5706. }
  5707. function registerPluginServices(pluginServices) {
  5708. serviceToPluginMap = pluginServices;
  5709. trySendPendingEvents();
  5710. }
  5711. function trySendPendingEvents() {
  5712. if (!clientSocket) {
  5713. return;
  5714. }
  5715. var unsent = [];
  5716. pendingTelemetryEvents.forEach(function (eventData) {
  5717. if (mustMapServiceToPlugin(eventData) && !serviceToPluginMap) {
  5718. unsent.push(eventData);
  5719. } else {
  5720. sendClientTelemetry(eventData);
  5721. }
  5722. });
  5723. pendingTelemetryEvents = unsent;
  5724. }
  5725. function mustMapServiceToPlugin(eventData) {
  5726. return !!eventData.props.service && !eventData.plugin;
  5727. }
  5728. function sendClientTelemetry(event, props, piiProps) {
  5729. var eventData = {
  5730. event: event,
  5731. props: props,
  5732. piiProps: piiProps
  5733. };
  5734. if (!clientSocket) {
  5735. pendingTelemetryEvents.push(eventData);
  5736. return;
  5737. }
  5738. if (mustMapServiceToPlugin(eventData)) {
  5739. if (!serviceToPluginMap) {
  5740. pendingTelemetryEvents.push(eventData);
  5741. return;
  5742. }
  5743. eventData.props.plugin = serviceToPluginMap[eventData.props.service] || '_unknown';
  5744. }
  5745. clientSocket.emit('telemetry', eventData);
  5746. }
  5747. function sendUITelemetry(uiControlData) {
  5748. sendClientTelemetry('plugin-ui-interaction', uiControlData);
  5749. }
  5750. module.exports.init = init;
  5751. module.exports.registerPluginServices = registerPluginServices;
  5752. module.exports.sendClientTelemetry = sendClientTelemetry;
  5753. module.exports.sendUITelemetry = sendUITelemetry;
  5754. },{}],"utils":[function(require,module,exports){
  5755. // Copyright (c) Microsoft Corporation. All rights reserved.
  5756. // Based in part on code from Apache Ripple, https://github.com/apache/incubator-ripple
  5757. var self,
  5758. exception = require('exception');
  5759. self = module.exports = {
  5760. validateArgumentType: function (arg, argType, customExceptionType, customExceptionMessage, customExceptionObject) {
  5761. var invalidArg = false,
  5762. msg;
  5763. switch (argType) {
  5764. case 'array':
  5765. if (!(arg instanceof Array)) {
  5766. invalidArg = true;
  5767. }
  5768. break;
  5769. case 'date':
  5770. if (!(arg instanceof Date)) {
  5771. invalidArg = true;
  5772. }
  5773. break;
  5774. case 'integer':
  5775. if (typeof arg === 'number') {
  5776. if (arg !== Math.floor(arg)) {
  5777. invalidArg = true;
  5778. }
  5779. }
  5780. else {
  5781. invalidArg = true;
  5782. }
  5783. break;
  5784. default:
  5785. if (typeof arg !== argType) {
  5786. invalidArg = true;
  5787. }
  5788. break;
  5789. }
  5790. if (invalidArg) {
  5791. msg = customExceptionMessage + ('\n\nInvalid Argument type. argument: ' + arg + ' ==> was expected to be of type: ' + argType);
  5792. exception.raise((customExceptionType || exception.types.ArgumentType), msg, customExceptionObject);
  5793. }
  5794. },
  5795. forEach: function (obj, action, scope) {
  5796. if (obj instanceof Array) {
  5797. return obj.forEach(action, scope);
  5798. } else {
  5799. self.map(obj, action, scope);
  5800. }
  5801. },
  5802. map: function (obj, func, scope) {
  5803. var i,
  5804. returnVal = null,
  5805. result = [];
  5806. //MozHack for NamedNodeMap
  5807. /* jshint ignore:start */
  5808. if (window.MozNamedAttrMap) {
  5809. NamedNodeMap = window.MozNamedAttrMap;
  5810. }
  5811. /* jshint ignore:end */
  5812. if (obj instanceof Array) {
  5813. return obj.map(func, scope);
  5814. } else if (obj instanceof NamedNodeMap) {
  5815. for (i = 0; i < obj.length; i++) {
  5816. returnVal = func.apply(scope, [obj[i], i]);
  5817. result.push(returnVal);
  5818. }
  5819. } else {
  5820. for (i in obj) {
  5821. if (obj.hasOwnProperty(i)) {
  5822. returnVal = func.apply(scope, [obj[i], i]);
  5823. result.push(returnVal);
  5824. }
  5825. }
  5826. }
  5827. return result;
  5828. },
  5829. bindAutoSaveEvent: function (selector, saveCallback) {
  5830. var oldSetTimeoutId;
  5831. var node = document.querySelector(selector);
  5832. if (!node) {
  5833. console.log('AUTO SAVE: REINSTATE ONCE WE HAVE ' + selector + ' ELEMENT');
  5834. return;
  5835. }
  5836. node.addEventListener('keyup', function (event) {
  5837. if (event.keyCode !== 9) {
  5838. clearTimeout(oldSetTimeoutId);
  5839. oldSetTimeoutId = window.setTimeout(function () {
  5840. saveCallback();
  5841. }, 500);
  5842. }
  5843. });
  5844. },
  5845. mixin: function (mixin, to) {
  5846. for (var prop in mixin) {
  5847. if (Object.hasOwnProperty.call(mixin, prop)) {
  5848. to[prop] = mixin[prop];
  5849. }
  5850. }
  5851. },
  5852. copy: function (obj) {
  5853. var i,
  5854. newObj = Array.isArray(obj) ? [] : {};
  5855. if (typeof obj === 'number' ||
  5856. typeof obj === 'string' ||
  5857. typeof obj === 'boolean' ||
  5858. obj === null ||
  5859. obj === undefined) {
  5860. return obj;
  5861. }
  5862. if (obj instanceof Date) {
  5863. return new Date(obj);
  5864. }
  5865. if (obj instanceof RegExp) {
  5866. return new RegExp(obj);
  5867. }
  5868. for (i in obj) {
  5869. if (obj.hasOwnProperty(i)) {
  5870. if (obj[i] && typeof obj[i] === 'object') {
  5871. if (obj[i] instanceof Date) {
  5872. newObj[i] = obj[i];
  5873. }
  5874. else {
  5875. newObj[i] = self.copy(obj[i]);
  5876. }
  5877. }
  5878. else {
  5879. newObj[i] = obj[i];
  5880. }
  5881. }
  5882. }
  5883. return newObj;
  5884. },
  5885. navHelper: function () {
  5886. return {
  5887. Directions: {
  5888. N: 'N',
  5889. NE: 'NE',
  5890. E: 'E',
  5891. SE: 'SE',
  5892. S: 'S',
  5893. SW: 'SW',
  5894. W: 'W',
  5895. NW: 'NW'
  5896. },
  5897. /**
  5898. * Get the direction according to the heading value.
  5899. * @param {number} heading A number from 0 to 359.99.
  5900. * @return {string} direction It can be one of the following: N, NE, E, SE, S, SW, W or NW.
  5901. */
  5902. getDirection: function (heading) {
  5903. if (heading > 337.5 || (heading >= 0 && heading <= 22.5)) {
  5904. return this.Directions.N;
  5905. }
  5906. if (heading > 22.5 && heading <= 67.5) {
  5907. return this.Directions.NE;
  5908. }
  5909. if (heading > 67.5 && heading <= 112.5) {
  5910. return this.Directions.E;
  5911. }
  5912. if (heading > 112.5 && heading <= 157.5) {
  5913. return this.Directions.SE;
  5914. }
  5915. if (heading > 157.5 && heading <= 202.5) {
  5916. return this.Directions.S;
  5917. }
  5918. if (heading > 202.5 && heading <= 247.5) {
  5919. return this.Directions.SW;
  5920. }
  5921. if (heading > 247.5 && heading <= 292.5) {
  5922. return this.Directions.W;
  5923. }
  5924. // heading > 292.5 && heading <= 337.5
  5925. return this.Directions.NW;
  5926. },
  5927. getHeading: function (lat1, lon1, lat2, lon2) {
  5928. var dLon = this.rad(lon2 - lon1),
  5929. llat1 = this.rad(lat1),
  5930. llat2 = this.rad(lat2),
  5931. y = Math.sin(dLon) * Math.cos(llat2),
  5932. x = Math.cos(llat1) * Math.sin(llat2) - Math.sin(llat1) * Math.cos(llat2) * Math.cos(dLon);
  5933. return (this.deg(Math.atan2(y, x)) + 360) % 360;
  5934. },
  5935. getDistance: function (lat1, lon1, lat2, lon2) {
  5936. var dLat = this.rad(lat2 - lat1),
  5937. dLon = this.rad(lon2 - lon1),
  5938. a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + Math.cos(this.rad(lat1)) * Math.cos(this.rad(lat2)) * Math.sin(dLon / 2) * Math.sin(dLon / 2),
  5939. c = 2 * Math.asin(Math.sqrt(a)),
  5940. d = 6378100 * c;
  5941. return d;
  5942. },
  5943. simulateTravel: function (lat, lon, hdg, dist) {
  5944. var lat1 = this.rad(lat),
  5945. lon1 = this.rad(lon),
  5946. brng = this.rad(hdg),
  5947. angularDistance = dist / 6378100,
  5948. lat2 = Math.asin(Math.sin(lat1) * Math.cos(angularDistance) + Math.cos(lat1) * Math.sin(angularDistance) * Math.cos(brng)),
  5949. lon2 = lon1 + Math.atan2(Math.sin(brng) * Math.sin(angularDistance) * Math.cos(lat1), Math.cos(angularDistance) - Math.sin(lat1) * Math.sin(lat2));
  5950. lon2 = (lon2 + 3 * Math.PI) % (2 * Math.PI) - Math.PI; // Normalize to -180..+180
  5951. return {
  5952. latitude: this.deg(lat2),
  5953. longitude: this.deg(lon2)
  5954. };
  5955. },
  5956. deg: function (num) {
  5957. return num * 180 / Math.PI;
  5958. },
  5959. rad: function (num) {
  5960. return num * Math.PI / 180;
  5961. }
  5962. };
  5963. },
  5964. createUUID: function () {
  5965. return createUUIDPart(4) + '-' +
  5966. createUUIDPart(2) + '-' +
  5967. createUUIDPart(2) + '-' +
  5968. createUUIDPart(2) + '-' +
  5969. createUUIDPart(6);
  5970. },
  5971. typeName: function (val) {
  5972. return Object.prototype.toString.call(val).slice(8, -1);
  5973. },
  5974. parseUrl: function (url) {
  5975. var a = document.createElement('a');
  5976. a.href = url;
  5977. return {
  5978. href: a.href,
  5979. host: a.host,
  5980. origin: a.origin,
  5981. port: a.port,
  5982. protocol: a.protocol,
  5983. search: a.search
  5984. };
  5985. },
  5986. isSameOriginRequest: function (url) {
  5987. url = this.parseUrl(url);
  5988. if (url.port !== location.port) {
  5989. return false;
  5990. }
  5991. var sameOrigin = url.href.match(location.origin.replace(/www\./, '')) ||
  5992. !url.href.match(/^https?:\/\/|^file:\/\//);
  5993. return !!sameOrigin;
  5994. },
  5995. isNumber: function (value) {
  5996. var type = typeof value;
  5997. return (type === 'number' || type === 'string') && !isNaN(value - parseFloat(value));
  5998. }
  5999. };
  6000. function createUUIDPart(length) {
  6001. var uuidpart = '';
  6002. for (var i = 0; i < length; i++) {
  6003. var uuidchar = parseInt((Math.random() * 256), 10).toString(16);
  6004. if (uuidchar.length == 1) {
  6005. uuidchar = '0' + uuidchar;
  6006. }
  6007. uuidpart += uuidchar;
  6008. }
  6009. return uuidpart;
  6010. }
  6011. },{"exception":"exception"}],"webcomponents.min":[function(require,module,exports){
  6012. /**
  6013. * @license
  6014. * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
  6015. * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
  6016. * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
  6017. * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
  6018. * Code distributed by Google as part of the polymer project is also
  6019. * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
  6020. */
  6021. // @version 0.7.20
  6022. !function(){window.WebComponents=window.WebComponents||{flags:{}};var e="webcomponents.js",t=document.querySelector('script[src*="'+e+'"]'),n={};if(!n.noOpts){if(location.search.slice(1).split("&").forEach(function(e){var t,r=e.split("=");r[0]&&(t=r[0].match(/wc-(.+)/))&&(n[t[1]]=r[1]||!0)}),t)for(var r,o=0;r=t.attributes[o];o++)"src"!==r.name&&(n[r.name]=r.value||!0);if(n.log&&n.log.split){var i=n.log.split(",");n.log={},i.forEach(function(e){n.log[e]=!0})}else n.log={}}n.shadow=n.shadow||n.shadowdom||n.polyfill,"native"===n.shadow?n.shadow=!1:n.shadow=n.shadow||!HTMLElement.prototype.createShadowRoot,n.register&&(window.CustomElements=window.CustomElements||{flags:{}},window.CustomElements.flags.register=n.register),WebComponents.flags=n}(),WebComponents.flags.shadow&&("undefined"==typeof WeakMap&&!function(){var e=Object.defineProperty,t=Date.now()%1e9,n=function(){this.name="__st"+(1e9*Math.random()>>>0)+(t++ +"__")};n.prototype={set:function(t,n){var r=t[this.name];return r&&r[0]===t?r[1]=n:e(t,this.name,{value:[t,n],writable:!0}),this},get:function(e){var t;return(t=e[this.name])&&t[0]===e?t[1]:void 0},"delete":function(e){var t=e[this.name];return t&&t[0]===e?(t[0]=t[1]=void 0,!0):!1},has:function(e){var t=e[this.name];return t?t[0]===e:!1}},window.WeakMap=n}(),window.ShadowDOMPolyfill={},function(e){"use strict";function t(){if("undefined"!=typeof chrome&&chrome.app&&chrome.app.runtime)return!1;if(navigator.getDeviceStorage)return!1;try{var e=new Function("return true;");return e()}catch(t){return!1}}function n(e){if(!e)throw new Error("Assertion failed")}function r(e,t){for(var n=W(t),r=0;r<n.length;r++){var o=n[r];A(e,o,F(t,o))}return e}function o(e,t){for(var n=W(t),r=0;r<n.length;r++){var o=n[r];switch(o){case"arguments":case"caller":case"length":case"name":case"prototype":case"toString":continue}A(e,o,F(t,o))}return e}function i(e,t){for(var n=0;n<t.length;n++)if(t[n]in e)return t[n]}function a(e,t,n){U.value=n,A(e,t,U)}function s(e,t){var n=e.__proto__||Object.getPrototypeOf(e);if(q)try{W(n)}catch(r){n=n.__proto__}var o=R.get(n);if(o)return o;var i=s(n),a=E(i);return g(n,a,t),a}function c(e,t){w(e,t,!0)}function l(e,t){w(t,e,!1)}function u(e){return/^on[a-z]+$/.test(e)}function d(e){return/^[a-zA-Z_$][a-zA-Z_$0-9]*$/.test(e)}function p(e){return k&&d(e)?new Function("return this.__impl4cf1e782hg__."+e):function(){return this.__impl4cf1e782hg__[e]}}function h(e){return k&&d(e)?new Function("v","this.__impl4cf1e782hg__."+e+" = v"):function(t){this.__impl4cf1e782hg__[e]=t}}function f(e){return k&&d(e)?new Function("return this.__impl4cf1e782hg__."+e+".apply(this.__impl4cf1e782hg__, arguments)"):function(){return this.__impl4cf1e782hg__[e].apply(this.__impl4cf1e782hg__,arguments)}}function m(e,t){try{return Object.getOwnPropertyDescriptor(e,t)}catch(n){return B}}function w(t,n,r,o){for(var i=W(t),a=0;a<i.length;a++){var s=i[a];if("polymerBlackList_"!==s&&!(s in n||t.polymerBlackList_&&t.polymerBlackList_[s])){q&&t.__lookupGetter__(s);var c,l,d=m(t,s);if("function"!=typeof d.value){var w=u(s);c=w?e.getEventHandlerGetter(s):p(s),(d.writable||d.set||V)&&(l=w?e.getEventHandlerSetter(s):h(s));var v=V||d.configurable;A(n,s,{get:c,set:l,configurable:v,enumerable:d.enumerable})}else r&&(n[s]=f(s))}}}function v(e,t,n){if(null!=e){var r=e.prototype;g(r,t,n),o(t,e)}}function g(e,t,r){var o=t.prototype;n(void 0===R.get(e)),R.set(e,t),I.set(o,e),c(e,o),r&&l(o,r),a(o,"constructor",t),t.prototype=o}function b(e,t){return R.get(t.prototype)===e}function y(e){var t=Object.getPrototypeOf(e),n=s(t),r=E(n);return g(t,r,e),r}function E(e){function t(t){e.call(this,t)}var n=Object.create(e.prototype);return n.constructor=t,t.prototype=n,t}function _(e){return e&&e.__impl4cf1e782hg__}function S(e){return!_(e)}function T(e){if(null===e)return null;n(S(e));var t=e.__wrapper8e3dd93a60__;return null!=t?t:e.__wrapper8e3dd93a60__=new(s(e,e))(e)}function M(e){return null===e?null:(n(_(e)),e.__impl4cf1e782hg__)}function O(e){return e.__impl4cf1e782hg__}function L(e,t){t.__impl4cf1e782hg__=e,e.__wrapper8e3dd93a60__=t}function N(e){return e&&_(e)?M(e):e}function C(e){return e&&!_(e)?T(e):e}function j(e,t){null!==t&&(n(S(e)),n(void 0===t||_(t)),e.__wrapper8e3dd93a60__=t)}function D(e,t,n){G.get=n,A(e.prototype,t,G)}function H(e,t){D(e,t,function(){return T(this.__impl4cf1e782hg__[t])})}function x(e,t){e.forEach(function(e){t.forEach(function(t){e.prototype[t]=function(){var e=C(this);return e[t].apply(e,arguments)}})})}var R=new WeakMap,I=new WeakMap,P=Object.create(null),k=t(),A=Object.defineProperty,W=Object.getOwnPropertyNames,F=Object.getOwnPropertyDescriptor,U={value:void 0,configurable:!0,enumerable:!1,writable:!0};W(window);var q=/Firefox/.test(navigator.userAgent),B={get:function(){},set:function(e){},configurable:!0,enumerable:!0},V=function(){var e=Object.getOwnPropertyDescriptor(Node.prototype,"nodeType");return e&&!e.get&&!e.set}(),G={get:void 0,configurable:!0,enumerable:!0};e.addForwardingProperties=c,e.assert=n,e.constructorTable=R,e.defineGetter=D,e.defineWrapGetter=H,e.forwardMethodsToWrapper=x,e.isIdentifierName=d,e.isWrapper=_,e.isWrapperFor=b,e.mixin=r,e.nativePrototypeTable=I,e.oneOf=i,e.registerObject=y,e.registerWrapper=v,e.rewrap=j,e.setWrapper=L,e.unsafeUnwrap=O,e.unwrap=M,e.unwrapIfNeeded=N,e.wrap=T,e.wrapIfNeeded=C,e.wrappers=P}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e,t,n){return{index:e,removed:t,addedCount:n}}function n(){}var r=0,o=1,i=2,a=3;n.prototype={calcEditDistances:function(e,t,n,r,o,i){for(var a=i-o+1,s=n-t+1,c=new Array(a),l=0;a>l;l++)c[l]=new Array(s),c[l][0]=l;for(var u=0;s>u;u++)c[0][u]=u;for(var l=1;a>l;l++)for(var u=1;s>u;u++)if(this.equals(e[t+u-1],r[o+l-1]))c[l][u]=c[l-1][u-1];else{var d=c[l-1][u]+1,p=c[l][u-1]+1;c[l][u]=p>d?d:p}return c},spliceOperationsFromEditDistances:function(e){for(var t=e.length-1,n=e[0].length-1,s=e[t][n],c=[];t>0||n>0;)if(0!=t)if(0!=n){var l,u=e[t-1][n-1],d=e[t-1][n],p=e[t][n-1];l=p>d?u>d?d:u:u>p?p:u,l==u?(u==s?c.push(r):(c.push(o),s=u),t--,n--):l==d?(c.push(a),t--,s=d):(c.push(i),n--,s=p)}else c.push(a),t--;else c.push(i),n--;return c.reverse(),c},calcSplices:function(e,n,s,c,l,u){var d=0,p=0,h=Math.min(s-n,u-l);if(0==n&&0==l&&(d=this.sharedPrefix(e,c,h)),s==e.length&&u==c.length&&(p=this.sharedSuffix(e,c,h-d)),n+=d,l+=d,s-=p,u-=p,s-n==0&&u-l==0)return[];if(n==s){for(var f=t(n,[],0);u>l;)f.removed.push(c[l++]);return[f]}if(l==u)return[t(n,[],s-n)];for(var m=this.spliceOperationsFromEditDistances(this.calcEditDistances(e,n,s,c,l,u)),f=void 0,w=[],v=n,g=l,b=0;b<m.length;b++)switch(m[b]){case r:f&&(w.push(f),f=void 0),v++,g++;break;case o:f||(f=t(v,[],0)),f.addedCount++,v++,f.removed.push(c[g]),g++;break;case i:f||(f=t(v,[],0)),f.addedCount++,v++;break;case a:f||(f=t(v,[],0)),f.removed.push(c[g]),g++}return f&&w.push(f),w},sharedPrefix:function(e,t,n){for(var r=0;n>r;r++)if(!this.equals(e[r],t[r]))return r;return n},sharedSuffix:function(e,t,n){for(var r=e.length,o=t.length,i=0;n>i&&this.equals(e[--r],t[--o]);)i++;return i},calculateSplices:function(e,t){return this.calcSplices(e,0,e.length,t,0,t.length)},equals:function(e,t){return e===t}},e.ArraySplice=n}(window.ShadowDOMPolyfill),function(e){"use strict";function t(){a=!1;var e=i.slice(0);i=[];for(var t=0;t<e.length;t++)(0,e[t])()}function n(e){i.push(e),a||(a=!0,r(t,0))}var r,o=window.MutationObserver,i=[],a=!1;if(o){var s=1,c=new o(t),l=document.createTextNode(s);c.observe(l,{characterData:!0}),r=function(){s=(s+1)%2,l.data=s}}else r=window.setTimeout;e.setEndOfMicrotask=n}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){e.scheduled_||(e.scheduled_=!0,f.push(e),m||(u(n),m=!0))}function n(){for(m=!1;f.length;){var e=f;f=[],e.sort(function(e,t){return e.uid_-t.uid_});for(var t=0;t<e.length;t++){var n=e[t];n.scheduled_=!1;var r=n.takeRecords();i(n),r.length&&n.callback_(r,n)}}}function r(e,t){this.type=e,this.target=t,this.addedNodes=new p.NodeList,this.removedNodes=new p.NodeList,this.previousSibling=null,this.nextSibling=null,this.attributeName=null,this.attributeNamespace=null,this.oldValue=null}function o(e,t){for(;e;e=e.parentNode){var n=h.get(e);if(n)for(var r=0;r<n.length;r++){var o=n[r];o.options.subtree&&o.addTransientObserver(t)}}}function i(e){for(var t=0;t<e.nodes_.length;t++){var n=e.nodes_[t],r=h.get(n);if(!r)return;for(var o=0;o<r.length;o++){var i=r[o];i.observer===e&&i.removeTransientObservers()}}}function a(e,n,o){for(var i=Object.create(null),a=Object.create(null),s=e;s;s=s.parentNode){var c=h.get(s);if(c)for(var l=0;l<c.length;l++){var u=c[l],d=u.options;if((s===e||d.subtree)&&("attributes"!==n||d.attributes)&&("attributes"!==n||!d.attributeFilter||null===o.namespace&&-1!==d.attributeFilter.indexOf(o.name))&&("characterData"!==n||d.characterData)&&("childList"!==n||d.childList)){var p=u.observer;i[p.uid_]=p,("attributes"===n&&d.attributeOldValue||"characterData"===n&&d.characterDataOldValue)&&(a[p.uid_]=o.oldValue)}}}for(var f in i){var p=i[f],m=new r(n,e);"name"in o&&"namespace"in o&&(m.attributeName=o.name,m.attributeNamespace=o.namespace),o.addedNodes&&(m.addedNodes=o.addedNodes),o.removedNodes&&(m.removedNodes=o.removedNodes),o.previousSibling&&(m.previousSibling=o.previousSibling),o.nextSibling&&(m.nextSibling=o.nextSibling),void 0!==a[f]&&(m.oldValue=a[f]),t(p),p.records_.push(m)}}function s(e){if(this.childList=!!e.childList,this.subtree=!!e.subtree,"attributes"in e||!("attributeOldValue"in e||"attributeFilter"in e)?this.attributes=!!e.attributes:this.attributes=!0,"characterDataOldValue"in e&&!("characterData"in e)?this.characterData=!0:this.characterData=!!e.characterData,!this.attributes&&(e.attributeOldValue||"attributeFilter"in e)||!this.characterData&&e.characterDataOldValue)throw new TypeError;if(this.characterData=!!e.characterData,this.attributeOldValue=!!e.attributeOldValue,this.characterDataOldValue=!!e.characterDataOldValue,"attributeFilter"in e){if(null==e.attributeFilter||"object"!=typeof e.attributeFilter)throw new TypeError;this.attributeFilter=w.call(e.attributeFilter)}else this.attributeFilter=null}function c(e){this.callback_=e,this.nodes_=[],this.records_=[],this.uid_=++v,this.scheduled_=!1}function l(e,t,n){this.observer=e,this.target=t,this.options=n,this.transientObservedNodes=[]}var u=e.setEndOfMicrotask,d=e.wrapIfNeeded,p=e.wrappers,h=new WeakMap,f=[],m=!1,w=Array.prototype.slice,v=0;c.prototype={constructor:c,observe:function(e,t){e=d(e);var n,r=new s(t),o=h.get(e);o||h.set(e,o=[]);for(var i=0;i<o.length;i++)o[i].observer===this&&(n=o[i],n.removeTransientObservers(),n.options=r);n||(n=new l(this,e,r),o.push(n),this.nodes_.push(e))},disconnect:function(){this.nodes_.forEach(function(e){for(var t=h.get(e),n=0;n<t.length;n++){var r=t[n];if(r.observer===this){t.splice(n,1);break}}},this),this.records_=[]},takeRecords:function(){var e=this.records_;return this.records_=[],e}},l.prototype={addTransientObserver:function(e){if(e!==this.target){t(this.observer),this.transientObservedNodes.push(e);var n=h.get(e);n||h.set(e,n=[]),n.push(this)}},removeTransientObservers:function(){var e=this.transientObservedNodes;this.transientObservedNodes=[];for(var t=0;t<e.length;t++)for(var n=e[t],r=h.get(n),o=0;o<r.length;o++)if(r[o]===this){r.splice(o,1);break}}},e.enqueueMutation=a,e.registerTransientObservers=o,e.wrappers.MutationObserver=c,e.wrappers.MutationRecord=r}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e,t){this.root=e,this.parent=t}function n(e,t){if(e.treeScope_!==t){e.treeScope_=t;for(var r=e.shadowRoot;r;r=r.olderShadowRoot)r.treeScope_.parent=t;for(var o=e.firstChild;o;o=o.nextSibling)n(o,t)}}function r(n){if(n instanceof e.wrappers.Window,n.treeScope_)return n.treeScope_;var o,i=n.parentNode;return o=i?r(i):new t(n,null),n.treeScope_=o}t.prototype={get renderer(){return this.root instanceof e.wrappers.ShadowRoot?e.getRendererForHost(this.root.host):null},contains:function(e){for(;e;e=e.parent)if(e===this)return!0;return!1}},e.TreeScope=t,e.getTreeScope=r,e.setTreeScope=n}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){return e instanceof G.ShadowRoot}function n(e){return A(e).root}function r(e,r){var s=[],c=e;for(s.push(c);c;){var l=a(c);if(l&&l.length>0){for(var u=0;u<l.length;u++){var p=l[u];if(i(p)){var h=n(p),f=h.olderShadowRoot;f&&s.push(f)}s.push(p)}c=l[l.length-1]}else if(t(c)){if(d(e,c)&&o(r))break;c=c.host,s.push(c)}else c=c.parentNode,c&&s.push(c)}return s}function o(e){if(!e)return!1;switch(e.type){case"abort":case"error":case"select":case"change":case"load":case"reset":case"resize":case"scroll":case"selectstart":return!0}return!1}function i(e){return e instanceof HTMLShadowElement}function a(t){return e.getDestinationInsertionPoints(t)}function s(e,t){if(0===e.length)return t;t instanceof G.Window&&(t=t.document);for(var n=A(t),r=e[0],o=A(r),i=l(n,o),a=0;a<e.length;a++){var s=e[a];if(A(s)===i)return s}return e[e.length-1]}function c(e){for(var t=[];e;e=e.parent)t.push(e);return t}function l(e,t){for(var n=c(e),r=c(t),o=null;n.length>0&&r.length>0;){var i=n.pop(),a=r.pop();if(i!==a)break;o=i}return o}function u(e,t,n){t instanceof G.Window&&(t=t.document);var o,i=A(t),a=A(n),s=r(n,e),o=l(i,a);o||(o=a.root);for(var c=o;c;c=c.parent)for(var u=0;u<s.length;u++){var d=s[u];if(A(d)===c)return d}return null}function d(e,t){return A(e)===A(t)}function p(e){if(!K.get(e)&&(K.set(e,!0),f(V(e),V(e.target)),P)){var t=P;throw P=null,t}}function h(e){switch(e.type){case"load":case"beforeunload":case"unload":return!0}return!1}function f(t,n){if($.get(t))throw new Error("InvalidStateError");$.set(t,!0),e.renderAllPending();var o,i,a;if(h(t)&&!t.bubbles){var s=n;s instanceof G.Document&&(a=s.defaultView)&&(i=s,o=[])}if(!o)if(n instanceof G.Window)a=n,o=[];else if(o=r(n,t),!h(t)){var s=o[o.length-1];s instanceof G.Document&&(a=s.defaultView)}return ne.set(t,o),m(t,o,a,i)&&w(t,o,a,i)&&v(t,o,a,i),J.set(t,re),Y["delete"](t,null),$["delete"](t),t.defaultPrevented}function m(e,t,n,r){var o=oe;if(n&&!g(n,e,o,t,r))return!1;for(var i=t.length-1;i>0;i--)if(!g(t[i],e,o,t,r))return!1;return!0}function w(e,t,n,r){var o=ie,i=t[0]||n;return g(i,e,o,t,r)}function v(e,t,n,r){for(var o=ae,i=1;i<t.length;i++)if(!g(t[i],e,o,t,r))return;n&&t.length>0&&g(n,e,o,t,r)}function g(e,t,n,r,o){var i=z.get(e);if(!i)return!0;var a=o||s(r,e);if(a===e){if(n===oe)return!0;n===ae&&(n=ie)}else if(n===ae&&!t.bubbles)return!0;if("relatedTarget"in t){var c=B(t),l=c.relatedTarget;if(l){if(l instanceof Object&&l.addEventListener){var d=V(l),p=u(t,e,d);if(p===a)return!0}else p=null;Z.set(t,p)}}J.set(t,n);var h=t.type,f=!1;X.set(t,a),Y.set(t,e),i.depth++;for(var m=0,w=i.length;w>m;m++){var v=i[m];if(v.removed)f=!0;else if(!(v.type!==h||!v.capture&&n===oe||v.capture&&n===ae))try{if("function"==typeof v.handler?v.handler.call(e,t):v.handler.handleEvent(t),ee.get(t))return!1}catch(g){P||(P=g)}}if(i.depth--,f&&0===i.depth){var b=i.slice();i.length=0;for(var m=0;m<b.length;m++)b[m].removed||i.push(b[m])}return!Q.get(t)}function b(e,t,n){this.type=e,this.handler=t,this.capture=Boolean(n)}function y(e,t){if(!(e instanceof se))return V(T(se,"Event",e,t));var n=e;return be||"beforeunload"!==n.type||this instanceof M?void U(n,this):new M(n)}function E(e){return e&&e.relatedTarget?Object.create(e,{relatedTarget:{value:B(e.relatedTarget)}}):e}function _(e,t,n){var r=window[e],o=function(t,n){return t instanceof r?void U(t,this):V(T(r,e,t,n))};if(o.prototype=Object.create(t.prototype),n&&W(o.prototype,n),r)try{F(r,o,new r("temp"))}catch(i){F(r,o,document.createEvent(e))}return o}function S(e,t){return function(){arguments[t]=B(arguments[t]);var n=B(this);n[e].apply(n,arguments)}}function T(e,t,n,r){if(ve)return new e(n,E(r));var o=B(document.createEvent(t)),i=we[t],a=[n];return Object.keys(i).forEach(function(e){var t=null!=r&&e in r?r[e]:i[e];"relatedTarget"===e&&(t=B(t)),a.push(t)}),o["init"+t].apply(o,a),o}function M(e){y.call(this,e)}function O(e){return"function"==typeof e?!0:e&&e.handleEvent}function L(e){switch(e){case"DOMAttrModified":case"DOMAttributeNameChanged":case"DOMCharacterDataModified":case"DOMElementNameChanged":case"DOMNodeInserted":case"DOMNodeInsertedIntoDocument":case"DOMNodeRemoved":case"DOMNodeRemovedFromDocument":case"DOMSubtreeModified":return!0}return!1}function N(e){U(e,this)}function C(e){return e instanceof G.ShadowRoot&&(e=e.host),B(e)}function j(e,t){var n=z.get(e);if(n)for(var r=0;r<n.length;r++)if(!n[r].removed&&n[r].type===t)return!0;return!1}function D(e,t){for(var n=B(e);n;n=n.parentNode)if(j(V(n),t))return!0;return!1}function H(e){k(e,Ee)}function x(t,n,o,i){e.renderAllPending();var a=V(_e.call(q(n),o,i));if(!a)return null;var c=r(a,null),l=c.lastIndexOf(t);return-1==l?null:(c=c.slice(0,l),s(c,t))}function R(e){return function(){var t=te.get(this);return t&&t[e]&&t[e].value||null}}function I(e){var t=e.slice(2);return function(n){var r=te.get(this);r||(r=Object.create(null),te.set(this,r));var o=r[e];if(o&&this.removeEventListener(t,o.wrapped,!1),"function"==typeof n){var i=function(t){var r=n.call(this,t);r===!1?t.preventDefault():"onbeforeunload"===e&&"string"==typeof r&&(t.returnValue=r)};this.addEventListener(t,i,!1),r[e]={value:n,wrapped:i}}}}var P,k=e.forwardMethodsToWrapper,A=e.getTreeScope,W=e.mixin,F=e.registerWrapper,U=e.setWrapper,q=e.unsafeUnwrap,B=e.unwrap,V=e.wrap,G=e.wrappers,z=(new WeakMap,new WeakMap),K=new WeakMap,$=new WeakMap,X=new WeakMap,Y=new WeakMap,Z=new WeakMap,J=new WeakMap,Q=new WeakMap,ee=new WeakMap,te=new WeakMap,ne=new WeakMap,re=0,oe=1,ie=2,ae=3;b.prototype={equals:function(e){return this.handler===e.handler&&this.type===e.type&&this.capture===e.capture},get removed(){return null===this.handler},remove:function(){this.handler=null}};var se=window.Event;se.prototype.polymerBlackList_={returnValue:!0,keyLocation:!0},y.prototype={get target(){return X.get(this)},get currentTarget(){return Y.get(this)},get eventPhase(){return J.get(this)},get path(){var e=ne.get(this);return e?e.slice():[]},stopPropagation:function(){Q.set(this,!0)},stopImmediatePropagation:function(){Q.set(this,!0),ee.set(this,!0)}};var ce=function(){var e=document.createEvent("Event");return e.initEvent("test",!0,!0),e.preventDefault(),e.defaultPrevented}();ce||(y.prototype.preventDefault=function(){this.cancelable&&(q(this).preventDefault(),Object.defineProperty(this,"defaultPrevented",{get:function(){return!0},configurable:!0}))}),F(se,y,document.createEvent("Event"));var le=_("UIEvent",y),ue=_("CustomEvent",y),de={get relatedTarget(){var e=Z.get(this);return void 0!==e?e:V(B(this).relatedTarget)}},pe=W({initMouseEvent:S("initMouseEvent",14)},de),he=W({initFocusEvent:S("initFocusEvent",5)},de),fe=_("MouseEvent",le,pe),me=_("FocusEvent",le,he),we=Object.create(null),ve=function(){try{new window.FocusEvent("focus")}catch(e){return!1}return!0}();if(!ve){var ge=function(e,t,n){if(n){var r=we[n];t=W(W({},r),t)}we[e]=t};ge("Event",{bubbles:!1,cancelable:!1}),ge("CustomEvent",{detail:null},"Event"),ge("UIEvent",{view:null,detail:0},"Event"),ge("MouseEvent",{screenX:0,screenY:0,clientX:0,clientY:0,ctrlKey:!1,altKey:!1,shiftKey:!1,metaKey:!1,button:0,relatedTarget:null},"UIEvent"),ge("FocusEvent",{relatedTarget:null},"UIEvent")}var be=window.BeforeUnloadEvent;M.prototype=Object.create(y.prototype),W(M.prototype,{get returnValue(){return q(this).returnValue},set returnValue(e){q(this).returnValue=e}}),be&&F(be,M);var ye=window.EventTarget,Ee=["addEventListener","removeEventListener","dispatchEvent"];[Node,Window].forEach(function(e){var t=e.prototype;Ee.forEach(function(e){Object.defineProperty(t,e+"_",{value:t[e]})})}),N.prototype={addEventListener:function(e,t,n){if(O(t)&&!L(e)){var r=new b(e,t,n),o=z.get(this);if(o){for(var i=0;i<o.length;i++)if(r.equals(o[i]))return}else o=[],o.depth=0,z.set(this,o);o.push(r);var a=C(this);a.addEventListener_(e,p,!0)}},removeEventListener:function(e,t,n){n=Boolean(n);var r=z.get(this);if(r){for(var o=0,i=!1,a=0;a<r.length;a++)r[a].type===e&&r[a].capture===n&&(o++,r[a].handler===t&&(i=!0,r[a].remove()));if(i&&1===o){var s=C(this);s.removeEventListener_(e,p,!0)}}},dispatchEvent:function(t){var n=B(t),r=n.type;K.set(n,!1),e.renderAllPending();var o;D(this,r)||(o=function(){},this.addEventListener(r,o,!0));try{return B(this).dispatchEvent_(n)}finally{o&&this.removeEventListener(r,o,!0)}}},ye&&F(ye,N);var _e=document.elementFromPoint;e.elementFromPoint=x,e.getEventHandlerGetter=R,e.getEventHandlerSetter=I,e.wrapEventTargetMethods=H,e.wrappers.BeforeUnloadEvent=M,e.wrappers.CustomEvent=ue,e.wrappers.Event=y,e.wrappers.EventTarget=N,e.wrappers.FocusEvent=me,e.wrappers.MouseEvent=fe,e.wrappers.UIEvent=le}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e,t){Object.defineProperty(e,t,m)}function n(e){l(e,this)}function r(){this.length=0,t(this,"length")}function o(e){for(var t=new r,o=0;o<e.length;o++)t[o]=new n(e[o]);return t.length=o,t}function i(e){a.call(this,e)}var a=e.wrappers.UIEvent,s=e.mixin,c=e.registerWrapper,l=e.setWrapper,u=e.unsafeUnwrap,d=e.wrap,p=window.TouchEvent;if(p){var h;try{h=document.createEvent("TouchEvent")}catch(f){return}var m={enumerable:!1};n.prototype={get target(){return d(u(this).target)}};var w={configurable:!0,enumerable:!0,get:null};["clientX","clientY","screenX","screenY","pageX","pageY","identifier","webkitRadiusX","webkitRadiusY","webkitRotationAngle","webkitForce"].forEach(function(e){w.get=function(){return u(this)[e]},Object.defineProperty(n.prototype,e,w)}),r.prototype={item:function(e){return this[e]}},i.prototype=Object.create(a.prototype),s(i.prototype,{get touches(){return o(u(this).touches)},get targetTouches(){return o(u(this).targetTouches)},get changedTouches(){return o(u(this).changedTouches)},initTouchEvent:function(){throw new Error("Not implemented")}}),c(p,i,h),e.wrappers.Touch=n,e.wrappers.TouchEvent=i,e.wrappers.TouchList=r}}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e,t){Object.defineProperty(e,t,s)}function n(){this.length=0,t(this,"length")}function r(e){if(null==e)return e;for(var t=new n,r=0,o=e.length;o>r;r++)t[r]=a(e[r]);return t.length=o,t}function o(e,t){e.prototype[t]=function(){return r(i(this)[t].apply(i(this),arguments))}}var i=e.unsafeUnwrap,a=e.wrap,s={enumerable:!1};n.prototype={item:function(e){return this[e]}},t(n.prototype,"item"),e.wrappers.NodeList=n,e.addWrapNodeListMethod=o,e.wrapNodeList=r}(window.ShadowDOMPolyfill),function(e){"use strict";e.wrapHTMLCollection=e.wrapNodeList,e.wrappers.HTMLCollection=e.wrappers.NodeList}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){O(e instanceof _)}function n(e){var t=new T;return t[0]=e,t.length=1,t}function r(e,t,n){N(t,"childList",{removedNodes:n,previousSibling:e.previousSibling,nextSibling:e.nextSibling})}function o(e,t){N(e,"childList",{removedNodes:t})}function i(e,t,r,o){if(e instanceof DocumentFragment){var i=s(e);U=!0;for(var a=i.length-1;a>=0;a--)e.removeChild(i[a]),i[a].parentNode_=t;U=!1;for(var a=0;a<i.length;a++)i[a].previousSibling_=i[a-1]||r,i[a].nextSibling_=i[a+1]||o;return r&&(r.nextSibling_=i[0]),o&&(o.previousSibling_=i[i.length-1]),i}var i=n(e),c=e.parentNode;return c&&c.removeChild(e),e.parentNode_=t,e.previousSibling_=r,e.nextSibling_=o,r&&(r.nextSibling_=e),o&&(o.previousSibling_=e),i}function a(e){if(e instanceof DocumentFragment)return s(e);var t=n(e),o=e.parentNode;return o&&r(e,o,t),t}function s(e){for(var t=new T,n=0,r=e.firstChild;r;r=r.nextSibling)t[n++]=r;return t.length=n,o(e,t),t}function c(e){return e}function l(e,t){R(e,t),e.nodeIsInserted_()}function u(e,t){for(var n=C(t),r=0;r<e.length;r++)l(e[r],n)}function d(e){R(e,new M(e,null))}function p(e){for(var t=0;t<e.length;t++)d(e[t])}function h(e,t){var n=e.nodeType===_.DOCUMENT_NODE?e:e.ownerDocument;n!==t.ownerDocument&&n.adoptNode(t)}function f(t,n){if(n.length){var r=t.ownerDocument;if(r!==n[0].ownerDocument)for(var o=0;o<n.length;o++)e.adoptNodeNoRemove(n[o],r)}}function m(e,t){f(e,t);var n=t.length;if(1===n)return P(t[0]);for(var r=P(e.ownerDocument.createDocumentFragment()),o=0;n>o;o++)r.appendChild(P(t[o]));return r}function w(e){if(void 0!==e.firstChild_)for(var t=e.firstChild_;t;){var n=t;t=t.nextSibling_,n.parentNode_=n.previousSibling_=n.nextSibling_=void 0}e.firstChild_=e.lastChild_=void 0}function v(e){if(e.invalidateShadowRenderer()){for(var t=e.firstChild;t;){O(t.parentNode===e);var n=t.nextSibling,r=P(t),o=r.parentNode;o&&X.call(o,r),t.previousSibling_=t.nextSibling_=t.parentNode_=null,t=n}e.firstChild_=e.lastChild_=null}else for(var n,i=P(e),a=i.firstChild;a;)n=a.nextSibling,X.call(i,a),a=n}function g(e){var t=e.parentNode;return t&&t.invalidateShadowRenderer()}function b(e){for(var t,n=0;n<e.length;n++)t=e[n],t.parentNode.removeChild(t)}function y(e,t,n){var r;if(r=A(n?q.call(n,I(e),!1):B.call(I(e),!1)),t){for(var o=e.firstChild;o;o=o.nextSibling)r.appendChild(y(o,!0,n));if(e instanceof F.HTMLTemplateElement)for(var i=r.content,o=e.content.firstChild;o;o=o.nextSibling)i.appendChild(y(o,!0,n))}return r}function E(e,t){if(!t||C(e)!==C(t))return!1;for(var n=t;n;n=n.parentNode)if(n===e)return!0;return!1}function _(e){O(e instanceof V),S.call(this,e),this.parentNode_=void 0,this.firstChild_=void 0,this.lastChild_=void 0,this.nextSibling_=void 0,this.previousSibling_=void 0,this.treeScope_=void 0}var S=e.wrappers.EventTarget,T=e.wrappers.NodeList,M=e.TreeScope,O=e.assert,L=e.defineWrapGetter,N=e.enqueueMutation,C=e.getTreeScope,j=e.isWrapper,D=e.mixin,H=e.registerTransientObservers,x=e.registerWrapper,R=e.setTreeScope,I=e.unsafeUnwrap,P=e.unwrap,k=e.unwrapIfNeeded,A=e.wrap,W=e.wrapIfNeeded,F=e.wrappers,U=!1,q=document.importNode,B=window.Node.prototype.cloneNode,V=window.Node,G=window.DocumentFragment,z=(V.prototype.appendChild,V.prototype.compareDocumentPosition),K=V.prototype.isEqualNode,$=V.prototype.insertBefore,X=V.prototype.removeChild,Y=V.prototype.replaceChild,Z=/Trident|Edge/.test(navigator.userAgent),J=Z?function(e,t){try{X.call(e,t)}catch(n){if(!(e instanceof G))throw n}}:function(e,t){X.call(e,t)};_.prototype=Object.create(S.prototype),D(_.prototype,{appendChild:function(e){return this.insertBefore(e,null)},insertBefore:function(e,n){t(e);var r;n?j(n)?r=P(n):(r=n,n=A(r)):(n=null,r=null),n&&O(n.parentNode===this);var o,s=n?n.previousSibling:this.lastChild,c=!this.invalidateShadowRenderer()&&!g(e);if(o=c?a(e):i(e,this,s,n),c)h(this,e),w(this),$.call(I(this),P(e),r);else{s||(this.firstChild_=o[0]),n||(this.lastChild_=o[o.length-1],void 0===this.firstChild_&&(this.firstChild_=this.firstChild));var l=r?r.parentNode:I(this);l?$.call(l,m(this,o),r):f(this,o)}return N(this,"childList",{addedNodes:o,nextSibling:n,previousSibling:s}),u(o,this),e},removeChild:function(e){if(t(e),e.parentNode!==this){for(var r=!1,o=(this.childNodes,this.firstChild);o;o=o.nextSibling)if(o===e){r=!0;break}if(!r)throw new Error("NotFoundError")}var i=P(e),a=e.nextSibling,s=e.previousSibling;if(this.invalidateShadowRenderer()){var c=this.firstChild,l=this.lastChild,u=i.parentNode;u&&J(u,i),c===e&&(this.firstChild_=a),l===e&&(this.lastChild_=s),s&&(s.nextSibling_=a),a&&(a.previousSibling_=s),e.previousSibling_=e.nextSibling_=e.parentNode_=void 0}else w(this),J(I(this),i);return U||N(this,"childList",{removedNodes:n(e),nextSibling:a,previousSibling:s}),H(this,e),e},replaceChild:function(e,r){t(e);var o;if(j(r)?o=P(r):(o=r,r=A(o)),r.parentNode!==this)throw new Error("NotFoundError");var s,c=r.nextSibling,l=r.previousSibling,p=!this.invalidateShadowRenderer()&&!g(e);return p?s=a(e):(c===e&&(c=e.nextSibling),s=i(e,this,l,c)),p?(h(this,e),w(this),Y.call(I(this),P(e),o)):(this.firstChild===r&&(this.firstChild_=s[0]),this.lastChild===r&&(this.lastChild_=s[s.length-1]),r.previousSibling_=r.nextSibling_=r.parentNode_=void 0,o.parentNode&&Y.call(o.parentNode,m(this,s),o)),N(this,"childList",{addedNodes:s,removedNodes:n(r),nextSibling:c,previousSibling:l}),d(r),u(s,this),r},nodeIsInserted_:function(){for(var e=this.firstChild;e;e=e.nextSibling)e.nodeIsInserted_()},hasChildNodes:function(){return null!==this.firstChild},get parentNode(){return void 0!==this.parentNode_?this.parentNode_:A(I(this).parentNode)},get firstChild(){return void 0!==this.firstChild_?this.firstChild_:A(I(this).firstChild)},get lastChild(){return void 0!==this.lastChild_?this.lastChild_:A(I(this).lastChild)},get nextSibling(){return void 0!==this.nextSibling_?this.nextSibling_:A(I(this).nextSibling)},get previousSibling(){return void 0!==this.previousSibling_?this.previousSibling_:A(I(this).previousSibling)},get parentElement(){for(var e=this.parentNode;e&&e.nodeType!==_.ELEMENT_NODE;)e=e.parentNode;return e},get textContent(){for(var e="",t=this.firstChild;t;t=t.nextSibling)t.nodeType!=_.COMMENT_NODE&&(e+=t.textContent);return e},set textContent(e){null==e&&(e="");var t=c(this.childNodes);if(this.invalidateShadowRenderer()){if(v(this),""!==e){var n=I(this).ownerDocument.createTextNode(e);this.appendChild(n)}}else w(this),I(this).textContent=e;var r=c(this.childNodes);N(this,"childList",{addedNodes:r,removedNodes:t}),p(t),u(r,this)},get childNodes(){for(var e=new T,t=0,n=this.firstChild;n;n=n.nextSibling)e[t++]=n;return e.length=t,e},cloneNode:function(e){return y(this,e)},contains:function(e){return E(this,W(e))},compareDocumentPosition:function(e){return z.call(I(this),k(e))},isEqualNode:function(e){return K.call(I(this),k(e))},normalize:function(){for(var e,t,n=c(this.childNodes),r=[],o="",i=0;i<n.length;i++)t=n[i],t.nodeType===_.TEXT_NODE?e||t.data.length?e?(o+=t.data,r.push(t)):e=t:this.removeChild(t):(e&&r.length&&(e.data+=o,b(r)),r=[],o="",e=null,t.childNodes.length&&t.normalize());e&&r.length&&(e.data+=o,b(r))}}),L(_,"ownerDocument"),x(V,_,document.createDocumentFragment()),delete _.prototype.querySelector,delete _.prototype.querySelectorAll,_.prototype=D(Object.create(S.prototype),_.prototype),e.cloneNode=y,e.nodeWasAdded=l,e.nodeWasRemoved=d,e.nodesWereAdded=u,e.nodesWereRemoved=p,e.originalInsertBefore=$,e.originalRemoveChild=X,e.snapshotNodeList=c,e.wrappers.Node=_}(window.ShadowDOMPolyfill),function(e){"use strict";function t(t,n,r,o){for(var i=null,a=null,s=0,c=t.length;c>s;s++)i=b(t[s]),!o&&(a=v(i).root)&&a instanceof e.wrappers.ShadowRoot||(r[n++]=i);return n}function n(e){return String(e).replace(/\/deep\/|::shadow|>>>/g," ")}function r(e){return String(e).replace(/:host\(([^\s]+)\)/g,"$1").replace(/([^\s]):host/g,"$1").replace(":host","*").replace(/\^|\/shadow\/|\/shadow-deep\/|::shadow|\/deep\/|::content|>>>/g," ")}function o(e,t){for(var n,r=e.firstElementChild;r;){if(r.matches(t))return r;if(n=o(r,t))return n;r=r.nextElementSibling}return null}function i(e,t){return e.matches(t)}function a(e,t,n){var r=e.localName;return r===t||r===n&&e.namespaceURI===j}function s(){return!0}function c(e,t,n){return e.localName===n}function l(e,t){return e.namespaceURI===t}function u(e,t,n){return e.namespaceURI===t&&e.localName===n}function d(e,t,n,r,o,i){for(var a=e.firstElementChild;a;)r(a,o,i)&&(n[t++]=a),t=d(a,t,n,r,o,i),a=a.nextElementSibling;return t}function p(n,r,o,i,a){var s,c=g(this),l=v(this).root;if(l instanceof e.wrappers.ShadowRoot)return d(this,r,o,n,i,null);if(c instanceof N)s=S.call(c,i);else{if(!(c instanceof C))return d(this,r,o,n,i,null);s=_.call(c,i)}return t(s,r,o,a)}function h(n,r,o,i,a){var s,c=g(this),l=v(this).root;if(l instanceof e.wrappers.ShadowRoot)return d(this,r,o,n,i,a);if(c instanceof N)s=M.call(c,i,a);else{if(!(c instanceof C))return d(this,r,o,n,i,a);s=T.call(c,i,a)}return t(s,r,o,!1)}function f(n,r,o,i,a){var s,c=g(this),l=v(this).root;if(l instanceof e.wrappers.ShadowRoot)return d(this,r,o,n,i,a);if(c instanceof N)s=L.call(c,i,a);else{if(!(c instanceof C))return d(this,r,o,n,i,a);s=O.call(c,i,a)}return t(s,r,o,!1)}var m=e.wrappers.HTMLCollection,w=e.wrappers.NodeList,v=e.getTreeScope,g=e.unsafeUnwrap,b=e.wrap,y=document.querySelector,E=document.documentElement.querySelector,_=document.querySelectorAll,S=document.documentElement.querySelectorAll,T=document.getElementsByTagName,M=document.documentElement.getElementsByTagName,O=document.getElementsByTagNameNS,L=document.documentElement.getElementsByTagNameNS,N=window.Element,C=window.HTMLDocument||window.Document,j="http://www.w3.org/1999/xhtml",D={
  6023. querySelector:function(t){var r=n(t),i=r!==t;t=r;var a,s=g(this),c=v(this).root;if(c instanceof e.wrappers.ShadowRoot)return o(this,t);if(s instanceof N)a=b(E.call(s,t));else{if(!(s instanceof C))return o(this,t);a=b(y.call(s,t))}return a&&!i&&(c=v(a).root)&&c instanceof e.wrappers.ShadowRoot?o(this,t):a},querySelectorAll:function(e){var t=n(e),r=t!==e;e=t;var o=new w;return o.length=p.call(this,i,0,o,e,r),o}},H={matches:function(t){return t=r(t),e.originalMatches.call(g(this),t)}},x={getElementsByTagName:function(e){var t=new m,n="*"===e?s:a;return t.length=h.call(this,n,0,t,e,e.toLowerCase()),t},getElementsByClassName:function(e){return this.querySelectorAll("."+e)},getElementsByTagNameNS:function(e,t){var n=new m,r=null;return r="*"===e?"*"===t?s:c:"*"===t?l:u,n.length=f.call(this,r,0,n,e||null,t),n}};e.GetElementsByInterface=x,e.SelectorsInterface=D,e.MatchesInterface=H}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){for(;e&&e.nodeType!==Node.ELEMENT_NODE;)e=e.nextSibling;return e}function n(e){for(;e&&e.nodeType!==Node.ELEMENT_NODE;)e=e.previousSibling;return e}var r=e.wrappers.NodeList,o={get firstElementChild(){return t(this.firstChild)},get lastElementChild(){return n(this.lastChild)},get childElementCount(){for(var e=0,t=this.firstElementChild;t;t=t.nextElementSibling)e++;return e},get children(){for(var e=new r,t=0,n=this.firstElementChild;n;n=n.nextElementSibling)e[t++]=n;return e.length=t,e},remove:function(){var e=this.parentNode;e&&e.removeChild(this)}},i={get nextElementSibling(){return t(this.nextSibling)},get previousElementSibling(){return n(this.previousSibling)}},a={getElementById:function(e){return/[ \t\n\r\f]/.test(e)?null:this.querySelector('[id="'+e+'"]')}};e.ChildNodeInterface=i,e.NonElementParentNodeInterface=a,e.ParentNodeInterface=o}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){r.call(this,e)}var n=e.ChildNodeInterface,r=e.wrappers.Node,o=e.enqueueMutation,i=e.mixin,a=e.registerWrapper,s=e.unsafeUnwrap,c=window.CharacterData;t.prototype=Object.create(r.prototype),i(t.prototype,{get nodeValue(){return this.data},set nodeValue(e){this.data=e},get textContent(){return this.data},set textContent(e){this.data=e},get data(){return s(this).data},set data(e){var t=s(this).data;o(this,"characterData",{oldValue:t}),s(this).data=e}}),i(t.prototype,n),a(c,t,document.createTextNode("")),e.wrappers.CharacterData=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){return e>>>0}function n(e){r.call(this,e)}var r=e.wrappers.CharacterData,o=(e.enqueueMutation,e.mixin),i=e.registerWrapper,a=window.Text;n.prototype=Object.create(r.prototype),o(n.prototype,{splitText:function(e){e=t(e);var n=this.data;if(e>n.length)throw new Error("IndexSizeError");var r=n.slice(0,e),o=n.slice(e);this.data=r;var i=this.ownerDocument.createTextNode(o);return this.parentNode&&this.parentNode.insertBefore(i,this.nextSibling),i}}),i(a,n,document.createTextNode("")),e.wrappers.Text=n}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){return i(e).getAttribute("class")}function n(e,t){a(e,"attributes",{name:"class",namespace:null,oldValue:t})}function r(t){e.invalidateRendererBasedOnAttribute(t,"class")}function o(e,o,i){var a=e.ownerElement_;if(null==a)return o.apply(e,i);var s=t(a),c=o.apply(e,i);return t(a)!==s&&(n(a,s),r(a)),c}if(!window.DOMTokenList)return void console.warn("Missing DOMTokenList prototype, please include a compatible classList polyfill such as http://goo.gl/uTcepH.");var i=e.unsafeUnwrap,a=e.enqueueMutation,s=DOMTokenList.prototype.add;DOMTokenList.prototype.add=function(){o(this,s,arguments)};var c=DOMTokenList.prototype.remove;DOMTokenList.prototype.remove=function(){o(this,c,arguments)};var l=DOMTokenList.prototype.toggle;DOMTokenList.prototype.toggle=function(){return o(this,l,arguments)}}(window.ShadowDOMPolyfill),function(e){"use strict";function t(t,n){var r=t.parentNode;if(r&&r.shadowRoot){var o=e.getRendererForHost(r);o.dependsOnAttribute(n)&&o.invalidate()}}function n(e,t,n){u(e,"attributes",{name:t,namespace:null,oldValue:n})}function r(e){a.call(this,e)}var o=e.ChildNodeInterface,i=e.GetElementsByInterface,a=e.wrappers.Node,s=e.ParentNodeInterface,c=e.SelectorsInterface,l=e.MatchesInterface,u=(e.addWrapNodeListMethod,e.enqueueMutation),d=e.mixin,p=(e.oneOf,e.registerWrapper),h=e.unsafeUnwrap,f=e.wrappers,m=window.Element,w=["matches","mozMatchesSelector","msMatchesSelector","webkitMatchesSelector"].filter(function(e){return m.prototype[e]}),v=w[0],g=m.prototype[v],b=new WeakMap;r.prototype=Object.create(a.prototype),d(r.prototype,{createShadowRoot:function(){var t=new f.ShadowRoot(this);h(this).polymerShadowRoot_=t;var n=e.getRendererForHost(this);return n.invalidate(),t},get shadowRoot(){return h(this).polymerShadowRoot_||null},setAttribute:function(e,r){var o=h(this).getAttribute(e);h(this).setAttribute(e,r),n(this,e,o),t(this,e)},removeAttribute:function(e){var r=h(this).getAttribute(e);h(this).removeAttribute(e),n(this,e,r),t(this,e)},get classList(){var e=b.get(this);if(!e){if(e=h(this).classList,!e)return;e.ownerElement_=this,b.set(this,e)}return e},get className(){return h(this).className},set className(e){this.setAttribute("class",e)},get id(){return h(this).id},set id(e){this.setAttribute("id",e)}}),w.forEach(function(e){"matches"!==e&&(r.prototype[e]=function(e){return this.matches(e)})}),m.prototype.webkitCreateShadowRoot&&(r.prototype.webkitCreateShadowRoot=r.prototype.createShadowRoot),d(r.prototype,o),d(r.prototype,i),d(r.prototype,s),d(r.prototype,c),d(r.prototype,l),p(m,r,document.createElementNS(null,"x")),e.invalidateRendererBasedOnAttribute=t,e.matchesNames=w,e.originalMatches=g,e.wrappers.Element=r}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){switch(e){case"&":return"&amp;";case"<":return"&lt;";case">":return"&gt;";case'"':return"&quot;";case" ":return"&nbsp;"}}function n(e){return e.replace(L,t)}function r(e){return e.replace(N,t)}function o(e){for(var t={},n=0;n<e.length;n++)t[e[n]]=!0;return t}function i(e){if(e.namespaceURI!==D)return!0;var t=e.ownerDocument.doctype;return t&&t.publicId&&t.systemId}function a(e,t){switch(e.nodeType){case Node.ELEMENT_NODE:for(var o,a=e.tagName.toLowerCase(),c="<"+a,l=e.attributes,u=0;o=l[u];u++)c+=" "+o.name+'="'+n(o.value)+'"';return C[a]?(i(e)&&(c+="/"),c+">"):c+">"+s(e)+"</"+a+">";case Node.TEXT_NODE:var d=e.data;return t&&j[t.localName]?d:r(d);case Node.COMMENT_NODE:return"<!--"+e.data+"-->";default:throw console.error(e),new Error("not implemented")}}function s(e){e instanceof O.HTMLTemplateElement&&(e=e.content);for(var t="",n=e.firstChild;n;n=n.nextSibling)t+=a(n,e);return t}function c(e,t,n){var r=n||"div";e.textContent="";var o=T(e.ownerDocument.createElement(r));o.innerHTML=t;for(var i;i=o.firstChild;)e.appendChild(M(i))}function l(e){m.call(this,e)}function u(e,t){var n=T(e.cloneNode(!1));n.innerHTML=t;for(var r,o=T(document.createDocumentFragment());r=n.firstChild;)o.appendChild(r);return M(o)}function d(t){return function(){return e.renderAllPending(),S(this)[t]}}function p(e){w(l,e,d(e))}function h(t){Object.defineProperty(l.prototype,t,{get:d(t),set:function(n){e.renderAllPending(),S(this)[t]=n},configurable:!0,enumerable:!0})}function f(t){Object.defineProperty(l.prototype,t,{value:function(){return e.renderAllPending(),S(this)[t].apply(S(this),arguments)},configurable:!0,enumerable:!0})}var m=e.wrappers.Element,w=e.defineGetter,v=e.enqueueMutation,g=e.mixin,b=e.nodesWereAdded,y=e.nodesWereRemoved,E=e.registerWrapper,_=e.snapshotNodeList,S=e.unsafeUnwrap,T=e.unwrap,M=e.wrap,O=e.wrappers,L=/[&\u00A0"]/g,N=/[&\u00A0<>]/g,C=o(["area","base","br","col","command","embed","hr","img","input","keygen","link","meta","param","source","track","wbr"]),j=o(["style","script","xmp","iframe","noembed","noframes","plaintext","noscript"]),D="http://www.w3.org/1999/xhtml",H=/MSIE/.test(navigator.userAgent),x=window.HTMLElement,R=window.HTMLTemplateElement;l.prototype=Object.create(m.prototype),g(l.prototype,{get innerHTML(){return s(this)},set innerHTML(e){if(H&&j[this.localName])return void(this.textContent=e);var t=_(this.childNodes);this.invalidateShadowRenderer()?this instanceof O.HTMLTemplateElement?c(this.content,e):c(this,e,this.tagName):!R&&this instanceof O.HTMLTemplateElement?c(this.content,e):S(this).innerHTML=e;var n=_(this.childNodes);v(this,"childList",{addedNodes:n,removedNodes:t}),y(t),b(n,this)},get outerHTML(){return a(this,this.parentNode)},set outerHTML(e){var t=this.parentNode;if(t){t.invalidateShadowRenderer();var n=u(t,e);t.replaceChild(n,this)}},insertAdjacentHTML:function(e,t){var n,r;switch(String(e).toLowerCase()){case"beforebegin":n=this.parentNode,r=this;break;case"afterend":n=this.parentNode,r=this.nextSibling;break;case"afterbegin":n=this,r=this.firstChild;break;case"beforeend":n=this,r=null;break;default:return}var o=u(n,t);n.insertBefore(o,r)},get hidden(){return this.hasAttribute("hidden")},set hidden(e){e?this.setAttribute("hidden",""):this.removeAttribute("hidden")}}),["clientHeight","clientLeft","clientTop","clientWidth","offsetHeight","offsetLeft","offsetTop","offsetWidth","scrollHeight","scrollWidth"].forEach(p),["scrollLeft","scrollTop"].forEach(h),["focus","getBoundingClientRect","getClientRects","scrollIntoView"].forEach(f),E(x,l,document.createElement("b")),e.wrappers.HTMLElement=l,e.getInnerHTML=s,e.setInnerHTML=c}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=e.unsafeUnwrap,a=e.wrap,s=window.HTMLCanvasElement;t.prototype=Object.create(n.prototype),r(t.prototype,{getContext:function(){var e=i(this).getContext.apply(i(this),arguments);return e&&a(e)}}),o(s,t,document.createElement("canvas")),e.wrappers.HTMLCanvasElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=window.HTMLContentElement;t.prototype=Object.create(n.prototype),r(t.prototype,{constructor:t,get select(){return this.getAttribute("select")},set select(e){this.setAttribute("select",e)},setAttribute:function(e,t){n.prototype.setAttribute.call(this,e,t),"select"===String(e).toLowerCase()&&this.invalidateShadowRenderer(!0)}}),i&&o(i,t),e.wrappers.HTMLContentElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=e.wrapHTMLCollection,a=e.unwrap,s=window.HTMLFormElement;t.prototype=Object.create(n.prototype),r(t.prototype,{get elements(){return i(a(this).elements)}}),o(s,t,document.createElement("form")),e.wrappers.HTMLFormElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){r.call(this,e)}function n(e,t){if(!(this instanceof n))throw new TypeError("DOM object constructor cannot be called as a function.");var o=i(document.createElement("img"));r.call(this,o),a(o,this),void 0!==e&&(o.width=e),void 0!==t&&(o.height=t)}var r=e.wrappers.HTMLElement,o=e.registerWrapper,i=e.unwrap,a=e.rewrap,s=window.HTMLImageElement;t.prototype=Object.create(r.prototype),o(s,t,document.createElement("img")),n.prototype=t.prototype,e.wrappers.HTMLImageElement=t,e.wrappers.Image=n}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=(e.mixin,e.wrappers.NodeList,e.registerWrapper),o=window.HTMLShadowElement;t.prototype=Object.create(n.prototype),t.prototype.constructor=t,o&&r(o,t),e.wrappers.HTMLShadowElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){if(!e.defaultView)return e;var t=d.get(e);if(!t){for(t=e.implementation.createHTMLDocument("");t.lastChild;)t.removeChild(t.lastChild);d.set(e,t)}return t}function n(e){for(var n,r=t(e.ownerDocument),o=c(r.createDocumentFragment());n=e.firstChild;)o.appendChild(n);return o}function r(e){if(o.call(this,e),!p){var t=n(e);u.set(this,l(t))}}var o=e.wrappers.HTMLElement,i=e.mixin,a=e.registerWrapper,s=e.unsafeUnwrap,c=e.unwrap,l=e.wrap,u=new WeakMap,d=new WeakMap,p=window.HTMLTemplateElement;r.prototype=Object.create(o.prototype),i(r.prototype,{constructor:r,get content(){return p?l(s(this).content):u.get(this)}}),p&&a(p,r),e.wrappers.HTMLTemplateElement=r}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.registerWrapper,o=window.HTMLMediaElement;o&&(t.prototype=Object.create(n.prototype),r(o,t,document.createElement("audio")),e.wrappers.HTMLMediaElement=t)}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){r.call(this,e)}function n(e){if(!(this instanceof n))throw new TypeError("DOM object constructor cannot be called as a function.");var t=i(document.createElement("audio"));r.call(this,t),a(t,this),t.setAttribute("preload","auto"),void 0!==e&&t.setAttribute("src",e)}var r=e.wrappers.HTMLMediaElement,o=e.registerWrapper,i=e.unwrap,a=e.rewrap,s=window.HTMLAudioElement;s&&(t.prototype=Object.create(r.prototype),o(s,t,document.createElement("audio")),n.prototype=t.prototype,e.wrappers.HTMLAudioElement=t,e.wrappers.Audio=n)}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){return e.replace(/\s+/g," ").trim()}function n(e){o.call(this,e)}function r(e,t,n,i){if(!(this instanceof r))throw new TypeError("DOM object constructor cannot be called as a function.");var a=c(document.createElement("option"));o.call(this,a),s(a,this),void 0!==e&&(a.text=e),void 0!==t&&a.setAttribute("value",t),n===!0&&a.setAttribute("selected",""),a.selected=i===!0}var o=e.wrappers.HTMLElement,i=e.mixin,a=e.registerWrapper,s=e.rewrap,c=e.unwrap,l=e.wrap,u=window.HTMLOptionElement;n.prototype=Object.create(o.prototype),i(n.prototype,{get text(){return t(this.textContent)},set text(e){this.textContent=t(String(e))},get form(){return l(c(this).form)}}),a(u,n,document.createElement("option")),r.prototype=n.prototype,e.wrappers.HTMLOptionElement=n,e.wrappers.Option=r}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=e.unwrap,a=e.wrap,s=window.HTMLSelectElement;t.prototype=Object.create(n.prototype),r(t.prototype,{add:function(e,t){"object"==typeof t&&(t=i(t)),i(this).add(i(e),t)},remove:function(e){return void 0===e?void n.prototype.remove.call(this):("object"==typeof e&&(e=i(e)),void i(this).remove(e))},get form(){return a(i(this).form)}}),o(s,t,document.createElement("select")),e.wrappers.HTMLSelectElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=e.unwrap,a=e.wrap,s=e.wrapHTMLCollection,c=window.HTMLTableElement;t.prototype=Object.create(n.prototype),r(t.prototype,{get caption(){return a(i(this).caption)},createCaption:function(){return a(i(this).createCaption())},get tHead(){return a(i(this).tHead)},createTHead:function(){return a(i(this).createTHead())},createTFoot:function(){return a(i(this).createTFoot())},get tFoot(){return a(i(this).tFoot)},get tBodies(){return s(i(this).tBodies)},createTBody:function(){return a(i(this).createTBody())},get rows(){return s(i(this).rows)},insertRow:function(e){return a(i(this).insertRow(e))}}),o(c,t,document.createElement("table")),e.wrappers.HTMLTableElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=e.wrapHTMLCollection,a=e.unwrap,s=e.wrap,c=window.HTMLTableSectionElement;t.prototype=Object.create(n.prototype),r(t.prototype,{constructor:t,get rows(){return i(a(this).rows)},insertRow:function(e){return s(a(this).insertRow(e))}}),o(c,t,document.createElement("thead")),e.wrappers.HTMLTableSectionElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=e.wrapHTMLCollection,a=e.unwrap,s=e.wrap,c=window.HTMLTableRowElement;t.prototype=Object.create(n.prototype),r(t.prototype,{get cells(){return i(a(this).cells)},insertCell:function(e){return s(a(this).insertCell(e))}}),o(c,t,document.createElement("tr")),e.wrappers.HTMLTableRowElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){switch(e.localName){case"content":return new n(e);case"shadow":return new o(e);case"template":return new i(e)}r.call(this,e)}var n=e.wrappers.HTMLContentElement,r=e.wrappers.HTMLElement,o=e.wrappers.HTMLShadowElement,i=e.wrappers.HTMLTemplateElement,a=(e.mixin,e.registerWrapper),s=window.HTMLUnknownElement;t.prototype=Object.create(r.prototype),a(s,t),e.wrappers.HTMLUnknownElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.Element,r=e.wrappers.HTMLElement,o=e.registerWrapper,i=(e.defineWrapGetter,e.unsafeUnwrap),a=e.wrap,s=e.mixin,c="http://www.w3.org/2000/svg",l=window.SVGElement,u=document.createElementNS(c,"title");if(!("classList"in u)){var d=Object.getOwnPropertyDescriptor(n.prototype,"classList");Object.defineProperty(r.prototype,"classList",d),delete n.prototype.classList}t.prototype=Object.create(n.prototype),s(t.prototype,{get ownerSVGElement(){return a(i(this).ownerSVGElement)}}),o(l,t,document.createElementNS(c,"title")),e.wrappers.SVGElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){p.call(this,e)}var n=e.mixin,r=e.registerWrapper,o=e.unwrap,i=e.wrap,a=window.SVGUseElement,s="http://www.w3.org/2000/svg",c=i(document.createElementNS(s,"g")),l=document.createElementNS(s,"use"),u=c.constructor,d=Object.getPrototypeOf(u.prototype),p=d.constructor;t.prototype=Object.create(d),"instanceRoot"in l&&n(t.prototype,{get instanceRoot(){return i(o(this).instanceRoot)},get animatedInstanceRoot(){return i(o(this).animatedInstanceRoot)}}),r(a,t,l),e.wrappers.SVGUseElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.EventTarget,r=e.mixin,o=e.registerWrapper,i=e.unsafeUnwrap,a=e.wrap,s=window.SVGElementInstance;s&&(t.prototype=Object.create(n.prototype),r(t.prototype,{get correspondingElement(){return a(i(this).correspondingElement)},get correspondingUseElement(){return a(i(this).correspondingUseElement)},get parentNode(){return a(i(this).parentNode)},get childNodes(){throw new Error("Not implemented")},get firstChild(){return a(i(this).firstChild)},get lastChild(){return a(i(this).lastChild)},get previousSibling(){return a(i(this).previousSibling)},get nextSibling(){return a(i(this).nextSibling)}}),o(s,t),e.wrappers.SVGElementInstance=t)}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){o(e,this)}var n=e.mixin,r=e.registerWrapper,o=e.setWrapper,i=e.unsafeUnwrap,a=e.unwrap,s=e.unwrapIfNeeded,c=e.wrap,l=window.CanvasRenderingContext2D;n(t.prototype,{get canvas(){return c(i(this).canvas)},drawImage:function(){arguments[0]=s(arguments[0]),i(this).drawImage.apply(i(this),arguments)},createPattern:function(){return arguments[0]=a(arguments[0]),i(this).createPattern.apply(i(this),arguments)}}),r(l,t,document.createElement("canvas").getContext("2d")),e.wrappers.CanvasRenderingContext2D=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){i(e,this)}var n=e.addForwardingProperties,r=e.mixin,o=e.registerWrapper,i=e.setWrapper,a=e.unsafeUnwrap,s=e.unwrapIfNeeded,c=e.wrap,l=window.WebGLRenderingContext;if(l){r(t.prototype,{get canvas(){return c(a(this).canvas)},texImage2D:function(){arguments[5]=s(arguments[5]),a(this).texImage2D.apply(a(this),arguments)},texSubImage2D:function(){arguments[6]=s(arguments[6]),a(this).texSubImage2D.apply(a(this),arguments)}});var u=Object.getPrototypeOf(l.prototype);u!==Object.prototype&&n(u,t.prototype);var d=/WebKit/.test(navigator.userAgent)?{drawingBufferHeight:null,drawingBufferWidth:null}:{};o(l,t,d),e.wrappers.WebGLRenderingContext=t}}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.Node,r=e.GetElementsByInterface,o=e.NonElementParentNodeInterface,i=e.ParentNodeInterface,a=e.SelectorsInterface,s=e.mixin,c=e.registerObject,l=e.registerWrapper,u=window.DocumentFragment;t.prototype=Object.create(n.prototype),s(t.prototype,i),s(t.prototype,a),s(t.prototype,r),s(t.prototype,o),l(u,t,document.createDocumentFragment()),e.wrappers.DocumentFragment=t;var d=c(document.createComment(""));e.wrappers.Comment=d}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){var t=d(u(e).ownerDocument.createDocumentFragment());n.call(this,t),c(t,this);var o=e.shadowRoot;f.set(this,o),this.treeScope_=new r(this,a(o||e)),h.set(this,e)}var n=e.wrappers.DocumentFragment,r=e.TreeScope,o=e.elementFromPoint,i=e.getInnerHTML,a=e.getTreeScope,s=e.mixin,c=e.rewrap,l=e.setInnerHTML,u=e.unsafeUnwrap,d=e.unwrap,p=e.wrap,h=new WeakMap,f=new WeakMap;t.prototype=Object.create(n.prototype),s(t.prototype,{constructor:t,get innerHTML(){return i(this)},set innerHTML(e){l(this,e),this.invalidateShadowRenderer()},get olderShadowRoot(){return f.get(this)||null},get host(){return h.get(this)||null},invalidateShadowRenderer:function(){return h.get(this).invalidateShadowRenderer()},elementFromPoint:function(e,t){return o(this,this.ownerDocument,e,t)},getSelection:function(){return document.getSelection()},get activeElement(){var e=d(this).ownerDocument.activeElement;if(!e||!e.nodeType)return null;var t=p(e);if(t===this.host)return null;for(;!this.contains(t)&&!this.host.contains(t);){for(;t.parentNode;)t=t.parentNode;if(!t.host)return null;t=t.host}return t}}),e.wrappers.ShadowRoot=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){var t=d(e).root;return t instanceof h?t.host:null}function n(t,n){if(t.shadowRoot){n=Math.min(t.childNodes.length-1,n);var r=t.childNodes[n];if(r){var o=e.getDestinationInsertionPoints(r);if(o.length>0){var i=o[0].parentNode;i.nodeType==Node.ELEMENT_NODE&&(t=i)}}}return t}function r(e){return e=u(e),t(e)||e}function o(e){a(e,this)}var i=e.registerWrapper,a=e.setWrapper,s=e.unsafeUnwrap,c=e.unwrap,l=e.unwrapIfNeeded,u=e.wrap,d=e.getTreeScope,p=window.Range,h=e.wrappers.ShadowRoot;o.prototype={get startContainer(){return r(s(this).startContainer)},get endContainer(){return r(s(this).endContainer)},get commonAncestorContainer(){return r(s(this).commonAncestorContainer)},setStart:function(e,t){e=n(e,t),s(this).setStart(l(e),t)},setEnd:function(e,t){e=n(e,t),s(this).setEnd(l(e),t)},setStartBefore:function(e){s(this).setStartBefore(l(e))},setStartAfter:function(e){s(this).setStartAfter(l(e))},setEndBefore:function(e){s(this).setEndBefore(l(e))},setEndAfter:function(e){s(this).setEndAfter(l(e))},selectNode:function(e){s(this).selectNode(l(e))},selectNodeContents:function(e){s(this).selectNodeContents(l(e))},compareBoundaryPoints:function(e,t){return s(this).compareBoundaryPoints(e,c(t))},extractContents:function(){return u(s(this).extractContents())},cloneContents:function(){return u(s(this).cloneContents())},insertNode:function(e){s(this).insertNode(l(e))},surroundContents:function(e){s(this).surroundContents(l(e))},cloneRange:function(){return u(s(this).cloneRange())},isPointInRange:function(e,t){return s(this).isPointInRange(l(e),t)},comparePoint:function(e,t){return s(this).comparePoint(l(e),t)},intersectsNode:function(e){return s(this).intersectsNode(l(e))},toString:function(){return s(this).toString()}},p.prototype.createContextualFragment&&(o.prototype.createContextualFragment=function(e){return u(s(this).createContextualFragment(e))}),i(window.Range,o,document.createRange()),e.wrappers.Range=o}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){e.previousSibling_=e.previousSibling,e.nextSibling_=e.nextSibling,e.parentNode_=e.parentNode}function n(n,o,i){var a=x(n),s=x(o),c=i?x(i):null;if(r(o),t(o),i)n.firstChild===i&&(n.firstChild_=i),i.previousSibling_=i.previousSibling;else{n.lastChild_=n.lastChild,n.lastChild===n.firstChild&&(n.firstChild_=n.firstChild);var l=R(a.lastChild);l&&(l.nextSibling_=l.nextSibling)}e.originalInsertBefore.call(a,s,c)}function r(n){var r=x(n),o=r.parentNode;if(o){var i=R(o);t(n),n.previousSibling&&(n.previousSibling.nextSibling_=n),n.nextSibling&&(n.nextSibling.previousSibling_=n),i.lastChild===n&&(i.lastChild_=n),i.firstChild===n&&(i.firstChild_=n),e.originalRemoveChild.call(o,r)}}function o(e){P.set(e,[])}function i(e){var t=P.get(e);return t||P.set(e,t=[]),t}function a(e){for(var t=[],n=0,r=e.firstChild;r;r=r.nextSibling)t[n++]=r;return t}function s(){for(var e=0;e<F.length;e++){var t=F[e],n=t.parentRenderer;n&&n.dirty||t.render()}F=[]}function c(){T=null,s()}function l(e){var t=A.get(e);return t||(t=new h(e),A.set(e,t)),t}function u(e){var t=j(e).root;return t instanceof C?t:null}function d(e){return l(e.host)}function p(e){this.skip=!1,this.node=e,this.childNodes=[]}function h(e){this.host=e,this.dirty=!1,this.invalidateAttributes(),this.associateNode(e)}function f(e){for(var t=[],n=e.firstChild;n;n=n.nextSibling)E(n)?t.push.apply(t,i(n)):t.push(n);return t}function m(e){if(e instanceof L)return e;if(e instanceof O)return null;for(var t=e.firstChild;t;t=t.nextSibling){var n=m(t);if(n)return n}return null}function w(e,t){i(t).push(e);var n=k.get(e);n?n.push(t):k.set(e,[t])}function v(e){return k.get(e)}function g(e){k.set(e,void 0)}function b(e,t){var n=t.getAttribute("select");if(!n)return!0;if(n=n.trim(),!n)return!0;if(!(e instanceof M))return!1;if(!q.test(n))return!1;try{return e.matches(n)}catch(r){return!1}}function y(e,t){var n=v(t);return n&&n[n.length-1]===e}function E(e){return e instanceof O||e instanceof L}function _(e){return e.shadowRoot}function S(e){for(var t=[],n=e.shadowRoot;n;n=n.olderShadowRoot)t.push(n);return t}var T,M=e.wrappers.Element,O=e.wrappers.HTMLContentElement,L=e.wrappers.HTMLShadowElement,N=e.wrappers.Node,C=e.wrappers.ShadowRoot,j=(e.assert,e.getTreeScope),D=(e.mixin,e.oneOf),H=e.unsafeUnwrap,x=e.unwrap,R=e.wrap,I=e.ArraySplice,P=new WeakMap,k=new WeakMap,A=new WeakMap,W=D(window,["requestAnimationFrame","mozRequestAnimationFrame","webkitRequestAnimationFrame","setTimeout"]),F=[],U=new I;U.equals=function(e,t){return x(e.node)===t},p.prototype={append:function(e){var t=new p(e);return this.childNodes.push(t),t},sync:function(e){if(!this.skip){for(var t=this.node,o=this.childNodes,i=a(x(t)),s=e||new WeakMap,c=U.calculateSplices(o,i),l=0,u=0,d=0,p=0;p<c.length;p++){for(var h=c[p];d<h.index;d++)u++,o[l++].sync(s);for(var f=h.removed.length,m=0;f>m;m++){var w=R(i[u++]);s.get(w)||r(w)}for(var v=h.addedCount,g=i[u]&&R(i[u]),m=0;v>m;m++){var b=o[l++],y=b.node;n(t,y,g),s.set(y,!0),b.sync(s)}d+=v}for(var p=d;p<o.length;p++)o[p].sync(s)}}},h.prototype={render:function(e){if(this.dirty){this.invalidateAttributes();var t=this.host;this.distribution(t);var n=e||new p(t);this.buildRenderTree(n,t);var r=!e;r&&n.sync(),this.dirty=!1}},get parentRenderer(){return j(this.host).renderer},invalidate:function(){if(!this.dirty){this.dirty=!0;var e=this.parentRenderer;if(e&&e.invalidate(),F.push(this),T)return;T=window[W](c,0)}},distribution:function(e){this.resetAllSubtrees(e),this.distributionResolution(e)},resetAll:function(e){E(e)?o(e):g(e),this.resetAllSubtrees(e)},resetAllSubtrees:function(e){for(var t=e.firstChild;t;t=t.nextSibling)this.resetAll(t);e.shadowRoot&&this.resetAll(e.shadowRoot),e.olderShadowRoot&&this.resetAll(e.olderShadowRoot)},distributionResolution:function(e){if(_(e)){for(var t=e,n=f(t),r=S(t),o=0;o<r.length;o++)this.poolDistribution(r[o],n);for(var o=r.length-1;o>=0;o--){var i=r[o],a=m(i);if(a){var s=i.olderShadowRoot;s&&(n=f(s));for(var c=0;c<n.length;c++)w(n[c],a)}this.distributionResolution(i)}}for(var l=e.firstChild;l;l=l.nextSibling)this.distributionResolution(l)},poolDistribution:function(e,t){if(!(e instanceof L))if(e instanceof O){var n=e;this.updateDependentAttributes(n.getAttribute("select"));for(var r=!1,o=0;o<t.length;o++){var e=t[o];e&&b(e,n)&&(w(e,n),t[o]=void 0,r=!0)}if(!r)for(var i=n.firstChild;i;i=i.nextSibling)w(i,n)}else for(var i=e.firstChild;i;i=i.nextSibling)this.poolDistribution(i,t)},buildRenderTree:function(e,t){for(var n=this.compose(t),r=0;r<n.length;r++){var o=n[r],i=e.append(o);this.buildRenderTree(i,o)}if(_(t)){var a=l(t);a.dirty=!1}},compose:function(e){for(var t=[],n=e.shadowRoot||e,r=n.firstChild;r;r=r.nextSibling)if(E(r)){this.associateNode(n);for(var o=i(r),a=0;a<o.length;a++){var s=o[a];y(r,s)&&t.push(s)}}else t.push(r);return t},invalidateAttributes:function(){this.attributes=Object.create(null)},updateDependentAttributes:function(e){if(e){var t=this.attributes;/\.\w+/.test(e)&&(t["class"]=!0),/#\w+/.test(e)&&(t.id=!0),e.replace(/\[\s*([^\s=\|~\]]+)/g,function(e,n){t[n]=!0})}},dependsOnAttribute:function(e){return this.attributes[e]},associateNode:function(e){H(e).polymerShadowRenderer_=this}};var q=/^(:not\()?[*.#[a-zA-Z_|]/;N.prototype.invalidateShadowRenderer=function(e){var t=H(this).polymerShadowRenderer_;return t?(t.invalidate(),!0):!1},O.prototype.getDistributedNodes=L.prototype.getDistributedNodes=function(){return s(),i(this)},M.prototype.getDestinationInsertionPoints=function(){return s(),v(this)||[]},O.prototype.nodeIsInserted_=L.prototype.nodeIsInserted_=function(){this.invalidateShadowRenderer();var e,t=u(this);t&&(e=d(t)),H(this).polymerShadowRenderer_=e,e&&e.invalidate()},e.getRendererForHost=l,e.getShadowTrees=S,e.renderAllPending=s,e.getDestinationInsertionPoints=v,e.visual={insertBefore:n,remove:r}}(window.ShadowDOMPolyfill),function(e){"use strict";function t(t){if(window[t]){r(!e.wrappers[t]);var c=function(e){n.call(this,e)};c.prototype=Object.create(n.prototype),o(c.prototype,{get form(){return s(a(this).form)}}),i(window[t],c,document.createElement(t.slice(4,-7))),e.wrappers[t]=c}}var n=e.wrappers.HTMLElement,r=e.assert,o=e.mixin,i=e.registerWrapper,a=e.unwrap,s=e.wrap,c=["HTMLButtonElement","HTMLFieldSetElement","HTMLInputElement","HTMLKeygenElement","HTMLLabelElement","HTMLLegendElement","HTMLObjectElement","HTMLOutputElement","HTMLTextAreaElement"];c.forEach(t)}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){r(e,this)}var n=e.registerWrapper,r=e.setWrapper,o=e.unsafeUnwrap,i=e.unwrap,a=e.unwrapIfNeeded,s=e.wrap,c=window.Selection;t.prototype={get anchorNode(){return s(o(this).anchorNode)},get focusNode(){return s(o(this).focusNode)},addRange:function(e){o(this).addRange(a(e))},collapse:function(e,t){o(this).collapse(a(e),t)},containsNode:function(e,t){return o(this).containsNode(a(e),t)},getRangeAt:function(e){return s(o(this).getRangeAt(e))},removeRange:function(e){o(this).removeRange(i(e))},selectAllChildren:function(e){o(this).selectAllChildren(e instanceof ShadowRoot?o(e.host):a(e))},toString:function(){return o(this).toString()}},c.prototype.extend&&(t.prototype.extend=function(e,t){o(this).extend(a(e),t)}),n(window.Selection,t,window.getSelection()),e.wrappers.Selection=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){r(e,this)}var n=e.registerWrapper,r=e.setWrapper,o=e.unsafeUnwrap,i=e.unwrapIfNeeded,a=e.wrap,s=window.TreeWalker;t.prototype={get root(){return a(o(this).root)},get currentNode(){return a(o(this).currentNode)},set currentNode(e){o(this).currentNode=i(e)},get filter(){return o(this).filter},parentNode:function(){return a(o(this).parentNode())},firstChild:function(){return a(o(this).firstChild())},lastChild:function(){return a(o(this).lastChild())},previousSibling:function(){return a(o(this).previousSibling())},previousNode:function(){return a(o(this).previousNode())},nextNode:function(){return a(o(this).nextNode())}},n(s,t),e.wrappers.TreeWalker=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){u.call(this,e),this.treeScope_=new w(this,null)}function n(e){var n=document[e];t.prototype[e]=function(){return j(n.apply(N(this),arguments))}}function r(e,t){x.call(N(t),C(e)),o(e,t)}function o(e,t){e.shadowRoot&&t.adoptNode(e.shadowRoot),e instanceof m&&i(e,t);for(var n=e.firstChild;n;n=n.nextSibling)o(n,t)}function i(e,t){var n=e.olderShadowRoot;n&&t.adoptNode(n)}function a(e){L(e,this)}function s(e,t){
  6024. var n=document.implementation[t];e.prototype[t]=function(){return j(n.apply(N(this),arguments))}}function c(e,t){var n=document.implementation[t];e.prototype[t]=function(){return n.apply(N(this),arguments)}}var l=e.GetElementsByInterface,u=e.wrappers.Node,d=e.ParentNodeInterface,p=e.NonElementParentNodeInterface,h=e.wrappers.Selection,f=e.SelectorsInterface,m=e.wrappers.ShadowRoot,w=e.TreeScope,v=e.cloneNode,g=e.defineGetter,b=e.defineWrapGetter,y=e.elementFromPoint,E=e.forwardMethodsToWrapper,_=e.matchesNames,S=e.mixin,T=e.registerWrapper,M=e.renderAllPending,O=e.rewrap,L=e.setWrapper,N=e.unsafeUnwrap,C=e.unwrap,j=e.wrap,D=e.wrapEventTargetMethods,H=(e.wrapNodeList,new WeakMap);t.prototype=Object.create(u.prototype),b(t,"documentElement"),b(t,"body"),b(t,"head"),g(t,"activeElement",function(){var e=C(this).activeElement;if(!e||!e.nodeType)return null;for(var t=j(e);!this.contains(t);){for(;t.parentNode;)t=t.parentNode;if(!t.host)return null;t=t.host}return t}),["createComment","createDocumentFragment","createElement","createElementNS","createEvent","createEventNS","createRange","createTextNode"].forEach(n);var x=document.adoptNode,R=document.getSelection;S(t.prototype,{adoptNode:function(e){return e.parentNode&&e.parentNode.removeChild(e),r(e,this),e},elementFromPoint:function(e,t){return y(this,this,e,t)},importNode:function(e,t){return v(e,t,N(this))},getSelection:function(){return M(),new h(R.call(C(this)))},getElementsByName:function(e){return f.querySelectorAll.call(this,"[name="+JSON.stringify(String(e))+"]")}});var I=document.createTreeWalker,P=e.wrappers.TreeWalker;if(t.prototype.createTreeWalker=function(e,t,n,r){var o=null;return n&&(n.acceptNode&&"function"==typeof n.acceptNode?o={acceptNode:function(e){return n.acceptNode(j(e))}}:"function"==typeof n&&(o=function(e){return n(j(e))})),new P(I.call(C(this),C(e),t,o,r))},document.registerElement){var k=document.registerElement;t.prototype.registerElement=function(t,n){function r(e){return e?void L(e,this):i?document.createElement(i,t):document.createElement(t)}var o,i;if(void 0!==n&&(o=n.prototype,i=n["extends"]),o||(o=Object.create(HTMLElement.prototype)),e.nativePrototypeTable.get(o))throw new Error("NotSupportedError");for(var a,s=Object.getPrototypeOf(o),c=[];s&&!(a=e.nativePrototypeTable.get(s));)c.push(s),s=Object.getPrototypeOf(s);if(!a)throw new Error("NotSupportedError");for(var l=Object.create(a),u=c.length-1;u>=0;u--)l=Object.create(l);["createdCallback","attachedCallback","detachedCallback","attributeChangedCallback"].forEach(function(e){var t=o[e];t&&(l[e]=function(){j(this)instanceof r||O(this),t.apply(j(this),arguments)})});var d={prototype:l};i&&(d["extends"]=i),r.prototype=o,r.prototype.constructor=r,e.constructorTable.set(l,r),e.nativePrototypeTable.set(o,l);k.call(C(this),t,d);return r},E([window.HTMLDocument||window.Document],["registerElement"])}E([window.HTMLBodyElement,window.HTMLDocument||window.Document,window.HTMLHeadElement,window.HTMLHtmlElement],["appendChild","compareDocumentPosition","contains","getElementsByClassName","getElementsByTagName","getElementsByTagNameNS","insertBefore","querySelector","querySelectorAll","removeChild","replaceChild"]),E([window.HTMLBodyElement,window.HTMLHeadElement,window.HTMLHtmlElement],_),E([window.HTMLDocument||window.Document],["adoptNode","importNode","contains","createComment","createDocumentFragment","createElement","createElementNS","createEvent","createEventNS","createRange","createTextNode","createTreeWalker","elementFromPoint","getElementById","getElementsByName","getSelection"]),S(t.prototype,l),S(t.prototype,d),S(t.prototype,f),S(t.prototype,p),S(t.prototype,{get implementation(){var e=H.get(this);return e?e:(e=new a(C(this).implementation),H.set(this,e),e)},get defaultView(){return j(C(this).defaultView)}}),T(window.Document,t,document.implementation.createHTMLDocument("")),window.HTMLDocument&&T(window.HTMLDocument,t),D([window.HTMLBodyElement,window.HTMLDocument||window.Document,window.HTMLHeadElement]);var A=document.implementation.createDocument;a.prototype.createDocument=function(){return arguments[2]=C(arguments[2]),j(A.apply(N(this),arguments))},s(a,"createDocumentType"),s(a,"createHTMLDocument"),c(a,"hasFeature"),T(window.DOMImplementation,a),E([window.DOMImplementation],["createDocument","createDocumentType","createHTMLDocument","hasFeature"]),e.adoptNodeNoRemove=r,e.wrappers.DOMImplementation=a,e.wrappers.Document=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.EventTarget,r=e.wrappers.Selection,o=e.mixin,i=e.registerWrapper,a=e.renderAllPending,s=e.unwrap,c=e.unwrapIfNeeded,l=e.wrap,u=window.Window,d=window.getComputedStyle,p=window.getDefaultComputedStyle,h=window.getSelection;t.prototype=Object.create(n.prototype),u.prototype.getComputedStyle=function(e,t){return l(this||window).getComputedStyle(c(e),t)},p&&(u.prototype.getDefaultComputedStyle=function(e,t){return l(this||window).getDefaultComputedStyle(c(e),t)}),u.prototype.getSelection=function(){return l(this||window).getSelection()},delete window.getComputedStyle,delete window.getDefaultComputedStyle,delete window.getSelection,["addEventListener","removeEventListener","dispatchEvent"].forEach(function(e){u.prototype[e]=function(){var t=l(this||window);return t[e].apply(t,arguments)},delete window[e]}),o(t.prototype,{getComputedStyle:function(e,t){return a(),d.call(s(this),c(e),t)},getSelection:function(){return a(),new r(h.call(s(this)))},get document(){return l(s(this).document)}}),p&&(t.prototype.getDefaultComputedStyle=function(e,t){return a(),p.call(s(this),c(e),t)}),i(u,t,window),e.wrappers.Window=t}(window.ShadowDOMPolyfill),function(e){"use strict";var t=e.unwrap,n=window.DataTransfer||window.Clipboard,r=n.prototype.setDragImage;r&&(n.prototype.setDragImage=function(e,n,o){r.call(this,t(e),n,o)})}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){var t;t=e instanceof i?e:new i(e&&o(e)),r(t,this)}var n=e.registerWrapper,r=e.setWrapper,o=e.unwrap,i=window.FormData;i&&(n(i,t,new i),e.wrappers.FormData=t)}(window.ShadowDOMPolyfill),function(e){"use strict";var t=e.unwrapIfNeeded,n=XMLHttpRequest.prototype.send;XMLHttpRequest.prototype.send=function(e){return n.call(this,t(e))}}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){var t=n[e],r=window[t];if(r){var o=document.createElement(e),i=o.constructor;window[t]=i}}var n=(e.isWrapperFor,{a:"HTMLAnchorElement",area:"HTMLAreaElement",audio:"HTMLAudioElement",base:"HTMLBaseElement",body:"HTMLBodyElement",br:"HTMLBRElement",button:"HTMLButtonElement",canvas:"HTMLCanvasElement",caption:"HTMLTableCaptionElement",col:"HTMLTableColElement",content:"HTMLContentElement",data:"HTMLDataElement",datalist:"HTMLDataListElement",del:"HTMLModElement",dir:"HTMLDirectoryElement",div:"HTMLDivElement",dl:"HTMLDListElement",embed:"HTMLEmbedElement",fieldset:"HTMLFieldSetElement",font:"HTMLFontElement",form:"HTMLFormElement",frame:"HTMLFrameElement",frameset:"HTMLFrameSetElement",h1:"HTMLHeadingElement",head:"HTMLHeadElement",hr:"HTMLHRElement",html:"HTMLHtmlElement",iframe:"HTMLIFrameElement",img:"HTMLImageElement",input:"HTMLInputElement",keygen:"HTMLKeygenElement",label:"HTMLLabelElement",legend:"HTMLLegendElement",li:"HTMLLIElement",link:"HTMLLinkElement",map:"HTMLMapElement",marquee:"HTMLMarqueeElement",menu:"HTMLMenuElement",menuitem:"HTMLMenuItemElement",meta:"HTMLMetaElement",meter:"HTMLMeterElement",object:"HTMLObjectElement",ol:"HTMLOListElement",optgroup:"HTMLOptGroupElement",option:"HTMLOptionElement",output:"HTMLOutputElement",p:"HTMLParagraphElement",param:"HTMLParamElement",pre:"HTMLPreElement",progress:"HTMLProgressElement",q:"HTMLQuoteElement",script:"HTMLScriptElement",select:"HTMLSelectElement",shadow:"HTMLShadowElement",source:"HTMLSourceElement",span:"HTMLSpanElement",style:"HTMLStyleElement",table:"HTMLTableElement",tbody:"HTMLTableSectionElement",template:"HTMLTemplateElement",textarea:"HTMLTextAreaElement",thead:"HTMLTableSectionElement",time:"HTMLTimeElement",title:"HTMLTitleElement",tr:"HTMLTableRowElement",track:"HTMLTrackElement",ul:"HTMLUListElement",video:"HTMLVideoElement"});Object.keys(n).forEach(t),Object.getOwnPropertyNames(e.wrappers).forEach(function(t){window[t]=e.wrappers[t]})}(window.ShadowDOMPolyfill),function(e){function t(e,t){var n="";return Array.prototype.forEach.call(e,function(e){n+=e.textContent+"\n\n"}),t||(n=n.replace(d,"")),n}function n(e){var t=document.createElement("style");return t.textContent=e,t}function r(e){var t=n(e);document.head.appendChild(t);var r=[];if(t.sheet)try{r=t.sheet.cssRules}catch(o){}else console.warn("sheet not found",t);return t.parentNode.removeChild(t),r}function o(){C.initialized=!0,document.body.appendChild(C);var e=C.contentDocument,t=e.createElement("base");t.href=document.baseURI,e.head.appendChild(t)}function i(e){C.initialized||o(),document.body.appendChild(C),e(C.contentDocument),document.body.removeChild(C)}function a(e,t){if(t){var o;if(e.match("@import")&&D){var a=n(e);i(function(e){e.head.appendChild(a.impl),o=Array.prototype.slice.call(a.sheet.cssRules,0),t(o)})}else o=r(e),t(o)}}function s(e){e&&l().appendChild(document.createTextNode(e))}function c(e,t){var r=n(e);r.setAttribute(t,""),r.setAttribute(x,""),document.head.appendChild(r)}function l(){return j||(j=document.createElement("style"),j.setAttribute(x,""),j[x]=!0),j}var u={strictStyling:!1,registry:{},shimStyling:function(e,n,r){var o=this.prepareRoot(e,n,r),i=this.isTypeExtension(r),a=this.makeScopeSelector(n,i),s=t(o,!0);s=this.scopeCssText(s,a),e&&(e.shimmedStyle=s),this.addCssToDocument(s,n)},shimStyle:function(e,t){return this.shimCssText(e.textContent,t)},shimCssText:function(e,t){return e=this.insertDirectives(e),this.scopeCssText(e,t)},makeScopeSelector:function(e,t){return e?t?"[is="+e+"]":e:""},isTypeExtension:function(e){return e&&e.indexOf("-")<0},prepareRoot:function(e,t,n){var r=this.registerRoot(e,t,n);return this.replaceTextInStyles(r.rootStyles,this.insertDirectives),this.removeStyles(e,r.rootStyles),this.strictStyling&&this.applyScopeToContent(e,t),r.scopeStyles},removeStyles:function(e,t){for(var n,r=0,o=t.length;o>r&&(n=t[r]);r++)n.parentNode.removeChild(n)},registerRoot:function(e,t,n){var r=this.registry[t]={root:e,name:t,extendsName:n},o=this.findStyles(e);r.rootStyles=o,r.scopeStyles=r.rootStyles;var i=this.registry[r.extendsName];return i&&(r.scopeStyles=i.scopeStyles.concat(r.scopeStyles)),r},findStyles:function(e){if(!e)return[];var t=e.querySelectorAll("style");return Array.prototype.filter.call(t,function(e){return!e.hasAttribute(R)})},applyScopeToContent:function(e,t){e&&(Array.prototype.forEach.call(e.querySelectorAll("*"),function(e){e.setAttribute(t,"")}),Array.prototype.forEach.call(e.querySelectorAll("template"),function(e){this.applyScopeToContent(e.content,t)},this))},insertDirectives:function(e){return e=this.insertPolyfillDirectivesInCssText(e),this.insertPolyfillRulesInCssText(e)},insertPolyfillDirectivesInCssText:function(e){return e=e.replace(p,function(e,t){return t.slice(0,-2)+"{"}),e.replace(h,function(e,t){return t+" {"})},insertPolyfillRulesInCssText:function(e){return e=e.replace(f,function(e,t){return t.slice(0,-1)}),e.replace(m,function(e,t,n,r){var o=e.replace(t,"").replace(n,"");return r+o})},scopeCssText:function(e,t){var n=this.extractUnscopedRulesFromCssText(e);if(e=this.insertPolyfillHostInCssText(e),e=this.convertColonHost(e),e=this.convertColonHostContext(e),e=this.convertShadowDOMSelectors(e),t){var e,r=this;a(e,function(n){e=r.scopeRules(n,t)})}return e=e+"\n"+n,e.trim()},extractUnscopedRulesFromCssText:function(e){for(var t,n="";t=w.exec(e);)n+=t[1].slice(0,-1)+"\n\n";for(;t=v.exec(e);)n+=t[0].replace(t[2],"").replace(t[1],t[3])+"\n\n";return n},convertColonHost:function(e){return this.convertColonRule(e,E,this.colonHostPartReplacer)},convertColonHostContext:function(e){return this.convertColonRule(e,_,this.colonHostContextPartReplacer)},convertColonRule:function(e,t,n){return e.replace(t,function(e,t,r,o){if(t=O,r){for(var i,a=r.split(","),s=[],c=0,l=a.length;l>c&&(i=a[c]);c++)i=i.trim(),s.push(n(t,i,o));return s.join(",")}return t+o})},colonHostContextPartReplacer:function(e,t,n){return t.match(g)?this.colonHostPartReplacer(e,t,n):e+t+n+", "+t+" "+e+n},colonHostPartReplacer:function(e,t,n){return e+t.replace(g,"")+n},convertShadowDOMSelectors:function(e){for(var t=0;t<N.length;t++)e=e.replace(N[t]," ");return e},scopeRules:function(e,t){var n="";return e&&Array.prototype.forEach.call(e,function(e){if(e.selectorText&&e.style&&void 0!==e.style.cssText)n+=this.scopeSelector(e.selectorText,t,this.strictStyling)+" {\n ",n+=this.propertiesFromRule(e)+"\n}\n\n";else if(e.type===CSSRule.MEDIA_RULE)n+="@media "+e.media.mediaText+" {\n",n+=this.scopeRules(e.cssRules,t),n+="\n}\n\n";else try{e.cssText&&(n+=e.cssText+"\n\n")}catch(r){e.type===CSSRule.KEYFRAMES_RULE&&e.cssRules&&(n+=this.ieSafeCssTextFromKeyFrameRule(e))}},this),n},ieSafeCssTextFromKeyFrameRule:function(e){var t="@keyframes "+e.name+" {";return Array.prototype.forEach.call(e.cssRules,function(e){t+=" "+e.keyText+" {"+e.style.cssText+"}"}),t+=" }"},scopeSelector:function(e,t,n){var r=[],o=e.split(",");return o.forEach(function(e){e=e.trim(),this.selectorNeedsScoping(e,t)&&(e=n&&!e.match(O)?this.applyStrictSelectorScope(e,t):this.applySelectorScope(e,t)),r.push(e)},this),r.join(", ")},selectorNeedsScoping:function(e,t){if(Array.isArray(t))return!0;var n=this.makeScopeMatcher(t);return!e.match(n)},makeScopeMatcher:function(e){return e=e.replace(/\[/g,"\\[").replace(/\]/g,"\\]"),new RegExp("^("+e+")"+S,"m")},applySelectorScope:function(e,t){return Array.isArray(t)?this.applySelectorScopeList(e,t):this.applySimpleSelectorScope(e,t)},applySelectorScopeList:function(e,t){for(var n,r=[],o=0;n=t[o];o++)r.push(this.applySimpleSelectorScope(e,n));return r.join(", ")},applySimpleSelectorScope:function(e,t){return e.match(L)?(e=e.replace(O,t),e.replace(L,t+" ")):t+" "+e},applyStrictSelectorScope:function(e,t){t=t.replace(/\[is=([^\]]*)\]/g,"$1");var n=[" ",">","+","~"],r=e,o="["+t+"]";return n.forEach(function(e){var t=r.split(e);r=t.map(function(e){var t=e.trim().replace(L,"");return t&&n.indexOf(t)<0&&t.indexOf(o)<0&&(e=t.replace(/([^:]*)(:*)(.*)/,"$1"+o+"$2$3")),e}).join(e)}),r},insertPolyfillHostInCssText:function(e){return e.replace(M,b).replace(T,g)},propertiesFromRule:function(e){var t=e.style.cssText;e.style.content&&!e.style.content.match(/['"]+|attr/)&&(t=t.replace(/content:[^;]*;/g,"content: '"+e.style.content+"';"));var n=e.style;for(var r in n)"initial"===n[r]&&(t+=r+": initial; ");return t},replaceTextInStyles:function(e,t){e&&t&&(e instanceof Array||(e=[e]),Array.prototype.forEach.call(e,function(e){e.textContent=t.call(this,e.textContent)},this))},addCssToDocument:function(e,t){e.match("@import")?c(e,t):s(e)}},d=/\/\*[^*]*\*+([^\/*][^*]*\*+)*\//gim,p=/\/\*\s*@polyfill ([^*]*\*+([^\/*][^*]*\*+)*\/)([^{]*?){/gim,h=/polyfill-next-selector[^}]*content\:[\s]*?['"](.*?)['"][;\s]*}([^{]*?){/gim,f=/\/\*\s@polyfill-rule([^*]*\*+([^\/*][^*]*\*+)*)\//gim,m=/(polyfill-rule)[^}]*(content\:[\s]*['"](.*?)['"])[;\s]*[^}]*}/gim,w=/\/\*\s@polyfill-unscoped-rule([^*]*\*+([^\/*][^*]*\*+)*)\//gim,v=/(polyfill-unscoped-rule)[^}]*(content\:[\s]*['"](.*?)['"])[;\s]*[^}]*}/gim,g="-shadowcsshost",b="-shadowcsscontext",y=")(?:\\(((?:\\([^)(]*\\)|[^)(]*)+?)\\))?([^,{]*)",E=new RegExp("("+g+y,"gim"),_=new RegExp("("+b+y,"gim"),S="([>\\s~+[.,{:][\\s\\S]*)?$",T=/\:host/gim,M=/\:host-context/gim,O=g+"-no-combinator",L=new RegExp(g,"gim"),N=(new RegExp(b,"gim"),[/>>>/g,/::shadow/g,/::content/g,/\/deep\//g,/\/shadow\//g,/\/shadow-deep\//g,/\^\^/g,/\^/g]),C=document.createElement("iframe");C.style.display="none";var j,D=navigator.userAgent.match("Chrome"),H="shim-shadowdom",x="shim-shadowdom-css",R="no-shim";if(window.ShadowDOMPolyfill){s("style { display: none !important; }\n");var I=ShadowDOMPolyfill.wrap(document),P=I.querySelector("head");P.insertBefore(l(),P.childNodes[0]),document.addEventListener("DOMContentLoaded",function(){e.urlResolver;if(window.HTMLImports&&!HTMLImports.useNative){var t="link[rel=stylesheet]["+H+"]",n="style["+H+"]";HTMLImports.importer.documentPreloadSelectors+=","+t,HTMLImports.importer.importsPreloadSelectors+=","+t,HTMLImports.parser.documentSelectors=[HTMLImports.parser.documentSelectors,t,n].join(",");var r=HTMLImports.parser.parseGeneric;HTMLImports.parser.parseGeneric=function(e){if(!e[x]){var t=e.__importElement||e;if(!t.hasAttribute(H))return void r.call(this,e);e.__resource&&(t=e.ownerDocument.createElement("style"),t.textContent=e.__resource),HTMLImports.path.resolveUrlsInStyle(t,e.href),t.textContent=u.shimStyle(t),t.removeAttribute(H,""),t.setAttribute(x,""),t[x]=!0,t.parentNode!==P&&(e.parentNode===P?P.replaceChild(t,e):this.addElementToDocument(t)),t.__importParsed=!0,this.markParsingComplete(e),this.parseNext()}};var o=HTMLImports.parser.hasResource;HTMLImports.parser.hasResource=function(e){return"link"===e.localName&&"stylesheet"===e.rel&&e.hasAttribute(H)?e.__resource:o.call(this,e)}}})}e.ShadowCSS=u}(window.WebComponents)),function(e){window.ShadowDOMPolyfill?(window.wrap=ShadowDOMPolyfill.wrapIfNeeded,window.unwrap=ShadowDOMPolyfill.unwrapIfNeeded):window.wrap=window.unwrap=function(e){return e}}(window.WebComponents),function(e){"use strict";function t(e){return void 0!==p[e]}function n(){s.call(this),this._isInvalid=!0}function r(e){return""==e&&n.call(this),e.toLowerCase()}function o(e){var t=e.charCodeAt(0);return t>32&&127>t&&-1==[34,35,60,62,63,96].indexOf(t)?e:encodeURIComponent(e)}function i(e){var t=e.charCodeAt(0);return t>32&&127>t&&-1==[34,35,60,62,96].indexOf(t)?e:encodeURIComponent(e)}function a(e,a,s){function c(e){b.push(e)}var l=a||"scheme start",u=0,d="",v=!1,g=!1,b=[];e:for(;(e[u-1]!=f||0==u)&&!this._isInvalid;){var y=e[u];switch(l){case"scheme start":if(!y||!m.test(y)){if(a){c("Invalid scheme.");break e}d="",l="no scheme";continue}d+=y.toLowerCase(),l="scheme";break;case"scheme":if(y&&w.test(y))d+=y.toLowerCase();else{if(":"!=y){if(a){if(f==y)break e;c("Code point not allowed in scheme: "+y);break e}d="",u=0,l="no scheme";continue}if(this._scheme=d,d="",a)break e;t(this._scheme)&&(this._isRelative=!0),l="file"==this._scheme?"relative":this._isRelative&&s&&s._scheme==this._scheme?"relative or authority":this._isRelative?"authority first slash":"scheme data"}break;case"scheme data":"?"==y?(this._query="?",l="query"):"#"==y?(this._fragment="#",l="fragment"):f!=y&&" "!=y&&"\n"!=y&&"\r"!=y&&(this._schemeData+=o(y));break;case"no scheme":if(s&&t(s._scheme)){l="relative";continue}c("Missing scheme."),n.call(this);break;case"relative or authority":if("/"!=y||"/"!=e[u+1]){c("Expected /, got: "+y),l="relative";continue}l="authority ignore slashes";break;case"relative":if(this._isRelative=!0,"file"!=this._scheme&&(this._scheme=s._scheme),f==y){this._host=s._host,this._port=s._port,this._path=s._path.slice(),this._query=s._query,this._username=s._username,this._password=s._password;break e}if("/"==y||"\\"==y)"\\"==y&&c("\\ is an invalid code point."),l="relative slash";else if("?"==y)this._host=s._host,this._port=s._port,this._path=s._path.slice(),this._query="?",this._username=s._username,this._password=s._password,l="query";else{if("#"!=y){var E=e[u+1],_=e[u+2];("file"!=this._scheme||!m.test(y)||":"!=E&&"|"!=E||f!=_&&"/"!=_&&"\\"!=_&&"?"!=_&&"#"!=_)&&(this._host=s._host,this._port=s._port,this._username=s._username,this._password=s._password,this._path=s._path.slice(),this._path.pop()),l="relative path";continue}this._host=s._host,this._port=s._port,this._path=s._path.slice(),this._query=s._query,this._fragment="#",this._username=s._username,this._password=s._password,l="fragment"}break;case"relative slash":if("/"!=y&&"\\"!=y){"file"!=this._scheme&&(this._host=s._host,this._port=s._port,this._username=s._username,this._password=s._password),l="relative path";continue}"\\"==y&&c("\\ is an invalid code point."),l="file"==this._scheme?"file host":"authority ignore slashes";break;case"authority first slash":if("/"!=y){c("Expected '/', got: "+y),l="authority ignore slashes";continue}l="authority second slash";break;case"authority second slash":if(l="authority ignore slashes","/"!=y){c("Expected '/', got: "+y);continue}break;case"authority ignore slashes":if("/"!=y&&"\\"!=y){l="authority";continue}c("Expected authority, got: "+y);break;case"authority":if("@"==y){v&&(c("@ already seen."),d+="%40"),v=!0;for(var S=0;S<d.length;S++){var T=d[S];if(" "!=T&&"\n"!=T&&"\r"!=T)if(":"!=T||null!==this._password){var M=o(T);null!==this._password?this._password+=M:this._username+=M}else this._password="";else c("Invalid whitespace in authority.")}d=""}else{if(f==y||"/"==y||"\\"==y||"?"==y||"#"==y){u-=d.length,d="",l="host";continue}d+=y}break;case"file host":if(f==y||"/"==y||"\\"==y||"?"==y||"#"==y){2!=d.length||!m.test(d[0])||":"!=d[1]&&"|"!=d[1]?0==d.length?l="relative path start":(this._host=r.call(this,d),d="",l="relative path start"):l="relative path";continue}" "==y||"\n"==y||"\r"==y?c("Invalid whitespace in file host."):d+=y;break;case"host":case"hostname":if(":"!=y||g){if(f==y||"/"==y||"\\"==y||"?"==y||"#"==y){if(this._host=r.call(this,d),d="",l="relative path start",a)break e;continue}" "!=y&&"\n"!=y&&"\r"!=y?("["==y?g=!0:"]"==y&&(g=!1),d+=y):c("Invalid code point in host/hostname: "+y)}else if(this._host=r.call(this,d),d="",l="port","hostname"==a)break e;break;case"port":if(/[0-9]/.test(y))d+=y;else{if(f==y||"/"==y||"\\"==y||"?"==y||"#"==y||a){if(""!=d){var O=parseInt(d,10);O!=p[this._scheme]&&(this._port=O+""),d=""}if(a)break e;l="relative path start";continue}" "==y||"\n"==y||"\r"==y?c("Invalid code point in port: "+y):n.call(this)}break;case"relative path start":if("\\"==y&&c("'\\' not allowed in path."),l="relative path","/"!=y&&"\\"!=y)continue;break;case"relative path":if(f!=y&&"/"!=y&&"\\"!=y&&(a||"?"!=y&&"#"!=y))" "!=y&&"\n"!=y&&"\r"!=y&&(d+=o(y));else{"\\"==y&&c("\\ not allowed in relative path.");var L;(L=h[d.toLowerCase()])&&(d=L),".."==d?(this._path.pop(),"/"!=y&&"\\"!=y&&this._path.push("")):"."==d&&"/"!=y&&"\\"!=y?this._path.push(""):"."!=d&&("file"==this._scheme&&0==this._path.length&&2==d.length&&m.test(d[0])&&"|"==d[1]&&(d=d[0]+":"),this._path.push(d)),d="","?"==y?(this._query="?",l="query"):"#"==y&&(this._fragment="#",l="fragment")}break;case"query":a||"#"!=y?f!=y&&" "!=y&&"\n"!=y&&"\r"!=y&&(this._query+=i(y)):(this._fragment="#",l="fragment");break;case"fragment":f!=y&&" "!=y&&"\n"!=y&&"\r"!=y&&(this._fragment+=y)}u++}}function s(){this._scheme="",this._schemeData="",this._username="",this._password=null,this._host="",this._port="",this._path=[],this._query="",this._fragment="",this._isInvalid=!1,this._isRelative=!1}function c(e,t){void 0===t||t instanceof c||(t=new c(String(t))),this._url=e,s.call(this);var n=e.replace(/^[ \t\r\n\f]+|[ \t\r\n\f]+$/g,"");a.call(this,n,null,t)}var l=!1;if(!e.forceJURL)try{var u=new URL("b","http://a");u.pathname="c%20d",l="http://a/c%20d"===u.href}catch(d){}if(!l){var p=Object.create(null);p.ftp=21,p.file=0,p.gopher=70,p.http=80,p.https=443,p.ws=80,p.wss=443;var h=Object.create(null);h["%2e"]=".",h[".%2e"]="..",h["%2e."]="..",h["%2e%2e"]="..";var f=void 0,m=/[a-zA-Z]/,w=/[a-zA-Z0-9\+\-\.]/;c.prototype={toString:function(){return this.href},get href(){if(this._isInvalid)return this._url;var e="";return(""!=this._username||null!=this._password)&&(e=this._username+(null!=this._password?":"+this._password:"")+"@"),this.protocol+(this._isRelative?"//"+e+this.host:"")+this.pathname+this._query+this._fragment},set href(e){s.call(this),a.call(this,e)},get protocol(){return this._scheme+":"},set protocol(e){this._isInvalid||a.call(this,e+":","scheme start")},get host(){return this._isInvalid?"":this._port?this._host+":"+this._port:this._host},set host(e){!this._isInvalid&&this._isRelative&&a.call(this,e,"host")},get hostname(){return this._host},set hostname(e){!this._isInvalid&&this._isRelative&&a.call(this,e,"hostname")},get port(){return this._port},set port(e){!this._isInvalid&&this._isRelative&&a.call(this,e,"port")},get pathname(){return this._isInvalid?"":this._isRelative?"/"+this._path.join("/"):this._schemeData},set pathname(e){!this._isInvalid&&this._isRelative&&(this._path=[],a.call(this,e,"relative path start"))},get search(){return this._isInvalid||!this._query||"?"==this._query?"":this._query},set search(e){!this._isInvalid&&this._isRelative&&(this._query="?","?"==e[0]&&(e=e.slice(1)),a.call(this,e,"query"))},get hash(){return this._isInvalid||!this._fragment||"#"==this._fragment?"":this._fragment},set hash(e){this._isInvalid||(this._fragment="#","#"==e[0]&&(e=e.slice(1)),a.call(this,e,"fragment"))},get origin(){var e;if(this._isInvalid||!this._scheme)return"";switch(this._scheme){case"data":case"file":case"javascript":case"mailto":return"null"}return e=this.host,e?this._scheme+"://"+e:""}};var v=e.URL;v&&(c.createObjectURL=function(e){return v.createObjectURL.apply(v,arguments)},c.revokeObjectURL=function(e){v.revokeObjectURL(e)}),e.URL=c}}(self),function(e){function t(e){y.push(e),b||(b=!0,m(r))}function n(e){return window.ShadowDOMPolyfill&&window.ShadowDOMPolyfill.wrapIfNeeded(e)||e}function r(){b=!1;var e=y;y=[],e.sort(function(e,t){return e.uid_-t.uid_});var t=!1;e.forEach(function(e){var n=e.takeRecords();o(e),n.length&&(e.callback_(n,e),t=!0)}),t&&r()}function o(e){e.nodes_.forEach(function(t){var n=w.get(t);n&&n.forEach(function(t){t.observer===e&&t.removeTransientObservers()})})}function i(e,t){for(var n=e;n;n=n.parentNode){var r=w.get(n);if(r)for(var o=0;o<r.length;o++){var i=r[o],a=i.options;if(n===e||a.subtree){var s=t(a);s&&i.enqueue(s)}}}}function a(e){this.callback_=e,this.nodes_=[],this.records_=[],this.uid_=++E}function s(e,t){this.type=e,this.target=t,this.addedNodes=[],this.removedNodes=[],this.previousSibling=null,this.nextSibling=null,this.attributeName=null,this.attributeNamespace=null,this.oldValue=null}function c(e){var t=new s(e.type,e.target);return t.addedNodes=e.addedNodes.slice(),t.removedNodes=e.removedNodes.slice(),t.previousSibling=e.previousSibling,t.nextSibling=e.nextSibling,t.attributeName=e.attributeName,t.attributeNamespace=e.attributeNamespace,t.oldValue=e.oldValue,t}function l(e,t){return _=new s(e,t)}function u(e){return S?S:(S=c(_),S.oldValue=e,S)}function d(){_=S=void 0}function p(e){return e===S||e===_}function h(e,t){return e===t?e:S&&p(e)?S:null}function f(e,t,n){this.observer=e,this.target=t,this.options=n,this.transientObservedNodes=[]}if(!e.JsMutationObserver){var m,w=new WeakMap;if(/Trident|Edge/.test(navigator.userAgent))m=setTimeout;else if(window.setImmediate)m=window.setImmediate;else{var v=[],g=String(Math.random());window.addEventListener("message",function(e){if(e.data===g){var t=v;v=[],t.forEach(function(e){e()})}}),m=function(e){v.push(e),window.postMessage(g,"*")}}var b=!1,y=[],E=0;a.prototype={observe:function(e,t){if(e=n(e),!t.childList&&!t.attributes&&!t.characterData||t.attributeOldValue&&!t.attributes||t.attributeFilter&&t.attributeFilter.length&&!t.attributes||t.characterDataOldValue&&!t.characterData)throw new SyntaxError;var r=w.get(e);r||w.set(e,r=[]);for(var o,i=0;i<r.length;i++)if(r[i].observer===this){o=r[i],o.removeListeners(),o.options=t;break}o||(o=new f(this,e,t),r.push(o),this.nodes_.push(e)),o.addListeners()},disconnect:function(){this.nodes_.forEach(function(e){for(var t=w.get(e),n=0;n<t.length;n++){var r=t[n];if(r.observer===this){r.removeListeners(),t.splice(n,1);break}}},this),this.records_=[]},takeRecords:function(){var e=this.records_;return this.records_=[],e}};var _,S;f.prototype={enqueue:function(e){var n=this.observer.records_,r=n.length;if(n.length>0){var o=n[r-1],i=h(o,e);if(i)return void(n[r-1]=i)}else t(this.observer);n[r]=e},addListeners:function(){this.addListeners_(this.target)},addListeners_:function(e){var t=this.options;t.attributes&&e.addEventListener("DOMAttrModified",this,!0),t.characterData&&e.addEventListener("DOMCharacterDataModified",this,!0),t.childList&&e.addEventListener("DOMNodeInserted",this,!0),(t.childList||t.subtree)&&e.addEventListener("DOMNodeRemoved",this,!0)},removeListeners:function(){this.removeListeners_(this.target)},removeListeners_:function(e){var t=this.options;t.attributes&&e.removeEventListener("DOMAttrModified",this,!0),t.characterData&&e.removeEventListener("DOMCharacterDataModified",this,!0),t.childList&&e.removeEventListener("DOMNodeInserted",this,!0),(t.childList||t.subtree)&&e.removeEventListener("DOMNodeRemoved",this,!0)},addTransientObserver:function(e){if(e!==this.target){this.addListeners_(e),this.transientObservedNodes.push(e);var t=w.get(e);t||w.set(e,t=[]),t.push(this)}},removeTransientObservers:function(){var e=this.transientObservedNodes;this.transientObservedNodes=[],e.forEach(function(e){this.removeListeners_(e);for(var t=w.get(e),n=0;n<t.length;n++)if(t[n]===this){t.splice(n,1);break}},this)},handleEvent:function(e){switch(e.stopImmediatePropagation(),e.type){case"DOMAttrModified":var t=e.attrName,n=e.relatedNode.namespaceURI,r=e.target,o=new l("attributes",r);o.attributeName=t,o.attributeNamespace=n;var a=e.attrChange===MutationEvent.ADDITION?null:e.prevValue;i(r,function(e){return!e.attributes||e.attributeFilter&&e.attributeFilter.length&&-1===e.attributeFilter.indexOf(t)&&-1===e.attributeFilter.indexOf(n)?void 0:e.attributeOldValue?u(a):o});break;case"DOMCharacterDataModified":var r=e.target,o=l("characterData",r),a=e.prevValue;i(r,function(e){return e.characterData?e.characterDataOldValue?u(a):o:void 0});break;case"DOMNodeRemoved":this.addTransientObserver(e.target);case"DOMNodeInserted":var s,c,p=e.target;"DOMNodeInserted"===e.type?(s=[p],c=[]):(s=[],c=[p]);var h=p.previousSibling,f=p.nextSibling,o=l("childList",e.target.parentNode);o.addedNodes=s,o.removedNodes=c,o.previousSibling=h,o.nextSibling=f,i(e.relatedNode,function(e){return e.childList?o:void 0})}d()}},e.JsMutationObserver=a,e.MutationObserver||(e.MutationObserver=a,a._isPolyfilled=!0)}}(self),function(e){"use strict";if(!window.performance){var t=Date.now();window.performance={now:function(){return Date.now()-t}}}window.requestAnimationFrame||(window.requestAnimationFrame=function(){var e=window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame;return e?function(t){return e(function(){t(performance.now())})}:function(e){return window.setTimeout(e,1e3/60)}}()),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(){return window.webkitCancelAnimationFrame||window.mozCancelAnimationFrame||function(e){clearTimeout(e)}}());var n=function(){var e=document.createEvent("Event");return e.initEvent("foo",!0,!0),e.preventDefault(),e.defaultPrevented}();if(!n){var r=Event.prototype.preventDefault;Event.prototype.preventDefault=function(){this.cancelable&&(r.call(this),Object.defineProperty(this,"defaultPrevented",{get:function(){return!0},configurable:!0}))}}var o=/Trident/.test(navigator.userAgent);if((!window.CustomEvent||o&&"function"!=typeof window.CustomEvent)&&(window.CustomEvent=function(e,t){t=t||{};var n=document.createEvent("CustomEvent");return n.initCustomEvent(e,Boolean(t.bubbles),Boolean(t.cancelable),t.detail),n},window.CustomEvent.prototype=window.Event.prototype),!window.Event||o&&"function"!=typeof window.Event){var i=window.Event;window.Event=function(e,t){t=t||{};var n=document.createEvent("Event");return n.initEvent(e,Boolean(t.bubbles),Boolean(t.cancelable)),n},window.Event.prototype=i.prototype}}(window.WebComponents),window.HTMLImports=window.HTMLImports||{flags:{}},function(e){function t(e,t){t=t||f,r(function(){i(e,t)},t)}function n(e){return"complete"===e.readyState||e.readyState===v}function r(e,t){if(n(t))e&&e();else{var o=function(){("complete"===t.readyState||t.readyState===v)&&(t.removeEventListener(g,o),r(e,t))};t.addEventListener(g,o)}}function o(e){e.target.__loaded=!0}function i(e,t){function n(){c==l&&e&&e({allImports:s,loadedImports:u,errorImports:d})}function r(e){o(e),u.push(this),
  6025. c++,n()}function i(e){d.push(this),c++,n()}var s=t.querySelectorAll("link[rel=import]"),c=0,l=s.length,u=[],d=[];if(l)for(var p,h=0;l>h&&(p=s[h]);h++)a(p)?(u.push(this),c++,n()):(p.addEventListener("load",r),p.addEventListener("error",i));else n()}function a(e){return d?e.__loaded||e["import"]&&"loading"!==e["import"].readyState:e.__importParsed}function s(e){for(var t,n=0,r=e.length;r>n&&(t=e[n]);n++)c(t)&&l(t)}function c(e){return"link"===e.localName&&"import"===e.rel}function l(e){var t=e["import"];t?o({target:e}):(e.addEventListener("load",o),e.addEventListener("error",o))}var u="import",d=Boolean(u in document.createElement("link")),p=Boolean(window.ShadowDOMPolyfill),h=function(e){return p?window.ShadowDOMPolyfill.wrapIfNeeded(e):e},f=h(document),m={get:function(){var e=window.HTMLImports.currentScript||document.currentScript||("complete"!==document.readyState?document.scripts[document.scripts.length-1]:null);return h(e)},configurable:!0};Object.defineProperty(document,"_currentScript",m),Object.defineProperty(f,"_currentScript",m);var w=/Trident/.test(navigator.userAgent),v=w?"complete":"interactive",g="readystatechange";d&&(new MutationObserver(function(e){for(var t,n=0,r=e.length;r>n&&(t=e[n]);n++)t.addedNodes&&s(t.addedNodes)}).observe(document.head,{childList:!0}),function(){if("loading"===document.readyState)for(var e,t=document.querySelectorAll("link[rel=import]"),n=0,r=t.length;r>n&&(e=t[n]);n++)l(e)}()),t(function(e){window.HTMLImports.ready=!0,window.HTMLImports.readyTime=(new Date).getTime();var t=f.createEvent("CustomEvent");t.initCustomEvent("HTMLImportsLoaded",!0,!0,e),f.dispatchEvent(t)}),e.IMPORT_LINK_TYPE=u,e.useNative=d,e.rootDocument=f,e.whenReady=t,e.isIE=w}(window.HTMLImports),function(e){var t=[],n=function(e){t.push(e)},r=function(){t.forEach(function(t){t(e)})};e.addModule=n,e.initializeModules=r}(window.HTMLImports),window.HTMLImports.addModule(function(e){var t=/(url\()([^)]*)(\))/g,n=/(@import[\s]+(?!url\())([^;]*)(;)/g,r={resolveUrlsInStyle:function(e,t){var n=e.ownerDocument,r=n.createElement("a");return e.textContent=this.resolveUrlsInCssText(e.textContent,t,r),e},resolveUrlsInCssText:function(e,r,o){var i=this.replaceUrls(e,o,r,t);return i=this.replaceUrls(i,o,r,n)},replaceUrls:function(e,t,n,r){return e.replace(r,function(e,r,o,i){var a=o.replace(/["']/g,"");return n&&(a=new URL(a,n).href),t.href=a,a=t.href,r+"'"+a+"'"+i})}};e.path=r}),window.HTMLImports.addModule(function(e){var t={async:!0,ok:function(e){return e.status>=200&&e.status<300||304===e.status||0===e.status},load:function(n,r,o){var i=new XMLHttpRequest;return(e.flags.debug||e.flags.bust)&&(n+="?"+Math.random()),i.open("GET",n,t.async),i.addEventListener("readystatechange",function(e){if(4===i.readyState){var n=null;try{var a=i.getResponseHeader("Location");a&&(n="/"===a.substr(0,1)?location.origin+a:a)}catch(e){console.error(e.message)}r.call(o,!t.ok(i)&&i,i.response||i.responseText,n)}}),i.send(),i},loadDocument:function(e,t,n){this.load(e,t,n).responseType="document"}};e.xhr=t}),window.HTMLImports.addModule(function(e){var t=e.xhr,n=e.flags,r=function(e,t){this.cache={},this.onload=e,this.oncomplete=t,this.inflight=0,this.pending={}};r.prototype={addNodes:function(e){this.inflight+=e.length;for(var t,n=0,r=e.length;r>n&&(t=e[n]);n++)this.require(t);this.checkDone()},addNode:function(e){this.inflight++,this.require(e),this.checkDone()},require:function(e){var t=e.src||e.href;e.__nodeUrl=t,this.dedupe(t,e)||this.fetch(t,e)},dedupe:function(e,t){if(this.pending[e])return this.pending[e].push(t),!0;return this.cache[e]?(this.onload(e,t,this.cache[e]),this.tail(),!0):(this.pending[e]=[t],!1)},fetch:function(e,r){if(n.load&&console.log("fetch",e,r),e)if(e.match(/^data:/)){var o=e.split(","),i=o[0],a=o[1];a=i.indexOf(";base64")>-1?atob(a):decodeURIComponent(a),setTimeout(function(){this.receive(e,r,null,a)}.bind(this),0)}else{var s=function(t,n,o){this.receive(e,r,t,n,o)}.bind(this);t.load(e,s)}else setTimeout(function(){this.receive(e,r,{error:"href must be specified"},null)}.bind(this),0)},receive:function(e,t,n,r,o){this.cache[e]=r;for(var i,a=this.pending[e],s=0,c=a.length;c>s&&(i=a[s]);s++)this.onload(e,i,r,n,o),this.tail();this.pending[e]=null},tail:function(){--this.inflight,this.checkDone()},checkDone:function(){this.inflight||this.oncomplete()}},e.Loader=r}),window.HTMLImports.addModule(function(e){var t=function(e){this.addCallback=e,this.mo=new MutationObserver(this.handler.bind(this))};t.prototype={handler:function(e){for(var t,n=0,r=e.length;r>n&&(t=e[n]);n++)"childList"===t.type&&t.addedNodes.length&&this.addedNodes(t.addedNodes)},addedNodes:function(e){this.addCallback&&this.addCallback(e);for(var t,n=0,r=e.length;r>n&&(t=e[n]);n++)t.children&&t.children.length&&this.addedNodes(t.children)},observe:function(e){this.mo.observe(e,{childList:!0,subtree:!0})}},e.Observer=t}),window.HTMLImports.addModule(function(e){function t(e){return"link"===e.localName&&e.rel===u}function n(e){var t=r(e);return"data:text/javascript;charset=utf-8,"+encodeURIComponent(t)}function r(e){return e.textContent+o(e)}function o(e){var t=e.ownerDocument;t.__importedScripts=t.__importedScripts||0;var n=e.ownerDocument.baseURI,r=t.__importedScripts?"-"+t.__importedScripts:"";return t.__importedScripts++,"\n//# sourceURL="+n+r+".js\n"}function i(e){var t=e.ownerDocument.createElement("style");return t.textContent=e.textContent,a.resolveUrlsInStyle(t),t}var a=e.path,s=e.rootDocument,c=e.flags,l=e.isIE,u=e.IMPORT_LINK_TYPE,d="link[rel="+u+"]",p={documentSelectors:d,importsSelectors:[d,"link[rel=stylesheet]:not([type])","style:not([type])","script:not([type])",'script[type="application/javascript"]','script[type="text/javascript"]'].join(","),map:{link:"parseLink",script:"parseScript",style:"parseStyle"},dynamicElements:[],parseNext:function(){var e=this.nextToParse();e&&this.parse(e)},parse:function(e){if(this.isParsed(e))return void(c.parse&&console.log("[%s] is already parsed",e.localName));var t=this[this.map[e.localName]];t&&(this.markParsing(e),t.call(this,e))},parseDynamic:function(e,t){this.dynamicElements.push(e),t||this.parseNext()},markParsing:function(e){c.parse&&console.log("parsing",e),this.parsingElement=e},markParsingComplete:function(e){e.__importParsed=!0,this.markDynamicParsingComplete(e),e.__importElement&&(e.__importElement.__importParsed=!0,this.markDynamicParsingComplete(e.__importElement)),this.parsingElement=null,c.parse&&console.log("completed",e)},markDynamicParsingComplete:function(e){var t=this.dynamicElements.indexOf(e);t>=0&&this.dynamicElements.splice(t,1)},parseImport:function(e){if(e["import"]=e.__doc,window.HTMLImports.__importsParsingHook&&window.HTMLImports.__importsParsingHook(e),e["import"]&&(e["import"].__importParsed=!0),this.markParsingComplete(e),e.__resource&&!e.__error?e.dispatchEvent(new CustomEvent("load",{bubbles:!1})):e.dispatchEvent(new CustomEvent("error",{bubbles:!1})),e.__pending)for(var t;e.__pending.length;)t=e.__pending.shift(),t&&t({target:e});this.parseNext()},parseLink:function(e){t(e)?this.parseImport(e):(e.href=e.href,this.parseGeneric(e))},parseStyle:function(e){var t=e;e=i(e),t.__appliedElement=e,e.__importElement=t,this.parseGeneric(e)},parseGeneric:function(e){this.trackElement(e),this.addElementToDocument(e)},rootImportForElement:function(e){for(var t=e;t.ownerDocument.__importLink;)t=t.ownerDocument.__importLink;return t},addElementToDocument:function(e){var t=this.rootImportForElement(e.__importElement||e);t.parentNode.insertBefore(e,t)},trackElement:function(e,t){var n=this,r=function(o){e.removeEventListener("load",r),e.removeEventListener("error",r),t&&t(o),n.markParsingComplete(e),n.parseNext()};if(e.addEventListener("load",r),e.addEventListener("error",r),l&&"style"===e.localName){var o=!1;if(-1==e.textContent.indexOf("@import"))o=!0;else if(e.sheet){o=!0;for(var i,a=e.sheet.cssRules,s=a?a.length:0,c=0;s>c&&(i=a[c]);c++)i.type===CSSRule.IMPORT_RULE&&(o=o&&Boolean(i.styleSheet))}o&&setTimeout(function(){e.dispatchEvent(new CustomEvent("load",{bubbles:!1}))})}},parseScript:function(t){var r=document.createElement("script");r.__importElement=t,r.src=t.src?t.src:n(t),e.currentScript=t,this.trackElement(r,function(t){r.parentNode&&r.parentNode.removeChild(r),e.currentScript=null}),this.addElementToDocument(r)},nextToParse:function(){return this._mayParse=[],!this.parsingElement&&(this.nextToParseInDoc(s)||this.nextToParseDynamic())},nextToParseInDoc:function(e,n){if(e&&this._mayParse.indexOf(e)<0){this._mayParse.push(e);for(var r,o=e.querySelectorAll(this.parseSelectorsForNode(e)),i=0,a=o.length;a>i&&(r=o[i]);i++)if(!this.isParsed(r))return this.hasResource(r)?t(r)?this.nextToParseInDoc(r.__doc,r):r:void 0}return n},nextToParseDynamic:function(){return this.dynamicElements[0]},parseSelectorsForNode:function(e){var t=e.ownerDocument||e;return t===s?this.documentSelectors:this.importsSelectors},isParsed:function(e){return e.__importParsed},needsDynamicParsing:function(e){return this.dynamicElements.indexOf(e)>=0},hasResource:function(e){return t(e)&&void 0===e.__doc?!1:!0}};e.parser=p,e.IMPORT_SELECTOR=d}),window.HTMLImports.addModule(function(e){function t(e){return n(e,a)}function n(e,t){return"link"===e.localName&&e.getAttribute("rel")===t}function r(e){return!!Object.getOwnPropertyDescriptor(e,"baseURI")}function o(e,t){var n=document.implementation.createHTMLDocument(a);n._URL=t;var o=n.createElement("base");o.setAttribute("href",t),n.baseURI||r(n)||Object.defineProperty(n,"baseURI",{value:t});var i=n.createElement("meta");return i.setAttribute("charset","utf-8"),n.head.appendChild(i),n.head.appendChild(o),n.body.innerHTML=e,window.HTMLTemplateElement&&HTMLTemplateElement.bootstrap&&HTMLTemplateElement.bootstrap(n),n}var i=e.flags,a=e.IMPORT_LINK_TYPE,s=e.IMPORT_SELECTOR,c=e.rootDocument,l=e.Loader,u=e.Observer,d=e.parser,p={documents:{},documentPreloadSelectors:s,importsPreloadSelectors:[s].join(","),loadNode:function(e){h.addNode(e)},loadSubtree:function(e){var t=this.marshalNodes(e);h.addNodes(t)},marshalNodes:function(e){return e.querySelectorAll(this.loadSelectorsForNode(e))},loadSelectorsForNode:function(e){var t=e.ownerDocument||e;return t===c?this.documentPreloadSelectors:this.importsPreloadSelectors},loaded:function(e,n,r,a,s){if(i.load&&console.log("loaded",e,n),n.__resource=r,n.__error=a,t(n)){var c=this.documents[e];void 0===c&&(c=a?null:o(r,s||e),c&&(c.__importLink=n,this.bootDocument(c)),this.documents[e]=c),n.__doc=c}d.parseNext()},bootDocument:function(e){this.loadSubtree(e),this.observer.observe(e),d.parseNext()},loadedAll:function(){d.parseNext()}},h=new l(p.loaded.bind(p),p.loadedAll.bind(p));if(p.observer=new u,!document.baseURI){var f={get:function(){var e=document.querySelector("base");return e?e.href:window.location.href},configurable:!0};Object.defineProperty(document,"baseURI",f),Object.defineProperty(c,"baseURI",f)}e.importer=p,e.importLoader=h}),window.HTMLImports.addModule(function(e){var t=e.parser,n=e.importer,r={added:function(e){for(var r,o,i,a,s=0,c=e.length;c>s&&(a=e[s]);s++)r||(r=a.ownerDocument,o=t.isParsed(r)),i=this.shouldLoadNode(a),i&&n.loadNode(a),this.shouldParseNode(a)&&o&&t.parseDynamic(a,i)},shouldLoadNode:function(e){return 1===e.nodeType&&o.call(e,n.loadSelectorsForNode(e))},shouldParseNode:function(e){return 1===e.nodeType&&o.call(e,t.parseSelectorsForNode(e))}};n.observer.addCallback=r.added.bind(r);var o=HTMLElement.prototype.matches||HTMLElement.prototype.matchesSelector||HTMLElement.prototype.webkitMatchesSelector||HTMLElement.prototype.mozMatchesSelector||HTMLElement.prototype.msMatchesSelector}),function(e){function t(){window.HTMLImports.importer.bootDocument(r)}var n=e.initializeModules;e.isIE;if(!e.useNative){n();var r=e.rootDocument;"complete"===document.readyState||"interactive"===document.readyState&&!window.attachEvent?t():document.addEventListener("DOMContentLoaded",t)}}(window.HTMLImports),window.CustomElements=window.CustomElements||{flags:{}},function(e){var t=e.flags,n=[],r=function(e){n.push(e)},o=function(){n.forEach(function(t){t(e)})};e.addModule=r,e.initializeModules=o,e.hasNative=Boolean(document.registerElement),e.isIE=/Trident/.test(navigator.userAgent),e.useNative=!t.register&&e.hasNative&&!window.ShadowDOMPolyfill&&(!window.HTMLImports||window.HTMLImports.useNative)}(window.CustomElements),window.CustomElements.addModule(function(e){function t(e,t){n(e,function(e){return t(e)?!0:void r(e,t)}),r(e,t)}function n(e,t,r){var o=e.firstElementChild;if(!o)for(o=e.firstChild;o&&o.nodeType!==Node.ELEMENT_NODE;)o=o.nextSibling;for(;o;)t(o,r)!==!0&&n(o,t,r),o=o.nextElementSibling;return null}function r(e,n){for(var r=e.shadowRoot;r;)t(r,n),r=r.olderShadowRoot}function o(e,t){i(e,t,[])}function i(e,t,n){if(e=window.wrap(e),!(n.indexOf(e)>=0)){n.push(e);for(var r,o=e.querySelectorAll("link[rel="+a+"]"),s=0,c=o.length;c>s&&(r=o[s]);s++)r["import"]&&i(r["import"],t,n);t(e)}}var a=window.HTMLImports?window.HTMLImports.IMPORT_LINK_TYPE:"none";e.forDocumentTree=o,e.forSubtree=t}),window.CustomElements.addModule(function(e){function t(e,t){return n(e,t)||r(e,t)}function n(t,n){return e.upgrade(t,n)?!0:void(n&&a(t))}function r(e,t){b(e,function(e){return n(e,t)?!0:void 0})}function o(e){S.push(e),_||(_=!0,setTimeout(i))}function i(){_=!1;for(var e,t=S,n=0,r=t.length;r>n&&(e=t[n]);n++)e();S=[]}function a(e){E?o(function(){s(e)}):s(e)}function s(e){e.__upgraded__&&!e.__attached&&(e.__attached=!0,e.attachedCallback&&e.attachedCallback())}function c(e){l(e),b(e,function(e){l(e)})}function l(e){E?o(function(){u(e)}):u(e)}function u(e){e.__upgraded__&&e.__attached&&(e.__attached=!1,e.detachedCallback&&e.detachedCallback())}function d(e){for(var t=e,n=window.wrap(document);t;){if(t==n)return!0;t=t.parentNode||t.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&t.host}}function p(e){if(e.shadowRoot&&!e.shadowRoot.__watched){g.dom&&console.log("watching shadow-root for: ",e.localName);for(var t=e.shadowRoot;t;)m(t),t=t.olderShadowRoot}}function h(e,n){if(g.dom){var r=n[0];if(r&&"childList"===r.type&&r.addedNodes&&r.addedNodes){for(var o=r.addedNodes[0];o&&o!==document&&!o.host;)o=o.parentNode;var i=o&&(o.URL||o._URL||o.host&&o.host.localName)||"";i=i.split("/?").shift().split("/").pop()}console.group("mutations (%d) [%s]",n.length,i||"")}var a=d(e);n.forEach(function(e){"childList"===e.type&&(T(e.addedNodes,function(e){e.localName&&t(e,a)}),T(e.removedNodes,function(e){e.localName&&c(e)}))}),g.dom&&console.groupEnd()}function f(e){for(e=window.wrap(e),e||(e=window.wrap(document));e.parentNode;)e=e.parentNode;var t=e.__observer;t&&(h(e,t.takeRecords()),i())}function m(e){if(!e.__observer){var t=new MutationObserver(h.bind(this,e));t.observe(e,{childList:!0,subtree:!0}),e.__observer=t}}function w(e){e=window.wrap(e),g.dom&&console.group("upgradeDocument: ",e.baseURI.split("/").pop());var n=e===window.wrap(document);t(e,n),m(e),g.dom&&console.groupEnd()}function v(e){y(e,w)}var g=e.flags,b=e.forSubtree,y=e.forDocumentTree,E=window.MutationObserver._isPolyfilled&&g["throttle-attached"];e.hasPolyfillMutations=E,e.hasThrottledAttached=E;var _=!1,S=[],T=Array.prototype.forEach.call.bind(Array.prototype.forEach),M=Element.prototype.createShadowRoot;M&&(Element.prototype.createShadowRoot=function(){var e=M.call(this);return window.CustomElements.watchShadow(this),e}),e.watchShadow=p,e.upgradeDocumentTree=v,e.upgradeDocument=w,e.upgradeSubtree=r,e.upgradeAll=t,e.attached=a,e.takeRecords=f}),window.CustomElements.addModule(function(e){function t(t,r){if("template"===t.localName&&window.HTMLTemplateElement&&HTMLTemplateElement.decorate&&HTMLTemplateElement.decorate(t),!t.__upgraded__&&t.nodeType===Node.ELEMENT_NODE){var o=t.getAttribute("is"),i=e.getRegisteredDefinition(t.localName)||e.getRegisteredDefinition(o);if(i&&(o&&i.tag==t.localName||!o&&!i["extends"]))return n(t,i,r)}}function n(t,n,o){return a.upgrade&&console.group("upgrade:",t.localName),n.is&&t.setAttribute("is",n.is),r(t,n),t.__upgraded__=!0,i(t),o&&e.attached(t),e.upgradeSubtree(t,o),a.upgrade&&console.groupEnd(),t}function r(e,t){Object.__proto__?e.__proto__=t.prototype:(o(e,t.prototype,t["native"]),e.__proto__=t.prototype)}function o(e,t,n){for(var r={},o=t;o!==n&&o!==HTMLElement.prototype;){for(var i,a=Object.getOwnPropertyNames(o),s=0;i=a[s];s++)r[i]||(Object.defineProperty(e,i,Object.getOwnPropertyDescriptor(o,i)),r[i]=1);o=Object.getPrototypeOf(o)}}function i(e){e.createdCallback&&e.createdCallback()}var a=e.flags;e.upgrade=t,e.upgradeWithDefinition=n,e.implementPrototype=r}),window.CustomElements.addModule(function(e){function t(t,r){var c=r||{};if(!t)throw new Error("document.registerElement: first argument `name` must not be empty");if(t.indexOf("-")<0)throw new Error("document.registerElement: first argument ('name') must contain a dash ('-'). Argument provided was '"+String(t)+"'.");if(o(t))throw new Error("Failed to execute 'registerElement' on 'Document': Registration failed for type '"+String(t)+"'. The type name is invalid.");if(l(t))throw new Error("DuplicateDefinitionError: a type with name '"+String(t)+"' is already registered");return c.prototype||(c.prototype=Object.create(HTMLElement.prototype)),c.__name=t.toLowerCase(),c.lifecycle=c.lifecycle||{},c.ancestry=i(c["extends"]),a(c),s(c),n(c.prototype),u(c.__name,c),c.ctor=d(c),c.ctor.prototype=c.prototype,c.prototype.constructor=c.ctor,e.ready&&v(document),c.ctor}function n(e){if(!e.setAttribute._polyfilled){var t=e.setAttribute;e.setAttribute=function(e,n){r.call(this,e,n,t)};var n=e.removeAttribute;e.removeAttribute=function(e){r.call(this,e,null,n)},e.setAttribute._polyfilled=!0}}function r(e,t,n){e=e.toLowerCase();var r=this.getAttribute(e);n.apply(this,arguments);var o=this.getAttribute(e);this.attributeChangedCallback&&o!==r&&this.attributeChangedCallback(e,r,o)}function o(e){for(var t=0;t<_.length;t++)if(e===_[t])return!0}function i(e){var t=l(e);return t?i(t["extends"]).concat([t]):[]}function a(e){for(var t,n=e["extends"],r=0;t=e.ancestry[r];r++)n=t.is&&t.tag;e.tag=n||e.__name,n&&(e.is=e.__name)}function s(e){if(!Object.__proto__){var t=HTMLElement.prototype;if(e.is){var n=document.createElement(e.tag);t=Object.getPrototypeOf(n)}for(var r,o=e.prototype,i=!1;o;)o==t&&(i=!0),r=Object.getPrototypeOf(o),r&&(o.__proto__=r),o=r;i||console.warn(e.tag+" prototype not found in prototype chain for "+e.is),e["native"]=t}}function c(e){return b(M(e.tag),e)}function l(e){return e?S[e.toLowerCase()]:void 0}function u(e,t){S[e]=t}function d(e){return function(){return c(e)}}function p(e,t,n){return e===T?h(t,n):O(e,t)}function h(e,t){e&&(e=e.toLowerCase()),t&&(t=t.toLowerCase());var n=l(t||e);if(n){if(e==n.tag&&t==n.is)return new n.ctor;if(!t&&!n.is)return new n.ctor}var r;return t?(r=h(e),r.setAttribute("is",t),r):(r=M(e),e.indexOf("-")>=0&&y(r,HTMLElement),r)}function f(e,t){var n=e[t];e[t]=function(){var e=n.apply(this,arguments);return g(e),e}}var m,w=e.isIE,v=e.upgradeDocumentTree,g=e.upgradeAll,b=e.upgradeWithDefinition,y=e.implementPrototype,E=e.useNative,_=["annotation-xml","color-profile","font-face","font-face-src","font-face-uri","font-face-format","font-face-name","missing-glyph"],S={},T="http://www.w3.org/1999/xhtml",M=document.createElement.bind(document),O=document.createElementNS.bind(document);m=Object.__proto__||E?function(e,t){return e instanceof t}:function(e,t){if(e instanceof t)return!0;for(var n=e;n;){if(n===t.prototype)return!0;n=n.__proto__}return!1},f(Node.prototype,"cloneNode"),f(document,"importNode"),w&&!function(){var e=document.importNode;document.importNode=function(){var t=e.apply(document,arguments);if(t.nodeType==t.DOCUMENT_FRAGMENT_NODE){var n=document.createDocumentFragment();return n.appendChild(t),n}return t}}(),document.registerElement=t,document.createElement=h,document.createElementNS=p,e.registry=S,e["instanceof"]=m,e.reservedTagList=_,e.getRegisteredDefinition=l,document.register=document.registerElement}),function(e){function t(){i(window.wrap(document)),window.CustomElements.ready=!0;var e=window.requestAnimationFrame||function(e){setTimeout(e,16)};e(function(){setTimeout(function(){window.CustomElements.readyTime=Date.now(),window.HTMLImports&&(window.CustomElements.elapsed=window.CustomElements.readyTime-window.HTMLImports.readyTime),document.dispatchEvent(new CustomEvent("WebComponentsReady",{bubbles:!0}))})})}var n=e.useNative,r=e.initializeModules;e.isIE;if(n){var o=function(){};e.watchShadow=o,e.upgrade=o,e.upgradeAll=o,e.upgradeDocumentTree=o,e.upgradeSubtree=o,e.takeRecords=o,e["instanceof"]=function(e,t){return e instanceof t}}else r();var i=e.upgradeDocumentTree,a=e.upgradeDocument;if(window.wrap||(window.ShadowDOMPolyfill?(window.wrap=window.ShadowDOMPolyfill.wrapIfNeeded,window.unwrap=window.ShadowDOMPolyfill.unwrapIfNeeded):window.wrap=window.unwrap=function(e){return e}),window.HTMLImports&&(window.HTMLImports.__importsParsingHook=function(e){e["import"]&&a(wrap(e["import"]))}),"complete"===document.readyState||e.flags.eager)t();else if("interactive"!==document.readyState||window.attachEvent||window.HTMLImports&&!window.HTMLImports.ready){var s=window.HTMLImports&&!window.HTMLImports.ready?"HTMLImportsLoaded":"DOMContentLoaded";window.addEventListener(s,t)}else t()}(window.CustomElements),function(e){Function.prototype.bind||(Function.prototype.bind=function(e){var t=this,n=Array.prototype.slice.call(arguments,1);return function(){var r=n.slice();return r.push.apply(r,arguments),t.apply(e,r)}})}(window.WebComponents),function(e){var t=document.createElement("style");t.textContent="body {transition: opacity ease-in 0.2s; } \nbody[unresolved] {opacity: 0; display: block; overflow: hidden; position: relative; } \n";var n=document.querySelector("head");n.insertBefore(t,n.firstChild)}(window.WebComponents),function(e){window.Platform=e}(window.WebComponents);
  6026. },{}],"xhr-proxy":[function(require,module,exports){
  6027. // Copyright (c) Microsoft Corporation. All rights reserved.
  6028. // Based in part on code from Apache Ripple, https://github.com/apache/incubator-ripple
  6029. var utils = require('utils');
  6030. var init = function () {
  6031. var _XMLHttpRequest = XMLHttpRequest;
  6032. window.XMLHttpRequest = function () {
  6033. var xhr = new _XMLHttpRequest(),
  6034. origMethods = {
  6035. setRequestHeader: xhr.setRequestHeader,
  6036. open: xhr.open
  6037. };
  6038. xhr.open = function (method, url) {
  6039. var sameOrigin = utils.isSameOriginRequest(url);
  6040. if (!sameOrigin) {
  6041. url = '/xhr_proxy?rurl=' + escape(url);
  6042. }
  6043. origMethods.open.apply(xhr, Array.prototype.slice.call(arguments));
  6044. };
  6045. return xhr;
  6046. };
  6047. // Ensure that we retain all static properties, such as DONE
  6048. window.XMLHttpRequest.__proto__ = _XMLHttpRequest;
  6049. };
  6050. module.exports = {
  6051. init: init
  6052. };
  6053. },{"utils":"utils"}]},{},[4])
  6054. //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkM6L1Byb2dyYW1EYXRhL01pY3Jvc29mdC9WaXN1YWxTdHVkaW8vTURBLzc3NGFlZDY5L3RhY28tdG9vbHNldC02LjMuMS9ub2RlX21vZHVsZXMvY29yZG92YS1zaW11bGF0ZS9ub2RlX21vZHVsZXMvYnJvd3Nlci1wYWNrL19wcmVsdWRlLmpzIiwiQzovUHJvZ3JhbURhdGEvTWljcm9zb2Z0L1Zpc3VhbFN0dWRpby9NREEvNzc0YWVkNjkvdGFjby10b29sc2V0LTYuMy4xL25vZGVfbW9kdWxlcy9jb3Jkb3ZhLXNpbXVsYXRlL25vZGVfbW9kdWxlcy9xL3EuanMiLCJDOi9Qcm9ncmFtRGF0YS9NaWNyb3NvZnQvVmlzdWFsU3R1ZGlvL01EQS83NzRhZWQ2OS90YWNvLXRvb2xzZXQtNi4zLjEvbm9kZV9tb2R1bGVzL2NvcmRvdmEtc2ltdWxhdGUvbm9kZV9tb2R1bGVzL3VybC91cmwuanMiLCJDOi9Qcm9ncmFtRGF0YS9NaWNyb3NvZnQvVmlzdWFsU3R1ZGlvL01EQS83NzRhZWQ2OS90YWNvLXRvb2xzZXQtNi4zLjEvbm9kZV9tb2R1bGVzL2NvcmRvdmEtc2ltdWxhdGUvbm9kZV9tb2R1bGVzL3VybC91dGlsLmpzIiwiQzovUHJvZ3JhbURhdGEvTWljcm9zb2Z0L1Zpc3VhbFN0dWRpby9NREEvNzc0YWVkNjkvdGFjby10b29sc2V0LTYuMy4xL25vZGVfbW9kdWxlcy9jb3Jkb3ZhLXNpbXVsYXRlL3NyYy9hcHAtaG9zdC9hcHAtaG9zdC5qcyIsIkM6L1Byb2dyYW1EYXRhL01pY3Jvc29mdC9WaXN1YWxTdHVkaW8vTURBLzc3NGFlZDY5L3RhY28tdG9vbHNldC02LjMuMS9ub2RlX21vZHVsZXMvY29yZG92YS1zaW11bGF0ZS9zcmMvYXBwLWhvc3QvbGl2ZS1yZWxvYWQtY2xpZW50LmpzIiwiQzovUHJvZ3JhbURhdGEvTWljcm9zb2Z0L1Zpc3VhbFN0dWRpby9NREEvNzc0YWVkNjkvdGFjby10b29sc2V0LTYuMy4xL25vZGVfbW9kdWxlcy9jb3Jkb3ZhLXNpbXVsYXRlL3NyYy9hcHAtaG9zdC90b3VjaC1ldmVudHMuanMiLCJDOi9Qcm9ncmFtRGF0YS9NaWNyb3NvZnQvVmlzdWFsU3R1ZGlvL01EQS83NzRhZWQ2OS90YWNvLXRvb2xzZXQtNi4zLjEvbm9kZV9tb2R1bGVzL2NvcmRvdmEtc2ltdWxhdGUvc3JjL3BsdWdpbnMvY29yZG92YS1wbHVnaW4tZmlsZS9NeUZpbGUuanMiLCJDOi9Qcm9ncmFtRGF0YS9NaWNyb3NvZnQvVmlzdWFsU3R1ZGlvL01EQS83NzRhZWQ2OS90YWNvLXRvb2xzZXQtNi4zLjEvbm9kZV9tb2R1bGVzL2NvcmRvdmEtc2ltdWxhdGUvc3JjL3BsdWdpbnMvY29yZG92YS1wbHVnaW4tZmlsZS9hcHAtaG9zdC1ub24td2Via2l0LWhhbmRsZXJzLmpzIiwiQzovUHJvZ3JhbURhdGEvTWljcm9zb2Z0L1Zpc3VhbFN0dWRpby9NREEvNzc0YWVkNjkvdGFjby10b29sc2V0LTYuMy4xL25vZGVfbW9kdWxlcy9jb3Jkb3ZhLXNpbXVsYXRlL3NyYy9wbHVnaW5zL2NvcmRvdmEtcGx1Z2luLWZpbGUvYXBwLWhvc3Qtd2Via2l0LWhhbmRsZXJzLmpzIiwiQzovUHJvZ3JhbURhdGEvTWljcm9zb2Z0L1Zpc3VhbFN0dWRpby9NREEvNzc0YWVkNjkvdGFjby10b29sc2V0LTYuMy4xL25vZGVfbW9kdWxlcy9jb3Jkb3ZhLXNpbXVsYXRlL3NyYy9wbHVnaW5zL2NvcmRvdmEtcGx1Z2luLWZpbGUvaW5kZXhlZERCLmpzIiwiQzovUHJvZ3JhbURhdGEvTWljcm9zb2Z0L1Zpc3VhbFN0dWRpby9NREEvNzc0YWVkNjkvdGFjby10b29sc2V0LTYuMy4xL25vZGVfbW9kdWxlcy9jb3Jkb3ZhLXNpbXVsYXRlL3NyYy9wbHVnaW5zL2NvcmRvdmEtcGx1Z2luLWdlb2xvY2F0aW9uL0Nvb3JkaW5hdGVzLmpzIiwiQzovUHJvZ3JhbURhdGEvTWljcm9zb2Z0L1Zpc3VhbFN0dWRpby9NREEvNzc0YWVkNjkvdGFjby10b29sc2V0LTYuMy4xL25vZGVfbW9kdWxlcy9jb3Jkb3ZhLXNpbXVsYXRlL3NyYy9wbHVnaW5zL2NvcmRvdmEtcGx1Z2luLWdlb2xvY2F0aW9uL1Bvc2l0aW9uLmpzIiwiQzovUHJvZ3JhbURhdGEvTWljcm9zb2Z0L1Zpc3VhbFN0dWRpby9NREEvNzc0YWVkNjkvdGFjby10b29sc2V0LTYuMy4xL25vZGVfbW9kdWxlcy9jb3Jkb3ZhLXNpbXVsYXRlL3NyYy9wbHVnaW5zL2NvcmRvdmEtcGx1Z2luLWdlb2xvY2F0aW9uL1Bvc2l0aW9uRXJyb3IuanMiLCJDOi9Qcm9ncmFtRGF0YS9NaWNyb3NvZnQvVmlzdWFsU3R1ZGlvL01EQS83NzRhZWQ2OS90YWNvLXRvb2xzZXQtNi4zLjEvbm9kZV9tb2R1bGVzL3Byb2Nlc3MvYnJvd3Nlci5qcyIsIkM6L1Byb2dyYW1EYXRhL01pY3Jvc29mdC9WaXN1YWxTdHVkaW8vTURBLzc3NGFlZDY5L3RhY28tdG9vbHNldC02LjMuMS9ub2RlX21vZHVsZXMvcHVueWNvZGUvcHVueWNvZGUuanMiLCJDOi9Qcm9ncmFtRGF0YS9NaWNyb3NvZnQvVmlzdWFsU3R1ZGlvL01EQS83NzRhZWQ2OS90YWNvLXRvb2xzZXQtNi4zLjEvbm9kZV9tb2R1bGVzL3F1ZXJ5c3RyaW5nLWVzMy9kZWNvZGUuanMiLCJDOi9Qcm9ncmFtRGF0YS9NaWNyb3NvZnQvVmlzdWFsU3R1ZGlvL01EQS83NzRhZWQ2OS90YWNvLXRvb2xzZXQtNi4zLjEvbm9kZV9tb2R1bGVzL3F1ZXJ5c3RyaW5nLWVzMy9lbmNvZGUuanMiLCJDOi9Qcm9ncmFtRGF0YS9NaWNyb3NvZnQvVmlzdWFsU3R1ZGlvL01EQS83NzRhZWQ2OS90YWNvLXRvb2xzZXQtNi4zLjEvbm9kZV9tb2R1bGVzL3F1ZXJ5c3RyaW5nLWVzMy9pbmRleC5qcyIsIkM6L1Byb2dyYW1EYXRhL01pY3Jvc29mdC9WaXN1YWxTdHVkaW8vTURBLzc3NGFlZDY5L3RhY28tdG9vbHNldC02LjMuMS9ub2RlX21vZHVsZXMvY29yZG92YS1zaW11bGF0ZS9zcmMvcGxhdGZvcm1zL2FuZHJvaWQvYXBwLWhvc3QtaGFuZGxlcnMuanMiLCJDOi9Qcm9ncmFtRGF0YS9NaWNyb3NvZnQvVmlzdWFsU3R1ZGlvL01EQS83NzRhZWQ2OS90YWNvLXRvb2xzZXQtNi4zLjEvbm9kZV9tb2R1bGVzL2NvcmRvdmEtc2ltdWxhdGUvc3JjL21vZHVsZXMvYXJnc2NoZWNrLmpzIiwiQzovUHJvZ3JhbURhdGEvTWljcm9zb2Z0L1Zpc3VhbFN0dWRpby9NREEvNzc0YWVkNjkvdGFjby10b29sc2V0LTYuMy4xL25vZGVfbW9kdWxlcy9jb3Jkb3ZhLXNpbXVsYXRlL3NyYy9wbHVnaW5zL2NvcmRvdmEtcGx1Z2luLWNhbWVyYS9hcHAtaG9zdC1oYW5kbGVycy5qcyIsIkM6L1Byb2dyYW1EYXRhL01pY3Jvc29mdC9WaXN1YWxTdHVkaW8vTURBLzc3NGFlZDY5L3RhY28tdG9vbHNldC02LjMuMS9ub2RlX21vZHVsZXMvY29yZG92YS1zaW11bGF0ZS9zcmMvcGx1Z2lucy9jb3Jkb3ZhLXBsdWdpbi1kZXZpY2UvYXBwLWhvc3QuanMiLCJDOi9Qcm9ncmFtRGF0YS9NaWNyb3NvZnQvVmlzdWFsU3R1ZGlvL01EQS83NzRhZWQ2OS90YWNvLXRvb2xzZXQtNi4zLjEvbm9kZV9tb2R1bGVzL2NvcmRvdmEtc2ltdWxhdGUvc3JjL3BsdWdpbnMvY29yZG92YS1wbHVnaW4tZmlsZS9hcHAtaG9zdC1oYW5kbGVycy5qcyIsIkM6L1Byb2dyYW1EYXRhL01pY3Jvc29mdC9WaXN1YWxTdHVkaW8vTURBLzc3NGFlZDY5L3RhY28tdG9vbHNldC02LjMuMS9ub2RlX21vZHVsZXMvY29yZG92YS1zaW11bGF0ZS9zcmMvcGx1Z2lucy9jb3Jkb3ZhLXBsdWdpbi1nZW9sb2NhdGlvbi9hcHAtaG9zdC1jbG9iYmVycy5qcyIsIkM6L1Byb2dyYW1EYXRhL01pY3Jvc29mdC9WaXN1YWxTdHVkaW8vTURBLzc3NGFlZDY5L3RhY28tdG9vbHNldC02LjMuMS9ub2RlX21vZHVsZXMvY29yZG92YS1zaW11bGF0ZS9zcmMvbW9kdWxlcy9kYi5qcyIsIkM6L1Byb2dyYW1EYXRhL01pY3Jvc29mdC9WaXN1YWxTdHVkaW8vTURBLzc3NGFlZDY5L3RhY28tdG9vbHNldC02LjMuMS9ub2RlX21vZHVsZXMvY29yZG92YS1zaW11bGF0ZS9zcmMvcGx1Z2lucy9ldmVudHMvYXBwLWhvc3QuanMiLCJDOi9Qcm9ncmFtRGF0YS9NaWNyb3NvZnQvVmlzdWFsU3R1ZGlvL01EQS83NzRhZWQ2OS90YWNvLXRvb2xzZXQtNi4zLjEvbm9kZV9tb2R1bGVzL2NvcmRvdmEtc2ltdWxhdGUvc3JjL21vZHVsZXMvZXZlbnQuanMiLCJDOi9Qcm9ncmFtRGF0YS9NaWNyb3NvZnQvVmlzdWFsU3R1ZGlvL01EQS83NzRhZWQ2OS90YWNvLXRvb2xzZXQtNi4zLjEvbm9kZV9tb2R1bGVzL2NvcmRvdmEtc2ltdWxhdGUvc3JjL21vZHVsZXMvZXhjZXB0aW9uLmpzIiwiQzovUHJvZ3JhbURhdGEvTWljcm9zb2Z0L1Zpc3VhbFN0dWRpby9NREEvNzc0YWVkNjkvdGFjby10b29sc2V0LTYuMy4xL25vZGVfbW9kdWxlcy9jb3Jkb3ZhLXNpbXVsYXRlL3NyYy90aGlyZC1wYXJ0eS9qcXVlcnkubWluLmpzIiwiQzovUHJvZ3JhbURhdGEvTWljcm9zb2Z0L1Zpc3VhbFN0dWRpby9NREEvNzc0YWVkNjkvdGFjby10b29sc2V0LTYuMy4xL25vZGVfbW9kdWxlcy9jb3Jkb3ZhLXNpbXVsYXRlL3NyYy9tb2R1bGVzL21lc3NhZ2VzLmpzIiwiQzovUHJvZ3JhbURhdGEvTWljcm9zb2Z0L1Zpc3VhbFN0dWRpby9NREEvNzc0YWVkNjkvdGFjby10b29sc2V0LTYuMy4xL25vZGVfbW9kdWxlcy9jb3Jkb3ZhLXNpbXVsYXRlL3NyYy9tb2R1bGVzL3BvbHlmaWxscy5qcyIsIkM6L1Byb2dyYW1EYXRhL01pY3Jvc29mdC9WaXN1YWxTdHVkaW8vTURBLzc3NGFlZDY5L3RhY28tdG9vbHNldC02LjMuMS9ub2RlX21vZHVsZXMvY29yZG92YS1zaW11bGF0ZS9zcmMvbW9kdWxlcy9zaW0tY29uc3RhbnRzLmpzIiwiQzovUHJvZ3JhbURhdGEvTWljcm9zb2Z0L1Zpc3VhbFN0dWRpby9NREEvNzc0YWVkNjkvdGFjby10b29sc2V0LTYuMy4xL25vZGVfbW9kdWxlcy9jb3Jkb3ZhLXNpbXVsYXRlL3NyYy90aGlyZC1wYXJ0eS9zb2NrZXQuaW8uanMiLCJDOi9Qcm9ncmFtRGF0YS9NaWNyb3NvZnQvVmlzdWFsU3R1ZGlvL01EQS83NzRhZWQ2OS90YWNvLXRvb2xzZXQtNi4zLjEvbm9kZV9tb2R1bGVzL2NvcmRvdmEtc2ltdWxhdGUvc3JjL21vZHVsZXMvdGVsZW1ldHJ5LWhlbHBlci5qcyIsIkM6L1Byb2dyYW1EYXRhL01pY3Jvc29mdC9WaXN1YWxTdHVkaW8vTURBLzc3NGFlZDY5L3RhY28tdG9vbHNldC02LjMuMS9ub2RlX21vZHVsZXMvY29yZG92YS1zaW11bGF0ZS9zcmMvbW9kdWxlcy91dGlscy5qcyIsIkM6L1Byb2dyYW1EYXRhL01pY3Jvc29mdC9WaXN1YWxTdHVkaW8vTURBLzc3NGFlZDY5L3RhY28tdG9vbHNldC02LjMuMS9ub2RlX21vZHVsZXMvY29yZG92YS1zaW11bGF0ZS9zcmMvdGhpcmQtcGFydHkvd2ViY29tcG9uZW50cy5taW4uanMiLCJDOi9Qcm9ncmFtRGF0YS9NaWNyb3NvZnQvVmlzdWFsU3R1ZGlvL01EQS83NzRhZWQ2OS90YWNvLXRvb2xzZXQtNi4zLjEvbm9kZV9tb2R1bGVzL2NvcmRvdmEtc2ltdWxhdGUvc3JjL21vZHVsZXMveGhyLXByb3h5LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ2hnRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNXRCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ254QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDek1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ2hLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUNyaEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDVkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDek1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9JQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDdE5BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5U0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNiQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gZSh0LG4scil7ZnVuY3Rpb24gcyhvLHUpe2lmKCFuW29dKXtpZighdFtvXSl7dmFyIGE9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtpZighdSYmYSlyZXR1cm4gYShvLCEwKTtpZihpKXJldHVybiBpKG8sITApO3ZhciBmPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIrbytcIidcIik7dGhyb3cgZi5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGZ9dmFyIGw9bltvXT17ZXhwb3J0czp7fX07dFtvXVswXS5jYWxsKGwuZXhwb3J0cyxmdW5jdGlvbihlKXt2YXIgbj10W29dWzFdW2VdO3JldHVybiBzKG4/bjplKX0sbCxsLmV4cG9ydHMsZSx0LG4scil9cmV0dXJuIG5bb10uZXhwb3J0c312YXIgaT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2Zvcih2YXIgbz0wO288ci5sZW5ndGg7bysrKXMocltvXSk7cmV0dXJuIHN9KSIsIi8vIHZpbTp0cz00OnN0cz00OnN3PTQ6XG4vKiFcbiAqXG4gKiBDb3B5cmlnaHQgMjAwOS0yMDEyIEtyaXMgS293YWwgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNSVRcbiAqIGxpY2Vuc2UgZm91bmQgYXQgaHR0cDovL2dpdGh1Yi5jb20va3Jpc2tvd2FsL3EvcmF3L21hc3Rlci9MSUNFTlNFXG4gKlxuICogV2l0aCBwYXJ0cyBieSBUeWxlciBDbG9zZVxuICogQ29weXJpZ2h0IDIwMDctMjAwOSBUeWxlciBDbG9zZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1JVCBYIGxpY2Vuc2UgZm91bmRcbiAqIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2UuaHRtbFxuICogRm9ya2VkIGF0IHJlZl9zZW5kLmpzIHZlcnNpb246IDIwMDktMDUtMTFcbiAqXG4gKiBXaXRoIHBhcnRzIGJ5IE1hcmsgTWlsbGVyXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTEgR29vZ2xlIEluYy5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKi9cblxuKGZ1bmN0aW9uIChkZWZpbml0aW9uKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICAvLyBUaGlzIGZpbGUgd2lsbCBmdW5jdGlvbiBwcm9wZXJseSBhcyBhIDxzY3JpcHQ+IHRhZywgb3IgYSBtb2R1bGVcbiAgICAvLyB1c2luZyBDb21tb25KUyBhbmQgTm9kZUpTIG9yIFJlcXVpcmVKUyBtb2R1bGUgZm9ybWF0cy4gIEluXG4gICAgLy8gQ29tbW9uL05vZGUvUmVxdWlyZUpTLCB0aGUgbW9kdWxlIGV4cG9ydHMgdGhlIFEgQVBJIGFuZCB3aGVuXG4gICAgLy8gZXhlY3V0ZWQgYXMgYSBzaW1wbGUgPHNjcmlwdD4sIGl0IGNyZWF0ZXMgYSBRIGdsb2JhbCBpbnN0ZWFkLlxuXG4gICAgLy8gTW9udGFnZSBSZXF1aXJlXG4gICAgaWYgKHR5cGVvZiBib290c3RyYXAgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBib290c3RyYXAoXCJwcm9taXNlXCIsIGRlZmluaXRpb24pO1xuXG4gICAgLy8gQ29tbW9uSlNcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBleHBvcnRzID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBtb2R1bGUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBkZWZpbml0aW9uKCk7XG5cbiAgICAvLyBSZXF1aXJlSlNcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT09IFwiZnVuY3Rpb25cIiAmJiBkZWZpbmUuYW1kKSB7XG4gICAgICAgIGRlZmluZShkZWZpbml0aW9uKTtcblxuICAgIC8vIFNFUyAoU2VjdXJlIEVjbWFTY3JpcHQpXG4gICAgfSBlbHNlIGlmICh0eXBlb2Ygc2VzICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIGlmICghc2VzLm9rKCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNlcy5tYWtlUSA9IGRlZmluaXRpb247XG4gICAgICAgIH1cblxuICAgIC8vIDxzY3JpcHQ+XG4gICAgfSBlbHNlIGlmICh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiIHx8IHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIC8vIFByZWZlciB3aW5kb3cgb3ZlciBzZWxmIGZvciBhZGQtb24gc2NyaXB0cy4gVXNlIHNlbGYgZm9yXG4gICAgICAgIC8vIG5vbi13aW5kb3dlZCBjb250ZXh0cy5cbiAgICAgICAgdmFyIGdsb2JhbCA9IHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgPyB3aW5kb3cgOiBzZWxmO1xuXG4gICAgICAgIC8vIEdldCB0aGUgYHdpbmRvd2Agb2JqZWN0LCBzYXZlIHRoZSBwcmV2aW91cyBRIGdsb2JhbFxuICAgICAgICAvLyBhbmQgaW5pdGlhbGl6ZSBRIGFzIGEgZ2xvYmFsLlxuICAgICAgICB2YXIgcHJldmlvdXNRID0gZ2xvYmFsLlE7XG4gICAgICAgIGdsb2JhbC5RID0gZGVmaW5pdGlvbigpO1xuXG4gICAgICAgIC8vIEFkZCBhIG5vQ29uZmxpY3QgZnVuY3Rpb24gc28gUSBjYW4gYmUgcmVtb3ZlZCBmcm9tIHRoZVxuICAgICAgICAvLyBnbG9iYWwgbmFtZXNwYWNlLlxuICAgICAgICBnbG9iYWwuUS5ub0NvbmZsaWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZ2xvYmFsLlEgPSBwcmV2aW91c1E7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfTtcblxuICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoaXMgZW52aXJvbm1lbnQgd2FzIG5vdCBhbnRpY2lwYXRlZCBieSBRLiBQbGVhc2UgZmlsZSBhIGJ1Zy5cIik7XG4gICAgfVxuXG59KShmdW5jdGlvbiAoKSB7XG5cInVzZSBzdHJpY3RcIjtcblxudmFyIGhhc1N0YWNrcyA9IGZhbHNlO1xudHJ5IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoKTtcbn0gY2F0Y2ggKGUpIHtcbiAgICBoYXNTdGFja3MgPSAhIWUuc3RhY2s7XG59XG5cbi8vIEFsbCBjb2RlIGFmdGVyIHRoaXMgcG9pbnQgd2lsbCBiZSBmaWx0ZXJlZCBmcm9tIHN0YWNrIHRyYWNlcyByZXBvcnRlZFxuLy8gYnkgUS5cbnZhciBxU3RhcnRpbmdMaW5lID0gY2FwdHVyZUxpbmUoKTtcbnZhciBxRmlsZU5hbWU7XG5cbi8vIHNoaW1zXG5cbi8vIHVzZWQgZm9yIGZhbGxiYWNrIGluIFwiYWxsUmVzb2x2ZWRcIlxudmFyIG5vb3AgPSBmdW5jdGlvbiAoKSB7fTtcblxuLy8gVXNlIHRoZSBmYXN0ZXN0IHBvc3NpYmxlIG1lYW5zIHRvIGV4ZWN1dGUgYSB0YXNrIGluIGEgZnV0dXJlIHR1cm5cbi8vIG9mIHRoZSBldmVudCBsb29wLlxudmFyIG5leHRUaWNrID0oZnVuY3Rpb24gKCkge1xuICAgIC8vIGxpbmtlZCBsaXN0IG9mIHRhc2tzIChzaW5nbGUsIHdpdGggaGVhZCBub2RlKVxuICAgIHZhciBoZWFkID0ge3Rhc2s6IHZvaWQgMCwgbmV4dDogbnVsbH07XG4gICAgdmFyIHRhaWwgPSBoZWFkO1xuICAgIHZhciBmbHVzaGluZyA9IGZhbHNlO1xuICAgIHZhciByZXF1ZXN0VGljayA9IHZvaWQgMDtcbiAgICB2YXIgaXNOb2RlSlMgPSBmYWxzZTtcbiAgICAvLyBxdWV1ZSBmb3IgbGF0ZSB0YXNrcywgdXNlZCBieSB1bmhhbmRsZWQgcmVqZWN0aW9uIHRyYWNraW5nXG4gICAgdmFyIGxhdGVyUXVldWUgPSBbXTtcblxuICAgIGZ1bmN0aW9uIGZsdXNoKCkge1xuICAgICAgICAvKiBqc2hpbnQgbG9vcGZ1bmM6IHRydWUgKi9cbiAgICAgICAgdmFyIHRhc2ssIGRvbWFpbjtcblxuICAgICAgICB3aGlsZSAoaGVhZC5uZXh0KSB7XG4gICAgICAgICAgICBoZWFkID0gaGVhZC5uZXh0O1xuICAgICAgICAgICAgdGFzayA9IGhlYWQudGFzaztcbiAgICAgICAgICAgIGhlYWQudGFzayA9IHZvaWQgMDtcbiAgICAgICAgICAgIGRvbWFpbiA9IGhlYWQuZG9tYWluO1xuXG4gICAgICAgICAgICBpZiAoZG9tYWluKSB7XG4gICAgICAgICAgICAgICAgaGVhZC5kb21haW4gPSB2b2lkIDA7XG4gICAgICAgICAgICAgICAgZG9tYWluLmVudGVyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBydW5TaW5nbGUodGFzaywgZG9tYWluKTtcblxuICAgICAgICB9XG4gICAgICAgIHdoaWxlIChsYXRlclF1ZXVlLmxlbmd0aCkge1xuICAgICAgICAgICAgdGFzayA9IGxhdGVyUXVldWUucG9wKCk7XG4gICAgICAgICAgICBydW5TaW5nbGUodGFzayk7XG4gICAgICAgIH1cbiAgICAgICAgZmx1c2hpbmcgPSBmYWxzZTtcbiAgICB9XG4gICAgLy8gcnVucyBhIHNpbmdsZSBmdW5jdGlvbiBpbiB0aGUgYXN5bmMgcXVldWVcbiAgICBmdW5jdGlvbiBydW5TaW5nbGUodGFzaywgZG9tYWluKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0YXNrKCk7XG5cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgaWYgKGlzTm9kZUpTKSB7XG4gICAgICAgICAgICAgICAgLy8gSW4gbm9kZSwgdW5jYXVnaHQgZXhjZXB0aW9ucyBhcmUgY29uc2lkZXJlZCBmYXRhbCBlcnJvcnMuXG4gICAgICAgICAgICAgICAgLy8gUmUtdGhyb3cgdGhlbSBzeW5jaHJvbm91c2x5IHRvIGludGVycnVwdCBmbHVzaGluZyFcblxuICAgICAgICAgICAgICAgIC8vIEVuc3VyZSBjb250aW51YXRpb24gaWYgdGhlIHVuY2F1Z2h0IGV4Y2VwdGlvbiBpcyBzdXBwcmVzc2VkXG4gICAgICAgICAgICAgICAgLy8gbGlzdGVuaW5nIFwidW5jYXVnaHRFeGNlcHRpb25cIiBldmVudHMgKGFzIGRvbWFpbnMgZG9lcykuXG4gICAgICAgICAgICAgICAgLy8gQ29udGludWUgaW4gbmV4dCBldmVudCB0byBhdm9pZCB0aWNrIHJlY3Vyc2lvbi5cbiAgICAgICAgICAgICAgICBpZiAoZG9tYWluKSB7XG4gICAgICAgICAgICAgICAgICAgIGRvbWFpbi5leGl0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZmx1c2gsIDApO1xuICAgICAgICAgICAgICAgIGlmIChkb21haW4pIHtcbiAgICAgICAgICAgICAgICAgICAgZG9tYWluLmVudGVyKCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhyb3cgZTtcblxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBJbiBicm93c2VycywgdW5jYXVnaHQgZXhjZXB0aW9ucyBhcmUgbm90IGZhdGFsLlxuICAgICAgICAgICAgICAgIC8vIFJlLXRocm93IHRoZW0gYXN5bmNocm9ub3VzbHkgdG8gYXZvaWQgc2xvdy1kb3ducy5cbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICAgICAgICB9LCAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkb21haW4pIHtcbiAgICAgICAgICAgIGRvbWFpbi5leGl0KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBuZXh0VGljayA9IGZ1bmN0aW9uICh0YXNrKSB7XG4gICAgICAgIHRhaWwgPSB0YWlsLm5leHQgPSB7XG4gICAgICAgICAgICB0YXNrOiB0YXNrLFxuICAgICAgICAgICAgZG9tYWluOiBpc05vZGVKUyAmJiBwcm9jZXNzLmRvbWFpbixcbiAgICAgICAgICAgIG5leHQ6IG51bGxcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoIWZsdXNoaW5nKSB7XG4gICAgICAgICAgICBmbHVzaGluZyA9IHRydWU7XG4gICAgICAgICAgICByZXF1ZXN0VGljaygpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIGlmICh0eXBlb2YgcHJvY2VzcyA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICBwcm9jZXNzLnRvU3RyaW5nKCkgPT09IFwiW29iamVjdCBwcm9jZXNzXVwiICYmIHByb2Nlc3MubmV4dFRpY2spIHtcbiAgICAgICAgLy8gRW5zdXJlIFEgaXMgaW4gYSByZWFsIE5vZGUgZW52aXJvbm1lbnQsIHdpdGggYSBgcHJvY2Vzcy5uZXh0VGlja2AuXG4gICAgICAgIC8vIFRvIHNlZSB0aHJvdWdoIGZha2UgTm9kZSBlbnZpcm9ubWVudHM6XG4gICAgICAgIC8vICogTW9jaGEgdGVzdCBydW5uZXIgLSBleHBvc2VzIGEgYHByb2Nlc3NgIGdsb2JhbCB3aXRob3V0IGEgYG5leHRUaWNrYFxuICAgICAgICAvLyAqIEJyb3dzZXJpZnkgLSBleHBvc2VzIGEgYHByb2Nlc3MubmV4VGlja2AgZnVuY3Rpb24gdGhhdCB1c2VzXG4gICAgICAgIC8vICAgYHNldFRpbWVvdXRgLiBJbiB0aGlzIGNhc2UgYHNldEltbWVkaWF0ZWAgaXMgcHJlZmVycmVkIGJlY2F1c2VcbiAgICAgICAgLy8gICAgaXQgaXMgZmFzdGVyLiBCcm93c2VyaWZ5J3MgYHByb2Nlc3MudG9TdHJpbmcoKWAgeWllbGRzXG4gICAgICAgIC8vICAgXCJbb2JqZWN0IE9iamVjdF1cIiwgd2hpbGUgaW4gYSByZWFsIE5vZGUgZW52aXJvbm1lbnRcbiAgICAgICAgLy8gICBgcHJvY2Vzcy5uZXh0VGljaygpYCB5aWVsZHMgXCJbb2JqZWN0IHByb2Nlc3NdXCIuXG4gICAgICAgIGlzTm9kZUpTID0gdHJ1ZTtcblxuICAgICAgICByZXF1ZXN0VGljayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHByb2Nlc3MubmV4dFRpY2soZmx1c2gpO1xuICAgICAgICB9O1xuXG4gICAgfSBlbHNlIGlmICh0eXBlb2Ygc2V0SW1tZWRpYXRlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgLy8gSW4gSUUxMCwgTm9kZS5qcyAwLjkrLCBvciBodHRwczovL2dpdGh1Yi5jb20vTm9ibGVKUy9zZXRJbW1lZGlhdGVcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIHJlcXVlc3RUaWNrID0gc2V0SW1tZWRpYXRlLmJpbmQod2luZG93LCBmbHVzaCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXF1ZXN0VGljayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBzZXRJbW1lZGlhdGUoZmx1c2gpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgTWVzc2FnZUNoYW5uZWwgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgLy8gbW9kZXJuIGJyb3dzZXJzXG4gICAgICAgIC8vIGh0dHA6Ly93d3cubm9uYmxvY2tpbmcuaW8vMjAxMS8wNi93aW5kb3duZXh0dGljay5odG1sXG4gICAgICAgIHZhciBjaGFubmVsID0gbmV3IE1lc3NhZ2VDaGFubmVsKCk7XG4gICAgICAgIC8vIEF0IGxlYXN0IFNhZmFyaSBWZXJzaW9uIDYuMC41ICg4NTM2LjMwLjEpIGludGVybWl0dGVudGx5IGNhbm5vdCBjcmVhdGVcbiAgICAgICAgLy8gd29ya2luZyBtZXNzYWdlIHBvcnRzIHRoZSBmaXJzdCB0aW1lIGEgcGFnZSBsb2Fkcy5cbiAgICAgICAgY2hhbm5lbC5wb3J0MS5vbm1lc3NhZ2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXF1ZXN0VGljayA9IHJlcXVlc3RQb3J0VGljaztcbiAgICAgICAgICAgIGNoYW5uZWwucG9ydDEub25tZXNzYWdlID0gZmx1c2g7XG4gICAgICAgICAgICBmbHVzaCgpO1xuICAgICAgICB9O1xuICAgICAgICB2YXIgcmVxdWVzdFBvcnRUaWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgLy8gT3BlcmEgcmVxdWlyZXMgdXMgdG8gcHJvdmlkZSBhIG1lc3NhZ2UgcGF5bG9hZCwgcmVnYXJkbGVzcyBvZlxuICAgICAgICAgICAgLy8gd2hldGhlciB3ZSB1c2UgaXQuXG4gICAgICAgICAgICBjaGFubmVsLnBvcnQyLnBvc3RNZXNzYWdlKDApO1xuICAgICAgICB9O1xuICAgICAgICByZXF1ZXN0VGljayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoZmx1c2gsIDApO1xuICAgICAgICAgICAgcmVxdWVzdFBvcnRUaWNrKCk7XG4gICAgICAgIH07XG5cbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyBvbGQgYnJvd3NlcnNcbiAgICAgICAgcmVxdWVzdFRpY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KGZsdXNoLCAwKTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLy8gcnVucyBhIHRhc2sgYWZ0ZXIgYWxsIG90aGVyIHRhc2tzIGhhdmUgYmVlbiBydW5cbiAgICAvLyB0aGlzIGlzIHVzZWZ1bCBmb3IgdW5oYW5kbGVkIHJlamVjdGlvbiB0cmFja2luZyB0aGF0IG5lZWRzIHRvIGhhcHBlblxuICAgIC8vIGFmdGVyIGFsbCBgdGhlbmBkIHRhc2tzIGhhdmUgYmVlbiBydW4uXG4gICAgbmV4dFRpY2sucnVuQWZ0ZXIgPSBmdW5jdGlvbiAodGFzaykge1xuICAgICAgICBsYXRlclF1ZXVlLnB1c2godGFzayk7XG4gICAgICAgIGlmICghZmx1c2hpbmcpIHtcbiAgICAgICAgICAgIGZsdXNoaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgIHJlcXVlc3RUaWNrKCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBuZXh0VGljaztcbn0pKCk7XG5cbi8vIEF0dGVtcHQgdG8gbWFrZSBnZW5lcmljcyBzYWZlIGluIHRoZSBmYWNlIG9mIGRvd25zdHJlYW1cbi8vIG1vZGlmaWNhdGlvbnMuXG4vLyBUaGVyZSBpcyBubyBzaXR1YXRpb24gd2hlcmUgdGhpcyBpcyBuZWNlc3NhcnkuXG4vLyBJZiB5b3UgbmVlZCBhIHNlY3VyaXR5IGd1YXJhbnRlZSwgdGhlc2UgcHJpbW9yZGlhbHMgbmVlZCB0byBiZVxuLy8gZGVlcGx5IGZyb3plbiBhbnl3YXksIGFuZCBpZiB5b3UgZG9u4oCZdCBuZWVkIGEgc2VjdXJpdHkgZ3VhcmFudGVlLFxuLy8gdGhpcyBpcyBqdXN0IHBsYWluIHBhcmFub2lkLlxuLy8gSG93ZXZlciwgdGhpcyAqKm1pZ2h0KiogaGF2ZSB0aGUgbmljZSBzaWRlLWVmZmVjdCBvZiByZWR1Y2luZyB0aGUgc2l6ZSBvZlxuLy8gdGhlIG1pbmlmaWVkIGNvZGUgYnkgcmVkdWNpbmcgeC5jYWxsKCkgdG8gbWVyZWx5IHgoKVxuLy8gU2VlIE1hcmsgTWlsbGVy4oCZcyBleHBsYW5hdGlvbiBvZiB3aGF0IHRoaXMgZG9lcy5cbi8vIGh0dHA6Ly93aWtpLmVjbWFzY3JpcHQub3JnL2Rva3UucGhwP2lkPWNvbnZlbnRpb25zOnNhZmVfbWV0YV9wcm9ncmFtbWluZ1xudmFyIGNhbGwgPSBGdW5jdGlvbi5jYWxsO1xuZnVuY3Rpb24gdW5jdXJyeVRoaXMoZikge1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBjYWxsLmFwcGx5KGYsIGFyZ3VtZW50cyk7XG4gICAgfTtcbn1cbi8vIFRoaXMgaXMgZXF1aXZhbGVudCwgYnV0IHNsb3dlcjpcbi8vIHVuY3VycnlUaGlzID0gRnVuY3Rpb25fYmluZC5iaW5kKEZ1bmN0aW9uX2JpbmQuY2FsbCk7XG4vLyBodHRwOi8vanNwZXJmLmNvbS91bmN1cnJ5dGhpc1xuXG52YXIgYXJyYXlfc2xpY2UgPSB1bmN1cnJ5VGhpcyhBcnJheS5wcm90b3R5cGUuc2xpY2UpO1xuXG52YXIgYXJyYXlfcmVkdWNlID0gdW5jdXJyeVRoaXMoXG4gICAgQXJyYXkucHJvdG90eXBlLnJlZHVjZSB8fCBmdW5jdGlvbiAoY2FsbGJhY2ssIGJhc2lzKSB7XG4gICAgICAgIHZhciBpbmRleCA9IDAsXG4gICAgICAgICAgICBsZW5ndGggPSB0aGlzLmxlbmd0aDtcbiAgICAgICAgLy8gY29uY2VybmluZyB0aGUgaW5pdGlhbCB2YWx1ZSwgaWYgb25lIGlzIG5vdCBwcm92aWRlZFxuICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgLy8gc2VlayB0byB0aGUgZmlyc3QgdmFsdWUgaW4gdGhlIGFycmF5LCBhY2NvdW50aW5nXG4gICAgICAgICAgICAvLyBmb3IgdGhlIHBvc3NpYmlsaXR5IHRoYXQgaXMgaXMgYSBzcGFyc2UgYXJyYXlcbiAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggaW4gdGhpcykge1xuICAgICAgICAgICAgICAgICAgICBiYXNpcyA9IHRoaXNbaW5kZXgrK107XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoKytpbmRleCA+PSBsZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gd2hpbGUgKDEpO1xuICAgICAgICB9XG4gICAgICAgIC8vIHJlZHVjZVxuICAgICAgICBmb3IgKDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICAgIC8vIGFjY291bnQgZm9yIHRoZSBwb3NzaWJpbGl0eSB0aGF0IHRoZSBhcnJheSBpcyBzcGFyc2VcbiAgICAgICAgICAgIGlmIChpbmRleCBpbiB0aGlzKSB7XG4gICAgICAgICAgICAgICAgYmFzaXMgPSBjYWxsYmFjayhiYXNpcywgdGhpc1tpbmRleF0sIGluZGV4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYmFzaXM7XG4gICAgfVxuKTtcblxudmFyIGFycmF5X2luZGV4T2YgPSB1bmN1cnJ5VGhpcyhcbiAgICBBcnJheS5wcm90b3R5cGUuaW5kZXhPZiB8fCBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgLy8gbm90IGEgdmVyeSBnb29kIHNoaW0sIGJ1dCBnb29kIGVub3VnaCBmb3Igb3VyIG9uZSB1c2Ugb2YgaXRcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodGhpc1tpXSA9PT0gdmFsdWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gLTE7XG4gICAgfVxuKTtcblxudmFyIGFycmF5X21hcCA9IHVuY3VycnlUaGlzKFxuICAgIEFycmF5LnByb3RvdHlwZS5tYXAgfHwgZnVuY3Rpb24gKGNhbGxiYWNrLCB0aGlzcCkge1xuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAgIHZhciBjb2xsZWN0ID0gW107XG4gICAgICAgIGFycmF5X3JlZHVjZShzZWxmLCBmdW5jdGlvbiAodW5kZWZpbmVkLCB2YWx1ZSwgaW5kZXgpIHtcbiAgICAgICAgICAgIGNvbGxlY3QucHVzaChjYWxsYmFjay5jYWxsKHRoaXNwLCB2YWx1ZSwgaW5kZXgsIHNlbGYpKTtcbiAgICAgICAgfSwgdm9pZCAwKTtcbiAgICAgICAgcmV0dXJuIGNvbGxlY3Q7XG4gICAgfVxuKTtcblxudmFyIG9iamVjdF9jcmVhdGUgPSBPYmplY3QuY3JlYXRlIHx8IGZ1bmN0aW9uIChwcm90b3R5cGUpIHtcbiAgICBmdW5jdGlvbiBUeXBlKCkgeyB9XG4gICAgVHlwZS5wcm90b3R5cGUgPSBwcm90b3R5cGU7XG4gICAgcmV0dXJuIG5ldyBUeXBlKCk7XG59O1xuXG52YXIgb2JqZWN0X2hhc093blByb3BlcnR5ID0gdW5jdXJyeVRoaXMoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSk7XG5cbnZhciBvYmplY3Rfa2V5cyA9IE9iamVjdC5rZXlzIHx8IGZ1bmN0aW9uIChvYmplY3QpIHtcbiAgICB2YXIga2V5cyA9IFtdO1xuICAgIGZvciAodmFyIGtleSBpbiBvYmplY3QpIHtcbiAgICAgICAgaWYgKG9iamVjdF9oYXNPd25Qcm9wZXJ0eShvYmplY3QsIGtleSkpIHtcbiAgICAgICAgICAgIGtleXMucHVzaChrZXkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBrZXlzO1xufTtcblxudmFyIG9iamVjdF90b1N0cmluZyA9IHVuY3VycnlUaGlzKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcpO1xuXG5mdW5jdGlvbiBpc09iamVjdCh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gT2JqZWN0KHZhbHVlKTtcbn1cblxuLy8gZ2VuZXJhdG9yIHJlbGF0ZWQgc2hpbXNcblxuLy8gRklYTUU6IFJlbW92ZSB0aGlzIGZ1bmN0aW9uIG9uY2UgRVM2IGdlbmVyYXRvcnMgYXJlIGluIFNwaWRlck1vbmtleS5cbmZ1bmN0aW9uIGlzU3RvcEl0ZXJhdGlvbihleGNlcHRpb24pIHtcbiAgICByZXR1cm4gKFxuICAgICAgICBvYmplY3RfdG9TdHJpbmcoZXhjZXB0aW9uKSA9PT0gXCJbb2JqZWN0IFN0b3BJdGVyYXRpb25dXCIgfHxcbiAgICAgICAgZXhjZXB0aW9uIGluc3RhbmNlb2YgUVJldHVyblZhbHVlXG4gICAgKTtcbn1cblxuLy8gRklYTUU6IFJlbW92ZSB0aGlzIGhlbHBlciBhbmQgUS5yZXR1cm4gb25jZSBFUzYgZ2VuZXJhdG9ycyBhcmUgaW5cbi8vIFNwaWRlck1vbmtleS5cbnZhciBRUmV0dXJuVmFsdWU7XG5pZiAodHlwZW9mIFJldHVyblZhbHVlICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgUVJldHVyblZhbHVlID0gUmV0dXJuVmFsdWU7XG59IGVsc2Uge1xuICAgIFFSZXR1cm5WYWx1ZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgfTtcbn1cblxuLy8gbG9uZyBzdGFjayB0cmFjZXNcblxudmFyIFNUQUNLX0pVTVBfU0VQQVJBVE9SID0gXCJGcm9tIHByZXZpb3VzIGV2ZW50OlwiO1xuXG5mdW5jdGlvbiBtYWtlU3RhY2tUcmFjZUxvbmcoZXJyb3IsIHByb21pc2UpIHtcbiAgICAvLyBJZiBwb3NzaWJsZSwgdHJhbnNmb3JtIHRoZSBlcnJvciBzdGFjayB0cmFjZSBieSByZW1vdmluZyBOb2RlIGFuZCBRXG4gICAgLy8gY3J1ZnQsIHRoZW4gY29uY2F0ZW5hdGluZyB3aXRoIHRoZSBzdGFjayB0cmFjZSBvZiBgcHJvbWlzZWAuIFNlZSAjNTcuXG4gICAgaWYgKGhhc1N0YWNrcyAmJlxuICAgICAgICBwcm9taXNlLnN0YWNrICYmXG4gICAgICAgIHR5cGVvZiBlcnJvciA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICBlcnJvciAhPT0gbnVsbCAmJlxuICAgICAgICBlcnJvci5zdGFjayAmJlxuICAgICAgICBlcnJvci5zdGFjay5pbmRleE9mKFNUQUNLX0pVTVBfU0VQQVJBVE9SKSA9PT0gLTFcbiAgICApIHtcbiAgICAgICAgdmFyIHN0YWNrcyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBwID0gcHJvbWlzZTsgISFwOyBwID0gcC5zb3VyY2UpIHtcbiAgICAgICAgICAgIGlmIChwLnN0YWNrKSB7XG4gICAgICAgICAgICAgICAgc3RhY2tzLnVuc2hpZnQocC5zdGFjayk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc3RhY2tzLnVuc2hpZnQoZXJyb3Iuc3RhY2spO1xuXG4gICAgICAgIHZhciBjb25jYXRlZFN0YWNrcyA9IHN0YWNrcy5qb2luKFwiXFxuXCIgKyBTVEFDS19KVU1QX1NFUEFSQVRPUiArIFwiXFxuXCIpO1xuICAgICAgICBlcnJvci5zdGFjayA9IGZpbHRlclN0YWNrU3RyaW5nKGNvbmNhdGVkU3RhY2tzKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGZpbHRlclN0YWNrU3RyaW5nKHN0YWNrU3RyaW5nKSB7XG4gICAgdmFyIGxpbmVzID0gc3RhY2tTdHJpbmcuc3BsaXQoXCJcXG5cIik7XG4gICAgdmFyIGRlc2lyZWRMaW5lcyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgdmFyIGxpbmUgPSBsaW5lc1tpXTtcblxuICAgICAgICBpZiAoIWlzSW50ZXJuYWxGcmFtZShsaW5lKSAmJiAhaXNOb2RlRnJhbWUobGluZSkgJiYgbGluZSkge1xuICAgICAgICAgICAgZGVzaXJlZExpbmVzLnB1c2gobGluZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGRlc2lyZWRMaW5lcy5qb2luKFwiXFxuXCIpO1xufVxuXG5mdW5jdGlvbiBpc05vZGVGcmFtZShzdGFja0xpbmUpIHtcbiAgICByZXR1cm4gc3RhY2tMaW5lLmluZGV4T2YoXCIobW9kdWxlLmpzOlwiKSAhPT0gLTEgfHxcbiAgICAgICAgICAgc3RhY2tMaW5lLmluZGV4T2YoXCIobm9kZS5qczpcIikgIT09IC0xO1xufVxuXG5mdW5jdGlvbiBnZXRGaWxlTmFtZUFuZExpbmVOdW1iZXIoc3RhY2tMaW5lKSB7XG4gICAgLy8gTmFtZWQgZnVuY3Rpb25zOiBcImF0IGZ1bmN0aW9uTmFtZSAoZmlsZW5hbWU6bGluZU51bWJlcjpjb2x1bW5OdW1iZXIpXCJcbiAgICAvLyBJbiBJRTEwIGZ1bmN0aW9uIG5hbWUgY2FuIGhhdmUgc3BhY2VzIChcIkFub255bW91cyBmdW5jdGlvblwiKSBPX29cbiAgICB2YXIgYXR0ZW1wdDEgPSAvYXQgLisgXFwoKC4rKTooXFxkKyk6KD86XFxkKylcXCkkLy5leGVjKHN0YWNrTGluZSk7XG4gICAgaWYgKGF0dGVtcHQxKSB7XG4gICAgICAgIHJldHVybiBbYXR0ZW1wdDFbMV0sIE51bWJlcihhdHRlbXB0MVsyXSldO1xuICAgIH1cblxuICAgIC8vIEFub255bW91cyBmdW5jdGlvbnM6IFwiYXQgZmlsZW5hbWU6bGluZU51bWJlcjpjb2x1bW5OdW1iZXJcIlxuICAgIHZhciBhdHRlbXB0MiA9IC9hdCAoW14gXSspOihcXGQrKTooPzpcXGQrKSQvLmV4ZWMoc3RhY2tMaW5lKTtcbiAgICBpZiAoYXR0ZW1wdDIpIHtcbiAgICAgICAgcmV0dXJuIFthdHRlbXB0MlsxXSwgTnVtYmVyKGF0dGVtcHQyWzJdKV07XG4gICAgfVxuXG4gICAgLy8gRmlyZWZveCBzdHlsZTogXCJmdW5jdGlvbkBmaWxlbmFtZTpsaW5lTnVtYmVyIG9yIEBmaWxlbmFtZTpsaW5lTnVtYmVyXCJcbiAgICB2YXIgYXR0ZW1wdDMgPSAvLipAKC4rKTooXFxkKykkLy5leGVjKHN0YWNrTGluZSk7XG4gICAgaWYgKGF0dGVtcHQzKSB7XG4gICAgICAgIHJldHVybiBbYXR0ZW1wdDNbMV0sIE51bWJlcihhdHRlbXB0M1syXSldO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gaXNJbnRlcm5hbEZyYW1lKHN0YWNrTGluZSkge1xuICAgIHZhciBmaWxlTmFtZUFuZExpbmVOdW1iZXIgPSBnZXRGaWxlTmFtZUFuZExpbmVOdW1iZXIoc3RhY2tMaW5lKTtcblxuICAgIGlmICghZmlsZU5hbWVBbmRMaW5lTnVtYmVyKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB2YXIgZmlsZU5hbWUgPSBmaWxlTmFtZUFuZExpbmVOdW1iZXJbMF07XG4gICAgdmFyIGxpbmVOdW1iZXIgPSBmaWxlTmFtZUFuZExpbmVOdW1iZXJbMV07XG5cbiAgICByZXR1cm4gZmlsZU5hbWUgPT09IHFGaWxlTmFtZSAmJlxuICAgICAgICBsaW5lTnVtYmVyID49IHFTdGFydGluZ0xpbmUgJiZcbiAgICAgICAgbGluZU51bWJlciA8PSBxRW5kaW5nTGluZTtcbn1cblxuLy8gZGlzY292ZXIgb3duIGZpbGUgbmFtZSBhbmQgbGluZSBudW1iZXIgcmFuZ2UgZm9yIGZpbHRlcmluZyBzdGFja1xuLy8gdHJhY2VzXG5mdW5jdGlvbiBjYXB0dXJlTGluZSgpIHtcbiAgICBpZiAoIWhhc1N0YWNrcykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB2YXIgbGluZXMgPSBlLnN0YWNrLnNwbGl0KFwiXFxuXCIpO1xuICAgICAgICB2YXIgZmlyc3RMaW5lID0gbGluZXNbMF0uaW5kZXhPZihcIkBcIikgPiAwID8gbGluZXNbMV0gOiBsaW5lc1syXTtcbiAgICAgICAgdmFyIGZpbGVOYW1lQW5kTGluZU51bWJlciA9IGdldEZpbGVOYW1lQW5kTGluZU51bWJlcihmaXJzdExpbmUpO1xuICAgICAgICBpZiAoIWZpbGVOYW1lQW5kTGluZU51bWJlcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgcUZpbGVOYW1lID0gZmlsZU5hbWVBbmRMaW5lTnVtYmVyWzBdO1xuICAgICAgICByZXR1cm4gZmlsZU5hbWVBbmRMaW5lTnVtYmVyWzFdO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZGVwcmVjYXRlKGNhbGxiYWNrLCBuYW1lLCBhbHRlcm5hdGl2ZSkge1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgICAgICAgICAgdHlwZW9mIGNvbnNvbGUud2FybiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4obmFtZSArIFwiIGlzIGRlcHJlY2F0ZWQsIHVzZSBcIiArIGFsdGVybmF0aXZlICtcbiAgICAgICAgICAgICAgICAgICAgICAgICBcIiBpbnN0ZWFkLlwiLCBuZXcgRXJyb3IoXCJcIikuc3RhY2spO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjYWxsYmFjay5hcHBseShjYWxsYmFjaywgYXJndW1lbnRzKTtcbiAgICB9O1xufVxuXG4vLyBlbmQgb2Ygc2hpbXNcbi8vIGJlZ2lubmluZyBvZiByZWFsIHdvcmtcblxuLyoqXG4gKiBDb25zdHJ1Y3RzIGEgcHJvbWlzZSBmb3IgYW4gaW1tZWRpYXRlIHJlZmVyZW5jZSwgcGFzc2VzIHByb21pc2VzIHRocm91Z2gsIG9yXG4gKiBjb2VyY2VzIHByb21pc2VzIGZyb20gZGlmZmVyZW50IHN5c3RlbXMuXG4gKiBAcGFyYW0gdmFsdWUgaW1tZWRpYXRlIHJlZmVyZW5jZSBvciBwcm9taXNlXG4gKi9cbmZ1bmN0aW9uIFEodmFsdWUpIHtcbiAgICAvLyBJZiB0aGUgb2JqZWN0IGlzIGFscmVhZHkgYSBQcm9taXNlLCByZXR1cm4gaXQgZGlyZWN0bHkuICBUaGlzIGVuYWJsZXNcbiAgICAvLyB0aGUgcmVzb2x2ZSBmdW5jdGlvbiB0byBib3RoIGJlIHVzZWQgdG8gY3JlYXRlZCByZWZlcmVuY2VzIGZyb20gb2JqZWN0cyxcbiAgICAvLyBidXQgdG8gdG9sZXJhYmx5IGNvZXJjZSBub24tcHJvbWlzZXMgdG8gcHJvbWlzZXMuXG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgLy8gYXNzaW1pbGF0ZSB0aGVuYWJsZXNcbiAgICBpZiAoaXNQcm9taXNlQWxpa2UodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBjb2VyY2UodmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBmdWxmaWxsKHZhbHVlKTtcbiAgICB9XG59XG5RLnJlc29sdmUgPSBRO1xuXG4vKipcbiAqIFBlcmZvcm1zIGEgdGFzayBpbiBhIGZ1dHVyZSB0dXJuIG9mIHRoZSBldmVudCBsb29wLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gdGFza1xuICovXG5RLm5leHRUaWNrID0gbmV4dFRpY2s7XG5cbi8qKlxuICogQ29udHJvbHMgd2hldGhlciBvciBub3QgbG9uZyBzdGFjayB0cmFjZXMgd2lsbCBiZSBvblxuICovXG5RLmxvbmdTdGFja1N1cHBvcnQgPSBmYWxzZTtcblxuLy8gZW5hYmxlIGxvbmcgc3RhY2tzIGlmIFFfREVCVUcgaXMgc2V0XG5pZiAodHlwZW9mIHByb2Nlc3MgPT09IFwib2JqZWN0XCIgJiYgcHJvY2VzcyAmJiBwcm9jZXNzLmVudiAmJiBwcm9jZXNzLmVudi5RX0RFQlVHKSB7XG4gICAgUS5sb25nU3RhY2tTdXBwb3J0ID0gdHJ1ZTtcbn1cblxuLyoqXG4gKiBDb25zdHJ1Y3RzIGEge3Byb21pc2UsIHJlc29sdmUsIHJlamVjdH0gb2JqZWN0LlxuICpcbiAqIGByZXNvbHZlYCBpcyBhIGNhbGxiYWNrIHRvIGludm9rZSB3aXRoIGEgbW9yZSByZXNvbHZlZCB2YWx1ZSBmb3IgdGhlXG4gKiBwcm9taXNlLiBUbyBmdWxmaWxsIHRoZSBwcm9taXNlLCBpbnZva2UgYHJlc29sdmVgIHdpdGggYW55IHZhbHVlIHRoYXQgaXNcbiAqIG5vdCBhIHRoZW5hYmxlLiBUbyByZWplY3QgdGhlIHByb21pc2UsIGludm9rZSBgcmVzb2x2ZWAgd2l0aCBhIHJlamVjdGVkXG4gKiB0aGVuYWJsZSwgb3IgaW52b2tlIGByZWplY3RgIHdpdGggdGhlIHJlYXNvbiBkaXJlY3RseS4gVG8gcmVzb2x2ZSB0aGVcbiAqIHByb21pc2UgdG8gYW5vdGhlciB0aGVuYWJsZSwgdGh1cyBwdXR0aW5nIGl0IGluIHRoZSBzYW1lIHN0YXRlLCBpbnZva2VcbiAqIGByZXNvbHZlYCB3aXRoIHRoYXQgb3RoZXIgdGhlbmFibGUuXG4gKi9cblEuZGVmZXIgPSBkZWZlcjtcbmZ1bmN0aW9uIGRlZmVyKCkge1xuICAgIC8vIGlmIFwibWVzc2FnZXNcIiBpcyBhbiBcIkFycmF5XCIsIHRoYXQgaW5kaWNhdGVzIHRoYXQgdGhlIHByb21pc2UgaGFzIG5vdCB5ZXRcbiAgICAvLyBiZWVuIHJlc29sdmVkLiAgSWYgaXQgaXMgXCJ1bmRlZmluZWRcIiwgaXQgaGFzIGJlZW4gcmVzb2x2ZWQuICBFYWNoXG4gICAgLy8gZWxlbWVudCBvZiB0aGUgbWVzc2FnZXMgYXJyYXkgaXMgaXRzZWxmIGFuIGFycmF5IG9mIGNvbXBsZXRlIGFyZ3VtZW50cyB0b1xuICAgIC8vIGZvcndhcmQgdG8gdGhlIHJlc29sdmVkIHByb21pc2UuICBXZSBjb2VyY2UgdGhlIHJlc29sdXRpb24gdmFsdWUgdG8gYVxuICAgIC8vIHByb21pc2UgdXNpbmcgdGhlIGByZXNvbHZlYCBmdW5jdGlvbiBiZWNhdXNlIGl0IGhhbmRsZXMgYm90aCBmdWxseVxuICAgIC8vIG5vbi10aGVuYWJsZSB2YWx1ZXMgYW5kIG90aGVyIHRoZW5hYmxlcyBncmFjZWZ1bGx5LlxuICAgIHZhciBtZXNzYWdlcyA9IFtdLCBwcm9ncmVzc0xpc3RlbmVycyA9IFtdLCByZXNvbHZlZFByb21pc2U7XG5cbiAgICB2YXIgZGVmZXJyZWQgPSBvYmplY3RfY3JlYXRlKGRlZmVyLnByb3RvdHlwZSk7XG4gICAgdmFyIHByb21pc2UgPSBvYmplY3RfY3JlYXRlKFByb21pc2UucHJvdG90eXBlKTtcblxuICAgIHByb21pc2UucHJvbWlzZURpc3BhdGNoID0gZnVuY3Rpb24gKHJlc29sdmUsIG9wLCBvcGVyYW5kcykge1xuICAgICAgICB2YXIgYXJncyA9IGFycmF5X3NsaWNlKGFyZ3VtZW50cyk7XG4gICAgICAgIGlmIChtZXNzYWdlcykge1xuICAgICAgICAgICAgbWVzc2FnZXMucHVzaChhcmdzKTtcbiAgICAgICAgICAgIGlmIChvcCA9PT0gXCJ3aGVuXCIgJiYgb3BlcmFuZHNbMV0pIHsgLy8gcHJvZ3Jlc3Mgb3BlcmFuZFxuICAgICAgICAgICAgICAgIHByb2dyZXNzTGlzdGVuZXJzLnB1c2gob3BlcmFuZHNbMV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgUS5uZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZWRQcm9taXNlLnByb21pc2VEaXNwYXRjaC5hcHBseShyZXNvbHZlZFByb21pc2UsIGFyZ3MpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gWFhYIGRlcHJlY2F0ZWRcbiAgICBwcm9taXNlLnZhbHVlT2YgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChtZXNzYWdlcykge1xuICAgICAgICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG5lYXJlclZhbHVlID0gbmVhcmVyKHJlc29sdmVkUHJvbWlzZSk7XG4gICAgICAgIGlmIChpc1Byb21pc2UobmVhcmVyVmFsdWUpKSB7XG4gICAgICAgICAgICByZXNvbHZlZFByb21pc2UgPSBuZWFyZXJWYWx1ZTsgLy8gc2hvcnRlbiBjaGFpblxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZWFyZXJWYWx1ZTtcbiAgICB9O1xuXG4gICAgcHJvbWlzZS5pbnNwZWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIXJlc29sdmVkUHJvbWlzZSkge1xuICAgICAgICAgICAgcmV0dXJuIHsgc3RhdGU6IFwicGVuZGluZ1wiIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc29sdmVkUHJvbWlzZS5pbnNwZWN0KCk7XG4gICAgfTtcblxuICAgIGlmIChRLmxvbmdTdGFja1N1cHBvcnQgJiYgaGFzU3RhY2tzKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgLy8gTk9URTogZG9uJ3QgdHJ5IHRvIHVzZSBgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2VgIG9yIHRyYW5zZmVyIHRoZVxuICAgICAgICAgICAgLy8gYWNjZXNzb3IgYXJvdW5kOyB0aGF0IGNhdXNlcyBtZW1vcnkgbGVha3MgYXMgcGVyIEdILTExMS4gSnVzdFxuICAgICAgICAgICAgLy8gcmVpZnkgdGhlIHN0YWNrIHRyYWNlIGFzIGEgc3RyaW5nIEFTQVAuXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gQXQgdGhlIHNhbWUgdGltZSwgY3V0IG9mZiB0aGUgZmlyc3QgbGluZTsgaXQncyBhbHdheXMganVzdFxuICAgICAgICAgICAgLy8gXCJbb2JqZWN0IFByb21pc2VdXFxuXCIsIGFzIHBlciB0aGUgYHRvU3RyaW5nYC5cbiAgICAgICAgICAgIHByb21pc2Uuc3RhY2sgPSBlLnN0YWNrLnN1YnN0cmluZyhlLnN0YWNrLmluZGV4T2YoXCJcXG5cIikgKyAxKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIE5PVEU6IHdlIGRvIHRoZSBjaGVja3MgZm9yIGByZXNvbHZlZFByb21pc2VgIGluIGVhY2ggbWV0aG9kLCBpbnN0ZWFkIG9mXG4gICAgLy8gY29uc29saWRhdGluZyB0aGVtIGludG8gYGJlY29tZWAsIHNpbmNlIG90aGVyd2lzZSB3ZSdkIGNyZWF0ZSBuZXdcbiAgICAvLyBwcm9taXNlcyB3aXRoIHRoZSBsaW5lcyBgYmVjb21lKHdoYXRldmVyKHZhbHVlKSlgLiBTZWUgZS5nLiBHSC0yNTIuXG5cbiAgICBmdW5jdGlvbiBiZWNvbWUobmV3UHJvbWlzZSkge1xuICAgICAgICByZXNvbHZlZFByb21pc2UgPSBuZXdQcm9taXNlO1xuICAgICAgICBwcm9taXNlLnNvdXJjZSA9IG5ld1Byb21pc2U7XG5cbiAgICAgICAgYXJyYXlfcmVkdWNlKG1lc3NhZ2VzLCBmdW5jdGlvbiAodW5kZWZpbmVkLCBtZXNzYWdlKSB7XG4gICAgICAgICAgICBRLm5leHRUaWNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBuZXdQcm9taXNlLnByb21pc2VEaXNwYXRjaC5hcHBseShuZXdQcm9taXNlLCBtZXNzYWdlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LCB2b2lkIDApO1xuXG4gICAgICAgIG1lc3NhZ2VzID0gdm9pZCAwO1xuICAgICAgICBwcm9ncmVzc0xpc3RlbmVycyA9IHZvaWQgMDtcbiAgICB9XG5cbiAgICBkZWZlcnJlZC5wcm9taXNlID0gcHJvbWlzZTtcbiAgICBkZWZlcnJlZC5yZXNvbHZlID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIGlmIChyZXNvbHZlZFByb21pc2UpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGJlY29tZShRKHZhbHVlKSk7XG4gICAgfTtcblxuICAgIGRlZmVycmVkLmZ1bGZpbGwgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgaWYgKHJlc29sdmVkUHJvbWlzZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgYmVjb21lKGZ1bGZpbGwodmFsdWUpKTtcbiAgICB9O1xuICAgIGRlZmVycmVkLnJlamVjdCA9IGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgICAgaWYgKHJlc29sdmVkUHJvbWlzZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgYmVjb21lKHJlamVjdChyZWFzb24pKTtcbiAgICB9O1xuICAgIGRlZmVycmVkLm5vdGlmeSA9IGZ1bmN0aW9uIChwcm9ncmVzcykge1xuICAgICAgICBpZiAocmVzb2x2ZWRQcm9taXNlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBhcnJheV9yZWR1Y2UocHJvZ3Jlc3NMaXN0ZW5lcnMsIGZ1bmN0aW9uICh1bmRlZmluZWQsIHByb2dyZXNzTGlzdGVuZXIpIHtcbiAgICAgICAgICAgIFEubmV4dFRpY2soZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHByb2dyZXNzTGlzdGVuZXIocHJvZ3Jlc3MpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sIHZvaWQgMCk7XG4gICAgfTtcblxuICAgIHJldHVybiBkZWZlcnJlZDtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgTm9kZS1zdHlsZSBjYWxsYmFjayB0aGF0IHdpbGwgcmVzb2x2ZSBvciByZWplY3QgdGhlIGRlZmVycmVkXG4gKiBwcm9taXNlLlxuICogQHJldHVybnMgYSBub2RlYmFja1xuICovXG5kZWZlci5wcm90b3R5cGUubWFrZU5vZGVSZXNvbHZlciA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChlcnJvciwgdmFsdWUpIHtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICBzZWxmLnJlamVjdChlcnJvcik7XG4gICAgICAgIH0gZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDIpIHtcbiAgICAgICAgICAgIHNlbGYucmVzb2x2ZShhcnJheV9zbGljZShhcmd1bWVudHMsIDEpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNlbGYucmVzb2x2ZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9O1xufTtcblxuLyoqXG4gKiBAcGFyYW0gcmVzb2x2ZXIge0Z1bmN0aW9ufSBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBub3RoaW5nIGFuZCBhY2NlcHRzXG4gKiB0aGUgcmVzb2x2ZSwgcmVqZWN0LCBhbmQgbm90aWZ5IGZ1bmN0aW9ucyBmb3IgYSBkZWZlcnJlZC5cbiAqIEByZXR1cm5zIGEgcHJvbWlzZSB0aGF0IG1heSBiZSByZXNvbHZlZCB3aXRoIHRoZSBnaXZlbiByZXNvbHZlIGFuZCByZWplY3RcbiAqIGZ1bmN0aW9ucywgb3IgcmVqZWN0ZWQgYnkgYSB0aHJvd24gZXhjZXB0aW9uIGluIHJlc29sdmVyXG4gKi9cblEuUHJvbWlzZSA9IHByb21pc2U7IC8vIEVTNlxuUS5wcm9taXNlID0gcHJvbWlzZTtcbmZ1bmN0aW9uIHByb21pc2UocmVzb2x2ZXIpIHtcbiAgICBpZiAodHlwZW9mIHJlc29sdmVyICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcInJlc29sdmVyIG11c3QgYmUgYSBmdW5jdGlvbi5cIik7XG4gICAgfVxuICAgIHZhciBkZWZlcnJlZCA9IGRlZmVyKCk7XG4gICAgdHJ5IHtcbiAgICAgICAgcmVzb2x2ZXIoZGVmZXJyZWQucmVzb2x2ZSwgZGVmZXJyZWQucmVqZWN0LCBkZWZlcnJlZC5ub3RpZnkpO1xuICAgIH0gY2F0Y2ggKHJlYXNvbikge1xuICAgICAgICBkZWZlcnJlZC5yZWplY3QocmVhc29uKTtcbiAgICB9XG4gICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2U7XG59XG5cbnByb21pc2UucmFjZSA9IHJhY2U7IC8vIEVTNlxucHJvbWlzZS5hbGwgPSBhbGw7IC8vIEVTNlxucHJvbWlzZS5yZWplY3QgPSByZWplY3Q7IC8vIEVTNlxucHJvbWlzZS5yZXNvbHZlID0gUTsgLy8gRVM2XG5cbi8vIFhYWCBleHBlcmltZW50YWwuICBUaGlzIG1ldGhvZCBpcyBhIHdheSB0byBkZW5vdGUgdGhhdCBhIGxvY2FsIHZhbHVlIGlzXG4vLyBzZXJpYWxpemFibGUgYW5kIHNob3VsZCBiZSBpbW1lZGlhdGVseSBkaXNwYXRjaGVkIHRvIGEgcmVtb3RlIHVwb24gcmVxdWVzdCxcbi8vIGluc3RlYWQgb2YgcGFzc2luZyBhIHJlZmVyZW5jZS5cblEucGFzc0J5Q29weSA9IGZ1bmN0aW9uIChvYmplY3QpIHtcbiAgICAvL2ZyZWV6ZShvYmplY3QpO1xuICAgIC8vcGFzc0J5Q29waWVzLnNldChvYmplY3QsIHRydWUpO1xuICAgIHJldHVybiBvYmplY3Q7XG59O1xuXG5Qcm9taXNlLnByb3RvdHlwZS5wYXNzQnlDb3B5ID0gZnVuY3Rpb24gKCkge1xuICAgIC8vZnJlZXplKG9iamVjdCk7XG4gICAgLy9wYXNzQnlDb3BpZXMuc2V0KG9iamVjdCwgdHJ1ZSk7XG4gICAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIElmIHR3byBwcm9taXNlcyBldmVudHVhbGx5IGZ1bGZpbGwgdG8gdGhlIHNhbWUgdmFsdWUsIHByb21pc2VzIHRoYXQgdmFsdWUsXG4gKiBidXQgb3RoZXJ3aXNlIHJlamVjdHMuXG4gKiBAcGFyYW0geCB7QW55Kn1cbiAqIEBwYXJhbSB5IHtBbnkqfVxuICogQHJldHVybnMge0FueSp9IGEgcHJvbWlzZSBmb3IgeCBhbmQgeSBpZiB0aGV5IGFyZSB0aGUgc2FtZSwgYnV0IGEgcmVqZWN0aW9uXG4gKiBvdGhlcndpc2UuXG4gKlxuICovXG5RLmpvaW4gPSBmdW5jdGlvbiAoeCwgeSkge1xuICAgIHJldHVybiBRKHgpLmpvaW4oeSk7XG59O1xuXG5Qcm9taXNlLnByb3RvdHlwZS5qb2luID0gZnVuY3Rpb24gKHRoYXQpIHtcbiAgICByZXR1cm4gUShbdGhpcywgdGhhdF0pLnNwcmVhZChmdW5jdGlvbiAoeCwgeSkge1xuICAgICAgICBpZiAoeCA9PT0geSkge1xuICAgICAgICAgICAgLy8gVE9ETzogXCI9PT1cIiBzaG91bGQgYmUgT2JqZWN0LmlzIG9yIGVxdWl2XG4gICAgICAgICAgICByZXR1cm4geDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbid0IGpvaW46IG5vdCB0aGUgc2FtZTogXCIgKyB4ICsgXCIgXCIgKyB5KTtcbiAgICAgICAgfVxuICAgIH0pO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIGEgcHJvbWlzZSBmb3IgdGhlIGZpcnN0IG9mIGFuIGFycmF5IG9mIHByb21pc2VzIHRvIGJlY29tZSBzZXR0bGVkLlxuICogQHBhcmFtIGFuc3dlcnMge0FycmF5W0FueSpdfSBwcm9taXNlcyB0byByYWNlXG4gKiBAcmV0dXJucyB7QW55Kn0gdGhlIGZpcnN0IHByb21pc2UgdG8gYmUgc2V0dGxlZFxuICovXG5RLnJhY2UgPSByYWNlO1xuZnVuY3Rpb24gcmFjZShhbnN3ZXJQcykge1xuICAgIHJldHVybiBwcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgLy8gU3dpdGNoIHRvIHRoaXMgb25jZSB3ZSBjYW4gYXNzdW1lIGF0IGxlYXN0IEVTNVxuICAgICAgICAvLyBhbnN3ZXJQcy5mb3JFYWNoKGZ1bmN0aW9uIChhbnN3ZXJQKSB7XG4gICAgICAgIC8vICAgICBRKGFuc3dlclApLnRoZW4ocmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgLy8gfSk7XG4gICAgICAgIC8vIFVzZSB0aGlzIGluIHRoZSBtZWFudGltZVxuICAgICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gYW5zd2VyUHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIFEoYW5zd2VyUHNbaV0pLnRoZW4ocmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuXG5Qcm9taXNlLnByb3RvdHlwZS5yYWNlID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLnRoZW4oUS5yYWNlKTtcbn07XG5cbi8qKlxuICogQ29uc3RydWN0cyBhIFByb21pc2Ugd2l0aCBhIHByb21pc2UgZGVzY3JpcHRvciBvYmplY3QgYW5kIG9wdGlvbmFsIGZhbGxiYWNrXG4gKiBmdW5jdGlvbi4gIFRoZSBkZXNjcmlwdG9yIGNvbnRhaW5zIG1ldGhvZHMgbGlrZSB3aGVuKHJlamVjdGVkKSwgZ2V0KG5hbWUpLFxuICogc2V0KG5hbWUsIHZhbHVlKSwgcG9zdChuYW1lLCBhcmdzKSwgYW5kIGRlbGV0ZShuYW1lKSwgd2hpY2ggYWxsXG4gKiByZXR1cm4gZWl0aGVyIGEgdmFsdWUsIGEgcHJvbWlzZSBmb3IgYSB2YWx1ZSwgb3IgYSByZWplY3Rpb24uICBUaGUgZmFsbGJhY2tcbiAqIGFjY2VwdHMgdGhlIG9wZXJhdGlvbiBuYW1lLCBhIHJlc29sdmVyLCBhbmQgYW55IGZ1cnRoZXIgYXJndW1lbnRzIHRoYXQgd291bGRcbiAqIGhhdmUgYmVlbiBmb3J3YXJkZWQgdG8gdGhlIGFwcHJvcHJpYXRlIG1ldGhvZCBhYm92ZSBoYWQgYSBtZXRob2QgYmVlblxuICogcHJvdmlkZWQgd2l0aCB0aGUgcHJvcGVyIG5hbWUuICBUaGUgQVBJIG1ha2VzIG5vIGd1YXJhbnRlZXMgYWJvdXQgdGhlIG5hdHVyZVxuICogb2YgdGhlIHJldHVybmVkIG9iamVjdCwgYXBhcnQgZnJvbSB0aGF0IGl0IGlzIHVzYWJsZSB3aGVyZWV2ZXIgcHJvbWlzZXMgYXJlXG4gKiBib3VnaHQgYW5kIHNvbGQuXG4gKi9cblEubWFrZVByb21pc2UgPSBQcm9taXNlO1xuZnVuY3Rpb24gUHJvbWlzZShkZXNjcmlwdG9yLCBmYWxsYmFjaywgaW5zcGVjdCkge1xuICAgIGlmIChmYWxsYmFjayA9PT0gdm9pZCAwKSB7XG4gICAgICAgIGZhbGxiYWNrID0gZnVuY3Rpb24gKG9wKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVqZWN0KG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICBcIlByb21pc2UgZG9lcyBub3Qgc3VwcG9ydCBvcGVyYXRpb246IFwiICsgb3BcbiAgICAgICAgICAgICkpO1xuICAgICAgICB9O1xuICAgIH1cbiAgICBpZiAoaW5zcGVjdCA9PT0gdm9pZCAwKSB7XG4gICAgICAgIGluc3BlY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4ge3N0YXRlOiBcInVua25vd25cIn07XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIHByb21pc2UgPSBvYmplY3RfY3JlYXRlKFByb21pc2UucHJvdG90eXBlKTtcblxuICAgIHByb21pc2UucHJvbWlzZURpc3BhdGNoID0gZnVuY3Rpb24gKHJlc29sdmUsIG9wLCBhcmdzKSB7XG4gICAgICAgIHZhciByZXN1bHQ7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoZGVzY3JpcHRvcltvcF0pIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBkZXNjcmlwdG9yW29wXS5hcHBseShwcm9taXNlLCBhcmdzKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gZmFsbGJhY2suY2FsbChwcm9taXNlLCBvcCwgYXJncyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGV4Y2VwdGlvbikge1xuICAgICAgICAgICAgcmVzdWx0ID0gcmVqZWN0KGV4Y2VwdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc29sdmUpIHtcbiAgICAgICAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBwcm9taXNlLmluc3BlY3QgPSBpbnNwZWN0O1xuXG4gICAgLy8gWFhYIGRlcHJlY2F0ZWQgYHZhbHVlT2ZgIGFuZCBgZXhjZXB0aW9uYCBzdXBwb3J0XG4gICAgaWYgKGluc3BlY3QpIHtcbiAgICAgICAgdmFyIGluc3BlY3RlZCA9IGluc3BlY3QoKTtcbiAgICAgICAgaWYgKGluc3BlY3RlZC5zdGF0ZSA9PT0gXCJyZWplY3RlZFwiKSB7XG4gICAgICAgICAgICBwcm9taXNlLmV4Y2VwdGlvbiA9IGluc3BlY3RlZC5yZWFzb247XG4gICAgICAgIH1cblxuICAgICAgICBwcm9taXNlLnZhbHVlT2YgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgaW5zcGVjdGVkID0gaW5zcGVjdCgpO1xuICAgICAgICAgICAgaWYgKGluc3BlY3RlZC5zdGF0ZSA9PT0gXCJwZW5kaW5nXCIgfHxcbiAgICAgICAgICAgICAgICBpbnNwZWN0ZWQuc3RhdGUgPT09IFwicmVqZWN0ZWRcIikge1xuICAgICAgICAgICAgICAgIHJldHVybiBwcm9taXNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGluc3BlY3RlZC52YWx1ZTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gcHJvbWlzZTtcbn1cblxuUHJvbWlzZS5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIFwiW29iamVjdCBQcm9taXNlXVwiO1xufTtcblxuUHJvbWlzZS5wcm90b3R5cGUudGhlbiA9IGZ1bmN0aW9uIChmdWxmaWxsZWQsIHJlamVjdGVkLCBwcm9ncmVzc2VkKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciBkZWZlcnJlZCA9IGRlZmVyKCk7XG4gICAgdmFyIGRvbmUgPSBmYWxzZTsgICAvLyBlbnN1cmUgdGhlIHVudHJ1c3RlZCBwcm9taXNlIG1ha2VzIGF0IG1vc3QgYVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2luZ2xlIGNhbGwgdG8gb25lIG9mIHRoZSBjYWxsYmFja3NcblxuICAgIGZ1bmN0aW9uIF9mdWxmaWxsZWQodmFsdWUpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiB0eXBlb2YgZnVsZmlsbGVkID09PSBcImZ1bmN0aW9uXCIgPyBmdWxmaWxsZWQodmFsdWUpIDogdmFsdWU7XG4gICAgICAgIH0gY2F0Y2ggKGV4Y2VwdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuIHJlamVjdChleGNlcHRpb24pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gX3JlamVjdGVkKGV4Y2VwdGlvbikge1xuICAgICAgICBpZiAodHlwZW9mIHJlamVjdGVkID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIG1ha2VTdGFja1RyYWNlTG9uZyhleGNlcHRpb24sIHNlbGYpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVqZWN0ZWQoZXhjZXB0aW9uKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKG5ld0V4Y2VwdGlvbikge1xuICAgICAgICAgICAgICAgIHJldHVybiByZWplY3QobmV3RXhjZXB0aW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVqZWN0KGV4Y2VwdGlvbik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gX3Byb2dyZXNzZWQodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBwcm9ncmVzc2VkID09PSBcImZ1bmN0aW9uXCIgPyBwcm9ncmVzc2VkKHZhbHVlKSA6IHZhbHVlO1xuICAgIH1cblxuICAgIFEubmV4dFRpY2soZnVuY3Rpb24gKCkge1xuICAgICAgICBzZWxmLnByb21pc2VEaXNwYXRjaChmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIGlmIChkb25lKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZG9uZSA9IHRydWU7XG5cbiAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUoX2Z1bGZpbGxlZCh2YWx1ZSkpO1xuICAgICAgICB9LCBcIndoZW5cIiwgW2Z1bmN0aW9uIChleGNlcHRpb24pIHtcbiAgICAgICAgICAgIGlmIChkb25lKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZG9uZSA9IHRydWU7XG5cbiAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUoX3JlamVjdGVkKGV4Y2VwdGlvbikpO1xuICAgICAgICB9XSk7XG4gICAgfSk7XG5cbiAgICAvLyBQcm9ncmVzcyBwcm9wYWdhdG9yIG5lZWQgdG8gYmUgYXR0YWNoZWQgaW4gdGhlIGN1cnJlbnQgdGljay5cbiAgICBzZWxmLnByb21pc2VEaXNwYXRjaCh2b2lkIDAsIFwid2hlblwiLCBbdm9pZCAwLCBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdmFyIG5ld1ZhbHVlO1xuICAgICAgICB2YXIgdGhyZXcgPSBmYWxzZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIG5ld1ZhbHVlID0gX3Byb2dyZXNzZWQodmFsdWUpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aHJldyA9IHRydWU7XG4gICAgICAgICAgICBpZiAoUS5vbmVycm9yKSB7XG4gICAgICAgICAgICAgICAgUS5vbmVycm9yKGUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aHJldykge1xuICAgICAgICAgICAgZGVmZXJyZWQubm90aWZ5KG5ld1ZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1dKTtcblxuICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlO1xufTtcblxuUS50YXAgPSBmdW5jdGlvbiAocHJvbWlzZSwgY2FsbGJhY2spIHtcbiAgICByZXR1cm4gUShwcm9taXNlKS50YXAoY2FsbGJhY2spO1xufTtcblxuLyoqXG4gKiBXb3JrcyBhbG1vc3QgbGlrZSBcImZpbmFsbHlcIiwgYnV0IG5vdCBjYWxsZWQgZm9yIHJlamVjdGlvbnMuXG4gKiBPcmlnaW5hbCByZXNvbHV0aW9uIHZhbHVlIGlzIHBhc3NlZCB0aHJvdWdoIGNhbGxiYWNrIHVuYWZmZWN0ZWQuXG4gKiBDYWxsYmFjayBtYXkgcmV0dXJuIGEgcHJvbWlzZSB0aGF0IHdpbGwgYmUgYXdhaXRlZCBmb3IuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICogQHJldHVybnMge1EuUHJvbWlzZX1cbiAqIEBleGFtcGxlXG4gKiBkb1NvbWV0aGluZygpXG4gKiAgIC50aGVuKC4uLilcbiAqICAgLnRhcChjb25zb2xlLmxvZylcbiAqICAgLnRoZW4oLi4uKTtcbiAqL1xuUHJvbWlzZS5wcm90b3R5cGUudGFwID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgY2FsbGJhY2sgPSBRKGNhbGxiYWNrKTtcblxuICAgIHJldHVybiB0aGlzLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBjYWxsYmFjay5mY2FsbCh2YWx1ZSkudGhlblJlc29sdmUodmFsdWUpO1xuICAgIH0pO1xufTtcblxuLyoqXG4gKiBSZWdpc3RlcnMgYW4gb2JzZXJ2ZXIgb24gYSBwcm9taXNlLlxuICpcbiAqIEd1YXJhbnRlZXM6XG4gKlxuICogMS4gdGhhdCBmdWxmaWxsZWQgYW5kIHJlamVjdGVkIHdpbGwgYmUgY2FsbGVkIG9ubHkgb25jZS5cbiAqIDIuIHRoYXQgZWl0aGVyIHRoZSBmdWxmaWxsZWQgY2FsbGJhY2sgb3IgdGhlIHJlamVjdGVkIGNhbGxiYWNrIHdpbGwgYmVcbiAqICAgIGNhbGxlZCwgYnV0IG5vdCBib3RoLlxuICogMy4gdGhhdCBmdWxmaWxsZWQgYW5kIHJlamVjdGVkIHdpbGwgbm90IGJlIGNhbGxlZCBpbiB0aGlzIHR1cm4uXG4gKlxuICogQHBhcmFtIHZhbHVlICAgICAgcHJvbWlzZSBvciBpbW1lZGlhdGUgcmVmZXJlbmNlIHRvIG9ic2VydmVcbiAqIEBwYXJhbSBmdWxmaWxsZWQgIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB3aXRoIHRoZSBmdWxmaWxsZWQgdmFsdWVcbiAqIEBwYXJhbSByZWplY3RlZCAgIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB3aXRoIHRoZSByZWplY3Rpb24gZXhjZXB0aW9uXG4gKiBAcGFyYW0gcHJvZ3Jlc3NlZCBmdW5jdGlvbiB0byBiZSBjYWxsZWQgb24gYW55IHByb2dyZXNzIG5vdGlmaWNhdGlvbnNcbiAqIEByZXR1cm4gcHJvbWlzZSBmb3IgdGhlIHJldHVybiB2YWx1ZSBmcm9tIHRoZSBpbnZva2VkIGNhbGxiYWNrXG4gKi9cblEud2hlbiA9IHdoZW47XG5mdW5jdGlvbiB3aGVuKHZhbHVlLCBmdWxmaWxsZWQsIHJlamVjdGVkLCBwcm9ncmVzc2VkKSB7XG4gICAgcmV0dXJuIFEodmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCwgcHJvZ3Jlc3NlZCk7XG59XG5cblByb21pc2UucHJvdG90eXBlLnRoZW5SZXNvbHZlID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgcmV0dXJuIHRoaXMudGhlbihmdW5jdGlvbiAoKSB7IHJldHVybiB2YWx1ZTsgfSk7XG59O1xuXG5RLnRoZW5SZXNvbHZlID0gZnVuY3Rpb24gKHByb21pc2UsIHZhbHVlKSB7XG4gICAgcmV0dXJuIFEocHJvbWlzZSkudGhlblJlc29sdmUodmFsdWUpO1xufTtcblxuUHJvbWlzZS5wcm90b3R5cGUudGhlblJlamVjdCA9IGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICByZXR1cm4gdGhpcy50aGVuKGZ1bmN0aW9uICgpIHsgdGhyb3cgcmVhc29uOyB9KTtcbn07XG5cblEudGhlblJlamVjdCA9IGZ1bmN0aW9uIChwcm9taXNlLCByZWFzb24pIHtcbiAgICByZXR1cm4gUShwcm9taXNlKS50aGVuUmVqZWN0KHJlYXNvbik7XG59O1xuXG4vKipcbiAqIElmIGFuIG9iamVjdCBpcyBub3QgYSBwcm9taXNlLCBpdCBpcyBhcyBcIm5lYXJcIiBhcyBwb3NzaWJsZS5cbiAqIElmIGEgcHJvbWlzZSBpcyByZWplY3RlZCwgaXQgaXMgYXMgXCJuZWFyXCIgYXMgcG9zc2libGUgdG9vLlxuICogSWYgaXTigJlzIGEgZnVsZmlsbGVkIHByb21pc2UsIHRoZSBmdWxmaWxsbWVudCB2YWx1ZSBpcyBuZWFyZXIuXG4gKiBJZiBpdOKAmXMgYSBkZWZlcnJlZCBwcm9taXNlIGFuZCB0aGUgZGVmZXJyZWQgaGFzIGJlZW4gcmVzb2x2ZWQsIHRoZVxuICogcmVzb2x1dGlvbiBpcyBcIm5lYXJlclwiLlxuICogQHBhcmFtIG9iamVjdFxuICogQHJldHVybnMgbW9zdCByZXNvbHZlZCAobmVhcmVzdCkgZm9ybSBvZiB0aGUgb2JqZWN0XG4gKi9cblxuLy8gWFhYIHNob3VsZCB3ZSByZS1kbyB0aGlzP1xuUS5uZWFyZXIgPSBuZWFyZXI7XG5mdW5jdGlvbiBuZWFyZXIodmFsdWUpIHtcbiAgICBpZiAoaXNQcm9taXNlKHZhbHVlKSkge1xuICAgICAgICB2YXIgaW5zcGVjdGVkID0gdmFsdWUuaW5zcGVjdCgpO1xuICAgICAgICBpZiAoaW5zcGVjdGVkLnN0YXRlID09PSBcImZ1bGZpbGxlZFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gaW5zcGVjdGVkLnZhbHVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbn1cblxuLyoqXG4gKiBAcmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBvYmplY3QgaXMgYSBwcm9taXNlLlxuICogT3RoZXJ3aXNlIGl0IGlzIGEgZnVsZmlsbGVkIHZhbHVlLlxuICovXG5RLmlzUHJvbWlzZSA9IGlzUHJvbWlzZTtcbmZ1bmN0aW9uIGlzUHJvbWlzZShvYmplY3QpIHtcbiAgICByZXR1cm4gb2JqZWN0IGluc3RhbmNlb2YgUHJvbWlzZTtcbn1cblxuUS5pc1Byb21pc2VBbGlrZSA9IGlzUHJvbWlzZUFsaWtlO1xuZnVuY3Rpb24gaXNQcm9taXNlQWxpa2Uob2JqZWN0KSB7XG4gICAgcmV0dXJuIGlzT2JqZWN0KG9iamVjdCkgJiYgdHlwZW9mIG9iamVjdC50aGVuID09PSBcImZ1bmN0aW9uXCI7XG59XG5cbi8qKlxuICogQHJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gb2JqZWN0IGlzIGEgcGVuZGluZyBwcm9taXNlLCBtZWFuaW5nIG5vdFxuICogZnVsZmlsbGVkIG9yIHJlamVjdGVkLlxuICovXG5RLmlzUGVuZGluZyA9IGlzUGVuZGluZztcbmZ1bmN0aW9uIGlzUGVuZGluZyhvYmplY3QpIHtcbiAgICByZXR1cm4gaXNQcm9taXNlKG9iamVjdCkgJiYgb2JqZWN0Lmluc3BlY3QoKS5zdGF0ZSA9PT0gXCJwZW5kaW5nXCI7XG59XG5cblByb21pc2UucHJvdG90eXBlLmlzUGVuZGluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5pbnNwZWN0KCkuc3RhdGUgPT09IFwicGVuZGluZ1wiO1xufTtcblxuLyoqXG4gKiBAcmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBvYmplY3QgaXMgYSB2YWx1ZSBvciBmdWxmaWxsZWRcbiAqIHByb21pc2UuXG4gKi9cblEuaXNGdWxmaWxsZWQgPSBpc0Z1bGZpbGxlZDtcbmZ1bmN0aW9uIGlzRnVsZmlsbGVkKG9iamVjdCkge1xuICAgIHJldHVybiAhaXNQcm9taXNlKG9iamVjdCkgfHwgb2JqZWN0Lmluc3BlY3QoKS5zdGF0ZSA9PT0gXCJmdWxmaWxsZWRcIjtcbn1cblxuUHJvbWlzZS5wcm90b3R5cGUuaXNGdWxmaWxsZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuaW5zcGVjdCgpLnN0YXRlID09PSBcImZ1bGZpbGxlZFwiO1xufTtcblxuLyoqXG4gKiBAcmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBvYmplY3QgaXMgYSByZWplY3RlZCBwcm9taXNlLlxuICovXG5RLmlzUmVqZWN0ZWQgPSBpc1JlamVjdGVkO1xuZnVuY3Rpb24gaXNSZWplY3RlZChvYmplY3QpIHtcbiAgICByZXR1cm4gaXNQcm9taXNlKG9iamVjdCkgJiYgb2JqZWN0Lmluc3BlY3QoKS5zdGF0ZSA9PT0gXCJyZWplY3RlZFwiO1xufVxuXG5Qcm9taXNlLnByb3RvdHlwZS5pc1JlamVjdGVkID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLmluc3BlY3QoKS5zdGF0ZSA9PT0gXCJyZWplY3RlZFwiO1xufTtcblxuLy8vLyBCRUdJTiBVTkhBTkRMRUQgUkVKRUNUSU9OIFRSQUNLSU5HXG5cbi8vIFRoaXMgcHJvbWlzZSBsaWJyYXJ5IGNvbnN1bWVzIGV4Y2VwdGlvbnMgdGhyb3duIGluIGhhbmRsZXJzIHNvIHRoZXkgY2FuIGJlXG4vLyBoYW5kbGVkIGJ5IGEgc3Vic2VxdWVudCBwcm9taXNlLiAgVGhlIGV4Y2VwdGlvbnMgZ2V0IGFkZGVkIHRvIHRoaXMgYXJyYXkgd2hlblxuLy8gdGhleSBhcmUgY3JlYXRlZCwgYW5kIHJlbW92ZWQgd2hlbiB0aGV5IGFyZSBoYW5kbGVkLiAgTm90ZSB0aGF0IGluIEVTNiBvclxuLy8gc2hpbW1lZCBlbnZpcm9ubWVudHMsIHRoaXMgd291bGQgbmF0dXJhbGx5IGJlIGEgYFNldGAuXG52YXIgdW5oYW5kbGVkUmVhc29ucyA9IFtdO1xudmFyIHVuaGFuZGxlZFJlamVjdGlvbnMgPSBbXTtcbnZhciByZXBvcnRlZFVuaGFuZGxlZFJlamVjdGlvbnMgPSBbXTtcbnZhciB0cmFja1VuaGFuZGxlZFJlamVjdGlvbnMgPSB0cnVlO1xuXG5mdW5jdGlvbiByZXNldFVuaGFuZGxlZFJlamVjdGlvbnMoKSB7XG4gICAgdW5oYW5kbGVkUmVhc29ucy5sZW5ndGggPSAwO1xuICAgIHVuaGFuZGxlZFJlamVjdGlvbnMubGVuZ3RoID0gMDtcblxuICAgIGlmICghdHJhY2tVbmhhbmRsZWRSZWplY3Rpb25zKSB7XG4gICAgICAgIHRyYWNrVW5oYW5kbGVkUmVqZWN0aW9ucyA9IHRydWU7XG4gICAgfVxufVxuXG5mdW5jdGlvbiB0cmFja1JlamVjdGlvbihwcm9taXNlLCByZWFzb24pIHtcbiAgICBpZiAoIXRyYWNrVW5oYW5kbGVkUmVqZWN0aW9ucykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0eXBlb2YgcHJvY2VzcyA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgcHJvY2Vzcy5lbWl0ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgUS5uZXh0VGljay5ydW5BZnRlcihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoYXJyYXlfaW5kZXhPZih1bmhhbmRsZWRSZWplY3Rpb25zLCBwcm9taXNlKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICBwcm9jZXNzLmVtaXQoXCJ1bmhhbmRsZWRSZWplY3Rpb25cIiwgcmVhc29uLCBwcm9taXNlKTtcbiAgICAgICAgICAgICAgICByZXBvcnRlZFVuaGFuZGxlZFJlamVjdGlvbnMucHVzaChwcm9taXNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgdW5oYW5kbGVkUmVqZWN0aW9ucy5wdXNoKHByb21pc2UpO1xuICAgIGlmIChyZWFzb24gJiYgdHlwZW9mIHJlYXNvbi5zdGFjayAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICB1bmhhbmRsZWRSZWFzb25zLnB1c2gocmVhc29uLnN0YWNrKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICB1bmhhbmRsZWRSZWFzb25zLnB1c2goXCIobm8gc3RhY2spIFwiICsgcmVhc29uKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHVudHJhY2tSZWplY3Rpb24ocHJvbWlzZSkge1xuICAgIGlmICghdHJhY2tVbmhhbmRsZWRSZWplY3Rpb25zKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgYXQgPSBhcnJheV9pbmRleE9mKHVuaGFuZGxlZFJlamVjdGlvbnMsIHByb21pc2UpO1xuICAgIGlmIChhdCAhPT0gLTEpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBwcm9jZXNzID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBwcm9jZXNzLmVtaXQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgUS5uZXh0VGljay5ydW5BZnRlcihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdmFyIGF0UmVwb3J0ID0gYXJyYXlfaW5kZXhPZihyZXBvcnRlZFVuaGFuZGxlZFJlamVjdGlvbnMsIHByb21pc2UpO1xuICAgICAgICAgICAgICAgIGlmIChhdFJlcG9ydCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcy5lbWl0KFwicmVqZWN0aW9uSGFuZGxlZFwiLCB1bmhhbmRsZWRSZWFzb25zW2F0XSwgcHJvbWlzZSk7XG4gICAgICAgICAgICAgICAgICAgIHJlcG9ydGVkVW5oYW5kbGVkUmVqZWN0aW9ucy5zcGxpY2UoYXRSZXBvcnQsIDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHVuaGFuZGxlZFJlamVjdGlvbnMuc3BsaWNlKGF0LCAxKTtcbiAgICAgICAgdW5oYW5kbGVkUmVhc29ucy5zcGxpY2UoYXQsIDEpO1xuICAgIH1cbn1cblxuUS5yZXNldFVuaGFuZGxlZFJlamVjdGlvbnMgPSByZXNldFVuaGFuZGxlZFJlamVjdGlvbnM7XG5cblEuZ2V0VW5oYW5kbGVkUmVhc29ucyA9IGZ1bmN0aW9uICgpIHtcbiAgICAvLyBNYWtlIGEgY29weSBzbyB0aGF0IGNvbnN1bWVycyBjYW4ndCBpbnRlcmZlcmUgd2l0aCBvdXIgaW50ZXJuYWwgc3RhdGUuXG4gICAgcmV0dXJuIHVuaGFuZGxlZFJlYXNvbnMuc2xpY2UoKTtcbn07XG5cblEuc3RvcFVuaGFuZGxlZFJlamVjdGlvblRyYWNraW5nID0gZnVuY3Rpb24gKCkge1xuICAgIHJlc2V0VW5oYW5kbGVkUmVqZWN0aW9ucygpO1xuICAgIHRyYWNrVW5oYW5kbGVkUmVqZWN0aW9ucyA9IGZhbHNlO1xufTtcblxucmVzZXRVbmhhbmRsZWRSZWplY3Rpb25zKCk7XG5cbi8vLy8gRU5EIFVOSEFORExFRCBSRUpFQ1RJT04gVFJBQ0tJTkdcblxuLyoqXG4gKiBDb25zdHJ1Y3RzIGEgcmVqZWN0ZWQgcHJvbWlzZS5cbiAqIEBwYXJhbSByZWFzb24gdmFsdWUgZGVzY3JpYmluZyB0aGUgZmFpbHVyZVxuICovXG5RLnJlamVjdCA9IHJlamVjdDtcbmZ1bmN0aW9uIHJlamVjdChyZWFzb24pIHtcbiAgICB2YXIgcmVqZWN0aW9uID0gUHJvbWlzZSh7XG4gICAgICAgIFwid2hlblwiOiBmdW5jdGlvbiAocmVqZWN0ZWQpIHtcbiAgICAgICAgICAgIC8vIG5vdGUgdGhhdCB0aGUgZXJyb3IgaGFzIGJlZW4gaGFuZGxlZFxuICAgICAgICAgICAgaWYgKHJlamVjdGVkKSB7XG4gICAgICAgICAgICAgICAgdW50cmFja1JlamVjdGlvbih0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZWplY3RlZCA/IHJlamVjdGVkKHJlYXNvbikgOiB0aGlzO1xuICAgICAgICB9XG4gICAgfSwgZnVuY3Rpb24gZmFsbGJhY2soKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sIGZ1bmN0aW9uIGluc3BlY3QoKSB7XG4gICAgICAgIHJldHVybiB7IHN0YXRlOiBcInJlamVjdGVkXCIsIHJlYXNvbjogcmVhc29uIH07XG4gICAgfSk7XG5cbiAgICAvLyBOb3RlIHRoYXQgdGhlIHJlYXNvbiBoYXMgbm90IGJlZW4gaGFuZGxlZC5cbiAgICB0cmFja1JlamVjdGlvbihyZWplY3Rpb24sIHJlYXNvbik7XG5cbiAgICByZXR1cm4gcmVqZWN0aW9uO1xufVxuXG4vKipcbiAqIENvbnN0cnVjdHMgYSBmdWxmaWxsZWQgcHJvbWlzZSBmb3IgYW4gaW1tZWRpYXRlIHJlZmVyZW5jZS5cbiAqIEBwYXJhbSB2YWx1ZSBpbW1lZGlhdGUgcmVmZXJlbmNlXG4gKi9cblEuZnVsZmlsbCA9IGZ1bGZpbGw7XG5mdW5jdGlvbiBmdWxmaWxsKHZhbHVlKSB7XG4gICAgcmV0dXJuIFByb21pc2Uoe1xuICAgICAgICBcIndoZW5cIjogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9LFxuICAgICAgICBcImdldFwiOiBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlW25hbWVdO1xuICAgICAgICB9LFxuICAgICAgICBcInNldFwiOiBmdW5jdGlvbiAobmFtZSwgcmhzKSB7XG4gICAgICAgICAgICB2YWx1ZVtuYW1lXSA9IHJocztcbiAgICAgICAgfSxcbiAgICAgICAgXCJkZWxldGVcIjogZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgICAgIGRlbGV0ZSB2YWx1ZVtuYW1lXTtcbiAgICAgICAgfSxcbiAgICAgICAgXCJwb3N0XCI6IGZ1bmN0aW9uIChuYW1lLCBhcmdzKSB7XG4gICAgICAgICAgICAvLyBNYXJrIE1pbGxlciBwcm9wb3NlcyB0aGF0IHBvc3Qgd2l0aCBubyBuYW1lIHNob3VsZCBhcHBseSBhXG4gICAgICAgICAgICAvLyBwcm9taXNlZCBmdW5jdGlvbi5cbiAgICAgICAgICAgIGlmIChuYW1lID09PSBudWxsIHx8IG5hbWUgPT09IHZvaWQgMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZS5hcHBseSh2b2lkIDAsIGFyZ3MpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWVbbmFtZV0uYXBwbHkodmFsdWUsIGFyZ3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcImFwcGx5XCI6IGZ1bmN0aW9uICh0aGlzcCwgYXJncykge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlLmFwcGx5KHRoaXNwLCBhcmdzKTtcbiAgICAgICAgfSxcbiAgICAgICAgXCJrZXlzXCI6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBvYmplY3Rfa2V5cyh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9LCB2b2lkIDAsIGZ1bmN0aW9uIGluc3BlY3QoKSB7XG4gICAgICAgIHJldHVybiB7IHN0YXRlOiBcImZ1bGZpbGxlZFwiLCB2YWx1ZTogdmFsdWUgfTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyB0aGVuYWJsZXMgdG8gUSBwcm9taXNlcy5cbiAqIEBwYXJhbSBwcm9taXNlIHRoZW5hYmxlIHByb21pc2VcbiAqIEByZXR1cm5zIGEgUSBwcm9taXNlXG4gKi9cbmZ1bmN0aW9uIGNvZXJjZShwcm9taXNlKSB7XG4gICAgdmFyIGRlZmVycmVkID0gZGVmZXIoKTtcbiAgICBRLm5leHRUaWNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHByb21pc2UudGhlbihkZWZlcnJlZC5yZXNvbHZlLCBkZWZlcnJlZC5yZWplY3QsIGRlZmVycmVkLm5vdGlmeSk7XG4gICAgICAgIH0gY2F0Y2ggKGV4Y2VwdGlvbikge1xuICAgICAgICAgICAgZGVmZXJyZWQucmVqZWN0KGV4Y2VwdGlvbik7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZTtcbn1cblxuLyoqXG4gKiBBbm5vdGF0ZXMgYW4gb2JqZWN0IHN1Y2ggdGhhdCBpdCB3aWxsIG5ldmVyIGJlXG4gKiB0cmFuc2ZlcnJlZCBhd2F5IGZyb20gdGhpcyBwcm9jZXNzIG92ZXIgYW55IHByb21pc2VcbiAqIGNvbW11bmljYXRpb24gY2hhbm5lbC5cbiAqIEBwYXJhbSBvYmplY3RcbiAqIEByZXR1cm5zIHByb21pc2UgYSB3cmFwcGluZyBvZiB0aGF0IG9iamVjdCB0aGF0XG4gKiBhZGRpdGlvbmFsbHkgcmVzcG9uZHMgdG8gdGhlIFwiaXNEZWZcIiBtZXNzYWdlXG4gKiB3aXRob3V0IGEgcmVqZWN0aW9uLlxuICovXG5RLm1hc3RlciA9IG1hc3RlcjtcbmZ1bmN0aW9uIG1hc3RlcihvYmplY3QpIHtcbiAgICByZXR1cm4gUHJvbWlzZSh7XG4gICAgICAgIFwiaXNEZWZcIjogZnVuY3Rpb24gKCkge31cbiAgICB9LCBmdW5jdGlvbiBmYWxsYmFjayhvcCwgYXJncykge1xuICAgICAgICByZXR1cm4gZGlzcGF0Y2gob2JqZWN0LCBvcCwgYXJncyk7XG4gICAgfSwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gUShvYmplY3QpLmluc3BlY3QoKTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBTcHJlYWRzIHRoZSB2YWx1ZXMgb2YgYSBwcm9taXNlZCBhcnJheSBvZiBhcmd1bWVudHMgaW50byB0aGVcbiAqIGZ1bGZpbGxtZW50IGNhbGxiYWNrLlxuICogQHBhcmFtIGZ1bGZpbGxlZCBjYWxsYmFjayB0aGF0IHJlY2VpdmVzIHZhcmlhZGljIGFyZ3VtZW50cyBmcm9tIHRoZVxuICogcHJvbWlzZWQgYXJyYXlcbiAqIEBwYXJhbSByZWplY3RlZCBjYWxsYmFjayB0aGF0IHJlY2VpdmVzIHRoZSBleGNlcHRpb24gaWYgdGhlIHByb21pc2VcbiAqIGlzIHJlamVjdGVkLlxuICogQHJldHVybnMgYSBwcm9taXNlIGZvciB0aGUgcmV0dXJuIHZhbHVlIG9yIHRocm93biBleGNlcHRpb24gb2ZcbiAqIGVpdGhlciBjYWxsYmFjay5cbiAqL1xuUS5zcHJlYWQgPSBzcHJlYWQ7XG5mdW5jdGlvbiBzcHJlYWQodmFsdWUsIGZ1bGZpbGxlZCwgcmVqZWN0ZWQpIHtcbiAgICByZXR1cm4gUSh2YWx1ZSkuc3ByZWFkKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpO1xufVxuXG5Qcm9taXNlLnByb3RvdHlwZS5zcHJlYWQgPSBmdW5jdGlvbiAoZnVsZmlsbGVkLCByZWplY3RlZCkge1xuICAgIHJldHVybiB0aGlzLmFsbCgpLnRoZW4oZnVuY3Rpb24gKGFycmF5KSB7XG4gICAgICAgIHJldHVybiBmdWxmaWxsZWQuYXBwbHkodm9pZCAwLCBhcnJheSk7XG4gICAgfSwgcmVqZWN0ZWQpO1xufTtcblxuLyoqXG4gKiBUaGUgYXN5bmMgZnVuY3Rpb24gaXMgYSBkZWNvcmF0b3IgZm9yIGdlbmVyYXRvciBmdW5jdGlvbnMsIHR1cm5pbmdcbiAqIHRoZW0gaW50byBhc3luY2hyb25vdXMgZ2VuZXJhdG9ycy4gIEFsdGhvdWdoIGdlbmVyYXRvcnMgYXJlIG9ubHkgcGFydFxuICogb2YgdGhlIG5ld2VzdCBFQ01BU2NyaXB0IDYgZHJhZnRzLCB0aGlzIGNvZGUgZG9lcyBub3QgY2F1c2Ugc3ludGF4XG4gKiBlcnJvcnMgaW4gb2xkZXIgZW5naW5lcy4gIFRoaXMgY29kZSBzaG91bGQgY29udGludWUgdG8gd29yayBhbmQgd2lsbFxuICogaW4gZmFjdCBpbXByb3ZlIG92ZXIgdGltZSBhcyB0aGUgbGFuZ3VhZ2UgaW1wcm92ZXMuXG4gKlxuICogRVM2IGdlbmVyYXRvcnMgYXJlIGN1cnJlbnRseSBwYXJ0IG9mIFY4IHZlcnNpb24gMy4xOSB3aXRoIHRoZVxuICogLS1oYXJtb255LWdlbmVyYXRvcnMgcnVudGltZSBmbGFnIGVuYWJsZWQuICBTcGlkZXJNb25rZXkgaGFzIGhhZCB0aGVtXG4gKiBmb3IgbG9uZ2VyLCBidXQgdW5kZXIgYW4gb2xkZXIgUHl0aG9uLWluc3BpcmVkIGZvcm0uICBUaGlzIGZ1bmN0aW9uXG4gKiB3b3JrcyBvbiBib3RoIGtpbmRzIG9mIGdlbmVyYXRvcnMuXG4gKlxuICogRGVjb3JhdGVzIGEgZ2VuZXJhdG9yIGZ1bmN0aW9uIHN1Y2ggdGhhdDpcbiAqICAtIGl0IG1heSB5aWVsZCBwcm9taXNlc1xuICogIC0gZXhlY3V0aW9uIHdpbGwgY29udGludWUgd2hlbiB0aGF0IHByb21pc2UgaXMgZnVsZmlsbGVkXG4gKiAgLSB0aGUgdmFsdWUgb2YgdGhlIHlpZWxkIGV4cHJlc3Npb24gd2lsbCBiZSB0aGUgZnVsZmlsbGVkIHZhbHVlXG4gKiAgLSBpdCByZXR1cm5zIGEgcHJvbWlzZSBmb3IgdGhlIHJldHVybiB2YWx1ZSAod2hlbiB0aGUgZ2VuZXJhdG9yXG4gKiAgICBzdG9wcyBpdGVyYXRpbmcpXG4gKiAgLSB0aGUgZGVjb3JhdGVkIGZ1bmN0aW9uIHJldHVybnMgYSBwcm9taXNlIGZvciB0aGUgcmV0dXJuIHZhbHVlXG4gKiAgICBvZiB0aGUgZ2VuZXJhdG9yIG9yIHRoZSBmaXJzdCByZWplY3RlZCBwcm9taXNlIGFtb25nIHRob3NlXG4gKiAgICB5aWVsZGVkLlxuICogIC0gaWYgYW4gZXJyb3IgaXMgdGhyb3duIGluIHRoZSBnZW5lcmF0b3IsIGl0IHByb3BhZ2F0ZXMgdGhyb3VnaFxuICogICAgZXZlcnkgZm9sbG93aW5nIHlpZWxkIHVudGlsIGl0IGlzIGNhdWdodCwgb3IgdW50aWwgaXQgZXNjYXBlc1xuICogICAgdGhlIGdlbmVyYXRvciBmdW5jdGlvbiBhbHRvZ2V0aGVyLCBhbmQgaXMgdHJhbnNsYXRlZCBpbnRvIGFcbiAqICAgIHJlamVjdGlvbiBmb3IgdGhlIHByb21pc2UgcmV0dXJuZWQgYnkgdGhlIGRlY29yYXRlZCBnZW5lcmF0b3IuXG4gKi9cblEuYXN5bmMgPSBhc3luYztcbmZ1bmN0aW9uIGFzeW5jKG1ha2VHZW5lcmF0b3IpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyB3aGVuIHZlcmIgaXMgXCJzZW5kXCIsIGFyZyBpcyBhIHZhbHVlXG4gICAgICAgIC8vIHdoZW4gdmVyYiBpcyBcInRocm93XCIsIGFyZyBpcyBhbiBleGNlcHRpb25cbiAgICAgICAgZnVuY3Rpb24gY29udGludWVyKHZlcmIsIGFyZykge1xuICAgICAgICAgICAgdmFyIHJlc3VsdDtcblxuICAgICAgICAgICAgLy8gVW50aWwgVjggMy4xOSAvIENocm9taXVtIDI5IGlzIHJlbGVhc2VkLCBTcGlkZXJNb25rZXkgaXMgdGhlIG9ubHlcbiAgICAgICAgICAgIC8vIGVuZ2luZSB0aGF0IGhhcyBhIGRlcGxveWVkIGJhc2Ugb2YgYnJvd3NlcnMgdGhhdCBzdXBwb3J0IGdlbmVyYXRvcnMuXG4gICAgICAgICAgICAvLyBIb3dldmVyLCBTTSdzIGdlbmVyYXRvcnMgdXNlIHRoZSBQeXRob24taW5zcGlyZWQgc2VtYW50aWNzIG9mXG4gICAgICAgICAgICAvLyBvdXRkYXRlZCBFUzYgZHJhZnRzLiAgV2Ugd291bGQgbGlrZSB0byBzdXBwb3J0IEVTNiwgYnV0IHdlJ2QgYWxzb1xuICAgICAgICAgICAgLy8gbGlrZSB0byBtYWtlIGl0IHBvc3NpYmxlIHRvIHVzZSBnZW5lcmF0b3JzIGluIGRlcGxveWVkIGJyb3dzZXJzLCBzb1xuICAgICAgICAgICAgLy8gd2UgYWxzbyBzdXBwb3J0IFB5dGhvbi1zdHlsZSBnZW5lcmF0b3JzLiAgQXQgc29tZSBwb2ludCB3ZSBjYW4gcmVtb3ZlXG4gICAgICAgICAgICAvLyB0aGlzIGJsb2NrLlxuXG4gICAgICAgICAgICBpZiAodHlwZW9mIFN0b3BJdGVyYXRpb24gPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgICAgICAvLyBFUzYgR2VuZXJhdG9yc1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGdlbmVyYXRvclt2ZXJiXShhcmcpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGV4Y2VwdGlvbikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVqZWN0KGV4Y2VwdGlvbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuZG9uZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUShyZXN1bHQudmFsdWUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB3aGVuKHJlc3VsdC52YWx1ZSwgY2FsbGJhY2ssIGVycmJhY2spO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gU3BpZGVyTW9ua2V5IEdlbmVyYXRvcnNcbiAgICAgICAgICAgICAgICAvLyBGSVhNRTogUmVtb3ZlIHRoaXMgY2FzZSB3aGVuIFNNIGRvZXMgRVM2IGdlbmVyYXRvcnMuXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gZ2VuZXJhdG9yW3ZlcmJdKGFyZyk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXhjZXB0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc1N0b3BJdGVyYXRpb24oZXhjZXB0aW9uKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFEoZXhjZXB0aW9uLnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZWplY3QoZXhjZXB0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gd2hlbihyZXN1bHQsIGNhbGxiYWNrLCBlcnJiYWNrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgZ2VuZXJhdG9yID0gbWFrZUdlbmVyYXRvci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICB2YXIgY2FsbGJhY2sgPSBjb250aW51ZXIuYmluZChjb250aW51ZXIsIFwibmV4dFwiKTtcbiAgICAgICAgdmFyIGVycmJhY2sgPSBjb250aW51ZXIuYmluZChjb250aW51ZXIsIFwidGhyb3dcIik7XG4gICAgICAgIHJldHVybiBjYWxsYmFjaygpO1xuICAgIH07XG59XG5cbi8qKlxuICogVGhlIHNwYXduIGZ1bmN0aW9uIGlzIGEgc21hbGwgd3JhcHBlciBhcm91bmQgYXN5bmMgdGhhdCBpbW1lZGlhdGVseVxuICogY2FsbHMgdGhlIGdlbmVyYXRvciBhbmQgYWxzbyBlbmRzIHRoZSBwcm9taXNlIGNoYWluLCBzbyB0aGF0IGFueVxuICogdW5oYW5kbGVkIGVycm9ycyBhcmUgdGhyb3duIGluc3RlYWQgb2YgZm9yd2FyZGVkIHRvIHRoZSBlcnJvclxuICogaGFuZGxlci4gVGhpcyBpcyB1c2VmdWwgYmVjYXVzZSBpdCdzIGV4dHJlbWVseSBjb21tb24gdG8gcnVuXG4gKiBnZW5lcmF0b3JzIGF0IHRoZSB0b3AtbGV2ZWwgdG8gd29yayB3aXRoIGxpYnJhcmllcy5cbiAqL1xuUS5zcGF3biA9IHNwYXduO1xuZnVuY3Rpb24gc3Bhd24obWFrZUdlbmVyYXRvcikge1xuICAgIFEuZG9uZShRLmFzeW5jKG1ha2VHZW5lcmF0b3IpKCkpO1xufVxuXG4vLyBGSVhNRTogUmVtb3ZlIHRoaXMgaW50ZXJmYWNlIG9uY2UgRVM2IGdlbmVyYXRvcnMgYXJlIGluIFNwaWRlck1vbmtleS5cbi8qKlxuICogVGhyb3dzIGEgUmV0dXJuVmFsdWUgZXhjZXB0aW9uIHRvIHN0b3AgYW4gYXN5bmNocm9ub3VzIGdlbmVyYXRvci5cbiAqXG4gKiBUaGlzIGludGVyZmFjZSBpcyBhIHN0b3AtZ2FwIG1lYXN1cmUgdG8gc3VwcG9ydCBnZW5lcmF0b3IgcmV0dXJuXG4gKiB2YWx1ZXMgaW4gb2xkZXIgRmlyZWZveC9TcGlkZXJNb25rZXkuICBJbiBicm93c2VycyB0aGF0IHN1cHBvcnQgRVM2XG4gKiBnZW5lcmF0b3JzIGxpa2UgQ2hyb21pdW0gMjksIGp1c3QgdXNlIFwicmV0dXJuXCIgaW4geW91ciBnZW5lcmF0b3JcbiAqIGZ1bmN0aW9ucy5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgdGhlIHJldHVybiB2YWx1ZSBmb3IgdGhlIHN1cnJvdW5kaW5nIGdlbmVyYXRvclxuICogQHRocm93cyBSZXR1cm5WYWx1ZSBleGNlcHRpb24gd2l0aCB0aGUgdmFsdWUuXG4gKiBAZXhhbXBsZVxuICogLy8gRVM2IHN0eWxlXG4gKiBRLmFzeW5jKGZ1bmN0aW9uKiAoKSB7XG4gKiAgICAgIHZhciBmb28gPSB5aWVsZCBnZXRGb29Qcm9taXNlKCk7XG4gKiAgICAgIHZhciBiYXIgPSB5aWVsZCBnZXRCYXJQcm9taXNlKCk7XG4gKiAgICAgIHJldHVybiBmb28gKyBiYXI7XG4gKiB9KVxuICogLy8gT2xkZXIgU3BpZGVyTW9ua2V5IHN0eWxlXG4gKiBRLmFzeW5jKGZ1bmN0aW9uICgpIHtcbiAqICAgICAgdmFyIGZvbyA9IHlpZWxkIGdldEZvb1Byb21pc2UoKTtcbiAqICAgICAgdmFyIGJhciA9IHlpZWxkIGdldEJhclByb21pc2UoKTtcbiAqICAgICAgUS5yZXR1cm4oZm9vICsgYmFyKTtcbiAqIH0pXG4gKi9cblFbXCJyZXR1cm5cIl0gPSBfcmV0dXJuO1xuZnVuY3Rpb24gX3JldHVybih2YWx1ZSkge1xuICAgIHRocm93IG5ldyBRUmV0dXJuVmFsdWUodmFsdWUpO1xufVxuXG4vKipcbiAqIFRoZSBwcm9taXNlZCBmdW5jdGlvbiBkZWNvcmF0b3IgZW5zdXJlcyB0aGF0IGFueSBwcm9taXNlIGFyZ3VtZW50c1xuICogYXJlIHNldHRsZWQgYW5kIHBhc3NlZCBhcyB2YWx1ZXMgKGB0aGlzYCBpcyBhbHNvIHNldHRsZWQgYW5kIHBhc3NlZFxuICogYXMgYSB2YWx1ZSkuICBJdCB3aWxsIGFsc28gZW5zdXJlIHRoYXQgdGhlIHJlc3VsdCBvZiBhIGZ1bmN0aW9uIGlzXG4gKiBhbHdheXMgYSBwcm9taXNlLlxuICpcbiAqIEBleGFtcGxlXG4gKiB2YXIgYWRkID0gUS5wcm9taXNlZChmdW5jdGlvbiAoYSwgYikge1xuICogICAgIHJldHVybiBhICsgYjtcbiAqIH0pO1xuICogYWRkKFEoYSksIFEoQikpO1xuICpcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrIFRoZSBmdW5jdGlvbiB0byBkZWNvcmF0ZVxuICogQHJldHVybnMge2Z1bmN0aW9ufSBhIGZ1bmN0aW9uIHRoYXQgaGFzIGJlZW4gZGVjb3JhdGVkLlxuICovXG5RLnByb21pc2VkID0gcHJvbWlzZWQ7XG5mdW5jdGlvbiBwcm9taXNlZChjYWxsYmFjaykge1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBzcHJlYWQoW3RoaXMsIGFsbChhcmd1bWVudHMpXSwgZnVuY3Rpb24gKHNlbGYsIGFyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjay5hcHBseShzZWxmLCBhcmdzKTtcbiAgICAgICAgfSk7XG4gICAgfTtcbn1cblxuLyoqXG4gKiBzZW5kcyBhIG1lc3NhZ2UgdG8gYSB2YWx1ZSBpbiBhIGZ1dHVyZSB0dXJuXG4gKiBAcGFyYW0gb2JqZWN0KiB0aGUgcmVjaXBpZW50XG4gKiBAcGFyYW0gb3AgdGhlIG5hbWUgb2YgdGhlIG1lc3NhZ2Ugb3BlcmF0aW9uLCBlLmcuLCBcIndoZW5cIixcbiAqIEBwYXJhbSBhcmdzIGZ1cnRoZXIgYXJndW1lbnRzIHRvIGJlIGZvcndhcmRlZCB0byB0aGUgb3BlcmF0aW9uXG4gKiBAcmV0dXJucyByZXN1bHQge1Byb21pc2V9IGEgcHJvbWlzZSBmb3IgdGhlIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uXG4gKi9cblEuZGlzcGF0Y2ggPSBkaXNwYXRjaDtcbmZ1bmN0aW9uIGRpc3BhdGNoKG9iamVjdCwgb3AsIGFyZ3MpIHtcbiAgICByZXR1cm4gUShvYmplY3QpLmRpc3BhdGNoKG9wLCBhcmdzKTtcbn1cblxuUHJvbWlzZS5wcm90b3R5cGUuZGlzcGF0Y2ggPSBmdW5jdGlvbiAob3AsIGFyZ3MpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIGRlZmVycmVkID0gZGVmZXIoKTtcbiAgICBRLm5leHRUaWNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc2VsZi5wcm9taXNlRGlzcGF0Y2goZGVmZXJyZWQucmVzb2x2ZSwgb3AsIGFyZ3MpO1xuICAgIH0pO1xuICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlO1xufTtcblxuLyoqXG4gKiBHZXRzIHRoZSB2YWx1ZSBvZiBhIHByb3BlcnR5IGluIGEgZnV0dXJlIHR1cm4uXG4gKiBAcGFyYW0gb2JqZWN0ICAgIHByb21pc2Ugb3IgaW1tZWRpYXRlIHJlZmVyZW5jZSBmb3IgdGFyZ2V0IG9iamVjdFxuICogQHBhcmFtIG5hbWUgICAgICBuYW1lIG9mIHByb3BlcnR5IHRvIGdldFxuICogQHJldHVybiBwcm9taXNlIGZvciB0aGUgcHJvcGVydHkgdmFsdWVcbiAqL1xuUS5nZXQgPSBmdW5jdGlvbiAob2JqZWN0LCBrZXkpIHtcbiAgICByZXR1cm4gUShvYmplY3QpLmRpc3BhdGNoKFwiZ2V0XCIsIFtrZXldKTtcbn07XG5cblByb21pc2UucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgICByZXR1cm4gdGhpcy5kaXNwYXRjaChcImdldFwiLCBba2V5XSk7XG59O1xuXG4vKipcbiAqIFNldHMgdGhlIHZhbHVlIG9mIGEgcHJvcGVydHkgaW4gYSBmdXR1cmUgdHVybi5cbiAqIEBwYXJhbSBvYmplY3QgICAgcHJvbWlzZSBvciBpbW1lZGlhdGUgcmVmZXJlbmNlIGZvciBvYmplY3Qgb2JqZWN0XG4gKiBAcGFyYW0gbmFtZSAgICAgIG5hbWUgb2YgcHJvcGVydHkgdG8gc2V0XG4gKiBAcGFyYW0gdmFsdWUgICAgIG5ldyB2YWx1ZSBvZiBwcm9wZXJ0eVxuICogQHJldHVybiBwcm9taXNlIGZvciB0aGUgcmV0dXJuIHZhbHVlXG4gKi9cblEuc2V0ID0gZnVuY3Rpb24gKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICAgIHJldHVybiBRKG9iamVjdCkuZGlzcGF0Y2goXCJzZXRcIiwgW2tleSwgdmFsdWVdKTtcbn07XG5cblByb21pc2UucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2goXCJzZXRcIiwgW2tleSwgdmFsdWVdKTtcbn07XG5cbi8qKlxuICogRGVsZXRlcyBhIHByb3BlcnR5IGluIGEgZnV0dXJlIHR1cm4uXG4gKiBAcGFyYW0gb2JqZWN0ICAgIHByb21pc2Ugb3IgaW1tZWRpYXRlIHJlZmVyZW5jZSBmb3IgdGFyZ2V0IG9iamVjdFxuICogQHBhcmFtIG5hbWUgICAgICBuYW1lIG9mIHByb3BlcnR5IHRvIGRlbGV0ZVxuICogQHJldHVybiBwcm9taXNlIGZvciB0aGUgcmV0dXJuIHZhbHVlXG4gKi9cblEuZGVsID0gLy8gWFhYIGxlZ2FjeVxuUVtcImRlbGV0ZVwiXSA9IGZ1bmN0aW9uIChvYmplY3QsIGtleSkge1xuICAgIHJldHVybiBRKG9iamVjdCkuZGlzcGF0Y2goXCJkZWxldGVcIiwgW2tleV0pO1xufTtcblxuUHJvbWlzZS5wcm90b3R5cGUuZGVsID0gLy8gWFhYIGxlZ2FjeVxuUHJvbWlzZS5wcm90b3R5cGVbXCJkZWxldGVcIl0gPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2goXCJkZWxldGVcIiwgW2tleV0pO1xufTtcblxuLyoqXG4gKiBJbnZva2VzIGEgbWV0aG9kIGluIGEgZnV0dXJlIHR1cm4uXG4gKiBAcGFyYW0gb2JqZWN0ICAgIHByb21pc2Ugb3IgaW1tZWRpYXRlIHJlZmVyZW5jZSBmb3IgdGFyZ2V0IG9iamVjdFxuICogQHBhcmFtIG5hbWUgICAgICBuYW1lIG9mIG1ldGhvZCB0byBpbnZva2VcbiAqIEBwYXJhbSB2YWx1ZSAgICAgYSB2YWx1ZSB0byBwb3N0LCB0eXBpY2FsbHkgYW4gYXJyYXkgb2ZcbiAqICAgICAgICAgICAgICAgICAgaW52b2NhdGlvbiBhcmd1bWVudHMgZm9yIHByb21pc2VzIHRoYXRcbiAqICAgICAgICAgICAgICAgICAgYXJlIHVsdGltYXRlbHkgYmFja2VkIHdpdGggYHJlc29sdmVgIHZhbHVlcyxcbiAqICAgICAgICAgICAgICAgICAgYXMgb3Bwb3NlZCB0byB0aG9zZSBiYWNrZWQgd2l0aCBVUkxzXG4gKiAgICAgICAgICAgICAgICAgIHdoZXJlaW4gdGhlIHBvc3RlZCB2YWx1ZSBjYW4gYmUgYW55XG4gKiAgICAgICAgICAgICAgICAgIEpTT04gc2VyaWFsaXphYmxlIG9iamVjdC5cbiAqIEByZXR1cm4gcHJvbWlzZSBmb3IgdGhlIHJldHVybiB2YWx1ZVxuICovXG4vLyBib3VuZCBsb2NhbGx5IGJlY2F1c2UgaXQgaXMgdXNlZCBieSBvdGhlciBtZXRob2RzXG5RLm1hcHBseSA9IC8vIFhYWCBBcyBwcm9wb3NlZCBieSBcIlJlZHNhbmRyb1wiXG5RLnBvc3QgPSBmdW5jdGlvbiAob2JqZWN0LCBuYW1lLCBhcmdzKSB7XG4gICAgcmV0dXJuIFEob2JqZWN0KS5kaXNwYXRjaChcInBvc3RcIiwgW25hbWUsIGFyZ3NdKTtcbn07XG5cblByb21pc2UucHJvdG90eXBlLm1hcHBseSA9IC8vIFhYWCBBcyBwcm9wb3NlZCBieSBcIlJlZHNhbmRyb1wiXG5Qcm9taXNlLnByb3RvdHlwZS5wb3N0ID0gZnVuY3Rpb24gKG5hbWUsIGFyZ3MpIHtcbiAgICByZXR1cm4gdGhpcy5kaXNwYXRjaChcInBvc3RcIiwgW25hbWUsIGFyZ3NdKTtcbn07XG5cbi8qKlxuICogSW52b2tlcyBhIG1ldGhvZCBpbiBhIGZ1dHVyZSB0dXJuLlxuICogQHBhcmFtIG9iamVjdCAgICBwcm9taXNlIG9yIGltbWVkaWF0ZSByZWZlcmVuY2UgZm9yIHRhcmdldCBvYmplY3RcbiAqIEBwYXJhbSBuYW1lICAgICAgbmFtZSBvZiBtZXRob2QgdG8gaW52b2tlXG4gKiBAcGFyYW0gLi4uYXJncyAgIGFycmF5IG9mIGludm9jYXRpb24gYXJndW1lbnRzXG4gKiBAcmV0dXJuIHByb21pc2UgZm9yIHRoZSByZXR1cm4gdmFsdWVcbiAqL1xuUS5zZW5kID0gLy8gWFhYIE1hcmsgTWlsbGVyJ3MgcHJvcG9zZWQgcGFybGFuY2VcblEubWNhbGwgPSAvLyBYWFggQXMgcHJvcG9zZWQgYnkgXCJSZWRzYW5kcm9cIlxuUS5pbnZva2UgPSBmdW5jdGlvbiAob2JqZWN0LCBuYW1lIC8qLi4uYXJncyovKSB7XG4gICAgcmV0dXJuIFEob2JqZWN0KS5kaXNwYXRjaChcInBvc3RcIiwgW25hbWUsIGFycmF5X3NsaWNlKGFyZ3VtZW50cywgMildKTtcbn07XG5cblByb21pc2UucHJvdG90eXBlLnNlbmQgPSAvLyBYWFggTWFyayBNaWxsZXIncyBwcm9wb3NlZCBwYXJsYW5jZVxuUHJvbWlzZS5wcm90b3R5cGUubWNhbGwgPSAvLyBYWFggQXMgcHJvcG9zZWQgYnkgXCJSZWRzYW5kcm9cIlxuUHJvbWlzZS5wcm90b3R5cGUuaW52b2tlID0gZnVuY3Rpb24gKG5hbWUgLyouLi5hcmdzKi8pIHtcbiAgICByZXR1cm4gdGhpcy5kaXNwYXRjaChcInBvc3RcIiwgW25hbWUsIGFycmF5X3NsaWNlKGFyZ3VtZW50cywgMSldKTtcbn07XG5cbi8qKlxuICogQXBwbGllcyB0aGUgcHJvbWlzZWQgZnVuY3Rpb24gaW4gYSBmdXR1cmUgdHVybi5cbiAqIEBwYXJhbSBvYmplY3QgICAgcHJvbWlzZSBvciBpbW1lZGlhdGUgcmVmZXJlbmNlIGZvciB0YXJnZXQgZnVuY3Rpb25cbiAqIEBwYXJhbSBhcmdzICAgICAgYXJyYXkgb2YgYXBwbGljYXRpb24gYXJndW1lbnRzXG4gKi9cblEuZmFwcGx5ID0gZnVuY3Rpb24gKG9iamVjdCwgYXJncykge1xuICAgIHJldHVybiBRKG9iamVjdCkuZGlzcGF0Y2goXCJhcHBseVwiLCBbdm9pZCAwLCBhcmdzXSk7XG59O1xuXG5Qcm9taXNlLnByb3RvdHlwZS5mYXBwbHkgPSBmdW5jdGlvbiAoYXJncykge1xuICAgIHJldHVybiB0aGlzLmRpc3BhdGNoKFwiYXBwbHlcIiwgW3ZvaWQgMCwgYXJnc10pO1xufTtcblxuLyoqXG4gKiBDYWxscyB0aGUgcHJvbWlzZWQgZnVuY3Rpb24gaW4gYSBmdXR1cmUgdHVybi5cbiAqIEBwYXJhbSBvYmplY3QgICAgcHJvbWlzZSBvciBpbW1lZGlhdGUgcmVmZXJlbmNlIGZvciB0YXJnZXQgZnVuY3Rpb25cbiAqIEBwYXJhbSAuLi5hcmdzICAgYXJyYXkgb2YgYXBwbGljYXRpb24gYXJndW1lbnRzXG4gKi9cblFbXCJ0cnlcIl0gPVxuUS5mY2FsbCA9IGZ1bmN0aW9uIChvYmplY3QgLyogLi4uYXJncyovKSB7XG4gICAgcmV0dXJuIFEob2JqZWN0KS5kaXNwYXRjaChcImFwcGx5XCIsIFt2b2lkIDAsIGFycmF5X3NsaWNlKGFyZ3VtZW50cywgMSldKTtcbn07XG5cblByb21pc2UucHJvdG90eXBlLmZjYWxsID0gZnVuY3Rpb24gKC8qLi4uYXJncyovKSB7XG4gICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2goXCJhcHBseVwiLCBbdm9pZCAwLCBhcnJheV9zbGljZShhcmd1bWVudHMpXSk7XG59O1xuXG4vKipcbiAqIEJpbmRzIHRoZSBwcm9taXNlZCBmdW5jdGlvbiwgdHJhbnNmb3JtaW5nIHJldHVybiB2YWx1ZXMgaW50byBhIGZ1bGZpbGxlZFxuICogcHJvbWlzZSBhbmQgdGhyb3duIGVycm9ycyBpbnRvIGEgcmVqZWN0ZWQgb25lLlxuICogQHBhcmFtIG9iamVjdCAgICBwcm9taXNlIG9yIGltbWVkaWF0ZSByZWZlcmVuY2UgZm9yIHRhcmdldCBmdW5jdGlvblxuICogQHBhcmFtIC4uLmFyZ3MgICBhcnJheSBvZiBhcHBsaWNhdGlvbiBhcmd1bWVudHNcbiAqL1xuUS5mYmluZCA9IGZ1bmN0aW9uIChvYmplY3QgLyouLi5hcmdzKi8pIHtcbiAgICB2YXIgcHJvbWlzZSA9IFEob2JqZWN0KTtcbiAgICB2YXIgYXJncyA9IGFycmF5X3NsaWNlKGFyZ3VtZW50cywgMSk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIGZib3VuZCgpIHtcbiAgICAgICAgcmV0dXJuIHByb21pc2UuZGlzcGF0Y2goXCJhcHBseVwiLCBbXG4gICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICAgYXJncy5jb25jYXQoYXJyYXlfc2xpY2UoYXJndW1lbnRzKSlcbiAgICAgICAgXSk7XG4gICAgfTtcbn07XG5Qcm9taXNlLnByb3RvdHlwZS5mYmluZCA9IGZ1bmN0aW9uICgvKi4uLmFyZ3MqLykge1xuICAgIHZhciBwcm9taXNlID0gdGhpcztcbiAgICB2YXIgYXJncyA9IGFycmF5X3NsaWNlKGFyZ3VtZW50cyk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIGZib3VuZCgpIHtcbiAgICAgICAgcmV0dXJuIHByb21pc2UuZGlzcGF0Y2goXCJhcHBseVwiLCBbXG4gICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICAgYXJncy5jb25jYXQoYXJyYXlfc2xpY2UoYXJndW1lbnRzKSlcbiAgICAgICAgXSk7XG4gICAgfTtcbn07XG5cbi8qKlxuICogUmVxdWVzdHMgdGhlIG5hbWVzIG9mIHRoZSBvd25lZCBwcm9wZXJ0aWVzIG9mIGEgcHJvbWlzZWRcbiAqIG9iamVjdCBpbiBhIGZ1dHVyZSB0dXJuLlxuICogQHBhcmFtIG9iamVjdCAgICBwcm9taXNlIG9yIGltbWVkaWF0ZSByZWZlcmVuY2UgZm9yIHRhcmdldCBvYmplY3RcbiAqIEByZXR1cm4gcHJvbWlzZSBmb3IgdGhlIGtleXMgb2YgdGhlIGV2ZW50dWFsbHkgc2V0dGxlZCBvYmplY3RcbiAqL1xuUS5rZXlzID0gZnVuY3Rpb24gKG9iamVjdCkge1xuICAgIHJldHVybiBRKG9iamVjdCkuZGlzcGF0Y2goXCJrZXlzXCIsIFtdKTtcbn07XG5cblByb21pc2UucHJvdG90eXBlLmtleXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2goXCJrZXlzXCIsIFtdKTtcbn07XG5cbi8qKlxuICogVHVybnMgYW4gYXJyYXkgb2YgcHJvbWlzZXMgaW50byBhIHByb21pc2UgZm9yIGFuIGFycmF5LiAgSWYgYW55IG9mXG4gKiB0aGUgcHJvbWlzZXMgZ2V0cyByZWplY3RlZCwgdGhlIHdob2xlIGFycmF5IGlzIHJlamVjdGVkIGltbWVkaWF0ZWx5LlxuICogQHBhcmFtIHtBcnJheSp9IGFuIGFycmF5IChvciBwcm9taXNlIGZvciBhbiBhcnJheSkgb2YgdmFsdWVzIChvclxuICogcHJvbWlzZXMgZm9yIHZhbHVlcylcbiAqIEByZXR1cm5zIGEgcHJvbWlzZSBmb3IgYW4gYXJyYXkgb2YgdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWVzXG4gKi9cbi8vIEJ5IE1hcmsgTWlsbGVyXG4vLyBodHRwOi8vd2lraS5lY21hc2NyaXB0Lm9yZy9kb2t1LnBocD9pZD1zdHJhd21hbjpjb25jdXJyZW5jeSZyZXY9MTMwODc3NjUyMSNhbGxmdWxmaWxsZWRcblEuYWxsID0gYWxsO1xuZnVuY3Rpb24gYWxsKHByb21pc2VzKSB7XG4gICAgcmV0dXJuIHdoZW4ocHJvbWlzZXMsIGZ1bmN0aW9uIChwcm9taXNlcykge1xuICAgICAgICB2YXIgcGVuZGluZ0NvdW50ID0gMDtcbiAgICAgICAgdmFyIGRlZmVycmVkID0gZGVmZXIoKTtcbiAgICAgICAgYXJyYXlfcmVkdWNlKHByb21pc2VzLCBmdW5jdGlvbiAodW5kZWZpbmVkLCBwcm9taXNlLCBpbmRleCkge1xuICAgICAgICAgICAgdmFyIHNuYXBzaG90O1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIGlzUHJvbWlzZShwcm9taXNlKSAmJlxuICAgICAgICAgICAgICAgIChzbmFwc2hvdCA9IHByb21pc2UuaW5zcGVjdCgpKS5zdGF0ZSA9PT0gXCJmdWxmaWxsZWRcIlxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcHJvbWlzZXNbaW5kZXhdID0gc25hcHNob3QudmFsdWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICsrcGVuZGluZ0NvdW50O1xuICAgICAgICAgICAgICAgIHdoZW4oXG4gICAgICAgICAgICAgICAgICAgIHByb21pc2UsXG4gICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZXNbaW5kZXhdID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoLS1wZW5kaW5nQ291bnQgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKHByb21pc2VzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVqZWN0LFxuICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAocHJvZ3Jlc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVycmVkLm5vdGlmeSh7IGluZGV4OiBpbmRleCwgdmFsdWU6IHByb2dyZXNzIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgdm9pZCAwKTtcbiAgICAgICAgaWYgKHBlbmRpbmdDb3VudCA9PT0gMCkge1xuICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZShwcm9taXNlcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2U7XG4gICAgfSk7XG59XG5cblByb21pc2UucHJvdG90eXBlLmFsbCA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gYWxsKHRoaXMpO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBmaXJzdCByZXNvbHZlZCBwcm9taXNlIG9mIGFuIGFycmF5LiBQcmlvciByZWplY3RlZCBwcm9taXNlcyBhcmVcbiAqIGlnbm9yZWQuICBSZWplY3RzIG9ubHkgaWYgYWxsIHByb21pc2VzIGFyZSByZWplY3RlZC5cbiAqIEBwYXJhbSB7QXJyYXkqfSBhbiBhcnJheSBjb250YWluaW5nIHZhbHVlcyBvciBwcm9taXNlcyBmb3IgdmFsdWVzXG4gKiBAcmV0dXJucyBhIHByb21pc2UgZnVsZmlsbGVkIHdpdGggdGhlIHZhbHVlIG9mIHRoZSBmaXJzdCByZXNvbHZlZCBwcm9taXNlLFxuICogb3IgYSByZWplY3RlZCBwcm9taXNlIGlmIGFsbCBwcm9taXNlcyBhcmUgcmVqZWN0ZWQuXG4gKi9cblEuYW55ID0gYW55O1xuXG5mdW5jdGlvbiBhbnkocHJvbWlzZXMpIHtcbiAgICBpZiAocHJvbWlzZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBRLnJlc29sdmUoKTtcbiAgICB9XG5cbiAgICB2YXIgZGVmZXJyZWQgPSBRLmRlZmVyKCk7XG4gICAgdmFyIHBlbmRpbmdDb3VudCA9IDA7XG4gICAgYXJyYXlfcmVkdWNlKHByb21pc2VzLCBmdW5jdGlvbiAocHJldiwgY3VycmVudCwgaW5kZXgpIHtcbiAgICAgICAgdmFyIHByb21pc2UgPSBwcm9taXNlc1tpbmRleF07XG5cbiAgICAgICAgcGVuZGluZ0NvdW50Kys7XG5cbiAgICAgICAgd2hlbihwcm9taXNlLCBvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCwgb25Qcm9ncmVzcyk7XG4gICAgICAgIGZ1bmN0aW9uIG9uRnVsZmlsbGVkKHJlc3VsdCkge1xuICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIG9uUmVqZWN0ZWQoKSB7XG4gICAgICAgICAgICBwZW5kaW5nQ291bnQtLTtcbiAgICAgICAgICAgIGlmIChwZW5kaW5nQ291bnQgPT09IDApIHtcbiAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZWplY3QobmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICAgICBcIkNhbid0IGdldCBmdWxmaWxsbWVudCB2YWx1ZSBmcm9tIGFueSBwcm9taXNlLCBhbGwgXCIgK1xuICAgICAgICAgICAgICAgICAgICBcInByb21pc2VzIHdlcmUgcmVqZWN0ZWQuXCJcbiAgICAgICAgICAgICAgICApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBvblByb2dyZXNzKHByb2dyZXNzKSB7XG4gICAgICAgICAgICBkZWZlcnJlZC5ub3RpZnkoe1xuICAgICAgICAgICAgICAgIGluZGV4OiBpbmRleCxcbiAgICAgICAgICAgICAgICB2YWx1ZTogcHJvZ3Jlc3NcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfSwgdW5kZWZpbmVkKTtcblxuICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlO1xufVxuXG5Qcm9taXNlLnByb3RvdHlwZS5hbnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGFueSh0aGlzKTtcbn07XG5cbi8qKlxuICogV2FpdHMgZm9yIGFsbCBwcm9taXNlcyB0byBiZSBzZXR0bGVkLCBlaXRoZXIgZnVsZmlsbGVkIG9yXG4gKiByZWplY3RlZC4gIFRoaXMgaXMgZGlzdGluY3QgZnJvbSBgYWxsYCBzaW5jZSB0aGF0IHdvdWxkIHN0b3BcbiAqIHdhaXRpbmcgYXQgdGhlIGZpcnN0IHJlamVjdGlvbi4gIFRoZSBwcm9taXNlIHJldHVybmVkIGJ5XG4gKiBgYWxsUmVzb2x2ZWRgIHdpbGwgbmV2ZXIgYmUgcmVqZWN0ZWQuXG4gKiBAcGFyYW0gcHJvbWlzZXMgYSBwcm9taXNlIGZvciBhbiBhcnJheSAob3IgYW4gYXJyYXkpIG9mIHByb21pc2VzXG4gKiAob3IgdmFsdWVzKVxuICogQHJldHVybiBhIHByb21pc2UgZm9yIGFuIGFycmF5IG9mIHByb21pc2VzXG4gKi9cblEuYWxsUmVzb2x2ZWQgPSBkZXByZWNhdGUoYWxsUmVzb2x2ZWQsIFwiYWxsUmVzb2x2ZWRcIiwgXCJhbGxTZXR0bGVkXCIpO1xuZnVuY3Rpb24gYWxsUmVzb2x2ZWQocHJvbWlzZXMpIHtcbiAgICByZXR1cm4gd2hlbihwcm9taXNlcywgZnVuY3Rpb24gKHByb21pc2VzKSB7XG4gICAgICAgIHByb21pc2VzID0gYXJyYXlfbWFwKHByb21pc2VzLCBRKTtcbiAgICAgICAgcmV0dXJuIHdoZW4oYWxsKGFycmF5X21hcChwcm9taXNlcywgZnVuY3Rpb24gKHByb21pc2UpIHtcbiAgICAgICAgICAgIHJldHVybiB3aGVuKHByb21pc2UsIG5vb3AsIG5vb3ApO1xuICAgICAgICB9KSksIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9taXNlcztcbiAgICAgICAgfSk7XG4gICAgfSk7XG59XG5cblByb21pc2UucHJvdG90eXBlLmFsbFJlc29sdmVkID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBhbGxSZXNvbHZlZCh0aGlzKTtcbn07XG5cbi8qKlxuICogQHNlZSBQcm9taXNlI2FsbFNldHRsZWRcbiAqL1xuUS5hbGxTZXR0bGVkID0gYWxsU2V0dGxlZDtcbmZ1bmN0aW9uIGFsbFNldHRsZWQocHJvbWlzZXMpIHtcbiAgICByZXR1cm4gUShwcm9taXNlcykuYWxsU2V0dGxlZCgpO1xufVxuXG4vKipcbiAqIFR1cm5zIGFuIGFycmF5IG9mIHByb21pc2VzIGludG8gYSBwcm9taXNlIGZvciBhbiBhcnJheSBvZiB0aGVpciBzdGF0ZXMgKGFzXG4gKiByZXR1cm5lZCBieSBgaW5zcGVjdGApIHdoZW4gdGhleSBoYXZlIGFsbCBzZXR0bGVkLlxuICogQHBhcmFtIHtBcnJheVtBbnkqXX0gdmFsdWVzIGFuIGFycmF5IChvciBwcm9taXNlIGZvciBhbiBhcnJheSkgb2YgdmFsdWVzIChvclxuICogcHJvbWlzZXMgZm9yIHZhbHVlcylcbiAqIEByZXR1cm5zIHtBcnJheVtTdGF0ZV19IGFuIGFycmF5IG9mIHN0YXRlcyBmb3IgdGhlIHJlc3BlY3RpdmUgdmFsdWVzLlxuICovXG5Qcm9taXNlLnByb3RvdHlwZS5hbGxTZXR0bGVkID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLnRoZW4oZnVuY3Rpb24gKHByb21pc2VzKSB7XG4gICAgICAgIHJldHVybiBhbGwoYXJyYXlfbWFwKHByb21pc2VzLCBmdW5jdGlvbiAocHJvbWlzZSkge1xuICAgICAgICAgICAgcHJvbWlzZSA9IFEocHJvbWlzZSk7XG4gICAgICAgICAgICBmdW5jdGlvbiByZWdhcmRsZXNzKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBwcm9taXNlLmluc3BlY3QoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBwcm9taXNlLnRoZW4ocmVnYXJkbGVzcywgcmVnYXJkbGVzcyk7XG4gICAgICAgIH0pKTtcbiAgICB9KTtcbn07XG5cbi8qKlxuICogQ2FwdHVyZXMgdGhlIGZhaWx1cmUgb2YgYSBwcm9taXNlLCBnaXZpbmcgYW4gb3BvcnR1bml0eSB0byByZWNvdmVyXG4gKiB3aXRoIGEgY2FsbGJhY2suICBJZiB0aGUgZ2l2ZW4gcHJvbWlzZSBpcyBmdWxmaWxsZWQsIHRoZSByZXR1cm5lZFxuICogcHJvbWlzZSBpcyBmdWxmaWxsZWQuXG4gKiBAcGFyYW0ge0FueSp9IHByb21pc2UgZm9yIHNvbWV0aGluZ1xuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgdG8gZnVsZmlsbCB0aGUgcmV0dXJuZWQgcHJvbWlzZSBpZiB0aGVcbiAqIGdpdmVuIHByb21pc2UgaXMgcmVqZWN0ZWRcbiAqIEByZXR1cm5zIGEgcHJvbWlzZSBmb3IgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgY2FsbGJhY2tcbiAqL1xuUS5mYWlsID0gLy8gWFhYIGxlZ2FjeVxuUVtcImNhdGNoXCJdID0gZnVuY3Rpb24gKG9iamVjdCwgcmVqZWN0ZWQpIHtcbiAgICByZXR1cm4gUShvYmplY3QpLnRoZW4odm9pZCAwLCByZWplY3RlZCk7XG59O1xuXG5Qcm9taXNlLnByb3RvdHlwZS5mYWlsID0gLy8gWFhYIGxlZ2FjeVxuUHJvbWlzZS5wcm90b3R5cGVbXCJjYXRjaFwiXSA9IGZ1bmN0aW9uIChyZWplY3RlZCkge1xuICAgIHJldHVybiB0aGlzLnRoZW4odm9pZCAwLCByZWplY3RlZCk7XG59O1xuXG4vKipcbiAqIEF0dGFjaGVzIGEgbGlzdGVuZXIgdGhhdCBjYW4gcmVzcG9uZCB0byBwcm9ncmVzcyBub3RpZmljYXRpb25zIGZyb20gYVxuICogcHJvbWlzZSdzIG9yaWdpbmF0aW5nIGRlZmVycmVkLiBUaGlzIGxpc3RlbmVyIHJlY2VpdmVzIHRoZSBleGFjdCBhcmd1bWVudHNcbiAqIHBhc3NlZCB0byBgYGRlZmVycmVkLm5vdGlmeWBgLlxuICogQHBhcmFtIHtBbnkqfSBwcm9taXNlIGZvciBzb21ldGhpbmdcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIHRvIHJlY2VpdmUgYW55IHByb2dyZXNzIG5vdGlmaWNhdGlvbnNcbiAqIEByZXR1cm5zIHRoZSBnaXZlbiBwcm9taXNlLCB1bmNoYW5nZWRcbiAqL1xuUS5wcm9ncmVzcyA9IHByb2dyZXNzO1xuZnVuY3Rpb24gcHJvZ3Jlc3Mob2JqZWN0LCBwcm9ncmVzc2VkKSB7XG4gICAgcmV0dXJuIFEob2JqZWN0KS50aGVuKHZvaWQgMCwgdm9pZCAwLCBwcm9ncmVzc2VkKTtcbn1cblxuUHJvbWlzZS5wcm90b3R5cGUucHJvZ3Jlc3MgPSBmdW5jdGlvbiAocHJvZ3Jlc3NlZCkge1xuICAgIHJldHVybiB0aGlzLnRoZW4odm9pZCAwLCB2b2lkIDAsIHByb2dyZXNzZWQpO1xufTtcblxuLyoqXG4gKiBQcm92aWRlcyBhbiBvcHBvcnR1bml0eSB0byBvYnNlcnZlIHRoZSBzZXR0bGluZyBvZiBhIHByb21pc2UsXG4gKiByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIHByb21pc2UgaXMgZnVsZmlsbGVkIG9yIHJlamVjdGVkLiAgRm9yd2FyZHNcbiAqIHRoZSByZXNvbHV0aW9uIHRvIHRoZSByZXR1cm5lZCBwcm9taXNlIHdoZW4gdGhlIGNhbGxiYWNrIGlzIGRvbmUuXG4gKiBUaGUgY2FsbGJhY2sgY2FuIHJldHVybiBhIHByb21pc2UgdG8gZGVmZXIgY29tcGxldGlvbi5cbiAqIEBwYXJhbSB7QW55Kn0gcHJvbWlzZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgdG8gb2JzZXJ2ZSB0aGUgcmVzb2x1dGlvbiBvZiB0aGUgZ2l2ZW5cbiAqIHByb21pc2UsIHRha2VzIG5vIGFyZ3VtZW50cy5cbiAqIEByZXR1cm5zIGEgcHJvbWlzZSBmb3IgdGhlIHJlc29sdXRpb24gb2YgdGhlIGdpdmVuIHByb21pc2Ugd2hlblxuICogYGBmaW5gYCBpcyBkb25lLlxuICovXG5RLmZpbiA9IC8vIFhYWCBsZWdhY3lcblFbXCJmaW5hbGx5XCJdID0gZnVuY3Rpb24gKG9iamVjdCwgY2FsbGJhY2spIHtcbiAgICByZXR1cm4gUShvYmplY3QpW1wiZmluYWxseVwiXShjYWxsYmFjayk7XG59O1xuXG5Qcm9taXNlLnByb3RvdHlwZS5maW4gPSAvLyBYWFggbGVnYWN5XG5Qcm9taXNlLnByb3RvdHlwZVtcImZpbmFsbHlcIl0gPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICBjYWxsYmFjayA9IFEoY2FsbGJhY2spO1xuICAgIHJldHVybiB0aGlzLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBjYWxsYmFjay5mY2FsbCgpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9KTtcbiAgICB9LCBmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgICAgIC8vIFRPRE8gYXR0ZW1wdCB0byByZWN5Y2xlIHRoZSByZWplY3Rpb24gd2l0aCBcInRoaXNcIi5cbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrLmZjYWxsKCkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0aHJvdyByZWFzb247XG4gICAgICAgIH0pO1xuICAgIH0pO1xufTtcblxuLyoqXG4gKiBUZXJtaW5hdGVzIGEgY2hhaW4gb2YgcHJvbWlzZXMsIGZvcmNpbmcgcmVqZWN0aW9ucyB0byBiZVxuICogdGhyb3duIGFzIGV4Y2VwdGlvbnMuXG4gKiBAcGFyYW0ge0FueSp9IHByb21pc2UgYXQgdGhlIGVuZCBvZiBhIGNoYWluIG9mIHByb21pc2VzXG4gKiBAcmV0dXJucyBub3RoaW5nXG4gKi9cblEuZG9uZSA9IGZ1bmN0aW9uIChvYmplY3QsIGZ1bGZpbGxlZCwgcmVqZWN0ZWQsIHByb2dyZXNzKSB7XG4gICAgcmV0dXJuIFEob2JqZWN0KS5kb25lKGZ1bGZpbGxlZCwgcmVqZWN0ZWQsIHByb2dyZXNzKTtcbn07XG5cblByb21pc2UucHJvdG90eXBlLmRvbmUgPSBmdW5jdGlvbiAoZnVsZmlsbGVkLCByZWplY3RlZCwgcHJvZ3Jlc3MpIHtcbiAgICB2YXIgb25VbmhhbmRsZWRFcnJvciA9IGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAvLyBmb3J3YXJkIHRvIGEgZnV0dXJlIHR1cm4gc28gdGhhdCBgYHdoZW5gYFxuICAgICAgICAvLyBkb2VzIG5vdCBjYXRjaCBpdCBhbmQgdHVybiBpdCBpbnRvIGEgcmVqZWN0aW9uLlxuICAgICAgICBRLm5leHRUaWNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIG1ha2VTdGFja1RyYWNlTG9uZyhlcnJvciwgcHJvbWlzZSk7XG4gICAgICAgICAgICBpZiAoUS5vbmVycm9yKSB7XG4gICAgICAgICAgICAgICAgUS5vbmVycm9yKGVycm9yKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvLyBBdm9pZCB1bm5lY2Vzc2FyeSBgbmV4dFRpY2tgaW5nIHZpYSBhbiB1bm5lY2Vzc2FyeSBgd2hlbmAuXG4gICAgdmFyIHByb21pc2UgPSBmdWxmaWxsZWQgfHwgcmVqZWN0ZWQgfHwgcHJvZ3Jlc3MgP1xuICAgICAgICB0aGlzLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCwgcHJvZ3Jlc3MpIDpcbiAgICAgICAgdGhpcztcblxuICAgIGlmICh0eXBlb2YgcHJvY2VzcyA9PT0gXCJvYmplY3RcIiAmJiBwcm9jZXNzICYmIHByb2Nlc3MuZG9tYWluKSB7XG4gICAgICAgIG9uVW5oYW5kbGVkRXJyb3IgPSBwcm9jZXNzLmRvbWFpbi5iaW5kKG9uVW5oYW5kbGVkRXJyb3IpO1xuICAgIH1cblxuICAgIHByb21pc2UudGhlbih2b2lkIDAsIG9uVW5oYW5kbGVkRXJyb3IpO1xufTtcblxuLyoqXG4gKiBDYXVzZXMgYSBwcm9taXNlIHRvIGJlIHJlamVjdGVkIGlmIGl0IGRvZXMgbm90IGdldCBmdWxmaWxsZWQgYmVmb3JlXG4gKiBzb21lIG1pbGxpc2Vjb25kcyB0aW1lIG91dC5cbiAqIEBwYXJhbSB7QW55Kn0gcHJvbWlzZVxuICogQHBhcmFtIHtOdW1iZXJ9IG1pbGxpc2Vjb25kcyB0aW1lb3V0XG4gKiBAcGFyYW0ge0FueSp9IGN1c3RvbSBlcnJvciBtZXNzYWdlIG9yIEVycm9yIG9iamVjdCAob3B0aW9uYWwpXG4gKiBAcmV0dXJucyBhIHByb21pc2UgZm9yIHRoZSByZXNvbHV0aW9uIG9mIHRoZSBnaXZlbiBwcm9taXNlIGlmIGl0IGlzXG4gKiBmdWxmaWxsZWQgYmVmb3JlIHRoZSB0aW1lb3V0LCBvdGhlcndpc2UgcmVqZWN0ZWQuXG4gKi9cblEudGltZW91dCA9IGZ1bmN0aW9uIChvYmplY3QsIG1zLCBlcnJvcikge1xuICAgIHJldHVybiBRKG9iamVjdCkudGltZW91dChtcywgZXJyb3IpO1xufTtcblxuUHJvbWlzZS5wcm90b3R5cGUudGltZW91dCA9IGZ1bmN0aW9uIChtcywgZXJyb3IpIHtcbiAgICB2YXIgZGVmZXJyZWQgPSBkZWZlcigpO1xuICAgIHZhciB0aW1lb3V0SWQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCFlcnJvciB8fCBcInN0cmluZ1wiID09PSB0eXBlb2YgZXJyb3IpIHtcbiAgICAgICAgICAgIGVycm9yID0gbmV3IEVycm9yKGVycm9yIHx8IFwiVGltZWQgb3V0IGFmdGVyIFwiICsgbXMgKyBcIiBtc1wiKTtcbiAgICAgICAgICAgIGVycm9yLmNvZGUgPSBcIkVUSU1FRE9VVFwiO1xuICAgICAgICB9XG4gICAgICAgIGRlZmVycmVkLnJlamVjdChlcnJvcik7XG4gICAgfSwgbXMpO1xuXG4gICAgdGhpcy50aGVuKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dElkKTtcbiAgICAgICAgZGVmZXJyZWQucmVzb2x2ZSh2YWx1ZSk7XG4gICAgfSwgZnVuY3Rpb24gKGV4Y2VwdGlvbikge1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dElkKTtcbiAgICAgICAgZGVmZXJyZWQucmVqZWN0KGV4Y2VwdGlvbik7XG4gICAgfSwgZGVmZXJyZWQubm90aWZ5KTtcblxuICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIGEgcHJvbWlzZSBmb3IgdGhlIGdpdmVuIHZhbHVlIChvciBwcm9taXNlZCB2YWx1ZSksIHNvbWVcbiAqIG1pbGxpc2Vjb25kcyBhZnRlciBpdCByZXNvbHZlZC4gUGFzc2VzIHJlamVjdGlvbnMgaW1tZWRpYXRlbHkuXG4gKiBAcGFyYW0ge0FueSp9IHByb21pc2VcbiAqIEBwYXJhbSB7TnVtYmVyfSBtaWxsaXNlY29uZHNcbiAqIEByZXR1cm5zIGEgcHJvbWlzZSBmb3IgdGhlIHJlc29sdXRpb24gb2YgdGhlIGdpdmVuIHByb21pc2UgYWZ0ZXIgbWlsbGlzZWNvbmRzXG4gKiB0aW1lIGhhcyBlbGFwc2VkIHNpbmNlIHRoZSByZXNvbHV0aW9uIG9mIHRoZSBnaXZlbiBwcm9taXNlLlxuICogSWYgdGhlIGdpdmVuIHByb21pc2UgcmVqZWN0cywgdGhhdCBpcyBwYXNzZWQgaW1tZWRpYXRlbHkuXG4gKi9cblEuZGVsYXkgPSBmdW5jdGlvbiAob2JqZWN0LCB0aW1lb3V0KSB7XG4gICAgaWYgKHRpbWVvdXQgPT09IHZvaWQgMCkge1xuICAgICAgICB0aW1lb3V0ID0gb2JqZWN0O1xuICAgICAgICBvYmplY3QgPSB2b2lkIDA7XG4gICAgfVxuICAgIHJldHVybiBRKG9iamVjdCkuZGVsYXkodGltZW91dCk7XG59O1xuXG5Qcm9taXNlLnByb3RvdHlwZS5kZWxheSA9IGZ1bmN0aW9uICh0aW1lb3V0KSB7XG4gICAgcmV0dXJuIHRoaXMudGhlbihmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdmFyIGRlZmVycmVkID0gZGVmZXIoKTtcbiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKHZhbHVlKTtcbiAgICAgICAgfSwgdGltZW91dCk7XG4gICAgICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlO1xuICAgIH0pO1xufTtcblxuLyoqXG4gKiBQYXNzZXMgYSBjb250aW51YXRpb24gdG8gYSBOb2RlIGZ1bmN0aW9uLCB3aGljaCBpcyBjYWxsZWQgd2l0aCB0aGUgZ2l2ZW5cbiAqIGFyZ3VtZW50cyBwcm92aWRlZCBhcyBhbiBhcnJheSwgYW5kIHJldHVybnMgYSBwcm9taXNlLlxuICpcbiAqICAgICAgUS5uZmFwcGx5KEZTLnJlYWRGaWxlLCBbX19maWxlbmFtZV0pXG4gKiAgICAgIC50aGVuKGZ1bmN0aW9uIChjb250ZW50KSB7XG4gKiAgICAgIH0pXG4gKlxuICovXG5RLm5mYXBwbHkgPSBmdW5jdGlvbiAoY2FsbGJhY2ssIGFyZ3MpIHtcbiAgICByZXR1cm4gUShjYWxsYmFjaykubmZhcHBseShhcmdzKTtcbn07XG5cblByb21pc2UucHJvdG90eXBlLm5mYXBwbHkgPSBmdW5jdGlvbiAoYXJncykge1xuICAgIHZhciBkZWZlcnJlZCA9IGRlZmVyKCk7XG4gICAgdmFyIG5vZGVBcmdzID0gYXJyYXlfc2xpY2UoYXJncyk7XG4gICAgbm9kZUFyZ3MucHVzaChkZWZlcnJlZC5tYWtlTm9kZVJlc29sdmVyKCkpO1xuICAgIHRoaXMuZmFwcGx5KG5vZGVBcmdzKS5mYWlsKGRlZmVycmVkLnJlamVjdCk7XG4gICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2U7XG59O1xuXG4vKipcbiAqIFBhc3NlcyBhIGNvbnRpbnVhdGlvbiB0byBhIE5vZGUgZnVuY3Rpb24sIHdoaWNoIGlzIGNhbGxlZCB3aXRoIHRoZSBnaXZlblxuICogYXJndW1lbnRzIHByb3ZpZGVkIGluZGl2aWR1YWxseSwgYW5kIHJldHVybnMgYSBwcm9taXNlLlxuICogQGV4YW1wbGVcbiAqIFEubmZjYWxsKEZTLnJlYWRGaWxlLCBfX2ZpbGVuYW1lKVxuICogLnRoZW4oZnVuY3Rpb24gKGNvbnRlbnQpIHtcbiAqIH0pXG4gKlxuICovXG5RLm5mY2FsbCA9IGZ1bmN0aW9uIChjYWxsYmFjayAvKi4uLmFyZ3MqLykge1xuICAgIHZhciBhcmdzID0gYXJyYXlfc2xpY2UoYXJndW1lbnRzLCAxKTtcbiAgICByZXR1cm4gUShjYWxsYmFjaykubmZhcHBseShhcmdzKTtcbn07XG5cblByb21pc2UucHJvdG90eXBlLm5mY2FsbCA9IGZ1bmN0aW9uICgvKi4uLmFyZ3MqLykge1xuICAgIHZhciBub2RlQXJncyA9IGFycmF5X3NsaWNlKGFyZ3VtZW50cyk7XG4gICAgdmFyIGRlZmVycmVkID0gZGVmZXIoKTtcbiAgICBub2RlQXJncy5wdXNoKGRlZmVycmVkLm1ha2VOb2RlUmVzb2x2ZXIoKSk7XG4gICAgdGhpcy5mYXBwbHkobm9kZUFyZ3MpLmZhaWwoZGVmZXJyZWQucmVqZWN0KTtcbiAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZTtcbn07XG5cbi8qKlxuICogV3JhcHMgYSBOb2RlSlMgY29udGludWF0aW9uIHBhc3NpbmcgZnVuY3Rpb24gYW5kIHJldHVybnMgYW4gZXF1aXZhbGVudFxuICogdmVyc2lvbiB0aGF0IHJldHVybnMgYSBwcm9taXNlLlxuICogQGV4YW1wbGVcbiAqIFEubmZiaW5kKEZTLnJlYWRGaWxlLCBfX2ZpbGVuYW1lKShcInV0Zi04XCIpXG4gKiAudGhlbihjb25zb2xlLmxvZylcbiAqIC5kb25lKClcbiAqL1xuUS5uZmJpbmQgPVxuUS5kZW5vZGVpZnkgPSBmdW5jdGlvbiAoY2FsbGJhY2sgLyouLi5hcmdzKi8pIHtcbiAgICB2YXIgYmFzZUFyZ3MgPSBhcnJheV9zbGljZShhcmd1bWVudHMsIDEpO1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBub2RlQXJncyA9IGJhc2VBcmdzLmNvbmNhdChhcnJheV9zbGljZShhcmd1bWVudHMpKTtcbiAgICAgICAgdmFyIGRlZmVycmVkID0gZGVmZXIoKTtcbiAgICAgICAgbm9kZUFyZ3MucHVzaChkZWZlcnJlZC5tYWtlTm9kZVJlc29sdmVyKCkpO1xuICAgICAgICBRKGNhbGxiYWNrKS5mYXBwbHkobm9kZUFyZ3MpLmZhaWwoZGVmZXJyZWQucmVqZWN0KTtcbiAgICAgICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2U7XG4gICAgfTtcbn07XG5cblByb21pc2UucHJvdG90eXBlLm5mYmluZCA9XG5Qcm9taXNlLnByb3RvdHlwZS5kZW5vZGVpZnkgPSBmdW5jdGlvbiAoLyouLi5hcmdzKi8pIHtcbiAgICB2YXIgYXJncyA9IGFycmF5X3NsaWNlKGFyZ3VtZW50cyk7XG4gICAgYXJncy51bnNoaWZ0KHRoaXMpO1xuICAgIHJldHVybiBRLmRlbm9kZWlmeS5hcHBseSh2b2lkIDAsIGFyZ3MpO1xufTtcblxuUS5uYmluZCA9IGZ1bmN0aW9uIChjYWxsYmFjaywgdGhpc3AgLyouLi5hcmdzKi8pIHtcbiAgICB2YXIgYmFzZUFyZ3MgPSBhcnJheV9zbGljZShhcmd1bWVudHMsIDIpO1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBub2RlQXJncyA9IGJhc2VBcmdzLmNvbmNhdChhcnJheV9zbGljZShhcmd1bWVudHMpKTtcbiAgICAgICAgdmFyIGRlZmVycmVkID0gZGVmZXIoKTtcbiAgICAgICAgbm9kZUFyZ3MucHVzaChkZWZlcnJlZC5tYWtlTm9kZVJlc29sdmVyKCkpO1xuICAgICAgICBmdW5jdGlvbiBib3VuZCgpIHtcbiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjay5hcHBseSh0aGlzcCwgYXJndW1lbnRzKTtcbiAgICAgICAgfVxuICAgICAgICBRKGJvdW5kKS5mYXBwbHkobm9kZUFyZ3MpLmZhaWwoZGVmZXJyZWQucmVqZWN0KTtcbiAgICAgICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2U7XG4gICAgfTtcbn07XG5cblByb21pc2UucHJvdG90eXBlLm5iaW5kID0gZnVuY3Rpb24gKC8qdGhpc3AsIC4uLmFyZ3MqLykge1xuICAgIHZhciBhcmdzID0gYXJyYXlfc2xpY2UoYXJndW1lbnRzLCAwKTtcbiAgICBhcmdzLnVuc2hpZnQodGhpcyk7XG4gICAgcmV0dXJuIFEubmJpbmQuYXBwbHkodm9pZCAwLCBhcmdzKTtcbn07XG5cbi8qKlxuICogQ2FsbHMgYSBtZXRob2Qgb2YgYSBOb2RlLXN0eWxlIG9iamVjdCB0aGF0IGFjY2VwdHMgYSBOb2RlLXN0eWxlXG4gKiBjYWxsYmFjayB3aXRoIGEgZ2l2ZW4gYXJyYXkgb2YgYXJndW1lbnRzLCBwbHVzIGEgcHJvdmlkZWQgY2FsbGJhY2suXG4gKiBAcGFyYW0gb2JqZWN0IGFuIG9iamVjdCB0aGF0IGhhcyB0aGUgbmFtZWQgbWV0aG9kXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBuYW1lIG9mIHRoZSBtZXRob2Qgb2Ygb2JqZWN0XG4gKiBAcGFyYW0ge0FycmF5fSBhcmdzIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBtZXRob2Q7IHRoZSBjYWxsYmFja1xuICogd2lsbCBiZSBwcm92aWRlZCBieSBRIGFuZCBhcHBlbmRlZCB0byB0aGVzZSBhcmd1bWVudHMuXG4gKiBAcmV0dXJucyBhIHByb21pc2UgZm9yIHRoZSB2YWx1ZSBvciBlcnJvclxuICovXG5RLm5tYXBwbHkgPSAvLyBYWFggQXMgcHJvcG9zZWQgYnkgXCJSZWRzYW5kcm9cIlxuUS5ucG9zdCA9IGZ1bmN0aW9uIChvYmplY3QsIG5hbWUsIGFyZ3MpIHtcbiAgICByZXR1cm4gUShvYmplY3QpLm5wb3N0KG5hbWUsIGFyZ3MpO1xufTtcblxuUHJvbWlzZS5wcm90b3R5cGUubm1hcHBseSA9IC8vIFhYWCBBcyBwcm9wb3NlZCBieSBcIlJlZHNhbmRyb1wiXG5Qcm9taXNlLnByb3RvdHlwZS5ucG9zdCA9IGZ1bmN0aW9uIChuYW1lLCBhcmdzKSB7XG4gICAgdmFyIG5vZGVBcmdzID0gYXJyYXlfc2xpY2UoYXJncyB8fCBbXSk7XG4gICAgdmFyIGRlZmVycmVkID0gZGVmZXIoKTtcbiAgICBub2RlQXJncy5wdXNoKGRlZmVycmVkLm1ha2VOb2RlUmVzb2x2ZXIoKSk7XG4gICAgdGhpcy5kaXNwYXRjaChcInBvc3RcIiwgW25hbWUsIG5vZGVBcmdzXSkuZmFpbChkZWZlcnJlZC5yZWplY3QpO1xuICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlO1xufTtcblxuLyoqXG4gKiBDYWxscyBhIG1ldGhvZCBvZiBhIE5vZGUtc3R5bGUgb2JqZWN0IHRoYXQgYWNjZXB0cyBhIE5vZGUtc3R5bGVcbiAqIGNhbGxiYWNrLCBmb3J3YXJkaW5nIHRoZSBnaXZlbiB2YXJpYWRpYyBhcmd1bWVudHMsIHBsdXMgYSBwcm92aWRlZFxuICogY2FsbGJhY2sgYXJndW1lbnQuXG4gKiBAcGFyYW0gb2JqZWN0IGFuIG9iamVjdCB0aGF0IGhhcyB0aGUgbmFtZWQgbWV0aG9kXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBuYW1lIG9mIHRoZSBtZXRob2Qgb2Ygb2JqZWN0XG4gKiBAcGFyYW0gLi4uYXJncyBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgbWV0aG9kOyB0aGUgY2FsbGJhY2sgd2lsbFxuICogYmUgcHJvdmlkZWQgYnkgUSBhbmQgYXBwZW5kZWQgdG8gdGhlc2UgYXJndW1lbnRzLlxuICogQHJldHVybnMgYSBwcm9taXNlIGZvciB0aGUgdmFsdWUgb3IgZXJyb3JcbiAqL1xuUS5uc2VuZCA9IC8vIFhYWCBCYXNlZCBvbiBNYXJrIE1pbGxlcidzIHByb3Bvc2VkIFwic2VuZFwiXG5RLm5tY2FsbCA9IC8vIFhYWCBCYXNlZCBvbiBcIlJlZHNhbmRybydzXCIgcHJvcG9zYWxcblEubmludm9rZSA9IGZ1bmN0aW9uIChvYmplY3QsIG5hbWUgLyouLi5hcmdzKi8pIHtcbiAgICB2YXIgbm9kZUFyZ3MgPSBhcnJheV9zbGljZShhcmd1bWVudHMsIDIpO1xuICAgIHZhciBkZWZlcnJlZCA9IGRlZmVyKCk7XG4gICAgbm9kZUFyZ3MucHVzaChkZWZlcnJlZC5tYWtlTm9kZVJlc29sdmVyKCkpO1xuICAgIFEob2JqZWN0KS5kaXNwYXRjaChcInBvc3RcIiwgW25hbWUsIG5vZGVBcmdzXSkuZmFpbChkZWZlcnJlZC5yZWplY3QpO1xuICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlO1xufTtcblxuUHJvbWlzZS5wcm90b3R5cGUubnNlbmQgPSAvLyBYWFggQmFzZWQgb24gTWFyayBNaWxsZXIncyBwcm9wb3NlZCBcInNlbmRcIlxuUHJvbWlzZS5wcm90b3R5cGUubm1jYWxsID0gLy8gWFhYIEJhc2VkIG9uIFwiUmVkc2FuZHJvJ3NcIiBwcm9wb3NhbFxuUHJvbWlzZS5wcm90b3R5cGUubmludm9rZSA9IGZ1bmN0aW9uIChuYW1lIC8qLi4uYXJncyovKSB7XG4gICAgdmFyIG5vZGVBcmdzID0gYXJyYXlfc2xpY2UoYXJndW1lbnRzLCAxKTtcbiAgICB2YXIgZGVmZXJyZWQgPSBkZWZlcigpO1xuICAgIG5vZGVBcmdzLnB1c2goZGVmZXJyZWQubWFrZU5vZGVSZXNvbHZlcigpKTtcbiAgICB0aGlzLmRpc3BhdGNoKFwicG9zdFwiLCBbbmFtZSwgbm9kZUFyZ3NdKS5mYWlsKGRlZmVycmVkLnJlamVjdCk7XG4gICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2U7XG59O1xuXG4vKipcbiAqIElmIGEgZnVuY3Rpb24gd291bGQgbGlrZSB0byBzdXBwb3J0IGJvdGggTm9kZSBjb250aW51YXRpb24tcGFzc2luZy1zdHlsZSBhbmRcbiAqIHByb21pc2UtcmV0dXJuaW5nLXN0eWxlLCBpdCBjYW4gZW5kIGl0cyBpbnRlcm5hbCBwcm9taXNlIGNoYWluIHdpdGhcbiAqIGBub2RlaWZ5KG5vZGViYWNrKWAsIGZvcndhcmRpbmcgdGhlIG9wdGlvbmFsIG5vZGViYWNrIGFyZ3VtZW50LiAgSWYgdGhlIHVzZXJcbiAqIGVsZWN0cyB0byB1c2UgYSBub2RlYmFjaywgdGhlIHJlc3VsdCB3aWxsIGJlIHNlbnQgdGhlcmUuICBJZiB0aGV5IGRvIG5vdFxuICogcGFzcyBhIG5vZGViYWNrLCB0aGV5IHdpbGwgcmVjZWl2ZSB0aGUgcmVzdWx0IHByb21pc2UuXG4gKiBAcGFyYW0gb2JqZWN0IGEgcmVzdWx0IChvciBhIHByb21pc2UgZm9yIGEgcmVzdWx0KVxuICogQHBhcmFtIHtGdW5jdGlvbn0gbm9kZWJhY2sgYSBOb2RlLmpzLXN0eWxlIGNhbGxiYWNrXG4gKiBAcmV0dXJucyBlaXRoZXIgdGhlIHByb21pc2Ugb3Igbm90aGluZ1xuICovXG5RLm5vZGVpZnkgPSBub2RlaWZ5O1xuZnVuY3Rpb24gbm9kZWlmeShvYmplY3QsIG5vZGViYWNrKSB7XG4gICAgcmV0dXJuIFEob2JqZWN0KS5ub2RlaWZ5KG5vZGViYWNrKTtcbn1cblxuUHJvbWlzZS5wcm90b3R5cGUubm9kZWlmeSA9IGZ1bmN0aW9uIChub2RlYmFjaykge1xuICAgIGlmIChub2RlYmFjaykge1xuICAgICAgICB0aGlzLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICBRLm5leHRUaWNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBub2RlYmFjayhudWxsLCB2YWx1ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSwgZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgICAgICBRLm5leHRUaWNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBub2RlYmFjayhlcnJvcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxufTtcblxuUS5ub0NvbmZsaWN0ID0gZnVuY3Rpb24oKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiUS5ub0NvbmZsaWN0IG9ubHkgd29ya3Mgd2hlbiBRIGlzIHVzZWQgYXMgYSBnbG9iYWxcIik7XG59O1xuXG4vLyBBbGwgY29kZSBiZWZvcmUgdGhpcyBwb2ludCB3aWxsIGJlIGZpbHRlcmVkIGZyb20gc3RhY2sgdHJhY2VzLlxudmFyIHFFbmRpbmdMaW5lID0gY2FwdHVyZUxpbmUoKTtcblxucmV0dXJuIFE7XG5cbn0pO1xuIiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIHB1bnljb2RlID0gcmVxdWlyZSgncHVueWNvZGUnKTtcbnZhciB1dGlsID0gcmVxdWlyZSgnLi91dGlsJyk7XG5cbmV4cG9ydHMucGFyc2UgPSB1cmxQYXJzZTtcbmV4cG9ydHMucmVzb2x2ZSA9IHVybFJlc29sdmU7XG5leHBvcnRzLnJlc29sdmVPYmplY3QgPSB1cmxSZXNvbHZlT2JqZWN0O1xuZXhwb3J0cy5mb3JtYXQgPSB1cmxGb3JtYXQ7XG5cbmV4cG9ydHMuVXJsID0gVXJsO1xuXG5mdW5jdGlvbiBVcmwoKSB7XG4gIHRoaXMucHJvdG9jb2wgPSBudWxsO1xuICB0aGlzLnNsYXNoZXMgPSBudWxsO1xuICB0aGlzLmF1dGggPSBudWxsO1xuICB0aGlzLmhvc3QgPSBudWxsO1xuICB0aGlzLnBvcnQgPSBudWxsO1xuICB0aGlzLmhvc3RuYW1lID0gbnVsbDtcbiAgdGhpcy5oYXNoID0gbnVsbDtcbiAgdGhpcy5zZWFyY2ggPSBudWxsO1xuICB0aGlzLnF1ZXJ5ID0gbnVsbDtcbiAgdGhpcy5wYXRobmFtZSA9IG51bGw7XG4gIHRoaXMucGF0aCA9IG51bGw7XG4gIHRoaXMuaHJlZiA9IG51bGw7XG59XG5cbi8vIFJlZmVyZW5jZTogUkZDIDM5ODYsIFJGQyAxODA4LCBSRkMgMjM5NlxuXG4vLyBkZWZpbmUgdGhlc2UgaGVyZSBzbyBhdCBsZWFzdCB0aGV5IG9ubHkgaGF2ZSB0byBiZVxuLy8gY29tcGlsZWQgb25jZSBvbiB0aGUgZmlyc3QgbW9kdWxlIGxvYWQuXG52YXIgcHJvdG9jb2xQYXR0ZXJuID0gL14oW2EtejAtOS4rLV0rOikvaSxcbiAgICBwb3J0UGF0dGVybiA9IC86WzAtOV0qJC8sXG5cbiAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIGEgc2ltcGxlIHBhdGggVVJMXG4gICAgc2ltcGxlUGF0aFBhdHRlcm4gPSAvXihcXC9cXC8/KD8hXFwvKVteXFw/XFxzXSopKFxcP1teXFxzXSopPyQvLFxuXG4gICAgLy8gUkZDIDIzOTY6IGNoYXJhY3RlcnMgcmVzZXJ2ZWQgZm9yIGRlbGltaXRpbmcgVVJMcy5cbiAgICAvLyBXZSBhY3R1YWxseSBqdXN0IGF1dG8tZXNjYXBlIHRoZXNlLlxuICAgIGRlbGltcyA9IFsnPCcsICc+JywgJ1wiJywgJ2AnLCAnICcsICdcXHInLCAnXFxuJywgJ1xcdCddLFxuXG4gICAgLy8gUkZDIDIzOTY6IGNoYXJhY3RlcnMgbm90IGFsbG93ZWQgZm9yIHZhcmlvdXMgcmVhc29ucy5cbiAgICB1bndpc2UgPSBbJ3snLCAnfScsICd8JywgJ1xcXFwnLCAnXicsICdgJ10uY29uY2F0KGRlbGltcyksXG5cbiAgICAvLyBBbGxvd2VkIGJ5IFJGQ3MsIGJ1dCBjYXVzZSBvZiBYU1MgYXR0YWNrcy4gIEFsd2F5cyBlc2NhcGUgdGhlc2UuXG4gICAgYXV0b0VzY2FwZSA9IFsnXFwnJ10uY29uY2F0KHVud2lzZSksXG4gICAgLy8gQ2hhcmFjdGVycyB0aGF0IGFyZSBuZXZlciBldmVyIGFsbG93ZWQgaW4gYSBob3N0bmFtZS5cbiAgICAvLyBOb3RlIHRoYXQgYW55IGludmFsaWQgY2hhcnMgYXJlIGFsc28gaGFuZGxlZCwgYnV0IHRoZXNlXG4gICAgLy8gYXJlIHRoZSBvbmVzIHRoYXQgYXJlICpleHBlY3RlZCogdG8gYmUgc2Vlbiwgc28gd2UgZmFzdC1wYXRoXG4gICAgLy8gdGhlbS5cbiAgICBub25Ib3N0Q2hhcnMgPSBbJyUnLCAnLycsICc/JywgJzsnLCAnIyddLmNvbmNhdChhdXRvRXNjYXBlKSxcbiAgICBob3N0RW5kaW5nQ2hhcnMgPSBbJy8nLCAnPycsICcjJ10sXG4gICAgaG9zdG5hbWVNYXhMZW4gPSAyNTUsXG4gICAgaG9zdG5hbWVQYXJ0UGF0dGVybiA9IC9eWythLXowLTlBLVpfLV17MCw2M30kLyxcbiAgICBob3N0bmFtZVBhcnRTdGFydCA9IC9eKFsrYS16MC05QS1aXy1dezAsNjN9KSguKikkLyxcbiAgICAvLyBwcm90b2NvbHMgdGhhdCBjYW4gYWxsb3cgXCJ1bnNhZmVcIiBhbmQgXCJ1bndpc2VcIiBjaGFycy5cbiAgICB1bnNhZmVQcm90b2NvbCA9IHtcbiAgICAgICdqYXZhc2NyaXB0JzogdHJ1ZSxcbiAgICAgICdqYXZhc2NyaXB0Oic6IHRydWVcbiAgICB9LFxuICAgIC8vIHByb3RvY29scyB0aGF0IG5ldmVyIGhhdmUgYSBob3N0bmFtZS5cbiAgICBob3N0bGVzc1Byb3RvY29sID0ge1xuICAgICAgJ2phdmFzY3JpcHQnOiB0cnVlLFxuICAgICAgJ2phdmFzY3JpcHQ6JzogdHJ1ZVxuICAgIH0sXG4gICAgLy8gcHJvdG9jb2xzIHRoYXQgYWx3YXlzIGNvbnRhaW4gYSAvLyBiaXQuXG4gICAgc2xhc2hlZFByb3RvY29sID0ge1xuICAgICAgJ2h0dHAnOiB0cnVlLFxuICAgICAgJ2h0dHBzJzogdHJ1ZSxcbiAgICAgICdmdHAnOiB0cnVlLFxuICAgICAgJ2dvcGhlcic6IHRydWUsXG4gICAgICAnZmlsZSc6IHRydWUsXG4gICAgICAnaHR0cDonOiB0cnVlLFxuICAgICAgJ2h0dHBzOic6IHRydWUsXG4gICAgICAnZnRwOic6IHRydWUsXG4gICAgICAnZ29waGVyOic6IHRydWUsXG4gICAgICAnZmlsZTonOiB0cnVlXG4gICAgfSxcbiAgICBxdWVyeXN0cmluZyA9IHJlcXVpcmUoJ3F1ZXJ5c3RyaW5nJyk7XG5cbmZ1bmN0aW9uIHVybFBhcnNlKHVybCwgcGFyc2VRdWVyeVN0cmluZywgc2xhc2hlc0Rlbm90ZUhvc3QpIHtcbiAgaWYgKHVybCAmJiB1dGlsLmlzT2JqZWN0KHVybCkgJiYgdXJsIGluc3RhbmNlb2YgVXJsKSByZXR1cm4gdXJsO1xuXG4gIHZhciB1ID0gbmV3IFVybDtcbiAgdS5wYXJzZSh1cmwsIHBhcnNlUXVlcnlTdHJpbmcsIHNsYXNoZXNEZW5vdGVIb3N0KTtcbiAgcmV0dXJuIHU7XG59XG5cblVybC5wcm90b3R5cGUucGFyc2UgPSBmdW5jdGlvbih1cmwsIHBhcnNlUXVlcnlTdHJpbmcsIHNsYXNoZXNEZW5vdGVIb3N0KSB7XG4gIGlmICghdXRpbC5pc1N0cmluZyh1cmwpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlBhcmFtZXRlciAndXJsJyBtdXN0IGJlIGEgc3RyaW5nLCBub3QgXCIgKyB0eXBlb2YgdXJsKTtcbiAgfVxuXG4gIC8vIENvcHkgY2hyb21lLCBJRSwgb3BlcmEgYmFja3NsYXNoLWhhbmRsaW5nIGJlaGF2aW9yLlxuICAvLyBCYWNrIHNsYXNoZXMgYmVmb3JlIHRoZSBxdWVyeSBzdHJpbmcgZ2V0IGNvbnZlcnRlZCB0byBmb3J3YXJkIHNsYXNoZXNcbiAgLy8gU2VlOiBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9MjU5MTZcbiAgdmFyIHF1ZXJ5SW5kZXggPSB1cmwuaW5kZXhPZignPycpLFxuICAgICAgc3BsaXR0ZXIgPVxuICAgICAgICAgIChxdWVyeUluZGV4ICE9PSAtMSAmJiBxdWVyeUluZGV4IDwgdXJsLmluZGV4T2YoJyMnKSkgPyAnPycgOiAnIycsXG4gICAgICB1U3BsaXQgPSB1cmwuc3BsaXQoc3BsaXR0ZXIpLFxuICAgICAgc2xhc2hSZWdleCA9IC9cXFxcL2c7XG4gIHVTcGxpdFswXSA9IHVTcGxpdFswXS5yZXBsYWNlKHNsYXNoUmVnZXgsICcvJyk7XG4gIHVybCA9IHVTcGxpdC5qb2luKHNwbGl0dGVyKTtcblxuICB2YXIgcmVzdCA9IHVybDtcblxuICAvLyB0cmltIGJlZm9yZSBwcm9jZWVkaW5nLlxuICAvLyBUaGlzIGlzIHRvIHN1cHBvcnQgcGFyc2Ugc3R1ZmYgbGlrZSBcIiAgaHR0cDovL2Zvby5jb20gIFxcblwiXG4gIHJlc3QgPSByZXN0LnRyaW0oKTtcblxuICBpZiAoIXNsYXNoZXNEZW5vdGVIb3N0ICYmIHVybC5zcGxpdCgnIycpLmxlbmd0aCA9PT0gMSkge1xuICAgIC8vIFRyeSBmYXN0IHBhdGggcmVnZXhwXG4gICAgdmFyIHNpbXBsZVBhdGggPSBzaW1wbGVQYXRoUGF0dGVybi5leGVjKHJlc3QpO1xuICAgIGlmIChzaW1wbGVQYXRoKSB7XG4gICAgICB0aGlzLnBhdGggPSByZXN0O1xuICAgICAgdGhpcy5ocmVmID0gcmVzdDtcbiAgICAgIHRoaXMucGF0aG5hbWUgPSBzaW1wbGVQYXRoWzFdO1xuICAgICAgaWYgKHNpbXBsZVBhdGhbMl0pIHtcbiAgICAgICAgdGhpcy5zZWFyY2ggPSBzaW1wbGVQYXRoWzJdO1xuICAgICAgICBpZiAocGFyc2VRdWVyeVN0cmluZykge1xuICAgICAgICAgIHRoaXMucXVlcnkgPSBxdWVyeXN0cmluZy5wYXJzZSh0aGlzLnNlYXJjaC5zdWJzdHIoMSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMucXVlcnkgPSB0aGlzLnNlYXJjaC5zdWJzdHIoMSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAocGFyc2VRdWVyeVN0cmluZykge1xuICAgICAgICB0aGlzLnNlYXJjaCA9ICcnO1xuICAgICAgICB0aGlzLnF1ZXJ5ID0ge307XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gIH1cblxuICB2YXIgcHJvdG8gPSBwcm90b2NvbFBhdHRlcm4uZXhlYyhyZXN0KTtcbiAgaWYgKHByb3RvKSB7XG4gICAgcHJvdG8gPSBwcm90b1swXTtcbiAgICB2YXIgbG93ZXJQcm90byA9IHByb3RvLnRvTG93ZXJDYXNlKCk7XG4gICAgdGhpcy5wcm90b2NvbCA9IGxvd2VyUHJvdG87XG4gICAgcmVzdCA9IHJlc3Quc3Vic3RyKHByb3RvLmxlbmd0aCk7XG4gIH1cblxuICAvLyBmaWd1cmUgb3V0IGlmIGl0J3MgZ290IGEgaG9zdFxuICAvLyB1c2VyQHNlcnZlciBpcyAqYWx3YXlzKiBpbnRlcnByZXRlZCBhcyBhIGhvc3RuYW1lLCBhbmQgdXJsXG4gIC8vIHJlc29sdXRpb24gd2lsbCB0cmVhdCAvL2Zvby9iYXIgYXMgaG9zdD1mb28scGF0aD1iYXIgYmVjYXVzZSB0aGF0J3NcbiAgLy8gaG93IHRoZSBicm93c2VyIHJlc29sdmVzIHJlbGF0aXZlIFVSTHMuXG4gIGlmIChzbGFzaGVzRGVub3RlSG9zdCB8fCBwcm90byB8fCByZXN0Lm1hdGNoKC9eXFwvXFwvW15AXFwvXStAW15AXFwvXSsvKSkge1xuICAgIHZhciBzbGFzaGVzID0gcmVzdC5zdWJzdHIoMCwgMikgPT09ICcvLyc7XG4gICAgaWYgKHNsYXNoZXMgJiYgIShwcm90byAmJiBob3N0bGVzc1Byb3RvY29sW3Byb3RvXSkpIHtcbiAgICAgIHJlc3QgPSByZXN0LnN1YnN0cigyKTtcbiAgICAgIHRoaXMuc2xhc2hlcyA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgaWYgKCFob3N0bGVzc1Byb3RvY29sW3Byb3RvXSAmJlxuICAgICAgKHNsYXNoZXMgfHwgKHByb3RvICYmICFzbGFzaGVkUHJvdG9jb2xbcHJvdG9dKSkpIHtcblxuICAgIC8vIHRoZXJlJ3MgYSBob3N0bmFtZS5cbiAgICAvLyB0aGUgZmlyc3QgaW5zdGFuY2Ugb2YgLywgPywgOywgb3IgIyBlbmRzIHRoZSBob3N0LlxuICAgIC8vXG4gICAgLy8gSWYgdGhlcmUgaXMgYW4gQCBpbiB0aGUgaG9zdG5hbWUsIHRoZW4gbm9uLWhvc3QgY2hhcnMgKmFyZSogYWxsb3dlZFxuICAgIC8vIHRvIHRoZSBsZWZ0IG9mIHRoZSBsYXN0IEAgc2lnbiwgdW5sZXNzIHNvbWUgaG9zdC1lbmRpbmcgY2hhcmFjdGVyXG4gICAgLy8gY29tZXMgKmJlZm9yZSogdGhlIEAtc2lnbi5cbiAgICAvLyBVUkxzIGFyZSBvYm5veGlvdXMuXG4gICAgLy9cbiAgICAvLyBleDpcbiAgICAvLyBodHRwOi8vYUBiQGMvID0+IHVzZXI6YUBiIGhvc3Q6Y1xuICAgIC8vIGh0dHA6Ly9hQGI/QGMgPT4gdXNlcjphIGhvc3Q6YyBwYXRoOi8/QGNcblxuICAgIC8vIHYwLjEyIFRPRE8oaXNhYWNzKTogVGhpcyBpcyBub3QgcXVpdGUgaG93IENocm9tZSBkb2VzIHRoaW5ncy5cbiAgICAvLyBSZXZpZXcgb3VyIHRlc3QgY2FzZSBhZ2FpbnN0IGJyb3dzZXJzIG1vcmUgY29tcHJlaGVuc2l2ZWx5LlxuXG4gICAgLy8gZmluZCB0aGUgZmlyc3QgaW5zdGFuY2Ugb2YgYW55IGhvc3RFbmRpbmdDaGFyc1xuICAgIHZhciBob3N0RW5kID0gLTE7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBob3N0RW5kaW5nQ2hhcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBoZWMgPSByZXN0LmluZGV4T2YoaG9zdEVuZGluZ0NoYXJzW2ldKTtcbiAgICAgIGlmIChoZWMgIT09IC0xICYmIChob3N0RW5kID09PSAtMSB8fCBoZWMgPCBob3N0RW5kKSlcbiAgICAgICAgaG9zdEVuZCA9IGhlYztcbiAgICB9XG5cbiAgICAvLyBhdCB0aGlzIHBvaW50LCBlaXRoZXIgd2UgaGF2ZSBhbiBleHBsaWNpdCBwb2ludCB3aGVyZSB0aGVcbiAgICAvLyBhdXRoIHBvcnRpb24gY2Fubm90IGdvIHBhc3QsIG9yIHRoZSBsYXN0IEAgY2hhciBpcyB0aGUgZGVjaWRlci5cbiAgICB2YXIgYXV0aCwgYXRTaWduO1xuICAgIGlmIChob3N0RW5kID09PSAtMSkge1xuICAgICAgLy8gYXRTaWduIGNhbiBiZSBhbnl3aGVyZS5cbiAgICAgIGF0U2lnbiA9IHJlc3QubGFzdEluZGV4T2YoJ0AnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gYXRTaWduIG11c3QgYmUgaW4gYXV0aCBwb3J0aW9uLlxuICAgICAgLy8gaHR0cDovL2FAYi9jQGQgPT4gaG9zdDpiIGF1dGg6YSBwYXRoOi9jQGRcbiAgICAgIGF0U2lnbiA9IHJlc3QubGFzdEluZGV4T2YoJ0AnLCBob3N0RW5kKTtcbiAgICB9XG5cbiAgICAvLyBOb3cgd2UgaGF2ZSBhIHBvcnRpb24gd2hpY2ggaXMgZGVmaW5pdGVseSB0aGUgYXV0aC5cbiAgICAvLyBQdWxsIHRoYXQgb2ZmLlxuICAgIGlmIChhdFNpZ24gIT09IC0xKSB7XG4gICAgICBhdXRoID0gcmVzdC5zbGljZSgwLCBhdFNpZ24pO1xuICAgICAgcmVzdCA9IHJlc3Quc2xpY2UoYXRTaWduICsgMSk7XG4gICAgICB0aGlzLmF1dGggPSBkZWNvZGVVUklDb21wb25lbnQoYXV0aCk7XG4gICAgfVxuXG4gICAgLy8gdGhlIGhvc3QgaXMgdGhlIHJlbWFpbmluZyB0byB0aGUgbGVmdCBvZiB0aGUgZmlyc3Qgbm9uLWhvc3QgY2hhclxuICAgIGhvc3RFbmQgPSAtMTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vbkhvc3RDaGFycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGhlYyA9IHJlc3QuaW5kZXhPZihub25Ib3N0Q2hhcnNbaV0pO1xuICAgICAgaWYgKGhlYyAhPT0gLTEgJiYgKGhvc3RFbmQgPT09IC0xIHx8IGhlYyA8IGhvc3RFbmQpKVxuICAgICAgICBob3N0RW5kID0gaGVjO1xuICAgIH1cbiAgICAvLyBpZiB3ZSBzdGlsbCBoYXZlIG5vdCBoaXQgaXQsIHRoZW4gdGhlIGVudGlyZSB0aGluZyBpcyBhIGhvc3QuXG4gICAgaWYgKGhvc3RFbmQgPT09IC0xKVxuICAgICAgaG9zdEVuZCA9IHJlc3QubGVuZ3RoO1xuXG4gICAgdGhpcy5ob3N0ID0gcmVzdC5zbGljZSgwLCBob3N0RW5kKTtcbiAgICByZXN0ID0gcmVzdC5zbGljZShob3N0RW5kKTtcblxuICAgIC8vIHB1bGwgb3V0IHBvcnQuXG4gICAgdGhpcy5wYXJzZUhvc3QoKTtcblxuICAgIC8vIHdlJ3ZlIGluZGljYXRlZCB0aGF0IHRoZXJlIGlzIGEgaG9zdG5hbWUsXG4gICAgLy8gc28gZXZlbiBpZiBpdCdzIGVtcHR5LCBpdCBoYXMgdG8gYmUgcHJlc2VudC5cbiAgICB0aGlzLmhvc3RuYW1lID0gdGhpcy5ob3N0bmFtZSB8fCAnJztcblxuICAgIC8vIGlmIGhvc3RuYW1lIGJlZ2lucyB3aXRoIFsgYW5kIGVuZHMgd2l0aCBdXG4gICAgLy8gYXNzdW1lIHRoYXQgaXQncyBhbiBJUHY2IGFkZHJlc3MuXG4gICAgdmFyIGlwdjZIb3N0bmFtZSA9IHRoaXMuaG9zdG5hbWVbMF0gPT09ICdbJyAmJlxuICAgICAgICB0aGlzLmhvc3RuYW1lW3RoaXMuaG9zdG5hbWUubGVuZ3RoIC0gMV0gPT09ICddJztcblxuICAgIC8vIHZhbGlkYXRlIGEgbGl0dGxlLlxuICAgIGlmICghaXB2Nkhvc3RuYW1lKSB7XG4gICAgICB2YXIgaG9zdHBhcnRzID0gdGhpcy5ob3N0bmFtZS5zcGxpdCgvXFwuLyk7XG4gICAgICBmb3IgKHZhciBpID0gMCwgbCA9IGhvc3RwYXJ0cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgdmFyIHBhcnQgPSBob3N0cGFydHNbaV07XG4gICAgICAgIGlmICghcGFydCkgY29udGludWU7XG4gICAgICAgIGlmICghcGFydC5tYXRjaChob3N0bmFtZVBhcnRQYXR0ZXJuKSkge1xuICAgICAgICAgIHZhciBuZXdwYXJ0ID0gJyc7XG4gICAgICAgICAgZm9yICh2YXIgaiA9IDAsIGsgPSBwYXJ0Lmxlbmd0aDsgaiA8IGs7IGorKykge1xuICAgICAgICAgICAgaWYgKHBhcnQuY2hhckNvZGVBdChqKSA+IDEyNykge1xuICAgICAgICAgICAgICAvLyB3ZSByZXBsYWNlIG5vbi1BU0NJSSBjaGFyIHdpdGggYSB0ZW1wb3JhcnkgcGxhY2Vob2xkZXJcbiAgICAgICAgICAgICAgLy8gd2UgbmVlZCB0aGlzIHRvIG1ha2Ugc3VyZSBzaXplIG9mIGhvc3RuYW1lIGlzIG5vdFxuICAgICAgICAgICAgICAvLyBicm9rZW4gYnkgcmVwbGFjaW5nIG5vbi1BU0NJSSBieSBub3RoaW5nXG4gICAgICAgICAgICAgIG5ld3BhcnQgKz0gJ3gnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgbmV3cGFydCArPSBwYXJ0W2pdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICAvLyB3ZSB0ZXN0IGFnYWluIHdpdGggQVNDSUkgY2hhciBvbmx5XG4gICAgICAgICAgaWYgKCFuZXdwYXJ0Lm1hdGNoKGhvc3RuYW1lUGFydFBhdHRlcm4pKSB7XG4gICAgICAgICAgICB2YXIgdmFsaWRQYXJ0cyA9IGhvc3RwYXJ0cy5zbGljZSgwLCBpKTtcbiAgICAgICAgICAgIHZhciBub3RIb3N0ID0gaG9zdHBhcnRzLnNsaWNlKGkgKyAxKTtcbiAgICAgICAgICAgIHZhciBiaXQgPSBwYXJ0Lm1hdGNoKGhvc3RuYW1lUGFydFN0YXJ0KTtcbiAgICAgICAgICAgIGlmIChiaXQpIHtcbiAgICAgICAgICAgICAgdmFsaWRQYXJ0cy5wdXNoKGJpdFsxXSk7XG4gICAgICAgICAgICAgIG5vdEhvc3QudW5zaGlmdChiaXRbMl0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG5vdEhvc3QubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIHJlc3QgPSAnLycgKyBub3RIb3N0LmpvaW4oJy4nKSArIHJlc3Q7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmhvc3RuYW1lID0gdmFsaWRQYXJ0cy5qb2luKCcuJyk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5ob3N0bmFtZS5sZW5ndGggPiBob3N0bmFtZU1heExlbikge1xuICAgICAgdGhpcy5ob3N0bmFtZSA9ICcnO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBob3N0bmFtZXMgYXJlIGFsd2F5cyBsb3dlciBjYXNlLlxuICAgICAgdGhpcy5ob3N0bmFtZSA9IHRoaXMuaG9zdG5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICB9XG5cbiAgICBpZiAoIWlwdjZIb3N0bmFtZSkge1xuICAgICAgLy8gSUROQSBTdXBwb3J0OiBSZXR1cm5zIGEgcHVueWNvZGVkIHJlcHJlc2VudGF0aW9uIG9mIFwiZG9tYWluXCIuXG4gICAgICAvLyBJdCBvbmx5IGNvbnZlcnRzIHBhcnRzIG9mIHRoZSBkb21haW4gbmFtZSB0aGF0XG4gICAgICAvLyBoYXZlIG5vbi1BU0NJSSBjaGFyYWN0ZXJzLCBpLmUuIGl0IGRvZXNuJ3QgbWF0dGVyIGlmXG4gICAgICAvLyB5b3UgY2FsbCBpdCB3aXRoIGEgZG9tYWluIHRoYXQgYWxyZWFkeSBpcyBBU0NJSS1vbmx5LlxuICAgICAgdGhpcy5ob3N0bmFtZSA9IHB1bnljb2RlLnRvQVNDSUkodGhpcy5ob3N0bmFtZSk7XG4gICAgfVxuXG4gICAgdmFyIHAgPSB0aGlzLnBvcnQgPyAnOicgKyB0aGlzLnBvcnQgOiAnJztcbiAgICB2YXIgaCA9IHRoaXMuaG9zdG5hbWUgfHwgJyc7XG4gICAgdGhpcy5ob3N0ID0gaCArIHA7XG4gICAgdGhpcy5ocmVmICs9IHRoaXMuaG9zdDtcblxuICAgIC8vIHN0cmlwIFsgYW5kIF0gZnJvbSB0aGUgaG9zdG5hbWVcbiAgICAvLyB0aGUgaG9zdCBmaWVsZCBzdGlsbCByZXRhaW5zIHRoZW0sIHRob3VnaFxuICAgIGlmIChpcHY2SG9zdG5hbWUpIHtcbiAgICAgIHRoaXMuaG9zdG5hbWUgPSB0aGlzLmhvc3RuYW1lLnN1YnN0cigxLCB0aGlzLmhvc3RuYW1lLmxlbmd0aCAtIDIpO1xuICAgICAgaWYgKHJlc3RbMF0gIT09ICcvJykge1xuICAgICAgICByZXN0ID0gJy8nICsgcmVzdDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBub3cgcmVzdCBpcyBzZXQgdG8gdGhlIHBvc3QtaG9zdCBzdHVmZi5cbiAgLy8gY2hvcCBvZmYgYW55IGRlbGltIGNoYXJzLlxuICBpZiAoIXVuc2FmZVByb3RvY29sW2xvd2VyUHJvdG9dKSB7XG5cbiAgICAvLyBGaXJzdCwgbWFrZSAxMDAlIHN1cmUgdGhhdCBhbnkgXCJhdXRvRXNjYXBlXCIgY2hhcnMgZ2V0XG4gICAgLy8gZXNjYXBlZCwgZXZlbiBpZiBlbmNvZGVVUklDb21wb25lbnQgZG9lc24ndCB0aGluayB0aGV5XG4gICAgLy8gbmVlZCB0byBiZS5cbiAgICBmb3IgKHZhciBpID0gMCwgbCA9IGF1dG9Fc2NhcGUubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICB2YXIgYWUgPSBhdXRvRXNjYXBlW2ldO1xuICAgICAgaWYgKHJlc3QuaW5kZXhPZihhZSkgPT09IC0xKVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIHZhciBlc2MgPSBlbmNvZGVVUklDb21wb25lbnQoYWUpO1xuICAgICAgaWYgKGVzYyA9PT0gYWUpIHtcbiAgICAgICAgZXNjID0gZXNjYXBlKGFlKTtcbiAgICAgIH1cbiAgICAgIHJlc3QgPSByZXN0LnNwbGl0KGFlKS5qb2luKGVzYyk7XG4gICAgfVxuICB9XG5cblxuICAvLyBjaG9wIG9mZiBmcm9tIHRoZSB0YWlsIGZpcnN0LlxuICB2YXIgaGFzaCA9IHJlc3QuaW5kZXhPZignIycpO1xuICBpZiAoaGFzaCAhPT0gLTEpIHtcbiAgICAvLyBnb3QgYSBmcmFnbWVudCBzdHJpbmcuXG4gICAgdGhpcy5oYXNoID0gcmVzdC5zdWJzdHIoaGFzaCk7XG4gICAgcmVzdCA9IHJlc3Quc2xpY2UoMCwgaGFzaCk7XG4gIH1cbiAgdmFyIHFtID0gcmVzdC5pbmRleE9mKCc/Jyk7XG4gIGlmIChxbSAhPT0gLTEpIHtcbiAgICB0aGlzLnNlYXJjaCA9IHJlc3Quc3Vic3RyKHFtKTtcbiAgICB0aGlzLnF1ZXJ5ID0gcmVzdC5zdWJzdHIocW0gKyAxKTtcbiAgICBpZiAocGFyc2VRdWVyeVN0cmluZykge1xuICAgICAgdGhpcy5xdWVyeSA9IHF1ZXJ5c3RyaW5nLnBhcnNlKHRoaXMucXVlcnkpO1xuICAgIH1cbiAgICByZXN0ID0gcmVzdC5zbGljZSgwLCBxbSk7XG4gIH0gZWxzZSBpZiAocGFyc2VRdWVyeVN0cmluZykge1xuICAgIC8vIG5vIHF1ZXJ5IHN0cmluZywgYnV0IHBhcnNlUXVlcnlTdHJpbmcgc3RpbGwgcmVxdWVzdGVkXG4gICAgdGhpcy5zZWFyY2ggPSAnJztcbiAgICB0aGlzLnF1ZXJ5ID0ge307XG4gIH1cbiAgaWYgKHJlc3QpIHRoaXMucGF0aG5hbWUgPSByZXN0O1xuICBpZiAoc2xhc2hlZFByb3RvY29sW2xvd2VyUHJvdG9dICYmXG4gICAgICB0aGlzLmhvc3RuYW1lICYmICF0aGlzLnBhdGhuYW1lKSB7XG4gICAgdGhpcy5wYXRobmFtZSA9ICcvJztcbiAgfVxuXG4gIC8vdG8gc3VwcG9ydCBodHRwLnJlcXVlc3RcbiAgaWYgKHRoaXMucGF0aG5hbWUgfHwgdGhpcy5zZWFyY2gpIHtcbiAgICB2YXIgcCA9IHRoaXMucGF0aG5hbWUgfHwgJyc7XG4gICAgdmFyIHMgPSB0aGlzLnNlYXJjaCB8fCAnJztcbiAgICB0aGlzLnBhdGggPSBwICsgcztcbiAgfVxuXG4gIC8vIGZpbmFsbHksIHJlY29uc3RydWN0IHRoZSBocmVmIGJhc2VkIG9uIHdoYXQgaGFzIGJlZW4gdmFsaWRhdGVkLlxuICB0aGlzLmhyZWYgPSB0aGlzLmZvcm1hdCgpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8vIGZvcm1hdCBhIHBhcnNlZCBvYmplY3QgaW50byBhIHVybCBzdHJpbmdcbmZ1bmN0aW9uIHVybEZvcm1hdChvYmopIHtcbiAgLy8gZW5zdXJlIGl0J3MgYW4gb2JqZWN0LCBhbmQgbm90IGEgc3RyaW5nIHVybC5cbiAgLy8gSWYgaXQncyBhbiBvYmosIHRoaXMgaXMgYSBuby1vcC5cbiAgLy8gdGhpcyB3YXksIHlvdSBjYW4gY2FsbCB1cmxfZm9ybWF0KCkgb24gc3RyaW5nc1xuICAvLyB0byBjbGVhbiB1cCBwb3RlbnRpYWxseSB3b25reSB1cmxzLlxuICBpZiAodXRpbC5pc1N0cmluZyhvYmopKSBvYmogPSB1cmxQYXJzZShvYmopO1xuICBpZiAoIShvYmogaW5zdGFuY2VvZiBVcmwpKSByZXR1cm4gVXJsLnByb3RvdHlwZS5mb3JtYXQuY2FsbChvYmopO1xuICByZXR1cm4gb2JqLmZvcm1hdCgpO1xufVxuXG5VcmwucHJvdG90eXBlLmZvcm1hdCA9IGZ1bmN0aW9uKCkge1xuICB2YXIgYXV0aCA9IHRoaXMuYXV0aCB8fCAnJztcbiAgaWYgKGF1dGgpIHtcbiAgICBhdXRoID0gZW5jb2RlVVJJQ29tcG9uZW50KGF1dGgpO1xuICAgIGF1dGggPSBhdXRoLnJlcGxhY2UoLyUzQS9pLCAnOicpO1xuICAgIGF1dGggKz0gJ0AnO1xuICB9XG5cbiAgdmFyIHByb3RvY29sID0gdGhpcy5wcm90b2NvbCB8fCAnJyxcbiAgICAgIHBhdGhuYW1lID0gdGhpcy5wYXRobmFtZSB8fCAnJyxcbiAgICAgIGhhc2ggPSB0aGlzLmhhc2ggfHwgJycsXG4gICAgICBob3N0ID0gZmFsc2UsXG4gICAgICBxdWVyeSA9ICcnO1xuXG4gIGlmICh0aGlzLmhvc3QpIHtcbiAgICBob3N0ID0gYXV0aCArIHRoaXMuaG9zdDtcbiAgfSBlbHNlIGlmICh0aGlzLmhvc3RuYW1lKSB7XG4gICAgaG9zdCA9IGF1dGggKyAodGhpcy5ob3N0bmFtZS5pbmRleE9mKCc6JykgPT09IC0xID9cbiAgICAgICAgdGhpcy5ob3N0bmFtZSA6XG4gICAgICAgICdbJyArIHRoaXMuaG9zdG5hbWUgKyAnXScpO1xuICAgIGlmICh0aGlzLnBvcnQpIHtcbiAgICAgIGhvc3QgKz0gJzonICsgdGhpcy5wb3J0O1xuICAgIH1cbiAgfVxuXG4gIGlmICh0aGlzLnF1ZXJ5ICYmXG4gICAgICB1dGlsLmlzT2JqZWN0KHRoaXMucXVlcnkpICYmXG4gICAgICBPYmplY3Qua2V5cyh0aGlzLnF1ZXJ5KS5sZW5ndGgpIHtcbiAgICBxdWVyeSA9IHF1ZXJ5c3RyaW5nLnN0cmluZ2lmeSh0aGlzLnF1ZXJ5KTtcbiAgfVxuXG4gIHZhciBzZWFyY2ggPSB0aGlzLnNlYXJjaCB8fCAocXVlcnkgJiYgKCc/JyArIHF1ZXJ5KSkgfHwgJyc7XG5cbiAgaWYgKHByb3RvY29sICYmIHByb3RvY29sLnN1YnN0cigtMSkgIT09ICc6JykgcHJvdG9jb2wgKz0gJzonO1xuXG4gIC8vIG9ubHkgdGhlIHNsYXNoZWRQcm90b2NvbHMgZ2V0IHRoZSAvLy4gIE5vdCBtYWlsdG86LCB4bXBwOiwgZXRjLlxuICAvLyB1bmxlc3MgdGhleSBoYWQgdGhlbSB0byBiZWdpbiB3aXRoLlxuICBpZiAodGhpcy5zbGFzaGVzIHx8XG4gICAgICAoIXByb3RvY29sIHx8IHNsYXNoZWRQcm90b2NvbFtwcm90b2NvbF0pICYmIGhvc3QgIT09IGZhbHNlKSB7XG4gICAgaG9zdCA9ICcvLycgKyAoaG9zdCB8fCAnJyk7XG4gICAgaWYgKHBhdGhuYW1lICYmIHBhdGhuYW1lLmNoYXJBdCgwKSAhPT0gJy8nKSBwYXRobmFtZSA9ICcvJyArIHBhdGhuYW1lO1xuICB9IGVsc2UgaWYgKCFob3N0KSB7XG4gICAgaG9zdCA9ICcnO1xuICB9XG5cbiAgaWYgKGhhc2ggJiYgaGFzaC5jaGFyQXQoMCkgIT09ICcjJykgaGFzaCA9ICcjJyArIGhhc2g7XG4gIGlmIChzZWFyY2ggJiYgc2VhcmNoLmNoYXJBdCgwKSAhPT0gJz8nKSBzZWFyY2ggPSAnPycgKyBzZWFyY2g7XG5cbiAgcGF0aG5hbWUgPSBwYXRobmFtZS5yZXBsYWNlKC9bPyNdL2csIGZ1bmN0aW9uKG1hdGNoKSB7XG4gICAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChtYXRjaCk7XG4gIH0pO1xuICBzZWFyY2ggPSBzZWFyY2gucmVwbGFjZSgnIycsICclMjMnKTtcblxuICByZXR1cm4gcHJvdG9jb2wgKyBob3N0ICsgcGF0aG5hbWUgKyBzZWFyY2ggKyBoYXNoO1xufTtcblxuZnVuY3Rpb24gdXJsUmVzb2x2ZShzb3VyY2UsIHJlbGF0aXZlKSB7XG4gIHJldHVybiB1cmxQYXJzZShzb3VyY2UsIGZhbHNlLCB0cnVlKS5yZXNvbHZlKHJlbGF0aXZlKTtcbn1cblxuVXJsLnByb3RvdHlwZS5yZXNvbHZlID0gZnVuY3Rpb24ocmVsYXRpdmUpIHtcbiAgcmV0dXJuIHRoaXMucmVzb2x2ZU9iamVjdCh1cmxQYXJzZShyZWxhdGl2ZSwgZmFsc2UsIHRydWUpKS5mb3JtYXQoKTtcbn07XG5cbmZ1bmN0aW9uIHVybFJlc29sdmVPYmplY3Qoc291cmNlLCByZWxhdGl2ZSkge1xuICBpZiAoIXNvdXJjZSkgcmV0dXJuIHJlbGF0aXZlO1xuICByZXR1cm4gdXJsUGFyc2Uoc291cmNlLCBmYWxzZSwgdHJ1ZSkucmVzb2x2ZU9iamVjdChyZWxhdGl2ZSk7XG59XG5cblVybC5wcm90b3R5cGUucmVzb2x2ZU9iamVjdCA9IGZ1bmN0aW9uKHJlbGF0aXZlKSB7XG4gIGlmICh1dGlsLmlzU3RyaW5nKHJlbGF0aXZlKSkge1xuICAgIHZhciByZWwgPSBuZXcgVXJsKCk7XG4gICAgcmVsLnBhcnNlKHJlbGF0aXZlLCBmYWxzZSwgdHJ1ZSk7XG4gICAgcmVsYXRpdmUgPSByZWw7XG4gIH1cblxuICB2YXIgcmVzdWx0ID0gbmV3IFVybCgpO1xuICB2YXIgdGtleXMgPSBPYmplY3Qua2V5cyh0aGlzKTtcbiAgZm9yICh2YXIgdGsgPSAwOyB0ayA8IHRrZXlzLmxlbmd0aDsgdGsrKykge1xuICAgIHZhciB0a2V5ID0gdGtleXNbdGtdO1xuICAgIHJlc3VsdFt0a2V5XSA9IHRoaXNbdGtleV07XG4gIH1cblxuICAvLyBoYXNoIGlzIGFsd2F5cyBvdmVycmlkZGVuLCBubyBtYXR0ZXIgd2hhdC5cbiAgLy8gZXZlbiBocmVmPVwiXCIgd2lsbCByZW1vdmUgaXQuXG4gIHJlc3VsdC5oYXNoID0gcmVsYXRpdmUuaGFzaDtcblxuICAvLyBpZiB0aGUgcmVsYXRpdmUgdXJsIGlzIGVtcHR5LCB0aGVuIHRoZXJlJ3Mgbm90aGluZyBsZWZ0IHRvIGRvIGhlcmUuXG4gIGlmIChyZWxhdGl2ZS5ocmVmID09PSAnJykge1xuICAgIHJlc3VsdC5ocmVmID0gcmVzdWx0LmZvcm1hdCgpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvLyBocmVmcyBsaWtlIC8vZm9vL2JhciBhbHdheXMgY3V0IHRvIHRoZSBwcm90b2NvbC5cbiAgaWYgKHJlbGF0aXZlLnNsYXNoZXMgJiYgIXJlbGF0aXZlLnByb3RvY29sKSB7XG4gICAgLy8gdGFrZSBldmVyeXRoaW5nIGV4Y2VwdCB0aGUgcHJvdG9jb2wgZnJvbSByZWxhdGl2ZVxuICAgIHZhciBya2V5cyA9IE9iamVjdC5rZXlzKHJlbGF0aXZlKTtcbiAgICBmb3IgKHZhciByayA9IDA7IHJrIDwgcmtleXMubGVuZ3RoOyByaysrKSB7XG4gICAgICB2YXIgcmtleSA9IHJrZXlzW3JrXTtcbiAgICAgIGlmIChya2V5ICE9PSAncHJvdG9jb2wnKVxuICAgICAgICByZXN1bHRbcmtleV0gPSByZWxhdGl2ZVtya2V5XTtcbiAgICB9XG5cbiAgICAvL3VybFBhcnNlIGFwcGVuZHMgdHJhaWxpbmcgLyB0byB1cmxzIGxpa2UgaHR0cDovL3d3dy5leGFtcGxlLmNvbVxuICAgIGlmIChzbGFzaGVkUHJvdG9jb2xbcmVzdWx0LnByb3RvY29sXSAmJlxuICAgICAgICByZXN1bHQuaG9zdG5hbWUgJiYgIXJlc3VsdC5wYXRobmFtZSkge1xuICAgICAgcmVzdWx0LnBhdGggPSByZXN1bHQucGF0aG5hbWUgPSAnLyc7XG4gICAgfVxuXG4gICAgcmVzdWx0LmhyZWYgPSByZXN1bHQuZm9ybWF0KCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGlmIChyZWxhdGl2ZS5wcm90b2NvbCAmJiByZWxhdGl2ZS5wcm90b2NvbCAhPT0gcmVzdWx0LnByb3RvY29sKSB7XG4gICAgLy8gaWYgaXQncyBhIGtub3duIHVybCBwcm90b2NvbCwgdGhlbiBjaGFuZ2luZ1xuICAgIC8vIHRoZSBwcm90b2NvbCBkb2VzIHdlaXJkIHRoaW5nc1xuICAgIC8vIGZpcnN0LCBpZiBpdCdzIG5vdCBmaWxlOiwgdGhlbiB3ZSBNVVNUIGhhdmUgYSBob3N0LFxuICAgIC8vIGFuZCBpZiB0aGVyZSB3YXMgYSBwYXRoXG4gICAgLy8gdG8gYmVnaW4gd2l0aCwgdGhlbiB3ZSBNVVNUIGhhdmUgYSBwYXRoLlxuICAgIC8vIGlmIGl0IGlzIGZpbGU6LCB0aGVuIHRoZSBob3N0IGlzIGRyb3BwZWQsXG4gICAgLy8gYmVjYXVzZSB0aGF0J3Mga25vd24gdG8gYmUgaG9zdGxlc3MuXG4gICAgLy8gYW55dGhpbmcgZWxzZSBpcyBhc3N1bWVkIHRvIGJlIGFic29sdXRlLlxuICAgIGlmICghc2xhc2hlZFByb3RvY29sW3JlbGF0aXZlLnByb3RvY29sXSkge1xuICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhyZWxhdGl2ZSk7XG4gICAgICBmb3IgKHZhciB2ID0gMDsgdiA8IGtleXMubGVuZ3RoOyB2KyspIHtcbiAgICAgICAgdmFyIGsgPSBrZXlzW3ZdO1xuICAgICAgICByZXN1bHRba10gPSByZWxhdGl2ZVtrXTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdC5ocmVmID0gcmVzdWx0LmZvcm1hdCgpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICByZXN1bHQucHJvdG9jb2wgPSByZWxhdGl2ZS5wcm90b2NvbDtcbiAgICBpZiAoIXJlbGF0aXZlLmhvc3QgJiYgIWhvc3RsZXNzUHJvdG9jb2xbcmVsYXRpdmUucHJvdG9jb2xdKSB7XG4gICAgICB2YXIgcmVsUGF0aCA9IChyZWxhdGl2ZS5wYXRobmFtZSB8fCAnJykuc3BsaXQoJy8nKTtcbiAgICAgIHdoaWxlIChyZWxQYXRoLmxlbmd0aCAmJiAhKHJlbGF0aXZlLmhvc3QgPSByZWxQYXRoLnNoaWZ0KCkpKTtcbiAgICAgIGlmICghcmVsYXRpdmUuaG9zdCkgcmVsYXRpdmUuaG9zdCA9ICcnO1xuICAgICAgaWYgKCFyZWxhdGl2ZS5ob3N0bmFtZSkgcmVsYXRpdmUuaG9zdG5hbWUgPSAnJztcbiAgICAgIGlmIChyZWxQYXRoWzBdICE9PSAnJykgcmVsUGF0aC51bnNoaWZ0KCcnKTtcbiAgICAgIGlmIChyZWxQYXRoLmxlbmd0aCA8IDIpIHJlbFBhdGgudW5zaGlmdCgnJyk7XG4gICAgICByZXN1bHQucGF0aG5hbWUgPSByZWxQYXRoLmpvaW4oJy8nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0LnBhdGhuYW1lID0gcmVsYXRpdmUucGF0aG5hbWU7XG4gICAgfVxuICAgIHJlc3VsdC5zZWFyY2ggPSByZWxhdGl2ZS5zZWFyY2g7XG4gICAgcmVzdWx0LnF1ZXJ5ID0gcmVsYXRpdmUucXVlcnk7XG4gICAgcmVzdWx0Lmhvc3QgPSByZWxhdGl2ZS5ob3N0IHx8ICcnO1xuICAgIHJlc3VsdC5hdXRoID0gcmVsYXRpdmUuYXV0aDtcbiAgICByZXN1bHQuaG9zdG5hbWUgPSByZWxhdGl2ZS5ob3N0bmFtZSB8fCByZWxhdGl2ZS5ob3N0O1xuICAgIHJlc3VsdC5wb3J0ID0gcmVsYXRpdmUucG9ydDtcbiAgICAvLyB0byBzdXBwb3J0IGh0dHAucmVxdWVzdFxuICAgIGlmIChyZXN1bHQucGF0aG5hbWUgfHwgcmVzdWx0LnNlYXJjaCkge1xuICAgICAgdmFyIHAgPSByZXN1bHQucGF0aG5hbWUgfHwgJyc7XG4gICAgICB2YXIgcyA9IHJlc3VsdC5zZWFyY2ggfHwgJyc7XG4gICAgICByZXN1bHQucGF0aCA9IHAgKyBzO1xuICAgIH1cbiAgICByZXN1bHQuc2xhc2hlcyA9IHJlc3VsdC5zbGFzaGVzIHx8IHJlbGF0aXZlLnNsYXNoZXM7XG4gICAgcmVzdWx0LmhyZWYgPSByZXN1bHQuZm9ybWF0KCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHZhciBpc1NvdXJjZUFicyA9IChyZXN1bHQucGF0aG5hbWUgJiYgcmVzdWx0LnBhdGhuYW1lLmNoYXJBdCgwKSA9PT0gJy8nKSxcbiAgICAgIGlzUmVsQWJzID0gKFxuICAgICAgICAgIHJlbGF0aXZlLmhvc3QgfHxcbiAgICAgICAgICByZWxhdGl2ZS5wYXRobmFtZSAmJiByZWxhdGl2ZS5wYXRobmFtZS5jaGFyQXQoMCkgPT09ICcvJ1xuICAgICAgKSxcbiAgICAgIG11c3RFbmRBYnMgPSAoaXNSZWxBYnMgfHwgaXNTb3VyY2VBYnMgfHxcbiAgICAgICAgICAgICAgICAgICAgKHJlc3VsdC5ob3N0ICYmIHJlbGF0aXZlLnBhdGhuYW1lKSksXG4gICAgICByZW1vdmVBbGxEb3RzID0gbXVzdEVuZEFicyxcbiAgICAgIHNyY1BhdGggPSByZXN1bHQucGF0aG5hbWUgJiYgcmVzdWx0LnBhdGhuYW1lLnNwbGl0KCcvJykgfHwgW10sXG4gICAgICByZWxQYXRoID0gcmVsYXRpdmUucGF0aG5hbWUgJiYgcmVsYXRpdmUucGF0aG5hbWUuc3BsaXQoJy8nKSB8fCBbXSxcbiAgICAgIHBzeWNob3RpYyA9IHJlc3VsdC5wcm90b2NvbCAmJiAhc2xhc2hlZFByb3RvY29sW3Jlc3VsdC5wcm90b2NvbF07XG5cbiAgLy8gaWYgdGhlIHVybCBpcyBhIG5vbi1zbGFzaGVkIHVybCwgdGhlbiByZWxhdGl2ZVxuICAvLyBsaW5rcyBsaWtlIC4uLy4uIHNob3VsZCBiZSBhYmxlXG4gIC8vIHRvIGNyYXdsIHVwIHRvIHRoZSBob3N0bmFtZSwgYXMgd2VsbC4gIFRoaXMgaXMgc3RyYW5nZS5cbiAgLy8gcmVzdWx0LnByb3RvY29sIGhhcyBhbHJlYWR5IGJlZW4gc2V0IGJ5IG5vdy5cbiAgLy8gTGF0ZXIgb24sIHB1dCB0aGUgZmlyc3QgcGF0aCBwYXJ0IGludG8gdGhlIGhvc3QgZmllbGQuXG4gIGlmIChwc3ljaG90aWMpIHtcbiAgICByZXN1bHQuaG9zdG5hbWUgPSAnJztcbiAgICByZXN1bHQucG9ydCA9IG51bGw7XG4gICAgaWYgKHJlc3VsdC5ob3N0KSB7XG4gICAgICBpZiAoc3JjUGF0aFswXSA9PT0gJycpIHNyY1BhdGhbMF0gPSByZXN1bHQuaG9zdDtcbiAgICAgIGVsc2Ugc3JjUGF0aC51bnNoaWZ0KHJlc3VsdC5ob3N0KTtcbiAgICB9XG4gICAgcmVzdWx0Lmhvc3QgPSAnJztcbiAgICBpZiAocmVsYXRpdmUucHJvdG9jb2wpIHtcbiAgICAgIHJlbGF0aXZlLmhvc3RuYW1lID0gbnVsbDtcbiAgICAgIHJlbGF0aXZlLnBvcnQgPSBudWxsO1xuICAgICAgaWYgKHJlbGF0aXZlLmhvc3QpIHtcbiAgICAgICAgaWYgKHJlbFBhdGhbMF0gPT09ICcnKSByZWxQYXRoWzBdID0gcmVsYXRpdmUuaG9zdDtcbiAgICAgICAgZWxzZSByZWxQYXRoLnVuc2hpZnQocmVsYXRpdmUuaG9zdCk7XG4gICAgICB9XG4gICAgICByZWxhdGl2ZS5ob3N0ID0gbnVsbDtcbiAgICB9XG4gICAgbXVzdEVuZEFicyA9IG11c3RFbmRBYnMgJiYgKHJlbFBhdGhbMF0gPT09ICcnIHx8IHNyY1BhdGhbMF0gPT09ICcnKTtcbiAgfVxuXG4gIGlmIChpc1JlbEFicykge1xuICAgIC8vIGl0J3MgYWJzb2x1dGUuXG4gICAgcmVzdWx0Lmhvc3QgPSAocmVsYXRpdmUuaG9zdCB8fCByZWxhdGl2ZS5ob3N0ID09PSAnJykgP1xuICAgICAgICAgICAgICAgICAgcmVsYXRpdmUuaG9zdCA6IHJlc3VsdC5ob3N0O1xuICAgIHJlc3VsdC5ob3N0bmFtZSA9IChyZWxhdGl2ZS5ob3N0bmFtZSB8fCByZWxhdGl2ZS5ob3N0bmFtZSA9PT0gJycpID9cbiAgICAgICAgICAgICAgICAgICAgICByZWxhdGl2ZS5ob3N0bmFtZSA6IHJlc3VsdC5ob3N0bmFtZTtcbiAgICByZXN1bHQuc2VhcmNoID0gcmVsYXRpdmUuc2VhcmNoO1xuICAgIHJlc3VsdC5xdWVyeSA9IHJlbGF0aXZlLnF1ZXJ5O1xuICAgIHNyY1BhdGggPSByZWxQYXRoO1xuICAgIC8vIGZhbGwgdGhyb3VnaCB0byB0aGUgZG90LWhhbmRsaW5nIGJlbG93LlxuICB9IGVsc2UgaWYgKHJlbFBhdGgubGVuZ3RoKSB7XG4gICAgLy8gaXQncyByZWxhdGl2ZVxuICAgIC8vIHRocm93IGF3YXkgdGhlIGV4aXN0aW5nIGZpbGUsIGFuZCB0YWtlIHRoZSBuZXcgcGF0aCBpbnN0ZWFkLlxuICAgIGlmICghc3JjUGF0aCkgc3JjUGF0aCA9IFtdO1xuICAgIHNyY1BhdGgucG9wKCk7XG4gICAgc3JjUGF0aCA9IHNyY1BhdGguY29uY2F0KHJlbFBhdGgpO1xuICAgIHJlc3VsdC5zZWFyY2ggPSByZWxhdGl2ZS5zZWFyY2g7XG4gICAgcmVzdWx0LnF1ZXJ5ID0gcmVsYXRpdmUucXVlcnk7XG4gIH0gZWxzZSBpZiAoIXV0aWwuaXNOdWxsT3JVbmRlZmluZWQocmVsYXRpdmUuc2VhcmNoKSkge1xuICAgIC8vIGp1c3QgcHVsbCBvdXQgdGhlIHNlYXJjaC5cbiAgICAvLyBsaWtlIGhyZWY9Jz9mb28nLlxuICAgIC8vIFB1dCB0aGlzIGFmdGVyIHRoZSBvdGhlciB0d28gY2FzZXMgYmVjYXVzZSBpdCBzaW1wbGlmaWVzIHRoZSBib29sZWFuc1xuICAgIGlmIChwc3ljaG90aWMpIHtcbiAgICAgIHJlc3VsdC5ob3N0bmFtZSA9IHJlc3VsdC5ob3N0ID0gc3JjUGF0aC5zaGlmdCgpO1xuICAgICAgLy9vY2NhdGlvbmFseSB0aGUgYXV0aCBjYW4gZ2V0IHN0dWNrIG9ubHkgaW4gaG9zdFxuICAgICAgLy90aGlzIGVzcGVjaWFsbHkgaGFwcGVucyBpbiBjYXNlcyBsaWtlXG4gICAgICAvL3VybC5yZXNvbHZlT2JqZWN0KCdtYWlsdG86bG9jYWwxQGRvbWFpbjEnLCAnbG9jYWwyQGRvbWFpbjInKVxuICAgICAgdmFyIGF1dGhJbkhvc3QgPSByZXN1bHQuaG9zdCAmJiByZXN1bHQuaG9zdC5pbmRleE9mKCdAJykgPiAwID9cbiAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0Lmhvc3Quc3BsaXQoJ0AnKSA6IGZhbHNlO1xuICAgICAgaWYgKGF1dGhJbkhvc3QpIHtcbiAgICAgICAgcmVzdWx0LmF1dGggPSBhdXRoSW5Ib3N0LnNoaWZ0KCk7XG4gICAgICAgIHJlc3VsdC5ob3N0ID0gcmVzdWx0Lmhvc3RuYW1lID0gYXV0aEluSG9zdC5zaGlmdCgpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXN1bHQuc2VhcmNoID0gcmVsYXRpdmUuc2VhcmNoO1xuICAgIHJlc3VsdC5xdWVyeSA9IHJlbGF0aXZlLnF1ZXJ5O1xuICAgIC8vdG8gc3VwcG9ydCBodHRwLnJlcXVlc3RcbiAgICBpZiAoIXV0aWwuaXNOdWxsKHJlc3VsdC5wYXRobmFtZSkgfHwgIXV0aWwuaXNOdWxsKHJlc3VsdC5zZWFyY2gpKSB7XG4gICAgICByZXN1bHQucGF0aCA9IChyZXN1bHQucGF0aG5hbWUgPyByZXN1bHQucGF0aG5hbWUgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgICAocmVzdWx0LnNlYXJjaCA/IHJlc3VsdC5zZWFyY2ggOiAnJyk7XG4gICAgfVxuICAgIHJlc3VsdC5ocmVmID0gcmVzdWx0LmZvcm1hdCgpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBpZiAoIXNyY1BhdGgubGVuZ3RoKSB7XG4gICAgLy8gbm8gcGF0aCBhdCBhbGwuICBlYXN5LlxuICAgIC8vIHdlJ3ZlIGFscmVhZHkgaGFuZGxlZCB0aGUgb3RoZXIgc3R1ZmYgYWJvdmUuXG4gICAgcmVzdWx0LnBhdGhuYW1lID0gbnVsbDtcbiAgICAvL3RvIHN1cHBvcnQgaHR0cC5yZXF1ZXN0XG4gICAgaWYgKHJlc3VsdC5zZWFyY2gpIHtcbiAgICAgIHJlc3VsdC5wYXRoID0gJy8nICsgcmVzdWx0LnNlYXJjaDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0LnBhdGggPSBudWxsO1xuICAgIH1cbiAgICByZXN1bHQuaHJlZiA9IHJlc3VsdC5mb3JtYXQoKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLy8gaWYgYSB1cmwgRU5EcyBpbiAuIG9yIC4uLCB0aGVuIGl0IG11c3QgZ2V0IGEgdHJhaWxpbmcgc2xhc2guXG4gIC8vIGhvd2V2ZXIsIGlmIGl0IGVuZHMgaW4gYW55dGhpbmcgZWxzZSBub24tc2xhc2h5LFxuICAvLyB0aGVuIGl0IG11c3QgTk9UIGdldCBhIHRyYWlsaW5nIHNsYXNoLlxuICB2YXIgbGFzdCA9IHNyY1BhdGguc2xpY2UoLTEpWzBdO1xuICB2YXIgaGFzVHJhaWxpbmdTbGFzaCA9IChcbiAgICAgIChyZXN1bHQuaG9zdCB8fCByZWxhdGl2ZS5ob3N0IHx8IHNyY1BhdGgubGVuZ3RoID4gMSkgJiZcbiAgICAgIChsYXN0ID09PSAnLicgfHwgbGFzdCA9PT0gJy4uJykgfHwgbGFzdCA9PT0gJycpO1xuXG4gIC8vIHN0cmlwIHNpbmdsZSBkb3RzLCByZXNvbHZlIGRvdWJsZSBkb3RzIHRvIHBhcmVudCBkaXJcbiAgLy8gaWYgdGhlIHBhdGggdHJpZXMgdG8gZ28gYWJvdmUgdGhlIHJvb3QsIGB1cGAgZW5kcyB1cCA+IDBcbiAgdmFyIHVwID0gMDtcbiAgZm9yICh2YXIgaSA9IHNyY1BhdGgubGVuZ3RoOyBpID49IDA7IGktLSkge1xuICAgIGxhc3QgPSBzcmNQYXRoW2ldO1xuICAgIGlmIChsYXN0ID09PSAnLicpIHtcbiAgICAgIHNyY1BhdGguc3BsaWNlKGksIDEpO1xuICAgIH0gZWxzZSBpZiAobGFzdCA9PT0gJy4uJykge1xuICAgICAgc3JjUGF0aC5zcGxpY2UoaSwgMSk7XG4gICAgICB1cCsrO1xuICAgIH0gZWxzZSBpZiAodXApIHtcbiAgICAgIHNyY1BhdGguc3BsaWNlKGksIDEpO1xuICAgICAgdXAtLTtcbiAgICB9XG4gIH1cblxuICAvLyBpZiB0aGUgcGF0aCBpcyBhbGxvd2VkIHRvIGdvIGFib3ZlIHRoZSByb290LCByZXN0b3JlIGxlYWRpbmcgLi5zXG4gIGlmICghbXVzdEVuZEFicyAmJiAhcmVtb3ZlQWxsRG90cykge1xuICAgIGZvciAoOyB1cC0tOyB1cCkge1xuICAgICAgc3JjUGF0aC51bnNoaWZ0KCcuLicpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChtdXN0RW5kQWJzICYmIHNyY1BhdGhbMF0gIT09ICcnICYmXG4gICAgICAoIXNyY1BhdGhbMF0gfHwgc3JjUGF0aFswXS5jaGFyQXQoMCkgIT09ICcvJykpIHtcbiAgICBzcmNQYXRoLnVuc2hpZnQoJycpO1xuICB9XG5cbiAgaWYgKGhhc1RyYWlsaW5nU2xhc2ggJiYgKHNyY1BhdGguam9pbignLycpLnN1YnN0cigtMSkgIT09ICcvJykpIHtcbiAgICBzcmNQYXRoLnB1c2goJycpO1xuICB9XG5cbiAgdmFyIGlzQWJzb2x1dGUgPSBzcmNQYXRoWzBdID09PSAnJyB8fFxuICAgICAgKHNyY1BhdGhbMF0gJiYgc3JjUGF0aFswXS5jaGFyQXQoMCkgPT09ICcvJyk7XG5cbiAgLy8gcHV0IHRoZSBob3N0IGJhY2tcbiAgaWYgKHBzeWNob3RpYykge1xuICAgIHJlc3VsdC5ob3N0bmFtZSA9IHJlc3VsdC5ob3N0ID0gaXNBYnNvbHV0ZSA/ICcnIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1BhdGgubGVuZ3RoID8gc3JjUGF0aC5zaGlmdCgpIDogJyc7XG4gICAgLy9vY2NhdGlvbmFseSB0aGUgYXV0aCBjYW4gZ2V0IHN0dWNrIG9ubHkgaW4gaG9zdFxuICAgIC8vdGhpcyBlc3BlY2lhbGx5IGhhcHBlbnMgaW4gY2FzZXMgbGlrZVxuICAgIC8vdXJsLnJlc29sdmVPYmplY3QoJ21haWx0bzpsb2NhbDFAZG9tYWluMScsICdsb2NhbDJAZG9tYWluMicpXG4gICAgdmFyIGF1dGhJbkhvc3QgPSByZXN1bHQuaG9zdCAmJiByZXN1bHQuaG9zdC5pbmRleE9mKCdAJykgPiAwID9cbiAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5ob3N0LnNwbGl0KCdAJykgOiBmYWxzZTtcbiAgICBpZiAoYXV0aEluSG9zdCkge1xuICAgICAgcmVzdWx0LmF1dGggPSBhdXRoSW5Ib3N0LnNoaWZ0KCk7XG4gICAgICByZXN1bHQuaG9zdCA9IHJlc3VsdC5ob3N0bmFtZSA9IGF1dGhJbkhvc3Quc2hpZnQoKTtcbiAgICB9XG4gIH1cblxuICBtdXN0RW5kQWJzID0gbXVzdEVuZEFicyB8fCAocmVzdWx0Lmhvc3QgJiYgc3JjUGF0aC5sZW5ndGgpO1xuXG4gIGlmIChtdXN0RW5kQWJzICYmICFpc0Fic29sdXRlKSB7XG4gICAgc3JjUGF0aC51bnNoaWZ0KCcnKTtcbiAgfVxuXG4gIGlmICghc3JjUGF0aC5sZW5ndGgpIHtcbiAgICByZXN1bHQucGF0aG5hbWUgPSBudWxsO1xuICAgIHJlc3VsdC5wYXRoID0gbnVsbDtcbiAgfSBlbHNlIHtcbiAgICByZXN1bHQucGF0aG5hbWUgPSBzcmNQYXRoLmpvaW4oJy8nKTtcbiAgfVxuXG4gIC8vdG8gc3VwcG9ydCByZXF1ZXN0Lmh0dHBcbiAgaWYgKCF1dGlsLmlzTnVsbChyZXN1bHQucGF0aG5hbWUpIHx8ICF1dGlsLmlzTnVsbChyZXN1bHQuc2VhcmNoKSkge1xuICAgIHJlc3VsdC5wYXRoID0gKHJlc3VsdC5wYXRobmFtZSA/IHJlc3VsdC5wYXRobmFtZSA6ICcnKSArXG4gICAgICAgICAgICAgICAgICAocmVzdWx0LnNlYXJjaCA/IHJlc3VsdC5zZWFyY2ggOiAnJyk7XG4gIH1cbiAgcmVzdWx0LmF1dGggPSByZWxhdGl2ZS5hdXRoIHx8IHJlc3VsdC5hdXRoO1xuICByZXN1bHQuc2xhc2hlcyA9IHJlc3VsdC5zbGFzaGVzIHx8IHJlbGF0aXZlLnNsYXNoZXM7XG4gIHJlc3VsdC5ocmVmID0gcmVzdWx0LmZvcm1hdCgpO1xuICByZXR1cm4gcmVzdWx0O1xufTtcblxuVXJsLnByb3RvdHlwZS5wYXJzZUhvc3QgPSBmdW5jdGlvbigpIHtcbiAgdmFyIGhvc3QgPSB0aGlzLmhvc3Q7XG4gIHZhciBwb3J0ID0gcG9ydFBhdHRlcm4uZXhlYyhob3N0KTtcbiAgaWYgKHBvcnQpIHtcbiAgICBwb3J0ID0gcG9ydFswXTtcbiAgICBpZiAocG9ydCAhPT0gJzonKSB7XG4gICAgICB0aGlzLnBvcnQgPSBwb3J0LnN1YnN0cigxKTtcbiAgICB9XG4gICAgaG9zdCA9IGhvc3Quc3Vic3RyKDAsIGhvc3QubGVuZ3RoIC0gcG9ydC5sZW5ndGgpO1xuICB9XG4gIGlmIChob3N0KSB0aGlzLmhvc3RuYW1lID0gaG9zdDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBpc1N0cmluZzogZnVuY3Rpb24oYXJnKSB7XG4gICAgcmV0dXJuIHR5cGVvZihhcmcpID09PSAnc3RyaW5nJztcbiAgfSxcbiAgaXNPYmplY3Q6IGZ1bmN0aW9uKGFyZykge1xuICAgIHJldHVybiB0eXBlb2YoYXJnKSA9PT0gJ29iamVjdCcgJiYgYXJnICE9PSBudWxsO1xuICB9LFxuICBpc051bGw6IGZ1bmN0aW9uKGFyZykge1xuICAgIHJldHVybiBhcmcgPT09IG51bGw7XG4gIH0sXG4gIGlzTnVsbE9yVW5kZWZpbmVkOiBmdW5jdGlvbihhcmcpIHtcbiAgICByZXR1cm4gYXJnID09IG51bGw7XG4gIH1cbn07XG4iLCIvLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8qIGdsb2JhbCBpbzpmYWxzZSAqL1xudmFyIGxpdmVyZWxvYWQgPSByZXF1aXJlKCcuL2xpdmUtcmVsb2FkLWNsaWVudCcpO1xudmFyIE1lc3NhZ2VzID0gcmVxdWlyZSgnbWVzc2FnZXMnKTtcbnZhciB0ZWxlbWV0cnkgPSByZXF1aXJlKCd0ZWxlbWV0cnktaGVscGVyJyk7XG5cbnZhciBjb3Jkb3ZhO1xudmFyIHNvY2tldCA9IGlvKCk7XG52YXIgbmV4dEV4ZWNDYWNoZUluZGV4ID0gMDtcblxuLy8gRGV0YWlscyBvZiBlYWNoIHBsdWdpbiB0aGF0IGhhcyBhcHAtaG9zdCBjb2RlIGlzIGluamVjdGVkIHdoZW4gdGhpcyBmaWxlIGlzIHNlcnZlZC5cbnZhciBwbHVnaW5zID0ge1xuICAgICdldmVudHMnOiByZXF1aXJlKCdldmVudHMnKSxcbidjb3Jkb3ZhLXBsdWdpbi1kZXZpY2UnOiByZXF1aXJlKCdjb3Jkb3ZhLXBsdWdpbi1kZXZpY2UnKVxufTtcblxudmFyIHBsdWdpbkhhbmRsZXJzRGVmaW5pdGlvbnMgPSB7XG4gICAgJ2NvcmRvdmEtcGx1Z2luLWNhbWVyYSc6IHJlcXVpcmUoJ2NvcmRvdmEtcGx1Z2luLWNhbWVyYS1oYW5kbGVycycpLFxuJ2NvcmRvdmEtcGx1Z2luLWZpbGUnOiByZXF1aXJlKCdjb3Jkb3ZhLXBsdWdpbi1maWxlLWhhbmRsZXJzJyksXG4nYW5kcm9pZC1wbGF0Zm9ybS1jb3JlJzogcmVxdWlyZSgnYW5kcm9pZC1wbGF0Zm9ybS1jb3JlLWhhbmRsZXJzJylcbn07XG5cbnZhciBwbHVnaW5DbG9iYmVyRGVmaW5pdGlvbnMgPSB7XG4gICAgJ2NvcmRvdmEtcGx1Z2luLWdlb2xvY2F0aW9uJzogcmVxdWlyZSgnY29yZG92YS1wbHVnaW4tZ2VvbG9jYXRpb24tY2xvYmJlcnMnKVxufTtcblxudmFyIGV4ZWNDYWNoZSA9IHt9O1xudmFyIHBsdWdpbk1lc3NhZ2VzID0ge307XG52YXIgcGx1Z2luSGFuZGxlcnMgPSB7fTtcbnZhciBzZXJ2aWNlVG9QbHVnaW5NYXAgPSB7fTtcblxuZnVuY3Rpb24gY2xvYmJlcihjbG9iYmVycywgc2NvcGUsIGNsb2JiZXJUb1BsdWdpbk1hcCwgcGx1Z2luSWQpIHtcbiAgICBPYmplY3Qua2V5cyhjbG9iYmVycykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIGlmIChjbG9iYmVyVG9QbHVnaW5NYXAgJiYgcGx1Z2luSWQpIHtcbiAgICAgICAgICAgIGNsb2JiZXJUb1BsdWdpbk1hcFtrZXldID0gcGx1Z2luSWQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2xvYmJlcnNba2V5XSAmJiB0eXBlb2YgY2xvYmJlcnNba2V5XSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIHNjb3BlW2tleV0gPSBzY29wZVtrZXldIHx8IHt9O1xuICAgICAgICAgICAgY2xvYmJlcihjbG9iYmVyc1trZXldLCBzY29wZVtrZXldKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNjb3BlW2tleV0gPSBjbG9iYmVyc1trZXldO1xuICAgICAgICB9XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIGFwcGx5UGx1Z2lucyhwbHVnaW5zLCBjbG9iYmVyU2NvcGUsIGNsb2JiZXJUb1BsdWdpbk1hcCkge1xuICAgIE9iamVjdC5rZXlzKHBsdWdpbnMpLmZvckVhY2goZnVuY3Rpb24gKHBsdWdpbklkKSB7XG4gICAgICAgIHZhciBwbHVnaW4gPSBwbHVnaW5zW3BsdWdpbklkXTtcbiAgICAgICAgaWYgKHBsdWdpbikge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBwbHVnaW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBwbHVnaW5NZXNzYWdlc1twbHVnaW5JZF0gPSBwbHVnaW5NZXNzYWdlc1twbHVnaW5JZF0gfHwgbmV3IE1lc3NhZ2VzKHBsdWdpbklkLCBzb2NrZXQpO1xuICAgICAgICAgICAgICAgIHBsdWdpbiA9IHBsdWdpbihwbHVnaW5NZXNzYWdlc1twbHVnaW5JZF0sIGV4ZWMpO1xuICAgICAgICAgICAgICAgIHBsdWdpbnNbcGx1Z2luSWRdID0gcGx1Z2luO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNsb2JiZXJTY29wZSkge1xuICAgICAgICAgICAgICAgIGNsb2JiZXIocGx1Z2luLCBjbG9iYmVyU2NvcGUsIGNsb2JiZXJUb1BsdWdpbk1hcCwgcGx1Z2luSWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG59XG5cbi8qXG4gKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYXMgc2V0dGVyIGZvciB3aW5kb3cuY29yZG92YSBwcm9wZXJ0eS4gQmVzaWRlcyBzZXR0aW5nXG4gKiB0aGUgZ2xvYmFsIHByb3BlcnR5LCBpdCBvdmVycmlkZXMgc29tZSBjb3Jkb3ZhIGRlZmluaXRpb25zIGFuZCBzZXRzIHVwIHRoZVxuICogY29tbXVuaWNhdGlvbiBwcm90b2NvbCB3aXRoIHRoZSBzZXJ2ZXIgYW5kIHRoZSBzaW0taG9zdC5cbiAqL1xuZnVuY3Rpb24gc2V0Q29yZG92YUFuZEluaXRpYWxpemUob3JpZ2luYWxDb3Jkb3ZhKSB7XG4gICAgdmFyIGNoYW5uZWwsXG4gICAgICAgIHBsYXRmb3JtLFxuICAgICAgICBwbGF0Zm9ybUJvb3RzdHJhcDtcblxuICAgIGlmIChjb3Jkb3ZhKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb3Jkb3ZhID0gb3JpZ2luYWxDb3Jkb3ZhO1xuXG4gICAgY29yZG92YS5kZWZpbmUucmVtb3ZlKCdjb3Jkb3ZhL2V4ZWMnKTtcbiAgICBjb3Jkb3ZhLmRlZmluZSgnY29yZG92YS9leGVjJywgZnVuY3Rpb24gKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkge1xuICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGV4ZWM7XG4gICAgfSk7XG5cbiAgICBwbGF0Zm9ybSA9IGNvcmRvdmEucmVxdWlyZSgnY29yZG92YS9wbGF0Zm9ybScpO1xuICAgIHBsYXRmb3JtQm9vdHN0cmFwID0gcGxhdGZvcm0uYm9vdHN0cmFwO1xuICAgIHBsYXRmb3JtLmJvb3RzdHJhcCA9IGZ1bmN0aW9uICgpIHtcbiAgICB9O1xuXG4gICAgLy8gZGVmYXVsdCBXaW5kb3dzIGJvb3RzdHJhcCBmdW5jdGlvbiB0cmllcyB0byBsb2FkIFdpbkpTIHdoaWNoIGlzIG5vdFxuICAgIC8vIGF2YWlsYWJsZSBhbmQgbm90IHJlcXVpcmVkIGluIHNpbXVsYXRpb24gbW9kZSBzbyB3ZSBvdmVycmlkZSBib290c3RyYXBcbiAgICBpZiAoY29yZG92YS5wbGF0Zm9ybUlkID09PSAnd2luZG93cycpIHtcbiAgICAgICAgcGxhdGZvcm1Cb290c3RyYXAgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBjb3Jkb3ZhLnJlcXVpcmUoJ2NvcmRvdmEvbW9kdWxlbWFwcGVyJylcbiAgICAgICAgICAgICAgICAuY2xvYmJlcnMoJ2NvcmRvdmEvZXhlYy9wcm94eScsICdjb3Jkb3ZhLmNvbW1hbmRQcm94eScpO1xuXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgY2hhbm5lbCA9IGNvcmRvdmEucmVxdWlyZSgnY29yZG92YS9jaGFubmVsJyk7XG5cbiAgICAvLyBkZWZpbmUgb3VyIG93biBjaGFubmVsIHRvIGRlbGF5IHRoZSBpbml0aWFsaXphdGlvbiB1bnRpbCBzaW0taG9zdCB0ZWxsc1xuICAgIC8vIHVzIGV2ZXJ5dGhpbmcncyByZWFkeSAoZmlyZWQgaW4gJ3N0YXJ0JyBldmVudCBoYW5kbGVyKS5cbiAgICBjaGFubmVsLmNyZWF0ZVN0aWNreSgnb25Db3Jkb3ZhU2ltdWxhdGVSZWFkeScpO1xuICAgIGNoYW5uZWwud2FpdEZvckluaXRpYWxpemF0aW9uKCdvbkNvcmRvdmFTaW11bGF0ZVJlYWR5Jyk7XG5cbiAgICBzb2NrZXQub24oJ3N0YXJ0LWxpdmUtcmVsb2FkJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBsaXZlcmVsb2FkLnN0YXJ0KHNvY2tldCk7XG4gICAgfSk7XG5cbiAgICBzb2NrZXQub24oJ2luaXQtdGVsZW1ldHJ5JywgZnVuY3Rpb24gKCkge1xuICAgICAgICB0ZWxlbWV0cnkuaW5pdChzb2NrZXQpO1xuICAgIH0pO1xuXG4gICAgc29ja2V0Lm9uKCdpbml0LXhoci1wcm94eScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmVxdWlyZSgneGhyLXByb3h5JykuaW5pdCgpO1xuICAgIH0pO1xuXG4gICAgc29ja2V0Lm9uKCdpbml0LXRvdWNoLWV2ZW50cycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmVxdWlyZSgnLi90b3VjaC1ldmVudHMnKS5pbml0KCk7XG4gICAgfSk7XG5cbiAgICBzb2NrZXQub24oJ3JlZnJlc2gnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGRvY3VtZW50LmxvY2F0aW9uLnJlbG9hZCh0cnVlKTtcbiAgICB9KTtcblxuICAgIC8vIGZpcmluZyBvZiBvbk5hdGl2ZVJlYWR5IGlzIGRlbGF5ZWQgdW50aWwgU0lNX0hPU1QgdGVsbHMgdXMgaXQncyByZWFkeVxuICAgIHNvY2tldC5vbmNlKCdpbml0JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBzaW0taG9zdCBpcyByZWFkeSwgcmVnaXN0ZXIgZXhlYyBoYW5kbGVycywgZmlyZSBvbk5hdGl2ZVJlYWR5IGFuZCBzZW5kXG4gICAgICAgIC8vIHRoZSBsaXN0IG9mIHBsdWdpbnNcbiAgICAgICAgc29ja2V0Lm9uKCdleGVjLXN1Y2Nlc3MnLCBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICAgICAgdmFyIGV4ZWNDYWNoZUluZm8gPSBleGVjQ2FjaGVbZGF0YS5pbmRleF07XG4gICAgICAgICAgICBpZiAoZXhlY0NhY2hlSW5mbyAmJiB0eXBlb2YgZXhlY0NhY2hlSW5mby5zdWNjZXNzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgZXhlY0NhY2hlSW5mby5zdWNjZXNzKGRhdGEucmVzdWx0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgc29ja2V0Lm9uKCdleGVjLWZhaWx1cmUnLCBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICAgICAgdmFyIGV4ZWNDYWNoZUluZm8gPSBleGVjQ2FjaGVbZGF0YS5pbmRleF07XG4gICAgICAgICAgICBpZiAoZXhlY0NhY2hlSW5mbyAmJiB0eXBlb2YgZXhlY0NhY2hlSW5mby5mYWlsID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgZXhlY0NhY2hlSW5mby5mYWlsKGRhdGEuZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoY29yZG92YS5wbGF0Zm9ybUlkICE9PSAnYnJvd3NlcicpIHtcbiAgICAgICAgICAgIGNoYW5uZWwub25QbHVnaW5zUmVhZHkuc3Vic2NyaWJlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgcGx1Z2luTGlzdDtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBwbHVnaW5MaXN0ID0gY29yZG92YS5yZXF1aXJlKCdjb3Jkb3ZhL3BsdWdpbl9saXN0JykubWV0YWRhdGE7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gd2hlbiB0aGUgYXBwIGRvZXNuJ3QgY29udGFpbiBhbnkgcGx1Z2luLCB0aGUgbW9kdWxlIFwiY29yZG92YS9wbHVnaW5fbGlzdFwiXG4gICAgICAgICAgICAgICAgICAgIC8vIGlzIG5vdCBsb2FkZWQgYW5kIGNvcmRvdmEucmVxdWlyZSB0aHJvd3MgYW4gZXhjZXB0aW9uXG4gICAgICAgICAgICAgICAgICAgIHBsdWdpbkxpc3QgPSB7fTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc29ja2V0LmVtaXQoJ2FwcC1wbHVnaW4tbGlzdCcsIHBsdWdpbkxpc3QpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzb2NrZXQuZW1pdCgnYXBwLXBsdWdpbi1saXN0Jywge30pO1xuICAgICAgICB9XG5cbiAgICAgICAgYXBwbHlQbHVnaW5zKHBsdWdpbnMpO1xuICAgICAgICBhcHBseVBsdWdpbnMocGx1Z2luSGFuZGxlcnNEZWZpbml0aW9ucywgcGx1Z2luSGFuZGxlcnMsIHNlcnZpY2VUb1BsdWdpbk1hcCk7XG4gICAgICAgIGFwcGx5UGx1Z2lucyhwbHVnaW5DbG9iYmVyRGVmaW5pdGlvbnMsIHdpbmRvdyk7XG5cbiAgICAgICAgdGVsZW1ldHJ5LnJlZ2lzdGVyUGx1Z2luU2VydmljZXMoc2VydmljZVRvUGx1Z2luTWFwKTtcblxuICAgICAgICBwbGF0Zm9ybUJvb3RzdHJhcCgpO1xuXG4gICAgICAgIHN3aXRjaCAoY29yZG92YS5wbGF0Zm9ybUlkKSB7XG4gICAgICAgICAgICAvLyB0aGVzZSBwbGF0Zm9ybSBmaXJlIG9uTmF0aXZlUmVhZHkgaW4gdGhlaXIgYm9vdHN0cmFwXG4gICAgICAgICAgICBjYXNlICdpb3MnOlxuICAgICAgICAgICAgY2FzZSAnYnJvd3Nlcic6XG4gICAgICAgICAgICBjYXNlICdibGFja2JlcnJ5MTAnOlxuICAgICAgICAgICAgY2FzZSAnZmlyZWZveG9zJzpcbiAgICAgICAgICAgIGNhc2UgJ3VidW50dSc6XG4gICAgICAgICAgICBjYXNlICd3ZWJvcyc6XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAvLyB3aW5kb3dzIGhhcyBhbiBvdmVycmlkZGVuIGJvb3RzdHJhcCB3aGljaCBkb2VzIG5vdCBmaXJlXG4gICAgICAgICAgICAvLyBvbk5hdGl2ZVJlYWR5XG4gICAgICAgICAgICBjYXNlICd3aW5kb3dzJzpcbiAgICAgICAgICAgIC8vIGFuZHJvaWQgc3BlY2lmaWVkIGhlcmUganVzdCB0byBiZSBleHBsaWNpdCBhYm91dCBpdFxuICAgICAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgICAgICAgY2FzZSAnYW5kcm9pZCc6XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGNoYW5uZWwub25OYXRpdmVSZWFkeS5maXJlKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgIH0pO1xuXG4gICAgc29ja2V0Lm9uY2UoJ3N0YXJ0JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBhbGwgc2V0LCBmaXJlIG9uQ29yZG92YVNpbXVsYXRlIHJlYWR5ICh3aGljaCB1cCB0byB0aGlzIHBvaW50IHdhc1xuICAgICAgICAvLyBkZWxheWluZyBvbkRldmljZVJlYWR5KS5cbiAgICAgICAgY2hhbm5lbC5vbkNvcmRvdmFTaW11bGF0ZVJlYWR5LmZpcmUoKTtcbiAgICAgICAgLy8gYW4gaW5pdCBhZnRlciBzdGFydCBtZWFucyByZWxvYWQuIGl0IGlzIG9ubHkgc2VudCBpZiBzaW0taG9zdCB3YXNcbiAgICAgICAgLy8gcmVsb2FkZWRcbiAgICAgICAgc29ja2V0Lm9uY2UoJ2luaXQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKHRydWUpO1xuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8vIHJlZ2lzdGVyIGFwcC1ob3N0XG4gICAgc29ja2V0LmVtaXQoJ3JlZ2lzdGVyLWFwcC1ob3N0Jyk7XG59XG5cbmZ1bmN0aW9uIGdldENvcmRvdmEoKSB7XG4gICAgcmV0dXJuIGNvcmRvdmE7XG59XG5cbmZ1bmN0aW9uIGV4ZWMoc3VjY2VzcywgZmFpbCwgc2VydmljZSwgYWN0aW9uLCBhcmdzKSB7XG4gICAgLy8gSWYgd2UgaGF2ZSBhIGxvY2FsIGhhbmRsZXIsIGNhbGwgdGhhdC4gT3RoZXJ3aXNlIHBhc3MgaXQgdG8gdGhlIHNpbXVsYXRpb24gaG9zdC5cbiAgICB2YXIgaGFuZGxlciA9IHBsdWdpbkhhbmRsZXJzW3NlcnZpY2VdICYmIHBsdWdpbkhhbmRsZXJzW3NlcnZpY2VdW2FjdGlvbl07XG4gICAgaWYgKGhhbmRsZXIpIHtcbiAgICAgICAgdGVsZW1ldHJ5LnNlbmRDbGllbnRUZWxlbWV0cnkoJ2V4ZWMnLCB7IGhhbmRsZWQ6ICdhcHAtaG9zdCcsIHNlcnZpY2U6IHNlcnZpY2UsIGFjdGlvbjogYWN0aW9uIH0pO1xuXG4gICAgICAgIC8vIEVuc3VyZSBsb2NhbCBoYW5kbGVycyBhcmUgZXhlY3V0ZWQgYXN5bmNocm9ub3VzbHkuXG4gICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaGFuZGxlcihzdWNjZXNzLCBmYWlsLCBhcmdzKTtcbiAgICAgICAgfSwgMCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGV4ZWNJbmRleCA9IG5leHRFeGVjQ2FjaGVJbmRleCsrO1xuICAgICAgICBleGVjQ2FjaGVbZXhlY0luZGV4XSA9IHsgaW5kZXg6IGV4ZWNJbmRleCwgc3VjY2Vzczogc3VjY2VzcywgZmFpbDogZmFpbCB9O1xuICAgICAgICBzb2NrZXQuZW1pdCgnZXhlYycsIHsgaW5kZXg6IGV4ZWNJbmRleCwgc2VydmljZTogc2VydmljZSwgYWN0aW9uOiBhY3Rpb24sIGFyZ3M6IGFyZ3MsIGhhc1N1Y2Nlc3M6ICEhc3VjY2VzcywgaGFzRmFpbDogISFmYWlsIH0pO1xuICAgIH1cbn1cblxuLy8gaGF2ZSB0aGlzIHN0dWIgZnVuY3Rpb24gYWx3YXlzLCBzb21lIHBsYXRmb3JtcyByZXF1aXJlIGl0XG5leGVjLmluaXQgPSBmdW5jdGlvbiAoKSB7XG59O1xuXG4vLyBTZXR1cCBmb3IgY29yZG92YSBwYXRjaGluZ1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KHdpbmRvdywgJ2NvcmRvdmEnLCB7XG4gICAgc2V0OiBzZXRDb3Jkb3ZhQW5kSW5pdGlhbGl6ZSxcbiAgICBnZXQ6IGdldENvcmRvdmFcbn0pO1xuXG52YXIgb3JpZ2luYWxVc2VyQWdlbnQgPSB3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudDtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3aW5kb3cubmF2aWdhdG9yLCAndXNlckFnZW50Jywge1xuICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBUaGUgdXNlciBhZ2VudCBpcyBpbnNlcnRlZCBoZXJlIGJ5IHRoZSBzZXJ2ZXIgd2hlbiB0aGlzIGZpbGUgaXMgc2VydmVkIHVwLlxuICAgICAgICB2YXIgdXNlckFnZW50ID0gJy8qKiBVU0VSLUFHRU5UICoqLyc7XG4gICAgICAgIHJldHVybiB1c2VyQWdlbnQgfHwgb3JpZ2luYWxVc2VyQWdlbnQ7XG4gICAgfVxufSk7XG4iLCIvLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIEJhc2VkIGluIHBhcnQgb24gY29kZSBmcm9tIFZvZ3VlIChodHRwczovL2dpdGh1Yi5jb20vYW5kcmV3ZGF2ZXkvdm9ndWUpXG5cbnZhciB1cmwgPSByZXF1aXJlKCd1cmwnKTtcblxudmFyIFVSTF9BVFRSSUJfTkFNRSA9ICd1cmwnO1xudmFyIEhSRUZfQVRUUklCX05BTUUgPSAnaHJlZic7XG52YXIgU1JDX0FUVFJJQl9OQU1FID0gJ3NyYyc7XG52YXIgcmVmZXJlbmNlQXR0cmlidXRlcyA9IFtcbiAgICBVUkxfQVRUUklCX05BTUUsXG4gICAgSFJFRl9BVFRSSUJfTkFNRSxcbiAgICBTUkNfQVRUUklCX05BTUVcbl07XG5cbm1vZHVsZS5leHBvcnRzLnN0YXJ0ID0gZnVuY3Rpb24gKHNvY2spIHtcbiAgICB2YXIgc2VydmVyVXJsID0gd2luZG93LmxvY2F0aW9uLnByb3RvY29sICsgJy8vJyArIHdpbmRvdy5sb2NhdGlvbi5ob3N0O1xuICAgIHZhciBsb2NhbFVybFByZWZpeGVzID0gW1xuICAgICAgICBzZXJ2ZXJVcmwsXG4gICAgICAgIHNlcnZlclVybCArICcvJyxcbiAgICAgICAgJy8nLFxuICAgICAgICAnJ1xuICAgIF07XG4gICAgdmFyIHNvY2tldCA9IHNvY2s7XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSByZWZlcmVuY2UgYXR0cmlidXRlIChlaXRoZXIgXCJ1cmxcIiwgXCJocmVmXCIgb3IgXCJzcmNcIikgdGhhdCBpcyBkZWZpbmVkIGZvciB0aGUgZ2l2ZW4gbm9kZS5cbiAgICAgKiBJZiB0aGUgbm9kZSBkZWZpbmVzIG1vcmUgdGhhbiBvbmUsIHJldHVybnMgdGhlIGZpcnN0IGVuY291bnRlcmVkLCBpbiB0aGF0IG9yZGVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBkb21Ob2RlIFRoZSBET00gbm9kZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBcInVybFwiLCBcImhyZWZcIiBvciBcInNyY1wiLCBvciBudWxsIGlmIG5vbmUgb2YgdGhlc2UgYXR0cmlidXRlcyBpcyBkZWZpbmVkLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldFJlZmVyZW5jZUF0dHJpYnV0ZUZvck5vZGUoZG9tTm9kZSkge1xuICAgICAgICBpZiAoZG9tTm9kZS5nZXRBdHRyaWJ1dGUoVVJMX0FUVFJJQl9OQU1FKSkge1xuICAgICAgICAgICAgcmV0dXJuIFVSTF9BVFRSSUJfTkFNRTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkb21Ob2RlLmdldEF0dHJpYnV0ZShIUkVGX0FUVFJJQl9OQU1FKSkge1xuICAgICAgICAgICAgcmV0dXJuIEhSRUZfQVRUUklCX05BTUU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZG9tTm9kZS5nZXRBdHRyaWJ1dGUoU1JDX0FUVFJJQl9OQU1FKSkge1xuICAgICAgICAgICAgcmV0dXJuIFNSQ19BVFRSSUJfTkFNRTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBVUkwgY29ycmVzcG9uZHMgdG8gYSBnaXZlbiBmaWxlIHBhdGggZnJvbSB0aGUgc2VydmVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHVybCBUaGUgVVJMIHRvIGNoZWNrLlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBmaWxlUmVsYXRpdmVQYXRoIFRoZSBwYXRoIG9mIHRoZSBtb2RpZmllZCBmaWxlIHRvIGNoZWNrLCByZWxhdGl2ZSB0byB0aGUgd2ViUm9vdC5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciB0aGUgVVJMIHBvaW50cyB0byB0aGUgbW9kaWZpZWQgZmlsZSBmcm9tIHRoZSBzZXJ2ZXIuXG4gICAgICovXG4gICAgZnVuY3Rpb24gdXJsTWF0Y2hlc1BhdGgodXJsLCBmaWxlUmVsYXRpdmVQYXRoKSB7XG4gICAgICAgIHJldHVybiBsb2NhbFVybFByZWZpeGVzLnNvbWUoZnVuY3Rpb24gKHByZWZpeCkge1xuICAgICAgICAgICAgcmV0dXJuIChwcmVmaXggKyBmaWxlUmVsYXRpdmVQYXRoKSA9PT0gdXJsO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaW5kcyBhbGwgdGhlIERPTSBlbGVtZW50cyB0aGF0IGhhdmUgYSByZWZlcmVuY2UgYXR0cmlidXRlIChcInVybFwiLCBcImhyZWZcIiBvciBcInNyY1wiKSBwb2ludGluZyB0byB0aGUgZ2l2ZW5cbiAgICAgKiByZWxhdGl2ZSBwYXRoLiBFeGNsdWRlcyA8c2NyaXB0PiB0YWdzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGZpbGVSZWxhdGl2ZVBhdGggVGhlIFVSTCBvZiB0aGUgZmlsZSB0byBjaGVjaywgcmVsYXRpdmUgdG8gdGhlIHdlYlJvb3QuXG4gICAgICogQHJldHVybnMge3sgZG9tTm9kZTogRWxlbWVudCwgcmVmZXJlbmNlQXR0cmlidXRlOiBzdHJpbmcgfVtdfSBBbiBhcnJheSBvZiBcInJlc291cmNlc1wiIHJlZmVyZW5jaW5nIHRoZSBnaXZlbiBmaWxlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZpbmREb21Ob2Rlc0ZvckZpbGVQYXRoKGZpbGVSZWxhdGl2ZVBhdGgpIHtcbiAgICAgICAgLy8gVG8gdXNlIHF1ZXJ5U2VsZWN0b3JBbGwgdG8gcXVlcnkgZWxlbWVudHMgYmFzZWQgb24gdGhlaXIgYXR0cmlidXRlcywgdGhlIHNlbGVjdG9yJ3Mgc3ludGF4IGlzOlxuICAgICAgICAvLyAnW2F0dHJpYjFdLCBbYXR0cmliMl0sIC4uLicuXG4gICAgICAgIHZhciBzZWxlY3RvclN0cmluZyA9ICdbJyArIHJlZmVyZW5jZUF0dHJpYnV0ZXMuam9pbignXSwgWycpICsgJ10nO1xuICAgICAgICB2YXIgcmF3Tm9kZXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yU3RyaW5nKTtcbiAgICAgICAgdmFyIGZpbHRlcmVkTm9kZXMgPSBbXTtcblxuICAgICAgICAvLyBxdWVyeVNlbGVjdG9yQWxsKCkgZG9lcyBub3QgcmV0dXJuIGFuIGFycmF5LCBzbyB3ZSBjYW4ndCB1c2UgQXJyYXkucHJvdG90eXBlLmZpbHRlcigpLlxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJhd05vZGVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICB2YXIgY3VycmVudE5vZGUgPSByYXdOb2Rlc1tpXTtcblxuICAgICAgICAgICAgLy8gSWdub3JlIDxzY3JpcHQ+IHRhZ3MgKHdlIG5lZWQgdG8gZG8gYSBmdWxsIHJlbG9hZCBmb3Igc2NyaXB0cykuXG4gICAgICAgICAgICBpZiAoY3VycmVudE5vZGUudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnc2NyaXB0Jykge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBWZXJpZnkgaWYgdGhlIG5vZGUgaXMgcmVmZXJlbmNpbmcgdGhlIG1vZGlmaWVkIGZpbGVcbiAgICAgICAgICAgIHZhciByZWZlcmVuY2VBdHRyaWJ1dGUgPSBnZXRSZWZlcmVuY2VBdHRyaWJ1dGVGb3JOb2RlKGN1cnJlbnROb2RlKTtcbiAgICAgICAgICAgIHZhciBub2RlUmVmZXJlbmNlID0gY3VycmVudE5vZGUuZ2V0QXR0cmlidXRlKHJlZmVyZW5jZUF0dHJpYnV0ZSk7XG5cbiAgICAgICAgICAgIC8vIElmIHRoZSBub2RlJ3MgdXJsIC8gaHJlZiAvIHNyYyBkb2Vzbid0IHJlZmVyZW5jZSB0aGUgbW9kaWZpZWQgZmlsZSBvbiB0aGUgc2VydmVyLCBpZ25vcmUgdGhlIG5vZGUuXG4gICAgICAgICAgICBpZiAoIXVybE1hdGNoZXNQYXRoKHVybC5wYXJzZShub2RlUmVmZXJlbmNlKS5wYXRobmFtZSwgZmlsZVJlbGF0aXZlUGF0aCkpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gV2UgY2FyZSBhYm91dCB0aGlzIG5vZGUuXG4gICAgICAgICAgICBmaWx0ZXJlZE5vZGVzLnB1c2goe1xuICAgICAgICAgICAgICAgIGRvbU5vZGU6IGN1cnJlbnROb2RlLFxuICAgICAgICAgICAgICAgIHJlZmVyZW5jZUF0dHJpYnV0ZTogcmVmZXJlbmNlQXR0cmlidXRlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmaWx0ZXJlZE5vZGVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERldGVybWluZXMgd2hldGhlciB0aGUgY2hhbmdlcyBmb3JtIHRoZSBzcGVjaWZpZWQgZmlsZSBjYW4gYmUgYXBwbGllZCB0byB0aGUgYXBwIHdpdGhvdXQgYSBmdWxsIHBhZ2UgcmVsb2FkLlxuICAgICAqIFRoZW4sIGJhc2VkIG9uIHRoYXQsIGVpdGhlciB1cGRhdGVzIHRoZSByZWZlcmVuY2UgYXR0cmlidXRlIG9mIHRoZSBhcHByb3ByaWF0ZSBub2RlLCBvciBkb2VzIGEgZnVsbCBwYWdlXG4gICAgICogcmVsb2FkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGZpbGVSZWxhdGl2ZVBhdGggVGhlIFVSTCBvZiB0aGUgZmlsZSB0aGF0IGNoYW5nZWQsIHJlbGF0aXZlIHRvIHRoZSB3ZWJSb290LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG9uRmlsZUNoYW5nZWQoZmlsZVJlbGF0aXZlUGF0aCkge1xuICAgICAgICB2YXIgYXNzb2NpYXRlZE5vZGVzID0gZmluZERvbU5vZGVzRm9yRmlsZVBhdGgoZmlsZVJlbGF0aXZlUGF0aCk7XG5cbiAgICAgICAgaWYgKGFzc29jaWF0ZWROb2Rlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJlZnJlc2hGaWxlKGZpbGVSZWxhdGl2ZVBhdGgsIGFzc29jaWF0ZWROb2Rlcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZWxvYWRQYWdlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWZyZXNoZXMgYSBmaWxlIGJ5IHVwZGF0aW5nIHRoZSBhc3NvY2lhdGVkIG5vZGVzJyBxdWVyeXN0cmluZyB3aXRoIGEgbmV3IF9saXZlcmVsb2FkIHBhcmFtZXRlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBmaWxlUmVsYXRpdmVQYXRoIFRoZSBVUkwgb2YgdGhlIGZpbGUgdG8gYmUgcmVmcmVzaGVkLCByZWxhdGl2ZSB0byB0aGUgd2ViUm9vdC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiByZWZyZXNoRmlsZShmaWxlUmVsYXRpdmVQYXRoLCBub2Rlc1RvUmVmcmVzaCkge1xuICAgICAgICBub2Rlc1RvUmVmcmVzaCA9IG5vZGVzVG9SZWZyZXNoIHx8IGZpbmREb21Ob2Rlc0ZvckZpbGVQYXRoKGZpbGVSZWxhdGl2ZVBhdGgpO1xuXG4gICAgICAgIGlmICghbm9kZXNUb1JlZnJlc2gpIHtcbiAgICAgICAgICAgIC8vIFRoZSBtb2RpZmllZCBmaWxlIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIHJlZmVyZW5jZWQgaW4gdGhlIERPTSBhbnltb3JlLiBEbyBhIGZ1bGwgcmVsb2FkLlxuICAgICAgICAgICAgcmVsb2FkUGFnZSgpO1xuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVcGRhdGUgdGhlIG5vZGVzJyB1cmwgLyBocmVmIC8gc3JjIGF0dHJpYnV0ZSB3aXRoIGEgbmV3IF9saXZlcmVsb2FkIHF1ZXJ5c3RyaW5nIHBhcmFtZXRlci5cbiAgICAgICAgbm9kZXNUb1JlZnJlc2guZm9yRWFjaChmdW5jdGlvbiAobm9kZUluZm8pIHtcbiAgICAgICAgICAgIHZhciBwcmV2aW91c1VybCA9IG5vZGVJbmZvLmRvbU5vZGUuZ2V0QXR0cmlidXRlKG5vZGVJbmZvLnJlZmVyZW5jZUF0dHJpYnV0ZSk7XG4gICAgICAgICAgICB2YXIgcGFyc2VkVXJsID0gdXJsLnBhcnNlKHByZXZpb3VzVXJsLCB0cnVlKTtcblxuICAgICAgICAgICAgcGFyc2VkVXJsLnF1ZXJ5Ll9saXZlcmVsb2FkID0gKG5ldyBEYXRlKS5nZXRUaW1lKCk7XG4gICAgICAgICAgICBkZWxldGUgcGFyc2VkVXJsLnNlYXJjaDtcbiAgICAgICAgICAgIG5vZGVJbmZvLmRvbU5vZGUuc2V0QXR0cmlidXRlKG5vZGVJbmZvLnJlZmVyZW5jZUF0dHJpYnV0ZSwgdXJsLmZvcm1hdChwYXJzZWRVcmwpKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVsb2FkIHRoZSBwYWdlLiBDdXJyZW50bHksIG9ubHkgZG9lcyBhIG5haXZlIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiByZWxvYWRQYWdlKCkge1xuICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKHRydWUpO1xuICAgIH1cblxuICAgIHNvY2tldC5vbignbHItZmlsZS1jaGFuZ2VkJywgZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgb25GaWxlQ2hhbmdlZChkYXRhLmZpbGVSZWxhdGl2ZVBhdGgpO1xuICAgIH0pO1xufTtcbiIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy8gQmFzZWQgaW4gcGFydCBvbiBjb2RlIGZyb20gQXBhY2hlIFJpcHBsZSwgaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9pbmN1YmF0b3ItcmlwcGxlXG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJ3V0aWxzJyk7XG5cbnZhciBfbGFzdE1vdXNlRXZlbnQsXG4gICAgX2lzTW91c2VEb3duO1xuXG4vLyBOT1RFOiBtaXNzaW5nIHZpZXcsIGRldGFpbCwgdG91Y2hlcywgdGFyZ2V0VG91Y2hlcywgc2NhbGUgYW5kIHJvdGF0aW9uXG5mdW5jdGlvbiBfY3JlYXRlVG91Y2hFdmVudCh0eXBlLCBjYW5CdWJibGUsIGNhbmNlbGFibGUsIGV2ZW50RGF0YSkge1xuICAgIHZhciB0b3VjaEV2ZW50ID0gd2luZG93LmRvY3VtZW50LmNyZWF0ZUV2ZW50KCdFdmVudCcpO1xuICAgIHRvdWNoRXZlbnQuaW5pdEV2ZW50KHR5cGUsIGNhbkJ1YmJsZSwgY2FuY2VsYWJsZSk7XG4gICAgdXRpbHMubWl4aW4oZXZlbnREYXRhLCB0b3VjaEV2ZW50KTtcblxuICAgIHJldHVybiB0b3VjaEV2ZW50O1xufVxuXG5mdW5jdGlvbiBfc2ltdWxhdGVUb3VjaEV2ZW50KHR5cGUsIG1vdXNlZXZlbnQpIHtcbiAgICBpZiAoX2xhc3RNb3VzZUV2ZW50ICYmXG4gICAgICAgICAgICBtb3VzZWV2ZW50LnR5cGUgPT09IF9sYXN0TW91c2VFdmVudC50eXBlICYmXG4gICAgICAgICAgICBtb3VzZWV2ZW50LnBhZ2VYID09PSBfbGFzdE1vdXNlRXZlbnQucGFnZVggJiZcbiAgICAgICAgICAgIG1vdXNlZXZlbnQucGFnZVkgPT09IF9sYXN0TW91c2VFdmVudC5wYWdlWSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgX2xhc3RNb3VzZUV2ZW50ID0gbW91c2VldmVudDtcblxuICAgIHZhciB0b3VjaE9iaiA9IHtcbiAgICAgICAgY2xpZW50WDogbW91c2VldmVudC5wYWdlWCxcbiAgICAgICAgY2xpZW50WTogbW91c2VldmVudC5wYWdlWSxcbiAgICAgICAgcGFnZVg6IG1vdXNlZXZlbnQucGFnZVgsXG4gICAgICAgIHBhZ2VZOiBtb3VzZWV2ZW50LnBhZ2VZLFxuICAgICAgICBzY3JlZW5YOiBtb3VzZWV2ZW50LnBhZ2VYLFxuICAgICAgICBzY3JlZW5ZOiBtb3VzZWV2ZW50LnBhZ2VZLFxuICAgICAgICB0YXJnZXQ6IG1vdXNlZXZlbnQudGFyZ2V0LFxuICAgICAgICBpZGVudGlmaWVyOiAnJ1xuICAgIH07XG5cbiAgICB2YXIgZXZlbnREYXRhID0ge1xuICAgICAgICBhbHRLZXk6IG1vdXNlZXZlbnQuYWx0S2V5LFxuICAgICAgICBjdHJsS2V5OiBtb3VzZWV2ZW50LmN0cmxLZXksXG4gICAgICAgIHNoaWZ0S2V5OiBtb3VzZWV2ZW50LnNoaWZ0S2V5LFxuICAgICAgICBtZXRhS2V5OiBtb3VzZWV2ZW50Lm1ldGFLZXksXG4gICAgICAgIGNoYW5nZWRUb3VjaGVzOiBbdG91Y2hPYmpdLFxuICAgICAgICB0YXJnZXRUb3VjaGVzOiB0eXBlID09PSAndG91Y2hlbmQnID8gW10gOiBbdG91Y2hPYmpdLFxuICAgICAgICB0b3VjaGVzOiB0eXBlID09PSAndG91Y2hlbmQnID8gW10gOiBbdG91Y2hPYmpdXG4gICAgfTtcblxuICAgIHV0aWxzLm1peGluKHRvdWNoT2JqLCBldmVudERhdGEpO1xuXG4gICAgdmFyIGl0ZW1GbiA9IGZ1bmN0aW9uIChpbmRleCkge1xuICAgICAgICByZXR1cm4gdGhpc1tpbmRleF07XG4gICAgfTtcblxuICAgIGV2ZW50RGF0YS50b3VjaGVzLml0ZW0gPSBpdGVtRm47XG4gICAgZXZlbnREYXRhLmNoYW5nZWRUb3VjaGVzLml0ZW0gPSBpdGVtRm47XG4gICAgZXZlbnREYXRhLnRhcmdldFRvdWNoZXMuaXRlbSA9IGl0ZW1GbjtcblxuICAgIHZhciBsaXN0ZW5lck5hbWUgPSAnb24nICsgdHlwZSxcbiAgICAgICAgc2ltdWxhdGVkRXZlbnQgPSBfY3JlYXRlVG91Y2hFdmVudCh0eXBlLCB0cnVlLCB0cnVlLCBldmVudERhdGEpO1xuXG4gICAgbW91c2VldmVudC50YXJnZXQuZGlzcGF0Y2hFdmVudChzaW11bGF0ZWRFdmVudCk7XG5cbiAgICBpZiAodHlwZW9mIG1vdXNlZXZlbnQudGFyZ2V0W2xpc3RlbmVyTmFtZV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgbW91c2VldmVudC50YXJnZXRbbGlzdGVuZXJOYW1lXS5hcHBseShtb3VzZWV2ZW50LnRhcmdldCwgW3NpbXVsYXRlZEV2ZW50XSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBpbml0KCkge1xuICAgIHdpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgX2lzTW91c2VEb3duID0gdHJ1ZTtcbiAgICAgICAgX3NpbXVsYXRlVG91Y2hFdmVudCgndG91Y2hzdGFydCcsIGV2ZW50KTtcbiAgICB9LCB0cnVlKTtcblxuICAgIHdpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgaWYgKF9pc01vdXNlRG93bikge1xuICAgICAgICAgICAgX3NpbXVsYXRlVG91Y2hFdmVudCgndG91Y2htb3ZlJywgZXZlbnQpO1xuICAgICAgICB9XG4gICAgfSwgdHJ1ZSk7XG5cbiAgICB3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICBfaXNNb3VzZURvd24gPSBmYWxzZTtcbiAgICAgICAgX3NpbXVsYXRlVG91Y2hFdmVudCgndG91Y2hlbmQnLCBldmVudCk7XG4gICAgfSwgdHJ1ZSk7XG5cbiAgICB3aW5kb3cuTm9kZS5wcm90b3R5cGUub250b3VjaHN0YXJ0ID0gbnVsbDtcbiAgICB3aW5kb3cuTm9kZS5wcm90b3R5cGUub250b3VjaGVuZCA9IG51bGw7XG4gICAgd2luZG93Lk5vZGUucHJvdG90eXBlLm9udG91Y2htb3ZlID0gbnVsbDtcbn1cblxubW9kdWxlLmV4cG9ydHMuaW5pdCA9IGluaXQ7XG4iLCIvLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cblxuLyoqXG4gKiBJbnRlcmZhY2UgdG8gd3JhcCB0aGUgbmF0aXZlIEZpbGUgaW50ZXJmYWNlLlxuICpcbiAqIFRoaXMgaW50ZXJmYWNlIGlzIG5lY2Vzc2FyeSBmb3IgY3JlYXRpbmcgemVyby1sZW5ndGggKGVtcHR5KSBmaWxlcyxcbiAqIHNvbWV0aGluZyB0aGUgRmlsZXN5c3RlbSBBUEkgYWxsb3dzIHlvdSB0byBkby4gVW5mb3J0dW5hdGVseSwgRmlsZSdzXG4gKiBjb25zdHJ1Y3RvciBjYW5ub3QgYmUgY2FsbGVkIGRpcmVjdGx5LCBtYWtpbmcgaXQgaW1wb3NzaWJsZSB0byBpbnN0YW50aWF0ZVxuICogYW4gZW1wdHkgRmlsZSBpbiBKUy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0cyBJbml0aWFsIHZhbHVlcy5cbiAqIEBjb25zdHJ1Y3RvclxuICovXG5mdW5jdGlvbiBNeUZpbGUob3B0cykge1xuICAgIHZhciBibG9iXyA9IG5ldyBCbG9iKCk7XG5cbiAgICB0aGlzLnNpemUgPSBvcHRzLnNpemUgfHwgMDtcbiAgICB0aGlzLm5hbWUgPSBvcHRzLm5hbWUgfHwgJyc7XG4gICAgdGhpcy50eXBlID0gb3B0cy50eXBlIHx8ICcnO1xuICAgIHRoaXMubGFzdE1vZGlmaWVkRGF0ZSA9IG9wdHMubGFzdE1vZGlmaWVkRGF0ZSB8fCBudWxsO1xuICAgIHRoaXMuc3RvcmFnZVBhdGggPSBvcHRzLnN0b3JhZ2VQYXRoIHx8ICcnO1xuXG4gICAgLy8gTmVlZCBzb21lIGJsYWNrIG1hZ2ljIHRvIGNvcnJlY3QgdGhlIG9iamVjdCdzIHNpemUvbmFtZS90eXBlIGJhc2VkIG9uIHRoZVxuICAgIC8vIGJsb2IgdGhhdCBpcyBzYXZlZC5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2Jsb2JfJywge1xuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JfO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uKHZhbCkge1xuICAgICAgICAgICAgYmxvYl8gPSB2YWw7XG4gICAgICAgICAgICB0aGlzLnNpemUgPSBibG9iXy5zaXplO1xuICAgICAgICAgICAgdGhpcy5uYW1lID0gYmxvYl8ubmFtZTtcbiAgICAgICAgICAgIHRoaXMudHlwZSA9IGJsb2JfLnR5cGU7XG4gICAgICAgICAgICB0aGlzLmxhc3RNb2RpZmllZERhdGUgPSBibG9iXy5sYXN0TW9kaWZpZWREYXRlO1xuICAgICAgICB9LmJpbmQodGhpcylcbiAgICB9KTtcbn1cblxuTXlGaWxlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IE15RmlsZTtcblxubW9kdWxlLmV4cG9ydHMgPSBNeUZpbGU7XG4iLCIvLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cblxuLypnbG9iYWwgVWludDhBcnJheTogZmFsc2UgKi9cblxuaWYgKCF3aW5kb3cuaW5kZXhlZERCKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbmRleGVkREIgbm90IHN1cHBvcnRlZCcpO1xufVxuXG4vLyBTaW5jZSB3ZSBhcmUgdXNpbmcgYnJvd3NlciBpbXBsZW1lbnRhdGlvblxuLy8gb2YgY29yZG92YS1maWxlLXBsdWdpbiBmb3Igbm9uLXdlYmtpdCBicm93c2Vycyxcbi8vIHdlIHNob3VsZCByZWZlcmVuY2UgTXlGaWxlLCBiZWNhdXNlIGN1cnJlbnRseSBsb2FkZWRcbi8vIHNpbXVsYXRpb24gcGxhdGZvcm0gbWlnaHQgbm90IGJlIHRoZSAnYnJvd3NlcicuXG4vLyAoYnJvd3NlciBwbGF0Zm9ybSB1c2VzIHRoaXMgZmlsZSBpbiBpdHMgaW1wbGVtZW50YXRpb24pLlxudmFyIE15RmlsZSA9IHJlcXVpcmUoJy4vTXlGaWxlJyk7XG5cbi8vIFNpbmNlIHdlIGFyZSB1c2luZyBicm93c2VyIGltcGxlbWVudGF0aW9uXG4vLyBvZiBjb3Jkb3ZhLWZpbGUtcGx1Z2luIGZvciBub24td2Via2l0IGJyb3dzZXJzLFxuLy8gd2Ugc2hvdWxkIHJlZmVyZW5jZSBJbmRleGVkIERCLCBiZWNhdXNlIGN1cnJlbnRseSBsb2FkZWRcbi8vIHNpbXVsYXRpb24gcGxhdGZvcm0gbWlnaHQgbm90IGJlIHRoZSAnYnJvd3NlcicuXG4vLyAoYnJvd3NlciBwbGF0Zm9ybSB1c2VzIHRoaXMgZmlsZSBpbiBpdHMgaW1wbGVtZW50YXRpb24pLlxudmFyIGluZGV4ZWREQiA9IHJlcXVpcmUoJy4vaW5kZXhlZERCJyk7XG5cbnZhciBESVJfU0VQQVJBVE9SID0gJy8nO1xudmFyIEZJTEVTWVNURU1fUFJFRklYID0gJ2ZpbGU6Ly8vJztcblxudmFyIGZpbGVTeXN0ZW0gPSBudWxsO1xuXG52YXIgcGF0aHNQcmVmaXggPSB7XG4gICAgLy8gUmVhZC1vbmx5IGRpcmVjdG9yeSB3aGVyZSB0aGUgYXBwbGljYXRpb24gaXMgaW5zdGFsbGVkLlxuICAgIGFwcGxpY2F0aW9uRGlyZWN0b3J5OiB3aW5kb3cubG9jYXRpb24ub3JpZ2luICsgJy8nLFxuICAgIC8vIFdoZXJlIHRvIHB1dCBhcHAtc3BlY2lmaWMgZGF0YSBmaWxlcy5cbiAgICBkYXRhRGlyZWN0b3J5OiAnZmlsZTovLy9wZXJzaXN0ZW50LycsXG4gICAgLy8gQ2FjaGVkIGZpbGVzIHRoYXQgc2hvdWxkIHN1cnZpdmUgYXBwIHJlc3RhcnRzLlxuICAgIC8vIEFwcHMgc2hvdWxkIG5vdCByZWx5IG9uIHRoZSBPUyB0byBkZWxldGUgZmlsZXMgaW4gaGVyZS5cbiAgICBjYWNoZURpcmVjdG9yeTogJ2ZpbGU6Ly8vdGVtcG9yYXJ5LycsXG4gICAgLy8gUmVhZC1vbmx5IGRpcmVjdG9yeSB3aGVyZSB0aGUgYXBwbGljYXRpb24gaXMgaW5zdGFsbGVkLlxuICAgIC8vIEFuZHJvaWQ6IHRoZSBhcHBsaWNhdGlvbiBzcGFjZSBvbiBleHRlcm5hbCBzdG9yYWdlLlxuICAgIGV4dGVybmFsQXBwbGljYXRpb25TdG9yYWdlRGlyZWN0b3J5OiBudWxsLFxuICAgIC8vIEFuZHJvaWQ6IFdoZXJlIHRvIHB1dCBhcHAtc3BlY2lmaWMgZGF0YSBmaWxlcyBvbiBleHRlcm5hbCBzdG9yYWdlLlxuICAgIGV4dGVybmFsRGF0YURpcmVjdG9yeTogbnVsbCxcbiAgICAvLyBBbmRyb2lkOiB0aGUgYXBwbGljYXRpb24gY2FjaGUgb24gZXh0ZXJuYWwgc3RvcmFnZS5cbiAgICBleHRlcm5hbENhY2hlRGlyZWN0b3J5OiBudWxsLFxuICAgIC8vIEFuZHJvaWQ6IHRoZSBleHRlcm5hbCBzdG9yYWdlIChTRCBjYXJkKSByb290LlxuICAgIGV4dGVybmFsUm9vdERpcmVjdG9yeTogbnVsbCxcbiAgICAvLyBpT1M6IFRlbXAgZGlyZWN0b3J5IHRoYXQgdGhlIE9TIGNhbiBjbGVhciBhdCB3aWxsLlxuICAgIHRlbXBEaXJlY3Rvcnk6IG51bGwsXG4gICAgLy8gaU9TOiBIb2xkcyBhcHAtc3BlY2lmaWMgZmlsZXMgdGhhdCBzaG91bGQgYmUgc3luY2VkIChlLmcuIHRvIGlDbG91ZCkuXG4gICAgc3luY2VkRGF0YURpcmVjdG9yeTogbnVsbCxcbiAgICAvLyBpT1M6IEZpbGVzIHByaXZhdGUgdG8gdGhlIGFwcCwgYnV0IHRoYXQgYXJlIG1lYW5pbmdmdWwgdG8gb3RoZXIgYXBwbGNpYXRpb25zIChlLmcuIE9mZmljZSBmaWxlcylcbiAgICBkb2N1bWVudHNEaXJlY3Rvcnk6IG51bGwsXG4gICAgLy8gQmxhY2tCZXJyeTEwOiBGaWxlcyBnbG9iYWxseSBhdmFpbGFibGUgdG8gYWxsIGFwcHNcbiAgICBzaGFyZWREaXJlY3Rvcnk6IG51bGxcbn07XG5cbi8vIFdlIG11c3Qgb3ZlcnJpZGUgc29tZSBmdW5jdGlvbmFsaXR5IHNvIHRoYXQgcGx1Z2luIGNhbiB3b3JrIHByb3Blcmx5LFxuLy8gZm9yIGV4YW1wbGUsIHdlIGNhbm5vdCBjYWxsICdjb3Jkb3ZhJyBvciBmaWxlLXBsdWdpbiByZWxhdGVkIGZpbGVzIGJlZm9yZSBkZXZpY2VyZWFkeVxuLy8gZXZlbnQgZmlyZWQgc2luY2UgYXBwLWhvc3QtaGFuZGxlcidzIGZpbGVzIGluaXRpYWxpemVzIGJlZm9yZSB0aGVtLlxuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZGV2aWNlcmVhZHknLCBmdW5jdGlvbiAoKSB7XG4gICAgLy8gV2UgbXVzdCBvdmVycmlkZSBnZXRGcyBmdW5jdGlvbiBzaW5jZSB3ZSBhcmUgdXNpbmcgYnJvd3NlciBpbXBsZW1lbnRhdGlvblxuICAgIC8vIG9mIGNvcmRvdmEtcGx1Z2luLWZpbGUgc28gZXZlcnl0aGluZyB3aWxsIHdvcmsgYXMgZXhwZWN0ZWQuXG4gICAgd2luZG93LmNvcmRvdmEucmVxdWlyZSgnY29yZG92YS1wbHVnaW4tZmlsZS5maWxlU3lzdGVtcycpLmdldEZzID0gZnVuY3Rpb24gKG5hbWUsIGNhbGxiYWNrKSB7XG4gICAgICAgIGNhbGxiYWNrKG5ldyB3aW5kb3cuRmlsZVN5c3RlbShuYW1lLCBmaWxlU3lzdGVtLnJvb3QpKTtcbiAgICB9O1xuICAgIC8vIFNwZWNpYWwgZnVuY3Rpb25hbGl0eSBmb3IgcHJvcGVyIEZpcmVmb3ggd29yay5cbiAgICB3aW5kb3cuRmlsZVN5c3RlbS5wcm90b3R5cGUuX19mb3JtYXRfXyA9IGZ1bmN0aW9uKGZ1bGxQYXRoKSB7XG4gICAgICAgIHJldHVybiAoRklMRVNZU1RFTV9QUkVGSVggKyB0aGlzLm5hbWUgKyAoZnVsbFBhdGhbMF0gPT09ICcvJyA/ICcnIDogJy8nKSArIGVuY29kZVVSSShmdWxsUGF0aCkpO1xuICAgIH07XG59LCBmYWxzZSk7XG5cbi8qKiogSGVscGVycyAqKiovXG5cbi8vIFdoZW4gc2F2aW5nIGFuIGVudHJ5LCB0aGUgZnVsbFBhdGggc2hvdWxkIGFsd2F5cyBsZWFkIHdpdGggYSBzbGFzaCBhbmQgbmV2ZXJcbi8vIGVuZCB3aXRoIG9uZSAoZS5nLiBhIGRpcmVjdG9yeSkuIEFsc28sIHJlc29sdmUgJy4nIGFuZCAnLi4nIHRvIGFuIGFic29sdXRlXG4vLyBvbmUuIFRoaXMgbWV0aG9kIGVuc3VyZXMgcGF0aCBpcyBsZWdpdCFcbmZ1bmN0aW9uIHJlc29sdmVUb0Z1bGxQYXRoXyhjd2RGdWxsUGF0aCwgcGF0aCkge1xuICAgIHBhdGggPSBwYXRoIHx8ICcnO1xuICAgIHZhciBmdWxsUGF0aCA9IHBhdGg7XG4gICAgdmFyIHByZWZpeCA9ICcnO1xuXG4gICAgY3dkRnVsbFBhdGggPSBjd2RGdWxsUGF0aCB8fCBESVJfU0VQQVJBVE9SO1xuICAgIGlmIChjd2RGdWxsUGF0aC5pbmRleE9mKEZJTEVTWVNURU1fUFJFRklYKSA9PT0gMCkge1xuICAgICAgICBwcmVmaXggPSBjd2RGdWxsUGF0aC5zdWJzdHJpbmcoMCwgY3dkRnVsbFBhdGguaW5kZXhPZihESVJfU0VQQVJBVE9SLCBGSUxFU1lTVEVNX1BSRUZJWC5sZW5ndGgpKTtcbiAgICAgICAgY3dkRnVsbFBhdGggPSBjd2RGdWxsUGF0aC5zdWJzdHJpbmcoY3dkRnVsbFBhdGguaW5kZXhPZihESVJfU0VQQVJBVE9SLCBGSUxFU1lTVEVNX1BSRUZJWC5sZW5ndGgpKTtcbiAgICB9XG5cbiAgICB2YXIgcmVsYXRpdmVQYXRoID0gcGF0aFswXSAhPT0gRElSX1NFUEFSQVRPUjtcbiAgICBpZiAocmVsYXRpdmVQYXRoKSB7XG4gICAgICAgIGZ1bGxQYXRoID0gY3dkRnVsbFBhdGg7XG4gICAgICAgIGlmIChjd2RGdWxsUGF0aCAhPT0gRElSX1NFUEFSQVRPUikge1xuICAgICAgICAgICAgZnVsbFBhdGggKz0gRElSX1NFUEFSQVRPUiArIHBhdGg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmdWxsUGF0aCArPSBwYXRoO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIGRvdWJsZWQgc2VwYXJhdG9yIHN1YnN0cmluZ3NcbiAgICB2YXIgcmUgPSBuZXcgUmVnRXhwKERJUl9TRVBBUkFUT1IgKyBESVJfU0VQQVJBVE9SLCAnZycpO1xuICAgIGZ1bGxQYXRoID0gZnVsbFBhdGgucmVwbGFjZShyZSwgRElSX1NFUEFSQVRPUik7XG5cbiAgICAvLyBBZGp1c3QgJy4uJ3MgYnkgcmVtb3ZpbmcgcGFyZW50IGRpcmVjdG9yaWVzIHdoZW4gJy4uJyBmbG93cyBpbiBwYXRoLlxuICAgIHZhciBwYXJ0cyA9IGZ1bGxQYXRoLnNwbGl0KERJUl9TRVBBUkFUT1IpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgdmFyIHBhcnQgPSBwYXJ0c1tpXTtcbiAgICAgICAgaWYgKHBhcnQgPT09ICcuLicpIHtcbiAgICAgICAgICAgIHBhcnRzW2kgLSAxXSA9ICcnO1xuICAgICAgICAgICAgcGFydHNbaV0gPSAnJztcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdWxsUGF0aCA9IHBhcnRzLmZpbHRlcihmdW5jdGlvbihlbCkge1xuICAgICAgICByZXR1cm4gZWw7XG4gICAgfSkuam9pbihESVJfU0VQQVJBVE9SKTtcblxuICAgIC8vIEFkZCBiYWNrIGluIGxlYWRpbmcgc2xhc2guXG4gICAgaWYgKGZ1bGxQYXRoWzBdICE9PSBESVJfU0VQQVJBVE9SKSB7XG4gICAgICAgIGZ1bGxQYXRoID0gRElSX1NFUEFSQVRPUiArIGZ1bGxQYXRoO1xuICAgIH1cblxuICAgIC8vIFJlcGxhY2UgJy4vJyBieSBjdXJyZW50IGRpci4gKCcuL29uZS8uL3R3bycgLT4gb25lL3R3bylcbiAgICBmdWxsUGF0aCA9IGZ1bGxQYXRoLnJlcGxhY2UoL1xcLlxcLy9nLCBESVJfU0VQQVJBVE9SKTtcblxuICAgIC8vIFJlcGxhY2UgJy8vJyB3aXRoICcvJy5cbiAgICBmdWxsUGF0aCA9IGZ1bGxQYXRoLnJlcGxhY2UoL1xcL1xcLy9nLCBESVJfU0VQQVJBVE9SKTtcblxuICAgIC8vIFJlcGxhY2UgJy8uJyB3aXRoICcvJy5cbiAgICBmdWxsUGF0aCA9IGZ1bGxQYXRoLnJlcGxhY2UoL1xcL1xcLi9nLCBESVJfU0VQQVJBVE9SKTtcblxuICAgIC8vIFJlbW92ZSAnLycgaWYgaXQgYXBwZWFycyBvbiB0aGUgZW5kLlxuICAgIGlmIChmdWxsUGF0aFtmdWxsUGF0aC5sZW5ndGggLSAxXSA9PT0gRElSX1NFUEFSQVRPUiAmJlxuICAgICAgICBmdWxsUGF0aCAhPT0gRElSX1NFUEFSQVRPUikge1xuICAgICAgICBmdWxsUGF0aCA9IGZ1bGxQYXRoLnN1YnN0cmluZygwLCBmdWxsUGF0aC5sZW5ndGggLSAxKTtcbiAgICB9XG5cbiAgICB2YXIgc3RvcmFnZVBhdGggPSBwcmVmaXggKyBmdWxsUGF0aDtcbiAgICBzdG9yYWdlUGF0aCA9IGRlY29kZVVSSShzdG9yYWdlUGF0aCk7XG4gICAgZnVsbFBhdGggPSBkZWNvZGVVUkkoZnVsbFBhdGgpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgc3RvcmFnZVBhdGg6IHN0b3JhZ2VQYXRoLFxuICAgICAgICBmdWxsUGF0aDogZnVsbFBhdGgsXG4gICAgICAgIGZpbGVOYW1lOiBmdWxsUGF0aC5zcGxpdChESVJfU0VQQVJBVE9SKS5wb3AoKSxcbiAgICAgICAgZnNOYW1lOiBwcmVmaXguc3BsaXQoRElSX1NFUEFSQVRPUikucG9wKClcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBmaWxlRW50cnlGcm9tSWRiRW50cnkoZmlsZUVudHJ5KSB7XG4gICAgLy8gSURCIHdvbid0IHNhdmUgbWV0aG9kcywgc28gd2UgbmVlZCByZS1jcmVhdGUgdGhlIEZpbGVFbnRyeS5cbiAgICB2YXIgY2xvbmVkRmlsZUVudHJ5ID0gbmV3IHdpbmRvdy5GaWxlRW50cnkoZmlsZUVudHJ5Lm5hbWUsIGZpbGVFbnRyeS5mdWxsUGF0aCwgZmlsZUVudHJ5LmZpbGVzeXN0ZW0pO1xuICAgIGNsb25lZEZpbGVFbnRyeS5maWxlXyA9IGZpbGVFbnRyeS5maWxlXztcblxuICAgIHJldHVybiBjbG9uZWRGaWxlRW50cnk7XG59XG5cbmZ1bmN0aW9uIHJlYWRBcyh3aGF0LCBmdWxsUGF0aCwgZW5jb2RpbmcsIHN0YXJ0UG9zLCBlbmRQb3MsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykge1xuICAgIGdldEZpbGUoZnVuY3Rpb24oZmlsZUVudHJ5KSB7XG4gICAgICAgIHZhciBmaWxlUmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKSxcbiAgICAgICAgICAgIGJsb2IgPSBmaWxlRW50cnkuZmlsZV8uYmxvYl8uc2xpY2Uoc3RhcnRQb3MsIGVuZFBvcyk7XG5cbiAgICAgICAgZmlsZVJlYWRlci5vbmxvYWQgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICBzdWNjZXNzQ2FsbGJhY2soZS50YXJnZXQucmVzdWx0KTtcbiAgICAgICAgfTtcblxuICAgICAgICBmaWxlUmVhZGVyLm9uZXJyb3IgPSBlcnJvckNhbGxiYWNrO1xuXG4gICAgICAgIHN3aXRjaCAod2hhdCkge1xuICAgICAgICAgICAgY2FzZSAndGV4dCc6XG4gICAgICAgICAgICAgICAgZmlsZVJlYWRlci5yZWFkQXNUZXh0KGJsb2IsIGVuY29kaW5nKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2RhdGFVUkwnOlxuICAgICAgICAgICAgICAgIGZpbGVSZWFkZXIucmVhZEFzRGF0YVVSTChibG9iKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2FycmF5QnVmZmVyJzpcbiAgICAgICAgICAgICAgICBmaWxlUmVhZGVyLnJlYWRBc0FycmF5QnVmZmVyKGJsb2IpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnYmluYXJ5U3RyaW5nJzpcbiAgICAgICAgICAgICAgICBmaWxlUmVhZGVyLnJlYWRBc0JpbmFyeVN0cmluZyhibG9iKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgfSwgZXJyb3JDYWxsYmFjaywgW2Z1bGxQYXRoLCBudWxsXSk7XG59XG5cbi8qKiogSGFuZGxlcnMgKioqL1xuXG5mdW5jdGlvbiByZXF1ZXN0RmlsZVN5c3RlbShzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2ssIGFyZ3MpIHtcbiAgICB2YXIgdHlwZSA9IGFyZ3NbMF07XG4gICAgLy8gU2l6ZSBpcyBpZ25vcmVkIHNpbmNlIElEQiBmaWxlc3lzdGVtIHNpemUgZGVwZW5kc1xuICAgIC8vIG9uIGJyb3dzZXIgaW1wbGVtZW50YXRpb24gYW5kIGNhbid0IGJlIHNldCB1cCBieSB1c2VyXG4gICAgdmFyIHNpemUgPSBhcmdzWzFdOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG5cbiAgICBpZiAodHlwZSAhPT0gd2luZG93LkxvY2FsRmlsZVN5c3RlbS5URU1QT1JBUlkgJiYgdHlwZSAhPT0gd2luZG93LkxvY2FsRmlsZVN5c3RlbS5QRVJTSVNURU5UKSB7XG4gICAgICAgIGVycm9yQ2FsbGJhY2sgJiYgZXJyb3JDYWxsYmFjayh3aW5kb3cuRmlsZUVycm9yLklOVkFMSURfTU9ESUZJQ0FUSU9OX0VSUik7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgbmFtZSA9IHR5cGUgPT09IHdpbmRvdy5Mb2NhbEZpbGVTeXN0ZW0uVEVNUE9SQVJZID8gJ3RlbXBvcmFyeScgOiAncGVyc2lzdGVudCc7XG4gICAgdmFyIHN0b3JhZ2VOYW1lID0gKGxvY2F0aW9uLnByb3RvY29sICsgbG9jYXRpb24uaG9zdCkucmVwbGFjZSgvOi9nLCAnXycpO1xuXG4gICAgdmFyIHJvb3QgPSBuZXcgd2luZG93LkRpcmVjdG9yeUVudHJ5KCcnLCBESVJfU0VQQVJBVE9SKTtcbiAgICBmaWxlU3lzdGVtID0gbmV3IHdpbmRvdy5GaWxlU3lzdGVtKG5hbWUsIHJvb3QpO1xuXG4gICAgaW5kZXhlZERCLm9wZW4oc3RvcmFnZU5hbWUsIGZ1bmN0aW9uKCkge1xuICAgICAgICBzdWNjZXNzQ2FsbGJhY2soZmlsZVN5c3RlbSk7XG4gICAgfSwgZXJyb3JDYWxsYmFjayk7XG59XG5cbmZ1bmN0aW9uIHJlcXVlc3RGaWxlU3lzdGVtSGFuZGxlcihzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2ssIG1vZHVsZSwgZXZlbnQsIGFyZ3MpIHtcbiAgICByZXF1ZXN0RmlsZVN5c3RlbShzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2ssIGFyZ3MpO1xufVxuXG4vLyBsaXN0IGEgZGlyZWN0b3J5J3MgY29udGVudHMgKGZpbGVzIGFuZCBmb2xkZXJzKS5cbmZ1bmN0aW9uIHJlYWRFbnRyaWVzKHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaywgYXJncykge1xuICAgIHZhciBmdWxsUGF0aCA9IGFyZ3NbMF07XG5cbiAgICBpZiAodHlwZW9mIHN1Y2Nlc3NDYWxsYmFjayAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBFcnJvcignRXhwZWN0ZWQgc3VjY2Vzc0NhbGxiYWNrIGFyZ3VtZW50LicpO1xuICAgIH1cblxuICAgIHZhciBwYXRoID0gcmVzb2x2ZVRvRnVsbFBhdGhfKGZ1bGxQYXRoKTtcblxuICAgIGdldERpcmVjdG9yeShmdW5jdGlvbigpIHtcbiAgICAgICAgaW5kZXhlZERCLmdldEFsbEVudHJpZXMocGF0aC5mdWxsUGF0aCArIERJUl9TRVBBUkFUT1IsIHBhdGguc3RvcmFnZVBhdGgsIGZ1bmN0aW9uKGVudHJpZXMpIHtcbiAgICAgICAgICAgIHN1Y2Nlc3NDYWxsYmFjayhlbnRyaWVzKTtcbiAgICAgICAgfSwgZXJyb3JDYWxsYmFjayk7XG4gICAgfSwgZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmIChlcnJvckNhbGxiYWNrKSB7XG4gICAgICAgICAgICBlcnJvckNhbGxiYWNrKHdpbmRvdy5GaWxlRXJyb3IuTk9UX0ZPVU5EX0VSUik7XG4gICAgICAgIH1cbiAgICB9LCBbcGF0aC5zdG9yYWdlUGF0aCwgcGF0aC5mdWxsUGF0aCwge2NyZWF0ZTogZmFsc2V9XSk7XG59XG5cbmZ1bmN0aW9uIHJlYWRFbnRyaWVzSGFuZGxlcihzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2ssIG1vZHVsZSwgZXZlbnQsIGFyZ3MpIHtcbiAgICByZWFkRW50cmllcyhzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2ssIGFyZ3MpO1xufVxuXG5mdW5jdGlvbiBnZXRGaWxlKHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaywgYXJncykge1xuICAgIHZhciBmdWxsUGF0aCA9IGFyZ3NbMF07XG4gICAgdmFyIHBhdGggPSBhcmdzWzFdO1xuICAgIHZhciBvcHRpb25zID0gYXJnc1syXSB8fCB7fTtcblxuICAgIC8vIENyZWF0ZSBhbiBhYnNvbHV0ZSBwYXRoIGlmIHdlIHdlcmUgaGFuZGVkIGEgcmVsYXRpdmUgb25lLlxuICAgIHBhdGggPSByZXNvbHZlVG9GdWxsUGF0aF8oZnVsbFBhdGgsIHBhdGgpO1xuXG4gICAgaW5kZXhlZERCLmdldChwYXRoLnN0b3JhZ2VQYXRoLCBmdW5jdGlvbihmaWxlRW50cnkpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMuY3JlYXRlID09PSB0cnVlICYmIG9wdGlvbnMuZXhjbHVzaXZlID09PSB0cnVlICYmIGZpbGVFbnRyeSkge1xuICAgICAgICAgICAgLy8gSWYgY3JlYXRlIGFuZCBleGNsdXNpdmUgYXJlIGJvdGggdHJ1ZSwgYW5kIHRoZSBwYXRoIGFscmVhZHkgZXhpc3RzLFxuICAgICAgICAgICAgLy8gZ2V0RmlsZSBtdXN0IGZhaWwuXG5cbiAgICAgICAgICAgIGlmIChlcnJvckNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgZXJyb3JDYWxsYmFjayh3aW5kb3cuRmlsZUVycm9yLlBBVEhfRVhJU1RTX0VSUik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAob3B0aW9ucy5jcmVhdGUgPT09IHRydWUgJiYgIWZpbGVFbnRyeSkge1xuICAgICAgICAgICAgLy8gSWYgY3JlYXRlIGlzIHRydWUsIHRoZSBwYXRoIGRvZXNuJ3QgZXhpc3QsIGFuZCBubyBvdGhlciBlcnJvciBvY2N1cnMsXG4gICAgICAgICAgICAvLyBnZXRGaWxlIG11c3QgY3JlYXRlIGl0IGFzIGEgemVyby1sZW5ndGggZmlsZSBhbmQgcmV0dXJuIGEgY29ycmVzcG9uZGluZ1xuICAgICAgICAgICAgLy8gRmlsZUVudHJ5LlxuICAgICAgICAgICAgdmFyIG5ld0ZpbGVFbnRyeSA9IG5ldyB3aW5kb3cuRmlsZUVudHJ5KHBhdGguZmlsZU5hbWUsIHBhdGguZnVsbFBhdGgsIG5ldyB3aW5kb3cuRmlsZVN5c3RlbShwYXRoLmZzTmFtZSwgZmlsZVN5c3RlbS5yb290KSk7XG5cbiAgICAgICAgICAgIG5ld0ZpbGVFbnRyeS5maWxlXyA9IG5ldyBNeUZpbGUoe1xuICAgICAgICAgICAgICAgIHNpemU6IDAsXG4gICAgICAgICAgICAgICAgbmFtZTogbmV3RmlsZUVudHJ5Lm5hbWUsXG4gICAgICAgICAgICAgICAgbGFzdE1vZGlmaWVkRGF0ZTogbmV3IERhdGUoKSxcbiAgICAgICAgICAgICAgICBzdG9yYWdlUGF0aDogcGF0aC5zdG9yYWdlUGF0aFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGluZGV4ZWREQi5wdXQobmV3RmlsZUVudHJ5LCBwYXRoLnN0b3JhZ2VQYXRoLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spO1xuICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbnMuY3JlYXRlID09PSB0cnVlICYmIGZpbGVFbnRyeSkge1xuICAgICAgICAgICAgaWYgKGZpbGVFbnRyeS5pc0ZpbGUpIHtcbiAgICAgICAgICAgICAgICAvLyBPdmVyd3JpdGUgZmlsZSwgZGVsZXRlIHRoZW4gY3JlYXRlIG5ldy5cbiAgICAgICAgICAgICAgICBpbmRleGVkREJbJ2RlbGV0ZSddKHBhdGguc3RvcmFnZVBhdGgsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgbmV3RmlsZUVudHJ5ID0gbmV3IHdpbmRvdy5GaWxlRW50cnkocGF0aC5maWxlTmFtZSwgcGF0aC5mdWxsUGF0aCwgbmV3IHdpbmRvdy5GaWxlU3lzdGVtKHBhdGguZnNOYW1lLCBmaWxlU3lzdGVtLnJvb3QpKTtcblxuICAgICAgICAgICAgICAgICAgICBuZXdGaWxlRW50cnkuZmlsZV8gPSBuZXcgTXlGaWxlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBuZXdGaWxlRW50cnkubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RNb2RpZmllZERhdGU6IG5ldyBEYXRlKCksXG4gICAgICAgICAgICAgICAgICAgICAgICBzdG9yYWdlUGF0aDogcGF0aC5zdG9yYWdlUGF0aFxuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICBpbmRleGVkREIucHV0KG5ld0ZpbGVFbnRyeSwgcGF0aC5zdG9yYWdlUGF0aCwgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKTtcbiAgICAgICAgICAgICAgICB9LCBlcnJvckNhbGxiYWNrKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGVycm9yQ2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JDYWxsYmFjayh3aW5kb3cuRmlsZUVycm9yLklOVkFMSURfTU9ESUZJQ0FUSU9OX0VSUik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKCghb3B0aW9ucy5jcmVhdGUgfHwgb3B0aW9ucy5jcmVhdGUgPT09IGZhbHNlKSAmJiAhZmlsZUVudHJ5KSB7XG4gICAgICAgICAgICAvLyBJZiBjcmVhdGUgaXMgbm90IHRydWUgYW5kIHRoZSBwYXRoIGRvZXNuJ3QgZXhpc3QsIGdldEZpbGUgbXVzdCBmYWlsLlxuICAgICAgICAgICAgaWYgKGVycm9yQ2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICBlcnJvckNhbGxiYWNrKHdpbmRvdy5GaWxlRXJyb3IuTk9UX0ZPVU5EX0VSUik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoKCFvcHRpb25zLmNyZWF0ZSB8fCBvcHRpb25zLmNyZWF0ZSA9PT0gZmFsc2UpICYmIGZpbGVFbnRyeSAmJlxuICAgICAgICAgICAgZmlsZUVudHJ5LmlzRGlyZWN0b3J5KSB7XG4gICAgICAgICAgICAvLyBJZiBjcmVhdGUgaXMgbm90IHRydWUgYW5kIHRoZSBwYXRoIGV4aXN0cywgYnV0IGlzIGEgZGlyZWN0b3J5LCBnZXRGaWxlXG4gICAgICAgICAgICAvLyBtdXN0IGZhaWwuXG4gICAgICAgICAgICBpZiAoZXJyb3JDYWxsYmFjaykge1xuICAgICAgICAgICAgICAgIGVycm9yQ2FsbGJhY2sod2luZG93LkZpbGVFcnJvci5UWVBFX01JU01BVENIX0VSUik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBPdGhlcndpc2UsIGlmIG5vIG90aGVyIGVycm9yIG9jY3VycywgZ2V0RmlsZSBtdXN0IHJldHVybiBhIEZpbGVFbnRyeVxuICAgICAgICAgICAgLy8gY29ycmVzcG9uZGluZyB0byBwYXRoLlxuXG4gICAgICAgICAgICBzdWNjZXNzQ2FsbGJhY2soZmlsZUVudHJ5RnJvbUlkYkVudHJ5KGZpbGVFbnRyeSkpO1xuICAgICAgICB9XG4gICAgfSwgZXJyb3JDYWxsYmFjayk7XG59XG5cbmZ1bmN0aW9uIGdldEZpbGVIYW5kbGVyKHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaywgbW9kdWxlLCBldmVudCwgYXJncykge1xuICAgIGdldEZpbGUoc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrLCBhcmdzKTtcbn1cblxuZnVuY3Rpb24gZ2V0RmlsZU1ldGFkYXRhKHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaywgbW9kdWxlLCBldmVudCwgYXJncykge1xuICAgIHZhciBmdWxsUGF0aCA9IGFyZ3NbMF07XG5cbiAgICBnZXRGaWxlKGZ1bmN0aW9uKGZpbGVFbnRyeSkge1xuICAgICAgICBzdWNjZXNzQ2FsbGJhY2sobmV3IHdpbmRvdy5GaWxlKGZpbGVFbnRyeS5maWxlXy5uYW1lLCBmaWxlRW50cnkuZnVsbFBhdGgsICcnLCBmaWxlRW50cnkuZmlsZV8ubGFzdE1vZGlmaWVkRGF0ZSxcbiAgICAgICAgICAgIGZpbGVFbnRyeS5maWxlXy5zaXplKSk7XG4gICAgfSwgZXJyb3JDYWxsYmFjaywgW2Z1bGxQYXRoLCBudWxsXSk7XG59XG5cbmZ1bmN0aW9uIHNldE1ldGFkYXRhKHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaywgbW9kdWxlLCBldmVudCwgYXJncykge1xuICAgIHZhciBmdWxsUGF0aCA9IGFyZ3NbMF07XG4gICAgdmFyIG1ldGFkYXRhT2JqZWN0ID0gYXJnc1sxXTtcblxuICAgIGdldEZpbGUoZnVuY3Rpb24gKGZpbGVFbnRyeSkge1xuICAgICAgICBmaWxlRW50cnkuZmlsZV8ubGFzdE1vZGlmaWVkRGF0ZSA9IG1ldGFkYXRhT2JqZWN0Lm1vZGlmaWNhdGlvblRpbWU7XG4gICAgICAgIGluZGV4ZWREQi5wdXQoZmlsZUVudHJ5LCBmaWxlRW50cnkuZmlsZV8uc3RvcmFnZVBhdGgsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjayk7XG4gICAgfSwgZXJyb3JDYWxsYmFjaywgW2Z1bGxQYXRoLCBudWxsXSk7XG59XG5cbmZ1bmN0aW9uIHdyaXRlKHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaywgYXJncykge1xuICAgIHZhciBmaWxlTmFtZSA9IGFyZ3NbMF0sXG4gICAgICAgIGRhdGEgPSBhcmdzWzFdLFxuICAgICAgICBwb3NpdGlvbiA9IGFyZ3NbMl0sXG4gICAgICAgIGlzQmluYXJ5ID0gYXJnc1szXTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuXG4gICAgaWYgKCFkYXRhKSB7XG4gICAgICAgIGVycm9yQ2FsbGJhY2sgJiYgZXJyb3JDYWxsYmFjayh3aW5kb3cuRmlsZUVycm9yLklOVkFMSURfTU9ESUZJQ0FUSU9OX0VSUik7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnIHx8IGRhdGEgaW5zdGFuY2VvZiBTdHJpbmcpIHtcbiAgICAgICAgZGF0YSA9IG5ldyBCbG9iKFtkYXRhXSk7XG4gICAgfVxuXG4gICAgZ2V0RmlsZShmdW5jdGlvbihmaWxlRW50cnkpIHtcbiAgICAgICAgdmFyIGJsb2JfID0gZmlsZUVudHJ5LmZpbGVfLmJsb2JfO1xuXG4gICAgICAgIGlmICghYmxvYl8pIHtcbiAgICAgICAgICAgIGJsb2JfID0gbmV3IEJsb2IoW2RhdGFdLCB7dHlwZTogZGF0YS50eXBlfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBDYWxjIHRoZSBoZWFkIGFuZCB0YWlsIGZyYWdtZW50c1xuICAgICAgICAgICAgdmFyIGhlYWQgPSBibG9iXy5zbGljZSgwLCBwb3NpdGlvbik7XG4gICAgICAgICAgICB2YXIgdGFpbCA9IGJsb2JfLnNsaWNlKHBvc2l0aW9uICsgKGRhdGEuc2l6ZSB8fCBkYXRhLmJ5dGVMZW5ndGgpKTtcblxuICAgICAgICAgICAgLy8gQ2FsYyB0aGUgcGFkZGluZ1xuICAgICAgICAgICAgdmFyIHBhZGRpbmcgPSBwb3NpdGlvbiAtIGhlYWQuc2l6ZTtcbiAgICAgICAgICAgIGlmIChwYWRkaW5nIDwgMCkge1xuICAgICAgICAgICAgICAgIHBhZGRpbmcgPSAwO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBEbyB0aGUgJ3dyaXRlJy4gSW4gZmFjdCwgYSBmdWxsIG92ZXJ3cml0ZSBvZiB0aGUgQmxvYi5cbiAgICAgICAgICAgIGJsb2JfID0gbmV3IEJsb2IoW2hlYWQsIG5ldyBVaW50OEFycmF5KHBhZGRpbmcpLCBkYXRhLCB0YWlsXSxcbiAgICAgICAgICAgICAgICB7dHlwZTogZGF0YS50eXBlfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTZXQgdGhlIGJsb2Igd2UncmUgd3JpdGluZyBvbiB0aGlzIGZpbGUgZW50cnkgc28gd2UgY2FuIHJlY2FsbCBpdCBsYXRlci5cbiAgICAgICAgZmlsZUVudHJ5LmZpbGVfLmJsb2JfID0gYmxvYl87XG4gICAgICAgIGZpbGVFbnRyeS5maWxlXy5sYXN0TW9kaWZpZWREYXRlID0gbmV3IERhdGUoKSB8fCBudWxsO1xuICAgICAgICBmaWxlRW50cnkuZmlsZV8uc2l6ZSA9IGJsb2JfLnNpemU7XG4gICAgICAgIGZpbGVFbnRyeS5maWxlXy5uYW1lID0gYmxvYl8ubmFtZTtcbiAgICAgICAgZmlsZUVudHJ5LmZpbGVfLnR5cGUgPSBibG9iXy50eXBlO1xuXG4gICAgICAgIGluZGV4ZWREQi5wdXQoZmlsZUVudHJ5LCBmaWxlRW50cnkuZmlsZV8uc3RvcmFnZVBhdGgsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgc3VjY2Vzc0NhbGxiYWNrKGRhdGEuc2l6ZSB8fCBkYXRhLmJ5dGVMZW5ndGgpO1xuICAgICAgICB9LCBlcnJvckNhbGxiYWNrKTtcbiAgICB9LCBlcnJvckNhbGxiYWNrLCBbZmlsZU5hbWUsIG51bGxdKTtcbn1cblxuZnVuY3Rpb24gd3JpdGVIYW5kbGVyKHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaywgbW9kdWxlLCBldmVudCwgYXJncykge1xuICAgIHdyaXRlKHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaywgYXJncyk7XG59XG5cbmZ1bmN0aW9uIHJlYWRBc1RleHRIYW5kbGVyKHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaywgbW9kdWxlLCBldmVudCwgYXJncykge1xuICAgIHZhciBmaWxlTmFtZSA9IGFyZ3NbMF0sXG4gICAgICAgIGVuYyA9IGFyZ3NbMV0sXG4gICAgICAgIHN0YXJ0UG9zID0gYXJnc1syXSxcbiAgICAgICAgZW5kUG9zID0gYXJnc1szXTtcblxuICAgIHJlYWRBcygndGV4dCcsIGZpbGVOYW1lLCBlbmMsIHN0YXJ0UG9zLCBlbmRQb3MsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjayk7XG59XG5cbmZ1bmN0aW9uIHJlYWRBc0RhdGFVUkxIYW5kbGVyKHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaywgbW9kdWxlLCBldmVudCwgYXJncykge1xuICAgIHZhciBmaWxlTmFtZSA9IGFyZ3NbMF0sXG4gICAgICAgIHN0YXJ0UG9zID0gYXJnc1sxXSxcbiAgICAgICAgZW5kUG9zID0gYXJnc1syXTtcblxuICAgIHJlYWRBcygnZGF0YVVSTCcsIGZpbGVOYW1lLCBudWxsLCBzdGFydFBvcywgZW5kUG9zLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spO1xufVxuXG5mdW5jdGlvbiByZWFkQXNCaW5hcnlTdHJpbmdIYW5kbGVyKHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaywgbW9kdWxlLCBldmVudCwgYXJncykge1xuICAgIHZhciBmaWxlTmFtZSA9IGFyZ3NbMF0sXG4gICAgICAgIHN0YXJ0UG9zID0gYXJnc1sxXSxcbiAgICAgICAgZW5kUG9zID0gYXJnc1syXTtcblxuICAgIHJlYWRBcygnYmluYXJ5U3RyaW5nJywgZmlsZU5hbWUsIG51bGwsIHN0YXJ0UG9zLCBlbmRQb3MsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjayk7XG59XG5cbmZ1bmN0aW9uIHJlYWRBc0FycmF5QnVmZmVySGFuZGxlcihzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2ssIG1vZHVsZSwgZXZlbnQsIGFyZ3MpIHtcbiAgICB2YXIgZmlsZU5hbWUgPSBhcmdzWzBdLFxuICAgICAgICBzdGFydFBvcyA9IGFyZ3NbMV0sXG4gICAgICAgIGVuZFBvcyA9IGFyZ3NbMl07XG5cbiAgICByZWFkQXMoJ2FycmF5QnVmZmVyJywgZmlsZU5hbWUsIG51bGwsIHN0YXJ0UG9zLCBlbmRQb3MsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjayk7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZVJlY3Vyc2l2ZWx5KHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaywgbW9kdWxlLCBldmVudCwgYXJncykge1xuICAgIHJlbW92ZUhhbmRsZXIoc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrLCBtb2R1bGUsIGV2ZW50LCBhcmdzKTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlKHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaywgYXJncykge1xuICAgIHZhciBmdWxsUGF0aCA9IHJlc29sdmVUb0Z1bGxQYXRoXyhhcmdzWzBdKS5zdG9yYWdlUGF0aDtcbiAgICBpZiAoZnVsbFBhdGggPT09IHBhdGhzUHJlZml4LmNhY2hlRGlyZWN0b3J5IHx8IGZ1bGxQYXRoID09PSBwYXRoc1ByZWZpeC5kYXRhRGlyZWN0b3J5KSB7XG4gICAgICAgIGVycm9yQ2FsbGJhY2sod2luZG93LkZpbGVFcnJvci5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZGVsZXRlRW50cnkoaXNEaXJlY3RvcnkpIHtcbiAgICAgICAgLy8gVE9ETzogVGhpcyBkb2Vzbid0IHByb3RlY3QgYWdhaW5zdCBkaXJlY3RvcmllcyB0aGF0IGhhdmUgY29udGVudCBpbiBpdC5cbiAgICAgICAgLy8gU2hvdWxkIHRocm93IGFuIGVycm9yIGluc3RlYWQgaWYgdGhlIGRpckVudHJ5IGlzIG5vdCBlbXB0eS5cbiAgICAgICAgaW5kZXhlZERCWydkZWxldGUnXShmdWxsUGF0aCwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBzdWNjZXNzQ2FsbGJhY2sgJiYgc3VjY2Vzc0NhbGxiYWNrKCk7XG4gICAgICAgIH0sIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgZXJyb3JDYWxsYmFjayAmJiBlcnJvckNhbGxiYWNrKCk7XG4gICAgICAgIH0sIGlzRGlyZWN0b3J5KTtcbiAgICB9XG5cbiAgICAvLyBXZSBuZWVkIHRvIHRvIHVuZGVyc3RhbmQgd2hhdCB3ZSBhcmUgZGVsZXRpbmc6XG4gICAgZ2V0RGlyZWN0b3J5KGZ1bmN0aW9uKGVudHJ5KSB7XG4gICAgICAgIGRlbGV0ZUVudHJ5KGVudHJ5LmlzRGlyZWN0b3J5KTtcbiAgICB9LCBmdW5jdGlvbigpe1xuICAgICAgICAvL0RpcmVjdG9yeUVudHJ5IHdhcyBhbHJlYWR5IGRlbGV0ZWQgb3IgZW50cnkgaXMgRmlsZUVudHJ5XG4gICAgICAgIGRlbGV0ZUVudHJ5KGZhbHNlKTtcbiAgICB9LCBbZnVsbFBhdGgsIG51bGwsIHtjcmVhdGU6IGZhbHNlfV0pO1xufVxuXG5mdW5jdGlvbiByZW1vdmVIYW5kbGVyKHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaywgbW9kdWxlLCBldmVudCwgYXJncykge1xuICAgIHJlbW92ZShzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2ssIGFyZ3MpO1xufVxuXG5mdW5jdGlvbiBnZXREaXJlY3Rvcnkoc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrLCBhcmdzKSB7XG4gICAgdmFyIGZ1bGxQYXRoID0gYXJnc1swXTtcbiAgICB2YXIgcGF0aCA9IGFyZ3NbMV07XG4gICAgdmFyIG9wdGlvbnMgPSBhcmdzWzJdO1xuXG4gICAgLy8gQ3JlYXRlIGFuIGFic29sdXRlIHBhdGggaWYgd2Ugd2VyZSBoYW5kZWQgYSByZWxhdGl2ZSBvbmUuXG4gICAgcGF0aCA9IHJlc29sdmVUb0Z1bGxQYXRoXyhmdWxsUGF0aCwgcGF0aCk7XG5cbiAgICBpbmRleGVkREIuZ2V0KHBhdGguc3RvcmFnZVBhdGgsIGZ1bmN0aW9uKGZvbGRlckVudHJ5KSB7XG4gICAgICAgIGlmICghb3B0aW9ucykge1xuICAgICAgICAgICAgb3B0aW9ucyA9IHt9O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnMuY3JlYXRlID09PSB0cnVlICYmIG9wdGlvbnMuZXhjbHVzaXZlID09PSB0cnVlICYmIGZvbGRlckVudHJ5KSB7XG4gICAgICAgICAgICAvLyBJZiBjcmVhdGUgYW5kIGV4Y2x1c2l2ZSBhcmUgYm90aCB0cnVlLCBhbmQgdGhlIHBhdGggYWxyZWFkeSBleGlzdHMsXG4gICAgICAgICAgICAvLyBnZXREaXJlY3RvcnkgbXVzdCBmYWlsLlxuICAgICAgICAgICAgaWYgKGVycm9yQ2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICBlcnJvckNhbGxiYWNrKHdpbmRvdy5GaWxlRXJyb3IuUEFUSF9FWElTVFNfRVJSKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFRoZXJlIGlzIGEgc3RyYW5nZSBidWcgaW4gbW9iaWxlc3BlYyArIEZGLCB3aGljaCByZXN1bHRzIGluIGNvbWluZyB0byBtdWx0aXBsZSBlbHNlLWlmJ3NcbiAgICAgICAgICAgIC8vIHNvIHdlIGFyZSBzaGllbGRpbmcgZnJvbSBpdCB3aXRoIHJldHVybnMuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucy5jcmVhdGUgPT09IHRydWUgJiYgIWZvbGRlckVudHJ5KSB7XG4gICAgICAgICAgICAvLyBJZiBjcmVhdGUgaXMgdHJ1ZSwgdGhlIHBhdGggZG9lc24ndCBleGlzdCwgYW5kIG5vIG90aGVyIGVycm9yIG9jY3VycyxcbiAgICAgICAgICAgIC8vIGdldERpcmVjdG9yeSBtdXN0IGNyZWF0ZSBpdCBhcyBhIHplcm8tbGVuZ3RoIGZpbGUgYW5kIHJldHVybiBhIGNvcnJlc3BvbmRpbmdcbiAgICAgICAgICAgIC8vIE15RGlyZWN0b3J5RW50cnkuXG4gICAgICAgICAgICB2YXIgZGlyRW50cnkgPSBuZXcgd2luZG93LkRpcmVjdG9yeUVudHJ5KHBhdGguZmlsZU5hbWUsIHBhdGguZnVsbFBhdGgsIG5ldyB3aW5kb3cuRmlsZVN5c3RlbShwYXRoLmZzTmFtZSwgZmlsZVN5c3RlbS5yb290KSk7XG5cbiAgICAgICAgICAgIGluZGV4ZWREQi5wdXQoZGlyRW50cnksIHBhdGguc3RvcmFnZVBhdGgsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjayk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucy5jcmVhdGUgPT09IHRydWUgJiYgZm9sZGVyRW50cnkpIHtcblxuICAgICAgICAgICAgaWYgKGZvbGRlckVudHJ5LmlzRGlyZWN0b3J5KSB7XG4gICAgICAgICAgICAgICAgLy8gSURCIHdvbid0IHNhdmUgbWV0aG9kcywgc28gd2UgbmVlZCByZS1jcmVhdGUgdGhlIE15RGlyZWN0b3J5RW50cnkuXG4gICAgICAgICAgICAgICAgc3VjY2Vzc0NhbGxiYWNrKG5ldyB3aW5kb3cuRGlyZWN0b3J5RW50cnkoZm9sZGVyRW50cnkubmFtZSwgZm9sZGVyRW50cnkuZnVsbFBhdGgsIGZvbGRlckVudHJ5LmZpbGVzeXN0ZW0pKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGVycm9yQ2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JDYWxsYmFjayh3aW5kb3cuRmlsZUVycm9yLklOVkFMSURfTU9ESUZJQ0FUSU9OX0VSUik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCghb3B0aW9ucy5jcmVhdGUgfHwgb3B0aW9ucy5jcmVhdGUgPT09IGZhbHNlKSAmJiAhZm9sZGVyRW50cnkpIHtcbiAgICAgICAgICAgIC8vIEhhbmRsZSByb290IHNwZWNpYWwuIEl0IHNob3VsZCBhbHdheXMgZXhpc3QuXG4gICAgICAgICAgICBpZiAocGF0aC5mdWxsUGF0aCA9PT0gRElSX1NFUEFSQVRPUikge1xuICAgICAgICAgICAgICAgIHN1Y2Nlc3NDYWxsYmFjayhmaWxlU3lzdGVtLnJvb3QpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSWYgY3JlYXRlIGlzIG5vdCB0cnVlIGFuZCB0aGUgcGF0aCBkb2Vzbid0IGV4aXN0LCBnZXREaXJlY3RvcnkgbXVzdCBmYWlsLlxuICAgICAgICAgICAgaWYgKGVycm9yQ2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICBlcnJvckNhbGxiYWNrKHdpbmRvdy5GaWxlRXJyb3IuTk9UX0ZPVU5EX0VSUik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKCFvcHRpb25zLmNyZWF0ZSB8fCBvcHRpb25zLmNyZWF0ZSA9PT0gZmFsc2UpICYmIGZvbGRlckVudHJ5ICYmIGZvbGRlckVudHJ5LmlzRmlsZSkge1xuICAgICAgICAgICAgLy8gSWYgY3JlYXRlIGlzIG5vdCB0cnVlIGFuZCB0aGUgcGF0aCBleGlzdHMsIGJ1dCBpcyBhIGZpbGUsIGdldERpcmVjdG9yeVxuICAgICAgICAgICAgLy8gbXVzdCBmYWlsLlxuICAgICAgICAgICAgaWYgKGVycm9yQ2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICBlcnJvckNhbGxiYWNrKHdpbmRvdy5GaWxlRXJyb3IuVFlQRV9NSVNNQVRDSF9FUlIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gT3RoZXJ3aXNlLCBpZiBubyBvdGhlciBlcnJvciBvY2N1cnMsIGdldERpcmVjdG9yeSBtdXN0IHJldHVybiBhXG4gICAgICAgIC8vIE15RGlyZWN0b3J5RW50cnkgY29ycmVzcG9uZGluZyB0byBwYXRoLlxuXG4gICAgICAgIC8vIElEQiB3b24ndCcgc2F2ZSBtZXRob2RzLCBzbyB3ZSBuZWVkIHJlLWNyZWF0ZSBNeURpcmVjdG9yeUVudHJ5LlxuICAgICAgICBzdWNjZXNzQ2FsbGJhY2sobmV3IHdpbmRvdy5EaXJlY3RvcnlFbnRyeShmb2xkZXJFbnRyeS5uYW1lLCBmb2xkZXJFbnRyeS5mdWxsUGF0aCwgZm9sZGVyRW50cnkuZmlsZXN5c3RlbSkpO1xuICAgIH0sIGVycm9yQ2FsbGJhY2spO1xufVxuXG5mdW5jdGlvbiBnZXREaXJlY3RvcnlIYW5kbGVyKHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaywgbW9kdWxlLCBldmVudCwgYXJncykge1xuICAgIGdldERpcmVjdG9yeShzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2ssIGFyZ3MpO1xufVxuXG5mdW5jdGlvbiBnZXRQYXJlbnRIYW5kbGVyKHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaywgbW9kdWxlLCBhcmdzKSB7XG4gICAgaWYgKHR5cGVvZiBzdWNjZXNzQ2FsbGJhY2sgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoJ0V4cGVjdGVkIHN1Y2Nlc3NDYWxsYmFjayBhcmd1bWVudC4nKTtcbiAgICB9XG5cbiAgICB2YXIgZnVsbFBhdGggPSBhcmdzWzBdO1xuICAgIC8vZnVsbFBhdGggaXMgbGlrZSB0aGlzOlxuICAgIC8vZmlsZTovLy9wZXJzaXN0ZW50L3BhdGgvdG8vZmlsZSBvclxuICAgIC8vZmlsZTovLy9wZXJzaXN0ZW50L3BhdGgvdG8vZGlyZWN0b3J5L1xuXG4gICAgaWYgKGZ1bGxQYXRoID09PSBESVJfU0VQQVJBVE9SIHx8IGZ1bGxQYXRoID09PSBwYXRoc1ByZWZpeC5jYWNoZURpcmVjdG9yeSB8fFxuICAgICAgICBmdWxsUGF0aCA9PT0gcGF0aHNQcmVmaXguZGF0YURpcmVjdG9yeSkge1xuICAgICAgICBzdWNjZXNzQ2FsbGJhY2soZmlsZVN5c3RlbS5yb290KTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vVG8gZGVsZXRlIGFsbCBzbGFzaGVzIGF0IHRoZSBlbmRcbiAgICB3aGlsZSAoZnVsbFBhdGhbZnVsbFBhdGgubGVuZ3RoIC0gMV0gPT09ICcvJykge1xuICAgICAgICBmdWxsUGF0aCA9IGZ1bGxQYXRoLnN1YnN0cigwLCBmdWxsUGF0aC5sZW5ndGggLSAxKTtcbiAgICB9XG5cbiAgICB2YXIgcGF0aEFyciA9IGZ1bGxQYXRoLnNwbGl0KERJUl9TRVBBUkFUT1IpO1xuICAgIHBhdGhBcnIucG9wKCk7XG4gICAgdmFyIHBhcmVudE5hbWUgPSBwYXRoQXJyLnBvcCgpO1xuICAgIHZhciBwYXRoID0gcGF0aEFyci5qb2luKERJUl9TRVBBUkFUT1IpICsgRElSX1NFUEFSQVRPUjtcblxuICAgIC8vVG8gZ2V0IHBhcmVudCBvZiByb290IGZpbGVzXG4gICAgdmFyIGpvaW5lZCA9IHBhdGggKyBwYXJlbnROYW1lICsgRElSX1NFUEFSQVRPUjsvL2lzIGxpa2UgdGhpczogZmlsZTovLy9wZXJzaXN0ZW50L1xuICAgIGlmIChqb2luZWQgPT09IHBhdGhzUHJlZml4LmNhY2hlRGlyZWN0b3J5IHx8IGpvaW5lZCA9PT0gcGF0aHNQcmVmaXguZGF0YURpcmVjdG9yeSkge1xuICAgICAgICBnZXREaXJlY3Rvcnkoc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrLCBbam9pbmVkLCBESVJfU0VQQVJBVE9SLCB7Y3JlYXRlOiBmYWxzZX1dKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGdldERpcmVjdG9yeShzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2ssIFtwYXRoLCBwYXJlbnROYW1lLCB7Y3JlYXRlOiBmYWxzZX1dKTtcbn1cblxuZnVuY3Rpb24gY29weVRvKHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaywgYXJncykge1xuICAgIHZhciBzcmNQYXRoID0gYXJnc1swXTtcbiAgICB2YXIgcGFyZW50RnVsbFBhdGggPSBhcmdzWzFdO1xuICAgIHZhciBuYW1lID0gYXJnc1syXTtcblxuICAgIGlmIChuYW1lLmluZGV4T2YoJy8nKSAhPT0gLTEgfHwgc3JjUGF0aCA9PT0gcGFyZW50RnVsbFBhdGggKyBuYW1lKSB7XG4gICAgICAgIGlmIChlcnJvckNhbGxiYWNrKSB7XG4gICAgICAgICAgICBlcnJvckNhbGxiYWNrKHdpbmRvdy5GaWxlRXJyb3IuSU5WQUxJRF9NT0RJRklDQVRJT05fRVJSKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBSZWFkIHNyYyBmaWxlXG4gICAgZ2V0RmlsZShmdW5jdGlvbihzcmNGaWxlRW50cnkpIHtcblxuICAgICAgICB2YXIgcGF0aCA9IHJlc29sdmVUb0Z1bGxQYXRoXyhwYXJlbnRGdWxsUGF0aCk7XG4gICAgICAgIC8vQ2hlY2sgZGlyZWN0b3J5XG4gICAgICAgIGdldERpcmVjdG9yeShmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgLy8gQ3JlYXRlIGRlc3QgZmlsZVxuICAgICAgICAgICAgZ2V0RmlsZShmdW5jdGlvbihkc3RGaWxlRW50cnkpIHtcblxuICAgICAgICAgICAgICAgIHdyaXRlKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICBzdWNjZXNzQ2FsbGJhY2soZHN0RmlsZUVudHJ5KTtcbiAgICAgICAgICAgICAgICB9LCBlcnJvckNhbGxiYWNrLCBbZHN0RmlsZUVudHJ5LmZpbGVfLnN0b3JhZ2VQYXRoLCBzcmNGaWxlRW50cnkuZmlsZV8uYmxvYl8sIDBdKTtcblxuICAgICAgICAgICAgfSwgZXJyb3JDYWxsYmFjaywgW3BhcmVudEZ1bGxQYXRoLCBuYW1lLCB7Y3JlYXRlOiB0cnVlfV0pO1xuXG4gICAgICAgIH0sIGZ1bmN0aW9uKCkgeyBpZiAoZXJyb3JDYWxsYmFjaykgeyBlcnJvckNhbGxiYWNrKHdpbmRvdy5GaWxlRXJyb3IuTk9UX0ZPVU5EX0VSUik7IH19LFxuICAgICAgICBbcGF0aC5zdG9yYWdlUGF0aCwgbnVsbCwge2NyZWF0ZTpmYWxzZX1dKTtcblxuICAgIH0sIGVycm9yQ2FsbGJhY2ssIFtzcmNQYXRoLCBudWxsXSk7XG59XG5cbmZ1bmN0aW9uIGNvcHlUb0hhbmRsZXIoc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrLCBtb2R1bGUsIGV2ZW50LCBhcmdzKSB7XG4gICAgY29weVRvKHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaywgYXJncyk7XG59XG5cbmZ1bmN0aW9uIG1vdmVUb0hhbmRsZXIoc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrLCBtb2R1bGUsIGV2ZW50LCBhcmdzKSB7XG4gICAgdmFyIHNyY1BhdGggPSBhcmdzWzBdO1xuICAgIC8vIHBhcmVudEZ1bGxQYXRoIGFuZCBuYW1lIHBhcmFtZXRlcnMgaXMgaWdub3JlZCBiZWNhdXNlXG4gICAgLy8gYXJncyBpcyBiZWluZyBwYXNzZWQgZG93bnN0cmVhbSB0byBleHBvcnRzLmNvcHlUbyBtZXRob2RcbiAgICB2YXIgcGFyZW50RnVsbFBhdGggPSBhcmdzWzFdOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgdmFyIG5hbWUgPSBhcmdzWzJdOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG5cbiAgICBjb3B5VG8oZnVuY3Rpb24gKGZpbGVFbnRyeSkge1xuICAgICAgICByZW1vdmUoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgc3VjY2Vzc0NhbGxiYWNrKGZpbGVFbnRyeSk7XG4gICAgICAgIH0sIGVycm9yQ2FsbGJhY2ssIFtzcmNQYXRoXSk7XG4gICAgfSwgZXJyb3JDYWxsYmFjaywgYXJncyk7XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVMb2NhbEZpbGVTeXN0ZW1VUkkoc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrLCBhcmdzKSB7XG4gICAgdmFyIHBhdGggPSBhcmdzWzBdO1xuXG4gICAgLy8gSWdub3JlIHBhcmFtZXRlcnNcbiAgICBpZiAocGF0aC5pbmRleE9mKCc/JykgIT09IC0xKSB7XG4gICAgICAgIHBhdGggPSBTdHJpbmcocGF0aCkuc3BsaXQoJz8nKVswXTtcbiAgICB9XG5cbiAgICAvLyBzdXBwb3J0IGZvciBlbmNvZGVVUklcbiAgICBpZiAoL1xcJTUvZy50ZXN0KHBhdGgpIHx8IC9cXCUyMC9nLnRlc3QocGF0aCkpIHtcbiAgICAgICAgcGF0aCA9IGRlY29kZVVSSShwYXRoKTtcbiAgICB9XG5cbiAgICBpZiAocGF0aC50cmltKClbMF0gPT09ICcvJykge1xuICAgICAgICBlcnJvckNhbGxiYWNrICYmIGVycm9yQ2FsbGJhY2sod2luZG93LkZpbGVFcnJvci5FTkNPRElOR19FUlIpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy9zdXBwb3J0IGZvciBjZHZmaWxlXG4gICAgaWYgKHBhdGgudHJpbSgpLnN1YnN0cigwLDcpID09PSAnY2R2ZmlsZScpIHtcbiAgICAgICAgaWYgKHBhdGguaW5kZXhPZignY2R2ZmlsZTovL2xvY2FsaG9zdCcpID09PSAtMSkge1xuICAgICAgICAgICAgZXJyb3JDYWxsYmFjayAmJiBlcnJvckNhbGxiYWNrKHdpbmRvdy5GaWxlRXJyb3IuRU5DT0RJTkdfRVJSKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBpbmRleFBlcnNpc3RlbnQgPSBwYXRoLmluZGV4T2YoJ3BlcnNpc3RlbnQnKTtcbiAgICAgICAgdmFyIGluZGV4VGVtcG9yYXJ5ID0gcGF0aC5pbmRleE9mKCd0ZW1wb3JhcnknKTtcblxuICAgICAgICAvL2NkdmZpbGU6Ly9sb2NhbGhvc3QvcGVyc2lzdGVudC9wYXRoL3RvL2ZpbGVcbiAgICAgICAgaWYgKGluZGV4UGVyc2lzdGVudCAhPT0gLTEpIHtcbiAgICAgICAgICAgIHBhdGggPSAgJ2ZpbGU6Ly8vcGVyc2lzdGVudCcgKyBwYXRoLnN1YnN0cihpbmRleFBlcnNpc3RlbnQgKyAxMCk7XG4gICAgICAgIH0gZWxzZSBpZiAoaW5kZXhUZW1wb3JhcnkgIT09IC0xKSB7XG4gICAgICAgICAgICBwYXRoID0gJ2ZpbGU6Ly8vdGVtcG9yYXJ5JyArIHBhdGguc3Vic3RyKGluZGV4VGVtcG9yYXJ5ICsgOSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlcnJvckNhbGxiYWNrICYmIGVycm9yQ2FsbGJhY2sod2luZG93LkZpbGVFcnJvci5FTkNPRElOR19FUlIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gdG8gYXZvaWQgcGF0aCBmb3JtIG9mICcvLy9wYXRoL3RvL2ZpbGUnXG4gICAgZnVuY3Rpb24gaGFuZGxlUGF0aFNsYXNoZXMocGF0aCkge1xuICAgICAgICB2YXIgY3V0SW5kZXggID0gMDtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXRoLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICAgICAgaWYgKHBhdGhbaV0gPT09IERJUl9TRVBBUkFUT1IgJiYgcGF0aFtpICsgMV0gPT09IERJUl9TRVBBUkFUT1IpIHtcbiAgICAgICAgICAgICAgICBjdXRJbmRleCA9IGkgKyAxO1xuICAgICAgICAgICAgfSBlbHNlIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHBhdGguc3Vic3RyKGN1dEluZGV4KTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgbG9jYWxob3N0IGNvbnRhaW5pbmcgcGF0aHMgKHNlZSBzcGVjcyApXG4gICAgaWYgKHBhdGguaW5kZXhPZignZmlsZTovL2xvY2FsaG9zdC8nKSA9PT0gMCkge1xuICAgICAgICBwYXRoID0gcGF0aC5yZXBsYWNlKCdmaWxlOi8vbG9jYWxob3N0LycsICdmaWxlOi8vLycpO1xuICAgIH1cblxuICAgIGlmIChwYXRoLmluZGV4T2YocGF0aHNQcmVmaXguZGF0YURpcmVjdG9yeSkgPT09IDApIHtcbiAgICAgICAgcGF0aCA9IHBhdGguc3Vic3RyaW5nKHBhdGhzUHJlZml4LmRhdGFEaXJlY3RvcnkubGVuZ3RoIC0gMSk7XG4gICAgICAgIHBhdGggPSBoYW5kbGVQYXRoU2xhc2hlcyhwYXRoKTtcblxuICAgICAgICByZXF1ZXN0RmlsZVN5c3RlbShmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGdldEZpbGUoc3VjY2Vzc0NhbGxiYWNrLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICBnZXREaXJlY3Rvcnkoc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrLCBbcGF0aHNQcmVmaXguZGF0YURpcmVjdG9yeSwgcGF0aCxcbiAgICAgICAgICAgICAgICB7Y3JlYXRlOiBmYWxzZX1dKTtcbiAgICAgICAgICAgIH0sIFtwYXRoc1ByZWZpeC5kYXRhRGlyZWN0b3J5LCBwYXRoLCB7Y3JlYXRlOiBmYWxzZX1dKTtcbiAgICAgICAgfSwgZXJyb3JDYWxsYmFjaywgW3dpbmRvdy5Mb2NhbEZpbGVTeXN0ZW0uUEVSU0lTVEVOVF0pO1xuICAgIH0gZWxzZSBpZiAocGF0aC5pbmRleE9mKHBhdGhzUHJlZml4LmNhY2hlRGlyZWN0b3J5KSA9PT0gMCkge1xuICAgICAgICBwYXRoID0gcGF0aC5zdWJzdHJpbmcocGF0aHNQcmVmaXguY2FjaGVEaXJlY3RvcnkubGVuZ3RoIC0gMSk7XG4gICAgICAgIHBhdGggPSBoYW5kbGVQYXRoU2xhc2hlcyhwYXRoKTtcblxuICAgICAgICByZXF1ZXN0RmlsZVN5c3RlbShmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGdldEZpbGUoc3VjY2Vzc0NhbGxiYWNrLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICBnZXREaXJlY3Rvcnkoc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrLCBbcGF0aHNQcmVmaXguY2FjaGVEaXJlY3RvcnksIHBhdGgsXG4gICAgICAgICAgICAgICAge2NyZWF0ZTogZmFsc2V9XSk7XG4gICAgICAgICAgICB9LCBbcGF0aHNQcmVmaXguY2FjaGVEaXJlY3RvcnksIHBhdGgsIHtjcmVhdGU6IGZhbHNlfV0pO1xuICAgICAgICB9LCBlcnJvckNhbGxiYWNrLCBbd2luZG93LkxvY2FsRmlsZVN5c3RlbS5URU1QT1JBUlldKTtcbiAgICB9IGVsc2UgaWYgKHBhdGguaW5kZXhPZihwYXRoc1ByZWZpeC5hcHBsaWNhdGlvbkRpcmVjdG9yeSkgPT09IDApIHtcbiAgICAgICAgcGF0aCA9IHBhdGguc3Vic3RyaW5nKHBhdGhzUHJlZml4LmFwcGxpY2F0aW9uRGlyZWN0b3J5Lmxlbmd0aCk7XG4gICAgICAgIC8vVE9ETzogbmVlZCB0byBjdXQgb3V0IHJlZHVuZGFudCBzbGFzaGVzP1xuXG4gICAgICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgeGhyLm9wZW4oJ0dFVCcsIHBhdGgsIHRydWUpO1xuICAgICAgICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKHhoci5zdGF0dXMgPT09IDIwMCAmJiB4aHIucmVhZHlTdGF0ZSA9PT0gNCkge1xuICAgICAgICAgICAgICAgIHJlcXVlc3RGaWxlU3lzdGVtKGZ1bmN0aW9uKGZzKSB7XG4gICAgICAgICAgICAgICAgICAgIGZzLm5hbWUgPSBsb2NhdGlvbi5ob3N0bmFtZTtcblxuICAgICAgICAgICAgICAgICAgICAvL1RPRE86IG5lZWQgdG8gY2FsbCBleHBvcnRzLmdldEZpbGUoLi4uKSB0byBoYW5kbGUgZXJyb3JzIGNvcnJlY3RcbiAgICAgICAgICAgICAgICAgICAgZnMucm9vdC5nZXRGaWxlKHBhdGgsIHtjcmVhdGU6IHRydWV9LCB3cml0ZUZpbGUsIGVycm9yQ2FsbGJhY2spO1xuICAgICAgICAgICAgICAgIH0sIGVycm9yQ2FsbGJhY2ssIFt3aW5kb3cuTG9jYWxGaWxlU3lzdGVtLlBFUlNJU1RFTlRdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICB4aHIub25lcnJvciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGVycm9yQ2FsbGJhY2sgJiYgZXJyb3JDYWxsYmFjayh3aW5kb3cuRmlsZUVycm9yLk5PVF9SRUFEQUJMRV9FUlIpO1xuICAgICAgICB9O1xuXG4gICAgICAgIHhoci5zZW5kKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZXJyb3JDYWxsYmFjayAmJiBlcnJvckNhbGxiYWNrKHdpbmRvdy5GaWxlRXJyb3IuTk9UX0ZPVU5EX0VSUik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gd3JpdGVGaWxlKGVudHJ5KSB7XG4gICAgICAgIGVudHJ5LmNyZWF0ZVdyaXRlcihmdW5jdGlvbiAoZmlsZVdyaXRlcikge1xuICAgICAgICAgICAgZmlsZVdyaXRlci5vbndyaXRlZW5kID0gZnVuY3Rpb24gKGV2dCkge1xuICAgICAgICAgICAgICAgIGlmICghZXZ0LnRhcmdldC5lcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBlbnRyeS5maWxlc3lzdGVtTmFtZSA9IGxvY2F0aW9uLmhvc3RuYW1lO1xuICAgICAgICAgICAgICAgICAgICBzdWNjZXNzQ2FsbGJhY2soZW50cnkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBmaWxlV3JpdGVyLm9uZXJyb3IgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgZXJyb3JDYWxsYmFjayAmJiBlcnJvckNhbGxiYWNrKHdpbmRvdy5GaWxlRXJyb3IuTk9UX1JFQURBQkxFX0VSUik7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgZmlsZVdyaXRlci53cml0ZShuZXcgQmxvYihbeGhyLnJlc3BvbnNlXSkpO1xuICAgICAgICB9LCBlcnJvckNhbGxiYWNrKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVMb2NhbEZpbGVTeXN0ZW1VUklIYW5kbGVyKHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaywgbW9kdWxlLCBldmVudCwgYXJncykge1xuICAgIHJlc29sdmVMb2NhbEZpbGVTeXN0ZW1VUkkoc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrLCBhcmdzKTtcbn1cblxuZnVuY3Rpb24gcmVxdWVzdEFsbFBhdGhzSGFuZGxlcihzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2ssIG1vZHVsZSwgZXZlbnQsIGFyZ3MpIHtcbiAgICBzdWNjZXNzQ2FsbGJhY2socGF0aHNQcmVmaXgpO1xufVxuXG4vLyBUaGlzIGhhbmRsZXIgaXMgcmVxdWlyZWQgZm9yIHRlc3RzIGFuZCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuZnVuY3Rpb24gX2dldExvY2FsRmlsZXN5c3RlbVBhdGhIYW5kbGVyKHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaywgbW9kdWxlLCBldmVudCwgYXJncykge1xuICAgIHZhciB1cmwgPSBhcmdzWzBdO1xuICAgIHZhciBzdHJpbmdUb0N1dCA9ICdmaWxlOi8vJztcbiAgICB2YXIgZmlsZUluZGV4ID0gdXJsLmluZGV4T2Yoc3RyaW5nVG9DdXQpO1xuICAgIGlmIChmaWxlSW5kZXggIT09IC0xKSB7XG4gICAgICAgIHVybCA9IHVybC5zdWJzdHIoc3RyaW5nVG9DdXQubGVuZ3RoLCB1cmwubGVuZ3RoLXN0cmluZ1RvQ3V0Lmxlbmd0aCk7XG4gICAgfVxuICAgIHN1Y2Nlc3NDYWxsYmFjayh1cmwpO1xufVxuXG5mdW5jdGlvbiBub3RpZnlOb3RTdXBwb3J0ZWQoc3VjY2VzcywgZmFpbCwgYXJncykge1xuICAgIGZhaWwoJ1RoaXMgbWV0aG9kIGlzIG5vdCBzdXBwb3J0ZWQgeWV0Jyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgICdGaWxlJzoge1xuICAgICAgICAncmVxdWVzdEFsbFBhdGhzJzogcmVxdWVzdEFsbFBhdGhzSGFuZGxlcixcbiAgICAgICAgJ2dldERpcmVjdG9yeSc6IGdldERpcmVjdG9yeUhhbmRsZXIsXG4gICAgICAgICdyZW1vdmVSZWN1cnNpdmVseSc6IHJlbW92ZVJlY3Vyc2l2ZWx5LFxuICAgICAgICAnZ2V0RmlsZSc6IGdldEZpbGVIYW5kbGVyLFxuICAgICAgICAncmVhZEVudHJpZXMnOiByZWFkRW50cmllc0hhbmRsZXIsXG4gICAgICAgICdnZXRGaWxlTWV0YWRhdGEnOiBnZXRGaWxlTWV0YWRhdGEsXG4gICAgICAgICdzZXRNZXRhZGF0YSc6IHNldE1ldGFkYXRhLFxuICAgICAgICAnbW92ZVRvJzogbW92ZVRvSGFuZGxlcixcbiAgICAgICAgJ2NvcHlUbyc6IGNvcHlUb0hhbmRsZXIsXG4gICAgICAgICdyZW1vdmUnOiByZW1vdmVIYW5kbGVyLFxuICAgICAgICAnZ2V0UGFyZW50JzogZ2V0UGFyZW50SGFuZGxlcixcbiAgICAgICAgJ3JlYWRBc0RhdGFVUkwnOiByZWFkQXNEYXRhVVJMSGFuZGxlcixcbiAgICAgICAgJ3JlYWRBc0JpbmFyeVN0cmluZyc6IHJlYWRBc0JpbmFyeVN0cmluZ0hhbmRsZXIsXG4gICAgICAgICdyZWFkQXNBcnJheUJ1ZmZlcic6IHJlYWRBc0FycmF5QnVmZmVySGFuZGxlcixcbiAgICAgICAgJ3JlYWRBc1RleHQnOiByZWFkQXNUZXh0SGFuZGxlcixcbiAgICAgICAgJ3dyaXRlJzogd3JpdGVIYW5kbGVyLFxuICAgICAgICAncmVxdWVzdEZpbGVTeXN0ZW0nOiByZXF1ZXN0RmlsZVN5c3RlbUhhbmRsZXIsXG4gICAgICAgICdyZXNvbHZlTG9jYWxGaWxlU3lzdGVtVVJJJzogcmVzb2x2ZUxvY2FsRmlsZVN5c3RlbVVSSUhhbmRsZXIsXG4gICAgICAgIC8vIGV4ZWMncyBiZWxvdyBhcmUgbm90IGltcGxlbWVudGVkIGluIGJyb3dzZXIgcGxhdGZvcm1cbiAgICAgICAgJ3RydW5jYXRlJzogbm90aWZ5Tm90U3VwcG9ydGVkLFxuICAgICAgICAncmVxdWVzdEFsbEZpbGVTeXN0ZW1zJzogbm90aWZ5Tm90U3VwcG9ydGVkLFxuICAgICAgICAvLyBtZXRob2QgYmVsb3cgaXMgdXNlZCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3LyBvbGQgRmlsZSBwbHVnaW4gaW1wbGVtZW50YXRpb25cbiAgICAgICAgJ19nZXRMb2NhbEZpbGVzeXN0ZW1QYXRoJzogX2dldExvY2FsRmlsZXN5c3RlbVBhdGhIYW5kbGVyXG4gICAgfVxufTtcbiIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXG52YXIgZmlsZVBsdWdpbklzUmVhZHlFdmVudCA9IG5ldyBFdmVudCgnZmlsZVBsdWdpbklzUmVhZHknKTtcbnZhciBQRVJTSVNURU5UX0ZTX1FVT1RBID0gNSAqIDEwMjQgKiAxMDI0O1xuXG52YXIgZW50cnlGdW5jdGlvbnNDcmVhdGVkID0gZmFsc2U7XG52YXIgcXVvdGFXYXNSZXF1ZXN0ZWQgPSBmYWxzZTtcbnZhciBldmVudFdhc1Rocm93biA9IGZhbHNlO1xuXG53aW5kb3cuaW5pdFBlcnNpc3RlbnRGaWxlU3lzdGVtID0gZnVuY3Rpb24oc2l6ZSwgd2luLCBmYWlsKSB7XG4gICAgaWYgKG5hdmlnYXRvci53ZWJraXRQZXJzaXN0ZW50U3RvcmFnZSkge1xuICAgICAgICBuYXZpZ2F0b3Iud2Via2l0UGVyc2lzdGVudFN0b3JhZ2UucmVxdWVzdFF1b3RhKHNpemUsIHdpbiwgZmFpbCk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmYWlsKCdUaGlzIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIGZ1bmN0aW9uJyk7XG59O1xuXG53aW5kb3cuaXNGaWxlUGx1Z2luUmVhZHlSYWlzZWQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBldmVudFdhc1Rocm93bjsgfTtcblxud2luZG93LmluaXRQZXJzaXN0ZW50RmlsZVN5c3RlbShQRVJTSVNURU5UX0ZTX1FVT1RBLCBmdW5jdGlvbigpIHtcbiAgICBjb25zb2xlLmxvZygnUGVyc2lzdGVudCBmcyBxdW90YSBncmFudGVkJyk7XG4gICAgcXVvdGFXYXNSZXF1ZXN0ZWQgPSB0cnVlO1xufSwgZnVuY3Rpb24oZSl7XG4gICAgY29uc29sZS5sb2coJ0Vycm9yIG9jY3VyZWQgd2hpbGUgdHJ5aW5nIHRvIHJlcXVlc3QgUGVyc2lzdGVudCBmcyBxdW90YTogJyArIEpTT04uc3RyaW5naWZ5KGUpKTtcbn0pO1xuXG5mdW5jdGlvbiBkaXNwYXRjaEV2ZW50SWZSZWFkeSgpIHtcbiAgICBpZiAoZW50cnlGdW5jdGlvbnNDcmVhdGVkICYmIHF1b3RhV2FzUmVxdWVzdGVkKSB7XG4gICAgICAgIHdpbmRvdy5kaXNwYXRjaEV2ZW50KGZpbGVQbHVnaW5Jc1JlYWR5RXZlbnQpO1xuICAgICAgICBldmVudFdhc1Rocm93biA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgc2V0VGltZW91dChkaXNwYXRjaEV2ZW50SWZSZWFkeSwgMTAwKTtcbiAgICB9XG59XG5cbi8vIFdlIGNyZWF0ZSBhbmQgZmlyZSBldmVudCAnZmlsZVBsdWdpbklzUmVhZHknIHdoZW4gZmlsZSBzeXN0ZW0gcGVyc2lzdGVudCBmaWxlIHF1b3RhXG4vLyBpcyBncmFudGVkIGFuZCBlbnRyeSBmdW5jdGlvbnMgYXJlIG92ZXJyaWRlbiwgc28gd2UgY2FuIGFscmVhZHkgd29yayB3aXRoIGZpbGUgc3lzdGVtIHByb3Blcmx5LlxuZGlzcGF0Y2hFdmVudElmUmVhZHkoKTtcblxuLy8gV2UgbXVzdCBvdmVycmlkZSBzb21lIGZ1bmN0aW9uYWxpdHkgc28gdGhhdCBwbHVnaW4gY2FuIHdvcmsgcHJvcGVybHksXG4vLyBmb3IgZXhhbXBsZSwgaWYgd2Ugb3ZlcnJpZGUgd2luZG93LnJlcXVlc3RGaWxlU3lzdGVtIG9yIHdpbmRvdy5yZXNvbHZlTG9jYWxGaWxlU3lzdGVtVVJMLFxuLy8gdGhleSBtaWdodCBiZSBvdmVycmlkZWQgbGF0ZXIsIGFuZCBpZiB3ZSB3aWxsIHdhaXQgZm9yIGRldmljZXJlYWR5IGV2ZW50LCB3ZSBhc3N1bWUgdGhhdFxuLy8gdGhlc2UgZnVuY3Rpb25zIHdpbGwgbm90IGJlIG92ZXJyaWRlZCBsYXRlci5cbmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2RldmljZXJlYWR5JywgZnVuY3Rpb24gKCkge1xuICAgIHdpbmRvdy5yZXF1ZXN0RmlsZVN5c3RlbSA9IHdpbmRvdy53ZWJraXRSZXF1ZXN0RmlsZVN5c3RlbTtcblxuICAgIGlmICghd2luZG93LnJlcXVlc3RGaWxlU3lzdGVtKSB7XG4gICAgICAgIHdpbmRvdy5yZXF1ZXN0RmlsZVN5c3RlbSA9IGZ1bmN0aW9uKHR5cGUsIHNpemUsIHdpbiwgZmFpbCkge1xuICAgICAgICAgICAgaWYgKGZhaWwpIHtcbiAgICAgICAgICAgICAgICBmYWlsKCdOb3Qgc3VwcG9ydGVkJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgICAgd2luZG93LnJlcXVlc3RGaWxlU3lzdGVtKHdpbmRvdy5URU1QT1JBUlksIDEsIGNyZWF0ZUZpbGVFbnRyeUZ1bmN0aW9ucywgZnVuY3Rpb24oKSB7fSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY3JlYXRlRmlsZUVudHJ5RnVuY3Rpb25zKGZzKSB7XG4gICAgICAgIGZzLnJvb3QuZ2V0RmlsZSgndG9kZWxldGVfNjU4Njc0XzgzM180X2NkdicsIHtjcmVhdGU6IHRydWV9LCBmdW5jdGlvbihmaWxlRW50cnkpIHtcbiAgICAgICAgICAgIHZhciBmaWxlRW50cnlUeXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGZpbGVFbnRyeSk7XG4gICAgICAgICAgICB2YXIgZW50cnlUeXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGZpbGVFbnRyeVR5cGUpO1xuXG4gICAgICAgICAgICAvLyBTYXZlIHRoZSBvcmlnaW5hbCBtZXRob2RcbiAgICAgICAgICAgIHZhciBvcmlnVG9VUkwgPSBlbnRyeVR5cGUudG9VUkw7XG4gICAgICAgICAgICBlbnRyeVR5cGUudG9VUkwgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdmFyIG9yaWdVUkwgPSBvcmlnVG9VUkwuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0RpcmVjdG9yeSAmJiBvcmlnVVJMLnN1YnN0cigtMSkgIT09ICcvJykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3JpZ1VSTCArICcvJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdVUkw7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBlbnRyeVR5cGUudG9OYXRpdmVVUkwgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdERVBSRUNBVEVEOiBVcGRhdGUgeW91ciBjb2RlIHRvIHVzZSBcXCd0b1VSTFxcJycpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRvVVJMKCk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBlbnRyeVR5cGUudG9JbnRlcm5hbFVSTCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnRvVVJMKCkuaW5kZXhPZigncGVyc2lzdGVudCcpID4gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdjZHZmaWxlOi8vbG9jYWxob3N0L3BlcnNpc3RlbnQnICsgdGhpcy5mdWxsUGF0aDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy50b1VSTCgpLmluZGV4T2YoJ3RlbXBvcmFyeScpID4gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdjZHZmaWxlOi8vbG9jYWxob3N0L3RlbXBvcmFyeScgKyB0aGlzLmZ1bGxQYXRoO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGVudHJ5VHlwZS5zZXRNZXRhZGF0YSA9IGZ1bmN0aW9uKHdpbiwgZmFpbCAvKiwgbWV0YWRhdGEqLykge1xuICAgICAgICAgICAgICAgIGZhaWwgJiYgZmFpbCgnTm90IHN1cHBvcnRlZCcpO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgZmlsZUVudHJ5LmNyZWF0ZVdyaXRlcihmdW5jdGlvbih3cml0ZXIpIHtcbiAgICAgICAgICAgICAgICB2YXIgb3JpZ2luYWxXcml0ZSA9IHdyaXRlci53cml0ZTtcbiAgICAgICAgICAgICAgICB2YXIgd3JpdGVyUHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Yod3JpdGVyKTtcbiAgICAgICAgICAgICAgICB3cml0ZXJQcm90by53cml0ZSA9IGZ1bmN0aW9uKGJsb2IpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYoYmxvYiBpbnN0YW5jZW9mIEJsb2IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsV3JpdGUuYXBwbHkodGhpcywgW2Jsb2JdKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZWFsQmxvYiA9IG5ldyBCbG9iKFtibG9iXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbFdyaXRlLmFwcGx5KHRoaXMsIFtyZWFsQmxvYl0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIGZpbGVFbnRyeS5yZW1vdmUoZnVuY3Rpb24oKXsgZW50cnlGdW5jdGlvbnNDcmVhdGVkID0gdHJ1ZTsgfSwgZnVuY3Rpb24oKXsgLyogZW1wdHkgY2FsbGJhY2sgKi8gfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKCF3aW5kb3cucmVzb2x2ZUxvY2FsRmlsZVN5c3RlbVVSTCkge1xuICAgICAgICB3aW5kb3cucmVzb2x2ZUxvY2FsRmlsZVN5c3RlbVVSTCA9IGZ1bmN0aW9uKHVybCwgd2luLCBmYWlsKSB7XG4gICAgICAgICAgICBpZihmYWlsKSB7XG4gICAgICAgICAgICAgICAgZmFpbCgnTm90IHN1cHBvcnRlZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8vIFJlc29sdmVzIGEgZmlsZXN5c3RlbSBlbnRyeSBieSBpdHMgcGF0aCAtIHdoaWNoIGlzIHBhc3NlZCBlaXRoZXIgaW4gc3RhbmRhcmQgKGZpbGVzeXN0ZW06ZmlsZTovLykgb3JcbiAgICAvLyBDb3Jkb3ZhLXNwZWNpZmljIChjZHZmaWxlOi8vKSB1bml2ZXJzYWwgd2F5LlxuICAgIC8vIEFsaWducyB3aXRoIHNwZWNpZmljYXRpb246IGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMTEvV0QtZmlsZS1zeXN0ZW0tYXBpLTIwMTEwNDE5LyN3aWRsLUxvY2FsRmlsZVN5c3RlbS1yZXNvbHZlTG9jYWxGaWxlU3lzdGVtVVJMXG4gICAgdmFyIG5hdGl2ZVJlc29sdmVMb2NhbEZpbGVTeXN0ZW1VUkwgPSB3aW5kb3cud2Via2l0UmVzb2x2ZUxvY2FsRmlsZVN5c3RlbVVSTCB8fCB3aW5kb3cucmVzb2x2ZUxvY2FsRmlsZVN5c3RlbVVSTDtcbiAgICB3aW5kb3cucmVzb2x2ZUxvY2FsRmlsZVN5c3RlbVVSTCA9IGZ1bmN0aW9uKHVybCwgd2luLCBmYWlsKSB7XG4gICAgICAgIC8qIElmIHVybCBzdGFydHMgd2l0aCBgY2R2ZmlsZWAgdGhlbiB3ZSBuZWVkIGNvbnZlcnQgaXQgdG8gQ2hyb21lIHJlYWwgdXJsIGZpcnN0OlxuICAgICAgICAgIGNkdmZpbGU6Ly9sb2NhbGhvc3QvcGVyc2lzdGVudC9wYXRoL3RvL2ZpbGUgLT4gZmlsZXN5c3RlbTpmaWxlOi8vcGVyc2lzdGVudC9wYXRoL3RvL2ZpbGUgKi9cbiAgICAgICAgaWYgKHVybC50cmltKCkuc3Vic3RyKDAsNykgPT09ICdjZHZmaWxlJykge1xuICAgICAgICAgICAgLyogUXVpcms6XG4gICAgICAgICAgICBQbHVnaW4gc3VwcG9ydHMgY2R2ZmlsZTovL2xvY2FsaG9zdCAobG9jYWwgcmVzb3VyY2VzKSBvbmx5LlxuICAgICAgICAgICAgSS5lLiBleHRlcm5hbCByZXNvdXJjZXMgYXJlIG5vdCBzdXBwb3J0ZWQgdmlhIGNkdmZpbGUuICovXG4gICAgICAgICAgICBpZiAodXJsLmluZGV4T2YoJ2NkdmZpbGU6Ly9sb2NhbGhvc3QnKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAvLyBCcm93c2VyIHN1cHBvcnRzIHRlbXBvcmFyeSBhbmQgcGVyc2lzdGVudCBvbmx5XG4gICAgICAgICAgICAgICAgdmFyIGluZGV4UGVyc2lzdGVudCA9IHVybC5pbmRleE9mKCdwZXJzaXN0ZW50Jyk7XG4gICAgICAgICAgICAgICAgdmFyIGluZGV4VGVtcG9yYXJ5ID0gdXJsLmluZGV4T2YoJ3RlbXBvcmFyeScpO1xuXG4gICAgICAgICAgICAgICAgLyogQ2hyb21lIHVybHMgc3RhcnQgd2l0aCAnZmlsZXN5c3RlbTonIHByZWZpeC4gU2VlIHF1aXJrOlxuICAgICAgICAgICAgICAgICAgIHRvVVJMIGZ1bmN0aW9uIGluIENocm9tZSByZXR1cm5zIGZpbGVzeXN0ZW06LXByZWZpeGVkIHBhdGggZGVwZW5kaW5nIG9uIGFwcGxpY2F0aW9uIGhvc3QuXG4gICAgICAgICAgICAgICAgICAgRm9yIGV4YW1wbGUsIGZpbGVzeXN0ZW06ZmlsZTovLy9wZXJzaXN0ZW50L3NvbWVmaWxlLnR4dCxcbiAgICAgICAgICAgICAgICAgICBmaWxlc3lzdGVtOmh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9wZXJzaXN0ZW50L3NvbWVmaWxlLnR4dC4gKi9cbiAgICAgICAgICAgICAgICB2YXIgcHJlZml4ID0gJ2ZpbGVzeXN0ZW06ZmlsZTovLy8nO1xuICAgICAgICAgICAgICAgIGlmIChsb2NhdGlvbi5wcm90b2NvbCAhPT0gJ2ZpbGU6Jykge1xuICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSAnZmlsZXN5c3RlbTonICsgbG9jYXRpb24ub3JpZ2luICsgJy8nO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHZhciByZXN1bHQ7XG4gICAgICAgICAgICAgICAgaWYgKGluZGV4UGVyc2lzdGVudCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gY2R2ZmlsZTovL2xvY2FsaG9zdC9wZXJzaXN0ZW50L3BhdGgvdG8vZmlsZSAtPiBmaWxlc3lzdGVtOmZpbGU6Ly9wZXJzaXN0ZW50L3BhdGgvdG8vZmlsZVxuICAgICAgICAgICAgICAgICAgICAvLyBvciBmaWxlc3lzdGVtOmh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9wZXJzaXN0ZW50L3BhdGgvdG8vZmlsZVxuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAgcHJlZml4ICsgJ3BlcnNpc3RlbnQnICsgdXJsLnN1YnN0cihpbmRleFBlcnNpc3RlbnQgKyAxMCk7XG4gICAgICAgICAgICAgICAgICAgIG5hdGl2ZVJlc29sdmVMb2NhbEZpbGVTeXN0ZW1VUkwocmVzdWx0LCB3aW4sIGZhaWwpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGluZGV4VGVtcG9yYXJ5ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBjZHZmaWxlOi8vbG9jYWxob3N0L3RlbXBvcmFyeS9wYXRoL3RvL2ZpbGUgLT4gZmlsZXN5c3RlbTpmaWxlOi8vdGVtcG9yYXJ5L3BhdGgvdG8vZmlsZVxuICAgICAgICAgICAgICAgICAgICAvLyBvciBmaWxlc3lzdGVtOmh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC90ZW1wb3JhcnkvcGF0aC90by9maWxlXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHByZWZpeCArICd0ZW1wb3JhcnknICsgdXJsLnN1YnN0cihpbmRleFRlbXBvcmFyeSArIDkpO1xuICAgICAgICAgICAgICAgICAgICBuYXRpdmVSZXNvbHZlTG9jYWxGaWxlU3lzdGVtVVJMKHJlc3VsdCwgd2luLCBmYWlsKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gY2R2ZmlsZSBvdGhlciB0aGFuIGxvY2FsIGZpbGUgcmVzb3VyY2UgaXMgbm90IHN1cHBvcnRlZFxuICAgICAgICAgICAgZmFpbCAmJiBmYWlsKGZ1bmN0aW9uICgpIHt0aHJvdyBuZXcgd2luZG93LkZpbGVFcnJvcih3aW5kb3cuRmlsZUVycm9yLkVOQ09ESU5HX0VSUik7fSk7XG4gICAgICAgIH0gZWxzZSBpZiAodXJsLnRyaW0oKS5pbmRleE9mKCdmaWxlOi8vJykgPT09IDApIHtcbiAgICAgICAgICAgIC8vIEFEREVEXG4gICAgICAgICAgICB1cmwgPSAnZmlsZXN5c3RlbTpodHRwOi8vJyArIHVybC5yZXBsYWNlKCdmaWxlOi8vJywgJycpO1xuICAgICAgICAgICAgbmF0aXZlUmVzb2x2ZUxvY2FsRmlsZVN5c3RlbVVSTCh1cmwsIHdpbiwgZmFpbCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBuYXRpdmVSZXNvbHZlTG9jYWxGaWxlU3lzdGVtVVJMKHVybCwgd2luLCBmYWlsKTtcbiAgICAgICAgfVxuICAgIH07XG59LCBmYWxzZSk7XG5cbi8vIFRoaXMgaGFuZGxlciBpcyByZXF1aXJlZCBmb3IgdGVzdHMgYW5kIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG5mdW5jdGlvbiBfZ2V0TG9jYWxGaWxlc3lzdGVtUGF0aEhhbmRsZXIoc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrLCBtb2R1bGUsIGV2ZW50LCBhcmdzKSB7XG4gICAgdmFyIHVybCA9IGFyZ3NbMF07XG4gICAgdmFyIGxvY2FsaG9zdEluZGV4ID0gdXJsLmluZGV4T2YoJ2xvY2FsaG9zdCcpO1xuICAgIGlmIChsb2NhbGhvc3RJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgdXJsID0gdXJsLnN1YnN0cihsb2NhbGhvc3RJbmRleCwgdXJsLmxlbmd0aC1sb2NhbGhvc3RJbmRleCk7XG4gICAgfVxuICAgIHN1Y2Nlc3NDYWxsYmFjayh1cmwpO1xufVxuXG5mdW5jdGlvbiByZXF1ZXN0QWxsUGF0aHNIYW5kbGVyKHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaywgbW9kdWxlLCBldmVudCwgYXJncykge1xuICAgIHZhciBwYXRoc1ByZWZpeCA9IHtcbiAgICAgICAgLy8gUmVhZC1vbmx5IGRpcmVjdG9yeSB3aGVyZSB0aGUgYXBwbGljYXRpb24gaXMgaW5zdGFsbGVkLlxuICAgICAgICBhcHBsaWNhdGlvbkRpcmVjdG9yeTogbG9jYXRpb24ub3JpZ2luICsgJy8nLFxuICAgICAgICAvLyBXaGVyZSB0byBwdXQgYXBwLXNwZWNpZmljIGRhdGEgZmlsZXMuXG4gICAgICAgIGRhdGFEaXJlY3Rvcnk6ICdmaWxlc3lzdGVtOmZpbGU6Ly8vcGVyc2lzdGVudC8nLFxuICAgICAgICAvLyBDYWNoZWQgZmlsZXMgdGhhdCBzaG91bGQgc3Vydml2ZSBhcHAgcmVzdGFydHMuXG4gICAgICAgIC8vIEFwcHMgc2hvdWxkIG5vdCByZWx5IG9uIHRoZSBPUyB0byBkZWxldGUgZmlsZXMgaW4gaGVyZS5cbiAgICAgICAgY2FjaGVEaXJlY3Rvcnk6ICdmaWxlc3lzdGVtOmZpbGU6Ly8vdGVtcG9yYXJ5LydcbiAgICB9O1xuXG4gICAgc3VjY2Vzc0NhbGxiYWNrKHBhdGhzUHJlZml4KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgJ0ZpbGUnOiB7XG4gICAgICAgICdfZ2V0TG9jYWxGaWxlc3lzdGVtUGF0aCc6IF9nZXRMb2NhbEZpbGVzeXN0ZW1QYXRoSGFuZGxlcixcbiAgICAgICAgJ3JlcXVlc3RBbGxQYXRocyc6IHJlcXVlc3RBbGxQYXRoc0hhbmRsZXJcbiAgICB9XG59O1xuIiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cbnZhciBpbmRleGVkREIgPSB7XG4gICAgZGI6IG51bGxcbn07XG5cbnZhciBGSUxFX1NUT1JFXyA9ICdlbnRyaWVzJyxcbiAgICBESVJfU0VQQVJBVE9SID0gJy8nLFxuICAgIHVuaWNvZGVMYXN0Q2hhciA9IDY1NTM1O1xuXG5pbmRleGVkREIub3BlbiA9IGZ1bmN0aW9uKGRiTmFtZSwgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgLy8gVE9ETzogRkYgMTIuMGExIGlzbid0IGxpa2luZyBhIGRiIG5hbWUgd2l0aCA6IGluIGl0LlxuICAgIHZhciByZXF1ZXN0ID0gd2luZG93LmluZGV4ZWREQi5vcGVuKGRiTmFtZS5yZXBsYWNlKCc6JywgJ18nKS8qLCAxIC8qdmVyc2lvbiovKTtcblxuICAgIHJlcXVlc3Qub25lcnJvciA9IGVycm9yQ2FsbGJhY2sgfHwgb25FcnJvcjtcblxuICAgIHJlcXVlc3Qub251cGdyYWRlbmVlZGVkID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAvLyBGaXJzdCBvcGVuIHdhcyBjYWxsZWQgb3IgaGlnaGVyIGRiIHZlcnNpb24gd2FzIHVzZWQuXG5cbiAgICAgICAgLy8gY29uc29sZS5sb2coJ29udXBncmFkZW5lZWRlZDogb2xkVmVyc2lvbjonICsgZS5vbGRWZXJzaW9uLFxuICAgICAgICAvLyAgICAgICAgICAgJ25ld1ZlcnNpb246JyArIGUubmV3VmVyc2lvbik7XG5cbiAgICAgICAgc2VsZi5kYiA9IGUudGFyZ2V0LnJlc3VsdDtcbiAgICAgICAgc2VsZi5kYi5vbmVycm9yID0gb25FcnJvcjtcblxuICAgICAgICBpZiAoIXNlbGYuZGIub2JqZWN0U3RvcmVOYW1lcy5jb250YWlucyhGSUxFX1NUT1JFXykpIHtcbiAgICAgICAgICAgIHNlbGYuZGIuY3JlYXRlT2JqZWN0U3RvcmUoRklMRV9TVE9SRV8vKix7a2V5UGF0aDogJ2lkJywgYXV0b0luY3JlbWVudDogdHJ1ZX0qLyk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgcmVxdWVzdC5vbnN1Y2Nlc3MgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgIHNlbGYuZGIgPSBlLnRhcmdldC5yZXN1bHQ7XG4gICAgICAgIHNlbGYuZGIub25lcnJvciA9IG9uRXJyb3I7XG4gICAgICAgIHN1Y2Nlc3NDYWxsYmFjayhlKTtcbiAgICB9O1xuXG4gICAgcmVxdWVzdC5vbmJsb2NrZWQgPSBlcnJvckNhbGxiYWNrIHx8IG9uRXJyb3I7XG59O1xuXG5pbmRleGVkREIuY2xvc2UgPSBmdW5jdGlvbigpIHtcbiAgICB0aGlzLmRiLmNsb3NlKCk7XG4gICAgdGhpcy5kYiA9IG51bGw7XG59O1xuXG5pbmRleGVkREIuZ2V0ID0gZnVuY3Rpb24oZnVsbFBhdGgsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykge1xuICAgIGlmICghdGhpcy5kYikge1xuICAgICAgICBlcnJvckNhbGxiYWNrICYmIGVycm9yQ2FsbGJhY2sod2luZG93LkZpbGVFcnJvci5JTlZBTElEX01PRElGSUNBVElPTl9FUlIpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHR4ID0gdGhpcy5kYi50cmFuc2FjdGlvbihbRklMRV9TVE9SRV9dLCAncmVhZG9ubHknKTtcblxuICAgIHZhciByZXF1ZXN0ID0gdHgub2JqZWN0U3RvcmUoRklMRV9TVE9SRV8pLmdldChmdWxsUGF0aCk7XG5cbiAgICB0eC5vbmFib3J0ID0gZXJyb3JDYWxsYmFjayB8fCBvbkVycm9yO1xuICAgIHR4Lm9uY29tcGxldGUgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgc3VjY2Vzc0NhbGxiYWNrKHJlcXVlc3QucmVzdWx0KTtcbiAgICB9O1xufTtcblxuaW5kZXhlZERCLmdldEFsbEVudHJpZXMgPSBmdW5jdGlvbihmdWxsUGF0aCwgc3RvcmFnZVBhdGgsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykge1xuICAgIGlmICghdGhpcy5kYikge1xuICAgICAgICBlcnJvckNhbGxiYWNrICYmIGVycm9yQ2FsbGJhY2sod2luZG93LkZpbGVFcnJvci5JTlZBTElEX01PRElGSUNBVElPTl9FUlIpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHJlc3VsdHMgPSBbXTtcblxuICAgIGlmIChzdG9yYWdlUGF0aFtzdG9yYWdlUGF0aC5sZW5ndGggLSAxXSA9PT0gRElSX1NFUEFSQVRPUikge1xuICAgICAgICBzdG9yYWdlUGF0aCA9IHN0b3JhZ2VQYXRoLnN1YnN0cmluZygwLCBzdG9yYWdlUGF0aC5sZW5ndGggLSAxKTtcbiAgICB9XG5cbiAgICB2YXIgcmFuZ2UgPSB3aW5kb3cuSURCS2V5UmFuZ2UuYm91bmQoc3RvcmFnZVBhdGggKyBESVJfU0VQQVJBVE9SICsgJyAnLFxuICAgICAgICBzdG9yYWdlUGF0aCArIERJUl9TRVBBUkFUT1IgKyBTdHJpbmcuZnJvbUNoYXJDb2RlKHVuaWNvZGVMYXN0Q2hhcikpO1xuXG4gICAgdmFyIHR4ID0gdGhpcy5kYi50cmFuc2FjdGlvbihbRklMRV9TVE9SRV9dLCAncmVhZG9ubHknKTtcbiAgICB0eC5vbmFib3J0ID0gZXJyb3JDYWxsYmFjayB8fCBvbkVycm9yO1xuICAgIHR4Lm9uY29tcGxldGUgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmVzdWx0cyA9IHJlc3VsdHMuZmlsdGVyKGZ1bmN0aW9uKHZhbCkge1xuICAgICAgICAgICAgdmFyIHBhdGhXaXRob3V0U2xhc2ggPSB2YWwuZnVsbFBhdGg7XG5cbiAgICAgICAgICAgIGlmICh2YWwuZnVsbFBhdGhbdmFsLmZ1bGxQYXRoLmxlbmd0aCAtIDFdID09PSBESVJfU0VQQVJBVE9SKSB7XG4gICAgICAgICAgICAgICAgcGF0aFdpdGhvdXRTbGFzaCA9IHBhdGhXaXRob3V0U2xhc2guc3Vic3RyKDAsIHBhdGhXaXRob3V0U2xhc2gubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciB2YWxQYXJ0c0xlbiA9IHBhdGhXaXRob3V0U2xhc2guc3BsaXQoRElSX1NFUEFSQVRPUikubGVuZ3RoO1xuICAgICAgICAgICAgdmFyIGZ1bGxQYXRoUGFydHNMZW4gPSBmdWxsUGF0aC5zcGxpdChESVJfU0VQQVJBVE9SKS5sZW5ndGg7XG5cbiAgICAgICAgICAgIC8qIElucHV0IGZ1bGxQYXRoIHBhcmFtZXRlciAgZXF1YWxzICcvLycgZm9yIHJvb3QgZm9sZGVyICovXG4gICAgICAgICAgICAvKiBFbnRyaWVzIGluIHJvb3QgZm9sZGVyIGhhcyB2YWxQYXJ0c0xlbiBlcXVhbHMgMiAoc2VlIGJlbG93KSAqL1xuICAgICAgICAgICAgaWYgKGZ1bGxQYXRoW2Z1bGxQYXRoLmxlbmd0aCAtMV0gPT09IERJUl9TRVBBUkFUT1IgJiYgZnVsbFBhdGgudHJpbSgpLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgICAgICAgIGZ1bGxQYXRoUGFydHNMZW4gPSAxO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChmdWxsUGF0aFtmdWxsUGF0aC5sZW5ndGggLTFdID09PSBESVJfU0VQQVJBVE9SKSB7XG4gICAgICAgICAgICAgICAgZnVsbFBhdGhQYXJ0c0xlbiA9IGZ1bGxQYXRoLnN1YnN0cigwLCBmdWxsUGF0aC5sZW5ndGggLSAxKS5zcGxpdChESVJfU0VQQVJBVE9SKS5sZW5ndGg7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZ1bGxQYXRoUGFydHNMZW4gPSBmdWxsUGF0aC5zcGxpdChESVJfU0VQQVJBVE9SKS5sZW5ndGg7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh2YWxQYXJ0c0xlbiA9PT0gZnVsbFBhdGhQYXJ0c0xlbiArIDEpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGlzIGEgc3ViZm9sZGVyIGFuZCBlbnRyeSBpcyBhIGRpcmVjdCBjaGlsZCwgaW5jbHVkZSBpdCBpblxuICAgICAgICAgICAgICAgIC8vIHRoZSByZXN1bHRzLiBPdGhlcndpc2UsIGl0J3Mgbm90IGFuIGVudHJ5IG9mIHRoaXMgZm9sZGVyLlxuICAgICAgICAgICAgICAgIHJldHVybiB2YWw7XG4gICAgICAgICAgICB9IGVsc2UgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9KTtcblxuICAgICAgICBzdWNjZXNzQ2FsbGJhY2socmVzdWx0cyk7XG4gICAgfTtcblxuICAgIHZhciByZXF1ZXN0ID0gdHgub2JqZWN0U3RvcmUoRklMRV9TVE9SRV8pLm9wZW5DdXJzb3IocmFuZ2UpO1xuXG4gICAgcmVxdWVzdC5vbnN1Y2Nlc3MgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgIHZhciBjdXJzb3IgPSBlLnRhcmdldC5yZXN1bHQ7XG4gICAgICAgIGlmIChjdXJzb3IpIHtcbiAgICAgICAgICAgIHZhciB2YWwgPSBjdXJzb3IudmFsdWU7XG5cbiAgICAgICAgICAgIHJlc3VsdHMucHVzaCh2YWwuaXNGaWxlID8gZmlsZUVudHJ5RnJvbUlkYkVudHJ5KHZhbCkgOiBuZXcgd2luZG93LkRpcmVjdG9yeUVudHJ5KHZhbC5uYW1lLCB2YWwuZnVsbFBhdGgsIHZhbC5maWxlc3lzdGVtKSk7XG4gICAgICAgICAgICBjdXJzb3JbJ2NvbnRpbnVlJ10oKTtcbiAgICAgICAgfVxuICAgIH07XG59O1xuXG5pbmRleGVkREJbJ2RlbGV0ZSddID0gZnVuY3Rpb24oZnVsbFBhdGgsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaywgaXNEaXJlY3RvcnkpIHtcbiAgICBpZiAoIWluZGV4ZWREQi5kYikge1xuICAgICAgICBlcnJvckNhbGxiYWNrICYmIGVycm9yQ2FsbGJhY2sod2luZG93LkZpbGVFcnJvci5JTlZBTElEX01PRElGSUNBVElPTl9FUlIpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHR4ID0gdGhpcy5kYi50cmFuc2FjdGlvbihbRklMRV9TVE9SRV9dLCAncmVhZHdyaXRlJyk7XG4gICAgdHgub25jb21wbGV0ZSA9IHN1Y2Nlc3NDYWxsYmFjaztcbiAgICB0eC5vbmFib3J0ID0gZXJyb3JDYWxsYmFjayB8fCBvbkVycm9yO1xuICAgIHR4Lm9uY29tcGxldGUgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKGlzRGlyZWN0b3J5KSB7XG4gICAgICAgICAgICAvL1dlIGRlbGV0ZSBuZXN0ZWQgZmlsZXMgYW5kIGZvbGRlcnMgYWZ0ZXIgZGVsZXRpbmcgcGFyZW50IGZvbGRlclxuICAgICAgICAgICAgLy9XZSB1c2UgcmFuZ2VzOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvSURCS2V5UmFuZ2VcbiAgICAgICAgICAgIGZ1bGxQYXRoID0gZnVsbFBhdGggKyBESVJfU0VQQVJBVE9SO1xuXG4gICAgICAgICAgICAvL1JhbmdlIGNvbnRhaW5zIGFsbCBlbnRyaWVzIGluIHRoZSBmb3JtIGZ1bGxQYXRoPHN5bWJvbD4gd2hlcmVcbiAgICAgICAgICAgIC8vc3ltYm9sIGluIHRoZSByYW5nZSBmcm9tICcgJyB0byBzeW1ib2wgd2hpY2ggaGFzIGNvZGUgYHVuaWNvZGVMYXN0Q2hhcmBcbiAgICAgICAgICAgIHZhciByYW5nZSA9IHdpbmRvdy5JREJLZXlSYW5nZS5ib3VuZChmdWxsUGF0aCArICcgJywgZnVsbFBhdGggKyBTdHJpbmcuZnJvbUNoYXJDb2RlKHVuaWNvZGVMYXN0Q2hhcikpO1xuXG4gICAgICAgICAgICB2YXIgbmV3VHggPSB0aGlzLmRiLnRyYW5zYWN0aW9uKFtGSUxFX1NUT1JFX10sICdyZWFkd3JpdGUnKTtcbiAgICAgICAgICAgIG5ld1R4Lm9uY29tcGxldGUgPSBzdWNjZXNzQ2FsbGJhY2s7XG4gICAgICAgICAgICBuZXdUeC5vbmFib3J0ID0gZXJyb3JDYWxsYmFjayB8fCBvbkVycm9yO1xuICAgICAgICAgICAgbmV3VHgub2JqZWN0U3RvcmUoRklMRV9TVE9SRV8pWydkZWxldGUnXShyYW5nZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdWNjZXNzQ2FsbGJhY2soKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgdHgub2JqZWN0U3RvcmUoRklMRV9TVE9SRV8pWydkZWxldGUnXShmdWxsUGF0aCk7XG59O1xuXG5pbmRleGVkREIucHV0ID0gZnVuY3Rpb24oZW50cnksIHN0b3JhZ2VQYXRoLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spIHtcbiAgICBpZiAoIXRoaXMuZGIpIHtcbiAgICAgICAgZXJyb3JDYWxsYmFjayAmJiBlcnJvckNhbGxiYWNrKHdpbmRvdy5GaWxlRXJyb3IuSU5WQUxJRF9NT0RJRklDQVRJT05fRVJSKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciB0eCA9IHRoaXMuZGIudHJhbnNhY3Rpb24oW0ZJTEVfU1RPUkVfXSwgJ3JlYWR3cml0ZScpO1xuICAgIHR4Lm9uYWJvcnQgPSBvbkVycm9yO1xuICAgIHR4Lm9uY29tcGxldGUgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgLy8gVE9ETzogRXJyb3IgaXMgdGhyb3duIGlmIHdlIHBhc3MgdGhlIHJlcXVlc3QgZXZlbnQgYmFjayBpbnN0ZWFkLlxuICAgICAgICBzdWNjZXNzQ2FsbGJhY2soZW50cnkpO1xuICAgIH07XG5cbiAgICB0eC5vYmplY3RTdG9yZShGSUxFX1NUT1JFXykucHV0KGVudHJ5LCBzdG9yYWdlUGF0aCk7XG59O1xuXG5mdW5jdGlvbiBvbkVycm9yKGUpIHtcbiAgICBzd2l0Y2ggKGUudGFyZ2V0LmVycm9yQ29kZSkge1xuICAgICAgICBjYXNlIDEyOlxuICAgICAgICAgICAgY29uc29sZS5sb2coJ0Vycm9yIC0gQXR0ZW1wdCB0byBvcGVuIGRiIHdpdGggYSBsb3dlciB2ZXJzaW9uIHRoYW4gdGhlICcgK1xuICAgICAgICAgICAgICAgICdjdXJyZW50IG9uZS4nKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgY29uc29sZS5sb2coJ2Vycm9yQ29kZTogJyArIGUudGFyZ2V0LmVycm9yQ29kZSk7XG4gICAgfVxuXG4gICAgY29uc29sZS5sb2coZSwgZS5jb2RlLCBlLm1lc3NhZ2UpO1xufVxuXG5mdW5jdGlvbiBmaWxlRW50cnlGcm9tSWRiRW50cnkoZmlsZUVudHJ5KSB7XG4gICAgLy8gSURCIHdvbid0IHNhdmUgbWV0aG9kcywgc28gd2UgbmVlZCByZS1jcmVhdGUgdGhlIEZpbGVFbnRyeS5cbiAgICB2YXIgY2xvbmVkRmlsZUVudHJ5ID0gbmV3IHdpbmRvdy5GaWxlRW50cnkoZmlsZUVudHJ5Lm5hbWUsIGZpbGVFbnRyeS5mdWxsUGF0aCwgZmlsZUVudHJ5LmZpbGVzeXN0ZW0pO1xuICAgIGNsb25lZEZpbGVFbnRyeS5maWxlXyA9IGZpbGVFbnRyeS5maWxlXztcblxuICAgIHJldHVybiBjbG9uZWRGaWxlRW50cnk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaW5kZXhlZERCO1xuIiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vLyBCYXNlZCBvbiBBcGFjaGUgQ29yZG92YSBnZW9sb2NhdGlvbiBwbHVnaW4ncyBDb29yZGluYXRlcyBpbXBsZW1lbnRhdGlvbi5cbi8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2NvcmRvdmEtcGx1Z2luLWdlb2xvY2F0aW9uL2Jsb2IvbWFzdGVyL3d3dy9Db29yZGluYXRlcy5qc1xuXG4vKipcbiAqIFRoaXMgY2xhc3MgY29udGFpbnMgcG9zaXRpb24gaW5mb3JtYXRpb24uXG4gKiBAcGFyYW0ge09iamVjdH0gbGF0XG4gKiBAcGFyYW0ge09iamVjdH0gbG5nXG4gKiBAcGFyYW0ge09iamVjdH0gYWx0XG4gKiBAcGFyYW0ge09iamVjdH0gYWNjXG4gKiBAcGFyYW0ge09iamVjdH0gaGVhZFxuICogQHBhcmFtIHtPYmplY3R9IHZlbFxuICogQHBhcmFtIHtPYmplY3R9IGFsdGFjY1xuICogQGNvbnN0cnVjdG9yXG4gKi9cbnZhciBDb29yZGluYXRlcyA9IGZ1bmN0aW9uKGxhdCwgbG5nLCBhbHQsIGFjYywgaGVhZCwgdmVsLCBhbHRhY2MpIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbGF0aXR1ZGUgb2YgdGhlIHBvc2l0aW9uLlxuICAgICAqL1xuICAgIHRoaXMubGF0aXR1ZGUgPSBsYXQ7XG4gICAgLyoqXG4gICAgICogVGhlIGxvbmdpdHVkZSBvZiB0aGUgcG9zaXRpb24sXG4gICAgICovXG4gICAgdGhpcy5sb25naXR1ZGUgPSBsbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY3VyYWN5IG9mIHRoZSBwb3NpdGlvbi5cbiAgICAgKi9cbiAgICB0aGlzLmFjY3VyYWN5ID0gYWNjO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbHRpdHVkZSBvZiB0aGUgcG9zaXRpb24uXG4gICAgICovXG4gICAgdGhpcy5hbHRpdHVkZSA9IChhbHQgIT09IHVuZGVmaW5lZCA/IGFsdCA6IG51bGwpO1xuICAgIC8qKlxuICAgICAqIFRoZSBkaXJlY3Rpb24gdGhlIGRldmljZSBpcyBtb3ZpbmcgYXQgdGhlIHBvc2l0aW9uLlxuICAgICAqL1xuICAgIHRoaXMuaGVhZGluZyA9IChoZWFkICE9PSB1bmRlZmluZWQgPyBoZWFkIDogbnVsbCk7XG4gICAgLyoqXG4gICAgICogVGhlIHZlbG9jaXR5IHdpdGggd2hpY2ggdGhlIGRldmljZSBpcyBtb3ZpbmcgYXQgdGhlIHBvc2l0aW9uLlxuICAgICAqL1xuICAgIHRoaXMuc3BlZWQgPSAodmVsICE9PSB1bmRlZmluZWQgPyB2ZWwgOiBudWxsKTtcblxuICAgIGlmICh0aGlzLnNwZWVkID09PSAwIHx8IHRoaXMuc3BlZWQgPT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5oZWFkaW5nID0gTmFOO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBhbHRpdHVkZSBhY2N1cmFjeSBvZiB0aGUgcG9zaXRpb24uXG4gICAgICovXG4gICAgdGhpcy5hbHRpdHVkZUFjY3VyYWN5ID0gKGFsdGFjYyAhPT0gdW5kZWZpbmVkKSA/IGFsdGFjYyA6IG51bGw7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IENvb3JkaW5hdGVzO1xuIiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vLyBCYXNlZCBvbiBBcGFjaGUgQ29yZG92YSBnZW9sb2NhdGlvbiBwbHVnaW4ncyBQb3NpdGlvbiBpbXBsZW1lbnRhdGlvbi5cbi8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2NvcmRvdmEtcGx1Z2luLWdlb2xvY2F0aW9uL2Jsb2IvbWFzdGVyL3d3dy9Qb3NpdGlvbi5qc1xuXG52YXIgQ29vcmRpbmF0ZXMgPSByZXF1aXJlKCcuL0Nvb3JkaW5hdGVzJyk7XG5cbnZhciBQb3NpdGlvbiA9IGZ1bmN0aW9uKGNvb3JkcywgdGltZXN0YW1wKSB7XG4gICAgaWYgKGNvb3Jkcykge1xuICAgICAgICB0aGlzLmNvb3JkcyA9IG5ldyBDb29yZGluYXRlcyhjb29yZHMubGF0aXR1ZGUsIGNvb3Jkcy5sb25naXR1ZGUsIGNvb3Jkcy5hbHRpdHVkZSwgY29vcmRzLmFjY3VyYWN5LCBjb29yZHMuaGVhZGluZywgY29vcmRzLnZlbG9jaXR5LCBjb29yZHMuYWx0aXR1ZGVBY2N1cmFjeSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jb29yZHMgPSBuZXcgQ29vcmRpbmF0ZXMoKTtcbiAgICB9XG4gICAgdGhpcy50aW1lc3RhbXAgPSAodGltZXN0YW1wICE9PSB1bmRlZmluZWQpID8gdGltZXN0YW1wIDogbmV3IERhdGUoKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gUG9zaXRpb247XG4iLCIvLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIEJhc2VkIG9uIEFwYWNoZSBDb3Jkb3ZhIGdlb2xvY2F0aW9uIHBsdWdpbidzIFBvc2l0aW9uRXJyb3IgaW1wbGVtZW50YXRpb24uXG4vLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jb3Jkb3ZhLXBsdWdpbi1nZW9sb2NhdGlvbi9ibG9iL21hc3Rlci93d3cvUG9zaXRpb25FcnJvci5qc1xuXG4vKipcbiAqIFBvc2l0aW9uIGVycm9yIG9iamVjdFxuICpcbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIGNvZGVcbiAqIEBwYXJhbSBtZXNzYWdlXG4gKi9cbnZhciBQb3NpdGlvbkVycm9yID0gZnVuY3Rpb24oY29kZSwgbWVzc2FnZSkge1xuICAgIHRoaXMuY29kZSA9IGNvZGUgfHwgbnVsbDtcbiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlIHx8ICcnO1xufTtcblxuUG9zaXRpb25FcnJvci5wcm90b3R5cGUuUEVSTUlTU0lPTl9ERU5JRUQgPSBQb3NpdGlvbkVycm9yLlBFUk1JU1NJT05fREVOSUVEID0gMTtcblBvc2l0aW9uRXJyb3IucHJvdG90eXBlLlBPU0lUSU9OX1VOQVZBSUxBQkxFID0gUG9zaXRpb25FcnJvci5QT1NJVElPTl9VTkFWQUlMQUJMRSA9IDI7XG5Qb3NpdGlvbkVycm9yLnByb3RvdHlwZS5USU1FT1VUID0gUG9zaXRpb25FcnJvci5USU1FT1VUID0gMztcblxubW9kdWxlLmV4cG9ydHMgPSBQb3NpdGlvbkVycm9yO1xuIiwiLy8gc2hpbSBmb3IgdXNpbmcgcHJvY2VzcyBpbiBicm93c2VyXG52YXIgcHJvY2VzcyA9IG1vZHVsZS5leHBvcnRzID0ge307XG5cbi8vIGNhY2hlZCBmcm9tIHdoYXRldmVyIGdsb2JhbCBpcyBwcmVzZW50IHNvIHRoYXQgdGVzdCBydW5uZXJzIHRoYXQgc3R1YiBpdFxuLy8gZG9uJ3QgYnJlYWsgdGhpbmdzLiAgQnV0IHdlIG5lZWQgdG8gd3JhcCBpdCBpbiBhIHRyeSBjYXRjaCBpbiBjYXNlIGl0IGlzXG4vLyB3cmFwcGVkIGluIHN0cmljdCBtb2RlIGNvZGUgd2hpY2ggZG9lc24ndCBkZWZpbmUgYW55IGdsb2JhbHMuICBJdCdzIGluc2lkZSBhXG4vLyBmdW5jdGlvbiBiZWNhdXNlIHRyeS9jYXRjaGVzIGRlb3B0aW1pemUgaW4gY2VydGFpbiBlbmdpbmVzLlxuXG52YXIgY2FjaGVkU2V0VGltZW91dDtcbnZhciBjYWNoZWRDbGVhclRpbWVvdXQ7XG5cbihmdW5jdGlvbiAoKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzZXRUaW1lb3V0IGlzIG5vdCBkZWZpbmVkJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0O1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjbGVhclRpbWVvdXQgaXMgbm90IGRlZmluZWQnKTtcbiAgICAgICAgfVxuICAgIH1cbn0gKCkpXG5mdW5jdGlvbiBydW5UaW1lb3V0KGZ1bikge1xuICAgIGlmIChjYWNoZWRTZXRUaW1lb3V0ID09PSBzZXRUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfSBjYXRjaChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCB0cnVzdCB0aGUgZ2xvYmFsIG9iamVjdCB3aGVuIGNhbGxlZCBub3JtYWxseVxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQuY2FsbChudWxsLCBmdW4sIDApO1xuICAgICAgICB9IGNhdGNoKGUpe1xuICAgICAgICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2hlbiBpdCdzIGEgdmVyc2lvbiBvZiBJLkUuIHRoYXQgbXVzdCBoYXZlIHRoZSBnbG9iYWwgb2JqZWN0IGZvciAndGhpcycsIGhvcGZ1bGx5IG91ciBjb250ZXh0IGNvcnJlY3Qgb3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYSBnbG9iYWwgZXJyb3JcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwodGhpcywgZnVuLCAwKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG59XG5mdW5jdGlvbiBydW5DbGVhclRpbWVvdXQobWFya2VyKSB7XG4gICAgaWYgKGNhY2hlZENsZWFyVGltZW91dCA9PT0gY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIC8vIHdoZW4gd2hlbiBzb21lYm9keSBoYXMgc2NyZXdlZCB3aXRoIHNldFRpbWVvdXQgYnV0IG5vIEkuRS4gbWFkZG5lc3NcbiAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH0gY2F0Y2ggKGUpe1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2hlbiB3ZSBhcmUgaW4gSS5FLiBidXQgdGhlIHNjcmlwdCBoYXMgYmVlbiBldmFsZWQgc28gSS5FLiBkb2Vzbid0ICB0cnVzdCB0aGUgZ2xvYmFsIG9iamVjdCB3aGVuIGNhbGxlZCBub3JtYWxseVxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKG51bGwsIG1hcmtlcik7XG4gICAgICAgIH0gY2F0Y2ggKGUpe1xuICAgICAgICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2hlbiBpdCdzIGEgdmVyc2lvbiBvZiBJLkUuIHRoYXQgbXVzdCBoYXZlIHRoZSBnbG9iYWwgb2JqZWN0IGZvciAndGhpcycsIGhvcGZ1bGx5IG91ciBjb250ZXh0IGNvcnJlY3Qgb3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYSBnbG9iYWwgZXJyb3IuXG4gICAgICAgICAgICAvLyBTb21lIHZlcnNpb25zIG9mIEkuRS4gaGF2ZSBkaWZmZXJlbnQgcnVsZXMgZm9yIGNsZWFyVGltZW91dCB2cyBzZXRUaW1lb3V0XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwodGhpcywgbWFya2VyKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG5cbn1cbnZhciBxdWV1ZSA9IFtdO1xudmFyIGRyYWluaW5nID0gZmFsc2U7XG52YXIgY3VycmVudFF1ZXVlO1xudmFyIHF1ZXVlSW5kZXggPSAtMTtcblxuZnVuY3Rpb24gY2xlYW5VcE5leHRUaWNrKCkge1xuICAgIGlmICghZHJhaW5pbmcgfHwgIWN1cnJlbnRRdWV1ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgaWYgKGN1cnJlbnRRdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgcXVldWUgPSBjdXJyZW50UXVldWUuY29uY2F0KHF1ZXVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgfVxuICAgIGlmIChxdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgZHJhaW5RdWV1ZSgpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZHJhaW5RdWV1ZSgpIHtcbiAgICBpZiAoZHJhaW5pbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgdGltZW91dCA9IHJ1blRpbWVvdXQoY2xlYW5VcE5leHRUaWNrKTtcbiAgICBkcmFpbmluZyA9IHRydWU7XG5cbiAgICB2YXIgbGVuID0gcXVldWUubGVuZ3RoO1xuICAgIHdoaWxlKGxlbikge1xuICAgICAgICBjdXJyZW50UXVldWUgPSBxdWV1ZTtcbiAgICAgICAgcXVldWUgPSBbXTtcbiAgICAgICAgd2hpbGUgKCsrcXVldWVJbmRleCA8IGxlbikge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRRdWV1ZSkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRRdWV1ZVtxdWV1ZUluZGV4XS5ydW4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgICAgIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB9XG4gICAgY3VycmVudFF1ZXVlID0gbnVsbDtcbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIHJ1bkNsZWFyVGltZW91dCh0aW1lb3V0KTtcbn1cblxucHJvY2Vzcy5uZXh0VGljayA9IGZ1bmN0aW9uIChmdW4pIHtcbiAgICB2YXIgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMSk7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBhcmdzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBxdWV1ZS5wdXNoKG5ldyBJdGVtKGZ1biwgYXJncykpO1xuICAgIGlmIChxdWV1ZS5sZW5ndGggPT09IDEgJiYgIWRyYWluaW5nKSB7XG4gICAgICAgIHJ1blRpbWVvdXQoZHJhaW5RdWV1ZSk7XG4gICAgfVxufTtcblxuLy8gdjggbGlrZXMgcHJlZGljdGlibGUgb2JqZWN0c1xuZnVuY3Rpb24gSXRlbShmdW4sIGFycmF5KSB7XG4gICAgdGhpcy5mdW4gPSBmdW47XG4gICAgdGhpcy5hcnJheSA9IGFycmF5O1xufVxuSXRlbS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuZnVuLmFwcGx5KG51bGwsIHRoaXMuYXJyYXkpO1xufTtcbnByb2Nlc3MudGl0bGUgPSAnYnJvd3Nlcic7XG5wcm9jZXNzLmJyb3dzZXIgPSB0cnVlO1xucHJvY2Vzcy5lbnYgPSB7fTtcbnByb2Nlc3MuYXJndiA9IFtdO1xucHJvY2Vzcy52ZXJzaW9uID0gJyc7IC8vIGVtcHR5IHN0cmluZyB0byBhdm9pZCByZWdleHAgaXNzdWVzXG5wcm9jZXNzLnZlcnNpb25zID0ge307XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG5wcm9jZXNzLm9uID0gbm9vcDtcbnByb2Nlc3MuYWRkTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5vbmNlID0gbm9vcDtcbnByb2Nlc3Mub2ZmID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVBbGxMaXN0ZW5lcnMgPSBub29wO1xucHJvY2Vzcy5lbWl0ID0gbm9vcDtcblxucHJvY2Vzcy5iaW5kaW5nID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xuXG5wcm9jZXNzLmN3ZCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICcvJyB9O1xucHJvY2Vzcy5jaGRpciA9IGZ1bmN0aW9uIChkaXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcbnByb2Nlc3MudW1hc2sgPSBmdW5jdGlvbigpIHsgcmV0dXJuIDA7IH07XG4iLCIvKiEgaHR0cHM6Ly9tdGhzLmJlL3B1bnljb2RlIHYxLjQuMSBieSBAbWF0aGlhcyAqL1xuOyhmdW5jdGlvbihyb290KSB7XG5cblx0LyoqIERldGVjdCBmcmVlIHZhcmlhYmxlcyAqL1xuXHR2YXIgZnJlZUV4cG9ydHMgPSB0eXBlb2YgZXhwb3J0cyA9PSAnb2JqZWN0JyAmJiBleHBvcnRzICYmXG5cdFx0IWV4cG9ydHMubm9kZVR5cGUgJiYgZXhwb3J0cztcblx0dmFyIGZyZWVNb2R1bGUgPSB0eXBlb2YgbW9kdWxlID09ICdvYmplY3QnICYmIG1vZHVsZSAmJlxuXHRcdCFtb2R1bGUubm9kZVR5cGUgJiYgbW9kdWxlO1xuXHR2YXIgZnJlZUdsb2JhbCA9IHR5cGVvZiBnbG9iYWwgPT0gJ29iamVjdCcgJiYgZ2xvYmFsO1xuXHRpZiAoXG5cdFx0ZnJlZUdsb2JhbC5nbG9iYWwgPT09IGZyZWVHbG9iYWwgfHxcblx0XHRmcmVlR2xvYmFsLndpbmRvdyA9PT0gZnJlZUdsb2JhbCB8fFxuXHRcdGZyZWVHbG9iYWwuc2VsZiA9PT0gZnJlZUdsb2JhbFxuXHQpIHtcblx0XHRyb290ID0gZnJlZUdsb2JhbDtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgYHB1bnljb2RlYCBvYmplY3QuXG5cdCAqIEBuYW1lIHB1bnljb2RlXG5cdCAqIEB0eXBlIE9iamVjdFxuXHQgKi9cblx0dmFyIHB1bnljb2RlLFxuXG5cdC8qKiBIaWdoZXN0IHBvc2l0aXZlIHNpZ25lZCAzMi1iaXQgZmxvYXQgdmFsdWUgKi9cblx0bWF4SW50ID0gMjE0NzQ4MzY0NywgLy8gYWthLiAweDdGRkZGRkZGIG9yIDJeMzEtMVxuXG5cdC8qKiBCb290c3RyaW5nIHBhcmFtZXRlcnMgKi9cblx0YmFzZSA9IDM2LFxuXHR0TWluID0gMSxcblx0dE1heCA9IDI2LFxuXHRza2V3ID0gMzgsXG5cdGRhbXAgPSA3MDAsXG5cdGluaXRpYWxCaWFzID0gNzIsXG5cdGluaXRpYWxOID0gMTI4LCAvLyAweDgwXG5cdGRlbGltaXRlciA9ICctJywgLy8gJ1xceDJEJ1xuXG5cdC8qKiBSZWd1bGFyIGV4cHJlc3Npb25zICovXG5cdHJlZ2V4UHVueWNvZGUgPSAvXnhuLS0vLFxuXHRyZWdleE5vbkFTQ0lJID0gL1teXFx4MjAtXFx4N0VdLywgLy8gdW5wcmludGFibGUgQVNDSUkgY2hhcnMgKyBub24tQVNDSUkgY2hhcnNcblx0cmVnZXhTZXBhcmF0b3JzID0gL1tcXHgyRVxcdTMwMDJcXHVGRjBFXFx1RkY2MV0vZywgLy8gUkZDIDM0OTAgc2VwYXJhdG9yc1xuXG5cdC8qKiBFcnJvciBtZXNzYWdlcyAqL1xuXHRlcnJvcnMgPSB7XG5cdFx0J292ZXJmbG93JzogJ092ZXJmbG93OiBpbnB1dCBuZWVkcyB3aWRlciBpbnRlZ2VycyB0byBwcm9jZXNzJyxcblx0XHQnbm90LWJhc2ljJzogJ0lsbGVnYWwgaW5wdXQgPj0gMHg4MCAobm90IGEgYmFzaWMgY29kZSBwb2ludCknLFxuXHRcdCdpbnZhbGlkLWlucHV0JzogJ0ludmFsaWQgaW5wdXQnXG5cdH0sXG5cblx0LyoqIENvbnZlbmllbmNlIHNob3J0Y3V0cyAqL1xuXHRiYXNlTWludXNUTWluID0gYmFzZSAtIHRNaW4sXG5cdGZsb29yID0gTWF0aC5mbG9vcixcblx0c3RyaW5nRnJvbUNoYXJDb2RlID0gU3RyaW5nLmZyb21DaGFyQ29kZSxcblxuXHQvKiogVGVtcG9yYXJ5IHZhcmlhYmxlICovXG5cdGtleTtcblxuXHQvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuXHQvKipcblx0ICogQSBnZW5lcmljIGVycm9yIHV0aWxpdHkgZnVuY3Rpb24uXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIFRoZSBlcnJvciB0eXBlLlxuXHQgKiBAcmV0dXJucyB7RXJyb3J9IFRocm93cyBhIGBSYW5nZUVycm9yYCB3aXRoIHRoZSBhcHBsaWNhYmxlIGVycm9yIG1lc3NhZ2UuXG5cdCAqL1xuXHRmdW5jdGlvbiBlcnJvcih0eXBlKSB7XG5cdFx0dGhyb3cgbmV3IFJhbmdlRXJyb3IoZXJyb3JzW3R5cGVdKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBBIGdlbmVyaWMgYEFycmF5I21hcGAgdXRpbGl0eSBmdW5jdGlvbi5cblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cblx0ICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgVGhlIGZ1bmN0aW9uIHRoYXQgZ2V0cyBjYWxsZWQgZm9yIGV2ZXJ5IGFycmF5XG5cdCAqIGl0ZW0uXG5cdCAqIEByZXR1cm5zIHtBcnJheX0gQSBuZXcgYXJyYXkgb2YgdmFsdWVzIHJldHVybmVkIGJ5IHRoZSBjYWxsYmFjayBmdW5jdGlvbi5cblx0ICovXG5cdGZ1bmN0aW9uIG1hcChhcnJheSwgZm4pIHtcblx0XHR2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXHRcdHZhciByZXN1bHQgPSBbXTtcblx0XHR3aGlsZSAobGVuZ3RoLS0pIHtcblx0XHRcdHJlc3VsdFtsZW5ndGhdID0gZm4oYXJyYXlbbGVuZ3RoXSk7XG5cdFx0fVxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHQvKipcblx0ICogQSBzaW1wbGUgYEFycmF5I21hcGAtbGlrZSB3cmFwcGVyIHRvIHdvcmsgd2l0aCBkb21haW4gbmFtZSBzdHJpbmdzIG9yIGVtYWlsXG5cdCAqIGFkZHJlc3Nlcy5cblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHtTdHJpbmd9IGRvbWFpbiBUaGUgZG9tYWluIG5hbWUgb3IgZW1haWwgYWRkcmVzcy5cblx0ICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgVGhlIGZ1bmN0aW9uIHRoYXQgZ2V0cyBjYWxsZWQgZm9yIGV2ZXJ5XG5cdCAqIGNoYXJhY3Rlci5cblx0ICogQHJldHVybnMge0FycmF5fSBBIG5ldyBzdHJpbmcgb2YgY2hhcmFjdGVycyByZXR1cm5lZCBieSB0aGUgY2FsbGJhY2tcblx0ICogZnVuY3Rpb24uXG5cdCAqL1xuXHRmdW5jdGlvbiBtYXBEb21haW4oc3RyaW5nLCBmbikge1xuXHRcdHZhciBwYXJ0cyA9IHN0cmluZy5zcGxpdCgnQCcpO1xuXHRcdHZhciByZXN1bHQgPSAnJztcblx0XHRpZiAocGFydHMubGVuZ3RoID4gMSkge1xuXHRcdFx0Ly8gSW4gZW1haWwgYWRkcmVzc2VzLCBvbmx5IHRoZSBkb21haW4gbmFtZSBzaG91bGQgYmUgcHVueWNvZGVkLiBMZWF2ZVxuXHRcdFx0Ly8gdGhlIGxvY2FsIHBhcnQgKGkuZS4gZXZlcnl0aGluZyB1cCB0byBgQGApIGludGFjdC5cblx0XHRcdHJlc3VsdCA9IHBhcnRzWzBdICsgJ0AnO1xuXHRcdFx0c3RyaW5nID0gcGFydHNbMV07XG5cdFx0fVxuXHRcdC8vIEF2b2lkIGBzcGxpdChyZWdleClgIGZvciBJRTggY29tcGF0aWJpbGl0eS4gU2VlICMxNy5cblx0XHRzdHJpbmcgPSBzdHJpbmcucmVwbGFjZShyZWdleFNlcGFyYXRvcnMsICdcXHgyRScpO1xuXHRcdHZhciBsYWJlbHMgPSBzdHJpbmcuc3BsaXQoJy4nKTtcblx0XHR2YXIgZW5jb2RlZCA9IG1hcChsYWJlbHMsIGZuKS5qb2luKCcuJyk7XG5cdFx0cmV0dXJuIHJlc3VsdCArIGVuY29kZWQ7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhbiBhcnJheSBjb250YWluaW5nIHRoZSBudW1lcmljIGNvZGUgcG9pbnRzIG9mIGVhY2ggVW5pY29kZVxuXHQgKiBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZy4gV2hpbGUgSmF2YVNjcmlwdCB1c2VzIFVDUy0yIGludGVybmFsbHksXG5cdCAqIHRoaXMgZnVuY3Rpb24gd2lsbCBjb252ZXJ0IGEgcGFpciBvZiBzdXJyb2dhdGUgaGFsdmVzIChlYWNoIG9mIHdoaWNoXG5cdCAqIFVDUy0yIGV4cG9zZXMgYXMgc2VwYXJhdGUgY2hhcmFjdGVycykgaW50byBhIHNpbmdsZSBjb2RlIHBvaW50LFxuXHQgKiBtYXRjaGluZyBVVEYtMTYuXG5cdCAqIEBzZWUgYHB1bnljb2RlLnVjczIuZW5jb2RlYFxuXHQgKiBAc2VlIDxodHRwczovL21hdGhpYXNieW5lbnMuYmUvbm90ZXMvamF2YXNjcmlwdC1lbmNvZGluZz5cblx0ICogQG1lbWJlck9mIHB1bnljb2RlLnVjczJcblx0ICogQG5hbWUgZGVjb2RlXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBzdHJpbmcgVGhlIFVuaWNvZGUgaW5wdXQgc3RyaW5nIChVQ1MtMikuXG5cdCAqIEByZXR1cm5zIHtBcnJheX0gVGhlIG5ldyBhcnJheSBvZiBjb2RlIHBvaW50cy5cblx0ICovXG5cdGZ1bmN0aW9uIHVjczJkZWNvZGUoc3RyaW5nKSB7XG5cdFx0dmFyIG91dHB1dCA9IFtdLFxuXHRcdCAgICBjb3VudGVyID0gMCxcblx0XHQgICAgbGVuZ3RoID0gc3RyaW5nLmxlbmd0aCxcblx0XHQgICAgdmFsdWUsXG5cdFx0ICAgIGV4dHJhO1xuXHRcdHdoaWxlIChjb3VudGVyIDwgbGVuZ3RoKSB7XG5cdFx0XHR2YWx1ZSA9IHN0cmluZy5jaGFyQ29kZUF0KGNvdW50ZXIrKyk7XG5cdFx0XHRpZiAodmFsdWUgPj0gMHhEODAwICYmIHZhbHVlIDw9IDB4REJGRiAmJiBjb3VudGVyIDwgbGVuZ3RoKSB7XG5cdFx0XHRcdC8vIGhpZ2ggc3Vycm9nYXRlLCBhbmQgdGhlcmUgaXMgYSBuZXh0IGNoYXJhY3RlclxuXHRcdFx0XHRleHRyYSA9IHN0cmluZy5jaGFyQ29kZUF0KGNvdW50ZXIrKyk7XG5cdFx0XHRcdGlmICgoZXh0cmEgJiAweEZDMDApID09IDB4REMwMCkgeyAvLyBsb3cgc3Vycm9nYXRlXG5cdFx0XHRcdFx0b3V0cHV0LnB1c2goKCh2YWx1ZSAmIDB4M0ZGKSA8PCAxMCkgKyAoZXh0cmEgJiAweDNGRikgKyAweDEwMDAwKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyB1bm1hdGNoZWQgc3Vycm9nYXRlOyBvbmx5IGFwcGVuZCB0aGlzIGNvZGUgdW5pdCwgaW4gY2FzZSB0aGUgbmV4dFxuXHRcdFx0XHRcdC8vIGNvZGUgdW5pdCBpcyB0aGUgaGlnaCBzdXJyb2dhdGUgb2YgYSBzdXJyb2dhdGUgcGFpclxuXHRcdFx0XHRcdG91dHB1dC5wdXNoKHZhbHVlKTtcblx0XHRcdFx0XHRjb3VudGVyLS07XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG91dHB1dC5wdXNoKHZhbHVlKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIG91dHB1dDtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgc3RyaW5nIGJhc2VkIG9uIGFuIGFycmF5IG9mIG51bWVyaWMgY29kZSBwb2ludHMuXG5cdCAqIEBzZWUgYHB1bnljb2RlLnVjczIuZGVjb2RlYFxuXHQgKiBAbWVtYmVyT2YgcHVueWNvZGUudWNzMlxuXHQgKiBAbmFtZSBlbmNvZGVcblx0ICogQHBhcmFtIHtBcnJheX0gY29kZVBvaW50cyBUaGUgYXJyYXkgb2YgbnVtZXJpYyBjb2RlIHBvaW50cy5cblx0ICogQHJldHVybnMge1N0cmluZ30gVGhlIG5ldyBVbmljb2RlIHN0cmluZyAoVUNTLTIpLlxuXHQgKi9cblx0ZnVuY3Rpb24gdWNzMmVuY29kZShhcnJheSkge1xuXHRcdHJldHVybiBtYXAoYXJyYXksIGZ1bmN0aW9uKHZhbHVlKSB7XG5cdFx0XHR2YXIgb3V0cHV0ID0gJyc7XG5cdFx0XHRpZiAodmFsdWUgPiAweEZGRkYpIHtcblx0XHRcdFx0dmFsdWUgLT0gMHgxMDAwMDtcblx0XHRcdFx0b3V0cHV0ICs9IHN0cmluZ0Zyb21DaGFyQ29kZSh2YWx1ZSA+Pj4gMTAgJiAweDNGRiB8IDB4RDgwMCk7XG5cdFx0XHRcdHZhbHVlID0gMHhEQzAwIHwgdmFsdWUgJiAweDNGRjtcblx0XHRcdH1cblx0XHRcdG91dHB1dCArPSBzdHJpbmdGcm9tQ2hhckNvZGUodmFsdWUpO1xuXHRcdFx0cmV0dXJuIG91dHB1dDtcblx0XHR9KS5qb2luKCcnKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb252ZXJ0cyBhIGJhc2ljIGNvZGUgcG9pbnQgaW50byBhIGRpZ2l0L2ludGVnZXIuXG5cdCAqIEBzZWUgYGRpZ2l0VG9CYXNpYygpYFxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAcGFyYW0ge051bWJlcn0gY29kZVBvaW50IFRoZSBiYXNpYyBudW1lcmljIGNvZGUgcG9pbnQgdmFsdWUuXG5cdCAqIEByZXR1cm5zIHtOdW1iZXJ9IFRoZSBudW1lcmljIHZhbHVlIG9mIGEgYmFzaWMgY29kZSBwb2ludCAoZm9yIHVzZSBpblxuXHQgKiByZXByZXNlbnRpbmcgaW50ZWdlcnMpIGluIHRoZSByYW5nZSBgMGAgdG8gYGJhc2UgLSAxYCwgb3IgYGJhc2VgIGlmXG5cdCAqIHRoZSBjb2RlIHBvaW50IGRvZXMgbm90IHJlcHJlc2VudCBhIHZhbHVlLlxuXHQgKi9cblx0ZnVuY3Rpb24gYmFzaWNUb0RpZ2l0KGNvZGVQb2ludCkge1xuXHRcdGlmIChjb2RlUG9pbnQgLSA0OCA8IDEwKSB7XG5cdFx0XHRyZXR1cm4gY29kZVBvaW50IC0gMjI7XG5cdFx0fVxuXHRcdGlmIChjb2RlUG9pbnQgLSA2NSA8IDI2KSB7XG5cdFx0XHRyZXR1cm4gY29kZVBvaW50IC0gNjU7XG5cdFx0fVxuXHRcdGlmIChjb2RlUG9pbnQgLSA5NyA8IDI2KSB7XG5cdFx0XHRyZXR1cm4gY29kZVBvaW50IC0gOTc7XG5cdFx0fVxuXHRcdHJldHVybiBiYXNlO1xuXHR9XG5cblx0LyoqXG5cdCAqIENvbnZlcnRzIGEgZGlnaXQvaW50ZWdlciBpbnRvIGEgYmFzaWMgY29kZSBwb2ludC5cblx0ICogQHNlZSBgYmFzaWNUb0RpZ2l0KClgXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBkaWdpdCBUaGUgbnVtZXJpYyB2YWx1ZSBvZiBhIGJhc2ljIGNvZGUgcG9pbnQuXG5cdCAqIEByZXR1cm5zIHtOdW1iZXJ9IFRoZSBiYXNpYyBjb2RlIHBvaW50IHdob3NlIHZhbHVlICh3aGVuIHVzZWQgZm9yXG5cdCAqIHJlcHJlc2VudGluZyBpbnRlZ2VycykgaXMgYGRpZ2l0YCwgd2hpY2ggbmVlZHMgdG8gYmUgaW4gdGhlIHJhbmdlXG5cdCAqIGAwYCB0byBgYmFzZSAtIDFgLiBJZiBgZmxhZ2AgaXMgbm9uLXplcm8sIHRoZSB1cHBlcmNhc2UgZm9ybSBpc1xuXHQgKiB1c2VkOyBlbHNlLCB0aGUgbG93ZXJjYXNlIGZvcm0gaXMgdXNlZC4gVGhlIGJlaGF2aW9yIGlzIHVuZGVmaW5lZFxuXHQgKiBpZiBgZmxhZ2AgaXMgbm9uLXplcm8gYW5kIGBkaWdpdGAgaGFzIG5vIHVwcGVyY2FzZSBmb3JtLlxuXHQgKi9cblx0ZnVuY3Rpb24gZGlnaXRUb0Jhc2ljKGRpZ2l0LCBmbGFnKSB7XG5cdFx0Ly8gIDAuLjI1IG1hcCB0byBBU0NJSSBhLi56IG9yIEEuLlpcblx0XHQvLyAyNi4uMzUgbWFwIHRvIEFTQ0lJIDAuLjlcblx0XHRyZXR1cm4gZGlnaXQgKyAyMiArIDc1ICogKGRpZ2l0IDwgMjYpIC0gKChmbGFnICE9IDApIDw8IDUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEJpYXMgYWRhcHRhdGlvbiBmdW5jdGlvbiBhcyBwZXIgc2VjdGlvbiAzLjQgb2YgUkZDIDM0OTIuXG5cdCAqIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzNDkyI3NlY3Rpb24tMy40XG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRmdW5jdGlvbiBhZGFwdChkZWx0YSwgbnVtUG9pbnRzLCBmaXJzdFRpbWUpIHtcblx0XHR2YXIgayA9IDA7XG5cdFx0ZGVsdGEgPSBmaXJzdFRpbWUgPyBmbG9vcihkZWx0YSAvIGRhbXApIDogZGVsdGEgPj4gMTtcblx0XHRkZWx0YSArPSBmbG9vcihkZWx0YSAvIG51bVBvaW50cyk7XG5cdFx0Zm9yICgvKiBubyBpbml0aWFsaXphdGlvbiAqLzsgZGVsdGEgPiBiYXNlTWludXNUTWluICogdE1heCA+PiAxOyBrICs9IGJhc2UpIHtcblx0XHRcdGRlbHRhID0gZmxvb3IoZGVsdGEgLyBiYXNlTWludXNUTWluKTtcblx0XHR9XG5cdFx0cmV0dXJuIGZsb29yKGsgKyAoYmFzZU1pbnVzVE1pbiArIDEpICogZGVsdGEgLyAoZGVsdGEgKyBza2V3KSk7XG5cdH1cblxuXHQvKipcblx0ICogQ29udmVydHMgYSBQdW55Y29kZSBzdHJpbmcgb2YgQVNDSUktb25seSBzeW1ib2xzIHRvIGEgc3RyaW5nIG9mIFVuaWNvZGVcblx0ICogc3ltYm9scy5cblx0ICogQG1lbWJlck9mIHB1bnljb2RlXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBpbnB1dCBUaGUgUHVueWNvZGUgc3RyaW5nIG9mIEFTQ0lJLW9ubHkgc3ltYm9scy5cblx0ICogQHJldHVybnMge1N0cmluZ30gVGhlIHJlc3VsdGluZyBzdHJpbmcgb2YgVW5pY29kZSBzeW1ib2xzLlxuXHQgKi9cblx0ZnVuY3Rpb24gZGVjb2RlKGlucHV0KSB7XG5cdFx0Ly8gRG9uJ3QgdXNlIFVDUy0yXG5cdFx0dmFyIG91dHB1dCA9IFtdLFxuXHRcdCAgICBpbnB1dExlbmd0aCA9IGlucHV0Lmxlbmd0aCxcblx0XHQgICAgb3V0LFxuXHRcdCAgICBpID0gMCxcblx0XHQgICAgbiA9IGluaXRpYWxOLFxuXHRcdCAgICBiaWFzID0gaW5pdGlhbEJpYXMsXG5cdFx0ICAgIGJhc2ljLFxuXHRcdCAgICBqLFxuXHRcdCAgICBpbmRleCxcblx0XHQgICAgb2xkaSxcblx0XHQgICAgdyxcblx0XHQgICAgayxcblx0XHQgICAgZGlnaXQsXG5cdFx0ICAgIHQsXG5cdFx0ICAgIC8qKiBDYWNoZWQgY2FsY3VsYXRpb24gcmVzdWx0cyAqL1xuXHRcdCAgICBiYXNlTWludXNUO1xuXG5cdFx0Ly8gSGFuZGxlIHRoZSBiYXNpYyBjb2RlIHBvaW50czogbGV0IGBiYXNpY2AgYmUgdGhlIG51bWJlciBvZiBpbnB1dCBjb2RlXG5cdFx0Ly8gcG9pbnRzIGJlZm9yZSB0aGUgbGFzdCBkZWxpbWl0ZXIsIG9yIGAwYCBpZiB0aGVyZSBpcyBub25lLCB0aGVuIGNvcHlcblx0XHQvLyB0aGUgZmlyc3QgYmFzaWMgY29kZSBwb2ludHMgdG8gdGhlIG91dHB1dC5cblxuXHRcdGJhc2ljID0gaW5wdXQubGFzdEluZGV4T2YoZGVsaW1pdGVyKTtcblx0XHRpZiAoYmFzaWMgPCAwKSB7XG5cdFx0XHRiYXNpYyA9IDA7XG5cdFx0fVxuXG5cdFx0Zm9yIChqID0gMDsgaiA8IGJhc2ljOyArK2opIHtcblx0XHRcdC8vIGlmIGl0J3Mgbm90IGEgYmFzaWMgY29kZSBwb2ludFxuXHRcdFx0aWYgKGlucHV0LmNoYXJDb2RlQXQoaikgPj0gMHg4MCkge1xuXHRcdFx0XHRlcnJvcignbm90LWJhc2ljJyk7XG5cdFx0XHR9XG5cdFx0XHRvdXRwdXQucHVzaChpbnB1dC5jaGFyQ29kZUF0KGopKTtcblx0XHR9XG5cblx0XHQvLyBNYWluIGRlY29kaW5nIGxvb3A6IHN0YXJ0IGp1c3QgYWZ0ZXIgdGhlIGxhc3QgZGVsaW1pdGVyIGlmIGFueSBiYXNpYyBjb2RlXG5cdFx0Ly8gcG9pbnRzIHdlcmUgY29waWVkOyBzdGFydCBhdCB0aGUgYmVnaW5uaW5nIG90aGVyd2lzZS5cblxuXHRcdGZvciAoaW5kZXggPSBiYXNpYyA+IDAgPyBiYXNpYyArIDEgOiAwOyBpbmRleCA8IGlucHV0TGVuZ3RoOyAvKiBubyBmaW5hbCBleHByZXNzaW9uICovKSB7XG5cblx0XHRcdC8vIGBpbmRleGAgaXMgdGhlIGluZGV4IG9mIHRoZSBuZXh0IGNoYXJhY3RlciB0byBiZSBjb25zdW1lZC5cblx0XHRcdC8vIERlY29kZSBhIGdlbmVyYWxpemVkIHZhcmlhYmxlLWxlbmd0aCBpbnRlZ2VyIGludG8gYGRlbHRhYCxcblx0XHRcdC8vIHdoaWNoIGdldHMgYWRkZWQgdG8gYGlgLiBUaGUgb3ZlcmZsb3cgY2hlY2tpbmcgaXMgZWFzaWVyXG5cdFx0XHQvLyBpZiB3ZSBpbmNyZWFzZSBgaWAgYXMgd2UgZ28sIHRoZW4gc3VidHJhY3Qgb2ZmIGl0cyBzdGFydGluZ1xuXHRcdFx0Ly8gdmFsdWUgYXQgdGhlIGVuZCB0byBvYnRhaW4gYGRlbHRhYC5cblx0XHRcdGZvciAob2xkaSA9IGksIHcgPSAxLCBrID0gYmFzZTsgLyogbm8gY29uZGl0aW9uICovOyBrICs9IGJhc2UpIHtcblxuXHRcdFx0XHRpZiAoaW5kZXggPj0gaW5wdXRMZW5ndGgpIHtcblx0XHRcdFx0XHRlcnJvcignaW52YWxpZC1pbnB1dCcpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0ZGlnaXQgPSBiYXNpY1RvRGlnaXQoaW5wdXQuY2hhckNvZGVBdChpbmRleCsrKSk7XG5cblx0XHRcdFx0aWYgKGRpZ2l0ID49IGJhc2UgfHwgZGlnaXQgPiBmbG9vcigobWF4SW50IC0gaSkgLyB3KSkge1xuXHRcdFx0XHRcdGVycm9yKCdvdmVyZmxvdycpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aSArPSBkaWdpdCAqIHc7XG5cdFx0XHRcdHQgPSBrIDw9IGJpYXMgPyB0TWluIDogKGsgPj0gYmlhcyArIHRNYXggPyB0TWF4IDogayAtIGJpYXMpO1xuXG5cdFx0XHRcdGlmIChkaWdpdCA8IHQpIHtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGJhc2VNaW51c1QgPSBiYXNlIC0gdDtcblx0XHRcdFx0aWYgKHcgPiBmbG9vcihtYXhJbnQgLyBiYXNlTWludXNUKSkge1xuXHRcdFx0XHRcdGVycm9yKCdvdmVyZmxvdycpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dyAqPSBiYXNlTWludXNUO1xuXG5cdFx0XHR9XG5cblx0XHRcdG91dCA9IG91dHB1dC5sZW5ndGggKyAxO1xuXHRcdFx0YmlhcyA9IGFkYXB0KGkgLSBvbGRpLCBvdXQsIG9sZGkgPT0gMCk7XG5cblx0XHRcdC8vIGBpYCB3YXMgc3VwcG9zZWQgdG8gd3JhcCBhcm91bmQgZnJvbSBgb3V0YCB0byBgMGAsXG5cdFx0XHQvLyBpbmNyZW1lbnRpbmcgYG5gIGVhY2ggdGltZSwgc28gd2UnbGwgZml4IHRoYXQgbm93OlxuXHRcdFx0aWYgKGZsb29yKGkgLyBvdXQpID4gbWF4SW50IC0gbikge1xuXHRcdFx0XHRlcnJvcignb3ZlcmZsb3cnKTtcblx0XHRcdH1cblxuXHRcdFx0biArPSBmbG9vcihpIC8gb3V0KTtcblx0XHRcdGkgJT0gb3V0O1xuXG5cdFx0XHQvLyBJbnNlcnQgYG5gIGF0IHBvc2l0aW9uIGBpYCBvZiB0aGUgb3V0cHV0XG5cdFx0XHRvdXRwdXQuc3BsaWNlKGkrKywgMCwgbik7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdWNzMmVuY29kZShvdXRwdXQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENvbnZlcnRzIGEgc3RyaW5nIG9mIFVuaWNvZGUgc3ltYm9scyAoZS5nLiBhIGRvbWFpbiBuYW1lIGxhYmVsKSB0byBhXG5cdCAqIFB1bnljb2RlIHN0cmluZyBvZiBBU0NJSS1vbmx5IHN5bWJvbHMuXG5cdCAqIEBtZW1iZXJPZiBwdW55Y29kZVxuXHQgKiBAcGFyYW0ge1N0cmluZ30gaW5wdXQgVGhlIHN0cmluZyBvZiBVbmljb2RlIHN5bWJvbHMuXG5cdCAqIEByZXR1cm5zIHtTdHJpbmd9IFRoZSByZXN1bHRpbmcgUHVueWNvZGUgc3RyaW5nIG9mIEFTQ0lJLW9ubHkgc3ltYm9scy5cblx0ICovXG5cdGZ1bmN0aW9uIGVuY29kZShpbnB1dCkge1xuXHRcdHZhciBuLFxuXHRcdCAgICBkZWx0YSxcblx0XHQgICAgaGFuZGxlZENQQ291bnQsXG5cdFx0ICAgIGJhc2ljTGVuZ3RoLFxuXHRcdCAgICBiaWFzLFxuXHRcdCAgICBqLFxuXHRcdCAgICBtLFxuXHRcdCAgICBxLFxuXHRcdCAgICBrLFxuXHRcdCAgICB0LFxuXHRcdCAgICBjdXJyZW50VmFsdWUsXG5cdFx0ICAgIG91dHB1dCA9IFtdLFxuXHRcdCAgICAvKiogYGlucHV0TGVuZ3RoYCB3aWxsIGhvbGQgdGhlIG51bWJlciBvZiBjb2RlIHBvaW50cyBpbiBgaW5wdXRgLiAqL1xuXHRcdCAgICBpbnB1dExlbmd0aCxcblx0XHQgICAgLyoqIENhY2hlZCBjYWxjdWxhdGlvbiByZXN1bHRzICovXG5cdFx0ICAgIGhhbmRsZWRDUENvdW50UGx1c09uZSxcblx0XHQgICAgYmFzZU1pbnVzVCxcblx0XHQgICAgcU1pbnVzVDtcblxuXHRcdC8vIENvbnZlcnQgdGhlIGlucHV0IGluIFVDUy0yIHRvIFVuaWNvZGVcblx0XHRpbnB1dCA9IHVjczJkZWNvZGUoaW5wdXQpO1xuXG5cdFx0Ly8gQ2FjaGUgdGhlIGxlbmd0aFxuXHRcdGlucHV0TGVuZ3RoID0gaW5wdXQubGVuZ3RoO1xuXG5cdFx0Ly8gSW5pdGlhbGl6ZSB0aGUgc3RhdGVcblx0XHRuID0gaW5pdGlhbE47XG5cdFx0ZGVsdGEgPSAwO1xuXHRcdGJpYXMgPSBpbml0aWFsQmlhcztcblxuXHRcdC8vIEhhbmRsZSB0aGUgYmFzaWMgY29kZSBwb2ludHNcblx0XHRmb3IgKGogPSAwOyBqIDwgaW5wdXRMZW5ndGg7ICsraikge1xuXHRcdFx0Y3VycmVudFZhbHVlID0gaW5wdXRbal07XG5cdFx0XHRpZiAoY3VycmVudFZhbHVlIDwgMHg4MCkge1xuXHRcdFx0XHRvdXRwdXQucHVzaChzdHJpbmdGcm9tQ2hhckNvZGUoY3VycmVudFZhbHVlKSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aGFuZGxlZENQQ291bnQgPSBiYXNpY0xlbmd0aCA9IG91dHB1dC5sZW5ndGg7XG5cblx0XHQvLyBgaGFuZGxlZENQQ291bnRgIGlzIHRoZSBudW1iZXIgb2YgY29kZSBwb2ludHMgdGhhdCBoYXZlIGJlZW4gaGFuZGxlZDtcblx0XHQvLyBgYmFzaWNMZW5ndGhgIGlzIHRoZSBudW1iZXIgb2YgYmFzaWMgY29kZSBwb2ludHMuXG5cblx0XHQvLyBGaW5pc2ggdGhlIGJhc2ljIHN0cmluZyAtIGlmIGl0IGlzIG5vdCBlbXB0eSAtIHdpdGggYSBkZWxpbWl0ZXJcblx0XHRpZiAoYmFzaWNMZW5ndGgpIHtcblx0XHRcdG91dHB1dC5wdXNoKGRlbGltaXRlcik7XG5cdFx0fVxuXG5cdFx0Ly8gTWFpbiBlbmNvZGluZyBsb29wOlxuXHRcdHdoaWxlIChoYW5kbGVkQ1BDb3VudCA8IGlucHV0TGVuZ3RoKSB7XG5cblx0XHRcdC8vIEFsbCBub24tYmFzaWMgY29kZSBwb2ludHMgPCBuIGhhdmUgYmVlbiBoYW5kbGVkIGFscmVhZHkuIEZpbmQgdGhlIG5leHRcblx0XHRcdC8vIGxhcmdlciBvbmU6XG5cdFx0XHRmb3IgKG0gPSBtYXhJbnQsIGogPSAwOyBqIDwgaW5wdXRMZW5ndGg7ICsraikge1xuXHRcdFx0XHRjdXJyZW50VmFsdWUgPSBpbnB1dFtqXTtcblx0XHRcdFx0aWYgKGN1cnJlbnRWYWx1ZSA+PSBuICYmIGN1cnJlbnRWYWx1ZSA8IG0pIHtcblx0XHRcdFx0XHRtID0gY3VycmVudFZhbHVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIEluY3JlYXNlIGBkZWx0YWAgZW5vdWdoIHRvIGFkdmFuY2UgdGhlIGRlY29kZXIncyA8bixpPiBzdGF0ZSB0byA8bSwwPixcblx0XHRcdC8vIGJ1dCBndWFyZCBhZ2FpbnN0IG92ZXJmbG93XG5cdFx0XHRoYW5kbGVkQ1BDb3VudFBsdXNPbmUgPSBoYW5kbGVkQ1BDb3VudCArIDE7XG5cdFx0XHRpZiAobSAtIG4gPiBmbG9vcigobWF4SW50IC0gZGVsdGEpIC8gaGFuZGxlZENQQ291bnRQbHVzT25lKSkge1xuXHRcdFx0XHRlcnJvcignb3ZlcmZsb3cnKTtcblx0XHRcdH1cblxuXHRcdFx0ZGVsdGEgKz0gKG0gLSBuKSAqIGhhbmRsZWRDUENvdW50UGx1c09uZTtcblx0XHRcdG4gPSBtO1xuXG5cdFx0XHRmb3IgKGogPSAwOyBqIDwgaW5wdXRMZW5ndGg7ICsraikge1xuXHRcdFx0XHRjdXJyZW50VmFsdWUgPSBpbnB1dFtqXTtcblxuXHRcdFx0XHRpZiAoY3VycmVudFZhbHVlIDwgbiAmJiArK2RlbHRhID4gbWF4SW50KSB7XG5cdFx0XHRcdFx0ZXJyb3IoJ292ZXJmbG93Jyk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoY3VycmVudFZhbHVlID09IG4pIHtcblx0XHRcdFx0XHQvLyBSZXByZXNlbnQgZGVsdGEgYXMgYSBnZW5lcmFsaXplZCB2YXJpYWJsZS1sZW5ndGggaW50ZWdlclxuXHRcdFx0XHRcdGZvciAocSA9IGRlbHRhLCBrID0gYmFzZTsgLyogbm8gY29uZGl0aW9uICovOyBrICs9IGJhc2UpIHtcblx0XHRcdFx0XHRcdHQgPSBrIDw9IGJpYXMgPyB0TWluIDogKGsgPj0gYmlhcyArIHRNYXggPyB0TWF4IDogayAtIGJpYXMpO1xuXHRcdFx0XHRcdFx0aWYgKHEgPCB0KSB7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0cU1pbnVzVCA9IHEgLSB0O1xuXHRcdFx0XHRcdFx0YmFzZU1pbnVzVCA9IGJhc2UgLSB0O1xuXHRcdFx0XHRcdFx0b3V0cHV0LnB1c2goXG5cdFx0XHRcdFx0XHRcdHN0cmluZ0Zyb21DaGFyQ29kZShkaWdpdFRvQmFzaWModCArIHFNaW51c1QgJSBiYXNlTWludXNULCAwKSlcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRxID0gZmxvb3IocU1pbnVzVCAvIGJhc2VNaW51c1QpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdG91dHB1dC5wdXNoKHN0cmluZ0Zyb21DaGFyQ29kZShkaWdpdFRvQmFzaWMocSwgMCkpKTtcblx0XHRcdFx0XHRiaWFzID0gYWRhcHQoZGVsdGEsIGhhbmRsZWRDUENvdW50UGx1c09uZSwgaGFuZGxlZENQQ291bnQgPT0gYmFzaWNMZW5ndGgpO1xuXHRcdFx0XHRcdGRlbHRhID0gMDtcblx0XHRcdFx0XHQrK2hhbmRsZWRDUENvdW50O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdCsrZGVsdGE7XG5cdFx0XHQrK247XG5cblx0XHR9XG5cdFx0cmV0dXJuIG91dHB1dC5qb2luKCcnKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb252ZXJ0cyBhIFB1bnljb2RlIHN0cmluZyByZXByZXNlbnRpbmcgYSBkb21haW4gbmFtZSBvciBhbiBlbWFpbCBhZGRyZXNzXG5cdCAqIHRvIFVuaWNvZGUuIE9ubHkgdGhlIFB1bnljb2RlZCBwYXJ0cyBvZiB0aGUgaW5wdXQgd2lsbCBiZSBjb252ZXJ0ZWQsIGkuZS5cblx0ICogaXQgZG9lc24ndCBtYXR0ZXIgaWYgeW91IGNhbGwgaXQgb24gYSBzdHJpbmcgdGhhdCBoYXMgYWxyZWFkeSBiZWVuXG5cdCAqIGNvbnZlcnRlZCB0byBVbmljb2RlLlxuXHQgKiBAbWVtYmVyT2YgcHVueWNvZGVcblx0ICogQHBhcmFtIHtTdHJpbmd9IGlucHV0IFRoZSBQdW55Y29kZWQgZG9tYWluIG5hbWUgb3IgZW1haWwgYWRkcmVzcyB0b1xuXHQgKiBjb252ZXJ0IHRvIFVuaWNvZGUuXG5cdCAqIEByZXR1cm5zIHtTdHJpbmd9IFRoZSBVbmljb2RlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiBQdW55Y29kZVxuXHQgKiBzdHJpbmcuXG5cdCAqL1xuXHRmdW5jdGlvbiB0b1VuaWNvZGUoaW5wdXQpIHtcblx0XHRyZXR1cm4gbWFwRG9tYWluKGlucHV0LCBmdW5jdGlvbihzdHJpbmcpIHtcblx0XHRcdHJldHVybiByZWdleFB1bnljb2RlLnRlc3Qoc3RyaW5nKVxuXHRcdFx0XHQ/IGRlY29kZShzdHJpbmcuc2xpY2UoNCkudG9Mb3dlckNhc2UoKSlcblx0XHRcdFx0OiBzdHJpbmc7XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogQ29udmVydHMgYSBVbmljb2RlIHN0cmluZyByZXByZXNlbnRpbmcgYSBkb21haW4gbmFtZSBvciBhbiBlbWFpbCBhZGRyZXNzIHRvXG5cdCAqIFB1bnljb2RlLiBPbmx5IHRoZSBub24tQVNDSUkgcGFydHMgb2YgdGhlIGRvbWFpbiBuYW1lIHdpbGwgYmUgY29udmVydGVkLFxuXHQgKiBpLmUuIGl0IGRvZXNuJ3QgbWF0dGVyIGlmIHlvdSBjYWxsIGl0IHdpdGggYSBkb21haW4gdGhhdCdzIGFscmVhZHkgaW5cblx0ICogQVNDSUkuXG5cdCAqIEBtZW1iZXJPZiBwdW55Y29kZVxuXHQgKiBAcGFyYW0ge1N0cmluZ30gaW5wdXQgVGhlIGRvbWFpbiBuYW1lIG9yIGVtYWlsIGFkZHJlc3MgdG8gY29udmVydCwgYXMgYVxuXHQgKiBVbmljb2RlIHN0cmluZy5cblx0ICogQHJldHVybnMge1N0cmluZ30gVGhlIFB1bnljb2RlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiBkb21haW4gbmFtZSBvclxuXHQgKiBlbWFpbCBhZGRyZXNzLlxuXHQgKi9cblx0ZnVuY3Rpb24gdG9BU0NJSShpbnB1dCkge1xuXHRcdHJldHVybiBtYXBEb21haW4oaW5wdXQsIGZ1bmN0aW9uKHN0cmluZykge1xuXHRcdFx0cmV0dXJuIHJlZ2V4Tm9uQVNDSUkudGVzdChzdHJpbmcpXG5cdFx0XHRcdD8gJ3huLS0nICsgZW5jb2RlKHN0cmluZylcblx0XHRcdFx0OiBzdHJpbmc7XG5cdFx0fSk7XG5cdH1cblxuXHQvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuXHQvKiogRGVmaW5lIHRoZSBwdWJsaWMgQVBJICovXG5cdHB1bnljb2RlID0ge1xuXHRcdC8qKlxuXHRcdCAqIEEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgY3VycmVudCBQdW55Y29kZS5qcyB2ZXJzaW9uIG51bWJlci5cblx0XHQgKiBAbWVtYmVyT2YgcHVueWNvZGVcblx0XHQgKiBAdHlwZSBTdHJpbmdcblx0XHQgKi9cblx0XHQndmVyc2lvbic6ICcxLjQuMScsXG5cdFx0LyoqXG5cdFx0ICogQW4gb2JqZWN0IG9mIG1ldGhvZHMgdG8gY29udmVydCBmcm9tIEphdmFTY3JpcHQncyBpbnRlcm5hbCBjaGFyYWN0ZXJcblx0XHQgKiByZXByZXNlbnRhdGlvbiAoVUNTLTIpIHRvIFVuaWNvZGUgY29kZSBwb2ludHMsIGFuZCBiYWNrLlxuXHRcdCAqIEBzZWUgPGh0dHBzOi8vbWF0aGlhc2J5bmVucy5iZS9ub3Rlcy9qYXZhc2NyaXB0LWVuY29kaW5nPlxuXHRcdCAqIEBtZW1iZXJPZiBwdW55Y29kZVxuXHRcdCAqIEB0eXBlIE9iamVjdFxuXHRcdCAqL1xuXHRcdCd1Y3MyJzoge1xuXHRcdFx0J2RlY29kZSc6IHVjczJkZWNvZGUsXG5cdFx0XHQnZW5jb2RlJzogdWNzMmVuY29kZVxuXHRcdH0sXG5cdFx0J2RlY29kZSc6IGRlY29kZSxcblx0XHQnZW5jb2RlJzogZW5jb2RlLFxuXHRcdCd0b0FTQ0lJJzogdG9BU0NJSSxcblx0XHQndG9Vbmljb2RlJzogdG9Vbmljb2RlXG5cdH07XG5cblx0LyoqIEV4cG9zZSBgcHVueWNvZGVgICovXG5cdC8vIFNvbWUgQU1EIGJ1aWxkIG9wdGltaXplcnMsIGxpa2Ugci5qcywgY2hlY2sgZm9yIHNwZWNpZmljIGNvbmRpdGlvbiBwYXR0ZXJuc1xuXHQvLyBsaWtlIHRoZSBmb2xsb3dpbmc6XG5cdGlmIChcblx0XHR0eXBlb2YgZGVmaW5lID09ICdmdW5jdGlvbicgJiZcblx0XHR0eXBlb2YgZGVmaW5lLmFtZCA9PSAnb2JqZWN0JyAmJlxuXHRcdGRlZmluZS5hbWRcblx0KSB7XG5cdFx0ZGVmaW5lKCdwdW55Y29kZScsIGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIHB1bnljb2RlO1xuXHRcdH0pO1xuXHR9IGVsc2UgaWYgKGZyZWVFeHBvcnRzICYmIGZyZWVNb2R1bGUpIHtcblx0XHRpZiAobW9kdWxlLmV4cG9ydHMgPT0gZnJlZUV4cG9ydHMpIHtcblx0XHRcdC8vIGluIE5vZGUuanMsIGlvLmpzLCBvciBSaW5nb0pTIHYwLjguMCtcblx0XHRcdGZyZWVNb2R1bGUuZXhwb3J0cyA9IHB1bnljb2RlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBpbiBOYXJ3aGFsIG9yIFJpbmdvSlMgdjAuNy4wLVxuXHRcdFx0Zm9yIChrZXkgaW4gcHVueWNvZGUpIHtcblx0XHRcdFx0cHVueWNvZGUuaGFzT3duUHJvcGVydHkoa2V5KSAmJiAoZnJlZUV4cG9ydHNba2V5XSA9IHB1bnljb2RlW2tleV0pO1xuXHRcdFx0fVxuXHRcdH1cblx0fSBlbHNlIHtcblx0XHQvLyBpbiBSaGlubyBvciBhIHdlYiBicm93c2VyXG5cdFx0cm9vdC5wdW55Y29kZSA9IHB1bnljb2RlO1xuXHR9XG5cbn0odGhpcykpO1xuIiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbid1c2Ugc3RyaWN0JztcblxuLy8gSWYgb2JqLmhhc093blByb3BlcnR5IGhhcyBiZWVuIG92ZXJyaWRkZW4sIHRoZW4gY2FsbGluZ1xuLy8gb2JqLmhhc093blByb3BlcnR5KHByb3ApIHdpbGwgYnJlYWsuXG4vLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9qb3llbnQvbm9kZS9pc3N1ZXMvMTcwN1xuZnVuY3Rpb24gaGFzT3duUHJvcGVydHkob2JqLCBwcm9wKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihxcywgc2VwLCBlcSwgb3B0aW9ucykge1xuICBzZXAgPSBzZXAgfHwgJyYnO1xuICBlcSA9IGVxIHx8ICc9JztcbiAgdmFyIG9iaiA9IHt9O1xuXG4gIGlmICh0eXBlb2YgcXMgIT09ICdzdHJpbmcnIHx8IHFzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBvYmo7XG4gIH1cblxuICB2YXIgcmVnZXhwID0gL1xcKy9nO1xuICBxcyA9IHFzLnNwbGl0KHNlcCk7XG5cbiAgdmFyIG1heEtleXMgPSAxMDAwO1xuICBpZiAob3B0aW9ucyAmJiB0eXBlb2Ygb3B0aW9ucy5tYXhLZXlzID09PSAnbnVtYmVyJykge1xuICAgIG1heEtleXMgPSBvcHRpb25zLm1heEtleXM7XG4gIH1cblxuICB2YXIgbGVuID0gcXMubGVuZ3RoO1xuICAvLyBtYXhLZXlzIDw9IDAgbWVhbnMgdGhhdCB3ZSBzaG91bGQgbm90IGxpbWl0IGtleXMgY291bnRcbiAgaWYgKG1heEtleXMgPiAwICYmIGxlbiA+IG1heEtleXMpIHtcbiAgICBsZW4gPSBtYXhLZXlzO1xuICB9XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSkge1xuICAgIHZhciB4ID0gcXNbaV0ucmVwbGFjZShyZWdleHAsICclMjAnKSxcbiAgICAgICAgaWR4ID0geC5pbmRleE9mKGVxKSxcbiAgICAgICAga3N0ciwgdnN0ciwgaywgdjtcblxuICAgIGlmIChpZHggPj0gMCkge1xuICAgICAga3N0ciA9IHguc3Vic3RyKDAsIGlkeCk7XG4gICAgICB2c3RyID0geC5zdWJzdHIoaWR4ICsgMSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGtzdHIgPSB4O1xuICAgICAgdnN0ciA9ICcnO1xuICAgIH1cblxuICAgIGsgPSBkZWNvZGVVUklDb21wb25lbnQoa3N0cik7XG4gICAgdiA9IGRlY29kZVVSSUNvbXBvbmVudCh2c3RyKTtcblxuICAgIGlmICghaGFzT3duUHJvcGVydHkob2JqLCBrKSkge1xuICAgICAgb2JqW2tdID0gdjtcbiAgICB9IGVsc2UgaWYgKGlzQXJyYXkob2JqW2tdKSkge1xuICAgICAgb2JqW2tdLnB1c2godik7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9ialtrXSA9IFtvYmpba10sIHZdO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBvYmo7XG59O1xuXG52YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24gKHhzKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoeHMpID09PSAnW29iamVjdCBBcnJheV0nO1xufTtcbiIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBzdHJpbmdpZnlQcmltaXRpdmUgPSBmdW5jdGlvbih2KSB7XG4gIHN3aXRjaCAodHlwZW9mIHYpIHtcbiAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgcmV0dXJuIHY7XG5cbiAgICBjYXNlICdib29sZWFuJzpcbiAgICAgIHJldHVybiB2ID8gJ3RydWUnIDogJ2ZhbHNlJztcblxuICAgIGNhc2UgJ251bWJlcic6XG4gICAgICByZXR1cm4gaXNGaW5pdGUodikgPyB2IDogJyc7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuICcnO1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKG9iaiwgc2VwLCBlcSwgbmFtZSkge1xuICBzZXAgPSBzZXAgfHwgJyYnO1xuICBlcSA9IGVxIHx8ICc9JztcbiAgaWYgKG9iaiA9PT0gbnVsbCkge1xuICAgIG9iaiA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGlmICh0eXBlb2Ygb2JqID09PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBtYXAob2JqZWN0S2V5cyhvYmopLCBmdW5jdGlvbihrKSB7XG4gICAgICB2YXIga3MgPSBlbmNvZGVVUklDb21wb25lbnQoc3RyaW5naWZ5UHJpbWl0aXZlKGspKSArIGVxO1xuICAgICAgaWYgKGlzQXJyYXkob2JqW2tdKSkge1xuICAgICAgICByZXR1cm4gbWFwKG9ialtrXSwgZnVuY3Rpb24odikge1xuICAgICAgICAgIHJldHVybiBrcyArIGVuY29kZVVSSUNvbXBvbmVudChzdHJpbmdpZnlQcmltaXRpdmUodikpO1xuICAgICAgICB9KS5qb2luKHNlcCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4ga3MgKyBlbmNvZGVVUklDb21wb25lbnQoc3RyaW5naWZ5UHJpbWl0aXZlKG9ialtrXSkpO1xuICAgICAgfVxuICAgIH0pLmpvaW4oc2VwKTtcblxuICB9XG5cbiAgaWYgKCFuYW1lKSByZXR1cm4gJyc7XG4gIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQoc3RyaW5naWZ5UHJpbWl0aXZlKG5hbWUpKSArIGVxICtcbiAgICAgICAgIGVuY29kZVVSSUNvbXBvbmVudChzdHJpbmdpZnlQcmltaXRpdmUob2JqKSk7XG59O1xuXG52YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24gKHhzKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoeHMpID09PSAnW29iamVjdCBBcnJheV0nO1xufTtcblxuZnVuY3Rpb24gbWFwICh4cywgZikge1xuICBpZiAoeHMubWFwKSByZXR1cm4geHMubWFwKGYpO1xuICB2YXIgcmVzID0gW107XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgeHMubGVuZ3RoOyBpKyspIHtcbiAgICByZXMucHVzaChmKHhzW2ldLCBpKSk7XG4gIH1cbiAgcmV0dXJuIHJlcztcbn1cblxudmFyIG9iamVjdEtleXMgPSBPYmplY3Qua2V5cyB8fCBmdW5jdGlvbiAob2JqKSB7XG4gIHZhciByZXMgPSBbXTtcbiAgZm9yICh2YXIga2V5IGluIG9iaikge1xuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSByZXMucHVzaChrZXkpO1xuICB9XG4gIHJldHVybiByZXM7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLmRlY29kZSA9IGV4cG9ydHMucGFyc2UgPSByZXF1aXJlKCcuL2RlY29kZScpO1xuZXhwb3J0cy5lbmNvZGUgPSBleHBvcnRzLnN0cmluZ2lmeSA9IHJlcXVpcmUoJy4vZW5jb2RlJyk7XG4iLCIvLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgJ0NvcmVBbmRyb2lkJzoge1xuICAgICAgICAnYmFja0hpc3RvcnknOiBmdW5jdGlvbiAoc3VjY2VzcywgZmFpbCwgc2VydmljZSwgYWN0aW9uLCBhcmdzKSB7XG4gICAgICAgICAgICB3aW5kb3cuaGlzdG9yeS5nbygtMSk7XG4gICAgICAgICAgICBzdWNjZXNzICYmIHN1Y2Nlc3MoKTtcbiAgICAgICAgfVxuICAgIH1cbn07XG4iLCIvLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIEJhc2VkIGluIHBhcnQgb24gY29kZSBmcm9tIEFwYWNoZSBDb3Jkb3ZhIChodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2NvcmRvdmEtanMpXG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJ3V0aWxzJyk7XG5cbnZhciBtb2R1bGVFeHBvcnRzID0gbW9kdWxlLmV4cG9ydHM7XG5cbnZhciB0eXBlTWFwID0ge1xuICAgICdBJzogJ0FycmF5JyxcbiAgICAnRCc6ICdEYXRlJyxcbiAgICAnTic6ICdOdW1iZXInLFxuICAgICdTJzogJ1N0cmluZycsXG4gICAgJ0YnOiAnRnVuY3Rpb24nLFxuICAgICdPJzogJ09iamVjdCdcbn07XG5cbmZ1bmN0aW9uIGV4dHJhY3RQYXJhbU5hbWUoY2FsbGVlLCBhcmdJbmRleCkge1xuICAgIHJldHVybiAoLy4qP1xcKCguKj8pXFwpLykuZXhlYyhjYWxsZWUpWzFdLnNwbGl0KCcsICcpW2FyZ0luZGV4XTtcbn1cblxuZnVuY3Rpb24gY2hlY2tBcmdzKHNwZWMsIGZ1bmN0aW9uTmFtZSwgYXJncywgb3B0X2NhbGxlZSkge1xuICAgIGlmICghbW9kdWxlRXhwb3J0cy5lbmFibGVDaGVja3MpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgZXJyTXNnID0gbnVsbDtcbiAgICB2YXIgdHlwZU5hbWU7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzcGVjLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIHZhciBjID0gc3BlYy5jaGFyQXQoaSksXG4gICAgICAgICAgICBjVXBwZXIgPSBjLnRvVXBwZXJDYXNlKCksXG4gICAgICAgICAgICBhcmcgPSBhcmdzW2ldO1xuICAgICAgICAvLyBBc3Rlcml4IG1lYW5zIGFsbG93IGFueXRoaW5nLlxuICAgICAgICBpZiAoYyA9PSAnKicpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHR5cGVOYW1lID0gdXRpbHMudHlwZU5hbWUoYXJnKTtcbiAgICAgICAgaWYgKChhcmcgPT09IG51bGwgfHwgYXJnID09PSB1bmRlZmluZWQpICYmIGMgPT0gY1VwcGVyKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZU5hbWUgIT0gdHlwZU1hcFtjVXBwZXJdKSB7XG4gICAgICAgICAgICBlcnJNc2cgPSAnRXhwZWN0ZWQgJyArIHR5cGVNYXBbY1VwcGVyXTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChlcnJNc2cpIHtcbiAgICAgICAgZXJyTXNnICs9ICcsIGJ1dCBnb3QgJyArIHR5cGVOYW1lICsgJy4nO1xuICAgICAgICBlcnJNc2cgPSAnV3JvbmcgdHlwZSBmb3IgcGFyYW1ldGVyIFwiJyArIGV4dHJhY3RQYXJhbU5hbWUob3B0X2NhbGxlZSB8fCBhcmdzLmNhbGxlZSwgaSkgKyAnXCIgb2YgJyArIGZ1bmN0aW9uTmFtZSArICc6ICcgKyBlcnJNc2c7XG4gICAgICAgIHRocm93IFR5cGVFcnJvcihlcnJNc2cpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZ2V0VmFsdWUodmFsdWUsIGRlZmF1bHRWYWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkID8gZGVmYXVsdFZhbHVlIDogdmFsdWU7XG59XG5cbm1vZHVsZUV4cG9ydHMuY2hlY2tBcmdzID0gY2hlY2tBcmdzO1xubW9kdWxlRXhwb3J0cy5nZXRWYWx1ZSA9IGdldFZhbHVlO1xubW9kdWxlRXhwb3J0cy5lbmFibGVDaGVja3MgPSB0cnVlO1xuXG4iLCIvLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAobWVzc2FnZXMpIHtcbiAgICByZXR1cm4gIHtcbiAgICAgICAgQ2FtZXJhOiB7XG4gICAgICAgICAgICB0YWtlUGljdHVyZTogZnVuY3Rpb24gKHN1Y2Nlc3MsIGZhaWwsIGFyZ3MpIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlcy5jYWxsKCd0YWtlUGljdHVyZScsIGFyZ3MpLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoYXJncyAmJiBhcmdzWzFdID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiB0eXBlIGlzIERBVEFfVVJMICovXG4gICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzKHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAncmVzdWx0JyBzaG91bGQgYmUge2RhdGE6IDxBcnJheUJ1ZmZlcj4sIHR5cGU6IDxtaW1lVHlwZT59LCBmcm9tIHdoaWNoIHdlJ2xsIGNyZWF0ZSBhIGJsb2JcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBibG9iID0gbmV3IEJsb2IoW3Jlc3VsdC5kYXRhXSwgeyB0eXBlOiByZXN1bHQudHlwZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MoVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgZmFpbChlcnJvcik7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xufTtcbiIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKG1lc3NhZ2VzKSB7XG4gICAgbWVzc2FnZXMucmVnaXN0ZXIoJ2NvcmRvdmEtdmVyc2lvbicsIGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICBpZiAod2luZG93LmNvcmRvdmEpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHdpbmRvdy5jb3Jkb3ZhLnZlcnNpb24pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgJ1lvdSBtdXN0IGhhdmUgY29yZG92YS5qcyBpbmNsdWRlZCBpbiB5b3VyIHByb2plY3RzLCB0byBiZSBhYmxlIHRvIGdldCBjb3Jkb3ZhIHZlcnNpb24nKTtcbiAgICAgICAgfVxuICAgIH0pO1xufTtcbiIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChtZXNzYWdlcykge1xuICAgIHZhciBpc1dlYmtpdCA9IHdpbmRvdy53ZWJraXRSZXF1ZXN0RmlsZVN5c3RlbSAmJiB3aW5kb3cud2Via2l0UmVzb2x2ZUxvY2FsRmlsZVN5c3RlbVVSTDtcblxuICAgIHJldHVybiBpc1dlYmtpdCA/IHJlcXVpcmUoJy4vYXBwLWhvc3Qtd2Via2l0LWhhbmRsZXJzJykgOiByZXF1aXJlKCcuL2FwcC1ob3N0LW5vbi13ZWJraXQtaGFuZGxlcnMnKTtcbn07XG4iLCIvLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIEJhc2VkIG9uIEFwYWNoZSBDb3Jkb3ZhIGdlb2xvY2F0aW9uIHBsdWdpbidzIG5hdmlnYXRvci5nZW9sb2NhdGlvbiBpbXBsZW1lbnRhdGlvbi5cbi8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2NvcmRvdmEtcGx1Z2luLWdlb2xvY2F0aW9uL2Jsb2IvbWFzdGVyL3d3dy9nZW9sb2NhdGlvbi5qc1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCd1dGlscycpLFxuICAgIFBvc2l0aW9uRXJyb3IgPSByZXF1aXJlKCcuL1Bvc2l0aW9uRXJyb3InKSxcbiAgICBQb3NpdGlvbiA9IHJlcXVpcmUoJy4vUG9zaXRpb24nKTtcblxudmFyIHRpbWVycyA9IHt9OyAgIC8vIGxpc3Qgb2YgdGltZXJzIGluIHVzZVxuXG4vLyBSZXR1cm5zIGRlZmF1bHQgcGFyYW1zLCBvdmVycmlkZXMgaWYgcHJvdmlkZWQgd2l0aCB2YWx1ZXNcbmZ1bmN0aW9uIHBhcnNlUGFyYW1ldGVycyhvcHRpb25zKSB7XG4gICAgdmFyIG9wdCA9IHtcbiAgICAgICAgbWF4aW11bUFnZTogMCxcbiAgICAgICAgZW5hYmxlSGlnaEFjY3VyYWN5OiBmYWxzZSxcbiAgICAgICAgdGltZW91dDogSW5maW5pdHlcbiAgICB9O1xuXG4gICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMubWF4aW11bUFnZSAhPT0gdW5kZWZpbmVkICYmICFpc05hTihvcHRpb25zLm1heGltdW1BZ2UpICYmIG9wdGlvbnMubWF4aW11bUFnZSA+IDApIHtcbiAgICAgICAgICAgIG9wdC5tYXhpbXVtQWdlID0gb3B0aW9ucy5tYXhpbXVtQWdlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLmVuYWJsZUhpZ2hBY2N1cmFjeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBvcHQuZW5hYmxlSGlnaEFjY3VyYWN5ID0gb3B0aW9ucy5lbmFibGVIaWdoQWNjdXJhY3k7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMudGltZW91dCAhPT0gdW5kZWZpbmVkICYmICFpc05hTihvcHRpb25zLnRpbWVvdXQpKSB7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy50aW1lb3V0IDwgMCkge1xuICAgICAgICAgICAgICAgIG9wdC50aW1lb3V0ID0gMDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgb3B0LnRpbWVvdXQgPSBvcHRpb25zLnRpbWVvdXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gb3B0O1xufVxuXG4vLyBSZXR1cm5zIGEgdGltZW91dCBmYWlsdXJlLCBjbG9zZWQgb3ZlciBhIHNwZWNpZmllZCB0aW1lb3V0IHZhbHVlIGFuZCBlcnJvciBjYWxsYmFjay5cbmZ1bmN0aW9uIGNyZWF0ZVRpbWVvdXQoZXJyb3JDYWxsYmFjaywgdGltZW91dCkge1xuICAgIHZhciB0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0KTtcbiAgICAgICAgdCA9IG51bGw7XG4gICAgICAgIGVycm9yQ2FsbGJhY2soe1xuICAgICAgICAgICAgY29kZTogUG9zaXRpb25FcnJvci5USU1FT1VULFxuICAgICAgICAgICAgbWVzc2FnZTogJ1Bvc2l0aW9uIHJldHJpZXZhbCB0aW1lZCBvdXQuJ1xuICAgICAgICB9KTtcbiAgICB9LCB0aW1lb3V0KTtcbiAgICByZXR1cm4gdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAobWVzc2FnZXMsIGV4ZWMpIHtcbiAgICB2YXIgZ2VvbG9jYXRpb24gPSB7XG4gICAgICAgIGxhc3RQb3NpdGlvbjogbnVsbCwgLy8gcmVmZXJlbmNlIHRvIGxhc3Qga25vd24gKGNhY2hlZCkgcG9zaXRpb24gcmV0dXJuZWRcblxuICAgICAgICAvKipcbiAgICAgICAgICogQXN5bmNocm9ub3VzbHkgYWNxdWlyZXMgdGhlIGN1cnJlbnQgcG9zaXRpb24uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHN1Y2Nlc3NDYWxsYmFjayAgICBUaGUgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIHRoZSBwb3NpdGlvbiBkYXRhIGlzIGF2YWlsYWJsZVxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBlcnJvckNhbGxiYWNrICAgICAgVGhlIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBnZXR0aW5nIHRoZSBoZWFkaW5nIHBvc2l0aW9uLiAoT1BUSU9OQUwpXG4gICAgICAgICAqIEBwYXJhbSB7UG9zaXRpb25PcHRpb25zfSBvcHRpb25zICAgICBUaGUgb3B0aW9ucyBmb3IgZ2V0dGluZyB0aGUgcG9zaXRpb24gZGF0YS4gKE9QVElPTkFMKVxuICAgICAgICAgKi9cbiAgICAgICAgZ2V0Q3VycmVudFBvc2l0aW9uOiBmdW5jdGlvbiAoc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrLCBvcHRpb25zKSB7XG4gICAgICAgICAgICBvcHRpb25zID0gcGFyc2VQYXJhbWV0ZXJzKG9wdGlvbnMpO1xuXG4gICAgICAgICAgICAvLyBUaW1lciB2YXIgdGhhdCB3aWxsIGZpcmUgYW4gZXJyb3IgY2FsbGJhY2sgaWYgbm8gcG9zaXRpb24gaXMgcmV0cmlldmVkIGZyb20gbmF0aXZlXG4gICAgICAgICAgICAvLyBiZWZvcmUgdGhlIFwidGltZW91dFwiIHBhcmFtIHByb3ZpZGVkIGV4cGlyZXNcbiAgICAgICAgICAgIHZhciB0aW1lb3V0VGltZXIgPSB7dGltZXI6IG51bGx9O1xuXG4gICAgICAgICAgICB2YXIgd2luID0gZnVuY3Rpb24gKHApIHtcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dFRpbWVyLnRpbWVyKTtcbiAgICAgICAgICAgICAgICBpZiAoISh0aW1lb3V0VGltZXIudGltZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRpbWVvdXQgYWxyZWFkeSBoYXBwZW5lZCwgb3IgbmF0aXZlIGZpcmVkIGVycm9yIGNhbGxiYWNrIGZvclxuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGdlbyByZXF1ZXN0LlxuICAgICAgICAgICAgICAgICAgICAvLyBEb24ndCBjb250aW51ZSB3aXRoIHN1Y2Nlc3MgY2FsbGJhY2suXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIHBvcyA9IG5ldyBQb3NpdGlvbihcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGF0aXR1ZGU6IHAubGF0aXR1ZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBsb25naXR1ZGU6IHAubG9uZ2l0dWRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgYWx0aXR1ZGU6IHAuYWx0aXR1ZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBhY2N1cmFjeTogcC5hY2N1cmFjeSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRpbmc6IHAuaGVhZGluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZlbG9jaXR5OiBwLnZlbG9jaXR5LFxuICAgICAgICAgICAgICAgICAgICAgICAgYWx0aXR1ZGVBY2N1cmFjeTogcC5hbHRpdHVkZUFjY3VyYWN5XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIChwLnRpbWVzdGFtcCA9PT0gdW5kZWZpbmVkID8gbmV3IERhdGUoKSA6ICgocC50aW1lc3RhbXAgaW5zdGFuY2VvZiBEYXRlKSA/IHAudGltZXN0YW1wIDogbmV3IERhdGUocC50aW1lc3RhbXApKSlcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGdlb2xvY2F0aW9uLmxhc3RQb3NpdGlvbiA9IHBvcztcbiAgICAgICAgICAgICAgICBzdWNjZXNzQ2FsbGJhY2socG9zKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB2YXIgZmFpbCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRUaW1lci50aW1lcik7XG4gICAgICAgICAgICAgICAgdGltZW91dFRpbWVyLnRpbWVyID0gbnVsbDtcbiAgICAgICAgICAgICAgICB2YXIgZXJyID0gbmV3IFBvc2l0aW9uRXJyb3IoZS5jb2RlLCBlLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIGlmIChlcnJvckNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgICAgIGVycm9yQ2FsbGJhY2soZXJyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAvLyBDaGVjayBvdXIgY2FjaGVkIHBvc2l0aW9uLCBpZiBpdHMgdGltZXN0YW1wIGRpZmZlcmVuY2Ugd2l0aCBjdXJyZW50IHRpbWUgaXMgbGVzcyB0aGFuIHRoZSBtYXhpbXVtQWdlLCB0aGVuIGp1c3RcbiAgICAgICAgICAgIC8vIGZpcmUgdGhlIHN1Y2Nlc3MgY2FsbGJhY2sgd2l0aCB0aGUgY2FjaGVkIHBvc2l0aW9uLlxuICAgICAgICAgICAgaWYgKGdlb2xvY2F0aW9uLmxhc3RQb3NpdGlvbiAmJiBvcHRpb25zLm1heGltdW1BZ2UgJiYgKCgobmV3IERhdGUoKSkuZ2V0VGltZSgpIC0gZ2VvbG9jYXRpb24ubGFzdFBvc2l0aW9uLnRpbWVzdGFtcC5nZXRUaW1lKCkpIDw9IG9wdGlvbnMubWF4aW11bUFnZSkpIHtcbiAgICAgICAgICAgICAgICBzdWNjZXNzQ2FsbGJhY2soZ2VvbG9jYXRpb24ubGFzdFBvc2l0aW9uKTtcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgY2FjaGVkIHBvc2l0aW9uIGNoZWNrIGZhaWxlZCBhbmQgdGhlIHRpbWVvdXQgd2FzIHNldCB0byAwLCBlcnJvciBvdXQgd2l0aCBhIFRJTUVPVVQgZXJyb3Igb2JqZWN0LlxuICAgICAgICAgICAgfSBlbHNlIGlmIChvcHRpb25zLnRpbWVvdXQgPT09IDApIHtcbiAgICAgICAgICAgICAgICBmYWlsKHtcbiAgICAgICAgICAgICAgICAgICAgY29kZTogUG9zaXRpb25FcnJvci5USU1FT1VULFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAndGltZW91dCB2YWx1ZSBpbiBQb3NpdGlvbk9wdGlvbnMgc2V0IHRvIDAgYW5kIG5vIGNhY2hlZCBQb3NpdGlvbiBvYmplY3QgYXZhaWxhYmxlLCBvciBjYWNoZWQgUG9zaXRpb24gb2JqZWN0XFwncyBhZ2UgZXhjZWVkcyBwcm92aWRlZCBQb3NpdGlvbk9wdGlvbnMubWF4aW11bUFnZSBwYXJhbWV0ZXIuJ1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSB3ZSBoYXZlIHRvIGNhbGwgaW50byBuYXRpdmUgdG8gcmV0cmlldmUgYSBwb3NpdGlvbi5cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMudGltZW91dCAhPT0gSW5maW5pdHkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHRpbWVvdXQgdmFsdWUgd2FzIG5vdCBzZXQgdG8gSW5maW5pdHkgKGRlZmF1bHQpLCB0aGVuXG4gICAgICAgICAgICAgICAgICAgIC8vIHNldCB1cCBhIHRpbWVvdXQgZnVuY3Rpb24gdGhhdCB3aWxsIGZpcmUgdGhlIGVycm9yIGNhbGxiYWNrXG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIG5vIHN1Y2Nlc3NmdWwgcG9zaXRpb24gd2FzIHJldHJpZXZlZCBiZWZvcmUgdGltZW91dCBleHBpcmVkLlxuICAgICAgICAgICAgICAgICAgICB0aW1lb3V0VGltZXIudGltZXIgPSBjcmVhdGVUaW1lb3V0KGZhaWwsIG9wdGlvbnMudGltZW91dCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBoZXJlIHNvIHRoZSBjaGVjayBpbiB0aGUgd2luIGZ1bmN0aW9uIGRvZXNuJ3QgbWVzcyBzdHVmZiB1cFxuICAgICAgICAgICAgICAgICAgICAvLyBtYXkgc2VlbSB3ZWlyZCBidXQgdGhpcyBndWFyYW50ZWVzIHRpbWVvdXRUaW1lciBpc1xuICAgICAgICAgICAgICAgICAgICAvLyBhbHdheXMgdHJ1dGh5IGJlZm9yZSB3ZSBjYWxsIGludG8gbmF0aXZlXG4gICAgICAgICAgICAgICAgICAgIHRpbWVvdXRUaW1lci50aW1lciA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGV4ZWMod2luLCBmYWlsLCAnR2VvbG9jYXRpb24nLCAnZ2V0TG9jYXRpb24nLCBbb3B0aW9ucy5lbmFibGVIaWdoQWNjdXJhY3ksIG9wdGlvbnMubWF4aW11bUFnZV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRpbWVvdXRUaW1lcjtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFzeW5jaHJvbm91c2x5IHdhdGNoZXMgdGhlIGdlb2xvY2F0aW9uIGZvciBjaGFuZ2VzIHRvIGdlb2xvY2F0aW9uLiAgV2hlbiBhIGNoYW5nZSBvY2N1cnMsXG4gICAgICAgICAqIHRoZSBzdWNjZXNzQ2FsbGJhY2sgaXMgY2FsbGVkIHdpdGggdGhlIG5ldyBsb2NhdGlvbi5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gc3VjY2Vzc0NhbGxiYWNrICAgIFRoZSBmdW5jdGlvbiB0byBjYWxsIGVhY2ggdGltZSB0aGUgbG9jYXRpb24gZGF0YSBpcyBhdmFpbGFibGVcbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZXJyb3JDYWxsYmFjayAgICAgIFRoZSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlcmUgaXMgYW4gZXJyb3IgZ2V0dGluZyB0aGUgbG9jYXRpb24gZGF0YS4gKE9QVElPTkFMKVxuICAgICAgICAgKiBAcGFyYW0ge1Bvc2l0aW9uT3B0aW9uc30gb3B0aW9ucyAgICAgVGhlIG9wdGlvbnMgZm9yIGdldHRpbmcgdGhlIGxvY2F0aW9uIGRhdGEgc3VjaCBhcyBmcmVxdWVuY3kuIChPUFRJT05BTClcbiAgICAgICAgICogQHJldHVybiBTdHJpbmcgICAgICAgICAgICAgICAgICAgICAgIFRoZSB3YXRjaCBpZCB0aGF0IG11c3QgYmUgcGFzc2VkIHRvICNjbGVhcldhdGNoIHRvIHN0b3Agd2F0Y2hpbmcuXG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaFBvc2l0aW9uOiBmdW5jdGlvbiAoc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrLCBvcHRpb25zKSB7XG4gICAgICAgICAgICBvcHRpb25zID0gcGFyc2VQYXJhbWV0ZXJzKG9wdGlvbnMpO1xuXG4gICAgICAgICAgICB2YXIgaWQgPSB1dGlscy5jcmVhdGVVVUlEKCk7XG5cbiAgICAgICAgICAgIC8vIFRlbGwgZGV2aWNlIHRvIGdldCBhIHBvc2l0aW9uIEFTQVAsIGFuZCBhbHNvIHJldHJpZXZlIGEgcmVmZXJlbmNlIHRvIHRoZSB0aW1lb3V0IHRpbWVyIGdlbmVyYXRlZCBpbiBnZXRDdXJyZW50UG9zaXRpb25cbiAgICAgICAgICAgIHRpbWVyc1tpZF0gPSBnZW9sb2NhdGlvbi5nZXRDdXJyZW50UG9zaXRpb24oc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrLCBvcHRpb25zKTtcblxuICAgICAgICAgICAgdmFyIGZhaWwgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lcnNbaWRdLnRpbWVyKTtcbiAgICAgICAgICAgICAgICB2YXIgZXJyID0gbmV3IFBvc2l0aW9uRXJyb3IoZS5jb2RlLCBlLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIGlmIChlcnJvckNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgICAgIGVycm9yQ2FsbGJhY2soZXJyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICB2YXIgd2luID0gZnVuY3Rpb24gKHApIHtcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZXJzW2lkXS50aW1lcik7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMudGltZW91dCAhPT0gSW5maW5pdHkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGltZXJzW2lkXS50aW1lciA9IGNyZWF0ZVRpbWVvdXQoZmFpbCwgb3B0aW9ucy50aW1lb3V0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIHBvcyA9IG5ldyBQb3NpdGlvbihcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGF0aXR1ZGU6IHAubGF0aXR1ZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBsb25naXR1ZGU6IHAubG9uZ2l0dWRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgYWx0aXR1ZGU6IHAuYWx0aXR1ZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBhY2N1cmFjeTogcC5hY2N1cmFjeSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRpbmc6IHAuaGVhZGluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZlbG9jaXR5OiBwLnZlbG9jaXR5LFxuICAgICAgICAgICAgICAgICAgICAgICAgYWx0aXR1ZGVBY2N1cmFjeTogcC5hbHRpdHVkZUFjY3VyYWN5XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIChwLnRpbWVzdGFtcCA9PT0gdW5kZWZpbmVkID8gbmV3IERhdGUoKSA6ICgocC50aW1lc3RhbXAgaW5zdGFuY2VvZiBEYXRlKSA/IHAudGltZXN0YW1wIDogbmV3IERhdGUocC50aW1lc3RhbXApKSlcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGdlb2xvY2F0aW9uLmxhc3RQb3NpdGlvbiA9IHBvcztcbiAgICAgICAgICAgICAgICBzdWNjZXNzQ2FsbGJhY2socG9zKTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGV4ZWMod2luLCBmYWlsLCAnR2VvbG9jYXRpb24nLCAnYWRkV2F0Y2gnLCBbaWQsIG9wdGlvbnMuZW5hYmxlSGlnaEFjY3VyYWN5XSk7XG5cbiAgICAgICAgICAgIHJldHVybiBpZDtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENsZWFycyB0aGUgc3BlY2lmaWVkIGhlYWRpbmcgd2F0Y2guXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBpZCAgICAgICBUaGUgSUQgb2YgdGhlIHdhdGNoIHJldHVybmVkIGZyb20gI3dhdGNoUG9zaXRpb25cbiAgICAgICAgICovXG4gICAgICAgIGNsZWFyV2F0Y2g6IGZ1bmN0aW9uIChpZCkge1xuICAgICAgICAgICAgaWYgKGlkICYmIHRpbWVyc1tpZF0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lcnNbaWRdLnRpbWVyKTtcbiAgICAgICAgICAgICAgICB0aW1lcnNbaWRdLnRpbWVyID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgZXhlYyhudWxsLCBudWxsLCAnR2VvbG9jYXRpb24nLCAnY2xlYXJXYXRjaCcsIFtpZF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIGdldFBlcm1pc3Npb246IGZ1bmN0aW9uIChzdWNjZXNzLCBmYWlsLCBhcmdzKSB7XG4gICAgICAgICAgICBzdWNjZXNzKCk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgbmF2aWdhdG9yOiB7XG4gICAgICAgICAgICBnZW9sb2NhdGlvbjogZ2VvbG9jYXRpb25cbiAgICAgICAgfVxuICAgIH07XG59O1xuIiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vLyBCYXNlZCBpbiBwYXJ0IG9uIGNvZGUgZnJvbSBBcGFjaGUgUmlwcGxlLCBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2luY3ViYXRvci1yaXBwbGVcblxudmFyIFEgPSByZXF1aXJlKCdxJyksXG4gICAgdXRpbHMgPSByZXF1aXJlKCd1dGlscycpLFxuICAgIGNvbnN0YW50cyA9IHJlcXVpcmUoJ3NpbS1jb25zdGFudHMnKSxcbiAgICBldmVudCA9IHJlcXVpcmUoJ2V2ZW50JyksXG4gICAgREJfTkFNRSA9ICdyaXBwbGUnLFxuICAgIGNhY2hlLFxuICAgIHNlbGYsXG4gICAgb3BlbmRiO1xuXG4vLyBUT0RPOiBUaGlzIGNvdWxkIHVzZSBzb21lIHJlZmFjdG9yaW5nLi5cblxuZnVuY3Rpb24gc2F2ZVRvU3RvcmFnZSgpIHtcbiAgICBsb2NhbFN0b3JhZ2VbREJfTkFNRV0gPSBKU09OLnN0cmluZ2lmeShjYWNoZSk7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlQW5kU2V0UHJlZml4KHByZWZpeCkge1xuICAgIGlmIChwcmVmaXgpIHtcbiAgICAgICAgdXRpbHMudmFsaWRhdGVBcmd1bWVudFR5cGUocHJlZml4LCAnc3RyaW5nJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHByZWZpeCB8fCBjb25zdGFudHMuQ09NTU9OLlBSRUZJWDtcbn1cblxuZnVuY3Rpb24gY3JlYXRlS2V5KGtleSwgcHJlZml4KSB7XG4gICAgcmV0dXJuIHZhbGlkYXRlQW5kU2V0UHJlZml4KHByZWZpeCkgKyBrZXk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUl0ZW0oa2V5LCB2YWx1ZSwgcHJlZml4KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgaWQ6IGNyZWF0ZUtleShrZXksIHByZWZpeCksXG4gICAgICAgIGtleToga2V5LFxuICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgIHByZWZpeDogdmFsaWRhdGVBbmRTZXRQcmVmaXgocHJlZml4KVxuICAgIH07XG59XG5cbmZ1bmN0aW9uIHNhdmUoa2V5LCB2YWx1ZSwgcHJlZml4LCBjYWxsYmFjaykge1xuICAgIHZhciBpdGVtID0gY3JlYXRlSXRlbShrZXksIHZhbHVlLCBwcmVmaXgpO1xuICAgIGNhY2hlW2l0ZW0uaWRdID0gaXRlbTtcblxuICAgIGlmICghd2luZG93Lm9wZW5EYXRhYmFzZSkge1xuICAgICAgICBzYXZlVG9TdG9yYWdlKCk7XG4gICAgICAgIGlmIChjYWxsYmFjaykgeyBjYWxsYmFjaygpOyB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgb3BlbmRiLnRyYW5zYWN0aW9uKGZ1bmN0aW9uICh0eCkge1xuICAgICAgICAgICAgdHguZXhlY3V0ZVNxbCgnUkVQTEFDRSBJTlRPIHBlcnNpc3RlbmNlIChpZCwga2V5LCB2YWx1ZSwgcHJlZml4KSBWQUxVRVMgKD8sID8sID8sID8pJywgW2l0ZW0uaWQsIGl0ZW0ua2V5LCBpdGVtLnZhbHVlLCBpdGVtLnByZWZpeF0sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2sgJiYgY2FsbGJhY2soKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHJldHJpZXZlKGtleSwgcHJlZml4KSB7XG4gICAgdmFyIGl0ZW0gPSBjYWNoZVtjcmVhdGVLZXkoa2V5LCBwcmVmaXgpXTtcbiAgICByZXR1cm4gaXRlbSA/IGl0ZW0udmFsdWUgOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIHJldHJpZXZlQWxsKHByZWZpeCwgY2FsbGJhY2spIHtcbiAgICB2YXIgcmVzdWx0ID0ge307XG5cbiAgICBpZiAocHJlZml4KSB7XG4gICAgICAgIHV0aWxzLmZvckVhY2goY2FjaGUsIGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgaWYgKHZhbHVlLnByZWZpeCA9PT0gcHJlZml4KSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0W3ZhbHVlLmtleV0gPSB2YWx1ZS52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGNhbGxiYWNrKSB7IGNhbGxiYWNrKHJlc3VsdCk7IH1cbn1cblxuZnVuY3Rpb24gcmVtb3ZlKGtleSwgcHJlZml4LCBjYWxsYmFjaykge1xuICAgIHZhciBpZCA9IGNyZWF0ZUtleShrZXksIHByZWZpeCk7XG5cbiAgICBkZWxldGUgY2FjaGVbaWRdO1xuXG4gICAgaWYgKCF3aW5kb3cub3BlbkRhdGFiYXNlKSB7XG4gICAgICAgIHNhdmVUb1N0b3JhZ2UoKTtcbiAgICAgICAgaWYgKGNhbGxiYWNrKSB7IGNhbGxiYWNrKCk7IH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBvcGVuZGIudHJhbnNhY3Rpb24oZnVuY3Rpb24gKHR4KSB7XG4gICAgICAgICAgICB0eC5leGVjdXRlU3FsKCdERUxFVEUgRlJPTSBwZXJzaXN0ZW5jZSBXSEVSRSBrZXkgPSA/IEFORCBwcmVmaXggPSA/JywgW2tleSwgdmFsaWRhdGVBbmRTZXRQcmVmaXgocHJlZml4KV0sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2sgJiYgY2FsbGJhY2soKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHJlbW92ZUFsbChjYWxsYmFjaykge1xuICAgIGNhY2hlID0ge307XG5cbiAgICBpZiAoIXdpbmRvdy5vcGVuRGF0YWJhc2UpIHtcbiAgICAgICAgZGVsZXRlIGxvY2FsU3RvcmFnZVtEQl9OQU1FXTtcbiAgICAgICAgc2F2ZVRvU3RvcmFnZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIG9wZW5kYi50cmFuc2FjdGlvbihmdW5jdGlvbiAodHgpIHtcbiAgICAgICAgICAgIHR4LmV4ZWN1dGVTcWwoJ0RFTEVURSBGUk9NIHBlcnNpc3RlbmNlJywgW10sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2sgJiYgY2FsbGJhY2soKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5cbnNlbGYgPSB7XG4gICAgc2F2ZTogZnVuY3Rpb24gKGtleSwgdmFsdWUsIHByZWZpeCwgY2FsbGJhY2spIHtcbiAgICAgICAgc2F2ZShrZXksIHZhbHVlLCBwcmVmaXgsIGNhbGxiYWNrKTtcbiAgICAgICAgZXZlbnQudHJpZ2dlcignU3RvcmFnZVVwZGF0ZWRFdmVudCcpO1xuICAgIH0sXG5cbiAgICBzYXZlT2JqZWN0OiBmdW5jdGlvbiAoa2V5LCBvYmosIHByZWZpeCwgY2FsbGJhY2spIHtcbiAgICAgICAgc2F2ZShrZXksIEpTT04uc3RyaW5naWZ5KG9iaiksIHByZWZpeCwgY2FsbGJhY2spO1xuICAgICAgICBldmVudC50cmlnZ2VyKCdTdG9yYWdlVXBkYXRlZEV2ZW50Jyk7XG4gICAgfSxcblxuICAgIHJldHJpZXZlOiBmdW5jdGlvbiAoa2V5LCBwcmVmaXgpIHtcbiAgICAgICAgcmV0dXJuIHJldHJpZXZlKGtleSwgcHJlZml4KTtcbiAgICB9LFxuXG4gICAgcmV0cmlldmVPYmplY3Q6IGZ1bmN0aW9uIChrZXksIHByZWZpeCkge1xuICAgICAgICB2YXIgcmV0cmlldmVkVmFsdWUgPSByZXRyaWV2ZShrZXksIHByZWZpeCk7XG4gICAgICAgIHJldHVybiByZXRyaWV2ZWRWYWx1ZSA/IEpTT04ucGFyc2UocmV0cmlldmVkVmFsdWUpIDogcmV0cmlldmVkVmFsdWU7XG4gICAgfSxcblxuICAgIHJldHJpZXZlQWxsOiBmdW5jdGlvbiAocHJlZml4LCBjYWxsYmFjaykge1xuICAgICAgICByZXR1cm4gcmV0cmlldmVBbGwocHJlZml4LCBjYWxsYmFjayk7XG4gICAgfSxcblxuICAgIHJlbW92ZTogZnVuY3Rpb24gKGtleSwgcHJlZml4LCBjYWxsYmFjaykge1xuICAgICAgICBldmVudC50cmlnZ2VyKCdTdG9yYWdlVXBkYXRlZEV2ZW50Jyk7XG4gICAgICAgIHJlbW92ZShrZXksIHByZWZpeCwgY2FsbGJhY2spO1xuICAgIH0sXG5cbiAgICByZW1vdmVBbGw6IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICByZW1vdmVBbGwoY2FsbGJhY2spO1xuICAgICAgICBldmVudC50cmlnZ2VyKCdTdG9yYWdlVXBkYXRlZEV2ZW50Jyk7XG4gICAgfSxcblxuICAgIGluaXRpYWxpemU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGQgPSBRLmRlZmVyKCk7XG5cbiAgICAgICAgaWYgKCF3aW5kb3cub3BlbkRhdGFiYXNlKSB7XG4gICAgICAgICAgICB2YXIgc3RvcmUgPSBsb2NhbFN0b3JhZ2VbREJfTkFNRV07XG4gICAgICAgICAgICBjYWNoZSA9IHN0b3JlID8gSlNPTi5wYXJzZShzdG9yZSkgOiB7fTtcbiAgICAgICAgICAgIHNhdmVUb1N0b3JhZ2UoKTtcbiAgICAgICAgICAgIGQucmVzb2x2ZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2FjaGUgPSB7fTtcbiAgICAgICAgICAgIG9wZW5kYiA9IG9wZW5EYXRhYmFzZSgndGlueUhpcHBvcycsICcxLjAnLCAndGlueSBIaXBwb3MgcGVyc2lzdGVuY2UnLCAyICogMTAyNCAqIDEwMjQpO1xuICAgICAgICAgICAgb3BlbmRiLnRyYW5zYWN0aW9uKGZ1bmN0aW9uICh0eCkge1xuICAgICAgICAgICAgICAgIHR4LmV4ZWN1dGVTcWwoJ0NSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIHBlcnNpc3RlbmNlIChpZCB1bmlxdWUsIGtleSwgdmFsdWUsIHByZWZpeCknKTtcblxuICAgICAgICAgICAgICAgIHR4LmV4ZWN1dGVTcWwoJ1NFTEVDVCBpZCwga2V5LCB2YWx1ZSwgcHJlZml4IEZST00gcGVyc2lzdGVuY2UnLCBbXSwgZnVuY3Rpb24gKHR4LCByZXN1bHRzKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBsZW4gPSByZXN1bHRzLnJvd3MubGVuZ3RoLCBpLCBpdGVtO1xuXG4gICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSA9IHJlc3VsdHMucm93cy5pdGVtKGkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVbaXRlbS5pZF0gPSBpdGVtO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgZC5yZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkLnByb21pc2U7XG4gICAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBzZWxmO1xuIiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24obWVzc2FnZXMpIHtcbiAgICBtZXNzYWdlcy5yZWdpc3RlcignZXZlbnQnLCBmdW5jdGlvbiAoZXZlbnQsIGNhbGxiYWNrKSB7XG4gICAgICAgIGlmICghd2luZG93LmNvcmRvdmEpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsICdZb3UgbXVzdCBoYXZlIGNvcmRvdmEuanMgaW5jbHVkZWQgaW4geW91ciBwcm9qZWN0cywgdG8gYmUgYWJsZSB0byB0cmlnZ2VyIGV2ZW50cycpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB3aW5kb3cuY29yZG92YS5maXJlRG9jdW1lbnRFdmVudChldmVudCk7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgZXZlbnQpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG59O1xuIiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vLyBCYXNlZCBpbiBwYXJ0IG9uIGNvZGUgZnJvbSBBcGFjaGUgUmlwcGxlLCBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2luY3ViYXRvci1yaXBwbGVcblxudmFyIHV0aWxzID0gcmVxdWlyZSgndXRpbHMnKSxcbiAgICBleGNlcHRpb24gPSByZXF1aXJlKCdleGNlcHRpb24nKSxcbiAgICBfbGlzdGVuZXJzID0ge307XG5cbmZ1bmN0aW9uIF9vbihldmVudFR5cGUsIGxpc3RlbmVyLCBzY29wZSwgb25jZSkge1xuICAgIGlmICghZXZlbnRUeXBlKSB7XG4gICAgICAgIHRocm93ICdldmVudFR5cGUgbXVzdCBiZSB0cnV0aHknO1xuICAgIH1cbiAgICBfbGlzdGVuZXJzW2V2ZW50VHlwZV0gPSBfbGlzdGVuZXJzW2V2ZW50VHlwZV0gfHwgW107XG4gICAgX2xpc3RlbmVyc1tldmVudFR5cGVdLnB1c2goe1xuICAgICAgICBmdW5jOiBsaXN0ZW5lcixcbiAgICAgICAgc2NvcGU6IHNjb3BlLFxuICAgICAgICBvbmNlOiAhIW9uY2VcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gX3RyaWdnZXIobGlzdGVuZXIsIGFyZ3MsIHN5bmMpIHtcbiAgICB0cnkge1xuICAgICAgICBpZiAoc3luYykge1xuICAgICAgICAgICAgbGlzdGVuZXIuZnVuYy5hcHBseShsaXN0ZW5lci5zY29wZSwgYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBsaXN0ZW5lci5mdW5jLmFwcGx5KGxpc3RlbmVyLnNjb3BlLCBhcmdzKTtcbiAgICAgICAgICAgIH0sIDEpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNhdGNoIChlKSB7XG4gICAgICAgIGV4Y2VwdGlvbi5oYW5kbGUoZSk7XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBvbjogZnVuY3Rpb24gKGV2ZW50VHlwZSwgbGlzdGVuZXIsIHNjb3BlKSB7XG4gICAgICAgIF9vbihldmVudFR5cGUsIGxpc3RlbmVyLCBzY29wZSwgZmFsc2UpO1xuICAgIH0sXG5cbiAgICBvbmNlOiBmdW5jdGlvbiAoZXZlbnRUeXBlLCBsaXN0ZW5lciwgc2NvcGUpIHtcbiAgICAgICAgX29uKGV2ZW50VHlwZSwgbGlzdGVuZXIsIHNjb3BlLCB0cnVlKTtcbiAgICB9LFxuXG4gICAgdHJpZ2dlcjogZnVuY3Rpb24gKGV2ZW50VHlwZSwgYXJncywgc3luYykge1xuICAgICAgICBhcmdzID0gYXJncyB8fCBbXTtcbiAgICAgICAgc3luYyA9IHN5bmMgfHwgZmFsc2U7XG5cbiAgICAgICAgdmFyIGxpc3RlbmVycyA9IF9saXN0ZW5lcnNbZXZlbnRUeXBlXTtcblxuICAgICAgICBpZiAobGlzdGVuZXJzKSB7XG4gICAgICAgICAgICBsaXN0ZW5lcnMuZm9yRWFjaChmdW5jdGlvbiAobGlzdGVuZXIpIHtcbiAgICAgICAgICAgICAgICBfdHJpZ2dlcihsaXN0ZW5lciwgYXJncywgc3luYyk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgX2xpc3RlbmVyc1tldmVudFR5cGVdID0gbGlzdGVuZXJzLmZpbHRlcihmdW5jdGlvbiAobGlzdGVuZXIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gIWxpc3RlbmVyLm9uY2U7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBldmVudEhhc1N1YnNjcmliZXI6IGZ1bmN0aW9uIChldmVudFR5cGUpIHtcbiAgICAgICAgcmV0dXJuICEhX2xpc3RlbmVyc1tldmVudFR5cGVdO1xuICAgIH0sXG5cbiAgICBnZXRFdmVudFN1YnNjcmliZXJzOiBmdW5jdGlvbiAoZXZlbnRUeXBlKSB7XG4gICAgICAgIHJldHVybiB1dGlscy5jb3B5KF9saXN0ZW5lcnNbZXZlbnRUeXBlXSkgfHwgW107XG4gICAgfSxcblxuICAgIGNsZWFyOiBmdW5jdGlvbiAoZXZlbnRUeXBlKSB7XG4gICAgICAgIGlmIChldmVudFR5cGUpIHtcbiAgICAgICAgICAgIGRlbGV0ZSBfbGlzdGVuZXJzW2V2ZW50VHlwZV07XG4gICAgICAgIH1cbiAgICB9XG59O1xuIiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vLyBCYXNlZCBpbiBwYXJ0IG9uIGNvZGUgZnJvbSBBcGFjaGUgUmlwcGxlLCBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2luY3ViYXRvci1yaXBwbGVcblxuZnVuY3Rpb24gX2dldFN0YWNrKGRlcHRoKSB7XG4gICAgdmFyIGNhbGxlcixcbiAgICAgICAgc3RhY2sgPSAnJyxcbiAgICAgICAgY291bnQgPSAwO1xuXG4gICAgdHJ5IHtcbiAgICAgICAgLypqc2hpbnQgbm9hcmc6ZmFsc2UqLyAvLyBUSElTIFNIT1VMRCBOT1QgYmUgYSBjb21tb24gb2NjdXJyZW5jZS4uXG4gICAgICAgIGNhbGxlciA9IGFyZ3VtZW50cy5jYWxsZWUuY2FsbGVyLmFyZ3VtZW50cy5jYWxsZWUuY2FsbGVyO1xuXG4gICAgICAgIHdoaWxlIChjb3VudCA8PSBkZXB0aCAmJiBjYWxsZXIpIHtcbiAgICAgICAgICAgIHN0YWNrICs9ICdmdW5jdGlvbjogJyArIGNhbGxlci50b1N0cmluZygpLm1hdGNoKC9mdW5jdGlvblxccz8oLiopXFx7LylbMV0gKyAnXFxuJztcbiAgICAgICAgICAgIGNhbGxlciA9IGNhbGxlci5hcmd1bWVudHMuY2FsbGVlLmNhbGxlcjtcbiAgICAgICAgICAgIGNvdW50Kys7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHN0YWNrID0gJ2ZhaWxlZCB0byBkZXRlcm1pbmUgc3RhY2sgdHJhY2UgKCcgKyAoZS5uYW1lIHx8IGUudHlwZSkgKyAnIDo6ICcgKyBlLm1lc3NhZ2UgKyAnKSc7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0YWNrO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcblxuICAgIHR5cGVzOiB7XG4gICAgICAgIEFwcGxpY2F0aW9uOiAnQXBwbGljYXRpb24nLFxuICAgICAgICBBcmd1bWVudExlbmd0aDogJ0FyZ3VtZW50TGVuZ3RoJyxcbiAgICAgICAgQXJndW1lbnRUeXBlOiAnQXJndW1lbnRUeXBlJyxcbiAgICAgICAgQXJndW1lbnQ6ICdBcmd1bWVudCcsXG4gICAgICAgIE5vdGlmaWNhdGlvblR5cGU6ICdOb3RpZmljYXRpb25UeXBlJyxcbiAgICAgICAgTm90aWZpY2F0aW9uU3RhdGVUeXBlOiAnTm90aWZpY2F0aW9uU3RhdGVUeXBlJyxcbiAgICAgICAgRG9tT2JqZWN0Tm90Rm91bmQ6ICdEb21PYmplY3ROb3RGb3VuZCcsXG4gICAgICAgIExheW91dFR5cGU6ICdMYXlvdXRUeXBlJyxcbiAgICAgICAgRGV2aWNlTm90Rm91bmQ6ICdEZXZpY2VOb3RGb3VuZCcsXG4gICAgICAgIHRpbnlIaXBwb3NNYXNrZWRFeGNlcHRpb246ICd0aW55SGlwcG9zTWFza2VkRXhjZXB0aW9uJyxcbiAgICAgICAgR2VvOiAnR2VvJyxcbiAgICAgICAgQWNjZWxlcm9tZXRlcjogJ0FjY2VsZXJvbWV0ZXInLFxuICAgICAgICBNZXRob2ROb3RJbXBsZW1lbnRlZDogJ01ldGhvZE5vdEltcGxlbWVudGVkJyxcbiAgICAgICAgSW52YWxpZFN0YXRlOiAnSW52YWxpZFN0YXRlJyxcbiAgICAgICAgQXBwbGljYXRpb25TdGF0ZTogJ0FwcGxpY2F0aW9uU3RhdGUnXG4gICAgfSxcblxuICAgIGhhbmRsZTogZnVuY3Rpb24gaGFuZGxlKGV4Y2VwdGlvbiwgcmVUaHJvdykge1xuICAgICAgICByZVRocm93ID0gcmVUaHJvdyB8fCBmYWxzZTtcblxuICAgICAgICB2YXIgZU1zZyA9IGV4Y2VwdGlvbi5tZXNzYWdlIHx8ICdleGNlcHRpb24gY2F1Z2h0IScsXG4gICAgICAgICAgICBtc2cgPSBlTXNnICsgJ1xcblxcbicgKyAoZXhjZXB0aW9uLnN0YWNrIHx8ICcqbm8gc3RhY2sgcHJvdmlkZWQqJykgKyAnXFxuXFxuJztcblxuICAgICAgICBjb25zb2xlLmVycm9yKG1zZyk7XG5cbiAgICAgICAgaWYgKHJlVGhyb3cpIHtcbiAgICAgICAgICAgIHRocm93IGV4Y2VwdGlvbjtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICByYWlzZTogZnVuY3Rpb24gcmFpc2UoZXhjZXB0aW9uVHlwZSwgbWVzc2FnZSwgY3VzdG9tRXhjZXB0aW9uT2JqZWN0KSB7XG4gICAgICAgIHZhciBvYmogPSBjdXN0b21FeGNlcHRpb25PYmplY3QgfHwge1xuICAgICAgICAgICAgdHlwZTogJycsXG4gICAgICAgICAgICBtZXNzYWdlOiAnJyxcblxuICAgICAgICAgICAgdG9TdHJpbmc6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gdGhpcy5uYW1lICsgJzogXFwnJyArIHRoaXMubWVzc2FnZSArICdcXCcnO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhY2spIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdcXG4nICsgdGhpcy5zdGFjaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBtZXNzYWdlID0gbWVzc2FnZSB8fCAnJztcblxuICAgICAgICBvYmoubmFtZSA9IGV4Y2VwdGlvblR5cGU7XG4gICAgICAgIG9iai50eXBlID0gZXhjZXB0aW9uVHlwZTtcbiAgICAgICAgLy8gVE9ETzogaW5jbHVkZSB0aGUgZXhjZXB0aW9uIG9iamVjdHMgb3JpZ2luYWwgbWVzc2FnZSBpZiBleGlzdHNcbiAgICAgICAgb2JqLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgICAgICBvYmouc3RhY2sgPSBfZ2V0U3RhY2soNSk7XG5cbiAgICAgICAgdGhyb3cgb2JqO1xuICAgIH1cbn07XG4iLCIvKiEgalF1ZXJ5IHYyLjEuNCB8IChjKSAyMDA1LCAyMDE1IGpRdWVyeSBGb3VuZGF0aW9uLCBJbmMuIHwganF1ZXJ5Lm9yZy9saWNlbnNlICovXG4hZnVuY3Rpb24oYSxiKXtcIm9iamVjdFwiPT10eXBlb2YgbW9kdWxlJiZcIm9iamVjdFwiPT10eXBlb2YgbW9kdWxlLmV4cG9ydHM/bW9kdWxlLmV4cG9ydHM9YS5kb2N1bWVudD9iKGEsITApOmZ1bmN0aW9uKGEpe2lmKCFhLmRvY3VtZW50KXRocm93IG5ldyBFcnJvcihcImpRdWVyeSByZXF1aXJlcyBhIHdpbmRvdyB3aXRoIGEgZG9jdW1lbnRcIik7cmV0dXJuIGIoYSl9OmIoYSl9KFwidW5kZWZpbmVkXCIhPXR5cGVvZiB3aW5kb3c/d2luZG93OnRoaXMsZnVuY3Rpb24oYSxiKXt2YXIgYz1bXSxkPWMuc2xpY2UsZT1jLmNvbmNhdCxmPWMucHVzaCxnPWMuaW5kZXhPZixoPXt9LGk9aC50b1N0cmluZyxqPWguaGFzT3duUHJvcGVydHksaz17fSxsPWEuZG9jdW1lbnQsbT1cIjIuMS40XCIsbj1mdW5jdGlvbihhLGIpe3JldHVybiBuZXcgbi5mbi5pbml0KGEsYil9LG89L15bXFxzXFx1RkVGRlxceEEwXSt8W1xcc1xcdUZFRkZcXHhBMF0rJC9nLHA9L14tbXMtLyxxPS8tKFtcXGRhLXpdKS9naSxyPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGIudG9VcHBlckNhc2UoKX07bi5mbj1uLnByb3RvdHlwZT17anF1ZXJ5Om0sY29uc3RydWN0b3I6bixzZWxlY3RvcjpcIlwiLGxlbmd0aDowLHRvQXJyYXk6ZnVuY3Rpb24oKXtyZXR1cm4gZC5jYWxsKHRoaXMpfSxnZXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGwhPWE/MD5hP3RoaXNbYSt0aGlzLmxlbmd0aF06dGhpc1thXTpkLmNhbGwodGhpcyl9LHB1c2hTdGFjazpmdW5jdGlvbihhKXt2YXIgYj1uLm1lcmdlKHRoaXMuY29uc3RydWN0b3IoKSxhKTtyZXR1cm4gYi5wcmV2T2JqZWN0PXRoaXMsYi5jb250ZXh0PXRoaXMuY29udGV4dCxifSxlYWNoOmZ1bmN0aW9uKGEsYil7cmV0dXJuIG4uZWFjaCh0aGlzLGEsYil9LG1hcDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2sobi5tYXAodGhpcyxmdW5jdGlvbihiLGMpe3JldHVybiBhLmNhbGwoYixjLGIpfSkpfSxzbGljZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnB1c2hTdGFjayhkLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9LGZpcnN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXEoMCl9LGxhc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcSgtMSl9LGVxOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMubGVuZ3RoLGM9K2ErKDA+YT9iOjApO3JldHVybiB0aGlzLnB1c2hTdGFjayhjPj0wJiZiPmM/W3RoaXNbY11dOltdKX0sZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHJldk9iamVjdHx8dGhpcy5jb25zdHJ1Y3RvcihudWxsKX0scHVzaDpmLHNvcnQ6Yy5zb3J0LHNwbGljZTpjLnNwbGljZX0sbi5leHRlbmQ9bi5mbi5leHRlbmQ9ZnVuY3Rpb24oKXt2YXIgYSxiLGMsZCxlLGYsZz1hcmd1bWVudHNbMF18fHt9LGg9MSxpPWFyZ3VtZW50cy5sZW5ndGgsaj0hMTtmb3IoXCJib29sZWFuXCI9PXR5cGVvZiBnJiYoaj1nLGc9YXJndW1lbnRzW2hdfHx7fSxoKyspLFwib2JqZWN0XCI9PXR5cGVvZiBnfHxuLmlzRnVuY3Rpb24oZyl8fChnPXt9KSxoPT09aSYmKGc9dGhpcyxoLS0pO2k+aDtoKyspaWYobnVsbCE9KGE9YXJndW1lbnRzW2hdKSlmb3IoYiBpbiBhKWM9Z1tiXSxkPWFbYl0sZyE9PWQmJihqJiZkJiYobi5pc1BsYWluT2JqZWN0KGQpfHwoZT1uLmlzQXJyYXkoZCkpKT8oZT8oZT0hMSxmPWMmJm4uaXNBcnJheShjKT9jOltdKTpmPWMmJm4uaXNQbGFpbk9iamVjdChjKT9jOnt9LGdbYl09bi5leHRlbmQoaixmLGQpKTp2b2lkIDAhPT1kJiYoZ1tiXT1kKSk7cmV0dXJuIGd9LG4uZXh0ZW5kKHtleHBhbmRvOlwialF1ZXJ5XCIrKG0rTWF0aC5yYW5kb20oKSkucmVwbGFjZSgvXFxEL2csXCJcIiksaXNSZWFkeTohMCxlcnJvcjpmdW5jdGlvbihhKXt0aHJvdyBuZXcgRXJyb3IoYSl9LG5vb3A6ZnVuY3Rpb24oKXt9LGlzRnVuY3Rpb246ZnVuY3Rpb24oYSl7cmV0dXJuXCJmdW5jdGlvblwiPT09bi50eXBlKGEpfSxpc0FycmF5OkFycmF5LmlzQXJyYXksaXNXaW5kb3c6ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGwhPWEmJmE9PT1hLndpbmRvd30saXNOdW1lcmljOmZ1bmN0aW9uKGEpe3JldHVybiFuLmlzQXJyYXkoYSkmJmEtcGFyc2VGbG9hdChhKSsxPj0wfSxpc1BsYWluT2JqZWN0OmZ1bmN0aW9uKGEpe3JldHVyblwib2JqZWN0XCIhPT1uLnR5cGUoYSl8fGEubm9kZVR5cGV8fG4uaXNXaW5kb3coYSk/ITE6YS5jb25zdHJ1Y3RvciYmIWouY2FsbChhLmNvbnN0cnVjdG9yLnByb3RvdHlwZSxcImlzUHJvdG90eXBlT2ZcIik/ITE6ITB9LGlzRW1wdHlPYmplY3Q6ZnVuY3Rpb24oYSl7dmFyIGI7Zm9yKGIgaW4gYSlyZXR1cm4hMTtyZXR1cm4hMH0sdHlwZTpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbD09YT9hK1wiXCI6XCJvYmplY3RcIj09dHlwZW9mIGF8fFwiZnVuY3Rpb25cIj09dHlwZW9mIGE/aFtpLmNhbGwoYSldfHxcIm9iamVjdFwiOnR5cGVvZiBhfSxnbG9iYWxFdmFsOmZ1bmN0aW9uKGEpe3ZhciBiLGM9ZXZhbDthPW4udHJpbShhKSxhJiYoMT09PWEuaW5kZXhPZihcInVzZSBzdHJpY3RcIik/KGI9bC5jcmVhdGVFbGVtZW50KFwic2NyaXB0XCIpLGIudGV4dD1hLGwuaGVhZC5hcHBlbmRDaGlsZChiKS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGIpKTpjKGEpKX0sY2FtZWxDYXNlOmZ1bmN0aW9uKGEpe3JldHVybiBhLnJlcGxhY2UocCxcIm1zLVwiKS5yZXBsYWNlKHEscil9LG5vZGVOYW1lOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEubm9kZU5hbWUmJmEubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PWIudG9Mb3dlckNhc2UoKX0sZWFjaDpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZT0wLGY9YS5sZW5ndGgsZz1zKGEpO2lmKGMpe2lmKGcpe2Zvcig7Zj5lO2UrKylpZihkPWIuYXBwbHkoYVtlXSxjKSxkPT09ITEpYnJlYWt9ZWxzZSBmb3IoZSBpbiBhKWlmKGQ9Yi5hcHBseShhW2VdLGMpLGQ9PT0hMSlicmVha31lbHNlIGlmKGcpe2Zvcig7Zj5lO2UrKylpZihkPWIuY2FsbChhW2VdLGUsYVtlXSksZD09PSExKWJyZWFrfWVsc2UgZm9yKGUgaW4gYSlpZihkPWIuY2FsbChhW2VdLGUsYVtlXSksZD09PSExKWJyZWFrO3JldHVybiBhfSx0cmltOmZ1bmN0aW9uKGEpe3JldHVybiBudWxsPT1hP1wiXCI6KGErXCJcIikucmVwbGFjZShvLFwiXCIpfSxtYWtlQXJyYXk6ZnVuY3Rpb24oYSxiKXt2YXIgYz1ifHxbXTtyZXR1cm4gbnVsbCE9YSYmKHMoT2JqZWN0KGEpKT9uLm1lcmdlKGMsXCJzdHJpbmdcIj09dHlwZW9mIGE/W2FdOmEpOmYuY2FsbChjLGEpKSxjfSxpbkFycmF5OmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbnVsbD09Yj8tMTpnLmNhbGwoYixhLGMpfSxtZXJnZTpmdW5jdGlvbihhLGIpe2Zvcih2YXIgYz0rYi5sZW5ndGgsZD0wLGU9YS5sZW5ndGg7Yz5kO2QrKylhW2UrK109YltkXTtyZXR1cm4gYS5sZW5ndGg9ZSxhfSxncmVwOmZ1bmN0aW9uKGEsYixjKXtmb3IodmFyIGQsZT1bXSxmPTAsZz1hLmxlbmd0aCxoPSFjO2c+ZjtmKyspZD0hYihhW2ZdLGYpLGQhPT1oJiZlLnB1c2goYVtmXSk7cmV0dXJuIGV9LG1hcDpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZj0wLGc9YS5sZW5ndGgsaD1zKGEpLGk9W107aWYoaClmb3IoO2c+ZjtmKyspZD1iKGFbZl0sZixjKSxudWxsIT1kJiZpLnB1c2goZCk7ZWxzZSBmb3IoZiBpbiBhKWQ9YihhW2ZdLGYsYyksbnVsbCE9ZCYmaS5wdXNoKGQpO3JldHVybiBlLmFwcGx5KFtdLGkpfSxndWlkOjEscHJveHk6ZnVuY3Rpb24oYSxiKXt2YXIgYyxlLGY7cmV0dXJuXCJzdHJpbmdcIj09dHlwZW9mIGImJihjPWFbYl0sYj1hLGE9Yyksbi5pc0Z1bmN0aW9uKGEpPyhlPWQuY2FsbChhcmd1bWVudHMsMiksZj1mdW5jdGlvbigpe3JldHVybiBhLmFwcGx5KGJ8fHRoaXMsZS5jb25jYXQoZC5jYWxsKGFyZ3VtZW50cykpKX0sZi5ndWlkPWEuZ3VpZD1hLmd1aWR8fG4uZ3VpZCsrLGYpOnZvaWQgMH0sbm93OkRhdGUubm93LHN1cHBvcnQ6a30pLG4uZWFjaChcIkJvb2xlYW4gTnVtYmVyIFN0cmluZyBGdW5jdGlvbiBBcnJheSBEYXRlIFJlZ0V4cCBPYmplY3QgRXJyb3JcIi5zcGxpdChcIiBcIiksZnVuY3Rpb24oYSxiKXtoW1wiW29iamVjdCBcIitiK1wiXVwiXT1iLnRvTG93ZXJDYXNlKCl9KTtmdW5jdGlvbiBzKGEpe3ZhciBiPVwibGVuZ3RoXCJpbiBhJiZhLmxlbmd0aCxjPW4udHlwZShhKTtyZXR1cm5cImZ1bmN0aW9uXCI9PT1jfHxuLmlzV2luZG93KGEpPyExOjE9PT1hLm5vZGVUeXBlJiZiPyEwOlwiYXJyYXlcIj09PWN8fDA9PT1ifHxcIm51bWJlclwiPT10eXBlb2YgYiYmYj4wJiZiLTEgaW4gYX12YXIgdD1mdW5jdGlvbihhKXt2YXIgYixjLGQsZSxmLGcsaCxpLGosayxsLG0sbixvLHAscSxyLHMsdCx1PVwic2l6emxlXCIrMSpuZXcgRGF0ZSx2PWEuZG9jdW1lbnQsdz0wLHg9MCx5PWhhKCksej1oYSgpLEE9aGEoKSxCPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGE9PT1iJiYobD0hMCksMH0sQz0xPDwzMSxEPXt9Lmhhc093blByb3BlcnR5LEU9W10sRj1FLnBvcCxHPUUucHVzaCxIPUUucHVzaCxJPUUuc2xpY2UsSj1mdW5jdGlvbihhLGIpe2Zvcih2YXIgYz0wLGQ9YS5sZW5ndGg7ZD5jO2MrKylpZihhW2NdPT09YilyZXR1cm4gYztyZXR1cm4tMX0sSz1cImNoZWNrZWR8c2VsZWN0ZWR8YXN5bmN8YXV0b2ZvY3VzfGF1dG9wbGF5fGNvbnRyb2xzfGRlZmVyfGRpc2FibGVkfGhpZGRlbnxpc21hcHxsb29wfG11bHRpcGxlfG9wZW58cmVhZG9ubHl8cmVxdWlyZWR8c2NvcGVkXCIsTD1cIltcXFxceDIwXFxcXHRcXFxcclxcXFxuXFxcXGZdXCIsTT1cIig/OlxcXFxcXFxcLnxbXFxcXHctXXxbXlxcXFx4MDAtXFxcXHhhMF0pK1wiLE49TS5yZXBsYWNlKFwid1wiLFwidyNcIiksTz1cIlxcXFxbXCIrTCtcIiooXCIrTStcIikoPzpcIitMK1wiKihbKl4kfCF+XT89KVwiK0wrXCIqKD86JygoPzpcXFxcXFxcXC58W15cXFxcXFxcXCddKSopJ3xcXFwiKCg/OlxcXFxcXFxcLnxbXlxcXFxcXFxcXFxcIl0pKilcXFwifChcIitOK1wiKSl8KVwiK0wrXCIqXFxcXF1cIixQPVwiOihcIitNK1wiKSg/OlxcXFwoKCgnKCg/OlxcXFxcXFxcLnxbXlxcXFxcXFxcJ10pKiknfFxcXCIoKD86XFxcXFxcXFwufFteXFxcXFxcXFxcXFwiXSkqKVxcXCIpfCgoPzpcXFxcXFxcXC58W15cXFxcXFxcXCgpW1xcXFxdXXxcIitPK1wiKSopfC4qKVxcXFwpfClcIixRPW5ldyBSZWdFeHAoTCtcIitcIixcImdcIiksUj1uZXcgUmVnRXhwKFwiXlwiK0wrXCIrfCgoPzpefFteXFxcXFxcXFxdKSg/OlxcXFxcXFxcLikqKVwiK0wrXCIrJFwiLFwiZ1wiKSxTPW5ldyBSZWdFeHAoXCJeXCIrTCtcIiosXCIrTCtcIipcIiksVD1uZXcgUmVnRXhwKFwiXlwiK0wrXCIqKFs+K35dfFwiK0wrXCIpXCIrTCtcIipcIiksVT1uZXcgUmVnRXhwKFwiPVwiK0wrXCIqKFteXFxcXF0nXFxcIl0qPylcIitMK1wiKlxcXFxdXCIsXCJnXCIpLFY9bmV3IFJlZ0V4cChQKSxXPW5ldyBSZWdFeHAoXCJeXCIrTitcIiRcIiksWD17SUQ6bmV3IFJlZ0V4cChcIl4jKFwiK00rXCIpXCIpLENMQVNTOm5ldyBSZWdFeHAoXCJeXFxcXC4oXCIrTStcIilcIiksVEFHOm5ldyBSZWdFeHAoXCJeKFwiK00ucmVwbGFjZShcIndcIixcIncqXCIpK1wiKVwiKSxBVFRSOm5ldyBSZWdFeHAoXCJeXCIrTyksUFNFVURPOm5ldyBSZWdFeHAoXCJeXCIrUCksQ0hJTEQ6bmV3IFJlZ0V4cChcIl46KG9ubHl8Zmlyc3R8bGFzdHxudGh8bnRoLWxhc3QpLShjaGlsZHxvZi10eXBlKSg/OlxcXFwoXCIrTCtcIiooZXZlbnxvZGR8KChbKy1dfCkoXFxcXGQqKW58KVwiK0wrXCIqKD86KFsrLV18KVwiK0wrXCIqKFxcXFxkKyl8KSlcIitMK1wiKlxcXFwpfClcIixcImlcIiksYm9vbDpuZXcgUmVnRXhwKFwiXig/OlwiK0srXCIpJFwiLFwiaVwiKSxuZWVkc0NvbnRleHQ6bmV3IFJlZ0V4cChcIl5cIitMK1wiKls+K35dfDooZXZlbnxvZGR8ZXF8Z3R8bHR8bnRofGZpcnN0fGxhc3QpKD86XFxcXChcIitMK1wiKigoPzotXFxcXGQpP1xcXFxkKilcIitMK1wiKlxcXFwpfCkoPz1bXi1dfCQpXCIsXCJpXCIpfSxZPS9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbikkL2ksWj0vXmhcXGQkL2ksJD0vXltee10rXFx7XFxzKlxcW25hdGl2ZSBcXHcvLF89L14oPzojKFtcXHctXSspfChcXHcrKXxcXC4oW1xcdy1dKykpJC8sYWE9L1srfl0vLGJhPS8nfFxcXFwvZyxjYT1uZXcgUmVnRXhwKFwiXFxcXFxcXFwoW1xcXFxkYS1mXXsxLDZ9XCIrTCtcIj98KFwiK0wrXCIpfC4pXCIsXCJpZ1wiKSxkYT1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9XCIweFwiK2ItNjU1MzY7cmV0dXJuIGQhPT1kfHxjP2I6MD5kP1N0cmluZy5mcm9tQ2hhckNvZGUoZCs2NTUzNik6U3RyaW5nLmZyb21DaGFyQ29kZShkPj4xMHw1NTI5NiwxMDIzJmR8NTYzMjApfSxlYT1mdW5jdGlvbigpe20oKX07dHJ5e0guYXBwbHkoRT1JLmNhbGwodi5jaGlsZE5vZGVzKSx2LmNoaWxkTm9kZXMpLEVbdi5jaGlsZE5vZGVzLmxlbmd0aF0ubm9kZVR5cGV9Y2F0Y2goZmEpe0g9e2FwcGx5OkUubGVuZ3RoP2Z1bmN0aW9uKGEsYil7Ry5hcHBseShhLEkuY2FsbChiKSl9OmZ1bmN0aW9uKGEsYil7dmFyIGM9YS5sZW5ndGgsZD0wO3doaWxlKGFbYysrXT1iW2QrK10pO2EubGVuZ3RoPWMtMX19fWZ1bmN0aW9uIGdhKGEsYixkLGUpe3ZhciBmLGgsaixrLGwsbyxyLHMsdyx4O2lmKChiP2Iub3duZXJEb2N1bWVudHx8Yjp2KSE9PW4mJm0oYiksYj1ifHxuLGQ9ZHx8W10saz1iLm5vZGVUeXBlLFwic3RyaW5nXCIhPXR5cGVvZiBhfHwhYXx8MSE9PWsmJjkhPT1rJiYxMSE9PWspcmV0dXJuIGQ7aWYoIWUmJnApe2lmKDExIT09ayYmKGY9Xy5leGVjKGEpKSlpZihqPWZbMV0pe2lmKDk9PT1rKXtpZihoPWIuZ2V0RWxlbWVudEJ5SWQoaiksIWh8fCFoLnBhcmVudE5vZGUpcmV0dXJuIGQ7aWYoaC5pZD09PWopcmV0dXJuIGQucHVzaChoKSxkfWVsc2UgaWYoYi5vd25lckRvY3VtZW50JiYoaD1iLm93bmVyRG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaikpJiZ0KGIsaCkmJmguaWQ9PT1qKXJldHVybiBkLnB1c2goaCksZH1lbHNle2lmKGZbMl0pcmV0dXJuIEguYXBwbHkoZCxiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpKSxkO2lmKChqPWZbM10pJiZjLmdldEVsZW1lbnRzQnlDbGFzc05hbWUpcmV0dXJuIEguYXBwbHkoZCxiLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoaikpLGR9aWYoYy5xc2EmJighcXx8IXEudGVzdChhKSkpe2lmKHM9cj11LHc9Yix4PTEhPT1rJiZhLDE9PT1rJiZcIm9iamVjdFwiIT09Yi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKXtvPWcoYSksKHI9Yi5nZXRBdHRyaWJ1dGUoXCJpZFwiKSk/cz1yLnJlcGxhY2UoYmEsXCJcXFxcJCZcIik6Yi5zZXRBdHRyaWJ1dGUoXCJpZFwiLHMpLHM9XCJbaWQ9J1wiK3MrXCInXSBcIixsPW8ubGVuZ3RoO3doaWxlKGwtLSlvW2xdPXMrcmEob1tsXSk7dz1hYS50ZXN0KGEpJiZwYShiLnBhcmVudE5vZGUpfHxiLHg9by5qb2luKFwiLFwiKX1pZih4KXRyeXtyZXR1cm4gSC5hcHBseShkLHcucXVlcnlTZWxlY3RvckFsbCh4KSksZH1jYXRjaCh5KXt9ZmluYWxseXtyfHxiLnJlbW92ZUF0dHJpYnV0ZShcImlkXCIpfX19cmV0dXJuIGkoYS5yZXBsYWNlKFIsXCIkMVwiKSxiLGQsZSl9ZnVuY3Rpb24gaGEoKXt2YXIgYT1bXTtmdW5jdGlvbiBiKGMsZSl7cmV0dXJuIGEucHVzaChjK1wiIFwiKT5kLmNhY2hlTGVuZ3RoJiZkZWxldGUgYlthLnNoaWZ0KCldLGJbYytcIiBcIl09ZX1yZXR1cm4gYn1mdW5jdGlvbiBpYShhKXtyZXR1cm4gYVt1XT0hMCxhfWZ1bmN0aW9uIGphKGEpe3ZhciBiPW4uY3JlYXRlRWxlbWVudChcImRpdlwiKTt0cnl7cmV0dXJuISFhKGIpfWNhdGNoKGMpe3JldHVybiExfWZpbmFsbHl7Yi5wYXJlbnROb2RlJiZiLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYiksYj1udWxsfX1mdW5jdGlvbiBrYShhLGIpe3ZhciBjPWEuc3BsaXQoXCJ8XCIpLGU9YS5sZW5ndGg7d2hpbGUoZS0tKWQuYXR0ckhhbmRsZVtjW2VdXT1ifWZ1bmN0aW9uIGxhKGEsYil7dmFyIGM9YiYmYSxkPWMmJjE9PT1hLm5vZGVUeXBlJiYxPT09Yi5ub2RlVHlwZSYmKH5iLnNvdXJjZUluZGV4fHxDKS0ofmEuc291cmNlSW5kZXh8fEMpO2lmKGQpcmV0dXJuIGQ7aWYoYyl3aGlsZShjPWMubmV4dFNpYmxpbmcpaWYoYz09PWIpcmV0dXJuLTE7cmV0dXJuIGE/MTotMX1mdW5jdGlvbiBtYShhKXtyZXR1cm4gZnVuY3Rpb24oYil7dmFyIGM9Yi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVyblwiaW5wdXRcIj09PWMmJmIudHlwZT09PWF9fWZ1bmN0aW9uIG5hKGEpe3JldHVybiBmdW5jdGlvbihiKXt2YXIgYz1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuKFwiaW5wdXRcIj09PWN8fFwiYnV0dG9uXCI9PT1jKSYmYi50eXBlPT09YX19ZnVuY3Rpb24gb2EoYSl7cmV0dXJuIGlhKGZ1bmN0aW9uKGIpe3JldHVybiBiPStiLGlhKGZ1bmN0aW9uKGMsZCl7dmFyIGUsZj1hKFtdLGMubGVuZ3RoLGIpLGc9Zi5sZW5ndGg7d2hpbGUoZy0tKWNbZT1mW2ddXSYmKGNbZV09IShkW2VdPWNbZV0pKX0pfSl9ZnVuY3Rpb24gcGEoYSl7cmV0dXJuIGEmJlwidW5kZWZpbmVkXCIhPXR5cGVvZiBhLmdldEVsZW1lbnRzQnlUYWdOYW1lJiZhfWM9Z2Euc3VwcG9ydD17fSxmPWdhLmlzWE1MPWZ1bmN0aW9uKGEpe3ZhciBiPWEmJihhLm93bmVyRG9jdW1lbnR8fGEpLmRvY3VtZW50RWxlbWVudDtyZXR1cm4gYj9cIkhUTUxcIiE9PWIubm9kZU5hbWU6ITF9LG09Z2Euc2V0RG9jdW1lbnQ9ZnVuY3Rpb24oYSl7dmFyIGIsZSxnPWE/YS5vd25lckRvY3VtZW50fHxhOnY7cmV0dXJuIGchPT1uJiY5PT09Zy5ub2RlVHlwZSYmZy5kb2N1bWVudEVsZW1lbnQ/KG49ZyxvPWcuZG9jdW1lbnRFbGVtZW50LGU9Zy5kZWZhdWx0VmlldyxlJiZlIT09ZS50b3AmJihlLmFkZEV2ZW50TGlzdGVuZXI/ZS5hZGRFdmVudExpc3RlbmVyKFwidW5sb2FkXCIsZWEsITEpOmUuYXR0YWNoRXZlbnQmJmUuYXR0YWNoRXZlbnQoXCJvbnVubG9hZFwiLGVhKSkscD0hZihnKSxjLmF0dHJpYnV0ZXM9amEoZnVuY3Rpb24oYSl7cmV0dXJuIGEuY2xhc3NOYW1lPVwiaVwiLCFhLmdldEF0dHJpYnV0ZShcImNsYXNzTmFtZVwiKX0pLGMuZ2V0RWxlbWVudHNCeVRhZ05hbWU9amEoZnVuY3Rpb24oYSl7cmV0dXJuIGEuYXBwZW5kQ2hpbGQoZy5jcmVhdGVDb21tZW50KFwiXCIpKSwhYS5nZXRFbGVtZW50c0J5VGFnTmFtZShcIipcIikubGVuZ3RofSksYy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lPSQudGVzdChnLmdldEVsZW1lbnRzQnlDbGFzc05hbWUpLGMuZ2V0QnlJZD1qYShmdW5jdGlvbihhKXtyZXR1cm4gby5hcHBlbmRDaGlsZChhKS5pZD11LCFnLmdldEVsZW1lbnRzQnlOYW1lfHwhZy5nZXRFbGVtZW50c0J5TmFtZSh1KS5sZW5ndGh9KSxjLmdldEJ5SWQ/KGQuZmluZC5JRD1mdW5jdGlvbihhLGIpe2lmKFwidW5kZWZpbmVkXCIhPXR5cGVvZiBiLmdldEVsZW1lbnRCeUlkJiZwKXt2YXIgYz1iLmdldEVsZW1lbnRCeUlkKGEpO3JldHVybiBjJiZjLnBhcmVudE5vZGU/W2NdOltdfX0sZC5maWx0ZXIuSUQ9ZnVuY3Rpb24oYSl7dmFyIGI9YS5yZXBsYWNlKGNhLGRhKTtyZXR1cm4gZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKFwiaWRcIik9PT1ifX0pOihkZWxldGUgZC5maW5kLklELGQuZmlsdGVyLklEPWZ1bmN0aW9uKGEpe3ZhciBiPWEucmVwbGFjZShjYSxkYSk7cmV0dXJuIGZ1bmN0aW9uKGEpe3ZhciBjPVwidW5kZWZpbmVkXCIhPXR5cGVvZiBhLmdldEF0dHJpYnV0ZU5vZGUmJmEuZ2V0QXR0cmlidXRlTm9kZShcImlkXCIpO3JldHVybiBjJiZjLnZhbHVlPT09Yn19KSxkLmZpbmQuVEFHPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWU/ZnVuY3Rpb24oYSxiKXtyZXR1cm5cInVuZGVmaW5lZFwiIT10eXBlb2YgYi5nZXRFbGVtZW50c0J5VGFnTmFtZT9iLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpOmMucXNhP2IucXVlcnlTZWxlY3RvckFsbChhKTp2b2lkIDB9OmZ1bmN0aW9uKGEsYil7dmFyIGMsZD1bXSxlPTAsZj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpO2lmKFwiKlwiPT09YSl7d2hpbGUoYz1mW2UrK10pMT09PWMubm9kZVR5cGUmJmQucHVzaChjKTtyZXR1cm4gZH1yZXR1cm4gZn0sZC5maW5kLkNMQVNTPWMuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSYmZnVuY3Rpb24oYSxiKXtyZXR1cm4gcD9iLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoYSk6dm9pZCAwfSxyPVtdLHE9W10sKGMucXNhPSQudGVzdChnLnF1ZXJ5U2VsZWN0b3JBbGwpKSYmKGphKGZ1bmN0aW9uKGEpe28uYXBwZW5kQ2hpbGQoYSkuaW5uZXJIVE1MPVwiPGEgaWQ9J1wiK3UrXCInPjwvYT48c2VsZWN0IGlkPSdcIit1K1wiLVxcZl0nIG1zYWxsb3djYXB0dXJlPScnPjxvcHRpb24gc2VsZWN0ZWQ9Jyc+PC9vcHRpb24+PC9zZWxlY3Q+XCIsYS5xdWVyeVNlbGVjdG9yQWxsKFwiW21zYWxsb3djYXB0dXJlXj0nJ11cIikubGVuZ3RoJiZxLnB1c2goXCJbKl4kXT1cIitMK1wiKig/OicnfFxcXCJcXFwiKVwiKSxhLnF1ZXJ5U2VsZWN0b3JBbGwoXCJbc2VsZWN0ZWRdXCIpLmxlbmd0aHx8cS5wdXNoKFwiXFxcXFtcIitMK1wiKig/OnZhbHVlfFwiK0srXCIpXCIpLGEucXVlcnlTZWxlY3RvckFsbChcIltpZH49XCIrdStcIi1dXCIpLmxlbmd0aHx8cS5wdXNoKFwifj1cIiksYS5xdWVyeVNlbGVjdG9yQWxsKFwiOmNoZWNrZWRcIikubGVuZ3RofHxxLnB1c2goXCI6Y2hlY2tlZFwiKSxhLnF1ZXJ5U2VsZWN0b3JBbGwoXCJhI1wiK3UrXCIrKlwiKS5sZW5ndGh8fHEucHVzaChcIi4jLitbK35dXCIpfSksamEoZnVuY3Rpb24oYSl7dmFyIGI9Zy5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIik7Yi5zZXRBdHRyaWJ1dGUoXCJ0eXBlXCIsXCJoaWRkZW5cIiksYS5hcHBlbmRDaGlsZChiKS5zZXRBdHRyaWJ1dGUoXCJuYW1lXCIsXCJEXCIpLGEucXVlcnlTZWxlY3RvckFsbChcIltuYW1lPWRdXCIpLmxlbmd0aCYmcS5wdXNoKFwibmFtZVwiK0wrXCIqWypeJHwhfl0/PVwiKSxhLnF1ZXJ5U2VsZWN0b3JBbGwoXCI6ZW5hYmxlZFwiKS5sZW5ndGh8fHEucHVzaChcIjplbmFibGVkXCIsXCI6ZGlzYWJsZWRcIiksYS5xdWVyeVNlbGVjdG9yQWxsKFwiKiw6eFwiKSxxLnB1c2goXCIsLio6XCIpfSkpLChjLm1hdGNoZXNTZWxlY3Rvcj0kLnRlc3Qocz1vLm1hdGNoZXN8fG8ud2Via2l0TWF0Y2hlc1NlbGVjdG9yfHxvLm1vek1hdGNoZXNTZWxlY3Rvcnx8by5vTWF0Y2hlc1NlbGVjdG9yfHxvLm1zTWF0Y2hlc1NlbGVjdG9yKSkmJmphKGZ1bmN0aW9uKGEpe2MuZGlzY29ubmVjdGVkTWF0Y2g9cy5jYWxsKGEsXCJkaXZcIikscy5jYWxsKGEsXCJbcyE9JyddOnhcIiksci5wdXNoKFwiIT1cIixQKX0pLHE9cS5sZW5ndGgmJm5ldyBSZWdFeHAocS5qb2luKFwifFwiKSkscj1yLmxlbmd0aCYmbmV3IFJlZ0V4cChyLmpvaW4oXCJ8XCIpKSxiPSQudGVzdChvLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKSx0PWJ8fCQudGVzdChvLmNvbnRhaW5zKT9mdW5jdGlvbihhLGIpe3ZhciBjPTk9PT1hLm5vZGVUeXBlP2EuZG9jdW1lbnRFbGVtZW50OmEsZD1iJiZiLnBhcmVudE5vZGU7cmV0dXJuIGE9PT1kfHwhKCFkfHwxIT09ZC5ub2RlVHlwZXx8IShjLmNvbnRhaW5zP2MuY29udGFpbnMoZCk6YS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiYmMTYmYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihkKSkpfTpmdW5jdGlvbihhLGIpe2lmKGIpd2hpbGUoYj1iLnBhcmVudE5vZGUpaWYoYj09PWEpcmV0dXJuITA7cmV0dXJuITF9LEI9Yj9mdW5jdGlvbihhLGIpe2lmKGE9PT1iKXJldHVybiBsPSEwLDA7dmFyIGQ9IWEuY29tcGFyZURvY3VtZW50UG9zaXRpb24tIWIuY29tcGFyZURvY3VtZW50UG9zaXRpb247cmV0dXJuIGQ/ZDooZD0oYS5vd25lckRvY3VtZW50fHxhKT09PShiLm93bmVyRG9jdW1lbnR8fGIpP2EuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYik6MSwxJmR8fCFjLnNvcnREZXRhY2hlZCYmYi5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihhKT09PWQ/YT09PWd8fGEub3duZXJEb2N1bWVudD09PXYmJnQodixhKT8tMTpiPT09Z3x8Yi5vd25lckRvY3VtZW50PT09diYmdCh2LGIpPzE6az9KKGssYSktSihrLGIpOjA6NCZkPy0xOjEpfTpmdW5jdGlvbihhLGIpe2lmKGE9PT1iKXJldHVybiBsPSEwLDA7dmFyIGMsZD0wLGU9YS5wYXJlbnROb2RlLGY9Yi5wYXJlbnROb2RlLGg9W2FdLGk9W2JdO2lmKCFlfHwhZilyZXR1cm4gYT09PWc/LTE6Yj09PWc/MTplPy0xOmY/MTprP0ooayxhKS1KKGssYik6MDtpZihlPT09ZilyZXR1cm4gbGEoYSxiKTtjPWE7d2hpbGUoYz1jLnBhcmVudE5vZGUpaC51bnNoaWZ0KGMpO2M9Yjt3aGlsZShjPWMucGFyZW50Tm9kZSlpLnVuc2hpZnQoYyk7d2hpbGUoaFtkXT09PWlbZF0pZCsrO3JldHVybiBkP2xhKGhbZF0saVtkXSk6aFtkXT09PXY/LTE6aVtkXT09PXY/MTowfSxnKTpufSxnYS5tYXRjaGVzPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGdhKGEsbnVsbCxudWxsLGIpfSxnYS5tYXRjaGVzU2VsZWN0b3I9ZnVuY3Rpb24oYSxiKXtpZigoYS5vd25lckRvY3VtZW50fHxhKSE9PW4mJm0oYSksYj1iLnJlcGxhY2UoVSxcIj0nJDEnXVwiKSwhKCFjLm1hdGNoZXNTZWxlY3Rvcnx8IXB8fHImJnIudGVzdChiKXx8cSYmcS50ZXN0KGIpKSl0cnl7dmFyIGQ9cy5jYWxsKGEsYik7aWYoZHx8Yy5kaXNjb25uZWN0ZWRNYXRjaHx8YS5kb2N1bWVudCYmMTEhPT1hLmRvY3VtZW50Lm5vZGVUeXBlKXJldHVybiBkfWNhdGNoKGUpe31yZXR1cm4gZ2EoYixuLG51bGwsW2FdKS5sZW5ndGg+MH0sZ2EuY29udGFpbnM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4oYS5vd25lckRvY3VtZW50fHxhKSE9PW4mJm0oYSksdChhLGIpfSxnYS5hdHRyPWZ1bmN0aW9uKGEsYil7KGEub3duZXJEb2N1bWVudHx8YSkhPT1uJiZtKGEpO3ZhciBlPWQuYXR0ckhhbmRsZVtiLnRvTG93ZXJDYXNlKCldLGY9ZSYmRC5jYWxsKGQuYXR0ckhhbmRsZSxiLnRvTG93ZXJDYXNlKCkpP2UoYSxiLCFwKTp2b2lkIDA7cmV0dXJuIHZvaWQgMCE9PWY/ZjpjLmF0dHJpYnV0ZXN8fCFwP2EuZ2V0QXR0cmlidXRlKGIpOihmPWEuZ2V0QXR0cmlidXRlTm9kZShiKSkmJmYuc3BlY2lmaWVkP2YudmFsdWU6bnVsbH0sZ2EuZXJyb3I9ZnVuY3Rpb24oYSl7dGhyb3cgbmV3IEVycm9yKFwiU3ludGF4IGVycm9yLCB1bnJlY29nbml6ZWQgZXhwcmVzc2lvbjogXCIrYSl9LGdhLnVuaXF1ZVNvcnQ9ZnVuY3Rpb24oYSl7dmFyIGIsZD1bXSxlPTAsZj0wO2lmKGw9IWMuZGV0ZWN0RHVwbGljYXRlcyxrPSFjLnNvcnRTdGFibGUmJmEuc2xpY2UoMCksYS5zb3J0KEIpLGwpe3doaWxlKGI9YVtmKytdKWI9PT1hW2ZdJiYoZT1kLnB1c2goZikpO3doaWxlKGUtLSlhLnNwbGljZShkW2VdLDEpfXJldHVybiBrPW51bGwsYX0sZT1nYS5nZXRUZXh0PWZ1bmN0aW9uKGEpe3ZhciBiLGM9XCJcIixkPTAsZj1hLm5vZGVUeXBlO2lmKGYpe2lmKDE9PT1mfHw5PT09Znx8MTE9PT1mKXtpZihcInN0cmluZ1wiPT10eXBlb2YgYS50ZXh0Q29udGVudClyZXR1cm4gYS50ZXh0Q29udGVudDtmb3IoYT1hLmZpcnN0Q2hpbGQ7YTthPWEubmV4dFNpYmxpbmcpYys9ZShhKX1lbHNlIGlmKDM9PT1mfHw0PT09ZilyZXR1cm4gYS5ub2RlVmFsdWV9ZWxzZSB3aGlsZShiPWFbZCsrXSljKz1lKGIpO3JldHVybiBjfSxkPWdhLnNlbGVjdG9ycz17Y2FjaGVMZW5ndGg6NTAsY3JlYXRlUHNldWRvOmlhLG1hdGNoOlgsYXR0ckhhbmRsZTp7fSxmaW5kOnt9LHJlbGF0aXZlOntcIj5cIjp7ZGlyOlwicGFyZW50Tm9kZVwiLGZpcnN0OiEwfSxcIiBcIjp7ZGlyOlwicGFyZW50Tm9kZVwifSxcIitcIjp7ZGlyOlwicHJldmlvdXNTaWJsaW5nXCIsZmlyc3Q6ITB9LFwiflwiOntkaXI6XCJwcmV2aW91c1NpYmxpbmdcIn19LHByZUZpbHRlcjp7QVRUUjpmdW5jdGlvbihhKXtyZXR1cm4gYVsxXT1hWzFdLnJlcGxhY2UoY2EsZGEpLGFbM109KGFbM118fGFbNF18fGFbNV18fFwiXCIpLnJlcGxhY2UoY2EsZGEpLFwifj1cIj09PWFbMl0mJihhWzNdPVwiIFwiK2FbM10rXCIgXCIpLGEuc2xpY2UoMCw0KX0sQ0hJTEQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGFbMV09YVsxXS50b0xvd2VyQ2FzZSgpLFwibnRoXCI9PT1hWzFdLnNsaWNlKDAsMyk/KGFbM118fGdhLmVycm9yKGFbMF0pLGFbNF09KyhhWzRdP2FbNV0rKGFbNl18fDEpOjIqKFwiZXZlblwiPT09YVszXXx8XCJvZGRcIj09PWFbM10pKSxhWzVdPSsoYVs3XSthWzhdfHxcIm9kZFwiPT09YVszXSkpOmFbM10mJmdhLmVycm9yKGFbMF0pLGF9LFBTRVVETzpmdW5jdGlvbihhKXt2YXIgYixjPSFhWzZdJiZhWzJdO3JldHVybiBYLkNISUxELnRlc3QoYVswXSk/bnVsbDooYVszXT9hWzJdPWFbNF18fGFbNV18fFwiXCI6YyYmVi50ZXN0KGMpJiYoYj1nKGMsITApKSYmKGI9Yy5pbmRleE9mKFwiKVwiLGMubGVuZ3RoLWIpLWMubGVuZ3RoKSYmKGFbMF09YVswXS5zbGljZSgwLGIpLGFbMl09Yy5zbGljZSgwLGIpKSxhLnNsaWNlKDAsMykpfX0sZmlsdGVyOntUQUc6ZnVuY3Rpb24oYSl7dmFyIGI9YS5yZXBsYWNlKGNhLGRhKS50b0xvd2VyQ2FzZSgpO3JldHVyblwiKlwiPT09YT9mdW5jdGlvbigpe3JldHVybiEwfTpmdW5jdGlvbihhKXtyZXR1cm4gYS5ub2RlTmFtZSYmYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09Yn19LENMQVNTOmZ1bmN0aW9uKGEpe3ZhciBiPXlbYStcIiBcIl07cmV0dXJuIGJ8fChiPW5ldyBSZWdFeHAoXCIoXnxcIitMK1wiKVwiK2ErXCIoXCIrTCtcInwkKVwiKSkmJnkoYSxmdW5jdGlvbihhKXtyZXR1cm4gYi50ZXN0KFwic3RyaW5nXCI9PXR5cGVvZiBhLmNsYXNzTmFtZSYmYS5jbGFzc05hbWV8fFwidW5kZWZpbmVkXCIhPXR5cGVvZiBhLmdldEF0dHJpYnV0ZSYmYS5nZXRBdHRyaWJ1dGUoXCJjbGFzc1wiKXx8XCJcIil9KX0sQVRUUjpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGZ1bmN0aW9uKGQpe3ZhciBlPWdhLmF0dHIoZCxhKTtyZXR1cm4gbnVsbD09ZT9cIiE9XCI9PT1iOmI/KGUrPVwiXCIsXCI9XCI9PT1iP2U9PT1jOlwiIT1cIj09PWI/ZSE9PWM6XCJePVwiPT09Yj9jJiYwPT09ZS5pbmRleE9mKGMpOlwiKj1cIj09PWI/YyYmZS5pbmRleE9mKGMpPi0xOlwiJD1cIj09PWI/YyYmZS5zbGljZSgtYy5sZW5ndGgpPT09YzpcIn49XCI9PT1iPyhcIiBcIitlLnJlcGxhY2UoUSxcIiBcIikrXCIgXCIpLmluZGV4T2YoYyk+LTE6XCJ8PVwiPT09Yj9lPT09Y3x8ZS5zbGljZSgwLGMubGVuZ3RoKzEpPT09YytcIi1cIjohMSk6ITB9fSxDSElMRDpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmPVwibnRoXCIhPT1hLnNsaWNlKDAsMyksZz1cImxhc3RcIiE9PWEuc2xpY2UoLTQpLGg9XCJvZi10eXBlXCI9PT1iO3JldHVybiAxPT09ZCYmMD09PWU/ZnVuY3Rpb24oYSl7cmV0dXJuISFhLnBhcmVudE5vZGV9OmZ1bmN0aW9uKGIsYyxpKXt2YXIgaixrLGwsbSxuLG8scD1mIT09Zz9cIm5leHRTaWJsaW5nXCI6XCJwcmV2aW91c1NpYmxpbmdcIixxPWIucGFyZW50Tm9kZSxyPWgmJmIubm9kZU5hbWUudG9Mb3dlckNhc2UoKSxzPSFpJiYhaDtpZihxKXtpZihmKXt3aGlsZShwKXtsPWI7d2hpbGUobD1sW3BdKWlmKGg/bC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09cjoxPT09bC5ub2RlVHlwZSlyZXR1cm4hMTtvPXA9XCJvbmx5XCI9PT1hJiYhbyYmXCJuZXh0U2libGluZ1wifXJldHVybiEwfWlmKG89W2c/cS5maXJzdENoaWxkOnEubGFzdENoaWxkXSxnJiZzKXtrPXFbdV18fChxW3VdPXt9KSxqPWtbYV18fFtdLG49alswXT09PXcmJmpbMV0sbT1qWzBdPT09dyYmalsyXSxsPW4mJnEuY2hpbGROb2Rlc1tuXTt3aGlsZShsPSsrbiYmbCYmbFtwXXx8KG09bj0wKXx8by5wb3AoKSlpZigxPT09bC5ub2RlVHlwZSYmKyttJiZsPT09Yil7a1thXT1bdyxuLG1dO2JyZWFrfX1lbHNlIGlmKHMmJihqPShiW3VdfHwoYlt1XT17fSkpW2FdKSYmalswXT09PXcpbT1qWzFdO2Vsc2Ugd2hpbGUobD0rK24mJmwmJmxbcF18fChtPW49MCl8fG8ucG9wKCkpaWYoKGg/bC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09cjoxPT09bC5ub2RlVHlwZSkmJisrbSYmKHMmJigobFt1XXx8KGxbdV09e30pKVthXT1bdyxtXSksbD09PWIpKWJyZWFrO3JldHVybiBtLT1lLG09PT1kfHxtJWQ9PT0wJiZtL2Q+PTB9fX0sUFNFVURPOmZ1bmN0aW9uKGEsYil7dmFyIGMsZT1kLnBzZXVkb3NbYV18fGQuc2V0RmlsdGVyc1thLnRvTG93ZXJDYXNlKCldfHxnYS5lcnJvcihcInVuc3VwcG9ydGVkIHBzZXVkbzogXCIrYSk7cmV0dXJuIGVbdV0/ZShiKTplLmxlbmd0aD4xPyhjPVthLGEsXCJcIixiXSxkLnNldEZpbHRlcnMuaGFzT3duUHJvcGVydHkoYS50b0xvd2VyQ2FzZSgpKT9pYShmdW5jdGlvbihhLGMpe3ZhciBkLGY9ZShhLGIpLGc9Zi5sZW5ndGg7d2hpbGUoZy0tKWQ9SihhLGZbZ10pLGFbZF09IShjW2RdPWZbZ10pfSk6ZnVuY3Rpb24oYSl7cmV0dXJuIGUoYSwwLGMpfSk6ZX19LHBzZXVkb3M6e25vdDppYShmdW5jdGlvbihhKXt2YXIgYj1bXSxjPVtdLGQ9aChhLnJlcGxhY2UoUixcIiQxXCIpKTtyZXR1cm4gZFt1XT9pYShmdW5jdGlvbihhLGIsYyxlKXt2YXIgZixnPWQoYSxudWxsLGUsW10pLGg9YS5sZW5ndGg7d2hpbGUoaC0tKShmPWdbaF0pJiYoYVtoXT0hKGJbaF09ZikpfSk6ZnVuY3Rpb24oYSxlLGYpe3JldHVybiBiWzBdPWEsZChiLG51bGwsZixjKSxiWzBdPW51bGwsIWMucG9wKCl9fSksaGFzOmlhKGZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbihiKXtyZXR1cm4gZ2EoYSxiKS5sZW5ndGg+MH19KSxjb250YWluczppYShmdW5jdGlvbihhKXtyZXR1cm4gYT1hLnJlcGxhY2UoY2EsZGEpLGZ1bmN0aW9uKGIpe3JldHVybihiLnRleHRDb250ZW50fHxiLmlubmVyVGV4dHx8ZShiKSkuaW5kZXhPZihhKT4tMX19KSxsYW5nOmlhKGZ1bmN0aW9uKGEpe3JldHVybiBXLnRlc3QoYXx8XCJcIil8fGdhLmVycm9yKFwidW5zdXBwb3J0ZWQgbGFuZzogXCIrYSksYT1hLnJlcGxhY2UoY2EsZGEpLnRvTG93ZXJDYXNlKCksZnVuY3Rpb24oYil7dmFyIGM7ZG8gaWYoYz1wP2IubGFuZzpiLmdldEF0dHJpYnV0ZShcInhtbDpsYW5nXCIpfHxiLmdldEF0dHJpYnV0ZShcImxhbmdcIikpcmV0dXJuIGM9Yy50b0xvd2VyQ2FzZSgpLGM9PT1hfHwwPT09Yy5pbmRleE9mKGErXCItXCIpO3doaWxlKChiPWIucGFyZW50Tm9kZSkmJjE9PT1iLm5vZGVUeXBlKTtyZXR1cm4hMX19KSx0YXJnZXQ6ZnVuY3Rpb24oYil7dmFyIGM9YS5sb2NhdGlvbiYmYS5sb2NhdGlvbi5oYXNoO3JldHVybiBjJiZjLnNsaWNlKDEpPT09Yi5pZH0scm9vdDpmdW5jdGlvbihhKXtyZXR1cm4gYT09PW99LGZvY3VzOmZ1bmN0aW9uKGEpe3JldHVybiBhPT09bi5hY3RpdmVFbGVtZW50JiYoIW4uaGFzRm9jdXN8fG4uaGFzRm9jdXMoKSkmJiEhKGEudHlwZXx8YS5ocmVmfHx+YS50YWJJbmRleCl9LGVuYWJsZWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZGlzYWJsZWQ9PT0hMX0sZGlzYWJsZWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZGlzYWJsZWQ9PT0hMH0sY2hlY2tlZDpmdW5jdGlvbihhKXt2YXIgYj1hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuXCJpbnB1dFwiPT09YiYmISFhLmNoZWNrZWR8fFwib3B0aW9uXCI9PT1iJiYhIWEuc2VsZWN0ZWR9LHNlbGVjdGVkOmZ1bmN0aW9uKGEpe3JldHVybiBhLnBhcmVudE5vZGUmJmEucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4LGEuc2VsZWN0ZWQ9PT0hMH0sZW1wdHk6ZnVuY3Rpb24oYSl7Zm9yKGE9YS5maXJzdENoaWxkO2E7YT1hLm5leHRTaWJsaW5nKWlmKGEubm9kZVR5cGU8NilyZXR1cm4hMTtyZXR1cm4hMH0scGFyZW50OmZ1bmN0aW9uKGEpe3JldHVybiFkLnBzZXVkb3MuZW1wdHkoYSl9LGhlYWRlcjpmdW5jdGlvbihhKXtyZXR1cm4gWi50ZXN0KGEubm9kZU5hbWUpfSxpbnB1dDpmdW5jdGlvbihhKXtyZXR1cm4gWS50ZXN0KGEubm9kZU5hbWUpfSxidXR0b246ZnVuY3Rpb24oYSl7dmFyIGI9YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVyblwiaW5wdXRcIj09PWImJlwiYnV0dG9uXCI9PT1hLnR5cGV8fFwiYnV0dG9uXCI9PT1ifSx0ZXh0OmZ1bmN0aW9uKGEpe3ZhciBiO3JldHVyblwiaW5wdXRcIj09PWEubm9kZU5hbWUudG9Mb3dlckNhc2UoKSYmXCJ0ZXh0XCI9PT1hLnR5cGUmJihudWxsPT0oYj1hLmdldEF0dHJpYnV0ZShcInR5cGVcIikpfHxcInRleHRcIj09PWIudG9Mb3dlckNhc2UoKSl9LGZpcnN0Om9hKGZ1bmN0aW9uKCl7cmV0dXJuWzBdfSksbGFzdDpvYShmdW5jdGlvbihhLGIpe3JldHVybltiLTFdfSksZXE6b2EoZnVuY3Rpb24oYSxiLGMpe3JldHVyblswPmM/YytiOmNdfSksZXZlbjpvYShmdW5jdGlvbihhLGIpe2Zvcih2YXIgYz0wO2I+YztjKz0yKWEucHVzaChjKTtyZXR1cm4gYX0pLG9kZDpvYShmdW5jdGlvbihhLGIpe2Zvcih2YXIgYz0xO2I+YztjKz0yKWEucHVzaChjKTtyZXR1cm4gYX0pLGx0Om9hKGZ1bmN0aW9uKGEsYixjKXtmb3IodmFyIGQ9MD5jP2MrYjpjOy0tZD49MDspYS5wdXNoKGQpO3JldHVybiBhfSksZ3Q6b2EoZnVuY3Rpb24oYSxiLGMpe2Zvcih2YXIgZD0wPmM/YytiOmM7KytkPGI7KWEucHVzaChkKTtyZXR1cm4gYX0pfX0sZC5wc2V1ZG9zLm50aD1kLnBzZXVkb3MuZXE7Zm9yKGIgaW57cmFkaW86ITAsY2hlY2tib3g6ITAsZmlsZTohMCxwYXNzd29yZDohMCxpbWFnZTohMH0pZC5wc2V1ZG9zW2JdPW1hKGIpO2ZvcihiIGlue3N1Ym1pdDohMCxyZXNldDohMH0pZC5wc2V1ZG9zW2JdPW5hKGIpO2Z1bmN0aW9uIHFhKCl7fXFhLnByb3RvdHlwZT1kLmZpbHRlcnM9ZC5wc2V1ZG9zLGQuc2V0RmlsdGVycz1uZXcgcWEsZz1nYS50b2tlbml6ZT1mdW5jdGlvbihhLGIpe3ZhciBjLGUsZixnLGgsaSxqLGs9elthK1wiIFwiXTtpZihrKXJldHVybiBiPzA6ay5zbGljZSgwKTtoPWEsaT1bXSxqPWQucHJlRmlsdGVyO3doaWxlKGgpeyghY3x8KGU9Uy5leGVjKGgpKSkmJihlJiYoaD1oLnNsaWNlKGVbMF0ubGVuZ3RoKXx8aCksaS5wdXNoKGY9W10pKSxjPSExLChlPVQuZXhlYyhoKSkmJihjPWUuc2hpZnQoKSxmLnB1c2goe3ZhbHVlOmMsdHlwZTplWzBdLnJlcGxhY2UoUixcIiBcIil9KSxoPWguc2xpY2UoYy5sZW5ndGgpKTtmb3IoZyBpbiBkLmZpbHRlcikhKGU9WFtnXS5leGVjKGgpKXx8altnXSYmIShlPWpbZ10oZSkpfHwoYz1lLnNoaWZ0KCksZi5wdXNoKHt2YWx1ZTpjLHR5cGU6ZyxtYXRjaGVzOmV9KSxoPWguc2xpY2UoYy5sZW5ndGgpKTtpZighYylicmVha31yZXR1cm4gYj9oLmxlbmd0aDpoP2dhLmVycm9yKGEpOnooYSxpKS5zbGljZSgwKX07ZnVuY3Rpb24gcmEoYSl7Zm9yKHZhciBiPTAsYz1hLmxlbmd0aCxkPVwiXCI7Yz5iO2IrKylkKz1hW2JdLnZhbHVlO3JldHVybiBkfWZ1bmN0aW9uIHNhKGEsYixjKXt2YXIgZD1iLmRpcixlPWMmJlwicGFyZW50Tm9kZVwiPT09ZCxmPXgrKztyZXR1cm4gYi5maXJzdD9mdW5jdGlvbihiLGMsZil7d2hpbGUoYj1iW2RdKWlmKDE9PT1iLm5vZGVUeXBlfHxlKXJldHVybiBhKGIsYyxmKX06ZnVuY3Rpb24oYixjLGcpe3ZhciBoLGksaj1bdyxmXTtpZihnKXt3aGlsZShiPWJbZF0paWYoKDE9PT1iLm5vZGVUeXBlfHxlKSYmYShiLGMsZykpcmV0dXJuITB9ZWxzZSB3aGlsZShiPWJbZF0paWYoMT09PWIubm9kZVR5cGV8fGUpe2lmKGk9Ylt1XXx8KGJbdV09e30pLChoPWlbZF0pJiZoWzBdPT09dyYmaFsxXT09PWYpcmV0dXJuIGpbMl09aFsyXTtpZihpW2RdPWosalsyXT1hKGIsYyxnKSlyZXR1cm4hMH19fWZ1bmN0aW9uIHRhKGEpe3JldHVybiBhLmxlbmd0aD4xP2Z1bmN0aW9uKGIsYyxkKXt2YXIgZT1hLmxlbmd0aDt3aGlsZShlLS0paWYoIWFbZV0oYixjLGQpKXJldHVybiExO3JldHVybiEwfTphWzBdfWZ1bmN0aW9uIHVhKGEsYixjKXtmb3IodmFyIGQ9MCxlPWIubGVuZ3RoO2U+ZDtkKyspZ2EoYSxiW2RdLGMpO3JldHVybiBjfWZ1bmN0aW9uIHZhKGEsYixjLGQsZSl7Zm9yKHZhciBmLGc9W10saD0wLGk9YS5sZW5ndGgsaj1udWxsIT1iO2k+aDtoKyspKGY9YVtoXSkmJighY3x8YyhmLGQsZSkpJiYoZy5wdXNoKGYpLGomJmIucHVzaChoKSk7cmV0dXJuIGd9ZnVuY3Rpb24gd2EoYSxiLGMsZCxlLGYpe3JldHVybiBkJiYhZFt1XSYmKGQ9d2EoZCkpLGUmJiFlW3VdJiYoZT13YShlLGYpKSxpYShmdW5jdGlvbihmLGcsaCxpKXt2YXIgaixrLGwsbT1bXSxuPVtdLG89Zy5sZW5ndGgscD1mfHx1YShifHxcIipcIixoLm5vZGVUeXBlP1toXTpoLFtdKSxxPSFhfHwhZiYmYj9wOnZhKHAsbSxhLGgsaSkscj1jP2V8fChmP2E6b3x8ZCk/W106ZzpxO2lmKGMmJmMocSxyLGgsaSksZCl7aj12YShyLG4pLGQoaixbXSxoLGkpLGs9ai5sZW5ndGg7d2hpbGUoay0tKShsPWpba10pJiYocltuW2tdXT0hKHFbbltrXV09bCkpfWlmKGYpe2lmKGV8fGEpe2lmKGUpe2o9W10saz1yLmxlbmd0aDt3aGlsZShrLS0pKGw9cltrXSkmJmoucHVzaChxW2tdPWwpO2UobnVsbCxyPVtdLGosaSl9az1yLmxlbmd0aDt3aGlsZShrLS0pKGw9cltrXSkmJihqPWU/SihmLGwpOm1ba10pPi0xJiYoZltqXT0hKGdbal09bCkpfX1lbHNlIHI9dmEocj09PWc/ci5zcGxpY2UobyxyLmxlbmd0aCk6ciksZT9lKG51bGwsZyxyLGkpOkguYXBwbHkoZyxyKX0pfWZ1bmN0aW9uIHhhKGEpe2Zvcih2YXIgYixjLGUsZj1hLmxlbmd0aCxnPWQucmVsYXRpdmVbYVswXS50eXBlXSxoPWd8fGQucmVsYXRpdmVbXCIgXCJdLGk9Zz8xOjAsaz1zYShmdW5jdGlvbihhKXtyZXR1cm4gYT09PWJ9LGgsITApLGw9c2EoZnVuY3Rpb24oYSl7cmV0dXJuIEooYixhKT4tMX0saCwhMCksbT1bZnVuY3Rpb24oYSxjLGQpe3ZhciBlPSFnJiYoZHx8YyE9PWopfHwoKGI9Yykubm9kZVR5cGU/ayhhLGMsZCk6bChhLGMsZCkpO3JldHVybiBiPW51bGwsZX1dO2Y+aTtpKyspaWYoYz1kLnJlbGF0aXZlW2FbaV0udHlwZV0pbT1bc2EodGEobSksYyldO2Vsc2V7aWYoYz1kLmZpbHRlclthW2ldLnR5cGVdLmFwcGx5KG51bGwsYVtpXS5tYXRjaGVzKSxjW3VdKXtmb3IoZT0rK2k7Zj5lO2UrKylpZihkLnJlbGF0aXZlW2FbZV0udHlwZV0pYnJlYWs7cmV0dXJuIHdhKGk+MSYmdGEobSksaT4xJiZyYShhLnNsaWNlKDAsaS0xKS5jb25jYXQoe3ZhbHVlOlwiIFwiPT09YVtpLTJdLnR5cGU/XCIqXCI6XCJcIn0pKS5yZXBsYWNlKFIsXCIkMVwiKSxjLGU+aSYmeGEoYS5zbGljZShpLGUpKSxmPmUmJnhhKGE9YS5zbGljZShlKSksZj5lJiZyYShhKSl9bS5wdXNoKGMpfXJldHVybiB0YShtKX1mdW5jdGlvbiB5YShhLGIpe3ZhciBjPWIubGVuZ3RoPjAsZT1hLmxlbmd0aD4wLGY9ZnVuY3Rpb24oZixnLGgsaSxrKXt2YXIgbCxtLG8scD0wLHE9XCIwXCIscj1mJiZbXSxzPVtdLHQ9aix1PWZ8fGUmJmQuZmluZC5UQUcoXCIqXCIsayksdj13Kz1udWxsPT10PzE6TWF0aC5yYW5kb20oKXx8LjEseD11Lmxlbmd0aDtmb3IoayYmKGo9ZyE9PW4mJmcpO3EhPT14JiZudWxsIT0obD11W3FdKTtxKyspe2lmKGUmJmwpe209MDt3aGlsZShvPWFbbSsrXSlpZihvKGwsZyxoKSl7aS5wdXNoKGwpO2JyZWFrfWsmJih3PXYpfWMmJigobD0hbyYmbCkmJnAtLSxmJiZyLnB1c2gobCkpfWlmKHArPXEsYyYmcSE9PXApe209MDt3aGlsZShvPWJbbSsrXSlvKHIscyxnLGgpO2lmKGYpe2lmKHA+MCl3aGlsZShxLS0pcltxXXx8c1txXXx8KHNbcV09Ri5jYWxsKGkpKTtzPXZhKHMpfUguYXBwbHkoaSxzKSxrJiYhZiYmcy5sZW5ndGg+MCYmcCtiLmxlbmd0aD4xJiZnYS51bmlxdWVTb3J0KGkpfXJldHVybiBrJiYodz12LGo9dCkscn07cmV0dXJuIGM/aWEoZik6Zn1yZXR1cm4gaD1nYS5jb21waWxlPWZ1bmN0aW9uKGEsYil7dmFyIGMsZD1bXSxlPVtdLGY9QVthK1wiIFwiXTtpZighZil7Ynx8KGI9ZyhhKSksYz1iLmxlbmd0aDt3aGlsZShjLS0pZj14YShiW2NdKSxmW3VdP2QucHVzaChmKTplLnB1c2goZik7Zj1BKGEseWEoZSxkKSksZi5zZWxlY3Rvcj1hfXJldHVybiBmfSxpPWdhLnNlbGVjdD1mdW5jdGlvbihhLGIsZSxmKXt2YXIgaSxqLGssbCxtLG49XCJmdW5jdGlvblwiPT10eXBlb2YgYSYmYSxvPSFmJiZnKGE9bi5zZWxlY3Rvcnx8YSk7aWYoZT1lfHxbXSwxPT09by5sZW5ndGgpe2lmKGo9b1swXT1vWzBdLnNsaWNlKDApLGoubGVuZ3RoPjImJlwiSURcIj09PShrPWpbMF0pLnR5cGUmJmMuZ2V0QnlJZCYmOT09PWIubm9kZVR5cGUmJnAmJmQucmVsYXRpdmVbalsxXS50eXBlXSl7aWYoYj0oZC5maW5kLklEKGsubWF0Y2hlc1swXS5yZXBsYWNlKGNhLGRhKSxiKXx8W10pWzBdLCFiKXJldHVybiBlO24mJihiPWIucGFyZW50Tm9kZSksYT1hLnNsaWNlKGouc2hpZnQoKS52YWx1ZS5sZW5ndGgpfWk9WC5uZWVkc0NvbnRleHQudGVzdChhKT8wOmoubGVuZ3RoO3doaWxlKGktLSl7aWYoaz1qW2ldLGQucmVsYXRpdmVbbD1rLnR5cGVdKWJyZWFrO2lmKChtPWQuZmluZFtsXSkmJihmPW0oay5tYXRjaGVzWzBdLnJlcGxhY2UoY2EsZGEpLGFhLnRlc3QoalswXS50eXBlKSYmcGEoYi5wYXJlbnROb2RlKXx8YikpKXtpZihqLnNwbGljZShpLDEpLGE9Zi5sZW5ndGgmJnJhKGopLCFhKXJldHVybiBILmFwcGx5KGUsZiksZTticmVha319fXJldHVybihufHxoKGEsbykpKGYsYiwhcCxlLGFhLnRlc3QoYSkmJnBhKGIucGFyZW50Tm9kZSl8fGIpLGV9LGMuc29ydFN0YWJsZT11LnNwbGl0KFwiXCIpLnNvcnQoQikuam9pbihcIlwiKT09PXUsYy5kZXRlY3REdXBsaWNhdGVzPSEhbCxtKCksYy5zb3J0RGV0YWNoZWQ9amEoZnVuY3Rpb24oYSl7cmV0dXJuIDEmYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihuLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIikpfSksamEoZnVuY3Rpb24oYSl7cmV0dXJuIGEuaW5uZXJIVE1MPVwiPGEgaHJlZj0nIyc+PC9hPlwiLFwiI1wiPT09YS5maXJzdENoaWxkLmdldEF0dHJpYnV0ZShcImhyZWZcIil9KXx8a2EoXCJ0eXBlfGhyZWZ8aGVpZ2h0fHdpZHRoXCIsZnVuY3Rpb24oYSxiLGMpe3JldHVybiBjP3ZvaWQgMDphLmdldEF0dHJpYnV0ZShiLFwidHlwZVwiPT09Yi50b0xvd2VyQ2FzZSgpPzE6Mil9KSxjLmF0dHJpYnV0ZXMmJmphKGZ1bmN0aW9uKGEpe3JldHVybiBhLmlubmVySFRNTD1cIjxpbnB1dC8+XCIsYS5maXJzdENoaWxkLnNldEF0dHJpYnV0ZShcInZhbHVlXCIsXCJcIiksXCJcIj09PWEuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoXCJ2YWx1ZVwiKX0pfHxrYShcInZhbHVlXCIsZnVuY3Rpb24oYSxiLGMpe3JldHVybiBjfHxcImlucHV0XCIhPT1hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk/dm9pZCAwOmEuZGVmYXVsdFZhbHVlfSksamEoZnVuY3Rpb24oYSl7cmV0dXJuIG51bGw9PWEuZ2V0QXR0cmlidXRlKFwiZGlzYWJsZWRcIil9KXx8a2EoSyxmdW5jdGlvbihhLGIsYyl7dmFyIGQ7cmV0dXJuIGM/dm9pZCAwOmFbYl09PT0hMD9iLnRvTG93ZXJDYXNlKCk6KGQ9YS5nZXRBdHRyaWJ1dGVOb2RlKGIpKSYmZC5zcGVjaWZpZWQ/ZC52YWx1ZTpudWxsfSksZ2F9KGEpO24uZmluZD10LG4uZXhwcj10LnNlbGVjdG9ycyxuLmV4cHJbXCI6XCJdPW4uZXhwci5wc2V1ZG9zLG4udW5pcXVlPXQudW5pcXVlU29ydCxuLnRleHQ9dC5nZXRUZXh0LG4uaXNYTUxEb2M9dC5pc1hNTCxuLmNvbnRhaW5zPXQuY29udGFpbnM7dmFyIHU9bi5leHByLm1hdGNoLm5lZWRzQ29udGV4dCx2PS9ePChcXHcrKVxccypcXC8/Pig/OjxcXC9cXDE+fCkkLyx3PS9eLlteOiNcXFtcXC4sXSokLztmdW5jdGlvbiB4KGEsYixjKXtpZihuLmlzRnVuY3Rpb24oYikpcmV0dXJuIG4uZ3JlcChhLGZ1bmN0aW9uKGEsZCl7cmV0dXJuISFiLmNhbGwoYSxkLGEpIT09Y30pO2lmKGIubm9kZVR5cGUpcmV0dXJuIG4uZ3JlcChhLGZ1bmN0aW9uKGEpe3JldHVybiBhPT09YiE9PWN9KTtpZihcInN0cmluZ1wiPT10eXBlb2YgYil7aWYody50ZXN0KGIpKXJldHVybiBuLmZpbHRlcihiLGEsYyk7Yj1uLmZpbHRlcihiLGEpfXJldHVybiBuLmdyZXAoYSxmdW5jdGlvbihhKXtyZXR1cm4gZy5jYWxsKGIsYSk+PTAhPT1jfSl9bi5maWx0ZXI9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWJbMF07cmV0dXJuIGMmJihhPVwiOm5vdChcIithK1wiKVwiKSwxPT09Yi5sZW5ndGgmJjE9PT1kLm5vZGVUeXBlP24uZmluZC5tYXRjaGVzU2VsZWN0b3IoZCxhKT9bZF06W106bi5maW5kLm1hdGNoZXMoYSxuLmdyZXAoYixmdW5jdGlvbihhKXtyZXR1cm4gMT09PWEubm9kZVR5cGV9KSl9LG4uZm4uZXh0ZW5kKHtmaW5kOmZ1bmN0aW9uKGEpe3ZhciBiLGM9dGhpcy5sZW5ndGgsZD1bXSxlPXRoaXM7aWYoXCJzdHJpbmdcIiE9dHlwZW9mIGEpcmV0dXJuIHRoaXMucHVzaFN0YWNrKG4oYSkuZmlsdGVyKGZ1bmN0aW9uKCl7Zm9yKGI9MDtjPmI7YisrKWlmKG4uY29udGFpbnMoZVtiXSx0aGlzKSlyZXR1cm4hMH0pKTtmb3IoYj0wO2M+YjtiKyspbi5maW5kKGEsZVtiXSxkKTtyZXR1cm4gZD10aGlzLnB1c2hTdGFjayhjPjE/bi51bmlxdWUoZCk6ZCksZC5zZWxlY3Rvcj10aGlzLnNlbGVjdG9yP3RoaXMuc2VsZWN0b3IrXCIgXCIrYTphLGR9LGZpbHRlcjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soeCh0aGlzLGF8fFtdLCExKSl9LG5vdDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soeCh0aGlzLGF8fFtdLCEwKSl9LGlzOmZ1bmN0aW9uKGEpe3JldHVybiEheCh0aGlzLFwic3RyaW5nXCI9PXR5cGVvZiBhJiZ1LnRlc3QoYSk/bihhKTphfHxbXSwhMSkubGVuZ3RofX0pO3ZhciB5LHo9L14oPzpcXHMqKDxbXFx3XFxXXSs+KVtePl0qfCMoW1xcdy1dKikpJC8sQT1uLmZuLmluaXQ9ZnVuY3Rpb24oYSxiKXt2YXIgYyxkO2lmKCFhKXJldHVybiB0aGlzO2lmKFwic3RyaW5nXCI9PXR5cGVvZiBhKXtpZihjPVwiPFwiPT09YVswXSYmXCI+XCI9PT1hW2EubGVuZ3RoLTFdJiZhLmxlbmd0aD49Mz9bbnVsbCxhLG51bGxdOnouZXhlYyhhKSwhY3x8IWNbMV0mJmIpcmV0dXJuIWJ8fGIuanF1ZXJ5PyhifHx5KS5maW5kKGEpOnRoaXMuY29uc3RydWN0b3IoYikuZmluZChhKTtpZihjWzFdKXtpZihiPWIgaW5zdGFuY2VvZiBuP2JbMF06YixuLm1lcmdlKHRoaXMsbi5wYXJzZUhUTUwoY1sxXSxiJiZiLm5vZGVUeXBlP2Iub3duZXJEb2N1bWVudHx8YjpsLCEwKSksdi50ZXN0KGNbMV0pJiZuLmlzUGxhaW5PYmplY3QoYikpZm9yKGMgaW4gYiluLmlzRnVuY3Rpb24odGhpc1tjXSk/dGhpc1tjXShiW2NdKTp0aGlzLmF0dHIoYyxiW2NdKTtyZXR1cm4gdGhpc31yZXR1cm4gZD1sLmdldEVsZW1lbnRCeUlkKGNbMl0pLGQmJmQucGFyZW50Tm9kZSYmKHRoaXMubGVuZ3RoPTEsdGhpc1swXT1kKSx0aGlzLmNvbnRleHQ9bCx0aGlzLnNlbGVjdG9yPWEsdGhpc31yZXR1cm4gYS5ub2RlVHlwZT8odGhpcy5jb250ZXh0PXRoaXNbMF09YSx0aGlzLmxlbmd0aD0xLHRoaXMpOm4uaXNGdW5jdGlvbihhKT9cInVuZGVmaW5lZFwiIT10eXBlb2YgeS5yZWFkeT95LnJlYWR5KGEpOmEobik6KHZvaWQgMCE9PWEuc2VsZWN0b3ImJih0aGlzLnNlbGVjdG9yPWEuc2VsZWN0b3IsdGhpcy5jb250ZXh0PWEuY29udGV4dCksbi5tYWtlQXJyYXkoYSx0aGlzKSl9O0EucHJvdG90eXBlPW4uZm4seT1uKGwpO3ZhciBCPS9eKD86cGFyZW50c3xwcmV2KD86VW50aWx8QWxsKSkvLEM9e2NoaWxkcmVuOiEwLGNvbnRlbnRzOiEwLG5leHQ6ITAscHJldjohMH07bi5leHRlbmQoe2RpcjpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9W10sZT12b2lkIDAhPT1jO3doaWxlKChhPWFbYl0pJiY5IT09YS5ub2RlVHlwZSlpZigxPT09YS5ub2RlVHlwZSl7aWYoZSYmbihhKS5pcyhjKSlicmVhaztkLnB1c2goYSl9cmV0dXJuIGR9LHNpYmxpbmc6ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9W107YTthPWEubmV4dFNpYmxpbmcpMT09PWEubm9kZVR5cGUmJmEhPT1iJiZjLnB1c2goYSk7cmV0dXJuIGN9fSksbi5mbi5leHRlbmQoe2hhczpmdW5jdGlvbihhKXt2YXIgYj1uKGEsdGhpcyksYz1iLmxlbmd0aDtyZXR1cm4gdGhpcy5maWx0ZXIoZnVuY3Rpb24oKXtmb3IodmFyIGE9MDtjPmE7YSsrKWlmKG4uY29udGFpbnModGhpcyxiW2FdKSlyZXR1cm4hMH0pfSxjbG9zZXN0OmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjLGQ9MCxlPXRoaXMubGVuZ3RoLGY9W10sZz11LnRlc3QoYSl8fFwic3RyaW5nXCIhPXR5cGVvZiBhP24oYSxifHx0aGlzLmNvbnRleHQpOjA7ZT5kO2QrKylmb3IoYz10aGlzW2RdO2MmJmMhPT1iO2M9Yy5wYXJlbnROb2RlKWlmKGMubm9kZVR5cGU8MTEmJihnP2cuaW5kZXgoYyk+LTE6MT09PWMubm9kZVR5cGUmJm4uZmluZC5tYXRjaGVzU2VsZWN0b3IoYyxhKSkpe2YucHVzaChjKTticmVha31yZXR1cm4gdGhpcy5wdXNoU3RhY2soZi5sZW5ndGg+MT9uLnVuaXF1ZShmKTpmKX0saW5kZXg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/XCJzdHJpbmdcIj09dHlwZW9mIGE/Zy5jYWxsKG4oYSksdGhpc1swXSk6Zy5jYWxsKHRoaXMsYS5qcXVlcnk/YVswXTphKTp0aGlzWzBdJiZ0aGlzWzBdLnBhcmVudE5vZGU/dGhpcy5maXJzdCgpLnByZXZBbGwoKS5sZW5ndGg6LTF9LGFkZDpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLnB1c2hTdGFjayhuLnVuaXF1ZShuLm1lcmdlKHRoaXMuZ2V0KCksbihhLGIpKSkpfSxhZGRCYWNrOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmFkZChudWxsPT1hP3RoaXMucHJldk9iamVjdDp0aGlzLnByZXZPYmplY3QuZmlsdGVyKGEpKX19KTtmdW5jdGlvbiBEKGEsYil7d2hpbGUoKGE9YVtiXSkmJjEhPT1hLm5vZGVUeXBlKTtyZXR1cm4gYX1uLmVhY2goe3BhcmVudDpmdW5jdGlvbihhKXt2YXIgYj1hLnBhcmVudE5vZGU7cmV0dXJuIGImJjExIT09Yi5ub2RlVHlwZT9iOm51bGx9LHBhcmVudHM6ZnVuY3Rpb24oYSl7cmV0dXJuIG4uZGlyKGEsXCJwYXJlbnROb2RlXCIpfSxwYXJlbnRzVW50aWw6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBuLmRpcihhLFwicGFyZW50Tm9kZVwiLGMpfSxuZXh0OmZ1bmN0aW9uKGEpe3JldHVybiBEKGEsXCJuZXh0U2libGluZ1wiKX0scHJldjpmdW5jdGlvbihhKXtyZXR1cm4gRChhLFwicHJldmlvdXNTaWJsaW5nXCIpfSxuZXh0QWxsOmZ1bmN0aW9uKGEpe3JldHVybiBuLmRpcihhLFwibmV4dFNpYmxpbmdcIil9LHByZXZBbGw6ZnVuY3Rpb24oYSl7cmV0dXJuIG4uZGlyKGEsXCJwcmV2aW91c1NpYmxpbmdcIil9LG5leHRVbnRpbDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIG4uZGlyKGEsXCJuZXh0U2libGluZ1wiLGMpfSxwcmV2VW50aWw6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBuLmRpcihhLFwicHJldmlvdXNTaWJsaW5nXCIsYyl9LHNpYmxpbmdzOmZ1bmN0aW9uKGEpe3JldHVybiBuLnNpYmxpbmcoKGEucGFyZW50Tm9kZXx8e30pLmZpcnN0Q2hpbGQsYSl9LGNoaWxkcmVuOmZ1bmN0aW9uKGEpe3JldHVybiBuLnNpYmxpbmcoYS5maXJzdENoaWxkKX0sY29udGVudHM6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuY29udGVudERvY3VtZW50fHxuLm1lcmdlKFtdLGEuY2hpbGROb2Rlcyl9fSxmdW5jdGlvbihhLGIpe24uZm5bYV09ZnVuY3Rpb24oYyxkKXt2YXIgZT1uLm1hcCh0aGlzLGIsYyk7cmV0dXJuXCJVbnRpbFwiIT09YS5zbGljZSgtNSkmJihkPWMpLGQmJlwic3RyaW5nXCI9PXR5cGVvZiBkJiYoZT1uLmZpbHRlcihkLGUpKSx0aGlzLmxlbmd0aD4xJiYoQ1thXXx8bi51bmlxdWUoZSksQi50ZXN0KGEpJiZlLnJldmVyc2UoKSksdGhpcy5wdXNoU3RhY2soZSl9fSk7dmFyIEU9L1xcUysvZyxGPXt9O2Z1bmN0aW9uIEcoYSl7dmFyIGI9RlthXT17fTtyZXR1cm4gbi5lYWNoKGEubWF0Y2goRSl8fFtdLGZ1bmN0aW9uKGEsYyl7YltjXT0hMH0pLGJ9bi5DYWxsYmFja3M9ZnVuY3Rpb24oYSl7YT1cInN0cmluZ1wiPT10eXBlb2YgYT9GW2FdfHxHKGEpOm4uZXh0ZW5kKHt9LGEpO3ZhciBiLGMsZCxlLGYsZyxoPVtdLGk9IWEub25jZSYmW10saj1mdW5jdGlvbihsKXtmb3IoYj1hLm1lbW9yeSYmbCxjPSEwLGc9ZXx8MCxlPTAsZj1oLmxlbmd0aCxkPSEwO2gmJmY+ZztnKyspaWYoaFtnXS5hcHBseShsWzBdLGxbMV0pPT09ITEmJmEuc3RvcE9uRmFsc2Upe2I9ITE7YnJlYWt9ZD0hMSxoJiYoaT9pLmxlbmd0aCYmaihpLnNoaWZ0KCkpOmI/aD1bXTprLmRpc2FibGUoKSl9LGs9e2FkZDpmdW5jdGlvbigpe2lmKGgpe3ZhciBjPWgubGVuZ3RoOyFmdW5jdGlvbiBnKGIpe24uZWFjaChiLGZ1bmN0aW9uKGIsYyl7dmFyIGQ9bi50eXBlKGMpO1wiZnVuY3Rpb25cIj09PWQ/YS51bmlxdWUmJmsuaGFzKGMpfHxoLnB1c2goYyk6YyYmYy5sZW5ndGgmJlwic3RyaW5nXCIhPT1kJiZnKGMpfSl9KGFyZ3VtZW50cyksZD9mPWgubGVuZ3RoOmImJihlPWMsaihiKSl9cmV0dXJuIHRoaXN9LHJlbW92ZTpmdW5jdGlvbigpe3JldHVybiBoJiZuLmVhY2goYXJndW1lbnRzLGZ1bmN0aW9uKGEsYil7dmFyIGM7d2hpbGUoKGM9bi5pbkFycmF5KGIsaCxjKSk+LTEpaC5zcGxpY2UoYywxKSxkJiYoZj49YyYmZi0tLGc+PWMmJmctLSl9KSx0aGlzfSxoYXM6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/bi5pbkFycmF5KGEsaCk+LTE6ISghaHx8IWgubGVuZ3RoKX0sZW1wdHk6ZnVuY3Rpb24oKXtyZXR1cm4gaD1bXSxmPTAsdGhpc30sZGlzYWJsZTpmdW5jdGlvbigpe3JldHVybiBoPWk9Yj12b2lkIDAsdGhpc30sZGlzYWJsZWQ6ZnVuY3Rpb24oKXtyZXR1cm4haH0sbG9jazpmdW5jdGlvbigpe3JldHVybiBpPXZvaWQgMCxifHxrLmRpc2FibGUoKSx0aGlzfSxsb2NrZWQ6ZnVuY3Rpb24oKXtyZXR1cm4haX0sZmlyZVdpdGg6ZnVuY3Rpb24oYSxiKXtyZXR1cm4haHx8YyYmIWl8fChiPWJ8fFtdLGI9W2EsYi5zbGljZT9iLnNsaWNlKCk6Yl0sZD9pLnB1c2goYik6aihiKSksdGhpc30sZmlyZTpmdW5jdGlvbigpe3JldHVybiBrLmZpcmVXaXRoKHRoaXMsYXJndW1lbnRzKSx0aGlzfSxmaXJlZDpmdW5jdGlvbigpe3JldHVybiEhY319O3JldHVybiBrfSxuLmV4dGVuZCh7RGVmZXJyZWQ6ZnVuY3Rpb24oYSl7dmFyIGI9W1tcInJlc29sdmVcIixcImRvbmVcIixuLkNhbGxiYWNrcyhcIm9uY2UgbWVtb3J5XCIpLFwicmVzb2x2ZWRcIl0sW1wicmVqZWN0XCIsXCJmYWlsXCIsbi5DYWxsYmFja3MoXCJvbmNlIG1lbW9yeVwiKSxcInJlamVjdGVkXCJdLFtcIm5vdGlmeVwiLFwicHJvZ3Jlc3NcIixuLkNhbGxiYWNrcyhcIm1lbW9yeVwiKV1dLGM9XCJwZW5kaW5nXCIsZD17c3RhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gY30sYWx3YXlzOmZ1bmN0aW9uKCl7cmV0dXJuIGUuZG9uZShhcmd1bWVudHMpLmZhaWwoYXJndW1lbnRzKSx0aGlzfSx0aGVuOmZ1bmN0aW9uKCl7dmFyIGE9YXJndW1lbnRzO3JldHVybiBuLkRlZmVycmVkKGZ1bmN0aW9uKGMpe24uZWFjaChiLGZ1bmN0aW9uKGIsZil7dmFyIGc9bi5pc0Z1bmN0aW9uKGFbYl0pJiZhW2JdO2VbZlsxXV0oZnVuY3Rpb24oKXt2YXIgYT1nJiZnLmFwcGx5KHRoaXMsYXJndW1lbnRzKTthJiZuLmlzRnVuY3Rpb24oYS5wcm9taXNlKT9hLnByb21pc2UoKS5kb25lKGMucmVzb2x2ZSkuZmFpbChjLnJlamVjdCkucHJvZ3Jlc3MoYy5ub3RpZnkpOmNbZlswXStcIldpdGhcIl0odGhpcz09PWQ/Yy5wcm9taXNlKCk6dGhpcyxnP1thXTphcmd1bWVudHMpfSl9KSxhPW51bGx9KS5wcm9taXNlKCl9LHByb21pc2U6ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGwhPWE/bi5leHRlbmQoYSxkKTpkfX0sZT17fTtyZXR1cm4gZC5waXBlPWQudGhlbixuLmVhY2goYixmdW5jdGlvbihhLGYpe3ZhciBnPWZbMl0saD1mWzNdO2RbZlsxXV09Zy5hZGQsaCYmZy5hZGQoZnVuY3Rpb24oKXtjPWh9LGJbMV5hXVsyXS5kaXNhYmxlLGJbMl1bMl0ubG9jayksZVtmWzBdXT1mdW5jdGlvbigpe3JldHVybiBlW2ZbMF0rXCJXaXRoXCJdKHRoaXM9PT1lP2Q6dGhpcyxhcmd1bWVudHMpLHRoaXN9LGVbZlswXStcIldpdGhcIl09Zy5maXJlV2l0aH0pLGQucHJvbWlzZShlKSxhJiZhLmNhbGwoZSxlKSxlfSx3aGVuOmZ1bmN0aW9uKGEpe3ZhciBiPTAsYz1kLmNhbGwoYXJndW1lbnRzKSxlPWMubGVuZ3RoLGY9MSE9PWV8fGEmJm4uaXNGdW5jdGlvbihhLnByb21pc2UpP2U6MCxnPTE9PT1mP2E6bi5EZWZlcnJlZCgpLGg9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBmdW5jdGlvbihlKXtiW2FdPXRoaXMsY1thXT1hcmd1bWVudHMubGVuZ3RoPjE/ZC5jYWxsKGFyZ3VtZW50cyk6ZSxjPT09aT9nLm5vdGlmeVdpdGgoYixjKTotLWZ8fGcucmVzb2x2ZVdpdGgoYixjKX19LGksaixrO2lmKGU+MSlmb3IoaT1uZXcgQXJyYXkoZSksaj1uZXcgQXJyYXkoZSksaz1uZXcgQXJyYXkoZSk7ZT5iO2IrKyljW2JdJiZuLmlzRnVuY3Rpb24oY1tiXS5wcm9taXNlKT9jW2JdLnByb21pc2UoKS5kb25lKGgoYixrLGMpKS5mYWlsKGcucmVqZWN0KS5wcm9ncmVzcyhoKGIsaixpKSk6LS1mO3JldHVybiBmfHxnLnJlc29sdmVXaXRoKGssYyksZy5wcm9taXNlKCl9fSk7dmFyIEg7bi5mbi5yZWFkeT1mdW5jdGlvbihhKXtyZXR1cm4gbi5yZWFkeS5wcm9taXNlKCkuZG9uZShhKSx0aGlzfSxuLmV4dGVuZCh7aXNSZWFkeTohMSxyZWFkeVdhaXQ6MSxob2xkUmVhZHk6ZnVuY3Rpb24oYSl7YT9uLnJlYWR5V2FpdCsrOm4ucmVhZHkoITApfSxyZWFkeTpmdW5jdGlvbihhKXsoYT09PSEwPy0tbi5yZWFkeVdhaXQ6bi5pc1JlYWR5KXx8KG4uaXNSZWFkeT0hMCxhIT09ITAmJi0tbi5yZWFkeVdhaXQ+MHx8KEgucmVzb2x2ZVdpdGgobCxbbl0pLG4uZm4udHJpZ2dlckhhbmRsZXImJihuKGwpLnRyaWdnZXJIYW5kbGVyKFwicmVhZHlcIiksbihsKS5vZmYoXCJyZWFkeVwiKSkpKX19KTtmdW5jdGlvbiBJKCl7bC5yZW1vdmVFdmVudExpc3RlbmVyKFwiRE9NQ29udGVudExvYWRlZFwiLEksITEpLGEucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImxvYWRcIixJLCExKSxuLnJlYWR5KCl9bi5yZWFkeS5wcm9taXNlPWZ1bmN0aW9uKGIpe3JldHVybiBIfHwoSD1uLkRlZmVycmVkKCksXCJjb21wbGV0ZVwiPT09bC5yZWFkeVN0YXRlP3NldFRpbWVvdXQobi5yZWFkeSk6KGwuYWRkRXZlbnRMaXN0ZW5lcihcIkRPTUNvbnRlbnRMb2FkZWRcIixJLCExKSxhLmFkZEV2ZW50TGlzdGVuZXIoXCJsb2FkXCIsSSwhMSkpKSxILnByb21pc2UoYil9LG4ucmVhZHkucHJvbWlzZSgpO3ZhciBKPW4uYWNjZXNzPWZ1bmN0aW9uKGEsYixjLGQsZSxmLGcpe3ZhciBoPTAsaT1hLmxlbmd0aCxqPW51bGw9PWM7aWYoXCJvYmplY3RcIj09PW4udHlwZShjKSl7ZT0hMDtmb3IoaCBpbiBjKW4uYWNjZXNzKGEsYixoLGNbaF0sITAsZixnKX1lbHNlIGlmKHZvaWQgMCE9PWQmJihlPSEwLG4uaXNGdW5jdGlvbihkKXx8KGc9ITApLGomJihnPyhiLmNhbGwoYSxkKSxiPW51bGwpOihqPWIsYj1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIGouY2FsbChuKGEpLGMpfSkpLGIpKWZvcig7aT5oO2grKyliKGFbaF0sYyxnP2Q6ZC5jYWxsKGFbaF0saCxiKGFbaF0sYykpKTtyZXR1cm4gZT9hOmo/Yi5jYWxsKGEpOmk/YihhWzBdLGMpOmZ9O24uYWNjZXB0RGF0YT1mdW5jdGlvbihhKXtyZXR1cm4gMT09PWEubm9kZVR5cGV8fDk9PT1hLm5vZGVUeXBlfHwhK2Eubm9kZVR5cGV9O2Z1bmN0aW9uIEsoKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcy5jYWNoZT17fSwwLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm57fX19KSx0aGlzLmV4cGFuZG89bi5leHBhbmRvK0sudWlkKyt9Sy51aWQ9MSxLLmFjY2VwdHM9bi5hY2NlcHREYXRhLEsucHJvdG90eXBlPXtrZXk6ZnVuY3Rpb24oYSl7aWYoIUsuYWNjZXB0cyhhKSlyZXR1cm4gMDt2YXIgYj17fSxjPWFbdGhpcy5leHBhbmRvXTtpZighYyl7Yz1LLnVpZCsrO3RyeXtiW3RoaXMuZXhwYW5kb109e3ZhbHVlOmN9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGEsYil9Y2F0Y2goZCl7Ylt0aGlzLmV4cGFuZG9dPWMsbi5leHRlbmQoYSxiKX19cmV0dXJuIHRoaXMuY2FjaGVbY118fCh0aGlzLmNhY2hlW2NdPXt9KSxjfSxzZXQ6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGU9dGhpcy5rZXkoYSksZj10aGlzLmNhY2hlW2VdO2lmKFwic3RyaW5nXCI9PXR5cGVvZiBiKWZbYl09YztlbHNlIGlmKG4uaXNFbXB0eU9iamVjdChmKSluLmV4dGVuZCh0aGlzLmNhY2hlW2VdLGIpO2Vsc2UgZm9yKGQgaW4gYilmW2RdPWJbZF07cmV0dXJuIGZ9LGdldDpmdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMuY2FjaGVbdGhpcy5rZXkoYSldO3JldHVybiB2b2lkIDA9PT1iP2M6Y1tiXX0sYWNjZXNzOmZ1bmN0aW9uKGEsYixjKXt2YXIgZDtyZXR1cm4gdm9pZCAwPT09Ynx8YiYmXCJzdHJpbmdcIj09dHlwZW9mIGImJnZvaWQgMD09PWM/KGQ9dGhpcy5nZXQoYSxiKSx2b2lkIDAhPT1kP2Q6dGhpcy5nZXQoYSxuLmNhbWVsQ2FzZShiKSkpOih0aGlzLnNldChhLGIsYyksdm9pZCAwIT09Yz9jOmIpfSxyZW1vdmU6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGUsZj10aGlzLmtleShhKSxnPXRoaXMuY2FjaGVbZl07aWYodm9pZCAwPT09Yil0aGlzLmNhY2hlW2ZdPXt9O2Vsc2V7bi5pc0FycmF5KGIpP2Q9Yi5jb25jYXQoYi5tYXAobi5jYW1lbENhc2UpKTooZT1uLmNhbWVsQ2FzZShiKSxiIGluIGc/ZD1bYixlXTooZD1lLGQ9ZCBpbiBnP1tkXTpkLm1hdGNoKEUpfHxbXSkpLGM9ZC5sZW5ndGg7d2hpbGUoYy0tKWRlbGV0ZSBnW2RbY11dfX0saGFzRGF0YTpmdW5jdGlvbihhKXtyZXR1cm4hbi5pc0VtcHR5T2JqZWN0KHRoaXMuY2FjaGVbYVt0aGlzLmV4cGFuZG9dXXx8e30pfSxkaXNjYXJkOmZ1bmN0aW9uKGEpe2FbdGhpcy5leHBhbmRvXSYmZGVsZXRlIHRoaXMuY2FjaGVbYVt0aGlzLmV4cGFuZG9dXX19O3ZhciBMPW5ldyBLLE09bmV3IEssTj0vXig/Olxce1tcXHdcXFddKlxcfXxcXFtbXFx3XFxXXSpcXF0pJC8sTz0vKFtBLVpdKS9nO2Z1bmN0aW9uIFAoYSxiLGMpe3ZhciBkO2lmKHZvaWQgMD09PWMmJjE9PT1hLm5vZGVUeXBlKWlmKGQ9XCJkYXRhLVwiK2IucmVwbGFjZShPLFwiLSQxXCIpLnRvTG93ZXJDYXNlKCksYz1hLmdldEF0dHJpYnV0ZShkKSxcInN0cmluZ1wiPT10eXBlb2YgYyl7dHJ5e2M9XCJ0cnVlXCI9PT1jPyEwOlwiZmFsc2VcIj09PWM/ITE6XCJudWxsXCI9PT1jP251bGw6K2MrXCJcIj09PWM/K2M6Ti50ZXN0KGMpP24ucGFyc2VKU09OKGMpOmN9Y2F0Y2goZSl7fU0uc2V0KGEsYixjKX1lbHNlIGM9dm9pZCAwO3JldHVybiBjfW4uZXh0ZW5kKHtoYXNEYXRhOmZ1bmN0aW9uKGEpe3JldHVybiBNLmhhc0RhdGEoYSl8fEwuaGFzRGF0YShhKX0sZGF0YTpmdW5jdGlvbihhLGIsYyl7XG5yZXR1cm4gTS5hY2Nlc3MoYSxiLGMpfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGEsYil7TS5yZW1vdmUoYSxiKX0sX2RhdGE6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBMLmFjY2VzcyhhLGIsYyl9LF9yZW1vdmVEYXRhOmZ1bmN0aW9uKGEsYil7TC5yZW1vdmUoYSxiKX19KSxuLmZuLmV4dGVuZCh7ZGF0YTpmdW5jdGlvbihhLGIpe3ZhciBjLGQsZSxmPXRoaXNbMF0sZz1mJiZmLmF0dHJpYnV0ZXM7aWYodm9pZCAwPT09YSl7aWYodGhpcy5sZW5ndGgmJihlPU0uZ2V0KGYpLDE9PT1mLm5vZGVUeXBlJiYhTC5nZXQoZixcImhhc0RhdGFBdHRyc1wiKSkpe2M9Zy5sZW5ndGg7d2hpbGUoYy0tKWdbY10mJihkPWdbY10ubmFtZSwwPT09ZC5pbmRleE9mKFwiZGF0YS1cIikmJihkPW4uY2FtZWxDYXNlKGQuc2xpY2UoNSkpLFAoZixkLGVbZF0pKSk7TC5zZXQoZixcImhhc0RhdGFBdHRyc1wiLCEwKX1yZXR1cm4gZX1yZXR1cm5cIm9iamVjdFwiPT10eXBlb2YgYT90aGlzLmVhY2goZnVuY3Rpb24oKXtNLnNldCh0aGlzLGEpfSk6Sih0aGlzLGZ1bmN0aW9uKGIpe3ZhciBjLGQ9bi5jYW1lbENhc2UoYSk7aWYoZiYmdm9pZCAwPT09Yil7aWYoYz1NLmdldChmLGEpLHZvaWQgMCE9PWMpcmV0dXJuIGM7aWYoYz1NLmdldChmLGQpLHZvaWQgMCE9PWMpcmV0dXJuIGM7aWYoYz1QKGYsZCx2b2lkIDApLHZvaWQgMCE9PWMpcmV0dXJuIGN9ZWxzZSB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYz1NLmdldCh0aGlzLGQpO00uc2V0KHRoaXMsZCxiKSwtMSE9PWEuaW5kZXhPZihcIi1cIikmJnZvaWQgMCE9PWMmJk0uc2V0KHRoaXMsYSxiKX0pfSxudWxsLGIsYXJndW1lbnRzLmxlbmd0aD4xLG51bGwsITApfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtNLnJlbW92ZSh0aGlzLGEpfSl9fSksbi5leHRlbmQoe3F1ZXVlOmZ1bmN0aW9uKGEsYixjKXt2YXIgZDtyZXR1cm4gYT8oYj0oYnx8XCJmeFwiKStcInF1ZXVlXCIsZD1MLmdldChhLGIpLGMmJighZHx8bi5pc0FycmF5KGMpP2Q9TC5hY2Nlc3MoYSxiLG4ubWFrZUFycmF5KGMpKTpkLnB1c2goYykpLGR8fFtdKTp2b2lkIDB9LGRlcXVldWU6ZnVuY3Rpb24oYSxiKXtiPWJ8fFwiZnhcIjt2YXIgYz1uLnF1ZXVlKGEsYiksZD1jLmxlbmd0aCxlPWMuc2hpZnQoKSxmPW4uX3F1ZXVlSG9va3MoYSxiKSxnPWZ1bmN0aW9uKCl7bi5kZXF1ZXVlKGEsYil9O1wiaW5wcm9ncmVzc1wiPT09ZSYmKGU9Yy5zaGlmdCgpLGQtLSksZSYmKFwiZnhcIj09PWImJmMudW5zaGlmdChcImlucHJvZ3Jlc3NcIiksZGVsZXRlIGYuc3RvcCxlLmNhbGwoYSxnLGYpKSwhZCYmZiYmZi5lbXB0eS5maXJlKCl9LF9xdWV1ZUhvb2tzOmZ1bmN0aW9uKGEsYil7dmFyIGM9YitcInF1ZXVlSG9va3NcIjtyZXR1cm4gTC5nZXQoYSxjKXx8TC5hY2Nlc3MoYSxjLHtlbXB0eTpuLkNhbGxiYWNrcyhcIm9uY2UgbWVtb3J5XCIpLmFkZChmdW5jdGlvbigpe0wucmVtb3ZlKGEsW2IrXCJxdWV1ZVwiLGNdKX0pfSl9fSksbi5mbi5leHRlbmQoe3F1ZXVlOmZ1bmN0aW9uKGEsYil7dmFyIGM9MjtyZXR1cm5cInN0cmluZ1wiIT10eXBlb2YgYSYmKGI9YSxhPVwiZnhcIixjLS0pLGFyZ3VtZW50cy5sZW5ndGg8Yz9uLnF1ZXVlKHRoaXNbMF0sYSk6dm9pZCAwPT09Yj90aGlzOnRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBjPW4ucXVldWUodGhpcyxhLGIpO24uX3F1ZXVlSG9va3ModGhpcyxhKSxcImZ4XCI9PT1hJiZcImlucHJvZ3Jlc3NcIiE9PWNbMF0mJm4uZGVxdWV1ZSh0aGlzLGEpfSl9LGRlcXVldWU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe24uZGVxdWV1ZSh0aGlzLGEpfSl9LGNsZWFyUXVldWU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucXVldWUoYXx8XCJmeFwiLFtdKX0scHJvbWlzZTpmdW5jdGlvbihhLGIpe3ZhciBjLGQ9MSxlPW4uRGVmZXJyZWQoKSxmPXRoaXMsZz10aGlzLmxlbmd0aCxoPWZ1bmN0aW9uKCl7LS1kfHxlLnJlc29sdmVXaXRoKGYsW2ZdKX07XCJzdHJpbmdcIiE9dHlwZW9mIGEmJihiPWEsYT12b2lkIDApLGE9YXx8XCJmeFwiO3doaWxlKGctLSljPUwuZ2V0KGZbZ10sYStcInF1ZXVlSG9va3NcIiksYyYmYy5lbXB0eSYmKGQrKyxjLmVtcHR5LmFkZChoKSk7cmV0dXJuIGgoKSxlLnByb21pc2UoYil9fSk7dmFyIFE9L1srLV0/KD86XFxkKlxcLnwpXFxkKyg/OltlRV1bKy1dP1xcZCt8KS8uc291cmNlLFI9W1wiVG9wXCIsXCJSaWdodFwiLFwiQm90dG9tXCIsXCJMZWZ0XCJdLFM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYT1ifHxhLFwibm9uZVwiPT09bi5jc3MoYSxcImRpc3BsYXlcIil8fCFuLmNvbnRhaW5zKGEub3duZXJEb2N1bWVudCxhKX0sVD0vXig/OmNoZWNrYm94fHJhZGlvKSQvaTshZnVuY3Rpb24oKXt2YXIgYT1sLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxiPWEuYXBwZW5kQ2hpbGQobC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpKSxjPWwuY3JlYXRlRWxlbWVudChcImlucHV0XCIpO2Muc2V0QXR0cmlidXRlKFwidHlwZVwiLFwicmFkaW9cIiksYy5zZXRBdHRyaWJ1dGUoXCJjaGVja2VkXCIsXCJjaGVja2VkXCIpLGMuc2V0QXR0cmlidXRlKFwibmFtZVwiLFwidFwiKSxiLmFwcGVuZENoaWxkKGMpLGsuY2hlY2tDbG9uZT1iLmNsb25lTm9kZSghMCkuY2xvbmVOb2RlKCEwKS5sYXN0Q2hpbGQuY2hlY2tlZCxiLmlubmVySFRNTD1cIjx0ZXh0YXJlYT54PC90ZXh0YXJlYT5cIixrLm5vQ2xvbmVDaGVja2VkPSEhYi5jbG9uZU5vZGUoITApLmxhc3RDaGlsZC5kZWZhdWx0VmFsdWV9KCk7dmFyIFU9XCJ1bmRlZmluZWRcIjtrLmZvY3VzaW5CdWJibGVzPVwib25mb2N1c2luXCJpbiBhO3ZhciBWPS9ea2V5LyxXPS9eKD86bW91c2V8cG9pbnRlcnxjb250ZXh0bWVudSl8Y2xpY2svLFg9L14oPzpmb2N1c2luZm9jdXN8Zm9jdXNvdXRibHVyKSQvLFk9L14oW14uXSopKD86XFwuKC4rKXwpJC87ZnVuY3Rpb24gWigpe3JldHVybiEwfWZ1bmN0aW9uICQoKXtyZXR1cm4hMX1mdW5jdGlvbiBfKCl7dHJ5e3JldHVybiBsLmFjdGl2ZUVsZW1lbnR9Y2F0Y2goYSl7fX1uLmV2ZW50PXtnbG9iYWw6e30sYWRkOmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGYsZyxoLGksaixrLGwsbSxvLHAscSxyPUwuZ2V0KGEpO2lmKHIpe2MuaGFuZGxlciYmKGY9YyxjPWYuaGFuZGxlcixlPWYuc2VsZWN0b3IpLGMuZ3VpZHx8KGMuZ3VpZD1uLmd1aWQrKyksKGk9ci5ldmVudHMpfHwoaT1yLmV2ZW50cz17fSksKGc9ci5oYW5kbGUpfHwoZz1yLmhhbmRsZT1mdW5jdGlvbihiKXtyZXR1cm4gdHlwZW9mIG4hPT1VJiZuLmV2ZW50LnRyaWdnZXJlZCE9PWIudHlwZT9uLmV2ZW50LmRpc3BhdGNoLmFwcGx5KGEsYXJndW1lbnRzKTp2b2lkIDB9KSxiPShifHxcIlwiKS5tYXRjaChFKXx8W1wiXCJdLGo9Yi5sZW5ndGg7d2hpbGUoai0tKWg9WS5leGVjKGJbal0pfHxbXSxvPXE9aFsxXSxwPShoWzJdfHxcIlwiKS5zcGxpdChcIi5cIikuc29ydCgpLG8mJihsPW4uZXZlbnQuc3BlY2lhbFtvXXx8e30sbz0oZT9sLmRlbGVnYXRlVHlwZTpsLmJpbmRUeXBlKXx8byxsPW4uZXZlbnQuc3BlY2lhbFtvXXx8e30saz1uLmV4dGVuZCh7dHlwZTpvLG9yaWdUeXBlOnEsZGF0YTpkLGhhbmRsZXI6YyxndWlkOmMuZ3VpZCxzZWxlY3RvcjplLG5lZWRzQ29udGV4dDplJiZuLmV4cHIubWF0Y2gubmVlZHNDb250ZXh0LnRlc3QoZSksbmFtZXNwYWNlOnAuam9pbihcIi5cIil9LGYpLChtPWlbb10pfHwobT1pW29dPVtdLG0uZGVsZWdhdGVDb3VudD0wLGwuc2V0dXAmJmwuc2V0dXAuY2FsbChhLGQscCxnKSE9PSExfHxhLmFkZEV2ZW50TGlzdGVuZXImJmEuYWRkRXZlbnRMaXN0ZW5lcihvLGcsITEpKSxsLmFkZCYmKGwuYWRkLmNhbGwoYSxrKSxrLmhhbmRsZXIuZ3VpZHx8KGsuaGFuZGxlci5ndWlkPWMuZ3VpZCkpLGU/bS5zcGxpY2UobS5kZWxlZ2F0ZUNvdW50KyssMCxrKTptLnB1c2goayksbi5ldmVudC5nbG9iYWxbb109ITApfX0scmVtb3ZlOmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGYsZyxoLGksaixrLGwsbSxvLHAscSxyPUwuaGFzRGF0YShhKSYmTC5nZXQoYSk7aWYociYmKGk9ci5ldmVudHMpKXtiPShifHxcIlwiKS5tYXRjaChFKXx8W1wiXCJdLGo9Yi5sZW5ndGg7d2hpbGUoai0tKWlmKGg9WS5leGVjKGJbal0pfHxbXSxvPXE9aFsxXSxwPShoWzJdfHxcIlwiKS5zcGxpdChcIi5cIikuc29ydCgpLG8pe2w9bi5ldmVudC5zcGVjaWFsW29dfHx7fSxvPShkP2wuZGVsZWdhdGVUeXBlOmwuYmluZFR5cGUpfHxvLG09aVtvXXx8W10saD1oWzJdJiZuZXcgUmVnRXhwKFwiKF58XFxcXC4pXCIrcC5qb2luKFwiXFxcXC4oPzouKlxcXFwufClcIikrXCIoXFxcXC58JClcIiksZz1mPW0ubGVuZ3RoO3doaWxlKGYtLSlrPW1bZl0sIWUmJnEhPT1rLm9yaWdUeXBlfHxjJiZjLmd1aWQhPT1rLmd1aWR8fGgmJiFoLnRlc3Qoay5uYW1lc3BhY2UpfHxkJiZkIT09ay5zZWxlY3RvciYmKFwiKipcIiE9PWR8fCFrLnNlbGVjdG9yKXx8KG0uc3BsaWNlKGYsMSksay5zZWxlY3RvciYmbS5kZWxlZ2F0ZUNvdW50LS0sbC5yZW1vdmUmJmwucmVtb3ZlLmNhbGwoYSxrKSk7ZyYmIW0ubGVuZ3RoJiYobC50ZWFyZG93biYmbC50ZWFyZG93bi5jYWxsKGEscCxyLmhhbmRsZSkhPT0hMXx8bi5yZW1vdmVFdmVudChhLG8sci5oYW5kbGUpLGRlbGV0ZSBpW29dKX1lbHNlIGZvcihvIGluIGkpbi5ldmVudC5yZW1vdmUoYSxvK2Jbal0sYyxkLCEwKTtuLmlzRW1wdHlPYmplY3QoaSkmJihkZWxldGUgci5oYW5kbGUsTC5yZW1vdmUoYSxcImV2ZW50c1wiKSl9fSx0cmlnZ2VyOmZ1bmN0aW9uKGIsYyxkLGUpe3ZhciBmLGcsaCxpLGssbSxvLHA9W2R8fGxdLHE9ai5jYWxsKGIsXCJ0eXBlXCIpP2IudHlwZTpiLHI9ai5jYWxsKGIsXCJuYW1lc3BhY2VcIik/Yi5uYW1lc3BhY2Uuc3BsaXQoXCIuXCIpOltdO2lmKGc9aD1kPWR8fGwsMyE9PWQubm9kZVR5cGUmJjghPT1kLm5vZGVUeXBlJiYhWC50ZXN0KHErbi5ldmVudC50cmlnZ2VyZWQpJiYocS5pbmRleE9mKFwiLlwiKT49MCYmKHI9cS5zcGxpdChcIi5cIikscT1yLnNoaWZ0KCksci5zb3J0KCkpLGs9cS5pbmRleE9mKFwiOlwiKTwwJiZcIm9uXCIrcSxiPWJbbi5leHBhbmRvXT9iOm5ldyBuLkV2ZW50KHEsXCJvYmplY3RcIj09dHlwZW9mIGImJmIpLGIuaXNUcmlnZ2VyPWU/MjozLGIubmFtZXNwYWNlPXIuam9pbihcIi5cIiksYi5uYW1lc3BhY2VfcmU9Yi5uYW1lc3BhY2U/bmV3IFJlZ0V4cChcIihefFxcXFwuKVwiK3Iuam9pbihcIlxcXFwuKD86LipcXFxcLnwpXCIpK1wiKFxcXFwufCQpXCIpOm51bGwsYi5yZXN1bHQ9dm9pZCAwLGIudGFyZ2V0fHwoYi50YXJnZXQ9ZCksYz1udWxsPT1jP1tiXTpuLm1ha2VBcnJheShjLFtiXSksbz1uLmV2ZW50LnNwZWNpYWxbcV18fHt9LGV8fCFvLnRyaWdnZXJ8fG8udHJpZ2dlci5hcHBseShkLGMpIT09ITEpKXtpZighZSYmIW8ubm9CdWJibGUmJiFuLmlzV2luZG93KGQpKXtmb3IoaT1vLmRlbGVnYXRlVHlwZXx8cSxYLnRlc3QoaStxKXx8KGc9Zy5wYXJlbnROb2RlKTtnO2c9Zy5wYXJlbnROb2RlKXAucHVzaChnKSxoPWc7aD09PShkLm93bmVyRG9jdW1lbnR8fGwpJiZwLnB1c2goaC5kZWZhdWx0Vmlld3x8aC5wYXJlbnRXaW5kb3d8fGEpfWY9MDt3aGlsZSgoZz1wW2YrK10pJiYhYi5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKWIudHlwZT1mPjE/aTpvLmJpbmRUeXBlfHxxLG09KEwuZ2V0KGcsXCJldmVudHNcIil8fHt9KVtiLnR5cGVdJiZMLmdldChnLFwiaGFuZGxlXCIpLG0mJm0uYXBwbHkoZyxjKSxtPWsmJmdba10sbSYmbS5hcHBseSYmbi5hY2NlcHREYXRhKGcpJiYoYi5yZXN1bHQ9bS5hcHBseShnLGMpLGIucmVzdWx0PT09ITEmJmIucHJldmVudERlZmF1bHQoKSk7cmV0dXJuIGIudHlwZT1xLGV8fGIuaXNEZWZhdWx0UHJldmVudGVkKCl8fG8uX2RlZmF1bHQmJm8uX2RlZmF1bHQuYXBwbHkocC5wb3AoKSxjKSE9PSExfHwhbi5hY2NlcHREYXRhKGQpfHxrJiZuLmlzRnVuY3Rpb24oZFtxXSkmJiFuLmlzV2luZG93KGQpJiYoaD1kW2tdLGgmJihkW2tdPW51bGwpLG4uZXZlbnQudHJpZ2dlcmVkPXEsZFtxXSgpLG4uZXZlbnQudHJpZ2dlcmVkPXZvaWQgMCxoJiYoZFtrXT1oKSksYi5yZXN1bHR9fSxkaXNwYXRjaDpmdW5jdGlvbihhKXthPW4uZXZlbnQuZml4KGEpO3ZhciBiLGMsZSxmLGcsaD1bXSxpPWQuY2FsbChhcmd1bWVudHMpLGo9KEwuZ2V0KHRoaXMsXCJldmVudHNcIil8fHt9KVthLnR5cGVdfHxbXSxrPW4uZXZlbnQuc3BlY2lhbFthLnR5cGVdfHx7fTtpZihpWzBdPWEsYS5kZWxlZ2F0ZVRhcmdldD10aGlzLCFrLnByZURpc3BhdGNofHxrLnByZURpc3BhdGNoLmNhbGwodGhpcyxhKSE9PSExKXtoPW4uZXZlbnQuaGFuZGxlcnMuY2FsbCh0aGlzLGEsaiksYj0wO3doaWxlKChmPWhbYisrXSkmJiFhLmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpe2EuY3VycmVudFRhcmdldD1mLmVsZW0sYz0wO3doaWxlKChnPWYuaGFuZGxlcnNbYysrXSkmJiFhLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKCkpKCFhLm5hbWVzcGFjZV9yZXx8YS5uYW1lc3BhY2VfcmUudGVzdChnLm5hbWVzcGFjZSkpJiYoYS5oYW5kbGVPYmo9ZyxhLmRhdGE9Zy5kYXRhLGU9KChuLmV2ZW50LnNwZWNpYWxbZy5vcmlnVHlwZV18fHt9KS5oYW5kbGV8fGcuaGFuZGxlcikuYXBwbHkoZi5lbGVtLGkpLHZvaWQgMCE9PWUmJihhLnJlc3VsdD1lKT09PSExJiYoYS5wcmV2ZW50RGVmYXVsdCgpLGEuc3RvcFByb3BhZ2F0aW9uKCkpKX1yZXR1cm4gay5wb3N0RGlzcGF0Y2gmJmsucG9zdERpc3BhdGNoLmNhbGwodGhpcyxhKSxhLnJlc3VsdH19LGhhbmRsZXJzOmZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlLGYsZz1bXSxoPWIuZGVsZWdhdGVDb3VudCxpPWEudGFyZ2V0O2lmKGgmJmkubm9kZVR5cGUmJighYS5idXR0b258fFwiY2xpY2tcIiE9PWEudHlwZSkpZm9yKDtpIT09dGhpcztpPWkucGFyZW50Tm9kZXx8dGhpcylpZihpLmRpc2FibGVkIT09ITB8fFwiY2xpY2tcIiE9PWEudHlwZSl7Zm9yKGQ9W10sYz0wO2g+YztjKyspZj1iW2NdLGU9Zi5zZWxlY3RvcitcIiBcIix2b2lkIDA9PT1kW2VdJiYoZFtlXT1mLm5lZWRzQ29udGV4dD9uKGUsdGhpcykuaW5kZXgoaSk+PTA6bi5maW5kKGUsdGhpcyxudWxsLFtpXSkubGVuZ3RoKSxkW2VdJiZkLnB1c2goZik7ZC5sZW5ndGgmJmcucHVzaCh7ZWxlbTppLGhhbmRsZXJzOmR9KX1yZXR1cm4gaDxiLmxlbmd0aCYmZy5wdXNoKHtlbGVtOnRoaXMsaGFuZGxlcnM6Yi5zbGljZShoKX0pLGd9LHByb3BzOlwiYWx0S2V5IGJ1YmJsZXMgY2FuY2VsYWJsZSBjdHJsS2V5IGN1cnJlbnRUYXJnZXQgZXZlbnRQaGFzZSBtZXRhS2V5IHJlbGF0ZWRUYXJnZXQgc2hpZnRLZXkgdGFyZ2V0IHRpbWVTdGFtcCB2aWV3IHdoaWNoXCIuc3BsaXQoXCIgXCIpLGZpeEhvb2tzOnt9LGtleUhvb2tzOntwcm9wczpcImNoYXIgY2hhckNvZGUga2V5IGtleUNvZGVcIi5zcGxpdChcIiBcIiksZmlsdGVyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIG51bGw9PWEud2hpY2gmJihhLndoaWNoPW51bGwhPWIuY2hhckNvZGU/Yi5jaGFyQ29kZTpiLmtleUNvZGUpLGF9fSxtb3VzZUhvb2tzOntwcm9wczpcImJ1dHRvbiBidXR0b25zIGNsaWVudFggY2xpZW50WSBvZmZzZXRYIG9mZnNldFkgcGFnZVggcGFnZVkgc2NyZWVuWCBzY3JlZW5ZIHRvRWxlbWVudFwiLnNwbGl0KFwiIFwiKSxmaWx0ZXI6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGUsZj1iLmJ1dHRvbjtyZXR1cm4gbnVsbD09YS5wYWdlWCYmbnVsbCE9Yi5jbGllbnRYJiYoYz1hLnRhcmdldC5vd25lckRvY3VtZW50fHxsLGQ9Yy5kb2N1bWVudEVsZW1lbnQsZT1jLmJvZHksYS5wYWdlWD1iLmNsaWVudFgrKGQmJmQuc2Nyb2xsTGVmdHx8ZSYmZS5zY3JvbGxMZWZ0fHwwKS0oZCYmZC5jbGllbnRMZWZ0fHxlJiZlLmNsaWVudExlZnR8fDApLGEucGFnZVk9Yi5jbGllbnRZKyhkJiZkLnNjcm9sbFRvcHx8ZSYmZS5zY3JvbGxUb3B8fDApLShkJiZkLmNsaWVudFRvcHx8ZSYmZS5jbGllbnRUb3B8fDApKSxhLndoaWNofHx2b2lkIDA9PT1mfHwoYS53aGljaD0xJmY/MToyJmY/Mzo0JmY/MjowKSxhfX0sZml4OmZ1bmN0aW9uKGEpe2lmKGFbbi5leHBhbmRvXSlyZXR1cm4gYTt2YXIgYixjLGQsZT1hLnR5cGUsZj1hLGc9dGhpcy5maXhIb29rc1tlXTtnfHwodGhpcy5maXhIb29rc1tlXT1nPVcudGVzdChlKT90aGlzLm1vdXNlSG9va3M6Vi50ZXN0KGUpP3RoaXMua2V5SG9va3M6e30pLGQ9Zy5wcm9wcz90aGlzLnByb3BzLmNvbmNhdChnLnByb3BzKTp0aGlzLnByb3BzLGE9bmV3IG4uRXZlbnQoZiksYj1kLmxlbmd0aDt3aGlsZShiLS0pYz1kW2JdLGFbY109ZltjXTtyZXR1cm4gYS50YXJnZXR8fChhLnRhcmdldD1sKSwzPT09YS50YXJnZXQubm9kZVR5cGUmJihhLnRhcmdldD1hLnRhcmdldC5wYXJlbnROb2RlKSxnLmZpbHRlcj9nLmZpbHRlcihhLGYpOmF9LHNwZWNpYWw6e2xvYWQ6e25vQnViYmxlOiEwfSxmb2N1czp7dHJpZ2dlcjpmdW5jdGlvbigpe3JldHVybiB0aGlzIT09XygpJiZ0aGlzLmZvY3VzPyh0aGlzLmZvY3VzKCksITEpOnZvaWQgMH0sZGVsZWdhdGVUeXBlOlwiZm9jdXNpblwifSxibHVyOnt0cmlnZ2VyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXM9PT1fKCkmJnRoaXMuYmx1cj8odGhpcy5ibHVyKCksITEpOnZvaWQgMH0sZGVsZWdhdGVUeXBlOlwiZm9jdXNvdXRcIn0sY2xpY2s6e3RyaWdnZXI6ZnVuY3Rpb24oKXtyZXR1cm5cImNoZWNrYm94XCI9PT10aGlzLnR5cGUmJnRoaXMuY2xpY2smJm4ubm9kZU5hbWUodGhpcyxcImlucHV0XCIpPyh0aGlzLmNsaWNrKCksITEpOnZvaWQgMH0sX2RlZmF1bHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIG4ubm9kZU5hbWUoYS50YXJnZXQsXCJhXCIpfX0sYmVmb3JldW5sb2FkOntwb3N0RGlzcGF0Y2g6ZnVuY3Rpb24oYSl7dm9pZCAwIT09YS5yZXN1bHQmJmEub3JpZ2luYWxFdmVudCYmKGEub3JpZ2luYWxFdmVudC5yZXR1cm5WYWx1ZT1hLnJlc3VsdCl9fX0sc2ltdWxhdGU6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9bi5leHRlbmQobmV3IG4uRXZlbnQsYyx7dHlwZTphLGlzU2ltdWxhdGVkOiEwLG9yaWdpbmFsRXZlbnQ6e319KTtkP24uZXZlbnQudHJpZ2dlcihlLG51bGwsYik6bi5ldmVudC5kaXNwYXRjaC5jYWxsKGIsZSksZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSYmYy5wcmV2ZW50RGVmYXVsdCgpfX0sbi5yZW1vdmVFdmVudD1mdW5jdGlvbihhLGIsYyl7YS5yZW1vdmVFdmVudExpc3RlbmVyJiZhLnJlbW92ZUV2ZW50TGlzdGVuZXIoYixjLCExKX0sbi5FdmVudD1mdW5jdGlvbihhLGIpe3JldHVybiB0aGlzIGluc3RhbmNlb2Ygbi5FdmVudD8oYSYmYS50eXBlPyh0aGlzLm9yaWdpbmFsRXZlbnQ9YSx0aGlzLnR5cGU9YS50eXBlLHRoaXMuaXNEZWZhdWx0UHJldmVudGVkPWEuZGVmYXVsdFByZXZlbnRlZHx8dm9pZCAwPT09YS5kZWZhdWx0UHJldmVudGVkJiZhLnJldHVyblZhbHVlPT09ITE/WjokKTp0aGlzLnR5cGU9YSxiJiZuLmV4dGVuZCh0aGlzLGIpLHRoaXMudGltZVN0YW1wPWEmJmEudGltZVN0YW1wfHxuLm5vdygpLHZvaWQodGhpc1tuLmV4cGFuZG9dPSEwKSk6bmV3IG4uRXZlbnQoYSxiKX0sbi5FdmVudC5wcm90b3R5cGU9e2lzRGVmYXVsdFByZXZlbnRlZDokLGlzUHJvcGFnYXRpb25TdG9wcGVkOiQsaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ6JCxwcmV2ZW50RGVmYXVsdDpmdW5jdGlvbigpe3ZhciBhPXRoaXMub3JpZ2luYWxFdmVudDt0aGlzLmlzRGVmYXVsdFByZXZlbnRlZD1aLGEmJmEucHJldmVudERlZmF1bHQmJmEucHJldmVudERlZmF1bHQoKX0sc3RvcFByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQ9WixhJiZhLnN0b3BQcm9wYWdhdGlvbiYmYS5zdG9wUHJvcGFnYXRpb24oKX0sc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ9WixhJiZhLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbiYmYS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSx0aGlzLnN0b3BQcm9wYWdhdGlvbigpfX0sbi5lYWNoKHttb3VzZWVudGVyOlwibW91c2VvdmVyXCIsbW91c2VsZWF2ZTpcIm1vdXNlb3V0XCIscG9pbnRlcmVudGVyOlwicG9pbnRlcm92ZXJcIixwb2ludGVybGVhdmU6XCJwb2ludGVyb3V0XCJ9LGZ1bmN0aW9uKGEsYil7bi5ldmVudC5zcGVjaWFsW2FdPXtkZWxlZ2F0ZVR5cGU6YixiaW5kVHlwZTpiLGhhbmRsZTpmdW5jdGlvbihhKXt2YXIgYyxkPXRoaXMsZT1hLnJlbGF0ZWRUYXJnZXQsZj1hLmhhbmRsZU9iajtyZXR1cm4oIWV8fGUhPT1kJiYhbi5jb250YWlucyhkLGUpKSYmKGEudHlwZT1mLm9yaWdUeXBlLGM9Zi5oYW5kbGVyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxhLnR5cGU9YiksY319fSksay5mb2N1c2luQnViYmxlc3x8bi5lYWNoKHtmb2N1czpcImZvY3VzaW5cIixibHVyOlwiZm9jdXNvdXRcIn0sZnVuY3Rpb24oYSxiKXt2YXIgYz1mdW5jdGlvbihhKXtuLmV2ZW50LnNpbXVsYXRlKGIsYS50YXJnZXQsbi5ldmVudC5maXgoYSksITApfTtuLmV2ZW50LnNwZWNpYWxbYl09e3NldHVwOmZ1bmN0aW9uKCl7dmFyIGQ9dGhpcy5vd25lckRvY3VtZW50fHx0aGlzLGU9TC5hY2Nlc3MoZCxiKTtlfHxkLmFkZEV2ZW50TGlzdGVuZXIoYSxjLCEwKSxMLmFjY2VzcyhkLGIsKGV8fDApKzEpfSx0ZWFyZG93bjpmdW5jdGlvbigpe3ZhciBkPXRoaXMub3duZXJEb2N1bWVudHx8dGhpcyxlPUwuYWNjZXNzKGQsYiktMTtlP0wuYWNjZXNzKGQsYixlKTooZC5yZW1vdmVFdmVudExpc3RlbmVyKGEsYywhMCksTC5yZW1vdmUoZCxiKSl9fX0pLG4uZm4uZXh0ZW5kKHtvbjpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmLGc7aWYoXCJvYmplY3RcIj09dHlwZW9mIGEpe1wic3RyaW5nXCIhPXR5cGVvZiBiJiYoYz1jfHxiLGI9dm9pZCAwKTtmb3IoZyBpbiBhKXRoaXMub24oZyxiLGMsYVtnXSxlKTtyZXR1cm4gdGhpc31pZihudWxsPT1jJiZudWxsPT1kPyhkPWIsYz1iPXZvaWQgMCk6bnVsbD09ZCYmKFwic3RyaW5nXCI9PXR5cGVvZiBiPyhkPWMsYz12b2lkIDApOihkPWMsYz1iLGI9dm9pZCAwKSksZD09PSExKWQ9JDtlbHNlIGlmKCFkKXJldHVybiB0aGlzO3JldHVybiAxPT09ZSYmKGY9ZCxkPWZ1bmN0aW9uKGEpe3JldHVybiBuKCkub2ZmKGEpLGYuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxkLmd1aWQ9Zi5ndWlkfHwoZi5ndWlkPW4uZ3VpZCsrKSksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7bi5ldmVudC5hZGQodGhpcyxhLGQsYyxiKX0pfSxvbmU6ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIHRoaXMub24oYSxiLGMsZCwxKX0sb2ZmOmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlO2lmKGEmJmEucHJldmVudERlZmF1bHQmJmEuaGFuZGxlT2JqKXJldHVybiBkPWEuaGFuZGxlT2JqLG4oYS5kZWxlZ2F0ZVRhcmdldCkub2ZmKGQubmFtZXNwYWNlP2Qub3JpZ1R5cGUrXCIuXCIrZC5uYW1lc3BhY2U6ZC5vcmlnVHlwZSxkLnNlbGVjdG9yLGQuaGFuZGxlciksdGhpcztpZihcIm9iamVjdFwiPT10eXBlb2YgYSl7Zm9yKGUgaW4gYSl0aGlzLm9mZihlLGIsYVtlXSk7cmV0dXJuIHRoaXN9cmV0dXJuKGI9PT0hMXx8XCJmdW5jdGlvblwiPT10eXBlb2YgYikmJihjPWIsYj12b2lkIDApLGM9PT0hMSYmKGM9JCksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7bi5ldmVudC5yZW1vdmUodGhpcyxhLGMsYil9KX0sdHJpZ2dlcjpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtuLmV2ZW50LnRyaWdnZXIoYSxiLHRoaXMpfSl9LHRyaWdnZXJIYW5kbGVyOmZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpc1swXTtyZXR1cm4gYz9uLmV2ZW50LnRyaWdnZXIoYSxiLGMsITApOnZvaWQgMH19KTt2YXIgYWE9LzwoPyFhcmVhfGJyfGNvbHxlbWJlZHxocnxpbWd8aW5wdXR8bGlua3xtZXRhfHBhcmFtKSgoW1xcdzpdKylbXj5dKilcXC8+L2dpLGJhPS88KFtcXHc6XSspLyxjYT0vPHwmIz9cXHcrOy8sZGE9LzwoPzpzY3JpcHR8c3R5bGV8bGluaykvaSxlYT0vY2hlY2tlZFxccyooPzpbXj1dfD1cXHMqLmNoZWNrZWQuKS9pLGZhPS9eJHxcXC8oPzpqYXZhfGVjbWEpc2NyaXB0L2ksZ2E9L150cnVlXFwvKC4qKS8saGE9L15cXHMqPCEoPzpcXFtDREFUQVxcW3wtLSl8KD86XFxdXFxdfC0tKT5cXHMqJC9nLGlhPXtvcHRpb246WzEsXCI8c2VsZWN0IG11bHRpcGxlPSdtdWx0aXBsZSc+XCIsXCI8L3NlbGVjdD5cIl0sdGhlYWQ6WzEsXCI8dGFibGU+XCIsXCI8L3RhYmxlPlwiXSxjb2w6WzIsXCI8dGFibGU+PGNvbGdyb3VwPlwiLFwiPC9jb2xncm91cD48L3RhYmxlPlwiXSx0cjpbMixcIjx0YWJsZT48dGJvZHk+XCIsXCI8L3Rib2R5PjwvdGFibGU+XCJdLHRkOlszLFwiPHRhYmxlPjx0Ym9keT48dHI+XCIsXCI8L3RyPjwvdGJvZHk+PC90YWJsZT5cIl0sX2RlZmF1bHQ6WzAsXCJcIixcIlwiXX07aWEub3B0Z3JvdXA9aWEub3B0aW9uLGlhLnRib2R5PWlhLnRmb290PWlhLmNvbGdyb3VwPWlhLmNhcHRpb249aWEudGhlYWQsaWEudGg9aWEudGQ7ZnVuY3Rpb24gamEoYSxiKXtyZXR1cm4gbi5ub2RlTmFtZShhLFwidGFibGVcIikmJm4ubm9kZU5hbWUoMTEhPT1iLm5vZGVUeXBlP2I6Yi5maXJzdENoaWxkLFwidHJcIik/YS5nZXRFbGVtZW50c0J5VGFnTmFtZShcInRib2R5XCIpWzBdfHxhLmFwcGVuZENoaWxkKGEub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGJvZHlcIikpOmF9ZnVuY3Rpb24ga2EoYSl7cmV0dXJuIGEudHlwZT0obnVsbCE9PWEuZ2V0QXR0cmlidXRlKFwidHlwZVwiKSkrXCIvXCIrYS50eXBlLGF9ZnVuY3Rpb24gbGEoYSl7dmFyIGI9Z2EuZXhlYyhhLnR5cGUpO3JldHVybiBiP2EudHlwZT1iWzFdOmEucmVtb3ZlQXR0cmlidXRlKFwidHlwZVwiKSxhfWZ1bmN0aW9uIG1hKGEsYil7Zm9yKHZhciBjPTAsZD1hLmxlbmd0aDtkPmM7YysrKUwuc2V0KGFbY10sXCJnbG9iYWxFdmFsXCIsIWJ8fEwuZ2V0KGJbY10sXCJnbG9iYWxFdmFsXCIpKX1mdW5jdGlvbiBuYShhLGIpe3ZhciBjLGQsZSxmLGcsaCxpLGo7aWYoMT09PWIubm9kZVR5cGUpe2lmKEwuaGFzRGF0YShhKSYmKGY9TC5hY2Nlc3MoYSksZz1MLnNldChiLGYpLGo9Zi5ldmVudHMpKXtkZWxldGUgZy5oYW5kbGUsZy5ldmVudHM9e307Zm9yKGUgaW4gailmb3IoYz0wLGQ9altlXS5sZW5ndGg7ZD5jO2MrKyluLmV2ZW50LmFkZChiLGUsaltlXVtjXSl9TS5oYXNEYXRhKGEpJiYoaD1NLmFjY2VzcyhhKSxpPW4uZXh0ZW5kKHt9LGgpLE0uc2V0KGIsaSkpfX1mdW5jdGlvbiBvYShhLGIpe3ZhciBjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWU/YS5nZXRFbGVtZW50c0J5VGFnTmFtZShifHxcIipcIik6YS5xdWVyeVNlbGVjdG9yQWxsP2EucXVlcnlTZWxlY3RvckFsbChifHxcIipcIik6W107cmV0dXJuIHZvaWQgMD09PWJ8fGImJm4ubm9kZU5hbWUoYSxiKT9uLm1lcmdlKFthXSxjKTpjfWZ1bmN0aW9uIHBhKGEsYil7dmFyIGM9Yi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1wiaW5wdXRcIj09PWMmJlQudGVzdChhLnR5cGUpP2IuY2hlY2tlZD1hLmNoZWNrZWQ6KFwiaW5wdXRcIj09PWN8fFwidGV4dGFyZWFcIj09PWMpJiYoYi5kZWZhdWx0VmFsdWU9YS5kZWZhdWx0VmFsdWUpfW4uZXh0ZW5kKHtjbG9uZTpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmLGcsaD1hLmNsb25lTm9kZSghMCksaT1uLmNvbnRhaW5zKGEub3duZXJEb2N1bWVudCxhKTtpZighKGsubm9DbG9uZUNoZWNrZWR8fDEhPT1hLm5vZGVUeXBlJiYxMSE9PWEubm9kZVR5cGV8fG4uaXNYTUxEb2MoYSkpKWZvcihnPW9hKGgpLGY9b2EoYSksZD0wLGU9Zi5sZW5ndGg7ZT5kO2QrKylwYShmW2RdLGdbZF0pO2lmKGIpaWYoYylmb3IoZj1mfHxvYShhKSxnPWd8fG9hKGgpLGQ9MCxlPWYubGVuZ3RoO2U+ZDtkKyspbmEoZltkXSxnW2RdKTtlbHNlIG5hKGEsaCk7cmV0dXJuIGc9b2EoaCxcInNjcmlwdFwiKSxnLmxlbmd0aD4wJiZtYShnLCFpJiZvYShhLFwic2NyaXB0XCIpKSxofSxidWlsZEZyYWdtZW50OmZ1bmN0aW9uKGEsYixjLGQpe2Zvcih2YXIgZSxmLGcsaCxpLGosaz1iLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxsPVtdLG09MCxvPWEubGVuZ3RoO28+bTttKyspaWYoZT1hW21dLGV8fDA9PT1lKWlmKFwib2JqZWN0XCI9PT1uLnR5cGUoZSkpbi5tZXJnZShsLGUubm9kZVR5cGU/W2VdOmUpO2Vsc2UgaWYoY2EudGVzdChlKSl7Zj1mfHxrLmFwcGVuZENoaWxkKGIuY3JlYXRlRWxlbWVudChcImRpdlwiKSksZz0oYmEuZXhlYyhlKXx8W1wiXCIsXCJcIl0pWzFdLnRvTG93ZXJDYXNlKCksaD1pYVtnXXx8aWEuX2RlZmF1bHQsZi5pbm5lckhUTUw9aFsxXStlLnJlcGxhY2UoYWEsXCI8JDE+PC8kMj5cIikraFsyXSxqPWhbMF07d2hpbGUoai0tKWY9Zi5sYXN0Q2hpbGQ7bi5tZXJnZShsLGYuY2hpbGROb2RlcyksZj1rLmZpcnN0Q2hpbGQsZi50ZXh0Q29udGVudD1cIlwifWVsc2UgbC5wdXNoKGIuY3JlYXRlVGV4dE5vZGUoZSkpO2sudGV4dENvbnRlbnQ9XCJcIixtPTA7d2hpbGUoZT1sW20rK10paWYoKCFkfHwtMT09PW4uaW5BcnJheShlLGQpKSYmKGk9bi5jb250YWlucyhlLm93bmVyRG9jdW1lbnQsZSksZj1vYShrLmFwcGVuZENoaWxkKGUpLFwic2NyaXB0XCIpLGkmJm1hKGYpLGMpKXtqPTA7d2hpbGUoZT1mW2orK10pZmEudGVzdChlLnR5cGV8fFwiXCIpJiZjLnB1c2goZSl9cmV0dXJuIGt9LGNsZWFuRGF0YTpmdW5jdGlvbihhKXtmb3IodmFyIGIsYyxkLGUsZj1uLmV2ZW50LnNwZWNpYWwsZz0wO3ZvaWQgMCE9PShjPWFbZ10pO2crKyl7aWYobi5hY2NlcHREYXRhKGMpJiYoZT1jW0wuZXhwYW5kb10sZSYmKGI9TC5jYWNoZVtlXSkpKXtpZihiLmV2ZW50cylmb3IoZCBpbiBiLmV2ZW50cylmW2RdP24uZXZlbnQucmVtb3ZlKGMsZCk6bi5yZW1vdmVFdmVudChjLGQsYi5oYW5kbGUpO0wuY2FjaGVbZV0mJmRlbGV0ZSBMLmNhY2hlW2VdfWRlbGV0ZSBNLmNhY2hlW2NbTS5leHBhbmRvXV19fX0pLG4uZm4uZXh0ZW5kKHt0ZXh0OmZ1bmN0aW9uKGEpe3JldHVybiBKKHRoaXMsZnVuY3Rpb24oYSl7cmV0dXJuIHZvaWQgMD09PWE/bi50ZXh0KHRoaXMpOnRoaXMuZW1wdHkoKS5lYWNoKGZ1bmN0aW9uKCl7KDE9PT10aGlzLm5vZGVUeXBlfHwxMT09PXRoaXMubm9kZVR5cGV8fDk9PT10aGlzLm5vZGVUeXBlKSYmKHRoaXMudGV4dENvbnRlbnQ9YSl9KX0sbnVsbCxhLGFyZ3VtZW50cy5sZW5ndGgpfSxhcHBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsZnVuY3Rpb24oYSl7aWYoMT09PXRoaXMubm9kZVR5cGV8fDExPT09dGhpcy5ub2RlVHlwZXx8OT09PXRoaXMubm9kZVR5cGUpe3ZhciBiPWphKHRoaXMsYSk7Yi5hcHBlbmRDaGlsZChhKX19KX0scHJlcGVuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cyxmdW5jdGlvbihhKXtpZigxPT09dGhpcy5ub2RlVHlwZXx8MTE9PT10aGlzLm5vZGVUeXBlfHw5PT09dGhpcy5ub2RlVHlwZSl7dmFyIGI9amEodGhpcyxhKTtiLmluc2VydEJlZm9yZShhLGIuZmlyc3RDaGlsZCl9fSl9LGJlZm9yZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cyxmdW5jdGlvbihhKXt0aGlzLnBhcmVudE5vZGUmJnRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoYSx0aGlzKX0pfSxhZnRlcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cyxmdW5jdGlvbihhKXt0aGlzLnBhcmVudE5vZGUmJnRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoYSx0aGlzLm5leHRTaWJsaW5nKX0pfSxyZW1vdmU6ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGMsZD1hP24uZmlsdGVyKGEsdGhpcyk6dGhpcyxlPTA7bnVsbCE9KGM9ZFtlXSk7ZSsrKWJ8fDEhPT1jLm5vZGVUeXBlfHxuLmNsZWFuRGF0YShvYShjKSksYy5wYXJlbnROb2RlJiYoYiYmbi5jb250YWlucyhjLm93bmVyRG9jdW1lbnQsYykmJm1hKG9hKGMsXCJzY3JpcHRcIikpLGMucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChjKSk7cmV0dXJuIHRoaXN9LGVtcHR5OmZ1bmN0aW9uKCl7Zm9yKHZhciBhLGI9MDtudWxsIT0oYT10aGlzW2JdKTtiKyspMT09PWEubm9kZVR5cGUmJihuLmNsZWFuRGF0YShvYShhLCExKSksYS50ZXh0Q29udGVudD1cIlwiKTtyZXR1cm4gdGhpc30sY2xvbmU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYT1udWxsPT1hPyExOmEsYj1udWxsPT1iP2E6Yix0aGlzLm1hcChmdW5jdGlvbigpe3JldHVybiBuLmNsb25lKHRoaXMsYSxiKX0pfSxodG1sOmZ1bmN0aW9uKGEpe3JldHVybiBKKHRoaXMsZnVuY3Rpb24oYSl7dmFyIGI9dGhpc1swXXx8e30sYz0wLGQ9dGhpcy5sZW5ndGg7aWYodm9pZCAwPT09YSYmMT09PWIubm9kZVR5cGUpcmV0dXJuIGIuaW5uZXJIVE1MO2lmKFwic3RyaW5nXCI9PXR5cGVvZiBhJiYhZGEudGVzdChhKSYmIWlhWyhiYS5leGVjKGEpfHxbXCJcIixcIlwiXSlbMV0udG9Mb3dlckNhc2UoKV0pe2E9YS5yZXBsYWNlKGFhLFwiPCQxPjwvJDI+XCIpO3RyeXtmb3IoO2Q+YztjKyspYj10aGlzW2NdfHx7fSwxPT09Yi5ub2RlVHlwZSYmKG4uY2xlYW5EYXRhKG9hKGIsITEpKSxiLmlubmVySFRNTD1hKTtiPTB9Y2F0Y2goZSl7fX1iJiZ0aGlzLmVtcHR5KCkuYXBwZW5kKGEpfSxudWxsLGEsYXJndW1lbnRzLmxlbmd0aCl9LHJlcGxhY2VXaXRoOmZ1bmN0aW9uKCl7dmFyIGE9YXJndW1lbnRzWzBdO3JldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cyxmdW5jdGlvbihiKXthPXRoaXMucGFyZW50Tm9kZSxuLmNsZWFuRGF0YShvYSh0aGlzKSksYSYmYS5yZXBsYWNlQ2hpbGQoYix0aGlzKX0pLGEmJihhLmxlbmd0aHx8YS5ub2RlVHlwZSk/dGhpczp0aGlzLnJlbW92ZSgpfSxkZXRhY2g6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucmVtb3ZlKGEsITApfSxkb21NYW5pcDpmdW5jdGlvbihhLGIpe2E9ZS5hcHBseShbXSxhKTt2YXIgYyxkLGYsZyxoLGksaj0wLGw9dGhpcy5sZW5ndGgsbT10aGlzLG89bC0xLHA9YVswXSxxPW4uaXNGdW5jdGlvbihwKTtpZihxfHxsPjEmJlwic3RyaW5nXCI9PXR5cGVvZiBwJiYhay5jaGVja0Nsb25lJiZlYS50ZXN0KHApKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYyl7dmFyIGQ9bS5lcShjKTtxJiYoYVswXT1wLmNhbGwodGhpcyxjLGQuaHRtbCgpKSksZC5kb21NYW5pcChhLGIpfSk7aWYobCYmKGM9bi5idWlsZEZyYWdtZW50KGEsdGhpc1swXS5vd25lckRvY3VtZW50LCExLHRoaXMpLGQ9Yy5maXJzdENoaWxkLDE9PT1jLmNoaWxkTm9kZXMubGVuZ3RoJiYoYz1kKSxkKSl7Zm9yKGY9bi5tYXAob2EoYyxcInNjcmlwdFwiKSxrYSksZz1mLmxlbmd0aDtsPmo7aisrKWg9YyxqIT09byYmKGg9bi5jbG9uZShoLCEwLCEwKSxnJiZuLm1lcmdlKGYsb2EoaCxcInNjcmlwdFwiKSkpLGIuY2FsbCh0aGlzW2pdLGgsaik7aWYoZylmb3IoaT1mW2YubGVuZ3RoLTFdLm93bmVyRG9jdW1lbnQsbi5tYXAoZixsYSksaj0wO2c+ajtqKyspaD1mW2pdLGZhLnRlc3QoaC50eXBlfHxcIlwiKSYmIUwuYWNjZXNzKGgsXCJnbG9iYWxFdmFsXCIpJiZuLmNvbnRhaW5zKGksaCkmJihoLnNyYz9uLl9ldmFsVXJsJiZuLl9ldmFsVXJsKGguc3JjKTpuLmdsb2JhbEV2YWwoaC50ZXh0Q29udGVudC5yZXBsYWNlKGhhLFwiXCIpKSl9cmV0dXJuIHRoaXN9fSksbi5lYWNoKHthcHBlbmRUbzpcImFwcGVuZFwiLHByZXBlbmRUbzpcInByZXBlbmRcIixpbnNlcnRCZWZvcmU6XCJiZWZvcmVcIixpbnNlcnRBZnRlcjpcImFmdGVyXCIscmVwbGFjZUFsbDpcInJlcGxhY2VXaXRoXCJ9LGZ1bmN0aW9uKGEsYil7bi5mblthXT1mdW5jdGlvbihhKXtmb3IodmFyIGMsZD1bXSxlPW4oYSksZz1lLmxlbmd0aC0xLGg9MDtnPj1oO2grKyljPWg9PT1nP3RoaXM6dGhpcy5jbG9uZSghMCksbihlW2hdKVtiXShjKSxmLmFwcGx5KGQsYy5nZXQoKSk7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGQpfX0pO3ZhciBxYSxyYT17fTtmdW5jdGlvbiBzYShiLGMpe3ZhciBkLGU9bihjLmNyZWF0ZUVsZW1lbnQoYikpLmFwcGVuZFRvKGMuYm9keSksZj1hLmdldERlZmF1bHRDb21wdXRlZFN0eWxlJiYoZD1hLmdldERlZmF1bHRDb21wdXRlZFN0eWxlKGVbMF0pKT9kLmRpc3BsYXk6bi5jc3MoZVswXSxcImRpc3BsYXlcIik7cmV0dXJuIGUuZGV0YWNoKCksZn1mdW5jdGlvbiB0YShhKXt2YXIgYj1sLGM9cmFbYV07cmV0dXJuIGN8fChjPXNhKGEsYiksXCJub25lXCIhPT1jJiZjfHwocWE9KHFhfHxuKFwiPGlmcmFtZSBmcmFtZWJvcmRlcj0nMCcgd2lkdGg9JzAnIGhlaWdodD0nMCcvPlwiKSkuYXBwZW5kVG8oYi5kb2N1bWVudEVsZW1lbnQpLGI9cWFbMF0uY29udGVudERvY3VtZW50LGIud3JpdGUoKSxiLmNsb3NlKCksYz1zYShhLGIpLHFhLmRldGFjaCgpKSxyYVthXT1jKSxjfXZhciB1YT0vXm1hcmdpbi8sdmE9bmV3IFJlZ0V4cChcIl4oXCIrUStcIikoPyFweClbYS16JV0rJFwiLFwiaVwiKSx3YT1mdW5jdGlvbihiKXtyZXR1cm4gYi5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3Lm9wZW5lcj9iLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShiLG51bGwpOmEuZ2V0Q29tcHV0ZWRTdHlsZShiLG51bGwpfTtmdW5jdGlvbiB4YShhLGIsYyl7dmFyIGQsZSxmLGcsaD1hLnN0eWxlO3JldHVybiBjPWN8fHdhKGEpLGMmJihnPWMuZ2V0UHJvcGVydHlWYWx1ZShiKXx8Y1tiXSksYyYmKFwiXCIhPT1nfHxuLmNvbnRhaW5zKGEub3duZXJEb2N1bWVudCxhKXx8KGc9bi5zdHlsZShhLGIpKSx2YS50ZXN0KGcpJiZ1YS50ZXN0KGIpJiYoZD1oLndpZHRoLGU9aC5taW5XaWR0aCxmPWgubWF4V2lkdGgsaC5taW5XaWR0aD1oLm1heFdpZHRoPWgud2lkdGg9ZyxnPWMud2lkdGgsaC53aWR0aD1kLGgubWluV2lkdGg9ZSxoLm1heFdpZHRoPWYpKSx2b2lkIDAhPT1nP2crXCJcIjpnfWZ1bmN0aW9uIHlhKGEsYil7cmV0dXJue2dldDpmdW5jdGlvbigpe3JldHVybiBhKCk/dm9pZCBkZWxldGUgdGhpcy5nZXQ6KHRoaXMuZ2V0PWIpLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19fSFmdW5jdGlvbigpe3ZhciBiLGMsZD1sLmRvY3VtZW50RWxlbWVudCxlPWwuY3JlYXRlRWxlbWVudChcImRpdlwiKSxmPWwuY3JlYXRlRWxlbWVudChcImRpdlwiKTtpZihmLnN0eWxlKXtmLnN0eWxlLmJhY2tncm91bmRDbGlwPVwiY29udGVudC1ib3hcIixmLmNsb25lTm9kZSghMCkuc3R5bGUuYmFja2dyb3VuZENsaXA9XCJcIixrLmNsZWFyQ2xvbmVTdHlsZT1cImNvbnRlbnQtYm94XCI9PT1mLnN0eWxlLmJhY2tncm91bmRDbGlwLGUuc3R5bGUuY3NzVGV4dD1cImJvcmRlcjowO3dpZHRoOjA7aGVpZ2h0OjA7dG9wOjA7bGVmdDotOTk5OXB4O21hcmdpbi10b3A6MXB4O3Bvc2l0aW9uOmFic29sdXRlXCIsZS5hcHBlbmRDaGlsZChmKTtmdW5jdGlvbiBnKCl7Zi5zdHlsZS5jc3NUZXh0PVwiLXdlYmtpdC1ib3gtc2l6aW5nOmJvcmRlci1ib3g7LW1vei1ib3gtc2l6aW5nOmJvcmRlci1ib3g7Ym94LXNpemluZzpib3JkZXItYm94O2Rpc3BsYXk6YmxvY2s7bWFyZ2luLXRvcDoxJTt0b3A6MSU7Ym9yZGVyOjFweDtwYWRkaW5nOjFweDt3aWR0aDo0cHg7cG9zaXRpb246YWJzb2x1dGVcIixmLmlubmVySFRNTD1cIlwiLGQuYXBwZW5kQ2hpbGQoZSk7dmFyIGc9YS5nZXRDb21wdXRlZFN0eWxlKGYsbnVsbCk7Yj1cIjElXCIhPT1nLnRvcCxjPVwiNHB4XCI9PT1nLndpZHRoLGQucmVtb3ZlQ2hpbGQoZSl9YS5nZXRDb21wdXRlZFN0eWxlJiZuLmV4dGVuZChrLHtwaXhlbFBvc2l0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIGcoKSxifSxib3hTaXppbmdSZWxpYWJsZTpmdW5jdGlvbigpe3JldHVybiBudWxsPT1jJiZnKCksY30scmVsaWFibGVNYXJnaW5SaWdodDpmdW5jdGlvbigpe3ZhciBiLGM9Zi5hcHBlbmRDaGlsZChsLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIikpO3JldHVybiBjLnN0eWxlLmNzc1RleHQ9Zi5zdHlsZS5jc3NUZXh0PVwiLXdlYmtpdC1ib3gtc2l6aW5nOmNvbnRlbnQtYm94Oy1tb3otYm94LXNpemluZzpjb250ZW50LWJveDtib3gtc2l6aW5nOmNvbnRlbnQtYm94O2Rpc3BsYXk6YmxvY2s7bWFyZ2luOjA7Ym9yZGVyOjA7cGFkZGluZzowXCIsYy5zdHlsZS5tYXJnaW5SaWdodD1jLnN0eWxlLndpZHRoPVwiMFwiLGYuc3R5bGUud2lkdGg9XCIxcHhcIixkLmFwcGVuZENoaWxkKGUpLGI9IXBhcnNlRmxvYXQoYS5nZXRDb21wdXRlZFN0eWxlKGMsbnVsbCkubWFyZ2luUmlnaHQpLGQucmVtb3ZlQ2hpbGQoZSksZi5yZW1vdmVDaGlsZChjKSxifX0pfX0oKSxuLnN3YXA9ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGUsZixnPXt9O2ZvcihmIGluIGIpZ1tmXT1hLnN0eWxlW2ZdLGEuc3R5bGVbZl09YltmXTtlPWMuYXBwbHkoYSxkfHxbXSk7Zm9yKGYgaW4gYilhLnN0eWxlW2ZdPWdbZl07cmV0dXJuIGV9O3ZhciB6YT0vXihub25lfHRhYmxlKD8hLWNbZWFdKS4rKS8sQWE9bmV3IFJlZ0V4cChcIl4oXCIrUStcIikoLiopJFwiLFwiaVwiKSxCYT1uZXcgUmVnRXhwKFwiXihbKy1dKT0oXCIrUStcIilcIixcImlcIiksQ2E9e3Bvc2l0aW9uOlwiYWJzb2x1dGVcIix2aXNpYmlsaXR5OlwiaGlkZGVuXCIsZGlzcGxheTpcImJsb2NrXCJ9LERhPXtsZXR0ZXJTcGFjaW5nOlwiMFwiLGZvbnRXZWlnaHQ6XCI0MDBcIn0sRWE9W1wiV2Via2l0XCIsXCJPXCIsXCJNb3pcIixcIm1zXCJdO2Z1bmN0aW9uIEZhKGEsYil7aWYoYiBpbiBhKXJldHVybiBiO3ZhciBjPWJbMF0udG9VcHBlckNhc2UoKStiLnNsaWNlKDEpLGQ9YixlPUVhLmxlbmd0aDt3aGlsZShlLS0paWYoYj1FYVtlXStjLGIgaW4gYSlyZXR1cm4gYjtyZXR1cm4gZH1mdW5jdGlvbiBHYShhLGIsYyl7dmFyIGQ9QWEuZXhlYyhiKTtyZXR1cm4gZD9NYXRoLm1heCgwLGRbMV0tKGN8fDApKSsoZFsyXXx8XCJweFwiKTpifWZ1bmN0aW9uIEhhKGEsYixjLGQsZSl7Zm9yKHZhciBmPWM9PT0oZD9cImJvcmRlclwiOlwiY29udGVudFwiKT80Olwid2lkdGhcIj09PWI/MTowLGc9MDs0PmY7Zis9MilcIm1hcmdpblwiPT09YyYmKGcrPW4uY3NzKGEsYytSW2ZdLCEwLGUpKSxkPyhcImNvbnRlbnRcIj09PWMmJihnLT1uLmNzcyhhLFwicGFkZGluZ1wiK1JbZl0sITAsZSkpLFwibWFyZ2luXCIhPT1jJiYoZy09bi5jc3MoYSxcImJvcmRlclwiK1JbZl0rXCJXaWR0aFwiLCEwLGUpKSk6KGcrPW4uY3NzKGEsXCJwYWRkaW5nXCIrUltmXSwhMCxlKSxcInBhZGRpbmdcIiE9PWMmJihnKz1uLmNzcyhhLFwiYm9yZGVyXCIrUltmXStcIldpZHRoXCIsITAsZSkpKTtyZXR1cm4gZ31mdW5jdGlvbiBJYShhLGIsYyl7dmFyIGQ9ITAsZT1cIndpZHRoXCI9PT1iP2Eub2Zmc2V0V2lkdGg6YS5vZmZzZXRIZWlnaHQsZj13YShhKSxnPVwiYm9yZGVyLWJveFwiPT09bi5jc3MoYSxcImJveFNpemluZ1wiLCExLGYpO2lmKDA+PWV8fG51bGw9PWUpe2lmKGU9eGEoYSxiLGYpLCgwPmV8fG51bGw9PWUpJiYoZT1hLnN0eWxlW2JdKSx2YS50ZXN0KGUpKXJldHVybiBlO2Q9ZyYmKGsuYm94U2l6aW5nUmVsaWFibGUoKXx8ZT09PWEuc3R5bGVbYl0pLGU9cGFyc2VGbG9hdChlKXx8MH1yZXR1cm4gZStIYShhLGIsY3x8KGc/XCJib3JkZXJcIjpcImNvbnRlbnRcIiksZCxmKStcInB4XCJ9ZnVuY3Rpb24gSmEoYSxiKXtmb3IodmFyIGMsZCxlLGY9W10sZz0wLGg9YS5sZW5ndGg7aD5nO2crKylkPWFbZ10sZC5zdHlsZSYmKGZbZ109TC5nZXQoZCxcIm9sZGRpc3BsYXlcIiksYz1kLnN0eWxlLmRpc3BsYXksYj8oZltnXXx8XCJub25lXCIhPT1jfHwoZC5zdHlsZS5kaXNwbGF5PVwiXCIpLFwiXCI9PT1kLnN0eWxlLmRpc3BsYXkmJlMoZCkmJihmW2ddPUwuYWNjZXNzKGQsXCJvbGRkaXNwbGF5XCIsdGEoZC5ub2RlTmFtZSkpKSk6KGU9UyhkKSxcIm5vbmVcIj09PWMmJmV8fEwuc2V0KGQsXCJvbGRkaXNwbGF5XCIsZT9jOm4uY3NzKGQsXCJkaXNwbGF5XCIpKSkpO2ZvcihnPTA7aD5nO2crKylkPWFbZ10sZC5zdHlsZSYmKGImJlwibm9uZVwiIT09ZC5zdHlsZS5kaXNwbGF5JiZcIlwiIT09ZC5zdHlsZS5kaXNwbGF5fHwoZC5zdHlsZS5kaXNwbGF5PWI/ZltnXXx8XCJcIjpcIm5vbmVcIikpO3JldHVybiBhfW4uZXh0ZW5kKHtjc3NIb29rczp7b3BhY2l0eTp7Z2V0OmZ1bmN0aW9uKGEsYil7aWYoYil7dmFyIGM9eGEoYSxcIm9wYWNpdHlcIik7cmV0dXJuXCJcIj09PWM/XCIxXCI6Y319fX0sY3NzTnVtYmVyOntjb2x1bW5Db3VudDohMCxmaWxsT3BhY2l0eTohMCxmbGV4R3JvdzohMCxmbGV4U2hyaW5rOiEwLGZvbnRXZWlnaHQ6ITAsbGluZUhlaWdodDohMCxvcGFjaXR5OiEwLG9yZGVyOiEwLG9ycGhhbnM6ITAsd2lkb3dzOiEwLHpJbmRleDohMCx6b29tOiEwfSxjc3NQcm9wczp7XCJmbG9hdFwiOlwiY3NzRmxvYXRcIn0sc3R5bGU6ZnVuY3Rpb24oYSxiLGMsZCl7aWYoYSYmMyE9PWEubm9kZVR5cGUmJjghPT1hLm5vZGVUeXBlJiZhLnN0eWxlKXt2YXIgZSxmLGcsaD1uLmNhbWVsQ2FzZShiKSxpPWEuc3R5bGU7cmV0dXJuIGI9bi5jc3NQcm9wc1toXXx8KG4uY3NzUHJvcHNbaF09RmEoaSxoKSksZz1uLmNzc0hvb2tzW2JdfHxuLmNzc0hvb2tzW2hdLHZvaWQgMD09PWM/ZyYmXCJnZXRcImluIGcmJnZvaWQgMCE9PShlPWcuZ2V0KGEsITEsZCkpP2U6aVtiXTooZj10eXBlb2YgYyxcInN0cmluZ1wiPT09ZiYmKGU9QmEuZXhlYyhjKSkmJihjPShlWzFdKzEpKmVbMl0rcGFyc2VGbG9hdChuLmNzcyhhLGIpKSxmPVwibnVtYmVyXCIpLG51bGwhPWMmJmM9PT1jJiYoXCJudW1iZXJcIiE9PWZ8fG4uY3NzTnVtYmVyW2hdfHwoYys9XCJweFwiKSxrLmNsZWFyQ2xvbmVTdHlsZXx8XCJcIiE9PWN8fDAhPT1iLmluZGV4T2YoXCJiYWNrZ3JvdW5kXCIpfHwoaVtiXT1cImluaGVyaXRcIiksZyYmXCJzZXRcImluIGcmJnZvaWQgMD09PShjPWcuc2V0KGEsYyxkKSl8fChpW2JdPWMpKSx2b2lkIDApfX0sY3NzOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlLGYsZyxoPW4uY2FtZWxDYXNlKGIpO3JldHVybiBiPW4uY3NzUHJvcHNbaF18fChuLmNzc1Byb3BzW2hdPUZhKGEuc3R5bGUsaCkpLGc9bi5jc3NIb29rc1tiXXx8bi5jc3NIb29rc1toXSxnJiZcImdldFwiaW4gZyYmKGU9Zy5nZXQoYSwhMCxjKSksdm9pZCAwPT09ZSYmKGU9eGEoYSxiLGQpKSxcIm5vcm1hbFwiPT09ZSYmYiBpbiBEYSYmKGU9RGFbYl0pLFwiXCI9PT1jfHxjPyhmPXBhcnNlRmxvYXQoZSksYz09PSEwfHxuLmlzTnVtZXJpYyhmKT9mfHwwOmUpOmV9fSksbi5lYWNoKFtcImhlaWdodFwiLFwid2lkdGhcIl0sZnVuY3Rpb24oYSxiKXtuLmNzc0hvb2tzW2JdPXtnZXQ6ZnVuY3Rpb24oYSxjLGQpe3JldHVybiBjP3phLnRlc3Qobi5jc3MoYSxcImRpc3BsYXlcIikpJiYwPT09YS5vZmZzZXRXaWR0aD9uLnN3YXAoYSxDYSxmdW5jdGlvbigpe3JldHVybiBJYShhLGIsZCl9KTpJYShhLGIsZCk6dm9pZCAwfSxzZXQ6ZnVuY3Rpb24oYSxjLGQpe3ZhciBlPWQmJndhKGEpO3JldHVybiBHYShhLGMsZD9IYShhLGIsZCxcImJvcmRlci1ib3hcIj09PW4uY3NzKGEsXCJib3hTaXppbmdcIiwhMSxlKSxlKTowKX19fSksbi5jc3NIb29rcy5tYXJnaW5SaWdodD15YShrLnJlbGlhYmxlTWFyZ2luUmlnaHQsZnVuY3Rpb24oYSxiKXtyZXR1cm4gYj9uLnN3YXAoYSx7ZGlzcGxheTpcImlubGluZS1ibG9ja1wifSx4YSxbYSxcIm1hcmdpblJpZ2h0XCJdKTp2b2lkIDB9KSxuLmVhY2goe21hcmdpbjpcIlwiLHBhZGRpbmc6XCJcIixib3JkZXI6XCJXaWR0aFwifSxmdW5jdGlvbihhLGIpe24uY3NzSG9va3NbYStiXT17ZXhwYW5kOmZ1bmN0aW9uKGMpe2Zvcih2YXIgZD0wLGU9e30sZj1cInN0cmluZ1wiPT10eXBlb2YgYz9jLnNwbGl0KFwiIFwiKTpbY107ND5kO2QrKyllW2ErUltkXStiXT1mW2RdfHxmW2QtMl18fGZbMF07cmV0dXJuIGV9fSx1YS50ZXN0KGEpfHwobi5jc3NIb29rc1thK2JdLnNldD1HYSl9KSxuLmZuLmV4dGVuZCh7Y3NzOmZ1bmN0aW9uKGEsYil7cmV0dXJuIEoodGhpcyxmdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmPXt9LGc9MDtpZihuLmlzQXJyYXkoYikpe2ZvcihkPXdhKGEpLGU9Yi5sZW5ndGg7ZT5nO2crKylmW2JbZ11dPW4uY3NzKGEsYltnXSwhMSxkKTtyZXR1cm4gZn1yZXR1cm4gdm9pZCAwIT09Yz9uLnN0eWxlKGEsYixjKTpuLmNzcyhhLGIpfSxhLGIsYXJndW1lbnRzLmxlbmd0aD4xKX0sc2hvdzpmdW5jdGlvbigpe3JldHVybiBKYSh0aGlzLCEwKX0saGlkZTpmdW5jdGlvbigpe3JldHVybiBKYSh0aGlzKX0sdG9nZ2xlOmZ1bmN0aW9uKGEpe3JldHVyblwiYm9vbGVhblwiPT10eXBlb2YgYT9hP3RoaXMuc2hvdygpOnRoaXMuaGlkZSgpOnRoaXMuZWFjaChmdW5jdGlvbigpe1ModGhpcyk/bih0aGlzKS5zaG93KCk6bih0aGlzKS5oaWRlKCl9KX19KTtmdW5jdGlvbiBLYShhLGIsYyxkLGUpe3JldHVybiBuZXcgS2EucHJvdG90eXBlLmluaXQoYSxiLGMsZCxlKX1uLlR3ZWVuPUthLEthLnByb3RvdHlwZT17Y29uc3RydWN0b3I6S2EsaW5pdDpmdW5jdGlvbihhLGIsYyxkLGUsZil7dGhpcy5lbGVtPWEsdGhpcy5wcm9wPWMsdGhpcy5lYXNpbmc9ZXx8XCJzd2luZ1wiLHRoaXMub3B0aW9ucz1iLHRoaXMuc3RhcnQ9dGhpcy5ub3c9dGhpcy5jdXIoKSx0aGlzLmVuZD1kLHRoaXMudW5pdD1mfHwobi5jc3NOdW1iZXJbY10/XCJcIjpcInB4XCIpfSxjdXI6ZnVuY3Rpb24oKXt2YXIgYT1LYS5wcm9wSG9va3NbdGhpcy5wcm9wXTtyZXR1cm4gYSYmYS5nZXQ/YS5nZXQodGhpcyk6S2EucHJvcEhvb2tzLl9kZWZhdWx0LmdldCh0aGlzKX0scnVuOmZ1bmN0aW9uKGEpe3ZhciBiLGM9S2EucHJvcEhvb2tzW3RoaXMucHJvcF07cmV0dXJuIHRoaXMub3B0aW9ucy5kdXJhdGlvbj90aGlzLnBvcz1iPW4uZWFzaW5nW3RoaXMuZWFzaW5nXShhLHRoaXMub3B0aW9ucy5kdXJhdGlvbiphLDAsMSx0aGlzLm9wdGlvbnMuZHVyYXRpb24pOnRoaXMucG9zPWI9YSx0aGlzLm5vdz0odGhpcy5lbmQtdGhpcy5zdGFydCkqYit0aGlzLnN0YXJ0LHRoaXMub3B0aW9ucy5zdGVwJiZ0aGlzLm9wdGlvbnMuc3RlcC5jYWxsKHRoaXMuZWxlbSx0aGlzLm5vdyx0aGlzKSxjJiZjLnNldD9jLnNldCh0aGlzKTpLYS5wcm9wSG9va3MuX2RlZmF1bHQuc2V0KHRoaXMpLHRoaXN9fSxLYS5wcm90b3R5cGUuaW5pdC5wcm90b3R5cGU9S2EucHJvdG90eXBlLEthLnByb3BIb29rcz17X2RlZmF1bHQ6e2dldDpmdW5jdGlvbihhKXt2YXIgYjtyZXR1cm4gbnVsbD09YS5lbGVtW2EucHJvcF18fGEuZWxlbS5zdHlsZSYmbnVsbCE9YS5lbGVtLnN0eWxlW2EucHJvcF0/KGI9bi5jc3MoYS5lbGVtLGEucHJvcCxcIlwiKSxiJiZcImF1dG9cIiE9PWI/YjowKTphLmVsZW1bYS5wcm9wXX0sc2V0OmZ1bmN0aW9uKGEpe24uZnguc3RlcFthLnByb3BdP24uZnguc3RlcFthLnByb3BdKGEpOmEuZWxlbS5zdHlsZSYmKG51bGwhPWEuZWxlbS5zdHlsZVtuLmNzc1Byb3BzW2EucHJvcF1dfHxuLmNzc0hvb2tzW2EucHJvcF0pP24uc3R5bGUoYS5lbGVtLGEucHJvcCxhLm5vdythLnVuaXQpOmEuZWxlbVthLnByb3BdPWEubm93fX19LEthLnByb3BIb29rcy5zY3JvbGxUb3A9S2EucHJvcEhvb2tzLnNjcm9sbExlZnQ9e3NldDpmdW5jdGlvbihhKXthLmVsZW0ubm9kZVR5cGUmJmEuZWxlbS5wYXJlbnROb2RlJiYoYS5lbGVtW2EucHJvcF09YS5ub3cpfX0sbi5lYXNpbmc9e2xpbmVhcjpmdW5jdGlvbihhKXtyZXR1cm4gYX0sc3dpbmc6ZnVuY3Rpb24oYSl7cmV0dXJuLjUtTWF0aC5jb3MoYSpNYXRoLlBJKS8yfX0sbi5meD1LYS5wcm90b3R5cGUuaW5pdCxuLmZ4LnN0ZXA9e307dmFyIExhLE1hLE5hPS9eKD86dG9nZ2xlfHNob3d8aGlkZSkkLyxPYT1uZXcgUmVnRXhwKFwiXig/OihbKy1dKT18KShcIitRK1wiKShbYS16JV0qKSRcIixcImlcIiksUGE9L3F1ZXVlSG9va3MkLyxRYT1bVmFdLFJhPXtcIipcIjpbZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLmNyZWF0ZVR3ZWVuKGEsYiksZD1jLmN1cigpLGU9T2EuZXhlYyhiKSxmPWUmJmVbM118fChuLmNzc051bWJlclthXT9cIlwiOlwicHhcIiksZz0obi5jc3NOdW1iZXJbYV18fFwicHhcIiE9PWYmJitkKSYmT2EuZXhlYyhuLmNzcyhjLmVsZW0sYSkpLGg9MSxpPTIwO2lmKGcmJmdbM10hPT1mKXtmPWZ8fGdbM10sZT1lfHxbXSxnPStkfHwxO2RvIGg9aHx8XCIuNVwiLGcvPWgsbi5zdHlsZShjLmVsZW0sYSxnK2YpO3doaWxlKGghPT0oaD1jLmN1cigpL2QpJiYxIT09aCYmLS1pKX1yZXR1cm4gZSYmKGc9Yy5zdGFydD0rZ3x8K2R8fDAsYy51bml0PWYsYy5lbmQ9ZVsxXT9nKyhlWzFdKzEpKmVbMl06K2VbMl0pLGN9XX07ZnVuY3Rpb24gU2EoKXtyZXR1cm4gc2V0VGltZW91dChmdW5jdGlvbigpe0xhPXZvaWQgMH0pLExhPW4ubm93KCl9ZnVuY3Rpb24gVGEoYSxiKXt2YXIgYyxkPTAsZT17aGVpZ2h0OmF9O2ZvcihiPWI/MTowOzQ+ZDtkKz0yLWIpYz1SW2RdLGVbXCJtYXJnaW5cIitjXT1lW1wicGFkZGluZ1wiK2NdPWE7cmV0dXJuIGImJihlLm9wYWNpdHk9ZS53aWR0aD1hKSxlfWZ1bmN0aW9uIFVhKGEsYixjKXtmb3IodmFyIGQsZT0oUmFbYl18fFtdKS5jb25jYXQoUmFbXCIqXCJdKSxmPTAsZz1lLmxlbmd0aDtnPmY7ZisrKWlmKGQ9ZVtmXS5jYWxsKGMsYixhKSlyZXR1cm4gZH1mdW5jdGlvbiBWYShhLGIsYyl7dmFyIGQsZSxmLGcsaCxpLGosayxsPXRoaXMsbT17fSxvPWEuc3R5bGUscD1hLm5vZGVUeXBlJiZTKGEpLHE9TC5nZXQoYSxcImZ4c2hvd1wiKTtjLnF1ZXVlfHwoaD1uLl9xdWV1ZUhvb2tzKGEsXCJmeFwiKSxudWxsPT1oLnVucXVldWVkJiYoaC51bnF1ZXVlZD0wLGk9aC5lbXB0eS5maXJlLGguZW1wdHkuZmlyZT1mdW5jdGlvbigpe2gudW5xdWV1ZWR8fGkoKX0pLGgudW5xdWV1ZWQrKyxsLmFsd2F5cyhmdW5jdGlvbigpe2wuYWx3YXlzKGZ1bmN0aW9uKCl7aC51bnF1ZXVlZC0tLG4ucXVldWUoYSxcImZ4XCIpLmxlbmd0aHx8aC5lbXB0eS5maXJlKCl9KX0pKSwxPT09YS5ub2RlVHlwZSYmKFwiaGVpZ2h0XCJpbiBifHxcIndpZHRoXCJpbiBiKSYmKGMub3ZlcmZsb3c9W28ub3ZlcmZsb3csby5vdmVyZmxvd1gsby5vdmVyZmxvd1ldLGo9bi5jc3MoYSxcImRpc3BsYXlcIiksaz1cIm5vbmVcIj09PWo/TC5nZXQoYSxcIm9sZGRpc3BsYXlcIil8fHRhKGEubm9kZU5hbWUpOmosXCJpbmxpbmVcIj09PWsmJlwibm9uZVwiPT09bi5jc3MoYSxcImZsb2F0XCIpJiYoby5kaXNwbGF5PVwiaW5saW5lLWJsb2NrXCIpKSxjLm92ZXJmbG93JiYoby5vdmVyZmxvdz1cImhpZGRlblwiLGwuYWx3YXlzKGZ1bmN0aW9uKCl7by5vdmVyZmxvdz1jLm92ZXJmbG93WzBdLG8ub3ZlcmZsb3dYPWMub3ZlcmZsb3dbMV0sby5vdmVyZmxvd1k9Yy5vdmVyZmxvd1syXX0pKTtmb3IoZCBpbiBiKWlmKGU9YltkXSxOYS5leGVjKGUpKXtpZihkZWxldGUgYltkXSxmPWZ8fFwidG9nZ2xlXCI9PT1lLGU9PT0ocD9cImhpZGVcIjpcInNob3dcIikpe2lmKFwic2hvd1wiIT09ZXx8IXF8fHZvaWQgMD09PXFbZF0pY29udGludWU7cD0hMH1tW2RdPXEmJnFbZF18fG4uc3R5bGUoYSxkKX1lbHNlIGo9dm9pZCAwO2lmKG4uaXNFbXB0eU9iamVjdChtKSlcImlubGluZVwiPT09KFwibm9uZVwiPT09aj90YShhLm5vZGVOYW1lKTpqKSYmKG8uZGlzcGxheT1qKTtlbHNle3E/XCJoaWRkZW5cImluIHEmJihwPXEuaGlkZGVuKTpxPUwuYWNjZXNzKGEsXCJmeHNob3dcIix7fSksZiYmKHEuaGlkZGVuPSFwKSxwP24oYSkuc2hvdygpOmwuZG9uZShmdW5jdGlvbigpe24oYSkuaGlkZSgpfSksbC5kb25lKGZ1bmN0aW9uKCl7dmFyIGI7TC5yZW1vdmUoYSxcImZ4c2hvd1wiKTtmb3IoYiBpbiBtKW4uc3R5bGUoYSxiLG1bYl0pfSk7Zm9yKGQgaW4gbSlnPVVhKHA/cVtkXTowLGQsbCksZCBpbiBxfHwocVtkXT1nLnN0YXJ0LHAmJihnLmVuZD1nLnN0YXJ0LGcuc3RhcnQ9XCJ3aWR0aFwiPT09ZHx8XCJoZWlnaHRcIj09PWQ/MTowKSl9fWZ1bmN0aW9uIFdhKGEsYil7dmFyIGMsZCxlLGYsZztmb3IoYyBpbiBhKWlmKGQ9bi5jYW1lbENhc2UoYyksZT1iW2RdLGY9YVtjXSxuLmlzQXJyYXkoZikmJihlPWZbMV0sZj1hW2NdPWZbMF0pLGMhPT1kJiYoYVtkXT1mLGRlbGV0ZSBhW2NdKSxnPW4uY3NzSG9va3NbZF0sZyYmXCJleHBhbmRcImluIGcpe2Y9Zy5leHBhbmQoZiksZGVsZXRlIGFbZF07Zm9yKGMgaW4gZiljIGluIGF8fChhW2NdPWZbY10sYltjXT1lKX1lbHNlIGJbZF09ZX1mdW5jdGlvbiBYYShhLGIsYyl7dmFyIGQsZSxmPTAsZz1RYS5sZW5ndGgsaD1uLkRlZmVycmVkKCkuYWx3YXlzKGZ1bmN0aW9uKCl7ZGVsZXRlIGkuZWxlbX0pLGk9ZnVuY3Rpb24oKXtpZihlKXJldHVybiExO2Zvcih2YXIgYj1MYXx8U2EoKSxjPU1hdGgubWF4KDAsai5zdGFydFRpbWUrai5kdXJhdGlvbi1iKSxkPWMvai5kdXJhdGlvbnx8MCxmPTEtZCxnPTAsaT1qLnR3ZWVucy5sZW5ndGg7aT5nO2crKylqLnR3ZWVuc1tnXS5ydW4oZik7cmV0dXJuIGgubm90aWZ5V2l0aChhLFtqLGYsY10pLDE+ZiYmaT9jOihoLnJlc29sdmVXaXRoKGEsW2pdKSwhMSl9LGo9aC5wcm9taXNlKHtlbGVtOmEscHJvcHM6bi5leHRlbmQoe30sYiksb3B0czpuLmV4dGVuZCghMCx7c3BlY2lhbEVhc2luZzp7fX0sYyksb3JpZ2luYWxQcm9wZXJ0aWVzOmIsb3JpZ2luYWxPcHRpb25zOmMsc3RhcnRUaW1lOkxhfHxTYSgpLGR1cmF0aW9uOmMuZHVyYXRpb24sdHdlZW5zOltdLGNyZWF0ZVR3ZWVuOmZ1bmN0aW9uKGIsYyl7dmFyIGQ9bi5Ud2VlbihhLGoub3B0cyxiLGMsai5vcHRzLnNwZWNpYWxFYXNpbmdbYl18fGoub3B0cy5lYXNpbmcpO3JldHVybiBqLnR3ZWVucy5wdXNoKGQpLGR9LHN0b3A6ZnVuY3Rpb24oYil7dmFyIGM9MCxkPWI/ai50d2VlbnMubGVuZ3RoOjA7aWYoZSlyZXR1cm4gdGhpcztmb3IoZT0hMDtkPmM7YysrKWoudHdlZW5zW2NdLnJ1bigxKTtyZXR1cm4gYj9oLnJlc29sdmVXaXRoKGEsW2osYl0pOmgucmVqZWN0V2l0aChhLFtqLGJdKSx0aGlzfX0pLGs9ai5wcm9wcztmb3IoV2EoayxqLm9wdHMuc3BlY2lhbEVhc2luZyk7Zz5mO2YrKylpZihkPVFhW2ZdLmNhbGwoaixhLGssai5vcHRzKSlyZXR1cm4gZDtyZXR1cm4gbi5tYXAoayxVYSxqKSxuLmlzRnVuY3Rpb24oai5vcHRzLnN0YXJ0KSYmai5vcHRzLnN0YXJ0LmNhbGwoYSxqKSxuLmZ4LnRpbWVyKG4uZXh0ZW5kKGkse2VsZW06YSxhbmltOmoscXVldWU6ai5vcHRzLnF1ZXVlfSkpLGoucHJvZ3Jlc3Moai5vcHRzLnByb2dyZXNzKS5kb25lKGoub3B0cy5kb25lLGoub3B0cy5jb21wbGV0ZSkuZmFpbChqLm9wdHMuZmFpbCkuYWx3YXlzKGoub3B0cy5hbHdheXMpfW4uQW5pbWF0aW9uPW4uZXh0ZW5kKFhhLHt0d2VlbmVyOmZ1bmN0aW9uKGEsYil7bi5pc0Z1bmN0aW9uKGEpPyhiPWEsYT1bXCIqXCJdKTphPWEuc3BsaXQoXCIgXCIpO2Zvcih2YXIgYyxkPTAsZT1hLmxlbmd0aDtlPmQ7ZCsrKWM9YVtkXSxSYVtjXT1SYVtjXXx8W10sUmFbY10udW5zaGlmdChiKX0scHJlZmlsdGVyOmZ1bmN0aW9uKGEsYil7Yj9RYS51bnNoaWZ0KGEpOlFhLnB1c2goYSl9fSksbi5zcGVlZD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9YSYmXCJvYmplY3RcIj09dHlwZW9mIGE/bi5leHRlbmQoe30sYSk6e2NvbXBsZXRlOmN8fCFjJiZifHxuLmlzRnVuY3Rpb24oYSkmJmEsZHVyYXRpb246YSxlYXNpbmc6YyYmYnx8YiYmIW4uaXNGdW5jdGlvbihiKSYmYn07cmV0dXJuIGQuZHVyYXRpb249bi5meC5vZmY/MDpcIm51bWJlclwiPT10eXBlb2YgZC5kdXJhdGlvbj9kLmR1cmF0aW9uOmQuZHVyYXRpb24gaW4gbi5meC5zcGVlZHM/bi5meC5zcGVlZHNbZC5kdXJhdGlvbl06bi5meC5zcGVlZHMuX2RlZmF1bHQsKG51bGw9PWQucXVldWV8fGQucXVldWU9PT0hMCkmJihkLnF1ZXVlPVwiZnhcIiksZC5vbGQ9ZC5jb21wbGV0ZSxkLmNvbXBsZXRlPWZ1bmN0aW9uKCl7bi5pc0Z1bmN0aW9uKGQub2xkKSYmZC5vbGQuY2FsbCh0aGlzKSxkLnF1ZXVlJiZuLmRlcXVldWUodGhpcyxkLnF1ZXVlKX0sZH0sbi5mbi5leHRlbmQoe2ZhZGVUbzpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gdGhpcy5maWx0ZXIoUykuY3NzKFwib3BhY2l0eVwiLDApLnNob3coKS5lbmQoKS5hbmltYXRlKHtvcGFjaXR5OmJ9LGEsYyxkKX0sYW5pbWF0ZTpmdW5jdGlvbihhLGIsYyxkKXt2YXIgZT1uLmlzRW1wdHlPYmplY3QoYSksZj1uLnNwZWVkKGIsYyxkKSxnPWZ1bmN0aW9uKCl7dmFyIGI9WGEodGhpcyxuLmV4dGVuZCh7fSxhKSxmKTsoZXx8TC5nZXQodGhpcyxcImZpbmlzaFwiKSkmJmIuc3RvcCghMCl9O3JldHVybiBnLmZpbmlzaD1nLGV8fGYucXVldWU9PT0hMT90aGlzLmVhY2goZyk6dGhpcy5xdWV1ZShmLnF1ZXVlLGcpfSxzdG9wOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1mdW5jdGlvbihhKXt2YXIgYj1hLnN0b3A7ZGVsZXRlIGEuc3RvcCxiKGMpfTtyZXR1cm5cInN0cmluZ1wiIT10eXBlb2YgYSYmKGM9YixiPWEsYT12b2lkIDApLGImJmEhPT0hMSYmdGhpcy5xdWV1ZShhfHxcImZ4XCIsW10pLHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBiPSEwLGU9bnVsbCE9YSYmYStcInF1ZXVlSG9va3NcIixmPW4udGltZXJzLGc9TC5nZXQodGhpcyk7aWYoZSlnW2VdJiZnW2VdLnN0b3AmJmQoZ1tlXSk7ZWxzZSBmb3IoZSBpbiBnKWdbZV0mJmdbZV0uc3RvcCYmUGEudGVzdChlKSYmZChnW2VdKTtmb3IoZT1mLmxlbmd0aDtlLS07KWZbZV0uZWxlbSE9PXRoaXN8fG51bGwhPWEmJmZbZV0ucXVldWUhPT1hfHwoZltlXS5hbmltLnN0b3AoYyksYj0hMSxmLnNwbGljZShlLDEpKTsoYnx8IWMpJiZuLmRlcXVldWUodGhpcyxhKX0pfSxmaW5pc2g6ZnVuY3Rpb24oYSl7cmV0dXJuIGEhPT0hMSYmKGE9YXx8XCJmeFwiKSx0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYixjPUwuZ2V0KHRoaXMpLGQ9Y1thK1wicXVldWVcIl0sZT1jW2ErXCJxdWV1ZUhvb2tzXCJdLGY9bi50aW1lcnMsZz1kP2QubGVuZ3RoOjA7Zm9yKGMuZmluaXNoPSEwLG4ucXVldWUodGhpcyxhLFtdKSxlJiZlLnN0b3AmJmUuc3RvcC5jYWxsKHRoaXMsITApLGI9Zi5sZW5ndGg7Yi0tOylmW2JdLmVsZW09PT10aGlzJiZmW2JdLnF1ZXVlPT09YSYmKGZbYl0uYW5pbS5zdG9wKCEwKSxmLnNwbGljZShiLDEpKTtmb3IoYj0wO2c+YjtiKyspZFtiXSYmZFtiXS5maW5pc2gmJmRbYl0uZmluaXNoLmNhbGwodGhpcyk7ZGVsZXRlIGMuZmluaXNofSl9fSksbi5lYWNoKFtcInRvZ2dsZVwiLFwic2hvd1wiLFwiaGlkZVwiXSxmdW5jdGlvbihhLGIpe3ZhciBjPW4uZm5bYl07bi5mbltiXT1mdW5jdGlvbihhLGQsZSl7cmV0dXJuIG51bGw9PWF8fFwiYm9vbGVhblwiPT10eXBlb2YgYT9jLmFwcGx5KHRoaXMsYXJndW1lbnRzKTp0aGlzLmFuaW1hdGUoVGEoYiwhMCksYSxkLGUpfX0pLG4uZWFjaCh7c2xpZGVEb3duOlRhKFwic2hvd1wiKSxzbGlkZVVwOlRhKFwiaGlkZVwiKSxzbGlkZVRvZ2dsZTpUYShcInRvZ2dsZVwiKSxmYWRlSW46e29wYWNpdHk6XCJzaG93XCJ9LGZhZGVPdXQ6e29wYWNpdHk6XCJoaWRlXCJ9LGZhZGVUb2dnbGU6e29wYWNpdHk6XCJ0b2dnbGVcIn19LGZ1bmN0aW9uKGEsYil7bi5mblthXT1mdW5jdGlvbihhLGMsZCl7cmV0dXJuIHRoaXMuYW5pbWF0ZShiLGEsYyxkKX19KSxuLnRpbWVycz1bXSxuLmZ4LnRpY2s9ZnVuY3Rpb24oKXt2YXIgYSxiPTAsYz1uLnRpbWVycztmb3IoTGE9bi5ub3coKTtiPGMubGVuZ3RoO2IrKylhPWNbYl0sYSgpfHxjW2JdIT09YXx8Yy5zcGxpY2UoYi0tLDEpO2MubGVuZ3RofHxuLmZ4LnN0b3AoKSxMYT12b2lkIDB9LG4uZngudGltZXI9ZnVuY3Rpb24oYSl7bi50aW1lcnMucHVzaChhKSxhKCk/bi5meC5zdGFydCgpOm4udGltZXJzLnBvcCgpfSxuLmZ4LmludGVydmFsPTEzLG4uZnguc3RhcnQ9ZnVuY3Rpb24oKXtNYXx8KE1hPXNldEludGVydmFsKG4uZngudGljayxuLmZ4LmludGVydmFsKSl9LG4uZnguc3RvcD1mdW5jdGlvbigpe2NsZWFySW50ZXJ2YWwoTWEpLE1hPW51bGx9LG4uZnguc3BlZWRzPXtzbG93OjYwMCxmYXN0OjIwMCxfZGVmYXVsdDo0MDB9LG4uZm4uZGVsYXk9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYT1uLmZ4P24uZnguc3BlZWRzW2FdfHxhOmEsYj1ifHxcImZ4XCIsdGhpcy5xdWV1ZShiLGZ1bmN0aW9uKGIsYyl7dmFyIGQ9c2V0VGltZW91dChiLGEpO2Muc3RvcD1mdW5jdGlvbigpe2NsZWFyVGltZW91dChkKX19KX0sZnVuY3Rpb24oKXt2YXIgYT1sLmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiKSxiPWwuY3JlYXRlRWxlbWVudChcInNlbGVjdFwiKSxjPWIuYXBwZW5kQ2hpbGQobC5jcmVhdGVFbGVtZW50KFwib3B0aW9uXCIpKTthLnR5cGU9XCJjaGVja2JveFwiLGsuY2hlY2tPbj1cIlwiIT09YS52YWx1ZSxrLm9wdFNlbGVjdGVkPWMuc2VsZWN0ZWQsYi5kaXNhYmxlZD0hMCxrLm9wdERpc2FibGVkPSFjLmRpc2FibGVkLGE9bC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIiksYS52YWx1ZT1cInRcIixhLnR5cGU9XCJyYWRpb1wiLGsucmFkaW9WYWx1ZT1cInRcIj09PWEudmFsdWV9KCk7dmFyIFlhLFphLCRhPW4uZXhwci5hdHRySGFuZGxlO24uZm4uZXh0ZW5kKHthdHRyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIEoodGhpcyxuLmF0dHIsYSxiLGFyZ3VtZW50cy5sZW5ndGg+MSl9LHJlbW92ZUF0dHI6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe24ucmVtb3ZlQXR0cih0aGlzLGEpfSl9fSksbi5leHRlbmQoe2F0dHI6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZj1hLm5vZGVUeXBlO2lmKGEmJjMhPT1mJiY4IT09ZiYmMiE9PWYpcmV0dXJuIHR5cGVvZiBhLmdldEF0dHJpYnV0ZT09PVU/bi5wcm9wKGEsYixjKTooMT09PWYmJm4uaXNYTUxEb2MoYSl8fChiPWIudG9Mb3dlckNhc2UoKSxkPW4uYXR0ckhvb2tzW2JdfHwobi5leHByLm1hdGNoLmJvb2wudGVzdChiKT9aYTpZYSkpLFxudm9pZCAwPT09Yz9kJiZcImdldFwiaW4gZCYmbnVsbCE9PShlPWQuZ2V0KGEsYikpP2U6KGU9bi5maW5kLmF0dHIoYSxiKSxudWxsPT1lP3ZvaWQgMDplKTpudWxsIT09Yz9kJiZcInNldFwiaW4gZCYmdm9pZCAwIT09KGU9ZC5zZXQoYSxjLGIpKT9lOihhLnNldEF0dHJpYnV0ZShiLGMrXCJcIiksYyk6dm9pZCBuLnJlbW92ZUF0dHIoYSxiKSl9LHJlbW92ZUF0dHI6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGU9MCxmPWImJmIubWF0Y2goRSk7aWYoZiYmMT09PWEubm9kZVR5cGUpd2hpbGUoYz1mW2UrK10pZD1uLnByb3BGaXhbY118fGMsbi5leHByLm1hdGNoLmJvb2wudGVzdChjKSYmKGFbZF09ITEpLGEucmVtb3ZlQXR0cmlidXRlKGMpfSxhdHRySG9va3M6e3R5cGU6e3NldDpmdW5jdGlvbihhLGIpe2lmKCFrLnJhZGlvVmFsdWUmJlwicmFkaW9cIj09PWImJm4ubm9kZU5hbWUoYSxcImlucHV0XCIpKXt2YXIgYz1hLnZhbHVlO3JldHVybiBhLnNldEF0dHJpYnV0ZShcInR5cGVcIixiKSxjJiYoYS52YWx1ZT1jKSxifX19fX0pLFphPXtzZXQ6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBiPT09ITE/bi5yZW1vdmVBdHRyKGEsYyk6YS5zZXRBdHRyaWJ1dGUoYyxjKSxjfX0sbi5lYWNoKG4uZXhwci5tYXRjaC5ib29sLnNvdXJjZS5tYXRjaCgvXFx3Ky9nKSxmdW5jdGlvbihhLGIpe3ZhciBjPSRhW2JdfHxuLmZpbmQuYXR0cjskYVtiXT1mdW5jdGlvbihhLGIsZCl7dmFyIGUsZjtyZXR1cm4gZHx8KGY9JGFbYl0sJGFbYl09ZSxlPW51bGwhPWMoYSxiLGQpP2IudG9Mb3dlckNhc2UoKTpudWxsLCRhW2JdPWYpLGV9fSk7dmFyIF9hPS9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbikkL2k7bi5mbi5leHRlbmQoe3Byb3A6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSih0aGlzLG4ucHJvcCxhLGIsYXJndW1lbnRzLmxlbmd0aD4xKX0scmVtb3ZlUHJvcDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7ZGVsZXRlIHRoaXNbbi5wcm9wRml4W2FdfHxhXX0pfX0pLG4uZXh0ZW5kKHtwcm9wRml4OntcImZvclwiOlwiaHRtbEZvclwiLFwiY2xhc3NcIjpcImNsYXNzTmFtZVwifSxwcm9wOmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGYsZz1hLm5vZGVUeXBlO2lmKGEmJjMhPT1nJiY4IT09ZyYmMiE9PWcpcmV0dXJuIGY9MSE9PWd8fCFuLmlzWE1MRG9jKGEpLGYmJihiPW4ucHJvcEZpeFtiXXx8YixlPW4ucHJvcEhvb2tzW2JdKSx2b2lkIDAhPT1jP2UmJlwic2V0XCJpbiBlJiZ2b2lkIDAhPT0oZD1lLnNldChhLGMsYikpP2Q6YVtiXT1jOmUmJlwiZ2V0XCJpbiBlJiZudWxsIT09KGQ9ZS5nZXQoYSxiKSk/ZDphW2JdfSxwcm9wSG9va3M6e3RhYkluZGV4OntnZXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaGFzQXR0cmlidXRlKFwidGFiaW5kZXhcIil8fF9hLnRlc3QoYS5ub2RlTmFtZSl8fGEuaHJlZj9hLnRhYkluZGV4Oi0xfX19fSksay5vcHRTZWxlY3RlZHx8KG4ucHJvcEhvb2tzLnNlbGVjdGVkPXtnZXQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5wYXJlbnROb2RlO3JldHVybiBiJiZiLnBhcmVudE5vZGUmJmIucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4LG51bGx9fSksbi5lYWNoKFtcInRhYkluZGV4XCIsXCJyZWFkT25seVwiLFwibWF4TGVuZ3RoXCIsXCJjZWxsU3BhY2luZ1wiLFwiY2VsbFBhZGRpbmdcIixcInJvd1NwYW5cIixcImNvbFNwYW5cIixcInVzZU1hcFwiLFwiZnJhbWVCb3JkZXJcIixcImNvbnRlbnRFZGl0YWJsZVwiXSxmdW5jdGlvbigpe24ucHJvcEZpeFt0aGlzLnRvTG93ZXJDYXNlKCldPXRoaXN9KTt2YXIgYWI9L1tcXHRcXHJcXG5cXGZdL2c7bi5mbi5leHRlbmQoe2FkZENsYXNzOmZ1bmN0aW9uKGEpe3ZhciBiLGMsZCxlLGYsZyxoPVwic3RyaW5nXCI9PXR5cGVvZiBhJiZhLGk9MCxqPXRoaXMubGVuZ3RoO2lmKG4uaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe24odGhpcykuYWRkQ2xhc3MoYS5jYWxsKHRoaXMsYix0aGlzLmNsYXNzTmFtZSkpfSk7aWYoaClmb3IoYj0oYXx8XCJcIikubWF0Y2goRSl8fFtdO2o+aTtpKyspaWYoYz10aGlzW2ldLGQ9MT09PWMubm9kZVR5cGUmJihjLmNsYXNzTmFtZT8oXCIgXCIrYy5jbGFzc05hbWUrXCIgXCIpLnJlcGxhY2UoYWIsXCIgXCIpOlwiIFwiKSl7Zj0wO3doaWxlKGU9YltmKytdKWQuaW5kZXhPZihcIiBcIitlK1wiIFwiKTwwJiYoZCs9ZStcIiBcIik7Zz1uLnRyaW0oZCksYy5jbGFzc05hbWUhPT1nJiYoYy5jbGFzc05hbWU9Zyl9cmV0dXJuIHRoaXN9LHJlbW92ZUNsYXNzOmZ1bmN0aW9uKGEpe3ZhciBiLGMsZCxlLGYsZyxoPTA9PT1hcmd1bWVudHMubGVuZ3RofHxcInN0cmluZ1wiPT10eXBlb2YgYSYmYSxpPTAsaj10aGlzLmxlbmd0aDtpZihuLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXtuKHRoaXMpLnJlbW92ZUNsYXNzKGEuY2FsbCh0aGlzLGIsdGhpcy5jbGFzc05hbWUpKX0pO2lmKGgpZm9yKGI9KGF8fFwiXCIpLm1hdGNoKEUpfHxbXTtqPmk7aSsrKWlmKGM9dGhpc1tpXSxkPTE9PT1jLm5vZGVUeXBlJiYoYy5jbGFzc05hbWU/KFwiIFwiK2MuY2xhc3NOYW1lK1wiIFwiKS5yZXBsYWNlKGFiLFwiIFwiKTpcIlwiKSl7Zj0wO3doaWxlKGU9YltmKytdKXdoaWxlKGQuaW5kZXhPZihcIiBcIitlK1wiIFwiKT49MClkPWQucmVwbGFjZShcIiBcIitlK1wiIFwiLFwiIFwiKTtnPWE/bi50cmltKGQpOlwiXCIsYy5jbGFzc05hbWUhPT1nJiYoYy5jbGFzc05hbWU9Zyl9cmV0dXJuIHRoaXN9LHRvZ2dsZUNsYXNzOmZ1bmN0aW9uKGEsYil7dmFyIGM9dHlwZW9mIGE7cmV0dXJuXCJib29sZWFuXCI9PXR5cGVvZiBiJiZcInN0cmluZ1wiPT09Yz9iP3RoaXMuYWRkQ2xhc3MoYSk6dGhpcy5yZW1vdmVDbGFzcyhhKTp0aGlzLmVhY2gobi5pc0Z1bmN0aW9uKGEpP2Z1bmN0aW9uKGMpe24odGhpcykudG9nZ2xlQ2xhc3MoYS5jYWxsKHRoaXMsYyx0aGlzLmNsYXNzTmFtZSxiKSxiKX06ZnVuY3Rpb24oKXtpZihcInN0cmluZ1wiPT09Yyl7dmFyIGIsZD0wLGU9bih0aGlzKSxmPWEubWF0Y2goRSl8fFtdO3doaWxlKGI9ZltkKytdKWUuaGFzQ2xhc3MoYik/ZS5yZW1vdmVDbGFzcyhiKTplLmFkZENsYXNzKGIpfWVsc2UoYz09PVV8fFwiYm9vbGVhblwiPT09YykmJih0aGlzLmNsYXNzTmFtZSYmTC5zZXQodGhpcyxcIl9fY2xhc3NOYW1lX19cIix0aGlzLmNsYXNzTmFtZSksdGhpcy5jbGFzc05hbWU9dGhpcy5jbGFzc05hbWV8fGE9PT0hMT9cIlwiOkwuZ2V0KHRoaXMsXCJfX2NsYXNzTmFtZV9fXCIpfHxcIlwiKX0pfSxoYXNDbGFzczpmdW5jdGlvbihhKXtmb3IodmFyIGI9XCIgXCIrYStcIiBcIixjPTAsZD10aGlzLmxlbmd0aDtkPmM7YysrKWlmKDE9PT10aGlzW2NdLm5vZGVUeXBlJiYoXCIgXCIrdGhpc1tjXS5jbGFzc05hbWUrXCIgXCIpLnJlcGxhY2UoYWIsXCIgXCIpLmluZGV4T2YoYik+PTApcmV0dXJuITA7cmV0dXJuITF9fSk7dmFyIGJiPS9cXHIvZztuLmZuLmV4dGVuZCh7dmFsOmZ1bmN0aW9uKGEpe3ZhciBiLGMsZCxlPXRoaXNbMF07e2lmKGFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIGQ9bi5pc0Z1bmN0aW9uKGEpLHRoaXMuZWFjaChmdW5jdGlvbihjKXt2YXIgZTsxPT09dGhpcy5ub2RlVHlwZSYmKGU9ZD9hLmNhbGwodGhpcyxjLG4odGhpcykudmFsKCkpOmEsbnVsbD09ZT9lPVwiXCI6XCJudW1iZXJcIj09dHlwZW9mIGU/ZSs9XCJcIjpuLmlzQXJyYXkoZSkmJihlPW4ubWFwKGUsZnVuY3Rpb24oYSl7cmV0dXJuIG51bGw9PWE/XCJcIjphK1wiXCJ9KSksYj1uLnZhbEhvb2tzW3RoaXMudHlwZV18fG4udmFsSG9va3NbdGhpcy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSxiJiZcInNldFwiaW4gYiYmdm9pZCAwIT09Yi5zZXQodGhpcyxlLFwidmFsdWVcIil8fCh0aGlzLnZhbHVlPWUpKX0pO2lmKGUpcmV0dXJuIGI9bi52YWxIb29rc1tlLnR5cGVdfHxuLnZhbEhvb2tzW2Uubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0sYiYmXCJnZXRcImluIGImJnZvaWQgMCE9PShjPWIuZ2V0KGUsXCJ2YWx1ZVwiKSk/YzooYz1lLnZhbHVlLFwic3RyaW5nXCI9PXR5cGVvZiBjP2MucmVwbGFjZShiYixcIlwiKTpudWxsPT1jP1wiXCI6Yyl9fX0pLG4uZXh0ZW5kKHt2YWxIb29rczp7b3B0aW9uOntnZXQ6ZnVuY3Rpb24oYSl7dmFyIGI9bi5maW5kLmF0dHIoYSxcInZhbHVlXCIpO3JldHVybiBudWxsIT1iP2I6bi50cmltKG4udGV4dChhKSl9fSxzZWxlY3Q6e2dldDpmdW5jdGlvbihhKXtmb3IodmFyIGIsYyxkPWEub3B0aW9ucyxlPWEuc2VsZWN0ZWRJbmRleCxmPVwic2VsZWN0LW9uZVwiPT09YS50eXBlfHwwPmUsZz1mP251bGw6W10saD1mP2UrMTpkLmxlbmd0aCxpPTA+ZT9oOmY/ZTowO2g+aTtpKyspaWYoYz1kW2ldLCEoIWMuc2VsZWN0ZWQmJmkhPT1lfHwoay5vcHREaXNhYmxlZD9jLmRpc2FibGVkOm51bGwhPT1jLmdldEF0dHJpYnV0ZShcImRpc2FibGVkXCIpKXx8Yy5wYXJlbnROb2RlLmRpc2FibGVkJiZuLm5vZGVOYW1lKGMucGFyZW50Tm9kZSxcIm9wdGdyb3VwXCIpKSl7aWYoYj1uKGMpLnZhbCgpLGYpcmV0dXJuIGI7Zy5wdXNoKGIpfXJldHVybiBnfSxzZXQ6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGU9YS5vcHRpb25zLGY9bi5tYWtlQXJyYXkoYiksZz1lLmxlbmd0aDt3aGlsZShnLS0pZD1lW2ddLChkLnNlbGVjdGVkPW4uaW5BcnJheShkLnZhbHVlLGYpPj0wKSYmKGM9ITApO3JldHVybiBjfHwoYS5zZWxlY3RlZEluZGV4PS0xKSxmfX19fSksbi5lYWNoKFtcInJhZGlvXCIsXCJjaGVja2JveFwiXSxmdW5jdGlvbigpe24udmFsSG9va3NbdGhpc109e3NldDpmdW5jdGlvbihhLGIpe3JldHVybiBuLmlzQXJyYXkoYik/YS5jaGVja2VkPW4uaW5BcnJheShuKGEpLnZhbCgpLGIpPj0wOnZvaWQgMH19LGsuY2hlY2tPbnx8KG4udmFsSG9va3NbdGhpc10uZ2V0PWZ1bmN0aW9uKGEpe3JldHVybiBudWxsPT09YS5nZXRBdHRyaWJ1dGUoXCJ2YWx1ZVwiKT9cIm9uXCI6YS52YWx1ZX0pfSksbi5lYWNoKFwiYmx1ciBmb2N1cyBmb2N1c2luIGZvY3Vzb3V0IGxvYWQgcmVzaXplIHNjcm9sbCB1bmxvYWQgY2xpY2sgZGJsY2xpY2sgbW91c2Vkb3duIG1vdXNldXAgbW91c2Vtb3ZlIG1vdXNlb3ZlciBtb3VzZW91dCBtb3VzZWVudGVyIG1vdXNlbGVhdmUgY2hhbmdlIHNlbGVjdCBzdWJtaXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBlcnJvciBjb250ZXh0bWVudVwiLnNwbGl0KFwiIFwiKSxmdW5jdGlvbihhLGIpe24uZm5bYl09ZnVuY3Rpb24oYSxjKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD4wP3RoaXMub24oYixudWxsLGEsYyk6dGhpcy50cmlnZ2VyKGIpfX0pLG4uZm4uZXh0ZW5kKHtob3ZlcjpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLm1vdXNlZW50ZXIoYSkubW91c2VsZWF2ZShifHxhKX0sYmluZDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIHRoaXMub24oYSxudWxsLGIsYyl9LHVuYmluZDpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLm9mZihhLG51bGwsYil9LGRlbGVnYXRlOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiB0aGlzLm9uKGIsYSxjLGQpfSx1bmRlbGVnYXRlOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/dGhpcy5vZmYoYSxcIioqXCIpOnRoaXMub2ZmKGIsYXx8XCIqKlwiLGMpfX0pO3ZhciBjYj1uLm5vdygpLGRiPS9cXD8vO24ucGFyc2VKU09OPWZ1bmN0aW9uKGEpe3JldHVybiBKU09OLnBhcnNlKGErXCJcIil9LG4ucGFyc2VYTUw9ZnVuY3Rpb24oYSl7dmFyIGIsYztpZighYXx8XCJzdHJpbmdcIiE9dHlwZW9mIGEpcmV0dXJuIG51bGw7dHJ5e2M9bmV3IERPTVBhcnNlcixiPWMucGFyc2VGcm9tU3RyaW5nKGEsXCJ0ZXh0L3htbFwiKX1jYXRjaChkKXtiPXZvaWQgMH1yZXR1cm4oIWJ8fGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJwYXJzZXJlcnJvclwiKS5sZW5ndGgpJiZuLmVycm9yKFwiSW52YWxpZCBYTUw6IFwiK2EpLGJ9O3ZhciBlYj0vIy4qJC8sZmI9LyhbPyZdKV89W14mXSovLGdiPS9eKC4qPyk6WyBcXHRdKihbXlxcclxcbl0qKSQvZ20saGI9L14oPzphYm91dHxhcHB8YXBwLXN0b3JhZ2V8ListZXh0ZW5zaW9ufGZpbGV8cmVzfHdpZGdldCk6JC8saWI9L14oPzpHRVR8SEVBRCkkLyxqYj0vXlxcL1xcLy8sa2I9L14oW1xcdy4rLV0rOikoPzpcXC9cXC8oPzpbXlxcLz8jXSpAfCkoW15cXC8/IzpdKikoPzo6KFxcZCspfCl8KS8sbGI9e30sbWI9e30sbmI9XCIqL1wiLmNvbmNhdChcIipcIiksb2I9YS5sb2NhdGlvbi5ocmVmLHBiPWtiLmV4ZWMob2IudG9Mb3dlckNhc2UoKSl8fFtdO2Z1bmN0aW9uIHFiKGEpe3JldHVybiBmdW5jdGlvbihiLGMpe1wic3RyaW5nXCIhPXR5cGVvZiBiJiYoYz1iLGI9XCIqXCIpO3ZhciBkLGU9MCxmPWIudG9Mb3dlckNhc2UoKS5tYXRjaChFKXx8W107aWYobi5pc0Z1bmN0aW9uKGMpKXdoaWxlKGQ9ZltlKytdKVwiK1wiPT09ZFswXT8oZD1kLnNsaWNlKDEpfHxcIipcIiwoYVtkXT1hW2RdfHxbXSkudW5zaGlmdChjKSk6KGFbZF09YVtkXXx8W10pLnB1c2goYyl9fWZ1bmN0aW9uIHJiKGEsYixjLGQpe3ZhciBlPXt9LGY9YT09PW1iO2Z1bmN0aW9uIGcoaCl7dmFyIGk7cmV0dXJuIGVbaF09ITAsbi5lYWNoKGFbaF18fFtdLGZ1bmN0aW9uKGEsaCl7dmFyIGo9aChiLGMsZCk7cmV0dXJuXCJzdHJpbmdcIiE9dHlwZW9mIGp8fGZ8fGVbal0/Zj8hKGk9aik6dm9pZCAwOihiLmRhdGFUeXBlcy51bnNoaWZ0KGopLGcoaiksITEpfSksaX1yZXR1cm4gZyhiLmRhdGFUeXBlc1swXSl8fCFlW1wiKlwiXSYmZyhcIipcIil9ZnVuY3Rpb24gc2IoYSxiKXt2YXIgYyxkLGU9bi5hamF4U2V0dGluZ3MuZmxhdE9wdGlvbnN8fHt9O2ZvcihjIGluIGIpdm9pZCAwIT09YltjXSYmKChlW2NdP2E6ZHx8KGQ9e30pKVtjXT1iW2NdKTtyZXR1cm4gZCYmbi5leHRlbmQoITAsYSxkKSxhfWZ1bmN0aW9uIHRiKGEsYixjKXt2YXIgZCxlLGYsZyxoPWEuY29udGVudHMsaT1hLmRhdGFUeXBlczt3aGlsZShcIipcIj09PWlbMF0paS5zaGlmdCgpLHZvaWQgMD09PWQmJihkPWEubWltZVR5cGV8fGIuZ2V0UmVzcG9uc2VIZWFkZXIoXCJDb250ZW50LVR5cGVcIikpO2lmKGQpZm9yKGUgaW4gaClpZihoW2VdJiZoW2VdLnRlc3QoZCkpe2kudW5zaGlmdChlKTticmVha31pZihpWzBdaW4gYylmPWlbMF07ZWxzZXtmb3IoZSBpbiBjKXtpZighaVswXXx8YS5jb252ZXJ0ZXJzW2UrXCIgXCIraVswXV0pe2Y9ZTticmVha31nfHwoZz1lKX1mPWZ8fGd9cmV0dXJuIGY/KGYhPT1pWzBdJiZpLnVuc2hpZnQoZiksY1tmXSk6dm9pZCAwfWZ1bmN0aW9uIHViKGEsYixjLGQpe3ZhciBlLGYsZyxoLGksaj17fSxrPWEuZGF0YVR5cGVzLnNsaWNlKCk7aWYoa1sxXSlmb3IoZyBpbiBhLmNvbnZlcnRlcnMpaltnLnRvTG93ZXJDYXNlKCldPWEuY29udmVydGVyc1tnXTtmPWsuc2hpZnQoKTt3aGlsZShmKWlmKGEucmVzcG9uc2VGaWVsZHNbZl0mJihjW2EucmVzcG9uc2VGaWVsZHNbZl1dPWIpLCFpJiZkJiZhLmRhdGFGaWx0ZXImJihiPWEuZGF0YUZpbHRlcihiLGEuZGF0YVR5cGUpKSxpPWYsZj1rLnNoaWZ0KCkpaWYoXCIqXCI9PT1mKWY9aTtlbHNlIGlmKFwiKlwiIT09aSYmaSE9PWYpe2lmKGc9altpK1wiIFwiK2ZdfHxqW1wiKiBcIitmXSwhZylmb3IoZSBpbiBqKWlmKGg9ZS5zcGxpdChcIiBcIiksaFsxXT09PWYmJihnPWpbaStcIiBcIitoWzBdXXx8altcIiogXCIraFswXV0pKXtnPT09ITA/Zz1qW2VdOmpbZV0hPT0hMCYmKGY9aFswXSxrLnVuc2hpZnQoaFsxXSkpO2JyZWFrfWlmKGchPT0hMClpZihnJiZhW1widGhyb3dzXCJdKWI9ZyhiKTtlbHNlIHRyeXtiPWcoYil9Y2F0Y2gobCl7cmV0dXJue3N0YXRlOlwicGFyc2VyZXJyb3JcIixlcnJvcjpnP2w6XCJObyBjb252ZXJzaW9uIGZyb20gXCIraStcIiB0byBcIitmfX19cmV0dXJue3N0YXRlOlwic3VjY2Vzc1wiLGRhdGE6Yn19bi5leHRlbmQoe2FjdGl2ZTowLGxhc3RNb2RpZmllZDp7fSxldGFnOnt9LGFqYXhTZXR0aW5nczp7dXJsOm9iLHR5cGU6XCJHRVRcIixpc0xvY2FsOmhiLnRlc3QocGJbMV0pLGdsb2JhbDohMCxwcm9jZXNzRGF0YTohMCxhc3luYzohMCxjb250ZW50VHlwZTpcImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDsgY2hhcnNldD1VVEYtOFwiLGFjY2VwdHM6e1wiKlwiOm5iLHRleHQ6XCJ0ZXh0L3BsYWluXCIsaHRtbDpcInRleHQvaHRtbFwiLHhtbDpcImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWxcIixqc29uOlwiYXBwbGljYXRpb24vanNvbiwgdGV4dC9qYXZhc2NyaXB0XCJ9LGNvbnRlbnRzOnt4bWw6L3htbC8saHRtbDovaHRtbC8sanNvbjovanNvbi99LHJlc3BvbnNlRmllbGRzOnt4bWw6XCJyZXNwb25zZVhNTFwiLHRleHQ6XCJyZXNwb25zZVRleHRcIixqc29uOlwicmVzcG9uc2VKU09OXCJ9LGNvbnZlcnRlcnM6e1wiKiB0ZXh0XCI6U3RyaW5nLFwidGV4dCBodG1sXCI6ITAsXCJ0ZXh0IGpzb25cIjpuLnBhcnNlSlNPTixcInRleHQgeG1sXCI6bi5wYXJzZVhNTH0sZmxhdE9wdGlvbnM6e3VybDohMCxjb250ZXh0OiEwfX0sYWpheFNldHVwOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGI/c2Ioc2IoYSxuLmFqYXhTZXR0aW5ncyksYik6c2Iobi5hamF4U2V0dGluZ3MsYSl9LGFqYXhQcmVmaWx0ZXI6cWIobGIpLGFqYXhUcmFuc3BvcnQ6cWIobWIpLGFqYXg6ZnVuY3Rpb24oYSxiKXtcIm9iamVjdFwiPT10eXBlb2YgYSYmKGI9YSxhPXZvaWQgMCksYj1ifHx7fTt2YXIgYyxkLGUsZixnLGgsaSxqLGs9bi5hamF4U2V0dXAoe30sYiksbD1rLmNvbnRleHR8fGssbT1rLmNvbnRleHQmJihsLm5vZGVUeXBlfHxsLmpxdWVyeSk/bihsKTpuLmV2ZW50LG89bi5EZWZlcnJlZCgpLHA9bi5DYWxsYmFja3MoXCJvbmNlIG1lbW9yeVwiKSxxPWsuc3RhdHVzQ29kZXx8e30scj17fSxzPXt9LHQ9MCx1PVwiY2FuY2VsZWRcIix2PXtyZWFkeVN0YXRlOjAsZ2V0UmVzcG9uc2VIZWFkZXI6ZnVuY3Rpb24oYSl7dmFyIGI7aWYoMj09PXQpe2lmKCFmKXtmPXt9O3doaWxlKGI9Z2IuZXhlYyhlKSlmW2JbMV0udG9Mb3dlckNhc2UoKV09YlsyXX1iPWZbYS50b0xvd2VyQ2FzZSgpXX1yZXR1cm4gbnVsbD09Yj9udWxsOmJ9LGdldEFsbFJlc3BvbnNlSGVhZGVyczpmdW5jdGlvbigpe3JldHVybiAyPT09dD9lOm51bGx9LHNldFJlcXVlc3RIZWFkZXI6ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLnRvTG93ZXJDYXNlKCk7cmV0dXJuIHR8fChhPXNbY109c1tjXXx8YSxyW2FdPWIpLHRoaXN9LG92ZXJyaWRlTWltZVR5cGU6ZnVuY3Rpb24oYSl7cmV0dXJuIHR8fChrLm1pbWVUeXBlPWEpLHRoaXN9LHN0YXR1c0NvZGU6ZnVuY3Rpb24oYSl7dmFyIGI7aWYoYSlpZigyPnQpZm9yKGIgaW4gYSlxW2JdPVtxW2JdLGFbYl1dO2Vsc2Ugdi5hbHdheXMoYVt2LnN0YXR1c10pO3JldHVybiB0aGlzfSxhYm9ydDpmdW5jdGlvbihhKXt2YXIgYj1hfHx1O3JldHVybiBjJiZjLmFib3J0KGIpLHgoMCxiKSx0aGlzfX07aWYoby5wcm9taXNlKHYpLmNvbXBsZXRlPXAuYWRkLHYuc3VjY2Vzcz12LmRvbmUsdi5lcnJvcj12LmZhaWwsay51cmw9KChhfHxrLnVybHx8b2IpK1wiXCIpLnJlcGxhY2UoZWIsXCJcIikucmVwbGFjZShqYixwYlsxXStcIi8vXCIpLGsudHlwZT1iLm1ldGhvZHx8Yi50eXBlfHxrLm1ldGhvZHx8ay50eXBlLGsuZGF0YVR5cGVzPW4udHJpbShrLmRhdGFUeXBlfHxcIipcIikudG9Mb3dlckNhc2UoKS5tYXRjaChFKXx8W1wiXCJdLG51bGw9PWsuY3Jvc3NEb21haW4mJihoPWtiLmV4ZWMoay51cmwudG9Mb3dlckNhc2UoKSksay5jcm9zc0RvbWFpbj0hKCFofHxoWzFdPT09cGJbMV0mJmhbMl09PT1wYlsyXSYmKGhbM118fChcImh0dHA6XCI9PT1oWzFdP1wiODBcIjpcIjQ0M1wiKSk9PT0ocGJbM118fChcImh0dHA6XCI9PT1wYlsxXT9cIjgwXCI6XCI0NDNcIikpKSksay5kYXRhJiZrLnByb2Nlc3NEYXRhJiZcInN0cmluZ1wiIT10eXBlb2Ygay5kYXRhJiYoay5kYXRhPW4ucGFyYW0oay5kYXRhLGsudHJhZGl0aW9uYWwpKSxyYihsYixrLGIsdiksMj09PXQpcmV0dXJuIHY7aT1uLmV2ZW50JiZrLmdsb2JhbCxpJiYwPT09bi5hY3RpdmUrKyYmbi5ldmVudC50cmlnZ2VyKFwiYWpheFN0YXJ0XCIpLGsudHlwZT1rLnR5cGUudG9VcHBlckNhc2UoKSxrLmhhc0NvbnRlbnQ9IWliLnRlc3Qoay50eXBlKSxkPWsudXJsLGsuaGFzQ29udGVudHx8KGsuZGF0YSYmKGQ9ay51cmwrPShkYi50ZXN0KGQpP1wiJlwiOlwiP1wiKStrLmRhdGEsZGVsZXRlIGsuZGF0YSksay5jYWNoZT09PSExJiYoay51cmw9ZmIudGVzdChkKT9kLnJlcGxhY2UoZmIsXCIkMV89XCIrY2IrKyk6ZCsoZGIudGVzdChkKT9cIiZcIjpcIj9cIikrXCJfPVwiK2NiKyspKSxrLmlmTW9kaWZpZWQmJihuLmxhc3RNb2RpZmllZFtkXSYmdi5zZXRSZXF1ZXN0SGVhZGVyKFwiSWYtTW9kaWZpZWQtU2luY2VcIixuLmxhc3RNb2RpZmllZFtkXSksbi5ldGFnW2RdJiZ2LnNldFJlcXVlc3RIZWFkZXIoXCJJZi1Ob25lLU1hdGNoXCIsbi5ldGFnW2RdKSksKGsuZGF0YSYmay5oYXNDb250ZW50JiZrLmNvbnRlbnRUeXBlIT09ITF8fGIuY29udGVudFR5cGUpJiZ2LnNldFJlcXVlc3RIZWFkZXIoXCJDb250ZW50LVR5cGVcIixrLmNvbnRlbnRUeXBlKSx2LnNldFJlcXVlc3RIZWFkZXIoXCJBY2NlcHRcIixrLmRhdGFUeXBlc1swXSYmay5hY2NlcHRzW2suZGF0YVR5cGVzWzBdXT9rLmFjY2VwdHNbay5kYXRhVHlwZXNbMF1dKyhcIipcIiE9PWsuZGF0YVR5cGVzWzBdP1wiLCBcIituYitcIjsgcT0wLjAxXCI6XCJcIik6ay5hY2NlcHRzW1wiKlwiXSk7Zm9yKGogaW4gay5oZWFkZXJzKXYuc2V0UmVxdWVzdEhlYWRlcihqLGsuaGVhZGVyc1tqXSk7aWYoay5iZWZvcmVTZW5kJiYoay5iZWZvcmVTZW5kLmNhbGwobCx2LGspPT09ITF8fDI9PT10KSlyZXR1cm4gdi5hYm9ydCgpO3U9XCJhYm9ydFwiO2ZvcihqIGlue3N1Y2Nlc3M6MSxlcnJvcjoxLGNvbXBsZXRlOjF9KXZbal0oa1tqXSk7aWYoYz1yYihtYixrLGIsdikpe3YucmVhZHlTdGF0ZT0xLGkmJm0udHJpZ2dlcihcImFqYXhTZW5kXCIsW3Ysa10pLGsuYXN5bmMmJmsudGltZW91dD4wJiYoZz1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7di5hYm9ydChcInRpbWVvdXRcIil9LGsudGltZW91dCkpO3RyeXt0PTEsYy5zZW5kKHIseCl9Y2F0Y2godyl7aWYoISgyPnQpKXRocm93IHc7eCgtMSx3KX19ZWxzZSB4KC0xLFwiTm8gVHJhbnNwb3J0XCIpO2Z1bmN0aW9uIHgoYSxiLGYsaCl7dmFyIGoscixzLHUsdyx4PWI7MiE9PXQmJih0PTIsZyYmY2xlYXJUaW1lb3V0KGcpLGM9dm9pZCAwLGU9aHx8XCJcIix2LnJlYWR5U3RhdGU9YT4wPzQ6MCxqPWE+PTIwMCYmMzAwPmF8fDMwND09PWEsZiYmKHU9dGIoayx2LGYpKSx1PXViKGssdSx2LGopLGo/KGsuaWZNb2RpZmllZCYmKHc9di5nZXRSZXNwb25zZUhlYWRlcihcIkxhc3QtTW9kaWZpZWRcIiksdyYmKG4ubGFzdE1vZGlmaWVkW2RdPXcpLHc9di5nZXRSZXNwb25zZUhlYWRlcihcImV0YWdcIiksdyYmKG4uZXRhZ1tkXT13KSksMjA0PT09YXx8XCJIRUFEXCI9PT1rLnR5cGU/eD1cIm5vY29udGVudFwiOjMwND09PWE/eD1cIm5vdG1vZGlmaWVkXCI6KHg9dS5zdGF0ZSxyPXUuZGF0YSxzPXUuZXJyb3Isaj0hcykpOihzPXgsKGF8fCF4KSYmKHg9XCJlcnJvclwiLDA+YSYmKGE9MCkpKSx2LnN0YXR1cz1hLHYuc3RhdHVzVGV4dD0oYnx8eCkrXCJcIixqP28ucmVzb2x2ZVdpdGgobCxbcix4LHZdKTpvLnJlamVjdFdpdGgobCxbdix4LHNdKSx2LnN0YXR1c0NvZGUocSkscT12b2lkIDAsaSYmbS50cmlnZ2VyKGo/XCJhamF4U3VjY2Vzc1wiOlwiYWpheEVycm9yXCIsW3YsayxqP3I6c10pLHAuZmlyZVdpdGgobCxbdix4XSksaSYmKG0udHJpZ2dlcihcImFqYXhDb21wbGV0ZVwiLFt2LGtdKSwtLW4uYWN0aXZlfHxuLmV2ZW50LnRyaWdnZXIoXCJhamF4U3RvcFwiKSkpfXJldHVybiB2fSxnZXRKU09OOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbi5nZXQoYSxiLGMsXCJqc29uXCIpfSxnZXRTY3JpcHQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbi5nZXQoYSx2b2lkIDAsYixcInNjcmlwdFwiKX19KSxuLmVhY2goW1wiZ2V0XCIsXCJwb3N0XCJdLGZ1bmN0aW9uKGEsYil7bltiXT1mdW5jdGlvbihhLGMsZCxlKXtyZXR1cm4gbi5pc0Z1bmN0aW9uKGMpJiYoZT1lfHxkLGQ9YyxjPXZvaWQgMCksbi5hamF4KHt1cmw6YSx0eXBlOmIsZGF0YVR5cGU6ZSxkYXRhOmMsc3VjY2VzczpkfSl9fSksbi5fZXZhbFVybD1mdW5jdGlvbihhKXtyZXR1cm4gbi5hamF4KHt1cmw6YSx0eXBlOlwiR0VUXCIsZGF0YVR5cGU6XCJzY3JpcHRcIixhc3luYzohMSxnbG9iYWw6ITEsXCJ0aHJvd3NcIjohMH0pfSxuLmZuLmV4dGVuZCh7d3JhcEFsbDpmdW5jdGlvbihhKXt2YXIgYjtyZXR1cm4gbi5pc0Z1bmN0aW9uKGEpP3RoaXMuZWFjaChmdW5jdGlvbihiKXtuKHRoaXMpLndyYXBBbGwoYS5jYWxsKHRoaXMsYikpfSk6KHRoaXNbMF0mJihiPW4oYSx0aGlzWzBdLm93bmVyRG9jdW1lbnQpLmVxKDApLmNsb25lKCEwKSx0aGlzWzBdLnBhcmVudE5vZGUmJmIuaW5zZXJ0QmVmb3JlKHRoaXNbMF0pLGIubWFwKGZ1bmN0aW9uKCl7dmFyIGE9dGhpczt3aGlsZShhLmZpcnN0RWxlbWVudENoaWxkKWE9YS5maXJzdEVsZW1lbnRDaGlsZDtyZXR1cm4gYX0pLmFwcGVuZCh0aGlzKSksdGhpcyl9LHdyYXBJbm5lcjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lYWNoKG4uaXNGdW5jdGlvbihhKT9mdW5jdGlvbihiKXtuKHRoaXMpLndyYXBJbm5lcihhLmNhbGwodGhpcyxiKSl9OmZ1bmN0aW9uKCl7dmFyIGI9bih0aGlzKSxjPWIuY29udGVudHMoKTtjLmxlbmd0aD9jLndyYXBBbGwoYSk6Yi5hcHBlbmQoYSl9KX0sd3JhcDpmdW5jdGlvbihhKXt2YXIgYj1uLmlzRnVuY3Rpb24oYSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihjKXtuKHRoaXMpLndyYXBBbGwoYj9hLmNhbGwodGhpcyxjKTphKX0pfSx1bndyYXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYXJlbnQoKS5lYWNoKGZ1bmN0aW9uKCl7bi5ub2RlTmFtZSh0aGlzLFwiYm9keVwiKXx8bih0aGlzKS5yZXBsYWNlV2l0aCh0aGlzLmNoaWxkTm9kZXMpfSkuZW5kKCl9fSksbi5leHByLmZpbHRlcnMuaGlkZGVuPWZ1bmN0aW9uKGEpe3JldHVybiBhLm9mZnNldFdpZHRoPD0wJiZhLm9mZnNldEhlaWdodDw9MH0sbi5leHByLmZpbHRlcnMudmlzaWJsZT1mdW5jdGlvbihhKXtyZXR1cm4hbi5leHByLmZpbHRlcnMuaGlkZGVuKGEpfTt2YXIgdmI9LyUyMC9nLHdiPS9cXFtcXF0kLyx4Yj0vXFxyP1xcbi9nLHliPS9eKD86c3VibWl0fGJ1dHRvbnxpbWFnZXxyZXNldHxmaWxlKSQvaSx6Yj0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxrZXlnZW4pL2k7ZnVuY3Rpb24gQWIoYSxiLGMsZCl7dmFyIGU7aWYobi5pc0FycmF5KGIpKW4uZWFjaChiLGZ1bmN0aW9uKGIsZSl7Y3x8d2IudGVzdChhKT9kKGEsZSk6QWIoYStcIltcIisoXCJvYmplY3RcIj09dHlwZW9mIGU/YjpcIlwiKStcIl1cIixlLGMsZCl9KTtlbHNlIGlmKGN8fFwib2JqZWN0XCIhPT1uLnR5cGUoYikpZChhLGIpO2Vsc2UgZm9yKGUgaW4gYilBYihhK1wiW1wiK2UrXCJdXCIsYltlXSxjLGQpfW4ucGFyYW09ZnVuY3Rpb24oYSxiKXt2YXIgYyxkPVtdLGU9ZnVuY3Rpb24oYSxiKXtiPW4uaXNGdW5jdGlvbihiKT9iKCk6bnVsbD09Yj9cIlwiOmIsZFtkLmxlbmd0aF09ZW5jb2RlVVJJQ29tcG9uZW50KGEpK1wiPVwiK2VuY29kZVVSSUNvbXBvbmVudChiKX07aWYodm9pZCAwPT09YiYmKGI9bi5hamF4U2V0dGluZ3MmJm4uYWpheFNldHRpbmdzLnRyYWRpdGlvbmFsKSxuLmlzQXJyYXkoYSl8fGEuanF1ZXJ5JiYhbi5pc1BsYWluT2JqZWN0KGEpKW4uZWFjaChhLGZ1bmN0aW9uKCl7ZSh0aGlzLm5hbWUsdGhpcy52YWx1ZSl9KTtlbHNlIGZvcihjIGluIGEpQWIoYyxhW2NdLGIsZSk7cmV0dXJuIGQuam9pbihcIiZcIikucmVwbGFjZSh2YixcIitcIil9LG4uZm4uZXh0ZW5kKHtzZXJpYWxpemU6ZnVuY3Rpb24oKXtyZXR1cm4gbi5wYXJhbSh0aGlzLnNlcmlhbGl6ZUFycmF5KCkpfSxzZXJpYWxpemVBcnJheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe3ZhciBhPW4ucHJvcCh0aGlzLFwiZWxlbWVudHNcIik7cmV0dXJuIGE/bi5tYWtlQXJyYXkoYSk6dGhpc30pLmZpbHRlcihmdW5jdGlvbigpe3ZhciBhPXRoaXMudHlwZTtyZXR1cm4gdGhpcy5uYW1lJiYhbih0aGlzKS5pcyhcIjpkaXNhYmxlZFwiKSYmemIudGVzdCh0aGlzLm5vZGVOYW1lKSYmIXliLnRlc3QoYSkmJih0aGlzLmNoZWNrZWR8fCFULnRlc3QoYSkpfSkubWFwKGZ1bmN0aW9uKGEsYil7dmFyIGM9bih0aGlzKS52YWwoKTtyZXR1cm4gbnVsbD09Yz9udWxsOm4uaXNBcnJheShjKT9uLm1hcChjLGZ1bmN0aW9uKGEpe3JldHVybntuYW1lOmIubmFtZSx2YWx1ZTphLnJlcGxhY2UoeGIsXCJcXHJcXG5cIil9fSk6e25hbWU6Yi5uYW1lLHZhbHVlOmMucmVwbGFjZSh4YixcIlxcclxcblwiKX19KS5nZXQoKX19KSxuLmFqYXhTZXR0aW5ncy54aHI9ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIG5ldyBYTUxIdHRwUmVxdWVzdH1jYXRjaChhKXt9fTt2YXIgQmI9MCxDYj17fSxEYj17MDoyMDAsMTIyMzoyMDR9LEViPW4uYWpheFNldHRpbmdzLnhocigpO2EuYXR0YWNoRXZlbnQmJmEuYXR0YWNoRXZlbnQoXCJvbnVubG9hZFwiLGZ1bmN0aW9uKCl7Zm9yKHZhciBhIGluIENiKUNiW2FdKCl9KSxrLmNvcnM9ISFFYiYmXCJ3aXRoQ3JlZGVudGlhbHNcImluIEViLGsuYWpheD1FYj0hIUViLG4uYWpheFRyYW5zcG9ydChmdW5jdGlvbihhKXt2YXIgYjtyZXR1cm4gay5jb3JzfHxFYiYmIWEuY3Jvc3NEb21haW4/e3NlbmQ6ZnVuY3Rpb24oYyxkKXt2YXIgZSxmPWEueGhyKCksZz0rK0JiO2lmKGYub3BlbihhLnR5cGUsYS51cmwsYS5hc3luYyxhLnVzZXJuYW1lLGEucGFzc3dvcmQpLGEueGhyRmllbGRzKWZvcihlIGluIGEueGhyRmllbGRzKWZbZV09YS54aHJGaWVsZHNbZV07YS5taW1lVHlwZSYmZi5vdmVycmlkZU1pbWVUeXBlJiZmLm92ZXJyaWRlTWltZVR5cGUoYS5taW1lVHlwZSksYS5jcm9zc0RvbWFpbnx8Y1tcIlgtUmVxdWVzdGVkLVdpdGhcIl18fChjW1wiWC1SZXF1ZXN0ZWQtV2l0aFwiXT1cIlhNTEh0dHBSZXF1ZXN0XCIpO2ZvcihlIGluIGMpZi5zZXRSZXF1ZXN0SGVhZGVyKGUsY1tlXSk7Yj1mdW5jdGlvbihhKXtyZXR1cm4gZnVuY3Rpb24oKXtiJiYoZGVsZXRlIENiW2ddLGI9Zi5vbmxvYWQ9Zi5vbmVycm9yPW51bGwsXCJhYm9ydFwiPT09YT9mLmFib3J0KCk6XCJlcnJvclwiPT09YT9kKGYuc3RhdHVzLGYuc3RhdHVzVGV4dCk6ZChEYltmLnN0YXR1c118fGYuc3RhdHVzLGYuc3RhdHVzVGV4dCxcInN0cmluZ1wiPT10eXBlb2YgZi5yZXNwb25zZVRleHQ/e3RleHQ6Zi5yZXNwb25zZVRleHR9OnZvaWQgMCxmLmdldEFsbFJlc3BvbnNlSGVhZGVycygpKSl9fSxmLm9ubG9hZD1iKCksZi5vbmVycm9yPWIoXCJlcnJvclwiKSxiPUNiW2ddPWIoXCJhYm9ydFwiKTt0cnl7Zi5zZW5kKGEuaGFzQ29udGVudCYmYS5kYXRhfHxudWxsKX1jYXRjaChoKXtpZihiKXRocm93IGh9fSxhYm9ydDpmdW5jdGlvbigpe2ImJmIoKX19OnZvaWQgMH0pLG4uYWpheFNldHVwKHthY2NlcHRzOntzY3JpcHQ6XCJ0ZXh0L2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2VjbWFzY3JpcHQsIGFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdFwifSxjb250ZW50czp7c2NyaXB0Oi8oPzpqYXZhfGVjbWEpc2NyaXB0L30sY29udmVydGVyczp7XCJ0ZXh0IHNjcmlwdFwiOmZ1bmN0aW9uKGEpe3JldHVybiBuLmdsb2JhbEV2YWwoYSksYX19fSksbi5hamF4UHJlZmlsdGVyKFwic2NyaXB0XCIsZnVuY3Rpb24oYSl7dm9pZCAwPT09YS5jYWNoZSYmKGEuY2FjaGU9ITEpLGEuY3Jvc3NEb21haW4mJihhLnR5cGU9XCJHRVRcIil9KSxuLmFqYXhUcmFuc3BvcnQoXCJzY3JpcHRcIixmdW5jdGlvbihhKXtpZihhLmNyb3NzRG9tYWluKXt2YXIgYixjO3JldHVybntzZW5kOmZ1bmN0aW9uKGQsZSl7Yj1uKFwiPHNjcmlwdD5cIikucHJvcCh7YXN5bmM6ITAsY2hhcnNldDphLnNjcmlwdENoYXJzZXQsc3JjOmEudXJsfSkub24oXCJsb2FkIGVycm9yXCIsYz1mdW5jdGlvbihhKXtiLnJlbW92ZSgpLGM9bnVsbCxhJiZlKFwiZXJyb3JcIj09PWEudHlwZT80MDQ6MjAwLGEudHlwZSl9KSxsLmhlYWQuYXBwZW5kQ2hpbGQoYlswXSl9LGFib3J0OmZ1bmN0aW9uKCl7YyYmYygpfX19fSk7dmFyIEZiPVtdLEdiPS8oPSlcXD8oPz0mfCQpfFxcP1xcPy87bi5hamF4U2V0dXAoe2pzb25wOlwiY2FsbGJhY2tcIixqc29ucENhbGxiYWNrOmZ1bmN0aW9uKCl7dmFyIGE9RmIucG9wKCl8fG4uZXhwYW5kbytcIl9cIitjYisrO3JldHVybiB0aGlzW2FdPSEwLGF9fSksbi5hamF4UHJlZmlsdGVyKFwianNvbiBqc29ucFwiLGZ1bmN0aW9uKGIsYyxkKXt2YXIgZSxmLGcsaD1iLmpzb25wIT09ITEmJihHYi50ZXN0KGIudXJsKT9cInVybFwiOlwic3RyaW5nXCI9PXR5cGVvZiBiLmRhdGEmJiEoYi5jb250ZW50VHlwZXx8XCJcIikuaW5kZXhPZihcImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZFwiKSYmR2IudGVzdChiLmRhdGEpJiZcImRhdGFcIik7cmV0dXJuIGh8fFwianNvbnBcIj09PWIuZGF0YVR5cGVzWzBdPyhlPWIuanNvbnBDYWxsYmFjaz1uLmlzRnVuY3Rpb24oYi5qc29ucENhbGxiYWNrKT9iLmpzb25wQ2FsbGJhY2soKTpiLmpzb25wQ2FsbGJhY2ssaD9iW2hdPWJbaF0ucmVwbGFjZShHYixcIiQxXCIrZSk6Yi5qc29ucCE9PSExJiYoYi51cmwrPShkYi50ZXN0KGIudXJsKT9cIiZcIjpcIj9cIikrYi5qc29ucCtcIj1cIitlKSxiLmNvbnZlcnRlcnNbXCJzY3JpcHQganNvblwiXT1mdW5jdGlvbigpe3JldHVybiBnfHxuLmVycm9yKGUrXCIgd2FzIG5vdCBjYWxsZWRcIiksZ1swXX0sYi5kYXRhVHlwZXNbMF09XCJqc29uXCIsZj1hW2VdLGFbZV09ZnVuY3Rpb24oKXtnPWFyZ3VtZW50c30sZC5hbHdheXMoZnVuY3Rpb24oKXthW2VdPWYsYltlXSYmKGIuanNvbnBDYWxsYmFjaz1jLmpzb25wQ2FsbGJhY2ssRmIucHVzaChlKSksZyYmbi5pc0Z1bmN0aW9uKGYpJiZmKGdbMF0pLGc9Zj12b2lkIDB9KSxcInNjcmlwdFwiKTp2b2lkIDB9KSxuLnBhcnNlSFRNTD1mdW5jdGlvbihhLGIsYyl7aWYoIWF8fFwic3RyaW5nXCIhPXR5cGVvZiBhKXJldHVybiBudWxsO1wiYm9vbGVhblwiPT10eXBlb2YgYiYmKGM9YixiPSExKSxiPWJ8fGw7dmFyIGQ9di5leGVjKGEpLGU9IWMmJltdO3JldHVybiBkP1tiLmNyZWF0ZUVsZW1lbnQoZFsxXSldOihkPW4uYnVpbGRGcmFnbWVudChbYV0sYixlKSxlJiZlLmxlbmd0aCYmbihlKS5yZW1vdmUoKSxuLm1lcmdlKFtdLGQuY2hpbGROb2RlcykpfTt2YXIgSGI9bi5mbi5sb2FkO24uZm4ubG9hZD1mdW5jdGlvbihhLGIsYyl7aWYoXCJzdHJpbmdcIiE9dHlwZW9mIGEmJkhiKXJldHVybiBIYi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dmFyIGQsZSxmLGc9dGhpcyxoPWEuaW5kZXhPZihcIiBcIik7cmV0dXJuIGg+PTAmJihkPW4udHJpbShhLnNsaWNlKGgpKSxhPWEuc2xpY2UoMCxoKSksbi5pc0Z1bmN0aW9uKGIpPyhjPWIsYj12b2lkIDApOmImJlwib2JqZWN0XCI9PXR5cGVvZiBiJiYoZT1cIlBPU1RcIiksZy5sZW5ndGg+MCYmbi5hamF4KHt1cmw6YSx0eXBlOmUsZGF0YVR5cGU6XCJodG1sXCIsZGF0YTpifSkuZG9uZShmdW5jdGlvbihhKXtmPWFyZ3VtZW50cyxnLmh0bWwoZD9uKFwiPGRpdj5cIikuYXBwZW5kKG4ucGFyc2VIVE1MKGEpKS5maW5kKGQpOmEpfSkuY29tcGxldGUoYyYmZnVuY3Rpb24oYSxiKXtnLmVhY2goYyxmfHxbYS5yZXNwb25zZVRleHQsYixhXSl9KSx0aGlzfSxuLmVhY2goW1wiYWpheFN0YXJ0XCIsXCJhamF4U3RvcFwiLFwiYWpheENvbXBsZXRlXCIsXCJhamF4RXJyb3JcIixcImFqYXhTdWNjZXNzXCIsXCJhamF4U2VuZFwiXSxmdW5jdGlvbihhLGIpe24uZm5bYl09ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMub24oYixhKX19KSxuLmV4cHIuZmlsdGVycy5hbmltYXRlZD1mdW5jdGlvbihhKXtyZXR1cm4gbi5ncmVwKG4udGltZXJzLGZ1bmN0aW9uKGIpe3JldHVybiBhPT09Yi5lbGVtfSkubGVuZ3RofTt2YXIgSWI9YS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7ZnVuY3Rpb24gSmIoYSl7cmV0dXJuIG4uaXNXaW5kb3coYSk/YTo5PT09YS5ub2RlVHlwZSYmYS5kZWZhdWx0Vmlld31uLm9mZnNldD17c2V0T2Zmc2V0OmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGYsZyxoLGksaixrPW4uY3NzKGEsXCJwb3NpdGlvblwiKSxsPW4oYSksbT17fTtcInN0YXRpY1wiPT09ayYmKGEuc3R5bGUucG9zaXRpb249XCJyZWxhdGl2ZVwiKSxoPWwub2Zmc2V0KCksZj1uLmNzcyhhLFwidG9wXCIpLGk9bi5jc3MoYSxcImxlZnRcIiksaj0oXCJhYnNvbHV0ZVwiPT09a3x8XCJmaXhlZFwiPT09aykmJihmK2kpLmluZGV4T2YoXCJhdXRvXCIpPi0xLGo/KGQ9bC5wb3NpdGlvbigpLGc9ZC50b3AsZT1kLmxlZnQpOihnPXBhcnNlRmxvYXQoZil8fDAsZT1wYXJzZUZsb2F0KGkpfHwwKSxuLmlzRnVuY3Rpb24oYikmJihiPWIuY2FsbChhLGMsaCkpLG51bGwhPWIudG9wJiYobS50b3A9Yi50b3AtaC50b3ArZyksbnVsbCE9Yi5sZWZ0JiYobS5sZWZ0PWIubGVmdC1oLmxlZnQrZSksXCJ1c2luZ1wiaW4gYj9iLnVzaW5nLmNhbGwoYSxtKTpsLmNzcyhtKX19LG4uZm4uZXh0ZW5kKHtvZmZzZXQ6ZnVuY3Rpb24oYSl7aWYoYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdm9pZCAwPT09YT90aGlzOnRoaXMuZWFjaChmdW5jdGlvbihiKXtuLm9mZnNldC5zZXRPZmZzZXQodGhpcyxhLGIpfSk7dmFyIGIsYyxkPXRoaXNbMF0sZT17dG9wOjAsbGVmdDowfSxmPWQmJmQub3duZXJEb2N1bWVudDtpZihmKXJldHVybiBiPWYuZG9jdW1lbnRFbGVtZW50LG4uY29udGFpbnMoYixkKT8odHlwZW9mIGQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0IT09VSYmKGU9ZC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSksYz1KYihmKSx7dG9wOmUudG9wK2MucGFnZVlPZmZzZXQtYi5jbGllbnRUb3AsbGVmdDplLmxlZnQrYy5wYWdlWE9mZnNldC1iLmNsaWVudExlZnR9KTplfSxwb3NpdGlvbjpmdW5jdGlvbigpe2lmKHRoaXNbMF0pe3ZhciBhLGIsYz10aGlzWzBdLGQ9e3RvcDowLGxlZnQ6MH07cmV0dXJuXCJmaXhlZFwiPT09bi5jc3MoYyxcInBvc2l0aW9uXCIpP2I9Yy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTooYT10aGlzLm9mZnNldFBhcmVudCgpLGI9dGhpcy5vZmZzZXQoKSxuLm5vZGVOYW1lKGFbMF0sXCJodG1sXCIpfHwoZD1hLm9mZnNldCgpKSxkLnRvcCs9bi5jc3MoYVswXSxcImJvcmRlclRvcFdpZHRoXCIsITApLGQubGVmdCs9bi5jc3MoYVswXSxcImJvcmRlckxlZnRXaWR0aFwiLCEwKSkse3RvcDpiLnRvcC1kLnRvcC1uLmNzcyhjLFwibWFyZ2luVG9wXCIsITApLGxlZnQ6Yi5sZWZ0LWQubGVmdC1uLmNzcyhjLFwibWFyZ2luTGVmdFwiLCEwKX19fSxvZmZzZXRQYXJlbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9mZnNldFBhcmVudHx8SWI7d2hpbGUoYSYmIW4ubm9kZU5hbWUoYSxcImh0bWxcIikmJlwic3RhdGljXCI9PT1uLmNzcyhhLFwicG9zaXRpb25cIikpYT1hLm9mZnNldFBhcmVudDtyZXR1cm4gYXx8SWJ9KX19KSxuLmVhY2goe3Njcm9sbExlZnQ6XCJwYWdlWE9mZnNldFwiLHNjcm9sbFRvcDpcInBhZ2VZT2Zmc2V0XCJ9LGZ1bmN0aW9uKGIsYyl7dmFyIGQ9XCJwYWdlWU9mZnNldFwiPT09YztuLmZuW2JdPWZ1bmN0aW9uKGUpe3JldHVybiBKKHRoaXMsZnVuY3Rpb24oYixlLGYpe3ZhciBnPUpiKGIpO3JldHVybiB2b2lkIDA9PT1mP2c/Z1tjXTpiW2VdOnZvaWQoZz9nLnNjcm9sbFRvKGQ/YS5wYWdlWE9mZnNldDpmLGQ/ZjphLnBhZ2VZT2Zmc2V0KTpiW2VdPWYpfSxiLGUsYXJndW1lbnRzLmxlbmd0aCxudWxsKX19KSxuLmVhY2goW1widG9wXCIsXCJsZWZ0XCJdLGZ1bmN0aW9uKGEsYil7bi5jc3NIb29rc1tiXT15YShrLnBpeGVsUG9zaXRpb24sZnVuY3Rpb24oYSxjKXtyZXR1cm4gYz8oYz14YShhLGIpLHZhLnRlc3QoYyk/bihhKS5wb3NpdGlvbigpW2JdK1wicHhcIjpjKTp2b2lkIDB9KX0pLG4uZWFjaCh7SGVpZ2h0OlwiaGVpZ2h0XCIsV2lkdGg6XCJ3aWR0aFwifSxmdW5jdGlvbihhLGIpe24uZWFjaCh7cGFkZGluZzpcImlubmVyXCIrYSxjb250ZW50OmIsXCJcIjpcIm91dGVyXCIrYX0sZnVuY3Rpb24oYyxkKXtuLmZuW2RdPWZ1bmN0aW9uKGQsZSl7dmFyIGY9YXJndW1lbnRzLmxlbmd0aCYmKGN8fFwiYm9vbGVhblwiIT10eXBlb2YgZCksZz1jfHwoZD09PSEwfHxlPT09ITA/XCJtYXJnaW5cIjpcImJvcmRlclwiKTtyZXR1cm4gSih0aGlzLGZ1bmN0aW9uKGIsYyxkKXt2YXIgZTtyZXR1cm4gbi5pc1dpbmRvdyhiKT9iLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFtcImNsaWVudFwiK2FdOjk9PT1iLm5vZGVUeXBlPyhlPWIuZG9jdW1lbnRFbGVtZW50LE1hdGgubWF4KGIuYm9keVtcInNjcm9sbFwiK2FdLGVbXCJzY3JvbGxcIithXSxiLmJvZHlbXCJvZmZzZXRcIithXSxlW1wib2Zmc2V0XCIrYV0sZVtcImNsaWVudFwiK2FdKSk6dm9pZCAwPT09ZD9uLmNzcyhiLGMsZyk6bi5zdHlsZShiLGMsZCxnKX0sYixmP2Q6dm9pZCAwLGYsbnVsbCl9fSl9KSxuLmZuLnNpemU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sZW5ndGh9LG4uZm4uYW5kU2VsZj1uLmZuLmFkZEJhY2ssXCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kJiZkZWZpbmUoXCJqcXVlcnlcIixbXSxmdW5jdGlvbigpe3JldHVybiBufSk7dmFyIEtiPWEualF1ZXJ5LExiPWEuJDtyZXR1cm4gbi5ub0NvbmZsaWN0PWZ1bmN0aW9uKGIpe3JldHVybiBhLiQ9PT1uJiYoYS4kPUxiKSxiJiZhLmpRdWVyeT09PW4mJihhLmpRdWVyeT1LYiksbn0sdHlwZW9mIGI9PT1VJiYoYS5qUXVlcnk9YS4kPW4pLG59KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWpxdWVyeS5taW4ubWFwIiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cbnZhciBRID0gcmVxdWlyZSgncScpO1xuXG4vLyBQbHVnaW4gY29tbXVuaWNhdGlvbnMgbGF5ZXIuIFR3byB0eXBlcyBvZiBjb21tdW5pY2F0aW9uIGFyZSBzdXBwb3J0ZWQ6XG4vLyAxLiBNZXNzYWdlcyAtIHdoZW4gZW1pdHRlZCwgYW55IGxvY2FsIGhhbmRsZXJzIGFyZSBub3RpZmllZCwgYW5kIGl0IGlzIGFsc28gc2VudCBhY3Jvc3MgdG8gd2ViIHNvY2tldHMgY29ubmVjdGlvblxuLy8gICAgd2hlcmUgYW55IHJlbW90ZSBoYW5kbGVycyBhcmUgbm90aWZpZWQuIFRoZXJlIGNhbiBiZSBhbnkgbnVtYmVyIG9mIGxvY2FsIGFuZC9vciByZW1vdGUgaGFuZGxlcnMuIFRoZXJlIGlzIG5vXG4vLyAgICBvcHBvcnR1bml0eSB0byByZXNwb25kLlxuLy8gMi4gTWV0aG9kcyAtIGNhbGxzIGFjcm9zcyB0aGUgd2ViIHNvY2tldCBjb25uZWN0aW9uIHdoZXJlIHRoZXJlIGNhbiBiZSBhIHNpbmdsZSBoYW5kbGVyIHRoYXQgY2FuIHJldHVybiBhIHNpbmdsZVxuLy8gICAgdmFsdWUgb3IgZXJyb3IgdmFsdWUuXG5cbmZ1bmN0aW9uIE1lc3NhZ2VzKHBsdWdpbklkLCBzb2NrZXQpIHtcbiAgICB0aGlzLnBsdWdpbklkID0gcGx1Z2luSWQ7XG4gICAgdGhpcy5zb2NrZXQgPSBzb2NrZXQ7XG4gICAgdGhpcy5tZXNzYWdlcyA9IHt9O1xuICAgIHRoaXMubWV0aG9kcyA9IHt9O1xuXG4gICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgIHNvY2tldC5vbigncGx1Z2luLW1lc3NhZ2UnLCBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICBpZiAoZGF0YS5wbHVnaW5JZCA9PT0gcGx1Z2luSWQpIHtcbiAgICAgICAgICAgIG5vdGlmeS5jYWxsKHRoYXQsIHRoYXQubWVzc2FnZXMsIGRhdGEubWVzc2FnZSwgZGF0YS5kYXRhKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHNvY2tldC5vbigncGx1Z2luLW1ldGhvZCcsIGZ1bmN0aW9uIChkYXRhLCBjYWxsYmFjaykge1xuICAgICAgICBpZiAoZGF0YS5wbHVnaW5JZCA9PT0gcGx1Z2luSWQpIHtcbiAgICAgICAgICAgIHZhciBoYW5kbGVyID0gdGhhdC5tZXRob2RzICYmIHRoYXQubWV0aG9kc1tkYXRhLm1ldGhvZF07XG4gICAgICAgICAgICBpZiAoaGFuZGxlcikge1xuICAgICAgICAgICAgICAgIHZhciBhcmdzID0gZGF0YS5hcmdzO1xuICAgICAgICAgICAgICAgIGFyZ3MucHVzaChjYWxsYmFjayk7XG4gICAgICAgICAgICAgICAgaGFuZGxlci5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xufVxuXG5NZXNzYWdlcy5fZ2xvYmFsTWVzc2FnZXMgPSB7fTtcblxuZnVuY3Rpb24gbm90aWZ5KG1lc3NhZ2VzT2JqLCBtZXNzYWdlLCBkYXRhKSB7XG4gICAgLy8gTm90aWZpZXMgbG9jYWwgbGlzdGVuZXJzIG9mIGEgbWVzc2FnZVxuICAgIHZhciBoYW5kbGVycyA9IG1lc3NhZ2VzT2JqICYmIG1lc3NhZ2VzT2JqW21lc3NhZ2VdO1xuICAgIGlmIChoYW5kbGVycykge1xuICAgICAgICBoYW5kbGVycy5mb3JFYWNoKGZ1bmN0aW9uIChoYW5kbGVyKSB7XG4gICAgICAgICAgICBoYW5kbGVyLmNhbGwodGhpcywgbWVzc2FnZSwgZGF0YSk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuTWVzc2FnZXMucHJvdG90eXBlID0ge1xuICAgIC8vIENhbGwgYW5kIHJlZ2lzdGVyIGZvciBtZXRob2RzXG5cbiAgICAvKipcbiAgICAgKiBAZGVzYyBDYWxscyB0aGUgc3BlY2lmaWVkIG1ldGhvZCwgd2l0aCBhbnkgbnVtYmVyIG9mIHBhcmFtZXRlcnMuIFJldHVybiBhIHByb21pc2UuXG4gICAgICogQHBhcmFtIG1ldGhvZFxuICAgICAqL1xuICAgIGNhbGw6IGZ1bmN0aW9uIChtZXRob2QpIHtcbiAgICAgICAgdmFyIGQgPSBRLmRlZmVyKCk7XG4gICAgICAgIHRoaXMuc29ja2V0LmVtaXQoJ3BsdWdpbi1tZXRob2QnLCB7XG4gICAgICAgICAgICBwbHVnaW5JZDogdGhpcy5wbHVnaW5JZCxcbiAgICAgICAgICAgIG1ldGhvZDogbWV0aG9kLFxuICAgICAgICAgICAgYXJnczogQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKVxuICAgICAgICB9LCBmdW5jdGlvbiAoZXJyLCByZXN1bHQpIHtcbiAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICBkLnJlamVjdChlcnIpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkLnJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBkLnByb21pc2U7XG4gICAgfSxcblxuICAgIHJlZ2lzdGVyOiBmdW5jdGlvbihtZXRob2QsIGhhbmRsZXIpIHtcbiAgICAgICAgLy8gQ2FuIG9ubHkgZXZlciBoYXZlIG9uZSBoYW5kbGVyIGZvciBhIG1ldGhvZC4gQ2FuY2VsIGJ5IGNhbGxpbmcgd2l0aCBoYW5kbGVyIG51bGwgb3IgdW5kZWZpbmVkLlxuICAgICAgICB0aGlzLm1ldGhvZHNbbWV0aG9kXSA9IGhhbmRsZXI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvLyBFbWl0IGFuZCBoYW5kbGUgbWVzc2FnZXNcbiAgICBlbWl0OiBmdW5jdGlvbiAobWVzc2FnZSwgZGF0YSwgaXNHbG9iYWwpIHtcbiAgICAgICAgLy8gUGFzcyB0aGUgbWVzc2FnZSBhY3Jvc3MgdGhlIHNvY2tldFxuICAgICAgICB2YXIgZXZlbnROYW1lLFxuICAgICAgICAgICAgbWVzc2FnZXNPYmo7XG5cbiAgICAgICAgaWYgKGlzR2xvYmFsKSB7XG4gICAgICAgICAgICBldmVudE5hbWUgPSAnZ2xvYmFsLXBsdWdpbi1tZXNzYWdlJztcbiAgICAgICAgICAgIG1lc3NhZ2VzT2JqID0gTWVzc2FnZXMuX2dsb2JhbE1lc3NhZ2VzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZXZlbnROYW1lID0gJ3BsdWdpbi1tZXNzYWdlJztcbiAgICAgICAgICAgIG1lc3NhZ2VzT2JqID0gdGhpcy5tZXNzYWdlcztcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc29ja2V0LmVtaXQoZXZlbnROYW1lLCB7XG4gICAgICAgICAgICBwbHVnaW5JZDogdGhpcy5wbHVnaW5JZCxcbiAgICAgICAgICAgIG1lc3NhZ2U6IG1lc3NhZ2UsXG4gICAgICAgICAgICBkYXRhOiBkYXRhXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIE5vdGlmeSBhbnkgbG9jYWwgbGlzdGVuZXJzXG4gICAgICAgIG5vdGlmeS5jYWxsKHRoaXMsIG1lc3NhZ2VzT2JqLCBtZXNzYWdlLCBkYXRhKTtcbiAgICB9LFxuICAgIFxuICAgIC8vIEVtaXQgbWVzc2FnZXMgZGVzdGluZWQgdG8gZXh0ZXJuYWwgZGVidWctaG9zdHNcbiAgICBlbWl0RGVidWc6IGZ1bmN0aW9uKG1lc3NhZ2UsIGRhdGEpIHtcbiAgICAgICAgdGhpcy5zb2NrZXQuZW1pdCgnZGVidWctbWVzc2FnZScsIHtcbiAgICAgICAgICAgIHBsdWdpbklkOiB0aGlzLnBsdWdpbklkLFxuICAgICAgICAgICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICAgICAgICAgIGRhdGE6IGRhdGFcbiAgICAgICAgfSk7XG4gICAgfSxcblxuICAgIHJlZnJlc2hBcHBIb3N0OiBmdW5jdGlvbiAoZGV2aWNlKSB7XG4gICAgICAgIHRoaXMuc29ja2V0LmVtaXQoJ3JlZnJlc2gtYXBwLWhvc3QnLCBkZXZpY2UpO1xuICAgIH0sXG5cbiAgICBvbjogZnVuY3Rpb24gKG1lc3NhZ2UsIGhhbmRsZXIsIGlzR2xvYmFsKSB7XG4gICAgICAgIHZhciBtZXNzYWdlc09iaiA9ICghaXNHbG9iYWwpID8gdGhpcy5tZXNzYWdlcyA6IE1lc3NhZ2VzLl9nbG9iYWxNZXNzYWdlcztcblxuICAgICAgICBpZiAoIW1lc3NhZ2VzT2JqW21lc3NhZ2VdKSB7XG4gICAgICAgICAgICBtZXNzYWdlc09ialttZXNzYWdlXSA9IFtoYW5kbGVyXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG1lc3NhZ2VzT2JqW21lc3NhZ2VdLnB1c2goaGFuZGxlcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIG9mZjogZnVuY3Rpb24gKG1lc3NhZ2UsIGhhbmRsZXIpIHtcbiAgICAgICAgdmFyIGhhbmRsZXJzID0gdGhpcy5tZXNzYWdlc1ttZXNzYWdlXTtcbiAgICAgICAgaWYgKCFoYW5kbGVycykge1xuICAgICAgICAgICAgLy8gdHJ5IG9uIHRoZSBnbG9iYWwgbWVzc2FnZXMgaGFuZGxlcnNcbiAgICAgICAgICAgIGhhbmRsZXJzID0gTWVzc2FnZXMuX2dsb2JhbE1lc3NhZ2VzW21lc3NhZ2VdO1xuICAgICAgICAgICAgaWYgKCFoYW5kbGVycykge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHBvcyA9IGhhbmRsZXJzLmluZGV4T2YoaGFuZGxlcik7XG4gICAgICAgIHdoaWxlIChwb3MgPiAtMSkge1xuICAgICAgICAgICAgaGFuZGxlcnMuc3BsaWNlKHBvcywgMSk7XG4gICAgICAgICAgICBwb3MgPSBoYW5kbGVycy5pbmRleE9mKGhhbmRsZXIpO1xuICAgICAgICB9XG4gICAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBNZXNzYWdlcztcbiIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXG4vLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9PYmplY3QvYXNzaWduXG5cbmlmICh0eXBlb2YgT2JqZWN0LmFzc2lnbiAhPSAnZnVuY3Rpb24nKSB7XG4gICAgKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbiA9IGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICAgICAgICAgICd1c2Ugc3RyaWN0JztcbiAgICAgICAgICAgIGlmICh0YXJnZXQgPT09IHVuZGVmaW5lZCB8fCB0YXJnZXQgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgY29udmVydCB1bmRlZmluZWQgb3IgbnVsbCB0byBvYmplY3QnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIG91dHB1dCA9IE9iamVjdCh0YXJnZXQpO1xuICAgICAgICAgICAgZm9yICh2YXIgaW5kZXggPSAxOyBpbmRleCA8IGFyZ3VtZW50cy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICAgICAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2luZGV4XTtcbiAgICAgICAgICAgICAgICBpZiAoc291cmNlICE9PSB1bmRlZmluZWQgJiYgc291cmNlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG5leHRLZXkgaW4gc291cmNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwgbmV4dEtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRbbmV4dEtleV0gPSBzb3VyY2VbbmV4dEtleV07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gb3V0cHV0O1xuICAgICAgICB9O1xuICAgIH0pKCk7XG59XG4iLCIvLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIEJhc2VkIGluIHBhcnQgb24gY29kZSBmcm9tIEFwYWNoZSBSaXBwbGUsIGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvaW5jdWJhdG9yLXJpcHBsZVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICAnQVBJX1VSTCc6ICdodHRwczovL3JpcHBsZWFwaS5oZXJva3VhcHAuY29tJyxcblxuICAgICdTRVJWSUNFUyc6IHtcbiAgICAgICAgJ0dPT0dMRV9NQVBTX1VSSSc6ICdodHRwOi8vbWFwcy5nb29nbGUuY29tL21hcHMvYXBpL3N0YXRpY21hcD9zaXplPTQ3Nng0NzYmbWFwdHlwZT1yb2FkbWFwJyxcbiAgICAgICAgJ0dPT0dMRV9NQVBTX0FQSV9LRVknOiAnQUJRSUFBQUEtQ2FQWkhYUi0wVHpodWlfaDZncGpoU0VfMnJHbG5ZaUI3TC1aR1Z3Z2F1dDVzN09ZUlNsQkFhSEN6QnVaZjJfMjNfdnJDT2ZQeFhIakEnXG4gICAgfSxcblxuICAgICdGU19TSVpFJzogMTAyNCAqIDEwMjQgKiAxMCxcblxuICAgICdDT01NT04nOiAge1xuICAgICAgICAnQVBQTElDQVRJT05fU1RBVEUnOiAndWktYXBwbGljYXRpb24tc3RhdGUtJyxcbiAgICAgICAgJ1BSRUZJWCc6ICd0aW55aGlwcG9zLScsXG4gICAgICAgICdNRU5VX0JVVFRPTicgOiAnbWVudS1idXR0b24nLFxuICAgICAgICAnQkFDS19CVVRUT04nIDogJ2JhY2stYnV0dG9uJyxcbiAgICAgICAgJ0hUTUxfQ09OVEFJTkVSJyA6ICdkb2N1bWVudCcsXG4gICAgICAgICdJTkZPX1NFQ1RJT04nOiAnaW5mb3JtYXRpb24tc3ViLWNvbnRhaW5lcicsXG4gICAgICAgICdPUklFTlRBVElPTl9TRUxFQ1RfUE9SVFJBSVRfSUQnIDogJ2xheW91dC1wb3J0cmFpdCcsXG4gICAgICAgICdPUklFTlRBVElPTl9TRUxFQ1RfTEFORFNDQVBFX0lEJyA6ICdsYXlvdXQtbGFuZHNjYXBlJyxcbiAgICAgICAgJ1BMQVRGT1JNX1NFTEVDVF9JRCc6ICdwbGF0Zm9ybS1zZWxlY3QnLFxuICAgICAgICAnREVWSUNFX1NFTEVDVF9JRCc6ICdkZXZpY2Utc2VsZWN0JyxcbiAgICAgICAgJ1NUT1JBR0VfVEFCTEVfQk9EWV9DTEFTUyc6ICdwcmVmZXJlbmNlcy1saXN0LWJvZHknLFxuICAgICAgICAnU1RPUkFHRV9DT1VOVF9DT05UQUlORVJfSUQnOiAncHJlZmVyZW5jZXMtY291bnQnLFxuICAgICAgICAnR0VPX01BUF9DT05UQUlORVJfSUQnOiAnZ2VvLW1hcCcsXG4gICAgICAgICdGSUxFU1lTVEVNX1VQREFURV9CVVRUT05fSURfV0lUSF9IQVNIJzogJyN1cGRhdGUtZmlsZXN5c3RlbS1idXR0b24nLFxuICAgICAgICAnQVBQTElDQVRJT05TX0NPTlRBSU5FUl9JRCc6ICd3aWRnZXQtYXBwbGljYXRpb25zLWNvbnRlbnQnLFxuICAgICAgICAnU1RPUkFHRV9DTEVBUl9CVVRUT05fSUQnOiAncHJlZmVyZW5jZXMtY2xlYXItYnV0dG9uJyxcbiAgICAgICAgJ0NIQU5HRV9QTEFURk9STV9CVVRUT05fSUQnOiAnY2hhbmdlLXBsYXRmb3JtJyxcbiAgICAgICAgJ0FKQVhfTE9BREVSX0NPTlRBSU5FUl9DTEFTUyc6ICcubG9hZGVyJyxcbiAgICAgICAgJ0lSUkVMRVZBTlRfQ0xBU1MnOiAnaXJyZWxldmFudCcsXG4gICAgICAgICdNVUxUSU1FRElBX1ZPTFVNRV9TTElERVJfSUQnOiAnbWVkaWEtdm9sdW1lJyxcbiAgICAgICAgJ01VTFRJTUVESUFfVk9MVU1FX0ZJRUxEX0lEJzogJ21lZGlhLXZvbHVtZS12YWx1ZScsXG4gICAgICAgICdNVUxUSU1FRElBX0FVRElPX1NUQVRFX0ZJRUxEX0lEJzogJ21lZGlhLWF1ZGlvLXN0YXRlJyxcbiAgICAgICAgJ01VTFRJTUVESUFfQVVESU9fUExBWUlOR19GSUVMRF9JRCc6ICdtdWx0aW1lZGlhLWlzYXVkaW9wbGF5aW5nJyxcbiAgICAgICAgJ01VTFRJTUVESUFfQVVESU9fUFJPR1JFU1NfSUQnOiAnbWVkaWEtYXVkaW8tcHJvZ3Jlc3MnLFxuICAgICAgICAnTVVMVElNRURJQV9BVURJT19GSUxFX0ZJRUxEX0lEJzogJ21lZGlhLWF1ZGlvLWZpbGUnLFxuICAgICAgICAnTVVMVElNRURJQV9WSURFT19TVEFURV9GSUVMRF9JRCc6ICdtZWRpYS12aWRlby1zdGF0ZScsXG4gICAgICAgICdNVUxUSU1FRElBX1ZJREVPX1BMQVlJTkdfRklFTERfSUQnOiAnbXVsdGltZWRpYS1pc3ZpZGVvcGxheWluZycsXG4gICAgICAgICdNVUxUSU1FRElBX1ZJREVPX1BST0dSRVNTX0lEJzogJ21lZGlhLXZpZGVvLXByb2dyZXNzJyxcbiAgICAgICAgJ01VTFRJTUVESUFfVklERU9fRklMRV9GSUVMRF9JRCc6ICdtZWRpYS12aWRlby1maWxlJyxcbiAgICAgICAgJ0VYVEVOU0lPTl9VUkxfQ09OVEFJTkVSJzogJ2V4dGVuc2lvbi11cmwnLFxuICAgICAgICAnU0VDVVJJVFlfTEVWRUwnOiAnc2VjdXJpdHktbGV2ZWwnXG4gICAgfSxcblxuICAgICdGSUxFU1lTVEVNJzoge1xuICAgICAgICAnUEVSU0lTVEVOQ0VfS0VZJzogJ2ZpbGVzeXN0ZW0nLFxuICAgICAgICAnSU5QVVRfUFJFRklYX0lEJzogJyNwYW5lbC1maWxlc3lzdGVtLSdcbiAgICB9LFxuXG4gICAgJ1BMQVRGT1JNJzogIHtcbiAgICAgICAgJ0RFRkFVTFQnOiB7XG4gICAgICAgICAgICAnbmFtZSc6ICdjb3Jkb3ZhJyxcbiAgICAgICAgICAgICd2ZXJzaW9uJzogJzEuMC4wJ1xuICAgICAgICB9XG4gICAgfSxcblxuICAgICdFTkNBUFNVTEFUT1InOiAge1xuICAgICAgICAnREVGQVVMVF9IRUlHSFQnOiA2ODQsXG4gICAgICAgICdERUZBVUxUX1dJRFRIJzogNDgwXG4gICAgfSxcblxuICAgICdHRU8nOiAge1xuICAgICAgICAnT1BUSU9OUycgOiB7XG4gICAgICAgICAgICAnTEFUSVRVREUnIDogJ2dlby1sYXRpdHVkZScsXG4gICAgICAgICAgICAnTE9OR0lUVURFJyA6ICdnZW8tbG9uZ2l0dWRlJyxcbiAgICAgICAgICAgICdBTFRJVFVERScgOiAnZ2VvLWFsdGl0dWRlJyxcbiAgICAgICAgICAgICdDRUxMX0lEJyA6ICdnZW8tY2VsbGlkJyxcbiAgICAgICAgICAgICdBQ0NVUkFDWScgOiAnZ2VvLWFjY3VyYWN5JyxcbiAgICAgICAgICAgICdBTFRJVFVERV9BQ0NVUkFDWScgOiAnZ2VvLWFsdGl0dWRlLWFjY3VyYWN5JyxcbiAgICAgICAgICAgICdIRUFESU5HJyA6ICdnZW8taGVhZGluZycsXG4gICAgICAgICAgICAnU1BFRUQnIDogJ2dlby1zcGVlZCcsXG4gICAgICAgICAgICAnVElNRV9TVEFNUCcgOiAnZ2VvLXRpbWVzdGFtcCcsXG4gICAgICAgICAgICAnREVMQVknIDogJ2dlby1kZWxheScsXG4gICAgICAgICAgICAnREVMQVlfTEFCRUwnIDogJ2dlby1kZWxheS1sYWJlbCcsXG4gICAgICAgICAgICAnSEVBRElOR19MQUJFTCcgOiAnZ2VvLWhlYWRpbmctbGFiZWwnLFxuICAgICAgICAgICAgJ0hFQURJTkdfTUFQX0xBQkVMJyA6ICdnZW8tbWFwLWRpcmVjdGlvbi1sYWJlbCcsXG4gICAgICAgICAgICAnSU1BR0UnIDogJ2dlby1tYXAtaW1nJyxcbiAgICAgICAgICAgICdNQVBfTUFSS0VSJyA6ICdnZW8tbWFwLW1hcmtlcicsXG4gICAgICAgICAgICAnTUFQX0NPTlRBSU5FUicgOiAnZ2VvLW1hcC1jb250YWluZXInLFxuICAgICAgICAgICAgJ1RJTUVPVVQnIDogJ2dlby10aW1lb3V0JyxcbiAgICAgICAgICAgICdHUFhGSUxFJzogJ2dlby1ncHhmaWxlJyxcbiAgICAgICAgICAgICdHUFhHTyc6ICdnZW8tZ3B4LWdvJyxcbiAgICAgICAgICAgICdHUFhNVUxUSVBMSUVSJzogJ2dlby1ncHhtdWx0aXBsaWVyLXNlbGVjdCcsXG4gICAgICAgICAgICAnR1BYUkVQTEFZU1RBVFVTJzogJ2dlby1ncHhyZXBsYXlzdGF0dXMnXG4gICAgICAgIH0sXG4gICAgICAgICdNQVBfWk9PTV9NQVgnOiAxOCxcbiAgICAgICAgJ01BUF9aT09NX01JTic6IDAsXG4gICAgICAgICdNQVBfWk9PTV9MRVZFTF9DT05UQUlORVInOiAnZ2VvLW1hcC16b29tbGV2ZWwtdmFsdWUnLFxuICAgICAgICAnTUFQX1pPT01fS0VZJzogJ2dlby1tYXAtem9vbS1rZXknLFxuICAgICAgICAnR1BYR09fTEFCRUxTJzoge1xuICAgICAgICAgICAgJ0dPJzogJ0dvJyxcbiAgICAgICAgICAgICdTVE9QJzogJ1N0b3AnXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgJ1BVU0gnOiB7XG4gICAgICAgICdPUFRJT05TJyA6IHtcbiAgICAgICAgICAgICdQQVlMT0FEJyA6ICdwdXNoLXRleHQnXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgJ1RFTEVQSE9OWSc6IHtcbiAgICAgICAgJ0NBTExfTElTVF9LRVknOiAndGVsZXBob255LWNhbGwtbGlzdC1rZXknXG4gICAgfSxcblxuICAgICdQSU0nOiB7XG4gICAgICAgICdBRERSRVNTX0xJU1RfS0VZJzogJ3BpbS1hZGRyZXNzLWxpc3Qta2V5JyxcbiAgICAgICAgJ0NBTEVOREFSX0xJU1RfS0VZJzogJ3BpbS1jYWxlbmRhci1saXN0LWtleSdcbiAgICB9LFxuXG4gICAgJ0NBTUVSQSc6IHtcbiAgICAgICAgJ1dJTkRPV19BTklNQVRJT04nOiAnaW1hZ2VzL2RhbmNlLmdpZicsXG4gICAgICAgICdXQVJOSU5HX1RFWFQnOiAnVGhlIHJ1bnRpbWUgc2ltdWxhdGVkIHNhdmluZyB0aGUgY2FtZXJhIGZpbGUgdG8ge2ZpbGV9LiBJZiB5b3UgbmVlZCB0byBhY2Nlc3MgdGhpcyBmaWxlIGluIHlvdXIgYXBwbGljYXRpb24sIHBsZWFzZSBjb3B5IGEgZmlsZSB0byB0aGUgc2F2ZWQgbG9jYXRpb24nXG4gICAgfSxcblxuICAgICdBVURJT1BMQVlFUicgOiB7XG4gICAgICAgICdXQVJOSU5HX1RFWFQnOiAnVGhlIHJ1bnRpbWUgc2ltdWxhdGVkIHNhdmluZyB0aGUgYXVkaW8gZmlsZSB0byB7ZmlsZX0uIElmIHlvdSBuZWVkIHRvIGFjY2VzcyB0aGlzIGZpbGUgaW4geW91ciBhcHBsaWNhdGlvbiwgcGxlYXNlIGNvcHkgYSBmaWxlIHRvIHRoZSBzYXZlZCBsb2NhdGlvbidcbiAgICB9LFxuXG4gICAgJ0FQSV9BUFBMSUNBVElPTic6IHtcbiAgICAgICAgJ05PX0FQUExJQ0FUSU9OU19NRVNTQUdFJzogJ05vIGFwcGxpY2F0aW9ucyBhdmFpbGFibGUgZm9yIHlvdXIgcGxhdGZvcm0nXG4gICAgfSxcblxuICAgICdOT1RJRklDQVRJT05TJzogIHtcbiAgICAgICAgJ01FU1NBR0VfQ09OVEFJTkVSX0NMQVNTJzogJ25vdGlmaWNhdGlvbi1tZXNzYWdlLWRpdicsXG4gICAgICAgICdNQUlOX0NPTlRBSU5FUl9DTEFTUyc6ICdwYW5lbC1ub3RpZmljYXRpb24nLFxuICAgICAgICAnQ0xPU0VfQlVUVE9OX0NMQVNTJzogJ3BhbmVsLW5vdGlmaWNhdGlvbi1jbG9zZWJ0bicsXG4gICAgICAgICdNRVNTQUdFX1RFWFRfQ09OVEFJTkVSX0NMQVNTJzogJ3BhbmVsLW5vdGlmaWNhdGlvbi10ZXh0JyxcbiAgICAgICAgJ0NTU19QUkVGSVgnOiAncGFuZWwtbm90aWZpY2F0aW9uLScsXG4gICAgICAgICdTVEFURV9UWVBFUyc6IHtcbiAgICAgICAgICAgICdPUEVOJzogMSxcbiAgICAgICAgICAgICdDTE9TRSc6IDJcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAnQkFUVEVSWV9TVEFUVVMnIDoge1xuICAgICAgICAnQkFUVEVSWV9TVEFUVVNfS0VZJzogJ2JhdHRlcnktc3RhdHVzLWtleScsXG4gICAgICAgICdJU19QTFVHR0VEX0tFWScgOiAnaXMtcGx1Z2dlZC1rZXknLFxuICAgICAgICAnTEVWRUxfTEFCRUwnIDogJ2JhdHRlcnktbGV2ZWwtbGFiZWwnLFxuICAgICAgICAnTEVWRUxfVkFMVUUnIDogJ2JhdHRlcnktbGV2ZWwnLFxuICAgICAgICAnSVNfUExVR0dFRF9DSEVDS0JPWCcgOiAnaXMtcGx1Z2dlZCdcbiAgICB9LFxuXG4gICAgJ0NTU19QUkVGSVgnOiAge1xuICAgICAgICAnSVJSRUxFVkFOVCcgOiAnaXJyZWxldmFudCdcbiAgICB9LFxuXG4gICAgJ1NUT1JBR0UnOiAge1xuICAgICAgICAnUEFJUl9ERUxJTUVURVInIDogJywnLFxuICAgICAgICAnS0VZX1ZBTFVFX0RFTElNRVRFUicgOiAnfCdcbiAgICB9LFxuXG4gICAgJ1JFR0VYJzogIHtcbiAgICAgICAgJ0dFTycgOiAvXmdlby0vLFxuICAgICAgICAnVVJMJzogL14oKGh0dHBzP3xmdHB8Z29waGVyfHRlbG5ldHxmaWxlfG5vdGVzfG1zLWhlbHApOigoXFwvXFwvKXwoXFxcXFxcXFwpKStbXFx3XFxkOiNAJVxcLzskKCl+Xz9cXCstPVxcXFxcXC4mXSopJC8sXG4gICAgICAgIC8vJ0VtYWlsJzogL15bYS16QS1aMC05Ll8lKy1dK0BbYS16QS1aMC05Li1dK1xcLlthLXpBLVpdezIsNH0kL1xuICAgICAgICAnRU1BSUwnOiAvXihbXkBcXHNdKylAKCg/OltcXC1hLXowLTldK1xcLikrW2Etel17Mix9KSQvLFxuICAgICAgICAnV0MzX0RURic6IC9eKChcXGR7NH0pLShcXGRcXGQpLShcXGRcXGQpVChcXGRcXGQpOihcXGRcXGQpOihcXGRcXGQpfChcXGR7NH0pLShcXGRcXGQpLShcXGRcXGQpVChcXGRcXGQpOihcXGRcXGQpfChcXGR7NH0pLShcXGRcXGQpLShcXGRcXGQpfChcXGR7NH0pLShcXGRcXGQpfChcXGRcXGRcXGRcXGQpKSQvLFxuICAgICAgICAnTk9OX1JFTEFUSVZFX1VSSSc6IC9eaHR0cHM/OlxcL1xcL3xeZmlsZTpcXC9cXC8vXG4gICAgfSxcblxuICAgICdDT05GSUcnOiB7XG4gICAgICAgICdTVUNDRVNTX0NTUyc6IHtcbiAgICAgICAgICAgICd0cnVlJzogJ3VpLXRleHQtcGFzcycsXG4gICAgICAgICAgICAnZmFsc2UnOiAndWktdGV4dC1mYWlsJyxcbiAgICAgICAgICAgICdtaXNzaW5nJzogJ3VpLXRleHQtbWlzc2luZydcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAnU0VUVElOR1MnOiB7XG4gICAgICAgICdUT09MVElQU19UT0dHTEVfRElWJzogJyNzZXR0aW5ncy10b2dnbGV0b29sdGlwcycsXG4gICAgICAgICdUT09MVElQU19LRVknOiAndG9vbC10aXBzLWtleSdcbiAgICB9LFxuXG4gICAgJ1VJJzoge1xuICAgICAgICAnSlFVRVJZX1VJX0JVVFRPTl9DTEFTU0VTJzogJ3VpLWJ1dHRvbiB1aS13aWRnZXQgdWktc3RhdGUtZGVmYXVsdCB1aS1jb3JuZXItYWxsIHVpLWJ1dHRvbi10ZXh0LW9ubHknLFxuICAgICAgICAnSlFVRVJZX1VJX0lOUFVUX0NMQVNTRVMnOiAndWktc3RhdGUtZGVmYXVsdCB1aS1jb3JuZXItYWxsJyxcbiAgICAgICAgJ1BBTkVMX1RBQkxFX0NMQVNTJzogJ3BhbmVsLXRhYmxlJyxcbiAgICAgICAgJ1JJR0hUX1JBTkdFX0xBQkVMX0NMQVNTJzogJ3JhbmdlLWxhYmVsJyxcbiAgICAgICAgJ0xFRlRfUkFOR0VfTEFCRUxfQ0xBU1MnOiAncmFuZ2UtbGFiZWwtbGVmdCcsXG4gICAgICAgICdURVhUX0xBQkVMX0NMQVNTJzogJ3VpLXRleHQtbGFiZWwnLFxuICAgICAgICAnU0NSRUVOX1BQSSc6IDk2XG4gICAgfSxcblxuICAgICdNVUxUSU1FRElBJzoge1xuICAgICAgICAnQVVESU9fU1RBVEVTJzoge1xuICAgICAgICAgICAgJ09QRU5FRCc6ICdvcGVuZWQnLFxuICAgICAgICAgICAgJ1NUT1BQRUQnOiAnc3RvcHBlZCcsXG4gICAgICAgICAgICAnUEFVU0VEJzogJ3BhdXNlZCcsXG4gICAgICAgICAgICAnUExBWUlORyc6ICdwbGF5aW5nJyxcbiAgICAgICAgICAgICdDT01QTEVURUQnOiAnY29tcGxldGVkJ1xuICAgICAgICB9XG4gICAgfSxcblxuICAgICdMQU5HJzoge1xuICAgICAgICAnSVNPNjM5Ml9MSVNUJzogWydhYmsnLCAnYWNlJywgJ2FjaCcsICdhZGEnLCAnYWR5JywgJ2FhcicsICdhZmgnLCAnYWZyJywgJ2FmYScsICdhaW4nLCAnYWthJywgJ2FraycsICdhbGIvc3FpJywgJ2dzdycsICdhbGUnLCAnYWxnJywgJ3R1dCcsICdhbWgnLCAnYW5wJywgJ2FwYScsICdhcmEnLCAnYXJnJywgJ2FycCcsICdhcncnLCAnYXJtL2h5ZScsICdydXAnLCAnYXJ0JywgJ2FzbScsICdhc3QnLCAnYXRoJywgJ2F1cycsICdtYXAnLCAnYXZhJywgJ2F2ZScsICdhd2EnLCAnYXltJywgJ2F6ZScsICdiYW4nLCAnYmF0JywgJ2JhbCcsICdiYW0nLCAnYmFpJywgJ2JhZCcsICdibnQnLCAnYmFzJywgJ2JhaycsICdiYXEvZXVzJywgJ2J0aycsICdiZWonLCAnYmVsJywgJ2JlbScsICdiZW4nLCAnYmVyJywgJ2JobycsICdiaWgnLCAnYmlrJywgJ2J5bicsICdiaW4nLCAnYmlzJywgJ3pibCcsICdub2InLCAnYm9zJywgJ2JyYScsICdicmUnLCAnYnVnJywgJ2J1bCcsICdidWEnLCAnYnVyL215YScsICdjYWQnLCAnc3BhJywgJ2NhdCcsICdjYXUnLCAnY2ViJywgJ2NlbCcsICdjYWknLCAna2htJywgJ2NoZycsICdjbWMnLCAnY2hhJywgJ2NoZScsICdjaHInLCAnbnlhJywgJ2NoeScsICdjaGInLCAnY2hpL3pobycsICdjaG4nLCAnY2hwJywgJ2NobycsICd6aGEnLCAnY2h1JywgJ2NoaycsICdjaHYnLCAnbndjJywgJ3N5YycsICdyYXInLCAnY29wJywgJ2NvcicsICdjb3MnLCAnY3JlJywgJ211cycsICdjcnAnLCAnY3BlJywgJ2NwZicsICdjcHAnLCAnY3JoJywgJ2hydicsICdjdXMnLCAnY3plL2NlcycsICdkYWsnLCAnZGFuJywgJ2RhcicsICdkZWwnLCAnZGl2JywgJ3p6YScsICdkaW4nLCAnZG9pJywgJ2RncicsICdkcmEnLCAnZHVhJywgJ2R1dC9ubGQnLCAnZHVtJywgJ2R5dScsICdkem8nLCAnZnJzJywgJ2VmaScsICdlZ3knLCAnZWthJywgJ2VseCcsICdlbmcnLCAnZW5tJywgJ2FuZycsICdteXYnLCAnZXBvJywgJ2VzdCcsICdld2UnLCAnZXdvJywgJ2ZhbicsICdmYXQnLCAnZmFvJywgJ2ZpaicsICdmaWwnLCAnZmluJywgJ2ZpdScsICdmb24nLCAnZnJlL2ZyYScsICdmcm0nLCAnZnJvJywgJ2Z1cicsICdmdWwnLCAnZ2FhJywgJ2dsYScsICdjYXInLCAnZ2xnJywgJ2x1ZycsICdnYXknLCAnZ2JhJywgJ2dleicsICdnZW8va2F0JywgJ2dlci9kZXUnLCAnbmRzJywgJ2dtaCcsICdnb2gnLCAnZ2VtJywgJ2tpaycsICdnaWwnLCAnZ29uJywgJ2dvcicsICdnb3QnLCAnZ3JiJywgJ2dyYycsICdncmUvZWxsJywgJ2thbCcsICdncm4nLCAnZ3VqJywgJ2d3aScsICdoYWknLCAnaGF0JywgJ2hhdScsICdoYXcnLCAnaGViJywgJ2hlcicsICdoaWwnLCAnaGltJywgJ2hpbicsICdobW8nLCAnaGl0JywgJ2htbicsICdodW4nLCAnaHVwJywgJ2liYScsICdpY2UvaXNsJywgJ2lkbycsICdpYm8nLCAnaWpvJywgJ2lsbycsICdhcmMnLCAnc21uJywgJ2luYycsICdpbmUnLCAnaW5kJywgJ2luaCcsICdpbmEnLCAnaWxlJywgJ2lrdScsICdpcGsnLCAnaXJhJywgJ2dsZScsICdtZ2EnLCAnc2dhJywgJ2lybycsICdpdGEnLCAnanBuJywgJ2phdicsICdrYWMnLCAnanJiJywgJ2pwcicsICdrYmQnLCAna2FiJywgJ3hhbCcsICdrYW0nLCAna2FuJywgJ2thdScsICdwYW0nLCAna2FhJywgJ2tyYycsICdrcmwnLCAna2FyJywgJ2thcycsICdjc2InLCAna2F3JywgJ2theicsICdraGEnLCAna2hpJywgJ2tobycsICdrbWInLCAna2luJywgJ2tpcicsICd0bGgnLCAna29tJywgJ2tvbicsICdrb2snLCAna29yJywgJ2tvcycsICdrcGUnLCAna3JvJywgJ2t1YScsICdrdW0nLCAna3VyJywgJ2tydScsICdrdXQnLCAnbGFkJywgJ2xhaCcsICdsYW0nLCAnZGF5JywgJ2xhbycsICdsYXQnLCAnbGF2JywgJ2x0eicsICdsZXonLCAnbGltJywgJ2xpbicsICdsaXQnLCAnamJvJywgJ2RzYicsICdsb3onLCAnbHViJywgJ2x1YScsICdsdWknLCAnc21qJywgJ2x1bicsICdsdW8nLCAnbHVzJywgJ21hYy9ta2QnLCAnbWFkJywgJ21hZycsICdtYWknLCAnbWFrJywgJ21sZycsICdtYXkvbXNhJywgJ21hbCcsICdtbHQnLCAnbW5jJywgJ21kcicsICdtYW4nLCAnbW5pJywgJ21ubycsICdnbHYnLCAnbWFvL21yaScsICdhcm4nLCAnbWFyJywgJ2NobScsICdtYWgnLCAnbXdyJywgJ21hcycsICdteW4nLCAnbWVuJywgJ21pYycsICdtaW4nLCAnbXdsJywgJ21vaCcsICdtZGYnLCAncnVtL3JvbicsICdta2gnLCAnbG9sJywgJ21vbicsICdtb3MnLCAnbXVsJywgJ211bicsICducW8nLCAnbmFoJywgJ25hdScsICduYXYnLCAnbmRlJywgJ25ibCcsICduZG8nLCAnbmFwJywgJ25ldycsICduZXAnLCAnbmlhJywgJ25pYycsICdzc2EnLCAnbml1JywgJ3p4eCcsICdub2cnLCAnbm9uJywgJ25haScsICdmcnInLCAnc21lJywgJ25zbycsICdub3InLCAnbm5vJywgJ251YicsICdpaWknLCAnbnltJywgJ255bicsICdueW8nLCAnbnppJywgJ29jaScsICdwcm8nLCAnb2ppJywgJ29yaScsICdvcm0nLCAnb3NhJywgJ29zcycsICdvdG8nLCAncGFsJywgJ3BhdScsICdwbGknLCAncGFnJywgJ3BhbicsICdwYXAnLCAncGFhJywgJ3B1cycsICdwZXIvZmFzJywgJ3BlbycsICdwaGknLCAncGhuJywgJ3BvbicsICdwb2wnLCAncG9yJywgJ3ByYScsICdxdWUnLCAncmFqJywgJ3JhcCcsICdxYWEtcXR6JywgJ3JvYScsICdyb2gnLCAncm9tJywgJ3J1bicsICdydXMnLCAnc2FsJywgJ3NhbScsICdzbWknLCAnc21vJywgJ3NhZCcsICdzYWcnLCAnc2FuJywgJ3NhdCcsICdzcmQnLCAnc2FzJywgJ3NjbycsICdzZWwnLCAnc2VtJywgJ3NycCcsICdzcnInLCAnc2huJywgJ3NuYScsICdzY24nLCAnc2lkJywgJ3NnbicsICdibGEnLCAnc25kJywgJ3NpbicsICdzaXQnLCAnc2lvJywgJ3NtcycsICdkZW4nLCAnc2xhJywgJ3Nsby9zbGsnLCAnc2x2JywgJ3NvZycsICdzb20nLCAnc29uJywgJ3NuaycsICd3ZW4nLCAnc290JywgJ3NhaScsICdhbHQnLCAnc21hJywgJ3NybicsICdzdWsnLCAnc3V4JywgJ3N1bicsICdzdXMnLCAnc3dhJywgJ3NzdycsICdzd2UnLCAnc3lyJywgJ3RnbCcsICd0YWgnLCAndGFpJywgJ3RnaycsICd0bWgnLCAndGFtJywgJ3RhdCcsICd0ZWwnLCAndGVyJywgJ3RldCcsICd0aGEnLCAndGliL2JvZCcsICd0aWcnLCAndGlyJywgJ3RlbScsICd0aXYnLCAndGxpJywgJ3RwaScsICd0a2wnLCAndG9nJywgJ3RvbicsICd0c2knLCAndHNvJywgJ3RzbicsICd0dW0nLCAndHVwJywgJ3R1cicsICdvdGEnLCAndHVrJywgJ3R2bCcsICd0eXYnLCAndHdpJywgJ3VkbScsICd1Z2EnLCAndWlnJywgJ3VrcicsICd1bWInLCAnbWlzJywgJ3VuZCcsICdoc2InLCAndXJkJywgJ3V6YicsICd2YWknLCAndmVuJywgJ3ZpZScsICd2b2wnLCAndm90JywgJ3dhaycsICd3bG4nLCAnd2FyJywgJ3dhcycsICd3ZWwvY3ltJywgJ2ZyeScsICd3YWwnLCAnd29sJywgJ3hobycsICdzYWgnLCAneWFvJywgJ3lhcCcsICd5aWQnLCAneW9yJywgJ3lwaycsICd6bmQnLCAnemFwJywgJ3plbicsICd6dWwnLCAnenVuJ11cbiAgICB9LFxuXG4gICAgJ1hIUic6IHtcbiAgICAgICAgUFJPWFlfU0VUVElORzogJ3NldHRpbmdzLXhoci1wcm94eS1zZXR0aW5nJyxcbiAgICAgICAgUFJPWFlfU0VUVElOR1NfTElTVDoge1xuICAgICAgICAgICAgcmVtb3RlOiAncmVtb3RlJyxcbiAgICAgICAgICAgIGxvY2FsOiAnbG9jYWwnLFxuICAgICAgICAgICAgZGlzYWJsZWQ6ICdkaXNhYmxlZCdcbiAgICAgICAgfSxcbiAgICAgICAgREVGQVVMVF9MT0NBTF9QT1JUOiA0NDAwLFxuICAgICAgICBERUZBVUxUX0xPQ0FMX1JPVVRFOiAnL3JpcHBsZScsXG4gICAgICAgIExPQ0FMX1BST1hZX1BPUlRfU0VUVElORzogJ3NldHRpbmdzLXhoci1wcm94eS1sb2NhbC1wb3J0JyxcbiAgICAgICAgTE9DQUxfUFJPWFlfUk9VVEVfU0VUVElORzogJ3NldHRpbmdzLXhoci1wcm94eS1sb2NhbC1yb3V0ZSdcbiAgICB9XG59O1xuIiwiLyogQHZlcnNpb24gMS40LjUgKi9cbihmdW5jdGlvbihmKXtpZih0eXBlb2YgZXhwb3J0cz09PVwib2JqZWN0XCImJnR5cGVvZiBtb2R1bGUhPT1cInVuZGVmaW5lZFwiKXttb2R1bGUuZXhwb3J0cz1mKCl9ZWxzZSBpZih0eXBlb2YgZGVmaW5lPT09XCJmdW5jdGlvblwiJiZkZWZpbmUuYW1kKXtkZWZpbmUoW10sZil9ZWxzZXt2YXIgZztpZih0eXBlb2Ygd2luZG93IT09XCJ1bmRlZmluZWRcIil7Zz13aW5kb3d9ZWxzZSBpZih0eXBlb2YgZ2xvYmFsIT09XCJ1bmRlZmluZWRcIil7Zz1nbG9iYWx9ZWxzZSBpZih0eXBlb2Ygc2VsZiE9PVwidW5kZWZpbmVkXCIpe2c9c2VsZn1lbHNle2c9dGhpc31nLmlvPWYoKX19KShmdW5jdGlvbigpe3ZhciBkZWZpbmUsbW9kdWxlLGV4cG9ydHM7cmV0dXJuIGZ1bmN0aW9uIGUodCxuLHIpe2Z1bmN0aW9uIHMobyx1KXtpZighbltvXSl7aWYoIXRbb10pe3ZhciBhPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7aWYoIXUmJmEpcmV0dXJuIGEobywhMCk7aWYoaSlyZXR1cm4gaShvLCEwKTt2YXIgZj1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK28rXCInXCIpO3Rocm93IGYuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixmfXZhciBsPW5bb109e2V4cG9ydHM6e319O3Rbb11bMF0uY2FsbChsLmV4cG9ydHMsZnVuY3Rpb24oZSl7dmFyIG49dFtvXVsxXVtlXTtyZXR1cm4gcyhuP246ZSl9LGwsbC5leHBvcnRzLGUsdCxuLHIpfXJldHVybiBuW29dLmV4cG9ydHN9dmFyIGk9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rKylzKHJbb10pO3JldHVybiBzfSh7MTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7bW9kdWxlLmV4cG9ydHM9X2RlcmVxXyhcIi4vbGliL1wiKX0se1wiLi9saWIvXCI6Mn1dLDI6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe21vZHVsZS5leHBvcnRzPV9kZXJlcV8oXCIuL3NvY2tldFwiKTttb2R1bGUuZXhwb3J0cy5wYXJzZXI9X2RlcmVxXyhcImVuZ2luZS5pby1wYXJzZXJcIil9LHtcIi4vc29ja2V0XCI6MyxcImVuZ2luZS5pby1wYXJzZXJcIjoxOX1dLDM6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeyhmdW5jdGlvbihnbG9iYWwpe3ZhciB0cmFuc3BvcnRzPV9kZXJlcV8oXCIuL3RyYW5zcG9ydHNcIik7dmFyIEVtaXR0ZXI9X2RlcmVxXyhcImNvbXBvbmVudC1lbWl0dGVyXCIpO3ZhciBkZWJ1Zz1fZGVyZXFfKFwiZGVidWdcIikoXCJlbmdpbmUuaW8tY2xpZW50OnNvY2tldFwiKTt2YXIgaW5kZXg9X2RlcmVxXyhcImluZGV4b2ZcIik7dmFyIHBhcnNlcj1fZGVyZXFfKFwiZW5naW5lLmlvLXBhcnNlclwiKTt2YXIgcGFyc2V1cmk9X2RlcmVxXyhcInBhcnNldXJpXCIpO3ZhciBwYXJzZWpzb249X2RlcmVxXyhcInBhcnNlanNvblwiKTt2YXIgcGFyc2Vxcz1fZGVyZXFfKFwicGFyc2Vxc1wiKTttb2R1bGUuZXhwb3J0cz1Tb2NrZXQ7ZnVuY3Rpb24gbm9vcCgpe31mdW5jdGlvbiBTb2NrZXQodXJpLG9wdHMpe2lmKCEodGhpcyBpbnN0YW5jZW9mIFNvY2tldCkpcmV0dXJuIG5ldyBTb2NrZXQodXJpLG9wdHMpO29wdHM9b3B0c3x8e307aWYodXJpJiZcIm9iamVjdFwiPT10eXBlb2YgdXJpKXtvcHRzPXVyaTt1cmk9bnVsbH1pZih1cmkpe3VyaT1wYXJzZXVyaSh1cmkpO29wdHMuaG9zdG5hbWU9dXJpLmhvc3Q7b3B0cy5zZWN1cmU9dXJpLnByb3RvY29sPT1cImh0dHBzXCJ8fHVyaS5wcm90b2NvbD09XCJ3c3NcIjtvcHRzLnBvcnQ9dXJpLnBvcnQ7aWYodXJpLnF1ZXJ5KW9wdHMucXVlcnk9dXJpLnF1ZXJ5fWVsc2UgaWYob3B0cy5ob3N0KXtvcHRzLmhvc3RuYW1lPXBhcnNldXJpKG9wdHMuaG9zdCkuaG9zdH10aGlzLnNlY3VyZT1udWxsIT1vcHRzLnNlY3VyZT9vcHRzLnNlY3VyZTpnbG9iYWwubG9jYXRpb24mJlwiaHR0cHM6XCI9PWxvY2F0aW9uLnByb3RvY29sO2lmKG9wdHMuaG9zdG5hbWUmJiFvcHRzLnBvcnQpe29wdHMucG9ydD10aGlzLnNlY3VyZT9cIjQ0M1wiOlwiODBcIn10aGlzLmFnZW50PW9wdHMuYWdlbnR8fGZhbHNlO3RoaXMuaG9zdG5hbWU9b3B0cy5ob3N0bmFtZXx8KGdsb2JhbC5sb2NhdGlvbj9sb2NhdGlvbi5ob3N0bmFtZTpcImxvY2FsaG9zdFwiKTt0aGlzLnBvcnQ9b3B0cy5wb3J0fHwoZ2xvYmFsLmxvY2F0aW9uJiZsb2NhdGlvbi5wb3J0P2xvY2F0aW9uLnBvcnQ6dGhpcy5zZWN1cmU/NDQzOjgwKTt0aGlzLnF1ZXJ5PW9wdHMucXVlcnl8fHt9O2lmKFwic3RyaW5nXCI9PXR5cGVvZiB0aGlzLnF1ZXJ5KXRoaXMucXVlcnk9cGFyc2Vxcy5kZWNvZGUodGhpcy5xdWVyeSk7dGhpcy51cGdyYWRlPWZhbHNlIT09b3B0cy51cGdyYWRlO3RoaXMucGF0aD0ob3B0cy5wYXRofHxcIi9lbmdpbmUuaW9cIikucmVwbGFjZSgvXFwvJC8sXCJcIikrXCIvXCI7dGhpcy5mb3JjZUpTT05QPSEhb3B0cy5mb3JjZUpTT05QO3RoaXMuanNvbnA9ZmFsc2UhPT1vcHRzLmpzb25wO3RoaXMuZm9yY2VCYXNlNjQ9ISFvcHRzLmZvcmNlQmFzZTY0O3RoaXMuZW5hYmxlc1hEUj0hIW9wdHMuZW5hYmxlc1hEUjt0aGlzLnRpbWVzdGFtcFBhcmFtPW9wdHMudGltZXN0YW1wUGFyYW18fFwidFwiO3RoaXMudGltZXN0YW1wUmVxdWVzdHM9b3B0cy50aW1lc3RhbXBSZXF1ZXN0czt0aGlzLnRyYW5zcG9ydHM9b3B0cy50cmFuc3BvcnRzfHxbXCJwb2xsaW5nXCIsXCJ3ZWJzb2NrZXRcIl07dGhpcy5yZWFkeVN0YXRlPVwiXCI7dGhpcy53cml0ZUJ1ZmZlcj1bXTt0aGlzLnBvbGljeVBvcnQ9b3B0cy5wb2xpY3lQb3J0fHw4NDM7dGhpcy5yZW1lbWJlclVwZ3JhZGU9b3B0cy5yZW1lbWJlclVwZ3JhZGV8fGZhbHNlO3RoaXMuYmluYXJ5VHlwZT1udWxsO3RoaXMub25seUJpbmFyeVVwZ3JhZGVzPW9wdHMub25seUJpbmFyeVVwZ3JhZGVzO3RoaXMucGVyTWVzc2FnZURlZmxhdGU9ZmFsc2UhPT1vcHRzLnBlck1lc3NhZ2VEZWZsYXRlP29wdHMucGVyTWVzc2FnZURlZmxhdGV8fHt9OmZhbHNlO2lmKHRydWU9PT10aGlzLnBlck1lc3NhZ2VEZWZsYXRlKXRoaXMucGVyTWVzc2FnZURlZmxhdGU9e307aWYodGhpcy5wZXJNZXNzYWdlRGVmbGF0ZSYmbnVsbD09dGhpcy5wZXJNZXNzYWdlRGVmbGF0ZS50aHJlc2hvbGQpe3RoaXMucGVyTWVzc2FnZURlZmxhdGUudGhyZXNob2xkPTEwMjR9dGhpcy5wZng9b3B0cy5wZnh8fG51bGw7dGhpcy5rZXk9b3B0cy5rZXl8fG51bGw7dGhpcy5wYXNzcGhyYXNlPW9wdHMucGFzc3BocmFzZXx8bnVsbDt0aGlzLmNlcnQ9b3B0cy5jZXJ0fHxudWxsO3RoaXMuY2E9b3B0cy5jYXx8bnVsbDt0aGlzLmNpcGhlcnM9b3B0cy5jaXBoZXJzfHxudWxsO3RoaXMucmVqZWN0VW5hdXRob3JpemVkPW9wdHMucmVqZWN0VW5hdXRob3JpemVkPT09dW5kZWZpbmVkP251bGw6b3B0cy5yZWplY3RVbmF1dGhvcml6ZWQ7dmFyIGZyZWVHbG9iYWw9dHlwZW9mIGdsb2JhbD09XCJvYmplY3RcIiYmZ2xvYmFsO2lmKGZyZWVHbG9iYWwuZ2xvYmFsPT09ZnJlZUdsb2JhbCl7aWYob3B0cy5leHRyYUhlYWRlcnMmJk9iamVjdC5rZXlzKG9wdHMuZXh0cmFIZWFkZXJzKS5sZW5ndGg+MCl7dGhpcy5leHRyYUhlYWRlcnM9b3B0cy5leHRyYUhlYWRlcnN9fXRoaXMub3BlbigpfVNvY2tldC5wcmlvcldlYnNvY2tldFN1Y2Nlc3M9ZmFsc2U7RW1pdHRlcihTb2NrZXQucHJvdG90eXBlKTtTb2NrZXQucHJvdG9jb2w9cGFyc2VyLnByb3RvY29sO1NvY2tldC5Tb2NrZXQ9U29ja2V0O1NvY2tldC5UcmFuc3BvcnQ9X2RlcmVxXyhcIi4vdHJhbnNwb3J0XCIpO1NvY2tldC50cmFuc3BvcnRzPV9kZXJlcV8oXCIuL3RyYW5zcG9ydHNcIik7U29ja2V0LnBhcnNlcj1fZGVyZXFfKFwiZW5naW5lLmlvLXBhcnNlclwiKTtTb2NrZXQucHJvdG90eXBlLmNyZWF0ZVRyYW5zcG9ydD1mdW5jdGlvbihuYW1lKXtkZWJ1ZygnY3JlYXRpbmcgdHJhbnNwb3J0IFwiJXNcIicsbmFtZSk7dmFyIHF1ZXJ5PWNsb25lKHRoaXMucXVlcnkpO3F1ZXJ5LkVJTz1wYXJzZXIucHJvdG9jb2w7cXVlcnkudHJhbnNwb3J0PW5hbWU7aWYodGhpcy5pZClxdWVyeS5zaWQ9dGhpcy5pZDt2YXIgdHJhbnNwb3J0PW5ldyB0cmFuc3BvcnRzW25hbWVdKHthZ2VudDp0aGlzLmFnZW50LGhvc3RuYW1lOnRoaXMuaG9zdG5hbWUscG9ydDp0aGlzLnBvcnQsc2VjdXJlOnRoaXMuc2VjdXJlLHBhdGg6dGhpcy5wYXRoLHF1ZXJ5OnF1ZXJ5LGZvcmNlSlNPTlA6dGhpcy5mb3JjZUpTT05QLGpzb25wOnRoaXMuanNvbnAsZm9yY2VCYXNlNjQ6dGhpcy5mb3JjZUJhc2U2NCxlbmFibGVzWERSOnRoaXMuZW5hYmxlc1hEUix0aW1lc3RhbXBSZXF1ZXN0czp0aGlzLnRpbWVzdGFtcFJlcXVlc3RzLHRpbWVzdGFtcFBhcmFtOnRoaXMudGltZXN0YW1wUGFyYW0scG9saWN5UG9ydDp0aGlzLnBvbGljeVBvcnQsc29ja2V0OnRoaXMscGZ4OnRoaXMucGZ4LGtleTp0aGlzLmtleSxwYXNzcGhyYXNlOnRoaXMucGFzc3BocmFzZSxjZXJ0OnRoaXMuY2VydCxjYTp0aGlzLmNhLGNpcGhlcnM6dGhpcy5jaXBoZXJzLHJlamVjdFVuYXV0aG9yaXplZDp0aGlzLnJlamVjdFVuYXV0aG9yaXplZCxwZXJNZXNzYWdlRGVmbGF0ZTp0aGlzLnBlck1lc3NhZ2VEZWZsYXRlLGV4dHJhSGVhZGVyczp0aGlzLmV4dHJhSGVhZGVyc30pO3JldHVybiB0cmFuc3BvcnR9O2Z1bmN0aW9uIGNsb25lKG9iail7dmFyIG89e307Zm9yKHZhciBpIGluIG9iail7aWYob2JqLmhhc093blByb3BlcnR5KGkpKXtvW2ldPW9ialtpXX19cmV0dXJuIG99U29ja2V0LnByb3RvdHlwZS5vcGVuPWZ1bmN0aW9uKCl7dmFyIHRyYW5zcG9ydDtpZih0aGlzLnJlbWVtYmVyVXBncmFkZSYmU29ja2V0LnByaW9yV2Vic29ja2V0U3VjY2VzcyYmdGhpcy50cmFuc3BvcnRzLmluZGV4T2YoXCJ3ZWJzb2NrZXRcIikhPS0xKXt0cmFuc3BvcnQ9XCJ3ZWJzb2NrZXRcIn1lbHNlIGlmKDA9PT10aGlzLnRyYW5zcG9ydHMubGVuZ3RoKXt2YXIgc2VsZj10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtzZWxmLmVtaXQoXCJlcnJvclwiLFwiTm8gdHJhbnNwb3J0cyBhdmFpbGFibGVcIil9LDApO3JldHVybn1lbHNle3RyYW5zcG9ydD10aGlzLnRyYW5zcG9ydHNbMF19dGhpcy5yZWFkeVN0YXRlPVwib3BlbmluZ1wiO3RyeXt0cmFuc3BvcnQ9dGhpcy5jcmVhdGVUcmFuc3BvcnQodHJhbnNwb3J0KX1jYXRjaChlKXt0aGlzLnRyYW5zcG9ydHMuc2hpZnQoKTt0aGlzLm9wZW4oKTtyZXR1cm59dHJhbnNwb3J0Lm9wZW4oKTt0aGlzLnNldFRyYW5zcG9ydCh0cmFuc3BvcnQpfTtTb2NrZXQucHJvdG90eXBlLnNldFRyYW5zcG9ydD1mdW5jdGlvbih0cmFuc3BvcnQpe2RlYnVnKFwic2V0dGluZyB0cmFuc3BvcnQgJXNcIix0cmFuc3BvcnQubmFtZSk7dmFyIHNlbGY9dGhpcztpZih0aGlzLnRyYW5zcG9ydCl7ZGVidWcoXCJjbGVhcmluZyBleGlzdGluZyB0cmFuc3BvcnQgJXNcIix0aGlzLnRyYW5zcG9ydC5uYW1lKTt0aGlzLnRyYW5zcG9ydC5yZW1vdmVBbGxMaXN0ZW5lcnMoKX10aGlzLnRyYW5zcG9ydD10cmFuc3BvcnQ7dHJhbnNwb3J0Lm9uKFwiZHJhaW5cIixmdW5jdGlvbigpe3NlbGYub25EcmFpbigpfSkub24oXCJwYWNrZXRcIixmdW5jdGlvbihwYWNrZXQpe3NlbGYub25QYWNrZXQocGFja2V0KX0pLm9uKFwiZXJyb3JcIixmdW5jdGlvbihlKXtzZWxmLm9uRXJyb3IoZSl9KS5vbihcImNsb3NlXCIsZnVuY3Rpb24oKXtzZWxmLm9uQ2xvc2UoXCJ0cmFuc3BvcnQgY2xvc2VcIil9KX07U29ja2V0LnByb3RvdHlwZS5wcm9iZT1mdW5jdGlvbihuYW1lKXtkZWJ1ZygncHJvYmluZyB0cmFuc3BvcnQgXCIlc1wiJyxuYW1lKTt2YXIgdHJhbnNwb3J0PXRoaXMuY3JlYXRlVHJhbnNwb3J0KG5hbWUse3Byb2JlOjF9KSxmYWlsZWQ9ZmFsc2Usc2VsZj10aGlzO1NvY2tldC5wcmlvcldlYnNvY2tldFN1Y2Nlc3M9ZmFsc2U7ZnVuY3Rpb24gb25UcmFuc3BvcnRPcGVuKCl7aWYoc2VsZi5vbmx5QmluYXJ5VXBncmFkZXMpe3ZhciB1cGdyYWRlTG9zZXNCaW5hcnk9IXRoaXMuc3VwcG9ydHNCaW5hcnkmJnNlbGYudHJhbnNwb3J0LnN1cHBvcnRzQmluYXJ5O2ZhaWxlZD1mYWlsZWR8fHVwZ3JhZGVMb3Nlc0JpbmFyeX1pZihmYWlsZWQpcmV0dXJuO2RlYnVnKCdwcm9iZSB0cmFuc3BvcnQgXCIlc1wiIG9wZW5lZCcsbmFtZSk7dHJhbnNwb3J0LnNlbmQoW3t0eXBlOlwicGluZ1wiLGRhdGE6XCJwcm9iZVwifV0pO3RyYW5zcG9ydC5vbmNlKFwicGFja2V0XCIsZnVuY3Rpb24obXNnKXtpZihmYWlsZWQpcmV0dXJuO2lmKFwicG9uZ1wiPT1tc2cudHlwZSYmXCJwcm9iZVwiPT1tc2cuZGF0YSl7ZGVidWcoJ3Byb2JlIHRyYW5zcG9ydCBcIiVzXCIgcG9uZycsbmFtZSk7c2VsZi51cGdyYWRpbmc9dHJ1ZTtzZWxmLmVtaXQoXCJ1cGdyYWRpbmdcIix0cmFuc3BvcnQpO2lmKCF0cmFuc3BvcnQpcmV0dXJuO1NvY2tldC5wcmlvcldlYnNvY2tldFN1Y2Nlc3M9XCJ3ZWJzb2NrZXRcIj09dHJhbnNwb3J0Lm5hbWU7ZGVidWcoJ3BhdXNpbmcgY3VycmVudCB0cmFuc3BvcnQgXCIlc1wiJyxzZWxmLnRyYW5zcG9ydC5uYW1lKTtzZWxmLnRyYW5zcG9ydC5wYXVzZShmdW5jdGlvbigpe2lmKGZhaWxlZClyZXR1cm47aWYoXCJjbG9zZWRcIj09c2VsZi5yZWFkeVN0YXRlKXJldHVybjtkZWJ1ZyhcImNoYW5naW5nIHRyYW5zcG9ydCBhbmQgc2VuZGluZyB1cGdyYWRlIHBhY2tldFwiKTtjbGVhbnVwKCk7c2VsZi5zZXRUcmFuc3BvcnQodHJhbnNwb3J0KTt0cmFuc3BvcnQuc2VuZChbe3R5cGU6XCJ1cGdyYWRlXCJ9XSk7c2VsZi5lbWl0KFwidXBncmFkZVwiLHRyYW5zcG9ydCk7dHJhbnNwb3J0PW51bGw7c2VsZi51cGdyYWRpbmc9ZmFsc2U7c2VsZi5mbHVzaCgpfSl9ZWxzZXtkZWJ1ZygncHJvYmUgdHJhbnNwb3J0IFwiJXNcIiBmYWlsZWQnLG5hbWUpO3ZhciBlcnI9bmV3IEVycm9yKFwicHJvYmUgZXJyb3JcIik7ZXJyLnRyYW5zcG9ydD10cmFuc3BvcnQubmFtZTtzZWxmLmVtaXQoXCJ1cGdyYWRlRXJyb3JcIixlcnIpfX0pfWZ1bmN0aW9uIGZyZWV6ZVRyYW5zcG9ydCgpe2lmKGZhaWxlZClyZXR1cm47ZmFpbGVkPXRydWU7Y2xlYW51cCgpO3RyYW5zcG9ydC5jbG9zZSgpO3RyYW5zcG9ydD1udWxsfWZ1bmN0aW9uIG9uZXJyb3IoZXJyKXt2YXIgZXJyb3I9bmV3IEVycm9yKFwicHJvYmUgZXJyb3I6IFwiK2Vycik7ZXJyb3IudHJhbnNwb3J0PXRyYW5zcG9ydC5uYW1lO2ZyZWV6ZVRyYW5zcG9ydCgpO2RlYnVnKCdwcm9iZSB0cmFuc3BvcnQgXCIlc1wiIGZhaWxlZCBiZWNhdXNlIG9mIGVycm9yOiAlcycsbmFtZSxlcnIpO3NlbGYuZW1pdChcInVwZ3JhZGVFcnJvclwiLGVycm9yKX1mdW5jdGlvbiBvblRyYW5zcG9ydENsb3NlKCl7b25lcnJvcihcInRyYW5zcG9ydCBjbG9zZWRcIil9ZnVuY3Rpb24gb25jbG9zZSgpe29uZXJyb3IoXCJzb2NrZXQgY2xvc2VkXCIpfWZ1bmN0aW9uIG9udXBncmFkZSh0byl7aWYodHJhbnNwb3J0JiZ0by5uYW1lIT10cmFuc3BvcnQubmFtZSl7ZGVidWcoJ1wiJXNcIiB3b3JrcyAtIGFib3J0aW5nIFwiJXNcIicsdG8ubmFtZSx0cmFuc3BvcnQubmFtZSk7ZnJlZXplVHJhbnNwb3J0KCl9fWZ1bmN0aW9uIGNsZWFudXAoKXt0cmFuc3BvcnQucmVtb3ZlTGlzdGVuZXIoXCJvcGVuXCIsb25UcmFuc3BvcnRPcGVuKTt0cmFuc3BvcnQucmVtb3ZlTGlzdGVuZXIoXCJlcnJvclwiLG9uZXJyb3IpO3RyYW5zcG9ydC5yZW1vdmVMaXN0ZW5lcihcImNsb3NlXCIsb25UcmFuc3BvcnRDbG9zZSk7c2VsZi5yZW1vdmVMaXN0ZW5lcihcImNsb3NlXCIsb25jbG9zZSk7c2VsZi5yZW1vdmVMaXN0ZW5lcihcInVwZ3JhZGluZ1wiLG9udXBncmFkZSl9dHJhbnNwb3J0Lm9uY2UoXCJvcGVuXCIsb25UcmFuc3BvcnRPcGVuKTt0cmFuc3BvcnQub25jZShcImVycm9yXCIsb25lcnJvcik7dHJhbnNwb3J0Lm9uY2UoXCJjbG9zZVwiLG9uVHJhbnNwb3J0Q2xvc2UpO3RoaXMub25jZShcImNsb3NlXCIsb25jbG9zZSk7dGhpcy5vbmNlKFwidXBncmFkaW5nXCIsb251cGdyYWRlKTt0cmFuc3BvcnQub3BlbigpfTtTb2NrZXQucHJvdG90eXBlLm9uT3Blbj1mdW5jdGlvbigpe2RlYnVnKFwic29ja2V0IG9wZW5cIik7dGhpcy5yZWFkeVN0YXRlPVwib3BlblwiO1NvY2tldC5wcmlvcldlYnNvY2tldFN1Y2Nlc3M9XCJ3ZWJzb2NrZXRcIj09dGhpcy50cmFuc3BvcnQubmFtZTt0aGlzLmVtaXQoXCJvcGVuXCIpO3RoaXMuZmx1c2goKTtpZihcIm9wZW5cIj09dGhpcy5yZWFkeVN0YXRlJiZ0aGlzLnVwZ3JhZGUmJnRoaXMudHJhbnNwb3J0LnBhdXNlKXtkZWJ1ZyhcInN0YXJ0aW5nIHVwZ3JhZGUgcHJvYmVzXCIpO2Zvcih2YXIgaT0wLGw9dGhpcy51cGdyYWRlcy5sZW5ndGg7aTxsO2krKyl7dGhpcy5wcm9iZSh0aGlzLnVwZ3JhZGVzW2ldKX19fTtTb2NrZXQucHJvdG90eXBlLm9uUGFja2V0PWZ1bmN0aW9uKHBhY2tldCl7aWYoXCJvcGVuaW5nXCI9PXRoaXMucmVhZHlTdGF0ZXx8XCJvcGVuXCI9PXRoaXMucmVhZHlTdGF0ZSl7ZGVidWcoJ3NvY2tldCByZWNlaXZlOiB0eXBlIFwiJXNcIiwgZGF0YSBcIiVzXCInLHBhY2tldC50eXBlLHBhY2tldC5kYXRhKTt0aGlzLmVtaXQoXCJwYWNrZXRcIixwYWNrZXQpO3RoaXMuZW1pdChcImhlYXJ0YmVhdFwiKTtzd2l0Y2gocGFja2V0LnR5cGUpe2Nhc2VcIm9wZW5cIjp0aGlzLm9uSGFuZHNoYWtlKHBhcnNlanNvbihwYWNrZXQuZGF0YSkpO2JyZWFrO2Nhc2VcInBvbmdcIjp0aGlzLnNldFBpbmcoKTt0aGlzLmVtaXQoXCJwb25nXCIpO2JyZWFrO2Nhc2VcImVycm9yXCI6dmFyIGVycj1uZXcgRXJyb3IoXCJzZXJ2ZXIgZXJyb3JcIik7ZXJyLmNvZGU9cGFja2V0LmRhdGE7dGhpcy5vbkVycm9yKGVycik7YnJlYWs7Y2FzZVwibWVzc2FnZVwiOnRoaXMuZW1pdChcImRhdGFcIixwYWNrZXQuZGF0YSk7dGhpcy5lbWl0KFwibWVzc2FnZVwiLHBhY2tldC5kYXRhKTticmVha319ZWxzZXtkZWJ1ZygncGFja2V0IHJlY2VpdmVkIHdpdGggc29ja2V0IHJlYWR5U3RhdGUgXCIlc1wiJyx0aGlzLnJlYWR5U3RhdGUpfX07U29ja2V0LnByb3RvdHlwZS5vbkhhbmRzaGFrZT1mdW5jdGlvbihkYXRhKXt0aGlzLmVtaXQoXCJoYW5kc2hha2VcIixkYXRhKTt0aGlzLmlkPWRhdGEuc2lkO3RoaXMudHJhbnNwb3J0LnF1ZXJ5LnNpZD1kYXRhLnNpZDt0aGlzLnVwZ3JhZGVzPXRoaXMuZmlsdGVyVXBncmFkZXMoZGF0YS51cGdyYWRlcyk7dGhpcy5waW5nSW50ZXJ2YWw9ZGF0YS5waW5nSW50ZXJ2YWw7dGhpcy5waW5nVGltZW91dD1kYXRhLnBpbmdUaW1lb3V0O3RoaXMub25PcGVuKCk7aWYoXCJjbG9zZWRcIj09dGhpcy5yZWFkeVN0YXRlKXJldHVybjt0aGlzLnNldFBpbmcoKTt0aGlzLnJlbW92ZUxpc3RlbmVyKFwiaGVhcnRiZWF0XCIsdGhpcy5vbkhlYXJ0YmVhdCk7dGhpcy5vbihcImhlYXJ0YmVhdFwiLHRoaXMub25IZWFydGJlYXQpfTtTb2NrZXQucHJvdG90eXBlLm9uSGVhcnRiZWF0PWZ1bmN0aW9uKHRpbWVvdXQpe2NsZWFyVGltZW91dCh0aGlzLnBpbmdUaW1lb3V0VGltZXIpO3ZhciBzZWxmPXRoaXM7c2VsZi5waW5nVGltZW91dFRpbWVyPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtpZihcImNsb3NlZFwiPT1zZWxmLnJlYWR5U3RhdGUpcmV0dXJuO3NlbGYub25DbG9zZShcInBpbmcgdGltZW91dFwiKX0sdGltZW91dHx8c2VsZi5waW5nSW50ZXJ2YWwrc2VsZi5waW5nVGltZW91dCl9O1NvY2tldC5wcm90b3R5cGUuc2V0UGluZz1mdW5jdGlvbigpe3ZhciBzZWxmPXRoaXM7Y2xlYXJUaW1lb3V0KHNlbGYucGluZ0ludGVydmFsVGltZXIpO3NlbGYucGluZ0ludGVydmFsVGltZXI9c2V0VGltZW91dChmdW5jdGlvbigpe2RlYnVnKFwid3JpdGluZyBwaW5nIHBhY2tldCAtIGV4cGVjdGluZyBwb25nIHdpdGhpbiAlc21zXCIsc2VsZi5waW5nVGltZW91dCk7c2VsZi5waW5nKCk7c2VsZi5vbkhlYXJ0YmVhdChzZWxmLnBpbmdUaW1lb3V0KX0sc2VsZi5waW5nSW50ZXJ2YWwpfTtTb2NrZXQucHJvdG90eXBlLnBpbmc9ZnVuY3Rpb24oKXt2YXIgc2VsZj10aGlzO3RoaXMuc2VuZFBhY2tldChcInBpbmdcIixmdW5jdGlvbigpe3NlbGYuZW1pdChcInBpbmdcIil9KX07U29ja2V0LnByb3RvdHlwZS5vbkRyYWluPWZ1bmN0aW9uKCl7dGhpcy53cml0ZUJ1ZmZlci5zcGxpY2UoMCx0aGlzLnByZXZCdWZmZXJMZW4pO3RoaXMucHJldkJ1ZmZlckxlbj0wO2lmKDA9PT10aGlzLndyaXRlQnVmZmVyLmxlbmd0aCl7dGhpcy5lbWl0KFwiZHJhaW5cIil9ZWxzZXt0aGlzLmZsdXNoKCl9fTtTb2NrZXQucHJvdG90eXBlLmZsdXNoPWZ1bmN0aW9uKCl7aWYoXCJjbG9zZWRcIiE9dGhpcy5yZWFkeVN0YXRlJiZ0aGlzLnRyYW5zcG9ydC53cml0YWJsZSYmIXRoaXMudXBncmFkaW5nJiZ0aGlzLndyaXRlQnVmZmVyLmxlbmd0aCl7ZGVidWcoXCJmbHVzaGluZyAlZCBwYWNrZXRzIGluIHNvY2tldFwiLHRoaXMud3JpdGVCdWZmZXIubGVuZ3RoKTt0aGlzLnRyYW5zcG9ydC5zZW5kKHRoaXMud3JpdGVCdWZmZXIpO3RoaXMucHJldkJ1ZmZlckxlbj10aGlzLndyaXRlQnVmZmVyLmxlbmd0aDt0aGlzLmVtaXQoXCJmbHVzaFwiKX19O1NvY2tldC5wcm90b3R5cGUud3JpdGU9U29ja2V0LnByb3RvdHlwZS5zZW5kPWZ1bmN0aW9uKG1zZyxvcHRpb25zLGZuKXt0aGlzLnNlbmRQYWNrZXQoXCJtZXNzYWdlXCIsbXNnLG9wdGlvbnMsZm4pO3JldHVybiB0aGlzfTtTb2NrZXQucHJvdG90eXBlLnNlbmRQYWNrZXQ9ZnVuY3Rpb24odHlwZSxkYXRhLG9wdGlvbnMsZm4pe2lmKFwiZnVuY3Rpb25cIj09dHlwZW9mIGRhdGEpe2ZuPWRhdGE7ZGF0YT11bmRlZmluZWR9aWYoXCJmdW5jdGlvblwiPT10eXBlb2Ygb3B0aW9ucyl7Zm49b3B0aW9ucztvcHRpb25zPW51bGx9aWYoXCJjbG9zaW5nXCI9PXRoaXMucmVhZHlTdGF0ZXx8XCJjbG9zZWRcIj09dGhpcy5yZWFkeVN0YXRlKXtyZXR1cm59b3B0aW9ucz1vcHRpb25zfHx7fTtvcHRpb25zLmNvbXByZXNzPWZhbHNlIT09b3B0aW9ucy5jb21wcmVzczt2YXIgcGFja2V0PXt0eXBlOnR5cGUsZGF0YTpkYXRhLG9wdGlvbnM6b3B0aW9uc307dGhpcy5lbWl0KFwicGFja2V0Q3JlYXRlXCIscGFja2V0KTt0aGlzLndyaXRlQnVmZmVyLnB1c2gocGFja2V0KTtpZihmbil0aGlzLm9uY2UoXCJmbHVzaFwiLGZuKTt0aGlzLmZsdXNoKCl9O1NvY2tldC5wcm90b3R5cGUuY2xvc2U9ZnVuY3Rpb24oKXtpZihcIm9wZW5pbmdcIj09dGhpcy5yZWFkeVN0YXRlfHxcIm9wZW5cIj09dGhpcy5yZWFkeVN0YXRlKXt0aGlzLnJlYWR5U3RhdGU9XCJjbG9zaW5nXCI7dmFyIHNlbGY9dGhpcztpZih0aGlzLndyaXRlQnVmZmVyLmxlbmd0aCl7dGhpcy5vbmNlKFwiZHJhaW5cIixmdW5jdGlvbigpe2lmKHRoaXMudXBncmFkaW5nKXt3YWl0Rm9yVXBncmFkZSgpfWVsc2V7Y2xvc2UoKX19KX1lbHNlIGlmKHRoaXMudXBncmFkaW5nKXt3YWl0Rm9yVXBncmFkZSgpfWVsc2V7Y2xvc2UoKX19ZnVuY3Rpb24gY2xvc2UoKXtzZWxmLm9uQ2xvc2UoXCJmb3JjZWQgY2xvc2VcIik7ZGVidWcoXCJzb2NrZXQgY2xvc2luZyAtIHRlbGxpbmcgdHJhbnNwb3J0IHRvIGNsb3NlXCIpO3NlbGYudHJhbnNwb3J0LmNsb3NlKCl9ZnVuY3Rpb24gY2xlYW51cEFuZENsb3NlKCl7c2VsZi5yZW1vdmVMaXN0ZW5lcihcInVwZ3JhZGVcIixjbGVhbnVwQW5kQ2xvc2UpO3NlbGYucmVtb3ZlTGlzdGVuZXIoXCJ1cGdyYWRlRXJyb3JcIixjbGVhbnVwQW5kQ2xvc2UpO2Nsb3NlKCl9ZnVuY3Rpb24gd2FpdEZvclVwZ3JhZGUoKXtzZWxmLm9uY2UoXCJ1cGdyYWRlXCIsY2xlYW51cEFuZENsb3NlKTtzZWxmLm9uY2UoXCJ1cGdyYWRlRXJyb3JcIixjbGVhbnVwQW5kQ2xvc2UpfXJldHVybiB0aGlzfTtTb2NrZXQucHJvdG90eXBlLm9uRXJyb3I9ZnVuY3Rpb24oZXJyKXtkZWJ1ZyhcInNvY2tldCBlcnJvciAlalwiLGVycik7U29ja2V0LnByaW9yV2Vic29ja2V0U3VjY2Vzcz1mYWxzZTt0aGlzLmVtaXQoXCJlcnJvclwiLGVycik7dGhpcy5vbkNsb3NlKFwidHJhbnNwb3J0IGVycm9yXCIsZXJyKX07U29ja2V0LnByb3RvdHlwZS5vbkNsb3NlPWZ1bmN0aW9uKHJlYXNvbixkZXNjKXtpZihcIm9wZW5pbmdcIj09dGhpcy5yZWFkeVN0YXRlfHxcIm9wZW5cIj09dGhpcy5yZWFkeVN0YXRlfHxcImNsb3NpbmdcIj09dGhpcy5yZWFkeVN0YXRlKXtkZWJ1Zygnc29ja2V0IGNsb3NlIHdpdGggcmVhc29uOiBcIiVzXCInLHJlYXNvbik7dmFyIHNlbGY9dGhpcztjbGVhclRpbWVvdXQodGhpcy5waW5nSW50ZXJ2YWxUaW1lcik7Y2xlYXJUaW1lb3V0KHRoaXMucGluZ1RpbWVvdXRUaW1lcik7dGhpcy50cmFuc3BvcnQucmVtb3ZlQWxsTGlzdGVuZXJzKFwiY2xvc2VcIik7dGhpcy50cmFuc3BvcnQuY2xvc2UoKTt0aGlzLnRyYW5zcG9ydC5yZW1vdmVBbGxMaXN0ZW5lcnMoKTt0aGlzLnJlYWR5U3RhdGU9XCJjbG9zZWRcIjt0aGlzLmlkPW51bGw7dGhpcy5lbWl0KFwiY2xvc2VcIixyZWFzb24sZGVzYyk7c2VsZi53cml0ZUJ1ZmZlcj1bXTtzZWxmLnByZXZCdWZmZXJMZW49MH19O1NvY2tldC5wcm90b3R5cGUuZmlsdGVyVXBncmFkZXM9ZnVuY3Rpb24odXBncmFkZXMpe3ZhciBmaWx0ZXJlZFVwZ3JhZGVzPVtdO2Zvcih2YXIgaT0wLGo9dXBncmFkZXMubGVuZ3RoO2k8ajtpKyspe2lmKH5pbmRleCh0aGlzLnRyYW5zcG9ydHMsdXBncmFkZXNbaV0pKWZpbHRlcmVkVXBncmFkZXMucHVzaCh1cGdyYWRlc1tpXSl9cmV0dXJuIGZpbHRlcmVkVXBncmFkZXN9fSkuY2FsbCh0aGlzLHR5cGVvZiBzZWxmIT09XCJ1bmRlZmluZWRcIj9zZWxmOnR5cGVvZiB3aW5kb3chPT1cInVuZGVmaW5lZFwiP3dpbmRvdzp0eXBlb2YgZ2xvYmFsIT09XCJ1bmRlZmluZWRcIj9nbG9iYWw6e30pfSx7XCIuL3RyYW5zcG9ydFwiOjQsXCIuL3RyYW5zcG9ydHNcIjo1LFwiY29tcG9uZW50LWVtaXR0ZXJcIjoxNSxkZWJ1ZzoxNyxcImVuZ2luZS5pby1wYXJzZXJcIjoxOSxpbmRleG9mOjIzLHBhcnNlanNvbjoyNixwYXJzZXFzOjI3LHBhcnNldXJpOjI4fV0sNDpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7dmFyIHBhcnNlcj1fZGVyZXFfKFwiZW5naW5lLmlvLXBhcnNlclwiKTt2YXIgRW1pdHRlcj1fZGVyZXFfKFwiY29tcG9uZW50LWVtaXR0ZXJcIik7bW9kdWxlLmV4cG9ydHM9VHJhbnNwb3J0O2Z1bmN0aW9uIFRyYW5zcG9ydChvcHRzKXt0aGlzLnBhdGg9b3B0cy5wYXRoO3RoaXMuaG9zdG5hbWU9b3B0cy5ob3N0bmFtZTt0aGlzLnBvcnQ9b3B0cy5wb3J0O3RoaXMuc2VjdXJlPW9wdHMuc2VjdXJlO3RoaXMucXVlcnk9b3B0cy5xdWVyeTt0aGlzLnRpbWVzdGFtcFBhcmFtPW9wdHMudGltZXN0YW1wUGFyYW07dGhpcy50aW1lc3RhbXBSZXF1ZXN0cz1vcHRzLnRpbWVzdGFtcFJlcXVlc3RzO3RoaXMucmVhZHlTdGF0ZT1cIlwiO3RoaXMuYWdlbnQ9b3B0cy5hZ2VudHx8ZmFsc2U7dGhpcy5zb2NrZXQ9b3B0cy5zb2NrZXQ7dGhpcy5lbmFibGVzWERSPW9wdHMuZW5hYmxlc1hEUjt0aGlzLnBmeD1vcHRzLnBmeDt0aGlzLmtleT1vcHRzLmtleTt0aGlzLnBhc3NwaHJhc2U9b3B0cy5wYXNzcGhyYXNlO3RoaXMuY2VydD1vcHRzLmNlcnQ7dGhpcy5jYT1vcHRzLmNhO3RoaXMuY2lwaGVycz1vcHRzLmNpcGhlcnM7dGhpcy5yZWplY3RVbmF1dGhvcml6ZWQ9b3B0cy5yZWplY3RVbmF1dGhvcml6ZWQ7dGhpcy5leHRyYUhlYWRlcnM9b3B0cy5leHRyYUhlYWRlcnN9RW1pdHRlcihUcmFuc3BvcnQucHJvdG90eXBlKTtUcmFuc3BvcnQucHJvdG90eXBlLm9uRXJyb3I9ZnVuY3Rpb24obXNnLGRlc2Mpe3ZhciBlcnI9bmV3IEVycm9yKG1zZyk7ZXJyLnR5cGU9XCJUcmFuc3BvcnRFcnJvclwiO2Vyci5kZXNjcmlwdGlvbj1kZXNjO3RoaXMuZW1pdChcImVycm9yXCIsZXJyKTtyZXR1cm4gdGhpc307VHJhbnNwb3J0LnByb3RvdHlwZS5vcGVuPWZ1bmN0aW9uKCl7aWYoXCJjbG9zZWRcIj09dGhpcy5yZWFkeVN0YXRlfHxcIlwiPT10aGlzLnJlYWR5U3RhdGUpe3RoaXMucmVhZHlTdGF0ZT1cIm9wZW5pbmdcIjt0aGlzLmRvT3BlbigpfXJldHVybiB0aGlzfTtUcmFuc3BvcnQucHJvdG90eXBlLmNsb3NlPWZ1bmN0aW9uKCl7aWYoXCJvcGVuaW5nXCI9PXRoaXMucmVhZHlTdGF0ZXx8XCJvcGVuXCI9PXRoaXMucmVhZHlTdGF0ZSl7dGhpcy5kb0Nsb3NlKCk7dGhpcy5vbkNsb3NlKCl9cmV0dXJuIHRoaXN9O1RyYW5zcG9ydC5wcm90b3R5cGUuc2VuZD1mdW5jdGlvbihwYWNrZXRzKXtpZihcIm9wZW5cIj09dGhpcy5yZWFkeVN0YXRlKXt0aGlzLndyaXRlKHBhY2tldHMpfWVsc2V7dGhyb3cgbmV3IEVycm9yKFwiVHJhbnNwb3J0IG5vdCBvcGVuXCIpfX07VHJhbnNwb3J0LnByb3RvdHlwZS5vbk9wZW49ZnVuY3Rpb24oKXt0aGlzLnJlYWR5U3RhdGU9XCJvcGVuXCI7dGhpcy53cml0YWJsZT10cnVlO3RoaXMuZW1pdChcIm9wZW5cIil9O1RyYW5zcG9ydC5wcm90b3R5cGUub25EYXRhPWZ1bmN0aW9uKGRhdGEpe3ZhciBwYWNrZXQ9cGFyc2VyLmRlY29kZVBhY2tldChkYXRhLHRoaXMuc29ja2V0LmJpbmFyeVR5cGUpO3RoaXMub25QYWNrZXQocGFja2V0KX07VHJhbnNwb3J0LnByb3RvdHlwZS5vblBhY2tldD1mdW5jdGlvbihwYWNrZXQpe3RoaXMuZW1pdChcInBhY2tldFwiLHBhY2tldCl9O1RyYW5zcG9ydC5wcm90b3R5cGUub25DbG9zZT1mdW5jdGlvbigpe3RoaXMucmVhZHlTdGF0ZT1cImNsb3NlZFwiO3RoaXMuZW1pdChcImNsb3NlXCIpfX0se1wiY29tcG9uZW50LWVtaXR0ZXJcIjoxNSxcImVuZ2luZS5pby1wYXJzZXJcIjoxOX1dLDU6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeyhmdW5jdGlvbihnbG9iYWwpe3ZhciBYTUxIdHRwUmVxdWVzdD1fZGVyZXFfKFwieG1saHR0cHJlcXVlc3Qtc3NsXCIpO3ZhciBYSFI9X2RlcmVxXyhcIi4vcG9sbGluZy14aHJcIik7dmFyIEpTT05QPV9kZXJlcV8oXCIuL3BvbGxpbmctanNvbnBcIik7dmFyIHdlYnNvY2tldD1fZGVyZXFfKFwiLi93ZWJzb2NrZXRcIik7ZXhwb3J0cy5wb2xsaW5nPXBvbGxpbmc7ZXhwb3J0cy53ZWJzb2NrZXQ9d2Vic29ja2V0O2Z1bmN0aW9uIHBvbGxpbmcob3B0cyl7dmFyIHhocjt2YXIgeGQ9ZmFsc2U7dmFyIHhzPWZhbHNlO3ZhciBqc29ucD1mYWxzZSE9PW9wdHMuanNvbnA7aWYoZ2xvYmFsLmxvY2F0aW9uKXt2YXIgaXNTU0w9XCJodHRwczpcIj09bG9jYXRpb24ucHJvdG9jb2w7dmFyIHBvcnQ9bG9jYXRpb24ucG9ydDtpZighcG9ydCl7cG9ydD1pc1NTTD80NDM6ODB9eGQ9b3B0cy5ob3N0bmFtZSE9bG9jYXRpb24uaG9zdG5hbWV8fHBvcnQhPW9wdHMucG9ydDt4cz1vcHRzLnNlY3VyZSE9aXNTU0x9b3B0cy54ZG9tYWluPXhkO29wdHMueHNjaGVtZT14czt4aHI9bmV3IFhNTEh0dHBSZXF1ZXN0KG9wdHMpO2lmKFwib3BlblwiaW4geGhyJiYhb3B0cy5mb3JjZUpTT05QKXtyZXR1cm4gbmV3IFhIUihvcHRzKX1lbHNle2lmKCFqc29ucCl0aHJvdyBuZXcgRXJyb3IoXCJKU09OUCBkaXNhYmxlZFwiKTtyZXR1cm4gbmV3IEpTT05QKG9wdHMpfX19KS5jYWxsKHRoaXMsdHlwZW9mIHNlbGYhPT1cInVuZGVmaW5lZFwiP3NlbGY6dHlwZW9mIHdpbmRvdyE9PVwidW5kZWZpbmVkXCI/d2luZG93OnR5cGVvZiBnbG9iYWwhPT1cInVuZGVmaW5lZFwiP2dsb2JhbDp7fSl9LHtcIi4vcG9sbGluZy1qc29ucFwiOjYsXCIuL3BvbGxpbmcteGhyXCI6NyxcIi4vd2Vic29ja2V0XCI6OSxcInhtbGh0dHByZXF1ZXN0LXNzbFwiOjEwfV0sNjpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7KGZ1bmN0aW9uKGdsb2JhbCl7dmFyIFBvbGxpbmc9X2RlcmVxXyhcIi4vcG9sbGluZ1wiKTt2YXIgaW5oZXJpdD1fZGVyZXFfKFwiY29tcG9uZW50LWluaGVyaXRcIik7bW9kdWxlLmV4cG9ydHM9SlNPTlBQb2xsaW5nO3ZhciByTmV3bGluZT0vXFxuL2c7dmFyIHJFc2NhcGVkTmV3bGluZT0vXFxcXG4vZzt2YXIgY2FsbGJhY2tzO3ZhciBpbmRleD0wO2Z1bmN0aW9uIGVtcHR5KCl7fWZ1bmN0aW9uIEpTT05QUG9sbGluZyhvcHRzKXtQb2xsaW5nLmNhbGwodGhpcyxvcHRzKTt0aGlzLnF1ZXJ5PXRoaXMucXVlcnl8fHt9O2lmKCFjYWxsYmFja3Mpe2lmKCFnbG9iYWwuX19fZWlvKWdsb2JhbC5fX19laW89W107Y2FsbGJhY2tzPWdsb2JhbC5fX19laW99dGhpcy5pbmRleD1jYWxsYmFja3MubGVuZ3RoO3ZhciBzZWxmPXRoaXM7Y2FsbGJhY2tzLnB1c2goZnVuY3Rpb24obXNnKXtzZWxmLm9uRGF0YShtc2cpfSk7dGhpcy5xdWVyeS5qPXRoaXMuaW5kZXg7aWYoZ2xvYmFsLmRvY3VtZW50JiZnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lcil7Z2xvYmFsLmFkZEV2ZW50TGlzdGVuZXIoXCJiZWZvcmV1bmxvYWRcIixmdW5jdGlvbigpe2lmKHNlbGYuc2NyaXB0KXNlbGYuc2NyaXB0Lm9uZXJyb3I9ZW1wdHl9LGZhbHNlKX19aW5oZXJpdChKU09OUFBvbGxpbmcsUG9sbGluZyk7SlNPTlBQb2xsaW5nLnByb3RvdHlwZS5zdXBwb3J0c0JpbmFyeT1mYWxzZTtKU09OUFBvbGxpbmcucHJvdG90eXBlLmRvQ2xvc2U9ZnVuY3Rpb24oKXtpZih0aGlzLnNjcmlwdCl7dGhpcy5zY3JpcHQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLnNjcmlwdCk7dGhpcy5zY3JpcHQ9bnVsbH1pZih0aGlzLmZvcm0pe3RoaXMuZm9ybS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuZm9ybSk7dGhpcy5mb3JtPW51bGw7dGhpcy5pZnJhbWU9bnVsbH1Qb2xsaW5nLnByb3RvdHlwZS5kb0Nsb3NlLmNhbGwodGhpcyl9O0pTT05QUG9sbGluZy5wcm90b3R5cGUuZG9Qb2xsPWZ1bmN0aW9uKCl7dmFyIHNlbGY9dGhpczt2YXIgc2NyaXB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzY3JpcHRcIik7aWYodGhpcy5zY3JpcHQpe3RoaXMuc2NyaXB0LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5zY3JpcHQpO3RoaXMuc2NyaXB0PW51bGx9c2NyaXB0LmFzeW5jPXRydWU7c2NyaXB0LnNyYz10aGlzLnVyaSgpO3NjcmlwdC5vbmVycm9yPWZ1bmN0aW9uKGUpe3NlbGYub25FcnJvcihcImpzb25wIHBvbGwgZXJyb3JcIixlKX07dmFyIGluc2VydEF0PWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwic2NyaXB0XCIpWzBdO2lmKGluc2VydEF0KXtpbnNlcnRBdC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShzY3JpcHQsaW5zZXJ0QXQpfWVsc2V7KGRvY3VtZW50LmhlYWR8fGRvY3VtZW50LmJvZHkpLmFwcGVuZENoaWxkKHNjcmlwdCl9dGhpcy5zY3JpcHQ9c2NyaXB0O3ZhciBpc1VBZ2Vja289XCJ1bmRlZmluZWRcIiE9dHlwZW9mIG5hdmlnYXRvciYmL2dlY2tvL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtpZihpc1VBZ2Vja28pe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgaWZyYW1lPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpZnJhbWVcIik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChpZnJhbWUpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoaWZyYW1lKX0sMTAwKX19O0pTT05QUG9sbGluZy5wcm90b3R5cGUuZG9Xcml0ZT1mdW5jdGlvbihkYXRhLGZuKXt2YXIgc2VsZj10aGlzO2lmKCF0aGlzLmZvcm0pe3ZhciBmb3JtPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJmb3JtXCIpO3ZhciBhcmVhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZXh0YXJlYVwiKTt2YXIgaWQ9dGhpcy5pZnJhbWVJZD1cImVpb19pZnJhbWVfXCIrdGhpcy5pbmRleDt2YXIgaWZyYW1lO2Zvcm0uY2xhc3NOYW1lPVwic29ja2V0aW9cIjtmb3JtLnN0eWxlLnBvc2l0aW9uPVwiYWJzb2x1dGVcIjtmb3JtLnN0eWxlLnRvcD1cIi0xMDAwcHhcIjtmb3JtLnN0eWxlLmxlZnQ9XCItMTAwMHB4XCI7Zm9ybS50YXJnZXQ9aWQ7Zm9ybS5tZXRob2Q9XCJQT1NUXCI7Zm9ybS5zZXRBdHRyaWJ1dGUoXCJhY2NlcHQtY2hhcnNldFwiLFwidXRmLThcIik7YXJlYS5uYW1lPVwiZFwiO2Zvcm0uYXBwZW5kQ2hpbGQoYXJlYSk7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmb3JtKTt0aGlzLmZvcm09Zm9ybTt0aGlzLmFyZWE9YXJlYX10aGlzLmZvcm0uYWN0aW9uPXRoaXMudXJpKCk7ZnVuY3Rpb24gY29tcGxldGUoKXtpbml0SWZyYW1lKCk7Zm4oKX1mdW5jdGlvbiBpbml0SWZyYW1lKCl7aWYoc2VsZi5pZnJhbWUpe3RyeXtzZWxmLmZvcm0ucmVtb3ZlQ2hpbGQoc2VsZi5pZnJhbWUpfWNhdGNoKGUpe3NlbGYub25FcnJvcihcImpzb25wIHBvbGxpbmcgaWZyYW1lIHJlbW92YWwgZXJyb3JcIixlKX19dHJ5e3ZhciBodG1sPSc8aWZyYW1lIHNyYz1cImphdmFzY3JpcHQ6MFwiIG5hbWU9XCInK3NlbGYuaWZyYW1lSWQrJ1wiPic7aWZyYW1lPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoaHRtbCl9Y2F0Y2goZSl7aWZyYW1lPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpZnJhbWVcIik7aWZyYW1lLm5hbWU9c2VsZi5pZnJhbWVJZDtpZnJhbWUuc3JjPVwiamF2YXNjcmlwdDowXCJ9aWZyYW1lLmlkPXNlbGYuaWZyYW1lSWQ7c2VsZi5mb3JtLmFwcGVuZENoaWxkKGlmcmFtZSk7c2VsZi5pZnJhbWU9aWZyYW1lfWluaXRJZnJhbWUoKTtkYXRhPWRhdGEucmVwbGFjZShyRXNjYXBlZE5ld2xpbmUsXCJcXFxcXFxuXCIpO3RoaXMuYXJlYS52YWx1ZT1kYXRhLnJlcGxhY2Uock5ld2xpbmUsXCJcXFxcblwiKTt0cnl7dGhpcy5mb3JtLnN1Ym1pdCgpfWNhdGNoKGUpe31pZih0aGlzLmlmcmFtZS5hdHRhY2hFdmVudCl7dGhpcy5pZnJhbWUub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7aWYoc2VsZi5pZnJhbWUucmVhZHlTdGF0ZT09XCJjb21wbGV0ZVwiKXtjb21wbGV0ZSgpfX19ZWxzZXt0aGlzLmlmcmFtZS5vbmxvYWQ9Y29tcGxldGV9fX0pLmNhbGwodGhpcyx0eXBlb2Ygc2VsZiE9PVwidW5kZWZpbmVkXCI/c2VsZjp0eXBlb2Ygd2luZG93IT09XCJ1bmRlZmluZWRcIj93aW5kb3c6dHlwZW9mIGdsb2JhbCE9PVwidW5kZWZpbmVkXCI/Z2xvYmFsOnt9KX0se1wiLi9wb2xsaW5nXCI6OCxcImNvbXBvbmVudC1pbmhlcml0XCI6MTZ9XSw3OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsoZnVuY3Rpb24oZ2xvYmFsKXt2YXIgWE1MSHR0cFJlcXVlc3Q9X2RlcmVxXyhcInhtbGh0dHByZXF1ZXN0LXNzbFwiKTt2YXIgUG9sbGluZz1fZGVyZXFfKFwiLi9wb2xsaW5nXCIpO3ZhciBFbWl0dGVyPV9kZXJlcV8oXCJjb21wb25lbnQtZW1pdHRlclwiKTt2YXIgaW5oZXJpdD1fZGVyZXFfKFwiY29tcG9uZW50LWluaGVyaXRcIik7dmFyIGRlYnVnPV9kZXJlcV8oXCJkZWJ1Z1wiKShcImVuZ2luZS5pby1jbGllbnQ6cG9sbGluZy14aHJcIik7bW9kdWxlLmV4cG9ydHM9WEhSO21vZHVsZS5leHBvcnRzLlJlcXVlc3Q9UmVxdWVzdDtmdW5jdGlvbiBlbXB0eSgpe31mdW5jdGlvbiBYSFIob3B0cyl7UG9sbGluZy5jYWxsKHRoaXMsb3B0cyk7aWYoZ2xvYmFsLmxvY2F0aW9uKXt2YXIgaXNTU0w9XCJodHRwczpcIj09bG9jYXRpb24ucHJvdG9jb2w7dmFyIHBvcnQ9bG9jYXRpb24ucG9ydDtpZighcG9ydCl7cG9ydD1pc1NTTD80NDM6ODB9dGhpcy54ZD1vcHRzLmhvc3RuYW1lIT1nbG9iYWwubG9jYXRpb24uaG9zdG5hbWV8fHBvcnQhPW9wdHMucG9ydDt0aGlzLnhzPW9wdHMuc2VjdXJlIT1pc1NTTH1lbHNle3RoaXMuZXh0cmFIZWFkZXJzPW9wdHMuZXh0cmFIZWFkZXJzfX1pbmhlcml0KFhIUixQb2xsaW5nKTtYSFIucHJvdG90eXBlLnN1cHBvcnRzQmluYXJ5PXRydWU7WEhSLnByb3RvdHlwZS5yZXF1ZXN0PWZ1bmN0aW9uKG9wdHMpe29wdHM9b3B0c3x8e307b3B0cy51cmk9dGhpcy51cmkoKTtvcHRzLnhkPXRoaXMueGQ7b3B0cy54cz10aGlzLnhzO29wdHMuYWdlbnQ9dGhpcy5hZ2VudHx8ZmFsc2U7b3B0cy5zdXBwb3J0c0JpbmFyeT10aGlzLnN1cHBvcnRzQmluYXJ5O29wdHMuZW5hYmxlc1hEUj10aGlzLmVuYWJsZXNYRFI7b3B0cy5wZng9dGhpcy5wZng7b3B0cy5rZXk9dGhpcy5rZXk7b3B0cy5wYXNzcGhyYXNlPXRoaXMucGFzc3BocmFzZTtvcHRzLmNlcnQ9dGhpcy5jZXJ0O29wdHMuY2E9dGhpcy5jYTtvcHRzLmNpcGhlcnM9dGhpcy5jaXBoZXJzO29wdHMucmVqZWN0VW5hdXRob3JpemVkPXRoaXMucmVqZWN0VW5hdXRob3JpemVkO29wdHMuZXh0cmFIZWFkZXJzPXRoaXMuZXh0cmFIZWFkZXJzO3JldHVybiBuZXcgUmVxdWVzdChvcHRzKX07WEhSLnByb3RvdHlwZS5kb1dyaXRlPWZ1bmN0aW9uKGRhdGEsZm4pe3ZhciBpc0JpbmFyeT10eXBlb2YgZGF0YSE9PVwic3RyaW5nXCImJmRhdGEhPT11bmRlZmluZWQ7dmFyIHJlcT10aGlzLnJlcXVlc3Qoe21ldGhvZDpcIlBPU1RcIixkYXRhOmRhdGEsaXNCaW5hcnk6aXNCaW5hcnl9KTt2YXIgc2VsZj10aGlzO3JlcS5vbihcInN1Y2Nlc3NcIixmbik7cmVxLm9uKFwiZXJyb3JcIixmdW5jdGlvbihlcnIpe3NlbGYub25FcnJvcihcInhociBwb3N0IGVycm9yXCIsZXJyKX0pO3RoaXMuc2VuZFhocj1yZXF9O1hIUi5wcm90b3R5cGUuZG9Qb2xsPWZ1bmN0aW9uKCl7ZGVidWcoXCJ4aHIgcG9sbFwiKTt2YXIgcmVxPXRoaXMucmVxdWVzdCgpO3ZhciBzZWxmPXRoaXM7cmVxLm9uKFwiZGF0YVwiLGZ1bmN0aW9uKGRhdGEpe3NlbGYub25EYXRhKGRhdGEpfSk7cmVxLm9uKFwiZXJyb3JcIixmdW5jdGlvbihlcnIpe3NlbGYub25FcnJvcihcInhociBwb2xsIGVycm9yXCIsZXJyKX0pO3RoaXMucG9sbFhocj1yZXF9O2Z1bmN0aW9uIFJlcXVlc3Qob3B0cyl7dGhpcy5tZXRob2Q9b3B0cy5tZXRob2R8fFwiR0VUXCI7dGhpcy51cmk9b3B0cy51cmk7dGhpcy54ZD0hIW9wdHMueGQ7dGhpcy54cz0hIW9wdHMueHM7dGhpcy5hc3luYz1mYWxzZSE9PW9wdHMuYXN5bmM7dGhpcy5kYXRhPXVuZGVmaW5lZCE9b3B0cy5kYXRhP29wdHMuZGF0YTpudWxsO3RoaXMuYWdlbnQ9b3B0cy5hZ2VudDt0aGlzLmlzQmluYXJ5PW9wdHMuaXNCaW5hcnk7dGhpcy5zdXBwb3J0c0JpbmFyeT1vcHRzLnN1cHBvcnRzQmluYXJ5O3RoaXMuZW5hYmxlc1hEUj1vcHRzLmVuYWJsZXNYRFI7dGhpcy5wZng9b3B0cy5wZng7dGhpcy5rZXk9b3B0cy5rZXk7dGhpcy5wYXNzcGhyYXNlPW9wdHMucGFzc3BocmFzZTt0aGlzLmNlcnQ9b3B0cy5jZXJ0O3RoaXMuY2E9b3B0cy5jYTt0aGlzLmNpcGhlcnM9b3B0cy5jaXBoZXJzO3RoaXMucmVqZWN0VW5hdXRob3JpemVkPW9wdHMucmVqZWN0VW5hdXRob3JpemVkO3RoaXMuZXh0cmFIZWFkZXJzPW9wdHMuZXh0cmFIZWFkZXJzO3RoaXMuY3JlYXRlKCl9RW1pdHRlcihSZXF1ZXN0LnByb3RvdHlwZSk7UmVxdWVzdC5wcm90b3R5cGUuY3JlYXRlPWZ1bmN0aW9uKCl7dmFyIG9wdHM9e2FnZW50OnRoaXMuYWdlbnQseGRvbWFpbjp0aGlzLnhkLHhzY2hlbWU6dGhpcy54cyxlbmFibGVzWERSOnRoaXMuZW5hYmxlc1hEUn07b3B0cy5wZng9dGhpcy5wZng7b3B0cy5rZXk9dGhpcy5rZXk7b3B0cy5wYXNzcGhyYXNlPXRoaXMucGFzc3BocmFzZTtvcHRzLmNlcnQ9dGhpcy5jZXJ0O29wdHMuY2E9dGhpcy5jYTtvcHRzLmNpcGhlcnM9dGhpcy5jaXBoZXJzO29wdHMucmVqZWN0VW5hdXRob3JpemVkPXRoaXMucmVqZWN0VW5hdXRob3JpemVkO3ZhciB4aHI9dGhpcy54aHI9bmV3IFhNTEh0dHBSZXF1ZXN0KG9wdHMpO3ZhciBzZWxmPXRoaXM7dHJ5e2RlYnVnKFwieGhyIG9wZW4gJXM6ICVzXCIsdGhpcy5tZXRob2QsdGhpcy51cmkpO3hoci5vcGVuKHRoaXMubWV0aG9kLHRoaXMudXJpLHRoaXMuYXN5bmMpO3RyeXtpZih0aGlzLmV4dHJhSGVhZGVycyl7eGhyLnNldERpc2FibGVIZWFkZXJDaGVjayh0cnVlKTtmb3IodmFyIGkgaW4gdGhpcy5leHRyYUhlYWRlcnMpe2lmKHRoaXMuZXh0cmFIZWFkZXJzLmhhc093blByb3BlcnR5KGkpKXt4aHIuc2V0UmVxdWVzdEhlYWRlcihpLHRoaXMuZXh0cmFIZWFkZXJzW2ldKX19fX1jYXRjaChlKXt9aWYodGhpcy5zdXBwb3J0c0JpbmFyeSl7eGhyLnJlc3BvbnNlVHlwZT1cImFycmF5YnVmZmVyXCJ9aWYoXCJQT1NUXCI9PXRoaXMubWV0aG9kKXt0cnl7aWYodGhpcy5pc0JpbmFyeSl7eGhyLnNldFJlcXVlc3RIZWFkZXIoXCJDb250ZW50LXR5cGVcIixcImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbVwiKX1lbHNle3hoci5zZXRSZXF1ZXN0SGVhZGVyKFwiQ29udGVudC10eXBlXCIsXCJ0ZXh0L3BsYWluO2NoYXJzZXQ9VVRGLThcIil9fWNhdGNoKGUpe319aWYoXCJ3aXRoQ3JlZGVudGlhbHNcImluIHhocil7eGhyLndpdGhDcmVkZW50aWFscz10cnVlfWlmKHRoaXMuaGFzWERSKCkpe3hoci5vbmxvYWQ9ZnVuY3Rpb24oKXtzZWxmLm9uTG9hZCgpfTt4aHIub25lcnJvcj1mdW5jdGlvbigpe3NlbGYub25FcnJvcih4aHIucmVzcG9uc2VUZXh0KX19ZWxzZXt4aHIub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7aWYoNCE9eGhyLnJlYWR5U3RhdGUpcmV0dXJuO2lmKDIwMD09eGhyLnN0YXR1c3x8MTIyMz09eGhyLnN0YXR1cyl7c2VsZi5vbkxvYWQoKX1lbHNle3NldFRpbWVvdXQoZnVuY3Rpb24oKXtzZWxmLm9uRXJyb3IoeGhyLnN0YXR1cyl9LDApfX19ZGVidWcoXCJ4aHIgZGF0YSAlc1wiLHRoaXMuZGF0YSk7eGhyLnNlbmQodGhpcy5kYXRhKX1jYXRjaChlKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7c2VsZi5vbkVycm9yKGUpfSwwKTtyZXR1cm59aWYoZ2xvYmFsLmRvY3VtZW50KXt0aGlzLmluZGV4PVJlcXVlc3QucmVxdWVzdHNDb3VudCsrO1JlcXVlc3QucmVxdWVzdHNbdGhpcy5pbmRleF09dGhpc319O1JlcXVlc3QucHJvdG90eXBlLm9uU3VjY2Vzcz1mdW5jdGlvbigpe3RoaXMuZW1pdChcInN1Y2Nlc3NcIik7dGhpcy5jbGVhbnVwKCl9O1JlcXVlc3QucHJvdG90eXBlLm9uRGF0YT1mdW5jdGlvbihkYXRhKXt0aGlzLmVtaXQoXCJkYXRhXCIsZGF0YSk7dGhpcy5vblN1Y2Nlc3MoKX07UmVxdWVzdC5wcm90b3R5cGUub25FcnJvcj1mdW5jdGlvbihlcnIpe3RoaXMuZW1pdChcImVycm9yXCIsZXJyKTt0aGlzLmNsZWFudXAodHJ1ZSl9O1JlcXVlc3QucHJvdG90eXBlLmNsZWFudXA9ZnVuY3Rpb24oZnJvbUVycm9yKXtpZihcInVuZGVmaW5lZFwiPT10eXBlb2YgdGhpcy54aHJ8fG51bGw9PT10aGlzLnhocil7cmV0dXJufWlmKHRoaXMuaGFzWERSKCkpe3RoaXMueGhyLm9ubG9hZD10aGlzLnhoci5vbmVycm9yPWVtcHR5fWVsc2V7dGhpcy54aHIub25yZWFkeXN0YXRlY2hhbmdlPWVtcHR5fWlmKGZyb21FcnJvcil7dHJ5e3RoaXMueGhyLmFib3J0KCl9Y2F0Y2goZSl7fX1pZihnbG9iYWwuZG9jdW1lbnQpe2RlbGV0ZSBSZXF1ZXN0LnJlcXVlc3RzW3RoaXMuaW5kZXhdfXRoaXMueGhyPW51bGx9O1JlcXVlc3QucHJvdG90eXBlLm9uTG9hZD1mdW5jdGlvbigpe3ZhciBkYXRhO3RyeXt2YXIgY29udGVudFR5cGU7dHJ5e2NvbnRlbnRUeXBlPXRoaXMueGhyLmdldFJlc3BvbnNlSGVhZGVyKFwiQ29udGVudC1UeXBlXCIpLnNwbGl0KFwiO1wiKVswXX1jYXRjaChlKXt9aWYoY29udGVudFR5cGU9PT1cImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbVwiKXtkYXRhPXRoaXMueGhyLnJlc3BvbnNlfWVsc2V7aWYoIXRoaXMuc3VwcG9ydHNCaW5hcnkpe2RhdGE9dGhpcy54aHIucmVzcG9uc2VUZXh0fWVsc2V7dHJ5e2RhdGE9U3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLG5ldyBVaW50OEFycmF5KHRoaXMueGhyLnJlc3BvbnNlKSl9Y2F0Y2goZSl7dmFyIHVpOEFycj1uZXcgVWludDhBcnJheSh0aGlzLnhoci5yZXNwb25zZSk7dmFyIGRhdGFBcnJheT1bXTtmb3IodmFyIGlkeD0wLGxlbmd0aD11aThBcnIubGVuZ3RoO2lkeDxsZW5ndGg7aWR4Kyspe2RhdGFBcnJheS5wdXNoKHVpOEFycltpZHhdKX1kYXRhPVN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCxkYXRhQXJyYXkpfX19fWNhdGNoKGUpe3RoaXMub25FcnJvcihlKX1pZihudWxsIT1kYXRhKXt0aGlzLm9uRGF0YShkYXRhKX19O1JlcXVlc3QucHJvdG90eXBlLmhhc1hEUj1mdW5jdGlvbigpe3JldHVyblwidW5kZWZpbmVkXCIhPT10eXBlb2YgZ2xvYmFsLlhEb21haW5SZXF1ZXN0JiYhdGhpcy54cyYmdGhpcy5lbmFibGVzWERSfTtSZXF1ZXN0LnByb3RvdHlwZS5hYm9ydD1mdW5jdGlvbigpe3RoaXMuY2xlYW51cCgpfTtpZihnbG9iYWwuZG9jdW1lbnQpe1JlcXVlc3QucmVxdWVzdHNDb3VudD0wO1JlcXVlc3QucmVxdWVzdHM9e307aWYoZ2xvYmFsLmF0dGFjaEV2ZW50KXtnbG9iYWwuYXR0YWNoRXZlbnQoXCJvbnVubG9hZFwiLHVubG9hZEhhbmRsZXIpfWVsc2UgaWYoZ2xvYmFsLmFkZEV2ZW50TGlzdGVuZXIpe2dsb2JhbC5hZGRFdmVudExpc3RlbmVyKFwiYmVmb3JldW5sb2FkXCIsdW5sb2FkSGFuZGxlcixmYWxzZSl9fWZ1bmN0aW9uIHVubG9hZEhhbmRsZXIoKXtmb3IodmFyIGkgaW4gUmVxdWVzdC5yZXF1ZXN0cyl7aWYoUmVxdWVzdC5yZXF1ZXN0cy5oYXNPd25Qcm9wZXJ0eShpKSl7UmVxdWVzdC5yZXF1ZXN0c1tpXS5hYm9ydCgpfX19fSkuY2FsbCh0aGlzLHR5cGVvZiBzZWxmIT09XCJ1bmRlZmluZWRcIj9zZWxmOnR5cGVvZiB3aW5kb3chPT1cInVuZGVmaW5lZFwiP3dpbmRvdzp0eXBlb2YgZ2xvYmFsIT09XCJ1bmRlZmluZWRcIj9nbG9iYWw6e30pfSx7XCIuL3BvbGxpbmdcIjo4LFwiY29tcG9uZW50LWVtaXR0ZXJcIjoxNSxcImNvbXBvbmVudC1pbmhlcml0XCI6MTYsZGVidWc6MTcsXCJ4bWxodHRwcmVxdWVzdC1zc2xcIjoxMH1dLDg6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe3ZhciBUcmFuc3BvcnQ9X2RlcmVxXyhcIi4uL3RyYW5zcG9ydFwiKTt2YXIgcGFyc2Vxcz1fZGVyZXFfKFwicGFyc2Vxc1wiKTt2YXIgcGFyc2VyPV9kZXJlcV8oXCJlbmdpbmUuaW8tcGFyc2VyXCIpO3ZhciBpbmhlcml0PV9kZXJlcV8oXCJjb21wb25lbnQtaW5oZXJpdFwiKTt2YXIgeWVhc3Q9X2RlcmVxXyhcInllYXN0XCIpO3ZhciBkZWJ1Zz1fZGVyZXFfKFwiZGVidWdcIikoXCJlbmdpbmUuaW8tY2xpZW50OnBvbGxpbmdcIik7bW9kdWxlLmV4cG9ydHM9UG9sbGluZzt2YXIgaGFzWEhSMj1mdW5jdGlvbigpe3ZhciBYTUxIdHRwUmVxdWVzdD1fZGVyZXFfKFwieG1saHR0cHJlcXVlc3Qtc3NsXCIpO3ZhciB4aHI9bmV3IFhNTEh0dHBSZXF1ZXN0KHt4ZG9tYWluOmZhbHNlfSk7cmV0dXJuIG51bGwhPXhoci5yZXNwb25zZVR5cGV9KCk7ZnVuY3Rpb24gUG9sbGluZyhvcHRzKXt2YXIgZm9yY2VCYXNlNjQ9b3B0cyYmb3B0cy5mb3JjZUJhc2U2NDtpZighaGFzWEhSMnx8Zm9yY2VCYXNlNjQpe3RoaXMuc3VwcG9ydHNCaW5hcnk9ZmFsc2V9VHJhbnNwb3J0LmNhbGwodGhpcyxvcHRzKX1pbmhlcml0KFBvbGxpbmcsVHJhbnNwb3J0KTtQb2xsaW5nLnByb3RvdHlwZS5uYW1lPVwicG9sbGluZ1wiO1BvbGxpbmcucHJvdG90eXBlLmRvT3Blbj1mdW5jdGlvbigpe3RoaXMucG9sbCgpfTtQb2xsaW5nLnByb3RvdHlwZS5wYXVzZT1mdW5jdGlvbihvblBhdXNlKXt2YXIgcGVuZGluZz0wO3ZhciBzZWxmPXRoaXM7dGhpcy5yZWFkeVN0YXRlPVwicGF1c2luZ1wiO2Z1bmN0aW9uIHBhdXNlKCl7ZGVidWcoXCJwYXVzZWRcIik7c2VsZi5yZWFkeVN0YXRlPVwicGF1c2VkXCI7b25QYXVzZSgpfWlmKHRoaXMucG9sbGluZ3x8IXRoaXMud3JpdGFibGUpe3ZhciB0b3RhbD0wO2lmKHRoaXMucG9sbGluZyl7ZGVidWcoXCJ3ZSBhcmUgY3VycmVudGx5IHBvbGxpbmcgLSB3YWl0aW5nIHRvIHBhdXNlXCIpO3RvdGFsKys7dGhpcy5vbmNlKFwicG9sbENvbXBsZXRlXCIsZnVuY3Rpb24oKXtkZWJ1ZyhcInByZS1wYXVzZSBwb2xsaW5nIGNvbXBsZXRlXCIpOy0tdG90YWx8fHBhdXNlKCl9KX1pZighdGhpcy53cml0YWJsZSl7ZGVidWcoXCJ3ZSBhcmUgY3VycmVudGx5IHdyaXRpbmcgLSB3YWl0aW5nIHRvIHBhdXNlXCIpO3RvdGFsKys7dGhpcy5vbmNlKFwiZHJhaW5cIixmdW5jdGlvbigpe2RlYnVnKFwicHJlLXBhdXNlIHdyaXRpbmcgY29tcGxldGVcIik7LS10b3RhbHx8cGF1c2UoKX0pfX1lbHNle3BhdXNlKCl9fTtQb2xsaW5nLnByb3RvdHlwZS5wb2xsPWZ1bmN0aW9uKCl7ZGVidWcoXCJwb2xsaW5nXCIpO3RoaXMucG9sbGluZz10cnVlO3RoaXMuZG9Qb2xsKCk7dGhpcy5lbWl0KFwicG9sbFwiKX07UG9sbGluZy5wcm90b3R5cGUub25EYXRhPWZ1bmN0aW9uKGRhdGEpe3ZhciBzZWxmPXRoaXM7ZGVidWcoXCJwb2xsaW5nIGdvdCBkYXRhICVzXCIsZGF0YSk7dmFyIGNhbGxiYWNrPWZ1bmN0aW9uKHBhY2tldCxpbmRleCx0b3RhbCl7aWYoXCJvcGVuaW5nXCI9PXNlbGYucmVhZHlTdGF0ZSl7c2VsZi5vbk9wZW4oKX1pZihcImNsb3NlXCI9PXBhY2tldC50eXBlKXtzZWxmLm9uQ2xvc2UoKTtyZXR1cm4gZmFsc2V9c2VsZi5vblBhY2tldChwYWNrZXQpfTtwYXJzZXIuZGVjb2RlUGF5bG9hZChkYXRhLHRoaXMuc29ja2V0LmJpbmFyeVR5cGUsY2FsbGJhY2spO2lmKFwiY2xvc2VkXCIhPXRoaXMucmVhZHlTdGF0ZSl7dGhpcy5wb2xsaW5nPWZhbHNlO3RoaXMuZW1pdChcInBvbGxDb21wbGV0ZVwiKTtpZihcIm9wZW5cIj09dGhpcy5yZWFkeVN0YXRlKXt0aGlzLnBvbGwoKX1lbHNle2RlYnVnKCdpZ25vcmluZyBwb2xsIC0gdHJhbnNwb3J0IHN0YXRlIFwiJXNcIicsdGhpcy5yZWFkeVN0YXRlKX19fTtQb2xsaW5nLnByb3RvdHlwZS5kb0Nsb3NlPWZ1bmN0aW9uKCl7dmFyIHNlbGY9dGhpcztmdW5jdGlvbiBjbG9zZSgpe2RlYnVnKFwid3JpdGluZyBjbG9zZSBwYWNrZXRcIik7c2VsZi53cml0ZShbe3R5cGU6XCJjbG9zZVwifV0pfWlmKFwib3BlblwiPT10aGlzLnJlYWR5U3RhdGUpe2RlYnVnKFwidHJhbnNwb3J0IG9wZW4gLSBjbG9zaW5nXCIpO2Nsb3NlKCl9ZWxzZXtkZWJ1ZyhcInRyYW5zcG9ydCBub3Qgb3BlbiAtIGRlZmVycmluZyBjbG9zZVwiKTt0aGlzLm9uY2UoXCJvcGVuXCIsY2xvc2UpfX07UG9sbGluZy5wcm90b3R5cGUud3JpdGU9ZnVuY3Rpb24ocGFja2V0cyl7dmFyIHNlbGY9dGhpczt0aGlzLndyaXRhYmxlPWZhbHNlO3ZhciBjYWxsYmFja2ZuPWZ1bmN0aW9uKCl7c2VsZi53cml0YWJsZT10cnVlO3NlbGYuZW1pdChcImRyYWluXCIpfTt2YXIgc2VsZj10aGlzO3BhcnNlci5lbmNvZGVQYXlsb2FkKHBhY2tldHMsdGhpcy5zdXBwb3J0c0JpbmFyeSxmdW5jdGlvbihkYXRhKXtzZWxmLmRvV3JpdGUoZGF0YSxjYWxsYmFja2ZuKX0pfTtQb2xsaW5nLnByb3RvdHlwZS51cmk9ZnVuY3Rpb24oKXt2YXIgcXVlcnk9dGhpcy5xdWVyeXx8e307dmFyIHNjaGVtYT10aGlzLnNlY3VyZT9cImh0dHBzXCI6XCJodHRwXCI7dmFyIHBvcnQ9XCJcIjtpZihmYWxzZSE9PXRoaXMudGltZXN0YW1wUmVxdWVzdHMpe3F1ZXJ5W3RoaXMudGltZXN0YW1wUGFyYW1dPXllYXN0KCl9aWYoIXRoaXMuc3VwcG9ydHNCaW5hcnkmJiFxdWVyeS5zaWQpe3F1ZXJ5LmI2ND0xfXF1ZXJ5PXBhcnNlcXMuZW5jb2RlKHF1ZXJ5KTtpZih0aGlzLnBvcnQmJihcImh0dHBzXCI9PXNjaGVtYSYmdGhpcy5wb3J0IT00NDN8fFwiaHR0cFwiPT1zY2hlbWEmJnRoaXMucG9ydCE9ODApKXtwb3J0PVwiOlwiK3RoaXMucG9ydH1pZihxdWVyeS5sZW5ndGgpe3F1ZXJ5PVwiP1wiK3F1ZXJ5fXZhciBpcHY2PXRoaXMuaG9zdG5hbWUuaW5kZXhPZihcIjpcIikhPT0tMTtyZXR1cm4gc2NoZW1hK1wiOi8vXCIrKGlwdjY/XCJbXCIrdGhpcy5ob3N0bmFtZStcIl1cIjp0aGlzLmhvc3RuYW1lKStwb3J0K3RoaXMucGF0aCtxdWVyeX19LHtcIi4uL3RyYW5zcG9ydFwiOjQsXCJjb21wb25lbnQtaW5oZXJpdFwiOjE2LGRlYnVnOjE3LFwiZW5naW5lLmlvLXBhcnNlclwiOjE5LHBhcnNlcXM6MjcsXCJ4bWxodHRwcmVxdWVzdC1zc2xcIjoxMCx5ZWFzdDozMH1dLDk6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeyhmdW5jdGlvbihnbG9iYWwpe3ZhciBUcmFuc3BvcnQ9X2RlcmVxXyhcIi4uL3RyYW5zcG9ydFwiKTt2YXIgcGFyc2VyPV9kZXJlcV8oXCJlbmdpbmUuaW8tcGFyc2VyXCIpO3ZhciBwYXJzZXFzPV9kZXJlcV8oXCJwYXJzZXFzXCIpO3ZhciBpbmhlcml0PV9kZXJlcV8oXCJjb21wb25lbnQtaW5oZXJpdFwiKTt2YXIgeWVhc3Q9X2RlcmVxXyhcInllYXN0XCIpO3ZhciBkZWJ1Zz1fZGVyZXFfKFwiZGVidWdcIikoXCJlbmdpbmUuaW8tY2xpZW50OndlYnNvY2tldFwiKTt2YXIgQnJvd3NlcldlYlNvY2tldD1nbG9iYWwuV2ViU29ja2V0fHxnbG9iYWwuTW96V2ViU29ja2V0O3ZhciBXZWJTb2NrZXQ9QnJvd3NlcldlYlNvY2tldDtpZighV2ViU29ja2V0JiZ0eXBlb2Ygd2luZG93PT09XCJ1bmRlZmluZWRcIil7dHJ5e1dlYlNvY2tldD1fZGVyZXFfKFwid3NcIil9Y2F0Y2goZSl7fX1tb2R1bGUuZXhwb3J0cz1XUztmdW5jdGlvbiBXUyhvcHRzKXt2YXIgZm9yY2VCYXNlNjQ9b3B0cyYmb3B0cy5mb3JjZUJhc2U2NDtpZihmb3JjZUJhc2U2NCl7dGhpcy5zdXBwb3J0c0JpbmFyeT1mYWxzZX10aGlzLnBlck1lc3NhZ2VEZWZsYXRlPW9wdHMucGVyTWVzc2FnZURlZmxhdGU7VHJhbnNwb3J0LmNhbGwodGhpcyxvcHRzKX1pbmhlcml0KFdTLFRyYW5zcG9ydCk7V1MucHJvdG90eXBlLm5hbWU9XCJ3ZWJzb2NrZXRcIjtXUy5wcm90b3R5cGUuc3VwcG9ydHNCaW5hcnk9dHJ1ZTtXUy5wcm90b3R5cGUuZG9PcGVuPWZ1bmN0aW9uKCl7aWYoIXRoaXMuY2hlY2soKSl7cmV0dXJufXZhciBzZWxmPXRoaXM7dmFyIHVyaT10aGlzLnVyaSgpO3ZhciBwcm90b2NvbHM9dm9pZCAwO3ZhciBvcHRzPXthZ2VudDp0aGlzLmFnZW50LHBlck1lc3NhZ2VEZWZsYXRlOnRoaXMucGVyTWVzc2FnZURlZmxhdGV9O29wdHMucGZ4PXRoaXMucGZ4O29wdHMua2V5PXRoaXMua2V5O29wdHMucGFzc3BocmFzZT10aGlzLnBhc3NwaHJhc2U7b3B0cy5jZXJ0PXRoaXMuY2VydDtvcHRzLmNhPXRoaXMuY2E7b3B0cy5jaXBoZXJzPXRoaXMuY2lwaGVycztvcHRzLnJlamVjdFVuYXV0aG9yaXplZD10aGlzLnJlamVjdFVuYXV0aG9yaXplZDtpZih0aGlzLmV4dHJhSGVhZGVycyl7b3B0cy5oZWFkZXJzPXRoaXMuZXh0cmFIZWFkZXJzfXRoaXMud3M9QnJvd3NlcldlYlNvY2tldD9uZXcgV2ViU29ja2V0KHVyaSk6bmV3IFdlYlNvY2tldCh1cmkscHJvdG9jb2xzLG9wdHMpO2lmKHRoaXMud3MuYmluYXJ5VHlwZT09PXVuZGVmaW5lZCl7dGhpcy5zdXBwb3J0c0JpbmFyeT1mYWxzZX1pZih0aGlzLndzLnN1cHBvcnRzJiZ0aGlzLndzLnN1cHBvcnRzLmJpbmFyeSl7dGhpcy5zdXBwb3J0c0JpbmFyeT10cnVlO3RoaXMud3MuYmluYXJ5VHlwZT1cImJ1ZmZlclwifWVsc2V7dGhpcy53cy5iaW5hcnlUeXBlPVwiYXJyYXlidWZmZXJcIn10aGlzLmFkZEV2ZW50TGlzdGVuZXJzKCl9O1dTLnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVycz1mdW5jdGlvbigpe3ZhciBzZWxmPXRoaXM7dGhpcy53cy5vbm9wZW49ZnVuY3Rpb24oKXtzZWxmLm9uT3BlbigpfTt0aGlzLndzLm9uY2xvc2U9ZnVuY3Rpb24oKXtzZWxmLm9uQ2xvc2UoKX07dGhpcy53cy5vbm1lc3NhZ2U9ZnVuY3Rpb24oZXYpe3NlbGYub25EYXRhKGV2LmRhdGEpfTt0aGlzLndzLm9uZXJyb3I9ZnVuY3Rpb24oZSl7c2VsZi5vbkVycm9yKFwid2Vic29ja2V0IGVycm9yXCIsZSl9fTtpZihcInVuZGVmaW5lZFwiIT10eXBlb2YgbmF2aWdhdG9yJiYvaVBhZHxpUGhvbmV8aVBvZC9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkpe1dTLnByb3RvdHlwZS5vbkRhdGE9ZnVuY3Rpb24oZGF0YSl7dmFyIHNlbGY9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7VHJhbnNwb3J0LnByb3RvdHlwZS5vbkRhdGEuY2FsbChzZWxmLGRhdGEpfSwwKX19V1MucHJvdG90eXBlLndyaXRlPWZ1bmN0aW9uKHBhY2tldHMpe3ZhciBzZWxmPXRoaXM7dGhpcy53cml0YWJsZT1mYWxzZTt2YXIgdG90YWw9cGFja2V0cy5sZW5ndGg7Zm9yKHZhciBpPTAsbD10b3RhbDtpPGw7aSsrKXsoZnVuY3Rpb24ocGFja2V0KXtwYXJzZXIuZW5jb2RlUGFja2V0KHBhY2tldCxzZWxmLnN1cHBvcnRzQmluYXJ5LGZ1bmN0aW9uKGRhdGEpe2lmKCFCcm93c2VyV2ViU29ja2V0KXt2YXIgb3B0cz17fTtpZihwYWNrZXQub3B0aW9ucyl7b3B0cy5jb21wcmVzcz1wYWNrZXQub3B0aW9ucy5jb21wcmVzc31pZihzZWxmLnBlck1lc3NhZ2VEZWZsYXRlKXt2YXIgbGVuPVwic3RyaW5nXCI9PXR5cGVvZiBkYXRhP2dsb2JhbC5CdWZmZXIuYnl0ZUxlbmd0aChkYXRhKTpkYXRhLmxlbmd0aDtpZihsZW48c2VsZi5wZXJNZXNzYWdlRGVmbGF0ZS50aHJlc2hvbGQpe29wdHMuY29tcHJlc3M9ZmFsc2V9fX10cnl7aWYoQnJvd3NlcldlYlNvY2tldCl7c2VsZi53cy5zZW5kKGRhdGEpfWVsc2V7c2VsZi53cy5zZW5kKGRhdGEsb3B0cyl9fWNhdGNoKGUpe2RlYnVnKFwid2Vic29ja2V0IGNsb3NlZCBiZWZvcmUgb25jbG9zZSBldmVudFwiKX0tLXRvdGFsfHxkb25lKCl9KX0pKHBhY2tldHNbaV0pfWZ1bmN0aW9uIGRvbmUoKXtzZWxmLmVtaXQoXCJmbHVzaFwiKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7c2VsZi53cml0YWJsZT10cnVlO3NlbGYuZW1pdChcImRyYWluXCIpfSwwKX19O1dTLnByb3RvdHlwZS5vbkNsb3NlPWZ1bmN0aW9uKCl7VHJhbnNwb3J0LnByb3RvdHlwZS5vbkNsb3NlLmNhbGwodGhpcyl9O1dTLnByb3RvdHlwZS5kb0Nsb3NlPWZ1bmN0aW9uKCl7aWYodHlwZW9mIHRoaXMud3MhPT1cInVuZGVmaW5lZFwiKXt0aGlzLndzLmNsb3NlKCl9fTtXUy5wcm90b3R5cGUudXJpPWZ1bmN0aW9uKCl7dmFyIHF1ZXJ5PXRoaXMucXVlcnl8fHt9O3ZhciBzY2hlbWE9dGhpcy5zZWN1cmU/XCJ3c3NcIjpcIndzXCI7dmFyIHBvcnQ9XCJcIjtpZih0aGlzLnBvcnQmJihcIndzc1wiPT1zY2hlbWEmJnRoaXMucG9ydCE9NDQzfHxcIndzXCI9PXNjaGVtYSYmdGhpcy5wb3J0IT04MCkpe3BvcnQ9XCI6XCIrdGhpcy5wb3J0fWlmKHRoaXMudGltZXN0YW1wUmVxdWVzdHMpe3F1ZXJ5W3RoaXMudGltZXN0YW1wUGFyYW1dPXllYXN0KCl9aWYoIXRoaXMuc3VwcG9ydHNCaW5hcnkpe3F1ZXJ5LmI2ND0xfXF1ZXJ5PXBhcnNlcXMuZW5jb2RlKHF1ZXJ5KTtpZihxdWVyeS5sZW5ndGgpe3F1ZXJ5PVwiP1wiK3F1ZXJ5fXZhciBpcHY2PXRoaXMuaG9zdG5hbWUuaW5kZXhPZihcIjpcIikhPT0tMTtyZXR1cm4gc2NoZW1hK1wiOi8vXCIrKGlwdjY/XCJbXCIrdGhpcy5ob3N0bmFtZStcIl1cIjp0aGlzLmhvc3RuYW1lKStwb3J0K3RoaXMucGF0aCtxdWVyeX07V1MucHJvdG90eXBlLmNoZWNrPWZ1bmN0aW9uKCl7cmV0dXJuISFXZWJTb2NrZXQmJiEoXCJfX2luaXRpYWxpemVcImluIFdlYlNvY2tldCYmdGhpcy5uYW1lPT09V1MucHJvdG90eXBlLm5hbWUpfX0pLmNhbGwodGhpcyx0eXBlb2Ygc2VsZiE9PVwidW5kZWZpbmVkXCI/c2VsZjp0eXBlb2Ygd2luZG93IT09XCJ1bmRlZmluZWRcIj93aW5kb3c6dHlwZW9mIGdsb2JhbCE9PVwidW5kZWZpbmVkXCI/Z2xvYmFsOnt9KX0se1wiLi4vdHJhbnNwb3J0XCI6NCxcImNvbXBvbmVudC1pbmhlcml0XCI6MTYsZGVidWc6MTcsXCJlbmdpbmUuaW8tcGFyc2VyXCI6MTkscGFyc2VxczoyNyx3czp1bmRlZmluZWQseWVhc3Q6MzB9XSwxMDpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7dmFyIGhhc0NPUlM9X2RlcmVxXyhcImhhcy1jb3JzXCIpO21vZHVsZS5leHBvcnRzPWZ1bmN0aW9uKG9wdHMpe3ZhciB4ZG9tYWluPW9wdHMueGRvbWFpbjt2YXIgeHNjaGVtZT1vcHRzLnhzY2hlbWU7dmFyIGVuYWJsZXNYRFI9b3B0cy5lbmFibGVzWERSO3RyeXtpZihcInVuZGVmaW5lZFwiIT10eXBlb2YgWE1MSHR0cFJlcXVlc3QmJigheGRvbWFpbnx8aGFzQ09SUykpe3JldHVybiBuZXcgWE1MSHR0cFJlcXVlc3R9fWNhdGNoKGUpe310cnl7aWYoXCJ1bmRlZmluZWRcIiE9dHlwZW9mIFhEb21haW5SZXF1ZXN0JiYheHNjaGVtZSYmZW5hYmxlc1hEUil7cmV0dXJuIG5ldyBYRG9tYWluUmVxdWVzdH19Y2F0Y2goZSl7fWlmKCF4ZG9tYWluKXt0cnl7cmV0dXJuIG5ldyBBY3RpdmVYT2JqZWN0KFwiTWljcm9zb2Z0LlhNTEhUVFBcIil9Y2F0Y2goZSl7fX19fSx7XCJoYXMtY29yc1wiOjIyfV0sMTE6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe21vZHVsZS5leHBvcnRzPWFmdGVyO2Z1bmN0aW9uIGFmdGVyKGNvdW50LGNhbGxiYWNrLGVycl9jYil7dmFyIGJhaWw9ZmFsc2U7ZXJyX2NiPWVycl9jYnx8bm9vcDtwcm94eS5jb3VudD1jb3VudDtyZXR1cm4gY291bnQ9PT0wP2NhbGxiYWNrKCk6cHJveHk7ZnVuY3Rpb24gcHJveHkoZXJyLHJlc3VsdCl7aWYocHJveHkuY291bnQ8PTApe3Rocm93IG5ldyBFcnJvcihcImFmdGVyIGNhbGxlZCB0b28gbWFueSB0aW1lc1wiKX0tLXByb3h5LmNvdW50O2lmKGVycil7YmFpbD10cnVlO2NhbGxiYWNrKGVycik7Y2FsbGJhY2s9ZXJyX2NifWVsc2UgaWYocHJveHkuY291bnQ9PT0wJiYhYmFpbCl7Y2FsbGJhY2sobnVsbCxyZXN1bHQpfX19ZnVuY3Rpb24gbm9vcCgpe319LHt9XSwxMjpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7bW9kdWxlLmV4cG9ydHM9ZnVuY3Rpb24oYXJyYXlidWZmZXIsc3RhcnQsZW5kKXt2YXIgYnl0ZXM9YXJyYXlidWZmZXIuYnl0ZUxlbmd0aDtzdGFydD1zdGFydHx8MDtlbmQ9ZW5kfHxieXRlcztpZihhcnJheWJ1ZmZlci5zbGljZSl7cmV0dXJuIGFycmF5YnVmZmVyLnNsaWNlKHN0YXJ0LGVuZCl9aWYoc3RhcnQ8MCl7c3RhcnQrPWJ5dGVzfWlmKGVuZDwwKXtlbmQrPWJ5dGVzfWlmKGVuZD5ieXRlcyl7ZW5kPWJ5dGVzfWlmKHN0YXJ0Pj1ieXRlc3x8c3RhcnQ+PWVuZHx8Ynl0ZXM9PT0wKXtyZXR1cm4gbmV3IEFycmF5QnVmZmVyKDApfXZhciBhYnY9bmV3IFVpbnQ4QXJyYXkoYXJyYXlidWZmZXIpO3ZhciByZXN1bHQ9bmV3IFVpbnQ4QXJyYXkoZW5kLXN0YXJ0KTtmb3IodmFyIGk9c3RhcnQsaWk9MDtpPGVuZDtpKyssaWkrKyl7cmVzdWx0W2lpXT1hYnZbaV19cmV0dXJuIHJlc3VsdC5idWZmZXJ9fSx7fV0sMTM6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeyhmdW5jdGlvbihjaGFycyl7XCJ1c2Ugc3RyaWN0XCI7ZXhwb3J0cy5lbmNvZGU9ZnVuY3Rpb24oYXJyYXlidWZmZXIpe3ZhciBieXRlcz1uZXcgVWludDhBcnJheShhcnJheWJ1ZmZlciksaSxsZW49Ynl0ZXMubGVuZ3RoLGJhc2U2ND1cIlwiO2ZvcihpPTA7aTxsZW47aSs9Myl7YmFzZTY0Kz1jaGFyc1tieXRlc1tpXT4+Ml07XG5iYXNlNjQrPWNoYXJzWyhieXRlc1tpXSYzKTw8NHxieXRlc1tpKzFdPj40XTtiYXNlNjQrPWNoYXJzWyhieXRlc1tpKzFdJjE1KTw8MnxieXRlc1tpKzJdPj42XTtiYXNlNjQrPWNoYXJzW2J5dGVzW2krMl0mNjNdfWlmKGxlbiUzPT09Mil7YmFzZTY0PWJhc2U2NC5zdWJzdHJpbmcoMCxiYXNlNjQubGVuZ3RoLTEpK1wiPVwifWVsc2UgaWYobGVuJTM9PT0xKXtiYXNlNjQ9YmFzZTY0LnN1YnN0cmluZygwLGJhc2U2NC5sZW5ndGgtMikrXCI9PVwifXJldHVybiBiYXNlNjR9O2V4cG9ydHMuZGVjb2RlPWZ1bmN0aW9uKGJhc2U2NCl7dmFyIGJ1ZmZlckxlbmd0aD1iYXNlNjQubGVuZ3RoKi43NSxsZW49YmFzZTY0Lmxlbmd0aCxpLHA9MCxlbmNvZGVkMSxlbmNvZGVkMixlbmNvZGVkMyxlbmNvZGVkNDtpZihiYXNlNjRbYmFzZTY0Lmxlbmd0aC0xXT09PVwiPVwiKXtidWZmZXJMZW5ndGgtLTtpZihiYXNlNjRbYmFzZTY0Lmxlbmd0aC0yXT09PVwiPVwiKXtidWZmZXJMZW5ndGgtLX19dmFyIGFycmF5YnVmZmVyPW5ldyBBcnJheUJ1ZmZlcihidWZmZXJMZW5ndGgpLGJ5dGVzPW5ldyBVaW50OEFycmF5KGFycmF5YnVmZmVyKTtmb3IoaT0wO2k8bGVuO2krPTQpe2VuY29kZWQxPWNoYXJzLmluZGV4T2YoYmFzZTY0W2ldKTtlbmNvZGVkMj1jaGFycy5pbmRleE9mKGJhc2U2NFtpKzFdKTtlbmNvZGVkMz1jaGFycy5pbmRleE9mKGJhc2U2NFtpKzJdKTtlbmNvZGVkND1jaGFycy5pbmRleE9mKGJhc2U2NFtpKzNdKTtieXRlc1twKytdPWVuY29kZWQxPDwyfGVuY29kZWQyPj40O2J5dGVzW3ArK109KGVuY29kZWQyJjE1KTw8NHxlbmNvZGVkMz4+MjtieXRlc1twKytdPShlbmNvZGVkMyYzKTw8NnxlbmNvZGVkNCY2M31yZXR1cm4gYXJyYXlidWZmZXJ9fSkoXCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvXCIpfSx7fV0sMTQ6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeyhmdW5jdGlvbihnbG9iYWwpe3ZhciBCbG9iQnVpbGRlcj1nbG9iYWwuQmxvYkJ1aWxkZXJ8fGdsb2JhbC5XZWJLaXRCbG9iQnVpbGRlcnx8Z2xvYmFsLk1TQmxvYkJ1aWxkZXJ8fGdsb2JhbC5Nb3pCbG9iQnVpbGRlcjt2YXIgYmxvYlN1cHBvcnRlZD1mdW5jdGlvbigpe3RyeXt2YXIgYT1uZXcgQmxvYihbXCJoaVwiXSk7cmV0dXJuIGEuc2l6ZT09PTJ9Y2F0Y2goZSl7cmV0dXJuIGZhbHNlfX0oKTt2YXIgYmxvYlN1cHBvcnRzQXJyYXlCdWZmZXJWaWV3PWJsb2JTdXBwb3J0ZWQmJmZ1bmN0aW9uKCl7dHJ5e3ZhciBiPW5ldyBCbG9iKFtuZXcgVWludDhBcnJheShbMSwyXSldKTtyZXR1cm4gYi5zaXplPT09Mn1jYXRjaChlKXtyZXR1cm4gZmFsc2V9fSgpO3ZhciBibG9iQnVpbGRlclN1cHBvcnRlZD1CbG9iQnVpbGRlciYmQmxvYkJ1aWxkZXIucHJvdG90eXBlLmFwcGVuZCYmQmxvYkJ1aWxkZXIucHJvdG90eXBlLmdldEJsb2I7ZnVuY3Rpb24gbWFwQXJyYXlCdWZmZXJWaWV3cyhhcnkpe2Zvcih2YXIgaT0wO2k8YXJ5Lmxlbmd0aDtpKyspe3ZhciBjaHVuaz1hcnlbaV07aWYoY2h1bmsuYnVmZmVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpe3ZhciBidWY9Y2h1bmsuYnVmZmVyO2lmKGNodW5rLmJ5dGVMZW5ndGghPT1idWYuYnl0ZUxlbmd0aCl7dmFyIGNvcHk9bmV3IFVpbnQ4QXJyYXkoY2h1bmsuYnl0ZUxlbmd0aCk7Y29weS5zZXQobmV3IFVpbnQ4QXJyYXkoYnVmLGNodW5rLmJ5dGVPZmZzZXQsY2h1bmsuYnl0ZUxlbmd0aCkpO2J1Zj1jb3B5LmJ1ZmZlcn1hcnlbaV09YnVmfX19ZnVuY3Rpb24gQmxvYkJ1aWxkZXJDb25zdHJ1Y3Rvcihhcnksb3B0aW9ucyl7b3B0aW9ucz1vcHRpb25zfHx7fTt2YXIgYmI9bmV3IEJsb2JCdWlsZGVyO21hcEFycmF5QnVmZmVyVmlld3MoYXJ5KTtmb3IodmFyIGk9MDtpPGFyeS5sZW5ndGg7aSsrKXtiYi5hcHBlbmQoYXJ5W2ldKX1yZXR1cm4gb3B0aW9ucy50eXBlP2JiLmdldEJsb2Iob3B0aW9ucy50eXBlKTpiYi5nZXRCbG9iKCl9ZnVuY3Rpb24gQmxvYkNvbnN0cnVjdG9yKGFyeSxvcHRpb25zKXttYXBBcnJheUJ1ZmZlclZpZXdzKGFyeSk7cmV0dXJuIG5ldyBCbG9iKGFyeSxvcHRpb25zfHx7fSl9bW9kdWxlLmV4cG9ydHM9ZnVuY3Rpb24oKXtpZihibG9iU3VwcG9ydGVkKXtyZXR1cm4gYmxvYlN1cHBvcnRzQXJyYXlCdWZmZXJWaWV3P2dsb2JhbC5CbG9iOkJsb2JDb25zdHJ1Y3Rvcn1lbHNlIGlmKGJsb2JCdWlsZGVyU3VwcG9ydGVkKXtyZXR1cm4gQmxvYkJ1aWxkZXJDb25zdHJ1Y3Rvcn1lbHNle3JldHVybiB1bmRlZmluZWR9fSgpfSkuY2FsbCh0aGlzLHR5cGVvZiBzZWxmIT09XCJ1bmRlZmluZWRcIj9zZWxmOnR5cGVvZiB3aW5kb3chPT1cInVuZGVmaW5lZFwiP3dpbmRvdzp0eXBlb2YgZ2xvYmFsIT09XCJ1bmRlZmluZWRcIj9nbG9iYWw6e30pfSx7fV0sMTU6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe21vZHVsZS5leHBvcnRzPUVtaXR0ZXI7ZnVuY3Rpb24gRW1pdHRlcihvYmope2lmKG9iailyZXR1cm4gbWl4aW4ob2JqKX1mdW5jdGlvbiBtaXhpbihvYmope2Zvcih2YXIga2V5IGluIEVtaXR0ZXIucHJvdG90eXBlKXtvYmpba2V5XT1FbWl0dGVyLnByb3RvdHlwZVtrZXldfXJldHVybiBvYmp9RW1pdHRlci5wcm90b3R5cGUub249RW1pdHRlci5wcm90b3R5cGUuYWRkRXZlbnRMaXN0ZW5lcj1mdW5jdGlvbihldmVudCxmbil7dGhpcy5fY2FsbGJhY2tzPXRoaXMuX2NhbGxiYWNrc3x8e307KHRoaXMuX2NhbGxiYWNrc1tldmVudF09dGhpcy5fY2FsbGJhY2tzW2V2ZW50XXx8W10pLnB1c2goZm4pO3JldHVybiB0aGlzfTtFbWl0dGVyLnByb3RvdHlwZS5vbmNlPWZ1bmN0aW9uKGV2ZW50LGZuKXt2YXIgc2VsZj10aGlzO3RoaXMuX2NhbGxiYWNrcz10aGlzLl9jYWxsYmFja3N8fHt9O2Z1bmN0aW9uIG9uKCl7c2VsZi5vZmYoZXZlbnQsb24pO2ZuLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1vbi5mbj1mbjt0aGlzLm9uKGV2ZW50LG9uKTtyZXR1cm4gdGhpc307RW1pdHRlci5wcm90b3R5cGUub2ZmPUVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyPUVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUFsbExpc3RlbmVycz1FbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVFdmVudExpc3RlbmVyPWZ1bmN0aW9uKGV2ZW50LGZuKXt0aGlzLl9jYWxsYmFja3M9dGhpcy5fY2FsbGJhY2tzfHx7fTtpZigwPT1hcmd1bWVudHMubGVuZ3RoKXt0aGlzLl9jYWxsYmFja3M9e307cmV0dXJuIHRoaXN9dmFyIGNhbGxiYWNrcz10aGlzLl9jYWxsYmFja3NbZXZlbnRdO2lmKCFjYWxsYmFja3MpcmV0dXJuIHRoaXM7aWYoMT09YXJndW1lbnRzLmxlbmd0aCl7ZGVsZXRlIHRoaXMuX2NhbGxiYWNrc1tldmVudF07cmV0dXJuIHRoaXN9dmFyIGNiO2Zvcih2YXIgaT0wO2k8Y2FsbGJhY2tzLmxlbmd0aDtpKyspe2NiPWNhbGxiYWNrc1tpXTtpZihjYj09PWZufHxjYi5mbj09PWZuKXtjYWxsYmFja3Muc3BsaWNlKGksMSk7YnJlYWt9fXJldHVybiB0aGlzfTtFbWl0dGVyLnByb3RvdHlwZS5lbWl0PWZ1bmN0aW9uKGV2ZW50KXt0aGlzLl9jYWxsYmFja3M9dGhpcy5fY2FsbGJhY2tzfHx7fTt2YXIgYXJncz1bXS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKSxjYWxsYmFja3M9dGhpcy5fY2FsbGJhY2tzW2V2ZW50XTtpZihjYWxsYmFja3Mpe2NhbGxiYWNrcz1jYWxsYmFja3Muc2xpY2UoMCk7Zm9yKHZhciBpPTAsbGVuPWNhbGxiYWNrcy5sZW5ndGg7aTxsZW47KytpKXtjYWxsYmFja3NbaV0uYXBwbHkodGhpcyxhcmdzKX19cmV0dXJuIHRoaXN9O0VtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVycz1mdW5jdGlvbihldmVudCl7dGhpcy5fY2FsbGJhY2tzPXRoaXMuX2NhbGxiYWNrc3x8e307cmV0dXJuIHRoaXMuX2NhbGxiYWNrc1tldmVudF18fFtdfTtFbWl0dGVyLnByb3RvdHlwZS5oYXNMaXN0ZW5lcnM9ZnVuY3Rpb24oZXZlbnQpe3JldHVybiEhdGhpcy5saXN0ZW5lcnMoZXZlbnQpLmxlbmd0aH19LHt9XSwxNjpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7bW9kdWxlLmV4cG9ydHM9ZnVuY3Rpb24oYSxiKXt2YXIgZm49ZnVuY3Rpb24oKXt9O2ZuLnByb3RvdHlwZT1iLnByb3RvdHlwZTthLnByb3RvdHlwZT1uZXcgZm47YS5wcm90b3R5cGUuY29uc3RydWN0b3I9YX19LHt9XSwxNzpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7ZXhwb3J0cz1tb2R1bGUuZXhwb3J0cz1fZGVyZXFfKFwiLi9kZWJ1Z1wiKTtleHBvcnRzLmxvZz1sb2c7ZXhwb3J0cy5mb3JtYXRBcmdzPWZvcm1hdEFyZ3M7ZXhwb3J0cy5zYXZlPXNhdmU7ZXhwb3J0cy5sb2FkPWxvYWQ7ZXhwb3J0cy51c2VDb2xvcnM9dXNlQ29sb3JzO2V4cG9ydHMuc3RvcmFnZT1cInVuZGVmaW5lZFwiIT10eXBlb2YgY2hyb21lJiZcInVuZGVmaW5lZFwiIT10eXBlb2YgY2hyb21lLnN0b3JhZ2U/Y2hyb21lLnN0b3JhZ2UubG9jYWw6bG9jYWxzdG9yYWdlKCk7ZXhwb3J0cy5jb2xvcnM9W1wibGlnaHRzZWFncmVlblwiLFwiZm9yZXN0Z3JlZW5cIixcImdvbGRlbnJvZFwiLFwiZG9kZ2VyYmx1ZVwiLFwiZGFya29yY2hpZFwiLFwiY3JpbXNvblwiXTtmdW5jdGlvbiB1c2VDb2xvcnMoKXtyZXR1cm5cIldlYmtpdEFwcGVhcmFuY2VcImluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZXx8d2luZG93LmNvbnNvbGUmJihjb25zb2xlLmZpcmVidWd8fGNvbnNvbGUuZXhjZXB0aW9uJiZjb25zb2xlLnRhYmxlKXx8bmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLm1hdGNoKC9maXJlZm94XFwvKFxcZCspLykmJnBhcnNlSW50KFJlZ0V4cC4kMSwxMCk+PTMxfWV4cG9ydHMuZm9ybWF0dGVycy5qPWZ1bmN0aW9uKHYpe3JldHVybiBKU09OLnN0cmluZ2lmeSh2KX07ZnVuY3Rpb24gZm9ybWF0QXJncygpe3ZhciBhcmdzPWFyZ3VtZW50czt2YXIgdXNlQ29sb3JzPXRoaXMudXNlQ29sb3JzO2FyZ3NbMF09KHVzZUNvbG9ycz9cIiVjXCI6XCJcIikrdGhpcy5uYW1lc3BhY2UrKHVzZUNvbG9ycz9cIiAlY1wiOlwiIFwiKSthcmdzWzBdKyh1c2VDb2xvcnM/XCIlYyBcIjpcIiBcIikrXCIrXCIrZXhwb3J0cy5odW1hbml6ZSh0aGlzLmRpZmYpO2lmKCF1c2VDb2xvcnMpcmV0dXJuIGFyZ3M7dmFyIGM9XCJjb2xvcjogXCIrdGhpcy5jb2xvcjthcmdzPVthcmdzWzBdLGMsXCJjb2xvcjogaW5oZXJpdFwiXS5jb25jYXQoQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJncywxKSk7dmFyIGluZGV4PTA7dmFyIGxhc3RDPTA7YXJnc1swXS5yZXBsYWNlKC8lW2EteiVdL2csZnVuY3Rpb24obWF0Y2gpe2lmKFwiJSVcIj09PW1hdGNoKXJldHVybjtpbmRleCsrO2lmKFwiJWNcIj09PW1hdGNoKXtsYXN0Qz1pbmRleH19KTthcmdzLnNwbGljZShsYXN0QywwLGMpO3JldHVybiBhcmdzfWZ1bmN0aW9uIGxvZygpe3JldHVyblwib2JqZWN0XCI9PT10eXBlb2YgY29uc29sZSYmY29uc29sZS5sb2cmJkZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseS5jYWxsKGNvbnNvbGUubG9nLGNvbnNvbGUsYXJndW1lbnRzKX1mdW5jdGlvbiBzYXZlKG5hbWVzcGFjZXMpe3RyeXtpZihudWxsPT1uYW1lc3BhY2VzKXtleHBvcnRzLnN0b3JhZ2UucmVtb3ZlSXRlbShcImRlYnVnXCIpfWVsc2V7ZXhwb3J0cy5zdG9yYWdlLmRlYnVnPW5hbWVzcGFjZXN9fWNhdGNoKGUpe319ZnVuY3Rpb24gbG9hZCgpe3ZhciByO3RyeXtyPWV4cG9ydHMuc3RvcmFnZS5kZWJ1Z31jYXRjaChlKXt9cmV0dXJuIHJ9ZXhwb3J0cy5lbmFibGUobG9hZCgpKTtmdW5jdGlvbiBsb2NhbHN0b3JhZ2UoKXt0cnl7cmV0dXJuIHdpbmRvdy5sb2NhbFN0b3JhZ2V9Y2F0Y2goZSl7fX19LHtcIi4vZGVidWdcIjoxOH1dLDE4OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtleHBvcnRzPW1vZHVsZS5leHBvcnRzPWRlYnVnO2V4cG9ydHMuY29lcmNlPWNvZXJjZTtleHBvcnRzLmRpc2FibGU9ZGlzYWJsZTtleHBvcnRzLmVuYWJsZT1lbmFibGU7ZXhwb3J0cy5lbmFibGVkPWVuYWJsZWQ7ZXhwb3J0cy5odW1hbml6ZT1fZGVyZXFfKFwibXNcIik7ZXhwb3J0cy5uYW1lcz1bXTtleHBvcnRzLnNraXBzPVtdO2V4cG9ydHMuZm9ybWF0dGVycz17fTt2YXIgcHJldkNvbG9yPTA7dmFyIHByZXZUaW1lO2Z1bmN0aW9uIHNlbGVjdENvbG9yKCl7cmV0dXJuIGV4cG9ydHMuY29sb3JzW3ByZXZDb2xvcisrJWV4cG9ydHMuY29sb3JzLmxlbmd0aF19ZnVuY3Rpb24gZGVidWcobmFtZXNwYWNlKXtmdW5jdGlvbiBkaXNhYmxlZCgpe31kaXNhYmxlZC5lbmFibGVkPWZhbHNlO2Z1bmN0aW9uIGVuYWJsZWQoKXt2YXIgc2VsZj1lbmFibGVkO3ZhciBjdXJyPStuZXcgRGF0ZTt2YXIgbXM9Y3Vyci0ocHJldlRpbWV8fGN1cnIpO3NlbGYuZGlmZj1tcztzZWxmLnByZXY9cHJldlRpbWU7c2VsZi5jdXJyPWN1cnI7cHJldlRpbWU9Y3VycjtpZihudWxsPT1zZWxmLnVzZUNvbG9ycylzZWxmLnVzZUNvbG9ycz1leHBvcnRzLnVzZUNvbG9ycygpO2lmKG51bGw9PXNlbGYuY29sb3ImJnNlbGYudXNlQ29sb3JzKXNlbGYuY29sb3I9c2VsZWN0Q29sb3IoKTt2YXIgYXJncz1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO2FyZ3NbMF09ZXhwb3J0cy5jb2VyY2UoYXJnc1swXSk7aWYoXCJzdHJpbmdcIiE9PXR5cGVvZiBhcmdzWzBdKXthcmdzPVtcIiVvXCJdLmNvbmNhdChhcmdzKX12YXIgaW5kZXg9MDthcmdzWzBdPWFyZ3NbMF0ucmVwbGFjZSgvJShbYS16JV0pL2csZnVuY3Rpb24obWF0Y2gsZm9ybWF0KXtpZihtYXRjaD09PVwiJSVcIilyZXR1cm4gbWF0Y2g7aW5kZXgrKzt2YXIgZm9ybWF0dGVyPWV4cG9ydHMuZm9ybWF0dGVyc1tmb3JtYXRdO2lmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBmb3JtYXR0ZXIpe3ZhciB2YWw9YXJnc1tpbmRleF07bWF0Y2g9Zm9ybWF0dGVyLmNhbGwoc2VsZix2YWwpO2FyZ3Muc3BsaWNlKGluZGV4LDEpO2luZGV4LS19cmV0dXJuIG1hdGNofSk7aWYoXCJmdW5jdGlvblwiPT09dHlwZW9mIGV4cG9ydHMuZm9ybWF0QXJncyl7YXJncz1leHBvcnRzLmZvcm1hdEFyZ3MuYXBwbHkoc2VsZixhcmdzKX12YXIgbG9nRm49ZW5hYmxlZC5sb2d8fGV4cG9ydHMubG9nfHxjb25zb2xlLmxvZy5iaW5kKGNvbnNvbGUpO2xvZ0ZuLmFwcGx5KHNlbGYsYXJncyl9ZW5hYmxlZC5lbmFibGVkPXRydWU7dmFyIGZuPWV4cG9ydHMuZW5hYmxlZChuYW1lc3BhY2UpP2VuYWJsZWQ6ZGlzYWJsZWQ7Zm4ubmFtZXNwYWNlPW5hbWVzcGFjZTtyZXR1cm4gZm59ZnVuY3Rpb24gZW5hYmxlKG5hbWVzcGFjZXMpe2V4cG9ydHMuc2F2ZShuYW1lc3BhY2VzKTt2YXIgc3BsaXQ9KG5hbWVzcGFjZXN8fFwiXCIpLnNwbGl0KC9bXFxzLF0rLyk7dmFyIGxlbj1zcGxpdC5sZW5ndGg7Zm9yKHZhciBpPTA7aTxsZW47aSsrKXtpZighc3BsaXRbaV0pY29udGludWU7bmFtZXNwYWNlcz1zcGxpdFtpXS5yZXBsYWNlKC9cXCovZyxcIi4qP1wiKTtpZihuYW1lc3BhY2VzWzBdPT09XCItXCIpe2V4cG9ydHMuc2tpcHMucHVzaChuZXcgUmVnRXhwKFwiXlwiK25hbWVzcGFjZXMuc3Vic3RyKDEpK1wiJFwiKSl9ZWxzZXtleHBvcnRzLm5hbWVzLnB1c2gobmV3IFJlZ0V4cChcIl5cIituYW1lc3BhY2VzK1wiJFwiKSl9fX1mdW5jdGlvbiBkaXNhYmxlKCl7ZXhwb3J0cy5lbmFibGUoXCJcIil9ZnVuY3Rpb24gZW5hYmxlZChuYW1lKXt2YXIgaSxsZW47Zm9yKGk9MCxsZW49ZXhwb3J0cy5za2lwcy5sZW5ndGg7aTxsZW47aSsrKXtpZihleHBvcnRzLnNraXBzW2ldLnRlc3QobmFtZSkpe3JldHVybiBmYWxzZX19Zm9yKGk9MCxsZW49ZXhwb3J0cy5uYW1lcy5sZW5ndGg7aTxsZW47aSsrKXtpZihleHBvcnRzLm5hbWVzW2ldLnRlc3QobmFtZSkpe3JldHVybiB0cnVlfX1yZXR1cm4gZmFsc2V9ZnVuY3Rpb24gY29lcmNlKHZhbCl7aWYodmFsIGluc3RhbmNlb2YgRXJyb3IpcmV0dXJuIHZhbC5zdGFja3x8dmFsLm1lc3NhZ2U7cmV0dXJuIHZhbH19LHttczoyNX1dLDE5OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsoZnVuY3Rpb24oZ2xvYmFsKXt2YXIga2V5cz1fZGVyZXFfKFwiLi9rZXlzXCIpO3ZhciBoYXNCaW5hcnk9X2RlcmVxXyhcImhhcy1iaW5hcnlcIik7dmFyIHNsaWNlQnVmZmVyPV9kZXJlcV8oXCJhcnJheWJ1ZmZlci5zbGljZVwiKTt2YXIgYmFzZTY0ZW5jb2Rlcj1fZGVyZXFfKFwiYmFzZTY0LWFycmF5YnVmZmVyXCIpO3ZhciBhZnRlcj1fZGVyZXFfKFwiYWZ0ZXJcIik7dmFyIHV0Zjg9X2RlcmVxXyhcInV0ZjhcIik7dmFyIGlzQW5kcm9pZD1uYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpO3ZhciBpc1BoYW50b21KUz0vUGhhbnRvbUpTL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTt2YXIgZG9udFNlbmRCbG9icz1pc0FuZHJvaWR8fGlzUGhhbnRvbUpTO2V4cG9ydHMucHJvdG9jb2w9Mzt2YXIgcGFja2V0cz1leHBvcnRzLnBhY2tldHM9e29wZW46MCxjbG9zZToxLHBpbmc6Mixwb25nOjMsbWVzc2FnZTo0LHVwZ3JhZGU6NSxub29wOjZ9O3ZhciBwYWNrZXRzbGlzdD1rZXlzKHBhY2tldHMpO3ZhciBlcnI9e3R5cGU6XCJlcnJvclwiLGRhdGE6XCJwYXJzZXIgZXJyb3JcIn07dmFyIEJsb2I9X2RlcmVxXyhcImJsb2JcIik7ZXhwb3J0cy5lbmNvZGVQYWNrZXQ9ZnVuY3Rpb24ocGFja2V0LHN1cHBvcnRzQmluYXJ5LHV0ZjhlbmNvZGUsY2FsbGJhY2spe2lmKFwiZnVuY3Rpb25cIj09dHlwZW9mIHN1cHBvcnRzQmluYXJ5KXtjYWxsYmFjaz1zdXBwb3J0c0JpbmFyeTtzdXBwb3J0c0JpbmFyeT1mYWxzZX1pZihcImZ1bmN0aW9uXCI9PXR5cGVvZiB1dGY4ZW5jb2RlKXtjYWxsYmFjaz11dGY4ZW5jb2RlO3V0ZjhlbmNvZGU9bnVsbH12YXIgZGF0YT1wYWNrZXQuZGF0YT09PXVuZGVmaW5lZD91bmRlZmluZWQ6cGFja2V0LmRhdGEuYnVmZmVyfHxwYWNrZXQuZGF0YTtpZihnbG9iYWwuQXJyYXlCdWZmZXImJmRhdGEgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcil7cmV0dXJuIGVuY29kZUFycmF5QnVmZmVyKHBhY2tldCxzdXBwb3J0c0JpbmFyeSxjYWxsYmFjayl9ZWxzZSBpZihCbG9iJiZkYXRhIGluc3RhbmNlb2YgZ2xvYmFsLkJsb2Ipe3JldHVybiBlbmNvZGVCbG9iKHBhY2tldCxzdXBwb3J0c0JpbmFyeSxjYWxsYmFjayl9aWYoZGF0YSYmZGF0YS5iYXNlNjQpe3JldHVybiBlbmNvZGVCYXNlNjRPYmplY3QocGFja2V0LGNhbGxiYWNrKX12YXIgZW5jb2RlZD1wYWNrZXRzW3BhY2tldC50eXBlXTtpZih1bmRlZmluZWQhPT1wYWNrZXQuZGF0YSl7ZW5jb2RlZCs9dXRmOGVuY29kZT91dGY4LmVuY29kZShTdHJpbmcocGFja2V0LmRhdGEpKTpTdHJpbmcocGFja2V0LmRhdGEpfXJldHVybiBjYWxsYmFjayhcIlwiK2VuY29kZWQpfTtmdW5jdGlvbiBlbmNvZGVCYXNlNjRPYmplY3QocGFja2V0LGNhbGxiYWNrKXt2YXIgbWVzc2FnZT1cImJcIitleHBvcnRzLnBhY2tldHNbcGFja2V0LnR5cGVdK3BhY2tldC5kYXRhLmRhdGE7cmV0dXJuIGNhbGxiYWNrKG1lc3NhZ2UpfWZ1bmN0aW9uIGVuY29kZUFycmF5QnVmZmVyKHBhY2tldCxzdXBwb3J0c0JpbmFyeSxjYWxsYmFjayl7aWYoIXN1cHBvcnRzQmluYXJ5KXtyZXR1cm4gZXhwb3J0cy5lbmNvZGVCYXNlNjRQYWNrZXQocGFja2V0LGNhbGxiYWNrKX12YXIgZGF0YT1wYWNrZXQuZGF0YTt2YXIgY29udGVudEFycmF5PW5ldyBVaW50OEFycmF5KGRhdGEpO3ZhciByZXN1bHRCdWZmZXI9bmV3IFVpbnQ4QXJyYXkoMStkYXRhLmJ5dGVMZW5ndGgpO3Jlc3VsdEJ1ZmZlclswXT1wYWNrZXRzW3BhY2tldC50eXBlXTtmb3IodmFyIGk9MDtpPGNvbnRlbnRBcnJheS5sZW5ndGg7aSsrKXtyZXN1bHRCdWZmZXJbaSsxXT1jb250ZW50QXJyYXlbaV19cmV0dXJuIGNhbGxiYWNrKHJlc3VsdEJ1ZmZlci5idWZmZXIpfWZ1bmN0aW9uIGVuY29kZUJsb2JBc0FycmF5QnVmZmVyKHBhY2tldCxzdXBwb3J0c0JpbmFyeSxjYWxsYmFjayl7aWYoIXN1cHBvcnRzQmluYXJ5KXtyZXR1cm4gZXhwb3J0cy5lbmNvZGVCYXNlNjRQYWNrZXQocGFja2V0LGNhbGxiYWNrKX12YXIgZnI9bmV3IEZpbGVSZWFkZXI7ZnIub25sb2FkPWZ1bmN0aW9uKCl7cGFja2V0LmRhdGE9ZnIucmVzdWx0O2V4cG9ydHMuZW5jb2RlUGFja2V0KHBhY2tldCxzdXBwb3J0c0JpbmFyeSx0cnVlLGNhbGxiYWNrKX07cmV0dXJuIGZyLnJlYWRBc0FycmF5QnVmZmVyKHBhY2tldC5kYXRhKX1mdW5jdGlvbiBlbmNvZGVCbG9iKHBhY2tldCxzdXBwb3J0c0JpbmFyeSxjYWxsYmFjayl7aWYoIXN1cHBvcnRzQmluYXJ5KXtyZXR1cm4gZXhwb3J0cy5lbmNvZGVCYXNlNjRQYWNrZXQocGFja2V0LGNhbGxiYWNrKX1pZihkb250U2VuZEJsb2JzKXtyZXR1cm4gZW5jb2RlQmxvYkFzQXJyYXlCdWZmZXIocGFja2V0LHN1cHBvcnRzQmluYXJ5LGNhbGxiYWNrKX12YXIgbGVuZ3RoPW5ldyBVaW50OEFycmF5KDEpO2xlbmd0aFswXT1wYWNrZXRzW3BhY2tldC50eXBlXTt2YXIgYmxvYj1uZXcgQmxvYihbbGVuZ3RoLmJ1ZmZlcixwYWNrZXQuZGF0YV0pO3JldHVybiBjYWxsYmFjayhibG9iKX1leHBvcnRzLmVuY29kZUJhc2U2NFBhY2tldD1mdW5jdGlvbihwYWNrZXQsY2FsbGJhY2spe3ZhciBtZXNzYWdlPVwiYlwiK2V4cG9ydHMucGFja2V0c1twYWNrZXQudHlwZV07aWYoQmxvYiYmcGFja2V0LmRhdGEgaW5zdGFuY2VvZiBnbG9iYWwuQmxvYil7dmFyIGZyPW5ldyBGaWxlUmVhZGVyO2ZyLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBiNjQ9ZnIucmVzdWx0LnNwbGl0KFwiLFwiKVsxXTtjYWxsYmFjayhtZXNzYWdlK2I2NCl9O3JldHVybiBmci5yZWFkQXNEYXRhVVJMKHBhY2tldC5kYXRhKX12YXIgYjY0ZGF0YTt0cnl7YjY0ZGF0YT1TdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsbmV3IFVpbnQ4QXJyYXkocGFja2V0LmRhdGEpKX1jYXRjaChlKXt2YXIgdHlwZWQ9bmV3IFVpbnQ4QXJyYXkocGFja2V0LmRhdGEpO3ZhciBiYXNpYz1uZXcgQXJyYXkodHlwZWQubGVuZ3RoKTtmb3IodmFyIGk9MDtpPHR5cGVkLmxlbmd0aDtpKyspe2Jhc2ljW2ldPXR5cGVkW2ldfWI2NGRhdGE9U3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLGJhc2ljKX1tZXNzYWdlKz1nbG9iYWwuYnRvYShiNjRkYXRhKTtyZXR1cm4gY2FsbGJhY2sobWVzc2FnZSl9O2V4cG9ydHMuZGVjb2RlUGFja2V0PWZ1bmN0aW9uKGRhdGEsYmluYXJ5VHlwZSx1dGY4ZGVjb2RlKXtpZih0eXBlb2YgZGF0YT09XCJzdHJpbmdcInx8ZGF0YT09PXVuZGVmaW5lZCl7aWYoZGF0YS5jaGFyQXQoMCk9PVwiYlwiKXtyZXR1cm4gZXhwb3J0cy5kZWNvZGVCYXNlNjRQYWNrZXQoZGF0YS5zdWJzdHIoMSksYmluYXJ5VHlwZSl9aWYodXRmOGRlY29kZSl7dHJ5e2RhdGE9dXRmOC5kZWNvZGUoZGF0YSl9Y2F0Y2goZSl7cmV0dXJuIGVycn19dmFyIHR5cGU9ZGF0YS5jaGFyQXQoMCk7aWYoTnVtYmVyKHR5cGUpIT10eXBlfHwhcGFja2V0c2xpc3RbdHlwZV0pe3JldHVybiBlcnJ9aWYoZGF0YS5sZW5ndGg+MSl7cmV0dXJue3R5cGU6cGFja2V0c2xpc3RbdHlwZV0sZGF0YTpkYXRhLnN1YnN0cmluZygxKX19ZWxzZXtyZXR1cm57dHlwZTpwYWNrZXRzbGlzdFt0eXBlXX19fXZhciBhc0FycmF5PW5ldyBVaW50OEFycmF5KGRhdGEpO3ZhciB0eXBlPWFzQXJyYXlbMF07dmFyIHJlc3Q9c2xpY2VCdWZmZXIoZGF0YSwxKTtpZihCbG9iJiZiaW5hcnlUeXBlPT09XCJibG9iXCIpe3Jlc3Q9bmV3IEJsb2IoW3Jlc3RdKX1yZXR1cm57dHlwZTpwYWNrZXRzbGlzdFt0eXBlXSxkYXRhOnJlc3R9fTtleHBvcnRzLmRlY29kZUJhc2U2NFBhY2tldD1mdW5jdGlvbihtc2csYmluYXJ5VHlwZSl7dmFyIHR5cGU9cGFja2V0c2xpc3RbbXNnLmNoYXJBdCgwKV07aWYoIWdsb2JhbC5BcnJheUJ1ZmZlcil7cmV0dXJue3R5cGU6dHlwZSxkYXRhOntiYXNlNjQ6dHJ1ZSxkYXRhOm1zZy5zdWJzdHIoMSl9fX12YXIgZGF0YT1iYXNlNjRlbmNvZGVyLmRlY29kZShtc2cuc3Vic3RyKDEpKTtpZihiaW5hcnlUeXBlPT09XCJibG9iXCImJkJsb2Ipe2RhdGE9bmV3IEJsb2IoW2RhdGFdKX1yZXR1cm57dHlwZTp0eXBlLGRhdGE6ZGF0YX19O2V4cG9ydHMuZW5jb2RlUGF5bG9hZD1mdW5jdGlvbihwYWNrZXRzLHN1cHBvcnRzQmluYXJ5LGNhbGxiYWNrKXtpZih0eXBlb2Ygc3VwcG9ydHNCaW5hcnk9PVwiZnVuY3Rpb25cIil7Y2FsbGJhY2s9c3VwcG9ydHNCaW5hcnk7c3VwcG9ydHNCaW5hcnk9bnVsbH12YXIgaXNCaW5hcnk9aGFzQmluYXJ5KHBhY2tldHMpO2lmKHN1cHBvcnRzQmluYXJ5JiZpc0JpbmFyeSl7aWYoQmxvYiYmIWRvbnRTZW5kQmxvYnMpe3JldHVybiBleHBvcnRzLmVuY29kZVBheWxvYWRBc0Jsb2IocGFja2V0cyxjYWxsYmFjayl9cmV0dXJuIGV4cG9ydHMuZW5jb2RlUGF5bG9hZEFzQXJyYXlCdWZmZXIocGFja2V0cyxjYWxsYmFjayl9aWYoIXBhY2tldHMubGVuZ3RoKXtyZXR1cm4gY2FsbGJhY2soXCIwOlwiKX1mdW5jdGlvbiBzZXRMZW5ndGhIZWFkZXIobWVzc2FnZSl7cmV0dXJuIG1lc3NhZ2UubGVuZ3RoK1wiOlwiK21lc3NhZ2V9ZnVuY3Rpb24gZW5jb2RlT25lKHBhY2tldCxkb25lQ2FsbGJhY2spe2V4cG9ydHMuZW5jb2RlUGFja2V0KHBhY2tldCwhaXNCaW5hcnk/ZmFsc2U6c3VwcG9ydHNCaW5hcnksdHJ1ZSxmdW5jdGlvbihtZXNzYWdlKXtkb25lQ2FsbGJhY2sobnVsbCxzZXRMZW5ndGhIZWFkZXIobWVzc2FnZSkpfSl9bWFwKHBhY2tldHMsZW5jb2RlT25lLGZ1bmN0aW9uKGVycixyZXN1bHRzKXtyZXR1cm4gY2FsbGJhY2socmVzdWx0cy5qb2luKFwiXCIpKX0pfTtmdW5jdGlvbiBtYXAoYXJ5LGVhY2gsZG9uZSl7dmFyIHJlc3VsdD1uZXcgQXJyYXkoYXJ5Lmxlbmd0aCk7dmFyIG5leHQ9YWZ0ZXIoYXJ5Lmxlbmd0aCxkb25lKTt2YXIgZWFjaFdpdGhJbmRleD1mdW5jdGlvbihpLGVsLGNiKXtlYWNoKGVsLGZ1bmN0aW9uKGVycm9yLG1zZyl7cmVzdWx0W2ldPW1zZztjYihlcnJvcixyZXN1bHQpfSl9O2Zvcih2YXIgaT0wO2k8YXJ5Lmxlbmd0aDtpKyspe2VhY2hXaXRoSW5kZXgoaSxhcnlbaV0sbmV4dCl9fWV4cG9ydHMuZGVjb2RlUGF5bG9hZD1mdW5jdGlvbihkYXRhLGJpbmFyeVR5cGUsY2FsbGJhY2spe2lmKHR5cGVvZiBkYXRhIT1cInN0cmluZ1wiKXtyZXR1cm4gZXhwb3J0cy5kZWNvZGVQYXlsb2FkQXNCaW5hcnkoZGF0YSxiaW5hcnlUeXBlLGNhbGxiYWNrKX1pZih0eXBlb2YgYmluYXJ5VHlwZT09PVwiZnVuY3Rpb25cIil7Y2FsbGJhY2s9YmluYXJ5VHlwZTtiaW5hcnlUeXBlPW51bGx9dmFyIHBhY2tldDtpZihkYXRhPT1cIlwiKXtyZXR1cm4gY2FsbGJhY2soZXJyLDAsMSl9dmFyIGxlbmd0aD1cIlwiLG4sbXNnO2Zvcih2YXIgaT0wLGw9ZGF0YS5sZW5ndGg7aTxsO2krKyl7dmFyIGNocj1kYXRhLmNoYXJBdChpKTtpZihcIjpcIiE9Y2hyKXtsZW5ndGgrPWNocn1lbHNle2lmKFwiXCI9PWxlbmd0aHx8bGVuZ3RoIT0obj1OdW1iZXIobGVuZ3RoKSkpe3JldHVybiBjYWxsYmFjayhlcnIsMCwxKX1tc2c9ZGF0YS5zdWJzdHIoaSsxLG4pO2lmKGxlbmd0aCE9bXNnLmxlbmd0aCl7cmV0dXJuIGNhbGxiYWNrKGVyciwwLDEpfWlmKG1zZy5sZW5ndGgpe3BhY2tldD1leHBvcnRzLmRlY29kZVBhY2tldChtc2csYmluYXJ5VHlwZSx0cnVlKTtpZihlcnIudHlwZT09cGFja2V0LnR5cGUmJmVyci5kYXRhPT1wYWNrZXQuZGF0YSl7cmV0dXJuIGNhbGxiYWNrKGVyciwwLDEpfXZhciByZXQ9Y2FsbGJhY2socGFja2V0LGkrbixsKTtpZihmYWxzZT09PXJldClyZXR1cm59aSs9bjtsZW5ndGg9XCJcIn19aWYobGVuZ3RoIT1cIlwiKXtyZXR1cm4gY2FsbGJhY2soZXJyLDAsMSl9fTtleHBvcnRzLmVuY29kZVBheWxvYWRBc0FycmF5QnVmZmVyPWZ1bmN0aW9uKHBhY2tldHMsY2FsbGJhY2spe2lmKCFwYWNrZXRzLmxlbmd0aCl7cmV0dXJuIGNhbGxiYWNrKG5ldyBBcnJheUJ1ZmZlcigwKSl9ZnVuY3Rpb24gZW5jb2RlT25lKHBhY2tldCxkb25lQ2FsbGJhY2spe2V4cG9ydHMuZW5jb2RlUGFja2V0KHBhY2tldCx0cnVlLHRydWUsZnVuY3Rpb24oZGF0YSl7cmV0dXJuIGRvbmVDYWxsYmFjayhudWxsLGRhdGEpfSl9bWFwKHBhY2tldHMsZW5jb2RlT25lLGZ1bmN0aW9uKGVycixlbmNvZGVkUGFja2V0cyl7dmFyIHRvdGFsTGVuZ3RoPWVuY29kZWRQYWNrZXRzLnJlZHVjZShmdW5jdGlvbihhY2MscCl7dmFyIGxlbjtpZih0eXBlb2YgcD09PVwic3RyaW5nXCIpe2xlbj1wLmxlbmd0aH1lbHNle2xlbj1wLmJ5dGVMZW5ndGh9cmV0dXJuIGFjYytsZW4udG9TdHJpbmcoKS5sZW5ndGgrbGVuKzJ9LDApO3ZhciByZXN1bHRBcnJheT1uZXcgVWludDhBcnJheSh0b3RhbExlbmd0aCk7dmFyIGJ1ZmZlckluZGV4PTA7ZW5jb2RlZFBhY2tldHMuZm9yRWFjaChmdW5jdGlvbihwKXt2YXIgaXNTdHJpbmc9dHlwZW9mIHA9PT1cInN0cmluZ1wiO3ZhciBhYj1wO2lmKGlzU3RyaW5nKXt2YXIgdmlldz1uZXcgVWludDhBcnJheShwLmxlbmd0aCk7Zm9yKHZhciBpPTA7aTxwLmxlbmd0aDtpKyspe3ZpZXdbaV09cC5jaGFyQ29kZUF0KGkpfWFiPXZpZXcuYnVmZmVyfWlmKGlzU3RyaW5nKXtyZXN1bHRBcnJheVtidWZmZXJJbmRleCsrXT0wfWVsc2V7cmVzdWx0QXJyYXlbYnVmZmVySW5kZXgrK109MX12YXIgbGVuU3RyPWFiLmJ5dGVMZW5ndGgudG9TdHJpbmcoKTtmb3IodmFyIGk9MDtpPGxlblN0ci5sZW5ndGg7aSsrKXtyZXN1bHRBcnJheVtidWZmZXJJbmRleCsrXT1wYXJzZUludChsZW5TdHJbaV0pfXJlc3VsdEFycmF5W2J1ZmZlckluZGV4KytdPTI1NTt2YXIgdmlldz1uZXcgVWludDhBcnJheShhYik7Zm9yKHZhciBpPTA7aTx2aWV3Lmxlbmd0aDtpKyspe3Jlc3VsdEFycmF5W2J1ZmZlckluZGV4KytdPXZpZXdbaV19fSk7cmV0dXJuIGNhbGxiYWNrKHJlc3VsdEFycmF5LmJ1ZmZlcil9KX07ZXhwb3J0cy5lbmNvZGVQYXlsb2FkQXNCbG9iPWZ1bmN0aW9uKHBhY2tldHMsY2FsbGJhY2spe2Z1bmN0aW9uIGVuY29kZU9uZShwYWNrZXQsZG9uZUNhbGxiYWNrKXtleHBvcnRzLmVuY29kZVBhY2tldChwYWNrZXQsdHJ1ZSx0cnVlLGZ1bmN0aW9uKGVuY29kZWQpe3ZhciBiaW5hcnlJZGVudGlmaWVyPW5ldyBVaW50OEFycmF5KDEpO2JpbmFyeUlkZW50aWZpZXJbMF09MTtpZih0eXBlb2YgZW5jb2RlZD09PVwic3RyaW5nXCIpe3ZhciB2aWV3PW5ldyBVaW50OEFycmF5KGVuY29kZWQubGVuZ3RoKTtmb3IodmFyIGk9MDtpPGVuY29kZWQubGVuZ3RoO2krKyl7dmlld1tpXT1lbmNvZGVkLmNoYXJDb2RlQXQoaSl9ZW5jb2RlZD12aWV3LmJ1ZmZlcjtiaW5hcnlJZGVudGlmaWVyWzBdPTB9dmFyIGxlbj1lbmNvZGVkIGluc3RhbmNlb2YgQXJyYXlCdWZmZXI/ZW5jb2RlZC5ieXRlTGVuZ3RoOmVuY29kZWQuc2l6ZTt2YXIgbGVuU3RyPWxlbi50b1N0cmluZygpO3ZhciBsZW5ndGhBcnk9bmV3IFVpbnQ4QXJyYXkobGVuU3RyLmxlbmd0aCsxKTtmb3IodmFyIGk9MDtpPGxlblN0ci5sZW5ndGg7aSsrKXtsZW5ndGhBcnlbaV09cGFyc2VJbnQobGVuU3RyW2ldKX1sZW5ndGhBcnlbbGVuU3RyLmxlbmd0aF09MjU1O2lmKEJsb2Ipe3ZhciBibG9iPW5ldyBCbG9iKFtiaW5hcnlJZGVudGlmaWVyLmJ1ZmZlcixsZW5ndGhBcnkuYnVmZmVyLGVuY29kZWRdKTtkb25lQ2FsbGJhY2sobnVsbCxibG9iKX19KX1tYXAocGFja2V0cyxlbmNvZGVPbmUsZnVuY3Rpb24oZXJyLHJlc3VsdHMpe3JldHVybiBjYWxsYmFjayhuZXcgQmxvYihyZXN1bHRzKSl9KX07ZXhwb3J0cy5kZWNvZGVQYXlsb2FkQXNCaW5hcnk9ZnVuY3Rpb24oZGF0YSxiaW5hcnlUeXBlLGNhbGxiYWNrKXtpZih0eXBlb2YgYmluYXJ5VHlwZT09PVwiZnVuY3Rpb25cIil7Y2FsbGJhY2s9YmluYXJ5VHlwZTtiaW5hcnlUeXBlPW51bGx9dmFyIGJ1ZmZlclRhaWw9ZGF0YTt2YXIgYnVmZmVycz1bXTt2YXIgbnVtYmVyVG9vTG9uZz1mYWxzZTt3aGlsZShidWZmZXJUYWlsLmJ5dGVMZW5ndGg+MCl7dmFyIHRhaWxBcnJheT1uZXcgVWludDhBcnJheShidWZmZXJUYWlsKTt2YXIgaXNTdHJpbmc9dGFpbEFycmF5WzBdPT09MDt2YXIgbXNnTGVuZ3RoPVwiXCI7Zm9yKHZhciBpPTE7O2krKyl7aWYodGFpbEFycmF5W2ldPT0yNTUpYnJlYWs7aWYobXNnTGVuZ3RoLmxlbmd0aD4zMTApe251bWJlclRvb0xvbmc9dHJ1ZTticmVha31tc2dMZW5ndGgrPXRhaWxBcnJheVtpXX1pZihudW1iZXJUb29Mb25nKXJldHVybiBjYWxsYmFjayhlcnIsMCwxKTtidWZmZXJUYWlsPXNsaWNlQnVmZmVyKGJ1ZmZlclRhaWwsMittc2dMZW5ndGgubGVuZ3RoKTttc2dMZW5ndGg9cGFyc2VJbnQobXNnTGVuZ3RoKTt2YXIgbXNnPXNsaWNlQnVmZmVyKGJ1ZmZlclRhaWwsMCxtc2dMZW5ndGgpO2lmKGlzU3RyaW5nKXt0cnl7bXNnPVN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCxuZXcgVWludDhBcnJheShtc2cpKX1jYXRjaChlKXt2YXIgdHlwZWQ9bmV3IFVpbnQ4QXJyYXkobXNnKTttc2c9XCJcIjtmb3IodmFyIGk9MDtpPHR5cGVkLmxlbmd0aDtpKyspe21zZys9U3RyaW5nLmZyb21DaGFyQ29kZSh0eXBlZFtpXSl9fX1idWZmZXJzLnB1c2gobXNnKTtidWZmZXJUYWlsPXNsaWNlQnVmZmVyKGJ1ZmZlclRhaWwsbXNnTGVuZ3RoKX12YXIgdG90YWw9YnVmZmVycy5sZW5ndGg7YnVmZmVycy5mb3JFYWNoKGZ1bmN0aW9uKGJ1ZmZlcixpKXtjYWxsYmFjayhleHBvcnRzLmRlY29kZVBhY2tldChidWZmZXIsYmluYXJ5VHlwZSx0cnVlKSxpLHRvdGFsKX0pfX0pLmNhbGwodGhpcyx0eXBlb2Ygc2VsZiE9PVwidW5kZWZpbmVkXCI/c2VsZjp0eXBlb2Ygd2luZG93IT09XCJ1bmRlZmluZWRcIj93aW5kb3c6dHlwZW9mIGdsb2JhbCE9PVwidW5kZWZpbmVkXCI/Z2xvYmFsOnt9KX0se1wiLi9rZXlzXCI6MjAsYWZ0ZXI6MTEsXCJhcnJheWJ1ZmZlci5zbGljZVwiOjEyLFwiYmFzZTY0LWFycmF5YnVmZmVyXCI6MTMsYmxvYjoxNCxcImhhcy1iaW5hcnlcIjoyMSx1dGY4OjI5fV0sMjA6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe21vZHVsZS5leHBvcnRzPU9iamVjdC5rZXlzfHxmdW5jdGlvbiBrZXlzKG9iail7dmFyIGFycj1bXTt2YXIgaGFzPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7Zm9yKHZhciBpIGluIG9iail7aWYoaGFzLmNhbGwob2JqLGkpKXthcnIucHVzaChpKX19cmV0dXJuIGFycn19LHt9XSwyMTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7KGZ1bmN0aW9uKGdsb2JhbCl7dmFyIGlzQXJyYXk9X2RlcmVxXyhcImlzYXJyYXlcIik7bW9kdWxlLmV4cG9ydHM9aGFzQmluYXJ5O2Z1bmN0aW9uIGhhc0JpbmFyeShkYXRhKXtmdW5jdGlvbiBfaGFzQmluYXJ5KG9iail7aWYoIW9iailyZXR1cm4gZmFsc2U7aWYoZ2xvYmFsLkJ1ZmZlciYmZ2xvYmFsLkJ1ZmZlci5pc0J1ZmZlcihvYmopfHxnbG9iYWwuQXJyYXlCdWZmZXImJm9iaiBpbnN0YW5jZW9mIEFycmF5QnVmZmVyfHxnbG9iYWwuQmxvYiYmb2JqIGluc3RhbmNlb2YgQmxvYnx8Z2xvYmFsLkZpbGUmJm9iaiBpbnN0YW5jZW9mIEZpbGUpe3JldHVybiB0cnVlfWlmKGlzQXJyYXkob2JqKSl7Zm9yKHZhciBpPTA7aTxvYmoubGVuZ3RoO2krKyl7aWYoX2hhc0JpbmFyeShvYmpbaV0pKXtyZXR1cm4gdHJ1ZX19fWVsc2UgaWYob2JqJiZcIm9iamVjdFwiPT10eXBlb2Ygb2JqKXtpZihvYmoudG9KU09OKXtvYmo9b2JqLnRvSlNPTigpfWZvcih2YXIga2V5IGluIG9iail7aWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaixrZXkpJiZfaGFzQmluYXJ5KG9ialtrZXldKSl7cmV0dXJuIHRydWV9fX1yZXR1cm4gZmFsc2V9cmV0dXJuIF9oYXNCaW5hcnkoZGF0YSl9fSkuY2FsbCh0aGlzLHR5cGVvZiBzZWxmIT09XCJ1bmRlZmluZWRcIj9zZWxmOnR5cGVvZiB3aW5kb3chPT1cInVuZGVmaW5lZFwiP3dpbmRvdzp0eXBlb2YgZ2xvYmFsIT09XCJ1bmRlZmluZWRcIj9nbG9iYWw6e30pfSx7aXNhcnJheToyNH1dLDIyOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXt0cnl7bW9kdWxlLmV4cG9ydHM9dHlwZW9mIFhNTEh0dHBSZXF1ZXN0IT09XCJ1bmRlZmluZWRcIiYmXCJ3aXRoQ3JlZGVudGlhbHNcImluIG5ldyBYTUxIdHRwUmVxdWVzdH1jYXRjaChlcnIpe21vZHVsZS5leHBvcnRzPWZhbHNlfX0se31dLDIzOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXt2YXIgaW5kZXhPZj1bXS5pbmRleE9mO21vZHVsZS5leHBvcnRzPWZ1bmN0aW9uKGFycixvYmope2lmKGluZGV4T2YpcmV0dXJuIGFyci5pbmRleE9mKG9iaik7Zm9yKHZhciBpPTA7aTxhcnIubGVuZ3RoOysraSl7aWYoYXJyW2ldPT09b2JqKXJldHVybiBpfXJldHVybi0xfX0se31dLDI0OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXttb2R1bGUuZXhwb3J0cz1BcnJheS5pc0FycmF5fHxmdW5jdGlvbihhcnIpe3JldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYXJyKT09XCJbb2JqZWN0IEFycmF5XVwifX0se31dLDI1OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXt2YXIgcz0xZTM7dmFyIG09cyo2MDt2YXIgaD1tKjYwO3ZhciBkPWgqMjQ7dmFyIHk9ZCozNjUuMjU7bW9kdWxlLmV4cG9ydHM9ZnVuY3Rpb24odmFsLG9wdGlvbnMpe29wdGlvbnM9b3B0aW9uc3x8e307aWYoXCJzdHJpbmdcIj09dHlwZW9mIHZhbClyZXR1cm4gcGFyc2UodmFsKTtyZXR1cm4gb3B0aW9ucy5sb25nP2xvbmcodmFsKTpzaG9ydCh2YWwpfTtmdW5jdGlvbiBwYXJzZShzdHIpe3N0cj1cIlwiK3N0cjtpZihzdHIubGVuZ3RoPjFlNClyZXR1cm47dmFyIG1hdGNoPS9eKCg/OlxcZCspP1xcLj9cXGQrKSAqKG1pbGxpc2Vjb25kcz98bXNlY3M/fG1zfHNlY29uZHM/fHNlY3M/fHN8bWludXRlcz98bWlucz98bXxob3Vycz98aHJzP3xofGRheXM/fGR8eWVhcnM/fHlycz98eSk/JC9pLmV4ZWMoc3RyKTtpZighbWF0Y2gpcmV0dXJuO3ZhciBuPXBhcnNlRmxvYXQobWF0Y2hbMV0pO3ZhciB0eXBlPShtYXRjaFsyXXx8XCJtc1wiKS50b0xvd2VyQ2FzZSgpO3N3aXRjaCh0eXBlKXtjYXNlXCJ5ZWFyc1wiOmNhc2VcInllYXJcIjpjYXNlXCJ5cnNcIjpjYXNlXCJ5clwiOmNhc2VcInlcIjpyZXR1cm4gbip5O2Nhc2VcImRheXNcIjpjYXNlXCJkYXlcIjpjYXNlXCJkXCI6cmV0dXJuIG4qZDtjYXNlXCJob3Vyc1wiOmNhc2VcImhvdXJcIjpjYXNlXCJocnNcIjpjYXNlXCJoclwiOmNhc2VcImhcIjpyZXR1cm4gbipoO2Nhc2VcIm1pbnV0ZXNcIjpjYXNlXCJtaW51dGVcIjpjYXNlXCJtaW5zXCI6Y2FzZVwibWluXCI6Y2FzZVwibVwiOnJldHVybiBuKm07Y2FzZVwic2Vjb25kc1wiOmNhc2VcInNlY29uZFwiOmNhc2VcInNlY3NcIjpjYXNlXCJzZWNcIjpjYXNlXCJzXCI6cmV0dXJuIG4qcztjYXNlXCJtaWxsaXNlY29uZHNcIjpjYXNlXCJtaWxsaXNlY29uZFwiOmNhc2VcIm1zZWNzXCI6Y2FzZVwibXNlY1wiOmNhc2VcIm1zXCI6cmV0dXJuIG59fWZ1bmN0aW9uIHNob3J0KG1zKXtpZihtcz49ZClyZXR1cm4gTWF0aC5yb3VuZChtcy9kKStcImRcIjtpZihtcz49aClyZXR1cm4gTWF0aC5yb3VuZChtcy9oKStcImhcIjtpZihtcz49bSlyZXR1cm4gTWF0aC5yb3VuZChtcy9tKStcIm1cIjtpZihtcz49cylyZXR1cm4gTWF0aC5yb3VuZChtcy9zKStcInNcIjtyZXR1cm4gbXMrXCJtc1wifWZ1bmN0aW9uIGxvbmcobXMpe3JldHVybiBwbHVyYWwobXMsZCxcImRheVwiKXx8cGx1cmFsKG1zLGgsXCJob3VyXCIpfHxwbHVyYWwobXMsbSxcIm1pbnV0ZVwiKXx8cGx1cmFsKG1zLHMsXCJzZWNvbmRcIil8fG1zK1wiIG1zXCJ9ZnVuY3Rpb24gcGx1cmFsKG1zLG4sbmFtZSl7aWYobXM8bilyZXR1cm47aWYobXM8bioxLjUpcmV0dXJuIE1hdGguZmxvb3IobXMvbikrXCIgXCIrbmFtZTtyZXR1cm4gTWF0aC5jZWlsKG1zL24pK1wiIFwiK25hbWUrXCJzXCJ9fSx7fV0sMjY6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeyhmdW5jdGlvbihnbG9iYWwpe3ZhciBydmFsaWRjaGFycz0vXltcXF0sOnt9XFxzXSokLzt2YXIgcnZhbGlkZXNjYXBlPS9cXFxcKD86W1wiXFxcXFxcL2JmbnJ0XXx1WzAtOWEtZkEtRl17NH0pL2c7dmFyIHJ2YWxpZHRva2Vucz0vXCJbXlwiXFxcXFxcblxccl0qXCJ8dHJ1ZXxmYWxzZXxudWxsfC0/XFxkKyg/OlxcLlxcZCopPyg/OltlRV1bK1xcLV0/XFxkKyk/L2c7dmFyIHJ2YWxpZGJyYWNlcz0vKD86Xnw6fCwpKD86XFxzKlxcWykrL2c7dmFyIHJ0cmltTGVmdD0vXlxccysvO3ZhciBydHJpbVJpZ2h0PS9cXHMrJC87bW9kdWxlLmV4cG9ydHM9ZnVuY3Rpb24gcGFyc2Vqc29uKGRhdGEpe2lmKFwic3RyaW5nXCIhPXR5cGVvZiBkYXRhfHwhZGF0YSl7cmV0dXJuIG51bGx9ZGF0YT1kYXRhLnJlcGxhY2UocnRyaW1MZWZ0LFwiXCIpLnJlcGxhY2UocnRyaW1SaWdodCxcIlwiKTtpZihnbG9iYWwuSlNPTiYmSlNPTi5wYXJzZSl7cmV0dXJuIEpTT04ucGFyc2UoZGF0YSl9aWYocnZhbGlkY2hhcnMudGVzdChkYXRhLnJlcGxhY2UocnZhbGlkZXNjYXBlLFwiQFwiKS5yZXBsYWNlKHJ2YWxpZHRva2VucyxcIl1cIikucmVwbGFjZShydmFsaWRicmFjZXMsXCJcIikpKXtyZXR1cm4gbmV3IEZ1bmN0aW9uKFwicmV0dXJuIFwiK2RhdGEpKCl9fX0pLmNhbGwodGhpcyx0eXBlb2Ygc2VsZiE9PVwidW5kZWZpbmVkXCI/c2VsZjp0eXBlb2Ygd2luZG93IT09XCJ1bmRlZmluZWRcIj93aW5kb3c6dHlwZW9mIGdsb2JhbCE9PVwidW5kZWZpbmVkXCI/Z2xvYmFsOnt9KX0se31dLDI3OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtleHBvcnRzLmVuY29kZT1mdW5jdGlvbihvYmope3ZhciBzdHI9XCJcIjtmb3IodmFyIGkgaW4gb2JqKXtpZihvYmouaGFzT3duUHJvcGVydHkoaSkpe2lmKHN0ci5sZW5ndGgpc3RyKz1cIiZcIjtzdHIrPWVuY29kZVVSSUNvbXBvbmVudChpKStcIj1cIitlbmNvZGVVUklDb21wb25lbnQob2JqW2ldKX19cmV0dXJuIHN0cn07ZXhwb3J0cy5kZWNvZGU9ZnVuY3Rpb24ocXMpe3ZhciBxcnk9e307dmFyIHBhaXJzPXFzLnNwbGl0KFwiJlwiKTtmb3IodmFyIGk9MCxsPXBhaXJzLmxlbmd0aDtpPGw7aSsrKXt2YXIgcGFpcj1wYWlyc1tpXS5zcGxpdChcIj1cIik7cXJ5W2RlY29kZVVSSUNvbXBvbmVudChwYWlyWzBdKV09ZGVjb2RlVVJJQ29tcG9uZW50KHBhaXJbMV0pfXJldHVybiBxcnl9fSx7fV0sMjg6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe3ZhciByZT0vXig/Oig/IVteOkBdKzpbXjpAXFwvXSpAKShodHRwfGh0dHBzfHdzfHdzcyk6XFwvXFwvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPygoPzpbYS1mMC05XXswLDR9Oil7Miw3fVthLWYwLTldezAsNH18W146XFwvPyNdKikoPzo6KFxcZCopKT8pKCgoXFwvKD86W14/I10oPyFbXj8jXFwvXSpcXC5bXj8jXFwvLl0rKD86Wz8jXXwkKSkpKlxcLz8pPyhbXj8jXFwvXSopKSg/OlxcPyhbXiNdKikpPyg/OiMoLiopKT8pLzt2YXIgcGFydHM9W1wic291cmNlXCIsXCJwcm90b2NvbFwiLFwiYXV0aG9yaXR5XCIsXCJ1c2VySW5mb1wiLFwidXNlclwiLFwicGFzc3dvcmRcIixcImhvc3RcIixcInBvcnRcIixcInJlbGF0aXZlXCIsXCJwYXRoXCIsXCJkaXJlY3RvcnlcIixcImZpbGVcIixcInF1ZXJ5XCIsXCJhbmNob3JcIl07bW9kdWxlLmV4cG9ydHM9ZnVuY3Rpb24gcGFyc2V1cmkoc3RyKXt2YXIgc3JjPXN0cixiPXN0ci5pbmRleE9mKFwiW1wiKSxlPXN0ci5pbmRleE9mKFwiXVwiKTtpZihiIT0tMSYmZSE9LTEpe3N0cj1zdHIuc3Vic3RyaW5nKDAsYikrc3RyLnN1YnN0cmluZyhiLGUpLnJlcGxhY2UoLzovZyxcIjtcIikrc3RyLnN1YnN0cmluZyhlLHN0ci5sZW5ndGgpfXZhciBtPXJlLmV4ZWMoc3RyfHxcIlwiKSx1cmk9e30saT0xNDt3aGlsZShpLS0pe3VyaVtwYXJ0c1tpXV09bVtpXXx8XCJcIn1pZihiIT0tMSYmZSE9LTEpe3VyaS5zb3VyY2U9c3JjO3VyaS5ob3N0PXVyaS5ob3N0LnN1YnN0cmluZygxLHVyaS5ob3N0Lmxlbmd0aC0xKS5yZXBsYWNlKC87L2csXCI6XCIpO3VyaS5hdXRob3JpdHk9dXJpLmF1dGhvcml0eS5yZXBsYWNlKFwiW1wiLFwiXCIpLnJlcGxhY2UoXCJdXCIsXCJcIikucmVwbGFjZSgvOy9nLFwiOlwiKTt1cmkuaXB2NnVyaT10cnVlfXJldHVybiB1cml9fSx7fV0sMjk6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeyhmdW5jdGlvbihnbG9iYWwpeyhmdW5jdGlvbihyb290KXt2YXIgZnJlZUV4cG9ydHM9dHlwZW9mIGV4cG9ydHM9PVwib2JqZWN0XCImJmV4cG9ydHM7dmFyIGZyZWVNb2R1bGU9dHlwZW9mIG1vZHVsZT09XCJvYmplY3RcIiYmbW9kdWxlJiZtb2R1bGUuZXhwb3J0cz09ZnJlZUV4cG9ydHMmJm1vZHVsZTt2YXIgZnJlZUdsb2JhbD10eXBlb2YgZ2xvYmFsPT1cIm9iamVjdFwiJiZnbG9iYWw7aWYoZnJlZUdsb2JhbC5nbG9iYWw9PT1mcmVlR2xvYmFsfHxmcmVlR2xvYmFsLndpbmRvdz09PWZyZWVHbG9iYWwpe3Jvb3Q9ZnJlZUdsb2JhbH12YXIgc3RyaW5nRnJvbUNoYXJDb2RlPVN0cmluZy5mcm9tQ2hhckNvZGU7ZnVuY3Rpb24gdWNzMmRlY29kZShzdHJpbmcpe3ZhciBvdXRwdXQ9W107dmFyIGNvdW50ZXI9MDt2YXIgbGVuZ3RoPXN0cmluZy5sZW5ndGg7dmFyIHZhbHVlO3ZhciBleHRyYTt3aGlsZShjb3VudGVyPGxlbmd0aCl7dmFsdWU9c3RyaW5nLmNoYXJDb2RlQXQoY291bnRlcisrKTtpZih2YWx1ZT49NTUyOTYmJnZhbHVlPD01NjMxOSYmY291bnRlcjxsZW5ndGgpe2V4dHJhPXN0cmluZy5jaGFyQ29kZUF0KGNvdW50ZXIrKyk7aWYoKGV4dHJhJjY0NTEyKT09NTYzMjApe291dHB1dC5wdXNoKCgodmFsdWUmMTAyMyk8PDEwKSsoZXh0cmEmMTAyMykrNjU1MzYpfWVsc2V7b3V0cHV0LnB1c2godmFsdWUpO2NvdW50ZXItLX19ZWxzZXtvdXRwdXQucHVzaCh2YWx1ZSl9fXJldHVybiBvdXRwdXR9ZnVuY3Rpb24gdWNzMmVuY29kZShhcnJheSl7dmFyIGxlbmd0aD1hcnJheS5sZW5ndGg7dmFyIGluZGV4PS0xO3ZhciB2YWx1ZTt2YXIgb3V0cHV0PVwiXCI7d2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhbHVlPWFycmF5W2luZGV4XTtpZih2YWx1ZT42NTUzNSl7dmFsdWUtPTY1NTM2O291dHB1dCs9c3RyaW5nRnJvbUNoYXJDb2RlKHZhbHVlPj4+MTAmMTAyM3w1NTI5Nik7dmFsdWU9NTYzMjB8dmFsdWUmMTAyM31vdXRwdXQrPXN0cmluZ0Zyb21DaGFyQ29kZSh2YWx1ZSl9cmV0dXJuIG91dHB1dH1mdW5jdGlvbiBjaGVja1NjYWxhclZhbHVlKGNvZGVQb2ludCl7aWYoY29kZVBvaW50Pj01NTI5NiYmY29kZVBvaW50PD01NzM0Myl7dGhyb3cgRXJyb3IoXCJMb25lIHN1cnJvZ2F0ZSBVK1wiK2NvZGVQb2ludC50b1N0cmluZygxNikudG9VcHBlckNhc2UoKStcIiBpcyBub3QgYSBzY2FsYXIgdmFsdWVcIil9fWZ1bmN0aW9uIGNyZWF0ZUJ5dGUoY29kZVBvaW50LHNoaWZ0KXtyZXR1cm4gc3RyaW5nRnJvbUNoYXJDb2RlKGNvZGVQb2ludD4+c2hpZnQmNjN8MTI4KX1mdW5jdGlvbiBlbmNvZGVDb2RlUG9pbnQoY29kZVBvaW50KXtpZigoY29kZVBvaW50JjQyOTQ5NjcxNjgpPT0wKXtyZXR1cm4gc3RyaW5nRnJvbUNoYXJDb2RlKGNvZGVQb2ludCl9dmFyIHN5bWJvbD1cIlwiO2lmKChjb2RlUG9pbnQmNDI5NDk2NTI0OCk9PTApe3N5bWJvbD1zdHJpbmdGcm9tQ2hhckNvZGUoY29kZVBvaW50Pj42JjMxfDE5Mil9ZWxzZSBpZigoY29kZVBvaW50JjQyOTQ5MDE3NjApPT0wKXtjaGVja1NjYWxhclZhbHVlKGNvZGVQb2ludCk7c3ltYm9sPXN0cmluZ0Zyb21DaGFyQ29kZShjb2RlUG9pbnQ+PjEyJjE1fDIyNCk7c3ltYm9sKz1jcmVhdGVCeXRlKGNvZGVQb2ludCw2KX1lbHNlIGlmKChjb2RlUG9pbnQmNDI5Mjg3MDE0NCk9PTApe3N5bWJvbD1zdHJpbmdGcm9tQ2hhckNvZGUoY29kZVBvaW50Pj4xOCY3fDI0MCk7c3ltYm9sKz1jcmVhdGVCeXRlKGNvZGVQb2ludCwxMik7c3ltYm9sKz1jcmVhdGVCeXRlKGNvZGVQb2ludCw2KX1zeW1ib2wrPXN0cmluZ0Zyb21DaGFyQ29kZShjb2RlUG9pbnQmNjN8MTI4KTtyZXR1cm4gc3ltYm9sfWZ1bmN0aW9uIHV0ZjhlbmNvZGUoc3RyaW5nKXt2YXIgY29kZVBvaW50cz11Y3MyZGVjb2RlKHN0cmluZyk7dmFyIGxlbmd0aD1jb2RlUG9pbnRzLmxlbmd0aDt2YXIgaW5kZXg9LTE7dmFyIGNvZGVQb2ludDt2YXIgYnl0ZVN0cmluZz1cIlwiO3doaWxlKCsraW5kZXg8bGVuZ3RoKXtjb2RlUG9pbnQ9Y29kZVBvaW50c1tpbmRleF07Ynl0ZVN0cmluZys9ZW5jb2RlQ29kZVBvaW50KGNvZGVQb2ludCl9cmV0dXJuIGJ5dGVTdHJpbmd9ZnVuY3Rpb24gcmVhZENvbnRpbnVhdGlvbkJ5dGUoKXtpZihieXRlSW5kZXg+PWJ5dGVDb3VudCl7dGhyb3cgRXJyb3IoXCJJbnZhbGlkIGJ5dGUgaW5kZXhcIil9dmFyIGNvbnRpbnVhdGlvbkJ5dGU9Ynl0ZUFycmF5W2J5dGVJbmRleF0mMjU1O2J5dGVJbmRleCsrO2lmKChjb250aW51YXRpb25CeXRlJjE5Mik9PTEyOCl7cmV0dXJuIGNvbnRpbnVhdGlvbkJ5dGUmNjN9dGhyb3cgRXJyb3IoXCJJbnZhbGlkIGNvbnRpbnVhdGlvbiBieXRlXCIpfWZ1bmN0aW9uIGRlY29kZVN5bWJvbCgpe3ZhciBieXRlMTt2YXIgYnl0ZTI7dmFyIGJ5dGUzO3ZhciBieXRlNDt2YXIgY29kZVBvaW50O2lmKGJ5dGVJbmRleD5ieXRlQ291bnQpe3Rocm93IEVycm9yKFwiSW52YWxpZCBieXRlIGluZGV4XCIpfWlmKGJ5dGVJbmRleD09Ynl0ZUNvdW50KXtyZXR1cm4gZmFsc2V9Ynl0ZTE9Ynl0ZUFycmF5W2J5dGVJbmRleF0mMjU1O2J5dGVJbmRleCsrO2lmKChieXRlMSYxMjgpPT0wKXtyZXR1cm4gYnl0ZTF9aWYoKGJ5dGUxJjIyNCk9PTE5Mil7dmFyIGJ5dGUyPXJlYWRDb250aW51YXRpb25CeXRlKCk7Y29kZVBvaW50PShieXRlMSYzMSk8PDZ8Ynl0ZTI7aWYoY29kZVBvaW50Pj0xMjgpe3JldHVybiBjb2RlUG9pbnR9ZWxzZXt0aHJvdyBFcnJvcihcIkludmFsaWQgY29udGludWF0aW9uIGJ5dGVcIil9fWlmKChieXRlMSYyNDApPT0yMjQpe2J5dGUyPXJlYWRDb250aW51YXRpb25CeXRlKCk7Ynl0ZTM9cmVhZENvbnRpbnVhdGlvbkJ5dGUoKTtjb2RlUG9pbnQ9KGJ5dGUxJjE1KTw8MTJ8Ynl0ZTI8PDZ8Ynl0ZTM7aWYoY29kZVBvaW50Pj0yMDQ4KXtjaGVja1NjYWxhclZhbHVlKGNvZGVQb2ludCk7cmV0dXJuIGNvZGVQb2ludH1lbHNle3Rocm93IEVycm9yKFwiSW52YWxpZCBjb250aW51YXRpb24gYnl0ZVwiKX19aWYoKGJ5dGUxJjI0OCk9PTI0MCl7Ynl0ZTI9cmVhZENvbnRpbnVhdGlvbkJ5dGUoKTtieXRlMz1yZWFkQ29udGludWF0aW9uQnl0ZSgpO2J5dGU0PXJlYWRDb250aW51YXRpb25CeXRlKCk7Y29kZVBvaW50PShieXRlMSYxNSk8PDE4fGJ5dGUyPDwxMnxieXRlMzw8NnxieXRlNDtpZihjb2RlUG9pbnQ+PTY1NTM2JiZjb2RlUG9pbnQ8PTExMTQxMTEpe3JldHVybiBjb2RlUG9pbnR9fXRocm93IEVycm9yKFwiSW52YWxpZCBVVEYtOCBkZXRlY3RlZFwiKX12YXIgYnl0ZUFycmF5O3ZhciBieXRlQ291bnQ7dmFyIGJ5dGVJbmRleDtmdW5jdGlvbiB1dGY4ZGVjb2RlKGJ5dGVTdHJpbmcpe2J5dGVBcnJheT11Y3MyZGVjb2RlKGJ5dGVTdHJpbmcpO2J5dGVDb3VudD1ieXRlQXJyYXkubGVuZ3RoO2J5dGVJbmRleD0wO3ZhciBjb2RlUG9pbnRzPVtdO3ZhciB0bXA7d2hpbGUoKHRtcD1kZWNvZGVTeW1ib2woKSkhPT1mYWxzZSl7Y29kZVBvaW50cy5wdXNoKHRtcCl9cmV0dXJuIHVjczJlbmNvZGUoY29kZVBvaW50cyl9dmFyIHV0Zjg9e3ZlcnNpb246XCIyLjAuMFwiLGVuY29kZTp1dGY4ZW5jb2RlLGRlY29kZTp1dGY4ZGVjb2RlfTtpZih0eXBlb2YgZGVmaW5lPT1cImZ1bmN0aW9uXCImJnR5cGVvZiBkZWZpbmUuYW1kPT1cIm9iamVjdFwiJiZkZWZpbmUuYW1kKXtkZWZpbmUoZnVuY3Rpb24oKXtyZXR1cm4gdXRmOH0pfWVsc2UgaWYoZnJlZUV4cG9ydHMmJiFmcmVlRXhwb3J0cy5ub2RlVHlwZSl7aWYoZnJlZU1vZHVsZSl7ZnJlZU1vZHVsZS5leHBvcnRzPXV0Zjh9ZWxzZXt2YXIgb2JqZWN0PXt9O3ZhciBoYXNPd25Qcm9wZXJ0eT1vYmplY3QuaGFzT3duUHJvcGVydHk7Zm9yKHZhciBrZXkgaW4gdXRmOCl7aGFzT3duUHJvcGVydHkuY2FsbCh1dGY4LGtleSkmJihmcmVlRXhwb3J0c1trZXldPXV0Zjhba2V5XSl9fX1lbHNle3Jvb3QudXRmOD11dGY4fX0pKHRoaXMpfSkuY2FsbCh0aGlzLHR5cGVvZiBzZWxmIT09XCJ1bmRlZmluZWRcIj9zZWxmOnR5cGVvZiB3aW5kb3chPT1cInVuZGVmaW5lZFwiP3dpbmRvdzp0eXBlb2YgZ2xvYmFsIT09XCJ1bmRlZmluZWRcIj9nbG9iYWw6e30pfSx7fV0sMzA6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1widXNlIHN0cmljdFwiO3ZhciBhbHBoYWJldD1cIjAxMjM0NTY3ODlBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6LV9cIi5zcGxpdChcIlwiKSxsZW5ndGg9NjQsbWFwPXt9LHNlZWQ9MCxpPTAscHJldjtmdW5jdGlvbiBlbmNvZGUobnVtKXt2YXIgZW5jb2RlZD1cIlwiO2Rve2VuY29kZWQ9YWxwaGFiZXRbbnVtJWxlbmd0aF0rZW5jb2RlZDtudW09TWF0aC5mbG9vcihudW0vbGVuZ3RoKX13aGlsZShudW0+MCk7cmV0dXJuIGVuY29kZWR9ZnVuY3Rpb24gZGVjb2RlKHN0cil7dmFyIGRlY29kZWQ9MDtmb3IoaT0wO2k8c3RyLmxlbmd0aDtpKyspe2RlY29kZWQ9ZGVjb2RlZCpsZW5ndGgrbWFwW3N0ci5jaGFyQXQoaSldfXJldHVybiBkZWNvZGVkfWZ1bmN0aW9uIHllYXN0KCl7dmFyIG5vdz1lbmNvZGUoK25ldyBEYXRlKTtpZihub3chPT1wcmV2KXJldHVybiBzZWVkPTAscHJldj1ub3c7cmV0dXJuIG5vdytcIi5cIitlbmNvZGUoc2VlZCsrKX1mb3IoO2k8bGVuZ3RoO2krKyltYXBbYWxwaGFiZXRbaV1dPWk7eWVhc3QuZW5jb2RlPWVuY29kZTt5ZWFzdC5kZWNvZGU9ZGVjb2RlO21vZHVsZS5leHBvcnRzPXllYXN0fSx7fV0sMzE6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe3ZhciB1cmw9X2RlcmVxXyhcIi4vdXJsXCIpO3ZhciBwYXJzZXI9X2RlcmVxXyhcInNvY2tldC5pby1wYXJzZXJcIik7dmFyIE1hbmFnZXI9X2RlcmVxXyhcIi4vbWFuYWdlclwiKTt2YXIgZGVidWc9X2RlcmVxXyhcImRlYnVnXCIpKFwic29ja2V0LmlvLWNsaWVudFwiKTttb2R1bGUuZXhwb3J0cz1leHBvcnRzPWxvb2t1cDt2YXIgY2FjaGU9ZXhwb3J0cy5tYW5hZ2Vycz17fTtmdW5jdGlvbiBsb29rdXAodXJpLG9wdHMpe2lmKHR5cGVvZiB1cmk9PVwib2JqZWN0XCIpe29wdHM9dXJpO3VyaT11bmRlZmluZWR9b3B0cz1vcHRzfHx7fTt2YXIgcGFyc2VkPXVybCh1cmkpO3ZhciBzb3VyY2U9cGFyc2VkLnNvdXJjZTt2YXIgaWQ9cGFyc2VkLmlkO3ZhciBwYXRoPXBhcnNlZC5wYXRoO3ZhciBzYW1lTmFtZXNwYWNlPWNhY2hlW2lkXSYmcGF0aCBpbiBjYWNoZVtpZF0ubnNwczt2YXIgbmV3Q29ubmVjdGlvbj1vcHRzLmZvcmNlTmV3fHxvcHRzW1wiZm9yY2UgbmV3IGNvbm5lY3Rpb25cIl18fGZhbHNlPT09b3B0cy5tdWx0aXBsZXh8fHNhbWVOYW1lc3BhY2U7dmFyIGlvO2lmKG5ld0Nvbm5lY3Rpb24pe2RlYnVnKFwiaWdub3Jpbmcgc29ja2V0IGNhY2hlIGZvciAlc1wiLHNvdXJjZSk7aW89TWFuYWdlcihzb3VyY2Usb3B0cyl9ZWxzZXtpZighY2FjaGVbaWRdKXtkZWJ1ZyhcIm5ldyBpbyBpbnN0YW5jZSBmb3IgJXNcIixzb3VyY2UpO2NhY2hlW2lkXT1NYW5hZ2VyKHNvdXJjZSxvcHRzKX1pbz1jYWNoZVtpZF19cmV0dXJuIGlvLnNvY2tldChwYXJzZWQucGF0aCl9ZXhwb3J0cy5wcm90b2NvbD1wYXJzZXIucHJvdG9jb2w7ZXhwb3J0cy5jb25uZWN0PWxvb2t1cDtleHBvcnRzLk1hbmFnZXI9X2RlcmVxXyhcIi4vbWFuYWdlclwiKTtleHBvcnRzLlNvY2tldD1fZGVyZXFfKFwiLi9zb2NrZXRcIil9LHtcIi4vbWFuYWdlclwiOjMyLFwiLi9zb2NrZXRcIjozNCxcIi4vdXJsXCI6MzUsZGVidWc6MzksXCJzb2NrZXQuaW8tcGFyc2VyXCI6NDd9XSwzMjpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7dmFyIGVpbz1fZGVyZXFfKFwiZW5naW5lLmlvLWNsaWVudFwiKTt2YXIgU29ja2V0PV9kZXJlcV8oXCIuL3NvY2tldFwiKTt2YXIgRW1pdHRlcj1fZGVyZXFfKFwiY29tcG9uZW50LWVtaXR0ZXJcIik7dmFyIHBhcnNlcj1fZGVyZXFfKFwic29ja2V0LmlvLXBhcnNlclwiKTt2YXIgb249X2RlcmVxXyhcIi4vb25cIik7dmFyIGJpbmQ9X2RlcmVxXyhcImNvbXBvbmVudC1iaW5kXCIpO3ZhciBkZWJ1Zz1fZGVyZXFfKFwiZGVidWdcIikoXCJzb2NrZXQuaW8tY2xpZW50Om1hbmFnZXJcIik7dmFyIGluZGV4T2Y9X2RlcmVxXyhcImluZGV4b2ZcIik7dmFyIEJhY2tvZmY9X2RlcmVxXyhcImJhY2tvMlwiKTt2YXIgaGFzPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7bW9kdWxlLmV4cG9ydHM9TWFuYWdlcjtmdW5jdGlvbiBNYW5hZ2VyKHVyaSxvcHRzKXtpZighKHRoaXMgaW5zdGFuY2VvZiBNYW5hZ2VyKSlyZXR1cm4gbmV3IE1hbmFnZXIodXJpLG9wdHMpO2lmKHVyaSYmXCJvYmplY3RcIj09dHlwZW9mIHVyaSl7b3B0cz11cmk7dXJpPXVuZGVmaW5lZH1vcHRzPW9wdHN8fHt9O29wdHMucGF0aD1vcHRzLnBhdGh8fFwiL3NvY2tldC5pb1wiO3RoaXMubnNwcz17fTt0aGlzLnN1YnM9W107dGhpcy5vcHRzPW9wdHM7dGhpcy5yZWNvbm5lY3Rpb24ob3B0cy5yZWNvbm5lY3Rpb24hPT1mYWxzZSk7dGhpcy5yZWNvbm5lY3Rpb25BdHRlbXB0cyhvcHRzLnJlY29ubmVjdGlvbkF0dGVtcHRzfHxJbmZpbml0eSk7dGhpcy5yZWNvbm5lY3Rpb25EZWxheShvcHRzLnJlY29ubmVjdGlvbkRlbGF5fHwxZTMpO3RoaXMucmVjb25uZWN0aW9uRGVsYXlNYXgob3B0cy5yZWNvbm5lY3Rpb25EZWxheU1heHx8NWUzKTt0aGlzLnJhbmRvbWl6YXRpb25GYWN0b3Iob3B0cy5yYW5kb21pemF0aW9uRmFjdG9yfHwuNSk7dGhpcy5iYWNrb2ZmPW5ldyBCYWNrb2ZmKHttaW46dGhpcy5yZWNvbm5lY3Rpb25EZWxheSgpLG1heDp0aGlzLnJlY29ubmVjdGlvbkRlbGF5TWF4KCksaml0dGVyOnRoaXMucmFuZG9taXphdGlvbkZhY3RvcigpfSk7dGhpcy50aW1lb3V0KG51bGw9PW9wdHMudGltZW91dD8yZTQ6b3B0cy50aW1lb3V0KTt0aGlzLnJlYWR5U3RhdGU9XCJjbG9zZWRcIjt0aGlzLnVyaT11cmk7dGhpcy5jb25uZWN0aW5nPVtdO3RoaXMubGFzdFBpbmc9bnVsbDt0aGlzLmVuY29kaW5nPWZhbHNlO3RoaXMucGFja2V0QnVmZmVyPVtdO3RoaXMuZW5jb2Rlcj1uZXcgcGFyc2VyLkVuY29kZXI7dGhpcy5kZWNvZGVyPW5ldyBwYXJzZXIuRGVjb2Rlcjt0aGlzLmF1dG9Db25uZWN0PW9wdHMuYXV0b0Nvbm5lY3QhPT1mYWxzZTtpZih0aGlzLmF1dG9Db25uZWN0KXRoaXMub3BlbigpfU1hbmFnZXIucHJvdG90eXBlLmVtaXRBbGw9ZnVuY3Rpb24oKXt0aGlzLmVtaXQuYXBwbHkodGhpcyxhcmd1bWVudHMpO2Zvcih2YXIgbnNwIGluIHRoaXMubnNwcyl7aWYoaGFzLmNhbGwodGhpcy5uc3BzLG5zcCkpe3RoaXMubnNwc1tuc3BdLmVtaXQuYXBwbHkodGhpcy5uc3BzW25zcF0sYXJndW1lbnRzKX19fTtNYW5hZ2VyLnByb3RvdHlwZS51cGRhdGVTb2NrZXRJZHM9ZnVuY3Rpb24oKXtmb3IodmFyIG5zcCBpbiB0aGlzLm5zcHMpe2lmKGhhcy5jYWxsKHRoaXMubnNwcyxuc3ApKXt0aGlzLm5zcHNbbnNwXS5pZD10aGlzLmVuZ2luZS5pZH19fTtFbWl0dGVyKE1hbmFnZXIucHJvdG90eXBlKTtNYW5hZ2VyLnByb3RvdHlwZS5yZWNvbm5lY3Rpb249ZnVuY3Rpb24odil7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHRoaXMuX3JlY29ubmVjdGlvbjt0aGlzLl9yZWNvbm5lY3Rpb249ISF2O3JldHVybiB0aGlzfTtNYW5hZ2VyLnByb3RvdHlwZS5yZWNvbm5lY3Rpb25BdHRlbXB0cz1mdW5jdGlvbih2KXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdGhpcy5fcmVjb25uZWN0aW9uQXR0ZW1wdHM7dGhpcy5fcmVjb25uZWN0aW9uQXR0ZW1wdHM9djtyZXR1cm4gdGhpc307TWFuYWdlci5wcm90b3R5cGUucmVjb25uZWN0aW9uRGVsYXk9ZnVuY3Rpb24odil7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHRoaXMuX3JlY29ubmVjdGlvbkRlbGF5O3RoaXMuX3JlY29ubmVjdGlvbkRlbGF5PXY7dGhpcy5iYWNrb2ZmJiZ0aGlzLmJhY2tvZmYuc2V0TWluKHYpO3JldHVybiB0aGlzfTtNYW5hZ2VyLnByb3RvdHlwZS5yYW5kb21pemF0aW9uRmFjdG9yPWZ1bmN0aW9uKHYpe2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiB0aGlzLl9yYW5kb21pemF0aW9uRmFjdG9yO3RoaXMuX3JhbmRvbWl6YXRpb25GYWN0b3I9djt0aGlzLmJhY2tvZmYmJnRoaXMuYmFja29mZi5zZXRKaXR0ZXIodik7cmV0dXJuIHRoaXN9O01hbmFnZXIucHJvdG90eXBlLnJlY29ubmVjdGlvbkRlbGF5TWF4PWZ1bmN0aW9uKHYpe2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiB0aGlzLl9yZWNvbm5lY3Rpb25EZWxheU1heDt0aGlzLl9yZWNvbm5lY3Rpb25EZWxheU1heD12O3RoaXMuYmFja29mZiYmdGhpcy5iYWNrb2ZmLnNldE1heCh2KTtyZXR1cm4gdGhpc307TWFuYWdlci5wcm90b3R5cGUudGltZW91dD1mdW5jdGlvbih2KXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdGhpcy5fdGltZW91dDt0aGlzLl90aW1lb3V0PXY7cmV0dXJuIHRoaXN9O01hbmFnZXIucHJvdG90eXBlLm1heWJlUmVjb25uZWN0T25PcGVuPWZ1bmN0aW9uKCl7aWYoIXRoaXMucmVjb25uZWN0aW5nJiZ0aGlzLl9yZWNvbm5lY3Rpb24mJnRoaXMuYmFja29mZi5hdHRlbXB0cz09PTApe3RoaXMucmVjb25uZWN0KCl9fTtNYW5hZ2VyLnByb3RvdHlwZS5vcGVuPU1hbmFnZXIucHJvdG90eXBlLmNvbm5lY3Q9ZnVuY3Rpb24oZm4pe2RlYnVnKFwicmVhZHlTdGF0ZSAlc1wiLHRoaXMucmVhZHlTdGF0ZSk7aWYofnRoaXMucmVhZHlTdGF0ZS5pbmRleE9mKFwib3BlblwiKSlyZXR1cm4gdGhpcztkZWJ1ZyhcIm9wZW5pbmcgJXNcIix0aGlzLnVyaSk7dGhpcy5lbmdpbmU9ZWlvKHRoaXMudXJpLHRoaXMub3B0cyk7dmFyIHNvY2tldD10aGlzLmVuZ2luZTt2YXIgc2VsZj10aGlzO3RoaXMucmVhZHlTdGF0ZT1cIm9wZW5pbmdcIjt0aGlzLnNraXBSZWNvbm5lY3Q9ZmFsc2U7dmFyIG9wZW5TdWI9b24oc29ja2V0LFwib3BlblwiLGZ1bmN0aW9uKCl7c2VsZi5vbm9wZW4oKTtmbiYmZm4oKX0pO3ZhciBlcnJvclN1Yj1vbihzb2NrZXQsXCJlcnJvclwiLGZ1bmN0aW9uKGRhdGEpe2RlYnVnKFwiY29ubmVjdF9lcnJvclwiKTtzZWxmLmNsZWFudXAoKTtzZWxmLnJlYWR5U3RhdGU9XCJjbG9zZWRcIjtzZWxmLmVtaXRBbGwoXCJjb25uZWN0X2Vycm9yXCIsZGF0YSk7aWYoZm4pe3ZhciBlcnI9bmV3IEVycm9yKFwiQ29ubmVjdGlvbiBlcnJvclwiKTtlcnIuZGF0YT1kYXRhO2ZuKGVycil9ZWxzZXtzZWxmLm1heWJlUmVjb25uZWN0T25PcGVuKCl9fSk7aWYoZmFsc2UhPT10aGlzLl90aW1lb3V0KXt2YXIgdGltZW91dD10aGlzLl90aW1lb3V0O2RlYnVnKFwiY29ubmVjdCBhdHRlbXB0IHdpbGwgdGltZW91dCBhZnRlciAlZFwiLHRpbWVvdXQpO3ZhciB0aW1lcj1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZGVidWcoXCJjb25uZWN0IGF0dGVtcHQgdGltZWQgb3V0IGFmdGVyICVkXCIsdGltZW91dCk7b3BlblN1Yi5kZXN0cm95KCk7c29ja2V0LmNsb3NlKCk7c29ja2V0LmVtaXQoXCJlcnJvclwiLFwidGltZW91dFwiKTtzZWxmLmVtaXRBbGwoXCJjb25uZWN0X3RpbWVvdXRcIix0aW1lb3V0KX0sdGltZW91dCk7dGhpcy5zdWJzLnB1c2goe2Rlc3Ryb3k6ZnVuY3Rpb24oKXtjbGVhclRpbWVvdXQodGltZXIpfX0pfXRoaXMuc3Vicy5wdXNoKG9wZW5TdWIpO3RoaXMuc3Vicy5wdXNoKGVycm9yU3ViKTtyZXR1cm4gdGhpc307TWFuYWdlci5wcm90b3R5cGUub25vcGVuPWZ1bmN0aW9uKCl7ZGVidWcoXCJvcGVuXCIpO3RoaXMuY2xlYW51cCgpO3RoaXMucmVhZHlTdGF0ZT1cIm9wZW5cIjt0aGlzLmVtaXQoXCJvcGVuXCIpO3ZhciBzb2NrZXQ9dGhpcy5lbmdpbmU7dGhpcy5zdWJzLnB1c2gob24oc29ja2V0LFwiZGF0YVwiLGJpbmQodGhpcyxcIm9uZGF0YVwiKSkpO3RoaXMuc3Vicy5wdXNoKG9uKHNvY2tldCxcInBpbmdcIixiaW5kKHRoaXMsXCJvbnBpbmdcIikpKTt0aGlzLnN1YnMucHVzaChvbihzb2NrZXQsXCJwb25nXCIsYmluZCh0aGlzLFwib25wb25nXCIpKSk7dGhpcy5zdWJzLnB1c2gob24oc29ja2V0LFwiZXJyb3JcIixiaW5kKHRoaXMsXCJvbmVycm9yXCIpKSk7dGhpcy5zdWJzLnB1c2gob24oc29ja2V0LFwiY2xvc2VcIixiaW5kKHRoaXMsXCJvbmNsb3NlXCIpKSk7dGhpcy5zdWJzLnB1c2gob24odGhpcy5kZWNvZGVyLFwiZGVjb2RlZFwiLGJpbmQodGhpcyxcIm9uZGVjb2RlZFwiKSkpfTtNYW5hZ2VyLnByb3RvdHlwZS5vbnBpbmc9ZnVuY3Rpb24oKXt0aGlzLmxhc3RQaW5nPW5ldyBEYXRlO3RoaXMuZW1pdEFsbChcInBpbmdcIil9O01hbmFnZXIucHJvdG90eXBlLm9ucG9uZz1mdW5jdGlvbigpe3RoaXMuZW1pdEFsbChcInBvbmdcIixuZXcgRGF0ZS10aGlzLmxhc3RQaW5nKX07TWFuYWdlci5wcm90b3R5cGUub25kYXRhPWZ1bmN0aW9uKGRhdGEpe3RoaXMuZGVjb2Rlci5hZGQoZGF0YSl9O01hbmFnZXIucHJvdG90eXBlLm9uZGVjb2RlZD1mdW5jdGlvbihwYWNrZXQpe3RoaXMuZW1pdChcInBhY2tldFwiLHBhY2tldCl9O01hbmFnZXIucHJvdG90eXBlLm9uZXJyb3I9ZnVuY3Rpb24oZXJyKXtkZWJ1ZyhcImVycm9yXCIsZXJyKTt0aGlzLmVtaXRBbGwoXCJlcnJvclwiLGVycil9O01hbmFnZXIucHJvdG90eXBlLnNvY2tldD1mdW5jdGlvbihuc3Ape3ZhciBzb2NrZXQ9dGhpcy5uc3BzW25zcF07aWYoIXNvY2tldCl7c29ja2V0PW5ldyBTb2NrZXQodGhpcyxuc3ApO3RoaXMubnNwc1tuc3BdPXNvY2tldDt2YXIgc2VsZj10aGlzO3NvY2tldC5vbihcImNvbm5lY3RpbmdcIixvbkNvbm5lY3RpbmcpO1xuc29ja2V0Lm9uKFwiY29ubmVjdFwiLGZ1bmN0aW9uKCl7c29ja2V0LmlkPXNlbGYuZW5naW5lLmlkfSk7aWYodGhpcy5hdXRvQ29ubmVjdCl7b25Db25uZWN0aW5nKCl9fWZ1bmN0aW9uIG9uQ29ubmVjdGluZygpe2lmKCF+aW5kZXhPZihzZWxmLmNvbm5lY3Rpbmcsc29ja2V0KSl7c2VsZi5jb25uZWN0aW5nLnB1c2goc29ja2V0KX19cmV0dXJuIHNvY2tldH07TWFuYWdlci5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbihzb2NrZXQpe3ZhciBpbmRleD1pbmRleE9mKHRoaXMuY29ubmVjdGluZyxzb2NrZXQpO2lmKH5pbmRleCl0aGlzLmNvbm5lY3Rpbmcuc3BsaWNlKGluZGV4LDEpO2lmKHRoaXMuY29ubmVjdGluZy5sZW5ndGgpcmV0dXJuO3RoaXMuY2xvc2UoKX07TWFuYWdlci5wcm90b3R5cGUucGFja2V0PWZ1bmN0aW9uKHBhY2tldCl7ZGVidWcoXCJ3cml0aW5nIHBhY2tldCAlalwiLHBhY2tldCk7dmFyIHNlbGY9dGhpcztpZighc2VsZi5lbmNvZGluZyl7c2VsZi5lbmNvZGluZz10cnVlO3RoaXMuZW5jb2Rlci5lbmNvZGUocGFja2V0LGZ1bmN0aW9uKGVuY29kZWRQYWNrZXRzKXtmb3IodmFyIGk9MDtpPGVuY29kZWRQYWNrZXRzLmxlbmd0aDtpKyspe3NlbGYuZW5naW5lLndyaXRlKGVuY29kZWRQYWNrZXRzW2ldLHBhY2tldC5vcHRpb25zKX1zZWxmLmVuY29kaW5nPWZhbHNlO3NlbGYucHJvY2Vzc1BhY2tldFF1ZXVlKCl9KX1lbHNle3NlbGYucGFja2V0QnVmZmVyLnB1c2gocGFja2V0KX19O01hbmFnZXIucHJvdG90eXBlLnByb2Nlc3NQYWNrZXRRdWV1ZT1mdW5jdGlvbigpe2lmKHRoaXMucGFja2V0QnVmZmVyLmxlbmd0aD4wJiYhdGhpcy5lbmNvZGluZyl7dmFyIHBhY2s9dGhpcy5wYWNrZXRCdWZmZXIuc2hpZnQoKTt0aGlzLnBhY2tldChwYWNrKX19O01hbmFnZXIucHJvdG90eXBlLmNsZWFudXA9ZnVuY3Rpb24oKXtkZWJ1ZyhcImNsZWFudXBcIik7dmFyIHN1Yjt3aGlsZShzdWI9dGhpcy5zdWJzLnNoaWZ0KCkpc3ViLmRlc3Ryb3koKTt0aGlzLnBhY2tldEJ1ZmZlcj1bXTt0aGlzLmVuY29kaW5nPWZhbHNlO3RoaXMubGFzdFBpbmc9bnVsbDt0aGlzLmRlY29kZXIuZGVzdHJveSgpfTtNYW5hZ2VyLnByb3RvdHlwZS5jbG9zZT1NYW5hZ2VyLnByb3RvdHlwZS5kaXNjb25uZWN0PWZ1bmN0aW9uKCl7ZGVidWcoXCJkaXNjb25uZWN0XCIpO3RoaXMuc2tpcFJlY29ubmVjdD10cnVlO3RoaXMucmVjb25uZWN0aW5nPWZhbHNlO2lmKFwib3BlbmluZ1wiPT10aGlzLnJlYWR5U3RhdGUpe3RoaXMuY2xlYW51cCgpfXRoaXMuYmFja29mZi5yZXNldCgpO3RoaXMucmVhZHlTdGF0ZT1cImNsb3NlZFwiO2lmKHRoaXMuZW5naW5lKXRoaXMuZW5naW5lLmNsb3NlKCl9O01hbmFnZXIucHJvdG90eXBlLm9uY2xvc2U9ZnVuY3Rpb24ocmVhc29uKXtkZWJ1ZyhcIm9uY2xvc2VcIik7dGhpcy5jbGVhbnVwKCk7dGhpcy5iYWNrb2ZmLnJlc2V0KCk7dGhpcy5yZWFkeVN0YXRlPVwiY2xvc2VkXCI7dGhpcy5lbWl0KFwiY2xvc2VcIixyZWFzb24pO2lmKHRoaXMuX3JlY29ubmVjdGlvbiYmIXRoaXMuc2tpcFJlY29ubmVjdCl7dGhpcy5yZWNvbm5lY3QoKX19O01hbmFnZXIucHJvdG90eXBlLnJlY29ubmVjdD1mdW5jdGlvbigpe2lmKHRoaXMucmVjb25uZWN0aW5nfHx0aGlzLnNraXBSZWNvbm5lY3QpcmV0dXJuIHRoaXM7dmFyIHNlbGY9dGhpcztpZih0aGlzLmJhY2tvZmYuYXR0ZW1wdHM+PXRoaXMuX3JlY29ubmVjdGlvbkF0dGVtcHRzKXtkZWJ1ZyhcInJlY29ubmVjdCBmYWlsZWRcIik7dGhpcy5iYWNrb2ZmLnJlc2V0KCk7dGhpcy5lbWl0QWxsKFwicmVjb25uZWN0X2ZhaWxlZFwiKTt0aGlzLnJlY29ubmVjdGluZz1mYWxzZX1lbHNle3ZhciBkZWxheT10aGlzLmJhY2tvZmYuZHVyYXRpb24oKTtkZWJ1ZyhcIndpbGwgd2FpdCAlZG1zIGJlZm9yZSByZWNvbm5lY3QgYXR0ZW1wdFwiLGRlbGF5KTt0aGlzLnJlY29ubmVjdGluZz10cnVlO3ZhciB0aW1lcj1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aWYoc2VsZi5za2lwUmVjb25uZWN0KXJldHVybjtkZWJ1ZyhcImF0dGVtcHRpbmcgcmVjb25uZWN0XCIpO3NlbGYuZW1pdEFsbChcInJlY29ubmVjdF9hdHRlbXB0XCIsc2VsZi5iYWNrb2ZmLmF0dGVtcHRzKTtzZWxmLmVtaXRBbGwoXCJyZWNvbm5lY3RpbmdcIixzZWxmLmJhY2tvZmYuYXR0ZW1wdHMpO2lmKHNlbGYuc2tpcFJlY29ubmVjdClyZXR1cm47c2VsZi5vcGVuKGZ1bmN0aW9uKGVycil7aWYoZXJyKXtkZWJ1ZyhcInJlY29ubmVjdCBhdHRlbXB0IGVycm9yXCIpO3NlbGYucmVjb25uZWN0aW5nPWZhbHNlO3NlbGYucmVjb25uZWN0KCk7c2VsZi5lbWl0QWxsKFwicmVjb25uZWN0X2Vycm9yXCIsZXJyLmRhdGEpfWVsc2V7ZGVidWcoXCJyZWNvbm5lY3Qgc3VjY2Vzc1wiKTtzZWxmLm9ucmVjb25uZWN0KCl9fSl9LGRlbGF5KTt0aGlzLnN1YnMucHVzaCh7ZGVzdHJveTpmdW5jdGlvbigpe2NsZWFyVGltZW91dCh0aW1lcil9fSl9fTtNYW5hZ2VyLnByb3RvdHlwZS5vbnJlY29ubmVjdD1mdW5jdGlvbigpe3ZhciBhdHRlbXB0PXRoaXMuYmFja29mZi5hdHRlbXB0czt0aGlzLnJlY29ubmVjdGluZz1mYWxzZTt0aGlzLmJhY2tvZmYucmVzZXQoKTt0aGlzLnVwZGF0ZVNvY2tldElkcygpO3RoaXMuZW1pdEFsbChcInJlY29ubmVjdFwiLGF0dGVtcHQpfX0se1wiLi9vblwiOjMzLFwiLi9zb2NrZXRcIjozNCxiYWNrbzI6MzYsXCJjb21wb25lbnQtYmluZFwiOjM3LFwiY29tcG9uZW50LWVtaXR0ZXJcIjozOCxkZWJ1ZzozOSxcImVuZ2luZS5pby1jbGllbnRcIjoxLGluZGV4b2Y6NDIsXCJzb2NrZXQuaW8tcGFyc2VyXCI6NDd9XSwzMzpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7bW9kdWxlLmV4cG9ydHM9b247ZnVuY3Rpb24gb24ob2JqLGV2LGZuKXtvYmoub24oZXYsZm4pO3JldHVybntkZXN0cm95OmZ1bmN0aW9uKCl7b2JqLnJlbW92ZUxpc3RlbmVyKGV2LGZuKX19fX0se31dLDM0OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXt2YXIgcGFyc2VyPV9kZXJlcV8oXCJzb2NrZXQuaW8tcGFyc2VyXCIpO3ZhciBFbWl0dGVyPV9kZXJlcV8oXCJjb21wb25lbnQtZW1pdHRlclwiKTt2YXIgdG9BcnJheT1fZGVyZXFfKFwidG8tYXJyYXlcIik7dmFyIG9uPV9kZXJlcV8oXCIuL29uXCIpO3ZhciBiaW5kPV9kZXJlcV8oXCJjb21wb25lbnQtYmluZFwiKTt2YXIgZGVidWc9X2RlcmVxXyhcImRlYnVnXCIpKFwic29ja2V0LmlvLWNsaWVudDpzb2NrZXRcIik7dmFyIGhhc0Jpbj1fZGVyZXFfKFwiaGFzLWJpbmFyeVwiKTttb2R1bGUuZXhwb3J0cz1leHBvcnRzPVNvY2tldDt2YXIgZXZlbnRzPXtjb25uZWN0OjEsY29ubmVjdF9lcnJvcjoxLGNvbm5lY3RfdGltZW91dDoxLGNvbm5lY3Rpbmc6MSxkaXNjb25uZWN0OjEsZXJyb3I6MSxyZWNvbm5lY3Q6MSxyZWNvbm5lY3RfYXR0ZW1wdDoxLHJlY29ubmVjdF9mYWlsZWQ6MSxyZWNvbm5lY3RfZXJyb3I6MSxyZWNvbm5lY3Rpbmc6MSxwaW5nOjEscG9uZzoxfTt2YXIgZW1pdD1FbWl0dGVyLnByb3RvdHlwZS5lbWl0O2Z1bmN0aW9uIFNvY2tldChpbyxuc3Ape3RoaXMuaW89aW87dGhpcy5uc3A9bnNwO3RoaXMuanNvbj10aGlzO3RoaXMuaWRzPTA7dGhpcy5hY2tzPXt9O3RoaXMucmVjZWl2ZUJ1ZmZlcj1bXTt0aGlzLnNlbmRCdWZmZXI9W107dGhpcy5jb25uZWN0ZWQ9ZmFsc2U7dGhpcy5kaXNjb25uZWN0ZWQ9dHJ1ZTtpZih0aGlzLmlvLmF1dG9Db25uZWN0KXRoaXMub3BlbigpfUVtaXR0ZXIoU29ja2V0LnByb3RvdHlwZSk7U29ja2V0LnByb3RvdHlwZS5zdWJFdmVudHM9ZnVuY3Rpb24oKXtpZih0aGlzLnN1YnMpcmV0dXJuO3ZhciBpbz10aGlzLmlvO3RoaXMuc3Vicz1bb24oaW8sXCJvcGVuXCIsYmluZCh0aGlzLFwib25vcGVuXCIpKSxvbihpbyxcInBhY2tldFwiLGJpbmQodGhpcyxcIm9ucGFja2V0XCIpKSxvbihpbyxcImNsb3NlXCIsYmluZCh0aGlzLFwib25jbG9zZVwiKSldfTtTb2NrZXQucHJvdG90eXBlLm9wZW49U29ja2V0LnByb3RvdHlwZS5jb25uZWN0PWZ1bmN0aW9uKCl7aWYodGhpcy5jb25uZWN0ZWQpcmV0dXJuIHRoaXM7dGhpcy5zdWJFdmVudHMoKTt0aGlzLmlvLm9wZW4oKTtpZihcIm9wZW5cIj09dGhpcy5pby5yZWFkeVN0YXRlKXRoaXMub25vcGVuKCk7dGhpcy5lbWl0KFwiY29ubmVjdGluZ1wiKTtyZXR1cm4gdGhpc307U29ja2V0LnByb3RvdHlwZS5zZW5kPWZ1bmN0aW9uKCl7dmFyIGFyZ3M9dG9BcnJheShhcmd1bWVudHMpO2FyZ3MudW5zaGlmdChcIm1lc3NhZ2VcIik7dGhpcy5lbWl0LmFwcGx5KHRoaXMsYXJncyk7cmV0dXJuIHRoaXN9O1NvY2tldC5wcm90b3R5cGUuZW1pdD1mdW5jdGlvbihldil7aWYoZXZlbnRzLmhhc093blByb3BlcnR5KGV2KSl7ZW1pdC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIHRoaXN9dmFyIGFyZ3M9dG9BcnJheShhcmd1bWVudHMpO3ZhciBwYXJzZXJUeXBlPXBhcnNlci5FVkVOVDtpZihoYXNCaW4oYXJncykpe3BhcnNlclR5cGU9cGFyc2VyLkJJTkFSWV9FVkVOVH12YXIgcGFja2V0PXt0eXBlOnBhcnNlclR5cGUsZGF0YTphcmdzfTtwYWNrZXQub3B0aW9ucz17fTtwYWNrZXQub3B0aW9ucy5jb21wcmVzcz0hdGhpcy5mbGFnc3x8ZmFsc2UhPT10aGlzLmZsYWdzLmNvbXByZXNzO2lmKFwiZnVuY3Rpb25cIj09dHlwZW9mIGFyZ3NbYXJncy5sZW5ndGgtMV0pe2RlYnVnKFwiZW1pdHRpbmcgcGFja2V0IHdpdGggYWNrIGlkICVkXCIsdGhpcy5pZHMpO3RoaXMuYWNrc1t0aGlzLmlkc109YXJncy5wb3AoKTtwYWNrZXQuaWQ9dGhpcy5pZHMrK31pZih0aGlzLmNvbm5lY3RlZCl7dGhpcy5wYWNrZXQocGFja2V0KX1lbHNle3RoaXMuc2VuZEJ1ZmZlci5wdXNoKHBhY2tldCl9ZGVsZXRlIHRoaXMuZmxhZ3M7cmV0dXJuIHRoaXN9O1NvY2tldC5wcm90b3R5cGUucGFja2V0PWZ1bmN0aW9uKHBhY2tldCl7cGFja2V0Lm5zcD10aGlzLm5zcDt0aGlzLmlvLnBhY2tldChwYWNrZXQpfTtTb2NrZXQucHJvdG90eXBlLm9ub3Blbj1mdW5jdGlvbigpe2RlYnVnKFwidHJhbnNwb3J0IGlzIG9wZW4gLSBjb25uZWN0aW5nXCIpO2lmKFwiL1wiIT10aGlzLm5zcCl7dGhpcy5wYWNrZXQoe3R5cGU6cGFyc2VyLkNPTk5FQ1R9KX19O1NvY2tldC5wcm90b3R5cGUub25jbG9zZT1mdW5jdGlvbihyZWFzb24pe2RlYnVnKFwiY2xvc2UgKCVzKVwiLHJlYXNvbik7dGhpcy5jb25uZWN0ZWQ9ZmFsc2U7dGhpcy5kaXNjb25uZWN0ZWQ9dHJ1ZTtkZWxldGUgdGhpcy5pZDt0aGlzLmVtaXQoXCJkaXNjb25uZWN0XCIscmVhc29uKX07U29ja2V0LnByb3RvdHlwZS5vbnBhY2tldD1mdW5jdGlvbihwYWNrZXQpe2lmKHBhY2tldC5uc3AhPXRoaXMubnNwKXJldHVybjtzd2l0Y2gocGFja2V0LnR5cGUpe2Nhc2UgcGFyc2VyLkNPTk5FQ1Q6dGhpcy5vbmNvbm5lY3QoKTticmVhaztjYXNlIHBhcnNlci5FVkVOVDp0aGlzLm9uZXZlbnQocGFja2V0KTticmVhaztjYXNlIHBhcnNlci5CSU5BUllfRVZFTlQ6dGhpcy5vbmV2ZW50KHBhY2tldCk7YnJlYWs7Y2FzZSBwYXJzZXIuQUNLOnRoaXMub25hY2socGFja2V0KTticmVhaztjYXNlIHBhcnNlci5CSU5BUllfQUNLOnRoaXMub25hY2socGFja2V0KTticmVhaztjYXNlIHBhcnNlci5ESVNDT05ORUNUOnRoaXMub25kaXNjb25uZWN0KCk7YnJlYWs7Y2FzZSBwYXJzZXIuRVJST1I6dGhpcy5lbWl0KFwiZXJyb3JcIixwYWNrZXQuZGF0YSk7YnJlYWt9fTtTb2NrZXQucHJvdG90eXBlLm9uZXZlbnQ9ZnVuY3Rpb24ocGFja2V0KXt2YXIgYXJncz1wYWNrZXQuZGF0YXx8W107ZGVidWcoXCJlbWl0dGluZyBldmVudCAlalwiLGFyZ3MpO2lmKG51bGwhPXBhY2tldC5pZCl7ZGVidWcoXCJhdHRhY2hpbmcgYWNrIGNhbGxiYWNrIHRvIGV2ZW50XCIpO2FyZ3MucHVzaCh0aGlzLmFjayhwYWNrZXQuaWQpKX1pZih0aGlzLmNvbm5lY3RlZCl7ZW1pdC5hcHBseSh0aGlzLGFyZ3MpfWVsc2V7dGhpcy5yZWNlaXZlQnVmZmVyLnB1c2goYXJncyl9fTtTb2NrZXQucHJvdG90eXBlLmFjaz1mdW5jdGlvbihpZCl7dmFyIHNlbGY9dGhpczt2YXIgc2VudD1mYWxzZTtyZXR1cm4gZnVuY3Rpb24oKXtpZihzZW50KXJldHVybjtzZW50PXRydWU7dmFyIGFyZ3M9dG9BcnJheShhcmd1bWVudHMpO2RlYnVnKFwic2VuZGluZyBhY2sgJWpcIixhcmdzKTt2YXIgdHlwZT1oYXNCaW4oYXJncyk/cGFyc2VyLkJJTkFSWV9BQ0s6cGFyc2VyLkFDSztzZWxmLnBhY2tldCh7dHlwZTp0eXBlLGlkOmlkLGRhdGE6YXJnc30pfX07U29ja2V0LnByb3RvdHlwZS5vbmFjaz1mdW5jdGlvbihwYWNrZXQpe3ZhciBhY2s9dGhpcy5hY2tzW3BhY2tldC5pZF07aWYoXCJmdW5jdGlvblwiPT10eXBlb2YgYWNrKXtkZWJ1ZyhcImNhbGxpbmcgYWNrICVzIHdpdGggJWpcIixwYWNrZXQuaWQscGFja2V0LmRhdGEpO2Fjay5hcHBseSh0aGlzLHBhY2tldC5kYXRhKTtkZWxldGUgdGhpcy5hY2tzW3BhY2tldC5pZF19ZWxzZXtkZWJ1ZyhcImJhZCBhY2sgJXNcIixwYWNrZXQuaWQpfX07U29ja2V0LnByb3RvdHlwZS5vbmNvbm5lY3Q9ZnVuY3Rpb24oKXt0aGlzLmNvbm5lY3RlZD10cnVlO3RoaXMuZGlzY29ubmVjdGVkPWZhbHNlO3RoaXMuZW1pdChcImNvbm5lY3RcIik7dGhpcy5lbWl0QnVmZmVyZWQoKX07U29ja2V0LnByb3RvdHlwZS5lbWl0QnVmZmVyZWQ9ZnVuY3Rpb24oKXt2YXIgaTtmb3IoaT0wO2k8dGhpcy5yZWNlaXZlQnVmZmVyLmxlbmd0aDtpKyspe2VtaXQuYXBwbHkodGhpcyx0aGlzLnJlY2VpdmVCdWZmZXJbaV0pfXRoaXMucmVjZWl2ZUJ1ZmZlcj1bXTtmb3IoaT0wO2k8dGhpcy5zZW5kQnVmZmVyLmxlbmd0aDtpKyspe3RoaXMucGFja2V0KHRoaXMuc2VuZEJ1ZmZlcltpXSl9dGhpcy5zZW5kQnVmZmVyPVtdfTtTb2NrZXQucHJvdG90eXBlLm9uZGlzY29ubmVjdD1mdW5jdGlvbigpe2RlYnVnKFwic2VydmVyIGRpc2Nvbm5lY3QgKCVzKVwiLHRoaXMubnNwKTt0aGlzLmRlc3Ryb3koKTt0aGlzLm9uY2xvc2UoXCJpbyBzZXJ2ZXIgZGlzY29ubmVjdFwiKX07U29ja2V0LnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7aWYodGhpcy5zdWJzKXtmb3IodmFyIGk9MDtpPHRoaXMuc3Vicy5sZW5ndGg7aSsrKXt0aGlzLnN1YnNbaV0uZGVzdHJveSgpfXRoaXMuc3Vicz1udWxsfXRoaXMuaW8uZGVzdHJveSh0aGlzKX07U29ja2V0LnByb3RvdHlwZS5jbG9zZT1Tb2NrZXQucHJvdG90eXBlLmRpc2Nvbm5lY3Q9ZnVuY3Rpb24oKXtpZih0aGlzLmNvbm5lY3RlZCl7ZGVidWcoXCJwZXJmb3JtaW5nIGRpc2Nvbm5lY3QgKCVzKVwiLHRoaXMubnNwKTt0aGlzLnBhY2tldCh7dHlwZTpwYXJzZXIuRElTQ09OTkVDVH0pfXRoaXMuZGVzdHJveSgpO2lmKHRoaXMuY29ubmVjdGVkKXt0aGlzLm9uY2xvc2UoXCJpbyBjbGllbnQgZGlzY29ubmVjdFwiKX1yZXR1cm4gdGhpc307U29ja2V0LnByb3RvdHlwZS5jb21wcmVzcz1mdW5jdGlvbihjb21wcmVzcyl7dGhpcy5mbGFncz10aGlzLmZsYWdzfHx7fTt0aGlzLmZsYWdzLmNvbXByZXNzPWNvbXByZXNzO3JldHVybiB0aGlzfX0se1wiLi9vblwiOjMzLFwiY29tcG9uZW50LWJpbmRcIjozNyxcImNvbXBvbmVudC1lbWl0dGVyXCI6MzgsZGVidWc6MzksXCJoYXMtYmluYXJ5XCI6NDEsXCJzb2NrZXQuaW8tcGFyc2VyXCI6NDcsXCJ0by1hcnJheVwiOjUxfV0sMzU6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeyhmdW5jdGlvbihnbG9iYWwpe3ZhciBwYXJzZXVyaT1fZGVyZXFfKFwicGFyc2V1cmlcIik7dmFyIGRlYnVnPV9kZXJlcV8oXCJkZWJ1Z1wiKShcInNvY2tldC5pby1jbGllbnQ6dXJsXCIpO21vZHVsZS5leHBvcnRzPXVybDtmdW5jdGlvbiB1cmwodXJpLGxvYyl7dmFyIG9iaj11cmk7dmFyIGxvYz1sb2N8fGdsb2JhbC5sb2NhdGlvbjtpZihudWxsPT11cmkpdXJpPWxvYy5wcm90b2NvbCtcIi8vXCIrbG9jLmhvc3Q7aWYoXCJzdHJpbmdcIj09dHlwZW9mIHVyaSl7aWYoXCIvXCI9PXVyaS5jaGFyQXQoMCkpe2lmKFwiL1wiPT11cmkuY2hhckF0KDEpKXt1cmk9bG9jLnByb3RvY29sK3VyaX1lbHNle3VyaT1sb2MuaG9zdCt1cml9fWlmKCEvXihodHRwcz98d3NzPyk6XFwvXFwvLy50ZXN0KHVyaSkpe2RlYnVnKFwicHJvdG9jb2wtbGVzcyB1cmwgJXNcIix1cmkpO2lmKFwidW5kZWZpbmVkXCIhPXR5cGVvZiBsb2Mpe3VyaT1sb2MucHJvdG9jb2wrXCIvL1wiK3VyaX1lbHNle3VyaT1cImh0dHBzOi8vXCIrdXJpfX1kZWJ1ZyhcInBhcnNlICVzXCIsdXJpKTtvYmo9cGFyc2V1cmkodXJpKX1pZighb2JqLnBvcnQpe2lmKC9eKGh0dHB8d3MpJC8udGVzdChvYmoucHJvdG9jb2wpKXtvYmoucG9ydD1cIjgwXCJ9ZWxzZSBpZigvXihodHRwfHdzKXMkLy50ZXN0KG9iai5wcm90b2NvbCkpe29iai5wb3J0PVwiNDQzXCJ9fW9iai5wYXRoPW9iai5wYXRofHxcIi9cIjt2YXIgaXB2Nj1vYmouaG9zdC5pbmRleE9mKFwiOlwiKSE9PS0xO3ZhciBob3N0PWlwdjY/XCJbXCIrb2JqLmhvc3QrXCJdXCI6b2JqLmhvc3Q7b2JqLmlkPW9iai5wcm90b2NvbCtcIjovL1wiK2hvc3QrXCI6XCIrb2JqLnBvcnQ7b2JqLmhyZWY9b2JqLnByb3RvY29sK1wiOi8vXCIraG9zdCsobG9jJiZsb2MucG9ydD09b2JqLnBvcnQ/XCJcIjpcIjpcIitvYmoucG9ydCk7cmV0dXJuIG9ian19KS5jYWxsKHRoaXMsdHlwZW9mIHNlbGYhPT1cInVuZGVmaW5lZFwiP3NlbGY6dHlwZW9mIHdpbmRvdyE9PVwidW5kZWZpbmVkXCI/d2luZG93OnR5cGVvZiBnbG9iYWwhPT1cInVuZGVmaW5lZFwiP2dsb2JhbDp7fSl9LHtkZWJ1ZzozOSxwYXJzZXVyaTo0NX1dLDM2OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXttb2R1bGUuZXhwb3J0cz1CYWNrb2ZmO2Z1bmN0aW9uIEJhY2tvZmYob3B0cyl7b3B0cz1vcHRzfHx7fTt0aGlzLm1zPW9wdHMubWlufHwxMDA7dGhpcy5tYXg9b3B0cy5tYXh8fDFlNDt0aGlzLmZhY3Rvcj1vcHRzLmZhY3Rvcnx8Mjt0aGlzLmppdHRlcj1vcHRzLmppdHRlcj4wJiZvcHRzLmppdHRlcjw9MT9vcHRzLmppdHRlcjowO3RoaXMuYXR0ZW1wdHM9MH1CYWNrb2ZmLnByb3RvdHlwZS5kdXJhdGlvbj1mdW5jdGlvbigpe3ZhciBtcz10aGlzLm1zKk1hdGgucG93KHRoaXMuZmFjdG9yLHRoaXMuYXR0ZW1wdHMrKyk7aWYodGhpcy5qaXR0ZXIpe3ZhciByYW5kPU1hdGgucmFuZG9tKCk7dmFyIGRldmlhdGlvbj1NYXRoLmZsb29yKHJhbmQqdGhpcy5qaXR0ZXIqbXMpO21zPShNYXRoLmZsb29yKHJhbmQqMTApJjEpPT0wP21zLWRldmlhdGlvbjptcytkZXZpYXRpb259cmV0dXJuIE1hdGgubWluKG1zLHRoaXMubWF4KXwwfTtCYWNrb2ZmLnByb3RvdHlwZS5yZXNldD1mdW5jdGlvbigpe3RoaXMuYXR0ZW1wdHM9MH07QmFja29mZi5wcm90b3R5cGUuc2V0TWluPWZ1bmN0aW9uKG1pbil7dGhpcy5tcz1taW59O0JhY2tvZmYucHJvdG90eXBlLnNldE1heD1mdW5jdGlvbihtYXgpe3RoaXMubWF4PW1heH07QmFja29mZi5wcm90b3R5cGUuc2V0Sml0dGVyPWZ1bmN0aW9uKGppdHRlcil7dGhpcy5qaXR0ZXI9aml0dGVyfX0se31dLDM3OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXt2YXIgc2xpY2U9W10uc2xpY2U7bW9kdWxlLmV4cG9ydHM9ZnVuY3Rpb24ob2JqLGZuKXtpZihcInN0cmluZ1wiPT10eXBlb2YgZm4pZm49b2JqW2ZuXTtpZihcImZ1bmN0aW9uXCIhPXR5cGVvZiBmbil0aHJvdyBuZXcgRXJyb3IoXCJiaW5kKCkgcmVxdWlyZXMgYSBmdW5jdGlvblwiKTt2YXIgYXJncz1zbGljZS5jYWxsKGFyZ3VtZW50cywyKTtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZm4uYXBwbHkob2JqLGFyZ3MuY29uY2F0KHNsaWNlLmNhbGwoYXJndW1lbnRzKSkpfX19LHt9XSwzODpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7bW9kdWxlLmV4cG9ydHM9RW1pdHRlcjtmdW5jdGlvbiBFbWl0dGVyKG9iail7aWYob2JqKXJldHVybiBtaXhpbihvYmopfWZ1bmN0aW9uIG1peGluKG9iail7Zm9yKHZhciBrZXkgaW4gRW1pdHRlci5wcm90b3R5cGUpe29ialtrZXldPUVtaXR0ZXIucHJvdG90eXBlW2tleV19cmV0dXJuIG9ian1FbWl0dGVyLnByb3RvdHlwZS5vbj1FbWl0dGVyLnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyPWZ1bmN0aW9uKGV2ZW50LGZuKXt0aGlzLl9jYWxsYmFja3M9dGhpcy5fY2FsbGJhY2tzfHx7fTsodGhpcy5fY2FsbGJhY2tzW1wiJFwiK2V2ZW50XT10aGlzLl9jYWxsYmFja3NbXCIkXCIrZXZlbnRdfHxbXSkucHVzaChmbik7cmV0dXJuIHRoaXN9O0VtaXR0ZXIucHJvdG90eXBlLm9uY2U9ZnVuY3Rpb24oZXZlbnQsZm4pe2Z1bmN0aW9uIG9uKCl7dGhpcy5vZmYoZXZlbnQsb24pO2ZuLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1vbi5mbj1mbjt0aGlzLm9uKGV2ZW50LG9uKTtyZXR1cm4gdGhpc307RW1pdHRlci5wcm90b3R5cGUub2ZmPUVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyPUVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUFsbExpc3RlbmVycz1FbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVFdmVudExpc3RlbmVyPWZ1bmN0aW9uKGV2ZW50LGZuKXt0aGlzLl9jYWxsYmFja3M9dGhpcy5fY2FsbGJhY2tzfHx7fTtpZigwPT1hcmd1bWVudHMubGVuZ3RoKXt0aGlzLl9jYWxsYmFja3M9e307cmV0dXJuIHRoaXN9dmFyIGNhbGxiYWNrcz10aGlzLl9jYWxsYmFja3NbXCIkXCIrZXZlbnRdO2lmKCFjYWxsYmFja3MpcmV0dXJuIHRoaXM7aWYoMT09YXJndW1lbnRzLmxlbmd0aCl7ZGVsZXRlIHRoaXMuX2NhbGxiYWNrc1tcIiRcIitldmVudF07cmV0dXJuIHRoaXN9dmFyIGNiO2Zvcih2YXIgaT0wO2k8Y2FsbGJhY2tzLmxlbmd0aDtpKyspe2NiPWNhbGxiYWNrc1tpXTtpZihjYj09PWZufHxjYi5mbj09PWZuKXtjYWxsYmFja3Muc3BsaWNlKGksMSk7YnJlYWt9fXJldHVybiB0aGlzfTtFbWl0dGVyLnByb3RvdHlwZS5lbWl0PWZ1bmN0aW9uKGV2ZW50KXt0aGlzLl9jYWxsYmFja3M9dGhpcy5fY2FsbGJhY2tzfHx7fTt2YXIgYXJncz1bXS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKSxjYWxsYmFja3M9dGhpcy5fY2FsbGJhY2tzW1wiJFwiK2V2ZW50XTtpZihjYWxsYmFja3Mpe2NhbGxiYWNrcz1jYWxsYmFja3Muc2xpY2UoMCk7Zm9yKHZhciBpPTAsbGVuPWNhbGxiYWNrcy5sZW5ndGg7aTxsZW47KytpKXtjYWxsYmFja3NbaV0uYXBwbHkodGhpcyxhcmdzKX19cmV0dXJuIHRoaXN9O0VtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVycz1mdW5jdGlvbihldmVudCl7dGhpcy5fY2FsbGJhY2tzPXRoaXMuX2NhbGxiYWNrc3x8e307cmV0dXJuIHRoaXMuX2NhbGxiYWNrc1tcIiRcIitldmVudF18fFtdfTtFbWl0dGVyLnByb3RvdHlwZS5oYXNMaXN0ZW5lcnM9ZnVuY3Rpb24oZXZlbnQpe3JldHVybiEhdGhpcy5saXN0ZW5lcnMoZXZlbnQpLmxlbmd0aH19LHt9XSwzOTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7YXJndW1lbnRzWzRdWzE3XVswXS5hcHBseShleHBvcnRzLGFyZ3VtZW50cyl9LHtcIi4vZGVidWdcIjo0MCxkdXA6MTd9XSw0MDpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7YXJndW1lbnRzWzRdWzE4XVswXS5hcHBseShleHBvcnRzLGFyZ3VtZW50cyl9LHtkdXA6MTgsbXM6NDR9XSw0MTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7KGZ1bmN0aW9uKGdsb2JhbCl7dmFyIGlzQXJyYXk9X2RlcmVxXyhcImlzYXJyYXlcIik7bW9kdWxlLmV4cG9ydHM9aGFzQmluYXJ5O2Z1bmN0aW9uIGhhc0JpbmFyeShkYXRhKXtmdW5jdGlvbiBfaGFzQmluYXJ5KG9iail7aWYoIW9iailyZXR1cm4gZmFsc2U7aWYoZ2xvYmFsLkJ1ZmZlciYmZ2xvYmFsLkJ1ZmZlci5pc0J1ZmZlciYmZ2xvYmFsLkJ1ZmZlci5pc0J1ZmZlcihvYmopfHxnbG9iYWwuQXJyYXlCdWZmZXImJm9iaiBpbnN0YW5jZW9mIEFycmF5QnVmZmVyfHxnbG9iYWwuQmxvYiYmb2JqIGluc3RhbmNlb2YgQmxvYnx8Z2xvYmFsLkZpbGUmJm9iaiBpbnN0YW5jZW9mIEZpbGUpe3JldHVybiB0cnVlfWlmKGlzQXJyYXkob2JqKSl7Zm9yKHZhciBpPTA7aTxvYmoubGVuZ3RoO2krKyl7aWYoX2hhc0JpbmFyeShvYmpbaV0pKXtyZXR1cm4gdHJ1ZX19fWVsc2UgaWYob2JqJiZcIm9iamVjdFwiPT10eXBlb2Ygb2JqKXtpZihvYmoudG9KU09OJiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBvYmoudG9KU09OKXtvYmo9b2JqLnRvSlNPTigpfWZvcih2YXIga2V5IGluIG9iail7aWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaixrZXkpJiZfaGFzQmluYXJ5KG9ialtrZXldKSl7cmV0dXJuIHRydWV9fX1yZXR1cm4gZmFsc2V9cmV0dXJuIF9oYXNCaW5hcnkoZGF0YSl9fSkuY2FsbCh0aGlzLHR5cGVvZiBzZWxmIT09XCJ1bmRlZmluZWRcIj9zZWxmOnR5cGVvZiB3aW5kb3chPT1cInVuZGVmaW5lZFwiP3dpbmRvdzp0eXBlb2YgZ2xvYmFsIT09XCJ1bmRlZmluZWRcIj9nbG9iYWw6e30pfSx7aXNhcnJheTo0M31dLDQyOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXthcmd1bWVudHNbNF1bMjNdWzBdLmFwcGx5KGV4cG9ydHMsYXJndW1lbnRzKX0se2R1cDoyM31dLDQzOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXthcmd1bWVudHNbNF1bMjRdWzBdLmFwcGx5KGV4cG9ydHMsYXJndW1lbnRzKX0se2R1cDoyNH1dLDQ0OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXthcmd1bWVudHNbNF1bMjVdWzBdLmFwcGx5KGV4cG9ydHMsYXJndW1lbnRzKX0se2R1cDoyNX1dLDQ1OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXthcmd1bWVudHNbNF1bMjhdWzBdLmFwcGx5KGV4cG9ydHMsYXJndW1lbnRzKX0se2R1cDoyOH1dLDQ2OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsoZnVuY3Rpb24oZ2xvYmFsKXt2YXIgaXNBcnJheT1fZGVyZXFfKFwiaXNhcnJheVwiKTt2YXIgaXNCdWY9X2RlcmVxXyhcIi4vaXMtYnVmZmVyXCIpO2V4cG9ydHMuZGVjb25zdHJ1Y3RQYWNrZXQ9ZnVuY3Rpb24ocGFja2V0KXt2YXIgYnVmZmVycz1bXTt2YXIgcGFja2V0RGF0YT1wYWNrZXQuZGF0YTtmdW5jdGlvbiBfZGVjb25zdHJ1Y3RQYWNrZXQoZGF0YSl7aWYoIWRhdGEpcmV0dXJuIGRhdGE7aWYoaXNCdWYoZGF0YSkpe3ZhciBwbGFjZWhvbGRlcj17X3BsYWNlaG9sZGVyOnRydWUsbnVtOmJ1ZmZlcnMubGVuZ3RofTtidWZmZXJzLnB1c2goZGF0YSk7cmV0dXJuIHBsYWNlaG9sZGVyfWVsc2UgaWYoaXNBcnJheShkYXRhKSl7dmFyIG5ld0RhdGE9bmV3IEFycmF5KGRhdGEubGVuZ3RoKTtmb3IodmFyIGk9MDtpPGRhdGEubGVuZ3RoO2krKyl7bmV3RGF0YVtpXT1fZGVjb25zdHJ1Y3RQYWNrZXQoZGF0YVtpXSl9cmV0dXJuIG5ld0RhdGF9ZWxzZSBpZihcIm9iamVjdFwiPT10eXBlb2YgZGF0YSYmIShkYXRhIGluc3RhbmNlb2YgRGF0ZSkpe3ZhciBuZXdEYXRhPXt9O2Zvcih2YXIga2V5IGluIGRhdGEpe25ld0RhdGFba2V5XT1fZGVjb25zdHJ1Y3RQYWNrZXQoZGF0YVtrZXldKX1yZXR1cm4gbmV3RGF0YX1yZXR1cm4gZGF0YX12YXIgcGFjaz1wYWNrZXQ7cGFjay5kYXRhPV9kZWNvbnN0cnVjdFBhY2tldChwYWNrZXREYXRhKTtwYWNrLmF0dGFjaG1lbnRzPWJ1ZmZlcnMubGVuZ3RoO3JldHVybntwYWNrZXQ6cGFjayxidWZmZXJzOmJ1ZmZlcnN9fTtleHBvcnRzLnJlY29uc3RydWN0UGFja2V0PWZ1bmN0aW9uKHBhY2tldCxidWZmZXJzKXt2YXIgY3VyUGxhY2VIb2xkZXI9MDtmdW5jdGlvbiBfcmVjb25zdHJ1Y3RQYWNrZXQoZGF0YSl7aWYoZGF0YSYmZGF0YS5fcGxhY2Vob2xkZXIpe3ZhciBidWY9YnVmZmVyc1tkYXRhLm51bV07cmV0dXJuIGJ1Zn1lbHNlIGlmKGlzQXJyYXkoZGF0YSkpe2Zvcih2YXIgaT0wO2k8ZGF0YS5sZW5ndGg7aSsrKXtkYXRhW2ldPV9yZWNvbnN0cnVjdFBhY2tldChkYXRhW2ldKX1yZXR1cm4gZGF0YX1lbHNlIGlmKGRhdGEmJlwib2JqZWN0XCI9PXR5cGVvZiBkYXRhKXtmb3IodmFyIGtleSBpbiBkYXRhKXtkYXRhW2tleV09X3JlY29uc3RydWN0UGFja2V0KGRhdGFba2V5XSl9cmV0dXJuIGRhdGF9cmV0dXJuIGRhdGF9cGFja2V0LmRhdGE9X3JlY29uc3RydWN0UGFja2V0KHBhY2tldC5kYXRhKTtwYWNrZXQuYXR0YWNobWVudHM9dW5kZWZpbmVkO3JldHVybiBwYWNrZXR9O2V4cG9ydHMucmVtb3ZlQmxvYnM9ZnVuY3Rpb24oZGF0YSxjYWxsYmFjayl7ZnVuY3Rpb24gX3JlbW92ZUJsb2JzKG9iaixjdXJLZXksY29udGFpbmluZ09iamVjdCl7aWYoIW9iailyZXR1cm4gb2JqO2lmKGdsb2JhbC5CbG9iJiZvYmogaW5zdGFuY2VvZiBCbG9ifHxnbG9iYWwuRmlsZSYmb2JqIGluc3RhbmNlb2YgRmlsZSl7cGVuZGluZ0Jsb2JzKys7dmFyIGZpbGVSZWFkZXI9bmV3IEZpbGVSZWFkZXI7ZmlsZVJlYWRlci5vbmxvYWQ9ZnVuY3Rpb24oKXtpZihjb250YWluaW5nT2JqZWN0KXtjb250YWluaW5nT2JqZWN0W2N1cktleV09dGhpcy5yZXN1bHR9ZWxzZXtibG9ibGVzc0RhdGE9dGhpcy5yZXN1bHR9aWYoIS0tcGVuZGluZ0Jsb2JzKXtjYWxsYmFjayhibG9ibGVzc0RhdGEpfX07ZmlsZVJlYWRlci5yZWFkQXNBcnJheUJ1ZmZlcihvYmopfWVsc2UgaWYoaXNBcnJheShvYmopKXtmb3IodmFyIGk9MDtpPG9iai5sZW5ndGg7aSsrKXtfcmVtb3ZlQmxvYnMob2JqW2ldLGksb2JqKX19ZWxzZSBpZihvYmomJlwib2JqZWN0XCI9PXR5cGVvZiBvYmomJiFpc0J1ZihvYmopKXtmb3IodmFyIGtleSBpbiBvYmope19yZW1vdmVCbG9icyhvYmpba2V5XSxrZXksb2JqKX19fXZhciBwZW5kaW5nQmxvYnM9MDt2YXIgYmxvYmxlc3NEYXRhPWRhdGE7X3JlbW92ZUJsb2JzKGJsb2JsZXNzRGF0YSk7aWYoIXBlbmRpbmdCbG9icyl7Y2FsbGJhY2soYmxvYmxlc3NEYXRhKX19fSkuY2FsbCh0aGlzLHR5cGVvZiBzZWxmIT09XCJ1bmRlZmluZWRcIj9zZWxmOnR5cGVvZiB3aW5kb3chPT1cInVuZGVmaW5lZFwiP3dpbmRvdzp0eXBlb2YgZ2xvYmFsIT09XCJ1bmRlZmluZWRcIj9nbG9iYWw6e30pfSx7XCIuL2lzLWJ1ZmZlclwiOjQ4LGlzYXJyYXk6NDN9XSw0NzpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7dmFyIGRlYnVnPV9kZXJlcV8oXCJkZWJ1Z1wiKShcInNvY2tldC5pby1wYXJzZXJcIik7dmFyIGpzb249X2RlcmVxXyhcImpzb24zXCIpO3ZhciBpc0FycmF5PV9kZXJlcV8oXCJpc2FycmF5XCIpO3ZhciBFbWl0dGVyPV9kZXJlcV8oXCJjb21wb25lbnQtZW1pdHRlclwiKTt2YXIgYmluYXJ5PV9kZXJlcV8oXCIuL2JpbmFyeVwiKTt2YXIgaXNCdWY9X2RlcmVxXyhcIi4vaXMtYnVmZmVyXCIpO2V4cG9ydHMucHJvdG9jb2w9NDtleHBvcnRzLnR5cGVzPVtcIkNPTk5FQ1RcIixcIkRJU0NPTk5FQ1RcIixcIkVWRU5UXCIsXCJCSU5BUllfRVZFTlRcIixcIkFDS1wiLFwiQklOQVJZX0FDS1wiLFwiRVJST1JcIl07ZXhwb3J0cy5DT05ORUNUPTA7ZXhwb3J0cy5ESVNDT05ORUNUPTE7ZXhwb3J0cy5FVkVOVD0yO2V4cG9ydHMuQUNLPTM7ZXhwb3J0cy5FUlJPUj00O2V4cG9ydHMuQklOQVJZX0VWRU5UPTU7ZXhwb3J0cy5CSU5BUllfQUNLPTY7ZXhwb3J0cy5FbmNvZGVyPUVuY29kZXI7ZXhwb3J0cy5EZWNvZGVyPURlY29kZXI7ZnVuY3Rpb24gRW5jb2Rlcigpe31FbmNvZGVyLnByb3RvdHlwZS5lbmNvZGU9ZnVuY3Rpb24ob2JqLGNhbGxiYWNrKXtkZWJ1ZyhcImVuY29kaW5nIHBhY2tldCAlalwiLG9iaik7aWYoZXhwb3J0cy5CSU5BUllfRVZFTlQ9PW9iai50eXBlfHxleHBvcnRzLkJJTkFSWV9BQ0s9PW9iai50eXBlKXtlbmNvZGVBc0JpbmFyeShvYmosY2FsbGJhY2spfWVsc2V7dmFyIGVuY29kaW5nPWVuY29kZUFzU3RyaW5nKG9iaik7Y2FsbGJhY2soW2VuY29kaW5nXSl9fTtmdW5jdGlvbiBlbmNvZGVBc1N0cmluZyhvYmope3ZhciBzdHI9XCJcIjt2YXIgbnNwPWZhbHNlO3N0cis9b2JqLnR5cGU7aWYoZXhwb3J0cy5CSU5BUllfRVZFTlQ9PW9iai50eXBlfHxleHBvcnRzLkJJTkFSWV9BQ0s9PW9iai50eXBlKXtzdHIrPW9iai5hdHRhY2htZW50cztzdHIrPVwiLVwifWlmKG9iai5uc3AmJlwiL1wiIT1vYmoubnNwKXtuc3A9dHJ1ZTtzdHIrPW9iai5uc3B9aWYobnVsbCE9b2JqLmlkKXtpZihuc3Ape3N0cis9XCIsXCI7bnNwPWZhbHNlfXN0cis9b2JqLmlkfWlmKG51bGwhPW9iai5kYXRhKXtpZihuc3Apc3RyKz1cIixcIjtzdHIrPWpzb24uc3RyaW5naWZ5KG9iai5kYXRhKX1kZWJ1ZyhcImVuY29kZWQgJWogYXMgJXNcIixvYmosc3RyKTtyZXR1cm4gc3RyfWZ1bmN0aW9uIGVuY29kZUFzQmluYXJ5KG9iaixjYWxsYmFjayl7ZnVuY3Rpb24gd3JpdGVFbmNvZGluZyhibG9ibGVzc0RhdGEpe3ZhciBkZWNvbnN0cnVjdGlvbj1iaW5hcnkuZGVjb25zdHJ1Y3RQYWNrZXQoYmxvYmxlc3NEYXRhKTt2YXIgcGFjaz1lbmNvZGVBc1N0cmluZyhkZWNvbnN0cnVjdGlvbi5wYWNrZXQpO3ZhciBidWZmZXJzPWRlY29uc3RydWN0aW9uLmJ1ZmZlcnM7YnVmZmVycy51bnNoaWZ0KHBhY2spO2NhbGxiYWNrKGJ1ZmZlcnMpfWJpbmFyeS5yZW1vdmVCbG9icyhvYmosd3JpdGVFbmNvZGluZyl9ZnVuY3Rpb24gRGVjb2Rlcigpe3RoaXMucmVjb25zdHJ1Y3Rvcj1udWxsfUVtaXR0ZXIoRGVjb2Rlci5wcm90b3R5cGUpO0RlY29kZXIucHJvdG90eXBlLmFkZD1mdW5jdGlvbihvYmope3ZhciBwYWNrZXQ7aWYoXCJzdHJpbmdcIj09dHlwZW9mIG9iail7cGFja2V0PWRlY29kZVN0cmluZyhvYmopO2lmKGV4cG9ydHMuQklOQVJZX0VWRU5UPT1wYWNrZXQudHlwZXx8ZXhwb3J0cy5CSU5BUllfQUNLPT1wYWNrZXQudHlwZSl7dGhpcy5yZWNvbnN0cnVjdG9yPW5ldyBCaW5hcnlSZWNvbnN0cnVjdG9yKHBhY2tldCk7aWYodGhpcy5yZWNvbnN0cnVjdG9yLnJlY29uUGFjay5hdHRhY2htZW50cz09PTApe3RoaXMuZW1pdChcImRlY29kZWRcIixwYWNrZXQpfX1lbHNle3RoaXMuZW1pdChcImRlY29kZWRcIixwYWNrZXQpfX1lbHNlIGlmKGlzQnVmKG9iail8fG9iai5iYXNlNjQpe2lmKCF0aGlzLnJlY29uc3RydWN0b3Ipe3Rocm93IG5ldyBFcnJvcihcImdvdCBiaW5hcnkgZGF0YSB3aGVuIG5vdCByZWNvbnN0cnVjdGluZyBhIHBhY2tldFwiKX1lbHNle3BhY2tldD10aGlzLnJlY29uc3RydWN0b3IudGFrZUJpbmFyeURhdGEob2JqKTtpZihwYWNrZXQpe3RoaXMucmVjb25zdHJ1Y3Rvcj1udWxsO3RoaXMuZW1pdChcImRlY29kZWRcIixwYWNrZXQpfX19ZWxzZXt0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIHR5cGU6IFwiK29iail9fTtmdW5jdGlvbiBkZWNvZGVTdHJpbmcoc3RyKXt2YXIgcD17fTt2YXIgaT0wO3AudHlwZT1OdW1iZXIoc3RyLmNoYXJBdCgwKSk7aWYobnVsbD09ZXhwb3J0cy50eXBlc1twLnR5cGVdKXJldHVybiBlcnJvcigpO2lmKGV4cG9ydHMuQklOQVJZX0VWRU5UPT1wLnR5cGV8fGV4cG9ydHMuQklOQVJZX0FDSz09cC50eXBlKXt2YXIgYnVmPVwiXCI7d2hpbGUoc3RyLmNoYXJBdCgrK2kpIT1cIi1cIil7YnVmKz1zdHIuY2hhckF0KGkpO2lmKGk9PXN0ci5sZW5ndGgpYnJlYWt9aWYoYnVmIT1OdW1iZXIoYnVmKXx8c3RyLmNoYXJBdChpKSE9XCItXCIpe3Rocm93IG5ldyBFcnJvcihcIklsbGVnYWwgYXR0YWNobWVudHNcIil9cC5hdHRhY2htZW50cz1OdW1iZXIoYnVmKX1pZihcIi9cIj09c3RyLmNoYXJBdChpKzEpKXtwLm5zcD1cIlwiO3doaWxlKCsraSl7dmFyIGM9c3RyLmNoYXJBdChpKTtpZihcIixcIj09YylicmVhaztwLm5zcCs9YztpZihpPT1zdHIubGVuZ3RoKWJyZWFrfX1lbHNle3AubnNwPVwiL1wifXZhciBuZXh0PXN0ci5jaGFyQXQoaSsxKTtpZihcIlwiIT09bmV4dCYmTnVtYmVyKG5leHQpPT1uZXh0KXtwLmlkPVwiXCI7d2hpbGUoKytpKXt2YXIgYz1zdHIuY2hhckF0KGkpO2lmKG51bGw9PWN8fE51bWJlcihjKSE9Yyl7LS1pO2JyZWFrfXAuaWQrPXN0ci5jaGFyQXQoaSk7aWYoaT09c3RyLmxlbmd0aClicmVha31wLmlkPU51bWJlcihwLmlkKX1pZihzdHIuY2hhckF0KCsraSkpe3RyeXtwLmRhdGE9anNvbi5wYXJzZShzdHIuc3Vic3RyKGkpKX1jYXRjaChlKXtyZXR1cm4gZXJyb3IoKX19ZGVidWcoXCJkZWNvZGVkICVzIGFzICVqXCIsc3RyLHApO3JldHVybiBwfURlY29kZXIucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXtpZih0aGlzLnJlY29uc3RydWN0b3Ipe3RoaXMucmVjb25zdHJ1Y3Rvci5maW5pc2hlZFJlY29uc3RydWN0aW9uKCl9fTtmdW5jdGlvbiBCaW5hcnlSZWNvbnN0cnVjdG9yKHBhY2tldCl7dGhpcy5yZWNvblBhY2s9cGFja2V0O3RoaXMuYnVmZmVycz1bXX1CaW5hcnlSZWNvbnN0cnVjdG9yLnByb3RvdHlwZS50YWtlQmluYXJ5RGF0YT1mdW5jdGlvbihiaW5EYXRhKXt0aGlzLmJ1ZmZlcnMucHVzaChiaW5EYXRhKTtpZih0aGlzLmJ1ZmZlcnMubGVuZ3RoPT10aGlzLnJlY29uUGFjay5hdHRhY2htZW50cyl7dmFyIHBhY2tldD1iaW5hcnkucmVjb25zdHJ1Y3RQYWNrZXQodGhpcy5yZWNvblBhY2ssdGhpcy5idWZmZXJzKTt0aGlzLmZpbmlzaGVkUmVjb25zdHJ1Y3Rpb24oKTtyZXR1cm4gcGFja2V0fXJldHVybiBudWxsfTtCaW5hcnlSZWNvbnN0cnVjdG9yLnByb3RvdHlwZS5maW5pc2hlZFJlY29uc3RydWN0aW9uPWZ1bmN0aW9uKCl7dGhpcy5yZWNvblBhY2s9bnVsbDt0aGlzLmJ1ZmZlcnM9W119O2Z1bmN0aW9uIGVycm9yKGRhdGEpe3JldHVybnt0eXBlOmV4cG9ydHMuRVJST1IsZGF0YTpcInBhcnNlciBlcnJvclwifX19LHtcIi4vYmluYXJ5XCI6NDYsXCIuL2lzLWJ1ZmZlclwiOjQ4LFwiY29tcG9uZW50LWVtaXR0ZXJcIjo0OSxkZWJ1ZzozOSxpc2FycmF5OjQzLGpzb24zOjUwfV0sNDg6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeyhmdW5jdGlvbihnbG9iYWwpe21vZHVsZS5leHBvcnRzPWlzQnVmO2Z1bmN0aW9uIGlzQnVmKG9iail7cmV0dXJuIGdsb2JhbC5CdWZmZXImJmdsb2JhbC5CdWZmZXIuaXNCdWZmZXIob2JqKXx8Z2xvYmFsLkFycmF5QnVmZmVyJiZvYmogaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcn19KS5jYWxsKHRoaXMsdHlwZW9mIHNlbGYhPT1cInVuZGVmaW5lZFwiP3NlbGY6dHlwZW9mIHdpbmRvdyE9PVwidW5kZWZpbmVkXCI/d2luZG93OnR5cGVvZiBnbG9iYWwhPT1cInVuZGVmaW5lZFwiP2dsb2JhbDp7fSl9LHt9XSw0OTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7YXJndW1lbnRzWzRdWzE1XVswXS5hcHBseShleHBvcnRzLGFyZ3VtZW50cyl9LHtkdXA6MTV9XSw1MDpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7KGZ1bmN0aW9uKGdsb2JhbCl7KGZ1bmN0aW9uKCl7dmFyIGlzTG9hZGVyPXR5cGVvZiBkZWZpbmU9PT1cImZ1bmN0aW9uXCImJmRlZmluZS5hbWQ7dmFyIG9iamVjdFR5cGVzPXtcImZ1bmN0aW9uXCI6dHJ1ZSxvYmplY3Q6dHJ1ZX07dmFyIGZyZWVFeHBvcnRzPW9iamVjdFR5cGVzW3R5cGVvZiBleHBvcnRzXSYmZXhwb3J0cyYmIWV4cG9ydHMubm9kZVR5cGUmJmV4cG9ydHM7dmFyIHJvb3Q9b2JqZWN0VHlwZXNbdHlwZW9mIHdpbmRvd10mJndpbmRvd3x8dGhpcyxmcmVlR2xvYmFsPWZyZWVFeHBvcnRzJiZvYmplY3RUeXBlc1t0eXBlb2YgbW9kdWxlXSYmbW9kdWxlJiYhbW9kdWxlLm5vZGVUeXBlJiZ0eXBlb2YgZ2xvYmFsPT1cIm9iamVjdFwiJiZnbG9iYWw7aWYoZnJlZUdsb2JhbCYmKGZyZWVHbG9iYWxbXCJnbG9iYWxcIl09PT1mcmVlR2xvYmFsfHxmcmVlR2xvYmFsW1wid2luZG93XCJdPT09ZnJlZUdsb2JhbHx8ZnJlZUdsb2JhbFtcInNlbGZcIl09PT1mcmVlR2xvYmFsKSl7cm9vdD1mcmVlR2xvYmFsfWZ1bmN0aW9uIHJ1bkluQ29udGV4dChjb250ZXh0LGV4cG9ydHMpe2NvbnRleHR8fChjb250ZXh0PXJvb3RbXCJPYmplY3RcIl0oKSk7ZXhwb3J0c3x8KGV4cG9ydHM9cm9vdFtcIk9iamVjdFwiXSgpKTt2YXIgTnVtYmVyPWNvbnRleHRbXCJOdW1iZXJcIl18fHJvb3RbXCJOdW1iZXJcIl0sU3RyaW5nPWNvbnRleHRbXCJTdHJpbmdcIl18fHJvb3RbXCJTdHJpbmdcIl0sT2JqZWN0PWNvbnRleHRbXCJPYmplY3RcIl18fHJvb3RbXCJPYmplY3RcIl0sRGF0ZT1jb250ZXh0W1wiRGF0ZVwiXXx8cm9vdFtcIkRhdGVcIl0sU3ludGF4RXJyb3I9Y29udGV4dFtcIlN5bnRheEVycm9yXCJdfHxyb290W1wiU3ludGF4RXJyb3JcIl0sVHlwZUVycm9yPWNvbnRleHRbXCJUeXBlRXJyb3JcIl18fHJvb3RbXCJUeXBlRXJyb3JcIl0sTWF0aD1jb250ZXh0W1wiTWF0aFwiXXx8cm9vdFtcIk1hdGhcIl0sbmF0aXZlSlNPTj1jb250ZXh0W1wiSlNPTlwiXXx8cm9vdFtcIkpTT05cIl07aWYodHlwZW9mIG5hdGl2ZUpTT049PVwib2JqZWN0XCImJm5hdGl2ZUpTT04pe2V4cG9ydHMuc3RyaW5naWZ5PW5hdGl2ZUpTT04uc3RyaW5naWZ5O2V4cG9ydHMucGFyc2U9bmF0aXZlSlNPTi5wYXJzZX12YXIgb2JqZWN0UHJvdG89T2JqZWN0LnByb3RvdHlwZSxnZXRDbGFzcz1vYmplY3RQcm90by50b1N0cmluZyxpc1Byb3BlcnR5LGZvckVhY2gsdW5kZWY7dmFyIGlzRXh0ZW5kZWQ9bmV3IERhdGUoLTB4Yzc4MmI1YjgwMGNlYyk7dHJ5e2lzRXh0ZW5kZWQ9aXNFeHRlbmRlZC5nZXRVVENGdWxsWWVhcigpPT0tMTA5MjUyJiZpc0V4dGVuZGVkLmdldFVUQ01vbnRoKCk9PT0wJiZpc0V4dGVuZGVkLmdldFVUQ0RhdGUoKT09PTEmJmlzRXh0ZW5kZWQuZ2V0VVRDSG91cnMoKT09MTAmJmlzRXh0ZW5kZWQuZ2V0VVRDTWludXRlcygpPT0zNyYmaXNFeHRlbmRlZC5nZXRVVENTZWNvbmRzKCk9PTYmJmlzRXh0ZW5kZWQuZ2V0VVRDTWlsbGlzZWNvbmRzKCk9PTcwOH1jYXRjaChleGNlcHRpb24pe31mdW5jdGlvbiBoYXMobmFtZSl7aWYoaGFzW25hbWVdIT09dW5kZWYpe3JldHVybiBoYXNbbmFtZV19dmFyIGlzU3VwcG9ydGVkO2lmKG5hbWU9PVwiYnVnLXN0cmluZy1jaGFyLWluZGV4XCIpe2lzU3VwcG9ydGVkPVwiYVwiWzBdIT1cImFcIn1lbHNlIGlmKG5hbWU9PVwianNvblwiKXtpc1N1cHBvcnRlZD1oYXMoXCJqc29uLXN0cmluZ2lmeVwiKSYmaGFzKFwianNvbi1wYXJzZVwiKX1lbHNle3ZhciB2YWx1ZSxzZXJpYWxpemVkPSd7XCJhXCI6WzEsdHJ1ZSxmYWxzZSxudWxsLFwiXFxcXHUwMDAwXFxcXGJcXFxcblxcXFxmXFxcXHJcXFxcdFwiXX0nO2lmKG5hbWU9PVwianNvbi1zdHJpbmdpZnlcIil7dmFyIHN0cmluZ2lmeT1leHBvcnRzLnN0cmluZ2lmeSxzdHJpbmdpZnlTdXBwb3J0ZWQ9dHlwZW9mIHN0cmluZ2lmeT09XCJmdW5jdGlvblwiJiZpc0V4dGVuZGVkO2lmKHN0cmluZ2lmeVN1cHBvcnRlZCl7KHZhbHVlPWZ1bmN0aW9uKCl7cmV0dXJuIDF9KS50b0pTT049dmFsdWU7dHJ5e3N0cmluZ2lmeVN1cHBvcnRlZD1zdHJpbmdpZnkoMCk9PT1cIjBcIiYmc3RyaW5naWZ5KG5ldyBOdW1iZXIpPT09XCIwXCImJnN0cmluZ2lmeShuZXcgU3RyaW5nKT09J1wiXCInJiZzdHJpbmdpZnkoZ2V0Q2xhc3MpPT09dW5kZWYmJnN0cmluZ2lmeSh1bmRlZik9PT11bmRlZiYmc3RyaW5naWZ5KCk9PT11bmRlZiYmc3RyaW5naWZ5KHZhbHVlKT09PVwiMVwiJiZzdHJpbmdpZnkoW3ZhbHVlXSk9PVwiWzFdXCImJnN0cmluZ2lmeShbdW5kZWZdKT09XCJbbnVsbF1cIiYmc3RyaW5naWZ5KG51bGwpPT1cIm51bGxcIiYmc3RyaW5naWZ5KFt1bmRlZixnZXRDbGFzcyxudWxsXSk9PVwiW251bGwsbnVsbCxudWxsXVwiJiZzdHJpbmdpZnkoe2E6W3ZhbHVlLHRydWUsZmFsc2UsbnVsbCxcIlxceDAwXFxiXFxuXFxmXFxyXHRcIl19KT09c2VyaWFsaXplZCYmc3RyaW5naWZ5KG51bGwsdmFsdWUpPT09XCIxXCImJnN0cmluZ2lmeShbMSwyXSxudWxsLDEpPT1cIltcXG4gMSxcXG4gMlxcbl1cIiYmc3RyaW5naWZ5KG5ldyBEYXRlKC04NjRlMTMpKT09J1wiLTI3MTgyMS0wNC0yMFQwMDowMDowMC4wMDBaXCInJiZzdHJpbmdpZnkobmV3IERhdGUoODY0ZTEzKSk9PSdcIisyNzU3NjAtMDktMTNUMDA6MDA6MDAuMDAwWlwiJyYmc3RyaW5naWZ5KG5ldyBEYXRlKC02MjE5ODc1NTJlNSkpPT0nXCItMDAwMDAxLTAxLTAxVDAwOjAwOjAwLjAwMFpcIicmJnN0cmluZ2lmeShuZXcgRGF0ZSgtMSkpPT0nXCIxOTY5LTEyLTMxVDIzOjU5OjU5Ljk5OVpcIid9Y2F0Y2goZXhjZXB0aW9uKXtzdHJpbmdpZnlTdXBwb3J0ZWQ9ZmFsc2V9fWlzU3VwcG9ydGVkPXN0cmluZ2lmeVN1cHBvcnRlZH1pZihuYW1lPT1cImpzb24tcGFyc2VcIil7dmFyIHBhcnNlPWV4cG9ydHMucGFyc2U7aWYodHlwZW9mIHBhcnNlPT1cImZ1bmN0aW9uXCIpe3RyeXtpZihwYXJzZShcIjBcIik9PT0wJiYhcGFyc2UoZmFsc2UpKXt2YWx1ZT1wYXJzZShzZXJpYWxpemVkKTt2YXIgcGFyc2VTdXBwb3J0ZWQ9dmFsdWVbXCJhXCJdLmxlbmd0aD09NSYmdmFsdWVbXCJhXCJdWzBdPT09MTtpZihwYXJzZVN1cHBvcnRlZCl7dHJ5e3BhcnNlU3VwcG9ydGVkPSFwYXJzZSgnXCJcdFwiJyl9Y2F0Y2goZXhjZXB0aW9uKXt9aWYocGFyc2VTdXBwb3J0ZWQpe3RyeXtwYXJzZVN1cHBvcnRlZD1wYXJzZShcIjAxXCIpIT09MX1jYXRjaChleGNlcHRpb24pe319aWYocGFyc2VTdXBwb3J0ZWQpe3RyeXtwYXJzZVN1cHBvcnRlZD1wYXJzZShcIjEuXCIpIT09MX1jYXRjaChleGNlcHRpb24pe319fX19Y2F0Y2goZXhjZXB0aW9uKXtwYXJzZVN1cHBvcnRlZD1mYWxzZX19aXNTdXBwb3J0ZWQ9cGFyc2VTdXBwb3J0ZWR9fXJldHVybiBoYXNbbmFtZV09ISFpc1N1cHBvcnRlZH1pZighaGFzKFwianNvblwiKSl7dmFyIGZ1bmN0aW9uQ2xhc3M9XCJbb2JqZWN0IEZ1bmN0aW9uXVwiLGRhdGVDbGFzcz1cIltvYmplY3QgRGF0ZV1cIixudW1iZXJDbGFzcz1cIltvYmplY3QgTnVtYmVyXVwiLHN0cmluZ0NsYXNzPVwiW29iamVjdCBTdHJpbmddXCIsYXJyYXlDbGFzcz1cIltvYmplY3QgQXJyYXldXCIsYm9vbGVhbkNsYXNzPVwiW29iamVjdCBCb29sZWFuXVwiO3ZhciBjaGFySW5kZXhCdWdneT1oYXMoXCJidWctc3RyaW5nLWNoYXItaW5kZXhcIik7aWYoIWlzRXh0ZW5kZWQpe3ZhciBmbG9vcj1NYXRoLmZsb29yO3ZhciBNb250aHM9WzAsMzEsNTksOTAsMTIwLDE1MSwxODEsMjEyLDI0MywyNzMsMzA0LDMzNF07dmFyIGdldERheT1mdW5jdGlvbih5ZWFyLG1vbnRoKXtyZXR1cm4gTW9udGhzW21vbnRoXSszNjUqKHllYXItMTk3MCkrZmxvb3IoKHllYXItMTk2OSsobW9udGg9Kyhtb250aD4xKSkpLzQpLWZsb29yKCh5ZWFyLTE5MDErbW9udGgpLzEwMCkrZmxvb3IoKHllYXItMTYwMSttb250aCkvNDAwKX19aWYoIShpc1Byb3BlcnR5PW9iamVjdFByb3RvLmhhc093blByb3BlcnR5KSl7aXNQcm9wZXJ0eT1mdW5jdGlvbihwcm9wZXJ0eSl7dmFyIG1lbWJlcnM9e30sY29uc3RydWN0b3I7aWYoKG1lbWJlcnMuX19wcm90b19fPW51bGwsbWVtYmVycy5fX3Byb3RvX189e3RvU3RyaW5nOjF9LG1lbWJlcnMpLnRvU3RyaW5nIT1nZXRDbGFzcyl7aXNQcm9wZXJ0eT1mdW5jdGlvbihwcm9wZXJ0eSl7dmFyIG9yaWdpbmFsPXRoaXMuX19wcm90b19fLHJlc3VsdD1wcm9wZXJ0eSBpbih0aGlzLl9fcHJvdG9fXz1udWxsLHRoaXMpO3RoaXMuX19wcm90b19fPW9yaWdpbmFsO3JldHVybiByZXN1bHR9fWVsc2V7Y29uc3RydWN0b3I9bWVtYmVycy5jb25zdHJ1Y3Rvcjtpc1Byb3BlcnR5PWZ1bmN0aW9uKHByb3BlcnR5KXt2YXIgcGFyZW50PSh0aGlzLmNvbnN0cnVjdG9yfHxjb25zdHJ1Y3RvcikucHJvdG90eXBlO3JldHVybiBwcm9wZXJ0eSBpbiB0aGlzJiYhKHByb3BlcnR5IGluIHBhcmVudCYmdGhpc1twcm9wZXJ0eV09PT1wYXJlbnRbcHJvcGVydHldKX19bWVtYmVycz1udWxsO3JldHVybiBpc1Byb3BlcnR5LmNhbGwodGhpcyxwcm9wZXJ0eSl9fWZvckVhY2g9ZnVuY3Rpb24ob2JqZWN0LGNhbGxiYWNrKXt2YXIgc2l6ZT0wLFByb3BlcnRpZXMsbWVtYmVycyxwcm9wZXJ0eTsoUHJvcGVydGllcz1mdW5jdGlvbigpe3RoaXMudmFsdWVPZj0wfSkucHJvdG90eXBlLnZhbHVlT2Y9MDttZW1iZXJzPW5ldyBQcm9wZXJ0aWVzO2Zvcihwcm9wZXJ0eSBpbiBtZW1iZXJzKXtpZihpc1Byb3BlcnR5LmNhbGwobWVtYmVycyxwcm9wZXJ0eSkpe3NpemUrK319UHJvcGVydGllcz1tZW1iZXJzPW51bGw7aWYoIXNpemUpe21lbWJlcnM9W1widmFsdWVPZlwiLFwidG9TdHJpbmdcIixcInRvTG9jYWxlU3RyaW5nXCIsXCJwcm9wZXJ0eUlzRW51bWVyYWJsZVwiLFwiaXNQcm90b3R5cGVPZlwiLFwiaGFzT3duUHJvcGVydHlcIixcImNvbnN0cnVjdG9yXCJdO2ZvckVhY2g9ZnVuY3Rpb24ob2JqZWN0LGNhbGxiYWNrKXt2YXIgaXNGdW5jdGlvbj1nZXRDbGFzcy5jYWxsKG9iamVjdCk9PWZ1bmN0aW9uQ2xhc3MscHJvcGVydHksbGVuZ3RoO3ZhciBoYXNQcm9wZXJ0eT0haXNGdW5jdGlvbiYmdHlwZW9mIG9iamVjdC5jb25zdHJ1Y3RvciE9XCJmdW5jdGlvblwiJiZvYmplY3RUeXBlc1t0eXBlb2Ygb2JqZWN0Lmhhc093blByb3BlcnR5XSYmb2JqZWN0Lmhhc093blByb3BlcnR5fHxpc1Byb3BlcnR5O2Zvcihwcm9wZXJ0eSBpbiBvYmplY3Qpe2lmKCEoaXNGdW5jdGlvbiYmcHJvcGVydHk9PVwicHJvdG90eXBlXCIpJiZoYXNQcm9wZXJ0eS5jYWxsKG9iamVjdCxwcm9wZXJ0eSkpe2NhbGxiYWNrKHByb3BlcnR5KX19Zm9yKGxlbmd0aD1tZW1iZXJzLmxlbmd0aDtwcm9wZXJ0eT1tZW1iZXJzWy0tbGVuZ3RoXTtoYXNQcm9wZXJ0eS5jYWxsKG9iamVjdCxwcm9wZXJ0eSkmJmNhbGxiYWNrKHByb3BlcnR5KSk7fX1lbHNlIGlmKHNpemU9PTIpe2ZvckVhY2g9ZnVuY3Rpb24ob2JqZWN0LGNhbGxiYWNrKXt2YXIgbWVtYmVycz17fSxpc0Z1bmN0aW9uPWdldENsYXNzLmNhbGwob2JqZWN0KT09ZnVuY3Rpb25DbGFzcyxwcm9wZXJ0eTtmb3IocHJvcGVydHkgaW4gb2JqZWN0KXtpZighKGlzRnVuY3Rpb24mJnByb3BlcnR5PT1cInByb3RvdHlwZVwiKSYmIWlzUHJvcGVydHkuY2FsbChtZW1iZXJzLHByb3BlcnR5KSYmKG1lbWJlcnNbcHJvcGVydHldPTEpJiZpc1Byb3BlcnR5LmNhbGwob2JqZWN0LHByb3BlcnR5KSl7Y2FsbGJhY2socHJvcGVydHkpfX19fWVsc2V7Zm9yRWFjaD1mdW5jdGlvbihvYmplY3QsY2FsbGJhY2spe3ZhciBpc0Z1bmN0aW9uPWdldENsYXNzLmNhbGwob2JqZWN0KT09ZnVuY3Rpb25DbGFzcyxwcm9wZXJ0eSxpc0NvbnN0cnVjdG9yO2Zvcihwcm9wZXJ0eSBpbiBvYmplY3Qpe2lmKCEoaXNGdW5jdGlvbiYmcHJvcGVydHk9PVwicHJvdG90eXBlXCIpJiZpc1Byb3BlcnR5LmNhbGwob2JqZWN0LHByb3BlcnR5KSYmIShpc0NvbnN0cnVjdG9yPXByb3BlcnR5PT09XCJjb25zdHJ1Y3RvclwiKSl7Y2FsbGJhY2socHJvcGVydHkpfX1pZihpc0NvbnN0cnVjdG9yfHxpc1Byb3BlcnR5LmNhbGwob2JqZWN0LHByb3BlcnR5PVwiY29uc3RydWN0b3JcIikpe2NhbGxiYWNrKHByb3BlcnR5KX19fXJldHVybiBmb3JFYWNoKG9iamVjdCxjYWxsYmFjayl9O2lmKCFoYXMoXCJqc29uLXN0cmluZ2lmeVwiKSl7dmFyIEVzY2FwZXM9ezkyOlwiXFxcXFxcXFxcIiwzNDonXFxcXFwiJyw4OlwiXFxcXGJcIiwxMjpcIlxcXFxmXCIsMTA6XCJcXFxcblwiLDEzOlwiXFxcXHJcIiw5OlwiXFxcXHRcIn07dmFyIGxlYWRpbmdaZXJvZXM9XCIwMDAwMDBcIjt2YXIgdG9QYWRkZWRTdHJpbmc9ZnVuY3Rpb24od2lkdGgsdmFsdWUpe3JldHVybihsZWFkaW5nWmVyb2VzKyh2YWx1ZXx8MCkpLnNsaWNlKC13aWR0aCl9O3ZhciB1bmljb2RlUHJlZml4PVwiXFxcXHUwMFwiO3ZhciBxdW90ZT1mdW5jdGlvbih2YWx1ZSl7dmFyIHJlc3VsdD0nXCInLGluZGV4PTAsbGVuZ3RoPXZhbHVlLmxlbmd0aCx1c2VDaGFySW5kZXg9IWNoYXJJbmRleEJ1Z2d5fHxsZW5ndGg+MTA7dmFyIHN5bWJvbHM9dXNlQ2hhckluZGV4JiYoY2hhckluZGV4QnVnZ3k/dmFsdWUuc3BsaXQoXCJcIik6dmFsdWUpO2Zvcig7aW5kZXg8bGVuZ3RoO2luZGV4Kyspe3ZhciBjaGFyQ29kZT12YWx1ZS5jaGFyQ29kZUF0KGluZGV4KTtzd2l0Y2goY2hhckNvZGUpe2Nhc2UgODpjYXNlIDk6Y2FzZSAxMDpjYXNlIDEyOmNhc2UgMTM6Y2FzZSAzNDpjYXNlIDkyOnJlc3VsdCs9RXNjYXBlc1tjaGFyQ29kZV07YnJlYWs7ZGVmYXVsdDppZihjaGFyQ29kZTwzMil7cmVzdWx0Kz11bmljb2RlUHJlZml4K3RvUGFkZGVkU3RyaW5nKDIsY2hhckNvZGUudG9TdHJpbmcoMTYpKTticmVha31yZXN1bHQrPXVzZUNoYXJJbmRleD9zeW1ib2xzW2luZGV4XTp2YWx1ZS5jaGFyQXQoaW5kZXgpfX1yZXR1cm4gcmVzdWx0KydcIid9O3ZhciBzZXJpYWxpemU9ZnVuY3Rpb24ocHJvcGVydHksb2JqZWN0LGNhbGxiYWNrLHByb3BlcnRpZXMsd2hpdGVzcGFjZSxpbmRlbnRhdGlvbixzdGFjayl7dmFyIHZhbHVlLGNsYXNzTmFtZSx5ZWFyLG1vbnRoLGRhdGUsdGltZSxob3VycyxtaW51dGVzLHNlY29uZHMsbWlsbGlzZWNvbmRzLHJlc3VsdHMsZWxlbWVudCxpbmRleCxsZW5ndGgscHJlZml4LHJlc3VsdDt0cnl7dmFsdWU9b2JqZWN0W3Byb3BlcnR5XX1jYXRjaChleGNlcHRpb24pe31pZih0eXBlb2YgdmFsdWU9PVwib2JqZWN0XCImJnZhbHVlKXtjbGFzc05hbWU9Z2V0Q2xhc3MuY2FsbCh2YWx1ZSk7aWYoY2xhc3NOYW1lPT1kYXRlQ2xhc3MmJiFpc1Byb3BlcnR5LmNhbGwodmFsdWUsXCJ0b0pTT05cIikpe2lmKHZhbHVlPi0xLzAmJnZhbHVlPDEvMCl7aWYoZ2V0RGF5KXtkYXRlPWZsb29yKHZhbHVlLzg2NGU1KTtmb3IoeWVhcj1mbG9vcihkYXRlLzM2NS4yNDI1KSsxOTcwLTE7Z2V0RGF5KHllYXIrMSwwKTw9ZGF0ZTt5ZWFyKyspO2Zvcihtb250aD1mbG9vcigoZGF0ZS1nZXREYXkoeWVhciwwKSkvMzAuNDIpO2dldERheSh5ZWFyLG1vbnRoKzEpPD1kYXRlO21vbnRoKyspO2RhdGU9MStkYXRlLWdldERheSh5ZWFyLG1vbnRoKTt0aW1lPSh2YWx1ZSU4NjRlNSs4NjRlNSklODY0ZTU7aG91cnM9Zmxvb3IodGltZS8zNmU1KSUyNDttaW51dGVzPWZsb29yKHRpbWUvNmU0KSU2MDtzZWNvbmRzPWZsb29yKHRpbWUvMWUzKSU2MDttaWxsaXNlY29uZHM9dGltZSUxZTN9ZWxzZXt5ZWFyPXZhbHVlLmdldFVUQ0Z1bGxZZWFyKCk7bW9udGg9dmFsdWUuZ2V0VVRDTW9udGgoKTtkYXRlPXZhbHVlLmdldFVUQ0RhdGUoKTtob3Vycz12YWx1ZS5nZXRVVENIb3VycygpO21pbnV0ZXM9dmFsdWUuZ2V0VVRDTWludXRlcygpO3NlY29uZHM9dmFsdWUuZ2V0VVRDU2Vjb25kcygpO21pbGxpc2Vjb25kcz12YWx1ZS5nZXRVVENNaWxsaXNlY29uZHMoKX12YWx1ZT0oeWVhcjw9MHx8eWVhcj49MWU0Pyh5ZWFyPDA/XCItXCI6XCIrXCIpK3RvUGFkZGVkU3RyaW5nKDYseWVhcjwwPy15ZWFyOnllYXIpOnRvUGFkZGVkU3RyaW5nKDQseWVhcikpK1wiLVwiK3RvUGFkZGVkU3RyaW5nKDIsbW9udGgrMSkrXCItXCIrdG9QYWRkZWRTdHJpbmcoMixkYXRlKStcIlRcIit0b1BhZGRlZFN0cmluZygyLGhvdXJzKStcIjpcIit0b1BhZGRlZFN0cmluZygyLG1pbnV0ZXMpK1wiOlwiK3RvUGFkZGVkU3RyaW5nKDIsc2Vjb25kcykrXCIuXCIrdG9QYWRkZWRTdHJpbmcoMyxtaWxsaXNlY29uZHMpK1wiWlwifWVsc2V7dmFsdWU9bnVsbH19ZWxzZSBpZih0eXBlb2YgdmFsdWUudG9KU09OPT1cImZ1bmN0aW9uXCImJihjbGFzc05hbWUhPW51bWJlckNsYXNzJiZjbGFzc05hbWUhPXN0cmluZ0NsYXNzJiZjbGFzc05hbWUhPWFycmF5Q2xhc3N8fGlzUHJvcGVydHkuY2FsbCh2YWx1ZSxcInRvSlNPTlwiKSkpe3ZhbHVlPXZhbHVlLnRvSlNPTihwcm9wZXJ0eSl9fWlmKGNhbGxiYWNrKXt2YWx1ZT1jYWxsYmFjay5jYWxsKG9iamVjdCxwcm9wZXJ0eSx2YWx1ZSl9aWYodmFsdWU9PT1udWxsKXtyZXR1cm5cIm51bGxcIn1jbGFzc05hbWU9Z2V0Q2xhc3MuY2FsbCh2YWx1ZSk7aWYoY2xhc3NOYW1lPT1ib29sZWFuQ2xhc3Mpe3JldHVyblwiXCIrdmFsdWV9ZWxzZSBpZihjbGFzc05hbWU9PW51bWJlckNsYXNzKXtyZXR1cm4gdmFsdWU+LTEvMCYmdmFsdWU8MS8wP1wiXCIrdmFsdWU6XCJudWxsXCJ9ZWxzZSBpZihjbGFzc05hbWU9PXN0cmluZ0NsYXNzKXtyZXR1cm4gcXVvdGUoXCJcIit2YWx1ZSl9aWYodHlwZW9mIHZhbHVlPT1cIm9iamVjdFwiKXtmb3IobGVuZ3RoPXN0YWNrLmxlbmd0aDtsZW5ndGgtLTspe2lmKHN0YWNrW2xlbmd0aF09PT12YWx1ZSl7dGhyb3cgVHlwZUVycm9yKCl9fXN0YWNrLnB1c2godmFsdWUpO3Jlc3VsdHM9W107cHJlZml4PWluZGVudGF0aW9uO2luZGVudGF0aW9uKz13aGl0ZXNwYWNlO2lmKGNsYXNzTmFtZT09YXJyYXlDbGFzcyl7Zm9yKGluZGV4PTAsbGVuZ3RoPXZhbHVlLmxlbmd0aDtpbmRleDxsZW5ndGg7aW5kZXgrKyl7ZWxlbWVudD1zZXJpYWxpemUoaW5kZXgsdmFsdWUsY2FsbGJhY2sscHJvcGVydGllcyx3aGl0ZXNwYWNlLGluZGVudGF0aW9uLHN0YWNrKTtyZXN1bHRzLnB1c2goZWxlbWVudD09PXVuZGVmP1wibnVsbFwiOmVsZW1lbnQpfXJlc3VsdD1yZXN1bHRzLmxlbmd0aD93aGl0ZXNwYWNlP1wiW1xcblwiK2luZGVudGF0aW9uK3Jlc3VsdHMuam9pbihcIixcXG5cIitpbmRlbnRhdGlvbikrXCJcXG5cIitwcmVmaXgrXCJdXCI6XCJbXCIrcmVzdWx0cy5qb2luKFwiLFwiKStcIl1cIjpcIltdXCJ9ZWxzZXtmb3JFYWNoKHByb3BlcnRpZXN8fHZhbHVlLGZ1bmN0aW9uKHByb3BlcnR5KXt2YXIgZWxlbWVudD1zZXJpYWxpemUocHJvcGVydHksdmFsdWUsY2FsbGJhY2sscHJvcGVydGllcyx3aGl0ZXNwYWNlLGluZGVudGF0aW9uLHN0YWNrKTtpZihlbGVtZW50IT09dW5kZWYpe3Jlc3VsdHMucHVzaChxdW90ZShwcm9wZXJ0eSkrXCI6XCIrKHdoaXRlc3BhY2U/XCIgXCI6XCJcIikrZWxlbWVudCl9fSk7cmVzdWx0PXJlc3VsdHMubGVuZ3RoP3doaXRlc3BhY2U/XCJ7XFxuXCIraW5kZW50YXRpb24rcmVzdWx0cy5qb2luKFwiLFxcblwiK2luZGVudGF0aW9uKStcIlxcblwiK3ByZWZpeCtcIn1cIjpcIntcIityZXN1bHRzLmpvaW4oXCIsXCIpK1wifVwiOlwie31cIn1zdGFjay5wb3AoKTtyZXR1cm4gcmVzdWx0fX07ZXhwb3J0cy5zdHJpbmdpZnk9ZnVuY3Rpb24oc291cmNlLGZpbHRlcix3aWR0aCl7dmFyIHdoaXRlc3BhY2UsY2FsbGJhY2sscHJvcGVydGllcyxjbGFzc05hbWU7aWYob2JqZWN0VHlwZXNbdHlwZW9mIGZpbHRlcl0mJmZpbHRlcil7aWYoKGNsYXNzTmFtZT1nZXRDbGFzcy5jYWxsKGZpbHRlcikpPT1mdW5jdGlvbkNsYXNzKXtjYWxsYmFjaz1maWx0ZXJ9ZWxzZSBpZihjbGFzc05hbWU9PWFycmF5Q2xhc3Mpe3Byb3BlcnRpZXM9e307Zm9yKHZhciBpbmRleD0wLGxlbmd0aD1maWx0ZXIubGVuZ3RoLHZhbHVlO2luZGV4PGxlbmd0aDt2YWx1ZT1maWx0ZXJbaW5kZXgrK10sKGNsYXNzTmFtZT1nZXRDbGFzcy5jYWxsKHZhbHVlKSxjbGFzc05hbWU9PXN0cmluZ0NsYXNzfHxjbGFzc05hbWU9PW51bWJlckNsYXNzKSYmKHByb3BlcnRpZXNbdmFsdWVdPTEpKTt9fWlmKHdpZHRoKXtpZigoY2xhc3NOYW1lPWdldENsYXNzLmNhbGwod2lkdGgpKT09bnVtYmVyQ2xhc3Mpe2lmKCh3aWR0aC09d2lkdGglMSk+MCl7Zm9yKHdoaXRlc3BhY2U9XCJcIix3aWR0aD4xMCYmKHdpZHRoPTEwKTt3aGl0ZXNwYWNlLmxlbmd0aDx3aWR0aDt3aGl0ZXNwYWNlKz1cIiBcIik7fX1lbHNlIGlmKGNsYXNzTmFtZT09c3RyaW5nQ2xhc3Mpe3doaXRlc3BhY2U9d2lkdGgubGVuZ3RoPD0xMD93aWR0aDp3aWR0aC5zbGljZSgwLDEwKX19cmV0dXJuIHNlcmlhbGl6ZShcIlwiLCh2YWx1ZT17fSx2YWx1ZVtcIlwiXT1zb3VyY2UsdmFsdWUpLGNhbGxiYWNrLHByb3BlcnRpZXMsd2hpdGVzcGFjZSxcIlwiLFtdKX19aWYoIWhhcyhcImpzb24tcGFyc2VcIikpe3ZhciBmcm9tQ2hhckNvZGU9U3RyaW5nLmZyb21DaGFyQ29kZTt2YXIgVW5lc2NhcGVzPXs5MjpcIlxcXFxcIiwzNDonXCInLDQ3OlwiL1wiLDk4OlwiXFxiXCIsMTE2OlwiXHRcIiwxMTA6XCJcXG5cIiwxMDI6XCJcXGZcIiwxMTQ6XCJcXHJcIn07dmFyIEluZGV4LFNvdXJjZTt2YXIgYWJvcnQ9ZnVuY3Rpb24oKXtJbmRleD1Tb3VyY2U9bnVsbDt0aHJvdyBTeW50YXhFcnJvcigpfTt2YXIgbGV4PWZ1bmN0aW9uKCl7dmFyIHNvdXJjZT1Tb3VyY2UsbGVuZ3RoPXNvdXJjZS5sZW5ndGgsdmFsdWUsYmVnaW4scG9zaXRpb24saXNTaWduZWQsY2hhckNvZGU7d2hpbGUoSW5kZXg8bGVuZ3RoKXtjaGFyQ29kZT1zb3VyY2UuY2hhckNvZGVBdChJbmRleCk7c3dpdGNoKGNoYXJDb2RlKXtjYXNlIDk6Y2FzZSAxMDpjYXNlIDEzOmNhc2UgMzI6SW5kZXgrKzticmVhaztjYXNlIDEyMzpjYXNlIDEyNTpjYXNlIDkxOmNhc2UgOTM6Y2FzZSA1ODpjYXNlIDQ0OnZhbHVlPWNoYXJJbmRleEJ1Z2d5P3NvdXJjZS5jaGFyQXQoSW5kZXgpOnNvdXJjZVtJbmRleF07SW5kZXgrKztyZXR1cm4gdmFsdWU7Y2FzZSAzNDpmb3IodmFsdWU9XCJAXCIsSW5kZXgrKztJbmRleDxsZW5ndGg7KXtjaGFyQ29kZT1zb3VyY2UuY2hhckNvZGVBdChJbmRleCk7aWYoY2hhckNvZGU8MzIpe2Fib3J0KCl9ZWxzZSBpZihjaGFyQ29kZT09OTIpe2NoYXJDb2RlPXNvdXJjZS5jaGFyQ29kZUF0KCsrSW5kZXgpO3N3aXRjaChjaGFyQ29kZSl7Y2FzZSA5MjpjYXNlIDM0OmNhc2UgNDc6Y2FzZSA5ODpjYXNlIDExNjpjYXNlIDExMDpjYXNlIDEwMjpjYXNlIDExNDp2YWx1ZSs9VW5lc2NhcGVzW2NoYXJDb2RlXTtJbmRleCsrO2JyZWFrO2Nhc2UgMTE3OmJlZ2luPSsrSW5kZXg7Zm9yKHBvc2l0aW9uPUluZGV4KzQ7SW5kZXg8cG9zaXRpb247SW5kZXgrKyl7Y2hhckNvZGU9c291cmNlLmNoYXJDb2RlQXQoSW5kZXgpO2lmKCEoY2hhckNvZGU+PTQ4JiZjaGFyQ29kZTw9NTd8fGNoYXJDb2RlPj05NyYmY2hhckNvZGU8PTEwMnx8Y2hhckNvZGU+PTY1JiZjaGFyQ29kZTw9NzApKXthYm9ydCgpfX12YWx1ZSs9ZnJvbUNoYXJDb2RlKFwiMHhcIitzb3VyY2Uuc2xpY2UoYmVnaW4sSW5kZXgpKTticmVhaztkZWZhdWx0OmFib3J0KCl9fWVsc2V7aWYoY2hhckNvZGU9PTM0KXticmVha31jaGFyQ29kZT1zb3VyY2UuY2hhckNvZGVBdChJbmRleCk7YmVnaW49SW5kZXg7d2hpbGUoY2hhckNvZGU+PTMyJiZjaGFyQ29kZSE9OTImJmNoYXJDb2RlIT0zNCl7Y2hhckNvZGU9c291cmNlLmNoYXJDb2RlQXQoKytJbmRleCl9dmFsdWUrPXNvdXJjZS5zbGljZShiZWdpbixJbmRleCl9fWlmKHNvdXJjZS5jaGFyQ29kZUF0KEluZGV4KT09MzQpe0luZGV4Kys7cmV0dXJuIHZhbHVlfWFib3J0KCk7ZGVmYXVsdDpiZWdpbj1JbmRleDtpZihjaGFyQ29kZT09NDUpe2lzU2lnbmVkPXRydWU7Y2hhckNvZGU9c291cmNlLmNoYXJDb2RlQXQoKytJbmRleCl9aWYoY2hhckNvZGU+PTQ4JiZjaGFyQ29kZTw9NTcpe2lmKGNoYXJDb2RlPT00OCYmKGNoYXJDb2RlPXNvdXJjZS5jaGFyQ29kZUF0KEluZGV4KzEpLGNoYXJDb2RlPj00OCYmY2hhckNvZGU8PTU3KSl7YWJvcnQoKX1pc1NpZ25lZD1mYWxzZTtmb3IoO0luZGV4PGxlbmd0aCYmKGNoYXJDb2RlPXNvdXJjZS5jaGFyQ29kZUF0KEluZGV4KSxjaGFyQ29kZT49NDgmJmNoYXJDb2RlPD01Nyk7SW5kZXgrKyk7aWYoc291cmNlLmNoYXJDb2RlQXQoSW5kZXgpPT00Nil7cG9zaXRpb249KytJbmRleDtmb3IoO3Bvc2l0aW9uPGxlbmd0aCYmKGNoYXJDb2RlPXNvdXJjZS5jaGFyQ29kZUF0KHBvc2l0aW9uKSxjaGFyQ29kZT49NDgmJmNoYXJDb2RlPD01Nyk7cG9zaXRpb24rKyk7aWYocG9zaXRpb249PUluZGV4KXthYm9ydCgpfUluZGV4PXBvc2l0aW9ufWNoYXJDb2RlPXNvdXJjZS5jaGFyQ29kZUF0KEluZGV4KTtpZihjaGFyQ29kZT09MTAxfHxjaGFyQ29kZT09Njkpe2NoYXJDb2RlPXNvdXJjZS5jaGFyQ29kZUF0KCsrSW5kZXgpO2lmKGNoYXJDb2RlPT00M3x8Y2hhckNvZGU9PTQ1KXtJbmRleCsrfWZvcihwb3NpdGlvbj1JbmRleDtwb3NpdGlvbjxsZW5ndGgmJihjaGFyQ29kZT1zb3VyY2UuY2hhckNvZGVBdChwb3NpdGlvbiksY2hhckNvZGU+PTQ4JiZjaGFyQ29kZTw9NTcpO3Bvc2l0aW9uKyspO2lmKHBvc2l0aW9uPT1JbmRleCl7YWJvcnQoKX1JbmRleD1wb3NpdGlvbn1yZXR1cm4rc291cmNlLnNsaWNlKGJlZ2luLEluZGV4KX1pZihpc1NpZ25lZCl7YWJvcnQoKX1pZihzb3VyY2Uuc2xpY2UoSW5kZXgsSW5kZXgrNCk9PVwidHJ1ZVwiKXtJbmRleCs9NDtyZXR1cm4gdHJ1ZX1lbHNlIGlmKHNvdXJjZS5zbGljZShJbmRleCxJbmRleCs1KT09XCJmYWxzZVwiKXtJbmRleCs9NTtyZXR1cm4gZmFsc2V9ZWxzZSBpZihzb3VyY2Uuc2xpY2UoSW5kZXgsSW5kZXgrNCk9PVwibnVsbFwiKXtJbmRleCs9NDtyZXR1cm4gbnVsbH1hYm9ydCgpfX1yZXR1cm5cIiRcIn07dmFyIGdldD1mdW5jdGlvbih2YWx1ZSl7dmFyIHJlc3VsdHMsaGFzTWVtYmVycztpZih2YWx1ZT09XCIkXCIpe2Fib3J0KCl9aWYodHlwZW9mIHZhbHVlPT1cInN0cmluZ1wiKXtpZigoY2hhckluZGV4QnVnZ3k/dmFsdWUuY2hhckF0KDApOnZhbHVlWzBdKT09XCJAXCIpe3JldHVybiB2YWx1ZS5zbGljZSgxKX1pZih2YWx1ZT09XCJbXCIpe3Jlc3VsdHM9W107Zm9yKDs7aGFzTWVtYmVyc3x8KGhhc01lbWJlcnM9dHJ1ZSkpe3ZhbHVlPWxleCgpO2lmKHZhbHVlPT1cIl1cIil7YnJlYWt9aWYoaGFzTWVtYmVycyl7aWYodmFsdWU9PVwiLFwiKXt2YWx1ZT1sZXgoKTtpZih2YWx1ZT09XCJdXCIpe2Fib3J0KCl9fWVsc2V7YWJvcnQoKX19aWYodmFsdWU9PVwiLFwiKXthYm9ydCgpfXJlc3VsdHMucHVzaChnZXQodmFsdWUpKX1yZXR1cm4gcmVzdWx0c31lbHNlIGlmKHZhbHVlPT1cIntcIil7cmVzdWx0cz17fTtmb3IoOztoYXNNZW1iZXJzfHwoaGFzTWVtYmVycz10cnVlKSl7dmFsdWU9bGV4KCk7aWYodmFsdWU9PVwifVwiKXticmVha31pZihoYXNNZW1iZXJzKXtpZih2YWx1ZT09XCIsXCIpe3ZhbHVlPWxleCgpO2lmKHZhbHVlPT1cIn1cIil7YWJvcnQoKX19ZWxzZXthYm9ydCgpfX1pZih2YWx1ZT09XCIsXCJ8fHR5cGVvZiB2YWx1ZSE9XCJzdHJpbmdcInx8KGNoYXJJbmRleEJ1Z2d5P3ZhbHVlLmNoYXJBdCgwKTp2YWx1ZVswXSkhPVwiQFwifHxsZXgoKSE9XCI6XCIpe2Fib3J0KCl9cmVzdWx0c1t2YWx1ZS5zbGljZSgxKV09Z2V0KGxleCgpKVxufXJldHVybiByZXN1bHRzfWFib3J0KCl9cmV0dXJuIHZhbHVlfTt2YXIgdXBkYXRlPWZ1bmN0aW9uKHNvdXJjZSxwcm9wZXJ0eSxjYWxsYmFjayl7dmFyIGVsZW1lbnQ9d2Fsayhzb3VyY2UscHJvcGVydHksY2FsbGJhY2spO2lmKGVsZW1lbnQ9PT11bmRlZil7ZGVsZXRlIHNvdXJjZVtwcm9wZXJ0eV19ZWxzZXtzb3VyY2VbcHJvcGVydHldPWVsZW1lbnR9fTt2YXIgd2Fsaz1mdW5jdGlvbihzb3VyY2UscHJvcGVydHksY2FsbGJhY2spe3ZhciB2YWx1ZT1zb3VyY2VbcHJvcGVydHldLGxlbmd0aDtpZih0eXBlb2YgdmFsdWU9PVwib2JqZWN0XCImJnZhbHVlKXtpZihnZXRDbGFzcy5jYWxsKHZhbHVlKT09YXJyYXlDbGFzcyl7Zm9yKGxlbmd0aD12YWx1ZS5sZW5ndGg7bGVuZ3RoLS07KXt1cGRhdGUodmFsdWUsbGVuZ3RoLGNhbGxiYWNrKX19ZWxzZXtmb3JFYWNoKHZhbHVlLGZ1bmN0aW9uKHByb3BlcnR5KXt1cGRhdGUodmFsdWUscHJvcGVydHksY2FsbGJhY2spfSl9fXJldHVybiBjYWxsYmFjay5jYWxsKHNvdXJjZSxwcm9wZXJ0eSx2YWx1ZSl9O2V4cG9ydHMucGFyc2U9ZnVuY3Rpb24oc291cmNlLGNhbGxiYWNrKXt2YXIgcmVzdWx0LHZhbHVlO0luZGV4PTA7U291cmNlPVwiXCIrc291cmNlO3Jlc3VsdD1nZXQobGV4KCkpO2lmKGxleCgpIT1cIiRcIil7YWJvcnQoKX1JbmRleD1Tb3VyY2U9bnVsbDtyZXR1cm4gY2FsbGJhY2smJmdldENsYXNzLmNhbGwoY2FsbGJhY2spPT1mdW5jdGlvbkNsYXNzP3dhbGsoKHZhbHVlPXt9LHZhbHVlW1wiXCJdPXJlc3VsdCx2YWx1ZSksXCJcIixjYWxsYmFjayk6cmVzdWx0fX19ZXhwb3J0c1tcInJ1bkluQ29udGV4dFwiXT1ydW5JbkNvbnRleHQ7cmV0dXJuIGV4cG9ydHN9aWYoZnJlZUV4cG9ydHMmJiFpc0xvYWRlcil7cnVuSW5Db250ZXh0KHJvb3QsZnJlZUV4cG9ydHMpfWVsc2V7dmFyIG5hdGl2ZUpTT049cm9vdC5KU09OLHByZXZpb3VzSlNPTj1yb290W1wiSlNPTjNcIl0saXNSZXN0b3JlZD1mYWxzZTt2YXIgSlNPTjM9cnVuSW5Db250ZXh0KHJvb3Qscm9vdFtcIkpTT04zXCJdPXtub0NvbmZsaWN0OmZ1bmN0aW9uKCl7aWYoIWlzUmVzdG9yZWQpe2lzUmVzdG9yZWQ9dHJ1ZTtyb290LkpTT049bmF0aXZlSlNPTjtyb290W1wiSlNPTjNcIl09cHJldmlvdXNKU09OO25hdGl2ZUpTT049cHJldmlvdXNKU09OPW51bGx9cmV0dXJuIEpTT04zfX0pO3Jvb3QuSlNPTj17cGFyc2U6SlNPTjMucGFyc2Usc3RyaW5naWZ5OkpTT04zLnN0cmluZ2lmeX19aWYoaXNMb2FkZXIpe2RlZmluZShmdW5jdGlvbigpe3JldHVybiBKU09OM30pfX0pLmNhbGwodGhpcyl9KS5jYWxsKHRoaXMsdHlwZW9mIHNlbGYhPT1cInVuZGVmaW5lZFwiP3NlbGY6dHlwZW9mIHdpbmRvdyE9PVwidW5kZWZpbmVkXCI/d2luZG93OnR5cGVvZiBnbG9iYWwhPT1cInVuZGVmaW5lZFwiP2dsb2JhbDp7fSl9LHt9XSw1MTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7bW9kdWxlLmV4cG9ydHM9dG9BcnJheTtmdW5jdGlvbiB0b0FycmF5KGxpc3QsaW5kZXgpe3ZhciBhcnJheT1bXTtpbmRleD1pbmRleHx8MDtmb3IodmFyIGk9aW5kZXh8fDA7aTxsaXN0Lmxlbmd0aDtpKyspe2FycmF5W2ktaW5kZXhdPWxpc3RbaV19cmV0dXJuIGFycmF5fX0se31dfSx7fSxbMzFdKSgzMSl9KTtcbiIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXG52YXIgY2xpZW50U29ja2V0O1xudmFyIHNlcnZpY2VUb1BsdWdpbk1hcDtcbnZhciBwZW5kaW5nVGVsZW1ldHJ5RXZlbnRzID0gW107XG5cbmZ1bmN0aW9uIGluaXQoc29ja2V0KSB7XG4gICAgY2xpZW50U29ja2V0ID0gc29ja2V0O1xuICAgIHRyeVNlbmRQZW5kaW5nRXZlbnRzKCk7XG59XG5cbmZ1bmN0aW9uIHJlZ2lzdGVyUGx1Z2luU2VydmljZXMocGx1Z2luU2VydmljZXMpIHtcbiAgICBzZXJ2aWNlVG9QbHVnaW5NYXAgPSBwbHVnaW5TZXJ2aWNlcztcbiAgICB0cnlTZW5kUGVuZGluZ0V2ZW50cygpO1xufVxuXG5mdW5jdGlvbiB0cnlTZW5kUGVuZGluZ0V2ZW50cygpIHtcbiAgICBpZiAoIWNsaWVudFNvY2tldCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHVuc2VudCA9IFtdO1xuXG4gICAgcGVuZGluZ1RlbGVtZXRyeUV2ZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChldmVudERhdGEpIHtcbiAgICAgICAgaWYgKG11c3RNYXBTZXJ2aWNlVG9QbHVnaW4oZXZlbnREYXRhKSAmJiAhc2VydmljZVRvUGx1Z2luTWFwKSB7XG4gICAgICAgICAgICB1bnNlbnQucHVzaChldmVudERhdGEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2VuZENsaWVudFRlbGVtZXRyeShldmVudERhdGEpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgXG4gICAgcGVuZGluZ1RlbGVtZXRyeUV2ZW50cyA9IHVuc2VudDtcbn1cblxuZnVuY3Rpb24gbXVzdE1hcFNlcnZpY2VUb1BsdWdpbihldmVudERhdGEpIHtcbiAgICByZXR1cm4gISFldmVudERhdGEucHJvcHMuc2VydmljZSAmJiAhZXZlbnREYXRhLnBsdWdpbjtcbn1cblxuZnVuY3Rpb24gc2VuZENsaWVudFRlbGVtZXRyeShldmVudCwgcHJvcHMsIHBpaVByb3BzKSB7XG4gICAgdmFyIGV2ZW50RGF0YSA9IHtcbiAgICAgICAgZXZlbnQ6IGV2ZW50LFxuICAgICAgICBwcm9wczogcHJvcHMsXG4gICAgICAgIHBpaVByb3BzOiBwaWlQcm9wc1xuICAgIH07XG5cbiAgICBpZiAoIWNsaWVudFNvY2tldCkge1xuICAgICAgICBwZW5kaW5nVGVsZW1ldHJ5RXZlbnRzLnB1c2goZXZlbnREYXRhKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChtdXN0TWFwU2VydmljZVRvUGx1Z2luKGV2ZW50RGF0YSkpIHtcbiAgICAgICAgaWYgKCFzZXJ2aWNlVG9QbHVnaW5NYXApIHtcbiAgICAgICAgICAgIHBlbmRpbmdUZWxlbWV0cnlFdmVudHMucHVzaChldmVudERhdGEpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZXZlbnREYXRhLnByb3BzLnBsdWdpbiA9IHNlcnZpY2VUb1BsdWdpbk1hcFtldmVudERhdGEucHJvcHMuc2VydmljZV0gfHwgJ191bmtub3duJztcbiAgICB9XG5cbiAgICBjbGllbnRTb2NrZXQuZW1pdCgndGVsZW1ldHJ5JywgZXZlbnREYXRhKTtcbn1cblxuZnVuY3Rpb24gc2VuZFVJVGVsZW1ldHJ5KHVpQ29udHJvbERhdGEpIHtcbiAgICBzZW5kQ2xpZW50VGVsZW1ldHJ5KCdwbHVnaW4tdWktaW50ZXJhY3Rpb24nLCB1aUNvbnRyb2xEYXRhKTtcbn1cblxubW9kdWxlLmV4cG9ydHMuaW5pdCA9IGluaXQ7XG5tb2R1bGUuZXhwb3J0cy5yZWdpc3RlclBsdWdpblNlcnZpY2VzID0gcmVnaXN0ZXJQbHVnaW5TZXJ2aWNlcztcbm1vZHVsZS5leHBvcnRzLnNlbmRDbGllbnRUZWxlbWV0cnkgPSBzZW5kQ2xpZW50VGVsZW1ldHJ5O1xubW9kdWxlLmV4cG9ydHMuc2VuZFVJVGVsZW1ldHJ5ID0gc2VuZFVJVGVsZW1ldHJ5O1xuIiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vLyBCYXNlZCBpbiBwYXJ0IG9uIGNvZGUgZnJvbSBBcGFjaGUgUmlwcGxlLCBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2luY3ViYXRvci1yaXBwbGVcblxudmFyIHNlbGYsXG4gICAgZXhjZXB0aW9uID0gcmVxdWlyZSgnZXhjZXB0aW9uJyk7XG5cbnNlbGYgPSBtb2R1bGUuZXhwb3J0cyA9IHtcbiAgICB2YWxpZGF0ZUFyZ3VtZW50VHlwZTogZnVuY3Rpb24gKGFyZywgYXJnVHlwZSwgY3VzdG9tRXhjZXB0aW9uVHlwZSwgY3VzdG9tRXhjZXB0aW9uTWVzc2FnZSwgY3VzdG9tRXhjZXB0aW9uT2JqZWN0KSB7XG4gICAgICAgIHZhciBpbnZhbGlkQXJnID0gZmFsc2UsXG4gICAgICAgICAgICBtc2c7XG5cbiAgICAgICAgc3dpdGNoIChhcmdUeXBlKSB7XG4gICAgICAgICAgICBjYXNlICdhcnJheSc6XG4gICAgICAgICAgICAgICAgaWYgKCEoYXJnIGluc3RhbmNlb2YgQXJyYXkpKSB7XG4gICAgICAgICAgICAgICAgICAgIGludmFsaWRBcmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2RhdGUnOlxuICAgICAgICAgICAgICAgIGlmICghKGFyZyBpbnN0YW5jZW9mIERhdGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGludmFsaWRBcmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2ludGVnZXInOlxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgYXJnID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoYXJnICE9PSBNYXRoLmZsb29yKGFyZykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWRBcmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpbnZhbGlkQXJnID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgYXJnICE9PSBhcmdUeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGludmFsaWRBcmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpbnZhbGlkQXJnKSB7XG4gICAgICAgICAgICBtc2cgPSBjdXN0b21FeGNlcHRpb25NZXNzYWdlICsgKCdcXG5cXG5JbnZhbGlkIEFyZ3VtZW50IHR5cGUuIGFyZ3VtZW50OiAnICsgYXJnICsgJyA9PT4gd2FzIGV4cGVjdGVkIHRvIGJlIG9mIHR5cGU6ICcgKyBhcmdUeXBlKTtcbiAgICAgICAgICAgIGV4Y2VwdGlvbi5yYWlzZSgoY3VzdG9tRXhjZXB0aW9uVHlwZSB8fCBleGNlcHRpb24udHlwZXMuQXJndW1lbnRUeXBlKSwgbXNnLCBjdXN0b21FeGNlcHRpb25PYmplY3QpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGZvckVhY2g6IGZ1bmN0aW9uIChvYmosIGFjdGlvbiwgc2NvcGUpIHtcbiAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICAgICAgICByZXR1cm4gb2JqLmZvckVhY2goYWN0aW9uLCBzY29wZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzZWxmLm1hcChvYmosIGFjdGlvbiwgc2NvcGUpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIG1hcDogZnVuY3Rpb24gKG9iaiwgZnVuYywgc2NvcGUpIHtcbiAgICAgICAgdmFyIGksXG4gICAgICAgICAgICByZXR1cm5WYWwgPSBudWxsLFxuICAgICAgICAgICAgcmVzdWx0ICAgID0gW107XG5cbiAgICAgICAgLy9Nb3pIYWNrIGZvciBOYW1lZE5vZGVNYXBcbiAgICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgICBpZiAod2luZG93Lk1vek5hbWVkQXR0ck1hcCkge1xuICAgICAgICAgICAgTmFtZWROb2RlTWFwID0gd2luZG93Lk1vek5hbWVkQXR0ck1hcDtcbiAgICAgICAgfVxuICAgICAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuXG4gICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAgICAgcmV0dXJuIG9iai5tYXAoZnVuYywgc2NvcGUpO1xuICAgICAgICB9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIE5hbWVkTm9kZU1hcCkge1xuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG9iai5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHJldHVyblZhbCA9IGZ1bmMuYXBwbHkoc2NvcGUsIFtvYmpbaV0sIGldKTtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChyZXR1cm5WYWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9yIChpIGluIG9iaikge1xuICAgICAgICAgICAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoaSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsID0gZnVuYy5hcHBseShzY29wZSwgW29ialtpXSwgaV0pO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChyZXR1cm5WYWwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSxcblxuICAgIGJpbmRBdXRvU2F2ZUV2ZW50OiBmdW5jdGlvbiAoc2VsZWN0b3IsIHNhdmVDYWxsYmFjaykge1xuICAgICAgICB2YXIgb2xkU2V0VGltZW91dElkO1xuICAgICAgICB2YXIgbm9kZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpO1xuXG4gICAgICAgIGlmICghbm9kZSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ0FVVE8gU0FWRTogUkVJTlNUQVRFIE9OQ0UgV0UgSEFWRSAnICsgc2VsZWN0b3IgKyAnIEVMRU1FTlQnKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcigna2V5dXAnLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgIGlmIChldmVudC5rZXlDb2RlICE9PSA5KSB7XG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KG9sZFNldFRpbWVvdXRJZCk7XG4gICAgICAgICAgICAgICAgb2xkU2V0VGltZW91dElkID0gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBzYXZlQ2FsbGJhY2soKTtcbiAgICAgICAgICAgICAgICB9LCA1MDApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9LFxuXG4gICAgbWl4aW46IGZ1bmN0aW9uIChtaXhpbiwgdG8pIHtcbiAgICAgICAgZm9yICh2YXIgcHJvcCBpbiBtaXhpbikge1xuICAgICAgICAgICAgaWYgKE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1peGluLCBwcm9wKSkge1xuICAgICAgICAgICAgICAgIHRvW3Byb3BdID0gbWl4aW5bcHJvcF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgY29weTogZnVuY3Rpb24gKG9iaikge1xuICAgICAgICB2YXIgaSxcbiAgICAgICAgICAgIG5ld09iaiA9IEFycmF5LmlzQXJyYXkob2JqKSA/IFtdIDoge307XG5cbiAgICAgICAgaWYgKHR5cGVvZiBvYmogPT09ICdudW1iZXInIHx8XG4gICAgICAgICAgICB0eXBlb2Ygb2JqID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgICAgdHlwZW9mIG9iaiA9PT0gJ2Jvb2xlYW4nIHx8XG4gICAgICAgICAgICBvYmogPT09IG51bGwgfHxcbiAgICAgICAgICAgIG9iaiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gb2JqO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZShvYmopO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAob2JqKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoaSBpbiBvYmopIHtcbiAgICAgICAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoaSkpIHtcbiAgICAgICAgICAgICAgICBpZiAob2JqW2ldICYmIHR5cGVvZiBvYmpbaV0gPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvYmpbaV0gaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdPYmpbaV0gPSBvYmpbaV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdPYmpbaV0gPSBzZWxmLmNvcHkob2JqW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3T2JqW2ldID0gb2JqW2ldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXdPYmo7XG4gICAgfSxcblxuICAgIG5hdkhlbHBlcjogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgRGlyZWN0aW9uczoge1xuICAgICAgICAgICAgICAgIE46ICdOJyxcbiAgICAgICAgICAgICAgICBORTogJ05FJyxcbiAgICAgICAgICAgICAgICBFOiAnRScsXG4gICAgICAgICAgICAgICAgU0U6ICdTRScsXG4gICAgICAgICAgICAgICAgUzogJ1MnLFxuICAgICAgICAgICAgICAgIFNXOiAnU1cnLFxuICAgICAgICAgICAgICAgIFc6ICdXJyxcbiAgICAgICAgICAgICAgICBOVzogJ05XJ1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBHZXQgdGhlIGRpcmVjdGlvbiBhY2NvcmRpbmcgdG8gdGhlIGhlYWRpbmcgdmFsdWUuXG4gICAgICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gaGVhZGluZyBBIG51bWJlciBmcm9tIDAgdG8gMzU5Ljk5LlxuICAgICAgICAgICAgICogQHJldHVybiB7c3RyaW5nfSBkaXJlY3Rpb24gSXQgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOiBOLCBORSwgRSwgU0UsIFMsIFNXLCBXIG9yIE5XLlxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBnZXREaXJlY3Rpb246IGZ1bmN0aW9uIChoZWFkaW5nKSB7XG4gICAgICAgICAgICAgICAgaWYgKGhlYWRpbmcgPiAzMzcuNSB8fCAoaGVhZGluZyA+PSAwICYmIGhlYWRpbmcgPD0gMjIuNSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuRGlyZWN0aW9ucy5OO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChoZWFkaW5nID4gMjIuNSAmJiBoZWFkaW5nIDw9IDY3LjUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuRGlyZWN0aW9ucy5ORTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoaGVhZGluZyA+IDY3LjUgJiYgaGVhZGluZyA8PSAxMTIuNSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5EaXJlY3Rpb25zLkU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGhlYWRpbmcgPiAxMTIuNSAmJiBoZWFkaW5nIDw9IDE1Ny41KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLkRpcmVjdGlvbnMuU0U7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGhlYWRpbmcgPiAxNTcuNSAmJiBoZWFkaW5nIDw9IDIwMi41KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLkRpcmVjdGlvbnMuUztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoaGVhZGluZyA+IDIwMi41ICYmIGhlYWRpbmcgPD0gMjQ3LjUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuRGlyZWN0aW9ucy5TVztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoaGVhZGluZyA+IDI0Ny41ICYmIGhlYWRpbmcgPD0gMjkyLjUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuRGlyZWN0aW9ucy5XO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIGhlYWRpbmcgPiAyOTIuNSAmJiBoZWFkaW5nIDw9IDMzNy41XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuRGlyZWN0aW9ucy5OVztcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGdldEhlYWRpbmc6IGZ1bmN0aW9uIChsYXQxLCBsb24xLCBsYXQyLCBsb24yKSB7XG4gICAgICAgICAgICAgICAgdmFyIGRMb24gID0gdGhpcy5yYWQobG9uMiAtIGxvbjEpLFxuICAgICAgICAgICAgICAgICAgICBsbGF0MSA9IHRoaXMucmFkKGxhdDEpLFxuICAgICAgICAgICAgICAgICAgICBsbGF0MiA9IHRoaXMucmFkKGxhdDIpLFxuICAgICAgICAgICAgICAgICAgICB5ICAgICA9IE1hdGguc2luKGRMb24pICogTWF0aC5jb3MobGxhdDIpLFxuICAgICAgICAgICAgICAgICAgICB4ICAgICA9IE1hdGguY29zKGxsYXQxKSAqIE1hdGguc2luKGxsYXQyKSAtIE1hdGguc2luKGxsYXQxKSAqIE1hdGguY29zKGxsYXQyKSAqIE1hdGguY29zKGRMb24pO1xuICAgICAgICAgICAgICAgIHJldHVybiAodGhpcy5kZWcoTWF0aC5hdGFuMih5LCB4KSkgKyAzNjApICUgMzYwO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgZ2V0RGlzdGFuY2U6IGZ1bmN0aW9uIChsYXQxLCBsb24xLCBsYXQyLCBsb24yKSB7XG4gICAgICAgICAgICAgICAgdmFyIGRMYXQgPSB0aGlzLnJhZChsYXQyIC0gbGF0MSksXG4gICAgICAgICAgICAgICAgICAgIGRMb24gPSB0aGlzLnJhZChsb24yIC0gbG9uMSksXG4gICAgICAgICAgICAgICAgICAgIGEgICAgPSBNYXRoLnNpbihkTGF0IC8gMikgKiBNYXRoLnNpbihkTGF0IC8gMikgKyBNYXRoLmNvcyh0aGlzLnJhZChsYXQxKSkgKiBNYXRoLmNvcyh0aGlzLnJhZChsYXQyKSkgKiBNYXRoLnNpbihkTG9uIC8gMikgKiBNYXRoLnNpbihkTG9uIC8gMiksXG4gICAgICAgICAgICAgICAgICAgIGMgICAgPSAyICogTWF0aC5hc2luKE1hdGguc3FydChhKSksXG4gICAgICAgICAgICAgICAgICAgIGQgICAgPSA2Mzc4MTAwICogYztcbiAgICAgICAgICAgICAgICByZXR1cm4gZDtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIHNpbXVsYXRlVHJhdmVsOiBmdW5jdGlvbiAobGF0LCBsb24sIGhkZywgZGlzdCkge1xuICAgICAgICAgICAgICAgIHZhciBsYXQxICAgICAgICAgICAgPSB0aGlzLnJhZChsYXQpLFxuICAgICAgICAgICAgICAgICAgICBsb24xICAgICAgICAgICAgPSB0aGlzLnJhZChsb24pLFxuICAgICAgICAgICAgICAgICAgICBicm5nICAgICAgICAgICAgPSB0aGlzLnJhZChoZGcpLFxuICAgICAgICAgICAgICAgICAgICBhbmd1bGFyRGlzdGFuY2UgPSBkaXN0IC8gNjM3ODEwMCxcbiAgICAgICAgICAgICAgICAgICAgbGF0MiAgICAgICAgICAgID0gTWF0aC5hc2luKE1hdGguc2luKGxhdDEpICogTWF0aC5jb3MoYW5ndWxhckRpc3RhbmNlKSArIE1hdGguY29zKGxhdDEpICogTWF0aC5zaW4oYW5ndWxhckRpc3RhbmNlKSAqIE1hdGguY29zKGJybmcpKSxcbiAgICAgICAgICAgICAgICAgICAgbG9uMiAgICAgICAgICAgID0gbG9uMSArIE1hdGguYXRhbjIoTWF0aC5zaW4oYnJuZykgKiBNYXRoLnNpbihhbmd1bGFyRGlzdGFuY2UpICogTWF0aC5jb3MobGF0MSksIE1hdGguY29zKGFuZ3VsYXJEaXN0YW5jZSkgLSBNYXRoLnNpbihsYXQxKSAqIE1hdGguc2luKGxhdDIpKTtcbiAgICAgICAgICAgICAgICBsb24yID0gKGxvbjIgKyAzICogTWF0aC5QSSkgJSAoMiAqIE1hdGguUEkpIC0gTWF0aC5QSTsgLy8gTm9ybWFsaXplIHRvIC0xODAuLisxODBcblxuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGxhdGl0dWRlOiB0aGlzLmRlZyhsYXQyKSxcbiAgICAgICAgICAgICAgICAgICAgbG9uZ2l0dWRlOiB0aGlzLmRlZyhsb24yKVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBkZWc6IGZ1bmN0aW9uIChudW0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtICogMTgwIC8gTWF0aC5QSTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIHJhZDogZnVuY3Rpb24gKG51bSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudW0gKiBNYXRoLlBJIC8gMTgwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH0sXG5cbiAgICBjcmVhdGVVVUlEOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVVVUlEUGFydCg0KSArICctJyArXG4gICAgICAgICAgICBjcmVhdGVVVUlEUGFydCgyKSArICctJyArXG4gICAgICAgICAgICBjcmVhdGVVVUlEUGFydCgyKSArICctJyArXG4gICAgICAgICAgICBjcmVhdGVVVUlEUGFydCgyKSArICctJyArXG4gICAgICAgICAgICBjcmVhdGVVVUlEUGFydCg2KTtcbiAgICB9LFxuXG4gICAgdHlwZU5hbWU6IGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWwpLnNsaWNlKDgsIC0xKTtcbiAgICB9LFxuXG4gICAgcGFyc2VVcmw6IGZ1bmN0aW9uICh1cmwpIHtcbiAgICAgICAgdmFyIGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG5cbiAgICAgICAgYS5ocmVmID0gdXJsO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBocmVmOiBhLmhyZWYsXG4gICAgICAgICAgICBob3N0OiBhLmhvc3QsXG4gICAgICAgICAgICBvcmlnaW46IGEub3JpZ2luLFxuICAgICAgICAgICAgcG9ydDogYS5wb3J0LFxuICAgICAgICAgICAgcHJvdG9jb2w6IGEucHJvdG9jb2wsXG4gICAgICAgICAgICBzZWFyY2g6IGEuc2VhcmNoXG4gICAgICAgIH07XG4gICAgfSxcblxuICAgIGlzU2FtZU9yaWdpblJlcXVlc3Q6IGZ1bmN0aW9uICh1cmwpIHtcbiAgICAgICAgdXJsID0gdGhpcy5wYXJzZVVybCh1cmwpO1xuXG4gICAgICAgIGlmICh1cmwucG9ydCAhPT0gbG9jYXRpb24ucG9ydCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHNhbWVPcmlnaW4gPSB1cmwuaHJlZi5tYXRjaChsb2NhdGlvbi5vcmlnaW4ucmVwbGFjZSgvd3d3XFwuLywgJycpKSB8fFxuICAgICAgICAgICAgIXVybC5ocmVmLm1hdGNoKC9eaHR0cHM/OlxcL1xcL3xeZmlsZTpcXC9cXC8vKTtcblxuICAgICAgICByZXR1cm4gISFzYW1lT3JpZ2luO1xuICAgIH0sXG5cbiAgICBpc051bWJlcjogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuXG4gICAgICAgIHJldHVybiAodHlwZSA9PT0gJ251bWJlcicgfHwgdHlwZSA9PT0gJ3N0cmluZycpICYmICFpc05hTih2YWx1ZSAtIHBhcnNlRmxvYXQodmFsdWUpKTtcbiAgICB9XG59O1xuXG5mdW5jdGlvbiBjcmVhdGVVVUlEUGFydChsZW5ndGgpIHtcbiAgICB2YXIgdXVpZHBhcnQgPSAnJztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciB1dWlkY2hhciA9IHBhcnNlSW50KChNYXRoLnJhbmRvbSgpICogMjU2KSwgMTApLnRvU3RyaW5nKDE2KTtcbiAgICAgICAgaWYgKHV1aWRjaGFyLmxlbmd0aCA9PSAxKSB7XG4gICAgICAgICAgICB1dWlkY2hhciA9ICcwJyArIHV1aWRjaGFyO1xuICAgICAgICB9XG4gICAgICAgIHV1aWRwYXJ0ICs9IHV1aWRjaGFyO1xuICAgIH1cbiAgICByZXR1cm4gdXVpZHBhcnQ7XG59XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dFxuICogVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHRcbiAqIFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dFxuICogQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc29cbiAqIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0XG4gKi9cbi8vIEB2ZXJzaW9uIDAuNy4yMFxuIWZ1bmN0aW9uKCl7d2luZG93LldlYkNvbXBvbmVudHM9d2luZG93LldlYkNvbXBvbmVudHN8fHtmbGFnczp7fX07dmFyIGU9XCJ3ZWJjb21wb25lbnRzLmpzXCIsdD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdzY3JpcHRbc3JjKj1cIicrZSsnXCJdJyksbj17fTtpZighbi5ub09wdHMpe2lmKGxvY2F0aW9uLnNlYXJjaC5zbGljZSgxKS5zcGxpdChcIiZcIikuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdCxyPWUuc3BsaXQoXCI9XCIpO3JbMF0mJih0PXJbMF0ubWF0Y2goL3djLSguKykvKSkmJihuW3RbMV1dPXJbMV18fCEwKX0pLHQpZm9yKHZhciByLG89MDtyPXQuYXR0cmlidXRlc1tvXTtvKyspXCJzcmNcIiE9PXIubmFtZSYmKG5bci5uYW1lXT1yLnZhbHVlfHwhMCk7aWYobi5sb2cmJm4ubG9nLnNwbGl0KXt2YXIgaT1uLmxvZy5zcGxpdChcIixcIik7bi5sb2c9e30saS5mb3JFYWNoKGZ1bmN0aW9uKGUpe24ubG9nW2VdPSEwfSl9ZWxzZSBuLmxvZz17fX1uLnNoYWRvdz1uLnNoYWRvd3x8bi5zaGFkb3dkb218fG4ucG9seWZpbGwsXCJuYXRpdmVcIj09PW4uc2hhZG93P24uc2hhZG93PSExOm4uc2hhZG93PW4uc2hhZG93fHwhSFRNTEVsZW1lbnQucHJvdG90eXBlLmNyZWF0ZVNoYWRvd1Jvb3Qsbi5yZWdpc3RlciYmKHdpbmRvdy5DdXN0b21FbGVtZW50cz13aW5kb3cuQ3VzdG9tRWxlbWVudHN8fHtmbGFnczp7fX0sd2luZG93LkN1c3RvbUVsZW1lbnRzLmZsYWdzLnJlZ2lzdGVyPW4ucmVnaXN0ZXIpLFdlYkNvbXBvbmVudHMuZmxhZ3M9bn0oKSxXZWJDb21wb25lbnRzLmZsYWdzLnNoYWRvdyYmKFwidW5kZWZpbmVkXCI9PXR5cGVvZiBXZWFrTWFwJiYhZnVuY3Rpb24oKXt2YXIgZT1PYmplY3QuZGVmaW5lUHJvcGVydHksdD1EYXRlLm5vdygpJTFlOSxuPWZ1bmN0aW9uKCl7dGhpcy5uYW1lPVwiX19zdFwiKygxZTkqTWF0aC5yYW5kb20oKT4+PjApKyh0KysgK1wiX19cIil9O24ucHJvdG90eXBlPXtzZXQ6ZnVuY3Rpb24odCxuKXt2YXIgcj10W3RoaXMubmFtZV07cmV0dXJuIHImJnJbMF09PT10P3JbMV09bjplKHQsdGhpcy5uYW1lLHt2YWx1ZTpbdCxuXSx3cml0YWJsZTohMH0pLHRoaXN9LGdldDpmdW5jdGlvbihlKXt2YXIgdDtyZXR1cm4odD1lW3RoaXMubmFtZV0pJiZ0WzBdPT09ZT90WzFdOnZvaWQgMH0sXCJkZWxldGVcIjpmdW5jdGlvbihlKXt2YXIgdD1lW3RoaXMubmFtZV07cmV0dXJuIHQmJnRbMF09PT1lPyh0WzBdPXRbMV09dm9pZCAwLCEwKTohMX0saGFzOmZ1bmN0aW9uKGUpe3ZhciB0PWVbdGhpcy5uYW1lXTtyZXR1cm4gdD90WzBdPT09ZTohMX19LHdpbmRvdy5XZWFrTWFwPW59KCksd2luZG93LlNoYWRvd0RPTVBvbHlmaWxsPXt9LGZ1bmN0aW9uKGUpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIHQoKXtpZihcInVuZGVmaW5lZFwiIT10eXBlb2YgY2hyb21lJiZjaHJvbWUuYXBwJiZjaHJvbWUuYXBwLnJ1bnRpbWUpcmV0dXJuITE7aWYobmF2aWdhdG9yLmdldERldmljZVN0b3JhZ2UpcmV0dXJuITE7dHJ5e3ZhciBlPW5ldyBGdW5jdGlvbihcInJldHVybiB0cnVlO1wiKTtyZXR1cm4gZSgpfWNhdGNoKHQpe3JldHVybiExfX1mdW5jdGlvbiBuKGUpe2lmKCFlKXRocm93IG5ldyBFcnJvcihcIkFzc2VydGlvbiBmYWlsZWRcIil9ZnVuY3Rpb24gcihlLHQpe2Zvcih2YXIgbj1XKHQpLHI9MDtyPG4ubGVuZ3RoO3IrKyl7dmFyIG89bltyXTtBKGUsbyxGKHQsbykpfXJldHVybiBlfWZ1bmN0aW9uIG8oZSx0KXtmb3IodmFyIG49Vyh0KSxyPTA7cjxuLmxlbmd0aDtyKyspe3ZhciBvPW5bcl07c3dpdGNoKG8pe2Nhc2VcImFyZ3VtZW50c1wiOmNhc2VcImNhbGxlclwiOmNhc2VcImxlbmd0aFwiOmNhc2VcIm5hbWVcIjpjYXNlXCJwcm90b3R5cGVcIjpjYXNlXCJ0b1N0cmluZ1wiOmNvbnRpbnVlfUEoZSxvLEYodCxvKSl9cmV0dXJuIGV9ZnVuY3Rpb24gaShlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKWlmKHRbbl1pbiBlKXJldHVybiB0W25dfWZ1bmN0aW9uIGEoZSx0LG4pe1UudmFsdWU9bixBKGUsdCxVKX1mdW5jdGlvbiBzKGUsdCl7dmFyIG49ZS5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZihlKTtpZihxKXRyeXtXKG4pfWNhdGNoKHIpe249bi5fX3Byb3RvX199dmFyIG89Ui5nZXQobik7aWYobylyZXR1cm4gbzt2YXIgaT1zKG4pLGE9RShpKTtyZXR1cm4gZyhuLGEsdCksYX1mdW5jdGlvbiBjKGUsdCl7dyhlLHQsITApfWZ1bmN0aW9uIGwoZSx0KXt3KHQsZSwhMSl9ZnVuY3Rpb24gdShlKXtyZXR1cm4vXm9uW2Etel0rJC8udGVzdChlKX1mdW5jdGlvbiBkKGUpe3JldHVybi9eW2EtekEtWl8kXVthLXpBLVpfJDAtOV0qJC8udGVzdChlKX1mdW5jdGlvbiBwKGUpe3JldHVybiBrJiZkKGUpP25ldyBGdW5jdGlvbihcInJldHVybiB0aGlzLl9faW1wbDRjZjFlNzgyaGdfXy5cIitlKTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9faW1wbDRjZjFlNzgyaGdfX1tlXX19ZnVuY3Rpb24gaChlKXtyZXR1cm4gayYmZChlKT9uZXcgRnVuY3Rpb24oXCJ2XCIsXCJ0aGlzLl9faW1wbDRjZjFlNzgyaGdfXy5cIitlK1wiID0gdlwiKTpmdW5jdGlvbih0KXt0aGlzLl9faW1wbDRjZjFlNzgyaGdfX1tlXT10fX1mdW5jdGlvbiBmKGUpe3JldHVybiBrJiZkKGUpP25ldyBGdW5jdGlvbihcInJldHVybiB0aGlzLl9faW1wbDRjZjFlNzgyaGdfXy5cIitlK1wiLmFwcGx5KHRoaXMuX19pbXBsNGNmMWU3ODJoZ19fLCBhcmd1bWVudHMpXCIpOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX19pbXBsNGNmMWU3ODJoZ19fW2VdLmFwcGx5KHRoaXMuX19pbXBsNGNmMWU3ODJoZ19fLGFyZ3VtZW50cyl9fWZ1bmN0aW9uIG0oZSx0KXt0cnl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSx0KX1jYXRjaChuKXtyZXR1cm4gQn19ZnVuY3Rpb24gdyh0LG4scixvKXtmb3IodmFyIGk9Vyh0KSxhPTA7YTxpLmxlbmd0aDthKyspe3ZhciBzPWlbYV07aWYoXCJwb2x5bWVyQmxhY2tMaXN0X1wiIT09cyYmIShzIGluIG58fHQucG9seW1lckJsYWNrTGlzdF8mJnQucG9seW1lckJsYWNrTGlzdF9bc10pKXtxJiZ0Ll9fbG9va3VwR2V0dGVyX18ocyk7dmFyIGMsbCxkPW0odCxzKTtpZihcImZ1bmN0aW9uXCIhPXR5cGVvZiBkLnZhbHVlKXt2YXIgdz11KHMpO2M9dz9lLmdldEV2ZW50SGFuZGxlckdldHRlcihzKTpwKHMpLChkLndyaXRhYmxlfHxkLnNldHx8VikmJihsPXc/ZS5nZXRFdmVudEhhbmRsZXJTZXR0ZXIocyk6aChzKSk7dmFyIHY9Vnx8ZC5jb25maWd1cmFibGU7QShuLHMse2dldDpjLHNldDpsLGNvbmZpZ3VyYWJsZTp2LGVudW1lcmFibGU6ZC5lbnVtZXJhYmxlfSl9ZWxzZSByJiYobltzXT1mKHMpKX19fWZ1bmN0aW9uIHYoZSx0LG4pe2lmKG51bGwhPWUpe3ZhciByPWUucHJvdG90eXBlO2cocix0LG4pLG8odCxlKX19ZnVuY3Rpb24gZyhlLHQscil7dmFyIG89dC5wcm90b3R5cGU7bih2b2lkIDA9PT1SLmdldChlKSksUi5zZXQoZSx0KSxJLnNldChvLGUpLGMoZSxvKSxyJiZsKG8sciksYShvLFwiY29uc3RydWN0b3JcIix0KSx0LnByb3RvdHlwZT1vfWZ1bmN0aW9uIGIoZSx0KXtyZXR1cm4gUi5nZXQodC5wcm90b3R5cGUpPT09ZX1mdW5jdGlvbiB5KGUpe3ZhciB0PU9iamVjdC5nZXRQcm90b3R5cGVPZihlKSxuPXModCkscj1FKG4pO3JldHVybiBnKHQscixlKSxyfWZ1bmN0aW9uIEUoZSl7ZnVuY3Rpb24gdCh0KXtlLmNhbGwodGhpcyx0KX12YXIgbj1PYmplY3QuY3JlYXRlKGUucHJvdG90eXBlKTtyZXR1cm4gbi5jb25zdHJ1Y3Rvcj10LHQucHJvdG90eXBlPW4sdH1mdW5jdGlvbiBfKGUpe3JldHVybiBlJiZlLl9faW1wbDRjZjFlNzgyaGdfX31mdW5jdGlvbiBTKGUpe3JldHVybiFfKGUpfWZ1bmN0aW9uIFQoZSl7aWYobnVsbD09PWUpcmV0dXJuIG51bGw7bihTKGUpKTt2YXIgdD1lLl9fd3JhcHBlcjhlM2RkOTNhNjBfXztyZXR1cm4gbnVsbCE9dD90OmUuX193cmFwcGVyOGUzZGQ5M2E2MF9fPW5ldyhzKGUsZSkpKGUpfWZ1bmN0aW9uIE0oZSl7cmV0dXJuIG51bGw9PT1lP251bGw6KG4oXyhlKSksZS5fX2ltcGw0Y2YxZTc4MmhnX18pfWZ1bmN0aW9uIE8oZSl7cmV0dXJuIGUuX19pbXBsNGNmMWU3ODJoZ19ffWZ1bmN0aW9uIEwoZSx0KXt0Ll9faW1wbDRjZjFlNzgyaGdfXz1lLGUuX193cmFwcGVyOGUzZGQ5M2E2MF9fPXR9ZnVuY3Rpb24gTihlKXtyZXR1cm4gZSYmXyhlKT9NKGUpOmV9ZnVuY3Rpb24gQyhlKXtyZXR1cm4gZSYmIV8oZSk/VChlKTplfWZ1bmN0aW9uIGooZSx0KXtudWxsIT09dCYmKG4oUyhlKSksbih2b2lkIDA9PT10fHxfKHQpKSxlLl9fd3JhcHBlcjhlM2RkOTNhNjBfXz10KX1mdW5jdGlvbiBEKGUsdCxuKXtHLmdldD1uLEEoZS5wcm90b3R5cGUsdCxHKX1mdW5jdGlvbiBIKGUsdCl7RChlLHQsZnVuY3Rpb24oKXtyZXR1cm4gVCh0aGlzLl9faW1wbDRjZjFlNzgyaGdfX1t0XSl9KX1mdW5jdGlvbiB4KGUsdCl7ZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3QuZm9yRWFjaChmdW5jdGlvbih0KXtlLnByb3RvdHlwZVt0XT1mdW5jdGlvbigpe3ZhciBlPUModGhpcyk7cmV0dXJuIGVbdF0uYXBwbHkoZSxhcmd1bWVudHMpfX0pfSl9dmFyIFI9bmV3IFdlYWtNYXAsST1uZXcgV2Vha01hcCxQPU9iamVjdC5jcmVhdGUobnVsbCksaz10KCksQT1PYmplY3QuZGVmaW5lUHJvcGVydHksVz1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyxGPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IsVT17dmFsdWU6dm9pZCAwLGNvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwfTtXKHdpbmRvdyk7dmFyIHE9L0ZpcmVmb3gvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCksQj17Z2V0OmZ1bmN0aW9uKCl7fSxzZXQ6ZnVuY3Rpb24oZSl7fSxjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMH0sVj1mdW5jdGlvbigpe3ZhciBlPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTm9kZS5wcm90b3R5cGUsXCJub2RlVHlwZVwiKTtyZXR1cm4gZSYmIWUuZ2V0JiYhZS5zZXR9KCksRz17Z2V0OnZvaWQgMCxjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMH07ZS5hZGRGb3J3YXJkaW5nUHJvcGVydGllcz1jLGUuYXNzZXJ0PW4sZS5jb25zdHJ1Y3RvclRhYmxlPVIsZS5kZWZpbmVHZXR0ZXI9RCxlLmRlZmluZVdyYXBHZXR0ZXI9SCxlLmZvcndhcmRNZXRob2RzVG9XcmFwcGVyPXgsZS5pc0lkZW50aWZpZXJOYW1lPWQsZS5pc1dyYXBwZXI9XyxlLmlzV3JhcHBlckZvcj1iLGUubWl4aW49cixlLm5hdGl2ZVByb3RvdHlwZVRhYmxlPUksZS5vbmVPZj1pLGUucmVnaXN0ZXJPYmplY3Q9eSxlLnJlZ2lzdGVyV3JhcHBlcj12LGUucmV3cmFwPWosZS5zZXRXcmFwcGVyPUwsZS51bnNhZmVVbndyYXA9TyxlLnVud3JhcD1NLGUudW53cmFwSWZOZWVkZWQ9TixlLndyYXA9VCxlLndyYXBJZk5lZWRlZD1DLGUud3JhcHBlcnM9UH0od2luZG93LlNoYWRvd0RPTVBvbHlmaWxsKSxmdW5jdGlvbihlKXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiB0KGUsdCxuKXtyZXR1cm57aW5kZXg6ZSxyZW1vdmVkOnQsYWRkZWRDb3VudDpufX1mdW5jdGlvbiBuKCl7fXZhciByPTAsbz0xLGk9MixhPTM7bi5wcm90b3R5cGU9e2NhbGNFZGl0RGlzdGFuY2VzOmZ1bmN0aW9uKGUsdCxuLHIsbyxpKXtmb3IodmFyIGE9aS1vKzEscz1uLXQrMSxjPW5ldyBBcnJheShhKSxsPTA7YT5sO2wrKyljW2xdPW5ldyBBcnJheShzKSxjW2xdWzBdPWw7Zm9yKHZhciB1PTA7cz51O3UrKyljWzBdW3VdPXU7Zm9yKHZhciBsPTE7YT5sO2wrKylmb3IodmFyIHU9MTtzPnU7dSsrKWlmKHRoaXMuZXF1YWxzKGVbdCt1LTFdLHJbbytsLTFdKSljW2xdW3VdPWNbbC0xXVt1LTFdO2Vsc2V7dmFyIGQ9Y1tsLTFdW3VdKzEscD1jW2xdW3UtMV0rMTtjW2xdW3VdPXA+ZD9kOnB9cmV0dXJuIGN9LHNwbGljZU9wZXJhdGlvbnNGcm9tRWRpdERpc3RhbmNlczpmdW5jdGlvbihlKXtmb3IodmFyIHQ9ZS5sZW5ndGgtMSxuPWVbMF0ubGVuZ3RoLTEscz1lW3RdW25dLGM9W107dD4wfHxuPjA7KWlmKDAhPXQpaWYoMCE9bil7dmFyIGwsdT1lW3QtMV1bbi0xXSxkPWVbdC0xXVtuXSxwPWVbdF1bbi0xXTtsPXA+ZD91PmQ/ZDp1OnU+cD9wOnUsbD09dT8odT09cz9jLnB1c2gocik6KGMucHVzaChvKSxzPXUpLHQtLSxuLS0pOmw9PWQ/KGMucHVzaChhKSx0LS0scz1kKTooYy5wdXNoKGkpLG4tLSxzPXApfWVsc2UgYy5wdXNoKGEpLHQtLTtlbHNlIGMucHVzaChpKSxuLS07cmV0dXJuIGMucmV2ZXJzZSgpLGN9LGNhbGNTcGxpY2VzOmZ1bmN0aW9uKGUsbixzLGMsbCx1KXt2YXIgZD0wLHA9MCxoPU1hdGgubWluKHMtbix1LWwpO2lmKDA9PW4mJjA9PWwmJihkPXRoaXMuc2hhcmVkUHJlZml4KGUsYyxoKSkscz09ZS5sZW5ndGgmJnU9PWMubGVuZ3RoJiYocD10aGlzLnNoYXJlZFN1ZmZpeChlLGMsaC1kKSksbis9ZCxsKz1kLHMtPXAsdS09cCxzLW49PTAmJnUtbD09MClyZXR1cm5bXTtpZihuPT1zKXtmb3IodmFyIGY9dChuLFtdLDApO3U+bDspZi5yZW1vdmVkLnB1c2goY1tsKytdKTtyZXR1cm5bZl19aWYobD09dSlyZXR1cm5bdChuLFtdLHMtbildO2Zvcih2YXIgbT10aGlzLnNwbGljZU9wZXJhdGlvbnNGcm9tRWRpdERpc3RhbmNlcyh0aGlzLmNhbGNFZGl0RGlzdGFuY2VzKGUsbixzLGMsbCx1KSksZj12b2lkIDAsdz1bXSx2PW4sZz1sLGI9MDtiPG0ubGVuZ3RoO2IrKylzd2l0Y2gobVtiXSl7Y2FzZSByOmYmJih3LnB1c2goZiksZj12b2lkIDApLHYrKyxnKys7YnJlYWs7Y2FzZSBvOmZ8fChmPXQodixbXSwwKSksZi5hZGRlZENvdW50KyssdisrLGYucmVtb3ZlZC5wdXNoKGNbZ10pLGcrKzticmVhaztjYXNlIGk6Znx8KGY9dCh2LFtdLDApKSxmLmFkZGVkQ291bnQrKyx2Kys7YnJlYWs7Y2FzZSBhOmZ8fChmPXQodixbXSwwKSksZi5yZW1vdmVkLnB1c2goY1tnXSksZysrfXJldHVybiBmJiZ3LnB1c2goZiksd30sc2hhcmVkUHJlZml4OmZ1bmN0aW9uKGUsdCxuKXtmb3IodmFyIHI9MDtuPnI7cisrKWlmKCF0aGlzLmVxdWFscyhlW3JdLHRbcl0pKXJldHVybiByO3JldHVybiBufSxzaGFyZWRTdWZmaXg6ZnVuY3Rpb24oZSx0LG4pe2Zvcih2YXIgcj1lLmxlbmd0aCxvPXQubGVuZ3RoLGk9MDtuPmkmJnRoaXMuZXF1YWxzKGVbLS1yXSx0Wy0tb10pOylpKys7cmV0dXJuIGl9LGNhbGN1bGF0ZVNwbGljZXM6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5jYWxjU3BsaWNlcyhlLDAsZS5sZW5ndGgsdCwwLHQubGVuZ3RoKX0sZXF1YWxzOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU9PT10fX0sZS5BcnJheVNwbGljZT1ufSh3aW5kb3cuU2hhZG93RE9NUG9seWZpbGwpLGZ1bmN0aW9uKGUpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIHQoKXthPSExO3ZhciBlPWkuc2xpY2UoMCk7aT1bXTtmb3IodmFyIHQ9MDt0PGUubGVuZ3RoO3QrKykoMCxlW3RdKSgpfWZ1bmN0aW9uIG4oZSl7aS5wdXNoKGUpLGF8fChhPSEwLHIodCwwKSl9dmFyIHIsbz13aW5kb3cuTXV0YXRpb25PYnNlcnZlcixpPVtdLGE9ITE7aWYobyl7dmFyIHM9MSxjPW5ldyBvKHQpLGw9ZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUocyk7Yy5vYnNlcnZlKGwse2NoYXJhY3RlckRhdGE6ITB9KSxyPWZ1bmN0aW9uKCl7cz0ocysxKSUyLGwuZGF0YT1zfX1lbHNlIHI9d2luZG93LnNldFRpbWVvdXQ7ZS5zZXRFbmRPZk1pY3JvdGFzaz1ufSh3aW5kb3cuU2hhZG93RE9NUG9seWZpbGwpLGZ1bmN0aW9uKGUpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIHQoZSl7ZS5zY2hlZHVsZWRffHwoZS5zY2hlZHVsZWRfPSEwLGYucHVzaChlKSxtfHwodShuKSxtPSEwKSl9ZnVuY3Rpb24gbigpe2ZvcihtPSExO2YubGVuZ3RoOyl7dmFyIGU9ZjtmPVtdLGUuc29ydChmdW5jdGlvbihlLHQpe3JldHVybiBlLnVpZF8tdC51aWRffSk7Zm9yKHZhciB0PTA7dDxlLmxlbmd0aDt0Kyspe3ZhciBuPWVbdF07bi5zY2hlZHVsZWRfPSExO3ZhciByPW4udGFrZVJlY29yZHMoKTtpKG4pLHIubGVuZ3RoJiZuLmNhbGxiYWNrXyhyLG4pfX19ZnVuY3Rpb24gcihlLHQpe3RoaXMudHlwZT1lLHRoaXMudGFyZ2V0PXQsdGhpcy5hZGRlZE5vZGVzPW5ldyBwLk5vZGVMaXN0LHRoaXMucmVtb3ZlZE5vZGVzPW5ldyBwLk5vZGVMaXN0LHRoaXMucHJldmlvdXNTaWJsaW5nPW51bGwsdGhpcy5uZXh0U2libGluZz1udWxsLHRoaXMuYXR0cmlidXRlTmFtZT1udWxsLHRoaXMuYXR0cmlidXRlTmFtZXNwYWNlPW51bGwsdGhpcy5vbGRWYWx1ZT1udWxsfWZ1bmN0aW9uIG8oZSx0KXtmb3IoO2U7ZT1lLnBhcmVudE5vZGUpe3ZhciBuPWguZ2V0KGUpO2lmKG4pZm9yKHZhciByPTA7cjxuLmxlbmd0aDtyKyspe3ZhciBvPW5bcl07by5vcHRpb25zLnN1YnRyZWUmJm8uYWRkVHJhbnNpZW50T2JzZXJ2ZXIodCl9fX1mdW5jdGlvbiBpKGUpe2Zvcih2YXIgdD0wO3Q8ZS5ub2Rlc18ubGVuZ3RoO3QrKyl7dmFyIG49ZS5ub2Rlc19bdF0scj1oLmdldChuKTtpZighcilyZXR1cm47Zm9yKHZhciBvPTA7bzxyLmxlbmd0aDtvKyspe3ZhciBpPXJbb107aS5vYnNlcnZlcj09PWUmJmkucmVtb3ZlVHJhbnNpZW50T2JzZXJ2ZXJzKCl9fX1mdW5jdGlvbiBhKGUsbixvKXtmb3IodmFyIGk9T2JqZWN0LmNyZWF0ZShudWxsKSxhPU9iamVjdC5jcmVhdGUobnVsbCkscz1lO3M7cz1zLnBhcmVudE5vZGUpe3ZhciBjPWguZ2V0KHMpO2lmKGMpZm9yKHZhciBsPTA7bDxjLmxlbmd0aDtsKyspe3ZhciB1PWNbbF0sZD11Lm9wdGlvbnM7aWYoKHM9PT1lfHxkLnN1YnRyZWUpJiYoXCJhdHRyaWJ1dGVzXCIhPT1ufHxkLmF0dHJpYnV0ZXMpJiYoXCJhdHRyaWJ1dGVzXCIhPT1ufHwhZC5hdHRyaWJ1dGVGaWx0ZXJ8fG51bGw9PT1vLm5hbWVzcGFjZSYmLTEhPT1kLmF0dHJpYnV0ZUZpbHRlci5pbmRleE9mKG8ubmFtZSkpJiYoXCJjaGFyYWN0ZXJEYXRhXCIhPT1ufHxkLmNoYXJhY3RlckRhdGEpJiYoXCJjaGlsZExpc3RcIiE9PW58fGQuY2hpbGRMaXN0KSl7dmFyIHA9dS5vYnNlcnZlcjtpW3AudWlkX109cCwoXCJhdHRyaWJ1dGVzXCI9PT1uJiZkLmF0dHJpYnV0ZU9sZFZhbHVlfHxcImNoYXJhY3RlckRhdGFcIj09PW4mJmQuY2hhcmFjdGVyRGF0YU9sZFZhbHVlKSYmKGFbcC51aWRfXT1vLm9sZFZhbHVlKX19fWZvcih2YXIgZiBpbiBpKXt2YXIgcD1pW2ZdLG09bmV3IHIobixlKTtcIm5hbWVcImluIG8mJlwibmFtZXNwYWNlXCJpbiBvJiYobS5hdHRyaWJ1dGVOYW1lPW8ubmFtZSxtLmF0dHJpYnV0ZU5hbWVzcGFjZT1vLm5hbWVzcGFjZSksby5hZGRlZE5vZGVzJiYobS5hZGRlZE5vZGVzPW8uYWRkZWROb2Rlcyksby5yZW1vdmVkTm9kZXMmJihtLnJlbW92ZWROb2Rlcz1vLnJlbW92ZWROb2Rlcyksby5wcmV2aW91c1NpYmxpbmcmJihtLnByZXZpb3VzU2libGluZz1vLnByZXZpb3VzU2libGluZyksby5uZXh0U2libGluZyYmKG0ubmV4dFNpYmxpbmc9by5uZXh0U2libGluZyksdm9pZCAwIT09YVtmXSYmKG0ub2xkVmFsdWU9YVtmXSksdChwKSxwLnJlY29yZHNfLnB1c2gobSl9fWZ1bmN0aW9uIHMoZSl7aWYodGhpcy5jaGlsZExpc3Q9ISFlLmNoaWxkTGlzdCx0aGlzLnN1YnRyZWU9ISFlLnN1YnRyZWUsXCJhdHRyaWJ1dGVzXCJpbiBlfHwhKFwiYXR0cmlidXRlT2xkVmFsdWVcImluIGV8fFwiYXR0cmlidXRlRmlsdGVyXCJpbiBlKT90aGlzLmF0dHJpYnV0ZXM9ISFlLmF0dHJpYnV0ZXM6dGhpcy5hdHRyaWJ1dGVzPSEwLFwiY2hhcmFjdGVyRGF0YU9sZFZhbHVlXCJpbiBlJiYhKFwiY2hhcmFjdGVyRGF0YVwiaW4gZSk/dGhpcy5jaGFyYWN0ZXJEYXRhPSEwOnRoaXMuY2hhcmFjdGVyRGF0YT0hIWUuY2hhcmFjdGVyRGF0YSwhdGhpcy5hdHRyaWJ1dGVzJiYoZS5hdHRyaWJ1dGVPbGRWYWx1ZXx8XCJhdHRyaWJ1dGVGaWx0ZXJcImluIGUpfHwhdGhpcy5jaGFyYWN0ZXJEYXRhJiZlLmNoYXJhY3RlckRhdGFPbGRWYWx1ZSl0aHJvdyBuZXcgVHlwZUVycm9yO2lmKHRoaXMuY2hhcmFjdGVyRGF0YT0hIWUuY2hhcmFjdGVyRGF0YSx0aGlzLmF0dHJpYnV0ZU9sZFZhbHVlPSEhZS5hdHRyaWJ1dGVPbGRWYWx1ZSx0aGlzLmNoYXJhY3RlckRhdGFPbGRWYWx1ZT0hIWUuY2hhcmFjdGVyRGF0YU9sZFZhbHVlLFwiYXR0cmlidXRlRmlsdGVyXCJpbiBlKXtpZihudWxsPT1lLmF0dHJpYnV0ZUZpbHRlcnx8XCJvYmplY3RcIiE9dHlwZW9mIGUuYXR0cmlidXRlRmlsdGVyKXRocm93IG5ldyBUeXBlRXJyb3I7dGhpcy5hdHRyaWJ1dGVGaWx0ZXI9dy5jYWxsKGUuYXR0cmlidXRlRmlsdGVyKX1lbHNlIHRoaXMuYXR0cmlidXRlRmlsdGVyPW51bGx9ZnVuY3Rpb24gYyhlKXt0aGlzLmNhbGxiYWNrXz1lLHRoaXMubm9kZXNfPVtdLHRoaXMucmVjb3Jkc189W10sdGhpcy51aWRfPSsrdix0aGlzLnNjaGVkdWxlZF89ITF9ZnVuY3Rpb24gbChlLHQsbil7dGhpcy5vYnNlcnZlcj1lLHRoaXMudGFyZ2V0PXQsdGhpcy5vcHRpb25zPW4sdGhpcy50cmFuc2llbnRPYnNlcnZlZE5vZGVzPVtdfXZhciB1PWUuc2V0RW5kT2ZNaWNyb3Rhc2ssZD1lLndyYXBJZk5lZWRlZCxwPWUud3JhcHBlcnMsaD1uZXcgV2Vha01hcCxmPVtdLG09ITEsdz1BcnJheS5wcm90b3R5cGUuc2xpY2Usdj0wO2MucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpjLG9ic2VydmU6ZnVuY3Rpb24oZSx0KXtlPWQoZSk7dmFyIG4scj1uZXcgcyh0KSxvPWguZ2V0KGUpO298fGguc2V0KGUsbz1bXSk7Zm9yKHZhciBpPTA7aTxvLmxlbmd0aDtpKyspb1tpXS5vYnNlcnZlcj09PXRoaXMmJihuPW9baV0sbi5yZW1vdmVUcmFuc2llbnRPYnNlcnZlcnMoKSxuLm9wdGlvbnM9cik7bnx8KG49bmV3IGwodGhpcyxlLHIpLG8ucHVzaChuKSx0aGlzLm5vZGVzXy5wdXNoKGUpKX0sZGlzY29ubmVjdDpmdW5jdGlvbigpe3RoaXMubm9kZXNfLmZvckVhY2goZnVuY3Rpb24oZSl7Zm9yKHZhciB0PWguZ2V0KGUpLG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIHI9dFtuXTtpZihyLm9ic2VydmVyPT09dGhpcyl7dC5zcGxpY2UobiwxKTticmVha319fSx0aGlzKSx0aGlzLnJlY29yZHNfPVtdfSx0YWtlUmVjb3JkczpmdW5jdGlvbigpe3ZhciBlPXRoaXMucmVjb3Jkc187cmV0dXJuIHRoaXMucmVjb3Jkc189W10sZX19LGwucHJvdG90eXBlPXthZGRUcmFuc2llbnRPYnNlcnZlcjpmdW5jdGlvbihlKXtpZihlIT09dGhpcy50YXJnZXQpe3QodGhpcy5vYnNlcnZlciksdGhpcy50cmFuc2llbnRPYnNlcnZlZE5vZGVzLnB1c2goZSk7dmFyIG49aC5nZXQoZSk7bnx8aC5zZXQoZSxuPVtdKSxuLnB1c2godGhpcyl9fSxyZW1vdmVUcmFuc2llbnRPYnNlcnZlcnM6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnRyYW5zaWVudE9ic2VydmVkTm9kZXM7dGhpcy50cmFuc2llbnRPYnNlcnZlZE5vZGVzPVtdO2Zvcih2YXIgdD0wO3Q8ZS5sZW5ndGg7dCsrKWZvcih2YXIgbj1lW3RdLHI9aC5nZXQobiksbz0wO288ci5sZW5ndGg7bysrKWlmKHJbb109PT10aGlzKXtyLnNwbGljZShvLDEpO2JyZWFrfX19LGUuZW5xdWV1ZU11dGF0aW9uPWEsZS5yZWdpc3RlclRyYW5zaWVudE9ic2VydmVycz1vLGUud3JhcHBlcnMuTXV0YXRpb25PYnNlcnZlcj1jLGUud3JhcHBlcnMuTXV0YXRpb25SZWNvcmQ9cn0od2luZG93LlNoYWRvd0RPTVBvbHlmaWxsKSxmdW5jdGlvbihlKXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiB0KGUsdCl7dGhpcy5yb290PWUsdGhpcy5wYXJlbnQ9dH1mdW5jdGlvbiBuKGUsdCl7aWYoZS50cmVlU2NvcGVfIT09dCl7ZS50cmVlU2NvcGVfPXQ7Zm9yKHZhciByPWUuc2hhZG93Um9vdDtyO3I9ci5vbGRlclNoYWRvd1Jvb3Qpci50cmVlU2NvcGVfLnBhcmVudD10O2Zvcih2YXIgbz1lLmZpcnN0Q2hpbGQ7bztvPW8ubmV4dFNpYmxpbmcpbihvLHQpfX1mdW5jdGlvbiByKG4pe2lmKG4gaW5zdGFuY2VvZiBlLndyYXBwZXJzLldpbmRvdyxuLnRyZWVTY29wZV8pcmV0dXJuIG4udHJlZVNjb3BlXzt2YXIgbyxpPW4ucGFyZW50Tm9kZTtyZXR1cm4gbz1pP3IoaSk6bmV3IHQobixudWxsKSxuLnRyZWVTY29wZV89b310LnByb3RvdHlwZT17Z2V0IHJlbmRlcmVyKCl7cmV0dXJuIHRoaXMucm9vdCBpbnN0YW5jZW9mIGUud3JhcHBlcnMuU2hhZG93Um9vdD9lLmdldFJlbmRlcmVyRm9ySG9zdCh0aGlzLnJvb3QuaG9zdCk6bnVsbH0sY29udGFpbnM6ZnVuY3Rpb24oZSl7Zm9yKDtlO2U9ZS5wYXJlbnQpaWYoZT09PXRoaXMpcmV0dXJuITA7cmV0dXJuITF9fSxlLlRyZWVTY29wZT10LGUuZ2V0VHJlZVNjb3BlPXIsZS5zZXRUcmVlU2NvcGU9bn0od2luZG93LlNoYWRvd0RPTVBvbHlmaWxsKSxmdW5jdGlvbihlKXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiB0KGUpe3JldHVybiBlIGluc3RhbmNlb2YgRy5TaGFkb3dSb290fWZ1bmN0aW9uIG4oZSl7cmV0dXJuIEEoZSkucm9vdH1mdW5jdGlvbiByKGUscil7dmFyIHM9W10sYz1lO2ZvcihzLnB1c2goYyk7Yzspe3ZhciBsPWEoYyk7aWYobCYmbC5sZW5ndGg+MCl7Zm9yKHZhciB1PTA7dTxsLmxlbmd0aDt1Kyspe3ZhciBwPWxbdV07aWYoaShwKSl7dmFyIGg9bihwKSxmPWgub2xkZXJTaGFkb3dSb290O2YmJnMucHVzaChmKX1zLnB1c2gocCl9Yz1sW2wubGVuZ3RoLTFdfWVsc2UgaWYodChjKSl7aWYoZChlLGMpJiZvKHIpKWJyZWFrO2M9Yy5ob3N0LHMucHVzaChjKX1lbHNlIGM9Yy5wYXJlbnROb2RlLGMmJnMucHVzaChjKX1yZXR1cm4gc31mdW5jdGlvbiBvKGUpe2lmKCFlKXJldHVybiExO3N3aXRjaChlLnR5cGUpe2Nhc2VcImFib3J0XCI6Y2FzZVwiZXJyb3JcIjpjYXNlXCJzZWxlY3RcIjpjYXNlXCJjaGFuZ2VcIjpjYXNlXCJsb2FkXCI6Y2FzZVwicmVzZXRcIjpjYXNlXCJyZXNpemVcIjpjYXNlXCJzY3JvbGxcIjpjYXNlXCJzZWxlY3RzdGFydFwiOnJldHVybiEwfXJldHVybiExfWZ1bmN0aW9uIGkoZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBIVE1MU2hhZG93RWxlbWVudH1mdW5jdGlvbiBhKHQpe3JldHVybiBlLmdldERlc3RpbmF0aW9uSW5zZXJ0aW9uUG9pbnRzKHQpfWZ1bmN0aW9uIHMoZSx0KXtpZigwPT09ZS5sZW5ndGgpcmV0dXJuIHQ7dCBpbnN0YW5jZW9mIEcuV2luZG93JiYodD10LmRvY3VtZW50KTtmb3IodmFyIG49QSh0KSxyPWVbMF0sbz1BKHIpLGk9bChuLG8pLGE9MDthPGUubGVuZ3RoO2ErKyl7dmFyIHM9ZVthXTtpZihBKHMpPT09aSlyZXR1cm4gc31yZXR1cm4gZVtlLmxlbmd0aC0xXX1mdW5jdGlvbiBjKGUpe2Zvcih2YXIgdD1bXTtlO2U9ZS5wYXJlbnQpdC5wdXNoKGUpO3JldHVybiB0fWZ1bmN0aW9uIGwoZSx0KXtmb3IodmFyIG49YyhlKSxyPWModCksbz1udWxsO24ubGVuZ3RoPjAmJnIubGVuZ3RoPjA7KXt2YXIgaT1uLnBvcCgpLGE9ci5wb3AoKTtpZihpIT09YSlicmVhaztvPWl9cmV0dXJuIG99ZnVuY3Rpb24gdShlLHQsbil7dCBpbnN0YW5jZW9mIEcuV2luZG93JiYodD10LmRvY3VtZW50KTt2YXIgbyxpPUEodCksYT1BKG4pLHM9cihuLGUpLG89bChpLGEpO298fChvPWEucm9vdCk7Zm9yKHZhciBjPW87YztjPWMucGFyZW50KWZvcih2YXIgdT0wO3U8cy5sZW5ndGg7dSsrKXt2YXIgZD1zW3VdO2lmKEEoZCk9PT1jKXJldHVybiBkfXJldHVybiBudWxsfWZ1bmN0aW9uIGQoZSx0KXtyZXR1cm4gQShlKT09PUEodCl9ZnVuY3Rpb24gcChlKXtpZighSy5nZXQoZSkmJihLLnNldChlLCEwKSxmKFYoZSksVihlLnRhcmdldCkpLFApKXt2YXIgdD1QO3Rocm93IFA9bnVsbCx0fX1mdW5jdGlvbiBoKGUpe3N3aXRjaChlLnR5cGUpe2Nhc2VcImxvYWRcIjpjYXNlXCJiZWZvcmV1bmxvYWRcIjpjYXNlXCJ1bmxvYWRcIjpyZXR1cm4hMH1yZXR1cm4hMX1mdW5jdGlvbiBmKHQsbil7aWYoJC5nZXQodCkpdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZFN0YXRlRXJyb3JcIik7JC5zZXQodCwhMCksZS5yZW5kZXJBbGxQZW5kaW5nKCk7dmFyIG8saSxhO2lmKGgodCkmJiF0LmJ1YmJsZXMpe3ZhciBzPW47cyBpbnN0YW5jZW9mIEcuRG9jdW1lbnQmJihhPXMuZGVmYXVsdFZpZXcpJiYoaT1zLG89W10pfWlmKCFvKWlmKG4gaW5zdGFuY2VvZiBHLldpbmRvdylhPW4sbz1bXTtlbHNlIGlmKG89cihuLHQpLCFoKHQpKXt2YXIgcz1vW28ubGVuZ3RoLTFdO3MgaW5zdGFuY2VvZiBHLkRvY3VtZW50JiYoYT1zLmRlZmF1bHRWaWV3KX1yZXR1cm4gbmUuc2V0KHQsbyksbSh0LG8sYSxpKSYmdyh0LG8sYSxpKSYmdih0LG8sYSxpKSxKLnNldCh0LHJlKSxZW1wiZGVsZXRlXCJdKHQsbnVsbCksJFtcImRlbGV0ZVwiXSh0KSx0LmRlZmF1bHRQcmV2ZW50ZWR9ZnVuY3Rpb24gbShlLHQsbixyKXt2YXIgbz1vZTtpZihuJiYhZyhuLGUsbyx0LHIpKXJldHVybiExO2Zvcih2YXIgaT10Lmxlbmd0aC0xO2k+MDtpLS0paWYoIWcodFtpXSxlLG8sdCxyKSlyZXR1cm4hMTtyZXR1cm4hMH1mdW5jdGlvbiB3KGUsdCxuLHIpe3ZhciBvPWllLGk9dFswXXx8bjtyZXR1cm4gZyhpLGUsbyx0LHIpfWZ1bmN0aW9uIHYoZSx0LG4scil7Zm9yKHZhciBvPWFlLGk9MTtpPHQubGVuZ3RoO2krKylpZighZyh0W2ldLGUsbyx0LHIpKXJldHVybjtuJiZ0Lmxlbmd0aD4wJiZnKG4sZSxvLHQscil9ZnVuY3Rpb24gZyhlLHQsbixyLG8pe3ZhciBpPXouZ2V0KGUpO2lmKCFpKXJldHVybiEwO3ZhciBhPW98fHMocixlKTtpZihhPT09ZSl7aWYobj09PW9lKXJldHVybiEwO249PT1hZSYmKG49aWUpfWVsc2UgaWYobj09PWFlJiYhdC5idWJibGVzKXJldHVybiEwO2lmKFwicmVsYXRlZFRhcmdldFwiaW4gdCl7dmFyIGM9Qih0KSxsPWMucmVsYXRlZFRhcmdldDtpZihsKXtpZihsIGluc3RhbmNlb2YgT2JqZWN0JiZsLmFkZEV2ZW50TGlzdGVuZXIpe3ZhciBkPVYobCkscD11KHQsZSxkKTtpZihwPT09YSlyZXR1cm4hMH1lbHNlIHA9bnVsbDtaLnNldCh0LHApfX1KLnNldCh0LG4pO3ZhciBoPXQudHlwZSxmPSExO1guc2V0KHQsYSksWS5zZXQodCxlKSxpLmRlcHRoKys7Zm9yKHZhciBtPTAsdz1pLmxlbmd0aDt3Pm07bSsrKXt2YXIgdj1pW21dO2lmKHYucmVtb3ZlZClmPSEwO2Vsc2UgaWYoISh2LnR5cGUhPT1ofHwhdi5jYXB0dXJlJiZuPT09b2V8fHYuY2FwdHVyZSYmbj09PWFlKSl0cnl7aWYoXCJmdW5jdGlvblwiPT10eXBlb2Ygdi5oYW5kbGVyP3YuaGFuZGxlci5jYWxsKGUsdCk6di5oYW5kbGVyLmhhbmRsZUV2ZW50KHQpLGVlLmdldCh0KSlyZXR1cm4hMX1jYXRjaChnKXtQfHwoUD1nKX19aWYoaS5kZXB0aC0tLGYmJjA9PT1pLmRlcHRoKXt2YXIgYj1pLnNsaWNlKCk7aS5sZW5ndGg9MDtmb3IodmFyIG09MDttPGIubGVuZ3RoO20rKyliW21dLnJlbW92ZWR8fGkucHVzaChiW21dKX1yZXR1cm4hUS5nZXQodCl9ZnVuY3Rpb24gYihlLHQsbil7dGhpcy50eXBlPWUsdGhpcy5oYW5kbGVyPXQsdGhpcy5jYXB0dXJlPUJvb2xlYW4obil9ZnVuY3Rpb24geShlLHQpe2lmKCEoZSBpbnN0YW5jZW9mIHNlKSlyZXR1cm4gVihUKHNlLFwiRXZlbnRcIixlLHQpKTt2YXIgbj1lO3JldHVybiBiZXx8XCJiZWZvcmV1bmxvYWRcIiE9PW4udHlwZXx8dGhpcyBpbnN0YW5jZW9mIE0/dm9pZCBVKG4sdGhpcyk6bmV3IE0obil9ZnVuY3Rpb24gRShlKXtyZXR1cm4gZSYmZS5yZWxhdGVkVGFyZ2V0P09iamVjdC5jcmVhdGUoZSx7cmVsYXRlZFRhcmdldDp7dmFsdWU6QihlLnJlbGF0ZWRUYXJnZXQpfX0pOmV9ZnVuY3Rpb24gXyhlLHQsbil7dmFyIHI9d2luZG93W2VdLG89ZnVuY3Rpb24odCxuKXtyZXR1cm4gdCBpbnN0YW5jZW9mIHI/dm9pZCBVKHQsdGhpcyk6VihUKHIsZSx0LG4pKX07aWYoby5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0LnByb3RvdHlwZSksbiYmVyhvLnByb3RvdHlwZSxuKSxyKXRyeXtGKHIsbyxuZXcgcihcInRlbXBcIikpfWNhdGNoKGkpe0YocixvLGRvY3VtZW50LmNyZWF0ZUV2ZW50KGUpKX1yZXR1cm4gb31mdW5jdGlvbiBTKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKCl7YXJndW1lbnRzW3RdPUIoYXJndW1lbnRzW3RdKTt2YXIgbj1CKHRoaXMpO25bZV0uYXBwbHkobixhcmd1bWVudHMpfX1mdW5jdGlvbiBUKGUsdCxuLHIpe2lmKHZlKXJldHVybiBuZXcgZShuLEUocikpO3ZhciBvPUIoZG9jdW1lbnQuY3JlYXRlRXZlbnQodCkpLGk9d2VbdF0sYT1bbl07cmV0dXJuIE9iamVjdC5rZXlzKGkpLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9bnVsbCE9ciYmZSBpbiByP3JbZV06aVtlXTtcInJlbGF0ZWRUYXJnZXRcIj09PWUmJih0PUIodCkpLGEucHVzaCh0KX0pLG9bXCJpbml0XCIrdF0uYXBwbHkobyxhKSxvfWZ1bmN0aW9uIE0oZSl7eS5jYWxsKHRoaXMsZSl9ZnVuY3Rpb24gTyhlKXtyZXR1cm5cImZ1bmN0aW9uXCI9PXR5cGVvZiBlPyEwOmUmJmUuaGFuZGxlRXZlbnR9ZnVuY3Rpb24gTChlKXtzd2l0Y2goZSl7Y2FzZVwiRE9NQXR0ck1vZGlmaWVkXCI6Y2FzZVwiRE9NQXR0cmlidXRlTmFtZUNoYW5nZWRcIjpjYXNlXCJET01DaGFyYWN0ZXJEYXRhTW9kaWZpZWRcIjpjYXNlXCJET01FbGVtZW50TmFtZUNoYW5nZWRcIjpjYXNlXCJET01Ob2RlSW5zZXJ0ZWRcIjpjYXNlXCJET01Ob2RlSW5zZXJ0ZWRJbnRvRG9jdW1lbnRcIjpjYXNlXCJET01Ob2RlUmVtb3ZlZFwiOmNhc2VcIkRPTU5vZGVSZW1vdmVkRnJvbURvY3VtZW50XCI6Y2FzZVwiRE9NU3VidHJlZU1vZGlmaWVkXCI6cmV0dXJuITB9cmV0dXJuITF9ZnVuY3Rpb24gTihlKXtVKGUsdGhpcyl9ZnVuY3Rpb24gQyhlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIEcuU2hhZG93Um9vdCYmKGU9ZS5ob3N0KSxCKGUpfWZ1bmN0aW9uIGooZSx0KXt2YXIgbj16LmdldChlKTtpZihuKWZvcih2YXIgcj0wO3I8bi5sZW5ndGg7cisrKWlmKCFuW3JdLnJlbW92ZWQmJm5bcl0udHlwZT09PXQpcmV0dXJuITA7cmV0dXJuITF9ZnVuY3Rpb24gRChlLHQpe2Zvcih2YXIgbj1CKGUpO247bj1uLnBhcmVudE5vZGUpaWYoaihWKG4pLHQpKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIEgoZSl7ayhlLEVlKX1mdW5jdGlvbiB4KHQsbixvLGkpe2UucmVuZGVyQWxsUGVuZGluZygpO3ZhciBhPVYoX2UuY2FsbChxKG4pLG8saSkpO2lmKCFhKXJldHVybiBudWxsO3ZhciBjPXIoYSxudWxsKSxsPWMubGFzdEluZGV4T2YodCk7cmV0dXJuLTE9PWw/bnVsbDooYz1jLnNsaWNlKDAsbCkscyhjLHQpKX1mdW5jdGlvbiBSKGUpe3JldHVybiBmdW5jdGlvbigpe3ZhciB0PXRlLmdldCh0aGlzKTtyZXR1cm4gdCYmdFtlXSYmdFtlXS52YWx1ZXx8bnVsbH19ZnVuY3Rpb24gSShlKXt2YXIgdD1lLnNsaWNlKDIpO3JldHVybiBmdW5jdGlvbihuKXt2YXIgcj10ZS5nZXQodGhpcyk7cnx8KHI9T2JqZWN0LmNyZWF0ZShudWxsKSx0ZS5zZXQodGhpcyxyKSk7dmFyIG89cltlXTtpZihvJiZ0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIodCxvLndyYXBwZWQsITEpLFwiZnVuY3Rpb25cIj09dHlwZW9mIG4pe3ZhciBpPWZ1bmN0aW9uKHQpe3ZhciByPW4uY2FsbCh0aGlzLHQpO3I9PT0hMT90LnByZXZlbnREZWZhdWx0KCk6XCJvbmJlZm9yZXVubG9hZFwiPT09ZSYmXCJzdHJpbmdcIj09dHlwZW9mIHImJih0LnJldHVyblZhbHVlPXIpfTt0aGlzLmFkZEV2ZW50TGlzdGVuZXIodCxpLCExKSxyW2VdPXt2YWx1ZTpuLHdyYXBwZWQ6aX19fX12YXIgUCxrPWUuZm9yd2FyZE1ldGhvZHNUb1dyYXBwZXIsQT1lLmdldFRyZWVTY29wZSxXPWUubWl4aW4sRj1lLnJlZ2lzdGVyV3JhcHBlcixVPWUuc2V0V3JhcHBlcixxPWUudW5zYWZlVW53cmFwLEI9ZS51bndyYXAsVj1lLndyYXAsRz1lLndyYXBwZXJzLHo9KG5ldyBXZWFrTWFwLG5ldyBXZWFrTWFwKSxLPW5ldyBXZWFrTWFwLCQ9bmV3IFdlYWtNYXAsWD1uZXcgV2Vha01hcCxZPW5ldyBXZWFrTWFwLFo9bmV3IFdlYWtNYXAsSj1uZXcgV2Vha01hcCxRPW5ldyBXZWFrTWFwLGVlPW5ldyBXZWFrTWFwLHRlPW5ldyBXZWFrTWFwLG5lPW5ldyBXZWFrTWFwLHJlPTAsb2U9MSxpZT0yLGFlPTM7Yi5wcm90b3R5cGU9e2VxdWFsczpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5oYW5kbGVyPT09ZS5oYW5kbGVyJiZ0aGlzLnR5cGU9PT1lLnR5cGUmJnRoaXMuY2FwdHVyZT09PWUuY2FwdHVyZX0sZ2V0IHJlbW92ZWQoKXtyZXR1cm4gbnVsbD09PXRoaXMuaGFuZGxlcn0scmVtb3ZlOmZ1bmN0aW9uKCl7dGhpcy5oYW5kbGVyPW51bGx9fTt2YXIgc2U9d2luZG93LkV2ZW50O3NlLnByb3RvdHlwZS5wb2x5bWVyQmxhY2tMaXN0Xz17cmV0dXJuVmFsdWU6ITAsa2V5TG9jYXRpb246ITB9LHkucHJvdG90eXBlPXtnZXQgdGFyZ2V0KCl7cmV0dXJuIFguZ2V0KHRoaXMpfSxnZXQgY3VycmVudFRhcmdldCgpe3JldHVybiBZLmdldCh0aGlzKX0sZ2V0IGV2ZW50UGhhc2UoKXtyZXR1cm4gSi5nZXQodGhpcyl9LGdldCBwYXRoKCl7dmFyIGU9bmUuZ2V0KHRoaXMpO3JldHVybiBlP2Uuc2xpY2UoKTpbXX0sc3RvcFByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7US5zZXQodGhpcywhMCl9LHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbjpmdW5jdGlvbigpe1Euc2V0KHRoaXMsITApLGVlLnNldCh0aGlzLCEwKX19O3ZhciBjZT1mdW5jdGlvbigpe3ZhciBlPWRvY3VtZW50LmNyZWF0ZUV2ZW50KFwiRXZlbnRcIik7cmV0dXJuIGUuaW5pdEV2ZW50KFwidGVzdFwiLCEwLCEwKSxlLnByZXZlbnREZWZhdWx0KCksZS5kZWZhdWx0UHJldmVudGVkfSgpO2NlfHwoeS5wcm90b3R5cGUucHJldmVudERlZmF1bHQ9ZnVuY3Rpb24oKXt0aGlzLmNhbmNlbGFibGUmJihxKHRoaXMpLnByZXZlbnREZWZhdWx0KCksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsXCJkZWZhdWx0UHJldmVudGVkXCIse2dldDpmdW5jdGlvbigpe3JldHVybiEwfSxjb25maWd1cmFibGU6ITB9KSl9KSxGKHNlLHksZG9jdW1lbnQuY3JlYXRlRXZlbnQoXCJFdmVudFwiKSk7dmFyIGxlPV8oXCJVSUV2ZW50XCIseSksdWU9XyhcIkN1c3RvbUV2ZW50XCIseSksZGU9e2dldCByZWxhdGVkVGFyZ2V0KCl7dmFyIGU9Wi5nZXQodGhpcyk7cmV0dXJuIHZvaWQgMCE9PWU/ZTpWKEIodGhpcykucmVsYXRlZFRhcmdldCl9fSxwZT1XKHtpbml0TW91c2VFdmVudDpTKFwiaW5pdE1vdXNlRXZlbnRcIiwxNCl9LGRlKSxoZT1XKHtpbml0Rm9jdXNFdmVudDpTKFwiaW5pdEZvY3VzRXZlbnRcIiw1KX0sZGUpLGZlPV8oXCJNb3VzZUV2ZW50XCIsbGUscGUpLG1lPV8oXCJGb2N1c0V2ZW50XCIsbGUsaGUpLHdlPU9iamVjdC5jcmVhdGUobnVsbCksdmU9ZnVuY3Rpb24oKXt0cnl7bmV3IHdpbmRvdy5Gb2N1c0V2ZW50KFwiZm9jdXNcIil9Y2F0Y2goZSl7cmV0dXJuITF9cmV0dXJuITB9KCk7aWYoIXZlKXt2YXIgZ2U9ZnVuY3Rpb24oZSx0LG4pe2lmKG4pe3ZhciByPXdlW25dO3Q9VyhXKHt9LHIpLHQpfXdlW2VdPXR9O2dlKFwiRXZlbnRcIix7YnViYmxlczohMSxjYW5jZWxhYmxlOiExfSksZ2UoXCJDdXN0b21FdmVudFwiLHtkZXRhaWw6bnVsbH0sXCJFdmVudFwiKSxnZShcIlVJRXZlbnRcIix7dmlldzpudWxsLGRldGFpbDowfSxcIkV2ZW50XCIpLGdlKFwiTW91c2VFdmVudFwiLHtzY3JlZW5YOjAsc2NyZWVuWTowLGNsaWVudFg6MCxjbGllbnRZOjAsY3RybEtleTohMSxhbHRLZXk6ITEsc2hpZnRLZXk6ITEsbWV0YUtleTohMSxidXR0b246MCxyZWxhdGVkVGFyZ2V0Om51bGx9LFwiVUlFdmVudFwiKSxnZShcIkZvY3VzRXZlbnRcIix7cmVsYXRlZFRhcmdldDpudWxsfSxcIlVJRXZlbnRcIil9dmFyIGJlPXdpbmRvdy5CZWZvcmVVbmxvYWRFdmVudDtNLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHkucHJvdG90eXBlKSxXKE0ucHJvdG90eXBlLHtnZXQgcmV0dXJuVmFsdWUoKXtyZXR1cm4gcSh0aGlzKS5yZXR1cm5WYWx1ZX0sc2V0IHJldHVyblZhbHVlKGUpe3EodGhpcykucmV0dXJuVmFsdWU9ZX19KSxiZSYmRihiZSxNKTt2YXIgeWU9d2luZG93LkV2ZW50VGFyZ2V0LEVlPVtcImFkZEV2ZW50TGlzdGVuZXJcIixcInJlbW92ZUV2ZW50TGlzdGVuZXJcIixcImRpc3BhdGNoRXZlbnRcIl07W05vZGUsV2luZG93XS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PWUucHJvdG90eXBlO0VlLmZvckVhY2goZnVuY3Rpb24oZSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsZStcIl9cIix7dmFsdWU6dFtlXX0pfSl9KSxOLnByb3RvdHlwZT17YWRkRXZlbnRMaXN0ZW5lcjpmdW5jdGlvbihlLHQsbil7aWYoTyh0KSYmIUwoZSkpe3ZhciByPW5ldyBiKGUsdCxuKSxvPXouZ2V0KHRoaXMpO2lmKG8pe2Zvcih2YXIgaT0wO2k8by5sZW5ndGg7aSsrKWlmKHIuZXF1YWxzKG9baV0pKXJldHVybn1lbHNlIG89W10sby5kZXB0aD0wLHouc2V0KHRoaXMsbyk7by5wdXNoKHIpO3ZhciBhPUModGhpcyk7YS5hZGRFdmVudExpc3RlbmVyXyhlLHAsITApfX0scmVtb3ZlRXZlbnRMaXN0ZW5lcjpmdW5jdGlvbihlLHQsbil7bj1Cb29sZWFuKG4pO3ZhciByPXouZ2V0KHRoaXMpO2lmKHIpe2Zvcih2YXIgbz0wLGk9ITEsYT0wO2E8ci5sZW5ndGg7YSsrKXJbYV0udHlwZT09PWUmJnJbYV0uY2FwdHVyZT09PW4mJihvKyssclthXS5oYW5kbGVyPT09dCYmKGk9ITAsclthXS5yZW1vdmUoKSkpO2lmKGkmJjE9PT1vKXt2YXIgcz1DKHRoaXMpO3MucmVtb3ZlRXZlbnRMaXN0ZW5lcl8oZSxwLCEwKX19fSxkaXNwYXRjaEV2ZW50OmZ1bmN0aW9uKHQpe3ZhciBuPUIodCkscj1uLnR5cGU7Sy5zZXQobiwhMSksZS5yZW5kZXJBbGxQZW5kaW5nKCk7dmFyIG87RCh0aGlzLHIpfHwobz1mdW5jdGlvbigpe30sdGhpcy5hZGRFdmVudExpc3RlbmVyKHIsbywhMCkpO3RyeXtyZXR1cm4gQih0aGlzKS5kaXNwYXRjaEV2ZW50XyhuKX1maW5hbGx5e28mJnRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihyLG8sITApfX19LHllJiZGKHllLE4pO3ZhciBfZT1kb2N1bWVudC5lbGVtZW50RnJvbVBvaW50O2UuZWxlbWVudEZyb21Qb2ludD14LGUuZ2V0RXZlbnRIYW5kbGVyR2V0dGVyPVIsZS5nZXRFdmVudEhhbmRsZXJTZXR0ZXI9SSxlLndyYXBFdmVudFRhcmdldE1ldGhvZHM9SCxlLndyYXBwZXJzLkJlZm9yZVVubG9hZEV2ZW50PU0sZS53cmFwcGVycy5DdXN0b21FdmVudD11ZSxlLndyYXBwZXJzLkV2ZW50PXksZS53cmFwcGVycy5FdmVudFRhcmdldD1OLGUud3JhcHBlcnMuRm9jdXNFdmVudD1tZSxlLndyYXBwZXJzLk1vdXNlRXZlbnQ9ZmUsZS53cmFwcGVycy5VSUV2ZW50PWxlfSh3aW5kb3cuU2hhZG93RE9NUG9seWZpbGwpLGZ1bmN0aW9uKGUpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIHQoZSx0KXtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LG0pfWZ1bmN0aW9uIG4oZSl7bChlLHRoaXMpfWZ1bmN0aW9uIHIoKXt0aGlzLmxlbmd0aD0wLHQodGhpcyxcImxlbmd0aFwiKX1mdW5jdGlvbiBvKGUpe2Zvcih2YXIgdD1uZXcgcixvPTA7bzxlLmxlbmd0aDtvKyspdFtvXT1uZXcgbihlW29dKTtyZXR1cm4gdC5sZW5ndGg9byx0fWZ1bmN0aW9uIGkoZSl7YS5jYWxsKHRoaXMsZSl9dmFyIGE9ZS53cmFwcGVycy5VSUV2ZW50LHM9ZS5taXhpbixjPWUucmVnaXN0ZXJXcmFwcGVyLGw9ZS5zZXRXcmFwcGVyLHU9ZS51bnNhZmVVbndyYXAsZD1lLndyYXAscD13aW5kb3cuVG91Y2hFdmVudDtpZihwKXt2YXIgaDt0cnl7aD1kb2N1bWVudC5jcmVhdGVFdmVudChcIlRvdWNoRXZlbnRcIil9Y2F0Y2goZil7cmV0dXJufXZhciBtPXtlbnVtZXJhYmxlOiExfTtuLnByb3RvdHlwZT17Z2V0IHRhcmdldCgpe3JldHVybiBkKHUodGhpcykudGFyZ2V0KX19O3ZhciB3PXtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6bnVsbH07W1wiY2xpZW50WFwiLFwiY2xpZW50WVwiLFwic2NyZWVuWFwiLFwic2NyZWVuWVwiLFwicGFnZVhcIixcInBhZ2VZXCIsXCJpZGVudGlmaWVyXCIsXCJ3ZWJraXRSYWRpdXNYXCIsXCJ3ZWJraXRSYWRpdXNZXCIsXCJ3ZWJraXRSb3RhdGlvbkFuZ2xlXCIsXCJ3ZWJraXRGb3JjZVwiXS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3cuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIHUodGhpcylbZV19LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuLnByb3RvdHlwZSxlLHcpfSksci5wcm90b3R5cGU9e2l0ZW06ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXNbZV19fSxpLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGEucHJvdG90eXBlKSxzKGkucHJvdG90eXBlLHtnZXQgdG91Y2hlcygpe3JldHVybiBvKHUodGhpcykudG91Y2hlcyl9LGdldCB0YXJnZXRUb3VjaGVzKCl7cmV0dXJuIG8odSh0aGlzKS50YXJnZXRUb3VjaGVzKX0sZ2V0IGNoYW5nZWRUb3VjaGVzKCl7cmV0dXJuIG8odSh0aGlzKS5jaGFuZ2VkVG91Y2hlcyl9LGluaXRUb3VjaEV2ZW50OmZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKFwiTm90IGltcGxlbWVudGVkXCIpfX0pLGMocCxpLGgpLGUud3JhcHBlcnMuVG91Y2g9bixlLndyYXBwZXJzLlRvdWNoRXZlbnQ9aSxlLndyYXBwZXJzLlRvdWNoTGlzdD1yfX0od2luZG93LlNoYWRvd0RPTVBvbHlmaWxsKSxmdW5jdGlvbihlKXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiB0KGUsdCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCxzKX1mdW5jdGlvbiBuKCl7dGhpcy5sZW5ndGg9MCx0KHRoaXMsXCJsZW5ndGhcIil9ZnVuY3Rpb24gcihlKXtpZihudWxsPT1lKXJldHVybiBlO2Zvcih2YXIgdD1uZXcgbixyPTAsbz1lLmxlbmd0aDtvPnI7cisrKXRbcl09YShlW3JdKTtyZXR1cm4gdC5sZW5ndGg9byx0fWZ1bmN0aW9uIG8oZSx0KXtlLnByb3RvdHlwZVt0XT1mdW5jdGlvbigpe3JldHVybiByKGkodGhpcylbdF0uYXBwbHkoaSh0aGlzKSxhcmd1bWVudHMpKX19dmFyIGk9ZS51bnNhZmVVbndyYXAsYT1lLndyYXAscz17ZW51bWVyYWJsZTohMX07bi5wcm90b3R5cGU9e2l0ZW06ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXNbZV19fSx0KG4ucHJvdG90eXBlLFwiaXRlbVwiKSxlLndyYXBwZXJzLk5vZGVMaXN0PW4sZS5hZGRXcmFwTm9kZUxpc3RNZXRob2Q9byxlLndyYXBOb2RlTGlzdD1yfSh3aW5kb3cuU2hhZG93RE9NUG9seWZpbGwpLGZ1bmN0aW9uKGUpe1widXNlIHN0cmljdFwiO2Uud3JhcEhUTUxDb2xsZWN0aW9uPWUud3JhcE5vZGVMaXN0LGUud3JhcHBlcnMuSFRNTENvbGxlY3Rpb249ZS53cmFwcGVycy5Ob2RlTGlzdH0od2luZG93LlNoYWRvd0RPTVBvbHlmaWxsKSxmdW5jdGlvbihlKXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiB0KGUpe08oZSBpbnN0YW5jZW9mIF8pfWZ1bmN0aW9uIG4oZSl7dmFyIHQ9bmV3IFQ7cmV0dXJuIHRbMF09ZSx0Lmxlbmd0aD0xLHR9ZnVuY3Rpb24gcihlLHQsbil7Tih0LFwiY2hpbGRMaXN0XCIse3JlbW92ZWROb2RlczpuLHByZXZpb3VzU2libGluZzplLnByZXZpb3VzU2libGluZyxuZXh0U2libGluZzplLm5leHRTaWJsaW5nfSl9ZnVuY3Rpb24gbyhlLHQpe04oZSxcImNoaWxkTGlzdFwiLHtyZW1vdmVkTm9kZXM6dH0pfWZ1bmN0aW9uIGkoZSx0LHIsbyl7aWYoZSBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQpe3ZhciBpPXMoZSk7VT0hMDtmb3IodmFyIGE9aS5sZW5ndGgtMTthPj0wO2EtLSllLnJlbW92ZUNoaWxkKGlbYV0pLGlbYV0ucGFyZW50Tm9kZV89dDtVPSExO2Zvcih2YXIgYT0wO2E8aS5sZW5ndGg7YSsrKWlbYV0ucHJldmlvdXNTaWJsaW5nXz1pW2EtMV18fHIsaVthXS5uZXh0U2libGluZ189aVthKzFdfHxvO3JldHVybiByJiYoci5uZXh0U2libGluZ189aVswXSksbyYmKG8ucHJldmlvdXNTaWJsaW5nXz1pW2kubGVuZ3RoLTFdKSxpfXZhciBpPW4oZSksYz1lLnBhcmVudE5vZGU7cmV0dXJuIGMmJmMucmVtb3ZlQ2hpbGQoZSksZS5wYXJlbnROb2RlXz10LGUucHJldmlvdXNTaWJsaW5nXz1yLGUubmV4dFNpYmxpbmdfPW8sciYmKHIubmV4dFNpYmxpbmdfPWUpLG8mJihvLnByZXZpb3VzU2libGluZ189ZSksaX1mdW5jdGlvbiBhKGUpe2lmKGUgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50KXJldHVybiBzKGUpO3ZhciB0PW4oZSksbz1lLnBhcmVudE5vZGU7cmV0dXJuIG8mJnIoZSxvLHQpLHR9ZnVuY3Rpb24gcyhlKXtmb3IodmFyIHQ9bmV3IFQsbj0wLHI9ZS5maXJzdENoaWxkO3I7cj1yLm5leHRTaWJsaW5nKXRbbisrXT1yO3JldHVybiB0Lmxlbmd0aD1uLG8oZSx0KSx0fWZ1bmN0aW9uIGMoZSl7cmV0dXJuIGV9ZnVuY3Rpb24gbChlLHQpe1IoZSx0KSxlLm5vZGVJc0luc2VydGVkXygpfWZ1bmN0aW9uIHUoZSx0KXtmb3IodmFyIG49Qyh0KSxyPTA7cjxlLmxlbmd0aDtyKyspbChlW3JdLG4pfWZ1bmN0aW9uIGQoZSl7UihlLG5ldyBNKGUsbnVsbCkpfWZ1bmN0aW9uIHAoZSl7Zm9yKHZhciB0PTA7dDxlLmxlbmd0aDt0KyspZChlW3RdKX1mdW5jdGlvbiBoKGUsdCl7dmFyIG49ZS5ub2RlVHlwZT09PV8uRE9DVU1FTlRfTk9ERT9lOmUub3duZXJEb2N1bWVudDtuIT09dC5vd25lckRvY3VtZW50JiZuLmFkb3B0Tm9kZSh0KX1mdW5jdGlvbiBmKHQsbil7aWYobi5sZW5ndGgpe3ZhciByPXQub3duZXJEb2N1bWVudDtpZihyIT09blswXS5vd25lckRvY3VtZW50KWZvcih2YXIgbz0wO288bi5sZW5ndGg7bysrKWUuYWRvcHROb2RlTm9SZW1vdmUobltvXSxyKX19ZnVuY3Rpb24gbShlLHQpe2YoZSx0KTt2YXIgbj10Lmxlbmd0aDtpZigxPT09bilyZXR1cm4gUCh0WzBdKTtmb3IodmFyIHI9UChlLm93bmVyRG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpKSxvPTA7bj5vO28rKylyLmFwcGVuZENoaWxkKFAodFtvXSkpO3JldHVybiByfWZ1bmN0aW9uIHcoZSl7aWYodm9pZCAwIT09ZS5maXJzdENoaWxkXylmb3IodmFyIHQ9ZS5maXJzdENoaWxkXzt0Oyl7dmFyIG49dDt0PXQubmV4dFNpYmxpbmdfLG4ucGFyZW50Tm9kZV89bi5wcmV2aW91c1NpYmxpbmdfPW4ubmV4dFNpYmxpbmdfPXZvaWQgMH1lLmZpcnN0Q2hpbGRfPWUubGFzdENoaWxkXz12b2lkIDB9ZnVuY3Rpb24gdihlKXtpZihlLmludmFsaWRhdGVTaGFkb3dSZW5kZXJlcigpKXtmb3IodmFyIHQ9ZS5maXJzdENoaWxkO3Q7KXtPKHQucGFyZW50Tm9kZT09PWUpO3ZhciBuPXQubmV4dFNpYmxpbmcscj1QKHQpLG89ci5wYXJlbnROb2RlO28mJlguY2FsbChvLHIpLHQucHJldmlvdXNTaWJsaW5nXz10Lm5leHRTaWJsaW5nXz10LnBhcmVudE5vZGVfPW51bGwsdD1ufWUuZmlyc3RDaGlsZF89ZS5sYXN0Q2hpbGRfPW51bGx9ZWxzZSBmb3IodmFyIG4saT1QKGUpLGE9aS5maXJzdENoaWxkO2E7KW49YS5uZXh0U2libGluZyxYLmNhbGwoaSxhKSxhPW59ZnVuY3Rpb24gZyhlKXt2YXIgdD1lLnBhcmVudE5vZGU7cmV0dXJuIHQmJnQuaW52YWxpZGF0ZVNoYWRvd1JlbmRlcmVyKCl9ZnVuY3Rpb24gYihlKXtmb3IodmFyIHQsbj0wO248ZS5sZW5ndGg7bisrKXQ9ZVtuXSx0LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodCl9ZnVuY3Rpb24geShlLHQsbil7dmFyIHI7aWYocj1BKG4/cS5jYWxsKG4sSShlKSwhMSk6Qi5jYWxsKEkoZSksITEpKSx0KXtmb3IodmFyIG89ZS5maXJzdENoaWxkO287bz1vLm5leHRTaWJsaW5nKXIuYXBwZW5kQ2hpbGQoeShvLCEwLG4pKTtpZihlIGluc3RhbmNlb2YgRi5IVE1MVGVtcGxhdGVFbGVtZW50KWZvcih2YXIgaT1yLmNvbnRlbnQsbz1lLmNvbnRlbnQuZmlyc3RDaGlsZDtvO289by5uZXh0U2libGluZylpLmFwcGVuZENoaWxkKHkobywhMCxuKSl9cmV0dXJuIHJ9ZnVuY3Rpb24gRShlLHQpe2lmKCF0fHxDKGUpIT09Qyh0KSlyZXR1cm4hMTtmb3IodmFyIG49dDtuO249bi5wYXJlbnROb2RlKWlmKG49PT1lKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIF8oZSl7TyhlIGluc3RhbmNlb2YgViksUy5jYWxsKHRoaXMsZSksdGhpcy5wYXJlbnROb2RlXz12b2lkIDAsdGhpcy5maXJzdENoaWxkXz12b2lkIDAsdGhpcy5sYXN0Q2hpbGRfPXZvaWQgMCx0aGlzLm5leHRTaWJsaW5nXz12b2lkIDAsdGhpcy5wcmV2aW91c1NpYmxpbmdfPXZvaWQgMCx0aGlzLnRyZWVTY29wZV89dm9pZCAwfXZhciBTPWUud3JhcHBlcnMuRXZlbnRUYXJnZXQsVD1lLndyYXBwZXJzLk5vZGVMaXN0LE09ZS5UcmVlU2NvcGUsTz1lLmFzc2VydCxMPWUuZGVmaW5lV3JhcEdldHRlcixOPWUuZW5xdWV1ZU11dGF0aW9uLEM9ZS5nZXRUcmVlU2NvcGUsaj1lLmlzV3JhcHBlcixEPWUubWl4aW4sSD1lLnJlZ2lzdGVyVHJhbnNpZW50T2JzZXJ2ZXJzLHg9ZS5yZWdpc3RlcldyYXBwZXIsUj1lLnNldFRyZWVTY29wZSxJPWUudW5zYWZlVW53cmFwLFA9ZS51bndyYXAsaz1lLnVud3JhcElmTmVlZGVkLEE9ZS53cmFwLFc9ZS53cmFwSWZOZWVkZWQsRj1lLndyYXBwZXJzLFU9ITEscT1kb2N1bWVudC5pbXBvcnROb2RlLEI9d2luZG93Lk5vZGUucHJvdG90eXBlLmNsb25lTm9kZSxWPXdpbmRvdy5Ob2RlLEc9d2luZG93LkRvY3VtZW50RnJhZ21lbnQsej0oVi5wcm90b3R5cGUuYXBwZW5kQ2hpbGQsVi5wcm90b3R5cGUuY29tcGFyZURvY3VtZW50UG9zaXRpb24pLEs9Vi5wcm90b3R5cGUuaXNFcXVhbE5vZGUsJD1WLnByb3RvdHlwZS5pbnNlcnRCZWZvcmUsWD1WLnByb3RvdHlwZS5yZW1vdmVDaGlsZCxZPVYucHJvdG90eXBlLnJlcGxhY2VDaGlsZCxaPS9UcmlkZW50fEVkZ2UvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCksSj1aP2Z1bmN0aW9uKGUsdCl7dHJ5e1guY2FsbChlLHQpfWNhdGNoKG4pe2lmKCEoZSBpbnN0YW5jZW9mIEcpKXRocm93IG59fTpmdW5jdGlvbihlLHQpe1guY2FsbChlLHQpfTtfLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFMucHJvdG90eXBlKSxEKF8ucHJvdG90eXBlLHthcHBlbmRDaGlsZDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5pbnNlcnRCZWZvcmUoZSxudWxsKX0saW5zZXJ0QmVmb3JlOmZ1bmN0aW9uKGUsbil7dChlKTt2YXIgcjtuP2oobik/cj1QKG4pOihyPW4sbj1BKHIpKToobj1udWxsLHI9bnVsbCksbiYmTyhuLnBhcmVudE5vZGU9PT10aGlzKTt2YXIgbyxzPW4/bi5wcmV2aW91c1NpYmxpbmc6dGhpcy5sYXN0Q2hpbGQsYz0hdGhpcy5pbnZhbGlkYXRlU2hhZG93UmVuZGVyZXIoKSYmIWcoZSk7aWYobz1jP2EoZSk6aShlLHRoaXMscyxuKSxjKWgodGhpcyxlKSx3KHRoaXMpLCQuY2FsbChJKHRoaXMpLFAoZSkscik7ZWxzZXtzfHwodGhpcy5maXJzdENoaWxkXz1vWzBdKSxufHwodGhpcy5sYXN0Q2hpbGRfPW9bby5sZW5ndGgtMV0sdm9pZCAwPT09dGhpcy5maXJzdENoaWxkXyYmKHRoaXMuZmlyc3RDaGlsZF89dGhpcy5maXJzdENoaWxkKSk7dmFyIGw9cj9yLnBhcmVudE5vZGU6SSh0aGlzKTtsPyQuY2FsbChsLG0odGhpcyxvKSxyKTpmKHRoaXMsbyl9cmV0dXJuIE4odGhpcyxcImNoaWxkTGlzdFwiLHthZGRlZE5vZGVzOm8sbmV4dFNpYmxpbmc6bixwcmV2aW91c1NpYmxpbmc6c30pLHUobyx0aGlzKSxlfSxyZW1vdmVDaGlsZDpmdW5jdGlvbihlKXtpZih0KGUpLGUucGFyZW50Tm9kZSE9PXRoaXMpe2Zvcih2YXIgcj0hMSxvPSh0aGlzLmNoaWxkTm9kZXMsdGhpcy5maXJzdENoaWxkKTtvO289by5uZXh0U2libGluZylpZihvPT09ZSl7cj0hMDticmVha31pZighcil0aHJvdyBuZXcgRXJyb3IoXCJOb3RGb3VuZEVycm9yXCIpfXZhciBpPVAoZSksYT1lLm5leHRTaWJsaW5nLHM9ZS5wcmV2aW91c1NpYmxpbmc7aWYodGhpcy5pbnZhbGlkYXRlU2hhZG93UmVuZGVyZXIoKSl7dmFyIGM9dGhpcy5maXJzdENoaWxkLGw9dGhpcy5sYXN0Q2hpbGQsdT1pLnBhcmVudE5vZGU7dSYmSih1LGkpLGM9PT1lJiYodGhpcy5maXJzdENoaWxkXz1hKSxsPT09ZSYmKHRoaXMubGFzdENoaWxkXz1zKSxzJiYocy5uZXh0U2libGluZ189YSksYSYmKGEucHJldmlvdXNTaWJsaW5nXz1zKSxlLnByZXZpb3VzU2libGluZ189ZS5uZXh0U2libGluZ189ZS5wYXJlbnROb2RlXz12b2lkIDB9ZWxzZSB3KHRoaXMpLEooSSh0aGlzKSxpKTtyZXR1cm4gVXx8Tih0aGlzLFwiY2hpbGRMaXN0XCIse3JlbW92ZWROb2RlczpuKGUpLG5leHRTaWJsaW5nOmEscHJldmlvdXNTaWJsaW5nOnN9KSxIKHRoaXMsZSksZX0scmVwbGFjZUNoaWxkOmZ1bmN0aW9uKGUscil7dChlKTt2YXIgbztpZihqKHIpP289UChyKToobz1yLHI9QShvKSksci5wYXJlbnROb2RlIT09dGhpcyl0aHJvdyBuZXcgRXJyb3IoXCJOb3RGb3VuZEVycm9yXCIpO3ZhciBzLGM9ci5uZXh0U2libGluZyxsPXIucHJldmlvdXNTaWJsaW5nLHA9IXRoaXMuaW52YWxpZGF0ZVNoYWRvd1JlbmRlcmVyKCkmJiFnKGUpO3JldHVybiBwP3M9YShlKTooYz09PWUmJihjPWUubmV4dFNpYmxpbmcpLHM9aShlLHRoaXMsbCxjKSkscD8oaCh0aGlzLGUpLHcodGhpcyksWS5jYWxsKEkodGhpcyksUChlKSxvKSk6KHRoaXMuZmlyc3RDaGlsZD09PXImJih0aGlzLmZpcnN0Q2hpbGRfPXNbMF0pLHRoaXMubGFzdENoaWxkPT09ciYmKHRoaXMubGFzdENoaWxkXz1zW3MubGVuZ3RoLTFdKSxyLnByZXZpb3VzU2libGluZ189ci5uZXh0U2libGluZ189ci5wYXJlbnROb2RlXz12b2lkIDAsby5wYXJlbnROb2RlJiZZLmNhbGwoby5wYXJlbnROb2RlLG0odGhpcyxzKSxvKSksTih0aGlzLFwiY2hpbGRMaXN0XCIse2FkZGVkTm9kZXM6cyxyZW1vdmVkTm9kZXM6bihyKSxuZXh0U2libGluZzpjLHByZXZpb3VzU2libGluZzpsfSksZChyKSx1KHMsdGhpcykscn0sbm9kZUlzSW5zZXJ0ZWRfOmZ1bmN0aW9uKCl7Zm9yKHZhciBlPXRoaXMuZmlyc3RDaGlsZDtlO2U9ZS5uZXh0U2libGluZyllLm5vZGVJc0luc2VydGVkXygpfSxoYXNDaGlsZE5vZGVzOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGwhPT10aGlzLmZpcnN0Q2hpbGR9LGdldCBwYXJlbnROb2RlKCl7cmV0dXJuIHZvaWQgMCE9PXRoaXMucGFyZW50Tm9kZV8/dGhpcy5wYXJlbnROb2RlXzpBKEkodGhpcykucGFyZW50Tm9kZSl9LGdldCBmaXJzdENoaWxkKCl7cmV0dXJuIHZvaWQgMCE9PXRoaXMuZmlyc3RDaGlsZF8/dGhpcy5maXJzdENoaWxkXzpBKEkodGhpcykuZmlyc3RDaGlsZCl9LGdldCBsYXN0Q2hpbGQoKXtyZXR1cm4gdm9pZCAwIT09dGhpcy5sYXN0Q2hpbGRfP3RoaXMubGFzdENoaWxkXzpBKEkodGhpcykubGFzdENoaWxkKX0sZ2V0IG5leHRTaWJsaW5nKCl7cmV0dXJuIHZvaWQgMCE9PXRoaXMubmV4dFNpYmxpbmdfP3RoaXMubmV4dFNpYmxpbmdfOkEoSSh0aGlzKS5uZXh0U2libGluZyl9LGdldCBwcmV2aW91c1NpYmxpbmcoKXtyZXR1cm4gdm9pZCAwIT09dGhpcy5wcmV2aW91c1NpYmxpbmdfP3RoaXMucHJldmlvdXNTaWJsaW5nXzpBKEkodGhpcykucHJldmlvdXNTaWJsaW5nKX0sZ2V0IHBhcmVudEVsZW1lbnQoKXtmb3IodmFyIGU9dGhpcy5wYXJlbnROb2RlO2UmJmUubm9kZVR5cGUhPT1fLkVMRU1FTlRfTk9ERTspZT1lLnBhcmVudE5vZGU7cmV0dXJuIGV9LGdldCB0ZXh0Q29udGVudCgpe2Zvcih2YXIgZT1cIlwiLHQ9dGhpcy5maXJzdENoaWxkO3Q7dD10Lm5leHRTaWJsaW5nKXQubm9kZVR5cGUhPV8uQ09NTUVOVF9OT0RFJiYoZSs9dC50ZXh0Q29udGVudCk7cmV0dXJuIGV9LHNldCB0ZXh0Q29udGVudChlKXtudWxsPT1lJiYoZT1cIlwiKTt2YXIgdD1jKHRoaXMuY2hpbGROb2Rlcyk7aWYodGhpcy5pbnZhbGlkYXRlU2hhZG93UmVuZGVyZXIoKSl7aWYodih0aGlzKSxcIlwiIT09ZSl7dmFyIG49SSh0aGlzKS5vd25lckRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGUpO3RoaXMuYXBwZW5kQ2hpbGQobil9fWVsc2Ugdyh0aGlzKSxJKHRoaXMpLnRleHRDb250ZW50PWU7dmFyIHI9Yyh0aGlzLmNoaWxkTm9kZXMpO04odGhpcyxcImNoaWxkTGlzdFwiLHthZGRlZE5vZGVzOnIscmVtb3ZlZE5vZGVzOnR9KSxwKHQpLHUocix0aGlzKX0sZ2V0IGNoaWxkTm9kZXMoKXtmb3IodmFyIGU9bmV3IFQsdD0wLG49dGhpcy5maXJzdENoaWxkO247bj1uLm5leHRTaWJsaW5nKWVbdCsrXT1uO3JldHVybiBlLmxlbmd0aD10LGV9LGNsb25lTm9kZTpmdW5jdGlvbihlKXtyZXR1cm4geSh0aGlzLGUpfSxjb250YWluczpmdW5jdGlvbihlKXtyZXR1cm4gRSh0aGlzLFcoZSkpfSxjb21wYXJlRG9jdW1lbnRQb3NpdGlvbjpmdW5jdGlvbihlKXtyZXR1cm4gei5jYWxsKEkodGhpcyksayhlKSl9LGlzRXF1YWxOb2RlOmZ1bmN0aW9uKGUpe3JldHVybiBLLmNhbGwoSSh0aGlzKSxrKGUpKX0sbm9ybWFsaXplOmZ1bmN0aW9uKCl7Zm9yKHZhciBlLHQsbj1jKHRoaXMuY2hpbGROb2Rlcykscj1bXSxvPVwiXCIsaT0wO2k8bi5sZW5ndGg7aSsrKXQ9bltpXSx0Lm5vZGVUeXBlPT09Xy5URVhUX05PREU/ZXx8dC5kYXRhLmxlbmd0aD9lPyhvKz10LmRhdGEsci5wdXNoKHQpKTplPXQ6dGhpcy5yZW1vdmVDaGlsZCh0KTooZSYmci5sZW5ndGgmJihlLmRhdGErPW8sYihyKSkscj1bXSxvPVwiXCIsZT1udWxsLHQuY2hpbGROb2Rlcy5sZW5ndGgmJnQubm9ybWFsaXplKCkpO2UmJnIubGVuZ3RoJiYoZS5kYXRhKz1vLGIocikpfX0pLEwoXyxcIm93bmVyRG9jdW1lbnRcIikseChWLF8sZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpKSxkZWxldGUgXy5wcm90b3R5cGUucXVlcnlTZWxlY3RvcixkZWxldGUgXy5wcm90b3R5cGUucXVlcnlTZWxlY3RvckFsbCxfLnByb3RvdHlwZT1EKE9iamVjdC5jcmVhdGUoUy5wcm90b3R5cGUpLF8ucHJvdG90eXBlKSxlLmNsb25lTm9kZT15LGUubm9kZVdhc0FkZGVkPWwsZS5ub2RlV2FzUmVtb3ZlZD1kLGUubm9kZXNXZXJlQWRkZWQ9dSxlLm5vZGVzV2VyZVJlbW92ZWQ9cCxlLm9yaWdpbmFsSW5zZXJ0QmVmb3JlPSQsZS5vcmlnaW5hbFJlbW92ZUNoaWxkPVgsZS5zbmFwc2hvdE5vZGVMaXN0PWMsZS53cmFwcGVycy5Ob2RlPV99KHdpbmRvdy5TaGFkb3dET01Qb2x5ZmlsbCksZnVuY3Rpb24oZSl7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gdCh0LG4scixvKXtmb3IodmFyIGk9bnVsbCxhPW51bGwscz0wLGM9dC5sZW5ndGg7Yz5zO3MrKylpPWIodFtzXSksIW8mJihhPXYoaSkucm9vdCkmJmEgaW5zdGFuY2VvZiBlLndyYXBwZXJzLlNoYWRvd1Jvb3R8fChyW24rK109aSk7cmV0dXJuIG59ZnVuY3Rpb24gbihlKXtyZXR1cm4gU3RyaW5nKGUpLnJlcGxhY2UoL1xcL2RlZXBcXC98OjpzaGFkb3d8Pj4+L2csXCIgXCIpfWZ1bmN0aW9uIHIoZSl7cmV0dXJuIFN0cmluZyhlKS5yZXBsYWNlKC86aG9zdFxcKChbXlxcc10rKVxcKS9nLFwiJDFcIikucmVwbGFjZSgvKFteXFxzXSk6aG9zdC9nLFwiJDFcIikucmVwbGFjZShcIjpob3N0XCIsXCIqXCIpLnJlcGxhY2UoL1xcXnxcXC9zaGFkb3dcXC98XFwvc2hhZG93LWRlZXBcXC98OjpzaGFkb3d8XFwvZGVlcFxcL3w6OmNvbnRlbnR8Pj4+L2csXCIgXCIpfWZ1bmN0aW9uIG8oZSx0KXtmb3IodmFyIG4scj1lLmZpcnN0RWxlbWVudENoaWxkO3I7KXtpZihyLm1hdGNoZXModCkpcmV0dXJuIHI7aWYobj1vKHIsdCkpcmV0dXJuIG47cj1yLm5leHRFbGVtZW50U2libGluZ31yZXR1cm4gbnVsbH1mdW5jdGlvbiBpKGUsdCl7cmV0dXJuIGUubWF0Y2hlcyh0KX1mdW5jdGlvbiBhKGUsdCxuKXt2YXIgcj1lLmxvY2FsTmFtZTtyZXR1cm4gcj09PXR8fHI9PT1uJiZlLm5hbWVzcGFjZVVSST09PWp9ZnVuY3Rpb24gcygpe3JldHVybiEwfWZ1bmN0aW9uIGMoZSx0LG4pe3JldHVybiBlLmxvY2FsTmFtZT09PW59ZnVuY3Rpb24gbChlLHQpe3JldHVybiBlLm5hbWVzcGFjZVVSST09PXR9ZnVuY3Rpb24gdShlLHQsbil7cmV0dXJuIGUubmFtZXNwYWNlVVJJPT09dCYmZS5sb2NhbE5hbWU9PT1ufWZ1bmN0aW9uIGQoZSx0LG4scixvLGkpe2Zvcih2YXIgYT1lLmZpcnN0RWxlbWVudENoaWxkO2E7KXIoYSxvLGkpJiYoblt0KytdPWEpLHQ9ZChhLHQsbixyLG8saSksYT1hLm5leHRFbGVtZW50U2libGluZztyZXR1cm4gdH1mdW5jdGlvbiBwKG4scixvLGksYSl7dmFyIHMsYz1nKHRoaXMpLGw9dih0aGlzKS5yb290O2lmKGwgaW5zdGFuY2VvZiBlLndyYXBwZXJzLlNoYWRvd1Jvb3QpcmV0dXJuIGQodGhpcyxyLG8sbixpLG51bGwpO2lmKGMgaW5zdGFuY2VvZiBOKXM9Uy5jYWxsKGMsaSk7ZWxzZXtpZighKGMgaW5zdGFuY2VvZiBDKSlyZXR1cm4gZCh0aGlzLHIsbyxuLGksbnVsbCk7cz1fLmNhbGwoYyxpKX1yZXR1cm4gdChzLHIsbyxhKX1mdW5jdGlvbiBoKG4scixvLGksYSl7dmFyIHMsYz1nKHRoaXMpLGw9dih0aGlzKS5yb290O2lmKGwgaW5zdGFuY2VvZiBlLndyYXBwZXJzLlNoYWRvd1Jvb3QpcmV0dXJuIGQodGhpcyxyLG8sbixpLGEpO2lmKGMgaW5zdGFuY2VvZiBOKXM9TS5jYWxsKGMsaSxhKTtlbHNle2lmKCEoYyBpbnN0YW5jZW9mIEMpKXJldHVybiBkKHRoaXMscixvLG4saSxhKTtzPVQuY2FsbChjLGksYSl9cmV0dXJuIHQocyxyLG8sITEpfWZ1bmN0aW9uIGYobixyLG8saSxhKXt2YXIgcyxjPWcodGhpcyksbD12KHRoaXMpLnJvb3Q7aWYobCBpbnN0YW5jZW9mIGUud3JhcHBlcnMuU2hhZG93Um9vdClyZXR1cm4gZCh0aGlzLHIsbyxuLGksYSk7aWYoYyBpbnN0YW5jZW9mIE4pcz1MLmNhbGwoYyxpLGEpO2Vsc2V7aWYoIShjIGluc3RhbmNlb2YgQykpcmV0dXJuIGQodGhpcyxyLG8sbixpLGEpO3M9Ty5jYWxsKGMsaSxhKX1yZXR1cm4gdChzLHIsbywhMSl9dmFyIG09ZS53cmFwcGVycy5IVE1MQ29sbGVjdGlvbix3PWUud3JhcHBlcnMuTm9kZUxpc3Qsdj1lLmdldFRyZWVTY29wZSxnPWUudW5zYWZlVW53cmFwLGI9ZS53cmFwLHk9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcixFPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5xdWVyeVNlbGVjdG9yLF89ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCxTPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsLFQ9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUsTT1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUsTz1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZU5TLEw9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lTlMsTj13aW5kb3cuRWxlbWVudCxDPXdpbmRvdy5IVE1MRG9jdW1lbnR8fHdpbmRvdy5Eb2N1bWVudCxqPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbFwiLEQ9e1xucXVlcnlTZWxlY3RvcjpmdW5jdGlvbih0KXt2YXIgcj1uKHQpLGk9ciE9PXQ7dD1yO3ZhciBhLHM9Zyh0aGlzKSxjPXYodGhpcykucm9vdDtpZihjIGluc3RhbmNlb2YgZS53cmFwcGVycy5TaGFkb3dSb290KXJldHVybiBvKHRoaXMsdCk7aWYocyBpbnN0YW5jZW9mIE4pYT1iKEUuY2FsbChzLHQpKTtlbHNle2lmKCEocyBpbnN0YW5jZW9mIEMpKXJldHVybiBvKHRoaXMsdCk7YT1iKHkuY2FsbChzLHQpKX1yZXR1cm4gYSYmIWkmJihjPXYoYSkucm9vdCkmJmMgaW5zdGFuY2VvZiBlLndyYXBwZXJzLlNoYWRvd1Jvb3Q/byh0aGlzLHQpOmF9LHF1ZXJ5U2VsZWN0b3JBbGw6ZnVuY3Rpb24oZSl7dmFyIHQ9bihlKSxyPXQhPT1lO2U9dDt2YXIgbz1uZXcgdztyZXR1cm4gby5sZW5ndGg9cC5jYWxsKHRoaXMsaSwwLG8sZSxyKSxvfX0sSD17bWF0Y2hlczpmdW5jdGlvbih0KXtyZXR1cm4gdD1yKHQpLGUub3JpZ2luYWxNYXRjaGVzLmNhbGwoZyh0aGlzKSx0KX19LHg9e2dldEVsZW1lbnRzQnlUYWdOYW1lOmZ1bmN0aW9uKGUpe3ZhciB0PW5ldyBtLG49XCIqXCI9PT1lP3M6YTtyZXR1cm4gdC5sZW5ndGg9aC5jYWxsKHRoaXMsbiwwLHQsZSxlLnRvTG93ZXJDYXNlKCkpLHR9LGdldEVsZW1lbnRzQnlDbGFzc05hbWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucXVlcnlTZWxlY3RvckFsbChcIi5cIitlKX0sZ2V0RWxlbWVudHNCeVRhZ05hbWVOUzpmdW5jdGlvbihlLHQpe3ZhciBuPW5ldyBtLHI9bnVsbDtyZXR1cm4gcj1cIipcIj09PWU/XCIqXCI9PT10P3M6YzpcIipcIj09PXQ/bDp1LG4ubGVuZ3RoPWYuY2FsbCh0aGlzLHIsMCxuLGV8fG51bGwsdCksbn19O2UuR2V0RWxlbWVudHNCeUludGVyZmFjZT14LGUuU2VsZWN0b3JzSW50ZXJmYWNlPUQsZS5NYXRjaGVzSW50ZXJmYWNlPUh9KHdpbmRvdy5TaGFkb3dET01Qb2x5ZmlsbCksZnVuY3Rpb24oZSl7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gdChlKXtmb3IoO2UmJmUubm9kZVR5cGUhPT1Ob2RlLkVMRU1FTlRfTk9ERTspZT1lLm5leHRTaWJsaW5nO3JldHVybiBlfWZ1bmN0aW9uIG4oZSl7Zm9yKDtlJiZlLm5vZGVUeXBlIT09Tm9kZS5FTEVNRU5UX05PREU7KWU9ZS5wcmV2aW91c1NpYmxpbmc7cmV0dXJuIGV9dmFyIHI9ZS53cmFwcGVycy5Ob2RlTGlzdCxvPXtnZXQgZmlyc3RFbGVtZW50Q2hpbGQoKXtyZXR1cm4gdCh0aGlzLmZpcnN0Q2hpbGQpfSxnZXQgbGFzdEVsZW1lbnRDaGlsZCgpe3JldHVybiBuKHRoaXMubGFzdENoaWxkKX0sZ2V0IGNoaWxkRWxlbWVudENvdW50KCl7Zm9yKHZhciBlPTAsdD10aGlzLmZpcnN0RWxlbWVudENoaWxkO3Q7dD10Lm5leHRFbGVtZW50U2libGluZyllKys7cmV0dXJuIGV9LGdldCBjaGlsZHJlbigpe2Zvcih2YXIgZT1uZXcgcix0PTAsbj10aGlzLmZpcnN0RWxlbWVudENoaWxkO247bj1uLm5leHRFbGVtZW50U2libGluZyllW3QrK109bjtyZXR1cm4gZS5sZW5ndGg9dCxlfSxyZW1vdmU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnBhcmVudE5vZGU7ZSYmZS5yZW1vdmVDaGlsZCh0aGlzKX19LGk9e2dldCBuZXh0RWxlbWVudFNpYmxpbmcoKXtyZXR1cm4gdCh0aGlzLm5leHRTaWJsaW5nKX0sZ2V0IHByZXZpb3VzRWxlbWVudFNpYmxpbmcoKXtyZXR1cm4gbih0aGlzLnByZXZpb3VzU2libGluZyl9fSxhPXtnZXRFbGVtZW50QnlJZDpmdW5jdGlvbihlKXtyZXR1cm4vWyBcXHRcXG5cXHJcXGZdLy50ZXN0KGUpP251bGw6dGhpcy5xdWVyeVNlbGVjdG9yKCdbaWQ9XCInK2UrJ1wiXScpfX07ZS5DaGlsZE5vZGVJbnRlcmZhY2U9aSxlLk5vbkVsZW1lbnRQYXJlbnROb2RlSW50ZXJmYWNlPWEsZS5QYXJlbnROb2RlSW50ZXJmYWNlPW99KHdpbmRvdy5TaGFkb3dET01Qb2x5ZmlsbCksZnVuY3Rpb24oZSl7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gdChlKXtyLmNhbGwodGhpcyxlKX12YXIgbj1lLkNoaWxkTm9kZUludGVyZmFjZSxyPWUud3JhcHBlcnMuTm9kZSxvPWUuZW5xdWV1ZU11dGF0aW9uLGk9ZS5taXhpbixhPWUucmVnaXN0ZXJXcmFwcGVyLHM9ZS51bnNhZmVVbndyYXAsYz13aW5kb3cuQ2hhcmFjdGVyRGF0YTt0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHIucHJvdG90eXBlKSxpKHQucHJvdG90eXBlLHtnZXQgbm9kZVZhbHVlKCl7cmV0dXJuIHRoaXMuZGF0YX0sc2V0IG5vZGVWYWx1ZShlKXt0aGlzLmRhdGE9ZX0sZ2V0IHRleHRDb250ZW50KCl7cmV0dXJuIHRoaXMuZGF0YX0sc2V0IHRleHRDb250ZW50KGUpe3RoaXMuZGF0YT1lfSxnZXQgZGF0YSgpe3JldHVybiBzKHRoaXMpLmRhdGF9LHNldCBkYXRhKGUpe3ZhciB0PXModGhpcykuZGF0YTtvKHRoaXMsXCJjaGFyYWN0ZXJEYXRhXCIse29sZFZhbHVlOnR9KSxzKHRoaXMpLmRhdGE9ZX19KSxpKHQucHJvdG90eXBlLG4pLGEoYyx0LGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFwiXCIpKSxlLndyYXBwZXJzLkNoYXJhY3RlckRhdGE9dH0od2luZG93LlNoYWRvd0RPTVBvbHlmaWxsKSxmdW5jdGlvbihlKXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiB0KGUpe3JldHVybiBlPj4+MH1mdW5jdGlvbiBuKGUpe3IuY2FsbCh0aGlzLGUpfXZhciByPWUud3JhcHBlcnMuQ2hhcmFjdGVyRGF0YSxvPShlLmVucXVldWVNdXRhdGlvbixlLm1peGluKSxpPWUucmVnaXN0ZXJXcmFwcGVyLGE9d2luZG93LlRleHQ7bi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShyLnByb3RvdHlwZSksbyhuLnByb3RvdHlwZSx7c3BsaXRUZXh0OmZ1bmN0aW9uKGUpe2U9dChlKTt2YXIgbj10aGlzLmRhdGE7aWYoZT5uLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoXCJJbmRleFNpemVFcnJvclwiKTt2YXIgcj1uLnNsaWNlKDAsZSksbz1uLnNsaWNlKGUpO3RoaXMuZGF0YT1yO3ZhciBpPXRoaXMub3duZXJEb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShvKTtyZXR1cm4gdGhpcy5wYXJlbnROb2RlJiZ0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGksdGhpcy5uZXh0U2libGluZyksaX19KSxpKGEsbixkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShcIlwiKSksZS53cmFwcGVycy5UZXh0PW59KHdpbmRvdy5TaGFkb3dET01Qb2x5ZmlsbCksZnVuY3Rpb24oZSl7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gdChlKXtyZXR1cm4gaShlKS5nZXRBdHRyaWJ1dGUoXCJjbGFzc1wiKX1mdW5jdGlvbiBuKGUsdCl7YShlLFwiYXR0cmlidXRlc1wiLHtuYW1lOlwiY2xhc3NcIixuYW1lc3BhY2U6bnVsbCxvbGRWYWx1ZTp0fSl9ZnVuY3Rpb24gcih0KXtlLmludmFsaWRhdGVSZW5kZXJlckJhc2VkT25BdHRyaWJ1dGUodCxcImNsYXNzXCIpfWZ1bmN0aW9uIG8oZSxvLGkpe3ZhciBhPWUub3duZXJFbGVtZW50XztpZihudWxsPT1hKXJldHVybiBvLmFwcGx5KGUsaSk7dmFyIHM9dChhKSxjPW8uYXBwbHkoZSxpKTtyZXR1cm4gdChhKSE9PXMmJihuKGEscykscihhKSksY31pZighd2luZG93LkRPTVRva2VuTGlzdClyZXR1cm4gdm9pZCBjb25zb2xlLndhcm4oXCJNaXNzaW5nIERPTVRva2VuTGlzdCBwcm90b3R5cGUsIHBsZWFzZSBpbmNsdWRlIGEgY29tcGF0aWJsZSBjbGFzc0xpc3QgcG9seWZpbGwgc3VjaCBhcyBodHRwOi8vZ29vLmdsL3VUY2VwSC5cIik7dmFyIGk9ZS51bnNhZmVVbndyYXAsYT1lLmVucXVldWVNdXRhdGlvbixzPURPTVRva2VuTGlzdC5wcm90b3R5cGUuYWRkO0RPTVRva2VuTGlzdC5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKCl7byh0aGlzLHMsYXJndW1lbnRzKX07dmFyIGM9RE9NVG9rZW5MaXN0LnByb3RvdHlwZS5yZW1vdmU7RE9NVG9rZW5MaXN0LnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24oKXtvKHRoaXMsYyxhcmd1bWVudHMpfTt2YXIgbD1ET01Ub2tlbkxpc3QucHJvdG90eXBlLnRvZ2dsZTtET01Ub2tlbkxpc3QucHJvdG90eXBlLnRvZ2dsZT1mdW5jdGlvbigpe3JldHVybiBvKHRoaXMsbCxhcmd1bWVudHMpfX0od2luZG93LlNoYWRvd0RPTVBvbHlmaWxsKSxmdW5jdGlvbihlKXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiB0KHQsbil7dmFyIHI9dC5wYXJlbnROb2RlO2lmKHImJnIuc2hhZG93Um9vdCl7dmFyIG89ZS5nZXRSZW5kZXJlckZvckhvc3Qocik7by5kZXBlbmRzT25BdHRyaWJ1dGUobikmJm8uaW52YWxpZGF0ZSgpfX1mdW5jdGlvbiBuKGUsdCxuKXt1KGUsXCJhdHRyaWJ1dGVzXCIse25hbWU6dCxuYW1lc3BhY2U6bnVsbCxvbGRWYWx1ZTpufSl9ZnVuY3Rpb24gcihlKXthLmNhbGwodGhpcyxlKX12YXIgbz1lLkNoaWxkTm9kZUludGVyZmFjZSxpPWUuR2V0RWxlbWVudHNCeUludGVyZmFjZSxhPWUud3JhcHBlcnMuTm9kZSxzPWUuUGFyZW50Tm9kZUludGVyZmFjZSxjPWUuU2VsZWN0b3JzSW50ZXJmYWNlLGw9ZS5NYXRjaGVzSW50ZXJmYWNlLHU9KGUuYWRkV3JhcE5vZGVMaXN0TWV0aG9kLGUuZW5xdWV1ZU11dGF0aW9uKSxkPWUubWl4aW4scD0oZS5vbmVPZixlLnJlZ2lzdGVyV3JhcHBlciksaD1lLnVuc2FmZVVud3JhcCxmPWUud3JhcHBlcnMsbT13aW5kb3cuRWxlbWVudCx3PVtcIm1hdGNoZXNcIixcIm1vek1hdGNoZXNTZWxlY3RvclwiLFwibXNNYXRjaGVzU2VsZWN0b3JcIixcIndlYmtpdE1hdGNoZXNTZWxlY3RvclwiXS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIG0ucHJvdG90eXBlW2VdfSksdj13WzBdLGc9bS5wcm90b3R5cGVbdl0sYj1uZXcgV2Vha01hcDtyLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGEucHJvdG90eXBlKSxkKHIucHJvdG90eXBlLHtjcmVhdGVTaGFkb3dSb290OmZ1bmN0aW9uKCl7dmFyIHQ9bmV3IGYuU2hhZG93Um9vdCh0aGlzKTtoKHRoaXMpLnBvbHltZXJTaGFkb3dSb290Xz10O3ZhciBuPWUuZ2V0UmVuZGVyZXJGb3JIb3N0KHRoaXMpO3JldHVybiBuLmludmFsaWRhdGUoKSx0fSxnZXQgc2hhZG93Um9vdCgpe3JldHVybiBoKHRoaXMpLnBvbHltZXJTaGFkb3dSb290X3x8bnVsbH0sc2V0QXR0cmlidXRlOmZ1bmN0aW9uKGUscil7dmFyIG89aCh0aGlzKS5nZXRBdHRyaWJ1dGUoZSk7aCh0aGlzKS5zZXRBdHRyaWJ1dGUoZSxyKSxuKHRoaXMsZSxvKSx0KHRoaXMsZSl9LHJlbW92ZUF0dHJpYnV0ZTpmdW5jdGlvbihlKXt2YXIgcj1oKHRoaXMpLmdldEF0dHJpYnV0ZShlKTtoKHRoaXMpLnJlbW92ZUF0dHJpYnV0ZShlKSxuKHRoaXMsZSxyKSx0KHRoaXMsZSl9LGdldCBjbGFzc0xpc3QoKXt2YXIgZT1iLmdldCh0aGlzKTtpZighZSl7aWYoZT1oKHRoaXMpLmNsYXNzTGlzdCwhZSlyZXR1cm47ZS5vd25lckVsZW1lbnRfPXRoaXMsYi5zZXQodGhpcyxlKX1yZXR1cm4gZX0sZ2V0IGNsYXNzTmFtZSgpe3JldHVybiBoKHRoaXMpLmNsYXNzTmFtZX0sc2V0IGNsYXNzTmFtZShlKXt0aGlzLnNldEF0dHJpYnV0ZShcImNsYXNzXCIsZSl9LGdldCBpZCgpe3JldHVybiBoKHRoaXMpLmlkfSxzZXQgaWQoZSl7dGhpcy5zZXRBdHRyaWJ1dGUoXCJpZFwiLGUpfX0pLHcuZm9yRWFjaChmdW5jdGlvbihlKXtcIm1hdGNoZXNcIiE9PWUmJihyLnByb3RvdHlwZVtlXT1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5tYXRjaGVzKGUpfSl9KSxtLnByb3RvdHlwZS53ZWJraXRDcmVhdGVTaGFkb3dSb290JiYoci5wcm90b3R5cGUud2Via2l0Q3JlYXRlU2hhZG93Um9vdD1yLnByb3RvdHlwZS5jcmVhdGVTaGFkb3dSb290KSxkKHIucHJvdG90eXBlLG8pLGQoci5wcm90b3R5cGUsaSksZChyLnByb3RvdHlwZSxzKSxkKHIucHJvdG90eXBlLGMpLGQoci5wcm90b3R5cGUsbCkscChtLHIsZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKG51bGwsXCJ4XCIpKSxlLmludmFsaWRhdGVSZW5kZXJlckJhc2VkT25BdHRyaWJ1dGU9dCxlLm1hdGNoZXNOYW1lcz13LGUub3JpZ2luYWxNYXRjaGVzPWcsZS53cmFwcGVycy5FbGVtZW50PXJ9KHdpbmRvdy5TaGFkb3dET01Qb2x5ZmlsbCksZnVuY3Rpb24oZSl7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gdChlKXtzd2l0Y2goZSl7Y2FzZVwiJlwiOnJldHVyblwiJmFtcDtcIjtjYXNlXCI8XCI6cmV0dXJuXCImbHQ7XCI7Y2FzZVwiPlwiOnJldHVyblwiJmd0O1wiO2Nhc2UnXCInOnJldHVyblwiJnF1b3Q7XCI7Y2FzZVwiwqBcIjpyZXR1cm5cIiZuYnNwO1wifX1mdW5jdGlvbiBuKGUpe3JldHVybiBlLnJlcGxhY2UoTCx0KX1mdW5jdGlvbiByKGUpe3JldHVybiBlLnJlcGxhY2UoTix0KX1mdW5jdGlvbiBvKGUpe2Zvcih2YXIgdD17fSxuPTA7bjxlLmxlbmd0aDtuKyspdFtlW25dXT0hMDtyZXR1cm4gdH1mdW5jdGlvbiBpKGUpe2lmKGUubmFtZXNwYWNlVVJJIT09RClyZXR1cm4hMDt2YXIgdD1lLm93bmVyRG9jdW1lbnQuZG9jdHlwZTtyZXR1cm4gdCYmdC5wdWJsaWNJZCYmdC5zeXN0ZW1JZH1mdW5jdGlvbiBhKGUsdCl7c3dpdGNoKGUubm9kZVR5cGUpe2Nhc2UgTm9kZS5FTEVNRU5UX05PREU6Zm9yKHZhciBvLGE9ZS50YWdOYW1lLnRvTG93ZXJDYXNlKCksYz1cIjxcIithLGw9ZS5hdHRyaWJ1dGVzLHU9MDtvPWxbdV07dSsrKWMrPVwiIFwiK28ubmFtZSsnPVwiJytuKG8udmFsdWUpKydcIic7cmV0dXJuIENbYV0/KGkoZSkmJihjKz1cIi9cIiksYytcIj5cIik6YytcIj5cIitzKGUpK1wiPC9cIithK1wiPlwiO2Nhc2UgTm9kZS5URVhUX05PREU6dmFyIGQ9ZS5kYXRhO3JldHVybiB0JiZqW3QubG9jYWxOYW1lXT9kOnIoZCk7Y2FzZSBOb2RlLkNPTU1FTlRfTk9ERTpyZXR1cm5cIjwhLS1cIitlLmRhdGErXCItLT5cIjtkZWZhdWx0OnRocm93IGNvbnNvbGUuZXJyb3IoZSksbmV3IEVycm9yKFwibm90IGltcGxlbWVudGVkXCIpfX1mdW5jdGlvbiBzKGUpe2UgaW5zdGFuY2VvZiBPLkhUTUxUZW1wbGF0ZUVsZW1lbnQmJihlPWUuY29udGVudCk7Zm9yKHZhciB0PVwiXCIsbj1lLmZpcnN0Q2hpbGQ7bjtuPW4ubmV4dFNpYmxpbmcpdCs9YShuLGUpO3JldHVybiB0fWZ1bmN0aW9uIGMoZSx0LG4pe3ZhciByPW58fFwiZGl2XCI7ZS50ZXh0Q29udGVudD1cIlwiO3ZhciBvPVQoZS5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQocikpO28uaW5uZXJIVE1MPXQ7Zm9yKHZhciBpO2k9by5maXJzdENoaWxkOyllLmFwcGVuZENoaWxkKE0oaSkpfWZ1bmN0aW9uIGwoZSl7bS5jYWxsKHRoaXMsZSl9ZnVuY3Rpb24gdShlLHQpe3ZhciBuPVQoZS5jbG9uZU5vZGUoITEpKTtuLmlubmVySFRNTD10O2Zvcih2YXIgcixvPVQoZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpKTtyPW4uZmlyc3RDaGlsZDspby5hcHBlbmRDaGlsZChyKTtyZXR1cm4gTShvKX1mdW5jdGlvbiBkKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBlLnJlbmRlckFsbFBlbmRpbmcoKSxTKHRoaXMpW3RdfX1mdW5jdGlvbiBwKGUpe3cobCxlLGQoZSkpfWZ1bmN0aW9uIGgodCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGwucHJvdG90eXBlLHQse2dldDpkKHQpLHNldDpmdW5jdGlvbihuKXtlLnJlbmRlckFsbFBlbmRpbmcoKSxTKHRoaXMpW3RdPW59LGNvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwfSl9ZnVuY3Rpb24gZih0KXtPYmplY3QuZGVmaW5lUHJvcGVydHkobC5wcm90b3R5cGUsdCx7dmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gZS5yZW5kZXJBbGxQZW5kaW5nKCksUyh0aGlzKVt0XS5hcHBseShTKHRoaXMpLGFyZ3VtZW50cyl9LGNvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwfSl9dmFyIG09ZS53cmFwcGVycy5FbGVtZW50LHc9ZS5kZWZpbmVHZXR0ZXIsdj1lLmVucXVldWVNdXRhdGlvbixnPWUubWl4aW4sYj1lLm5vZGVzV2VyZUFkZGVkLHk9ZS5ub2Rlc1dlcmVSZW1vdmVkLEU9ZS5yZWdpc3RlcldyYXBwZXIsXz1lLnNuYXBzaG90Tm9kZUxpc3QsUz1lLnVuc2FmZVVud3JhcCxUPWUudW53cmFwLE09ZS53cmFwLE89ZS53cmFwcGVycyxMPS9bJlxcdTAwQTBcIl0vZyxOPS9bJlxcdTAwQTA8Pl0vZyxDPW8oW1wiYXJlYVwiLFwiYmFzZVwiLFwiYnJcIixcImNvbFwiLFwiY29tbWFuZFwiLFwiZW1iZWRcIixcImhyXCIsXCJpbWdcIixcImlucHV0XCIsXCJrZXlnZW5cIixcImxpbmtcIixcIm1ldGFcIixcInBhcmFtXCIsXCJzb3VyY2VcIixcInRyYWNrXCIsXCJ3YnJcIl0pLGo9byhbXCJzdHlsZVwiLFwic2NyaXB0XCIsXCJ4bXBcIixcImlmcmFtZVwiLFwibm9lbWJlZFwiLFwibm9mcmFtZXNcIixcInBsYWludGV4dFwiLFwibm9zY3JpcHRcIl0pLEQ9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sXCIsSD0vTVNJRS8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSx4PXdpbmRvdy5IVE1MRWxlbWVudCxSPXdpbmRvdy5IVE1MVGVtcGxhdGVFbGVtZW50O2wucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobS5wcm90b3R5cGUpLGcobC5wcm90b3R5cGUse2dldCBpbm5lckhUTUwoKXtyZXR1cm4gcyh0aGlzKX0sc2V0IGlubmVySFRNTChlKXtpZihIJiZqW3RoaXMubG9jYWxOYW1lXSlyZXR1cm4gdm9pZCh0aGlzLnRleHRDb250ZW50PWUpO3ZhciB0PV8odGhpcy5jaGlsZE5vZGVzKTt0aGlzLmludmFsaWRhdGVTaGFkb3dSZW5kZXJlcigpP3RoaXMgaW5zdGFuY2VvZiBPLkhUTUxUZW1wbGF0ZUVsZW1lbnQ/Yyh0aGlzLmNvbnRlbnQsZSk6Yyh0aGlzLGUsdGhpcy50YWdOYW1lKTohUiYmdGhpcyBpbnN0YW5jZW9mIE8uSFRNTFRlbXBsYXRlRWxlbWVudD9jKHRoaXMuY29udGVudCxlKTpTKHRoaXMpLmlubmVySFRNTD1lO3ZhciBuPV8odGhpcy5jaGlsZE5vZGVzKTt2KHRoaXMsXCJjaGlsZExpc3RcIix7YWRkZWROb2RlczpuLHJlbW92ZWROb2Rlczp0fSkseSh0KSxiKG4sdGhpcyl9LGdldCBvdXRlckhUTUwoKXtyZXR1cm4gYSh0aGlzLHRoaXMucGFyZW50Tm9kZSl9LHNldCBvdXRlckhUTUwoZSl7dmFyIHQ9dGhpcy5wYXJlbnROb2RlO2lmKHQpe3QuaW52YWxpZGF0ZVNoYWRvd1JlbmRlcmVyKCk7dmFyIG49dSh0LGUpO3QucmVwbGFjZUNoaWxkKG4sdGhpcyl9fSxpbnNlcnRBZGphY2VudEhUTUw6ZnVuY3Rpb24oZSx0KXt2YXIgbixyO3N3aXRjaChTdHJpbmcoZSkudG9Mb3dlckNhc2UoKSl7Y2FzZVwiYmVmb3JlYmVnaW5cIjpuPXRoaXMucGFyZW50Tm9kZSxyPXRoaXM7YnJlYWs7Y2FzZVwiYWZ0ZXJlbmRcIjpuPXRoaXMucGFyZW50Tm9kZSxyPXRoaXMubmV4dFNpYmxpbmc7YnJlYWs7Y2FzZVwiYWZ0ZXJiZWdpblwiOm49dGhpcyxyPXRoaXMuZmlyc3RDaGlsZDticmVhaztjYXNlXCJiZWZvcmVlbmRcIjpuPXRoaXMscj1udWxsO2JyZWFrO2RlZmF1bHQ6cmV0dXJufXZhciBvPXUobix0KTtuLmluc2VydEJlZm9yZShvLHIpfSxnZXQgaGlkZGVuKCl7cmV0dXJuIHRoaXMuaGFzQXR0cmlidXRlKFwiaGlkZGVuXCIpfSxzZXQgaGlkZGVuKGUpe2U/dGhpcy5zZXRBdHRyaWJ1dGUoXCJoaWRkZW5cIixcIlwiKTp0aGlzLnJlbW92ZUF0dHJpYnV0ZShcImhpZGRlblwiKX19KSxbXCJjbGllbnRIZWlnaHRcIixcImNsaWVudExlZnRcIixcImNsaWVudFRvcFwiLFwiY2xpZW50V2lkdGhcIixcIm9mZnNldEhlaWdodFwiLFwib2Zmc2V0TGVmdFwiLFwib2Zmc2V0VG9wXCIsXCJvZmZzZXRXaWR0aFwiLFwic2Nyb2xsSGVpZ2h0XCIsXCJzY3JvbGxXaWR0aFwiXS5mb3JFYWNoKHApLFtcInNjcm9sbExlZnRcIixcInNjcm9sbFRvcFwiXS5mb3JFYWNoKGgpLFtcImZvY3VzXCIsXCJnZXRCb3VuZGluZ0NsaWVudFJlY3RcIixcImdldENsaWVudFJlY3RzXCIsXCJzY3JvbGxJbnRvVmlld1wiXS5mb3JFYWNoKGYpLEUoeCxsLGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJiXCIpKSxlLndyYXBwZXJzLkhUTUxFbGVtZW50PWwsZS5nZXRJbm5lckhUTUw9cyxlLnNldElubmVySFRNTD1jfSh3aW5kb3cuU2hhZG93RE9NUG9seWZpbGwpLGZ1bmN0aW9uKGUpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIHQoZSl7bi5jYWxsKHRoaXMsZSl9dmFyIG49ZS53cmFwcGVycy5IVE1MRWxlbWVudCxyPWUubWl4aW4sbz1lLnJlZ2lzdGVyV3JhcHBlcixpPWUudW5zYWZlVW53cmFwLGE9ZS53cmFwLHM9d2luZG93LkhUTUxDYW52YXNFbGVtZW50O3QucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobi5wcm90b3R5cGUpLHIodC5wcm90b3R5cGUse2dldENvbnRleHQ6ZnVuY3Rpb24oKXt2YXIgZT1pKHRoaXMpLmdldENvbnRleHQuYXBwbHkoaSh0aGlzKSxhcmd1bWVudHMpO3JldHVybiBlJiZhKGUpfX0pLG8ocyx0LGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIikpLGUud3JhcHBlcnMuSFRNTENhbnZhc0VsZW1lbnQ9dH0od2luZG93LlNoYWRvd0RPTVBvbHlmaWxsKSxmdW5jdGlvbihlKXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiB0KGUpe24uY2FsbCh0aGlzLGUpfXZhciBuPWUud3JhcHBlcnMuSFRNTEVsZW1lbnQscj1lLm1peGluLG89ZS5yZWdpc3RlcldyYXBwZXIsaT13aW5kb3cuSFRNTENvbnRlbnRFbGVtZW50O3QucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobi5wcm90b3R5cGUpLHIodC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnQsZ2V0IHNlbGVjdCgpe3JldHVybiB0aGlzLmdldEF0dHJpYnV0ZShcInNlbGVjdFwiKX0sc2V0IHNlbGVjdChlKXt0aGlzLnNldEF0dHJpYnV0ZShcInNlbGVjdFwiLGUpfSxzZXRBdHRyaWJ1dGU6ZnVuY3Rpb24oZSx0KXtuLnByb3RvdHlwZS5zZXRBdHRyaWJ1dGUuY2FsbCh0aGlzLGUsdCksXCJzZWxlY3RcIj09PVN0cmluZyhlKS50b0xvd2VyQ2FzZSgpJiZ0aGlzLmludmFsaWRhdGVTaGFkb3dSZW5kZXJlcighMCl9fSksaSYmbyhpLHQpLGUud3JhcHBlcnMuSFRNTENvbnRlbnRFbGVtZW50PXR9KHdpbmRvdy5TaGFkb3dET01Qb2x5ZmlsbCksZnVuY3Rpb24oZSl7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gdChlKXtuLmNhbGwodGhpcyxlKX12YXIgbj1lLndyYXBwZXJzLkhUTUxFbGVtZW50LHI9ZS5taXhpbixvPWUucmVnaXN0ZXJXcmFwcGVyLGk9ZS53cmFwSFRNTENvbGxlY3Rpb24sYT1lLnVud3JhcCxzPXdpbmRvdy5IVE1MRm9ybUVsZW1lbnQ7dC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShuLnByb3RvdHlwZSkscih0LnByb3RvdHlwZSx7Z2V0IGVsZW1lbnRzKCl7cmV0dXJuIGkoYSh0aGlzKS5lbGVtZW50cyl9fSksbyhzLHQsZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImZvcm1cIikpLGUud3JhcHBlcnMuSFRNTEZvcm1FbGVtZW50PXR9KHdpbmRvdy5TaGFkb3dET01Qb2x5ZmlsbCksZnVuY3Rpb24oZSl7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gdChlKXtyLmNhbGwodGhpcyxlKX1mdW5jdGlvbiBuKGUsdCl7aWYoISh0aGlzIGluc3RhbmNlb2YgbikpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkRPTSBvYmplY3QgY29uc3RydWN0b3IgY2Fubm90IGJlIGNhbGxlZCBhcyBhIGZ1bmN0aW9uLlwiKTt2YXIgbz1pKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbWdcIikpO3IuY2FsbCh0aGlzLG8pLGEobyx0aGlzKSx2b2lkIDAhPT1lJiYoby53aWR0aD1lKSx2b2lkIDAhPT10JiYoby5oZWlnaHQ9dCl9dmFyIHI9ZS53cmFwcGVycy5IVE1MRWxlbWVudCxvPWUucmVnaXN0ZXJXcmFwcGVyLGk9ZS51bndyYXAsYT1lLnJld3JhcCxzPXdpbmRvdy5IVE1MSW1hZ2VFbGVtZW50O3QucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoci5wcm90b3R5cGUpLG8ocyx0LGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbWdcIikpLG4ucHJvdG90eXBlPXQucHJvdG90eXBlLGUud3JhcHBlcnMuSFRNTEltYWdlRWxlbWVudD10LGUud3JhcHBlcnMuSW1hZ2U9bn0od2luZG93LlNoYWRvd0RPTVBvbHlmaWxsKSxmdW5jdGlvbihlKXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiB0KGUpe24uY2FsbCh0aGlzLGUpfXZhciBuPWUud3JhcHBlcnMuSFRNTEVsZW1lbnQscj0oZS5taXhpbixlLndyYXBwZXJzLk5vZGVMaXN0LGUucmVnaXN0ZXJXcmFwcGVyKSxvPXdpbmRvdy5IVE1MU2hhZG93RWxlbWVudDt0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKG4ucHJvdG90eXBlKSx0LnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj10LG8mJnIobyx0KSxlLndyYXBwZXJzLkhUTUxTaGFkb3dFbGVtZW50PXR9KHdpbmRvdy5TaGFkb3dET01Qb2x5ZmlsbCksZnVuY3Rpb24oZSl7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gdChlKXtpZighZS5kZWZhdWx0VmlldylyZXR1cm4gZTt2YXIgdD1kLmdldChlKTtpZighdCl7Zm9yKHQ9ZS5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoXCJcIik7dC5sYXN0Q2hpbGQ7KXQucmVtb3ZlQ2hpbGQodC5sYXN0Q2hpbGQpO2Quc2V0KGUsdCl9cmV0dXJuIHR9ZnVuY3Rpb24gbihlKXtmb3IodmFyIG4scj10KGUub3duZXJEb2N1bWVudCksbz1jKHIuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpKTtuPWUuZmlyc3RDaGlsZDspby5hcHBlbmRDaGlsZChuKTtyZXR1cm4gb31mdW5jdGlvbiByKGUpe2lmKG8uY2FsbCh0aGlzLGUpLCFwKXt2YXIgdD1uKGUpO3Uuc2V0KHRoaXMsbCh0KSl9fXZhciBvPWUud3JhcHBlcnMuSFRNTEVsZW1lbnQsaT1lLm1peGluLGE9ZS5yZWdpc3RlcldyYXBwZXIscz1lLnVuc2FmZVVud3JhcCxjPWUudW53cmFwLGw9ZS53cmFwLHU9bmV3IFdlYWtNYXAsZD1uZXcgV2Vha01hcCxwPXdpbmRvdy5IVE1MVGVtcGxhdGVFbGVtZW50O3IucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoby5wcm90b3R5cGUpLGkoci5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnIsZ2V0IGNvbnRlbnQoKXtyZXR1cm4gcD9sKHModGhpcykuY29udGVudCk6dS5nZXQodGhpcyl9fSkscCYmYShwLHIpLGUud3JhcHBlcnMuSFRNTFRlbXBsYXRlRWxlbWVudD1yfSh3aW5kb3cuU2hhZG93RE9NUG9seWZpbGwpLGZ1bmN0aW9uKGUpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIHQoZSl7bi5jYWxsKHRoaXMsZSl9dmFyIG49ZS53cmFwcGVycy5IVE1MRWxlbWVudCxyPWUucmVnaXN0ZXJXcmFwcGVyLG89d2luZG93LkhUTUxNZWRpYUVsZW1lbnQ7byYmKHQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobi5wcm90b3R5cGUpLHIobyx0LGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJhdWRpb1wiKSksZS53cmFwcGVycy5IVE1MTWVkaWFFbGVtZW50PXQpfSh3aW5kb3cuU2hhZG93RE9NUG9seWZpbGwpLGZ1bmN0aW9uKGUpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIHQoZSl7ci5jYWxsKHRoaXMsZSl9ZnVuY3Rpb24gbihlKXtpZighKHRoaXMgaW5zdGFuY2VvZiBuKSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiRE9NIG9iamVjdCBjb25zdHJ1Y3RvciBjYW5ub3QgYmUgY2FsbGVkIGFzIGEgZnVuY3Rpb24uXCIpO3ZhciB0PWkoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImF1ZGlvXCIpKTtyLmNhbGwodGhpcyx0KSxhKHQsdGhpcyksdC5zZXRBdHRyaWJ1dGUoXCJwcmVsb2FkXCIsXCJhdXRvXCIpLHZvaWQgMCE9PWUmJnQuc2V0QXR0cmlidXRlKFwic3JjXCIsZSl9dmFyIHI9ZS53cmFwcGVycy5IVE1MTWVkaWFFbGVtZW50LG89ZS5yZWdpc3RlcldyYXBwZXIsaT1lLnVud3JhcCxhPWUucmV3cmFwLHM9d2luZG93LkhUTUxBdWRpb0VsZW1lbnQ7cyYmKHQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoci5wcm90b3R5cGUpLG8ocyx0LGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJhdWRpb1wiKSksbi5wcm90b3R5cGU9dC5wcm90b3R5cGUsZS53cmFwcGVycy5IVE1MQXVkaW9FbGVtZW50PXQsZS53cmFwcGVycy5BdWRpbz1uKX0od2luZG93LlNoYWRvd0RPTVBvbHlmaWxsKSxmdW5jdGlvbihlKXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiB0KGUpe3JldHVybiBlLnJlcGxhY2UoL1xccysvZyxcIiBcIikudHJpbSgpfWZ1bmN0aW9uIG4oZSl7by5jYWxsKHRoaXMsZSl9ZnVuY3Rpb24gcihlLHQsbixpKXtpZighKHRoaXMgaW5zdGFuY2VvZiByKSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiRE9NIG9iamVjdCBjb25zdHJ1Y3RvciBjYW5ub3QgYmUgY2FsbGVkIGFzIGEgZnVuY3Rpb24uXCIpO3ZhciBhPWMoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcIm9wdGlvblwiKSk7by5jYWxsKHRoaXMsYSkscyhhLHRoaXMpLHZvaWQgMCE9PWUmJihhLnRleHQ9ZSksdm9pZCAwIT09dCYmYS5zZXRBdHRyaWJ1dGUoXCJ2YWx1ZVwiLHQpLG49PT0hMCYmYS5zZXRBdHRyaWJ1dGUoXCJzZWxlY3RlZFwiLFwiXCIpLGEuc2VsZWN0ZWQ9aT09PSEwfXZhciBvPWUud3JhcHBlcnMuSFRNTEVsZW1lbnQsaT1lLm1peGluLGE9ZS5yZWdpc3RlcldyYXBwZXIscz1lLnJld3JhcCxjPWUudW53cmFwLGw9ZS53cmFwLHU9d2luZG93LkhUTUxPcHRpb25FbGVtZW50O24ucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoby5wcm90b3R5cGUpLGkobi5wcm90b3R5cGUse2dldCB0ZXh0KCl7cmV0dXJuIHQodGhpcy50ZXh0Q29udGVudCl9LHNldCB0ZXh0KGUpe3RoaXMudGV4dENvbnRlbnQ9dChTdHJpbmcoZSkpfSxnZXQgZm9ybSgpe3JldHVybiBsKGModGhpcykuZm9ybSl9fSksYSh1LG4sZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcIm9wdGlvblwiKSksci5wcm90b3R5cGU9bi5wcm90b3R5cGUsZS53cmFwcGVycy5IVE1MT3B0aW9uRWxlbWVudD1uLGUud3JhcHBlcnMuT3B0aW9uPXJ9KHdpbmRvdy5TaGFkb3dET01Qb2x5ZmlsbCksZnVuY3Rpb24oZSl7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gdChlKXtuLmNhbGwodGhpcyxlKX12YXIgbj1lLndyYXBwZXJzLkhUTUxFbGVtZW50LHI9ZS5taXhpbixvPWUucmVnaXN0ZXJXcmFwcGVyLGk9ZS51bndyYXAsYT1lLndyYXAscz13aW5kb3cuSFRNTFNlbGVjdEVsZW1lbnQ7dC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShuLnByb3RvdHlwZSkscih0LnByb3RvdHlwZSx7YWRkOmZ1bmN0aW9uKGUsdCl7XCJvYmplY3RcIj09dHlwZW9mIHQmJih0PWkodCkpLGkodGhpcykuYWRkKGkoZSksdCl9LHJlbW92ZTpmdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwPT09ZT92b2lkIG4ucHJvdG90eXBlLnJlbW92ZS5jYWxsKHRoaXMpOihcIm9iamVjdFwiPT10eXBlb2YgZSYmKGU9aShlKSksdm9pZCBpKHRoaXMpLnJlbW92ZShlKSl9LGdldCBmb3JtKCl7cmV0dXJuIGEoaSh0aGlzKS5mb3JtKX19KSxvKHMsdCxkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic2VsZWN0XCIpKSxlLndyYXBwZXJzLkhUTUxTZWxlY3RFbGVtZW50PXR9KHdpbmRvdy5TaGFkb3dET01Qb2x5ZmlsbCksZnVuY3Rpb24oZSl7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gdChlKXtuLmNhbGwodGhpcyxlKX12YXIgbj1lLndyYXBwZXJzLkhUTUxFbGVtZW50LHI9ZS5taXhpbixvPWUucmVnaXN0ZXJXcmFwcGVyLGk9ZS51bndyYXAsYT1lLndyYXAscz1lLndyYXBIVE1MQ29sbGVjdGlvbixjPXdpbmRvdy5IVE1MVGFibGVFbGVtZW50O3QucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobi5wcm90b3R5cGUpLHIodC5wcm90b3R5cGUse2dldCBjYXB0aW9uKCl7cmV0dXJuIGEoaSh0aGlzKS5jYXB0aW9uKX0sY3JlYXRlQ2FwdGlvbjpmdW5jdGlvbigpe3JldHVybiBhKGkodGhpcykuY3JlYXRlQ2FwdGlvbigpKX0sZ2V0IHRIZWFkKCl7cmV0dXJuIGEoaSh0aGlzKS50SGVhZCl9LGNyZWF0ZVRIZWFkOmZ1bmN0aW9uKCl7cmV0dXJuIGEoaSh0aGlzKS5jcmVhdGVUSGVhZCgpKX0sY3JlYXRlVEZvb3Q6ZnVuY3Rpb24oKXtyZXR1cm4gYShpKHRoaXMpLmNyZWF0ZVRGb290KCkpfSxnZXQgdEZvb3QoKXtyZXR1cm4gYShpKHRoaXMpLnRGb290KX0sZ2V0IHRCb2RpZXMoKXtyZXR1cm4gcyhpKHRoaXMpLnRCb2RpZXMpfSxjcmVhdGVUQm9keTpmdW5jdGlvbigpe3JldHVybiBhKGkodGhpcykuY3JlYXRlVEJvZHkoKSl9LGdldCByb3dzKCl7cmV0dXJuIHMoaSh0aGlzKS5yb3dzKX0saW5zZXJ0Um93OmZ1bmN0aW9uKGUpe3JldHVybiBhKGkodGhpcykuaW5zZXJ0Um93KGUpKX19KSxvKGMsdCxkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGFibGVcIikpLGUud3JhcHBlcnMuSFRNTFRhYmxlRWxlbWVudD10fSh3aW5kb3cuU2hhZG93RE9NUG9seWZpbGwpLGZ1bmN0aW9uKGUpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIHQoZSl7bi5jYWxsKHRoaXMsZSl9dmFyIG49ZS53cmFwcGVycy5IVE1MRWxlbWVudCxyPWUubWl4aW4sbz1lLnJlZ2lzdGVyV3JhcHBlcixpPWUud3JhcEhUTUxDb2xsZWN0aW9uLGE9ZS51bndyYXAscz1lLndyYXAsYz13aW5kb3cuSFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQ7dC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShuLnByb3RvdHlwZSkscih0LnByb3RvdHlwZSx7Y29uc3RydWN0b3I6dCxnZXQgcm93cygpe3JldHVybiBpKGEodGhpcykucm93cyl9LGluc2VydFJvdzpmdW5jdGlvbihlKXtyZXR1cm4gcyhhKHRoaXMpLmluc2VydFJvdyhlKSl9fSksbyhjLHQsZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRoZWFkXCIpKSxlLndyYXBwZXJzLkhUTUxUYWJsZVNlY3Rpb25FbGVtZW50PXR9KHdpbmRvdy5TaGFkb3dET01Qb2x5ZmlsbCksZnVuY3Rpb24oZSl7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gdChlKXtuLmNhbGwodGhpcyxlKX12YXIgbj1lLndyYXBwZXJzLkhUTUxFbGVtZW50LHI9ZS5taXhpbixvPWUucmVnaXN0ZXJXcmFwcGVyLGk9ZS53cmFwSFRNTENvbGxlY3Rpb24sYT1lLnVud3JhcCxzPWUud3JhcCxjPXdpbmRvdy5IVE1MVGFibGVSb3dFbGVtZW50O3QucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobi5wcm90b3R5cGUpLHIodC5wcm90b3R5cGUse2dldCBjZWxscygpe3JldHVybiBpKGEodGhpcykuY2VsbHMpfSxpbnNlcnRDZWxsOmZ1bmN0aW9uKGUpe3JldHVybiBzKGEodGhpcykuaW5zZXJ0Q2VsbChlKSl9fSksbyhjLHQsZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRyXCIpKSxlLndyYXBwZXJzLkhUTUxUYWJsZVJvd0VsZW1lbnQ9dH0od2luZG93LlNoYWRvd0RPTVBvbHlmaWxsKSxmdW5jdGlvbihlKXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiB0KGUpe3N3aXRjaChlLmxvY2FsTmFtZSl7Y2FzZVwiY29udGVudFwiOnJldHVybiBuZXcgbihlKTtjYXNlXCJzaGFkb3dcIjpyZXR1cm4gbmV3IG8oZSk7Y2FzZVwidGVtcGxhdGVcIjpyZXR1cm4gbmV3IGkoZSl9ci5jYWxsKHRoaXMsZSl9dmFyIG49ZS53cmFwcGVycy5IVE1MQ29udGVudEVsZW1lbnQscj1lLndyYXBwZXJzLkhUTUxFbGVtZW50LG89ZS53cmFwcGVycy5IVE1MU2hhZG93RWxlbWVudCxpPWUud3JhcHBlcnMuSFRNTFRlbXBsYXRlRWxlbWVudCxhPShlLm1peGluLGUucmVnaXN0ZXJXcmFwcGVyKSxzPXdpbmRvdy5IVE1MVW5rbm93bkVsZW1lbnQ7dC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShyLnByb3RvdHlwZSksYShzLHQpLGUud3JhcHBlcnMuSFRNTFVua25vd25FbGVtZW50PXR9KHdpbmRvdy5TaGFkb3dET01Qb2x5ZmlsbCksZnVuY3Rpb24oZSl7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gdChlKXtuLmNhbGwodGhpcyxlKX12YXIgbj1lLndyYXBwZXJzLkVsZW1lbnQscj1lLndyYXBwZXJzLkhUTUxFbGVtZW50LG89ZS5yZWdpc3RlcldyYXBwZXIsaT0oZS5kZWZpbmVXcmFwR2V0dGVyLGUudW5zYWZlVW53cmFwKSxhPWUud3JhcCxzPWUubWl4aW4sYz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsbD13aW5kb3cuU1ZHRWxlbWVudCx1PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhjLFwidGl0bGVcIik7aWYoIShcImNsYXNzTGlzdFwiaW4gdSkpe3ZhciBkPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iobi5wcm90b3R5cGUsXCJjbGFzc0xpc3RcIik7T2JqZWN0LmRlZmluZVByb3BlcnR5KHIucHJvdG90eXBlLFwiY2xhc3NMaXN0XCIsZCksZGVsZXRlIG4ucHJvdG90eXBlLmNsYXNzTGlzdH10LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKG4ucHJvdG90eXBlKSxzKHQucHJvdG90eXBlLHtnZXQgb3duZXJTVkdFbGVtZW50KCl7cmV0dXJuIGEoaSh0aGlzKS5vd25lclNWR0VsZW1lbnQpfX0pLG8obCx0LGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhjLFwidGl0bGVcIikpLGUud3JhcHBlcnMuU1ZHRWxlbWVudD10fSh3aW5kb3cuU2hhZG93RE9NUG9seWZpbGwpLGZ1bmN0aW9uKGUpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIHQoZSl7cC5jYWxsKHRoaXMsZSl9dmFyIG49ZS5taXhpbixyPWUucmVnaXN0ZXJXcmFwcGVyLG89ZS51bndyYXAsaT1lLndyYXAsYT13aW5kb3cuU1ZHVXNlRWxlbWVudCxzPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixjPWkoZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHMsXCJnXCIpKSxsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhzLFwidXNlXCIpLHU9Yy5jb25zdHJ1Y3RvcixkPU9iamVjdC5nZXRQcm90b3R5cGVPZih1LnByb3RvdHlwZSkscD1kLmNvbnN0cnVjdG9yO3QucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZCksXCJpbnN0YW5jZVJvb3RcImluIGwmJm4odC5wcm90b3R5cGUse2dldCBpbnN0YW5jZVJvb3QoKXtyZXR1cm4gaShvKHRoaXMpLmluc3RhbmNlUm9vdCl9LGdldCBhbmltYXRlZEluc3RhbmNlUm9vdCgpe3JldHVybiBpKG8odGhpcykuYW5pbWF0ZWRJbnN0YW5jZVJvb3QpfX0pLHIoYSx0LGwpLGUud3JhcHBlcnMuU1ZHVXNlRWxlbWVudD10fSh3aW5kb3cuU2hhZG93RE9NUG9seWZpbGwpLGZ1bmN0aW9uKGUpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIHQoZSl7bi5jYWxsKHRoaXMsZSl9dmFyIG49ZS53cmFwcGVycy5FdmVudFRhcmdldCxyPWUubWl4aW4sbz1lLnJlZ2lzdGVyV3JhcHBlcixpPWUudW5zYWZlVW53cmFwLGE9ZS53cmFwLHM9d2luZG93LlNWR0VsZW1lbnRJbnN0YW5jZTtzJiYodC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShuLnByb3RvdHlwZSkscih0LnByb3RvdHlwZSx7Z2V0IGNvcnJlc3BvbmRpbmdFbGVtZW50KCl7cmV0dXJuIGEoaSh0aGlzKS5jb3JyZXNwb25kaW5nRWxlbWVudCl9LGdldCBjb3JyZXNwb25kaW5nVXNlRWxlbWVudCgpe3JldHVybiBhKGkodGhpcykuY29ycmVzcG9uZGluZ1VzZUVsZW1lbnQpfSxnZXQgcGFyZW50Tm9kZSgpe3JldHVybiBhKGkodGhpcykucGFyZW50Tm9kZSl9LGdldCBjaGlsZE5vZGVzKCl7dGhyb3cgbmV3IEVycm9yKFwiTm90IGltcGxlbWVudGVkXCIpfSxnZXQgZmlyc3RDaGlsZCgpe3JldHVybiBhKGkodGhpcykuZmlyc3RDaGlsZCl9LGdldCBsYXN0Q2hpbGQoKXtyZXR1cm4gYShpKHRoaXMpLmxhc3RDaGlsZCl9LGdldCBwcmV2aW91c1NpYmxpbmcoKXtyZXR1cm4gYShpKHRoaXMpLnByZXZpb3VzU2libGluZyl9LGdldCBuZXh0U2libGluZygpe3JldHVybiBhKGkodGhpcykubmV4dFNpYmxpbmcpfX0pLG8ocyx0KSxlLndyYXBwZXJzLlNWR0VsZW1lbnRJbnN0YW5jZT10KX0od2luZG93LlNoYWRvd0RPTVBvbHlmaWxsKSxmdW5jdGlvbihlKXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiB0KGUpe28oZSx0aGlzKX12YXIgbj1lLm1peGluLHI9ZS5yZWdpc3RlcldyYXBwZXIsbz1lLnNldFdyYXBwZXIsaT1lLnVuc2FmZVVud3JhcCxhPWUudW53cmFwLHM9ZS51bndyYXBJZk5lZWRlZCxjPWUud3JhcCxsPXdpbmRvdy5DYW52YXNSZW5kZXJpbmdDb250ZXh0MkQ7bih0LnByb3RvdHlwZSx7Z2V0IGNhbnZhcygpe3JldHVybiBjKGkodGhpcykuY2FudmFzKX0sZHJhd0ltYWdlOmZ1bmN0aW9uKCl7YXJndW1lbnRzWzBdPXMoYXJndW1lbnRzWzBdKSxpKHRoaXMpLmRyYXdJbWFnZS5hcHBseShpKHRoaXMpLGFyZ3VtZW50cyl9LGNyZWF0ZVBhdHRlcm46ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzWzBdPWEoYXJndW1lbnRzWzBdKSxpKHRoaXMpLmNyZWF0ZVBhdHRlcm4uYXBwbHkoaSh0aGlzKSxhcmd1bWVudHMpfX0pLHIobCx0LGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIikuZ2V0Q29udGV4dChcIjJkXCIpKSxlLndyYXBwZXJzLkNhbnZhc1JlbmRlcmluZ0NvbnRleHQyRD10fSh3aW5kb3cuU2hhZG93RE9NUG9seWZpbGwpLGZ1bmN0aW9uKGUpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIHQoZSl7aShlLHRoaXMpfXZhciBuPWUuYWRkRm9yd2FyZGluZ1Byb3BlcnRpZXMscj1lLm1peGluLG89ZS5yZWdpc3RlcldyYXBwZXIsaT1lLnNldFdyYXBwZXIsYT1lLnVuc2FmZVVud3JhcCxzPWUudW53cmFwSWZOZWVkZWQsYz1lLndyYXAsbD13aW5kb3cuV2ViR0xSZW5kZXJpbmdDb250ZXh0O2lmKGwpe3IodC5wcm90b3R5cGUse2dldCBjYW52YXMoKXtyZXR1cm4gYyhhKHRoaXMpLmNhbnZhcyl9LHRleEltYWdlMkQ6ZnVuY3Rpb24oKXthcmd1bWVudHNbNV09cyhhcmd1bWVudHNbNV0pLGEodGhpcykudGV4SW1hZ2UyRC5hcHBseShhKHRoaXMpLGFyZ3VtZW50cyl9LHRleFN1YkltYWdlMkQ6ZnVuY3Rpb24oKXthcmd1bWVudHNbNl09cyhhcmd1bWVudHNbNl0pLGEodGhpcykudGV4U3ViSW1hZ2UyRC5hcHBseShhKHRoaXMpLGFyZ3VtZW50cyl9fSk7dmFyIHU9T2JqZWN0LmdldFByb3RvdHlwZU9mKGwucHJvdG90eXBlKTt1IT09T2JqZWN0LnByb3RvdHlwZSYmbih1LHQucHJvdG90eXBlKTt2YXIgZD0vV2ViS2l0Ly50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpP3tkcmF3aW5nQnVmZmVySGVpZ2h0Om51bGwsZHJhd2luZ0J1ZmZlcldpZHRoOm51bGx9Ont9O28obCx0LGQpLGUud3JhcHBlcnMuV2ViR0xSZW5kZXJpbmdDb250ZXh0PXR9fSh3aW5kb3cuU2hhZG93RE9NUG9seWZpbGwpLGZ1bmN0aW9uKGUpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIHQoZSl7bi5jYWxsKHRoaXMsZSl9dmFyIG49ZS53cmFwcGVycy5Ob2RlLHI9ZS5HZXRFbGVtZW50c0J5SW50ZXJmYWNlLG89ZS5Ob25FbGVtZW50UGFyZW50Tm9kZUludGVyZmFjZSxpPWUuUGFyZW50Tm9kZUludGVyZmFjZSxhPWUuU2VsZWN0b3JzSW50ZXJmYWNlLHM9ZS5taXhpbixjPWUucmVnaXN0ZXJPYmplY3QsbD1lLnJlZ2lzdGVyV3JhcHBlcix1PXdpbmRvdy5Eb2N1bWVudEZyYWdtZW50O3QucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobi5wcm90b3R5cGUpLHModC5wcm90b3R5cGUsaSkscyh0LnByb3RvdHlwZSxhKSxzKHQucHJvdG90eXBlLHIpLHModC5wcm90b3R5cGUsbyksbCh1LHQsZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpKSxlLndyYXBwZXJzLkRvY3VtZW50RnJhZ21lbnQ9dDt2YXIgZD1jKGRvY3VtZW50LmNyZWF0ZUNvbW1lbnQoXCJcIikpO2Uud3JhcHBlcnMuQ29tbWVudD1kfSh3aW5kb3cuU2hhZG93RE9NUG9seWZpbGwpLGZ1bmN0aW9uKGUpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIHQoZSl7dmFyIHQ9ZCh1KGUpLm93bmVyRG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpKTtuLmNhbGwodGhpcyx0KSxjKHQsdGhpcyk7dmFyIG89ZS5zaGFkb3dSb290O2Yuc2V0KHRoaXMsbyksdGhpcy50cmVlU2NvcGVfPW5ldyByKHRoaXMsYShvfHxlKSksaC5zZXQodGhpcyxlKX12YXIgbj1lLndyYXBwZXJzLkRvY3VtZW50RnJhZ21lbnQscj1lLlRyZWVTY29wZSxvPWUuZWxlbWVudEZyb21Qb2ludCxpPWUuZ2V0SW5uZXJIVE1MLGE9ZS5nZXRUcmVlU2NvcGUscz1lLm1peGluLGM9ZS5yZXdyYXAsbD1lLnNldElubmVySFRNTCx1PWUudW5zYWZlVW53cmFwLGQ9ZS51bndyYXAscD1lLndyYXAsaD1uZXcgV2Vha01hcCxmPW5ldyBXZWFrTWFwO3QucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobi5wcm90b3R5cGUpLHModC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnQsZ2V0IGlubmVySFRNTCgpe3JldHVybiBpKHRoaXMpfSxzZXQgaW5uZXJIVE1MKGUpe2wodGhpcyxlKSx0aGlzLmludmFsaWRhdGVTaGFkb3dSZW5kZXJlcigpfSxnZXQgb2xkZXJTaGFkb3dSb290KCl7cmV0dXJuIGYuZ2V0KHRoaXMpfHxudWxsfSxnZXQgaG9zdCgpe3JldHVybiBoLmdldCh0aGlzKXx8bnVsbH0saW52YWxpZGF0ZVNoYWRvd1JlbmRlcmVyOmZ1bmN0aW9uKCl7cmV0dXJuIGguZ2V0KHRoaXMpLmludmFsaWRhdGVTaGFkb3dSZW5kZXJlcigpfSxlbGVtZW50RnJvbVBvaW50OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIG8odGhpcyx0aGlzLm93bmVyRG9jdW1lbnQsZSx0KX0sZ2V0U2VsZWN0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIGRvY3VtZW50LmdldFNlbGVjdGlvbigpfSxnZXQgYWN0aXZlRWxlbWVudCgpe3ZhciBlPWQodGhpcykub3duZXJEb2N1bWVudC5hY3RpdmVFbGVtZW50O2lmKCFlfHwhZS5ub2RlVHlwZSlyZXR1cm4gbnVsbDt2YXIgdD1wKGUpO2lmKHQ9PT10aGlzLmhvc3QpcmV0dXJuIG51bGw7Zm9yKDshdGhpcy5jb250YWlucyh0KSYmIXRoaXMuaG9zdC5jb250YWlucyh0KTspe2Zvcig7dC5wYXJlbnROb2RlOyl0PXQucGFyZW50Tm9kZTtpZighdC5ob3N0KXJldHVybiBudWxsO3Q9dC5ob3N0fXJldHVybiB0fX0pLGUud3JhcHBlcnMuU2hhZG93Um9vdD10fSh3aW5kb3cuU2hhZG93RE9NUG9seWZpbGwpLGZ1bmN0aW9uKGUpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIHQoZSl7dmFyIHQ9ZChlKS5yb290O3JldHVybiB0IGluc3RhbmNlb2YgaD90Lmhvc3Q6bnVsbH1mdW5jdGlvbiBuKHQsbil7aWYodC5zaGFkb3dSb290KXtuPU1hdGgubWluKHQuY2hpbGROb2Rlcy5sZW5ndGgtMSxuKTt2YXIgcj10LmNoaWxkTm9kZXNbbl07aWYocil7dmFyIG89ZS5nZXREZXN0aW5hdGlvbkluc2VydGlvblBvaW50cyhyKTtpZihvLmxlbmd0aD4wKXt2YXIgaT1vWzBdLnBhcmVudE5vZGU7aS5ub2RlVHlwZT09Tm9kZS5FTEVNRU5UX05PREUmJih0PWkpfX19cmV0dXJuIHR9ZnVuY3Rpb24gcihlKXtyZXR1cm4gZT11KGUpLHQoZSl8fGV9ZnVuY3Rpb24gbyhlKXthKGUsdGhpcyl9dmFyIGk9ZS5yZWdpc3RlcldyYXBwZXIsYT1lLnNldFdyYXBwZXIscz1lLnVuc2FmZVVud3JhcCxjPWUudW53cmFwLGw9ZS51bndyYXBJZk5lZWRlZCx1PWUud3JhcCxkPWUuZ2V0VHJlZVNjb3BlLHA9d2luZG93LlJhbmdlLGg9ZS53cmFwcGVycy5TaGFkb3dSb290O28ucHJvdG90eXBlPXtnZXQgc3RhcnRDb250YWluZXIoKXtyZXR1cm4gcihzKHRoaXMpLnN0YXJ0Q29udGFpbmVyKX0sZ2V0IGVuZENvbnRhaW5lcigpe3JldHVybiByKHModGhpcykuZW5kQ29udGFpbmVyKX0sZ2V0IGNvbW1vbkFuY2VzdG9yQ29udGFpbmVyKCl7cmV0dXJuIHIocyh0aGlzKS5jb21tb25BbmNlc3RvckNvbnRhaW5lcil9LHNldFN0YXJ0OmZ1bmN0aW9uKGUsdCl7ZT1uKGUsdCkscyh0aGlzKS5zZXRTdGFydChsKGUpLHQpfSxzZXRFbmQ6ZnVuY3Rpb24oZSx0KXtlPW4oZSx0KSxzKHRoaXMpLnNldEVuZChsKGUpLHQpfSxzZXRTdGFydEJlZm9yZTpmdW5jdGlvbihlKXtzKHRoaXMpLnNldFN0YXJ0QmVmb3JlKGwoZSkpfSxzZXRTdGFydEFmdGVyOmZ1bmN0aW9uKGUpe3ModGhpcykuc2V0U3RhcnRBZnRlcihsKGUpKX0sc2V0RW5kQmVmb3JlOmZ1bmN0aW9uKGUpe3ModGhpcykuc2V0RW5kQmVmb3JlKGwoZSkpfSxzZXRFbmRBZnRlcjpmdW5jdGlvbihlKXtzKHRoaXMpLnNldEVuZEFmdGVyKGwoZSkpfSxzZWxlY3ROb2RlOmZ1bmN0aW9uKGUpe3ModGhpcykuc2VsZWN0Tm9kZShsKGUpKX0sc2VsZWN0Tm9kZUNvbnRlbnRzOmZ1bmN0aW9uKGUpe3ModGhpcykuc2VsZWN0Tm9kZUNvbnRlbnRzKGwoZSkpfSxjb21wYXJlQm91bmRhcnlQb2ludHM6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gcyh0aGlzKS5jb21wYXJlQm91bmRhcnlQb2ludHMoZSxjKHQpKX0sZXh0cmFjdENvbnRlbnRzOmZ1bmN0aW9uKCl7cmV0dXJuIHUocyh0aGlzKS5leHRyYWN0Q29udGVudHMoKSl9LGNsb25lQ29udGVudHM6ZnVuY3Rpb24oKXtyZXR1cm4gdShzKHRoaXMpLmNsb25lQ29udGVudHMoKSl9LGluc2VydE5vZGU6ZnVuY3Rpb24oZSl7cyh0aGlzKS5pbnNlcnROb2RlKGwoZSkpfSxzdXJyb3VuZENvbnRlbnRzOmZ1bmN0aW9uKGUpe3ModGhpcykuc3Vycm91bmRDb250ZW50cyhsKGUpKX0sY2xvbmVSYW5nZTpmdW5jdGlvbigpe3JldHVybiB1KHModGhpcykuY2xvbmVSYW5nZSgpKX0saXNQb2ludEluUmFuZ2U6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gcyh0aGlzKS5pc1BvaW50SW5SYW5nZShsKGUpLHQpfSxjb21wYXJlUG9pbnQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gcyh0aGlzKS5jb21wYXJlUG9pbnQobChlKSx0KX0saW50ZXJzZWN0c05vZGU6ZnVuY3Rpb24oZSl7cmV0dXJuIHModGhpcykuaW50ZXJzZWN0c05vZGUobChlKSl9LHRvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHModGhpcykudG9TdHJpbmcoKX19LHAucHJvdG90eXBlLmNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudCYmKG8ucHJvdG90eXBlLmNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudD1mdW5jdGlvbihlKXtyZXR1cm4gdShzKHRoaXMpLmNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudChlKSl9KSxpKHdpbmRvdy5SYW5nZSxvLGRvY3VtZW50LmNyZWF0ZVJhbmdlKCkpLGUud3JhcHBlcnMuUmFuZ2U9b30od2luZG93LlNoYWRvd0RPTVBvbHlmaWxsKSxmdW5jdGlvbihlKXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiB0KGUpe2UucHJldmlvdXNTaWJsaW5nXz1lLnByZXZpb3VzU2libGluZyxlLm5leHRTaWJsaW5nXz1lLm5leHRTaWJsaW5nLGUucGFyZW50Tm9kZV89ZS5wYXJlbnROb2RlfWZ1bmN0aW9uIG4obixvLGkpe3ZhciBhPXgobikscz14KG8pLGM9aT94KGkpOm51bGw7aWYocihvKSx0KG8pLGkpbi5maXJzdENoaWxkPT09aSYmKG4uZmlyc3RDaGlsZF89aSksaS5wcmV2aW91c1NpYmxpbmdfPWkucHJldmlvdXNTaWJsaW5nO2Vsc2V7bi5sYXN0Q2hpbGRfPW4ubGFzdENoaWxkLG4ubGFzdENoaWxkPT09bi5maXJzdENoaWxkJiYobi5maXJzdENoaWxkXz1uLmZpcnN0Q2hpbGQpO3ZhciBsPVIoYS5sYXN0Q2hpbGQpO2wmJihsLm5leHRTaWJsaW5nXz1sLm5leHRTaWJsaW5nKX1lLm9yaWdpbmFsSW5zZXJ0QmVmb3JlLmNhbGwoYSxzLGMpfWZ1bmN0aW9uIHIobil7dmFyIHI9eChuKSxvPXIucGFyZW50Tm9kZTtpZihvKXt2YXIgaT1SKG8pO3Qobiksbi5wcmV2aW91c1NpYmxpbmcmJihuLnByZXZpb3VzU2libGluZy5uZXh0U2libGluZ189biksbi5uZXh0U2libGluZyYmKG4ubmV4dFNpYmxpbmcucHJldmlvdXNTaWJsaW5nXz1uKSxpLmxhc3RDaGlsZD09PW4mJihpLmxhc3RDaGlsZF89biksaS5maXJzdENoaWxkPT09biYmKGkuZmlyc3RDaGlsZF89biksZS5vcmlnaW5hbFJlbW92ZUNoaWxkLmNhbGwobyxyKX19ZnVuY3Rpb24gbyhlKXtQLnNldChlLFtdKX1mdW5jdGlvbiBpKGUpe3ZhciB0PVAuZ2V0KGUpO3JldHVybiB0fHxQLnNldChlLHQ9W10pLHR9ZnVuY3Rpb24gYShlKXtmb3IodmFyIHQ9W10sbj0wLHI9ZS5maXJzdENoaWxkO3I7cj1yLm5leHRTaWJsaW5nKXRbbisrXT1yO3JldHVybiB0fWZ1bmN0aW9uIHMoKXtmb3IodmFyIGU9MDtlPEYubGVuZ3RoO2UrKyl7dmFyIHQ9RltlXSxuPXQucGFyZW50UmVuZGVyZXI7biYmbi5kaXJ0eXx8dC5yZW5kZXIoKX1GPVtdfWZ1bmN0aW9uIGMoKXtUPW51bGwscygpfWZ1bmN0aW9uIGwoZSl7dmFyIHQ9QS5nZXQoZSk7cmV0dXJuIHR8fCh0PW5ldyBoKGUpLEEuc2V0KGUsdCkpLHR9ZnVuY3Rpb24gdShlKXt2YXIgdD1qKGUpLnJvb3Q7cmV0dXJuIHQgaW5zdGFuY2VvZiBDP3Q6bnVsbH1mdW5jdGlvbiBkKGUpe3JldHVybiBsKGUuaG9zdCl9ZnVuY3Rpb24gcChlKXt0aGlzLnNraXA9ITEsdGhpcy5ub2RlPWUsdGhpcy5jaGlsZE5vZGVzPVtdfWZ1bmN0aW9uIGgoZSl7dGhpcy5ob3N0PWUsdGhpcy5kaXJ0eT0hMSx0aGlzLmludmFsaWRhdGVBdHRyaWJ1dGVzKCksdGhpcy5hc3NvY2lhdGVOb2RlKGUpfWZ1bmN0aW9uIGYoZSl7Zm9yKHZhciB0PVtdLG49ZS5maXJzdENoaWxkO247bj1uLm5leHRTaWJsaW5nKUUobik/dC5wdXNoLmFwcGx5KHQsaShuKSk6dC5wdXNoKG4pO3JldHVybiB0fWZ1bmN0aW9uIG0oZSl7aWYoZSBpbnN0YW5jZW9mIEwpcmV0dXJuIGU7aWYoZSBpbnN0YW5jZW9mIE8pcmV0dXJuIG51bGw7Zm9yKHZhciB0PWUuZmlyc3RDaGlsZDt0O3Q9dC5uZXh0U2libGluZyl7dmFyIG49bSh0KTtpZihuKXJldHVybiBufXJldHVybiBudWxsfWZ1bmN0aW9uIHcoZSx0KXtpKHQpLnB1c2goZSk7dmFyIG49ay5nZXQoZSk7bj9uLnB1c2godCk6ay5zZXQoZSxbdF0pfWZ1bmN0aW9uIHYoZSl7cmV0dXJuIGsuZ2V0KGUpfWZ1bmN0aW9uIGcoZSl7ay5zZXQoZSx2b2lkIDApfWZ1bmN0aW9uIGIoZSx0KXt2YXIgbj10LmdldEF0dHJpYnV0ZShcInNlbGVjdFwiKTtpZighbilyZXR1cm4hMDtpZihuPW4udHJpbSgpLCFuKXJldHVybiEwO2lmKCEoZSBpbnN0YW5jZW9mIE0pKXJldHVybiExO2lmKCFxLnRlc3QobikpcmV0dXJuITE7dHJ5e3JldHVybiBlLm1hdGNoZXMobil9Y2F0Y2gocil7cmV0dXJuITF9fWZ1bmN0aW9uIHkoZSx0KXt2YXIgbj12KHQpO3JldHVybiBuJiZuW24ubGVuZ3RoLTFdPT09ZX1mdW5jdGlvbiBFKGUpe3JldHVybiBlIGluc3RhbmNlb2YgT3x8ZSBpbnN0YW5jZW9mIEx9ZnVuY3Rpb24gXyhlKXtyZXR1cm4gZS5zaGFkb3dSb290fWZ1bmN0aW9uIFMoZSl7Zm9yKHZhciB0PVtdLG49ZS5zaGFkb3dSb290O247bj1uLm9sZGVyU2hhZG93Um9vdCl0LnB1c2gobik7cmV0dXJuIHR9dmFyIFQsTT1lLndyYXBwZXJzLkVsZW1lbnQsTz1lLndyYXBwZXJzLkhUTUxDb250ZW50RWxlbWVudCxMPWUud3JhcHBlcnMuSFRNTFNoYWRvd0VsZW1lbnQsTj1lLndyYXBwZXJzLk5vZGUsQz1lLndyYXBwZXJzLlNoYWRvd1Jvb3Qsaj0oZS5hc3NlcnQsZS5nZXRUcmVlU2NvcGUpLEQ9KGUubWl4aW4sZS5vbmVPZiksSD1lLnVuc2FmZVVud3JhcCx4PWUudW53cmFwLFI9ZS53cmFwLEk9ZS5BcnJheVNwbGljZSxQPW5ldyBXZWFrTWFwLGs9bmV3IFdlYWtNYXAsQT1uZXcgV2Vha01hcCxXPUQod2luZG93LFtcInJlcXVlc3RBbmltYXRpb25GcmFtZVwiLFwibW96UmVxdWVzdEFuaW1hdGlvbkZyYW1lXCIsXCJ3ZWJraXRSZXF1ZXN0QW5pbWF0aW9uRnJhbWVcIixcInNldFRpbWVvdXRcIl0pLEY9W10sVT1uZXcgSTtVLmVxdWFscz1mdW5jdGlvbihlLHQpe3JldHVybiB4KGUubm9kZSk9PT10fSxwLnByb3RvdHlwZT17YXBwZW5kOmZ1bmN0aW9uKGUpe3ZhciB0PW5ldyBwKGUpO3JldHVybiB0aGlzLmNoaWxkTm9kZXMucHVzaCh0KSx0fSxzeW5jOmZ1bmN0aW9uKGUpe2lmKCF0aGlzLnNraXApe2Zvcih2YXIgdD10aGlzLm5vZGUsbz10aGlzLmNoaWxkTm9kZXMsaT1hKHgodCkpLHM9ZXx8bmV3IFdlYWtNYXAsYz1VLmNhbGN1bGF0ZVNwbGljZXMobyxpKSxsPTAsdT0wLGQ9MCxwPTA7cDxjLmxlbmd0aDtwKyspe2Zvcih2YXIgaD1jW3BdO2Q8aC5pbmRleDtkKyspdSsrLG9bbCsrXS5zeW5jKHMpO2Zvcih2YXIgZj1oLnJlbW92ZWQubGVuZ3RoLG09MDtmPm07bSsrKXt2YXIgdz1SKGlbdSsrXSk7cy5nZXQodyl8fHIodyl9Zm9yKHZhciB2PWguYWRkZWRDb3VudCxnPWlbdV0mJlIoaVt1XSksbT0wO3Y+bTttKyspe3ZhciBiPW9bbCsrXSx5PWIubm9kZTtuKHQseSxnKSxzLnNldCh5LCEwKSxiLnN5bmMocyl9ZCs9dn1mb3IodmFyIHA9ZDtwPG8ubGVuZ3RoO3ArKylvW3BdLnN5bmMocyl9fX0saC5wcm90b3R5cGU9e3JlbmRlcjpmdW5jdGlvbihlKXtpZih0aGlzLmRpcnR5KXt0aGlzLmludmFsaWRhdGVBdHRyaWJ1dGVzKCk7dmFyIHQ9dGhpcy5ob3N0O3RoaXMuZGlzdHJpYnV0aW9uKHQpO3ZhciBuPWV8fG5ldyBwKHQpO3RoaXMuYnVpbGRSZW5kZXJUcmVlKG4sdCk7dmFyIHI9IWU7ciYmbi5zeW5jKCksdGhpcy5kaXJ0eT0hMX19LGdldCBwYXJlbnRSZW5kZXJlcigpe3JldHVybiBqKHRoaXMuaG9zdCkucmVuZGVyZXJ9LGludmFsaWRhdGU6ZnVuY3Rpb24oKXtpZighdGhpcy5kaXJ0eSl7dGhpcy5kaXJ0eT0hMDt2YXIgZT10aGlzLnBhcmVudFJlbmRlcmVyO2lmKGUmJmUuaW52YWxpZGF0ZSgpLEYucHVzaCh0aGlzKSxUKXJldHVybjtUPXdpbmRvd1tXXShjLDApfX0sZGlzdHJpYnV0aW9uOmZ1bmN0aW9uKGUpe3RoaXMucmVzZXRBbGxTdWJ0cmVlcyhlKSx0aGlzLmRpc3RyaWJ1dGlvblJlc29sdXRpb24oZSl9LHJlc2V0QWxsOmZ1bmN0aW9uKGUpe0UoZSk/byhlKTpnKGUpLHRoaXMucmVzZXRBbGxTdWJ0cmVlcyhlKX0scmVzZXRBbGxTdWJ0cmVlczpmdW5jdGlvbihlKXtmb3IodmFyIHQ9ZS5maXJzdENoaWxkO3Q7dD10Lm5leHRTaWJsaW5nKXRoaXMucmVzZXRBbGwodCk7ZS5zaGFkb3dSb290JiZ0aGlzLnJlc2V0QWxsKGUuc2hhZG93Um9vdCksZS5vbGRlclNoYWRvd1Jvb3QmJnRoaXMucmVzZXRBbGwoZS5vbGRlclNoYWRvd1Jvb3QpfSxkaXN0cmlidXRpb25SZXNvbHV0aW9uOmZ1bmN0aW9uKGUpe2lmKF8oZSkpe2Zvcih2YXIgdD1lLG49Zih0KSxyPVModCksbz0wO288ci5sZW5ndGg7bysrKXRoaXMucG9vbERpc3RyaWJ1dGlvbihyW29dLG4pO2Zvcih2YXIgbz1yLmxlbmd0aC0xO28+PTA7by0tKXt2YXIgaT1yW29dLGE9bShpKTtpZihhKXt2YXIgcz1pLm9sZGVyU2hhZG93Um9vdDtzJiYobj1mKHMpKTtmb3IodmFyIGM9MDtjPG4ubGVuZ3RoO2MrKyl3KG5bY10sYSl9dGhpcy5kaXN0cmlidXRpb25SZXNvbHV0aW9uKGkpfX1mb3IodmFyIGw9ZS5maXJzdENoaWxkO2w7bD1sLm5leHRTaWJsaW5nKXRoaXMuZGlzdHJpYnV0aW9uUmVzb2x1dGlvbihsKX0scG9vbERpc3RyaWJ1dGlvbjpmdW5jdGlvbihlLHQpe2lmKCEoZSBpbnN0YW5jZW9mIEwpKWlmKGUgaW5zdGFuY2VvZiBPKXt2YXIgbj1lO3RoaXMudXBkYXRlRGVwZW5kZW50QXR0cmlidXRlcyhuLmdldEF0dHJpYnV0ZShcInNlbGVjdFwiKSk7Zm9yKHZhciByPSExLG89MDtvPHQubGVuZ3RoO28rKyl7dmFyIGU9dFtvXTtlJiZiKGUsbikmJih3KGUsbiksdFtvXT12b2lkIDAscj0hMCl9aWYoIXIpZm9yKHZhciBpPW4uZmlyc3RDaGlsZDtpO2k9aS5uZXh0U2libGluZyl3KGksbil9ZWxzZSBmb3IodmFyIGk9ZS5maXJzdENoaWxkO2k7aT1pLm5leHRTaWJsaW5nKXRoaXMucG9vbERpc3RyaWJ1dGlvbihpLHQpfSxidWlsZFJlbmRlclRyZWU6ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49dGhpcy5jb21wb3NlKHQpLHI9MDtyPG4ubGVuZ3RoO3IrKyl7dmFyIG89bltyXSxpPWUuYXBwZW5kKG8pO3RoaXMuYnVpbGRSZW5kZXJUcmVlKGksbyl9aWYoXyh0KSl7dmFyIGE9bCh0KTthLmRpcnR5PSExfX0sY29tcG9zZTpmdW5jdGlvbihlKXtmb3IodmFyIHQ9W10sbj1lLnNoYWRvd1Jvb3R8fGUscj1uLmZpcnN0Q2hpbGQ7cjtyPXIubmV4dFNpYmxpbmcpaWYoRShyKSl7dGhpcy5hc3NvY2lhdGVOb2RlKG4pO2Zvcih2YXIgbz1pKHIpLGE9MDthPG8ubGVuZ3RoO2ErKyl7dmFyIHM9b1thXTt5KHIscykmJnQucHVzaChzKX19ZWxzZSB0LnB1c2gocik7cmV0dXJuIHR9LGludmFsaWRhdGVBdHRyaWJ1dGVzOmZ1bmN0aW9uKCl7dGhpcy5hdHRyaWJ1dGVzPU9iamVjdC5jcmVhdGUobnVsbCl9LHVwZGF0ZURlcGVuZGVudEF0dHJpYnV0ZXM6ZnVuY3Rpb24oZSl7aWYoZSl7dmFyIHQ9dGhpcy5hdHRyaWJ1dGVzOy9cXC5cXHcrLy50ZXN0KGUpJiYodFtcImNsYXNzXCJdPSEwKSwvI1xcdysvLnRlc3QoZSkmJih0LmlkPSEwKSxlLnJlcGxhY2UoL1xcW1xccyooW15cXHM9XFx8flxcXV0rKS9nLGZ1bmN0aW9uKGUsbil7dFtuXT0hMH0pfX0sZGVwZW5kc09uQXR0cmlidXRlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmF0dHJpYnV0ZXNbZV19LGFzc29jaWF0ZU5vZGU6ZnVuY3Rpb24oZSl7SChlKS5wb2x5bWVyU2hhZG93UmVuZGVyZXJfPXRoaXN9fTt2YXIgcT0vXig6bm90XFwoKT9bKi4jW2EtekEtWl98XS87Ti5wcm90b3R5cGUuaW52YWxpZGF0ZVNoYWRvd1JlbmRlcmVyPWZ1bmN0aW9uKGUpe3ZhciB0PUgodGhpcykucG9seW1lclNoYWRvd1JlbmRlcmVyXztyZXR1cm4gdD8odC5pbnZhbGlkYXRlKCksITApOiExfSxPLnByb3RvdHlwZS5nZXREaXN0cmlidXRlZE5vZGVzPUwucHJvdG90eXBlLmdldERpc3RyaWJ1dGVkTm9kZXM9ZnVuY3Rpb24oKXtyZXR1cm4gcygpLGkodGhpcyl9LE0ucHJvdG90eXBlLmdldERlc3RpbmF0aW9uSW5zZXJ0aW9uUG9pbnRzPWZ1bmN0aW9uKCl7cmV0dXJuIHMoKSx2KHRoaXMpfHxbXX0sTy5wcm90b3R5cGUubm9kZUlzSW5zZXJ0ZWRfPUwucHJvdG90eXBlLm5vZGVJc0luc2VydGVkXz1mdW5jdGlvbigpe3RoaXMuaW52YWxpZGF0ZVNoYWRvd1JlbmRlcmVyKCk7dmFyIGUsdD11KHRoaXMpO3QmJihlPWQodCkpLEgodGhpcykucG9seW1lclNoYWRvd1JlbmRlcmVyXz1lLGUmJmUuaW52YWxpZGF0ZSgpfSxlLmdldFJlbmRlcmVyRm9ySG9zdD1sLGUuZ2V0U2hhZG93VHJlZXM9UyxlLnJlbmRlckFsbFBlbmRpbmc9cyxlLmdldERlc3RpbmF0aW9uSW5zZXJ0aW9uUG9pbnRzPXYsZS52aXN1YWw9e2luc2VydEJlZm9yZTpuLHJlbW92ZTpyfX0od2luZG93LlNoYWRvd0RPTVBvbHlmaWxsKSxmdW5jdGlvbihlKXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiB0KHQpe2lmKHdpbmRvd1t0XSl7cighZS53cmFwcGVyc1t0XSk7dmFyIGM9ZnVuY3Rpb24oZSl7bi5jYWxsKHRoaXMsZSl9O2MucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobi5wcm90b3R5cGUpLG8oYy5wcm90b3R5cGUse2dldCBmb3JtKCl7cmV0dXJuIHMoYSh0aGlzKS5mb3JtKX19KSxpKHdpbmRvd1t0XSxjLGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodC5zbGljZSg0LC03KSkpLGUud3JhcHBlcnNbdF09Y319dmFyIG49ZS53cmFwcGVycy5IVE1MRWxlbWVudCxyPWUuYXNzZXJ0LG89ZS5taXhpbixpPWUucmVnaXN0ZXJXcmFwcGVyLGE9ZS51bndyYXAscz1lLndyYXAsYz1bXCJIVE1MQnV0dG9uRWxlbWVudFwiLFwiSFRNTEZpZWxkU2V0RWxlbWVudFwiLFwiSFRNTElucHV0RWxlbWVudFwiLFwiSFRNTEtleWdlbkVsZW1lbnRcIixcIkhUTUxMYWJlbEVsZW1lbnRcIixcIkhUTUxMZWdlbmRFbGVtZW50XCIsXCJIVE1MT2JqZWN0RWxlbWVudFwiLFwiSFRNTE91dHB1dEVsZW1lbnRcIixcIkhUTUxUZXh0QXJlYUVsZW1lbnRcIl07Yy5mb3JFYWNoKHQpfSh3aW5kb3cuU2hhZG93RE9NUG9seWZpbGwpLGZ1bmN0aW9uKGUpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIHQoZSl7cihlLHRoaXMpfXZhciBuPWUucmVnaXN0ZXJXcmFwcGVyLHI9ZS5zZXRXcmFwcGVyLG89ZS51bnNhZmVVbndyYXAsaT1lLnVud3JhcCxhPWUudW53cmFwSWZOZWVkZWQscz1lLndyYXAsYz13aW5kb3cuU2VsZWN0aW9uO3QucHJvdG90eXBlPXtnZXQgYW5jaG9yTm9kZSgpe3JldHVybiBzKG8odGhpcykuYW5jaG9yTm9kZSl9LGdldCBmb2N1c05vZGUoKXtyZXR1cm4gcyhvKHRoaXMpLmZvY3VzTm9kZSl9LGFkZFJhbmdlOmZ1bmN0aW9uKGUpe28odGhpcykuYWRkUmFuZ2UoYShlKSl9LGNvbGxhcHNlOmZ1bmN0aW9uKGUsdCl7byh0aGlzKS5jb2xsYXBzZShhKGUpLHQpfSxjb250YWluc05vZGU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbyh0aGlzKS5jb250YWluc05vZGUoYShlKSx0KX0sZ2V0UmFuZ2VBdDpmdW5jdGlvbihlKXtyZXR1cm4gcyhvKHRoaXMpLmdldFJhbmdlQXQoZSkpfSxyZW1vdmVSYW5nZTpmdW5jdGlvbihlKXtvKHRoaXMpLnJlbW92ZVJhbmdlKGkoZSkpfSxzZWxlY3RBbGxDaGlsZHJlbjpmdW5jdGlvbihlKXtvKHRoaXMpLnNlbGVjdEFsbENoaWxkcmVuKGUgaW5zdGFuY2VvZiBTaGFkb3dSb290P28oZS5ob3N0KTphKGUpKX0sdG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gbyh0aGlzKS50b1N0cmluZygpfX0sYy5wcm90b3R5cGUuZXh0ZW5kJiYodC5wcm90b3R5cGUuZXh0ZW5kPWZ1bmN0aW9uKGUsdCl7byh0aGlzKS5leHRlbmQoYShlKSx0KX0pLG4od2luZG93LlNlbGVjdGlvbix0LHdpbmRvdy5nZXRTZWxlY3Rpb24oKSksZS53cmFwcGVycy5TZWxlY3Rpb249dH0od2luZG93LlNoYWRvd0RPTVBvbHlmaWxsKSxmdW5jdGlvbihlKXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiB0KGUpe3IoZSx0aGlzKX12YXIgbj1lLnJlZ2lzdGVyV3JhcHBlcixyPWUuc2V0V3JhcHBlcixvPWUudW5zYWZlVW53cmFwLGk9ZS51bndyYXBJZk5lZWRlZCxhPWUud3JhcCxzPXdpbmRvdy5UcmVlV2Fsa2VyO3QucHJvdG90eXBlPXtnZXQgcm9vdCgpe3JldHVybiBhKG8odGhpcykucm9vdCl9LGdldCBjdXJyZW50Tm9kZSgpe3JldHVybiBhKG8odGhpcykuY3VycmVudE5vZGUpfSxzZXQgY3VycmVudE5vZGUoZSl7byh0aGlzKS5jdXJyZW50Tm9kZT1pKGUpfSxnZXQgZmlsdGVyKCl7cmV0dXJuIG8odGhpcykuZmlsdGVyfSxwYXJlbnROb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIGEobyh0aGlzKS5wYXJlbnROb2RlKCkpfSxmaXJzdENoaWxkOmZ1bmN0aW9uKCl7cmV0dXJuIGEobyh0aGlzKS5maXJzdENoaWxkKCkpfSxsYXN0Q2hpbGQ6ZnVuY3Rpb24oKXtyZXR1cm4gYShvKHRoaXMpLmxhc3RDaGlsZCgpKX0scHJldmlvdXNTaWJsaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIGEobyh0aGlzKS5wcmV2aW91c1NpYmxpbmcoKSl9LHByZXZpb3VzTm9kZTpmdW5jdGlvbigpe3JldHVybiBhKG8odGhpcykucHJldmlvdXNOb2RlKCkpfSxuZXh0Tm9kZTpmdW5jdGlvbigpe3JldHVybiBhKG8odGhpcykubmV4dE5vZGUoKSl9fSxuKHMsdCksZS53cmFwcGVycy5UcmVlV2Fsa2VyPXR9KHdpbmRvdy5TaGFkb3dET01Qb2x5ZmlsbCksZnVuY3Rpb24oZSl7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gdChlKXt1LmNhbGwodGhpcyxlKSx0aGlzLnRyZWVTY29wZV89bmV3IHcodGhpcyxudWxsKX1mdW5jdGlvbiBuKGUpe3ZhciBuPWRvY3VtZW50W2VdO3QucHJvdG90eXBlW2VdPWZ1bmN0aW9uKCl7cmV0dXJuIGoobi5hcHBseShOKHRoaXMpLGFyZ3VtZW50cykpfX1mdW5jdGlvbiByKGUsdCl7eC5jYWxsKE4odCksQyhlKSksbyhlLHQpfWZ1bmN0aW9uIG8oZSx0KXtlLnNoYWRvd1Jvb3QmJnQuYWRvcHROb2RlKGUuc2hhZG93Um9vdCksZSBpbnN0YW5jZW9mIG0mJmkoZSx0KTtmb3IodmFyIG49ZS5maXJzdENoaWxkO247bj1uLm5leHRTaWJsaW5nKW8obix0KX1mdW5jdGlvbiBpKGUsdCl7dmFyIG49ZS5vbGRlclNoYWRvd1Jvb3Q7biYmdC5hZG9wdE5vZGUobil9ZnVuY3Rpb24gYShlKXtMKGUsdGhpcyl9ZnVuY3Rpb24gcyhlLHQpe1xudmFyIG49ZG9jdW1lbnQuaW1wbGVtZW50YXRpb25bdF07ZS5wcm90b3R5cGVbdF09ZnVuY3Rpb24oKXtyZXR1cm4gaihuLmFwcGx5KE4odGhpcyksYXJndW1lbnRzKSl9fWZ1bmN0aW9uIGMoZSx0KXt2YXIgbj1kb2N1bWVudC5pbXBsZW1lbnRhdGlvblt0XTtlLnByb3RvdHlwZVt0XT1mdW5jdGlvbigpe3JldHVybiBuLmFwcGx5KE4odGhpcyksYXJndW1lbnRzKX19dmFyIGw9ZS5HZXRFbGVtZW50c0J5SW50ZXJmYWNlLHU9ZS53cmFwcGVycy5Ob2RlLGQ9ZS5QYXJlbnROb2RlSW50ZXJmYWNlLHA9ZS5Ob25FbGVtZW50UGFyZW50Tm9kZUludGVyZmFjZSxoPWUud3JhcHBlcnMuU2VsZWN0aW9uLGY9ZS5TZWxlY3RvcnNJbnRlcmZhY2UsbT1lLndyYXBwZXJzLlNoYWRvd1Jvb3Qsdz1lLlRyZWVTY29wZSx2PWUuY2xvbmVOb2RlLGc9ZS5kZWZpbmVHZXR0ZXIsYj1lLmRlZmluZVdyYXBHZXR0ZXIseT1lLmVsZW1lbnRGcm9tUG9pbnQsRT1lLmZvcndhcmRNZXRob2RzVG9XcmFwcGVyLF89ZS5tYXRjaGVzTmFtZXMsUz1lLm1peGluLFQ9ZS5yZWdpc3RlcldyYXBwZXIsTT1lLnJlbmRlckFsbFBlbmRpbmcsTz1lLnJld3JhcCxMPWUuc2V0V3JhcHBlcixOPWUudW5zYWZlVW53cmFwLEM9ZS51bndyYXAsaj1lLndyYXAsRD1lLndyYXBFdmVudFRhcmdldE1ldGhvZHMsSD0oZS53cmFwTm9kZUxpc3QsbmV3IFdlYWtNYXApO3QucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodS5wcm90b3R5cGUpLGIodCxcImRvY3VtZW50RWxlbWVudFwiKSxiKHQsXCJib2R5XCIpLGIodCxcImhlYWRcIiksZyh0LFwiYWN0aXZlRWxlbWVudFwiLGZ1bmN0aW9uKCl7dmFyIGU9Qyh0aGlzKS5hY3RpdmVFbGVtZW50O2lmKCFlfHwhZS5ub2RlVHlwZSlyZXR1cm4gbnVsbDtmb3IodmFyIHQ9aihlKTshdGhpcy5jb250YWlucyh0KTspe2Zvcig7dC5wYXJlbnROb2RlOyl0PXQucGFyZW50Tm9kZTtpZighdC5ob3N0KXJldHVybiBudWxsO3Q9dC5ob3N0fXJldHVybiB0fSksW1wiY3JlYXRlQ29tbWVudFwiLFwiY3JlYXRlRG9jdW1lbnRGcmFnbWVudFwiLFwiY3JlYXRlRWxlbWVudFwiLFwiY3JlYXRlRWxlbWVudE5TXCIsXCJjcmVhdGVFdmVudFwiLFwiY3JlYXRlRXZlbnROU1wiLFwiY3JlYXRlUmFuZ2VcIixcImNyZWF0ZVRleHROb2RlXCJdLmZvckVhY2gobik7dmFyIHg9ZG9jdW1lbnQuYWRvcHROb2RlLFI9ZG9jdW1lbnQuZ2V0U2VsZWN0aW9uO1ModC5wcm90b3R5cGUse2Fkb3B0Tm9kZTpmdW5jdGlvbihlKXtyZXR1cm4gZS5wYXJlbnROb2RlJiZlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZSkscihlLHRoaXMpLGV9LGVsZW1lbnRGcm9tUG9pbnQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4geSh0aGlzLHRoaXMsZSx0KX0saW1wb3J0Tm9kZTpmdW5jdGlvbihlLHQpe3JldHVybiB2KGUsdCxOKHRoaXMpKX0sZ2V0U2VsZWN0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIE0oKSxuZXcgaChSLmNhbGwoQyh0aGlzKSkpfSxnZXRFbGVtZW50c0J5TmFtZTpmdW5jdGlvbihlKXtyZXR1cm4gZi5xdWVyeVNlbGVjdG9yQWxsLmNhbGwodGhpcyxcIltuYW1lPVwiK0pTT04uc3RyaW5naWZ5KFN0cmluZyhlKSkrXCJdXCIpfX0pO3ZhciBJPWRvY3VtZW50LmNyZWF0ZVRyZWVXYWxrZXIsUD1lLndyYXBwZXJzLlRyZWVXYWxrZXI7aWYodC5wcm90b3R5cGUuY3JlYXRlVHJlZVdhbGtlcj1mdW5jdGlvbihlLHQsbixyKXt2YXIgbz1udWxsO3JldHVybiBuJiYobi5hY2NlcHROb2RlJiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBuLmFjY2VwdE5vZGU/bz17YWNjZXB0Tm9kZTpmdW5jdGlvbihlKXtyZXR1cm4gbi5hY2NlcHROb2RlKGooZSkpfX06XCJmdW5jdGlvblwiPT10eXBlb2YgbiYmKG89ZnVuY3Rpb24oZSl7cmV0dXJuIG4oaihlKSl9KSksbmV3IFAoSS5jYWxsKEModGhpcyksQyhlKSx0LG8scikpfSxkb2N1bWVudC5yZWdpc3RlckVsZW1lbnQpe3ZhciBrPWRvY3VtZW50LnJlZ2lzdGVyRWxlbWVudDt0LnByb3RvdHlwZS5yZWdpc3RlckVsZW1lbnQ9ZnVuY3Rpb24odCxuKXtmdW5jdGlvbiByKGUpe3JldHVybiBlP3ZvaWQgTChlLHRoaXMpOmk/ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChpLHQpOmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodCl9dmFyIG8saTtpZih2b2lkIDAhPT1uJiYobz1uLnByb3RvdHlwZSxpPW5bXCJleHRlbmRzXCJdKSxvfHwobz1PYmplY3QuY3JlYXRlKEhUTUxFbGVtZW50LnByb3RvdHlwZSkpLGUubmF0aXZlUHJvdG90eXBlVGFibGUuZ2V0KG8pKXRocm93IG5ldyBFcnJvcihcIk5vdFN1cHBvcnRlZEVycm9yXCIpO2Zvcih2YXIgYSxzPU9iamVjdC5nZXRQcm90b3R5cGVPZihvKSxjPVtdO3MmJiEoYT1lLm5hdGl2ZVByb3RvdHlwZVRhYmxlLmdldChzKSk7KWMucHVzaChzKSxzPU9iamVjdC5nZXRQcm90b3R5cGVPZihzKTtpZighYSl0aHJvdyBuZXcgRXJyb3IoXCJOb3RTdXBwb3J0ZWRFcnJvclwiKTtmb3IodmFyIGw9T2JqZWN0LmNyZWF0ZShhKSx1PWMubGVuZ3RoLTE7dT49MDt1LS0pbD1PYmplY3QuY3JlYXRlKGwpO1tcImNyZWF0ZWRDYWxsYmFja1wiLFwiYXR0YWNoZWRDYWxsYmFja1wiLFwiZGV0YWNoZWRDYWxsYmFja1wiLFwiYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrXCJdLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9b1tlXTt0JiYobFtlXT1mdW5jdGlvbigpe2oodGhpcylpbnN0YW5jZW9mIHJ8fE8odGhpcyksdC5hcHBseShqKHRoaXMpLGFyZ3VtZW50cyl9KX0pO3ZhciBkPXtwcm90b3R5cGU6bH07aSYmKGRbXCJleHRlbmRzXCJdPWkpLHIucHJvdG90eXBlPW8sci5wcm90b3R5cGUuY29uc3RydWN0b3I9cixlLmNvbnN0cnVjdG9yVGFibGUuc2V0KGwsciksZS5uYXRpdmVQcm90b3R5cGVUYWJsZS5zZXQobyxsKTtrLmNhbGwoQyh0aGlzKSx0LGQpO3JldHVybiByfSxFKFt3aW5kb3cuSFRNTERvY3VtZW50fHx3aW5kb3cuRG9jdW1lbnRdLFtcInJlZ2lzdGVyRWxlbWVudFwiXSl9RShbd2luZG93LkhUTUxCb2R5RWxlbWVudCx3aW5kb3cuSFRNTERvY3VtZW50fHx3aW5kb3cuRG9jdW1lbnQsd2luZG93LkhUTUxIZWFkRWxlbWVudCx3aW5kb3cuSFRNTEh0bWxFbGVtZW50XSxbXCJhcHBlbmRDaGlsZFwiLFwiY29tcGFyZURvY3VtZW50UG9zaXRpb25cIixcImNvbnRhaW5zXCIsXCJnZXRFbGVtZW50c0J5Q2xhc3NOYW1lXCIsXCJnZXRFbGVtZW50c0J5VGFnTmFtZVwiLFwiZ2V0RWxlbWVudHNCeVRhZ05hbWVOU1wiLFwiaW5zZXJ0QmVmb3JlXCIsXCJxdWVyeVNlbGVjdG9yXCIsXCJxdWVyeVNlbGVjdG9yQWxsXCIsXCJyZW1vdmVDaGlsZFwiLFwicmVwbGFjZUNoaWxkXCJdKSxFKFt3aW5kb3cuSFRNTEJvZHlFbGVtZW50LHdpbmRvdy5IVE1MSGVhZEVsZW1lbnQsd2luZG93LkhUTUxIdG1sRWxlbWVudF0sXyksRShbd2luZG93LkhUTUxEb2N1bWVudHx8d2luZG93LkRvY3VtZW50XSxbXCJhZG9wdE5vZGVcIixcImltcG9ydE5vZGVcIixcImNvbnRhaW5zXCIsXCJjcmVhdGVDb21tZW50XCIsXCJjcmVhdGVEb2N1bWVudEZyYWdtZW50XCIsXCJjcmVhdGVFbGVtZW50XCIsXCJjcmVhdGVFbGVtZW50TlNcIixcImNyZWF0ZUV2ZW50XCIsXCJjcmVhdGVFdmVudE5TXCIsXCJjcmVhdGVSYW5nZVwiLFwiY3JlYXRlVGV4dE5vZGVcIixcImNyZWF0ZVRyZWVXYWxrZXJcIixcImVsZW1lbnRGcm9tUG9pbnRcIixcImdldEVsZW1lbnRCeUlkXCIsXCJnZXRFbGVtZW50c0J5TmFtZVwiLFwiZ2V0U2VsZWN0aW9uXCJdKSxTKHQucHJvdG90eXBlLGwpLFModC5wcm90b3R5cGUsZCksUyh0LnByb3RvdHlwZSxmKSxTKHQucHJvdG90eXBlLHApLFModC5wcm90b3R5cGUse2dldCBpbXBsZW1lbnRhdGlvbigpe3ZhciBlPUguZ2V0KHRoaXMpO3JldHVybiBlP2U6KGU9bmV3IGEoQyh0aGlzKS5pbXBsZW1lbnRhdGlvbiksSC5zZXQodGhpcyxlKSxlKX0sZ2V0IGRlZmF1bHRWaWV3KCl7cmV0dXJuIGooQyh0aGlzKS5kZWZhdWx0Vmlldyl9fSksVCh3aW5kb3cuRG9jdW1lbnQsdCxkb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoXCJcIikpLHdpbmRvdy5IVE1MRG9jdW1lbnQmJlQod2luZG93LkhUTUxEb2N1bWVudCx0KSxEKFt3aW5kb3cuSFRNTEJvZHlFbGVtZW50LHdpbmRvdy5IVE1MRG9jdW1lbnR8fHdpbmRvdy5Eb2N1bWVudCx3aW5kb3cuSFRNTEhlYWRFbGVtZW50XSk7dmFyIEE9ZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlRG9jdW1lbnQ7YS5wcm90b3R5cGUuY3JlYXRlRG9jdW1lbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzWzJdPUMoYXJndW1lbnRzWzJdKSxqKEEuYXBwbHkoTih0aGlzKSxhcmd1bWVudHMpKX0scyhhLFwiY3JlYXRlRG9jdW1lbnRUeXBlXCIpLHMoYSxcImNyZWF0ZUhUTUxEb2N1bWVudFwiKSxjKGEsXCJoYXNGZWF0dXJlXCIpLFQod2luZG93LkRPTUltcGxlbWVudGF0aW9uLGEpLEUoW3dpbmRvdy5ET01JbXBsZW1lbnRhdGlvbl0sW1wiY3JlYXRlRG9jdW1lbnRcIixcImNyZWF0ZURvY3VtZW50VHlwZVwiLFwiY3JlYXRlSFRNTERvY3VtZW50XCIsXCJoYXNGZWF0dXJlXCJdKSxlLmFkb3B0Tm9kZU5vUmVtb3ZlPXIsZS53cmFwcGVycy5ET01JbXBsZW1lbnRhdGlvbj1hLGUud3JhcHBlcnMuRG9jdW1lbnQ9dH0od2luZG93LlNoYWRvd0RPTVBvbHlmaWxsKSxmdW5jdGlvbihlKXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiB0KGUpe24uY2FsbCh0aGlzLGUpfXZhciBuPWUud3JhcHBlcnMuRXZlbnRUYXJnZXQscj1lLndyYXBwZXJzLlNlbGVjdGlvbixvPWUubWl4aW4saT1lLnJlZ2lzdGVyV3JhcHBlcixhPWUucmVuZGVyQWxsUGVuZGluZyxzPWUudW53cmFwLGM9ZS51bndyYXBJZk5lZWRlZCxsPWUud3JhcCx1PXdpbmRvdy5XaW5kb3csZD13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSxwPXdpbmRvdy5nZXREZWZhdWx0Q29tcHV0ZWRTdHlsZSxoPXdpbmRvdy5nZXRTZWxlY3Rpb247dC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShuLnByb3RvdHlwZSksdS5wcm90b3R5cGUuZ2V0Q29tcHV0ZWRTdHlsZT1mdW5jdGlvbihlLHQpe3JldHVybiBsKHRoaXN8fHdpbmRvdykuZ2V0Q29tcHV0ZWRTdHlsZShjKGUpLHQpfSxwJiYodS5wcm90b3R5cGUuZ2V0RGVmYXVsdENvbXB1dGVkU3R5bGU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbCh0aGlzfHx3aW5kb3cpLmdldERlZmF1bHRDb21wdXRlZFN0eWxlKGMoZSksdCl9KSx1LnByb3RvdHlwZS5nZXRTZWxlY3Rpb249ZnVuY3Rpb24oKXtyZXR1cm4gbCh0aGlzfHx3aW5kb3cpLmdldFNlbGVjdGlvbigpfSxkZWxldGUgd2luZG93LmdldENvbXB1dGVkU3R5bGUsZGVsZXRlIHdpbmRvdy5nZXREZWZhdWx0Q29tcHV0ZWRTdHlsZSxkZWxldGUgd2luZG93LmdldFNlbGVjdGlvbixbXCJhZGRFdmVudExpc3RlbmVyXCIsXCJyZW1vdmVFdmVudExpc3RlbmVyXCIsXCJkaXNwYXRjaEV2ZW50XCJdLmZvckVhY2goZnVuY3Rpb24oZSl7dS5wcm90b3R5cGVbZV09ZnVuY3Rpb24oKXt2YXIgdD1sKHRoaXN8fHdpbmRvdyk7cmV0dXJuIHRbZV0uYXBwbHkodCxhcmd1bWVudHMpfSxkZWxldGUgd2luZG93W2VdfSksbyh0LnByb3RvdHlwZSx7Z2V0Q29tcHV0ZWRTdHlsZTpmdW5jdGlvbihlLHQpe3JldHVybiBhKCksZC5jYWxsKHModGhpcyksYyhlKSx0KX0sZ2V0U2VsZWN0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIGEoKSxuZXcgcihoLmNhbGwocyh0aGlzKSkpfSxnZXQgZG9jdW1lbnQoKXtyZXR1cm4gbChzKHRoaXMpLmRvY3VtZW50KX19KSxwJiYodC5wcm90b3R5cGUuZ2V0RGVmYXVsdENvbXB1dGVkU3R5bGU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gYSgpLHAuY2FsbChzKHRoaXMpLGMoZSksdCl9KSxpKHUsdCx3aW5kb3cpLGUud3JhcHBlcnMuV2luZG93PXR9KHdpbmRvdy5TaGFkb3dET01Qb2x5ZmlsbCksZnVuY3Rpb24oZSl7XCJ1c2Ugc3RyaWN0XCI7dmFyIHQ9ZS51bndyYXAsbj13aW5kb3cuRGF0YVRyYW5zZmVyfHx3aW5kb3cuQ2xpcGJvYXJkLHI9bi5wcm90b3R5cGUuc2V0RHJhZ0ltYWdlO3ImJihuLnByb3RvdHlwZS5zZXREcmFnSW1hZ2U9ZnVuY3Rpb24oZSxuLG8pe3IuY2FsbCh0aGlzLHQoZSksbixvKX0pfSh3aW5kb3cuU2hhZG93RE9NUG9seWZpbGwpLGZ1bmN0aW9uKGUpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIHQoZSl7dmFyIHQ7dD1lIGluc3RhbmNlb2YgaT9lOm5ldyBpKGUmJm8oZSkpLHIodCx0aGlzKX12YXIgbj1lLnJlZ2lzdGVyV3JhcHBlcixyPWUuc2V0V3JhcHBlcixvPWUudW53cmFwLGk9d2luZG93LkZvcm1EYXRhO2kmJihuKGksdCxuZXcgaSksZS53cmFwcGVycy5Gb3JtRGF0YT10KX0od2luZG93LlNoYWRvd0RPTVBvbHlmaWxsKSxmdW5jdGlvbihlKXtcInVzZSBzdHJpY3RcIjt2YXIgdD1lLnVud3JhcElmTmVlZGVkLG49WE1MSHR0cFJlcXVlc3QucHJvdG90eXBlLnNlbmQ7WE1MSHR0cFJlcXVlc3QucHJvdG90eXBlLnNlbmQ9ZnVuY3Rpb24oZSl7cmV0dXJuIG4uY2FsbCh0aGlzLHQoZSkpfX0od2luZG93LlNoYWRvd0RPTVBvbHlmaWxsKSxmdW5jdGlvbihlKXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiB0KGUpe3ZhciB0PW5bZV0scj13aW5kb3dbdF07aWYocil7dmFyIG89ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChlKSxpPW8uY29uc3RydWN0b3I7d2luZG93W3RdPWl9fXZhciBuPShlLmlzV3JhcHBlckZvcix7YTpcIkhUTUxBbmNob3JFbGVtZW50XCIsYXJlYTpcIkhUTUxBcmVhRWxlbWVudFwiLGF1ZGlvOlwiSFRNTEF1ZGlvRWxlbWVudFwiLGJhc2U6XCJIVE1MQmFzZUVsZW1lbnRcIixib2R5OlwiSFRNTEJvZHlFbGVtZW50XCIsYnI6XCJIVE1MQlJFbGVtZW50XCIsYnV0dG9uOlwiSFRNTEJ1dHRvbkVsZW1lbnRcIixjYW52YXM6XCJIVE1MQ2FudmFzRWxlbWVudFwiLGNhcHRpb246XCJIVE1MVGFibGVDYXB0aW9uRWxlbWVudFwiLGNvbDpcIkhUTUxUYWJsZUNvbEVsZW1lbnRcIixjb250ZW50OlwiSFRNTENvbnRlbnRFbGVtZW50XCIsZGF0YTpcIkhUTUxEYXRhRWxlbWVudFwiLGRhdGFsaXN0OlwiSFRNTERhdGFMaXN0RWxlbWVudFwiLGRlbDpcIkhUTUxNb2RFbGVtZW50XCIsZGlyOlwiSFRNTERpcmVjdG9yeUVsZW1lbnRcIixkaXY6XCJIVE1MRGl2RWxlbWVudFwiLGRsOlwiSFRNTERMaXN0RWxlbWVudFwiLGVtYmVkOlwiSFRNTEVtYmVkRWxlbWVudFwiLGZpZWxkc2V0OlwiSFRNTEZpZWxkU2V0RWxlbWVudFwiLGZvbnQ6XCJIVE1MRm9udEVsZW1lbnRcIixmb3JtOlwiSFRNTEZvcm1FbGVtZW50XCIsZnJhbWU6XCJIVE1MRnJhbWVFbGVtZW50XCIsZnJhbWVzZXQ6XCJIVE1MRnJhbWVTZXRFbGVtZW50XCIsaDE6XCJIVE1MSGVhZGluZ0VsZW1lbnRcIixoZWFkOlwiSFRNTEhlYWRFbGVtZW50XCIsaHI6XCJIVE1MSFJFbGVtZW50XCIsaHRtbDpcIkhUTUxIdG1sRWxlbWVudFwiLGlmcmFtZTpcIkhUTUxJRnJhbWVFbGVtZW50XCIsaW1nOlwiSFRNTEltYWdlRWxlbWVudFwiLGlucHV0OlwiSFRNTElucHV0RWxlbWVudFwiLGtleWdlbjpcIkhUTUxLZXlnZW5FbGVtZW50XCIsbGFiZWw6XCJIVE1MTGFiZWxFbGVtZW50XCIsbGVnZW5kOlwiSFRNTExlZ2VuZEVsZW1lbnRcIixsaTpcIkhUTUxMSUVsZW1lbnRcIixsaW5rOlwiSFRNTExpbmtFbGVtZW50XCIsbWFwOlwiSFRNTE1hcEVsZW1lbnRcIixtYXJxdWVlOlwiSFRNTE1hcnF1ZWVFbGVtZW50XCIsbWVudTpcIkhUTUxNZW51RWxlbWVudFwiLG1lbnVpdGVtOlwiSFRNTE1lbnVJdGVtRWxlbWVudFwiLG1ldGE6XCJIVE1MTWV0YUVsZW1lbnRcIixtZXRlcjpcIkhUTUxNZXRlckVsZW1lbnRcIixvYmplY3Q6XCJIVE1MT2JqZWN0RWxlbWVudFwiLG9sOlwiSFRNTE9MaXN0RWxlbWVudFwiLG9wdGdyb3VwOlwiSFRNTE9wdEdyb3VwRWxlbWVudFwiLG9wdGlvbjpcIkhUTUxPcHRpb25FbGVtZW50XCIsb3V0cHV0OlwiSFRNTE91dHB1dEVsZW1lbnRcIixwOlwiSFRNTFBhcmFncmFwaEVsZW1lbnRcIixwYXJhbTpcIkhUTUxQYXJhbUVsZW1lbnRcIixwcmU6XCJIVE1MUHJlRWxlbWVudFwiLHByb2dyZXNzOlwiSFRNTFByb2dyZXNzRWxlbWVudFwiLHE6XCJIVE1MUXVvdGVFbGVtZW50XCIsc2NyaXB0OlwiSFRNTFNjcmlwdEVsZW1lbnRcIixzZWxlY3Q6XCJIVE1MU2VsZWN0RWxlbWVudFwiLHNoYWRvdzpcIkhUTUxTaGFkb3dFbGVtZW50XCIsc291cmNlOlwiSFRNTFNvdXJjZUVsZW1lbnRcIixzcGFuOlwiSFRNTFNwYW5FbGVtZW50XCIsc3R5bGU6XCJIVE1MU3R5bGVFbGVtZW50XCIsdGFibGU6XCJIVE1MVGFibGVFbGVtZW50XCIsdGJvZHk6XCJIVE1MVGFibGVTZWN0aW9uRWxlbWVudFwiLHRlbXBsYXRlOlwiSFRNTFRlbXBsYXRlRWxlbWVudFwiLHRleHRhcmVhOlwiSFRNTFRleHRBcmVhRWxlbWVudFwiLHRoZWFkOlwiSFRNTFRhYmxlU2VjdGlvbkVsZW1lbnRcIix0aW1lOlwiSFRNTFRpbWVFbGVtZW50XCIsdGl0bGU6XCJIVE1MVGl0bGVFbGVtZW50XCIsdHI6XCJIVE1MVGFibGVSb3dFbGVtZW50XCIsdHJhY2s6XCJIVE1MVHJhY2tFbGVtZW50XCIsdWw6XCJIVE1MVUxpc3RFbGVtZW50XCIsdmlkZW86XCJIVE1MVmlkZW9FbGVtZW50XCJ9KTtPYmplY3Qua2V5cyhuKS5mb3JFYWNoKHQpLE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGUud3JhcHBlcnMpLmZvckVhY2goZnVuY3Rpb24odCl7d2luZG93W3RdPWUud3JhcHBlcnNbdF19KX0od2luZG93LlNoYWRvd0RPTVBvbHlmaWxsKSxmdW5jdGlvbihlKXtmdW5jdGlvbiB0KGUsdCl7dmFyIG49XCJcIjtyZXR1cm4gQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChlLGZ1bmN0aW9uKGUpe24rPWUudGV4dENvbnRlbnQrXCJcXG5cXG5cIn0pLHR8fChuPW4ucmVwbGFjZShkLFwiXCIpKSxufWZ1bmN0aW9uIG4oZSl7dmFyIHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInN0eWxlXCIpO3JldHVybiB0LnRleHRDb250ZW50PWUsdH1mdW5jdGlvbiByKGUpe3ZhciB0PW4oZSk7ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZCh0KTt2YXIgcj1bXTtpZih0LnNoZWV0KXRyeXtyPXQuc2hlZXQuY3NzUnVsZXN9Y2F0Y2gobyl7fWVsc2UgY29uc29sZS53YXJuKFwic2hlZXQgbm90IGZvdW5kXCIsdCk7cmV0dXJuIHQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0KSxyfWZ1bmN0aW9uIG8oKXtDLmluaXRpYWxpemVkPSEwLGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoQyk7dmFyIGU9Qy5jb250ZW50RG9jdW1lbnQsdD1lLmNyZWF0ZUVsZW1lbnQoXCJiYXNlXCIpO3QuaHJlZj1kb2N1bWVudC5iYXNlVVJJLGUuaGVhZC5hcHBlbmRDaGlsZCh0KX1mdW5jdGlvbiBpKGUpe0MuaW5pdGlhbGl6ZWR8fG8oKSxkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKEMpLGUoQy5jb250ZW50RG9jdW1lbnQpLGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoQyl9ZnVuY3Rpb24gYShlLHQpe2lmKHQpe3ZhciBvO2lmKGUubWF0Y2goXCJAaW1wb3J0XCIpJiZEKXt2YXIgYT1uKGUpO2koZnVuY3Rpb24oZSl7ZS5oZWFkLmFwcGVuZENoaWxkKGEuaW1wbCksbz1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhLnNoZWV0LmNzc1J1bGVzLDApLHQobyl9KX1lbHNlIG89cihlKSx0KG8pfX1mdW5jdGlvbiBzKGUpe2UmJmwoKS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShlKSl9ZnVuY3Rpb24gYyhlLHQpe3ZhciByPW4oZSk7ci5zZXRBdHRyaWJ1dGUodCxcIlwiKSxyLnNldEF0dHJpYnV0ZSh4LFwiXCIpLGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQocil9ZnVuY3Rpb24gbCgpe3JldHVybiBqfHwoaj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3R5bGVcIiksai5zZXRBdHRyaWJ1dGUoeCxcIlwiKSxqW3hdPSEwKSxqfXZhciB1PXtzdHJpY3RTdHlsaW5nOiExLHJlZ2lzdHJ5Ont9LHNoaW1TdHlsaW5nOmZ1bmN0aW9uKGUsbixyKXt2YXIgbz10aGlzLnByZXBhcmVSb290KGUsbixyKSxpPXRoaXMuaXNUeXBlRXh0ZW5zaW9uKHIpLGE9dGhpcy5tYWtlU2NvcGVTZWxlY3RvcihuLGkpLHM9dChvLCEwKTtzPXRoaXMuc2NvcGVDc3NUZXh0KHMsYSksZSYmKGUuc2hpbW1lZFN0eWxlPXMpLHRoaXMuYWRkQ3NzVG9Eb2N1bWVudChzLG4pfSxzaGltU3R5bGU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5zaGltQ3NzVGV4dChlLnRleHRDb250ZW50LHQpfSxzaGltQ3NzVGV4dDpmdW5jdGlvbihlLHQpe3JldHVybiBlPXRoaXMuaW5zZXJ0RGlyZWN0aXZlcyhlKSx0aGlzLnNjb3BlQ3NzVGV4dChlLHQpfSxtYWtlU2NvcGVTZWxlY3RvcjpmdW5jdGlvbihlLHQpe3JldHVybiBlP3Q/XCJbaXM9XCIrZStcIl1cIjplOlwiXCJ9LGlzVHlwZUV4dGVuc2lvbjpmdW5jdGlvbihlKXtyZXR1cm4gZSYmZS5pbmRleE9mKFwiLVwiKTwwfSxwcmVwYXJlUm9vdDpmdW5jdGlvbihlLHQsbil7dmFyIHI9dGhpcy5yZWdpc3RlclJvb3QoZSx0LG4pO3JldHVybiB0aGlzLnJlcGxhY2VUZXh0SW5TdHlsZXMoci5yb290U3R5bGVzLHRoaXMuaW5zZXJ0RGlyZWN0aXZlcyksdGhpcy5yZW1vdmVTdHlsZXMoZSxyLnJvb3RTdHlsZXMpLHRoaXMuc3RyaWN0U3R5bGluZyYmdGhpcy5hcHBseVNjb3BlVG9Db250ZW50KGUsdCksci5zY29wZVN0eWxlc30scmVtb3ZlU3R5bGVzOmZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuLHI9MCxvPXQubGVuZ3RoO28+ciYmKG49dFtyXSk7cisrKW4ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChuKX0scmVnaXN0ZXJSb290OmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10aGlzLnJlZ2lzdHJ5W3RdPXtyb290OmUsbmFtZTp0LGV4dGVuZHNOYW1lOm59LG89dGhpcy5maW5kU3R5bGVzKGUpO3Iucm9vdFN0eWxlcz1vLHIuc2NvcGVTdHlsZXM9ci5yb290U3R5bGVzO3ZhciBpPXRoaXMucmVnaXN0cnlbci5leHRlbmRzTmFtZV07cmV0dXJuIGkmJihyLnNjb3BlU3R5bGVzPWkuc2NvcGVTdHlsZXMuY29uY2F0KHIuc2NvcGVTdHlsZXMpKSxyfSxmaW5kU3R5bGVzOmZ1bmN0aW9uKGUpe2lmKCFlKXJldHVybltdO3ZhciB0PWUucXVlcnlTZWxlY3RvckFsbChcInN0eWxlXCIpO3JldHVybiBBcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwodCxmdW5jdGlvbihlKXtyZXR1cm4hZS5oYXNBdHRyaWJ1dGUoUil9KX0sYXBwbHlTY29wZVRvQ29udGVudDpmdW5jdGlvbihlLHQpe2UmJihBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGUucXVlcnlTZWxlY3RvckFsbChcIipcIiksZnVuY3Rpb24oZSl7ZS5zZXRBdHRyaWJ1dGUodCxcIlwiKX0pLEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZS5xdWVyeVNlbGVjdG9yQWxsKFwidGVtcGxhdGVcIiksZnVuY3Rpb24oZSl7dGhpcy5hcHBseVNjb3BlVG9Db250ZW50KGUuY29udGVudCx0KX0sdGhpcykpfSxpbnNlcnREaXJlY3RpdmVzOmZ1bmN0aW9uKGUpe3JldHVybiBlPXRoaXMuaW5zZXJ0UG9seWZpbGxEaXJlY3RpdmVzSW5Dc3NUZXh0KGUpLHRoaXMuaW5zZXJ0UG9seWZpbGxSdWxlc0luQ3NzVGV4dChlKX0saW5zZXJ0UG9seWZpbGxEaXJlY3RpdmVzSW5Dc3NUZXh0OmZ1bmN0aW9uKGUpe3JldHVybiBlPWUucmVwbGFjZShwLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQuc2xpY2UoMCwtMikrXCJ7XCJ9KSxlLnJlcGxhY2UoaCxmdW5jdGlvbihlLHQpe3JldHVybiB0K1wiIHtcIn0pfSxpbnNlcnRQb2x5ZmlsbFJ1bGVzSW5Dc3NUZXh0OmZ1bmN0aW9uKGUpe3JldHVybiBlPWUucmVwbGFjZShmLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQuc2xpY2UoMCwtMSl9KSxlLnJlcGxhY2UobSxmdW5jdGlvbihlLHQsbixyKXt2YXIgbz1lLnJlcGxhY2UodCxcIlwiKS5yZXBsYWNlKG4sXCJcIik7cmV0dXJuIHIrb30pfSxzY29wZUNzc1RleHQ6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLmV4dHJhY3RVbnNjb3BlZFJ1bGVzRnJvbUNzc1RleHQoZSk7aWYoZT10aGlzLmluc2VydFBvbHlmaWxsSG9zdEluQ3NzVGV4dChlKSxlPXRoaXMuY29udmVydENvbG9uSG9zdChlKSxlPXRoaXMuY29udmVydENvbG9uSG9zdENvbnRleHQoZSksZT10aGlzLmNvbnZlcnRTaGFkb3dET01TZWxlY3RvcnMoZSksdCl7dmFyIGUscj10aGlzO2EoZSxmdW5jdGlvbihuKXtlPXIuc2NvcGVSdWxlcyhuLHQpfSl9cmV0dXJuIGU9ZStcIlxcblwiK24sZS50cmltKCl9LGV4dHJhY3RVbnNjb3BlZFJ1bGVzRnJvbUNzc1RleHQ6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0LG49XCJcIjt0PXcuZXhlYyhlKTspbis9dFsxXS5zbGljZSgwLC0xKStcIlxcblxcblwiO2Zvcig7dD12LmV4ZWMoZSk7KW4rPXRbMF0ucmVwbGFjZSh0WzJdLFwiXCIpLnJlcGxhY2UodFsxXSx0WzNdKStcIlxcblxcblwiO3JldHVybiBufSxjb252ZXJ0Q29sb25Ib3N0OmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmNvbnZlcnRDb2xvblJ1bGUoZSxFLHRoaXMuY29sb25Ib3N0UGFydFJlcGxhY2VyKX0sY29udmVydENvbG9uSG9zdENvbnRleHQ6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuY29udmVydENvbG9uUnVsZShlLF8sdGhpcy5jb2xvbkhvc3RDb250ZXh0UGFydFJlcGxhY2VyKX0sY29udmVydENvbG9uUnVsZTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIGUucmVwbGFjZSh0LGZ1bmN0aW9uKGUsdCxyLG8pe2lmKHQ9TyxyKXtmb3IodmFyIGksYT1yLnNwbGl0KFwiLFwiKSxzPVtdLGM9MCxsPWEubGVuZ3RoO2w+YyYmKGk9YVtjXSk7YysrKWk9aS50cmltKCkscy5wdXNoKG4odCxpLG8pKTtyZXR1cm4gcy5qb2luKFwiLFwiKX1yZXR1cm4gdCtvfSl9LGNvbG9uSG9zdENvbnRleHRQYXJ0UmVwbGFjZXI6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0Lm1hdGNoKGcpP3RoaXMuY29sb25Ib3N0UGFydFJlcGxhY2VyKGUsdCxuKTplK3QrbitcIiwgXCIrdCtcIiBcIitlK259LGNvbG9uSG9zdFBhcnRSZXBsYWNlcjpmdW5jdGlvbihlLHQsbil7cmV0dXJuIGUrdC5yZXBsYWNlKGcsXCJcIikrbn0sY29udmVydFNoYWRvd0RPTVNlbGVjdG9yczpmdW5jdGlvbihlKXtmb3IodmFyIHQ9MDt0PE4ubGVuZ3RoO3QrKyllPWUucmVwbGFjZShOW3RdLFwiIFwiKTtyZXR1cm4gZX0sc2NvcGVSdWxlczpmdW5jdGlvbihlLHQpe3ZhciBuPVwiXCI7cmV0dXJuIGUmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZSxmdW5jdGlvbihlKXtpZihlLnNlbGVjdG9yVGV4dCYmZS5zdHlsZSYmdm9pZCAwIT09ZS5zdHlsZS5jc3NUZXh0KW4rPXRoaXMuc2NvcGVTZWxlY3RvcihlLnNlbGVjdG9yVGV4dCx0LHRoaXMuc3RyaWN0U3R5bGluZykrXCIge1xcblx0XCIsbis9dGhpcy5wcm9wZXJ0aWVzRnJvbVJ1bGUoZSkrXCJcXG59XFxuXFxuXCI7ZWxzZSBpZihlLnR5cGU9PT1DU1NSdWxlLk1FRElBX1JVTEUpbis9XCJAbWVkaWEgXCIrZS5tZWRpYS5tZWRpYVRleHQrXCIge1xcblwiLG4rPXRoaXMuc2NvcGVSdWxlcyhlLmNzc1J1bGVzLHQpLG4rPVwiXFxufVxcblxcblwiO2Vsc2UgdHJ5e2UuY3NzVGV4dCYmKG4rPWUuY3NzVGV4dCtcIlxcblxcblwiKX1jYXRjaChyKXtlLnR5cGU9PT1DU1NSdWxlLktFWUZSQU1FU19SVUxFJiZlLmNzc1J1bGVzJiYobis9dGhpcy5pZVNhZmVDc3NUZXh0RnJvbUtleUZyYW1lUnVsZShlKSl9fSx0aGlzKSxufSxpZVNhZmVDc3NUZXh0RnJvbUtleUZyYW1lUnVsZTpmdW5jdGlvbihlKXt2YXIgdD1cIkBrZXlmcmFtZXMgXCIrZS5uYW1lK1wiIHtcIjtyZXR1cm4gQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChlLmNzc1J1bGVzLGZ1bmN0aW9uKGUpe3QrPVwiIFwiK2Uua2V5VGV4dCtcIiB7XCIrZS5zdHlsZS5jc3NUZXh0K1wifVwifSksdCs9XCIgfVwifSxzY29wZVNlbGVjdG9yOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1bXSxvPWUuc3BsaXQoXCIsXCIpO3JldHVybiBvLmZvckVhY2goZnVuY3Rpb24oZSl7ZT1lLnRyaW0oKSx0aGlzLnNlbGVjdG9yTmVlZHNTY29waW5nKGUsdCkmJihlPW4mJiFlLm1hdGNoKE8pP3RoaXMuYXBwbHlTdHJpY3RTZWxlY3RvclNjb3BlKGUsdCk6dGhpcy5hcHBseVNlbGVjdG9yU2NvcGUoZSx0KSksci5wdXNoKGUpfSx0aGlzKSxyLmpvaW4oXCIsIFwiKX0sc2VsZWN0b3JOZWVkc1Njb3Bpbmc6ZnVuY3Rpb24oZSx0KXtpZihBcnJheS5pc0FycmF5KHQpKXJldHVybiEwO3ZhciBuPXRoaXMubWFrZVNjb3BlTWF0Y2hlcih0KTtyZXR1cm4hZS5tYXRjaChuKX0sbWFrZVNjb3BlTWF0Y2hlcjpmdW5jdGlvbihlKXtyZXR1cm4gZT1lLnJlcGxhY2UoL1xcWy9nLFwiXFxcXFtcIikucmVwbGFjZSgvXFxdL2csXCJcXFxcXVwiKSxuZXcgUmVnRXhwKFwiXihcIitlK1wiKVwiK1MsXCJtXCIpfSxhcHBseVNlbGVjdG9yU2NvcGU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gQXJyYXkuaXNBcnJheSh0KT90aGlzLmFwcGx5U2VsZWN0b3JTY29wZUxpc3QoZSx0KTp0aGlzLmFwcGx5U2ltcGxlU2VsZWN0b3JTY29wZShlLHQpfSxhcHBseVNlbGVjdG9yU2NvcGVMaXN0OmZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuLHI9W10sbz0wO249dFtvXTtvKyspci5wdXNoKHRoaXMuYXBwbHlTaW1wbGVTZWxlY3RvclNjb3BlKGUsbikpO3JldHVybiByLmpvaW4oXCIsIFwiKX0sYXBwbHlTaW1wbGVTZWxlY3RvclNjb3BlOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUubWF0Y2goTCk/KGU9ZS5yZXBsYWNlKE8sdCksZS5yZXBsYWNlKEwsdCtcIiBcIikpOnQrXCIgXCIrZX0sYXBwbHlTdHJpY3RTZWxlY3RvclNjb3BlOmZ1bmN0aW9uKGUsdCl7dD10LnJlcGxhY2UoL1xcW2lzPShbXlxcXV0qKVxcXS9nLFwiJDFcIik7dmFyIG49W1wiIFwiLFwiPlwiLFwiK1wiLFwiflwiXSxyPWUsbz1cIltcIit0K1wiXVwiO3JldHVybiBuLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9ci5zcGxpdChlKTtyPXQubWFwKGZ1bmN0aW9uKGUpe3ZhciB0PWUudHJpbSgpLnJlcGxhY2UoTCxcIlwiKTtyZXR1cm4gdCYmbi5pbmRleE9mKHQpPDAmJnQuaW5kZXhPZihvKTwwJiYoZT10LnJlcGxhY2UoLyhbXjpdKikoOiopKC4qKS8sXCIkMVwiK28rXCIkMiQzXCIpKSxlfSkuam9pbihlKX0pLHJ9LGluc2VydFBvbHlmaWxsSG9zdEluQ3NzVGV4dDpmdW5jdGlvbihlKXtyZXR1cm4gZS5yZXBsYWNlKE0sYikucmVwbGFjZShULGcpfSxwcm9wZXJ0aWVzRnJvbVJ1bGU6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zdHlsZS5jc3NUZXh0O2Uuc3R5bGUuY29udGVudCYmIWUuc3R5bGUuY29udGVudC5tYXRjaCgvWydcIl0rfGF0dHIvKSYmKHQ9dC5yZXBsYWNlKC9jb250ZW50OlteO10qOy9nLFwiY29udGVudDogJ1wiK2Uuc3R5bGUuY29udGVudCtcIic7XCIpKTt2YXIgbj1lLnN0eWxlO2Zvcih2YXIgciBpbiBuKVwiaW5pdGlhbFwiPT09bltyXSYmKHQrPXIrXCI6IGluaXRpYWw7IFwiKTtyZXR1cm4gdH0scmVwbGFjZVRleHRJblN0eWxlczpmdW5jdGlvbihlLHQpe2UmJnQmJihlIGluc3RhbmNlb2YgQXJyYXl8fChlPVtlXSksQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChlLGZ1bmN0aW9uKGUpe2UudGV4dENvbnRlbnQ9dC5jYWxsKHRoaXMsZS50ZXh0Q29udGVudCl9LHRoaXMpKX0sYWRkQ3NzVG9Eb2N1bWVudDpmdW5jdGlvbihlLHQpe2UubWF0Y2goXCJAaW1wb3J0XCIpP2MoZSx0KTpzKGUpfX0sZD0vXFwvXFwqW14qXSpcXCorKFteXFwvKl1bXipdKlxcKispKlxcLy9naW0scD0vXFwvXFwqXFxzKkBwb2x5ZmlsbCAoW14qXSpcXCorKFteXFwvKl1bXipdKlxcKispKlxcLykoW157XSo/KXsvZ2ltLGg9L3BvbHlmaWxsLW5leHQtc2VsZWN0b3JbXn1dKmNvbnRlbnRcXDpbXFxzXSo/WydcIl0oLio/KVsnXCJdWztcXHNdKn0oW157XSo/KXsvZ2ltLGY9L1xcL1xcKlxcc0Bwb2x5ZmlsbC1ydWxlKFteKl0qXFwqKyhbXlxcLypdW14qXSpcXCorKSopXFwvL2dpbSxtPS8ocG9seWZpbGwtcnVsZSlbXn1dKihjb250ZW50XFw6W1xcc10qWydcIl0oLio/KVsnXCJdKVs7XFxzXSpbXn1dKn0vZ2ltLHc9L1xcL1xcKlxcc0Bwb2x5ZmlsbC11bnNjb3BlZC1ydWxlKFteKl0qXFwqKyhbXlxcLypdW14qXSpcXCorKSopXFwvL2dpbSx2PS8ocG9seWZpbGwtdW5zY29wZWQtcnVsZSlbXn1dKihjb250ZW50XFw6W1xcc10qWydcIl0oLio/KVsnXCJdKVs7XFxzXSpbXn1dKn0vZ2ltLGc9XCItc2hhZG93Y3NzaG9zdFwiLGI9XCItc2hhZG93Y3NzY29udGV4dFwiLHk9XCIpKD86XFxcXCgoKD86XFxcXChbXikoXSpcXFxcKXxbXikoXSopKz8pXFxcXCkpPyhbXix7XSopXCIsRT1uZXcgUmVnRXhwKFwiKFwiK2creSxcImdpbVwiKSxfPW5ldyBSZWdFeHAoXCIoXCIrYit5LFwiZ2ltXCIpLFM9XCIoWz5cXFxcc34rWy4sezpdW1xcXFxzXFxcXFNdKik/JFwiLFQ9L1xcOmhvc3QvZ2ltLE09L1xcOmhvc3QtY29udGV4dC9naW0sTz1nK1wiLW5vLWNvbWJpbmF0b3JcIixMPW5ldyBSZWdFeHAoZyxcImdpbVwiKSxOPShuZXcgUmVnRXhwKGIsXCJnaW1cIiksWy8+Pj4vZywvOjpzaGFkb3cvZywvOjpjb250ZW50L2csL1xcL2RlZXBcXC8vZywvXFwvc2hhZG93XFwvL2csL1xcL3NoYWRvdy1kZWVwXFwvL2csL1xcXlxcXi9nLC9cXF4vZ10pLEM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlmcmFtZVwiKTtDLnN0eWxlLmRpc3BsYXk9XCJub25lXCI7dmFyIGosRD1uYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKFwiQ2hyb21lXCIpLEg9XCJzaGltLXNoYWRvd2RvbVwiLHg9XCJzaGltLXNoYWRvd2RvbS1jc3NcIixSPVwibm8tc2hpbVwiO2lmKHdpbmRvdy5TaGFkb3dET01Qb2x5ZmlsbCl7cyhcInN0eWxlIHsgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OyB9XFxuXCIpO3ZhciBJPVNoYWRvd0RPTVBvbHlmaWxsLndyYXAoZG9jdW1lbnQpLFA9SS5xdWVyeVNlbGVjdG9yKFwiaGVhZFwiKTtQLmluc2VydEJlZm9yZShsKCksUC5jaGlsZE5vZGVzWzBdKSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiRE9NQ29udGVudExvYWRlZFwiLGZ1bmN0aW9uKCl7ZS51cmxSZXNvbHZlcjtpZih3aW5kb3cuSFRNTEltcG9ydHMmJiFIVE1MSW1wb3J0cy51c2VOYXRpdmUpe3ZhciB0PVwibGlua1tyZWw9c3R5bGVzaGVldF1bXCIrSCtcIl1cIixuPVwic3R5bGVbXCIrSCtcIl1cIjtIVE1MSW1wb3J0cy5pbXBvcnRlci5kb2N1bWVudFByZWxvYWRTZWxlY3RvcnMrPVwiLFwiK3QsSFRNTEltcG9ydHMuaW1wb3J0ZXIuaW1wb3J0c1ByZWxvYWRTZWxlY3RvcnMrPVwiLFwiK3QsSFRNTEltcG9ydHMucGFyc2VyLmRvY3VtZW50U2VsZWN0b3JzPVtIVE1MSW1wb3J0cy5wYXJzZXIuZG9jdW1lbnRTZWxlY3RvcnMsdCxuXS5qb2luKFwiLFwiKTt2YXIgcj1IVE1MSW1wb3J0cy5wYXJzZXIucGFyc2VHZW5lcmljO0hUTUxJbXBvcnRzLnBhcnNlci5wYXJzZUdlbmVyaWM9ZnVuY3Rpb24oZSl7aWYoIWVbeF0pe3ZhciB0PWUuX19pbXBvcnRFbGVtZW50fHxlO2lmKCF0Lmhhc0F0dHJpYnV0ZShIKSlyZXR1cm4gdm9pZCByLmNhbGwodGhpcyxlKTtlLl9fcmVzb3VyY2UmJih0PWUub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3R5bGVcIiksdC50ZXh0Q29udGVudD1lLl9fcmVzb3VyY2UpLEhUTUxJbXBvcnRzLnBhdGgucmVzb2x2ZVVybHNJblN0eWxlKHQsZS5ocmVmKSx0LnRleHRDb250ZW50PXUuc2hpbVN0eWxlKHQpLHQucmVtb3ZlQXR0cmlidXRlKEgsXCJcIiksdC5zZXRBdHRyaWJ1dGUoeCxcIlwiKSx0W3hdPSEwLHQucGFyZW50Tm9kZSE9PVAmJihlLnBhcmVudE5vZGU9PT1QP1AucmVwbGFjZUNoaWxkKHQsZSk6dGhpcy5hZGRFbGVtZW50VG9Eb2N1bWVudCh0KSksdC5fX2ltcG9ydFBhcnNlZD0hMCx0aGlzLm1hcmtQYXJzaW5nQ29tcGxldGUoZSksdGhpcy5wYXJzZU5leHQoKX19O3ZhciBvPUhUTUxJbXBvcnRzLnBhcnNlci5oYXNSZXNvdXJjZTtIVE1MSW1wb3J0cy5wYXJzZXIuaGFzUmVzb3VyY2U9ZnVuY3Rpb24oZSl7cmV0dXJuXCJsaW5rXCI9PT1lLmxvY2FsTmFtZSYmXCJzdHlsZXNoZWV0XCI9PT1lLnJlbCYmZS5oYXNBdHRyaWJ1dGUoSCk/ZS5fX3Jlc291cmNlOm8uY2FsbCh0aGlzLGUpfX19KX1lLlNoYWRvd0NTUz11fSh3aW5kb3cuV2ViQ29tcG9uZW50cykpLGZ1bmN0aW9uKGUpe3dpbmRvdy5TaGFkb3dET01Qb2x5ZmlsbD8od2luZG93LndyYXA9U2hhZG93RE9NUG9seWZpbGwud3JhcElmTmVlZGVkLHdpbmRvdy51bndyYXA9U2hhZG93RE9NUG9seWZpbGwudW53cmFwSWZOZWVkZWQpOndpbmRvdy53cmFwPXdpbmRvdy51bndyYXA9ZnVuY3Rpb24oZSl7cmV0dXJuIGV9fSh3aW5kb3cuV2ViQ29tcG9uZW50cyksZnVuY3Rpb24oZSl7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gdChlKXtyZXR1cm4gdm9pZCAwIT09cFtlXX1mdW5jdGlvbiBuKCl7cy5jYWxsKHRoaXMpLHRoaXMuX2lzSW52YWxpZD0hMH1mdW5jdGlvbiByKGUpe3JldHVyblwiXCI9PWUmJm4uY2FsbCh0aGlzKSxlLnRvTG93ZXJDYXNlKCl9ZnVuY3Rpb24gbyhlKXt2YXIgdD1lLmNoYXJDb2RlQXQoMCk7cmV0dXJuIHQ+MzImJjEyNz50JiYtMT09WzM0LDM1LDYwLDYyLDYzLDk2XS5pbmRleE9mKHQpP2U6ZW5jb2RlVVJJQ29tcG9uZW50KGUpfWZ1bmN0aW9uIGkoZSl7dmFyIHQ9ZS5jaGFyQ29kZUF0KDApO3JldHVybiB0PjMyJiYxMjc+dCYmLTE9PVszNCwzNSw2MCw2Miw5Nl0uaW5kZXhPZih0KT9lOmVuY29kZVVSSUNvbXBvbmVudChlKX1mdW5jdGlvbiBhKGUsYSxzKXtmdW5jdGlvbiBjKGUpe2IucHVzaChlKX12YXIgbD1hfHxcInNjaGVtZSBzdGFydFwiLHU9MCxkPVwiXCIsdj0hMSxnPSExLGI9W107ZTpmb3IoOyhlW3UtMV0hPWZ8fDA9PXUpJiYhdGhpcy5faXNJbnZhbGlkOyl7dmFyIHk9ZVt1XTtzd2l0Y2gobCl7Y2FzZVwic2NoZW1lIHN0YXJ0XCI6aWYoIXl8fCFtLnRlc3QoeSkpe2lmKGEpe2MoXCJJbnZhbGlkIHNjaGVtZS5cIik7YnJlYWsgZX1kPVwiXCIsbD1cIm5vIHNjaGVtZVwiO2NvbnRpbnVlfWQrPXkudG9Mb3dlckNhc2UoKSxsPVwic2NoZW1lXCI7YnJlYWs7Y2FzZVwic2NoZW1lXCI6aWYoeSYmdy50ZXN0KHkpKWQrPXkudG9Mb3dlckNhc2UoKTtlbHNle2lmKFwiOlwiIT15KXtpZihhKXtpZihmPT15KWJyZWFrIGU7YyhcIkNvZGUgcG9pbnQgbm90IGFsbG93ZWQgaW4gc2NoZW1lOiBcIit5KTticmVhayBlfWQ9XCJcIix1PTAsbD1cIm5vIHNjaGVtZVwiO2NvbnRpbnVlfWlmKHRoaXMuX3NjaGVtZT1kLGQ9XCJcIixhKWJyZWFrIGU7dCh0aGlzLl9zY2hlbWUpJiYodGhpcy5faXNSZWxhdGl2ZT0hMCksbD1cImZpbGVcIj09dGhpcy5fc2NoZW1lP1wicmVsYXRpdmVcIjp0aGlzLl9pc1JlbGF0aXZlJiZzJiZzLl9zY2hlbWU9PXRoaXMuX3NjaGVtZT9cInJlbGF0aXZlIG9yIGF1dGhvcml0eVwiOnRoaXMuX2lzUmVsYXRpdmU/XCJhdXRob3JpdHkgZmlyc3Qgc2xhc2hcIjpcInNjaGVtZSBkYXRhXCJ9YnJlYWs7Y2FzZVwic2NoZW1lIGRhdGFcIjpcIj9cIj09eT8odGhpcy5fcXVlcnk9XCI/XCIsbD1cInF1ZXJ5XCIpOlwiI1wiPT15Pyh0aGlzLl9mcmFnbWVudD1cIiNcIixsPVwiZnJhZ21lbnRcIik6ZiE9eSYmXCJcdFwiIT15JiZcIlxcblwiIT15JiZcIlxcclwiIT15JiYodGhpcy5fc2NoZW1lRGF0YSs9byh5KSk7YnJlYWs7Y2FzZVwibm8gc2NoZW1lXCI6aWYocyYmdChzLl9zY2hlbWUpKXtsPVwicmVsYXRpdmVcIjtjb250aW51ZX1jKFwiTWlzc2luZyBzY2hlbWUuXCIpLG4uY2FsbCh0aGlzKTticmVhaztjYXNlXCJyZWxhdGl2ZSBvciBhdXRob3JpdHlcIjppZihcIi9cIiE9eXx8XCIvXCIhPWVbdSsxXSl7YyhcIkV4cGVjdGVkIC8sIGdvdDogXCIreSksbD1cInJlbGF0aXZlXCI7Y29udGludWV9bD1cImF1dGhvcml0eSBpZ25vcmUgc2xhc2hlc1wiO2JyZWFrO2Nhc2VcInJlbGF0aXZlXCI6aWYodGhpcy5faXNSZWxhdGl2ZT0hMCxcImZpbGVcIiE9dGhpcy5fc2NoZW1lJiYodGhpcy5fc2NoZW1lPXMuX3NjaGVtZSksZj09eSl7dGhpcy5faG9zdD1zLl9ob3N0LHRoaXMuX3BvcnQ9cy5fcG9ydCx0aGlzLl9wYXRoPXMuX3BhdGguc2xpY2UoKSx0aGlzLl9xdWVyeT1zLl9xdWVyeSx0aGlzLl91c2VybmFtZT1zLl91c2VybmFtZSx0aGlzLl9wYXNzd29yZD1zLl9wYXNzd29yZDticmVhayBlfWlmKFwiL1wiPT15fHxcIlxcXFxcIj09eSlcIlxcXFxcIj09eSYmYyhcIlxcXFwgaXMgYW4gaW52YWxpZCBjb2RlIHBvaW50LlwiKSxsPVwicmVsYXRpdmUgc2xhc2hcIjtlbHNlIGlmKFwiP1wiPT15KXRoaXMuX2hvc3Q9cy5faG9zdCx0aGlzLl9wb3J0PXMuX3BvcnQsdGhpcy5fcGF0aD1zLl9wYXRoLnNsaWNlKCksdGhpcy5fcXVlcnk9XCI/XCIsdGhpcy5fdXNlcm5hbWU9cy5fdXNlcm5hbWUsdGhpcy5fcGFzc3dvcmQ9cy5fcGFzc3dvcmQsbD1cInF1ZXJ5XCI7ZWxzZXtpZihcIiNcIiE9eSl7dmFyIEU9ZVt1KzFdLF89ZVt1KzJdOyhcImZpbGVcIiE9dGhpcy5fc2NoZW1lfHwhbS50ZXN0KHkpfHxcIjpcIiE9RSYmXCJ8XCIhPUV8fGYhPV8mJlwiL1wiIT1fJiZcIlxcXFxcIiE9XyYmXCI/XCIhPV8mJlwiI1wiIT1fKSYmKHRoaXMuX2hvc3Q9cy5faG9zdCx0aGlzLl9wb3J0PXMuX3BvcnQsdGhpcy5fdXNlcm5hbWU9cy5fdXNlcm5hbWUsdGhpcy5fcGFzc3dvcmQ9cy5fcGFzc3dvcmQsdGhpcy5fcGF0aD1zLl9wYXRoLnNsaWNlKCksdGhpcy5fcGF0aC5wb3AoKSksbD1cInJlbGF0aXZlIHBhdGhcIjtjb250aW51ZX10aGlzLl9ob3N0PXMuX2hvc3QsdGhpcy5fcG9ydD1zLl9wb3J0LHRoaXMuX3BhdGg9cy5fcGF0aC5zbGljZSgpLHRoaXMuX3F1ZXJ5PXMuX3F1ZXJ5LHRoaXMuX2ZyYWdtZW50PVwiI1wiLHRoaXMuX3VzZXJuYW1lPXMuX3VzZXJuYW1lLHRoaXMuX3Bhc3N3b3JkPXMuX3Bhc3N3b3JkLGw9XCJmcmFnbWVudFwifWJyZWFrO2Nhc2VcInJlbGF0aXZlIHNsYXNoXCI6aWYoXCIvXCIhPXkmJlwiXFxcXFwiIT15KXtcImZpbGVcIiE9dGhpcy5fc2NoZW1lJiYodGhpcy5faG9zdD1zLl9ob3N0LHRoaXMuX3BvcnQ9cy5fcG9ydCx0aGlzLl91c2VybmFtZT1zLl91c2VybmFtZSx0aGlzLl9wYXNzd29yZD1zLl9wYXNzd29yZCksbD1cInJlbGF0aXZlIHBhdGhcIjtjb250aW51ZX1cIlxcXFxcIj09eSYmYyhcIlxcXFwgaXMgYW4gaW52YWxpZCBjb2RlIHBvaW50LlwiKSxsPVwiZmlsZVwiPT10aGlzLl9zY2hlbWU/XCJmaWxlIGhvc3RcIjpcImF1dGhvcml0eSBpZ25vcmUgc2xhc2hlc1wiO2JyZWFrO2Nhc2VcImF1dGhvcml0eSBmaXJzdCBzbGFzaFwiOmlmKFwiL1wiIT15KXtjKFwiRXhwZWN0ZWQgJy8nLCBnb3Q6IFwiK3kpLGw9XCJhdXRob3JpdHkgaWdub3JlIHNsYXNoZXNcIjtjb250aW51ZX1sPVwiYXV0aG9yaXR5IHNlY29uZCBzbGFzaFwiO2JyZWFrO2Nhc2VcImF1dGhvcml0eSBzZWNvbmQgc2xhc2hcIjppZihsPVwiYXV0aG9yaXR5IGlnbm9yZSBzbGFzaGVzXCIsXCIvXCIhPXkpe2MoXCJFeHBlY3RlZCAnLycsIGdvdDogXCIreSk7Y29udGludWV9YnJlYWs7Y2FzZVwiYXV0aG9yaXR5IGlnbm9yZSBzbGFzaGVzXCI6aWYoXCIvXCIhPXkmJlwiXFxcXFwiIT15KXtsPVwiYXV0aG9yaXR5XCI7Y29udGludWV9YyhcIkV4cGVjdGVkIGF1dGhvcml0eSwgZ290OiBcIit5KTticmVhaztjYXNlXCJhdXRob3JpdHlcIjppZihcIkBcIj09eSl7diYmKGMoXCJAIGFscmVhZHkgc2Vlbi5cIiksZCs9XCIlNDBcIiksdj0hMDtmb3IodmFyIFM9MDtTPGQubGVuZ3RoO1MrKyl7dmFyIFQ9ZFtTXTtpZihcIlx0XCIhPVQmJlwiXFxuXCIhPVQmJlwiXFxyXCIhPVQpaWYoXCI6XCIhPVR8fG51bGwhPT10aGlzLl9wYXNzd29yZCl7dmFyIE09byhUKTtudWxsIT09dGhpcy5fcGFzc3dvcmQ/dGhpcy5fcGFzc3dvcmQrPU06dGhpcy5fdXNlcm5hbWUrPU19ZWxzZSB0aGlzLl9wYXNzd29yZD1cIlwiO2Vsc2UgYyhcIkludmFsaWQgd2hpdGVzcGFjZSBpbiBhdXRob3JpdHkuXCIpfWQ9XCJcIn1lbHNle2lmKGY9PXl8fFwiL1wiPT15fHxcIlxcXFxcIj09eXx8XCI/XCI9PXl8fFwiI1wiPT15KXt1LT1kLmxlbmd0aCxkPVwiXCIsbD1cImhvc3RcIjtjb250aW51ZX1kKz15fWJyZWFrO2Nhc2VcImZpbGUgaG9zdFwiOmlmKGY9PXl8fFwiL1wiPT15fHxcIlxcXFxcIj09eXx8XCI/XCI9PXl8fFwiI1wiPT15KXsyIT1kLmxlbmd0aHx8IW0udGVzdChkWzBdKXx8XCI6XCIhPWRbMV0mJlwifFwiIT1kWzFdPzA9PWQubGVuZ3RoP2w9XCJyZWxhdGl2ZSBwYXRoIHN0YXJ0XCI6KHRoaXMuX2hvc3Q9ci5jYWxsKHRoaXMsZCksZD1cIlwiLGw9XCJyZWxhdGl2ZSBwYXRoIHN0YXJ0XCIpOmw9XCJyZWxhdGl2ZSBwYXRoXCI7Y29udGludWV9XCJcdFwiPT15fHxcIlxcblwiPT15fHxcIlxcclwiPT15P2MoXCJJbnZhbGlkIHdoaXRlc3BhY2UgaW4gZmlsZSBob3N0LlwiKTpkKz15O2JyZWFrO2Nhc2VcImhvc3RcIjpjYXNlXCJob3N0bmFtZVwiOmlmKFwiOlwiIT15fHxnKXtpZihmPT15fHxcIi9cIj09eXx8XCJcXFxcXCI9PXl8fFwiP1wiPT15fHxcIiNcIj09eSl7aWYodGhpcy5faG9zdD1yLmNhbGwodGhpcyxkKSxkPVwiXCIsbD1cInJlbGF0aXZlIHBhdGggc3RhcnRcIixhKWJyZWFrIGU7Y29udGludWV9XCJcdFwiIT15JiZcIlxcblwiIT15JiZcIlxcclwiIT15PyhcIltcIj09eT9nPSEwOlwiXVwiPT15JiYoZz0hMSksZCs9eSk6YyhcIkludmFsaWQgY29kZSBwb2ludCBpbiBob3N0L2hvc3RuYW1lOiBcIit5KX1lbHNlIGlmKHRoaXMuX2hvc3Q9ci5jYWxsKHRoaXMsZCksZD1cIlwiLGw9XCJwb3J0XCIsXCJob3N0bmFtZVwiPT1hKWJyZWFrIGU7YnJlYWs7Y2FzZVwicG9ydFwiOmlmKC9bMC05XS8udGVzdCh5KSlkKz15O2Vsc2V7aWYoZj09eXx8XCIvXCI9PXl8fFwiXFxcXFwiPT15fHxcIj9cIj09eXx8XCIjXCI9PXl8fGEpe2lmKFwiXCIhPWQpe3ZhciBPPXBhcnNlSW50KGQsMTApO08hPXBbdGhpcy5fc2NoZW1lXSYmKHRoaXMuX3BvcnQ9TytcIlwiKSxkPVwiXCJ9aWYoYSlicmVhayBlO2w9XCJyZWxhdGl2ZSBwYXRoIHN0YXJ0XCI7Y29udGludWV9XCJcdFwiPT15fHxcIlxcblwiPT15fHxcIlxcclwiPT15P2MoXCJJbnZhbGlkIGNvZGUgcG9pbnQgaW4gcG9ydDogXCIreSk6bi5jYWxsKHRoaXMpfWJyZWFrO2Nhc2VcInJlbGF0aXZlIHBhdGggc3RhcnRcIjppZihcIlxcXFxcIj09eSYmYyhcIidcXFxcJyBub3QgYWxsb3dlZCBpbiBwYXRoLlwiKSxsPVwicmVsYXRpdmUgcGF0aFwiLFwiL1wiIT15JiZcIlxcXFxcIiE9eSljb250aW51ZTticmVhaztjYXNlXCJyZWxhdGl2ZSBwYXRoXCI6aWYoZiE9eSYmXCIvXCIhPXkmJlwiXFxcXFwiIT15JiYoYXx8XCI/XCIhPXkmJlwiI1wiIT15KSlcIlx0XCIhPXkmJlwiXFxuXCIhPXkmJlwiXFxyXCIhPXkmJihkKz1vKHkpKTtlbHNle1wiXFxcXFwiPT15JiZjKFwiXFxcXCBub3QgYWxsb3dlZCBpbiByZWxhdGl2ZSBwYXRoLlwiKTt2YXIgTDsoTD1oW2QudG9Mb3dlckNhc2UoKV0pJiYoZD1MKSxcIi4uXCI9PWQ/KHRoaXMuX3BhdGgucG9wKCksXCIvXCIhPXkmJlwiXFxcXFwiIT15JiZ0aGlzLl9wYXRoLnB1c2goXCJcIikpOlwiLlwiPT1kJiZcIi9cIiE9eSYmXCJcXFxcXCIhPXk/dGhpcy5fcGF0aC5wdXNoKFwiXCIpOlwiLlwiIT1kJiYoXCJmaWxlXCI9PXRoaXMuX3NjaGVtZSYmMD09dGhpcy5fcGF0aC5sZW5ndGgmJjI9PWQubGVuZ3RoJiZtLnRlc3QoZFswXSkmJlwifFwiPT1kWzFdJiYoZD1kWzBdK1wiOlwiKSx0aGlzLl9wYXRoLnB1c2goZCkpLGQ9XCJcIixcIj9cIj09eT8odGhpcy5fcXVlcnk9XCI/XCIsbD1cInF1ZXJ5XCIpOlwiI1wiPT15JiYodGhpcy5fZnJhZ21lbnQ9XCIjXCIsbD1cImZyYWdtZW50XCIpfWJyZWFrO2Nhc2VcInF1ZXJ5XCI6YXx8XCIjXCIhPXk/ZiE9eSYmXCJcdFwiIT15JiZcIlxcblwiIT15JiZcIlxcclwiIT15JiYodGhpcy5fcXVlcnkrPWkoeSkpOih0aGlzLl9mcmFnbWVudD1cIiNcIixsPVwiZnJhZ21lbnRcIik7YnJlYWs7Y2FzZVwiZnJhZ21lbnRcIjpmIT15JiZcIlx0XCIhPXkmJlwiXFxuXCIhPXkmJlwiXFxyXCIhPXkmJih0aGlzLl9mcmFnbWVudCs9eSl9dSsrfX1mdW5jdGlvbiBzKCl7dGhpcy5fc2NoZW1lPVwiXCIsdGhpcy5fc2NoZW1lRGF0YT1cIlwiLHRoaXMuX3VzZXJuYW1lPVwiXCIsdGhpcy5fcGFzc3dvcmQ9bnVsbCx0aGlzLl9ob3N0PVwiXCIsdGhpcy5fcG9ydD1cIlwiLHRoaXMuX3BhdGg9W10sdGhpcy5fcXVlcnk9XCJcIix0aGlzLl9mcmFnbWVudD1cIlwiLHRoaXMuX2lzSW52YWxpZD0hMSx0aGlzLl9pc1JlbGF0aXZlPSExfWZ1bmN0aW9uIGMoZSx0KXt2b2lkIDA9PT10fHx0IGluc3RhbmNlb2YgY3x8KHQ9bmV3IGMoU3RyaW5nKHQpKSksdGhpcy5fdXJsPWUscy5jYWxsKHRoaXMpO3ZhciBuPWUucmVwbGFjZSgvXlsgXFx0XFxyXFxuXFxmXSt8WyBcXHRcXHJcXG5cXGZdKyQvZyxcIlwiKTthLmNhbGwodGhpcyxuLG51bGwsdCl9dmFyIGw9ITE7aWYoIWUuZm9yY2VKVVJMKXRyeXt2YXIgdT1uZXcgVVJMKFwiYlwiLFwiaHR0cDovL2FcIik7dS5wYXRobmFtZT1cImMlMjBkXCIsbD1cImh0dHA6Ly9hL2MlMjBkXCI9PT11LmhyZWZ9Y2F0Y2goZCl7fWlmKCFsKXt2YXIgcD1PYmplY3QuY3JlYXRlKG51bGwpO3AuZnRwPTIxLHAuZmlsZT0wLHAuZ29waGVyPTcwLHAuaHR0cD04MCxwLmh0dHBzPTQ0MyxwLndzPTgwLHAud3NzPTQ0Mzt2YXIgaD1PYmplY3QuY3JlYXRlKG51bGwpO2hbXCIlMmVcIl09XCIuXCIsaFtcIi4lMmVcIl09XCIuLlwiLGhbXCIlMmUuXCJdPVwiLi5cIixoW1wiJTJlJTJlXCJdPVwiLi5cIjt2YXIgZj12b2lkIDAsbT0vW2EtekEtWl0vLHc9L1thLXpBLVowLTlcXCtcXC1cXC5dLztjLnByb3RvdHlwZT17dG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ocmVmfSxnZXQgaHJlZigpe2lmKHRoaXMuX2lzSW52YWxpZClyZXR1cm4gdGhpcy5fdXJsO3ZhciBlPVwiXCI7cmV0dXJuKFwiXCIhPXRoaXMuX3VzZXJuYW1lfHxudWxsIT10aGlzLl9wYXNzd29yZCkmJihlPXRoaXMuX3VzZXJuYW1lKyhudWxsIT10aGlzLl9wYXNzd29yZD9cIjpcIit0aGlzLl9wYXNzd29yZDpcIlwiKStcIkBcIiksdGhpcy5wcm90b2NvbCsodGhpcy5faXNSZWxhdGl2ZT9cIi8vXCIrZSt0aGlzLmhvc3Q6XCJcIikrdGhpcy5wYXRobmFtZSt0aGlzLl9xdWVyeSt0aGlzLl9mcmFnbWVudH0sc2V0IGhyZWYoZSl7cy5jYWxsKHRoaXMpLGEuY2FsbCh0aGlzLGUpfSxnZXQgcHJvdG9jb2woKXtyZXR1cm4gdGhpcy5fc2NoZW1lK1wiOlwifSxzZXQgcHJvdG9jb2woZSl7dGhpcy5faXNJbnZhbGlkfHxhLmNhbGwodGhpcyxlK1wiOlwiLFwic2NoZW1lIHN0YXJ0XCIpfSxnZXQgaG9zdCgpe3JldHVybiB0aGlzLl9pc0ludmFsaWQ/XCJcIjp0aGlzLl9wb3J0P3RoaXMuX2hvc3QrXCI6XCIrdGhpcy5fcG9ydDp0aGlzLl9ob3N0fSxzZXQgaG9zdChlKXshdGhpcy5faXNJbnZhbGlkJiZ0aGlzLl9pc1JlbGF0aXZlJiZhLmNhbGwodGhpcyxlLFwiaG9zdFwiKX0sZ2V0IGhvc3RuYW1lKCl7cmV0dXJuIHRoaXMuX2hvc3R9LHNldCBob3N0bmFtZShlKXshdGhpcy5faXNJbnZhbGlkJiZ0aGlzLl9pc1JlbGF0aXZlJiZhLmNhbGwodGhpcyxlLFwiaG9zdG5hbWVcIil9LGdldCBwb3J0KCl7cmV0dXJuIHRoaXMuX3BvcnR9LHNldCBwb3J0KGUpeyF0aGlzLl9pc0ludmFsaWQmJnRoaXMuX2lzUmVsYXRpdmUmJmEuY2FsbCh0aGlzLGUsXCJwb3J0XCIpfSxnZXQgcGF0aG5hbWUoKXtyZXR1cm4gdGhpcy5faXNJbnZhbGlkP1wiXCI6dGhpcy5faXNSZWxhdGl2ZT9cIi9cIit0aGlzLl9wYXRoLmpvaW4oXCIvXCIpOnRoaXMuX3NjaGVtZURhdGF9LHNldCBwYXRobmFtZShlKXshdGhpcy5faXNJbnZhbGlkJiZ0aGlzLl9pc1JlbGF0aXZlJiYodGhpcy5fcGF0aD1bXSxhLmNhbGwodGhpcyxlLFwicmVsYXRpdmUgcGF0aCBzdGFydFwiKSl9LGdldCBzZWFyY2goKXtyZXR1cm4gdGhpcy5faXNJbnZhbGlkfHwhdGhpcy5fcXVlcnl8fFwiP1wiPT10aGlzLl9xdWVyeT9cIlwiOnRoaXMuX3F1ZXJ5fSxzZXQgc2VhcmNoKGUpeyF0aGlzLl9pc0ludmFsaWQmJnRoaXMuX2lzUmVsYXRpdmUmJih0aGlzLl9xdWVyeT1cIj9cIixcIj9cIj09ZVswXSYmKGU9ZS5zbGljZSgxKSksYS5jYWxsKHRoaXMsZSxcInF1ZXJ5XCIpKX0sZ2V0IGhhc2goKXtyZXR1cm4gdGhpcy5faXNJbnZhbGlkfHwhdGhpcy5fZnJhZ21lbnR8fFwiI1wiPT10aGlzLl9mcmFnbWVudD9cIlwiOnRoaXMuX2ZyYWdtZW50fSxzZXQgaGFzaChlKXt0aGlzLl9pc0ludmFsaWR8fCh0aGlzLl9mcmFnbWVudD1cIiNcIixcIiNcIj09ZVswXSYmKGU9ZS5zbGljZSgxKSksYS5jYWxsKHRoaXMsZSxcImZyYWdtZW50XCIpKX0sZ2V0IG9yaWdpbigpe3ZhciBlO2lmKHRoaXMuX2lzSW52YWxpZHx8IXRoaXMuX3NjaGVtZSlyZXR1cm5cIlwiO3N3aXRjaCh0aGlzLl9zY2hlbWUpe2Nhc2VcImRhdGFcIjpjYXNlXCJmaWxlXCI6Y2FzZVwiamF2YXNjcmlwdFwiOmNhc2VcIm1haWx0b1wiOnJldHVyblwibnVsbFwifXJldHVybiBlPXRoaXMuaG9zdCxlP3RoaXMuX3NjaGVtZStcIjovL1wiK2U6XCJcIn19O3ZhciB2PWUuVVJMO3YmJihjLmNyZWF0ZU9iamVjdFVSTD1mdW5jdGlvbihlKXtyZXR1cm4gdi5jcmVhdGVPYmplY3RVUkwuYXBwbHkodixhcmd1bWVudHMpfSxjLnJldm9rZU9iamVjdFVSTD1mdW5jdGlvbihlKXt2LnJldm9rZU9iamVjdFVSTChlKX0pLGUuVVJMPWN9fShzZWxmKSxmdW5jdGlvbihlKXtmdW5jdGlvbiB0KGUpe3kucHVzaChlKSxifHwoYj0hMCxtKHIpKX1mdW5jdGlvbiBuKGUpe3JldHVybiB3aW5kb3cuU2hhZG93RE9NUG9seWZpbGwmJndpbmRvdy5TaGFkb3dET01Qb2x5ZmlsbC53cmFwSWZOZWVkZWQoZSl8fGV9ZnVuY3Rpb24gcigpe2I9ITE7dmFyIGU9eTt5PVtdLGUuc29ydChmdW5jdGlvbihlLHQpe3JldHVybiBlLnVpZF8tdC51aWRffSk7dmFyIHQ9ITE7ZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciBuPWUudGFrZVJlY29yZHMoKTtvKGUpLG4ubGVuZ3RoJiYoZS5jYWxsYmFja18obixlKSx0PSEwKX0pLHQmJnIoKX1mdW5jdGlvbiBvKGUpe2Uubm9kZXNfLmZvckVhY2goZnVuY3Rpb24odCl7dmFyIG49dy5nZXQodCk7biYmbi5mb3JFYWNoKGZ1bmN0aW9uKHQpe3Qub2JzZXJ2ZXI9PT1lJiZ0LnJlbW92ZVRyYW5zaWVudE9ic2VydmVycygpfSl9KX1mdW5jdGlvbiBpKGUsdCl7Zm9yKHZhciBuPWU7bjtuPW4ucGFyZW50Tm9kZSl7dmFyIHI9dy5nZXQobik7aWYocilmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rKyl7dmFyIGk9cltvXSxhPWkub3B0aW9ucztpZihuPT09ZXx8YS5zdWJ0cmVlKXt2YXIgcz10KGEpO3MmJmkuZW5xdWV1ZShzKX19fX1mdW5jdGlvbiBhKGUpe3RoaXMuY2FsbGJhY2tfPWUsdGhpcy5ub2Rlc189W10sdGhpcy5yZWNvcmRzXz1bXSx0aGlzLnVpZF89KytFfWZ1bmN0aW9uIHMoZSx0KXt0aGlzLnR5cGU9ZSx0aGlzLnRhcmdldD10LHRoaXMuYWRkZWROb2Rlcz1bXSx0aGlzLnJlbW92ZWROb2Rlcz1bXSx0aGlzLnByZXZpb3VzU2libGluZz1udWxsLHRoaXMubmV4dFNpYmxpbmc9bnVsbCx0aGlzLmF0dHJpYnV0ZU5hbWU9bnVsbCx0aGlzLmF0dHJpYnV0ZU5hbWVzcGFjZT1udWxsLHRoaXMub2xkVmFsdWU9bnVsbH1mdW5jdGlvbiBjKGUpe3ZhciB0PW5ldyBzKGUudHlwZSxlLnRhcmdldCk7cmV0dXJuIHQuYWRkZWROb2Rlcz1lLmFkZGVkTm9kZXMuc2xpY2UoKSx0LnJlbW92ZWROb2Rlcz1lLnJlbW92ZWROb2Rlcy5zbGljZSgpLHQucHJldmlvdXNTaWJsaW5nPWUucHJldmlvdXNTaWJsaW5nLHQubmV4dFNpYmxpbmc9ZS5uZXh0U2libGluZyx0LmF0dHJpYnV0ZU5hbWU9ZS5hdHRyaWJ1dGVOYW1lLHQuYXR0cmlidXRlTmFtZXNwYWNlPWUuYXR0cmlidXRlTmFtZXNwYWNlLHQub2xkVmFsdWU9ZS5vbGRWYWx1ZSx0fWZ1bmN0aW9uIGwoZSx0KXtyZXR1cm4gXz1uZXcgcyhlLHQpfWZ1bmN0aW9uIHUoZSl7cmV0dXJuIFM/UzooUz1jKF8pLFMub2xkVmFsdWU9ZSxTKX1mdW5jdGlvbiBkKCl7Xz1TPXZvaWQgMH1mdW5jdGlvbiBwKGUpe3JldHVybiBlPT09U3x8ZT09PV99ZnVuY3Rpb24gaChlLHQpe3JldHVybiBlPT09dD9lOlMmJnAoZSk/UzpudWxsfWZ1bmN0aW9uIGYoZSx0LG4pe3RoaXMub2JzZXJ2ZXI9ZSx0aGlzLnRhcmdldD10LHRoaXMub3B0aW9ucz1uLHRoaXMudHJhbnNpZW50T2JzZXJ2ZWROb2Rlcz1bXX1pZighZS5Kc011dGF0aW9uT2JzZXJ2ZXIpe3ZhciBtLHc9bmV3IFdlYWtNYXA7aWYoL1RyaWRlbnR8RWRnZS8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSltPXNldFRpbWVvdXQ7ZWxzZSBpZih3aW5kb3cuc2V0SW1tZWRpYXRlKW09d2luZG93LnNldEltbWVkaWF0ZTtlbHNle3ZhciB2PVtdLGc9U3RyaW5nKE1hdGgucmFuZG9tKCkpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLGZ1bmN0aW9uKGUpe2lmKGUuZGF0YT09PWcpe3ZhciB0PXY7dj1bXSx0LmZvckVhY2goZnVuY3Rpb24oZSl7ZSgpfSl9fSksbT1mdW5jdGlvbihlKXt2LnB1c2goZSksd2luZG93LnBvc3RNZXNzYWdlKGcsXCIqXCIpfX12YXIgYj0hMSx5PVtdLEU9MDthLnByb3RvdHlwZT17b2JzZXJ2ZTpmdW5jdGlvbihlLHQpe2lmKGU9bihlKSwhdC5jaGlsZExpc3QmJiF0LmF0dHJpYnV0ZXMmJiF0LmNoYXJhY3RlckRhdGF8fHQuYXR0cmlidXRlT2xkVmFsdWUmJiF0LmF0dHJpYnV0ZXN8fHQuYXR0cmlidXRlRmlsdGVyJiZ0LmF0dHJpYnV0ZUZpbHRlci5sZW5ndGgmJiF0LmF0dHJpYnV0ZXN8fHQuY2hhcmFjdGVyRGF0YU9sZFZhbHVlJiYhdC5jaGFyYWN0ZXJEYXRhKXRocm93IG5ldyBTeW50YXhFcnJvcjt2YXIgcj13LmdldChlKTtyfHx3LnNldChlLHI9W10pO2Zvcih2YXIgbyxpPTA7aTxyLmxlbmd0aDtpKyspaWYocltpXS5vYnNlcnZlcj09PXRoaXMpe289cltpXSxvLnJlbW92ZUxpc3RlbmVycygpLG8ub3B0aW9ucz10O2JyZWFrfW98fChvPW5ldyBmKHRoaXMsZSx0KSxyLnB1c2gobyksdGhpcy5ub2Rlc18ucHVzaChlKSksby5hZGRMaXN0ZW5lcnMoKX0sZGlzY29ubmVjdDpmdW5jdGlvbigpe3RoaXMubm9kZXNfLmZvckVhY2goZnVuY3Rpb24oZSl7Zm9yKHZhciB0PXcuZ2V0KGUpLG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIHI9dFtuXTtpZihyLm9ic2VydmVyPT09dGhpcyl7ci5yZW1vdmVMaXN0ZW5lcnMoKSx0LnNwbGljZShuLDEpO2JyZWFrfX19LHRoaXMpLHRoaXMucmVjb3Jkc189W119LHRha2VSZWNvcmRzOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5yZWNvcmRzXztyZXR1cm4gdGhpcy5yZWNvcmRzXz1bXSxlfX07dmFyIF8sUztmLnByb3RvdHlwZT17ZW5xdWV1ZTpmdW5jdGlvbihlKXt2YXIgbj10aGlzLm9ic2VydmVyLnJlY29yZHNfLHI9bi5sZW5ndGg7aWYobi5sZW5ndGg+MCl7dmFyIG89bltyLTFdLGk9aChvLGUpO2lmKGkpcmV0dXJuIHZvaWQobltyLTFdPWkpfWVsc2UgdCh0aGlzLm9ic2VydmVyKTtuW3JdPWV9LGFkZExpc3RlbmVyczpmdW5jdGlvbigpe3RoaXMuYWRkTGlzdGVuZXJzXyh0aGlzLnRhcmdldCl9LGFkZExpc3RlbmVyc186ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5vcHRpb25zO3QuYXR0cmlidXRlcyYmZS5hZGRFdmVudExpc3RlbmVyKFwiRE9NQXR0ck1vZGlmaWVkXCIsdGhpcywhMCksdC5jaGFyYWN0ZXJEYXRhJiZlLmFkZEV2ZW50TGlzdGVuZXIoXCJET01DaGFyYWN0ZXJEYXRhTW9kaWZpZWRcIix0aGlzLCEwKSx0LmNoaWxkTGlzdCYmZS5hZGRFdmVudExpc3RlbmVyKFwiRE9NTm9kZUluc2VydGVkXCIsdGhpcywhMCksKHQuY2hpbGRMaXN0fHx0LnN1YnRyZWUpJiZlLmFkZEV2ZW50TGlzdGVuZXIoXCJET01Ob2RlUmVtb3ZlZFwiLHRoaXMsITApfSxyZW1vdmVMaXN0ZW5lcnM6ZnVuY3Rpb24oKXt0aGlzLnJlbW92ZUxpc3RlbmVyc18odGhpcy50YXJnZXQpfSxyZW1vdmVMaXN0ZW5lcnNfOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMub3B0aW9uczt0LmF0dHJpYnV0ZXMmJmUucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIkRPTUF0dHJNb2RpZmllZFwiLHRoaXMsITApLHQuY2hhcmFjdGVyRGF0YSYmZS5yZW1vdmVFdmVudExpc3RlbmVyKFwiRE9NQ2hhcmFjdGVyRGF0YU1vZGlmaWVkXCIsdGhpcywhMCksdC5jaGlsZExpc3QmJmUucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIkRPTU5vZGVJbnNlcnRlZFwiLHRoaXMsITApLCh0LmNoaWxkTGlzdHx8dC5zdWJ0cmVlKSYmZS5yZW1vdmVFdmVudExpc3RlbmVyKFwiRE9NTm9kZVJlbW92ZWRcIix0aGlzLCEwKX0sYWRkVHJhbnNpZW50T2JzZXJ2ZXI6ZnVuY3Rpb24oZSl7aWYoZSE9PXRoaXMudGFyZ2V0KXt0aGlzLmFkZExpc3RlbmVyc18oZSksdGhpcy50cmFuc2llbnRPYnNlcnZlZE5vZGVzLnB1c2goZSk7dmFyIHQ9dy5nZXQoZSk7dHx8dy5zZXQoZSx0PVtdKSx0LnB1c2godGhpcyl9fSxyZW1vdmVUcmFuc2llbnRPYnNlcnZlcnM6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnRyYW5zaWVudE9ic2VydmVkTm9kZXM7dGhpcy50cmFuc2llbnRPYnNlcnZlZE5vZGVzPVtdLGUuZm9yRWFjaChmdW5jdGlvbihlKXt0aGlzLnJlbW92ZUxpc3RlbmVyc18oZSk7Zm9yKHZhciB0PXcuZ2V0KGUpLG49MDtuPHQubGVuZ3RoO24rKylpZih0W25dPT09dGhpcyl7dC5zcGxpY2UobiwxKTticmVha319LHRoaXMpfSxoYW5kbGVFdmVudDpmdW5jdGlvbihlKXtzd2l0Y2goZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSxlLnR5cGUpe2Nhc2VcIkRPTUF0dHJNb2RpZmllZFwiOnZhciB0PWUuYXR0ck5hbWUsbj1lLnJlbGF0ZWROb2RlLm5hbWVzcGFjZVVSSSxyPWUudGFyZ2V0LG89bmV3IGwoXCJhdHRyaWJ1dGVzXCIscik7by5hdHRyaWJ1dGVOYW1lPXQsby5hdHRyaWJ1dGVOYW1lc3BhY2U9bjt2YXIgYT1lLmF0dHJDaGFuZ2U9PT1NdXRhdGlvbkV2ZW50LkFERElUSU9OP251bGw6ZS5wcmV2VmFsdWU7aShyLGZ1bmN0aW9uKGUpe3JldHVybiFlLmF0dHJpYnV0ZXN8fGUuYXR0cmlidXRlRmlsdGVyJiZlLmF0dHJpYnV0ZUZpbHRlci5sZW5ndGgmJi0xPT09ZS5hdHRyaWJ1dGVGaWx0ZXIuaW5kZXhPZih0KSYmLTE9PT1lLmF0dHJpYnV0ZUZpbHRlci5pbmRleE9mKG4pP3ZvaWQgMDplLmF0dHJpYnV0ZU9sZFZhbHVlP3UoYSk6b30pO2JyZWFrO2Nhc2VcIkRPTUNoYXJhY3RlckRhdGFNb2RpZmllZFwiOnZhciByPWUudGFyZ2V0LG89bChcImNoYXJhY3RlckRhdGFcIixyKSxhPWUucHJldlZhbHVlO2kocixmdW5jdGlvbihlKXtyZXR1cm4gZS5jaGFyYWN0ZXJEYXRhP2UuY2hhcmFjdGVyRGF0YU9sZFZhbHVlP3UoYSk6bzp2b2lkIDB9KTticmVhaztjYXNlXCJET01Ob2RlUmVtb3ZlZFwiOnRoaXMuYWRkVHJhbnNpZW50T2JzZXJ2ZXIoZS50YXJnZXQpO2Nhc2VcIkRPTU5vZGVJbnNlcnRlZFwiOnZhciBzLGMscD1lLnRhcmdldDtcIkRPTU5vZGVJbnNlcnRlZFwiPT09ZS50eXBlPyhzPVtwXSxjPVtdKToocz1bXSxjPVtwXSk7dmFyIGg9cC5wcmV2aW91c1NpYmxpbmcsZj1wLm5leHRTaWJsaW5nLG89bChcImNoaWxkTGlzdFwiLGUudGFyZ2V0LnBhcmVudE5vZGUpO28uYWRkZWROb2Rlcz1zLG8ucmVtb3ZlZE5vZGVzPWMsby5wcmV2aW91c1NpYmxpbmc9aCxvLm5leHRTaWJsaW5nPWYsaShlLnJlbGF0ZWROb2RlLGZ1bmN0aW9uKGUpe3JldHVybiBlLmNoaWxkTGlzdD9vOnZvaWQgMH0pfWQoKX19LGUuSnNNdXRhdGlvbk9ic2VydmVyPWEsZS5NdXRhdGlvbk9ic2VydmVyfHwoZS5NdXRhdGlvbk9ic2VydmVyPWEsYS5faXNQb2x5ZmlsbGVkPSEwKX19KHNlbGYpLGZ1bmN0aW9uKGUpe1widXNlIHN0cmljdFwiO2lmKCF3aW5kb3cucGVyZm9ybWFuY2Upe3ZhciB0PURhdGUubm93KCk7d2luZG93LnBlcmZvcm1hbmNlPXtub3c6ZnVuY3Rpb24oKXtyZXR1cm4gRGF0ZS5ub3coKS10fX19d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZXx8KHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU9ZnVuY3Rpb24oKXt2YXIgZT13aW5kb3cud2Via2l0UmVxdWVzdEFuaW1hdGlvbkZyYW1lfHx3aW5kb3cubW96UmVxdWVzdEFuaW1hdGlvbkZyYW1lO3JldHVybiBlP2Z1bmN0aW9uKHQpe3JldHVybiBlKGZ1bmN0aW9uKCl7dChwZXJmb3JtYW5jZS5ub3coKSl9KX06ZnVuY3Rpb24oZSl7cmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGUsMWUzLzYwKX19KCkpLHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZXx8KHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZT1mdW5jdGlvbigpe3JldHVybiB3aW5kb3cud2Via2l0Q2FuY2VsQW5pbWF0aW9uRnJhbWV8fHdpbmRvdy5tb3pDYW5jZWxBbmltYXRpb25GcmFtZXx8ZnVuY3Rpb24oZSl7Y2xlYXJUaW1lb3V0KGUpfX0oKSk7dmFyIG49ZnVuY3Rpb24oKXt2YXIgZT1kb2N1bWVudC5jcmVhdGVFdmVudChcIkV2ZW50XCIpO3JldHVybiBlLmluaXRFdmVudChcImZvb1wiLCEwLCEwKSxlLnByZXZlbnREZWZhdWx0KCksZS5kZWZhdWx0UHJldmVudGVkfSgpO2lmKCFuKXt2YXIgcj1FdmVudC5wcm90b3R5cGUucHJldmVudERlZmF1bHQ7RXZlbnQucHJvdG90eXBlLnByZXZlbnREZWZhdWx0PWZ1bmN0aW9uKCl7dGhpcy5jYW5jZWxhYmxlJiYoci5jYWxsKHRoaXMpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLFwiZGVmYXVsdFByZXZlbnRlZFwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sY29uZmlndXJhYmxlOiEwfSkpfX12YXIgbz0vVHJpZGVudC8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtpZigoIXdpbmRvdy5DdXN0b21FdmVudHx8byYmXCJmdW5jdGlvblwiIT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50KSYmKHdpbmRvdy5DdXN0b21FdmVudD1mdW5jdGlvbihlLHQpe3Q9dHx8e307dmFyIG49ZG9jdW1lbnQuY3JlYXRlRXZlbnQoXCJDdXN0b21FdmVudFwiKTtyZXR1cm4gbi5pbml0Q3VzdG9tRXZlbnQoZSxCb29sZWFuKHQuYnViYmxlcyksQm9vbGVhbih0LmNhbmNlbGFibGUpLHQuZGV0YWlsKSxufSx3aW5kb3cuQ3VzdG9tRXZlbnQucHJvdG90eXBlPXdpbmRvdy5FdmVudC5wcm90b3R5cGUpLCF3aW5kb3cuRXZlbnR8fG8mJlwiZnVuY3Rpb25cIiE9dHlwZW9mIHdpbmRvdy5FdmVudCl7dmFyIGk9d2luZG93LkV2ZW50O3dpbmRvdy5FdmVudD1mdW5jdGlvbihlLHQpe3Q9dHx8e307dmFyIG49ZG9jdW1lbnQuY3JlYXRlRXZlbnQoXCJFdmVudFwiKTtyZXR1cm4gbi5pbml0RXZlbnQoZSxCb29sZWFuKHQuYnViYmxlcyksQm9vbGVhbih0LmNhbmNlbGFibGUpKSxufSx3aW5kb3cuRXZlbnQucHJvdG90eXBlPWkucHJvdG90eXBlfX0od2luZG93LldlYkNvbXBvbmVudHMpLHdpbmRvdy5IVE1MSW1wb3J0cz13aW5kb3cuSFRNTEltcG9ydHN8fHtmbGFnczp7fX0sZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChlLHQpe3Q9dHx8ZixyKGZ1bmN0aW9uKCl7aShlLHQpfSx0KX1mdW5jdGlvbiBuKGUpe3JldHVyblwiY29tcGxldGVcIj09PWUucmVhZHlTdGF0ZXx8ZS5yZWFkeVN0YXRlPT09dn1mdW5jdGlvbiByKGUsdCl7aWYobih0KSllJiZlKCk7ZWxzZXt2YXIgbz1mdW5jdGlvbigpeyhcImNvbXBsZXRlXCI9PT10LnJlYWR5U3RhdGV8fHQucmVhZHlTdGF0ZT09PXYpJiYodC5yZW1vdmVFdmVudExpc3RlbmVyKGcsbykscihlLHQpKX07dC5hZGRFdmVudExpc3RlbmVyKGcsbyl9fWZ1bmN0aW9uIG8oZSl7ZS50YXJnZXQuX19sb2FkZWQ9ITB9ZnVuY3Rpb24gaShlLHQpe2Z1bmN0aW9uIG4oKXtjPT1sJiZlJiZlKHthbGxJbXBvcnRzOnMsbG9hZGVkSW1wb3J0czp1LGVycm9ySW1wb3J0czpkfSl9ZnVuY3Rpb24gcihlKXtvKGUpLHUucHVzaCh0aGlzKSxcbmMrKyxuKCl9ZnVuY3Rpb24gaShlKXtkLnB1c2godGhpcyksYysrLG4oKX12YXIgcz10LnF1ZXJ5U2VsZWN0b3JBbGwoXCJsaW5rW3JlbD1pbXBvcnRdXCIpLGM9MCxsPXMubGVuZ3RoLHU9W10sZD1bXTtpZihsKWZvcih2YXIgcCxoPTA7bD5oJiYocD1zW2hdKTtoKyspYShwKT8odS5wdXNoKHRoaXMpLGMrKyxuKCkpOihwLmFkZEV2ZW50TGlzdGVuZXIoXCJsb2FkXCIscikscC5hZGRFdmVudExpc3RlbmVyKFwiZXJyb3JcIixpKSk7ZWxzZSBuKCl9ZnVuY3Rpb24gYShlKXtyZXR1cm4gZD9lLl9fbG9hZGVkfHxlW1wiaW1wb3J0XCJdJiZcImxvYWRpbmdcIiE9PWVbXCJpbXBvcnRcIl0ucmVhZHlTdGF0ZTplLl9faW1wb3J0UGFyc2VkfWZ1bmN0aW9uIHMoZSl7Zm9yKHZhciB0LG49MCxyPWUubGVuZ3RoO3I+biYmKHQ9ZVtuXSk7bisrKWModCkmJmwodCl9ZnVuY3Rpb24gYyhlKXtyZXR1cm5cImxpbmtcIj09PWUubG9jYWxOYW1lJiZcImltcG9ydFwiPT09ZS5yZWx9ZnVuY3Rpb24gbChlKXt2YXIgdD1lW1wiaW1wb3J0XCJdO3Q/byh7dGFyZ2V0OmV9KTooZS5hZGRFdmVudExpc3RlbmVyKFwibG9hZFwiLG8pLGUuYWRkRXZlbnRMaXN0ZW5lcihcImVycm9yXCIsbykpfXZhciB1PVwiaW1wb3J0XCIsZD1Cb29sZWFuKHUgaW4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImxpbmtcIikpLHA9Qm9vbGVhbih3aW5kb3cuU2hhZG93RE9NUG9seWZpbGwpLGg9ZnVuY3Rpb24oZSl7cmV0dXJuIHA/d2luZG93LlNoYWRvd0RPTVBvbHlmaWxsLndyYXBJZk5lZWRlZChlKTplfSxmPWgoZG9jdW1lbnQpLG09e2dldDpmdW5jdGlvbigpe3ZhciBlPXdpbmRvdy5IVE1MSW1wb3J0cy5jdXJyZW50U2NyaXB0fHxkb2N1bWVudC5jdXJyZW50U2NyaXB0fHwoXCJjb21wbGV0ZVwiIT09ZG9jdW1lbnQucmVhZHlTdGF0ZT9kb2N1bWVudC5zY3JpcHRzW2RvY3VtZW50LnNjcmlwdHMubGVuZ3RoLTFdOm51bGwpO3JldHVybiBoKGUpfSxjb25maWd1cmFibGU6ITB9O09iamVjdC5kZWZpbmVQcm9wZXJ0eShkb2N1bWVudCxcIl9jdXJyZW50U2NyaXB0XCIsbSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGYsXCJfY3VycmVudFNjcmlwdFwiLG0pO3ZhciB3PS9UcmlkZW50Ly50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpLHY9dz9cImNvbXBsZXRlXCI6XCJpbnRlcmFjdGl2ZVwiLGc9XCJyZWFkeXN0YXRlY2hhbmdlXCI7ZCYmKG5ldyBNdXRhdGlvbk9ic2VydmVyKGZ1bmN0aW9uKGUpe2Zvcih2YXIgdCxuPTAscj1lLmxlbmd0aDtyPm4mJih0PWVbbl0pO24rKyl0LmFkZGVkTm9kZXMmJnModC5hZGRlZE5vZGVzKX0pLm9ic2VydmUoZG9jdW1lbnQuaGVhZCx7Y2hpbGRMaXN0OiEwfSksZnVuY3Rpb24oKXtpZihcImxvYWRpbmdcIj09PWRvY3VtZW50LnJlYWR5U3RhdGUpZm9yKHZhciBlLHQ9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcImxpbmtbcmVsPWltcG9ydF1cIiksbj0wLHI9dC5sZW5ndGg7cj5uJiYoZT10W25dKTtuKyspbChlKX0oKSksdChmdW5jdGlvbihlKXt3aW5kb3cuSFRNTEltcG9ydHMucmVhZHk9ITAsd2luZG93LkhUTUxJbXBvcnRzLnJlYWR5VGltZT0obmV3IERhdGUpLmdldFRpbWUoKTt2YXIgdD1mLmNyZWF0ZUV2ZW50KFwiQ3VzdG9tRXZlbnRcIik7dC5pbml0Q3VzdG9tRXZlbnQoXCJIVE1MSW1wb3J0c0xvYWRlZFwiLCEwLCEwLGUpLGYuZGlzcGF0Y2hFdmVudCh0KX0pLGUuSU1QT1JUX0xJTktfVFlQRT11LGUudXNlTmF0aXZlPWQsZS5yb290RG9jdW1lbnQ9ZixlLndoZW5SZWFkeT10LGUuaXNJRT13fSh3aW5kb3cuSFRNTEltcG9ydHMpLGZ1bmN0aW9uKGUpe3ZhciB0PVtdLG49ZnVuY3Rpb24oZSl7dC5wdXNoKGUpfSxyPWZ1bmN0aW9uKCl7dC5mb3JFYWNoKGZ1bmN0aW9uKHQpe3QoZSl9KX07ZS5hZGRNb2R1bGU9bixlLmluaXRpYWxpemVNb2R1bGVzPXJ9KHdpbmRvdy5IVE1MSW1wb3J0cyksd2luZG93LkhUTUxJbXBvcnRzLmFkZE1vZHVsZShmdW5jdGlvbihlKXt2YXIgdD0vKHVybFxcKCkoW14pXSopKFxcKSkvZyxuPS8oQGltcG9ydFtcXHNdKyg/IXVybFxcKCkpKFteO10qKSg7KS9nLHI9e3Jlc29sdmVVcmxzSW5TdHlsZTpmdW5jdGlvbihlLHQpe3ZhciBuPWUub3duZXJEb2N1bWVudCxyPW4uY3JlYXRlRWxlbWVudChcImFcIik7cmV0dXJuIGUudGV4dENvbnRlbnQ9dGhpcy5yZXNvbHZlVXJsc0luQ3NzVGV4dChlLnRleHRDb250ZW50LHQsciksZX0scmVzb2x2ZVVybHNJbkNzc1RleHQ6ZnVuY3Rpb24oZSxyLG8pe3ZhciBpPXRoaXMucmVwbGFjZVVybHMoZSxvLHIsdCk7cmV0dXJuIGk9dGhpcy5yZXBsYWNlVXJscyhpLG8scixuKX0scmVwbGFjZVVybHM6ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIGUucmVwbGFjZShyLGZ1bmN0aW9uKGUscixvLGkpe3ZhciBhPW8ucmVwbGFjZSgvW1wiJ10vZyxcIlwiKTtyZXR1cm4gbiYmKGE9bmV3IFVSTChhLG4pLmhyZWYpLHQuaHJlZj1hLGE9dC5ocmVmLHIrXCInXCIrYStcIidcIitpfSl9fTtlLnBhdGg9cn0pLHdpbmRvdy5IVE1MSW1wb3J0cy5hZGRNb2R1bGUoZnVuY3Rpb24oZSl7dmFyIHQ9e2FzeW5jOiEwLG9rOmZ1bmN0aW9uKGUpe3JldHVybiBlLnN0YXR1cz49MjAwJiZlLnN0YXR1czwzMDB8fDMwND09PWUuc3RhdHVzfHwwPT09ZS5zdGF0dXN9LGxvYWQ6ZnVuY3Rpb24obixyLG8pe3ZhciBpPW5ldyBYTUxIdHRwUmVxdWVzdDtyZXR1cm4oZS5mbGFncy5kZWJ1Z3x8ZS5mbGFncy5idXN0KSYmKG4rPVwiP1wiK01hdGgucmFuZG9tKCkpLGkub3BlbihcIkdFVFwiLG4sdC5hc3luYyksaS5hZGRFdmVudExpc3RlbmVyKFwicmVhZHlzdGF0ZWNoYW5nZVwiLGZ1bmN0aW9uKGUpe2lmKDQ9PT1pLnJlYWR5U3RhdGUpe3ZhciBuPW51bGw7dHJ5e3ZhciBhPWkuZ2V0UmVzcG9uc2VIZWFkZXIoXCJMb2NhdGlvblwiKTthJiYobj1cIi9cIj09PWEuc3Vic3RyKDAsMSk/bG9jYXRpb24ub3JpZ2luK2E6YSl9Y2F0Y2goZSl7Y29uc29sZS5lcnJvcihlLm1lc3NhZ2UpfXIuY2FsbChvLCF0Lm9rKGkpJiZpLGkucmVzcG9uc2V8fGkucmVzcG9uc2VUZXh0LG4pfX0pLGkuc2VuZCgpLGl9LGxvYWREb2N1bWVudDpmdW5jdGlvbihlLHQsbil7dGhpcy5sb2FkKGUsdCxuKS5yZXNwb25zZVR5cGU9XCJkb2N1bWVudFwifX07ZS54aHI9dH0pLHdpbmRvdy5IVE1MSW1wb3J0cy5hZGRNb2R1bGUoZnVuY3Rpb24oZSl7dmFyIHQ9ZS54aHIsbj1lLmZsYWdzLHI9ZnVuY3Rpb24oZSx0KXt0aGlzLmNhY2hlPXt9LHRoaXMub25sb2FkPWUsdGhpcy5vbmNvbXBsZXRlPXQsdGhpcy5pbmZsaWdodD0wLHRoaXMucGVuZGluZz17fX07ci5wcm90b3R5cGU9e2FkZE5vZGVzOmZ1bmN0aW9uKGUpe3RoaXMuaW5mbGlnaHQrPWUubGVuZ3RoO2Zvcih2YXIgdCxuPTAscj1lLmxlbmd0aDtyPm4mJih0PWVbbl0pO24rKyl0aGlzLnJlcXVpcmUodCk7dGhpcy5jaGVja0RvbmUoKX0sYWRkTm9kZTpmdW5jdGlvbihlKXt0aGlzLmluZmxpZ2h0KyssdGhpcy5yZXF1aXJlKGUpLHRoaXMuY2hlY2tEb25lKCl9LHJlcXVpcmU6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zcmN8fGUuaHJlZjtlLl9fbm9kZVVybD10LHRoaXMuZGVkdXBlKHQsZSl8fHRoaXMuZmV0Y2godCxlKX0sZGVkdXBlOmZ1bmN0aW9uKGUsdCl7aWYodGhpcy5wZW5kaW5nW2VdKXJldHVybiB0aGlzLnBlbmRpbmdbZV0ucHVzaCh0KSwhMDtyZXR1cm4gdGhpcy5jYWNoZVtlXT8odGhpcy5vbmxvYWQoZSx0LHRoaXMuY2FjaGVbZV0pLHRoaXMudGFpbCgpLCEwKToodGhpcy5wZW5kaW5nW2VdPVt0XSwhMSl9LGZldGNoOmZ1bmN0aW9uKGUscil7aWYobi5sb2FkJiZjb25zb2xlLmxvZyhcImZldGNoXCIsZSxyKSxlKWlmKGUubWF0Y2goL15kYXRhOi8pKXt2YXIgbz1lLnNwbGl0KFwiLFwiKSxpPW9bMF0sYT1vWzFdO2E9aS5pbmRleE9mKFwiO2Jhc2U2NFwiKT4tMT9hdG9iKGEpOmRlY29kZVVSSUNvbXBvbmVudChhKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yZWNlaXZlKGUscixudWxsLGEpfS5iaW5kKHRoaXMpLDApfWVsc2V7dmFyIHM9ZnVuY3Rpb24odCxuLG8pe3RoaXMucmVjZWl2ZShlLHIsdCxuLG8pfS5iaW5kKHRoaXMpO3QubG9hZChlLHMpfWVsc2Ugc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmVjZWl2ZShlLHIse2Vycm9yOlwiaHJlZiBtdXN0IGJlIHNwZWNpZmllZFwifSxudWxsKX0uYmluZCh0aGlzKSwwKX0scmVjZWl2ZTpmdW5jdGlvbihlLHQsbixyLG8pe3RoaXMuY2FjaGVbZV09cjtmb3IodmFyIGksYT10aGlzLnBlbmRpbmdbZV0scz0wLGM9YS5sZW5ndGg7Yz5zJiYoaT1hW3NdKTtzKyspdGhpcy5vbmxvYWQoZSxpLHIsbixvKSx0aGlzLnRhaWwoKTt0aGlzLnBlbmRpbmdbZV09bnVsbH0sdGFpbDpmdW5jdGlvbigpey0tdGhpcy5pbmZsaWdodCx0aGlzLmNoZWNrRG9uZSgpfSxjaGVja0RvbmU6ZnVuY3Rpb24oKXt0aGlzLmluZmxpZ2h0fHx0aGlzLm9uY29tcGxldGUoKX19LGUuTG9hZGVyPXJ9KSx3aW5kb3cuSFRNTEltcG9ydHMuYWRkTW9kdWxlKGZ1bmN0aW9uKGUpe3ZhciB0PWZ1bmN0aW9uKGUpe3RoaXMuYWRkQ2FsbGJhY2s9ZSx0aGlzLm1vPW5ldyBNdXRhdGlvbk9ic2VydmVyKHRoaXMuaGFuZGxlci5iaW5kKHRoaXMpKX07dC5wcm90b3R5cGU9e2hhbmRsZXI6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0LG49MCxyPWUubGVuZ3RoO3I+biYmKHQ9ZVtuXSk7bisrKVwiY2hpbGRMaXN0XCI9PT10LnR5cGUmJnQuYWRkZWROb2Rlcy5sZW5ndGgmJnRoaXMuYWRkZWROb2Rlcyh0LmFkZGVkTm9kZXMpfSxhZGRlZE5vZGVzOmZ1bmN0aW9uKGUpe3RoaXMuYWRkQ2FsbGJhY2smJnRoaXMuYWRkQ2FsbGJhY2soZSk7Zm9yKHZhciB0LG49MCxyPWUubGVuZ3RoO3I+biYmKHQ9ZVtuXSk7bisrKXQuY2hpbGRyZW4mJnQuY2hpbGRyZW4ubGVuZ3RoJiZ0aGlzLmFkZGVkTm9kZXModC5jaGlsZHJlbil9LG9ic2VydmU6ZnVuY3Rpb24oZSl7dGhpcy5tby5vYnNlcnZlKGUse2NoaWxkTGlzdDohMCxzdWJ0cmVlOiEwfSl9fSxlLk9ic2VydmVyPXR9KSx3aW5kb3cuSFRNTEltcG9ydHMuYWRkTW9kdWxlKGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoZSl7cmV0dXJuXCJsaW5rXCI9PT1lLmxvY2FsTmFtZSYmZS5yZWw9PT11fWZ1bmN0aW9uIG4oZSl7dmFyIHQ9cihlKTtyZXR1cm5cImRhdGE6dGV4dC9qYXZhc2NyaXB0O2NoYXJzZXQ9dXRmLTgsXCIrZW5jb2RlVVJJQ29tcG9uZW50KHQpfWZ1bmN0aW9uIHIoZSl7cmV0dXJuIGUudGV4dENvbnRlbnQrbyhlKX1mdW5jdGlvbiBvKGUpe3ZhciB0PWUub3duZXJEb2N1bWVudDt0Ll9faW1wb3J0ZWRTY3JpcHRzPXQuX19pbXBvcnRlZFNjcmlwdHN8fDA7dmFyIG49ZS5vd25lckRvY3VtZW50LmJhc2VVUkkscj10Ll9faW1wb3J0ZWRTY3JpcHRzP1wiLVwiK3QuX19pbXBvcnRlZFNjcmlwdHM6XCJcIjtyZXR1cm4gdC5fX2ltcG9ydGVkU2NyaXB0cysrLFwiXFxuLy8jIHNvdXJjZVVSTD1cIituK3IrXCIuanNcXG5cIn1mdW5jdGlvbiBpKGUpe3ZhciB0PWUub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3R5bGVcIik7cmV0dXJuIHQudGV4dENvbnRlbnQ9ZS50ZXh0Q29udGVudCxhLnJlc29sdmVVcmxzSW5TdHlsZSh0KSx0fXZhciBhPWUucGF0aCxzPWUucm9vdERvY3VtZW50LGM9ZS5mbGFncyxsPWUuaXNJRSx1PWUuSU1QT1JUX0xJTktfVFlQRSxkPVwibGlua1tyZWw9XCIrdStcIl1cIixwPXtkb2N1bWVudFNlbGVjdG9yczpkLGltcG9ydHNTZWxlY3RvcnM6W2QsXCJsaW5rW3JlbD1zdHlsZXNoZWV0XTpub3QoW3R5cGVdKVwiLFwic3R5bGU6bm90KFt0eXBlXSlcIixcInNjcmlwdDpub3QoW3R5cGVdKVwiLCdzY3JpcHRbdHlwZT1cImFwcGxpY2F0aW9uL2phdmFzY3JpcHRcIl0nLCdzY3JpcHRbdHlwZT1cInRleHQvamF2YXNjcmlwdFwiXSddLmpvaW4oXCIsXCIpLG1hcDp7bGluazpcInBhcnNlTGlua1wiLHNjcmlwdDpcInBhcnNlU2NyaXB0XCIsc3R5bGU6XCJwYXJzZVN0eWxlXCJ9LGR5bmFtaWNFbGVtZW50czpbXSxwYXJzZU5leHQ6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLm5leHRUb1BhcnNlKCk7ZSYmdGhpcy5wYXJzZShlKX0scGFyc2U6ZnVuY3Rpb24oZSl7aWYodGhpcy5pc1BhcnNlZChlKSlyZXR1cm4gdm9pZChjLnBhcnNlJiZjb25zb2xlLmxvZyhcIlslc10gaXMgYWxyZWFkeSBwYXJzZWRcIixlLmxvY2FsTmFtZSkpO3ZhciB0PXRoaXNbdGhpcy5tYXBbZS5sb2NhbE5hbWVdXTt0JiYodGhpcy5tYXJrUGFyc2luZyhlKSx0LmNhbGwodGhpcyxlKSl9LHBhcnNlRHluYW1pYzpmdW5jdGlvbihlLHQpe3RoaXMuZHluYW1pY0VsZW1lbnRzLnB1c2goZSksdHx8dGhpcy5wYXJzZU5leHQoKX0sbWFya1BhcnNpbmc6ZnVuY3Rpb24oZSl7Yy5wYXJzZSYmY29uc29sZS5sb2coXCJwYXJzaW5nXCIsZSksdGhpcy5wYXJzaW5nRWxlbWVudD1lfSxtYXJrUGFyc2luZ0NvbXBsZXRlOmZ1bmN0aW9uKGUpe2UuX19pbXBvcnRQYXJzZWQ9ITAsdGhpcy5tYXJrRHluYW1pY1BhcnNpbmdDb21wbGV0ZShlKSxlLl9faW1wb3J0RWxlbWVudCYmKGUuX19pbXBvcnRFbGVtZW50Ll9faW1wb3J0UGFyc2VkPSEwLHRoaXMubWFya0R5bmFtaWNQYXJzaW5nQ29tcGxldGUoZS5fX2ltcG9ydEVsZW1lbnQpKSx0aGlzLnBhcnNpbmdFbGVtZW50PW51bGwsYy5wYXJzZSYmY29uc29sZS5sb2coXCJjb21wbGV0ZWRcIixlKX0sbWFya0R5bmFtaWNQYXJzaW5nQ29tcGxldGU6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5keW5hbWljRWxlbWVudHMuaW5kZXhPZihlKTt0Pj0wJiZ0aGlzLmR5bmFtaWNFbGVtZW50cy5zcGxpY2UodCwxKX0scGFyc2VJbXBvcnQ6ZnVuY3Rpb24oZSl7aWYoZVtcImltcG9ydFwiXT1lLl9fZG9jLHdpbmRvdy5IVE1MSW1wb3J0cy5fX2ltcG9ydHNQYXJzaW5nSG9vayYmd2luZG93LkhUTUxJbXBvcnRzLl9faW1wb3J0c1BhcnNpbmdIb29rKGUpLGVbXCJpbXBvcnRcIl0mJihlW1wiaW1wb3J0XCJdLl9faW1wb3J0UGFyc2VkPSEwKSx0aGlzLm1hcmtQYXJzaW5nQ29tcGxldGUoZSksZS5fX3Jlc291cmNlJiYhZS5fX2Vycm9yP2UuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoXCJsb2FkXCIse2J1YmJsZXM6ITF9KSk6ZS5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudChcImVycm9yXCIse2J1YmJsZXM6ITF9KSksZS5fX3BlbmRpbmcpZm9yKHZhciB0O2UuX19wZW5kaW5nLmxlbmd0aDspdD1lLl9fcGVuZGluZy5zaGlmdCgpLHQmJnQoe3RhcmdldDplfSk7dGhpcy5wYXJzZU5leHQoKX0scGFyc2VMaW5rOmZ1bmN0aW9uKGUpe3QoZSk/dGhpcy5wYXJzZUltcG9ydChlKTooZS5ocmVmPWUuaHJlZix0aGlzLnBhcnNlR2VuZXJpYyhlKSl9LHBhcnNlU3R5bGU6ZnVuY3Rpb24oZSl7dmFyIHQ9ZTtlPWkoZSksdC5fX2FwcGxpZWRFbGVtZW50PWUsZS5fX2ltcG9ydEVsZW1lbnQ9dCx0aGlzLnBhcnNlR2VuZXJpYyhlKX0scGFyc2VHZW5lcmljOmZ1bmN0aW9uKGUpe3RoaXMudHJhY2tFbGVtZW50KGUpLHRoaXMuYWRkRWxlbWVudFRvRG9jdW1lbnQoZSl9LHJvb3RJbXBvcnRGb3JFbGVtZW50OmZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1lO3Qub3duZXJEb2N1bWVudC5fX2ltcG9ydExpbms7KXQ9dC5vd25lckRvY3VtZW50Ll9faW1wb3J0TGluaztyZXR1cm4gdH0sYWRkRWxlbWVudFRvRG9jdW1lbnQ6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5yb290SW1wb3J0Rm9yRWxlbWVudChlLl9faW1wb3J0RWxlbWVudHx8ZSk7dC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShlLHQpfSx0cmFja0VsZW1lbnQ6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLHI9ZnVuY3Rpb24obyl7ZS5yZW1vdmVFdmVudExpc3RlbmVyKFwibG9hZFwiLHIpLGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImVycm9yXCIsciksdCYmdChvKSxuLm1hcmtQYXJzaW5nQ29tcGxldGUoZSksbi5wYXJzZU5leHQoKX07aWYoZS5hZGRFdmVudExpc3RlbmVyKFwibG9hZFwiLHIpLGUuYWRkRXZlbnRMaXN0ZW5lcihcImVycm9yXCIsciksbCYmXCJzdHlsZVwiPT09ZS5sb2NhbE5hbWUpe3ZhciBvPSExO2lmKC0xPT1lLnRleHRDb250ZW50LmluZGV4T2YoXCJAaW1wb3J0XCIpKW89ITA7ZWxzZSBpZihlLnNoZWV0KXtvPSEwO2Zvcih2YXIgaSxhPWUuc2hlZXQuY3NzUnVsZXMscz1hP2EubGVuZ3RoOjAsYz0wO3M+YyYmKGk9YVtjXSk7YysrKWkudHlwZT09PUNTU1J1bGUuSU1QT1JUX1JVTEUmJihvPW8mJkJvb2xlYW4oaS5zdHlsZVNoZWV0KSl9byYmc2V0VGltZW91dChmdW5jdGlvbigpe2UuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoXCJsb2FkXCIse2J1YmJsZXM6ITF9KSl9KX19LHBhcnNlU2NyaXB0OmZ1bmN0aW9uKHQpe3ZhciByPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzY3JpcHRcIik7ci5fX2ltcG9ydEVsZW1lbnQ9dCxyLnNyYz10LnNyYz90LnNyYzpuKHQpLGUuY3VycmVudFNjcmlwdD10LHRoaXMudHJhY2tFbGVtZW50KHIsZnVuY3Rpb24odCl7ci5wYXJlbnROb2RlJiZyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQociksZS5jdXJyZW50U2NyaXB0PW51bGx9KSx0aGlzLmFkZEVsZW1lbnRUb0RvY3VtZW50KHIpfSxuZXh0VG9QYXJzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9tYXlQYXJzZT1bXSwhdGhpcy5wYXJzaW5nRWxlbWVudCYmKHRoaXMubmV4dFRvUGFyc2VJbkRvYyhzKXx8dGhpcy5uZXh0VG9QYXJzZUR5bmFtaWMoKSl9LG5leHRUb1BhcnNlSW5Eb2M6ZnVuY3Rpb24oZSxuKXtpZihlJiZ0aGlzLl9tYXlQYXJzZS5pbmRleE9mKGUpPDApe3RoaXMuX21heVBhcnNlLnB1c2goZSk7Zm9yKHZhciByLG89ZS5xdWVyeVNlbGVjdG9yQWxsKHRoaXMucGFyc2VTZWxlY3RvcnNGb3JOb2RlKGUpKSxpPTAsYT1vLmxlbmd0aDthPmkmJihyPW9baV0pO2krKylpZighdGhpcy5pc1BhcnNlZChyKSlyZXR1cm4gdGhpcy5oYXNSZXNvdXJjZShyKT90KHIpP3RoaXMubmV4dFRvUGFyc2VJbkRvYyhyLl9fZG9jLHIpOnI6dm9pZCAwfXJldHVybiBufSxuZXh0VG9QYXJzZUR5bmFtaWM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5keW5hbWljRWxlbWVudHNbMF19LHBhcnNlU2VsZWN0b3JzRm9yTm9kZTpmdW5jdGlvbihlKXt2YXIgdD1lLm93bmVyRG9jdW1lbnR8fGU7cmV0dXJuIHQ9PT1zP3RoaXMuZG9jdW1lbnRTZWxlY3RvcnM6dGhpcy5pbXBvcnRzU2VsZWN0b3JzfSxpc1BhcnNlZDpmdW5jdGlvbihlKXtyZXR1cm4gZS5fX2ltcG9ydFBhcnNlZH0sbmVlZHNEeW5hbWljUGFyc2luZzpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5keW5hbWljRWxlbWVudHMuaW5kZXhPZihlKT49MH0saGFzUmVzb3VyY2U6ZnVuY3Rpb24oZSl7cmV0dXJuIHQoZSkmJnZvaWQgMD09PWUuX19kb2M/ITE6ITB9fTtlLnBhcnNlcj1wLGUuSU1QT1JUX1NFTEVDVE9SPWR9KSx3aW5kb3cuSFRNTEltcG9ydHMuYWRkTW9kdWxlKGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoZSl7cmV0dXJuIG4oZSxhKX1mdW5jdGlvbiBuKGUsdCl7cmV0dXJuXCJsaW5rXCI9PT1lLmxvY2FsTmFtZSYmZS5nZXRBdHRyaWJ1dGUoXCJyZWxcIik9PT10fWZ1bmN0aW9uIHIoZSl7cmV0dXJuISFPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsXCJiYXNlVVJJXCIpfWZ1bmN0aW9uIG8oZSx0KXt2YXIgbj1kb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoYSk7bi5fVVJMPXQ7dmFyIG89bi5jcmVhdGVFbGVtZW50KFwiYmFzZVwiKTtvLnNldEF0dHJpYnV0ZShcImhyZWZcIix0KSxuLmJhc2VVUkl8fHIobil8fE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuLFwiYmFzZVVSSVwiLHt2YWx1ZTp0fSk7dmFyIGk9bi5jcmVhdGVFbGVtZW50KFwibWV0YVwiKTtyZXR1cm4gaS5zZXRBdHRyaWJ1dGUoXCJjaGFyc2V0XCIsXCJ1dGYtOFwiKSxuLmhlYWQuYXBwZW5kQ2hpbGQoaSksbi5oZWFkLmFwcGVuZENoaWxkKG8pLG4uYm9keS5pbm5lckhUTUw9ZSx3aW5kb3cuSFRNTFRlbXBsYXRlRWxlbWVudCYmSFRNTFRlbXBsYXRlRWxlbWVudC5ib290c3RyYXAmJkhUTUxUZW1wbGF0ZUVsZW1lbnQuYm9vdHN0cmFwKG4pLG59dmFyIGk9ZS5mbGFncyxhPWUuSU1QT1JUX0xJTktfVFlQRSxzPWUuSU1QT1JUX1NFTEVDVE9SLGM9ZS5yb290RG9jdW1lbnQsbD1lLkxvYWRlcix1PWUuT2JzZXJ2ZXIsZD1lLnBhcnNlcixwPXtkb2N1bWVudHM6e30sZG9jdW1lbnRQcmVsb2FkU2VsZWN0b3JzOnMsaW1wb3J0c1ByZWxvYWRTZWxlY3RvcnM6W3NdLmpvaW4oXCIsXCIpLGxvYWROb2RlOmZ1bmN0aW9uKGUpe2guYWRkTm9kZShlKX0sbG9hZFN1YnRyZWU6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5tYXJzaGFsTm9kZXMoZSk7aC5hZGROb2Rlcyh0KX0sbWFyc2hhbE5vZGVzOmZ1bmN0aW9uKGUpe3JldHVybiBlLnF1ZXJ5U2VsZWN0b3JBbGwodGhpcy5sb2FkU2VsZWN0b3JzRm9yTm9kZShlKSl9LGxvYWRTZWxlY3RvcnNGb3JOb2RlOmZ1bmN0aW9uKGUpe3ZhciB0PWUub3duZXJEb2N1bWVudHx8ZTtyZXR1cm4gdD09PWM/dGhpcy5kb2N1bWVudFByZWxvYWRTZWxlY3RvcnM6dGhpcy5pbXBvcnRzUHJlbG9hZFNlbGVjdG9yc30sbG9hZGVkOmZ1bmN0aW9uKGUsbixyLGEscyl7aWYoaS5sb2FkJiZjb25zb2xlLmxvZyhcImxvYWRlZFwiLGUsbiksbi5fX3Jlc291cmNlPXIsbi5fX2Vycm9yPWEsdChuKSl7dmFyIGM9dGhpcy5kb2N1bWVudHNbZV07dm9pZCAwPT09YyYmKGM9YT9udWxsOm8ocixzfHxlKSxjJiYoYy5fX2ltcG9ydExpbms9bix0aGlzLmJvb3REb2N1bWVudChjKSksdGhpcy5kb2N1bWVudHNbZV09Yyksbi5fX2RvYz1jfWQucGFyc2VOZXh0KCl9LGJvb3REb2N1bWVudDpmdW5jdGlvbihlKXt0aGlzLmxvYWRTdWJ0cmVlKGUpLHRoaXMub2JzZXJ2ZXIub2JzZXJ2ZShlKSxkLnBhcnNlTmV4dCgpfSxsb2FkZWRBbGw6ZnVuY3Rpb24oKXtkLnBhcnNlTmV4dCgpfX0saD1uZXcgbChwLmxvYWRlZC5iaW5kKHApLHAubG9hZGVkQWxsLmJpbmQocCkpO2lmKHAub2JzZXJ2ZXI9bmV3IHUsIWRvY3VtZW50LmJhc2VVUkkpe3ZhciBmPXtnZXQ6ZnVuY3Rpb24oKXt2YXIgZT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiYmFzZVwiKTtyZXR1cm4gZT9lLmhyZWY6d2luZG93LmxvY2F0aW9uLmhyZWZ9LGNvbmZpZ3VyYWJsZTohMH07T2JqZWN0LmRlZmluZVByb3BlcnR5KGRvY3VtZW50LFwiYmFzZVVSSVwiLGYpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjLFwiYmFzZVVSSVwiLGYpfWUuaW1wb3J0ZXI9cCxlLmltcG9ydExvYWRlcj1ofSksd2luZG93LkhUTUxJbXBvcnRzLmFkZE1vZHVsZShmdW5jdGlvbihlKXt2YXIgdD1lLnBhcnNlcixuPWUuaW1wb3J0ZXIscj17YWRkZWQ6ZnVuY3Rpb24oZSl7Zm9yKHZhciByLG8saSxhLHM9MCxjPWUubGVuZ3RoO2M+cyYmKGE9ZVtzXSk7cysrKXJ8fChyPWEub3duZXJEb2N1bWVudCxvPXQuaXNQYXJzZWQocikpLGk9dGhpcy5zaG91bGRMb2FkTm9kZShhKSxpJiZuLmxvYWROb2RlKGEpLHRoaXMuc2hvdWxkUGFyc2VOb2RlKGEpJiZvJiZ0LnBhcnNlRHluYW1pYyhhLGkpfSxzaG91bGRMb2FkTm9kZTpmdW5jdGlvbihlKXtyZXR1cm4gMT09PWUubm9kZVR5cGUmJm8uY2FsbChlLG4ubG9hZFNlbGVjdG9yc0Zvck5vZGUoZSkpfSxzaG91bGRQYXJzZU5vZGU6ZnVuY3Rpb24oZSl7cmV0dXJuIDE9PT1lLm5vZGVUeXBlJiZvLmNhbGwoZSx0LnBhcnNlU2VsZWN0b3JzRm9yTm9kZShlKSl9fTtuLm9ic2VydmVyLmFkZENhbGxiYWNrPXIuYWRkZWQuYmluZChyKTt2YXIgbz1IVE1MRWxlbWVudC5wcm90b3R5cGUubWF0Y2hlc3x8SFRNTEVsZW1lbnQucHJvdG90eXBlLm1hdGNoZXNTZWxlY3Rvcnx8SFRNTEVsZW1lbnQucHJvdG90eXBlLndlYmtpdE1hdGNoZXNTZWxlY3Rvcnx8SFRNTEVsZW1lbnQucHJvdG90eXBlLm1vek1hdGNoZXNTZWxlY3Rvcnx8SFRNTEVsZW1lbnQucHJvdG90eXBlLm1zTWF0Y2hlc1NlbGVjdG9yfSksZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCgpe3dpbmRvdy5IVE1MSW1wb3J0cy5pbXBvcnRlci5ib290RG9jdW1lbnQocil9dmFyIG49ZS5pbml0aWFsaXplTW9kdWxlcztlLmlzSUU7aWYoIWUudXNlTmF0aXZlKXtuKCk7dmFyIHI9ZS5yb290RG9jdW1lbnQ7XCJjb21wbGV0ZVwiPT09ZG9jdW1lbnQucmVhZHlTdGF0ZXx8XCJpbnRlcmFjdGl2ZVwiPT09ZG9jdW1lbnQucmVhZHlTdGF0ZSYmIXdpbmRvdy5hdHRhY2hFdmVudD90KCk6ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIkRPTUNvbnRlbnRMb2FkZWRcIix0KX19KHdpbmRvdy5IVE1MSW1wb3J0cyksd2luZG93LkN1c3RvbUVsZW1lbnRzPXdpbmRvdy5DdXN0b21FbGVtZW50c3x8e2ZsYWdzOnt9fSxmdW5jdGlvbihlKXt2YXIgdD1lLmZsYWdzLG49W10scj1mdW5jdGlvbihlKXtuLnB1c2goZSl9LG89ZnVuY3Rpb24oKXtuLmZvckVhY2goZnVuY3Rpb24odCl7dChlKX0pfTtlLmFkZE1vZHVsZT1yLGUuaW5pdGlhbGl6ZU1vZHVsZXM9byxlLmhhc05hdGl2ZT1Cb29sZWFuKGRvY3VtZW50LnJlZ2lzdGVyRWxlbWVudCksZS5pc0lFPS9UcmlkZW50Ly50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpLGUudXNlTmF0aXZlPSF0LnJlZ2lzdGVyJiZlLmhhc05hdGl2ZSYmIXdpbmRvdy5TaGFkb3dET01Qb2x5ZmlsbCYmKCF3aW5kb3cuSFRNTEltcG9ydHN8fHdpbmRvdy5IVE1MSW1wb3J0cy51c2VOYXRpdmUpfSh3aW5kb3cuQ3VzdG9tRWxlbWVudHMpLHdpbmRvdy5DdXN0b21FbGVtZW50cy5hZGRNb2R1bGUoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChlLHQpe24oZSxmdW5jdGlvbihlKXtyZXR1cm4gdChlKT8hMDp2b2lkIHIoZSx0KX0pLHIoZSx0KX1mdW5jdGlvbiBuKGUsdCxyKXt2YXIgbz1lLmZpcnN0RWxlbWVudENoaWxkO2lmKCFvKWZvcihvPWUuZmlyc3RDaGlsZDtvJiZvLm5vZGVUeXBlIT09Tm9kZS5FTEVNRU5UX05PREU7KW89by5uZXh0U2libGluZztmb3IoO287KXQobyxyKSE9PSEwJiZuKG8sdCxyKSxvPW8ubmV4dEVsZW1lbnRTaWJsaW5nO3JldHVybiBudWxsfWZ1bmN0aW9uIHIoZSxuKXtmb3IodmFyIHI9ZS5zaGFkb3dSb290O3I7KXQocixuKSxyPXIub2xkZXJTaGFkb3dSb290fWZ1bmN0aW9uIG8oZSx0KXtpKGUsdCxbXSl9ZnVuY3Rpb24gaShlLHQsbil7aWYoZT13aW5kb3cud3JhcChlKSwhKG4uaW5kZXhPZihlKT49MCkpe24ucHVzaChlKTtmb3IodmFyIHIsbz1lLnF1ZXJ5U2VsZWN0b3JBbGwoXCJsaW5rW3JlbD1cIithK1wiXVwiKSxzPTAsYz1vLmxlbmd0aDtjPnMmJihyPW9bc10pO3MrKylyW1wiaW1wb3J0XCJdJiZpKHJbXCJpbXBvcnRcIl0sdCxuKTt0KGUpfX12YXIgYT13aW5kb3cuSFRNTEltcG9ydHM/d2luZG93LkhUTUxJbXBvcnRzLklNUE9SVF9MSU5LX1RZUEU6XCJub25lXCI7ZS5mb3JEb2N1bWVudFRyZWU9byxlLmZvclN1YnRyZWU9dH0pLHdpbmRvdy5DdXN0b21FbGVtZW50cy5hZGRNb2R1bGUoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChlLHQpe3JldHVybiBuKGUsdCl8fHIoZSx0KX1mdW5jdGlvbiBuKHQsbil7cmV0dXJuIGUudXBncmFkZSh0LG4pPyEwOnZvaWQobiYmYSh0KSl9ZnVuY3Rpb24gcihlLHQpe2IoZSxmdW5jdGlvbihlKXtyZXR1cm4gbihlLHQpPyEwOnZvaWQgMH0pfWZ1bmN0aW9uIG8oZSl7Uy5wdXNoKGUpLF98fChfPSEwLHNldFRpbWVvdXQoaSkpfWZ1bmN0aW9uIGkoKXtfPSExO2Zvcih2YXIgZSx0PVMsbj0wLHI9dC5sZW5ndGg7cj5uJiYoZT10W25dKTtuKyspZSgpO1M9W119ZnVuY3Rpb24gYShlKXtFP28oZnVuY3Rpb24oKXtzKGUpfSk6cyhlKX1mdW5jdGlvbiBzKGUpe2UuX191cGdyYWRlZF9fJiYhZS5fX2F0dGFjaGVkJiYoZS5fX2F0dGFjaGVkPSEwLGUuYXR0YWNoZWRDYWxsYmFjayYmZS5hdHRhY2hlZENhbGxiYWNrKCkpfWZ1bmN0aW9uIGMoZSl7bChlKSxiKGUsZnVuY3Rpb24oZSl7bChlKX0pfWZ1bmN0aW9uIGwoZSl7RT9vKGZ1bmN0aW9uKCl7dShlKX0pOnUoZSl9ZnVuY3Rpb24gdShlKXtlLl9fdXBncmFkZWRfXyYmZS5fX2F0dGFjaGVkJiYoZS5fX2F0dGFjaGVkPSExLGUuZGV0YWNoZWRDYWxsYmFjayYmZS5kZXRhY2hlZENhbGxiYWNrKCkpfWZ1bmN0aW9uIGQoZSl7Zm9yKHZhciB0PWUsbj13aW5kb3cud3JhcChkb2N1bWVudCk7dDspe2lmKHQ9PW4pcmV0dXJuITA7dD10LnBhcmVudE5vZGV8fHQubm9kZVR5cGU9PT1Ob2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUmJnQuaG9zdH19ZnVuY3Rpb24gcChlKXtpZihlLnNoYWRvd1Jvb3QmJiFlLnNoYWRvd1Jvb3QuX193YXRjaGVkKXtnLmRvbSYmY29uc29sZS5sb2coXCJ3YXRjaGluZyBzaGFkb3ctcm9vdCBmb3I6IFwiLGUubG9jYWxOYW1lKTtmb3IodmFyIHQ9ZS5zaGFkb3dSb290O3Q7KW0odCksdD10Lm9sZGVyU2hhZG93Um9vdH19ZnVuY3Rpb24gaChlLG4pe2lmKGcuZG9tKXt2YXIgcj1uWzBdO2lmKHImJlwiY2hpbGRMaXN0XCI9PT1yLnR5cGUmJnIuYWRkZWROb2RlcyYmci5hZGRlZE5vZGVzKXtmb3IodmFyIG89ci5hZGRlZE5vZGVzWzBdO28mJm8hPT1kb2N1bWVudCYmIW8uaG9zdDspbz1vLnBhcmVudE5vZGU7dmFyIGk9byYmKG8uVVJMfHxvLl9VUkx8fG8uaG9zdCYmby5ob3N0LmxvY2FsTmFtZSl8fFwiXCI7aT1pLnNwbGl0KFwiLz9cIikuc2hpZnQoKS5zcGxpdChcIi9cIikucG9wKCl9Y29uc29sZS5ncm91cChcIm11dGF0aW9ucyAoJWQpIFslc11cIixuLmxlbmd0aCxpfHxcIlwiKX12YXIgYT1kKGUpO24uZm9yRWFjaChmdW5jdGlvbihlKXtcImNoaWxkTGlzdFwiPT09ZS50eXBlJiYoVChlLmFkZGVkTm9kZXMsZnVuY3Rpb24oZSl7ZS5sb2NhbE5hbWUmJnQoZSxhKX0pLFQoZS5yZW1vdmVkTm9kZXMsZnVuY3Rpb24oZSl7ZS5sb2NhbE5hbWUmJmMoZSl9KSl9KSxnLmRvbSYmY29uc29sZS5ncm91cEVuZCgpfWZ1bmN0aW9uIGYoZSl7Zm9yKGU9d2luZG93LndyYXAoZSksZXx8KGU9d2luZG93LndyYXAoZG9jdW1lbnQpKTtlLnBhcmVudE5vZGU7KWU9ZS5wYXJlbnROb2RlO3ZhciB0PWUuX19vYnNlcnZlcjt0JiYoaChlLHQudGFrZVJlY29yZHMoKSksaSgpKX1mdW5jdGlvbiBtKGUpe2lmKCFlLl9fb2JzZXJ2ZXIpe3ZhciB0PW5ldyBNdXRhdGlvbk9ic2VydmVyKGguYmluZCh0aGlzLGUpKTt0Lm9ic2VydmUoZSx7Y2hpbGRMaXN0OiEwLHN1YnRyZWU6ITB9KSxlLl9fb2JzZXJ2ZXI9dH19ZnVuY3Rpb24gdyhlKXtlPXdpbmRvdy53cmFwKGUpLGcuZG9tJiZjb25zb2xlLmdyb3VwKFwidXBncmFkZURvY3VtZW50OiBcIixlLmJhc2VVUkkuc3BsaXQoXCIvXCIpLnBvcCgpKTt2YXIgbj1lPT09d2luZG93LndyYXAoZG9jdW1lbnQpO3QoZSxuKSxtKGUpLGcuZG9tJiZjb25zb2xlLmdyb3VwRW5kKCl9ZnVuY3Rpb24gdihlKXt5KGUsdyl9dmFyIGc9ZS5mbGFncyxiPWUuZm9yU3VidHJlZSx5PWUuZm9yRG9jdW1lbnRUcmVlLEU9d2luZG93Lk11dGF0aW9uT2JzZXJ2ZXIuX2lzUG9seWZpbGxlZCYmZ1tcInRocm90dGxlLWF0dGFjaGVkXCJdO2UuaGFzUG9seWZpbGxNdXRhdGlvbnM9RSxlLmhhc1Rocm90dGxlZEF0dGFjaGVkPUU7dmFyIF89ITEsUz1bXSxUPUFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwuYmluZChBcnJheS5wcm90b3R5cGUuZm9yRWFjaCksTT1FbGVtZW50LnByb3RvdHlwZS5jcmVhdGVTaGFkb3dSb290O00mJihFbGVtZW50LnByb3RvdHlwZS5jcmVhdGVTaGFkb3dSb290PWZ1bmN0aW9uKCl7dmFyIGU9TS5jYWxsKHRoaXMpO3JldHVybiB3aW5kb3cuQ3VzdG9tRWxlbWVudHMud2F0Y2hTaGFkb3codGhpcyksZX0pLGUud2F0Y2hTaGFkb3c9cCxlLnVwZ3JhZGVEb2N1bWVudFRyZWU9dixlLnVwZ3JhZGVEb2N1bWVudD13LGUudXBncmFkZVN1YnRyZWU9cixlLnVwZ3JhZGVBbGw9dCxlLmF0dGFjaGVkPWEsZS50YWtlUmVjb3Jkcz1mfSksd2luZG93LkN1c3RvbUVsZW1lbnRzLmFkZE1vZHVsZShmdW5jdGlvbihlKXtmdW5jdGlvbiB0KHQscil7aWYoXCJ0ZW1wbGF0ZVwiPT09dC5sb2NhbE5hbWUmJndpbmRvdy5IVE1MVGVtcGxhdGVFbGVtZW50JiZIVE1MVGVtcGxhdGVFbGVtZW50LmRlY29yYXRlJiZIVE1MVGVtcGxhdGVFbGVtZW50LmRlY29yYXRlKHQpLCF0Ll9fdXBncmFkZWRfXyYmdC5ub2RlVHlwZT09PU5vZGUuRUxFTUVOVF9OT0RFKXt2YXIgbz10LmdldEF0dHJpYnV0ZShcImlzXCIpLGk9ZS5nZXRSZWdpc3RlcmVkRGVmaW5pdGlvbih0LmxvY2FsTmFtZSl8fGUuZ2V0UmVnaXN0ZXJlZERlZmluaXRpb24obyk7aWYoaSYmKG8mJmkudGFnPT10LmxvY2FsTmFtZXx8IW8mJiFpW1wiZXh0ZW5kc1wiXSkpcmV0dXJuIG4odCxpLHIpfX1mdW5jdGlvbiBuKHQsbixvKXtyZXR1cm4gYS51cGdyYWRlJiZjb25zb2xlLmdyb3VwKFwidXBncmFkZTpcIix0LmxvY2FsTmFtZSksbi5pcyYmdC5zZXRBdHRyaWJ1dGUoXCJpc1wiLG4uaXMpLHIodCxuKSx0Ll9fdXBncmFkZWRfXz0hMCxpKHQpLG8mJmUuYXR0YWNoZWQodCksZS51cGdyYWRlU3VidHJlZSh0LG8pLGEudXBncmFkZSYmY29uc29sZS5ncm91cEVuZCgpLHR9ZnVuY3Rpb24gcihlLHQpe09iamVjdC5fX3Byb3RvX18/ZS5fX3Byb3RvX189dC5wcm90b3R5cGU6KG8oZSx0LnByb3RvdHlwZSx0W1wibmF0aXZlXCJdKSxlLl9fcHJvdG9fXz10LnByb3RvdHlwZSl9ZnVuY3Rpb24gbyhlLHQsbil7Zm9yKHZhciByPXt9LG89dDtvIT09biYmbyE9PUhUTUxFbGVtZW50LnByb3RvdHlwZTspe2Zvcih2YXIgaSxhPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG8pLHM9MDtpPWFbc107cysrKXJbaV18fChPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxpLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobyxpKSkscltpXT0xKTtvPU9iamVjdC5nZXRQcm90b3R5cGVPZihvKX19ZnVuY3Rpb24gaShlKXtlLmNyZWF0ZWRDYWxsYmFjayYmZS5jcmVhdGVkQ2FsbGJhY2soKX12YXIgYT1lLmZsYWdzO2UudXBncmFkZT10LGUudXBncmFkZVdpdGhEZWZpbml0aW9uPW4sZS5pbXBsZW1lbnRQcm90b3R5cGU9cn0pLHdpbmRvdy5DdXN0b21FbGVtZW50cy5hZGRNb2R1bGUoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCh0LHIpe3ZhciBjPXJ8fHt9O2lmKCF0KXRocm93IG5ldyBFcnJvcihcImRvY3VtZW50LnJlZ2lzdGVyRWxlbWVudDogZmlyc3QgYXJndW1lbnQgYG5hbWVgIG11c3Qgbm90IGJlIGVtcHR5XCIpO2lmKHQuaW5kZXhPZihcIi1cIik8MCl0aHJvdyBuZXcgRXJyb3IoXCJkb2N1bWVudC5yZWdpc3RlckVsZW1lbnQ6IGZpcnN0IGFyZ3VtZW50ICgnbmFtZScpIG11c3QgY29udGFpbiBhIGRhc2ggKCctJykuIEFyZ3VtZW50IHByb3ZpZGVkIHdhcyAnXCIrU3RyaW5nKHQpK1wiJy5cIik7aWYobyh0KSl0aHJvdyBuZXcgRXJyb3IoXCJGYWlsZWQgdG8gZXhlY3V0ZSAncmVnaXN0ZXJFbGVtZW50JyBvbiAnRG9jdW1lbnQnOiBSZWdpc3RyYXRpb24gZmFpbGVkIGZvciB0eXBlICdcIitTdHJpbmcodCkrXCInLiBUaGUgdHlwZSBuYW1lIGlzIGludmFsaWQuXCIpO2lmKGwodCkpdGhyb3cgbmV3IEVycm9yKFwiRHVwbGljYXRlRGVmaW5pdGlvbkVycm9yOiBhIHR5cGUgd2l0aCBuYW1lICdcIitTdHJpbmcodCkrXCInIGlzIGFscmVhZHkgcmVnaXN0ZXJlZFwiKTtyZXR1cm4gYy5wcm90b3R5cGV8fChjLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKEhUTUxFbGVtZW50LnByb3RvdHlwZSkpLGMuX19uYW1lPXQudG9Mb3dlckNhc2UoKSxjLmxpZmVjeWNsZT1jLmxpZmVjeWNsZXx8e30sYy5hbmNlc3RyeT1pKGNbXCJleHRlbmRzXCJdKSxhKGMpLHMoYyksbihjLnByb3RvdHlwZSksdShjLl9fbmFtZSxjKSxjLmN0b3I9ZChjKSxjLmN0b3IucHJvdG90eXBlPWMucHJvdG90eXBlLGMucHJvdG90eXBlLmNvbnN0cnVjdG9yPWMuY3RvcixlLnJlYWR5JiZ2KGRvY3VtZW50KSxjLmN0b3J9ZnVuY3Rpb24gbihlKXtpZighZS5zZXRBdHRyaWJ1dGUuX3BvbHlmaWxsZWQpe3ZhciB0PWUuc2V0QXR0cmlidXRlO2Uuc2V0QXR0cmlidXRlPWZ1bmN0aW9uKGUsbil7ci5jYWxsKHRoaXMsZSxuLHQpfTt2YXIgbj1lLnJlbW92ZUF0dHJpYnV0ZTtlLnJlbW92ZUF0dHJpYnV0ZT1mdW5jdGlvbihlKXtyLmNhbGwodGhpcyxlLG51bGwsbil9LGUuc2V0QXR0cmlidXRlLl9wb2x5ZmlsbGVkPSEwfX1mdW5jdGlvbiByKGUsdCxuKXtlPWUudG9Mb3dlckNhc2UoKTt2YXIgcj10aGlzLmdldEF0dHJpYnV0ZShlKTtuLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt2YXIgbz10aGlzLmdldEF0dHJpYnV0ZShlKTt0aGlzLmF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayYmbyE9PXImJnRoaXMuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKGUscixvKX1mdW5jdGlvbiBvKGUpe2Zvcih2YXIgdD0wO3Q8Xy5sZW5ndGg7dCsrKWlmKGU9PT1fW3RdKXJldHVybiEwfWZ1bmN0aW9uIGkoZSl7dmFyIHQ9bChlKTtyZXR1cm4gdD9pKHRbXCJleHRlbmRzXCJdKS5jb25jYXQoW3RdKTpbXX1mdW5jdGlvbiBhKGUpe2Zvcih2YXIgdCxuPWVbXCJleHRlbmRzXCJdLHI9MDt0PWUuYW5jZXN0cnlbcl07cisrKW49dC5pcyYmdC50YWc7ZS50YWc9bnx8ZS5fX25hbWUsbiYmKGUuaXM9ZS5fX25hbWUpfWZ1bmN0aW9uIHMoZSl7aWYoIU9iamVjdC5fX3Byb3RvX18pe3ZhciB0PUhUTUxFbGVtZW50LnByb3RvdHlwZTtpZihlLmlzKXt2YXIgbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KGUudGFnKTt0PU9iamVjdC5nZXRQcm90b3R5cGVPZihuKX1mb3IodmFyIHIsbz1lLnByb3RvdHlwZSxpPSExO287KW89PXQmJihpPSEwKSxyPU9iamVjdC5nZXRQcm90b3R5cGVPZihvKSxyJiYoby5fX3Byb3RvX189ciksbz1yO2l8fGNvbnNvbGUud2FybihlLnRhZytcIiBwcm90b3R5cGUgbm90IGZvdW5kIGluIHByb3RvdHlwZSBjaGFpbiBmb3IgXCIrZS5pcyksZVtcIm5hdGl2ZVwiXT10fX1mdW5jdGlvbiBjKGUpe3JldHVybiBiKE0oZS50YWcpLGUpfWZ1bmN0aW9uIGwoZSl7cmV0dXJuIGU/U1tlLnRvTG93ZXJDYXNlKCldOnZvaWQgMH1mdW5jdGlvbiB1KGUsdCl7U1tlXT10fWZ1bmN0aW9uIGQoZSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGMoZSl9fWZ1bmN0aW9uIHAoZSx0LG4pe3JldHVybiBlPT09VD9oKHQsbik6TyhlLHQpfWZ1bmN0aW9uIGgoZSx0KXtlJiYoZT1lLnRvTG93ZXJDYXNlKCkpLHQmJih0PXQudG9Mb3dlckNhc2UoKSk7dmFyIG49bCh0fHxlKTtpZihuKXtpZihlPT1uLnRhZyYmdD09bi5pcylyZXR1cm4gbmV3IG4uY3RvcjtpZighdCYmIW4uaXMpcmV0dXJuIG5ldyBuLmN0b3J9dmFyIHI7cmV0dXJuIHQ/KHI9aChlKSxyLnNldEF0dHJpYnV0ZShcImlzXCIsdCkscik6KHI9TShlKSxlLmluZGV4T2YoXCItXCIpPj0wJiZ5KHIsSFRNTEVsZW1lbnQpLHIpfWZ1bmN0aW9uIGYoZSx0KXt2YXIgbj1lW3RdO2VbdF09ZnVuY3Rpb24oKXt2YXIgZT1uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gZyhlKSxlfX12YXIgbSx3PWUuaXNJRSx2PWUudXBncmFkZURvY3VtZW50VHJlZSxnPWUudXBncmFkZUFsbCxiPWUudXBncmFkZVdpdGhEZWZpbml0aW9uLHk9ZS5pbXBsZW1lbnRQcm90b3R5cGUsRT1lLnVzZU5hdGl2ZSxfPVtcImFubm90YXRpb24teG1sXCIsXCJjb2xvci1wcm9maWxlXCIsXCJmb250LWZhY2VcIixcImZvbnQtZmFjZS1zcmNcIixcImZvbnQtZmFjZS11cmlcIixcImZvbnQtZmFjZS1mb3JtYXRcIixcImZvbnQtZmFjZS1uYW1lXCIsXCJtaXNzaW5nLWdseXBoXCJdLFM9e30sVD1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWxcIixNPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQuYmluZChkb2N1bWVudCksTz1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMuYmluZChkb2N1bWVudCk7bT1PYmplY3QuX19wcm90b19ffHxFP2Z1bmN0aW9uKGUsdCl7cmV0dXJuIGUgaW5zdGFuY2VvZiB0fTpmdW5jdGlvbihlLHQpe2lmKGUgaW5zdGFuY2VvZiB0KXJldHVybiEwO2Zvcih2YXIgbj1lO247KXtpZihuPT09dC5wcm90b3R5cGUpcmV0dXJuITA7bj1uLl9fcHJvdG9fX31yZXR1cm4hMX0sZihOb2RlLnByb3RvdHlwZSxcImNsb25lTm9kZVwiKSxmKGRvY3VtZW50LFwiaW1wb3J0Tm9kZVwiKSx3JiYhZnVuY3Rpb24oKXt2YXIgZT1kb2N1bWVudC5pbXBvcnROb2RlO2RvY3VtZW50LmltcG9ydE5vZGU9ZnVuY3Rpb24oKXt2YXIgdD1lLmFwcGx5KGRvY3VtZW50LGFyZ3VtZW50cyk7aWYodC5ub2RlVHlwZT09dC5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFKXt2YXIgbj1kb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7cmV0dXJuIG4uYXBwZW5kQ2hpbGQodCksbn1yZXR1cm4gdH19KCksZG9jdW1lbnQucmVnaXN0ZXJFbGVtZW50PXQsZG9jdW1lbnQuY3JlYXRlRWxlbWVudD1oLGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUz1wLGUucmVnaXN0cnk9UyxlW1wiaW5zdGFuY2VvZlwiXT1tLGUucmVzZXJ2ZWRUYWdMaXN0PV8sZS5nZXRSZWdpc3RlcmVkRGVmaW5pdGlvbj1sLGRvY3VtZW50LnJlZ2lzdGVyPWRvY3VtZW50LnJlZ2lzdGVyRWxlbWVudH0pLGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoKXtpKHdpbmRvdy53cmFwKGRvY3VtZW50KSksd2luZG93LkN1c3RvbUVsZW1lbnRzLnJlYWR5PSEwO3ZhciBlPXdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWV8fGZ1bmN0aW9uKGUpe3NldFRpbWVvdXQoZSwxNil9O2UoZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7d2luZG93LkN1c3RvbUVsZW1lbnRzLnJlYWR5VGltZT1EYXRlLm5vdygpLHdpbmRvdy5IVE1MSW1wb3J0cyYmKHdpbmRvdy5DdXN0b21FbGVtZW50cy5lbGFwc2VkPXdpbmRvdy5DdXN0b21FbGVtZW50cy5yZWFkeVRpbWUtd2luZG93LkhUTUxJbXBvcnRzLnJlYWR5VGltZSksZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoXCJXZWJDb21wb25lbnRzUmVhZHlcIix7YnViYmxlczohMH0pKX0pfSl9dmFyIG49ZS51c2VOYXRpdmUscj1lLmluaXRpYWxpemVNb2R1bGVzO2UuaXNJRTtpZihuKXt2YXIgbz1mdW5jdGlvbigpe307ZS53YXRjaFNoYWRvdz1vLGUudXBncmFkZT1vLGUudXBncmFkZUFsbD1vLGUudXBncmFkZURvY3VtZW50VHJlZT1vLGUudXBncmFkZVN1YnRyZWU9byxlLnRha2VSZWNvcmRzPW8sZVtcImluc3RhbmNlb2ZcIl09ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZSBpbnN0YW5jZW9mIHR9fWVsc2UgcigpO3ZhciBpPWUudXBncmFkZURvY3VtZW50VHJlZSxhPWUudXBncmFkZURvY3VtZW50O2lmKHdpbmRvdy53cmFwfHwod2luZG93LlNoYWRvd0RPTVBvbHlmaWxsPyh3aW5kb3cud3JhcD13aW5kb3cuU2hhZG93RE9NUG9seWZpbGwud3JhcElmTmVlZGVkLHdpbmRvdy51bndyYXA9d2luZG93LlNoYWRvd0RPTVBvbHlmaWxsLnVud3JhcElmTmVlZGVkKTp3aW5kb3cud3JhcD13aW5kb3cudW53cmFwPWZ1bmN0aW9uKGUpe3JldHVybiBlfSksd2luZG93LkhUTUxJbXBvcnRzJiYod2luZG93LkhUTUxJbXBvcnRzLl9faW1wb3J0c1BhcnNpbmdIb29rPWZ1bmN0aW9uKGUpe2VbXCJpbXBvcnRcIl0mJmEod3JhcChlW1wiaW1wb3J0XCJdKSl9KSxcImNvbXBsZXRlXCI9PT1kb2N1bWVudC5yZWFkeVN0YXRlfHxlLmZsYWdzLmVhZ2VyKXQoKTtlbHNlIGlmKFwiaW50ZXJhY3RpdmVcIiE9PWRvY3VtZW50LnJlYWR5U3RhdGV8fHdpbmRvdy5hdHRhY2hFdmVudHx8d2luZG93LkhUTUxJbXBvcnRzJiYhd2luZG93LkhUTUxJbXBvcnRzLnJlYWR5KXt2YXIgcz13aW5kb3cuSFRNTEltcG9ydHMmJiF3aW5kb3cuSFRNTEltcG9ydHMucmVhZHk/XCJIVE1MSW1wb3J0c0xvYWRlZFwiOlwiRE9NQ29udGVudExvYWRlZFwiO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKHMsdCl9ZWxzZSB0KCl9KHdpbmRvdy5DdXN0b21FbGVtZW50cyksZnVuY3Rpb24oZSl7RnVuY3Rpb24ucHJvdG90eXBlLmJpbmR8fChGdW5jdGlvbi5wcm90b3R5cGUuYmluZD1mdW5jdGlvbihlKXt2YXIgdD10aGlzLG49QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpO3JldHVybiBmdW5jdGlvbigpe3ZhciByPW4uc2xpY2UoKTtyZXR1cm4gci5wdXNoLmFwcGx5KHIsYXJndW1lbnRzKSx0LmFwcGx5KGUscil9fSl9KHdpbmRvdy5XZWJDb21wb25lbnRzKSxmdW5jdGlvbihlKXt2YXIgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3R5bGVcIik7dC50ZXh0Q29udGVudD1cImJvZHkge3RyYW5zaXRpb246IG9wYWNpdHkgZWFzZS1pbiAwLjJzOyB9IFxcbmJvZHlbdW5yZXNvbHZlZF0ge29wYWNpdHk6IDA7IGRpc3BsYXk6IGJsb2NrOyBvdmVyZmxvdzogaGlkZGVuOyBwb3NpdGlvbjogcmVsYXRpdmU7IH0gXFxuXCI7dmFyIG49ZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcImhlYWRcIik7bi5pbnNlcnRCZWZvcmUodCxuLmZpcnN0Q2hpbGQpfSh3aW5kb3cuV2ViQ29tcG9uZW50cyksZnVuY3Rpb24oZSl7d2luZG93LlBsYXRmb3JtPWV9KHdpbmRvdy5XZWJDb21wb25lbnRzKTsiLCIvLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIEJhc2VkIGluIHBhcnQgb24gY29kZSBmcm9tIEFwYWNoZSBSaXBwbGUsIGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvaW5jdWJhdG9yLXJpcHBsZVxuXG52YXIgdXRpbHMgPSByZXF1aXJlKCd1dGlscycpO1xuXG52YXIgaW5pdCA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgX1hNTEh0dHBSZXF1ZXN0ID0gWE1MSHR0cFJlcXVlc3Q7XG4gICAgd2luZG93LlhNTEh0dHBSZXF1ZXN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgeGhyID0gbmV3IF9YTUxIdHRwUmVxdWVzdCgpLFxuICAgICAgICAgICAgb3JpZ01ldGhvZHMgPSB7XG4gICAgICAgICAgICAgICAgc2V0UmVxdWVzdEhlYWRlcjogeGhyLnNldFJlcXVlc3RIZWFkZXIsXG4gICAgICAgICAgICAgICAgb3BlbjogeGhyLm9wZW5cbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgeGhyLm9wZW4gPSBmdW5jdGlvbiAobWV0aG9kLCB1cmwpIHtcbiAgICAgICAgICAgIHZhciBzYW1lT3JpZ2luID0gdXRpbHMuaXNTYW1lT3JpZ2luUmVxdWVzdCh1cmwpO1xuXG4gICAgICAgICAgICBpZiAoIXNhbWVPcmlnaW4pIHtcbiAgICAgICAgICAgICAgICB1cmwgPSAnL3hocl9wcm94eT9ydXJsPScgKyBlc2NhcGUodXJsKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgb3JpZ01ldGhvZHMub3Blbi5hcHBseSh4aHIsIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cykpO1xuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiB4aHI7XG4gICAgfTtcblxuICAgIC8vIEVuc3VyZSB0aGF0IHdlIHJldGFpbiBhbGwgc3RhdGljIHByb3BlcnRpZXMsIHN1Y2ggYXMgRE9ORVxuICAgIHdpbmRvdy5YTUxIdHRwUmVxdWVzdC5fX3Byb3RvX18gPSBfWE1MSHR0cFJlcXVlc3Q7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBpbml0OiBpbml0XG59O1xuIl19