PageSourceSearch

https://maidragon.jp/js/common-eb14ef2f0c.js

js maidragon.jp collected 2026-10-02 03:38:34 UTC 1,736,853 bytes, 20,578 lines download raw bytes

1/******/ (function() { // webpackBootstrap
2/******/ 	var __webpack_modules__ = ({
3
vendor: 1,951 bytes, lines 4-59
4/***/ "./node_modules/@sygnas/jp-social-share/dist/es6/_virtual/_rollupPluginBabelHelpers.js":
5/*!*********************************************************************************************!*\
6  !*** ./node_modules/@sygnas/jp-social-share/dist/es6/_virtual/_rollupPluginBabelHelpers.js ***!
7  \*********************************************************************************************/
8/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
9
10"use strict";
11__webpack_require__.r(__webpack_exports__);
12/* harmony export */ __webpack_require__.d(__webpack_exports__, {
13/* harmony export */   classCallCheck: function() { return /* binding */ _classCallCheck; },
14/* harmony export */   createClass: function() { return /* binding */ _createClass; },
15/* harmony export */   defineProperty: function() { return /* binding */ _defineProperty; }
16/* harmony export */ });
17function _classCallCheck(instance, Constructor) {
18  if (!(instance instanceof Constructor)) {
19    throw new TypeError("Cannot call a class as a function");
20  }
21}
22
23function _defineProperties(target, props) {
24  for (var i = 0; i < props.length; i++) {
25    var descriptor = props[i];
26    descriptor.enumerable = descriptor.enumerable || false;
27    descriptor.configurable = true;
28    if ("value" in descriptor) descriptor.writable = true;
29    Object.defineProperty(target, descriptor.key, descriptor);
30  }
31}
32
33function _createClass(Constructor, protoProps, staticProps) {
34  if (protoProps) _defineProperties(Constructor.prototype, protoProps);
35  if (staticProps) _defineProperties(Constructor, staticProps);
36  return Constructor;
37}
38
39function _defineProperty(obj, key, value) {
40  if (key in obj) {
41    Object.defineProperty(obj, key, {
42      value: value,
43      enumerable: true,
44      configurable: true,
45      writable: true
46    });
47  } else {
48    obj[key] = value;
49  }
50
51  return obj;
52}
53
54
55//# sourceMappingURL=_rollupPluginBabelHelpers.js.map
56
57
58/***/ }),
59
vendor: 8,258 bytes, lines 60-274
60/***/ "./node_modules/@sygnas/jp-social-share/dist/es6/index.js":
61/*!****************************************************************!*\
62  !*** ./node_modules/@sygnas/jp-social-share/dist/es6/index.js ***!
63  \****************************************************************/
64/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
65
66"use strict";
67__webpack_require__.r(__webpack_exports__);
68/* harmony export */ __webpack_require__.d(__webpack_exports__, {
69/* harmony export */   "default": function() { return /* binding */ JpSocialShare; }
70/* harmony export */ });
71/* harmony import */ var _virtual_rollupPluginBabelHelpers_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_virtual/_rollupPluginBabelHelpers.js */ "./node_modules/@sygnas/jp-social-share/dist/es6/_virtual/_rollupPluginBabelHelpers.js");
72
73
74/**
75 * 日本向けソーシャルシェアボタン
76 *
77 * @author   Hiroshi Fukuda <[email protected]>
78 * @license  MIT
79 */
80var JpSocialShare = /*#__PURE__*/function () {
81  function JpSocialShare() {
82    (0,_virtual_rollupPluginBabelHelpers_js__WEBPACK_IMPORTED_MODULE_0__.classCallCheck)(this, JpSocialShare);
83  }
84
85  (0,_virtual_rollupPluginBabelHelpers_js__WEBPACK_IMPORTED_MODULE_0__.createClass)(JpSocialShare, null, [{
86    key: "setShareButton",
87    value: // サービス名識別子
88    ////////////////////////
89    ////////////////////////
90
91    /**
92     * シェアボタンのリンクを設定する
93     * @param {String} target 対象ボタンのセレクタ
94     * @param {Object} option 新規ウィンドウのパラメータ(defaults参照)
95     */
96    function setShareButton(target) {
97      var _this = this;
98
99      var option = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
100      // 設定のマージ
101      this.opt = Object.assign(this.defaults, option); // クリックイベントを設定
102
103      this.getNodeArray(document.querySelectorAll(target)).forEach(function (elm) {
104        elm.addEventListener('click', function (ev) {
105          var elm = ev.currentTarget;
106
107          _this.openShareWindowWithElement(elm);
108
109          ev.preventDefault();
110        });
111      });
112    }
113    /**
114     * エレメントから情報を取得してシェア用ウィンドウを開く
115     */
116
117  }, {
118    key: "openShareWindowWithElement",
119    value: function openShareWindowWithElement(elm) {
120      // エレメントからパラメータを取得
121      var service = elm.getAttribute('data-share-service');
122      var url = elm.getAttribute('data-share-url') || '';
123      var message = elm.getAttribute('data-share-message') || document.title;
124      var account = elm.getAttribute('data-share-account') || '';
125      var follow = elm.getAttribute('data-share-follow') || ''; // シェア用ウィンドウを開く
126
127      this.openShareWindow(service, url, message, account, follow);
128    }
129    /**
130     * シェア用ウィンドウを開く
131     * @param service {String} ソーシャルサービス識別子
132     * @param url {String} シェアURL
133     * @param message {String} メッセージ本文
134     * @param account {String} ツイートに付けるRepleyアカウント
135     * @param follow {String} ツイート後に表示するフォロー候補アカウント
136     */
137
138  }, {
139    key: "openShareWindow",
140    value: function openShareWindow(service) {
141      var url = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
142      var message = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';
143      var account = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '';
144      var follow = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : '';
145
146      // 存在しないサービスだったらエラー
147      if (this.opt.services && Object.keys(this.opt.services).indexOf(service) === -1) {
148        console.log("".concat(service, " is not supported."));
149        return;
150      } // テンプレートからコンバート
151
152
153      var openUrl = this.convertOpenUrl(service, url, message, account, follow); // // LINEはアプリに飛ばす。それ以外はウィンドウを開く
154      // if (service === this.SERVICES.LINE) {
155      //   window.location.href = openUrl;
156      // } else if (this.opt.window) {
157
158      if (this.opt.window) {
159        var windowOption = this.getWindowOption(this.opt.window);
160        window.open(openUrl, "share_".concat(service), windowOption);
161      } else {
162        console.log('Window option is not defined.');
163        return;
164      }
165    } ////////////////////////
166    ////////////////////////
167
168    /**
169     * サービス毎のURLを取得
170     * パラメータによっては加工がされる
171     * @param service {String} ソーシャルサービス識別子
172     * @param url {String} シェアURL
173     * @param message {String} メッセージ本文
174     * @param account {String} ツイートに付けるRepleyアカウント
175     * @param follow {String} ツイート後に表示するフォロー候補アカウント
176     * @return {String} シェア窓オープンURL
177     */
178
179  }, {
180    key: "convertOpenUrl",
181    value: function convertOpenUrl(service) {
182      var url = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
183      var message = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';
184      var account = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '';
185      var follow = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : '';
186      var eu = encodeURIComponent;
187      var shareUrl = url || location.href;
188      var openUrl = this.opt.services ? this.opt.services[service] : "";
189
190      if (!openUrl) {
191        console.log("".concat(service, " is not supported."));
192        return "";
193      } // Twitterだけパラメータの内容によってURLが変わる
194
195
196      if (service === this.SERVICES.TWITTER) {
197        if (!account) openUrl = openUrl.replace("&via={{ACCOUNT}}", "");
198        if (!follow) openUrl = openUrl.replace("&related={{FOLLOW}}", "");
199      }
200
201      openUrl = openUrl.replace("{{ACCOUNT}}", eu(account));
202      openUrl = openUrl.replace("{{FOLLOW}}", eu(follow));
203      openUrl = openUrl.replace("{{MESSAGE}}", eu(message));
204      openUrl = openUrl.replace("{{URL}}", eu(shareUrl));
205      return openUrl;
206    }
207    /**
208     * NodeListをArrayとして取り出す(IE対策)
209     */
210
211  }, {
212    key: "getNodeArray",
213    value: function getNodeArray(nodeList) {
214      return Array.prototype.slice.call(nodeList, 0);
215    }
216    /**
217     * Windowパラメータ作成
218     * @param opt {Object} ウィンドウパラメータ
219     * @return {String} 新規ウィンドウのパラメータ文字列
220     */
221
222  }, {
223    key: "getWindowOption",
224    value: function getWindowOption(opt) {
225      var items = [];
226      Object.keys(opt).forEach(function (key) {
227        items.push("".concat(key, "=").concat(opt[key]));
228      });
229      return items.join(",");
230    }
231  }]);
232
233  return JpSocialShare;
234}();
235
236(0,_virtual_rollupPluginBabelHelpers_js__WEBPACK_IMPORTED_MODULE_0__.defineProperty)(JpSocialShare, "SERVICES", {
237  TWITTER: 'twitter',
238  FACEBOOK: 'facebook',
239  LINE: 'line',
240  FEEDLY: 'feedly',
241  POCKET: 'pocket',
242  HATEBU: 'hatebu'
243});
244
245(0,_virtual_rollupPluginBabelHelpers_js__WEBPACK_IMPORTED_MODULE_0__.defineProperty)(JpSocialShare, "opt", void 0);
246
247(0,_virtual_rollupPluginBabelHelpers_js__WEBPACK_IMPORTED_MODULE_0__.defineProperty)(JpSocialShare, "defaults", {
248  // window.open() のオプション
249  window: {
250    width: 550,
251    height: 450,
252    personalbar: 0,
253    toolbar: 0,
254    scrollbars: 1,
255    resizable: 1
256  },
257  // シェア用URLのテンプレート
258  services: {
259    twitter: 'http://twitter.com/share?url={{URL}}&text={{MESSAGE}}&via={{ACCOUNT}}&related={{FOLLOW}}',
260    facebook: 'http://www.facebook.com/share.php?u={{URL}}',
261    // line: 'line://msg/text/{{MESSAGE}} {{URL}}',
262    line: 'https://social-plugins.line.me/lineit/share?url={{URL}}',
263    feedly: 'http://feedly.com/i/subscription/feed/{{URL}}',
264    pocket: 'http://getpocket.com/edit?url={{URL}}',
265    hatebu: '//b.hatena.ne.jp/add?mode=confirm&url={{URL}}&title={{MESSAGE}}'
266  }
267});
268
269
270//# sourceMappingURL=index.js.map
271
272
273/***/ }),
274
vendor: 1,943 bytes, lines 275-330
275/***/ "./node_modules/@sygnas/scroll-amount/dist/es6/_virtual/_rollupPluginBabelHelpers.js":
276/*!*******************************************************************************************!*\
277  !*** ./node_modules/@sygnas/scroll-amount/dist/es6/_virtual/_rollupPluginBabelHelpers.js ***!
278  \*******************************************************************************************/
279/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
280
281"use strict";
282__webpack_require__.r(__webpack_exports__);
283/* harmony export */ __webpack_require__.d(__webpack_exports__, {
284/* harmony export */   classCallCheck: function() { return /* binding */ _classCallCheck; },
285/* harmony export */   createClass: function() { return /* binding */ _createClass; },
286/* harmony export */   defineProperty: function() { return /* binding */ _defineProperty; }
287/* harmony export */ });
288function _classCallCheck(instance, Constructor) {
289  if (!(instance instanceof Constructor)) {
290    throw new TypeError("Cannot call a class as a function");
291  }
292}
293
294function _defineProperties(target, props) {
295  for (var i = 0; i < props.length; i++) {
296    var descriptor = props[i];
297    descriptor.enumerable = descriptor.enumerable || false;
298    descriptor.configurable = true;
299    if ("value" in descriptor) descriptor.writable = true;
300    Object.defineProperty(target, descriptor.key, descriptor);
301  }
302}
303
304function _createClass(Constructor, protoProps, staticProps) {
305  if (protoProps) _defineProperties(Constructor.prototype, protoProps);
306  if (staticProps) _defineProperties(Constructor, staticProps);
307  return Constructor;
308}
309
310function _defineProperty(obj, key, value) {
311  if (key in obj) {
312    Object.defineProperty(obj, key, {
313      value: value,
314      enumerable: true,
315      configurable: true,
316      writable: true
317    });
318  } else {
319    obj[key] = value;
320  }
321
322  return obj;
323}
324
325
326//# sourceMappingURL=_rollupPluginBabelHelpers.js.map
327
328
329/***/ }),
330
vendor: 6,178 bytes, lines 331-519
331/***/ "./node_modules/@sygnas/scroll-amount/dist/es6/index.js":
332/*!**************************************************************!*\
333  !*** ./node_modules/@sygnas/scroll-amount/dist/es6/index.js ***!
334  \**************************************************************/
335/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
336
337"use strict";
338__webpack_require__.r(__webpack_exports__);
339/* harmony export */ __webpack_require__.d(__webpack_exports__, {
340/* harmony export */   "default": function() { return /* binding */ SygScrollAmount; }
341/* harmony export */ });
342/* harmony import */ var _virtual_rollupPluginBabelHelpers_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_virtual/_rollupPluginBabelHelpers.js */ "./node_modules/@sygnas/scroll-amount/dist/es6/_virtual/_rollupPluginBabelHelpers.js");
343
344
345/**
346 * Add scrolling state(top / not-top / bottom / not-bottom)
347 *
348 * @author   Hiroshi Fukuda <[email protected]>
349 * @license  MIT
350 */
351///////////////////////////////////////
352// 状態を付与するためのdata属性
353var ATTR_NAME = "data-scroll-amount"; // 状態の名前
354
355var ATTR_TOP = "top";
356var ATTR_BOTTOM = "bottom";
357var ATTR_NOT_TOP = "not-top";
358var ATTR_NOT_BOTTOM = "not-bottom";
359var ATTR_POSITION = "data-position"; // 監視用エレメントのデフォルトstyle
360
361var COMMON_STYLE = {
362  position: "absolute",
363  left: "0"
364}; // IntersectionObserverの設定
365
366var OBSERVER_OPT = {
367  root: null,
368  rootMargin: "0px",
369  threshold: 0
370}; ///////////////////////////////////////
371
372var SygScrollAmount = /*#__PURE__*/function () {
373  // private observers: IntersectionObserver[];
374
375  /**
376   * コンストラクタ
377   * @param target string 状態を付与する対象エレメントのセレクタ文字列
378   */
379  function SygScrollAmount(target) {
380    var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
381
382    (0,_virtual_rollupPluginBabelHelpers_js__WEBPACK_IMPORTED_MODULE_0__.classCallCheck)(this, SygScrollAmount);
383
384    (0,_virtual_rollupPluginBabelHelpers_js__WEBPACK_IMPORTED_MODULE_0__.defineProperty)(this, "opt", void 0);
385
386    (0,_virtual_rollupPluginBabelHelpers_js__WEBPACK_IMPORTED_MODULE_0__.defineProperty)(this, "targets", void 0);
387
388    (0,_virtual_rollupPluginBabelHelpers_js__WEBPACK_IMPORTED_MODULE_0__.defineProperty)(this, "isTop", void 0);
389
390    (0,_virtual_rollupPluginBabelHelpers_js__WEBPACK_IMPORTED_MODULE_0__.defineProperty)(this, "isBottom", void 0);
391
392    (0,_virtual_rollupPluginBabelHelpers_js__WEBPACK_IMPORTED_MODULE_0__.defineProperty)(this, "lastState", void 0);
393
394    var defaults = {
395      // 最上部のオフセット
396      offsetTop: "70px",
397      // 最下部のオフセット
398      offsetBottom: "70px",
399      // 最上部にスクロールした時に実行
400      onTop: function onTop() {},
401      // 最上部から離れた時に実行
402      onNotTop: function onNotTop() {},
403      // 最下部にスクロールした時に実行
404      onBottom: function onBottom() {},
405      // 最下部から離れた時に実行
406      onNotBottom: function onNotBottom() {}
407    }; // 与えられた設定を適用
408
409    this.opt = Object.assign(defaults, options); // 状態付与の対象
410
411    this.targets = document.querySelectorAll(target); // 一番上にスクロールした
412
413    this.isTop = false; // 一番下にスクロールした
414
415    this.isBottom = false; // 最後の状態
416
417    this.lastState = '';
418    this.start();
419  }
420  /**
421   * 監視用エレメント作成して監視開始
422   */
423
424
425  (0,_virtual_rollupPluginBabelHelpers_js__WEBPACK_IMPORTED_MODULE_0__.createClass)(SygScrollAmount, [{
426    key: "createObserveElement",
427    value: function createObserveElement(position) {
428      var element = document.createElement("div");
429      Object.assign(element.style, COMMON_STYLE);
430      element.style.height = this.opt.offsetTop;
431      element.setAttribute(ATTR_POSITION, position);
432
433      if (position === "top") {
434        element.style.top = "0";
435      } else {
436        element.style.bottom = "0";
437      } // ページ最下部に追加
438
439
440      document.body.appendChild(element);
441      return element;
442    }
443    /**
444     * スクロール検知処理を開始
445     */
446
447  }, {
448    key: "start",
449    value: function start() {
450      // <body> に position 設定
451      document.body.style.position = "relative"; // IntersectionObserverを作成して監視開始
452
453      var observer = new IntersectionObserver(this.observerCallback.bind(this), OBSERVER_OPT); // 監視用エレメント作成
454
455      observer.observe(this.createObserveElement("top"));
456      observer.observe(this.createObserveElement("bottom"));
457    }
458    /**
459     * スクロール処理
460     * IntersectionObserver に反応した <div> が top/bottom どちらかで判定する
461     */
462
463  }, {
464    key: "observerCallback",
465    value: function observerCallback(entries) {
466      var _this = this;
467
468      entries.forEach(function (entry) {
469        var position = entry.target.getAttribute(ATTR_POSITION);
470
471        if (position === "top") {
472          _this.isTop = entry.isIntersecting;
473        } else {
474          _this.isBottom = entry.isIntersecting;
475        }
476      }); // 属性を付与
477
478      this.setAttribute();
479    }
480    /**
481     * 属性を付与
482     */
483
484  }, {
485    key: "setAttribute",
486    value: function setAttribute() {
487      var state = [this.isTop ? ATTR_TOP : ATTR_NOT_TOP, this.isBottom ? ATTR_BOTTOM : ATTR_NOT_BOTTOM].join(' '); // 結果を data属性に反映する
488      // 前回と同じなら反映しない
489
490      if (state !== this.lastState) {
491        this.lastState = state;
492        this.targets.forEach(function (target) {
493          target.setAttribute(ATTR_NAME, state);
494        }); // オプション関数を実行
495
496        if (this.isTop && this.opt.onTop) {
497          this.opt.onTop();
498        } else if (this.opt.onNotTop) {
499          this.opt.onNotTop();
500        }
501
502        if (this.isBottom && this.opt.onBottom) {
503          this.opt.onBottom();
504        } else if (this.opt.onNotBottom) {
505          this.opt.onNotBottom();
506        }
507      }
508    }
509  }]);
510
511  return SygScrollAmount;
512}();
513
514
515//# sourceMappingURL=index.js.map
516
517
518/***/ }),
519
vendor: 1,943 bytes, lines 520-575
520/***/ "./node_modules/@sygnas/scroll-inview/dist/es6/_virtual/_rollupPluginBabelHelpers.js":
521/*!*******************************************************************************************!*\
522  !*** ./node_modules/@sygnas/scroll-inview/dist/es6/_virtual/_rollupPluginBabelHelpers.js ***!
523  \*******************************************************************************************/
524/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
525
526"use strict";
527__webpack_require__.r(__webpack_exports__);
528/* harmony export */ __webpack_require__.d(__webpack_exports__, {
529/* harmony export */   classCallCheck: function() { return /* binding */ _classCallCheck; },
530/* harmony export */   createClass: function() { return /* binding */ _createClass; },
531/* harmony export */   defineProperty: function() { return /* binding */ _defineProperty; }
532/* harmony export */ });
533function _classCallCheck(instance, Constructor) {
534  if (!(instance instanceof Constructor)) {
535    throw new TypeError("Cannot call a class as a function");
536  }
537}
538
539function _defineProperties(target, props) {
540  for (var i = 0; i < props.length; i++) {
541    var descriptor = props[i];
542    descriptor.enumerable = descriptor.enumerable || false;
543    descriptor.configurable = true;
544    if ("value" in descriptor) descriptor.writable = true;
545    Object.defineProperty(target, descriptor.key, descriptor);
546  }
547}
548
549function _createClass(Constructor, protoProps, staticProps) {
550  if (protoProps) _defineProperties(Constructor.prototype, protoProps);
551  if (staticProps) _defineProperties(Constructor, staticProps);
552  return Constructor;
553}
554
555function _defineProperty(obj, key, value) {
556  if (key in obj) {
557    Object.defineProperty(obj, key, {
558      value: value,
559      enumerable: true,
560      configurable: true,
561      writable: true
562    });
563  } else {
564    obj[key] = value;
565  }
566
567  return obj;
568}
569
570
571//# sourceMappingURL=_rollupPluginBabelHelpers.js.map
572
573
574/***/ }),
575
vendor: 4,587 bytes, lines 576-713
576/***/ "./node_modules/@sygnas/scroll-inview/dist/es6/index.js":
577/*!**************************************************************!*\
578  !*** ./node_modules/@sygnas/scroll-inview/dist/es6/index.js ***!
579  \**************************************************************/
580/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
581
582"use strict";
583__webpack_require__.r(__webpack_exports__);
584/* harmony export */ __webpack_require__.d(__webpack_exports__, {
585/* harmony export */   "default": function() { return /* binding */ _default; }
586/* harmony export */ });
587/* harmony import */ var _virtual_rollupPluginBabelHelpers_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_virtual/_rollupPluginBabelHelpers.js */ "./node_modules/@sygnas/scroll-inview/dist/es6/_virtual/_rollupPluginBabelHelpers.js");
588
589
590/**
591 * Scroll in viewport add data attribute
592 * スクロールしてビューポートに入ったらdata属性を与える
593 *
594 * @author   Hiroshi Fukuda <[email protected]>
595 * @license  MIT
596 */
597var ATTR_INVIEW = 'data-inview';
598var ATTR_ROOT = 'data-inview-root';
599var ATTR_MARGIN = 'data-inview-rootMargin';
600var ATTR_THRESHOLD = 'data-inview-threshold';
601var DEFAULT = {
602  root: null,
603  rootMargin: '0px',
604  threshold: 0
605};
606/**
607 * in view controller
608 */
609
610var _default = /*#__PURE__*/function () {
611  /**
612   * コンストラクタ
613   * ターゲット一覧を精査して、 data-inview-root、data-inview-rootMargin、data-inview-threshold が設定されていないか確認する。
614   * 上記属性毎に observer を作成する。
615   */
616  function _default(target) {
617    var _this = this;
618
619    var option = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
620
621    (0,_virtual_rollupPluginBabelHelpers_js__WEBPACK_IMPORTED_MODULE_0__.classCallCheck)(this, _default);
622
623    (0,_virtual_rollupPluginBabelHelpers_js__WEBPACK_IMPORTED_MODULE_0__.defineProperty)(this, "onInviewFunc", undefined);
624
625    (0,_virtual_rollupPluginBabelHelpers_js__WEBPACK_IMPORTED_MODULE_0__.defineProperty)(this, "targetList", void 0);
626
627    (0,_virtual_rollupPluginBabelHelpers_js__WEBPACK_IMPORTED_MODULE_0__.defineProperty)(this, "opt", void 0);
628
629    this.targetList = {};
630    this.opt = Object.assign(DEFAULT, option);
631    this.onInviewFunc = undefined;
632    document.querySelectorAll(target).forEach(function (target) {
633      _this.initTargetList(target);
634    });
635  }
636  /**
637   * ターゲットとオプションの管理リストを作成
638   */
639
640
641  (0,_virtual_rollupPluginBabelHelpers_js__WEBPACK_IMPORTED_MODULE_0__.createClass)(_default, [{
642    key: "initTargetList",
643    value: function initTargetList(target) {
644      // 監視対象エレメントに独自指定があればそちらを使う。
645      // 無ければオプション設定を使う
646      var root = target.getAttribute(ATTR_ROOT) || this.opt.root;
647      var rootMargin = target.getAttribute(ATTR_MARGIN) || this.opt.rootMargin;
648      var threshold = Number(target.getAttribute(ATTR_THRESHOLD)) || this.opt.threshold;
649      var key = "".concat(root, "-").concat(rootMargin, "-").concat(threshold);
650
651      if (key in this.targetList === false) {
652        var option = {
653          root: root,
654          rootMargin: rootMargin,
655          threshold: threshold
656        };
657        var observer = new IntersectionObserver(this.observerCallback.bind(this), option);
658        this.targetList[key] = {
659          list: [],
660          observer: observer
661        };
662      }
663
664      this.targetList[key].list.push(target);
665    }
666    /**
667     * スクロール検知処理を開始
668     */
669
670  }, {
671    key: "start",
672    value: function start() {
673      var _this2 = this;
674
675      Object.keys(this.targetList).forEach(function (key) {
676        var targetObj = _this2.targetList[key];
677        targetObj.list.forEach(function (target) {
678          targetObj.observer.observe(target);
679        });
680      });
681    }
682    /**
683     * 画面に入ったら ATTR_INVIEW のdata属性に true を入れる。
684     * オブザーバーから監視解除される。
685     */
686
687  }, {
688    key: "observerCallback",
689    value: function observerCallback(entries, observer) {
690      var _this3 = this;
691
692      entries.forEach(function (entry) {
693        if (!entry.isIntersecting) return; // inviewした時に実行する外部関数
694
695        if (_this3.onInviewFunc) {
696          _this3.onInviewFunc(entry.target);
697        }
698
699        observer.unobserve(entry.target);
700        entry.target.setAttribute(ATTR_INVIEW, 'true');
701      });
702    }
703  }]);
704
705  return _default;
706}();
707
708
709//# sourceMappingURL=index.js.map
710
711
712/***/ }),
713
vendor: 9,671 bytes, lines 714-968
714/***/ "./node_modules/@sygnas/vue-tabs/dist/vue-tabs.es.js":
715/*!***********************************************************!*\
716  !*** ./node_modules/@sygnas/vue-tabs/dist/vue-tabs.es.js ***!
717  \***********************************************************/
718/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
719
720"use strict";
721__webpack_require__.r(__webpack_exports__);
722/* harmony export */ __webpack_require__.d(__webpack_exports__, {
723/* harmony export */   VueTabs: function() { return /* binding */ _sfc_main$1; },
724/* harmony export */   VueTabsContent: function() { return /* binding */ _sfc_main; },
725/* harmony export */   useTabControl: function() { return /* binding */ useTabControl; }
726/* harmony export */ });
727/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ "./node_modules/vue/dist/vue.esm-bundler.js");
728
729
730const _hoisted_1$1 = ["target", "rel", "href", "data-active"];
731const _hoisted_2 = ["target", "rel", "href", "data-active"];
732const _sfc_main$2 = /* @__PURE__ */ (0,vue__WEBPACK_IMPORTED_MODULE_0__.defineComponent)({
733  props: {
734    activeId: null,
735    id: null,
736    href: null,
737    isBlank: { type: Boolean },
738    classItem: null,
739    classLink: null,
740    isListTag: { type: Boolean },
741    handlClick: null
742  },
743  setup(__props) {
744    const props = __props;
745    const isActive = (0,vue__WEBPACK_IMPORTED_MODULE_0__.computed)(() => {
746      if (props.href)
747        return false;
748      if (props.activeId === props.id)
749        return true;
750      return false;
751    });
752    const clickLink = (e) => {
753      if (props.href)
754        return true;
755      props.handlClick(props.id);
756      e.preventDefault();
757    };
758    return (_ctx, _cache) => {
759      return props.isListTag ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)("li", {
760        key: 0,
761        class: (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeClass)(props.classItem)
762      }, [
763        (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("a", {
764          target: props.isBlank ? "_blank" : "",
765          rel: props.isBlank ? "noopener noreferrer" : "",
766          href: props.href,
767          class: (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeClass)(props.classLink),
768          "data-active": (0,vue__WEBPACK_IMPORTED_MODULE_0__.unref)(isActive) ? "true" : "",
769          onClick: clickLink
770        }, [
771          (0,vue__WEBPACK_IMPORTED_MODULE_0__.renderSlot)(_ctx.$slots, "default")
772        ], 10, _hoisted_1$1)
773      ], 2)) : ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)("a", {
774        key: 1,
775        target: props.isBlank ? "_blank" : "",
776        rel: props.isBlank ? "noopener noreferrer" : "",
777        href: props.href,
778        class: (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeClass)(props.classLink),
779        "data-active": (0,vue__WEBPACK_IMPORTED_MODULE_0__.unref)(isActive) ? "true" : "",
780        onClick: clickLink
781      }, [
782        (0,vue__WEBPACK_IMPORTED_MODULE_0__.renderSlot)(_ctx.$slots, "default")
783      ], 10, _hoisted_2));
784    };
785  }
786});
787
788const EV_CHANGE = "change";
789const EV_CLICK = "click";
790const tabGroups = (0,vue__WEBPACK_IMPORTED_MODULE_0__.ref)([]);
791const $_getGroup = (groupId) => {
792  const group = tabGroups.value.find((group2) => group2.groupId === groupId);
793  if (group)
794    return group;
795  const newGroup = {
796    groupId,
797    activeId: "",
798    tabIdList: [],
799    intervalId: 0,
800    events: new EventTarget()
801  };
802  tabGroups.value.push(newGroup);
803  return tabGroups.value.find((group2) => group2.groupId === groupId);
804};
805function useTabControl(groupId, isMaster = false, useHash = false) {
806  return (() => {
807    const $_group = $_getGroup(groupId);
808    const activeId = (0,vue__WEBPACK_IMPORTED_MODULE_0__.computed)(() => {
809      return $_group.activeId;
810    });
811    const activeIndex = (0,vue__WEBPACK_IMPORTED_MODULE_0__.computed)(() => {
812      return $_group.tabIdList.indexOf($_group.activeId);
813    });
814    const setActiveId = (activeId2, isTabClick = false) => {
815      $_group.activeId = activeId2;
816      if (isTabClick) {
817        const event = new CustomEvent(EV_CLICK, { detail: activeId2 });
818        $_group.events.dispatchEvent(event);
819      }
820    };
821    const setTabIdList = (idList) => {
822      $_group.tabIdList = idList;
823    };
824    const changeNextTab = () => {
825      const nextIndex = (activeIndex.value + 1) % $_group.tabIdList.length;
826      setActiveId($_group.tabIdList[nextIndex]);
827    };
828    const changePrevTab = () => {
829      const index = activeIndex.value - 1;
830      const prevIndex = index <= -1 ? $_group.tabIdList.length - 1 : index;
831      setActiveId($_group.tabIdList[prevIndex]);
832    };
833    const addChangeListener = (func) => {
834      $_group.events.addEventListener(EV_CHANGE, func);
835    };
836    const addClickListener = (func) => {
837      $_group.events.addEventListener(EV_CLICK, func);
838    };
839    const startAutoChange = (time) => {
840      $_group.intervalId = setInterval(() => {
841        changeNextTab();
842      }, time);
843    };
844    const stopAutoChange = () => {
845      clearInterval($_group.intervalId);
846    };
847    (0,vue__WEBPACK_IMPORTED_MODULE_0__.watch)(activeId, () => {
848      if (isMaster) {
849        const event = new CustomEvent(EV_CHANGE, { detail: activeId.value });
850        $_group.events.dispatchEvent(event);
851      }
852      if (useHash && isMaster) {
853        location.hash = activeId.value;
854      }
855    });
856    return {
857      activeId,
858      activeIndex,
859      setActiveId,
860      setTabIdList,
861      changeNextTab,
862      changePrevTab,
863      startAutoChange,
864      stopAutoChange,
865      addChangeListener,
866      addClickListener
867    };
868  })();
869}
870
871const _hoisted_1 = ["innerHTML"];
872const _sfc_main$1 = /* @__PURE__ */ (0,vue__WEBPACK_IMPORTED_MODULE_0__.defineComponent)({
873  props: {
874    group: null,
875    default: { default: "" },
876    items: null,
877    useHash: { type: Boolean, default: false },
878    isListTag: { type: Boolean, default: false },
879    auto: null,
880    isStopAuto: { type: Boolean },
881    classTabs: { default: "c-tabmenu" },
882    classItem: { default: "c-tabmenu__item" },
883    classLink: { default: "c-tabmenu__link" }
884  },
885  setup(__props) {
886    const props = __props;
887    const tabControl = useTabControl(props.group, true, props.useHash);
888    const itemClicked = (id) => {
889      if (id === tabControl.activeId.value)
890        return;
891      tabControl.setActiveId(id, true);
892      if (props.isStopAuto) {
893        tabControl.stopAutoChange();
894      }
895    };
896    (0,vue__WEBPACK_IMPORTED_MODULE_0__.onMounted)(() => {
897      const idList = props.items.filter((item) => item.id).map((item) => item.id);
898      tabControl.setTabIdList(idList);
899      if (props.useHash && location.hash) {
900        tabControl.setActiveId(location.hash.substr(1));
901      } else {
902        tabControl.setActiveId(props.default);
903      }
904      if (props.auto && props.auto >= 1) {
905        tabControl.startAutoChange(props.auto);
906      }
907    });
908    (0,vue__WEBPACK_IMPORTED_MODULE_0__.onUnmounted)(() => {
909      tabControl.stopAutoChange();
910    });
911    return (_ctx, _cache) => {
912      return (0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createBlock)((0,vue__WEBPACK_IMPORTED_MODULE_0__.resolveDynamicComponent)(props.isListTag ? "ul" : "div"), {
913        class: (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeClass)(props.classTabs)
914      }, {
915        default: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withCtx)(() => [
916          ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(true), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(vue__WEBPACK_IMPORTED_MODULE_0__.Fragment, null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.renderList)(props.items, (item, index) => {
917            return (0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createBlock)(_sfc_main$2, {
918              id: item.id,
919              key: index,
920              "active-id": (0,vue__WEBPACK_IMPORTED_MODULE_0__.unref)(tabControl).activeId.value,
921              href: item.href || "",
922              "is-blank": item.isBlank || false,
923              "class-item": props.classItem,
924              "class-link": props.classLink,
925              "is-list-tag": props.isListTag,
926              "handl-click": itemClicked
927            }, {
928              default: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withCtx)(() => [
929                (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("span", {
930                  innerHTML: item.value
931                }, null, 8, _hoisted_1)
932              ]),
933              _: 2
934            }, 1032, ["id", "active-id", "href", "is-blank", "class-item", "class-link", "is-list-tag"]);
935          }), 128))
936        ]),
937        _: 1
938      }, 8, ["class"]);
939    };
940  }
941});
942
943const _sfc_main = /* @__PURE__ */ (0,vue__WEBPACK_IMPORTED_MODULE_0__.defineComponent)({
944  props: {
945    group: null,
946    tabId: null,
947    tag: { default: "div" }
948  },
949  setup(__props) {
950    const props = __props;
951    const tabControl = useTabControl(props.group);
952    return (_ctx, _cache) => {
953      return props.tabId === (0,vue__WEBPACK_IMPORTED_MODULE_0__.unref)(tabControl).activeId.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createBlock)((0,vue__WEBPACK_IMPORTED_MODULE_0__.resolveDynamicComponent)(props.tag), { key: 0 }, {
954        default: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withCtx)(() => [
955          (0,vue__WEBPACK_IMPORTED_MODULE_0__.renderSlot)(_ctx.$slots, "default")
956        ]),
957        _: 3
958      })) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)("", true);
959    };
960  }
961});
962
963
964//# sourceMappingURL=vue-tabs.es.js.map
965
966
967/***/ }),
968
vendor: 180,146 bytes, lines 969-6779
969/***/ "./node_modules/@vue/compiler-core/dist/compiler-core.esm-bundler.js":
970/*!***************************************************************************!*\
971  !*** ./node_modules/@vue/compiler-core/dist/compiler-core.esm-bundler.js ***!
972  \***************************************************************************/
973/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
974
975"use strict";
976__webpack_require__.r(__webpack_exports__);
977/* harmony export */ __webpack_require__.d(__webpack_exports__, {
978/* harmony export */   BASE_TRANSITION: function() { return /* binding */ BASE_TRANSITION; },
979/* harmony export */   BindingTypes: function() { return /* binding */ BindingTypes; },
980/* harmony export */   CAMELIZE: function() { return /* binding */ CAMELIZE; },
981/* harmony export */   CAPITALIZE: function() { return /* binding */ CAPITALIZE; },
982/* harmony export */   CREATE_BLOCK: function() { return /* binding */ CREATE_BLOCK; },
983/* harmony export */   CREATE_COMMENT: function() { return /* binding */ CREATE_COMMENT; },
984/* harmony export */   CREATE_ELEMENT_BLOCK: function() { return /* binding */ CREATE_ELEMENT_BLOCK; },
985/* harmony export */   CREATE_ELEMENT_VNODE: function() { return /* binding */ CREATE_ELEMENT_VNODE; },
986/* harmony export */   CREATE_SLOTS: function() { return /* binding */ CREATE_SLOTS; },
987/* harmony export */   CREATE_STATIC: function() { return /* binding */ CREATE_STATIC; },
988/* harmony export */   CREATE_TEXT: function() { return /* binding */ CREATE_TEXT; },
989/* harmony export */   CREATE_VNODE: function() { return /* binding */ CREATE_VNODE; },
990/* harmony export */   CompilerDeprecationTypes: function() { return /* binding */ CompilerDeprecationTypes; },
991/* harmony export */   ConstantTypes: function() { return /* binding */ ConstantTypes; },
992/* harmony export */   ElementTypes: function() { return /* binding */ ElementTypes; },
993/* harmony export */   ErrorCodes: function() { return /* binding */ ErrorCodes; },
994/* harmony export */   FRAGMENT: function() { return /* binding */ FRAGMENT; },
995/* harmony export */   GUARD_REACTIVE_PROPS: function() { return /* binding */ GUARD_REACTIVE_PROPS; },
996/* harmony export */   IS_MEMO_SAME: function() { return /* binding */ IS_MEMO_SAME; },
997/* harmony export */   IS_REF: function() { return /* binding */ IS_REF; },
998/* harmony export */   KEEP_ALIVE: function() { return /* binding */ KEEP_ALIVE; },
999/* harmony export */   MERGE_PROPS: function() { return /* binding */ MERGE_PROPS; },
1000/* harmony export */   NORMALIZE_CLASS: function() { return /* binding */ NORMALIZE_CLASS; },
1001/* harmony export */   NORMALIZE_PROPS: function() { return /* binding */ NORMALIZE_PROPS; },
1002/* harmony export */   NORMALIZE_STYLE: function() { return /* binding */ NORMALIZE_STYLE; },
1003/* harmony export */   Namespaces: function() { return /* binding */ Namespaces; },
1004/* harmony export */   NodeTypes: function() { return /* binding */ NodeTypes; },
1005/* harmony export */   OPEN_BLOCK: function() { return /* binding */ OPEN_BLOCK; },
1006/* harmony export */   POP_SCOPE_ID: function() { return /* binding */ POP_SCOPE_ID; },
1007/* harmony export */   PUSH_SCOPE_ID: function() { return /* binding */ PUSH_SCOPE_ID; },
1008/* harmony export */   RENDER_LIST: function() { return /* binding */ RENDER_LIST; },
1009/* harmony export */   RENDER_SLOT: function() { return /* binding */ RENDER_SLOT; },
1010/* harmony export */   RESOLVE_COMPONENT: function() { return /* binding */ RESOLVE_COMPONENT; },
1011/* harmony export */   RESOLVE_DIRECTIVE: function() { return /* binding */ RESOLVE_DIRECTIVE; },
1012/* harmony export */   RESOLVE_DYNAMIC_COMPONENT: function() { return /* binding */ RESOLVE_DYNAMIC_COMPONENT; },
1013/* harmony export */   RESOLVE_FILTER: function() { return /* binding */ RESOLVE_FILTER; },
1014/* harmony export */   SET_BLOCK_TRACKING: function() { return /* binding */ SET_BLOCK_TRACKING; },
1015/* harmony export */   SUSPENSE: function() { return /* binding */ SUSPENSE; },
1016/* harmony export */   TELEPORT: function() { return /* binding */ TELEPORT; },
1017/* harmony export */   TO_DISPLAY_STRING: function() { return /* binding */ TO_DISPLAY_STRING; },
1018/* harmony export */   TO_HANDLERS: function() { return /* binding */ TO_HANDLERS; },
1019/* harmony export */   TO_HANDLER_KEY: function() { return /* binding */ TO_HANDLER_KEY; },
1020/* harmony export */   TS_NODE_TYPES: function() { return /* binding */ TS_NODE_TYPES; },
1021/* harmony export */   UNREF: function() { return /* binding */ UNREF; },
1022/* harmony export */   WITH_CTX: function() { return /* binding */ WITH_CTX; },
1023/* harmony export */   WITH_DIRECTIVES: function() { return /* binding */ WITH_DIRECTIVES; },
1024/* harmony export */   WITH_MEMO: function() { return /* binding */ WITH_MEMO; },
1025/* harmony export */   advancePositionWithClone: function() { return /* binding */ advancePositionWithClone; },
1026/* harmony export */   advancePositionWithMutation: function() { return /* binding */ advancePositionWithMutation; },
1027/* harmony export */   assert: function() { return /* binding */ assert; },
1028/* harmony export */   baseCompile: function() { return /* binding */ baseCompile; },
1029/* harmony export */   baseParse: function() { return /* binding */ baseParse; },
1030/* harmony export */   buildDirectiveArgs: function() { return /* binding */ buildDirectiveArgs; },
1031/* harmony export */   buildProps: function() { return /* binding */ buildProps; },
1032/* harmony export */   buildSlots: function() { return /* binding */ buildSlots; },
1033/* harmony export */   checkCompatEnabled: function() { return /* binding */ checkCompatEnabled; },
1034/* harmony export */   convertToBlock: function() { return /* binding */ convertToBlock; },
1035/* harmony export */   createArrayExpression: function() { return /* binding */ createArrayExpression; },
1036/* harmony export */   createAssignmentExpression: function() { return /* binding */ createAssignmentExpression; },
1037/* harmony export */   createBlockStatement: function() { return /* binding */ createBlockStatement; },
1038/* harmony export */   createCacheExpression: function() { return /* binding */ createCacheExpression; },
1039/* harmony export */   createCallExpression: function() { return /* binding */ createCallExpression; },
1040/* harmony export */   createCompilerError: function() { return /* binding */ createCompilerError; },
1041/* harmony export */   createCompoundExpression: function() { return /* binding */ createCompoundExpression; },
1042/* harmony export */   createConditionalExpression: function() { return /* binding */ createConditionalExpression; },
1043/* harmony export */   createForLoopParams: function() { return /* binding */ createForLoopParams; },
1044/* harmony export */   createFunctionExpression: function() { return /* binding */ createFunctionExpression; },
1045/* harmony export */   createIfStatement: function() { return /* binding */ createIfStatement; },
1046/* harmony export */   createInterpolation: function() { return /* binding */ createInterpolation; },
1047/* harmony export */   createObjectExpression: function() { return /* binding */ createObjectExpression; },
1048/* harmony export */   createObjectProperty: function() { return /* binding */ createObjectProperty; },
1049/* harmony export */   createReturnStatement: function() { return /* binding */ createReturnStatement; },
1050/* harmony export */   createRoot: function() { return /* binding */ createRoot; },
1051/* harmony export */   createSequenceExpression: function() { return /* binding */ createSequenceExpression; },
1052/* harmony export */   createSimpleExpression: function() { return /* binding */ createSimpleExpression; },
1053/* harmony export */   createStructuralDirectiveTransform: function() { return /* binding */ createStructuralDirectiveTransform; },
1054/* harmony export */   createTemplateLiteral: function() { return /* binding */ createTemplateLiteral; },
1055/* harmony export */   createTransformContext: function() { return /* binding */ createTransformContext; },
1056/* harmony export */   createVNodeCall: function() { return /* binding */ createVNodeCall; },
1057/* harmony export */   errorMessages: function() { return /* binding */ errorMessages; },
1058/* harmony export */   extractIdentifiers: function() { return /* binding */ extractIdentifiers; },
1059/* harmony export */   findDir: function() { return /* binding */ findDir; },
1060/* harmony export */   findProp: function() { return /* binding */ findProp; },
1061/* harmony export */   forAliasRE: function() { return /* binding */ forAliasRE; },
1062/* harmony export */   generate: function() { return /* binding */ generate; },
1063/* harmony export */   generateCodeFrame: function() { return /* reexport safe */ _vue_shared__WEBPACK_IMPORTED_MODULE_0__.generateCodeFrame; },
1064/* harmony export */   getBaseTransformPreset: function() { return /* binding */ getBaseTransformPreset; },
1065/* harmony export */   getConstantType: function() { return /* binding */ getConstantType; },
1066/* harmony export */   getMemoedVNodeCall: function() { return /* binding */ getMemoedVNodeCall; },
1067/* harmony export */   getVNodeBlockHelper: function() { return /* binding */ getVNodeBlockHelper; },
1068/* harmony export */   getVNodeHelper: function() { return /* binding */ getVNodeHelper; },
1069/* harmony export */   hasDynamicKeyVBind: function() { return /* binding */ hasDynamicKeyVBind; },
1070/* harmony export */   hasScopeRef: function() { return /* binding */ hasScopeRef; },
1071/* harmony export */   helperNameMap: function() { return /* binding */ helperNameMap; },
1072/* harmony export */   injectProp: function() { return /* binding */ injectProp; },
1073/* harmony export */   isCoreComponent: function() { return /* binding */ isCoreComponent; },
1074/* harmony export */   isFunctionType: function() { return /* binding */ isFunctionType; },
1075/* harmony export */   isInDestructureAssignment: function() { return /* binding */ isInDestructureAssignment; },
1076/* harmony export */   isInNewExpression: function() { return /* binding */ isInNewExpression; },
1077/* harmony export */   isMemberExpression: function() { return /* binding */ isMemberExpression; },
1078/* harmony export */   isMemberExpressionBrowser: function() { return /* binding */ isMemberExpressionBrowser; },
1079/* harmony export */   isMemberExpressionNode: function() { return /* binding */ isMemberExpressionNode; },
1080/* harmony export */   isReferencedIdentifier: function() { return /* binding */ isReferencedIdentifier; },
1081/* harmony export */   isSimpleIdentifier: function() { return /* binding */ isSimpleIdentifier; },
1082/* harmony export */   isSlotOutlet: function() { return /* binding */ isSlotOutlet; },
1083/* harmony export */   isStaticArgOf: function() { return /* binding */ isStaticArgOf; },
1084/* harmony export */   isStaticExp: function() { return /* binding */ isStaticExp; },
1085/* harmony export */   isStaticProperty: function() { return /* binding */ isStaticProperty; },
1086/* harmony export */   isStaticPropertyKey: function() { return /* binding */ isStaticPropertyKey; },
1087/* harmony export */   isTemplateNode: function() { return /* binding */ isTemplateNode; },
1088/* harmony export */   isText: function() { return /* binding */ isText$1; },
1089/* harmony export */   isVSlot: function() { return /* binding */ isVSlot; },
1090/* harmony export */   locStub: function() { return /* binding */ locStub; },
1091/* harmony export */   noopDirectiveTransform: function() { return /* binding */ noopDirectiveTransform; },
1092/* harmony export */   processExpression: function() { return /* binding */ processExpression; },
1093/* harmony export */   processFor: function() { return /* binding */ processFor; },
1094/* harmony export */   processIf: function() { return /* binding */ processIf; },
1095/* harmony export */   processSlotOutlet: function() { return /* binding */ processSlotOutlet; },
1096/* harmony export */   registerRuntimeHelpers: function() { return /* binding */ registerRuntimeHelpers; },
1097/* harmony export */   resolveComponentType: function() { return /* binding */ resolveComponentType; },
1098/* harmony export */   stringifyExpression: function() { return /* binding */ stringifyExpression; },
1099/* harmony export */   toValidAssetId: function() { return /* binding */ toValidAssetId; },
1100/* harmony export */   trackSlotScopes: function() { return /* binding */ trackSlotScopes; },
1101/* harmony export */   trackVForSlotScopes: function() { return /* binding */ trackVForSlotScopes; },
1102/* harmony export */   transform: function() { return /* binding */ transform; },
1103/* harmony export */   transformBind: function() { return /* binding */ transformBind; },
1104/* harmony export */   transformElement: function() { return /* binding */ transformElement; },
1105/* harmony export */   transformExpression: function() { return /* binding */ transformExpression; },
1106/* harmony export */   transformModel: function() { return /* binding */ transformModel; },
1107/* harmony export */   transformOn: function() { return /* binding */ transformOn; },
1108/* harmony export */   traverseNode: function() { return /* binding */ traverseNode; },
1109/* harmony export */   unwrapTSNode: function() { return /* binding */ unwrapTSNode; },
1110/* harmony export */   walkBlockDeclarations: function() { return /* binding */ walkBlockDeclarations; },
1111/* harmony export */   walkFunctionParams: function() { return /* binding */ walkFunctionParams; },
1112/* harmony export */   walkIdentifiers: function() { return /* binding */ walkIdentifiers; },
1113/* harmony export */   warnDeprecation: function() { return /* binding */ warnDeprecation; }
1114/* harmony export */ });
1115/* harmony import */ var _vue_shared__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @vue/shared */ "./node_modules/@vue/shared/dist/shared.esm-bundler.js");
1116/**
1117* @vue/compiler-core v3.4.34
1118* (c) 2018-present Yuxi (Evan) You and Vue contributors
1119* @license MIT
1120**/
1121
1122
1123
1124const FRAGMENT = Symbol( true ? `Fragment` : 0);
1125const TELEPORT = Symbol( true ? `Teleport` : 0);
1126const SUSPENSE = Symbol( true ? `Suspense` : 0);
1127const KEEP_ALIVE = Symbol( true ? `KeepAlive` : 0);
1128const BASE_TRANSITION = Symbol( true ? `BaseTransition` : 0);
1129const OPEN_BLOCK = Symbol( true ? `openBlock` : 0);
1130const CREATE_BLOCK = Symbol( true ? `createBlock` : 0);
1131const CREATE_ELEMENT_BLOCK = Symbol( true ? `createElementBlock` : 0);
1132const CREATE_VNODE = Symbol( true ? `createVNode` : 0);
1133const CREATE_ELEMENT_VNODE = Symbol( true ? `createElementVNode` : 0);
1134const CREATE_COMMENT = Symbol( true ? `createCommentVNode` : 0);
1135const CREATE_TEXT = Symbol( true ? `createTextVNode` : 0);
1136const CREATE_STATIC = Symbol( true ? `createStaticVNode` : 0);
1137const RESOLVE_COMPONENT = Symbol( true ? `resolveComponent` : 0);
1138const RESOLVE_DYNAMIC_COMPONENT = Symbol(
1139   true ? `resolveDynamicComponent` : 0
1140);
1141const RESOLVE_DIRECTIVE = Symbol( true ? `resolveDirective` : 0);
1142const RESOLVE_FILTER = Symbol( true ? `resolveFilter` : 0);
1143const WITH_DIRECTIVES = Symbol( true ? `withDirectives` : 0);
1144const RENDER_LIST = Symbol( true ? `renderList` : 0);
1145const RENDER_SLOT = Symbol( true ? `renderSlot` : 0);
1146const CREATE_SLOTS = Symbol( true ? `createSlots` : 0);
1147const TO_DISPLAY_STRING = Symbol( true ? `toDisplayString` : 0);
1148const MERGE_PROPS = Symbol( true ? `mergeProps` : 0);
1149const NORMALIZE_CLASS = Symbol( true ? `normalizeClass` : 0);
1150const NORMALIZE_STYLE = Symbol( true ? `normalizeStyle` : 0);
1151const NORMALIZE_PROPS = Symbol( true ? `normalizeProps` : 0);
1152const GUARD_REACTIVE_PROPS = Symbol( true ? `guardReactiveProps` : 0);
1153const TO_HANDLERS = Symbol( true ? `toHandlers` : 0);
1154const CAMELIZE = Symbol( true ? `camelize` : 0);
1155const CAPITALIZE = Symbol( true ? `capitalize` : 0);
1156const TO_HANDLER_KEY = Symbol( true ? `toHandlerKey` : 0);
1157const SET_BLOCK_TRACKING = Symbol( true ? `setBlockTracking` : 0);
1158const PUSH_SCOPE_ID = Symbol( true ? `pushScopeId` : 0);
1159const POP_SCOPE_ID = Symbol( true ? `popScopeId` : 0);
1160const WITH_CTX = Symbol( true ? `withCtx` : 0);
1161const UNREF = Symbol( true ? `unref` : 0);
1162const IS_REF = Symbol( true ? `isRef` : 0);
1163const WITH_MEMO = Symbol( true ? `withMemo` : 0);
1164const IS_MEMO_SAME = Symbol( true ? `isMemoSame` : 0);
1165const helperNameMap = {
1166  [FRAGMENT]: `Fragment`,
1167  [TELEPORT]: `Teleport`,
1168  [SUSPENSE]: `Suspense`,
1169  [KEEP_ALIVE]: `KeepAlive`,
1170  [BASE_TRANSITION]: `BaseTransition`,
1171  [OPEN_BLOCK]: `openBlock`,
1172  [CREATE_BLOCK]: `createBlock`,
1173  [CREATE_ELEMENT_BLOCK]: `createElementBlock`,
1174  [CREATE_VNODE]: `createVNode`,
1175  [CREATE_ELEMENT_VNODE]: `createElementVNode`,
1176  [CREATE_COMMENT]: `createCommentVNode`,
1177  [CREATE_TEXT]: `createTextVNode`,
1178  [CREATE_STATIC]: `createStaticVNode`,
1179  [RESOLVE_COMPONENT]: `resolveComponent`,
1180  [RESOLVE_DYNAMIC_COMPONENT]: `resolveDynamicComponent`,
1181  [RESOLVE_DIRECTIVE]: `resolveDirective`,
1182  [RESOLVE_FILTER]: `resolveFilter`,
1183  [WITH_DIRECTIVES]: `withDirectives`,
1184  [RENDER_LIST]: `renderList`,
1185  [RENDER_SLOT]: `renderSlot`,
1186  [CREATE_SLOTS]: `createSlots`,
1187  [TO_DISPLAY_STRING]: `toDisplayString`,
1188  [MERGE_PROPS]: `mergeProps`,
1189  [NORMALIZE_CLASS]: `normalizeClass`,
1190  [NORMALIZE_STYLE]: `normalizeStyle`,
1191  [NORMALIZE_PROPS]: `normalizeProps`,
1192  [GUARD_REACTIVE_PROPS]: `guardReactiveProps`,
1193  [TO_HANDLERS]: `toHandlers`,
1194  [CAMELIZE]: `camelize`,
1195  [CAPITALIZE]: `capitalize`,
1196  [TO_HANDLER_KEY]: `toHandlerKey`,
1197  [SET_BLOCK_TRACKING]: `setBlockTracking`,
1198  [PUSH_SCOPE_ID]: `pushScopeId`,
1199  [POP_SCOPE_ID]: `popScopeId`,
1200  [WITH_CTX]: `withCtx`,
1201  [UNREF]: `unref`,
1202  [IS_REF]: `isRef`,
1203  [WITH_MEMO]: `withMemo`,
1204  [IS_MEMO_SAME]: `isMemoSame`
1205};
1206function registerRuntimeHelpers(helpers) {
1207  Object.getOwnPropertySymbols(helpers).forEach((s) => {
1208    helperNameMap[s] = helpers[s];
1209  });
1210}
1211
1212const Namespaces = {
1213  "HTML": 0,
1214  "0": "HTML",
1215  "SVG": 1,
1216  "1": "SVG",
1217  "MATH_ML": 2,
1218  "2": "MATH_ML"
1219};
1220const NodeTypes = {
1221  "ROOT": 0,
1222  "0": "ROOT",
1223  "ELEMENT": 1,
1224  "1": "ELEMENT",
1225  "TEXT": 2,
1226  "2": "TEXT",
1227  "COMMENT": 3,
1228  "3": "COMMENT",
1229  "SIMPLE_EXPRESSION": 4,
1230  "4": "SIMPLE_EXPRESSION",
1231  "INTERPOLATION": 5,
1232  "5": "INTERPOLATION",
1233  "ATTRIBUTE": 6,
1234  "6": "ATTRIBUTE",
1235  "DIRECTIVE": 7,
1236  "7": "DIRECTIVE",
1237  "COMPOUND_EXPRESSION": 8,
1238  "8": "COMPOUND_EXPRESSION",
1239  "IF": 9,
1240  "9": "IF",
1241  "IF_BRANCH": 10,
1242  "10": "IF_BRANCH",
1243  "FOR": 11,
1244  "11": "FOR",
1245  "TEXT_CALL": 12,
1246  "12": "TEXT_CALL",
1247  "VNODE_CALL": 13,
1248  "13": "VNODE_CALL",
1249  "JS_CALL_EXPRESSION": 14,
1250  "14": "JS_CALL_EXPRESSION",
1251  "JS_OBJECT_EXPRESSION": 15,
1252  "15": "JS_OBJECT_EXPRESSION",
1253  "JS_PROPERTY": 16,
1254  "16": "JS_PROPERTY",
1255  "JS_ARRAY_EXPRESSION": 17,
1256  "17": "JS_ARRAY_EXPRESSION",
1257  "JS_FUNCTION_EXPRESSION": 18,
1258  "18": "JS_FUNCTION_EXPRESSION",
1259  "JS_CONDITIONAL_EXPRESSION": 19,
1260  "19": "JS_CONDITIONAL_EXPRESSION",
1261  "JS_CACHE_EXPRESSION": 20,
1262  "20": "JS_CACHE_EXPRESSION",
1263  "JS_BLOCK_STATEMENT": 21,
1264  "21": "JS_BLOCK_STATEMENT",
1265  "JS_TEMPLATE_LITERAL": 22,
1266  "22": "JS_TEMPLATE_LITERAL",
1267  "JS_IF_STATEMENT": 23,
1268  "23": "JS_IF_STATEMENT",
1269  "JS_ASSIGNMENT_EXPRESSION": 24,
1270  "24": "JS_ASSIGNMENT_EXPRESSION",
1271  "JS_SEQUENCE_EXPRESSION": 25,
1272  "25": "JS_SEQUENCE_EXPRESSION",
1273  "JS_RETURN_STATEMENT": 26,
1274  "26": "JS_RETURN_STATEMENT"
1275};
1276const ElementTypes = {
1277  "ELEMENT": 0,
1278  "0": "ELEMENT",
1279  "COMPONENT": 1,
1280  "1": "COMPONENT",
1281  "SLOT": 2,
1282  "2": "SLOT",
1283  "TEMPLATE": 3,
1284  "3": "TEMPLATE"
1285};
1286const ConstantTypes = {
1287  "NOT_CONSTANT": 0,
1288  "0": "NOT_CONSTANT",
1289  "CAN_SKIP_PATCH": 1,
1290  "1": "CAN_SKIP_PATCH",
1291  "CAN_HOIST": 2,
1292  "2": "CAN_HOIST",
1293  "CAN_STRINGIFY": 3,
1294  "3": "CAN_STRINGIFY"
1295};
1296const locStub = {
1297  start: { line: 1, column: 1, offset: 0 },
1298  end: { line: 1, column: 1, offset: 0 },
1299  source: ""
1300};
1301function createRoot(children, source = "") {
1302  return {
1303    type: 0,
1304    source,
1305    children,
1306    helpers: /* @__PURE__ */ new Set(),
1307    components: [],
1308    directives: [],
1309    hoists: [],
1310    imports: [],
1311    cached: 0,
1312    temps: 0,
1313    codegenNode: void 0,
1314    loc: locStub
1315  };
1316}
1317function createVNodeCall(context, tag, props, children, patchFlag, dynamicProps, directives, isBlock = false, disableTracking = false, isComponent = false, loc = locStub) {
1318  if (context) {
1319    if (isBlock) {
1320      context.helper(OPEN_BLOCK);
1321      context.helper(getVNodeBlockHelper(context.inSSR, isComponent));
1322    } else {
1323      context.helper(getVNodeHelper(context.inSSR, isComponent));
1324    }
1325    if (directives) {
1326      context.helper(WITH_DIRECTIVES);
1327    }
1328  }
1329  return {
1330    type: 13,
1331    tag,
1332    props,
1333    children,
1334    patchFlag,
1335    dynamicProps,
1336    directives,
1337    isBlock,
1338    disableTracking,
1339    isComponent,
1340    loc
1341  };
1342}
1343function createArrayExpression(elements, loc = locStub) {
1344  return {
1345    type: 17,
1346    loc,
1347    elements
1348  };
1349}
1350function createObjectExpression(properties, loc = locStub) {
1351  return {
1352    type: 15,
1353    loc,
1354    properties
1355  };
1356}
1357function createObjectProperty(key, value) {
1358  return {
1359    type: 16,
1360    loc: locStub,
1361    key: (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isString)(key) ? createSimpleExpression(key, true) : key,
1362    value
1363  };
1364}
1365function createSimpleExpression(content, isStatic = false, loc = locStub, constType = 0) {
1366  return {
1367    type: 4,
1368    loc,
1369    content,
1370    isStatic,
1371    constType: isStatic ? 3 : constType
1372  };
1373}
1374function createInterpolation(content, loc) {
1375  return {
1376    type: 5,
1377    loc,
1378    content: (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isString)(content) ? createSimpleExpression(content, false, loc) : content
1379  };
1380}
1381function createCompoundExpression(children, loc = locStub) {
1382  return {
1383    type: 8,
1384    loc,
1385    children
1386  };
1387}
1388function createCallExpression(callee, args = [], loc = locStub) {
1389  return {
1390    type: 14,
1391    loc,
1392    callee,
1393    arguments: args
1394  };
1395}
1396function createFunctionExpression(params, returns = void 0, newline = false, isSlot = false, loc = locStub) {
1397  return {
1398    type: 18,
1399    params,
1400    returns,
1401    newline,
1402    isSlot,
1403    loc
1404  };
1405}
1406function createConditionalExpression(test, consequent, alternate, newline = true) {
1407  return {
1408    type: 19,
1409    test,
1410    consequent,
1411    alternate,
1412    newline,
1413    loc: locStub
1414  };
1415}
1416function createCacheExpression(index, value, isVOnce = false) {
1417  return {
1418    type: 20,
1419    index,
1420    value,
1421    isVOnce,
1422    loc: locStub
1423  };
1424}
1425function createBlockStatement(body) {
1426  return {
1427    type: 21,
1428    body,
1429    loc: locStub
1430  };
1431}
1432function createTemplateLiteral(elements) {
1433  return {
1434    type: 22,
1435    elements,
1436    loc: locStub
1437  };
1438}
1439function createIfStatement(test, consequent, alternate) {
1440  return {
1441    type: 23,
1442    test,
1443    consequent,
1444    alternate,
1445    loc: locStub
1446  };
1447}
1448function createAssignmentExpression(left, right) {
1449  return {
1450    type: 24,
1451    left,
1452    right,
1453    loc: locStub
1454  };
1455}
1456function createSequenceExpression(expressions) {
1457  return {
1458    type: 25,
1459    expressions,
1460    loc: locStub
1461  };
1462}
1463function createReturnStatement(returns) {
1464  return {
1465    type: 26,
1466    returns,
1467    loc: locStub
1468  };
1469}
1470function getVNodeHelper(ssr, isComponent) {
1471  return ssr || isComponent ? CREATE_VNODE : CREATE_ELEMENT_VNODE;
1472}
1473function getVNodeBlockHelper(ssr, isComponent) {
1474  return ssr || isComponent ? CREATE_BLOCK : CREATE_ELEMENT_BLOCK;
1475}
1476function convertToBlock(node, { helper, removeHelper, inSSR }) {
1477  if (!node.isBlock) {
1478    node.isBlock = true;
1479    removeHelper(getVNodeHelper(inSSR, node.isComponent));
1480    helper(OPEN_BLOCK);
1481    helper(getVNodeBlockHelper(inSSR, node.isComponent));
1482  }
1483}
1484
1485const defaultDelimitersOpen = new Uint8Array([123, 123]);
1486const defaultDelimitersClose = new Uint8Array([125, 125]);
1487function isTagStartChar(c) {
1488  return c >= 97 && c <= 122 || c >= 65 && c <= 90;
1489}
1490function isWhitespace(c) {
1491  return c === 32 || c === 10 || c === 9 || c === 12 || c === 13;
1492}
1493function isEndOfTagSection(c) {
1494  return c === 47 || c === 62 || isWhitespace(c);
1495}
1496function toCharCodes(str) {
1497  const ret = new Uint8Array(str.length);
1498  for (let i = 0; i < str.length; i++) {
1499    ret[i] = str.charCodeAt(i);
1500  }
1501  return ret;
1502}
1503const Sequences = {
1504  Cdata: new Uint8Array([67, 68, 65, 84, 65, 91]),
1505  // CDATA[
1506  CdataEnd: new Uint8Array([93, 93, 62]),
1507  // ]]>
1508  CommentEnd: new Uint8Array([45, 45, 62]),
1509  // `-->`
1510  ScriptEnd: new Uint8Array([60, 47, 115, 99, 114, 105, 112, 116]),
1511  // `<\/script`
1512  StyleEnd: new Uint8Array([60, 47, 115, 116, 121, 108, 101]),
1513  // `</style`
1514  TitleEnd: new Uint8Array([60, 47, 116, 105, 116, 108, 101]),
1515  // `</title`
1516  TextareaEnd: new Uint8Array([
1517    60,
1518    47,
1519    116,
1520    101,
1521    120,
1522    116,
1523    97,
1524    114,
1525    101,
1526    97
1527  ])
1528  // `</textarea
1529};
1530class Tokenizer {
1531  constructor(stack, cbs) {
1532    this.stack = stack;
1533    this.cbs = cbs;
1534    /** The current state the tokenizer is in. */
1535    this.state = 1;
1536    /** The read buffer. */
1537    this.buffer = "";
1538    /** The beginning of the section that is currently being read. */
1539    this.sectionStart = 0;
1540    /** The index within the buffer that we are currently looking at. */
1541    this.index = 0;
1542    /** The start of the last entity. */
1543    this.entityStart = 0;
1544    /** Some behavior, eg. when decoding entities, is done while we are in another state. This keeps track of the other state type. */
1545    this.baseState = 1;
1546    /** For special parsing behavior inside of script and style tags. */
1547    this.inRCDATA = false;
1548    /** For disabling RCDATA tags handling */
1549    this.inXML = false;
1550    /** For disabling interpolation parsing in v-pre */
1551    this.inVPre = false;
1552    /** Record newline positions for fast line / column calculation */
1553    this.newlines = [];
1554    this.mode = 0;
1555    this.delimiterOpen = defaultDelimitersOpen;
1556    this.delimiterClose = defaultDelimitersClose;
1557    this.delimiterIndex = -1;
1558    this.currentSequence = void 0;
1559    this.sequenceIndex = 0;
1560  }
1561  get inSFCRoot() {
1562    return this.mode === 2 && this.stack.length === 0;
1563  }
1564  reset() {
1565    this.state = 1;
1566    this.mode = 0;
1567    this.buffer = "";
1568    this.sectionStart = 0;
1569    this.index = 0;
1570    this.baseState = 1;
1571    this.inRCDATA = false;
1572    this.currentSequence = void 0;
1573    this.newlines.length = 0;
1574    this.delimiterOpen = defaultDelimitersOpen;
1575    this.delimiterClose = defaultDelimitersClose;
1576  }
1577  /**
1578   * Generate Position object with line / column information using recorded
1579   * newline positions. We know the index is always going to be an already
1580   * processed index, so all the newlines up to this index should have been
1581   * recorded.
1582   */
1583  getPos(index) {
1584    let line = 1;
1585    let column = index + 1;
1586    for (let i = this.newlines.length - 1; i >= 0; i--) {
1587      const newlineIndex = this.newlines[i];
1588      if (index > newlineIndex) {
1589        line = i + 2;
1590        column = index - newlineIndex;
1591        break;
1592      }
1593    }
1594    return {
1595      column,
1596      line,
1597      offset: index
1598    };
1599  }
1600  peek() {
1601    return this.buffer.charCodeAt(this.index + 1);
1602  }
1603  stateText(c) {
1604    if (c === 60) {
1605      if (this.index > this.sectionStart) {
1606        this.cbs.ontext(this.sectionStart, this.index);
1607      }
1608      this.state = 5;
1609      this.sectionStart = this.index;
1610    } else if (!this.inVPre && c === this.delimiterOpen[0]) {
1611      this.state = 2;
1612      this.delimiterIndex = 0;
1613      this.stateInterpolationOpen(c);
1614    }
1615  }
1616  stateInterpolationOpen(c) {
1617    if (c === this.delimiterOpen[this.delimiterIndex]) {
1618      if (this.delimiterIndex === this.delimiterOpen.length - 1) {
1619        const start = this.index + 1 - this.delimiterOpen.length;
1620        if (start > this.sectionStart) {
1621          this.cbs.ontext(this.sectionStart, start);
1622        }
1623        this.state = 3;
1624        this.sectionStart = start;
1625      } else {
1626        this.delimiterIndex++;
1627      }
1628    } else if (this.inRCDATA) {
1629      this.state = 32;
1630      this.stateInRCDATA(c);
1631    } else {
1632      this.state = 1;
1633      this.stateText(c);
1634    }
1635  }
1636  stateInterpolation(c) {
1637    if (c === this.delimiterClose[0]) {
1638      this.state = 4;
1639      this.delimiterIndex = 0;
1640      this.stateInterpolationClose(c);
1641    }
1642  }
1643  stateInterpolationClose(c) {
1644    if (c === this.delimiterClose[this.delimiterIndex]) {
1645      if (this.delimiterIndex === this.delimiterClose.length - 1) {
1646        this.cbs.oninterpolation(this.sectionStart, this.index + 1);
1647        if (this.inRCDATA) {
1648          this.state = 32;
1649        } else {
1650          this.state = 1;
1651        }
1652        this.sectionStart = this.index + 1;
1653      } else {
1654        this.delimiterIndex++;
1655      }
1656    } else {
1657      this.state = 3;
1658      this.stateInterpolation(c);
1659    }
1660  }
1661  stateSpecialStartSequence(c) {
1662    const isEnd = this.sequenceIndex === this.currentSequence.length;
1663    const isMatch = isEnd ? (
1664      // If we are at the end of the sequence, make sure the tag name has ended
1665      isEndOfTagSection(c)
1666    ) : (
1667      // Otherwise, do a case-insensitive comparison
1668      (c | 32) === this.currentSequence[this.sequenceIndex]
1669    );
1670    if (!isMatch) {
1671      this.inRCDATA = false;
1672    } else if (!isEnd) {
1673      this.sequenceIndex++;
1674      return;
1675    }
1676    this.sequenceIndex = 0;
1677    this.state = 6;
1678    this.stateInTagName(c);
1679  }
1680  /** Look for an end tag. For <title> and <textarea>, also decode entities. */
1681  stateInRCDATA(c) {
1682    if (this.sequenceIndex === this.currentSequence.length) {
1683      if (c === 62 || isWhitespace(c)) {
1684        const endOfText = this.index - this.currentSequence.length;
1685        if (this.sectionStart < endOfText) {
1686          const actualIndex = this.index;
1687          this.index = endOfText;
1688          this.cbs.ontext(this.sectionStart, endOfText);
1689          this.index = actualIndex;
1690        }
1691        this.sectionStart = endOfText + 2;
1692        this.stateInClosingTagName(c);
1693        this.inRCDATA = false;
1694        return;
1695      }
1696      this.sequenceIndex = 0;
1697    }
1698    if ((c | 32) === this.currentSequence[this.sequenceIndex]) {
1699      this.sequenceIndex += 1;
1700    } else if (this.sequenceIndex === 0) {
1701      if (this.currentSequence === Sequences.TitleEnd || this.currentSequence === Sequences.TextareaEnd && !this.inSFCRoot) {
1702        if (c === this.delimiterOpen[0]) {
1703          this.state = 2;
1704          this.delimiterIndex = 0;
1705          this.stateInterpolationOpen(c);
1706        }
1707      } else if (this.fastForwardTo(60)) {
1708        this.sequenceIndex = 1;
1709      }
1710    } else {
1711      this.sequenceIndex = Number(c === 60);
1712    }
1713  }
1714  stateCDATASequence(c) {
1715    if (c === Sequences.Cdata[this.sequenceIndex]) {
1716      if (++this.sequenceIndex === Sequences.Cdata.length) {
1717        this.state = 28;
1718        this.currentSequence = Sequences.CdataEnd;
1719        this.sequenceIndex = 0;
1720        this.sectionStart = this.index + 1;
1721      }
1722    } else {
1723      this.sequenceIndex = 0;
1724      this.state = 23;
1725      this.stateInDeclaration(c);
1726    }
1727  }
1728  /**
1729   * When we wait for one specific character, we can speed things up
1730   * by skipping through the buffer until we find it.
1731   *
1732   * @returns Whether the character was found.
1733   */
1734  fastForwardTo(c) {
1735    while (++this.index < this.buffer.length) {
1736      const cc = this.buffer.charCodeAt(this.index);
1737      if (cc === 10) {
1738        this.newlines.push(this.index);
1739      }
1740      if (cc === c) {
1741        return true;
1742      }
1743    }
1744    this.index = this.buffer.length - 1;
1745    return false;
1746  }
1747  /**
1748   * Comments and CDATA end with `-->` and `]]>`.
1749   *
1750   * Their common qualities are:
1751   * - Their end sequences have a distinct character they start with.
1752   * - That character is then repeated, so we have to check multiple repeats.
1753   * - All characters but the start character of the sequence can be skipped.
1754   */
1755  stateInCommentLike(c) {
1756    if (c === this.currentSequence[this.sequenceIndex]) {
1757      if (++this.sequenceIndex === this.currentSequence.length) {
1758        if (this.currentSequence === Sequences.CdataEnd) {
1759          this.cbs.oncdata(this.sectionStart, this.index - 2);
1760        } else {
1761          this.cbs.oncomment(this.sectionStart, this.index - 2);
1762        }
1763        this.sequenceIndex = 0;
1764        this.sectionStart = this.index + 1;
1765        this.state = 1;
1766      }
1767    } else if (this.sequenceIndex === 0) {
1768      if (this.fastForwardTo(this.currentSequence[0])) {
1769        this.sequenceIndex = 1;
1770      }
1771    } else if (c !== this.currentSequence[this.sequenceIndex - 1]) {
1772      this.sequenceIndex = 0;
1773    }
1774  }
1775  startSpecial(sequence, offset) {
1776    this.enterRCDATA(sequence, offset);
1777    this.state = 31;
1778  }
1779  enterRCDATA(sequence, offset) {
1780    this.inRCDATA = true;
1781    this.currentSequence = sequence;
1782    this.sequenceIndex = offset;
1783  }
1784  stateBeforeTagName(c) {
1785    if (c === 33) {
1786      this.state = 22;
1787      this.sectionStart = this.index + 1;
1788    } else if (c === 63) {
1789      this.state = 24;
1790      this.sectionStart = this.index + 1;
1791    } else if (isTagStartChar(c)) {
1792      this.sectionStart = this.index;
1793      if (this.mode === 0) {
1794        this.state = 6;
1795      } else if (this.inSFCRoot) {
1796        this.state = 34;
1797      } else if (!this.inXML) {
1798        if (c === 116) {
1799          this.state = 30;
1800        } else {
1801          this.state = c === 115 ? 29 : 6;
1802        }
1803      } else {
1804        this.state = 6;
1805      }
1806    } else if (c === 47) {
1807      this.state = 8;
1808    } else {
1809      this.state = 1;
1810      this.stateText(c);
1811    }
1812  }
1813  stateInTagName(c) {
1814    if (isEndOfTagSection(c)) {
1815      this.handleTagName(c);
1816    }
1817  }
1818  stateInSFCRootTagName(c) {
1819    if (isEndOfTagSection(c)) {
1820      const tag = this.buffer.slice(this.sectionStart, this.index);
1821      if (tag !== "template") {
1822        this.enterRCDATA(toCharCodes(`</` + tag), 0);
1823      }
1824      this.handleTagName(c);
1825    }
1826  }
1827  handleTagName(c) {
1828    this.cbs.onopentagname(this.sectionStart, this.index);
1829    this.sectionStart = -1;
1830    this.state = 11;
1831    this.stateBeforeAttrName(c);
1832  }
1833  stateBeforeClosingTagName(c) {
1834    if (isWhitespace(c)) ; else if (c === 62) {
1835      if (true) {
1836        this.cbs.onerr(14, this.index);
1837      }
1838      this.state = 1;
1839      this.sectionStart = this.index + 1;
1840    } else {
1841      this.state = isTagStartChar(c) ? 9 : 27;
1842      this.sectionStart = this.index;
1843    }
1844  }
1845  stateInClosingTagName(c) {
1846    if (c === 62 || isWhitespace(c)) {
1847      this.cbs.onclosetag(this.sectionStart, this.index);
1848      this.sectionStart = -1;
1849      this.state = 10;
1850      this.stateAfterClosingTagName(c);
1851    }
1852  }
1853  stateAfterClosingTagName(c) {
1854    if (c === 62) {
1855      this.state = 1;
1856      this.sectionStart = this.index + 1;
1857    }
1858  }
1859  stateBeforeAttrName(c) {
1860    if (c === 62) {
1861      this.cbs.onopentagend(this.index);
1862      if (this.inRCDATA) {
1863        this.state = 32;
1864      } else {
1865        this.state = 1;
1866      }
1867      this.sectionStart = this.index + 1;
1868    } else if (c === 47) {
1869      this.state = 7;
1870      if (( true) && this.peek() !== 62) {
1871        this.cbs.onerr(22, this.index);
1872      }
1873    } else if (c === 60 && this.peek() === 47) {
1874      this.cbs.onopentagend(this.index);
1875      this.state = 5;
1876      this.sectionStart = this.index;
1877    } else if (!isWhitespace(c)) {
1878      if (( true) && c === 61) {
1879        this.cbs.onerr(
1880          19,
1881          this.index
1882        );
1883      }
1884      this.handleAttrStart(c);
1885    }
1886  }
1887  handleAttrStart(c) {
1888    if (c === 118 && this.peek() === 45) {
1889      this.state = 13;
1890      this.sectionStart = this.index;
1891    } else if (c === 46 || c === 58 || c === 64 || c === 35) {
1892      this.cbs.ondirname(this.index, this.index + 1);
1893      this.state = 14;
1894      this.sectionStart = this.index + 1;
1895    } else {
1896      this.state = 12;
1897      this.sectionStart = this.index;
1898    }
1899  }
1900  stateInSelfClosingTag(c) {
1901    if (c === 62) {
1902      this.cbs.onselfclosingtag(this.index);
1903      this.state = 1;
1904      this.sectionStart = this.index + 1;
1905      this.inRCDATA = false;
1906    } else if (!isWhitespace(c)) {
1907      this.state = 11;
1908      this.stateBeforeAttrName(c);
1909    }
1910  }
1911  stateInAttrName(c) {
1912    if (c === 61 || isEndOfTagSection(c)) {
1913      this.cbs.onattribname(this.sectionStart, this.index);
1914      this.handleAttrNameEnd(c);
1915    } else if (( true) && (c === 34 || c === 39 || c === 60)) {
1916      this.cbs.onerr(
1917        17,
1918        this.index
1919      );
1920    }
1921  }
1922  stateInDirName(c) {
1923    if (c === 61 || isEndOfTagSection(c)) {
1924      this.cbs.ondirname(this.sectionStart, this.index);
1925      this.handleAttrNameEnd(c);
1926    } else if (c === 58) {
1927      this.cbs.ondirname(this.sectionStart, this.index);
1928      this.state = 14;
1929      this.sectionStart = this.index + 1;
1930    } else if (c === 46) {
1931      this.cbs.ondirname(this.sectionStart, this.index);
1932      this.state = 16;
1933      this.sectionStart = this.index + 1;
1934    }
1935  }
1936  stateInDirArg(c) {
1937    if (c === 61 || isEndOfTagSection(c)) {
1938      this.cbs.ondirarg(this.sectionStart, this.index);
1939      this.handleAttrNameEnd(c);
1940    } else if (c === 91) {
1941      this.state = 15;
1942    } else if (c === 46) {
1943      this.cbs.ondirarg(this.sectionStart, this.index);
1944      this.state = 16;
1945      this.sectionStart = this.index + 1;
1946    }
1947  }
1948  stateInDynamicDirArg(c) {
1949    if (c === 93) {
1950      this.state = 14;
1951    } else if (c === 61 || isEndOfTagSection(c)) {
1952      this.cbs.ondirarg(this.sectionStart, this.index + 1);
1953      this.handleAttrNameEnd(c);
1954      if (true) {
1955        this.cbs.onerr(
1956          27,
1957          this.index
1958        );
1959      }
1960    }
1961  }
1962  stateInDirModifier(c) {
1963    if (c === 61 || isEndOfTagSection(c)) {
1964      this.cbs.ondirmodifier(this.sectionStart, this.index);
1965      this.handleAttrNameEnd(c);
1966    } else if (c === 46) {
1967      this.cbs.ondirmodifier(this.sectionStart, this.index);
1968      this.sectionStart = this.index + 1;
1969    }
1970  }
1971  handleAttrNameEnd(c) {
1972    this.sectionStart = this.index;
1973    this.state = 17;
1974    this.cbs.onattribnameend(this.index);
1975    this.stateAfterAttrName(c);
1976  }
1977  stateAfterAttrName(c) {
1978    if (c === 61) {
1979      this.state = 18;
1980    } else if (c === 47 || c === 62) {
1981      this.cbs.onattribend(0, this.sectionStart);
1982      this.sectionStart = -1;
1983      this.state = 11;
1984      this.stateBeforeAttrName(c);
1985    } else if (!isWhitespace(c)) {
1986      this.cbs.onattribend(0, this.sectionStart);
1987      this.handleAttrStart(c);
1988    }
1989  }
1990  stateBeforeAttrValue(c) {
1991    if (c === 34) {
1992      this.state = 19;
1993      this.sectionStart = this.index + 1;
1994    } else if (c === 39) {
1995      this.state = 20;
1996      this.sectionStart = this.index + 1;
1997    } else if (!isWhitespace(c)) {
1998      this.sectionStart = this.index;
1999      this.state = 21;
2000      this.stateInAttrValueNoQuotes(c);
2001    }
2002  }
2003  handleInAttrValue(c, quote) {
2004    if (c === quote || this.fastForwardTo(quote)) {
2005      this.cbs.onattribdata(this.sectionStart, this.index);
2006      this.sectionStart = -1;
2007      this.cbs.onattribend(
2008        quote === 34 ? 3 : 2,
2009        this.index + 1
2010      );
2011      this.state = 11;
2012    }
2013  }
2014  stateInAttrValueDoubleQuotes(c) {
2015    this.handleInAttrValue(c, 34);
2016  }
2017  stateInAttrValueSingleQuotes(c) {
2018    this.handleInAttrValue(c, 39);
2019  }
2020  stateInAttrValueNoQuotes(c) {
2021    if (isWhitespace(c) || c === 62) {
2022      this.cbs.onattribdata(this.sectionStart, this.index);
2023      this.sectionStart = -1;
2024      this.cbs.onattribend(1, this.index);
2025      this.state = 11;
2026      this.stateBeforeAttrName(c);
2027    } else if (( true) && c === 34 || c === 39 || c === 60 || c === 61 || c === 96) {
2028      this.cbs.onerr(
2029        18,
2030        this.index
2031      );
2032    } else ;
2033  }
2034  stateBeforeDeclaration(c) {
2035    if (c === 91) {
2036      this.state = 26;
2037      this.sequenceIndex = 0;
2038    } else {
2039      this.state = c === 45 ? 25 : 23;
2040    }
2041  }
2042  stateInDeclaration(c) {
2043    if (c === 62 || this.fastForwardTo(62)) {
2044      this.state = 1;
2045      this.sectionStart = this.index + 1;
2046    }
2047  }
2048  stateInProcessingInstruction(c) {
2049    if (c === 62 || this.fastForwardTo(62)) {
2050      this.cbs.onprocessinginstruction(this.sectionStart, this.index);
2051      this.state = 1;
2052      this.sectionStart = this.index + 1;
2053    }
2054  }
2055  stateBeforeComment(c) {
2056    if (c === 45) {
2057      this.state = 28;
2058      this.currentSequence = Sequences.CommentEnd;
2059      this.sequenceIndex = 2;
2060      this.sectionStart = this.index + 1;
2061    } else {
2062      this.state = 23;
2063    }
2064  }
2065  stateInSpecialComment(c) {
2066    if (c === 62 || this.fastForwardTo(62)) {
2067      this.cbs.oncomment(this.sectionStart, this.index);
2068      this.state = 1;
2069      this.sectionStart = this.index + 1;
2070    }
2071  }
2072  stateBeforeSpecialS(c) {
2073    if (c === Sequences.ScriptEnd[3]) {
2074      this.startSpecial(Sequences.ScriptEnd, 4);
2075    } else if (c === Sequences.StyleEnd[3]) {
2076      this.startSpecial(Sequences.StyleEnd, 4);
2077    } else {
2078      this.state = 6;
2079      this.stateInTagName(c);
2080    }
2081  }
2082  stateBeforeSpecialT(c) {
2083    if (c === Sequences.TitleEnd[3]) {
2084      this.startSpecial(Sequences.TitleEnd, 4);
2085    } else if (c === Sequences.TextareaEnd[3]) {
2086      this.startSpecial(Sequences.TextareaEnd, 4);
2087    } else {
2088      this.state = 6;
2089      this.stateInTagName(c);
2090    }
2091  }
2092  startEntity() {
2093  }
2094  stateInEntity() {
2095  }
2096  /**
2097   * Iterates through the buffer, calling the function corresponding to the current state.
2098   *
2099   * States that are more likely to be hit are higher up, as a performance improvement.
2100   */
2101  parse(input) {
2102    this.buffer = input;
2103    while (this.index < this.buffer.length) {
2104      const c = this.buffer.charCodeAt(this.index);
2105      if (c === 10) {
2106        this.newlines.push(this.index);
2107      }
2108      switch (this.state) {
2109        case 1: {
2110          this.stateText(c);
2111          break;
2112        }
2113        case 2: {
2114          this.stateInterpolationOpen(c);
2115          break;
2116        }
2117        case 3: {
2118          this.stateInterpolation(c);
2119          break;
2120        }
2121        case 4: {
2122          this.stateInterpolationClose(c);
2123          break;
2124        }
2125        case 31: {
2126          this.stateSpecialStartSequence(c);
2127          break;
2128        }
2129        case 32: {
2130          this.stateInRCDATA(c);
2131          break;
2132        }
2133        case 26: {
2134          this.stateCDATASequence(c);
2135          break;
2136        }
2137        case 19: {
2138          this.stateInAttrValueDoubleQuotes(c);
2139          break;
2140        }
2141        case 12: {
2142          this.stateInAttrName(c);
2143          break;
2144        }
2145        case 13: {
2146          this.stateInDirName(c);
2147          break;
2148        }
2149        case 14: {
2150          this.stateInDirArg(c);
2151          break;
2152        }
2153        case 15: {
2154          this.stateInDynamicDirArg(c);
2155          break;
2156        }
2157        case 16: {
2158          this.stateInDirModifier(c);
2159          break;
2160        }
2161        case 28: {
2162          this.stateInCommentLike(c);
2163          break;
2164        }
2165        case 27: {
2166          this.stateInSpecialComment(c);
2167          break;
2168        }
2169        case 11: {
2170          this.stateBeforeAttrName(c);
2171          break;
2172        }
2173        case 6: {
2174          this.stateInTagName(c);
2175          break;
2176        }
2177        case 34: {
2178          this.stateInSFCRootTagName(c);
2179          break;
2180        }
2181        case 9: {
2182          this.stateInClosingTagName(c);
2183          break;
2184        }
2185        case 5: {
2186          this.stateBeforeTagName(c);
2187          break;
2188        }
2189        case 17: {
2190          this.stateAfterAttrName(c);
2191          break;
2192        }
2193        case 20: {
2194          this.stateInAttrValueSingleQuotes(c);
2195          break;
2196        }
2197        case 18: {
2198          this.stateBeforeAttrValue(c);
2199          break;
2200        }
2201        case 8: {
2202          this.stateBeforeClosingTagName(c);
2203          break;
2204        }
2205        case 10: {
2206          this.stateAfterClosingTagName(c);
2207          break;
2208        }
2209        case 29: {
2210          this.stateBeforeSpecialS(c);
2211          break;
2212        }
2213        case 30: {
2214          this.stateBeforeSpecialT(c);
2215          break;
2216        }
2217        case 21: {
2218          this.stateInAttrValueNoQuotes(c);
2219          break;
2220        }
2221        case 7: {
2222          this.stateInSelfClosingTag(c);
2223          break;
2224        }
2225        case 23: {
2226          this.stateInDeclaration(c);
2227          break;
2228        }
2229        case 22: {
2230          this.stateBeforeDeclaration(c);
2231          break;
2232        }
2233        case 25: {
2234          this.stateBeforeComment(c);
2235          break;
2236        }
2237        case 24: {
2238          this.stateInProcessingInstruction(c);
2239          break;
2240        }
2241        case 33: {
2242          this.stateInEntity();
2243          break;
2244        }
2245      }
2246      this.index++;
2247    }
2248    this.cleanup();
2249    this.finish();
2250  }
2251  /**
2252   * Remove data that has already been consumed from the buffer.
2253   */
2254  cleanup() {
2255    if (this.sectionStart !== this.index) {
2256      if (this.state === 1 || this.state === 32 && this.sequenceIndex === 0) {
2257        this.cbs.ontext(this.sectionStart, this.index);
2258        this.sectionStart = this.index;
2259      } else if (this.state === 19 || this.state === 20 || this.state === 21) {
2260        this.cbs.onattribdata(this.sectionStart, this.index);
2261        this.sectionStart = this.index;
2262      }
2263    }
2264  }
2265  finish() {
2266    this.handleTrailingData();
2267    this.cbs.onend();
2268  }
2269  /** Handle any trailing data. */
2270  handleTrailingData() {
2271    const endIndex = this.buffer.length;
2272    if (this.sectionStart >= endIndex) {
2273      return;
2274    }
2275    if (this.state === 28) {
2276      if (this.currentSequence === Sequences.CdataEnd) {
2277        this.cbs.oncdata(this.sectionStart, endIndex);
2278      } else {
2279        this.cbs.oncomment(this.sectionStart, endIndex);
2280      }
2281    } else if (this.state === 6 || this.state === 11 || this.state === 18 || this.state === 17 || this.state === 12 || this.state === 13 || this.state === 14 || this.state === 15 || this.state === 16 || this.state === 20 || this.state === 19 || this.state === 21 || this.state === 9) ; else {
2282      this.cbs.ontext(this.sectionStart, endIndex);
2283    }
2284  }
2285  emitCodePoint(cp, consumed) {
2286  }
2287}
2288
2289const CompilerDeprecationTypes = {
2290  "COMPILER_IS_ON_ELEMENT": "COMPILER_IS_ON_ELEMENT",
2291  "COMPILER_V_BIND_SYNC": "COMPILER_V_BIND_SYNC",
2292  "COMPILER_V_BIND_OBJECT_ORDER": "COMPILER_V_BIND_OBJECT_ORDER",
2293  "COMPILER_V_ON_NATIVE": "COMPILER_V_ON_NATIVE",
2294  "COMPILER_V_IF_V_FOR_PRECEDENCE": "COMPILER_V_IF_V_FOR_PRECEDENCE",
2295  "COMPILER_NATIVE_TEMPLATE": "COMPILER_NATIVE_TEMPLATE",
2296  "COMPILER_INLINE_TEMPLATE": "COMPILER_INLINE_TEMPLATE",
2297  "COMPILER_FILTERS": "COMPILER_FILTERS"
2298};
2299const deprecationData = {
2300  ["COMPILER_IS_ON_ELEMENT"]: {
2301    message: `Platform-native elements with "is" prop will no longer be treated as components in Vue 3 unless the "is" value is explicitly prefixed with "vue:".`,
2302    link: `https://v3-migration.vuejs.org/breaking-changes/custom-elements-interop.html`
2303  },
2304  ["COMPILER_V_BIND_SYNC"]: {
2305    message: (key) => `.sync modifier for v-bind has been removed. Use v-model with argument instead. \`v-bind:${key}.sync\` should be changed to \`v-model:${key}\`.`,
2306    link: `https://v3-migration.vuejs.org/breaking-changes/v-model.html`
2307  },
2308  ["COMPILER_V_BIND_OBJECT_ORDER"]: {
2309    message: `v-bind="obj" usage is now order sensitive and behaves like JavaScript object spread: it will now overwrite an existing non-mergeable attribute that appears before v-bind in the case of conflict. To retain 2.x behavior, move v-bind to make it the first attribute. You can also suppress this warning if the usage is intended.`,
2310    link: `https://v3-migration.vuejs.org/breaking-changes/v-bind.html`
2311  },
2312  ["COMPILER_V_ON_NATIVE"]: {
2313    message: `.native modifier for v-on has been removed as is no longer necessary.`,
2314    link: `https://v3-migration.vuejs.org/breaking-changes/v-on-native-modifier-removed.html`
2315  },
2316  ["COMPILER_V_IF_V_FOR_PRECEDENCE"]: {
2317    message: `v-if / v-for precedence when used on the same element has changed in Vue 3: v-if now takes higher precedence and will no longer have access to v-for scope variables. It is best to avoid the ambiguity with <template> tags or use a computed property that filters v-for data source.`,
2318    link: `https://v3-migration.vuejs.org/breaking-changes/v-if-v-for.html`
2319  },
2320  ["COMPILER_NATIVE_TEMPLATE"]: {
2321    message: `<template> with no special directives will render as a native template element instead of its inner content in Vue 3.`
2322  },
2323  ["COMPILER_INLINE_TEMPLATE"]: {
2324    message: `"inline-template" has been removed in Vue 3.`,
2325    link: `https://v3-migration.vuejs.org/breaking-changes/inline-template-attribute.html`
2326  },
2327  ["COMPILER_FILTERS"]: {
2328    message: `filters have been removed in Vue 3. The "|" symbol will be treated as native JavaScript bitwise OR operator. Use method calls or computed properties instead.`,
2329    link: `https://v3-migration.vuejs.org/breaking-changes/filters.html`
2330  }
2331};
2332function getCompatValue(key, { compatConfig }) {
2333  const value = compatConfig && compatConfig[key];
2334  if (key === "MODE") {
2335    return value || 3;
2336  } else {
2337    return value;
2338  }
2339}
2340function isCompatEnabled(key, context) {
2341  const mode = getCompatValue("MODE", context);
2342  const value = getCompatValue(key, context);
2343  return mode === 3 ? value === true : value !== false;
2344}
2345function checkCompatEnabled(key, context, loc, ...args) {
2346  const enabled = isCompatEnabled(key, context);
2347  if ( true && enabled) {
2348    warnDeprecation(key, context, loc, ...args);
2349  }
2350  return enabled;
2351}
2352function warnDeprecation(key, context, loc, ...args) {
2353  const val = getCompatValue(key, context);
2354  if (val === "suppress-warning") {
2355    return;
2356  }
2357  const { message, link } = deprecationData[key];
2358  const msg = `(deprecation ${key}) ${typeof message === "function" ? message(...args) : message}${link ? `
2359  Details: ${link}` : ``}`;
2360  const err = new SyntaxError(msg);
2361  err.code = key;
2362  if (loc) err.loc = loc;
2363  context.onWarn(err);
2364}
2365
2366function defaultOnError(error) {
2367  throw error;
2368}
2369function defaultOnWarn(msg) {
2370   true && console.warn(`[Vue warn] ${msg.message}`);
2371}
2372function createCompilerError(code, loc, messages, additionalMessage) {
2373  const msg =  true ? (messages || errorMessages)[code] + (additionalMessage || ``) : 0;
2374  const error = new SyntaxError(String(msg));
2375  error.code = code;
2376  error.loc = loc;
2377  return error;
2378}
2379const ErrorCodes = {
2380  "ABRUPT_CLOSING_OF_EMPTY_COMMENT": 0,
2381  "0": "ABRUPT_CLOSING_OF_EMPTY_COMMENT",
2382  "CDATA_IN_HTML_CONTENT": 1,
2383  "1": "CDATA_IN_HTML_CONTENT",
2384  "DUPLICATE_ATTRIBUTE": 2,
2385  "2": "DUPLICATE_ATTRIBUTE",
2386  "END_TAG_WITH_ATTRIBUTES": 3,
2387  "3": "END_TAG_WITH_ATTRIBUTES",
2388  "END_TAG_WITH_TRAILING_SOLIDUS": 4,
2389  "4": "END_TAG_WITH_TRAILING_SOLIDUS",
2390  "EOF_BEFORE_TAG_NAME": 5,
2391  "5": "EOF_BEFORE_TAG_NAME",
2392  "EOF_IN_CDATA": 6,
2393  "6": "EOF_IN_CDATA",
2394  "EOF_IN_COMMENT": 7,
2395  "7": "EOF_IN_COMMENT",
2396  "EOF_IN_SCRIPT_HTML_COMMENT_LIKE_TEXT": 8,
2397  "8": "EOF_IN_SCRIPT_HTML_COMMENT_LIKE_TEXT",
2398  "EOF_IN_TAG": 9,
2399  "9": "EOF_IN_TAG",
2400  "INCORRECTLY_CLOSED_COMMENT": 10,
2401  "10": "INCORRECTLY_CLOSED_COMMENT",
2402  "INCORRECTLY_OPENED_COMMENT": 11,
2403  "11": "INCORRECTLY_OPENED_COMMENT",
2404  "INVALID_FIRST_CHARACTER_OF_TAG_NAME": 12,
2405  "12": "INVALID_FIRST_CHARACTER_OF_TAG_NAME",
2406  "MISSING_ATTRIBUTE_VALUE": 13,
2407  "13": "MISSING_ATTRIBUTE_VALUE",
2408  "MISSING_END_TAG_NAME": 14,
2409  "14": "MISSING_END_TAG_NAME",
2410  "MISSING_WHITESPACE_BETWEEN_ATTRIBUTES": 15,
2411  "15": "MISSING_WHITESPACE_BETWEEN_ATTRIBUTES",
2412  "NESTED_COMMENT": 16,
2413  "16": "NESTED_COMMENT",
2414  "UNEXPECTED_CHARACTER_IN_ATTRIBUTE_NAME": 17,
2415  "17": "UNEXPECTED_CHARACTER_IN_ATTRIBUTE_NAME",
2416  "UNEXPECTED_CHARACTER_IN_UNQUOTED_ATTRIBUTE_VALUE": 18,
2417  "18": "UNEXPECTED_CHARACTER_IN_UNQUOTED_ATTRIBUTE_VALUE",
2418  "UNEXPECTED_EQUALS_SIGN_BEFORE_ATTRIBUTE_NAME": 19,
2419  "19": "UNEXPECTED_EQUALS_SIGN_BEFORE_ATTRIBUTE_NAME",
2420  "UNEXPECTED_NULL_CHARACTER": 20,
2421  "20": "UNEXPECTED_NULL_CHARACTER",
2422  "UNEXPECTED_QUESTION_MARK_INSTEAD_OF_TAG_NAME": 21,
2423  "21": "UNEXPECTED_QUESTION_MARK_INSTEAD_OF_TAG_NAME",
2424  "UNEXPECTED_SOLIDUS_IN_TAG": 22,
2425  "22": "UNEXPECTED_SOLIDUS_IN_TAG",
2426  "X_INVALID_END_TAG": 23,
2427  "23": "X_INVALID_END_TAG",
2428  "X_MISSING_END_TAG": 24,
2429  "24": "X_MISSING_END_TAG",
2430  "X_MISSING_INTERPOLATION_END": 25,
2431  "25": "X_MISSING_INTERPOLATION_END",
2432  "X_MISSING_DIRECTIVE_NAME": 26,
2433  "26": "X_MISSING_DIRECTIVE_NAME",
2434  "X_MISSING_DYNAMIC_DIRECTIVE_ARGUMENT_END": 27,
2435  "27": "X_MISSING_DYNAMIC_DIRECTIVE_ARGUMENT_END",
2436  "X_V_IF_NO_EXPRESSION": 28,
2437  "28": "X_V_IF_NO_EXPRESSION",
2438  "X_V_IF_SAME_KEY": 29,
2439  "29": "X_V_IF_SAME_KEY",
2440  "X_V_ELSE_NO_ADJACENT_IF": 30,
2441  "30": "X_V_ELSE_NO_ADJACENT_IF",
2442  "X_V_FOR_NO_EXPRESSION": 31,
2443  "31": "X_V_FOR_NO_EXPRESSION",
2444  "X_V_FOR_MALFORMED_EXPRESSION": 32,
2445  "32": "X_V_FOR_MALFORMED_EXPRESSION",
2446  "X_V_FOR_TEMPLATE_KEY_PLACEMENT": 33,
2447  "33": "X_V_FOR_TEMPLATE_KEY_PLACEMENT",
2448  "X_V_BIND_NO_EXPRESSION": 34,
2449  "34": "X_V_BIND_NO_EXPRESSION",
2450  "X_V_ON_NO_EXPRESSION": 35,
2451  "35": "X_V_ON_NO_EXPRESSION",
2452  "X_V_SLOT_UNEXPECTED_DIRECTIVE_ON_SLOT_OUTLET": 36,
2453  "36": "X_V_SLOT_UNEXPECTED_DIRECTIVE_ON_SLOT_OUTLET",
2454  "X_V_SLOT_MIXED_SLOT_USAGE": 37,
2455  "37": "X_V_SLOT_MIXED_SLOT_USAGE",
2456  "X_V_SLOT_DUPLICATE_SLOT_NAMES": 38,
2457  "38": "X_V_SLOT_DUPLICATE_SLOT_NAMES",
2458  "X_V_SLOT_EXTRANEOUS_DEFAULT_SLOT_CHILDREN": 39,
2459  "39": "X_V_SLOT_EXTRANEOUS_DEFAULT_SLOT_CHILDREN",
2460  "X_V_SLOT_MISPLACED": 40,
2461  "40": "X_V_SLOT_MISPLACED",
2462  "X_V_MODEL_NO_EXPRESSION": 41,
2463  "41": "X_V_MODEL_NO_EXPRESSION",
2464  "X_V_MODEL_MALFORMED_EXPRESSION": 42,
2465  "42": "X_V_MODEL_MALFORMED_EXPRESSION",
2466  "X_V_MODEL_ON_SCOPE_VARIABLE": 43,
2467  "43": "X_V_MODEL_ON_SCOPE_VARIABLE",
2468  "X_V_MODEL_ON_PROPS": 44,
2469  "44": "X_V_MODEL_ON_PROPS",
2470  "X_INVALID_EXPRESSION": 45,
2471  "45": "X_INVALID_EXPRESSION",
2472  "X_KEEP_ALIVE_INVALID_CHILDREN": 46,
2473  "46": "X_KEEP_ALIVE_INVALID_CHILDREN",
2474  "X_PREFIX_ID_NOT_SUPPORTED": 47,
2475  "47": "X_PREFIX_ID_NOT_SUPPORTED",
2476  "X_MODULE_MODE_NOT_SUPPORTED": 48,
2477  "48": "X_MODULE_MODE_NOT_SUPPORTED",
2478  "X_CACHE_HANDLER_NOT_SUPPORTED": 49,
2479  "49": "X_CACHE_HANDLER_NOT_SUPPORTED",
2480  "X_SCOPE_ID_NOT_SUPPORTED": 50,
2481  "50": "X_SCOPE_ID_NOT_SUPPORTED",
2482  "X_VNODE_HOOKS": 51,
2483  "51": "X_VNODE_HOOKS",
2484  "X_V_BIND_INVALID_SAME_NAME_ARGUMENT": 52,
2485  "52": "X_V_BIND_INVALID_SAME_NAME_ARGUMENT",
2486  "__EXTEND_POINT__": 53,
2487  "53": "__EXTEND_POINT__"
2488};
2489const errorMessages = {
2490  // parse errors
2491  [0]: "Illegal comment.",
2492  [1]: "CDATA section is allowed only in XML context.",
2493  [2]: "Duplicate attribute.",
2494  [3]: "End tag cannot have attributes.",
2495  [4]: "Illegal '/' in tags.",
2496  [5]: "Unexpected EOF in tag.",
2497  [6]: "Unexpected EOF in CDATA section.",
2498  [7]: "Unexpected EOF in comment.",
2499  [8]: "Unexpected EOF in script.",
2500  [9]: "Unexpected EOF in tag.",
2501  [10]: "Incorrectly closed comment.",
2502  [11]: "Incorrectly opened comment.",
2503  [12]: "Illegal tag name. Use '&lt;' to print '<'.",
2504  [13]: "Attribute value was expected.",
2505  [14]: "End tag name was expected.",
2506  [15]: "Whitespace was expected.",
2507  [16]: "Unexpected '<!--' in comment.",
2508  [17]: `Attribute name cannot contain U+0022 ("), U+0027 ('), and U+003C (<).`,
2509  [18]: "Unquoted attribute value cannot contain U+0022 (\"), U+0027 ('), U+003C (<), U+003D (=), and U+0060 (`).",
2510  [19]: "Attribute name cannot start with '='.",
2511  [21]: "'<?' is allowed only in XML context.",
2512  [20]: `Unexpected null character.`,
2513  [22]: "Illegal '/' in tags.",
2514  // Vue-specific parse errors
2515  [23]: "Invalid end tag.",
2516  [24]: "Element is missing end tag.",
2517  [25]: "Interpolation end sign was not found.",
2518  [27]: "End bracket for dynamic directive argument was not found. Note that dynamic directive argument cannot contain spaces.",
2519  [26]: "Legal directive name was expected.",
2520  // transform errors
2521  [28]: `v-if/v-else-if is missing expression.`,
2522  [29]: `v-if/else branches must use unique keys.`,
2523  [30]: `v-else/v-else-if has no adjacent v-if or v-else-if.`,
2524  [31]: `v-for is missing expression.`,
2525  [32]: `v-for has invalid expression.`,
2526  [33]: `<template v-for> key should be placed on the <template> tag.`,
2527  [34]: `v-bind is missing expression.`,
2528  [52]: `v-bind with same-name shorthand only allows static argument.`,
2529  [35]: `v-on is missing expression.`,
2530  [36]: `Unexpected custom directive on <slot> outlet.`,
2531  [37]: `Mixed v-slot usage on both the component and nested <template>. When there are multiple named slots, all slots should use <template> syntax to avoid scope ambiguity.`,
2532  [38]: `Duplicate slot names found. `,
2533  [39]: `Extraneous children found when component already has explicitly named default slot. These children will be ignored.`,
2534  [40]: `v-slot can only be used on components or <template> tags.`,
2535  [41]: `v-model is missing expression.`,
2536  [42]: `v-model value must be a valid JavaScript member expression.`,
2537  [43]: `v-model cannot be used on v-for or v-slot scope variables because they are not writable.`,
2538  [44]: `v-model cannot be used on a prop, because local prop bindings are not writable.
2539Use a v-bind binding combined with a v-on listener that emits update:x event instead.`,
2540  [45]: `Error parsing JavaScript expression: `,
2541  [46]: `<KeepAlive> expects exactly one child component.`,
2542  [51]: `@vnode-* hooks in templates are no longer supported. Use the vue: prefix instead. For example, @vnode-mounted should be changed to @vue:mounted. @vnode-* hooks support has been removed in 3.4.`,
2543  // generic errors
2544  [47]: `"prefixIdentifiers" option is not supported in this build of compiler.`,
2545  [48]: `ES module mode is not supported in this build of compiler.`,
2546  [49]: `"cacheHandlers" option is only supported when the "prefixIdentifiers" option is enabled.`,
2547  [50]: `"scopeId" option is only supported in module mode.`,
2548  // just to fulfill types
2549  [53]: ``
2550};
2551
2552function walkIdentifiers(root, onIdentifier, includeAll = false, parentStack = [], knownIds = /* @__PURE__ */ Object.create(null)) {
2553  {
2554    return;
2555  }
2556}
2557function isReferencedIdentifier(id, parent, parentStack) {
2558  {
2559    return false;
2560  }
2561}
2562function isInDestructureAssignment(parent, parentStack) {
2563  if (parent && (parent.type === "ObjectProperty" || parent.type === "ArrayPattern")) {
2564    let i = parentStack.length;
2565    while (i--) {
2566      const p = parentStack[i];
2567      if (p.type === "AssignmentExpression") {
2568        return true;
2569      } else if (p.type !== "ObjectProperty" && !p.type.endsWith("Pattern")) {
2570        break;
2571      }
2572    }
2573  }
2574  return false;
2575}
2576function isInNewExpression(parentStack) {
2577  let i = parentStack.length;
2578  while (i--) {
2579    const p = parentStack[i];
2580    if (p.type === "NewExpression") {
2581      return true;
2582    } else if (p.type !== "MemberExpression") {
2583      break;
2584    }
2585  }
2586  return false;
2587}
2588function walkFunctionParams(node, onIdent) {
2589  for (const p of node.params) {
2590    for (const id of extractIdentifiers(p)) {
2591      onIdent(id);
2592    }
2593  }
2594}
2595function walkBlockDeclarations(block, onIdent) {
2596  for (const stmt of block.body) {
2597    if (stmt.type === "VariableDeclaration") {
2598      if (stmt.declare) continue;
2599      for (const decl of stmt.declarations) {
2600        for (const id of extractIdentifiers(decl.id)) {
2601          onIdent(id);
2602        }
2603      }
2604    } else if (stmt.type === "FunctionDeclaration" || stmt.type === "ClassDeclaration") {
2605      if (stmt.declare || !stmt.id) continue;
2606      onIdent(stmt.id);
2607    } else if (stmt.type === "ForOfStatement" || stmt.type === "ForInStatement" || stmt.type === "ForStatement") {
2608      const variable = stmt.type === "ForStatement" ? stmt.init : stmt.left;
2609      if (variable && variable.type === "VariableDeclaration") {
2610        for (const decl of variable.declarations) {
2611          for (const id of extractIdentifiers(decl.id)) {
2612            onIdent(id);
2613          }
2614        }
2615      }
2616    }
2617  }
2618}
2619function extractIdentifiers(param, nodes = []) {
2620  switch (param.type) {
2621    case "Identifier":
2622      nodes.push(param);
2623      break;
2624    case "MemberExpression":
2625      let object = param;
2626      while (object.type === "MemberExpression") {
2627        object = object.object;
2628      }
2629      nodes.push(object);
2630      break;
2631    case "ObjectPattern":
2632      for (const prop of param.properties) {
2633        if (prop.type === "RestElement") {
2634          extractIdentifiers(prop.argument, nodes);
2635        } else {
2636          extractIdentifiers(prop.value, nodes);
2637        }
2638      }
2639      break;
2640    case "ArrayPattern":
2641      param.elements.forEach((element) => {
2642        if (element) extractIdentifiers(element, nodes);
2643      });
2644      break;
2645    case "RestElement":
2646      extractIdentifiers(param.argument, nodes);
2647      break;
2648    case "AssignmentPattern":
2649      extractIdentifiers(param.left, nodes);
2650      break;
2651  }
2652  return nodes;
2653}
2654const isFunctionType = (node) => {
2655  return /Function(?:Expression|Declaration)$|Method$/.test(node.type);
2656};
2657const isStaticProperty = (node) => node && (node.type === "ObjectProperty" || node.type === "ObjectMethod") && !node.computed;
2658const isStaticPropertyKey = (node, parent) => isStaticProperty(parent) && parent.key === node;
2659const TS_NODE_TYPES = [
2660  "TSAsExpression",
2661  // foo as number
2662  "TSTypeAssertion",
2663  // (<number>foo)
2664  "TSNonNullExpression",
2665  // foo!
2666  "TSInstantiationExpression",
2667  // foo<string>
2668  "TSSatisfiesExpression"
2669  // foo satisfies T
2670];
2671function unwrapTSNode(node) {
2672  if (TS_NODE_TYPES.includes(node.type)) {
2673    return unwrapTSNode(node.expression);
2674  } else {
2675    return node;
2676  }
2677}
2678
2679const isStaticExp = (p) => p.type === 4 && p.isStatic;
2680function isCoreComponent(tag) {
2681  switch (tag) {
2682    case "Teleport":
2683    case "teleport":
2684      return TELEPORT;
2685    case "Suspense":
2686    case "suspense":
2687      return SUSPENSE;
2688    case "KeepAlive":
2689    case "keep-alive":
2690      return KEEP_ALIVE;
2691    case "BaseTransition":
2692    case "base-transition":
2693      return BASE_TRANSITION;
2694  }
2695}
2696const nonIdentifierRE = /^\d|[^\$\w\xA0-\uFFFF]/;
2697const isSimpleIdentifier = (name) => !nonIdentifierRE.test(name);
2698const validFirstIdentCharRE = /[A-Za-z_$\xA0-\uFFFF]/;
2699const validIdentCharRE = /[\.\?\w$\xA0-\uFFFF]/;
2700const whitespaceRE = /\s+[.[]\s*|\s*[.[]\s+/g;
2701const isMemberExpressionBrowser = (path) => {
2702  path = path.trim().replace(whitespaceRE, (s) => s.trim());
2703  let state = 0 /* inMemberExp */;
2704  let stateStack = [];
2705  let currentOpenBracketCount = 0;
2706  let currentOpenParensCount = 0;
2707  let currentStringType = null;
2708  for (let i = 0; i < path.length; i++) {
2709    const char = path.charAt(i);
2710    switch (state) {
2711      case 0 /* inMemberExp */:
2712        if (char === "[") {
2713          stateStack.push(state);
2714          state = 1 /* inBrackets */;
2715          currentOpenBracketCount++;
2716        } else if (char === "(") {
2717          stateStack.push(state);
2718          state = 2 /* inParens */;
2719          currentOpenParensCount++;
2720        } else if (!(i === 0 ? validFirstIdentCharRE : validIdentCharRE).test(char)) {
2721          return false;
2722        }
2723        break;
2724      case 1 /* inBrackets */:
2725        if (char === `'` || char === `"` || char === "`") {
2726          stateStack.push(state);
2727          state = 3 /* inString */;
2728          currentStringType = char;
2729        } else if (char === `[`) {
2730          currentOpenBracketCount++;
2731        } else if (char === `]`) {
2732          if (!--currentOpenBracketCount) {
2733            state = stateStack.pop();
2734          }
2735        }
2736        break;
2737      case 2 /* inParens */:
2738        if (char === `'` || char === `"` || char === "`") {
2739          stateStack.push(state);
2740          state = 3 /* inString */;
2741          currentStringType = char;
2742        } else if (char === `(`) {
2743          currentOpenParensCount++;
2744        } else if (char === `)`) {
2745          if (i === path.length - 1) {
2746            return false;
2747          }
2748          if (!--currentOpenParensCount) {
2749            state = stateStack.pop();
2750          }
2751        }
2752        break;
2753      case 3 /* inString */:
2754        if (char === currentStringType) {
2755          state = stateStack.pop();
2756          currentStringType = null;
2757        }
2758        break;
2759    }
2760  }
2761  return !currentOpenBracketCount && !currentOpenParensCount;
2762};
2763const isMemberExpressionNode = _vue_shared__WEBPACK_IMPORTED_MODULE_0__.NOOP ;
2764const isMemberExpression = isMemberExpressionBrowser ;
2765function advancePositionWithClone(pos, source, numberOfCharacters = source.length) {
2766  return advancePositionWithMutation(
2767    {
2768      offset: pos.offset,
2769      line: pos.line,
2770      column: pos.column
2771    },
2772    source,
2773    numberOfCharacters
2774  );
2775}
2776function advancePositionWithMutation(pos, source, numberOfCharacters = source.length) {
2777  let linesCount = 0;
2778  let lastNewLinePos = -1;
2779  for (let i = 0; i < numberOfCharacters; i++) {
2780    if (source.charCodeAt(i) === 10) {
2781      linesCount++;
2782      lastNewLinePos = i;
2783    }
2784  }
2785  pos.offset += numberOfCharacters;
2786  pos.line += linesCount;
2787  pos.column = lastNewLinePos === -1 ? pos.column + numberOfCharacters : numberOfCharacters - lastNewLinePos;
2788  return pos;
2789}
2790function assert(condition, msg) {
2791  if (!condition) {
2792    throw new Error(msg || `unexpected compiler condition`);
2793  }
2794}
2795function findDir(node, name, allowEmpty = false) {
2796  for (let i = 0; i < node.props.length; i++) {
2797    const p = node.props[i];
2798    if (p.type === 7 && (allowEmpty || p.exp) && ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isString)(name) ? p.name === name : name.test(p.name))) {
2799      return p;
2800    }
2801  }
2802}
2803function findProp(node, name, dynamicOnly = false, allowEmpty = false) {
2804  for (let i = 0; i < node.props.length; i++) {
2805    const p = node.props[i];
2806    if (p.type === 6) {
2807      if (dynamicOnly) continue;
2808      if (p.name === name && (p.value || allowEmpty)) {
2809        return p;
2810      }
2811    } else if (p.name === "bind" && (p.exp || allowEmpty) && isStaticArgOf(p.arg, name)) {
2812      return p;
2813    }
2814  }
2815}
2816function isStaticArgOf(arg, name) {
2817  return !!(arg && isStaticExp(arg) && arg.content === name);
2818}
2819function hasDynamicKeyVBind(node) {
2820  return node.props.some(
2821    (p) => p.type === 7 && p.name === "bind" && (!p.arg || // v-bind="obj"
2822    p.arg.type !== 4 || // v-bind:[_ctx.foo]
2823    !p.arg.isStatic)
2824    // v-bind:[foo]
2825  );
2826}
2827function isText$1(node) {
2828  return node.type === 5 || node.type === 2;
2829}
2830function isVSlot(p) {
2831  return p.type === 7 && p.name === "slot";
2832}
2833function isTemplateNode(node) {
2834  return node.type === 1 && node.tagType === 3;
2835}
2836function isSlotOutlet(node) {
2837  return node.type === 1 && node.tagType === 2;
2838}
2839const propsHelperSet = /* @__PURE__ */ new Set([NORMALIZE_PROPS, GUARD_REACTIVE_PROPS]);
2840function getUnnormalizedProps(props, callPath = []) {
2841  if (props && !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isString)(props) && props.type === 14) {
2842    const callee = props.callee;
2843    if (!(0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isString)(callee) && propsHelperSet.has(callee)) {
2844      return getUnnormalizedProps(
2845        props.arguments[0],
2846        callPath.concat(props)
2847      );
2848    }
2849  }
2850  return [props, callPath];
2851}
2852function injectProp(node, prop, context) {
2853  let propsWithInjection;
2854  let props = node.type === 13 ? node.props : node.arguments[2];
2855  let callPath = [];
2856  let parentCall;
2857  if (props && !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isString)(props) && props.type === 14) {
2858    const ret = getUnnormalizedProps(props);
2859    props = ret[0];
2860    callPath = ret[1];
2861    parentCall = callPath[callPath.length - 1];
2862  }
2863  if (props == null || (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isString)(props)) {
2864    propsWithInjection = createObjectExpression([prop]);
2865  } else if (props.type === 14) {
2866    const first = props.arguments[0];
2867    if (!(0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isString)(first) && first.type === 15) {
2868      if (!hasProp(prop, first)) {
2869        first.properties.unshift(prop);
2870      }
2871    } else {
2872      if (props.callee === TO_HANDLERS) {
2873        propsWithInjection = createCallExpression(context.helper(MERGE_PROPS), [
2874          createObjectExpression([prop]),
2875          props
2876        ]);
2877      } else {
2878        props.arguments.unshift(createObjectExpression([prop]));
2879      }
2880    }
2881    !propsWithInjection && (propsWithInjection = props);
2882  } else if (props.type === 15) {
2883    if (!hasProp(prop, props)) {
2884      props.properties.unshift(prop);
2885    }
2886    propsWithInjection = props;
2887  } else {
2888    propsWithInjection = createCallExpression(context.helper(MERGE_PROPS), [
2889      createObjectExpression([prop]),
2890      props
2891    ]);
2892    if (parentCall && parentCall.callee === GUARD_REACTIVE_PROPS) {
2893      parentCall = callPath[callPath.length - 2];
2894    }
2895  }
2896  if (node.type === 13) {
2897    if (parentCall) {
2898      parentCall.arguments[0] = propsWithInjection;
2899    } else {
2900      node.props = propsWithInjection;
2901    }
2902  } else {
2903    if (parentCall) {
2904      parentCall.arguments[0] = propsWithInjection;
2905    } else {
2906      node.arguments[2] = propsWithInjection;
2907    }
2908  }
2909}
2910function hasProp(prop, props) {
2911  let result = false;
2912  if (prop.key.type === 4) {
2913    const propKeyName = prop.key.content;
2914    result = props.properties.some(
2915      (p) => p.key.type === 4 && p.key.content === propKeyName
2916    );
2917  }
2918  return result;
2919}
2920function toValidAssetId(name, type) {
2921  return `_${type}_${name.replace(/[^\w]/g, (searchValue, replaceValue) => {
2922    return searchValue === "-" ? "_" : name.charCodeAt(replaceValue).toString();
2923  })}`;
2924}
2925function hasScopeRef(node, ids) {
2926  if (!node || Object.keys(ids).length === 0) {
2927    return false;
2928  }
2929  switch (node.type) {
2930    case 1:
2931      for (let i = 0; i < node.props.length; i++) {
2932        const p = node.props[i];
2933        if (p.type === 7 && (hasScopeRef(p.arg, ids) || hasScopeRef(p.exp, ids))) {
2934          return true;
2935        }
2936      }
2937      return node.children.some((c) => hasScopeRef(c, ids));
2938    case 11:
2939      if (hasScopeRef(node.source, ids)) {
2940        return true;
2941      }
2942      return node.children.some((c) => hasScopeRef(c, ids));
2943    case 9:
2944      return node.branches.some((b) => hasScopeRef(b, ids));
2945    case 10:
2946      if (hasScopeRef(node.condition, ids)) {
2947        return true;
2948      }
2949      return node.children.some((c) => hasScopeRef(c, ids));
2950    case 4:
2951      return !node.isStatic && isSimpleIdentifier(node.content) && !!ids[node.content];
2952    case 8:
2953      return node.children.some((c) => (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isObject)(c) && hasScopeRef(c, ids));
2954    case 5:
2955    case 12:
2956      return hasScopeRef(node.content, ids);
2957    case 2:
2958    case 3:
2959      return false;
2960    default:
2961      if (true) ;
2962      return false;
2963  }
2964}
2965function getMemoedVNodeCall(node) {
2966  if (node.type === 14 && node.callee === WITH_MEMO) {
2967    return node.arguments[1].returns;
2968  } else {
2969    return node;
2970  }
2971}
2972const forAliasRE = /([\s\S]*?)\s+(?:in|of)\s+(\S[\s\S]*)/;
2973
2974const defaultParserOptions = {
2975  parseMode: "base",
2976  ns: 0,
2977  delimiters: [`{{`, `}}`],
2978  getNamespace: () => 0,
2979  isVoidTag: _vue_shared__WEBPACK_IMPORTED_MODULE_0__.NO,
2980  isPreTag: _vue_shared__WEBPACK_IMPORTED_MODULE_0__.NO,
2981  isCustomElement: _vue_shared__WEBPACK_IMPORTED_MODULE_0__.NO,
2982  onError: defaultOnError,
2983  onWarn: defaultOnWarn,
2984  comments: !!("development" !== "production"),
2985  prefixIdentifiers: false
2986};
2987let currentOptions = defaultParserOptions;
2988let currentRoot = null;
2989let currentInput = "";
2990let currentOpenTag = null;
2991let currentProp = null;
2992let currentAttrValue = "";
2993let currentAttrStartIndex = -1;
2994let currentAttrEndIndex = -1;
2995let inPre = 0;
2996let inVPre = false;
2997let currentVPreBoundary = null;
2998const stack = [];
2999const tokenizer = new Tokenizer(stack, {
3000  onerr: emitError,
3001  ontext(start, end) {
3002    onText(getSlice(start, end), start, end);
3003  },
3004  ontextentity(char, start, end) {
3005    onText(char, start, end);
3006  },
3007  oninterpolation(start, end) {
3008    if (inVPre) {
3009      return onText(getSlice(start, end), start, end);
3010    }
3011    let innerStart = start + tokenizer.delimiterOpen.length;
3012    let innerEnd = end - tokenizer.delimiterClose.length;
3013    while (isWhitespace(currentInput.charCodeAt(innerStart))) {
3014      innerStart++;
3015    }
3016    while (isWhitespace(currentInput.charCodeAt(innerEnd - 1))) {
3017      innerEnd--;
3018    }
3019    let exp = getSlice(innerStart, innerEnd);
3020    if (exp.includes("&")) {
3021      {
3022        exp = currentOptions.decodeEntities(exp, false);
3023      }
3024    }
3025    addNode({
3026      type: 5,
3027      content: createExp(exp, false, getLoc(innerStart, innerEnd)),
3028      loc: getLoc(start, end)
3029    });
3030  },
3031  onopentagname(start, end) {
3032    const name = getSlice(start, end);
3033    currentOpenTag = {
3034      type: 1,
3035      tag: name,
3036      ns: currentOptions.getNamespace(name, stack[0], currentOptions.ns),
3037      tagType: 0,
3038      // will be refined on tag close
3039      props: [],
3040      children: [],
3041      loc: getLoc(start - 1, end),
3042      codegenNode: void 0
3043    };
3044  },
3045  onopentagend(end) {
3046    endOpenTag(end);
3047  },
3048  onclosetag(start, end) {
3049    const name = getSlice(start, end);
3050    if (!currentOptions.isVoidTag(name)) {
3051      let found = false;
3052      for (let i = 0; i < stack.length; i++) {
3053        const e = stack[i];
3054        if (e.tag.toLowerCase() === name.toLowerCase()) {
3055          found = true;
3056          if (i > 0) {
3057            emitError(24, stack[0].loc.start.offset);
3058          }
3059          for (let j = 0; j <= i; j++) {
3060            const el = stack.shift();
3061            onCloseTag(el, end, j < i);
3062          }
3063          break;
3064        }
3065      }
3066      if (!found) {
3067        emitError(23, backTrack(start, 60));
3068      }
3069    }
3070  },
3071  onselfclosingtag(end) {
3072    const name = currentOpenTag.tag;
3073    currentOpenTag.isSelfClosing = true;
3074    endOpenTag(end);
3075    if (stack[0] && stack[0].tag === name) {
3076      onCloseTag(stack.shift(), end);
3077    }
3078  },
3079  onattribname(start, end) {
3080    currentProp = {
3081      type: 6,
3082      name: getSlice(start, end),
3083      nameLoc: getLoc(start, end),
3084      value: void 0,
3085      loc: getLoc(start)
3086    };
3087  },
3088  ondirname(start, end) {
3089    const raw = getSlice(start, end);
3090    const name = raw === "." || raw === ":" ? "bind" : raw === "@" ? "on" : raw === "#" ? "slot" : raw.slice(2);
3091    if (!inVPre && name === "") {
3092      emitError(26, start);
3093    }
3094    if (inVPre || name === "") {
3095      currentProp = {
3096        type: 6,
3097        name: raw,
3098        nameLoc: getLoc(start, end),
3099        value: void 0,
3100        loc: getLoc(start)
3101      };
3102    } else {
3103      currentProp = {
3104        type: 7,
3105        name,
3106        rawName: raw,
3107        exp: void 0,
3108        arg: void 0,
3109        modifiers: raw === "." ? ["prop"] : [],
3110        loc: getLoc(start)
3111      };
3112      if (name === "pre") {
3113        inVPre = tokenizer.inVPre = true;
3114        currentVPreBoundary = currentOpenTag;
3115        const props = currentOpenTag.props;
3116        for (let i = 0; i < props.length; i++) {
3117          if (props[i].type === 7) {
3118            props[i] = dirToAttr(props[i]);
3119          }
3120        }
3121      }
3122    }
3123  },
3124  ondirarg(start, end) {
3125    if (start === end) return;
3126    const arg = getSlice(start, end);
3127    if (inVPre) {
3128      currentProp.name += arg;
3129      setLocEnd(currentProp.nameLoc, end);
3130    } else {
3131      const isStatic = arg[0] !== `[`;
3132      currentProp.arg = createExp(
3133        isStatic ? arg : arg.slice(1, -1),
3134        isStatic,
3135        getLoc(start, end),
3136        isStatic ? 3 : 0
3137      );
3138    }
3139  },
3140  ondirmodifier(start, end) {
3141    const mod = getSlice(start, end);
3142    if (inVPre) {
3143      currentProp.name += "." + mod;
3144      setLocEnd(currentProp.nameLoc, end);
3145    } else if (currentProp.name === "slot") {
3146      const arg = currentProp.arg;
3147      if (arg) {
3148        arg.content += "." + mod;
3149        setLocEnd(arg.loc, end);
3150      }
3151    } else {
3152      currentProp.modifiers.push(mod);
3153    }
3154  },
3155  onattribdata(start, end) {
3156    currentAttrValue += getSlice(start, end);
3157    if (currentAttrStartIndex < 0) currentAttrStartIndex = start;
3158    currentAttrEndIndex = end;
3159  },
3160  onattribentity(char, start, end) {
3161    currentAttrValue += char;
3162    if (currentAttrStartIndex < 0) currentAttrStartIndex = start;
3163    currentAttrEndIndex = end;
3164  },
3165  onattribnameend(end) {
3166    const start = currentProp.loc.start.offset;
3167    const name = getSlice(start, end);
3168    if (currentProp.type === 7) {
3169      currentProp.rawName = name;
3170    }
3171    if (currentOpenTag.props.some(
3172      (p) => (p.type === 7 ? p.rawName : p.name) === name
3173    )) {
3174      emitError(2, start);
3175    }
3176  },
3177  onattribend(quote, end) {
3178    if (currentOpenTag && currentProp) {
3179      setLocEnd(currentProp.loc, end);
3180      if (quote !== 0) {
3181        if (currentAttrValue.includes("&")) {
3182          currentAttrValue = currentOptions.decodeEntities(
3183            currentAttrValue,
3184            true
3185          );
3186        }
3187        if (currentProp.type === 6) {
3188          if (currentProp.name === "class") {
3189            currentAttrValue = condense(currentAttrValue).trim();
3190          }
3191          if (quote === 1 && !currentAttrValue) {
3192            emitError(13, end);
3193          }
3194          currentProp.value = {
3195            type: 2,
3196            content: currentAttrValue,
3197            loc: quote === 1 ? getLoc(currentAttrStartIndex, currentAttrEndIndex) : getLoc(currentAttrStartIndex - 1, currentAttrEndIndex + 1)
3198          };
3199          if (tokenizer.inSFCRoot && currentOpenTag.tag === "template" && currentProp.name === "lang" && currentAttrValue && currentAttrValue !== "html") {
3200            tokenizer.enterRCDATA(toCharCodes(`</template`), 0);
3201          }
3202        } else {
3203          let expParseMode = 0 /* Normal */;
3204          currentProp.exp = createExp(
3205            currentAttrValue,
3206            false,
3207            getLoc(currentAttrStartIndex, currentAttrEndIndex),
3208            0,
3209            expParseMode
3210          );
3211          if (currentProp.name === "for") {
3212            currentProp.forParseResult = parseForExpression(currentProp.exp);
3213          }
3214          let syncIndex = -1;
3215          if (currentProp.name === "bind" && (syncIndex = currentProp.modifiers.indexOf("sync")) > -1 && checkCompatEnabled(
3216            "COMPILER_V_BIND_SYNC",
3217            currentOptions,
3218            currentProp.loc,
3219            currentProp.rawName
3220          )) {
3221            currentProp.name = "model";
3222            currentProp.modifiers.splice(syncIndex, 1);
3223          }
3224        }
3225      }
3226      if (currentProp.type !== 7 || currentProp.name !== "pre") {
3227        currentOpenTag.props.push(currentProp);
3228      }
3229    }
3230    currentAttrValue = "";
3231    currentAttrStartIndex = currentAttrEndIndex = -1;
3232  },
3233  oncomment(start, end) {
3234    if (currentOptions.comments) {
3235      addNode({
3236        type: 3,
3237        content: getSlice(start, end),
3238        loc: getLoc(start - 4, end + 3)
3239      });
3240    }
3241  },
3242  onend() {
3243    const end = currentInput.length;
3244    if (( true) && tokenizer.state !== 1) {
3245      switch (tokenizer.state) {
3246        case 5:
3247        case 8:
3248          emitError(5, end);
3249          break;
3250        case 3:
3251        case 4:
3252          emitError(
3253            25,
3254            tokenizer.sectionStart
3255          );
3256          break;
3257        case 28:
3258          if (tokenizer.currentSequence === Sequences.CdataEnd) {
3259            emitError(6, end);
3260          } else {
3261            emitError(7, end);
3262          }
3263          break;
3264        case 6:
3265        case 7:
3266        case 9:
3267        case 11:
3268        case 12:
3269        case 13:
3270        case 14:
3271        case 15:
3272        case 16:
3273        case 17:
3274        case 18:
3275        case 19:
3276        case 20:
3277        case 21:
3278          emitError(9, end);
3279          break;
3280      }
3281    }
3282    for (let index = 0; index < stack.length; index++) {
3283      onCloseTag(stack[index], end - 1);
3284      emitError(24, stack[index].loc.start.offset);
3285    }
3286  },
3287  oncdata(start, end) {
3288    if (stack[0].ns !== 0) {
3289      onText(getSlice(start, end), start, end);
3290    } else {
3291      emitError(1, start - 9);
3292    }
3293  },
3294  onprocessinginstruction(start) {
3295    if ((stack[0] ? stack[0].ns : currentOptions.ns) === 0) {
3296      emitError(
3297        21,
3298        start - 1
3299      );
3300    }
3301  }
3302});
3303const forIteratorRE = /,([^,\}\]]*)(?:,([^,\}\]]*))?$/;
3304const stripParensRE = /^\(|\)$/g;
3305function parseForExpression(input) {
3306  const loc = input.loc;
3307  const exp = input.content;
3308  const inMatch = exp.match(forAliasRE);
3309  if (!inMatch) return;
3310  const [, LHS, RHS] = inMatch;
3311  const createAliasExpression = (content, offset, asParam = false) => {
3312    const start = loc.start.offset + offset;
3313    const end = start + content.length;
3314    return createExp(
3315      content,
3316      false,
3317      getLoc(start, end),
3318      0,
3319      asParam ? 1 /* Params */ : 0 /* Normal */
3320    );
3321  };
3322  const result = {
3323    source: createAliasExpression(RHS.trim(), exp.indexOf(RHS, LHS.length)),
3324    value: void 0,
3325    key: void 0,
3326    index: void 0,
3327    finalized: false
3328  };
3329  let valueContent = LHS.trim().replace(stripParensRE, "").trim();
3330  const trimmedOffset = LHS.indexOf(valueContent);
3331  const iteratorMatch = valueContent.match(forIteratorRE);
3332  if (iteratorMatch) {
3333    valueContent = valueContent.replace(forIteratorRE, "").trim();
3334    const keyContent = iteratorMatch[1].trim();
3335    let keyOffset;
3336    if (keyContent) {
3337      keyOffset = exp.indexOf(keyContent, trimmedOffset + valueContent.length);
3338      result.key = createAliasExpression(keyContent, keyOffset, true);
3339    }
3340    if (iteratorMatch[2]) {
3341      const indexContent = iteratorMatch[2].trim();
3342      if (indexContent) {
3343        result.index = createAliasExpression(
3344          indexContent,
3345          exp.indexOf(
3346            indexContent,
3347            result.key ? keyOffset + keyContent.length : trimmedOffset + valueContent.length
3348          ),
3349          true
3350        );
3351      }
3352    }
3353  }
3354  if (valueContent) {
3355    result.value = createAliasExpression(valueContent, trimmedOffset, true);
3356  }
3357  return result;
3358}
3359function getSlice(start, end) {
3360  return currentInput.slice(start, end);
3361}
3362function endOpenTag(end) {
3363  if (tokenizer.inSFCRoot) {
3364    currentOpenTag.innerLoc = getLoc(end + 1, end + 1);
3365  }
3366  addNode(currentOpenTag);
3367  const { tag, ns } = currentOpenTag;
3368  if (ns === 0 && currentOptions.isPreTag(tag)) {
3369    inPre++;
3370  }
3371  if (currentOptions.isVoidTag(tag)) {
3372    onCloseTag(currentOpenTag, end);
3373  } else {
3374    stack.unshift(currentOpenTag);
3375    if (ns === 1 || ns === 2) {
3376      tokenizer.inXML = true;
3377    }
3378  }
3379  currentOpenTag = null;
3380}
3381function onText(content, start, end) {
3382  {
3383    const tag = stack[0] && stack[0].tag;
3384    if (tag !== "script" && tag !== "style" && content.includes("&")) {
3385      content = currentOptions.decodeEntities(content, false);
3386    }
3387  }
3388  const parent = stack[0] || currentRoot;
3389  const lastNode = parent.children[parent.children.length - 1];
3390  if (lastNode && lastNode.type === 2) {
3391    lastNode.content += content;
3392    setLocEnd(lastNode.loc, end);
3393  } else {
3394    parent.children.push({
3395      type: 2,
3396      content,
3397      loc: getLoc(start, end)
3398    });
3399  }
3400}
3401function onCloseTag(el, end, isImplied = false) {
3402  if (isImplied) {
3403    setLocEnd(el.loc, backTrack(end, 60));
3404  } else {
3405    setLocEnd(el.loc, lookAhead(end, 62) + 1);
3406  }
3407  if (tokenizer.inSFCRoot) {
3408    if (el.children.length) {
3409      el.innerLoc.end = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.extend)({}, el.children[el.children.length - 1].loc.end);
3410    } else {
3411      el.innerLoc.end = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.extend)({}, el.innerLoc.start);
3412    }
3413    el.innerLoc.source = getSlice(
3414      el.innerLoc.start.offset,
3415      el.innerLoc.end.offset
3416    );
3417  }
3418  const { tag, ns } = el;
3419  if (!inVPre) {
3420    if (tag === "slot") {
3421      el.tagType = 2;
3422    } else if (isFragmentTemplate(el)) {
3423      el.tagType = 3;
3424    } else if (isComponent(el)) {
3425      el.tagType = 1;
3426    }
3427  }
3428  if (!tokenizer.inRCDATA) {
3429    el.children = condenseWhitespace(el.children, el.tag);
3430  }
3431  if (ns === 0 && currentOptions.isPreTag(tag)) {
3432    inPre--;
3433  }
3434  if (currentVPreBoundary === el) {
3435    inVPre = tokenizer.inVPre = false;
3436    currentVPreBoundary = null;
3437  }
3438  if (tokenizer.inXML && (stack[0] ? stack[0].ns : currentOptions.ns) === 0) {
3439    tokenizer.inXML = false;
3440  }
3441  {
3442    const props = el.props;
3443    if ( true && isCompatEnabled(
3444      "COMPILER_V_IF_V_FOR_PRECEDENCE",
3445      currentOptions
3446    )) {
3447      let hasIf = false;
3448      let hasFor = false;
3449      for (let i = 0; i < props.length; i++) {
3450        const p = props[i];
3451        if (p.type === 7) {
3452          if (p.name === "if") {
3453            hasIf = true;
3454          } else if (p.name === "for") {
3455            hasFor = true;
3456          }
3457        }
3458        if (hasIf && hasFor) {
3459          warnDeprecation(
3460            "COMPILER_V_IF_V_FOR_PRECEDENCE",
3461            currentOptions,
3462            el.loc
3463          );
3464          break;
3465        }
3466      }
3467    }
3468    if (!tokenizer.inSFCRoot && isCompatEnabled(
3469      "COMPILER_NATIVE_TEMPLATE",
3470      currentOptions
3471    ) && el.tag === "template" && !isFragmentTemplate(el)) {
3472       true && warnDeprecation(
3473        "COMPILER_NATIVE_TEMPLATE",
3474        currentOptions,
3475        el.loc
3476      );
3477      const parent = stack[0] || currentRoot;
3478      const index = parent.children.indexOf(el);
3479      parent.children.splice(index, 1, ...el.children);
3480    }
3481    const inlineTemplateProp = props.find(
3482      (p) => p.type === 6 && p.name === "inline-template"
3483    );
3484    if (inlineTemplateProp && checkCompatEnabled(
3485      "COMPILER_INLINE_TEMPLATE",
3486      currentOptions,
3487      inlineTemplateProp.loc
3488    ) && el.children.length) {
3489      inlineTemplateProp.value = {
3490        type: 2,
3491        content: getSlice(
3492          el.children[0].loc.start.offset,
3493          el.children[el.children.length - 1].loc.end.offset
3494        ),
3495        loc: inlineTemplateProp.loc
3496      };
3497    }
3498  }
3499}
3500function lookAhead(index, c) {
3501  let i = index;
3502  while (currentInput.charCodeAt(i) !== c && i < currentInput.length - 1) i++;
3503  return i;
3504}
3505function backTrack(index, c) {
3506  let i = index;
3507  while (currentInput.charCodeAt(i) !== c && i >= 0) i--;
3508  return i;
3509}
3510const specialTemplateDir = /* @__PURE__ */ new Set(["if", "else", "else-if", "for", "slot"]);
3511function isFragmentTemplate({ tag, props }) {
3512  if (tag === "template") {
3513    for (let i = 0; i < props.length; i++) {
3514      if (props[i].type === 7 && specialTemplateDir.has(props[i].name)) {
3515        return true;
3516      }
3517    }
3518  }
3519  return false;
3520}
3521function isComponent({ tag, props }) {
3522  if (currentOptions.isCustomElement(tag)) {
3523    return false;
3524  }
3525  if (tag === "component" || isUpperCase(tag.charCodeAt(0)) || isCoreComponent(tag) || currentOptions.isBuiltInComponent && currentOptions.isBuiltInComponent(tag) || currentOptions.isNativeTag && !currentOptions.isNativeTag(tag)) {
3526    return true;
3527  }
3528  for (let i = 0; i < props.length; i++) {
3529    const p = props[i];
3530    if (p.type === 6) {
3531      if (p.name === "is" && p.value) {
3532        if (p.value.content.startsWith("vue:")) {
3533          return true;
3534        } else if (checkCompatEnabled(
3535          "COMPILER_IS_ON_ELEMENT",
3536          currentOptions,
3537          p.loc
3538        )) {
3539          return true;
3540        }
3541      }
3542    } else if (// :is on plain element - only treat as component in compat mode
3543    p.name === "bind" && isStaticArgOf(p.arg, "is") && checkCompatEnabled(
3544      "COMPILER_IS_ON_ELEMENT",
3545      currentOptions,
3546      p.loc
3547    )) {
3548      return true;
3549    }
3550  }
3551  return false;
3552}
3553function isUpperCase(c) {
3554  return c > 64 && c < 91;
3555}
3556const windowsNewlineRE = /\r\n/g;
3557function condenseWhitespace(nodes, tag) {
3558  const shouldCondense = currentOptions.whitespace !== "preserve";
3559  let removedWhitespace = false;
3560  for (let i = 0; i < nodes.length; i++) {
3561    const node = nodes[i];
3562    if (node.type === 2) {
3563      if (!inPre) {
3564        if (isAllWhitespace(node.content)) {
3565          const prev = nodes[i - 1] && nodes[i - 1].type;
3566          const next = nodes[i + 1] && nodes[i + 1].type;
3567          if (!prev || !next || shouldCondense && (prev === 3 && (next === 3 || next === 1) || prev === 1 && (next === 3 || next === 1 && hasNewlineChar(node.content)))) {
3568            removedWhitespace = true;
3569            nodes[i] = null;
3570          } else {
3571            node.content = " ";
3572          }
3573        } else if (shouldCondense) {
3574          node.content = condense(node.content);
3575        }
3576      } else {
3577        node.content = node.content.replace(windowsNewlineRE, "\n");
3578      }
3579    }
3580  }
3581  if (inPre && tag && currentOptions.isPreTag(tag)) {
3582    const first = nodes[0];
3583    if (first && first.type === 2) {
3584      first.content = first.content.replace(/^\r?\n/, "");
3585    }
3586  }
3587  return removedWhitespace ? nodes.filter(Boolean) : nodes;
3588}
3589function isAllWhitespace(str) {
3590  for (let i = 0; i < str.length; i++) {
3591    if (!isWhitespace(str.charCodeAt(i))) {
3592      return false;
3593    }
3594  }
3595  return true;
3596}
3597function hasNewlineChar(str) {
3598  for (let i = 0; i < str.length; i++) {
3599    const c = str.charCodeAt(i);
3600    if (c === 10 || c === 13) {
3601      return true;
3602    }
3603  }
3604  return false;
3605}
3606function condense(str) {
3607  let ret = "";
3608  let prevCharIsWhitespace = false;
3609  for (let i = 0; i < str.length; i++) {
3610    if (isWhitespace(str.charCodeAt(i))) {
3611      if (!prevCharIsWhitespace) {
3612        ret += " ";
3613        prevCharIsWhitespace = true;
3614      }
3615    } else {
3616      ret += str[i];
3617      prevCharIsWhitespace = false;
3618    }
3619  }
3620  return ret;
3621}
3622function addNode(node) {
3623  (stack[0] || currentRoot).children.push(node);
3624}
3625function getLoc(start, end) {
3626  return {
3627    start: tokenizer.getPos(start),
3628    // @ts-expect-error allow late attachment
3629    end: end == null ? end : tokenizer.getPos(end),
3630    // @ts-expect-error allow late attachment
3631    source: end == null ? end : getSlice(start, end)
3632  };
3633}
3634function setLocEnd(loc, end) {
3635  loc.end = tokenizer.getPos(end);
3636  loc.source = getSlice(loc.start.offset, end);
3637}
3638function dirToAttr(dir) {
3639  const attr = {
3640    type: 6,
3641    name: dir.rawName,
3642    nameLoc: getLoc(
3643      dir.loc.start.offset,
3644      dir.loc.start.offset + dir.rawName.length
3645    ),
3646    value: void 0,
3647    loc: dir.loc
3648  };
3649  if (dir.exp) {
3650    const loc = dir.exp.loc;
3651    if (loc.end.offset < dir.loc.end.offset) {
3652      loc.start.offset--;
3653      loc.start.column--;
3654      loc.end.offset++;
3655      loc.end.column++;
3656    }
3657    attr.value = {
3658      type: 2,
3659      content: dir.exp.content,
3660      loc
3661    };
3662  }
3663  return attr;
3664}
3665function createExp(content, isStatic = false, loc, constType = 0, parseMode = 0 /* Normal */) {
3666  const exp = createSimpleExpression(content, isStatic, loc, constType);
3667  return exp;
3668}
3669function emitError(code, index, message) {
3670  currentOptions.onError(
3671    createCompilerError(code, getLoc(index, index), void 0, message)
3672  );
3673}
3674function reset() {
3675  tokenizer.reset();
3676  currentOpenTag = null;
3677  currentProp = null;
3678  currentAttrValue = "";
3679  currentAttrStartIndex = -1;
3680  currentAttrEndIndex = -1;
3681  stack.length = 0;
3682}
3683function baseParse(input, options) {
3684  reset();
3685  currentInput = input;
3686  currentOptions = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.extend)({}, defaultParserOptions);
3687  if (options) {
3688    let key;
3689    for (key in options) {
3690      if (options[key] != null) {
3691        currentOptions[key] = options[key];
3692      }
3693    }
3694  }
3695  if (true) {
3696    if (!currentOptions.decodeEntities) {
3697      throw new Error(
3698        `[@vue/compiler-core] decodeEntities option is required in browser builds.`
3699      );
3700    }
3701  }
3702  tokenizer.mode = currentOptions.parseMode === "html" ? 1 : currentOptions.parseMode === "sfc" ? 2 : 0;
3703  tokenizer.inXML = currentOptions.ns === 1 || currentOptions.ns === 2;
3704  const delimiters = options && options.delimiters;
3705  if (delimiters) {
3706    tokenizer.delimiterOpen = toCharCodes(delimiters[0]);
3707    tokenizer.delimiterClose = toCharCodes(delimiters[1]);
3708  }
3709  const root = currentRoot = createRoot([], input);
3710  tokenizer.parse(currentInput);
3711  root.loc = getLoc(0, input.length);
3712  root.children = condenseWhitespace(root.children);
3713  currentRoot = null;
3714  return root;
3715}
3716
3717function hoistStatic(root, context) {
3718  walk(
3719    root,
3720    context,
3721    // Root node is unfortunately non-hoistable due to potential parent
3722    // fallthrough attributes.
3723    isSingleElementRoot(root, root.children[0])
3724  );
3725}
3726function isSingleElementRoot(root, child) {
3727  const { children } = root;
3728  return children.length === 1 && child.type === 1 && !isSlotOutlet(child);
3729}
3730function walk(node, context, doNotHoistNode = false) {
3731  const { children } = node;
3732  const originalCount = children.length;
3733  let hoistedCount = 0;
3734  for (let i = 0; i < children.length; i++) {
3735    const child = children[i];
3736    if (child.type === 1 && child.tagType === 0) {
3737      const constantType = doNotHoistNode ? 0 : getConstantType(child, context);
3738      if (constantType > 0) {
3739        if (constantType >= 2) {
3740          child.codegenNode.patchFlag = -1;
3741          child.codegenNode = context.hoist(child.codegenNode);
3742          hoistedCount++;
3743          continue;
3744        }
3745      } else {
3746        const codegenNode = child.codegenNode;
3747        if (codegenNode.type === 13) {
3748          const flag = codegenNode.patchFlag;
3749          if ((flag === void 0 || flag === 512 || flag === 1) && getGeneratedPropsConstantType(child, context) >= 2) {
3750            const props = getNodeProps(child);
3751            if (props) {
3752              codegenNode.props = context.hoist(props);
3753            }
3754          }
3755          if (codegenNode.dynamicProps) {
3756            codegenNode.dynamicProps = context.hoist(codegenNode.dynamicProps);
3757          }
3758        }
3759      }
3760    }
3761    if (child.type === 1) {
3762      const isComponent = child.tagType === 1;
3763      if (isComponent) {
3764        context.scopes.vSlot++;
3765      }
3766      walk(child, context);
3767      if (isComponent) {
3768        context.scopes.vSlot--;
3769      }
3770    } else if (child.type === 11) {
3771      walk(child, context, child.children.length === 1);
3772    } else if (child.type === 9) {
3773      for (let i2 = 0; i2 < child.branches.length; i2++) {
3774        walk(
3775          child.branches[i2],
3776          context,
3777          child.branches[i2].children.length === 1
3778        );
3779      }
3780    }
3781  }
3782  if (hoistedCount && context.transformHoist) {
3783    context.transformHoist(children, context, node);
3784  }
3785  if (hoistedCount && hoistedCount === originalCount && node.type === 1 && node.tagType === 0 && node.codegenNode && node.codegenNode.type === 13 && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isArray)(node.codegenNode.children)) {
3786    const hoisted = context.hoist(
3787      createArrayExpression(node.codegenNode.children)
3788    );
3789    if (context.hmr) {
3790      hoisted.content = `[...${hoisted.content}]`;
3791    }
3792    node.codegenNode.children = hoisted;
3793  }
3794}
3795function getConstantType(node, context) {
3796  const { constantCache } = context;
3797  switch (node.type) {
3798    case 1:
3799      if (node.tagType !== 0) {
3800        return 0;
3801      }
3802      const cached = constantCache.get(node);
3803      if (cached !== void 0) {
3804        return cached;
3805      }
3806      const codegenNode = node.codegenNode;
3807      if (codegenNode.type !== 13) {
3808        return 0;
3809      }
3810      if (codegenNode.isBlock && node.tag !== "svg" && node.tag !== "foreignObject" && node.tag !== "math") {
3811        return 0;
3812      }
3813      if (codegenNode.patchFlag === void 0) {
3814        let returnType2 = 3;
3815        const generatedPropsType = getGeneratedPropsConstantType(node, context);
3816        if (generatedPropsType === 0) {
3817          constantCache.set(node, 0);
3818          return 0;
3819        }
3820        if (generatedPropsType < returnType2) {
3821          returnType2 = generatedPropsType;
3822        }
3823        for (let i = 0; i < node.children.length; i++) {
3824          const childType = getConstantType(node.children[i], context);
3825          if (childType === 0) {
3826            constantCache.set(node, 0);
3827            return 0;
3828          }
3829          if (childType < returnType2) {
3830            returnType2 = childType;
3831          }
3832        }
3833        if (returnType2 > 1) {
3834          for (let i = 0; i < node.props.length; i++) {
3835            const p = node.props[i];
3836            if (p.type === 7 && p.name === "bind" && p.exp) {
3837              const expType = getConstantType(p.exp, context);
3838              if (expType === 0) {
3839                constantCache.set(node, 0);
3840                return 0;
3841              }
3842              if (expType < returnType2) {
3843                returnType2 = expType;
3844              }
3845            }
3846          }
3847        }
3848        if (codegenNode.isBlock) {
3849          for (let i = 0; i < node.props.length; i++) {
3850            const p = node.props[i];
3851            if (p.type === 7) {
3852              constantCache.set(node, 0);
3853              return 0;
3854            }
3855          }
3856          context.removeHelper(OPEN_BLOCK);
3857          context.removeHelper(
3858            getVNodeBlockHelper(context.inSSR, codegenNode.isComponent)
3859          );
3860          codegenNode.isBlock = false;
3861          context.helper(getVNodeHelper(context.inSSR, codegenNode.isComponent));
3862        }
3863        constantCache.set(node, returnType2);
3864        return returnType2;
3865      } else {
3866        constantCache.set(node, 0);
3867        return 0;
3868      }
3869    case 2:
3870    case 3:
3871      return 3;
3872    case 9:
3873    case 11:
3874    case 10:
3875      return 0;
3876    case 5:
3877    case 12:
3878      return getConstantType(node.content, context);
3879    case 4:
3880      return node.constType;
3881    case 8:
3882      let returnType = 3;
3883      for (let i = 0; i < node.children.length; i++) {
3884        const child = node.children[i];
3885        if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isString)(child) || (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isSymbol)(child)) {
3886          continue;
3887        }
3888        const childType = getConstantType(child, context);
3889        if (childType === 0) {
3890          return 0;
3891        } else if (childType < returnType) {
3892          returnType = childType;
3893        }
3894      }
3895      return returnType;
3896    default:
3897      if (true) ;
3898      return 0;
3899  }
3900}
3901const allowHoistedHelperSet = /* @__PURE__ */ new Set([
3902  NORMALIZE_CLASS,
3903  NORMALIZE_STYLE,
3904  NORMALIZE_PROPS,
3905  GUARD_REACTIVE_PROPS
3906]);
3907function getConstantTypeOfHelperCall(value, context) {
3908  if (value.type === 14 && !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isString)(value.callee) && allowHoistedHelperSet.has(value.callee)) {
3909    const arg = value.arguments[0];
3910    if (arg.type === 4) {
3911      return getConstantType(arg, context);
3912    } else if (arg.type === 14) {
3913      return getConstantTypeOfHelperCall(arg, context);
3914    }
3915  }
3916  return 0;
3917}
3918function getGeneratedPropsConstantType(node, context) {
3919  let returnType = 3;
3920  const props = getNodeProps(node);
3921  if (props && props.type === 15) {
3922    const { properties } = props;
3923    for (let i = 0; i < properties.length; i++) {
3924      const { key, value } = properties[i];
3925      const keyType = getConstantType(key, context);
3926      if (keyType === 0) {
3927        return keyType;
3928      }
3929      if (keyType < returnType) {
3930        returnType = keyType;
3931      }
3932      let valueType;
3933      if (value.type === 4) {
3934        valueType = getConstantType(value, context);
3935      } else if (value.type === 14) {
3936        valueType = getConstantTypeOfHelperCall(value, context);
3937      } else {
3938        valueType = 0;
3939      }
3940      if (valueType === 0) {
3941        return valueType;
3942      }
3943      if (valueType < returnType) {
3944        returnType = valueType;
3945      }
3946    }
3947  }
3948  return returnType;
3949}
3950function getNodeProps(node) {
3951  const codegenNode = node.codegenNode;
3952  if (codegenNode.type === 13) {
3953    return codegenNode.props;
3954  }
3955}
3956
3957function createTransformContext(root, {
3958  filename = "",
3959  prefixIdentifiers = false,
3960  hoistStatic: hoistStatic2 = false,
3961  hmr = false,
3962  cacheHandlers = false,
3963  nodeTransforms = [],
3964  directiveTransforms = {},
3965  transformHoist = null,
3966  isBuiltInComponent = _vue_shared__WEBPACK_IMPORTED_MODULE_0__.NOOP,
3967  isCustomElement = _vue_shared__WEBPACK_IMPORTED_MODULE_0__.NOOP,
3968  expressionPlugins = [],
3969  scopeId = null,
3970  slotted = true,
3971  ssr = false,
3972  inSSR = false,
3973  ssrCssVars = ``,
3974  bindingMetadata = _vue_shared__WEBPACK_IMPORTED_MODULE_0__.EMPTY_OBJ,
3975  inline = false,
3976  isTS = false,
3977  onError = defaultOnError,
3978  onWarn = defaultOnWarn,
3979  compatConfig
3980}) {
3981  const nameMatch = filename.replace(/\?.*$/, "").match(/([^/\\]+)\.\w+$/);
3982  const context = {
3983    // options
3984    filename,
3985    selfName: nameMatch && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.capitalize)((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.camelize)(nameMatch[1])),
3986    prefixIdentifiers,
3987    hoistStatic: hoistStatic2,
3988    hmr,
3989    cacheHandlers,
3990    nodeTransforms,
3991    directiveTransforms,
3992    transformHoist,
3993    isBuiltInComponent,
3994    isCustomElement,
3995    expressionPlugins,
3996    scopeId,
3997    slotted,
3998    ssr,
3999    inSSR,
4000    ssrCssVars,
4001    bindingMetadata,
4002    inline,
4003    isTS,
4004    onError,
4005    onWarn,
4006    compatConfig,
4007    // state
4008    root,
4009    helpers: /* @__PURE__ */ new Map(),
4010    components: /* @__PURE__ */ new Set(),
4011    directives: /* @__PURE__ */ new Set(),
4012    hoists: [],
4013    imports: [],
4014    constantCache: /* @__PURE__ */ new WeakMap(),
4015    temps: 0,
4016    cached: 0,
4017    identifiers: /* @__PURE__ */ Object.create(null),
4018    scopes: {
4019      vFor: 0,
4020      vSlot: 0,
4021      vPre: 0,
4022      vOnce: 0
4023    },
4024    parent: null,
4025    grandParent: null,
4026    currentNode: root,
4027    childIndex: 0,
4028    inVOnce: false,
4029    // methods
4030    helper(name) {
4031      const count = context.helpers.get(name) || 0;
4032      context.helpers.set(name, count + 1);
4033      return name;
4034    },
4035    removeHelper(name) {
4036      const count = context.helpers.get(name);
4037      if (count) {
4038        const currentCount = count - 1;
4039        if (!currentCount) {
4040          context.helpers.delete(name);
4041        } else {
4042          context.helpers.set(name, currentCount);
4043        }
4044      }
4045    },
4046    helperString(name) {
4047      return `_${helperNameMap[context.helper(name)]}`;
4048    },
4049    replaceNode(node) {
4050      if (true) {
4051        if (!context.currentNode) {
4052          throw new Error(`Node being replaced is already removed.`);
4053        }
4054        if (!context.parent) {
4055          throw new Error(`Cannot replace root node.`);
4056        }
4057      }
4058      context.parent.children[context.childIndex] = context.currentNode = node;
4059    },
4060    removeNode(node) {
4061      if ( true && !context.parent) {
4062        throw new Error(`Cannot remove root node.`);
4063      }
4064      const list = context.parent.children;
4065      const removalIndex = node ? list.indexOf(node) : context.currentNode ? context.childIndex : -1;
4066      if ( true && removalIndex < 0) {
4067        throw new Error(`node being removed is not a child of current parent`);
4068      }
4069      if (!node || node === context.currentNode) {
4070        context.currentNode = null;
4071        context.onNodeRemoved();
4072      } else {
4073        if (context.childIndex > removalIndex) {
4074          context.childIndex--;
4075          context.onNodeRemoved();
4076        }
4077      }
4078      context.parent.children.splice(removalIndex, 1);
4079    },
4080    onNodeRemoved: _vue_shared__WEBPACK_IMPORTED_MODULE_0__.NOOP,
4081    addIdentifiers(exp) {
4082    },
4083    removeIdentifiers(exp) {
4084    },
4085    hoist(exp) {
4086      if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isString)(exp)) exp = createSimpleExpression(exp);
4087      context.hoists.push(exp);
4088      const identifier = createSimpleExpression(
4089        `_hoisted_${context.hoists.length}`,
4090        false,
4091        exp.loc,
4092        2
4093      );
4094      identifier.hoisted = exp;
4095      return identifier;
4096    },
4097    cache(exp, isVNode = false) {
4098      return createCacheExpression(context.cached++, exp, isVNode);
4099    }
4100  };
4101  {
4102    context.filters = /* @__PURE__ */ new Set();
4103  }
4104  return context;
4105}
4106function transform(root, options) {
4107  const context = createTransformContext(root, options);
4108  traverseNode(root, context);
4109  if (options.hoistStatic) {
4110    hoistStatic(root, context);
4111  }
4112  if (!options.ssr) {
4113    createRootCodegen(root, context);
4114  }
4115  root.helpers = /* @__PURE__ */ new Set([...context.helpers.keys()]);
4116  root.components = [...context.components];
4117  root.directives = [...context.directives];
4118  root.imports = context.imports;
4119  root.hoists = context.hoists;
4120  root.temps = context.temps;
4121  root.cached = context.cached;
4122  root.transformed = true;
4123  {
4124    root.filters = [...context.filters];
4125  }
4126}
4127function createRootCodegen(root, context) {
4128  const { helper } = context;
4129  const { children } = root;
4130  if (children.length === 1) {
4131    const child = children[0];
4132    if (isSingleElementRoot(root, child) && child.codegenNode) {
4133      const codegenNode = child.codegenNode;
4134      if (codegenNode.type === 13) {
4135        convertToBlock(codegenNode, context);
4136      }
4137      root.codegenNode = codegenNode;
4138    } else {
4139      root.codegenNode = child;
4140    }
4141  } else if (children.length > 1) {
4142    let patchFlag = 64;
4143    let patchFlagText = _vue_shared__WEBPACK_IMPORTED_MODULE_0__.PatchFlagNames[64];
4144    if ( true && children.filter((c) => c.type !== 3).length === 1) {
4145      patchFlag |= 2048;
4146      patchFlagText += `, ${_vue_shared__WEBPACK_IMPORTED_MODULE_0__.PatchFlagNames[2048]}`;
4147    }
4148    root.codegenNode = createVNodeCall(
4149      context,
4150      helper(FRAGMENT),
4151      void 0,
4152      root.children,
4153      patchFlag,
4154      void 0,
4155      void 0,
4156      true,
4157      void 0,
4158      false
4159    );
4160  } else ;
4161}
4162function traverseChildren(parent, context) {
4163  let i = 0;
4164  const nodeRemoved = () => {
4165    i--;
4166  };
4167  for (; i < parent.children.length; i++) {
4168    const child = parent.children[i];
4169    if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isString)(child)) continue;
4170    context.grandParent = context.parent;
4171    context.parent = parent;
4172    context.childIndex = i;
4173    context.onNodeRemoved = nodeRemoved;
4174    traverseNode(child, context);
4175  }
4176}
4177function traverseNode(node, context) {
4178  context.currentNode = node;
4179  const { nodeTransforms } = context;
4180  const exitFns = [];
4181  for (let i2 = 0; i2 < nodeTransforms.length; i2++) {
4182    const onExit = nodeTransforms[i2](node, context);
4183    if (onExit) {
4184      if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isArray)(onExit)) {
4185        exitFns.push(...onExit);
4186      } else {
4187        exitFns.push(onExit);
4188      }
4189    }
4190    if (!context.currentNode) {
4191      return;
4192    } else {
4193      node = context.currentNode;
4194    }
4195  }
4196  switch (node.type) {
4197    case 3:
4198      if (!context.ssr) {
4199        context.helper(CREATE_COMMENT);
4200      }
4201      break;
4202    case 5:
4203      if (!context.ssr) {
4204        context.helper(TO_DISPLAY_STRING);
4205      }
4206      break;
4207    case 9:
4208      for (let i2 = 0; i2 < node.branches.length; i2++) {
4209        traverseNode(node.branches[i2], context);
4210      }
4211      break;
4212    case 10:
4213    case 11:
4214    case 1:
4215    case 0:
4216      traverseChildren(node, context);
4217      break;
4218  }
4219  context.currentNode = node;
4220  let i = exitFns.length;
4221  while (i--) {
4222    exitFns[i]();
4223  }
4224}
4225function createStructuralDirectiveTransform(name, fn) {
4226  const matches = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isString)(name) ? (n) => n === name : (n) => name.test(n);
4227  return (node, context) => {
4228    if (node.type === 1) {
4229      const { props } = node;
4230      if (node.tagType === 3 && props.some(isVSlot)) {
4231        return;
4232      }
4233      const exitFns = [];
4234      for (let i = 0; i < props.length; i++) {
4235        const prop = props[i];
4236        if (prop.type === 7 && matches(prop.name)) {
4237          props.splice(i, 1);
4238          i--;
4239          const onExit = fn(node, prop, context);
4240          if (onExit) exitFns.push(onExit);
4241        }
4242      }
4243      return exitFns;
4244    }
4245  };
4246}
4247
4248const PURE_ANNOTATION = `/*#__PURE__*/`;
4249const aliasHelper = (s) => `${helperNameMap[s]}: _${helperNameMap[s]}`;
4250function createCodegenContext(ast, {
4251  mode = "function",
4252  prefixIdentifiers = mode === "module",
4253  sourceMap = false,
4254  filename = `template.vue.html`,
4255  scopeId = null,
4256  optimizeImports = false,
4257  runtimeGlobalName = `Vue`,
4258  runtimeModuleName = `vue`,
4259  ssrRuntimeModuleName = "vue/server-renderer",
4260  ssr = false,
4261  isTS = false,
4262  inSSR = false
4263}) {
4264  const context = {
4265    mode,
4266    prefixIdentifiers,
4267    sourceMap,
4268    filename,
4269    scopeId,
4270    optimizeImports,
4271    runtimeGlobalName,
4272    runtimeModuleName,
4273    ssrRuntimeModuleName,
4274    ssr,
4275    isTS,
4276    inSSR,
4277    source: ast.source,
4278    code: ``,
4279    column: 1,
4280    line: 1,
4281    offset: 0,
4282    indentLevel: 0,
4283    pure: false,
4284    map: void 0,
4285    helper(key) {
4286      return `_${helperNameMap[key]}`;
4287    },
4288    push(code, newlineIndex = -2 /* None */, node) {
4289      context.code += code;
4290    },
4291    indent() {
4292      newline(++context.indentLevel);
4293    },
4294    deindent(withoutNewLine = false) {
4295      if (withoutNewLine) {
4296        --context.indentLevel;
4297      } else {
4298        newline(--context.indentLevel);
4299      }
4300    },
4301    newline() {
4302      newline(context.indentLevel);
4303    }
4304  };
4305  function newline(n) {
4306    context.push("\n" + `  `.repeat(n), 0 /* Start */);
4307  }
4308  return context;
4309}
4310function generate(ast, options = {}) {
4311  const context = createCodegenContext(ast, options);
4312  if (options.onContextCreated) options.onContextCreated(context);
4313  const {
4314    mode,
4315    push,
4316    prefixIdentifiers,
4317    indent,
4318    deindent,
4319    newline,
4320    scopeId,
4321    ssr
4322  } = context;
4323  const helpers = Array.from(ast.helpers);
4324  const hasHelpers = helpers.length > 0;
4325  const useWithBlock = !prefixIdentifiers && mode !== "module";
4326  const preambleContext = context;
4327  {
4328    genFunctionPreamble(ast, preambleContext);
4329  }
4330  const functionName = ssr ? `ssrRender` : `render`;
4331  const args = ssr ? ["_ctx", "_push", "_parent", "_attrs"] : ["_ctx", "_cache"];
4332  const signature = args.join(", ");
4333  {
4334    push(`function ${functionName}(${signature}) {`);
4335  }
4336  indent();
4337  if (useWithBlock) {
4338    push(`with (_ctx) {`);
4339    indent();
4340    if (hasHelpers) {
4341      push(
4342        `const { ${helpers.map(aliasHelper).join(", ")} } = _Vue
4343`,
4344        -1 /* End */
4345      );
4346      newline();
4347    }
4348  }
4349  if (ast.components.length) {
4350    genAssets(ast.components, "component", context);
4351    if (ast.directives.length || ast.temps > 0) {
4352      newline();
4353    }
4354  }
4355  if (ast.directives.length) {
4356    genAssets(ast.directives, "directive", context);
4357    if (ast.temps > 0) {
4358      newline();
4359    }
4360  }
4361  if (ast.filters && ast.filters.length) {
4362    newline();
4363    genAssets(ast.filters, "filter", context);
4364    newline();
4365  }
4366  if (ast.temps > 0) {
4367    push(`let `);
4368    for (let i = 0; i < ast.temps; i++) {
4369      push(`${i > 0 ? `, ` : ``}_temp${i}`);
4370    }
4371  }
4372  if (ast.components.length || ast.directives.length || ast.temps) {
4373    push(`
4374`, 0 /* Start */);
4375    newline();
4376  }
4377  if (!ssr) {
4378    push(`return `);
4379  }
4380  if (ast.codegenNode) {
4381    genNode(ast.codegenNode, context);
4382  } else {
4383    push(`null`);
4384  }
4385  if (useWithBlock) {
4386    deindent();
4387    push(`}`);
4388  }
4389  deindent();
4390  push(`}`);
4391  return {
4392    ast,
4393    code: context.code,
4394    preamble: ``,
4395    map: context.map ? context.map.toJSON() : void 0
4396  };
4397}
4398function genFunctionPreamble(ast, context) {
4399  const {
4400    ssr,
4401    prefixIdentifiers,
4402    push,
4403    newline,
4404    runtimeModuleName,
4405    runtimeGlobalName,
4406    ssrRuntimeModuleName
4407  } = context;
4408  const VueBinding = runtimeGlobalName;
4409  const helpers = Array.from(ast.helpers);
4410  if (helpers.length > 0) {
4411    {
4412      push(`const _Vue = ${VueBinding}
4413`, -1 /* End */);
4414      if (ast.hoists.length) {
4415        const staticHelpers = [
4416          CREATE_VNODE,
4417          CREATE_ELEMENT_VNODE,
4418          CREATE_COMMENT,
4419          CREATE_TEXT,
4420          CREATE_STATIC
4421        ].filter((helper) => helpers.includes(helper)).map(aliasHelper).join(", ");
4422        push(`const { ${staticHelpers} } = _Vue
4423`, -1 /* End */);
4424      }
4425    }
4426  }
4427  genHoists(ast.hoists, context);
4428  newline();
4429  push(`return `);
4430}
4431function genAssets(assets, type, { helper, push, newline, isTS }) {
4432  const resolver = helper(
4433    type === "filter" ? RESOLVE_FILTER : type === "component" ? RESOLVE_COMPONENT : RESOLVE_DIRECTIVE
4434  );
4435  for (let i = 0; i < assets.length; i++) {
4436    let id = assets[i];
4437    const maybeSelfReference = id.endsWith("__self");
4438    if (maybeSelfReference) {
4439      id = id.slice(0, -6);
4440    }
4441    push(
4442      `const ${toValidAssetId(id, type)} = ${resolver}(${JSON.stringify(id)}${maybeSelfReference ? `, true` : ``})${isTS ? `!` : ``}`
4443    );
4444    if (i < assets.length - 1) {
4445      newline();
4446    }
4447  }
4448}
4449function genHoists(hoists, context) {
4450  if (!hoists.length) {
4451    return;
4452  }
4453  context.pure = true;
4454  const { push, newline, helper, scopeId, mode } = context;
4455  newline();
4456  for (let i = 0; i < hoists.length; i++) {
4457    const exp = hoists[i];
4458    if (exp) {
4459      push(
4460        `const _hoisted_${i + 1} = ${``}`
4461      );
4462      genNode(exp, context);
4463      newline();
4464    }
4465  }
4466  context.pure = false;
4467}
4468function isText(n) {
4469  return (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isString)(n) || n.type === 4 || n.type === 2 || n.type === 5 || n.type === 8;
4470}
4471function genNodeListAsArray(nodes, context) {
4472  const multilines = nodes.length > 3 ||  true && nodes.some((n) => (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isArray)(n) || !isText(n));
4473  context.push(`[`);
4474  multilines && context.indent();
4475  genNodeList(nodes, context, multilines);
4476  multilines && context.deindent();
4477  context.push(`]`);
4478}
4479function genNodeList(nodes, context, multilines = false, comma = true) {
4480  const { push, newline } = context;
4481  for (let i = 0; i < nodes.length; i++) {
4482    const node = nodes[i];
4483    if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isString)(node)) {
4484      push(node, -3 /* Unknown */);
4485    } else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isArray)(node)) {
4486      genNodeListAsArray(node, context);
4487    } else {
4488      genNode(node, context);
4489    }
4490    if (i < nodes.length - 1) {
4491      if (multilines) {
4492        comma && push(",");
4493        newline();
4494      } else {
4495        comma && push(", ");
4496      }
4497    }
4498  }
4499}
4500function genNode(node, context) {
4501  if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isString)(node)) {
4502    context.push(node, -3 /* Unknown */);
4503    return;
4504  }
4505  if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isSymbol)(node)) {
4506    context.push(context.helper(node));
4507    return;
4508  }
4509  switch (node.type) {
4510    case 1:
4511    case 9:
4512    case 11:
4513       true && assert(
4514        node.codegenNode != null,
4515        `Codegen node is missing for element/if/for node. Apply appropriate transforms first.`
4516      );
4517      genNode(node.codegenNode, context);
4518      break;
4519    case 2:
4520      genText(node, context);
4521      break;
4522    case 4:
4523      genExpression(node, context);
4524      break;
4525    case 5:
4526      genInterpolation(node, context);
4527      break;
4528    case 12:
4529      genNode(node.codegenNode, context);
4530      break;
4531    case 8:
4532      genCompoundExpression(node, context);
4533      break;
4534    case 3:
4535      genComment(node, context);
4536      break;
4537    case 13:
4538      genVNodeCall(node, context);
4539      break;
4540    case 14:
4541      genCallExpression(node, context);
4542      break;
4543    case 15:
4544      genObjectExpression(node, context);
4545      break;
4546    case 17:
4547      genArrayExpression(node, context);
4548      break;
4549    case 18:
4550      genFunctionExpression(node, context);
4551      break;
4552    case 19:
4553      genConditionalExpression(node, context);
4554      break;
4555    case 20:
4556      genCacheExpression(node, context);
4557      break;
4558    case 21:
4559      genNodeList(node.body, context, true, false);
4560      break;
4561    case 22:
4562      break;
4563    case 23:
4564      break;
4565    case 24:
4566      break;
4567    case 25:
4568      break;
4569    case 26:
4570      break;
4571    case 10:
4572      break;
4573    default:
4574      if (true) {
4575        assert(false, `unhandled codegen node type: ${node.type}`);
4576        const exhaustiveCheck = node;
4577        return exhaustiveCheck;
4578      }
4579  }
4580}
4581function genText(node, context) {
4582  context.push(JSON.stringify(node.content), -3 /* Unknown */, node);
4583}
4584function genExpression(node, context) {
4585  const { content, isStatic } = node;
4586  context.push(
4587    isStatic ? JSON.stringify(content) : content,
4588    -3 /* Unknown */,
4589    node
4590  );
4591}
4592function genInterpolation(node, context) {
4593  const { push, helper, pure } = context;
4594  if (pure) push(PURE_ANNOTATION);
4595  push(`${helper(TO_DISPLAY_STRING)}(`);
4596  genNode(node.content, context);
4597  push(`)`);
4598}
4599function genCompoundExpression(node, context) {
4600  for (let i = 0; i < node.children.length; i++) {
4601    const child = node.children[i];
4602    if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isString)(child)) {
4603      context.push(child, -3 /* Unknown */);
4604    } else {
4605      genNode(child, context);
4606    }
4607  }
4608}
4609function genExpressionAsPropertyKey(node, context) {
4610  const { push } = context;
4611  if (node.type === 8) {
4612    push(`[`);
4613    genCompoundExpression(node, context);
4614    push(`]`);
4615  } else if (node.isStatic) {
4616    const text = isSimpleIdentifier(node.content) ? node.content : JSON.stringify(node.content);
4617    push(text, -2 /* None */, node);
4618  } else {
4619    push(`[${node.content}]`, -3 /* Unknown */, node);
4620  }
4621}
4622function genComment(node, context) {
4623  const { push, helper, pure } = context;
4624  if (pure) {
4625    push(PURE_ANNOTATION);
4626  }
4627  push(
4628    `${helper(CREATE_COMMENT)}(${JSON.stringify(node.content)})`,
4629    -3 /* Unknown */,
4630    node
4631  );
4632}
4633function genVNodeCall(node, context) {
4634  const { push, helper, pure } = context;
4635  const {
4636    tag,
4637    props,
4638    children,
4639    patchFlag,
4640    dynamicProps,
4641    directives,
4642    isBlock,
4643    disableTracking,
4644    isComponent
4645  } = node;
4646  let patchFlagString;
4647  if (patchFlag) {
4648    if (true) {
4649      if (patchFlag < 0) {
4650        patchFlagString = patchFlag + ` /* ${_vue_shared__WEBPACK_IMPORTED_MODULE_0__.PatchFlagNames[patchFlag]} */`;
4651      } else {
4652        const flagNames = Object.keys(_vue_shared__WEBPACK_IMPORTED_MODULE_0__.PatchFlagNames).map(Number).filter((n) => n > 0 && patchFlag & n).map((n) => _vue_shared__WEBPACK_IMPORTED_MODULE_0__.PatchFlagNames[n]).join(`, `);
4653        patchFlagString = patchFlag + ` /* ${flagNames} */`;
4654      }
4655    } else {}
4656  }
4657  if (directives) {
4658    push(helper(WITH_DIRECTIVES) + `(`);
4659  }
4660  if (isBlock) {
4661    push(`(${helper(OPEN_BLOCK)}(${disableTracking ? `true` : ``}), `);
4662  }
4663  if (pure) {
4664    push(PURE_ANNOTATION);
4665  }
4666  const callHelper = isBlock ? getVNodeBlockHelper(context.inSSR, isComponent) : getVNodeHelper(context.inSSR, isComponent);
4667  push(helper(callHelper) + `(`, -2 /* None */, node);
4668  genNodeList(
4669    genNullableArgs([tag, props, children, patchFlagString, dynamicProps]),
4670    context
4671  );
4672  push(`)`);
4673  if (isBlock) {
4674    push(`)`);
4675  }
4676  if (directives) {
4677    push(`, `);
4678    genNode(directives, context);
4679    push(`)`);
4680  }
4681}
4682function genNullableArgs(args) {
4683  let i = args.length;
4684  while (i--) {
4685    if (args[i] != null) break;
4686  }
4687  return args.slice(0, i + 1).map((arg) => arg || `null`);
4688}
4689function genCallExpression(node, context) {
4690  const { push, helper, pure } = context;
4691  const callee = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isString)(node.callee) ? node.callee : helper(node.callee);
4692  if (pure) {
4693    push(PURE_ANNOTATION);
4694  }
4695  push(callee + `(`, -2 /* None */, node);
4696  genNodeList(node.arguments, context);
4697  push(`)`);
4698}
4699function genObjectExpression(node, context) {
4700  const { push, indent, deindent, newline } = context;
4701  const { properties } = node;
4702  if (!properties.length) {
4703    push(`{}`, -2 /* None */, node);
4704    return;
4705  }
4706  const multilines = properties.length > 1 ||  true && properties.some((p) => p.value.type !== 4);
4707  push(multilines ? `{` : `{ `);
4708  multilines && indent();
4709  for (let i = 0; i < properties.length; i++) {
4710    const { key, value } = properties[i];
4711    genExpressionAsPropertyKey(key, context);
4712    push(`: `);
4713    genNode(value, context);
4714    if (i < properties.length - 1) {
4715      push(`,`);
4716      newline();
4717    }
4718  }
4719  multilines && deindent();
4720  push(multilines ? `}` : ` }`);
4721}
4722function genArrayExpression(node, context) {
4723  genNodeListAsArray(node.elements, context);
4724}
4725function genFunctionExpression(node, context) {
4726  const { push, indent, deindent } = context;
4727  const { params, returns, body, newline, isSlot } = node;
4728  if (isSlot) {
4729    push(`_${helperNameMap[WITH_CTX]}(`);
4730  }
4731  push(`(`, -2 /* None */, node);
4732  if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isArray)(params)) {
4733    genNodeList(params, context);
4734  } else if (params) {
4735    genNode(params, context);
4736  }
4737  push(`) => `);
4738  if (newline || body) {
4739    push(`{`);
4740    indent();
4741  }
4742  if (returns) {
4743    if (newline) {
4744      push(`return `);
4745    }
4746    if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isArray)(returns)) {
4747      genNodeListAsArray(returns, context);
4748    } else {
4749      genNode(returns, context);
4750    }
4751  } else if (body) {
4752    genNode(body, context);
4753  }
4754  if (newline || body) {
4755    deindent();
4756    push(`}`);
4757  }
4758  if (isSlot) {
4759    if (node.isNonScopedSlot) {
4760      push(`, undefined, true`);
4761    }
4762    push(`)`);
4763  }
4764}
4765function genConditionalExpression(node, context) {
4766  const { test, consequent, alternate, newline: needNewline } = node;
4767  const { push, indent, deindent, newline } = context;
4768  if (test.type === 4) {
4769    const needsParens = !isSimpleIdentifier(test.content);
4770    needsParens && push(`(`);
4771    genExpression(test, context);
4772    needsParens && push(`)`);
4773  } else {
4774    push(`(`);
4775    genNode(test, context);
4776    push(`)`);
4777  }
4778  needNewline && indent();
4779  context.indentLevel++;
4780  needNewline || push(` `);
4781  push(`? `);
4782  genNode(consequent, context);
4783  context.indentLevel--;
4784  needNewline && newline();
4785  needNewline || push(` `);
4786  push(`: `);
4787  const isNested = alternate.type === 19;
4788  if (!isNested) {
4789    context.indentLevel++;
4790  }
4791  genNode(alternate, context);
4792  if (!isNested) {
4793    context.indentLevel--;
4794  }
4795  needNewline && deindent(
4796    true
4797    /* without newline */
4798  );
4799}
4800function genCacheExpression(node, context) {
4801  const { push, helper, indent, deindent, newline } = context;
4802  push(`_cache[${node.index}] || (`);
4803  if (node.isVOnce) {
4804    indent();
4805    push(`${helper(SET_BLOCK_TRACKING)}(-1),`);
4806    newline();
4807    push(`(`);
4808  }
4809  push(`_cache[${node.index}] = `);
4810  genNode(node.value, context);
4811  if (node.isVOnce) {
4812    push(`).cacheIndex = ${node.index},`);
4813    newline();
4814    push(`${helper(SET_BLOCK_TRACKING)}(1),`);
4815    newline();
4816    push(`_cache[${node.index}]`);
4817    deindent();
4818  }
4819  push(`)`);
4820}
4821
4822const prohibitedKeywordRE = new RegExp(
4823  "\\b" + "arguments,await,break,case,catch,class,const,continue,debugger,default,delete,do,else,export,extends,finally,for,function,if,import,let,new,return,super,switch,throw,try,var,void,while,with,yield".split(",").join("\\b|\\b") + "\\b"
4824);
4825const stripStringRE = /'(?:[^'\\]|\\.)*'|"(?:[^"\\]|\\.)*"|`(?:[^`\\]|\\.)*\$\{|\}(?:[^`\\]|\\.)*`|`(?:[^`\\]|\\.)*`/g;
4826function validateBrowserExpression(node, context, asParams = false, asRawStatements = false) {
4827  const exp = node.content;
4828  if (!exp.trim()) {
4829    return;
4830  }
4831  try {
4832    new Function(
4833      asRawStatements ? ` ${exp} ` : `return ${asParams ? `(${exp}) => {}` : `(${exp})`}`
4834    );
4835  } catch (e) {
4836    let message = e.message;
4837    const keywordMatch = exp.replace(stripStringRE, "").match(prohibitedKeywordRE);
4838    if (keywordMatch) {
4839      message = `avoid using JavaScript keyword as property name: "${keywordMatch[0]}"`;
4840    }
4841    context.onError(
4842      createCompilerError(
4843        45,
4844        node.loc,
4845        void 0,
4846        message
4847      )
4848    );
4849  }
4850}
4851
4852const transformExpression = (node, context) => {
4853  if (node.type === 5) {
4854    node.content = processExpression(
4855      node.content,
4856      context
4857    );
4858  } else if (node.type === 1) {
4859    for (let i = 0; i < node.props.length; i++) {
4860      const dir = node.props[i];
4861      if (dir.type === 7 && dir.name !== "for") {
4862        const exp = dir.exp;
4863        const arg = dir.arg;
4864        if (exp && exp.type === 4 && !(dir.name === "on" && arg)) {
4865          dir.exp = processExpression(
4866            exp,
4867            context,
4868            // slot args must be processed as function params
4869            dir.name === "slot"
4870          );
4871        }
4872        if (arg && arg.type === 4 && !arg.isStatic) {
4873          dir.arg = processExpression(arg, context);
4874        }
4875      }
4876    }
4877  }
4878};
4879function processExpression(node, context, asParams = false, asRawStatements = false, localVars = Object.create(context.identifiers)) {
4880  {
4881    if (true) {
4882      validateBrowserExpression(node, context, asParams, asRawStatements);
4883    }
4884    return node;
4885  }
4886}
4887function stringifyExpression(exp) {
4888  if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isString)(exp)) {
4889    return exp;
4890  } else if (exp.type === 4) {
4891    return exp.content;
4892  } else {
4893    return exp.children.map(stringifyExpression).join("");
4894  }
4895}
4896
4897const transformIf = createStructuralDirectiveTransform(
4898  /^(if|else|else-if)$/,
4899  (node, dir, context) => {
4900    return processIf(node, dir, context, (ifNode, branch, isRoot) => {
4901      const siblings = context.parent.children;
4902      let i = siblings.indexOf(ifNode);
4903      let key = 0;
4904      while (i-- >= 0) {
4905        const sibling = siblings[i];
4906        if (sibling && sibling.type === 9) {
4907          key += sibling.branches.length;
4908        }
4909      }
4910      return () => {
4911        if (isRoot) {
4912          ifNode.codegenNode = createCodegenNodeForBranch(
4913            branch,
4914            key,
4915            context
4916          );
4917        } else {
4918          const parentCondition = getParentCondition(ifNode.codegenNode);
4919          parentCondition.alternate = createCodegenNodeForBranch(
4920            branch,
4921            key + ifNode.branches.length - 1,
4922            context
4923          );
4924        }
4925      };
4926    });
4927  }
4928);
4929function processIf(node, dir, context, processCodegen) {
4930  if (dir.name !== "else" && (!dir.exp || !dir.exp.content.trim())) {
4931    const loc = dir.exp ? dir.exp.loc : node.loc;
4932    context.onError(
4933      createCompilerError(28, dir.loc)
4934    );
4935    dir.exp = createSimpleExpression(`true`, false, loc);
4936  }
4937  if ( true && dir.exp) {
4938    validateBrowserExpression(dir.exp, context);
4939  }
4940  if (dir.name === "if") {
4941    const branch = createIfBranch(node, dir);
4942    const ifNode = {
4943      type: 9,
4944      loc: node.loc,
4945      branches: [branch]
4946    };
4947    context.replaceNode(ifNode);
4948    if (processCodegen) {
4949      return processCodegen(ifNode, branch, true);
4950    }
4951  } else {
4952    const siblings = context.parent.children;
4953    const comments = [];
4954    let i = siblings.indexOf(node);
4955    while (i-- >= -1) {
4956      const sibling = siblings[i];
4957      if (sibling && sibling.type === 3) {
4958        context.removeNode(sibling);
4959         true && comments.unshift(sibling);
4960        continue;
4961      }
4962      if (sibling && sibling.type === 2 && !sibling.content.trim().length) {
4963        context.removeNode(sibling);
4964        continue;
4965      }
4966      if (sibling && sibling.type === 9) {
4967        if (dir.name === "else-if" && sibling.branches[sibling.branches.length - 1].condition === void 0) {
4968          context.onError(
4969            createCompilerError(30, node.loc)
4970          );
4971        }
4972        context.removeNode();
4973        const branch = createIfBranch(node, dir);
4974        if ( true && comments.length && // #3619 ignore comments if the v-if is direct child of <transition>
4975        !(context.parent && context.parent.type === 1 && (context.parent.tag === "transition" || context.parent.tag === "Transition"))) {
4976          branch.children = [...comments, ...branch.children];
4977        }
4978        if (true) {
4979          const key = branch.userKey;
4980          if (key) {
4981            sibling.branches.forEach(({ userKey }) => {
4982              if (isSameKey(userKey, key)) {
4983                context.onError(
4984                  createCompilerError(
4985                    29,
4986                    branch.userKey.loc
4987                  )
4988                );
4989              }
4990            });
4991          }
4992        }
4993        sibling.branches.push(branch);
4994        const onExit = processCodegen && processCodegen(sibling, branch, false);
4995        traverseNode(branch, context);
4996        if (onExit) onExit();
4997        context.currentNode = null;
4998      } else {
4999        context.onError(
5000          createCompilerError(30, node.loc)
5001        );
5002      }
5003      break;
5004    }
5005  }
5006}
5007function createIfBranch(node, dir) {
5008  const isTemplateIf = node.tagType === 3;
5009  return {
5010    type: 10,
5011    loc: node.loc,
5012    condition: dir.name === "else" ? void 0 : dir.exp,
5013    children: isTemplateIf && !findDir(node, "for") ? node.children : [node],
5014    userKey: findProp(node, `key`),
5015    isTemplateIf
5016  };
5017}
5018function createCodegenNodeForBranch(branch, keyIndex, context) {
5019  if (branch.condition) {
5020    return createConditionalExpression(
5021      branch.condition,
5022      createChildrenCodegenNode(branch, keyIndex, context),
5023      // make sure to pass in asBlock: true so that the comment node call
5024      // closes the current block.
5025      createCallExpression(context.helper(CREATE_COMMENT), [
5026         true ? '"v-if"' : 0,
5027        "true"
5028      ])
5029    );
5030  } else {
5031    return createChildrenCodegenNode(branch, keyIndex, context);
5032  }
5033}
5034function createChildrenCodegenNode(branch, keyIndex, context) {
5035  const { helper } = context;
5036  const keyProperty = createObjectProperty(
5037    `key`,
5038    createSimpleExpression(
5039      `${keyIndex}`,
5040      false,
5041      locStub,
5042      2
5043    )
5044  );
5045  const { children } = branch;
5046  const firstChild = children[0];
5047  const needFragmentWrapper = children.length !== 1 || firstChild.type !== 1;
5048  if (needFragmentWrapper) {
5049    if (children.length === 1 && firstChild.type === 11) {
5050      const vnodeCall = firstChild.codegenNode;
5051      injectProp(vnodeCall, keyProperty, context);
5052      return vnodeCall;
5053    } else {
5054      let patchFlag = 64;
5055      let patchFlagText = _vue_shared__WEBPACK_IMPORTED_MODULE_0__.PatchFlagNames[64];
5056      if ( true && !branch.isTemplateIf && children.filter((c) => c.type !== 3).length === 1) {
5057        patchFlag |= 2048;
5058        patchFlagText += `, ${_vue_shared__WEBPACK_IMPORTED_MODULE_0__.PatchFlagNames[2048]}`;
5059      }
5060      return createVNodeCall(
5061        context,
5062        helper(FRAGMENT),
5063        createObjectExpression([keyProperty]),
5064        children,
5065        patchFlag,
5066        void 0,
5067        void 0,
5068        true,
5069        false,
5070        false,
5071        branch.loc
5072      );
5073    }
5074  } else {
5075    const ret = firstChild.codegenNode;
5076    const vnodeCall = getMemoedVNodeCall(ret);
5077    if (vnodeCall.type === 13) {
5078      convertToBlock(vnodeCall, context);
5079    }
5080    injectProp(vnodeCall, keyProperty, context);
5081    return ret;
5082  }
5083}
5084function isSameKey(a, b) {
5085  if (!a || a.type !== b.type) {
5086    return false;
5087  }
5088  if (a.type === 6) {
5089    if (a.value.content !== b.value.content) {
5090      return false;
5091    }
5092  } else {
5093    const exp = a.exp;
5094    const branchExp = b.exp;
5095    if (exp.type !== branchExp.type) {
5096      return false;
5097    }
5098    if (exp.type !== 4 || exp.isStatic !== branchExp.isStatic || exp.content !== branchExp.content) {
5099      return false;
5100    }
5101  }
5102  return true;
5103}
5104function getParentCondition(node) {
5105  while (true) {
5106    if (node.type === 19) {
5107      if (node.alternate.type === 19) {
5108        node = node.alternate;
5109      } else {
5110        return node;
5111      }
5112    } else if (node.type === 20) {
5113      node = node.value;
5114    }
5115  }
5116}
5117
5118const transformBind = (dir, _node, context) => {
5119  const { modifiers, loc } = dir;
5120  const arg = dir.arg;
5121  let { exp } = dir;
5122  if (exp && exp.type === 4 && !exp.content.trim()) {
5123    {
5124      exp = void 0;
5125    }
5126  }
5127  if (!exp) {
5128    if (arg.type !== 4 || !arg.isStatic) {
5129      context.onError(
5130        createCompilerError(
5131          52,
5132          arg.loc
5133        )
5134      );
5135      return {
5136        props: [
5137          createObjectProperty(arg, createSimpleExpression("", true, loc))
5138        ]
5139      };
5140    }
5141    transformBindShorthand(dir);
5142    exp = dir.exp;
5143  }
5144  if (arg.type !== 4) {
5145    arg.children.unshift(`(`);
5146    arg.children.push(`) || ""`);
5147  } else if (!arg.isStatic) {
5148    arg.content = `${arg.content} || ""`;
5149  }
5150  if (modifiers.includes("camel")) {
5151    if (arg.type === 4) {
5152      if (arg.isStatic) {
5153        arg.content = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.camelize)(arg.content);
5154      } else {
5155        arg.content = `${context.helperString(CAMELIZE)}(${arg.content})`;
5156      }
5157    } else {
5158      arg.children.unshift(`${context.helperString(CAMELIZE)}(`);
5159      arg.children.push(`)`);
5160    }
5161  }
5162  if (!context.inSSR) {
5163    if (modifiers.includes("prop")) {
5164      injectPrefix(arg, ".");
5165    }
5166    if (modifiers.includes("attr")) {
5167      injectPrefix(arg, "^");
5168    }
5169  }
5170  return {
5171    props: [createObjectProperty(arg, exp)]
5172  };
5173};
5174const transformBindShorthand = (dir, context) => {
5175  const arg = dir.arg;
5176  const propName = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.camelize)(arg.content);
5177  dir.exp = createSimpleExpression(propName, false, arg.loc);
5178};
5179const injectPrefix = (arg, prefix) => {
5180  if (arg.type === 4) {
5181    if (arg.isStatic) {
5182      arg.content = prefix + arg.content;
5183    } else {
5184      arg.content = `\`${prefix}\${${arg.content}}\``;
5185    }
5186  } else {
5187    arg.children.unshift(`'${prefix}' + (`);
5188    arg.children.push(`)`);
5189  }
5190};
5191
5192const transformFor = createStructuralDirectiveTransform(
5193  "for",
5194  (node, dir, context) => {
5195    const { helper, removeHelper } = context;
5196    return processFor(node, dir, context, (forNode) => {
5197      const renderExp = createCallExpression(helper(RENDER_LIST), [
5198        forNode.source
5199      ]);
5200      const isTemplate = isTemplateNode(node);
5201      const memo = findDir(node, "memo");
5202      const keyProp = findProp(node, `key`, false, true);
5203      if (keyProp && keyProp.type === 7 && !keyProp.exp) {
5204        transformBindShorthand(keyProp);
5205      }
5206      const keyExp = keyProp && (keyProp.type === 6 ? keyProp.value ? createSimpleExpression(keyProp.value.content, true) : void 0 : keyProp.exp);
5207      const keyProperty = keyProp && keyExp ? createObjectProperty(`key`, keyExp) : null;
5208      const isStableFragment = forNode.source.type === 4 && forNode.source.constType > 0;
5209      const fragmentFlag = isStableFragment ? 64 : keyProp ? 128 : 256;
5210      forNode.codegenNode = createVNodeCall(
5211        context,
5212        helper(FRAGMENT),
5213        void 0,
5214        renderExp,
5215        fragmentFlag,
5216        void 0,
5217        void 0,
5218        true,
5219        !isStableFragment,
5220        false,
5221        node.loc
5222      );
5223      return () => {
5224        let childBlock;
5225        const { children } = forNode;
5226        if (( true) && isTemplate) {
5227          node.children.some((c) => {
5228            if (c.type === 1) {
5229              const key = findProp(c, "key");
5230              if (key) {
5231                context.onError(
5232                  createCompilerError(
5233                    33,
5234                    key.loc
5235                  )
5236                );
5237                return true;
5238              }
5239            }
5240          });
5241        }
5242        const needFragmentWrapper = children.length !== 1 || children[0].type !== 1;
5243        const slotOutlet = isSlotOutlet(node) ? node : isTemplate && node.children.length === 1 && isSlotOutlet(node.children[0]) ? node.children[0] : null;
5244        if (slotOutlet) {
5245          childBlock = slotOutlet.codegenNode;
5246          if (isTemplate && keyProperty) {
5247            injectProp(childBlock, keyProperty, context);
5248          }
5249        } else if (needFragmentWrapper) {
5250          childBlock = createVNodeCall(
5251            context,
5252            helper(FRAGMENT),
5253            keyProperty ? createObjectExpression([keyProperty]) : void 0,
5254            node.children,
5255            64,
5256            void 0,
5257            void 0,
5258            true,
5259            void 0,
5260            false
5261          );
5262        } else {
5263          childBlock = children[0].codegenNode;
5264          if (isTemplate && keyProperty) {
5265            injectProp(childBlock, keyProperty, context);
5266          }
5267          if (childBlock.isBlock !== !isStableFragment) {
5268            if (childBlock.isBlock) {
5269              removeHelper(OPEN_BLOCK);
5270              removeHelper(
5271                getVNodeBlockHelper(context.inSSR, childBlock.isComponent)
5272              );
5273            } else {
5274              removeHelper(
5275                getVNodeHelper(context.inSSR, childBlock.isComponent)
5276              );
5277            }
5278          }
5279          childBlock.isBlock = !isStableFragment;
5280          if (childBlock.isBlock) {
5281            helper(OPEN_BLOCK);
5282            helper(getVNodeBlockHelper(context.inSSR, childBlock.isComponent));
5283          } else {
5284            helper(getVNodeHelper(context.inSSR, childBlock.isComponent));
5285          }
5286        }
5287        if (memo) {
5288          const loop = createFunctionExpression(
5289            createForLoopParams(forNode.parseResult, [
5290              createSimpleExpression(`_cached`)
5291            ])
5292          );
5293          loop.body = createBlockStatement([
5294            createCompoundExpression([`const _memo = (`, memo.exp, `)`]),
5295            createCompoundExpression([
5296              `if (_cached`,
5297              ...keyExp ? [` && _cached.key === `, keyExp] : [],
5298              ` && ${context.helperString(
5299                IS_MEMO_SAME
5300              )}(_cached, _memo)) return _cached`
5301            ]),
5302            createCompoundExpression([`const _item = `, childBlock]),
5303            createSimpleExpression(`_item.memo = _memo`),
5304            createSimpleExpression(`return _item`)
5305          ]);
5306          renderExp.arguments.push(
5307            loop,
5308            createSimpleExpression(`_cache`),
5309            createSimpleExpression(String(context.cached++))
5310          );
5311        } else {
5312          renderExp.arguments.push(
5313            createFunctionExpression(
5314              createForLoopParams(forNode.parseResult),
5315              childBlock,
5316              true
5317            )
5318          );
5319        }
5320      };
5321    });
5322  }
5323);
5324function processFor(node, dir, context, processCodegen) {
5325  if (!dir.exp) {
5326    context.onError(
5327      createCompilerError(31, dir.loc)
5328    );
5329    return;
5330  }
5331  const parseResult = dir.forParseResult;
5332  if (!parseResult) {
5333    context.onError(
5334      createCompilerError(32, dir.loc)
5335    );
5336    return;
5337  }
5338  finalizeForParseResult(parseResult, context);
5339  const { addIdentifiers, removeIdentifiers, scopes } = context;
5340  const { source, value, key, index } = parseResult;
5341  const forNode = {
5342    type: 11,
5343    loc: dir.loc,
5344    source,
5345    valueAlias: value,
5346    keyAlias: key,
5347    objectIndexAlias: index,
5348    parseResult,
5349    children: isTemplateNode(node) ? node.children : [node]
5350  };
5351  context.replaceNode(forNode);
5352  scopes.vFor++;
5353  const onExit = processCodegen && processCodegen(forNode);
5354  return () => {
5355    scopes.vFor--;
5356    if (onExit) onExit();
5357  };
5358}
5359function finalizeForParseResult(result, context) {
5360  if (result.finalized) return;
5361  if (true) {
5362    validateBrowserExpression(result.source, context);
5363    if (result.key) {
5364      validateBrowserExpression(
5365        result.key,
5366        context,
5367        true
5368      );
5369    }
5370    if (result.index) {
5371      validateBrowserExpression(
5372        result.index,
5373        context,
5374        true
5375      );
5376    }
5377    if (result.value) {
5378      validateBrowserExpression(
5379        result.value,
5380        context,
5381        true
5382      );
5383    }
5384  }
5385  result.finalized = true;
5386}
5387function createForLoopParams({ value, key, index }, memoArgs = []) {
5388  return createParamsList([value, key, index, ...memoArgs]);
5389}
5390function createParamsList(args) {
5391  let i = args.length;
5392  while (i--) {
5393    if (args[i]) break;
5394  }
5395  return args.slice(0, i + 1).map((arg, i2) => arg || createSimpleExpression(`_`.repeat(i2 + 1), false));
5396}
5397
5398const defaultFallback = createSimpleExpression(`undefined`, false);
5399const trackSlotScopes = (node, context) => {
5400  if (node.type === 1 && (node.tagType === 1 || node.tagType === 3)) {
5401    const vSlot = findDir(node, "slot");
5402    if (vSlot) {
5403      vSlot.exp;
5404      context.scopes.vSlot++;
5405      return () => {
5406        context.scopes.vSlot--;
5407      };
5408    }
5409  }
5410};
5411const trackVForSlotScopes = (node, context) => {
5412  let vFor;
5413  if (isTemplateNode(node) && node.props.some(isVSlot) && (vFor = findDir(node, "for"))) {
5414    const result = vFor.forParseResult;
5415    if (result) {
5416      finalizeForParseResult(result, context);
5417      const { value, key, index } = result;
5418      const { addIdentifiers, removeIdentifiers } = context;
5419      value && addIdentifiers(value);
5420      key && addIdentifiers(key);
5421      index && addIdentifiers(index);
5422      return () => {
5423        value && removeIdentifiers(value);
5424        key && removeIdentifiers(key);
5425        index && removeIdentifiers(index);
5426      };
5427    }
5428  }
5429};
5430const buildClientSlotFn = (props, _vForExp, children, loc) => createFunctionExpression(
5431  props,
5432  children,
5433  false,
5434  true,
5435  children.length ? children[0].loc : loc
5436);
5437function buildSlots(node, context, buildSlotFn = buildClientSlotFn) {
5438  context.helper(WITH_CTX);
5439  const { children, loc } = node;
5440  const slotsProperties = [];
5441  const dynamicSlots = [];
5442  let hasDynamicSlots = context.scopes.vSlot > 0 || context.scopes.vFor > 0;
5443  const onComponentSlot = findDir(node, "slot", true);
5444  if (onComponentSlot) {
5445    const { arg, exp } = onComponentSlot;
5446    if (arg && !isStaticExp(arg)) {
5447      hasDynamicSlots = true;
5448    }
5449    slotsProperties.push(
5450      createObjectProperty(
5451        arg || createSimpleExpression("default", true),
5452        buildSlotFn(exp, void 0, children, loc)
5453      )
5454    );
5455  }
5456  let hasTemplateSlots = false;
5457  let hasNamedDefaultSlot = false;
5458  const implicitDefaultChildren = [];
5459  const seenSlotNames = /* @__PURE__ */ new Set();
5460  let conditionalBranchIndex = 0;
5461  for (let i = 0; i < children.length; i++) {
5462    const slotElement = children[i];
5463    let slotDir;
5464    if (!isTemplateNode(slotElement) || !(slotDir = findDir(slotElement, "slot", true))) {
5465      if (slotElement.type !== 3) {
5466        implicitDefaultChildren.push(slotElement);
5467      }
5468      continue;
5469    }
5470    if (onComponentSlot) {
5471      context.onError(
5472        createCompilerError(37, slotDir.loc)
5473      );
5474      break;
5475    }
5476    hasTemplateSlots = true;
5477    const { children: slotChildren, loc: slotLoc } = slotElement;
5478    const {
5479      arg: slotName = createSimpleExpression(`default`, true),
5480      exp: slotProps,
5481      loc: dirLoc
5482    } = slotDir;
5483    let staticSlotName;
5484    if (isStaticExp(slotName)) {
5485      staticSlotName = slotName ? slotName.content : `default`;
5486    } else {
5487      hasDynamicSlots = true;
5488    }
5489    const vFor = findDir(slotElement, "for");
5490    const slotFunction = buildSlotFn(slotProps, vFor, slotChildren, slotLoc);
5491    let vIf;
5492    let vElse;
5493    if (vIf = findDir(slotElement, "if")) {
5494      hasDynamicSlots = true;
5495      dynamicSlots.push(
5496        createConditionalExpression(
5497          vIf.exp,
5498          buildDynamicSlot(slotName, slotFunction, conditionalBranchIndex++),
5499          defaultFallback
5500        )
5501      );
5502    } else if (vElse = findDir(
5503      slotElement,
5504      /^else(-if)?$/,
5505      true
5506      /* allowEmpty */
5507    )) {
5508      let j = i;
5509      let prev;
5510      while (j--) {
5511        prev = children[j];
5512        if (prev.type !== 3) {
5513          break;
5514        }
5515      }
5516      if (prev && isTemplateNode(prev) && findDir(prev, /^(else-)?if$/)) {
5517        let conditional = dynamicSlots[dynamicSlots.length - 1];
5518        while (conditional.alternate.type === 19) {
5519          conditional = conditional.alternate;
5520        }
5521        conditional.alternate = vElse.exp ? createConditionalExpression(
5522          vElse.exp,
5523          buildDynamicSlot(
5524            slotName,
5525            slotFunction,
5526            conditionalBranchIndex++
5527          ),
5528          defaultFallback
5529        ) : buildDynamicSlot(slotName, slotFunction, conditionalBranchIndex++);
5530      } else {
5531        context.onError(
5532          createCompilerError(30, vElse.loc)
5533        );
5534      }
5535    } else if (vFor) {
5536      hasDynamicSlots = true;
5537      const parseResult = vFor.forParseResult;
5538      if (parseResult) {
5539        finalizeForParseResult(parseResult, context);
5540        dynamicSlots.push(
5541          createCallExpression(context.helper(RENDER_LIST), [
5542            parseResult.source,
5543            createFunctionExpression(
5544              createForLoopParams(parseResult),
5545              buildDynamicSlot(slotName, slotFunction),
5546              true
5547            )
5548          ])
5549        );
5550      } else {
5551        context.onError(
5552          createCompilerError(
5553            32,
5554            vFor.loc
5555          )
5556        );
5557      }
5558    } else {
5559      if (staticSlotName) {
5560        if (seenSlotNames.has(staticSlotName)) {
5561          context.onError(
5562            createCompilerError(
5563              38,
5564              dirLoc
5565            )
5566          );
5567          continue;
5568        }
5569        seenSlotNames.add(staticSlotName);
5570        if (staticSlotName === "default") {
5571          hasNamedDefaultSlot = true;
5572        }
5573      }
5574      slotsProperties.push(createObjectProperty(slotName, slotFunction));
5575    }
5576  }
5577  if (!onComponentSlot) {
5578    const buildDefaultSlotProperty = (props, children2) => {
5579      const fn = buildSlotFn(props, void 0, children2, loc);
5580      if (context.compatConfig) {
5581        fn.isNonScopedSlot = true;
5582      }
5583      return createObjectProperty(`default`, fn);
5584    };
5585    if (!hasTemplateSlots) {
5586      slotsProperties.push(buildDefaultSlotProperty(void 0, children));
5587    } else if (implicitDefaultChildren.length && // #3766
5588    // with whitespace: 'preserve', whitespaces between slots will end up in
5589    // implicitDefaultChildren. Ignore if all implicit children are whitespaces.
5590    implicitDefaultChildren.some((node2) => isNonWhitespaceContent(node2))) {
5591      if (hasNamedDefaultSlot) {
5592        context.onError(
5593          createCompilerError(
5594            39,
5595            implicitDefaultChildren[0].loc
5596          )
5597        );
5598      } else {
5599        slotsProperties.push(
5600          buildDefaultSlotProperty(void 0, implicitDefaultChildren)
5601        );
5602      }
5603    }
5604  }
5605  const slotFlag = hasDynamicSlots ? 2 : hasForwardedSlots(node.children) ? 3 : 1;
5606  let slots = createObjectExpression(
5607    slotsProperties.concat(
5608      createObjectProperty(
5609        `_`,
5610        // 2 = compiled but dynamic = can skip normalization, but must run diff
5611        // 1 = compiled and static = can skip normalization AND diff as optimized
5612        createSimpleExpression(
5613          slotFlag + ( true ? ` /* ${_vue_shared__WEBPACK_IMPORTED_MODULE_0__.slotFlagsText[slotFlag]} */` : 0),
5614          false
5615        )
5616      )
5617    ),
5618    loc
5619  );
5620  if (dynamicSlots.length) {
5621    slots = createCallExpression(context.helper(CREATE_SLOTS), [
5622      slots,
5623      createArrayExpression(dynamicSlots)
5624    ]);
5625  }
5626  return {
5627    slots,
5628    hasDynamicSlots
5629  };
5630}
5631function buildDynamicSlot(name, fn, index) {
5632  const props = [
5633    createObjectProperty(`name`, name),
5634    createObjectProperty(`fn`, fn)
5635  ];
5636  if (index != null) {
5637    props.push(
5638      createObjectProperty(`key`, createSimpleExpression(String(index), true))
5639    );
5640  }
5641  return createObjectExpression(props);
5642}
5643function hasForwardedSlots(children) {
5644  for (let i = 0; i < children.length; i++) {
5645    const child = children[i];
5646    switch (child.type) {
5647      case 1:
5648        if (child.tagType === 2 || hasForwardedSlots(child.children)) {
5649          return true;
5650        }
5651        break;
5652      case 9:
5653        if (hasForwardedSlots(child.branches)) return true;
5654        break;
5655      case 10:
5656      case 11:
5657        if (hasForwardedSlots(child.children)) return true;
5658        break;
5659    }
5660  }
5661  return false;
5662}
5663function isNonWhitespaceContent(node) {
5664  if (node.type !== 2 && node.type !== 12)
5665    return true;
5666  return node.type === 2 ? !!node.content.trim() : isNonWhitespaceContent(node.content);
5667}
5668
5669const directiveImportMap = /* @__PURE__ */ new WeakMap();
5670const transformElement = (node, context) => {
5671  return function postTransformElement() {
5672    node = context.currentNode;
5673    if (!(node.type === 1 && (node.tagType === 0 || node.tagType === 1))) {
5674      return;
5675    }
5676    const { tag, props } = node;
5677    const isComponent = node.tagType === 1;
5678    let vnodeTag = isComponent ? resolveComponentType(node, context) : `"${tag}"`;
5679    const isDynamicComponent = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isObject)(vnodeTag) && vnodeTag.callee === RESOLVE_DYNAMIC_COMPONENT;
5680    let vnodeProps;
5681    let vnodeChildren;
5682    let patchFlag = 0;
5683    let vnodeDynamicProps;
5684    let dynamicPropNames;
5685    let vnodeDirectives;
5686    let shouldUseBlock = (
5687      // dynamic component may resolve to plain elements
5688      isDynamicComponent || vnodeTag === TELEPORT || vnodeTag === SUSPENSE || !isComponent && // <svg> and <foreignObject> must be forced into blocks so that block
5689      // updates inside get proper isSVG flag at runtime. (#639, #643)
5690      // This is technically web-specific, but splitting the logic out of core
5691      // leads to too much unnecessary complexity.
5692      (tag === "svg" || tag === "foreignObject" || tag === "math")
5693    );
5694    if (props.length > 0) {
5695      const propsBuildResult = buildProps(
5696        node,
5697        context,
5698        void 0,
5699        isComponent,
5700        isDynamicComponent
5701      );
5702      vnodeProps = propsBuildResult.props;
5703      patchFlag = propsBuildResult.patchFlag;
5704      dynamicPropNames = propsBuildResult.dynamicPropNames;
5705      const directives = propsBuildResult.directives;
5706      vnodeDirectives = directives && directives.length ? createArrayExpression(
5707        directives.map((dir) => buildDirectiveArgs(dir, context))
5708      ) : void 0;
5709      if (propsBuildResult.shouldUseBlock) {
5710        shouldUseBlock = true;
5711      }
5712    }
5713    if (node.children.length > 0) {
5714      if (vnodeTag === KEEP_ALIVE) {
5715        shouldUseBlock = true;
5716        patchFlag |= 1024;
5717        if ( true && node.children.length > 1) {
5718          context.onError(
5719            createCompilerError(46, {
5720              start: node.children[0].loc.start,
5721              end: node.children[node.children.length - 1].loc.end,
5722              source: ""
5723            })
5724          );
5725        }
5726      }
5727      const shouldBuildAsSlots = isComponent && // Teleport is not a real component and has dedicated runtime handling
5728      vnodeTag !== TELEPORT && // explained above.
5729      vnodeTag !== KEEP_ALIVE;
5730      if (shouldBuildAsSlots) {
5731        const { slots, hasDynamicSlots } = buildSlots(node, context);
5732        vnodeChildren = slots;
5733        if (hasDynamicSlots) {
5734          patchFlag |= 1024;
5735        }
5736      } else if (node.children.length === 1 && vnodeTag !== TELEPORT) {
5737        const child = node.children[0];
5738        const type = child.type;
5739        const hasDynamicTextChild = type === 5 || type === 8;
5740        if (hasDynamicTextChild && getConstantType(child, context) === 0) {
5741          patchFlag |= 1;
5742        }
5743        if (hasDynamicTextChild || type === 2) {
5744          vnodeChildren = child;
5745        } else {
5746          vnodeChildren = node.children;
5747        }
5748      } else {
5749        vnodeChildren = node.children;
5750      }
5751    }
5752    if (dynamicPropNames && dynamicPropNames.length) {
5753      vnodeDynamicProps = stringifyDynamicPropNames(dynamicPropNames);
5754    }
5755    node.codegenNode = createVNodeCall(
5756      context,
5757      vnodeTag,
5758      vnodeProps,
5759      vnodeChildren,
5760      patchFlag === 0 ? void 0 : patchFlag,
5761      vnodeDynamicProps,
5762      vnodeDirectives,
5763      !!shouldUseBlock,
5764      false,
5765      isComponent,
5766      node.loc
5767    );
5768  };
5769};
5770function resolveComponentType(node, context, ssr = false) {
5771  let { tag } = node;
5772  const isExplicitDynamic = isComponentTag(tag);
5773  const isProp = findProp(
5774    node,
5775    "is",
5776    false,
5777    true
5778    /* allow empty */
5779  );
5780  if (isProp) {
5781    if (isExplicitDynamic || isCompatEnabled(
5782      "COMPILER_IS_ON_ELEMENT",
5783      context
5784    )) {
5785      let exp;
5786      if (isProp.type === 6) {
5787        exp = isProp.value && createSimpleExpression(isProp.value.content, true);
5788      } else {
5789        exp = isProp.exp;
5790        if (!exp) {
5791          exp = createSimpleExpression(`is`, false, isProp.loc);
5792        }
5793      }
5794      if (exp) {
5795        return createCallExpression(context.helper(RESOLVE_DYNAMIC_COMPONENT), [
5796          exp
5797        ]);
5798      }
5799    } else if (isProp.type === 6 && isProp.value.content.startsWith("vue:")) {
5800      tag = isProp.value.content.slice(4);
5801    }
5802  }
5803  const builtIn = isCoreComponent(tag) || context.isBuiltInComponent(tag);
5804  if (builtIn) {
5805    if (!ssr) context.helper(builtIn);
5806    return builtIn;
5807  }
5808  context.helper(RESOLVE_COMPONENT);
5809  context.components.add(tag);
5810  return toValidAssetId(tag, `component`);
5811}
5812function buildProps(node, context, props = node.props, isComponent, isDynamicComponent, ssr = false) {
5813  const { tag, loc: elementLoc, children } = node;
5814  let properties = [];
5815  const mergeArgs = [];
5816  const runtimeDirectives = [];
5817  const hasChildren = children.length > 0;
5818  let shouldUseBlock = false;
5819  let patchFlag = 0;
5820  let hasRef = false;
5821  let hasClassBinding = false;
5822  let hasStyleBinding = false;
5823  let hasHydrationEventBinding = false;
5824  let hasDynamicKeys = false;
5825  let hasVnodeHook = false;
5826  const dynamicPropNames = [];
5827  const pushMergeArg = (arg) => {
5828    if (properties.length) {
5829      mergeArgs.push(
5830        createObjectExpression(dedupeProperties(properties), elementLoc)
5831      );
5832      properties = [];
5833    }
5834    if (arg) mergeArgs.push(arg);
5835  };
5836  const pushRefVForMarker = () => {
5837    if (context.scopes.vFor > 0) {
5838      properties.push(
5839        createObjectProperty(
5840          createSimpleExpression("ref_for", true),
5841          createSimpleExpression("true")
5842        )
5843      );
5844    }
5845  };
5846  const analyzePatchFlag = ({ key, value }) => {
5847    if (isStaticExp(key)) {
5848      const name = key.content;
5849      const isEventHandler = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isOn)(name);
5850      if (isEventHandler && (!isComponent || isDynamicComponent) && // omit the flag for click handlers because hydration gives click
5851      // dedicated fast path.
5852      name.toLowerCase() !== "onclick" && // omit v-model handlers
5853      name !== "onUpdate:modelValue" && // omit onVnodeXXX hooks
5854      !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isReservedProp)(name)) {
5855        hasHydrationEventBinding = true;
5856      }
5857      if (isEventHandler && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isReservedProp)(name)) {
5858        hasVnodeHook = true;
5859      }
5860      if (isEventHandler && value.type === 14) {
5861        value = value.arguments[0];
5862      }
5863      if (value.type === 20 || (value.type === 4 || value.type === 8) && getConstantType(value, context) > 0) {
5864        return;
5865      }
5866      if (name === "ref") {
5867        hasRef = true;
5868      } else if (name === "class") {
5869        hasClassBinding = true;
5870      } else if (name === "style") {
5871        hasStyleBinding = true;
5872      } else if (name !== "key" && !dynamicPropNames.includes(name)) {
5873        dynamicPropNames.push(name);
5874      }
5875      if (isComponent && (name === "class" || name === "style") && !dynamicPropNames.includes(name)) {
5876        dynamicPropNames.push(name);
5877      }
5878    } else {
5879      hasDynamicKeys = true;
5880    }
5881  };
5882  for (let i = 0; i < props.length; i++) {
5883    const prop = props[i];
5884    if (prop.type === 6) {
5885      const { loc, name, nameLoc, value } = prop;
5886      let isStatic = true;
5887      if (name === "ref") {
5888        hasRef = true;
5889        pushRefVForMarker();
5890      }
5891      if (name === "is" && (isComponentTag(tag) || value && value.content.startsWith("vue:") || isCompatEnabled(
5892        "COMPILER_IS_ON_ELEMENT",
5893        context
5894      ))) {
5895        continue;
5896      }
5897      properties.push(
5898        createObjectProperty(
5899          createSimpleExpression(name, true, nameLoc),
5900          createSimpleExpression(
5901            value ? value.content : "",
5902            isStatic,
5903            value ? value.loc : loc
5904          )
5905        )
5906      );
5907    } else {
5908      const { name, arg, exp, loc, modifiers } = prop;
5909      const isVBind = name === "bind";
5910      const isVOn = name === "on";
5911      if (name === "slot") {
5912        if (!isComponent) {
5913          context.onError(
5914            createCompilerError(40, loc)
5915          );
5916        }
5917        continue;
5918      }
5919      if (name === "once" || name === "memo") {
5920        continue;
5921      }
5922      if (name === "is" || isVBind && isStaticArgOf(arg, "is") && (isComponentTag(tag) || isCompatEnabled(
5923        "COMPILER_IS_ON_ELEMENT",
5924        context
5925      ))) {
5926        continue;
5927      }
5928      if (isVOn && ssr) {
5929        continue;
5930      }
5931      if (
5932        // #938: elements with dynamic keys should be forced into blocks
5933        isVBind && isStaticArgOf(arg, "key") || // inline before-update hooks need to force block so that it is invoked
5934        // before children
5935        isVOn && hasChildren && isStaticArgOf(arg, "vue:before-update")
5936      ) {
5937        shouldUseBlock = true;
5938      }
5939      if (isVBind && isStaticArgOf(arg, "ref")) {
5940        pushRefVForMarker();
5941      }
5942      if (!arg && (isVBind || isVOn)) {
5943        hasDynamicKeys = true;
5944        if (exp) {
5945          if (isVBind) {
5946            pushRefVForMarker();
5947            pushMergeArg();
5948            {
5949              if (true) {
5950                const hasOverridableKeys = mergeArgs.some((arg2) => {
5951                  if (arg2.type === 15) {
5952                    return arg2.properties.some(({ key }) => {
5953                      if (key.type !== 4 || !key.isStatic) {
5954                        return true;
5955                      }
5956                      return key.content !== "class" && key.content !== "style" && !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isOn)(key.content);
5957                    });
5958                  } else {
5959                    return true;
5960                  }
5961                });
5962                if (hasOverridableKeys) {
5963                  checkCompatEnabled(
5964                    "COMPILER_V_BIND_OBJECT_ORDER",
5965                    context,
5966                    loc
5967                  );
5968                }
5969              }
5970              if (isCompatEnabled(
5971                "COMPILER_V_BIND_OBJECT_ORDER",
5972                context
5973              )) {
5974                mergeArgs.unshift(exp);
5975                continue;
5976              }
5977            }
5978            mergeArgs.push(exp);
5979          } else {
5980            pushMergeArg({
5981              type: 14,
5982              loc,
5983              callee: context.helper(TO_HANDLERS),
5984              arguments: isComponent ? [exp] : [exp, `true`]
5985            });
5986          }
5987        } else {
5988          context.onError(
5989            createCompilerError(
5990              isVBind ? 34 : 35,
5991              loc
5992            )
5993          );
5994        }
5995        continue;
5996      }
5997      if (isVBind && modifiers.includes("prop")) {
5998        patchFlag |= 32;
5999      }
6000      const directiveTransform = context.directiveTransforms[name];
6001      if (directiveTransform) {
6002        const { props: props2, needRuntime } = directiveTransform(prop, node, context);
6003        !ssr && props2.forEach(analyzePatchFlag);
6004        if (isVOn && arg && !isStaticExp(arg)) {
6005          pushMergeArg(createObjectExpression(props2, elementLoc));
6006        } else {
6007          properties.push(...props2);
6008        }
6009        if (needRuntime) {
6010          runtimeDirectives.push(prop);
6011          if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isSymbol)(needRuntime)) {
6012            directiveImportMap.set(prop, needRuntime);
6013          }
6014        }
6015      } else if (!(0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isBuiltInDirective)(name)) {
6016        runtimeDirectives.push(prop);
6017        if (hasChildren) {
6018          shouldUseBlock = true;
6019        }
6020      }
6021    }
6022  }
6023  let propsExpression = void 0;
6024  if (mergeArgs.length) {
6025    pushMergeArg();
6026    if (mergeArgs.length > 1) {
6027      propsExpression = createCallExpression(
6028        context.helper(MERGE_PROPS),
6029        mergeArgs,
6030        elementLoc
6031      );
6032    } else {
6033      propsExpression = mergeArgs[0];
6034    }
6035  } else if (properties.length) {
6036    propsExpression = createObjectExpression(
6037      dedupeProperties(properties),
6038      elementLoc
6039    );
6040  }
6041  if (hasDynamicKeys) {
6042    patchFlag |= 16;
6043  } else {
6044    if (hasClassBinding && !isComponent) {
6045      patchFlag |= 2;
6046    }
6047    if (hasStyleBinding && !isComponent) {
6048      patchFlag |= 4;
6049    }
6050    if (dynamicPropNames.length) {
6051      patchFlag |= 8;
6052    }
6053    if (hasHydrationEventBinding) {
6054      patchFlag |= 32;
6055    }
6056  }
6057  if (!shouldUseBlock && (patchFlag === 0 || patchFlag === 32) && (hasRef || hasVnodeHook || runtimeDirectives.length > 0)) {
6058    patchFlag |= 512;
6059  }
6060  if (!context.inSSR && propsExpression) {
6061    switch (propsExpression.type) {
6062      case 15:
6063        let classKeyIndex = -1;
6064        let styleKeyIndex = -1;
6065        let hasDynamicKey = false;
6066        for (let i = 0; i < propsExpression.properties.length; i++) {
6067          const key = propsExpression.properties[i].key;
6068          if (isStaticExp(key)) {
6069            if (key.content === "class") {
6070              classKeyIndex = i;
6071            } else if (key.content === "style") {
6072              styleKeyIndex = i;
6073            }
6074          } else if (!key.isHandlerKey) {
6075            hasDynamicKey = true;
6076          }
6077        }
6078        const classProp = propsExpression.properties[classKeyIndex];
6079        const styleProp = propsExpression.properties[styleKeyIndex];
6080        if (!hasDynamicKey) {
6081          if (classProp && !isStaticExp(classProp.value)) {
6082            classProp.value = createCallExpression(
6083              context.helper(NORMALIZE_CLASS),
6084              [classProp.value]
6085            );
6086          }
6087          if (styleProp && // the static style is compiled into an object,
6088          // so use `hasStyleBinding` to ensure that it is a dynamic style binding
6089          (hasStyleBinding || styleProp.value.type === 4 && styleProp.value.content.trim()[0] === `[` || // v-bind:style and style both exist,
6090          // v-bind:style with static literal object
6091          styleProp.value.type === 17)) {
6092            styleProp.value = createCallExpression(
6093              context.helper(NORMALIZE_STYLE),
6094              [styleProp.value]
6095            );
6096          }
6097        } else {
6098          propsExpression = createCallExpression(
6099            context.helper(NORMALIZE_PROPS),
6100            [propsExpression]
6101          );
6102        }
6103        break;
6104      case 14:
6105        break;
6106      default:
6107        propsExpression = createCallExpression(
6108          context.helper(NORMALIZE_PROPS),
6109          [
6110            createCallExpression(context.helper(GUARD_REACTIVE_PROPS), [
6111              propsExpression
6112            ])
6113          ]
6114        );
6115        break;
6116    }
6117  }
6118  return {
6119    props: propsExpression,
6120    directives: runtimeDirectives,
6121    patchFlag,
6122    dynamicPropNames,
6123    shouldUseBlock
6124  };
6125}
6126function dedupeProperties(properties) {
6127  const knownProps = /* @__PURE__ */ new Map();
6128  const deduped = [];
6129  for (let i = 0; i < properties.length; i++) {
6130    const prop = properties[i];
6131    if (prop.key.type === 8 || !prop.key.isStatic) {
6132      deduped.push(prop);
6133      continue;
6134    }
6135    const name = prop.key.content;
6136    const existing = knownProps.get(name);
6137    if (existing) {
6138      if (name === "style" || name === "class" || (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isOn)(name)) {
6139        mergeAsArray(existing, prop);
6140      }
6141    } else {
6142      knownProps.set(name, prop);
6143      deduped.push(prop);
6144    }
6145  }
6146  return deduped;
6147}
6148function mergeAsArray(existing, incoming) {
6149  if (existing.value.type === 17) {
6150    existing.value.elements.push(incoming.value);
6151  } else {
6152    existing.value = createArrayExpression(
6153      [existing.value, incoming.value],
6154      existing.loc
6155    );
6156  }
6157}
6158function buildDirectiveArgs(dir, context) {
6159  const dirArgs = [];
6160  const runtime = directiveImportMap.get(dir);
6161  if (runtime) {
6162    dirArgs.push(context.helperString(runtime));
6163  } else {
6164    {
6165      context.helper(RESOLVE_DIRECTIVE);
6166      context.directives.add(dir.name);
6167      dirArgs.push(toValidAssetId(dir.name, `directive`));
6168    }
6169  }
6170  const { loc } = dir;
6171  if (dir.exp) dirArgs.push(dir.exp);
6172  if (dir.arg) {
6173    if (!dir.exp) {
6174      dirArgs.push(`void 0`);
6175    }
6176    dirArgs.push(dir.arg);
6177  }
6178  if (Object.keys(dir.modifiers).length) {
6179    if (!dir.arg) {
6180      if (!dir.exp) {
6181        dirArgs.push(`void 0`);
6182      }
6183      dirArgs.push(`void 0`);
6184    }
6185    const trueExpression = createSimpleExpression(`true`, false, loc);
6186    dirArgs.push(
6187      createObjectExpression(
6188        dir.modifiers.map(
6189          (modifier) => createObjectProperty(modifier, trueExpression)
6190        ),
6191        loc
6192      )
6193    );
6194  }
6195  return createArrayExpression(dirArgs, dir.loc);
6196}
6197function stringifyDynamicPropNames(props) {
6198  let propsNamesString = `[`;
6199  for (let i = 0, l = props.length; i < l; i++) {
6200    propsNamesString += JSON.stringify(props[i]);
6201    if (i < l - 1) propsNamesString += ", ";
6202  }
6203  return propsNamesString + `]`;
6204}
6205function isComponentTag(tag) {
6206  return tag === "component" || tag === "Component";
6207}
6208
6209const transformSlotOutlet = (node, context) => {
6210  if (isSlotOutlet(node)) {
6211    const { children, loc } = node;
6212    const { slotName, slotProps } = processSlotOutlet(node, context);
6213    const slotArgs = [
6214      context.prefixIdentifiers ? `_ctx.$slots` : `$slots`,
6215      slotName,
6216      "{}",
6217      "undefined",
6218      "true"
6219    ];
6220    let expectedLen = 2;
6221    if (slotProps) {
6222      slotArgs[2] = slotProps;
6223      expectedLen = 3;
6224    }
6225    if (children.length) {
6226      slotArgs[3] = createFunctionExpression([], children, false, false, loc);
6227      expectedLen = 4;
6228    }
6229    if (context.scopeId && !context.slotted) {
6230      expectedLen = 5;
6231    }
6232    slotArgs.splice(expectedLen);
6233    node.codegenNode = createCallExpression(
6234      context.helper(RENDER_SLOT),
6235      slotArgs,
6236      loc
6237    );
6238  }
6239};
6240function processSlotOutlet(node, context) {
6241  let slotName = `"default"`;
6242  let slotProps = void 0;
6243  const nonNameProps = [];
6244  for (let i = 0; i < node.props.length; i++) {
6245    const p = node.props[i];
6246    if (p.type === 6) {
6247      if (p.value) {
6248        if (p.name === "name") {
6249          slotName = JSON.stringify(p.value.content);
6250        } else {
6251          p.name = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.camelize)(p.name);
6252          nonNameProps.push(p);
6253        }
6254      }
6255    } else {
6256      if (p.name === "bind" && isStaticArgOf(p.arg, "name")) {
6257        if (p.exp) {
6258          slotName = p.exp;
6259        } else if (p.arg && p.arg.type === 4) {
6260          const name = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.camelize)(p.arg.content);
6261          slotName = p.exp = createSimpleExpression(name, false, p.arg.loc);
6262        }
6263      } else {
6264        if (p.name === "bind" && p.arg && isStaticExp(p.arg)) {
6265          p.arg.content = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.camelize)(p.arg.content);
6266        }
6267        nonNameProps.push(p);
6268      }
6269    }
6270  }
6271  if (nonNameProps.length > 0) {
6272    const { props, directives } = buildProps(
6273      node,
6274      context,
6275      nonNameProps,
6276      false,
6277      false
6278    );
6279    slotProps = props;
6280    if (directives.length) {
6281      context.onError(
6282        createCompilerError(
6283          36,
6284          directives[0].loc
6285        )
6286      );
6287    }
6288  }
6289  return {
6290    slotName,
6291    slotProps
6292  };
6293}
6294
6295const fnExpRE = /^\s*(async\s*)?(\([^)]*?\)|[\w$_]+)\s*(:[^=]+)?=>|^\s*(async\s+)?function(?:\s+[\w$]+)?\s*\(/;
6296const transformOn = (dir, node, context, augmentor) => {
6297  const { loc, modifiers, arg } = dir;
6298  if (!dir.exp && !modifiers.length) {
6299    context.onError(createCompilerError(35, loc));
6300  }
6301  let eventName;
6302  if (arg.type === 4) {
6303    if (arg.isStatic) {
6304      let rawName = arg.content;
6305      if ( true && rawName.startsWith("vnode")) {
6306        context.onError(createCompilerError(51, arg.loc));
6307      }
6308      if (rawName.startsWith("vue:")) {
6309        rawName = `vnode-${rawName.slice(4)}`;
6310      }
6311      const eventString = node.tagType !== 0 || rawName.startsWith("vnode") || !/[A-Z]/.test(rawName) ? (
6312        // for non-element and vnode lifecycle event listeners, auto convert
6313        // it to camelCase. See issue #2249
6314        (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.toHandlerKey)((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.camelize)(rawName))
6315      ) : (
6316        // preserve case for plain element listeners that have uppercase
6317        // letters, as these may be custom elements' custom events
6318        `on:${rawName}`
6319      );
6320      eventName = createSimpleExpression(eventString, true, arg.loc);
6321    } else {
6322      eventName = createCompoundExpression([
6323        `${context.helperString(TO_HANDLER_KEY)}(`,
6324        arg,
6325        `)`
6326      ]);
6327    }
6328  } else {
6329    eventName = arg;
6330    eventName.children.unshift(`${context.helperString(TO_HANDLER_KEY)}(`);
6331    eventName.children.push(`)`);
6332  }
6333  let exp = dir.exp;
6334  if (exp && !exp.content.trim()) {
6335    exp = void 0;
6336  }
6337  let shouldCache = context.cacheHandlers && !exp && !context.inVOnce;
6338  if (exp) {
6339    const isMemberExp = isMemberExpression(exp.content);
6340    const isInlineStatement = !(isMemberExp || fnExpRE.test(exp.content));
6341    const hasMultipleStatements = exp.content.includes(`;`);
6342    if (true) {
6343      validateBrowserExpression(
6344        exp,
6345        context,
6346        false,
6347        hasMultipleStatements
6348      );
6349    }
6350    if (isInlineStatement || shouldCache && isMemberExp) {
6351      exp = createCompoundExpression([
6352        `${isInlineStatement ? `$event` : `${``}(...args)`} => ${hasMultipleStatements ? `{` : `(`}`,
6353        exp,
6354        hasMultipleStatements ? `}` : `)`
6355      ]);
6356    }
6357  }
6358  let ret = {
6359    props: [
6360      createObjectProperty(
6361        eventName,
6362        exp || createSimpleExpression(`() => {}`, false, loc)
6363      )
6364    ]
6365  };
6366  if (augmentor) {
6367    ret = augmentor(ret);
6368  }
6369  if (shouldCache) {
6370    ret.props[0].value = context.cache(ret.props[0].value);
6371  }
6372  ret.props.forEach((p) => p.key.isHandlerKey = true);
6373  return ret;
6374};
6375
6376const transformText = (node, context) => {
6377  if (node.type === 0 || node.type === 1 || node.type === 11 || node.type === 10) {
6378    return () => {
6379      const children = node.children;
6380      let currentContainer = void 0;
6381      let hasText = false;
6382      for (let i = 0; i < children.length; i++) {
6383        const child = children[i];
6384        if (isText$1(child)) {
6385          hasText = true;
6386          for (let j = i + 1; j < children.length; j++) {
6387            const next = children[j];
6388            if (isText$1(next)) {
6389              if (!currentContainer) {
6390                currentContainer = children[i] = createCompoundExpression(
6391                  [child],
6392                  child.loc
6393                );
6394              }
6395              currentContainer.children.push(` + `, next);
6396              children.splice(j, 1);
6397              j--;
6398            } else {
6399              currentContainer = void 0;
6400              break;
6401            }
6402          }
6403        }
6404      }
6405      if (!hasText || // if this is a plain element with a single text child, leave it
6406      // as-is since the runtime has dedicated fast path for this by directly
6407      // setting textContent of the element.
6408      // for component root it's always normalized anyway.
6409      children.length === 1 && (node.type === 0 || node.type === 1 && node.tagType === 0 && // #3756
6410      // custom directives can potentially add DOM elements arbitrarily,
6411      // we need to avoid setting textContent of the element at runtime
6412      // to avoid accidentally overwriting the DOM elements added
6413      // by the user through custom directives.
6414      !node.props.find(
6415        (p) => p.type === 7 && !context.directiveTransforms[p.name]
6416      ) && // in compat mode, <template> tags with no special directives
6417      // will be rendered as a fragment so its children must be
6418      // converted into vnodes.
6419      !(node.tag === "template"))) {
6420        return;
6421      }
6422      for (let i = 0; i < children.length; i++) {
6423        const child = children[i];
6424        if (isText$1(child) || child.type === 8) {
6425          const callArgs = [];
6426          if (child.type !== 2 || child.content !== " ") {
6427            callArgs.push(child);
6428          }
6429          if (!context.ssr && getConstantType(child, context) === 0) {
6430            callArgs.push(
6431              1 + ( true ? ` /* ${_vue_shared__WEBPACK_IMPORTED_MODULE_0__.PatchFlagNames[1]} */` : 0)
6432            );
6433          }
6434          children[i] = {
6435            type: 12,
6436            content: child,
6437            loc: child.loc,
6438            codegenNode: createCallExpression(
6439              context.helper(CREATE_TEXT),
6440              callArgs
6441            )
6442          };
6443        }
6444      }
6445    };
6446  }
6447};
6448
6449const seen$1 = /* @__PURE__ */ new WeakSet();
6450const transformOnce = (node, context) => {
6451  if (node.type === 1 && findDir(node, "once", true)) {
6452    if (seen$1.has(node) || context.inVOnce || context.inSSR) {
6453      return;
6454    }
6455    seen$1.add(node);
6456    context.inVOnce = true;
6457    context.helper(SET_BLOCK_TRACKING);
6458    return () => {
6459      context.inVOnce = false;
6460      const cur = context.currentNode;
6461      if (cur.codegenNode) {
6462        cur.codegenNode = context.cache(
6463          cur.codegenNode,
6464          true
6465          /* isVNode */
6466        );
6467      }
6468    };
6469  }
6470};
6471
6472const transformModel = (dir, node, context) => {
6473  const { exp, arg } = dir;
6474  if (!exp) {
6475    context.onError(
6476      createCompilerError(41, dir.loc)
6477    );
6478    return createTransformProps();
6479  }
6480  const rawExp = exp.loc.source;
6481  const expString = exp.type === 4 ? exp.content : rawExp;
6482  const bindingType = context.bindingMetadata[rawExp];
6483  if (bindingType === "props" || bindingType === "props-aliased") {
6484    context.onError(createCompilerError(44, exp.loc));
6485    return createTransformProps();
6486  }
6487  const maybeRef = false;
6488  if (!expString.trim() || !isMemberExpression(expString) && !maybeRef) {
6489    context.onError(
6490      createCompilerError(42, exp.loc)
6491    );
6492    return createTransformProps();
6493  }
6494  const propName = arg ? arg : createSimpleExpression("modelValue", true);
6495  const eventName = arg ? isStaticExp(arg) ? `onUpdate:${(0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.camelize)(arg.content)}` : createCompoundExpression(['"onUpdate:" + ', arg]) : `onUpdate:modelValue`;
6496  let assignmentExp;
6497  const eventArg = context.isTS ? `($event: any)` : `$event`;
6498  {
6499    assignmentExp = createCompoundExpression([
6500      `${eventArg} => ((`,
6501      exp,
6502      `) = $event)`
6503    ]);
6504  }
6505  const props = [
6506    // modelValue: foo
6507    createObjectProperty(propName, dir.exp),
6508    // "onUpdate:modelValue": $event => (foo = $event)
6509    createObjectProperty(eventName, assignmentExp)
6510  ];
6511  if (dir.modifiers.length && node.tagType === 1) {
6512    const modifiers = dir.modifiers.map((m) => (isSimpleIdentifier(m) ? m : JSON.stringify(m)) + `: true`).join(`, `);
6513    const modifiersKey = arg ? isStaticExp(arg) ? `${arg.content}Modifiers` : createCompoundExpression([arg, ' + "Modifiers"']) : `modelModifiers`;
6514    props.push(
6515      createObjectProperty(
6516        modifiersKey,
6517        createSimpleExpression(
6518          `{ ${modifiers} }`,
6519          false,
6520          dir.loc,
6521          2
6522        )
6523      )
6524    );
6525  }
6526  return createTransformProps(props);
6527};
6528function createTransformProps(props = []) {
6529  return { props };
6530}
6531
6532const validDivisionCharRE = /[\w).+\-_$\]]/;
6533const transformFilter = (node, context) => {
6534  if (!isCompatEnabled("COMPILER_FILTERS", context)) {
6535    return;
6536  }
6537  if (node.type === 5) {
6538    rewriteFilter(node.content, context);
6539  } else if (node.type === 1) {
6540    node.props.forEach((prop) => {
6541      if (prop.type === 7 && prop.name !== "for" && prop.exp) {
6542        rewriteFilter(prop.exp, context);
6543      }
6544    });
6545  }
6546};
6547function rewriteFilter(node, context) {
6548  if (node.type === 4) {
6549    parseFilter(node, context);
6550  } else {
6551    for (let i = 0; i < node.children.length; i++) {
6552      const child = node.children[i];
6553      if (typeof child !== "object") continue;
6554      if (child.type === 4) {
6555        parseFilter(child, context);
6556      } else if (child.type === 8) {
6557        rewriteFilter(node, context);
6558      } else if (child.type === 5) {
6559        rewriteFilter(child.content, context);
6560      }
6561    }
6562  }
6563}
6564function parseFilter(node, context) {
6565  const exp = node.content;
6566  let inSingle = false;
6567  let inDouble = false;
6568  let inTemplateString = false;
6569  let inRegex = false;
6570  let curly = 0;
6571  let square = 0;
6572  let paren = 0;
6573  let lastFilterIndex = 0;
6574  let c, prev, i, expression, filters = [];
6575  for (i = 0; i < exp.length; i++) {
6576    prev = c;
6577    c = exp.charCodeAt(i);
6578    if (inSingle) {
6579      if (c === 39 && prev !== 92) inSingle = false;
6580    } else if (inDouble) {
6581      if (c === 34 && prev !== 92) inDouble = false;
6582    } else if (inTemplateString) {
6583      if (c === 96 && prev !== 92) inTemplateString = false;
6584    } else if (inRegex) {
6585      if (c === 47 && prev !== 92) inRegex = false;
6586    } else if (c === 124 && // pipe
6587    exp.charCodeAt(i + 1) !== 124 && exp.charCodeAt(i - 1) !== 124 && !curly && !square && !paren) {
6588      if (expression === void 0) {
6589        lastFilterIndex = i + 1;
6590        expression = exp.slice(0, i).trim();
6591      } else {
6592        pushFilter();
6593      }
6594    } else {
6595      switch (c) {
6596        case 34:
6597          inDouble = true;
6598          break;
6599        case 39:
6600          inSingle = true;
6601          break;
6602        case 96:
6603          inTemplateString = true;
6604          break;
6605        case 40:
6606          paren++;
6607          break;
6608        case 41:
6609          paren--;
6610          break;
6611        case 91:
6612          square++;
6613          break;
6614        case 93:
6615          square--;
6616          break;
6617        case 123:
6618          curly++;
6619          break;
6620        case 125:
6621          curly--;
6622          break;
6623      }
6624      if (c === 47) {
6625        let j = i - 1;
6626        let p;
6627        for (; j >= 0; j--) {
6628          p = exp.charAt(j);
6629          if (p !== " ") break;
6630        }
6631        if (!p || !validDivisionCharRE.test(p)) {
6632          inRegex = true;
6633        }
6634      }
6635    }
6636  }
6637  if (expression === void 0) {
6638    expression = exp.slice(0, i).trim();
6639  } else if (lastFilterIndex !== 0) {
6640    pushFilter();
6641  }
6642  function pushFilter() {
6643    filters.push(exp.slice(lastFilterIndex, i).trim());
6644    lastFilterIndex = i + 1;
6645  }
6646  if (filters.length) {
6647     true && warnDeprecation(
6648      "COMPILER_FILTERS",
6649      context,
6650      node.loc
6651    );
6652    for (i = 0; i < filters.length; i++) {
6653      expression = wrapFilter(expression, filters[i], context);
6654    }
6655    node.content = expression;
6656    node.ast = void 0;
6657  }
6658}
6659function wrapFilter(exp, filter, context) {
6660  context.helper(RESOLVE_FILTER);
6661  const i = filter.indexOf("(");
6662  if (i < 0) {
6663    context.filters.add(filter);
6664    return `${toValidAssetId(filter, "filter")}(${exp})`;
6665  } else {
6666    const name = filter.slice(0, i);
6667    const args = filter.slice(i + 1);
6668    context.filters.add(name);
6669    return `${toValidAssetId(name, "filter")}(${exp}${args !== ")" ? "," + args : args}`;
6670  }
6671}
6672
6673const seen = /* @__PURE__ */ new WeakSet();
6674const transformMemo = (node, context) => {
6675  if (node.type === 1) {
6676    const dir = findDir(node, "memo");
6677    if (!dir || seen.has(node)) {
6678      return;
6679    }
6680    seen.add(node);
6681    return () => {
6682      const codegenNode = node.codegenNode || context.currentNode.codegenNode;
6683      if (codegenNode && codegenNode.type === 13) {
6684        if (node.tagType !== 1) {
6685          convertToBlock(codegenNode, context);
6686        }
6687        node.codegenNode = createCallExpression(context.helper(WITH_MEMO), [
6688          dir.exp,
6689          createFunctionExpression(void 0, codegenNode),
6690          `_cache`,
6691          String(context.cached++)
6692        ]);
6693      }
6694    };
6695  }
6696};
6697
6698function getBaseTransformPreset(prefixIdentifiers) {
6699  return [
6700    [
6701      transformOnce,
6702      transformIf,
6703      transformMemo,
6704      transformFor,
6705      ...[transformFilter] ,
6706      ... true ? [transformExpression] : 0,
6707      transformSlotOutlet,
6708      transformElement,
6709      trackSlotScopes,
6710      transformText
6711    ],
6712    {
6713      on: transformOn,
6714      bind: transformBind,
6715      model: transformModel
6716    }
6717  ];
6718}
6719function baseCompile(source, options = {}) {
6720  const onError = options.onError || defaultOnError;
6721  const isModuleMode = options.mode === "module";
6722  {
6723    if (options.prefixIdentifiers === true) {
6724      onError(createCompilerError(47));
6725    } else if (isModuleMode) {
6726      onError(createCompilerError(48));
6727    }
6728  }
6729  const prefixIdentifiers = false;
6730  if (options.cacheHandlers) {
6731    onError(createCompilerError(49));
6732  }
6733  if (options.scopeId && !isModuleMode) {
6734    onError(createCompilerError(50));
6735  }
6736  const resolvedOptions = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.extend)({}, options, {
6737    prefixIdentifiers
6738  });
6739  const ast = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isString)(source) ? baseParse(source, resolvedOptions) : source;
6740  const [nodeTransforms, directiveTransforms] = getBaseTransformPreset();
6741  transform(
6742    ast,
6743    (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.extend)({}, resolvedOptions, {
6744      nodeTransforms: [
6745        ...nodeTransforms,
6746        ...options.nodeTransforms || []
6747        // user transforms
6748      ],
6749      directiveTransforms: (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.extend)(
6750        {},
6751        directiveTransforms,
6752        options.directiveTransforms || {}
6753        // user transforms
6754      )
6755    })
6756  );
6757  return generate(ast, resolvedOptions);
6758}
6759
6760const BindingTypes = {
6761  "DATA": "data",
6762  "PROPS": "props",
6763  "PROPS_ALIASED": "props-aliased",
6764  "SETUP_LET": "setup-let",
6765  "SETUP_CONST": "setup-const",
6766  "SETUP_REACTIVE_CONST": "setup-reactive-const",
6767  "SETUP_MAYBE_REF": "setup-maybe-ref",
6768  "SETUP_REF": "setup-ref",
6769  "OPTIONS": "options",
6770  "LITERAL_CONST": "literal-const"
6771};
6772
6773const noopDirectiveTransform = () => ({ props: [] });
6774
6775
6776
6777
6778/***/ }),
6779
vendor: 39,902 bytes, lines 6780-7455
6780/***/ "./node_modules/@vue/compiler-dom/dist/compiler-dom.esm-bundler.js":
6781/*!*************************************************************************!*\
6782  !*** ./node_modules/@vue/compiler-dom/dist/compiler-dom.esm-bundler.js ***!
6783  \*************************************************************************/
6784/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
6785
6786"use strict";
6787__webpack_require__.r(__webpack_exports__);
6788/* harmony export */ __webpack_require__.d(__webpack_exports__, {
6789/* harmony export */   BASE_TRANSITION: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.BASE_TRANSITION; },
6790/* harmony export */   BindingTypes: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.BindingTypes; },
6791/* harmony export */   CAMELIZE: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.CAMELIZE; },
6792/* harmony export */   CAPITALIZE: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.CAPITALIZE; },
6793/* harmony export */   CREATE_BLOCK: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.CREATE_BLOCK; },
6794/* harmony export */   CREATE_COMMENT: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.CREATE_COMMENT; },
6795/* harmony export */   CREATE_ELEMENT_BLOCK: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.CREATE_ELEMENT_BLOCK; },
6796/* harmony export */   CREATE_ELEMENT_VNODE: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.CREATE_ELEMENT_VNODE; },
6797/* harmony export */   CREATE_SLOTS: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.CREATE_SLOTS; },
6798/* harmony export */   CREATE_STATIC: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.CREATE_STATIC; },
6799/* harmony export */   CREATE_TEXT: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.CREATE_TEXT; },
6800/* harmony export */   CREATE_VNODE: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.CREATE_VNODE; },
6801/* harmony export */   CompilerDeprecationTypes: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.CompilerDeprecationTypes; },
6802/* harmony export */   ConstantTypes: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.ConstantTypes; },
6803/* harmony export */   DOMDirectiveTransforms: function() { return /* binding */ DOMDirectiveTransforms; },
6804/* harmony export */   DOMErrorCodes: function() { return /* binding */ DOMErrorCodes; },
6805/* harmony export */   DOMErrorMessages: function() { return /* binding */ DOMErrorMessages; },
6806/* harmony export */   DOMNodeTransforms: function() { return /* binding */ DOMNodeTransforms; },
6807/* harmony export */   ElementTypes: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.ElementTypes; },
6808/* harmony export */   ErrorCodes: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.ErrorCodes; },
6809/* harmony export */   FRAGMENT: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.FRAGMENT; },
6810/* harmony export */   GUARD_REACTIVE_PROPS: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.GUARD_REACTIVE_PROPS; },
6811/* harmony export */   IS_MEMO_SAME: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.IS_MEMO_SAME; },
6812/* harmony export */   IS_REF: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.IS_REF; },
6813/* harmony export */   KEEP_ALIVE: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.KEEP_ALIVE; },
6814/* harmony export */   MERGE_PROPS: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.MERGE_PROPS; },
6815/* harmony export */   NORMALIZE_CLASS: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.NORMALIZE_CLASS; },
6816/* harmony export */   NORMALIZE_PROPS: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.NORMALIZE_PROPS; },
6817/* harmony export */   NORMALIZE_STYLE: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.NORMALIZE_STYLE; },
6818/* harmony export */   Namespaces: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.Namespaces; },
6819/* harmony export */   NodeTypes: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.NodeTypes; },
6820/* harmony export */   OPEN_BLOCK: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.OPEN_BLOCK; },
6821/* harmony export */   POP_SCOPE_ID: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.POP_SCOPE_ID; },
6822/* harmony export */   PUSH_SCOPE_ID: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.PUSH_SCOPE_ID; },
6823/* harmony export */   RENDER_LIST: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.RENDER_LIST; },
6824/* harmony export */   RENDER_SLOT: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.RENDER_SLOT; },
6825/* harmony export */   RESOLVE_COMPONENT: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.RESOLVE_COMPONENT; },
6826/* harmony export */   RESOLVE_DIRECTIVE: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.RESOLVE_DIRECTIVE; },
6827/* harmony export */   RESOLVE_DYNAMIC_COMPONENT: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.RESOLVE_DYNAMIC_COMPONENT; },
6828/* harmony export */   RESOLVE_FILTER: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.RESOLVE_FILTER; },
6829/* harmony export */   SET_BLOCK_TRACKING: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.SET_BLOCK_TRACKING; },
6830/* harmony export */   SUSPENSE: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.SUSPENSE; },
6831/* harmony export */   TELEPORT: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.TELEPORT; },
6832/* harmony export */   TO_DISPLAY_STRING: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.TO_DISPLAY_STRING; },
6833/* harmony export */   TO_HANDLERS: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.TO_HANDLERS; },
6834/* harmony export */   TO_HANDLER_KEY: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.TO_HANDLER_KEY; },
6835/* harmony export */   TRANSITION: function() { return /* binding */ TRANSITION; },
6836/* harmony export */   TRANSITION_GROUP: function() { return /* binding */ TRANSITION_GROUP; },
6837/* harmony export */   TS_NODE_TYPES: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.TS_NODE_TYPES; },
6838/* harmony export */   UNREF: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.UNREF; },
6839/* harmony export */   V_MODEL_CHECKBOX: function() { return /* binding */ V_MODEL_CHECKBOX; },
6840/* harmony export */   V_MODEL_DYNAMIC: function() { return /* binding */ V_MODEL_DYNAMIC; },
6841/* harmony export */   V_MODEL_RADIO: function() { return /* binding */ V_MODEL_RADIO; },
6842/* harmony export */   V_MODEL_SELECT: function() { return /* binding */ V_MODEL_SELECT; },
6843/* harmony export */   V_MODEL_TEXT: function() { return /* binding */ V_MODEL_TEXT; },
6844/* harmony export */   V_ON_WITH_KEYS: function() { return /* binding */ V_ON_WITH_KEYS; },
6845/* harmony export */   V_ON_WITH_MODIFIERS: function() { return /* binding */ V_ON_WITH_MODIFIERS; },
6846/* harmony export */   V_SHOW: function() { return /* binding */ V_SHOW; },
6847/* harmony export */   WITH_CTX: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.WITH_CTX; },
6848/* harmony export */   WITH_DIRECTIVES: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.WITH_DIRECTIVES; },
6849/* harmony export */   WITH_MEMO: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.WITH_MEMO; },
6850/* harmony export */   advancePositionWithClone: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.advancePositionWithClone; },
6851/* harmony export */   advancePositionWithMutation: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.advancePositionWithMutation; },
6852/* harmony export */   assert: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.assert; },
6853/* harmony export */   baseCompile: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.baseCompile; },
6854/* harmony export */   baseParse: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.baseParse; },
6855/* harmony export */   buildDirectiveArgs: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.buildDirectiveArgs; },
6856/* harmony export */   buildProps: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.buildProps; },
6857/* harmony export */   buildSlots: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.buildSlots; },
6858/* harmony export */   checkCompatEnabled: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.checkCompatEnabled; },
6859/* harmony export */   compile: function() { return /* binding */ compile; },
6860/* harmony export */   convertToBlock: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.convertToBlock; },
6861/* harmony export */   createArrayExpression: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createArrayExpression; },
6862/* harmony export */   createAssignmentExpression: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createAssignmentExpression; },
6863/* harmony export */   createBlockStatement: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createBlockStatement; },
6864/* harmony export */   createCacheExpression: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createCacheExpression; },
6865/* harmony export */   createCallExpression: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createCallExpression; },
6866/* harmony export */   createCompilerError: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createCompilerError; },
6867/* harmony export */   createCompoundExpression: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createCompoundExpression; },
6868/* harmony export */   createConditionalExpression: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createConditionalExpression; },
6869/* harmony export */   createDOMCompilerError: function() { return /* binding */ createDOMCompilerError; },
6870/* harmony export */   createForLoopParams: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createForLoopParams; },
6871/* harmony export */   createFunctionExpression: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createFunctionExpression; },
6872/* harmony export */   createIfStatement: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createIfStatement; },
6873/* harmony export */   createInterpolation: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createInterpolation; },
6874/* harmony export */   createObjectExpression: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createObjectExpression; },
6875/* harmony export */   createObjectProperty: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createObjectProperty; },
6876/* harmony export */   createReturnStatement: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createReturnStatement; },
6877/* harmony export */   createRoot: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createRoot; },
6878/* harmony export */   createSequenceExpression: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createSequenceExpression; },
6879/* harmony export */   createSimpleExpression: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createSimpleExpression; },
6880/* harmony export */   createStructuralDirectiveTransform: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createStructuralDirectiveTransform; },
6881/* harmony export */   createTemplateLiteral: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createTemplateLiteral; },
6882/* harmony export */   createTransformContext: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createTransformContext; },
6883/* harmony export */   createVNodeCall: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createVNodeCall; },
6884/* harmony export */   errorMessages: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.errorMessages; },
6885/* harmony export */   extractIdentifiers: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.extractIdentifiers; },
6886/* harmony export */   findDir: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.findDir; },
6887/* harmony export */   findProp: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.findProp; },
6888/* harmony export */   forAliasRE: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.forAliasRE; },
6889/* harmony export */   generate: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.generate; },
6890/* harmony export */   generateCodeFrame: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.generateCodeFrame; },
6891/* harmony export */   getBaseTransformPreset: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.getBaseTransformPreset; },
6892/* harmony export */   getConstantType: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.getConstantType; },
6893/* harmony export */   getMemoedVNodeCall: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.getMemoedVNodeCall; },
6894/* harmony export */   getVNodeBlockHelper: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.getVNodeBlockHelper; },
6895/* harmony export */   getVNodeHelper: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.getVNodeHelper; },
6896/* harmony export */   hasDynamicKeyVBind: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.hasDynamicKeyVBind; },
6897/* harmony export */   hasScopeRef: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.hasScopeRef; },
6898/* harmony export */   helperNameMap: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.helperNameMap; },
6899/* harmony export */   injectProp: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.injectProp; },
6900/* harmony export */   isCoreComponent: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.isCoreComponent; },
6901/* harmony export */   isFunctionType: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.isFunctionType; },
6902/* harmony export */   isInDestructureAssignment: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.isInDestructureAssignment; },
6903/* harmony export */   isInNewExpression: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.isInNewExpression; },
6904/* harmony export */   isMemberExpression: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.isMemberExpression; },
6905/* harmony export */   isMemberExpressionBrowser: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.isMemberExpressionBrowser; },
6906/* harmony export */   isMemberExpressionNode: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.isMemberExpressionNode; },
6907/* harmony export */   isReferencedIdentifier: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.isReferencedIdentifier; },
6908/* harmony export */   isSimpleIdentifier: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.isSimpleIdentifier; },
6909/* harmony export */   isSlotOutlet: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.isSlotOutlet; },
6910/* harmony export */   isStaticArgOf: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.isStaticArgOf; },
6911/* harmony export */   isStaticExp: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.isStaticExp; },
6912/* harmony export */   isStaticProperty: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.isStaticProperty; },
6913/* harmony export */   isStaticPropertyKey: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.isStaticPropertyKey; },
6914/* harmony export */   isTemplateNode: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.isTemplateNode; },
6915/* harmony export */   isText: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.isText; },
6916/* harmony export */   isVSlot: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.isVSlot; },
6917/* harmony export */   locStub: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.locStub; },
6918/* harmony export */   noopDirectiveTransform: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.noopDirectiveTransform; },
6919/* harmony export */   parse: function() { return /* binding */ parse; },
6920/* harmony export */   parserOptions: function() { return /* binding */ parserOptions; },
6921/* harmony export */   processExpression: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.processExpression; },
6922/* harmony export */   processFor: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.processFor; },
6923/* harmony export */   processIf: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.processIf; },
6924/* harmony export */   processSlotOutlet: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.processSlotOutlet; },
6925/* harmony export */   registerRuntimeHelpers: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.registerRuntimeHelpers; },
6926/* harmony export */   resolveComponentType: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.resolveComponentType; },
6927/* harmony export */   stringifyExpression: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.stringifyExpression; },
6928/* harmony export */   toValidAssetId: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.toValidAssetId; },
6929/* harmony export */   trackSlotScopes: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.trackSlotScopes; },
6930/* harmony export */   trackVForSlotScopes: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.trackVForSlotScopes; },
6931/* harmony export */   transform: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.transform; },
6932/* harmony export */   transformBind: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.transformBind; },
6933/* harmony export */   transformElement: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.transformElement; },
6934/* harmony export */   transformExpression: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.transformExpression; },
6935/* harmony export */   transformModel: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.transformModel; },
6936/* harmony export */   transformOn: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.transformOn; },
6937/* harmony export */   transformStyle: function() { return /* binding */ transformStyle; },
6938/* harmony export */   traverseNode: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.traverseNode; },
6939/* harmony export */   unwrapTSNode: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.unwrapTSNode; },
6940/* harmony export */   walkBlockDeclarations: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.walkBlockDeclarations; },
6941/* harmony export */   walkFunctionParams: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.walkFunctionParams; },
6942/* harmony export */   walkIdentifiers: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.walkIdentifiers; },
6943/* harmony export */   warnDeprecation: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.warnDeprecation; }
6944/* harmony export */ });
6945/* harmony import */ var _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @vue/compiler-core */ "./node_modules/@vue/compiler-core/dist/compiler-core.esm-bundler.js");
6946/* harmony import */ var _vue_shared__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @vue/shared */ "./node_modules/@vue/shared/dist/shared.esm-bundler.js");
6947/**
6948* @vue/compiler-dom v3.4.34
6949* (c) 2018-present Yuxi (Evan) You and Vue contributors
6950* @license MIT
6951**/
6952
6953
6954
6955
6956const V_MODEL_RADIO = Symbol( true ? `vModelRadio` : 0);
6957const V_MODEL_CHECKBOX = Symbol( true ? `vModelCheckbox` : 0);
6958const V_MODEL_TEXT = Symbol( true ? `vModelText` : 0);
6959const V_MODEL_SELECT = Symbol( true ? `vModelSelect` : 0);
6960const V_MODEL_DYNAMIC = Symbol( true ? `vModelDynamic` : 0);
6961const V_ON_WITH_MODIFIERS = Symbol( true ? `vOnModifiersGuard` : 0);
6962const V_ON_WITH_KEYS = Symbol( true ? `vOnKeysGuard` : 0);
6963const V_SHOW = Symbol( true ? `vShow` : 0);
6964const TRANSITION = Symbol( true ? `Transition` : 0);
6965const TRANSITION_GROUP = Symbol( true ? `TransitionGroup` : 0);
6966(0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.registerRuntimeHelpers)({
6967  [V_MODEL_RADIO]: `vModelRadio`,
6968  [V_MODEL_CHECKBOX]: `vModelCheckbox`,
6969  [V_MODEL_TEXT]: `vModelText`,
6970  [V_MODEL_SELECT]: `vModelSelect`,
6971  [V_MODEL_DYNAMIC]: `vModelDynamic`,
6972  [V_ON_WITH_MODIFIERS]: `withModifiers`,
6973  [V_ON_WITH_KEYS]: `withKeys`,
6974  [V_SHOW]: `vShow`,
6975  [TRANSITION]: `Transition`,
6976  [TRANSITION_GROUP]: `TransitionGroup`
6977});
6978
6979let decoder;
6980function decodeHtmlBrowser(raw, asAttr = false) {
6981  if (!decoder) {
6982    decoder = document.createElement("div");
6983  }
6984  if (asAttr) {
6985    decoder.innerHTML = `<div foo="${raw.replace(/"/g, "&quot;")}">`;
6986    return decoder.children[0].getAttribute("foo");
6987  } else {
6988    decoder.innerHTML = raw;
6989    return decoder.textContent;
6990  }
6991}
6992
6993const parserOptions = {
6994  parseMode: "html",
6995  isVoidTag: _vue_shared__WEBPACK_IMPORTED_MODULE_1__.isVoidTag,
6996  isNativeTag: (tag) => (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isHTMLTag)(tag) || (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isSVGTag)(tag) || (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isMathMLTag)(tag),
6997  isPreTag: (tag) => tag === "pre",
6998  decodeEntities: decodeHtmlBrowser ,
6999  isBuiltInComponent: (tag) => {
7000    if (tag === "Transition" || tag === "transition") {
7001      return TRANSITION;
7002    } else if (tag === "TransitionGroup" || tag === "transition-group") {
7003      return TRANSITION_GROUP;
7004    }
7005  },
7006  // https://html.spec.whatwg.org/multipage/parsing.html#tree-construction-dispatcher
7007  getNamespace(tag, parent, rootNamespace) {
7008    let ns = parent ? parent.ns : rootNamespace;
7009    if (parent && ns === 2) {
7010      if (parent.tag === "annotation-xml") {
7011        if (tag === "svg") {
7012          return 1;
7013        }
7014        if (parent.props.some(
7015          (a) => a.type === 6 && a.name === "encoding" && a.value != null && (a.value.content === "text/html" || a.value.content === "application/xhtml+xml")
7016        )) {
7017          ns = 0;
7018        }
7019      } else if (/^m(?:[ions]|text)$/.test(parent.tag) && tag !== "mglyph" && tag !== "malignmark") {
7020        ns = 0;
7021      }
7022    } else if (parent && ns === 1) {
7023      if (parent.tag === "foreignObject" || parent.tag === "desc" || parent.tag === "title") {
7024        ns = 0;
7025      }
7026    }
7027    if (ns === 0) {
7028      if (tag === "svg") {
7029        return 1;
7030      }
7031      if (tag === "math") {
7032        return 2;
7033      }
7034    }
7035    return ns;
7036  }
7037};
7038
7039const transformStyle = (node) => {
7040  if (node.type === 1) {
7041    node.props.forEach((p, i) => {
7042      if (p.type === 6 && p.name === "style" && p.value) {
7043        node.props[i] = {
7044          type: 7,
7045          name: `bind`,
7046          arg: (0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createSimpleExpression)(`style`, true, p.loc),
7047          exp: parseInlineCSS(p.value.content, p.loc),
7048          modifiers: [],
7049          loc: p.loc
7050        };
7051      }
7052    });
7053  }
7054};
7055const parseInlineCSS = (cssText, loc) => {
7056  const normalized = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.parseStringStyle)(cssText);
7057  return (0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createSimpleExpression)(
7058    JSON.stringify(normalized),
7059    false,
7060    loc,
7061    3
7062  );
7063};
7064
7065function createDOMCompilerError(code, loc) {
7066  return (0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createCompilerError)(
7067    code,
7068    loc,
7069     true ? DOMErrorMessages : 0
7070  );
7071}
7072const DOMErrorCodes = {
7073  "X_V_HTML_NO_EXPRESSION": 53,
7074  "53": "X_V_HTML_NO_EXPRESSION",
7075  "X_V_HTML_WITH_CHILDREN": 54,
7076  "54": "X_V_HTML_WITH_CHILDREN",
7077  "X_V_TEXT_NO_EXPRESSION": 55,
7078  "55": "X_V_TEXT_NO_EXPRESSION",
7079  "X_V_TEXT_WITH_CHILDREN": 56,
7080  "56": "X_V_TEXT_WITH_CHILDREN",
7081  "X_V_MODEL_ON_INVALID_ELEMENT": 57,
7082  "57": "X_V_MODEL_ON_INVALID_ELEMENT",
7083  "X_V_MODEL_ARG_ON_ELEMENT": 58,
7084  "58": "X_V_MODEL_ARG_ON_ELEMENT",
7085  "X_V_MODEL_ON_FILE_INPUT_ELEMENT": 59,
7086  "59": "X_V_MODEL_ON_FILE_INPUT_ELEMENT",
7087  "X_V_MODEL_UNNECESSARY_VALUE": 60,
7088  "60": "X_V_MODEL_UNNECESSARY_VALUE",
7089  "X_V_SHOW_NO_EXPRESSION": 61,
7090  "61": "X_V_SHOW_NO_EXPRESSION",
7091  "X_TRANSITION_INVALID_CHILDREN": 62,
7092  "62": "X_TRANSITION_INVALID_CHILDREN",
7093  "X_IGNORED_SIDE_EFFECT_TAG": 63,
7094  "63": "X_IGNORED_SIDE_EFFECT_TAG",
7095  "__EXTEND_POINT__": 64,
7096  "64": "__EXTEND_POINT__"
7097};
7098const DOMErrorMessages = {
7099  [53]: `v-html is missing expression.`,
7100  [54]: `v-html will override element children.`,
7101  [55]: `v-text is missing expression.`,
7102  [56]: `v-text will override element children.`,
7103  [57]: `v-model can only be used on <input>, <textarea> and <select> elements.`,
7104  [58]: `v-model argument is not supported on plain elements.`,
7105  [59]: `v-model cannot be used on file inputs since they are read-only. Use a v-on:change listener instead.`,
7106  [60]: `Unnecessary value binding used alongside v-model. It will interfere with v-model's behavior.`,
7107  [61]: `v-show is missing expression.`,
7108  [62]: `<Transition> expects exactly one child element or component.`,
7109  [63]: `Tags with side effect (<script> and <style>) are ignored in client component templates.`
7110};
7111
7112const transformVHtml = (dir, node, context) => {
7113  const { exp, loc } = dir;
7114  if (!exp) {
7115    context.onError(
7116      createDOMCompilerError(53, loc)
7117    );
7118  }
7119  if (node.children.length) {
7120    context.onError(
7121      createDOMCompilerError(54, loc)
7122    );
7123    node.children.length = 0;
7124  }
7125  return {
7126    props: [
7127      (0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createObjectProperty)(
7128        (0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createSimpleExpression)(`innerHTML`, true, loc),
7129        exp || (0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createSimpleExpression)("", true)
7130      )
7131    ]
7132  };
7133};
7134
7135const transformVText = (dir, node, context) => {
7136  const { exp, loc } = dir;
7137  if (!exp) {
7138    context.onError(
7139      createDOMCompilerError(55, loc)
7140    );
7141  }
7142  if (node.children.length) {
7143    context.onError(
7144      createDOMCompilerError(56, loc)
7145    );
7146    node.children.length = 0;
7147  }
7148  return {
7149    props: [
7150      (0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createObjectProperty)(
7151        (0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createSimpleExpression)(`textContent`, true),
7152        exp ? (0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.getConstantType)(exp, context) > 0 ? exp : (0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createCallExpression)(
7153          context.helperString(_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.TO_DISPLAY_STRING),
7154          [exp],
7155          loc
7156        ) : (0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createSimpleExpression)("", true)
7157      )
7158    ]
7159  };
7160};
7161
7162const transformModel = (dir, node, context) => {
7163  const baseResult = (0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.transformModel)(dir, node, context);
7164  if (!baseResult.props.length || node.tagType === 1) {
7165    return baseResult;
7166  }
7167  if (dir.arg) {
7168    context.onError(
7169      createDOMCompilerError(
7170        58,
7171        dir.arg.loc
7172      )
7173    );
7174  }
7175  function checkDuplicatedValue() {
7176    const value = (0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.findDir)(node, "bind");
7177    if (value && (0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.isStaticArgOf)(value.arg, "value")) {
7178      context.onError(
7179        createDOMCompilerError(
7180          60,
7181          value.loc
7182        )
7183      );
7184    }
7185  }
7186  const { tag } = node;
7187  const isCustomElement = context.isCustomElement(tag);
7188  if (tag === "input" || tag === "textarea" || tag === "select" || isCustomElement) {
7189    let directiveToUse = V_MODEL_TEXT;
7190    let isInvalidType = false;
7191    if (tag === "input" || isCustomElement) {
7192      const type = (0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.findProp)(node, `type`);
7193      if (type) {
7194        if (type.type === 7) {
7195          directiveToUse = V_MODEL_DYNAMIC;
7196        } else if (type.value) {
7197          switch (type.value.content) {
7198            case "radio":
7199              directiveToUse = V_MODEL_RADIO;
7200              break;
7201            case "checkbox":
7202              directiveToUse = V_MODEL_CHECKBOX;
7203              break;
7204            case "file":
7205              isInvalidType = true;
7206              context.onError(
7207                createDOMCompilerError(
7208                  59,
7209                  dir.loc
7210                )
7211              );
7212              break;
7213            default:
7214               true && checkDuplicatedValue();
7215              break;
7216          }
7217        }
7218      } else if ((0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.hasDynamicKeyVBind)(node)) {
7219        directiveToUse = V_MODEL_DYNAMIC;
7220      } else {
7221         true && checkDuplicatedValue();
7222      }
7223    } else if (tag === "select") {
7224      directiveToUse = V_MODEL_SELECT;
7225    } else {
7226       true && checkDuplicatedValue();
7227    }
7228    if (!isInvalidType) {
7229      baseResult.needRuntime = context.helper(directiveToUse);
7230    }
7231  } else {
7232    context.onError(
7233      createDOMCompilerError(
7234        57,
7235        dir.loc
7236      )
7237    );
7238  }
7239  baseResult.props = baseResult.props.filter(
7240    (p) => !(p.key.type === 4 && p.key.content === "modelValue")
7241  );
7242  return baseResult;
7243};
7244
7245const isEventOptionModifier = /* @__PURE__ */ (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.makeMap)(`passive,once,capture`);
7246const isNonKeyModifier = /* @__PURE__ */ (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.makeMap)(
7247  // event propagation management
7248  `stop,prevent,self,ctrl,shift,alt,meta,exact,middle`
7249);
7250const maybeKeyModifier = /* @__PURE__ */ (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.makeMap)("left,right");
7251const isKeyboardEvent = /* @__PURE__ */ (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.makeMap)(
7252  `onkeyup,onkeydown,onkeypress`,
7253  true
7254);
7255const resolveModifiers = (key, modifiers, context, loc) => {
7256  const keyModifiers = [];
7257  const nonKeyModifiers = [];
7258  const eventOptionModifiers = [];
7259  for (let i = 0; i < modifiers.length; i++) {
7260    const modifier = modifiers[i];
7261    if (modifier === "native" && (0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.checkCompatEnabled)(
7262      "COMPILER_V_ON_NATIVE",
7263      context,
7264      loc
7265    )) {
7266      eventOptionModifiers.push(modifier);
7267    } else if (isEventOptionModifier(modifier)) {
7268      eventOptionModifiers.push(modifier);
7269    } else {
7270      if (maybeKeyModifier(modifier)) {
7271        if ((0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.isStaticExp)(key)) {
7272          if (isKeyboardEvent(key.content)) {
7273            keyModifiers.push(modifier);
7274          } else {
7275            nonKeyModifiers.push(modifier);
7276          }
7277        } else {
7278          keyModifiers.push(modifier);
7279          nonKeyModifiers.push(modifier);
7280        }
7281      } else {
7282        if (isNonKeyModifier(modifier)) {
7283          nonKeyModifiers.push(modifier);
7284        } else {
7285          keyModifiers.push(modifier);
7286        }
7287      }
7288    }
7289  }
7290  return {
7291    keyModifiers,
7292    nonKeyModifiers,
7293    eventOptionModifiers
7294  };
7295};
7296const transformClick = (key, event) => {
7297  const isStaticClick = (0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.isStaticExp)(key) && key.content.toLowerCase() === "onclick";
7298  return isStaticClick ? (0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createSimpleExpression)(event, true) : key.type !== 4 ? (0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createCompoundExpression)([
7299    `(`,
7300    key,
7301    `) === "onClick" ? "${event}" : (`,
7302    key,
7303    `)`
7304  ]) : key;
7305};
7306const transformOn = (dir, node, context) => {
7307  return (0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.transformOn)(dir, node, context, (baseResult) => {
7308    const { modifiers } = dir;
7309    if (!modifiers.length) return baseResult;
7310    let { key, value: handlerExp } = baseResult.props[0];
7311    const { keyModifiers, nonKeyModifiers, eventOptionModifiers } = resolveModifiers(key, modifiers, context, dir.loc);
7312    if (nonKeyModifiers.includes("right")) {
7313      key = transformClick(key, `onContextmenu`);
7314    }
7315    if (nonKeyModifiers.includes("middle")) {
7316      key = transformClick(key, `onMouseup`);
7317    }
7318    if (nonKeyModifiers.length) {
7319      handlerExp = (0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createCallExpression)(context.helper(V_ON_WITH_MODIFIERS), [
7320        handlerExp,
7321        JSON.stringify(nonKeyModifiers)
7322      ]);
7323    }
7324    if (keyModifiers.length && // if event name is dynamic, always wrap with keys guard
7325    (!(0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.isStaticExp)(key) || isKeyboardEvent(key.content))) {
7326      handlerExp = (0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createCallExpression)(context.helper(V_ON_WITH_KEYS), [
7327        handlerExp,
7328        JSON.stringify(keyModifiers)
7329      ]);
7330    }
7331    if (eventOptionModifiers.length) {
7332      const modifierPostfix = eventOptionModifiers.map(_vue_shared__WEBPACK_IMPORTED_MODULE_1__.capitalize).join("");
7333      key = (0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.isStaticExp)(key) ? (0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createSimpleExpression)(`${key.content}${modifierPostfix}`, true) : (0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createCompoundExpression)([`(`, key, `) + "${modifierPostfix}"`]);
7334    }
7335    return {
7336      props: [(0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createObjectProperty)(key, handlerExp)]
7337    };
7338  });
7339};
7340
7341const transformShow = (dir, node, context) => {
7342  const { exp, loc } = dir;
7343  if (!exp) {
7344    context.onError(
7345      createDOMCompilerError(61, loc)
7346    );
7347  }
7348  return {
7349    props: [],
7350    needRuntime: context.helper(V_SHOW)
7351  };
7352};
7353
7354const transformTransition = (node, context) => {
7355  if (node.type === 1 && node.tagType === 1) {
7356    const component = context.isBuiltInComponent(node.tag);
7357    if (component === TRANSITION) {
7358      return () => {
7359        if (!node.children.length) {
7360          return;
7361        }
7362        if (hasMultipleChildren(node)) {
7363          context.onError(
7364            createDOMCompilerError(
7365              62,
7366              {
7367                start: node.children[0].loc.start,
7368                end: node.children[node.children.length - 1].loc.end,
7369                source: ""
7370              }
7371            )
7372          );
7373        }
7374        const child = node.children[0];
7375        if (child.type === 1) {
7376          for (const p of child.props) {
7377            if (p.type === 7 && p.name === "show") {
7378              node.props.push({
7379                type: 6,
7380                name: "persisted",
7381                nameLoc: node.loc,
7382                value: void 0,
7383                loc: node.loc
7384              });
7385            }
7386          }
7387        }
7388      };
7389    }
7390  }
7391};
7392function hasMultipleChildren(node) {
7393  const children = node.children = node.children.filter(
7394    (c) => c.type !== 3 && !(c.type === 2 && !c.content.trim())
7395  );
7396  const child = children[0];
7397  return children.length !== 1 || child.type === 11 || child.type === 9 && child.branches.some(hasMultipleChildren);
7398}
7399
7400const ignoreSideEffectTags = (node, context) => {
7401  if (node.type === 1 && node.tagType === 0 && (node.tag === "script" || node.tag === "style")) {
7402     true && context.onError(
7403      createDOMCompilerError(
7404        63,
7405        node.loc
7406      )
7407    );
7408    context.removeNode();
7409  }
7410};
7411
7412const DOMNodeTransforms = [
7413  transformStyle,
7414  ... true ? [transformTransition] : 0
7415];
7416const DOMDirectiveTransforms = {
7417  cloak: _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.noopDirectiveTransform,
7418  html: transformVHtml,
7419  text: transformVText,
7420  model: transformModel,
7421  // override compiler-core
7422  on: transformOn,
7423  // override compiler-core
7424  show: transformShow
7425};
7426function compile(src, options = {}) {
7427  return (0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.baseCompile)(
7428    src,
7429    (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)({}, parserOptions, options, {
7430      nodeTransforms: [
7431        // ignore <script> and <tag>
7432        // this is not put inside DOMNodeTransforms because that list is used
7433        // by compiler-ssr to generate vnode fallback branches
7434        ignoreSideEffectTags,
7435        ...DOMNodeTransforms,
7436        ...options.nodeTransforms || []
7437      ],
7438      directiveTransforms: (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)(
7439        {},
7440        DOMDirectiveTransforms,
7441        options.directiveTransforms || {}
7442      ),
7443      transformHoist: null 
7444    })
7445  );
7446}
7447function parse(template, options = {}) {
7448  return (0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.baseParse)(template, (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)({}, parserOptions, options));
7449}
7450
7451
7452
7453
7454/***/ }),
7455
vendor: 40,104 bytes, lines 7456-8760
7456/***/ "./node_modules/@vue/reactivity/dist/reactivity.esm-bundler.js":
7457/*!*********************************************************************!*\
7458  !*** ./node_modules/@vue/reactivity/dist/reactivity.esm-bundler.js ***!
7459  \*********************************************************************/
7460/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
7461
7462"use strict";
7463__webpack_require__.r(__webpack_exports__);
7464/* harmony export */ __webpack_require__.d(__webpack_exports__, {
7465/* harmony export */   EffectScope: function() { return /* binding */ EffectScope; },
7466/* harmony export */   ITERATE_KEY: function() { return /* binding */ ITERATE_KEY; },
7467/* harmony export */   ReactiveEffect: function() { return /* binding */ ReactiveEffect; },
7468/* harmony export */   ReactiveFlags: function() { return /* binding */ ReactiveFlags; },
7469/* harmony export */   TrackOpTypes: function() { return /* binding */ TrackOpTypes; },
7470/* harmony export */   TriggerOpTypes: function() { return /* binding */ TriggerOpTypes; },
7471/* harmony export */   computed: function() { return /* binding */ computed; },
7472/* harmony export */   customRef: function() { return /* binding */ customRef; },
7473/* harmony export */   deferredComputed: function() { return /* binding */ deferredComputed; },
7474/* harmony export */   effect: function() { return /* binding */ effect; },
7475/* harmony export */   effectScope: function() { return /* binding */ effectScope; },
7476/* harmony export */   enableTracking: function() { return /* binding */ enableTracking; },
7477/* harmony export */   getCurrentScope: function() { return /* binding */ getCurrentScope; },
7478/* harmony export */   isProxy: function() { return /* binding */ isProxy; },
7479/* harmony export */   isReactive: function() { return /* binding */ isReactive; },
7480/* harmony export */   isReadonly: function() { return /* binding */ isReadonly; },
7481/* harmony export */   isRef: function() { return /* binding */ isRef; },
7482/* harmony export */   isShallow: function() { return /* binding */ isShallow; },
7483/* harmony export */   markRaw: function() { return /* binding */ markRaw; },
7484/* harmony export */   onScopeDispose: function() { return /* binding */ onScopeDispose; },
7485/* harmony export */   pauseScheduling: function() { return /* binding */ pauseScheduling; },
7486/* harmony export */   pauseTracking: function() { return /* binding */ pauseTracking; },
7487/* harmony export */   proxyRefs: function() { return /* binding */ proxyRefs; },
7488/* harmony export */   reactive: function() { return /* binding */ reactive; },
7489/* harmony export */   readonly: function() { return /* binding */ readonly; },
7490/* harmony export */   ref: function() { return /* binding */ ref; },
7491/* harmony export */   resetScheduling: function() { return /* binding */ resetScheduling; },
7492/* harmony export */   resetTracking: function() { return /* binding */ resetTracking; },
7493/* harmony export */   shallowReactive: function() { return /* binding */ shallowReactive; },
7494/* harmony export */   shallowReadonly: function() { return /* binding */ shallowReadonly; },
7495/* harmony export */   shallowRef: function() { return /* binding */ shallowRef; },
7496/* harmony export */   stop: function() { return /* binding */ stop; },
7497/* harmony export */   toRaw: function() { return /* binding */ toRaw; },
7498/* harmony export */   toRef: function() { return /* binding */ toRef; },
7499/* harmony export */   toRefs: function() { return /* binding */ toRefs; },
7500/* harmony export */   toValue: function() { return /* binding */ toValue; },
7501/* harmony export */   track: function() { return /* binding */ track; },
7502/* harmony export */   trigger: function() { return /* binding */ trigger; },
7503/* harmony export */   triggerRef: function() { return /* binding */ triggerRef; },
7504/* harmony export */   unref: function() { return /* binding */ unref; }
7505/* harmony export */ });
7506/* harmony import */ var _vue_shared__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @vue/shared */ "./node_modules/@vue/shared/dist/shared.esm-bundler.js");
7507/**
7508* @vue/reactivity v3.4.34
7509* (c) 2018-present Yuxi (Evan) You and Vue contributors
7510* @license MIT
7511**/
7512
7513
7514function warn(msg, ...args) {
7515  console.warn(`[Vue warn] ${msg}`, ...args);
7516}
7517
7518let activeEffectScope;
7519class EffectScope {
7520  constructor(detached = false) {
7521    this.detached = detached;
7522    /**
7523     * @internal
7524     */
7525    this._active = true;
7526    /**
7527     * @internal
7528     */
7529    this.effects = [];
7530    /**
7531     * @internal
7532     */
7533    this.cleanups = [];
7534    this.parent = activeEffectScope;
7535    if (!detached && activeEffectScope) {
7536      this.index = (activeEffectScope.scopes || (activeEffectScope.scopes = [])).push(
7537        this
7538      ) - 1;
7539    }
7540  }
7541  get active() {
7542    return this._active;
7543  }
7544  run(fn) {
7545    if (this._active) {
7546      const currentEffectScope = activeEffectScope;
7547      try {
7548        activeEffectScope = this;
7549        return fn();
7550      } finally {
7551        activeEffectScope = currentEffectScope;
7552      }
7553    } else if (true) {
7554      warn(`cannot run an inactive effect scope.`);
7555    }
7556  }
7557  /**
7558   * This should only be called on non-detached scopes
7559   * @internal
7560   */
7561  on() {
7562    activeEffectScope = this;
7563  }
7564  /**
7565   * This should only be called on non-detached scopes
7566   * @internal
7567   */
7568  off() {
7569    activeEffectScope = this.parent;
7570  }
7571  stop(fromParent) {
7572    if (this._active) {
7573      let i, l;
7574      for (i = 0, l = this.effects.length; i < l; i++) {
7575        this.effects[i].stop();
7576      }
7577      for (i = 0, l = this.cleanups.length; i < l; i++) {
7578        this.cleanups[i]();
7579      }
7580      if (this.scopes) {
7581        for (i = 0, l = this.scopes.length; i < l; i++) {
7582          this.scopes[i].stop(true);
7583        }
7584      }
7585      if (!this.detached && this.parent && !fromParent) {
7586        const last = this.parent.scopes.pop();
7587        if (last && last !== this) {
7588          this.parent.scopes[this.index] = last;
7589          last.index = this.index;
7590        }
7591      }
7592      this.parent = void 0;
7593      this._active = false;
7594    }
7595  }
7596}
7597function effectScope(detached) {
7598  return new EffectScope(detached);
7599}
7600function recordEffectScope(effect, scope = activeEffectScope) {
7601  if (scope && scope.active) {
7602    scope.effects.push(effect);
7603  }
7604}
7605function getCurrentScope() {
7606  return activeEffectScope;
7607}
7608function onScopeDispose(fn) {
7609  if (activeEffectScope) {
7610    activeEffectScope.cleanups.push(fn);
7611  } else if (true) {
7612    warn(
7613      `onScopeDispose() is called when there is no active effect scope to be associated with.`
7614    );
7615  }
7616}
7617
7618let activeEffect;
7619class ReactiveEffect {
7620  constructor(fn, trigger, scheduler, scope) {
7621    this.fn = fn;
7622    this.trigger = trigger;
7623    this.scheduler = scheduler;
7624    this.active = true;
7625    this.deps = [];
7626    /**
7627     * @internal
7628     */
7629    this._dirtyLevel = 4;
7630    /**
7631     * @internal
7632     */
7633    this._trackId = 0;
7634    /**
7635     * @internal
7636     */
7637    this._runnings = 0;
7638    /**
7639     * @internal
7640     */
7641    this._shouldSchedule = false;
7642    /**
7643     * @internal
7644     */
7645    this._depsLength = 0;
7646    recordEffectScope(this, scope);
7647  }
7648  get dirty() {
7649    if (this._dirtyLevel === 2 || this._dirtyLevel === 3) {
7650      this._dirtyLevel = 1;
7651      pauseTracking();
7652      for (let i = 0; i < this._depsLength; i++) {
7653        const dep = this.deps[i];
7654        if (dep.computed) {
7655          triggerComputed(dep.computed);
7656          if (this._dirtyLevel >= 4) {
7657            break;
7658          }
7659        }
7660      }
7661      if (this._dirtyLevel === 1) {
7662        this._dirtyLevel = 0;
7663      }
7664      resetTracking();
7665    }
7666    return this._dirtyLevel >= 4;
7667  }
7668  set dirty(v) {
7669    this._dirtyLevel = v ? 4 : 0;
7670  }
7671  run() {
7672    this._dirtyLevel = 0;
7673    if (!this.active) {
7674      return this.fn();
7675    }
7676    let lastShouldTrack = shouldTrack;
7677    let lastEffect = activeEffect;
7678    try {
7679      shouldTrack = true;
7680      activeEffect = this;
7681      this._runnings++;
7682      preCleanupEffect(this);
7683      return this.fn();
7684    } finally {
7685      postCleanupEffect(this);
7686      this._runnings--;
7687      activeEffect = lastEffect;
7688      shouldTrack = lastShouldTrack;
7689    }
7690  }
7691  stop() {
7692    if (this.active) {
7693      preCleanupEffect(this);
7694      postCleanupEffect(this);
7695      this.onStop && this.onStop();
7696      this.active = false;
7697    }
7698  }
7699}
7700function triggerComputed(computed) {
7701  return computed.value;
7702}
7703function preCleanupEffect(effect2) {
7704  effect2._trackId++;
7705  effect2._depsLength = 0;
7706}
7707function postCleanupEffect(effect2) {
7708  if (effect2.deps.length > effect2._depsLength) {
7709    for (let i = effect2._depsLength; i < effect2.deps.length; i++) {
7710      cleanupDepEffect(effect2.deps[i], effect2);
7711    }
7712    effect2.deps.length = effect2._depsLength;
7713  }
7714}
7715function cleanupDepEffect(dep, effect2) {
7716  const trackId = dep.get(effect2);
7717  if (trackId !== void 0 && effect2._trackId !== trackId) {
7718    dep.delete(effect2);
7719    if (dep.size === 0) {
7720      dep.cleanup();
7721    }
7722  }
7723}
7724function effect(fn, options) {
7725  if (fn.effect instanceof ReactiveEffect) {
7726    fn = fn.effect.fn;
7727  }
7728  const _effect = new ReactiveEffect(fn, _vue_shared__WEBPACK_IMPORTED_MODULE_0__.NOOP, () => {
7729    if (_effect.dirty) {
7730      _effect.run();
7731    }
7732  });
7733  if (options) {
7734    (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.extend)(_effect, options);
7735    if (options.scope) recordEffectScope(_effect, options.scope);
7736  }
7737  if (!options || !options.lazy) {
7738    _effect.run();
7739  }
7740  const runner = _effect.run.bind(_effect);
7741  runner.effect = _effect;
7742  return runner;
7743}
7744function stop(runner) {
7745  runner.effect.stop();
7746}
7747let shouldTrack = true;
7748let pauseScheduleStack = 0;
7749const trackStack = [];
7750function pauseTracking() {
7751  trackStack.push(shouldTrack);
7752  shouldTrack = false;
7753}
7754function enableTracking() {
7755  trackStack.push(shouldTrack);
7756  shouldTrack = true;
7757}
7758function resetTracking() {
7759  const last = trackStack.pop();
7760  shouldTrack = last === void 0 ? true : last;
7761}
7762function pauseScheduling() {
7763  pauseScheduleStack++;
7764}
7765function resetScheduling() {
7766  pauseScheduleStack--;
7767  while (!pauseScheduleStack && queueEffectSchedulers.length) {
7768    queueEffectSchedulers.shift()();
7769  }
7770}
7771function trackEffect(effect2, dep, debuggerEventExtraInfo) {
7772  var _a;
7773  if (dep.get(effect2) !== effect2._trackId) {
7774    dep.set(effect2, effect2._trackId);
7775    const oldDep = effect2.deps[effect2._depsLength];
7776    if (oldDep !== dep) {
7777      if (oldDep) {
7778        cleanupDepEffect(oldDep, effect2);
7779      }
7780      effect2.deps[effect2._depsLength++] = dep;
7781    } else {
7782      effect2._depsLength++;
7783    }
7784    if (true) {
7785      (_a = effect2.onTrack) == null ? void 0 : _a.call(effect2, (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.extend)({ effect: effect2 }, debuggerEventExtraInfo));
7786    }
7787  }
7788}
7789const queueEffectSchedulers = [];
7790function triggerEffects(dep, dirtyLevel, debuggerEventExtraInfo) {
7791  var _a;
7792  pauseScheduling();
7793  for (const effect2 of dep.keys()) {
7794    let tracking;
7795    if (effect2._dirtyLevel < dirtyLevel && (tracking != null ? tracking : tracking = dep.get(effect2) === effect2._trackId)) {
7796      effect2._shouldSchedule || (effect2._shouldSchedule = effect2._dirtyLevel === 0);
7797      effect2._dirtyLevel = dirtyLevel;
7798    }
7799    if (effect2._shouldSchedule && (tracking != null ? tracking : tracking = dep.get(effect2) === effect2._trackId)) {
7800      if (true) {
7801        (_a = effect2.onTrigger) == null ? void 0 : _a.call(effect2, (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.extend)({ effect: effect2 }, debuggerEventExtraInfo));
7802      }
7803      effect2.trigger();
7804      if ((!effect2._runnings || effect2.allowRecurse) && effect2._dirtyLevel !== 2) {
7805        effect2._shouldSchedule = false;
7806        if (effect2.scheduler) {
7807          queueEffectSchedulers.push(effect2.scheduler);
7808        }
7809      }
7810    }
7811  }
7812  resetScheduling();
7813}
7814
7815const createDep = (cleanup, computed) => {
7816  const dep = /* @__PURE__ */ new Map();
7817  dep.cleanup = cleanup;
7818  dep.computed = computed;
7819  return dep;
7820};
7821
7822const targetMap = /* @__PURE__ */ new WeakMap();
7823const ITERATE_KEY = Symbol( true ? "iterate" : 0);
7824const MAP_KEY_ITERATE_KEY = Symbol( true ? "Map key iterate" : 0);
7825function track(target, type, key) {
7826  if (shouldTrack && activeEffect) {
7827    let depsMap = targetMap.get(target);
7828    if (!depsMap) {
7829      targetMap.set(target, depsMap = /* @__PURE__ */ new Map());
7830    }
7831    let dep = depsMap.get(key);
7832    if (!dep) {
7833      depsMap.set(key, dep = createDep(() => depsMap.delete(key)));
7834    }
7835    trackEffect(
7836      activeEffect,
7837      dep,
7838       true ? {
7839        target,
7840        type,
7841        key
7842      } : 0
7843    );
7844  }
7845}
7846function trigger(target, type, key, newValue, oldValue, oldTarget) {
7847  const depsMap = targetMap.get(target);
7848  if (!depsMap) {
7849    return;
7850  }
7851  let deps = [];
7852  if (type === "clear") {
7853    deps = [...depsMap.values()];
7854  } else if (key === "length" && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isArray)(target)) {
7855    const newLength = Number(newValue);
7856    depsMap.forEach((dep, key2) => {
7857      if (key2 === "length" || !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isSymbol)(key2) && key2 >= newLength) {
7858        deps.push(dep);
7859      }
7860    });
7861  } else {
7862    if (key !== void 0) {
7863      deps.push(depsMap.get(key));
7864    }
7865    switch (type) {
7866      case "add":
7867        if (!(0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isArray)(target)) {
7868          deps.push(depsMap.get(ITERATE_KEY));
7869          if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isMap)(target)) {
7870            deps.push(depsMap.get(MAP_KEY_ITERATE_KEY));
7871          }
7872        } else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isIntegerKey)(key)) {
7873          deps.push(depsMap.get("length"));
7874        }
7875        break;
7876      case "delete":
7877        if (!(0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isArray)(target)) {
7878          deps.push(depsMap.get(ITERATE_KEY));
7879          if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isMap)(target)) {
7880            deps.push(depsMap.get(MAP_KEY_ITERATE_KEY));
7881          }
7882        }
7883        break;
7884      case "set":
7885        if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isMap)(target)) {
7886          deps.push(depsMap.get(ITERATE_KEY));
7887        }
7888        break;
7889    }
7890  }
7891  pauseScheduling();
7892  for (const dep of deps) {
7893    if (dep) {
7894      triggerEffects(
7895        dep,
7896        4,
7897         true ? {
7898          target,
7899          type,
7900          key,
7901          newValue,
7902          oldValue,
7903          oldTarget
7904        } : 0
7905      );
7906    }
7907  }
7908  resetScheduling();
7909}
7910function getDepFromReactive(object, key) {
7911  const depsMap = targetMap.get(object);
7912  return depsMap && depsMap.get(key);
7913}
7914
7915const isNonTrackableKeys = /* @__PURE__ */ (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.makeMap)(`__proto__,__v_isRef,__isVue`);
7916const builtInSymbols = new Set(
7917  /* @__PURE__ */ Object.getOwnPropertyNames(Symbol).filter((key) => key !== "arguments" && key !== "caller").map((key) => Symbol[key]).filter(_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isSymbol)
7918);
7919const arrayInstrumentations = /* @__PURE__ */ createArrayInstrumentations();
7920function createArrayInstrumentations() {
7921  const instrumentations = {};
7922  ["includes", "indexOf", "lastIndexOf"].forEach((key) => {
7923    instrumentations[key] = function(...args) {
7924      const arr = toRaw(this);
7925      for (let i = 0, l = this.length; i < l; i++) {
7926        track(arr, "get", i + "");
7927      }
7928      const res = arr[key](...args);
7929      if (res === -1 || res === false) {
7930        return arr[key](...args.map(toRaw));
7931      } else {
7932        return res;
7933      }
7934    };
7935  });
7936  ["push", "pop", "shift", "unshift", "splice"].forEach((key) => {
7937    instrumentations[key] = function(...args) {
7938      pauseTracking();
7939      pauseScheduling();
7940      const res = toRaw(this)[key].apply(this, args);
7941      resetScheduling();
7942      resetTracking();
7943      return res;
7944    };
7945  });
7946  return instrumentations;
7947}
7948function hasOwnProperty(key) {
7949  if (!(0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isSymbol)(key)) key = String(key);
7950  const obj = toRaw(this);
7951  track(obj, "has", key);
7952  return obj.hasOwnProperty(key);
7953}
7954class BaseReactiveHandler {
7955  constructor(_isReadonly = false, _isShallow = false) {
7956    this._isReadonly = _isReadonly;
7957    this._isShallow = _isShallow;
7958  }
7959  get(target, key, receiver) {
7960    const isReadonly2 = this._isReadonly, isShallow2 = this._isShallow;
7961    if (key === "__v_isReactive") {
7962      return !isReadonly2;
7963    } else if (key === "__v_isReadonly") {
7964      return isReadonly2;
7965    } else if (key === "__v_isShallow") {
7966      return isShallow2;
7967    } else if (key === "__v_raw") {
7968      if (receiver === (isReadonly2 ? isShallow2 ? shallowReadonlyMap : readonlyMap : isShallow2 ? shallowReactiveMap : reactiveMap).get(target) || // receiver is not the reactive proxy, but has the same prototype
7969      // this means the reciever is a user proxy of the reactive proxy
7970      Object.getPrototypeOf(target) === Object.getPrototypeOf(receiver)) {
7971        return target;
7972      }
7973      return;
7974    }
7975    const targetIsArray = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isArray)(target);
7976    if (!isReadonly2) {
7977      if (targetIsArray && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.hasOwn)(arrayInstrumentations, key)) {
7978        return Reflect.get(arrayInstrumentations, key, receiver);
7979      }
7980      if (key === "hasOwnProperty") {
7981        return hasOwnProperty;
7982      }
7983    }
7984    const res = Reflect.get(target, key, receiver);
7985    if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isSymbol)(key) ? builtInSymbols.has(key) : isNonTrackableKeys(key)) {
7986      return res;
7987    }
7988    if (!isReadonly2) {
7989      track(target, "get", key);
7990    }
7991    if (isShallow2) {
7992      return res;
7993    }
7994    if (isRef(res)) {
7995      return targetIsArray && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isIntegerKey)(key) ? res : res.value;
7996    }
7997    if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isObject)(res)) {
7998      return isReadonly2 ? readonly(res) : reactive(res);
7999    }
8000    return res;
8001  }
8002}
8003class MutableReactiveHandler extends BaseReactiveHandler {
8004  constructor(isShallow2 = false) {
8005    super(false, isShallow2);
8006  }
8007  set(target, key, value, receiver) {
8008    let oldValue = target[key];
8009    if (!this._isShallow) {
8010      const isOldValueReadonly = isReadonly(oldValue);
8011      if (!isShallow(value) && !isReadonly(value)) {
8012        oldValue = toRaw(oldValue);
8013        value = toRaw(value);
8014      }
8015      if (!(0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isArray)(target) && isRef(oldValue) && !isRef(value)) {
8016        if (isOldValueReadonly) {
8017          return false;
8018        } else {
8019          oldValue.value = value;
8020          return true;
8021        }
8022      }
8023    }
8024    const hadKey = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isArray)(target) && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isIntegerKey)(key) ? Number(key) < target.length : (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.hasOwn)(target, key);
8025    const result = Reflect.set(target, key, value, receiver);
8026    if (target === toRaw(receiver)) {
8027      if (!hadKey) {
8028        trigger(target, "add", key, value);
8029      } else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.hasChanged)(value, oldValue)) {
8030        trigger(target, "set", key, value, oldValue);
8031      }
8032    }
8033    return result;
8034  }
8035  deleteProperty(target, key) {
8036    const hadKey = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.hasOwn)(target, key);
8037    const oldValue = target[key];
8038    const result = Reflect.deleteProperty(target, key);
8039    if (result && hadKey) {
8040      trigger(target, "delete", key, void 0, oldValue);
8041    }
8042    return result;
8043  }
8044  has(target, key) {
8045    const result = Reflect.has(target, key);
8046    if (!(0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isSymbol)(key) || !builtInSymbols.has(key)) {
8047      track(target, "has", key);
8048    }
8049    return result;
8050  }
8051  ownKeys(target) {
8052    track(
8053      target,
8054      "iterate",
8055      (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isArray)(target) ? "length" : ITERATE_KEY
8056    );
8057    return Reflect.ownKeys(target);
8058  }
8059}
8060class ReadonlyReactiveHandler extends BaseReactiveHandler {
8061  constructor(isShallow2 = false) {
8062    super(true, isShallow2);
8063  }
8064  set(target, key) {
8065    if (true) {
8066      warn(
8067        `Set operation on key "${String(key)}" failed: target is readonly.`,
8068        target
8069      );
8070    }
8071    return true;
8072  }
8073  deleteProperty(target, key) {
8074    if (true) {
8075      warn(
8076        `Delete operation on key "${String(key)}" failed: target is readonly.`,
8077        target
8078      );
8079    }
8080    return true;
8081  }
8082}
8083const mutableHandlers = /* @__PURE__ */ new MutableReactiveHandler();
8084const readonlyHandlers = /* @__PURE__ */ new ReadonlyReactiveHandler();
8085const shallowReactiveHandlers = /* @__PURE__ */ new MutableReactiveHandler(
8086  true
8087);
8088const shallowReadonlyHandlers = /* @__PURE__ */ new ReadonlyReactiveHandler(true);
8089
8090const toShallow = (value) => value;
8091const getProto = (v) => Reflect.getPrototypeOf(v);
8092function get(target, key, isReadonly2 = false, isShallow2 = false) {
8093  target = target["__v_raw"];
8094  const rawTarget = toRaw(target);
8095  const rawKey = toRaw(key);
8096  if (!isReadonly2) {
8097    if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.hasChanged)(key, rawKey)) {
8098      track(rawTarget, "get", key);
8099    }
8100    track(rawTarget, "get", rawKey);
8101  }
8102  const { has: has2 } = getProto(rawTarget);
8103  const wrap = isShallow2 ? toShallow : isReadonly2 ? toReadonly : toReactive;
8104  if (has2.call(rawTarget, key)) {
8105    return wrap(target.get(key));
8106  } else if (has2.call(rawTarget, rawKey)) {
8107    return wrap(target.get(rawKey));
8108  } else if (target !== rawTarget) {
8109    target.get(key);
8110  }
8111}
8112function has(key, isReadonly2 = false) {
8113  const target = this["__v_raw"];
8114  const rawTarget = toRaw(target);
8115  const rawKey = toRaw(key);
8116  if (!isReadonly2) {
8117    if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.hasChanged)(key, rawKey)) {
8118      track(rawTarget, "has", key);
8119    }
8120    track(rawTarget, "has", rawKey);
8121  }
8122  return key === rawKey ? target.has(key) : target.has(key) || target.has(rawKey);
8123}
8124function size(target, isReadonly2 = false) {
8125  target = target["__v_raw"];
8126  !isReadonly2 && track(toRaw(target), "iterate", ITERATE_KEY);
8127  return Reflect.get(target, "size", target);
8128}
8129function add(value, _isShallow = false) {
8130  if (!_isShallow && !isShallow(value) && !isReadonly(value)) {
8131    value = toRaw(value);
8132  }
8133  const target = toRaw(this);
8134  const proto = getProto(target);
8135  const hadKey = proto.has.call(target, value);
8136  if (!hadKey) {
8137    target.add(value);
8138    trigger(target, "add", value, value);
8139  }
8140  return this;
8141}
8142function set(key, value, _isShallow = false) {
8143  if (!_isShallow && !isShallow(value) && !isReadonly(value)) {
8144    value = toRaw(value);
8145  }
8146  const target = toRaw(this);
8147  const { has: has2, get: get2 } = getProto(target);
8148  let hadKey = has2.call(target, key);
8149  if (!hadKey) {
8150    key = toRaw(key);
8151    hadKey = has2.call(target, key);
8152  } else if (true) {
8153    checkIdentityKeys(target, has2, key);
8154  }
8155  const oldValue = get2.call(target, key);
8156  target.set(key, value);
8157  if (!hadKey) {
8158    trigger(target, "add", key, value);
8159  } else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.hasChanged)(value, oldValue)) {
8160    trigger(target, "set", key, value, oldValue);
8161  }
8162  return this;
8163}
8164function deleteEntry(key) {
8165  const target = toRaw(this);
8166  const { has: has2, get: get2 } = getProto(target);
8167  let hadKey = has2.call(target, key);
8168  if (!hadKey) {
8169    key = toRaw(key);
8170    hadKey = has2.call(target, key);
8171  } else if (true) {
8172    checkIdentityKeys(target, has2, key);
8173  }
8174  const oldValue = get2 ? get2.call(target, key) : void 0;
8175  const result = target.delete(key);
8176  if (hadKey) {
8177    trigger(target, "delete", key, void 0, oldValue);
8178  }
8179  return result;
8180}
8181function clear() {
8182  const target = toRaw(this);
8183  const hadItems = target.size !== 0;
8184  const oldTarget =  true ? (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isMap)(target) ? new Map(target) : new Set(target) : 0;
8185  const result = target.clear();
8186  if (hadItems) {
8187    trigger(target, "clear", void 0, void 0, oldTarget);
8188  }
8189  return result;
8190}
8191function createForEach(isReadonly2, isShallow2) {
8192  return function forEach(callback, thisArg) {
8193    const observed = this;
8194    const target = observed["__v_raw"];
8195    const rawTarget = toRaw(target);
8196    const wrap = isShallow2 ? toShallow : isReadonly2 ? toReadonly : toReactive;
8197    !isReadonly2 && track(rawTarget, "iterate", ITERATE_KEY);
8198    return target.forEach((value, key) => {
8199      return callback.call(thisArg, wrap(value), wrap(key), observed);
8200    });
8201  };
8202}
8203function createIterableMethod(method, isReadonly2, isShallow2) {
8204  return function(...args) {
8205    const target = this["__v_raw"];
8206    const rawTarget = toRaw(target);
8207    const targetIsMap = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isMap)(rawTarget);
8208    const isPair = method === "entries" || method === Symbol.iterator && targetIsMap;
8209    const isKeyOnly = method === "keys" && targetIsMap;
8210    const innerIterator = target[method](...args);
8211    const wrap = isShallow2 ? toShallow : isReadonly2 ? toReadonly : toReactive;
8212    !isReadonly2 && track(
8213      rawTarget,
8214      "iterate",
8215      isKeyOnly ? MAP_KEY_ITERATE_KEY : ITERATE_KEY
8216    );
8217    return {
8218      // iterator protocol
8219      next() {
8220        const { value, done } = innerIterator.next();
8221        return done ? { value, done } : {
8222          value: isPair ? [wrap(value[0]), wrap(value[1])] : wrap(value),
8223          done
8224        };
8225      },
8226      // iterable protocol
8227      [Symbol.iterator]() {
8228        return this;
8229      }
8230    };
8231  };
8232}
8233function createReadonlyMethod(type) {
8234  return function(...args) {
8235    if (true) {
8236      const key = args[0] ? `on key "${args[0]}" ` : ``;
8237      warn(
8238        `${(0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.capitalize)(type)} operation ${key}failed: target is readonly.`,
8239        toRaw(this)
8240      );
8241    }
8242    return type === "delete" ? false : type === "clear" ? void 0 : this;
8243  };
8244}
8245function createInstrumentations() {
8246  const mutableInstrumentations2 = {
8247    get(key) {
8248      return get(this, key);
8249    },
8250    get size() {
8251      return size(this);
8252    },
8253    has,
8254    add,
8255    set,
8256    delete: deleteEntry,
8257    clear,
8258    forEach: createForEach(false, false)
8259  };
8260  const shallowInstrumentations2 = {
8261    get(key) {
8262      return get(this, key, false, true);
8263    },
8264    get size() {
8265      return size(this);
8266    },
8267    has,
8268    add(value) {
8269      return add.call(this, value, true);
8270    },
8271    set(key, value) {
8272      return set.call(this, key, value, true);
8273    },
8274    delete: deleteEntry,
8275    clear,
8276    forEach: createForEach(false, true)
8277  };
8278  const readonlyInstrumentations2 = {
8279    get(key) {
8280      return get(this, key, true);
8281    },
8282    get size() {
8283      return size(this, true);
8284    },
8285    has(key) {
8286      return has.call(this, key, true);
8287    },
8288    add: createReadonlyMethod("add"),
8289    set: createReadonlyMethod("set"),
8290    delete: createReadonlyMethod("delete"),
8291    clear: createReadonlyMethod("clear"),
8292    forEach: createForEach(true, false)
8293  };
8294  const shallowReadonlyInstrumentations2 = {
8295    get(key) {
8296      return get(this, key, true, true);
8297    },
8298    get size() {
8299      return size(this, true);
8300    },
8301    has(key) {
8302      return has.call(this, key, true);
8303    },
8304    add: createReadonlyMethod("add"),
8305    set: createReadonlyMethod("set"),
8306    delete: createReadonlyMethod("delete"),
8307    clear: createReadonlyMethod("clear"),
8308    forEach: createForEach(true, true)
8309  };
8310  const iteratorMethods = [
8311    "keys",
8312    "values",
8313    "entries",
8314    Symbol.iterator
8315  ];
8316  iteratorMethods.forEach((method) => {
8317    mutableInstrumentations2[method] = createIterableMethod(method, false, false);
8318    readonlyInstrumentations2[method] = createIterableMethod(method, true, false);
8319    shallowInstrumentations2[method] = createIterableMethod(method, false, true);
8320    shallowReadonlyInstrumentations2[method] = createIterableMethod(
8321      method,
8322      true,
8323      true
8324    );
8325  });
8326  return [
8327    mutableInstrumentations2,
8328    readonlyInstrumentations2,
8329    shallowInstrumentations2,
8330    shallowReadonlyInstrumentations2
8331  ];
8332}
8333const [
8334  mutableInstrumentations,
8335  readonlyInstrumentations,
8336  shallowInstrumentations,
8337  shallowReadonlyInstrumentations
8338] = /* @__PURE__ */ createInstrumentations();
8339function createInstrumentationGetter(isReadonly2, shallow) {
8340  const instrumentations = shallow ? isReadonly2 ? shallowReadonlyInstrumentations : shallowInstrumentations : isReadonly2 ? readonlyInstrumentations : mutableInstrumentations;
8341  return (target, key, receiver) => {
8342    if (key === "__v_isReactive") {
8343      return !isReadonly2;
8344    } else if (key === "__v_isReadonly") {
8345      return isReadonly2;
8346    } else if (key === "__v_raw") {
8347      return target;
8348    }
8349    return Reflect.get(
8350      (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.hasOwn)(instrumentations, key) && key in target ? instrumentations : target,
8351      key,
8352      receiver
8353    );
8354  };
8355}
8356const mutableCollectionHandlers = {
8357  get: /* @__PURE__ */ createInstrumentationGetter(false, false)
8358};
8359const shallowCollectionHandlers = {
8360  get: /* @__PURE__ */ createInstrumentationGetter(false, true)
8361};
8362const readonlyCollectionHandlers = {
8363  get: /* @__PURE__ */ createInstrumentationGetter(true, false)
8364};
8365const shallowReadonlyCollectionHandlers = {
8366  get: /* @__PURE__ */ createInstrumentationGetter(true, true)
8367};
8368function checkIdentityKeys(target, has2, key) {
8369  const rawKey = toRaw(key);
8370  if (rawKey !== key && has2.call(target, rawKey)) {
8371    const type = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.toRawType)(target);
8372    warn(
8373      `Reactive ${type} contains both the raw and reactive versions of the same object${type === `Map` ? ` as keys` : ``}, which can lead to inconsistencies. Avoid differentiating between the raw and reactive versions of an object and only use the reactive version if possible.`
8374    );
8375  }
8376}
8377
8378const reactiveMap = /* @__PURE__ */ new WeakMap();
8379const shallowReactiveMap = /* @__PURE__ */ new WeakMap();
8380const readonlyMap = /* @__PURE__ */ new WeakMap();
8381const shallowReadonlyMap = /* @__PURE__ */ new WeakMap();
8382function targetTypeMap(rawType) {
8383  switch (rawType) {
8384    case "Object":
8385    case "Array":
8386      return 1 /* COMMON */;
8387    case "Map":
8388    case "Set":
8389    case "WeakMap":
8390    case "WeakSet":
8391      return 2 /* COLLECTION */;
8392    default:
8393      return 0 /* INVALID */;
8394  }
8395}
8396function getTargetType(value) {
8397  return value["__v_skip"] || !Object.isExtensible(value) ? 0 /* INVALID */ : targetTypeMap((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.toRawType)(value));
8398}
8399function reactive(target) {
8400  if (isReadonly(target)) {
8401    return target;
8402  }
8403  return createReactiveObject(
8404    target,
8405    false,
8406    mutableHandlers,
8407    mutableCollectionHandlers,
8408    reactiveMap
8409  );
8410}
8411function shallowReactive(target) {
8412  return createReactiveObject(
8413    target,
8414    false,
8415    shallowReactiveHandlers,
8416    shallowCollectionHandlers,
8417    shallowReactiveMap
8418  );
8419}
8420function readonly(target) {
8421  return createReactiveObject(
8422    target,
8423    true,
8424    readonlyHandlers,
8425    readonlyCollectionHandlers,
8426    readonlyMap
8427  );
8428}
8429function shallowReadonly(target) {
8430  return createReactiveObject(
8431    target,
8432    true,
8433    shallowReadonlyHandlers,
8434    shallowReadonlyCollectionHandlers,
8435    shallowReadonlyMap
8436  );
8437}
8438function createReactiveObject(target, isReadonly2, baseHandlers, collectionHandlers, proxyMap) {
8439  if (!(0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isObject)(target)) {
8440    if (true) {
8441      warn(
8442        `value cannot be made ${isReadonly2 ? "readonly" : "reactive"}: ${String(
8443          target
8444        )}`
8445      );
8446    }
8447    return target;
8448  }
8449  if (target["__v_raw"] && !(isReadonly2 && target["__v_isReactive"])) {
8450    return target;
8451  }
8452  const existingProxy = proxyMap.get(target);
8453  if (existingProxy) {
8454    return existingProxy;
8455  }
8456  const targetType = getTargetType(target);
8457  if (targetType === 0 /* INVALID */) {
8458    return target;
8459  }
8460  const proxy = new Proxy(
8461    target,
8462    targetType === 2 /* COLLECTION */ ? collectionHandlers : baseHandlers
8463  );
8464  proxyMap.set(target, proxy);
8465  return proxy;
8466}
8467function isReactive(value) {
8468  if (isReadonly(value)) {
8469    return isReactive(value["__v_raw"]);
8470  }
8471  return !!(value && value["__v_isReactive"]);
8472}
8473function isReadonly(value) {
8474  return !!(value && value["__v_isReadonly"]);
8475}
8476function isShallow(value) {
8477  return !!(value && value["__v_isShallow"]);
8478}
8479function isProxy(value) {
8480  return value ? !!value["__v_raw"] : false;
8481}
8482function toRaw(observed) {
8483  const raw = observed && observed["__v_raw"];
8484  return raw ? toRaw(raw) : observed;
8485}
8486function markRaw(value) {
8487  if (Object.isExtensible(value)) {
8488    (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.def)(value, "__v_skip", true);
8489  }
8490  return value;
8491}
8492const toReactive = (value) => (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isObject)(value) ? reactive(value) : value;
8493const toReadonly = (value) => (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isObject)(value) ? readonly(value) : value;
8494
8495const COMPUTED_SIDE_EFFECT_WARN = `Computed is still dirty after getter evaluation, likely because a computed is mutating its own dependency in its getter. State mutations in computed getters should be avoided.  Check the docs for more details: https://vuejs.org/guide/essentials/computed.html#getters-should-be-side-effect-free`;
8496class ComputedRefImpl {
8497  constructor(getter, _setter, isReadonly, isSSR) {
8498    this.getter = getter;
8499    this._setter = _setter;
8500    this.dep = void 0;
8501    this.__v_isRef = true;
8502    this["__v_isReadonly"] = false;
8503    this.effect = new ReactiveEffect(
8504      () => getter(this._value),
8505      () => triggerRefValue(
8506        this,
8507        this.effect._dirtyLevel === 2 ? 2 : 3
8508      )
8509    );
8510    this.effect.computed = this;
8511    this.effect.active = this._cacheable = !isSSR;
8512    this["__v_isReadonly"] = isReadonly;
8513  }
8514  get value() {
8515    const self = toRaw(this);
8516    if ((!self._cacheable || self.effect.dirty) && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.hasChanged)(self._value, self._value = self.effect.run())) {
8517      triggerRefValue(self, 4);
8518    }
8519    trackRefValue(self);
8520    if (self.effect._dirtyLevel >= 2) {
8521      if ( true && this._warnRecursive) {
8522        warn(COMPUTED_SIDE_EFFECT_WARN, `
8523
8524getter: `, this.getter);
8525      }
8526      triggerRefValue(self, 2);
8527    }
8528    return self._value;
8529  }
8530  set value(newValue) {
8531    this._setter(newValue);
8532  }
8533  // #region polyfill _dirty for backward compatibility third party code for Vue <= 3.3.x
8534  get _dirty() {
8535    return this.effect.dirty;
8536  }
8537  set _dirty(v) {
8538    this.effect.dirty = v;
8539  }
8540  // #endregion
8541}
8542function computed(getterOrOptions, debugOptions, isSSR = false) {
8543  let getter;
8544  let setter;
8545  const onlyGetter = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isFunction)(getterOrOptions);
8546  if (onlyGetter) {
8547    getter = getterOrOptions;
8548    setter =  true ? () => {
8549      warn("Write operation failed: computed value is readonly");
8550    } : 0;
8551  } else {
8552    getter = getterOrOptions.get;
8553    setter = getterOrOptions.set;
8554  }
8555  const cRef = new ComputedRefImpl(getter, setter, onlyGetter || !setter, isSSR);
8556  if ( true && debugOptions && !isSSR) {
8557    cRef.effect.onTrack = debugOptions.onTrack;
8558    cRef.effect.onTrigger = debugOptions.onTrigger;
8559  }
8560  return cRef;
8561}
8562
8563function trackRefValue(ref2) {
8564  var _a;
8565  if (shouldTrack && activeEffect) {
8566    ref2 = toRaw(ref2);
8567    trackEffect(
8568      activeEffect,
8569      (_a = ref2.dep) != null ? _a : ref2.dep = createDep(
8570        () => ref2.dep = void 0,
8571        ref2 instanceof ComputedRefImpl ? ref2 : void 0
8572      ),
8573       true ? {
8574        target: ref2,
8575        type: "get",
8576        key: "value"
8577      } : 0
8578    );
8579  }
8580}
8581function triggerRefValue(ref2, dirtyLevel = 4, newVal, oldVal) {
8582  ref2 = toRaw(ref2);
8583  const dep = ref2.dep;
8584  if (dep) {
8585    triggerEffects(
8586      dep,
8587      dirtyLevel,
8588       true ? {
8589        target: ref2,
8590        type: "set",
8591        key: "value",
8592        newValue: newVal,
8593        oldValue: oldVal
8594      } : 0
8595    );
8596  }
8597}
8598function isRef(r) {
8599  return !!(r && r.__v_isRef === true);
8600}
8601function ref(value) {
8602  return createRef(value, false);
8603}
8604function shallowRef(value) {
8605  return createRef(value, true);
8606}
8607function createRef(rawValue, shallow) {
8608  if (isRef(rawValue)) {
8609    return rawValue;
8610  }
8611  return new RefImpl(rawValue, shallow);
8612}
8613class RefImpl {
8614  constructor(value, __v_isShallow) {
8615    this.__v_isShallow = __v_isShallow;
8616    this.dep = void 0;
8617    this.__v_isRef = true;
8618    this._rawValue = __v_isShallow ? value : toRaw(value);
8619    this._value = __v_isShallow ? value : toReactive(value);
8620  }
8621  get value() {
8622    trackRefValue(this);
8623    return this._value;
8624  }
8625  set value(newVal) {
8626    const useDirectValue = this.__v_isShallow || isShallow(newVal) || isReadonly(newVal);
8627    newVal = useDirectValue ? newVal : toRaw(newVal);
8628    if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.hasChanged)(newVal, this._rawValue)) {
8629      const oldVal = this._rawValue;
8630      this._rawValue = newVal;
8631      this._value = useDirectValue ? newVal : toReactive(newVal);
8632      triggerRefValue(this, 4, newVal, oldVal);
8633    }
8634  }
8635}
8636function triggerRef(ref2) {
8637  triggerRefValue(ref2, 4,  true ? ref2.value : 0);
8638}
8639function unref(ref2) {
8640  return isRef(ref2) ? ref2.value : ref2;
8641}
8642function toValue(source) {
8643  return (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isFunction)(source) ? source() : unref(source);
8644}
8645const shallowUnwrapHandlers = {
8646  get: (target, key, receiver) => unref(Reflect.get(target, key, receiver)),
8647  set: (target, key, value, receiver) => {
8648    const oldValue = target[key];
8649    if (isRef(oldValue) && !isRef(value)) {
8650      oldValue.value = value;
8651      return true;
8652    } else {
8653      return Reflect.set(target, key, value, receiver);
8654    }
8655  }
8656};
8657function proxyRefs(objectWithRefs) {
8658  return isReactive(objectWithRefs) ? objectWithRefs : new Proxy(objectWithRefs, shallowUnwrapHandlers);
8659}
8660class CustomRefImpl {
8661  constructor(factory) {
8662    this.dep = void 0;
8663    this.__v_isRef = true;
8664    const { get, set } = factory(
8665      () => trackRefValue(this),
8666      () => triggerRefValue(this)
8667    );
8668    this._get = get;
8669    this._set = set;
8670  }
8671  get value() {
8672    return this._get();
8673  }
8674  set value(newVal) {
8675    this._set(newVal);
8676  }
8677}
8678function customRef(factory) {
8679  return new CustomRefImpl(factory);
8680}
8681function toRefs(object) {
8682  if ( true && !isProxy(object)) {
8683    warn(`toRefs() expects a reactive object but received a plain one.`);
8684  }
8685  const ret = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isArray)(object) ? new Array(object.length) : {};
8686  for (const key in object) {
8687    ret[key] = propertyToRef(object, key);
8688  }
8689  return ret;
8690}
8691class ObjectRefImpl {
8692  constructor(_object, _key, _defaultValue) {
8693    this._object = _object;
8694    this._key = _key;
8695    this._defaultValue = _defaultValue;
8696    this.__v_isRef = true;
8697  }
8698  get value() {
8699    const val = this._object[this._key];
8700    return val === void 0 ? this._defaultValue : val;
8701  }
8702  set value(newVal) {
8703    this._object[this._key] = newVal;
8704  }
8705  get dep() {
8706    return getDepFromReactive(toRaw(this._object), this._key);
8707  }
8708}
8709class GetterRefImpl {
8710  constructor(_getter) {
8711    this._getter = _getter;
8712    this.__v_isRef = true;
8713    this.__v_isReadonly = true;
8714  }
8715  get value() {
8716    return this._getter();
8717  }
8718}
8719function toRef(source, key, defaultValue) {
8720  if (isRef(source)) {
8721    return source;
8722  } else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isFunction)(source)) {
8723    return new GetterRefImpl(source);
8724  } else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isObject)(source) && arguments.length > 1) {
8725    return propertyToRef(source, key, defaultValue);
8726  } else {
8727    return ref(source);
8728  }
8729}
8730function propertyToRef(source, key, defaultValue) {
8731  const val = source[key];
8732  return isRef(val) ? val : new ObjectRefImpl(source, key, defaultValue);
8733}
8734
8735const deferredComputed = computed;
8736
8737const TrackOpTypes = {
8738  "GET": "get",
8739  "HAS": "has",
8740  "ITERATE": "iterate"
8741};
8742const TriggerOpTypes = {
8743  "SET": "set",
8744  "ADD": "add",
8745  "DELETE": "delete",
8746  "CLEAR": "clear"
8747};
8748const ReactiveFlags = {
8749  "SKIP": "__v_skip",
8750  "IS_REACTIVE": "__v_isReactive",
8751  "IS_READONLY": "__v_isReadonly",
8752  "IS_SHALLOW": "__v_isShallow",
8753  "RAW": "__v_raw"
8754};
8755
8756
8757
8758
8759/***/ }),
8760
vendor: 274,590 bytes, lines 8761-17072
8761/***/ "./node_modules/@vue/runtime-core/dist/runtime-core.esm-bundler.js":
8762/*!*************************************************************************!*\
8763  !*** ./node_modules/@vue/runtime-core/dist/runtime-core.esm-bundler.js ***!
8764  \*************************************************************************/
8765/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
8766
8767"use strict";
8768__webpack_require__.r(__webpack_exports__);
8769/* harmony export */ __webpack_require__.d(__webpack_exports__, {
8770/* harmony export */   BaseTransition: function() { return /* binding */ BaseTransition; },
8771/* harmony export */   BaseTransitionPropsValidators: function() { return /* binding */ BaseTransitionPropsValidators; },
8772/* harmony export */   Comment: function() { return /* binding */ Comment; },
8773/* harmony export */   DeprecationTypes: function() { return /* binding */ DeprecationTypes; },
8774/* harmony export */   EffectScope: function() { return /* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.EffectScope; },
8775/* harmony export */   ErrorCodes: function() { return /* binding */ ErrorCodes; },
8776/* harmony export */   ErrorTypeStrings: function() { return /* binding */ ErrorTypeStrings; },
8777/* harmony export */   Fragment: function() { return /* binding */ Fragment; },
8778/* harmony export */   KeepAlive: function() { return /* binding */ KeepAlive; },
8779/* harmony export */   ReactiveEffect: function() { return /* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.ReactiveEffect; },
8780/* harmony export */   Static: function() { return /* binding */ Static; },
8781/* harmony export */   Suspense: function() { return /* binding */ Suspense; },
8782/* harmony export */   Teleport: function() { return /* binding */ Teleport; },
8783/* harmony export */   Text: function() { return /* binding */ Text; },
8784/* harmony export */   TrackOpTypes: function() { return /* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.TrackOpTypes; },
8785/* harmony export */   TriggerOpTypes: function() { return /* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.TriggerOpTypes; },
8786/* harmony export */   assertNumber: function() { return /* binding */ assertNumber; },
8787/* harmony export */   callWithAsyncErrorHandling: function() { return /* binding */ callWithAsyncErrorHandling; },
8788/* harmony export */   callWithErrorHandling: function() { return /* binding */ callWithErrorHandling; },
8789/* harmony export */   camelize: function() { return /* reexport safe */ _vue_shared__WEBPACK_IMPORTED_MODULE_1__.camelize; },
8790/* harmony export */   capitalize: function() { return /* reexport safe */ _vue_shared__WEBPACK_IMPORTED_MODULE_1__.capitalize; },
8791/* harmony export */   cloneVNode: function() { return /* binding */ cloneVNode; },
8792/* harmony export */   compatUtils: function() { return /* binding */ compatUtils; },
8793/* harmony export */   computed: function() { return /* binding */ computed; },
8794/* harmony export */   createBlock: function() { return /* binding */ createBlock; },
8795/* harmony export */   createCommentVNode: function() { return /* binding */ createCommentVNode; },
8796/* harmony export */   createElementBlock: function() { return /* binding */ createElementBlock; },
8797/* harmony export */   createElementVNode: function() { return /* binding */ createBaseVNode; },
8798/* harmony export */   createHydrationRenderer: function() { return /* binding */ createHydrationRenderer; },
8799/* harmony export */   createPropsRestProxy: function() { return /* binding */ createPropsRestProxy; },
8800/* harmony export */   createRenderer: function() { return /* binding */ createRenderer; },
8801/* harmony export */   createSlots: function() { return /* binding */ createSlots; },
8802/* harmony export */   createStaticVNode: function() { return /* binding */ createStaticVNode; },
8803/* harmony export */   createTextVNode: function() { return /* binding */ createTextVNode; },
8804/* harmony export */   createVNode: function() { return /* binding */ createVNode; },
8805/* harmony export */   customRef: function() { return /* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.customRef; },
8806/* harmony export */   defineAsyncComponent: function() { return /* binding */ defineAsyncComponent; },
8807/* harmony export */   defineComponent: function() { return /* binding */ defineComponent; },
8808/* harmony export */   defineEmits: function() { return /* binding */ defineEmits; },
8809/* harmony export */   defineExpose: function() { return /* binding */ defineExpose; },
8810/* harmony export */   defineModel: function() { return /* binding */ defineModel; },
8811/* harmony export */   defineOptions: function() { return /* binding */ defineOptions; },
8812/* harmony export */   defineProps: function() { return /* binding */ defineProps; },
8813/* harmony export */   defineSlots: function() { return /* binding */ defineSlots; },
8814/* harmony export */   devtools: function() { return /* binding */ devtools; },
8815/* harmony export */   effect: function() { return /* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.effect; },
8816/* harmony export */   effectScope: function() { return /* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.effectScope; },
8817/* harmony export */   getCurrentInstance: function() { return /* binding */ getCurrentInstance; },
8818/* harmony export */   getCurrentScope: function() { return /* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.getCurrentScope; },
8819/* harmony export */   getTransitionRawChildren: function() { return /* binding */ getTransitionRawChildren; },
8820/* harmony export */   guardReactiveProps: function() { return /* binding */ guardReactiveProps; },
8821/* harmony export */   h: function() { return /* binding */ h; },
8822/* harmony export */   handleError: function() { return /* binding */ handleError; },
8823/* harmony export */   hasInjectionContext: function() { return /* binding */ hasInjectionContext; },
8824/* harmony export */   initCustomFormatter: function() { return /* binding */ initCustomFormatter; },
8825/* harmony export */   inject: function() { return /* binding */ inject; },
8826/* harmony export */   isMemoSame: function() { return /* binding */ isMemoSame; },
8827/* harmony export */   isProxy: function() { return /* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isProxy; },
8828/* harmony export */   isReactive: function() { return /* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isReactive; },
8829/* harmony export */   isReadonly: function() { return /* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isReadonly; },
8830/* harmony export */   isRef: function() { return /* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isRef; },
8831/* harmony export */   isRuntimeOnly: function() { return /* binding */ isRuntimeOnly; },
8832/* harmony export */   isShallow: function() { return /* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isShallow; },
8833/* harmony export */   isVNode: function() { return /* binding */ isVNode; },
8834/* harmony export */   markRaw: function() { return /* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.markRaw; },
8835/* harmony export */   mergeDefaults: function() { return /* binding */ mergeDefaults; },
8836/* harmony export */   mergeModels: function() { return /* binding */ mergeModels; },
8837/* harmony export */   mergeProps: function() { return /* binding */ mergeProps; },
8838/* harmony export */   nextTick: function() { return /* binding */ nextTick; },
8839/* harmony export */   normalizeClass: function() { return /* reexport safe */ _vue_shared__WEBPACK_IMPORTED_MODULE_1__.normalizeClass; },
8840/* harmony export */   normalizeProps: function() { return /* reexport safe */ _vue_shared__WEBPACK_IMPORTED_MODULE_1__.normalizeProps; },
8841/* harmony export */   normalizeStyle: function() { return /* reexport safe */ _vue_shared__WEBPACK_IMPORTED_MODULE_1__.normalizeStyle; },
8842/* harmony export */   onActivated: function() { return /* binding */ onActivated; },
8843/* harmony export */   onBeforeMount: function() { return /* binding */ onBeforeMount; },
8844/* harmony export */   onBeforeUnmount: function() { return /* binding */ onBeforeUnmount; },
8845/* harmony export */   onBeforeUpdate: function() { return /* binding */ onBeforeUpdate; },
8846/* harmony export */   onDeactivated: function() { return /* binding */ onDeactivated; },
8847/* harmony export */   onErrorCaptured: function() { return /* binding */ onErrorCaptured; },
8848/* harmony export */   onMounted: function() { return /* binding */ onMounted; },
8849/* harmony export */   onRenderTracked: function() { return /* binding */ onRenderTracked; },
8850/* harmony export */   onRenderTriggered: function() { return /* binding */ onRenderTriggered; },
8851/* harmony export */   onScopeDispose: function() { return /* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.onScopeDispose; },
8852/* harmony export */   onServerPrefetch: function() { return /* binding */ onServerPrefetch; },
8853/* harmony export */   onUnmounted: function() { return /* binding */ onUnmounted; },
8854/* harmony export */   onUpdated: function() { return /* binding */ onUpdated; },
8855/* harmony export */   openBlock: function() { return /* binding */ openBlock; },
8856/* harmony export */   popScopeId: function() { return /* binding */ popScopeId; },
8857/* harmony export */   provide: function() { return /* binding */ provide; },
8858/* harmony export */   proxyRefs: function() { return /* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.proxyRefs; },
8859/* harmony export */   pushScopeId: function() { return /* binding */ pushScopeId; },
8860/* harmony export */   queuePostFlushCb: function() { return /* binding */ queuePostFlushCb; },
8861/* harmony export */   reactive: function() { return /* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.reactive; },
8862/* harmony export */   readonly: function() { return /* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.readonly; },
8863/* harmony export */   ref: function() { return /* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.ref; },
8864/* harmony export */   registerRuntimeCompiler: function() { return /* binding */ registerRuntimeCompiler; },
8865/* harmony export */   renderList: function() { return /* binding */ renderList; },
8866/* harmony export */   renderSlot: function() { return /* binding */ renderSlot; },
8867/* harmony export */   resolveComponent: function() { return /* binding */ resolveComponent; },
8868/* harmony export */   resolveDirective: function() { return /* binding */ resolveDirective; },
8869/* harmony export */   resolveDynamicComponent: function() { return /* binding */ resolveDynamicComponent; },
8870/* harmony export */   resolveFilter: function() { return /* binding */ resolveFilter; },
8871/* harmony export */   resolveTransitionHooks: function() { return /* binding */ resolveTransitionHooks; },
8872/* harmony export */   setBlockTracking: function() { return /* binding */ setBlockTracking; },
8873/* harmony export */   setDevtoolsHook: function() { return /* binding */ setDevtoolsHook; },
8874/* harmony export */   setTransitionHooks: function() { return /* binding */ setTransitionHooks; },
8875/* harmony export */   shallowReactive: function() { return /* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.shallowReactive; },
8876/* harmony export */   shallowReadonly: function() { return /* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.shallowReadonly; },
8877/* harmony export */   shallowRef: function() { return /* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.shallowRef; },
8878/* harmony export */   ssrContextKey: function() { return /* binding */ ssrContextKey; },
8879/* harmony export */   ssrUtils: function() { return /* binding */ ssrUtils; },
8880/* harmony export */   stop: function() { return /* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.stop; },
8881/* harmony export */   toDisplayString: function() { return /* reexport safe */ _vue_shared__WEBPACK_IMPORTED_MODULE_1__.toDisplayString; },
8882/* harmony export */   toHandlerKey: function() { return /* reexport safe */ _vue_shared__WEBPACK_IMPORTED_MODULE_1__.toHandlerKey; },
8883/* harmony export */   toHandlers: function() { return /* binding */ toHandlers; },
8884/* harmony export */   toRaw: function() { return /* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.toRaw; },
8885/* harmony export */   toRef: function() { return /* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.toRef; },
8886/* harmony export */   toRefs: function() { return /* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.toRefs; },
8887/* harmony export */   toValue: function() { return /* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.toValue; },
8888/* harmony export */   transformVNodeArgs: function() { return /* binding */ transformVNodeArgs; },
8889/* harmony export */   triggerRef: function() { return /* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.triggerRef; },
8890/* harmony export */   unref: function() { return /* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.unref; },
8891/* harmony export */   useAttrs: function() { return /* binding */ useAttrs; },
8892/* harmony export */   useModel: function() { return /* binding */ useModel; },
8893/* harmony export */   useSSRContext: function() { return /* binding */ useSSRContext; },
8894/* harmony export */   useSlots: function() { return /* binding */ useSlots; },
8895/* harmony export */   useTransitionState: function() { return /* binding */ useTransitionState; },
8896/* harmony export */   version: function() { return /* binding */ version; },
8897/* harmony export */   warn: function() { return /* binding */ warn; },
8898/* harmony export */   watch: function() { return /* binding */ watch; },
8899/* harmony export */   watchEffect: function() { return /* binding */ watchEffect; },
8900/* harmony export */   watchPostEffect: function() { return /* binding */ watchPostEffect; },
8901/* harmony export */   watchSyncEffect: function() { return /* binding */ watchSyncEffect; },
8902/* harmony export */   withAsyncContext: function() { return /* binding */ withAsyncContext; },
8903/* harmony export */   withCtx: function() { return /* binding */ withCtx; },
8904/* harmony export */   withDefaults: function() { return /* binding */ withDefaults; },
8905/* harmony export */   withDirectives: function() { return /* binding */ withDirectives; },
8906/* harmony export */   withMemo: function() { return /* binding */ withMemo; },
8907/* harmony export */   withScopeId: function() { return /* binding */ withScopeId; }
8908/* harmony export */ });
8909/* harmony import */ var _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @vue/reactivity */ "./node_modules/@vue/reactivity/dist/reactivity.esm-bundler.js");
8910/* harmony import */ var _vue_shared__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @vue/shared */ "./node_modules/@vue/shared/dist/shared.esm-bundler.js");
8911/**
8912* @vue/runtime-core v3.4.34
8913* (c) 2018-present Yuxi (Evan) You and Vue contributors
8914* @license MIT
8915**/
8916
8917
8918
8919
8920
8921const stack = [];
8922function pushWarningContext(vnode) {
8923  stack.push(vnode);
8924}
8925function popWarningContext() {
8926  stack.pop();
8927}
8928let isWarning = false;
8929function warn$1(msg, ...args) {
8930  if (isWarning) return;
8931  isWarning = true;
8932  (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.pauseTracking)();
8933  const instance = stack.length ? stack[stack.length - 1].component : null;
8934  const appWarnHandler = instance && instance.appContext.config.warnHandler;
8935  const trace = getComponentTrace();
8936  if (appWarnHandler) {
8937    callWithErrorHandling(
8938      appWarnHandler,
8939      instance,
8940      11,
8941      [
8942        // eslint-disable-next-line no-restricted-syntax
8943        msg + args.map((a) => {
8944          var _a, _b;
8945          return (_b = (_a = a.toString) == null ? void 0 : _a.call(a)) != null ? _b : JSON.stringify(a);
8946        }).join(""),
8947        instance && instance.proxy,
8948        trace.map(
8949          ({ vnode }) => `at <${formatComponentName(instance, vnode.type)}>`
8950        ).join("\n"),
8951        trace
8952      ]
8953    );
8954  } else {
8955    const warnArgs = [`[Vue warn]: ${msg}`, ...args];
8956    if (trace.length && // avoid spamming console during tests
8957    true) {
8958      warnArgs.push(`
8959`, ...formatTrace(trace));
8960    }
8961    console.warn(...warnArgs);
8962  }
8963  (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.resetTracking)();
8964  isWarning = false;
8965}
8966function getComponentTrace() {
8967  let currentVNode = stack[stack.length - 1];
8968  if (!currentVNode) {
8969    return [];
8970  }
8971  const normalizedStack = [];
8972  while (currentVNode) {
8973    const last = normalizedStack[0];
8974    if (last && last.vnode === currentVNode) {
8975      last.recurseCount++;
8976    } else {
8977      normalizedStack.push({
8978        vnode: currentVNode,
8979        recurseCount: 0
8980      });
8981    }
8982    const parentInstance = currentVNode.component && currentVNode.component.parent;
8983    currentVNode = parentInstance && parentInstance.vnode;
8984  }
8985  return normalizedStack;
8986}
8987function formatTrace(trace) {
8988  const logs = [];
8989  trace.forEach((entry, i) => {
8990    logs.push(...i === 0 ? [] : [`
8991`], ...formatTraceEntry(entry));
8992  });
8993  return logs;
8994}
8995function formatTraceEntry({ vnode, recurseCount }) {
8996  const postfix = recurseCount > 0 ? `... (${recurseCount} recursive calls)` : ``;
8997  const isRoot = vnode.component ? vnode.component.parent == null : false;
8998  const open = ` at <${formatComponentName(
8999    vnode.component,
9000    vnode.type,
9001    isRoot
9002  )}`;
9003  const close = `>` + postfix;
9004  return vnode.props ? [open, ...formatProps(vnode.props), close] : [open + close];
9005}
9006function formatProps(props) {
9007  const res = [];
9008  const keys = Object.keys(props);
9009  keys.slice(0, 3).forEach((key) => {
9010    res.push(...formatProp(key, props[key]));
9011  });
9012  if (keys.length > 3) {
9013    res.push(` ...`);
9014  }
9015  return res;
9016}
9017function formatProp(key, value, raw) {
9018  if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isString)(value)) {
9019    value = JSON.stringify(value);
9020    return raw ? value : [`${key}=${value}`];
9021  } else if (typeof value === "number" || typeof value === "boolean" || value == null) {
9022    return raw ? value : [`${key}=${value}`];
9023  } else if ((0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isRef)(value)) {
9024    value = formatProp(key, (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.toRaw)(value.value), true);
9025    return raw ? value : [`${key}=Ref<`, value, `>`];
9026  } else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(value)) {
9027    return [`${key}=fn${value.name ? `<${value.name}>` : ``}`];
9028  } else {
9029    value = (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.toRaw)(value);
9030    return raw ? value : [`${key}=`, value];
9031  }
9032}
9033function assertNumber(val, type) {
9034  if (false) {}
9035  if (val === void 0) {
9036    return;
9037  } else if (typeof val !== "number") {
9038    warn$1(`${type} is not a valid number - got ${JSON.stringify(val)}.`);
9039  } else if (isNaN(val)) {
9040    warn$1(`${type} is NaN - the duration expression might be incorrect.`);
9041  }
9042}
9043
9044const ErrorCodes = {
9045  "SETUP_FUNCTION": 0,
9046  "0": "SETUP_FUNCTION",
9047  "RENDER_FUNCTION": 1,
9048  "1": "RENDER_FUNCTION",
9049  "WATCH_GETTER": 2,
9050  "2": "WATCH_GETTER",
9051  "WATCH_CALLBACK": 3,
9052  "3": "WATCH_CALLBACK",
9053  "WATCH_CLEANUP": 4,
9054  "4": "WATCH_CLEANUP",
9055  "NATIVE_EVENT_HANDLER": 5,
9056  "5": "NATIVE_EVENT_HANDLER",
9057  "COMPONENT_EVENT_HANDLER": 6,
9058  "6": "COMPONENT_EVENT_HANDLER",
9059  "VNODE_HOOK": 7,
9060  "7": "VNODE_HOOK",
9061  "DIRECTIVE_HOOK": 8,
9062  "8": "DIRECTIVE_HOOK",
9063  "TRANSITION_HOOK": 9,
9064  "9": "TRANSITION_HOOK",
9065  "APP_ERROR_HANDLER": 10,
9066  "10": "APP_ERROR_HANDLER",
9067  "APP_WARN_HANDLER": 11,
9068  "11": "APP_WARN_HANDLER",
9069  "FUNCTION_REF": 12,
9070  "12": "FUNCTION_REF",
9071  "ASYNC_COMPONENT_LOADER": 13,
9072  "13": "ASYNC_COMPONENT_LOADER",
9073  "SCHEDULER": 14,
9074  "14": "SCHEDULER",
9075  "COMPONENT_UPDATE": 15,
9076  "15": "COMPONENT_UPDATE"
9077};
9078const ErrorTypeStrings$1 = {
9079  ["sp"]: "serverPrefetch hook",
9080  ["bc"]: "beforeCreate hook",
9081  ["c"]: "created hook",
9082  ["bm"]: "beforeMount hook",
9083  ["m"]: "mounted hook",
9084  ["bu"]: "beforeUpdate hook",
9085  ["u"]: "updated",
9086  ["bum"]: "beforeUnmount hook",
9087  ["um"]: "unmounted hook",
9088  ["a"]: "activated hook",
9089  ["da"]: "deactivated hook",
9090  ["ec"]: "errorCaptured hook",
9091  ["rtc"]: "renderTracked hook",
9092  ["rtg"]: "renderTriggered hook",
9093  [0]: "setup function",
9094  [1]: "render function",
9095  [2]: "watcher getter",
9096  [3]: "watcher callback",
9097  [4]: "watcher cleanup function",
9098  [5]: "native event handler",
9099  [6]: "component event handler",
9100  [7]: "vnode hook",
9101  [8]: "directive hook",
9102  [9]: "transition hook",
9103  [10]: "app errorHandler",
9104  [11]: "app warnHandler",
9105  [12]: "ref function",
9106  [13]: "async component loader",
9107  [14]: "scheduler flush",
9108  [15]: "component update"
9109};
9110function callWithErrorHandling(fn, instance, type, args) {
9111  try {
9112    return args ? fn(...args) : fn();
9113  } catch (err) {
9114    handleError(err, instance, type);
9115  }
9116}
9117function callWithAsyncErrorHandling(fn, instance, type, args) {
9118  if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(fn)) {
9119    const res = callWithErrorHandling(fn, instance, type, args);
9120    if (res && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isPromise)(res)) {
9121      res.catch((err) => {
9122        handleError(err, instance, type);
9123      });
9124    }
9125    return res;
9126  }
9127  if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(fn)) {
9128    const values = [];
9129    for (let i = 0; i < fn.length; i++) {
9130      values.push(callWithAsyncErrorHandling(fn[i], instance, type, args));
9131    }
9132    return values;
9133  } else if (true) {
9134    warn$1(
9135      `Invalid value type passed to callWithAsyncErrorHandling(): ${typeof fn}`
9136    );
9137  }
9138}
9139function handleError(err, instance, type, throwInDev = true) {
9140  const contextVNode = instance ? instance.vnode : null;
9141  if (instance) {
9142    let cur = instance.parent;
9143    const exposedInstance = instance.proxy;
9144    const errorInfo =  true ? ErrorTypeStrings$1[type] : 0;
9145    while (cur) {
9146      const errorCapturedHooks = cur.ec;
9147      if (errorCapturedHooks) {
9148        for (let i = 0; i < errorCapturedHooks.length; i++) {
9149          if (errorCapturedHooks[i](err, exposedInstance, errorInfo) === false) {
9150            return;
9151          }
9152        }
9153      }
9154      cur = cur.parent;
9155    }
9156    const appErrorHandler = instance.appContext.config.errorHandler;
9157    if (appErrorHandler) {
9158      (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.pauseTracking)();
9159      callWithErrorHandling(
9160        appErrorHandler,
9161        null,
9162        10,
9163        [err, exposedInstance, errorInfo]
9164      );
9165      (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.resetTracking)();
9166      return;
9167    }
9168  }
9169  logError(err, type, contextVNode, throwInDev);
9170}
9171function logError(err, type, contextVNode, throwInDev = true) {
9172  if (true) {
9173    const info = ErrorTypeStrings$1[type];
9174    if (contextVNode) {
9175      pushWarningContext(contextVNode);
9176    }
9177    warn$1(`Unhandled error${info ? ` during execution of ${info}` : ``}`);
9178    if (contextVNode) {
9179      popWarningContext();
9180    }
9181    if (throwInDev) {
9182      throw err;
9183    } else {
9184      console.error(err);
9185    }
9186  } else {}
9187}
9188
9189let isFlushing = false;
9190let isFlushPending = false;
9191const queue = [];
9192let flushIndex = 0;
9193const pendingPostFlushCbs = [];
9194let activePostFlushCbs = null;
9195let postFlushIndex = 0;
9196const resolvedPromise = /* @__PURE__ */ Promise.resolve();
9197let currentFlushPromise = null;
9198const RECURSION_LIMIT = 100;
9199function nextTick(fn) {
9200  const p = currentFlushPromise || resolvedPromise;
9201  return fn ? p.then(this ? fn.bind(this) : fn) : p;
9202}
9203function findInsertionIndex(id) {
9204  let start = flushIndex + 1;
9205  let end = queue.length;
9206  while (start < end) {
9207    const middle = start + end >>> 1;
9208    const middleJob = queue[middle];
9209    const middleJobId = getId(middleJob);
9210    if (middleJobId < id || middleJobId === id && middleJob.pre) {
9211      start = middle + 1;
9212    } else {
9213      end = middle;
9214    }
9215  }
9216  return start;
9217}
9218function queueJob(job) {
9219  if (!queue.length || !queue.includes(
9220    job,
9221    isFlushing && job.allowRecurse ? flushIndex + 1 : flushIndex
9222  )) {
9223    if (job.id == null) {
9224      queue.push(job);
9225    } else {
9226      queue.splice(findInsertionIndex(job.id), 0, job);
9227    }
9228    queueFlush();
9229  }
9230}
9231function queueFlush() {
9232  if (!isFlushing && !isFlushPending) {
9233    isFlushPending = true;
9234    currentFlushPromise = resolvedPromise.then(flushJobs);
9235  }
9236}
9237function invalidateJob(job) {
9238  const i = queue.indexOf(job);
9239  if (i > flushIndex) {
9240    queue.splice(i, 1);
9241  }
9242}
9243function queuePostFlushCb(cb) {
9244  if (!(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(cb)) {
9245    if (!activePostFlushCbs || !activePostFlushCbs.includes(
9246      cb,
9247      cb.allowRecurse ? postFlushIndex + 1 : postFlushIndex
9248    )) {
9249      pendingPostFlushCbs.push(cb);
9250    }
9251  } else {
9252    pendingPostFlushCbs.push(...cb);
9253  }
9254  queueFlush();
9255}
9256function flushPreFlushCbs(instance, seen, i = isFlushing ? flushIndex + 1 : 0) {
9257  if (true) {
9258    seen = seen || /* @__PURE__ */ new Map();
9259  }
9260  for (; i < queue.length; i++) {
9261    const cb = queue[i];
9262    if (cb && cb.pre) {
9263      if (instance && cb.id !== instance.uid) {
9264        continue;
9265      }
9266      if ( true && checkRecursiveUpdates(seen, cb)) {
9267        continue;
9268      }
9269      queue.splice(i, 1);
9270      i--;
9271      cb();
9272    }
9273  }
9274}
9275function flushPostFlushCbs(seen) {
9276  if (pendingPostFlushCbs.length) {
9277    const deduped = [...new Set(pendingPostFlushCbs)].sort(
9278      (a, b) => getId(a) - getId(b)
9279    );
9280    pendingPostFlushCbs.length = 0;
9281    if (activePostFlushCbs) {
9282      activePostFlushCbs.push(...deduped);
9283      return;
9284    }
9285    activePostFlushCbs = deduped;
9286    if (true) {
9287      seen = seen || /* @__PURE__ */ new Map();
9288    }
9289    for (postFlushIndex = 0; postFlushIndex < activePostFlushCbs.length; postFlushIndex++) {
9290      const cb = activePostFlushCbs[postFlushIndex];
9291      if ( true && checkRecursiveUpdates(seen, cb)) {
9292        continue;
9293      }
9294      if (cb.active !== false) cb();
9295    }
9296    activePostFlushCbs = null;
9297    postFlushIndex = 0;
9298  }
9299}
9300const getId = (job) => job.id == null ? Infinity : job.id;
9301const comparator = (a, b) => {
9302  const diff = getId(a) - getId(b);
9303  if (diff === 0) {
9304    if (a.pre && !b.pre) return -1;
9305    if (b.pre && !a.pre) return 1;
9306  }
9307  return diff;
9308};
9309function flushJobs(seen) {
9310  isFlushPending = false;
9311  isFlushing = true;
9312  if (true) {
9313    seen = seen || /* @__PURE__ */ new Map();
9314  }
9315  queue.sort(comparator);
9316  const check =  true ? (job) => checkRecursiveUpdates(seen, job) : 0;
9317  try {
9318    for (flushIndex = 0; flushIndex < queue.length; flushIndex++) {
9319      const job = queue[flushIndex];
9320      if (job && job.active !== false) {
9321        if ( true && check(job)) {
9322          continue;
9323        }
9324        callWithErrorHandling(
9325          job,
9326          job.i,
9327          job.i ? 15 : 14
9328        );
9329      }
9330    }
9331  } finally {
9332    flushIndex = 0;
9333    queue.length = 0;
9334    flushPostFlushCbs(seen);
9335    isFlushing = false;
9336    currentFlushPromise = null;
9337    if (queue.length || pendingPostFlushCbs.length) {
9338      flushJobs(seen);
9339    }
9340  }
9341}
9342function checkRecursiveUpdates(seen, fn) {
9343  if (!seen.has(fn)) {
9344    seen.set(fn, 1);
9345  } else {
9346    const count = seen.get(fn);
9347    if (count > RECURSION_LIMIT) {
9348      const instance = fn.i;
9349      const componentName = instance && getComponentName(instance.type);
9350      handleError(
9351        `Maximum recursive updates exceeded${componentName ? ` in component <${componentName}>` : ``}. This means you have a reactive effect that is mutating its own dependencies and thus recursively triggering itself. Possible sources include component template, render function, updated hook or watcher source function.`,
9352        null,
9353        10
9354      );
9355      return true;
9356    } else {
9357      seen.set(fn, count + 1);
9358    }
9359  }
9360}
9361
9362let isHmrUpdating = false;
9363const hmrDirtyComponents = /* @__PURE__ */ new Map();
9364if (true) {
9365  (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.getGlobalThis)().__VUE_HMR_RUNTIME__ = {
9366    createRecord: tryWrap(createRecord),
9367    rerender: tryWrap(rerender),
9368    reload: tryWrap(reload)
9369  };
9370}
9371const map = /* @__PURE__ */ new Map();
9372function registerHMR(instance) {
9373  const id = instance.type.__hmrId;
9374  let record = map.get(id);
9375  if (!record) {
9376    createRecord(id, instance.type);
9377    record = map.get(id);
9378  }
9379  record.instances.add(instance);
9380}
9381function unregisterHMR(instance) {
9382  map.get(instance.type.__hmrId).instances.delete(instance);
9383}
9384function createRecord(id, initialDef) {
9385  if (map.has(id)) {
9386    return false;
9387  }
9388  map.set(id, {
9389    initialDef: normalizeClassComponent(initialDef),
9390    instances: /* @__PURE__ */ new Set()
9391  });
9392  return true;
9393}
9394function normalizeClassComponent(component) {
9395  return isClassComponent(component) ? component.__vccOpts : component;
9396}
9397function rerender(id, newRender) {
9398  const record = map.get(id);
9399  if (!record) {
9400    return;
9401  }
9402  record.initialDef.render = newRender;
9403  [...record.instances].forEach((instance) => {
9404    if (newRender) {
9405      instance.render = newRender;
9406      normalizeClassComponent(instance.type).render = newRender;
9407    }
9408    instance.renderCache = [];
9409    isHmrUpdating = true;
9410    instance.effect.dirty = true;
9411    instance.update();
9412    isHmrUpdating = false;
9413  });
9414}
9415function reload(id, newComp) {
9416  const record = map.get(id);
9417  if (!record) return;
9418  newComp = normalizeClassComponent(newComp);
9419  updateComponentDef(record.initialDef, newComp);
9420  const instances = [...record.instances];
9421  for (let i = 0; i < instances.length; i++) {
9422    const instance = instances[i];
9423    const oldComp = normalizeClassComponent(instance.type);
9424    let dirtyInstances = hmrDirtyComponents.get(oldComp);
9425    if (!dirtyInstances) {
9426      if (oldComp !== record.initialDef) {
9427        updateComponentDef(oldComp, newComp);
9428      }
9429      hmrDirtyComponents.set(oldComp, dirtyInstances = /* @__PURE__ */ new Set());
9430    }
9431    dirtyInstances.add(instance);
9432    instance.appContext.propsCache.delete(instance.type);
9433    instance.appContext.emitsCache.delete(instance.type);
9434    instance.appContext.optionsCache.delete(instance.type);
9435    if (instance.ceReload) {
9436      dirtyInstances.add(instance);
9437      instance.ceReload(newComp.styles);
9438      dirtyInstances.delete(instance);
9439    } else if (instance.parent) {
9440      instance.parent.effect.dirty = true;
9441      queueJob(() => {
9442        instance.parent.update();
9443        dirtyInstances.delete(instance);
9444      });
9445    } else if (instance.appContext.reload) {
9446      instance.appContext.reload();
9447    } else if (typeof window !== "undefined") {
9448      window.location.reload();
9449    } else {
9450      console.warn(
9451        "[HMR] Root or manually mounted instance modified. Full reload required."
9452      );
9453    }
9454  }
9455  queuePostFlushCb(() => {
9456    hmrDirtyComponents.clear();
9457  });
9458}
9459function updateComponentDef(oldComp, newComp) {
9460  (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)(oldComp, newComp);
9461  for (const key in oldComp) {
9462    if (key !== "__file" && !(key in newComp)) {
9463      delete oldComp[key];
9464    }
9465  }
9466}
9467function tryWrap(fn) {
9468  return (id, arg) => {
9469    try {
9470      return fn(id, arg);
9471    } catch (e) {
9472      console.error(e);
9473      console.warn(
9474        `[HMR] Something went wrong during Vue component hot-reload. Full reload required.`
9475      );
9476    }
9477  };
9478}
9479
9480let devtools$1;
9481let buffer = [];
9482let devtoolsNotInstalled = false;
9483function emit$1(event, ...args) {
9484  if (devtools$1) {
9485    devtools$1.emit(event, ...args);
9486  } else if (!devtoolsNotInstalled) {
9487    buffer.push({ event, args });
9488  }
9489}
9490function setDevtoolsHook$1(hook, target) {
9491  var _a, _b;
9492  devtools$1 = hook;
9493  if (devtools$1) {
9494    devtools$1.enabled = true;
9495    buffer.forEach(({ event, args }) => devtools$1.emit(event, ...args));
9496    buffer = [];
9497  } else if (
9498    // handle late devtools injection - only do this if we are in an actual
9499    // browser environment to avoid the timer handle stalling test runner exit
9500    // (#4815)
9501    typeof window !== "undefined" && // some envs mock window but not fully
9502    window.HTMLElement && // also exclude jsdom
9503    // eslint-disable-next-line no-restricted-syntax
9504    !((_b = (_a = window.navigator) == null ? void 0 : _a.userAgent) == null ? void 0 : _b.includes("jsdom"))
9505  ) {
9506    const replay = target.__VUE_DEVTOOLS_HOOK_REPLAY__ = target.__VUE_DEVTOOLS_HOOK_REPLAY__ || [];
9507    replay.push((newHook) => {
9508      setDevtoolsHook$1(newHook, target);
9509    });
9510    setTimeout(() => {
9511      if (!devtools$1) {
9512        target.__VUE_DEVTOOLS_HOOK_REPLAY__ = null;
9513        devtoolsNotInstalled = true;
9514        buffer = [];
9515      }
9516    }, 3e3);
9517  } else {
9518    devtoolsNotInstalled = true;
9519    buffer = [];
9520  }
9521}
9522function devtoolsInitApp(app, version) {
9523  emit$1("app:init" /* APP_INIT */, app, version, {
9524    Fragment,
9525    Text,
9526    Comment,
9527    Static
9528  });
9529}
9530function devtoolsUnmountApp(app) {
9531  emit$1("app:unmount" /* APP_UNMOUNT */, app);
9532}
9533const devtoolsComponentAdded = /* @__PURE__ */ createDevtoolsComponentHook(
9534  "component:added" /* COMPONENT_ADDED */
9535);
9536const devtoolsComponentUpdated = /* @__PURE__ */ createDevtoolsComponentHook("component:updated" /* COMPONENT_UPDATED */);
9537const _devtoolsComponentRemoved = /* @__PURE__ */ createDevtoolsComponentHook(
9538  "component:removed" /* COMPONENT_REMOVED */
9539);
9540const devtoolsComponentRemoved = (component) => {
9541  if (devtools$1 && typeof devtools$1.cleanupBuffer === "function" && // remove the component if it wasn't buffered
9542  !devtools$1.cleanupBuffer(component)) {
9543    _devtoolsComponentRemoved(component);
9544  }
9545};
9546/*! #__NO_SIDE_EFFECTS__ */
9547// @__NO_SIDE_EFFECTS__
9548function createDevtoolsComponentHook(hook) {
9549  return (component) => {
9550    emit$1(
9551      hook,
9552      component.appContext.app,
9553      component.uid,
9554      component.parent ? component.parent.uid : void 0,
9555      component
9556    );
9557  };
9558}
9559const devtoolsPerfStart = /* @__PURE__ */ createDevtoolsPerformanceHook(
9560  "perf:start" /* PERFORMANCE_START */
9561);
9562const devtoolsPerfEnd = /* @__PURE__ */ createDevtoolsPerformanceHook(
9563  "perf:end" /* PERFORMANCE_END */
9564);
9565function createDevtoolsPerformanceHook(hook) {
9566  return (component, type, time) => {
9567    emit$1(hook, component.appContext.app, component.uid, component, type, time);
9568  };
9569}
9570function devtoolsComponentEmit(component, event, params) {
9571  emit$1(
9572    "component:emit" /* COMPONENT_EMIT */,
9573    component.appContext.app,
9574    component,
9575    event,
9576    params
9577  );
9578}
9579
9580let currentRenderingInstance = null;
9581let currentScopeId = null;
9582function setCurrentRenderingInstance(instance) {
9583  const prev = currentRenderingInstance;
9584  currentRenderingInstance = instance;
9585  currentScopeId = instance && instance.type.__scopeId || null;
9586  return prev;
9587}
9588function pushScopeId(id) {
9589  currentScopeId = id;
9590}
9591function popScopeId() {
9592  currentScopeId = null;
9593}
9594const withScopeId = (_id) => withCtx;
9595function withCtx(fn, ctx = currentRenderingInstance, isNonScopedSlot) {
9596  if (!ctx) return fn;
9597  if (fn._n) {
9598    return fn;
9599  }
9600  const renderFnWithContext = (...args) => {
9601    if (renderFnWithContext._d) {
9602      setBlockTracking(-1);
9603    }
9604    const prevInstance = setCurrentRenderingInstance(ctx);
9605    let res;
9606    try {
9607      res = fn(...args);
9608    } finally {
9609      setCurrentRenderingInstance(prevInstance);
9610      if (renderFnWithContext._d) {
9611        setBlockTracking(1);
9612      }
9613    }
9614    if (true) {
9615      devtoolsComponentUpdated(ctx);
9616    }
9617    return res;
9618  };
9619  renderFnWithContext._n = true;
9620  renderFnWithContext._c = true;
9621  renderFnWithContext._d = true;
9622  return renderFnWithContext;
9623}
9624
9625function validateDirectiveName(name) {
9626  if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isBuiltInDirective)(name)) {
9627    warn$1("Do not use built-in directive ids as custom directive id: " + name);
9628  }
9629}
9630function withDirectives(vnode, directives) {
9631  if (currentRenderingInstance === null) {
9632     true && warn$1(`withDirectives can only be used inside render functions.`);
9633    return vnode;
9634  }
9635  const instance = getComponentPublicInstance(currentRenderingInstance);
9636  const bindings = vnode.dirs || (vnode.dirs = []);
9637  for (let i = 0; i < directives.length; i++) {
9638    let [dir, value, arg, modifiers = _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ] = directives[i];
9639    if (dir) {
9640      if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(dir)) {
9641        dir = {
9642          mounted: dir,
9643          updated: dir
9644        };
9645      }
9646      if (dir.deep) {
9647        traverse(value);
9648      }
9649      bindings.push({
9650        dir,
9651        instance,
9652        value,
9653        oldValue: void 0,
9654        arg,
9655        modifiers
9656      });
9657    }
9658  }
9659  return vnode;
9660}
9661function invokeDirectiveHook(vnode, prevVNode, instance, name) {
9662  const bindings = vnode.dirs;
9663  const oldBindings = prevVNode && prevVNode.dirs;
9664  for (let i = 0; i < bindings.length; i++) {
9665    const binding = bindings[i];
9666    if (oldBindings) {
9667      binding.oldValue = oldBindings[i].value;
9668    }
9669    let hook = binding.dir[name];
9670    if (hook) {
9671      (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.pauseTracking)();
9672      callWithAsyncErrorHandling(hook, instance, 8, [
9673        vnode.el,
9674        binding,
9675        vnode,
9676        prevVNode
9677      ]);
9678      (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.resetTracking)();
9679    }
9680  }
9681}
9682
9683const leaveCbKey = Symbol("_leaveCb");
9684const enterCbKey = Symbol("_enterCb");
9685function useTransitionState() {
9686  const state = {
9687    isMounted: false,
9688    isLeaving: false,
9689    isUnmounting: false,
9690    leavingVNodes: /* @__PURE__ */ new Map()
9691  };
9692  onMounted(() => {
9693    state.isMounted = true;
9694  });
9695  onBeforeUnmount(() => {
9696    state.isUnmounting = true;
9697  });
9698  return state;
9699}
9700const TransitionHookValidator = [Function, Array];
9701const BaseTransitionPropsValidators = {
9702  mode: String,
9703  appear: Boolean,
9704  persisted: Boolean,
9705  // enter
9706  onBeforeEnter: TransitionHookValidator,
9707  onEnter: TransitionHookValidator,
9708  onAfterEnter: TransitionHookValidator,
9709  onEnterCancelled: TransitionHookValidator,
9710  // leave
9711  onBeforeLeave: TransitionHookValidator,
9712  onLeave: TransitionHookValidator,
9713  onAfterLeave: TransitionHookValidator,
9714  onLeaveCancelled: TransitionHookValidator,
9715  // appear
9716  onBeforeAppear: TransitionHookValidator,
9717  onAppear: TransitionHookValidator,
9718  onAfterAppear: TransitionHookValidator,
9719  onAppearCancelled: TransitionHookValidator
9720};
9721const recursiveGetSubtree = (instance) => {
9722  const subTree = instance.subTree;
9723  return subTree.component ? recursiveGetSubtree(subTree.component) : subTree;
9724};
9725const BaseTransitionImpl = {
9726  name: `BaseTransition`,
9727  props: BaseTransitionPropsValidators,
9728  setup(props, { slots }) {
9729    const instance = getCurrentInstance();
9730    const state = useTransitionState();
9731    return () => {
9732      const children = slots.default && getTransitionRawChildren(slots.default(), true);
9733      if (!children || !children.length) {
9734        return;
9735      }
9736      let child = children[0];
9737      if (children.length > 1) {
9738        let hasFound = false;
9739        for (const c of children) {
9740          if (c.type !== Comment) {
9741            if ( true && hasFound) {
9742              warn$1(
9743                "<transition> can only be used on a single element or component. Use <transition-group> for lists."
9744              );
9745              break;
9746            }
9747            child = c;
9748            hasFound = true;
9749            if (false) {}
9750          }
9751        }
9752      }
9753      const rawProps = (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.toRaw)(props);
9754      const { mode } = rawProps;
9755      if ( true && mode && mode !== "in-out" && mode !== "out-in" && mode !== "default") {
9756        warn$1(`invalid <transition> mode: ${mode}`);
9757      }
9758      if (state.isLeaving) {
9759        return emptyPlaceholder(child);
9760      }
9761      const innerChild = getKeepAliveChild(child);
9762      if (!innerChild) {
9763        return emptyPlaceholder(child);
9764      }
9765      let enterHooks = resolveTransitionHooks(
9766        innerChild,
9767        rawProps,
9768        state,
9769        instance,
9770        // #11061, ensure enterHooks is fresh after clone
9771        (hooks) => enterHooks = hooks
9772      );
9773      setTransitionHooks(innerChild, enterHooks);
9774      const oldChild = instance.subTree;
9775      const oldInnerChild = oldChild && getKeepAliveChild(oldChild);
9776      if (oldInnerChild && oldInnerChild.type !== Comment && !isSameVNodeType(innerChild, oldInnerChild) && recursiveGetSubtree(instance).type !== Comment) {
9777        const leavingHooks = resolveTransitionHooks(
9778          oldInnerChild,
9779          rawProps,
9780          state,
9781          instance
9782        );
9783        setTransitionHooks(oldInnerChild, leavingHooks);
9784        if (mode === "out-in" && innerChild.type !== Comment) {
9785          state.isLeaving = true;
9786          leavingHooks.afterLeave = () => {
9787            state.isLeaving = false;
9788            if (instance.update.active !== false) {
9789              instance.effect.dirty = true;
9790              instance.update();
9791            }
9792          };
9793          return emptyPlaceholder(child);
9794        } else if (mode === "in-out" && innerChild.type !== Comment) {
9795          leavingHooks.delayLeave = (el, earlyRemove, delayedLeave) => {
9796            const leavingVNodesCache = getLeavingNodesForType(
9797              state,
9798              oldInnerChild
9799            );
9800            leavingVNodesCache[String(oldInnerChild.key)] = oldInnerChild;
9801            el[leaveCbKey] = () => {
9802              earlyRemove();
9803              el[leaveCbKey] = void 0;
9804              delete enterHooks.delayedLeave;
9805            };
9806            enterHooks.delayedLeave = delayedLeave;
9807          };
9808        }
9809      }
9810      return child;
9811    };
9812  }
9813};
9814const BaseTransition = BaseTransitionImpl;
9815function getLeavingNodesForType(state, vnode) {
9816  const { leavingVNodes } = state;
9817  let leavingVNodesCache = leavingVNodes.get(vnode.type);
9818  if (!leavingVNodesCache) {
9819    leavingVNodesCache = /* @__PURE__ */ Object.create(null);
9820    leavingVNodes.set(vnode.type, leavingVNodesCache);
9821  }
9822  return leavingVNodesCache;
9823}
9824function resolveTransitionHooks(vnode, props, state, instance, postClone) {
9825  const {
9826    appear,
9827    mode,
9828    persisted = false,
9829    onBeforeEnter,
9830    onEnter,
9831    onAfterEnter,
9832    onEnterCancelled,
9833    onBeforeLeave,
9834    onLeave,
9835    onAfterLeave,
9836    onLeaveCancelled,
9837    onBeforeAppear,
9838    onAppear,
9839    onAfterAppear,
9840    onAppearCancelled
9841  } = props;
9842  const key = String(vnode.key);
9843  const leavingVNodesCache = getLeavingNodesForType(state, vnode);
9844  const callHook = (hook, args) => {
9845    hook && callWithAsyncErrorHandling(
9846      hook,
9847      instance,
9848      9,
9849      args
9850    );
9851  };
9852  const callAsyncHook = (hook, args) => {
9853    const done = args[1];
9854    callHook(hook, args);
9855    if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(hook)) {
9856      if (hook.every((hook2) => hook2.length <= 1)) done();
9857    } else if (hook.length <= 1) {
9858      done();
9859    }
9860  };
9861  const hooks = {
9862    mode,
9863    persisted,
9864    beforeEnter(el) {
9865      let hook = onBeforeEnter;
9866      if (!state.isMounted) {
9867        if (appear) {
9868          hook = onBeforeAppear || onBeforeEnter;
9869        } else {
9870          return;
9871        }
9872      }
9873      if (el[leaveCbKey]) {
9874        el[leaveCbKey](
9875          true
9876          /* cancelled */
9877        );
9878      }
9879      const leavingVNode = leavingVNodesCache[key];
9880      if (leavingVNode && isSameVNodeType(vnode, leavingVNode) && leavingVNode.el[leaveCbKey]) {
9881        leavingVNode.el[leaveCbKey]();
9882      }
9883      callHook(hook, [el]);
9884    },
9885    enter(el) {
9886      let hook = onEnter;
9887      let afterHook = onAfterEnter;
9888      let cancelHook = onEnterCancelled;
9889      if (!state.isMounted) {
9890        if (appear) {
9891          hook = onAppear || onEnter;
9892          afterHook = onAfterAppear || onAfterEnter;
9893          cancelHook = onAppearCancelled || onEnterCancelled;
9894        } else {
9895          return;
9896        }
9897      }
9898      let called = false;
9899      const done = el[enterCbKey] = (cancelled) => {
9900        if (called) return;
9901        called = true;
9902        if (cancelled) {
9903          callHook(cancelHook, [el]);
9904        } else {
9905          callHook(afterHook, [el]);
9906        }
9907        if (hooks.delayedLeave) {
9908          hooks.delayedLeave();
9909        }
9910        el[enterCbKey] = void 0;
9911      };
9912      if (hook) {
9913        callAsyncHook(hook, [el, done]);
9914      } else {
9915        done();
9916      }
9917    },
9918    leave(el, remove) {
9919      const key2 = String(vnode.key);
9920      if (el[enterCbKey]) {
9921        el[enterCbKey](
9922          true
9923          /* cancelled */
9924        );
9925      }
9926      if (state.isUnmounting) {
9927        return remove();
9928      }
9929      callHook(onBeforeLeave, [el]);
9930      let called = false;
9931      const done = el[leaveCbKey] = (cancelled) => {
9932        if (called) return;
9933        called = true;
9934        remove();
9935        if (cancelled) {
9936          callHook(onLeaveCancelled, [el]);
9937        } else {
9938          callHook(onAfterLeave, [el]);
9939        }
9940        el[leaveCbKey] = void 0;
9941        if (leavingVNodesCache[key2] === vnode) {
9942          delete leavingVNodesCache[key2];
9943        }
9944      };
9945      leavingVNodesCache[key2] = vnode;
9946      if (onLeave) {
9947        callAsyncHook(onLeave, [el, done]);
9948      } else {
9949        done();
9950      }
9951    },
9952    clone(vnode2) {
9953      const hooks2 = resolveTransitionHooks(
9954        vnode2,
9955        props,
9956        state,
9957        instance,
9958        postClone
9959      );
9960      if (postClone) postClone(hooks2);
9961      return hooks2;
9962    }
9963  };
9964  return hooks;
9965}
9966function emptyPlaceholder(vnode) {
9967  if (isKeepAlive(vnode)) {
9968    vnode = cloneVNode(vnode);
9969    vnode.children = null;
9970    return vnode;
9971  }
9972}
9973function getKeepAliveChild(vnode) {
9974  if (!isKeepAlive(vnode)) {
9975    return vnode;
9976  }
9977  if ( true && vnode.component) {
9978    return vnode.component.subTree;
9979  }
9980  const { shapeFlag, children } = vnode;
9981  if (children) {
9982    if (shapeFlag & 16) {
9983      return children[0];
9984    }
9985    if (shapeFlag & 32 && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(children.default)) {
9986      return children.default();
9987    }
9988  }
9989}
9990function setTransitionHooks(vnode, hooks) {
9991  if (vnode.shapeFlag & 6 && vnode.component) {
9992    setTransitionHooks(vnode.component.subTree, hooks);
9993  } else if (vnode.shapeFlag & 128) {
9994    vnode.ssContent.transition = hooks.clone(vnode.ssContent);
9995    vnode.ssFallback.transition = hooks.clone(vnode.ssFallback);
9996  } else {
9997    vnode.transition = hooks;
9998  }
9999}
10000function getTransitionRawChildren(children, keepComment = false, parentKey) {
10001  let ret = [];
10002  let keyedFragmentCount = 0;
10003  for (let i = 0; i < children.length; i++) {
10004    let child = children[i];
10005    const key = parentKey == null ? child.key : String(parentKey) + String(child.key != null ? child.key : i);
10006    if (child.type === Fragment) {
10007      if (child.patchFlag & 128) keyedFragmentCount++;
10008      ret = ret.concat(
10009        getTransitionRawChildren(child.children, keepComment, key)
10010      );
10011    } else if (keepComment || child.type !== Comment) {
10012      ret.push(key != null ? cloneVNode(child, { key }) : child);
10013    }
10014  }
10015  if (keyedFragmentCount > 1) {
10016    for (let i = 0; i < ret.length; i++) {
10017      ret[i].patchFlag = -2;
10018    }
10019  }
10020  return ret;
10021}
10022
10023/*! #__NO_SIDE_EFFECTS__ */
10024// @__NO_SIDE_EFFECTS__
10025function defineComponent(options, extraOptions) {
10026  return (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(options) ? (
10027    // #8326: extend call and options.name access are considered side-effects
10028    // by Rollup, so we have to wrap it in a pure-annotated IIFE.
10029    /* @__PURE__ */ (() => (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)({ name: options.name }, extraOptions, { setup: options }))()
10030  ) : options;
10031}
10032
10033const isAsyncWrapper = (i) => !!i.type.__asyncLoader;
10034/*! #__NO_SIDE_EFFECTS__ */
10035// @__NO_SIDE_EFFECTS__
10036function defineAsyncComponent(source) {
10037  if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(source)) {
10038    source = { loader: source };
10039  }
10040  const {
10041    loader,
10042    loadingComponent,
10043    errorComponent,
10044    delay = 200,
10045    timeout,
10046    // undefined = never times out
10047    suspensible = true,
10048    onError: userOnError
10049  } = source;
10050  let pendingRequest = null;
10051  let resolvedComp;
10052  let retries = 0;
10053  const retry = () => {
10054    retries++;
10055    pendingRequest = null;
10056    return load();
10057  };
10058  const load = () => {
10059    let thisRequest;
10060    return pendingRequest || (thisRequest = pendingRequest = loader().catch((err) => {
10061      err = err instanceof Error ? err : new Error(String(err));
10062      if (userOnError) {
10063        return new Promise((resolve, reject) => {
10064          const userRetry = () => resolve(retry());
10065          const userFail = () => reject(err);
10066          userOnError(err, userRetry, userFail, retries + 1);
10067        });
10068      } else {
10069        throw err;
10070      }
10071    }).then((comp) => {
10072      if (thisRequest !== pendingRequest && pendingRequest) {
10073        return pendingRequest;
10074      }
10075      if ( true && !comp) {
10076        warn$1(
10077          `Async component loader resolved to undefined. If you are using retry(), make sure to return its return value.`
10078        );
10079      }
10080      if (comp && (comp.__esModule || comp[Symbol.toStringTag] === "Module")) {
10081        comp = comp.default;
10082      }
10083      if ( true && comp && !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isObject)(comp) && !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(comp)) {
10084        throw new Error(`Invalid async component load result: ${comp}`);
10085      }
10086      resolvedComp = comp;
10087      return comp;
10088    }));
10089  };
10090  return defineComponent({
10091    name: "AsyncComponentWrapper",
10092    __asyncLoader: load,
10093    get __asyncResolved() {
10094      return resolvedComp;
10095    },
10096    setup() {
10097      const instance = currentInstance;
10098      if (resolvedComp) {
10099        return () => createInnerComp(resolvedComp, instance);
10100      }
10101      const onError = (err) => {
10102        pendingRequest = null;
10103        handleError(
10104          err,
10105          instance,
10106          13,
10107          !errorComponent
10108        );
10109      };
10110      if (suspensible && instance.suspense || isInSSRComponentSetup) {
10111        return load().then((comp) => {
10112          return () => createInnerComp(comp, instance);
10113        }).catch((err) => {
10114          onError(err);
10115          return () => errorComponent ? createVNode(errorComponent, {
10116            error: err
10117          }) : null;
10118        });
10119      }
10120      const loaded = (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.ref)(false);
10121      const error = (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.ref)();
10122      const delayed = (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.ref)(!!delay);
10123      if (delay) {
10124        setTimeout(() => {
10125          delayed.value = false;
10126        }, delay);
10127      }
10128      if (timeout != null) {
10129        setTimeout(() => {
10130          if (!loaded.value && !error.value) {
10131            const err = new Error(
10132              `Async component timed out after ${timeout}ms.`
10133            );
10134            onError(err);
10135            error.value = err;
10136          }
10137        }, timeout);
10138      }
10139      load().then(() => {
10140        loaded.value = true;
10141        if (instance.parent && isKeepAlive(instance.parent.vnode)) {
10142          instance.parent.effect.dirty = true;
10143          queueJob(instance.parent.update);
10144        }
10145      }).catch((err) => {
10146        onError(err);
10147        error.value = err;
10148      });
10149      return () => {
10150        if (loaded.value && resolvedComp) {
10151          return createInnerComp(resolvedComp, instance);
10152        } else if (error.value && errorComponent) {
10153          return createVNode(errorComponent, {
10154            error: error.value
10155          });
10156        } else if (loadingComponent && !delayed.value) {
10157          return createVNode(loadingComponent);
10158        }
10159      };
10160    }
10161  });
10162}
10163function createInnerComp(comp, parent) {
10164  const { ref: ref2, props, children, ce } = parent.vnode;
10165  const vnode = createVNode(comp, props, children);
10166  vnode.ref = ref2;
10167  vnode.ce = ce;
10168  delete parent.vnode.ce;
10169  return vnode;
10170}
10171
10172const isKeepAlive = (vnode) => vnode.type.__isKeepAlive;
10173const KeepAliveImpl = {
10174  name: `KeepAlive`,
10175  // Marker for special handling inside the renderer. We are not using a ===
10176  // check directly on KeepAlive in the renderer, because importing it directly
10177  // would prevent it from being tree-shaken.
10178  __isKeepAlive: true,
10179  props: {
10180    include: [String, RegExp, Array],
10181    exclude: [String, RegExp, Array],
10182    max: [String, Number]
10183  },
10184  setup(props, { slots }) {
10185    const instance = getCurrentInstance();
10186    const sharedContext = instance.ctx;
10187    if (!sharedContext.renderer) {
10188      return () => {
10189        const children = slots.default && slots.default();
10190        return children && children.length === 1 ? children[0] : children;
10191      };
10192    }
10193    const cache = /* @__PURE__ */ new Map();
10194    const keys = /* @__PURE__ */ new Set();
10195    let current = null;
10196    if (true) {
10197      instance.__v_cache = cache;
10198    }
10199    const parentSuspense = instance.suspense;
10200    const {
10201      renderer: {
10202        p: patch,
10203        m: move,
10204        um: _unmount,
10205        o: { createElement }
10206      }
10207    } = sharedContext;
10208    const storageContainer = createElement("div");
10209    sharedContext.activate = (vnode, container, anchor, namespace, optimized) => {
10210      const instance2 = vnode.component;
10211      move(vnode, container, anchor, 0, parentSuspense);
10212      patch(
10213        instance2.vnode,
10214        vnode,
10215        container,
10216        anchor,
10217        instance2,
10218        parentSuspense,
10219        namespace,
10220        vnode.slotScopeIds,
10221        optimized
10222      );
10223      queuePostRenderEffect(() => {
10224        instance2.isDeactivated = false;
10225        if (instance2.a) {
10226          (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.invokeArrayFns)(instance2.a);
10227        }
10228        const vnodeHook = vnode.props && vnode.props.onVnodeMounted;
10229        if (vnodeHook) {
10230          invokeVNodeHook(vnodeHook, instance2.parent, vnode);
10231        }
10232      }, parentSuspense);
10233      if (true) {
10234        devtoolsComponentAdded(instance2);
10235      }
10236    };
10237    sharedContext.deactivate = (vnode) => {
10238      const instance2 = vnode.component;
10239      invalidateMount(instance2.m);
10240      invalidateMount(instance2.a);
10241      move(vnode, storageContainer, null, 1, parentSuspense);
10242      queuePostRenderEffect(() => {
10243        if (instance2.da) {
10244          (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.invokeArrayFns)(instance2.da);
10245        }
10246        const vnodeHook = vnode.props && vnode.props.onVnodeUnmounted;
10247        if (vnodeHook) {
10248          invokeVNodeHook(vnodeHook, instance2.parent, vnode);
10249        }
10250        instance2.isDeactivated = true;
10251      }, parentSuspense);
10252      if (true) {
10253        devtoolsComponentAdded(instance2);
10254      }
10255    };
10256    function unmount(vnode) {
10257      resetShapeFlag(vnode);
10258      _unmount(vnode, instance, parentSuspense, true);
10259    }
10260    function pruneCache(filter) {
10261      cache.forEach((vnode, key) => {
10262        const name = getComponentName(vnode.type);
10263        if (name && (!filter || !filter(name))) {
10264          pruneCacheEntry(key);
10265        }
10266      });
10267    }
10268    function pruneCacheEntry(key) {
10269      const cached = cache.get(key);
10270      if (!current || !isSameVNodeType(cached, current)) {
10271        unmount(cached);
10272      } else if (current) {
10273        resetShapeFlag(current);
10274      }
10275      cache.delete(key);
10276      keys.delete(key);
10277    }
10278    watch(
10279      () => [props.include, props.exclude],
10280      ([include, exclude]) => {
10281        include && pruneCache((name) => matches(include, name));
10282        exclude && pruneCache((name) => !matches(exclude, name));
10283      },
10284      // prune post-render after `current` has been updated
10285      { flush: "post", deep: true }
10286    );
10287    let pendingCacheKey = null;
10288    const cacheSubtree = () => {
10289      if (pendingCacheKey != null) {
10290        if (isSuspense(instance.subTree.type)) {
10291          queuePostRenderEffect(() => {
10292            cache.set(pendingCacheKey, getInnerChild(instance.subTree));
10293          }, instance.subTree.suspense);
10294        } else {
10295          cache.set(pendingCacheKey, getInnerChild(instance.subTree));
10296        }
10297      }
10298    };
10299    onMounted(cacheSubtree);
10300    onUpdated(cacheSubtree);
10301    onBeforeUnmount(() => {
10302      cache.forEach((cached) => {
10303        const { subTree, suspense } = instance;
10304        const vnode = getInnerChild(subTree);
10305        if (cached.type === vnode.type && cached.key === vnode.key) {
10306          resetShapeFlag(vnode);
10307          const da = vnode.component.da;
10308          da && queuePostRenderEffect(da, suspense);
10309          return;
10310        }
10311        unmount(cached);
10312      });
10313    });
10314    return () => {
10315      pendingCacheKey = null;
10316      if (!slots.default) {
10317        return null;
10318      }
10319      const children = slots.default();
10320      const rawVNode = children[0];
10321      if (children.length > 1) {
10322        if (true) {
10323          warn$1(`KeepAlive should contain exactly one component child.`);
10324        }
10325        current = null;
10326        return children;
10327      } else if (!isVNode(rawVNode) || !(rawVNode.shapeFlag & 4) && !(rawVNode.shapeFlag & 128)) {
10328        current = null;
10329        return rawVNode;
10330      }
10331      let vnode = getInnerChild(rawVNode);
10332      const comp = vnode.type;
10333      const name = getComponentName(
10334        isAsyncWrapper(vnode) ? vnode.type.__asyncResolved || {} : comp
10335      );
10336      const { include, exclude, max } = props;
10337      if (include && (!name || !matches(include, name)) || exclude && name && matches(exclude, name)) {
10338        current = vnode;
10339        return rawVNode;
10340      }
10341      const key = vnode.key == null ? comp : vnode.key;
10342      const cachedVNode = cache.get(key);
10343      if (vnode.el) {
10344        vnode = cloneVNode(vnode);
10345        if (rawVNode.shapeFlag & 128) {
10346          rawVNode.ssContent = vnode;
10347        }
10348      }
10349      pendingCacheKey = key;
10350      if (cachedVNode) {
10351        vnode.el = cachedVNode.el;
10352        vnode.component = cachedVNode.component;
10353        if (vnode.transition) {
10354          setTransitionHooks(vnode, vnode.transition);
10355        }
10356        vnode.shapeFlag |= 512;
10357        keys.delete(key);
10358        keys.add(key);
10359      } else {
10360        keys.add(key);
10361        if (max && keys.size > parseInt(max, 10)) {
10362          pruneCacheEntry(keys.values().next().value);
10363        }
10364      }
10365      vnode.shapeFlag |= 256;
10366      current = vnode;
10367      return isSuspense(rawVNode.type) ? rawVNode : vnode;
10368    };
10369  }
10370};
10371const KeepAlive = KeepAliveImpl;
10372function matches(pattern, name) {
10373  if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(pattern)) {
10374    return pattern.some((p) => matches(p, name));
10375  } else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isString)(pattern)) {
10376    return pattern.split(",").includes(name);
10377  } else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isRegExp)(pattern)) {
10378    return pattern.test(name);
10379  }
10380  return false;
10381}
10382function onActivated(hook, target) {
10383  registerKeepAliveHook(hook, "a", target);
10384}
10385function onDeactivated(hook, target) {
10386  registerKeepAliveHook(hook, "da", target);
10387}
10388function registerKeepAliveHook(hook, type, target = currentInstance) {
10389  const wrappedHook = hook.__wdc || (hook.__wdc = () => {
10390    let current = target;
10391    while (current) {
10392      if (current.isDeactivated) {
10393        return;
10394      }
10395      current = current.parent;
10396    }
10397    return hook();
10398  });
10399  injectHook(type, wrappedHook, target);
10400  if (target) {
10401    let current = target.parent;
10402    while (current && current.parent) {
10403      if (isKeepAlive(current.parent.vnode)) {
10404        injectToKeepAliveRoot(wrappedHook, type, target, current);
10405      }
10406      current = current.parent;
10407    }
10408  }
10409}
10410function injectToKeepAliveRoot(hook, type, target, keepAliveRoot) {
10411  const injected = injectHook(
10412    type,
10413    hook,
10414    keepAliveRoot,
10415    true
10416    /* prepend */
10417  );
10418  onUnmounted(() => {
10419    (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.remove)(keepAliveRoot[type], injected);
10420  }, target);
10421}
10422function resetShapeFlag(vnode) {
10423  vnode.shapeFlag &= ~256;
10424  vnode.shapeFlag &= ~512;
10425}
10426function getInnerChild(vnode) {
10427  return vnode.shapeFlag & 128 ? vnode.ssContent : vnode;
10428}
10429
10430function injectHook(type, hook, target = currentInstance, prepend = false) {
10431  if (target) {
10432    const hooks = target[type] || (target[type] = []);
10433    const wrappedHook = hook.__weh || (hook.__weh = (...args) => {
10434      (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.pauseTracking)();
10435      const reset = setCurrentInstance(target);
10436      const res = callWithAsyncErrorHandling(hook, target, type, args);
10437      reset();
10438      (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.resetTracking)();
10439      return res;
10440    });
10441    if (prepend) {
10442      hooks.unshift(wrappedHook);
10443    } else {
10444      hooks.push(wrappedHook);
10445    }
10446    return wrappedHook;
10447  } else if (true) {
10448    const apiName = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.toHandlerKey)(ErrorTypeStrings$1[type].replace(/ hook$/, ""));
10449    warn$1(
10450      `${apiName} is called when there is no active component instance to be associated with. Lifecycle injection APIs can only be used during execution of setup().` + (` If you are using async setup(), make sure to register lifecycle hooks before the first await statement.` )
10451    );
10452  }
10453}
10454const createHook = (lifecycle) => (hook, target = currentInstance) => {
10455  if (!isInSSRComponentSetup || lifecycle === "sp") {
10456    injectHook(lifecycle, (...args) => hook(...args), target);
10457  }
10458};
10459const onBeforeMount = createHook("bm");
10460const onMounted = createHook("m");
10461const onBeforeUpdate = createHook("bu");
10462const onUpdated = createHook("u");
10463const onBeforeUnmount = createHook("bum");
10464const onUnmounted = createHook("um");
10465const onServerPrefetch = createHook("sp");
10466const onRenderTriggered = createHook(
10467  "rtg"
10468);
10469const onRenderTracked = createHook(
10470  "rtc"
10471);
10472function onErrorCaptured(hook, target = currentInstance) {
10473  injectHook("ec", hook, target);
10474}
10475
10476const COMPONENTS = "components";
10477const DIRECTIVES = "directives";
10478function resolveComponent(name, maybeSelfReference) {
10479  return resolveAsset(COMPONENTS, name, true, maybeSelfReference) || name;
10480}
10481const NULL_DYNAMIC_COMPONENT = Symbol.for("v-ndc");
10482function resolveDynamicComponent(component) {
10483  if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isString)(component)) {
10484    return resolveAsset(COMPONENTS, component, false) || component;
10485  } else {
10486    return component || NULL_DYNAMIC_COMPONENT;
10487  }
10488}
10489function resolveDirective(name) {
10490  return resolveAsset(DIRECTIVES, name);
10491}
10492function resolveAsset(type, name, warnMissing = true, maybeSelfReference = false) {
10493  const instance = currentRenderingInstance || currentInstance;
10494  if (instance) {
10495    const Component = instance.type;
10496    if (type === COMPONENTS) {
10497      const selfName = getComponentName(
10498        Component,
10499        false
10500      );
10501      if (selfName && (selfName === name || selfName === (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.camelize)(name) || selfName === (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.capitalize)((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.camelize)(name)))) {
10502        return Component;
10503      }
10504    }
10505    const res = (
10506      // local registration
10507      // check instance[type] first which is resolved for options API
10508      resolve(instance[type] || Component[type], name) || // global registration
10509      resolve(instance.appContext[type], name)
10510    );
10511    if (!res && maybeSelfReference) {
10512      return Component;
10513    }
10514    if ( true && warnMissing && !res) {
10515      const extra = type === COMPONENTS ? `
10516If this is a native custom element, make sure to exclude it from component resolution via compilerOptions.isCustomElement.` : ``;
10517      warn$1(`Failed to resolve ${type.slice(0, -1)}: ${name}${extra}`);
10518    }
10519    return res;
10520  } else if (true) {
10521    warn$1(
10522      `resolve${(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.capitalize)(type.slice(0, -1))} can only be used in render() or setup().`
10523    );
10524  }
10525}
10526function resolve(registry, name) {
10527  return registry && (registry[name] || registry[(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.camelize)(name)] || registry[(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.capitalize)((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.camelize)(name))]);
10528}
10529
10530function renderList(source, renderItem, cache, index) {
10531  let ret;
10532  const cached = cache && cache[index];
10533  if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(source) || (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isString)(source)) {
10534    ret = new Array(source.length);
10535    for (let i = 0, l = source.length; i < l; i++) {
10536      ret[i] = renderItem(source[i], i, void 0, cached && cached[i]);
10537    }
10538  } else if (typeof source === "number") {
10539    if ( true && !Number.isInteger(source)) {
10540      warn$1(`The v-for range expect an integer value but got ${source}.`);
10541    }
10542    ret = new Array(source);
10543    for (let i = 0; i < source; i++) {
10544      ret[i] = renderItem(i + 1, i, void 0, cached && cached[i]);
10545    }
10546  } else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isObject)(source)) {
10547    if (source[Symbol.iterator]) {
10548      ret = Array.from(
10549        source,
10550        (item, i) => renderItem(item, i, void 0, cached && cached[i])
10551      );
10552    } else {
10553      const keys = Object.keys(source);
10554      ret = new Array(keys.length);
10555      for (let i = 0, l = keys.length; i < l; i++) {
10556        const key = keys[i];
10557        ret[i] = renderItem(source[key], key, i, cached && cached[i]);
10558      }
10559    }
10560  } else {
10561    ret = [];
10562  }
10563  if (cache) {
10564    cache[index] = ret;
10565  }
10566  return ret;
10567}
10568
10569function createSlots(slots, dynamicSlots) {
10570  for (let i = 0; i < dynamicSlots.length; i++) {
10571    const slot = dynamicSlots[i];
10572    if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(slot)) {
10573      for (let j = 0; j < slot.length; j++) {
10574        slots[slot[j].name] = slot[j].fn;
10575      }
10576    } else if (slot) {
10577      slots[slot.name] = slot.key ? (...args) => {
10578        const res = slot.fn(...args);
10579        if (res) res.key = slot.key;
10580        return res;
10581      } : slot.fn;
10582    }
10583  }
10584  return slots;
10585}
10586
10587function renderSlot(slots, name, props = {}, fallback, noSlotted) {
10588  if (currentRenderingInstance.isCE || currentRenderingInstance.parent && isAsyncWrapper(currentRenderingInstance.parent) && currentRenderingInstance.parent.isCE) {
10589    if (name !== "default") props.name = name;
10590    return createVNode("slot", props, fallback && fallback());
10591  }
10592  let slot = slots[name];
10593  if ( true && slot && slot.length > 1) {
10594    warn$1(
10595      `SSR-optimized slot function detected in a non-SSR-optimized render function. You need to mark this component with $dynamic-slots in the parent template.`
10596    );
10597    slot = () => [];
10598  }
10599  if (slot && slot._c) {
10600    slot._d = false;
10601  }
10602  openBlock();
10603  const validSlotContent = slot && ensureValidVNode(slot(props));
10604  const rendered = createBlock(
10605    Fragment,
10606    {
10607      key: (props.key || // slot content array of a dynamic conditional slot may have a branch
10608      // key attached in the `createSlots` helper, respect that
10609      validSlotContent && validSlotContent.key || `_${name}`) + // #7256 force differentiate fallback content from actual content
10610      (!validSlotContent && fallback ? "_fb" : "")
10611    },
10612    validSlotContent || (fallback ? fallback() : []),
10613    validSlotContent && slots._ === 1 ? 64 : -2
10614  );
10615  if (!noSlotted && rendered.scopeId) {
10616    rendered.slotScopeIds = [rendered.scopeId + "-s"];
10617  }
10618  if (slot && slot._c) {
10619    slot._d = true;
10620  }
10621  return rendered;
10622}
10623function ensureValidVNode(vnodes) {
10624  return vnodes.some((child) => {
10625    if (!isVNode(child)) return true;
10626    if (child.type === Comment) return false;
10627    if (child.type === Fragment && !ensureValidVNode(child.children))
10628      return false;
10629    return true;
10630  }) ? vnodes : null;
10631}
10632
10633function toHandlers(obj, preserveCaseIfNecessary) {
10634  const ret = {};
10635  if ( true && !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isObject)(obj)) {
10636    warn$1(`v-on with no argument expects an object value.`);
10637    return ret;
10638  }
10639  for (const key in obj) {
10640    ret[preserveCaseIfNecessary && /[A-Z]/.test(key) ? `on:${key}` : (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.toHandlerKey)(key)] = obj[key];
10641  }
10642  return ret;
10643}
10644
10645const getPublicInstance = (i) => {
10646  if (!i) return null;
10647  if (isStatefulComponent(i)) return getComponentPublicInstance(i);
10648  return getPublicInstance(i.parent);
10649};
10650const publicPropertiesMap = (
10651  // Move PURE marker to new line to workaround compiler discarding it
10652  // due to type annotation
10653  /* @__PURE__ */ (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)(/* @__PURE__ */ Object.create(null), {
10654    $: (i) => i,
10655    $el: (i) => i.vnode.el,
10656    $data: (i) => i.data,
10657    $props: (i) =>  true ? (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.shallowReadonly)(i.props) : 0,
10658    $attrs: (i) =>  true ? (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.shallowReadonly)(i.attrs) : 0,
10659    $slots: (i) =>  true ? (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.shallowReadonly)(i.slots) : 0,
10660    $refs: (i) =>  true ? (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.shallowReadonly)(i.refs) : 0,
10661    $parent: (i) => getPublicInstance(i.parent),
10662    $root: (i) => getPublicInstance(i.root),
10663    $emit: (i) => i.emit,
10664    $options: (i) =>  true ? resolveMergedOptions(i) : 0,
10665    $forceUpdate: (i) => i.f || (i.f = () => {
10666      i.effect.dirty = true;
10667      queueJob(i.update);
10668    }),
10669    $nextTick: (i) => i.n || (i.n = nextTick.bind(i.proxy)),
10670    $watch: (i) =>  true ? instanceWatch.bind(i) : 0
10671  })
10672);
10673const isReservedPrefix = (key) => key === "_" || key === "$";
10674const hasSetupBinding = (state, key) => state !== _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ && !state.__isScriptSetup && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(state, key);
10675const PublicInstanceProxyHandlers = {
10676  get({ _: instance }, key) {
10677    if (key === "__v_skip") {
10678      return true;
10679    }
10680    const { ctx, setupState, data, props, accessCache, type, appContext } = instance;
10681    if ( true && key === "__isVue") {
10682      return true;
10683    }
10684    let normalizedProps;
10685    if (key[0] !== "$") {
10686      const n = accessCache[key];
10687      if (n !== void 0) {
10688        switch (n) {
10689          case 1 /* SETUP */:
10690            return setupState[key];
10691          case 2 /* DATA */:
10692            return data[key];
10693          case 4 /* CONTEXT */:
10694            return ctx[key];
10695          case 3 /* PROPS */:
10696            return props[key];
10697        }
10698      } else if (hasSetupBinding(setupState, key)) {
10699        accessCache[key] = 1 /* SETUP */;
10700        return setupState[key];
10701      } else if (data !== _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(data, key)) {
10702        accessCache[key] = 2 /* DATA */;
10703        return data[key];
10704      } else if (
10705        // only cache other properties when instance has declared (thus stable)
10706        // props
10707        (normalizedProps = instance.propsOptions[0]) && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(normalizedProps, key)
10708      ) {
10709        accessCache[key] = 3 /* PROPS */;
10710        return props[key];
10711      } else if (ctx !== _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(ctx, key)) {
10712        accessCache[key] = 4 /* CONTEXT */;
10713        return ctx[key];
10714      } else if ( false || shouldCacheAccess) {
10715        accessCache[key] = 0 /* OTHER */;
10716      }
10717    }
10718    const publicGetter = publicPropertiesMap[key];
10719    let cssModule, globalProperties;
10720    if (publicGetter) {
10721      if (key === "$attrs") {
10722        (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.track)(instance.attrs, "get", "");
10723         true && markAttrsAccessed();
10724      } else if ( true && key === "$slots") {
10725        (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.track)(instance, "get", key);
10726      }
10727      return publicGetter(instance);
10728    } else if (
10729      // css module (injected by vue-loader)
10730      (cssModule = type.__cssModules) && (cssModule = cssModule[key])
10731    ) {
10732      return cssModule;
10733    } else if (ctx !== _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(ctx, key)) {
10734      accessCache[key] = 4 /* CONTEXT */;
10735      return ctx[key];
10736    } else if (
10737      // global properties
10738      globalProperties = appContext.config.globalProperties, (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(globalProperties, key)
10739    ) {
10740      {
10741        return globalProperties[key];
10742      }
10743    } else if ( true && currentRenderingInstance && (!(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isString)(key) || // #1091 avoid internal isRef/isVNode checks on component instance leading
10744    // to infinite warning loop
10745    key.indexOf("__v") !== 0)) {
10746      if (data !== _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ && isReservedPrefix(key[0]) && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(data, key)) {
10747        warn$1(
10748          `Property ${JSON.stringify(
10749            key
10750          )} must be accessed via $data because it starts with a reserved character ("$" or "_") and is not proxied on the render context.`
10751        );
10752      } else if (instance === currentRenderingInstance) {
10753        warn$1(
10754          `Property ${JSON.stringify(key)} was accessed during render but is not defined on instance.`
10755        );
10756      }
10757    }
10758  },
10759  set({ _: instance }, key, value) {
10760    const { data, setupState, ctx } = instance;
10761    if (hasSetupBinding(setupState, key)) {
10762      setupState[key] = value;
10763      return true;
10764    } else if ( true && setupState.__isScriptSetup && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(setupState, key)) {
10765      warn$1(`Cannot mutate <script setup> binding "${key}" from Options API.`);
10766      return false;
10767    } else if (data !== _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(data, key)) {
10768      data[key] = value;
10769      return true;
10770    } else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(instance.props, key)) {
10771       true && warn$1(`Attempting to mutate prop "${key}". Props are readonly.`);
10772      return false;
10773    }
10774    if (key[0] === "$" && key.slice(1) in instance) {
10775       true && warn$1(
10776        `Attempting to mutate public property "${key}". Properties starting with $ are reserved and readonly.`
10777      );
10778      return false;
10779    } else {
10780      if ( true && key in instance.appContext.config.globalProperties) {
10781        Object.defineProperty(ctx, key, {
10782          enumerable: true,
10783          configurable: true,
10784          value
10785        });
10786      } else {
10787        ctx[key] = value;
10788      }
10789    }
10790    return true;
10791  },
10792  has({
10793    _: { data, setupState, accessCache, ctx, appContext, propsOptions }
10794  }, key) {
10795    let normalizedProps;
10796    return !!accessCache[key] || data !== _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(data, key) || hasSetupBinding(setupState, key) || (normalizedProps = propsOptions[0]) && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(normalizedProps, key) || (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(ctx, key) || (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(publicPropertiesMap, key) || (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(appContext.config.globalProperties, key);
10797  },
10798  defineProperty(target, key, descriptor) {
10799    if (descriptor.get != null) {
10800      target._.accessCache[key] = 0;
10801    } else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(descriptor, "value")) {
10802      this.set(target, key, descriptor.value, null);
10803    }
10804    return Reflect.defineProperty(target, key, descriptor);
10805  }
10806};
10807if (true) {
10808  PublicInstanceProxyHandlers.ownKeys = (target) => {
10809    warn$1(
10810      `Avoid app logic that relies on enumerating keys on a component instance. The keys will be empty in production mode to avoid performance overhead.`
10811    );
10812    return Reflect.ownKeys(target);
10813  };
10814}
10815const RuntimeCompiledPublicInstanceProxyHandlers = /* @__PURE__ */ (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)(
10816  {},
10817  PublicInstanceProxyHandlers,
10818  {
10819    get(target, key) {
10820      if (key === Symbol.unscopables) {
10821        return;
10822      }
10823      return PublicInstanceProxyHandlers.get(target, key, target);
10824    },
10825    has(_, key) {
10826      const has = key[0] !== "_" && !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isGloballyAllowed)(key);
10827      if ( true && !has && PublicInstanceProxyHandlers.has(_, key)) {
10828        warn$1(
10829          `Property ${JSON.stringify(
10830            key
10831          )} should not start with _ which is a reserved prefix for Vue internals.`
10832        );
10833      }
10834      return has;
10835    }
10836  }
10837);
10838function createDevRenderContext(instance) {
10839  const target = {};
10840  Object.defineProperty(target, `_`, {
10841    configurable: true,
10842    enumerable: false,
10843    get: () => instance
10844  });
10845  Object.keys(publicPropertiesMap).forEach((key) => {
10846    Object.defineProperty(target, key, {
10847      configurable: true,
10848      enumerable: false,
10849      get: () => publicPropertiesMap[key](instance),
10850      // intercepted by the proxy so no need for implementation,
10851      // but needed to prevent set errors
10852      set: _vue_shared__WEBPACK_IMPORTED_MODULE_1__.NOOP
10853    });
10854  });
10855  return target;
10856}
10857function exposePropsOnRenderContext(instance) {
10858  const {
10859    ctx,
10860    propsOptions: [propsOptions]
10861  } = instance;
10862  if (propsOptions) {
10863    Object.keys(propsOptions).forEach((key) => {
10864      Object.defineProperty(ctx, key, {
10865        enumerable: true,
10866        configurable: true,
10867        get: () => instance.props[key],
10868        set: _vue_shared__WEBPACK_IMPORTED_MODULE_1__.NOOP
10869      });
10870    });
10871  }
10872}
10873function exposeSetupStateOnRenderContext(instance) {
10874  const { ctx, setupState } = instance;
10875  Object.keys((0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.toRaw)(setupState)).forEach((key) => {
10876    if (!setupState.__isScriptSetup) {
10877      if (isReservedPrefix(key[0])) {
10878        warn$1(
10879          `setup() return property ${JSON.stringify(
10880            key
10881          )} should not start with "$" or "_" which are reserved prefixes for Vue internals.`
10882        );
10883        return;
10884      }
10885      Object.defineProperty(ctx, key, {
10886        enumerable: true,
10887        configurable: true,
10888        get: () => setupState[key],
10889        set: _vue_shared__WEBPACK_IMPORTED_MODULE_1__.NOOP
10890      });
10891    }
10892  });
10893}
10894
10895const warnRuntimeUsage = (method) => warn$1(
10896  `${method}() is a compiler-hint helper that is only usable inside <script setup> of a single file component. Its arguments should be compiled away and passing it at runtime has no effect.`
10897);
10898function defineProps() {
10899  if (true) {
10900    warnRuntimeUsage(`defineProps`);
10901  }
10902  return null;
10903}
10904function defineEmits() {
10905  if (true) {
10906    warnRuntimeUsage(`defineEmits`);
10907  }
10908  return null;
10909}
10910function defineExpose(exposed) {
10911  if (true) {
10912    warnRuntimeUsage(`defineExpose`);
10913  }
10914}
10915function defineOptions(options) {
10916  if (true) {
10917    warnRuntimeUsage(`defineOptions`);
10918  }
10919}
10920function defineSlots() {
10921  if (true) {
10922    warnRuntimeUsage(`defineSlots`);
10923  }
10924  return null;
10925}
10926function defineModel() {
10927  if (true) {
10928    warnRuntimeUsage("defineModel");
10929  }
10930}
10931function withDefaults(props, defaults) {
10932  if (true) {
10933    warnRuntimeUsage(`withDefaults`);
10934  }
10935  return null;
10936}
10937function useSlots() {
10938  return getContext().slots;
10939}
10940function useAttrs() {
10941  return getContext().attrs;
10942}
10943function getContext() {
10944  const i = getCurrentInstance();
10945  if ( true && !i) {
10946    warn$1(`useContext() called without active instance.`);
10947  }
10948  return i.setupContext || (i.setupContext = createSetupContext(i));
10949}
10950function normalizePropsOrEmits(props) {
10951  return (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(props) ? props.reduce(
10952    (normalized, p) => (normalized[p] = null, normalized),
10953    {}
10954  ) : props;
10955}
10956function mergeDefaults(raw, defaults) {
10957  const props = normalizePropsOrEmits(raw);
10958  for (const key in defaults) {
10959    if (key.startsWith("__skip")) continue;
10960    let opt = props[key];
10961    if (opt) {
10962      if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(opt) || (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(opt)) {
10963        opt = props[key] = { type: opt, default: defaults[key] };
10964      } else {
10965        opt.default = defaults[key];
10966      }
10967    } else if (opt === null) {
10968      opt = props[key] = { default: defaults[key] };
10969    } else if (true) {
10970      warn$1(`props default key "${key}" has no corresponding declaration.`);
10971    }
10972    if (opt && defaults[`__skip_${key}`]) {
10973      opt.skipFactory = true;
10974    }
10975  }
10976  return props;
10977}
10978function mergeModels(a, b) {
10979  if (!a || !b) return a || b;
10980  if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(a) && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(b)) return a.concat(b);
10981  return (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)({}, normalizePropsOrEmits(a), normalizePropsOrEmits(b));
10982}
10983function createPropsRestProxy(props, excludedKeys) {
10984  const ret = {};
10985  for (const key in props) {
10986    if (!excludedKeys.includes(key)) {
10987      Object.defineProperty(ret, key, {
10988        enumerable: true,
10989        get: () => props[key]
10990      });
10991    }
10992  }
10993  return ret;
10994}
10995function withAsyncContext(getAwaitable) {
10996  const ctx = getCurrentInstance();
10997  if ( true && !ctx) {
10998    warn$1(
10999      `withAsyncContext called without active current instance. This is likely a bug.`
11000    );
11001  }
11002  let awaitable = getAwaitable();
11003  unsetCurrentInstance();
11004  if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isPromise)(awaitable)) {
11005    awaitable = awaitable.catch((e) => {
11006      setCurrentInstance(ctx);
11007      throw e;
11008    });
11009  }
11010  return [awaitable, () => setCurrentInstance(ctx)];
11011}
11012
11013function createDuplicateChecker() {
11014  const cache = /* @__PURE__ */ Object.create(null);
11015  return (type, key) => {
11016    if (cache[key]) {
11017      warn$1(`${type} property "${key}" is already defined in ${cache[key]}.`);
11018    } else {
11019      cache[key] = type;
11020    }
11021  };
11022}
11023let shouldCacheAccess = true;
11024function applyOptions(instance) {
11025  const options = resolveMergedOptions(instance);
11026  const publicThis = instance.proxy;
11027  const ctx = instance.ctx;
11028  shouldCacheAccess = false;
11029  if (options.beforeCreate) {
11030    callHook(options.beforeCreate, instance, "bc");
11031  }
11032  const {
11033    // state
11034    data: dataOptions,
11035    computed: computedOptions,
11036    methods,
11037    watch: watchOptions,
11038    provide: provideOptions,
11039    inject: injectOptions,
11040    // lifecycle
11041    created,
11042    beforeMount,
11043    mounted,
11044    beforeUpdate,
11045    updated,
11046    activated,
11047    deactivated,
11048    beforeDestroy,
11049    beforeUnmount,
11050    destroyed,
11051    unmounted,
11052    render,
11053    renderTracked,
11054    renderTriggered,
11055    errorCaptured,
11056    serverPrefetch,
11057    // public API
11058    expose,
11059    inheritAttrs,
11060    // assets
11061    components,
11062    directives,
11063    filters
11064  } = options;
11065  const checkDuplicateProperties =  true ? createDuplicateChecker() : 0;
11066  if (true) {
11067    const [propsOptions] = instance.propsOptions;
11068    if (propsOptions) {
11069      for (const key in propsOptions) {
11070        checkDuplicateProperties("Props" /* PROPS */, key);
11071      }
11072    }
11073  }
11074  if (injectOptions) {
11075    resolveInjections(injectOptions, ctx, checkDuplicateProperties);
11076  }
11077  if (methods) {
11078    for (const key in methods) {
11079      const methodHandler = methods[key];
11080      if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(methodHandler)) {
11081        if (true) {
11082          Object.defineProperty(ctx, key, {
11083            value: methodHandler.bind(publicThis),
11084            configurable: true,
11085            enumerable: true,
11086            writable: true
11087          });
11088        } else {}
11089        if (true) {
11090          checkDuplicateProperties("Methods" /* METHODS */, key);
11091        }
11092      } else if (true) {
11093        warn$1(
11094          `Method "${key}" has type "${typeof methodHandler}" in the component definition. Did you reference the function correctly?`
11095        );
11096      }
11097    }
11098  }
11099  if (dataOptions) {
11100    if ( true && !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(dataOptions)) {
11101      warn$1(
11102        `The data option must be a function. Plain object usage is no longer supported.`
11103      );
11104    }
11105    const data = dataOptions.call(publicThis, publicThis);
11106    if ( true && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isPromise)(data)) {
11107      warn$1(
11108        `data() returned a Promise - note data() cannot be async; If you intend to perform data fetching before component renders, use async setup() + <Suspense>.`
11109      );
11110    }
11111    if (!(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isObject)(data)) {
11112       true && warn$1(`data() should return an object.`);
11113    } else {
11114      instance.data = (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.reactive)(data);
11115      if (true) {
11116        for (const key in data) {
11117          checkDuplicateProperties("Data" /* DATA */, key);
11118          if (!isReservedPrefix(key[0])) {
11119            Object.defineProperty(ctx, key, {
11120              configurable: true,
11121              enumerable: true,
11122              get: () => data[key],
11123              set: _vue_shared__WEBPACK_IMPORTED_MODULE_1__.NOOP
11124            });
11125          }
11126        }
11127      }
11128    }
11129  }
11130  shouldCacheAccess = true;
11131  if (computedOptions) {
11132    for (const key in computedOptions) {
11133      const opt = computedOptions[key];
11134      const get = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(opt) ? opt.bind(publicThis, publicThis) : (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(opt.get) ? opt.get.bind(publicThis, publicThis) : _vue_shared__WEBPACK_IMPORTED_MODULE_1__.NOOP;
11135      if ( true && get === _vue_shared__WEBPACK_IMPORTED_MODULE_1__.NOOP) {
11136        warn$1(`Computed property "${key}" has no getter.`);
11137      }
11138      const set = !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(opt) && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(opt.set) ? opt.set.bind(publicThis) :  true ? () => {
11139        warn$1(
11140          `Write operation failed: computed property "${key}" is readonly.`
11141        );
11142      } : 0;
11143      const c = computed({
11144        get,
11145        set
11146      });
11147      Object.defineProperty(ctx, key, {
11148        enumerable: true,
11149        configurable: true,
11150        get: () => c.value,
11151        set: (v) => c.value = v
11152      });
11153      if (true) {
11154        checkDuplicateProperties("Computed" /* COMPUTED */, key);
11155      }
11156    }
11157  }
11158  if (watchOptions) {
11159    for (const key in watchOptions) {
11160      createWatcher(watchOptions[key], ctx, publicThis, key);
11161    }
11162  }
11163  if (provideOptions) {
11164    const provides = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(provideOptions) ? provideOptions.call(publicThis) : provideOptions;
11165    Reflect.ownKeys(provides).forEach((key) => {
11166      provide(key, provides[key]);
11167    });
11168  }
11169  if (created) {
11170    callHook(created, instance, "c");
11171  }
11172  function registerLifecycleHook(register, hook) {
11173    if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(hook)) {
11174      hook.forEach((_hook) => register(_hook.bind(publicThis)));
11175    } else if (hook) {
11176      register(hook.bind(publicThis));
11177    }
11178  }
11179  registerLifecycleHook(onBeforeMount, beforeMount);
11180  registerLifecycleHook(onMounted, mounted);
11181  registerLifecycleHook(onBeforeUpdate, beforeUpdate);
11182  registerLifecycleHook(onUpdated, updated);
11183  registerLifecycleHook(onActivated, activated);
11184  registerLifecycleHook(onDeactivated, deactivated);
11185  registerLifecycleHook(onErrorCaptured, errorCaptured);
11186  registerLifecycleHook(onRenderTracked, renderTracked);
11187  registerLifecycleHook(onRenderTriggered, renderTriggered);
11188  registerLifecycleHook(onBeforeUnmount, beforeUnmount);
11189  registerLifecycleHook(onUnmounted, unmounted);
11190  registerLifecycleHook(onServerPrefetch, serverPrefetch);
11191  if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(expose)) {
11192    if (expose.length) {
11193      const exposed = instance.exposed || (instance.exposed = {});
11194      expose.forEach((key) => {
11195        Object.defineProperty(exposed, key, {
11196          get: () => publicThis[key],
11197          set: (val) => publicThis[key] = val
11198        });
11199      });
11200    } else if (!instance.exposed) {
11201      instance.exposed = {};
11202    }
11203  }
11204  if (render && instance.render === _vue_shared__WEBPACK_IMPORTED_MODULE_1__.NOOP) {
11205    instance.render = render;
11206  }
11207  if (inheritAttrs != null) {
11208    instance.inheritAttrs = inheritAttrs;
11209  }
11210  if (components) instance.components = components;
11211  if (directives) instance.directives = directives;
11212}
11213function resolveInjections(injectOptions, ctx, checkDuplicateProperties = _vue_shared__WEBPACK_IMPORTED_MODULE_1__.NOOP) {
11214  if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(injectOptions)) {
11215    injectOptions = normalizeInject(injectOptions);
11216  }
11217  for (const key in injectOptions) {
11218    const opt = injectOptions[key];
11219    let injected;
11220    if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isObject)(opt)) {
11221      if ("default" in opt) {
11222        injected = inject(
11223          opt.from || key,
11224          opt.default,
11225          true
11226        );
11227      } else {
11228        injected = inject(opt.from || key);
11229      }
11230    } else {
11231      injected = inject(opt);
11232    }
11233    if ((0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isRef)(injected)) {
11234      Object.defineProperty(ctx, key, {
11235        enumerable: true,
11236        configurable: true,
11237        get: () => injected.value,
11238        set: (v) => injected.value = v
11239      });
11240    } else {
11241      ctx[key] = injected;
11242    }
11243    if (true) {
11244      checkDuplicateProperties("Inject" /* INJECT */, key);
11245    }
11246  }
11247}
11248function callHook(hook, instance, type) {
11249  callWithAsyncErrorHandling(
11250    (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(hook) ? hook.map((h) => h.bind(instance.proxy)) : hook.bind(instance.proxy),
11251    instance,
11252    type
11253  );
11254}
11255function createWatcher(raw, ctx, publicThis, key) {
11256  const getter = key.includes(".") ? createPathGetter(publicThis, key) : () => publicThis[key];
11257  if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isString)(raw)) {
11258    const handler = ctx[raw];
11259    if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(handler)) {
11260      watch(getter, handler);
11261    } else if (true) {
11262      warn$1(`Invalid watch handler specified by key "${raw}"`, handler);
11263    }
11264  } else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(raw)) {
11265    watch(getter, raw.bind(publicThis));
11266  } else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isObject)(raw)) {
11267    if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(raw)) {
11268      raw.forEach((r) => createWatcher(r, ctx, publicThis, key));
11269    } else {
11270      const handler = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(raw.handler) ? raw.handler.bind(publicThis) : ctx[raw.handler];
11271      if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(handler)) {
11272        watch(getter, handler, raw);
11273      } else if (true) {
11274        warn$1(`Invalid watch handler specified by key "${raw.handler}"`, handler);
11275      }
11276    }
11277  } else if (true) {
11278    warn$1(`Invalid watch option: "${key}"`, raw);
11279  }
11280}
11281function resolveMergedOptions(instance) {
11282  const base = instance.type;
11283  const { mixins, extends: extendsOptions } = base;
11284  const {
11285    mixins: globalMixins,
11286    optionsCache: cache,
11287    config: { optionMergeStrategies }
11288  } = instance.appContext;
11289  const cached = cache.get(base);
11290  let resolved;
11291  if (cached) {
11292    resolved = cached;
11293  } else if (!globalMixins.length && !mixins && !extendsOptions) {
11294    {
11295      resolved = base;
11296    }
11297  } else {
11298    resolved = {};
11299    if (globalMixins.length) {
11300      globalMixins.forEach(
11301        (m) => mergeOptions(resolved, m, optionMergeStrategies, true)
11302      );
11303    }
11304    mergeOptions(resolved, base, optionMergeStrategies);
11305  }
11306  if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isObject)(base)) {
11307    cache.set(base, resolved);
11308  }
11309  return resolved;
11310}
11311function mergeOptions(to, from, strats, asMixin = false) {
11312  const { mixins, extends: extendsOptions } = from;
11313  if (extendsOptions) {
11314    mergeOptions(to, extendsOptions, strats, true);
11315  }
11316  if (mixins) {
11317    mixins.forEach(
11318      (m) => mergeOptions(to, m, strats, true)
11319    );
11320  }
11321  for (const key in from) {
11322    if (asMixin && key === "expose") {
11323       true && warn$1(
11324        `"expose" option is ignored when declared in mixins or extends. It should only be declared in the base component itself.`
11325      );
11326    } else {
11327      const strat = internalOptionMergeStrats[key] || strats && strats[key];
11328      to[key] = strat ? strat(to[key], from[key]) : from[key];
11329    }
11330  }
11331  return to;
11332}
11333const internalOptionMergeStrats = {
11334  data: mergeDataFn,
11335  props: mergeEmitsOrPropsOptions,
11336  emits: mergeEmitsOrPropsOptions,
11337  // objects
11338  methods: mergeObjectOptions,
11339  computed: mergeObjectOptions,
11340  // lifecycle
11341  beforeCreate: mergeAsArray,
11342  created: mergeAsArray,
11343  beforeMount: mergeAsArray,
11344  mounted: mergeAsArray,
11345  beforeUpdate: mergeAsArray,
11346  updated: mergeAsArray,
11347  beforeDestroy: mergeAsArray,
11348  beforeUnmount: mergeAsArray,
11349  destroyed: mergeAsArray,
11350  unmounted: mergeAsArray,
11351  activated: mergeAsArray,
11352  deactivated: mergeAsArray,
11353  errorCaptured: mergeAsArray,
11354  serverPrefetch: mergeAsArray,
11355  // assets
11356  components: mergeObjectOptions,
11357  directives: mergeObjectOptions,
11358  // watch
11359  watch: mergeWatchOptions,
11360  // provide / inject
11361  provide: mergeDataFn,
11362  inject: mergeInject
11363};
11364function mergeDataFn(to, from) {
11365  if (!from) {
11366    return to;
11367  }
11368  if (!to) {
11369    return from;
11370  }
11371  return function mergedDataFn() {
11372    return ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend))(
11373      (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(to) ? to.call(this, this) : to,
11374      (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(from) ? from.call(this, this) : from
11375    );
11376  };
11377}
11378function mergeInject(to, from) {
11379  return mergeObjectOptions(normalizeInject(to), normalizeInject(from));
11380}
11381function normalizeInject(raw) {
11382  if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(raw)) {
11383    const res = {};
11384    for (let i = 0; i < raw.length; i++) {
11385      res[raw[i]] = raw[i];
11386    }
11387    return res;
11388  }
11389  return raw;
11390}
11391function mergeAsArray(to, from) {
11392  return to ? [...new Set([].concat(to, from))] : from;
11393}
11394function mergeObjectOptions(to, from) {
11395  return to ? (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)(/* @__PURE__ */ Object.create(null), to, from) : from;
11396}
11397function mergeEmitsOrPropsOptions(to, from) {
11398  if (to) {
11399    if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(to) && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(from)) {
11400      return [.../* @__PURE__ */ new Set([...to, ...from])];
11401    }
11402    return (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)(
11403      /* @__PURE__ */ Object.create(null),
11404      normalizePropsOrEmits(to),
11405      normalizePropsOrEmits(from != null ? from : {})
11406    );
11407  } else {
11408    return from;
11409  }
11410}
11411function mergeWatchOptions(to, from) {
11412  if (!to) return from;
11413  if (!from) return to;
11414  const merged = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)(/* @__PURE__ */ Object.create(null), to);
11415  for (const key in from) {
11416    merged[key] = mergeAsArray(to[key], from[key]);
11417  }
11418  return merged;
11419}
11420
11421function createAppContext() {
11422  return {
11423    app: null,
11424    config: {
11425      isNativeTag: _vue_shared__WEBPACK_IMPORTED_MODULE_1__.NO,
11426      performance: false,
11427      globalProperties: {},
11428      optionMergeStrategies: {},
11429      errorHandler: void 0,
11430      warnHandler: void 0,
11431      compilerOptions: {}
11432    },
11433    mixins: [],
11434    components: {},
11435    directives: {},
11436    provides: /* @__PURE__ */ Object.create(null),
11437    optionsCache: /* @__PURE__ */ new WeakMap(),
11438    propsCache: /* @__PURE__ */ new WeakMap(),
11439    emitsCache: /* @__PURE__ */ new WeakMap()
11440  };
11441}
11442let uid$1 = 0;
11443function createAppAPI(render, hydrate) {
11444  return function createApp(rootComponent, rootProps = null) {
11445    if (!(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(rootComponent)) {
11446      rootComponent = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)({}, rootComponent);
11447    }
11448    if (rootProps != null && !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isObject)(rootProps)) {
11449       true && warn$1(`root props passed to app.mount() must be an object.`);
11450      rootProps = null;
11451    }
11452    const context = createAppContext();
11453    const installedPlugins = /* @__PURE__ */ new WeakSet();
11454    let isMounted = false;
11455    const app = context.app = {
11456      _uid: uid$1++,
11457      _component: rootComponent,
11458      _props: rootProps,
11459      _container: null,
11460      _context: context,
11461      _instance: null,
11462      version,
11463      get config() {
11464        return context.config;
11465      },
11466      set config(v) {
11467        if (true) {
11468          warn$1(
11469            `app.config cannot be replaced. Modify individual options instead.`
11470          );
11471        }
11472      },
11473      use(plugin, ...options) {
11474        if (installedPlugins.has(plugin)) {
11475           true && warn$1(`Plugin has already been applied to target app.`);
11476        } else if (plugin && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(plugin.install)) {
11477          installedPlugins.add(plugin);
11478          plugin.install(app, ...options);
11479        } else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(plugin)) {
11480          installedPlugins.add(plugin);
11481          plugin(app, ...options);
11482        } else if (true) {
11483          warn$1(
11484            `A plugin must either be a function or an object with an "install" function.`
11485          );
11486        }
11487        return app;
11488      },
11489      mixin(mixin) {
11490        if (true) {
11491          if (!context.mixins.includes(mixin)) {
11492            context.mixins.push(mixin);
11493          } else if (true) {
11494            warn$1(
11495              "Mixin has already been applied to target app" + (mixin.name ? `: ${mixin.name}` : "")
11496            );
11497          }
11498        } else {}
11499        return app;
11500      },
11501      component(name, component) {
11502        if (true) {
11503          validateComponentName(name, context.config);
11504        }
11505        if (!component) {
11506          return context.components[name];
11507        }
11508        if ( true && context.components[name]) {
11509          warn$1(`Component "${name}" has already been registered in target app.`);
11510        }
11511        context.components[name] = component;
11512        return app;
11513      },
11514      directive(name, directive) {
11515        if (true) {
11516          validateDirectiveName(name);
11517        }
11518        if (!directive) {
11519          return context.directives[name];
11520        }
11521        if ( true && context.directives[name]) {
11522          warn$1(`Directive "${name}" has already been registered in target app.`);
11523        }
11524        context.directives[name] = directive;
11525        return app;
11526      },
11527      mount(rootContainer, isHydrate, namespace) {
11528        if (!isMounted) {
11529          if ( true && rootContainer.__vue_app__) {
11530            warn$1(
11531              `There is already an app instance mounted on the host container.
11532 If you want to mount another app on the same host container, you need to unmount the previous app by calling \`app.unmount()\` first.`
11533            );
11534          }
11535          const vnode = createVNode(rootComponent, rootProps);
11536          vnode.appContext = context;
11537          if (namespace === true) {
11538            namespace = "svg";
11539          } else if (namespace === false) {
11540            namespace = void 0;
11541          }
11542          if (true) {
11543            context.reload = () => {
11544              render(
11545                cloneVNode(vnode),
11546                rootContainer,
11547                namespace
11548              );
11549            };
11550          }
11551          if (isHydrate && hydrate) {
11552            hydrate(vnode, rootContainer);
11553          } else {
11554            render(vnode, rootContainer, namespace);
11555          }
11556          isMounted = true;
11557          app._container = rootContainer;
11558          rootContainer.__vue_app__ = app;
11559          if (true) {
11560            app._instance = vnode.component;
11561            devtoolsInitApp(app, version);
11562          }
11563          return getComponentPublicInstance(vnode.component);
11564        } else if (true) {
11565          warn$1(
11566            `App has already been mounted.
11567If you want to remount the same app, move your app creation logic into a factory function and create fresh app instances for each mount - e.g. \`const createMyApp = () => createApp(App)\``
11568          );
11569        }
11570      },
11571      unmount() {
11572        if (isMounted) {
11573          render(null, app._container);
11574          if (true) {
11575            app._instance = null;
11576            devtoolsUnmountApp(app);
11577          }
11578          delete app._container.__vue_app__;
11579        } else if (true) {
11580          warn$1(`Cannot unmount an app that is not mounted.`);
11581        }
11582      },
11583      provide(key, value) {
11584        if ( true && key in context.provides) {
11585          warn$1(
11586            `App already provides property with key "${String(key)}". It will be overwritten with the new value.`
11587          );
11588        }
11589        context.provides[key] = value;
11590        return app;
11591      },
11592      runWithContext(fn) {
11593        const lastApp = currentApp;
11594        currentApp = app;
11595        try {
11596          return fn();
11597        } finally {
11598          currentApp = lastApp;
11599        }
11600      }
11601    };
11602    return app;
11603  };
11604}
11605let currentApp = null;
11606
11607function provide(key, value) {
11608  if (!currentInstance) {
11609    if (true) {
11610      warn$1(`provide() can only be used inside setup().`);
11611    }
11612  } else {
11613    let provides = currentInstance.provides;
11614    const parentProvides = currentInstance.parent && currentInstance.parent.provides;
11615    if (parentProvides === provides) {
11616      provides = currentInstance.provides = Object.create(parentProvides);
11617    }
11618    provides[key] = value;
11619  }
11620}
11621function inject(key, defaultValue, treatDefaultAsFactory = false) {
11622  const instance = currentInstance || currentRenderingInstance;
11623  if (instance || currentApp) {
11624    const provides = instance ? instance.parent == null ? instance.vnode.appContext && instance.vnode.appContext.provides : instance.parent.provides : currentApp._context.provides;
11625    if (provides && key in provides) {
11626      return provides[key];
11627    } else if (arguments.length > 1) {
11628      return treatDefaultAsFactory && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(defaultValue) ? defaultValue.call(instance && instance.proxy) : defaultValue;
11629    } else if (true) {
11630      warn$1(`injection "${String(key)}" not found.`);
11631    }
11632  } else if (true) {
11633    warn$1(`inject() can only be used inside setup() or functional components.`);
11634  }
11635}
11636function hasInjectionContext() {
11637  return !!(currentInstance || currentRenderingInstance || currentApp);
11638}
11639
11640const internalObjectProto = {};
11641const createInternalObject = () => Object.create(internalObjectProto);
11642const isInternalObject = (obj) => Object.getPrototypeOf(obj) === internalObjectProto;
11643
11644function initProps(instance, rawProps, isStateful, isSSR = false) {
11645  const props = {};
11646  const attrs = createInternalObject();
11647  instance.propsDefaults = /* @__PURE__ */ Object.create(null);
11648  setFullProps(instance, rawProps, props, attrs);
11649  for (const key in instance.propsOptions[0]) {
11650    if (!(key in props)) {
11651      props[key] = void 0;
11652    }
11653  }
11654  if (true) {
11655    validateProps(rawProps || {}, props, instance);
11656  }
11657  if (isStateful) {
11658    instance.props = isSSR ? props : (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.shallowReactive)(props);
11659  } else {
11660    if (!instance.type.props) {
11661      instance.props = attrs;
11662    } else {
11663      instance.props = props;
11664    }
11665  }
11666  instance.attrs = attrs;
11667}
11668function isInHmrContext(instance) {
11669  while (instance) {
11670    if (instance.type.__hmrId) return true;
11671    instance = instance.parent;
11672  }
11673}
11674function updateProps(instance, rawProps, rawPrevProps, optimized) {
11675  const {
11676    props,
11677    attrs,
11678    vnode: { patchFlag }
11679  } = instance;
11680  const rawCurrentProps = (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.toRaw)(props);
11681  const [options] = instance.propsOptions;
11682  let hasAttrsChanged = false;
11683  if (
11684    // always force full diff in dev
11685    // - #1942 if hmr is enabled with sfc component
11686    // - vite#872 non-sfc component used by sfc component
11687    !( true && isInHmrContext(instance)) && (optimized || patchFlag > 0) && !(patchFlag & 16)
11688  ) {
11689    if (patchFlag & 8) {
11690      const propsToUpdate = instance.vnode.dynamicProps;
11691      for (let i = 0; i < propsToUpdate.length; i++) {
11692        let key = propsToUpdate[i];
11693        if (isEmitListener(instance.emitsOptions, key)) {
11694          continue;
11695        }
11696        const value = rawProps[key];
11697        if (options) {
11698          if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(attrs, key)) {
11699            if (value !== attrs[key]) {
11700              attrs[key] = value;
11701              hasAttrsChanged = true;
11702            }
11703          } else {
11704            const camelizedKey = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.camelize)(key);
11705            props[camelizedKey] = resolvePropValue(
11706              options,
11707              rawCurrentProps,
11708              camelizedKey,
11709              value,
11710              instance,
11711              false
11712            );
11713          }
11714        } else {
11715          if (value !== attrs[key]) {
11716            attrs[key] = value;
11717            hasAttrsChanged = true;
11718          }
11719        }
11720      }
11721    }
11722  } else {
11723    if (setFullProps(instance, rawProps, props, attrs)) {
11724      hasAttrsChanged = true;
11725    }
11726    let kebabKey;
11727    for (const key in rawCurrentProps) {
11728      if (!rawProps || // for camelCase
11729      !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(rawProps, key) && // it's possible the original props was passed in as kebab-case
11730      // and converted to camelCase (#955)
11731      ((kebabKey = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hyphenate)(key)) === key || !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(rawProps, kebabKey))) {
11732        if (options) {
11733          if (rawPrevProps && // for camelCase
11734          (rawPrevProps[key] !== void 0 || // for kebab-case
11735          rawPrevProps[kebabKey] !== void 0)) {
11736            props[key] = resolvePropValue(
11737              options,
11738              rawCurrentProps,
11739              key,
11740              void 0,
11741              instance,
11742              true
11743            );
11744          }
11745        } else {
11746          delete props[key];
11747        }
11748      }
11749    }
11750    if (attrs !== rawCurrentProps) {
11751      for (const key in attrs) {
11752        if (!rawProps || !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(rawProps, key) && true) {
11753          delete attrs[key];
11754          hasAttrsChanged = true;
11755        }
11756      }
11757    }
11758  }
11759  if (hasAttrsChanged) {
11760    (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.trigger)(instance.attrs, "set", "");
11761  }
11762  if (true) {
11763    validateProps(rawProps || {}, props, instance);
11764  }
11765}
11766function setFullProps(instance, rawProps, props, attrs) {
11767  const [options, needCastKeys] = instance.propsOptions;
11768  let hasAttrsChanged = false;
11769  let rawCastValues;
11770  if (rawProps) {
11771    for (let key in rawProps) {
11772      if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isReservedProp)(key)) {
11773        continue;
11774      }
11775      const value = rawProps[key];
11776      let camelKey;
11777      if (options && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(options, camelKey = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.camelize)(key))) {
11778        if (!needCastKeys || !needCastKeys.includes(camelKey)) {
11779          props[camelKey] = value;
11780        } else {
11781          (rawCastValues || (rawCastValues = {}))[camelKey] = value;
11782        }
11783      } else if (!isEmitListener(instance.emitsOptions, key)) {
11784        if (!(key in attrs) || value !== attrs[key]) {
11785          attrs[key] = value;
11786          hasAttrsChanged = true;
11787        }
11788      }
11789    }
11790  }
11791  if (needCastKeys) {
11792    const rawCurrentProps = (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.toRaw)(props);
11793    const castValues = rawCastValues || _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ;
11794    for (let i = 0; i < needCastKeys.length; i++) {
11795      const key = needCastKeys[i];
11796      props[key] = resolvePropValue(
11797        options,
11798        rawCurrentProps,
11799        key,
11800        castValues[key],
11801        instance,
11802        !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(castValues, key)
11803      );
11804    }
11805  }
11806  return hasAttrsChanged;
11807}
11808function resolvePropValue(options, props, key, value, instance, isAbsent) {
11809  const opt = options[key];
11810  if (opt != null) {
11811    const hasDefault = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(opt, "default");
11812    if (hasDefault && value === void 0) {
11813      const defaultValue = opt.default;
11814      if (opt.type !== Function && !opt.skipFactory && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(defaultValue)) {
11815        const { propsDefaults } = instance;
11816        if (key in propsDefaults) {
11817          value = propsDefaults[key];
11818        } else {
11819          const reset = setCurrentInstance(instance);
11820          value = propsDefaults[key] = defaultValue.call(
11821            null,
11822            props
11823          );
11824          reset();
11825        }
11826      } else {
11827        value = defaultValue;
11828      }
11829    }
11830    if (opt[0 /* shouldCast */]) {
11831      if (isAbsent && !hasDefault) {
11832        value = false;
11833      } else if (opt[1 /* shouldCastTrue */] && (value === "" || value === (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hyphenate)(key))) {
11834        value = true;
11835      }
11836    }
11837  }
11838  return value;
11839}
11840const mixinPropsCache = /* @__PURE__ */ new WeakMap();
11841function normalizePropsOptions(comp, appContext, asMixin = false) {
11842  const cache =  true && asMixin ? mixinPropsCache : appContext.propsCache;
11843  const cached = cache.get(comp);
11844  if (cached) {
11845    return cached;
11846  }
11847  const raw = comp.props;
11848  const normalized = {};
11849  const needCastKeys = [];
11850  let hasExtends = false;
11851  if ( true && !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(comp)) {
11852    const extendProps = (raw2) => {
11853      hasExtends = true;
11854      const [props, keys] = normalizePropsOptions(raw2, appContext, true);
11855      (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)(normalized, props);
11856      if (keys) needCastKeys.push(...keys);
11857    };
11858    if (!asMixin && appContext.mixins.length) {
11859      appContext.mixins.forEach(extendProps);
11860    }
11861    if (comp.extends) {
11862      extendProps(comp.extends);
11863    }
11864    if (comp.mixins) {
11865      comp.mixins.forEach(extendProps);
11866    }
11867  }
11868  if (!raw && !hasExtends) {
11869    if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isObject)(comp)) {
11870      cache.set(comp, _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_ARR);
11871    }
11872    return _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_ARR;
11873  }
11874  if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(raw)) {
11875    for (let i = 0; i < raw.length; i++) {
11876      if ( true && !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isString)(raw[i])) {
11877        warn$1(`props must be strings when using array syntax.`, raw[i]);
11878      }
11879      const normalizedKey = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.camelize)(raw[i]);
11880      if (validatePropName(normalizedKey)) {
11881        normalized[normalizedKey] = _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ;
11882      }
11883    }
11884  } else if (raw) {
11885    if ( true && !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isObject)(raw)) {
11886      warn$1(`invalid props options`, raw);
11887    }
11888    for (const key in raw) {
11889      const normalizedKey = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.camelize)(key);
11890      if (validatePropName(normalizedKey)) {
11891        const opt = raw[key];
11892        const prop = normalized[normalizedKey] = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(opt) || (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(opt) ? { type: opt } : (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)({}, opt);
11893        if (prop) {
11894          const booleanIndex = getTypeIndex(Boolean, prop.type);
11895          const stringIndex = getTypeIndex(String, prop.type);
11896          prop[0 /* shouldCast */] = booleanIndex > -1;
11897          prop[1 /* shouldCastTrue */] = stringIndex < 0 || booleanIndex < stringIndex;
11898          if (booleanIndex > -1 || (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(prop, "default")) {
11899            needCastKeys.push(normalizedKey);
11900          }
11901        }
11902      }
11903    }
11904  }
11905  const res = [normalized, needCastKeys];
11906  if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isObject)(comp)) {
11907    cache.set(comp, res);
11908  }
11909  return res;
11910}
11911function validatePropName(key) {
11912  if (key[0] !== "$" && !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isReservedProp)(key)) {
11913    return true;
11914  } else if (true) {
11915    warn$1(`Invalid prop name: "${key}" is a reserved property.`);
11916  }
11917  return false;
11918}
11919function getType(ctor) {
11920  if (ctor === null) {
11921    return "null";
11922  }
11923  if (typeof ctor === "function") {
11924    return ctor.name || "";
11925  } else if (typeof ctor === "object") {
11926    const name = ctor.constructor && ctor.constructor.name;
11927    return name || "";
11928  }
11929  return "";
11930}
11931function isSameType(a, b) {
11932  return getType(a) === getType(b);
11933}
11934function getTypeIndex(type, expectedTypes) {
11935  if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(expectedTypes)) {
11936    return expectedTypes.findIndex((t) => isSameType(t, type));
11937  } else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(expectedTypes)) {
11938    return isSameType(expectedTypes, type) ? 0 : -1;
11939  }
11940  return -1;
11941}
11942function validateProps(rawProps, props, instance) {
11943  const resolvedValues = (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.toRaw)(props);
11944  const options = instance.propsOptions[0];
11945  for (const key in options) {
11946    let opt = options[key];
11947    if (opt == null) continue;
11948    validateProp(
11949      key,
11950      resolvedValues[key],
11951      opt,
11952       true ? (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.shallowReadonly)(resolvedValues) : 0,
11953      !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(rawProps, key) && !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(rawProps, (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hyphenate)(key))
11954    );
11955  }
11956}
11957function validateProp(name, value, prop, props, isAbsent) {
11958  const { type, required, validator, skipCheck } = prop;
11959  if (required && isAbsent) {
11960    warn$1('Missing required prop: "' + name + '"');
11961    return;
11962  }
11963  if (value == null && !required) {
11964    return;
11965  }
11966  if (type != null && type !== true && !skipCheck) {
11967    let isValid = false;
11968    const types = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(type) ? type : [type];
11969    const expectedTypes = [];
11970    for (let i = 0; i < types.length && !isValid; i++) {
11971      const { valid, expectedType } = assertType(value, types[i]);
11972      expectedTypes.push(expectedType || "");
11973      isValid = valid;
11974    }
11975    if (!isValid) {
11976      warn$1(getInvalidTypeMessage(name, value, expectedTypes));
11977      return;
11978    }
11979  }
11980  if (validator && !validator(value, props)) {
11981    warn$1('Invalid prop: custom validator check failed for prop "' + name + '".');
11982  }
11983}
11984const isSimpleType = /* @__PURE__ */ (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.makeMap)(
11985  "String,Number,Boolean,Function,Symbol,BigInt"
11986);
11987function assertType(value, type) {
11988  let valid;
11989  const expectedType = getType(type);
11990  if (isSimpleType(expectedType)) {
11991    const t = typeof value;
11992    valid = t === expectedType.toLowerCase();
11993    if (!valid && t === "object") {
11994      valid = value instanceof type;
11995    }
11996  } else if (expectedType === "Object") {
11997    valid = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isObject)(value);
11998  } else if (expectedType === "Array") {
11999    valid = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(value);
12000  } else if (expectedType === "null") {
12001    valid = value === null;
12002  } else {
12003    valid = value instanceof type;
12004  }
12005  return {
12006    valid,
12007    expectedType
12008  };
12009}
12010function getInvalidTypeMessage(name, value, expectedTypes) {
12011  if (expectedTypes.length === 0) {
12012    return `Prop type [] for prop "${name}" won't match anything. Did you mean to use type Array instead?`;
12013  }
12014  let message = `Invalid prop: type check failed for prop "${name}". Expected ${expectedTypes.map(_vue_shared__WEBPACK_IMPORTED_MODULE_1__.capitalize).join(" | ")}`;
12015  const expectedType = expectedTypes[0];
12016  const receivedType = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.toRawType)(value);
12017  const expectedValue = styleValue(value, expectedType);
12018  const receivedValue = styleValue(value, receivedType);
12019  if (expectedTypes.length === 1 && isExplicable(expectedType) && !isBoolean(expectedType, receivedType)) {
12020    message += ` with value ${expectedValue}`;
12021  }
12022  message += `, got ${receivedType} `;
12023  if (isExplicable(receivedType)) {
12024    message += `with value ${receivedValue}.`;
12025  }
12026  return message;
12027}
12028function styleValue(value, type) {
12029  if (type === "String") {
12030    return `"${value}"`;
12031  } else if (type === "Number") {
12032    return `${Number(value)}`;
12033  } else {
12034    return `${value}`;
12035  }
12036}
12037function isExplicable(type) {
12038  const explicitTypes = ["string", "number", "boolean"];
12039  return explicitTypes.some((elem) => type.toLowerCase() === elem);
12040}
12041function isBoolean(...args) {
12042  return args.some((elem) => elem.toLowerCase() === "boolean");
12043}
12044
12045const isInternalKey = (key) => key[0] === "_" || key === "$stable";
12046const normalizeSlotValue = (value) => (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(value) ? value.map(normalizeVNode) : [normalizeVNode(value)];
12047const normalizeSlot = (key, rawSlot, ctx) => {
12048  if (rawSlot._n) {
12049    return rawSlot;
12050  }
12051  const normalized = withCtx((...args) => {
12052    if ( true && currentInstance && (!ctx || ctx.root === currentInstance.root)) {
12053      warn$1(
12054        `Slot "${key}" invoked outside of the render function: this will not track dependencies used in the slot. Invoke the slot function inside the render function instead.`
12055      );
12056    }
12057    return normalizeSlotValue(rawSlot(...args));
12058  }, ctx);
12059  normalized._c = false;
12060  return normalized;
12061};
12062const normalizeObjectSlots = (rawSlots, slots, instance) => {
12063  const ctx = rawSlots._ctx;
12064  for (const key in rawSlots) {
12065    if (isInternalKey(key)) continue;
12066    const value = rawSlots[key];
12067    if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(value)) {
12068      slots[key] = normalizeSlot(key, value, ctx);
12069    } else if (value != null) {
12070      if (true) {
12071        warn$1(
12072          `Non-function value encountered for slot "${key}". Prefer function slots for better performance.`
12073        );
12074      }
12075      const normalized = normalizeSlotValue(value);
12076      slots[key] = () => normalized;
12077    }
12078  }
12079};
12080const normalizeVNodeSlots = (instance, children) => {
12081  if ( true && !isKeepAlive(instance.vnode) && true) {
12082    warn$1(
12083      `Non-function value encountered for default slot. Prefer function slots for better performance.`
12084    );
12085  }
12086  const normalized = normalizeSlotValue(children);
12087  instance.slots.default = () => normalized;
12088};
12089const assignSlots = (slots, children, optimized) => {
12090  for (const key in children) {
12091    if (optimized || key !== "_") {
12092      slots[key] = children[key];
12093    }
12094  }
12095};
12096const initSlots = (instance, children, optimized) => {
12097  const slots = instance.slots = createInternalObject();
12098  if (instance.vnode.shapeFlag & 32) {
12099    const type = children._;
12100    if (type) {
12101      assignSlots(slots, children, optimized);
12102      if (optimized) {
12103        (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.def)(slots, "_", type, true);
12104      }
12105    } else {
12106      normalizeObjectSlots(children, slots);
12107    }
12108  } else if (children) {
12109    normalizeVNodeSlots(instance, children);
12110  }
12111};
12112const updateSlots = (instance, children, optimized) => {
12113  const { vnode, slots } = instance;
12114  let needDeletionCheck = true;
12115  let deletionComparisonTarget = _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ;
12116  if (vnode.shapeFlag & 32) {
12117    const type = children._;
12118    if (type) {
12119      if ( true && isHmrUpdating) {
12120        assignSlots(slots, children, optimized);
12121        (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.trigger)(instance, "set", "$slots");
12122      } else if (optimized && type === 1) {
12123        needDeletionCheck = false;
12124      } else {
12125        assignSlots(slots, children, optimized);
12126      }
12127    } else {
12128      needDeletionCheck = !children.$stable;
12129      normalizeObjectSlots(children, slots);
12130    }
12131    deletionComparisonTarget = children;
12132  } else if (children) {
12133    normalizeVNodeSlots(instance, children);
12134    deletionComparisonTarget = { default: 1 };
12135  }
12136  if (needDeletionCheck) {
12137    for (const key in slots) {
12138      if (!isInternalKey(key) && deletionComparisonTarget[key] == null) {
12139        delete slots[key];
12140      }
12141    }
12142  }
12143};
12144
12145function setRef(rawRef, oldRawRef, parentSuspense, vnode, isUnmount = false) {
12146  if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(rawRef)) {
12147    rawRef.forEach(
12148      (r, i) => setRef(
12149        r,
12150        oldRawRef && ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(oldRawRef) ? oldRawRef[i] : oldRawRef),
12151        parentSuspense,
12152        vnode,
12153        isUnmount
12154      )
12155    );
12156    return;
12157  }
12158  if (isAsyncWrapper(vnode) && !isUnmount) {
12159    return;
12160  }
12161  const refValue = vnode.shapeFlag & 4 ? getComponentPublicInstance(vnode.component) : vnode.el;
12162  const value = isUnmount ? null : refValue;
12163  const { i: owner, r: ref } = rawRef;
12164  if ( true && !owner) {
12165    warn$1(
12166      `Missing ref owner context. ref cannot be used on hoisted vnodes. A vnode with ref must be created inside the render function.`
12167    );
12168    return;
12169  }
12170  const oldRef = oldRawRef && oldRawRef.r;
12171  const refs = owner.refs === _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ ? owner.refs = {} : owner.refs;
12172  const setupState = owner.setupState;
12173  if (oldRef != null && oldRef !== ref) {
12174    if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isString)(oldRef)) {
12175      refs[oldRef] = null;
12176      if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(setupState, oldRef)) {
12177        setupState[oldRef] = null;
12178      }
12179    } else if ((0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isRef)(oldRef)) {
12180      oldRef.value = null;
12181    }
12182  }
12183  if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(ref)) {
12184    callWithErrorHandling(ref, owner, 12, [value, refs]);
12185  } else {
12186    const _isString = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isString)(ref);
12187    const _isRef = (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isRef)(ref);
12188    if (_isString || _isRef) {
12189      const doSet = () => {
12190        if (rawRef.f) {
12191          const existing = _isString ? (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(setupState, ref) ? setupState[ref] : refs[ref] : ref.value;
12192          if (isUnmount) {
12193            (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(existing) && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.remove)(existing, refValue);
12194          } else {
12195            if (!(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(existing)) {
12196              if (_isString) {
12197                refs[ref] = [refValue];
12198                if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(setupState, ref)) {
12199                  setupState[ref] = refs[ref];
12200                }
12201              } else {
12202                ref.value = [refValue];
12203                if (rawRef.k) refs[rawRef.k] = ref.value;
12204              }
12205            } else if (!existing.includes(refValue)) {
12206              existing.push(refValue);
12207            }
12208          }
12209        } else if (_isString) {
12210          refs[ref] = value;
12211          if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(setupState, ref)) {
12212            setupState[ref] = value;
12213          }
12214        } else if (_isRef) {
12215          ref.value = value;
12216          if (rawRef.k) refs[rawRef.k] = value;
12217        } else if (true) {
12218          warn$1("Invalid template ref type:", ref, `(${typeof ref})`);
12219        }
12220      };
12221      if (value) {
12222        doSet.id = -1;
12223        queuePostRenderEffect(doSet, parentSuspense);
12224      } else {
12225        doSet();
12226      }
12227    } else if (true) {
12228      warn$1("Invalid template ref type:", ref, `(${typeof ref})`);
12229    }
12230  }
12231}
12232
12233const TeleportEndKey = Symbol("_vte");
12234const isTeleport = (type) => type.__isTeleport;
12235const isTeleportDisabled = (props) => props && (props.disabled || props.disabled === "");
12236const isTargetSVG = (target) => typeof SVGElement !== "undefined" && target instanceof SVGElement;
12237const isTargetMathML = (target) => typeof MathMLElement === "function" && target instanceof MathMLElement;
12238const resolveTarget = (props, select) => {
12239  const targetSelector = props && props.to;
12240  if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isString)(targetSelector)) {
12241    if (!select) {
12242       true && warn$1(
12243        `Current renderer does not support string target for Teleports. (missing querySelector renderer option)`
12244      );
12245      return null;
12246    } else {
12247      const target = select(targetSelector);
12248      if ( true && !target && !isTeleportDisabled(props)) {
12249        warn$1(
12250          `Failed to locate Teleport target with selector "${targetSelector}". Note the target element must exist before the component is mounted - i.e. the target cannot be rendered by the component itself, and ideally should be outside of the entire Vue component tree.`
12251        );
12252      }
12253      return target;
12254    }
12255  } else {
12256    if ( true && !targetSelector && !isTeleportDisabled(props)) {
12257      warn$1(`Invalid Teleport target: ${targetSelector}`);
12258    }
12259    return targetSelector;
12260  }
12261};
12262const TeleportImpl = {
12263  name: "Teleport",
12264  __isTeleport: true,
12265  process(n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized, internals) {
12266    const {
12267      mc: mountChildren,
12268      pc: patchChildren,
12269      pbc: patchBlockChildren,
12270      o: { insert, querySelector, createText, createComment }
12271    } = internals;
12272    const disabled = isTeleportDisabled(n2.props);
12273    let { shapeFlag, children, dynamicChildren } = n2;
12274    if ( true && isHmrUpdating) {
12275      optimized = false;
12276      dynamicChildren = null;
12277    }
12278    if (n1 == null) {
12279      const placeholder = n2.el =  true ? createComment("teleport start") : 0;
12280      const mainAnchor = n2.anchor =  true ? createComment("teleport end") : 0;
12281      const target = n2.target = resolveTarget(n2.props, querySelector);
12282      const targetStart = n2.targetStart = createText("");
12283      const targetAnchor = n2.targetAnchor = createText("");
12284      insert(placeholder, container, anchor);
12285      insert(mainAnchor, container, anchor);
12286      targetStart[TeleportEndKey] = targetAnchor;
12287      if (target) {
12288        insert(targetStart, target);
12289        insert(targetAnchor, target);
12290        if (namespace === "svg" || isTargetSVG(target)) {
12291          namespace = "svg";
12292        } else if (namespace === "mathml" || isTargetMathML(target)) {
12293          namespace = "mathml";
12294        }
12295      } else if ( true && !disabled) {
12296        warn$1("Invalid Teleport target on mount:", target, `(${typeof target})`);
12297      }
12298      const mount = (container2, anchor2) => {
12299        if (shapeFlag & 16) {
12300          mountChildren(
12301            children,
12302            container2,
12303            anchor2,
12304            parentComponent,
12305            parentSuspense,
12306            namespace,
12307            slotScopeIds,
12308            optimized
12309          );
12310        }
12311      };
12312      if (disabled) {
12313        mount(container, mainAnchor);
12314      } else if (target) {
12315        mount(target, targetAnchor);
12316      }
12317    } else {
12318      n2.el = n1.el;
12319      n2.targetStart = n1.targetStart;
12320      const mainAnchor = n2.anchor = n1.anchor;
12321      const target = n2.target = n1.target;
12322      const targetAnchor = n2.targetAnchor = n1.targetAnchor;
12323      const wasDisabled = isTeleportDisabled(n1.props);
12324      const currentContainer = wasDisabled ? container : target;
12325      const currentAnchor = wasDisabled ? mainAnchor : targetAnchor;
12326      if (namespace === "svg" || isTargetSVG(target)) {
12327        namespace = "svg";
12328      } else if (namespace === "mathml" || isTargetMathML(target)) {
12329        namespace = "mathml";
12330      }
12331      if (dynamicChildren) {
12332        patchBlockChildren(
12333          n1.dynamicChildren,
12334          dynamicChildren,
12335          currentContainer,
12336          parentComponent,
12337          parentSuspense,
12338          namespace,
12339          slotScopeIds
12340        );
12341        traverseStaticChildren(n1, n2, true);
12342      } else if (!optimized) {
12343        patchChildren(
12344          n1,
12345          n2,
12346          currentContainer,
12347          currentAnchor,
12348          parentComponent,
12349          parentSuspense,
12350          namespace,
12351          slotScopeIds,
12352          false
12353        );
12354      }
12355      if (disabled) {
12356        if (!wasDisabled) {
12357          moveTeleport(
12358            n2,
12359            container,
12360            mainAnchor,
12361            internals,
12362            1
12363          );
12364        } else {
12365          if (n2.props && n1.props && n2.props.to !== n1.props.to) {
12366            n2.props.to = n1.props.to;
12367          }
12368        }
12369      } else {
12370        if ((n2.props && n2.props.to) !== (n1.props && n1.props.to)) {
12371          const nextTarget = n2.target = resolveTarget(
12372            n2.props,
12373            querySelector
12374          );
12375          if (nextTarget) {
12376            moveTeleport(
12377              n2,
12378              nextTarget,
12379              null,
12380              internals,
12381              0
12382            );
12383          } else if (true) {
12384            warn$1(
12385              "Invalid Teleport target on update:",
12386              target,
12387              `(${typeof target})`
12388            );
12389          }
12390        } else if (wasDisabled) {
12391          moveTeleport(
12392            n2,
12393            target,
12394            targetAnchor,
12395            internals,
12396            1
12397          );
12398        }
12399      }
12400    }
12401    updateCssVars(n2);
12402  },
12403  remove(vnode, parentComponent, parentSuspense, { um: unmount, o: { remove: hostRemove } }, doRemove) {
12404    const {
12405      shapeFlag,
12406      children,
12407      anchor,
12408      targetStart,
12409      targetAnchor,
12410      target,
12411      props
12412    } = vnode;
12413    if (target) {
12414      hostRemove(targetStart);
12415      hostRemove(targetAnchor);
12416    }
12417    doRemove && hostRemove(anchor);
12418    if (shapeFlag & 16) {
12419      const shouldRemove = doRemove || !isTeleportDisabled(props);
12420      for (let i = 0; i < children.length; i++) {
12421        const child = children[i];
12422        unmount(
12423          child,
12424          parentComponent,
12425          parentSuspense,
12426          shouldRemove,
12427          !!child.dynamicChildren
12428        );
12429      }
12430    }
12431  },
12432  move: moveTeleport,
12433  hydrate: hydrateTeleport
12434};
12435function moveTeleport(vnode, container, parentAnchor, { o: { insert }, m: move }, moveType = 2) {
12436  if (moveType === 0) {
12437    insert(vnode.targetAnchor, container, parentAnchor);
12438  }
12439  const { el, anchor, shapeFlag, children, props } = vnode;
12440  const isReorder = moveType === 2;
12441  if (isReorder) {
12442    insert(el, container, parentAnchor);
12443  }
12444  if (!isReorder || isTeleportDisabled(props)) {
12445    if (shapeFlag & 16) {
12446      for (let i = 0; i < children.length; i++) {
12447        move(
12448          children[i],
12449          container,
12450          parentAnchor,
12451          2
12452        );
12453      }
12454    }
12455  }
12456  if (isReorder) {
12457    insert(anchor, container, parentAnchor);
12458  }
12459}
12460function hydrateTeleport(node, vnode, parentComponent, parentSuspense, slotScopeIds, optimized, {
12461  o: { nextSibling, parentNode, querySelector }
12462}, hydrateChildren) {
12463  const target = vnode.target = resolveTarget(
12464    vnode.props,
12465    querySelector
12466  );
12467  if (target) {
12468    const targetNode = target._lpa || target.firstChild;
12469    if (vnode.shapeFlag & 16) {
12470      if (isTeleportDisabled(vnode.props)) {
12471        vnode.anchor = hydrateChildren(
12472          nextSibling(node),
12473          vnode,
12474          parentNode(node),
12475          parentComponent,
12476          parentSuspense,
12477          slotScopeIds,
12478          optimized
12479        );
12480        vnode.targetAnchor = targetNode;
12481      } else {
12482        vnode.anchor = nextSibling(node);
12483        let targetAnchor = targetNode;
12484        while (targetAnchor) {
12485          targetAnchor = nextSibling(targetAnchor);
12486          if (targetAnchor && targetAnchor.nodeType === 8 && targetAnchor.data === "teleport anchor") {
12487            vnode.targetAnchor = targetAnchor;
12488            target._lpa = vnode.targetAnchor && nextSibling(vnode.targetAnchor);
12489            break;
12490          }
12491        }
12492        hydrateChildren(
12493          targetNode,
12494          vnode,
12495          target,
12496          parentComponent,
12497          parentSuspense,
12498          slotScopeIds,
12499          optimized
12500        );
12501      }
12502    }
12503    updateCssVars(vnode);
12504  }
12505  return vnode.anchor && nextSibling(vnode.anchor);
12506}
12507const Teleport = TeleportImpl;
12508function updateCssVars(vnode) {
12509  const ctx = vnode.ctx;
12510  if (ctx && ctx.ut) {
12511    let node = vnode.children[0].el;
12512    while (node && node !== vnode.targetAnchor) {
12513      if (node.nodeType === 1) node.setAttribute("data-v-owner", ctx.uid);
12514      node = node.nextSibling;
12515    }
12516    ctx.ut();
12517  }
12518}
12519
12520let hasLoggedMismatchError = false;
12521const logMismatchError = () => {
12522  if (hasLoggedMismatchError) {
12523    return;
12524  }
12525  console.error("Hydration completed but contains mismatches.");
12526  hasLoggedMismatchError = true;
12527};
12528const isSVGContainer = (container) => container.namespaceURI.includes("svg") && container.tagName !== "foreignObject";
12529const isMathMLContainer = (container) => container.namespaceURI.includes("MathML");
12530const getContainerType = (container) => {
12531  if (isSVGContainer(container)) return "svg";
12532  if (isMathMLContainer(container)) return "mathml";
12533  return void 0;
12534};
12535const isComment = (node) => node.nodeType === 8 /* COMMENT */;
12536function createHydrationFunctions(rendererInternals) {
12537  const {
12538    mt: mountComponent,
12539    p: patch,
12540    o: {
12541      patchProp,
12542      createText,
12543      nextSibling,
12544      parentNode,
12545      remove,
12546      insert,
12547      createComment
12548    }
12549  } = rendererInternals;
12550  const hydrate = (vnode, container) => {
12551    if (!container.hasChildNodes()) {
12552      ( true) && warn$1(
12553        `Attempting to hydrate existing markup but container is empty. Performing full mount instead.`
12554      );
12555      patch(null, vnode, container);
12556      flushPostFlushCbs();
12557      container._vnode = vnode;
12558      return;
12559    }
12560    hydrateNode(container.firstChild, vnode, null, null, null);
12561    flushPostFlushCbs();
12562    container._vnode = vnode;
12563  };
12564  const hydrateNode = (node, vnode, parentComponent, parentSuspense, slotScopeIds, optimized = false) => {
12565    optimized = optimized || !!vnode.dynamicChildren;
12566    const isFragmentStart = isComment(node) && node.data === "[";
12567    const onMismatch = () => handleMismatch(
12568      node,
12569      vnode,
12570      parentComponent,
12571      parentSuspense,
12572      slotScopeIds,
12573      isFragmentStart
12574    );
12575    const { type, ref, shapeFlag, patchFlag } = vnode;
12576    let domType = node.nodeType;
12577    vnode.el = node;
12578    if (true) {
12579      (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.def)(node, "__vnode", vnode, true);
12580      (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.def)(node, "__vueParentComponent", parentComponent, true);
12581    }
12582    if (patchFlag === -2) {
12583      optimized = false;
12584      vnode.dynamicChildren = null;
12585    }
12586    let nextNode = null;
12587    switch (type) {
12588      case Text:
12589        if (domType !== 3 /* TEXT */) {
12590          if (vnode.children === "") {
12591            insert(vnode.el = createText(""), parentNode(node), node);
12592            nextNode = node;
12593          } else {
12594            nextNode = onMismatch();
12595          }
12596        } else {
12597          if (node.data !== vnode.children) {
12598            ( true) && warn$1(
12599              `Hydration text mismatch in`,
12600              node.parentNode,
12601              `
12602  - rendered on server: ${JSON.stringify(
12603                node.data
12604              )}
12605  - expected on client: ${JSON.stringify(vnode.children)}`
12606            );
12607            logMismatchError();
12608            node.data = vnode.children;
12609          }
12610          nextNode = nextSibling(node);
12611        }
12612        break;
12613      case Comment:
12614        if (isTemplateNode(node)) {
12615          nextNode = nextSibling(node);
12616          replaceNode(
12617            vnode.el = node.content.firstChild,
12618            node,
12619            parentComponent
12620          );
12621        } else if (domType !== 8 /* COMMENT */ || isFragmentStart) {
12622          nextNode = onMismatch();
12623        } else {
12624          nextNode = nextSibling(node);
12625        }
12626        break;
12627      case Static:
12628        if (isFragmentStart) {
12629          node = nextSibling(node);
12630          domType = node.nodeType;
12631        }
12632        if (domType === 1 /* ELEMENT */ || domType === 3 /* TEXT */) {
12633          nextNode = node;
12634          const needToAdoptContent = !vnode.children.length;
12635          for (let i = 0; i < vnode.staticCount; i++) {
12636            if (needToAdoptContent)
12637              vnode.children += nextNode.nodeType === 1 /* ELEMENT */ ? nextNode.outerHTML : nextNode.data;
12638            if (i === vnode.staticCount - 1) {
12639              vnode.anchor = nextNode;
12640            }
12641            nextNode = nextSibling(nextNode);
12642          }
12643          return isFragmentStart ? nextSibling(nextNode) : nextNode;
12644        } else {
12645          onMismatch();
12646        }
12647        break;
12648      case Fragment:
12649        if (!isFragmentStart) {
12650          nextNode = onMismatch();
12651        } else {
12652          nextNode = hydrateFragment(
12653            node,
12654            vnode,
12655            parentComponent,
12656            parentSuspense,
12657            slotScopeIds,
12658            optimized
12659          );
12660        }
12661        break;
12662      default:
12663        if (shapeFlag & 1) {
12664          if ((domType !== 1 /* ELEMENT */ || vnode.type.toLowerCase() !== node.tagName.toLowerCase()) && !isTemplateNode(node)) {
12665            nextNode = onMismatch();
12666          } else {
12667            nextNode = hydrateElement(
12668              node,
12669              vnode,
12670              parentComponent,
12671              parentSuspense,
12672              slotScopeIds,
12673              optimized
12674            );
12675          }
12676        } else if (shapeFlag & 6) {
12677          vnode.slotScopeIds = slotScopeIds;
12678          const container = parentNode(node);
12679          if (isFragmentStart) {
12680            nextNode = locateClosingAnchor(node);
12681          } else if (isComment(node) && node.data === "teleport start") {
12682            nextNode = locateClosingAnchor(node, node.data, "teleport end");
12683          } else {
12684            nextNode = nextSibling(node);
12685          }
12686          mountComponent(
12687            vnode,
12688            container,
12689            null,
12690            parentComponent,
12691            parentSuspense,
12692            getContainerType(container),
12693            optimized
12694          );
12695          if (isAsyncWrapper(vnode)) {
12696            let subTree;
12697            if (isFragmentStart) {
12698              subTree = createVNode(Fragment);
12699              subTree.anchor = nextNode ? nextNode.previousSibling : container.lastChild;
12700            } else {
12701              subTree = node.nodeType === 3 ? createTextVNode("") : createVNode("div");
12702            }
12703            subTree.el = node;
12704            vnode.component.subTree = subTree;
12705          }
12706        } else if (shapeFlag & 64) {
12707          if (domType !== 8 /* COMMENT */) {
12708            nextNode = onMismatch();
12709          } else {
12710            nextNode = vnode.type.hydrate(
12711              node,
12712              vnode,
12713              parentComponent,
12714              parentSuspense,
12715              slotScopeIds,
12716              optimized,
12717              rendererInternals,
12718              hydrateChildren
12719            );
12720          }
12721        } else if (shapeFlag & 128) {
12722          nextNode = vnode.type.hydrate(
12723            node,
12724            vnode,
12725            parentComponent,
12726            parentSuspense,
12727            getContainerType(parentNode(node)),
12728            slotScopeIds,
12729            optimized,
12730            rendererInternals,
12731            hydrateNode
12732          );
12733        } else if (true) {
12734          warn$1("Invalid HostVNode type:", type, `(${typeof type})`);
12735        }
12736    }
12737    if (ref != null) {
12738      setRef(ref, null, parentSuspense, vnode);
12739    }
12740    return nextNode;
12741  };
12742  const hydrateElement = (el, vnode, parentComponent, parentSuspense, slotScopeIds, optimized) => {
12743    optimized = optimized || !!vnode.dynamicChildren;
12744    const { type, props, patchFlag, shapeFlag, dirs, transition } = vnode;
12745    const forcePatch = type === "input" || type === "option";
12746    if (true) {
12747      if (dirs) {
12748        invokeDirectiveHook(vnode, null, parentComponent, "created");
12749      }
12750      let needCallTransitionHooks = false;
12751      if (isTemplateNode(el)) {
12752        needCallTransitionHooks = needTransition(parentSuspense, transition) && parentComponent && parentComponent.vnode.props && parentComponent.vnode.props.appear;
12753        const content = el.content.firstChild;
12754        if (needCallTransitionHooks) {
12755          transition.beforeEnter(content);
12756        }
12757        replaceNode(content, el, parentComponent);
12758        vnode.el = el = content;
12759      }
12760      if (shapeFlag & 16 && // skip if element has innerHTML / textContent
12761      !(props && (props.innerHTML || props.textContent))) {
12762        let next = hydrateChildren(
12763          el.firstChild,
12764          vnode,
12765          el,
12766          parentComponent,
12767          parentSuspense,
12768          slotScopeIds,
12769          optimized
12770        );
12771        let hasWarned = false;
12772        while (next) {
12773          if (( true) && !hasWarned) {
12774            warn$1(
12775              `Hydration children mismatch on`,
12776              el,
12777              `
12778Server rendered element contains more child nodes than client vdom.`
12779            );
12780            hasWarned = true;
12781          }
12782          logMismatchError();
12783          const cur = next;
12784          next = next.nextSibling;
12785          remove(cur);
12786        }
12787      } else if (shapeFlag & 8) {
12788        if (el.textContent !== vnode.children) {
12789          ( true) && warn$1(
12790            `Hydration text content mismatch on`,
12791            el,
12792            `
12793  - rendered on server: ${el.textContent}
12794  - expected on client: ${vnode.children}`
12795          );
12796          logMismatchError();
12797          el.textContent = vnode.children;
12798        }
12799      }
12800      if (props) {
12801        if (true) {
12802          for (const key in props) {
12803            if (( true) && // #11189 skip if this node has directives that have created hooks
12804            // as it could have mutated the DOM in any possible way
12805            !(dirs && dirs.some((d) => d.dir.created)) && propHasMismatch(el, key, props[key], vnode, parentComponent)) {
12806              logMismatchError();
12807            }
12808            if (forcePatch && (key.endsWith("value") || key === "indeterminate") || (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isOn)(key) && !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isReservedProp)(key) || // force hydrate v-bind with .prop modifiers
12809            key[0] === ".") {
12810              patchProp(el, key, null, props[key], void 0, parentComponent);
12811            }
12812          }
12813        } else {}
12814      }
12815      let vnodeHooks;
12816      if (vnodeHooks = props && props.onVnodeBeforeMount) {
12817        invokeVNodeHook(vnodeHooks, parentComponent, vnode);
12818      }
12819      if (dirs) {
12820        invokeDirectiveHook(vnode, null, parentComponent, "beforeMount");
12821      }
12822      if ((vnodeHooks = props && props.onVnodeMounted) || dirs || needCallTransitionHooks) {
12823        queueEffectWithSuspense(() => {
12824          vnodeHooks && invokeVNodeHook(vnodeHooks, parentComponent, vnode);
12825          needCallTransitionHooks && transition.enter(el);
12826          dirs && invokeDirectiveHook(vnode, null, parentComponent, "mounted");
12827        }, parentSuspense);
12828      }
12829    }
12830    return el.nextSibling;
12831  };
12832  const hydrateChildren = (node, parentVNode, container, parentComponent, parentSuspense, slotScopeIds, optimized) => {
12833    optimized = optimized || !!parentVNode.dynamicChildren;
12834    const children = parentVNode.children;
12835    const l = children.length;
12836    let hasWarned = false;
12837    for (let i = 0; i < l; i++) {
12838      const vnode = optimized ? children[i] : children[i] = normalizeVNode(children[i]);
12839      const isText = vnode.type === Text;
12840      if (node) {
12841        if (isText && !optimized) {
12842          let next = children[i + 1];
12843          if (next && (next = normalizeVNode(next)).type === Text) {
12844            insert(
12845              createText(
12846                node.data.slice(vnode.children.length)
12847              ),
12848              container,
12849              nextSibling(node)
12850            );
12851            node.data = vnode.children;
12852          }
12853        }
12854        node = hydrateNode(
12855          node,
12856          vnode,
12857          parentComponent,
12858          parentSuspense,
12859          slotScopeIds,
12860          optimized
12861        );
12862      } else if (isText && !vnode.children) {
12863        insert(vnode.el = createText(""), container);
12864      } else {
12865        if (( true) && !hasWarned) {
12866          warn$1(
12867            `Hydration children mismatch on`,
12868            container,
12869            `
12870Server rendered element contains fewer child nodes than client vdom.`
12871          );
12872          hasWarned = true;
12873        }
12874        logMismatchError();
12875        patch(
12876          null,
12877          vnode,
12878          container,
12879          null,
12880          parentComponent,
12881          parentSuspense,
12882          getContainerType(container),
12883          slotScopeIds
12884        );
12885      }
12886    }
12887    return node;
12888  };
12889  const hydrateFragment = (node, vnode, parentComponent, parentSuspense, slotScopeIds, optimized) => {
12890    const { slotScopeIds: fragmentSlotScopeIds } = vnode;
12891    if (fragmentSlotScopeIds) {
12892      slotScopeIds = slotScopeIds ? slotScopeIds.concat(fragmentSlotScopeIds) : fragmentSlotScopeIds;
12893    }
12894    const container = parentNode(node);
12895    const next = hydrateChildren(
12896      nextSibling(node),
12897      vnode,
12898      container,
12899      parentComponent,
12900      parentSuspense,
12901      slotScopeIds,
12902      optimized
12903    );
12904    if (next && isComment(next) && next.data === "]") {
12905      return nextSibling(vnode.anchor = next);
12906    } else {
12907      logMismatchError();
12908      insert(vnode.anchor = createComment(`]`), container, next);
12909      return next;
12910    }
12911  };
12912  const handleMismatch = (node, vnode, parentComponent, parentSuspense, slotScopeIds, isFragment) => {
12913    ( true) && warn$1(
12914      `Hydration node mismatch:
12915- rendered on server:`,
12916      node,
12917      node.nodeType === 3 /* TEXT */ ? `(text)` : isComment(node) && node.data === "[" ? `(start of fragment)` : ``,
12918      `
12919- expected on client:`,
12920      vnode.type
12921    );
12922    logMismatchError();
12923    vnode.el = null;
12924    if (isFragment) {
12925      const end = locateClosingAnchor(node);
12926      while (true) {
12927        const next2 = nextSibling(node);
12928        if (next2 && next2 !== end) {
12929          remove(next2);
12930        } else {
12931          break;
12932        }
12933      }
12934    }
12935    const next = nextSibling(node);
12936    const container = parentNode(node);
12937    remove(node);
12938    patch(
12939      null,
12940      vnode,
12941      container,
12942      next,
12943      parentComponent,
12944      parentSuspense,
12945      getContainerType(container),
12946      slotScopeIds
12947    );
12948    return next;
12949  };
12950  const locateClosingAnchor = (node, open = "[", close = "]") => {
12951    let match = 0;
12952    while (node) {
12953      node = nextSibling(node);
12954      if (node && isComment(node)) {
12955        if (node.data === open) match++;
12956        if (node.data === close) {
12957          if (match === 0) {
12958            return nextSibling(node);
12959          } else {
12960            match--;
12961          }
12962        }
12963      }
12964    }
12965    return node;
12966  };
12967  const replaceNode = (newNode, oldNode, parentComponent) => {
12968    const parentNode2 = oldNode.parentNode;
12969    if (parentNode2) {
12970      parentNode2.replaceChild(newNode, oldNode);
12971    }
12972    let parent = parentComponent;
12973    while (parent) {
12974      if (parent.vnode.el === oldNode) {
12975        parent.vnode.el = parent.subTree.el = newNode;
12976      }
12977      parent = parent.parent;
12978    }
12979  };
12980  const isTemplateNode = (node) => {
12981    return node.nodeType === 1 /* ELEMENT */ && node.tagName.toLowerCase() === "template";
12982  };
12983  return [hydrate, hydrateNode];
12984}
12985function propHasMismatch(el, key, clientValue, vnode, instance) {
12986  let mismatchType;
12987  let mismatchKey;
12988  let actual;
12989  let expected;
12990  if (key === "class") {
12991    actual = el.getAttribute("class");
12992    expected = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.normalizeClass)(clientValue);
12993    if (!isSetEqual(toClassSet(actual || ""), toClassSet(expected))) {
12994      mismatchType = mismatchKey = `class`;
12995    }
12996  } else if (key === "style") {
12997    actual = el.getAttribute("style") || "";
12998    expected = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isString)(clientValue) ? clientValue : (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.stringifyStyle)((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.normalizeStyle)(clientValue));
12999    const actualMap = toStyleMap(actual);
13000    const expectedMap = toStyleMap(expected);
13001    if (vnode.dirs) {
13002      for (const { dir, value } of vnode.dirs) {
13003        if (dir.name === "show" && !value) {
13004          expectedMap.set("display", "none");
13005        }
13006      }
13007    }
13008    if (instance) {
13009      resolveCssVars(instance, vnode, expectedMap);
13010    }
13011    if (!isMapEqual(actualMap, expectedMap)) {
13012      mismatchType = mismatchKey = "style";
13013    }
13014  } else if (el instanceof SVGElement && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isKnownSvgAttr)(key) || el instanceof HTMLElement && ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isBooleanAttr)(key) || (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isKnownHtmlAttr)(key))) {
13015    if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isBooleanAttr)(key)) {
13016      actual = el.hasAttribute(key);
13017      expected = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.includeBooleanAttr)(clientValue);
13018    } else if (clientValue == null) {
13019      actual = el.hasAttribute(key);
13020      expected = false;
13021    } else {
13022      if (el.hasAttribute(key)) {
13023        actual = el.getAttribute(key);
13024      } else if (key === "value" && el.tagName === "TEXTAREA") {
13025        actual = el.value;
13026      } else {
13027        actual = false;
13028      }
13029      expected = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isRenderableAttrValue)(clientValue) ? String(clientValue) : false;
13030    }
13031    if (actual !== expected) {
13032      mismatchType = `attribute`;
13033      mismatchKey = key;
13034    }
13035  }
13036  if (mismatchType) {
13037    const format = (v) => v === false ? `(not rendered)` : `${mismatchKey}="${v}"`;
13038    const preSegment = `Hydration ${mismatchType} mismatch on`;
13039    const postSegment = `
13040  - rendered on server: ${format(actual)}
13041  - expected on client: ${format(expected)}
13042  Note: this mismatch is check-only. The DOM will not be rectified in production due to performance overhead.
13043  You should fix the source of the mismatch.`;
13044    {
13045      warn$1(preSegment, el, postSegment);
13046    }
13047    return true;
13048  }
13049  return false;
13050}
13051function toClassSet(str) {
13052  return new Set(str.trim().split(/\s+/));
13053}
13054function isSetEqual(a, b) {
13055  if (a.size !== b.size) {
13056    return false;
13057  }
13058  for (const s of a) {
13059    if (!b.has(s)) {
13060      return false;
13061    }
13062  }
13063  return true;
13064}
13065function toStyleMap(str) {
13066  const styleMap = /* @__PURE__ */ new Map();
13067  for (const item of str.split(";")) {
13068    let [key, value] = item.split(":");
13069    key = key.trim();
13070    value = value && value.trim();
13071    if (key && value) {
13072      styleMap.set(key, value);
13073    }
13074  }
13075  return styleMap;
13076}
13077function isMapEqual(a, b) {
13078  if (a.size !== b.size) {
13079    return false;
13080  }
13081  for (const [key, value] of a) {
13082    if (value !== b.get(key)) {
13083      return false;
13084    }
13085  }
13086  return true;
13087}
13088function resolveCssVars(instance, vnode, expectedMap) {
13089  const root = instance.subTree;
13090  if (instance.getCssVars && (vnode === root || root && root.type === Fragment && root.children.includes(vnode))) {
13091    const cssVars = instance.getCssVars();
13092    for (const key in cssVars) {
13093      expectedMap.set(`--${key}`, String(cssVars[key]));
13094    }
13095  }
13096  if (vnode === root && instance.parent) {
13097    resolveCssVars(instance.parent, instance.vnode, expectedMap);
13098  }
13099}
13100
13101let supported;
13102let perf;
13103function startMeasure(instance, type) {
13104  if (instance.appContext.config.performance && isSupported()) {
13105    perf.mark(`vue-${type}-${instance.uid}`);
13106  }
13107  if (true) {
13108    devtoolsPerfStart(instance, type, isSupported() ? perf.now() : Date.now());
13109  }
13110}
13111function endMeasure(instance, type) {
13112  if (instance.appContext.config.performance && isSupported()) {
13113    const startTag = `vue-${type}-${instance.uid}`;
13114    const endTag = startTag + `:end`;
13115    perf.mark(endTag);
13116    perf.measure(
13117      `<${formatComponentName(instance, instance.type)}> ${type}`,
13118      startTag,
13119      endTag
13120    );
13121    perf.clearMarks(startTag);
13122    perf.clearMarks(endTag);
13123  }
13124  if (true) {
13125    devtoolsPerfEnd(instance, type, isSupported() ? perf.now() : Date.now());
13126  }
13127}
13128function isSupported() {
13129  if (supported !== void 0) {
13130    return supported;
13131  }
13132  if (typeof window !== "undefined" && window.performance) {
13133    supported = true;
13134    perf = window.performance;
13135  } else {
13136    supported = false;
13137  }
13138  return supported;
13139}
13140
13141function initFeatureFlags() {
13142  const needWarn = [];
13143  if (false) {}
13144  if (false) {}
13145  if (typeof __VUE_PROD_HYDRATION_MISMATCH_DETAILS__ !== "boolean") {
13146     true && needWarn.push(`__VUE_PROD_HYDRATION_MISMATCH_DETAILS__`);
13147    (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.getGlobalThis)().__VUE_PROD_HYDRATION_MISMATCH_DETAILS__ = false;
13148  }
13149  if ( true && needWarn.length) {
13150    const multi = needWarn.length > 1;
13151    console.warn(
13152      `Feature flag${multi ? `s` : ``} ${needWarn.join(", ")} ${multi ? `are` : `is`} not explicitly defined. You are running the esm-bundler build of Vue, which expects these compile-time feature flags to be globally injected via the bundler config in order to get better tree-shaking in the production bundle.
13153
13154For more details, see https://link.vuejs.org/feature-flags.`
13155    );
13156  }
13157}
13158
13159const queuePostRenderEffect = queueEffectWithSuspense ;
13160function createRenderer(options) {
13161  return baseCreateRenderer(options);
13162}
13163function createHydrationRenderer(options) {
13164  return baseCreateRenderer(options, createHydrationFunctions);
13165}
13166function baseCreateRenderer(options, createHydrationFns) {
13167  {
13168    initFeatureFlags();
13169  }
13170  const target = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.getGlobalThis)();
13171  target.__VUE__ = true;
13172  if (true) {
13173    setDevtoolsHook$1(target.__VUE_DEVTOOLS_GLOBAL_HOOK__, target);
13174  }
13175  const {
13176    insert: hostInsert,
13177    remove: hostRemove,
13178    patchProp: hostPatchProp,
13179    createElement: hostCreateElement,
13180    createText: hostCreateText,
13181    createComment: hostCreateComment,
13182    setText: hostSetText,
13183    setElementText: hostSetElementText,
13184    parentNode: hostParentNode,
13185    nextSibling: hostNextSibling,
13186    setScopeId: hostSetScopeId = _vue_shared__WEBPACK_IMPORTED_MODULE_1__.NOOP,
13187    insertStaticContent: hostInsertStaticContent
13188  } = options;
13189  const patch = (n1, n2, container, anchor = null, parentComponent = null, parentSuspense = null, namespace = void 0, slotScopeIds = null, optimized =  true && isHmrUpdating ? false : !!n2.dynamicChildren) => {
13190    if (n1 === n2) {
13191      return;
13192    }
13193    if (n1 && !isSameVNodeType(n1, n2)) {
13194      anchor = getNextHostNode(n1);
13195      unmount(n1, parentComponent, parentSuspense, true);
13196      n1 = null;
13197    }
13198    if (n2.patchFlag === -2) {
13199      optimized = false;
13200      n2.dynamicChildren = null;
13201    }
13202    const { type, ref, shapeFlag } = n2;
13203    switch (type) {
13204      case Text:
13205        processText(n1, n2, container, anchor);
13206        break;
13207      case Comment:
13208        processCommentNode(n1, n2, container, anchor);
13209        break;
13210      case Static:
13211        if (n1 == null) {
13212          mountStaticNode(n2, container, anchor, namespace);
13213        } else if (true) {
13214          patchStaticNode(n1, n2, container, namespace);
13215        }
13216        break;
13217      case Fragment:
13218        processFragment(
13219          n1,
13220          n2,
13221          container,
13222          anchor,
13223          parentComponent,
13224          parentSuspense,
13225          namespace,
13226          slotScopeIds,
13227          optimized
13228        );
13229        break;
13230      default:
13231        if (shapeFlag & 1) {
13232          processElement(
13233            n1,
13234            n2,
13235            container,
13236            anchor,
13237            parentComponent,
13238            parentSuspense,
13239            namespace,
13240            slotScopeIds,
13241            optimized
13242          );
13243        } else if (shapeFlag & 6) {
13244          processComponent(
13245            n1,
13246            n2,
13247            container,
13248            anchor,
13249            parentComponent,
13250            parentSuspense,
13251            namespace,
13252            slotScopeIds,
13253            optimized
13254          );
13255        } else if (shapeFlag & 64) {
13256          type.process(
13257            n1,
13258            n2,
13259            container,
13260            anchor,
13261            parentComponent,
13262            parentSuspense,
13263            namespace,
13264            slotScopeIds,
13265            optimized,
13266            internals
13267          );
13268        } else if (shapeFlag & 128) {
13269          type.process(
13270            n1,
13271            n2,
13272            container,
13273            anchor,
13274            parentComponent,
13275            parentSuspense,
13276            namespace,
13277            slotScopeIds,
13278            optimized,
13279            internals
13280          );
13281        } else if (true) {
13282          warn$1("Invalid VNode type:", type, `(${typeof type})`);
13283        }
13284    }
13285    if (ref != null && parentComponent) {
13286      setRef(ref, n1 && n1.ref, parentSuspense, n2 || n1, !n2);
13287    }
13288  };
13289  const processText = (n1, n2, container, anchor) => {
13290    if (n1 == null) {
13291      hostInsert(
13292        n2.el = hostCreateText(n2.children),
13293        container,
13294        anchor
13295      );
13296    } else {
13297      const el = n2.el = n1.el;
13298      if (n2.children !== n1.children) {
13299        hostSetText(el, n2.children);
13300      }
13301    }
13302  };
13303  const processCommentNode = (n1, n2, container, anchor) => {
13304    if (n1 == null) {
13305      hostInsert(
13306        n2.el = hostCreateComment(n2.children || ""),
13307        container,
13308        anchor
13309      );
13310    } else {
13311      n2.el = n1.el;
13312    }
13313  };
13314  const mountStaticNode = (n2, container, anchor, namespace) => {
13315    [n2.el, n2.anchor] = hostInsertStaticContent(
13316      n2.children,
13317      container,
13318      anchor,
13319      namespace,
13320      n2.el,
13321      n2.anchor
13322    );
13323  };
13324  const patchStaticNode = (n1, n2, container, namespace) => {
13325    if (n2.children !== n1.children) {
13326      const anchor = hostNextSibling(n1.anchor);
13327      removeStaticNode(n1);
13328      [n2.el, n2.anchor] = hostInsertStaticContent(
13329        n2.children,
13330        container,
13331        anchor,
13332        namespace
13333      );
13334    } else {
13335      n2.el = n1.el;
13336      n2.anchor = n1.anchor;
13337    }
13338  };
13339  const moveStaticNode = ({ el, anchor }, container, nextSibling) => {
13340    let next;
13341    while (el && el !== anchor) {
13342      next = hostNextSibling(el);
13343      hostInsert(el, container, nextSibling);
13344      el = next;
13345    }
13346    hostInsert(anchor, container, nextSibling);
13347  };
13348  const removeStaticNode = ({ el, anchor }) => {
13349    let next;
13350    while (el && el !== anchor) {
13351      next = hostNextSibling(el);
13352      hostRemove(el);
13353      el = next;
13354    }
13355    hostRemove(anchor);
13356  };
13357  const processElement = (n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized) => {
13358    if (n2.type === "svg") {
13359      namespace = "svg";
13360    } else if (n2.type === "math") {
13361      namespace = "mathml";
13362    }
13363    if (n1 == null) {
13364      mountElement(
13365        n2,
13366        container,
13367        anchor,
13368        parentComponent,
13369        parentSuspense,
13370        namespace,
13371        slotScopeIds,
13372        optimized
13373      );
13374    } else {
13375      patchElement(
13376        n1,
13377        n2,
13378        parentComponent,
13379        parentSuspense,
13380        namespace,
13381        slotScopeIds,
13382        optimized
13383      );
13384    }
13385  };
13386  const mountElement = (vnode, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized) => {
13387    let el;
13388    let vnodeHook;
13389    const { props, shapeFlag, transition, dirs } = vnode;
13390    el = vnode.el = hostCreateElement(
13391      vnode.type,
13392      namespace,
13393      props && props.is,
13394      props
13395    );
13396    if (shapeFlag & 8) {
13397      hostSetElementText(el, vnode.children);
13398    } else if (shapeFlag & 16) {
13399      mountChildren(
13400        vnode.children,
13401        el,
13402        null,
13403        parentComponent,
13404        parentSuspense,
13405        resolveChildrenNamespace(vnode, namespace),
13406        slotScopeIds,
13407        optimized
13408      );
13409    }
13410    if (dirs) {
13411      invokeDirectiveHook(vnode, null, parentComponent, "created");
13412    }
13413    setScopeId(el, vnode, vnode.scopeId, slotScopeIds, parentComponent);
13414    if (props) {
13415      for (const key in props) {
13416        if (key !== "value" && !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isReservedProp)(key)) {
13417          hostPatchProp(el, key, null, props[key], namespace, parentComponent);
13418        }
13419      }
13420      if ("value" in props) {
13421        hostPatchProp(el, "value", null, props.value, namespace);
13422      }
13423      if (vnodeHook = props.onVnodeBeforeMount) {
13424        invokeVNodeHook(vnodeHook, parentComponent, vnode);
13425      }
13426    }
13427    if (true) {
13428      (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.def)(el, "__vnode", vnode, true);
13429      (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.def)(el, "__vueParentComponent", parentComponent, true);
13430    }
13431    if (dirs) {
13432      invokeDirectiveHook(vnode, null, parentComponent, "beforeMount");
13433    }
13434    const needCallTransitionHooks = needTransition(parentSuspense, transition);
13435    if (needCallTransitionHooks) {
13436      transition.beforeEnter(el);
13437    }
13438    hostInsert(el, container, anchor);
13439    if ((vnodeHook = props && props.onVnodeMounted) || needCallTransitionHooks || dirs) {
13440      queuePostRenderEffect(() => {
13441        vnodeHook && invokeVNodeHook(vnodeHook, parentComponent, vnode);
13442        needCallTransitionHooks && transition.enter(el);
13443        dirs && invokeDirectiveHook(vnode, null, parentComponent, "mounted");
13444      }, parentSuspense);
13445    }
13446  };
13447  const setScopeId = (el, vnode, scopeId, slotScopeIds, parentComponent) => {
13448    if (scopeId) {
13449      hostSetScopeId(el, scopeId);
13450    }
13451    if (slotScopeIds) {
13452      for (let i = 0; i < slotScopeIds.length; i++) {
13453        hostSetScopeId(el, slotScopeIds[i]);
13454      }
13455    }
13456    if (parentComponent) {
13457      let subTree = parentComponent.subTree;
13458      if ( true && subTree.patchFlag > 0 && subTree.patchFlag & 2048) {
13459        subTree = filterSingleRoot(subTree.children) || subTree;
13460      }
13461      if (vnode === subTree) {
13462        const parentVNode = parentComponent.vnode;
13463        setScopeId(
13464          el,
13465          parentVNode,
13466          parentVNode.scopeId,
13467          parentVNode.slotScopeIds,
13468          parentComponent.parent
13469        );
13470      }
13471    }
13472  };
13473  const mountChildren = (children, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized, start = 0) => {
13474    for (let i = start; i < children.length; i++) {
13475      const child = children[i] = optimized ? cloneIfMounted(children[i]) : normalizeVNode(children[i]);
13476      patch(
13477        null,
13478        child,
13479        container,
13480        anchor,
13481        parentComponent,
13482        parentSuspense,
13483        namespace,
13484        slotScopeIds,
13485        optimized
13486      );
13487    }
13488  };
13489  const patchElement = (n1, n2, parentComponent, parentSuspense, namespace, slotScopeIds, optimized) => {
13490    const el = n2.el = n1.el;
13491    if (true) {
13492      el.__vnode = n2;
13493    }
13494    let { patchFlag, dynamicChildren, dirs } = n2;
13495    patchFlag |= n1.patchFlag & 16;
13496    const oldProps = n1.props || _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ;
13497    const newProps = n2.props || _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ;
13498    let vnodeHook;
13499    parentComponent && toggleRecurse(parentComponent, false);
13500    if (vnodeHook = newProps.onVnodeBeforeUpdate) {
13501      invokeVNodeHook(vnodeHook, parentComponent, n2, n1);
13502    }
13503    if (dirs) {
13504      invokeDirectiveHook(n2, n1, parentComponent, "beforeUpdate");
13505    }
13506    parentComponent && toggleRecurse(parentComponent, true);
13507    if ( true && isHmrUpdating) {
13508      patchFlag = 0;
13509      optimized = false;
13510      dynamicChildren = null;
13511    }
13512    if (oldProps.innerHTML && newProps.innerHTML == null || oldProps.textContent && newProps.textContent == null) {
13513      hostSetElementText(el, "");
13514    }
13515    if (dynamicChildren) {
13516      patchBlockChildren(
13517        n1.dynamicChildren,
13518        dynamicChildren,
13519        el,
13520        parentComponent,
13521        parentSuspense,
13522        resolveChildrenNamespace(n2, namespace),
13523        slotScopeIds
13524      );
13525      if (true) {
13526        traverseStaticChildren(n1, n2);
13527      }
13528    } else if (!optimized) {
13529      patchChildren(
13530        n1,
13531        n2,
13532        el,
13533        null,
13534        parentComponent,
13535        parentSuspense,
13536        resolveChildrenNamespace(n2, namespace),
13537        slotScopeIds,
13538        false
13539      );
13540    }
13541    if (patchFlag > 0) {
13542      if (patchFlag & 16) {
13543        patchProps(el, oldProps, newProps, parentComponent, namespace);
13544      } else {
13545        if (patchFlag & 2) {
13546          if (oldProps.class !== newProps.class) {
13547            hostPatchProp(el, "class", null, newProps.class, namespace);
13548          }
13549        }
13550        if (patchFlag & 4) {
13551          hostPatchProp(el, "style", oldProps.style, newProps.style, namespace);
13552        }
13553        if (patchFlag & 8) {
13554          const propsToUpdate = n2.dynamicProps;
13555          for (let i = 0; i < propsToUpdate.length; i++) {
13556            const key = propsToUpdate[i];
13557            const prev = oldProps[key];
13558            const next = newProps[key];
13559            if (next !== prev || key === "value") {
13560              hostPatchProp(el, key, prev, next, namespace, parentComponent);
13561            }
13562          }
13563        }
13564      }
13565      if (patchFlag & 1) {
13566        if (n1.children !== n2.children) {
13567          hostSetElementText(el, n2.children);
13568        }
13569      }
13570    } else if (!optimized && dynamicChildren == null) {
13571      patchProps(el, oldProps, newProps, parentComponent, namespace);
13572    }
13573    if ((vnodeHook = newProps.onVnodeUpdated) || dirs) {
13574      queuePostRenderEffect(() => {
13575        vnodeHook && invokeVNodeHook(vnodeHook, parentComponent, n2, n1);
13576        dirs && invokeDirectiveHook(n2, n1, parentComponent, "updated");
13577      }, parentSuspense);
13578    }
13579  };
13580  const patchBlockChildren = (oldChildren, newChildren, fallbackContainer, parentComponent, parentSuspense, namespace, slotScopeIds) => {
13581    for (let i = 0; i < newChildren.length; i++) {
13582      const oldVNode = oldChildren[i];
13583      const newVNode = newChildren[i];
13584      const container = (
13585        // oldVNode may be an errored async setup() component inside Suspense
13586        // which will not have a mounted element
13587        oldVNode.el && // - In the case of a Fragment, we need to provide the actual parent
13588        // of the Fragment itself so it can move its children.
13589        (oldVNode.type === Fragment || // - In the case of different nodes, there is going to be a replacement
13590        // which also requires the correct parent container
13591        !isSameVNodeType(oldVNode, newVNode) || // - In the case of a component, it could contain anything.
13592        oldVNode.shapeFlag & (6 | 64)) ? hostParentNode(oldVNode.el) : (
13593          // In other cases, the parent container is not actually used so we
13594          // just pass the block element here to avoid a DOM parentNode call.
13595          fallbackContainer
13596        )
13597      );
13598      patch(
13599        oldVNode,
13600        newVNode,
13601        container,
13602        null,
13603        parentComponent,
13604        parentSuspense,
13605        namespace,
13606        slotScopeIds,
13607        true
13608      );
13609    }
13610  };
13611  const patchProps = (el, oldProps, newProps, parentComponent, namespace) => {
13612    if (oldProps !== newProps) {
13613      if (oldProps !== _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ) {
13614        for (const key in oldProps) {
13615          if (!(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isReservedProp)(key) && !(key in newProps)) {
13616            hostPatchProp(
13617              el,
13618              key,
13619              oldProps[key],
13620              null,
13621              namespace,
13622              parentComponent
13623            );
13624          }
13625        }
13626      }
13627      for (const key in newProps) {
13628        if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isReservedProp)(key)) continue;
13629        const next = newProps[key];
13630        const prev = oldProps[key];
13631        if (next !== prev && key !== "value") {
13632          hostPatchProp(el, key, prev, next, namespace, parentComponent);
13633        }
13634      }
13635      if ("value" in newProps) {
13636        hostPatchProp(el, "value", oldProps.value, newProps.value, namespace);
13637      }
13638    }
13639  };
13640  const processFragment = (n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized) => {
13641    const fragmentStartAnchor = n2.el = n1 ? n1.el : hostCreateText("");
13642    const fragmentEndAnchor = n2.anchor = n1 ? n1.anchor : hostCreateText("");
13643    let { patchFlag, dynamicChildren, slotScopeIds: fragmentSlotScopeIds } = n2;
13644    if ( true && // #5523 dev root fragment may inherit directives
13645    (isHmrUpdating || patchFlag & 2048)) {
13646      patchFlag = 0;
13647      optimized = false;
13648      dynamicChildren = null;
13649    }
13650    if (fragmentSlotScopeIds) {
13651      slotScopeIds = slotScopeIds ? slotScopeIds.concat(fragmentSlotScopeIds) : fragmentSlotScopeIds;
13652    }
13653    if (n1 == null) {
13654      hostInsert(fragmentStartAnchor, container, anchor);
13655      hostInsert(fragmentEndAnchor, container, anchor);
13656      mountChildren(
13657        // #10007
13658        // such fragment like `<></>` will be compiled into
13659        // a fragment which doesn't have a children.
13660        // In this case fallback to an empty array
13661        n2.children || [],
13662        container,
13663        fragmentEndAnchor,
13664        parentComponent,
13665        parentSuspense,
13666        namespace,
13667        slotScopeIds,
13668        optimized
13669      );
13670    } else {
13671      if (patchFlag > 0 && patchFlag & 64 && dynamicChildren && // #2715 the previous fragment could've been a BAILed one as a result
13672      // of renderSlot() with no valid children
13673      n1.dynamicChildren) {
13674        patchBlockChildren(
13675          n1.dynamicChildren,
13676          dynamicChildren,
13677          container,
13678          parentComponent,
13679          parentSuspense,
13680          namespace,
13681          slotScopeIds
13682        );
13683        if (true) {
13684          traverseStaticChildren(n1, n2);
13685        } else {}
13686      } else {
13687        patchChildren(
13688          n1,
13689          n2,
13690          container,
13691          fragmentEndAnchor,
13692          parentComponent,
13693          parentSuspense,
13694          namespace,
13695          slotScopeIds,
13696          optimized
13697        );
13698      }
13699    }
13700  };
13701  const processComponent = (n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized) => {
13702    n2.slotScopeIds = slotScopeIds;
13703    if (n1 == null) {
13704      if (n2.shapeFlag & 512) {
13705        parentComponent.ctx.activate(
13706          n2,
13707          container,
13708          anchor,
13709          namespace,
13710          optimized
13711        );
13712      } else {
13713        mountComponent(
13714          n2,
13715          container,
13716          anchor,
13717          parentComponent,
13718          parentSuspense,
13719          namespace,
13720          optimized
13721        );
13722      }
13723    } else {
13724      updateComponent(n1, n2, optimized);
13725    }
13726  };
13727  const mountComponent = (initialVNode, container, anchor, parentComponent, parentSuspense, namespace, optimized) => {
13728    const instance = (initialVNode.component = createComponentInstance(
13729      initialVNode,
13730      parentComponent,
13731      parentSuspense
13732    ));
13733    if ( true && instance.type.__hmrId) {
13734      registerHMR(instance);
13735    }
13736    if (true) {
13737      pushWarningContext(initialVNode);
13738      startMeasure(instance, `mount`);
13739    }
13740    if (isKeepAlive(initialVNode)) {
13741      instance.ctx.renderer = internals;
13742    }
13743    {
13744      if (true) {
13745        startMeasure(instance, `init`);
13746      }
13747      setupComponent(instance, false, optimized);
13748      if (true) {
13749        endMeasure(instance, `init`);
13750      }
13751    }
13752    if (instance.asyncDep) {
13753      parentSuspense && parentSuspense.registerDep(instance, setupRenderEffect, optimized);
13754      if (!initialVNode.el) {
13755        const placeholder = instance.subTree = createVNode(Comment);
13756        processCommentNode(null, placeholder, container, anchor);
13757      }
13758    } else {
13759      setupRenderEffect(
13760        instance,
13761        initialVNode,
13762        container,
13763        anchor,
13764        parentSuspense,
13765        namespace,
13766        optimized
13767      );
13768    }
13769    if (true) {
13770      popWarningContext();
13771      endMeasure(instance, `mount`);
13772    }
13773  };
13774  const updateComponent = (n1, n2, optimized) => {
13775    const instance = n2.component = n1.component;
13776    if (shouldUpdateComponent(n1, n2, optimized)) {
13777      if (instance.asyncDep && !instance.asyncResolved) {
13778        if (true) {
13779          pushWarningContext(n2);
13780        }
13781        updateComponentPreRender(instance, n2, optimized);
13782        if (true) {
13783          popWarningContext();
13784        }
13785        return;
13786      } else {
13787        instance.next = n2;
13788        invalidateJob(instance.update);
13789        instance.effect.dirty = true;
13790        instance.update();
13791      }
13792    } else {
13793      n2.el = n1.el;
13794      instance.vnode = n2;
13795    }
13796  };
13797  const setupRenderEffect = (instance, initialVNode, container, anchor, parentSuspense, namespace, optimized) => {
13798    const componentUpdateFn = () => {
13799      if (!instance.isMounted) {
13800        let vnodeHook;
13801        const { el, props } = initialVNode;
13802        const { bm, m, parent } = instance;
13803        const isAsyncWrapperVNode = isAsyncWrapper(initialVNode);
13804        toggleRecurse(instance, false);
13805        if (bm) {
13806          (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.invokeArrayFns)(bm);
13807        }
13808        if (!isAsyncWrapperVNode && (vnodeHook = props && props.onVnodeBeforeMount)) {
13809          invokeVNodeHook(vnodeHook, parent, initialVNode);
13810        }
13811        toggleRecurse(instance, true);
13812        if (el && hydrateNode) {
13813          const hydrateSubTree = () => {
13814            if (true) {
13815              startMeasure(instance, `render`);
13816            }
13817            instance.subTree = renderComponentRoot(instance);
13818            if (true) {
13819              endMeasure(instance, `render`);
13820            }
13821            if (true) {
13822              startMeasure(instance, `hydrate`);
13823            }
13824            hydrateNode(
13825              el,
13826              instance.subTree,
13827              instance,
13828              parentSuspense,
13829              null
13830            );
13831            if (true) {
13832              endMeasure(instance, `hydrate`);
13833            }
13834          };
13835          if (isAsyncWrapperVNode) {
13836            initialVNode.type.__asyncLoader().then(
13837              // note: we are moving the render call into an async callback,
13838              // which means it won't track dependencies - but it's ok because
13839              // a server-rendered async wrapper is already in resolved state
13840              // and it will never need to change.
13841              () => !instance.isUnmounted && hydrateSubTree()
13842            );
13843          } else {
13844            hydrateSubTree();
13845          }
13846        } else {
13847          if (true) {
13848            startMeasure(instance, `render`);
13849          }
13850          const subTree = instance.subTree = renderComponentRoot(instance);
13851          if (true) {
13852            endMeasure(instance, `render`);
13853          }
13854          if (true) {
13855            startMeasure(instance, `patch`);
13856          }
13857          patch(
13858            null,
13859            subTree,
13860            container,
13861            anchor,
13862            instance,
13863            parentSuspense,
13864            namespace
13865          );
13866          if (true) {
13867            endMeasure(instance, `patch`);
13868          }
13869          initialVNode.el = subTree.el;
13870        }
13871        if (m) {
13872          queuePostRenderEffect(m, parentSuspense);
13873        }
13874        if (!isAsyncWrapperVNode && (vnodeHook = props && props.onVnodeMounted)) {
13875          const scopedInitialVNode = initialVNode;
13876          queuePostRenderEffect(
13877            () => invokeVNodeHook(vnodeHook, parent, scopedInitialVNode),
13878            parentSuspense
13879          );
13880        }
13881        if (initialVNode.shapeFlag & 256 || parent && isAsyncWrapper(parent.vnode) && parent.vnode.shapeFlag & 256) {
13882          instance.a && queuePostRenderEffect(instance.a, parentSuspense);
13883        }
13884        instance.isMounted = true;
13885        if (true) {
13886          devtoolsComponentAdded(instance);
13887        }
13888        initialVNode = container = anchor = null;
13889      } else {
13890        let { next, bu, u, parent, vnode } = instance;
13891        {
13892          const nonHydratedAsyncRoot = locateNonHydratedAsyncRoot(instance);
13893          if (nonHydratedAsyncRoot) {
13894            if (next) {
13895              next.el = vnode.el;
13896              updateComponentPreRender(instance, next, optimized);
13897            }
13898            nonHydratedAsyncRoot.asyncDep.then(() => {
13899              if (!instance.isUnmounted) {
13900                componentUpdateFn();
13901              }
13902            });
13903            return;
13904          }
13905        }
13906        let originNext = next;
13907        let vnodeHook;
13908        if (true) {
13909          pushWarningContext(next || instance.vnode);
13910        }
13911        toggleRecurse(instance, false);
13912        if (next) {
13913          next.el = vnode.el;
13914          updateComponentPreRender(instance, next, optimized);
13915        } else {
13916          next = vnode;
13917        }
13918        if (bu) {
13919          (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.invokeArrayFns)(bu);
13920        }
13921        if (vnodeHook = next.props && next.props.onVnodeBeforeUpdate) {
13922          invokeVNodeHook(vnodeHook, parent, next, vnode);
13923        }
13924        toggleRecurse(instance, true);
13925        if (true) {
13926          startMeasure(instance, `render`);
13927        }
13928        const nextTree = renderComponentRoot(instance);
13929        if (true) {
13930          endMeasure(instance, `render`);
13931        }
13932        const prevTree = instance.subTree;
13933        instance.subTree = nextTree;
13934        if (true) {
13935          startMeasure(instance, `patch`);
13936        }
13937        patch(
13938          prevTree,
13939          nextTree,
13940          // parent may have changed if it's in a teleport
13941          hostParentNode(prevTree.el),
13942          // anchor may have changed if it's in a fragment
13943          getNextHostNode(prevTree),
13944          instance,
13945          parentSuspense,
13946          namespace
13947        );
13948        if (true) {
13949          endMeasure(instance, `patch`);
13950        }
13951        next.el = nextTree.el;
13952        if (originNext === null) {
13953          updateHOCHostEl(instance, nextTree.el);
13954        }
13955        if (u) {
13956          queuePostRenderEffect(u, parentSuspense);
13957        }
13958        if (vnodeHook = next.props && next.props.onVnodeUpdated) {
13959          queuePostRenderEffect(
13960            () => invokeVNodeHook(vnodeHook, parent, next, vnode),
13961            parentSuspense
13962          );
13963        }
13964        if (true) {
13965          devtoolsComponentUpdated(instance);
13966        }
13967        if (true) {
13968          popWarningContext();
13969        }
13970      }
13971    };
13972    const effect = instance.effect = new _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.ReactiveEffect(
13973      componentUpdateFn,
13974      _vue_shared__WEBPACK_IMPORTED_MODULE_1__.NOOP,
13975      () => queueJob(update),
13976      instance.scope
13977      // track it in component's effect scope
13978    );
13979    const update = instance.update = () => {
13980      if (effect.dirty) {
13981        effect.run();
13982      }
13983    };
13984    update.i = instance;
13985    update.id = instance.uid;
13986    toggleRecurse(instance, true);
13987    if (true) {
13988      effect.onTrack = instance.rtc ? (e) => (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.invokeArrayFns)(instance.rtc, e) : void 0;
13989      effect.onTrigger = instance.rtg ? (e) => (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.invokeArrayFns)(instance.rtg, e) : void 0;
13990    }
13991    update();
13992  };
13993  const updateComponentPreRender = (instance, nextVNode, optimized) => {
13994    nextVNode.component = instance;
13995    const prevProps = instance.vnode.props;
13996    instance.vnode = nextVNode;
13997    instance.next = null;
13998    updateProps(instance, nextVNode.props, prevProps, optimized);
13999    updateSlots(instance, nextVNode.children, optimized);
14000    (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.pauseTracking)();
14001    flushPreFlushCbs(instance);
14002    (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.resetTracking)();
14003  };
14004  const patchChildren = (n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized = false) => {
14005    const c1 = n1 && n1.children;
14006    const prevShapeFlag = n1 ? n1.shapeFlag : 0;
14007    const c2 = n2.children;
14008    const { patchFlag, shapeFlag } = n2;
14009    if (patchFlag > 0) {
14010      if (patchFlag & 128) {
14011        patchKeyedChildren(
14012          c1,
14013          c2,
14014          container,
14015          anchor,
14016          parentComponent,
14017          parentSuspense,
14018          namespace,
14019          slotScopeIds,
14020          optimized
14021        );
14022        return;
14023      } else if (patchFlag & 256) {
14024        patchUnkeyedChildren(
14025          c1,
14026          c2,
14027          container,
14028          anchor,
14029          parentComponent,
14030          parentSuspense,
14031          namespace,
14032          slotScopeIds,
14033          optimized
14034        );
14035        return;
14036      }
14037    }
14038    if (shapeFlag & 8) {
14039      if (prevShapeFlag & 16) {
14040        unmountChildren(c1, parentComponent, parentSuspense);
14041      }
14042      if (c2 !== c1) {
14043        hostSetElementText(container, c2);
14044      }
14045    } else {
14046      if (prevShapeFlag & 16) {
14047        if (shapeFlag & 16) {
14048          patchKeyedChildren(
14049            c1,
14050            c2,
14051            container,
14052            anchor,
14053            parentComponent,
14054            parentSuspense,
14055            namespace,
14056            slotScopeIds,
14057            optimized
14058          );
14059        } else {
14060          unmountChildren(c1, parentComponent, parentSuspense, true);
14061        }
14062      } else {
14063        if (prevShapeFlag & 8) {
14064          hostSetElementText(container, "");
14065        }
14066        if (shapeFlag & 16) {
14067          mountChildren(
14068            c2,
14069            container,
14070            anchor,
14071            parentComponent,
14072            parentSuspense,
14073            namespace,
14074            slotScopeIds,
14075            optimized
14076          );
14077        }
14078      }
14079    }
14080  };
14081  const patchUnkeyedChildren = (c1, c2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized) => {
14082    c1 = c1 || _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_ARR;
14083    c2 = c2 || _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_ARR;
14084    const oldLength = c1.length;
14085    const newLength = c2.length;
14086    const commonLength = Math.min(oldLength, newLength);
14087    let i;
14088    for (i = 0; i < commonLength; i++) {
14089      const nextChild = c2[i] = optimized ? cloneIfMounted(c2[i]) : normalizeVNode(c2[i]);
14090      patch(
14091        c1[i],
14092        nextChild,
14093        container,
14094        null,
14095        parentComponent,
14096        parentSuspense,
14097        namespace,
14098        slotScopeIds,
14099        optimized
14100      );
14101    }
14102    if (oldLength > newLength) {
14103      unmountChildren(
14104        c1,
14105        parentComponent,
14106        parentSuspense,
14107        true,
14108        false,
14109        commonLength
14110      );
14111    } else {
14112      mountChildren(
14113        c2,
14114        container,
14115        anchor,
14116        parentComponent,
14117        parentSuspense,
14118        namespace,
14119        slotScopeIds,
14120        optimized,
14121        commonLength
14122      );
14123    }
14124  };
14125  const patchKeyedChildren = (c1, c2, container, parentAnchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized) => {
14126    let i = 0;
14127    const l2 = c2.length;
14128    let e1 = c1.length - 1;
14129    let e2 = l2 - 1;
14130    while (i <= e1 && i <= e2) {
14131      const n1 = c1[i];
14132      const n2 = c2[i] = optimized ? cloneIfMounted(c2[i]) : normalizeVNode(c2[i]);
14133      if (isSameVNodeType(n1, n2)) {
14134        patch(
14135          n1,
14136          n2,
14137          container,
14138          null,
14139          parentComponent,
14140          parentSuspense,
14141          namespace,
14142          slotScopeIds,
14143          optimized
14144        );
14145      } else {
14146        break;
14147      }
14148      i++;
14149    }
14150    while (i <= e1 && i <= e2) {
14151      const n1 = c1[e1];
14152      const n2 = c2[e2] = optimized ? cloneIfMounted(c2[e2]) : normalizeVNode(c2[e2]);
14153      if (isSameVNodeType(n1, n2)) {
14154        patch(
14155          n1,
14156          n2,
14157          container,
14158          null,
14159          parentComponent,
14160          parentSuspense,
14161          namespace,
14162          slotScopeIds,
14163          optimized
14164        );
14165      } else {
14166        break;
14167      }
14168      e1--;
14169      e2--;
14170    }
14171    if (i > e1) {
14172      if (i <= e2) {
14173        const nextPos = e2 + 1;
14174        const anchor = nextPos < l2 ? c2[nextPos].el : parentAnchor;
14175        while (i <= e2) {
14176          patch(
14177            null,
14178            c2[i] = optimized ? cloneIfMounted(c2[i]) : normalizeVNode(c2[i]),
14179            container,
14180            anchor,
14181            parentComponent,
14182            parentSuspense,
14183            namespace,
14184            slotScopeIds,
14185            optimized
14186          );
14187          i++;
14188        }
14189      }
14190    } else if (i > e2) {
14191      while (i <= e1) {
14192        unmount(c1[i], parentComponent, parentSuspense, true);
14193        i++;
14194      }
14195    } else {
14196      const s1 = i;
14197      const s2 = i;
14198      const keyToNewIndexMap = /* @__PURE__ */ new Map();
14199      for (i = s2; i <= e2; i++) {
14200        const nextChild = c2[i] = optimized ? cloneIfMounted(c2[i]) : normalizeVNode(c2[i]);
14201        if (nextChild.key != null) {
14202          if ( true && keyToNewIndexMap.has(nextChild.key)) {
14203            warn$1(
14204              `Duplicate keys found during update:`,
14205              JSON.stringify(nextChild.key),
14206              `Make sure keys are unique.`
14207            );
14208          }
14209          keyToNewIndexMap.set(nextChild.key, i);
14210        }
14211      }
14212      let j;
14213      let patched = 0;
14214      const toBePatched = e2 - s2 + 1;
14215      let moved = false;
14216      let maxNewIndexSoFar = 0;
14217      const newIndexToOldIndexMap = new Array(toBePatched);
14218      for (i = 0; i < toBePatched; i++) newIndexToOldIndexMap[i] = 0;
14219      for (i = s1; i <= e1; i++) {
14220        const prevChild = c1[i];
14221        if (patched >= toBePatched) {
14222          unmount(prevChild, parentComponent, parentSuspense, true);
14223          continue;
14224        }
14225        let newIndex;
14226        if (prevChild.key != null) {
14227          newIndex = keyToNewIndexMap.get(prevChild.key);
14228        } else {
14229          for (j = s2; j <= e2; j++) {
14230            if (newIndexToOldIndexMap[j - s2] === 0 && isSameVNodeType(prevChild, c2[j])) {
14231              newIndex = j;
14232              break;
14233            }
14234          }
14235        }
14236        if (newIndex === void 0) {
14237          unmount(prevChild, parentComponent, parentSuspense, true);
14238        } else {
14239          newIndexToOldIndexMap[newIndex - s2] = i + 1;
14240          if (newIndex >= maxNewIndexSoFar) {
14241            maxNewIndexSoFar = newIndex;
14242          } else {
14243            moved = true;
14244          }
14245          patch(
14246            prevChild,
14247            c2[newIndex],
14248            container,
14249            null,
14250            parentComponent,
14251            parentSuspense,
14252            namespace,
14253            slotScopeIds,
14254            optimized
14255          );
14256          patched++;
14257        }
14258      }
14259      const increasingNewIndexSequence = moved ? getSequence(newIndexToOldIndexMap) : _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_ARR;
14260      j = increasingNewIndexSequence.length - 1;
14261      for (i = toBePatched - 1; i >= 0; i--) {
14262        const nextIndex = s2 + i;
14263        const nextChild = c2[nextIndex];
14264        const anchor = nextIndex + 1 < l2 ? c2[nextIndex + 1].el : parentAnchor;
14265        if (newIndexToOldIndexMap[i] === 0) {
14266          patch(
14267            null,
14268            nextChild,
14269            container,
14270            anchor,
14271            parentComponent,
14272            parentSuspense,
14273            namespace,
14274            slotScopeIds,
14275            optimized
14276          );
14277        } else if (moved) {
14278          if (j < 0 || i !== increasingNewIndexSequence[j]) {
14279            move(nextChild, container, anchor, 2);
14280          } else {
14281            j--;
14282          }
14283        }
14284      }
14285    }
14286  };
14287  const move = (vnode, container, anchor, moveType, parentSuspense = null) => {
14288    const { el, type, transition, children, shapeFlag } = vnode;
14289    if (shapeFlag & 6) {
14290      move(vnode.component.subTree, container, anchor, moveType);
14291      return;
14292    }
14293    if (shapeFlag & 128) {
14294      vnode.suspense.move(container, anchor, moveType);
14295      return;
14296    }
14297    if (shapeFlag & 64) {
14298      type.move(vnode, container, anchor, internals);
14299      return;
14300    }
14301    if (type === Fragment) {
14302      hostInsert(el, container, anchor);
14303      for (let i = 0; i < children.length; i++) {
14304        move(children[i], container, anchor, moveType);
14305      }
14306      hostInsert(vnode.anchor, container, anchor);
14307      return;
14308    }
14309    if (type === Static) {
14310      moveStaticNode(vnode, container, anchor);
14311      return;
14312    }
14313    const needTransition2 = moveType !== 2 && shapeFlag & 1 && transition;
14314    if (needTransition2) {
14315      if (moveType === 0) {
14316        transition.beforeEnter(el);
14317        hostInsert(el, container, anchor);
14318        queuePostRenderEffect(() => transition.enter(el), parentSuspense);
14319      } else {
14320        const { leave, delayLeave, afterLeave } = transition;
14321        const remove2 = () => hostInsert(el, container, anchor);
14322        const performLeave = () => {
14323          leave(el, () => {
14324            remove2();
14325            afterLeave && afterLeave();
14326          });
14327        };
14328        if (delayLeave) {
14329          delayLeave(el, remove2, performLeave);
14330        } else {
14331          performLeave();
14332        }
14333      }
14334    } else {
14335      hostInsert(el, container, anchor);
14336    }
14337  };
14338  const unmount = (vnode, parentComponent, parentSuspense, doRemove = false, optimized = false) => {
14339    const {
14340      type,
14341      props,
14342      ref,
14343      children,
14344      dynamicChildren,
14345      shapeFlag,
14346      patchFlag,
14347      dirs,
14348      cacheIndex
14349    } = vnode;
14350    if (patchFlag === -2) {
14351      optimized = false;
14352    }
14353    if (ref != null) {
14354      setRef(ref, null, parentSuspense, vnode, true);
14355    }
14356    if (cacheIndex != null) {
14357      parentComponent.renderCache[cacheIndex] = void 0;
14358    }
14359    if (shapeFlag & 256) {
14360      parentComponent.ctx.deactivate(vnode);
14361      return;
14362    }
14363    const shouldInvokeDirs = shapeFlag & 1 && dirs;
14364    const shouldInvokeVnodeHook = !isAsyncWrapper(vnode);
14365    let vnodeHook;
14366    if (shouldInvokeVnodeHook && (vnodeHook = props && props.onVnodeBeforeUnmount)) {
14367      invokeVNodeHook(vnodeHook, parentComponent, vnode);
14368    }
14369    if (shapeFlag & 6) {
14370      unmountComponent(vnode.component, parentSuspense, doRemove);
14371    } else {
14372      if (shapeFlag & 128) {
14373        vnode.suspense.unmount(parentSuspense, doRemove);
14374        return;
14375      }
14376      if (shouldInvokeDirs) {
14377        invokeDirectiveHook(vnode, null, parentComponent, "beforeUnmount");
14378      }
14379      if (shapeFlag & 64) {
14380        vnode.type.remove(
14381          vnode,
14382          parentComponent,
14383          parentSuspense,
14384          internals,
14385          doRemove
14386        );
14387      } else if (dynamicChildren && // #5154
14388      // when v-once is used inside a block, setBlockTracking(-1) marks the
14389      // parent block with hasOnce: true
14390      // so that it doesn't take the fast path during unmount - otherwise
14391      // components nested in v-once are never unmounted.
14392      !dynamicChildren.hasOnce && // #1153: fast path should not be taken for non-stable (v-for) fragments
14393      (type !== Fragment || patchFlag > 0 && patchFlag & 64)) {
14394        unmountChildren(
14395          dynamicChildren,
14396          parentComponent,
14397          parentSuspense,
14398          false,
14399          true
14400        );
14401      } else if (type === Fragment && patchFlag & (128 | 256) || !optimized && shapeFlag & 16) {
14402        unmountChildren(children, parentComponent, parentSuspense);
14403      }
14404      if (doRemove) {
14405        remove(vnode);
14406      }
14407    }
14408    if (shouldInvokeVnodeHook && (vnodeHook = props && props.onVnodeUnmounted) || shouldInvokeDirs) {
14409      queuePostRenderEffect(() => {
14410        vnodeHook && invokeVNodeHook(vnodeHook, parentComponent, vnode);
14411        shouldInvokeDirs && invokeDirectiveHook(vnode, null, parentComponent, "unmounted");
14412      }, parentSuspense);
14413    }
14414  };
14415  const remove = (vnode) => {
14416    const { type, el, anchor, transition } = vnode;
14417    if (type === Fragment) {
14418      if ( true && vnode.patchFlag > 0 && vnode.patchFlag & 2048 && transition && !transition.persisted) {
14419        vnode.children.forEach((child) => {
14420          if (child.type === Comment) {
14421            hostRemove(child.el);
14422          } else {
14423            remove(child);
14424          }
14425        });
14426      } else {
14427        removeFragment(el, anchor);
14428      }
14429      return;
14430    }
14431    if (type === Static) {
14432      removeStaticNode(vnode);
14433      return;
14434    }
14435    const performRemove = () => {
14436      hostRemove(el);
14437      if (transition && !transition.persisted && transition.afterLeave) {
14438        transition.afterLeave();
14439      }
14440    };
14441    if (vnode.shapeFlag & 1 && transition && !transition.persisted) {
14442      const { leave, delayLeave } = transition;
14443      const performLeave = () => leave(el, performRemove);
14444      if (delayLeave) {
14445        delayLeave(vnode.el, performRemove, performLeave);
14446      } else {
14447        performLeave();
14448      }
14449    } else {
14450      performRemove();
14451    }
14452  };
14453  const removeFragment = (cur, end) => {
14454    let next;
14455    while (cur !== end) {
14456      next = hostNextSibling(cur);
14457      hostRemove(cur);
14458      cur = next;
14459    }
14460    hostRemove(end);
14461  };
14462  const unmountComponent = (instance, parentSuspense, doRemove) => {
14463    if ( true && instance.type.__hmrId) {
14464      unregisterHMR(instance);
14465    }
14466    const { bum, scope, update, subTree, um, m, a } = instance;
14467    invalidateMount(m);
14468    invalidateMount(a);
14469    if (bum) {
14470      (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.invokeArrayFns)(bum);
14471    }
14472    scope.stop();
14473    if (update) {
14474      update.active = false;
14475      unmount(subTree, instance, parentSuspense, doRemove);
14476    }
14477    if (um) {
14478      queuePostRenderEffect(um, parentSuspense);
14479    }
14480    queuePostRenderEffect(() => {
14481      instance.isUnmounted = true;
14482    }, parentSuspense);
14483    if (parentSuspense && parentSuspense.pendingBranch && !parentSuspense.isUnmounted && instance.asyncDep && !instance.asyncResolved && instance.suspenseId === parentSuspense.pendingId) {
14484      parentSuspense.deps--;
14485      if (parentSuspense.deps === 0) {
14486        parentSuspense.resolve();
14487      }
14488    }
14489    if (true) {
14490      devtoolsComponentRemoved(instance);
14491    }
14492  };
14493  const unmountChildren = (children, parentComponent, parentSuspense, doRemove = false, optimized = false, start = 0) => {
14494    for (let i = start; i < children.length; i++) {
14495      unmount(children[i], parentComponent, parentSuspense, doRemove, optimized);
14496    }
14497  };
14498  const getNextHostNode = (vnode) => {
14499    if (vnode.shapeFlag & 6) {
14500      return getNextHostNode(vnode.component.subTree);
14501    }
14502    if (vnode.shapeFlag & 128) {
14503      return vnode.suspense.next();
14504    }
14505    const el = hostNextSibling(vnode.anchor || vnode.el);
14506    const teleportEnd = el && el[TeleportEndKey];
14507    return teleportEnd ? hostNextSibling(teleportEnd) : el;
14508  };
14509  let isFlushing = false;
14510  const render = (vnode, container, namespace) => {
14511    if (vnode == null) {
14512      if (container._vnode) {
14513        unmount(container._vnode, null, null, true);
14514      }
14515    } else {
14516      patch(
14517        container._vnode || null,
14518        vnode,
14519        container,
14520        null,
14521        null,
14522        null,
14523        namespace
14524      );
14525    }
14526    if (!isFlushing) {
14527      isFlushing = true;
14528      flushPreFlushCbs();
14529      flushPostFlushCbs();
14530      isFlushing = false;
14531    }
14532    container._vnode = vnode;
14533  };
14534  const internals = {
14535    p: patch,
14536    um: unmount,
14537    m: move,
14538    r: remove,
14539    mt: mountComponent,
14540    mc: mountChildren,
14541    pc: patchChildren,
14542    pbc: patchBlockChildren,
14543    n: getNextHostNode,
14544    o: options
14545  };
14546  let hydrate;
14547  let hydrateNode;
14548  if (createHydrationFns) {
14549    [hydrate, hydrateNode] = createHydrationFns(
14550      internals
14551    );
14552  }
14553  return {
14554    render,
14555    hydrate,
14556    createApp: createAppAPI(render, hydrate)
14557  };
14558}
14559function resolveChildrenNamespace({ type, props }, currentNamespace) {
14560  return currentNamespace === "svg" && type === "foreignObject" || currentNamespace === "mathml" && type === "annotation-xml" && props && props.encoding && props.encoding.includes("html") ? void 0 : currentNamespace;
14561}
14562function toggleRecurse({ effect, update }, allowed) {
14563  effect.allowRecurse = update.allowRecurse = allowed;
14564}
14565function needTransition(parentSuspense, transition) {
14566  return (!parentSuspense || parentSuspense && !parentSuspense.pendingBranch) && transition && !transition.persisted;
14567}
14568function traverseStaticChildren(n1, n2, shallow = false) {
14569  const ch1 = n1.children;
14570  const ch2 = n2.children;
14571  if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(ch1) && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(ch2)) {
14572    for (let i = 0; i < ch1.length; i++) {
14573      const c1 = ch1[i];
14574      let c2 = ch2[i];
14575      if (c2.shapeFlag & 1 && !c2.dynamicChildren) {
14576        if (c2.patchFlag <= 0 || c2.patchFlag === 32) {
14577          c2 = ch2[i] = cloneIfMounted(ch2[i]);
14578          c2.el = c1.el;
14579        }
14580        if (!shallow && c2.patchFlag !== -2)
14581          traverseStaticChildren(c1, c2);
14582      }
14583      if (c2.type === Text) {
14584        c2.el = c1.el;
14585      }
14586      if ( true && c2.type === Comment && !c2.el) {
14587        c2.el = c1.el;
14588      }
14589    }
14590  }
14591}
14592function getSequence(arr) {
14593  const p = arr.slice();
14594  const result = [0];
14595  let i, j, u, v, c;
14596  const len = arr.length;
14597  for (i = 0; i < len; i++) {
14598    const arrI = arr[i];
14599    if (arrI !== 0) {
14600      j = result[result.length - 1];
14601      if (arr[j] < arrI) {
14602        p[i] = j;
14603        result.push(i);
14604        continue;
14605      }
14606      u = 0;
14607      v = result.length - 1;
14608      while (u < v) {
14609        c = u + v >> 1;
14610        if (arr[result[c]] < arrI) {
14611          u = c + 1;
14612        } else {
14613          v = c;
14614        }
14615      }
14616      if (arrI < arr[result[u]]) {
14617        if (u > 0) {
14618          p[i] = result[u - 1];
14619        }
14620        result[u] = i;
14621      }
14622    }
14623  }
14624  u = result.length;
14625  v = result[u - 1];
14626  while (u-- > 0) {
14627    result[u] = v;
14628    v = p[v];
14629  }
14630  return result;
14631}
14632function locateNonHydratedAsyncRoot(instance) {
14633  const subComponent = instance.subTree.component;
14634  if (subComponent) {
14635    if (subComponent.asyncDep && !subComponent.asyncResolved) {
14636      return subComponent;
14637    } else {
14638      return locateNonHydratedAsyncRoot(subComponent);
14639    }
14640  }
14641}
14642function invalidateMount(hooks) {
14643  if (hooks) {
14644    for (let i = 0; i < hooks.length; i++) hooks[i].active = false;
14645  }
14646}
14647
14648const ssrContextKey = Symbol.for("v-scx");
14649const useSSRContext = () => {
14650  {
14651    const ctx = inject(ssrContextKey);
14652    if (!ctx) {
14653       true && warn$1(
14654        `Server rendering context not provided. Make sure to only call useSSRContext() conditionally in the server build.`
14655      );
14656    }
14657    return ctx;
14658  }
14659};
14660
14661function watchEffect(effect, options) {
14662  return doWatch(effect, null, options);
14663}
14664function watchPostEffect(effect, options) {
14665  return doWatch(
14666    effect,
14667    null,
14668     true ? (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)({}, options, { flush: "post" }) : 0
14669  );
14670}
14671function watchSyncEffect(effect, options) {
14672  return doWatch(
14673    effect,
14674    null,
14675     true ? (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)({}, options, { flush: "sync" }) : 0
14676  );
14677}
14678const INITIAL_WATCHER_VALUE = {};
14679function watch(source, cb, options) {
14680  if ( true && !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(cb)) {
14681    warn$1(
14682      `\`watch(fn, options?)\` signature has been moved to a separate API. Use \`watchEffect(fn, options?)\` instead. \`watch\` now only supports \`watch(source, cb, options?) signature.`
14683    );
14684  }
14685  return doWatch(source, cb, options);
14686}
14687function doWatch(source, cb, {
14688  immediate,
14689  deep,
14690  flush,
14691  once,
14692  onTrack,
14693  onTrigger
14694} = _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ) {
14695  if (cb && once) {
14696    const _cb = cb;
14697    cb = (...args) => {
14698      _cb(...args);
14699      unwatch();
14700    };
14701  }
14702  if ( true && deep !== void 0 && typeof deep === "number") {
14703    warn$1(
14704      `watch() "deep" option with number value will be used as watch depth in future versions. Please use a boolean instead to avoid potential breakage.`
14705    );
14706  }
14707  if ( true && !cb) {
14708    if (immediate !== void 0) {
14709      warn$1(
14710        `watch() "immediate" option is only respected when using the watch(source, callback, options?) signature.`
14711      );
14712    }
14713    if (deep !== void 0) {
14714      warn$1(
14715        `watch() "deep" option is only respected when using the watch(source, callback, options?) signature.`
14716      );
14717    }
14718    if (once !== void 0) {
14719      warn$1(
14720        `watch() "once" option is only respected when using the watch(source, callback, options?) signature.`
14721      );
14722    }
14723  }
14724  const warnInvalidSource = (s) => {
14725    warn$1(
14726      `Invalid watch source: `,
14727      s,
14728      `A watch source can only be a getter/effect function, a ref, a reactive object, or an array of these types.`
14729    );
14730  };
14731  const instance = currentInstance;
14732  const reactiveGetter = (source2) => deep === true ? source2 : (
14733    // for deep: false, only traverse root-level properties
14734    traverse(source2, deep === false ? 1 : void 0)
14735  );
14736  let getter;
14737  let forceTrigger = false;
14738  let isMultiSource = false;
14739  if ((0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isRef)(source)) {
14740    getter = () => source.value;
14741    forceTrigger = (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isShallow)(source);
14742  } else if ((0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isReactive)(source)) {
14743    getter = () => reactiveGetter(source);
14744    forceTrigger = true;
14745  } else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(source)) {
14746    isMultiSource = true;
14747    forceTrigger = source.some((s) => (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isReactive)(s) || (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isShallow)(s));
14748    getter = () => source.map((s) => {
14749      if ((0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isRef)(s)) {
14750        return s.value;
14751      } else if ((0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isReactive)(s)) {
14752        return reactiveGetter(s);
14753      } else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(s)) {
14754        return callWithErrorHandling(s, instance, 2);
14755      } else {
14756         true && warnInvalidSource(s);
14757      }
14758    });
14759  } else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(source)) {
14760    if (cb) {
14761      getter = () => callWithErrorHandling(source, instance, 2);
14762    } else {
14763      getter = () => {
14764        if (cleanup) {
14765          cleanup();
14766        }
14767        return callWithAsyncErrorHandling(
14768          source,
14769          instance,
14770          3,
14771          [onCleanup]
14772        );
14773      };
14774    }
14775  } else {
14776    getter = _vue_shared__WEBPACK_IMPORTED_MODULE_1__.NOOP;
14777     true && warnInvalidSource(source);
14778  }
14779  if (cb && deep) {
14780    const baseGetter = getter;
14781    getter = () => traverse(baseGetter());
14782  }
14783  let cleanup;
14784  let onCleanup = (fn) => {
14785    cleanup = effect.onStop = () => {
14786      callWithErrorHandling(fn, instance, 4);
14787      cleanup = effect.onStop = void 0;
14788    };
14789  };
14790  let ssrCleanup;
14791  if (isInSSRComponentSetup) {
14792    onCleanup = _vue_shared__WEBPACK_IMPORTED_MODULE_1__.NOOP;
14793    if (!cb) {
14794      getter();
14795    } else if (immediate) {
14796      callWithAsyncErrorHandling(cb, instance, 3, [
14797        getter(),
14798        isMultiSource ? [] : void 0,
14799        onCleanup
14800      ]);
14801    }
14802    if (flush === "sync") {
14803      const ctx = useSSRContext();
14804      ssrCleanup = ctx.__watcherHandles || (ctx.__watcherHandles = []);
14805    } else {
14806      return _vue_shared__WEBPACK_IMPORTED_MODULE_1__.NOOP;
14807    }
14808  }
14809  let oldValue = isMultiSource ? new Array(source.length).fill(INITIAL_WATCHER_VALUE) : INITIAL_WATCHER_VALUE;
14810  const job = () => {
14811    if (!effect.active || !effect.dirty) {
14812      return;
14813    }
14814    if (cb) {
14815      const newValue = effect.run();
14816      if (deep || forceTrigger || (isMultiSource ? newValue.some((v, i) => (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasChanged)(v, oldValue[i])) : (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasChanged)(newValue, oldValue)) || false) {
14817        if (cleanup) {
14818          cleanup();
14819        }
14820        callWithAsyncErrorHandling(cb, instance, 3, [
14821          newValue,
14822          // pass undefined as the old value when it's changed for the first time
14823          oldValue === INITIAL_WATCHER_VALUE ? void 0 : isMultiSource && oldValue[0] === INITIAL_WATCHER_VALUE ? [] : oldValue,
14824          onCleanup
14825        ]);
14826        oldValue = newValue;
14827      }
14828    } else {
14829      effect.run();
14830    }
14831  };
14832  job.allowRecurse = !!cb;
14833  let scheduler;
14834  if (flush === "sync") {
14835    scheduler = job;
14836  } else if (flush === "post") {
14837    scheduler = () => queuePostRenderEffect(job, instance && instance.suspense);
14838  } else {
14839    job.pre = true;
14840    if (instance) job.id = instance.uid;
14841    scheduler = () => queueJob(job);
14842  }
14843  const effect = new _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.ReactiveEffect(getter, _vue_shared__WEBPACK_IMPORTED_MODULE_1__.NOOP, scheduler);
14844  const scope = (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.getCurrentScope)();
14845  const unwatch = () => {
14846    effect.stop();
14847    if (scope) {
14848      (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.remove)(scope.effects, effect);
14849    }
14850  };
14851  if (true) {
14852    effect.onTrack = onTrack;
14853    effect.onTrigger = onTrigger;
14854  }
14855  if (cb) {
14856    if (immediate) {
14857      job();
14858    } else {
14859      oldValue = effect.run();
14860    }
14861  } else if (flush === "post") {
14862    queuePostRenderEffect(
14863      effect.run.bind(effect),
14864      instance && instance.suspense
14865    );
14866  } else {
14867    effect.run();
14868  }
14869  if (ssrCleanup) ssrCleanup.push(unwatch);
14870  return unwatch;
14871}
14872function instanceWatch(source, value, options) {
14873  const publicThis = this.proxy;
14874  const getter = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isString)(source) ? source.includes(".") ? createPathGetter(publicThis, source) : () => publicThis[source] : source.bind(publicThis, publicThis);
14875  let cb;
14876  if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(value)) {
14877    cb = value;
14878  } else {
14879    cb = value.handler;
14880    options = value;
14881  }
14882  const reset = setCurrentInstance(this);
14883  const res = doWatch(getter, cb.bind(publicThis), options);
14884  reset();
14885  return res;
14886}
14887function createPathGetter(ctx, path) {
14888  const segments = path.split(".");
14889  return () => {
14890    let cur = ctx;
14891    for (let i = 0; i < segments.length && cur; i++) {
14892      cur = cur[segments[i]];
14893    }
14894    return cur;
14895  };
14896}
14897function traverse(value, depth = Infinity, seen) {
14898  if (depth <= 0 || !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isObject)(value) || value["__v_skip"]) {
14899    return value;
14900  }
14901  seen = seen || /* @__PURE__ */ new Set();
14902  if (seen.has(value)) {
14903    return value;
14904  }
14905  seen.add(value);
14906  depth--;
14907  if ((0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isRef)(value)) {
14908    traverse(value.value, depth, seen);
14909  } else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(value)) {
14910    for (let i = 0; i < value.length; i++) {
14911      traverse(value[i], depth, seen);
14912    }
14913  } else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isSet)(value) || (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isMap)(value)) {
14914    value.forEach((v) => {
14915      traverse(v, depth, seen);
14916    });
14917  } else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isPlainObject)(value)) {
14918    for (const key in value) {
14919      traverse(value[key], depth, seen);
14920    }
14921    for (const key of Object.getOwnPropertySymbols(value)) {
14922      if (Object.prototype.propertyIsEnumerable.call(value, key)) {
14923        traverse(value[key], depth, seen);
14924      }
14925    }
14926  }
14927  return value;
14928}
14929
14930function useModel(props, name, options = _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ) {
14931  const i = getCurrentInstance();
14932  if ( true && !i) {
14933    warn$1(`useModel() called without active instance.`);
14934    return (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.ref)();
14935  }
14936  if ( true && !i.propsOptions[0][name]) {
14937    warn$1(`useModel() called with prop "${name}" which is not declared.`);
14938    return (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.ref)();
14939  }
14940  const camelizedName = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.camelize)(name);
14941  const hyphenatedName = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hyphenate)(name);
14942  const modifiers = getModelModifiers(props, name);
14943  const res = (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.customRef)((track, trigger) => {
14944    let localValue;
14945    let prevSetValue = _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ;
14946    let prevEmittedValue;
14947    watchSyncEffect(() => {
14948      const propValue = props[name];
14949      if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasChanged)(localValue, propValue)) {
14950        localValue = propValue;
14951        trigger();
14952      }
14953    });
14954    return {
14955      get() {
14956        track();
14957        return options.get ? options.get(localValue) : localValue;
14958      },
14959      set(value) {
14960        if (!(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasChanged)(value, localValue) && !(prevSetValue !== _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasChanged)(value, prevSetValue))) {
14961          return;
14962        }
14963        const rawProps = i.vnode.props;
14964        if (!(rawProps && // check if parent has passed v-model
14965        (name in rawProps || camelizedName in rawProps || hyphenatedName in rawProps) && (`onUpdate:${name}` in rawProps || `onUpdate:${camelizedName}` in rawProps || `onUpdate:${hyphenatedName}` in rawProps))) {
14966          localValue = value;
14967          trigger();
14968        }
14969        const emittedValue = options.set ? options.set(value) : value;
14970        i.emit(`update:${name}`, emittedValue);
14971        if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasChanged)(value, emittedValue) && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasChanged)(value, prevSetValue) && !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasChanged)(emittedValue, prevEmittedValue)) {
14972          trigger();
14973        }
14974        prevSetValue = value;
14975        prevEmittedValue = emittedValue;
14976      }
14977    };
14978  });
14979  res[Symbol.iterator] = () => {
14980    let i2 = 0;
14981    return {
14982      next() {
14983        if (i2 < 2) {
14984          return { value: i2++ ? modifiers || _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ : res, done: false };
14985        } else {
14986          return { done: true };
14987        }
14988      }
14989    };
14990  };
14991  return res;
14992}
14993const getModelModifiers = (props, modelName) => {
14994  return modelName === "modelValue" || modelName === "model-value" ? props.modelModifiers : props[`${modelName}Modifiers`] || props[`${(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.camelize)(modelName)}Modifiers`] || props[`${(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hyphenate)(modelName)}Modifiers`];
14995};
14996
14997function emit(instance, event, ...rawArgs) {
14998  if (instance.isUnmounted) return;
14999  const props = instance.vnode.props || _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ;
15000  if (true) {
15001    const {
15002      emitsOptions,
15003      propsOptions: [propsOptions]
15004    } = instance;
15005    if (emitsOptions) {
15006      if (!(event in emitsOptions) && true) {
15007        if (!propsOptions || !((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.toHandlerKey)(event) in propsOptions)) {
15008          warn$1(
15009            `Component emitted event "${event}" but it is neither declared in the emits option nor as an "${(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.toHandlerKey)(event)}" prop.`
15010          );
15011        }
15012      } else {
15013        const validator = emitsOptions[event];
15014        if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(validator)) {
15015          const isValid = validator(...rawArgs);
15016          if (!isValid) {
15017            warn$1(
15018              `Invalid event arguments: event validation failed for event "${event}".`
15019            );
15020          }
15021        }
15022      }
15023    }
15024  }
15025  let args = rawArgs;
15026  const isModelListener = event.startsWith("update:");
15027  const modifiers = isModelListener && getModelModifiers(props, event.slice(7));
15028  if (modifiers) {
15029    if (modifiers.trim) {
15030      args = rawArgs.map((a) => (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isString)(a) ? a.trim() : a);
15031    }
15032    if (modifiers.number) {
15033      args = rawArgs.map(_vue_shared__WEBPACK_IMPORTED_MODULE_1__.looseToNumber);
15034    }
15035  }
15036  if (true) {
15037    devtoolsComponentEmit(instance, event, args);
15038  }
15039  if (true) {
15040    const lowerCaseEvent = event.toLowerCase();
15041    if (lowerCaseEvent !== event && props[(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.toHandlerKey)(lowerCaseEvent)]) {
15042      warn$1(
15043        `Event "${lowerCaseEvent}" is emitted in component ${formatComponentName(
15044          instance,
15045          instance.type
15046        )} but the handler is registered for "${event}". Note that HTML attributes are case-insensitive and you cannot use v-on to listen to camelCase events when using in-DOM templates. You should probably use "${(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hyphenate)(
15047          event
15048        )}" instead of "${event}".`
15049      );
15050    }
15051  }
15052  let handlerName;
15053  let handler = props[handlerName = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.toHandlerKey)(event)] || // also try camelCase event handler (#2249)
15054  props[handlerName = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.toHandlerKey)((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.camelize)(event))];
15055  if (!handler && isModelListener) {
15056    handler = props[handlerName = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.toHandlerKey)((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hyphenate)(event))];
15057  }
15058  if (handler) {
15059    callWithAsyncErrorHandling(
15060      handler,
15061      instance,
15062      6,
15063      args
15064    );
15065  }
15066  const onceHandler = props[handlerName + `Once`];
15067  if (onceHandler) {
15068    if (!instance.emitted) {
15069      instance.emitted = {};
15070    } else if (instance.emitted[handlerName]) {
15071      return;
15072    }
15073    instance.emitted[handlerName] = true;
15074    callWithAsyncErrorHandling(
15075      onceHandler,
15076      instance,
15077      6,
15078      args
15079    );
15080  }
15081}
15082function normalizeEmitsOptions(comp, appContext, asMixin = false) {
15083  const cache = appContext.emitsCache;
15084  const cached = cache.get(comp);
15085  if (cached !== void 0) {
15086    return cached;
15087  }
15088  const raw = comp.emits;
15089  let normalized = {};
15090  let hasExtends = false;
15091  if ( true && !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(comp)) {
15092    const extendEmits = (raw2) => {
15093      const normalizedFromExtend = normalizeEmitsOptions(raw2, appContext, true);
15094      if (normalizedFromExtend) {
15095        hasExtends = true;
15096        (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)(normalized, normalizedFromExtend);
15097      }
15098    };
15099    if (!asMixin && appContext.mixins.length) {
15100      appContext.mixins.forEach(extendEmits);
15101    }
15102    if (comp.extends) {
15103      extendEmits(comp.extends);
15104    }
15105    if (comp.mixins) {
15106      comp.mixins.forEach(extendEmits);
15107    }
15108  }
15109  if (!raw && !hasExtends) {
15110    if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isObject)(comp)) {
15111      cache.set(comp, null);
15112    }
15113    return null;
15114  }
15115  if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(raw)) {
15116    raw.forEach((key) => normalized[key] = null);
15117  } else {
15118    (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)(normalized, raw);
15119  }
15120  if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isObject)(comp)) {
15121    cache.set(comp, normalized);
15122  }
15123  return normalized;
15124}
15125function isEmitListener(options, key) {
15126  if (!options || !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isOn)(key)) {
15127    return false;
15128  }
15129  key = key.slice(2).replace(/Once$/, "");
15130  return (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(options, key[0].toLowerCase() + key.slice(1)) || (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(options, (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hyphenate)(key)) || (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(options, key);
15131}
15132
15133let accessedAttrs = false;
15134function markAttrsAccessed() {
15135  accessedAttrs = true;
15136}
15137function renderComponentRoot(instance) {
15138  const {
15139    type: Component,
15140    vnode,
15141    proxy,
15142    withProxy,
15143    propsOptions: [propsOptions],
15144    slots,
15145    attrs,
15146    emit,
15147    render,
15148    renderCache,
15149    props,
15150    data,
15151    setupState,
15152    ctx,
15153    inheritAttrs
15154  } = instance;
15155  const prev = setCurrentRenderingInstance(instance);
15156  let result;
15157  let fallthroughAttrs;
15158  if (true) {
15159    accessedAttrs = false;
15160  }
15161  try {
15162    if (vnode.shapeFlag & 4) {
15163      const proxyToUse = withProxy || proxy;
15164      const thisProxy =  true && setupState.__isScriptSetup ? new Proxy(proxyToUse, {
15165        get(target, key, receiver) {
15166          warn$1(
15167            `Property '${String(
15168              key
15169            )}' was accessed via 'this'. Avoid using 'this' in templates.`
15170          );
15171          return Reflect.get(target, key, receiver);
15172        }
15173      }) : proxyToUse;
15174      result = normalizeVNode(
15175        render.call(
15176          thisProxy,
15177          proxyToUse,
15178          renderCache,
15179           true ? (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.shallowReadonly)(props) : 0,
15180          setupState,
15181          data,
15182          ctx
15183        )
15184      );
15185      fallthroughAttrs = attrs;
15186    } else {
15187      const render2 = Component;
15188      if ( true && attrs === props) {
15189        markAttrsAccessed();
15190      }
15191      result = normalizeVNode(
15192        render2.length > 1 ? render2(
15193           true ? (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.shallowReadonly)(props) : 0,
15194           true ? {
15195            get attrs() {
15196              markAttrsAccessed();
15197              return (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.shallowReadonly)(attrs);
15198            },
15199            slots,
15200            emit
15201          } : 0
15202        ) : render2(
15203           true ? (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.shallowReadonly)(props) : 0,
15204          null
15205        )
15206      );
15207      fallthroughAttrs = Component.props ? attrs : getFunctionalFallthrough(attrs);
15208    }
15209  } catch (err) {
15210    blockStack.length = 0;
15211    handleError(err, instance, 1);
15212    result = createVNode(Comment);
15213  }
15214  let root = result;
15215  let setRoot = void 0;
15216  if ( true && result.patchFlag > 0 && result.patchFlag & 2048) {
15217    [root, setRoot] = getChildRoot(result);
15218  }
15219  if (fallthroughAttrs && inheritAttrs !== false) {
15220    const keys = Object.keys(fallthroughAttrs);
15221    const { shapeFlag } = root;
15222    if (keys.length) {
15223      if (shapeFlag & (1 | 6)) {
15224        if (propsOptions && keys.some(_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isModelListener)) {
15225          fallthroughAttrs = filterModelListeners(
15226            fallthroughAttrs,
15227            propsOptions
15228          );
15229        }
15230        root = cloneVNode(root, fallthroughAttrs, false, true);
15231      } else if ( true && !accessedAttrs && root.type !== Comment) {
15232        const allAttrs = Object.keys(attrs);
15233        const eventAttrs = [];
15234        const extraAttrs = [];
15235        for (let i = 0, l = allAttrs.length; i < l; i++) {
15236          const key = allAttrs[i];
15237          if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isOn)(key)) {
15238            if (!(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isModelListener)(key)) {
15239              eventAttrs.push(key[2].toLowerCase() + key.slice(3));
15240            }
15241          } else {
15242            extraAttrs.push(key);
15243          }
15244        }
15245        if (extraAttrs.length) {
15246          warn$1(
15247            `Extraneous non-props attributes (${extraAttrs.join(", ")}) were passed to component but could not be automatically inherited because component renders fragment or text root nodes.`
15248          );
15249        }
15250        if (eventAttrs.length) {
15251          warn$1(
15252            `Extraneous non-emits event listeners (${eventAttrs.join(", ")}) were passed to component but could not be automatically inherited because component renders fragment or text root nodes. If the listener is intended to be a component custom event listener only, declare it using the "emits" option.`
15253          );
15254        }
15255      }
15256    }
15257  }
15258  if (vnode.dirs) {
15259    if ( true && !isElementRoot(root)) {
15260      warn$1(
15261        `Runtime directive used on component with non-element root node. The directives will not function as intended.`
15262      );
15263    }
15264    root = cloneVNode(root, null, false, true);
15265    root.dirs = root.dirs ? root.dirs.concat(vnode.dirs) : vnode.dirs;
15266  }
15267  if (vnode.transition) {
15268    if ( true && !isElementRoot(root)) {
15269      warn$1(
15270        `Component inside <Transition> renders non-element root node that cannot be animated.`
15271      );
15272    }
15273    root.transition = vnode.transition;
15274  }
15275  if ( true && setRoot) {
15276    setRoot(root);
15277  } else {
15278    result = root;
15279  }
15280  setCurrentRenderingInstance(prev);
15281  return result;
15282}
15283const getChildRoot = (vnode) => {
15284  const rawChildren = vnode.children;
15285  const dynamicChildren = vnode.dynamicChildren;
15286  const childRoot = filterSingleRoot(rawChildren, false);
15287  if (!childRoot) {
15288    return [vnode, void 0];
15289  } else if ( true && childRoot.patchFlag > 0 && childRoot.patchFlag & 2048) {
15290    return getChildRoot(childRoot);
15291  }
15292  const index = rawChildren.indexOf(childRoot);
15293  const dynamicIndex = dynamicChildren ? dynamicChildren.indexOf(childRoot) : -1;
15294  const setRoot = (updatedRoot) => {
15295    rawChildren[index] = updatedRoot;
15296    if (dynamicChildren) {
15297      if (dynamicIndex > -1) {
15298        dynamicChildren[dynamicIndex] = updatedRoot;
15299      } else if (updatedRoot.patchFlag > 0) {
15300        vnode.dynamicChildren = [...dynamicChildren, updatedRoot];
15301      }
15302    }
15303  };
15304  return [normalizeVNode(childRoot), setRoot];
15305};
15306function filterSingleRoot(children, recurse = true) {
15307  let singleRoot;
15308  for (let i = 0; i < children.length; i++) {
15309    const child = children[i];
15310    if (isVNode(child)) {
15311      if (child.type !== Comment || child.children === "v-if") {
15312        if (singleRoot) {
15313          return;
15314        } else {
15315          singleRoot = child;
15316          if ( true && recurse && singleRoot.patchFlag > 0 && singleRoot.patchFlag & 2048) {
15317            return filterSingleRoot(singleRoot.children);
15318          }
15319        }
15320      }
15321    } else {
15322      return;
15323    }
15324  }
15325  return singleRoot;
15326}
15327const getFunctionalFallthrough = (attrs) => {
15328  let res;
15329  for (const key in attrs) {
15330    if (key === "class" || key === "style" || (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isOn)(key)) {
15331      (res || (res = {}))[key] = attrs[key];
15332    }
15333  }
15334  return res;
15335};
15336const filterModelListeners = (attrs, props) => {
15337  const res = {};
15338  for (const key in attrs) {
15339    if (!(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isModelListener)(key) || !(key.slice(9) in props)) {
15340      res[key] = attrs[key];
15341    }
15342  }
15343  return res;
15344};
15345const isElementRoot = (vnode) => {
15346  return vnode.shapeFlag & (6 | 1) || vnode.type === Comment;
15347};
15348function shouldUpdateComponent(prevVNode, nextVNode, optimized) {
15349  const { props: prevProps, children: prevChildren, component } = prevVNode;
15350  const { props: nextProps, children: nextChildren, patchFlag } = nextVNode;
15351  const emits = component.emitsOptions;
15352  if ( true && (prevChildren || nextChildren) && isHmrUpdating) {
15353    return true;
15354  }
15355  if (nextVNode.dirs || nextVNode.transition) {
15356    return true;
15357  }
15358  if (optimized && patchFlag >= 0) {
15359    if (patchFlag & 1024) {
15360      return true;
15361    }
15362    if (patchFlag & 16) {
15363      if (!prevProps) {
15364        return !!nextProps;
15365      }
15366      return hasPropsChanged(prevProps, nextProps, emits);
15367    } else if (patchFlag & 8) {
15368      const dynamicProps = nextVNode.dynamicProps;
15369      for (let i = 0; i < dynamicProps.length; i++) {
15370        const key = dynamicProps[i];
15371        if (nextProps[key] !== prevProps[key] && !isEmitListener(emits, key)) {
15372          return true;
15373        }
15374      }
15375    }
15376  } else {
15377    if (prevChildren || nextChildren) {
15378      if (!nextChildren || !nextChildren.$stable) {
15379        return true;
15380      }
15381    }
15382    if (prevProps === nextProps) {
15383      return false;
15384    }
15385    if (!prevProps) {
15386      return !!nextProps;
15387    }
15388    if (!nextProps) {
15389      return true;
15390    }
15391    return hasPropsChanged(prevProps, nextProps, emits);
15392  }
15393  return false;
15394}
15395function hasPropsChanged(prevProps, nextProps, emitsOptions) {
15396  const nextKeys = Object.keys(nextProps);
15397  if (nextKeys.length !== Object.keys(prevProps).length) {
15398    return true;
15399  }
15400  for (let i = 0; i < nextKeys.length; i++) {
15401    const key = nextKeys[i];
15402    if (nextProps[key] !== prevProps[key] && !isEmitListener(emitsOptions, key)) {
15403      return true;
15404    }
15405  }
15406  return false;
15407}
15408function updateHOCHostEl({ vnode, parent }, el) {
15409  while (parent) {
15410    const root = parent.subTree;
15411    if (root.suspense && root.suspense.activeBranch === vnode) {
15412      root.el = vnode.el;
15413    }
15414    if (root === vnode) {
15415      (vnode = parent.vnode).el = el;
15416      parent = parent.parent;
15417    } else {
15418      break;
15419    }
15420  }
15421}
15422
15423const isSuspense = (type) => type.__isSuspense;
15424let suspenseId = 0;
15425const SuspenseImpl = {
15426  name: "Suspense",
15427  // In order to make Suspense tree-shakable, we need to avoid importing it
15428  // directly in the renderer. The renderer checks for the __isSuspense flag
15429  // on a vnode's type and calls the `process` method, passing in renderer
15430  // internals.
15431  __isSuspense: true,
15432  process(n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized, rendererInternals) {
15433    if (n1 == null) {
15434      mountSuspense(
15435        n2,
15436        container,
15437        anchor,
15438        parentComponent,
15439        parentSuspense,
15440        namespace,
15441        slotScopeIds,
15442        optimized,
15443        rendererInternals
15444      );
15445    } else {
15446      if (parentSuspense && parentSuspense.deps > 0 && !n1.suspense.isInFallback) {
15447        n2.suspense = n1.suspense;
15448        n2.suspense.vnode = n2;
15449        n2.el = n1.el;
15450        return;
15451      }
15452      patchSuspense(
15453        n1,
15454        n2,
15455        container,
15456        anchor,
15457        parentComponent,
15458        namespace,
15459        slotScopeIds,
15460        optimized,
15461        rendererInternals
15462      );
15463    }
15464  },
15465  hydrate: hydrateSuspense,
15466  normalize: normalizeSuspenseChildren
15467};
15468const Suspense = SuspenseImpl ;
15469function triggerEvent(vnode, name) {
15470  const eventListener = vnode.props && vnode.props[name];
15471  if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(eventListener)) {
15472    eventListener();
15473  }
15474}
15475function mountSuspense(vnode, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized, rendererInternals) {
15476  const {
15477    p: patch,
15478    o: { createElement }
15479  } = rendererInternals;
15480  const hiddenContainer = createElement("div");
15481  const suspense = vnode.suspense = createSuspenseBoundary(
15482    vnode,
15483    parentSuspense,
15484    parentComponent,
15485    container,
15486    hiddenContainer,
15487    anchor,
15488    namespace,
15489    slotScopeIds,
15490    optimized,
15491    rendererInternals
15492  );
15493  patch(
15494    null,
15495    suspense.pendingBranch = vnode.ssContent,
15496    hiddenContainer,
15497    null,
15498    parentComponent,
15499    suspense,
15500    namespace,
15501    slotScopeIds
15502  );
15503  if (suspense.deps > 0) {
15504    triggerEvent(vnode, "onPending");
15505    triggerEvent(vnode, "onFallback");
15506    patch(
15507      null,
15508      vnode.ssFallback,
15509      container,
15510      anchor,
15511      parentComponent,
15512      null,
15513      // fallback tree will not have suspense context
15514      namespace,
15515      slotScopeIds
15516    );
15517    setActiveBranch(suspense, vnode.ssFallback);
15518  } else {
15519    suspense.resolve(false, true);
15520  }
15521}
15522function patchSuspense(n1, n2, container, anchor, parentComponent, namespace, slotScopeIds, optimized, { p: patch, um: unmount, o: { createElement } }) {
15523  const suspense = n2.suspense = n1.suspense;
15524  suspense.vnode = n2;
15525  n2.el = n1.el;
15526  const newBranch = n2.ssContent;
15527  const newFallback = n2.ssFallback;
15528  const { activeBranch, pendingBranch, isInFallback, isHydrating } = suspense;
15529  if (pendingBranch) {
15530    suspense.pendingBranch = newBranch;
15531    if (isSameVNodeType(newBranch, pendingBranch)) {
15532      patch(
15533        pendingBranch,
15534        newBranch,
15535        suspense.hiddenContainer,
15536        null,
15537        parentComponent,
15538        suspense,
15539        namespace,
15540        slotScopeIds,
15541        optimized
15542      );
15543      if (suspense.deps <= 0) {
15544        suspense.resolve();
15545      } else if (isInFallback) {
15546        if (!isHydrating) {
15547          patch(
15548            activeBranch,
15549            newFallback,
15550            container,
15551            anchor,
15552            parentComponent,
15553            null,
15554            // fallback tree will not have suspense context
15555            namespace,
15556            slotScopeIds,
15557            optimized
15558          );
15559          setActiveBranch(suspense, newFallback);
15560        }
15561      }
15562    } else {
15563      suspense.pendingId = suspenseId++;
15564      if (isHydrating) {
15565        suspense.isHydrating = false;
15566        suspense.activeBranch = pendingBranch;
15567      } else {
15568        unmount(pendingBranch, parentComponent, suspense);
15569      }
15570      suspense.deps = 0;
15571      suspense.effects.length = 0;
15572      suspense.hiddenContainer = createElement("div");
15573      if (isInFallback) {
15574        patch(
15575          null,
15576          newBranch,
15577          suspense.hiddenContainer,
15578          null,
15579          parentComponent,
15580          suspense,
15581          namespace,
15582          slotScopeIds,
15583          optimized
15584        );
15585        if (suspense.deps <= 0) {
15586          suspense.resolve();
15587        } else {
15588          patch(
15589            activeBranch,
15590            newFallback,
15591            container,
15592            anchor,
15593            parentComponent,
15594            null,
15595            // fallback tree will not have suspense context
15596            namespace,
15597            slotScopeIds,
15598            optimized
15599          );
15600          setActiveBranch(suspense, newFallback);
15601        }
15602      } else if (activeBranch && isSameVNodeType(newBranch, activeBranch)) {
15603        patch(
15604          activeBranch,
15605          newBranch,
15606          container,
15607          anchor,
15608          parentComponent,
15609          suspense,
15610          namespace,
15611          slotScopeIds,
15612          optimized
15613        );
15614        suspense.resolve(true);
15615      } else {
15616        patch(
15617          null,
15618          newBranch,
15619          suspense.hiddenContainer,
15620          null,
15621          parentComponent,
15622          suspense,
15623          namespace,
15624          slotScopeIds,
15625          optimized
15626        );
15627        if (suspense.deps <= 0) {
15628          suspense.resolve();
15629        }
15630      }
15631    }
15632  } else {
15633    if (activeBranch && isSameVNodeType(newBranch, activeBranch)) {
15634      patch(
15635        activeBranch,
15636        newBranch,
15637        container,
15638        anchor,
15639        parentComponent,
15640        suspense,
15641        namespace,
15642        slotScopeIds,
15643        optimized
15644      );
15645      setActiveBranch(suspense, newBranch);
15646    } else {
15647      triggerEvent(n2, "onPending");
15648      suspense.pendingBranch = newBranch;
15649      if (newBranch.shapeFlag & 512) {
15650        suspense.pendingId = newBranch.component.suspenseId;
15651      } else {
15652        suspense.pendingId = suspenseId++;
15653      }
15654      patch(
15655        null,
15656        newBranch,
15657        suspense.hiddenContainer,
15658        null,
15659        parentComponent,
15660        suspense,
15661        namespace,
15662        slotScopeIds,
15663        optimized
15664      );
15665      if (suspense.deps <= 0) {
15666        suspense.resolve();
15667      } else {
15668        const { timeout, pendingId } = suspense;
15669        if (timeout > 0) {
15670          setTimeout(() => {
15671            if (suspense.pendingId === pendingId) {
15672              suspense.fallback(newFallback);
15673            }
15674          }, timeout);
15675        } else if (timeout === 0) {
15676          suspense.fallback(newFallback);
15677        }
15678      }
15679    }
15680  }
15681}
15682let hasWarned = false;
15683function createSuspenseBoundary(vnode, parentSuspense, parentComponent, container, hiddenContainer, anchor, namespace, slotScopeIds, optimized, rendererInternals, isHydrating = false) {
15684  if ( true && !hasWarned) {
15685    hasWarned = true;
15686    console[console.info ? "info" : "log"](
15687      `<Suspense> is an experimental feature and its API will likely change.`
15688    );
15689  }
15690  const {
15691    p: patch,
15692    m: move,
15693    um: unmount,
15694    n: next,
15695    o: { parentNode, remove }
15696  } = rendererInternals;
15697  let parentSuspenseId;
15698  const isSuspensible = isVNodeSuspensible(vnode);
15699  if (isSuspensible) {
15700    if (parentSuspense && parentSuspense.pendingBranch) {
15701      parentSuspenseId = parentSuspense.pendingId;
15702      parentSuspense.deps++;
15703    }
15704  }
15705  const timeout = vnode.props ? (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.toNumber)(vnode.props.timeout) : void 0;
15706  if (true) {
15707    assertNumber(timeout, `Suspense timeout`);
15708  }
15709  const initialAnchor = anchor;
15710  const suspense = {
15711    vnode,
15712    parent: parentSuspense,
15713    parentComponent,
15714    namespace,
15715    container,
15716    hiddenContainer,
15717    deps: 0,
15718    pendingId: suspenseId++,
15719    timeout: typeof timeout === "number" ? timeout : -1,
15720    activeBranch: null,
15721    pendingBranch: null,
15722    isInFallback: !isHydrating,
15723    isHydrating,
15724    isUnmounted: false,
15725    effects: [],
15726    resolve(resume = false, sync = false) {
15727      if (true) {
15728        if (!resume && !suspense.pendingBranch) {
15729          throw new Error(
15730            `suspense.resolve() is called without a pending branch.`
15731          );
15732        }
15733        if (suspense.isUnmounted) {
15734          throw new Error(
15735            `suspense.resolve() is called on an already unmounted suspense boundary.`
15736          );
15737        }
15738      }
15739      const {
15740        vnode: vnode2,
15741        activeBranch,
15742        pendingBranch,
15743        pendingId,
15744        effects,
15745        parentComponent: parentComponent2,
15746        container: container2
15747      } = suspense;
15748      let delayEnter = false;
15749      if (suspense.isHydrating) {
15750        suspense.isHydrating = false;
15751      } else if (!resume) {
15752        delayEnter = activeBranch && pendingBranch.transition && pendingBranch.transition.mode === "out-in";
15753        if (delayEnter) {
15754          activeBranch.transition.afterLeave = () => {
15755            if (pendingId === suspense.pendingId) {
15756              move(
15757                pendingBranch,
15758                container2,
15759                anchor === initialAnchor ? next(activeBranch) : anchor,
15760                0
15761              );
15762              queuePostFlushCb(effects);
15763            }
15764          };
15765        }
15766        if (activeBranch) {
15767          if (parentNode(activeBranch.el) !== suspense.hiddenContainer) {
15768            anchor = next(activeBranch);
15769          }
15770          unmount(activeBranch, parentComponent2, suspense, true);
15771        }
15772        if (!delayEnter) {
15773          move(pendingBranch, container2, anchor, 0);
15774        }
15775      }
15776      setActiveBranch(suspense, pendingBranch);
15777      suspense.pendingBranch = null;
15778      suspense.isInFallback = false;
15779      let parent = suspense.parent;
15780      let hasUnresolvedAncestor = false;
15781      while (parent) {
15782        if (parent.pendingBranch) {
15783          parent.effects.push(...effects);
15784          hasUnresolvedAncestor = true;
15785          break;
15786        }
15787        parent = parent.parent;
15788      }
15789      if (!hasUnresolvedAncestor && !delayEnter) {
15790        queuePostFlushCb(effects);
15791      }
15792      suspense.effects = [];
15793      if (isSuspensible) {
15794        if (parentSuspense && parentSuspense.pendingBranch && parentSuspenseId === parentSuspense.pendingId) {
15795          parentSuspense.deps--;
15796          if (parentSuspense.deps === 0 && !sync) {
15797            parentSuspense.resolve();
15798          }
15799        }
15800      }
15801      triggerEvent(vnode2, "onResolve");
15802    },
15803    fallback(fallbackVNode) {
15804      if (!suspense.pendingBranch) {
15805        return;
15806      }
15807      const { vnode: vnode2, activeBranch, parentComponent: parentComponent2, container: container2, namespace: namespace2 } = suspense;
15808      triggerEvent(vnode2, "onFallback");
15809      const anchor2 = next(activeBranch);
15810      const mountFallback = () => {
15811        if (!suspense.isInFallback) {
15812          return;
15813        }
15814        patch(
15815          null,
15816          fallbackVNode,
15817          container2,
15818          anchor2,
15819          parentComponent2,
15820          null,
15821          // fallback tree will not have suspense context
15822          namespace2,
15823          slotScopeIds,
15824          optimized
15825        );
15826        setActiveBranch(suspense, fallbackVNode);
15827      };
15828      const delayEnter = fallbackVNode.transition && fallbackVNode.transition.mode === "out-in";
15829      if (delayEnter) {
15830        activeBranch.transition.afterLeave = mountFallback;
15831      }
15832      suspense.isInFallback = true;
15833      unmount(
15834        activeBranch,
15835        parentComponent2,
15836        null,
15837        // no suspense so unmount hooks fire now
15838        true
15839        // shouldRemove
15840      );
15841      if (!delayEnter) {
15842        mountFallback();
15843      }
15844    },
15845    move(container2, anchor2, type) {
15846      suspense.activeBranch && move(suspense.activeBranch, container2, anchor2, type);
15847      suspense.container = container2;
15848    },
15849    next() {
15850      return suspense.activeBranch && next(suspense.activeBranch);
15851    },
15852    registerDep(instance, setupRenderEffect, optimized2) {
15853      const isInPendingSuspense = !!suspense.pendingBranch;
15854      if (isInPendingSuspense) {
15855        suspense.deps++;
15856      }
15857      const hydratedEl = instance.vnode.el;
15858      instance.asyncDep.catch((err) => {
15859        handleError(err, instance, 0);
15860      }).then((asyncSetupResult) => {
15861        if (instance.isUnmounted || suspense.isUnmounted || suspense.pendingId !== instance.suspenseId) {
15862          return;
15863        }
15864        instance.asyncResolved = true;
15865        const { vnode: vnode2 } = instance;
15866        if (true) {
15867          pushWarningContext(vnode2);
15868        }
15869        handleSetupResult(instance, asyncSetupResult, false);
15870        if (hydratedEl) {
15871          vnode2.el = hydratedEl;
15872        }
15873        const placeholder = !hydratedEl && instance.subTree.el;
15874        setupRenderEffect(
15875          instance,
15876          vnode2,
15877          // component may have been moved before resolve.
15878          // if this is not a hydration, instance.subTree will be the comment
15879          // placeholder.
15880          parentNode(hydratedEl || instance.subTree.el),
15881          // anchor will not be used if this is hydration, so only need to
15882          // consider the comment placeholder case.
15883          hydratedEl ? null : next(instance.subTree),
15884          suspense,
15885          namespace,
15886          optimized2
15887        );
15888        if (placeholder) {
15889          remove(placeholder);
15890        }
15891        updateHOCHostEl(instance, vnode2.el);
15892        if (true) {
15893          popWarningContext();
15894        }
15895        if (isInPendingSuspense && --suspense.deps === 0) {
15896          suspense.resolve();
15897        }
15898      });
15899    },
15900    unmount(parentSuspense2, doRemove) {
15901      suspense.isUnmounted = true;
15902      if (suspense.activeBranch) {
15903        unmount(
15904          suspense.activeBranch,
15905          parentComponent,
15906          parentSuspense2,
15907          doRemove
15908        );
15909      }
15910      if (suspense.pendingBranch) {
15911        unmount(
15912          suspense.pendingBranch,
15913          parentComponent,
15914          parentSuspense2,
15915          doRemove
15916        );
15917      }
15918    }
15919  };
15920  return suspense;
15921}
15922function hydrateSuspense(node, vnode, parentComponent, parentSuspense, namespace, slotScopeIds, optimized, rendererInternals, hydrateNode) {
15923  const suspense = vnode.suspense = createSuspenseBoundary(
15924    vnode,
15925    parentSuspense,
15926    parentComponent,
15927    node.parentNode,
15928    // eslint-disable-next-line no-restricted-globals
15929    document.createElement("div"),
15930    null,
15931    namespace,
15932    slotScopeIds,
15933    optimized,
15934    rendererInternals,
15935    true
15936  );
15937  const result = hydrateNode(
15938    node,
15939    suspense.pendingBranch = vnode.ssContent,
15940    parentComponent,
15941    suspense,
15942    slotScopeIds,
15943    optimized
15944  );
15945  if (suspense.deps === 0) {
15946    suspense.resolve(false, true);
15947  }
15948  return result;
15949}
15950function normalizeSuspenseChildren(vnode) {
15951  const { shapeFlag, children } = vnode;
15952  const isSlotChildren = shapeFlag & 32;
15953  vnode.ssContent = normalizeSuspenseSlot(
15954    isSlotChildren ? children.default : children
15955  );
15956  vnode.ssFallback = isSlotChildren ? normalizeSuspenseSlot(children.fallback) : createVNode(Comment);
15957}
15958function normalizeSuspenseSlot(s) {
15959  let block;
15960  if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(s)) {
15961    const trackBlock = isBlockTreeEnabled && s._c;
15962    if (trackBlock) {
15963      s._d = false;
15964      openBlock();
15965    }
15966    s = s();
15967    if (trackBlock) {
15968      s._d = true;
15969      block = currentBlock;
15970      closeBlock();
15971    }
15972  }
15973  if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(s)) {
15974    const singleChild = filterSingleRoot(s);
15975    if ( true && !singleChild && s.filter((child) => child !== NULL_DYNAMIC_COMPONENT).length > 0) {
15976      warn$1(`<Suspense> slots expect a single root node.`);
15977    }
15978    s = singleChild;
15979  }
15980  s = normalizeVNode(s);
15981  if (block && !s.dynamicChildren) {
15982    s.dynamicChildren = block.filter((c) => c !== s);
15983  }
15984  return s;
15985}
15986function queueEffectWithSuspense(fn, suspense) {
15987  if (suspense && suspense.pendingBranch) {
15988    if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(fn)) {
15989      suspense.effects.push(...fn);
15990    } else {
15991      suspense.effects.push(fn);
15992    }
15993  } else {
15994    queuePostFlushCb(fn);
15995  }
15996}
15997function setActiveBranch(suspense, branch) {
15998  suspense.activeBranch = branch;
15999  const { vnode, parentComponent } = suspense;
16000  let el = branch.el;
16001  while (!el && branch.component) {
16002    branch = branch.component.subTree;
16003    el = branch.el;
16004  }
16005  vnode.el = el;
16006  if (parentComponent && parentComponent.subTree === vnode) {
16007    parentComponent.vnode.el = el;
16008    updateHOCHostEl(parentComponent, el);
16009  }
16010}
16011function isVNodeSuspensible(vnode) {
16012  const suspensible = vnode.props && vnode.props.suspensible;
16013  return suspensible != null && suspensible !== false;
16014}
16015
16016const Fragment = Symbol.for("v-fgt");
16017const Text = Symbol.for("v-txt");
16018const Comment = Symbol.for("v-cmt");
16019const Static = Symbol.for("v-stc");
16020const blockStack = [];
16021let currentBlock = null;
16022function openBlock(disableTracking = false) {
16023  blockStack.push(currentBlock = disableTracking ? null : []);
16024}
16025function closeBlock() {
16026  blockStack.pop();
16027  currentBlock = blockStack[blockStack.length - 1] || null;
16028}
16029let isBlockTreeEnabled = 1;
16030function setBlockTracking(value) {
16031  isBlockTreeEnabled += value;
16032  if (value < 0 && currentBlock) {
16033    currentBlock.hasOnce = true;
16034  }
16035}
16036function setupBlock(vnode) {
16037  vnode.dynamicChildren = isBlockTreeEnabled > 0 ? currentBlock || _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_ARR : null;
16038  closeBlock();
16039  if (isBlockTreeEnabled > 0 && currentBlock) {
16040    currentBlock.push(vnode);
16041  }
16042  return vnode;
16043}
16044function createElementBlock(type, props, children, patchFlag, dynamicProps, shapeFlag) {
16045  return setupBlock(
16046    createBaseVNode(
16047      type,
16048      props,
16049      children,
16050      patchFlag,
16051      dynamicProps,
16052      shapeFlag,
16053      true
16054    )
16055  );
16056}
16057function createBlock(type, props, children, patchFlag, dynamicProps) {
16058  return setupBlock(
16059    createVNode(
16060      type,
16061      props,
16062      children,
16063      patchFlag,
16064      dynamicProps,
16065      true
16066    )
16067  );
16068}
16069function isVNode(value) {
16070  return value ? value.__v_isVNode === true : false;
16071}
16072function isSameVNodeType(n1, n2) {
16073  if ( true && n2.shapeFlag & 6 && n1.component) {
16074    const dirtyInstances = hmrDirtyComponents.get(n2.type);
16075    if (dirtyInstances && dirtyInstances.has(n1.component)) {
16076      n1.shapeFlag &= ~256;
16077      n2.shapeFlag &= ~512;
16078      return false;
16079    }
16080  }
16081  return n1.type === n2.type && n1.key === n2.key;
16082}
16083let vnodeArgsTransformer;
16084function transformVNodeArgs(transformer) {
16085  vnodeArgsTransformer = transformer;
16086}
16087const createVNodeWithArgsTransform = (...args) => {
16088  return _createVNode(
16089    ...vnodeArgsTransformer ? vnodeArgsTransformer(args, currentRenderingInstance) : args
16090  );
16091};
16092const normalizeKey = ({ key }) => key != null ? key : null;
16093const normalizeRef = ({
16094  ref,
16095  ref_key,
16096  ref_for
16097}) => {
16098  if (typeof ref === "number") {
16099    ref = "" + ref;
16100  }
16101  return ref != null ? (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isString)(ref) || (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isRef)(ref) || (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(ref) ? { i: currentRenderingInstance, r: ref, k: ref_key, f: !!ref_for } : ref : null;
16102};
16103function createBaseVNode(type, props = null, children = null, patchFlag = 0, dynamicProps = null, shapeFlag = type === Fragment ? 0 : 1, isBlockNode = false, needFullChildrenNormalization = false) {
16104  const vnode = {
16105    __v_isVNode: true,
16106    __v_skip: true,
16107    type,
16108    props,
16109    key: props && normalizeKey(props),
16110    ref: props && normalizeRef(props),
16111    scopeId: currentScopeId,
16112    slotScopeIds: null,
16113    children,
16114    component: null,
16115    suspense: null,
16116    ssContent: null,
16117    ssFallback: null,
16118    dirs: null,
16119    transition: null,
16120    el: null,
16121    anchor: null,
16122    target: null,
16123    targetStart: null,
16124    targetAnchor: null,
16125    staticCount: 0,
16126    shapeFlag,
16127    patchFlag,
16128    dynamicProps,
16129    dynamicChildren: null,
16130    appContext: null,
16131    ctx: currentRenderingInstance
16132  };
16133  if (needFullChildrenNormalization) {
16134    normalizeChildren(vnode, children);
16135    if (shapeFlag & 128) {
16136      type.normalize(vnode);
16137    }
16138  } else if (children) {
16139    vnode.shapeFlag |= (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isString)(children) ? 8 : 16;
16140  }
16141  if ( true && vnode.key !== vnode.key) {
16142    warn$1(`VNode created with invalid key (NaN). VNode type:`, vnode.type);
16143  }
16144  if (isBlockTreeEnabled > 0 && // avoid a block node from tracking itself
16145  !isBlockNode && // has current parent block
16146  currentBlock && // presence of a patch flag indicates this node needs patching on updates.
16147  // component nodes also should always be patched, because even if the
16148  // component doesn't need to update, it needs to persist the instance on to
16149  // the next vnode so that it can be properly unmounted later.
16150  (vnode.patchFlag > 0 || shapeFlag & 6) && // the EVENTS flag is only for hydration and if it is the only flag, the
16151  // vnode should not be considered dynamic due to handler caching.
16152  vnode.patchFlag !== 32) {
16153    currentBlock.push(vnode);
16154  }
16155  return vnode;
16156}
16157const createVNode =  true ? createVNodeWithArgsTransform : 0;
16158function _createVNode(type, props = null, children = null, patchFlag = 0, dynamicProps = null, isBlockNode = false) {
16159  if (!type || type === NULL_DYNAMIC_COMPONENT) {
16160    if ( true && !type) {
16161      warn$1(`Invalid vnode type when creating vnode: ${type}.`);
16162    }
16163    type = Comment;
16164  }
16165  if (isVNode(type)) {
16166    const cloned = cloneVNode(
16167      type,
16168      props,
16169      true
16170      /* mergeRef: true */
16171    );
16172    if (children) {
16173      normalizeChildren(cloned, children);
16174    }
16175    if (isBlockTreeEnabled > 0 && !isBlockNode && currentBlock) {
16176      if (cloned.shapeFlag & 6) {
16177        currentBlock[currentBlock.indexOf(type)] = cloned;
16178      } else {
16179        currentBlock.push(cloned);
16180      }
16181    }
16182    cloned.patchFlag = -2;
16183    return cloned;
16184  }
16185  if (isClassComponent(type)) {
16186    type = type.__vccOpts;
16187  }
16188  if (props) {
16189    props = guardReactiveProps(props);
16190    let { class: klass, style } = props;
16191    if (klass && !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isString)(klass)) {
16192      props.class = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.normalizeClass)(klass);
16193    }
16194    if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isObject)(style)) {
16195      if ((0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isProxy)(style) && !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(style)) {
16196        style = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)({}, style);
16197      }
16198      props.style = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.normalizeStyle)(style);
16199    }
16200  }
16201  const shapeFlag = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isString)(type) ? 1 : isSuspense(type) ? 128 : isTeleport(type) ? 64 : (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isObject)(type) ? 4 : (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(type) ? 2 : 0;
16202  if ( true && shapeFlag & 4 && (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isProxy)(type)) {
16203    type = (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.toRaw)(type);
16204    warn$1(
16205      `Vue received a Component that was made a reactive object. This can lead to unnecessary performance overhead and should be avoided by marking the component with \`markRaw\` or using \`shallowRef\` instead of \`ref\`.`,
16206      `
16207Component that was made reactive: `,
16208      type
16209    );
16210  }
16211  return createBaseVNode(
16212    type,
16213    props,
16214    children,
16215    patchFlag,
16216    dynamicProps,
16217    shapeFlag,
16218    isBlockNode,
16219    true
16220  );
16221}
16222function guardReactiveProps(props) {
16223  if (!props) return null;
16224  return (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isProxy)(props) || isInternalObject(props) ? (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)({}, props) : props;
16225}
16226function cloneVNode(vnode, extraProps, mergeRef = false, cloneTransition = false) {
16227  const { props, ref, patchFlag, children, transition } = vnode;
16228  const mergedProps = extraProps ? mergeProps(props || {}, extraProps) : props;
16229  const cloned = {
16230    __v_isVNode: true,
16231    __v_skip: true,
16232    type: vnode.type,
16233    props: mergedProps,
16234    key: mergedProps && normalizeKey(mergedProps),
16235    ref: extraProps && extraProps.ref ? (
16236      // #2078 in the case of <component :is="vnode" ref="extra"/>
16237      // if the vnode itself already has a ref, cloneVNode will need to merge
16238      // the refs so the single vnode can be set on multiple refs
16239      mergeRef && ref ? (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(ref) ? ref.concat(normalizeRef(extraProps)) : [ref, normalizeRef(extraProps)] : normalizeRef(extraProps)
16240    ) : ref,
16241    scopeId: vnode.scopeId,
16242    slotScopeIds: vnode.slotScopeIds,
16243    children:  true && patchFlag === -1 && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(children) ? children.map(deepCloneVNode) : children,
16244    target: vnode.target,
16245    targetStart: vnode.targetStart,
16246    targetAnchor: vnode.targetAnchor,
16247    staticCount: vnode.staticCount,
16248    shapeFlag: vnode.shapeFlag,
16249    // if the vnode is cloned with extra props, we can no longer assume its
16250    // existing patch flag to be reliable and need to add the FULL_PROPS flag.
16251    // note: preserve flag for fragments since they use the flag for children
16252    // fast paths only.
16253    patchFlag: extraProps && vnode.type !== Fragment ? patchFlag === -1 ? 16 : patchFlag | 16 : patchFlag,
16254    dynamicProps: vnode.dynamicProps,
16255    dynamicChildren: vnode.dynamicChildren,
16256    appContext: vnode.appContext,
16257    dirs: vnode.dirs,
16258    transition,
16259    // These should technically only be non-null on mounted VNodes. However,
16260    // they *should* be copied for kept-alive vnodes. So we just always copy
16261    // them since them being non-null during a mount doesn't affect the logic as
16262    // they will simply be overwritten.
16263    component: vnode.component,
16264    suspense: vnode.suspense,
16265    ssContent: vnode.ssContent && cloneVNode(vnode.ssContent),
16266    ssFallback: vnode.ssFallback && cloneVNode(vnode.ssFallback),
16267    el: vnode.el,
16268    anchor: vnode.anchor,
16269    ctx: vnode.ctx,
16270    ce: vnode.ce
16271  };
16272  if (transition && cloneTransition) {
16273    setTransitionHooks(
16274      cloned,
16275      transition.clone(cloned)
16276    );
16277  }
16278  return cloned;
16279}
16280function deepCloneVNode(vnode) {
16281  const cloned = cloneVNode(vnode);
16282  if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(vnode.children)) {
16283    cloned.children = vnode.children.map(deepCloneVNode);
16284  }
16285  return cloned;
16286}
16287function createTextVNode(text = " ", flag = 0) {
16288  return createVNode(Text, null, text, flag);
16289}
16290function createStaticVNode(content, numberOfNodes) {
16291  const vnode = createVNode(Static, null, content);
16292  vnode.staticCount = numberOfNodes;
16293  return vnode;
16294}
16295function createCommentVNode(text = "", asBlock = false) {
16296  return asBlock ? (openBlock(), createBlock(Comment, null, text)) : createVNode(Comment, null, text);
16297}
16298function normalizeVNode(child) {
16299  if (child == null || typeof child === "boolean") {
16300    return createVNode(Comment);
16301  } else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(child)) {
16302    return createVNode(
16303      Fragment,
16304      null,
16305      // #3666, avoid reference pollution when reusing vnode
16306      child.slice()
16307    );
16308  } else if (typeof child === "object") {
16309    return cloneIfMounted(child);
16310  } else {
16311    return createVNode(Text, null, String(child));
16312  }
16313}
16314function cloneIfMounted(child) {
16315  return child.el === null && child.patchFlag !== -1 || child.memo ? child : cloneVNode(child);
16316}
16317function normalizeChildren(vnode, children) {
16318  let type = 0;
16319  const { shapeFlag } = vnode;
16320  if (children == null) {
16321    children = null;
16322  } else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(children)) {
16323    type = 16;
16324  } else if (typeof children === "object") {
16325    if (shapeFlag & (1 | 64)) {
16326      const slot = children.default;
16327      if (slot) {
16328        slot._c && (slot._d = false);
16329        normalizeChildren(vnode, slot());
16330        slot._c && (slot._d = true);
16331      }
16332      return;
16333    } else {
16334      type = 32;
16335      const slotFlag = children._;
16336      if (!slotFlag && !isInternalObject(children)) {
16337        children._ctx = currentRenderingInstance;
16338      } else if (slotFlag === 3 && currentRenderingInstance) {
16339        if (currentRenderingInstance.slots._ === 1) {
16340          children._ = 1;
16341        } else {
16342          children._ = 2;
16343          vnode.patchFlag |= 1024;
16344        }
16345      }
16346    }
16347  } else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(children)) {
16348    children = { default: children, _ctx: currentRenderingInstance };
16349    type = 32;
16350  } else {
16351    children = String(children);
16352    if (shapeFlag & 64) {
16353      type = 16;
16354      children = [createTextVNode(children)];
16355    } else {
16356      type = 8;
16357    }
16358  }
16359  vnode.children = children;
16360  vnode.shapeFlag |= type;
16361}
16362function mergeProps(...args) {
16363  const ret = {};
16364  for (let i = 0; i < args.length; i++) {
16365    const toMerge = args[i];
16366    for (const key in toMerge) {
16367      if (key === "class") {
16368        if (ret.class !== toMerge.class) {
16369          ret.class = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.normalizeClass)([ret.class, toMerge.class]);
16370        }
16371      } else if (key === "style") {
16372        ret.style = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.normalizeStyle)([ret.style, toMerge.style]);
16373      } else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isOn)(key)) {
16374        const existing = ret[key];
16375        const incoming = toMerge[key];
16376        if (incoming && existing !== incoming && !((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(existing) && existing.includes(incoming))) {
16377          ret[key] = existing ? [].concat(existing, incoming) : incoming;
16378        }
16379      } else if (key !== "") {
16380        ret[key] = toMerge[key];
16381      }
16382    }
16383  }
16384  return ret;
16385}
16386function invokeVNodeHook(hook, instance, vnode, prevVNode = null) {
16387  callWithAsyncErrorHandling(hook, instance, 7, [
16388    vnode,
16389    prevVNode
16390  ]);
16391}
16392
16393const emptyAppContext = createAppContext();
16394let uid = 0;
16395function createComponentInstance(vnode, parent, suspense) {
16396  const type = vnode.type;
16397  const appContext = (parent ? parent.appContext : vnode.appContext) || emptyAppContext;
16398  const instance = {
16399    uid: uid++,
16400    vnode,
16401    type,
16402    parent,
16403    appContext,
16404    root: null,
16405    // to be immediately set
16406    next: null,
16407    subTree: null,
16408    // will be set synchronously right after creation
16409    effect: null,
16410    update: null,
16411    // will be set synchronously right after creation
16412    scope: new _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.EffectScope(
16413      true
16414      /* detached */
16415    ),
16416    render: null,
16417    proxy: null,
16418    exposed: null,
16419    exposeProxy: null,
16420    withProxy: null,
16421    provides: parent ? parent.provides : Object.create(appContext.provides),
16422    accessCache: null,
16423    renderCache: [],
16424    // local resolved assets
16425    components: null,
16426    directives: null,
16427    // resolved props and emits options
16428    propsOptions: normalizePropsOptions(type, appContext),
16429    emitsOptions: normalizeEmitsOptions(type, appContext),
16430    // emit
16431    emit: null,
16432    // to be set immediately
16433    emitted: null,
16434    // props default value
16435    propsDefaults: _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ,
16436    // inheritAttrs
16437    inheritAttrs: type.inheritAttrs,
16438    // state
16439    ctx: _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ,
16440    data: _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ,
16441    props: _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ,
16442    attrs: _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ,
16443    slots: _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ,
16444    refs: _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ,
16445    setupState: _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ,
16446    setupContext: null,
16447    // suspense related
16448    suspense,
16449    suspenseId: suspense ? suspense.pendingId : 0,
16450    asyncDep: null,
16451    asyncResolved: false,
16452    // lifecycle hooks
16453    // not using enums here because it results in computed properties
16454    isMounted: false,
16455    isUnmounted: false,
16456    isDeactivated: false,
16457    bc: null,
16458    c: null,
16459    bm: null,
16460    m: null,
16461    bu: null,
16462    u: null,
16463    um: null,
16464    bum: null,
16465    da: null,
16466    a: null,
16467    rtg: null,
16468    rtc: null,
16469    ec: null,
16470    sp: null
16471  };
16472  if (true) {
16473    instance.ctx = createDevRenderContext(instance);
16474  } else {}
16475  instance.root = parent ? parent.root : instance;
16476  instance.emit = emit.bind(null, instance);
16477  if (vnode.ce) {
16478    vnode.ce(instance);
16479  }
16480  return instance;
16481}
16482let currentInstance = null;
16483const getCurrentInstance = () => currentInstance || currentRenderingInstance;
16484let internalSetCurrentInstance;
16485let setInSSRSetupState;
16486{
16487  const g = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.getGlobalThis)();
16488  const registerGlobalSetter = (key, setter) => {
16489    let setters;
16490    if (!(setters = g[key])) setters = g[key] = [];
16491    setters.push(setter);
16492    return (v) => {
16493      if (setters.length > 1) setters.forEach((set) => set(v));
16494      else setters[0](v);
16495    };
16496  };
16497  internalSetCurrentInstance = registerGlobalSetter(
16498    `__VUE_INSTANCE_SETTERS__`,
16499    (v) => currentInstance = v
16500  );
16501  setInSSRSetupState = registerGlobalSetter(
16502    `__VUE_SSR_SETTERS__`,
16503    (v) => isInSSRComponentSetup = v
16504  );
16505}
16506const setCurrentInstance = (instance) => {
16507  const prev = currentInstance;
16508  internalSetCurrentInstance(instance);
16509  instance.scope.on();
16510  return () => {
16511    instance.scope.off();
16512    internalSetCurrentInstance(prev);
16513  };
16514};
16515const unsetCurrentInstance = () => {
16516  currentInstance && currentInstance.scope.off();
16517  internalSetCurrentInstance(null);
16518};
16519const isBuiltInTag = /* @__PURE__ */ (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.makeMap)("slot,component");
16520function validateComponentName(name, { isNativeTag }) {
16521  if (isBuiltInTag(name) || isNativeTag(name)) {
16522    warn$1(
16523      "Do not use built-in or reserved HTML elements as component id: " + name
16524    );
16525  }
16526}
16527function isStatefulComponent(instance) {
16528  return instance.vnode.shapeFlag & 4;
16529}
16530let isInSSRComponentSetup = false;
16531function setupComponent(instance, isSSR = false, optimized = false) {
16532  isSSR && setInSSRSetupState(isSSR);
16533  const { props, children } = instance.vnode;
16534  const isStateful = isStatefulComponent(instance);
16535  initProps(instance, props, isStateful, isSSR);
16536  initSlots(instance, children, optimized);
16537  const setupResult = isStateful ? setupStatefulComponent(instance, isSSR) : void 0;
16538  isSSR && setInSSRSetupState(false);
16539  return setupResult;
16540}
16541function setupStatefulComponent(instance, isSSR) {
16542  var _a;
16543  const Component = instance.type;
16544  if (true) {
16545    if (Component.name) {
16546      validateComponentName(Component.name, instance.appContext.config);
16547    }
16548    if (Component.components) {
16549      const names = Object.keys(Component.components);
16550      for (let i = 0; i < names.length; i++) {
16551        validateComponentName(names[i], instance.appContext.config);
16552      }
16553    }
16554    if (Component.directives) {
16555      const names = Object.keys(Component.directives);
16556      for (let i = 0; i < names.length; i++) {
16557        validateDirectiveName(names[i]);
16558      }
16559    }
16560    if (Component.compilerOptions && isRuntimeOnly()) {
16561      warn$1(
16562        `"compilerOptions" is only supported when using a build of Vue that includes the runtime compiler. Since you are using a runtime-only build, the options should be passed via your build tool config instead.`
16563      );
16564    }
16565  }
16566  instance.accessCache = /* @__PURE__ */ Object.create(null);
16567  instance.proxy = new Proxy(instance.ctx, PublicInstanceProxyHandlers);
16568  if (true) {
16569    exposePropsOnRenderContext(instance);
16570  }
16571  const { setup } = Component;
16572  if (setup) {
16573    const setupContext = instance.setupContext = setup.length > 1 ? createSetupContext(instance) : null;
16574    const reset = setCurrentInstance(instance);
16575    (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.pauseTracking)();
16576    const setupResult = callWithErrorHandling(
16577      setup,
16578      instance,
16579      0,
16580      [
16581         true ? (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.shallowReadonly)(instance.props) : 0,
16582        setupContext
16583      ]
16584    );
16585    (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.resetTracking)();
16586    reset();
16587    if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isPromise)(setupResult)) {
16588      setupResult.then(unsetCurrentInstance, unsetCurrentInstance);
16589      if (isSSR) {
16590        return setupResult.then((resolvedResult) => {
16591          handleSetupResult(instance, resolvedResult, isSSR);
16592        }).catch((e) => {
16593          handleError(e, instance, 0);
16594        });
16595      } else {
16596        instance.asyncDep = setupResult;
16597        if ( true && !instance.suspense) {
16598          const name = (_a = Component.name) != null ? _a : "Anonymous";
16599          warn$1(
16600            `Component <${name}>: setup function returned a promise, but no <Suspense> boundary was found in the parent component tree. A component with async setup() must be nested in a <Suspense> in order to be rendered.`
16601          );
16602        }
16603      }
16604    } else {
16605      handleSetupResult(instance, setupResult, isSSR);
16606    }
16607  } else {
16608    finishComponentSetup(instance, isSSR);
16609  }
16610}
16611function handleSetupResult(instance, setupResult, isSSR) {
16612  if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(setupResult)) {
16613    if (instance.type.__ssrInlineRender) {
16614      instance.ssrRender = setupResult;
16615    } else {
16616      instance.render = setupResult;
16617    }
16618  } else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isObject)(setupResult)) {
16619    if ( true && isVNode(setupResult)) {
16620      warn$1(
16621        `setup() should not return VNodes directly - return a render function instead.`
16622      );
16623    }
16624    if (true) {
16625      instance.devtoolsRawSetupState = setupResult;
16626    }
16627    instance.setupState = (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.proxyRefs)(setupResult);
16628    if (true) {
16629      exposeSetupStateOnRenderContext(instance);
16630    }
16631  } else if ( true && setupResult !== void 0) {
16632    warn$1(
16633      `setup() should return an object. Received: ${setupResult === null ? "null" : typeof setupResult}`
16634    );
16635  }
16636  finishComponentSetup(instance, isSSR);
16637}
16638let compile;
16639let installWithProxy;
16640function registerRuntimeCompiler(_compile) {
16641  compile = _compile;
16642  installWithProxy = (i) => {
16643    if (i.render._rc) {
16644      i.withProxy = new Proxy(i.ctx, RuntimeCompiledPublicInstanceProxyHandlers);
16645    }
16646  };
16647}
16648const isRuntimeOnly = () => !compile;
16649function finishComponentSetup(instance, isSSR, skipOptions) {
16650  const Component = instance.type;
16651  if (!instance.render) {
16652    if (!isSSR && compile && !Component.render) {
16653      const template = Component.template || resolveMergedOptions(instance).template;
16654      if (template) {
16655        if (true) {
16656          startMeasure(instance, `compile`);
16657        }
16658        const { isCustomElement, compilerOptions } = instance.appContext.config;
16659        const { delimiters, compilerOptions: componentCompilerOptions } = Component;
16660        const finalCompilerOptions = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)(
16661          (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)(
16662            {
16663              isCustomElement,
16664              delimiters
16665            },
16666            compilerOptions
16667          ),
16668          componentCompilerOptions
16669        );
16670        Component.render = compile(template, finalCompilerOptions);
16671        if (true) {
16672          endMeasure(instance, `compile`);
16673        }
16674      }
16675    }
16676    instance.render = Component.render || _vue_shared__WEBPACK_IMPORTED_MODULE_1__.NOOP;
16677    if (installWithProxy) {
16678      installWithProxy(instance);
16679    }
16680  }
16681  if (true) {
16682    const reset = setCurrentInstance(instance);
16683    (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.pauseTracking)();
16684    try {
16685      applyOptions(instance);
16686    } finally {
16687      (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.resetTracking)();
16688      reset();
16689    }
16690  }
16691  if ( true && !Component.render && instance.render === _vue_shared__WEBPACK_IMPORTED_MODULE_1__.NOOP && !isSSR) {
16692    if (!compile && Component.template) {
16693      warn$1(
16694        `Component provided template option but runtime compilation is not supported in this build of Vue.` + (` Configure your bundler to alias "vue" to "vue/dist/vue.esm-bundler.js".` )
16695      );
16696    } else {
16697      warn$1(`Component is missing template or render function: `, Component);
16698    }
16699  }
16700}
16701const attrsProxyHandlers =  true ? {
16702  get(target, key) {
16703    markAttrsAccessed();
16704    (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.track)(target, "get", "");
16705    return target[key];
16706  },
16707  set() {
16708    warn$1(`setupContext.attrs is readonly.`);
16709    return false;
16710  },
16711  deleteProperty() {
16712    warn$1(`setupContext.attrs is readonly.`);
16713    return false;
16714  }
16715} : 0;
16716function getSlotsProxy(instance) {
16717  return new Proxy(instance.slots, {
16718    get(target, key) {
16719      (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.track)(instance, "get", "$slots");
16720      return target[key];
16721    }
16722  });
16723}
16724function createSetupContext(instance) {
16725  const expose = (exposed) => {
16726    if (true) {
16727      if (instance.exposed) {
16728        warn$1(`expose() should be called only once per setup().`);
16729      }
16730      if (exposed != null) {
16731        let exposedType = typeof exposed;
16732        if (exposedType === "object") {
16733          if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(exposed)) {
16734            exposedType = "array";
16735          } else if ((0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isRef)(exposed)) {
16736            exposedType = "ref";
16737          }
16738        }
16739        if (exposedType !== "object") {
16740          warn$1(
16741            `expose() should be passed a plain object, received ${exposedType}.`
16742          );
16743        }
16744      }
16745    }
16746    instance.exposed = exposed || {};
16747  };
16748  if (true) {
16749    let attrsProxy;
16750    let slotsProxy;
16751    return Object.freeze({
16752      get attrs() {
16753        return attrsProxy || (attrsProxy = new Proxy(instance.attrs, attrsProxyHandlers));
16754      },
16755      get slots() {
16756        return slotsProxy || (slotsProxy = getSlotsProxy(instance));
16757      },
16758      get emit() {
16759        return (event, ...args) => instance.emit(event, ...args);
16760      },
16761      expose
16762    });
16763  } else {}
16764}
16765function getComponentPublicInstance(instance) {
16766  if (instance.exposed) {
16767    return instance.exposeProxy || (instance.exposeProxy = new Proxy((0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.proxyRefs)((0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.markRaw)(instance.exposed)), {
16768      get(target, key) {
16769        if (key in target) {
16770          return target[key];
16771        } else if (key in publicPropertiesMap) {
16772          return publicPropertiesMap[key](instance);
16773        }
16774      },
16775      has(target, key) {
16776        return key in target || key in publicPropertiesMap;
16777      }
16778    }));
16779  } else {
16780    return instance.proxy;
16781  }
16782}
16783const classifyRE = /(?:^|[-_])(\w)/g;
16784const classify = (str) => str.replace(classifyRE, (c) => c.toUpperCase()).replace(/[-_]/g, "");
16785function getComponentName(Component, includeInferred = true) {
16786  return (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(Component) ? Component.displayName || Component.name : Component.name || includeInferred && Component.__name;
16787}
16788function formatComponentName(instance, Component, isRoot = false) {
16789  let name = getComponentName(Component);
16790  if (!name && Component.__file) {
16791    const match = Component.__file.match(/([^/\\]+)\.\w+$/);
16792    if (match) {
16793      name = match[1];
16794    }
16795  }
16796  if (!name && instance && instance.parent) {
16797    const inferFromRegistry = (registry) => {
16798      for (const key in registry) {
16799        if (registry[key] === Component) {
16800          return key;
16801        }
16802      }
16803    };
16804    name = inferFromRegistry(
16805      instance.components || instance.parent.type.components
16806    ) || inferFromRegistry(instance.appContext.components);
16807  }
16808  return name ? classify(name) : isRoot ? `App` : `Anonymous`;
16809}
16810function isClassComponent(value) {
16811  return (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(value) && "__vccOpts" in value;
16812}
16813
16814const computed = (getterOrOptions, debugOptions) => {
16815  const c = (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.computed)(getterOrOptions, debugOptions, isInSSRComponentSetup);
16816  if (true) {
16817    const i = getCurrentInstance();
16818    if (i && i.appContext.config.warnRecursiveComputed) {
16819      c._warnRecursive = true;
16820    }
16821  }
16822  return c;
16823};
16824
16825function h(type, propsOrChildren, children) {
16826  const l = arguments.length;
16827  if (l === 2) {
16828    if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isObject)(propsOrChildren) && !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(propsOrChildren)) {
16829      if (isVNode(propsOrChildren)) {
16830        return createVNode(type, null, [propsOrChildren]);
16831      }
16832      return createVNode(type, propsOrChildren);
16833    } else {
16834      return createVNode(type, null, propsOrChildren);
16835    }
16836  } else {
16837    if (l > 3) {
16838      children = Array.prototype.slice.call(arguments, 2);
16839    } else if (l === 3 && isVNode(children)) {
16840      children = [children];
16841    }
16842    return createVNode(type, propsOrChildren, children);
16843  }
16844}
16845
16846function initCustomFormatter() {
16847  if ( false || typeof window === "undefined") {
16848    return;
16849  }
16850  const vueStyle = { style: "color:#3ba776" };
16851  const numberStyle = { style: "color:#1677ff" };
16852  const stringStyle = { style: "color:#f5222d" };
16853  const keywordStyle = { style: "color:#eb2f96" };
16854  const formatter = {
16855    __vue_custom_formatter: true,
16856    header(obj) {
16857      if (!(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isObject)(obj)) {
16858        return null;
16859      }
16860      if (obj.__isVue) {
16861        return ["div", vueStyle, `VueInstance`];
16862      } else if ((0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isRef)(obj)) {
16863        return [
16864          "div",
16865          {},
16866          ["span", vueStyle, genRefFlag(obj)],
16867          "<",
16868          formatValue(obj.value),
16869          `>`
16870        ];
16871      } else if ((0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isReactive)(obj)) {
16872        return [
16873          "div",
16874          {},
16875          ["span", vueStyle, (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isShallow)(obj) ? "ShallowReactive" : "Reactive"],
16876          "<",
16877          formatValue(obj),
16878          `>${(0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isReadonly)(obj) ? ` (readonly)` : ``}`
16879        ];
16880      } else if ((0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isReadonly)(obj)) {
16881        return [
16882          "div",
16883          {},
16884          ["span", vueStyle, (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isShallow)(obj) ? "ShallowReadonly" : "Readonly"],
16885          "<",
16886          formatValue(obj),
16887          ">"
16888        ];
16889      }
16890      return null;
16891    },
16892    hasBody(obj) {
16893      return obj && obj.__isVue;
16894    },
16895    body(obj) {
16896      if (obj && obj.__isVue) {
16897        return [
16898          "div",
16899          {},
16900          ...formatInstance(obj.$)
16901        ];
16902      }
16903    }
16904  };
16905  function formatInstance(instance) {
16906    const blocks = [];
16907    if (instance.type.props && instance.props) {
16908      blocks.push(createInstanceBlock("props", (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.toRaw)(instance.props)));
16909    }
16910    if (instance.setupState !== _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ) {
16911      blocks.push(createInstanceBlock("setup", instance.setupState));
16912    }
16913    if (instance.data !== _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ) {
16914      blocks.push(createInstanceBlock("data", (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.toRaw)(instance.data)));
16915    }
16916    const computed = extractKeys(instance, "computed");
16917    if (computed) {
16918      blocks.push(createInstanceBlock("computed", computed));
16919    }
16920    const injected = extractKeys(instance, "inject");
16921    if (injected) {
16922      blocks.push(createInstanceBlock("injected", injected));
16923    }
16924    blocks.push([
16925      "div",
16926      {},
16927      [
16928        "span",
16929        {
16930          style: keywordStyle.style + ";opacity:0.66"
16931        },
16932        "$ (internal): "
16933      ],
16934      ["object", { object: instance }]
16935    ]);
16936    return blocks;
16937  }
16938  function createInstanceBlock(type, target) {
16939    target = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)({}, target);
16940    if (!Object.keys(target).length) {
16941      return ["span", {}];
16942    }
16943    return [
16944      "div",
16945      { style: "line-height:1.25em;margin-bottom:0.6em" },
16946      [
16947        "div",
16948        {
16949          style: "color:#476582"
16950        },
16951        type
16952      ],
16953      [
16954        "div",
16955        {
16956          style: "padding-left:1.25em"
16957        },
16958        ...Object.keys(target).map((key) => {
16959          return [
16960            "div",
16961            {},
16962            ["span", keywordStyle, key + ": "],
16963            formatValue(target[key], false)
16964          ];
16965        })
16966      ]
16967    ];
16968  }
16969  function formatValue(v, asRaw = true) {
16970    if (typeof v === "number") {
16971      return ["span", numberStyle, v];
16972    } else if (typeof v === "string") {
16973      return ["span", stringStyle, JSON.stringify(v)];
16974    } else if (typeof v === "boolean") {
16975      return ["span", keywordStyle, v];
16976    } else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isObject)(v)) {
16977      return ["object", { object: asRaw ? (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.toRaw)(v) : v }];
16978    } else {
16979      return ["span", stringStyle, String(v)];
16980    }
16981  }
16982  function extractKeys(instance, type) {
16983    const Comp = instance.type;
16984    if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(Comp)) {
16985      return;
16986    }
16987    const extracted = {};
16988    for (const key in instance.ctx) {
16989      if (isKeyOfType(Comp, key, type)) {
16990        extracted[key] = instance.ctx[key];
16991      }
16992    }
16993    return extracted;
16994  }
16995  function isKeyOfType(Comp, key, type) {
16996    const opts = Comp[type];
16997    if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(opts) && opts.includes(key) || (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isObject)(opts) && key in opts) {
16998      return true;
16999    }
17000    if (Comp.extends && isKeyOfType(Comp.extends, key, type)) {
17001      return true;
17002    }
17003    if (Comp.mixins && Comp.mixins.some((m) => isKeyOfType(m, key, type))) {
17004      return true;
17005    }
17006  }
17007  function genRefFlag(v) {
17008    if ((0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isShallow)(v)) {
17009      return `ShallowRef`;
17010    }
17011    if (v.effect) {
17012      return `ComputedRef`;
17013    }
17014    return `Ref`;
17015  }
17016  if (window.devtoolsFormatters) {
17017    window.devtoolsFormatters.push(formatter);
17018  } else {
17019    window.devtoolsFormatters = [formatter];
17020  }
17021}
17022
17023function withMemo(memo, render, cache, index) {
17024  const cached = cache[index];
17025  if (cached && isMemoSame(cached, memo)) {
17026    return cached;
17027  }
17028  const ret = render();
17029  ret.memo = memo.slice();
17030  ret.cacheIndex = index;
17031  return cache[index] = ret;
17032}
17033function isMemoSame(cached, memo) {
17034  const prev = cached.memo;
17035  if (prev.length != memo.length) {
17036    return false;
17037  }
17038  for (let i = 0; i < prev.length; i++) {
17039    if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasChanged)(prev[i], memo[i])) {
17040      return false;
17041    }
17042  }
17043  if (isBlockTreeEnabled > 0 && currentBlock) {
17044    currentBlock.push(cached);
17045  }
17046  return true;
17047}
17048
17049const version = "3.4.34";
17050const warn =  true ? warn$1 : 0;
17051const ErrorTypeStrings = ErrorTypeStrings$1 ;
17052const devtools =  true ? devtools$1 : 0;
17053const setDevtoolsHook =  true ? setDevtoolsHook$1 : 0;
17054const _ssrUtils = {
17055  createComponentInstance,
17056  setupComponent,
17057  renderComponentRoot,
17058  setCurrentRenderingInstance,
17059  isVNode: isVNode,
17060  normalizeVNode,
17061  getComponentPublicInstance
17062};
17063const ssrUtils = _ssrUtils ;
17064const resolveFilter = null;
17065const compatUtils = null;
17066const DeprecationTypes = null;
17067
17068
17069
17070
17071/***/ }),
17072
vendor: 76,108 bytes, lines 17073-18860
17073/***/ "./node_modules/@vue/runtime-dom/dist/runtime-dom.esm-bundler.js":
17074/*!***********************************************************************!*\
17075  !*** ./node_modules/@vue/runtime-dom/dist/runtime-dom.esm-bundler.js ***!
17076  \***********************************************************************/
17077/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
17078
17079"use strict";
17080__webpack_require__.r(__webpack_exports__);
17081/* harmony export */ __webpack_require__.d(__webpack_exports__, {
17082/* harmony export */   BaseTransition: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.BaseTransition; },
17083/* harmony export */   BaseTransitionPropsValidators: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.BaseTransitionPropsValidators; },
17084/* harmony export */   Comment: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.Comment; },
17085/* harmony export */   DeprecationTypes: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.DeprecationTypes; },
17086/* harmony export */   EffectScope: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.EffectScope; },
17087/* harmony export */   ErrorCodes: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.ErrorCodes; },
17088/* harmony export */   ErrorTypeStrings: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.ErrorTypeStrings; },
17089/* harmony export */   Fragment: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.Fragment; },
17090/* harmony export */   KeepAlive: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.KeepAlive; },
17091/* harmony export */   ReactiveEffect: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.ReactiveEffect; },
17092/* harmony export */   Static: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.Static; },
17093/* harmony export */   Suspense: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.Suspense; },
17094/* harmony export */   Teleport: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.Teleport; },
17095/* harmony export */   Text: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.Text; },
17096/* harmony export */   TrackOpTypes: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.TrackOpTypes; },
17097/* harmony export */   Transition: function() { return /* binding */ Transition; },
17098/* harmony export */   TransitionGroup: function() { return /* binding */ TransitionGroup; },
17099/* harmony export */   TriggerOpTypes: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.TriggerOpTypes; },
17100/* harmony export */   VueElement: function() { return /* binding */ VueElement; },
17101/* harmony export */   assertNumber: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.assertNumber; },
17102/* harmony export */   callWithAsyncErrorHandling: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.callWithAsyncErrorHandling; },
17103/* harmony export */   callWithErrorHandling: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.callWithErrorHandling; },
17104/* harmony export */   camelize: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.camelize; },
17105/* harmony export */   capitalize: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.capitalize; },
17106/* harmony export */   cloneVNode: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.cloneVNode; },
17107/* harmony export */   compatUtils: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.compatUtils; },
17108/* harmony export */   computed: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.computed; },
17109/* harmony export */   createApp: function() { return /* binding */ createApp; },
17110/* harmony export */   createBlock: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.createBlock; },
17111/* harmony export */   createCommentVNode: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode; },
17112/* harmony export */   createElementBlock: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.createElementBlock; },
17113/* harmony export */   createElementVNode: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.createElementVNode; },
17114/* harmony export */   createHydrationRenderer: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.createHydrationRenderer; },
17115/* harmony export */   createPropsRestProxy: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.createPropsRestProxy; },
17116/* harmony export */   createRenderer: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.createRenderer; },
17117/* harmony export */   createSSRApp: function() { return /* binding */ createSSRApp; },
17118/* harmony export */   createSlots: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.createSlots; },
17119/* harmony export */   createStaticVNode: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.createStaticVNode; },
17120/* harmony export */   createTextVNode: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.createTextVNode; },
17121/* harmony export */   createVNode: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.createVNode; },
17122/* harmony export */   customRef: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.customRef; },
17123/* harmony export */   defineAsyncComponent: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.defineAsyncComponent; },
17124/* harmony export */   defineComponent: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.defineComponent; },
17125/* harmony export */   defineCustomElement: function() { return /* binding */ defineCustomElement; },
17126/* harmony export */   defineEmits: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.defineEmits; },
17127/* harmony export */   defineExpose: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.defineExpose; },
17128/* harmony export */   defineModel: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.defineModel; },
17129/* harmony export */   defineOptions: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.defineOptions; },
17130/* harmony export */   defineProps: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.defineProps; },
17131/* harmony export */   defineSSRCustomElement: function() { return /* binding */ defineSSRCustomElement; },
17132/* harmony export */   defineSlots: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.defineSlots; },
17133/* harmony export */   devtools: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.devtools; },
17134/* harmony export */   effect: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.effect; },
17135/* harmony export */   effectScope: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.effectScope; },
17136/* harmony export */   getCurrentInstance: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.getCurrentInstance; },
17137/* harmony export */   getCurrentScope: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.getCurrentScope; },
17138/* harmony export */   getTransitionRawChildren: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.getTransitionRawChildren; },
17139/* harmony export */   guardReactiveProps: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.guardReactiveProps; },
17140/* harmony export */   h: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.h; },
17141/* harmony export */   handleError: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.handleError; },
17142/* harmony export */   hasInjectionContext: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.hasInjectionContext; },
17143/* harmony export */   hydrate: function() { return /* binding */ hydrate; },
17144/* harmony export */   initCustomFormatter: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.initCustomFormatter; },
17145/* harmony export */   initDirectivesForSSR: function() { return /* binding */ initDirectivesForSSR; },
17146/* harmony export */   inject: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.inject; },
17147/* harmony export */   isMemoSame: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.isMemoSame; },
17148/* harmony export */   isProxy: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.isProxy; },
17149/* harmony export */   isReactive: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.isReactive; },
17150/* harmony export */   isReadonly: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.isReadonly; },
17151/* harmony export */   isRef: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.isRef; },
17152/* harmony export */   isRuntimeOnly: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.isRuntimeOnly; },
17153/* harmony export */   isShallow: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.isShallow; },
17154/* harmony export */   isVNode: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.isVNode; },
17155/* harmony export */   markRaw: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.markRaw; },
17156/* harmony export */   mergeDefaults: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.mergeDefaults; },
17157/* harmony export */   mergeModels: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.mergeModels; },
17158/* harmony export */   mergeProps: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.mergeProps; },
17159/* harmony export */   nextTick: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.nextTick; },
17160/* harmony export */   normalizeClass: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.normalizeClass; },
17161/* harmony export */   normalizeProps: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.normalizeProps; },
17162/* harmony export */   normalizeStyle: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.normalizeStyle; },
17163/* harmony export */   onActivated: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.onActivated; },
17164/* harmony export */   onBeforeMount: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.onBeforeMount; },
17165/* harmony export */   onBeforeUnmount: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.onBeforeUnmount; },
17166/* harmony export */   onBeforeUpdate: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.onBeforeUpdate; },
17167/* harmony export */   onDeactivated: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.onDeactivated; },
17168/* harmony export */   onErrorCaptured: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.onErrorCaptured; },
17169/* harmony export */   onMounted: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.onMounted; },
17170/* harmony export */   onRenderTracked: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.onRenderTracked; },
17171/* harmony export */   onRenderTriggered: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.onRenderTriggered; },
17172/* harmony export */   onScopeDispose: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.onScopeDispose; },
17173/* harmony export */   onServerPrefetch: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.onServerPrefetch; },
17174/* harmony export */   onUnmounted: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.onUnmounted; },
17175/* harmony export */   onUpdated: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.onUpdated; },
17176/* harmony export */   openBlock: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.openBlock; },
17177/* harmony export */   popScopeId: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.popScopeId; },
17178/* harmony export */   provide: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.provide; },
17179/* harmony export */   proxyRefs: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.proxyRefs; },
17180/* harmony export */   pushScopeId: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.pushScopeId; },
17181/* harmony export */   queuePostFlushCb: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.queuePostFlushCb; },
17182/* harmony export */   reactive: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.reactive; },
17183/* harmony export */   readonly: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.readonly; },
17184/* harmony export */   ref: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.ref; },
17185/* harmony export */   registerRuntimeCompiler: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.registerRuntimeCompiler; },
17186/* harmony export */   render: function() { return /* binding */ render; },
17187/* harmony export */   renderList: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.renderList; },
17188/* harmony export */   renderSlot: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.renderSlot; },
17189/* harmony export */   resolveComponent: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.resolveComponent; },
17190/* harmony export */   resolveDirective: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.resolveDirective; },
17191/* harmony export */   resolveDynamicComponent: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.resolveDynamicComponent; },
17192/* harmony export */   resolveFilter: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.resolveFilter; },
17193/* harmony export */   resolveTransitionHooks: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.resolveTransitionHooks; },
17194/* harmony export */   setBlockTracking: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.setBlockTracking; },
17195/* harmony export */   setDevtoolsHook: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.setDevtoolsHook; },
17196/* harmony export */   setTransitionHooks: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.setTransitionHooks; },
17197/* harmony export */   shallowReactive: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.shallowReactive; },
17198/* harmony export */   shallowReadonly: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.shallowReadonly; },
17199/* harmony export */   shallowRef: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.shallowRef; },
17200/* harmony export */   ssrContextKey: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.ssrContextKey; },
17201/* harmony export */   ssrUtils: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.ssrUtils; },
17202/* harmony export */   stop: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.stop; },
17203/* harmony export */   toDisplayString: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.toDisplayString; },
17204/* harmony export */   toHandlerKey: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.toHandlerKey; },
17205/* harmony export */   toHandlers: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.toHandlers; },
17206/* harmony export */   toRaw: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.toRaw; },
17207/* harmony export */   toRef: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.toRef; },
17208/* harmony export */   toRefs: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.toRefs; },
17209/* harmony export */   toValue: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.toValue; },
17210/* harmony export */   transformVNodeArgs: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.transformVNodeArgs; },
17211/* harmony export */   triggerRef: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.triggerRef; },
17212/* harmony export */   unref: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.unref; },
17213/* harmony export */   useAttrs: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.useAttrs; },
17214/* harmony export */   useCssModule: function() { return /* binding */ useCssModule; },
17215/* harmony export */   useCssVars: function() { return /* binding */ useCssVars; },
17216/* harmony export */   useModel: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.useModel; },
17217/* harmony export */   useSSRContext: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.useSSRContext; },
17218/* harmony export */   useSlots: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.useSlots; },
17219/* harmony export */   useTransitionState: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.useTransitionState; },
17220/* harmony export */   vModelCheckbox: function() { return /* binding */ vModelCheckbox; },
17221/* harmony export */   vModelDynamic: function() { return /* binding */ vModelDynamic; },
17222/* harmony export */   vModelRadio: function() { return /* binding */ vModelRadio; },
17223/* harmony export */   vModelSelect: function() { return /* binding */ vModelSelect; },
17224/* harmony export */   vModelText: function() { return /* binding */ vModelText; },
17225/* harmony export */   vShow: function() { return /* binding */ vShow; },
17226/* harmony export */   version: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.version; },
17227/* harmony export */   warn: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.warn; },
17228/* harmony export */   watch: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.watch; },
17229/* harmony export */   watchEffect: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.watchEffect; },
17230/* harmony export */   watchPostEffect: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.watchPostEffect; },
17231/* harmony export */   watchSyncEffect: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.watchSyncEffect; },
17232/* harmony export */   withAsyncContext: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.withAsyncContext; },
17233/* harmony export */   withCtx: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.withCtx; },
17234/* harmony export */   withDefaults: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.withDefaults; },
17235/* harmony export */   withDirectives: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.withDirectives; },
17236/* harmony export */   withKeys: function() { return /* binding */ withKeys; },
17237/* harmony export */   withMemo: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.withMemo; },
17238/* harmony export */   withModifiers: function() { return /* binding */ withModifiers; },
17239/* harmony export */   withScopeId: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.withScopeId; }
17240/* harmony export */ });
17241/* harmony import */ var _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @vue/runtime-core */ "./node_modules/@vue/runtime-core/dist/runtime-core.esm-bundler.js");
17242/* harmony import */ var _vue_shared__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @vue/shared */ "./node_modules/@vue/shared/dist/shared.esm-bundler.js");
17243/* harmony import */ var _vue_runtime_core__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @vue/runtime-core */ "./node_modules/@vue/reactivity/dist/reactivity.esm-bundler.js");
17244/**
17245* @vue/runtime-dom v3.4.34
17246* (c) 2018-present Yuxi (Evan) You and Vue contributors
17247* @license MIT
17248**/
17249
17250
17251
17252
17253const svgNS = "http://www.w3.org/2000/svg";
17254const mathmlNS = "http://www.w3.org/1998/Math/MathML";
17255const doc = typeof document !== "undefined" ? document : null;
17256const templateContainer = doc && /* @__PURE__ */ doc.createElement("template");
17257const nodeOps = {
17258  insert: (child, parent, anchor) => {
17259    parent.insertBefore(child, anchor || null);
17260  },
17261  remove: (child) => {
17262    const parent = child.parentNode;
17263    if (parent) {
17264      parent.removeChild(child);
17265    }
17266  },
17267  createElement: (tag, namespace, is, props) => {
17268    const el = namespace === "svg" ? doc.createElementNS(svgNS, tag) : namespace === "mathml" ? doc.createElementNS(mathmlNS, tag) : is ? doc.createElement(tag, { is }) : doc.createElement(tag);
17269    if (tag === "select" && props && props.multiple != null) {
17270      el.setAttribute("multiple", props.multiple);
17271    }
17272    return el;
17273  },
17274  createText: (text) => doc.createTextNode(text),
17275  createComment: (text) => doc.createComment(text),
17276  setText: (node, text) => {
17277    node.nodeValue = text;
17278  },
17279  setElementText: (el, text) => {
17280    el.textContent = text;
17281  },
17282  parentNode: (node) => node.parentNode,
17283  nextSibling: (node) => node.nextSibling,
17284  querySelector: (selector) => doc.querySelector(selector),
17285  setScopeId(el, id) {
17286    el.setAttribute(id, "");
17287  },
17288  // __UNSAFE__
17289  // Reason: innerHTML.
17290  // Static content here can only come from compiled templates.
17291  // As long as the user only uses trusted templates, this is safe.
17292  insertStaticContent(content, parent, anchor, namespace, start, end) {
17293    const before = anchor ? anchor.previousSibling : parent.lastChild;
17294    if (start && (start === end || start.nextSibling)) {
17295      while (true) {
17296        parent.insertBefore(start.cloneNode(true), anchor);
17297        if (start === end || !(start = start.nextSibling)) break;
17298      }
17299    } else {
17300      templateContainer.innerHTML = namespace === "svg" ? `<svg>${content}</svg>` : namespace === "mathml" ? `<math>${content}</math>` : content;
17301      const template = templateContainer.content;
17302      if (namespace === "svg" || namespace === "mathml") {
17303        const wrapper = template.firstChild;
17304        while (wrapper.firstChild) {
17305          template.appendChild(wrapper.firstChild);
17306        }
17307        template.removeChild(wrapper);
17308      }
17309      parent.insertBefore(template, anchor);
17310    }
17311    return [
17312      // first
17313      before ? before.nextSibling : parent.firstChild,
17314      // last
17315      anchor ? anchor.previousSibling : parent.lastChild
17316    ];
17317  }
17318};
17319
17320const TRANSITION = "transition";
17321const ANIMATION = "animation";
17322const vtcKey = Symbol("_vtc");
17323const Transition = (props, { slots }) => (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.h)(_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.BaseTransition, resolveTransitionProps(props), slots);
17324Transition.displayName = "Transition";
17325const DOMTransitionPropsValidators = {
17326  name: String,
17327  type: String,
17328  css: {
17329    type: Boolean,
17330    default: true
17331  },
17332  duration: [String, Number, Object],
17333  enterFromClass: String,
17334  enterActiveClass: String,
17335  enterToClass: String,
17336  appearFromClass: String,
17337  appearActiveClass: String,
17338  appearToClass: String,
17339  leaveFromClass: String,
17340  leaveActiveClass: String,
17341  leaveToClass: String
17342};
17343const TransitionPropsValidators = Transition.props = /* @__PURE__ */ (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)(
17344  {},
17345  _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.BaseTransitionPropsValidators,
17346  DOMTransitionPropsValidators
17347);
17348const callHook = (hook, args = []) => {
17349  if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(hook)) {
17350    hook.forEach((h2) => h2(...args));
17351  } else if (hook) {
17352    hook(...args);
17353  }
17354};
17355const hasExplicitCallback = (hook) => {
17356  return hook ? (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(hook) ? hook.some((h2) => h2.length > 1) : hook.length > 1 : false;
17357};
17358function resolveTransitionProps(rawProps) {
17359  const baseProps = {};
17360  for (const key in rawProps) {
17361    if (!(key in DOMTransitionPropsValidators)) {
17362      baseProps[key] = rawProps[key];
17363    }
17364  }
17365  if (rawProps.css === false) {
17366    return baseProps;
17367  }
17368  const {
17369    name = "v",
17370    type,
17371    duration,
17372    enterFromClass = `${name}-enter-from`,
17373    enterActiveClass = `${name}-enter-active`,
17374    enterToClass = `${name}-enter-to`,
17375    appearFromClass = enterFromClass,
17376    appearActiveClass = enterActiveClass,
17377    appearToClass = enterToClass,
17378    leaveFromClass = `${name}-leave-from`,
17379    leaveActiveClass = `${name}-leave-active`,
17380    leaveToClass = `${name}-leave-to`
17381  } = rawProps;
17382  const durations = normalizeDuration(duration);
17383  const enterDuration = durations && durations[0];
17384  const leaveDuration = durations && durations[1];
17385  const {
17386    onBeforeEnter,
17387    onEnter,
17388    onEnterCancelled,
17389    onLeave,
17390    onLeaveCancelled,
17391    onBeforeAppear = onBeforeEnter,
17392    onAppear = onEnter,
17393    onAppearCancelled = onEnterCancelled
17394  } = baseProps;
17395  const finishEnter = (el, isAppear, done) => {
17396    removeTransitionClass(el, isAppear ? appearToClass : enterToClass);
17397    removeTransitionClass(el, isAppear ? appearActiveClass : enterActiveClass);
17398    done && done();
17399  };
17400  const finishLeave = (el, done) => {
17401    el._isLeaving = false;
17402    removeTransitionClass(el, leaveFromClass);
17403    removeTransitionClass(el, leaveToClass);
17404    removeTransitionClass(el, leaveActiveClass);
17405    done && done();
17406  };
17407  const makeEnterHook = (isAppear) => {
17408    return (el, done) => {
17409      const hook = isAppear ? onAppear : onEnter;
17410      const resolve = () => finishEnter(el, isAppear, done);
17411      callHook(hook, [el, resolve]);
17412      nextFrame(() => {
17413        removeTransitionClass(el, isAppear ? appearFromClass : enterFromClass);
17414        addTransitionClass(el, isAppear ? appearToClass : enterToClass);
17415        if (!hasExplicitCallback(hook)) {
17416          whenTransitionEnds(el, type, enterDuration, resolve);
17417        }
17418      });
17419    };
17420  };
17421  return (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)(baseProps, {
17422    onBeforeEnter(el) {
17423      callHook(onBeforeEnter, [el]);
17424      addTransitionClass(el, enterFromClass);
17425      addTransitionClass(el, enterActiveClass);
17426    },
17427    onBeforeAppear(el) {
17428      callHook(onBeforeAppear, [el]);
17429      addTransitionClass(el, appearFromClass);
17430      addTransitionClass(el, appearActiveClass);
17431    },
17432    onEnter: makeEnterHook(false),
17433    onAppear: makeEnterHook(true),
17434    onLeave(el, done) {
17435      el._isLeaving = true;
17436      const resolve = () => finishLeave(el, done);
17437      addTransitionClass(el, leaveFromClass);
17438      addTransitionClass(el, leaveActiveClass);
17439      forceReflow();
17440      nextFrame(() => {
17441        if (!el._isLeaving) {
17442          return;
17443        }
17444        removeTransitionClass(el, leaveFromClass);
17445        addTransitionClass(el, leaveToClass);
17446        if (!hasExplicitCallback(onLeave)) {
17447          whenTransitionEnds(el, type, leaveDuration, resolve);
17448        }
17449      });
17450      callHook(onLeave, [el, resolve]);
17451    },
17452    onEnterCancelled(el) {
17453      finishEnter(el, false);
17454      callHook(onEnterCancelled, [el]);
17455    },
17456    onAppearCancelled(el) {
17457      finishEnter(el, true);
17458      callHook(onAppearCancelled, [el]);
17459    },
17460    onLeaveCancelled(el) {
17461      finishLeave(el);
17462      callHook(onLeaveCancelled, [el]);
17463    }
17464  });
17465}
17466function normalizeDuration(duration) {
17467  if (duration == null) {
17468    return null;
17469  } else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isObject)(duration)) {
17470    return [NumberOf(duration.enter), NumberOf(duration.leave)];
17471  } else {
17472    const n = NumberOf(duration);
17473    return [n, n];
17474  }
17475}
17476function NumberOf(val) {
17477  const res = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.toNumber)(val);
17478  if (true) {
17479    (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.assertNumber)(res, "<transition> explicit duration");
17480  }
17481  return res;
17482}
17483function addTransitionClass(el, cls) {
17484  cls.split(/\s+/).forEach((c) => c && el.classList.add(c));
17485  (el[vtcKey] || (el[vtcKey] = /* @__PURE__ */ new Set())).add(cls);
17486}
17487function removeTransitionClass(el, cls) {
17488  cls.split(/\s+/).forEach((c) => c && el.classList.remove(c));
17489  const _vtc = el[vtcKey];
17490  if (_vtc) {
17491    _vtc.delete(cls);
17492    if (!_vtc.size) {
17493      el[vtcKey] = void 0;
17494    }
17495  }
17496}
17497function nextFrame(cb) {
17498  requestAnimationFrame(() => {
17499    requestAnimationFrame(cb);
17500  });
17501}
17502let endId = 0;
17503function whenTransitionEnds(el, expectedType, explicitTimeout, resolve) {
17504  const id = el._endId = ++endId;
17505  const resolveIfNotStale = () => {
17506    if (id === el._endId) {
17507      resolve();
17508    }
17509  };
17510  if (explicitTimeout) {
17511    return setTimeout(resolveIfNotStale, explicitTimeout);
17512  }
17513  const { type, timeout, propCount } = getTransitionInfo(el, expectedType);
17514  if (!type) {
17515    return resolve();
17516  }
17517  const endEvent = type + "end";
17518  let ended = 0;
17519  const end = () => {
17520    el.removeEventListener(endEvent, onEnd);
17521    resolveIfNotStale();
17522  };
17523  const onEnd = (e) => {
17524    if (e.target === el && ++ended >= propCount) {
17525      end();
17526    }
17527  };
17528  setTimeout(() => {
17529    if (ended < propCount) {
17530      end();
17531    }
17532  }, timeout + 1);
17533  el.addEventListener(endEvent, onEnd);
17534}
17535function getTransitionInfo(el, expectedType) {
17536  const styles = window.getComputedStyle(el);
17537  const getStyleProperties = (key) => (styles[key] || "").split(", ");
17538  const transitionDelays = getStyleProperties(`${TRANSITION}Delay`);
17539  const transitionDurations = getStyleProperties(`${TRANSITION}Duration`);
17540  const transitionTimeout = getTimeout(transitionDelays, transitionDurations);
17541  const animationDelays = getStyleProperties(`${ANIMATION}Delay`);
17542  const animationDurations = getStyleProperties(`${ANIMATION}Duration`);
17543  const animationTimeout = getTimeout(animationDelays, animationDurations);
17544  let type = null;
17545  let timeout = 0;
17546  let propCount = 0;
17547  if (expectedType === TRANSITION) {
17548    if (transitionTimeout > 0) {
17549      type = TRANSITION;
17550      timeout = transitionTimeout;
17551      propCount = transitionDurations.length;
17552    }
17553  } else if (expectedType === ANIMATION) {
17554    if (animationTimeout > 0) {
17555      type = ANIMATION;
17556      timeout = animationTimeout;
17557      propCount = animationDurations.length;
17558    }
17559  } else {
17560    timeout = Math.max(transitionTimeout, animationTimeout);
17561    type = timeout > 0 ? transitionTimeout > animationTimeout ? TRANSITION : ANIMATION : null;
17562    propCount = type ? type === TRANSITION ? transitionDurations.length : animationDurations.length : 0;
17563  }
17564  const hasTransform = type === TRANSITION && /\b(transform|all)(,|$)/.test(
17565    getStyleProperties(`${TRANSITION}Property`).toString()
17566  );
17567  return {
17568    type,
17569    timeout,
17570    propCount,
17571    hasTransform
17572  };
17573}
17574function getTimeout(delays, durations) {
17575  while (delays.length < durations.length) {
17576    delays = delays.concat(delays);
17577  }
17578  return Math.max(...durations.map((d, i) => toMs(d) + toMs(delays[i])));
17579}
17580function toMs(s) {
17581  if (s === "auto") return 0;
17582  return Number(s.slice(0, -1).replace(",", ".")) * 1e3;
17583}
17584function forceReflow() {
17585  return document.body.offsetHeight;
17586}
17587
17588function patchClass(el, value, isSVG) {
17589  const transitionClasses = el[vtcKey];
17590  if (transitionClasses) {
17591    value = (value ? [value, ...transitionClasses] : [...transitionClasses]).join(" ");
17592  }
17593  if (value == null) {
17594    el.removeAttribute("class");
17595  } else if (isSVG) {
17596    el.setAttribute("class", value);
17597  } else {
17598    el.className = value;
17599  }
17600}
17601
17602const vShowOriginalDisplay = Symbol("_vod");
17603const vShowHidden = Symbol("_vsh");
17604const vShow = {
17605  beforeMount(el, { value }, { transition }) {
17606    el[vShowOriginalDisplay] = el.style.display === "none" ? "" : el.style.display;
17607    if (transition && value) {
17608      transition.beforeEnter(el);
17609    } else {
17610      setDisplay(el, value);
17611    }
17612  },
17613  mounted(el, { value }, { transition }) {
17614    if (transition && value) {
17615      transition.enter(el);
17616    }
17617  },
17618  updated(el, { value, oldValue }, { transition }) {
17619    if (!value === !oldValue) return;
17620    if (transition) {
17621      if (value) {
17622        transition.beforeEnter(el);
17623        setDisplay(el, true);
17624        transition.enter(el);
17625      } else {
17626        transition.leave(el, () => {
17627          setDisplay(el, false);
17628        });
17629      }
17630    } else {
17631      setDisplay(el, value);
17632    }
17633  },
17634  beforeUnmount(el, { value }) {
17635    setDisplay(el, value);
17636  }
17637};
17638if (true) {
17639  vShow.name = "show";
17640}
17641function setDisplay(el, value) {
17642  el.style.display = value ? el[vShowOriginalDisplay] : "none";
17643  el[vShowHidden] = !value;
17644}
17645function initVShowForSSR() {
17646  vShow.getSSRProps = ({ value }) => {
17647    if (!value) {
17648      return { style: { display: "none" } };
17649    }
17650  };
17651}
17652
17653const CSS_VAR_TEXT = Symbol( true ? "CSS_VAR_TEXT" : 0);
17654function useCssVars(getter) {
17655  const instance = (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.getCurrentInstance)();
17656  if (!instance) {
17657     true && (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.warn)(`useCssVars is called without current active component instance.`);
17658    return;
17659  }
17660  const updateTeleports = instance.ut = (vars = getter(instance.proxy)) => {
17661    Array.from(
17662      document.querySelectorAll(`[data-v-owner="${instance.uid}"]`)
17663    ).forEach((node) => setVarsOnNode(node, vars));
17664  };
17665  if (true) {
17666    instance.getCssVars = () => getter(instance.proxy);
17667  }
17668  const setVars = () => {
17669    const vars = getter(instance.proxy);
17670    setVarsOnVNode(instance.subTree, vars);
17671    updateTeleports(vars);
17672  };
17673  (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.onMounted)(() => {
17674    (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.watchPostEffect)(setVars);
17675    const ob = new MutationObserver(setVars);
17676    ob.observe(instance.subTree.el.parentNode, { childList: true });
17677    (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.onUnmounted)(() => ob.disconnect());
17678  });
17679}
17680function setVarsOnVNode(vnode, vars) {
17681  if (vnode.shapeFlag & 128) {
17682    const suspense = vnode.suspense;
17683    vnode = suspense.activeBranch;
17684    if (suspense.pendingBranch && !suspense.isHydrating) {
17685      suspense.effects.push(() => {
17686        setVarsOnVNode(suspense.activeBranch, vars);
17687      });
17688    }
17689  }
17690  while (vnode.component) {
17691    vnode = vnode.component.subTree;
17692  }
17693  if (vnode.shapeFlag & 1 && vnode.el) {
17694    setVarsOnNode(vnode.el, vars);
17695  } else if (vnode.type === _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.Fragment) {
17696    vnode.children.forEach((c) => setVarsOnVNode(c, vars));
17697  } else if (vnode.type === _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.Static) {
17698    let { el, anchor } = vnode;
17699    while (el) {
17700      setVarsOnNode(el, vars);
17701      if (el === anchor) break;
17702      el = el.nextSibling;
17703    }
17704  }
17705}
17706function setVarsOnNode(el, vars) {
17707  if (el.nodeType === 1) {
17708    const style = el.style;
17709    let cssText = "";
17710    for (const key in vars) {
17711      style.setProperty(`--${key}`, vars[key]);
17712      cssText += `--${key}: ${vars[key]};`;
17713    }
17714    style[CSS_VAR_TEXT] = cssText;
17715  }
17716}
17717
17718const displayRE = /(^|;)\s*display\s*:/;
17719function patchStyle(el, prev, next) {
17720  const style = el.style;
17721  const isCssString = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isString)(next);
17722  let hasControlledDisplay = false;
17723  if (next && !isCssString) {
17724    if (prev) {
17725      if (!(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isString)(prev)) {
17726        for (const key in prev) {
17727          if (next[key] == null) {
17728            setStyle(style, key, "");
17729          }
17730        }
17731      } else {
17732        for (const prevStyle of prev.split(";")) {
17733          const key = prevStyle.slice(0, prevStyle.indexOf(":")).trim();
17734          if (next[key] == null) {
17735            setStyle(style, key, "");
17736          }
17737        }
17738      }
17739    }
17740    for (const key in next) {
17741      if (key === "display") {
17742        hasControlledDisplay = true;
17743      }
17744      setStyle(style, key, next[key]);
17745    }
17746  } else {
17747    if (isCssString) {
17748      if (prev !== next) {
17749        const cssVarText = style[CSS_VAR_TEXT];
17750        if (cssVarText) {
17751          next += ";" + cssVarText;
17752        }
17753        style.cssText = next;
17754        hasControlledDisplay = displayRE.test(next);
17755      }
17756    } else if (prev) {
17757      el.removeAttribute("style");
17758    }
17759  }
17760  if (vShowOriginalDisplay in el) {
17761    el[vShowOriginalDisplay] = hasControlledDisplay ? style.display : "";
17762    if (el[vShowHidden]) {
17763      style.display = "none";
17764    }
17765  }
17766}
17767const semicolonRE = /[^\\];\s*$/;
17768const importantRE = /\s*!important$/;
17769function setStyle(style, name, val) {
17770  if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(val)) {
17771    val.forEach((v) => setStyle(style, name, v));
17772  } else {
17773    if (val == null) val = "";
17774    if (true) {
17775      if (semicolonRE.test(val)) {
17776        (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.warn)(
17777          `Unexpected semicolon at the end of '${name}' style value: '${val}'`
17778        );
17779      }
17780    }
17781    if (name.startsWith("--")) {
17782      style.setProperty(name, val);
17783    } else {
17784      const prefixed = autoPrefix(style, name);
17785      if (importantRE.test(val)) {
17786        style.setProperty(
17787          (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hyphenate)(prefixed),
17788          val.replace(importantRE, ""),
17789          "important"
17790        );
17791      } else {
17792        style[prefixed] = val;
17793      }
17794    }
17795  }
17796}
17797const prefixes = ["Webkit", "Moz", "ms"];
17798const prefixCache = {};
17799function autoPrefix(style, rawName) {
17800  const cached = prefixCache[rawName];
17801  if (cached) {
17802    return cached;
17803  }
17804  let name = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.camelize)(rawName);
17805  if (name !== "filter" && name in style) {
17806    return prefixCache[rawName] = name;
17807  }
17808  name = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.capitalize)(name);
17809  for (let i = 0; i < prefixes.length; i++) {
17810    const prefixed = prefixes[i] + name;
17811    if (prefixed in style) {
17812      return prefixCache[rawName] = prefixed;
17813    }
17814  }
17815  return rawName;
17816}
17817
17818const xlinkNS = "http://www.w3.org/1999/xlink";
17819function patchAttr(el, key, value, isSVG, instance, isBoolean = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isSpecialBooleanAttr)(key)) {
17820  if (isSVG && key.startsWith("xlink:")) {
17821    if (value == null) {
17822      el.removeAttributeNS(xlinkNS, key.slice(6, key.length));
17823    } else {
17824      el.setAttributeNS(xlinkNS, key, value);
17825    }
17826  } else {
17827    if (value == null || isBoolean && !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.includeBooleanAttr)(value)) {
17828      el.removeAttribute(key);
17829    } else {
17830      el.setAttribute(
17831        key,
17832        isBoolean ? "" : (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isSymbol)(value) ? String(value) : value
17833      );
17834    }
17835  }
17836}
17837
17838function patchDOMProp(el, key, value, parentComponent) {
17839  if (key === "innerHTML" || key === "textContent") {
17840    if (value == null) return;
17841    el[key] = value;
17842    return;
17843  }
17844  const tag = el.tagName;
17845  if (key === "value" && tag !== "PROGRESS" && // custom elements may use _value internally
17846  !tag.includes("-")) {
17847    const oldValue = tag === "OPTION" ? el.getAttribute("value") || "" : el.value;
17848    const newValue = value == null ? "" : String(value);
17849    if (oldValue !== newValue || !("_value" in el)) {
17850      el.value = newValue;
17851    }
17852    if (value == null) {
17853      el.removeAttribute(key);
17854    }
17855    el._value = value;
17856    return;
17857  }
17858  let needRemove = false;
17859  if (value === "" || value == null) {
17860    const type = typeof el[key];
17861    if (type === "boolean") {
17862      value = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.includeBooleanAttr)(value);
17863    } else if (value == null && type === "string") {
17864      value = "";
17865      needRemove = true;
17866    } else if (type === "number") {
17867      value = 0;
17868      needRemove = true;
17869    }
17870  }
17871  try {
17872    el[key] = value;
17873  } catch (e) {
17874    if ( true && !needRemove) {
17875      (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.warn)(
17876        `Failed setting prop "${key}" on <${tag.toLowerCase()}>: value ${value} is invalid.`,
17877        e
17878      );
17879    }
17880  }
17881  needRemove && el.removeAttribute(key);
17882}
17883
17884function addEventListener(el, event, handler, options) {
17885  el.addEventListener(event, handler, options);
17886}
17887function removeEventListener(el, event, handler, options) {
17888  el.removeEventListener(event, handler, options);
17889}
17890const veiKey = Symbol("_vei");
17891function patchEvent(el, rawName, prevValue, nextValue, instance = null) {
17892  const invokers = el[veiKey] || (el[veiKey] = {});
17893  const existingInvoker = invokers[rawName];
17894  if (nextValue && existingInvoker) {
17895    existingInvoker.value =  true ? sanitizeEventValue(nextValue, rawName) : 0;
17896  } else {
17897    const [name, options] = parseName(rawName);
17898    if (nextValue) {
17899      const invoker = invokers[rawName] = createInvoker(
17900         true ? sanitizeEventValue(nextValue, rawName) : 0,
17901        instance
17902      );
17903      addEventListener(el, name, invoker, options);
17904    } else if (existingInvoker) {
17905      removeEventListener(el, name, existingInvoker, options);
17906      invokers[rawName] = void 0;
17907    }
17908  }
17909}
17910const optionsModifierRE = /(?:Once|Passive|Capture)$/;
17911function parseName(name) {
17912  let options;
17913  if (optionsModifierRE.test(name)) {
17914    options = {};
17915    let m;
17916    while (m = name.match(optionsModifierRE)) {
17917      name = name.slice(0, name.length - m[0].length);
17918      options[m[0].toLowerCase()] = true;
17919    }
17920  }
17921  const event = name[2] === ":" ? name.slice(3) : (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hyphenate)(name.slice(2));
17922  return [event, options];
17923}
17924let cachedNow = 0;
17925const p = /* @__PURE__ */ Promise.resolve();
17926const getNow = () => cachedNow || (p.then(() => cachedNow = 0), cachedNow = Date.now());
17927function createInvoker(initialValue, instance) {
17928  const invoker = (e) => {
17929    if (!e._vts) {
17930      e._vts = Date.now();
17931    } else if (e._vts <= invoker.attached) {
17932      return;
17933    }
17934    (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.callWithAsyncErrorHandling)(
17935      patchStopImmediatePropagation(e, invoker.value),
17936      instance,
17937      5,
17938      [e]
17939    );
17940  };
17941  invoker.value = initialValue;
17942  invoker.attached = getNow();
17943  return invoker;
17944}
17945function sanitizeEventValue(value, propName) {
17946  if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(value) || (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(value)) {
17947    return value;
17948  }
17949  (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.warn)(
17950    `Wrong type passed as event handler to ${propName} - did you forget @ or : in front of your prop?
17951Expected function or array of functions, received type ${typeof value}.`
17952  );
17953  return _vue_shared__WEBPACK_IMPORTED_MODULE_1__.NOOP;
17954}
17955function patchStopImmediatePropagation(e, value) {
17956  if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(value)) {
17957    const originalStop = e.stopImmediatePropagation;
17958    e.stopImmediatePropagation = () => {
17959      originalStop.call(e);
17960      e._stopped = true;
17961    };
17962    return value.map(
17963      (fn) => (e2) => !e2._stopped && fn && fn(e2)
17964    );
17965  } else {
17966    return value;
17967  }
17968}
17969
17970const isNativeOn = (key) => key.charCodeAt(0) === 111 && key.charCodeAt(1) === 110 && // lowercase letter
17971key.charCodeAt(2) > 96 && key.charCodeAt(2) < 123;
17972const patchProp = (el, key, prevValue, nextValue, namespace, parentComponent) => {
17973  const isSVG = namespace === "svg";
17974  if (key === "class") {
17975    patchClass(el, nextValue, isSVG);
17976  } else if (key === "style") {
17977    patchStyle(el, prevValue, nextValue);
17978  } else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isOn)(key)) {
17979    if (!(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isModelListener)(key)) {
17980      patchEvent(el, key, prevValue, nextValue, parentComponent);
17981    }
17982  } else if (key[0] === "." ? (key = key.slice(1), true) : key[0] === "^" ? (key = key.slice(1), false) : shouldSetAsProp(el, key, nextValue, isSVG)) {
17983    patchDOMProp(el, key, nextValue);
17984    if (!el.tagName.includes("-") && (key === "value" || key === "checked" || key === "selected")) {
17985      patchAttr(el, key, nextValue, isSVG, parentComponent, key !== "value");
17986    }
17987  } else {
17988    if (key === "true-value") {
17989      el._trueValue = nextValue;
17990    } else if (key === "false-value") {
17991      el._falseValue = nextValue;
17992    }
17993    patchAttr(el, key, nextValue, isSVG);
17994  }
17995};
17996function shouldSetAsProp(el, key, value, isSVG) {
17997  if (isSVG) {
17998    if (key === "innerHTML" || key === "textContent") {
17999      return true;
18000    }
18001    if (key in el && isNativeOn(key) && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(value)) {
18002      return true;
18003    }
18004    return false;
18005  }
18006  if (key === "spellcheck" || key === "draggable" || key === "translate") {
18007    return false;
18008  }
18009  if (key === "form") {
18010    return false;
18011  }
18012  if (key === "list" && el.tagName === "INPUT") {
18013    return false;
18014  }
18015  if (key === "type" && el.tagName === "TEXTAREA") {
18016    return false;
18017  }
18018  if (key === "width" || key === "height") {
18019    const tag = el.tagName;
18020    if (tag === "IMG" || tag === "VIDEO" || tag === "CANVAS" || tag === "SOURCE") {
18021      return false;
18022    }
18023  }
18024  if (isNativeOn(key) && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isString)(value)) {
18025    return false;
18026  }
18027  return key in el;
18028}
18029
18030/*! #__NO_SIDE_EFFECTS__ */
18031// @__NO_SIDE_EFFECTS__
18032function defineCustomElement(options, extraOptions, hydrate2) {
18033  const Comp = (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.defineComponent)(options, extraOptions);
18034  class VueCustomElement extends VueElement {
18035    constructor(initialProps) {
18036      super(Comp, initialProps, hydrate2);
18037    }
18038  }
18039  VueCustomElement.def = Comp;
18040  return VueCustomElement;
18041}
18042/*! #__NO_SIDE_EFFECTS__ */
18043const defineSSRCustomElement = /* @__NO_SIDE_EFFECTS__ */ (options, extraOptions) => {
18044  return /* @__PURE__ */ defineCustomElement(options, extraOptions, hydrate);
18045};
18046const BaseClass = typeof HTMLElement !== "undefined" ? HTMLElement : class {
18047};
18048class VueElement extends BaseClass {
18049  constructor(_def, _props = {}, hydrate2) {
18050    super();
18051    this._def = _def;
18052    this._props = _props;
18053    /**
18054     * @internal
18055     */
18056    this._instance = null;
18057    this._connected = false;
18058    this._resolved = false;
18059    this._numberProps = null;
18060    this._ob = null;
18061    if (this.shadowRoot && hydrate2) {
18062      hydrate2(this._createVNode(), this.shadowRoot);
18063    } else {
18064      if ( true && this.shadowRoot) {
18065        (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.warn)(
18066          `Custom element has pre-rendered declarative shadow root but is not defined as hydratable. Use \`defineSSRCustomElement\`.`
18067        );
18068      }
18069      this.attachShadow({ mode: "open" });
18070      if (!this._def.__asyncLoader) {
18071        this._resolveProps(this._def);
18072      }
18073    }
18074  }
18075  connectedCallback() {
18076    this._connected = true;
18077    if (!this._instance) {
18078      if (this._resolved) {
18079        this._update();
18080      } else {
18081        this._resolveDef();
18082      }
18083    }
18084  }
18085  disconnectedCallback() {
18086    this._connected = false;
18087    (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.nextTick)(() => {
18088      if (!this._connected) {
18089        if (this._ob) {
18090          this._ob.disconnect();
18091          this._ob = null;
18092        }
18093        render(null, this.shadowRoot);
18094        this._instance = null;
18095      }
18096    });
18097  }
18098  /**
18099   * resolve inner component definition (handle possible async component)
18100   */
18101  _resolveDef() {
18102    this._resolved = true;
18103    for (let i = 0; i < this.attributes.length; i++) {
18104      this._setAttr(this.attributes[i].name);
18105    }
18106    this._ob = new MutationObserver((mutations) => {
18107      for (const m of mutations) {
18108        this._setAttr(m.attributeName);
18109      }
18110    });
18111    this._ob.observe(this, { attributes: true });
18112    const resolve = (def, isAsync = false) => {
18113      const { props, styles } = def;
18114      let numberProps;
18115      if (props && !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(props)) {
18116        for (const key in props) {
18117          const opt = props[key];
18118          if (opt === Number || opt && opt.type === Number) {
18119            if (key in this._props) {
18120              this._props[key] = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.toNumber)(this._props[key]);
18121            }
18122            (numberProps || (numberProps = /* @__PURE__ */ Object.create(null)))[(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.camelize)(key)] = true;
18123          }
18124        }
18125      }
18126      this._numberProps = numberProps;
18127      if (isAsync) {
18128        this._resolveProps(def);
18129      }
18130      this._applyStyles(styles);
18131      this._update();
18132    };
18133    const asyncDef = this._def.__asyncLoader;
18134    if (asyncDef) {
18135      asyncDef().then((def) => resolve(def, true));
18136    } else {
18137      resolve(this._def);
18138    }
18139  }
18140  _resolveProps(def) {
18141    const { props } = def;
18142    const declaredPropKeys = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(props) ? props : Object.keys(props || {});
18143    for (const key of Object.keys(this)) {
18144      if (key[0] !== "_" && declaredPropKeys.includes(key)) {
18145        this._setProp(key, this[key], true, false);
18146      }
18147    }
18148    for (const key of declaredPropKeys.map(_vue_shared__WEBPACK_IMPORTED_MODULE_1__.camelize)) {
18149      Object.defineProperty(this, key, {
18150        get() {
18151          return this._getProp(key);
18152        },
18153        set(val) {
18154          this._setProp(key, val);
18155        }
18156      });
18157    }
18158  }
18159  _setAttr(key) {
18160    let value = this.hasAttribute(key) ? this.getAttribute(key) : void 0;
18161    const camelKey = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.camelize)(key);
18162    if (this._numberProps && this._numberProps[camelKey]) {
18163      value = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.toNumber)(value);
18164    }
18165    this._setProp(camelKey, value, false);
18166  }
18167  /**
18168   * @internal
18169   */
18170  _getProp(key) {
18171    return this._props[key];
18172  }
18173  /**
18174   * @internal
18175   */
18176  _setProp(key, val, shouldReflect = true, shouldUpdate = true) {
18177    if (val !== this._props[key]) {
18178      this._props[key] = val;
18179      if (shouldUpdate && this._instance) {
18180        this._update();
18181      }
18182      if (shouldReflect) {
18183        if (val === true) {
18184          this.setAttribute((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hyphenate)(key), "");
18185        } else if (typeof val === "string" || typeof val === "number") {
18186          this.setAttribute((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hyphenate)(key), val + "");
18187        } else if (!val) {
18188          this.removeAttribute((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hyphenate)(key));
18189        }
18190      }
18191    }
18192  }
18193  _update() {
18194    render(this._createVNode(), this.shadowRoot);
18195  }
18196  _createVNode() {
18197    const vnode = (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.createVNode)(this._def, (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)({}, this._props));
18198    if (!this._instance) {
18199      vnode.ce = (instance) => {
18200        this._instance = instance;
18201        instance.isCE = true;
18202        if (true) {
18203          instance.ceReload = (newStyles) => {
18204            if (this._styles) {
18205              this._styles.forEach((s) => this.shadowRoot.removeChild(s));
18206              this._styles.length = 0;
18207            }
18208            this._applyStyles(newStyles);
18209            this._instance = null;
18210            this._update();
18211          };
18212        }
18213        const dispatch = (event, args) => {
18214          this.dispatchEvent(
18215            new CustomEvent(event, {
18216              detail: args
18217            })
18218          );
18219        };
18220        instance.emit = (event, ...args) => {
18221          dispatch(event, args);
18222          if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hyphenate)(event) !== event) {
18223            dispatch((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hyphenate)(event), args);
18224          }
18225        };
18226        let parent = this;
18227        while (parent = parent && (parent.parentNode || parent.host)) {
18228          if (parent instanceof VueElement) {
18229            instance.parent = parent._instance;
18230            instance.provides = parent._instance.provides;
18231            break;
18232          }
18233        }
18234      };
18235    }
18236    return vnode;
18237  }
18238  _applyStyles(styles) {
18239    if (styles) {
18240      styles.forEach((css) => {
18241        const s = document.createElement("style");
18242        s.textContent = css;
18243        this.shadowRoot.appendChild(s);
18244        if (true) {
18245          (this._styles || (this._styles = [])).push(s);
18246        }
18247      });
18248    }
18249  }
18250}
18251
18252function useCssModule(name = "$style") {
18253  {
18254    const instance = (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.getCurrentInstance)();
18255    if (!instance) {
18256       true && (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.warn)(`useCssModule must be called inside setup()`);
18257      return _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ;
18258    }
18259    const modules = instance.type.__cssModules;
18260    if (!modules) {
18261       true && (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.warn)(`Current instance does not have CSS modules injected.`);
18262      return _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ;
18263    }
18264    const mod = modules[name];
18265    if (!mod) {
18266       true && (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.warn)(`Current instance does not have CSS module named "${name}".`);
18267      return _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ;
18268    }
18269    return mod;
18270  }
18271}
18272
18273const positionMap = /* @__PURE__ */ new WeakMap();
18274const newPositionMap = /* @__PURE__ */ new WeakMap();
18275const moveCbKey = Symbol("_moveCb");
18276const enterCbKey = Symbol("_enterCb");
18277const TransitionGroupImpl = {
18278  name: "TransitionGroup",
18279  props: /* @__PURE__ */ (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)({}, TransitionPropsValidators, {
18280    tag: String,
18281    moveClass: String
18282  }),
18283  setup(props, { slots }) {
18284    const instance = (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.getCurrentInstance)();
18285    const state = (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.useTransitionState)();
18286    let prevChildren;
18287    let children;
18288    (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.onUpdated)(() => {
18289      if (!prevChildren.length) {
18290        return;
18291      }
18292      const moveClass = props.moveClass || `${props.name || "v"}-move`;
18293      if (!hasCSSTransform(
18294        prevChildren[0].el,
18295        instance.vnode.el,
18296        moveClass
18297      )) {
18298        return;
18299      }
18300      prevChildren.forEach(callPendingCbs);
18301      prevChildren.forEach(recordPosition);
18302      const movedChildren = prevChildren.filter(applyTranslation);
18303      forceReflow();
18304      movedChildren.forEach((c) => {
18305        const el = c.el;
18306        const style = el.style;
18307        addTransitionClass(el, moveClass);
18308        style.transform = style.webkitTransform = style.transitionDuration = "";
18309        const cb = el[moveCbKey] = (e) => {
18310          if (e && e.target !== el) {
18311            return;
18312          }
18313          if (!e || /transform$/.test(e.propertyName)) {
18314            el.removeEventListener("transitionend", cb);
18315            el[moveCbKey] = null;
18316            removeTransitionClass(el, moveClass);
18317          }
18318        };
18319        el.addEventListener("transitionend", cb);
18320      });
18321    });
18322    return () => {
18323      const rawProps = (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_2__.toRaw)(props);
18324      const cssTransitionProps = resolveTransitionProps(rawProps);
18325      let tag = rawProps.tag || _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.Fragment;
18326      prevChildren = [];
18327      if (children) {
18328        for (let i = 0; i < children.length; i++) {
18329          const child = children[i];
18330          if (child.el && child.el instanceof Element) {
18331            prevChildren.push(child);
18332            (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.setTransitionHooks)(
18333              child,
18334              (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.resolveTransitionHooks)(
18335                child,
18336                cssTransitionProps,
18337                state,
18338                instance
18339              )
18340            );
18341            positionMap.set(
18342              child,
18343              child.el.getBoundingClientRect()
18344            );
18345          }
18346        }
18347      }
18348      children = slots.default ? (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.getTransitionRawChildren)(slots.default()) : [];
18349      for (let i = 0; i < children.length; i++) {
18350        const child = children[i];
18351        if (child.key != null) {
18352          (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.setTransitionHooks)(
18353            child,
18354            (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.resolveTransitionHooks)(child, cssTransitionProps, state, instance)
18355          );
18356        } else if (true) {
18357          (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.warn)(`<TransitionGroup> children must be keyed.`);
18358        }
18359      }
18360      return (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.createVNode)(tag, null, children);
18361    };
18362  }
18363};
18364const removeMode = (props) => delete props.mode;
18365/* @__PURE__ */ removeMode(TransitionGroupImpl.props);
18366const TransitionGroup = TransitionGroupImpl;
18367function callPendingCbs(c) {
18368  const el = c.el;
18369  if (el[moveCbKey]) {
18370    el[moveCbKey]();
18371  }
18372  if (el[enterCbKey]) {
18373    el[enterCbKey]();
18374  }
18375}
18376function recordPosition(c) {
18377  newPositionMap.set(c, c.el.getBoundingClientRect());
18378}
18379function applyTranslation(c) {
18380  const oldPos = positionMap.get(c);
18381  const newPos = newPositionMap.get(c);
18382  const dx = oldPos.left - newPos.left;
18383  const dy = oldPos.top - newPos.top;
18384  if (dx || dy) {
18385    const s = c.el.style;
18386    s.transform = s.webkitTransform = `translate(${dx}px,${dy}px)`;
18387    s.transitionDuration = "0s";
18388    return c;
18389  }
18390}
18391function hasCSSTransform(el, root, moveClass) {
18392  const clone = el.cloneNode();
18393  const _vtc = el[vtcKey];
18394  if (_vtc) {
18395    _vtc.forEach((cls) => {
18396      cls.split(/\s+/).forEach((c) => c && clone.classList.remove(c));
18397    });
18398  }
18399  moveClass.split(/\s+/).forEach((c) => c && clone.classList.add(c));
18400  clone.style.display = "none";
18401  const container = root.nodeType === 1 ? root : root.parentNode;
18402  container.appendChild(clone);
18403  const { hasTransform } = getTransitionInfo(clone);
18404  container.removeChild(clone);
18405  return hasTransform;
18406}
18407
18408const getModelAssigner = (vnode) => {
18409  const fn = vnode.props["onUpdate:modelValue"] || false;
18410  return (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(fn) ? (value) => (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.invokeArrayFns)(fn, value) : fn;
18411};
18412function onCompositionStart(e) {
18413  e.target.composing = true;
18414}
18415function onCompositionEnd(e) {
18416  const target = e.target;
18417  if (target.composing) {
18418    target.composing = false;
18419    target.dispatchEvent(new Event("input"));
18420  }
18421}
18422const assignKey = Symbol("_assign");
18423const vModelText = {
18424  created(el, { modifiers: { lazy, trim, number } }, vnode) {
18425    el[assignKey] = getModelAssigner(vnode);
18426    const castToNumber = number || vnode.props && vnode.props.type === "number";
18427    addEventListener(el, lazy ? "change" : "input", (e) => {
18428      if (e.target.composing) return;
18429      let domValue = el.value;
18430      if (trim) {
18431        domValue = domValue.trim();
18432      }
18433      if (castToNumber) {
18434        domValue = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.looseToNumber)(domValue);
18435      }
18436      el[assignKey](domValue);
18437    });
18438    if (trim) {
18439      addEventListener(el, "change", () => {
18440        el.value = el.value.trim();
18441      });
18442    }
18443    if (!lazy) {
18444      addEventListener(el, "compositionstart", onCompositionStart);
18445      addEventListener(el, "compositionend", onCompositionEnd);
18446      addEventListener(el, "change", onCompositionEnd);
18447    }
18448  },
18449  // set value on mounted so it's after min/max for type="range"
18450  mounted(el, { value }) {
18451    el.value = value == null ? "" : value;
18452  },
18453  beforeUpdate(el, { value, oldValue, modifiers: { lazy, trim, number } }, vnode) {
18454    el[assignKey] = getModelAssigner(vnode);
18455    if (el.composing) return;
18456    const elValue = (number || el.type === "number") && !/^0\d/.test(el.value) ? (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.looseToNumber)(el.value) : el.value;
18457    const newValue = value == null ? "" : value;
18458    if (elValue === newValue) {
18459      return;
18460    }
18461    if (document.activeElement === el && el.type !== "range") {
18462      if (lazy && value === oldValue) {
18463        return;
18464      }
18465      if (trim && el.value.trim() === newValue) {
18466        return;
18467      }
18468    }
18469    el.value = newValue;
18470  }
18471};
18472const vModelCheckbox = {
18473  // #4096 array checkboxes need to be deep traversed
18474  deep: true,
18475  created(el, _, vnode) {
18476    el[assignKey] = getModelAssigner(vnode);
18477    addEventListener(el, "change", () => {
18478      const modelValue = el._modelValue;
18479      const elementValue = getValue(el);
18480      const checked = el.checked;
18481      const assign = el[assignKey];
18482      if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(modelValue)) {
18483        const index = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.looseIndexOf)(modelValue, elementValue);
18484        const found = index !== -1;
18485        if (checked && !found) {
18486          assign(modelValue.concat(elementValue));
18487        } else if (!checked && found) {
18488          const filtered = [...modelValue];
18489          filtered.splice(index, 1);
18490          assign(filtered);
18491        }
18492      } else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isSet)(modelValue)) {
18493        const cloned = new Set(modelValue);
18494        if (checked) {
18495          cloned.add(elementValue);
18496        } else {
18497          cloned.delete(elementValue);
18498        }
18499        assign(cloned);
18500      } else {
18501        assign(getCheckboxValue(el, checked));
18502      }
18503    });
18504  },
18505  // set initial checked on mount to wait for true-value/false-value
18506  mounted: setChecked,
18507  beforeUpdate(el, binding, vnode) {
18508    el[assignKey] = getModelAssigner(vnode);
18509    setChecked(el, binding, vnode);
18510  }
18511};
18512function setChecked(el, { value, oldValue }, vnode) {
18513  el._modelValue = value;
18514  if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(value)) {
18515    el.checked = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.looseIndexOf)(value, vnode.props.value) > -1;
18516  } else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isSet)(value)) {
18517    el.checked = value.has(vnode.props.value);
18518  } else if (value !== oldValue) {
18519    el.checked = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.looseEqual)(value, getCheckboxValue(el, true));
18520  }
18521}
18522const vModelRadio = {
18523  created(el, { value }, vnode) {
18524    el.checked = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.looseEqual)(value, vnode.props.value);
18525    el[assignKey] = getModelAssigner(vnode);
18526    addEventListener(el, "change", () => {
18527      el[assignKey](getValue(el));
18528    });
18529  },
18530  beforeUpdate(el, { value, oldValue }, vnode) {
18531    el[assignKey] = getModelAssigner(vnode);
18532    if (value !== oldValue) {
18533      el.checked = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.looseEqual)(value, vnode.props.value);
18534    }
18535  }
18536};
18537const vModelSelect = {
18538  // <select multiple> value need to be deep traversed
18539  deep: true,
18540  created(el, { value, modifiers: { number } }, vnode) {
18541    const isSetModel = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isSet)(value);
18542    addEventListener(el, "change", () => {
18543      const selectedVal = Array.prototype.filter.call(el.options, (o) => o.selected).map(
18544        (o) => number ? (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.looseToNumber)(getValue(o)) : getValue(o)
18545      );
18546      el[assignKey](
18547        el.multiple ? isSetModel ? new Set(selectedVal) : selectedVal : selectedVal[0]
18548      );
18549      el._assigning = true;
18550      (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.nextTick)(() => {
18551        el._assigning = false;
18552      });
18553    });
18554    el[assignKey] = getModelAssigner(vnode);
18555  },
18556  // set value in mounted & updated because <select> relies on its children
18557  // <option>s.
18558  mounted(el, { value, modifiers: { number } }) {
18559    setSelected(el, value);
18560  },
18561  beforeUpdate(el, _binding, vnode) {
18562    el[assignKey] = getModelAssigner(vnode);
18563  },
18564  updated(el, { value, modifiers: { number } }) {
18565    if (!el._assigning) {
18566      setSelected(el, value);
18567    }
18568  }
18569};
18570function setSelected(el, value, number) {
18571  const isMultiple = el.multiple;
18572  const isArrayValue = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(value);
18573  if (isMultiple && !isArrayValue && !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isSet)(value)) {
18574     true && (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.warn)(
18575      `<select multiple v-model> expects an Array or Set value for its binding, but got ${Object.prototype.toString.call(value).slice(8, -1)}.`
18576    );
18577    return;
18578  }
18579  for (let i = 0, l = el.options.length; i < l; i++) {
18580    const option = el.options[i];
18581    const optionValue = getValue(option);
18582    if (isMultiple) {
18583      if (isArrayValue) {
18584        const optionType = typeof optionValue;
18585        if (optionType === "string" || optionType === "number") {
18586          option.selected = value.some((v) => String(v) === String(optionValue));
18587        } else {
18588          option.selected = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.looseIndexOf)(value, optionValue) > -1;
18589        }
18590      } else {
18591        option.selected = value.has(optionValue);
18592      }
18593    } else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.looseEqual)(getValue(option), value)) {
18594      if (el.selectedIndex !== i) el.selectedIndex = i;
18595      return;
18596    }
18597  }
18598  if (!isMultiple && el.selectedIndex !== -1) {
18599    el.selectedIndex = -1;
18600  }
18601}
18602function getValue(el) {
18603  return "_value" in el ? el._value : el.value;
18604}
18605function getCheckboxValue(el, checked) {
18606  const key = checked ? "_trueValue" : "_falseValue";
18607  return key in el ? el[key] : checked;
18608}
18609const vModelDynamic = {
18610  created(el, binding, vnode) {
18611    callModelHook(el, binding, vnode, null, "created");
18612  },
18613  mounted(el, binding, vnode) {
18614    callModelHook(el, binding, vnode, null, "mounted");
18615  },
18616  beforeUpdate(el, binding, vnode, prevVNode) {
18617    callModelHook(el, binding, vnode, prevVNode, "beforeUpdate");
18618  },
18619  updated(el, binding, vnode, prevVNode) {
18620    callModelHook(el, binding, vnode, prevVNode, "updated");
18621  }
18622};
18623function resolveDynamicModel(tagName, type) {
18624  switch (tagName) {
18625    case "SELECT":
18626      return vModelSelect;
18627    case "TEXTAREA":
18628      return vModelText;
18629    default:
18630      switch (type) {
18631        case "checkbox":
18632          return vModelCheckbox;
18633        case "radio":
18634          return vModelRadio;
18635        default:
18636          return vModelText;
18637      }
18638  }
18639}
18640function callModelHook(el, binding, vnode, prevVNode, hook) {
18641  const modelToUse = resolveDynamicModel(
18642    el.tagName,
18643    vnode.props && vnode.props.type
18644  );
18645  const fn = modelToUse[hook];
18646  fn && fn(el, binding, vnode, prevVNode);
18647}
18648function initVModelForSSR() {
18649  vModelText.getSSRProps = ({ value }) => ({ value });
18650  vModelRadio.getSSRProps = ({ value }, vnode) => {
18651    if (vnode.props && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.looseEqual)(vnode.props.value, value)) {
18652      return { checked: true };
18653    }
18654  };
18655  vModelCheckbox.getSSRProps = ({ value }, vnode) => {
18656    if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(value)) {
18657      if (vnode.props && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.looseIndexOf)(value, vnode.props.value) > -1) {
18658        return { checked: true };
18659      }
18660    } else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isSet)(value)) {
18661      if (vnode.props && value.has(vnode.props.value)) {
18662        return { checked: true };
18663      }
18664    } else if (value) {
18665      return { checked: true };
18666    }
18667  };
18668  vModelDynamic.getSSRProps = (binding, vnode) => {
18669    if (typeof vnode.type !== "string") {
18670      return;
18671    }
18672    const modelToUse = resolveDynamicModel(
18673      // resolveDynamicModel expects an uppercase tag name, but vnode.type is lowercase
18674      vnode.type.toUpperCase(),
18675      vnode.props && vnode.props.type
18676    );
18677    if (modelToUse.getSSRProps) {
18678      return modelToUse.getSSRProps(binding, vnode);
18679    }
18680  };
18681}
18682
18683const systemModifiers = ["ctrl", "shift", "alt", "meta"];
18684const modifierGuards = {
18685  stop: (e) => e.stopPropagation(),
18686  prevent: (e) => e.preventDefault(),
18687  self: (e) => e.target !== e.currentTarget,
18688  ctrl: (e) => !e.ctrlKey,
18689  shift: (e) => !e.shiftKey,
18690  alt: (e) => !e.altKey,
18691  meta: (e) => !e.metaKey,
18692  left: (e) => "button" in e && e.button !== 0,
18693  middle: (e) => "button" in e && e.button !== 1,
18694  right: (e) => "button" in e && e.button !== 2,
18695  exact: (e, modifiers) => systemModifiers.some((m) => e[`${m}Key`] && !modifiers.includes(m))
18696};
18697const withModifiers = (fn, modifiers) => {
18698  const cache = fn._withMods || (fn._withMods = {});
18699  const cacheKey = modifiers.join(".");
18700  return cache[cacheKey] || (cache[cacheKey] = (event, ...args) => {
18701    for (let i = 0; i < modifiers.length; i++) {
18702      const guard = modifierGuards[modifiers[i]];
18703      if (guard && guard(event, modifiers)) return;
18704    }
18705    return fn(event, ...args);
18706  });
18707};
18708const keyNames = {
18709  esc: "escape",
18710  space: " ",
18711  up: "arrow-up",
18712  left: "arrow-left",
18713  right: "arrow-right",
18714  down: "arrow-down",
18715  delete: "backspace"
18716};
18717const withKeys = (fn, modifiers) => {
18718  const cache = fn._withKeys || (fn._withKeys = {});
18719  const cacheKey = modifiers.join(".");
18720  return cache[cacheKey] || (cache[cacheKey] = (event) => {
18721    if (!("key" in event)) {
18722      return;
18723    }
18724    const eventKey = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hyphenate)(event.key);
18725    if (modifiers.some((k) => k === eventKey || keyNames[k] === eventKey)) {
18726      return fn(event);
18727    }
18728  });
18729};
18730
18731const rendererOptions = /* @__PURE__ */ (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)({ patchProp }, nodeOps);
18732let renderer;
18733let enabledHydration = false;
18734function ensureRenderer() {
18735  return renderer || (renderer = (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.createRenderer)(rendererOptions));
18736}
18737function ensureHydrationRenderer() {
18738  renderer = enabledHydration ? renderer : (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.createHydrationRenderer)(rendererOptions);
18739  enabledHydration = true;
18740  return renderer;
18741}
18742const render = (...args) => {
18743  ensureRenderer().render(...args);
18744};
18745const hydrate = (...args) => {
18746  ensureHydrationRenderer().hydrate(...args);
18747};
18748const createApp = (...args) => {
18749  const app = ensureRenderer().createApp(...args);
18750  if (true) {
18751    injectNativeTagCheck(app);
18752    injectCompilerOptionsCheck(app);
18753  }
18754  const { mount } = app;
18755  app.mount = (containerOrSelector) => {
18756    const container = normalizeContainer(containerOrSelector);
18757    if (!container) return;
18758    const component = app._component;
18759    if (!(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(component) && !component.render && !component.template) {
18760      component.template = container.innerHTML;
18761    }
18762    container.innerHTML = "";
18763    const proxy = mount(container, false, resolveRootNamespace(container));
18764    if (container instanceof Element) {
18765      container.removeAttribute("v-cloak");
18766      container.setAttribute("data-v-app", "");
18767    }
18768    return proxy;
18769  };
18770  return app;
18771};
18772const createSSRApp = (...args) => {
18773  const app = ensureHydrationRenderer().createApp(...args);
18774  if (true) {
18775    injectNativeTagCheck(app);
18776    injectCompilerOptionsCheck(app);
18777  }
18778  const { mount } = app;
18779  app.mount = (containerOrSelector) => {
18780    const container = normalizeContainer(containerOrSelector);
18781    if (container) {
18782      return mount(container, true, resolveRootNamespace(container));
18783    }
18784  };
18785  return app;
18786};
18787function resolveRootNamespace(container) {
18788  if (container instanceof SVGElement) {
18789    return "svg";
18790  }
18791  if (typeof MathMLElement === "function" && container instanceof MathMLElement) {
18792    return "mathml";
18793  }
18794}
18795function injectNativeTagCheck(app) {
18796  Object.defineProperty(app.config, "isNativeTag", {
18797    value: (tag) => (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isHTMLTag)(tag) || (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isSVGTag)(tag) || (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isMathMLTag)(tag),
18798    writable: false
18799  });
18800}
18801function injectCompilerOptionsCheck(app) {
18802  if ((0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.isRuntimeOnly)()) {
18803    const isCustomElement = app.config.isCustomElement;
18804    Object.defineProperty(app.config, "isCustomElement", {
18805      get() {
18806        return isCustomElement;
18807      },
18808      set() {
18809        (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.warn)(
18810          `The \`isCustomElement\` config option is deprecated. Use \`compilerOptions.isCustomElement\` instead.`
18811        );
18812      }
18813    });
18814    const compilerOptions = app.config.compilerOptions;
18815    const msg = `The \`compilerOptions\` config option is only respected when using a build of Vue.js that includes the runtime compiler (aka "full build"). Since you are using the runtime-only build, \`compilerOptions\` must be passed to \`@vue/compiler-dom\` in the build setup instead.
18816- For vue-loader: pass it via vue-loader's \`compilerOptions\` loader option.
18817- For vue-cli: see https://cli.vuejs.org/guide/webpack.html#modifying-options-of-a-loader
18818- For vite: pass it via @vitejs/plugin-vue options. See https://github.com/vitejs/vite-plugin-vue/tree/main/packages/plugin-vue#example-for-passing-options-to-vuecompiler-sfc`;
18819    Object.defineProperty(app.config, "compilerOptions", {
18820      get() {
18821        (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.warn)(msg);
18822        return compilerOptions;
18823      },
18824      set() {
18825        (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.warn)(msg);
18826      }
18827    });
18828  }
18829}
18830function normalizeContainer(container) {
18831  if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isString)(container)) {
18832    const res = document.querySelector(container);
18833    if ( true && !res) {
18834      (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.warn)(
18835        `Failed to mount app: mount target selector "${container}" returned null.`
18836      );
18837    }
18838    return res;
18839  }
18840  if ( true && window.ShadowRoot && container instanceof window.ShadowRoot && container.mode === "closed") {
18841    (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.warn)(
18842      `mounting on a ShadowRoot with \`{mode: "closed"}\` may lead to unpredictable bugs`
18843    );
18844  }
18845  return container;
18846}
18847let ssrDirectiveInitialized = false;
18848const initDirectivesForSSR = () => {
18849  if (!ssrDirectiveInitialized) {
18850    ssrDirectiveInitialized = true;
18851    initVModelForSSR();
18852    initVShowForSSR();
18853  }
18854} ;
18855
18856
18857
18858
18859/***/ }),
18860
vendor: 26,619 bytes, lines 18861-19441
18861/***/ "./node_modules/@vue/shared/dist/shared.esm-bundler.js":
18862/*!*************************************************************!*\
18863  !*** ./node_modules/@vue/shared/dist/shared.esm-bundler.js ***!
18864  \*************************************************************/
18865/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
18866
18867"use strict";
18868__webpack_require__.r(__webpack_exports__);
18869/* harmony export */ __webpack_require__.d(__webpack_exports__, {
18870/* harmony export */   EMPTY_ARR: function() { return /* binding */ EMPTY_ARR; },
18871/* harmony export */   EMPTY_OBJ: function() { return /* binding */ EMPTY_OBJ; },
18872/* harmony export */   NO: function() { return /* binding */ NO; },
18873/* harmony export */   NOOP: function() { return /* binding */ NOOP; },
18874/* harmony export */   PatchFlagNames: function() { return /* binding */ PatchFlagNames; },
18875/* harmony export */   PatchFlags: function() { return /* binding */ PatchFlags; },
18876/* harmony export */   ShapeFlags: function() { return /* binding */ ShapeFlags; },
18877/* harmony export */   SlotFlags: function() { return /* binding */ SlotFlags; },
18878/* harmony export */   camelize: function() { return /* binding */ camelize; },
18879/* harmony export */   capitalize: function() { return /* binding */ capitalize; },
18880/* harmony export */   def: function() { return /* binding */ def; },
18881/* harmony export */   escapeHtml: function() { return /* binding */ escapeHtml; },
18882/* harmony export */   escapeHtmlComment: function() { return /* binding */ escapeHtmlComment; },
18883/* harmony export */   extend: function() { return /* binding */ extend; },
18884/* harmony export */   genPropsAccessExp: function() { return /* binding */ genPropsAccessExp; },
18885/* harmony export */   generateCodeFrame: function() { return /* binding */ generateCodeFrame; },
18886/* harmony export */   getGlobalThis: function() { return /* binding */ getGlobalThis; },
18887/* harmony export */   hasChanged: function() { return /* binding */ hasChanged; },
18888/* harmony export */   hasOwn: function() { return /* binding */ hasOwn; },
18889/* harmony export */   hyphenate: function() { return /* binding */ hyphenate; },
18890/* harmony export */   includeBooleanAttr: function() { return /* binding */ includeBooleanAttr; },
18891/* harmony export */   invokeArrayFns: function() { return /* binding */ invokeArrayFns; },
18892/* harmony export */   isArray: function() { return /* binding */ isArray; },
18893/* harmony export */   isBooleanAttr: function() { return /* binding */ isBooleanAttr; },
18894/* harmony export */   isBuiltInDirective: function() { return /* binding */ isBuiltInDirective; },
18895/* harmony export */   isDate: function() { return /* binding */ isDate; },
18896/* harmony export */   isFunction: function() { return /* binding */ isFunction; },
18897/* harmony export */   isGloballyAllowed: function() { return /* binding */ isGloballyAllowed; },
18898/* harmony export */   isGloballyWhitelisted: function() { return /* binding */ isGloballyWhitelisted; },
18899/* harmony export */   isHTMLTag: function() { return /* binding */ isHTMLTag; },
18900/* harmony export */   isIntegerKey: function() { return /* binding */ isIntegerKey; },
18901/* harmony export */   isKnownHtmlAttr: function() { return /* binding */ isKnownHtmlAttr; },
18902/* harmony export */   isKnownSvgAttr: function() { return /* binding */ isKnownSvgAttr; },
18903/* harmony export */   isMap: function() { return /* binding */ isMap; },
18904/* harmony export */   isMathMLTag: function() { return /* binding */ isMathMLTag; },
18905/* harmony export */   isModelListener: function() { return /* binding */ isModelListener; },
18906/* harmony export */   isObject: function() { return /* binding */ isObject; },
18907/* harmony export */   isOn: function() { return /* binding */ isOn; },
18908/* harmony export */   isPlainObject: function() { return /* binding */ isPlainObject; },
18909/* harmony export */   isPromise: function() { return /* binding */ isPromise; },
18910/* harmony export */   isRegExp: function() { return /* binding */ isRegExp; },
18911/* harmony export */   isRenderableAttrValue: function() { return /* binding */ isRenderableAttrValue; },
18912/* harmony export */   isReservedProp: function() { return /* binding */ isReservedProp; },
18913/* harmony export */   isSSRSafeAttrName: function() { return /* binding */ isSSRSafeAttrName; },
18914/* harmony export */   isSVGTag: function() { return /* binding */ isSVGTag; },
18915/* harmony export */   isSet: function() { return /* binding */ isSet; },
18916/* harmony export */   isSpecialBooleanAttr: function() { return /* binding */ isSpecialBooleanAttr; },
18917/* harmony export */   isString: function() { return /* binding */ isString; },
18918/* harmony export */   isSymbol: function() { return /* binding */ isSymbol; },
18919/* harmony export */   isVoidTag: function() { return /* binding */ isVoidTag; },
18920/* harmony export */   looseEqual: function() { return /* binding */ looseEqual; },
18921/* harmony export */   looseIndexOf: function() { return /* binding */ looseIndexOf; },
18922/* harmony export */   looseToNumber: function() { return /* binding */ looseToNumber; },
18923/* harmony export */   makeMap: function() { return /* binding */ makeMap; },
18924/* harmony export */   normalizeClass: function() { return /* binding */ normalizeClass; },
18925/* harmony export */   normalizeProps: function() { return /* binding */ normalizeProps; },
18926/* harmony export */   normalizeStyle: function() { return /* binding */ normalizeStyle; },
18927/* harmony export */   objectToString: function() { return /* binding */ objectToString; },
18928/* harmony export */   parseStringStyle: function() { return /* binding */ parseStringStyle; },
18929/* harmony export */   propsToAttrMap: function() { return /* binding */ propsToAttrMap; },
18930/* harmony export */   remove: function() { return /* binding */ remove; },
18931/* harmony export */   slotFlagsText: function() { return /* binding */ slotFlagsText; },
18932/* harmony export */   stringifyStyle: function() { return /* binding */ stringifyStyle; },
18933/* harmony export */   toDisplayString: function() { return /* binding */ toDisplayString; },
18934/* harmony export */   toHandlerKey: function() { return /* binding */ toHandlerKey; },
18935/* harmony export */   toNumber: function() { return /* binding */ toNumber; },
18936/* harmony export */   toRawType: function() { return /* binding */ toRawType; },
18937/* harmony export */   toTypeString: function() { return /* binding */ toTypeString; }
18938/* harmony export */ });
18939/**
18940* @vue/shared v3.4.34
18941* (c) 2018-present Yuxi (Evan) You and Vue contributors
18942* @license MIT
18943**/
18944/*! #__NO_SIDE_EFFECTS__ */
18945// @__NO_SIDE_EFFECTS__
18946function makeMap(str, expectsLowerCase) {
18947  const set = new Set(str.split(","));
18948  return expectsLowerCase ? (val) => set.has(val.toLowerCase()) : (val) => set.has(val);
18949}
18950
18951const EMPTY_OBJ =  true ? Object.freeze({}) : 0;
18952const EMPTY_ARR =  true ? Object.freeze([]) : 0;
18953const NOOP = () => {
18954};
18955const NO = () => false;
18956const isOn = (key) => key.charCodeAt(0) === 111 && key.charCodeAt(1) === 110 && // uppercase letter
18957(key.charCodeAt(2) > 122 || key.charCodeAt(2) < 97);
18958const isModelListener = (key) => key.startsWith("onUpdate:");
18959const extend = Object.assign;
18960const remove = (arr, el) => {
18961  const i = arr.indexOf(el);
18962  if (i > -1) {
18963    arr.splice(i, 1);
18964  }
18965};
18966const hasOwnProperty = Object.prototype.hasOwnProperty;
18967const hasOwn = (val, key) => hasOwnProperty.call(val, key);
18968const isArray = Array.isArray;
18969const isMap = (val) => toTypeString(val) === "[object Map]";
18970const isSet = (val) => toTypeString(val) === "[object Set]";
18971const isDate = (val) => toTypeString(val) === "[object Date]";
18972const isRegExp = (val) => toTypeString(val) === "[object RegExp]";
18973const isFunction = (val) => typeof val === "function";
18974const isString = (val) => typeof val === "string";
18975const isSymbol = (val) => typeof val === "symbol";
18976const isObject = (val) => val !== null && typeof val === "object";
18977const isPromise = (val) => {
18978  return (isObject(val) || isFunction(val)) && isFunction(val.then) && isFunction(val.catch);
18979};
18980const objectToString = Object.prototype.toString;
18981const toTypeString = (value) => objectToString.call(value);
18982const toRawType = (value) => {
18983  return toTypeString(value).slice(8, -1);
18984};
18985const isPlainObject = (val) => toTypeString(val) === "[object Object]";
18986const isIntegerKey = (key) => isString(key) && key !== "NaN" && key[0] !== "-" && "" + parseInt(key, 10) === key;
18987const isReservedProp = /* @__PURE__ */ makeMap(
18988  // the leading comma is intentional so empty string "" is also included
18989  ",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"
18990);
18991const isBuiltInDirective = /* @__PURE__ */ makeMap(
18992  "bind,cloak,else-if,else,for,html,if,model,on,once,pre,show,slot,text,memo"
18993);
18994const cacheStringFunction = (fn) => {
18995  const cache = /* @__PURE__ */ Object.create(null);
18996  return (str) => {
18997    const hit = cache[str];
18998    return hit || (cache[str] = fn(str));
18999  };
19000};
19001const camelizeRE = /-(\w)/g;
19002const camelize = cacheStringFunction((str) => {
19003  return str.replace(camelizeRE, (_, c) => c ? c.toUpperCase() : "");
19004});
19005const hyphenateRE = /\B([A-Z])/g;
19006const hyphenate = cacheStringFunction(
19007  (str) => str.replace(hyphenateRE, "-$1").toLowerCase()
19008);
19009const capitalize = cacheStringFunction((str) => {
19010  return str.charAt(0).toUpperCase() + str.slice(1);
19011});
19012const toHandlerKey = cacheStringFunction((str) => {
19013  const s = str ? `on${capitalize(str)}` : ``;
19014  return s;
19015});
19016const hasChanged = (value, oldValue) => !Object.is(value, oldValue);
19017const invokeArrayFns = (fns, ...arg) => {
19018  for (let i = 0; i < fns.length; i++) {
19019    fns[i](...arg);
19020  }
19021};
19022const def = (obj, key, value, writable = false) => {
19023  Object.defineProperty(obj, key, {
19024    configurable: true,
19025    enumerable: false,
19026    writable,
19027    value
19028  });
19029};
19030const looseToNumber = (val) => {
19031  const n = parseFloat(val);
19032  return isNaN(n) ? val : n;
19033};
19034const toNumber = (val) => {
19035  const n = isString(val) ? Number(val) : NaN;
19036  return isNaN(n) ? val : n;
19037};
19038let _globalThis;
19039const getGlobalThis = () => {
19040  return _globalThis || (_globalThis = typeof globalThis !== "undefined" ? globalThis : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : typeof __webpack_require__.g !== "undefined" ? __webpack_require__.g : {});
19041};
19042const identRE = /^[_$a-zA-Z\xA0-\uFFFF][_$a-zA-Z0-9\xA0-\uFFFF]*$/;
19043function genPropsAccessExp(name) {
19044  return identRE.test(name) ? `__props.${name}` : `__props[${JSON.stringify(name)}]`;
19045}
19046
19047const PatchFlags = {
19048  "TEXT": 1,
19049  "1": "TEXT",
19050  "CLASS": 2,
19051  "2": "CLASS",
19052  "STYLE": 4,
19053  "4": "STYLE",
19054  "PROPS": 8,
19055  "8": "PROPS",
19056  "FULL_PROPS": 16,
19057  "16": "FULL_PROPS",
19058  "NEED_HYDRATION": 32,
19059  "32": "NEED_HYDRATION",
19060  "STABLE_FRAGMENT": 64,
19061  "64": "STABLE_FRAGMENT",
19062  "KEYED_FRAGMENT": 128,
19063  "128": "KEYED_FRAGMENT",
19064  "UNKEYED_FRAGMENT": 256,
19065  "256": "UNKEYED_FRAGMENT",
19066  "NEED_PATCH": 512,
19067  "512": "NEED_PATCH",
19068  "DYNAMIC_SLOTS": 1024,
19069  "1024": "DYNAMIC_SLOTS",
19070  "DEV_ROOT_FRAGMENT": 2048,
19071  "2048": "DEV_ROOT_FRAGMENT",
19072  "HOISTED": -1,
19073  "-1": "HOISTED",
19074  "BAIL": -2,
19075  "-2": "BAIL"
19076};
19077const PatchFlagNames = {
19078  [1]: `TEXT`,
19079  [2]: `CLASS`,
19080  [4]: `STYLE`,
19081  [8]: `PROPS`,
19082  [16]: `FULL_PROPS`,
19083  [32]: `NEED_HYDRATION`,
19084  [64]: `STABLE_FRAGMENT`,
19085  [128]: `KEYED_FRAGMENT`,
19086  [256]: `UNKEYED_FRAGMENT`,
19087  [512]: `NEED_PATCH`,
19088  [1024]: `DYNAMIC_SLOTS`,
19089  [2048]: `DEV_ROOT_FRAGMENT`,
19090  [-1]: `HOISTED`,
19091  [-2]: `BAIL`
19092};
19093
19094const ShapeFlags = {
19095  "ELEMENT": 1,
19096  "1": "ELEMENT",
19097  "FUNCTIONAL_COMPONENT": 2,
19098  "2": "FUNCTIONAL_COMPONENT",
19099  "STATEFUL_COMPONENT": 4,
19100  "4": "STATEFUL_COMPONENT",
19101  "TEXT_CHILDREN": 8,
19102  "8": "TEXT_CHILDREN",
19103  "ARRAY_CHILDREN": 16,
19104  "16": "ARRAY_CHILDREN",
19105  "SLOTS_CHILDREN": 32,
19106  "32": "SLOTS_CHILDREN",
19107  "TELEPORT": 64,
19108  "64": "TELEPORT",
19109  "SUSPENSE": 128,
19110  "128": "SUSPENSE",
19111  "COMPONENT_SHOULD_KEEP_ALIVE": 256,
19112  "256": "COMPONENT_SHOULD_KEEP_ALIVE",
19113  "COMPONENT_KEPT_ALIVE": 512,
19114  "512": "COMPONENT_KEPT_ALIVE",
19115  "COMPONENT": 6,
19116  "6": "COMPONENT"
19117};
19118
19119const SlotFlags = {
19120  "STABLE": 1,
19121  "1": "STABLE",
19122  "DYNAMIC": 2,
19123  "2": "DYNAMIC",
19124  "FORWARDED": 3,
19125  "3": "FORWARDED"
19126};
19127const slotFlagsText = {
19128  [1]: "STABLE",
19129  [2]: "DYNAMIC",
19130  [3]: "FORWARDED"
19131};
19132
19133const GLOBALS_ALLOWED = "Infinity,undefined,NaN,isFinite,isNaN,parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt,console,Error";
19134const isGloballyAllowed = /* @__PURE__ */ makeMap(GLOBALS_ALLOWED);
19135const isGloballyWhitelisted = isGloballyAllowed;
19136
19137const range = 2;
19138function generateCodeFrame(source, start = 0, end = source.length) {
19139  start = Math.max(0, Math.min(start, source.length));
19140  end = Math.max(0, Math.min(end, source.length));
19141  if (start > end) return "";
19142  let lines = source.split(/(\r?\n)/);
19143  const newlineSequences = lines.filter((_, idx) => idx % 2 === 1);
19144  lines = lines.filter((_, idx) => idx % 2 === 0);
19145  let count = 0;
19146  const res = [];
19147  for (let i = 0; i < lines.length; i++) {
19148    count += lines[i].length + (newlineSequences[i] && newlineSequences[i].length || 0);
19149    if (count >= start) {
19150      for (let j = i - range; j <= i + range || end > count; j++) {
19151        if (j < 0 || j >= lines.length) continue;
19152        const line = j + 1;
19153        res.push(
19154          `${line}${" ".repeat(Math.max(3 - String(line).length, 0))}|  ${lines[j]}`
19155        );
19156        const lineLength = lines[j].length;
19157        const newLineSeqLength = newlineSequences[j] && newlineSequences[j].length || 0;
19158        if (j === i) {
19159          const pad = start - (count - (lineLength + newLineSeqLength));
19160          const length = Math.max(
19161            1,
19162            end > count ? lineLength - pad : end - start
19163          );
19164          res.push(`   |  ` + " ".repeat(pad) + "^".repeat(length));
19165        } else if (j > i) {
19166          if (end > count) {
19167            const length = Math.max(Math.min(end - count, lineLength), 1);
19168            res.push(`   |  ` + "^".repeat(length));
19169          }
19170          count += lineLength + newLineSeqLength;
19171        }
19172      }
19173      break;
19174    }
19175  }
19176  return res.join("\n");
19177}
19178
19179function normalizeStyle(value) {
19180  if (isArray(value)) {
19181    const res = {};
19182    for (let i = 0; i < value.length; i++) {
19183      const item = value[i];
19184      const normalized = isString(item) ? parseStringStyle(item) : normalizeStyle(item);
19185      if (normalized) {
19186        for (const key in normalized) {
19187          res[key] = normalized[key];
19188        }
19189      }
19190    }
19191    return res;
19192  } else if (isString(value) || isObject(value)) {
19193    return value;
19194  }
19195}
19196const listDelimiterRE = /;(?![^(]*\))/g;
19197const propertyDelimiterRE = /:([^]+)/;
19198const styleCommentRE = /\/\*[^]*?\*\//g;
19199function parseStringStyle(cssText) {
19200  const ret = {};
19201  cssText.replace(styleCommentRE, "").split(listDelimiterRE).forEach((item) => {
19202    if (item) {
19203      const tmp = item.split(propertyDelimiterRE);
19204      tmp.length > 1 && (ret[tmp[0].trim()] = tmp[1].trim());
19205    }
19206  });
19207  return ret;
19208}
19209function stringifyStyle(styles) {
19210  let ret = "";
19211  if (!styles || isString(styles)) {
19212    return ret;
19213  }
19214  for (const key in styles) {
19215    const value = styles[key];
19216    if (isString(value) || typeof value === "number") {
19217      const normalizedKey = key.startsWith(`--`) ? key : hyphenate(key);
19218      ret += `${normalizedKey}:${value};`;
19219    }
19220  }
19221  return ret;
19222}
19223function normalizeClass(value) {
19224  let res = "";
19225  if (isString(value)) {
19226    res = value;
19227  } else if (isArray(value)) {
19228    for (let i = 0; i < value.length; i++) {
19229      const normalized = normalizeClass(value[i]);
19230      if (normalized) {
19231        res += normalized + " ";
19232      }
19233    }
19234  } else if (isObject(value)) {
19235    for (const name in value) {
19236      if (value[name]) {
19237        res += name + " ";
19238      }
19239    }
19240  }
19241  return res.trim();
19242}
19243function normalizeProps(props) {
19244  if (!props) return null;
19245  let { class: klass, style } = props;
19246  if (klass && !isString(klass)) {
19247    props.class = normalizeClass(klass);
19248  }
19249  if (style) {
19250    props.style = normalizeStyle(style);
19251  }
19252  return props;
19253}
19254
19255const HTML_TAGS = "html,body,base,head,link,meta,style,title,address,article,aside,footer,header,hgroup,h1,h2,h3,h4,h5,h6,nav,section,div,dd,dl,dt,figcaption,figure,picture,hr,img,li,main,ol,p,pre,ul,a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,ruby,s,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,embed,object,param,source,canvas,script,noscript,del,ins,caption,col,colgroup,table,thead,tbody,td,th,tr,button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,output,progress,select,textarea,details,dialog,menu,summary,template,blockquote,iframe,tfoot";
19256const SVG_TAGS = "svg,animate,animateMotion,animateTransform,circle,clipPath,color-profile,defs,desc,discard,ellipse,feBlend,feColorMatrix,feComponentTransfer,feComposite,feConvolveMatrix,feDiffuseLighting,feDisplacementMap,feDistantLight,feDropShadow,feFlood,feFuncA,feFuncB,feFuncG,feFuncR,feGaussianBlur,feImage,feMerge,feMergeNode,feMorphology,feOffset,fePointLight,feSpecularLighting,feSpotLight,feTile,feTurbulence,filter,foreignObject,g,hatch,hatchpath,image,line,linearGradient,marker,mask,mesh,meshgradient,meshpatch,meshrow,metadata,mpath,path,pattern,polygon,polyline,radialGradient,rect,set,solidcolor,stop,switch,symbol,text,textPath,title,tspan,unknown,use,view";
19257const MATH_TAGS = "annotation,annotation-xml,maction,maligngroup,malignmark,math,menclose,merror,mfenced,mfrac,mfraction,mglyph,mi,mlabeledtr,mlongdiv,mmultiscripts,mn,mo,mover,mpadded,mphantom,mprescripts,mroot,mrow,ms,mscarries,mscarry,msgroup,msline,mspace,msqrt,msrow,mstack,mstyle,msub,msubsup,msup,mtable,mtd,mtext,mtr,munder,munderover,none,semantics";
19258const VOID_TAGS = "area,base,br,col,embed,hr,img,input,link,meta,param,source,track,wbr";
19259const isHTMLTag = /* @__PURE__ */ makeMap(HTML_TAGS);
19260const isSVGTag = /* @__PURE__ */ makeMap(SVG_TAGS);
19261const isMathMLTag = /* @__PURE__ */ makeMap(MATH_TAGS);
19262const isVoidTag = /* @__PURE__ */ makeMap(VOID_TAGS);
19263
19264const specialBooleanAttrs = `itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly`;
19265const isSpecialBooleanAttr = /* @__PURE__ */ makeMap(specialBooleanAttrs);
19266const isBooleanAttr = /* @__PURE__ */ makeMap(
19267  specialBooleanAttrs + `,async,autofocus,autoplay,controls,default,defer,disabled,hidden,inert,loop,open,required,reversed,scoped,seamless,checked,muted,multiple,selected`
19268);
19269function includeBooleanAttr(value) {
19270  return !!value || value === "";
19271}
19272const unsafeAttrCharRE = /[>/="'\u0009\u000a\u000c\u0020]/;
19273const attrValidationCache = {};
19274function isSSRSafeAttrName(name) {
19275  if (attrValidationCache.hasOwnProperty(name)) {
19276    return attrValidationCache[name];
19277  }
19278  const isUnsafe = unsafeAttrCharRE.test(name);
19279  if (isUnsafe) {
19280    console.error(`unsafe attribute name: ${name}`);
19281  }
19282  return attrValidationCache[name] = !isUnsafe;
19283}
19284const propsToAttrMap = {
19285  acceptCharset: "accept-charset",
19286  className: "class",
19287  htmlFor: "for",
19288  httpEquiv: "http-equiv"
19289};
19290const isKnownHtmlAttr = /* @__PURE__ */ makeMap(
19291  `accept,accept-charset,accesskey,action,align,allow,alt,async,autocapitalize,autocomplete,autofocus,autoplay,background,bgcolor,border,buffered,capture,challenge,charset,checked,cite,class,code,codebase,color,cols,colspan,content,contenteditable,contextmenu,controls,coords,crossorigin,csp,data,datetime,decoding,default,defer,dir,dirname,disabled,download,draggable,dropzone,enctype,enterkeyhint,for,form,formaction,formenctype,formmethod,formnovalidate,formtarget,headers,height,hidden,high,href,hreflang,http-equiv,icon,id,importance,inert,integrity,ismap,itemprop,keytype,kind,label,lang,language,loading,list,loop,low,manifest,max,maxlength,minlength,media,min,multiple,muted,name,novalidate,open,optimum,pattern,ping,placeholder,poster,preload,radiogroup,readonly,referrerpolicy,rel,required,reversed,rows,rowspan,sandbox,scope,scoped,selected,shape,size,sizes,slot,span,spellcheck,src,srcdoc,srclang,srcset,start,step,style,summary,tabindex,target,title,translate,type,usemap,value,width,wrap`
19292);
19293const isKnownSvgAttr = /* @__PURE__ */ makeMap(
19294  `xmlns,accent-height,accumulate,additive,alignment-baseline,alphabetic,amplitude,arabic-form,ascent,attributeName,attributeType,azimuth,baseFrequency,baseline-shift,baseProfile,bbox,begin,bias,by,calcMode,cap-height,class,clip,clipPathUnits,clip-path,clip-rule,color,color-interpolation,color-interpolation-filters,color-profile,color-rendering,contentScriptType,contentStyleType,crossorigin,cursor,cx,cy,d,decelerate,descent,diffuseConstant,direction,display,divisor,dominant-baseline,dur,dx,dy,edgeMode,elevation,enable-background,end,exponent,fill,fill-opacity,fill-rule,filter,filterRes,filterUnits,flood-color,flood-opacity,font-family,font-size,font-size-adjust,font-stretch,font-style,font-variant,font-weight,format,from,fr,fx,fy,g1,g2,glyph-name,glyph-orientation-horizontal,glyph-orientation-vertical,glyphRef,gradientTransform,gradientUnits,hanging,height,href,hreflang,horiz-adv-x,horiz-origin-x,id,ideographic,image-rendering,in,in2,intercept,k,k1,k2,k3,k4,kernelMatrix,kernelUnitLength,kerning,keyPoints,keySplines,keyTimes,lang,lengthAdjust,letter-spacing,lighting-color,limitingConeAngle,local,marker-end,marker-mid,marker-start,markerHeight,markerUnits,markerWidth,mask,maskContentUnits,maskUnits,mathematical,max,media,method,min,mode,name,numOctaves,offset,opacity,operator,order,orient,orientation,origin,overflow,overline-position,overline-thickness,panose-1,paint-order,path,pathLength,patternContentUnits,patternTransform,patternUnits,ping,pointer-events,points,pointsAtX,pointsAtY,pointsAtZ,preserveAlpha,preserveAspectRatio,primitiveUnits,r,radius,referrerPolicy,refX,refY,rel,rendering-intent,repeatCount,repeatDur,requiredExtensions,requiredFeatures,restart,result,rotate,rx,ry,scale,seed,shape-rendering,slope,spacing,specularConstant,specularExponent,speed,spreadMethod,startOffset,stdDeviation,stemh,stemv,stitchTiles,stop-color,stop-opacity,strikethrough-position,strikethrough-thickness,string,stroke,stroke-dasharray,stroke-dashoffset,stroke-linecap,stroke-linejoin,stroke-miterlimit,stroke-opacity,stroke-width,style,surfaceScale,systemLanguage,tabindex,tableValues,target,targetX,targetY,text-anchor,text-decoration,text-rendering,textLength,to,transform,transform-origin,type,u1,u2,underline-position,underline-thickness,unicode,unicode-bidi,unicode-range,units-per-em,v-alphabetic,v-hanging,v-ideographic,v-mathematical,values,vector-effect,version,vert-adv-y,vert-origin-x,vert-origin-y,viewBox,viewTarget,visibility,width,widths,word-spacing,writing-mode,x,x-height,x1,x2,xChannelSelector,xlink:actuate,xlink:arcrole,xlink:href,xlink:role,xlink:show,xlink:title,xlink:type,xmlns:xlink,xml:base,xml:lang,xml:space,y,y1,y2,yChannelSelector,z,zoomAndPan`
19295);
19296function isRenderableAttrValue(value) {
19297  if (value == null) {
19298    return false;
19299  }
19300  const type = typeof value;
19301  return type === "string" || type === "number" || type === "boolean";
19302}
19303
19304const escapeRE = /["'&<>]/;
19305function escapeHtml(string) {
19306  const str = "" + string;
19307  const match = escapeRE.exec(str);
19308  if (!match) {
19309    return str;
19310  }
19311  let html = "";
19312  let escaped;
19313  let index;
19314  let lastIndex = 0;
19315  for (index = match.index; index < str.length; index++) {
19316    switch (str.charCodeAt(index)) {
19317      case 34:
19318        escaped = "&quot;";
19319        break;
19320      case 38:
19321        escaped = "&amp;";
19322        break;
19323      case 39:
19324        escaped = "&#39;";
19325        break;
19326      case 60:
19327        escaped = "&lt;";
19328        break;
19329      case 62:
19330        escaped = "&gt;";
19331        break;
19332      default:
19333        continue;
19334    }
19335    if (lastIndex !== index) {
19336      html += str.slice(lastIndex, index);
19337    }
19338    lastIndex = index + 1;
19339    html += escaped;
19340  }
19341  return lastIndex !== index ? html + str.slice(lastIndex, index) : html;
19342}
19343const commentStripRE = /^-?>|<!--|-->|--!>|<!-$/g;
19344function escapeHtmlComment(src) {
19345  return src.replace(commentStripRE, "");
19346}
19347
19348function looseCompareArrays(a, b) {
19349  if (a.length !== b.length) return false;
19350  let equal = true;
19351  for (let i = 0; equal && i < a.length; i++) {
19352    equal = looseEqual(a[i], b[i]);
19353  }
19354  return equal;
19355}
19356function looseEqual(a, b) {
19357  if (a === b) return true;
19358  let aValidType = isDate(a);
19359  let bValidType = isDate(b);
19360  if (aValidType || bValidType) {
19361    return aValidType && bValidType ? a.getTime() === b.getTime() : false;
19362  }
19363  aValidType = isSymbol(a);
19364  bValidType = isSymbol(b);
19365  if (aValidType || bValidType) {
19366    return a === b;
19367  }
19368  aValidType = isArray(a);
19369  bValidType = isArray(b);
19370  if (aValidType || bValidType) {
19371    return aValidType && bValidType ? looseCompareArrays(a, b) : false;
19372  }
19373  aValidType = isObject(a);
19374  bValidType = isObject(b);
19375  if (aValidType || bValidType) {
19376    if (!aValidType || !bValidType) {
19377      return false;
19378    }
19379    const aKeysCount = Object.keys(a).length;
19380    const bKeysCount = Object.keys(b).length;
19381    if (aKeysCount !== bKeysCount) {
19382      return false;
19383    }
19384    for (const key in a) {
19385      const aHasKey = a.hasOwnProperty(key);
19386      const bHasKey = b.hasOwnProperty(key);
19387      if (aHasKey && !bHasKey || !aHasKey && bHasKey || !looseEqual(a[key], b[key])) {
19388        return false;
19389      }
19390    }
19391  }
19392  return String(a) === String(b);
19393}
19394function looseIndexOf(arr, val) {
19395  return arr.findIndex((item) => looseEqual(item, val));
19396}
19397
19398const isRef = (val) => {
19399  return !!(val && val.__v_isRef === true);
19400};
19401const toDisplayString = (val) => {
19402  return isString(val) ? val : val == null ? "" : isArray(val) || isObject(val) && (val.toString === objectToString || !isFunction(val.toString)) ? isRef(val) ? toDisplayString(val.value) : JSON.stringify(val, replacer, 2) : String(val);
19403};
19404const replacer = (_key, val) => {
19405  if (isRef(val)) {
19406    return replacer(_key, val.value);
19407  } else if (isMap(val)) {
19408    return {
19409      [`Map(${val.size})`]: [...val.entries()].reduce(
19410        (entries, [key, val2], i) => {
19411          entries[stringifySymbol(key, i) + " =>"] = val2;
19412          return entries;
19413        },
19414        {}
19415      )
19416    };
19417  } else if (isSet(val)) {
19418    return {
19419      [`Set(${val.size})`]: [...val.values()].map((v) => stringifySymbol(v))
19420    };
19421  } else if (isSymbol(val)) {
19422    return stringifySymbol(val);
19423  } else if (isObject(val) && !isArray(val) && !isPlainObject(val)) {
19424    return String(val);
19425  }
19426  return val;
19427};
19428const stringifySymbol = (v, i = "") => {
19429  var _a;
19430  return (
19431    // Symbol.description in es2019+ so we need to cast here to pass
19432    // the lib: es2016 check
19433    isSymbol(v) ? `Symbol(${(_a = v.description) != null ? _a : i})` : v
19434  );
19435};
19436
19437
19438
19439
19440/***/ }),
19441
19442/***/ "./src/js/pages/common/lazyload.js":
19443/*!*****************************************!*\
19444  !*** ./src/js/pages/common/lazyload.js ***!
19445  \*****************************************/
19446/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
19447
19448"use strict";
19449__webpack_require__.r(__webpack_exports__);
19450/* harmony export */ __webpack_require__.d(__webpack_exports__, {
19451/* harmony export */   "default": function() { return /* export default binding */ __WEBPACK_DEFAULT_EXPORT__; }
19452/* harmony export */ });
19453/* harmony import */ var lazysizes__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lazysizes */ "./node_modules/lazysizes/lazysizes.js");
19454/* harmony import */ var lazysizes__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(lazysizes__WEBPACK_IMPORTED_MODULE_0__);
19455/* harmony import */ var lazysizes_plugins_unveilhooks_ls_unveilhooks__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lazysizes/plugins/unveilhooks/ls.unveilhooks */ "./node_modules/lazysizes/plugins/unveilhooks/ls.unveilhooks.js");
19456/* harmony import */ var lazysizes_plugins_unveilhooks_ls_unveilhooks__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(lazysizes_plugins_unveilhooks_ls_unveilhooks__WEBPACK_IMPORTED_MODULE_1__);
19457
19458
19459
19460/* harmony default export */ function __WEBPACK_DEFAULT_EXPORT__() {
19461  (lazysizes__WEBPACK_IMPORTED_MODULE_0___default().cfg).lazyClass = "js-lazy";
19462}
19463
19464
19465/***/ }),
19466
19467/***/ "./src/js/pages/common/loading.js":
19468/*!****************************************!*\
19469  !*** ./src/js/pages/common/loading.js ***!
19470  \****************************************/
19471/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
19472
19473"use strict";
19474__webpack_require__.r(__webpack_exports__);
19475/* harmony export */ __webpack_require__.d(__webpack_exports__, {
19476/* harmony export */   "default": function() { return /* export default binding */ __WEBPACK_DEFAULT_EXPORT__; }
19477/* harmony export */ });
19478/* harmony import */ var preloader__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! preloader */ "./node_modules/preloader/index.js");
19479/* harmony import */ var preloader__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(preloader__WEBPACK_IMPORTED_MODULE_0__);
19480
19481
19482/* harmony default export */ function __WEBPACK_DEFAULT_EXPORT__(add_urls = []) {
19483  const $progress_bar = $(".js-loading-progress");
19484  const loader = preloader__WEBPACK_IMPORTED_MODULE_0___default()({ xhrImages: false });
19485  const image_urls = get_image_list();
19486  const urls = Object.assign(image_urls, add_urls);
19487  return new Promise((resolve, reject) => {
19488    urls.forEach((url) => {
19489      loader.add(url);
19490    });
19491    loader.on("progress", (percent, url) => {
19492      $progress_bar.css({ width: `${percent * 100}%` });
19493    });
19494    loader.on("complete", () => {
19495      $progress_bar.css({ width: "100%" });
19496      $(window).trigger("page_load_complete");
19497      resolve();
19498    });
19499    loader.load();
19500  });
19501}
19502function get_image_list() {
19503  const hostname = /^https?:\/\/[^/]+\//.exec(window.location.href)[0];
19504  const images = document.getElementsByTagName("img");
19505  const urls = [];
19506  for (let i = 0; i < images.length; i += 1) {
19507    const src = images[i].src;
19508    if (src.indexOf(hostname) === 0) {
19509      urls.push(src);
19510    }
19511  }
19512  return urls;
19513}
19514
19515
19516/***/ }),
19517
19518/***/ "./src/js/pages/common/loading_complete.js":
19519/*!*************************************************!*\
19520  !*** ./src/js/pages/common/loading_complete.js ***!
19521  \*************************************************/
19522/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
19523
19524"use strict";
19525__webpack_require__.r(__webpack_exports__);
19526/* harmony export */ __webpack_require__.d(__webpack_exports__, {
19527/* harmony export */   "default": function() { return /* export default binding */ __WEBPACK_DEFAULT_EXPORT__; }
19528/* harmony export */ });
19529/* harmony import */ var _scroll_invew__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./scroll-invew */ "./src/js/pages/common/scroll-invew.ts");
19530
19531
19532/* harmony default export */ function __WEBPACK_DEFAULT_EXPORT__() {
19533  const delay = 600;
19534  setTimeout(fadein, 200 + delay);
19535  setTimeout(remove_fadein, 1200 + delay);
19536  setTimeout(_scroll_invew__WEBPACK_IMPORTED_MODULE_0__["default"], 1200 + delay);
19537}
19538function fadein() {
19539  $(".js-loading").attr("data-loading-finish", "true");
19540  $(window).trigger("page_fadein");
19541}
19542function remove_fadein() {
19543  $(".js-loading").remove();
19544}
19545
19546
19547/***/ }),
19548
19549/***/ "./src/js/pages/common/popup.js":
19550/*!**************************************!*\
19551  !*** ./src/js/pages/common/popup.js ***!
19552  \**************************************/
19553/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
19554
19555"use strict";
19556__webpack_require__.r(__webpack_exports__);
19557/* harmony export */ __webpack_require__.d(__webpack_exports__, {
19558/* harmony export */   AJAX_SETTINGS: function() { return /* binding */ AJAX_SETTINGS; },
19559/* harmony export */   NORMAL_SETTINGS: function() { return /* binding */ NORMAL_SETTINGS; },
19560/* harmony export */   "default": function() { return /* export default binding */ __WEBPACK_DEFAULT_EXPORT__; }
19561/* harmony export */ });
19562/* harmony import */ var _lazyload__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./lazyload */ "./src/js/pages/common/lazyload.js");
19563/* harmony import */ var _fancyapps_ui__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @fancyapps/ui */ "./node_modules/@fancyapps/ui/dist/index.esm.js");
19564
19565
19566
19567const closeButton = '<button data-fancybox-close class="f-button is-close-btn" title="{{CLOSE}}"><i class="i-arrows-times-1"></i></button>';
19568const NORMAL_SETTINGS = {
19569  mainClass: "",
19570  dragToClose: false,
19571  tpl: { closeButton }
19572};
19573const AJAX_SETTINGS = {
19574  type: "ajax",
19575  dragToClose: false,
19576  mainClass: "",
19577  toolbar: true,
19578  tpl: { closeButton },
19579  on: {
19580    reveal: () => {
19581      (0,_lazyload__WEBPACK_IMPORTED_MODULE_0__["default"])();
19582    }
19583  }
19584};
19585/* harmony default export */ function __WEBPACK_DEFAULT_EXPORT__() {
19586  _fancyapps_ui__WEBPACK_IMPORTED_MODULE_1__.Fancybox.bind("[data-fancybox]", NORMAL_SETTINGS);
19587  _fancyapps_ui__WEBPACK_IMPORTED_MODULE_1__.Fancybox.bind("[data-fancybox-ajax]", AJAX_SETTINGS);
19588}
19589
19590
19591/***/ }),
19592
19593/***/ "./src/js/pages/common/check-ua.ts":
19594/*!*****************************************!*\
19595  !*** ./src/js/pages/common/check-ua.ts ***!
19596  \*****************************************/
19597/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
19598
19599"use strict";
19600__webpack_require__.r(__webpack_exports__);
19601/* harmony export */ __webpack_require__.d(__webpack_exports__, {
19602/* harmony export */   "default": function() { return /* export default binding */ __WEBPACK_DEFAULT_EXPORT__; }
19603/* harmony export */ });
19604/* harmony import */ var is_touch_device__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! is-touch-device */ "./node_modules/is-touch-device/build/index.js");
19605/* harmony import */ var is_touch_device__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(is_touch_device__WEBPACK_IMPORTED_MODULE_0__);
19606
19607
19608/* harmony default export */ function __WEBPACK_DEFAULT_EXPORT__() {
19609  if (is_touch_device__WEBPACK_IMPORTED_MODULE_0___default()()) {
19610    document.body.setAttribute("data-is-mobile", "true");
19611  } else {
19612    document.body.setAttribute("data-is-mobile", "false");
19613  }
19614}
19615
19616
19617/***/ }),
19618
19619/***/ "./src/js/pages/common/index.ts":
19620/*!**************************************!*\
19621  !*** ./src/js/pages/common/index.ts ***!
19622  \**************************************/
19623/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
19624
19625"use strict";
19626__webpack_require__.r(__webpack_exports__);
19627/* harmony export */ __webpack_require__.d(__webpack_exports__, {
19628/* harmony export */   "default": function() { return /* export default binding */ __WEBPACK_DEFAULT_EXPORT__; }
19629/* harmony export */ });
19630/* harmony import */ var _lazyload__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./lazyload */ "./src/js/pages/common/lazyload.js");
19631/* harmony import */ var _mediaquery__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./mediaquery */ "./src/js/pages/common/mediaquery.ts");
19632/* harmony import */ var _check_ua__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./check-ua */ "./src/js/pages/common/check-ua.ts");
19633/* harmony import */ var _pagescroll__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./pagescroll */ "./src/js/pages/common/pagescroll.ts");
19634/* harmony import */ var _scroll_amount__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./scroll-amount */ "./src/js/pages/common/scroll-amount.ts");
19635/* harmony import */ var _social_share__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./social-share */ "./src/js/pages/common/social-share.ts");
19636/* harmony import */ var _popup__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./popup */ "./src/js/pages/common/popup.js");
19637/* harmony import */ var _tabs__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./tabs */ "./src/js/pages/common/tabs.ts");
19638/* harmony import */ var _menu__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./menu */ "./src/js/pages/common/menu.ts");
19639/* harmony import */ var _menuActive__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./menuActive */ "./src/js/pages/common/menuActive.ts");
19640/* harmony import */ var _loading__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./loading */ "./src/js/pages/common/loading.js");
19641/* harmony import */ var _loading_complete__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./loading_complete */ "./src/js/pages/common/loading_complete.js");
19642
19643
19644
19645
19646
19647
19648
19649
19650
19651
19652
19653
19654
19655/* harmony default export */ function __WEBPACK_DEFAULT_EXPORT__() {
19656  (0,_lazyload__WEBPACK_IMPORTED_MODULE_0__["default"])();
19657  (0,_mediaquery__WEBPACK_IMPORTED_MODULE_1__["default"])();
19658  (0,_check_ua__WEBPACK_IMPORTED_MODULE_2__["default"])();
19659  (0,_pagescroll__WEBPACK_IMPORTED_MODULE_3__["default"])();
19660  (0,_scroll_amount__WEBPACK_IMPORTED_MODULE_4__["default"])();
19661  (0,_social_share__WEBPACK_IMPORTED_MODULE_5__["default"])();
19662  (0,_menu__WEBPACK_IMPORTED_MODULE_8__["default"])();
19663  (0,_menuActive__WEBPACK_IMPORTED_MODULE_9__["default"])();
19664  (0,_popup__WEBPACK_IMPORTED_MODULE_6__["default"])();
19665  (0,_tabs__WEBPACK_IMPORTED_MODULE_7__["default"])();
19666  (0,_loading__WEBPACK_IMPORTED_MODULE_10__["default"])().then(_loading_complete__WEBPACK_IMPORTED_MODULE_11__["default"]);
19667}
19668
19669
19670/***/ }),
19671
19672/***/ "./src/js/pages/common/mediaquery.ts":
19673/*!*******************************************!*\
19674  !*** ./src/js/pages/common/mediaquery.ts ***!
19675  \*******************************************/
19676/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
19677
19678"use strict";
19679__webpack_require__.r(__webpack_exports__);
19680/* harmony export */ __webpack_require__.d(__webpack_exports__, {
19681/* harmony export */   "default": function() { return /* export default binding */ __WEBPACK_DEFAULT_EXPORT__; }
19682/* harmony export */ });
19683/* harmony import */ var _sygnas_mediaquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @sygnas/mediaquery */ "./node_modules/@sygnas/mediaquery/dist/es6/index.js");
19684
19685
19686/* harmony default export */ function __WEBPACK_DEFAULT_EXPORT__() {
19687  _sygnas_mediaquery__WEBPACK_IMPORTED_MODULE_0__["default"].addMedia("pc", "screen and (min-width: 851px)");
19688  _sygnas_mediaquery__WEBPACK_IMPORTED_MODULE_0__["default"].addMedia("tb", "screen and (min-width: 551px) and (max-width: 850px)");
19689  _sygnas_mediaquery__WEBPACK_IMPORTED_MODULE_0__["default"].addMedia("tb-lo", "screen (max-width: 850px)");
19690  _sygnas_mediaquery__WEBPACK_IMPORTED_MODULE_0__["default"].addMedia("sp-up", "screen and (min-width: 551px)");
19691  _sygnas_mediaquery__WEBPACK_IMPORTED_MODULE_0__["default"].addMedia("sp", "screen and (max-width: 550px)");
19692}
19693
19694
19695/***/ }),
19696
19697/***/ "./src/js/pages/common/menu.ts":
19698/*!*************************************!*\
19699  !*** ./src/js/pages/common/menu.ts ***!
19700  \*************************************/
19701/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
19702
19703"use strict";
19704__webpack_require__.r(__webpack_exports__);
19705/* harmony export */ __webpack_require__.d(__webpack_exports__, {
19706/* harmony export */   "default": function() { return /* export default binding */ __WEBPACK_DEFAULT_EXPORT__; }
19707/* harmony export */ });
19708
19709const getHamburger = () => {
19710  return document.querySelector(".js-hamburger");
19711};
19712/* harmony default export */ function __WEBPACK_DEFAULT_EXPORT__() {
19713  const $hamburger = $(".js-hamburger");
19714  $hamburger.on("click", toggle_menu);
19715  $(".c-mainmenu a.js-pagescroll").on("click", toggle_menu);
19716  $(".js-has-submenu").on("click", toggle_submenu);
19717}
19718function toggle_menu(ev) {
19719  const hamburger = getHamburger();
19720  const state = hamburger?.getAttribute("data-hamburger-open");
19721  const is_open = state === "true" ? "false" : "true";
19722  hamburger.setAttribute("data-hamburger-open", is_open);
19723  $(".js-spmenu").attr("data-spmenu", is_open === "true" ? "open" : "close");
19724  if (ev.currentTarget === hamburger) {
19725    ev.preventDefault();
19726  }
19727}
19728function toggle_submenu(ev) {
19729  const $button = $(ev.currentTarget);
19730  const $submenu = $button.next();
19731  const is_opened = $button.attr("data-submenu-opened") === "true";
19732  if (is_opened) {
19733    $button.attr("data-submenu-opened", "false");
19734    $submenu.attr("data-submenu-opened", "false");
19735  } else {
19736    $button.attr("data-submenu-opened", "true");
19737    $submenu.attr("data-submenu-opened", "true");
19738  }
19739  ev.preventDefault();
19740}
19741
19742
19743/***/ }),
19744
19745/***/ "./src/js/pages/common/menuActive.ts":
19746/*!*******************************************!*\
19747  !*** ./src/js/pages/common/menuActive.ts ***!
19748  \*******************************************/
19749/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
19750
19751"use strict";
19752__webpack_require__.r(__webpack_exports__);
19753
19754const items = {
19755  news: false,
19756  story: false,
19757  staff: false,
19758  character: false,
19759  book: false
19760};
19761const option = {
19762  rootMargin: "-48% 0px",
19763  threshold: 0
19764};
19765const callback = (entries) => {
19766  entries.forEach((entry) => {
19767    const menu = entry.target.getAttribute("data-menu");
19768    const isActive = entry.isIntersecting;
19769    if (isActive) {
19770      Object.keys(items).forEach((key) => {
19771        items[key] = false;
19772      });
19773    }
19774    items[menu] = isActive;
19775  });
19776  Object.keys(items).forEach((key) => {
19777    const menuItem = document.querySelector(`.c-mainmenu__link--${key}`);
19778    const isActive = items[key];
19779    menuItem?.setAttribute("data-menu-active", isActive ? "true" : "false");
19780  });
19781};
19782/* harmony default export */ __webpack_exports__["default"] = (() => {
19783  const observer = new IntersectionObserver(callback, option);
19784  const contents = document.querySelectorAll(".js-menu-active");
19785  contents.forEach((content) => {
19786    observer.observe(content);
19787  });
19788});
19789
19790
19791/***/ }),
19792
19793/***/ "./src/js/pages/common/pagescroll.ts":
19794/*!*******************************************!*\
19795  !*** ./src/js/pages/common/pagescroll.ts ***!
19796  \*******************************************/
19797/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
19798
19799"use strict";
19800__webpack_require__.r(__webpack_exports__);
19801/* harmony export */ __webpack_require__.d(__webpack_exports__, {
19802/* harmony export */   "default": function() { return /* export default binding */ __WEBPACK_DEFAULT_EXPORT__; }
19803/* harmony export */ });
19804/* harmony import */ var smooth_scroll__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! smooth-scroll */ "./node_modules/smooth-scroll/dist/smooth-scroll.polyfills.min.js");
19805/* harmony import */ var smooth_scroll__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(smooth_scroll__WEBPACK_IMPORTED_MODULE_0__);
19806
19807
19808/* harmony default export */ function __WEBPACK_DEFAULT_EXPORT__() {
19809  const click_scroll = new (smooth_scroll__WEBPACK_IMPORTED_MODULE_0___default())("a.js-pagescroll", {
19810    speed: 500,
19811    offset: 0,
19812    easing: "easeInOutCubic"
19813  });
19814  const scroll = new (smooth_scroll__WEBPACK_IMPORTED_MODULE_0___default())();
19815  $(".js-return-up").on("click", (ev) => {
19816    scroll.animateScroll(0, null, {
19817      speed: 500,
19818      offset: 0,
19819      easing: "easeInOutCubic"
19820    });
19821    ev.preventDefault();
19822  });
19823}
19824
19825
19826/***/ }),
19827
19828/***/ "./src/js/pages/common/scroll-amount.ts":
19829/*!**********************************************!*\
19830  !*** ./src/js/pages/common/scroll-amount.ts ***!
19831  \**********************************************/
19832/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
19833
19834"use strict";
19835__webpack_require__.r(__webpack_exports__);
19836/* harmony export */ __webpack_require__.d(__webpack_exports__, {
19837/* harmony export */   "default": function() { return /* export default binding */ __WEBPACK_DEFAULT_EXPORT__; }
19838/* harmony export */ });
19839/* harmony import */ var _sygnas_scroll_amount__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @sygnas/scroll-amount */ "./node_modules/@sygnas/scroll-amount/dist/es6/index.js");
19840
19841
19842/* harmony default export */ function __WEBPACK_DEFAULT_EXPORT__() {
19843  const scroll_amount = new _sygnas_scroll_amount__WEBPACK_IMPORTED_MODULE_0__["default"](".js-scroll-amount");
19844}
19845
19846
19847/***/ }),
19848
19849/***/ "./src/js/pages/common/scroll-invew.ts":
19850/*!*********************************************!*\
19851  !*** ./src/js/pages/common/scroll-invew.ts ***!
19852  \*********************************************/
19853/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
19854
19855"use strict";
19856__webpack_require__.r(__webpack_exports__);
19857/* harmony export */ __webpack_require__.d(__webpack_exports__, {
19858/* harmony export */   "default": function() { return /* export default binding */ __WEBPACK_DEFAULT_EXPORT__; }
19859/* harmony export */ });
19860/* harmony import */ var _sygnas_scroll_inview__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @sygnas/scroll-inview */ "./node_modules/@sygnas/scroll-inview/dist/es6/index.js");
19861
19862
19863/* harmony default export */ function __WEBPACK_DEFAULT_EXPORT__() {
19864  const inview = new _sygnas_scroll_inview__WEBPACK_IMPORTED_MODULE_0__["default"](".js-inview", { rootMargin: "0px 0px -20% 0px" });
19865  inview.start();
19866}
19867
19868
19869/***/ }),
19870
19871/***/ "./src/js/pages/common/social-share.ts":
19872/*!*********************************************!*\
19873  !*** ./src/js/pages/common/social-share.ts ***!
19874  \*********************************************/
19875/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
19876
19877"use strict";
19878__webpack_require__.r(__webpack_exports__);
19879/* harmony export */ __webpack_require__.d(__webpack_exports__, {
19880/* harmony export */   "default": function() { return /* export default binding */ __WEBPACK_DEFAULT_EXPORT__; }
19881/* harmony export */ });
19882/* harmony import */ var _sygnas_jp_social_share__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @sygnas/jp-social-share */ "./node_modules/@sygnas/jp-social-share/dist/es6/index.js");
19883
19884
19885/* harmony default export */ function __WEBPACK_DEFAULT_EXPORT__() {
19886  _sygnas_jp_social_share__WEBPACK_IMPORTED_MODULE_0__["default"].setShareButton(".js-share-button");
19887}
19888
19889
19890/***/ }),
19891
19892/***/ "./src/js/pages/common/tabs.ts":
19893/*!*************************************!*\
19894  !*** ./src/js/pages/common/tabs.ts ***!
19895  \*************************************/
19896/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
19897
19898"use strict";
19899__webpack_require__.r(__webpack_exports__);
19900/* harmony export */ __webpack_require__.d(__webpack_exports__, {
19901/* harmony export */   "default": function() { return /* export default binding */ __WEBPACK_DEFAULT_EXPORT__; }
19902/* harmony export */ });
19903/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ "./node_modules/vue/dist/vue.esm-bundler.js");
19904/* harmony import */ var _sygnas_vue_tabs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @sygnas/vue-tabs */ "./node_modules/@sygnas/vue-tabs/dist/vue-tabs.es.js");
19905
19906
19907
19908/* harmony default export */ function __WEBPACK_DEFAULT_EXPORT__() {
19909  let target = "#app-tabs1";
19910  if (!$(target).length) {
19911    return;
19912  }
19913  const app = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createApp)({
19914    components: {
19915      VueTabs: _sygnas_vue_tabs__WEBPACK_IMPORTED_MODULE_1__.VueTabs,
19916      VueTabsContent: _sygnas_vue_tabs__WEBPACK_IMPORTED_MODULE_1__.VueTabsContent
19917    }
19918  });
19919  app.mount(target);
19920  target = "#app-tabs2";
19921  const tabControl = (0,_sygnas_vue_tabs__WEBPACK_IMPORTED_MODULE_1__.useTabControl)("tabGroup2");
19922  const app2 = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createApp)({
19923    components: {
19924      VueTabs: _sygnas_vue_tabs__WEBPACK_IMPORTED_MODULE_1__.VueTabs,
19925      VueTabsContent: _sygnas_vue_tabs__WEBPACK_IMPORTED_MODULE_1__.VueTabsContent
19926    },
19927    computed: {
19928      activeId() {
19929        return tabControl.activeId.value;
19930      }
19931    },
19932    methods: {
19933      changeTab() {
19934        tabControl.setActiveId("tabB");
19935      },
19936      prevTab() {
19937        tabControl.changePrevTab();
19938      },
19939      nextTab() {
19940        tabControl.changeNextTab();
19941      }
19942    },
19943    mounted() {
19944      tabControl.addChangeListener((ev) => {
19945      });
19946    }
19947  });
19948  app2.mount(target);
19949}
19950
19951
19952/***/ }),
19953
vendor: 725 bytes, lines 19954-19970
19954/***/ "./node_modules/is-touch-device/build/index.js":
19955/*!*****************************************************!*\
19956  !*** ./node_modules/is-touch-device/build/index.js ***!
19957  \*****************************************************/
19958/***/ (function(module, exports) {
19959
19960Object.defineProperty(exports, "__esModule", ({
19961  value: true
19962}));
19963exports["default"] = isTouchDevice;
19964function isTouchDevice() {
19965  return !!(typeof window !== 'undefined' && ('ontouchstart' in window || window.DocumentTouch && typeof document !== 'undefined' && document instanceof window.DocumentTouch)) || !!(typeof navigator !== 'undefined' && (navigator.maxTouchPoints || navigator.msMaxTouchPoints));
19966}
19967module.exports = exports['default'];
19968
19969/***/ }),
19970
vendor: 5,133 bytes, lines 19971-20163
19971/***/ "./node_modules/lazysizes/plugins/unveilhooks/ls.unveilhooks.js":
19972/*!**********************************************************************!*\
19973  !*** ./node_modules/lazysizes/plugins/unveilhooks/ls.unveilhooks.js ***!
19974  \**********************************************************************/
19975/***/ (function(module, exports, __webpack_require__) {
19976
19977var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*
19978This plugin extends lazySizes to lazyLoad:
19979background images, videos/posters and scripts
19980
19981Background-Image:
19982For background images, use data-bg attribute:
19983<div class="lazyload" data-bg="bg-img.jpg"></div>
19984
19985 Video:
19986 For video/audio use data-poster and preload="none":
19987 <video class="lazyload" preload="none" data-poster="poster.jpg" src="src.mp4">
19988 <!-- sources -->
19989 </video>
19990
19991 For video that plays automatically if in view:
19992 <video
19993	class="lazyload"
19994	preload="none"
19995	muted=""
19996	data-autoplay=""
19997	data-poster="poster.jpg"
19998	src="src.mp4">
19999</video>
20000
20001 Scripts:
20002 For scripts use data-script:
20003 <div class="lazyload" data-script="module-name.js"></div>
20004
20005
20006 Script modules using require:
20007 For modules using require use data-require:
20008 <div class="lazyload" data-require="module-name"></div>
20009*/
20010
20011(function(window, factory) {
20012	var globalInstall = function(){
20013		factory(window.lazySizes);
20014		window.removeEventListener('lazyunveilread', globalInstall, true);
20015	};
20016
20017	factory = factory.bind(null, window, window.document);
20018
20019	if( true && module.exports){
20020		factory(__webpack_require__(/*! lazysizes */ "./node_modules/lazysizes/lazysizes.js"));
20021	} else if (true) {
20022		!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! lazysizes */ "./node_modules/lazysizes/lazysizes.js")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),
20023		__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
20024		(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),
20025		__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
20026	} else {}
20027}(window, function(window, document, lazySizes) {
20028	/*jshint eqnull:true */
20029	'use strict';
20030	var bgLoad, regBgUrlEscape;
20031	var uniqueUrls = {};
20032
20033	if(document.addEventListener){
20034		regBgUrlEscape = /\(|\)|\s|'/;
20035
20036		bgLoad = function (url, cb){
20037			var img = document.createElement('img');
20038			img.onload = function(){
20039				img.onload = null;
20040				img.onerror = null;
20041				img = null;
20042				cb();
20043			};
20044			img.onerror = img.onload;
20045
20046			img.src = url;
20047
20048			if(img && img.complete && img.onload){
20049				img.onload();
20050			}
20051		};
20052
20053		addEventListener('lazybeforeunveil', function(e){
20054			if(e.detail.instance != lazySizes){return;}
20055
20056			var tmp, load, bg, poster;
20057			if(!e.defaultPrevented) {
20058
20059				var target = e.target;
20060
20061				if(target.preload == 'none'){
20062					target.preload = target.getAttribute('data-preload') || 'auto';
20063				}
20064
20065				if (target.getAttribute('data-autoplay') != null) {
20066					if (target.getAttribute('data-expand') && !target.autoplay) {
20067						try {
20068							target.play();
20069						} catch (er) {}
20070					} else {
20071						requestAnimationFrame(function () {
20072							target.setAttribute('data-expand', '-10');
20073							lazySizes.aC(target, lazySizes.cfg.lazyClass);
20074						});
20075					}
20076				}
20077
20078				tmp = target.getAttribute('data-link');
20079				if(tmp){
20080					addStyleScript(tmp, true);
20081				}
20082
20083				// handle data-script
20084				tmp = target.getAttribute('data-script');
20085				if(tmp){
20086					e.detail.firesLoad = true;
20087					load = function(){
20088						e.detail.firesLoad = false;
20089						lazySizes.fire(target, '_lazyloaded', {}, true, true);
20090					};
20091					addStyleScript(tmp, null, load);
20092				}
20093
20094				// handle data-require
20095				tmp = target.getAttribute('data-require');
20096				if(tmp){
20097					if(lazySizes.cfg.requireJs){
20098						lazySizes.cfg.requireJs([tmp]);
20099					} else {
20100						addStyleScript(tmp);
20101					}
20102				}
20103
20104				// handle data-bg
20105				bg = target.getAttribute('data-bg');
20106				if (bg) {
20107					e.detail.firesLoad = true;
20108					load = function(){
20109						target.style.backgroundImage = 'url(' + (regBgUrlEscape.test(bg) ? JSON.stringify(bg) : bg ) + ')';
20110						e.detail.firesLoad = false;
20111						lazySizes.fire(target, '_lazyloaded', {}, true, true);
20112					};
20113
20114					bgLoad(bg, load);
20115				}
20116
20117				// handle data-poster
20118				poster = target.getAttribute('data-poster');
20119				if(poster){
20120					e.detail.firesLoad = true;
20121					load = function(){
20122						target.poster = poster;
20123						e.detail.firesLoad = false;
20124						lazySizes.fire(target, '_lazyloaded', {}, true, true);
20125					};
20126
20127					bgLoad(poster, load);
20128
20129				}
20130			}
20131		}, false);
20132
20133	}
20134
20135	function addStyleScript(src, style, cb){
20136		if(uniqueUrls[src]){
20137			return;
20138		}
20139		var elem = document.createElement(style ? 'link' : 'script');
20140		var insertElem = document.getElementsByTagName('script')[0];
20141
20142		if(style){
20143			elem.rel = 'stylesheet';
20144			elem.href = src;
20145		} else {
20146			elem.onload = function(){
20147				elem.onerror = null;
20148				elem.onload = null;
20149				cb();
20150			};
20151			elem.onerror = elem.onload;
20152
20153			elem.src = src;
20154		}
20155		uniqueUrls[src] = true;
20156		uniqueUrls[elem.src || elem.href] = true;
20157		insertElem.parentNode.insertBefore(elem, insertElem);
20158	}
20159}));
20160
20161
20162/***/ }),
20163
vendor: 25,914 bytes, lines 20164-20420
20164/***/ "./node_modules/vue/dist/vue.esm-bundler.js":
20165/*!**************************************************!*\
20166  !*** ./node_modules/vue/dist/vue.esm-bundler.js ***!
20167  \**************************************************/
20168/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
20169
20170"use strict";
20171__webpack_require__.r(__webpack_exports__);
20172/* harmony export */ __webpack_require__.d(__webpack_exports__, {
20173/* harmony export */   BaseTransition: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.BaseTransition; },
20174/* harmony export */   BaseTransitionPropsValidators: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.BaseTransitionPropsValidators; },
20175/* harmony export */   Comment: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.Comment; },
20176/* harmony export */   DeprecationTypes: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.DeprecationTypes; },
20177/* harmony export */   EffectScope: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.EffectScope; },
20178/* harmony export */   ErrorCodes: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.ErrorCodes; },
20179/* harmony export */   ErrorTypeStrings: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.ErrorTypeStrings; },
20180/* harmony export */   Fragment: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.Fragment; },
20181/* harmony export */   KeepAlive: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.KeepAlive; },
20182/* harmony export */   ReactiveEffect: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.ReactiveEffect; },
20183/* harmony export */   Static: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.Static; },
20184/* harmony export */   Suspense: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.Suspense; },
20185/* harmony export */   Teleport: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.Teleport; },
20186/* harmony export */   Text: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.Text; },
20187/* harmony export */   TrackOpTypes: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.TrackOpTypes; },
20188/* harmony export */   Transition: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.Transition; },
20189/* harmony export */   TransitionGroup: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.TransitionGroup; },
20190/* harmony export */   TriggerOpTypes: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.TriggerOpTypes; },
20191/* harmony export */   VueElement: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.VueElement; },
20192/* harmony export */   assertNumber: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.assertNumber; },
20193/* harmony export */   callWithAsyncErrorHandling: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.callWithAsyncErrorHandling; },
20194/* harmony export */   callWithErrorHandling: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.callWithErrorHandling; },
20195/* harmony export */   camelize: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.camelize; },
20196/* harmony export */   capitalize: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.capitalize; },
20197/* harmony export */   cloneVNode: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.cloneVNode; },
20198/* harmony export */   compatUtils: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.compatUtils; },
20199/* harmony export */   compile: function() { return /* binding */ compileToFunction; },
20200/* harmony export */   computed: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.computed; },
20201/* harmony export */   createApp: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.createApp; },
20202/* harmony export */   createBlock: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.createBlock; },
20203/* harmony export */   createCommentVNode: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode; },
20204/* harmony export */   createElementBlock: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.createElementBlock; },
20205/* harmony export */   createElementVNode: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.createElementVNode; },
20206/* harmony export */   createHydrationRenderer: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.createHydrationRenderer; },
20207/* harmony export */   createPropsRestProxy: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.createPropsRestProxy; },
20208/* harmony export */   createRenderer: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.createRenderer; },
20209/* harmony export */   createSSRApp: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.createSSRApp; },
20210/* harmony export */   createSlots: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.createSlots; },
20211/* harmony export */   createStaticVNode: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.createStaticVNode; },
20212/* harmony export */   createTextVNode: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.createTextVNode; },
20213/* harmony export */   createVNode: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.createVNode; },
20214/* harmony export */   customRef: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.customRef; },
20215/* harmony export */   defineAsyncComponent: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.defineAsyncComponent; },
20216/* harmony export */   defineComponent: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.defineComponent; },
20217/* harmony export */   defineCustomElement: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.defineCustomElement; },
20218/* harmony export */   defineEmits: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.defineEmits; },
20219/* harmony export */   defineExpose: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.defineExpose; },
20220/* harmony export */   defineModel: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.defineModel; },
20221/* harmony export */   defineOptions: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.defineOptions; },
20222/* harmony export */   defineProps: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.defineProps; },
20223/* harmony export */   defineSSRCustomElement: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.defineSSRCustomElement; },
20224/* harmony export */   defineSlots: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.defineSlots; },
20225/* harmony export */   devtools: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.devtools; },
20226/* harmony export */   effect: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.effect; },
20227/* harmony export */   effectScope: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.effectScope; },
20228/* harmony export */   getCurrentInstance: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.getCurrentInstance; },
20229/* harmony export */   getCurrentScope: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.getCurrentScope; },
20230/* harmony export */   getTransitionRawChildren: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.getTransitionRawChildren; },
20231/* harmony export */   guardReactiveProps: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.guardReactiveProps; },
20232/* harmony export */   h: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.h; },
20233/* harmony export */   handleError: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.handleError; },
20234/* harmony export */   hasInjectionContext: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.hasInjectionContext; },
20235/* harmony export */   hydrate: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.hydrate; },
20236/* harmony export */   initCustomFormatter: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.initCustomFormatter; },
20237/* harmony export */   initDirectivesForSSR: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.initDirectivesForSSR; },
20238/* harmony export */   inject: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.inject; },
20239/* harmony export */   isMemoSame: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.isMemoSame; },
20240/* harmony export */   isProxy: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.isProxy; },
20241/* harmony export */   isReactive: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.isReactive; },
20242/* harmony export */   isReadonly: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.isReadonly; },
20243/* harmony export */   isRef: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.isRef; },
20244/* harmony export */   isRuntimeOnly: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.isRuntimeOnly; },
20245/* harmony export */   isShallow: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.isShallow; },
20246/* harmony export */   isVNode: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.isVNode; },
20247/* harmony export */   markRaw: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.markRaw; },
20248/* harmony export */   mergeDefaults: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.mergeDefaults; },
20249/* harmony export */   mergeModels: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.mergeModels; },
20250/* harmony export */   mergeProps: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.mergeProps; },
20251/* harmony export */   nextTick: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.nextTick; },
20252/* harmony export */   normalizeClass: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.normalizeClass; },
20253/* harmony export */   normalizeProps: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.normalizeProps; },
20254/* harmony export */   normalizeStyle: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.normalizeStyle; },
20255/* harmony export */   onActivated: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.onActivated; },
20256/* harmony export */   onBeforeMount: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.onBeforeMount; },
20257/* harmony export */   onBeforeUnmount: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.onBeforeUnmount; },
20258/* harmony export */   onBeforeUpdate: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.onBeforeUpdate; },
20259/* harmony export */   onDeactivated: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.onDeactivated; },
20260/* harmony export */   onErrorCaptured: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.onErrorCaptured; },
20261/* harmony export */   onMounted: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.onMounted; },
20262/* harmony export */   onRenderTracked: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.onRenderTracked; },
20263/* harmony export */   onRenderTriggered: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.onRenderTriggered; },
20264/* harmony export */   onScopeDispose: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.onScopeDispose; },
20265/* harmony export */   onServerPrefetch: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.onServerPrefetch; },
20266/* harmony export */   onUnmounted: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.onUnmounted; },
20267/* harmony export */   onUpdated: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.onUpdated; },
20268/* harmony export */   openBlock: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.openBlock; },
20269/* harmony export */   popScopeId: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.popScopeId; },
20270/* harmony export */   provide: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.provide; },
20271/* harmony export */   proxyRefs: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.proxyRefs; },
20272/* harmony export */   pushScopeId: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.pushScopeId; },
20273/* harmony export */   queuePostFlushCb: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.queuePostFlushCb; },
20274/* harmony export */   reactive: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.reactive; },
20275/* harmony export */   readonly: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.readonly; },
20276/* harmony export */   ref: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.ref; },
20277/* harmony export */   registerRuntimeCompiler: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.registerRuntimeCompiler; },
20278/* harmony export */   render: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.render; },
20279/* harmony export */   renderList: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.renderList; },
20280/* harmony export */   renderSlot: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.renderSlot; },
20281/* harmony export */   resolveComponent: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.resolveComponent; },
20282/* harmony export */   resolveDirective: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.resolveDirective; },
20283/* harmony export */   resolveDynamicComponent: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.resolveDynamicComponent; },
20284/* harmony export */   resolveFilter: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.resolveFilter; },
20285/* harmony export */   resolveTransitionHooks: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.resolveTransitionHooks; },
20286/* harmony export */   setBlockTracking: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.setBlockTracking; },
20287/* harmony export */   setDevtoolsHook: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.setDevtoolsHook; },
20288/* harmony export */   setTransitionHooks: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.setTransitionHooks; },
20289/* harmony export */   shallowReactive: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.shallowReactive; },
20290/* harmony export */   shallowReadonly: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.shallowReadonly; },
20291/* harmony export */   shallowRef: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.shallowRef; },
20292/* harmony export */   ssrContextKey: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.ssrContextKey; },
20293/* harmony export */   ssrUtils: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.ssrUtils; },
20294/* harmony export */   stop: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.stop; },
20295/* harmony export */   toDisplayString: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.toDisplayString; },
20296/* harmony export */   toHandlerKey: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.toHandlerKey; },
20297/* harmony export */   toHandlers: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.toHandlers; },
20298/* harmony export */   toRaw: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.toRaw; },
20299/* harmony export */   toRef: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.toRef; },
20300/* harmony export */   toRefs: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.toRefs; },
20301/* harmony export */   toValue: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.toValue; },
20302/* harmony export */   transformVNodeArgs: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.transformVNodeArgs; },
20303/* harmony export */   triggerRef: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.triggerRef; },
20304/* harmony export */   unref: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.unref; },
20305/* harmony export */   useAttrs: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.useAttrs; },
20306/* harmony export */   useCssModule: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.useCssModule; },
20307/* harmony export */   useCssVars: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.useCssVars; },
20308/* harmony export */   useModel: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.useModel; },
20309/* harmony export */   useSSRContext: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.useSSRContext; },
20310/* harmony export */   useSlots: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.useSlots; },
20311/* harmony export */   useTransitionState: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.useTransitionState; },
20312/* harmony export */   vModelCheckbox: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.vModelCheckbox; },
20313/* harmony export */   vModelDynamic: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.vModelDynamic; },
20314/* harmony export */   vModelRadio: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.vModelRadio; },
20315/* harmony export */   vModelSelect: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.vModelSelect; },
20316/* harmony export */   vModelText: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.vModelText; },
20317/* harmony export */   vShow: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.vShow; },
20318/* harmony export */   version: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.version; },
20319/* harmony export */   warn: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.warn; },
20320/* harmony export */   watch: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.watch; },
20321/* harmony export */   watchEffect: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.watchEffect; },
20322/* harmony export */   watchPostEffect: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.watchPostEffect; },
20323/* harmony export */   watchSyncEffect: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.watchSyncEffect; },
20324/* harmony export */   withAsyncContext: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.withAsyncContext; },
20325/* harmony export */   withCtx: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.withCtx; },
20326/* harmony export */   withDefaults: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.withDefaults; },
20327/* harmony export */   withDirectives: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.withDirectives; },
20328/* harmony export */   withKeys: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.withKeys; },
20329/* harmony export */   withMemo: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.withMemo; },
20330/* harmony export */   withModifiers: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.withModifiers; },
20331/* harmony export */   withScopeId: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.withScopeId; }
20332/* harmony export */ });
20333/* harmony import */ var _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @vue/runtime-dom */ "./node_modules/@vue/runtime-dom/dist/runtime-dom.esm-bundler.js");
20334/* harmony import */ var _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @vue/runtime-dom */ "./node_modules/@vue/runtime-core/dist/runtime-core.esm-bundler.js");
20335/* harmony import */ var _vue_compiler_dom__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @vue/compiler-dom */ "./node_modules/@vue/compiler-dom/dist/compiler-dom.esm-bundler.js");
20336/* harmony import */ var _vue_shared__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @vue/shared */ "./node_modules/@vue/shared/dist/shared.esm-bundler.js");
20337/**
20338* vue v3.4.34
20339* (c) 2018-present Yuxi (Evan) You and Vue contributors
20340* @license MIT
20341**/
20342
20343
20344
20345
20346
20347
20348function initDev() {
20349  {
20350    (0,_vue_runtime_dom__WEBPACK_IMPORTED_MODULE_1__.initCustomFormatter)();
20351  }
20352}
20353
20354if (true) {
20355  initDev();
20356}
20357const compileCache = /* @__PURE__ */ new WeakMap();
20358function getCache(options) {
20359  let c = compileCache.get(options != null ? options : _vue_shared__WEBPACK_IMPORTED_MODULE_2__.EMPTY_OBJ);
20360  if (!c) {
20361    c = /* @__PURE__ */ Object.create(null);
20362    compileCache.set(options != null ? options : _vue_shared__WEBPACK_IMPORTED_MODULE_2__.EMPTY_OBJ, c);
20363  }
20364  return c;
20365}
20366function compileToFunction(template, options) {
20367  if (!(0,_vue_shared__WEBPACK_IMPORTED_MODULE_2__.isString)(template)) {
20368    if (template.nodeType) {
20369      template = template.innerHTML;
20370    } else {
20371       true && (0,_vue_runtime_dom__WEBPACK_IMPORTED_MODULE_1__.warn)(`invalid template option: `, template);
20372      return _vue_shared__WEBPACK_IMPORTED_MODULE_2__.NOOP;
20373    }
20374  }
20375  const key = template;
20376  const cache = getCache(options);
20377  const cached = cache[key];
20378  if (cached) {
20379    return cached;
20380  }
20381  if (template[0] === "#") {
20382    const el = document.querySelector(template);
20383    if ( true && !el) {
20384      (0,_vue_runtime_dom__WEBPACK_IMPORTED_MODULE_1__.warn)(`Template element not found or is empty: ${template}`);
20385    }
20386    template = el ? el.innerHTML : ``;
20387  }
20388  const opts = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_2__.extend)(
20389    {
20390      hoistStatic: true,
20391      onError:  true ? onError : 0,
20392      onWarn:  true ? (e) => onError(e, true) : 0
20393    },
20394    options
20395  );
20396  if (!opts.isCustomElement && typeof customElements !== "undefined") {
20397    opts.isCustomElement = (tag) => !!customElements.get(tag);
20398  }
20399  const { code } = (0,_vue_compiler_dom__WEBPACK_IMPORTED_MODULE_3__.compile)(template, opts);
20400  function onError(err, asWarning = false) {
20401    const message = asWarning ? err.message : `Template compilation error: ${err.message}`;
20402    const codeFrame = err.loc && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_2__.generateCodeFrame)(
20403      template,
20404      err.loc.start.offset,
20405      err.loc.end.offset
20406    );
20407    (0,_vue_runtime_dom__WEBPACK_IMPORTED_MODULE_1__.warn)(codeFrame ? `${message}
20408${codeFrame}` : message);
20409  }
20410  const render = new Function("Vue", code)(_vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__);
20411  render._rc = true;
20412  return cache[key] = render;
20413}
20414(0,_vue_runtime_dom__WEBPACK_IMPORTED_MODULE_1__.registerRuntimeCompiler)(compileToFunction);
20415
20416
20417
20418
20419/***/ }),
20420
vendor: 566 bytes, lines 20421-20430
20421/***/ "./node_modules/@fancyapps/ui/dist/index.esm.js":
20422/*!**************************************************************************************************!*\
20423  !*** delegated ./node_modules/@fancyapps/ui/dist/index.esm.js from dll-reference vendor_library ***!
20424  \**************************************************************************************************/
20425/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
20426
20427module.exports = (__webpack_require__(/*! dll-reference vendor_library */ "dll-reference vendor_library"))(197);
20428
20429/***/ }),
20430
vendor: 586 bytes, lines 20431-20440
20431/***/ "./node_modules/@sygnas/mediaquery/dist/es6/index.js":
20432/*!*******************************************************************************************************!*\
20433  !*** delegated ./node_modules/@sygnas/mediaquery/dist/es6/index.js from dll-reference vendor_library ***!
20434  \*******************************************************************************************************/
20435/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
20436
20437module.exports = (__webpack_require__(/*! dll-reference vendor_library */ "dll-reference vendor_library"))(240);
20438
20439/***/ }),
20440
vendor: 638 bytes, lines 20441-20450
20441/***/ "./node_modules/smooth-scroll/dist/smooth-scroll.polyfills.min.js":
20442/*!********************************************************************************************************************!*\
20443  !*** delegated ./node_modules/smooth-scroll/dist/smooth-scroll.polyfills.min.js from dll-reference vendor_library ***!
20444  \********************************************************************************************************************/
20445/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
20446
20447module.exports = (__webpack_require__(/*! dll-reference vendor_library */ "dll-reference vendor_library"))(496);
20448
20449/***/ }),
20450
vendor: 514 bytes, lines 20451-20460
20451/***/ "./node_modules/preloader/index.js":
20452/*!*************************************************************************************!*\
20453  !*** delegated ./node_modules/preloader/index.js from dll-reference vendor_library ***!
20454  \*************************************************************************************/
20455/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
20456
20457module.exports = (__webpack_require__(/*! dll-reference vendor_library */ "dll-reference vendor_library"))(625);
20458
20459/***/ }),
20460
vendor: 527 bytes, lines 20461-20469
20461/***/ "./node_modules/lazysizes/lazysizes.js":
20462/*!*****************************************************************************************!*\
20463  !*** delegated ./node_modules/lazysizes/lazysizes.js from dll-reference vendor_library ***!
20464  \*****************************************************************************************/
20465/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
20466
20467module.exports = (__webpack_require__(/*! dll-reference vendor_library */ "dll-reference vendor_library"))(879);
20468
20469/***/ })
vendor: 4,350 bytes, lines 20469-20578
20469,
20470
20471/***/ "dll-reference vendor_library":
20472/*!*********************************!*\
20473  !*** external "vendor_library" ***!
20474  \*********************************/
20475/***/ (function(module) {
20476
20477"use strict";
20478module.exports = vendor_library;
20479
20480/***/ })
20481
20482/******/ 	});
20483/************************************************************************/
20484/******/ 	// The module cache
20485/******/ 	var __webpack_module_cache__ = {};
20486/******/ 	
20487/******/ 	// The require function
20488/******/ 	function __webpack_require__(moduleId) {
20489/******/ 		// Check if module is in cache
20490/******/ 		var cachedModule = __webpack_module_cache__[moduleId];
20491/******/ 		if (cachedModule !== undefined) {
20492/******/ 			return cachedModule.exports;
20493/******/ 		}
20494/******/ 		// Create a new module (and put it into the cache)
20495/******/ 		var module = __webpack_module_cache__[moduleId] = {
20496/******/ 			// no module.id needed
20497/******/ 			// no module.loaded needed
20498/******/ 			exports: {}
20499/******/ 		};
20500/******/ 	
20501/******/ 		// Execute the module function
20502/******/ 		__webpack_modules__[moduleId](module, module.exports, __webpack_require__);
20503/******/ 	
20504/******/ 		// Return the exports of the module
20505/******/ 		return module.exports;
20506/******/ 	}
20507/******/ 	
20508/************************************************************************/
20509/******/ 	/* webpack/runtime/compat get default export */
20510/******/ 	!function() {
20511/******/ 		// getDefaultExport function for compatibility with non-harmony modules
20512/******/ 		__webpack_require__.n = function(module) {
20513/******/ 			var getter = module && module.__esModule ?
20514/******/ 				function() { return module['default']; } :
20515/******/ 				function() { return module; };
20516/******/ 			__webpack_require__.d(getter, { a: getter });
20517/******/ 			return getter;
20518/******/ 		};
20519/******/ 	}();
20520/******/ 	
20521/******/ 	/* webpack/runtime/define property getters */
20522/******/ 	!function() {
20523/******/ 		// define getter functions for harmony exports
20524/******/ 		__webpack_require__.d = function(exports, definition) {
20525/******/ 			for(var key in definition) {
20526/******/ 				if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
20527/******/ 					Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
20528/******/ 				}
20529/******/ 			}
20530/******/ 		};
20531/******/ 	}();
20532/******/ 	
20533/******/ 	/* webpack/runtime/global */
20534/******/ 	!function() {
20535/******/ 		__webpack_require__.g = (function() {
20536/******/ 			if (typeof globalThis === 'object') return globalThis;
20537/******/ 			try {
20538/******/ 				return this || new Function('return this')();
20539/******/ 			} catch (e) {
20540/******/ 				if (typeof window === 'object') return window;
20541/******/ 			}
20542/******/ 		})();
20543/******/ 	}();
20544/******/ 	
20545/******/ 	/* webpack/runtime/hasOwnProperty shorthand */
20546/******/ 	!function() {
20547/******/ 		__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }
20548/******/ 	}();
20549/******/ 	
20550/******/ 	/* webpack/runtime/make namespace object */
20551/******/ 	!function() {
20552/******/ 		// define __esModule on exports
20553/******/ 		__webpack_require__.r = function(exports) {
20554/******/ 			if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
20555/******/ 				Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
20556/******/ 			}
20557/******/ 			Object.defineProperty(exports, '__esModule', { value: true });
20558/******/ 		};
20559/******/ 	}();
20560/******/ 	
20561/************************************************************************/
20562var __webpack_exports__ = {};
20563// This entry need to be wrapped in an IIFE because it need to be in strict mode.
20564!function() {
20565"use strict";
20566/*!**************************!*\
20567  !*** ./src/js/common.js ***!
20568  \**************************/
20569__webpack_require__.r(__webpack_exports__);
20570/* harmony import */ var _pages_common__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./pages/common */ "./src/js/pages/common/index.ts");
20571
20572
20573(0,_pages_common__WEBPACK_IMPORTED_MODULE_0__["default"])();
20574
20575}();
20576/******/ })()
20577;
20578//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esa0JBQWtCLGtCQUFrQjtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7O0F
20578BRTZHO0FBQzdHOzs7Ozs7Ozs7Ozs7Ozs7OztBQ3RDNEo7O0FBRTVKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLG9GQUFlO0FBQ25COztBQUVBLEVBQUUsaUZBQVk7QUFDZDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsZUFBZSxRQUFRO0FBQ3ZCLGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHVEQUF1RDs7QUFFdkQ7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnRUFBZ0U7O0FBRWhFO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLFFBQVE7QUFDL0IsbUJBQW1CLFFBQVE7QUFDM0IsdUJBQXVCLFFBQVE7QUFDL0IsdUJBQXVCLFFBQVE7QUFDL0Isc0JBQXNCLFFBQVE7QUFDOUI7O0FBRUEsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7OztBQUdSLGlGQUFpRjtBQUNqRjtBQUNBO0FBQ0EsV0FBVzs7QUFFWDtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixRQUFRO0FBQy9CLG1CQUFtQixRQUFRO0FBQzNCLHVCQUF1QixRQUFRO0FBQy9CLHVCQUF1QixRQUFRO0FBQy9CLHNCQUFzQixRQUFRO0FBQzlCLGdCQUFnQixRQUFRO0FBQ3hCOztBQUVBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBUTs7O0FBR1I7QUFDQSx3REFBd0QsU0FBUztBQUNqRSwyREFBMkQsUUFBUTtBQUNuRTs7QUFFQSxtQ0FBbUMsU0FBUztBQUM1QyxtQ0FBbUMsUUFBUTtBQUMzQyxtQ0FBbUMsU0FBUztBQUM1QyxtQ0FBbUMsS0FBSztBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsUUFBUTtBQUMzQixnQkFBZ0IsUUFBUTtBQUN4Qjs7QUFFQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBLENBQUM7O0FBRUQsb0ZBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVELG9GQUFlOztBQUVmLG9GQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsNkNBQTZDLEtBQUssUUFBUSxTQUFTLE9BQU8sU0FBUyxXQUFXLFFBQVE7QUFDdEcscURBQXFELEtBQUs7QUFDMUQsZ0NBQWdDLFlBQVksS0FBSztBQUNqRCw2REFBNkQsS0FBSztBQUNsRSxxREFBcUQsS0FBSztBQUMxRCw2Q0FBNkMsS0FBSztBQUNsRCxxREFBcUQsS0FBSyxTQUFTLFNBQVM7QUFDNUU7QUFDQSxDQUFDOztBQUVtQztBQUNwQzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDdE1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxrQkFBa0Isa0JBQWtCO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTs7QUFFNkc7QUFDN0c7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDdEM0Sjs7QUFFNUo7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQzs7QUFFdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUM7O0FBRXJDO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLElBQUksb0ZBQWU7O0FBRW5CLElBQUksb0ZBQWU7O0FBRW5CLElBQUksb0ZBQWU7O0FBRW5CLElBQUksb0ZBQWU7O0FBRW5CLElBQUksb0ZBQWU7O0FBRW5CLElBQUksb0ZBQWU7O0FBRW5CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQztBQUNoQztBQUNBLHNDQUFzQztBQUN0QztBQUNBLHNDQUFzQztBQUN0QztBQUNBO0FBQ0EsT0FBTzs7QUFFUCxpREFBaUQ7O0FBRWpELHNEQUFzRDs7QUFFdEQsd0JBQXdCOztBQUV4QiwyQkFBMkI7O0FBRTNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0EsRUFBRSxpRkFBWTtBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsUUFBUTs7O0FBR1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxpREFBaUQ7O0FBRWpELCtGQUErRjs7QUFFL0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBLE9BQU8sR0FBRzs7QUFFVjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsbUhBQW1IO0FBQ25IOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUyxHQUFHOztBQUVaO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBLENBQUM7O0FBRXFDO0FBQ3RDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUM1S0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGtCQUFrQixrQkFBa0I7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBOztBQUU2RztBQUM3Rzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN0QzRKOztBQUU1SjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBLElBQUksb0ZBQWU7O0FBRW5CLElBQUksb0ZBQWU7O0FBRW5CLElBQUksb0ZBQWU7O0FBRW5CLElBQUksb0ZBQWU7O0FBRW5CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7OztBQUdBLEVBQUUsaUZBQVk7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0F
20578BRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDJDQUEyQzs7QUFFM0M7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxHQUFHOztBQUVIO0FBQ0EsQ0FBQzs7QUFFOEI7QUFDL0I7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN6SG1ROztBQUVuUTtBQUNBO0FBQ0Esb0NBQW9DLG9EQUFlO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxlQUFlO0FBQzlCO0FBQ0E7QUFDQSxpQkFBaUIsZUFBZTtBQUNoQztBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EscUJBQXFCLDZDQUFRO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0MsOENBQVMsSUFBSSx1REFBa0I7QUFDL0Q7QUFDQSxlQUFlLG1EQUFjO0FBQzdCLE9BQU87QUFDUCxRQUFRLHVEQUFrQjtBQUMxQjtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsbURBQWM7QUFDL0IseUJBQXlCLDBDQUFLO0FBQzlCO0FBQ0EsU0FBUztBQUNULFVBQVUsK0NBQVU7QUFDcEI7QUFDQSxnQkFBZ0IsOENBQVMsSUFBSSx1REFBa0I7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLG1EQUFjO0FBQzdCLHVCQUF1QiwwQ0FBSztBQUM1QjtBQUNBLE9BQU87QUFDUCxRQUFRLCtDQUFVO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBLGtCQUFrQix3Q0FBRztBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLDZDQUFRO0FBQzdCO0FBQ0EsS0FBSztBQUNMLHdCQUF3Qiw2Q0FBUTtBQUNoQztBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxrREFBa0QsbUJBQW1CO0FBQ3JFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksMENBQUs7QUFDVDtBQUNBLG1EQUFtRCx3QkFBd0I7QUFDM0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQSxvQ0FBb0Msb0RBQWU7QUFDbkQ7QUFDQTtBQUNBLGVBQWUsYUFBYTtBQUM1QjtBQUNBLGVBQWUsK0JBQStCO0FBQzlDLGlCQUFpQiwrQkFBK0I7QUFDaEQ7QUFDQSxrQkFBa0IsZUFBZTtBQUNqQyxpQkFBaUIsc0JBQXNCO0FBQ3ZDLGlCQUFpQiw0QkFBNEI7QUFDN0MsaUJBQWlCO0FBQ2pCLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSw4Q0FBUztBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsSUFBSSxnREFBVztBQUNmO0FBQ0EsS0FBSztBQUNMO0FBQ0EsYUFBYSw4Q0FBUyxJQUFJLGdEQUFXLENBQUMsNERBQXVCO0FBQzdELGVBQWUsbURBQWM7QUFDN0IsT0FBTztBQUNQLGlCQUFpQiw0Q0FBTztBQUN4QixXQUFXLDhDQUFTLFFBQVEsdURBQWtCLENBQUMseUNBQVEsUUFBUSwrQ0FBVTtBQUN6RSxtQkFBbUIsOENBQVMsSUFBSSxnREFBVztBQUMzQztBQUNBO0FBQ0EsMkJBQTJCLDBDQUFLO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYix1QkFBdUIsNENBQU87QUFDOUIsZ0JBQWdCLHVEQUFrQjtBQUNsQztBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0EsYUFBYTtBQUNiLFdBQVc7QUFDWDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxDQUFDOztBQUVELGtDQUFrQyxvREFBZTtBQUNqRDtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1gsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCLDBDQUFLLCtCQUErQiw4Q0FBUyxJQUFJLGdEQUFXLENBQUMsNERBQXVCLGVBQWUsUUFBUTtBQUN4SSxpQkFBaUIsNENBQU87QUFDeEIsVUFBVSwrQ0FBVTtBQUNwQjtBQUNBO0FBQ0EsT0FBTyxLQUFLLHVEQUFrQjtBQUM5QjtBQUNBO0FBQ0EsQ0FBQzs7QUFFNkU7QUFDOUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDNU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDOE07QUFDOUo7O0FBRWhELHdCQUF3QixLQUF5QyxnQkFBZ0IsQ0FBRTtBQUNuRix3QkFBd0IsS0FBeUMsZ0JBQWdCLENBQUU7QUFDbkYsd0JBQXdCLEtBQXlDLGdCQUFnQixDQUFFO0FBQ25GLDBCQUEwQixLQUF5QyxpQkFBaUIsQ0FBRTtBQUN0RiwrQkFBK0IsS0FBeUMsc0JBQXNCLENBQUU7QUFDaEcsMEJBQTBCLEtBQXlDLGlCQUFpQixDQUFFO0FBQ3RGLDRCQUE0QixLQUF5QyxtQkFBbUIsQ0FBRTtBQUMxRixvQ0FBb0MsS0FBeUMsMEJBQTBCLENBQUU7QUFDekcsNEJBQTRCLEtBQXlDLG1CQUFtQixDQUFFO0FBQzFGLG9DQUFvQyxLQUF5QywwQkFBMEIsQ0FBRTtBQUN6Ryw4QkFBOEIsS0FBeUMsMEJBQTBCLENBQUU7QUFDbkcsMkJBQTJCLEtBQXlDLHVCQUF1QixDQUFFO0FBQzdGLDZCQUE2QixLQUF5Qyx5QkFBeUIsQ0FBRTtBQUNqRyxpQ0FBaUMsS0FBeUMsd0JBQXdCLENBQUU7QUFDcEc7QUFDQSxFQUFFLEtBQXlDLCtCQUErQixDQUFFO0FBQzVFO0FBQ0EsaUNBQWlDLEtBQXlDLHdCQUF3QixDQUFFO0FBQ3BHLDhCQUE4QixLQUF5QyxxQkFBcUIsQ0FBRTtBQUM5RiwrQkFBK0IsS0FBeUMsc0JBQXNCLENBQUU7QUFDaEcsMkJBQTJCLEtBQXlDLGtCQUFrQixDQUFFO0FBQ3hGLDJCQUEyQixLQUF5QyxrQkFBa0IsQ0FBRTtBQUN4Riw0QkFBNEIsS0FBeUMsbUJBQW1CLENBQUU7QUFDMUYsaUNBQWlDLEtBQXlDLHVCQUF1QixDQUFFO0FBQ25HLDJCQUEyQixLQUF5QyxrQkFBa0IsQ0FBRTtBQUN4RiwrQkFBK0IsS0FBeUMsc0JBQXNCLENBQUU
205787QUFDaEcsK0JBQStCLEtBQXlDLHNCQUFzQixDQUFFO0FBQ2hHLCtCQUErQixLQUF5QyxzQkFBc0IsQ0FBRTtBQUNoRyxvQ0FBb0MsS0FBeUMsMEJBQTBCLENBQUU7QUFDekcsMkJBQTJCLEtBQXlDLGtCQUFrQixDQUFFO0FBQ3hGLHdCQUF3QixLQUF5QyxnQkFBZ0IsQ0FBRTtBQUNuRiwwQkFBMEIsS0FBeUMsa0JBQWtCLENBQUU7QUFDdkYsOEJBQThCLEtBQXlDLG9CQUFvQixDQUFFO0FBQzdGLGtDQUFrQyxLQUF5Qyx3QkFBd0IsQ0FBRTtBQUNyRyw2QkFBNkIsS0FBeUMsbUJBQW1CLENBQUU7QUFDM0YsNEJBQTRCLEtBQXlDLGtCQUFrQixDQUFFO0FBQ3pGLHdCQUF3QixLQUF5QyxlQUFlLENBQUU7QUFDbEYscUJBQXFCLEtBQXlDLGFBQWEsQ0FBRTtBQUM3RSxzQkFBc0IsS0FBeUMsYUFBYSxDQUFFO0FBQzlFLHlCQUF5QixLQUF5QyxnQkFBZ0IsQ0FBRTtBQUNwRiw0QkFBNEIsS0FBeUMsa0JBQWtCLENBQUU7QUFDekY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsK0JBQStCO0FBQzFDLFNBQVMsK0JBQStCO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMscURBQVE7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLHFEQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDLDZCQUE2QjtBQUM3RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixnQkFBZ0I7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDLFFBQVE7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCO0FBQzNCLFVBQVUsSUFBa0Q7QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxXQUFXLEtBQWtEO0FBQzdEO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOLFdBQVcsS0FBa0Q7QUFDN0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSxVQUFVLEtBQWtEO0FBQ2xFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsVUFBVSxJQUFrRDtBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSxVQUFVLEtBQWtEO0FBQ2xFO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsTUFBTSx3UkFBd1I7QUFDOVI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxpSEFBaUgsSUFBSSx5Q0FBeUMsSUFBSTtBQUNsSztBQUNBLEd
20578BQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCLGNBQWM7QUFDN0M7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSxLQUF5QztBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVLGdCQUFnQjtBQUMxQiw4QkFBOEIsSUFBSSxJQUFJLDJEQUEyRCxFQUFFO0FBQ25HLGFBQWEsS0FBSyxPQUFPO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFLEtBQXlDLCtCQUErQixZQUFZO0FBQ3RGO0FBQ0E7QUFDQSxjQUFjLEtBQWtELG1FQUFtRSxDQUFxRDtBQUN4TDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0M7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLGlCQUFpQjtBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0IsNkNBQUk7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0Isd0JBQXdCO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLHVCQUF1QjtBQUN6QztBQUNBLGtEQUFrRCxxREFBUTtBQUMxRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLHVCQUF1QjtBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixxREFBUTtBQUN4QjtBQUNBLFNBQVMscURBQVE7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IscURBQVE7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixxREFBUTtBQUMvQjtBQUNBLElBQUk7QUFDSjtBQUNBLFNBQVMscURBQVE7QUFDakI7QU
20578FDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxLQUFLLEdBQUc7QUFDckI7QUFDQSxHQUFHLEVBQUU7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQix1QkFBdUI7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDLHFEQUFRO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVSxJQUF5QztBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLE1BQU07QUFDeEI7QUFDQSxhQUFhLDJDQUFFO0FBQ2YsWUFBWSwyQ0FBRTtBQUNkLG1CQUFtQiwyQ0FBRTtBQUNyQjtBQUNBO0FBQ0EsZUFBZSxhQUFvQjtBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixrQkFBa0I7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCLFFBQVE7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLGtCQUFrQjtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsU0FBUyxLQUFrRDtBQUMzRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLHNCQUFzQjtBQUM5QztBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRCw4QkFBOEIsZUFBZTtBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVLFVBQVU7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLG1EQUFNLEdBQUc7QUFDakMsTUFBTTtBQUNOLHdCQUF3QixtREFBTSxHQUFHO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVUsVUFBVTtBQUNwQjtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSxLQUF5QztBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLGtCQUFrQjtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSxLQUF5QztBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCLFlBQVk7QUFDMUM7QUFDQSxvQkFBb0Isa0JBQWtCO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLFlBQVk7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLGtCQUFrQjtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0Isa0JBQWtCO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QU
20578FDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsZ0JBQWdCO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLGdCQUFnQjtBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixnQkFBZ0I7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixtREFBTSxHQUFHO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNLElBQXlDO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVLFdBQVc7QUFDckI7QUFDQTtBQUNBO0FBQ0EsVUFBVSxXQUFXO0FBQ3JCO0FBQ0E7QUFDQSxrQkFBa0IscUJBQXFCO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTix1QkFBdUIsNEJBQTRCO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxSkFBcUosb0RBQU87QUFDNUo7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0IsZ0JBQWdCO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVLGdCQUFnQjtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLDBCQUEwQjtBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQix1QkFBdUI7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQix1QkFBdUI7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsMEJBQTBCO0FBQ2hEO0FBQ0EsWUFBWSxxREFBUSxXQUFXLHFEQUFRO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVUsSUFBeUM7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIscURBQVE7QUFDcEM7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksYUFBYTtBQUN6QixvQkFBb0IsdUJBQXVCO0FBQzNDLGNBQWMsYUFBYTtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQSx1QkFBdUIsNkNBQUk7QUFDM0Isb0JBQW9CLDZDQUFJO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixrREFBUztBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLHVEQUFVLENBQUMscURBQVE7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLGlCQUFpQixvQ0FBb0M7QUFDckQsS0FBSztBQUNMO0FBQ0EsVUFBVSxJQUF5QztBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsVUFBVSxLQUF5QztBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVUsS0FBeUM7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsbUJBQW1CLDZDQUFJO0FBQ3ZCO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsVUFBVSxxREFBUTtBQUNsQjtBQUNBO0FBQ0Esb0JBQW9CLHNCQUFzQjtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVLFNBQVM7QU
20578FDbkIsVUFBVSxXQUFXO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLHdCQUF3Qix1REFBYztBQUN0QyxRQUFRLEtBQXlDO0FBQ2pEO0FBQ0EsNEJBQTRCLHVEQUFjLE9BQU87QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUyw0QkFBNEI7QUFDckM7QUFDQSxRQUFRLHFEQUFRO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVUsaUJBQWlCO0FBQzNCO0FBQ0EsbUJBQW1CLDRCQUE0QjtBQUMvQztBQUNBO0FBQ0EsVUFBVSxvREFBTztBQUNqQjtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QiwyQkFBMkI7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixxREFBUTtBQUMxQjtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLGtCQUFrQjtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw4QkFBOEIsaUJBQWlCLEtBQUssaUJBQWlCO0FBQ3JFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLG1CQUFtQjtBQUNwQyxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQztBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsYUFBYSxHQUFHLFVBQVUsR0FBRztBQUNsRDtBQUNBO0FBQ0E7QUFDQSx1QkFBdUI7QUFDdkI7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLEVBQUUsdUNBQXVDO0FBQzFEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLGVBQWU7QUFDbkMsY0FBYyxrQkFBa0IsT0FBTyxFQUFFO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixFQUFFLGlCQUFpQjtBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DLDZCQUE2QjtBQUNoRTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsbUJBQW1CO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsMEJBQTBCLElBQUksU0FBUyxHQUFHLG1CQUFtQixFQUFFLG1DQUFtQyxHQUFHLGdCQUFnQjtBQUNwSTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVSx1Q0FBdUM7QUFDakQ7QUFDQSxrQkFBa0IsbUJBQW1CO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQixPQUFPLElBQUksR0FBRztBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUyxxREFBUTtBQUNqQjtBQUNBO0FBQ0EseUNBQXlDLEtBQXlDLHNCQUFzQixvREFBTztBQUMvRztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVUsZ0JBQWdCO0FBQzFCLGtCQUFrQixrQkFBa0I7QUFDcEM7QUFDQSxRQUFRLHFEQUFRO0FBQ2hCO0FBQ0EsTUFBTSxTQUFTLG9EQUFPO0FBQ3RCO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNLHFEQUFRO0FBQ2Q7QUFDQTtBQUNBO0FBQ0EsTUFBTSxxREFBUTtBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSxLQUF5QztBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVLElBQXlDO0FBQ25ELHNEQUFzRCxVQUFVO0FBQ2hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVUsb0JBQW9CO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVSxxQkFBcUI7QUFDL0I7QUFDQSxVQUFVLDBCQUEwQjtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQiwwQkFBMEI7QUFDNUM7QUFDQSxRQUFRLHFEQUFRO0F
20578BQ2hCO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVLE9BQU87QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLElBQUk7QUFDSixhQUFhLGFBQWE7QUFDMUI7QUFDQTtBQUNBO0FBQ0EsVUFBVSxxQkFBcUI7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPLHVCQUF1QixHQUFHLDZCQUE2QjtBQUM5RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVSxxQkFBcUI7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLFFBQVEsSUFBeUM7QUFDakQ7QUFDQSw2Q0FBNkMsdURBQWMsYUFBYTtBQUN4RSxRQUFRO0FBQ1Isc0NBQXNDLHVEQUFjLCtEQUErRCx1REFBYztBQUNqSSw2Q0FBNkMsV0FBVztBQUN4RDtBQUNBLE1BQU0sS0FBSyxFQUVOO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsbUJBQW1CLEdBQUcsOEJBQThCO0FBQ2pFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVSxxQkFBcUI7QUFDL0IsaUJBQWlCLHFEQUFRO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVLGtDQUFrQztBQUM1QyxVQUFVLGFBQWE7QUFDdkI7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBLDhDQUE4QyxLQUF5QztBQUN2RixzQkFBc0IsT0FBTztBQUM3QjtBQUNBLGtCQUFrQix1QkFBdUI7QUFDekMsWUFBWSxhQUFhO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0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tBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsS0FBeUMsY0FBYyxDQUFJO0FBQ25FO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVUsU0FBUztBQUNuQjtBQUNBO0FBQ0E7QUFDQSxTQUFTLFNBQVM7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVUsV0FBVztBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLDBCQUEwQix1REFBYztBQUN4QyxVQUFVLEtBQXlDO0FBQ25EO0FBQ0EsOEJBQThCLHVEQUFjLE9BQU87QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QU
20578FDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFVBQVUsaUJBQWlCO0FBQzNCO0FBQ0EsUUFBUSxNQUFNO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0oscUJBQXFCLGFBQWE7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IscURBQVE7QUFDOUIsUUFBUTtBQUNSLHlCQUF5QiwrQkFBK0IsR0FBRyxZQUFZO0FBQ3ZFO0FBQ0EsTUFBTTtBQUNOLDhCQUE4QiwrQkFBK0I7QUFDN0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixxREFBUTtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ04seUJBQXlCLE9BQU8sR0FBRyxFQUFFLGFBQWE7QUFDbEQ7QUFDQSxJQUFJO0FBQ0osNkJBQTZCLE9BQU87QUFDcEM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFlBQVksdUJBQXVCO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsV0FBVztBQUMzQixhQUFhLEtBQWtEO0FBQy9EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0EsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVSw0Q0FBNEM7QUFDdEQsVUFBVSw0QkFBNEI7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU0sSUFBaUQ7QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0IsbUJBQW1CO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsb0JBQW9CO0FBQ2xDLGNBQWMsb0NBQW9DO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVLGdCQUFnQjtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxXQUFXO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixxQkFBcUI7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSx1Q0FBdUM7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLEtBQXlDLFVBQVUsc0RBQWEsWUFBWSxNQUFNLENBQUU7QUFDMUc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLHFCQUFxQjtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxhQUFhO0FBQ3pCO0FBQ0EsMkVBQTJFLElBQUk7QUFDL0UsK0JBQStCLHFEQUFRO0F
20578BQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxLQUF5QztBQUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLHlCQUF5QjtBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLE1BQU07QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVUsaUNBQWlDO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QU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UNBO0FBQ0E7QUFDQSxxQ0FBcUMseUJBQXlCLEdBQUc7QUFDakU7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFdBQVc7QUFDWCx3QkFBd0Isc0RBQVMsU0FBUyxxREFBUSxTQUFTLHdEQUFXO0FBQ3RFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsMEVBQXNCO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLDZEQUFnQjtBQUNyQyxTQUFTLDBFQUFzQjtBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxTQUFTLHVFQUFtQjtBQUM1QjtBQUNBO0FBQ0EsSUFBSSxLQUFrRCxzQkFBc0IsQ0FBTTtBQUNsRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsVUFBVSxXQUFXO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSx3RUFBb0I7Q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UFTLCtEQUFXO0FBQ3BCO0FBQ0EsSUFBSSxtREFBTSxHQUFHO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQixtREFBTTtBQUNqQyxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLHFDQUFxQztBQUNyQyxTQUFTLDZEQUFTLFdBQVcsbURBQU0sR0FBRztBQUN0Qzs7QUFFd1Q7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDeGZ4VDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ2tLOztBQUVsSztBQUNBLDZCQUE2QixJQUFJO0FBQ2pDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLE1BQU0sU0FBUyxJQUF5QztBQUN4RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDLE9BQU87QUFDbEQ7QUFDQTtBQUNBLDRDQUE0QyxPQUFPO0FBQ25EO0FBQ0E7QUFDQTtBQUNBLDRDQUE0QyxPQUFPO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLFNBQVMsSUFBeUM7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixzQkFBc0I7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDLHlCQUF5QjtBQUMvRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUMsNkNBQUk7QUFDN0M7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsSUFBSSxtREFBTTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxRQUFRLElBQXlDO0FBQ2pELGlFQUFpRSxtREFBTSxHQUFHLGlCQUFpQjtBQUMzRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVSxJQUF5QztBQUNuRCxxRUFBcUUsbURBQU0sR0FBRyxpQkFBaUI7QUFDL0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDJCQUEyQixLQUF5QyxlQUFlLENBQUU7QUFDckYsbUNBQW1DLEtBQXlDLHVCQUF1QixDQUFFO0FBQ3JHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSxLQUF5QztBQUMvQztBQUNBO0FBQ0E7QUFDQSxRQUFRLEVBQUUsQ0FBTTtBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSw2QkFBNkIsb0RBQU87QUFDeEM7QUFDQTtBQUNBLGdDQUFnQyxxREFBUTtBQUN4QztBQUNBO0FBQ0EsS0FBSztBQUNMLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxvREFBTztBQUNwQjtBQUNBLGNBQWMsa0RBQUs7QUFDbkI7QUFDQTtBQUNBLFVBQVUsU0FBUyx5REFBWTtBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsb0RBQU87QUFDcEI7QUFDQSxjQUFjLGtEQUFLO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLGtEQUFLO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLEtBQXlDO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVUsRUFBRSxDQUFNO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSwyQ0FBMkMsb0RBQU87QUFDbEQ7QUFDQSwrSUFBK0ksaURBQVE7QUFDdko7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUMsT0FBTztBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBLEd
20578BQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsT0FBTyxxREFBUTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCLG9EQUFPO0FBQ2pDO0FBQ0EsMkJBQTJCLG1EQUFNO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSxxREFBUTtBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEIseURBQVk7QUFDMUM7QUFDQSxRQUFRLHFEQUFRO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLG9EQUFPO0FBQ2xCO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixvREFBTyxZQUFZLHlEQUFZLHNDQUFzQyxtREFBTTtBQUM5RjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsU0FBUyx1REFBVTtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsbURBQU07QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUyxxREFBUTtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSxvREFBTztBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsSUFBeUM7QUFDakQ7QUFDQSxpQ0FBaUMsWUFBWTtBQU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BQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0osa0JBQWtCLGFBQWE7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsYUFBYTtBQUNuQztBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSxJQUFrRTtBQUMxRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxNQUFNLCtEQUFrQjtBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxLQUF5QztBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQix1QkFBdUI7QUFDekMsc0NBQXNDLGtEQUFTO0FBQy9DO0FBQ0EsVUFBVSx1REFBVTtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IscUJBQXFCO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU0sOERBQWE7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSw4REFBYTtBQUNuQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixPQUFPO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixLQUF5QztBQUN6RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixLQUEwQyxFQUFFLEVBQU07QUFDbEU7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLHNEQUFLO0FBQzVCLGNBQWMsT0FBTztBQUNyQixVQUFVLEtBQXlDO0FBQ25ELDZDQUE2QyxLQUFLO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVUsZ0JBQWdCO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsb0RBQU87QUFDZjtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QU
20578FDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSxLQUF5QztBQUMvQztBQUNBO0FBQ0EsVUFBVSxzQkFBc0I7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsdURBQVU7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IscUJBQXFCO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOLGlEQUFpRCxLQUFLO0FBQ3REO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixnQkFBZ0I7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLHVEQUFVO0FBQ25CO0FBQ0E7QUFDQSwyQkFBMkIsbURBQU0sR0FBRyxvQkFBb0Isa0JBQWtCLGdCQUFnQjtBQUMxRjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSx1REFBVTtBQUNoQixlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxRQUFRO0FBQ1I7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxVQUFVLEtBQXlDO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVSxLQUF5QyxhQUFhLHFEQUFRLFdBQVcsdURBQVU7QUFDN0YsZ0VBQWdFLEtBQUs7QUFDckU7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWCxTQUFTO0FBQ1Q7QUFDQSxxQkFBcUIsb0RBQUc7QUFDeEIsb0JBQW9CLG9EQUFHO0FBQ3ZCLHNCQUFzQixvREFBRztBQUN6QjtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlEQUFpRCxRQUFRO0FBQ3pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxXQUFXO0FBQ1gsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxVQUFVLGlDQUFpQztBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxpQkFBaUIsT0FBTztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSxJQUFrRTtBQUMxRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVUsMkRBQWM7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxVQUFVLElBQWtFO0FBQzVFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVSwyREFBYztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsVUFBVSxJQUFrRTtBQUM1RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLG9CQUFvQjtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxJQUF5QztBQUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpRUFBaUU7QUFDakU7QUFDQSxjQUFjLHdCQUF3QjtB
20578QUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU0sb0RBQU87QUFDYjtBQUNBLElBQUksU0FBUyxxREFBUTtBQUNyQjtBQUNBLElBQUksU0FBUyxxREFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLG1EQUFNO0FBQ1YsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNLDhEQUFhO0FBQ25CO0FBQ0E7QUFDQTtBQUNBLE1BQU0sOERBQWE7QUFDbkI7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxJQUFJLFNBQVMsSUFBeUM7QUFDdEQsb0JBQW9CLHlEQUFZO0FBQ2hDO0FBQ0EsU0FBUyxTQUFTO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU0scURBQVE7QUFDZDtBQUNBLEl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SxrQ0FBa0MsSUFBSTtBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU0sb0RBQU8sT0FBTyxvREFBTztBQUMzQixTQUFTLG1EQUFNLEdBQUc7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNLEtBQXlDO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU0sc0RBQVM7QUFDZjtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLE1BQU0sWUFBWSxJQUFJLDBCQUEwQixXQUFXO0FBQzNFLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0osbUNBQW1DLEtBQXlDLDhCQUE4QixDQUFJO0FBQzlHLE1BQU0sSUFBeUM7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVLHVEQUFVO0FBQ3BCLFlBQVksSUFBeUM7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWCxVQUFVLEtBQUssRUFFTjtBQUNULFlBQVksSUFBeUM7QUFDckQ7QUFDQTtBQUNBLFFBQVEsU0FBUyxJQUF5QztBQUMxRDtBQUNBLHFCQUFxQixJQUFJLGNBQWMscUJBQXFCO0FBQzVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Q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E7QUFDQSxVQUFVLFNBQVMsSUFBb0Y7QUFDdkcsc0RBQXNELFlBQVk7QUFDbEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxzREFBc0Q7QUFDbEU7QUFDQSxRQUFRLElBQTJFO0FBQ25GO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLEtBQW9GO0FBQ25HO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsV0FBVyxLQUFvRjtBQUMvRjtBQUNBO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUIsMEJBQTBCLGVBQWU7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxJQUF5STtBQUNySjtBQUNBLGlCQUFpQixLQUFvRjtBQUNyRztBQUNBO0FBQ0E7QUFDQTtBQUNBLG9GQUFvRixpREFBSSxVQUFVLDJEQUFjO0FBQ2hIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVSxLQUFLLEVBV047QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QU
20578FDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsT0FBTztBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQSxRQUFRO0FBQ1IsYUFBYSxLQUFvRjtBQUNqRztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLHFDQUFxQztBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSyxLQUFvRjtBQUN6RjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSwyREFBYztBQUM3QjtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQSxlQUFlLHFEQUFRLDhCQUE4QiwyREFBYyxDQUFDLDJEQUFjO0FBQ2xGO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixhQUFhO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLHFDQUFxQywyREFBYyx1Q0FBdUMsMERBQWEsU0FBUyw0REFBZTtBQUNuSSxRQUFRLDBEQUFhO0FBQ3JCO0FBQ0EsaUJBQWlCLCtEQUFrQjtBQUNuQyxNQUFNO0FBQ047QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxpQkFBaUIsa0VBQXFCO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOERBQThELFlBQVksSUFBSSxFQUFFO0FBQ2hGLG9DQUFvQyxjQUFjO0FBQ2xEO0FBQ0EsMEJBQTBCO0FBQzFCLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQztBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQixJQUFJO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQixLQUFLLEdBQUcsYUFBYTtBQUMxQztBQUNBLE1BQU0sSUFBa0U7QUFDeEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixLQUFLLEdBQUcsYUFBYTtBQUNqRDtBQUNBO0FBQ0E7QUFDQSxVQUFVLDZDQUE2QyxJQUFJLEtBQUs7QUFDaEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSxJQUFrRTtBQUN4RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTSxLQUF3QyxFQUFFLEVBRzdDO0FBQ0gsTUFBTSxLQUEwQyxFQUFFLEVBRy9DO0FBQ0g7QUFDQSxJQUFJLEtBQXlDO0FBQzdDLElBQUksMERBQWE7QUFDakI7QUFDQSxNQUFNLEtBQXlDO0FBQy9DO0FBQ0E7QUFDQSxxQkFBcUIsa0JBQWtCLEVBQUUscUJBQXFCLEVBQUUsc0JBQXNCOztBQUV0RjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLDBEQUFhO0FBQzlCO0FBQ0EsTUFBTSxJQUFrRTtBQUN4RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyw2Q0FBSTtBQUNyQztBQUNBLElBQUk7QUFDSix1SkFBdUosS0FBeUM7QUFDaE07QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSx1QkFBdUI7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVLFNBQVMsSUFBeUM7QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVLFNBQVMsSUFBeUM7QUFDNUQsa0RBQWtELFlBQVk7QUFDOUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixZQUFZO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEIsWUFBWTtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLHFDQUFxQztBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0MsMkRBQWM7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLElBQWtFO0FBQzFFLE1BQU0sZ0RBQUc7QUFDVCxNQUFNLGdEQUFHO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQix5QkFBeUI7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVUsS0FBeUM7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLHFCQUFxQjtBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsSUFBa0U7QUFDMUU7QUFDQTtBQUNBLFVBQVUsbUNBQW1DO0FBQzdDO0FBQ0EsaUNBQWlDLGtEQUFTO0FBQzFDLGlDQUFpQyxrREFBUztBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLEtBQXlDO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVLElBQXlDO0FBQ25EO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCLDBCQUEwQjtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxvQkFBb0Isd0JBQXdCO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLGtEQUFTO0FBQ2hDO0FBQ0EsZUFBZSwyREFBYztBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLDJEQUFjO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVLGlFQUFpRTtBQUMzRSxRQUFRLEtBQXlDO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksSUFBeUM7QUFDckQ7QUFDQSxVQUFVLEtBQUssRUFhTjtBQUNULFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLEtBQXlDO0FBQ2pEO0FBQ0E7QUFDQSxRQUFRLElBQXlDO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVSxJQUF5QztBQUNuRDtBQUNBO0FBQ0E7QUFDQSxVQUFVLElBQXlDO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsSUFBeUM7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksSUFBeUM7QUFDckQ7QUFDQTtBQUNBO0FBQ0EsWUFBWSxJQUF5QztBQUNyRDtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QU
20578FDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLFlBQVk7QUFDNUIsZ0JBQWdCLGdCQUFnQjtBQUNoQztBQUNBO0FBQ0E7QUFDQSxVQUFVLDJEQUFjO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLElBQXlDO0FBQ3pEO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixJQUF5QztBQUN6RDtBQUNBO0FBQ0EsZ0JBQWdCLElBQXlDO0FBQ3pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixJQUF5QztBQUN6RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQSxVQUFVO0FBQ1YsY0FBYyxJQUF5QztBQUN2RDtBQUNBO0FBQ0E7QUFDQSxjQUFjLElBQXlDO0FBQ3ZEO0FBQ0E7QUFDQSxjQUFjLElBQXlDO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLElBQXlDO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksSUFBa0U7QUFDOUU7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSLGNBQWMsNkJBQTZCO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksSUFBeUM7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBLFVBQVUsMkRBQWM7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksSUFBeUM7QUFDckQ7QUFDQTtBQUNBO0FBQ0EsWUFBWSxJQUF5QztBQUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksSUFBeUM7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLElBQXlDO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksSUFBa0U7QUFDOUU7QUFDQTtBQUNBLFlBQVksSUFBeUM7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUMsMkRBQWM7QUFDdkQ7QUFDQSxNQUFNLDZDQUFJO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSxJQUF5QztBQUNqRCw2Q0FBNkMsMkRBQWM7QUFDM0QsK0NBQStDLDJEQUFjO0FBQzdEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSw4REFBYTtBQUNqQjtBQUNBLElBQUksOERBQWE7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksdUJBQXVCO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLGtEQUFTO0FBQ3hCLGVBQWUsa0RBQVM7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0Isa0JBQWtCO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLFNBQVM7QUFDNUI7QUFDQTtBQUNBLGNBQWMsS0FBeUM7QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLGlCQUFpQjtBQUNuQyxtQkFBbUIsU0FBUztBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWLHVCQUF1QixTQUFTO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0ZBQXNGLGtEQUFTO0FBQy9GO0FBQ0EsZ0NBQWdDLFFBQVE7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLDRDQUE0QztBQUN4RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLHFCQUFxQjtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1IsZ0JBQWdCLGdDQU
20578FnQztBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLFlBQVksK0JBQStCO0FBQzNDO0FBQ0EsVUFBVSxLQUF5QztBQUNuRDtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBLFNBQVM7QUFDVCxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxvQkFBb0I7QUFDbEM7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLEtBQXlDO0FBQ2pEO0FBQ0E7QUFDQSxZQUFZLHdDQUF3QztBQUNwRDtBQUNBO0FBQ0E7QUFDQSxNQUFNLDJEQUFjO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSxJQUFrRTtBQUMxRTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixxQkFBcUI7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQyxhQUFhO0FBQ2pEO0FBQ0E7QUFDQSx5QkFBeUIsZ0JBQWdCO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNLG9EQUFPLFNBQVMsb0RBQU87QUFDN0Isb0JBQW9CLGdCQUFnQjtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVUsS0FBeUM7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFNBQVM7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLGtCQUFrQjtBQUN0QztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNLEtBQXlDO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksS0FBeUMsR0FBRyxtREFBTSxHQUFHLGFBQWEsZUFBZSxJQUFJLENBQWlCO0FBQzFHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksS0FBeUMsR0FBRyxtREFBTSxHQUFHLGFBQWEsZUFBZSxJQUFJLENBQWlCO0FBQzFHO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSxLQUF5QyxLQUFLLHVEQUFVO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRSxFQUFFLGtEQUFTO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNLEtBQXlDO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSxLQUF5QztBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU0sc0RBQUs7QUFDWDtBQUNBLG1CQUFtQiwwREFBUztBQUM1QixJQUFJLFNBQVMsMkRBQVU7QUFDdkI7QUFDQTtBQUNBLElBQUksU0FBUyxvREFBTztBQUNwQjtBQUNBLHNDQUFzQywyREFBVSxPQUFPLDBEQUFTO0FBQ2hFO0FBQ0EsVUFBVSxzREFBSztBQUNmO0FBQ0EsUUFBUSxTQUFTLDJEQUFVO0FBQzNCO0FBQ0EsUUFBUSxTQUFTLHVEQUFVO0FBQzNCO0FBQ0EsUUFBUTtBQUNSLFFBQVEsS0FBeUM7QUFDakQ7QUFDQSxLQUFLO0FBQ0wsSUFBSSxTQUFTLHVEQUFVO0FBQ3ZCO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKLGFBQWEsNkNBQUk7QUFDakIsSUFBSSxLQUF5QztBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLDZDQUFJO0FBQ3BCO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOLGFBQWEsNkNBQUk7QUFDakI7QU
20578FDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkVBQTJFLHVEQUFVLG9CQUFvQix1REFBVTtBQUNuSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLDJEQUFjLFNBQVMsNkNBQUk7QUFDaEQsZ0JBQWdCLGdFQUFlO0FBQy9CO0FBQ0E7QUFDQTtBQUNBLE1BQU0sbURBQU07QUFDWjtBQUNBO0FBQ0EsTUFBTSxJQUF5QztBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixxREFBUTtBQUN6QjtBQUNBLE1BQU0sdURBQVU7QUFDaEI7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLDRCQUE0QjtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIscURBQVE7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU0sc0RBQUs7QUFDWDtBQUNBLElBQUksU0FBUyxvREFBTztBQUNwQixvQkFBb0Isa0JBQWtCO0FBQ3RDO0FBQ0E7QUFDQSxJQUFJLFNBQVMsa0RBQUssV0FBVyxrREFBSztBQUNsQztBQUNBO0FBQ0EsS0FBSztBQUNMLElBQUksU0FBUywwREFBYTtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHlDQUF5QyxrREFBUztBQ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CxzQkFBc0I7QUFDdEU7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxREFBcUQsc0JBQXNCO0FBQzNFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsS0FBeUM7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsS0FBeUM7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSxLQUF5QztBQUMvQztBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxTQUFTLEtBQXlDO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLHFCQUFxQjtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0EsY0FBYyxLQUF5QztBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQThDLGlEQUFJO0FBQ2xELHVCQUF1QjtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsNERBQWU7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVSxzREFBc0Q7QUFDaEUsVUFBVSxzREFBc0Q7QUFDaEU7QUFDQSxNQUFNLEtBQXlDO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxzQkFBc0IseUJBQXlCO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLHFCQUFxQjtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQixlQUFlO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7O0F
20578BRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU0sdURBQVU7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBLHlHQUF5Ryw0QkFBNEIsaUJBQWlCO0FBQ3RKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVLHlEQUF5RDtBQUNuRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0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DYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQSxJQUFJLFNBQVMsaURBQUk7QUFDakIsU0FBUyw0REFBZTtBQUN4QjtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0MsdURBQVU7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUIscURBQVE7QUFDakM7QU
20578FDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZSxrRUFBZTtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0I7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ04sVUFBVSxLQUF5QztBQUNuRCxRQUFRLHVEQUFJO0FBQ1o7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCLGNBQWM7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSwyREFBUTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLDRCQUE0QjtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsNkJBQTZCLGtCQUFrQjtBQUMvQztBQUNBLGNBQWMsZ0JBQWdCO0FBQzlCO0FBQ0Esb0JBQW9CLG9EQUFPO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLHFEQUFRO0FBQ3pDO0FBQ0EsaUZBQWlGLHFEQUFVO0FBQzNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxRQUFRO0FBQ3BCLDZCQUE2QixvREFBTyx5Q0FBeUM7QUFDN0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJDQUEyQyxpREFBVTtBQUNyRDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQ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UFDQTtBQUNBLFVBQVUsZUFBZTtBQUN6QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFNBQVMsb0RBQU8sa0JBQWtCLDJEQUFjO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLGFBQWEsc0JBQXNCO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQiwwREFBYTtBQUNoQztBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxnQkFBZ0IsT0FBTztBQUN2QjtBQUNBLEdBQUc7QUFDSCxxQkFBcUIsOEJBQThCLHNCQUFzQjtBQUN6RTtBQUNBO0FBQ0EsaUZBQWlGLDBEQUFhO0FBQzlGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVSxvREFBTztBQUNqQixzQkFBc0IseURBQVk7QUFDbEM7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSxTQUFTLGtEQUFLO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QU
20578FDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsaUJBQWlCO0FBQzNDO0FBQ0EsTUFBTSxvREFBTztBQUNiLGlCQUFpQix5REFBWTtBQUM3QixJQUFJLFNBQVMsa0RBQUs7QUFDbEI7QUFDQSxJQUFJO0FBQ0osaUJBQWlCLHVEQUFVO0FBQzNCO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixPQUFPO0FBQ3ZCLGlCQUFpQix1REFBVTtBQUMzQjtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNILHFCQUFxQixpQkFBaUI7QUFDdEM7QUFDQTtBQUNBLG1CQUFtQix1REFBVTtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0Isb0JBQW9CLFVBQVU7QUFDOUMsdUJBQXVCLGtEQUFLO0FBQzVCO0FBQ0E7QUFDQSx3QkFBd0IsMERBQWE7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU0sMkRBQVE7QUFDZDtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLGdCQUFnQixvQkFBb0IsVUFBVTtBQUM5QztBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNILGdCQUFnQixvQkFBb0IsVUFBVTtBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixvREFBTztBQUM5QixzQ0FBc0Msa0RBQUs7QUFDM0MsSUFBSSxLQUF5QyxJQUFJLHVEQUFJO0FBQ3JELDBGQUEwRixtREFBbUQ7QUFDN0k7QUFDQTtBQUNBO0FBQ0EseUNBQXlDLE9BQU87QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1YsNEJBQTRCLHlEQUFZO0FBQ3hDO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxNQUFNLFNBQVMsdURBQVU7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEIsT0FBTyxRQUFRLE9BQU87QUFDcEQsK0JBQStCLE9BQU87QUFDdEMsdUJBQXVCLHVEQUFVO0FBQ2pDLGVBQWU7QUFDZjtBQUNBO0FBQ0Esa0NBQWtDLE9BQU87QUFDekMsUUFBUSxvREFBTztBQUNmLHlCQUF5Qix5REFBWTtBQUNyQyxpQkFBaUI7QUFDakI7QUFDQSxNQUFNLFNBQVMsa0RBQUs7QUFDcEI7QUFDQSxpQkFBaUI7QUFDakI7QUFDQSxNQUFNO0FBQ04sZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDREQUE0RCxFQUFFO0FBQzlEO0FBQ0E7QUFDQSxrREFBa0Q7QUFDbEQ7QUFDQTtBQUNBLG9CQUFvQixzQkFBc0I7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtEQUFrRDtBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLHNEQUFTO0FBQzlCO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQSx3Q0FBd0MsbURBQU0sR0FBRyxXQUFXO0FBQzVEO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyxpRUFBYztBQUMvQztBQUNBO0FBQ0EsMkNBQTJDLDBFQUF1QjtBQUNsRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSxJQUF5QztBQUMvQztBQUNBO0FBQ0E7QUFDQSxVQUFVLFFBQVE7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLHVEQUFVO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNLElBQXlDO0FBQy9DO0FBQ0E7QUFDQTtBQUNBLFVBQVUsUUFBUTtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0Isc0RBQVMsU0FBUyxxREFBUSxTQUFTLHdEQUFXO0FBQ2xFO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxNQUFNLGdFQUFhO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsUUFBUSx1REFBSTtBQUNaO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsdURBQUk7QUFDWjtBQUNBLE9BQU87QUFDUDtBQUNBLFFBQVEsdURBQUk7QUFDWjtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxNQUFNLHFEQUFRO0FBQ2Q7QUFDQSxRQUFRLEtBQXlDO0FBQ2pELE1BQU0sdURBQUk7QUFDVix1REFBdUQsVUFBVTtBQUNqRTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU0sS0FBeUM7QUFDL0MsSUFBSSx1REFBSTtBQUNSLHdDQUF3QyxlQUFlO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFZ1M7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDNWtEaFM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxrQkFBa0IsS0FBeUMsbUJBQW1CLElBQUksQ0FBRTtBQUNwRixrQkFBa0IsS0FBeUMsdUJBQXVCLENBQUU7QUFDcEY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLHVCQUF1QixnQkFBZ0I7QUFDdkM7QU
20578FDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLGtCQUFrQixnQkFBZ0I7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2S0FBNksscUJBQU0sbUJBQW1CLHFCQUFNLEtBQUs7QUFDak47QUFDQTtBQUNBO0FBQ0EseUNBQXlDLEtBQUssZUFBZSxxQkFBcUI7QUFDbEY7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixrQkFBa0I7QUFDcEM7QUFDQTtBQUNBLDhCQUE4QiwrQkFBK0I7QUFDN0Q7QUFDQTtBQUNBO0FBQ0EsYUFBYSxLQUFLLEVBQUUsaURBQWlELEtBQUssU0FBUztBQUNuRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLGtCQUFrQjtBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLGNBQWMsR0FBRyxPQUFPO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0osb0JBQW9CLGtCQUFrQjtBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSxzQkFBc0I7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNENBQTRDLEtBQUs7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixvQkFBb0I7QUFDaEQ7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0Esd0JBQXdCO0FBQ3hCO0FBQ0E7QUFDQSx3QkFBd0I7QUFDeEI7QUFDQTtBQUNBLHVCQUF1QjtBQUN2QjtBQUNBO0FBQ0EsdUJBQXVCO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQix1QkFBdUI7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLGNBQWMsU0FBUztBQUN2QjtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsY0FBYyxTQUFTO0FBQ3ZCO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixzQ0FBc0M7QUFDbEU7QUFDQTs7QUFFaTVCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNsZTMzQjtBQUNFO0FBRXhCLDZCQUFlLHNDQUFZO0FBQ3pCLHdEQUFhLENBQUMsWUFBWTtBQUM1Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ2RzQjtBQUV0Qiw2QkFBZSxvQ0FBVSxXQUFXLENBQUMsR0FBRztBQUV0QyxRQUFNLGdCQUFnQixFQUFFLHNCQUFzQjtBQUU5QyxRQUFNLFNBQVMsZ0RBQVMsQ0FBQyxFQUFFLFdBQVcsTUFBTSxDQUFDO0FBRzdDLFFBQU0sYUFBYSxlQUFlO0FBQ2xDLFFBQU0sT0FBTyxPQUFPLE9BQU8sWUFBWSxRQUFRO0FBRy9DLFNBQU8sSUFBSSxRQUFRLENBQUMsU0FBUyxXQUFXO0FBRXRDLFNBQUssUUFBUSxDQUFDLFFBQVE7QUFDcEIsYUFBTyxJQUFJLEdBQUc7QUFBQSxJQUNoQixDQUFDO0FBR0QsV0FBTyxHQUFHLFlBQVksQ0FBQyxTQUFTLFFBQVE7QUFDdEMsb0JBQWMsSUFBSSxFQUFFLE9BQU8sR0FBRyxVQUFVLE9BQU8sQ0FBQztBQUFBLElBQ2xELENBQUM7QUFJRCxXQUFPLEdBQUcsWUFBWSxNQUFNO0FBQzFCLG9CQUFjLElBQUksRUFBRSxPQUFPLE9BQU8sQ0FBQztBQUNuQyxRQUFFLE1BQU0sRUFBRSxRQUFRLG9CQUFvQjtBQUN0QyxjQUFRO0FBQUEsSUFDVixDQUFDO0FBR0QsV0FBTyxLQUFLO0FBQUEsRUFDZCxDQUFDO0FBQ0g7QUFNQSxTQUFTLGlCQUFpQjtBQUN4QixRQUFNLFdBQVcsc0JBQXNCLEtBQUssT0FBTyxTQUFTLElBQUksRUFBRSxDQUFDO0FBQ25FLFFBQU0sU0FBUyxTQUFTLHFCQUFxQixLQUFLO0FBQ2xELFF
20578BQU0sT0FBTyxDQUFDO0FBR2QsV0FBUyxJQUFJLEdBQUcsSUFBSSxPQUFPLFFBQVEsS0FBSyxHQUFHO0FBQ3pDLFVBQU0sTUFBTSxPQUFPLENBQUMsRUFBRTtBQUV0QixRQUFJLElBQUksUUFBUSxRQUFRLE1BQU0sR0FBRztBQUMvQixXQUFLLEtBQUssR0FBRztBQUFBLElBQ2Y7QUFBQSxFQUNGO0FBQ0EsU0FBTztBQUNUOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN6RG1CO0FBRW5CLDZCQUFlLHNDQUFZO0FBQ3pCLFFBQU0sUUFBUTtBQUNkLGFBQVcsUUFBUSxNQUFNLEtBQUs7QUFDOUIsYUFBVyxlQUFlLE9BQU8sS0FBSztBQUN0QyxhQUFXLHFEQUFNLEVBQUUsT0FBTyxLQUFLO0FBQ2pDO0FBS0EsU0FBUyxTQUFTO0FBQ2hCLElBQUUsYUFBYSxFQUFFLEtBQUssdUJBQXVCLE1BQU07QUFFbkQsSUFBRSxNQUFNLEVBQUUsUUFBUSxhQUFhO0FBQ2pDO0FBS0EsU0FBUyxnQkFBZ0I7QUFDdkIsSUFBRSxhQUFhLEVBQUUsT0FBTztBQUMxQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDdkJxQjtBQUNJO0FBRXpCLE1BQU0sY0FDSjtBQUVLLE1BQU0sa0JBQWtCO0FBQUEsRUFDN0IsV0FBVztBQUFBLEVBQ1gsYUFBYTtBQUFBLEVBQ2IsS0FBSyxFQUFFLFlBQVk7QUFDckI7QUFFTyxNQUFNLGdCQUFnQjtBQUFBLEVBQzNCLE1BQU07QUFBQSxFQUNOLGFBQWE7QUFBQSxFQUNiLFdBQVc7QUFBQSxFQUNYLFNBQVM7QUFBQSxFQUNULEtBQUssRUFBRSxZQUFZO0FBQUEsRUFDbkIsSUFBSTtBQUFBLElBQ0YsUUFBUSxNQUFNO0FBQ1osMkRBQVEsQ0FBQztBQUFBLElBQ1g7QUFBQSxFQUNGO0FBQ0Y7QUFFQSw2QkFBZSxzQ0FBWTtBQUN6QixxREFBUSxDQUFDLEtBQUssbUJBQW1CLGVBQWU7QUFDaEQscURBQVEsQ0FBQyxLQUFLLHdCQUF3QixhQUFhO0FBQ3JEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDM0IwQjtBQUUxQiw2QkFBZSxzQ0FBWTtBQUN6QixNQUFJLHNEQUFhLENBQUMsR0FBRztBQUNuQixhQUFTLEtBQUssYUFBYSxrQkFBa0IsTUFBTTtBQUFBLEVBQ3JELE9BQU87QUFDTCxhQUFTLEtBQUssYUFBYSxrQkFBa0IsT0FBTztBQUFBLEVBQ3REO0FBQ0Y7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDUnFCO0FBRUU7QUFFRjtBQUVFO0FBRUc7QUFFRDtBQUVQO0FBSUQ7QUFFQTtBQUVNO0FBRUg7QUFFUztBQUU3Qiw2QkFBZSxzQ0FBWTtBQUN6Qix1REFBUSxDQUFDO0FBQ1QseURBQVUsQ0FBQztBQUNYLHVEQUFRLENBQUM7QUFDVCx5REFBVSxDQUFDO0FBQ1gsNERBQWEsQ0FBQztBQUNkLDJEQUFZLENBQUM7QUFDYixtREFBSSxDQUFDO0FBQ0wseURBQVUsQ0FBQztBQUNYLG9EQUFLLENBQUM7QUFFTixtREFBSSxDQUFDO0FBQ0wsdURBQU8sQ0FBQyxFQUFFLEtBQUssMERBQWdCO0FBQ2pDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN6Q3VCO0FBRXZCLDZCQUFlLHNDQUFZO0FBQ3pCLDREQUFVLENBQUMsU0FBUyxNQUFNLCtCQUErQjtBQUN6RCw0REFBVSxDQUFDLFNBQVMsTUFBTSxzREFBc0Q7QUFDaEYsNERBQVUsQ0FBQyxTQUFTLFNBQVMsMkJBQTJCO0FBQ3hELDREQUFVLENBQUMsU0FBUyxTQUFTLCtCQUErQjtBQUM1RCw0REFBVSxDQUFDLFNBQVMsTUFBTSwrQkFBK0I7QUFDM0Q7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDVEEsTUFBTSxlQUFlLE1BQU07QUFDekIsU0FBTyxTQUFTLGNBQWMsZUFBZTtBQUMvQztBQUVBLDZCQUFlLHNDQUFZO0FBRXpCLFFBQU0sYUFBYSxFQUFFLGVBQWU7QUFHcEMsYUFBVyxHQUFHLFNBQVMsV0FBVztBQUdsQyxJQUFFLDZCQUE2QixFQUFFLEdBQUcsU0FBUyxXQUFXO0FBR3hELElBQUUsaUJBQWlCLEVBQUUsR0FBRyxTQUFTLGNBQWM7QUFDakQ7QUFNQSxTQUFTLFlBQVksSUFBSTtBQUV2QixRQUFNLFlBQVksYUFBYTtBQUMvQixRQUFNLFFBQVEsV0FBVyxhQUFhLHFCQUFxQjtBQUMzRCxRQUFNLFVBQVUsVUFBVSxTQUFTLFVBQVU7QUFDN0MsWUFBVSxhQUFhLHVCQUF1QixPQUFPO0FBR3JELElBQUUsWUFBWSxFQUFFLEtBQUssZUFBZSxZQUFZLFNBQVMsU0FBUyxPQUFPO0FBRXpFLE1BQUksR0FBRyxrQkFBa0IsV0FBVztBQUNsQyxPQUFHLGVBQWU7QUFBQSxFQUNwQjtBQUNGO0FBTUEsU0FBUyxlQUFlLElBQUk7QUFFMUIsUUFBTSxVQUFVLEVBQUUsR0FBRyxhQUFhO0FBQ2xDLFFBQU0sV0FBVyxRQUFRLEtBQUs7QUFDOUIsUUFBTSxZQUFZLFFBQVEsS0FBSyxxQkFBcUIsTUFBTTtBQUUxRCxNQUFJLFdBQVc7QUFDYixZQUFRLEtBQUssdUJBQXVCLE9BQU87QUFDM0MsYUFBUyxLQUFLLHVCQUF1QixPQUFPO0FBQUEsRUFDOUMsT0FBTztBQUNMLFlBQVEsS0FBSyx1QkFBdUIsTUFBTTtBQUMxQyxhQUFTLEtBQUssdUJBQXVCLE1BQU07QUFBQSxFQUM3QztBQUNBLEtBQUcsZUFBZTtBQUNwQjs7Ozs7Ozs7Ozs7Ozs7QUM3Q0EsTUFBTSxRQUFRO0FBQUEsRUFDWixNQUFNO0FBQUEsRUFDTixPQUFPO0FBQUEsRUFDUCxPQUFPO0FBQUEsRUFDUCxXQUFXO0FBQUEsRUFDWCxNQUFNO0FBQ1I7QUFHQSxNQUFNLFNBQVM7QUFBQSxFQUNiLFlBQVk7QUFBQSxFQUNaLFdBQVc7QUFDYjtBQUVBLE1BQU0sV0FBVyxDQUFDLFlBQVk7QUFDNUIsVUFBUSxRQUFRLENBQUMsVUFBVTtBQUN6QixVQUFNLE9BQU8sTUFBTSxPQUFPLGFBQWEsV0FBVztBQUNsRCxVQUFNLFdBQVcsTUFBTTtBQUl2QixRQUFJLFVBQVU7QUFDWixhQUFPLEtBQUssS0FBSyxFQUFFLFFBQVEsQ0FBQyxRQUFRO0FBQ2xDLGNBQU0sR0FBRyxJQUFJO0FBQUEsTUFDZixDQUFDO0FBQUEsSUFDSDtBQUNBLFVBQU0sSUFBSSxJQUFJO0FBQUEsRUFDaEIsQ0FBQztBQUdELFNBQU8sS0FBSyxLQUFLLEVBQUUsUUFBUSxDQUFDLFFBQVE7QUFDbEMsVUFBTSxXQUFXLFNBQVMsY0FBYyxzQkFBc0IsS0FBSztBQUNuRSxVQUFNLFdBQVcsTUFBTSxHQUFHO0FBQzFCLGNBQVUsYUFBYSxvQkFBb0IsV0FBVyxTQUFTLE9BQU87QUFBQSxFQUN4RSxDQUFDO0FBQ0g7QUFFQSwrREFBZSxNQUFNO0FBQ25CLFFBQU0sV0FBVyxJQUFJLHFCQUFxQixVQUFVLE1BQU07QUFDMUQsUUFBTSxXQUFXLFNBQVMsaUJBQWlCLGlCQUFpQjtBQUU1RCxXQUFTLFFBQVEsQ0FBQyxZQUFZO0FBQzVCLGFBQVMsUUFBUSxPQUFrQjtBQUFBLEVBQ3JDLENBQUM7QUFDSCxDQUFDLEVBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNsQ3VCO0FBRXpCLDZCQUFlLHNDQUFZO0FBRXpCLFFBQU0sZUFBZSxJQUFJLHNEQUFZLENBQUMsbUJBQW1CO0FBQUEsSUFDdkQsT0FBTztBQUFBLElBQ1AsUUFBUTtBQUFBLElBQ1IsUUFBUTtBQUFBLEVBQ1YsQ0FBQztBQUVELFFBQU0sU0FBUyxJQUFJLHNEQUFZLENBQUM7QUFHaEMsSUFBRSxlQUFlLEVBQUUsR0FBRyxTQUFTLENBQUMsT0FBTztBQUNyQyxXQUFPLGNBQWMsR0FBRyxNQUFNO0FBQUEsTUFDNUIsT0FBTztBQUFBLE1BQ1AsUUFBUTtBQUFBLE1BQ1IsUUFBUTtBQUFBLElBQ1YsQ0FBQztBQUNELE9BQUcsZUFBZTtBQUFBLEVBQ3BCLENBQUM7QUFDSDs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDcEN5QjtBQUV6Qiw2QkFBZSxzQ0FBWTtBQUN6QixRQUFNLGdCQUFnQixJQUFJLDZEQUFZLENBQUMsbUJBQW1CO0FBQzVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNObUI7QUFFbkIsNkJBQWUsc0NBQVk7QUFDekIsUUFBTSxTQUFTLElBQUksNkRBQU0sQ0FBQyxjQUFjLEVBQUUsWUFBWSxtQkFBbUIsQ0FBQztBQUMxRSxTQUFPLE1BQU07QUFDZjs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDTndCO0FBRXhCLDZCQUFlLHNDQUFZO0FBQ3pCLGlFQUFXLENBQUMsZUFBZSxrQkFBa0I7QUFDL0M7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNUMEI7QUFDNkI7QUFFdkQsNkJBQWUsc0NBQVk7QUFDekIsTUFBSSxTQUFTO0FBRWIsTUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLFFBQVE7QUFDckI7QUFBQSxFQUNGO0FBRUEsUUFBTSxNQUFNLDhDQUFTLENBQUM7QUFBQSxJQUNwQixZQUFZO0FBQUEsTUFDVixPQUFPO0FBQVAsTUFDQSxjQUFjO0FBQWQsSUFDRjtBQUFBLEVBQ0YsQ0FBQztBQUNELE1BQUksTUFBTSxNQUFNO0FBSWhCLFdBQVM7QUFFVCxRQUFNLGFBQWEsK0RBQWEsQ0FBQyxXQUFXO0FBRTVDLFFBQU0sT0FBTyw4Q0FBUyxDQUFDO0FBQUEsSUFDckIsWUFBWTtBQUFBLE1BQ1YsT0FBTztBQUFQLE1BQ0EsY0FBYztBQUFkLElBQ0Y7QUFBQSxJQUNBLFVBQVU7QUFBQSxNQUNSLFdBQVc7QUFDVCxlQUFPLFdBQVcsU0FBUztBQUFBLE1BQzdCO0FBQUEsSUFDRjtBQUFBLElBQ0EsU0FBUztBQUFBLE1BQ1AsWUFBWTtBQUVWLG1CQUFXLFlBQVksTUFBTTtBQUFBLE1BQy9CO0FBQUEsTUFDQSxVQUFVO0FBQ1IsbUJBQVcsY0FBYztBQUFBLE1BQzNCO0FBQUEsTUFDQSxVQUFVO0FBQ1IsbUJBQVcsY0FBYztBQUFBLE1BQzNCO0FBQUEsSUFDRjtBQUFBLElBQ0EsVUFBVTtBQU1SLGlCQUFXLGtCQUFtQixDQUFDLE9BQW9CO0FBQUEsTUFFbkQsQ0FBbUI7QUFBQSxJQUNyQjtBQUFBLEVBQ0YsQ0FBQztBQUNELE9BQUssTUFBTSxNQUFNO0FBQ25COzs7Ozs7Ozs7OztBQzFEQSw4Q0FBNkM7QUFDN0M7QUFDQSxDQUFDLEVBQUM7QUFDRixrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7QUNQQTtBQUNBO0FBQ0E7O0F
20578BRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxJQUFJLEtBQXlCO0FBQzdCLFVBQVUsbUJBQU8sQ0FBQyx3REFBVztBQUM3QixHQUFHLFNBQVMsSUFBeUM7QUFDckQsRUFBRSxpQ0FBTyxDQUFDLDZFQUFXLENBQUMsb0NBQUUsT0FBTztBQUFBO0FBQUE7QUFBQSxrR0FBQztBQUNoQyxHQUFHLEtBQUssRUFJTjtBQUNGLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHNDQUFzQzs7QUFFdEM7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1IsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDQUE4QztBQUM5QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEM7QUFDOUM7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDQUE4QztBQUM5Qzs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDdkxEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDK0M7QUFDdUM7QUFDckQ7QUFDVztBQUN1Qzs7QUFFbkY7QUFDQTtBQUNBLElBQUkscUVBQW1CO0FBQ3ZCO0FBQ0E7O0FBRUEsSUFBSSxJQUF5QztBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBLHVEQUF1RCxrREFBUztBQUNoRTtBQUNBO0FBQ0EsaURBQWlELGtEQUFTO0FBQzFEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTyxxREFBUTtBQUNmO0FBQ0E7QUFDQSxNQUFNO0FBQ04sTUFBTSxLQUF5QyxJQUFJLHNEQUFJO0FBQ3ZELGFBQWEsNkNBQUk7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLEtBQXlDO0FBQ2pELE1BQU0sc0RBQUksNENBQTRDLFNBQVM7QUFDL0Q7QUFDQTtBQUNBO0FBQ0EsZUFBZSxtREFBTTtBQUNyQjtBQUNBO0FBQ0EsZUFBZSxLQUF5QyxhQUFhLENBQU07QUFDM0UsY0FBYyxLQUF5Qyw2QkFBNkIsQ0FBSTtBQUN4RixLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVUsT0FBTyxFQUFFLDBEQUFPO0FBQzFCO0FBQ0EsNkVBQTZFLFlBQVk7QUFDekYsaUNBQWlDLDhEQUFpQjtBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksc0RBQUksZ0JBQWdCO0FBQ3hCLEVBQUUsVUFBVTtBQUNaO0FBQ0EsMkNBQTJDLDZDQUFVO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBLHlFQUF1Qjs7QUFFaUI7Ozs7Ozs7Ozs7O0FDL0V4Qzs7Ozs7Ozs7OztBQ0FBOzs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7QUNBQTs7Ozs7Ozs7OztBQ0FBOzs7Ozs7Ozs7OztBQ0FBOzs7Ozs7VUNBQTtVQUNBOztVQUVBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBOztVQUVBO1VBQ0E7O1VBRUE7VUFDQTtVQUNBOzs7OztXQ3RCQTtXQUNBO1dBQ0E7V0FDQSxlQUFlLDRCQUE0QjtXQUMzQyxlQUFlO1dBQ2YsaUNBQWlDLFdBQVc7V0FDNUM7V0FDQTs7Ozs7V0NQQTtXQUNBO1dBQ0E7V0FDQTtXQUNBLHlDQUF5Qyx3Q0FBd0M7V0FDakY7V0FDQTtXQUNBOzs7OztXQ1BBO1dBQ0E7V0FDQTtXQUNBO1dBQ0EsR0FBRztXQUNIO1dBQ0E7V0FDQSxDQUFDOzs7OztXQ1BELDhDQUE4Qzs7Ozs7V0NBOUM7V0FDQTtXQUNBO1dBQ0EsdURBQXVELGlCQUFpQjtXQUN4RTtXQUNBLGdEQUFnRCxhQUFhO1dBQzdEOzs7Ozs7Ozs7Ozs7OztBQ0htQjtBQUVuQix5REFBTSxDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vc2l0ZV90ZW1wbGF0ZV8yMDIwMTIvLi9ub2RlX21vZHVsZXMvQHN5Z25hcy9qcC1zb2NpYWwtc2hhcmUvZGlzdC9lczYvX3ZpcnR1YWwvX3JvbGx1cFBsdWdpbkJhYmVsSGVscGVycy5qcyIsIndlYnBhY2s6Ly9zaXRlX3RlbXBsYXRlXzIwMjAxMi8uL25vZGVfbW9kdWxlcy9Ac3lnbmFzL2pwLXNvY2lhbC1zaGFyZS9kaXN0L2VzNi9pbmRleC5qcyIsIndlYnBhY2s6Ly9zaXRlX3RlbXBsYXRlXzIwMjAxMi8uL25vZGVfbW9kdWxlcy9Ac3lnbmFzL3Njcm9sbC1hbW91bnQvZGlzdC9lczYvX3ZpcnR1YWwvX3JvbGx1cFBsdWdpbkJhYmVsSGVscGVycy5qcyIsIndlYnBhY2s6Ly9zaXRlX3RlbXBsYXRlXzIwMjAxMi8uL25vZGVfbW9kdWxlcy9Ac3lnbmFzL3Njcm9sbC1hbW91bnQvZGlzdC9lczYvaW5kZXguanMiLCJ3ZWJwYWNrOi8vc2l0ZV90ZW1wbGF0ZV8yMDIwMTIvLi9ub2RlX21vZHVsZXMvQHN5Z25hcy9zY3JvbGwtaW52aWV3L2Rpc3QvZXM2L192aXJ0dWFsL19yb2xsdXBQbHVnaW5CYWJlbEhlbHBlcnMuanMiLCJ3ZWJwYWNrOi8vc2l0ZV90ZW1wbGF0ZV8yMDIwMTIvLi9ub2RlX21vZHVsZXMvQHN5Z25hcy9zY3JvbGwtaW52aWV3L2Rpc3QvZXM2L2luZGV4LmpzIiwid2VicGFjazovL3NpdGVfdGVtcGxhdGVfMjAyMDEyLy4vbm9kZV9tb2R1bGVzL0BzeWduYXMvdnVlLXRhYnMvZGlzdC92dWUtdGFicy5lcy5qcyIsIndlYnBhY2s6Ly9zaXRlX3RlbXBsYXRlXzIwMjAxMi8uL25vZGVfbW9kdWxlcy9AdnVlL2NvbXBpbGVyLWNvcmUvZGlzdC9jb21waWxlci1jb3JlLmVzbS1idW5kbGVyLmpzIiwid2VicGFjazovL3NpdGVfdGVtcGxhdGVfMjAyMDEyLy4vbm9kZV9tb2R1bGVzL0B2dWUvY29tcGlsZXItZG9tL2Rpc3QvY29tcGlsZXItZG9tLmVzbS1idW5kbGVyLmpzIiwid2VicGFjazovL3NpdGVfdGVtcGxhdGVfMjAyMDEyLy4vbm9kZV9tb2R1bGVzL0B2dWUvcmVhY3Rpdml0eS9kaXN0L3JlYWN0aXZpdHkuZXNtLWJ1bmRsZXIuanMiLCJ3ZWJwYWNrOi8vc2l0ZV90ZW1wbGF0ZV8yMDIwMTIvLi9ub2RlX21vZHVsZXMvQHZ1ZS9ydW50aW1lLWNvcm
20578UvZGlzdC9ydW50aW1lLWNvcmUuZXNtLWJ1bmRsZXIuanMiLCJ3ZWJwYWNrOi8vc2l0ZV90ZW1wbGF0ZV8yMDIwMTIvLi9ub2RlX21vZHVsZXMvQHZ1ZS9ydW50aW1lLWRvbS9kaXN0L3J1bnRpbWUtZG9tLmVzbS1idW5kbGVyLmpzIiwid2VicGFjazovL3NpdGVfdGVtcGxhdGVfMjAyMDEyLy4vbm9kZV9tb2R1bGVzL0B2dWUvc2hhcmVkL2Rpc3Qvc2hhcmVkLmVzbS1idW5kbGVyLmpzIiwid2VicGFjazovL3NpdGVfdGVtcGxhdGVfMjAyMDEyLy4vc3JjL2pzL3BhZ2VzL2NvbW1vbi9sYXp5bG9hZC5qcyIsIndlYnBhY2s6Ly9zaXRlX3RlbXBsYXRlXzIwMjAxMi8uL3NyYy9qcy9wYWdlcy9jb21tb24vbG9hZGluZy5qcyIsIndlYnBhY2s6Ly9zaXRlX3RlbXBsYXRlXzIwMjAxMi8uL3NyYy9qcy9wYWdlcy9jb21tb24vbG9hZGluZ19jb21wbGV0ZS5qcyIsIndlYnBhY2s6Ly9zaXRlX3RlbXBsYXRlXzIwMjAxMi8uL3NyYy9qcy9wYWdlcy9jb21tb24vcG9wdXAuanMiLCJ3ZWJwYWNrOi8vc2l0ZV90ZW1wbGF0ZV8yMDIwMTIvLi9zcmMvanMvcGFnZXMvY29tbW9uL2NoZWNrLXVhLnRzIiwid2VicGFjazovL3NpdGVfdGVtcGxhdGVfMjAyMDEyLy4vc3JjL2pzL3BhZ2VzL2NvbW1vbi9pbmRleC50cyIsIndlYnBhY2s6Ly9zaXRlX3RlbXBsYXRlXzIwMjAxMi8uL3NyYy9qcy9wYWdlcy9jb21tb24vbWVkaWFxdWVyeS50cyIsIndlYnBhY2s6Ly9zaXRlX3RlbXBsYXRlXzIwMjAxMi8uL3NyYy9qcy9wYWdlcy9jb21tb24vbWVudS50cyIsIndlYnBhY2s6Ly9zaXRlX3RlbXBsYXRlXzIwMjAxMi8uL3NyYy9qcy9wYWdlcy9jb21tb24vbWVudUFjdGl2ZS50cyIsIndlYnBhY2s6Ly9zaXRlX3RlbXBsYXRlXzIwMjAxMi8uL3NyYy9qcy9wYWdlcy9jb21tb24vcGFnZXNjcm9sbC50cyIsIndlYnBhY2s6Ly9zaXRlX3RlbXBsYXRlXzIwMjAxMi8uL3NyYy9qcy9wYWdlcy9jb21tb24vc2Nyb2xsLWFtb3VudC50cyIsIndlYnBhY2s6Ly9zaXRlX3RlbXBsYXRlXzIwMjAxMi8uL3NyYy9qcy9wYWdlcy9jb21tb24vc2Nyb2xsLWludmV3LnRzIiwid2VicGFjazovL3NpdGVfdGVtcGxhdGVfMjAyMDEyLy4vc3JjL2pzL3BhZ2VzL2NvbW1vbi9zb2NpYWwtc2hhcmUudHMiLCJ3ZWJwYWNrOi8vc2l0ZV90ZW1wbGF0ZV8yMDIwMTIvLi9zcmMvanMvcGFnZXMvY29tbW9uL3RhYnMudHMiLCJ3ZWJwYWNrOi8vc2l0ZV90ZW1wbGF0ZV8yMDIwMTIvLi9ub2RlX21vZHVsZXMvaXMtdG91Y2gtZGV2aWNlL2J1aWxkL2luZGV4LmpzIiwid2VicGFjazovL3NpdGVfdGVtcGxhdGVfMjAyMDEyLy4vbm9kZV9tb2R1bGVzL2xhenlzaXplcy9wbHVnaW5zL3VudmVpbGhvb2tzL2xzLnVudmVpbGhvb2tzLmpzIiwid2VicGFjazovL3NpdGVfdGVtcGxhdGVfMjAyMDEyLy4vbm9kZV9tb2R1bGVzL3Z1ZS9kaXN0L3Z1ZS5lc20tYnVuZGxlci5qcyIsIndlYnBhY2s6Ly9zaXRlX3RlbXBsYXRlXzIwMjAxMi9kZWxlZ2F0ZWQgMTk3IGZyb20gZGxsLXJlZmVyZW5jZSB2ZW5kb3JfbGlicmFyeSIsIndlYnBhY2s6Ly9zaXRlX3RlbXBsYXRlXzIwMjAxMi9kZWxlZ2F0ZWQgMjQwIGZyb20gZGxsLXJlZmVyZW5jZSB2ZW5kb3JfbGlicmFyeSIsIndlYnBhY2s6Ly9zaXRlX3RlbXBsYXRlXzIwMjAxMi9kZWxlZ2F0ZWQgNDk2IGZyb20gZGxsLXJlZmVyZW5jZSB2ZW5kb3JfbGlicmFyeSIsIndlYnBhY2s6Ly9zaXRlX3RlbXBsYXRlXzIwMjAxMi9kZWxlZ2F0ZWQgNjI1IGZyb20gZGxsLXJlZmVyZW5jZSB2ZW5kb3JfbGlicmFyeSIsIndlYnBhY2s6Ly9zaXRlX3RlbXBsYXRlXzIwMjAxMi9kZWxlZ2F0ZWQgODc5IGZyb20gZGxsLXJlZmVyZW5jZSB2ZW5kb3JfbGlicmFyeSIsIndlYnBhY2s6Ly9zaXRlX3RlbXBsYXRlXzIwMjAxMi9leHRlcm5hbCB2YXIgXCJ2ZW5kb3JfbGlicmFyeVwiIiwid2VicGFjazovL3NpdGVfdGVtcGxhdGVfMjAyMDEyL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL3NpdGVfdGVtcGxhdGVfMjAyMDEyL3dlYnBhY2svcnVudGltZS9jb21wYXQgZ2V0IGRlZmF1bHQgZXhwb3J0Iiwid2VicGFjazovL3NpdGVfdGVtcGxhdGVfMjAyMDEyL3dlYnBhY2svcnVudGltZS9kZWZpbmUgcHJvcGVydHkgZ2V0dGVycyIsIndlYnBhY2s6Ly9zaXRlX3RlbXBsYXRlXzIwMjAxMi93ZWJwYWNrL3J1bnRpbWUvZ2xvYmFsIiwid2VicGFjazovL3NpdGVfdGVtcGxhdGVfMjAyMDEyL3dlYnBhY2svcnVudGltZS9oYXNPd25Qcm9wZXJ0eSBzaG9ydGhhbmQiLCJ3ZWJwYWNrOi8vc2l0ZV90ZW1wbGF0ZV8yMDIwMTIvd2VicGFjay9ydW50aW1lL21ha2UgbmFtZXNwYWNlIG9iamVjdCIsIndlYnBhY2s6Ly9zaXRlX3RlbXBsYXRlXzIwMjAxMi8uL3NyYy9qcy9jb21tb24uanMiXSwic291cmNlc0NvbnRlbnQiOlsiZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3Rvcikge1xuICBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTtcbiAgICBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7XG4gICAgZGVzY3JpcHRvci
205785jb25maWd1cmFibGUgPSB0cnVlO1xuICAgIGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHtcbiAgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7XG4gIGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTtcbiAgcmV0dXJuIENvbnN0cnVjdG9yO1xufVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7XG4gIGlmIChrZXkgaW4gb2JqKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7XG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IHRydWVcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBvYmpba2V5XSA9IHZhbHVlO1xuICB9XG5cbiAgcmV0dXJuIG9iajtcbn1cblxuZXhwb3J0IHsgX2NsYXNzQ2FsbENoZWNrIGFzIGNsYXNzQ2FsbENoZWNrLCBfY3JlYXRlQ2xhc3MgYXMgY3JlYXRlQ2xhc3MsIF9kZWZpbmVQcm9wZXJ0eSBhcyBkZWZpbmVQcm9wZXJ0eSB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9X3JvbGx1cFBsdWdpbkJhYmVsSGVscGVycy5qcy5tYXBcbiIsImltcG9ydCB7IGRlZmluZVByb3BlcnR5IGFzIF9kZWZpbmVQcm9wZXJ0eSwgY3JlYXRlQ2xhc3MgYXMgX2NyZWF0ZUNsYXNzLCBjbGFzc0NhbGxDaGVjayBhcyBfY2xhc3NDYWxsQ2hlY2sgfSBmcm9tICcuL192aXJ0dWFsL19yb2xsdXBQbHVnaW5CYWJlbEhlbHBlcnMuanMnO1xuXG4vKipcbiAqIOaXpeacrOWQkeOBkeOCveODvOOCt+ODo+ODq+OCt+OCp+OCouODnOOCv+ODs1xuICpcbiAqIEBhdXRob3IgICBIaXJvc2hpIEZ1a3VkYSA8aW5mby5zeWduYXNAZ21haWwuY29tPlxuICogQGxpY2Vuc2UgIE1JVFxuICovXG52YXIgSnBTb2NpYWxTaGFyZSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEpwU29jaWFsU2hhcmUoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEpwU29jaWFsU2hhcmUpO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKEpwU29jaWFsU2hhcmUsIG51bGwsIFt7XG4gICAga2V5OiBcInNldFNoYXJlQnV0dG9uXCIsXG4gICAgdmFsdWU6IC8vIOOCteODvOODk+OCueWQjeitmOWIpeWtkFxuICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4gICAgLyoqXG4gICAgICog44K344Kn44Ki44Oc44K/44Oz44Gu44Oq44Oz44Kv44KS6Kit5a6a44GZ44KLXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHRhcmdldCDlr77osaHjg5zjgr/jg7Pjga7jgrvjg6zjgq/jgr9cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uIOaWsOimj+OCpuOCo+ODs+ODieOCpuOBruODkeODqeODoeODvOOCv++8iGRlZmF1bHRz5Y+C54Wn77yJXG4gICAgICovXG4gICAgZnVuY3Rpb24gc2V0U2hhcmVCdXR0b24odGFyZ2V0KSB7XG4gICAgICB2Y
20578XIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICB2YXIgb3B0aW9uID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcbiAgICAgIC8vIOioreWumuOBruODnuODvOOCuFxuICAgICAgdGhpcy5vcHQgPSBPYmplY3QuYXNzaWduKHRoaXMuZGVmYXVsdHMsIG9wdGlvbik7IC8vIOOCr+ODquODg+OCr+OCpOODmeODs+ODiOOCkuioreWumlxuXG4gICAgICB0aGlzLmdldE5vZGVBcnJheShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHRhcmdldCkpLmZvckVhY2goZnVuY3Rpb24gKGVsbSkge1xuICAgICAgICBlbG0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoZXYpIHtcbiAgICAgICAgICB2YXIgZWxtID0gZXYuY3VycmVudFRhcmdldDtcblxuICAgICAgICAgIF90aGlzLm9wZW5TaGFyZVdpbmRvd1dpdGhFbGVtZW50KGVsbSk7XG5cbiAgICAgICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiDjgqjjg6zjg6Hjg7Pjg4jjgYvjgonmg4XloLHjgpLlj5blvpfjgZfjgabjgrfjgqfjgqLnlKjjgqbjgqPjg7Pjg4njgqbjgpLplovjgY9cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcIm9wZW5TaGFyZVdpbmRvd1dpdGhFbGVtZW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG9wZW5TaGFyZVdpbmRvd1dpdGhFbGVtZW50KGVsbSkge1xuICAgICAgLy8g44Ko44Os44Oh44Oz44OI44GL44KJ44OR44Op44Oh44O844K/44KS5Y+W5b6XXG4gICAgICB2Y
20578XIgc2VydmljZSA9IGVsbS5nZXRBdHRyaWJ1dGUoJ2RhdGEtc2hhcmUtc2VydmljZScpO1xuICAgICAgdmFyIHVybCA9IGVsbS5nZXRBdHRyaWJ1dGUoJ2RhdGEtc2hhcmUtdXJsJykgfHwgJyc7XG4gICAgICB2YXIgbWVzc2FnZSA9IGVsbS5nZXRBdHRyaWJ1dGUoJ2RhdGEtc2hhcmUtbWVzc2FnZScpIHx8IGRvY3VtZW50LnRpdGxlO1xuICAgICAgdmFyIGFjY291bnQgPSBlbG0uZ2V0QXR0cmlidXRlKCdkYXRhLXNoYXJlLWFjY291bnQnKSB8fCAnJztcbiAgICAgIHZhciBmb2xsb3cgPSBlbG0uZ2V0QXR0cmlidXRlKCdkYXRhLXNoYXJlLWZvbGxvdycpIHx8ICcnOyAvLyDjgrfjgqfjgqLnlKjjgqbjgqPjg7Pjg4njgqbjgpLplovjgY9cblxuICAgICAgdGhpcy5vcGVuU2hhcmVXaW5kb3coc2VydmljZSwgdXJsLCBtZXNzYWdlLCBhY2NvdW50LCBmb2xsb3cpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiDjgrfjgqfjgqLnlKjjgqbjgqPjg7Pjg4njgqbjgpLplovjgY9cbiAgICAgKiBAcGFyYW0gc2VydmljZSB7U3RyaW5nfSDjgr3jg7zjgrfjg6Pjg6vjgrXjg7zjg5PjgrnorZjliKXlrZBcbiAgICAgKiBAcGFyYW0gdXJsIHtTdHJpbmd9IOOCt+OCp+OColVSTFxuICAgICAqIEBwYXJhbSBtZXNzYWdlIHtTdHJpbmd9IOODoeODg+OCu+ODvOOCuOacrOaWh1xuICAgICAqIEBwYXJhbSBhY2NvdW50IHtTdHJpbmd9IOODhOOCpOODvOODiOOBq+S7mOOBkeOCi1JlcGxleeOCouOCq+OCpuODs+ODiFxuICAgICAqIEBwYXJhbSBmb2xsb3cge1N0cmluZ30g44OE44Kk44O844OI5b6M44Gr6KGo56S644GZ44KL44OV44Kp44Ot44O85YCZ6KOc44Ki44Kr44Km44Oz44OIXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJvcGVuU2hhcmVXaW5kb3dcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gb3BlblNoYXJlV2luZG93KHNlcnZpY2UpIHtcbiAgICAgIHZhciB1cmwgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6ICcnO1xuICAgICAgdmFyIG1lc3NhZ2UgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6ICcnO1xuICAgICAgdmFyIGFjY291bnQgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6ICcnO1xuICAgICAgdmFyIGZvbGxvdyA9IGFyZ3VtZW50cy5sZW5ndGggPiA0ICYmIGFyZ3VtZW50c1s0XSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzRdIDogJyc7XG5cbiAgICAgIC8vIOWtmOWcqOOBl+OBquOBhOOCteODvOODk+OCueOBoOOBo+OBn+OCieOCqOODqeODvFxuICAgICAgaWYgKHRoaXMub3B0LnNlcnZpY2VzICYmIE9iamVjdC5rZXlzKHRoaXMub3B0LnNlcnZpY2VzKS5pbmRleE9mKHNlcnZpY2UpID09PSAtMSkge1xuICAgICAgICBjb25zb2xlLmxvZyhcIlwiLmNvbmNhdChzZXJ2aWNlLCBcIiBpcyBub3Qgc3VwcG9ydGVkLlwiKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gLy8g44OG44Oz44OX44Os44O844OI44GL44KJ44Kz44Oz44OQ44O844OIXG5cblxuICAgICAgdmFyIG9wZW5VcmwgPSB0aGlzLmNvbnZlcnRPcGVuVXJsKHNlcnZpY2UsIHVybCwgbWVzc2FnZSwgYWNjb3VudCwgZm9sbG93KTsgLy8gLy8gTElOReOBr+OCouODl+ODquOBq+mjm+OBsOOBmeOAguOBneOCjOS7peWkluOBr+OCpuOCo+ODs+ODieOCpuOCkumWi+OBj1xuICAgICAgLy8gaWYgKHNlcnZpY2UgPT09IHRoaXMuU0VSVklDRVMuTElORSkge1xuICAgICAgLy8gICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IG9wZW5Vcmw7XG4gICAgICAvLyB9IGVsc2UgaWYgKHRoaXMub3B0LndpbmRvdykge1xuXG4gICAgICBpZiAodGhpcy5vcHQud2luZG93KSB7XG4gICAgICAgIHZhciB3aW5kb3dPcHRpb24gPSB0aGlzLmdldFdpbmRvd09wdGlvbih0aGlzLm9wdC53aW5kb3cpO1xuICAgICAgICB3aW5kb3cub3BlbihvcGVuVXJsLCBcInNoYXJlX1wiLmNvbmNhdChzZXJ2aWNlKSwgd2luZG93T3B0aW9uKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdXaW5kb3cgb3B0aW9uIGlzIG5vdCBkZWZpbmVkLicpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuICAgIC8qKlxuICAgICAqIOOCteODvOODk+OCueavjuOBrlVSTOOCkuWPluW+l1xuICAgICAqIOODkeODqeODoeODvOOCv+OBq+OCiOOBo+OBpuOBr+WKoOW3peOBjOOBleOCjOOCi1xuICAgICAqIEBwYXJhbSBzZXJ2aWNlIHtTdHJpbmd9IOOCveODvOOCt+ODo+ODq+OCteODvOODk+OCueitmOWIpeWtkFxuICAgICAqIEBwYXJhbSB1cmwge1N0cmluZ30g44K344Kn44KiVVJMXG4gICAgICogQHBhcmFtIG1lc3NhZ2Uge1N0cmluZ30g44Oh44OD44K744O844K45pys5paHXG4gICAgICogQHBhcmFtIGFjY291bnQge1N0cmluZ30g44OE44Kk44O844OI44Gr5LuY44GR44KLUmVwbGV544Ki44Kr44Km44Oz44OIXG4gICAgICogQHBhcmFtIGZvbGxvdyB7U3RyaW5nfSDjg4TjgqTjg7zjg4jlvozjgavooajnpLrjgZnjgovjg5Xjgqnjg63jg7zlgJnoo5zjgqLjgqvjgqbjg7Pjg4hcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IOOCt+OCp+OCoueqk+OCquODvOODl+ODs1VSTFxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiY29udmVydE9wZW5VcmxcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29udmVydE9wZW5Vcmwoc2VydmljZSkge1xuICAgICAgdmFyIHVybCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogJyc7XG4gICAgICB2Y
20578XIgbWVzc2FnZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogJyc7XG4gICAgICB2YXIgYWNjb3VudCA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIGFyZ3VtZW50c1szXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzNdIDogJyc7XG4gICAgICB2YXIgZm9sbG93ID0gYXJndW1lbnRzLmxlbmd0aCA+IDQgJiYgYXJndW1lbnRzWzRdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbNF0gOiAnJztcbiAgICAgIHZhciBldSA9IGVuY29kZVVSSUNvbXBvbmVudDtcbiAgICAgIHZhciBzaGFyZVVybCA9IHVybCB8fCBsb2NhdGlvbi5ocmVmO1xuICAgICAgdmFyIG9wZW5VcmwgPSB0aGlzLm9wdC5zZXJ2aWNlcyA/IHRoaXMub3B0LnNlcnZpY2VzW3NlcnZpY2VdIDogXCJcIjtcblxuICAgICAgaWYgKCFvcGVuVXJsKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiXCIuY29uY2F0KHNlcnZpY2UsIFwiIGlzIG5vdCBzdXBwb3J0ZWQuXCIpKTtcbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICB9IC8vIFR3aXR0ZXLjgaDjgZHjg5Hjg6njg6Hjg7zjgr/jga7lhoXlrrnjgavjgojjgaPjgaZVUkzjgYzlpInjgo/jgotcblxuXG4gICAgICBpZiAoc2VydmljZSA9PT0gdGhpcy5TRVJWSUNFUy5UV0lUVEVSKSB7XG4gICAgICAgIGlmICghYWNjb3VudCkgb3BlblVybCA9IG9wZW5VcmwucmVwbGFjZShcIiZ2aWE9e3tBQ0NPVU5UfX1cIiwgXCJcIik7XG4gICAgICAgIGlmICghZm9sbG93KSBvcGVuVXJsID0gb3BlblVybC5yZXBsYWNlKFwiJnJlbGF0ZWQ9e3tGT0xMT1d9fVwiLCBcIlwiKTtcbiAgICAgIH1cblxuICAgICAgb3BlblVybCA9IG9wZW5VcmwucmVwbGFjZShcInt7QUNDT1VOVH19XCIsIGV1KGFjY291bnQpKTtcbiAgICAgIG9wZW5VcmwgPSBvcGVuVXJsLnJlcGxhY2UoXCJ7e0ZPTExPV319XCIsIGV1KGZvbGxvdykpO1xuICAgICAgb3BlblVybCA9IG9wZW5VcmwucmVwbGFjZShcInt7TUVTU0FHRX19XCIsIGV1KG1lc3NhZ2UpKTtcbiAgICAgIG9wZW5VcmwgPSBvcGVuVXJsLnJlcGxhY2UoXCJ7e1VSTH19XCIsIGV1KHNoYXJlVXJsKSk7XG4gICAgICByZXR1cm4gb3BlblVybDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTm9kZUxpc3TjgpJBcnJheeOBqOOBl+OBpuWPluOCiuWHuuOBme+8iElF5a++562W77yJXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJnZXROb2RlQXJyYXlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0Tm9kZUFycmF5KG5vZGVMaXN0KSB7XG4gICAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwobm9kZUxpc3QsIDApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXaW5kb3fjg5Hjg6njg6Hjg7zjgr/kvZzmiJBcbiAgICAgKiBAcGFyYW0gb3B0IHtPYmplY3R9IOOCpuOCo+ODs+ODieOCpuODkeODqeODoeODvOOCv1xuICAgICAqIEByZXR1cm4ge1N0cmluZ30g5paw6KaP44Km44Kj44Oz44OJ44Km44Gu44OR44Op44Oh44O844K/5paH5a2X5YiXXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJnZXRXaW5kb3dPcHRpb25cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0V2luZG93T3B0aW9uKG9wdCkge1xuICAgICAgdmFyIGl0ZW1zID0gW107XG4gICAgICBPYmplY3Qua2V5cyhvcHQpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICBpdGVtcy5wdXNoKFwiXCIuY29uY2F0KGtleSwgXCI9XCIpLmNvbmNhdChvcHRba2V5XSkpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gaXRlbXMuam9pbihcIixcIik7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIEpwU29jaWFsU2hhcmU7XG59KCk7XG5cbl9kZWZpbmVQcm9wZXJ0eShKcFNvY2lhbFNoYXJlLCBcIlNFUlZJQ0VTXCIsIHtcbiAgVFdJVFRFUjogJ3R3aXR0ZXInLFxuICBGQUNFQk9PSzogJ2ZhY2Vib29rJyxcbiAgTElORTogJ2xpbmUnLFxuICBGRUVETFk6ICdmZWVkbHknLFxuICBQT0NLRVQ6ICdwb2NrZXQnLFxuICBIQVRFQlU6ICdoYXRlYnUnXG59KTtcblxuX2RlZmluZVByb3BlcnR5KEpwU29jaWFsU2hhcmUsIFwib3B0XCIsIHZvaWQgMCk7XG5cbl9kZWZpbmVQcm9wZXJ0eShKcFNvY2lhbFNoYXJlLCBcImRlZmF1bHRzXCIsIHtcbiAgLy8gd2luZG93Lm9wZW4oKSDjga7jgqrjg5fjgrfjg6fjg7NcbiAgd2luZG93OiB7XG4gICAgd2lkdGg6IDU1MCxcbiAgICBoZWlnaHQ6IDQ1MCxcbiAgICBwZXJzb25hbGJhcjogMCxcbiAgICB0b29sYmFyOiAwLFxuICAgIHNjcm9sbGJhcnM6IDEsXG4gICAgcmVzaXphYmxlOiAxXG4gIH0sXG4gIC8vIOOCt+OCp+OCoueUqFVSTOOBruODhuODs+ODl+ODrOODvOODiFxuICBzZXJ2aWNlczoge1xuICAgIHR3aXR0ZXI6ICdodHRwOi8vdHdpdHRlci5jb20vc2hhcmU/dXJsPXt7VVJMfX0mdGV4dD17e01FU1NBR0V9fSZ2aWE9e3tBQ0NPVU5UfX0mcmVsYXRlZD17e0ZPTExPV319JyxcbiAgICBmYWNlYm9vazogJ2h0dHA6Ly93d3cuZmFjZWJvb2suY29tL3NoYXJlLnBocD91PXt7VVJMfX0nLFxuICAgIC8vIGxpbmU6ICdsaW5lOi8vbXNnL3RleHQve3tNRVNTQUdFfX0ge3tVUkx9fScsXG4gICAgbGluZTogJ2h0dHBzOi8vc29jaWFsLXBsdWdpbnMubGluZS5tZS9saW5laXQvc2hhcmU/dXJsPXt7VVJMfX0nLFxuICAgIGZlZWRseTogJ2h0dHA6Ly9mZWVkbHkuY29tL2kvc3Vic2NyaXB0aW9uL2ZlZWQve3tVUkx9fScsXG4gICAgcG9ja2V0OiAnaHR0cDovL2dldHBvY2tldC5jb20vZWRpdD91cmw9e3tVUkx9fScsXG4gICAgaGF0ZWJ1OiAnLy9iLmhhdGVuYS5uZS5qcC9hZGQ/bW9kZT1jb25maXJtJnVybD17e1VSTH19JnRpdGxlPXt7TUVTU0FHRX19J1xuICB9XG59KTtcblxuZXhwb3J0IHsgSnBTb2NpYWxTaGFyZSBhcyBkZWZhdWx0IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXBcbiIsImZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHtcbiAgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07XG4gICAgZGVzY3JpcHRvci
205785lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlO1xuICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTtcbiAgICBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7XG4gIGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpO1xuICBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7XG4gIHJldHVybiBDb25zdHJ1Y3Rvcjtcbn1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkge1xuICBpZiAoa2V5IGluIG9iaikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwge1xuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgb2JqW2tleV0gPSB2YWx1ZTtcbiAgfVxuXG4gIHJldHVybiBvYmo7XG59XG5cbmV4cG9ydCB7IF9jbGFzc0NhbGxDaGVjayBhcyBjbGFzc0NhbGxDaGVjaywgX2NyZWF0ZUNsYXNzIGFzIGNyZWF0ZUNsYXNzLCBfZGVmaW5lUHJvcGVydHkgYXMgZGVmaW5lUHJvcGVydHkgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPV9yb2xsdXBQbHVnaW5CYWJlbEhlbHBlcnMuanMubWFwXG4iLCJpbXBvcnQgeyBjcmVhdGVDbGFzcyBhcyBfY3JlYXRlQ2xhc3MsIGNsYXNzQ2FsbENoZWNrIGFzIF9jbGFzc0NhbGxDaGVjaywgZGVmaW5lUHJvcGVydHkgYXMgX2RlZmluZVByb3BlcnR5IH0gZnJvbSAnLi9fdmlydHVhbC9fcm9sbHVwUGx1Z2luQmFiZWxIZWxwZXJzLmpzJztcblxuLyoqXG4gKiBBZGQgc2Nyb2xsaW5nIHN0YXRlKHRvcCAvIG5vdC10b3AgLyBib3R0b20gLyBub3QtYm90dG9tKVxuICpcbiAqIEBhdXRob3IgICBIaXJvc2hpIEZ1a3VkYSA8aW5mby5zeWduYXNAZ21haWwuY29tPlxuICogQGxpY2Vuc2UgIE1JVFxuICovXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIOeKtuaFi+OCkuS7mOS4juOBmeOCi+OBn+OCgeOBrmRhdGHlsZ7mgKdcbnZhciBBVFRSX05BTUUgPSBcImRhdGEtc2Nyb2xsLWFtb3VudFwiOyAvLyDnirbmhYvjga7lkI3liY1cblxudmFyIEFUVFJfVE9QID0gXCJ0b3BcIjtcbnZhciBBVFRSX0JPVFRPTSA9IFwiYm90dG9tXCI7XG52YXIgQVRUUl9OT1RfVE9QID0gXCJub3QtdG9wXCI7XG52YXIgQVRUUl9OT1RfQk9UVE9NID0gXCJub3QtYm90dG9tXCI7XG52YXIgQVRUUl9QT1NJVElPTiA9IFwiZGF0YS1wb3NpdGlvblwiOyAvLyDnm6PoppbnlKjjgqjjg6zjg6Hjg7Pjg4jjga7jg4fjg5Xjgqnjg6vjg4hzdHlsZVxuXG52YXIgQ09NTU9OX1NUWUxFID0ge1xuICBwb3NpdGlvbjogXCJhYnNvbHV0ZVwiLFxuICBsZWZ0OiBcIjBcIlxufTsgLy8gSW50ZXJzZWN0aW9uT2JzZXJ2ZXLjga7oqK3lrppcblxudmFyIE9CU0VSVkVSX09QVCA9IHtcbiAgcm9vdDogbnVsbCxcbiAgcm9vdE1hcmdpbjogXCIwcHhcIixcbiAgdGhyZXNob2xkOiAwXG59OyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxudmFyIFN5Z1Njcm9sbEFtb3VudCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIC8vIHByaXZhdGUgb2JzZXJ2ZXJzOiBJbnRlcnNlY3Rpb25PYnNlcnZlcltdO1xuXG4gIC8qKlxuICAgKiDjgrPjg7Pjgrnjg4jjg6njgq/jgr9cbiAgICogQHBhcmFtIHRhcmdldCBzdHJpbmcg54q25oWL44KS5LuY5LiO44GZ44KL5a++6LGh44Ko44Os44Oh44Oz44OI44Gu44K744Os44Kv44K/5paH5a2X5YiXXG4gICAqL1xuICBmdW5jdGlvbiBTeWdTY3JvbGxBbW91bnQodGFyZ2V0KSB7XG4gICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFN5Z1Njcm9sbEFtb3VudCk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJvcHRcIiwgdm9pZCAwKTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcInRhcmdldHNcIiwgdm9pZCAwKTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImlzVG9wXCIsIHZvaWQgMCk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJpc0JvdHRvbVwiLCB2b2lkIDApO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwibGFzdFN0YXRlXCIsIHZvaWQgMCk7XG5cbiAgICB2YXIgZGVmYXVsdHMgPSB7XG4gICAgICAvLyDmnIDkuIrpg6jjga7jgqrjg5Xjgrvjg4Pjg4hcbiAgICAgIG9mZnNldFRvcDogXCI3MHB4XCIsXG4gICAgICAvLyDmnIDkuIvpg6jjga7jgqrjg5Xjgrvjg4Pjg4hcbiAgICAgIG9mZnNldEJvdHRvbTogXCI3MHB4XCIsXG4gICAgICAvLyDmnIDkuIrpg6jjgavjgrnjgq/jg63jg7zjg6vjgZfjgZ/mmYLjgavlrp/ooYxcbiAgICAgIG9uVG9wOiBmdW5jdGlvbiBvblRvcCgpIHt9LFxuICAgICAgLy8g5pyA5LiK6YOo44GL44KJ6Zui44KM44Gf5pmC44Gr5a6f6KGMXG4gICAgICBvbk5vdFRvcDogZnVuY3Rpb24gb25Ob3RUb3AoKSB7fSxcbiAgICAgIC8vIOacgOS4i+mDqOOBq+OCueOCr+ODreODvOODq+OBl+OBn+aZguOBq+Wun+ihjFxuICAgICAgb25Cb3R0b206IGZ1bmN0aW9uIG9uQm90dG9tKCkge30sXG4gICAgICAvLyDmnIDkuIvpg6jjgYvjgonpm6LjgozjgZ/mmYLjgavlrp/ooYxcbiAgICAgIG9uTm90Qm90dG9tOiBmdW5jdGlvbiBvbk5vdEJvdHRvbSgpIHt9XG4gICAgfTsgLy8g5LiO44GI44KJ44KM44Gf6Kit5a6a44KS6YGp55SoXG5cbiAgICB0aGlzLm9wdCA9IE9iamVjdC5hc3NpZ24oZGVmYXVsdHMsIG9wdGlvbnMpOyAvLyDnirbmhYvku5jkuI7jga7lr77osaFcblxuICAgI
20578HRoaXMudGFyZ2V0cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwodGFyZ2V0KTsgLy8g5LiA55Wq5LiK44Gr44K544Kv44Ot44O844Or44GX44GfXG5cbiAgICB0aGlzLmlzVG9wID0gZmFsc2U7IC8vIOS4gOeVquS4i+OBq+OCueOCr+ODreODvOODq+OBl+OBn1xuXG4gICAgdGhpcy5pc0JvdHRvbSA9IGZhbHNlOyAvLyDmnIDlvozjga7nirbmhYtcblxuICAgIHRoaXMubGFzdFN0YXRlID0gJyc7XG4gICAgdGhpcy5zdGFydCgpO1xuICB9XG4gIC8qKlxuICAgKiDnm6PoppbnlKjjgqjjg6zjg6Hjg7Pjg4jkvZzmiJDjgZfjgabnm6Poppbplovlp4tcbiAgICovXG5cblxuICBfY3JlYXRlQ2xhc3MoU3lnU2Nyb2xsQW1vdW50LCBbe1xuICAgIGtleTogXCJjcmVhdGVPYnNlcnZlRWxlbWVudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjcmVhdGVPYnNlcnZlRWxlbWVudChwb3NpdGlvbikge1xuICAgICAgdmFyIGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgT2JqZWN0LmFzc2lnbihlbGVtZW50LnN0eWxlLCBDT01NT05fU1RZTEUpO1xuICAgICAgZWxlbWVudC5zdHlsZS5oZWlnaHQgPSB0aGlzLm9wdC5vZmZzZXRUb3A7XG4gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShBVFRSX1BPU0lUSU9OLCBwb3NpdGlvbik7XG5cbiAgICAgIGlmIChwb3NpdGlvbiA9PT0gXCJ0b3BcIikge1xuICAgICAgICBlbGVtZW50LnN0eWxlLnRvcCA9IFwiMFwiO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZWxlbWVudC5zdHlsZS5ib3R0b20gPSBcIjBcIjtcbiAgICAgIH0gLy8g44Oa44O844K45pyA5LiL6YOo44Gr6L+95YqgXG5cblxuICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChlbGVtZW50KTtcbiAgICAgIHJldHVybiBlbGVtZW50O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiDjgrnjgq/jg63jg7zjg6vmpJznn6Xlh6bnkIbjgpLplovlp4tcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInN0YXJ0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHN0YXJ0KCkge1xuICAgICAgLy8gPGJvZHk+IOOBqyBwb3NpdGlvbiDoqK3lrppcbiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUucG9zaXRpb24gPSBcInJlbGF0aXZlXCI7IC8vIEludGVyc2VjdGlvbk9ic2VydmVy44KS5L2c5oiQ44GX44Gm55uj6KaW6ZaL5aeLXG5cbiAgICAgIHZhciBvYnNlcnZlciA9IG5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcih0aGlzLm9ic2VydmVyQ2FsbGJhY2suYmluZCh0aGlzKSwgT0JTRVJWRVJfT1BUKTsgLy8g55uj6KaW55So44Ko44Os44Oh44Oz44OI5L2c5oiQXG5cbiAgICAgIG9ic2VydmVyLm9ic2VydmUodGhpcy5jcmVhdGVPYnNlcnZlRWxlbWVudChcInRvcFwiKSk7XG4gICAgICBvYnNlcnZlci5vYnNlcnZlKHRoaXMuY3JlYXRlT2JzZXJ2ZUVsZW1lbnQoXCJib3R0b21cIikpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiDjgrnjgq/jg63jg7zjg6vlh6bnkIZcbiAgICAgKiBJbnRlcnNlY3Rpb25PYnNlcnZlciDjgavlj43lv5zjgZfjgZ8gPGRpdj4g44GMIHRvcC9ib3R0b20g44Gp44Gh44KJ44GL44Gn5Yik5a6a44GZ44KLXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJvYnNlcnZlckNhbGxiYWNrXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG9ic2VydmVyQ2FsbGJhY2soZW50cmllcykge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgZW50cmllcy5mb3JFYWNoKGZ1bmN0aW9uIChlbnRyeSkge1xuICAgICAgICB2Y
20578XIgcG9zaXRpb24gPSBlbnRyeS50YXJnZXQuZ2V0QXR0cmlidXRlKEFUVFJfUE9TSVRJT04pO1xuXG4gICAgICAgIGlmIChwb3NpdGlvbiA9PT0gXCJ0b3BcIikge1xuICAgICAgICAgIF90aGlzLmlzVG9wID0gZW50cnkuaXNJbnRlcnNlY3Rpbmc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgX3RoaXMuaXNCb3R0b20gPSBlbnRyeS5pc0ludGVyc2VjdGluZztcbiAgICAgICAgfVxuICAgICAgfSk7IC8vIOWxnuaAp+OCkuS7mOS4jlxuXG4gICAgICB0aGlzLnNldEF0dHJpYnV0ZSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiDlsZ7mgKfjgpLku5jkuI5cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInNldEF0dHJpYnV0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRBdHRyaWJ1dGUoKSB7XG4gICAgICB2YXIgc3RhdGUgPSBbdGhpcy5pc1RvcCA/IEFUVFJfVE9QIDogQVRUUl9OT1RfVE9QLCB0aGlzLmlzQm90dG9tID8gQVRUUl9CT1RUT00gOiBBVFRSX05PVF9CT1RUT01dLmpvaW4oJyAnKTsgLy8g57WQ5p6c44KSIGRhdGHlsZ7mgKfjgavlj43mmKDjgZnjgotcbiAgICAgIC8vIOWJjeWbnuOBqOWQjOOBmOOBquOCieWPjeaYoOOBl+OBquOBhFxuXG4gICAgICBpZiAoc3RhdGUgIT09IHRoaXMubGFzdFN0YXRlKSB7XG4gICAgICAgIHRoaXMubGFzdFN0YXRlID0gc3RhdGU7XG4gICAgICAgIHRoaXMudGFyZ2V0cy5mb3JFYWNoKGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICAgICAgICB0YXJnZXQuc2V0QXR0cmlidXRlKEFUVFJfTkFNRSwgc3RhdGUpO1xuICAgICAgICB9KTsgLy8g44Kq44OX44K344On44Oz6Zai5pWw44KS5a6f6KGMXG5cbiAgICAgICAgaWYgKHRoaXMuaXNUb3AgJiYgdGhpcy5vcHQub25Ub3ApIHtcbiAgICAgICAgICB0aGlzLm9wdC5vblRvcCgpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMub3B0Lm9uTm90VG9wKSB7XG4gICAgICAgICAgdGhpcy5vcHQub25Ob3RUb3AoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmlzQm90dG9tICYmIHRoaXMub3B0Lm9uQm90dG9tKSB7XG4gICAgICAgICAgdGhpcy5vcHQub25Cb3R0b20oKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLm9wdC5vbk5vdEJvdHRvbSkge1xuICAgICAgICAgIHRoaXMub3B0Lm9uTm90Qm90dG9tKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gU3lnU2Nyb2xsQW1vdW50O1xufSgpO1xuXG5leHBvcnQgeyBTeWdTY3JvbGxBbW91bnQgYXMgZGVmYXVsdCB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwXG4iLCJmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7XG4gIGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldO1xuICAgIGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTtcbiAgICBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7XG4gICAgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykge1xuICBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTtcbiAgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpO1xuICByZXR1cm4gQ29uc3RydWN0b3I7XG59XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHtcbiAgaWYgKGtleSBpbiBvYmopIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHtcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB3cml0YWJsZTogdHJ1ZVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIG9ialtrZXldID0gdmFsdWU7XG4gIH1cblxuICByZXR1cm4gb2JqO1xufVxuXG5leHBvcnQgeyBfY2xhc3NDYWxsQ2hlY2sgYXMgY2xhc3NDYWxsQ2hlY2ssIF9jcmVhdGVDbGFzcyBhcyBjcmVhdGVDbGFzcywgX2RlZmluZVByb3BlcnR5IGFzIGRlZmluZVByb3BlcnR5IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1fcm9sbHVwUGx1Z2luQmFiZWxIZWxwZXJzLmpzLm1hcFxuIiwiaW1wb3J0IHsgY3JlYXRlQ2xhc3MgYXMgX2NyZWF0ZUNsYXNzLCBjbGFzc0NhbGxDaGVjayBhcyBfY2xhc3NDYWxsQ2hlY2ssIGRlZmluZVByb3BlcnR5IGFzIF9kZWZpbmVQcm9wZXJ0eSB9IGZyb20gJy4vX3ZpcnR1YWwvX3JvbGx1cFBsdWdpbkJhYmVsSGVscGVycy5qcyc7XG5cbi8qKlxuICogU2Nyb2xsIGluIHZpZXdwb3J0IGFkZCBkYXRhIGF0dHJpYnV0ZVxuICog44K544Kv44Ot44O844Or44GX44Gm44OT44Ol44O844Od44O844OI44Gr5YWl44Gj44Gf44KJZGF0YeWxnuaAp+OCkuS4juOBiOOCi1xuICpcbiAqIEBhdXRob3IgICBIaXJvc2hpIEZ1a3VkYSA8aW5mby5zeWduYXNAZ21haWwuY29tPlxuICogQGxpY2Vuc2UgIE1JVFxuICovXG52YXIgQVRUUl9JTlZJRVcgPSAnZGF0YS1pbnZpZXcnO1xudmFyIEFUVFJfUk9PVCA9ICdkYXRhLWludmlldy1yb290JztcbnZhciBBVFRSX01BUkdJTiA9ICdkYXRhLWludmlldy1yb290TWFyZ2luJztcbnZhciBBVFRSX1RIUkVTSE9MRCA9ICdkYXRhLWludmlldy10aHJlc2hvbGQnO1xudmFyIERFRkFVTFQgPSB7XG4gIHJvb3Q6IG51bGwsXG4gIHJvb3RNYXJnaW46ICcwcHgnLFxuICB0aHJlc2hvbGQ6IDBcbn07XG4vKipcbiAqIGluIHZpZXcgY29udHJvbGxlclxuICovXG5cbnZhciBfZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIC8qKlxuICAgKiDjgrPjg7Pjgrnjg4jjg6njgq/jgr9cbiAgICog44K/44O844Ky44OD44OI5LiA6Kan44KS57K+5p+744GX44Gm44CBIGRhdGEtaW52aWV3LXJvb3TjgIFkYXRhLWludmlldy1yb290TWFyZ2lu44CBZGF0YS1pbnZpZXctdGhyZXNob2xkIOOBjOioreWumuOBleOCjOOBpuOBhOOBquOBhOOBi+eiuuiqjeOBmeOCi+OAglxuICAgKiDkuIroqJjlsZ7mgKfmr47jgasgb2JzZXJ2ZXIg44KS5L2c5oiQ44GZ44KL44CCXG4gICAqL1xuICBmdW5jdGlvbiBfZGVmYXVsdCh0YXJnZXQpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgdmFyIG9wdGlvbiA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgX2RlZmF1bHQpO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwib25JbnZpZXdGdW5jXCIsIHVuZGVmaW5lZCk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJ0YXJnZXRMaXN0XCIsIHZvaWQgMCk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJvcHRcIiwgdm9pZCAwKTtcblxuICAgI
20578HRoaXMudGFyZ2V0TGlzdCA9IHt9O1xuICAgIHRoaXMub3B0ID0gT2JqZWN0LmFzc2lnbihERUZBVUxULCBvcHRpb24pO1xuICAgIHRoaXMub25JbnZpZXdGdW5jID0gdW5kZWZpbmVkO1xuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwodGFyZ2V0KS5mb3JFYWNoKGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICAgIF90aGlzLmluaXRUYXJnZXRMaXN0KHRhcmdldCk7XG4gICAgfSk7XG4gIH1cbiAgLyoqXG4gICAqIOOCv+ODvOOCsuODg+ODiOOBqOOCquODl+OCt+ODp+ODs+OBrueuoeeQhuODquOCueODiOOCkuS9nOaIkFxuICAgKi9cblxuXG4gIF9jcmVhdGVDbGFzcyhfZGVmYXVsdCwgW3tcbiAgICBrZXk6IFwiaW5pdFRhcmdldExpc3RcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaW5pdFRhcmdldExpc3QodGFyZ2V0KSB7XG4gICAgICAvLyDnm6Poppblr77osaHjgqjjg6zjg6Hjg7Pjg4jjgavni6zoh6rmjIflrprjgYzjgYLjgozjgbDjgZ3jgaHjgonjgpLkvb/jgYbjgIJcbiAgICAgIC8vIOeEoeOBkeOCjOOBsOOCquODl+OCt+ODp+ODs+ioreWumuOCkuS9v+OBhlxuICAgICAgdmFyIHJvb3QgPSB0YXJnZXQuZ2V0QXR0cmlidXRlKEFUVFJfUk9PVCkgfHwgdGhpcy5vcHQucm9vdDtcbiAgICAgIHZhciByb290TWFyZ2luID0gdGFyZ2V0LmdldEF0dHJpYnV0ZShBVFRSX01BUkdJTikgfHwgdGhpcy5vcHQucm9vdE1hcmdpbjtcbiAgICAgIHZhciB0aHJlc2hvbGQgPSBOdW1iZXIodGFyZ2V0LmdldEF0dHJpYnV0ZShBVFRSX1RIUkVTSE9MRCkpIHx8IHRoaXMub3B0LnRocmVzaG9sZDtcbiAgICAgIHZhciBrZXkgPSBcIlwiLmNvbmNhdChyb290LCBcIi1cIikuY29uY2F0KHJvb3RNYXJnaW4sIFwiLVwiKS5jb25jYXQodGhyZXNob2xkKTtcblxuICAgICAgaWYgKGtleSBpbiB0aGlzLnRhcmdldExpc3QgPT09IGZhbHNlKSB7XG4gICAgICAgIHZhciBvcHRpb24gPSB7XG4gICAgICAgICAgcm9vdDogcm9vdCxcbiAgICAgICAgICByb290TWFyZ2luOiByb290TWFyZ2luLFxuICAgICAgICAgIHRocmVzaG9sZDogdGhyZXNob2xkXG4gICAgICAgIH07XG4gICAgICAgIHZhciBvYnNlcnZlciA9IG5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcih0aGlzLm9ic2VydmVyQ2FsbGJhY2suYmluZCh0aGlzKSwgb3B0aW9uKTtcbiAgICAgICAgdGhpcy50YXJnZXRMaXN0W2tleV0gPSB7XG4gICAgICAgICAgbGlzdDogW10sXG4gICAgICAgICAgb2JzZXJ2ZXI6IG9ic2VydmVyXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHRoaXMudGFyZ2V0TGlzdFtrZXldLmxpc3QucHVzaCh0YXJnZXQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiDjgrnjgq/jg63jg7zjg6vmpJznn6Xlh6bnkIbjgpLplovlp4tcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInN0YXJ0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHN0YXJ0KCkge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIE9iamVjdC5rZXlzKHRoaXMudGFyZ2V0TGlzdCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHZhciB0YXJnZXRPYmogPSBfdGhpczIudGFyZ2V0TGlzdFtrZXldO1xuICAgICAgICB0YXJnZXRPYmoubGlzdC5mb3JFYWNoKGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICAgICAgICB0YXJnZXRPYmoub2JzZXJ2ZXIub2JzZXJ2ZSh0YXJnZXQpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiDnlLvpnaLjgavlhaXjgaPjgZ/jgokgQVRUUl9JTlZJRVcg44GuZGF0YeWxnuaAp+OBqyB0cnVlIOOCkuWFpeOCjOOCi+OAglxuICAgICAqIOOCquODluOCtuODvOODkOODvOOBi+OCieebo+imluino+mZpOOBleOCjOOCi+OAglxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwib2JzZXJ2ZXJDYWxsYmFja1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBvYnNlcnZlckNhbGxiYWNrKGVudHJpZXMsIG9ic2VydmVyKSB7XG4gICAgICB2Y
20578XIgX3RoaXMzID0gdGhpcztcblxuICAgICAgZW50cmllcy5mb3JFYWNoKGZ1bmN0aW9uIChlbnRyeSkge1xuICAgICAgICBpZiAoIWVudHJ5LmlzSW50ZXJzZWN0aW5nKSByZXR1cm47IC8vIGludmlld+OBl+OBn+aZguOBq+Wun+ihjOOBmeOCi+WklumDqOmWouaVsFxuXG4gICAgICAgIGlmIChfdGhpczMub25JbnZpZXdGdW5jKSB7XG4gICAgICAgICAgX3RoaXMzLm9uSW52aWV3RnVuYyhlbnRyeS50YXJnZXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgb2JzZXJ2ZXIudW5vYnNlcnZlKGVudHJ5LnRhcmdldCk7XG4gICAgICAgIGVudHJ5LnRhcmdldC5zZXRBdHRyaWJ1dGUoQVRUUl9JTlZJRVcsICd0cnVlJyk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gX2RlZmF1bHQ7XG59KCk7XG5cbmV4cG9ydCB7IF9kZWZhdWx0IGFzIGRlZmF1bHQgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcFxuIiwiaW1wb3J0IHsgZGVmaW5lQ29tcG9uZW50LCBjb21wdXRlZCwgb3BlbkJsb2NrLCBjcmVhdGVFbGVtZW50QmxvY2ssIG5vcm1hbGl6ZUNsYXNzLCBjcmVhdGVFbGVtZW50Vk5vZGUsIHVucmVmLCByZW5kZXJTbG90LCByZWYsIHdhdGNoLCBvbk1vdW50ZWQsIG9uVW5tb3VudGVkLCBjcmVhdGVCbG9jaywgcmVzb2x2ZUR5bmFtaWNDb21wb25lbnQsIHdpdGhDdHgsIEZyYWdtZW50LCByZW5kZXJMaXN0LCBjcmVhdGVDb21tZW50Vk5vZGUgfSBmcm9tICd2dWUnO1xuXG5jb25zdCBfaG9pc3RlZF8xJDEgPSBbXCJ0YXJnZXRcIiwgXCJyZWxcIiwgXCJocmVmXCIsIFwiZGF0YS1hY3RpdmVcIl07XG5jb25zdCBfaG9pc3RlZF8yID0gW1widGFyZ2V0XCIsIFwicmVsXCIsIFwiaHJlZlwiLCBcImRhdGEtYWN0aXZlXCJdO1xuY29uc3QgX3NmY19tYWluJDIgPSAvKiBAX19QVVJFX18gKi8gZGVmaW5lQ29tcG9uZW50KHtcbiAgcHJvcHM6IHtcbiAgICBhY3RpdmVJZDogbnVsbCxcbiAgICBpZDogbnVsbCxcbiAgICBocmVmOiBudWxsLFxuICAgIGlzQmxhbms6IHsgdHlwZTogQm9vbGVhbiB9LFxuICAgIGNsYXNzSXRlbTogbnVsbCxcbiAgICBjbGFzc0xpbms6IG51bGwsXG4gICAgaXNMaXN0VGFnOiB7IHR5cGU6IEJvb2xlYW4gfSxcbiAgICBoYW5kbENsaWNrOiBudWxsXG4gIH0sXG4gIHNldHVwKF9fcHJvcHMpIHtcbiAgICBjb25zdCBwcm9wcyA9IF9fcHJvcHM7XG4gICAgY29uc3QgaXNBY3RpdmUgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICBpZiAocHJvcHMuaHJlZilcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKHByb3BzLmFjdGl2ZUlkID09PSBwcm9wcy5pZClcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSk7XG4gICAgY29uc3QgY2xpY2tMaW5rID0gKGUpID0+IHtcbiAgICAgIGlmIChwcm9wcy5ocmVmKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIHByb3BzLmhhbmRsQ2xpY2socHJvcHMuaWQpO1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH07XG4gICAgcmV0dXJuIChfY3R4LCBfY2FjaGUpID0+IHtcbiAgICAgIHJldHVybiBwcm9wcy5pc0xpc3RUYWcgPyAob3BlbkJsb2NrKCksIGNyZWF0ZUVsZW1lbnRCbG9jayhcImxpXCIsIHtcbiAgICAgICAga2V5OiAwLFxuICAgICAgICBjbGFzczogbm9ybWFsaXplQ2xhc3MocHJvcHMuY2xhc3NJdGVtKVxuICAgICAgfSwgW1xuICAgICAgICBjcmVhdGVFbGVtZW50Vk5vZGUoXCJhXCIsIHtcbiAgICAgICAgICB0YXJnZXQ6IHByb3BzLmlzQmxhbmsgPyBcIl9ibGFua1wiIDogXCJcIixcbiAgICAgICAgICByZWw6IHByb3BzLmlzQmxhbmsgPyBcIm5vb3BlbmVyIG5vcmVmZXJyZXJcIiA6IFwiXCIsXG4gICAgICAgICAgaHJlZjogcHJvcHMuaHJlZixcbiAgICAgICAgICBjbGFzczogbm9ybWFsaXplQ2xhc3MocHJvcHMuY2xhc3NMaW5rKSxcbiAgICAgICAgICBcImRhdGEtYWN0aXZlXCI6IHVucmVmKGlzQWN0aXZlKSA/IFwidHJ1ZVwiIDogXCJcIixcbiAgICAgICAgICBvbkNsaWNrOiBjbGlja0xpbmtcbiAgICAgICAgfSwgW1xuICAgICAgICAgIHJlbmRlclNsb3QoX2N0eC4kc2xvdHMsIFwiZGVmYXVsdFwiKVxuICAgICAgICBdLCAxMCwgX2hvaXN0ZWRfMSQxKVxuICAgICAgXSwgMikpIDogKG9wZW5CbG9jaygpLCBjcmVhdGVFbGVtZW50QmxvY2soXCJhXCIsIHtcbiAgICAgICAga2V5OiAxLFxuICAgICAgICB0YXJnZXQ6IHByb3BzLmlzQmxhbmsgPyBcIl9ibGFua1wiIDogXCJcIixcbiAgICAgICAgcmVsOiBwcm9wcy5pc0JsYW5rID8gXCJub29wZW5lciBub3JlZmVycmVyXCIgOiBcIlwiLFxuICAgICAgICBocmVmOiBwcm9wcy5ocmVmLFxuICAgICAgICBjbGFzczogbm9ybWFsaXplQ2xhc3MocHJvcHMuY2xhc3NMaW5rKSxcbiAgICAgICAgXCJkYXRhLWFjdGl2ZVwiOiB1bnJlZihpc0FjdGl2ZSkgPyBcInRydWVcIiA6IFwiXCIsXG4gICAgICAgIG9uQ2xpY2s6IGNsaWNrTGlua1xuICAgICAgfSwgW1xuICAgICAgICByZW5kZXJTbG90KF9jdHguJHNsb3RzLCBcImRlZmF1bHRcIilcbiAgICAgIF0sIDEwLCBfaG9pc3RlZF8yKSk7XG4gICAgfTtcbiAgfVxufSk7XG5cbmNvbnN0IEVWX0NIQU5HRSA9IFwiY2hhbmdlXCI7XG5jb25zdCBFVl9DTElDSyA9IFwiY2xpY2tcIjtcbmNvbnN0IHRhYkdyb3VwcyA9IHJlZihbXSk7XG5jb25zdCAkX2dldEdyb3VwID0gKGdyb3VwSWQpID0+IHtcbiAgY29uc3QgZ3JvdXAgPSB0YWJHcm91cHMudmFsdWUuZmluZCgoZ3JvdXAyKSA9PiBncm91cDIuZ3JvdXBJZCA9PT0gZ3JvdXBJZCk7XG4gIGlmIChncm91cClcbiAgICByZXR1cm4gZ3JvdXA7XG4gIGNvbnN0IG5ld0dyb3VwID0ge1xuICAgIGdyb3VwSWQsXG4gICAgYWN0aXZlSWQ6IFwiXCIsXG4gICAgdGFiSWRMaXN0OiBbXSxcbiAgICBpbnRlcnZhbElkOiAwLFxuICAgIGV2ZW50czogbmV3IEV2ZW50VGFyZ2V0KClcbiAgfTtcbiAgdGFiR3JvdXBzLnZhbHVlLnB1c2gobmV3R3JvdXApO1xuICByZXR1cm4gdGFiR3JvdXBzLnZhbHVlLmZpbmQoKGdyb3VwMikgPT4gZ3JvdXAyLmdyb3VwSWQgPT09IGdyb3VwSWQpO1xufTtcbmZ1bmN0aW9uIHVzZVRhYkNvbnRyb2woZ3JvdXBJZCwgaXNNYXN0ZXIgPSBmYWxzZSwgdXNlSGFzaCA9IGZhbHNlKSB7XG4gIHJldHVybiAoKCkgPT4ge1xuICAgIGNvbnN0ICRfZ3JvdXAgPSAkX2dldEdyb3VwKGdyb3VwSWQpO1xuICAgIGNvbnN0IGFjdGl2ZUlkID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgcmV0dXJuICRfZ3JvdXAuYWN0aXZlSWQ7XG4gICAgfSk7XG4gICAgY29uc3QgYWN0aXZlSW5kZXggPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICByZXR1cm4gJF9ncm91cC50YWJJZExpc3QuaW5kZXhPZigkX2dyb3VwLmFjdGl2ZUlkKTtcbiAgICB9KTtcbiAgICBjb25zdCBzZXRBY3RpdmVJZCA9IChhY3RpdmVJZD
20578IsIGlzVGFiQ2xpY2sgPSBmYWxzZSkgPT4ge1xuICAgICAgJF9ncm91cC5hY3RpdmVJZCA9IGFjdGl2ZUlkMjtcbiAgICAgIGlmIChpc1RhYkNsaWNrKSB7XG4gICAgICAgIGNvbnN0IGV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KEVWX0NMSUNLLCB7IGRldGFpbDogYWN0aXZlSWQyIH0pO1xuICAgICAgICAkX2dyb3VwLmV2ZW50cy5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGNvbnN0IHNldFRhYklkTGlzdCA9IChpZExpc3QpID0+IHtcbiAgICAgICRfZ3JvdXAudGFiSWRMaXN0ID0gaWRMaXN0O1xuICAgIH07XG4gICAgY29uc3QgY2hhbmdlTmV4dFRhYiA9ICgpID0+IHtcbiAgICAgIGNvbnN0IG5leHRJbmRleCA9IChhY3RpdmVJbmRleC52YWx1ZSArIDEpICUgJF9ncm91cC50YWJJZExpc3QubGVuZ3RoO1xuICAgICAgc2V0QWN0aXZlSWQoJF9ncm91cC50YWJJZExpc3RbbmV4dEluZGV4XSk7XG4gICAgfTtcbiAgICBjb25zdCBjaGFuZ2VQcmV2VGFiID0gKCkgPT4ge1xuICAgICAgY29uc3QgaW5kZXggPSBhY3RpdmVJbmRleC52YWx1ZSAtIDE7XG4gICAgICBjb25zdCBwcmV2SW5kZXggPSBpbmRleCA8PSAtMSA/ICRfZ3JvdXAudGFiSWRMaXN0Lmxlbmd0aCAtIDEgOiBpbmRleDtcbiAgICAgIHNldEFjdGl2ZUlkKCRfZ3JvdXAudGFiSWRMaXN0W3ByZXZJbmRleF0pO1xuICAgIH07XG4gICAgY29uc3QgYWRkQ2hhbmdlTGlzdGVuZXIgPSAoZnVuYykgPT4ge1xuICAgICAgJF9ncm91cC5ldmVudHMuYWRkRXZlbnRMaXN0ZW5lcihFVl9DSEFOR0UsIGZ1bmMpO1xuICAgIH07XG4gICAgY29uc3QgYWRkQ2xpY2tMaXN0ZW5lciA9IChmdW5jKSA9PiB7XG4gICAgICAkX2dyb3VwLmV2ZW50cy5hZGRFdmVudExpc3RlbmVyKEVWX0NMSUNLLCBmdW5jKTtcbiAgICB9O1xuICAgIGNvbnN0IHN0YXJ0QXV0b0NoYW5nZSA9ICh0aW1lKSA9PiB7XG4gICAgICAkX2dyb3VwLmludGVydmFsSWQgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgIGNoYW5nZU5leHRUYWIoKTtcbiAgICAgIH0sIHRpbWUpO1xuICAgIH07XG4gICAgY29uc3Qgc3RvcEF1dG9DaGFuZ2UgPSAoKSA9PiB7XG4gICAgICBjbGVhckludGVydmFsKCRfZ3JvdXAuaW50ZXJ2YWxJZCk7XG4gICAgfTtcbiAgICB3YXRjaChhY3RpdmVJZCwgKCkgPT4ge1xuICAgICAgaWYgKGlzTWFzdGVyKSB7XG4gICAgICAgIGNvbnN0IGV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KEVWX0NIQU5HRSwgeyBkZXRhaWw6IGFjdGl2ZUlkLnZhbHVlIH0pO1xuICAgICAgICAkX2dyb3VwLmV2ZW50cy5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcbiAgICAgIH1cbiAgICAgIGlmICh1c2VIYXNoICYmIGlzTWFzdGVyKSB7XG4gICAgICAgIGxvY2F0aW9uLmhhc2ggPSBhY3RpdmVJZC52YWx1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgYWN0aXZlSWQsXG4gICAgICBhY3RpdmVJbmRleCxcbiAgICAgIHNldEFjdGl2ZUlkLFxuICAgICAgc2V0VGFiSWRMaXN0LFxuICAgICAgY2hhbmdlTmV4dFRhYixcbiAgICAgIGNoYW5nZVByZXZUYWIsXG4gICAgICBzdGFydEF1dG9DaGFuZ2UsXG4gICAgICBzdG9wQXV0b0NoYW5nZSxcbiAgICAgIGFkZENoYW5nZUxpc3RlbmVyLFxuICAgICAgYWRkQ2xpY2tMaXN0ZW5lclxuICAgIH07XG4gIH0pKCk7XG59XG5cbmNvbnN0IF9ob2lzdGVkXzEgPSBbXCJpbm5lckhUTUxcIl07XG5jb25zdCBfc2ZjX21haW4kMSA9IC8qIEBfX1BVUkVfXyAqLyBkZWZpbmVDb21wb25lbnQoe1xuICBwcm9wczoge1xuICAgIGdyb3VwOiBudWxsLFxuICAgIGRlZmF1bHQ6IHsgZGVmYXVsdDogXCJcIiB9LFxuICAgIGl0ZW1zOiBudWxsLFxuICAgIHVzZUhhc2g6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBpc0xpc3RUYWc6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBhdXRvOiBudWxsLFxuICAgIGlzU3RvcEF1dG86IHsgdHlwZTogQm9vbGVhbiB9LFxuICAgIGNsYXNzVGFiczogeyBkZWZhdWx0OiBcImMtdGFibWVudVwiIH0sXG4gICAgY2xhc3NJdGVtOiB7IGRlZmF1bHQ6IFwiYy10YWJtZW51X19pdGVtXCIgfSxcbiAgICBjbGFzc0xpbms6IHsgZGVmYXVsdDogXCJjLXRhYm1lbnVfX2xpbmtcIiB9XG4gIH0sXG4gIHNldHVwKF9fcHJvcHMpIHtcbiAgICBjb25zdCBwcm9wcyA9IF9fcHJvcHM7XG4gICAgY29uc3QgdGFiQ29udHJvbCA9IHVzZVRhYkNvbnRyb2wocHJvcHMuZ3JvdXAsIHRydWUsIHByb3BzLnVzZUhhc2gpO1xuICAgIGNvbnN0IGl0ZW1DbGlja2VkID0gKGlkKSA9PiB7XG4gICAgICBpZiAoaWQgPT09IHRhYkNvbnRyb2wuYWN0aXZlSWQudmFsdWUpXG4gICAgICAgIHJldHVybjtcbiAgICAgIHRhYkNvbnRyb2wuc2V0QWN0aXZlSWQoaWQsIHRydWUpO1xuICAgICAgaWYgKHByb3BzLmlzU3RvcEF1dG8pIHtcbiAgICAgICAgdGFiQ29udHJvbC5zdG9wQXV0b0NoYW5nZSgpO1xuICAgICAgfVxuICAgIH07XG4gICAgb25Nb3VudGVkKCgpID0+IHtcbiAgICAgIGNvbnN0IGlkTGlzdCA9IHByb3BzLml0ZW1zLmZpbHRlcigoaXRlbSkgPT4gaXRlbS5pZCkubWFwKChpdGVtKSA9PiBpdGVtLmlkKTtcbiAgICAgIHRhYkNvbnRyb2wuc2V0VGFiSWRMaXN0KGlkTGlzdCk7XG4gICAgICBpZiAocHJvcHMudXNlSGFzaCAmJiBsb2NhdGlvbi5oYXNoKSB7XG4gICAgICAgIHRhYkNvbnRyb2wuc2V0QWN0aXZlSWQobG9jYXRpb24uaGFzaC5zdWJzdHIoMSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGFiQ29udHJvbC5zZXRBY3RpdmVJZChwcm9wcy5kZWZhdWx0KTtcbiAgICAgIH1cbiAgICAgIGlmIChwcm9wcy5hdXRvICYmIHByb3BzLmF1dG8gPj0gMSkge1xuICAgICAgICB0YWJDb250cm9sLnN0YXJ0QXV0b0NoYW5nZShwcm9wcy5hdXRvKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBvblVubW91bnRlZCgoKSA9PiB7XG4gICAgICB0YWJDb250cm9sLnN0b3BBdXRvQ2hhbmdlKCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIChfY3R4LCBfY2FjaGUpID0+IHtcbiAgICAgIHJldHVybiBvcGVuQmxvY2soKSwgY3JlYXRlQmxvY2socmVzb2x2ZUR5bmFtaWNDb21wb25lbnQocHJvcHMuaXNMaXN0VGFnID8gXCJ1bFwiIDogXCJkaXZcIiksIHtcbiAgICAgICAgY2xhc3M6IG5vcm1hbGl6ZUNsYXNzKHByb3BzLmNsYXNzVGFicylcbiAgICAgIH0sIHtcbiAgICAgICAgZGVmYXVsdDogd2l0aEN0eCgoKSA9PiBbXG4gICAgICAgICAgKG9wZW5CbG9jayh0cnVlKSwgY3JlYXRlRWxlbWVudEJsb2NrKEZyYWdtZW50LCBudWxsLCByZW5kZXJMaXN0KHByb3BzLml0ZW1zLCAoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgI
20578HJldHVybiBvcGVuQmxvY2soKSwgY3JlYXRlQmxvY2soX3NmY19tYWluJDIsIHtcbiAgICAgICAgICAgICAgaWQ6IGl0ZW0uaWQsXG4gICAgICAgICAgICAgIGtleTogaW5kZXgsXG4gICAgICAgICAgICAgIFwiYWN0aXZlLWlkXCI6IHVucmVmKHRhYkNvbnRyb2wpLmFjdGl2ZUlkLnZhbHVlLFxuICAgICAgICAgICAgICBocmVmOiBpdGVtLmhyZWYgfHwgXCJcIixcbiAgICAgICAgICAgICAgXCJpcy1ibGFua1wiOiBpdGVtLmlzQmxhbmsgfHwgZmFsc2UsXG4gICAgICAgICAgICAgIFwiY2xhc3MtaXRlbVwiOiBwcm9wcy5jbGFzc0l0ZW0sXG4gICAgICAgICAgICAgIFwiY2xhc3MtbGlua1wiOiBwcm9wcy5jbGFzc0xpbmssXG4gICAgICAgICAgICAgIFwiaXMtbGlzdC10YWdcIjogcHJvcHMuaXNMaXN0VGFnLFxuICAgICAgICAgICAgICBcImhhbmRsLWNsaWNrXCI6IGl0ZW1DbGlja2VkXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgIGRlZmF1bHQ6IHdpdGhDdHgoKCkgPT4gW1xuICAgICAgICAgICAgICAgIGNyZWF0ZUVsZW1lbnRWTm9kZShcInNwYW5cIiwge1xuICAgICAgICAgICAgICAgICAgaW5uZXJIVE1MOiBpdGVtLnZhbHVlXG4gICAgICAgICAgICAgICAgfSwgbnVsbCwgOCwgX2hvaXN0ZWRfMSlcbiAgICAgICAgICAgICAgXSksXG4gICAgICAgICAgICAgIF86IDJcbiAgICAgICAgICAgIH0sIDEwMzIsIFtcImlkXCIsIFwiYWN0aXZlLWlkXCIsIFwiaHJlZlwiLCBcImlzLWJsYW5rXCIsIFwiY2xhc3MtaXRlbVwiLCBcImNsYXNzLWxpbmtcIiwgXCJpcy1saXN0LXRhZ1wiXSk7XG4gICAgICAgICAgfSksIDEyOCkpXG4gICAgICAgIF0pLFxuICAgICAgICBfOiAxXG4gICAgICB9LCA4LCBbXCJjbGFzc1wiXSk7XG4gICAgfTtcbiAgfVxufSk7XG5cbmNvbnN0IF9zZmNfbWFpbiA9IC8qIEBfX1BVUkVfXyAqLyBkZWZpbmVDb21wb25lbnQoe1xuICBwcm9wczoge1xuICAgIGdyb3VwOiBudWxsLFxuICAgIHRhYklkOiBudWxsLFxuICAgIHRhZzogeyBkZWZhdWx0OiBcImRpdlwiIH1cbiAgfSxcbiAgc2V0dXAoX19wcm9wcykge1xuICAgIGNvbnN0IHByb3BzID0gX19wcm9wcztcbiAgICBjb25zdCB0YWJDb250cm9sID0gdXNlVGFiQ29udHJvbChwcm9wcy5ncm91cCk7XG4gICAgcmV0dXJuIChfY3R4LCBfY2FjaGUpID0+IHtcbiAgICAgIHJldHVybiBwcm9wcy50YWJJZCA9PT0gdW5yZWYodGFiQ29udHJvbCkuYWN0aXZlSWQudmFsdWUgPyAob3BlbkJsb2NrKCksIGNyZWF0ZUJsb2NrKHJlc29sdmVEeW5hbWljQ29tcG9uZW50KHByb3BzLnRhZyksIHsga2V5OiAwIH0sIHtcbiAgICAgICAgZGVmYXVsdDogd2l0aEN0eCgoKSA9PiBbXG4gICAgICAgICAgcmVuZGVyU2xvdChfY3R4LiRzbG90cywgXCJkZWZhdWx0XCIpXG4gICAgICAgIF0pLFxuICAgICAgICBfOiAzXG4gICAgICB9KSkgOiBjcmVhdGVDb21tZW50Vk5vZGUoXCJcIiwgdHJ1ZSk7XG4gICAgfTtcbiAgfVxufSk7XG5cbmV4cG9ydCB7IF9zZmNfbWFpbiQxIGFzIFZ1ZVRhYnMsIF9zZmNfbWFpbiBhcyBWdWVUYWJzQ29udGVudCwgdXNlVGFiQ29udHJvbCB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dnVlLXRhYnMuZXMuanMubWFwXG4iLCIvKipcbiogQHZ1ZS9jb21waWxlci1jb3JlIHYzLjQuMzRcbiogKGMpIDIwMTgtcHJlc2VudCBZdXhpIChFdmFuKSBZb3UgYW5kIFZ1ZSBjb250cmlidXRvcnNcbiogQGxpY2Vuc2UgTUlUXG4qKi9cbmltcG9ydCB7IGlzU3RyaW5nLCBOT09QLCBpc09iamVjdCwgTk8sIGV4dGVuZCwgaXNTeW1ib2wsIGlzQXJyYXksIGNhcGl0YWxpemUsIGNhbWVsaXplLCBFTVBUWV9PQkosIFBhdGNoRmxhZ05hbWVzLCBzbG90RmxhZ3NUZXh0LCBpc09uLCBpc0J1aWx0SW5EaXJlY3RpdmUsIGlzUmVzZXJ2ZWRQcm9wLCB0b0hhbmRsZXJLZXkgfSBmcm9tICdAdnVlL3NoYXJlZCc7XG5leHBvcnQgeyBnZW5lcmF0ZUNvZGVGcmFtZSB9IGZyb20gJ0B2dWUvc2hhcmVkJztcblxuY29uc3QgRlJBR01FTlQgPSBTeW1ib2woISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IGBGcmFnbWVudGAgOiBgYCk7XG5jb25zdCBURUxFUE9SVCA9IFN5bWJvbCghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8gYFRlbGVwb3J0YCA6IGBgKTtcbmNvbnN0IFNVU1BFTlNFID0gU3ltYm9sKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBgU3VzcGVuc2VgIDogYGApO1xuY29uc3QgS0VFUF9BTElWRSA9IFN5bWJvbCghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8gYEtlZXBBbGl2ZWAgOiBgYCk7XG5jb25zdCBCQVNFX1RSQU5TSVRJT04gPSBTeW1ib2woISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IGBCYXNlVHJhbnNpdGlvbmAgOiBgYCk7XG5jb25zdCBPUEVOX0JMT0NLID0gU3ltYm9sKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBgb3BlbkJsb2NrYCA6IGBgKTtcbmNvbnN0IENSRUFURV9CTE9DSyA9IFN5bWJvbCghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8gYGNyZWF0ZUJsb2NrYCA6IGBgKTtcbmNvbnN0IENSRUFURV9FTEVNRU5UX0JMT0NLID0gU3ltYm9sKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBgY3JlYXRlRWxlbWVudEJsb2NrYCA6IGBgKTtcbmNvbnN0IENSRUFURV9WTk9ERSA9IFN5bWJvbCghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8gYGNyZWF0ZVZOb2RlYCA6IGBgKTtcbmNvbnN0IENSRUFURV9FTEVNRU5UX1ZOT0RFID0gU3ltYm9sKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBgY3JlYXRlRWxlbWVudFZOb2RlYCA6IGBgKTtcbmNvbnN0IENSRUFURV9DT01NRU5UID0gU3ltYm9sKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBgY3JlYXRlQ29tbWVudFZOb2RlYCA6IGBgKTtcbmNvbnN0IENSRUFURV9URVhUID0gU3ltYm9sKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBgY3JlYXRlVGV4dFZOb2RlYCA6IGBgKTtcbmNvbnN0IENSRUFURV9TVEFUSUMgPSBTeW1ib2woISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IGBjcmVhdGVTdGF0aWNWTm9kZWAgOiBgYCk7XG5jb25zdCBSRVNPTFZFX0NPTVBPTkVOVCA9IFN5bWJvbCghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9k
20578dWN0aW9uXCIpID8gYHJlc29sdmVDb21wb25lbnRgIDogYGApO1xuY29uc3QgUkVTT0xWRV9EWU5BTUlDX0NPTVBPTkVOVCA9IFN5bWJvbChcbiAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IGByZXNvbHZlRHluYW1pY0NvbXBvbmVudGAgOiBgYFxuKTtcbmNvbnN0IFJFU09MVkVfRElSRUNUSVZFID0gU3ltYm9sKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBgcmVzb2x2ZURpcmVjdGl2ZWAgOiBgYCk7XG5jb25zdCBSRVNPTFZFX0ZJTFRFUiA9IFN5bWJvbCghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8gYHJlc29sdmVGaWx0ZXJgIDogYGApO1xuY29uc3QgV0lUSF9ESVJFQ1RJVkVTID0gU3ltYm9sKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBgd2l0aERpcmVjdGl2ZXNgIDogYGApO1xuY29uc3QgUkVOREVSX0xJU1QgPSBTeW1ib2woISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IGByZW5kZXJMaXN0YCA6IGBgKTtcbmNvbnN0IFJFTkRFUl9TTE9UID0gU3ltYm9sKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBgcmVuZGVyU2xvdGAgOiBgYCk7XG5jb25zdCBDUkVBVEVfU0xPVFMgPSBTeW1ib2woISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IGBjcmVhdGVTbG90c2AgOiBgYCk7XG5jb25zdCBUT19ESVNQTEFZX1NUUklORyA9IFN5bWJvbCghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8gYHRvRGlzcGxheVN0cmluZ2AgOiBgYCk7XG5jb25zdCBNRVJHRV9QUk9QUyA9IFN5bWJvbCghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8gYG1lcmdlUHJvcHNgIDogYGApO1xuY29uc3QgTk9STUFMSVpFX0NMQVNTID0gU3ltYm9sKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBgbm9ybWFsaXplQ2xhc3NgIDogYGApO1xuY29uc3QgTk9STUFMSVpFX1NUWUxFID0gU3ltYm9sKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBgbm9ybWFsaXplU3R5bGVgIDogYGApO1xuY29uc3QgTk9STUFMSVpFX1BST1BTID0gU3ltYm9sKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBgbm9ybWFsaXplUHJvcHNgIDogYGApO1xuY29uc3QgR1VBUkRfUkVBQ1RJVkVfUFJPUFMgPSBTeW1ib2woISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IGBndWFyZFJlYWN0aXZlUHJvcHNgIDogYGApO1xuY29uc3QgVE9fSEFORExFUlMgPSBTeW1ib2woISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IGB0b0hhbmRsZXJzYCA6IGBgKTtcbmNvbnN0IENBTUVMSVpFID0gU3ltYm9sKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBgY2FtZWxpemVgIDogYGApO1xuY29uc3QgQ0FQSVRBTElaRSA9IFN5bWJvbCghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8gYGNhcGl0YWxpemVgIDogYGApO1xuY29uc3QgVE9fSEFORExFUl9LRVkgPSBTeW1ib2woISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IGB0b0hhbmRsZXJLZXlgIDogYGApO1xuY29uc3QgU0VUX0JMT0NLX1RSQUNLSU5HID0gU3ltYm9sKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBgc2V0QmxvY2tUcmFja2luZ2AgOiBgYCk7XG5jb25zdCBQVVNIX1NDT1BFX0lEID0gU3ltYm9sKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBgcHVzaFNjb3BlSWRgIDogYGApO1xuY29uc3QgUE9QX1NDT1BFX0lEID0gU3ltYm9sKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBgcG9wU2NvcGVJZGAgOiBgYCk7XG5jb25zdCBXSVRIX0NUWCA9IFN5bWJvbCghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8gYHdpdGhDdHhgIDogYGApO1xuY29uc3QgVU5SRUYgPSBTeW1ib2woISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IGB1bnJlZmAgOiBgYCk7XG5jb25zdCBJU19SRUYgPSBTeW1ib2woISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IGBpc1JlZmAgOiBgYCk7XG5jb25zdCBXSVRIX01FTU8gPSBTeW1ib2woISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IGB3aXRoTWVtb2AgOiBgYCk7XG5jb25zdCBJU19NRU1PX1NBTUUgPSBTeW1ib2woISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IGBpc01lbW9TYW1lYCA6IGBgKTtcbmNvbnN0IGhlbHBlck5hbWVNYXAgPSB7XG4gIFtGUkFHTUVOVF06IGBGcmFnbWVudGAsXG4gIFtURUxFUE9SVF06IGBUZWxlcG9ydGAsXG4gIFtTVVNQRU5TRV06IGBTdXNwZW5zZWAsXG4gIFtLRUVQX0FMSVZFXTogYEtlZXBBbGl2ZWAsXG4gIFtCQVNFX1RSQU5TSVRJT05dOiBgQmFzZVRyYW5zaXRpb25gLFxuICBbT1BFTl9CTE9DS106IGBvcGVuQmxvY2tgLFxuICBbQ1JFQVRFX0JMT0NLXTogYGNyZWF0ZUJsb2NrYCxcbiAgW0NSRUFURV9FTEVNRU5UX0JMT0NLXTogYGNyZWF0ZUVsZW1lbnRCbG9ja2AsXG4gIFtDUkVBVEVfVk5PREVdOiBgY3JlYXRlVk5vZGVgLFxuICBbQ1JFQVRFX0VMRU1FTlRfVk5PREVdOiBgY3JlYXRlRWxlbWVudFZOb2RlYCxcbiAgW0NSRUFURV9DT01NRU5UXTogYGNyZWF0ZUNvbW1lbnRWTm9kZWAsXG4gIFtDUkVBVEVfVEVYVF06IGBjcmVhdGVUZXh0Vk5vZGVgLFxuICBbQ1JFQVRFX1NUQVRJQ106IGBjcmVhdGVTdGF0aWNWTm9kZWAsXG4gIFtSRVNPTFZFX0NPTVBPTkVOVF06IGByZXNvbHZlQ29tcG9uZW50YCxcbiAgW1JFU09MVkVfRFlOQU1JQ19DT01QT05FTlRdOiBgcmVzb2x2ZUR5bmFtaWNDb21wb25lbnRgLFxuICBbUkVTT0xWRV9ESVJFQ1RJVkVdOi
20578BgcmVzb2x2ZURpcmVjdGl2ZWAsXG4gIFtSRVNPTFZFX0ZJTFRFUl06IGByZXNvbHZlRmlsdGVyYCxcbiAgW1dJVEhfRElSRUNUSVZFU106IGB3aXRoRGlyZWN0aXZlc2AsXG4gIFtSRU5ERVJfTElTVF06IGByZW5kZXJMaXN0YCxcbiAgW1JFTkRFUl9TTE9UXTogYHJlbmRlclNsb3RgLFxuICBbQ1JFQVRFX1NMT1RTXTogYGNyZWF0ZVNsb3RzYCxcbiAgW1RPX0RJU1BMQVlfU1RSSU5HXTogYHRvRGlzcGxheVN0cmluZ2AsXG4gIFtNRVJHRV9QUk9QU106IGBtZXJnZVByb3BzYCxcbiAgW05PUk1BTElaRV9DTEFTU106IGBub3JtYWxpemVDbGFzc2AsXG4gIFtOT1JNQUxJWkVfU1RZTEVdOiBgbm9ybWFsaXplU3R5bGVgLFxuICBbTk9STUFMSVpFX1BST1BTXTogYG5vcm1hbGl6ZVByb3BzYCxcbiAgW0dVQVJEX1JFQUNUSVZFX1BST1BTXTogYGd1YXJkUmVhY3RpdmVQcm9wc2AsXG4gIFtUT19IQU5ETEVSU106IGB0b0hhbmRsZXJzYCxcbiAgW0NBTUVMSVpFXTogYGNhbWVsaXplYCxcbiAgW0NBUElUQUxJWkVdOiBgY2FwaXRhbGl6ZWAsXG4gIFtUT19IQU5ETEVSX0tFWV06IGB0b0hhbmRsZXJLZXlgLFxuICBbU0VUX0JMT0NLX1RSQUNLSU5HXTogYHNldEJsb2NrVHJhY2tpbmdgLFxuICBbUFVTSF9TQ09QRV9JRF06IGBwdXNoU2NvcGVJZGAsXG4gIFtQT1BfU0NPUEVfSURdOiBgcG9wU2NvcGVJZGAsXG4gIFtXSVRIX0NUWF06IGB3aXRoQ3R4YCxcbiAgW1VOUkVGXTogYHVucmVmYCxcbiAgW0lTX1JFRl06IGBpc1JlZmAsXG4gIFtXSVRIX01FTU9dOiBgd2l0aE1lbW9gLFxuICBbSVNfTUVNT19TQU1FXTogYGlzTWVtb1NhbWVgXG59O1xuZnVuY3Rpb24gcmVnaXN0ZXJSdW50aW1lSGVscGVycyhoZWxwZXJzKSB7XG4gIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoaGVscGVycykuZm9yRWFjaCgocykgPT4ge1xuICAgIGhlbHBlck5hbWVNYXBbc10gPSBoZWxwZXJzW3NdO1xuICB9KTtcbn1cblxuY29uc3QgTmFtZXNwYWNlcyA9IHtcbiAgXCJIVE1MXCI6IDAsXG4gIFwiMFwiOiBcIkhUTUxcIixcbiAgXCJTVkdcIjogMSxcbiAgXCIxXCI6IFwiU1ZHXCIsXG4gIFwiTUFUSF9NTFwiOiAyLFxuICBcIjJcIjogXCJNQVRIX01MXCJcbn07XG5jb25zdCBOb2RlVHlwZXMgPSB7XG4gIFwiUk9PVFwiOiAwLFxuICBcIjBcIjogXCJST09UXCIsXG4gIFwiRUxFTUVOVFwiOiAxLFxuICBcIjFcIjogXCJFTEVNRU5UXCIsXG4gIFwiVEVYVFwiOiAyLFxuICBcIjJcIjogXCJURVhUXCIsXG4gIFwiQ09NTUVOVFwiOiAzLFxuICBcIjNcIjogXCJDT01NRU5UXCIsXG4gIFwiU0lNUExFX0VYUFJFU1NJT05cIjogNCxcbiAgXCI0XCI6IFwiU0lNUExFX0VYUFJFU1NJT05cIixcbiAgXCJJTlRFUlBPTEFUSU9OXCI6IDUsXG4gIFwiNVwiOiBcIklOVEVSUE9MQVRJT05cIixcbiAgXCJBVFRSSUJVVEVcIjogNixcbiAgXCI2XCI6IFwiQVRUUklCVVRFXCIsXG4gIFwiRElSRUNUSVZFXCI6IDcsXG4gIFwiN1wiOiBcIkRJUkVDVElWRVwiLFxuICBcIkNPTVBPVU5EX0VYUFJFU1NJT05cIjogOCxcbiAgXCI4XCI6IFwiQ09NUE9VTkRfRVhQUkVTU0lPTlwiLFxuICBcIklGXCI6IDksXG4gIFwiOVwiOiBcIklGXCIsXG4gIFwiSUZfQlJBTkNIXCI6IDEwLFxuICBcIjEwXCI6IFwiSUZfQlJBTkNIXCIsXG4gIFwiRk9SXCI6IDExLFxuICBcIjExXCI6IFwiRk9SXCIsXG4gIFwiVEVYVF9DQUxMXCI6IDEyLFxuICBcIjEyXCI6IFwiVEVYVF9DQUxMXCIsXG4gIFwiVk5PREVfQ0FMTFwiOiAxMyxcbiAgXCIxM1wiOiBcIlZOT0RFX0NBTExcIixcbiAgXCJKU19DQUxMX0VYUFJFU1NJT05cIjogMTQsXG4gIFwiMTRcIjogXCJKU19DQUxMX0VYUFJFU1NJT05cIixcbiAgXCJKU19PQkpFQ1RfRVhQUkVTU0lPTlwiOiAxNSxcbiAgXCIxNVwiOiBcIkpTX09CSkVDVF9FWFBSRVNTSU9OXCIsXG4gIFwiSlNfUFJPUEVSVFlcIjogMTYsXG4gIFwiMTZcIjogXCJKU19QUk9QRVJUWVwiLFxuICBcIkpTX0FSUkFZX0VYUFJFU1NJT05cIjogMTcsXG4gIFwiMTdcIjogXCJKU19BUlJBWV9FWFBSRVNTSU9OXCIsXG4gIFwiSlNfRlVOQ1RJT05fRVhQUkVTU0lPTlwiOiAxOCxcbiAgXCIxOFwiOiBcIkpTX0ZVTkNUSU9OX0VYUFJFU1NJT05cIixcbiAgXCJKU19DT05ESVRJT05BTF9FWFBSRVNTSU9OXCI6IDE5LFxuICBcIjE5XCI6IFwiSlNfQ09ORElUSU9OQUxfRVhQUkVTU0lPTlwiLFxuICBcIkpTX0NBQ0hFX0VYUFJFU1NJT05cIjogMjAsXG4gIFwiMjBcIjogXCJKU19DQUNIRV9FWFBSRVNTSU9OXCIsXG4gIFwiSlNfQkxPQ0tfU1RBVEVNRU5UXCI6IDIxLFxuICBcIjIxXCI6IFwiSlNfQkxPQ0tfU1RBVEVNRU5UXCIsXG4gIFwiSlNfVEVNUExBVEVfTElURVJBTFwiOiAyMixcbiAgXCIyMlwiOiBcIkpTX1RFTVBMQVRFX0xJVEVSQUxcIixcbiAgXCJKU19JRl9TVEFURU1FTlRcIjogMjMsXG4gIFwiMjNcIjogXCJKU19JRl9TVEFURU1FTlRcIixcbiAgXCJKU19BU1NJR05NRU5UX0VYUFJFU1NJT05cIjogMjQsXG4gIFwiMjRcIjogXCJKU19BU1NJR05NRU5UX0VYUFJFU1NJT05cIixcbiAgXCJKU19TRVFVRU5DRV9FWFBSRVNTSU9OXCI6IDI1LFxuICBcIjI1XCI6IFwiSlNfU0VRVUVOQ0VfRVhQUkVTU0lPTlwiLFxuICBcIkpTX1JFVFVSTl9TVEFURU1FTlRcIjogMjYsXG4gIFwiMjZcIjogXCJKU19SRVRVUk5fU1RBVEVNRU5UXCJcbn07XG5jb25zdCBFbGVtZW50VHlwZXMgPSB7XG4gIFwiRUxFTUVOVFwiOiAwLFxuICBcIjBcIjogXCJFTEVNRU5UXCIsXG4gIFwiQ09NUE9ORU5UXCI6IDEsXG4gIFwiMVwiOiBcIkNPTVBPTkVOVFwiLFxuICBcIlNMT1RcIjogMixcbiAgXCIyXCI6IFwiU0xPVFwiLFxuICBcIlRFTVBMQVRFXCI6IDMsXG4gIFwiM1wiOiBcIlRFTVBMQVRFXCJcbn07XG5jb25zdCBDb25zdGFudFR5cGVzID0ge1xuICBcIk5PVF9DT05TVEFOVFwiOiAwLFxuICBcIjBcIjogXCJOT1RfQ09OU1RBTlRcIixcbiAgXCJDQU5fU0tJUF9QQVRDSFwiOiAxLFxuICBcIjFcIjogXCJDQU5fU0tJUF9QQVRDSFwiLFxuICBcIkNBTl9IT0lTVFwiOiAyLFxuICBcIjJcIjogXCJDQU5fSE9JU1RcIixcbiAgXCJDQU5fU1RSSU5HSUZZXCI6IDMsXG4gIFwiM1wiOiBcIkNBTl9TVFJJTkdJRllcIlxufTtcbmNvbnN0IGxvY1N0dWIgPSB7XG4gIHN0YXJ0Oi
20578B7IGxpbmU6IDEsIGNvbHVtbjogMSwgb2Zmc2V0OiAwIH0sXG4gIGVuZDogeyBsaW5lOiAxLCBjb2x1bW46IDEsIG9mZnNldDogMCB9LFxuICBzb3VyY2U6IFwiXCJcbn07XG5mdW5jdGlvbiBjcmVhdGVSb290KGNoaWxkcmVuLCBzb3VyY2UgPSBcIlwiKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogMCxcbiAgICBzb3VyY2UsXG4gICAgY2hpbGRyZW4sXG4gICAgaGVscGVyczogLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKSxcbiAgICBjb21wb25lbnRzOiBbXSxcbiAgICBkaXJlY3RpdmVzOiBbXSxcbiAgICBob2lzdHM6IFtdLFxuICAgIGltcG9ydHM6IFtdLFxuICAgIGNhY2hlZDogMCxcbiAgICB0ZW1wczogMCxcbiAgICBjb2RlZ2VuTm9kZTogdm9pZCAwLFxuICAgIGxvYzogbG9jU3R1YlxuICB9O1xufVxuZnVuY3Rpb24gY3JlYXRlVk5vZGVDYWxsKGNvbnRleHQsIHRhZywgcHJvcHMsIGNoaWxkcmVuLCBwYXRjaEZsYWcsIGR5bmFtaWNQcm9wcywgZGlyZWN0aXZlcywgaXNCbG9jayA9IGZhbHNlLCBkaXNhYmxlVHJhY2tpbmcgPSBmYWxzZSwgaXNDb21wb25lbnQgPSBmYWxzZSwgbG9jID0gbG9jU3R1Yikge1xuICBpZiAoY29udGV4dCkge1xuICAgIGlmIChpc0Jsb2NrKSB7XG4gICAgICBjb250ZXh0LmhlbHBlcihPUEVOX0JMT0NLKTtcbiAgICAgIGNvbnRleHQuaGVscGVyKGdldFZOb2RlQmxvY2tIZWxwZXIoY29udGV4dC5pblNTUiwgaXNDb21wb25lbnQpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29udGV4dC5oZWxwZXIoZ2V0Vk5vZGVIZWxwZXIoY29udGV4dC5pblNTUiwgaXNDb21wb25lbnQpKTtcbiAgICB9XG4gICAgaWYgKGRpcmVjdGl2ZXMpIHtcbiAgICAgIGNvbnRleHQuaGVscGVyKFdJVEhfRElSRUNUSVZFUyk7XG4gICAgfVxuICB9XG4gIHJldHVybiB7XG4gICAgdHlwZTogMTMsXG4gICAgdGFnLFxuICAgIHByb3BzLFxuICAgIGNoaWxkcmVuLFxuICAgIHBhdGNoRmxhZyxcbiAgICBkeW5hbWljUHJvcHMsXG4gICAgZGlyZWN0aXZlcyxcbiAgICBpc0Jsb2NrLFxuICAgIGRpc2FibGVUcmFja2luZyxcbiAgICBpc0NvbXBvbmVudCxcbiAgICBsb2NcbiAgfTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUFycmF5RXhwcmVzc2lvbihlbGVtZW50cywgbG9jID0gbG9jU3R1Yikge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IDE3LFxuICAgIGxvYyxcbiAgICBlbGVtZW50c1xuICB9O1xufVxuZnVuY3Rpb24gY3JlYXRlT2JqZWN0RXhwcmVzc2lvbihwcm9wZXJ0aWVzLCBsb2MgPSBsb2NTdHViKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogMTUsXG4gICAgbG9jLFxuICAgIHByb3BlcnRpZXNcbiAgfTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZU9iamVjdFByb3BlcnR5KGtleSwgdmFsdWUpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAxNixcbiAgICBsb2M6IGxvY1N0dWIsXG4gICAga2V5OiBpc1N0cmluZyhrZXkpID8gY3JlYXRlU2ltcGxlRXhwcmVzc2lvbihrZXksIHRydWUpIDoga2V5LFxuICAgIHZhbHVlXG4gIH07XG59XG5mdW5jdGlvbiBjcmVhdGVTaW1wbGVFeHByZXNzaW9uKGNvbnRlbnQsIGlzU3RhdGljID0gZmFsc2UsIGxvYyA9IGxvY1N0dWIsIGNvbnN0VHlwZSA9IDApIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiA0LFxuICAgIGxvYyxcbiAgICBjb250ZW50LFxuICAgIGlzU3RhdGljLFxuICAgIGNvbnN0VHlwZTogaXNTdGF0aWMgPyAzIDogY29uc3RUeXBlXG4gIH07XG59XG5mdW5jdGlvbiBjcmVhdGVJbnRlcnBvbGF0aW9uKGNvbnRlbnQsIGxvYykge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IDUsXG4gICAgbG9jLFxuICAgIGNvbnRlbnQ6IGlzU3RyaW5nKGNvbnRlbnQpID8gY3JlYXRlU2ltcGxlRXhwcmVzc2lvbihjb250ZW50LCBmYWxzZSwgbG9jKSA6IGNvbnRlbnRcbiAgfTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUNvbXBvdW5kRXhwcmVzc2lvbihjaGlsZHJlbiwgbG9jID0gbG9jU3R1Yikge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IDgsXG4gICAgbG9jLFxuICAgIGNoaWxkcmVuXG4gIH07XG59XG5mdW5jdGlvbiBjcmVhdGVDYWxsRXhwcmVzc2lvbihjYWxsZWUsIGFyZ3MgPSBbXSwgbG9jID0gbG9jU3R1Yikge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IDE0LFxuICAgIGxvYyxcbiAgICBjYWxsZWUsXG4gICAgYXJndW1lbnRzOiBhcmdzXG4gIH07XG59XG5mdW5jdGlvbiBjcmVhdGVGdW5jdGlvbkV4cHJlc3Npb24ocGFyYW1zLCByZXR1cm5zID0gdm9pZCAwLCBuZXdsaW5lID0gZmFsc2UsIGlzU2xvdCA9IGZhbHNlLCBsb2MgPSBsb2NTdHViKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogMTgsXG4gICAgcGFyYW1zLFxuICAgIHJldHVybnMsXG4gICAgbmV3bGluZSxcbiAgICBpc1Nsb3QsXG4gICAgbG9jXG4gIH07XG59XG5mdW5jdGlvbiBjcmVhdGVDb25kaXRpb25hbEV4cHJlc3Npb24odGVzdCwgY29uc2VxdWVudCwgYWx0ZXJuYXRlLCBuZXdsaW5lID0gdHJ1ZSkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IDE5LFxuICAgIHRlc3QsXG4gICAgY29uc2VxdWVudCxcbiAgICBhbHRlcm5hdGUsXG4gICAgbmV3bGluZSxcbiAgICBsb2M6IGxvY1N0dWJcbiAgfTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUNhY2hlRXhwcmVzc2lvbihpbmRleCwgdmFsdWUsIGlzVk9uY2UgPSBmYWxzZSkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IDIwLFxuICAgIGluZGV4LFxuICAgIHZhbHVlLFxuICAgIGlzVk9uY2UsXG4gICAgbG9jOiBsb2NTdHViXG4gIH07XG59XG5mdW5jdGlvbiBjcmVhdGVCbG9ja1N0YXRlbWVudChib2R5KSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogMjEsXG4gICAgYm9keSxcbiAgICBsb2M6IGxvY1N0dWJcbiAgfTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVRlbXBsYXRlTGl0ZXJhbChlbGVtZW50cykge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IDIyLFxuICAgIGVsZW1lbnRzLFxuICAgIGxvYzogbG9jU3R1YlxuICB9O1xufVxuZnVuY3Rpb24gY3JlYXRlSWZTdGF0ZW1lbnQodGVzdCwgY29uc2VxdWVudCwgYWx0ZXJuYXRlKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogMjMsXG4gICAgdGVzdCxcbiAgICBjb25zZXF1ZW50LFxuICAgIGFsdGVybmF0ZSxcbiAgICBsb2M6IGxvY1N0dWJcbiAgfTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUFzc2lnbm1lbnRFeHByZXNzaW9uKGxlZnQsIHJpZ2h0KSB7XG4gIHJldHVybi
20578B7XG4gICAgdHlwZTogMjQsXG4gICAgbGVmdCxcbiAgICByaWdodCxcbiAgICBsb2M6IGxvY1N0dWJcbiAgfTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVNlcXVlbmNlRXhwcmVzc2lvbihleHByZXNzaW9ucykge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IDI1LFxuICAgIGV4cHJlc3Npb25zLFxuICAgIGxvYzogbG9jU3R1YlxuICB9O1xufVxuZnVuY3Rpb24gY3JlYXRlUmV0dXJuU3RhdGVtZW50KHJldHVybnMpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAyNixcbiAgICByZXR1cm5zLFxuICAgIGxvYzogbG9jU3R1YlxuICB9O1xufVxuZnVuY3Rpb24gZ2V0Vk5vZGVIZWxwZXIoc3NyLCBpc0NvbXBvbmVudCkge1xuICByZXR1cm4gc3NyIHx8IGlzQ29tcG9uZW50ID8gQ1JFQVRFX1ZOT0RFIDogQ1JFQVRFX0VMRU1FTlRfVk5PREU7XG59XG5mdW5jdGlvbiBnZXRWTm9kZUJsb2NrSGVscGVyKHNzciwgaXNDb21wb25lbnQpIHtcbiAgcmV0dXJuIHNzciB8fCBpc0NvbXBvbmVudCA/IENSRUFURV9CTE9DSyA6IENSRUFURV9FTEVNRU5UX0JMT0NLO1xufVxuZnVuY3Rpb24gY29udmVydFRvQmxvY2sobm9kZSwgeyBoZWxwZXIsIHJlbW92ZUhlbHBlciwgaW5TU1IgfSkge1xuICBpZiAoIW5vZGUuaXNCbG9jaykge1xuICAgIG5vZGUuaXNCbG9jayA9IHRydWU7XG4gICAgcmVtb3ZlSGVscGVyKGdldFZOb2RlSGVscGVyKGluU1NSLCBub2RlLmlzQ29tcG9uZW50KSk7XG4gICAgaGVscGVyKE9QRU5fQkxPQ0spO1xuICAgIGhlbHBlcihnZXRWTm9kZUJsb2NrSGVscGVyKGluU1NSLCBub2RlLmlzQ29tcG9uZW50KSk7XG4gIH1cbn1cblxuY29uc3QgZGVmYXVsdERlbGltaXRlcnNPcGVuID0gbmV3IFVpbnQ4QXJyYXkoWzEyMywgMTIzXSk7XG5jb25zdCBkZWZhdWx0RGVsaW1pdGVyc0Nsb3NlID0gbmV3IFVpbnQ4QXJyYXkoWzEyNSwgMTI1XSk7XG5mdW5jdGlvbiBpc1RhZ1N0YXJ0Q2hhcihjKSB7XG4gIHJldHVybiBjID49IDk3ICYmIGMgPD0gMTIyIHx8IGMgPj0gNjUgJiYgYyA8PSA5MDtcbn1cbmZ1bmN0aW9uIGlzV2hpdGVzcGFjZShjKSB7XG4gIHJldHVybiBjID09PSAzMiB8fCBjID09PSAxMCB8fCBjID09PSA5IHx8IGMgPT09IDEyIHx8IGMgPT09IDEzO1xufVxuZnVuY3Rpb24gaXNFbmRPZlRhZ1NlY3Rpb24oYykge1xuICByZXR1cm4gYyA9PT0gNDcgfHwgYyA9PT0gNjIgfHwgaXNXaGl0ZXNwYWNlKGMpO1xufVxuZnVuY3Rpb24gdG9DaGFyQ29kZXMoc3RyKSB7XG4gIGNvbnN0IHJldCA9IG5ldyBVaW50OEFycmF5KHN0ci5sZW5ndGgpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgIHJldFtpXSA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuICB9XG4gIHJldHVybiByZXQ7XG59XG5jb25zdCBTZXF1ZW5jZXMgPSB7XG4gIENkYXRhOiBuZXcgVWludDhBcnJheShbNjcsIDY4LCA2NSwgODQsIDY1LCA5MV0pLFxuICAvLyBDREFUQVtcbiAgQ2RhdGFFbmQ6IG5ldyBVaW50OEFycmF5KFs5MywgOTMsIDYyXSksXG4gIC8vIF1dPlxuICBDb21tZW50RW5kOiBuZXcgVWludDhBcnJheShbNDUsIDQ1LCA2Ml0pLFxuICAvLyBgLS0+YFxuICBTY3JpcHRFbmQ6IG5ldyBVaW50OEFycmF5KFs2MCwgNDcsIDExNSwgOTksIDExNCwgMTA1LCAxMTIsIDExNl0pLFxuICAvLyBgPFxcL3NjcmlwdGBcbiAgU3R5bGVFbmQ6IG5ldyBVaW50OEFycmF5KFs2MCwgNDcsIDExNSwgMTE2LCAxMjEsIDEwOCwgMTAxXSksXG4gIC8vIGA8L3N0eWxlYFxuICBUaXRsZUVuZDogbmV3IFVpbnQ4QXJyYXkoWzYwLCA0NywgMTE2LCAxMDUsIDExNiwgMTA4LCAxMDFdKSxcbiAgLy8gYDwvdGl0bGVgXG4gIFRleHRhcmVhRW5kOiBuZXcgVWludDhBcnJheShbXG4gICAgNjAsXG4gICAgNDcsXG4gICAgMTE2LFxuICAgIDEwMSxcbiAgICAxMjAsXG4gICAgMTE2LFxuICAgIDk3LFxuICAgIDExNCxcbiAgICAxMDEsXG4gICAgOTdcbiAgXSlcbiAgLy8gYDwvdGV4dGFyZWFcbn07XG5jbGFzcyBUb2tlbml6ZXIge1xuICBjb25zdHJ1Y3RvcihzdGFjaywgY2JzKSB7XG4gICAgdGhpcy5zdGFjayA9IHN0YWNrO1xuICAgIHRoaXMuY2JzID0gY2JzO1xuICAgIC8qKiBUaGUgY3VycmVudCBzdGF0ZSB0aGUgdG9rZW5pemVyIGlzIGluLiAqL1xuICAgIHRoaXMuc3RhdGUgPSAxO1xuICAgIC8qKiBUaGUgcmVhZCBidWZmZXIuICovXG4gICAgdGhpcy5idWZmZXIgPSBcIlwiO1xuICAgIC8qKiBUaGUgYmVnaW5uaW5nIG9mIHRoZSBzZWN0aW9uIHRoYXQgaXMgY3VycmVudGx5IGJlaW5nIHJlYWQuICovXG4gICAgdGhpcy5zZWN0aW9uU3RhcnQgPSAwO1xuICAgIC8qKiBUaGUgaW5kZXggd2l0aGluIHRoZSBidWZmZXIgdGhhdCB3ZSBhcmUgY3VycmVudGx5IGxvb2tpbmcgYXQuICovXG4gICAgdGhpcy5pbmRleCA9IDA7XG4gICAgLyoqIFRoZSBzdGFydCBvZiB0aGUgbGFzdCBlbnRpdHkuICovXG4gICAgdGhpcy5lbnRpdHlTdGFydCA9IDA7XG4gICAgLyoqIFNvbWUgYmVoYXZpb3IsIGVnLiB3aGVuIGRlY29kaW5nIGVudGl0aWVzLCBpcyBkb25lIHdoaWxlIHdlIGFyZSBpbiBhbm90aGVyIHN0YXRlLiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvdGhlciBzdGF0ZSB0eXBlLiAqL1xuICAgIHRoaXMuYmFzZVN0YXRlID0gMTtcbiAgICAvKiogRm9yIHNwZWNpYWwgcGFyc2luZyBiZWhhdmlvciBpbnNpZGUgb2Ygc2NyaXB0IGFuZCBzdHlsZSB0YWdzLiAqL1xuICAgIHRoaXMuaW5SQ0RBVEEgPSBmYWxzZTtcbiAgICAvKiogRm9yIGRpc2FibGluZyBSQ0RBVEEgdGFncyBoYW5kbGluZyAqL1xuICAgIHRoaXMuaW5YTUwgPSBmYWxzZTtcbiAgICAvKiogRm9yIGRpc2FibGluZyBpbnRlcnBvbGF0aW9uIHBhcnNpbmcgaW4gdi1wcmUgKi9cbiAgICB0aGlzLmluVlByZSA9IGZhbHNlO1xuICAgIC8qKiBSZWNvcmQgbmV3bGluZSBwb3NpdGlvbnMgZm9yIGZhc3QgbGluZSAvIGNvbHVtbiBjYWxjdWxhdGlvbiAqL1xuICAgIHRoaXMubmV3bGluZXMgPSBbXTtcbiAgICB0aGlzLm1vZGUgPSAwO1xuICAgIHRoaXMuZGVsaW1pdGVyT3BlbiA9IGRlZmF1bHREZWxpbWl0ZXJzT3BlbjtcbiAgICB0aGlzLmRlbGltaXRlckNsb3NlID0gZGVmYXVsdERlbGltaXRlcnNDbG9zZTtcbiAgICB0aGlzLmRlbGltaXRlckluZGV4ID0gLTE7XG4gICAgdGhpcy5jdXJyZW50U2VxdWVuY2UgPSB2b2lkIDA7XG4gICAgdGhpcy5zZXF1ZW5jZUluZGV4ID0gMDtcbiAgfVxuICBnZXQgaW5TRkNSb290KCkge1xuICAgIHJldHVybi
20578B0aGlzLm1vZGUgPT09IDIgJiYgdGhpcy5zdGFjay5sZW5ndGggPT09IDA7XG4gIH1cbiAgcmVzZXQoKSB7XG4gICAgdGhpcy5zdGF0ZSA9IDE7XG4gICAgdGhpcy5tb2RlID0gMDtcbiAgICB0aGlzLmJ1ZmZlciA9IFwiXCI7XG4gICAgdGhpcy5zZWN0aW9uU3RhcnQgPSAwO1xuICAgIHRoaXMuaW5kZXggPSAwO1xuICAgIHRoaXMuYmFzZVN0YXRlID0gMTtcbiAgICB0aGlzLmluUkNEQVRBID0gZmFsc2U7XG4gICAgdGhpcy5jdXJyZW50U2VxdWVuY2UgPSB2b2lkIDA7XG4gICAgdGhpcy5uZXdsaW5lcy5sZW5ndGggPSAwO1xuICAgIHRoaXMuZGVsaW1pdGVyT3BlbiA9IGRlZmF1bHREZWxpbWl0ZXJzT3BlbjtcbiAgICB0aGlzLmRlbGltaXRlckNsb3NlID0gZGVmYXVsdERlbGltaXRlcnNDbG9zZTtcbiAgfVxuICAvKipcbiAgICogR2VuZXJhdGUgUG9zaXRpb24gb2JqZWN0IHdpdGggbGluZSAvIGNvbHVtbiBpbmZvcm1hdGlvbiB1c2luZyByZWNvcmRlZFxuICAgKiBuZXdsaW5lIHBvc2l0aW9ucy4gV2Uga25vdyB0aGUgaW5kZXggaXMgYWx3YXlzIGdvaW5nIHRvIGJlIGFuIGFscmVhZHlcbiAgICogcHJvY2Vzc2VkIGluZGV4LCBzbyBhbGwgdGhlIG5ld2xpbmVzIHVwIHRvIHRoaXMgaW5kZXggc2hvdWxkIGhhdmUgYmVlblxuICAgKiByZWNvcmRlZC5cbiAgICovXG4gIGdldFBvcyhpbmRleCkge1xuICAgIGxldCBsaW5lID0gMTtcbiAgICBsZXQgY29sdW1uID0gaW5kZXggKyAxO1xuICAgIGZvciAobGV0IGkgPSB0aGlzLm5ld2xpbmVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBjb25zdCBuZXdsaW5lSW5kZXggPSB0aGlzLm5ld2xpbmVzW2ldO1xuICAgICAgaWYgKGluZGV4ID4gbmV3bGluZUluZGV4KSB7XG4gICAgICAgIGxpbmUgPSBpICsgMjtcbiAgICAgICAgY29sdW1uID0gaW5kZXggLSBuZXdsaW5lSW5kZXg7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgY29sdW1uLFxuICAgICAgbGluZSxcbiAgICAgIG9mZnNldDogaW5kZXhcbiAgICB9O1xuICB9XG4gIHBlZWsoKSB7XG4gICAgcmV0dXJuIHRoaXMuYnVmZmVyLmNoYXJDb2RlQXQodGhpcy5pbmRleCArIDEpO1xuICB9XG4gIHN0YXRlVGV4dChjKSB7XG4gICAgaWYgKGMgPT09IDYwKSB7XG4gICAgICBpZiAodGhpcy5pbmRleCA+IHRoaXMuc2VjdGlvblN0YXJ0KSB7XG4gICAgICAgIHRoaXMuY2JzLm9udGV4dCh0aGlzLnNlY3Rpb25TdGFydCwgdGhpcy5pbmRleCk7XG4gICAgICB9XG4gICAgICB0aGlzLnN0YXRlID0gNTtcbiAgICAgIHRoaXMuc2VjdGlvblN0YXJ0ID0gdGhpcy5pbmRleDtcbiAgICB9IGVsc2UgaWYgKCF0aGlzLmluVlByZSAmJiBjID09PSB0aGlzLmRlbGltaXRlck9wZW5bMF0pIHtcbiAgICAgIHRoaXMuc3RhdGUgPSAyO1xuICAgICAgdGhpcy5kZWxpbWl0ZXJJbmRleCA9IDA7XG4gICAgICB0aGlzLnN0YXRlSW50ZXJwb2xhdGlvbk9wZW4oYyk7XG4gICAgfVxuICB9XG4gIHN0YXRlSW50ZXJwb2xhdGlvbk9wZW4oYykge1xuICAgIGlmIChjID09PSB0aGlzLmRlbGltaXRlck9wZW5bdGhpcy5kZWxpbWl0ZXJJbmRleF0pIHtcbiAgICAgIGlmICh0aGlzLmRlbGltaXRlckluZGV4ID09PSB0aGlzLmRlbGltaXRlck9wZW4ubGVuZ3RoIC0gMSkge1xuICAgICAgICBjb25zdCBzdGFydCA9IHRoaXMuaW5kZXggKyAxIC0gdGhpcy5kZWxpbWl0ZXJPcGVuLmxlbmd0aDtcbiAgICAgICAgaWYgKHN0YXJ0ID4gdGhpcy5zZWN0aW9uU3RhcnQpIHtcbiAgICAgICAgICB0aGlzLmNicy5vbnRleHQodGhpcy5zZWN0aW9uU3RhcnQsIHN0YXJ0KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnN0YXRlID0gMztcbiAgICAgICAgdGhpcy5zZWN0aW9uU3RhcnQgPSBzdGFydDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZGVsaW1pdGVySW5kZXgrKztcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMuaW5SQ0RBVEEpIHtcbiAgICAgIHRoaXMuc3RhdGUgPSAzMjtcbiAgICAgIHRoaXMuc3RhdGVJblJDREFUQShjKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zdGF0ZSA9IDE7XG4gICAgICB0aGlzLnN0YXRlVGV4dChjKTtcbiAgICB9XG4gIH1cbiAgc3RhdGVJbnRlcnBvbGF0aW9uKGMpIHtcbiAgICBpZiAoYyA9PT0gdGhpcy5kZWxpbWl0ZXJDbG9zZVswXSkge1xuICAgICAgdGhpcy5zdGF0ZSA9IDQ7XG4gICAgICB0aGlzLmRlbGltaXRlckluZGV4ID0gMDtcbiAgICAgIHRoaXMuc3RhdGVJbnRlcnBvbGF0aW9uQ2xvc2UoYyk7XG4gICAgfVxuICB9XG4gIHN0YXRlSW50ZXJwb2xhdGlvbkNsb3NlKGMpIHtcbiAgICBpZiAoYyA9PT0gdGhpcy5kZWxpbWl0ZXJDbG9zZVt0aGlzLmRlbGltaXRlckluZGV4XSkge1xuICAgICAgaWYgKHRoaXMuZGVsaW1pdGVySW5kZXggPT09IHRoaXMuZGVsaW1pdGVyQ2xvc2UubGVuZ3RoIC0gMSkge1xuICAgICAgICB0aGlzLmNicy5vbmludGVycG9sYXRpb24odGhpcy5zZWN0aW9uU3RhcnQsIHRoaXMuaW5kZXggKyAxKTtcbiAgICAgICAgaWYgKHRoaXMuaW5SQ0RBVEEpIHtcbiAgICAgICAgICB0aGlzLnN0YXRlID0gMzI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5zdGF0ZSA9IDE7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZWN0aW9uU3RhcnQgPSB0aGlzLmluZGV4ICsgMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZGVsaW1pdGVySW5kZXgrKztcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zdGF0ZSA9IDM7XG4gICAgICB0aGlzLnN0YXRlSW50ZXJwb2xhdGlvbihjKTtcbiAgICB9XG4gIH1cbiAgc3RhdGVTcGVjaWFsU3RhcnRTZXF1ZW5jZShjKSB7XG4gICAgY29uc3QgaXNFbmQgPSB0aGlzLnNlcXVlbmNlSW5kZXggPT09IHRoaXMuY3VycmVudFNlcXVlbmNlLmxlbmd0aDtcbiAgICBjb25zdCBpc01hdGNoID0gaXNFbmQgPyAoXG4gICAgICAvLyBJZiB3ZSBhcmUgYXQgdGhlIGVuZCBvZiB0aGUgc2VxdWVuY2UsIG1ha2Ugc3VyZSB0aGUgdGFnIG5hbWUgaGFzIGVuZGVkXG4gICAgICBpc0VuZE9mVGFnU2VjdGlvbihjKVxuICAgICkgOiAoXG4gICAgICAvLyBPdGhlcndpc2UsIGRvIGEgY2FzZS1pbnNlbnNpdGl2ZSBjb21wYXJpc29uXG4gICAgICAoYyB8IDMyKSA9PT0gdGhpcy5jdXJyZW50U2VxdWVuY2VbdGhpcy5zZXF1ZW5jZUluZGV4XVxuICAgICk7XG4gICAgaWYgKCFpc01hdGNoKSB7XG4gICAgICB0aGlzLmluUkNEQVRBID0gZmFsc2U7XG4gICAgfSBlbHNlIGlmICghaXNFbmQpIHtcbiAgICAgIHRoaXMuc2VxdWVuY2VJbmRleCsrO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnNlcXVlbmNlSW5kZXggPSAwO1xuICAgIHRoaXMuc3RhdGUgPSA2O1xuICAgIHRoaXMuc3RhdGVJblRhZ05hbWUoYyk7XG4gIH1cbiAgLyoqIExvb2sgZm9yIGFuIGVuZCB0YWcuIEZvciA8dGl0bGU+IGFuZCA8dGV4dGFyZWE+LCBhbHNvIGRlY29kZSBlbnRpdGllcy4gKi9cbiAgc3RhdGVJblJDREFUQShjKSB7XG4gICAgaWYgKHRoaXMuc2VxdWVuY2VJbmRleCA9PT0gdGhpcy5jdXJyZW50U2VxdWVuY2UubGVuZ3RoKSB7XG4gICAgICBpZiAoYyA9PT0gNjIgfHwgaXNXaGl0ZXNwYWNl
20578KGMpKSB7XG4gICAgICAgIGNvbnN0IGVuZE9mVGV4dCA9IHRoaXMuaW5kZXggLSB0aGlzLmN1cnJlbnRTZXF1ZW5jZS5sZW5ndGg7XG4gICAgICAgIGlmICh0aGlzLnNlY3Rpb25TdGFydCA8IGVuZE9mVGV4dCkge1xuICAgICAgICAgIGNvbnN0IGFjdHVhbEluZGV4ID0gdGhpcy5pbmRleDtcbiAgICAgICAgICB0aGlzLmluZGV4ID0gZW5kT2ZUZXh0O1xuICAgICAgICAgIHRoaXMuY2JzLm9udGV4dCh0aGlzLnNlY3Rpb25TdGFydCwgZW5kT2ZUZXh0KTtcbiAgICAgICAgICB0aGlzLmluZGV4ID0gYWN0dWFsSW5kZXg7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZWN0aW9uU3RhcnQgPSBlbmRPZlRleHQgKyAyO1xuICAgICAgICB0aGlzLnN0YXRlSW5DbG9zaW5nVGFnTmFtZShjKTtcbiAgICAgICAgdGhpcy5pblJDREFUQSA9IGZhbHNlO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLnNlcXVlbmNlSW5kZXggPSAwO1xuICAgIH1cbiAgICBpZiAoKGMgfCAzMikgPT09IHRoaXMuY3VycmVudFNlcXVlbmNlW3RoaXMuc2VxdWVuY2VJbmRleF0pIHtcbiAgICAgIHRoaXMuc2VxdWVuY2VJbmRleCArPSAxO1xuICAgIH0gZWxzZSBpZiAodGhpcy5zZXF1ZW5jZUluZGV4ID09PSAwKSB7XG4gICAgICBpZiAodGhpcy5jdXJyZW50U2VxdWVuY2UgPT09IFNlcXVlbmNlcy5UaXRsZUVuZCB8fCB0aGlzLmN1cnJlbnRTZXF1ZW5jZSA9PT0gU2VxdWVuY2VzLlRleHRhcmVhRW5kICYmICF0aGlzLmluU0ZDUm9vdCkge1xuICAgICAgICBpZiAoYyA9PT0gdGhpcy5kZWxpbWl0ZXJPcGVuWzBdKSB7XG4gICAgICAgICAgdGhpcy5zdGF0ZSA9IDI7XG4gICAgICAgICAgdGhpcy5kZWxpbWl0ZXJJbmRleCA9IDA7XG4gICAgICAgICAgdGhpcy5zdGF0ZUludGVycG9sYXRpb25PcGVuKGMpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuZmFzdEZvcndhcmRUbyg2MCkpIHtcbiAgICAgICAgdGhpcy5zZXF1ZW5jZUluZGV4ID0gMTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXF1ZW5jZUluZGV4ID0gTnVtYmVyKGMgPT09IDYwKTtcbiAgICB9XG4gIH1cbiAgc3RhdGVDREFUQVNlcXVlbmNlKGMpIHtcbiAgICBpZiAoYyA9PT0gU2VxdWVuY2VzLkNkYXRhW3RoaXMuc2VxdWVuY2VJbmRleF0pIHtcbiAgICAgIGlmICgrK3RoaXMuc2VxdWVuY2VJbmRleCA9PT0gU2VxdWVuY2VzLkNkYXRhLmxlbmd0aCkge1xuICAgICAgICB0aGlzLnN0YXRlID0gMjg7XG4gICAgICAgIHRoaXMuY3VycmVudFNlcXVlbmNlID0gU2VxdWVuY2VzLkNkYXRhRW5kO1xuICAgICAgICB0aGlzLnNlcXVlbmNlSW5kZXggPSAwO1xuICAgICAgICB0aGlzLnNlY3Rpb25TdGFydCA9IHRoaXMuaW5kZXggKyAxO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNlcXVlbmNlSW5kZXggPSAwO1xuICAgICAgdGhpcy5zdGF0ZSA9IDIzO1xuICAgICAgdGhpcy5zdGF0ZUluRGVjbGFyYXRpb24oYyk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBXaGVuIHdlIHdhaXQgZm9yIG9uZSBzcGVjaWZpYyBjaGFyYWN0ZXIsIHdlIGNhbiBzcGVlZCB0aGluZ3MgdXBcbiAgICogYnkgc2tpcHBpbmcgdGhyb3VnaCB0aGUgYnVmZmVyIHVudGlsIHdlIGZpbmQgaXQuXG4gICAqXG4gICAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGNoYXJhY3RlciB3YXMgZm91bmQuXG4gICAqL1xuICBmYXN0Rm9yd2FyZFRvKGMpIHtcbiAgICB3aGlsZSAoKyt0aGlzLmluZGV4IDwgdGhpcy5idWZmZXIubGVuZ3RoKSB7XG4gICAgICBjb25zdCBjYyA9IHRoaXMuYnVmZmVyLmNoYXJDb2RlQXQodGhpcy5pbmRleCk7XG4gICAgICBpZiAoY2MgPT09IDEwKSB7XG4gICAgICAgIHRoaXMubmV3bGluZXMucHVzaCh0aGlzLmluZGV4KTtcbiAgICAgIH1cbiAgICAgIGlmIChjYyA9PT0gYykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5pbmRleCA9IHRoaXMuYnVmZmVyLmxlbmd0aCAtIDE7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8qKlxuICAgKiBDb21tZW50cyBhbmQgQ0RBVEEgZW5kIHdpdGggYC0tPmAgYW5kIGBdXT5gLlxuICAgKlxuICAgKiBUaGVpciBjb21tb24gcXVhbGl0aWVzIGFyZTpcbiAgICogLSBUaGVpciBlbmQgc2VxdWVuY2VzIGhhdmUgYSBkaXN0aW5jdCBjaGFyYWN0ZXIgdGhleSBzdGFydCB3aXRoLlxuICAgKiAtIFRoYXQgY2hhcmFjdGVyIGlzIHRoZW4gcmVwZWF0ZWQsIHNvIHdlIGhhdmUgdG8gY2hlY2sgbXVsdGlwbGUgcmVwZWF0cy5cbiAgICogLSBBbGwgY2hhcmFjdGVycyBidXQgdGhlIHN0YXJ0IGNoYXJhY3RlciBvZiB0aGUgc2VxdWVuY2UgY2FuIGJlIHNraXBwZWQuXG4gICAqL1xuICBzdGF0ZUluQ29tbWVudExpa2UoYykge1xuICAgIGlmIChjID09PSB0aGlzLmN1cnJlbnRTZXF1ZW5jZVt0aGlzLnNlcXVlbmNlSW5kZXhdKSB7XG4gICAgICBpZiAoKyt0aGlzLnNlcXVlbmNlSW5kZXggPT09IHRoaXMuY3VycmVudFNlcXVlbmNlLmxlbmd0aCkge1xuICAgICAgICBpZiAodGhpcy5jdXJyZW50U2VxdWVuY2UgPT09IFNlcXVlbmNlcy5DZGF0YUVuZCkge1xuICAgICAgICAgIHRoaXMuY2JzLm9uY2RhdGEodGhpcy5zZWN0aW9uU3RhcnQsIHRoaXMuaW5kZXggLSAyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmNicy5vbmNvbW1lbnQodGhpcy5zZWN0aW9uU3RhcnQsIHRoaXMuaW5kZXggLSAyKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNlcXVlbmNlSW5kZXggPSAwO1xuICAgICAgICB0aGlzLnNlY3Rpb25TdGFydCA9IHRoaXMuaW5kZXggKyAxO1xuICAgICAgICB0aGlzLnN0YXRlID0gMTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMuc2VxdWVuY2VJbmRleCA9PT0gMCkge1xuICAgICAgaWYgKHRoaXMuZmFzdEZvcndhcmRUbyh0aGlzLmN1cnJlbnRTZXF1ZW5jZVswXSkpIHtcbiAgICAgICAgdGhpcy5zZXF1ZW5jZUluZGV4ID0gMTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGMgIT09IHRoaXMuY3VycmVudFNlcXVlbmNlW3RoaXMuc2VxdWVuY2VJbmRleCAtIDFdKSB7XG4gICAgICB0aGlzLnNlcXVlbmNlSW5kZXggPSAwO1xuICAgIH1cbiAgfVxuICBzdGFydFNwZWNpYWwoc2VxdWVuY2UsIG9mZnNldCkge1xuICAgIHRoaXMuZW50ZXJSQ0RBVEEoc2VxdWVuY2UsIG9mZnNldCk7XG4gICAgdGhpcy5zdGF0ZSA9IDMxO1xuICB9XG4gIGVudGVyUkNEQVRBKHNlcXVlbmNlLCBvZmZzZXQpIHtcbiAgICB0aGlzLmluUkNEQVRBID0gdHJ1ZTtcbiAgICB0aGlzLmN1cnJlbnRTZXF1ZW5jZSA9IHNlcXVlbmNlO1xuICAgIHRoaXMuc2VxdWVuY2VJbmRleCA9IG9mZnNldDtcbiAgfVxuICBzdGF0ZUJlZm9yZVRhZ05hbWUoYykge1xuICAgIGlmIChjID09PSAzMykge1xuICAgICAgdGhpcy5zdGF0ZSA9IDIyO1xuICAgICAgdGhpcy5zZWN0aW9uU3RhcnQgPSB0aGlzLmluZGV4ICsgMTtcbiAgICB9IGVsc2UgaWYgKGMgPT09IDYzKSB7XG4gICAgICB0aGlzLnN0YXRlID0gMjQ7XG4gICAgICB0aGlzLnNlY3Rpb25TdGFydCA9IHRoaXMuaW5kZXggKyAxO1xuICAgIH0gZWxzZSBpZiAoaXNUYWdTdGFydENoYX
20578IoYykpIHtcbiAgICAgIHRoaXMuc2VjdGlvblN0YXJ0ID0gdGhpcy5pbmRleDtcbiAgICAgIGlmICh0aGlzLm1vZGUgPT09IDApIHtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IDY7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuaW5TRkNSb290KSB7XG4gICAgICAgIHRoaXMuc3RhdGUgPSAzNDtcbiAgICAgIH0gZWxzZSBpZiAoIXRoaXMuaW5YTUwpIHtcbiAgICAgICAgaWYgKGMgPT09IDExNikge1xuICAgICAgICAgIHRoaXMuc3RhdGUgPSAzMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnN0YXRlID0gYyA9PT0gMTE1ID8gMjkgOiA2O1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnN0YXRlID0gNjtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGMgPT09IDQ3KSB7XG4gICAgICB0aGlzLnN0YXRlID0gODtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zdGF0ZSA9IDE7XG4gICAgICB0aGlzLnN0YXRlVGV4dChjKTtcbiAgICB9XG4gIH1cbiAgc3RhdGVJblRhZ05hbWUoYykge1xuICAgIGlmIChpc0VuZE9mVGFnU2VjdGlvbihjKSkge1xuICAgICAgdGhpcy5oYW5kbGVUYWdOYW1lKGMpO1xuICAgIH1cbiAgfVxuICBzdGF0ZUluU0ZDUm9vdFRhZ05hbWUoYykge1xuICAgIGlmIChpc0VuZE9mVGFnU2VjdGlvbihjKSkge1xuICAgICAgY29uc3QgdGFnID0gdGhpcy5idWZmZXIuc2xpY2UodGhpcy5zZWN0aW9uU3RhcnQsIHRoaXMuaW5kZXgpO1xuICAgICAgaWYgKHRhZyAhPT0gXCJ0ZW1wbGF0ZVwiKSB7XG4gICAgICAgIHRoaXMuZW50ZXJSQ0RBVEEodG9DaGFyQ29kZXMoYDwvYCArIHRhZyksIDApO1xuICAgICAgfVxuICAgICAgdGhpcy5oYW5kbGVUYWdOYW1lKGMpO1xuICAgIH1cbiAgfVxuICBoYW5kbGVUYWdOYW1lKGMpIHtcbiAgICB0aGlzLmNicy5vbm9wZW50YWduYW1lKHRoaXMuc2VjdGlvblN0YXJ0LCB0aGlzLmluZGV4KTtcbiAgICB0aGlzLnNlY3Rpb25TdGFydCA9IC0xO1xuICAgIHRoaXMuc3RhdGUgPSAxMTtcbiAgICB0aGlzLnN0YXRlQmVmb3JlQXR0ck5hbWUoYyk7XG4gIH1cbiAgc3RhdGVCZWZvcmVDbG9zaW5nVGFnTmFtZShjKSB7XG4gICAgaWYgKGlzV2hpdGVzcGFjZShjKSkgOyBlbHNlIGlmIChjID09PSA2Mikge1xuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgZmFsc2UpIHtcbiAgICAgICAgdGhpcy5jYnMub25lcnIoMTQsIHRoaXMuaW5kZXgpO1xuICAgICAgfVxuICAgICAgdGhpcy5zdGF0ZSA9IDE7XG4gICAgICB0aGlzLnNlY3Rpb25TdGFydCA9IHRoaXMuaW5kZXggKyAxO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnN0YXRlID0gaXNUYWdTdGFydENoYXIoYykgPyA5IDogMjc7XG4gICAgICB0aGlzLnNlY3Rpb25TdGFydCA9IHRoaXMuaW5kZXg7XG4gICAgfVxuICB9XG4gIHN0YXRlSW5DbG9zaW5nVGFnTmFtZShjKSB7XG4gICAgaWYgKGMgPT09IDYyIHx8IGlzV2hpdGVzcGFjZShjKSkge1xuICAgICAgdGhpcy5jYnMub25jbG9zZXRhZyh0aGlzLnNlY3Rpb25TdGFydCwgdGhpcy5pbmRleCk7XG4gICAgICB0aGlzLnNlY3Rpb25TdGFydCA9IC0xO1xuICAgICAgdGhpcy5zdGF0ZSA9IDEwO1xuICAgICAgdGhpcy5zdGF0ZUFmdGVyQ2xvc2luZ1RhZ05hbWUoYyk7XG4gICAgfVxuICB9XG4gIHN0YXRlQWZ0ZXJDbG9zaW5nVGFnTmFtZShjKSB7XG4gICAgaWYgKGMgPT09IDYyKSB7XG4gICAgICB0aGlzLnN0YXRlID0gMTtcbiAgICAgIHRoaXMuc2VjdGlvblN0YXJ0ID0gdGhpcy5pbmRleCArIDE7XG4gICAgfVxuICB9XG4gIHN0YXRlQmVmb3JlQXR0ck5hbWUoYykge1xuICAgIGlmIChjID09PSA2Mikge1xuICAgICAgdGhpcy5jYnMub25vcGVudGFnZW5kKHRoaXMuaW5kZXgpO1xuICAgICAgaWYgKHRoaXMuaW5SQ0RBVEEpIHtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IDMyO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IDE7XG4gICAgICB9XG4gICAgICB0aGlzLnNlY3Rpb25TdGFydCA9IHRoaXMuaW5kZXggKyAxO1xuICAgIH0gZWxzZSBpZiAoYyA9PT0gNDcpIHtcbiAgICAgIHRoaXMuc3RhdGUgPSA3O1xuICAgICAgaWYgKCghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHx8IGZhbHNlKSAmJiB0aGlzLnBlZWsoKSAhPT0gNjIpIHtcbiAgICAgICAgdGhpcy5jYnMub25lcnIoMjIsIHRoaXMuaW5kZXgpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoYyA9PT0gNjAgJiYgdGhpcy5wZWVrKCkgPT09IDQ3KSB7XG4gICAgICB0aGlzLmNicy5vbm9wZW50YWdlbmQodGhpcy5pbmRleCk7XG4gICAgICB0aGlzLnN0YXRlID0gNTtcbiAgICAgIHRoaXMuc2VjdGlvblN0YXJ0ID0gdGhpcy5pbmRleDtcbiAgICB9IGVsc2UgaWYgKCFpc1doaXRlc3BhY2UoYykpIHtcbiAgICAgIGlmICgoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCBmYWxzZSkgJiYgYyA9PT0gNjEpIHtcbiAgICAgICAgdGhpcy5jYnMub25lcnIoXG4gICAgICAgICAgMTksXG4gICAgICAgICAgdGhpcy5pbmRleFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgdGhpcy5oYW5kbGVBdHRyU3RhcnQoYyk7XG4gICAgfVxuICB9XG4gIGhhbmRsZUF0dHJTdGFydChjKSB7XG4gICAgaWYgKGMgPT09IDExOCAmJiB0aGlzLnBlZWsoKSA9PT0gNDUpIHtcbiAgICAgIHRoaXMuc3RhdGUgPSAxMztcbiAgICAgIHRoaXMuc2VjdGlvblN0YXJ0ID0gdGhpcy5pbmRleDtcbiAgICB9IGVsc2UgaWYgKGMgPT09IDQ2IHx8IGMgPT09IDU4IHx8IGMgPT09IDY0IHx8IGMgPT09IDM1KSB7XG4gICAgICB0aGlzLmNicy5vbmRpcm5hbWUodGhpcy5pbmRleCwgdGhpcy5pbmRleCArIDEpO1xuICAgICAgdGhpcy5zdGF0ZSA9IDE0O1xuICAgICAgdGhpcy5zZWN0aW9uU3RhcnQgPSB0aGlzLmluZGV4ICsgMTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zdGF0ZSA9IDEyO1xuICAgICAgdGhpcy5zZWN0aW9uU3RhcnQgPSB0aGlzLmluZGV4O1xuICAgIH1cbiAgfVxuICBzdGF0ZUluU2VsZkNsb3NpbmdUYWcoYykge1xuICAgIGlmIChjID09PSA2Mikge1xuICAgICAgdGhpcy5jYnMub25zZWxmY2xvc2luZ3RhZyh0aGlzLmluZGV4KTtcbiAgICAgIHRoaXMuc3RhdGUgPSAxO1xuICAgICAgdGhpcy5zZWN0aW9uU3RhcnQgPSB0aGlzLmluZGV4ICsgMTtcbiAgICAgIHRoaXMuaW5SQ0RBVEEgPSBmYWxzZTtcbiAgICB9IGVsc2UgaWYgKCFpc1doaXRlc3BhY2UoYykpIHtcbiAgICAgIHRoaXMuc3RhdGUgPSAxMTtcbiAgICAgIHRoaXMuc3RhdGVCZWZvcmVBdHRyTmFtZShjKTtcbiAgICB9XG4gI
20578H1cbiAgc3RhdGVJbkF0dHJOYW1lKGMpIHtcbiAgICBpZiAoYyA9PT0gNjEgfHwgaXNFbmRPZlRhZ1NlY3Rpb24oYykpIHtcbiAgICAgIHRoaXMuY2JzLm9uYXR0cmlibmFtZSh0aGlzLnNlY3Rpb25TdGFydCwgdGhpcy5pbmRleCk7XG4gICAgICB0aGlzLmhhbmRsZUF0dHJOYW1lRW5kKGMpO1xuICAgIH0gZWxzZSBpZiAoKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgZmFsc2UpICYmIChjID09PSAzNCB8fCBjID09PSAzOSB8fCBjID09PSA2MCkpIHtcbiAgICAgIHRoaXMuY2JzLm9uZXJyKFxuICAgICAgICAxNyxcbiAgICAgICAgdGhpcy5pbmRleFxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgc3RhdGVJbkRpck5hbWUoYykge1xuICAgIGlmIChjID09PSA2MSB8fCBpc0VuZE9mVGFnU2VjdGlvbihjKSkge1xuICAgICAgdGhpcy5jYnMub25kaXJuYW1lKHRoaXMuc2VjdGlvblN0YXJ0LCB0aGlzLmluZGV4KTtcbiAgICAgIHRoaXMuaGFuZGxlQXR0ck5hbWVFbmQoYyk7XG4gICAgfSBlbHNlIGlmIChjID09PSA1OCkge1xuICAgICAgdGhpcy5jYnMub25kaXJuYW1lKHRoaXMuc2VjdGlvblN0YXJ0LCB0aGlzLmluZGV4KTtcbiAgICAgIHRoaXMuc3RhdGUgPSAxNDtcbiAgICAgIHRoaXMuc2VjdGlvblN0YXJ0ID0gdGhpcy5pbmRleCArIDE7XG4gICAgfSBlbHNlIGlmIChjID09PSA0Nikge1xuICAgICAgdGhpcy5jYnMub25kaXJuYW1lKHRoaXMuc2VjdGlvblN0YXJ0LCB0aGlzLmluZGV4KTtcbiAgICAgIHRoaXMuc3RhdGUgPSAxNjtcbiAgICAgIHRoaXMuc2VjdGlvblN0YXJ0ID0gdGhpcy5pbmRleCArIDE7XG4gICAgfVxuICB9XG4gIHN0YXRlSW5EaXJBcmcoYykge1xuICAgIGlmIChjID09PSA2MSB8fCBpc0VuZE9mVGFnU2VjdGlvbihjKSkge1xuICAgICAgdGhpcy5jYnMub25kaXJhcmcodGhpcy5zZWN0aW9uU3RhcnQsIHRoaXMuaW5kZXgpO1xuICAgICAgdGhpcy5oYW5kbGVBdHRyTmFtZUVuZChjKTtcbiAgICB9IGVsc2UgaWYgKGMgPT09IDkxKSB7XG4gICAgICB0aGlzLnN0YXRlID0gMTU7XG4gICAgfSBlbHNlIGlmIChjID09PSA0Nikge1xuICAgICAgdGhpcy5jYnMub25kaXJhcmcodGhpcy5zZWN0aW9uU3RhcnQsIHRoaXMuaW5kZXgpO1xuICAgICAgdGhpcy5zdGF0ZSA9IDE2O1xuICAgICAgdGhpcy5zZWN0aW9uU3RhcnQgPSB0aGlzLmluZGV4ICsgMTtcbiAgICB9XG4gIH1cbiAgc3RhdGVJbkR5bmFtaWNEaXJBcmcoYykge1xuICAgIGlmIChjID09PSA5Mykge1xuICAgICAgdGhpcy5zdGF0ZSA9IDE0O1xuICAgIH0gZWxzZSBpZiAoYyA9PT0gNjEgfHwgaXNFbmRPZlRhZ1NlY3Rpb24oYykpIHtcbiAgICAgIHRoaXMuY2JzLm9uZGlyYXJnKHRoaXMuc2VjdGlvblN0YXJ0LCB0aGlzLmluZGV4ICsgMSk7XG4gICAgICB0aGlzLmhhbmRsZUF0dHJOYW1lRW5kKGMpO1xuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgZmFsc2UpIHtcbiAgICAgICAgdGhpcy5jYnMub25lcnIoXG4gICAgICAgICAgMjcsXG4gICAgICAgICAgdGhpcy5pbmRleFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBzdGF0ZUluRGlyTW9kaWZpZXIoYykge1xuICAgIGlmIChjID09PSA2MSB8fCBpc0VuZE9mVGFnU2VjdGlvbihjKSkge1xuICAgICAgdGhpcy5jYnMub25kaXJtb2RpZmllcih0aGlzLnNlY3Rpb25TdGFydCwgdGhpcy5pbmRleCk7XG4gICAgICB0aGlzLmhhbmRsZUF0dHJOYW1lRW5kKGMpO1xuICAgIH0gZWxzZSBpZiAoYyA9PT0gNDYpIHtcbiAgICAgIHRoaXMuY2JzLm9uZGlybW9kaWZpZXIodGhpcy5zZWN0aW9uU3RhcnQsIHRoaXMuaW5kZXgpO1xuICAgICAgdGhpcy5zZWN0aW9uU3RhcnQgPSB0aGlzLmluZGV4ICsgMTtcbiAgICB9XG4gIH1cbiAgaGFuZGxlQXR0ck5hbWVFbmQoYykge1xuICAgIHRoaXMuc2VjdGlvblN0YXJ0ID0gdGhpcy5pbmRleDtcbiAgICB0aGlzLnN0YXRlID0gMTc7XG4gICAgdGhpcy5jYnMub25hdHRyaWJuYW1lZW5kKHRoaXMuaW5kZXgpO1xuICAgIHRoaXMuc3RhdGVBZnRlckF0dHJOYW1lKGMpO1xuICB9XG4gIHN0YXRlQWZ0ZXJBdHRyTmFtZShjKSB7XG4gICAgaWYgKGMgPT09IDYxKSB7XG4gICAgICB0aGlzLnN0YXRlID0gMTg7XG4gICAgfSBlbHNlIGlmIChjID09PSA0NyB8fCBjID09PSA2Mikge1xuICAgICAgdGhpcy5jYnMub25hdHRyaWJlbmQoMCwgdGhpcy5zZWN0aW9uU3RhcnQpO1xuICAgICAgdGhpcy5zZWN0aW9uU3RhcnQgPSAtMTtcbiAgICAgIHRoaXMuc3RhdGUgPSAxMTtcbiAgICAgIHRoaXMuc3RhdGVCZWZvcmVBdHRyTmFtZShjKTtcbiAgICB9IGVsc2UgaWYgKCFpc1doaXRlc3BhY2UoYykpIHtcbiAgICAgIHRoaXMuY2JzLm9uYXR0cmliZW5kKDAsIHRoaXMuc2VjdGlvblN0YXJ0KTtcbiAgICAgIHRoaXMuaGFuZGxlQXR0clN0YXJ0KGMpO1xuICAgIH1cbiAgfVxuICBzdGF0ZUJlZm9yZUF0dHJWYWx1ZShjKSB7XG4gICAgaWYgKGMgPT09IDM0KSB7XG4gICAgICB0aGlzLnN0YXRlID0gMTk7XG4gICAgICB0aGlzLnNlY3Rpb25TdGFydCA9IHRoaXMuaW5kZXggKyAxO1xuICAgIH0gZWxzZSBpZiAoYyA9PT0gMzkpIHtcbiAgICAgIHRoaXMuc3RhdGUgPSAyMDtcbiAgICAgIHRoaXMuc2VjdGlvblN0YXJ0ID0gdGhpcy5pbmRleCArIDE7XG4gICAgfSBlbHNlIGlmICghaXNXaGl0ZXNwYWNlKGMpKSB7XG4gICAgICB0aGlzLnNlY3Rpb25TdGFydCA9IHRoaXMuaW5kZXg7XG4gICAgICB0aGlzLnN0YXRlID0gMjE7XG4gICAgICB0aGlzLnN0YXRlSW5BdHRyVmFsdWVOb1F1b3RlcyhjKTtcbiAgICB9XG4gIH1cbiAgaGFuZGxlSW5BdHRyVmFsdWUoYywgcXVvdGUpIHtcbiAgICBpZiAoYyA9PT0gcXVvdGUgfHwgdGhpcy5mYXN0Rm9yd2FyZFRvKHF1b3RlKSkge1xuICAgICAgdGhpcy5jYnMub25hdHRyaWJkYXRhKHRoaXMuc2VjdGlvblN0YXJ0LCB0aGlzLmluZGV4KTtcbiAgICAgIHRoaXMuc2VjdGlvblN0YXJ0ID0gLTE7XG4gICAgICB0aGlzLmNicy5vbmF0dHJpYmVuZChcbiAgICAgICAgcXVvdGUgPT09IDM0ID8gMyA6IDIsXG4gICAgICAgIHRoaXMuaW5kZXggKyAxXG4gICAgICApO1xuICAgICAgdGhpcy5zdGF0ZSA9IDExO1xuICAgIH1cbiAgfVxuICBzdGF0ZUluQXR0clZhbHVlRG91YmxlUXVvdGVzKGMpIHtcbiAgICB0aGlzLmhhbmRsZUluQXR0clZhbHVlKGMsIDM0KTtcbiAgfVxuICBzdGF0ZUluQXR0clZhbHVlU2luZ2xlUXVvdGVzKGMpIHtcbiAgICB0aGlzLmhhbmRsZUluQXR0clZhbHVlKGMsIDM5KTtcbiAgfVxuICBzdGF0ZUluQXR0clZhbHVlTm9RdW90ZXMoYykge1xuICAgIGlmIChpc1doaXRlc3BhY2UoYykgfHwgYyA9PT0gNjIpIHtcbiAgICAgIHRoaXMuY2JzLm9uYXR0cmliZGF0YSh0aGlzLnNlY3Rpb25TdGFydCwgdGhpcy5pbmRleCk7XG4gICAgICB0aGlzLnNlY3Rpb25TdGFydCA9IC0xO1xuICAgICAgdGhpcy5jYnMub25hdHRyaWJlbmQoMSwgdGhpcy5pbmRleCk7XG4gICAgICB0aGlzLnN0YXRlID0gMTE7XG4gICAgICB0aGlzLnN0YXRlQmVmb3JlQXR0ck5hbWUoYyk7XG4gICAgfSBlbHNlIGlmICgoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCBmYWxzZSkgJiYgYyA9PT0gMzQgfHwgYyA9PT0gMzkgfHwgYyA9PT0gNjAgfHwgYyA9PT0gNjEgfHwgYyA9PT0gOTYpIHtcbiAgICAgIHRoaXMuY2JzLm9uZXJyKFxuICAgICAgICAxOCxcbiAgICAgICAgdGhpcy5pbmRleFxuICAgICAgKTtcbiAgICB9IGVsc2UgO1xuICB9XG4gI
20578HN0YXRlQmVmb3JlRGVjbGFyYXRpb24oYykge1xuICAgIGlmIChjID09PSA5MSkge1xuICAgICAgdGhpcy5zdGF0ZSA9IDI2O1xuICAgICAgdGhpcy5zZXF1ZW5jZUluZGV4ID0gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zdGF0ZSA9IGMgPT09IDQ1ID8gMjUgOiAyMztcbiAgICB9XG4gIH1cbiAgc3RhdGVJbkRlY2xhcmF0aW9uKGMpIHtcbiAgICBpZiAoYyA9PT0gNjIgfHwgdGhpcy5mYXN0Rm9yd2FyZFRvKDYyKSkge1xuICAgICAgdGhpcy5zdGF0ZSA9IDE7XG4gICAgICB0aGlzLnNlY3Rpb25TdGFydCA9IHRoaXMuaW5kZXggKyAxO1xuICAgIH1cbiAgfVxuICBzdGF0ZUluUHJvY2Vzc2luZ0luc3RydWN0aW9uKGMpIHtcbiAgICBpZiAoYyA9PT0gNjIgfHwgdGhpcy5mYXN0Rm9yd2FyZFRvKDYyKSkge1xuICAgICAgdGhpcy5jYnMub25wcm9jZXNzaW5naW5zdHJ1Y3Rpb24odGhpcy5zZWN0aW9uU3RhcnQsIHRoaXMuaW5kZXgpO1xuICAgICAgdGhpcy5zdGF0ZSA9IDE7XG4gICAgICB0aGlzLnNlY3Rpb25TdGFydCA9IHRoaXMuaW5kZXggKyAxO1xuICAgIH1cbiAgfVxuICBzdGF0ZUJlZm9yZUNvbW1lbnQoYykge1xuICAgIGlmIChjID09PSA0NSkge1xuICAgICAgdGhpcy5zdGF0ZSA9IDI4O1xuICAgICAgdGhpcy5jdXJyZW50U2VxdWVuY2UgPSBTZXF1ZW5jZXMuQ29tbWVudEVuZDtcbiAgICAgIHRoaXMuc2VxdWVuY2VJbmRleCA9IDI7XG4gICAgICB0aGlzLnNlY3Rpb25TdGFydCA9IHRoaXMuaW5kZXggKyAxO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnN0YXRlID0gMjM7XG4gICAgfVxuICB9XG4gIHN0YXRlSW5TcGVjaWFsQ29tbWVudChjKSB7XG4gICAgaWYgKGMgPT09IDYyIHx8IHRoaXMuZmFzdEZvcndhcmRUbyg2MikpIHtcbiAgICAgIHRoaXMuY2JzLm9uY29tbWVudCh0aGlzLnNlY3Rpb25TdGFydCwgdGhpcy5pbmRleCk7XG4gICAgICB0aGlzLnN0YXRlID0gMTtcbiAgICAgIHRoaXMuc2VjdGlvblN0YXJ0ID0gdGhpcy5pbmRleCArIDE7XG4gICAgfVxuICB9XG4gIHN0YXRlQmVmb3JlU3BlY2lhbFMoYykge1xuICAgIGlmIChjID09PSBTZXF1ZW5jZXMuU2NyaXB0RW5kWzNdKSB7XG4gICAgICB0aGlzLnN0YXJ0U3BlY2lhbChTZXF1ZW5jZXMuU2NyaXB0RW5kLCA0KTtcbiAgICB9IGVsc2UgaWYgKGMgPT09IFNlcXVlbmNlcy5TdHlsZUVuZFszXSkge1xuICAgICAgdGhpcy5zdGFydFNwZWNpYWwoU2VxdWVuY2VzLlN0eWxlRW5kLCA0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zdGF0ZSA9IDY7XG4gICAgICB0aGlzLnN0YXRlSW5UYWdOYW1lKGMpO1xuICAgIH1cbiAgfVxuICBzdGF0ZUJlZm9yZVNwZWNpYWxUKGMpIHtcbiAgICBpZiAoYyA9PT0gU2VxdWVuY2VzLlRpdGxlRW5kWzNdKSB7XG4gICAgICB0aGlzLnN0YXJ0U3BlY2lhbChTZXF1ZW5jZXMuVGl0bGVFbmQsIDQpO1xuICAgIH0gZWxzZSBpZiAoYyA9PT0gU2VxdWVuY2VzLlRleHRhcmVhRW5kWzNdKSB7XG4gICAgICB0aGlzLnN0YXJ0U3BlY2lhbChTZXF1ZW5jZXMuVGV4dGFyZWFFbmQsIDQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnN0YXRlID0gNjtcbiAgICAgIHRoaXMuc3RhdGVJblRhZ05hbWUoYyk7XG4gICAgfVxuICB9XG4gIHN0YXJ0RW50aXR5KCkge1xuICB9XG4gIHN0YXRlSW5FbnRpdHkoKSB7XG4gIH1cbiAgLyoqXG4gICAqIEl0ZXJhdGVzIHRocm91Z2ggdGhlIGJ1ZmZlciwgY2FsbGluZyB0aGUgZnVuY3Rpb24gY29ycmVzcG9uZGluZyB0byB0aGUgY3VycmVudCBzdGF0ZS5cbiAgICpcbiAgICogU3RhdGVzIHRoYXQgYXJlIG1vcmUgbGlrZWx5IHRvIGJlIGhpdCBhcmUgaGlnaGVyIHVwLCBhcyBhIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50LlxuICAgKi9cbiAgcGFyc2UoaW5wdXQpIHtcbiAgICB0aGlzLmJ1ZmZlciA9IGlucHV0O1xuICAgIHdoaWxlICh0aGlzLmluZGV4IDwgdGhpcy5idWZmZXIubGVuZ3RoKSB7XG4gICAgICBjb25zdCBjID0gdGhpcy5idWZmZXIuY2hhckNvZGVBdCh0aGlzLmluZGV4KTtcbiAgICAgIGlmIChjID09PSAxMCkge1xuICAgICAgICB0aGlzLm5ld2xpbmVzLnB1c2godGhpcy5pbmRleCk7XG4gICAgICB9XG4gICAgICBzd2l0Y2ggKHRoaXMuc3RhdGUpIHtcbiAgICAgICAgY2FzZSAxOiB7XG4gICAgICAgICAgdGhpcy5zdGF0ZVRleHQoYyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAyOiB7XG4gICAgICAgICAgdGhpcy5zdGF0ZUludGVycG9sYXRpb25PcGVuKGMpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgMzoge1xuICAgICAgICAgIHRoaXMuc3RhdGVJbnRlcnBvbGF0aW9uKGMpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgNDoge1xuICAgICAgICAgIHRoaXMuc3RhdGVJbnRlcnBvbGF0aW9uQ2xvc2UoYyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAzMToge1xuICAgICAgICAgIHRoaXMuc3RhdGVTcGVjaWFsU3RhcnRTZXF1ZW5jZShjKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIDMyOiB7XG4gICAgICAgICAgdGhpcy5zdGF0ZUluUkNEQVRBKGMpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgMjY6IHtcbiAgICAgICAgICB0aGlzLnN0YXRlQ0RBVEFTZXF1ZW5jZShjKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIDE5OiB7XG4gICAgICAgICAgdGhpcy5zdGF0ZUluQXR0clZhbHVlRG91YmxlUXVvdGVzKGMpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgMTI6IHtcbiAgICAgICAgICB0aGlzLnN0YXRlSW5BdHRyTmFtZShjKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIDEzOiB7XG4gICAgICAgICAgdGhpcy5zdGF0ZUluRGlyTmFtZShjKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIDE0OiB7XG4gICAgICAgICAgdGhpcy5zdGF0ZUluRGlyQXJnKGMpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgMTU6IHtcbiAgICAgICAgICB0aGlzLnN0YXRlSW5EeW5hbWljRGlyQXJnKGMpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgMTY6IHtcbiAgICAgICAgICB0aGlzLnN0YXRlSW5EaXJNb2RpZmllcihjKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIDI4OiB7XG4gICAgICAgICAgdGhpcy5zdGF0ZUluQ29tbWVudExpa2UoYyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgI
20578H1cbiAgICAgICAgY2FzZSAyNzoge1xuICAgICAgICAgIHRoaXMuc3RhdGVJblNwZWNpYWxDb21tZW50KGMpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgMTE6IHtcbiAgICAgICAgICB0aGlzLnN0YXRlQmVmb3JlQXR0ck5hbWUoYyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSA2OiB7XG4gICAgICAgICAgdGhpcy5zdGF0ZUluVGFnTmFtZShjKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIDM0OiB7XG4gICAgICAgICAgdGhpcy5zdGF0ZUluU0ZDUm9vdFRhZ05hbWUoYyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSA5OiB7XG4gICAgICAgICAgdGhpcy5zdGF0ZUluQ2xvc2luZ1RhZ05hbWUoYyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSA1OiB7XG4gICAgICAgICAgdGhpcy5zdGF0ZUJlZm9yZVRhZ05hbWUoYyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAxNzoge1xuICAgICAgICAgIHRoaXMuc3RhdGVBZnRlckF0dHJOYW1lKGMpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgMjA6IHtcbiAgICAgICAgICB0aGlzLnN0YXRlSW5BdHRyVmFsdWVTaW5nbGVRdW90ZXMoYyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAxODoge1xuICAgICAgICAgIHRoaXMuc3RhdGVCZWZvcmVBdHRyVmFsdWUoYyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSA4OiB7XG4gICAgICAgICAgdGhpcy5zdGF0ZUJlZm9yZUNsb3NpbmdUYWdOYW1lKGMpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgMTA6IHtcbiAgICAgICAgICB0aGlzLnN0YXRlQWZ0ZXJDbG9zaW5nVGFnTmFtZShjKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIDI5OiB7XG4gICAgICAgICAgdGhpcy5zdGF0ZUJlZm9yZVNwZWNpYWxTKGMpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgMzA6IHtcbiAgICAgICAgICB0aGlzLnN0YXRlQmVmb3JlU3BlY2lhbFQoYyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAyMToge1xuICAgICAgICAgIHRoaXMuc3RhdGVJbkF0dHJWYWx1ZU5vUXVvdGVzKGMpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgNzoge1xuICAgICAgICAgIHRoaXMuc3RhdGVJblNlbGZDbG9zaW5nVGFnKGMpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgMjM6IHtcbiAgICAgICAgICB0aGlzLnN0YXRlSW5EZWNsYXJhdGlvbihjKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIDIyOiB7XG4gICAgICAgICAgdGhpcy5zdGF0ZUJlZm9yZURlY2xhcmF0aW9uKGMpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgMjU6IHtcbiAgICAgICAgICB0aGlzLnN0YXRlQmVmb3JlQ29tbWVudChjKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIDI0OiB7XG4gICAgICAgICAgdGhpcy5zdGF0ZUluUHJvY2Vzc2luZ0luc3RydWN0aW9uKGMpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgMzM6IHtcbiAgICAgICAgICB0aGlzLnN0YXRlSW5FbnRpdHkoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5pbmRleCsrO1xuICAgIH1cbiAgICB0aGlzLmNsZWFudXAoKTtcbiAgICB0aGlzLmZpbmlzaCgpO1xuICB9XG4gIC8qKlxuICAgKiBSZW1vdmUgZGF0YSB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gY29uc3VtZWQgZnJvbSB0aGUgYnVmZmVyLlxuICAgKi9cbiAgY2xlYW51cCgpIHtcbiAgICBpZiAodGhpcy5zZWN0aW9uU3RhcnQgIT09IHRoaXMuaW5kZXgpIHtcbiAgICAgIGlmICh0aGlzLnN0YXRlID09PSAxIHx8IHRoaXMuc3RhdGUgPT09IDMyICYmIHRoaXMuc2VxdWVuY2VJbmRleCA9PT0gMCkge1xuICAgICAgICB0aGlzLmNicy5vbnRleHQodGhpcy5zZWN0aW9uU3RhcnQsIHRoaXMuaW5kZXgpO1xuICAgICAgICB0aGlzLnNlY3Rpb25TdGFydCA9IHRoaXMuaW5kZXg7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuc3RhdGUgPT09IDE5IHx8IHRoaXMuc3RhdGUgPT09IDIwIHx8IHRoaXMuc3RhdGUgPT09IDIxKSB7XG4gICAgICAgIHRoaXMuY2JzLm9uYXR0cmliZGF0YSh0aGlzLnNlY3Rpb25TdGFydCwgdGhpcy5pbmRleCk7XG4gICAgICAgIHRoaXMuc2VjdGlvblN0YXJ0ID0gdGhpcy5pbmRleDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgZmluaXNoKCkge1xuICAgIHRoaXMuaGFuZGxlVHJhaWxpbmdEYXRhKCk7XG4gICAgdGhpcy5jYnMub25lbmQoKTtcbiAgfVxuICAvKiogSGFuZGxlIGFueSB0cmFpbGluZyBkYXRhLiAqL1xuICBoYW5kbGVUcmFpbGluZ0RhdGEoKSB7XG4gICAgY29uc3QgZW5kSW5kZXggPSB0aGlzLmJ1ZmZlci5sZW5ndGg7XG4gICAgaWYgKHRoaXMuc2VjdGlvblN0YXJ0ID49IGVuZEluZGV4KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLnN0YXRlID09PSAyOCkge1xuICAgICAgaWYgKHRoaXMuY3VycmVudFNlcXVlbmNlID09PSBTZXF1ZW5jZXMuQ2RhdGFFbmQpIHtcbiAgICAgICAgdGhpcy5jYnMub25jZGF0YSh0aGlzLnNlY3Rpb25TdGFydCwgZW5kSW5kZXgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jYnMub25jb21tZW50KHRoaXMuc2VjdGlvblN0YXJ0LCBlbmRJbmRleCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0aGlzLnN0YXRlID09PSA2IHx8IHRoaXMuc3RhdGUgPT09IDExIHx8IHRoaXMuc3RhdGUgPT09IDE4IHx8IHRoaXMuc3RhdGUgPT09IDE3IHx8IHRoaXMuc3RhdGUgPT09IDEyIHx8IHRoaXMuc3RhdGUgPT09IDEzIHx8IHRoaXMuc3RhdGUgPT09IDE0IHx8IHRoaXMuc3RhdGUgPT09IDE1IHx8IHRoaXMuc3RhdGUgPT09IDE2IHx8IHRoaXMuc3RhdGUgPT09IDIwIHx8IHRoaXMuc3RhdGUgPT09IDE5IHx8IHRoaXMuc3RhdGUgPT09IDIxIHx8IHRoaXMuc3RhdGUgPT09IDkpIDsgZWxzZSB7XG4gICAgICB0aGlzLmNicy5vbnRleHQodGhpcy5zZWN0aW9uU3RhcnQsIGVuZEluZGV4KTtcbiAgICB9XG4gI
20578H1cbiAgZW1pdENvZGVQb2ludChjcCwgY29uc3VtZWQpIHtcbiAgfVxufVxuXG5jb25zdCBDb21waWxlckRlcHJlY2F0aW9uVHlwZXMgPSB7XG4gIFwiQ09NUElMRVJfSVNfT05fRUxFTUVOVFwiOiBcIkNPTVBJTEVSX0lTX09OX0VMRU1FTlRcIixcbiAgXCJDT01QSUxFUl9WX0JJTkRfU1lOQ1wiOiBcIkNPTVBJTEVSX1ZfQklORF9TWU5DXCIsXG4gIFwiQ09NUElMRVJfVl9CSU5EX09CSkVDVF9PUkRFUlwiOiBcIkNPTVBJTEVSX1ZfQklORF9PQkpFQ1RfT1JERVJcIixcbiAgXCJDT01QSUxFUl9WX09OX05BVElWRVwiOiBcIkNPTVBJTEVSX1ZfT05fTkFUSVZFXCIsXG4gIFwiQ09NUElMRVJfVl9JRl9WX0ZPUl9QUkVDRURFTkNFXCI6IFwiQ09NUElMRVJfVl9JRl9WX0ZPUl9QUkVDRURFTkNFXCIsXG4gIFwiQ09NUElMRVJfTkFUSVZFX1RFTVBMQVRFXCI6IFwiQ09NUElMRVJfTkFUSVZFX1RFTVBMQVRFXCIsXG4gIFwiQ09NUElMRVJfSU5MSU5FX1RFTVBMQVRFXCI6IFwiQ09NUElMRVJfSU5MSU5FX1RFTVBMQVRFXCIsXG4gIFwiQ09NUElMRVJfRklMVEVSU1wiOiBcIkNPTVBJTEVSX0ZJTFRFUlNcIlxufTtcbmNvbnN0IGRlcHJlY2F0aW9uRGF0YSA9IHtcbiAgW1wiQ09NUElMRVJfSVNfT05fRUxFTUVOVFwiXToge1xuICAgIG1lc3NhZ2U6IGBQbGF0Zm9ybS1uYXRpdmUgZWxlbWVudHMgd2l0aCBcImlzXCIgcHJvcCB3aWxsIG5vIGxvbmdlciBiZSB0cmVhdGVkIGFzIGNvbXBvbmVudHMgaW4gVnVlIDMgdW5sZXNzIHRoZSBcImlzXCIgdmFsdWUgaXMgZXhwbGljaXRseSBwcmVmaXhlZCB3aXRoIFwidnVlOlwiLmAsXG4gICAgbGluazogYGh0dHBzOi8vdjMtbWlncmF0aW9uLnZ1ZWpzLm9yZy9icmVha2luZy1jaGFuZ2VzL2N1c3RvbS1lbGVtZW50cy1pbnRlcm9wLmh0bWxgXG4gIH0sXG4gIFtcIkNPTVBJTEVSX1ZfQklORF9TWU5DXCJdOiB7XG4gICAgbWVzc2FnZTogKGtleSkgPT4gYC5zeW5jIG1vZGlmaWVyIGZvciB2LWJpbmQgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIHYtbW9kZWwgd2l0aCBhcmd1bWVudCBpbnN0ZWFkLiBcXGB2LWJpbmQ6JHtrZXl9LnN5bmNcXGAgc2hvdWxkIGJlIGNoYW5nZWQgdG8gXFxgdi1tb2RlbDoke2tleX1cXGAuYCxcbiAgICBsaW5rOiBgaHR0cHM6Ly92My1taWdyYXRpb24udnVlanMub3JnL2JyZWFraW5nLWNoYW5nZXMvdi1tb2RlbC5odG1sYFxuICB9LFxuICBbXCJDT01QSUxFUl9WX0JJTkRfT0JKRUNUX09SREVSXCJdOiB7XG4gICAgbWVzc2FnZTogYHYtYmluZD1cIm9ialwiIHVzYWdlIGlzIG5vdyBvcmRlciBzZW5zaXRpdmUgYW5kIGJlaGF2ZXMgbGlrZSBKYXZhU2NyaXB0IG9iamVjdCBzcHJlYWQ6IGl0IHdpbGwgbm93IG92ZXJ3cml0ZSBhbiBleGlzdGluZyBub24tbWVyZ2VhYmxlIGF0dHJpYnV0ZSB0aGF0IGFwcGVhcnMgYmVmb3JlIHYtYmluZCBpbiB0aGUgY2FzZSBvZiBjb25mbGljdC4gVG8gcmV0YWluIDIueCBiZWhhdmlvciwgbW92ZSB2LWJpbmQgdG8gbWFrZSBpdCB0aGUgZmlyc3QgYXR0cmlidXRlLiBZb3UgY2FuIGFsc28gc3VwcHJlc3MgdGhpcyB3YXJuaW5nIGlmIHRoZSB1c2FnZSBpcyBpbnRlbmRlZC5gLFxuICAgIGxpbms6IGBodHRwczovL3YzLW1pZ3JhdGlvbi52dWVqcy5vcmcvYnJlYWtpbmctY2hhbmdlcy92LWJpbmQuaHRtbGBcbiAgfSxcbiAgW1wiQ09NUElMRVJfVl9PTl9OQVRJVkVcIl06IHtcbiAgICBtZXNzYWdlOiBgLm5hdGl2ZSBtb2RpZmllciBmb3Igdi1vbiBoYXMgYmVlbiByZW1vdmVkIGFzIGlzIG5vIGxvbmdlciBuZWNlc3NhcnkuYCxcbiAgICBsaW5rOiBgaHR0cHM6Ly92My1taWdyYXRpb24udnVlanMub3JnL2JyZWFraW5nLWNoYW5nZXMvdi1vbi1uYXRpdmUtbW9kaWZpZXItcmVtb3ZlZC5odG1sYFxuICB9LFxuICBbXCJDT01QSUxFUl9WX0lGX1ZfRk9SX1BSRUNFREVOQ0VcIl06IHtcbiAgICBtZXNzYWdlOiBgdi1pZiAvIHYtZm9yIHByZWNlZGVuY2Ugd2hlbiB1c2VkIG9uIHRoZSBzYW1lIGVsZW1lbnQgaGFzIGNoYW5nZWQgaW4gVnVlIDM6IHYtaWYgbm93IHRha2VzIGhpZ2hlciBwcmVjZWRlbmNlIGFuZCB3aWxsIG5vIGxvbmdlciBoYXZlIGFjY2VzcyB0byB2LWZvciBzY29wZSB2YXJpYWJsZXMuIEl0IGlzIGJlc3QgdG8gYXZvaWQgdGhlIGFtYmlndWl0eSB3aXRoIDx0ZW1wbGF0ZT4gdGFncyBvciB1c2UgYSBjb21wdXRlZCBwcm9wZXJ0eSB0aGF0IGZpbHRlcnMgdi1mb3IgZGF0YSBzb3VyY2UuYCxcbiAgICBsaW5rOiBgaHR0cHM6Ly92My1taWdyYXRpb24udnVlanMub3JnL2JyZWFraW5nLWNoYW5nZXMvdi1pZi12LWZvci5odG1sYFxuICB9LFxuICBbXCJDT01QSUxFUl9OQVRJVkVfVEVNUExBVEVcIl06IHtcbiAgICBtZXNzYWdlOiBgPHRlbXBsYXRlPiB3aXRoIG5vIHNwZWNpYWwgZGlyZWN0aXZlcyB3aWxsIHJlbmRlciBhcyBhIG5hdGl2ZSB0ZW1wbGF0ZSBlbGVtZW50IGluc3RlYWQgb2YgaXRzIGlubmVyIGNvbnRlbnQgaW4gVnVlIDMuYFxuICB9LFxuICBbXCJDT01QSUxFUl9JTkxJTkVfVEVNUExBVEVcIl06IHtcbiAgICBtZXNzYWdlOiBgXCJpbmxpbmUtdGVtcGxhdGVcIiBoYXMgYmVlbiByZW1vdmVkIGluIFZ1ZSAzLmAsXG4gICAgbGluazogYGh0dHBzOi8vdjMtbWlncmF0aW9uLnZ1ZWpzLm9yZy9icmVha2luZy1jaGFuZ2VzL2lubGluZS10ZW1wbGF0ZS1hdHRyaWJ1dGUuaHRtbGBcbiAgfSxcbiAgW1wiQ09NUElMRVJfRklMVEVSU1wiXToge1xuICAgIG1lc3NhZ2U6IGBmaWx0ZXJzIGhhdmUgYmVlbiByZW1vdmVkIGluIFZ1ZSAzLiBUaGUgXCJ8XCIgc3ltYm9sIHdpbGwgYmUgdHJlYXRlZCBhcyBuYXRpdmUgSmF2YVNjcmlwdCBiaXR3aXNlIE9SIG9wZXJhdG9yLiBVc2UgbWV0aG9kIGNhbGxzIG9yIGNvbXB1dGVkIHByb3BlcnRpZXMgaW5zdGVhZC5gLFxuICAgIGxpbms6IGBodHRwczovL3YzLW1pZ3JhdGlvbi52dWVqcy5vcmcvYnJlYWtpbmctY2hhbmdlcy9maWx0ZXJzLmh0bWxgXG4gIH1cbn07XG5mdW5jdGlvbiBnZXRDb21wYXRWYWx1ZShrZXksIHsgY29tcGF0Q29uZmlnIH0pIHtcbiAgY29uc3QgdmFsdWUgPSBjb21wYXRDb25maWcgJiYgY29tcGF0Q29uZmlnW2tleV07XG4gIGlmIChrZXkgPT09IFwiTU9ERVwiKSB7XG4gICAgcmV0dXJuIHZhbHVlIHx8IDM7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG59XG5mdW5jdGlvbiBpc0NvbXBhdEVuYWJsZWQoa2V5LCBjb250ZXh0KSB7XG4gIGNvbnN0IG1vZGUgPSBnZXRDb21wYXRWYWx1ZShcIk1PREVcIiwgY29udGV4dCk7XG4gIGNvbnN0IHZhbHVlID0gZ2V0Q29tcGF0VmFsdWUoa2V5LCBjb250ZXh0KTtcbiAgcmV0dXJuIG1vZGUgPT09IDMgPyB2YWx1ZSA9PT0gdHJ1ZSA6IHZhbHVlICE9PSBmYWxzZTtcbn1cbmZ1bmN0aW9uIGNoZWNrQ29tcGF0RW5hYmxlZChrZXksIGNvbnRleHQsIGxvYywgLi4uYXJncykge1xuICBjb25zdCBlbmFibGVkID0gaXNDb21wYXRFbmFibGVkKGtleSwgY29udGV4dCk7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9k
20578dWN0aW9uXCIpICYmIGVuYWJsZWQpIHtcbiAgICB3YXJuRGVwcmVjYXRpb24oa2V5LCBjb250ZXh0LCBsb2MsIC4uLmFyZ3MpO1xuICB9XG4gIHJldHVybiBlbmFibGVkO1xufVxuZnVuY3Rpb24gd2FybkRlcHJlY2F0aW9uKGtleSwgY29udGV4dCwgbG9jLCAuLi5hcmdzKSB7XG4gIGNvbnN0IHZhbCA9IGdldENvbXBhdFZhbHVlKGtleSwgY29udGV4dCk7XG4gIGlmICh2YWwgPT09IFwic3VwcHJlc3Mtd2FybmluZ1wiKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHsgbWVzc2FnZSwgbGluayB9ID0gZGVwcmVjYXRpb25EYXRhW2tleV07XG4gIGNvbnN0IG1zZyA9IGAoZGVwcmVjYXRpb24gJHtrZXl9KSAke3R5cGVvZiBtZXNzYWdlID09PSBcImZ1bmN0aW9uXCIgPyBtZXNzYWdlKC4uLmFyZ3MpIDogbWVzc2FnZX0ke2xpbmsgPyBgXG4gIERldGFpbHM6ICR7bGlua31gIDogYGB9YDtcbiAgY29uc3QgZXJyID0gbmV3IFN5bnRheEVycm9yKG1zZyk7XG4gIGVyci5jb2RlID0ga2V5O1xuICBpZiAobG9jKSBlcnIubG9jID0gbG9jO1xuICBjb250ZXh0Lm9uV2FybihlcnIpO1xufVxuXG5mdW5jdGlvbiBkZWZhdWx0T25FcnJvcihlcnJvcikge1xuICB0aHJvdyBlcnJvcjtcbn1cbmZ1bmN0aW9uIGRlZmF1bHRPbldhcm4obXNnKSB7XG4gICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgY29uc29sZS53YXJuKGBbVnVlIHdhcm5dICR7bXNnLm1lc3NhZ2V9YCk7XG59XG5mdW5jdGlvbiBjcmVhdGVDb21waWxlckVycm9yKGNvZGUsIGxvYywgbWVzc2FnZXMsIGFkZGl0aW9uYWxNZXNzYWdlKSB7XG4gIGNvbnN0IG1zZyA9ICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgZmFsc2UgPyAobWVzc2FnZXMgfHwgZXJyb3JNZXNzYWdlcylbY29kZV0gKyAoYWRkaXRpb25hbE1lc3NhZ2UgfHwgYGApIDogYGh0dHBzOi8vdnVlanMub3JnL2Vycm9yLXJlZmVyZW5jZS8jY29tcGlsZXItJHtjb2RlfWA7XG4gIGNvbnN0IGVycm9yID0gbmV3IFN5bnRheEVycm9yKFN0cmluZyhtc2cpKTtcbiAgZXJyb3IuY29kZSA9IGNvZGU7XG4gIGVycm9yLmxvYyA9IGxvYztcbiAgcmV0dXJuIGVycm9yO1xufVxuY29uc3QgRXJyb3JDb2RlcyA9IHtcbiAgXCJBQlJVUFRfQ0xPU0lOR19PRl9FTVBUWV9DT01NRU5UXCI6IDAsXG4gIFwiMFwiOiBcIkFCUlVQVF9DTE9TSU5HX09GX0VNUFRZX0NPTU1FTlRcIixcbiAgXCJDREFUQV9JTl9IVE1MX0NPTlRFTlRcIjogMSxcbiAgXCIxXCI6IFwiQ0RBVEFfSU5fSFRNTF9DT05URU5UXCIsXG4gIFwiRFVQTElDQVRFX0FUVFJJQlVURVwiOiAyLFxuICBcIjJcIjogXCJEVVBMSUNBVEVfQVRUUklCVVRFXCIsXG4gIFwiRU5EX1RBR19XSVRIX0FUVFJJQlVURVNcIjogMyxcbiAgXCIzXCI6IFwiRU5EX1RBR19XSVRIX0FUVFJJQlVURVNcIixcbiAgXCJFTkRfVEFHX1dJVEhfVFJBSUxJTkdfU09MSURVU1wiOiA0LFxuICBcIjRcIjogXCJFTkRfVEFHX1dJVEhfVFJBSUxJTkdfU09MSURVU1wiLFxuICBcIkVPRl9CRUZPUkVfVEFHX05BTUVcIjogNSxcbiAgXCI1XCI6IFwiRU9GX0JFRk9SRV9UQUdfTkFNRVwiLFxuICBcIkVPRl9JTl9DREFUQVwiOiA2LFxuICBcIjZcIjogXCJFT0ZfSU5fQ0RBVEFcIixcbiAgXCJFT0ZfSU5fQ09NTUVOVFwiOiA3LFxuICBcIjdcIjogXCJFT0ZfSU5fQ09NTUVOVFwiLFxuICBcIkVPRl9JTl9TQ1JJUFRfSFRNTF9DT01NRU5UX0xJS0VfVEVYVFwiOiA4LFxuICBcIjhcIjogXCJFT0ZfSU5fU0NSSVBUX0hUTUxfQ09NTUVOVF9MSUtFX1RFWFRcIixcbiAgXCJFT0ZfSU5fVEFHXCI6IDksXG4gIFwiOVwiOiBcIkVPRl9JTl9UQUdcIixcbiAgXCJJTkNPUlJFQ1RMWV9DTE9TRURfQ09NTUVOVFwiOiAxMCxcbiAgXCIxMFwiOiBcIklOQ09SUkVDVExZX0NMT1NFRF9DT01NRU5UXCIsXG4gIFwiSU5DT1JSRUNUTFlfT1BFTkVEX0NPTU1FTlRcIjogMTEsXG4gIFwiMTFcIjogXCJJTkNPUlJFQ1RMWV9PUEVORURfQ09NTUVOVFwiLFxuICBcIklOVkFMSURfRklSU1RfQ0hBUkFDVEVSX09GX1RBR19OQU1FXCI6IDEyLFxuICBcIjEyXCI6IFwiSU5WQUxJRF9GSVJTVF9DSEFSQUNURVJfT0ZfVEFHX05BTUVcIixcbiAgXCJNSVNTSU5HX0FUVFJJQlVURV9WQUxVRVwiOiAxMyxcbiAgXCIxM1wiOiBcIk1JU1NJTkdfQVRUUklCVVRFX1ZBTFVFXCIsXG4gIFwiTUlTU0lOR19FTkRfVEFHX05BTUVcIjogMTQsXG4gIFwiMTRcIjogXCJNSVNTSU5HX0VORF9UQUdfTkFNRVwiLFxuICBcIk1JU1NJTkdfV0hJVEVTUEFDRV9CRVRXRUVOX0FUVFJJQlVURVNcIjogMTUsXG4gIFwiMTVcIjogXCJNSVNTSU5HX1dISVRFU1BBQ0VfQkVUV0VFTl9BVFRSSUJVVEVTXCIsXG4gIFwiTkVTVEVEX0NPTU1FTlRcIjogMTYsXG4gIFwiMTZcIjogXCJORVNURURfQ09NTUVOVFwiLFxuICBcIlVORVhQRUNURURfQ0hBUkFDVEVSX0lOX0FUVFJJQlVURV9OQU1FXCI6IDE3LFxuICBcIjE3XCI6IFwiVU5FWFBFQ1RFRF9DSEFSQUNURVJfSU5fQVRUUklCVVRFX05BTUVcIixcbiAgXCJVTkVYUEVDVEVEX0NIQVJBQ1RFUl9JTl9VTlFVT1RFRF9BVFRSSUJVVEVfVkFMVUVcIjogMTgsXG4gIFwiMThcIjogXCJVTkVYUEVDVEVEX0NIQVJBQ1RFUl9JTl9VTlFVT1RFRF9BVFRSSUJVVEVfVkFMVUVcIixcbiAgXCJVTkVYUEVDVEVEX0VRVUFMU19TSUdOX0JFRk9SRV9BVFRSSUJVVEVfTkFNRVwiOiAxOSxcbiAgXCIxOVwiOiBcIlVORVhQRUNURURfRVFVQUxTX1NJR05fQkVGT1JFX0FUVFJJQlVURV9OQU1FXCIsXG4gIFwiVU5FWFBFQ1RFRF9OVUxMX0NIQVJBQ1RFUlwiOiAyMCxcbiAgXCIyMFwiOiBcIlVORVhQRUNURURfTlVMTF9DSEFSQUNURVJcIixcbiAgXCJVTkVYUEVDVEVEX1FVRVNUSU9OX01BUktfSU5TVEVBRF9PRl9UQUdfTkFNRVwiOiAyMSxcbiAgXCIyMVwiOiBcIlVORVhQRUNURURfUVVFU1RJT05fTUFSS19JTlNURUFEX09GX1RBR19OQU1FXCIsXG4gIFwiVU5FWFBFQ1RFRF9TT0xJRFVTX0lOX1RBR1wiOiAyMixcbiAgXCIyMlwiOiBcIlVORVhQRUNURURfU09MSURVU19JTl9UQUdcIixcbiAgXCJYX0lOVkFMSURfRU5EX1RBR1wiOiAyMyxcbiAgXCIyM1wiOiBcIlhfSU5WQUxJRF9FTkRfVEFHXCIsXG4gIFwiWF9NSVNTSU5HX0VORF9UQUdcIjogMjQsXG4gIFwiMjRcIjogXCJYX01JU1NJTkdfRU5EX1RBR1wiLFxuICBcIlhfTUlTU0lOR19JTlRFUlBPTEFUSU9OX0VORFwiOiAyNSxcbiAgXCIyNVwiOiBcIlhfTUlTU0lOR19JTlRFUlBPTEFUSU9OX0VORFwiLFxuICBcIlhfTUlTU0lOR19ESVJFQ1RJVkVfTkFNRVwiOiAyNixcbiAgXCIyNlwiOiBcIlhfTUlTU0lOR19ESVJFQ1RJVkVfTkFNRVwiLFxuICBcIlhfTUlTU0lOR19EWU5BTUlDX0RJUkVDVElWRV9BUkdVTUVOVF9FTkRcIjogMjcsXG4gIFwiMjdcIjogXCJYX01JU1NJTkdfRFlOQU1JQ19ESVJFQ1RJVkVfQVJHVU1FTlRfRU5EXCIsXG4gIFwiWF9WX0lGX05PX0VYUFJFU1NJT05cIjogMjgsXG4gIFwiMjhcIjogXCJYX1ZfSUZfTk9fRVhQUkVTU0lPTlwiLFxuICBcIlhfVl9JRl9TQU1FX0tFWVwiOiAyOSxcbiAgXCIyOVwiOiBcIlhfVl9JRl9TQU1FX0tFWVwiLFxuICBcIlhfVl9FTFNFX05PX0FESkFDRU5UX0lGXCI6IDMwLFxuICBcIjMwXCI6IFwiWF9WX0VMU0VfTk9fQURKQUNFTlRfSUZcIixcbiAgXCJYX1ZfRk9SX05PX0VYUFJFU1NJT05cIjogMzEsXG4gIFwiMzFcIjogXCJYX1ZfRk9SX05PX0VYUFJFU1NJT05cIixcbiAgXCJYX1ZfRk9SX01BTEZPUk1FRF9FWFBSRVNTSU9OXCI6IDMyLFxuICBcIjMyXCI6IFwiWF9WX0ZPUl9NQUxGT1JNRURfRVhQUkVTU0lPTlwiLFxuICBcIlhfVl9GT1JfVEVNUExBVEVfS0VZX1BMQUNFTUVOVFwiOiAzMyxcbiAgXCIzM1wiOiBcIlhfVl9GT1JfVEVNUExBVEVfS0VZX1BMQUNFTUVOVFwiLFxuICBcIlhfVl9CSU5EX05PX0VYUFJFU1NJT05cIjogMzQsXG4gIFwiMzRcIjogXCJYX1ZfQklORF9OT19FWFBSRVNTSU9OXCIsXG4gIFwiWF9WX09OX05PX0VYUFJFU1NJT05cIjogMzUsXG4gIFwiMzVcIjogXCJYX1ZfT05fTk9fRVhQUkVTU0lPTlwiLFxuICBcIlhfVl9TTE9UX1VORVhQRUNURURfRElSRUNUSVZFX09OX1NMT1RfT1VUTEVUXCI6I
20578DM2LFxuICBcIjM2XCI6IFwiWF9WX1NMT1RfVU5FWFBFQ1RFRF9ESVJFQ1RJVkVfT05fU0xPVF9PVVRMRVRcIixcbiAgXCJYX1ZfU0xPVF9NSVhFRF9TTE9UX1VTQUdFXCI6IDM3LFxuICBcIjM3XCI6IFwiWF9WX1NMT1RfTUlYRURfU0xPVF9VU0FHRVwiLFxuICBcIlhfVl9TTE9UX0RVUExJQ0FURV9TTE9UX05BTUVTXCI6IDM4LFxuICBcIjM4XCI6IFwiWF9WX1NMT1RfRFVQTElDQVRFX1NMT1RfTkFNRVNcIixcbiAgXCJYX1ZfU0xPVF9FWFRSQU5FT1VTX0RFRkFVTFRfU0xPVF9DSElMRFJFTlwiOiAzOSxcbiAgXCIzOVwiOiBcIlhfVl9TTE9UX0VYVFJBTkVPVVNfREVGQVVMVF9TTE9UX0NISUxEUkVOXCIsXG4gIFwiWF9WX1NMT1RfTUlTUExBQ0VEXCI6IDQwLFxuICBcIjQwXCI6IFwiWF9WX1NMT1RfTUlTUExBQ0VEXCIsXG4gIFwiWF9WX01PREVMX05PX0VYUFJFU1NJT05cIjogNDEsXG4gIFwiNDFcIjogXCJYX1ZfTU9ERUxfTk9fRVhQUkVTU0lPTlwiLFxuICBcIlhfVl9NT0RFTF9NQUxGT1JNRURfRVhQUkVTU0lPTlwiOiA0MixcbiAgXCI0MlwiOiBcIlhfVl9NT0RFTF9NQUxGT1JNRURfRVhQUkVTU0lPTlwiLFxuICBcIlhfVl9NT0RFTF9PTl9TQ09QRV9WQVJJQUJMRVwiOiA0MyxcbiAgXCI0M1wiOiBcIlhfVl9NT0RFTF9PTl9TQ09QRV9WQVJJQUJMRVwiLFxuICBcIlhfVl9NT0RFTF9PTl9QUk9QU1wiOiA0NCxcbiAgXCI0NFwiOiBcIlhfVl9NT0RFTF9PTl9QUk9QU1wiLFxuICBcIlhfSU5WQUxJRF9FWFBSRVNTSU9OXCI6IDQ1LFxuICBcIjQ1XCI6IFwiWF9JTlZBTElEX0VYUFJFU1NJT05cIixcbiAgXCJYX0tFRVBfQUxJVkVfSU5WQUxJRF9DSElMRFJFTlwiOiA0NixcbiAgXCI0NlwiOiBcIlhfS0VFUF9BTElWRV9JTlZBTElEX0NISUxEUkVOXCIsXG4gIFwiWF9QUkVGSVhfSURfTk9UX1NVUFBPUlRFRFwiOiA0NyxcbiAgXCI0N1wiOiBcIlhfUFJFRklYX0lEX05PVF9TVVBQT1JURURcIixcbiAgXCJYX01PRFVMRV9NT0RFX05PVF9TVVBQT1JURURcIjogNDgsXG4gIFwiNDhcIjogXCJYX01PRFVMRV9NT0RFX05PVF9TVVBQT1JURURcIixcbiAgXCJYX0NBQ0hFX0hBTkRMRVJfTk9UX1NVUFBPUlRFRFwiOiA0OSxcbiAgXCI0OVwiOiBcIlhfQ0FDSEVfSEFORExFUl9OT1RfU1VQUE9SVEVEXCIsXG4gIFwiWF9TQ09QRV9JRF9OT1RfU1VQUE9SVEVEXCI6IDUwLFxuICBcIjUwXCI6IFwiWF9TQ09QRV9JRF9OT1RfU1VQUE9SVEVEXCIsXG4gIFwiWF9WTk9ERV9IT09LU1wiOiA1MSxcbiAgXCI1MVwiOiBcIlhfVk5PREVfSE9PS1NcIixcbiAgXCJYX1ZfQklORF9JTlZBTElEX1NBTUVfTkFNRV9BUkdVTUVOVFwiOiA1MixcbiAgXCI1MlwiOiBcIlhfVl9CSU5EX0lOVkFMSURfU0FNRV9OQU1FX0FSR1VNRU5UXCIsXG4gIFwiX19FWFRFTkRfUE9JTlRfX1wiOiA1MyxcbiAgXCI1M1wiOiBcIl9fRVhURU5EX1BPSU5UX19cIlxufTtcbmNvbnN0IGVycm9yTWVzc2FnZXMgPSB7XG4gIC8vIHBhcnNlIGVycm9yc1xuICBbMF06IFwiSWxsZWdhbCBjb21tZW50LlwiLFxuICBbMV06IFwiQ0RBVEEgc2VjdGlvbiBpcyBhbGxvd2VkIG9ubHkgaW4gWE1MIGNvbnRleHQuXCIsXG4gIFsyXTogXCJEdXBsaWNhdGUgYXR0cmlidXRlLlwiLFxuICBbM106IFwiRW5kIHRhZyBjYW5ub3QgaGF2ZSBhdHRyaWJ1dGVzLlwiLFxuICBbNF06IFwiSWxsZWdhbCAnLycgaW4gdGFncy5cIixcbiAgWzVdOiBcIlVuZXhwZWN0ZWQgRU9GIGluIHRhZy5cIixcbiAgWzZdOiBcIlVuZXhwZWN0ZWQgRU9GIGluIENEQVRBIHNlY3Rpb24uXCIsXG4gIFs3XTogXCJVbmV4cGVjdGVkIEVPRiBpbiBjb21tZW50LlwiLFxuICBbOF06IFwiVW5leHBlY3RlZCBFT0YgaW4gc2NyaXB0LlwiLFxuICBbOV06IFwiVW5leHBlY3RlZCBFT0YgaW4gdGFnLlwiLFxuICBbMTBdOiBcIkluY29ycmVjdGx5IGNsb3NlZCBjb21tZW50LlwiLFxuICBbMTFdOiBcIkluY29ycmVjdGx5IG9wZW5lZCBjb21tZW50LlwiLFxuICBbMTJdOiBcIklsbGVnYWwgdGFnIG5hbWUuIFVzZSAnJmx0OycgdG8gcHJpbnQgJzwnLlwiLFxuICBbMTNdOiBcIkF0dHJpYnV0ZSB2YWx1ZSB3YXMgZXhwZWN0ZWQuXCIsXG4gIFsxNF06IFwiRW5kIHRhZyBuYW1lIHdhcyBleHBlY3RlZC5cIixcbiAgWzE1XTogXCJXaGl0ZXNwYWNlIHdhcyBleHBlY3RlZC5cIixcbiAgWzE2XTogXCJVbmV4cGVjdGVkICc8IS0tJyBpbiBjb21tZW50LlwiLFxuICBbMTddOiBgQXR0cmlidXRlIG5hbWUgY2Fubm90IGNvbnRhaW4gVSswMDIyIChcIiksIFUrMDAyNyAoJyksIGFuZCBVKzAwM0MgKDwpLmAsXG4gIFsxOF06IFwiVW5xdW90ZWQgYXR0cmlidXRlIHZhbHVlIGNhbm5vdCBjb250YWluIFUrMDAyMiAoXFxcIiksIFUrMDAyNyAoJyksIFUrMDAzQyAoPCksIFUrMDAzRCAoPSksIGFuZCBVKzAwNjAgKGApLlwiLFxuICBbMTldOiBcIkF0dHJpYnV0ZSBuYW1lIGNhbm5vdCBzdGFydCB3aXRoICc9Jy5cIixcbiAgWzIxXTogXCInPD8nIGlzIGFsbG93ZWQgb25seSBpbiBYTUwgY29udGV4dC5cIixcbiAgWzIwXTogYFVuZXhwZWN0ZWQgbnVsbCBjaGFyYWN0ZXIuYCxcbiAgWzIyXTogXCJJbGxlZ2FsICcvJyBpbiB0YWdzLlwiLFxuICAvLyBWdWUtc3BlY2lmaWMgcGFyc2UgZXJyb3JzXG4gIFsyM106IFwiSW52YWxpZCBlbmQgdGFnLlwiLFxuICBbMjRdOiBcIkVsZW1lbnQgaXMgbWlzc2luZyBlbmQgdGFnLlwiLFxuICBbMjVdOiBcIkludGVycG9sYXRpb24gZW5kIHNpZ24gd2FzIG5vdCBmb3VuZC5cIixcbiAgWzI3XTogXCJFbmQgYnJhY2tldCBmb3IgZHluYW1pYyBkaXJlY3RpdmUgYXJndW1lbnQgd2FzIG5vdCBmb3VuZC4gTm90ZSB0aGF0IGR5bmFtaWMgZGlyZWN0aXZlIGFyZ3VtZW50IGNhbm5vdCBjb250YWluIHNwYWNlcy5cIixcbiAgWzI2XTogXCJMZWdhbCBkaXJlY3RpdmUgbmFtZSB3YXMgZXhwZWN0ZWQuXCIsXG4gIC8vIHRyYW5zZm9ybSBlcnJvcnNcbiAgWzI4XTogYHYtaWYvdi1lbHNlLWlmIGlzIG1pc3NpbmcgZXhwcmVzc2lvbi5gLFxuICBbMjldOiBgdi1pZi9lbHNlIGJyYW5jaGVzIG11c3QgdXNlIHVuaXF1ZSBrZXlzLmAsXG4gIFszMF06IGB2LWVsc2Uvdi1lbHNlLWlmIGhhcyBubyBhZGphY2VudCB2LWlmIG9yIHYtZWxzZS1pZi5gLFxuICBbMzFdOiBgdi1mb3IgaXMgbWlzc2luZyBleHByZXNzaW9uLmAsXG4gIFszMl06IGB2LWZvciBoYXMgaW52YWxpZCBleHByZXNzaW9uLmAsXG4gIFszM106IGA8dGVtcGxhdGUgdi1mb3I+IGtleSBzaG91bGQgYmUgcGxhY2VkIG9uIHRoZSA8dGVtcGxhdGU+IHRhZy5gLFxuICBbMzRdOiBgdi1iaW5kIGlzIG1pc3NpbmcgZXhwcmVzc2lvbi5gLFxuICBbNTJdOiBgdi1iaW5kIHdpdGggc2FtZS1uYW1lIHNob3J0aGFuZCBvbmx5IGFsbG93cyBzdGF0aWMgYXJndW1lbnQuYCxcbiAgWzM1XTogYHYtb24gaXMgbWlzc2luZyBleHByZXNzaW9uLmAsXG4gIFszNl06IGBVbmV4cGVjdGVkIGN1c3RvbSBkaXJlY3RpdmUgb24gPHNsb3Q+IG91dGxldC5gLFxuICBbMzddOiBgTWl4ZWQgdi1zbG90IHVzYWdlIG9uIGJvdGggdGhlIGNvbXBvbmVudCBhbmQgbmVzdGVkIDx0
20578ZW1wbGF0ZT4uIFdoZW4gdGhlcmUgYXJlIG11bHRpcGxlIG5hbWVkIHNsb3RzLCBhbGwgc2xvdHMgc2hvdWxkIHVzZSA8dGVtcGxhdGU+IHN5bnRheCB0byBhdm9pZCBzY29wZSBhbWJpZ3VpdHkuYCxcbiAgWzM4XTogYER1cGxpY2F0ZSBzbG90IG5hbWVzIGZvdW5kLiBgLFxuICBbMzldOiBgRXh0cmFuZW91cyBjaGlsZHJlbiBmb3VuZCB3aGVuIGNvbXBvbmVudCBhbHJlYWR5IGhhcyBleHBsaWNpdGx5IG5hbWVkIGRlZmF1bHQgc2xvdC4gVGhlc2UgY2hpbGRyZW4gd2lsbCBiZSBpZ25vcmVkLmAsXG4gIFs0MF06IGB2LXNsb3QgY2FuIG9ubHkgYmUgdXNlZCBvbiBjb21wb25lbnRzIG9yIDx0ZW1wbGF0ZT4gdGFncy5gLFxuICBbNDFdOiBgdi1tb2RlbCBpcyBtaXNzaW5nIGV4cHJlc3Npb24uYCxcbiAgWzQyXTogYHYtbW9kZWwgdmFsdWUgbXVzdCBiZSBhIHZhbGlkIEphdmFTY3JpcHQgbWVtYmVyIGV4cHJlc3Npb24uYCxcbiAgWzQzXTogYHYtbW9kZWwgY2Fubm90IGJlIHVzZWQgb24gdi1mb3Igb3Igdi1zbG90IHNjb3BlIHZhcmlhYmxlcyBiZWNhdXNlIHRoZXkgYXJlIG5vdCB3cml0YWJsZS5gLFxuICBbNDRdOiBgdi1tb2RlbCBjYW5ub3QgYmUgdXNlZCBvbiBhIHByb3AsIGJlY2F1c2UgbG9jYWwgcHJvcCBiaW5kaW5ncyBhcmUgbm90IHdyaXRhYmxlLlxuVXNlIGEgdi1iaW5kIGJpbmRpbmcgY29tYmluZWQgd2l0aCBhIHYtb24gbGlzdGVuZXIgdGhhdCBlbWl0cyB1cGRhdGU6eCBldmVudCBpbnN0ZWFkLmAsXG4gIFs0NV06IGBFcnJvciBwYXJzaW5nIEphdmFTY3JpcHQgZXhwcmVzc2lvbjogYCxcbiAgWzQ2XTogYDxLZWVwQWxpdmU+IGV4cGVjdHMgZXhhY3RseSBvbmUgY2hpbGQgY29tcG9uZW50LmAsXG4gIFs1MV06IGBAdm5vZGUtKiBob29rcyBpbiB0ZW1wbGF0ZXMgYXJlIG5vIGxvbmdlciBzdXBwb3J0ZWQuIFVzZSB0aGUgdnVlOiBwcmVmaXggaW5zdGVhZC4gRm9yIGV4YW1wbGUsIEB2bm9kZS1tb3VudGVkIHNob3VsZCBiZSBjaGFuZ2VkIHRvIEB2dWU6bW91bnRlZC4gQHZub2RlLSogaG9va3Mgc3VwcG9ydCBoYXMgYmVlbiByZW1vdmVkIGluIDMuNC5gLFxuICAvLyBnZW5lcmljIGVycm9yc1xuICBbNDddOiBgXCJwcmVmaXhJZGVudGlmaWVyc1wiIG9wdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGluIHRoaXMgYnVpbGQgb2YgY29tcGlsZXIuYCxcbiAgWzQ4XTogYEVTIG1vZHVsZSBtb2RlIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBidWlsZCBvZiBjb21waWxlci5gLFxuICBbNDldOiBgXCJjYWNoZUhhbmRsZXJzXCIgb3B0aW9uIGlzIG9ubHkgc3VwcG9ydGVkIHdoZW4gdGhlIFwicHJlZml4SWRlbnRpZmllcnNcIiBvcHRpb24gaXMgZW5hYmxlZC5gLFxuICBbNTBdOiBgXCJzY29wZUlkXCIgb3B0aW9uIGlzIG9ubHkgc3VwcG9ydGVkIGluIG1vZHVsZSBtb2RlLmAsXG4gIC8vIGp1c3QgdG8gZnVsZmlsbCB0eXBlc1xuICBbNTNdOiBgYFxufTtcblxuZnVuY3Rpb24gd2Fsa0lkZW50aWZpZXJzKHJvb3QsIG9uSWRlbnRpZmllciwgaW5jbHVkZUFsbCA9IGZhbHNlLCBwYXJlbnRTdGFjayA9IFtdLCBrbm93bklkcyA9IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpKSB7XG4gIHtcbiAgICByZXR1cm47XG4gIH1cbn1cbmZ1bmN0aW9uIGlzUmVmZXJlbmNlZElkZW50aWZpZXIoaWQsIHBhcmVudCwgcGFyZW50U3RhY2spIHtcbiAge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuZnVuY3Rpb24gaXNJbkRlc3RydWN0dXJlQXNzaWdubWVudChwYXJlbnQsIHBhcmVudFN0YWNrKSB7XG4gIGlmIChwYXJlbnQgJiYgKHBhcmVudC50eXBlID09PSBcIk9iamVjdFByb3BlcnR5XCIgfHwgcGFyZW50LnR5cGUgPT09IFwiQXJyYXlQYXR0ZXJuXCIpKSB7XG4gICAgbGV0IGkgPSBwYXJlbnRTdGFjay5sZW5ndGg7XG4gICAgd2hpbGUgKGktLSkge1xuICAgICAgY29uc3QgcCA9IHBhcmVudFN0YWNrW2ldO1xuICAgICAgaWYgKHAudHlwZSA9PT0gXCJBc3NpZ25tZW50RXhwcmVzc2lvblwiKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChwLnR5cGUgIT09IFwiT2JqZWN0UHJvcGVydHlcIiAmJiAhcC50eXBlLmVuZHNXaXRoKFwiUGF0dGVyblwiKSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gaXNJbk5ld0V4cHJlc3Npb24ocGFyZW50U3RhY2spIHtcbiAgbGV0IGkgPSBwYXJlbnRTdGFjay5sZW5ndGg7XG4gIHdoaWxlIChpLS0pIHtcbiAgICBjb25zdCBwID0gcGFyZW50U3RhY2tbaV07XG4gICAgaWYgKHAudHlwZSA9PT0gXCJOZXdFeHByZXNzaW9uXCIpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSBpZiAocC50eXBlICE9PSBcIk1lbWJlckV4cHJlc3Npb25cIikge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIHdhbGtGdW5jdGlvblBhcmFtcyhub2RlLCBvbklkZW50KSB7XG4gIGZvciAoY29uc3QgcCBvZiBub2RlLnBhcmFtcykge1xuICAgIGZvciAoY29uc3QgaWQgb2YgZXh0cmFjdElkZW50aWZpZXJzKHApKSB7XG4gICAgICBvbklkZW50KGlkKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHdhbGtCbG9ja0RlY2xhcmF0aW9ucyhibG9jaywgb25JZGVudCkge1xuICBmb3IgKGNvbnN0IHN0bXQgb2YgYmxvY2suYm9keSkge1xuICAgIGlmIChzdG10LnR5cGUgPT09IFwiVmFyaWFibGVEZWNsYXJhdGlvblwiKSB7XG4gICAgICBpZiAoc3RtdC5kZWNsYXJlKSBjb250aW51ZTtcbiAgICAgIGZvciAoY29uc3QgZGVjbCBvZiBzdG10LmRlY2xhcmF0aW9ucykge1xuICAgICAgICBmb3IgKGNvbnN0IGlkIG9mIGV4dHJhY3RJZGVudGlmaWVycyhkZWNsLmlkKSkge1xuICAgICAgICAgIG9uSWRlbnQoaWQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChzdG10LnR5cGUgPT09IFwiRnVuY3Rpb25EZWNsYXJhdGlvblwiIHx8IHN0bXQudHlwZSA9PT0gXCJDbGFzc0RlY2xhcmF0aW9uXCIpIHtcbiAgICAgIGlmIChzdG10LmRlY2xhcmUgfHwgIXN0bXQuaWQpIGNvbnRpbnVlO1xuICAgICAgb25JZGVudChzdG10LmlkKTtcbiAgICB9IGVsc2UgaWYgKHN0bXQudHlwZSA9PT0gXCJGb3JPZlN0YXRlbWVudFwiIHx8IHN0bXQudHlwZSA9PT0gXCJGb3JJblN0YXRlbWVudFwiIHx8IHN0bXQudHlwZSA9PT0gXCJGb3JTdGF0ZW1lbnRcIikge1xuICAgICAgY29uc3QgdmFyaWFibGUgPSBzdG10LnR5cGUgPT09IFwiRm9yU3RhdGVtZW50XCIgPyBzdG10LmluaXQgOiBzdG10LmxlZnQ7XG4gICAgICBpZiAodmFyaWFibGUgJiYgdmFyaWFibGUudHlwZSA9PT0gXCJWYXJpYWJsZURlY2xhcmF0aW9uXCIpIHtcbiAgICAgICAgZm9yIChjb25zdCBkZWNsIG9mIHZhcmlhYmxlLmRlY2xhcmF0aW9ucykge1xuICAgICAgICAgIGZvciAoY29uc3QgaWQgb2YgZXh0cmFjdElkZW50aWZpZXJzKGRlY2wuaWQpKSB7XG4gICAgICAgICAgICBvbklkZW50KGlkKTtcbiAgICAgICAgICB9XG4gICAgICAgI
20578H1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGV4dHJhY3RJZGVudGlmaWVycyhwYXJhbSwgbm9kZXMgPSBbXSkge1xuICBzd2l0Y2ggKHBhcmFtLnR5cGUpIHtcbiAgICBjYXNlIFwiSWRlbnRpZmllclwiOlxuICAgICAgbm9kZXMucHVzaChwYXJhbSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwiTWVtYmVyRXhwcmVzc2lvblwiOlxuICAgICAgbGV0IG9iamVjdCA9IHBhcmFtO1xuICAgICAgd2hpbGUgKG9iamVjdC50eXBlID09PSBcIk1lbWJlckV4cHJlc3Npb25cIikge1xuICAgICAgICBvYmplY3QgPSBvYmplY3Qub2JqZWN0O1xuICAgICAgfVxuICAgICAgbm9kZXMucHVzaChvYmplY3QpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcIk9iamVjdFBhdHRlcm5cIjpcbiAgICAgIGZvciAoY29uc3QgcHJvcCBvZiBwYXJhbS5wcm9wZXJ0aWVzKSB7XG4gICAgICAgIGlmIChwcm9wLnR5cGUgPT09IFwiUmVzdEVsZW1lbnRcIikge1xuICAgICAgICAgIGV4dHJhY3RJZGVudGlmaWVycyhwcm9wLmFyZ3VtZW50LCBub2Rlcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZXh0cmFjdElkZW50aWZpZXJzKHByb3AudmFsdWUsIG5vZGVzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcIkFycmF5UGF0dGVyblwiOlxuICAgICAgcGFyYW0uZWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICBpZiAoZWxlbWVudCkgZXh0cmFjdElkZW50aWZpZXJzKGVsZW1lbnQsIG5vZGVzKTtcbiAgICAgIH0pO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcIlJlc3RFbGVtZW50XCI6XG4gICAgICBleHRyYWN0SWRlbnRpZmllcnMocGFyYW0uYXJndW1lbnQsIG5vZGVzKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJBc3NpZ25tZW50UGF0dGVyblwiOlxuICAgICAgZXh0cmFjdElkZW50aWZpZXJzKHBhcmFtLmxlZnQsIG5vZGVzKTtcbiAgICAgIGJyZWFrO1xuICB9XG4gIHJldHVybiBub2Rlcztcbn1cbmNvbnN0IGlzRnVuY3Rpb25UeXBlID0gKG5vZGUpID0+IHtcbiAgcmV0dXJuIC9GdW5jdGlvbig/OkV4cHJlc3Npb258RGVjbGFyYXRpb24pJHxNZXRob2QkLy50ZXN0KG5vZGUudHlwZSk7XG59O1xuY29uc3QgaXNTdGF0aWNQcm9wZXJ0eSA9IChub2RlKSA9PiBub2RlICYmIChub2RlLnR5cGUgPT09IFwiT2JqZWN0UHJvcGVydHlcIiB8fCBub2RlLnR5cGUgPT09IFwiT2JqZWN0TWV0aG9kXCIpICYmICFub2RlLmNvbXB1dGVkO1xuY29uc3QgaXNTdGF0aWNQcm9wZXJ0eUtleSA9IChub2RlLCBwYXJlbnQpID0+IGlzU3RhdGljUHJvcGVydHkocGFyZW50KSAmJiBwYXJlbnQua2V5ID09PSBub2RlO1xuY29uc3QgVFNfTk9ERV9UWVBFUyA9IFtcbiAgXCJUU0FzRXhwcmVzc2lvblwiLFxuICAvLyBmb28gYXMgbnVtYmVyXG4gIFwiVFNUeXBlQXNzZXJ0aW9uXCIsXG4gIC8vICg8bnVtYmVyPmZvbylcbiAgXCJUU05vbk51bGxFeHByZXNzaW9uXCIsXG4gIC8vIGZvbyFcbiAgXCJUU0luc3RhbnRpYXRpb25FeHByZXNzaW9uXCIsXG4gIC8vIGZvbzxzdHJpbmc+XG4gIFwiVFNTYXRpc2ZpZXNFeHByZXNzaW9uXCJcbiAgLy8gZm9vIHNhdGlzZmllcyBUXG5dO1xuZnVuY3Rpb24gdW53cmFwVFNOb2RlKG5vZGUpIHtcbiAgaWYgKFRTX05PREVfVFlQRVMuaW5jbHVkZXMobm9kZS50eXBlKSkge1xuICAgIHJldHVybiB1bndyYXBUU05vZGUobm9kZS5leHByZXNzaW9uKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbm9kZTtcbiAgfVxufVxuXG5jb25zdCBpc1N0YXRpY0V4cCA9IChwKSA9PiBwLnR5cGUgPT09IDQgJiYgcC5pc1N0YXRpYztcbmZ1bmN0aW9uIGlzQ29yZUNvbXBvbmVudCh0YWcpIHtcbiAgc3dpdGNoICh0YWcpIHtcbiAgICBjYXNlIFwiVGVsZXBvcnRcIjpcbiAgICBjYXNlIFwidGVsZXBvcnRcIjpcbiAgICAgIHJldHVybiBURUxFUE9SVDtcbiAgICBjYXNlIFwiU3VzcGVuc2VcIjpcbiAgICBjYXNlIFwic3VzcGVuc2VcIjpcbiAgICAgIHJldHVybiBTVVNQRU5TRTtcbiAgICBjYXNlIFwiS2VlcEFsaXZlXCI6XG4gICAgY2FzZSBcImtlZXAtYWxpdmVcIjpcbiAgICAgIHJldHVybiBLRUVQX0FMSVZFO1xuICAgIGNhc2UgXCJCYXNlVHJhbnNpdGlvblwiOlxuICAgIGNhc2UgXCJiYXNlLXRyYW5zaXRpb25cIjpcbiAgICAgIHJldHVybiBCQVNFX1RSQU5TSVRJT047XG4gIH1cbn1cbmNvbnN0IG5vbklkZW50aWZpZXJSRSA9IC9eXFxkfFteXFwkXFx3XFx4QTAtXFx1RkZGRl0vO1xuY29uc3QgaXNTaW1wbGVJZGVudGlmaWVyID0gKG5hbWUpID0+ICFub25JZGVudGlmaWVyUkUudGVzdChuYW1lKTtcbmNvbnN0IHZhbGlkRmlyc3RJZGVudENoYXJSRSA9IC9bQS1aYS16XyRcXHhBMC1cXHVGRkZGXS87XG5jb25zdCB2YWxpZElkZW50Q2hhclJFID0gL1tcXC5cXD9cXHckXFx4QTAtXFx1RkZGRl0vO1xuY29uc3Qgd2hpdGVzcGFjZVJFID0gL1xccytbLltdXFxzKnxcXHMqWy5bXVxccysvZztcbmNvbnN0IGlzTWVtYmVyRXhwcmVzc2lvbkJyb3dzZXIgPSAocGF0aCkgPT4ge1xuICBwYXRoID0gcGF0aC50cmltKCkucmVwbGFjZSh3aGl0ZXNwYWNlUkUsIChzKSA9PiBzLnRyaW0oKSk7XG4gIGxldCBzdGF0ZSA9IDAgLyogaW5NZW1iZXJFeHAgKi87XG4gIGxldCBzdGF0ZVN0YWNrID0gW107XG4gIGxldCBjdXJyZW50T3BlbkJyYWNrZXRDb3VudCA9IDA7XG4gIGxldCBjdXJyZW50T3BlblBhcmVuc0NvdW50ID0gMDtcbiAgbGV0IGN1cnJlbnRTdHJpbmdUeXBlID0gbnVsbDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXRoLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgY2hhciA9IHBhdGguY2hhckF0KGkpO1xuICAgIHN3aXRjaCAoc3RhdGUpIHtcbiAgICAgIGNhc2UgMCAvKiBpbk1lbWJlckV4cCAqLzpcbiAgICAgICAgaWYgKGNoYXIgPT09IFwiW1wiKSB7XG4gICAgICAgICAgc3RhdGVTdGFjay5wdXNoKHN0YXRlKTtcbiAgICAgICAgICBzdGF0ZSA9IDEgLyogaW5CcmFja2V0cyAqLztcbiAgICAgICAgICBjdXJyZW50T3BlbkJyYWNrZXRDb3VudCsrO1xuICAgICAgICB9IGVsc2UgaWYgKGNoYXIgPT09IFwiKFwiKSB7XG4gICAgICAgICAgc3RhdGVTdGFjay5wdXNoKHN0YXRlKTtcbiAgICAgICAgICBzdGF0ZSA9IDIgLyogaW5QYXJlbnMgKi87XG4gICAgICAgICAgY3VycmVudE9wZW5QYXJlbnNDb3VudCsrO1xuICAgICAgICB9IGVsc2UgaWYgKCEoaSA9PT0gMCA/IHZhbGlkRmlyc3RJZGVudENoYXJSRSA6IHZhbGlkSWRlbnRDaGFyUkUpLnRlc3QoY2hhcikpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgI
20578H1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDEgLyogaW5CcmFja2V0cyAqLzpcbiAgICAgICAgaWYgKGNoYXIgPT09IGAnYCB8fCBjaGFyID09PSBgXCJgIHx8IGNoYXIgPT09IFwiYFwiKSB7XG4gICAgICAgICAgc3RhdGVTdGFjay5wdXNoKHN0YXRlKTtcbiAgICAgICAgICBzdGF0ZSA9IDMgLyogaW5TdHJpbmcgKi87XG4gICAgICAgICAgY3VycmVudFN0cmluZ1R5cGUgPSBjaGFyO1xuICAgICAgICB9IGVsc2UgaWYgKGNoYXIgPT09IGBbYCkge1xuICAgICAgICAgIGN1cnJlbnRPcGVuQnJhY2tldENvdW50Kys7XG4gICAgICAgIH0gZWxzZSBpZiAoY2hhciA9PT0gYF1gKSB7XG4gICAgICAgICAgaWYgKCEtLWN1cnJlbnRPcGVuQnJhY2tldENvdW50KSB7XG4gICAgICAgICAgICBzdGF0ZSA9IHN0YXRlU3RhY2sucG9wKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAyIC8qIGluUGFyZW5zICovOlxuICAgICAgICBpZiAoY2hhciA9PT0gYCdgIHx8IGNoYXIgPT09IGBcImAgfHwgY2hhciA9PT0gXCJgXCIpIHtcbiAgICAgICAgICBzdGF0ZVN0YWNrLnB1c2goc3RhdGUpO1xuICAgICAgICAgIHN0YXRlID0gMyAvKiBpblN0cmluZyAqLztcbiAgICAgICAgICBjdXJyZW50U3RyaW5nVHlwZSA9IGNoYXI7XG4gICAgICAgIH0gZWxzZSBpZiAoY2hhciA9PT0gYChgKSB7XG4gICAgICAgICAgY3VycmVudE9wZW5QYXJlbnNDb3VudCsrO1xuICAgICAgICB9IGVsc2UgaWYgKGNoYXIgPT09IGApYCkge1xuICAgICAgICAgIGlmIChpID09PSBwYXRoLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCEtLWN1cnJlbnRPcGVuUGFyZW5zQ291bnQpIHtcbiAgICAgICAgICAgIHN0YXRlID0gc3RhdGVTdGFjay5wb3AoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDMgLyogaW5TdHJpbmcgKi86XG4gICAgICAgIGlmIChjaGFyID09PSBjdXJyZW50U3RyaW5nVHlwZSkge1xuICAgICAgICAgIHN0YXRlID0gc3RhdGVTdGFjay5wb3AoKTtcbiAgICAgICAgICBjdXJyZW50U3RyaW5nVHlwZSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHJldHVybiAhY3VycmVudE9wZW5CcmFja2V0Q291bnQgJiYgIWN1cnJlbnRPcGVuUGFyZW5zQ291bnQ7XG59O1xuY29uc3QgaXNNZW1iZXJFeHByZXNzaW9uTm9kZSA9IE5PT1AgO1xuY29uc3QgaXNNZW1iZXJFeHByZXNzaW9uID0gaXNNZW1iZXJFeHByZXNzaW9uQnJvd3NlciA7XG5mdW5jdGlvbiBhZHZhbmNlUG9zaXRpb25XaXRoQ2xvbmUocG9zLCBzb3VyY2UsIG51bWJlck9mQ2hhcmFjdGVycyA9IHNvdXJjZS5sZW5ndGgpIHtcbiAgcmV0dXJuIGFkdmFuY2VQb3NpdGlvbldpdGhNdXRhdGlvbihcbiAgICB7XG4gICAgICBvZmZzZXQ6IHBvcy5vZmZzZXQsXG4gICAgICBsaW5lOiBwb3MubGluZSxcbiAgICAgIGNvbHVtbjogcG9zLmNvbHVtblxuICAgIH0sXG4gICAgc291cmNlLFxuICAgIG51bWJlck9mQ2hhcmFjdGVyc1xuICApO1xufVxuZnVuY3Rpb24gYWR2YW5jZVBvc2l0aW9uV2l0aE11dGF0aW9uKHBvcywgc291cmNlLCBudW1iZXJPZkNoYXJhY3RlcnMgPSBzb3VyY2UubGVuZ3RoKSB7XG4gIGxldCBsaW5lc0NvdW50ID0gMDtcbiAgbGV0IGxhc3ROZXdMaW5lUG9zID0gLTE7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtYmVyT2ZDaGFyYWN0ZXJzOyBpKyspIHtcbiAgICBpZiAoc291cmNlLmNoYXJDb2RlQXQoaSkgPT09IDEwKSB7XG4gICAgICBsaW5lc0NvdW50Kys7XG4gICAgICBsYXN0TmV3TGluZVBvcyA9IGk7XG4gICAgfVxuICB9XG4gIHBvcy5vZmZzZXQgKz0gbnVtYmVyT2ZDaGFyYWN0ZXJzO1xuICBwb3MubGluZSArPSBsaW5lc0NvdW50O1xuICBwb3MuY29sdW1uID0gbGFzdE5ld0xpbmVQb3MgPT09IC0xID8gcG9zLmNvbHVtbiArIG51bWJlck9mQ2hhcmFjdGVycyA6IG51bWJlck9mQ2hhcmFjdGVycyAtIGxhc3ROZXdMaW5lUG9zO1xuICByZXR1cm4gcG9zO1xufVxuZnVuY3Rpb24gYXNzZXJ0KGNvbmRpdGlvbiwgbXNnKSB7XG4gIGlmICghY29uZGl0aW9uKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKG1zZyB8fCBgdW5leHBlY3RlZCBjb21waWxlciBjb25kaXRpb25gKTtcbiAgfVxufVxuZnVuY3Rpb24gZmluZERpcihub2RlLCBuYW1lLCBhbGxvd0VtcHR5ID0gZmFsc2UpIHtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2RlLnByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgcCA9IG5vZGUucHJvcHNbaV07XG4gICAgaWYgKHAudHlwZSA9PT0gNyAmJiAoYWxsb3dFbXB0eSB8fCBwLmV4cCkgJiYgKGlzU3RyaW5nKG5hbWUpID8gcC5uYW1lID09PSBuYW1lIDogbmFtZS50ZXN0KHAubmFtZSkpKSB7XG4gICAgICByZXR1cm4gcDtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGZpbmRQcm9wKG5vZGUsIG5hbWUsIGR5bmFtaWNPbmx5ID0gZmFsc2UsIGFsbG93RW1wdHkgPSBmYWxzZSkge1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGUucHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBwID0gbm9kZS5wcm9wc1tpXTtcbiAgICBpZiAocC50eXBlID09PSA2KSB7XG4gICAgICBpZiAoZHluYW1pY09ubHkpIGNvbnRpbnVlO1xuICAgICAgaWYgKHAubmFtZSA9PT0gbmFtZSAmJiAocC52YWx1ZSB8fCBhbGxvd0VtcHR5KSkge1xuICAgICAgICByZXR1cm4gcDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHAubmFtZSA9PT0gXCJiaW5kXCIgJiYgKHAuZXhwIHx8IGFsbG93RW1wdHkpICYmIGlzU3RhdGljQXJnT2YocC5hcmcsIG5hbWUpKSB7XG4gICAgICByZXR1cm4gcDtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGlzU3RhdGljQXJnT2YoYXJnLCBuYW1lKSB7XG4gIHJldHVybiAhIShhcmcgJiYgaXNTdGF0aWNFeHAoYXJnKSAmJiBhcmcuY29udGVudCA9PT0gbmFtZSk7XG59XG5mdW5jdGlvbiBoYXNEeW5hbWljS2V5VkJpbmQobm9kZSkge1xuICByZXR1cm4gbm9kZS5wcm9wcy5zb21lKFxuICAgIChwKSA9PiBwLnR5cGUgPT09IDcgJiYgcC5uYW1lID09PSBcImJpbmRcIiAmJiAoIXAuYXJnIHx8IC8vIHYtYmluZD1cIm9ialwiXG4gICAgcC5hcmcudHlwZSAhPT0gNCB8fCAvLyB2LWJpbmQ6W19jdHguZm9vXVxuICAgICFwLmFyZy5pc1N0YXRpYylcbiAgICAvLyB2LWJpbmQ6W2Zvb11cbiAgKTtcbn1cbmZ1bmN0aW9uIGlzVGV4dCQxKG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUudHlwZSA9PT0gNSB8fCBub2RlLnR5cGUgPT09IDI7XG59XG5mdW5jdGlvbiBpc1ZTbG90KHApIHtcbiAgcmV0dXJuIHAudHlwZSA9PT0gNyAmJiBwLm5hbWUgPT09IFwic2xvdFwiO1xufVxuZnVuY3Rpb24gaXNUZW1wbGF0ZU5vZGUobm9kZSkge1xuICByZXR1cm4gbm9kZS50eXBlID09PSAxICYmIG5vZGUudGFnVHlwZSA9PT0gMztcbn1cbmZ1bmN0aW9uIGlzU2xvdE91dGxldChub2RlKSB7XG4gIHJldHVybi
20578Bub2RlLnR5cGUgPT09IDEgJiYgbm9kZS50YWdUeXBlID09PSAyO1xufVxuY29uc3QgcHJvcHNIZWxwZXJTZXQgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldChbTk9STUFMSVpFX1BST1BTLCBHVUFSRF9SRUFDVElWRV9QUk9QU10pO1xuZnVuY3Rpb24gZ2V0VW5ub3JtYWxpemVkUHJvcHMocHJvcHMsIGNhbGxQYXRoID0gW10pIHtcbiAgaWYgKHByb3BzICYmICFpc1N0cmluZyhwcm9wcykgJiYgcHJvcHMudHlwZSA9PT0gMTQpIHtcbiAgICBjb25zdCBjYWxsZWUgPSBwcm9wcy5jYWxsZWU7XG4gICAgaWYgKCFpc1N0cmluZyhjYWxsZWUpICYmIHByb3BzSGVscGVyU2V0LmhhcyhjYWxsZWUpKSB7XG4gICAgICByZXR1cm4gZ2V0VW5ub3JtYWxpemVkUHJvcHMoXG4gICAgICAgIHByb3BzLmFyZ3VtZW50c1swXSxcbiAgICAgICAgY2FsbFBhdGguY29uY2F0KHByb3BzKVxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFtwcm9wcywgY2FsbFBhdGhdO1xufVxuZnVuY3Rpb24gaW5qZWN0UHJvcChub2RlLCBwcm9wLCBjb250ZXh0KSB7XG4gIGxldCBwcm9wc1dpdGhJbmplY3Rpb247XG4gIGxldCBwcm9wcyA9IG5vZGUudHlwZSA9PT0gMTMgPyBub2RlLnByb3BzIDogbm9kZS5hcmd1bWVudHNbMl07XG4gIGxldCBjYWxsUGF0aCA9IFtdO1xuICBsZXQgcGFyZW50Q2FsbDtcbiAgaWYgKHByb3BzICYmICFpc1N0cmluZyhwcm9wcykgJiYgcHJvcHMudHlwZSA9PT0gMTQpIHtcbiAgICBjb25zdCByZXQgPSBnZXRVbm5vcm1hbGl6ZWRQcm9wcyhwcm9wcyk7XG4gICAgcHJvcHMgPSByZXRbMF07XG4gICAgY2FsbFBhdGggPSByZXRbMV07XG4gICAgcGFyZW50Q2FsbCA9IGNhbGxQYXRoW2NhbGxQYXRoLmxlbmd0aCAtIDFdO1xuICB9XG4gIGlmIChwcm9wcyA9PSBudWxsIHx8IGlzU3RyaW5nKHByb3BzKSkge1xuICAgIHByb3BzV2l0aEluamVjdGlvbiA9IGNyZWF0ZU9iamVjdEV4cHJlc3Npb24oW3Byb3BdKTtcbiAgfSBlbHNlIGlmIChwcm9wcy50eXBlID09PSAxNCkge1xuICAgIGNvbnN0IGZpcnN0ID0gcHJvcHMuYXJndW1lbnRzWzBdO1xuICAgIGlmICghaXNTdHJpbmcoZmlyc3QpICYmIGZpcnN0LnR5cGUgPT09IDE1KSB7XG4gICAgICBpZiAoIWhhc1Byb3AocHJvcCwgZmlyc3QpKSB7XG4gICAgICAgIGZpcnN0LnByb3BlcnRpZXMudW5zaGlmdChwcm9wKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHByb3BzLmNhbGxlZSA9PT0gVE9fSEFORExFUlMpIHtcbiAgICAgICAgcHJvcHNXaXRoSW5qZWN0aW9uID0gY3JlYXRlQ2FsbEV4cHJlc3Npb24oY29udGV4dC5oZWxwZXIoTUVSR0VfUFJPUFMpLCBbXG4gICAgICAgICAgY3JlYXRlT2JqZWN0RXhwcmVzc2lvbihbcHJvcF0pLFxuICAgICAgICAgIHByb3BzXG4gICAgICAgIF0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcHJvcHMuYXJndW1lbnRzLnVuc2hpZnQoY3JlYXRlT2JqZWN0RXhwcmVzc2lvbihbcHJvcF0pKTtcbiAgICAgIH1cbiAgICB9XG4gICAgIXByb3BzV2l0aEluamVjdGlvbiAmJiAocHJvcHNXaXRoSW5qZWN0aW9uID0gcHJvcHMpO1xuICB9IGVsc2UgaWYgKHByb3BzLnR5cGUgPT09IDE1KSB7XG4gICAgaWYgKCFoYXN
20578Qcm9wKHByb3AsIHByb3BzKSkge1xuICAgICAgcHJvcHMucHJvcGVydGllcy51bnNoaWZ0KHByb3ApO1xuICAgIH1cbiAgICBwcm9wc1dpdGhJbmplY3Rpb24gPSBwcm9wcztcbiAgfSBlbHNlIHtcbiAgICBwcm9wc1dpdGhJbmplY3Rpb24gPSBjcmVhdGVDYWxsRXhwcmVzc2lvbihjb250ZXh0LmhlbHBlcihNRVJHRV9QUk9QUyksIFtcbiAgICAgIGNyZWF0ZU9iamVjdEV4cHJlc3Npb24oW3Byb3BdKSxcbiAgICAgIHByb3BzXG4gICAgXSk7XG4gICAgaWYgKHBhcmVudENhbGwgJiYgcGFyZW50Q2FsbC5jYWxsZWUgPT09IEdVQVJEX1JFQUNUSVZFX1BST1BTKSB7XG4gICAgICBwYXJlbnRDYWxsID0gY2FsbFBhdGhbY2FsbFBhdGgubGVuZ3RoIC0gMl07XG4gICAgfVxuICB9XG4gIGlmIChub2RlLnR5cGUgPT09IDEzKSB7XG4gICAgaWYgKHBhcmVudENhbGwpIHtcbiAgICAgIHBhcmVudENhbGwuYXJndW1lbnRzWzBdID0gcHJvcHNXaXRoSW5qZWN0aW9uO1xuICAgIH0gZWxzZSB7XG4gICAgICBub2RlLnByb3BzID0gcHJvcHNXaXRoSW5qZWN0aW9uO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAocGFyZW50Q2FsbCkge1xuICAgICAgcGFyZW50Q2FsbC5hcmd1bWVudHNbMF0gPSBwcm9wc1dpdGhJbmplY3Rpb247XG4gICAgfSBlbHNlIHtcbiAgICAgIG5vZGUuYXJndW1lbnRzWzJdID0gcHJvcHNXaXRoSW5qZWN0aW9uO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gaGFzUHJvcChwcm9wLCBwcm9wcykge1xuICBsZXQgcmVzdWx0ID0gZmFsc2U7XG4gIGlmIChwcm9wLmtleS50eXBlID09PSA0KSB7XG4gICAgY29uc3QgcHJvcEtleU5hbWUgPSBwcm9wLmtleS5jb250ZW50O1xuICAgIHJlc3VsdCA9IHByb3BzLnByb3BlcnRpZXMuc29tZShcbiAgICAgIChwKSA9PiBwLmtleS50eXBlID09PSA0ICYmIHAua2V5LmNvbnRlbnQgPT09IHByb3BLZXlOYW1lXG4gICAgKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gdG9WYWxpZEFzc2V0SWQobmFtZSwgdHlwZSkge1xuICByZXR1cm4gYF8ke3R5cGV9XyR7bmFtZS5yZXBsYWNlKC9bXlxcd10vZywgKHNlYXJjaFZhbHVlLCByZXBsYWNlVmFsdWUpID0+IHtcbiAgICByZXR1cm4gc2VhcmNoVmFsdWUgPT09IFwiLVwiID8gXCJfXCIgOiBuYW1lLmNoYXJDb2RlQXQocmVwbGFjZVZhbHVlKS50b1N0cmluZygpO1xuICB9KX1gO1xufVxuZnVuY3Rpb24gaGFzU2NvcGVSZWYobm9kZSwgaWRzKSB7XG4gIGlmICghbm9kZSB8fCBPYmplY3Qua2V5cyhpZHMpLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgIGNhc2UgMTpcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS5wcm9wcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBwID0gbm9kZS5wcm9wc1tpXTtcbiAgICAgICAgaWYgKHAudHlwZSA9PT0gNyAmJiAoaGFzU2NvcGVSZWYocC5hcmcsIGlkcykgfHwgaGFzU2NvcGVSZWYocC5leHAsIGlkcykpKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBub2RlLmNoaWxkcmVuLnNvbWUoKGMpID0+IGhhc1Njb3BlUmVmKGMsIGlkcykpO1xuICAgIGNhc2UgMTE6XG4gICAgICBpZiAoaGFzU2NvcGVSZWYobm9kZS5zb3VyY2UsIGlkcykpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gbm9kZS5jaGlsZHJlbi5zb21lKChjKSA9PiBoYXNTY29wZVJlZihjLCBpZHMpKTtcbiAgICBjYXNlIDk6XG4gICAgICByZXR1cm4gbm9kZS5icmFuY2hlcy5zb21lKChiKSA9PiBoYXNTY29wZVJlZihiLCBpZHMpKTtcbiAgICBjYXNlIDEwOlxuICAgICAgaWYgKGhhc1Njb3BlUmVmKG5vZGUuY29uZGl0aW9uLCBpZHMpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5vZGUuY2hpbGRyZW4uc29tZSgoYykgPT4gaGFzU2NvcGVSZWYoYywgaWRzKSk7XG4gICAgY2FzZSA0OlxuICAgICAgcmV0dXJuICFub2RlLmlzU3RhdGljICYmIGlzU2ltcGxlSWRlbnRpZmllcihub2RlLmNvbnRlbnQpICYmICEhaWRzW25vZGUuY29udGVudF07XG4gICAgY2FzZSA4OlxuICAgICAgcmV0dXJuIG5vZGUuY2hpbGRyZW4uc29tZSgoYykgPT4gaXNPYmplY3QoYykgJiYgaGFzU2NvcGVSZWYoYywgaWRzKSk7XG4gICAgY2FzZSA1OlxuICAgIGNhc2UgMTI6XG4gICAgICByZXR1cm4gaGFzU2NvcGVSZWYobm9kZS5jb250ZW50LCBpZHMpO1xuICAgIGNhc2UgMjpcbiAgICBjYXNlIDM6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgZGVmYXVsdDpcbiAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSA7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbmZ1bmN0aW9uIGdldE1lbW9lZFZOb2RlQ2FsbChub2RlKSB7XG4gIGlmIChub2RlLnR5cGUgPT09IDE0ICYmIG5vZGUuY2FsbGVlID09PSBXSVRIX01FTU8pIHtcbiAgICByZXR1cm4gbm9kZS5hcmd1bWVudHNbMV0ucmV0dXJucztcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbm9kZTtcbiAgfVxufVxuY29uc3QgZm9yQWxpYXNSRSA9IC8oW1xcc1xcU10qPylcXHMrKD86aW58b2YpXFxzKyhcXFNbXFxzXFxTXSopLztcblxuY29uc3QgZGVmYXVsdFBhcnNlck9wdGlvbnMgPSB7XG4gIHBhcnNlTW9kZTogXCJiYXNlXCIsXG4gIG5zOiAwLFxuICBkZWxpbWl0ZXJzOiBbYHt7YCwgYH19YF0sXG4gIGdldE5hbWVzcGFjZTogKCkgPT4gMCxcbiAgaXNWb2lkVGFnOiBOTyxcbiAgaXNQcmVUYWc6IE5PLFxuICBpc0N1c3RvbUVsZW1lbnQ6IE5PLFxuICBvbkVycm9yOiBkZWZhdWx0T25FcnJvcixcbiAgb25XYXJuOiBkZWZhdWx0T25XYXJuLFxuICBjb21tZW50czogISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSxcbiAgcHJlZml4SWRlbnRpZmllcnM6IGZhbHNlXG59O1xubGV0IGN1cnJlbnRPcHRpb25zID0gZGVmYXVsdFBhcnNlck9wdGlvbnM7XG5sZXQgY3VycmVudFJvb3QgPSBudWxsO1xubGV0IGN1cnJlbnRJbnB1dCA9IFwiXCI7XG5sZXQgY3VycmVudE9wZW5UYWcgPSBudWxsO1xubGV0IGN1cnJlbnRQcm9wID0gbnVsbDtcbmxldCBjdXJyZW50QXR0clZhbHVlID0gXCJcIjtcbmxldCBjdXJyZW50QXR0clN0YXJ0SW5kZXggPSAtMTtcbmxldCBjdXJyZW50QXR0ckVuZEluZGV4ID0gLTE7XG5sZXQgaW5QcmUgPSAwO1xubGV0IGluVlByZSA9IGZhbHNlO1xubGV0IGN1cnJlbnRWUHJlQm91bmRhcnkgPSBudWxsO1xuY29uc3Qgc3RhY2sgPSBbXTtcbmNvbnN0IHRva2VuaXplciA9IG5ldyBUb2tlbml6ZXIoc3RhY2ssIHtcbiAgb25lcnI6IGVtaXRFcnJvcixcbiAgb250ZXh0KHN0YXJ0LCBlbmQpIHtcbiAgICBvblRleHQoZ2V0U2xpY2Uoc3RhcnQsIGVuZCksIHN0YXJ0LCBlbmQpO1xuICB9LFxuICBvbnRleHRlbnRpdHkoY2hhciwgc3RhcnQsIGVuZCkge1xuICAgIG9uVGV4dChjaGFyLCBzdGFydCwgZW5kKTtcbiAgfSxcbiAgb25pbnRlcnBvbGF0aW9uKHN0YXJ0LCBlbmQpIHtcbiAgICBpZiAoaW5WUHJlKSB7XG4gICAgICByZXR1cm4gb25UZXh0KGdldFNsaWNlKHN0YXJ0LCBlbmQpLCBzdGFydCwgZW5kKTtcbiAgICB9XG4gICAgbGV0IGlubmVyU3RhcnQgPSBzdGFydCArIHRva2VuaXplci5kZWxpbWl0ZXJPcGVuLmxlbmd0aDtcbiAgICBsZXQgaW5uZXJFbmQgPSBlbmQgLSB0b2tlbml6ZXIuZGVsaW1pdGVyQ2xvc2UubGVuZ3RoO1xuICAgIHdoaWxlIChpc1doaXRlc3BhY2UoY3VycmVudElucHV0LmNoYXJDb2RlQXQoaW5uZXJTdGFydCkpKSB7XG4gICAgICBpbm5lclN0YXJ0Kys7XG4gICAgfVxuICAgIHdoaWxlIChpc1doaXRlc3BhY2UoY3VycmVudElucHV0LmNoYXJDb2RlQXQoaW5uZXJFbmQgLSAxKSkpIHtcbiAgICAgIGlubmVyRW5kLS07XG4gICAgfVxuICAgIGxldCBleHAgPSBnZXRTbGljZShpbm5lclN0YXJ0LCBpbm5lckVuZCk7XG4gICAgaWYgKGV4cC5pbmNsdWRlcyhcIiZcIikpIHtcbiAgICAgIHtcbiAgICAgICAgZXhwID0gY3VycmVudE9wdGlvbnMuZGVjb2RlRW50aXRpZXMoZXhwLCBmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGFkZE5vZGUoe1xuICAgICAgdHlwZTogNSxcbiAgICAgIGNvbnRlbnQ6IGNyZWF0ZUV4cChleHAsIGZhbHNlLCBnZXRMb2MoaW5uZXJTdGFydCwgaW5uZXJFbmQpKSxcbiAgICAgIGxvYzogZ2V0TG9jKHN0YXJ0LCBlbmQpXG4gICAgfSk7XG4gIH0sXG4gIG9ub3BlbnRhZ25hbWUoc3RhcnQsIGVuZCkge1xuICAgIGNvbnN0IG5hbW
20578UgPSBnZXRTbGljZShzdGFydCwgZW5kKTtcbiAgICBjdXJyZW50T3BlblRhZyA9IHtcbiAgICAgIHR5cGU6IDEsXG4gICAgICB0YWc6IG5hbWUsXG4gICAgICBuczogY3VycmVudE9wdGlvbnMuZ2V0TmFtZXNwYWNlKG5hbWUsIHN0YWNrWzBdLCBjdXJyZW50T3B0aW9ucy5ucyksXG4gICAgICB0YWdUeXBlOiAwLFxuICAgICAgLy8gd2lsbCBiZSByZWZpbmVkIG9uIHRhZyBjbG9zZVxuICAgICAgcHJvcHM6IFtdLFxuICAgICAgY2hpbGRyZW46IFtdLFxuICAgICAgbG9jOiBnZXRMb2Moc3RhcnQgLSAxLCBlbmQpLFxuICAgICAgY29kZWdlbk5vZGU6IHZvaWQgMFxuICAgIH07XG4gIH0sXG4gIG9ub3BlbnRhZ2VuZChlbmQpIHtcbiAgICBlbmRPcGVuVGFnKGVuZCk7XG4gIH0sXG4gIG9uY2xvc2V0YWcoc3RhcnQsIGVuZCkge1xuICAgIGNvbnN0IG5hbWUgPSBnZXRTbGljZShzdGFydCwgZW5kKTtcbiAgICBpZiAoIWN1cnJlbnRPcHRpb25zLmlzVm9pZFRhZyhuYW1lKSkge1xuICAgICAgbGV0IGZvdW5kID0gZmFsc2U7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0YWNrLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGUgPSBzdGFja1tpXTtcbiAgICAgICAgaWYgKGUudGFnLnRvTG93ZXJDYXNlKCkgPT09IG5hbWUudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICAgIGZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICBpZiAoaSA+IDApIHtcbiAgICAgICAgICAgIGVtaXRFcnJvcigyNCwgc3RhY2tbMF0ubG9jLnN0YXJ0Lm9mZnNldCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDw9IGk7IGorKykge1xuICAgICAgICAgICAgY29uc3QgZWwgPSBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgb25DbG9zZVRhZyhlbCwgZW5kLCBqIDwgaSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIWZvdW5kKSB7XG4gICAgICAgIGVtaXRFcnJvcigyMywgYmFja1RyYWNrKHN0YXJ0LCA2MCkpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgb25zZWxmY2xvc2luZ3RhZyhlbmQpIHtcbiAgICBjb25zdCBuYW1lID0gY3VycmVudE9wZW5UYWcudGFnO1xuICAgIGN1cnJlbnRPcGVuVGFnLmlzU2VsZkNsb3NpbmcgPSB0cnVlO1xuICAgIGVuZE9wZW5UYWcoZW5kKTtcbiAgICBpZiAoc3RhY2tbMF0gJiYgc3RhY2tbMF0udGFnID09PSBuYW1lKSB7XG4gICAgICBvbkNsb3NlVGFnKHN0YWNrLnNoaWZ0KCksIGVuZCk7XG4gICAgfVxuICB9LFxuICBvbmF0dHJpYm5hbWUoc3RhcnQsIGVuZCkge1xuICAgIGN1cnJlbnRQcm9wID0ge1xuICAgICAgdHlwZTogNixcbiAgICAgIG5hbWU6IGdldFNsaWNlKHN0YXJ0LCBlbmQpLFxuICAgICAgbmFtZUxvYzogZ2V0TG9jKHN0YXJ0LCBlbmQpLFxuICAgICAgdmFsdWU6IHZvaWQgMCxcbiAgICAgIGxvYzogZ2V0TG9jKHN0YXJ0KVxuICAgIH07XG4gIH0sXG4gIG9uZGlybmFtZShzdGFydCwgZW5kKSB7XG4gICAgY29uc3QgcmF3ID0gZ2V0U2xpY2Uoc3RhcnQsIGVuZCk7XG4gICAgY29uc3QgbmFtZSA9IHJhdyA9PT0gXCIuXCIgfHwgcmF3ID09PSBcIjpcIiA/IFwiYmluZFwiIDogcmF3ID09PSBcIkBcIiA/IFwib25cIiA6IHJhdyA9PT0gXCIjXCIgPyBcInNsb3RcIiA6IHJhdy5zbGljZSgyKTtcbiAgICBpZiAoIWluVlByZSAmJiBuYW1lID09PSBcIlwiKSB7XG4gICAgICBlbWl0RXJyb3IoMjYsIHN0YXJ0KTtcbiAgICB9XG4gICAgaWYgKGluVlByZSB8fCBuYW1lID09PSBcIlwiKSB7XG4gICAgICBjdXJyZW50UHJvcCA9IHtcbiAgICAgICAgdHlwZTogNixcbiAgICAgICAgbmFtZTogcmF3LFxuICAgICAgICBuYW1lTG9jOiBnZXRMb2Moc3RhcnQsIGVuZCksXG4gICAgICAgIHZhbHVlOiB2b2lkIDAsXG4gICAgICAgIGxvYzogZ2V0TG9jKHN0YXJ0KVxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgY3VycmVudFByb3AgPSB7XG4gICAgICAgIHR5cGU6IDcsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIHJhd05hbWU6IHJhdyxcbiAgICAgICAgZXhwOiB2b2lkIDAsXG4gICAgICAgIGFyZzogdm9pZCAwLFxuICAgICAgICBtb2RpZmllcnM6IHJhdyA9PT0gXCIuXCIgPyBbXCJwcm9wXCJdIDogW10sXG4gICAgICAgIGxvYzogZ2V0TG9jKHN0YXJ0KVxuICAgICAgfTtcbiAgICAgIGlmIChuYW1lID09PSBcInByZVwiKSB7XG4gICAgICAgIGluVlByZSA9IHRva2VuaXplci5pblZQcmUgPSB0cnVlO1xuICAgICAgICBjdXJyZW50VlByZUJvdW5kYXJ5ID0gY3VycmVudE9wZW5UYWc7XG4gICAgICAgIGNvbnN0IHByb3BzID0gY3VycmVudE9wZW5UYWcucHJvcHM7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAocHJvcHNbaV0udHlwZSA9PT0gNykge1xuICAgICAgICAgICAgcHJvcHNbaV0gPSBkaXJUb0F0dHIocHJvcHNbaV0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgb25kaXJhcmcoc3RhcnQsIGVuZCkge1xuICAgIGlmIChzdGFydCA9PT0gZW5kKSByZXR1cm47XG4gICAgY29uc3QgYXJnID0gZ2V0U2xpY2Uoc3RhcnQsIGVuZCk7XG4gICAgaWYgKGluVlByZSkge1xuICAgICAgY3VycmVudFByb3AubmFtZSArPSBhcmc7XG4gICAgICBzZXRMb2NFbmQoY3VycmVudFByb3AubmFtZUxvYywgZW5kKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgaXNTdGF0aWMgPSBhcmdbMF0gIT09IGBbYDtcbiAgICAgIGN1cnJlbnRQcm9wLmFyZyA9IGNyZWF0ZUV4cChcbiAgICAgICAgaXNTdGF0aWMgPyBhcmcgOiBhcmcuc2xpY2UoMSwgLTEpLFxuICAgICAgICBpc1N0YXRpYyxcbiAgICAgICAgZ2V0TG9jKHN0YXJ0LCBlbmQpLFxuICAgICAgICBpc1N0YXRpYyA/IDMgOiAwXG4gICAgICApO1xuICAgIH1cbiAgfSxcbiAgb25kaXJtb2RpZmllcihzdGFydCwgZW5kKSB7XG4gICAgY29uc3QgbW9kID0gZ2V0U2xpY2Uoc3RhcnQsIGVuZCk7XG4gICAgaWYgKGluVlByZSkge1xuICAgICAgY3VycmVudFByb3AubmFtZSArPSBcIi5cIiArIG1vZDtcbiAgICAgIHNldExvY0VuZChjdXJyZW50UHJvcC5uYW1lTG9jLCBlbmQpO1xuICAgIH0gZWxzZSBpZiAoY3VycmVudFByb3AubmFtZSA9PT0gXCJzbG90XCIpIHtcbiAgICAgIGNvbnN0IGFyZyA9IGN1cnJlbnRQcm9wLmFyZztcbiAgICAgIGlmIChhcmcpIHtcbiAgICAgICAgYXJnLmNvbnRlbnQgKz0gXCIuXCIgKyBtb2Q7XG4gICAgICAgI
20578HNldExvY0VuZChhcmcubG9jLCBlbmQpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjdXJyZW50UHJvcC5tb2RpZmllcnMucHVzaChtb2QpO1xuICAgIH1cbiAgfSxcbiAgb25hdHRyaWJkYXRhKHN0YXJ0LCBlbmQpIHtcbiAgICBjdXJyZW50QXR0clZhbHVlICs9IGdldFNsaWNlKHN0YXJ0LCBlbmQpO1xuICAgIGlmIChjdXJyZW50QXR0clN0YXJ0SW5kZXggPCAwKSBjdXJyZW50QXR0clN0YXJ0SW5kZXggPSBzdGFydDtcbiAgICBjdXJyZW50QXR0ckVuZEluZGV4ID0gZW5kO1xuICB9LFxuICBvbmF0dHJpYmVudGl0eShjaGFyLCBzdGFydCwgZW5kKSB7XG4gICAgY3VycmVudEF0dHJWYWx1ZSArPSBjaGFyO1xuICAgIGlmIChjdXJyZW50QXR0clN0YXJ0SW5kZXggPCAwKSBjdXJyZW50QXR0clN0YXJ0SW5kZXggPSBzdGFydDtcbiAgICBjdXJyZW50QXR0ckVuZEluZGV4ID0gZW5kO1xuICB9LFxuICBvbmF0dHJpYm5hbWVlbmQoZW5kKSB7XG4gICAgY29uc3Qgc3RhcnQgPSBjdXJyZW50UHJvcC5sb2Muc3RhcnQub2Zmc2V0O1xuICAgIGNvbnN0IG5hbWUgPSBnZXRTbGljZShzdGFydCwgZW5kKTtcbiAgICBpZiAoY3VycmVudFByb3AudHlwZSA9PT0gNykge1xuICAgICAgY3VycmVudFByb3AucmF3TmFtZSA9IG5hbWU7XG4gICAgfVxuICAgIGlmIChjdXJyZW50T3BlblRhZy5wcm9wcy5zb21lKFxuICAgICAgKHApID0+IChwLnR5cGUgPT09IDcgPyBwLnJhd05hbWUgOiBwLm5hbWUpID09PSBuYW1lXG4gICAgKSkge1xuICAgICAgZW1pdEVycm9yKDIsIHN0YXJ0KTtcbiAgICB9XG4gIH0sXG4gIG9uYXR0cmliZW5kKHF1b3RlLCBlbmQpIHtcbiAgICBpZiAoY3VycmVudE9wZW5UYWcgJiYgY3VycmVudFByb3ApIHtcbiAgICAgIHNldExvY0VuZChjdXJyZW50UHJvcC5sb2MsIGVuZCk7XG4gICAgICBpZiAocXVvdGUgIT09IDApIHtcbiAgICAgICAgaWYgKGN1cnJlbnRBdHRyVmFsdWUuaW5jbHVkZXMoXCImXCIpKSB7XG4gICAgICAgICAgY3VycmVudEF0dHJWYWx1ZSA9IGN1cnJlbnRPcHRpb25zLmRlY29kZUVudGl0aWVzKFxuICAgICAgICAgICAgY3VycmVudEF0dHJWYWx1ZSxcbiAgICAgICAgICAgIHRydWVcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjdXJyZW50UHJvcC50eXBlID09PSA2KSB7XG4gICAgICAgICAgaWYgKGN1cnJlbnRQcm9wLm5hbWUgPT09IFwiY2xhc3NcIikge1xuICAgICAgICAgICAgY3VycmVudEF0dHJWYWx1ZSA9IGNvbmRlbnNlKGN1cnJlbnRBdHRyVmFsdWUpLnRyaW0oKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHF1b3RlID09PSAxICYmICFjdXJyZW50QXR0clZhbHVlKSB7XG4gICAgICAgICAgICBlbWl0RXJyb3IoMTMsIGVuZCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGN1cnJlbnRQcm9wLnZhbHVlID0ge1xuICAgICAgICAgICAgdHlwZTogMixcbiAgICAgICAgICAgIGNvbnRlbnQ6IGN1cnJlbnRBdHRyVmFsdWUsXG4gICAgICAgICAgICBsb2M6IHF1b3RlID09PSAxID8gZ2V0TG9jKGN1cnJlbnRBdHRyU3RhcnRJbmRleCwgY3VycmVudEF0dHJFbmRJbmRleCkgOiBnZXRMb2MoY3VycmVudEF0dHJTdGFydEluZGV4IC0gMSwgY3VycmVudEF0dHJFbmRJbmRleCArIDEpXG4gICAgICAgICAgfTtcbiAgICAgICAgICBpZiAodG9rZW5pemVyLmluU0ZDUm9vdCAmJiBjdXJyZW50T3BlblRhZy50YWcgPT09IFwidGVtcGxhdGVcIiAmJiBjdXJyZW50UHJvcC5uYW1lID09PSBcImxhbmdcIiAmJiBjdXJyZW50QXR0clZhbHVlICYmIGN1cnJlbnRBdHRyVmFsdWUgIT09IFwiaHRtbFwiKSB7XG4gICAgICAgICAgICB0b2tlbml6ZXIuZW50ZXJSQ0RBVEEodG9DaGFyQ29kZXMoYDwvdGVtcGxhdGVgKSwgMCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxldCBleHBQYXJzZU1vZGUgPSAwIC8qIE5vcm1hbCAqLztcbiAgICAgICAgICBjdXJyZW50UHJvcC5leHAgPSBjcmVhdGVFeHAoXG4gICAgICAgICAgICBjdXJyZW50QXR0clZhbHVlLFxuICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICBnZXRMb2MoY3VycmVudEF0dHJTdGFydEluZGV4LCBjdXJyZW50QXR0ckVuZEluZGV4KSxcbiAgICAgICAgICAgIDAsXG4gICAgICAgICAgICBleHBQYXJzZU1vZGVcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChjdXJyZW50UHJvcC5uYW1lID09PSBcImZvclwiKSB7XG4gICAgICAgICAgICBjdXJyZW50UHJvcC5mb3JQYXJzZVJlc3VsdCA9IHBhcnNlRm9yRXhwcmVzc2lvbihjdXJyZW50UHJvcC5leHApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBsZXQgc3luY0luZGV4ID0gLTE7XG4gICAgICAgICAgaWYgKGN1cnJlbnRQcm9wLm5hbWUgPT09IFwiYmluZFwiICYmIChzeW5jSW5kZXggPSBjdXJyZW50UHJvcC5tb2RpZmllcnMuaW5kZXhPZihcInN5bmNcIikpID4gLTEgJiYgY2hlY2tDb21wYXRFbmFibGVkKFxuICAgICAgICAgICAgXCJDT01QSUxFUl9WX0JJTkRfU1lOQ1wiLFxuICAgICAgICAgICAgY3VycmVudE9wdGlvbnMsXG4gICAgICAgICAgICBjdXJyZW50UHJvcC5sb2MsXG4gICAgICAgICAgICBjdXJyZW50UHJvcC5yYXdOYW1lXG4gICAgICAgICAgKSkge1xuICAgICAgICAgICAgY3VycmVudFByb3AubmFtZSA9IFwibW9kZWxcIjtcbiAgICAgICAgICAgIGN1cnJlbnRQcm9wLm1vZGlmaWVycy5zcGxpY2Uoc3luY0luZGV4LCAxKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChjdXJyZW50UHJvcC50eXBlICE9PSA3IHx8IGN1cnJlbnRQcm9wLm5hbWUgIT09IFwicHJlXCIpIHtcbiAgICAgICAgY3VycmVudE9wZW5UYWcucHJvcHMucHVzaChjdXJyZW50UHJvcCk7XG4gICAgICB9XG4gICAgfVxuICAgIGN1cnJlbnRBdHRyVmFsdWUgPSBcIlwiO1xuICAgIGN1cnJlbnRBdHRyU3RhcnRJbmRleCA9IGN1cnJlbnRBdHRyRW5kSW5kZXggPSAtMTtcbiAgfSxcbiAgb25jb21tZW50KHN0YXJ0LCBlbmQpIHtcbiAgICBpZiAoY3VycmVudE9wdGlvbnMuY29tbWVudHMpIHtcbiAgICAgIGFkZE5vZGUoe1xuICAgICAgICB0eXBlOiAzLFxuICAgICAgICBjb250ZW50OiBnZXRTbGljZShzdGFydCwgZW5kKSxcbiAgICAgICAgbG9jOiBnZXRMb2Moc3RhcnQgLSA0LCBlbmQgKyAzKVxuICAgICAgfSk7XG4gICAgfVxuICB9LFxuICBvbmVuZCgpIHtcbiAgICBjb25zdCBlbmQgPSBjdXJyZW50SW5wdXQubGVuZ3RoO1xuICAgIGlmICgoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCBmYWxzZSkgJiYgdG9rZW5pemVyLnN0YXRlICE9PSAxKSB7XG4gICAgICBzd2l0Y2ggKHRva2VuaXplci5zdGF0ZSkge1xuICAgICAgICBjYXNlIDU6XG4gICAgICAgIGNhc2UgODpcbiAgICAgICAgICBlbWl0RXJyb3IoNSwgZW5kKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgZW1pdEVycm9yKFxuICAgICAgICAgICAgMjUsXG4gICAgICAgICAgICB0b2tlbml6ZXIuc2VjdGlvblN0YXJ0XG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyODpcbiAgICAgICAgICBpZiAodG9rZW5pemVyLmN1cnJlbnRTZXF1ZW5jZSA9PT0gU2VxdWVuY2VzLkNkYXRhRW5kKSB7XG4gICAgICAgICAgICBlbWl0RXJyb3IoNiwgZW5kKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZW1pdEVycm9yKDcsIGVuZCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDY6XG4gICAgICAgIGNhc2UgNzpcbiAgICAgICAgY2FzZSA5OlxuICAgICAgICBjYXNlIDExOlxuICAgICAgICBjYXNlIDEyOlxuICAgICAgICBjYXNlIDEzOlxuICAgICAgICBjYXNlIDE0OlxuICAgICAgICBjYXNlIDE1OlxuICAgICAgICBjYXNlIDE2OlxuICAgICAgICBjYXNlIDE3OlxuICAgICAgICBjYXNlIDE4OlxuICAgICAgICBjYXNlIDE5OlxuICAgICAgICBjYXNlIDIwOlxuICAgICAgICBjYXNlIDIxOlxuICAgICAgICAgIGVtaXRFcnJvcig5LCBlbmQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgc3RhY2subGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICBvbkNsb3NlVGFnKHN0YWNrW2luZGV4XSwgZW5kIC0gMSk7XG4gICAgICBlbWl0RXJyb3IoMjQsIHN0YWNrW2luZGV4XS5sb2Muc3RhcnQub2Zmc2V0KTtcbiAgICB9XG4gI
20578H0sXG4gIG9uY2RhdGEoc3RhcnQsIGVuZCkge1xuICAgIGlmIChzdGFja1swXS5ucyAhPT0gMCkge1xuICAgICAgb25UZXh0KGdldFNsaWNlKHN0YXJ0LCBlbmQpLCBzdGFydCwgZW5kKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZW1pdEVycm9yKDEsIHN0YXJ0IC0gOSk7XG4gICAgfVxuICB9LFxuICBvbnByb2Nlc3NpbmdpbnN0cnVjdGlvbihzdGFydCkge1xuICAgIGlmICgoc3RhY2tbMF0gPyBzdGFja1swXS5ucyA6IGN1cnJlbnRPcHRpb25zLm5zKSA9PT0gMCkge1xuICAgICAgZW1pdEVycm9yKFxuICAgICAgICAyMSxcbiAgICAgICAgc3RhcnQgLSAxXG4gICAgICApO1xuICAgIH1cbiAgfVxufSk7XG5jb25zdCBmb3JJdGVyYXRvclJFID0gLywoW14sXFx9XFxdXSopKD86LChbXixcXH1cXF1dKikpPyQvO1xuY29uc3Qgc3RyaXBQYXJlbnNSRSA9IC9eXFwofFxcKSQvZztcbmZ1bmN0aW9uIHBhcnNlRm9yRXhwcmVzc2lvbihpbnB1dCkge1xuICBjb25zdCBsb2MgPSBpbnB1dC5sb2M7XG4gIGNvbnN0IGV4cCA9IGlucHV0LmNvbnRlbnQ7XG4gIGNvbnN0IGluTWF0Y2ggPSBleHAubWF0Y2goZm9yQWxpYXNSRSk7XG4gIGlmICghaW5NYXRjaCkgcmV0dXJuO1xuICBjb25zdCBbLCBMSFMsIFJIU10gPSBpbk1hdGNoO1xuICBjb25zdCBjcmVhdGVBbGlhc0V4cHJlc3Npb24gPSAoY29udGVudCwgb2Zmc2V0LCBhc1BhcmFtID0gZmFsc2UpID0+IHtcbiAgICBjb25zdCBzdGFydCA9IGxvYy5zdGFydC5vZmZzZXQgKyBvZmZzZXQ7XG4gICAgY29uc3QgZW5kID0gc3RhcnQgKyBjb250ZW50Lmxlbmd0aDtcbiAgICByZXR1cm4gY3JlYXRlRXhwKFxuICAgICAgY29udGVudCxcbiAgICAgIGZhbHNlLFxuICAgICAgZ2V0TG9jKHN0YXJ0LCBlbmQpLFxuICAgICAgMCxcbiAgICAgIGFzUGFyYW0gPyAxIC8qIFBhcmFtcyAqLyA6IDAgLyogTm9ybWFsICovXG4gICAgKTtcbiAgfTtcbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgIHNvdXJjZTogY3JlYXRlQWxpYXNFeHByZXNzaW9uKFJIUy50cmltKCksIGV4cC5pbmRleE9mKFJIUywgTEhTLmxlbmd0aCkpLFxuICAgIHZhbHVlOiB2b2lkIDAsXG4gICAga2V5OiB2b2lkIDAsXG4gICAgaW5kZXg6IHZvaWQgMCxcbiAgICBmaW5hbGl6ZWQ6IGZhbHNlXG4gIH07XG4gIGxldCB2YWx1ZUNvbnRlbnQgPSBMSFMudHJpbSgpLnJlcGxhY2Uoc3RyaXBQYXJlbnNSRSwgXCJcIikudHJpbSgpO1xuICBjb25zdCB0cmltbWVkT2Zmc2V0ID0gTEhTLmluZGV4T2YodmFsdWVDb250ZW50KTtcbiAgY29uc3QgaXRlcmF0b3JNYXRjaCA9IHZhbHVlQ29udGVudC5tYXRjaChmb3JJdGVyYXRvclJFKTtcbiAgaWYgKGl0ZXJhdG9yTWF0Y2gpIHtcbiAgICB2YWx1ZUNvbnRlbnQgPSB2YWx1ZUNvbnRlbnQucmVwbGFjZShmb3JJdGVyYXRvclJFLCBcIlwiKS50cmltKCk7XG4gICAgY29uc3Qga2V5Q29udGVudCA9IGl0ZXJhdG9yTWF0Y2hbMV0udHJpbSgpO1xuICAgIGxldCBrZXlPZmZzZXQ7XG4gICAgaWYgKGtleUNvbnRlbnQpIHtcbiAgICAgIGtleU9mZnNldCA9IGV4cC5pbmRleE9mKGtleUNvbnRlbnQsIHRyaW1tZWRPZmZzZXQgKyB2YWx1ZUNvbnRlbnQubGVuZ3RoKTtcbiAgICAgIHJlc3VsdC5rZXkgPSBjcmVhdGVBbGlhc0V4cHJlc3Npb24oa2V5Q29udGVudCwga2V5T2Zmc2V0LCB0cnVlKTtcbiAgICB9XG4gICAgaWYgKGl0ZXJhdG9yTWF0Y2hbMl0pIHtcbiAgICAgIGNvbnN0IGluZGV4Q29udGVudCA9IGl0ZXJhdG9yTWF0Y2hbMl0udHJpbSgpO1xuICAgICAgaWYgKGluZGV4Q29udGVudCkge1xuICAgICAgICByZXN1bHQuaW5kZXggPSBjcmVhdGVBbGlhc0V4cHJlc3Npb24oXG4gICAgICAgICAgaW5kZXhDb250ZW50LFxuICAgICAgICAgIGV4cC5pbmRleE9mKFxuICAgICAgICAgICAgaW5kZXhDb250ZW50LFxuICAgICAgICAgICAgcmVzdWx0LmtleSA/IGtleU9mZnNldCArIGtleUNvbnRlbnQubGVuZ3RoIDogdHJpbW1lZE9mZnNldCArIHZhbHVlQ29udGVudC5sZW5ndGhcbiAgICAgICAgICApLFxuICAgICAgICAgIHRydWVcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKHZhbHVlQ29udGVudCkge1xuICAgIHJlc3VsdC52YWx1ZSA9IGNyZWF0ZUFsaWFzRXhwcmVzc2lvbih2YWx1ZUNvbnRlbnQsIHRyaW1tZWRPZmZzZXQsIHRydWUpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBnZXRTbGljZShzdGFydCwgZW5kKSB7XG4gIHJldHVybiBjdXJyZW50SW5wdXQuc2xpY2Uoc3RhcnQsIGVuZCk7XG59XG5mdW5jdGlvbiBlbmRPcGVuVGFnKGVuZCkge1xuICBpZiAodG9rZW5pemVyLmluU0ZDUm9vdCkge1xuICAgIGN1cnJlbnRPcGVuVGFnLmlubmVyTG9jID0gZ2V0TG9jKGVuZCArIDEsIGVuZCArIDEpO1xuICB9XG4gIGFkZE5vZGUoY3VycmVudE9wZW5UYWcpO1xuICBjb25zdCB7IHRhZywgbnMgfSA9IGN1cnJlbnRPcGVuVGFnO1xuICBpZiAobnMgPT09IDAgJiYgY3VycmVudE9wdGlvbnMuaXNQcmVUYWcodGFnKSkge1xuICAgIGluUHJlKys7XG4gIH1cbiAgaWYgKGN1cnJlbnRPcHRpb25zLmlzVm9pZFRhZyh0YWcpKSB7XG4gICAgb25DbG9zZVRhZyhjdXJyZW50T3BlblRhZywgZW5kKTtcbiAgfSBlbHNlIHtcbiAgICBzdGFjay51bnNoaWZ0KGN1cnJlbnRPcGVuVGFnKTtcbiAgICBpZiAobnMgPT09IDEgfHwgbnMgPT09IDIpIHtcbiAgICAgIHRva2VuaXplci5pblhNTCA9IHRydWU7XG4gICAgfVxuICB9XG4gIGN1cnJlbnRPcGVuVGFnID0gbnVsbDtcbn1cbmZ1bmN0aW9uIG9uVGV4dChjb250ZW50LCBzdGFydCwgZW5kKSB7XG4gIHtcbiAgICBjb25zdCB0YWcgPSBzdGFja1swXSAmJiBzdGFja1swXS50YWc7XG4gICAgaWYgKHRhZyAhPT0gXCJzY3JpcHRcIiAmJiB0YWcgIT09IFwic3R5bGVcIiAmJiBjb250ZW50LmluY2x1ZGVzKFwiJlwiKSkge1xuICAgICAgY29udGVudCA9IGN1cnJlbnRPcHRpb25zLmRlY29kZUVudGl0aWVzKGNvbnRlbnQsIGZhbHNlKTtcbiAgICB9XG4gIH1cbiAgY29uc3QgcGFyZW50ID0gc3RhY2tbMF0gfHwgY3VycmVudFJvb3Q7XG4gIGNvbnN0IGxhc3ROb2RlID0gcGFyZW50LmNoaWxkcmVuW3BhcmVudC5jaGlsZHJlbi5sZW5ndGggLSAxXTtcbiAgaWYgKGxhc3ROb2RlICYmIGxhc3ROb2RlLnR5cGUgPT09IDIpIHtcbiAgICBsYXN0Tm9kZS5jb250ZW50ICs9IGNvbnRlbnQ7XG4gICAgc2V0TG9jRW5kKGxhc3ROb2RlLmxvYywgZW5kKTtcbiAgfSBlbHNlIHtcbiAgICBwYXJlbnQuY2hpbGRyZW4ucHVzaCh7XG4gICAgICB0eX
20578BlOiAyLFxuICAgICAgY29udGVudCxcbiAgICAgIGxvYzogZ2V0TG9jKHN0YXJ0LCBlbmQpXG4gICAgfSk7XG4gIH1cbn1cbmZ1bmN0aW9uIG9uQ2xvc2VUYWcoZWwsIGVuZCwgaXNJbXBsaWVkID0gZmFsc2UpIHtcbiAgaWYgKGlzSW1wbGllZCkge1xuICAgIHNldExvY0VuZChlbC5sb2MsIGJhY2tUcmFjayhlbmQsIDYwKSk7XG4gIH0gZWxzZSB7XG4gICAgc2V0TG9jRW5kKGVsLmxvYywgbG9va0FoZWFkKGVuZCwgNjIpICsgMSk7XG4gIH1cbiAgaWYgKHRva2VuaXplci5pblNGQ1Jvb3QpIHtcbiAgICBpZiAoZWwuY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICBlbC5pbm5lckxvYy5lbmQgPSBleHRlbmQoe30sIGVsLmNoaWxkcmVuW2VsLmNoaWxkcmVuLmxlbmd0aCAtIDFdLmxvYy5lbmQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbC5pbm5lckxvYy5lbmQgPSBleHRlbmQoe30sIGVsLmlubmVyTG9jLnN0YXJ0KTtcbiAgICB9XG4gICAgZWwuaW5uZXJMb2Muc291cmNlID0gZ2V0U2xpY2UoXG4gICAgICBlbC5pbm5lckxvYy5zdGFydC5vZmZzZXQsXG4gICAgICBlbC5pbm5lckxvYy5lbmQub2Zmc2V0XG4gICAgKTtcbiAgfVxuICBjb25zdCB7IHRhZywgbnMgfSA9IGVsO1xuICBpZiAoIWluVlByZSkge1xuICAgIGlmICh0YWcgPT09IFwic2xvdFwiKSB7XG4gICAgICBlbC50YWdUeXBlID0gMjtcbiAgICB9IGVsc2UgaWYgKGlzRnJhZ21lbnRUZW1wbGF0ZShlbCkpIHtcbiAgICAgIGVsLnRhZ1R5cGUgPSAzO1xuICAgIH0gZWxzZSBpZiAoaXNDb21wb25lbnQoZWwpKSB7XG4gICAgICBlbC50YWdUeXBlID0gMTtcbiAgICB9XG4gIH1cbiAgaWYgKCF0b2tlbml6ZXIuaW5SQ0RBVEEpIHtcbiAgICBlbC5jaGlsZHJlbiA9IGNvbmRlbnNlV2hpdGVzcGFjZShlbC5jaGlsZHJlbiwgZWwudGFnKTtcbiAgfVxuICBpZiAobnMgPT09IDAgJiYgY3VycmVudE9wdGlvbnMuaXNQcmVUYWcodGFnKSkge1xuICAgIGluUHJlLS07XG4gIH1cbiAgaWYgKGN1cnJlbnRWUHJlQm91bmRhcnkgPT09IGVsKSB7XG4gICAgaW5WUHJlID0gdG9rZW5pemVyLmluVlByZSA9IGZhbHNlO1xuICAgIGN1cnJlbnRWUHJlQm91bmRhcnkgPSBudWxsO1xuICB9XG4gIGlmICh0b2tlbml6ZXIuaW5YTUwgJiYgKHN0YWNrWzBdID8gc3RhY2tbMF0ubnMgOiBjdXJyZW50T3B0aW9ucy5ucykgPT09IDApIHtcbiAgICB0b2tlbml6ZXIuaW5YTUwgPSBmYWxzZTtcbiAgfVxuICB7XG4gICAgY29uc3QgcHJvcHMgPSBlbC5wcm9wcztcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBpc0NvbXBhdEVuYWJsZWQoXG4gICAgICBcIkNPTVBJTEVSX1ZfSUZfVl9GT1JfUFJFQ0VERU5DRVwiLFxuICAgICAgY3VycmVudE9wdGlvbnNcbiAgICApKSB7XG4gICAgICBsZXQgaGFzSWYgPSBmYWxzZTtcbiAgICAgIGxldCBoYXNGb3IgPSBmYWxzZTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgcCA9IHByb3BzW2ldO1xuICAgICAgICBpZiAocC50eXBlID09PSA3KSB7XG4gICAgICAgICAgaWYgKHAubmFtZSA9PT0gXCJpZlwiKSB7XG4gICAgICAgICAgICBoYXNJZiA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIGlmIChwLm5hbWUgPT09IFwiZm9yXCIpIHtcbiAgICAgICAgICAgIGhhc0ZvciA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChoYXNJZiAmJiBoYXNGb3IpIHtcbiAgICAgICAgICB3YXJuRGVwcmVjYXRpb24oXG4gICAgICAgICAgICBcIkNPTVBJTEVSX1ZfSUZfVl9GT1JfUFJFQ0VERU5DRVwiLFxuICAgICAgICAgICAgY3VycmVudE9wdGlvbnMsXG4gICAgICAgICAgICBlbC5sb2NcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghdG9rZW5pemVyLmluU0ZDUm9vdCAmJiBpc0NvbXBhdEVuYWJsZWQoXG4gICAgICBcIkNPTVBJTEVSX05BVElWRV9URU1QTEFURVwiLFxuICAgICAgY3VycmVudE9wdGlvbnNcbiAgICApICYmIGVsLnRhZyA9PT0gXCJ0ZW1wbGF0ZVwiICYmICFpc0ZyYWdtZW50VGVtcGxhdGUoZWwpKSB7XG4gICAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHdhcm5EZXByZWNhdGlvbihcbiAgICAgICAgXCJDT01QSUxFUl9OQVRJVkVfVEVNUExBVEVcIixcbiAgICAgICAgY3VycmVudE9wdGlvbnMsXG4gICAgICAgIGVsLmxvY1xuICAgICAgKTtcbiAgICAgIGNvbnN0IHBhcmVudCA9IHN0YWNrWzBdIHx8IGN1cnJlbnRSb290O1xuICAgICAgY29uc3QgaW5kZXggPSBwYXJlbnQuY2hpbGRyZW4uaW5kZXhPZihlbCk7XG4gICAgICBwYXJlbnQuY2hpbGRyZW4uc3BsaWNlKGluZGV4LCAxLCAuLi5lbC5jaGlsZHJlbik7XG4gICAgfVxuICAgIGNvbnN0IGlubGluZVRlbXBsYXRlUHJvcCA9IHByb3BzLmZpbmQoXG4gICAgICAocCkgPT4gcC50eXBlID09PSA2ICYmIHAubmFtZSA9PT0gXCJpbmxpbmUtdGVtcGxhdGVcIlxuICAgICk7XG4gICAgaWYgKGlubGluZVRlbXBsYXRlUHJvcCAmJiBjaGVja0NvbXBhdEVuYWJsZWQoXG4gICAgICBcIkNPTVBJTEVSX0lOTElORV9URU1QTEFURVwiLFxuICAgICAgY3VycmVudE9wdGlvbnMsXG4gICAgICBpbmxpbmVUZW1wbGF0ZVByb3AubG9jXG4gICAgKSAmJiBlbC5jaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgIGlubGluZVRlbXBsYXRlUHJvcC52YWx1ZSA9IHtcbiAgICAgICAgdHlwZTogMixcbiAgICAgICAgY29udGVudDogZ2V0U2xpY2UoXG4gICAgICAgICAgZWwuY2hpbGRyZW5bMF0ubG9jLnN0YXJ0Lm9mZnNldCxcbiAgICAgICAgICBlbC5jaGlsZHJlbltlbC5jaGlsZHJlbi5sZW5ndGggLSAxXS5sb2MuZW5kLm9mZnNldFxuICAgICAgICApLFxuICAgICAgICBsb2M6IGlubGluZVRlbXBsYXRlUHJvcC5sb2NcbiAgICAgIH07XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBsb29rQWhlYWQoaW5kZXgsIGMpIHtcbiAgbGV0IGkgPSBpbmRleDtcbiAgd2hpbGUgKGN1cnJlbnRJbnB1dC5jaGFyQ29kZUF0KGkpICE9PSBjICYmIGkgPCBjdXJyZW50SW5wdXQubGVuZ3RoIC0gMSkgaSsrO1xuICByZXR1cm4gaTtcbn1cbmZ1bmN0aW9uIGJhY2tUcmFjayhpbmRleCwgYykge1xuICBsZXQgaSA9IGluZGV4O1xuICB3aGlsZSAoY3VycmVudElucHV0LmNoYXJDb2RlQXQoaSkgIT09IGMgJiYgaSA+PSAwKSBpLS07XG4gIHJldHVybi
20578BpO1xufVxuY29uc3Qgc3BlY2lhbFRlbXBsYXRlRGlyID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoW1wiaWZcIiwgXCJlbHNlXCIsIFwiZWxzZS1pZlwiLCBcImZvclwiLCBcInNsb3RcIl0pO1xuZnVuY3Rpb24gaXNGcmFnbWVudFRlbXBsYXRlKHsgdGFnLCBwcm9wcyB9KSB7XG4gIGlmICh0YWcgPT09IFwidGVtcGxhdGVcIikge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChwcm9wc1tpXS50eXBlID09PSA3ICYmIHNwZWNpYWxUZW1wbGF0ZURpci5oYXMocHJvcHNbaV0ubmFtZSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGlzQ29tcG9uZW50KHsgdGFnLCBwcm9wcyB9KSB7XG4gIGlmIChjdXJyZW50T3B0aW9ucy5pc0N1c3RvbUVsZW1lbnQodGFnKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAodGFnID09PSBcImNvbXBvbmVudFwiIHx8IGlzVXBwZXJDYXNlKHRhZy5jaGFyQ29kZUF0KDApKSB8fCBpc0NvcmVDb21wb25lbnQodGFnKSB8fCBjdXJyZW50T3B0aW9ucy5pc0J1aWx0SW5Db21wb25lbnQgJiYgY3VycmVudE9wdGlvbnMuaXNCdWlsdEluQ29tcG9uZW50KHRhZykgfHwgY3VycmVudE9wdGlvbnMuaXNOYXRpdmVUYWcgJiYgIWN1cnJlbnRPcHRpb25zLmlzTmF0aXZlVGFnKHRhZykpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBmb3IgKGxldCBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgcCA9IHByb3BzW2ldO1xuICAgIGlmIChwLnR5cGUgPT09IDYpIHtcbiAgICAgIGlmIChwLm5hbWUgPT09IFwiaXNcIiAmJiBwLnZhbHVlKSB7XG4gICAgICAgIGlmIChwLnZhbHVlLmNvbnRlbnQuc3RhcnRzV2l0aChcInZ1ZTpcIikpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChjaGVja0NvbXBhdEVuYWJsZWQoXG4gICAgICAgICAgXCJDT01QSUxFUl9JU19PTl9FTEVNRU5UXCIsXG4gICAgICAgICAgY3VycmVudE9wdGlvbnMsXG4gICAgICAgICAgcC5sb2NcbiAgICAgICAgKSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICgvLyA6aXMgb24gcGxhaW4gZWxlbWVudCAtIG9ubHkgdHJlYXQgYXMgY29tcG9uZW50IGluIGNvbXBhdCBtb2RlXG4gICAgcC5uYW1lID09PSBcImJpbmRcIiAmJiBpc1N0YXRpY0FyZ09mKHAuYXJnLCBcImlzXCIpICYmIGNoZWNrQ29tcGF0RW5hYmxlZChcbiAgICAgIFwiQ09NUElMRVJfSVNfT05fRUxFTUVOVFwiLFxuICAgICAgY3VycmVudE9wdGlvbnMsXG4gICAgICBwLmxvY1xuICAgICkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBpc1VwcGVyQ2FzZShjKSB7XG4gIHJldHVybiBjID4gNjQgJiYgYyA8IDkxO1xufVxuY29uc3Qgd2luZG93c05ld2xpbmVSRSA9IC9cXHJcXG4vZztcbmZ1bmN0aW9uIGNvbmRlbnNlV2hpdGVzcGFjZShub2RlcywgdGFnKSB7XG4gIGNvbnN0IHNob3VsZENvbmRlbnNlID0gY3VycmVudE9wdGlvbnMud2hpdGVzcGFjZSAhPT0gXCJwcmVzZXJ2ZVwiO1xuICBsZXQgcmVtb3ZlZFdoaXRlc3BhY2UgPSBmYWxzZTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IG5vZGUgPSBub2Rlc1tpXTtcbiAgICBpZiAobm9kZS50eXBlID09PSAyKSB7XG4gICAgICBpZiAoIWluUHJlKSB7XG4gICAgICAgIGlmIChpc0FsbFdoaXRlc3BhY2Uobm9kZS5jb250ZW50KSkge1xuICAgICAgICAgIGNvbnN0IHByZXYgPSBub2Rlc1tpIC0gMV0gJiYgbm9kZXNbaSAtIDFdLnR5cGU7XG4gICAgICAgICAgY29uc3QgbmV4dCA9IG5vZGVzW2kgKyAxXSAmJiBub2Rlc1tpICsgMV0udHlwZTtcbiAgICAgICAgICBpZiAoIXByZXYgfHwgIW5leHQgfHwgc2hvdWxkQ29uZGVuc2UgJiYgKHByZXYgPT09IDMgJiYgKG5leHQgPT09IDMgfHwgbmV4dCA9PT0gMSkgfHwgcHJldiA9PT0gMSAmJiAobmV4dCA9PT0gMyB8fCBuZXh0ID09PSAxICYmIGhhc05ld2xpbmVDaGFyKG5vZGUuY29udGVudCkpKSkge1xuICAgICAgICAgICAgcmVtb3ZlZFdoaXRlc3BhY2UgPSB0cnVlO1xuICAgICAgICAgICAgbm9kZXNbaV0gPSBudWxsO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBub2RlLmNvbnRlbnQgPSBcIiBcIjtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoc2hvdWxkQ29uZGVuc2UpIHtcbiAgICAgICAgICBub2RlLmNvbnRlbnQgPSBjb25kZW5zZShub2RlLmNvbnRlbnQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBub2RlLmNvbnRlbnQgPSBub2RlLmNvbnRlbnQucmVwbGFjZSh3aW5kb3dzTmV3bGluZVJFLCBcIlxcblwiKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKGluUHJlICYmIHRhZyAmJiBjdXJyZW50T3B0aW9ucy5pc1ByZVRhZyh0YWcpKSB7XG4gICAgY29uc3QgZmlyc3QgPSBub2Rlc1swXTtcbiAgICBpZiAoZmlyc3QgJiYgZmlyc3QudHlwZSA9PT0gMikge1xuICAgICAgZmlyc3QuY29udGVudCA9IGZpcnN0LmNvbnRlbnQucmVwbGFjZSgvXlxccj9cXG4vLCBcIlwiKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlbW92ZWRXaGl0ZXNwYWNlID8gbm9kZXMuZmlsdGVyKEJvb2xlYW4pIDogbm9kZXM7XG59XG5mdW5jdGlvbiBpc0FsbFdoaXRlc3BhY2Uoc3RyKSB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKCFpc1doaXRlc3BhY2Uoc3RyLmNoYXJDb2RlQXQoaSkpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufVxuZnVuY3Rpb24gaGFzTmV3bGluZUNoYXIoc3RyKSB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgYyA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuICAgIGlmIChjID09PSAxMCB8fCBjID09PSAxMykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gI
20578HJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGNvbmRlbnNlKHN0cikge1xuICBsZXQgcmV0ID0gXCJcIjtcbiAgbGV0IHByZXZDaGFySXNXaGl0ZXNwYWNlID0gZmFsc2U7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGlzV2hpdGVzcGFjZShzdHIuY2hhckNvZGVBdChpKSkpIHtcbiAgICAgIGlmICghcHJldkNoYXJJc1doaXRlc3BhY2UpIHtcbiAgICAgICAgcmV0ICs9IFwiIFwiO1xuICAgICAgICBwcmV2Q2hhcklzV2hpdGVzcGFjZSA9IHRydWU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldCArPSBzdHJbaV07XG4gICAgICBwcmV2Q2hhcklzV2hpdGVzcGFjZSA9IGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmV0O1xufVxuZnVuY3Rpb24gYWRkTm9kZShub2RlKSB7XG4gIChzdGFja1swXSB8fCBjdXJyZW50Um9vdCkuY2hpbGRyZW4ucHVzaChub2RlKTtcbn1cbmZ1bmN0aW9uIGdldExvYyhzdGFydCwgZW5kKSB7XG4gIHJldHVybiB7XG4gICAgc3RhcnQ6IHRva2VuaXplci5nZXRQb3Moc3RhcnQpLFxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgYWxsb3cgbGF0ZSBhdHRhY2htZW50XG4gICAgZW5kOiBlbmQgPT0gbnVsbCA/IGVuZCA6IHRva2VuaXplci5nZXRQb3MoZW5kKSxcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGFsbG93IGxhdGUgYXR0YWNobWVudFxuICAgIHNvdXJjZTogZW5kID09IG51bGwgPyBlbmQgOiBnZXRTbGljZShzdGFydCwgZW5kKVxuICB9O1xufVxuZnVuY3Rpb24gc2V0TG9jRW5kKGxvYywgZW5kKSB7XG4gIGxvYy5lbmQgPSB0b2tlbml6ZXIuZ2V0UG9zKGVuZCk7XG4gIGxvYy5zb3VyY2UgPSBnZXRTbGljZShsb2Muc3RhcnQub2Zmc2V0LCBlbmQpO1xufVxuZnVuY3Rpb24gZGlyVG9BdHRyKGRpcikge1xuICBjb25zdCBhdHRyID0ge1xuICAgIHR5cGU6IDYsXG4gICAgbmFtZTogZGlyLnJhd05hbWUsXG4gICAgbmFtZUxvYzogZ2V0TG9jKFxuICAgICAgZGlyLmxvYy5zdGFydC5vZmZzZXQsXG4gICAgICBkaXIubG9jLnN0YXJ0Lm9mZnNldCArIGRpci5yYXdOYW1lLmxlbmd0aFxuICAgICksXG4gICAgdmFsdWU6IHZvaWQgMCxcbiAgICBsb2M6IGRpci5sb2NcbiAgfTtcbiAgaWYgKGRpci5leHApIHtcbiAgICBjb25zdCBsb2MgPSBkaXIuZXhwLmxvYztcbiAgICBpZiAobG9jLmVuZC5vZmZzZXQgPCBkaXIubG9jLmVuZC5vZmZzZXQpIHtcbiAgICAgIGxvYy5zdGFydC5vZmZzZXQtLTtcbiAgICAgIGxvYy5zdGFydC5jb2x1bW4tLTtcbiAgICAgIGxvYy5lbmQub2Zmc2V0Kys7XG4gICAgICBsb2MuZW5kLmNvbHVtbisrO1xuICAgIH1cbiAgICBhdHRyLnZhbHVlID0ge1xuICAgICAgdHlwZTogMixcbiAgICAgIGNvbnRlbnQ6IGRpci5leHAuY29udGVudCxcbiAgICAgIGxvY1xuICAgIH07XG4gIH1cbiAgcmV0dXJuIGF0dHI7XG59XG5mdW5jdGlvbiBjcmVhdGVFeHAoY29udGVudCwgaXNTdGF0aWMgPSBmYWxzZSwgbG9jLCBjb25zdFR5cGUgPSAwLCBwYXJzZU1vZGUgPSAwIC8qIE5vcm1hbCAqLykge1xuICBjb25zdCBleHAgPSBjcmVhdGVTaW1wbGVFeHByZXNzaW9uKGNvbnRlbnQsIGlzU3RhdGljLCBsb2MsIGNvbnN0VHlwZSk7XG4gIHJldHVybiBleHA7XG59XG5mdW5jdGlvbiBlbWl0RXJyb3IoY29kZSwgaW5kZXgsIG1lc3NhZ2UpIHtcbiAgY3VycmVudE9wdGlvbnMub25FcnJvcihcbiAgICBjcmVhdGVDb21waWxlckVycm9yKGNvZGUsIGdldExvYyhpbmRleCwgaW5kZXgpLCB2b2lkIDAsIG1lc3NhZ2UpXG4gICk7XG59XG5mdW5jdGlvbiByZXNldCgpIHtcbiAgdG9rZW5pemVyLnJlc2V0KCk7XG4gIGN1cnJlbnRPcGVuVGFnID0gbnVsbDtcbiAgY3VycmVudFByb3AgPSBudWxsO1xuICBjdXJyZW50QXR0clZhbHVlID0gXCJcIjtcbiAgY3VycmVudEF0dHJTdGFydEluZGV4ID0gLTE7XG4gIGN1cnJlbnRBdHRyRW5kSW5kZXggPSAtMTtcbiAgc3RhY2subGVuZ3RoID0gMDtcbn1cbmZ1bmN0aW9uIGJhc2VQYXJzZShpbnB1dCwgb3B0aW9ucykge1xuICByZXNldCgpO1xuICBjdXJyZW50SW5wdXQgPSBpbnB1dDtcbiAgY3VycmVudE9wdGlvbnMgPSBleHRlbmQoe30sIGRlZmF1bHRQYXJzZXJPcHRpb25zKTtcbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBsZXQga2V5O1xuICAgIGZvciAoa2V5IGluIG9wdGlvbnMpIHtcbiAgICAgIGlmIChvcHRpb25zW2tleV0gIT0gbnVsbCkge1xuICAgICAgICBjdXJyZW50T3B0aW9uc1trZXldID0gb3B0aW9uc1trZXldO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIGlmICghY3VycmVudE9wdGlvbnMuZGVjb2RlRW50aXRpZXMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFtAdnVlL2NvbXBpbGVyLWNvcmVdIGRlY29kZUVudGl0aWVzIG9wdGlvbiBpcyByZXF1aXJlZCBpbiBicm93c2VyIGJ1aWxkcy5gXG4gICAgICApO1xuICAgIH1cbiAgfVxuICB0b2tlbml6ZXIubW9kZSA9IGN1cnJlbnRPcHRpb25zLnBhcnNlTW9kZSA9PT0gXCJodG1sXCIgPyAxIDogY3VycmVudE9wdGlvbnMucGFyc2VNb2RlID09PSBcInNmY1wiID8gMiA6IDA7XG4gIHRva2VuaXplci5pblhNTCA9IGN1cnJlbnRPcHRpb25zLm5zID09PSAxIHx8IGN1cnJlbnRPcHRpb25zLm5zID09PSAyO1xuICBjb25zdCBkZWxpbWl0ZXJzID0gb3B0aW9ucyAmJiBvcHRpb25zLmRlbGltaXRlcnM7XG4gIGlmIChkZWxpbWl0ZXJzKSB7XG4gICAgdG9rZW5pemVyLmRlbGltaXRlck9wZW4gPSB0b0NoYXJDb2RlcyhkZWxpbWl0ZXJzWzBdKTtcbiAgICB0b2tlbml6ZXIuZGVsaW1pdGVyQ2xvc2UgPSB0b0NoYXJDb2RlcyhkZWxpbWl0ZXJzWzFdKTtcbiAgfVxuICBjb25zdCByb290ID0gY3VycmVudFJvb3QgPSBjcmVhdGVSb290KFtdLCBpbnB1dCk7XG4gIHRva2VuaXplci5wYXJzZShjdXJyZW50SW5wdXQpO1xuICByb290LmxvYyA9IGdldExvYygwLCBpbnB1dC5sZW5ndGgpO1xuICByb290LmNoaWxkcmVuID0gY29uZGVuc2VXaGl0ZXNwYWNlKHJvb3QuY2hpbGRyZW4pO1xuICBjdXJyZW50Um9vdCA9IG51bGw7XG4gIHJldHVybi
20578Byb290O1xufVxuXG5mdW5jdGlvbiBob2lzdFN0YXRpYyhyb290LCBjb250ZXh0KSB7XG4gIHdhbGsoXG4gICAgcm9vdCxcbiAgICBjb250ZXh0LFxuICAgIC8vIFJvb3Qgbm9kZSBpcyB1bmZvcnR1bmF0ZWx5IG5vbi1ob2lzdGFibGUgZHVlIHRvIHBvdGVudGlhbCBwYXJlbnRcbiAgICAvLyBmYWxsdGhyb3VnaCBhdHRyaWJ1dGVzLlxuICAgIGlzU2luZ2xlRWxlbWVudFJvb3Qocm9vdCwgcm9vdC5jaGlsZHJlblswXSlcbiAgKTtcbn1cbmZ1bmN0aW9uIGlzU2luZ2xlRWxlbWVudFJvb3Qocm9vdCwgY2hpbGQpIHtcbiAgY29uc3QgeyBjaGlsZHJlbiB9ID0gcm9vdDtcbiAgcmV0dXJuIGNoaWxkcmVuLmxlbmd0aCA9PT0gMSAmJiBjaGlsZC50eXBlID09PSAxICYmICFpc1Nsb3RPdXRsZXQoY2hpbGQpO1xufVxuZnVuY3Rpb24gd2Fsayhub2RlLCBjb250ZXh0LCBkb05vdEhvaXN0Tm9kZSA9IGZhbHNlKSB7XG4gIGNvbnN0IHsgY2hpbGRyZW4gfSA9IG5vZGU7XG4gIGNvbnN0IG9yaWdpbmFsQ291bnQgPSBjaGlsZHJlbi5sZW5ndGg7XG4gIGxldCBob2lzdGVkQ291bnQgPSAwO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgY2hpbGQgPSBjaGlsZHJlbltpXTtcbiAgICBpZiAoY2hpbGQudHlwZSA9PT0gMSAmJiBjaGlsZC50YWdUeXBlID09PSAwKSB7XG4gICAgICBjb25zdCBjb25zdGFudFR5cGUgPSBkb05vdEhvaXN0Tm9kZSA/IDAgOiBnZXRDb25zdGFudFR5cGUoY2hpbGQsIGNvbnRleHQpO1xuICAgICAgaWYgKGNvbnN0YW50VHlwZSA+IDApIHtcbiAgICAgICAgaWYgKGNvbnN0YW50VHlwZSA+PSAyKSB7XG4gICAgICAgICAgY2hpbGQuY29kZWdlbk5vZGUucGF0Y2hGbGFnID0gLTE7XG4gICAgICAgICAgY2hpbGQuY29kZWdlbk5vZGUgPSBjb250ZXh0LmhvaXN0KGNoaWxkLmNvZGVnZW5Ob2RlKTtcbiAgICAgICAgICBob2lzdGVkQ291bnQrKztcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgY29kZWdlbk5vZGUgPSBjaGlsZC5jb2RlZ2VuTm9kZTtcbiAgICAgICAgaWYgKGNvZGVnZW5Ob2RlLnR5cGUgPT09IDEzKSB7XG4gICAgICAgICAgY29uc3QgZmxhZyA9IGNvZGVnZW5Ob2RlLnBhdGNoRmxhZztcbiAgICAgICAgICBpZiAoKGZsYWcgPT09IHZvaWQgMCB8fCBmbGFnID09PSA1MTIgfHwgZmxhZyA9PT0gMSkgJiYgZ2V0R2VuZXJhdGVkUHJvcHNDb25zdGFudFR5cGUoY2hpbGQsIGNvbnRleHQpID49IDIpIHtcbiAgICAgICAgICAgIGNvbnN0IHByb3BzID0gZ2V0Tm9kZVByb3BzKGNoaWxkKTtcbiAgICAgICAgICAgIGlmIChwcm9wcykge1xuICAgICAgICAgICAgICBjb2RlZ2VuTm9kZS5wcm9wcyA9IGNvbnRleHQuaG9pc3QocHJvcHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoY29kZWdlbk5vZGUuZHluYW1pY1Byb3BzKSB7XG4gICAgICAgICAgICBjb2RlZ2VuTm9kZS5keW5hbWljUHJvcHMgPSBjb250ZXh0LmhvaXN0KGNvZGVnZW5Ob2RlLmR5bmFtaWNQcm9wcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjaGlsZC50eXBlID09PSAxKSB7XG4gICAgICBjb25zdCBpc0NvbXBvbmVudCA9IGNoaWxkLnRhZ1R5cGUgPT09IDE7XG4gICAgICBpZiAoaXNDb21wb25lbnQpIHtcbiAgICAgICAgY29udGV4dC5zY29wZXMudlNsb3QrKztcbiAgICAgIH1cbiAgICAgIHdhbGsoY2hpbGQsIGNvbnRleHQpO1xuICAgICAgaWYgKGlzQ29tcG9uZW50KSB7XG4gICAgICAgIGNvbnRleHQuc2NvcGVzLnZTbG90LS07XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjaGlsZC50eXBlID09PSAxMSkge1xuICAgICAgd2FsayhjaGlsZCwgY29udGV4dCwgY2hpbGQuY2hpbGRyZW4ubGVuZ3RoID09PSAxKTtcbiAgICB9IGVsc2UgaWYgKGNoaWxkLnR5cGUgPT09IDkpIHtcbiAgICAgIGZvciAobGV0IGkyID0gMDsgaTIgPCBjaGlsZC5icmFuY2hlcy5sZW5ndGg7IGkyKyspIHtcbiAgICAgICAgd2FsayhcbiAgICAgICAgICBjaGlsZC5icmFuY2hlc1tpMl0sXG4gICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICBjaGlsZC5icmFuY2hlc1tpMl0uY2hpbGRyZW4ubGVuZ3RoID09PSAxXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmIChob2lzdGVkQ291bnQgJiYgY29udGV4dC50cmFuc2Zvcm1Ib2lzdCkge1xuICAgIGNvbnRleHQudHJhbnNmb3JtSG9pc3QoY2hpbGRyZW4sIGNvbnRleHQsIG5vZGUpO1xuICB9XG4gIGlmIChob2lzdGVkQ291bnQgJiYgaG9pc3RlZENvdW50ID09PSBvcmlnaW5hbENvdW50ICYmIG5vZGUudHlwZSA9PT0gMSAmJiBub2RlLnRhZ1R5cGUgPT09IDAgJiYgbm9kZS5jb2RlZ2VuTm9kZSAmJiBub2RlLmNvZGVnZW5Ob2RlLnR5cGUgPT09IDEzICYmIGlzQXJyYXkobm9kZS5jb2RlZ2VuTm9kZS5jaGlsZHJlbikpIHtcbiAgICBjb25zdCBob2lzdGVkID0gY29udGV4dC5ob2lzdChcbiAgICAgIGNyZWF0ZUFycmF5RXhwcmVzc2lvbihub2RlLmNvZGVnZW5Ob2RlLmNoaWxkcmVuKVxuICAgICk7XG4gICAgaWYgKGNvbnRleHQuaG1yKSB7XG4gICAgICBob2lzdGVkLmNvbnRlbnQgPSBgWy4uLiR7aG9pc3RlZC5jb250ZW50fV1gO1xuICAgIH1cbiAgICBub2RlLmNvZGVnZW5Ob2RlLmNoaWxkcmVuID0gaG9pc3RlZDtcbiAgfVxufVxuZnVuY3Rpb24gZ2V0Q29uc3RhbnRUeXBlKG5vZGUsIGNvbnRleHQpIHtcbiAgY29uc3QgeyBjb25zdGFudENhY2hlIH0gPSBjb250ZXh0O1xuICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgIGNhc2UgMTpcbiAgICAgIGlmIChub2RlLnRhZ1R5cGUgIT09IDApIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG4gICAgICBjb25zdCBjYWNoZWQgPSBjb25zdGFudENhY2hlLmdldChub2RlKTtcbiAgICAgIGlmIChjYWNoZWQgIT09IHZvaWQgMCkge1xuICAgICAgICByZXR1cm4gY2FjaGVkO1xuICAgICAgfVxuICAgICAgY29uc3QgY29kZWdlbk5vZGUgPSBub2RlLmNvZGVnZW5Ob2RlO1xuICAgICAgaWYgKGNvZGVnZW5Ob2RlLnR5cGUgIT09IDEzKSB7XG4gICAgICAgI
20578HJldHVybiAwO1xuICAgICAgfVxuICAgICAgaWYgKGNvZGVnZW5Ob2RlLmlzQmxvY2sgJiYgbm9kZS50YWcgIT09IFwic3ZnXCIgJiYgbm9kZS50YWcgIT09IFwiZm9yZWlnbk9iamVjdFwiICYmIG5vZGUudGFnICE9PSBcIm1hdGhcIikge1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH1cbiAgICAgIGlmIChjb2RlZ2VuTm9kZS5wYXRjaEZsYWcgPT09IHZvaWQgMCkge1xuICAgICAgICBsZXQgcmV0dXJuVHlwZTIgPSAzO1xuICAgICAgICBjb25zdCBnZW5lcmF0ZWRQcm9wc1R5cGUgPSBnZXRHZW5lcmF0ZWRQcm9wc0NvbnN0YW50VHlwZShub2RlLCBjb250ZXh0KTtcbiAgICAgICAgaWYgKGdlbmVyYXRlZFByb3BzVHlwZSA9PT0gMCkge1xuICAgICAgICAgIGNvbnN0YW50Q2FjaGUuc2V0KG5vZGUsIDApO1xuICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgICAgIGlmIChnZW5lcmF0ZWRQcm9wc1R5cGUgPCByZXR1cm5UeXBlMikge1xuICAgICAgICAgIHJldHVyblR5cGUyID0gZ2VuZXJhdGVkUHJvcHNUeXBlO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGNoaWxkVHlwZSA9IGdldENvbnN0YW50VHlwZShub2RlLmNoaWxkcmVuW2ldLCBjb250ZXh0KTtcbiAgICAgICAgICBpZiAoY2hpbGRUeXBlID09PSAwKSB7XG4gICAgICAgICAgICBjb25zdGFudENhY2hlLnNldChub2RlLCAwKTtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoY2hpbGRUeXBlIDwgcmV0dXJuVHlwZTIpIHtcbiAgICAgICAgICAgIHJldHVyblR5cGUyID0gY2hpbGRUeXBlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocmV0dXJuVHlwZTIgPiAxKSB7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2RlLnByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBwID0gbm9kZS5wcm9wc1tpXTtcbiAgICAgICAgICAgIGlmIChwLnR5cGUgPT09IDcgJiYgcC5uYW1lID09PSBcImJpbmRcIiAmJiBwLmV4cCkge1xuICAgICAgICAgICAgICBjb25zdCBleHBUeXBlID0gZ2V0Q29uc3RhbnRUeXBlKHAuZXhwLCBjb250ZXh0KTtcbiAgICAgICAgICAgICAgaWYgKGV4cFR5cGUgPT09IDApIHtcbiAgICAgICAgICAgICAgICBjb25zdGFudENhY2hlLnNldChub2RlLCAwKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoZXhwVHlwZSA8IHJldHVyblR5cGUyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuVHlwZTIgPSBleHBUeXBlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjb2RlZ2VuTm9kZS5pc0Jsb2NrKSB7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2RlLnByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBwID0gbm9kZS5wcm9wc1tpXTtcbiAgICAgICAgICAgIGlmIChwLnR5cGUgPT09IDcpIHtcbiAgICAgICAgICAgICAgY29uc3RhbnRDYWNoZS5zZXQobm9kZSwgMCk7XG4gICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBjb250ZXh0LnJlbW92ZUhlbHBlcihPUEVOX0JMT0NLKTtcbiAgICAgICAgICBjb250ZXh0LnJlbW92ZUhlbHBlcihcbiAgICAgICAgICAgIGdldFZOb2RlQmxvY2tIZWxwZXIoY29udGV4dC5pblNTUiwgY29kZWdlbk5vZGUuaXNDb21wb25lbnQpXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb2RlZ2VuTm9kZS5pc0Jsb2NrID0gZmFsc2U7XG4gICAgICAgICAgY29udGV4dC5oZWxwZXIoZ2V0Vk5vZGVIZWxwZXIoY29udGV4dC5pblNTUiwgY29kZWdlbk5vZGUuaXNDb21wb25lbnQpKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdGFudENhY2hlLnNldChub2RlLCByZXR1cm5UeXBlMik7XG4gICAgICAgIHJldHVybiByZXR1cm5UeXBlMjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0YW50Q2FjaGUuc2V0KG5vZGUsIDApO1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH1cbiAgICBjYXNlIDI6XG4gICAgY2FzZSAzOlxuICAgICAgcmV0dXJuIDM7XG4gICAgY2FzZSA5OlxuICAgIGNhc2UgMTE6XG4gICAgY2FzZSAxMDpcbiAgICAgIHJldHVybiAwO1xuICAgIGNhc2UgNTpcbiAgICBjYXNlIDEyOlxuICAgICAgcmV0dXJuIGdldENvbnN0YW50VHlwZShub2RlLmNvbnRlbnQsIGNvbnRleHQpO1xuICAgIGNhc2UgNDpcbiAgICAgIHJldHVybiBub2RlLmNvbnN0VHlwZTtcbiAgICBjYXNlIDg6XG4gICAgICBsZXQgcmV0dXJuVHlwZSA9IDM7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGUuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgY2hpbGQgPSBub2RlLmNoaWxkcmVuW2ldO1xuICAgICAgICBpZiAoaXNTdHJpbmcoY2hpbGQpIHx8IGlzU3ltYm9sKGNoaWxkKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNoaWxkVHlwZSA9IGdldENvbnN0YW50VHlwZShjaGlsZCwgY29udGV4dCk7XG4gICAgICAgIGlmIChjaGlsZFR5cGUgPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfSBlbHNlIGlmIChjaGlsZFR5cGUgPCByZXR1cm5UeXBlKSB7XG4gICAgICAgICAgcmV0dXJuVHlwZSA9IGNoaWxkVHlwZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJldHVyblR5cGU7XG4gICAgZGVmYXVsdDpcbiAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSA7XG4gICAgICByZXR1cm4gMDtcbiAgfVxufVxuY29uc3QgYWxsb3dIb2lzdGVkSGVscGVyU2V0ID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoW1xuICBOT1JNQUxJWkVfQ0xBU1MsXG4gIE5PUk1BTElaRV9TVFlMRSxcbiAgTk9STUFMSVpFX1BST1BTLFxuICBHVUFSRF9SRUFDVElWRV9QUk9QU1xuXSk7XG5mdW5jdGlvbiBnZXRDb25zdGFudFR5cGVPZkhlbHBlckNhbGwodmFsdWUsIGNvbnRleHQpIHtcbiAgaWYgKHZhbHVlLnR5cGUgPT09IDE0ICYmICFpc1N0cmluZyh2YWx1ZS
205785jYWxsZWUpICYmIGFsbG93SG9pc3RlZEhlbHBlclNldC5oYXModmFsdWUuY2FsbGVlKSkge1xuICAgIGNvbnN0IGFyZyA9IHZhbHVlLmFyZ3VtZW50c1swXTtcbiAgICBpZiAoYXJnLnR5cGUgPT09IDQpIHtcbiAgICAgIHJldHVybiBnZXRDb25zdGFudFR5cGUoYXJnLCBjb250ZXh0KTtcbiAgICB9IGVsc2UgaWYgKGFyZy50eXBlID09PSAxNCkge1xuICAgICAgcmV0dXJuIGdldENvbnN0YW50VHlwZU9mSGVscGVyQ2FsbChhcmcsIGNvbnRleHQpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gMDtcbn1cbmZ1bmN0aW9uIGdldEdlbmVyYXRlZFByb3BzQ29uc3RhbnRUeXBlKG5vZGUsIGNvbnRleHQpIHtcbiAgbGV0IHJldHVyblR5cGUgPSAzO1xuICBjb25zdCBwcm9wcyA9IGdldE5vZGVQcm9wcyhub2RlKTtcbiAgaWYgKHByb3BzICYmIHByb3BzLnR5cGUgPT09IDE1KSB7XG4gICAgY29uc3QgeyBwcm9wZXJ0aWVzIH0gPSBwcm9wcztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHsga2V5LCB2YWx1ZSB9ID0gcHJvcGVydGllc1tpXTtcbiAgICAgIGNvbnN0IGtleVR5cGUgPSBnZXRDb25zdGFudFR5cGUoa2V5LCBjb250ZXh0KTtcbiAgICAgIGlmIChrZXlUeXBlID09PSAwKSB7XG4gICAgICAgIHJldHVybiBrZXlUeXBlO1xuICAgICAgfVxuICAgICAgaWYgKGtleVR5cGUgPCByZXR1cm5UeXBlKSB7XG4gICAgICAgIHJldHVyblR5cGUgPSBrZXlUeXBlO1xuICAgICAgfVxuICAgICAgbGV0IHZhbHVlVHlwZTtcbiAgICAgIGlmICh2YWx1ZS50eXBlID09PSA0KSB7XG4gICAgICAgIHZhbHVlVHlwZSA9IGdldENvbnN0YW50VHlwZSh2YWx1ZSwgY29udGV4dCk7XG4gICAgICB9IGVsc2UgaWYgKHZhbHVlLnR5cGUgPT09IDE0KSB7XG4gICAgICAgIHZhbHVlVHlwZSA9IGdldENvbnN0YW50VHlwZU9mSGVscGVyQ2FsbCh2YWx1ZSwgY29udGV4dCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWx1ZVR5cGUgPSAwO1xuICAgICAgfVxuICAgICAgaWYgKHZhbHVlVHlwZSA9PT0gMCkge1xuICAgICAgICByZXR1cm4gdmFsdWVUeXBlO1xuICAgICAgfVxuICAgICAgaWYgKHZhbHVlVHlwZSA8IHJldHVyblR5cGUpIHtcbiAgICAgICAgcmV0dXJuVHlwZSA9IHZhbHVlVHlwZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJldHVyblR5cGU7XG59XG5mdW5jdGlvbiBnZXROb2RlUHJvcHMobm9kZSkge1xuICBjb25zdCBjb2RlZ2VuTm9kZSA9IG5vZGUuY29kZWdlbk5vZGU7XG4gIGlmIChjb2RlZ2VuTm9kZS50eXBlID09PSAxMykge1xuICAgIHJldHVybiBjb2RlZ2VuTm9kZS5wcm9wcztcbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVUcmFuc2Zvcm1Db250ZXh0KHJvb3QsIHtcbiAgZmlsZW5hbWUgPSBcIlwiLFxuICBwcmVmaXhJZGVudGlmaWVycyA9IGZhbHNlLFxuICBob2lzdFN0YXRpYzogaG9pc3RTdGF0aWMyID0gZmFsc2UsXG4gIGhtciA9IGZhbHNlLFxuICBjYWNoZUhhbmRsZXJzID0gZmFsc2UsXG4gIG5vZGVUcmFuc2Zvcm1zID0gW10sXG4gIGRpcmVjdGl2ZVRyYW5zZm9ybXMgPSB7fSxcbiAgdHJhbnNmb3JtSG9pc3QgPSBudWxsLFxuICBpc0J1aWx0SW5Db21wb25lbnQgPSBOT09QLFxuICBpc0N1c3RvbUVsZW1lbnQgPSBOT09QLFxuICBleHByZXNzaW9uUGx1Z2lucyA9IFtdLFxuICBzY29wZUlkID0gbnVsbCxcbiAgc2xvdHRlZCA9IHRydWUsXG4gIHNzciA9IGZhbHNlLFxuICBpblNTUiA9IGZhbHNlLFxuICBzc3JDc3NWYXJzID0gYGAsXG4gIGJpbmRpbmdNZXRhZGF0YSA9IEVNUFRZX09CSixcbiAgaW5saW5lID0gZmFsc2UsXG4gIGlzVFMgPSBmYWxzZSxcbiAgb25FcnJvciA9IGRlZmF1bHRPbkVycm9yLFxuICBvbldhcm4gPSBkZWZhdWx0T25XYXJuLFxuICBjb21wYXRDb25maWdcbn0pIHtcbiAgY29uc3QgbmFtZU1hdGNoID0gZmlsZW5hbWUucmVwbGFjZSgvXFw/LiokLywgXCJcIikubWF0Y2goLyhbXi9cXFxcXSspXFwuXFx3KyQvKTtcbiAgY29uc3QgY29udGV4dCA9IHtcbiAgICAvLyBvcHRpb25zXG4gICAgZmlsZW5hbWUsXG4gICAgc2VsZk5hbWU6IG5hbWVNYXRjaCAmJiBjYXBpdGFsaXplKGNhbWVsaXplKG5hbWVNYXRjaFsxXSkpLFxuICAgIHByZWZpeElkZW50aWZpZXJzLFxuICAgIGhvaXN0U3RhdGljOiBob2lzdFN0YXRpYzIsXG4gICAgaG1yLFxuICAgIGNhY2hlSGFuZGxlcnMsXG4gICAgbm9kZVRyYW5zZm9ybXMsXG4gICAgZGlyZWN0aXZlVHJhbnNmb3JtcyxcbiAgICB0cmFuc2Zvcm1Ib2lzdCxcbiAgICBpc0J1aWx0SW5Db21wb25lbnQsXG4gICAgaXNDdXN0b21FbGVtZW50LFxuICAgIGV4cHJlc3Npb25QbHVnaW5zLFxuICAgIHNjb3BlSWQsXG4gICAgc2xvdHRlZCxcbiAgICBzc3IsXG4gICAgaW5TU1IsXG4gICAgc3NyQ3NzVmFycyxcbiAgICBiaW5kaW5nTWV0YWRhdGEsXG4gICAgaW5saW5lLFxuICAgIGlzVFMsXG4gICAgb25FcnJvcixcbiAgICBvbldhcm4sXG4gICAgY29tcGF0Q29uZmlnLFxuICAgIC8vIHN0YXRlXG4gICAgcm9vdCxcbiAgICBoZWxwZXJzOiAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpLFxuICAgIGNvbXBvbmVudHM6IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCksXG4gICAgZGlyZWN0aXZlczogLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKSxcbiAgICBob2lzdHM6IFtdLFxuICAgIGltcG9ydHM6IFtdLFxuICAgIGNvbnN0YW50Q2FjaGU6IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpLFxuICAgIHRlbXBzOiAwLFxuICAgIGNhY2hlZDogMCxcbiAgICBpZGVudGlmaWVyczogLyogQF9fUFVSRV9fICovIE9iamVjdC5jcmVhdGUobnVsbCksXG4gICAgc2NvcGVzOiB7XG4gICAgICB2Rm9yOiAwLFxuICAgICAgdlNsb3Q6IDAsXG4gICAgICB2UHJlOiAwLFxuICAgICAgdk9uY2U6IDBcbiAgICB9LFxuICAgIHBhcmVudDogbnVsbCxcbiAgICBncmFuZFBhcmVudDogbnVsbCxcbiAgICBjdXJyZW50Tm9kZTogcm9vdCxcbiAgICBjaGlsZEluZGV4OiAwLFxuICAgIGluVk9uY2U6IGZhbHNlLFxuICAgIC8vIG1ldGhvZHNcbiAgICBoZWxwZXIobmFtZSkge1xuICAgICAgY29uc3QgY291bnQgPSBjb250ZXh0LmhlbHBlcnMuZ2V0KG5hbWUpIHx8IDA7XG4gICAgICBjb250ZXh0LmhlbHBlcnMuc2V0KG5hbWUsIGNvdW50ICsgMSk7XG4gICAgICByZXR1cm4gbmFtZTtcbiAgICB9LFxuICAgIHJlbW92ZUhlbHBlcihuYW1lKSB7XG4gICAgICBjb25zdCBjb3VudCA9IGNvbnRleHQuaGVscGVycy5nZXQobmFtZSk7XG4gICAgICBpZiAoY291bnQpIHtcbiAgICAgICAgY29uc3QgY3VycmVudENvdW50ID0gY291bnQgLSAxO1xuICAgICAgICBpZiAoIWN1cnJlbnRDb3VudCkge1xuICAgICAgICAgIGNvbnRleHQuaGVscGVycy5kZWxldGUobmFtZSk7XG4gICAgICAgI
20578H0gZWxzZSB7XG4gICAgICAgICAgY29udGV4dC5oZWxwZXJzLnNldChuYW1lLCBjdXJyZW50Q291bnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBoZWxwZXJTdHJpbmcobmFtZSkge1xuICAgICAgcmV0dXJuIGBfJHtoZWxwZXJOYW1lTWFwW2NvbnRleHQuaGVscGVyKG5hbWUpXX1gO1xuICAgIH0sXG4gICAgcmVwbGFjZU5vZGUobm9kZSkge1xuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgaWYgKCFjb250ZXh0LmN1cnJlbnROb2RlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBOb2RlIGJlaW5nIHJlcGxhY2VkIGlzIGFscmVhZHkgcmVtb3ZlZC5gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWNvbnRleHQucGFyZW50KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcmVwbGFjZSByb290IG5vZGUuYCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnRleHQucGFyZW50LmNoaWxkcmVuW2NvbnRleHQuY2hpbGRJbmRleF0gPSBjb250ZXh0LmN1cnJlbnROb2RlID0gbm9kZTtcbiAgICB9LFxuICAgIHJlbW92ZU5vZGUobm9kZSkge1xuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgIWNvbnRleHQucGFyZW50KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHJlbW92ZSByb290IG5vZGUuYCk7XG4gICAgICB9XG4gICAgICBjb25zdCBsaXN0ID0gY29udGV4dC5wYXJlbnQuY2hpbGRyZW47XG4gICAgICBjb25zdCByZW1vdmFsSW5kZXggPSBub2RlID8gbGlzdC5pbmRleE9mKG5vZGUpIDogY29udGV4dC5jdXJyZW50Tm9kZSA/IGNvbnRleHQuY2hpbGRJbmRleCA6IC0xO1xuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgcmVtb3ZhbEluZGV4IDwgMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYG5vZGUgYmVpbmcgcmVtb3ZlZCBpcyBub3QgYSBjaGlsZCBvZiBjdXJyZW50IHBhcmVudGApO1xuICAgICAgfVxuICAgICAgaWYgKCFub2RlIHx8IG5vZGUgPT09IGNvbnRleHQuY3VycmVudE5vZGUpIHtcbiAgICAgICAgY29udGV4dC5jdXJyZW50Tm9kZSA9IG51bGw7XG4gICAgICAgIGNvbnRleHQub25Ob2RlUmVtb3ZlZCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGNvbnRleHQuY2hpbGRJbmRleCA+IHJlbW92YWxJbmRleCkge1xuICAgICAgICAgIGNvbnRleHQuY2hpbGRJbmRleC0tO1xuICAgICAgICAgIGNvbnRleHQub25Ob2RlUmVtb3ZlZCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb250ZXh0LnBhcmVudC5jaGlsZHJlbi5zcGxpY2UocmVtb3ZhbEluZGV4LCAxKTtcbiAgICB9LFxuICAgIG9uTm9kZVJlbW92ZWQ6IE5PT1AsXG4gICAgYWRkSWRlbnRpZmllcnMoZXhwKSB7XG4gICAgfSxcbiAgICByZW1vdmVJZGVudGlmaWVycyhleHApIHtcbiAgICB9LFxuICAgIGhvaXN0KGV4cCkge1xuICAgICAgaWYgKGlzU3RyaW5nKGV4cCkpIGV4cCA9IGNyZWF0ZVNpbXBsZUV4cHJlc3Npb24oZXhwKTtcbiAgICAgIGNvbnRleHQuaG9pc3RzLnB1c2goZXhwKTtcbiAgICAgIGNvbnN0IGlkZW50aWZpZXIgPSBjcmVhdGVTaW1wbGVFeHByZXNzaW9uKFxuICAgICAgICBgX2hvaXN0ZWRfJHtjb250ZXh0LmhvaXN0cy5sZW5ndGh9YCxcbiAgICAgICAgZmFsc2UsXG4gICAgICAgIGV4cC5sb2MsXG4gICAgICAgIDJcbiAgICAgICk7XG4gICAgICBpZGVudGlmaWVyLmhvaXN0ZWQgPSBleHA7XG4gICAgICByZXR1cm4gaWRlbnRpZmllcjtcbiAgICB9LFxuICAgIGNhY2hlKGV4cCwgaXNWTm9kZSA9IGZhbHNlKSB7XG4gICAgICByZXR1cm4gY3JlYXRlQ2FjaGVFeHByZXNzaW9uKGNvbnRleHQuY2FjaGVkKyssIGV4cCwgaXNWTm9kZSk7XG4gICAgfVxuICB9O1xuICB7XG4gICAgY29udGV4dC5maWx0ZXJzID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTtcbiAgfVxuICByZXR1cm4gY29udGV4dDtcbn1cbmZ1bmN0aW9uIHRyYW5zZm9ybShyb290LCBvcHRpb25zKSB7XG4gIGNvbnN0IGNvbnRleHQgPSBjcmVhdGVUcmFuc2Zvcm1Db250ZXh0KHJvb3QsIG9wdGlvbnMpO1xuICB0cmF2ZXJzZU5vZGUocm9vdCwgY29udGV4dCk7XG4gIGlmIChvcHRpb25zLmhvaXN0U3RhdGljKSB7XG4gICAgaG9pc3RTdGF0aWMocm9vdCwgY29udGV4dCk7XG4gIH1cbiAgaWYgKCFvcHRpb25zLnNzcikge1xuICAgIGNyZWF0ZVJvb3RDb2RlZ2VuKHJvb3QsIGNvbnRleHQpO1xuICB9XG4gIHJvb3QuaGVscGVycyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KFsuLi5jb250ZXh0LmhlbHBlcnMua2V5cygpXSk7XG4gIHJvb3QuY29tcG9uZW50cyA9IFsuLi5jb250ZXh0LmNvbXBvbmVudHNdO1xuICByb290LmRpcmVjdGl2ZXMgPSBbLi4uY29udGV4dC5kaXJlY3RpdmVzXTtcbiAgcm9vdC5pbXBvcnRzID0gY29udGV4dC5pbXBvcnRzO1xuICByb290LmhvaXN0cyA9IGNvbnRleHQuaG9pc3RzO1xuICByb290LnRlbXBzID0gY29udGV4dC50ZW1wcztcbiAgcm9vdC5jYWNoZWQgPSBjb250ZXh0LmNhY2hlZDtcbiAgcm9vdC50cmFuc2Zvcm1lZCA9IHRydWU7XG4gIHtcbiAgICByb290LmZpbHRlcnMgPSBbLi4uY29udGV4dC5maWx0ZXJzXTtcbiAgfVxufVxuZnVuY3Rpb24gY3JlYXRlUm9vdENvZGVnZW4ocm9vdCwgY29udGV4dCkge1xuICBjb25zdCB7IGhlbHBlciB9ID0gY29udGV4dDtcbiAgY29uc3QgeyBjaGlsZHJlbiB9ID0gcm9vdDtcbiAgaWYgKGNoaWxkcmVuLmxlbmd0aCA9PT0gMSkge1xuICAgIGNvbnN0IGNoaWxkID0gY2hpbGRyZW5bMF07XG4gICAgaWYgKGlzU2luZ2xlRWxlbWVudFJvb3Qocm9vdCwgY2hpbGQpICYmIGNoaWxkLmNvZGVnZW5Ob2RlKSB7XG4gICAgICBjb25zdCBjb2RlZ2VuTm9kZSA9IGNoaWxkLmNvZGVnZW5Ob2RlO1xuICAgICAgaWYgKGNvZGVnZW5Ob2RlLnR5cGUgPT09IDEzKSB7XG4gICAgICAgIGNvbnZlcnRUb0Jsb2NrKGNvZGVnZW5Ob2RlLCBjb250ZXh0KTtcbiAgICAgIH1cbiAgICAgIHJvb3QuY29kZWdlbk5vZGUgPSBjb2RlZ2VuTm9kZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcm9vdC5jb2RlZ2VuTm9kZSA9IGNoaWxkO1xuICAgIH1cbiAgfSBlbHNlIGlmIChjaGlsZHJlbi5sZW5ndGggPiAxKSB7XG4gICAgbGV0IHBhdGNoRmxhZyA9IDY0O1xuICAgIGxldCBwYXRjaEZsYWdUZXh0ID0gUGF0Y2hGbGFnTmFtZXNbNjRdO1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9k
20578dWN0aW9uXCIpICYmIGNoaWxkcmVuLmZpbHRlcigoYykgPT4gYy50eXBlICE9PSAzKS5sZW5ndGggPT09IDEpIHtcbiAgICAgIHBhdGNoRmxhZyB8PSAyMDQ4O1xuICAgICAgcGF0Y2hGbGFnVGV4dCArPSBgLCAke1BhdGNoRmxhZ05hbWVzWzIwNDhdfWA7XG4gICAgfVxuICAgIHJvb3QuY29kZWdlbk5vZGUgPSBjcmVhdGVWTm9kZUNhbGwoXG4gICAgICBjb250ZXh0LFxuICAgICAgaGVscGVyKEZSQUdNRU5UKSxcbiAgICAgIHZvaWQgMCxcbiAgICAgIHJvb3QuY2hpbGRyZW4sXG4gICAgICBwYXRjaEZsYWcsXG4gICAgICB2b2lkIDAsXG4gICAgICB2b2lkIDAsXG4gICAgICB0cnVlLFxuICAgICAgdm9pZCAwLFxuICAgICAgZmFsc2VcbiAgICApO1xuICB9IGVsc2UgO1xufVxuZnVuY3Rpb24gdHJhdmVyc2VDaGlsZHJlbihwYXJlbnQsIGNvbnRleHQpIHtcbiAgbGV0IGkgPSAwO1xuICBjb25zdCBub2RlUmVtb3ZlZCA9ICgpID0+IHtcbiAgICBpLS07XG4gIH07XG4gIGZvciAoOyBpIDwgcGFyZW50LmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgY2hpbGQgPSBwYXJlbnQuY2hpbGRyZW5baV07XG4gICAgaWYgKGlzU3RyaW5nKGNoaWxkKSkgY29udGludWU7XG4gICAgY29udGV4dC5ncmFuZFBhcmVudCA9IGNvbnRleHQucGFyZW50O1xuICAgIGNvbnRleHQucGFyZW50ID0gcGFyZW50O1xuICAgIGNvbnRleHQuY2hpbGRJbmRleCA9IGk7XG4gICAgY29udGV4dC5vbk5vZGVSZW1vdmVkID0gbm9kZVJlbW92ZWQ7XG4gICAgdHJhdmVyc2VOb2RlKGNoaWxkLCBjb250ZXh0KTtcbiAgfVxufVxuZnVuY3Rpb24gdHJhdmVyc2VOb2RlKG5vZGUsIGNvbnRleHQpIHtcbiAgY29udGV4dC5jdXJyZW50Tm9kZSA9IG5vZGU7XG4gIGNvbnN0IHsgbm9kZVRyYW5zZm9ybXMgfSA9IGNvbnRleHQ7XG4gIGNvbnN0IGV4aXRGbnMgPSBbXTtcbiAgZm9yIChsZXQgaTIgPSAwOyBpMiA8IG5vZGVUcmFuc2Zvcm1zLmxlbmd0aDsgaTIrKykge1xuICAgIGNvbnN0IG9uRXhpdCA9IG5vZGVUcmFuc2Zvcm1zW2kyXShub2RlLCBjb250ZXh0KTtcbiAgICBpZiAob25FeGl0KSB7XG4gICAgICBpZiAoaXNBcnJheShvbkV4aXQpKSB7XG4gICAgICAgIGV4aXRGbnMucHVzaCguLi5vbkV4aXQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXhpdEZucy5wdXNoKG9uRXhpdCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghY29udGV4dC5jdXJyZW50Tm9kZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSB7XG4gICAgICBub2RlID0gY29udGV4dC5jdXJyZW50Tm9kZTtcbiAgICB9XG4gIH1cbiAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICBjYXNlIDM6XG4gICAgICBpZiAoIWNvbnRleHQuc3NyKSB7XG4gICAgICAgIGNvbnRleHQuaGVscGVyKENSRUFURV9DT01NRU5UKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgNTpcbiAgICAgIGlmICghY29udGV4dC5zc3IpIHtcbiAgICAgICAgY29udGV4dC5oZWxwZXIoVE9fRElTUExBWV9TVFJJTkcpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSA5OlxuICAgICAgZm9yIChsZXQgaTIgPSAwOyBpMiA8IG5vZGUuYnJhbmNoZXMubGVuZ3RoOyBpMisrKSB7XG4gICAgICAgIHRyYXZlcnNlTm9kZShub2RlLmJyYW5jaGVzW2kyXSwgY29udGV4dCk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlIDEwOlxuICAgIGNhc2UgMTE6XG4gICAgY2FzZSAxOlxuICAgIGNhc2UgMDpcbiAgICAgIHRyYXZlcnNlQ2hpbGRyZW4obm9kZSwgY29udGV4dCk7XG4gICAgICBicmVhaztcbiAgfVxuICBjb250ZXh0LmN1cnJlbnROb2RlID0gbm9kZTtcbiAgbGV0IGkgPSBleGl0Rm5zLmxlbmd0aDtcbiAgd2hpbGUgKGktLSkge1xuICAgIGV4aXRGbnNbaV0oKTtcbiAgfVxufVxuZnVuY3Rpb24gY3JlYXRlU3RydWN0dXJhbERpcmVjdGl2ZVRyYW5zZm9ybShuYW1lLCBmbikge1xuICBjb25zdCBtYXRjaGVzID0gaXNTdHJpbmcobmFtZSkgPyAobikgPT4gbiA9PT0gbmFtZSA6IChuKSA9PiBuYW1lLnRlc3Qobik7XG4gIHJldHVybiAobm9kZSwgY29udGV4dCkgPT4ge1xuICAgIGlmIChub2RlLnR5cGUgPT09IDEpIHtcbiAgICAgIGNvbnN0IHsgcHJvcHMgfSA9IG5vZGU7XG4gICAgICBpZiAobm9kZS50YWdUeXBlID09PSAzICYmIHByb3BzLnNvbWUoaXNWU2xvdCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgZXhpdEZucyA9IFtdO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBwcm9wID0gcHJvcHNbaV07XG4gICAgICAgIGlmIChwcm9wLnR5cGUgPT09IDcgJiYgbWF0Y2hlcyhwcm9wLm5hbWUpKSB7XG4gICAgICAgICAgcHJvcHMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgIGktLTtcbiAgICAgICAgICBjb25zdCBvbkV4aXQgPSBmbihub2RlLCBwcm9wLCBjb250ZXh0KTtcbiAgICAgICAgICBpZiAob25FeGl0KSBleGl0Rm5zLnB1c2gob25FeGl0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGV4aXRGbnM7XG4gICAgfVxuICB9O1xufVxuXG5jb25zdCBQVVJFX0FOTk9UQVRJT04gPSBgLyojX19QVVJFX18qL2A7XG5jb25zdCBhbGlhc0hlbHBlciA9IChzKSA9PiBgJHtoZWxwZXJOYW1lTWFwW3NdfTogXyR7aGVscGVyTmFtZU1hcFtzXX1gO1xuZnVuY3Rpb24gY3JlYXRlQ29kZWdlbkNvbnRleHQoYXN0LCB7XG4gIG1vZGUgPSBcImZ1bmN0aW9uXCIsXG4gIHByZWZpeElkZW50aWZpZXJzID0gbW9kZSA9PT0gXCJtb2R1bGVcIixcbiAgc291cmNlTWFwID0gZmFsc2UsXG4gIGZpbGVuYW1lID0gYHRlbXBsYXRlLnZ1ZS5odG1sYCxcbiAgc2NvcGVJZCA9IG51bGwsXG4gIG9wdGltaXplSW1wb3J0cyA9IGZhbHNlLFxuICBydW50aW1lR2xvYmFsTmFtZSA9IGBWdWVgLFxuICBydW50aW1lTW9kdWxlTmFtZSA9IGB2dWVgLFxuICBzc3JSdW50aW1lTW9kdWxlTmFtZSA9IFwidnVlL3NlcnZlci1yZW5kZXJlclwiLFxuICBzc3IgPSBmYWxzZSxcbiAgaXNUUyA9IGZhbHNlLFxuICBpblNTUiA9IGZhbHNlXG59KSB7XG4gIGNvbnN0IGNvbnRleHQgPSB7XG4gICAgbW9kZSxcbiAgICBwcmVmaXhJZGVudGlmaWVycyxcbiAgICBzb3VyY2VNYXAsXG4gICAgZmlsZW5hbWUsXG4gICAgc2NvcGVJZCxcbiAgICBvcHRpbWl6ZUltcG9ydHMsXG4gICAgcnVudGltZUdsb2JhbE5hbWUsXG4gICAgcnVudGltZU1vZHVsZU5hbWUsXG4gICAgc3NyUnVudGltZU1vZHVsZU5hbWUsXG4gICAgc3NyLFxuICAgIGlzVFMsXG4gICAgaW5TU1IsXG4gICAgc291cmNlOiBhc3Quc291cmNlLFxuICAgIGNvZGU6IGBgLFxuICAgIGNvbHVtbjogMSxcbiAgICBsaW5lOiAxLFxuICAgIG9mZnNldDogMCxcbiAgICBpbmRlbnRMZXZlbDogMCxcbiAgICBwdXJlOiBmYWxzZSxcbiAgICBtYXA6IHZvaWQgMCxcbiAgICBoZWxwZXIoa2V5KSB7XG4gICAgICByZXR1cm4gYF8ke2hlbHBlck5hbWVNYXBba2V5XX1gO1xuICAgIH0sXG4gICAgcHVzaChjb2RlLCBuZXdsaW5lSW5kZXggPSAtMiAvKiBOb25lICovLCBub2RlKSB7XG4gICAgICBjb250ZXh0LmNvZGUgKz0gY29kZTtcbiAgICB9LFxuICAgIGluZGVudCgpIHtcbiAgICAgIG5ld2xpbmUoKytjb250ZXh0LmluZGVudExldmVsKTtcbiAgICB9LFxuICAgIGRlaW5kZW50KHdpdGhvdXROZXdMaW5lID0gZmFsc2UpIHtcbiAgICAgIGlmICh3aXRob3V0TmV3TGluZSkge1xuICAgICAgICAtLWNvbnRleHQuaW5kZW50TGV2ZWw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXdsaW5lKC0tY29udGV4dC5pbmRlbnRMZXZlbCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBuZXdsaW5lKCkge1xuICAgICAgbmV3bGluZShjb250ZXh0LmluZGVudExldmVsKTtcbiAgICB9XG4gI
20578H07XG4gIGZ1bmN0aW9uIG5ld2xpbmUobikge1xuICAgIGNvbnRleHQucHVzaChcIlxcblwiICsgYCAgYC5yZXBlYXQobiksIDAgLyogU3RhcnQgKi8pO1xuICB9XG4gIHJldHVybiBjb250ZXh0O1xufVxuZnVuY3Rpb24gZ2VuZXJhdGUoYXN0LCBvcHRpb25zID0ge30pIHtcbiAgY29uc3QgY29udGV4dCA9IGNyZWF0ZUNvZGVnZW5Db250ZXh0KGFzdCwgb3B0aW9ucyk7XG4gIGlmIChvcHRpb25zLm9uQ29udGV4dENyZWF0ZWQpIG9wdGlvbnMub25Db250ZXh0Q3JlYXRlZChjb250ZXh0KTtcbiAgY29uc3Qge1xuICAgIG1vZGUsXG4gICAgcHVzaCxcbiAgICBwcmVmaXhJZGVudGlmaWVycyxcbiAgICBpbmRlbnQsXG4gICAgZGVpbmRlbnQsXG4gICAgbmV3bGluZSxcbiAgICBzY29wZUlkLFxuICAgIHNzclxuICB9ID0gY29udGV4dDtcbiAgY29uc3QgaGVscGVycyA9IEFycmF5LmZyb20oYXN0LmhlbHBlcnMpO1xuICBjb25zdCBoYXNIZWxwZXJzID0gaGVscGVycy5sZW5ndGggPiAwO1xuICBjb25zdCB1c2VXaXRoQmxvY2sgPSAhcHJlZml4SWRlbnRpZmllcnMgJiYgbW9kZSAhPT0gXCJtb2R1bGVcIjtcbiAgY29uc3QgcHJlYW1ibGVDb250ZXh0ID0gY29udGV4dDtcbiAge1xuICAgIGdlbkZ1bmN0aW9uUHJlYW1ibGUoYXN0LCBwcmVhbWJsZUNvbnRleHQpO1xuICB9XG4gIGNvbnN0IGZ1bmN0aW9uTmFtZSA9IHNzciA/IGBzc3JSZW5kZXJgIDogYHJlbmRlcmA7XG4gIGNvbnN0IGFyZ3MgPSBzc3IgPyBbXCJfY3R4XCIsIFwiX3B1c2hcIiwgXCJfcGFyZW50XCIsIFwiX2F0dHJzXCJdIDogW1wiX2N0eFwiLCBcIl9jYWNoZVwiXTtcbiAgY29uc3Qgc2lnbmF0dXJlID0gYXJncy5qb2luKFwiLCBcIik7XG4gIHtcbiAgICBwdXNoKGBmdW5jdGlvbiAke2Z1bmN0aW9uTmFtZX0oJHtzaWduYXR1cmV9KSB7YCk7XG4gIH1cbiAgaW5kZW50KCk7XG4gIGlmICh1c2VXaXRoQmxvY2spIHtcbiAgICBwdXNoKGB3aXRoIChfY3R4KSB7YCk7XG4gICAgaW5kZW50KCk7XG4gICAgaWYgKGhhc0hlbHBlcnMpIHtcbiAgICAgIHB1c2goXG4gICAgICAgIGBjb25zdCB7ICR7aGVscGVycy5tYXAoYWxpYXNIZWxwZXIpLmpvaW4oXCIsIFwiKX0gfSA9IF9WdWVcbmAsXG4gICAgICAgIC0xIC8qIEVuZCAqL1xuICAgICAgKTtcbiAgICAgIG5ld2xpbmUoKTtcbiAgICB9XG4gIH1cbiAgaWYgKGFzdC5jb21wb25lbnRzLmxlbmd0aCkge1xuICAgIGdlbkFzc2V0cyhhc3QuY29tcG9uZW50cywgXCJjb21wb25lbnRcIiwgY29udGV4dCk7XG4gICAgaWYgKGFzdC5kaXJlY3RpdmVzLmxlbmd0aCB8fCBhc3QudGVtcHMgPiAwKSB7XG4gICAgICBuZXdsaW5lKCk7XG4gICAgfVxuICB9XG4gIGlmIChhc3QuZGlyZWN0aXZlcy5sZW5ndGgpIHtcbiAgICBnZW5Bc3NldHMoYXN0LmRpcmVjdGl2ZXMsIFwiZGlyZWN0aXZlXCIsIGNvbnRleHQpO1xuICAgIGlmIChhc3QudGVtcHMgPiAwKSB7XG4gICAgICBuZXdsaW5lKCk7XG4gICAgfVxuICB9XG4gIGlmIChhc3QuZmlsdGVycyAmJiBhc3QuZmlsdGVycy5sZW5ndGgpIHtcbiAgICBuZXdsaW5lKCk7XG4gICAgZ2VuQXNzZXRzKGFzdC5maWx0ZXJzLCBcImZpbHRlclwiLCBjb250ZXh0KTtcbiAgICBuZXdsaW5lKCk7XG4gIH1cbiAgaWYgKGFzdC50ZW1wcyA+IDApIHtcbiAgICBwdXNoKGBsZXQgYCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhc3QudGVtcHM7IGkrKykge1xuICAgICAgcHVzaChgJHtpID4gMCA/IGAsIGAgOiBgYH1fdGVtcCR7aX1gKTtcbiAgICB9XG4gIH1cbiAgaWYgKGFzdC5jb21wb25lbnRzLmxlbmd0aCB8fCBhc3QuZGlyZWN0aXZlcy5sZW5ndGggfHwgYXN0LnRlbXBzKSB7XG4gICAgcHVzaChgXG5gLCAwIC8qIFN0YXJ0ICovKTtcbiAgICBuZXdsaW5lKCk7XG4gIH1cbiAgaWYgKCFzc3IpIHtcbiAgICBwdXNoKGByZXR1cm4gYCk7XG4gIH1cbiAgaWYgKGFzdC5jb2RlZ2VuTm9kZSkge1xuICAgIGdlbk5vZGUoYXN0LmNvZGVnZW5Ob2RlLCBjb250ZXh0KTtcbiAgfSBlbHNlIHtcbiAgICBwdXNoKGBudWxsYCk7XG4gIH1cbiAgaWYgKHVzZVdpdGhCbG9jaykge1xuICAgIGRlaW5kZW50KCk7XG4gICAgcHVzaChgfWApO1xuICB9XG4gIGRlaW5kZW50KCk7XG4gIHB1c2goYH1gKTtcbiAgcmV0dXJuIHtcbiAgICBhc3QsXG4gICAgY29kZTogY29udGV4dC5jb2RlLFxuICAgIHByZWFtYmxlOiBgYCxcbiAgICBtYXA6IGNvbnRleHQubWFwID8gY29udGV4dC5tYXAudG9KU09OKCkgOiB2b2lkIDBcbiAgfTtcbn1cbmZ1bmN0aW9uIGdlbkZ1bmN0aW9uUHJlYW1ibGUoYXN0LCBjb250ZXh0KSB7XG4gIGNvbnN0IHtcbiAgICBzc3IsXG4gICAgcHJlZml4SWRlbnRpZmllcnMsXG4gICAgcHVzaCxcbiAgICBuZXdsaW5lLFxuICAgIHJ1bnRpbWVNb2R1bGVOYW1lLFxuICAgIHJ1bnRpbWVHbG9iYWxOYW1lLFxuICAgIHNzclJ1bnRpbWVNb2R1bGVOYW1lXG4gIH0gPSBjb250ZXh0O1xuICBjb25zdCBWdWVCaW5kaW5nID0gcnVudGltZUdsb2JhbE5hbWU7XG4gIGNvbnN0IGhlbHBlcnMgPSBBcnJheS5mcm9tKGFzdC5oZWxwZXJzKTtcbiAgaWYgKGhlbHBlcnMubGVuZ3RoID4gMCkge1xuICAgIHtcbiAgICAgIHB1c2goYGNvbnN0IF9WdWUgPSAke1Z1ZUJpbmRpbmd9XG5gLCAtMSAvKiBFbmQgKi8pO1xuICAgICAgaWYgKGFzdC5ob2lzdHMubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHN0YXRpY0hlbHBlcnMgPSBbXG4gICAgICAgICAgQ1JFQVRFX1ZOT0RFLFxuICAgICAgICAgIENSRUFURV9FTEVNRU5UX1ZOT0RFLFxuICAgICAgICAgIENSRUFURV9DT01NRU5ULFxuICAgICAgICAgIENSRUFURV9URVhULFxuICAgICAgICAgIENSRUFURV9TVEFUSUNcbiAgICAgICAgXS5maWx0ZXIoKGhlbHBlcikgPT4gaGVscGVycy5pbmNsdWRlcyhoZWxwZXIpKS5tYXAoYWxpYXNIZWxwZXIpLmpvaW4oXCIsIFwiKTtcbiAgICAgICAgcHVzaChgY29uc3QgeyAke3N0YXRpY0hlbHBlcnN9IH0gPSBfVnVlXG5gLCAtMSAvKiBFbmQgKi8pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBnZW5Ib2lzdHMoYXN0LmhvaXN0cywgY29udGV4dCk7XG4gIG5ld2xpbmUoKTtcbiAgcHVzaChgcmV0dXJuIGApO1xufVxuZnVuY3Rpb24gZ2VuQXNzZXRzKGFzc2V0cywgdHlwZSwgeyBoZWxwZXIsIHB1c2gsIG5ld2xpbmUsIGlzVFMgfSkge1xuICBjb25zdCByZXNvbHZlciA9IGhlbHBlcihcbiAgICB0eX
20578BlID09PSBcImZpbHRlclwiID8gUkVTT0xWRV9GSUxURVIgOiB0eXBlID09PSBcImNvbXBvbmVudFwiID8gUkVTT0xWRV9DT01QT05FTlQgOiBSRVNPTFZFX0RJUkVDVElWRVxuICApO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGFzc2V0cy5sZW5ndGg7IGkrKykge1xuICAgIGxldCBpZCA9IGFzc2V0c1tpXTtcbiAgICBjb25zdCBtYXliZVNlbGZSZWZlcmVuY2UgPSBpZC5lbmRzV2l0aChcIl9fc2VsZlwiKTtcbiAgICBpZiAobWF5YmVTZWxmUmVmZXJlbmNlKSB7XG4gICAgICBpZCA9IGlkLnNsaWNlKDAsIC02KTtcbiAgICB9XG4gICAgcHVzaChcbiAgICAgIGBjb25zdCAke3RvVmFsaWRBc3NldElkKGlkLCB0eXBlKX0gPSAke3Jlc29sdmVyfSgke0pTT04uc3RyaW5naWZ5KGlkKX0ke21heWJlU2VsZlJlZmVyZW5jZSA/IGAsIHRydWVgIDogYGB9KSR7aXNUUyA/IGAhYCA6IGBgfWBcbiAgICApO1xuICAgIGlmIChpIDwgYXNzZXRzLmxlbmd0aCAtIDEpIHtcbiAgICAgIG5ld2xpbmUoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGdlbkhvaXN0cyhob2lzdHMsIGNvbnRleHQpIHtcbiAgaWYgKCFob2lzdHMubGVuZ3RoKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnRleHQucHVyZSA9IHRydWU7XG4gIGNvbnN0IHsgcHVzaCwgbmV3bGluZSwgaGVscGVyLCBzY29wZUlkLCBtb2RlIH0gPSBjb250ZXh0O1xuICBuZXdsaW5lKCk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgaG9pc3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgZXhwID0gaG9pc3RzW2ldO1xuICAgIGlmIChleHApIHtcbiAgICAgIHB1c2goXG4gICAgICAgIGBjb25zdCBfaG9pc3RlZF8ke2kgKyAxfSA9ICR7YGB9YFxuICAgICAgKTtcbiAgICAgIGdlbk5vZGUoZXhwLCBjb250ZXh0KTtcbiAgICAgIG5ld2xpbmUoKTtcbiAgICB9XG4gIH1cbiAgY29udGV4dC5wdXJlID0gZmFsc2U7XG59XG5mdW5jdGlvbiBpc1RleHQobikge1xuICByZXR1cm4gaXNTdHJpbmcobikgfHwgbi50eXBlID09PSA0IHx8IG4udHlwZSA9PT0gMiB8fCBuLnR5cGUgPT09IDUgfHwgbi50eXBlID09PSA4O1xufVxuZnVuY3Rpb24gZ2VuTm9kZUxpc3RBc0FycmF5KG5vZGVzLCBjb250ZXh0KSB7XG4gIGNvbnN0IG11bHRpbGluZXMgPSBub2Rlcy5sZW5ndGggPiAzIHx8ICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgbm9kZXMuc29tZSgobikgPT4gaXNBcnJheShuKSB8fCAhaXNUZXh0KG4pKTtcbiAgY29udGV4dC5wdXNoKGBbYCk7XG4gIG11bHRpbGluZXMgJiYgY29udGV4dC5pbmRlbnQoKTtcbiAgZ2VuTm9kZUxpc3Qobm9kZXMsIGNvbnRleHQsIG11bHRpbGluZXMpO1xuICBtdWx0aWxpbmVzICYmIGNvbnRleHQuZGVpbmRlbnQoKTtcbiAgY29udGV4dC5wdXNoKGBdYCk7XG59XG5mdW5jdGlvbiBnZW5Ob2RlTGlzdChub2RlcywgY29udGV4dCwgbXVsdGlsaW5lcyA9IGZhbHNlLCBjb21tYSA9IHRydWUpIHtcbiAgY29uc3QgeyBwdXNoLCBuZXdsaW5lIH0gPSBjb250ZXh0O1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3Qgbm9kZSA9IG5vZGVzW2ldO1xuICAgIGlmIChpc1N0cmluZyhub2RlKSkge1xuICAgICAgcHVzaChub2RlLCAtMyAvKiBVbmtub3duICovKTtcbiAgICB9IGVsc2UgaWYgKGlzQXJyYXkobm9kZSkpIHtcbiAgICAgIGdlbk5vZGVMaXN0QXNBcnJheShub2RlLCBjb250ZXh0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZ2VuTm9kZShub2RlLCBjb250ZXh0KTtcbiAgICB9XG4gICAgaWYgKGkgPCBub2Rlcy5sZW5ndGggLSAxKSB7XG4gICAgICBpZiAobXVsdGlsaW5lcykge1xuICAgICAgICBjb21tYSAmJiBwdXNoKFwiLFwiKTtcbiAgICAgICAgbmV3bGluZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29tbWEgJiYgcHVzaChcIiwgXCIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gZ2VuTm9kZShub2RlLCBjb250ZXh0KSB7XG4gIGlmIChpc1N0cmluZyhub2RlKSkge1xuICAgIGNvbnRleHQucHVzaChub2RlLCAtMyAvKiBVbmtub3duICovKTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGlzU3ltYm9sKG5vZGUpKSB7XG4gICAgY29udGV4dC5wdXNoKGNvbnRleHQuaGVscGVyKG5vZGUpKTtcbiAgICByZXR1cm47XG4gIH1cbiAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICBjYXNlIDE6XG4gICAgY2FzZSA5OlxuICAgIGNhc2UgMTE6XG4gICAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIGFzc2VydChcbiAgICAgICAgbm9kZS5jb2RlZ2VuTm9kZSAhPSBudWxsLFxuICAgICAgICBgQ29kZWdlbiBub2RlIGlzIG1pc3NpbmcgZm9yIGVsZW1lbnQvaWYvZm9yIG5vZGUuIEFwcGx5IGFwcHJvcHJpYXRlIHRyYW5zZm9ybXMgZmlyc3QuYFxuICAgICAgKTtcbiAgICAgIGdlbk5vZGUobm9kZS5jb2RlZ2VuTm9kZSwgY29udGV4dCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDI6XG4gICAgICBnZW5UZXh0KG5vZGUsIGNvbnRleHQpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSA0OlxuICAgICAgZ2VuRXhwcmVzc2lvbihub2RlLCBjb250ZXh0KTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgNTpcbiAgICAgIGdlbkludGVycG9sYXRpb24obm9kZSwgY29udGV4dCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDEyOlxuICAgICAgZ2VuTm9kZShub2RlLmNvZGVnZW5Ob2RlLCBjb250ZXh0KTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgODpcbiAgICAgIGdlbkNvbXBvdW5kRXhwcmVzc2lvbihub2RlLCBjb250ZXh0KTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMzpcbiAgICAgIGdlbkNvbW1lbnQobm9kZSwgY29udGV4dCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDEzOlxuICAgICAgZ2VuVk5vZGVDYWxsKG5vZGUsIGNvbnRleHQpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAxNDpcbiAgICAgIGdlbkNhbGxFeHByZXNzaW9uKG5vZGUsIGNvbnRleHQpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAxNTpcbiAgICAgIGdlbk9iamVjdEV4cHJlc3Npb24obm9kZSwgY29udGV4dCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDE3OlxuICAgICAgZ2VuQXJyYXlFeHByZXNzaW9uKG5vZGUsIGNvbnRleHQpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAxODpcbiAgICAgIGdlbkZ1bmN0aW9uRXhwcmVzc2lvbihub2RlLCBjb250ZXh0KTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMTk6XG4gICAgICBnZW5Db25kaXRpb25hbEV4cHJlc3Npb24obm9kZSwgY29udGV4dCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDIwOlxuICAgICAgZ2VuQ2FjaG
20578VFeHByZXNzaW9uKG5vZGUsIGNvbnRleHQpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAyMTpcbiAgICAgIGdlbk5vZGVMaXN0KG5vZGUuYm9keSwgY29udGV4dCwgdHJ1ZSwgZmFsc2UpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAyMjpcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMjM6XG4gICAgICBicmVhaztcbiAgICBjYXNlIDI0OlxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAyNTpcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMjY6XG4gICAgICBicmVhaztcbiAgICBjYXNlIDEwOlxuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgIGFzc2VydChmYWxzZSwgYHVuaGFuZGxlZCBjb2RlZ2VuIG5vZGUgdHlwZTogJHtub2RlLnR5cGV9YCk7XG4gICAgICAgIGNvbnN0IGV4aGF1c3RpdmVDaGVjayA9IG5vZGU7XG4gICAgICAgIHJldHVybiBleGhhdXN0aXZlQ2hlY2s7XG4gICAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGdlblRleHQobm9kZSwgY29udGV4dCkge1xuICBjb250ZXh0LnB1c2goSlNPTi5zdHJpbmdpZnkobm9kZS5jb250ZW50KSwgLTMgLyogVW5rbm93biAqLywgbm9kZSk7XG59XG5mdW5jdGlvbiBnZW5FeHByZXNzaW9uKG5vZGUsIGNvbnRleHQpIHtcbiAgY29uc3QgeyBjb250ZW50LCBpc1N0YXRpYyB9ID0gbm9kZTtcbiAgY29udGV4dC5wdXNoKFxuICAgIGlzU3RhdGljID8gSlNPTi5zdHJpbmdpZnkoY29udGVudCkgOiBjb250ZW50LFxuICAgIC0zIC8qIFVua25vd24gKi8sXG4gICAgbm9kZVxuICApO1xufVxuZnVuY3Rpb24gZ2VuSW50ZXJwb2xhdGlvbihub2RlLCBjb250ZXh0KSB7XG4gIGNvbnN0IHsgcHVzaCwgaGVscGVyLCBwdXJlIH0gPSBjb250ZXh0O1xuICBpZiAocHVyZSkgcHVzaChQVVJFX0FOTk9UQVRJT04pO1xuICBwdXNoKGAke2hlbHBlcihUT19ESVNQTEFZX1NUUklORyl9KGApO1xuICBnZW5Ob2RlKG5vZGUuY29udGVudCwgY29udGV4dCk7XG4gIHB1c2goYClgKTtcbn1cbmZ1bmN0aW9uIGdlbkNvbXBvdW5kRXhwcmVzc2lvbihub2RlLCBjb250ZXh0KSB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGNoaWxkID0gbm9kZS5jaGlsZHJlbltpXTtcbiAgICBpZiAoaXNTdHJpbmcoY2hpbGQpKSB7XG4gICAgICBjb250ZXh0LnB1c2goY2hpbGQsIC0zIC8qIFVua25vd24gKi8pO1xuICAgIH0gZWxzZSB7XG4gICAgICBnZW5Ob2RlKGNoaWxkLCBjb250ZXh0KTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGdlbkV4cHJlc3Npb25Bc1Byb3BlcnR5S2V5KG5vZGUsIGNvbnRleHQpIHtcbiAgY29uc3QgeyBwdXNoIH0gPSBjb250ZXh0O1xuICBpZiAobm9kZS50eXBlID09PSA4KSB7XG4gICAgcHVzaChgW2ApO1xuICAgIGdlbkNvbXBvdW5kRXhwcmVzc2lvbihub2RlLCBjb250ZXh0KTtcbiAgICBwdXNoKGBdYCk7XG4gIH0gZWxzZSBpZiAobm9kZS5pc1N0YXRpYykge1xuICAgIGNvbnN0IHRleHQgPSBpc1NpbXBsZUlkZW50aWZpZXIobm9kZS5jb250ZW50KSA/IG5vZGUuY29udGVudCA6IEpTT04uc3RyaW5naWZ5KG5vZGUuY29udGVudCk7XG4gICAgcHVzaCh0ZXh0LCAtMiAvKiBOb25lICovLCBub2RlKTtcbiAgfSBlbHNlIHtcbiAgICBwdXNoKGBbJHtub2RlLmNvbnRlbnR9XWAsIC0zIC8qIFVua25vd24gKi8sIG5vZGUpO1xuICB9XG59XG5mdW5jdGlvbiBnZW5Db21tZW50KG5vZGUsIGNvbnRleHQpIHtcbiAgY29uc3QgeyBwdXNoLCBoZWxwZXIsIHB1cmUgfSA9IGNvbnRleHQ7XG4gIGlmIChwdXJlKSB7XG4gICAgcHVzaChQVVJFX0FOTk9UQVRJT04pO1xuICB9XG4gIHB1c2goXG4gICAgYCR7aGVscGVyKENSRUFURV9DT01NRU5UKX0oJHtKU09OLnN0cmluZ2lmeShub2RlLmNvbnRlbnQpfSlgLFxuICAgIC0zIC8qIFVua25vd24gKi8sXG4gICAgbm9kZVxuICApO1xufVxuZnVuY3Rpb24gZ2VuVk5vZGVDYWxsKG5vZGUsIGNvbnRleHQpIHtcbiAgY29uc3QgeyBwdXNoLCBoZWxwZXIsIHB1cmUgfSA9IGNvbnRleHQ7XG4gIGNvbnN0IHtcbiAgICB0YWcsXG4gICAgcHJvcHMsXG4gICAgY2hpbGRyZW4sXG4gICAgcGF0Y2hGbGFnLFxuICAgIGR5bmFtaWNQcm9wcyxcbiAgICBkaXJlY3RpdmVzLFxuICAgIGlzQmxvY2ssXG4gICAgZGlzYWJsZVRyYWNraW5nLFxuICAgIGlzQ29tcG9uZW50XG4gIH0gPSBub2RlO1xuICBsZXQgcGF0Y2hGbGFnU3RyaW5nO1xuICBpZiAocGF0Y2hGbGFnKSB7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgIGlmIChwYXRjaEZsYWcgPCAwKSB7XG4gICAgICAgIHBhdGNoRmxhZ1N0cmluZyA9IHBhdGNoRmxhZyArIGAgLyogJHtQYXRjaEZsYWdOYW1lc1twYXRjaEZsYWddfSAqL2A7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBmbGFnTmFtZXMgPSBPYmplY3Qua2V5cyhQYXRjaEZsYWdOYW1lcykubWFwKE51bWJlcikuZmlsdGVyKChuKSA9PiBuID4gMCAmJiBwYXRjaEZsYWcgJiBuKS5tYXAoKG4pID0+IFBhdGNoRmxhZ05hbWVzW25dKS5qb2luKGAsIGApO1xuICAgICAgICBwYXRjaEZsYWdTdHJpbmcgPSBwYXRjaEZsYWcgKyBgIC8qICR7ZmxhZ05hbWVzfSAqL2A7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhdGNoRmxhZ1N0cmluZyA9IFN0cmluZyhwYXRjaEZsYWcpO1xuICAgIH1cbiAgfVxuICBpZiAoZGlyZWN0aXZlcykge1xuICAgIHB1c2goaGVscGVyKFdJVEhfRElSRUNUSVZFUykgKyBgKGApO1xuICB9XG4gIGlmIChpc0Jsb2NrKSB7XG4gICAgcHVzaChgKCR7aGVscGVyKE9QRU5fQkxPQ0spfSgke2Rpc2FibGVUcmFja2luZyA/IGB0cnVlYCA6IGBgfSksIGApO1xuICB9XG4gIGlmIChwdXJlKSB7XG4gICAgcHVzaChQVVJFX0FOTk9UQVRJT04pO1xuICB9XG4gIGNvbnN0IGNhbGxIZWxwZXIgPSBpc0Jsb2NrID8gZ2V0Vk5vZGVCbG9ja0hlbHBlcihjb250ZXh0LmluU1NSLCBpc0NvbXBvbmVudCkgOiBnZXRWTm9kZUhlbHBlcihjb250ZXh0LmluU1NSLCBpc0NvbXBvbmVudCk7XG4gIHB1c2goaGVscGVyKGNhbGxIZWxwZXIpICsgYChgLCAtMiAvKiBOb25lICovLCBub2RlKTtcbiAgZ2VuTm9kZUxpc3QoXG4gICAgZ2VuTnVsbGFibGVBcmdzKFt0YWcsIHByb3BzLCBjaGlsZHJlbiwgcGF0Y2hGbGFnU3RyaW5nLCBkeW5hbWljUHJvcHNdKSxcbiAgICBjb250ZXh0XG4gICk7XG4gIHB1c2goYClgKTtcbiAgaWYgKGlzQmxvY2spIHtcbiAgICBwdXNoKGApYCk7XG4gIH1cbiAgaWYgKGRpcmVjdGl2ZXMpIHtcbiAgICBwdXNoKGAsIGApO1xuICAgIGdlbk5vZGUoZGlyZWN0aXZlcywgY29udGV4dCk7XG4gICAgcHVzaChgKWApO1xuICB9XG59XG5mdW5jdGlvbiBnZW5OdWxsYWJsZUFyZ3MoYXJncykge1xuICBsZXQgaSA9IGFyZ3MubGVuZ3RoO1xuICB3aGlsZSAoaS0tKSB7XG4gICAgaWYgKGFyZ3NbaV0gIT0gbnVsbCkgYnJlYWs7XG4gIH1cbiAgcmV0dXJuIGFyZ3Muc2xpY2UoMCwgaSArIDEpLm1hcCgoYXJnKSA9PiBhcmcgfHwgYG51bGxgKTtcbn1cbmZ1bmN0aW9uIGdlbkNhbGxFeHByZXNzaW9uKG5vZGUsIGNvbnRleHQpIHtcbiAgY29uc3QgeyBwdXNoLCBoZWxwZXIsIHB1cmUgfSA9IGNvbnRleHQ7XG4gIGNvbnN0IGNhbGxlZSA9IGlzU3RyaW5nKG5vZGUuY2FsbGVlKSA/IG5vZGUuY2FsbGVlIDogaGVscGVyKG5vZGUuY2FsbGVlKTtcbiAgaWYgKHB1cmUpIHtcbiAgICBwdXNoKFBVUkVfQU5OT1RBVElPTik7XG4gIH1cbiAgcHVzaChjYWxsZWUgKyBgKGAsIC0yIC8qIE5vbmUgKi8sIG5vZGUpO1xuICBnZW5Ob2RlTGlzdChub2RlLmFyZ3VtZW50cywgY29udGV4dCk7XG4gIHB1c2goYClgKTtcbn1cbmZ1bmN0aW9uIGdlbk9iamVjdEV4cHJlc3Npb24obm9kZSwgY29udGV4dCkge1xuICBjb25zdCB7IHB1c2gsIGluZGVudCwgZGVpbmRlbnQsIG5ld2xpbmUgfSA9IGNvbnRleHQ7XG4gIGNvbnN0IHsgcHJvcGVydGllcyB9ID0gbm9kZTtcbiAgaWYgKCFwcm9wZXJ0aWVzLmxlbmd0aCkge1xuICAgIHB1c2goYHt9YCwgLTIgLyogTm9uZSAqLywgbm9kZSk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IG11bHRpbGluZXMgPSBwcm9wZXJ0aWVzLmxlbmd0aCA+IDEgfHwgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBwcm9wZXJ0aWVzLnNvbWUoKHApID0+IHAudmFsdWUud
20578HlwZSAhPT0gNCk7XG4gIHB1c2gobXVsdGlsaW5lcyA/IGB7YCA6IGB7IGApO1xuICBtdWx0aWxpbmVzICYmIGluZGVudCgpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCB7IGtleSwgdmFsdWUgfSA9IHByb3BlcnRpZXNbaV07XG4gICAgZ2VuRXhwcmVzc2lvbkFzUHJvcGVydHlLZXkoa2V5LCBjb250ZXh0KTtcbiAgICBwdXNoKGA6IGApO1xuICAgIGdlbk5vZGUodmFsdWUsIGNvbnRleHQpO1xuICAgIGlmIChpIDwgcHJvcGVydGllcy5sZW5ndGggLSAxKSB7XG4gICAgICBwdXNoKGAsYCk7XG4gICAgICBuZXdsaW5lKCk7XG4gICAgfVxuICB9XG4gIG11bHRpbGluZXMgJiYgZGVpbmRlbnQoKTtcbiAgcHVzaChtdWx0aWxpbmVzID8gYH1gIDogYCB9YCk7XG59XG5mdW5jdGlvbiBnZW5BcnJheUV4cHJlc3Npb24obm9kZSwgY29udGV4dCkge1xuICBnZW5Ob2RlTGlzdEFzQXJyYXkobm9kZS5lbGVtZW50cywgY29udGV4dCk7XG59XG5mdW5jdGlvbiBnZW5GdW5jdGlvbkV4cHJlc3Npb24obm9kZSwgY29udGV4dCkge1xuICBjb25zdCB7IHB1c2gsIGluZGVudCwgZGVpbmRlbnQgfSA9IGNvbnRleHQ7XG4gIGNvbnN0IHsgcGFyYW1zLCByZXR1cm5zLCBib2R5LCBuZXdsaW5lLCBpc1Nsb3QgfSA9IG5vZGU7XG4gIGlmIChpc1Nsb3QpIHtcbiAgICBwdXNoKGBfJHtoZWxwZXJOYW1lTWFwW1dJVEhfQ1RYXX0oYCk7XG4gIH1cbiAgcHVzaChgKGAsIC0yIC8qIE5vbmUgKi8sIG5vZGUpO1xuICBpZiAoaXNBcnJheShwYXJhbXMpKSB7XG4gICAgZ2VuTm9kZUxpc3QocGFyYW1zLCBjb250ZXh0KTtcbiAgfSBlbHNlIGlmIChwYXJhbXMpIHtcbiAgICBnZW5Ob2RlKHBhcmFtcywgY29udGV4dCk7XG4gIH1cbiAgcHVzaChgKSA9PiBgKTtcbiAgaWYgKG5ld2xpbmUgfHwgYm9keSkge1xuICAgIHB1c2goYHtgKTtcbiAgICBpbmRlbnQoKTtcbiAgfVxuICBpZiAocmV0dXJucykge1xuICAgIGlmIChuZXdsaW5lKSB7XG4gICAgICBwdXNoKGByZXR1cm4gYCk7XG4gICAgfVxuICAgIGlmIChpc0FycmF5KHJldHVybnMpKSB7XG4gICAgICBnZW5Ob2RlTGlzdEFzQXJyYXkocmV0dXJucywgY29udGV4dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdlbk5vZGUocmV0dXJucywgY29udGV4dCk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGJvZHkpIHtcbiAgICBnZW5Ob2RlKGJvZHksIGNvbnRleHQpO1xuICB9XG4gIGlmIChuZXdsaW5lIHx8IGJvZHkpIHtcbiAgICBkZWluZGVudCgpO1xuICAgIHB1c2goYH1gKTtcbiAgfVxuICBpZiAoaXNTbG90KSB7XG4gICAgaWYgKG5vZGUuaXNOb25TY29wZWRTbG90KSB7XG4gICAgICBwdXNoKGAsIHVuZGVmaW5lZCwgdHJ1ZWApO1xuICAgIH1cbiAgICBwdXNoKGApYCk7XG4gIH1cbn1cbmZ1bmN0aW9uIGdlbkNvbmRpdGlvbmFsRXhwcmVzc2lvbihub2RlLCBjb250ZXh0KSB7XG4gIGNvbnN0IHsgdGVzdCwgY29uc2VxdWVudCwgYWx0ZXJuYXRlLCBuZXdsaW5lOiBuZWVkTmV3bGluZSB9ID0gbm9kZTtcbiAgY29uc3QgeyBwdXNoLCBpbmRlbnQsIGRlaW5kZW50LCBuZXdsaW5lIH0gPSBjb250ZXh0O1xuICBpZiAodGVzdC50eXBlID09PSA0KSB7XG4gICAgY29uc3QgbmVlZHNQYXJlbnMgPSAhaXNTaW1wbGVJZGVudGlmaWVyKHRlc3QuY29udGVudCk7XG4gICAgbmVlZHNQYXJlbnMgJiYgcHVzaChgKGApO1xuICAgIGdlbkV4cHJlc3Npb24odGVzdCwgY29udGV4dCk7XG4gICAgbmVlZHNQYXJlbnMgJiYgcHVzaChgKWApO1xuICB9IGVsc2Uge1xuICAgIHB1c2goYChgKTtcbiAgICBnZW5Ob2RlKHRlc3QsIGNvbnRleHQpO1xuICAgIHB1c2goYClgKTtcbiAgfVxuICBuZWVkTmV3bGluZSAmJiBpbmRlbnQoKTtcbiAgY29udGV4dC5pbmRlbnRMZXZlbCsrO1xuICBuZWVkTmV3bGluZSB8fCBwdXNoKGAgYCk7XG4gIHB1c2goYD8gYCk7XG4gIGdlbk5vZGUoY29uc2VxdWVudCwgY29udGV4dCk7XG4gIGNvbnRleHQuaW5kZW50TGV2ZWwtLTtcbiAgbmVlZE5ld2xpbmUgJiYgbmV3bGluZSgpO1xuICBuZWVkTmV3bGluZSB8fCBwdXNoKGAgYCk7XG4gIHB1c2goYDogYCk7XG4gIGNvbnN0IGlzTmVzdGVkID0gYWx0ZXJuYXRlLnR5cGUgPT09IDE5O1xuICBpZiAoIWlzTmVzdGVkKSB7XG4gICAgY29udGV4dC5pbmRlbnRMZXZlbCsrO1xuICB9XG4gIGdlbk5vZGUoYWx0ZXJuYXRlLCBjb250ZXh0KTtcbiAgaWYgKCFpc05lc3RlZCkge1xuICAgIGNvbnRleHQuaW5kZW50TGV2ZWwtLTtcbiAgfVxuICBuZWVkTmV3bGluZSAmJiBkZWluZGVudChcbiAgICB0cnVlXG4gICAgLyogd2l0aG91dCBuZXdsaW5lICovXG4gICk7XG59XG5mdW5jdGlvbiBnZW5DYWNoZUV4cHJlc3Npb24obm9kZSwgY29udGV4dCkge1xuICBjb25zdCB7IHB1c2gsIGhlbHBlciwgaW5kZW50LCBkZWluZGVudCwgbmV3bGluZSB9ID0gY29udGV4dDtcbiAgcHVzaChgX2NhY2hlWyR7bm9kZS5pbmRleH1dIHx8IChgKTtcbiAgaWYgKG5vZGUuaXNWT25jZSkge1xuICAgIGluZGVudCgpO1xuICAgIHB1c2goYCR7aGVscGVyKFNFVF9CTE9DS19UUkFDS0lORyl9KC0xKSxgKTtcbiAgICBuZXdsaW5lKCk7XG4gICAgcHVzaChgKGApO1xuICB9XG4gIHB1c2goYF9jYWNoZVske25vZGUuaW5kZXh9XSA9IGApO1xuICBnZW5Ob2RlKG5vZGUudmFsdWUsIGNvbnRleHQpO1xuICBpZiAobm9kZS5pc1ZPbmNlKSB7XG4gICAgcHVzaChgKS5jYWNoZUluZGV4ID0gJHtub2RlLmluZGV4fSxgKTtcbiAgICBuZXdsaW5lKCk7XG4gICAgcHVzaChgJHtoZWxwZXIoU0VUX0JMT0NLX1RSQUNLSU5HKX0oMSksYCk7XG4gICAgbmV3bGluZSgpO1xuICAgIHB1c2goYF9jYWNoZVske25vZGUuaW5kZXh9XWApO1xuICAgIGRlaW5kZW50KCk7XG4gIH1cbiAgcHVzaChgKWApO1xufVxuXG5jb25zdCBwcm9oaWJpdGVkS2V5d29yZFJFID0gbmV3IFJlZ0V4cChcbiAgXCJcXFxcYlwiICsgXCJhcmd1bWVudHMsYXdhaXQsYnJlYWssY2FzZSxjYXRjaCxjbGFzcyxjb25zdCxjb250aW51ZSxkZWJ1Z2dlcixkZWZhdWx0LGRlbGV0ZSxkbyxlbHNlLGV4cG9ydCxleHRlbmRzLGZpbmFsbHksZm9yLGZ1bmN0aW9uLGlmLGltcG9ydCxsZXQsbmV3LHJldHVybixzdXBlcixzd2l0Y2gsdGhyb3csdHJ5L
20578HZhcix2b2lkLHdoaWxlLHdpdGgseWllbGRcIi5zcGxpdChcIixcIikuam9pbihcIlxcXFxifFxcXFxiXCIpICsgXCJcXFxcYlwiXG4pO1xuY29uc3Qgc3RyaXBTdHJpbmdSRSA9IC8nKD86W14nXFxcXF18XFxcXC4pKid8XCIoPzpbXlwiXFxcXF18XFxcXC4pKlwifGAoPzpbXmBcXFxcXXxcXFxcLikqXFwkXFx7fFxcfSg/OlteYFxcXFxdfFxcXFwuKSpgfGAoPzpbXmBcXFxcXXxcXFxcLikqYC9nO1xuZnVuY3Rpb24gdmFsaWRhdGVCcm93c2VyRXhwcmVzc2lvbihub2RlLCBjb250ZXh0LCBhc1BhcmFtcyA9IGZhbHNlLCBhc1Jhd1N0YXRlbWVudHMgPSBmYWxzZSkge1xuICBjb25zdCBleHAgPSBub2RlLmNvbnRlbnQ7XG4gIGlmICghZXhwLnRyaW0oKSkge1xuICAgIHJldHVybjtcbiAgfVxuICB0cnkge1xuICAgIG5ldyBGdW5jdGlvbihcbiAgICAgIGFzUmF3U3RhdGVtZW50cyA/IGAgJHtleHB9IGAgOiBgcmV0dXJuICR7YXNQYXJhbXMgPyBgKCR7ZXhwfSkgPT4ge31gIDogYCgke2V4cH0pYH1gXG4gICAgKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGxldCBtZXNzYWdlID0gZS5tZXNzYWdlO1xuICAgIGNvbnN0IGtleXdvcmRNYXRjaCA9IGV4cC5yZXBsYWNlKHN0cmlwU3RyaW5nUkUsIFwiXCIpLm1hdGNoKHByb2hpYml0ZWRLZXl3b3JkUkUpO1xuICAgIGlmIChrZXl3b3JkTWF0Y2gpIHtcbiAgICAgIG1lc3NhZ2UgPSBgYXZvaWQgdXNpbmcgSmF2YVNjcmlwdCBrZXl3b3JkIGFzIHByb3BlcnR5IG5hbWU6IFwiJHtrZXl3b3JkTWF0Y2hbMF19XCJgO1xuICAgIH1cbiAgICBjb250ZXh0Lm9uRXJyb3IoXG4gICAgICBjcmVhdGVDb21waWxlckVycm9yKFxuICAgICAgICA0NSxcbiAgICAgICAgbm9kZS5sb2MsXG4gICAgICAgIHZvaWQgMCxcbiAgICAgICAgbWVzc2FnZVxuICAgICAgKVxuICAgICk7XG4gIH1cbn1cblxuY29uc3QgdHJhbnNmb3JtRXhwcmVzc2lvbiA9IChub2RlLCBjb250ZXh0KSA9PiB7XG4gIGlmIChub2RlLnR5cGUgPT09IDUpIHtcbiAgICBub2RlLmNvbnRlbnQgPSBwcm9jZXNzRXhwcmVzc2lvbihcbiAgICAgIG5vZGUuY29udGVudCxcbiAgICAgIGNvbnRleHRcbiAgICApO1xuICB9IGVsc2UgaWYgKG5vZGUudHlwZSA9PT0gMSkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS5wcm9wcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgZGlyID0gbm9kZS5wcm9wc1tpXTtcbiAgICAgIGlmIChkaXIudHlwZSA9PT0gNyAmJiBkaXIubmFtZSAhPT0gXCJmb3JcIikge1xuICAgICAgICBjb25zdCBleHAgPSBkaXIuZXhwO
205781xuICAgICAgICBjb25zdCBhcmcgPSBkaXIuYXJnO1xuICAgICAgICBpZiAoZXhwICYmIGV4cC50eXBlID09PSA0ICYmICEoZGlyLm5hbWUgPT09IFwib25cIiAmJiBhcmcpKSB7XG4gICAgICAgICAgZGlyLmV4cCA9IHByb2Nlc3NFeHByZXNzaW9uKFxuICAgICAgICAgICAgZXhwLFxuICAgICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICAgIC8vIHNsb3QgYXJncyBtdXN0IGJlIHByb2Nlc3NlZCBhcyBmdW5jdGlvbiBwYXJhbXNcbiAgICAgICAgICAgIGRpci5uYW1lID09PSBcInNsb3RcIlxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFyZyAmJiBhcmcudHlwZSA9PT0gNCAmJiAhYXJnLmlzU3RhdGljKSB7XG4gICAgICAgICAgZGlyLmFyZyA9IHByb2Nlc3NFeHByZXNzaW9uKGFyZywgY29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG5mdW5jdGlvbiBwcm9jZXNzRXhwcmVzc2lvbihub2RlLCBjb250ZXh0LCBhc1BhcmFtcyA9IGZhbHNlLCBhc1Jhd1N0YXRlbWVudHMgPSBmYWxzZSwgbG9jYWxWYXJzID0gT2JqZWN0LmNyZWF0ZShjb250ZXh0LmlkZW50aWZpZXJzKSkge1xuICB7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgIHZhbGlkYXRlQnJvd3NlckV4cHJlc3Npb24obm9kZSwgY29udGV4dCwgYXNQYXJhbXMsIGFzUmF3U3RhdGVtZW50cyk7XG4gICAgfVxuICAgIHJldHVybiBub2RlO1xuICB9XG59XG5mdW5jdGlvbiBzdHJpbmdpZnlFeHByZXNzaW9uKGV4cCkge1xuICBpZiAoaXNTdHJpbmcoZXhwKSkge1xuICAgIHJldHVybiBleHA7XG4gIH0gZWxzZSBpZiAoZXhwLnR5cGUgPT09IDQpIHtcbiAgICByZXR1cm4gZXhwLmNvbnRlbnQ7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGV4cC5jaGlsZHJlbi5tYXAoc3RyaW5naWZ5RXhwcmVzc2lvbikuam9pbihcIlwiKTtcbiAgfVxufVxuXG5jb25zdCB0cmFuc2Zvcm1JZiA9IGNyZWF0ZVN0cnVjdHVyYWxEaXJlY3RpdmVUcmFuc2Zvcm0oXG4gIC9eKGlmfGVsc2V8ZWxzZS1pZikkLyxcbiAgKG5vZGUsIGRpciwgY29udGV4dCkgPT4ge1xuICAgIHJldHVybiBwcm9jZXNzSWYobm9kZSwgZGlyLCBjb250ZXh0LCAoaWZOb2RlLCBicmFuY2gsIGlzUm9vdCkgPT4ge1xuICAgICAgY29uc3Qgc2libGluZ3MgPSBjb250ZXh0LnBhcmVudC5jaGlsZHJlbjtcbiAgICAgIGxldCBpID0gc2libGluZ3MuaW5kZXhPZihpZk5vZGUpO1xuICAgICAgbGV0IGtleSA9IDA7XG4gICAgICB3aGlsZSAoaS0tID49IDApIHtcbiAgICAgICAgY29uc3Qgc2libGluZyA9IHNpYmxpbmdzW2ldO1xuICAgICAgICBpZiAoc2libGluZyAmJiBzaWJsaW5nLnR5cGUgPT09IDkpIHtcbiAgICAgICAgICBrZXkgKz0gc2libGluZy5icmFuY2hlcy5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGlmIChpc1Jvb3QpIHtcbiAgICAgICAgICBpZk5vZGUuY29kZWdlbk5vZGUgPSBjcmVhdGVDb2RlZ2VuTm9kZUZvckJyYW5jaChcbiAgICAgICAgICAgIGJyYW5jaCxcbiAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgIGNvbnRleHRcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IHBhcmVudENvbmRpdGlvbiA9IGdldFBhcmVudENvbmRpdGlvbihpZk5vZGUuY29kZWdlbk5vZGUpO1xuICAgICAgICAgIHBhcmVudENvbmRpdGlvbi5hbHRlcm5hdGUgPSBjcmVhdGVDb2RlZ2VuTm9kZUZvckJyYW5jaChcbiAgICAgICAgICAgIGJyYW5jaCxcbiAgICAgICAgICAgIGtleSArIGlmTm9kZS5icmFuY2hlcy5sZW5ndGggLSAxLFxuICAgICAgICAgICAgY29udGV4dFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSk7XG4gIH1cbik7XG5mdW5jdGlvbiBwcm9jZXNzSWYobm9kZSwgZGlyLCBjb250ZXh0LCBwcm9jZXNzQ29kZWdlbikge1xuICBpZiAoZGlyLm5hbWUgIT09IFwiZWxzZVwiICYmICghZGlyLmV4cCB8fCAhZGlyLmV4cC5jb250ZW50LnRyaW0oKSkpIHtcbiAgICBjb25zdCBsb2MgPSBkaXIuZXhwID8gZGlyLmV4cC5sb2MgOiBub2RlLmxvYztcbiAgICBjb250ZXh0Lm9uRXJyb3IoXG4gICAgICBjcmVhdGVDb21waWxlckVycm9yKDI4LCBkaXIubG9jKVxuICAgICk7XG4gICAgZGlyLmV4cCA9IGNyZWF0ZVNpbXBsZUV4cHJlc3Npb24oYHRydWVgLCBmYWxzZSwgbG9jKTtcbiAgfVxuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiB0cnVlICYmIGRpci5leHApIHtcbiAgICB2YWxpZGF0ZUJyb3dzZXJFeHByZXNzaW9uKGRpci5leHAsIGNvbnRleHQpO1xuICB9XG4gIGlmIChkaXIubmFtZSA9PT0gXCJpZlwiKSB7XG4gICAgY29uc3QgYnJhbmNoID0gY3JlYXRlSWZCcmFuY2gobm9kZSwgZGlyKTtcbiAgICBjb25zdCBpZk5vZGUgPSB7XG4gICAgICB0eXBlOiA5LFxuICAgICAgbG9jOiBub2RlLmxvYyxcbiAgICAgIGJyYW5jaGVzOiBbYnJhbmNoXVxuICAgIH07XG4gICAgY29udGV4dC5yZXBsYWNlTm9kZShpZk5vZGUpO1xuICAgIGlmIChwcm9jZXNzQ29kZWdlbikge1xuICAgICAgcmV0dXJuIHByb2Nlc3NDb2RlZ2VuKGlmTm9kZSwgYnJhbmNoLCB0cnVlKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgY29uc3Qgc2libGluZ3MgPSBjb250ZXh0LnBhcmVudC5jaGlsZHJlbjtcbiAgICBjb25zdCBjb21tZW50cyA9IFtdO1xuICAgIGxldCBpID0gc2libGluZ3MuaW5kZXhPZihub2RlKTtcbiAgICB3aGlsZSAoaS0tID49IC0xKSB7XG4gICAgICBjb25zdCBzaWJsaW5nID0gc2libGluZ3NbaV07XG4gICAgICBpZiAoc2libGluZyAmJiBzaWJsaW5nLnR5cGUgPT09IDMpIHtcbiAgICAgICAgY29udGV4dC5yZW1vdmVOb2RlKHNpYmxpbmcpO1xuICAgICAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIGNvbW1lbnRzLnVuc2hpZnQoc2libGluZyk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKHNpYmxpbmcgJiYgc2libGluZy50eXBlID09PSA
20578yICYmICFzaWJsaW5nLmNvbnRlbnQudHJpbSgpLmxlbmd0aCkge1xuICAgICAgICBjb250ZXh0LnJlbW92ZU5vZGUoc2libGluZyk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKHNpYmxpbmcgJiYgc2libGluZy50eXBlID09PSA5KSB7XG4gICAgICAgIGlmIChkaXIubmFtZSA9PT0gXCJlbHNlLWlmXCIgJiYgc2libGluZy5icmFuY2hlc1tzaWJsaW5nLmJyYW5jaGVzLmxlbmd0aCAtIDFdLmNvbmRpdGlvbiA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgY29udGV4dC5vbkVycm9yKFxuICAgICAgICAgICAgY3JlYXRlQ29tcGlsZXJFcnJvcigzMCwgbm9kZS5sb2MpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBjb250ZXh0LnJlbW92ZU5vZGUoKTtcbiAgICAgICAgY29uc3QgYnJhbmNoID0gY3JlYXRlSWZCcmFuY2gobm9kZSwgZGlyKTtcbiAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgY29tbWVudHMubGVuZ3RoICYmIC8vICMzNjE5IGlnbm9yZSBjb21tZW50cyBpZiB0aGUgdi1pZiBpcyBkaXJlY3QgY2hpbGQgb2YgPHRyYW5zaXRpb24+XG4gICAgICAgICEoY29udGV4dC5wYXJlbnQgJiYgY29udGV4dC5wYXJlbnQudHlwZSA9PT0gMSAmJiAoY29udGV4dC5wYXJlbnQudGFnID09PSBcInRyYW5zaXRpb25cIiB8fCBjb250ZXh0LnBhcmVudC50YWcgPT09IFwiVHJhbnNpdGlvblwiKSkpIHtcbiAgICAgICAgICBicmFuY2guY2hpbGRyZW4gPSBbLi4uY29tbWVudHMsIC4uLmJyYW5jaC5jaGlsZHJlbl07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgZmFsc2UpIHtcbiAgICAgICAgICBjb25zdCBrZXkgPSBicmFuY2gudXNlcktleTtcbiAgICAgICAgICBpZiAoa2V5KSB7XG4gICAgICAgICAgICBzaWJsaW5nLmJyYW5jaGVzLmZvckVhY2goKHsgdXNlcktleSB9KSA9PiB7XG4gICAgICAgICAgICAgIGlmIChpc1NhbWVLZXkodXNlcktleSwga2V5KSkge1xuICAgICAgICAgICAgICAgIGNvbnRleHQub25FcnJvcihcbiAgICAgICAgICAgICAgICAgIGNyZWF0ZUNvbXBpbGVyRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIDI5LFxuICAgICAgICAgICAgICAgICAgICBicmFuY2gudXNlcktleS5sb2NcbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc2libGluZy5icmFuY2hlcy5wdXNoKGJyYW5jaCk7XG4gICAgICAgIGNvbnN0IG9uRXhpdCA9IHByb2Nlc3NDb2RlZ2VuICYmIHByb2Nlc3NDb2RlZ2VuKHNpYmxpbmcsIGJyYW5jaCwgZmFsc2UpO1xuICAgICAgICB0cmF2ZXJzZU5vZGUoYnJhbmNoLCBjb250ZXh0KTtcbiAgICAgICAgaWYgKG9uRXhpdCkgb25FeGl0KCk7XG4gICAgICAgIGNvbnRleHQuY3VycmVudE5vZGUgPSBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29udGV4dC5vbkVycm9yKFxuICAgICAgICAgIGNyZWF0ZUNvbXBpbGVyRXJyb3IoMzAsIG5vZGUubG9jKVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBjcmVhdGVJZkJyYW5jaChub2RlLCBkaXIpIHtcbiAgY29uc3QgaXNUZW1wbGF0ZUlmID0gbm9kZS50YWdUeXBlID09PSAzO1xuICByZXR1cm4ge1xuICAgIHR5cGU6IDEwLFxuICAgIGxvYzogbm9kZS5sb2MsXG4gICAgY29uZGl0aW9uOiBkaXIubmFtZSA9PT0gXCJlbHNlXCIgPyB2b2lkIDAgOiBkaXIuZXhwLFxuICAgIGNoaWxkcmVuOiBpc1RlbXBsYXRlSWYgJiYgIWZpbmREaXIobm9kZSwgXCJmb3JcIikgPyBub2RlLmNoaWxkcmVuIDogW25vZGVdLFxuICAgIHVzZXJLZXk6IGZpbmRQcm9wKG5vZGUsIGBrZXlgKSxcbiAgICBpc1RlbXBsYXRlSWZcbiAgfTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUNvZGVnZW5Ob2RlRm9yQnJhbmNoKGJyYW5jaCwga2V5SW5kZXgsIGNvbnRleHQpIHtcbiAgaWYgKGJyYW5jaC5jb25kaXRpb24pIHtcbiAgICByZXR1cm4gY3JlYXRlQ29uZGl0aW9uYWxFeHByZXNzaW9uKFxuICAgICAgYnJhbmNoLmNvbmRpdGlvbixcbiAgICAgIGNyZWF0ZUNoaWxkcmVuQ29kZWdlbk5vZGUoYnJhbmNoLCBrZXlJbmRleCwgY29udGV4dCksXG4gICAgICAvLyBtYWtlIHN1cmUgdG8gcGFzcyBpbiBhc0Jsb2NrOiB0cnVlIHNvIHRoYXQgdGhlIGNvbW1lbnQgbm9kZSBjYWxsXG4gICAgICAvLyBjbG9zZXMgdGhlIGN1cnJlbnQgYmxvY2suXG4gICAgICBjcmVhdGVDYWxsRXhwcmVzc2lvbihjb250ZXh0LmhlbHBlcihDUkVBVEVfQ09NTUVOVCksIFtcbiAgICAgICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/ICdcInYtaWZcIicgOiAnXCJcIicsXG4gICAgICAgIFwidHJ1ZVwiXG4gICAgICBdKVxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGNyZWF0ZUNoaWxkcmVuQ29kZWdlbk5vZGUoYnJhbmNoLCBrZXlJbmRleCwgY29udGV4dCk7XG4gIH1cbn1cbmZ1bmN0aW9uIGNyZWF0ZUNoaWxkcmVuQ29kZWdlbk5vZGUoYnJhbmNoLCBrZXlJbmRleCwgY29udGV4dCkge1xuICBjb25zdCB7IGhlbHBlciB9ID0gY29udGV4dDtcbiAgY29uc3Qga2V5UHJvcGVydHkgPSBjcmVhdGVPYmplY3RQcm9wZXJ0eShcbiAgICBga2V5YCxcbiAgICBjcmVhdGVTaW1wbGVFeHByZXNzaW9uKFxuICAgICAgYCR7a2V5SW5kZXh9YCxcbiAgICAgIGZhbHNlLFxuICAgICAgbG9jU3R1YixcbiAgICAgIDJcbiAgICApXG4gICk7XG4gIGNvbnN0IHsgY2hpbGRyZW4gfSA9IGJyYW5jaDtcbiAgY29uc3QgZmlyc3RDaGlsZCA9IGNoaWxkcmVuWzBdO1xuICBjb25zdCBuZWVkRnJhZ21lbnRXcmFwcGVyID0gY2hpbGRyZW4ubGVuZ3RoICE9PSAxIHx8IGZpcnN0Q2hpbGQudHlwZSAhPT0gMTtcbiAgaWYgKG5lZWRGcmFnbWVudFdyYXBwZXIpIHtcbiAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoID09PSAxICYmIGZpcnN0Q2hpbGQudHlwZSA9PT0gMTEpIHtcbiAgICAgIGNvbnN0IHZub2RlQ2FsbCA9IGZpcnN0Q2hpbGQuY29kZWdlbk5vZGU7XG4gICAgICBpbmplY3RQcm9wKHZub2RlQ2FsbCwga2V5UHJvcGVydHksIGNvbnRleHQpO1xuICAgICAgcmV0dXJuIHZub2RlQ2FsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IHBhdGNoRmxhZyA9IDY0O1xuICAgICAgbGV0IHBhdGNoRmxhZ1RleHQgPSBQYXRjaEZsYWdOYW1lc1s2NF07XG4gICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAhYnJhbmNoLmlzVGVtcGxhdGVJZiAmJiBjaGlsZHJlbi5maWx0ZXIoKGMpID0+IGMudHlwZSAhPT0gMykubGVuZ3RoID09PSAxKSB7XG4gICAgICAgI
20578HBhdGNoRmxhZyB8PSAyMDQ4O1xuICAgICAgICBwYXRjaEZsYWdUZXh0ICs9IGAsICR7UGF0Y2hGbGFnTmFtZXNbMjA0OF19YDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjcmVhdGVWTm9kZUNhbGwoXG4gICAgICAgIGNvbnRleHQsXG4gICAgICAgIGhlbHBlcihGUkFHTUVOVCksXG4gICAgICAgIGNyZWF0ZU9iamVjdEV4cHJlc3Npb24oW2tleVByb3BlcnR5XSksXG4gICAgICAgIGNoaWxkcmVuLFxuICAgICAgICBwYXRjaEZsYWcsXG4gICAgICAgIHZvaWQgMCxcbiAgICAgICAgdm9pZCAwLFxuICAgICAgICB0cnVlLFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgZmFsc2UsXG4gICAgICAgIGJyYW5jaC5sb2NcbiAgICAgICk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGNvbnN0IHJldCA9IGZpcnN0Q2hpbGQuY29kZWdlbk5vZGU7XG4gICAgY29uc3Qgdm5vZGVDYWxsID0gZ2V0TWVtb2VkVk5vZGVDYWxsKHJldCk7XG4gICAgaWYgKHZub2RlQ2FsbC50eXBlID09PSAxMykge1xuICAgICAgY29udmVydFRvQmxvY2sodm5vZGVDYWxsLCBjb250ZXh0KTtcbiAgICB9XG4gICAgaW5qZWN0UHJvcCh2bm9kZUNhbGwsIGtleVByb3BlcnR5LCBjb250ZXh0KTtcbiAgICByZXR1cm4gcmV0O1xuICB9XG59XG5mdW5jdGlvbiBpc1NhbWVLZXkoYSwgYikge1xuICBpZiAoIWEgfHwgYS50eXBlICE9PSBiLnR5cGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKGEudHlwZSA9PT0gNikge1xuICAgIGlmIChhLnZhbHVlLmNvbnRlbnQgIT09IGIudmFsdWUuY29udGVudCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjb25zdCBleHAgPSBhLmV4cDtcbiAgICBjb25zdCBicmFuY2hFeHAgPSBiLmV4cDtcbiAgICBpZiAoZXhwLnR5cGUgIT09IGJyYW5jaEV4cC50eXBlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChleHAudHlwZSAhPT0gNCB8fCBleHAuaXNTdGF0aWMgIT09IGJyYW5jaEV4cC5pc1N0YXRpYyB8fCBleHAuY29udGVudCAhPT0gYnJhbmNoRXhwLmNvbnRlbnQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5mdW5jdGlvbiBnZXRQYXJlbnRDb25kaXRpb24obm9kZSkge1xuICB3aGlsZSAodHJ1ZSkge1xuICAgIGlmIChub2RlLnR5cGUgPT09IDE5KSB7XG4gICAgICBpZiAobm9kZS5hbHRlcm5hdGUudHlwZSA9PT0gMTkpIHtcbiAgICAgICAgbm9kZSA9IG5vZGUuYWx0ZXJuYXRlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChub2RlLnR5cGUgPT09IDIwKSB7XG4gICAgICBub2RlID0gbm9kZS52YWx1ZTtcbiAgICB9XG4gIH1cbn1cblxuY29uc3QgdHJhbnNmb3JtQmluZCA9IChkaXIsIF9ub2RlLCBjb250ZXh0KSA9PiB7XG4gIGNvbnN0IHsgbW9kaWZpZXJzLCBsb2MgfSA9IGRpcjtcbiAgY29uc3QgYXJnID0gZGlyLmFyZztcbiAgbGV0IHsgZXhwIH0gPSBkaXI7XG4gIGlmIChleHAgJiYgZXhwLnR5cGUgPT09IDQgJiYgIWV4cC5jb250ZW50LnRyaW0oKSkge1xuICAgIHtcbiAgICAgIGV4cCA9IHZvaWQgMDtcbiAgICB9XG4gIH1cbiAgaWYgKCFleHApIHtcbiAgICBpZiAoYXJnLnR5cGUgIT09IDQgfHwgIWFyZy5pc1N0YXRpYykge1xuICAgICAgY29udGV4dC5vbkVycm9yKFxuICAgICAgICBjcmVhdGVDb21waWxlckVycm9yKFxuICAgICAgICAgIDUyLFxuICAgICAgICAgIGFyZy5sb2NcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHByb3BzOiBbXG4gICAgICAgICAgY3JlYXRlT2JqZWN0UHJvcGVydHkoYXJnLCBjcmVhdGVTaW1wbGVFeHByZXNzaW9uKFwiXCIsIHRydWUsIGxvYykpXG4gICAgICAgIF1cbiAgICAgIH07XG4gICAgfVxuICAgIHRyYW5zZm9ybUJpbmRTaG9ydGhhbmQoZGlyKTtcbiAgICBleHAgPSBkaXIuZXhwO
205781xuICB9XG4gIGlmIChhcmcudHlwZSAhPT0gNCkge1xuICAgIGFyZy5jaGlsZHJlbi51bnNoaWZ0KGAoYCk7XG4gICAgYXJnLmNoaWxkcmVuLnB1c2goYCkgfHwgXCJcImApO1xuICB9IGVsc2UgaWYgKCFhcmcuaXNTdGF0aWMpIHtcbiAgICBhcmcuY29udGVudCA9IGAke2FyZy5jb250ZW50fSB8fCBcIlwiYDtcbiAgfVxuICBpZiAobW9kaWZpZXJzLmluY2x1ZGVzKFwiY2FtZWxcIikpIHtcbiAgICBpZiAoYXJnLnR5cGUgPT09IDQpIHtcbiAgICAgIGlmIChhcmcuaXNTdGF0aWMpIHtcbiAgICAgICAgYXJnLmNvbnRlbnQgPSBjYW1lbGl6ZShhcmcuY29udGVudCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhcmcuY29udGVudCA9IGAke2NvbnRleHQuaGVscGVyU3RyaW5nKENBTUVMSVpFKX0oJHthcmcuY29udGVudH0pYDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgYXJnLmNoaWxkcmVuLnVuc2hpZnQoYCR7Y29udGV4dC5oZWxwZXJTdHJpbmcoQ0FNRUxJWkUpfShgKTtcbiAgICAgIGFyZy5jaGlsZHJlbi5wdXNoKGApYCk7XG4gICAgfVxuICB9XG4gIGlmICghY29udGV4dC5pblNTUikge1xuICAgIGlmIChtb2RpZmllcnMuaW5jbHVkZXMoXCJwcm9wXCIpKSB7XG4gICAgICBpbmplY3RQcmVmaXgoYXJnLCBcIi5cIik7XG4gICAgfVxuICAgIGlmIChtb2RpZmllcnMuaW5jbHVkZXMoXCJhdHRyXCIpKSB7XG4gICAgICBpbmplY3RQcmVmaXgoYXJnLCBcIl5cIik7XG4gICAgfVxuICB9XG4gIHJldHVybiB7XG4gICAgcHJvcHM6IFtjcmVhdGVPYmplY3RQcm9wZXJ0eShhcmcsIGV4cCldXG4gIH07XG59O1xuY29uc3QgdHJhbnNmb3JtQmluZFNob3J0aGFuZCA9IChkaXIsIGNvbnRleHQpID0+IHtcbiAgY29uc3QgYXJnID0gZGlyLmFyZztcbiAgY29uc3QgcHJvcE5hbWUgPSBjYW1lbGl6ZShhcmcuY29udGVudCk7XG4gIGRpci5leHAgPSBjcmVhdGVTaW1wbGVFeHByZXNzaW9uKHByb3BOYW1lLCBmYWxzZSwgYXJnLmxvYyk7XG59O1xuY29uc3QgaW5qZWN0UHJlZml4ID0gKGFyZywgcHJlZml4KSA9PiB7XG4gIGlmIChhcmcudHlwZSA9PT0gNCkge1xuICAgIGlmIChhcmcuaXNTdGF0aWMpIHtcbiAgICAgIGFyZy5jb250ZW50ID0gcHJlZml4ICsgYXJnLmNvbnRlbnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFyZy5jb250ZW50ID0gYFxcYCR7cHJlZml4fVxcJHske2FyZy5jb250ZW50fX1cXGBgO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBhcmcuY2hpbGRyZW4udW5zaGlmdChgJyR7cHJlZml4fScgKyAoYCk7XG4gICAgYXJnLmNoaWxkcmVuLnB1c2goYClgKTtcbiAgfVxufTtcblxuY29uc3QgdHJhbnNmb3JtRm9yID0gY3JlYXRlU3RydWN0dXJhbERpcmVjdGl2ZVRyYW5zZm9ybShcbiAgXCJmb3JcIixcbiAgKG5vZGUsIGRpciwgY29udGV4dCkgPT4ge1xuICAgIGNvbnN0IHsgaGVscGVyLCByZW1vdmVIZWxwZXIgfSA9IGNvbnRleHQ7XG4gICAgcmV0dXJuIHByb2Nlc3NGb3Iobm9kZSwgZGlyLCBjb250ZXh0LCAoZm9yTm9kZSkgPT4ge1xuICAgICAgY29uc3QgcmVuZGVyRXhwID0gY3JlYXRlQ2FsbEV4cHJlc3Npb24oaGVscGVyKFJFTkRFUl9MSVNUKSwgW1xuICAgICAgICBmb3JOb2RlLnNvdXJjZVxuICAgICAgXSk7XG4gICAgICBjb25zdCBpc1RlbXBsYXRlID0gaXNUZW1wbGF0ZU5vZGUobm9kZSk7XG4gICAgICBjb25zdCBtZW1vID0gZmluZERpcihub2RlLCBcIm1lbW9cIik7XG4gICAgICBjb25zdCBrZXlQcm9wID0gZmluZFByb3Aobm9kZSwgYGtleWAsIGZhbHNlLCB0cnVlKTtcbiAgICAgIGlmIChrZXlQcm9wICYmIGtleVByb3AudHlwZSA9PT0gNyAmJiAha2V5UHJvcC5leHApIHtcbiAgICAgICAgdHJhbnNmb3JtQmluZFNob3J0aGFuZChrZXlQcm9wKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGtleUV4cCA9IGtleVByb3AgJiYgKGtleVByb3AudHlwZSA9PT0gNiA/IGtleVByb3AudmFsdWUgPyBjcmVhdGVTaW1wbGVFeHByZXNzaW9uKGtleVByb3AudmFsdWUuY29udGVudCwgdHJ1ZSkgOiB2b2lkIDAgOiBrZXlQcm9wLmV4cCk7XG4gICAgICBjb25zdCBrZXlQcm9wZXJ0eSA9IGtleVByb3AgJiYga2V5RXhwID8gY3JlYXRlT2JqZWN0UHJvcGVydHkoYGtleWAsIGtleUV4cCkgOiBudWxsO1xuICAgICAgY29uc3QgaXNTdGFibGVGcmFnbWVudCA9IGZvck5vZGUuc291cmNlLnR5cGUgPT09IDQgJiYgZm9yTm9kZS5zb3VyY2UuY29uc3RUeXBlID4gMDtcbiAgICAgIGNvbnN0IGZyYWdtZW50RmxhZyA9IGlzU3RhYmxlRnJhZ21lbnQgPyA2NCA6IGtleVByb3AgPyAxMjggOiAyNTY7XG4gICAgICBmb3JOb2RlLmNvZGVnZW5Ob2RlID0gY3JlYXRlVk5vZGVDYWxsKFxuICAgICAgICBjb250ZXh0LFxuICAgICAgICBoZWxwZXIoRlJBR01FTlQpLFxuICAgICAgICB2b2lkIDAsXG4gICAgICAgIHJlbmRlckV4cCxcbiAgICAgICAgZnJhZ21lbnRGbGFnLFxuICAgICAgICB2b2lkIDAsXG4gICAgICAgIHZvaWQgMCxcbiAgICAgICAgdHJ1ZSxcbiAgICAgICAgIWlzU3RhYmxlRnJhZ21lbnQsXG4gICAgICAgIGZhbHNlLFxuICAgICAgICBub2RlLmxvY1xuICAgICAgKTtcbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGxldCBjaGlsZEJsb2NrO1xuICAgICAgICBjb25zdCB7IGNoaWxkcmVuIH0gPSBmb3JOb2RlO1xuICAgICAgICBpZiAoKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgZmFsc2UpICYmIGlzVGVtcGxhdGUpIHtcbiAgICAgICAgICBub2RlLmNoaWxkcmVuLnNvbWUoKGMpID0+IHtcbiAgICAgICAgICAgIGlmIChjLnR5cGUgPT09IDEpIHtcbiAgICAgICAgICAgICAgY29uc3Qga2V5ID0gZmluZFByb3AoYywgXCJrZXlcIik7XG4gICAgICAgICAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0Lm9uRXJyb3IoXG4gICAgICAgICAgICAgICAgICBjcmVhdGVDb21waWxlckVycm9yKFxuICAgICAgICAgICAgICAgICAgICAzMyxcbiAgICAgICAgICAgICAgICAgICAga2V5LmxvY1xuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgI
20578H1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZWVkRnJhZ21lbnRXcmFwcGVyID0gY2hpbGRyZW4ubGVuZ3RoICE9PSAxIHx8IGNoaWxkcmVuWzBdLnR5cGUgIT09IDE7XG4gICAgICAgIGNvbnN0IHNsb3RPdXRsZXQgPSBpc1Nsb3RPdXRsZXQobm9kZSkgPyBub2RlIDogaXNUZW1wbGF0ZSAmJiBub2RlLmNoaWxkcmVuLmxlbmd0aCA9PT0gMSAmJiBpc1Nsb3RPdXRsZXQobm9kZS5jaGlsZHJlblswXSkgPyBub2RlLmNoaWxkcmVuWzBdIDogbnVsbDtcbiAgICAgICAgaWYgKHNsb3RPdXRsZXQpIHtcbiAgICAgICAgICBjaGlsZEJsb2NrID0gc2xvdE91dGxldC5jb2RlZ2VuTm9kZTtcbiAgICAgICAgICBpZiAoaXNUZW1wbGF0ZSAmJiBrZXlQcm9wZXJ0eSkge1xuICAgICAgICAgICAgaW5qZWN0UHJvcChjaGlsZEJsb2NrLCBrZXlQcm9wZXJ0eSwgY29udGV4dCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKG5lZWRGcmFnbWVudFdyYXBwZXIpIHtcbiAgICAgICAgICBjaGlsZEJsb2NrID0gY3JlYXRlVk5vZGVDYWxsKFxuICAgICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICAgIGhlbHBlcihGUkFHTUVOVCksXG4gICAgICAgICAgICBrZXlQcm9wZXJ0eSA/IGNyZWF0ZU9iamVjdEV4cHJlc3Npb24oW2tleVByb3BlcnR5XSkgOiB2b2lkIDAsXG4gICAgICAgICAgICBub2RlLmNoaWxkcmVuLFxuICAgICAgICAgICAgNjQsXG4gICAgICAgICAgICB2b2lkIDAsXG4gICAgICAgICAgICB2b2lkIDAsXG4gICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgdm9pZCAwLFxuICAgICAgICAgICAgZmFsc2VcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNoaWxkQmxvY2sgPSBjaGlsZHJlblswXS5jb2RlZ2VuTm9kZTtcbiAgICAgICAgICBpZiAoaXNUZW1wbGF0ZSAmJiBrZXlQcm9wZXJ0eSkge1xuICAgICAgICAgICAgaW5qZWN0UHJvcChjaGlsZEJsb2NrLCBrZXlQcm9wZXJ0eSwgY29udGV4dCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChjaGlsZEJsb2NrLmlzQmxvY2sgIT09ICFpc1N0YWJsZUZyYWdtZW50KSB7XG4gICAgICAgICAgICBpZiAoY2hpbGRCbG9jay5pc0Jsb2NrKSB7XG4gICAgICAgICAgICAgIHJlbW92ZUhlbHBlcihPUEVOX0JMT0NLKTtcbiAgICAgICAgICAgICAgcmVtb3ZlSGVscGVyKFxuICAgICAgICAgICAgICAgIGdldFZOb2RlQmxvY2tIZWxwZXIoY29udGV4dC5pblNTUiwgY2hpbGRCbG9jay5pc0NvbXBvbmVudClcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJlbW92ZUhlbHBlcihcbiAgICAgICAgICAgICAgICBnZXRWTm9kZUhlbHBlcihjb250ZXh0LmluU1NSLCBjaGlsZEJsb2NrLmlzQ29tcG9uZW50KVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBjaGlsZEJsb2NrLmlzQmxvY2sgPSAhaXNTdGFibGVGcmFnbWVudDtcbiAgICAgICAgICBpZiAoY2hpbGRCbG9jay5pc0Jsb2NrKSB7XG4gICAgICAgICAgICBoZWxwZXIoT1BFTl9CTE9DSyk7XG4gICAgICAgICAgICBoZWxwZXIoZ2V0Vk5vZGVCbG9ja0hlbHBlcihjb250ZXh0LmluU1NSLCBjaGlsZEJsb2NrLmlzQ29tcG9uZW50KSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGhlbHBlcihnZXRWTm9kZUhlbHBlcihjb250ZXh0LmluU1NSLCBjaGlsZEJsb2NrLmlzQ29tcG9uZW50KSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChtZW1vKSB7XG4gICAgICAgICAgY29uc3QgbG9vcCA9IGNyZWF0ZUZ1bmN0aW9uRXhwcmVzc2lvbihcbiAgICAgICAgICAgIGNyZWF0ZUZvckxvb3BQYXJhbXMoZm9yTm9kZS5wYXJzZVJlc3VsdCwgW1xuICAgICAgICAgICAgICBjcmVhdGVTaW1wbGVFeHByZXNzaW9uKGBfY2FjaGVkYClcbiAgICAgICAgICAgIF0pXG4gICAgICAgICAgKTtcbiAgICAgICAgICBsb29wLmJvZHkgPSBjcmVhdGVCbG9ja1N0YXRlbWVudChbXG4gICAgICAgICAgICBjcmVhdGVDb21wb3VuZEV4cHJlc3Npb24oW2Bjb25zdCBfbWVtbyA9IChgLCBtZW1vLmV4cCwgYClgXSksXG4gICAgICAgICAgICBjcmVhdGVDb21wb3VuZEV4cHJlc3Npb24oW1xuICAgICAgICAgICAgICBgaWYgKF9jYWNoZWRgLFxuICAgICAgICAgICAgICAuLi5rZXlFeHAgPyBbYCAmJiBfY2FjaGVkLmtleSA9PT0gYCwga2V5RXhwXSA6IFtdLFxuICAgICAgICAgICAgICBgICYmICR7Y29udGV4dC5oZWxwZXJTdHJpbmcoXG4gICAgICAgICAgICAgICAgSVNfTUVNT19TQU1FXG4gICAgICAgICAgICAgICl9KF9jYWNoZWQsIF9tZW1vKSkgcmV0dXJuIF9jYWNoZWRgXG4gICAgICAgICAgICBdKSxcbiAgICAgICAgICAgIGNyZWF0ZUNvbXBvdW5kRXhwcmVzc2lvbihbYGNvbnN0IF9pdGVtID0gYCwgY2hpbGRCbG9ja10pLFxuICAgICAgICAgICAgY3JlYXRlU2ltcGxlRXhwcmVzc2lvbihgX2l0ZW0ubWVtbyA9IF9tZW1vYCksXG4gICAgICAgICAgICBjcmVhdGVTaW1wbGVFeHByZXNzaW9uKGByZXR1cm4gX2l0ZW1gKVxuICAgICAgICAgIF0pO1xuICAgICAgICAgIHJlbmRlckV4cC5hcmd1bWVudHMucHVzaChcbiAgICAgICAgICAgIGxvb3AsXG4gICAgICAgICAgICBjcmVhdGVTaW1wbGVFeHByZXNzaW9uKGBfY2FjaGVgKSxcbiAgICAgICAgICAgIGNyZWF0ZVNpbXBsZUV4cHJlc3Npb24oU3RyaW5nKGNvbnRleHQuY2FjaGVkKyspKVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVuZGVyRXhwLmFyZ3VtZW50cy5wdXNoKFxuICAgICAgICAgICAgY3JlYXRlRnVuY3Rpb25FeHByZXNzaW9uKFxuICAgICAgICAgICAgICBjcmVhdGVGb3JMb29wUGFyYW1zKGZvck5vZGUucGFyc2VSZXN1bHQpLFxuICAgICAgICAgICAgICBjaGlsZEJsb2NrLFxuICAgICAgICAgICAgICB0cnVlXG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuKTtcbmZ1bmN0aW9uIHByb2Nlc3NGb3Iobm9kZSwgZGlyLCBjb250ZXh0LCBwcm9jZXNzQ29kZWdlbikge1xuICBpZiAoIWRpci5leHApIHtcbiAgICBjb250ZXh0Lm9uRXJyb3IoXG4gICAgICBjcmVhdGVDb21waWxlckVycm9yKDMxLCBkaXIubG9jKVxuICAgICk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHBhcnNlUmVzdWx0ID0gZGlyLmZvclBhcnNlUmVzdWx0O1xuICBpZiAoIXBhcnNlUmVzdWx0KSB7XG4gICAgY29udGV4dC5vbkVycm9yKFxuICAgICAgY3JlYXRlQ29tcGlsZXJFcnJvcigzMiwgZGlyLmxvYylcbiAgICApO
205781xuICAgIHJldHVybjtcbiAgfVxuICBmaW5hbGl6ZUZvclBhcnNlUmVzdWx0KHBhcnNlUmVzdWx0LCBjb250ZXh0KTtcbiAgY29uc3QgeyBhZGRJZGVudGlmaWVycywgcmVtb3ZlSWRlbnRpZmllcnMsIHNjb3BlcyB9ID0gY29udGV4dDtcbiAgY29uc3QgeyBzb3VyY2UsIHZhbHVlLCBrZXksIGluZGV4IH0gPSBwYXJzZVJlc3VsdDtcbiAgY29uc3QgZm9yTm9kZSA9IHtcbiAgICB0eXBlOiAxMSxcbiAgICBsb2M6IGRpci5sb2MsXG4gICAgc291cmNlLFxuICAgIHZhbHVlQWxpYXM6IHZhbHVlLFxuICAgIGtleUFsaWFzOiBrZXksXG4gICAgb2JqZWN0SW5kZXhBbGlhczogaW5kZXgsXG4gICAgcGFyc2VSZXN1bHQsXG4gICAgY2hpbGRyZW46IGlzVGVtcGxhdGVOb2RlKG5vZGUpID8gbm9kZS5jaGlsZHJlbiA6IFtub2RlXVxuICB9O1xuICBjb250ZXh0LnJlcGxhY2VOb2RlKGZvck5vZGUpO1xuICBzY29wZXMudkZvcisrO1xuICBjb25zdCBvbkV4aXQgPSBwcm9jZXNzQ29kZWdlbiAmJiBwcm9jZXNzQ29kZWdlbihmb3JOb2RlKTtcbiAgcmV0dXJuICgpID0+IHtcbiAgICBzY29wZXMudkZvci0tO1xuICAgIGlmIChvbkV4aXQpIG9uRXhpdCgpO1xuICB9O1xufVxuZnVuY3Rpb24gZmluYWxpemVGb3JQYXJzZVJlc3VsdChyZXN1bHQsIGNvbnRleHQpIHtcbiAgaWYgKHJlc3VsdC5maW5hbGl6ZWQpIHJldHVybjtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgdHJ1ZSkge1xuICAgIHZhbGlkYXRlQnJvd3NlckV4cHJlc3Npb24ocmVzdWx0LnNvdXJjZSwgY29udGV4dCk7XG4gICAgaWYgKHJlc3VsdC5rZXkpIHtcbiAgICAgIHZhbGlkYXRlQnJvd3NlckV4cHJl
20578c3Npb24oXG4gICAgICAgIHJlc3VsdC5rZXksXG4gICAgICAgIGNvbnRleHQsXG4gICAgICAgIHRydWVcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChyZXN1bHQuaW5kZXgpIHtcbiAgICAgIHZhbGlkYXRlQnJvd3NlckV4cHJlc3Npb24oXG4gICAgICAgIHJlc3VsdC5pbmRleCxcbiAgICAgICAgY29udGV4dCxcbiAgICAgICAgdHJ1ZVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHJlc3VsdC52YWx1ZSkge1xuICAgICAgdmFsaWRhdGVCcm93c2VyRXhwcmVzc2lvbihcbiAgICAgICAgcmVzdWx0LnZhbHVlLFxuICAgICAgICBjb250ZXh0LFxuICAgICAgICB0cnVlXG4gICAgICApO1xuICAgIH1cbiAgfVxuICByZXN1bHQuZmluYWxpemVkID0gdHJ1ZTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUZvckxvb3BQYXJhbXMoeyB2YWx1ZSwga2V5LCBpbmRleCB9LCBtZW1vQXJncyA9IFtdKSB7XG4gIHJldHVybiBjcmVhdGVQYXJhbXNMaXN0KFt2YWx1ZSwga2V5LCBpbmRleCwgLi4ubWVtb0FyZ3NdKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVBhcmFtc0xpc3QoYXJncykge1xuICBsZXQgaSA9IGFyZ3MubGVuZ3RoO1xuICB3aGlsZSAoaS0tKSB7XG4gICAgaWYgKGFyZ3NbaV0pIGJyZWFrO1xuICB9XG4gIHJldHVybiBhcmdzLnNsaWNlKDAsIGkgKyAxKS5tYXAoKGFyZywgaTIpID0+IGFyZyB8fCBjcmVhdGVTaW1wbGVFeHByZXNzaW9uKGBfYC5yZXBlYXQoaTIgKyAxKSwgZmFsc2UpKTtcbn1cblxuY29uc3QgZGVmYXVsdEZhbGxiYWNrID0gY3JlYXRlU2ltcGxlRXhwcmVzc2lvbihgdW5kZWZpbmVkYCwgZmFsc2UpO1xuY29uc3QgdHJhY2tTbG90U2NvcGVzID0gKG5vZGUsIGNvbnRleHQpID0+IHtcbiAgaWYgKG5vZGUudHlwZSA9PT0gMSAmJiAobm9kZS50YWdUeXBlID09PSAxIHx8IG5vZGUudGFnVHlwZSA9PT0gMykpIHtcbiAgICBjb25zdCB2U2xvdCA9IGZpbmREaXIobm9kZSwgXCJzbG90XCIpO1xuICAgIGlmICh2U2xvdCkge1xuICAgICAgdlNsb3QuZXhwO1xuICAgICAgY29udGV4dC5zY29wZXMudlNsb3QrKztcbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGNvbnRleHQuc2NvcGVzLnZTbG90LS07XG4gICAgICB9O1xuICAgIH1cbiAgfVxufTtcbmNvbnN0IHRyYWNrVkZvclNsb3RTY29wZXMgPSAobm9kZSwgY29udGV4dCkgPT4ge1xuICBsZXQgdkZvcjtcbiAgaWYgKGlzVGVtcGxhdGVOb2RlKG5vZGUpICYmIG5vZGUucHJvcHMuc29tZShpc1ZTbG90KSAmJiAodkZvciA9IGZpbmREaXIobm9kZSwgXCJmb3JcIikpKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gdkZvci5mb3JQYXJzZVJlc3VsdDtcbiAgICBpZiAocmVzdWx0KSB7XG4gICAgICBmaW5hbGl6ZUZvclBhcnNlUmVzdWx0KHJlc3VsdCwgY29udGV4dCk7XG4gICAgICBjb25zdCB7IHZhbHVlLCBrZXksIGluZGV4IH0gPSByZXN1bHQ7XG4gICAgICBjb25zdCB7IGFkZElkZW50aWZpZXJzLCByZW1vdmVJZGVudGlmaWVycyB9ID0gY29udGV4dDtcbiAgICAgIHZhbHVlICYmIGFkZElkZW50aWZpZXJzKHZhbHVlKTtcbiAgICAgIGtleSAmJiBhZGRJZGVudGlmaWVycyhrZXkpO1xuICAgICAgaW5kZXggJiYgYWRkSWRlbnRpZmllcnMoaW5kZXgpO1xuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgdmFsdWUgJiYgcmVtb3ZlSWRlbnRpZmllcnModmFsdWUpO1xuICAgICAgICBrZXkgJiYgcmVtb3ZlSWRlbnRpZmllcnMoa2V5KTtcbiAgICAgICAgaW5kZXggJiYgcmVtb3ZlSWRlbnRpZmllcnMoaW5kZXgpO1xuICAgICAgfTtcbiAgICB9XG4gIH1cbn07XG5jb25zdCBidWlsZENsaWVudFNsb3RGbiA9IChwcm9wcywgX3ZGb3JFeHAsIGNoaWxkcmVuLCBsb2MpID0+IGNyZWF0ZUZ1bmN0aW9uRXhwcmVzc2lvbihcbiAgcHJvcHMsXG4gIGNoaWxkcmVuLFxuICBmYWxzZSxcbiAgdHJ1ZSxcbiAgY2hpbGRyZW4ubGVuZ3RoID8gY2hpbGRyZW5bMF0ubG9jIDogbG9jXG4pO1xuZnVuY3Rpb24gYnVpbGRTbG90cyhub2RlLCBjb250ZXh0LCBidWlsZFNsb3RGbiA9IGJ1aWxkQ2xpZW50U2xvdEZuKSB7XG4gIGNvbnRleHQuaGVscGVyKFdJVEhfQ1RYKTtcbiAgY29uc3QgeyBjaGlsZHJlbiwgbG9jIH0gPSBub2RlO1xuICBjb25zdCBzbG90c1Byb3BlcnRpZXMgPSBbXTtcbiAgY29uc3QgZHluYW1pY1Nsb3RzID0gW107XG4gIGxldCBoYXNEeW5hbWljU2xvdHMgPSBjb250ZXh0LnNjb3Blcy52U2xvdCA+IDAgfHwgY29udGV4dC5zY29wZXMudkZvciA+IDA7XG4gIGNvbnN0IG9uQ29tcG9uZW50U2xvdCA9IGZpbmREaXIobm9kZSwgXCJzbG90XCIsIHRydWUpO1xuICBpZiAob25Db21wb25lbnRTbG90KSB7XG4gICAgY29uc3QgeyBhcmcsIGV4cCB9ID0gb25Db21wb25lbnRTbG90O1xuICAgIGlmIChhcmcgJiYgIWlzU3RhdGljRXhwKGFyZykpIHtcbiAgICAgIGhhc0R5bmFtaWNTbG90cyA9IHRydWU7XG4gICAgfVxuICAgIHNsb3RzUHJvcGVydGllcy5wdXNoKFxuICAgICAgY3JlYXRlT2JqZWN0UHJvcGVydHkoXG4gICAgICAgIGFyZyB8fCBjcmVhdGVTaW1wbGVFeHByZXNzaW9uKFwiZGVmYXVsdFwiLCB0cnVlKSxcbiAgICAgICAgYnVpbGRTbG90Rm4oZXhwLCB2b2lkIDAsIGNo
20578aWxkcmVuLCBsb2MpXG4gICAgICApXG4gICAgKTtcbiAgfVxuICBsZXQgaGFzVGVtcGxhdGVTbG90cyA9IGZhbHNlO1xuICBsZXQgaGFzTmFtZWREZWZhdWx0U2xvdCA9IGZhbHNlO1xuICBjb25zdCBpbXBsaWNpdERlZmF1bHRDaGlsZHJlbiA9IFtdO1xuICBjb25zdCBzZWVuU2xvdE5hbWVzID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTtcbiAgbGV0IGNvbmRpdGlvbmFsQnJhbmNoSW5kZXggPSAwO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3Qgc2xvdEVsZW1lbnQgPSBjaGlsZHJlbltpXTtcbiAgICBsZXQgc2xvdERpcjtcbiAgICBpZiAoIWlzVGVtcGxhdGVOb2RlKHNsb3RFbGVtZW50KSB8fCAhKHNsb3REaXIgPSBmaW5kRGlyKHNsb3RFbGVtZW50LCBcInNsb3RcIiwgdHJ1ZSkpKSB7XG4gICAgICBpZiAoc2xvdEVsZW1lbnQudHlwZSAhPT0gMykge1xuICAgICAgICBpbXBsaWNpdERlZmF1bHRDaGlsZHJlbi5wdXNoKHNsb3RFbGVtZW50KTtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAob25Db21wb25lbnRTbG90KSB7XG4gICAgICBjb250ZXh0Lm9uRXJyb3IoXG4gICAgICAgIGNyZWF0ZUNvbXBpbGVyRXJyb3IoMzcsIHNsb3REaXIubG9jKVxuICAgICAgKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBoYXNUZW1wbGF0ZVNsb3RzID0gdHJ1ZTtcbiAgICBjb25zdCB7IGNoaWxkcmVuOiBzbG90Q2hpbGRyZW4sIGxvYzogc2xvdExvYyB9ID0gc2xvdEVsZW1lbnQ7XG4gICAgY29uc3Qge1xuICAgICAgYXJnOiBzbG90TmFtZSA9IGNyZWF0ZVNpbXBsZUV4cHJlc3Npb24oYGRlZmF1bHRgLCB0cnVlKSxcbiAgICAgIGV4cDogc2xvdFByb3BzLFxuICAgICAgbG9jOiBkaXJMb2NcbiAgICB9ID0gc2xvdERpcjtcbiAgICBsZXQgc3RhdGljU2xvdE5hbWU7XG4gICAgaWYgKGlzU3RhdGljRXhwKHNsb3ROYW1lKSkge1xuICAgICAgc3RhdGljU2xvdE5hbWUgPSBzbG90TmFtZSA/IHNsb3ROYW1lLmNvbnRlbnQgOiBgZGVmYXVsdGA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGhhc0R5bmFtaWNTbG90cyA9IHRydWU7XG4gICAgfVxuICAgIGNvbnN0IHZGb3IgPSBmaW5kRGlyKHNsb3RFbGVtZW50LCBcImZvclwiKTtcbiAgICBjb25zdCBzbG90RnVuY3Rpb24gPSBidWlsZFNsb3RGbihzbG90UHJvcHMsIHZGb3IsIHNsb3RDaGlsZHJlbiwgc2xvdExvYyk7XG4gICAgbGV0IHZJZjtcbiAgICBsZXQgdkVsc2U7XG4gICAgaWYgKHZJZiA9IGZpbmREaXIoc2xvdEVsZW1lbnQsIFwiaWZcIikpIHtcbiAgICAgIGhhc0R5bmFtaWNTbG90cyA9IHRydWU7XG4gICAgICBkeW5hbWljU2xvdHMucHVzaChcbiAgICAgICAgY3JlYXRlQ29uZGl0aW9uYWxFeHByZXNzaW9uKFxuICAgICAgICAgIHZJZi5leHAsXG4gICAgICAgICAgYnVpbGREeW5hbWljU2xvdChzbG90TmFtZSwgc2xvdEZ1bmN0aW9uLCBjb25kaXRpb25hbEJyYW5jaEluZGV4KyspL
20578FxuICAgICAgICAgIGRlZmF1bHRGYWxsYmFja1xuICAgICAgICApXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAodkVsc2UgPSBmaW5kRGlyKFxuICAgICAgc2xvdEVsZW1lbnQsXG4gICAgICAvXmVsc2UoLWlmKT8kLyxcbiAgICAgIHRydWVcbiAgICAgIC8qIGFsbG93RW1wdHkgKi9cbiAgICApKSB7XG4gICAgICBsZXQgaiA9IGk7XG4gICAgICBsZXQgcHJldjtcbiAgICAgIHdoaWxlIChqLS0pIHtcbiAgICAgICAgcHJldiA9IGNoaWxkcmVuW2pdO1xuICAgICAgICBpZiAocHJldi50eXBlICE9PSAzKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChwcmV2ICYmIGlzVGVtcGxhdGVOb2RlKHByZXYpICYmIGZpbmREaXIocHJldiwgL14oZWxzZS0pP2lmJC8pKSB7XG4gICAgICAgIGxldCBjb25kaXRpb25hbCA9IGR5bmFtaWNTbG90c1tkeW5hbWljU2xvdHMubGVuZ3RoIC0gMV07XG4gICAgICAgIHdoaWxlIChjb25kaXRpb25hbC5hbHRlcm5hdGUudHlwZSA9PT0gMTkpIHtcbiAgICAgICAgICBjb25kaXRpb25hbCA9IGNvbmRpdGlvbmFsLmFsdGVybmF0ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25kaXRpb25hbC5hbHRlcm5hdGUgPSB2RWxzZS5leHAgPyBjcmVhdGVDb25kaXRpb25hbEV4cHJlc3Npb24oXG4gICAgICAgICAgdkVsc2UuZXhwLFxuICAgICAgICAgIGJ1aWxkRHluYW1pY1Nsb3QoXG4gICAgICAgICAgICBzbG90TmFtZSxcbiAgICAgICAgICAgIHNsb3RGdW5jdGlvbixcbiAgICAgICAgICAgIGNvbmRpdGlvbmFsQnJhbmNoSW5kZXgrK1xuICAgICAgICAgICksXG4gICAgICAgICAgZGVmYXVsdEZhbGxiYWNrXG4gICAgICAgICkgOiBidWlsZER5bmFtaWNTbG90KHNsb3ROYW1lLCBzbG90RnVuY3Rpb24sIGNvbmRpdGlvbmFsQnJhbmNoSW5kZXgrKyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb250ZXh0Lm9uRXJyb3IoXG4gICAgICAgICAgY3JlYXRlQ29tcGlsZXJFcnJvcigzMCwgdkVsc2UubG9jKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodkZvcikge1xuICAgICAgaGFzRHluYW1pY1Nsb3RzID0gdHJ1ZTtcbiAgICAgIGNvbnN0IHBhcnNlUmVzdWx0ID0gdkZvci5mb3JQYXJzZVJlc3VsdDtcbiAgICAgIGlmIChwYXJzZVJlc3VsdCkge1xuICAgICAgICBmaW5hbGl6ZUZvclBhcnNlUmVzdWx0KHBhcnNlUmVzdWx0LCBjb250ZXh0KTtcbiAgICAgICAgZHluYW1pY1Nsb3RzLnB1c2goXG4gICAgICAgICAgY3JlYXRlQ2FsbEV4cHJlc3Npb24oY29udGV4dC5oZWxwZXIoUkVOREVSX0xJU1QpLCBbXG4gICAgICAgICAgICBwYXJzZVJlc3VsdC5zb3VyY2UsXG4gICAgICAgICAgICBjcmVhdGVGdW5jdGlvbkV4cHJlc3Npb24oXG4gICAgICAgICAgICAgIGNyZWF0ZUZvckxvb3BQYXJhbXMocGFyc2VSZXN1bHQpLFxuICAgICAgICAgICAgICBidWlsZER5bmFtaWNTbG90KHNsb3ROYW1lLCBzbG90RnVuY3Rpb24pLFxuICAgICAgICAgICAgICB0cnVlXG4gICAgICAgICAgICApXG4gICAgICAgICAgXSlcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnRleHQub25FcnJvcihcbiAgICAgICAgICBjcmVhdGVDb21waWxlckVycm9yKFxuICAgICAgICAgICAgMzIsXG4gICAgICAgICAgICB2Rm9yLmxvY1xuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHN0YXRpY1Nsb3ROYW1lKSB7XG4gICAgICAgIGlmIChzZWVuU2xvdE5hbWVzLmhhcyhzdGF0aWNTbG90TmFtZSkpIHtcbiAgICAgICAgICBjb250ZXh0Lm9uRXJyb3IoXG4gICAgICAgICAgICBjcmVhdGVDb21waWxlckVycm9yKFxuICAgICAgICAgICAgICAzOCxcbiAgICAgICAgICAgICAgZGlyTG9jXG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBzZWVuU2xvdE5hbWVzLmFkZChzdGF0aWNTbG90TmFtZSk7XG4gICAgICAgIGlmIChzdGF0aWNTbG90TmFtZSA9PT0gXCJkZWZhdWx0XCIpIHtcbiAgICAgICAgICBoYXNOYW1lZERlZmF1bHRTbG90ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgc2xvdHNQcm9wZXJ0aWVzLnB1c2goY3JlYXRlT2JqZWN0UHJvcGVydHkoc2xvdE5hbWUsIHNsb3RGdW5jdGlvbikpO1xuICAgIH1cbiAgfVxuICBpZiAoIW9uQ29tcG9uZW50U2xvdCkge1xuICAgIGNvbnN0IGJ1aWxkRGVmYXVsdFNsb3RQcm9wZXJ0eSA9IChwcm9wcywgY2hpbGRyZW4yKSA9PiB7XG4gICAgICBjb25zdCBmbiA9IGJ1aWxkU2xvdEZuKHByb3BzLCB2b2lkIDAsIGNo
20578aWxkcmVuMiwgbG9jKTtcbiAgICAgIGlmIChjb250ZXh0LmNvbXBhdENvbmZpZykge1xuICAgICAgICBmbi5pc05vblNjb3BlZFNsb3QgPSB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNyZWF0ZU9iamVjdFByb3BlcnR5KGBkZWZhdWx0YCwgZm4pO1xuICAgIH07XG4gICAgaWYgKCFoYXNUZW1wbGF0ZVNsb3RzKSB7XG4gICAgICBzbG90c1Byb3BlcnRpZXMucHVzaChidWlsZERlZmF1bHRTbG90UHJvcGVydHkodm9pZCAwLCBjaGlsZHJlbikpO1xuICAgIH0gZWxzZSBpZiAoaW1wbGljaXREZWZhdWx0Q2hpbGRyZW4ubGVuZ3RoICYmIC8vICMzNzY2XG4gICAgLy8gd2l0aCB3aGl0ZXNwYWNlOiAncHJlc2VydmUnLCB3aGl0ZXNwYWNlcyBiZXR3ZWVuIHNsb3RzIHdpbGwgZW5kIHVwIGluXG4gICAgLy8gaW1wbGljaXREZWZhdWx0Q2hpbGRyZW4uIElnbm9yZSBpZiBhbGwgaW1wbGljaXQgY2hpbGRyZW4gYXJlIHdoaXRlc3BhY2VzLlxuICAgIGltcGxpY2l0RGVmYXVsdENoaWxkcmVuLnNvbWUoKG5vZGUyKSA9PiBpc05vbldoaXRlc3BhY2VDb250ZW50KG5vZGUyKSkpIHtcbiAgICAgIGlmIChoYXNOYW1lZERlZmF1bHRTbG90KSB7XG4gICAgICAgIGNvbnRleHQub25FcnJvcihcbiAgICAgICAgICBjcmVhdGVDb21waWxlckVycm9yKFxuICAgICAgICAgICAgMzksXG4gICAgICAgICAgICBpbXBsaWNpdERlZmF1bHRDaGlsZHJlblswXS5sb2NcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzbG90c1Byb3BlcnRpZXMucHVzaChcbiAgICAgICAgICBidWlsZERlZmF1bHRTbG90UHJvcGVydHkodm9pZCAwLCBpbXBsaWNpdERlZmF1bHRDaGlsZHJlbilcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgY29uc3Qgc2xvdEZsYWcgPSBoYXNEeW5hbWljU2xvdHMgPyAyIDogaGFzRm9yd2FyZGVkU2xvdHMobm9kZS5jaGlsZHJlbikgPyAzIDogMTtcbiAgbGV0IHNsb3RzID0gY3JlYXRlT2JqZWN0RXhwcmVzc2lvbihcbiAgICBzbG90c1Byb3BlcnRpZXMuY29uY2F0KFxuICAgICAgY3JlYXRlT2JqZWN0UHJvcGVydHkoXG4gICAgICAgIGBfYCxcbiAgICAgICAgLy8gMiA9IGNvbXBpbGVkIGJ1dCBkeW5hbWljID0gY2FuIHNraXAgbm9ybWFsaXphdGlvbiwgYnV0IG11c3QgcnVuIGRpZmZcbiAgICAgICAgLy8gMSA9IGNvbXBpbGVkIGFuZCBzdGF0aWMgPSBjYW4gc2tpcCBub3JtYWxpemF0aW9uIEFORCBkaWZmIGFzIG9wdGltaXplZFxuICAgICAgICBjcmVhdGVTaW1wbGVFeHByZXNzaW9uKFxuICAgICAgICAgIHNsb3RGbGFnICsgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBgIC8qICR7c2xvdEZsYWdzVGV4dFtzbG90RmxhZ119ICovYCA6IGBgKSxcbiAgICAgICAgICBmYWxzZVxuICAgICAgICApXG4gICAgICApXG4gICAgKSxcbiAgICBsb2NcbiAgKTtcbiAgaWYgKGR5bmFtaWNTbG90cy5sZW5ndGgpIHtcbiAgICBzbG90cyA9IGNyZWF0ZUNhbGxFeHByZXNzaW9uKGNvbnRleHQuaGVscGVyKENSRUFURV9TTE9UUyksIFtcbiAgICAgIHNsb3RzLFxuICAgICAgY3JlYXRlQXJyYXlFeHByZXNzaW9uKGR5bmFtaWNTbG90cylcbiAgICBdKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIHNsb3RzLFxuICAgIGhhc0R5bmFtaWNTbG90c1xuICB9O1xufVxuZnVuY3Rpb24gYnVpbGREeW5hbWljU2xvdChuYW1lLCBmbiwgaW5kZXgpIHtcbiAgY29uc3QgcHJvcHMgPSBbXG4gICAgY3JlYXRlT2JqZWN0UHJvcGVydHkoYG5hbWVgLCBuYW1lKSxcbiAgICBjcmVhdGVPYmplY3RQcm9wZXJ0eShgZm5gLCBmbilcbiAgXTtcbiAgaWYgKGluZGV4ICE9IG51bGwpIHtcbiAgICBwcm9wcy5wdXNoKFxuICAgICAgY3JlYXRlT2JqZWN0UHJvcGVydHkoYGtleWAsIGNyZWF0ZVNpbXBsZUV4cHJlc3Npb24oU3RyaW5nKGluZGV4KSwgdHJ1ZSkpXG4gICAgKTtcbiAgfVxuICByZXR1cm4gY3JlYXRlT2JqZWN0RXhwcmVzc2lvbihwcm9wcyk7XG59XG5mdW5jdGlvbiBoYXNGb3J3YXJkZWRTbG90cyhjaGlsZHJlbikge1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgY2hpbGQgPSBjaGlsZHJlbltpXTtcbiAgICBzd2l0Y2ggKGNoaWxkLnR5cGUpIHtcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgaWYgKGNoaWxkLnRhZ1R5cGUgPT09IDIgfHwgaGFzRm9yd2FyZGVkU2xvdHMoY2hpbGQuY2hpbGRyZW4pKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDk6XG4gICAgICAgIGlmIChoYXNGb3J3YXJkZWRTbG90cyhjaGlsZC5icmFuY2hlcykpIHJldHVybiB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMTA6XG4gICAgICBjYXNlIDExOlxuICAgICAgICBpZiAoaGFzRm9yd2FyZGVkU2xvdHMoY2hpbGQuY2hpbGRyZW4pKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGlzTm9uV2hpdGVzcGFjZUNvbnRlbnQobm9kZSkge1xuICBpZiAobm9kZS50eXBlICE9PSAyICYmIG5vZGUudHlwZSAhPT0gMTIpXG4gICAgcmV0dXJuIHRydWU7XG4gIHJldHVybiBub2RlLnR5cGUgPT09IDIgPyAhIW5vZGUuY29udGVudC50cmltKCkgOiBpc05vbldoaXRlc3BhY2VDb250ZW50KG5vZGUuY29udGVudCk7XG59XG5cbmNvbnN0IGRpcmVjdGl2ZUltcG9ydE1hcCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpO1xuY29uc3QgdHJhbnNmb3JtRWxlbWVudCA9IChub2RlLCBjb250ZXh0KSA9PiB7XG4gIHJldHVybiBmdW5jdGlvbiBwb3N0VHJhbnNmb3JtRWxlbWVudCgpIHtcbiAgICBub2RlID0gY29udGV4dC5jdXJyZW50Tm9kZTtcbiAgICBpZiAoIShub2RlLnR5cGUgPT09IDEgJiYgKG5vZGUudGFnVHlwZSA9PT0gMCB8fCBub2RlLnRhZ1R5cGUgPT09IDEpKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB7IHRhZywgcHJvcHMgfSA9IG5vZGU7XG4gICAgY29uc3QgaXNDb21wb25lbnQgPSBub2RlLnRhZ1R5cGUgPT09IDE7XG4gICAgbGV0IHZub2RlVGFnID0gaXNDb21wb25lbnQgPyByZXNvbHZlQ29tcG9uZW50VHlwZShub2RlLCBjb250ZXh0KSA6IGBcIiR7dGFnfVwiYDtcbiAgICBjb25zdCBpc0R5bmFtaWNDb21wb25lbnQgPSBpc09iamVjdCh2bm9kZVRhZykgJiYgdm5vZGVUYWcuY2FsbGVlID09PSBSRVNPTFZFX0RZTkFNSUNfQ09NUE9ORU5UO1xuICAgIGxldCB2bm9kZVByb3BzO1xuICAgIGxldCB2bm9kZUNoaWxkcmVuO1xuICAgIGxldCBwYXRjaEZsYWcgPSAwO1xuICAgIGxldCB2bm9kZUR5bmFtaWNQcm9wcztcbiAgICBsZXQgZHluYW1pY1Byb3BOYW1lcztcbiAgICBsZXQgdm5vZGVEaXJlY3RpdmVzO1xuICAgIGxldCBzaG91bGRVc2VCbG9jayA9IChcbiAgICAgIC8vIGR5bmFtaWMgY29tcG9uZW50IG1heSByZXNvbHZlIHRvIHBsYWluIGVsZW1lbnRzXG4gICAgICBpc0R5bmFtaWNDb21wb25lbnQgfHwgdm5vZGVUYWcgPT09IFRFTEVQT1J
20578UIHx8IHZub2RlVGFnID09PSBTVVNQRU5TRSB8fCAhaXNDb21wb25lbnQgJiYgLy8gPHN2Zz4gYW5kIDxmb3JlaWduT2JqZWN0PiBtdXN0IGJlIGZvcmNlZCBpbnRvIGJsb2NrcyBzbyB0aGF0IGJsb2NrXG4gICAgICAvLyB1cGRhdGVzIGluc2lkZSBnZXQgcHJvcGVyIGlzU1ZHIGZsYWcgYXQgcnVudGltZS4gKCM2MzksICM2NDMpXG4gICAgICAvLyBUaGlzIGlzIHRlY2huaWNhbGx5IHdlYi1zcGVjaWZpYywgYnV0IHNwbGl0dGluZyB0aGUgbG9naWMgb3V0IG9mIGNvcmVcbiAgICAgIC8vIGxlYWRzIHRvIHRvbyBtdWNoIHVubmVjZXNzYXJ5IGNvbXBsZXhpdHkuXG4gICAgICAodGFnID09PSBcInN2Z1wiIHx8IHRhZyA9PT0gXCJmb3JlaWduT2JqZWN0XCIgfHwgdGFnID09PSBcIm1hdGhcIilcbiAgICApO1xuICAgIGlmIChwcm9wcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBwcm9wc0J1aWxkUmVzdWx0ID0gYnVpbGRQcm9wcyhcbiAgICAgICAgbm9kZSxcbiAgICAgICAgY29udGV4dCxcbiAgICAgICAgdm9pZCAwLFxuICAgICAgICBpc0NvbXBvbmVudCxcbiAgICAgICAgaXNEeW5hbWljQ29tcG9uZW50XG4gICAgICApO1xuICAgICAgdm5vZGVQcm9wcyA9IHByb3BzQnVpbGRSZXN1bHQucHJvcHM7XG4gICAgICBwYXRjaEZsYWcgPSBwcm9wc0J1aWxkUmVzdWx0LnBhdGNoRmxhZztcbiAgICAgIGR5bmFtaWNQcm9wTmFtZXMgPSBwcm9wc0J1aWxkUmVzdWx0LmR5bmFtaWNQcm9wTmFtZXM7XG4gICAgICBjb25zdCBkaXJlY3RpdmVzID0gcHJvcHNCdWlsZFJlc3VsdC5kaXJlY3RpdmVzO1xuICAgICAgdm5vZGVEaXJlY3RpdmVzID0gZGlyZWN0aXZlcyAmJiBkaXJlY3RpdmVzLmxlbmd0aCA/IGNyZWF0ZUFycmF5RXhwcmVzc2lvbihcbiAgICAgICAgZGlyZWN0aXZlcy5tYXAoKGRpcikgPT4gYnVpbGREaXJlY3RpdmVBcmdzKGRpciwgY29udGV4dCkpXG4gICAgICApIDogdm9pZCAwO1xuICAgICAgaWYgKHByb3BzQnVpbGRSZXN1bHQuc2hvdWxkVXNlQmxvY2spIHtcbiAgICAgICAgc2hvdWxkVXNlQmxvY2sgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAobm9kZS5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAodm5vZGVUYWcgPT09IEtFRVBfQUxJVkUpIHtcbiAgICAgICAgc2hvdWxkVXNlQmxvY2sgPSB0cnVlO1xuICAgICAgICBwYXRjaEZsYWcgfD0gMTAyNDtcbiAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgbm9kZS5jaGlsZHJlbi5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgY29udGV4dC5vbkVycm9yKFxuICAgICAgICAgICAgY3JlYXRlQ29tcGlsZXJFcnJvcig0Niwge1xuICAgICAgICAgICAgICBzdGFydDogbm9kZS5jaGlsZHJlblswXS5sb2Muc3RhcnQsXG4gICAgICAgICAgICAgIGVuZDogbm9kZS5jaGlsZHJlbltub2RlLmNoaWxkcmVuLmxlbmd0aCAtIDFdLmxvYy5lbmQsXG4gICAgICAgICAgICAgIHNvdXJjZTogXCJcIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCBzaG91bGRCdWlsZEFzU2xvdHMgPSBpc0NvbXBvbmVudCAmJiAvLyBUZWxlcG9ydCBpcyBub3QgYSByZWFsIGNvbXBvbmVudCBhbmQgaGFzIGRlZGljYXRlZCBydW50aW1lIGhhbmRsaW5nXG4gICAgICB2bm9kZVRhZyAhPT0gVEVMRVBPUlQgJiYgLy8gZXhwbGFpbmVkIGFib3ZlLlxuICAgICAgdm5vZGVUYWcgIT09IEtFRVBfQUxJVkU7XG4gICAgICBpZiAoc2hvdWxkQnVpbGRBc1Nsb3RzKSB7XG4gICAgICAgIGNvbnN0IHsgc2xvdHMsIGhhc0R5bmFtaWNTbG90cyB9ID0gYnVpbGRTbG90cyhub2RlLCBjb250ZXh0KTtcbiAgICAgICAgdm5vZGVDaGlsZHJlbiA9IHNsb3RzO1xuICAgICAgICBpZiAoaGFzRHluYW1pY1Nsb3RzKSB7XG4gICAgICAgICAgcGF0Y2hGbGFnIHw9IDEwMjQ7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAobm9kZS5jaGlsZHJlbi5sZW5ndGggPT09IDEgJiYgdm5vZGVUYWcgIT09IFRFTEVQT1JUKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkID0gbm9kZS5jaGlsZHJlblswXTtcbiAgICAgICAgY29uc3QgdHlwZSA9IGNoaWxkLnR5cGU7XG4gICAgICAgIGNvbnN0IGhhc0R5bmFtaWNUZXh0Q2hpbGQgPSB0eXBlID09PSA1IHx8IHR5cGUgPT09IDg7XG4gICAgICAgIGlmIChoYXNEeW5hbWljVGV4dENoaWxkICYmIGdldENvbnN0YW50VHlwZShjaGlsZCwgY29udGV4dCkgPT09IDApIHtcbiAgICAgICAgICBwYXRjaEZsYWcgfD0gMTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaGFzRHluYW1pY1RleHRDaGlsZCB8fCB0eXBlID09PSAyKSB7XG4gICAgICAgICAgdm5vZGVDaGlsZHJlbiA9IGNoaWxkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZub2RlQ2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2bm9kZUNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbjtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGR5bmFtaWNQcm9wTmFtZXMgJiYgZHluYW1pY1Byb3BOYW1lcy5sZW5ndGgpIHtcbiAgICAgIHZub2RlRHluYW1pY1Byb3BzID0gc3RyaW5naWZ5RHluYW1pY1Byb3BOYW1lcyhkeW5hbWljUHJvcE5hbWVzKTtcbiAgICB9XG4gICAgbm9kZS5jb2RlZ2VuTm9kZSA9IGNyZWF0ZVZOb2RlQ2FsbChcbiAgICAgIGNvbnRleHQsXG4gICAgICB2bm9kZVRhZyxcbiAgICAgIHZub2RlUHJvcHMsXG4gICAgICB2bm9kZUNoaWxkcmVuLFxuICAgICAgcGF0Y2hGbGFnID09PSAwID8gdm9pZCAwIDogcGF0Y2hGbGFnLFxuICAgICAgdm5vZGVEeW5hbWljUHJvcHMsXG4gICAgICB2bm9kZURpcmVjdGl2ZXMsXG4gICAgICAhIXNob3VsZFVzZUJsb2NrLFxuICAgICAgZmFsc2UsXG4gICAgICBpc0NvbXBvbmVudCxcbiAgICAgIG5vZGUubG9jXG4gICAgKTtcbiAgfTtcbn07XG5mdW5jdGlvbiByZXNvbHZlQ29tcG9uZW50VHlwZShub2RlLCBjb250ZXh0LCBzc3IgPSBmYWxzZSkge1xuICBsZXQgeyB0YWcgfSA9IG5vZGU7XG4gIGNvbnN0IGlzRXhwbGljaXREeW5hbWljID0gaXNDb21wb25lbnRUYWcodGFnKTtcbiAgY29uc3QgaXNQcm9wID0gZmluZFByb3AoXG4gICAgbm9kZSxcbiAgICBcImlzXCIsXG4gICAgZmFsc2UsXG4gICAgdHJ1ZVxuICAgIC8qIGFsbG93IGVtcHR5ICovXG4gICk7XG4gIGlmIChpc1Byb3ApIHtcbiAgICBpZiAoaXNFeHBsaWNpdER5bmFtaWMgfHwgaXNDb21wYXRFbmFibGVkKFxuICAgICAgXCJDT01QSUxFUl9JU19PTl9FTEVNRU5UXCIsXG4gICAgICBjb250ZXh0XG4gICAgKSkge1xuICAgICAgbGV0IGV4cDtcbiAgICAgIGlmIChpc1Byb3AudHlwZSA9PT0gNikge1xuICAgICAgICBleHAgPSBpc1Byb3AudmFsdWUgJiYgY3JlYXRlU2ltcGxlRXhwcmVzc2lvbihpc1Byb3AudmFsdWUuY29udGVudCwgdHJ1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBleHAgPSBpc1Byb3AuZXhwO1xuICAgICAgICBpZiAoIWV4cCkge1xuICAgICAgICAgIGV4cCA9IGNyZWF0ZVNpbXBsZUV4cHJlc3Npb24oYGlzYCwgZmFsc2UsIGlzUHJvcC5sb2MpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZXhwKSB7XG4gICAgICAgI
20578HJldHVybiBjcmVhdGVDYWxsRXhwcmVzc2lvbihjb250ZXh0LmhlbHBlcihSRVNPTFZFX0RZTkFNSUNfQ09NUE9ORU5UKSwgW1xuICAgICAgICAgIGV4cFxuICAgICAgICBdKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzUHJvcC50eXBlID09PSA2ICYmIGlzUHJvcC52YWx1ZS5jb250ZW50LnN0YXJ0c1dpdGgoXCJ2dWU6XCIpKSB7XG4gICAgICB0YWcgPSBpc1Byb3AudmFsdWUuY29udGVudC5zbGljZSg0KTtcbiAgICB9XG4gIH1cbiAgY29uc3QgYnVpbHRJbiA9IGlzQ29yZUNvbXBvbmVudCh0YWcpIHx8IGNvbnRleHQuaXNCdWlsdEluQ29tcG9uZW50KHRhZyk7XG4gIGlmIChidWlsdEluKSB7XG4gICAgaWYgKCFzc3IpIGNvbnRleHQuaGVscGVyKGJ1aWx0SW4pO1xuICAgIHJldHVybiBidWlsdEluO1xuICB9XG4gIGNvbnRleHQuaGVscGVyKFJFU09MVkVfQ09NUE9ORU5UKTtcbiAgY29udGV4dC5jb21wb25lbnRzLmFkZCh0YWcpO1xuICByZXR1cm4gdG9WYWxpZEFzc2V0SWQodGFnLCBgY29tcG9uZW50YCk7XG59XG5mdW5jdGlvbiBidWlsZFByb3BzKG5vZGUsIGNvbnRleHQsIHByb3BzID0gbm9kZS5wcm9wcywgaXNDb21wb25lbnQsIGlzRHluYW1pY0NvbXBvbmVudCwgc3NyID0gZmFsc2UpIHtcbiAgY29uc3QgeyB0YWcsIGxvYzogZWxlbWVudExvYywgY2hpbGRyZW4gfSA9IG5vZGU7XG4gIGxldCBwcm9wZXJ0aWVzID0gW107XG4gIGNvbnN0IG1lcmdlQXJncyA9IFtdO1xuICBjb25zdCBydW50aW1lRGlyZWN0aXZlcyA9IFtdO1xuICBjb25zdCBoYXNDaGlsZHJlbiA9IGNoaWxkcmVuLmxlbmd0aCA+IDA7XG4gIGxldCBzaG91bGRVc2VCbG9jayA9IGZhbHNlO1xuICBsZXQgcGF0Y2hGbGFnID0gMDtcbiAgbGV0IGhhc1JlZiA9IGZhbHNlO1xuICBsZXQgaGFzQ2xhc3NCaW5kaW5nID0gZmFsc2U7XG4gIGxldCBoYXNTdHlsZUJpbmRpbmcgPSBmYWxzZTtcbiAgbGV0IGhhc0h5ZHJhdGlvbkV2ZW50QmluZGluZyA9IGZhbHNlO1xuICBsZXQgaGFzRHluYW1pY0tleXMgPSBmYWxzZTtcbiAgbGV0IGhhc1Zub2RlSG9vayA9IGZhbHNlO1xuICBjb25zdCBkeW5hbWljUHJvcE5hbWVzID0gW107XG4gIGNvbnN0IHB1c2hNZXJnZUFyZyA9IChhcmcpID0+IHtcbiAgICBpZiAocHJvcGVydGllcy5sZW5ndGgpIHtcbiAgICAgIG1lcmdlQXJncy5wdXNoKFxuICAgICAgICBjcmVhdGVPYmplY3RFeHByZXNzaW9uKGRlZHVwZVByb3BlcnRpZXMocHJvcGVydGllcyksIGVsZW1lbnRMb2MpXG4gICAgICApO1xuICAgICAgcHJvcGVydGllcyA9IFtdO1xuICAgIH1cbiAgICBpZiAoYXJnKSBtZXJnZUFyZ3MucHVzaChhcmcpO1xuICB9O1xuICBjb25zdCBwdXNoUmVmVkZvck1hcmtlciA9ICgpID0+IHtcbiAgICBpZiAoY29udGV4dC5zY29wZXMudkZvciA+IDApIHtcbiAgICAgIHByb3BlcnRpZXMucHVzaChcbiAgICAgICAgY3JlYXRlT2JqZWN0UHJvcGVydHkoXG4gICAgICAgICAgY3JlYXRlU2ltcGxlRXhwcmVzc2lvbihcInJlZl9mb3JcIiwgdHJ1ZSksXG4gICAgICAgICAgY3JlYXRlU2ltcGxlRXhwcmVzc2lvbihcInRydWVcIilcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IGFuYWx5emVQYXRjaEZsYWcgPSAoeyBrZXksIHZhbHVlIH0pID0+IHtcbiAgICBpZiAoaXNTdGF0aWNFeHAoa2V5KSkge1xuICAgICAgY29uc3QgbmFtZSA9IGtleS5jb250ZW50O1xuICAgICAgY29uc3QgaXNFdmVudEhhbmRsZXIgPSBpc09uKG5hbWUpO1xuICAgICAgaWYgKGlzRXZlbnRIYW5kbGVyICYmICghaXNDb21wb25lbnQgfHwgaXNEeW5hbWljQ29tcG9uZW50KSAmJiAvLyBvbWl0IHRoZSBmbGFnIGZvciBjbGljayBoYW5kbGVycyBiZWNhdXNlIGh5ZHJhdGlvbiBnaXZlcyBjbGlja1xuICAgICAgLy8gZGVkaWNhdGVkIGZhc3QgcGF0aC5cbiAgICAgIG5hbWUudG9Mb3dlckNhc2UoKSAhPT0gXCJvbmNsaWNrXCIgJiYgLy8gb21pdCB2LW1vZGVsIGhhbmRsZXJzXG4gICAgICBuYW1lICE9PSBcIm9uVXBkYXRlOm1vZGVsVmFsdWVcIiAmJiAvLyBvbWl0IG9uVm5vZGVYWFggaG9va3NcbiAgICAgICFpc1Jlc2VydmVkUHJvcChuYW1lKSkge1xuICAgICAgICBoYXNIeWRyYXRpb25FdmVudEJpbmRpbmcgPSB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKGlzRXZlbnRIYW5kbGVyICYmIGlzUmVzZXJ2ZWRQcm9wKG5hbWUpKSB7XG4gICAgICAgIGhhc1Zub2RlSG9vayA9IHRydWU7XG4gICAgICB9XG4gICAgICBpZiAoaXNFdmVudEhhbmRsZXIgJiYgdmFsdWUudHlwZSA9PT0gMTQpIHtcbiAgICAgICAgdmFsdWUgPSB2YWx1ZS5hcmd1bWVudHNbMF07XG4gICAgICB9XG4gICAgICBpZiAodmFsdWUudHlwZSA9PT0gMjAgfHwgKHZhbHVlLnR5cGUgPT09IDQgfHwgdmFsdWUudHlwZSA9PT0gOCkgJiYgZ2V0Q29uc3RhbnRUeXBlKHZhbHVlLCBjb250ZXh0KSA+IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKG5hbWUgPT09IFwicmVmXCIpIHtcbiAgICAgICAgaGFzUmVmID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAobmFtZSA9PT0gXCJjbGFzc1wiKSB7XG4gICAgICAgIGhhc0NsYXNzQmluZGluZyA9IHRydWU7XG4gICAgICB9IGVsc2UgaWYgKG5hbWUgPT09IFwic3R5bGVcIikge1xuICAgICAgICBoYXNTdHlsZUJpbmRpbmcgPSB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChuYW1lICE9PSBcImtleVwiICYmICFkeW5hbWljUHJvcE5hbWVzLmluY2x1ZGVzKG5hbWUpKSB7XG4gICAgICAgIGR5bmFtaWNQcm9wTmFtZXMucHVzaChuYW1lKTtcbiAgICAgIH1cbiAgICAgIGlmIChpc0NvbXBvbmVudCAmJiAobmFtZSA9PT0gXCJjbGFzc1wiIHx8IG5hbWUgPT09IFwic3R5bGVcIikgJiYgIWR5bmFtaWNQcm9wTmFtZXMuaW5jbHVkZXMobmFtZSkpIHtcbiAgICAgICAgZHluYW1pY1Byb3BOYW1lcy5wdXNoKG5hbWUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBoYXNEeW5hbWljS2V5cyA9IHRydWU7XG4gICAgfVxuICB9O1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgcHJvcCA9IHByb3BzW2ldO1xuICAgIGlmIChwcm9wLnR5cGUgPT09IDYpIHtcbiAgICAgIGNvbnN0IHsgbG9jLCBuYW1lLCBuYW1lTG9jLCB2YWx1ZSB9ID0gcHJvcDtcbiAgICAgIGxldCBpc1N0YXRpYyA9IHRydWU7XG4gICAgICBpZiAobmFtZSA9PT0gXCJyZWZcIikge1xuICAgICAgICBoYXNSZWYgPSB0cnVlO1xuICAgICAgICBwdXNoUmVmVkZvck1hcmtlcigpO1xuICAgICAgfVxuICAgICAgaWYgKG5hbWUgPT09IFwiaXNcIiAmJiAoaXNDb21wb25lbnRUYWcodGFnKSB8fCB2YWx1ZSAmJiB2YWx1ZS
205785jb250ZW50LnN0YXJ0c1dpdGgoXCJ2dWU6XCIpIHx8IGlzQ29tcGF0RW5hYmxlZChcbiAgICAgICAgXCJDT01QSUxFUl9JU19PTl9FTEVNRU5UXCIsXG4gICAgICAgIGNvbnRleHRcbiAgICAgICkpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgcHJvcGVydGllcy5wdXNoKFxuICAgICAgICBjcmVhdGVPYmplY3RQcm9wZXJ0eShcbiAgICAgICAgICBjcmVhdGVTaW1wbGVFeHByZXNzaW9uKG5hbWUsIHRydWUsIG5hbWVMb2MpLFxuICAgICAgICAgIGNyZWF0ZVNpbXBsZUV4cHJlc3Npb24oXG4gICAgICAgICAgICB2YWx1ZSA/IHZhbHVlLmNvbnRlbnQgOiBcIlwiLFxuICAgICAgICAgICAgaXNTdGF0aWMsXG4gICAgICAgICAgICB2YWx1ZSA/IHZhbHVlLmxvYyA6IGxvY1xuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgeyBuYW1lLCBhcmcsIGV4cCwgbG9jLCBtb2RpZmllcnMgfSA9IHByb3A7XG4gICAgICBjb25zdCBpc1ZCaW5kID0gbmFtZSA9PT0gXCJiaW5kXCI7XG4gICAgICBjb25zdCBpc1ZPbiA9IG5hbWUgPT09IFwib25cIjtcbiAgICAgIGlmIChuYW1lID09PSBcInNsb3RcIikge1xuICAgICAgICBpZiAoIWlzQ29tcG9uZW50KSB7XG4gICAgICAgICAgY29udGV4dC5vbkVycm9yKFxuICAgICAgICAgICAgY3JlYXRlQ29tcGlsZXJFcnJvcig0MCwgbG9jKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAobmFtZSA9PT0gXCJvbmNlXCIgfHwgbmFtZSA9PT0gXCJtZW1vXCIpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAobmFtZSA9PT0gXCJpc1wiIHx8IGlzVkJpbmQgJiYgaXNTdGF0aWNBcmdPZihhcmcsIFwiaXNcIikgJiYgKGlzQ29tcG9uZW50VGFnKHRhZykgfHwgaXNDb21wYXRFbmFibGVkKFxuICAgICAgICBcIkNPTVBJTEVSX0lTX09OX0VMRU1FTlRcIixcbiAgICAgICAgY29udGV4dFxuICAgICAgKSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoaXNWT24gJiYgc3NyKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICAvLyAjOTM4OiBlbGVtZW50cyB3aXRoIGR5bmFtaWMga2V5cyBzaG91bGQgYmUgZm9yY2VkIGludG8gYmxvY2tzXG4gICAgICAgIGlzVkJpbmQgJiYgaXNTdGF0aWNBcmdPZihhcmcsIFwia2V5XCIpIHx8IC8vIGlubGluZSBiZWZvcmUtdXBkYXRlIGhvb2tzIG5lZWQgdG8gZm9yY2UgYmxvY2sgc28gdGhhdCBpdCBpcyBpbnZva2VkXG4gICAgICAgIC8vIGJlZm9yZSBjaGlsZHJlblxuICAgICAgICBpc1ZPbiAmJiBoYXNDaGlsZHJlbiAmJiBpc1N0YXRpY0FyZ09mKGFyZywgXCJ2dWU6YmVmb3JlLXVwZGF0ZVwiKVxuICAgICAgKSB7XG4gICAgICAgIHNob3VsZFVzZUJsb2NrID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChpc1ZCaW5kICYmIGlzU3RhdGljQXJnT2YoYXJnLCBcInJlZlwiKSkge1xuICAgICAgICBwdXNoUmVmVkZvck1hcmtlcigpO1xuICAgICAgfVxuICAgICAgaWYgKCFhcmcgJiYgKGlzVkJpbmQgfHwgaXNWT24pKSB7XG4gICAgICAgIGhhc0R5bmFtaWNLZXlzID0gdHJ1ZTtcbiAgICAgICAgaWYgKGV4cCkge1xuICAgICAgICAgIGlmIChpc1ZCaW5kKSB7XG4gICAgICAgICAgICBwdXNoUmVmVkZvck1hcmtlcigpO1xuICAgICAgICAgICAgcHVzaE1lcmdlQXJnKCk7XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaGFzT3ZlcnJpZGFibGVLZXlzID0gbWVyZ2VBcmdzLnNvbWUoKGFyZzIpID0+IHtcbiAgICAgICAgICAgICAgICAgIGlmIChhcmcyLnR5cGUgPT09IDE1KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhcmcyLnByb3BlcnRpZXMuc29tZSgoeyBrZXkgfSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgIGlmIChrZXkudHlwZSAhPT0gNCB8fCAha2V5LmlzU3RhdGljKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGtleS5jb250ZW50ICE9PSBcImNsYXNzXCIgJiYga2V5LmNvbnRlbnQgIT09IFwic3R5bGVcIiAmJiAhaXNPbihrZXkuY29udGVudCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKGhhc092ZXJyaWRhYmxlS2V5cykge1xuICAgICAgICAgICAgICAgICAgY2hlY2tDb21wYXRFbmFibGVkKFxuICAgICAgICAgICAgICAgICAgICBcIkNPTVBJTEVSX1ZfQklORF9PQkpFQ1RfT1JERVJcIixcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICAgICAgICAgICAgbG9jXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoaXNDb21wYXRFbmFibGVkKFxuICAgICAgICAgICAgICAgIFwiQ09NUElMRVJfVl9CSU5EX09CSkVDVF9PUkRFUlwiLFxuICAgICAgICAgICAgICAgIGNvbnRleHRcbiAgICAgICAgICAgICAgKSkge1xuICAgICAgICAgICAgICAgIG1lcmdlQXJncy51bnNoaWZ0KGV4cCk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG1lcmdlQXJncy5wdXNoKGV4cCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHB1c2hNZXJnZUFyZyh7XG4gICAgICAgICAgICAgIHR5cGU6IDE0LFxuICAgICAgICAgICAgICBsb2MsXG4gICAgICAgICAgICAgIGNhbGxlZTogY29udGV4dC5oZWxwZXIoVE9fSEFORExFUlMpLFxuICAgICAgICAgICAgICBhcmd1bWVudHM6IGlzQ29tcG9uZW50ID8gW2V4cF0gOiBbZXhwLCBgdHJ1ZWBdXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgI
20578H0gZWxzZSB7XG4gICAgICAgICAgY29udGV4dC5vbkVycm9yKFxuICAgICAgICAgICAgY3JlYXRlQ29tcGlsZXJFcnJvcihcbiAgICAgICAgICAgICAgaXNWQmluZCA/IDM0IDogMzUsXG4gICAgICAgICAgICAgIGxvY1xuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoaXNWQmluZCAmJiBtb2RpZmllcnMuaW5jbHVkZXMoXCJwcm9wXCIpKSB7XG4gICAgICAgIHBhdGNoRmxhZyB8PSAzMjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRpcmVjdGl2ZVRyYW5zZm9ybSA9IGNvbnRleHQuZGlyZWN0aXZlVHJhbnNmb3Jtc1tuYW1lXTtcbiAgICAgIGlmIChkaXJlY3RpdmVUcmFuc2Zvcm0pIHtcbiAgICAgICAgY29uc3QgeyBwcm9wczogcHJvcHMyLCBuZWVkUnVudGltZSB9ID0gZGlyZWN0aXZlVHJhbnNmb3JtKHByb3AsIG5vZGUsIGNvbnRleHQpO1xuICAgICAgICAhc3NyICYmIHByb3BzMi5mb3JFYWNoKGFuYWx5emVQYXRjaEZsYWcpO1xuICAgICAgICBpZiAoaXNWT24gJiYgYXJnICYmICFpc1N0YXRpY0V4cChhcmcpKSB7XG4gICAgICAgICAgcHVzaE1lcmdlQXJnKGNyZWF0ZU9iamVjdEV4cHJlc3Npb24ocHJvcHMyLCBlbGVtZW50TG9jKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJvcGVydGllcy5wdXNoKC4uLnByb3BzMik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5lZWRSdW50aW1lKSB7XG4gICAgICAgICAgcnVudGltZURpcmVjdGl2ZXMucHVzaChwcm9wKTtcbiAgICAgICAgICBpZiAoaXNTeW1ib2wobmVlZFJ1bnRpbWUpKSB7XG4gICAgICAgICAgICBkaXJlY3RpdmVJbXBvcnRNYXAuc2V0KHByb3AsIG5lZWRSdW50aW1lKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoIWlzQnVpbHRJbkRpcmVjdGl2ZShuYW1lKSkge1xuICAgICAgICBydW50aW1lRGlyZWN0aXZlcy5wdXNoKHByb3ApO1xuICAgICAgICBpZiAoaGFzQ2hpbGRyZW4pIHtcbiAgICAgICAgICBzaG91bGRVc2VCbG9jayA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgbGV0IHByb3BzRXhwcmVzc2lvbiA9IHZvaWQgMDtcbiAgaWYgKG1lcmdlQXJncy5sZW5ndGgpIHtcbiAgICBwdXNoTWVyZ2VBcmcoKTtcbiAgICBpZiAobWVyZ2VBcmdzLmxlbmd0aCA+IDEpIHtcbiAgICAgIHByb3BzRXhwcmVzc2lvbiA9IGNyZWF0ZUNhbGxFeHByZXNzaW9uKFxuICAgICAgICBjb250ZXh0LmhlbHBlcihNRVJHRV9QUk9QUyksXG4gICAgICAgIG1lcmdlQXJncyxcbiAgICAgICAgZWxlbWVudExvY1xuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcHJvcHNFeHByZXNzaW9uID0gbWVyZ2VBcmdzWzBdO1xuICAgIH1cbiAgfSBlbHNlIGlmIChwcm9wZXJ0aWVzLmxlbmd0aCkge1xuICAgIHByb3BzRXhwcmVzc2lvbiA9IGNyZWF0ZU9iamVjdEV4cHJlc3Npb24oXG4gICAgICBkZWR1cGVQcm9wZXJ0aWVzKHByb3BlcnRpZXMpLFxuICAgICAgZWxlbWVudExvY1xuICAgICk7XG4gIH1cbiAgaWYgKGhhc0R5bmFtaWNLZXlzKSB7XG4gICAgcGF0Y2hGbGFnIHw9IDE2O1xuICB9IGVsc2Uge1xuICAgIGlmIChoYXNDbGFzc0JpbmRpbmcgJiYgIWlzQ29tcG9uZW50KSB7XG4gICAgICBwYXRjaEZsYWcgfD0gMjtcbiAgICB9XG4gICAgaWYgKGhhc1N0eWxlQmluZGluZyAmJiAhaXNDb21wb25lbnQpIHtcbiAgICAgIHBhdGNoRmxhZyB8PSA0O1xuICAgIH1cbiAgICBpZiAoZHluYW1pY1Byb3BOYW1lcy5sZW5ndGgpIHtcbiAgICAgIHBhdGNoRmxhZyB8PSA4O1xuICAgIH1cbiAgICBpZiAoaGFzSHlkcmF0aW9uRXZlbnRCaW5kaW5nKSB7XG4gICAgICBwYXRjaEZsYWcgfD0gMzI7XG4gICAgfVxuICB9XG4gIGlmICghc2hvdWxkVXNlQmxvY2sgJiYgKHBhdGNoRmxhZyA9PT0gMCB8fCBwYXRjaEZsYWcgPT09IDMyKSAmJiAoaGFzUmVmIHx8IGhhc1Zub2RlSG9vayB8fCBydW50aW1lRGlyZWN0aXZlcy5sZW5ndGggPiAwKSkge1xuICAgIHBhdGNoRmxhZyB8PSA1MTI7XG4gIH1cbiAgaWYgKCFjb250ZXh0LmluU1NSICYmIHByb3BzRXhwcmVzc2lvbikge1xuICAgIHN3aXRjaCAocHJvcHNFeHByZXNzaW9uLnR5cGUpIHtcbiAgICAgIGNhc2UgMTU6XG4gICAgICAgIGxldCBjbGFzc0tleUluZGV4ID0gLTE7XG4gICAgICAgIGxldCBzdHlsZUtleUluZGV4ID0gLTE7XG4gICAgICAgIGxldCBoYXNEeW5hbWljS2V5ID0gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJvcHNFeHByZXNzaW9uLnByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBrZXkgPSBwcm9wc0V4cHJlc3Npb24ucHJvcGVydGllc1tpXS5rZXk7XG4gICAgICAgICAgaWYgKGlzU3RhdGljRXhwKGtleSkpIHtcbiAgICAgICAgICAgIGlmIChrZXkuY29udGVudCA9PT0gXCJjbGFzc1wiKSB7XG4gICAgICAgICAgICAgIGNsYXNzS2V5SW5kZXggPSBpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChrZXkuY29udGVudCA9PT0gXCJzdHlsZVwiKSB7XG4gICAgICAgICAgICAgIHN0eWxlS2V5SW5kZXggPSBpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoIWtleS5pc0hhbmRsZXJLZXkpIHtcbiAgICAgICAgICAgIGhhc0R5bmFtaWNLZXkgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjbGFzc1Byb3AgPSBwcm9wc0V4cHJlc3Npb24ucHJvcGVydGllc1tjbGFzc0tleUluZGV4XTtcbiAgICAgICAgY29uc3Qgc3R5bGVQcm9wID0gcHJvcHNFeHByZXNzaW9uLnByb3BlcnRpZXNbc3R5bGVLZXlJbmRleF07XG4gICAgICAgIGlmICghaGFzRHluYW1pY0tleSkge1xuICAgICAgICAgIGlmIChjbGFzc1Byb3AgJiYgIWlzU3RhdGljRXhwKGNsYXNzUHJvcC52YWx1ZSkpIHtcbiAgICAgICAgICAgIGNsYXNzUHJvcC52YWx1ZSA9IGNyZWF0ZUNhbGxFeHByZXNzaW9uKFxuICAgICAgICAgICAgICBjb250ZXh0LmhlbHBlcihOT1JNQUxJWkVfQ0xBU1MpLFxuICAgICAgICAgICAgICBbY2xhc3NQcm9wLnZhbHVlXVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHN0eWxlUHJvcCAmJiAvLyB0aGUgc3RhdGljIHN0eWxlIGlzIGNvbXBpbGVkIGludG8gYW4gb2JqZWN0LFxuICAgICAgICAgIC8vIHNvIHVzZSBgaGFzU3R5bGVCaW5kaW5nYCB0byBlbnN1cmUgdGhhdCBpdCBpcyBh
20578IGR5bmFtaWMgc3R5bGUgYmluZGluZ1xuICAgICAgICAgIChoYXNTdHlsZUJpbmRpbmcgfHwgc3R5bGVQcm9wLnZhbHVlLnR5cGUgPT09IDQgJiYgc3R5bGVQcm9wLnZhbHVlLmNvbnRlbnQudHJpbSgpWzBdID09PSBgW2AgfHwgLy8gdi1iaW5kOnN0eWxlIGFuZCBzdHlsZSBib3RoIGV4aXN0LFxuICAgICAgICAgIC8vIHYtYmluZDpzdHlsZSB3aXRoIHN0YXRpYyBsaXRlcmFsIG9iamVjdFxuICAgICAgICAgIHN0eWxlUHJvcC52YWx1ZS50eXBlID09PSAxNykpIHtcbiAgICAgICAgICAgIHN0eWxlUHJvcC52YWx1ZSA9IGNyZWF0ZUNhbGxFeHByZXNzaW9uKFxuICAgICAgICAgICAgICBjb250ZXh0LmhlbHBlcihOT1JNQUxJWkVfU1RZTEUpLFxuICAgICAgICAgICAgICBbc3R5bGVQcm9wLnZhbHVlXVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJvcHNFeHByZXNzaW9uID0gY3JlYXRlQ2FsbEV4cHJlc3Npb24oXG4gICAgICAgICAgICBjb250ZXh0LmhlbHBlcihOT1JNQUxJWkVfUFJPUFMpLFxuICAgICAgICAgICAgW3Byb3BzRXhwcmVzc2lvbl1cbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAxNDpcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBwcm9wc0V4cHJlc3Npb24gPSBjcmVhdGVDYWxsRXhwcmVzc2lvbihcbiAgICAgICAgICBjb250ZXh0LmhlbHBlcihOT1JNQUxJWkVfUFJPUFMpLFxuICAgICAgICAgIFtcbiAgICAgICAgICAgIGNyZWF0ZUNhbGxFeHByZXNzaW9uKGNvbnRleHQuaGVscGVyKEdVQVJEX1JFQUNUSVZFX1BST1BTKSwgW1xuICAgICAgICAgICAgICBwcm9wc0V4cHJlc3Npb25cbiAgICAgICAgICAgIF0pXG4gICAgICAgICAgXVxuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBwcm9wczogcHJvcHNFeHByZXNzaW9uLFxuICAgIGRpcmVjdGl2ZXM6IHJ1bnRpbWVEaXJlY3RpdmVzLFxuICAgIHBhdGNoRmxhZyxcbiAgICBkeW5hbWljUHJvcE5hbWVzLFxuICAgIHNob3VsZFVzZUJsb2NrXG4gIH07XG59XG5mdW5jdGlvbiBkZWR1cGVQcm9wZXJ0aWVzKHByb3BlcnRpZXMpIHtcbiAgY29uc3Qga25vd25Qcm9wcyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG4gIGNvbnN0IGRlZHVwZWQgPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgcHJvcCA9IHByb3BlcnRpZXNbaV07XG4gICAgaWYgKHByb3Aua2V5LnR5cGUgPT09IDggfHwgIXByb3Aua2V5LmlzU3RhdGljKSB7XG4gICAgICBkZWR1cGVkLnB1c2gocHJvcCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgbmFtZSA9IHByb3Aua2V5LmNvbnRlbnQ7XG4gICAgY29uc3QgZXhpc3RpbmcgPSBrbm93blByb3BzLmdldChuYW1lKTtcbiAgICBpZiAoZXhpc3RpbmcpIHtcbiAgICAgIGlmIChuYW1lID09PSBcInN0eWxlXCIgfHwgbmFtZSA9PT0gXCJjbGFzc1wiIHx8IGlzT24obmFtZSkpIHtcbiAgICAgICAgbWVyZ2VBc0FycmF5KGV4aXN0aW5nLCBwcm9wKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAga25vd25Qcm9wcy5zZXQobmFtZSwgcHJvcCk7XG4gICAgICBkZWR1cGVkLnB1c2gocHJvcCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBkZWR1cGVkO1xufVxuZnVuY3Rpb24gbWVyZ2VBc0FycmF5KGV4aXN0aW5nLCBpbmNvbWluZykge1xuICBpZiAoZXhpc3RpbmcudmFsdWUudHlwZSA9PT0gMTcpIHtcbiAgICBleGlzdGluZy52YWx1ZS5lbGVtZW50cy5wdXNoKGluY29taW5nLnZhbHVlKTtcbiAgfSBlbHNlIHtcbiAgICBleGlzdGluZy52YWx1ZSA9IGNyZWF0ZUFycmF5RXhwcmVzc2lvbihcbiAgICAgIFtleGlzdGluZy52YWx1ZSwgaW5jb21pbmcudmFsdWVdLFxuICAgICAgZXhpc3RpbmcubG9jXG4gICAgKTtcbiAgfVxufVxuZnVuY3Rpb24gYnVpbGREaXJlY3RpdmVBcmdzKGRpciwgY29udGV4dCkge1xuICBjb25zdCBkaXJBcmdzID0gW107XG4gIGNvbnN0IHJ1bnRpbWUgPSBkaXJlY3RpdmVJbXBvcnRNYXAuZ2V0KGRpcik7XG4gIGlmIChydW50aW1lKSB7XG4gICAgZGlyQXJncy5wdXNoKGNvbnRleHQuaGVscGVyU3RyaW5nKHJ1bnRpbWUpKTtcbiAgfSBlbHNlIHtcbiAgICB7XG4gICAgICBjb250ZXh0LmhlbHBlcihSRVNPTFZFX0RJUkVDVElWRSk7XG4gICAgICBjb250ZXh0LmRpcmVjdGl2ZXMuYWRkKGRpci5uYW1lKTtcbiAgICAgIGRpckFyZ3MucHVzaCh0b1ZhbGlkQXNzZXRJZChkaXIubmFtZSwgYGRpcmVjdGl2ZWApKTtcbiAgICB9XG4gIH1cbiAgY29uc3QgeyBsb2MgfSA9IGRpcjtcbiAgaWYgKGRpci5leHApIGRpckFyZ3MucHVzaChkaXIuZXhwKTtcbiAgaWYgKGRpci5hcmcpIHtcbiAgICBpZiAoIWRpci5leHApIHtcbiAgICAgIGRpckFyZ3MucHVzaChgdm9pZCAwYCk7XG4gICAgfVxuICAgIGRpckFyZ3MucHVzaChkaXIuYXJnKTtcbiAgfVxuICBpZiAoT2JqZWN0LmtleXMoZGlyLm1vZGlmaWVycykubGVuZ3RoKSB7XG4gICAgaWYgKCFkaXIuYXJnKSB7XG4gICAgICBpZiAoIWRpci5leHApIHtcbiAgICAgICAgZGlyQXJncy5wdXNoKGB2b2lkIDBgKTtcbiAgICAgIH1cbiAgICAgIGRpckFyZ3MucHVzaChgdm9pZCAwYCk7XG4gICAgfVxuICAgIGNvbnN0IHRydWVFeHByZXNzaW9uID0gY3JlYXRlU2ltcGxlRXhwcmVzc2lvbihgdHJ1ZWAsIGZhbHNlLCBsb2MpO1xuICAgIGRpckFyZ3MucHVzaChcbiAgICAgIGNyZWF0ZU9iamVjdEV4cHJlc3Npb24oXG4gICAgICAgIGRpci5tb2RpZmllcnMubWFwKFxuICAgICAgICAgIChtb2RpZmllcikgPT4gY3JlYXRlT2JqZWN0UHJvcGVydHkobW9kaWZpZXIsIHRydWVFeHByZXNzaW9uKVxuICAgICAgICApLFxuICAgICAgICBsb2NcbiAgICAgIClcbiAgICApO1xuICB9XG4gIHJldHVybiBjcmVhdGVBcnJheUV4cHJlc3Npb24oZGlyQXJncywgZGlyLmxvYyk7XG59XG5mdW5jdGlvbiBzdHJpbmdpZnlEeW5hbWljUHJvcE5hbWVzKHByb3BzKSB7XG4gIGxldCBwcm9wc05hbWVzU3RyaW5nID0gYFtgO1xuICBmb3IgKGxldCBpID0gMCwgbCA9IHByb3BzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIHByb3BzTmFtZXNTdHJpbmcgKz
205780gSlNPTi5zdHJpbmdpZnkocHJvcHNbaV0pO1xuICAgIGlmIChpIDwgbCAtIDEpIHByb3BzTmFtZXNTdHJpbmcgKz0gXCIsIFwiO1xuICB9XG4gIHJldHVybiBwcm9wc05hbWVzU3RyaW5nICsgYF1gO1xufVxuZnVuY3Rpb24gaXNDb21wb25lbnRUYWcodGFnKSB7XG4gIHJldHVybiB0YWcgPT09IFwiY29tcG9uZW50XCIgfHwgdGFnID09PSBcIkNvbXBvbmVudFwiO1xufVxuXG5jb25zdCB0cmFuc2Zvcm1TbG90T3V0bGV0ID0gKG5vZGUsIGNvbnRleHQpID0+IHtcbiAgaWYgKGlzU2xvdE91dGxldChub2RlKSkge1xuICAgIGNvbnN0IHsgY2hpbGRyZW4sIGxvYyB9ID0gbm9kZTtcbiAgICBjb25zdCB7IHNsb3ROYW1lLCBzbG90UHJvcHMgfSA9IHByb2Nlc3NTbG90T3V0bGV0KG5vZGUsIGNvbnRleHQpO1xuICAgIGNvbnN0IHNsb3RBcmdzID0gW1xuICAgICAgY29udGV4dC5wcmVmaXhJZGVudGlmaWVycyA/IGBfY3R4LiRzbG90c2AgOiBgJHNsb3RzYCxcbiAgICAgIHNsb3ROYW1lLFxuICAgICAgXCJ7fVwiLFxuICAgICAgXCJ1bmRlZmluZWRcIixcbiAgICAgIFwidHJ1ZVwiXG4gICAgXTtcbiAgICBsZXQgZXhwZWN0ZWRMZW4gPSAyO1xuICAgIGlmIChzbG90UHJvcHMpIHtcbiAgICAgIHNsb3RBcmdzWzJdID0gc2xvdFByb3BzO1xuICAgICAgZXhwZWN0ZWRMZW4gPSAzO1xuICAgIH1cbiAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICBzbG90QXJnc1szXSA9IGNyZWF0ZUZ1bmN0aW9uRXhwcmVzc2lvbihbXSwgY2hpbGRyZW4sIGZhbHNlLCBmYWxzZSwgbG9jKTtcbiAgICAgIGV4cGVjdGVkTGVuID0gNDtcbiAgICB9XG4gICAgaWYgKGNvbnRleHQuc2NvcGVJZCAmJiAhY29udGV4dC5zbG90dGVkKSB7XG4gICAgICBleHBlY3RlZExlbiA9IDU7XG4gICAgfVxuICAgIHNsb3RBcmdzLnNwbGljZShleHBlY3RlZExlbik7XG4gICAgbm9kZS5jb2RlZ2VuTm9kZSA9IGNyZWF0ZUNhbGxFeHByZXNzaW9uKFxuICAgICAgY29udGV4dC5oZWxwZXIoUkVOREVSX1NMT1QpLFxuICAgICAgc2xvdEFyZ3MsXG4gICAgICBsb2NcbiAgICApO1xuICB9XG59O1xuZnVuY3Rpb24gcHJvY2Vzc1Nsb3RPdXRsZXQobm9kZSwgY29udGV4dCkge1xuICBsZXQgc2xvdE5hbWUgPSBgXCJkZWZhdWx0XCJgO1xuICBsZXQgc2xvdFByb3BzID0gdm9pZCAwO1xuICBjb25zdCBub25OYW1lUHJvcHMgPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2RlLnByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgcCA9IG5vZGUucHJvcHNbaV07XG4gICAgaWYgKHAudHlwZSA9PT0gNikge1xuICAgICAgaWYgKHAudmFsdWUpIHtcbiAgICAgICAgaWYgKHAubmFtZSA9PT0gXCJuYW1lXCIpIHtcbiAgICAgICAgICBzbG90TmFtZSA9IEpTT04uc3RyaW5naWZ5KHAudmFsdWUuY29udGVudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcC5uYW1lID0gY2FtZWxpemUocC5uYW1lKTtcbiAgICAgICAgICBub25OYW1lUHJvcHMucHVzaChwKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAocC5uYW1lID09PSBcImJpbmRcIiAmJiBpc1N0YXRpY0FyZ09mKHAuYXJnLCBcIm5hbWVcIikpIHtcbiAgICAgICAgaWYgKHAuZXhwKSB7XG4gICAgICAgICAgc2xvdE5hbWUgPSBwLmV4cDtcbiAgICAgICAgfSBlbHNlIGlmIChwLmFyZyAmJiBwLmFyZy50eXBlID09PSA0KSB7XG4gICAgICAgICAgY29uc3QgbmFtZSA9IGNhbWVsaXplKHAuYXJnLmNvbnRlbnQpO1xuICAgICAgICAgIHNsb3ROYW1lID0gcC5leHAgPSBjcmVhdGVTaW1wbGVFeHByZXNzaW9uKG5hbWUsIGZhbHNlLCBwLmFyZy5sb2MpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAocC5uYW1lID09PSBcImJpbmRcIiAmJiBwLmFyZyAmJiBpc1N0YXRpY0V4cChwLmFyZykpIHtcbiAgICAgICAgICBwLmFyZy5jb250ZW50ID0gY2FtZWxpemUocC5hcmcuY29udGVudCk7XG4gICAgICAgIH1cbiAgICAgICAgbm9uTmFtZVByb3BzLnB1c2gocCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmIChub25OYW1lUHJvcHMubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IHsgcHJvcHMsIGRpcmVjdGl2ZXMgfSA9IGJ1aWxkUHJvcHMoXG4gICAgICBub2RlLFxuICAgICAgY29udGV4dCxcbiAgICAgIG5vbk5hbWVQcm9wcyxcbiAgICAgIGZhbHNlLFxuICAgICAgZmFsc2VcbiAgICApO1xuICAgIHNsb3RQcm9wcyA9IHByb3BzO1xuICAgIGlmIChkaXJlY3RpdmVzLmxlbmd0aCkge1xuICAgICAgY29udGV4dC5vbkVycm9yKFxuICAgICAgICBjcmVhdGVDb21waWxlckVycm9yKFxuICAgICAgICAgIDM2LFxuICAgICAgICAgIGRpcmVjdGl2ZXNbMF0ubG9jXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIHJldHVybiB7XG4gICAgc2xvdE5hbWUsXG4gICAgc2xvdFByb3BzXG4gIH07XG59XG5cbmNvbnN0IGZuRXhwUkUgPSAvXlxccyooYXN5bmNcXHMqKT8oXFwoW14pXSo/XFwpfFtcXHckX10rKVxccyooOltePV0rKT89PnxeXFxzKihhc3luY1xccyspP2Z1bmN0aW9uKD86XFxzK1tcXHckXSspP1xccypcXCgvO1xuY29uc3QgdHJhbnNmb3JtT24gPSAoZGlyLCBub2RlLCBjb250ZXh0LCBhdWdtZW50b3IpID0+IHtcbiAgY29uc3QgeyBsb2MsIG1vZGlmaWVycywgYXJnIH0gPSBkaXI7XG4gIGlmICghZGlyLmV4cCAmJiAhbW9kaWZpZXJzLmxlbmd0aCkge1xuICAgIGNvbnRleHQub25FcnJvcihjcmVhdGVDb21waWxlckVycm9yKDM1LCBsb2MpKTtcbiAgfVxuICBsZXQgZXZlbnROYW1lO1xuICBpZiAoYXJnLnR5cGUgPT09IDQpIHtcbiAgICBpZiAoYXJnLmlzU3RhdGljKSB7XG4gICAgICBsZXQgcmF3TmFtZSA9IGFyZy5jb250ZW50O1xuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgcmF3TmFtZS5zdGFydHNXaXRoKFwidm5vZGVcIikpIHtcbiAgICAgICAgY29udGV4dC5vbkVycm9yKGNyZWF0ZUNvbXBpbGVyRXJyb3IoNTEsIGFyZy5sb2MpKTtcbiAgICAgIH1cbiAgICAgIGlmIChyYXdOYW1lLnN0YXJ0c1dpdGgoXCJ2dWU6XCIpKSB7XG4gICAgICAgIHJhd05hbWUgPSBgdm5vZGUtJHtyYXdOYW1lLnNsaWNlKDQpfWA7XG4gICAgICB9XG4gICAgICBjb25zdCBldmVudFN0cmluZyA9IG5vZGUudGFnVHlwZSAhPT0gMCB8fCByYXdOYW1lLnN0YXJ0c1dpdGgoXCJ2bm9kZVwiKSB8fCAhL1tBLVpdLy50ZXN0KHJhd05hbWUpID8gKFxuICAgICAgICAvLyBmb3Igbm9uLWVsZW1lbnQgYW5kIHZub2RlIGxpZmVjeWNsZSBldmVudCBsaXN0ZW5lcnMsIGF1dG8gY29udmVydFxuICAgICAgICAvLyBpdCB0byBjYW1lbENhc2UuIFNlZSBpc3N1ZSAjMjI0OVxuICAgICAgICB0b0hhbmRsZXJLZXkoY2FtZWxpemUocmF3TmFtZSkpXG4gICAgICApIDogKFxuICAgICAgICAvLyBwcmVzZXJ2ZSBjYXNlIGZvciBwbGFpbiBlbGVtZW50IGxpc3RlbmVycyB0aGF0IGhh
20578dmUgdXBwZXJjYXNlXG4gICAgICAgIC8vIGxldHRlcnMsIGFzIHRoZXNlIG1heSBiZSBjdXN0b20gZWxlbWVudHMnIGN1c3RvbSBldmVudHNcbiAgICAgICAgYG9uOiR7cmF3TmFtZX1gXG4gICAgICApO1xuICAgICAgZXZlbnROYW1lID0gY3JlYXRlU2ltcGxlRXhwcmVzc2lvbihldmVudFN0cmluZywgdHJ1ZSwgYXJnLmxvYyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGV2ZW50TmFtZSA9IGNyZWF0ZUNvbXBvdW5kRXhwcmVzc2lvbihbXG4gICAgICAgIGAke2NvbnRleHQuaGVscGVyU3RyaW5nKFRPX0hBTkRMRVJfS0VZKX0oYCxcbiAgICAgICAgYXJnLFxuICAgICAgICBgKWBcbiAgICAgIF0pO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBldmVudE5hbWUgPSBhcmc7XG4gICAgZXZlbnROYW1lLmNoaWxkcmVuLnVuc2hpZnQoYCR7Y29udGV4dC5oZWxwZXJTdHJpbmcoVE9fSEFORExFUl9LRVkpfShgKTtcbiAgICBldmVudE5hbWUuY2hpbGRyZW4ucHVzaChgKWApO1xuICB9XG4gIGxldCBleHAgPSBkaXIuZXhwO1xuICBpZiAoZXhwICYmICFleHAuY29udGVudC50cmltKCkpIHtcbiAgICBleHAgPSB2b2lkIDA7XG4gIH1cbiAgbGV0IHNob3VsZENhY2hlID0gY29udGV4dC5jYWNoZUhhbmRsZXJzICYmICFleHAgJiYgIWNvbnRleHQuaW5WT25jZTtcbiAgaWYgKGV4cCkge1xuICAgIGNvbnN0IGlzTWVtYmVyRXhwID0gaXNNZW1iZXJFeHByZXNzaW9uKGV4cC5jb250ZW50KTtcbiAgICBjb25zdCBpc0lubGluZVN0YXRlbWVudCA9ICEoaXNNZW1iZXJFeHAgfHwgZm5FeHBSRS50ZXN0KGV4cC5jb250ZW50KSk7XG4gICAgY29uc3QgaGFzTXVsdGlwbGVTdGF0ZW1lbnRzID0gZXhwLmNvbnRlbnQuaW5jbHVkZXMoYDtgKTtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiB0cnVlKSB7XG4gICAgICB2YWxpZGF0ZUJyb3dzZXJFeHByZXNzaW9uKFxuICAgICAgICBleHAsXG4gICAgICAgIGNvbnRleHQsXG4gICAgICAgIGZhbHNlLFxuICAgICAgICBoYXNNdWx0aXBsZVN0YXRlbWVudHNcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChpc0lubGluZVN0YXRlbWVudCB8fCBzaG91bGRDYWNoZSAmJiBpc01lbWJlckV4cCkge1xuICAgICAgZXhwID0gY3JlYXRlQ29tcG91bmRFeHByZXNzaW9uKFtcbiAgICAgICAgYCR7aXNJbmxpbmVTdGF0ZW1lbnQgPyBgJGV2ZW50YCA6IGAke2BgfSguLi5hcmdzKWB9ID0+ICR7aGFzTXVsdGlwbGVTdGF0ZW1lbnRzID8gYHtgIDogYChgfWAsXG4gICAgICAgIGV4cCxcbiAgICAgICAgaGFzTXVsdGlwbGVTdGF0ZW1lbnRzID8gYH1gIDogYClgXG4gICAgICBdKTtcbiAgICB9XG4gIH1cbiAgbGV0IHJldCA9IHtcbiAgICBwcm9wczogW1xuICAgICAgY3JlYXRlT2JqZWN0UHJvcGVydHkoXG4gICAgICAgIGV2ZW50TmFtZSxcbiAgICAgICAgZXhwIHx8IGNyZWF0ZVNpbXBsZUV4cHJlc3Npb24oYCgpID0+IHt9YCwgZmFsc2UsIGxvYylcbiAgICAgIClcbiAgICBdXG4gIH07XG4gIGlmIChhdWdtZW50b3IpIHtcbiAgICByZXQgPSBhdWdtZW50b3IocmV0KTtcbiAgfVxuICBpZiAoc2hvdWxkQ2FjaGUpIHtcbiAgICByZXQucHJvcHNbMF0udmFsdWUgPSBjb250ZXh0LmNhY2hlKHJldC5wcm9wc1swXS52YWx1ZSk7XG4gIH1cbiAgcmV0LnByb3BzLmZvckVhY2goKHApID0+IHAua2V5LmlzSGFuZGxlcktleSA9IHRydWUpO1xuICByZXR1cm4gcmV0O1xufTtcblxuY29uc3QgdHJhbnNmb3JtVGV4dCA9IChub2RlLCBjb250ZXh0KSA9PiB7XG4gIGlmIChub2RlLnR5cGUgPT09IDAgfHwgbm9kZS50eXBlID09PSAxIHx8IG5vZGUudHlwZSA9PT0gMTEgfHwgbm9kZS50eXBlID09PSAxMCkge1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBjb25zdCBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW47XG4gICAgICBsZXQgY3VycmVudENvbnRhaW5lciA9IHZvaWQgMDtcbiAgICAgIGxldCBoYXNUZXh0ID0gZmFsc2U7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkID0gY2hpbGRyZW5baV07XG4gICAgICAgIGlmIChpc1RleHQkMShjaGlsZCkpIHtcbiAgICAgICAgICBoYXNUZXh0ID0gdHJ1ZTtcbiAgICAgICAgICBmb3IgKGxldCBqID0gaSArIDE7IGogPCBjaGlsZHJlbi5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgY29uc3QgbmV4dCA9IGNoaWxkcmVuW2pdO1xuICAgICAgICAgICAgaWYgKGlzVGV4dCQxKG5leHQpKSB7XG4gICAgICAgICAgICAgIGlmICghY3VycmVudENvbnRhaW5lcikge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRDb250YWluZXIgPSBjaGlsZHJlbltpXSA9IGNyZWF0ZUNvbXBvdW5kRXhwcmVzc2lvbihcbiAgICAgICAgICAgICAgICAgIFtjaGlsZF0sXG4gICAgICAgICAgICAgICAgICBjaGlsZC5sb2NcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGN1cnJlbnRDb250YWluZXIuY2hpbGRyZW4ucHVzaChgICsgYCwgbmV4dCk7XG4gICAgICAgICAgICAgIGNoaWxkcmVuLnNwbGljZShqLCAxKTtcbiAgICAgICAgICAgICAgai0tO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY3VycmVudENvbnRhaW5lciA9IHZvaWQgMDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIWhhc1RleHQgfHwgLy8gaWYgdGhpcyBpcyBhIHBsYWluIGVsZW1lbnQgd2l0aCBhIHNpbmdsZSB0ZXh0IGNoaWxkLCBsZWF2ZSBpdFxuICAgICAgLy8gYXMtaXMgc2luY2UgdGhlIHJ1bnRpbWUgaGFzIGRlZGljYXRlZCBmYXN0IHBhdGggZm9yIHRoaXMgYnkgZGlyZWN0bHlcbiAgICAgIC8vIHNldHRpbmcgdGV4dENvbnRlbnQgb2YgdGhlIGVsZW1lbnQuXG4gICAgICAvLyBmb3IgY29tcG9uZW50IHJvb3QgaXQncyBhbHdheXMgbm9ybWFsaXplZCBhbnl3YXkuXG4gICAgICBjaGlsZHJlbi5sZW5ndGggPT09IDEgJiYgKG5vZGUudHlwZSA9PT0gMCB8fCBub2RlLnR5cGUgPT09IDEgJiYgbm9kZS50YWdUeXBlID09PSAwICYmIC8vICMzNzU2XG4gICAgICAvLyBjdXN0b20gZGlyZWN0aXZlcyBjYW4gcG90ZW50aWFsbHkgYWRkIERPTSBlbGVtZW50cyBhcmJpdHJhcmlseSxcbiAgICAgIC8vIHdlIG5lZWQgdG8gYXZvaWQgc2V0dGluZyB0ZXh0Q29udGVudCBvZiB0aGUgZWxlbWVudCBhdCBydW50aW1lXG4gICAgICAvLyB0byBhdm9pZCBhY2NpZGVudGFsbHkgb3ZlcndyaXRpbmcgdGhlIERPTSBlbGVtZW50cyBhZGRlZFxuICAgICAgLy8gYnkgdGhlI
20578HVzZXIgdGhyb3VnaCBjdXN0b20gZGlyZWN0aXZlcy5cbiAgICAgICFub2RlLnByb3BzLmZpbmQoXG4gICAgICAgIChwKSA9PiBwLnR5cGUgPT09IDcgJiYgIWNvbnRleHQuZGlyZWN0aXZlVHJhbnNmb3Jtc1twLm5hbWVdXG4gICAgICApICYmIC8vIGluIGNvbXBhdCBtb2RlLCA8dGVtcGxhdGU+IHRhZ3Mgd2l0aCBubyBzcGVjaWFsIGRpcmVjdGl2ZXNcbiAgICAgIC8vIHdpbGwgYmUgcmVuZGVyZWQgYXMgYSBmcmFnbWVudCBzbyBpdHMgY2hpbGRyZW4gbXVzdCBiZVxuICAgICAgLy8gY29udmVydGVkIGludG8gdm5vZGVzLlxuICAgICAgIShub2RlLnRhZyA9PT0gXCJ0ZW1wbGF0ZVwiKSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBjaGlsZCA9IGNoaWxkcmVuW2ldO1xuICAgICAgICBpZiAoaXNUZXh0JDEoY2hpbGQpIHx8IGNoaWxkLnR5cGUgPT09IDgpIHtcbiAgICAgICAgICBjb25zdCBjYWxsQXJncyA9IFtdO1xuICAgICAgICAgIGlmIChjaGlsZC50eXBlICE9PSAyIHx8IGNoaWxkLmNvbnRlbnQgIT09IFwiIFwiKSB7XG4gICAgICAgICAgICBjYWxsQXJncy5wdXNoKGNoaWxkKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFjb250ZXh0LnNzciAmJiBnZXRDb25zdGFudFR5cGUoY2hpbGQsIGNvbnRleHQpID09PSAwKSB7XG4gICAgICAgICAgICBjYWxsQXJncy5wdXNoKFxuICAgICAgICAgICAgICAxICsgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBgIC8qICR7UGF0Y2hGbGFnTmFtZXNbMV19ICovYCA6IGBgKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2hpbGRyZW5baV0gPSB7XG4gICAgICAgICAgICB0eXBlOiAxMixcbiAgICAgICAgICAgIGNvbnRlbnQ6IGNoaWxkLFxuICAgICAgICAgICAgbG9jOiBjaGlsZC5sb2MsXG4gICAgICAgICAgICBjb2RlZ2VuTm9kZTogY3JlYXRlQ2FsbEV4cHJlc3Npb24oXG4gICAgICAgICAgICAgIGNvbnRleHQuaGVscGVyKENSRUFURV9URVhUKSxcbiAgICAgICAgICAgICAgY2FsbEFyZ3NcbiAgICAgICAgICAgIClcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfVxufTtcblxuY29uc3Qgc2VlbiQxID0gLyogQF9fUFVSRV9fICovIG5ldyBXZWFrU2V0KCk7XG5jb25zdCB0cmFuc2Zvcm1PbmNlID0gKG5vZGUsIGNvbnRleHQpID0+IHtcbiAgaWYgKG5vZGUudHlwZSA9PT0gMSAmJiBmaW5kRGlyKG5vZGUsIFwib25jZVwiLCB0cnVlKSkge1xuICAgIGlmIChzZWVuJDEuaGFzKG5vZGUpIHx8IGNvbnRleHQuaW5WT25jZSB8fCBjb250ZXh0LmluU1NSKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHNlZW4kMS5hZGQobm9kZSk7XG4gICAgY29udGV4dC5pblZPbmNlID0gdHJ1ZTtcbiAgICBjb250ZXh0LmhlbHBlcihTRVRfQkxPQ0tfVFJBQ0tJTkcpO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBjb250ZXh0LmluVk9uY2UgPSBmYWxzZTtcbiAgICAgIGNvbnN0IGN1ciA9IGNvbnRleHQuY3VycmVudE5vZGU7XG4gICAgICBpZiAoY3VyLmNvZGVnZW5Ob2RlKSB7XG4gICAgICAgIGN1ci5jb2RlZ2VuTm9kZSA9IGNvbnRleHQuY2FjaGUoXG4gICAgICAgICAgY3VyLmNvZGVnZW5Ob2RlLFxuICAgICAgICAgIHRydWVcbiAgICAgICAgICAvKiBpc1ZOb2RlICovXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxufTtcblxuY29uc3QgdHJhbnNmb3JtTW9kZWwgPSAoZGlyLCBub2RlLCBjb250ZXh0KSA9PiB7XG4gIGNvbnN0IHsgZXhwLCBhcmcgfSA9IGRpcjtcbiAgaWYgKCFleHApIHtcbiAgICBjb250ZXh0Lm9uRXJyb3IoXG4gICAgICBjcmVhdGVDb21waWxlckVycm9yKDQxLCBkaXIubG9jKVxuICAgICk7XG4gICAgcmV0dXJuIGNyZWF0ZVRyYW5zZm9ybVByb3BzKCk7XG4gIH1cbiAgY29uc3QgcmF3RXhwID0gZXhwLmxvYy5zb3VyY2U7XG4gIGNvbnN0IGV4cFN0cmluZyA9IGV4cC50eXBlID09PSA0ID8gZXhwLmNvbnRlbnQgOiByYXdFeHA7XG4gIGNvbnN0IGJpbmRpbmdUeXBlID0gY29udGV4dC5iaW5kaW5nTWV0YWRhdGFbcmF3RXhwXTtcbiAgaWYgKGJpbmRpbmdUeXBlID09PSBcInByb3BzXCIgfHwgYmluZGluZ1R5cGUgPT09IFwicHJvcHMtYWxpYXNlZFwiKSB7XG4gICAgY29udGV4dC5vbkVycm9yKGNyZWF0ZUNvbXBpbGVyRXJyb3IoNDQsIGV4cC5sb2MpKTtcbiAgICByZXR1cm4gY3JlYXRlVHJhbnNmb3JtUHJvcHMoKTtcbiAgfVxuICBjb25zdCBtYXliZVJlZiA9IGZhbHNlO1xuICBpZiAoIWV4cFN0cmluZy50cmltKCkgfHwgIWlzTWVtYmVyRXhwcmVzc2lvbihleHBTdHJpbmcpICYmICFtYXliZVJlZikge1xuICAgIGNvbnRleHQub25FcnJvcihcbiAgICAgIGNyZWF0ZUNvbXBpbGVyRXJyb3IoNDIsIGV4cC5sb2MpXG4gICAgKTtcbiAgICByZXR1cm4gY3JlYXRlVHJhbnNmb3JtUHJvcHMoKTtcbiAgfVxuICBjb25zdCBwcm9wTmFtZSA9IGFyZyA/IGFyZyA6IGNyZWF0ZVNpbXBsZUV4cHJlc3Npb24oXCJtb2RlbFZhbHVlXCIsIHRydWUpO1xuICBjb25zdCBldmVudE5hbWUgPSBhcmcgPyBpc1N0YXRpY0V4cChhcmcpID8gYG9uVXBkYXRlOiR7Y2FtZWxpemUoYXJnLmNvbnRlbnQpfWAgOiBjcmVhdGVDb21wb3VuZEV4cHJlc3Npb24oWydcIm9uVXBkYXRlOlwiICsgJywgYXJnXSkgOiBgb25VcGRhdGU6bW9kZWxWYWx1ZWA7XG4gIGxldCBhc3NpZ25tZW50RXhwO1xuICBjb25zdCBldmVudEFyZyA9IGNvbnRleHQuaXNUUyA/IGAoJGV2ZW50OiBhbnkpYCA6IGAkZXZlbnRgO1xuICB7XG4gICAgYXNzaWdubWVudEV4cCA9IGNyZWF0ZUNvbXBvdW5kRXhwcmVzc2lvbihbXG4gICAgICBgJHtldmVudEFyZ30gPT4gKChgLFxuICAgICAgZXhwLFxuICAgICAgYCkgPSAkZXZlbnQpYFxuICAgIF0pO1xuICB9XG4gIGNvbnN0IHByb3BzID0gW1xuICAgIC8vIG1vZGVsVmFsdWU6IGZvb1xuICAgIGNyZWF0ZU9iamVjdFByb3BlcnR5KHByb3BOYW1lLCBkaXIuZXhwKSxcbiAgICAvLyBcIm9uVXBkYXRlOm1vZGVsVmFsdWVcIjogJGV2ZW50ID0+IChmb28gPSAkZXZlbnQpXG4gICAgY3JlYXRlT2JqZWN0UHJvcGVydHkoZXZlbnROYW1lLCBhc3NpZ25tZW50RXhwKVxuICBdO1xuICBpZiAoZGlyLm1vZGlmaWVycy5sZW5ndGggJiYgbm9kZS50YWdUeXBlID09PSAxKSB7XG4gICAgY29uc3QgbW9kaWZpZXJzID0gZGlyLm1vZGlmaWVycy5tYXAoKG0pID0+IChpc1NpbXBsZUlkZW50aWZpZXIobSkgPyBtIDogSlNPTi5zdHJpbmdpZnkobSkpICsgYDogdHJ1ZWApLmpvaW4oYCwgYCk7XG4gICAgY29uc3QgbW9kaWZpZXJzS2V5ID0gYXJnID8gaXNTdGF0aWNFeHAoYXJnKSA/IGA
20578ke2FyZy5jb250ZW50fU1vZGlmaWVyc2AgOiBjcmVhdGVDb21wb3VuZEV4cHJlc3Npb24oW2FyZywgJyArIFwiTW9kaWZpZXJzXCInXSkgOiBgbW9kZWxNb2RpZmllcnNgO1xuICAgIHByb3BzLnB1c2goXG4gICAgICBjcmVhdGVPYmplY3RQcm9wZXJ0eShcbiAgICAgICAgbW9kaWZpZXJzS2V5LFxuICAgICAgICBjcmVhdGVTaW1wbGVFeHByZXNzaW9uKFxuICAgICAgICAgIGB7ICR7bW9kaWZpZXJzfSB9YCxcbiAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICBkaXIubG9jLFxuICAgICAgICAgIDJcbiAgICAgICAgKVxuICAgICAgKVxuICAgICk7XG4gIH1cbiAgcmV0dXJuIGNyZWF0ZVRyYW5zZm9ybVByb3BzKHByb3BzKTtcbn07XG5mdW5jdGlvbiBjcmVhdGVUcmFuc2Zvcm1Qcm9wcyhwcm9wcyA9IFtdKSB7XG4gIHJldHVybiB7IHByb3BzIH07XG59XG5cbmNvbnN0IHZhbGlkRGl2aXNpb25DaGFyUkUgPSAvW1xcdykuK1xcLV8kXFxdXS87XG5jb25zdCB0cmFuc2Zvcm1GaWx0ZXIgPSAobm9kZSwgY29udGV4dCkgPT4ge1xuICBpZiAoIWlzQ29tcGF0RW5hYmxlZChcIkNPTVBJTEVSX0ZJTFRFUlNcIiwgY29udGV4dCkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKG5vZGUudHlwZSA9PT0gNSkge1xuICAgIHJld3JpdGVGaWx0ZXIobm9kZS5jb250ZW50LCBjb250ZXh0KTtcbiAgfSBlbHNlIGlmIChub2RlLnR5cGUgPT09IDEpIHtcbiAgICBub2RlLnByb3BzLmZvckVhY2goKHByb3ApID0+IHtcbiAgICAgIGlmIChwcm9wLnR5cGUgPT09IDcgJiYgcHJvcC5uYW1lICE9PSBcImZvclwiICYmIHByb3AuZXhwKSB7XG4gICAgICAgIHJld3JpdGVGaWx0ZXIocHJvcC5leHAsIGNvbnRleHQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59O1xuZnVuY3Rpb24gcmV3cml0ZUZpbHRlcihub2RlLCBjb250ZXh0KSB7XG4gIGlmIChub2RlLnR5cGUgPT09IDQpIHtcbiAgICBwYXJzZUZpbHRlcihub2RlLCBjb250ZXh0KTtcbiAgfSBlbHNlIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGUuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGNoaWxkID0gbm9kZS5jaGlsZHJlbltpXTtcbiAgICAgIGlmICh0eXBlb2YgY2hpbGQgIT09IFwib2JqZWN0XCIpIGNvbnRpbnVlO1xuICAgICAgaWYgKGNoaWxkLnR5cGUgPT09IDQpIHtcbiAgICAgICAgcGFyc2VGaWx0ZXIoY2hpbGQsIGNvbnRleHQpO1xuICAgICAgfSBlbHNlIGlmIChjaGlsZC50eXBlID09PSA4KSB7XG4gICAgICAgIHJld3JpdGVGaWx0ZXIobm9kZSwgY29udGV4dCk7XG4gICAgICB9IGVsc2UgaWYgKGNoaWxkLnR5cGUgPT09IDUpIHtcbiAgICAgICAgcmV3cml0ZUZpbHRlcihjaGlsZC5jb250ZW50LCBjb250ZXh0KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHBhcnNlRmlsdGVyKG5vZGUsIGNvbnRleHQpIHtcbiAgY29uc3QgZXhwID0gbm9kZS5jb250ZW50O1xuICBsZXQgaW5TaW5nbGUgPSBmYWxzZTtcbiAgbGV0IGluRG91YmxlID0gZmFsc2U7XG4gIGxldCBpblRlbXBsYXRlU3RyaW5nID0gZmFsc2U7XG4gIGxldCBpblJlZ2V4ID0gZmFsc2U7XG4gIGxldCBjdXJseSA9IDA7XG4gIGxldCBzcXVhcmUgPSAwO1xuICBsZXQgcGFyZW4gPSAwO1xuICBsZXQgbGFzdEZpbHRlckluZGV4ID0gMDtcbiAgbGV0IGMsIHByZXYsIGksIGV4cHJlc3Npb24sIGZpbHRlcnMgPSBbXTtcbiAgZm9yIChpID0gMDsgaSA8IGV4cC5sZW5ndGg7IGkrKykge1xuICAgIHByZXYgPSBjO1xuICAgIGMgPSBleHAuY2hhckNvZGVBdChpKTtcbiAgICBpZiAoaW5TaW5nbGUpIHtcbiAgICAgIGlmIChjID09PSAzOSAmJiBwcmV2ICE9PSA5MikgaW5TaW5nbGUgPSBmYWxzZTtcbiAgICB9IGVsc2UgaWYgKGluRG91YmxlKSB7XG4gICAgICBpZiAoYyA9PT0gMzQgJiYgcHJldiAhPT0gOTIpIGluRG91YmxlID0gZmFsc2U7XG4gICAgfSBlbHNlIGlmIChpblRlbXBsYXRlU3RyaW5nKSB7XG4gICAgICBpZiAoYyA9PT0gOTYgJiYgcHJldiAhPT0gOTIpIGluVGVtcGxhdGVTdHJpbmcgPSBmYWxzZTtcbiAgICB9IGVsc2UgaWYgKGluUmVnZXgpIHtcbiAgICAgIGlmIChjID09PSA0NyAmJiBwcmV2ICE9PSA5MikgaW5SZWdleCA9IGZhbHNlO1xuICAgIH0gZWxzZSBpZiAoYyA9PT0gMTI0ICYmIC8vIHBpcGVcbiAgICBleHAuY2hhckNvZGVBdChpICsgMSkgIT09IDEyNCAmJiBleHAuY2hhckNvZGVBdChpIC0gMSkgIT09IDEyNCAmJiAhY3VybHkgJiYgIXNxdWFyZSAmJiAhcGFyZW4pIHtcbiAgICAgIGlmIChleHByZXNzaW9uID09PSB2b2lkIDApIHtcbiAgICAgICAgbGFzdEZpbHRlckluZGV4ID0gaSArIDE7XG4gICAgICAgIGV4cHJlc3Npb24gPSBleHAuc2xpY2UoMCwgaSkudHJpbSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcHVzaEZpbHRlcigpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzd2l0Y2ggKGMpIHtcbiAgICAgICAgY2FzZSAzNDpcbiAgICAgICAgICBpbkRvdWJsZSA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMzk6XG4gICAgICAgICAgaW5TaW5nbGUgPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDk2OlxuICAgICAgICAgIGluVGVtcGxhdGVTdHJpbmcgPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDQwOlxuICAgICAgICAgIHBhcmVuKys7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgNDE6XG4gICAgICAgICAgcGFyZW4tLTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA5MTpcbiAgICAgICAgICBzcXVhcmUrKztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA5MzpcbiAgICAgICAgICBzcXVhcmUtLTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxMjM6XG4gICAgICAgICAgY3VybHkrKztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxMjU6XG4gICAgICAgICAgY3VybHktLTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGlmIChjID09PSA0Nykge1xuICAgICAgICBsZXQgaiA9IGkgLSAxO1xuICAgICAgICBsZXQgcDtcbiAgICAgICAgZm9yICg7IGogPj0gMDsgai0tKSB7XG4gICAgICAgICAgcCA9IGV4cC5jaGFyQXQoaik7XG4gICAgICAgICAgaWYgKHAgIT09IFwiIFwiKSBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXAgfHwgIXZhbGlkRGl2aXNpb25DaGFyUkUudGVzdChwKSkge1xuICAgICAgICAgIGluUmVnZXggPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmIChleHByZXNzaW9uID09PSB2b2lkIDApIHtcbiAgICBleHByZXNzaW9uID0gZXhwLnNsaWNlKDAsIGkpLnRyaW0oKTtcbiAgfSBlbHNlIGlmIChsYXN0RmlsdGVySW5kZXggIT09IDApIHtcbiAgICBwdXNoRmlsdGVyKCk7XG4gIH1cbiAgZnVuY3Rpb24gcHVzaEZpbHRlcigpIHtcbiAgICBmaWx0ZXJzLnB1c2goZXhwLnNsaWNlKGxhc3RGaWx0ZXJJbmRleCwgaSkudHJpbSgpKTtcbiAgICBsYXN0RmlsdGVySW5kZXggPSBpICsgMTtcbiAgfVxuICBpZiAoZmlsdGVycy5sZW5ndGgpIHtcbiAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9k
20578dWN0aW9uXCIpICYmIHdhcm5EZXByZWNhdGlvbihcbiAgICAgIFwiQ09NUElMRVJfRklMVEVSU1wiLFxuICAgICAgY29udGV4dCxcbiAgICAgIG5vZGUubG9jXG4gICAgKTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgZmlsdGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgZXhwcmVzc2lvbiA9IHdyYXBGaWx0ZXIoZXhwcmVzc2lvbiwgZmlsdGVyc1tpXSwgY29udGV4dCk7XG4gICAgfVxuICAgIG5vZGUuY29udGVudCA9IGV4cHJlc3Npb247XG4gICAgbm9kZS5hc3QgPSB2b2lkIDA7XG4gIH1cbn1cbmZ1bmN0aW9uIHdyYXBGaWx0ZXIoZXhwLCBmaWx0ZXIsIGNvbnRleHQpIHtcbiAgY29udGV4dC5oZWxwZXIoUkVTT0xWRV9GSUxURVIpO1xuICBjb25zdCBpID0gZmlsdGVyLmluZGV4T2YoXCIoXCIpO1xuICBpZiAoaSA8IDApIHtcbiAgICBjb250ZXh0LmZpbHRlcnMuYWRkKGZpbHRlcik7XG4gICAgcmV0dXJuIGAke3RvVmFsaWRBc3NldElkKGZpbHRlciwgXCJmaWx0ZXJcIil9KCR7ZXhwfSlgO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IG5hbWUgPSBmaWx0ZXIuc2xpY2UoMCwgaSk7XG4gICAgY29uc3QgYXJncyA9IGZpbHRlci5zbGljZShpICsgMSk7XG4gICAgY29udGV4dC5maWx0ZXJzLmFkZChuYW1lKTtcbiAgICByZXR1cm4gYCR7dG9WYWxpZEFzc2V0SWQobmFtZSwgXCJmaWx0ZXJcIil9KCR7ZXhwfSR7YXJncyAhPT0gXCIpXCIgPyBcIixcIiArIGFyZ3MgOiBhcmdzfWA7XG4gIH1cbn1cblxuY29uc3Qgc2VlbiA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha1NldCgpO1xuY29uc3QgdHJhbnNmb3JtTWVtbyA9IChub2RlLCBjb250ZXh0KSA9PiB7XG4gIGlmIChub2RlLnR5cGUgPT09IDEpIHtcbiAgICBjb25zdCBkaXIgPSBmaW5kRGlyKG5vZGUsIFwibWVtb1wiKTtcbiAgICBpZiAoIWRpciB8fCBzZWVuLmhhcyhub2RlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzZWVuLmFkZChub2RlKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgY29uc3QgY29kZWdlbk5vZGUgPSBub2RlLmNvZGVnZW5Ob2RlIHx8IGNvbnRleHQuY3VycmVudE5vZGUuY29kZWdlbk5vZGU7XG4gICAgICBpZiAoY29kZWdlbk5vZGUgJiYgY29kZWdlbk5vZGUudHlwZSA9PT0gMTMpIHtcbiAgICAgICAgaWYgKG5vZGUudGFnVHlwZSAhPT0gMSkge1xuICAgICAgICAgIGNvbnZlcnRUb0Jsb2NrKGNvZGVnZW5Ob2RlLCBjb250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBub2RlLmNvZGVnZW5Ob2RlID0gY3JlYXRlQ2FsbEV4cHJlc3Npb24oY29udGV4dC5oZWxwZXIoV0lUSF9NRU1PKSwgW1xuICAgICAgICAgIGRpci5leHAsXG4gICAgICAgICAgY3JlYXRlRnVuY3Rpb25FeHByZXNzaW9uKHZvaWQgMCwgY29kZWdlbk5vZGUpLFxuICAgICAgICAgIGBfY2FjaGVgLFxuICAgICAgICAgIFN0cmluZyhjb250ZXh0LmNhY2hlZCsrKVxuICAgICAgICBdKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG59O1xuXG5mdW5jdGlvbiBnZXRCYXNlVHJhbnNmb3JtUHJlc2V0KHByZWZpeElkZW50aWZpZXJzKSB7XG4gIHJldHVybiBbXG4gICAgW1xuICAgICAgdHJhbnNmb3JtT25jZSxcbiAgICAgIHRyYW5zZm9ybUlmLFxuICAgICAgdHJhbnNmb3JtTWVtbyxcbiAgICAgIHRyYW5zZm9ybUZvcixcbiAgICAgIC4uLlt0cmFuc2Zvcm1GaWx0ZXJdICxcbiAgICAgIC4uLiEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBbdHJhbnNmb3JtRXhwcmVzc2lvbl0gOiBbXSxcbiAgICAgIHRyYW5zZm9ybVNsb3RPdXRsZXQsXG4gICAgICB0cmFuc2Zvcm1FbGVtZW50LFxuICAgICAgdHJhY2tTbG90U2NvcGVzLFxuICAgICAgdHJhbnNmb3JtVGV4dFxuICAgIF0sXG4gICAge1xuICAgICAgb246IHRyYW5zZm9ybU9uLFxuICAgICAgYmluZDogdHJhbnNmb3JtQmluZCxcbiAgICAgIG1vZGVsOiB0cmFuc2Zvcm1Nb2RlbFxuICAgIH1cbiAgXTtcbn1cbmZ1bmN0aW9uIGJhc2VDb21waWxlKHNvdXJjZSwgb3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IG9uRXJyb3IgPSBvcHRpb25zLm9uRXJyb3IgfHwgZGVmYXVsdE9uRXJyb3I7XG4gIGNvbnN0IGlzTW9kdWxlTW9kZSA9IG9wdGlvbnMubW9kZSA9PT0gXCJtb2R1bGVcIjtcbiAge1xuICAgIGlmIChvcHRpb25zLnByZWZpeElkZW50aWZpZXJzID09PSB0cnVlKSB7XG4gICAgICBvbkVycm9yKGNyZWF0ZUNvbXBpbGVyRXJyb3IoNDcpKTtcbiAgICB9IGVsc2UgaWYgKGlzTW9kdWxlTW9kZSkge1xuICAgICAgb25FcnJvcihjcmVhdGVDb21waWxlckVycm9yKDQ4KSk7XG4gICAgfVxuICB9XG4gIGNvbnN0IHByZWZpeElkZW50aWZpZXJzID0gZmFsc2U7XG4gIGlmIChvcHRpb25zLmNhY2hlSGFuZGxlcnMpIHtcbiAgICBvbkVycm9yKGNyZWF0ZUNvbXBpbGVyRXJyb3IoNDkpKTtcbiAgfVxuICBpZiAob3B0aW9ucy5zY29wZUlkICYmICFpc01vZHVsZU1vZGUpIHtcbiAgICBvbkVycm9yKGNyZWF0ZUNvbXBpbGVyRXJyb3IoNTApKTtcbiAgfVxuICBjb25zdCByZXNvbHZlZE9wdGlvbnMgPSBleHRlbmQoe30sIG9wdGlvbnMsIHtcbiAgICBwcmVmaXhJZGVudGlmaWVyc1xuICB9KTtcbiAgY29uc3QgYXN0ID0gaXNTdHJpbmcoc291cmNlKSA/IGJhc2VQYXJzZShzb3VyY2UsIHJlc29sdmVkT3B0aW9ucykgOiBzb3VyY2U7XG4gIGNvbnN0IFtub2RlVHJhbnNmb3JtcywgZGlyZWN0aXZlVHJhbnNmb3Jtc10gPSBnZXRCYXNlVHJhbnNmb3JtUHJlc2V0KCk7XG4gIHRyYW5zZm9ybShcbiAgICBhc3QsXG4gICAgZXh0ZW5kKHt9LCByZXNvbHZlZE9wdGlvbnMsIHtcbiAgICAgIG5vZGVUcmFuc2Zvcm1zOiBbXG4gICAgICAgIC4uLm5vZGVUcmFuc2Zvcm1zLFxuICAgICAgICAuLi5vcHRpb25zLm5vZGVUcmFuc2Zvcm1zIHx8IFtdXG4gICAgICAgIC8vIHVzZXIgdHJhbnNmb3Jtc1xuICAgICAgXSxcbiAgICAgIGRpcmVjdGl2ZVRyYW5zZm9ybXM6IGV4dGVuZChcbiAgICAgICAge30sXG4gICAgICAgIGRpcmVjdGl2ZVRyYW5zZm9ybXMsXG4gICAgICAgIG9wdGlvbnMuZGlyZWN0aXZlVHJhbnNmb3JtcyB8fCB7fVxuICAgICAgICAvLyB1c2VyIHRyYW5zZm9ybXNcbiAgICAgIClcbiAgICB9KVxuICApO1xuICByZXR1cm4gZ2VuZXJhdGUoYXN0LCByZXNvbHZlZE9wdGlvbnMpO1xufVxuXG5jb25zdCBCaW5kaW5nVHlwZXMgPSB7XG4gIFwiREFUQVwiOiBcImRhdGFcIixcbiAgXCJQUk9QU1wiOiBcInByb3BzXCIsXG4gIFwiUFJPUFNfQUxJQVNFRFwiOiBcInByb3BzLWFsaWFzZWRcIixcbiAgXCJTRVRVUF9MRVRcIjogXCJzZXR1cC1sZXRcIixcbiAgXCJTRVRVUF9DT05TVFwiOiBcInNldHVwLWNvbnN0XCIsXG4gIFwiU0VUVVBfUkVBQ1RJVkVfQ09OU1RcIjogXCJzZXR1cC1yZWFjdGl2ZS1jb25zdFwiLFxuICBcIlNFVFVQX01BWUJFX1JFRlwiOiBcInNldHVwLW1heWJlLXJlZlwiLFxuICBcIlNFVFVQX1JFRlwiOiBcInNldHVwLXJlZlwiLFxuICBcIk9QVElPTlNcIjogXCJvcHRpb25zXCIsXG4gIFwiTElURVJBTF9DT05TVFwiOiBcImxpdGVyYWwtY29uc3RcIlxufTtcblxuY29uc3Qgbm9vcERpcmVjdGl2ZVRyYW5zZm9ybSA9ICgpID0+ICh7IHByb3BzOiBbXSB9KTtcblxuZXhwb3J0IHsgQkFTRV9UUkFOU0lUSU9OLCBCaW5kaW5nVHlwZXMsIENBTUVMSVpFLCBDQVBJVEFMSVpFLCBDUkVBVEVfQkxPQ0ssIENSRUFURV9DT01NRU5ULCBDUkVBVEVfRUxFTUVOVF9CTE9DSywgQ1JFQVRFX0VMRU1FTlRfVk5PREUsIENSRUFURV9TTE9UUywgQ1JFQVRFX1NUQVRJQywgQ1JFQVRFX1RFWFQsIENSRUFURV9WTk9ERSwgQ29tcGlsZXJEZXByZWNhdGlvblR5cGVzLCBDb25zdGFudFR5cGVzLCBFbGVtZW50VHlwZXMsIEVycm9yQ29kZXMsIEZSQUdNRU5ULCBHVUFSRF9SRUFDVElWRV9QUk9QUywgSVNfTUVNT19TQU1FLCBJU19SRUYsIEtFRVBfQUxJVkUsIE1FUkdFX1BST1BTLCBOT1JNQUxJWkVfQ0xBU1MsIE5PUk1BTElaRV9QUk9QUywgTk9STUFMSVpFX1NUWUxFLCBOYW1lc3BhY2VzLCBOb2RlVHlwZXMsIE9QRU5fQkxPQ0ssIFBPUF9TQ09QRV9JRCwgUFVTSF9TQ09QRV9JRCwgUkVOREVSX0xJU1QsIFJFTkRFUl9TTE9ULCBSRVNPTFZFX0NPTVBPTkVOVCwgUkVTT0xWRV9ESVJFQ1RJVkUsIFJFU09MVkVfRFlOQU1JQ19DT01QT05FTlQsIFJFU09MVkVfRklMVEVSLCBTRVRfQkxPQ0tfVFJBQ0tJTkcsIFNVU1BFTlNFLCBURUxFUE9SVCwgVE9fRElTUExBWV9TVFJJTkcsIFRPX0hBTkRMRVJTLCBUT19IQU5ETEVSX0tFWSwgVFNfTk9ERV9UWVBFUywgVU5SRUYsIFdJVEhfQ1RYLCBXSVRIX0RJUkVDVElWRVMsIFdJVEhfTUVNTywgYWR2YW5jZVBvc2l0aW9uV2l0aENsb25lLCBhZHZhbmNlUG9zaXRpb25XaXRoTXV0YXRpb24sIGFzc2VydCwgYmFzZUNvbXBpbGUsIGJhc2VQYXJzZSwgYnVpbGREaXJlY3RpdmVBcmdzLCBidWlsZFByb3BzLCBidWlsZFNsb3RzLCBjaGVja0NvbXBhdEVuYWJsZWQsIGNvbnZlcnRUb0Jsb2NrLCBjcmVhdGVBcnJheUV4cHJlc3Npb24sIGNyZWF0ZUFzc2lnbm1lbnRFeHByZXNzaW9uLCBjcmVhdGVCbG9ja1N0YXRlbWVudCwgY3JlYXRlQ2FjaG
20578VFeHByZXNzaW9uLCBjcmVhdGVDYWxsRXhwcmVzc2lvbiwgY3JlYXRlQ29tcGlsZXJFcnJvciwgY3JlYXRlQ29tcG91bmRFeHByZXNzaW9uLCBjcmVhdGVDb25kaXRpb25hbEV4cHJlc3Npb24sIGNyZWF0ZUZvckxvb3BQYXJhbXMsIGNyZWF0ZUZ1bmN0aW9uRXhwcmVzc2lvbiwgY3JlYXRlSWZTdGF0ZW1lbnQsIGNyZWF0ZUludGVycG9sYXRpb24sIGNyZWF0ZU9iamVjdEV4cHJlc3Npb24sIGNyZWF0ZU9iamVjdFByb3BlcnR5LCBjcmVhdGVSZXR1cm5TdGF0ZW1lbnQsIGNyZWF0ZVJvb3QsIGNyZWF0ZVNlcXVlbmNlRXhwcmVzc2lvbiwgY3JlYXRlU2ltcGxlRXhwcmVzc2lvbiwgY3JlYXRlU3RydWN0dXJhbERpcmVjdGl2ZVRyYW5zZm9ybSwgY3JlYXRlVGVtcGxhdGVMaXRlcmFsLCBjcmVhdGVUcmFuc2Zvcm1Db250ZXh0LCBjcmVhdGVWTm9kZUNhbGwsIGVycm9yTWVzc2FnZXMsIGV4dHJhY3RJZGVudGlmaWVycywgZmluZERpciwgZmluZFByb3AsIGZvckFsaWFzUkUsIGdlbmVyYXRlLCBnZXRCYXNlVHJhbnNmb3JtUHJlc2V0LCBnZXRDb25zdGFudFR5cGUsIGdldE1lbW9lZFZOb2RlQ2FsbCwgZ2V0Vk5vZGVCbG9ja0hlbHBlciwgZ2V0Vk5vZGVIZWxwZXIsIGhhc0R5bmFtaWNLZXlWQmluZCwgaGFzU2NvcGVSZWYsIGhlbHBlck5hbWVNYXAsIGluamVjdFByb3AsIGlzQ29yZUNvbXBvbmVudCwgaXNGdW5jdGlvblR5cGUsIGlzSW5EZXN0cnVjdHVyZUFzc2lnbm1lbnQsIGlzSW5OZXdFeHByZXNzaW9uLCBpc01lbWJlckV4cHJlc3Npb24sIGlzTWVtYmVyRXhwcmVzc2lvbkJyb3dzZXIsIGlzTWVtYmVyRXhwcmVzc2lvbk5vZGUsIGlzUmVmZXJlbmNlZElkZW50aWZpZXIsIGlzU2ltcGxlSWRlbnRpZmllciwgaXNTbG90T3V0bGV0LCBpc1N0YXRpY0FyZ09mLCBpc1N0YXRpY0V4cCwgaXNTdGF0aWNQcm9wZXJ0eSwgaXNTdGF0aWNQcm9wZXJ0eUtleSwgaXNUZW1wbGF0ZU5vZGUsIGlzVGV4dCQxIGFzIGlzVGV4dCwgaXNWU2xvdCwgbG9jU3R1Yiwgbm9vcERpcmVjdGl2ZVRyYW5zZm9ybSwgcHJvY2Vzc0V4cHJlc3Npb24sIHByb2Nlc3NGb3IsIHByb2Nlc3NJZiwgcHJvY2Vzc1Nsb3RPdXRsZXQsIHJlZ2lzdGVyUnVudGltZUhlbHBlcnMsIHJlc29sdmVDb21wb25lbnRUeXBlLCBzdHJpbmdpZnlFeHByZXNzaW9uLCB0b1ZhbGlkQXNzZXRJZCwgdHJhY2tTbG90U2NvcGVzLCB0cmFja1ZGb3JTbG90U2NvcGVzLCB0cmFuc2Zvcm0sIHRyYW5zZm9ybUJpbmQsIHRyYW5zZm9ybUVsZW1lbnQsIHRyYW5zZm9ybUV4cHJlc3Npb24sIHRyYW5zZm9ybU1vZGVsLCB0cmFuc2Zvcm1PbiwgdHJhdmVyc2VOb2RlLCB1bndyYXBUU05vZGUsIHdhbGtCbG9ja0RlY2xhcmF0aW9ucywgd2Fsa0Z1bmN0aW9uUGFyYW1zLCB3YWxrSWRlbnRpZmllcnMsIHdhcm5EZXByZWNhdGlvbiB9O1xuIiwiLyoqXG4qIEB2dWUvY29tcGlsZXItZG9tIHYzLjQuMzRcbiogKGMpIDIwMTgtcHJlc2VudCBZdXhpIChFdmFuKSBZb3UgYW5kIFZ1ZSBjb250cmlidXRvcnNcbiogQGxpY2Vuc2UgTUlUXG4qKi9cbmltcG9ydCB7IHJlZ2lzdGVyUnVudGltZUhlbHBlcnMsIGNyZWF0ZVNpbXBsZUV4cHJlc3Npb24sIGNyZWF0ZUNvbXBpbGVyRXJyb3IsIGNyZWF0ZU9iamVjdFByb3BlcnR5LCBnZXRDb25zdGFudFR5cGUsIGNyZWF0ZUNhbGxFeHByZXNzaW9uLCBUT19ESVNQTEFZX1NUUklORywgdHJhbnNmb3JtTW9kZWwgYXMgdHJhbnNmb3JtTW9kZWwkMSwgZmluZFByb3AsIGhhc0R5bmFtaWNLZXlWQmluZCwgZmluZERpciwgaXNTdGF0aWNBcmdPZiwgdHJhbnNmb3JtT24gYXMgdHJhbnNmb3JtT24kMSwgaXNTdGF0aWNFeHAsIGNyZWF0ZUNvbXBvdW5kRXhwcmVzc2lvbiwgY2hlY2tDb21wYXRFbmFibGVkLCBub29wRGlyZWN0aXZlVHJhbnNmb3JtLCBiYXNlQ29tcGlsZSwgYmFzZVBhcnNlIH0gZnJvbSAnQHZ1ZS9jb21waWxlci1jb3JlJztcbmV4cG9ydCAqIGZyb20gJ0B2dWUvY29tcGlsZXItY29yZSc7XG5pbXBvcnQgeyBpc1ZvaWRUYWcsIGlzSFRNTFRhZywgaXNTVkdUYWcsIGlzTWF0aE1MVGFnLCBwYXJzZVN0cmluZ1N0eWxlLCBjYXBpdGFsaXplLCBtYWtlTWFwLCBleHRlbmQgfSBmcm9tICdAdnVlL3NoYXJlZCc7XG5cbmNvbnN0IFZfTU9ERUxfUkFESU8gPSBTeW1ib2woISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IGB2TW9kZWxSYWRpb2AgOiBgYCk7XG5jb25zdCBWX01PREVMX0NIRUNLQk9YID0gU3ltYm9sKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBgdk1vZGVsQ2hlY2tib3hgIDogYGApO1xuY29uc3QgVl9NT0RFTF9URVhUID0gU3ltYm9sKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBgdk1vZGVsVGV4dGAgOiBgYCk7XG5jb25zdCBWX01PREVMX1NFTEVDVCA9IFN5bWJvbCghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8gYHZNb2RlbFNlbGVjdGAgOiBgYCk7XG5jb25zdCBWX01PREVMX0RZTkFNSUMgPSBTeW1ib2woISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IGB2TW9kZWxEeW5hbWljYCA6IGBgKTtcbmNvbnN0IFZfT05fV0lUSF9NT0RJRklFUlMgPSBTeW1ib2woISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IGB2T25Nb2RpZmllcnNHdWFyZGAgOiBgYCk7XG5jb25zdCBWX09OX1dJVEhfS0VZUyA9IFN5bWJvbCghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8gYHZPbktleXNHdWFyZGAgOiBgYCk7XG5jb25zdCBWX1NIT1cgPSBTeW1ib2woISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IGB2U2hvd2AgOiBgYCk7XG5jb25zdCBUUkFOU0lUSU9OID0gU3ltYm9sKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBgVHJhbnNpdGlvbmAgOiBgYCk7XG5jb25zdCBUUkFOU0lUSU9OX0dST1VQID0gU3ltYm9sKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBgVHJhbnNpdGlvbkdyb3VwYCA6IGBgKTtcbnJlZ2lzdGVyUnVudGltZUhlbHBlcnMoe1xuICBbVl9NT0RFTF9SQURJT106IGB2TW9kZWxSYWRpb2AsXG4gIFtWX01PREVMX0NIRUNLQk9YXTogYHZNb2RlbENoZWNrYm94YCxcbiAgW1ZfTU9ERUxfVEVYVF06IGB2TW9kZWxUZXh0YC
20578xcbiAgW1ZfTU9ERUxfU0VMRUNUXTogYHZNb2RlbFNlbGVjdGAsXG4gIFtWX01PREVMX0RZTkFNSUNdOiBgdk1vZGVsRHluYW1pY2AsXG4gIFtWX09OX1dJVEhfTU9ESUZJRVJTXTogYHdpdGhNb2RpZmllcnNgLFxuICBbVl9PTl9XSVRIX0tFWVNdOiBgd2l0aEtleXNgLFxuICBbVl9TSE9XXTogYHZTaG93YCxcbiAgW1RSQU5TSVRJT05dOiBgVHJhbnNpdGlvbmAsXG4gIFtUUkFOU0lUSU9OX0dST1VQXTogYFRyYW5zaXRpb25Hcm91cGBcbn0pO1xuXG5sZXQgZGVjb2RlcjtcbmZ1bmN0aW9uIGRlY29kZUh0bWxCcm93c2VyKHJhdywgYXNBdHRyID0gZmFsc2UpIHtcbiAgaWYgKCFkZWNvZGVyKSB7XG4gICAgZGVjb2RlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gIH1cbiAgaWYgKGFzQXR0cikge1xuICAgIGRlY29kZXIuaW5uZXJIVE1MID0gYDxkaXYgZm9vPVwiJHtyYXcucmVwbGFjZSgvXCIvZywgXCImcXVvdDtcIil9XCI+YDtcbiAgICByZXR1cm4gZGVjb2Rlci5jaGlsZHJlblswXS5nZXRBdHRyaWJ1dGUoXCJmb29cIik7XG4gIH0gZWxzZSB7XG4gICAgZGVjb2Rlci5pbm5lckhUTUwgPSByYXc7XG4gICAgcmV0dXJuIGRlY29kZXIudGV4dENvbnRlbnQ7XG4gIH1cbn1cblxuY29uc3QgcGFyc2VyT3B0aW9ucyA9IHtcbiAgcGFyc2VNb2RlOiBcImh0bWxcIixcbiAgaXNWb2lkVGFnLFxuICBpc05hdGl2ZVRhZzogKHRhZykgPT4gaXNIVE1MVGFnKHRhZykgfHwgaXNTVkdUYWcodGFnKSB8fCBpc01hdGhNTFRhZyh0YWcpLFxuICBpc1ByZVRhZzogKHRhZykgPT4gdGFnID09PSBcInByZVwiLFxuICBkZWNvZGVFbnRpdGllczogZGVjb2RlSHRtbEJyb3dzZXIgLFxuICBpc0J1aWx0SW5Db21wb25lbnQ6ICh0YWcpID0+IHtcbiAgICBpZiAodGFnID09PSBcIlRyYW5zaXRpb25cIiB8fCB0YWcgPT09IFwidHJhbnNpdGlvblwiKSB7XG4gICAgICByZXR1cm4gVFJBTlNJVElPTjtcbiAgICB9IGVsc2UgaWYgKHRhZyA9PT0gXCJUcmFuc2l0aW9uR3JvdXBcIiB8fCB0YWcgPT09IFwidHJhbnNpdGlvbi1ncm91cFwiKSB7XG4gICAgICByZXR1cm4gVFJBTlNJVElPTl9HUk9VUDtcbiAgICB9XG4gIH0sXG4gIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3BhcnNpbmcuaHRtbCN0cmVlLWNvbnN0cnVjdGlvbi1kaXNwYXRjaGVyXG4gIGdldE5hbWVzcGFjZSh0YWcsIHBhcmVudCwgcm9vdE5hbWVzcGFjZSkge1xuICAgIGxldCBucyA9IHBhcmVudCA/IHBhcmVudC5ucyA6IHJvb3ROYW1lc3BhY2U7XG4gICAgaWYgKHBhcmVudCAmJiBucyA9PT0gMikge1xuICAgICAgaWYgKHBhcmVudC50YWcgPT09IFwiYW5ub3RhdGlvbi14bWxcIikge1xuICAgICAgICBpZiAodGFnID09PSBcInN2Z1wiKSB7XG4gICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcmVudC5wcm9wcy5zb21lKFxuICAgICAgICAgIChhKSA9PiBhLnR5cGUgPT09IDYgJiYgYS5uYW1lID09PSBcImVuY29kaW5nXCIgJiYgYS52YWx1ZSAhPSBudWxsICYmIChhLnZhbHVlLmNvbnRlbnQgPT09IFwidGV4dC9odG1sXCIgfHwgYS52YWx1ZS5jb250ZW50ID09PSBcImFwcGxpY2F0aW9uL3hodG1sK3htbFwiKVxuICAgICAgICApKSB7XG4gICAgICAgICAgbnMgPSAwO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKC9ebSg/Oltpb25zXXx0ZXh0KSQvLnRlc3QocGFyZW50LnRhZykgJiYgdGFnICE9PSBcIm1nbHlwaFwiICYmIHRhZyAhPT0gXCJtYWxpZ25tYXJrXCIpIHtcbiAgICAgICAgbnMgPSAwO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocGFyZW50ICYmIG5zID09PSAxKSB7XG4gICAgICBpZiAocGFyZW50LnRhZyA9PT0gXCJmb3JlaWduT2JqZWN0XCIgfHwgcGFyZW50LnRhZyA9PT0gXCJkZXNjXCIgfHwgcGFyZW50LnRhZyA9PT0gXCJ0aXRsZVwiKSB7XG4gICAgICAgIG5zID0gMDtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKG5zID09PSAwKSB7XG4gICAgICBpZiAodGFnID09PSBcInN2Z1wiKSB7XG4gICAgICAgIHJldHVybiAxO1xuICAgICAgfVxuICAgICAgaWYgKHRhZyA9PT0gXCJtYXRoXCIpIHtcbiAgICAgICAgcmV0dXJuIDI7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBucztcbiAgfVxufTtcblxuY29uc3QgdHJhbnNmb3JtU3R5bGUgPSAobm9kZSkgPT4ge1xuICBpZiAobm9kZS50eXBlID09PSAxKSB7XG4gICAgbm9kZS5wcm9wcy5mb3JFYWNoKChwLCBpKSA9PiB7XG4gICAgICBpZiAocC50eXBlID09PSA2ICYmIHAubmFtZSA9PT0gXCJzdHlsZVwiICYmIHAudmFsdWUpIHtcbiAgICAgICAgbm9kZS5wcm9wc1tpXSA9IHtcbiAgICAgICAgICB0eXBlOiA3LFxuICAgICAgICAgIG5hbWU6IGBiaW5kYCxcbiAgICAgICAgICBhcmc6IGNyZWF0ZVNpbXBsZUV4cHJlc3Npb24oYHN0eWxlYCwgdHJ1ZSwgcC5sb2MpLFxuICAgICAgICAgIGV4cDogcGFyc2VJbmxpbmVDU1MocC52YWx1ZS5jb250ZW50LCBwLmxvYyksXG4gICAgICAgICAgbW9kaWZpZXJzOiBbXSxcbiAgICAgICAgICBsb2M6IHAubG9jXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn07XG5jb25zdCBwYXJzZUlubGluZUNTUyA9IChjc3NUZXh0LCBsb2MpID0+IHtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IHBhcnNlU3RyaW5nU3R5bGUoY3NzVGV4dCk7XG4gIHJldHVybiBjcmVhdGVTaW1wbGVFeHByZXNzaW9uKFxuICAgIEpTT04uc3RyaW5naWZ5KG5vcm1hbGl6ZWQpLFxuICAgIGZhbHNlLFxuICAgIGxvYyxcbiAgICAzXG4gICk7XG59O1xuXG5mdW5jdGlvbiBjcmVhdGVET01Db21waWxlckVycm9yKGNvZGUsIGxvYykge1xuICByZXR1cm4gY3JlYXRlQ29tcGlsZXJFcnJvcihcbiAgICBjb2RlLFxuICAgIGxvYyxcbiAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHx8IGZhbHNlID8gRE9NRXJyb3JNZXNzYWdlcyA6IHZvaWQgMFxuICApO1xufVxuY29uc3QgRE9NRXJyb3JDb2RlcyA9IHtcbiAgXCJYX1ZfSFRNTF9OT19FWFBSRVNTSU9OXCI6IDUzLFxuICBcIjUzXCI6IFwiWF9WX0hUTUxfTk9fRVhQUkVTU0lPTlwiLFxuICBcIlhfVl9IVE1MX1dJVEhfQ0hJTERSRU5cIjogNTQsXG4gIFwiNTRcIjogXCJYX1ZfSFRNTF9XSVRIX0NISUxEUkVOXCIsXG4gIFwiWF9WX1RFWFRfTk9fRVhQUkVTU0lPTlwiOiA1NSxcbiAgXCI1NVwiOiBcIlhfVl9URVhUX05PX0VYUFJFU1NJT05cIixcbiAgXCJYX1ZfVEVYVF9XSVRIX0NISUxEUkVOXCI6IDU2LFxuICBcIjU2XCI6IFwiWF9WX1RFWFRfV0lUSF9DSElMRFJFTlwiLFxuICBcIlhfVl9NT0RFTF9PTl9JTlZBTElEX0VMRU1FTlRcIjogNTcsXG4gIFwiNTdcIjogXCJYX1ZfTU9ERUxfT05fSU5WQUxJRF9FTEVNRU5UXCIsXG4gIFwiWF9WX01PREVMX0FSR19PTl9FTEVNRU5UXCI6IDU4LFxuICBcIjU4XCI6IFwiWF9WX01PREVMX0FSR19PTl9FTEVNRU5UXCIsXG4gIFwiWF9WX01PREVMX09OX0ZJTEVfSU5QVVRfRUxFTUVOVFwiOiA1OSxcbiAgXCI1OVwiOiBcIlhfVl9NT0RFTF9PTl9GSUxFX0lOUFVUX0VMRU1FTlRcIixcbiAgXCJYX1ZfTU9ERUxfVU5ORUNFU1NBUllfVkFMVUVcIjogNjAsXG4gIFwiNjBcIjogXCJYX1ZfTU9ERUxfVU5ORUNFU1NBUllfVkFMVUVcIixcbiAgXCJYX1ZfU0hPV19OT19FWFBSRVNTSU9OXCI6IDYxLFxuICBcIjYxXCI6IFwiWF9WX1NIT1dfTk9fRVhQUkVTU0lPTlwiLFxuICBcIlhfVFJBTlNJVElPTl9JTlZBTElEX0NISUxEUkVOXCI6IDYyLFxuICBcIjYyXCI6IFwiWF9UUkFOU0lUSU9OX0lOVkFMSURfQ0hJTERSRU5cIixcbiAgXCJYX0lHTk9SRURfU0lERV9FRkZFQ1RfVEFHXCI6IDYzLFxuICBcIjYzXCI6IFwiWF9JR05PUkVEX1NJREVfRUZGRUNUX1RBR1wiLFxuICBcIl9fRVhURU5EX1BPSU5UX19cIjogNjQsXG4gIFwiNjRcIjogXCJfX0VYVEVORF9QT0lOVF9fXCJcbn07XG5jb25zdCBET01FcnJvck1lc3NhZ2VzID0ge1xuICBbNTNdOiBgdi1odG1sIGlzIG1pc3NpbmcgZXhwcmVzc2lvbi5gLFxuICBbNTRdOiBgdi1odG1sIHdpbGwgb3ZlcnJpZGUgZWxlbWVudCBjaGlsZHJlbi5gLFxuICBbNTVdOiBgdi10ZXh0IGlzIG1pc3NpbmcgZXhwcmVzc2lvbi5gLFxuICBbNTZdOiBgdi10ZXh0IHdpbGwgb3ZlcnJpZGUgZWxlbWVudCBjaGlsZHJlbi5gLFxuICBbNTddOiBgdi1tb2RlbCBjYW4gb25seSBiZSB1c2VkIG9uIDxpbnB1dD4sIDx0ZXh0YXJlYT4gYW5kIDxzZWxlY3Q+IGVsZW1lbnRzLmAsXG4gIFs1OF06IGB2LW1vZGVsIGFyZ3VtZW50IGlzIG5vdCBzdXBwb3J0ZWQgb24gcGxhaW4gZWxlbWVudHMuYCxcbiAgWzU5XTogYHYtbW9kZWwgY2Fubm90IGJlIHVzZWQgb24gZmlsZSBpbnB1dHMgc2luY2UgdGhleSBhcmUgcmVhZC1vbmx5LiBVc2UgYSB2LW9uOmNoYW5nZSBsaXN0ZW5lciBpbnN0ZWFkLmAsXG4gIFs2MF06IGBVbm5lY2Vzc2FyeSB2YWx1ZSBiaW5kaW5nIHVzZWQgYWxvbmdzaWRlIHYtbW9kZWwuIEl0IHdpbGwgaW50ZXJmZXJlIHdpdGggdi1tb2RlbCdzIGJlaGF2aW9yLmAsXG4gIFs2MV06IGB2LXNob3cgaXMgbWlzc2luZyBleHByZXNzaW9uLmAsXG4gIFs2Ml06IGA8VHJhbnNpdGlvbj4gZXhwZWN0cyBleGFjdGx5IG9uZSBjaGlsZCBlbGVtZW50IG9yIGNvbXBvbmVudC5gLFxuICBbNjNdOiBgVGFncyB3aXRoIHNpZGUgZWZmZWN0ICg8c2NyaXB0PiBhbmQgPHN0eWxlPikgYXJlIGlnbm9yZWQgaW4gY2xpZW50IGNvbXBvbmVudCB0ZW1wbGF0ZXMuYFxufTtcblxuY29uc3QgdHJhbnNmb3JtVkh0bWwgPSAoZGlyLCBub2Rl
20578LCBjb250ZXh0KSA9PiB7XG4gIGNvbnN0IHsgZXhwLCBsb2MgfSA9IGRpcjtcbiAgaWYgKCFleHApIHtcbiAgICBjb250ZXh0Lm9uRXJyb3IoXG4gICAgICBjcmVhdGVET01Db21waWxlckVycm9yKDUzLCBsb2MpXG4gICAgKTtcbiAgfVxuICBpZiAobm9kZS5jaGlsZHJlbi5sZW5ndGgpIHtcbiAgICBjb250ZXh0Lm9uRXJyb3IoXG4gICAgICBjcmVhdGVET01Db21waWxlckVycm9yKDU0LCBsb2MpXG4gICAgKTtcbiAgICBub2RlLmNoaWxkcmVuLmxlbmd0aCA9IDA7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBwcm9wczogW1xuICAgICAgY3JlYXRlT2JqZWN0UHJvcGVydHkoXG4gICAgICAgIGNyZWF0ZVNpbXBsZUV4cHJlc3Npb24oYGlubmVySFRNTGAsIHRydWUsIGxvYyksXG4gICAgICAgIGV4cCB8fCBjcmVhdGVTaW1wbGVFeHByZXNzaW9uKFwiXCIsIHRydWUpXG4gICAgICApXG4gICAgXVxuICB9O1xufTtcblxuY29uc3QgdHJhbnNmb3JtVlRleHQgPSAoZGlyLCBub2RlLCBjb250ZXh0KSA9PiB7XG4gIGNvbnN0IHsgZXhwLCBsb2MgfSA9IGRpcjtcbiAgaWYgKCFleHApIHtcbiAgICBjb250ZXh0Lm9uRXJyb3IoXG4gICAgICBjcmVhdGVET01Db21waWxlckVycm9yKDU1LCBsb2MpXG4gICAgKTtcbiAgfVxuICBpZiAobm9kZS5jaGlsZHJlbi5sZW5ndGgpIHtcbiAgICBjb250ZXh0Lm9uRXJyb3IoXG4gICAgICBjcmVhdGVET01Db21waWxlckVycm9yKDU2LCBsb2MpXG4gICAgKTtcbiAgICBub2RlLmNoaWxkcmVuLmxlbmd0aCA9IDA7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBwcm9wczogW1xuICAgICAgY3JlYXRlT2JqZWN0UHJvcGVydHkoXG4gICAgICAgIGNyZWF0ZVNpbXBsZUV4cHJlc3Npb24oYHRleHRDb250ZW50YCwgdHJ1ZSksXG4gICAgICAgIGV4cCA/IGdldENvbnN0YW50VHlwZShleHAsIGNvbnRleHQpID4gMCA/IGV4cCA6IGNyZWF0ZUNhbGxFeHByZXNzaW9uKFxuICAgICAgICAgIGNvbnRleHQuaGVscGVyU3RyaW5nKFRPX0RJU1BMQVlfU1RSSU5HKSxcbiAgICAgICAgICBbZXhwXSxcbiAgICAgICAgICBsb2NcbiAgICAgICAgKSA6IGNyZWF0ZVNpbXBsZUV4cHJlc3Npb24oXCJcIiwgdHJ1ZSlcbiAgICAgIClcbiAgICBdXG4gIH07XG59O1xuXG5jb25zdCB0cmFuc2Zvcm1Nb2RlbCA9IChkaXIsIG5vZGUsIGNvbnRleHQpID0+IHtcbiAgY29uc3QgYmFzZVJlc3VsdCA9IHRyYW5zZm9ybU1vZGVsJDEoZGlyLCBub2RlLCBjb250ZXh0KTtcbiAgaWYgKCFiYXNlUmVzdWx0LnByb3BzLmxlbmd0aCB8fCBub2RlLnRhZ1R5cGUgPT09IDEpIHtcbiAgICByZXR1cm4gYmFzZVJlc3VsdDtcbiAgfVxuICBpZiAoZGlyLmFyZykge1xuICAgIGNvbnRleHQub25FcnJvcihcbiAgICAgIGNyZWF0ZURPTUNvbXBpbGVyRXJyb3IoXG4gICAgICAgIDU4LFxuICAgICAgICBkaXIuYXJnLmxvY1xuICAgICAgKVxuICAgICk7XG4gIH1cbiAgZnVuY3Rpb24gY2hlY2tEdXBsaWNhdGVkVmFsdWUoKSB7XG4gICAgY29uc3QgdmFsdWUgPSBmaW5kRGlyKG5vZGUsIFwiYmluZFwiKTtcbiAgICBpZiAodmFsdWUgJiYgaXNTdGF0aWNBcmdPZih2YWx1ZS5hcmcsIFwidmFsdWVcIikpIHtcbiAgICAgIGNvbnRleHQub25FcnJvcihcbiAgICAgICAgY3JlYXRlRE9NQ29tcGlsZXJFcnJvcihcbiAgICAgICAgICA2MCxcbiAgICAgICAgICB2YWx1ZS5sb2NcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgY29uc3QgeyB0YWcgfSA9IG5vZGU7XG4gIGNvbnN0IGlzQ3VzdG9tRWxlbWVudCA9IGNvbnRleHQuaXNDdXN0b21FbGVtZW50KHRhZyk7XG4gIGlmICh0YWcgPT09IFwiaW5wdXRcIiB8fCB0YWcgPT09IFwidGV4dGFyZWFcIiB8fCB0YWcgPT09IFwic2VsZWN0XCIgfHwgaXNDdXN0b21FbGVtZW50KSB7XG4gICAgbGV0IGRpcmVjdGl2ZVRvVXNlID0gVl9NT0RFTF9URVhUO1xuICAgIGxldCBpc0ludmFsaWRUeXBlID0gZmFsc2U7XG4gICAgaWYgKHRhZyA9PT0gXCJpbnB1dFwiIHx8IGlzQ3VzdG9tRWxlbWVudCkge1xuICAgICAgY29uc3QgdHlwZSA9IGZpbmRQcm9wKG5vZGUsIGB0eXBlYCk7XG4gICAgICBpZiAodHlwZSkge1xuICAgICAgICBpZiAodHlwZS50eXBlID09PSA3KSB7XG4gICAgICAgICAgZGlyZWN0aXZlVG9Vc2UgPSBWX01PREVMX0RZTkFNSUM7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZS52YWx1ZSkge1xuICAgICAgICAgIHN3aXRjaCAodHlwZS52YWx1ZS5jb250ZW50KSB7XG4gICAgICAgICAgICBjYXNlIFwicmFkaW9cIjpcbiAgICAgICAgICAgICAgZGlyZWN0aXZlVG9Vc2UgPSBWX01PREVMX1JBRElPO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJjaGVja2JveFwiOlxuICAgICAgICAgICAgICBkaXJlY3RpdmVUb1VzZSA9IFZfTU9ERUxfQ0hFQ0tCT1g7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcImZpbGVcIjpcbiAgICAgICAgICAgICAgaXNJbnZhbGlkVHlwZSA9IHRydWU7XG4gICAgICAgICAgICAgIGNvbnRleHQub25FcnJvcihcbiAgICAgICAgICAgICAgICBjcmVhdGVET01Db21waWxlckVycm9yKFxuICAgICAgICAgICAgICAgICAgNTksXG4gICAgICAgICAgICAgICAgICBkaXIubG9jXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgY2hlY2tEdXBsaWNhdGVkVmFsdWUoKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGhhc0R5bmFtaWNLZXlWQmluZChub2RlKSkge1xuICAgICAgICBkaXJlY3RpdmVUb1VzZSA9IFZfTU9ERUxfRFlOQU1JQztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgY2hlY2tEdXBsaWNhdGVkVmFsdWUoKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRhZyA9PT0gXCJzZWxlY3RcIikge1xuICAgICAgZGlyZWN0aXZlVG9Vc2UgPSBWX01PREVMX1NFTEVDVDtcbiAgICB9IGVsc2Uge1xuICAgICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBjaGVja0R1cGxpY2F0ZWRWYWx1ZSgpO1xuICAgIH1cbiAgICBpZiAoIWlzSW52YWxpZFR5cGUpIHtcbiAgICAgIGJhc2VSZXN1bHQubmVlZFJ1bnRpbWUgPSBjb250ZXh0LmhlbHBlcihkaXJlY3RpdmVUb1VzZSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGNvbnRleHQub25FcnJvcihcbiAgICAgIGNyZWF0ZURPTUNvbXBpbGVyRXJyb3IoXG4gICAgICAgIDU3LFxuICAgICAgICBkaXIubG9jXG4gICAgICApXG4gICAgKTtcbiAgfVxuICBiYXNlUmVzdWx0LnByb3BzID0gYmFzZVJlc3VsdC5wcm9wcy5maWx0ZXIoXG4gICAgKHApID0+ICEocC5rZXkudHlwZSA9PT0gNCAmJiBwLmtleS5jb250ZW50ID09PSBcIm1vZGVsVmFsdWVcIilcbiAgKTtcbiAgcmV0dXJuIGJhc2VSZXN1bHQ7XG59O1xuXG5jb25zdCBpc0V2ZW50T3B0aW9uTW9kaWZpZXIgPSAvKiBAX19QVVJFX18gKi8gbWFrZU1hcChgcGFzc2l2ZSxvbmNlLGNhcHR1cmVgKTtcbmNvbnN0IGlzTm9uS2V5TW9kaWZpZXIgPSAvKiBAX19QVVJFX18gKi8gbWFrZU1hcChcbiAgLy8gZXZlbnQgcHJv
20578cGFnYXRpb24gbWFuYWdlbWVudFxuICBgc3RvcCxwcmV2ZW50LHNlbGYsY3RybCxzaGlmdCxhbHQsbWV0YSxleGFjdCxtaWRkbGVgXG4pO1xuY29uc3QgbWF5YmVLZXlNb2RpZmllciA9IC8qIEBfX1BVUkVfXyAqLyBtYWtlTWFwKFwibGVmdCxyaWdodFwiKTtcbmNvbnN0IGlzS2V5Ym9hcmRFdmVudCA9IC8qIEBfX1BVUkVfXyAqLyBtYWtlTWFwKFxuICBgb25rZXl1cCxvbmtleWRvd24sb25rZXlwcmVzc2AsXG4gIHRydWVcbik7XG5jb25zdCByZXNvbHZlTW9kaWZpZXJzID0gKGtleSwgbW9kaWZpZXJzLCBjb250ZXh0LCBsb2MpID0+IHtcbiAgY29uc3Qga2V5TW9kaWZpZXJzID0gW107XG4gIGNvbnN0IG5vbktleU1vZGlmaWVycyA9IFtdO1xuICBjb25zdCBldmVudE9wdGlvbk1vZGlmaWVycyA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG1vZGlmaWVycy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IG1vZGlmaWVyID0gbW9kaWZpZXJzW2ldO1xuICAgIGlmIChtb2RpZmllciA9PT0gXCJuYXRpdmVcIiAmJiBjaGVja0NvbXBhdEVuYWJsZWQoXG4gICAgICBcIkNPTVBJTEVSX1ZfT05fTkFUSVZFXCIsXG4gICAgICBjb250ZXh0LFxuICAgICAgbG9jXG4gICAgKSkge1xuICAgICAgZXZlbnRPcHRpb25Nb2RpZmllcnMucHVzaChtb2RpZmllcik7XG4gICAgfSBlbHNlIGlmIChpc0V2ZW50T3B0aW9uTW9kaWZpZXIobW9kaWZpZXIpKSB7XG4gICAgICBldmVudE9wdGlvbk1vZGlmaWVycy5wdXNoKG1vZGlmaWVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKG1heWJlS2V5TW9kaWZpZXIobW9kaWZpZXIpKSB7XG4gICAgICAgIGlmIChpc1N0YXRpY0V4cChrZXkpKSB7XG4gICAgICAgICAgaWYgKGlzS2V5Ym9hcmRFdmVudChrZXkuY29udGVudCkpIHtcbiAgICAgICAgICAgIGtleU1vZGlmaWVycy5wdXNoKG1vZGlmaWVyKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbm9uS2V5TW9kaWZpZXJzLnB1c2gobW9kaWZpZXIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBrZXlNb2RpZmllcnMucHVzaChtb2RpZmllcik7XG4gICAgICAgICAgbm9uS2V5TW9kaWZpZXJzLnB1c2gobW9kaWZpZXIpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoaXNOb25LZXlNb2RpZmllcihtb2RpZmllcikpIHtcbiAgICAgICAgICBub25LZXlNb2RpZmllcnMucHVzaChtb2RpZmllcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAga2V5TW9kaWZpZXJzLnB1c2gobW9kaWZpZXIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiB7XG4gICAga2V5TW9kaWZpZXJzLFxuICAgIG5vbktleU1vZGlmaWVycyxcbiAgICBldmVudE9wdGlvbk1vZGlmaWVyc1xuICB9O1xufTtcbmNvbnN0IHRyYW5zZm9ybUNsaWNrID0gKGtleSwgZXZlbnQpID0+IHtcbiAgY29uc3QgaXNTdGF0aWNDbGljayA9IGlzU3RhdGljRXhwKGtleSkgJiYga2V5LmNvbnRlbnQudG9Mb3dlckNhc2UoKSA9PT0gXCJvbmNsaWNrXCI7XG4gIHJldHVybiBpc1N0YXRpY0NsaWNrID8gY3JlYXRlU2ltcGxlRXhwcmVzc2lvbihldmVudCwgdHJ1ZSkgOiBrZXkudHlwZSAhPT0gNCA/IGNyZWF0ZUNvbXBvdW5kRXhwcmVzc2lvbihbXG4gICAgYChgLFxuICAgIGtleSxcbiAgICBgKSA9PT0gXCJvbkNsaWNrXCIgPyBcIiR7ZXZlbnR9XCIgOiAoYCxcbiAgICBrZXksXG4gICAgYClgXG4gIF0pIDoga2V5O1xufTtcbmNvbnN0IHRyYW5zZm9ybU9uID0gKGRpciwgbm9kZSwgY29udGV4dCkgPT4ge1xuICByZXR1cm4gdHJhbnNmb3JtT24kMShkaXIsIG5vZGUsIGNvbnRleHQsIChiYXNlUmVzdWx0KSA9PiB7XG4gICAgY29uc3QgeyBtb2RpZmllcnMgfSA9IGRpcjtcbiAgICBpZiAoIW1vZGlmaWVycy5sZW5ndGgpIHJldHVybiBiYXNlUmVzdWx0O1xuICAgIGxldCB7IGtleSwgdmFsdWU6IGhhbmRsZXJFeHAgfSA9IGJhc2VSZXN1bHQucHJvcHNbMF07XG4gICAgY29uc3QgeyBrZXlNb2RpZmllcnMsIG5vbktleU1vZGlmaWVycywgZXZlbnRPcHRpb25Nb2RpZmllcnMgfSA9IHJlc29sdmVNb2RpZmllcnMoa2V5LCBtb2RpZmllcnMsIGNvbnRleHQsIGRpci5sb2MpO1xuICAgIGlmIChub25LZXlNb2RpZmllcnMuaW5jbHVkZXMoXCJyaWdodFwiKSkge1xuICAgICAga2V5ID0gdHJhbnNmb3JtQ2xpY2soa2V5LCBgb25Db250ZXh0bWVudWApO1xuICAgIH1cbiAgICBpZiAobm9uS2V5TW9kaWZpZXJzLmluY2x1ZGVzKFwibWlkZGxlXCIpKSB7XG4gICAgICBrZXkgPSB0cmFuc2Zvcm1DbGljayhrZXksIGBvbk1vdXNldXBgKTtcbiAgICB9XG4gICAgaWYgKG5vbktleU1vZGlmaWVycy5sZW5ndGgpIHtcbiAgICAgIGhhbmRsZXJFeHAgPSBjcmVhdGVDYWxsRXhwcmVzc2lvbihjb250ZXh0LmhlbHBlcihWX09OX1dJVEhfTU9ESUZJRVJTKSwgW1xuICAgICAgICBoYW5kbGVyRXhwLFxuICAgICAgICBKU09OLnN0cmluZ2lmeShub25LZXlNb2RpZmllcnMpXG4gICAgICBdKTtcbiAgICB9XG4gICAgaWYgKGtleU1vZGlmaWVycy5sZW5ndGggJiYgLy8gaWYgZXZlbnQgbmFtZSBpcyBkeW5hbWljLCBhbHdheXMgd3JhcCB3aXRoIGtleXMgZ3VhcmRcbiAgICAoIWlzU3RhdGljRXhwKGtleSkgfHwgaXNLZXlib2FyZEV2ZW50KGtleS5jb250ZW50KSkpIHtcbiAgICAgIGhhbmRsZXJFeHAgPSBjcmVhdGVDYWxsRXhwcmVzc2lvbihjb250ZXh0LmhlbHBlcihWX09OX1dJVEhfS0VZUyksIFtcbiAgICAgICAgaGFuZGxlckV4cCxcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoa2V5TW9kaWZpZXJzKVxuICAgICAgXSk7XG4gICAgfVxuICAgIGlmIChldmVudE9wdGlvbk1vZGlmaWVycy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IG1vZGlmaWVyUG9zdGZpeCA9IGV2ZW50T3B0aW9uTW9kaWZpZXJzLm1hcChjYXBpdGFsaXplKS5qb2luKFwiXCIpO1xuICAgICAga2V5ID0gaXNTdGF0aWNFeHAoa2V5KSA/IGNyZWF0ZVNpbXBsZUV4cHJlc3Npb24oYCR7a2V5LmNvbnRlbnR9JHttb2RpZmllclBvc3RmaXh9YCwgdHJ1ZSkgOiBjcmVhdGVDb21wb3VuZEV4cHJlc3Npb24oW2AoYCwga2V5LCBgKSArIFwiJHttb2RpZmllclBvc3RmaXh9XCJgXSk7XG4gICAgfVxuICAgIHJldHVybi
20578B7XG4gICAgICBwcm9wczogW2NyZWF0ZU9iamVjdFByb3BlcnR5KGtleSwgaGFuZGxlckV4cCldXG4gICAgfTtcbiAgfSk7XG59O1xuXG5jb25zdCB0cmFuc2Zvcm1TaG93ID0gKGRpciwgbm9kZSwgY29udGV4dCkgPT4ge1xuICBjb25zdCB7IGV4cCwgbG9jIH0gPSBkaXI7XG4gIGlmICghZXhwKSB7XG4gICAgY29udGV4dC5vbkVycm9yKFxuICAgICAgY3JlYXRlRE9NQ29tcGlsZXJFcnJvcig2MSwgbG9jKVxuICAgICk7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBwcm9wczogW10sXG4gICAgbmVlZFJ1bnRpbWU6IGNvbnRleHQuaGVscGVyKFZfU0hPVylcbiAgfTtcbn07XG5cbmNvbnN0IHRyYW5zZm9ybVRyYW5zaXRpb24gPSAobm9kZSwgY29udGV4dCkgPT4ge1xuICBpZiAobm9kZS50eXBlID09PSAxICYmIG5vZGUudGFnVHlwZSA9PT0gMSkge1xuICAgIGNvbnN0IGNvbXBvbmVudCA9IGNvbnRleHQuaXNCdWlsdEluQ29tcG9uZW50KG5vZGUudGFnKTtcbiAgICBpZiAoY29tcG9uZW50ID09PSBUUkFOU0lUSU9OKSB7XG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBpZiAoIW5vZGUuY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoYXNNdWx0aXBsZUNoaWxkcmVuKG5vZGUpKSB7XG4gICAgICAgICAgY29udGV4dC5vbkVycm9yKFxuICAgICAgICAgICAgY3JlYXRlRE9NQ29tcGlsZXJFcnJvcihcbiAgICAgICAgICAgICAgNjIsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBzdGFydDogbm9kZS5jaGlsZHJlblswXS5sb2Muc3RhcnQsXG4gICAgICAgICAgICAgICAgZW5kOiBub2RlLmNoaWxkcmVuW25vZGUuY2hpbGRyZW4ubGVuZ3RoIC0gMV0ubG9jLmVuZCxcbiAgICAgICAgICAgICAgICBzb3VyY2U6IFwiXCJcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2hpbGQgPSBub2RlLmNoaWxkcmVuWzBdO1xuICAgICAgICBpZiAoY2hpbGQudHlwZSA9PT0gMSkge1xuICAgICAgICAgIGZvciAoY29uc3QgcCBvZiBjaGlsZC5wcm9wcykge1xuICAgICAgICAgICAgaWYgKHAudHlwZSA9PT0gNyAmJiBwLm5hbWUgPT09IFwic2hvd1wiKSB7XG4gICAgICAgICAgICAgIG5vZGUucHJvcHMucHVzaCh7XG4gICAgICAgICAgICAgICAgdHlwZTogNixcbiAgICAgICAgICAgICAgICBuYW1lOiBcInBlcnNpc3RlZFwiLFxuICAgICAgICAgICAgICAgIG5hbWVMb2M6IG5vZGUubG9jLFxuICAgICAgICAgICAgICAgIHZhbHVlOiB2b2lkIDAsXG4gICAgICAgICAgICAgICAgbG9jOiBub2RlLmxvY1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICB9XG59O1xuZnVuY3Rpb24gaGFzTXVsdGlwbGVDaGlsZHJlbihub2RlKSB7XG4gIGNvbnN0IGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW4uZmlsdGVyKFxuICAgIChjKSA9PiBjLnR5cGUgIT09IDMgJiYgIShjLnR5cGUgPT09IDIgJiYgIWMuY29udGVudC50cmltKCkpXG4gICk7XG4gIGNvbnN0IGNoaWxkID0gY2hpbGRyZW5bMF07XG4gIHJldHVybiBjaGlsZHJlbi5sZW5ndGggIT09IDEgfHwgY2hpbGQudHlwZSA9PT0gMTEgfHwgY2hpbGQudHlwZSA9PT0gOSAmJiBjaGlsZC5icmFuY2hlcy5zb21lKGhhc011bHRpcGxlQ2hpbGRyZW4pO1xufVxuXG5jb25zdCBpZ25vcmVTaWRlRWZmZWN0VGFncyA9IChub2RlLCBjb250ZXh0KSA9PiB7XG4gIGlmIChub2RlLnR5cGUgPT09IDEgJiYgbm9kZS50YWdUeXBlID09PSAwICYmIChub2RlLnRhZyA9PT0gXCJzY3JpcHRcIiB8fCBub2RlLnRhZyA9PT0gXCJzdHlsZVwiKSkge1xuICAgICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgY29udGV4dC5vbkVycm9yKFxuICAgICAgY3JlYXRlRE9NQ29tcGlsZXJFcnJvcihcbiAgICAgICAgNjMsXG4gICAgICAgIG5vZGUubG9jXG4gICAgICApXG4gICAgKTtcbiAgICBjb250ZXh0LnJlbW92ZU5vZGUoKTtcbiAgfVxufTtcblxuY29uc3QgRE9NTm9kZVRyYW5zZm9ybXMgPSBbXG4gIHRyYW5zZm9ybVN0eWxlLF
20578xuICAuLi4hIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8gW3RyYW5zZm9ybVRyYW5zaXRpb25dIDogW11cbl07XG5jb25zdCBET01EaXJlY3RpdmVUcmFuc2Zvcm1zID0ge1xuICBjbG9hazogbm9vcERpcmVjdGl2ZVRyYW5zZm9ybSxcbiAgaHRtbDogdHJhbnNmb3JtVkh0bWwsXG4gIHRleHQ6IHRyYW5zZm9ybVZUZXh0LFxuICBtb2RlbDogdHJhbnNmb3JtTW9kZWwsXG4gIC8vIG92ZXJyaWRlIGNvbXBpbGVyLWNvcmVcbiAgb246IHRyYW5zZm9ybU9uLFxuICAvLyBvdmVycmlkZSBjb21waWxlci1jb3JlXG4gIHNob3c6IHRyYW5zZm9ybVNob3dcbn07XG5mdW5jdGlvbiBjb21waWxlKHNyYywgb3B0aW9ucyA9IHt9KSB7XG4gIHJldHVybiBiYXNlQ29tcGlsZShcbiAgICBzcmMsXG4gICAgZXh0ZW5kKHt9LCBwYXJzZXJPcHRpb25zLCBvcHRpb25zLCB7XG4gICAgICBub2RlVHJhbnNmb3JtczogW1xuICAgICAgICAvLyBpZ25vcmUgPHNjcmlwdD4gYW5kIDx0YWc+XG4gICAgICAgIC8vIHRoaXMgaXMgbm90IHB1dCBpbnNpZGUgRE9NTm9kZVRyYW5zZm9ybXMgYmVjYXVzZSB0aGF0IGxpc3QgaXMgdXNlZFxuICAgICAgICAvLyBieSBjb21waWxlci1zc3IgdG8gZ2VuZXJhdGUgdm5vZGUgZmFsbGJhY2sgYnJhbmNoZXNcbiAgICAgICAgaWdub3JlU2lkZUVmZmVjdFRhZ3MsXG4gICAgICAgIC4uLkRPTU5vZGVUcmFuc2Zvcm1zLFxuICAgICAgICAuLi5vcHRpb25zLm5vZGVUcmFuc2Zvcm1zIHx8IFtdXG4gICAgICBdLFxuICAgICAgZGlyZWN0aXZlVHJhbnNmb3JtczogZXh0ZW5kKFxuICAgICAgICB7fSxcbiAgICAgICAgRE9NRGlyZWN0aXZlVHJhbnNmb3JtcyxcbiAgICAgICAgb3B0aW9ucy5kaXJlY3RpdmVUcmFuc2Zvcm1zIHx8IHt9XG4gICAgICApLFxuICAgICAgdHJhbnNmb3JtSG9pc3Q6IG51bGwgXG4gICAgfSlcbiAgKTtcbn1cbmZ1bmN0aW9uIHBhcnNlKHRlbXBsYXRlLCBvcHRpb25zID0ge30pIHtcbiAgcmV0dXJuIGJhc2VQYXJzZSh0ZW1wbGF0ZSwgZXh0ZW5kKHt9LCBwYXJzZXJPcHRpb25zLCBvcHRpb25zKSk7XG59XG5cbmV4cG9ydCB7IERPTURpcmVjdGl2ZVRyYW5zZm9ybXMsIERPTUVycm9yQ29kZXMsIERPTUVycm9yTWVzc2FnZXMsIERPTU5vZGVUcmFuc2Zvcm1zLCBUUkFOU0lUSU9OLCBUUkFOU0lUSU9OX0dST1VQLCBWX01PREVMX0NIRUNLQk9YLCBWX01PREVMX0RZTkFNSUMsIFZfTU9ERUxfUkFESU8sIFZfTU9ERUxfU0VMRUNULCBWX01PREVMX1RFWFQsIFZfT05fV0lUSF9LRVlTLCBWX09OX1dJVEhfTU9ESUZJRVJTLCBWX1NIT1csIGNvbXBpbGUsIGNyZWF0ZURPTUNvbXBpbGVyRXJyb3IsIHBhcnNlLCBwYXJzZXJPcHRpb25zLCB0cmFuc2Zvcm1TdHlsZSB9O1xuIiwiLyoqXG4qIEB2dWUvcmVhY3Rpdml0eSB2My40LjM0XG4qIChjKSAyMDE4LXByZXNlbnQgWXV4aSAoRXZhbikgWW91IGFuZCBWdWUgY29udHJpYnV0b3JzXG4qIEBsaWNlbnNlIE1JVFxuKiovXG5pbXBvcnQgeyBOT09QLCBleHRlbmQsIGlzQXJyYXksIGlzU3ltYm9sLCBpc01hcCwgaXNJbnRlZ2VyS2V5LCBoYXNPd24sIGhhc0NoYW5nZWQsIGlzT2JqZWN0LCBtYWtlTWFwLCBjYXBpdGFsaXplLCB0b1Jhd1R5cGUsIGRlZiwgaXNGdW5jdGlvbiB9IGZyb20gJ0B2dWUvc2hhcmVkJztcblxuZnVuY3Rpb24gd2Fybihtc2csIC4uLmFyZ3MpIHtcbiAgY29uc29sZS53YXJuKGBbVnVlIHdhcm5dICR7bXNnfWAsIC4uLmFyZ3MpO1xufVxuXG5sZXQgYWN0aXZlRWZmZWN0U2NvcGU7XG5jbGFzcyBFZmZlY3RTY29wZSB7XG4gIGNvbnN0cnVjdG9yKGRldGFjaGVkID0gZmFsc2UpIHtcbiAgICB0aGlzLmRldGFjaGVkID0gZGV0YWNoZWQ7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgdGhpcy5fYWN0aXZlID0gdHJ1ZTtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICB0aGlzLmVmZmVjdHMgPSBbXTtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICB0aGlzLmNsZWFudXBzID0gW107XG4gICAgdGhpcy5wYXJlbnQgPSBhY3RpdmVFZmZlY3RTY29wZTtcbiAgICBpZiAoIWRldGFjaGVkICYmIGFjdGl2ZUVmZmVjdFNjb3BlKSB7XG4gICAgICB0aGlzLmluZGV4ID0gKGFjdGl2ZUVmZmVjdFNjb3BlLnNjb3BlcyB8fCAoYWN0aXZlRWZmZWN0U2NvcGUuc2NvcGVzID0gW10pKS5wdXNoKFxuICAgICAgICB0aGlzXG4gICAgICApIC0gMTtcbiAgICB9XG4gIH1cbiAgZ2V0IGFjdGl2ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fYWN0aXZlO1xuICB9XG4gIHJ1bihmbikge1xuICAgIGlmICh0aGlzLl9hY3RpdmUpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRFZmZlY3RTY29wZSA9IGFjdGl2ZUVmZmVjdFNjb3BlO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYWN0aXZlRWZmZWN0U2NvcGUgPSB0aGlzO1xuICAgICAgICByZXR1cm4gZm4oKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGFjdGl2ZUVmZmVjdFNjb3BlID0gY3VycmVudEVmZmVjdFNjb3BlO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgd2FybihgY2Fubm90IHJ1biBhbiBpbmFjdGl2ZSBlZmZlY3Qgc2NvcGUuYCk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBUaGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBvbiBub24tZGV0YWNoZWQgc2NvcGVzXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgb24oKSB7XG4gICAgYWN0aXZlRWZmZWN0U2NvcGUgPSB0aGlzO1xuICB9XG4gIC8qKlxuICAgKiBUaGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBvbiBub24tZGV0YWNoZWQgc2NvcGVzXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgb2ZmKCkge1xuICAgIGFjdGl2ZUVmZmVjdFNjb3BlID0gdGhpcy5wYXJlbnQ7XG4gIH1cbiAgc3RvcChmcm9tUGFyZW50KSB7XG4gICAgaWYgKHRoaXMuX2FjdGl2ZSkge1xuICAgICAgbGV0IGksIGw7XG4gICAgICBmb3IgKGkgPSAwLCBsID0gdGhpcy5lZmZlY3RzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICB0aGlzLmVmZmVjdHNbaV0uc3RvcCgpO1xuICAgICAgfVxuICAgICAgZm9yIChpID0gMCwgbCA9IHRoaXMuY2xlYW51cHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgI
20578HRoaXMuY2xlYW51cHNbaV0oKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnNjb3Blcykge1xuICAgICAgICBmb3IgKGkgPSAwLCBsID0gdGhpcy5zY29wZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgICAgdGhpcy5zY29wZXNbaV0uc3RvcCh0cnVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCF0aGlzLmRldGFjaGVkICYmIHRoaXMucGFyZW50ICYmICFmcm9tUGFyZW50KSB7XG4gICAgICAgIGNvbnN0IGxhc3QgPSB0aGlzLnBhcmVudC5zY29wZXMucG9wKCk7XG4gICAgICAgIGlmIChsYXN0ICYmIGxhc3QgIT09IHRoaXMpIHtcbiAgICAgICAgICB0aGlzLnBhcmVudC5zY29wZXNbdGhpcy5pbmRleF0gPSBsYXN0O1xuICAgICAgICAgIGxhc3QuaW5kZXggPSB0aGlzLmluZGV4O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLnBhcmVudCA9IHZvaWQgMDtcbiAgICAgIHRoaXMuX2FjdGl2ZSA9IGZhbHNlO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gZWZmZWN0U2NvcGUoZGV0YWNoZWQpIHtcbiAgcmV0dXJuIG5ldyBFZmZlY3RTY29wZShkZXRhY2hlZCk7XG59XG5mdW5jdGlvbiByZWNvcmRFZmZlY3RTY29wZShlZmZlY3QsIHNjb3BlID0gYWN0aXZlRWZmZWN0U2NvcGUpIHtcbiAgaWYgKHNjb3BlICYmIHNjb3BlLmFjdGl2ZSkge1xuICAgIHNjb3BlLmVmZmVjdHMucHVzaChlZmZlY3QpO1xuICB9XG59XG5mdW5jdGlvbiBnZXRDdXJyZW50U2NvcGUoKSB7XG4gIHJldHVybiBhY3RpdmVFZmZlY3RTY29wZTtcbn1cbmZ1bmN0aW9uIG9uU2NvcGVEaXNwb3NlKGZuKSB7XG4gIGlmIChhY3RpdmVFZmZlY3RTY29wZSkge1xuICAgIGFjdGl2ZUVmZmVjdFNjb3BlLmNsZWFudXBzLnB1c2goZm4pO1xuICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICB3YXJuKFxuICAgICAgYG9uU2NvcGVEaXNwb3NlKCkgaXMgY2FsbGVkIHdoZW4gdGhlcmUgaXMgbm8gYWN0aXZlIGVmZmVjdCBzY29wZSB0byBiZSBhc3NvY2lhdGVkIHdpdGguYFxuICAgICk7XG4gIH1cbn1cblxubGV0IGFjdGl2ZUVmZmVjdDtcbmNsYXNzIFJlYWN0aXZlRWZmZWN0IHtcbiAgY29uc3RydWN0b3IoZm4sIHRyaWdnZXIsIHNjaGVkdWxlciwgc2NvcGUpIHtcbiAgICB0aGlzLmZuID0gZm47XG4gICAgdGhpcy50cmlnZ2VyID0gdHJpZ2dlcjtcbiAgICB0aGlzLnNjaGVkdWxlciA9IHNjaGVkdWxlcjtcbiAgICB0aGlzLmFjdGl2ZSA9IHRydWU7XG4gICAgdGhpcy5kZXBzID0gW107XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgdGhpcy5fZGlydHlMZXZlbCA9IDQ7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgdGhpcy5fdHJhY2tJZCA9IDA7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgdGhpcy5fcnVubmluZ3MgPSAwO1xuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHRoaXMuX3Nob3VsZFNjaGVkdWxlID0gZmFsc2U7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgdGhpcy5fZGVwc0xlbmd0aCA9IDA7XG4gICAgcmVjb3JkRWZmZWN0U2NvcGUodGhpcywgc2NvcGUpO1xuICB9XG4gIGdldCBkaXJ0eSgpIHtcbiAgICBpZiAodGhpcy5fZGlydHlMZXZlbCA9PT0gMiB8fCB0aGlzLl9kaXJ0eUxldmVsID09PSAzKSB7XG4gICAgICB0aGlzLl9kaXJ0eUxldmVsID0gMTtcbiAgICAgIHBhdXNlVHJhY2tpbmcoKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fZGVwc0xlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGRlcCA9IHRoaXMuZGVwc1tpXTtcbiAgICAgICAgaWYgKGRlcC5jb21wdXRlZCkge1xuICAgICAgICAgIHRyaWdnZXJDb21wdXRlZChkZXAuY29tcHV0ZWQpO1xuICAgICAgICAgIGlmICh0aGlzLl9kaXJ0eUxldmVsID49IDQpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMuX2RpcnR5TGV2ZWwgPT09IDEpIHtcbiAgICAgICAgdGhpcy5fZGlydHlMZXZlbCA9IDA7XG4gICAgICB9XG4gICAgICByZXNldFRyYWNraW5nKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9kaXJ0eUxldmVsID49IDQ7XG4gIH1cbiAgc2V0IGRpcnR5KHYpIHtcbiAgICB0aGlzLl9kaXJ0eUxldmVsID0gdiA/IDQgOiAwO1xuICB9XG4gIHJ1bigpIHtcbiAgICB0aGlzLl9kaXJ0eUxldmVsID0gMDtcbiAgICBpZiAoIXRoaXMuYWN0aXZlKSB7XG4gICAgICByZXR1cm4gdGhpcy5mbigpO1xuICAgIH1cbiAgICBsZXQgbGFzdFNob3VsZFRyYWNrID0gc2hvdWxkVHJhY2s7XG4gICAgbGV0IGxhc3RFZmZlY3QgPSBhY3RpdmVFZmZlY3Q7XG4gICAgdHJ5IHtcbiAgICAgIHNob3VsZFRyYWNrID0gdHJ1ZTtcbiAgICAgIGFjdGl2ZUVmZmVjdCA9IHRoaXM7XG4gICAgICB0aGlzLl9ydW5uaW5ncysrO1xuICAgICAgcHJlQ2xlYW51cEVmZmVjdCh0aGlzKTtcbiAgICAgIHJldHVybiB0aGlzLmZuKCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHBvc3RDbGVhbnVwRWZmZWN0KHRoaXMpO1xuICAgICAgdGhpcy5fcnVubmluZ3MtLTtcbiAgICAgIGFjdGl2ZUVmZmVjdCA9IGxhc3RFZmZlY3Q7XG4gICAgICBzaG91bGRUcmFjayA9IGxhc3RTaG91bGRUcmFjaztcbiAgICB9XG4gIH1cbiAgc3RvcCgpIHtcbiAgICBpZiAodGhpcy5hY3RpdmUpIHtcbiAgICAgIHByZUNsZWFudXBFZmZlY3QodGhpcyk7XG4gICAgICBwb3N0Q2xlYW51cEVmZmVjdCh0aGlzKTtcbiAgICAgIHRoaXMub25TdG9wICYmIHRoaXMub25TdG9wKCk7XG4gICAgICB0aGlzLmFjdGl2ZSA9IGZhbHNlO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gdHJpZ2dlckNvbXB1dGVkKGNvbXB1dGVkKSB7XG4gIHJldHVybiBjb21wdXRlZC52YWx1ZTtcbn1cbmZ1bmN0aW9uIHByZUNsZWFudXBFZmZlY3QoZWZmZWN0Mikge1xuICBlZmZlY3QyLl90cmFja0lkKys7XG4gIGVmZmVjdDIuX2RlcHNMZW5ndGggPSAwO1xufVxuZnVuY3Rpb24gcG9zdENsZWFudXBFZmZlY3QoZWZmZWN0Mikge1xuICBpZiAoZWZmZWN0Mi5kZXBzLmxlbmd0aCA+IGVmZmVjdDIuX2RlcHNMZW5ndGgpIHtcbiAgICBmb3IgKGxldCBpID0gZWZmZWN0Mi5fZGVwc0xlbmd0aDsgaSA8IGVmZmVjdDIuZGVwcy5sZW5ndGg7IGkrKykge1xuICAgICAgY2xlYW51cERlcEVmZmVjdChlZmZlY3QyLmRlcHNbaV0sIGVmZmVjdDIpO1xuICAgIH1cbiAgICBlZmZlY3QyLmRlcHMubGVuZ3RoID0gZWZmZWN0Mi5fZGVwc0xlbmd0aDtcbiAgfVxufVxuZnVuY3Rpb24gY2xlYW51cERlcEVmZmVjdChkZXAsIGVmZmVjdDIpIHtcbiAgY29uc3QgdHJhY2tJZCA9IGRlcC5nZXQoZWZmZWN0Mik7XG4gIGlmICh0cmFja0lkICE9PSB2b2lkIDAgJiYgZWZmZWN0Mi5fdHJhY2tJZCAhPT0gdHJhY2tJZCkge1xuICAgIGRlcC5kZWxldGUoZWZmZWN0Mik7XG4gICAgaWYgKGRlcC5zaXplID09PSAwKSB7XG4gICAgICBkZXAuY2xlYW51cCgpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gZWZmZWN0KGZuLCBvcHRpb25zKSB7XG4gIGlmIChmbi5lZmZlY3QgaW5zdGFuY2VvZiBSZWFjdGl2ZUVmZmVjdCkge1xuICAgIGZuID0gZm4uZWZmZWN0LmZuO1xuICB9XG4gIGNvbnN0IF9lZmZlY3QgPSBuZXcgUmVhY3RpdmVFZmZlY3QoZm4sIE5PT1AsICgpID0+IHtcbiAgICBpZiAoX2VmZmVjdC5kaXJ0eSkge1xuICAgICAgX2VmZmVjdC5ydW4oKTtcbiAgICB9XG4gI
20578H0pO1xuICBpZiAob3B0aW9ucykge1xuICAgIGV4dGVuZChfZWZmZWN0LCBvcHRpb25zKTtcbiAgICBpZiAob3B0aW9ucy5zY29wZSkgcmVjb3JkRWZmZWN0U2NvcGUoX2VmZmVjdCwgb3B0aW9ucy5zY29wZSk7XG4gIH1cbiAgaWYgKCFvcHRpb25zIHx8ICFvcHRpb25zLmxhenkpIHtcbiAgICBfZWZmZWN0LnJ1bigpO1xuICB9XG4gIGNvbnN0IHJ1bm5lciA9IF9lZmZlY3QucnVuLmJpbmQoX2VmZmVjdCk7XG4gIHJ1bm5lci5lZmZlY3QgPSBfZWZmZWN0O1xuICByZXR1cm4gcnVubmVyO1xufVxuZnVuY3Rpb24gc3RvcChydW5uZXIpIHtcbiAgcnVubmVyLmVmZmVjdC5zdG9wKCk7XG59XG5sZXQgc2hvdWxkVHJhY2sgPSB0cnVlO1xubGV0IHBhdXNlU2NoZWR1bGVTdGFjayA9IDA7XG5jb25zdCB0cmFja1N0YWNrID0gW107XG5mdW5jdGlvbiBwYXVzZVRyYWNraW5nKCkge1xuICB0cmFja1N0YWNrLnB1c2goc2hvdWxkVHJhY2spO1xuICBzaG91bGRUcmFjayA9IGZhbHNlO1xufVxuZnVuY3Rpb24gZW5hYmxlVHJhY2tpbmcoKSB7XG4gIHRyYWNrU3RhY2sucHVzaChzaG91bGRUcmFjayk7XG4gIHNob3VsZFRyYWNrID0gdHJ1ZTtcbn1cbmZ1bmN0aW9uIHJlc2V0VHJhY2tpbmcoKSB7XG4gIGNvbnN0IGxhc3QgPSB0cmFja1N0YWNrLnBvcCgpO1xuICBzaG91bGRUcmFjayA9IGxhc3QgPT09IHZvaWQgMCA/IHRydWUgOiBsYXN0O1xufVxuZnVuY3Rpb24gcGF1c2VTY2hlZHVsaW5nKCkge1xuICBwYXVzZVNjaGVkdWxlU3RhY2srKztcbn1cbmZ1bmN0aW9uIHJlc2V0U2NoZWR1bGluZygpIHtcbiAgcGF1c2VTY2hlZHVsZVN0YWNrLS07XG4gIHdoaWxlICghcGF1c2VTY2hlZHVsZVN0YWNrICYmIHF1ZXVlRWZmZWN0U2NoZWR1bGVycy5sZW5ndGgpIHtcbiAgICBxdWV1ZUVmZmVjdFNjaGVkdWxlcnMuc2hpZnQoKSgpO1xuICB9XG59XG5mdW5jdGlvbiB0cmFja0VmZmVjdChlZmZlY3QyLCBkZXAsIGRlYnVnZ2VyRXZlbnRFeHRyYUluZm8pIHtcbiAgdmFyIF9hO1xuICBpZiAoZGVwLmdldChlZmZlY3QyKSAhPT0gZWZmZWN0Mi5fdHJhY2tJZCkge1xuICAgIGRlcC5zZXQoZWZmZWN0MiwgZWZmZWN0Mi5fdHJhY2tJZCk7XG4gICAgY29uc3Qgb2xkRGVwID0gZWZmZWN0Mi5kZXBzW2VmZmVjdDIuX2RlcHNMZW5ndGhdO1xuICAgIGlmIChvbGREZXAgIT09IGRlcCkge1xuICAgICAgaWYgKG9sZERlcCkge1xuICAgICAgICBjbGVhbnVwRGVwRWZmZWN0KG9sZERlcCwgZWZmZWN0Mik7XG4gICAgICB9XG4gICAgICBlZmZlY3QyLmRlcHNbZWZmZWN0Mi5fZGVwc0xlbmd0aCsrXSA9IGRlcDtcbiAgICB9IGVsc2Uge1xuICAgICAgZWZmZWN0Mi5fZGVwc0xlbmd0aCsrO1xuICAgIH1cbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgKF9hID0gZWZmZWN0Mi5vblRyYWNrKSA9PSBudWxsID8gdm9pZCAwIDogX2EuY2FsbChlZmZlY3QyLCBleHRlbmQoeyBlZmZlY3Q6IGVmZmVjdDIgfSwgZGVidWdnZXJFdmVudEV4dHJhSW5mbykpO1xuICAgIH1cbiAgfVxufVxuY29uc3QgcXVldWVFZmZlY3RTY2hlZHVsZXJzID0gW107XG5mdW5jdGlvbiB0cmlnZ2VyRWZmZWN0cyhkZXAsIGRpcnR5TGV2ZWwsIGRlYnVnZ2VyRXZlbnRFeHRyYUluZm8pIHtcbiAgdmFyIF9hO1xuICBwYXVzZVNjaGVkdWxpbmcoKTtcbiAgZm9yIChjb25zdCBlZmZlY3QyIG9mIGRlcC5rZXlzKCkpIHtcbiAgICBsZXQgdHJhY2tpbmc7XG4gICAgaWYgKGVmZmVjdDIuX2RpcnR5TGV2ZWwgPCBkaXJ0eUxldmVsICYmICh0cmFja2luZyAhPSBudWxsID8gdHJhY2tpbmcgOiB0cmFja2luZyA9IGRlcC5nZXQoZWZmZWN0MikgPT09IGVmZmVjdDIuX3RyYWNrSWQpKSB7XG4gICAgICBlZmZlY3QyLl9zaG91bGRTY2hlZHVsZSB8fCAoZWZmZWN0Mi5fc2hvdWxkU2NoZWR1bGUgPSBlZmZlY3QyLl9kaXJ0eUxldmVsID09PSAwKTtcbiAgICAgIGVmZmVjdDIuX2RpcnR5TGV2ZWwgPSBkaXJ0eUxldmVsO1xuICAgIH1cbiAgICBpZiAoZWZmZWN0Mi5fc2hvdWxkU2NoZWR1bGUgJiYgKHRyYWNraW5nICE9IG51bGwgPyB0cmFja2luZyA6IHRyYWNraW5nID0gZGVwLmdldChlZmZlY3QyKSA9PT0gZWZmZWN0Mi5fdHJhY2tJZCkpIHtcbiAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgIChfYSA9IGVmZmVjdDIub25UcmlnZ2VyKSA9PSBudWxsID8gdm9pZCAwIDogX2EuY2FsbChlZmZlY3QyLCBleHRlbmQoeyBlZmZlY3Q6IGVmZmVjdDIgfSwgZGVidWdnZXJFdmVudEV4dHJhSW5mbykpO1xuICAgICAgfVxuICAgICAgZWZmZWN0Mi50cmlnZ2VyKCk7XG4gICAgICBpZiAoKCFlZmZlY3QyLl9ydW5uaW5ncyB8fCBlZmZlY3QyLmFsbG93UmVjdXJzZSkgJiYgZWZmZWN0Mi5fZGlydHlMZXZlbCAhPT0gMikge1xuICAgICAgICBlZmZlY3QyLl9zaG91bGRTY2hlZHVsZSA9IGZhbHNlO1xuICAgICAgICBpZiAoZWZmZWN0Mi5zY2hlZHVsZXIpIHtcbiAgICAgICAgICBxdWV1ZUVmZmVjdFNjaGVkdWxlcnMucHVzaChlZmZlY3QyLnNjaGVkdWxlcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmVzZXRTY2hlZHVsaW5nKCk7XG59XG5cbmNvbnN0IGNyZWF0ZURlcCA9IChjbGVhbnVwLCBjb21wdXRlZCkgPT4ge1xuICBjb25zdCBkZXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuICBkZXAuY2xlYW51cCA9IGNsZWFudXA7XG4gIGRlcC5jb21wdXRlZCA9IGNvbXB1dGVkO1xuICByZXR1cm4gZGVwO1xufTtcblxuY29uc3QgdGFyZ2V0TWFwID0gLyogQF9fUFVSRV9fICovIG5ldyBXZWFrTWFwKCk7XG5jb25zdCBJVEVSQVRFX0tFWSA9IFN5bWJvbCghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8gXCJpdGVyYXRlXCIgOiBcIlwiKTtcbmNvbnN0IE1BUF9LRVlfSVRFUkFURV9LRVkgPSBTeW1ib2woISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IFwiTWFwIGtleSBpdGVyYXRlXCIgOiBcIlwiKTtcbmZ1bmN0aW9uIHRyYWNrKHRhcmdldCwgdHlwZSwga2V5KSB7XG4gIGlmIChzaG91bGRUcmFjayAmJiBhY3RpdmVFZmZlY3QpIHtcbiAgICBsZXQgZGVwc01hcCA9IHRhcmdldE1hcC5nZXQodGFyZ2V0KTtcbiAgICBpZiAoIWRlcHNNYXApIHtcbiAgICAgIHRhcmdldE1hcC5zZXQodGFyZ2V0LCBkZXBzTWFwID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKSk7XG4gICAgfVxuICAgIGxldCBkZXAgPSBkZXBzTWFwLmdldChrZXkpO1xuICAgIGlmICghZGVwKSB7XG4gICAgICBkZXBzTWFwLnNldChrZXksIGRlcCA9IGNyZWF0ZURlcCgoKSA9PiBkZXBzTWFwLmRlbGV0ZShrZXkpKSk7XG4gICAgfVxuICAgIHRyYWNrRWZmZWN0KFxuICAgICAgYWN0aXZlRWZmZWN0LFxuICAgICAgZGVwLFxuICAgICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IHtcbiAgICAgICAgdGFyZ2V0LFxuICAgICAgICB0eX
20578BlLFxuICAgICAgICBrZXlcbiAgICAgIH0gOiB2b2lkIDBcbiAgICApO1xuICB9XG59XG5mdW5jdGlvbiB0cmlnZ2VyKHRhcmdldCwgdHlwZSwga2V5LCBuZXdWYWx1ZSwgb2xkVmFsdWUsIG9sZFRhcmdldCkge1xuICBjb25zdCBkZXBzTWFwID0gdGFyZ2V0TWFwLmdldCh0YXJnZXQpO1xuICBpZiAoIWRlcHNNYXApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgbGV0IGRlcHMgPSBbXTtcbiAgaWYgKHR5cGUgPT09IFwiY2xlYXJcIikge1xuICAgIGRlcHMgPSBbLi4uZGVwc01hcC52YWx1ZXMoKV07XG4gIH0gZWxzZSBpZiAoa2V5ID09PSBcImxlbmd0aFwiICYmIGlzQXJyYXkodGFyZ2V0KSkge1xuICAgIGNvbnN0IG5ld0xlbmd0aCA9IE51bWJlcihuZXdWYWx1ZSk7XG4gICAgZGVwc01hcC5mb3JFYWNoKChkZXAsIGtleTIpID0+IHtcbiAgICAgIGlmIChrZXkyID09PSBcImxlbmd0aFwiIHx8ICFpc1N5bWJvbChrZXkyKSAmJiBrZXkyID49IG5ld0xlbmd0aCkge1xuICAgICAgICBkZXBzLnB1c2goZGVwKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBpZiAoa2V5ICE9PSB2b2lkIDApIHtcbiAgICAgIGRlcHMucHVzaChkZXBzTWFwLmdldChrZXkpKTtcbiAgICB9XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIFwiYWRkXCI6XG4gICAgICAgIGlmICghaXNBcnJheSh0YXJnZXQpKSB7XG4gICAgICAgICAgZGVwcy5wdXNoKGRlcHNNYXAuZ2V0KElURVJBVEVfS0VZKSk7XG4gICAgICAgICAgaWYgKGlzTWFwKHRhcmdldCkpIHtcbiAgICAgICAgICAgIGRlcHMucHVzaChkZXBzTWFwLmdldChNQVBfS0VZX0lURVJBVEVfS0VZKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGlzSW50ZWdlcktleShrZXkpKSB7XG4gICAgICAgICAgZGVwcy5wdXNoKGRlcHNNYXAuZ2V0KFwibGVuZ3RoXCIpKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJkZWxldGVcIjpcbiAgICAgICAgaWYgKCFpc0FycmF5KHRhcmdldCkpIHtcbiAgICAgICAgICBkZXBzLnB1c2goZGVwc01hcC5nZXQoSVRFUkFURV9LRVkpKTtcbiAgICAgICAgICBpZiAoaXNNYXAodGFyZ2V0KSkge1xuICAgICAgICAgICAgZGVwcy5wdXNoKGRlcHNNYXAuZ2V0KE1BUF9LRVlfSVRFUkFURV9LRVkpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwic2V0XCI6XG4gICAgICAgIGlmIChpc01hcCh0YXJnZXQpKSB7XG4gICAgICAgICAgZGVwcy5wdXNoKGRlcHNNYXAuZ2V0KElURVJBVEVfS0VZKSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHBhdXNlU2NoZWR1bGluZygpO1xuICBmb3IgKGNvbnN0IGRlcCBvZiBkZXBzKSB7XG4gICAgaWYgKGRlcCkge1xuICAgICAgdHJpZ2dlckVmZmVjdHMoXG4gICAgICAgIGRlcCxcbiAgICAgICAgNCxcbiAgICAgICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IHtcbiAgICAgICAgICB0YXJnZXQsXG4gICAgICAgICAgdHlwZSxcbiAgICAgICAgICBrZXksXG4gICAgICAgICAgbmV3VmFsdWUsXG4gICAgICAgICAgb2xkVmFsdWUsXG4gICAgICAgICAgb2xkVGFyZ2V0XG4gICAgICAgIH0gOiB2b2lkIDBcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIHJlc2V0U2NoZWR1bGluZygpO1xufVxuZnVuY3Rpb24gZ2V0RGVwRnJvbVJlYWN0aXZlKG9iamVjdCwga2V5KSB7XG4gIGNvbnN0IGRlcHNNYXAgPSB0YXJnZXRNYXAuZ2V0KG9iamVjdCk7XG4gIHJldHVybiBkZXBzTWFwICYmIGRlcHNNYXAuZ2V0KGtleSk7XG59XG5cbmNvbnN0IGlzTm9uVHJhY2thYmxlS2V5cyA9IC8qIEBfX1BVUkVfXyAqLyBtYWtlTWFwKGBfX3Byb3RvX18sX192X2lzUmVmLF9faXNWdWVgKTtcbmNvbnN0IGJ1aWx0SW5TeW1ib2xzID0gbmV3IFNldChcbiAgLyogQF9fUFVSRV9fICovIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKFN5bWJvbCkuZmlsdGVyKChrZXkpID0+IGtleSAhPT0gXCJhcmd1bWVudHNcIiAmJiBrZXkgIT09IFwiY2FsbGVyXCIpLm1hcCgoa2V5KSA9PiBTeW1ib2xba2V5XSkuZmlsdGVyKGlzU3ltYm9sKVxuKTtcbmNvbnN0IGFycmF5SW5zdHJ1bWVudGF0aW9ucyA9IC8qIEBfX1BVUkVfXyAqLyBjcmVhdGVBcnJheUluc3RydW1lbnRhdGlvbnMoKTtcbmZ1bmN0aW9uIGNyZWF0ZUFycmF5SW5zdHJ1bWVudGF0aW9ucygpIHtcbiAgY29uc3QgaW5zdHJ1bWVudGF0aW9ucyA9IHt9O1xuICBbXCJpbmNsdWRlc1wiLCBcImluZGV4T2ZcIiwgXCJsYXN0SW5kZXhPZlwiXS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICBpbnN0cnVtZW50YXRpb25zW2tleV0gPSBmdW5jdGlvbiguLi5hcmdzKSB7XG4gICAgICBjb25zdCBhcnIgPSB0b1Jhdyh0aGlzKTtcbiAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gdGhpcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgdHJhY2soYXJyLCBcImdldFwiLCBpICsgXCJcIik7XG4gICAgICB9XG4gICAgICBjb25zdCByZXMgPSBhcnJba2V5XSguLi5hcmdzKTtcbiAgICAgIGlmIChyZXMgPT09IC0xIHx8IHJlcyA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIGFycltrZXldKC4uLmFyZ3MubWFwKHRvUmF3KSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfVxuICAgIH07XG4gIH0pO1xuICBbXCJwdXNoXCIsIFwicG9wXCIsIFwic2hpZnRcIiwgXCJ1bnNoaWZ0XCIsIFwic3BsaWNlXCJdLmZvckVhY2goKGtleSkgPT4ge1xuICAgIGluc3RydW1lbnRhdGlvbnNba2V5XSA9IGZ1bmN0aW9uKC4uLmFyZ3MpIHtcbiAgICAgIHBhdXNlVHJhY2tpbmcoKTtcbiAgICAgIHBhdXNlU2NoZWR1bGluZygpO1xuICAgICAgY29uc3QgcmVzID0gdG9SYXcodGhpcylba2V5XS5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgIHJlc2V0U2NoZWR1bGluZygpO1xuICAgICAgcmVzZXRUcmFja2luZygpO1xuICAgICAgcmV0dXJuIHJlcztcbiAgICB9O1xuICB9KTtcbiAgcmV0dXJuIGluc3RydW1lbnRhdGlvbnM7XG59XG5mdW5jdGlvbiBoYXNPd25Qcm9wZXJ0eShrZXkpIHtcbiAgaWYgKCFpc1N5bWJvbChrZXkpKSBrZXkgPSBTdHJpbmcoa2V5KTtcbiAgY29uc3Qgb2JqID0gdG9SYXcodGhpcyk7XG4gIHRyYWNrKG9iaiwgXCJoYXNcIiwga2V5KTtcbiAgcmV0dXJuIG9iai5oYXNPd25Qcm9wZXJ0eShrZXkpO1xufVxuY2xhc3MgQmFzZVJlYWN0aXZlSGFuZGxlciB7XG4gIGNvbnN0cnVjdG9yKF9pc1JlYWRvbmx5ID0gZmFsc2UsIF9pc1NoYWxsb3cgPSBmYWxzZSkge1xuICAgIHRoaXMuX2lzUmVhZG9ubHkgPSBfaXNSZWFkb25seTtcbiAgICB0aGlzLl9pc1NoYWxsb3cgPSBfaXNTaGFsbG93O1xuICB9XG4gIGdldCh0YXJnZXQsIGtleSwgcmVjZWl2ZXIpIHtcbiAgICBjb25zdCBpc1JlYWRvbmx5MiA9IHRoaXMuX2lzUmVhZG9ubHksIGlzU2hhbGxvdzIgPSB0aGlzLl9pc1NoYWxsb3c7XG4gICAgaWYgKGtleSA9PT0gXCJfX3ZfaXNSZWFjdGl2ZVwiKSB7XG4gICAgICByZXR1cm4gIWlzUmVhZG9ubHkyO1xuICAgIH0gZWxzZSBpZiAoa2V5ID09PSBcIl9fdl9pc1JlYWRvbmx5XCIpIHtcbiAgICAgIHJldHVybi
20578Bpc1JlYWRvbmx5MjtcbiAgICB9IGVsc2UgaWYgKGtleSA9PT0gXCJfX3ZfaXNTaGFsbG93XCIpIHtcbiAgICAgIHJldHVybiBpc1NoYWxsb3cyO1xuICAgIH0gZWxzZSBpZiAoa2V5ID09PSBcIl9fdl9yYXdcIikge1xuICAgICAgaWYgKHJlY2VpdmVyID09PSAoaXNSZWFkb25seTIgPyBpc1NoYWxsb3cyID8gc2hhbGxvd1JlYWRvbmx5TWFwIDogcmVhZG9ubHlNYXAgOiBpc1NoYWxsb3cyID8gc2hhbGxvd1JlYWN0aXZlTWFwIDogcmVhY3RpdmVNYXApLmdldCh0YXJnZXQpIHx8IC8vIHJlY2VpdmVyIGlzIG5vdCB0aGUgcmVhY3RpdmUgcHJveHksIGJ1dCBoYXMgdGhlIHNhbWUgcHJvdG90eXBlXG4gICAgICAvLyB0aGlzIG1lYW5zIHRoZSByZWNpZXZlciBpcyBhIHVzZXIgcHJveHkgb2YgdGhlIHJlYWN0aXZlIHByb3h5XG4gICAgICBPYmplY3QuZ2V0UHJvdG90eXBlT2YodGFyZ2V0KSA9PT0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHJlY2VpdmVyKSkge1xuICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB0YXJnZXRJc0FycmF5ID0gaXNBcnJheSh0YXJnZXQpO1xuICAgIGlmICghaXNSZWFkb25seTIpIHtcbiAgICAgIGlmICh0YXJnZXRJc0FycmF5ICYmIGhhc093bihhcnJheUluc3RydW1lbnRhdGlvbnMsIGtleSkpIHtcbiAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0KGFycmF5SW5zdHJ1bWVudGF0aW9ucywga2V5LCByZWNlaXZlcik7XG4gICAgICB9XG4gICAgICBpZiAoa2V5ID09PSBcImhhc093blByb3BlcnR5XCIpIHtcbiAgICAgICAgcmV0dXJuIGhhc093blByb3BlcnR5O1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCByZXMgPSBSZWZsZWN0LmdldCh0YXJnZXQsIGtleSwgcmVjZWl2ZXIpO1xuICAgIGlmIChpc1N5bWJvbChrZXkpID8gYnVpbHRJblN5bWJvbHMuaGFzKGtleSkgOiBpc05vblRyYWNrYWJsZUtleXMoa2V5KSkge1xuICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG4gICAgaWYgKCFpc1JlYWRvbmx5Mikge1xuICAgICAgdHJhY2sodGFyZ2V0LCBcImdldFwiLCBrZXkpO1xuICAgIH1cbiAgICBpZiAoaXNTaGFsbG93Mikge1xuICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG4gICAgaWYgKGlzUmVmKHJlcykpIHtcbiAgICAgIHJldHVybiB0YXJnZXRJc0FycmF5ICYmIGlzSW50ZWdlcktleShrZXkpID8gcmVzIDogcmVzLnZhbHVlO1xuICAgIH1cbiAgICBpZiAoaXNPYmplY3QocmVzKSkge1xuICAgICAgcmV0dXJuIGlzUmVhZG9ubHkyID8gcmVhZG9ubHkocmVzKSA6IHJlYWN0aXZlKHJlcyk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbn1cbmNsYXNzIE11dGFibGVSZWFjdGl2ZUhhbmRsZXIgZXh0ZW5kcyBCYXNlUmVhY3RpdmVIYW5kbGVyIHtcbiAgY29uc3RydWN0b3IoaXNTaGFsbG93MiA9IGZhbHNlKSB7XG4gICAgc3VwZXIoZmFsc2UsIGlzU2hhbGxvdzIpO1xuICB9XG4gIHNldCh0YXJnZXQsIGtleSwgdmFsdWUsIHJlY2VpdmVyKSB7XG4gICAgbGV0IG9sZFZhbHVlID0gdGFyZ2V0W2tleV07XG4gICAgaWYgKCF0aGlzLl9pc1NoYWxsb3cpIHtcbiAgICAgIGNvbnN0IGlzT2xkVmFsdWVSZWFkb25seSA9IGlzUmVhZG9ubHkob2xkVmFsdWUpO1xuICAgICAgaWYgKCFpc1NoYWxsb3codmFsdWUpICYmICFpc1JlYWRvbmx5KHZhbHVlKSkge1xuICAgICAgICBvbGRWYWx1ZSA9IHRvUmF3KG9sZFZhbHVlKTtcbiAgICAgICAgdmFsdWUgPSB0b1Jhdyh2YWx1ZSk7XG4gICAgICB9XG4gICAgICBpZiAoIWlzQXJyYXkodGFyZ2V0KSAmJiBpc1JlZihvbGRWYWx1ZSkgJiYgIWlzUmVmKHZhbHVlKSkge1xuICAgICAgICBpZiAoaXNPbGRWYWx1ZVJlYWRvbmx5KSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG9sZFZhbHVlLnZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgaGFkS2V5ID0gaXNBcnJheSh0YXJnZXQpICYmIGlzSW50ZWdlcktleShrZXkpID8gTnVtYmVyKGtleSkgPCB0YXJnZXQubGVuZ3RoIDogaGFzT3duKHRhcmdldCwga2V5KTtcbiAgICBjb25zdCByZXN1bHQgPSBSZWZsZWN0LnNldCh0YXJnZXQsIGtleSwgdmFsdWUsIHJlY2VpdmVyKTtcbiAgICBpZiAodGFyZ2V0ID09PSB0b1JhdyhyZWNlaXZlcikpIHtcbiAgICAgIGlmICghaGFkS2V5KSB7XG4gICAgICAgIHRyaWdnZXIodGFyZ2V0LCBcImFkZFwiLCBrZXksIHZhbHVlKTtcbiAgICAgIH0gZWxzZSBpZiAoaGFzQ2hhbmdlZCh2YWx1ZSwgb2xkVmFsdWUpKSB7XG4gICAgICAgIHRyaWdnZXIodGFyZ2V0LCBcInNldFwiLCBrZXksIHZhbHVlLCBvbGRWYWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgZGVsZXRlUHJvcGVydHkodGFyZ2V0LCBrZXkpIHtcbiAgICBjb25zdCBoYWRLZXkgPSBoYXNPd24odGFyZ2V0LCBrZXkpO1xuICAgIGNvbnN0IG9sZFZhbHVlID0gdGFyZ2V0W2tleV07XG4gICAgY29uc3QgcmVzdWx0ID0gUmVmbGVjdC5kZWxldGVQcm9wZXJ0eSh0YXJnZXQsIGtleSk7XG4gICAgaWYgKHJlc3VsdCAmJiBoYWRLZXkpIHtcbiAgICAgIHRyaWdnZXIodGFyZ2V0LCBcImRlbGV0ZVwiLCBrZXksIHZvaWQgMCwgb2xkVmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIGhhcyh0YXJnZXQsIGtleSkge1xuICAgIGNvbnN0IHJlc3VsdCA9IFJlZmxlY3QuaGFzKHRhcmdldCwga2V5KTtcbiAgICBpZiAoIWlzU3ltYm9sKGtleSkgfHwgIWJ1aWx0SW5TeW1ib2xzLmhhcyhrZXkpKSB7XG4gICAgICB0cmFjayh0YXJnZXQsIFwiaGFzXCIsIGtleSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgb3duS2V5cyh0YXJnZXQpIHtcbiAgICB0cmFjayhcbiAgICAgIHRhcmdldCxcbiAgICAgIFwiaXRlcmF0ZVwiLFxuICAgICAgaXNBcnJheSh0YXJnZXQpID8gXCJsZW5ndGhcIiA6IElURVJBVEVfS0VZXG4gICAgKTtcbiAgICByZXR1cm4gUmVmbGVjdC5vd25LZXlzKHRhcmdldCk7XG4gIH1cbn1cbmNsYXNzIFJlYWRvbmx5UmVhY3RpdmVIYW5kbGVyIGV4dGVuZHMgQmFzZVJlYWN0aXZlSGFuZGxlciB7XG4gIGNvbnN0cnVjdG9yKGlzU2hhbGxvdzIgPSBmYWxzZSkge1xuICAgIHN1cGVyKHRydWUsIGlzU2hhbGxvdzIpO1xuICB9XG4gI
20578HNldCh0YXJnZXQsIGtleSkge1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICB3YXJuKFxuICAgICAgICBgU2V0IG9wZXJhdGlvbiBvbiBrZXkgXCIke1N0cmluZyhrZXkpfVwiIGZhaWxlZDogdGFyZ2V0IGlzIHJlYWRvbmx5LmAsXG4gICAgICAgIHRhcmdldFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgZGVsZXRlUHJvcGVydHkodGFyZ2V0LCBrZXkpIHtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgd2FybihcbiAgICAgICAgYERlbGV0ZSBvcGVyYXRpb24gb24ga2V5IFwiJHtTdHJpbmcoa2V5KX1cIiBmYWlsZWQ6IHRhcmdldCBpcyByZWFkb25seS5gLFxuICAgICAgICB0YXJnZXRcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG59XG5jb25zdCBtdXRhYmxlSGFuZGxlcnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IE11dGFibGVSZWFjdGl2ZUhhbmRsZXIoKTtcbmNvbnN0IHJlYWRvbmx5SGFuZGxlcnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFJlYWRvbmx5UmVhY3RpdmVIYW5kbGVyKCk7XG5jb25zdCBzaGFsbG93UmVhY3RpdmVIYW5kbGVycyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTXV0YWJsZVJlYWN0aXZlSGFuZGxlcihcbiAgdHJ1ZVxuKTtcbmNvbnN0IHNoYWxsb3dSZWFkb25seUhhbmRsZXJzID0gLyogQF9fUFVSRV9fICovIG5ldyBSZWFkb25seVJlYWN0aXZlSGFuZGxlcih0cnVlKTtcblxuY29uc3QgdG9TaGFsbG93ID0gKHZhbHVlKSA9PiB2YWx1ZTtcbmNvbnN0IGdldFByb3RvID0gKHYpID0+IFJlZmxlY3QuZ2V0UHJvdG90eXBlT2Yodik7XG5mdW5jdGlvbiBnZXQodGFyZ2V0LCBrZXksIGlzUmVhZG9ubHkyID0gZmFsc2UsIGlzU2hhbGxvdzIgPSBmYWxzZSkge1xuICB0YXJnZXQgPSB0YXJnZXRbXCJfX3ZfcmF3XCJdO1xuICBjb25zdCByYXdUYXJnZXQgPSB0b1Jhdyh0YXJnZXQpO1xuICBjb25zdCByYXdLZXkgPSB0b1JhdyhrZXkpO1xuICBpZiAoIWlzUmVhZG9ubHkyKSB7XG4gICAgaWYgKGhhc0NoYW5nZWQoa2V5LCByYXdLZXkpKSB7XG4gICAgICB0cmFjayhyYXdUYXJnZXQsIFwiZ2V0XCIsIGtleSk7XG4gICAgfVxuICAgIHRyYWNrKHJhd1RhcmdldCwgXCJnZXRcIiwgcmF3S2V5KTtcbiAgfVxuICBjb25zdCB7IGhhczogaGFzMiB9ID0gZ2V0UHJvdG8ocmF3VGFyZ2V0KTtcbiAgY29uc3Qgd3JhcCA9IGlzU2hhbGxvdzIgPyB0b1NoYWxsb3cgOiBpc1JlYWRvbmx5MiA/IHRvUmVhZG9ubHkgOiB0b1JlYWN0aXZlO1xuICBpZiAoaGFzMi5jYWxsKHJhd1RhcmdldCwga2V5KSkge1xuICAgIHJldHVybiB3cmFwKHRhcmdldC5nZXQoa2V5KSk7XG4gIH0gZWxzZSBpZiAoaGFzMi5jYWxsKHJhd1RhcmdldCwgcmF3S2V5KSkge1xuICAgIHJldHVybiB3cmFwKHRhcmdldC5nZXQocmF3S2V5KSk7XG4gIH0gZWxzZSBpZiAodGFyZ2V0ICE9PSByYXdUYXJnZXQpIHtcbiAgICB0YXJnZXQuZ2V0KGtleSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGhhcyhrZXksIGlzUmVhZG9ubHkyID0gZmFsc2UpIHtcbiAgY29uc3QgdGFyZ2V0ID0gdGhpc1tcIl9fdl9yYXdcIl07XG4gIGNvbnN0IHJhd1RhcmdldCA9IHRvUmF3KHRhcmdldCk7XG4gIGNvbnN0IHJhd0tleSA9IHRvUmF3KGtleSk7XG4gIGlmICghaXNSZWFkb25seTIpIHtcbiAgICBpZiAoaGFzQ2hhbmdlZChrZXksIHJhd0tleSkpIHtcbiAgICAgIHRyYWNrKHJhd1RhcmdldCwgXCJoYXNcIiwga2V5KTtcbiAgICB9XG4gICAgdHJhY2socmF3VGFyZ2V0LCBcImhhc1wiLCByYXdLZXkpO1xuICB9XG4gIHJldHVybiBrZXkgPT09IHJhd0tleSA/IHRhcmdldC5oYXMoa2V5KSA6IHRhcmdldC5oYXMoa2V5KSB8fCB0YXJnZXQuaGFzKHJhd0tleSk7XG59XG5mdW5jdGlvbiBzaXplKHRhcmdldCwgaXNSZWFkb25seTIgPSBmYWxzZSkge1xuICB0YXJnZXQgPSB0YXJnZXRbXCJfX3ZfcmF3XCJdO1xuICAhaXNSZWFkb25seTIgJiYgdHJhY2sodG9SYXcodGFyZ2V0KSwgXCJpdGVyYXRlXCIsIElURVJBVEVfS0VZKTtcbiAgcmV0dXJuIFJlZmxlY3QuZ2V0KHRhcmdldCwgXCJzaXplXCIsIHRhcmdldCk7XG59XG5mdW5jdGlvbiBhZGQodmFsdWUsIF9pc1NoYWxsb3cgPSBmYWxzZSkge1xuICBpZiAoIV9pc1NoYWxsb3cgJiYgIWlzU2hhbGxvdyh2YWx1ZSkgJiYgIWlzUmVhZG9ubHkodmFsdWUpKSB7XG4gICAgdmFsdWUgPSB0b1Jhdyh2YWx1ZSk7XG4gIH1cbiAgY29uc3QgdGFyZ2V0ID0gdG9SYXcodGhpcyk7XG4gIGNvbnN0IHByb3RvID0gZ2V0UHJvdG8odGFyZ2V0KTtcbiAgY29uc3QgaGFkS2V5ID0gcHJvdG8uaGFzLmNhbGwodGFyZ2V0LCB2YWx1ZSk7XG4gIGlmICghaGFkS2V5KSB7XG4gICAgdGFyZ2V0LmFkZCh2YWx1ZSk7XG4gICAgdHJpZ2dlcih0YXJnZXQsIFwiYWRkXCIsIHZhbHVlLCB2YWx1ZSk7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59XG5mdW5jdGlvbiBzZXQoa2V5LCB2YWx1ZSwgX2lzU2hhbGxvdyA9IGZhbHNlKSB7XG4gIGlmICghX2lzU2hhbGxvdyAmJiAhaXNTaGFsbG93KHZhbHVlKSAmJiAhaXNSZWFkb25seSh2YWx1ZSkpIHtcbiAgICB2YWx1ZSA9IHRvUmF3KHZhbHVlKTtcbiAgfVxuICBjb25zdCB0YXJnZXQgPSB0b1Jhdyh0aGlzKTtcbiAgY29uc3QgeyBoYXM6IGhhczIsIGdldDogZ2V0MiB9ID0gZ2V0UHJvdG8odGFyZ2V0KTtcbiAgbGV0IGhhZEtleSA9IGhhczIuY2FsbCh0YXJnZXQsIGtleSk7XG4gIGlmICghaGFkS2V5KSB7XG4gICAga2V5ID0gdG9SYXcoa2V5KTtcbiAgICBoYWRLZXkgPSBoYXMyLmNhbGwodGFyZ2V0LCBrZXkpO1xuICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICBjaGVja0lkZW50aXR5S2V5cyh0YXJnZXQsIGhhczIsIGtleSk7XG4gIH1cbiAgY29uc3Qgb2xkVmFsdWUgPSBnZXQyLmNhbGwodGFyZ2V0LCBrZXkpO1xuICB0YXJnZXQuc2V0KGtleSwgdmFsdWUpO1xuICBpZiAoIWhhZEtleSkge1xuICAgIHRyaWdnZXIodGFyZ2V0LCBcImFkZFwiLCBrZXksIHZhbHVlKTtcbiAgfSBlbHNlIGlmIChoYXNDaGFuZ2VkKHZhbHVlLCBvbGRWYWx1ZSkpIHtcbiAgICB0cmlnZ2VyKHRhcmdldCwgXCJzZXRcIiwga2V5LCB2YWx1ZSwgb2xkVmFsdWUpO1xuICB9XG4gI
20578HJldHVybiB0aGlzO1xufVxuZnVuY3Rpb24gZGVsZXRlRW50cnkoa2V5KSB7XG4gIGNvbnN0IHRhcmdldCA9IHRvUmF3KHRoaXMpO1xuICBjb25zdCB7IGhhczogaGFzMiwgZ2V0OiBnZXQyIH0gPSBnZXRQcm90byh0YXJnZXQpO1xuICBsZXQgaGFkS2V5ID0gaGFzMi5jYWxsKHRhcmdldCwga2V5KTtcbiAgaWYgKCFoYWRLZXkpIHtcbiAgICBrZXkgPSB0b1JhdyhrZXkpO1xuICAgIGhhZEtleSA9IGhhczIuY2FsbCh0YXJnZXQsIGtleSk7XG4gIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIGNoZWNrSWRlbnRpdHlLZXlzKHRhcmdldCwgaGFzMiwga2V5KTtcbiAgfVxuICBjb25zdCBvbGRWYWx1ZSA9IGdldDIgPyBnZXQyLmNhbGwodGFyZ2V0LCBrZXkpIDogdm9pZCAwO1xuICBjb25zdCByZXN1bHQgPSB0YXJnZXQuZGVsZXRlKGtleSk7XG4gIGlmIChoYWRLZXkpIHtcbiAgICB0cmlnZ2VyKHRhcmdldCwgXCJkZWxldGVcIiwga2V5LCB2b2lkIDAsIG9sZFZhbHVlKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gY2xlYXIoKSB7XG4gIGNvbnN0IHRhcmdldCA9IHRvUmF3KHRoaXMpO1xuICBjb25zdCBoYWRJdGVtcyA9IHRhcmdldC5zaXplICE9PSAwO1xuICBjb25zdCBvbGRUYXJnZXQgPSAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8gaXNNYXAodGFyZ2V0KSA/IG5ldyBNYXAodGFyZ2V0KSA6IG5ldyBTZXQodGFyZ2V0KSA6IHZvaWQgMDtcbiAgY29uc3QgcmVzdWx0ID0gdGFyZ2V0LmNsZWFyKCk7XG4gIGlmIChoYWRJdGVtcykge1xuICAgIHRyaWdnZXIodGFyZ2V0LCBcImNsZWFyXCIsIHZvaWQgMCwgdm9pZCAwLCBvbGRUYXJnZXQpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBjcmVhdGVGb3JFYWNoKGlzUmVhZG9ubHkyLCBpc1NoYWxsb3cyKSB7XG4gIHJldHVybiBmdW5jdGlvbiBmb3JFYWNoKGNhbGxiYWNrLCB0aGlzQXJnKSB7XG4gICAgY29uc3Qgb2JzZXJ2ZWQgPSB0aGlzO1xuICAgIGNvbnN0IHRhcmdldCA9IG9ic2VydmVkW1wiX192X3Jhd1wiXTtcbiAgICBjb25zdCByYXdUYXJnZXQgPSB0b1Jhdyh0YXJnZXQpO1xuICAgIGNvbnN0IHdyYXAgPSBpc1NoYWxsb3cyID8gdG9TaGFsbG93IDogaXNSZWFkb25seTIgPyB0b1JlYWRvbmx5IDogdG9SZWFjdGl2ZTtcbiAgICAhaXNSZWFkb25seTIgJiYgdHJhY2socmF3VGFyZ2V0LCBcIml0ZXJhdGVcIiwgSVRFUkFURV9LRVkpO1xuICAgIHJldHVybiB0YXJnZXQuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrLmNhbGwodGhpc0FyZywgd3JhcCh2YWx1ZSksIHdyYXAoa2V5KSwgb2JzZXJ2ZWQpO1xuICAgIH0pO1xuICB9O1xufVxuZnVuY3Rpb24gY3JlYXRlSXRlcmFibGVNZXRob2QobWV0aG9kLCBpc1JlYWRvbmx5MiwgaXNTaGFsbG93Mikge1xuICByZXR1cm4gZnVuY3Rpb24oLi4uYXJncykge1xuICAgIGNvbnN0IHRhcmdldCA9IHRoaXNbXCJfX3ZfcmF3XCJdO1xuICAgIGNvbnN0IHJhd1RhcmdldCA9IHRvUmF3KHRhcmdldCk7XG4gICAgY29uc3QgdGFyZ2V0SXNNYXAgPSBpc01hcChyYXdUYXJnZXQpO1xuICAgIGNvbnN0IGlzUGFpciA9IG1ldGhvZCA9PT0gXCJlbnRyaWVzXCIgfHwgbWV0aG9kID09PSBTeW1ib2wuaXRlcmF0b3IgJiYgdGFyZ2V0SXNNYXA7XG4gICAgY29uc3QgaXNLZXlPbmx5ID0gbWV0aG9kID09PSBcImtleXNcIiAmJiB0YXJnZXRJc01hcDtcbiAgICBjb25zdCBpbm5lckl0ZXJhdG9yID0gdGFyZ2V0W21ldGhvZF0oLi4uYXJncyk7XG4gICAgY29uc3Qgd3JhcCA9IGlzU2hhbGxvdzIgPyB0b1NoYWxsb3cgOiBpc1JlYWRvbmx5MiA/IHRvUmVhZG9ubHkgOiB0b1JlYWN0aXZlO1xuICAgICFpc1JlYWRvbmx5MiAmJiB0cmFjayhcbiAgICAgIHJhd1RhcmdldCxcbiAgICAgIFwiaXRlcmF0ZVwiLFxuICAgICAgaXNLZXlPbmx5ID8gTUFQX0tFWV9JVEVSQVRFX0tFWSA6IElURVJBVEVfS0VZXG4gICAgKTtcbiAgICByZXR1cm4ge1xuICAgICAgLy8gaXRlcmF0b3IgcHJvdG9jb2xcbiAgICAgIG5leHQoKSB7XG4gICAgICAgIGNvbnN0IHsgdmFsdWUsIGRvbmUgfSA9IGlubmVySXRlcmF0b3IubmV4dCgpO1xuICAgICAgICByZXR1cm4gZG9uZSA/IHsgdmFsdWUsIGRvbmUgfSA6IHtcbiAgICAgICAgICB2YWx1ZTogaXNQYWlyID8gW3dyYXAodmFsdWVbMF0pLCB3cmFwKHZhbHVlWzFdKV0gOiB3cmFwKHZhbHVlKSxcbiAgICAgICAgICBkb25lXG4gICAgICAgIH07XG4gICAgICB9LFxuICAgICAgLy8gaXRlcmFibGUgcHJvdG9jb2xcbiAgICAgIFtTeW1ib2wuaXRlcmF0b3JdKCkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICB9O1xuICB9O1xufVxuZnVuY3Rpb24gY3JlYXRlUmVhZG9ubHlNZXRob2QodHlwZSkge1xuICByZXR1cm4gZnVuY3Rpb24oLi4uYXJncykge1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICBjb25zdCBrZXkgPSBhcmdzWzBdID8gYG9uIGtleSBcIiR7YXJnc1swXX1cIiBgIDogYGA7XG4gICAgICB3YXJuKFxuICAgICAgICBgJHtjYXBpdGFsaXplKHR5cGUpfSBvcGVyYXRpb24gJHtrZXl9ZmFpbGVkOiB0YXJnZXQgaXMgcmVhZG9ubHkuYCxcbiAgICAgICAgdG9SYXcodGhpcylcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0eXBlID09PSBcImRlbGV0ZVwiID8gZmFsc2UgOiB0eXBlID09PSBcImNsZWFyXCIgPyB2b2lkIDAgOiB0aGlzO1xuICB9O1xufVxuZnVuY3Rpb24gY3JlYXRlSW5zdHJ1bWVudGF0aW9ucygpIHtcbiAgY29uc3QgbXV0YWJsZUluc3RydW1lbnRhdGlvbnMyID0ge1xuICAgIGdldChrZXkpIHtcbiAgICAgIHJldHVybiBnZXQodGhpcywga2V5KTtcbiAgICB9LFxuICAgIGdldCBzaXplKCkge1xuICAgICAgcmV0dXJuIHNpemUodGhpcyk7XG4gICAgfSxcbiAgICBoYXMsXG4gICAgYWRkLFxuICAgIHNldCxcbiAgICBkZWxldGU6IGRlbGV0ZUVudHJ5LFxuICAgIGNsZWFyLFxuICAgIGZvckVhY2g6IGNyZWF0ZUZvckVhY2goZmFsc2UsIGZhbHNlKVxuICB9O1xuICBjb25zdCBzaGFsbG93SW5zdHJ1bWVudGF0aW9uczIgPSB7XG4gICAgZ2V0KGtleSkge1xuICAgICAgcmV0dXJuIGdldCh0aGlzLCBrZXksIGZhbHNlLCB0cnVlKTtcbiAgICB9LFxuICAgIGdldCBzaXplKCkge1xuICAgICAgcmV0dXJuIHNpemUodGhpcyk7XG4gICAgfSxcbiAgICBoYXMsXG4gICAgYWRkKHZhbHVlKSB7XG4gICAgICByZXR1cm4gYWRkLmNhbGwodGhpcywgdmFsdWUsIHRydWUpO1xuICAgIH0sXG4gICAgc2V0KGtleSwgdmFsdWUpIHtcbiAgICAgIHJldHVybi
20578BzZXQuY2FsbCh0aGlzLCBrZXksIHZhbHVlLCB0cnVlKTtcbiAgICB9LFxuICAgIGRlbGV0ZTogZGVsZXRlRW50cnksXG4gICAgY2xlYXIsXG4gICAgZm9yRWFjaDogY3JlYXRlRm9yRWFjaChmYWxzZSwgdHJ1ZSlcbiAgfTtcbiAgY29uc3QgcmVhZG9ubHlJbnN0cnVtZW50YXRpb25zMiA9IHtcbiAgICBnZXQoa2V5KSB7XG4gICAgICByZXR1cm4gZ2V0KHRoaXMsIGtleSwgdHJ1ZSk7XG4gICAgfSxcbiAgICBnZXQgc2l6ZSgpIHtcbiAgICAgIHJldHVybiBzaXplKHRoaXMsIHRydWUpO1xuICAgIH0sXG4gICAgaGFzKGtleSkge1xuICAgICAgcmV0dXJuIGhhcy5jYWxsKHRoaXMsIGtleSwgdHJ1ZSk7XG4gICAgfSxcbiAgICBhZGQ6IGNyZWF0ZVJlYWRvbmx5TWV0aG9kKFwiYWRkXCIpLFxuICAgIHNldDogY3JlYXRlUmVhZG9ubHlNZXRob2QoXCJzZXRcIiksXG4gICAgZGVsZXRlOiBjcmVhdGVSZWFkb25seU1ldGhvZChcImRlbGV0ZVwiKSxcbiAgICBjbGVhcjogY3JlYXRlUmVhZG9ubHlNZXRob2QoXCJjbGVhclwiKSxcbiAgICBmb3JFYWNoOiBjcmVhdGVGb3JFYWNoKHRydWUsIGZhbHNlKVxuICB9O1xuICBjb25zdCBzaGFsbG93UmVhZG9ubHlJbnN0cnVtZW50YXRpb25zMiA9IHtcbiAgICBnZXQoa2V5KSB7XG4gICAgICByZXR1cm4gZ2V0KHRoaXMsIGtleSwgdHJ1ZSwgdHJ1ZSk7XG4gICAgfSxcbiAgICBnZXQgc2l6ZSgpIHtcbiAgICAgIHJldHVybiBzaXplKHRoaXMsIHRydWUpO1xuICAgIH0sXG4gICAgaGFzKGtleSkge1xuICAgICAgcmV0dXJuIGhhcy5jYWxsKHRoaXMsIGtleSwgdHJ1ZSk7XG4gICAgfSxcbiAgICBhZGQ6IGNyZWF0ZVJlYWRvbmx5TWV0aG9kKFwiYWRkXCIpLFxuICAgIHNldDogY3JlYXRlUmVhZG9ubHlNZXRob2QoXCJzZXRcIiksXG4gICAgZGVsZXRlOiBjcmVhdGVSZWFkb25seU1ldGhvZChcImRlbGV0ZVwiKSxcbiAgICBjbGVhcjogY3JlYXRlUmVhZG9ubHlNZXRob2QoXCJjbGVhclwiKSxcbiAgICBmb3JFYWNoOiBjcmVhdGVGb3JFYWNoKHRydWUsIHRydWUpXG4gIH07XG4gIGNvbnN0IGl0ZXJhdG9yTWV0aG9kcyA9IFtcbiAgICBcImtleXNcIixcbiAgICBcInZhbHVlc1wiLFxuICAgIFwiZW50cmllc1wiLFxuICAgIFN5bWJvbC5pdGVyYXRvclxuICBdO1xuICBpdGVyYXRvck1ldGhvZHMuZm9yRWFjaCgobWV0aG9kKSA9PiB7XG4gICAgbXV0YWJsZUluc3RydW1lbnRhdGlvbnMyW21ldGhvZF0gPSBjcmVhdGVJdGVyYWJsZU1ldGhvZChtZXRob2QsIGZhbHNlLCBmYWxzZSk7XG4gICAgcmVhZG9ubHlJbnN0cnVtZW50YXRpb25zMlttZXRob2RdID0gY3JlYXRlSXRlcmFibGVNZXRob2QobWV0aG9kLCB0cnVlLCBmYWxzZSk7XG4gICAgc2hhbGxvd0luc3RydW1lbnRhdGlvbnMyW21ldGhvZF0gPSBjcmVhdGVJdGVyYWJsZU1ldGhvZChtZXRob2QsIGZhbHNlLCB0cnVlKTtcbiAgICBzaGFsbG93UmVhZG9ubHlJbnN0cnVtZW50YXRpb25zMlttZXRob2RdID0gY3JlYXRlSXRlcmFibGVNZXRob2QoXG4gICAgICBtZXRob2QsXG4gICAgICB0cnVlLFxuICAgICAgdHJ1ZVxuICAgICk7XG4gIH0pO1xuICByZXR1cm4gW1xuICAgIG11dGFibGVJbnN0cnVtZW50YXRpb25zMixcbiAgICByZWFkb25seUluc3RydW1lbnRhdGlvbnMyLFxuICAgIHNoYWxsb3dJbnN0cnVtZW50YXRpb25zMixcbiAgICBzaGFsbG93UmVhZG9ubHlJbnN0cnVtZW50YXRpb25zMlxuICBdO1xufVxuY29uc3QgW1xuICBtdXRhYmxlSW5zdHJ1bWVudGF0aW9ucyxcbiAgcmVhZG9ubHlJbnN0cnVtZW50YXRpb25zLFxuICBzaGFsbG93SW5zdHJ1bWVudGF0aW9ucyxcbiAgc2hhbGxvd1JlYWRvbmx5SW5zdHJ1bWVudGF0aW9uc1xuXSA9IC8qIEBfX1BVUkVfXyAqLyBjcmVhdGVJbnN0cnVtZW50YXRpb25zKCk7XG5mdW5jdGlvbiBjcmVhdGVJbnN0cnVtZW50YXRpb25HZXR0ZXIoaXNSZWFkb25seTIsIHNoYWxsb3cpIHtcbiAgY29uc3QgaW5zdHJ1bWVudGF0aW9ucyA9IHNoYWxsb3cgPyBpc1JlYWRvbmx5MiA/IHNoYWxsb3dSZWFkb25seUluc3RydW1lbnRhdGlvbnMgOiBzaGFsbG93SW5zdHJ1bWVudGF0aW9ucyA6IGlzUmVhZG9ubHkyID8gcmVhZG9ubHlJbnN0cnVtZW50YXRpb25zIDogbXV0YWJsZUluc3RydW1lbnRhdGlvbnM7XG4gIHJldHVybiAodGFyZ2V0LCBrZXksIHJlY2VpdmVyKSA9PiB7XG4gICAgaWYgKGtleSA9PT0gXCJfX3ZfaXNSZWFjdGl2ZVwiKSB7XG4gICAgICByZXR1cm4gIWlzUmVhZG9ubHkyO1xuICAgIH0gZWxzZSBpZiAoa2V5ID09PSBcIl9fdl9pc1JlYWRvbmx5XCIpIHtcbiAgICAgIHJldHVybiBpc1JlYWRvbmx5MjtcbiAgICB9IGVsc2UgaWYgKGtleSA9PT0gXCJfX3ZfcmF3XCIpIHtcbiAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfVxuICAgIHJldHVybiBSZWZsZWN0LmdldChcbiAgICAgIGhhc093bihpbnN0cnVtZW50YXRpb25zLCBrZXkpICYmIGtleSBpbiB0YXJnZXQgPyBpbnN0cnVtZW50YXRpb25zIDogdGFyZ2V0LFxuICAgICAga2V5LFxuICAgICAgcmVjZWl2ZXJcbiAgICApO1xuICB9O1xufVxuY29uc3QgbXV0YWJsZUNvbGxlY3Rpb25IYW5kbGVycyA9IHtcbiAgZ2V0OiAvKiBAX19QVVJFX18gKi8gY3JlYXRlSW5zdHJ1bWVudGF0aW9uR2V0dGVyKGZhbHNlLCBmYWxzZSlcbn07XG5jb25zdCBzaGFsbG93Q29sbGVjdGlvbkhhbmRsZXJzID0ge1xuICBnZXQ6IC8qIEBfX1BVUkVfXyAqLyBjcmVhdGVJbnN0cnVtZW50YXRpb25HZXR0ZXIoZmFsc2UsIHRydWUpXG59O1xuY29uc3QgcmVhZG9ubHlDb2xsZWN0aW9uSGFuZGxlcnMgPSB7XG4gIGdldDogLyogQF9fUFVSRV9fICovIGNyZWF0ZUluc3RydW1lbnRhdGlvbkdldHRlcih0cnVlLCBmYWxzZSlcbn07XG5jb25zdCBzaGFsbG93UmVhZG9ubHlDb2xsZWN0aW9uSGFuZGxlcnMgPSB7XG4gIGdldDogLyogQF9fUFVSRV9fICovIGNyZWF0ZUluc3RydW1lbnRhdGlvbkdldHRlcih0cnVlLCB0cnVlKVxufTtcbmZ1bmN0aW9uIGNoZWNrSWRlbnRpdHlLZXlzKHRhcmdldCwgaGFzMiwga2V5KSB7XG4gIGNvbnN0IHJhd0tleSA9IHRvUmF3KGtleSk7XG4gIGlmIChyYXdLZXkgIT09IGtleSAmJiBoYXMyLmNhbGwodGFyZ2V0LCByYXdLZXkpKSB7XG4gICAgY29uc3QgdHlwZSA9IHRvUmF3VHlwZSh0YXJnZXQpO1xuICAgIHdhcm4oXG4gICAgICBgUmVhY3RpdmUgJHt0eXBlfSBjb250YWlucyBib3RoIHRoZSByYXcgYW5kIHJlYWN0aXZlIHZlcnNpb25zIG9mIHRoZSBzYW1lIG9iamVjdCR7dHlwZSA9PT0gYE1hcGAgPyBgIGFzIGtleXNgIDogYGB9LCB3aGljaCBjYW4gbGVhZCB0byBpbmNvbnNpc3RlbmNpZXMuIEF2b2lkIGRpZmZlcmVudGlhdGluZyBiZXR3ZWVuIHRoZSByYXcgYW5kIHJlYWN0aXZlIHZlcnNpb25zIG9mIGFuIG9iamVjdCBhbmQgb25seSB1c2UgdGhlIHJlYWN0aXZlIHZlcnNpb24gaWYgcG9zc2libGUuYFxuICAgICk7XG4gIH1cbn1cblxuY29uc3QgcmVhY3RpdmVNYXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKTtcbmNvbnN0IHNoYWxsb3dSZWFjdGl2ZU1hcCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpO1xuY29uc3QgcmVhZG9ubHlNYXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKTtcbmNvbnN0IHNoYWxsb3dSZWFkb25seU1hcCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpO1xuZnVuY3Rpb24gdGFyZ2V0VHlwZU1hcChyYXdUeXBlKSB7XG4gIHN3aXRjaCAocmF3VHlwZSkge1xuICAgIGNhc2UgXCJPYmplY3RcIjpcbiAgICBjYXNlIFwiQXJyYXlcIjpcbiAgICAgIHJldHVybiAxIC8qIENPTU1PTiAqLztcbiAgICBjYXNlIFwiTWFwXCI6XG4gICAgY2FzZSBcIlNldFwiOlxuICAgIGNhc2UgXCJXZWFrTWFwXCI6XG4gICAgY2FzZSBcIldlYWtTZXRcIjpcbiAgICAgIHJldHVybiAyIC8qIENPTExFQ1RJT04gKi87XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiAwIC8qIElOVkFMSUQgKi87XG4gIH1cbn1cbmZ1bmN0aW9uIGdldFRhcmdldFR5cGUodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlW1wiX192X3NraXBcIl0gfHwgIU9iamVjdC5pc0V4dGVuc2libGUodmFsdWUpID8gMCAvKiBJTlZBTElEICovIDogdGFyZ2V0VHlwZU1hcCh0b1Jhd1R5cGUodmFsdWUpKTtcbn1cbmZ1bmN0aW9uIHJlYWN0aXZlKHRhcmdldCkge1xuICBpZiAoaXNSZWFkb25seSh0YXJnZXQpKSB7XG4gICAgcmV0dXJuIHRhcmdldDtcbiAgfVxuICByZXR1cm4gY3JlYXRlUmVhY3RpdmVPYmplY3QoXG4gICAgdGFyZ2V0LFxuICAgIGZhbHNlLFxuICAgIG11dGFibGVIYW5kbGVycyxcbiAgICBtdXRhYmxlQ29sbGVjdGlvbkhhbmRsZXJzLFxuICAgIHJlYWN0aXZlTWFwXG4gICk7XG59XG5mdW5jdGlvbiBzaGFsbG93UmVhY3RpdmUodGFyZ2V0KSB7XG4gIHJldHVybi
20578BjcmVhdGVSZWFjdGl2ZU9iamVjdChcbiAgICB0YXJnZXQsXG4gICAgZmFsc2UsXG4gICAgc2hhbGxvd1JlYWN0aXZlSGFuZGxlcnMsXG4gICAgc2hhbGxvd0NvbGxlY3Rpb25IYW5kbGVycyxcbiAgICBzaGFsbG93UmVhY3RpdmVNYXBcbiAgKTtcbn1cbmZ1bmN0aW9uIHJlYWRvbmx5KHRhcmdldCkge1xuICByZXR1cm4gY3JlYXRlUmVhY3RpdmVPYmplY3QoXG4gICAgdGFyZ2V0LFxuICAgIHRydWUsXG4gICAgcmVhZG9ubHlIYW5kbGVycyxcbiAgICByZWFkb25seUNvbGxlY3Rpb25IYW5kbGVycyxcbiAgICByZWFkb25seU1hcFxuICApO1xufVxuZnVuY3Rpb24gc2hhbGxvd1JlYWRvbmx5KHRhcmdldCkge1xuICByZXR1cm4gY3JlYXRlUmVhY3RpdmVPYmplY3QoXG4gICAgdGFyZ2V0LFxuICAgIHRydWUsXG4gICAgc2hhbGxvd1JlYWRvbmx5SGFuZGxlcnMsXG4gICAgc2hhbGxvd1JlYWRvbmx5Q29sbGVjdGlvbkhhbmRsZXJzLFxuICAgIHNoYWxsb3dSZWFkb25seU1hcFxuICApO1xufVxuZnVuY3Rpb24gY3JlYXRlUmVhY3RpdmVPYmplY3QodGFyZ2V0LCBpc1JlYWRvbmx5MiwgYmFzZUhhbmRsZXJzLCBjb2xsZWN0aW9uSGFuZGxlcnMsIHByb3h5TWFwKSB7XG4gIGlmICghaXNPYmplY3QodGFyZ2V0KSkge1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICB3YXJuKFxuICAgICAgICBgdmFsdWUgY2Fubm90IGJlIG1hZGUgJHtpc1JlYWRvbmx5MiA/IFwicmVhZG9ubHlcIiA6IFwicmVhY3RpdmVcIn06ICR7U3RyaW5nKFxuICAgICAgICAgIHRhcmdldFxuICAgICAgICApfWBcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0YXJnZXQ7XG4gIH1cbiAgaWYgKHRhcmdldFtcIl9fdl9yYXdcIl0gJiYgIShpc1JlYWRvbmx5MiAmJiB0YXJnZXRbXCJfX3ZfaXNSZWFjdGl2ZVwiXSkpIHtcbiAgICByZXR1cm4gdGFyZ2V0O1xuICB9XG4gIGNvbnN0IGV4aXN0aW5nUHJveHkgPSBwcm94eU1hcC5nZXQodGFyZ2V0KTtcbiAgaWYgKGV4aXN0aW5nUHJveHkpIHtcbiAgICByZXR1cm4gZXhpc3RpbmdQcm94eTtcbiAgfVxuICBjb25zdCB0YXJnZXRUeXBlID0gZ2V0VGFyZ2V0VHlwZSh0YXJnZXQpO1xuICBpZiAodGFyZ2V0VHlwZSA9PT0gMCAvKiBJTlZBTElEICovKSB7XG4gICAgcmV0dXJuIHRhcmdldDtcbiAgfVxuICBjb25zdCBwcm94eSA9IG5ldyBQcm94eShcbiAgICB0YXJnZXQsXG4gICAgdGFyZ2V0VHlwZSA9PT0gMiAvKiBDT0xMRUNUSU9OICovID8gY29sbGVjdGlvbkhhbmRsZXJzIDogYmFzZUhhbmRsZXJzXG4gICk7XG4gIHByb3h5TWFwLnNldCh0YXJnZXQsIHByb3h5KTtcbiAgcmV0dXJuIHByb3h5O1xufVxuZnVuY3Rpb24gaXNSZWFjdGl2ZSh2YWx1ZSkge1xuICBpZiAoaXNSZWFkb25seSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gaXNSZWFjdGl2ZSh2YWx1ZVtcIl9fdl9yYXdcIl0pO1xuICB9XG4gIHJldHVybiAhISh2YWx1ZSAmJiB2YWx1ZVtcIl9fdl9pc1JlYWN0aXZlXCJdKTtcbn1cbmZ1bmN0aW9uIGlzUmVhZG9ubHkodmFsdWUpIHtcbiAgcmV0dXJuICEhKHZhbHVlICYmIHZhbHVlW1wiX192X2lzUmVhZG9ubHlcIl0pO1xufVxuZnVuY3Rpb24gaXNTaGFsbG93KHZhbHVlKSB7XG4gIHJldHVybiAhISh2YWx1ZSAmJiB2YWx1ZVtcIl9fdl9pc1NoYWxsb3dcIl0pO1xufVxuZnVuY3Rpb24gaXNQcm94eSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgPyAhIXZhbHVlW1wiX192X3Jhd1wiXSA6IGZhbHNlO1xufVxuZnVuY3Rpb24gdG9SYXcob2JzZXJ2ZWQpIHtcbiAgY29uc3QgcmF3ID0gb2JzZXJ2ZWQgJiYgb2JzZXJ2ZWRbXCJfX3ZfcmF3XCJdO1xuICByZXR1cm4gcmF3ID8gdG9SYXcocmF3KSA6IG9ic2VydmVkO1xufVxuZnVuY3Rpb24gbWFya1Jhdyh2YWx1ZSkge1xuICBpZiAoT2JqZWN0LmlzRXh0ZW5zaWJsZSh2YWx1ZSkpIHtcbiAgICBkZWYodmFsdWUsIFwiX192X3NraXBcIiwgdHJ1ZSk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuY29uc3QgdG9SZWFjdGl2ZSA9ICh2YWx1ZSkgPT4gaXNPYmplY3QodmFsdWUpID8gcmVhY3RpdmUodmFsdWUpIDogdmFsdWU7XG5jb25zdCB0b1JlYWRvbmx5ID0gKHZhbHVlKSA9PiBpc09iamVjdCh2YWx1ZSkgPyByZWFkb25seSh2YWx1ZSkgOiB2YWx1ZTtcblxuY29uc3QgQ09NUFVURURfU0lERV9FRkZFQ1RfV0FSTiA9IGBDb21wdXRlZCBpcyBzdGlsbCBkaXJ0eSBhZnRlciBnZXR0ZXIgZXZhbHVhdGlvbiwgbGlrZWx5IGJlY2F1c2UgYSBjb21wdXRlZCBpcyBtdXRhdGluZyBpdHMgb3duIGRlcGVuZGVuY3kgaW4gaXRzIGdldHRlci4gU3RhdGUgbXV0YXRpb25zIGluIGNvbXB1dGVkIGdldHRlcnMgc2hvdWxkIGJlIGF2b2lkZWQuICBDaGVjayB0aGUgZG9jcyBmb3IgbW9yZSBkZXRhaWxzOiBodHRwczovL3Z1ZWpzLm9yZy9ndWlkZS9lc3NlbnRpYWxzL2NvbXB1dGVkLmh0bWwjZ2V0dGVycy1zaG91bGQtYmUtc2lkZS1lZmZlY3QtZnJlZWA7XG5jbGFzcyBDb21wdXRlZFJlZkltcGwge1xuICBjb25zdHJ1Y3RvcihnZXR0ZXIsIF9zZXR0ZXIsIGlzUmVhZG9ubHksIGlzU1NSKSB7XG4gICAgdGhpcy5nZXR0ZXIgPSBnZXR0ZXI7XG4gICAgdGhpcy5fc2V0dGVyID0gX3NldHRlcjtcbiAgICB0aGlzLmRlcCA9IHZvaWQgMDtcbiAgICB0aGlzLl9fdl9pc1JlZiA9IHRydWU7XG4gICAgdGhpc1tcIl9fdl9pc1JlYWRvbmx5XCJdID0gZmFsc2U7XG4gICAgdGhpcy5lZmZlY3QgPSBuZXcgUmVhY3RpdmVFZmZlY3QoXG4gICAgICAoKSA9PiBnZXR0ZXIodGhpcy5fdmFsdWUpLFxuICAgICAgKCkgPT4gdHJpZ2dlclJlZlZhbHVlKFxuICAgICAgICB0aGlzLFxuICAgICAgICB0aGlzLmVmZmVjdC5fZGlydHlMZXZlbCA9PT0gMiA/IDIgOiAzXG4gICAgICApXG4gICAgKTtcbiAgICB0aGlzLmVmZmVjdC5jb21wdXRlZCA9IHRoaXM7XG4gICAgdGhpcy5lZmZlY3QuYWN0aXZlID0gdGhpcy5fY2FjaGVhYmxlID0gIWlzU1NSO1xuICAgIHRoaXNbXCJfX3ZfaXNSZWFkb25seVwiXSA9IGlzUmVhZG9ubHk7XG4gIH1cbiAgZ2V0IHZhbHVlKCkge1xuICAgIGNvbnN0IHNlbGYgPSB0b1Jhdyh0aGlzKTtcbiAgICBpZiAoKCFzZWxmLl9jYWNoZWFibGUgfHwgc2VsZi5lZmZlY3QuZGlydHkpICYmIGhhc0NoYW5nZWQoc2VsZi5fdmFsdWUsIHNlbGYuX3ZhbHVlID0gc2VsZi5lZmZlY3QucnVuKCkpKSB7XG4gICAgICB0cmlnZ2VyUmVmVmFsdWUoc2VsZiwgNCk7XG4gICAgfVxuICAgIHRyYWNrUmVmVmFsdWUoc2VsZik7XG4gICAgaWYgKHNlbGYuZWZmZWN0Ll9kaXJ0eUxldmVsID49IDIpIHtcbiAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9k
20578dWN0aW9uXCIpICYmIHRoaXMuX3dhcm5SZWN1cnNpdmUpIHtcbiAgICAgICAgd2FybihDT01QVVRFRF9TSURFX0VGRkVDVF9XQVJOLCBgXG5cbmdldHRlcjogYCwgdGhpcy5nZXR0ZXIpO1xuICAgICAgfVxuICAgICAgdHJpZ2dlclJlZlZhbHVlKHNlbGYsIDIpO1xuICAgIH1cbiAgICByZXR1cm4gc2VsZi5fdmFsdWU7XG4gIH1cbiAgc2V0IHZhbHVlKG5ld1ZhbHVlKSB7XG4gICAgdGhpcy5fc2V0dGVyKG5ld1ZhbHVlKTtcbiAgfVxuICAvLyAjcmVnaW9uIHBvbHlmaWxsIF9kaXJ0eSBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB0aGlyZCBwYXJ0eSBjb2RlIGZvciBWdWUgPD0gMy4zLnhcbiAgZ2V0IF9kaXJ0eSgpIHtcbiAgICByZXR1cm4gdGhpcy5lZmZlY3QuZGlydHk7XG4gIH1cbiAgc2V0IF9kaXJ0eSh2KSB7XG4gICAgdGhpcy5lZmZlY3QuZGlydHkgPSB2O1xuICB9XG4gIC8vICNlbmRyZWdpb25cbn1cbmZ1bmN0aW9uIGNvbXB1dGVkKGdldHRlck9yT3B0aW9ucywgZGVidWdPcHRpb25zLCBpc1NTUiA9IGZhbHNlKSB7XG4gIGxldCBnZXR0ZXI7XG4gIGxldCBzZXR0ZXI7XG4gIGNvbnN0IG9ubHlHZXR0ZXIgPSBpc0Z1bmN0aW9uKGdldHRlck9yT3B0aW9ucyk7XG4gIGlmIChvbmx5R2V0dGVyKSB7XG4gICAgZ2V0dGVyID0gZ2V0dGVyT3JPcHRpb25zO1xuICAgIHNldHRlciA9ICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyAoKSA9PiB7XG4gICAgICB3YXJuKFwiV3JpdGUgb3BlcmF0aW9uIGZhaWxlZDogY29tcHV0ZWQgdmFsdWUgaXMgcmVhZG9ubHlcIik7XG4gICAgfSA6IE5PT1A7XG4gIH0gZWxzZSB7XG4gICAgZ2V0dGVyID0gZ2V0dGVyT3JPcHRpb25zLmdldDtcbiAgICBzZXR0ZXIgPSBnZXR0ZXJPck9wdGlvbnMuc2V0O1xuICB9XG4gIGNvbnN0IGNSZWYgPSBuZXcgQ29tcHV0ZWRSZWZJbXBsKGdldHRlciwgc2V0dGVyLCBvbmx5R2V0dGVyIHx8ICFzZXR0ZXIsIGlzU1NSKTtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgZGVidWdPcHRpb25zICYmICFpc1NTUikge1xuICAgIGNSZWYuZWZmZWN0Lm9uVHJhY2sgPSBkZWJ1Z09wdGlvbnMub25UcmFjaztcbiAgICBjUmVmLmVmZmVjdC5vblRyaWdnZXIgPSBkZWJ1Z09wdGlvbnMub25UcmlnZ2VyO1xuICB9XG4gIHJldHVybiBjUmVmO1xufVxuXG5mdW5jdGlvbiB0cmFja1JlZlZhbHVlKHJlZjIpIHtcbiAgdmFyIF9hO1xuICBpZiAoc2hvdWxkVHJhY2sgJiYgYWN0aXZlRWZmZWN0KSB7XG4gICAgcmVmMiA9IHRvUmF3KHJlZjIpO1xuICAgIHRyYWNrRWZmZWN0KFxuICAgICAgYWN0aXZlRWZmZWN0LFxuICAgICAgKF9hID0gcmVmMi5kZXApICE9IG51bGwgPyBfYSA6IHJlZjIuZGVwID0gY3JlYXRlRGVwKFxuICAgICAgICAoKSA9PiByZWYyLmRlcCA9IHZvaWQgMCxcbiAgICAgICAgcmVmMiBpbnN0YW5jZW9mIENvbXB1dGVkUmVmSW1wbCA/IHJlZjIgOiB2b2lkIDBcbiAgICAgICksXG4gICAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8ge1xuICAgICAgICB0YXJnZXQ6IHJlZjIsXG4gICAgICAgIHR5cGU6IFwiZ2V0XCIsXG4gICAgICAgIGtleTogXCJ2YWx1ZVwiXG4gICAgICB9IDogdm9pZCAwXG4gICAgKTtcbiAgfVxufVxuZnVuY3Rpb24gdHJpZ2dlclJlZlZhbHVlKHJlZjIsIGRpcnR5TGV2ZWwgPSA0LCBuZXdWYWwsIG9sZFZhbCkge1xuICByZWYyID0gdG9SYXcocmVmMik7XG4gIGNvbnN0IGRlcCA9IHJlZjIuZGVwO1xuICBpZiAoZGVwKSB7XG4gICAgdHJpZ2dlckVmZmVjdHMoXG4gICAgICBkZXAsXG4gICAgICBkaXJ0eUxldmVsLFxuICAgICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IHtcbiAgICAgICAgdGFyZ2V0OiByZWYyLFxuICAgICAgICB0eXBlOiBcInNldFwiLFxuICAgICAgICBrZXk6IFwidmFsdWVcIixcbiAgICAgICAgbmV3VmFsdWU6IG5ld1ZhbCxcbiAgICAgICAgb2xkVmFsdWU6IG9sZFZhbFxuICAgICAgfSA6IHZvaWQgMFxuICAgICk7XG4gIH1cbn1cbmZ1bmN0aW9uIGlzUmVmKHIpIHtcbiAgcmV0dXJuICEhKHIgJiYgci5fX3ZfaXNSZWYgPT09IHRydWUpO1xufVxuZnVuY3Rpb24gcmVmKHZhbHVlKSB7XG4gIHJldHVybiBjcmVhdGVSZWYodmFsdWUsIGZhbHNlKTtcbn1cbmZ1bmN0aW9uIHNoYWxsb3dSZWYodmFsdWUpIHtcbiAgcmV0dXJuIGNyZWF0ZVJlZih2YWx1ZSwgdHJ1ZSk7XG59XG5mdW5jdGlvbiBjcmVhdGVSZWYocmF3VmFsdWUsIHNoYWxsb3cpIHtcbiAgaWYgKGlzUmVmKHJhd1ZhbHVlKSkge1xuICAgIHJldHVybiByYXdWYWx1ZTtcbiAgfVxuICByZXR1cm4gbmV3IFJlZkltcGwocmF3VmFsdWUsIHNoYWxsb3cpO1xufVxuY2xhc3MgUmVmSW1wbCB7XG4gIGNvbnN0cnVjdG9yKHZhbHVlLCBfX3ZfaXNTaGFsbG93KSB7XG4gICAgdGhpcy5fX3ZfaXNTaGFsbG93ID0gX192X2lzU2hhbGxvdztcbiAgICB0aGlzLmRlcCA9IHZvaWQgMDtcbiAgICB0aGlzLl9fdl9pc1JlZiA9IHRydWU7XG4gICAgdGhpcy5fcmF3VmFsdWUgPSBfX3ZfaXNTaGFsbG93ID8gdmFsdWUgOiB0b1Jhdyh2YWx1ZSk7XG4gICAgdGhpcy5fdmFsdWUgPSBfX3ZfaXNTaGFsbG93ID8gdmFsdWUgOiB0b1JlYWN0aXZlKHZhbHVlKTtcbiAgfVxuICBnZXQgdmFsdWUoKSB7XG4gICAgdHJhY2tSZWZWYWx1ZSh0aGlzKTtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gIH1cbiAgc2V0IHZhbHVlKG5ld1ZhbCkge1xuICAgIGNvbnN0IHVzZURpcmVjdFZhbHVlID0gdGhpcy5fX3ZfaXNTaGFsbG93IHx8IGlzU2hhbGxvdyhuZXdWYWwpIHx8IGlzUmVhZG9ubHkobmV3VmFsKTtcbiAgICBuZXdWYWwgPSB1c2VEaXJlY3RWYWx1ZSA/IG5ld1ZhbCA6IHRvUmF3KG5ld1ZhbCk7XG4gICAgaWYgKGhhc0NoYW5nZWQobmV3VmFsLCB0aGlzLl9yYXdWYWx1ZSkpIHtcbiAgICAgIGNvbnN0IG9sZFZhbCA9IHRoaXMuX3Jhd1ZhbHVlO1xuICAgICAgdGhpcy5fcmF3VmFsdWUgPSBuZXdWYWw7XG4gICAgICB0aGlzLl92YWx1ZSA9IHVzZURpcmVjdFZhbHVlID8gbmV3VmFsIDogdG9SZWFjdGl2ZShuZXdWYWwpO1xuICAgICAgdHJpZ2dlclJlZlZhbHVlKHRoaXMsIDQsIG5ld1ZhbCwgb2xkVmFsKTtcbiAgICB9XG4gI
20578H1cbn1cbmZ1bmN0aW9uIHRyaWdnZXJSZWYocmVmMikge1xuICB0cmlnZ2VyUmVmVmFsdWUocmVmMiwgNCwgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IHJlZjIudmFsdWUgOiB2b2lkIDApO1xufVxuZnVuY3Rpb24gdW5yZWYocmVmMikge1xuICByZXR1cm4gaXNSZWYocmVmMikgPyByZWYyLnZhbHVlIDogcmVmMjtcbn1cbmZ1bmN0aW9uIHRvVmFsdWUoc291cmNlKSB7XG4gIHJldHVybiBpc0Z1bmN0aW9uKHNvdXJjZSkgPyBzb3VyY2UoKSA6IHVucmVmKHNvdXJjZSk7XG59XG5jb25zdCBzaGFsbG93VW53cmFwSGFuZGxlcnMgPSB7XG4gIGdldDogKHRhcmdldCwga2V5LCByZWNlaXZlcikgPT4gdW5yZWYoUmVmbGVjdC5nZXQodGFyZ2V0LCBrZXksIHJlY2VpdmVyKSksXG4gIHNldDogKHRhcmdldCwga2V5LCB2YWx1ZSwgcmVjZWl2ZXIpID0+IHtcbiAgICBjb25zdCBvbGRWYWx1ZSA9IHRhcmdldFtrZXldO1xuICAgIGlmIChpc1JlZihvbGRWYWx1ZSkgJiYgIWlzUmVmKHZhbHVlKSkge1xuICAgICAgb2xkVmFsdWUudmFsdWUgPSB2YWx1ZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gUmVmbGVjdC5zZXQodGFyZ2V0LCBrZXksIHZhbHVlLCByZWNlaXZlcik7XG4gICAgfVxuICB9XG59O1xuZnVuY3Rpb24gcHJveHlSZWZzKG9iamVjdFdpdGhSZWZzKSB7XG4gIHJldHVybiBpc1JlYWN0aXZlKG9iamVjdFdpdGhSZWZzKSA/IG9iamVjdFdpdGhSZWZzIDogbmV3IFByb3h5KG9iamVjdFdpdGhSZWZzLCBzaGFsbG93VW53cmFwSGFuZGxlcnMpO1xufVxuY2xhc3MgQ3VzdG9tUmVmSW1wbCB7XG4gIGNvbnN0cnVjdG9yKGZhY3RvcnkpIHtcbiAgICB0aGlzLmRlcCA9IHZvaWQgMDtcbiAgICB0aGlzLl9fdl9pc1JlZiA9IHRydWU7XG4gICAgY29uc3QgeyBnZXQsIHNldCB9ID0gZmFjdG9yeShcbiAgICAgICgpID0+IHRyYWNrUmVmVmFsdWUodGhpcyksXG4gICAgICAoKSA9PiB0cmlnZ2VyUmVmVmFsdWUodGhpcylcbiAgICApO1xuICAgIHRoaXMuX2dldCA9IGdldDtcbiAgICB0aGlzLl9zZXQgPSBzZXQ7XG4gIH1cbiAgZ2V0IHZhbHVlKCkge1xuICAgIHJldHVybiB0aGlzLl9nZXQoKTtcbiAgfVxuICBzZXQgdmFsdWUobmV3VmFsKSB7XG4gICAgdGhpcy5fc2V0KG5ld1ZhbCk7XG4gIH1cbn1cbmZ1bmN0aW9uIGN1c3RvbVJlZihmYWN0b3J5KSB7XG4gIHJldHVybiBuZXcgQ3VzdG9tUmVmSW1wbChmYWN0b3J5KTtcbn1cbmZ1bmN0aW9uIHRvUmVmcyhvYmplY3QpIHtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgIWlzUHJveHkob2JqZWN0KSkge1xuICAgIHdhcm4oYHRvUmVmcygpIGV4cGVjdHMgYSByZWFjdGl2ZSBvYmplY3QgYnV0IHJlY2VpdmVkIGEgcGxhaW4gb25lLmApO1xuICB9XG4gIGNvbnN0IHJldCA9IGlzQXJyYXkob2JqZWN0KSA/IG5ldyBBcnJheShvYmplY3QubGVuZ3RoKSA6IHt9O1xuICBmb3IgKGNvbnN0IGtleSBpbiBvYmplY3QpIHtcbiAgICByZXRba2V5XSA9IHByb3BlcnR5VG9SZWYob2JqZWN0LCBrZXkpO1xuICB9XG4gIHJldHVybiByZXQ7XG59XG5jbGFzcyBPYmplY3RSZWZJbXBsIHtcbiAgY29uc3RydWN0b3IoX29iamVjdCwgX2tleSwgX2RlZmF1bHRWYWx1ZSkge1xuICAgIHRoaXMuX29iamVjdCA9IF9vYmplY3Q7XG4gICAgdGhpcy5fa2V5ID0gX2tleTtcbiAgICB0aGlzLl9kZWZhdWx0VmFsdWUgPSBfZGVmYXVsdFZhbHVlO1xuICAgIHRoaXMuX192X2lzUmVmID0gdHJ1ZTtcbiAgfVxuICBnZXQgdmFsdWUoKSB7XG4gICAgY29uc3QgdmFsID0gdGhpcy5fb2JqZWN0W3RoaXMuX2tleV07XG4gICAgcmV0dXJuIHZhbCA9PT0gdm9pZCAwID8gdGhpcy5fZGVmYXVsdFZhbHVlIDogdmFsO1xuICB9XG4gIHNldCB2YWx1ZShuZXdWYWwpIHtcbiAgICB0aGlzLl9vYmplY3RbdGhpcy5fa2V5XSA9IG5ld1ZhbDtcbiAgfVxuICBnZXQgZGVwKCkge1xuICAgIHJldHVybiBnZXREZXBGcm9tUmVhY3RpdmUodG9SYXcodGhpcy5fb2JqZWN0KSwgdGhpcy5fa2V5KTtcbiAgfVxufVxuY2xhc3MgR2V0dGVyUmVmSW1wbCB7XG4gIGNvbnN0cnVjdG9yKF9nZXR0ZXIpIHtcbiAgICB0aGlzLl9nZXR0ZXIgPSBfZ2V0dGVyO1xuICAgIHRoaXMuX192X2lzUmVmID0gdHJ1ZTtcbiAgICB0aGlzLl9fdl9pc1JlYWRvbmx5ID0gdHJ1ZTtcbiAgfVxuICBnZXQgdmFsdWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2dldHRlcigpO1xuICB9XG59XG5mdW5jdGlvbiB0b1JlZihzb3VyY2UsIGtleSwgZGVmYXVsdFZhbHVlKSB7XG4gIGlmIChpc1JlZihzb3VyY2UpKSB7XG4gICAgcmV0dXJuIHNvdXJjZTtcbiAgfSBlbHNlIGlmIChpc0Z1bmN0aW9uKHNvdXJjZSkpIHtcbiAgICByZXR1cm4gbmV3IEdldHRlclJlZkltcGwoc291cmNlKTtcbiAgfSBlbHNlIGlmIChpc09iamVjdChzb3VyY2UpICYmIGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgcmV0dXJuIHByb3BlcnR5VG9SZWYoc291cmNlLCBrZXksIGRlZmF1bHRWYWx1ZSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHJlZihzb3VyY2UpO1xuICB9XG59XG5mdW5jdGlvbiBwcm9wZXJ0eVRvUmVmKHNvdXJjZSwga2V5LCBkZWZhdWx0VmFsdWUpIHtcbiAgY29uc3QgdmFsID0gc291cmNlW2tleV07XG4gIHJldHVybiBpc1JlZih2YWwpID8gdmFsIDogbmV3IE9iamVjdFJlZkltcGwoc291cmNlLCBrZXksIGRlZmF1bHRWYWx1ZSk7XG59XG5cbmNvbnN0IGRlZmVycmVkQ29tcHV0ZWQgPSBjb21wdXRlZDtcblxuY29uc3QgVHJhY2tPcFR5cGVzID0ge1xuICBcIkdFVFwiOiBcImdldFwiLFxuICBcIkhBU1wiOiBcImhhc1wiLFxuICBcIklURVJBVEVcIjogXCJpdGVyYXRlXCJcbn07XG5jb25zdCBUcmlnZ2VyT3BUeXBlcyA9IHtcbiAgXCJTRVRcIjogXCJzZXRcIixcbiAgXCJBRERcIjogXCJhZGRcIixcbiAgXCJERUxFVEVcIjogXCJkZWxldGVcIixcbiAgXCJDTEVBUlwiOiBcImNsZWFyXCJcbn07XG5jb25zdCBSZWFjdGl2ZUZsYWdzID0ge1xuICBcIlNLSVBcIjogXCJfX3Zfc2tpcFwiLFxuICBcIklTX1JFQUNUSVZFXCI6IFwiX192X2lzUmVhY3RpdmVcIixcbiAgXCJJU19SRUFET05MWVwiOiBcIl9fdl9pc1JlYWRvbmx5XCIsXG4gIFwiSVNfU0hBTExPV1wiOiBcIl9fdl9pc1NoYWxsb3dcIixcbiAgXCJSQVdcIjogXCJfX3ZfcmF3XCJcbn07XG5cbmV4cG9ydCB7
20578IEVmZmVjdFNjb3BlLCBJVEVSQVRFX0tFWSwgUmVhY3RpdmVFZmZlY3QsIFJlYWN0aXZlRmxhZ3MsIFRyYWNrT3BUeXBlcywgVHJpZ2dlck9wVHlwZXMsIGNvbXB1dGVkLCBjdXN0b21SZWYsIGRlZmVycmVkQ29tcHV0ZWQsIGVmZmVjdCwgZWZmZWN0U2NvcGUsIGVuYWJsZVRyYWNraW5nLCBnZXRDdXJyZW50U2NvcGUsIGlzUHJveHksIGlzUmVhY3RpdmUsIGlzUmVhZG9ubHksIGlzUmVmLCBpc1NoYWxsb3csIG1hcmtSYXcsIG9uU2NvcGVEaXNwb3NlLCBwYXVzZVNjaGVkdWxpbmcsIHBhdXNlVHJhY2tpbmcsIHByb3h5UmVmcywgcmVhY3RpdmUsIHJlYWRvbmx5LCByZWYsIHJlc2V0U2NoZWR1bGluZywgcmVzZXRUcmFja2luZywgc2hhbGxvd1JlYWN0aXZlLCBzaGFsbG93UmVhZG9ubHksIHNoYWxsb3dSZWYsIHN0b3AsIHRvUmF3LCB0b1JlZiwgdG9SZWZzLCB0b1ZhbHVlLCB0cmFjaywgdHJpZ2dlciwgdHJpZ2dlclJlZiwgdW5yZWYgfTtcbiIsIi8qKlxuKiBAdnVlL3J1bnRpbWUtY29yZSB2My40LjM0XG4qIChjKSAyMDE4LXByZXNlbnQgWXV4aSAoRXZhbikgWW91IGFuZCBWdWUgY29udHJpYnV0b3JzXG4qIEBsaWNlbnNlIE1JVFxuKiovXG5pbXBvcnQgeyBwYXVzZVRyYWNraW5nLCByZXNldFRyYWNraW5nLCBpc1JlZiwgdG9SYXcsIHJlZiwgc2hhbGxvd1JlYWRvbmx5LCB0cmFjaywgcmVhY3RpdmUsIHNoYWxsb3dSZWFjdGl2ZSwgdHJpZ2dlciwgaXNSZWFjdGl2ZSwgUmVhY3RpdmVFZmZlY3QsIGlzU2hhbGxvdywgZ2V0Q3VycmVudFNjb3BlLCBjdXN0b21SZWYsIGlzUHJveHksIHByb3h5UmVmcywgbWFya1JhdywgRWZmZWN0U2NvcGUsIGNvbXB1dGVkIGFzIGNvbXB1dGVkJDEsIGlzUmVhZG9ubHkgfSBmcm9tICdAdnVlL3JlYWN0aXZpdHknO1xuZXhwb3J0IHsgRWZmZWN0U2NvcGUsIFJlYWN0aXZlRWZmZWN0LCBUcmFja09wVHlwZXMsIFRyaWdnZXJPcFR5cGVzLCBjdXN0b21SZWYsIGVmZmVjdCwgZWZmZWN0U2NvcGUsIGdldEN1cnJlbnRTY29wZSwgaXNQcm94eSwgaXNSZWFjdGl2ZSwgaXNSZWFkb25seSwgaXNSZWYsIGlzU2hhbGxvdywgbWFya1Jhdywgb25TY29wZURpc3Bvc2UsIHByb3h5UmVmcywgcmVhY3RpdmUsIHJlYWRvbmx5LCByZWYsIHNoYWxsb3dSZWFjdGl2ZSwgc2hhbGxvd1JlYWRvbmx5LCBzaGFsbG93UmVmLCBzdG9wLCB0b1JhdywgdG9SZWYsIHRvUmVmcywgdG9WYWx1ZSwgdHJpZ2dlclJlZiwgdW5yZWYgfSBmcm9tICdAdnVlL3JlYWN0aXZpdHknO1xuaW1wb3J0IHsgaXNTdHJpbmcsIGlzRnVuY3Rpb24sIGlzUHJvbWlzZSwgaXNBcnJheSwgTk9PUCwgZ2V0R2xvYmFsVGhpcywgZXh0ZW5kLCBpc0J1aWx0SW5EaXJlY3RpdmUsIEVNUFRZX09CSiwgaXNPYmplY3QsIHJlbW92ZSwgaXNSZWdFeHAsIGludm9rZUFycmF5Rm5zLCB0b0hhbmRsZXJLZXksIGNhcGl0YWxpemUsIGNhbWVsaXplLCBoYXNPd24sIGlzR2xvYmFsbHlBbGxvd2VkLCBOTywgaHlwaGVuYXRlLCBpc1Jlc2VydmVkUHJvcCwgRU1QVFlfQVJSLCB0b1Jhd1R5cGUsIG1ha2VNYXAsIGRlZiwgaXNPbiwgbm9ybWFsaXplQ2xhc3MsIHN0cmluZ2lmeVN0eWxlLCBub3JtYWxpemVTdHlsZSwgaXNLbm93blN2Z0F0dHIsIGlzQm9vbGVhbkF0dHIsIGlzS25vd25IdG1sQXR0ciwgaW5jbHVkZUJvb2xlYW5BdHRyLCBpc1JlbmRlcmFibGVBdHRyVmFsdWUsIGhhc0NoYW5nZWQsIGlzU2V0LCBpc01hcCwgaXNQbGFpbk9iamVjdCwgbG9vc2VUb051bWJlciwgaXNNb2RlbExpc3RlbmVyLCB0b051bWJlciB9IGZyb20gJ0B2dWUvc2hhcmVkJztcbmV4cG9ydCB7IGNhbWVsaXplLCBjYXBpdGFsaXplLCBub3JtYWxpemVDbGFzcywgbm9ybWFsaXplUHJvcHMsIG5vcm1hbGl6ZVN0eWxlLCB0b0Rpc3BsYXlTdHJpbmcsIHRvSGFuZGxlcktleSB9IGZyb20gJ0B2dWUvc2hhcmVkJztcblxuY29uc3Qgc3RhY2sgPSBbXTtcbmZ1bmN0aW9uIHB1c2hXYXJuaW5nQ29udGV4dCh2bm9kZSkge1xuICBzdGFjay5wdXNoKHZub2RlKTtcbn1cbmZ1bmN0aW9uIHBvcFdhcm5pbmdDb250ZXh0KCkge1xuICBzdGFjay5wb3AoKTtcbn1cbmxldCBpc1dhcm5pbmcgPSBmYWxzZTtcbmZ1bmN0aW9uIHdhcm4kMShtc2csIC4uLmFyZ3MpIHtcbiAgaWYgKGlzV2FybmluZykgcmV0dXJuO1xuICBpc1dhcm5pbmcgPSB0cnVlO1xuICBwYXVzZVRyYWNraW5nKCk7XG4gIGNvbnN0IGluc3RhbmNlID0gc3RhY2subGVuZ3RoID8gc3RhY2tbc3RhY2subGVuZ3RoIC0gMV0uY29tcG9uZW50IDogbnVsbDtcbiAgY29uc3QgYXBwV2FybkhhbmRsZXIgPSBpbnN0YW5jZSAmJiBpbnN0YW5jZS5hcHBDb250ZXh0LmNvbmZpZy53YXJuSGFuZGxlcjtcbiAgY29uc3QgdHJhY2UgPSBnZXRDb21wb25lbnRUcmFjZSgpO1xuICBpZiAoYXBwV2FybkhhbmRsZXIpIHtcbiAgICBjYWxsV2l0aEVycm9ySGFuZGxpbmcoXG4gICAgICBhcHBXYXJuSGFuZGxlcixcbiAgICAgIGluc3RhbmNlLFxuICAgICAgMTEsXG4gICAgICBbXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheFxuICAgICAgICBtc2cgKyBhcmdzLm1hcCgoYSkgPT4ge1xuICAgICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgICAgcmV0dXJuIChfYiA9IChfYSA9IGEudG9TdHJpbmcpID09IG51bGwgPyB2b2lkIDAgOiBfYS5jYWxsKGEpKSAhPSBudWxsID8gX2IgOiBKU09OLnN0cmluZ2lmeShhKTtcbiAgICAgICAgfSkuam9pbihcIlwiKSxcbiAgICAgICAgaW5zdGFuY2UgJiYgaW5zdGFuY2UucHJveHksXG4gICAgICAgIHRyYWNlLm1hcChcbiAgICAgICAgICAoeyB2bm9kZSB9KSA9PiBgYXQgPCR7Zm9ybWF0Q29tcG9uZW50TmFtZShpbnN0YW5jZSwgdm5vZGUudHlwZSl9PmBcbiAgICAgICAgKS5qb2luKFwiXFxuXCIpLFxuICAgICAgICB0cmFjZVxuICAgICAgXVxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgY29uc3Qgd2FybkFyZ3MgPSBbYFtWdWUgd2Fybl06ICR7bXNnfWAsIC4uLmFyZ3NdO1xuICAgIGlmICh0cmFjZS5sZW5ndGggJiYgLy8gYXZvaWQgc3BhbW1pbmcgY29uc29sZSBkdXJpbmcgdGVzdHNcbiAgICB0cnVlKSB7XG4gICAgICB3YXJuQXJncy5wdXNoKGBcbmAsIC4uLmZvcm1hdFRyYWNlKHRyYWNlKSk7XG4gICAgfVxuICAgIGNvbnNvbGUud2FybiguLi53YXJuQXJncyk7XG4gIH1cbiAgcmVzZXRUcmFja2luZygpO1xuICBpc1dhcm5pbmcgPSBmYWxzZTtcbn1cbmZ1bmN0aW9uIGdldENvbXBvbmVudFRyYWNlKCkge1xuICBsZXQgY3VycmVudFZOb2RlID0gc3RhY2tbc3RhY2subGVuZ3RoIC0gMV07XG4gIGlmICghY3VycmVudFZOb2RlKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIGNvbnN0IG5vcm1hbGl6ZWRTdGFjayA9IFtdO1xuICB3aGlsZSAoY3VycmVudFZOb2RlKSB7XG4gICAgY29uc3QgbGFzdCA9IG5vcm1hbGl6ZWRTdGFja1swXTtcbiAgICBpZiAobGFzdCAmJiBsYXN0LnZub2RlID09PSBjdXJyZW50Vk5vZGUpIHtcbiAgICAgIGxhc3QucmVjdXJzZUNvdW50Kys7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5vcm1hbGl6ZWRTdGFjay5wdXNoKHtcbiAgICAgICAgdm5vZGU6IGN1cnJlbnRWTm9kZSxcbiAgICAgICAgcmVjdXJzZUNvdW50OiAwXG4gICAgICB9KTtcbiAgICB9XG4gICAgY29uc3QgcGFyZW50SW5zdGFuY2UgPSBjdXJyZW50Vk5vZGUuY29tcG9uZW50ICYmIGN1cnJlbnRWTm9kZS5jb21wb25lbnQucGFyZW50O1xuICAgIGN1cnJlbnRWTm9kZSA9IHBhcmVudEluc3RhbmNlICYmIHBhcmVudEluc3RhbmNlLnZub2RlO1xuICB9XG4gI
20578HJldHVybiBub3JtYWxpemVkU3RhY2s7XG59XG5mdW5jdGlvbiBmb3JtYXRUcmFjZSh0cmFjZSkge1xuICBjb25zdCBsb2dzID0gW107XG4gIHRyYWNlLmZvckVhY2goKGVudHJ5LCBpKSA9PiB7XG4gICAgbG9ncy5wdXNoKC4uLmkgPT09IDAgPyBbXSA6IFtgXG5gXSwgLi4uZm9ybWF0VHJhY2VFbnRyeShlbnRyeSkpO1xuICB9KTtcbiAgcmV0dXJuIGxvZ3M7XG59XG5mdW5jdGlvbiBmb3JtYXRUcmFjZUVudHJ5KHsgdm5vZGUsIHJlY3Vyc2VDb3VudCB9KSB7XG4gIGNvbnN0IHBvc3RmaXggPSByZWN1cnNlQ291bnQgPiAwID8gYC4uLiAoJHtyZWN1cnNlQ291bnR9IHJlY3Vyc2l2ZSBjYWxscylgIDogYGA7XG4gIGNvbnN0IGlzUm9vdCA9IHZub2RlLmNvbXBvbmVudCA/IHZub2RlLmNvbXBvbmVudC5wYXJlbnQgPT0gbnVsbCA6IGZhbHNlO1xuICBjb25zdCBvcGVuID0gYCBhdCA8JHtmb3JtYXRDb21wb25lbnROYW1lKFxuICAgIHZub2RlLmNvbXBvbmVudCxcbiAgICB2bm9kZS50eXBlLFxuICAgIGlzUm9vdFxuICApfWA7XG4gIGNvbnN0IGNsb3NlID0gYD5gICsgcG9zdGZpeDtcbiAgcmV0dXJuIHZub2RlLnByb3BzID8gW29wZW4sIC4uLmZvcm1hdFByb3BzKHZub2RlLnByb3BzKSwgY2xvc2VdIDogW29wZW4gKyBjbG9zZV07XG59XG5mdW5jdGlvbiBmb3JtYXRQcm9wcyhwcm9wcykge1xuICBjb25zdCByZXMgPSBbXTtcbiAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHByb3BzKTtcbiAga2V5cy5zbGljZSgwLCAzKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICByZXMucHVzaCguLi5mb3JtYXRQcm9wKGtleSwgcHJvcHNba2V5XSkpO1xuICB9KTtcbiAgaWYgKGtleXMubGVuZ3RoID4gMykge1xuICAgIHJlcy5wdXNoKGAgLi4uYCk7XG4gIH1cbiAgcmV0dXJuIHJlcztcbn1cbmZ1bmN0aW9uIGZvcm1hdFByb3Aoa2V5LCB2YWx1ZSwgcmF3KSB7XG4gIGlmIChpc1N0cmluZyh2YWx1ZSkpIHtcbiAgICB2YWx1ZSA9IEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbiAgICByZXR1cm4gcmF3ID8gdmFsdWUgOiBbYCR7a2V5fT0ke3ZhbHVlfWBdO1xuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIiB8fCB0eXBlb2YgdmFsdWUgPT09IFwiYm9vbGVhblwiIHx8IHZhbHVlID09IG51bGwpIHtcbiAgICByZXR1cm4gcmF3ID8gdmFsdWUgOiBbYCR7a2V5fT0ke3ZhbHVlfWBdO1xuICB9IGVsc2UgaWYgKGlzUmVmKHZhbHVlKSkge1xuICAgIHZhbHVlID0gZm9ybWF0UHJvcChrZXksIHRvUmF3KHZhbHVlLnZhbHVlKSwgdHJ1ZSk7XG4gICAgcmV0dXJuIHJhdyA/IHZhbHVlIDogW2Ake2tleX09UmVmPGAsIHZhbHVlLCBgPmBdO1xuICB9IGVsc2UgaWYgKGlzRnVuY3Rpb24odmFsdWUpKSB7XG4gICAgcmV0dXJuIFtgJHtrZXl9PWZuJHt2YWx1ZS5uYW1lID8gYDwke3ZhbHVlLm5hbWV9PmAgOiBgYH1gXTtcbiAgfSBlbHNlIHtcbiAgICB2YWx1ZSA9IHRvUmF3KHZhbHVlKTtcbiAgICByZXR1cm4gcmF3ID8gdmFsdWUgOiBbYCR7a2V5fT1gLCB2YWx1ZV07XG4gIH1cbn1cbmZ1bmN0aW9uIGFzc2VydE51bWJlcih2YWwsIHR5cGUpIHtcbiAgaWYgKCEhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSByZXR1cm47XG4gIGlmICh2YWwgPT09IHZvaWQgMCkge1xuICAgIHJldHVybjtcbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsICE9PSBcIm51bWJlclwiKSB7XG4gICAgd2FybiQxKGAke3R5cGV9IGlzIG5vdCBhIHZhbGlkIG51bWJlciAtIGdvdCAke0pTT04uc3RyaW5naWZ5KHZhbCl9LmApO1xuICB9IGVsc2UgaWYgKGlzTmFOKHZhbCkpIHtcbiAgICB3YXJuJDEoYCR7dHlwZX0gaXMgTmFOIC0gdGhlIGR1cmF0aW9uIGV4cHJlc3Npb24gbWlnaHQgYmUgaW5jb3JyZWN0LmApO1xuICB9XG59XG5cbmNvbnN0IEVycm9yQ29kZXMgPSB7XG4gIFwiU0VUVVBfRlVOQ1RJT05cIjogMCxcbiAgXCIwXCI6IFwiU0VUVVBfRlVOQ1RJT05cIixcbiAgXCJSRU5ERVJfRlVOQ1RJT05cIjogMSxcbiAgXCIxXCI6IFwiUkVOREVSX0ZVTkNUSU9OXCIsXG4gIFwiV0FUQ0hfR0VUVEVSXCI6IDIsXG4gIFwiMlwiOiBcIldBVENIX0dFVFRFUlwiLFxuICBcIldBVENIX0NBTExCQUNLXCI6IDMsXG4gIFwiM1wiOiBcIldBVENIX0NBTExCQUNLXCIsXG4gIFwiV0FUQ0hfQ0xFQU5VUFwiOiA0LFxuICBcIjRcIjogXCJXQVRDSF9DTEVBTlVQXCIsXG4gIFwiTkFUSVZFX0VWRU5UX0hBTkRMRVJcIjogNSxcbiAgXCI1XCI6IFwiTkFUSVZFX0VWRU5UX0hBTkRMRVJcIixcbiAgXCJDT01QT05FTlRfRVZFTlRfSEFORExFUlwiOiA2LFxuICBcIjZcIjogXCJDT01QT05FTlRfRVZFTlRfSEFORExFUlwiLFxuICBcIlZOT0RFX0hPT0tcIjogNyxcbiAgXCI3XCI6IFwiVk5PREVfSE9PS1wiLFxuICBcIkRJUkVDVElWRV9IT09LXCI6IDgsXG4gIFwiOFwiOiBcIkRJUkVDVElWRV9IT09LXCIsXG4gIFwiVFJBTlNJVElPTl9IT09LXCI6IDksXG4gIFwiOVwiOiBcIlRSQU5TSVRJT05fSE9PS1wiLFxuICBcIkFQUF9FUlJPUl9IQU5ETEVSXCI6IDEwLFxuICBcIjEwXCI6IFwiQVBQX0VSUk9SX0hBTkRMRVJcIixcbiAgXCJBUFBfV0FSTl9IQU5ETEVSXCI6IDExLFxuICBcIjExXCI6IFwiQVBQX1dBUk5fSEFORExFUlwiLFxuICBcIkZVTkNUSU9OX1JFRlwiOiAxMixcbiAgXCIxMlwiOiBcIkZVTkNUSU9OX1JFRlwiLFxuICBcIkFTWU5DX0NPTVBPTkVOVF9MT0FERVJcIjogMTMsXG4gIFwiMTNcIjogXCJBU1lOQ19DT01QT05FTlRfTE9BREVSXCIsXG4gIFwiU0NIRURVTEVSXCI6IDE0LFxuICBcIjE0XCI6IFwiU0NIRURVTEVSXCIsXG4gIFwiQ09NUE9ORU5UX1VQREFURVwiOiAxNSxcbiAgXCIxNVwiOiBcIkNPTVBPTkVOVF9VUERBVEVcIlxufTtcbmNvbnN0IEVycm9yVHlwZVN0cmluZ3MkMSA9IHtcbiAgW1wic3BcIl06IFwic2VydmVyUHJlZmV0Y2ggaG9va1wiLFxuICBbXCJiY1wiXTogXCJiZWZvcmVDcmVhdGUgaG9va1wiLFxuICBbXCJjXCJdOiBcImNyZWF0ZWQgaG9va1wiLFxuICBbXCJibVwiXTogXCJiZWZvcmVNb3VudCBob29rXCIsXG4gIFtcIm1cIl06IFwibW91bnRlZCBob29rXCIsXG4gIFtcImJ1XCJdOiBcImJlZm9yZVVwZGF0ZSBob29rXCIsXG4gIFtcInVcIl06IFwidXBkYXRlZFwiLFxuICBbXCJidW1cIl06IFwiYmVmb3JlVW5tb3VudCBob29rXCIsXG4gIFtcInVtXCJdOiBcInVubW91bnRlZCBob29rXCIsXG4gIFtcImFcIl06IFwiYWN0aXZhdGVkIGhvb2tcIixcbiAgW1wiZGFcIl06IFwiZGVhY3RpdmF0ZWQgaG9va1wiLFxuICBbXCJlY1wiXTogXCJlcnJvckNhcHR1cmVkIGhvb2tcIixcbiAgW1wicnRjXCJdOiBcInJlbmRlclRyYWNrZWQgaG9va1wiLFxuICBbXCJydGdcIl06IFwicmVuZGVyVHJpZ2dlcmVkIGhvb2tcIixcbiAgWzBdOiBcInNldHVwIGZ1bmN0aW9uXCIsXG4gIFsxXTogXCJyZW5kZXIgZnVuY3Rpb25cIixcbiAgWzJdOiBcIndhdGNoZXIgZ2V0dGVyXCIsXG4gIFszXTogXCJ3YXRjaGVyIGNhbGxiYWNrXCIsXG4gIFs0XTogXCJ3YXRjaGVyIGNsZWFudXAgZnVuY3Rpb25cIixcbiAgWzVdOiBcIm5hdGl2ZSBldmVudCBoYW5kbGVyXCIsXG4gIFs2XTogXCJjb21wb25lbnQgZXZlbnQgaGFuZGxlclwiLFxuICBbN106IFwidm5vZGUgaG9va1wiLFxuICBbOF06IFwiZGlyZWN0aXZlIGhvb2tcIixcbiAgWzldOiBcInRyYW5zaXRpb24gaG9va1wiLFxuICBbMTBdOiBcImFwcCBlcnJvckhhbmRsZXJcIixcbiAgWzExXTogXCJhcHAgd2FybkhhbmRsZXJcIixcbiAgWzEyXTogXCJyZWYgZnVuY3Rpb25cIixcbiAgWzEzXTogXCJhc3luYyBjb21wb25lbnQgbG9hZGVyXCIsXG4gIFsxNF06IFwic2NoZWR1bGVyIGZsdXNoXCIsXG4gIFsxNV06IFwiY29tcG9uZW50IHVwZGF0ZVwiXG59O1xuZnVuY3Rpb24gY2FsbFdpdGhFcnJvckhhbmRsaW5nKGZuLCBpbnN0YW5jZSwgdHlwZSwgYXJncykge1xuICB0cnkge1xuICAgIHJldHVybi
20578BhcmdzID8gZm4oLi4uYXJncykgOiBmbigpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBoYW5kbGVFcnJvcihlcnIsIGluc3RhbmNlLCB0eXBlKTtcbiAgfVxufVxuZnVuY3Rpb24gY2FsbFdpdGhBc3luY0Vycm9ySGFuZGxpbmcoZm4sIGluc3RhbmNlLCB0eXBlLCBhcmdzKSB7XG4gIGlmIChpc0Z1bmN0aW9uKGZuKSkge1xuICAgIGNvbnN0IHJlcyA9IGNhbGxXaXRoRXJyb3JIYW5kbGluZyhmbiwgaW5zdGFuY2UsIHR5cGUsIGFyZ3MpO1xuICAgIGlmIChyZXMgJiYgaXNQcm9taXNlKHJlcykpIHtcbiAgICAgIHJlcy5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgIGhhbmRsZUVycm9yKGVyciwgaW5zdGFuY2UsIHR5cGUpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgaWYgKGlzQXJyYXkoZm4pKSB7XG4gICAgY29uc3QgdmFsdWVzID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmbi5sZW5ndGg7IGkrKykge1xuICAgICAgdmFsdWVzLnB1c2goY2FsbFdpdGhBc3luY0Vycm9ySGFuZGxpbmcoZm5baV0sIGluc3RhbmNlLCB0eXBlLCBhcmdzKSk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZXM7XG4gIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIHdhcm4kMShcbiAgICAgIGBJbnZhbGlkIHZhbHVlIHR5cGUgcGFzc2VkIHRvIGNhbGxXaXRoQXN5bmNFcnJvckhhbmRsaW5nKCk6ICR7dHlwZW9mIGZufWBcbiAgICApO1xuICB9XG59XG5mdW5jdGlvbiBoYW5kbGVFcnJvcihlcnIsIGluc3RhbmNlLCB0eXBlLCB0aHJvd0luRGV2ID0gdHJ1ZSkge1xuICBjb25zdCBjb250ZXh0Vk5vZGUgPSBpbnN0YW5jZSA/IGluc3RhbmNlLnZub2RlIDogbnVsbDtcbiAgaWYgKGluc3RhbmNlKSB7XG4gICAgbGV0IGN1ciA9IGluc3RhbmNlLnBhcmVudDtcbiAgICBjb25zdCBleHBvc2VkSW5zdGFuY2UgPSBpbnN0YW5jZS5wcm94eTtcbiAgICBjb25zdCBlcnJvckluZm8gPSAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8gRXJyb3JUeXBlU3RyaW5ncyQxW3R5cGVdIDogYGh0dHBzOi8vdnVlanMub3JnL2Vycm9yLXJlZmVyZW5jZS8jcnVudGltZS0ke3R5cGV9YDtcbiAgICB3aGlsZSAoY3VyKSB7XG4gICAgICBjb25zdCBlcnJvckNhcHR1cmVkSG9va3MgPSBjdXIuZWM7XG4gICAgICBpZiAoZXJyb3JDYXB0dXJlZEhvb2tzKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXJyb3JDYXB0dXJlZEhvb2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYgKGVycm9yQ2FwdHVyZWRIb29rc1tpXShlcnIsIGV4cG9zZWRJbnN0YW5jZSwgZXJyb3JJbmZvKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGN1ciA9IGN1ci5wYXJlbnQ7XG4gICAgfVxuICAgIGNvbnN0IGFwcEVycm9ySGFuZGxlciA9IGluc3RhbmNlLmFwcENvbnRleHQuY29uZmlnLmVycm9ySGFuZGxlcjtcbiAgICBpZiAoYXBwRXJyb3JIYW5kbGVyKSB7XG4gICAgICBwYXVzZVRyYWNraW5nKCk7XG4gICAgICBjYWxsV2l0aEVycm9ySGFuZGxpbmcoXG4gICAgICAgIGFwcEVycm9ySGFuZGxlcixcbiAgICAgICAgbnVsbCxcbiAgICAgICAgMTAsXG4gICAgICAgIFtlcnIsIGV4cG9zZWRJbnN0YW5jZSwgZXJyb3JJbmZvXVxuICAgICAgKTtcbiAgICAgIHJlc2V0VHJhY2tpbmcoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cbiAgbG9nRXJyb3IoZXJyLCB0eXBlLCBjb250ZXh0Vk5vZGUsIHRocm93SW5EZXYpO1xufVxuZnVuY3Rpb24gbG9nRXJyb3IoZXJyLCB0eXBlLCBjb250ZXh0Vk5vZGUsIHRocm93SW5EZXYgPSB0cnVlKSB7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgY29uc3QgaW5mbyA9IEVycm9yVHlwZVN0cmluZ3MkMVt0eXBlXTtcbiAgICBpZiAoY29udGV4dFZOb2RlKSB7XG4gICAgICBwdXNoV2FybmluZ0NvbnRleHQoY29udGV4dFZOb2RlKTtcbiAgICB9XG4gICAgd2FybiQxKGBVbmhhbmRsZWQgZXJyb3Ike2luZm8gPyBgIGR1cmluZyBleGVjdXRpb24gb2YgJHtpbmZvfWAgOiBgYH1gKTtcbiAgICBpZiAoY29udGV4dFZOb2RlKSB7XG4gICAgICBwb3BXYXJuaW5nQ29udGV4dCgpO1xuICAgIH1cbiAgICBpZiAodGhyb3dJbkRldikge1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgfVxufVxuXG5sZXQgaXNGbHVzaGluZyA9IGZhbHNlO1xubGV0IGlzRmx1c2hQZW5kaW5nID0gZmFsc2U7XG5jb25zdCBxdWV1ZSA9IFtdO1xubGV0IGZsdXNoSW5kZXggPSAwO1xuY29uc3QgcGVuZGluZ1Bvc3RGbHVzaENicyA9IFtdO1xubGV0IGFjdGl2ZVBvc3RGbHVzaENicyA9IG51bGw7XG5sZXQgcG9zdEZsdXNoSW5kZXggPSAwO1xuY29uc3QgcmVzb2x2ZWRQcm9taXNlID0gLyogQF9fUFVSRV9fICovIFByb21pc2UucmVzb2x2ZSgpO1xubGV0IGN1cnJlbnRGbHVzaFByb21pc2UgPSBudWxsO1xuY29uc3QgUkVDVVJTSU9OX0xJTUlUID0gMTAwO1xuZnVuY3Rpb24gbmV4dFRpY2soZm4pIHtcbiAgY29uc3QgcCA9IGN1cnJlbnRGbHVzaFByb21pc2UgfHwgcmVzb2x2ZWRQcm9taXNlO1xuICByZXR1cm4gZm4gPyBwLnRoZW4odGhpcyA/IGZuLmJpbmQodGhpcykgOiBmbikgOiBwO1xufVxuZnVuY3Rpb24gZmluZEluc2VydGlvbkluZGV4KGlkKSB7XG4gIGxldCBzdGFydCA9IGZsdXNoSW5kZXggKyAxO1xuICBsZXQgZW5kID0gcXVldWUubGVuZ3RoO1xuICB3aGlsZSAoc3RhcnQgPCBlbmQpIHtcbiAgICBjb25zdCBtaWRkbGUgPSBzdGFydCArIGVuZCA+Pj4gMTtcbiAgICBjb25zdCBtaWRkbGVKb2IgPSBxdWV1ZVttaWRkbGVdO1xuICAgIGNvbnN0IG1pZGRsZUpvYklkID0gZ2V0SWQobWlkZGxlSm9iKTtcbiAgICBpZiAobWlkZGxlSm9iSWQgPCBpZCB8fCBtaWRkbGVKb2JJZCA9PT0gaWQgJiYgbWlkZGxlSm9iLnByZSkge1xuICAgICAgc3RhcnQgPSBtaWRkbGUgKyAxO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbmQgPSBtaWRkbGU7XG4gICAgfVxuICB9XG4gI
20578HJldHVybiBzdGFydDtcbn1cbmZ1bmN0aW9uIHF1ZXVlSm9iKGpvYikge1xuICBpZiAoIXF1ZXVlLmxlbmd0aCB8fCAhcXVldWUuaW5jbHVkZXMoXG4gICAgam9iLFxuICAgIGlzRmx1c2hpbmcgJiYgam9iLmFsbG93UmVjdXJzZSA/IGZsdXNoSW5kZXggKyAxIDogZmx1c2hJbmRleFxuICApKSB7XG4gICAgaWYgKGpvYi5pZCA9PSBudWxsKSB7XG4gICAgICBxdWV1ZS5wdXNoKGpvYik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHF1ZXVlLnNwbGljZShmaW5kSW5zZXJ0aW9uSW5kZXgoam9iLmlkKSwgMCwgam9iKTtcbiAgICB9XG4gICAgcXVldWVGbHVzaCgpO1xuICB9XG59XG5mdW5jdGlvbiBxdWV1ZUZsdXNoKCkge1xuICBpZiAoIWlzRmx1c2hpbmcgJiYgIWlzRmx1c2hQZW5kaW5nKSB7XG4gICAgaXNGbHVzaFBlbmRpbmcgPSB0cnVlO1xuICAgIGN1cnJlbnRGbHVzaFByb21pc2UgPSByZXNvbHZlZFByb21pc2UudGhlbihmbHVzaEpvYnMpO1xuICB9XG59XG5mdW5jdGlvbiBpbnZhbGlkYXRlSm9iKGpvYikge1xuICBjb25zdCBpID0gcXVldWUuaW5kZXhPZihqb2IpO1xuICBpZiAoaSA+IGZsdXNoSW5kZXgpIHtcbiAgICBxdWV1ZS5zcGxpY2UoaSwgMSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHF1ZXVlUG9zdEZsdXNoQ2IoY2IpIHtcbiAgaWYgKCFpc0FycmF5KGNiKSkge1xuICAgIGlmICghYWN0aXZlUG9zdEZsdXNoQ2JzIHx8ICFhY3RpdmVQb3N0Rmx1c2hDYnMuaW5jbHVkZXMoXG4gICAgICBjYixcbiAgICAgIGNiLmFsbG93UmVjdXJzZSA/IHBvc3RGbHVzaEluZGV4ICsgMSA6IHBvc3RGbHVzaEluZGV4XG4gICAgKSkge1xuICAgICAgcGVuZGluZ1Bvc3RGbHVzaENicy5wdXNoKGNiKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcGVuZGluZ1Bvc3RGbHVzaENicy5wdXNoKC4uLmNiKTtcbiAgfVxuICBxdWV1ZUZsdXNoKCk7XG59XG5mdW5jdGlvbiBmbHVzaFByZUZsdXNoQ2JzKGluc3RhbmNlLCBzZWVuLCBpID0gaXNGbHVzaGluZyA/IGZsdXNoSW5kZXggKyAxIDogMCkge1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIHNlZW4gPSBzZWVuIHx8IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG4gIH1cbiAgZm9yICg7IGkgPCBxdWV1ZS5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGNiID0gcXVldWVbaV07XG4gICAgaWYgKGNiICYmIGNiLnByZSkge1xuICAgICAgaWYgKGluc3RhbmNlICYmIGNiLmlkICE9PSBpbnN0YW5jZS51aWQpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBjaGVja1JlY3Vyc2l2ZVVwZGF0ZXMoc2VlbiwgY2IpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgcXVldWUuc3BsaWNlKGksIDEpO1xuICAgICAgaS0tO1xuICAgICAgY2IoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGZsdXNoUG9zdEZsdXNoQ2JzKHNlZW4pIHtcbiAgaWYgKHBlbmRpbmdQb3N0Rmx1c2hDYnMubGVuZ3RoKSB7XG4gICAgY29uc3QgZGVkdXBlZCA9IFsuLi5uZXcgU2V0KHBlbmRpbmdQb3N0Rmx1c2hDYnMpXS5zb3J0KFxuICAgICAgKGEsIGIpID0+IGdldElkKGEpIC0gZ2V0SWQoYilcbiAgICApO1xuICAgIHBlbmRpbmdQb3N0Rmx1c2hDYnMubGVuZ3RoID0gMDtcbiAgICBpZiAoYWN0aXZlUG9zdEZsdXNoQ2JzKSB7XG4gICAgICBhY3RpdmVQb3N0Rmx1c2hDYnMucHVzaCguLi5kZWR1cGVkKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYWN0aXZlUG9zdEZsdXNoQ2JzID0gZGVkdXBlZDtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgc2VlbiA9IHNlZW4gfHwgLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcbiAgICB9XG4gICAgZm9yIChwb3N0Rmx1c2hJbmRleCA9IDA7IHBvc3RGbHVzaEluZGV4IDwgYWN0aXZlUG9zdEZsdXNoQ2JzLmxlbmd0aDsgcG9zdEZsdXNoSW5kZXgrKykge1xuICAgICAgY29uc3QgY2IgPSBhY3RpdmVQb3N0Rmx1c2hDYnNbcG9zdEZsdXNoSW5kZXhdO1xuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgY2hlY2tSZWN1cnNpdmVVcGRhdGVzKHNlZW4sIGNiKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChjYi5hY3RpdmUgIT09IGZhbHNlKSBjYigpO1xuICAgIH1cbiAgICBhY3RpdmVQb3N0Rmx1c2hDYnMgPSBudWxsO1xuICAgIHBvc3RGbHVzaEluZGV4ID0gMDtcbiAgfVxufVxuY29uc3QgZ2V0SWQgPSAoam9iKSA9PiBqb2IuaWQgPT0gbnVsbCA/IEluZmluaXR5IDogam9iLmlkO1xuY29uc3QgY29tcGFyYXRvciA9IChhLCBiKSA9PiB7XG4gIGNvbnN0IGRpZmYgPSBnZXRJZChhKSAtIGdldElkKGIpO1xuICBpZiAoZGlmZiA9PT0gMCkge1xuICAgIGlmIChhLnByZSAmJiAhYi5wcmUpIHJldHVybiAtMTtcbiAgICBpZiAoYi5wcmUgJiYgIWEucHJlKSByZXR1cm4gMTtcbiAgfVxuICByZXR1cm4gZGlmZjtcbn07XG5mdW5jdGlvbiBmbHVzaEpvYnMoc2Vlbikge1xuICBpc0ZsdXNoUGVuZGluZyA9IGZhbHNlO1xuICBpc0ZsdXNoaW5nID0gdHJ1ZTtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICBzZWVuID0gc2VlbiB8fCAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuICB9XG4gIHF1ZXVlLnNvcnQoY29tcGFyYXRvcik7XG4gIGNvbnN0IGNoZWNrID0gISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IChqb2IpID0+IGNoZWNrUmVjdXJzaXZlVXBkYXRlcyhzZWVuLCBqb2IpIDogTk9PUDtcbiAgdHJ5IHtcbiAgICBmb3IgKGZsdXNoSW5kZXggPSAwOyBmbHVzaEluZGV4IDwgcXVldWUubGVuZ3RoOyBmbHVzaEluZGV4KyspIHtcbiAgICAgIGNvbnN0IGpvYiA9IHF1ZXVlW2ZsdXNoSW5kZXhdO1xuICAgICAgaWYgKGpvYiAmJiBqb2IuYWN0aXZlICE9PSBmYWxzZSkge1xuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBjaGVjayhqb2IpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgI
20578H1cbiAgICAgICAgY2FsbFdpdGhFcnJvckhhbmRsaW5nKFxuICAgICAgICAgIGpvYixcbiAgICAgICAgICBqb2IuaSxcbiAgICAgICAgICBqb2IuaSA/IDE1IDogMTRcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgZmx1c2hJbmRleCA9IDA7XG4gICAgcXVldWUubGVuZ3RoID0gMDtcbiAgICBmbHVzaFBvc3RGbHVzaENicyhzZWVuKTtcbiAgICBpc0ZsdXNoaW5nID0gZmFsc2U7XG4gICAgY3VycmVudEZsdXNoUHJvbWlzZSA9IG51bGw7XG4gICAgaWYgKHF1ZXVlLmxlbmd0aCB8fCBwZW5kaW5nUG9zdEZsdXNoQ2JzLmxlbmd0aCkge1xuICAgICAgZmx1c2hKb2JzKHNlZW4pO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gY2hlY2tSZWN1cnNpdmVVcGRhdGVzKHNlZW4sIGZuKSB7XG4gIGlmICghc2Vlbi5oYXMoZm4pKSB7XG4gICAgc2Vlbi5zZXQoZm4sIDEpO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGNvdW50ID0gc2Vlbi5nZXQoZm4pO1xuICAgIGlmIChjb3VudCA+IFJFQ1VSU0lPTl9MSU1JVCkge1xuICAgICAgY29uc3QgaW5zdGFuY2UgPSBmbi5pO1xuICAgICAgY29uc3QgY29tcG9uZW50TmFtZSA9IGluc3RhbmNlICYmIGdldENvbXBvbmVudE5hbWUoaW5zdGFuY2UudHlwZSk7XG4gICAgICBoYW5kbGVFcnJvcihcbiAgICAgICAgYE1heGltdW0gcmVjdXJzaXZlIHVwZGF0ZXMgZXhjZWVkZWQke2NvbXBvbmVudE5hbWUgPyBgIGluIGNvbXBvbmVudCA8JHtjb21wb25lbnROYW1lfT5gIDogYGB9LiBUaGlzIG1lYW5zIHlvdSBoYXZlIGEgcmVhY3RpdmUgZWZmZWN0IHRoYXQgaXMgbXV0YXRpbmcgaXRzIG93biBkZXBlbmRlbmNpZXMgYW5kIHRodXMgcmVjdXJzaXZlbHkgdHJpZ2dlcmluZyBpdHNlbGYuIFBvc3NpYmxlIHNvdXJjZXMgaW5jbHVkZSBjb21wb25lbnQgdGVtcGxhdGUsIHJlbmRlciBmdW5jdGlvbiwgdXBkYXRlZCBob29rIG9yIHdhdGNoZXIgc291cmNlIGZ1bmN0aW9uLmAsXG4gICAgICAgIG51bGwsXG4gICAgICAgIDEwXG4gICAgICApO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNlZW4uc2V0KGZuLCBjb3VudCArIDEpO1xuICAgIH1cbiAgfVxufVxuXG5sZXQgaXNIbXJVcGRhdGluZyA9IGZhbHNlO1xuY29uc3QgaG1yRGlydHlDb21wb25lbnRzID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcbmlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gIGdldEdsb2JhbFRoaXMoKS5fX1ZVRV9ITVJfUlVOVElNRV9fID0ge1xuICAgIGNyZWF0ZVJlY29yZDogdHJ5V3JhcChjcmVhdGVSZWNvcmQpLFxuICAgIHJlcmVuZGVyOiB0cnlXcmFwKHJlcmVuZGVyKSxcbiAgICByZWxvYWQ6IHRyeVdyYXAocmVsb2FkKVxuICB9O1xufVxuY29uc3QgbWFwID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcbmZ1bmN0aW9uIHJlZ2lzdGVySE1SKGluc3RhbmNlKSB7XG4gIGNvbnN0IGlkID0gaW5zdGFuY2UudHlwZS5fX2htcklkO1xuICBsZXQgcmVjb3JkID0gbWFwLmdldChpZCk7XG4gIGlmICghcmVjb3JkKSB7XG4gICAgY3JlYXRlUmVjb3JkKGlkLCBpbnN0YW5jZS50eXBlKTtcbiAgICByZWNvcmQgPSBtYXAuZ2V0KGlkKTtcbiAgfVxuICByZWNvcmQuaW5zdGFuY2VzLmFkZChpbnN0YW5jZSk7XG59XG5mdW5jdGlvbiB1bnJlZ2lzdGVySE1SKGluc3RhbmNlKSB7XG4gIG1hcC5nZXQoaW5zdGFuY2UudHlwZS5fX2htcklkKS5pbnN0YW5jZXMuZGVsZXRlKGluc3RhbmNlKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVJlY29yZChpZCwgaW5pdGlhbERlZikge1xuICBpZiAobWFwLmhhcyhpZCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgbWFwLnNldChpZCwge1xuICAgIGluaXRpYWxEZWY6IG5vcm1hbGl6ZUNsYXNzQ29tcG9uZW50KGluaXRpYWxEZWYpLFxuICAgIGluc3RhbmNlczogLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKVxuICB9KTtcbiAgcmV0dXJuIHRydWU7XG59XG5mdW5jdGlvbiBub3JtYWxpemVDbGFzc0NvbXBvbmVudChjb21wb25lbnQpIHtcbiAgcmV0dXJuIGlzQ2xhc3NDb21wb25lbnQoY29tcG9uZW50KSA/IGNvbXBvbmVudC5fX3ZjY09wdHMgOiBjb21wb25lbnQ7XG59XG5mdW5jdGlvbiByZXJlbmRlcihpZCwgbmV3UmVuZGVyKSB7XG4gIGNvbnN0IHJlY29yZCA9IG1hcC5nZXQoaWQpO1xuICBpZiAoIXJlY29yZCkge1xuICAgIHJldHVybjtcbiAgfVxuICByZWNvcmQuaW5pdGlhbERlZi5yZW5kZXIgPSBuZXdSZW5kZXI7XG4gIFsuLi5yZWNvcmQuaW5zdGFuY2VzXS5mb3JFYWNoKChpbnN0YW5jZSkgPT4ge1xuICAgIGlmIChuZXdSZW5kZXIpIHtcbiAgICAgIGluc3RhbmNlLnJlbmRlciA9IG5ld1JlbmRlcjtcbiAgICAgIG5vcm1hbGl6ZUNsYXNzQ29tcG9uZW50KGluc3RhbmNlLnR5cGUpLnJlbmRlciA9IG5ld1JlbmRlcjtcbiAgICB9XG4gICAgaW5zdGFuY2UucmVuZGVyQ2FjaGUgPSBbXTtcbiAgICBpc0htclVwZGF0aW5nID0gdHJ1ZTtcbiAgICBpbnN0YW5jZS5lZmZlY3QuZGlydHkgPSB0cnVlO1xuICAgIGluc3RhbmNlLnVwZGF0ZSgpO1xuICAgIGlzSG1yVXBkYXRpbmcgPSBmYWxzZTtcbiAgfSk7XG59XG5mdW5jdGlvbiByZWxvYWQoaWQsIG5ld0NvbXApIHtcbiAgY29uc3QgcmVjb3JkID0gbWFwLmdldChpZCk7XG4gIGlmICghcmVjb3JkKSByZXR1cm47XG4gIG5ld0NvbXAgPSBub3JtYWxpemVDbGFzc0NvbXBvbmVudChuZXdDb21wKTtcbiAgdXBkYXRlQ29tcG9uZW50RGVmKHJlY29yZC5pbml0aWFsRGVmLCBuZXdDb21wKTtcbiAgY29uc3QgaW5zdGFuY2VzID0gWy4uLnJlY29yZC5pbnN0YW5jZXNdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGluc3RhbmNlcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGluc3RhbmNlID0gaW5zdGFuY2VzW2ldO1xuICAgIGNvbnN0IG9sZENvbXAgPSBub3JtYWxpemVDbGFzc0NvbXBvbmVudChpbnN0YW5jZS50eXBlKTtcbiAgICBsZXQgZGlydHlJbnN0YW5jZXMgPSBobXJEaXJ0eUNvbXBvbmVudHMuZ2V0KG9sZENvbXApO1xuICAgIGlmICghZGlydHlJbnN0YW5jZXMpIHtcbiAgICAgIGlmIChvbGRDb21wICE9PSByZWNvcmQuaW5pdGlhbERlZikge1xuICAgICAgICB1cGRhdGVDb21wb25lbnREZWYob2xkQ29tcCwgbmV3Q29tcCk7XG4gICAgICB9XG4gICAgICBobXJEaXJ0eUNvbX
20578BvbmVudHMuc2V0KG9sZENvbXAsIGRpcnR5SW5zdGFuY2VzID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKSk7XG4gICAgfVxuICAgIGRpcnR5SW5zdGFuY2VzLmFkZChpbnN0YW5jZSk7XG4gICAgaW5zdGFuY2UuYXBwQ29udGV4dC5wcm9wc0NhY2hlLmRlbGV0ZShpbnN0YW5jZS50eXBlKTtcbiAgICBpbnN0YW5jZS5hcHBDb250ZXh0LmVtaXRzQ2FjaGUuZGVsZXRlKGluc3RhbmNlLnR5cGUpO1xuICAgIGluc3RhbmNlLmFwcENvbnRleHQub3B0aW9uc0NhY2hlLmRlbGV0ZShpbnN0YW5jZS50eXBlKTtcbiAgICBpZiAoaW5zdGFuY2UuY2VSZWxvYWQpIHtcbiAgICAgIGRpcnR5SW5zdGFuY2VzLmFkZChpbnN0YW5jZSk7XG4gICAgICBpbnN0YW5jZS5jZVJlbG9hZChuZXdDb21wLnN0eWxlcyk7XG4gICAgICBkaXJ0eUluc3RhbmNlcy5kZWxldGUoaW5zdGFuY2UpO1xuICAgIH0gZWxzZSBpZiAoaW5zdGFuY2UucGFyZW50KSB7XG4gICAgICBpbnN0YW5jZS5wYXJlbnQuZWZmZWN0LmRpcnR5ID0gdHJ1ZTtcbiAgICAgIHF1ZXVlSm9iKCgpID0+IHtcbiAgICAgICAgaW5zdGFuY2UucGFyZW50LnVwZGF0ZSgpO1xuICAgICAgICBkaXJ0eUluc3RhbmNlcy5kZWxldGUoaW5zdGFuY2UpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChpbnN0YW5jZS5hcHBDb250ZXh0LnJlbG9hZCkge1xuICAgICAgaW5zdGFuY2UuYXBwQ29udGV4dC5yZWxvYWQoKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBcIltITVJdIFJvb3Qgb3IgbWFudWFsbHkgbW91bnRlZCBpbnN0YW5jZSBtb2RpZmllZC4gRnVsbCByZWxvYWQgcmVxdWlyZWQuXCJcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIHF1ZXVlUG9zdEZsdXNoQ2IoKCkgPT4ge1xuICAgIGhtckRpcnR5Q29tcG9uZW50cy5jbGVhcigpO1xuICB9KTtcbn1cbmZ1bmN0aW9uIHVwZGF0ZUNvbXBvbmVudERlZihvbGRDb21wLCBuZXdDb21wKSB7XG4gIGV4dGVuZChvbGRDb21wLCBuZXdDb21wKTtcbiAgZm9yIChjb25zdCBrZXkgaW4gb2xkQ29tcCkge1xuICAgIGlmIChrZXkgIT09IFwiX19maWxlXCIgJiYgIShrZXkgaW4gbmV3Q29tcCkpIHtcbiAgICAgIGRlbGV0ZSBvbGRDb21wW2tleV07XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiB0cnlXcmFwKGZuKSB7XG4gIHJldHVybiAoaWQsIGFyZykgPT4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gZm4oaWQsIGFyZyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYFtITVJdIFNvbWV0aGluZyB3ZW50IHdyb25nIGR1cmluZyBWdWUgY29tcG9uZW50IGhvdC1yZWxvYWQuIEZ1bGwgcmVsb2FkIHJlcXVpcmVkLmBcbiAgICAgICk7XG4gICAgfVxuICB9O1xufVxuXG5sZXQgZGV2dG9vbHMkMTtcbmxldCBidWZmZXIgPSBbXTtcbmxldCBkZXZ0b29sc05vdEluc3RhbGxlZCA9IGZhbHNlO1xuZnVuY3Rpb24gZW1pdCQxKGV2ZW50LCAuLi5hcmdzKSB7XG4gIGlmIChkZXZ0b29scyQxKSB7XG4gICAgZGV2dG9vbHMkMS5lbWl0KGV2ZW50LCAuLi5hcmdzKTtcbiAgfSBlbHNlIGlmICghZGV2dG9vbHNOb3RJbnN0YWxsZWQpIHtcbiAgICBidWZmZXIucHVzaCh7IGV2ZW50LCBhcmdzIH0pO1xuICB9XG59XG5mdW5jdGlvbiBzZXREZXZ0b29sc0hvb2skMShob29rLCB0YXJnZXQpIHtcbiAgdmFyIF9hLCBfYjtcbiAgZGV2dG9vbHMkMSA9IGhvb2s7XG4gIGlmIChkZXZ0b29scyQxKSB7XG4gICAgZGV2dG9vbHMkMS5lbmFibGVkID0gdHJ1ZTtcbiAgICBidWZmZXIuZm9yRWFjaCgoeyBldmVudCwgYXJncyB9KSA9PiBkZXZ0b29scyQxLmVtaXQoZXZlbnQsIC4uLmFyZ3MpKTtcbiAgICBidWZmZXIgPSBbXTtcbiAgfSBlbHNlIGlmIChcbiAgICAvLyBoYW5kbGUgbGF0ZSBkZXZ0b29scyBpbmplY3Rpb24gLSBvbmx5IGRvIHRoaXMgaWYgd2UgYXJlIGluIGFuIGFjdHVhbFxuICAgIC8vIGJyb3dzZXIgZW52aXJvbm1lbnQgdG8gYXZvaWQgdGhlIHRpbWVyIGhhbmRsZSBzdGFsbGluZyB0ZXN0IHJ1bm5lciBleGl0XG4gICAgLy8gKCM0ODE1KVxuICAgIHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgJiYgLy8gc29tZSBlbnZzIG1vY2sgd2luZG93IGJ1dCBub3QgZnVsbHlcbiAgICB3aW5kb3cuSFRNTEVsZW1lbnQgJiYgLy8gYWxzbyBleGNsdWRlIGpzZG9tXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4XG4gICAgISgoX2IgPSAoX2EgPSB3aW5kb3cubmF2aWdhdG9yKSA9PSBudWxsID8gdm9pZCAwIDogX2EudXNlckFnZW50KSA9PSBudWxsID8gdm9pZCAwIDogX2IuaW5jbHVkZXMoXCJqc2RvbVwiKSlcbiAgKSB7XG4gICAgY29uc3QgcmVwbGF5ID0gdGFyZ2V0Ll9fVlVFX0RFVlRPT0xTX0hPT0tfUkVQTEFZX18gPSB0YXJnZXQuX19WVUVfREVWVE9PTFNfSE9PS19SRVBMQVlfXyB8fCBbXTtcbiAgICByZXBsYXkucHVzaCgobmV3SG9vaykgPT4ge1xuICAgICAgc2V0RGV2dG9vbHNIb29rJDEobmV3SG9vaywgdGFyZ2V0KTtcbiAgICB9KTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICghZGV2dG9vbHMkMSkge1xuICAgICAgICB0YXJnZXQuX19WVUVfREVWVE9PTFNfSE9PS19SRVBMQVlfXyA9IG51bGw7XG4gICAgICAgIGRldnRvb2xzTm90SW5zdGFsbGVkID0gdHJ1ZTtcbiAgICAgICAgYnVmZmVyID0gW107XG4gICAgICB9XG4gICAgfSwgM2UzKTtcbiAgfSBlbHNlIHtcbiAgICBkZXZ0b29sc05vdEluc3RhbGxlZCA9IHRydWU7XG4gICAgYnVmZmVyID0gW107XG4gIH1cbn1cbmZ1bmN0aW9uIGRldnRvb2xzSW5pdEFwcChhcHAsIHZlcnNpb24pIHtcbiAgZW1pdCQxKFwiYXBwOmluaXRcIiAvKiBBUFBfSU5JVCAqLywgYXBwLCB2ZXJzaW9uLCB7XG4gICAgRnJhZ21lbnQsXG4gICAgVGV4dCxcbiAgICBDb21tZW50LFxuICAgIFN0YXRpY1xuICB9KTtcbn1cbmZ1bmN0aW9uIGRldnRvb2xzVW5tb3VudEFwcChhcHApIHtcbiAgZW1pdCQxKFwiYXBwOnVubW91bnRcIiAvKiBBUFBfVU5NT1VOVCAqLywgYXBwKTtcbn1cbmNvbnN0IGRldnRvb2xzQ29tcG9uZW50QWRkZWQgPSAvKiBAX19QVVJFX18gKi8gY3JlYXRlRGV2dG9vbHNDb21wb25lbnRIb29rKFxuICBcImNvbXBvbmVudDphZGRlZFwiIC8qIENPTVBPTkVOVF9BRERFRCAqL1xuKTtcbmNvbnN0IGRldnRvb2xzQ29tcG9uZW50VXBkYXRlZCA9IC8qIEBfX1BVUkVfXyAqLyBjcmVhdGVEZXZ0b29sc0NvbXBvbmVudE
20578hvb2soXCJjb21wb25lbnQ6dXBkYXRlZFwiIC8qIENPTVBPTkVOVF9VUERBVEVEICovKTtcbmNvbnN0IF9kZXZ0b29sc0NvbXBvbmVudFJlbW92ZWQgPSAvKiBAX19QVVJFX18gKi8gY3JlYXRlRGV2dG9vbHNDb21wb25lbnRIb29rKFxuICBcImNvbXBvbmVudDpyZW1vdmVkXCIgLyogQ09NUE9ORU5UX1JFTU9WRUQgKi9cbik7XG5jb25zdCBkZXZ0b29sc0NvbXBvbmVudFJlbW92ZWQgPSAoY29tcG9uZW50KSA9PiB7XG4gIGlmIChkZXZ0b29scyQxICYmIHR5cGVvZiBkZXZ0b29scyQxLmNsZWFudXBCdWZmZXIgPT09IFwiZnVuY3Rpb25cIiAmJiAvLyByZW1vdmUgdGhlIGNvbXBvbmVudCBpZiBpdCB3YXNuJ3QgYnVmZmVyZWRcbiAgIWRldnRvb2xzJDEuY2xlYW51cEJ1ZmZlcihjb21wb25lbnQpKSB7XG4gICAgX2RldnRvb2xzQ29tcG9uZW50UmVtb3ZlZChjb21wb25lbnQpO1xuICB9XG59O1xuLyohICNfX05PX1NJREVfRUZGRUNUU19fICovXG4vLyBAX19OT19TSURFX0VGRkVDVFNfX1xuZnVuY3Rpb24gY3JlYXRlRGV2dG9vbHNDb21wb25lbnRIb29rKGhvb2spIHtcbiAgcmV0dXJuIChjb21wb25lbnQpID0+IHtcbiAgICBlbWl0JDEoXG4gICAgICBob29rLFxuICAgICAgY29tcG9uZW50LmFwcENvbnRleHQuYXBwLFxuICAgICAgY29tcG9uZW50LnVpZCxcbiAgICAgIGNvbXBvbmVudC5wYXJlbnQgPyBjb21wb25lbnQucGFyZW50LnVpZCA6IHZvaWQgMCxcbiAgICAgIGNvbXBvbmVudFxuICAgICk7XG4gIH07XG59XG5jb25zdCBkZXZ0b29sc1BlcmZTdGFydCA9IC8qIEBfX1BVUkVfXyAqLyBjcmVhdGVEZXZ0b29sc1BlcmZvcm1hbmNlSG9vayhcbiAgXCJwZXJmOnN0YXJ0XCIgLyogUEVSRk9STUFOQ0VfU1RBUlQgKi9cbik7XG5jb25zdCBkZXZ0b29sc1BlcmZFbmQgPSAvKiBAX19QVVJFX18gKi8gY3JlYXRlRGV2dG9vbHNQZXJmb3JtYW5jZUhvb2soXG4gIFwicGVyZjplbmRcIiAvKiBQRVJGT1JNQU5DRV9FTkQgKi9cbik7XG5mdW5jdGlvbiBjcmVhdGVEZXZ0b29sc1BlcmZvcm1hbmNlSG9vayhob29rKSB7XG4gIHJldHVybiAoY29tcG9uZW50LCB0eXBlLCB0aW1lKSA9PiB7XG4gICAgZW1pdCQxKGhvb2ssIGNvbXBvbmVudC5hcHBDb250ZXh0LmFwcCwgY29tcG9uZW50LnVpZCwgY29tcG9uZW50LCB0eXBlLCB0aW1lKTtcbiAgfTtcbn1cbmZ1bmN0aW9uIGRldnRvb2xzQ29tcG9uZW50RW1pdChjb21wb25lbnQsIGV2ZW50LCBwYXJhbXMpIHtcbiAgZW1pdCQxKFxuICAgIFwiY29tcG9uZW50OmVtaXRcIiAvKiBDT01QT05FTlRfRU1JVCAqLyxcbiAgICBjb21wb25lbnQuYXBwQ29udGV4dC5hcHAsXG4gICAgY29tcG9uZW50LFxuICAgIGV2ZW50LFxuICAgIHBhcmFtc1xuICApO1xufVxuXG5sZXQgY3VycmVudFJlbmRlcmluZ0luc3RhbmNlID0gbnVsbDtcbmxldCBjdXJyZW50U2NvcGVJZCA9IG51bGw7XG5mdW5jdGlvbiBzZXRDdXJyZW50UmVuZGVyaW5nSW5zdGFuY2UoaW5zdGFuY2UpIHtcbiAgY29uc3QgcHJldiA9IGN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZTtcbiAgY3VycmVudFJlbmRlcmluZ0luc3RhbmNlID0gaW5zdGFuY2U7XG4gIGN1cnJlbnRTY29wZUlkID0gaW5zdGFuY2UgJiYgaW5zdGFuY2UudHlwZS5fX3Njb3BlSWQgfHwgbnVsbDtcbiAgcmV0dXJuIHByZXY7XG59XG5mdW5jdGlvbiBwdXNoU2NvcGVJZChpZCkge1xuICBjdXJyZW50U2NvcGVJZCA9IGlkO1xufVxuZnVuY3Rpb24gcG9wU2NvcGVJZCgpIHtcbiAgY3VycmVudFNjb3BlSWQgPSBudWxsO1xufVxuY29uc3Qgd2l0aFNjb3BlSWQgPSAoX2lkKSA9PiB3aXRoQ3R4O1xuZnVuY3Rpb24gd2l0aEN0eChmbiwgY3R4ID0gY3VycmVudFJlbmRlcmluZ0luc3RhbmNlLCBpc05vblNjb3BlZFNsb3QpIHtcbiAgaWYgKCFjdHgpIHJldHVybiBmbjtcbiAgaWYgKGZuLl9uKSB7XG4gICAgcmV0dXJuIGZuO1xuICB9XG4gIGNvbnN0IHJlbmRlckZuV2l0aENvbnRleHQgPSAoLi4uYXJncykgPT4ge1xuICAgIGlmIChyZW5kZXJGbldpdGhDb250ZXh0Ll9kKSB7XG4gICAgICBzZXRCbG9ja1RyYWNraW5nKC0xKTtcbiAgICB9XG4gICAgY29uc3QgcHJldkluc3RhbmNlID0gc2V0Q3VycmVudFJlbmRlcmluZ0luc3RhbmNlKGN0eCk7XG4gICAgbGV0IHJlcztcbiAgICB0cnkge1xuICAgICAgcmVzID0gZm4oLi4uYXJncyk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHNldEN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZShwcmV2SW5zdGFuY2UpO1xuICAgICAgaWYgKHJlbmRlckZuV2l0aENvbnRleHQuX2QpIHtcbiAgICAgICAgc2V0QmxvY2tUcmFja2luZygxKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgX19WVUVfUFJPRF9ERVZUT09MU19fKSB7XG4gICAgICBkZXZ0b29sc0NvbXBvbmVudFVwZGF0ZWQoY3R4KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfTtcbiAgcmVuZGVyRm5XaXRoQ29udGV4dC5fbiA9IHRydWU7XG4gIHJlbmRlckZuV2l0aENvbnRleHQuX2MgPSB0cnVlO1xuICByZW5kZXJGbldpdGhDb250ZXh0Ll9kID0gdHJ1ZTtcbiAgcmV0dXJuIHJlbmRlckZuV2l0aENvbnRleHQ7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlRGlyZWN0aXZlTmFtZShuYW1lKSB7XG4gIGlmIChpc0J1aWx0SW5EaXJlY3RpdmUobmFtZSkpIHtcbiAgICB3YXJuJDEoXCJEbyBub3QgdXNlIGJ1aWx0LWluIGRpcmVjdGl2ZSBpZHMgYXMgY3VzdG9tIGRpcmVjdGl2ZSBpZDogXCIgKyBuYW1lKTtcbiAgfVxufVxuZnVuY3Rpb24gd2l0aERpcmVjdGl2ZXModm5vZGUsIGRpcmVjdGl2ZXMpIHtcbiAgaWYgKGN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZSA9PT0gbnVsbCkge1xuICAgICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgd2FybiQxKGB3aXRoRGlyZWN0aXZlcyBjYW4gb25seSBiZSB1c2VkIGluc2lkZSByZW5kZXIgZnVuY3Rpb25zLmApO1xuICAgIHJldHVybiB2bm9kZTtcbiAgfVxuICBjb25zdCBpbnN0YW5jZSA9IGdldENvbXBvbmVudFB1YmxpY0luc3RhbmNlKGN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZSk7XG4gIGNvbnN0IGJpbmRpbmdzID0gdm5vZGUuZGlycyB8fCAodm5vZGUuZGlycyA9IFtdKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBkaXJlY3RpdmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgbGV0IFtkaXIsIHZhbHVlLCBhcmcsIG1vZGlmaWVycyA9IEVNUFRZX09CSl0gPSBkaXJlY3RpdmVzW2ldO1xuICAgIGlmIChkaXIp
20578IHtcbiAgICAgIGlmIChpc0Z1bmN0aW9uKGRpcikpIHtcbiAgICAgICAgZGlyID0ge1xuICAgICAgICAgIG1vdW50ZWQ6IGRpcixcbiAgICAgICAgICB1cGRhdGVkOiBkaXJcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmIChkaXIuZGVlcCkge1xuICAgICAgICB0cmF2ZXJzZSh2YWx1ZSk7XG4gICAgICB9XG4gICAgICBiaW5kaW5ncy5wdXNoKHtcbiAgICAgICAgZGlyLFxuICAgICAgICBpbnN0YW5jZSxcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIG9sZFZhbHVlOiB2b2lkIDAsXG4gICAgICAgIGFyZyxcbiAgICAgICAgbW9kaWZpZXJzXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHZub2RlO1xufVxuZnVuY3Rpb24gaW52b2tlRGlyZWN0aXZlSG9vayh2bm9kZSwgcHJldlZOb2RlLCBpbnN0YW5jZSwgbmFtZSkge1xuICBjb25zdCBiaW5kaW5ncyA9IHZub2RlLmRpcnM7XG4gIGNvbnN0IG9sZEJpbmRpbmdzID0gcHJldlZOb2RlICYmIHByZXZWTm9kZS5kaXJzO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGJpbmRpbmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgYmluZGluZyA9IGJpbmRpbmdzW2ldO1xuICAgIGlmIChvbGRCaW5kaW5ncykge1xuICAgICAgYmluZGluZy5vbGRWYWx1ZSA9IG9sZEJpbmRpbmdzW2ldLnZhbHVlO1xuICAgIH1cbiAgICBsZXQgaG9vayA9IGJpbmRpbmcuZGlyW25hbWVdO1xuICAgIGlmIChob29rKSB7XG4gICAgICBwYXVzZVRyYWNraW5nKCk7XG4gICAgICBjYWxsV2l0aEFzeW5jRXJyb3JIYW5kbGluZyhob29rLCBpbnN0YW5jZSwgOCwgW1xuICAgICAgICB2bm9kZS5lbCxcbiAgICAgICAgYmluZGluZyxcbiAgICAgICAgdm5vZGUsXG4gICAgICAgIHByZXZWTm9kZVxuICAgICAgXSk7XG4gICAgICByZXNldFRyYWNraW5nKCk7XG4gICAgfVxuICB9XG59XG5cbmNvbnN0IGxlYXZlQ2JLZXkgPSBTeW1ib2woXCJfbGVhdmVDYlwiKTtcbmNvbnN0IGVudGVyQ2JLZXkgPSBTeW1ib2woXCJfZW50ZXJDYlwiKTtcbmZ1bmN0aW9uIHVzZVRyYW5zaXRpb25TdGF0ZSgpIHtcbiAgY29uc3Qgc3RhdGUgPSB7XG4gICAgaXNNb3VudGVkOiBmYWxzZSxcbiAgICBpc0xlYXZpbmc6IGZhbHNlLFxuICAgIGlzVW5tb3VudGluZzogZmFsc2UsXG4gICAgbGVhdmluZ1ZOb2RlczogLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKVxuICB9O1xuICBvbk1vdW50ZWQoKCkgPT4ge1xuICAgIHN0YXRlLmlzTW91bnRlZCA9IHRydWU7XG4gIH0pO1xuICBvbkJlZm9yZVVubW91bnQoKCkgPT4ge1xuICAgIHN0YXRlLmlzVW5tb3VudGluZyA9IHRydWU7XG4gIH0pO1xuICByZXR1cm4gc3RhdGU7XG59XG5jb25zdCBUcmFuc2l0aW9uSG9va1ZhbGlkYXRvciA9IFtGdW5jdGlvbiwgQXJyYXldO1xuY29uc3QgQmFzZVRyYW5zaXRpb25Qcm9wc1ZhbGlkYXRvcnMgPSB7XG4gIG1vZGU6IFN0cmluZyxcbiAgYXBwZWFyOiBCb29sZWFuLFxuICBwZXJzaXN0ZWQ6IEJvb2xlYW4sXG4gIC8vIGVudGVyXG4gIG9uQmVmb3JlRW50ZXI6IFRyYW5zaXRpb25Ib29rVmFsaWRhdG9yLFxuICBvbkVudGVyOiBUcmFuc2l0aW9uSG9va1ZhbGlkYXRvcixcbiAgb25BZnRlckVudGVyOiBUcmFuc2l0aW9uSG9va1ZhbGlkYXRvcixcbiAgb25FbnRlckNhbmNlbGxlZDogVHJhbnNpdGlvbkhvb2tWYWxpZGF0b3IsXG4gIC8vIGxlYXZlXG4gIG9uQmVmb3JlTGVhdmU6IFRyYW5zaXRpb25Ib29rVmFsaWRhdG9yLFxuICBvbkxlYXZlOiBUcmFuc2l0aW9uSG9va1ZhbGlkYXRvcixcbiAgb25BZnRlckxlYXZlOiBUcmFuc2l0aW9uSG9va1ZhbGlkYXRvcixcbiAgb25MZWF2ZUNhbmNlbGxlZDogVHJhbnNpdGlvbkhvb2tWYWxpZGF0b3IsXG4gIC8vIGFwcGVhclxuICBvbkJlZm9yZUFwcGVhcjogVHJhbnNpdGlvbkhvb2tWYWxpZGF0b3IsXG4gIG9uQXBwZWFyOiBUcmFuc2l0aW9uSG9va1ZhbGlkYXRvcixcbiAgb25BZnRlckFwcGVhcjogVHJhbnNpdGlvbkhvb2tWYWxpZGF0b3IsXG4gIG9uQXBwZWFyQ2FuY2VsbGVkOiBUcmFuc2l0aW9uSG9va1ZhbGlkYXRvclxufTtcbmNvbnN0IHJlY3Vyc2l2ZUdldFN1YnRyZWUgPSAoaW5zdGFuY2UpID0+IHtcbiAgY29uc3Qgc3ViVHJlZSA9IGluc3RhbmNlLnN1YlRyZWU7XG4gIHJldHVybiBzdWJUcmVlLmNvbXBvbmVudCA/IHJlY3Vyc2l2ZUdldFN1YnRyZWUoc3ViVHJlZS5jb21wb25lbnQpIDogc3ViVHJlZTtcbn07XG5jb25zdCBCYXNlVHJhbnNpdGlvbkltcGwgPSB7XG4gIG5hbWU6IGBCYXNlVHJhbnNpdGlvbmAsXG4gIHByb3BzOiBCYXNlVHJhbnNpdGlvblByb3BzVmFsaWRhdG9ycyxcbiAgc2V0dXAocHJvcHMsIHsgc2xvdHMgfSkge1xuICAgIGNvbnN0IGluc3RhbmNlID0gZ2V0Q3VycmVudEluc3RhbmNlKCk7XG4gICAgY29uc3Qgc3RhdGUgPSB1c2VUcmFuc2l0aW9uU3RhdGUoKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgY29uc3QgY2hpbGRyZW4gPSBzbG90cy5kZWZh
20578dWx0ICYmIGdldFRyYW5zaXRpb25SYXdDaGlsZHJlbihzbG90cy5kZWZhdWx0KCksIHRydWUpO1xuICAgICAgaWYgKCFjaGlsZHJlbiB8fCAhY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGxldCBjaGlsZCA9IGNoaWxkcmVuWzBdO1xuICAgICAgaWYgKGNoaWxkcmVuLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgbGV0IGhhc0ZvdW5kID0gZmFsc2U7XG4gICAgICAgIGZvciAoY29uc3QgYyBvZiBjaGlsZHJlbikge1xuICAgICAgICAgIGlmIChjLnR5cGUgIT09IENvbW1lbnQpIHtcbiAgICAgICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIGhhc0ZvdW5kKSB7XG4gICAgICAgICAgICAgIHdhcm4kMShcbiAgICAgICAgICAgICAgICBcIjx0cmFuc2l0aW9uPiBjYW4gb25seSBiZSB1c2VkIG9uIGEgc2luZ2xlIGVsZW1lbnQgb3IgY29tcG9uZW50LiBVc2UgPHRyYW5zaXRpb24tZ3JvdXA+IGZvciBsaXN0cy5cIlxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNoaWxkID0gYztcbiAgICAgICAgICAgIGhhc0ZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmICghISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCByYXdQcm9wcyA9IHRvUmF3KHByb3BzKTtcbiAgICAgIGNvbnN0IHsgbW9kZSB9ID0gcmF3UHJvcHM7XG4gICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBtb2RlICYmIG1vZGUgIT09IFwiaW4tb3V0XCIgJiYgbW9kZSAhPT0gXCJvdXQtaW5cIiAmJiBtb2RlICE9PSBcImRlZmF1bHRcIikge1xuICAgICAgICB3YXJuJDEoYGludmFsaWQgPHRyYW5zaXRpb24+IG1vZGU6ICR7bW9kZX1gKTtcbiAgICAgIH1cbiAgICAgIGlmIChzdGF0ZS5pc0xlYXZpbmcpIHtcbiAgICAgICAgcmV0dXJuIGVtcHR5UGxhY2Vob2xkZXIoY2hpbGQpO1xuICAgICAgfVxuICAgICAgY29uc3QgaW5uZXJDaGlsZCA9IGdldEtlZXBBbGl2ZUNoaWxkKGNoaWxkKTtcbiAgICAgIGlmICghaW5uZXJDaGlsZCkge1xuICAgICAgICByZXR1cm4gZW1wdHlQbGFjZWhvbGRlcihjaGlsZCk7XG4gICAgICB9XG4gICAgICBsZXQgZW50ZXJIb29rcyA9IHJlc29sdmVUcmFuc2l0aW9uSG9va3MoXG4gICAgICAgIGlubmVyQ2hpbGQsXG4gICAgICAgIHJhd1Byb3BzLFxuICAgICAgICBzdGF0ZSxcbiAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgIC8vICMxMTA2MSwgZW5zdXJlIGVudGVySG9va3MgaXMgZnJlc2ggYWZ0ZXIgY2xvbmVcbiAgICAgICAgKGhvb2tzKSA9PiBlbnRlckhvb2tzID0gaG9va3NcbiAgICAgICk7XG4gICAgICBzZXRUcmFuc2l0aW9uSG9va3MoaW5uZXJDaGlsZCwgZW50ZXJIb29rcyk7XG4gICAgICBjb25zdCBvbGRDaGlsZCA9IGluc3RhbmNlLnN1YlRyZWU7XG4gICAgICBjb25zdCBvbGRJbm5lckNoaWxkID0gb2xkQ2hpbGQgJiYgZ2V0S2VlcEFsaXZlQ2hpbGQob2xkQ2hpbGQpO1xuICAgICAgaWYgKG9sZElubmVyQ2hpbGQgJiYgb2xkSW5uZXJDaGlsZC50eXBlICE9PSBDb21tZW50ICYmICFpc1NhbWVWTm9kZVR5cGUoaW5uZXJDaGlsZCwgb2xkSW5uZXJDaGlsZCkgJiYgcmVjdXJzaXZlR2V0U3VidHJlZShpbnN0YW5jZSkudHlwZSAhPT0gQ29tbWVudCkge1xuICAgICAgICBjb25zdCBsZWF2aW5nSG9va3MgPSByZXNvbHZlVHJhbnNpdGlvbkhvb2tzKFxuICAgICAgICAgIG9sZElubmVyQ2hpbGQsXG4gICAgICAgICAgcmF3UHJvcHMsXG4gICAgICAgICAgc3RhdGUsXG4gICAgICAgICAgaW5zdGFuY2VcbiAgICAgICAgKTtcbiAgICAgICAgc2V0VHJhbnNpdGlvbkhvb2tzKG9sZElubmVyQ2hpbGQsIGxlYXZpbmdIb29rcyk7XG4gICAgICAgIGlmIChtb2RlID09PSBcIm91dC1pblwiICYmIGlubmVyQ2hpbGQudHlwZSAhPT0gQ29tbWVudCkge1xuICAgICAgICAgIHN0YXRlLmlzTGVhdmluZyA9IHRydWU7XG4gICAgICAgICAgbGVhdmluZ0hvb2tzLmFmdGVyTGVhdmUgPSAoKSA9PiB7XG4gICAgICAgICAgICBzdGF0ZS5pc0xlYXZpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmIChpbnN0YW5jZS51cGRhdGUuYWN0aXZlICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICBpbnN0YW5jZS5lZmZlY3QuZGlydHkgPSB0cnVlO1xuICAgICAgICAgICAgICBpbnN0YW5jZS51cGRhdGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICAgIHJldHVybiBlbXB0eVBsYWNlaG9sZGVyKGNoaWxkKTtcbiAgICAgICAgfSBlbHNlIGlmIChtb2RlID09PSBcImluLW91dFwiICYmIGlubmVyQ2hpbGQudHlwZSAhPT0gQ29tbWVudCkge1xuICAgICAgICAgIGxlYXZpbmdIb29rcy5kZWxheUxlYXZlID0gKGVsLCBlYXJseVJlbW92ZSwgZGVsYXllZExlYXZlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBsZWF2aW5nVk5vZGVzQ2FjaGUgPSBnZXRMZWF2aW5nTm9kZXNGb3JUeXBlKFxuICAgICAgICAgICAgICBzdGF0ZSxcbiAgICAgICAgICAgICAgb2xkSW5uZXJDaGlsZFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGxlYXZpbmdWTm9kZXNDYWNoZVtTdHJpbmcob2xkSW5uZXJDaGlsZC5rZXkpXSA9IG9sZElubmVyQ2hpbGQ7XG4gICAgICAgICAgICBlbFtsZWF2ZUNiS2V5XSA9ICgpID0+IHtcbiAgICAgICAgICAgICAgZWFybHlSZW1vdmUoKTtcbiAgICAgICAgICAgICAgZWxbbGVhdmVDYktleV0gPSB2b2lkIDA7XG4gICAgICAgICAgICAgIGRlbGV0ZSBlbnRlckhvb2tzLmRlbGF5ZWRMZWF2ZTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBlbnRlckhvb2tzLmRlbGF5ZWRMZWF2ZSA9IGRlbGF5ZWRMZWF2ZTtcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gY2hpbGQ7XG4gICAgfTtcbiAgfVxufTtcbmNvbnN0IEJhc2VUcmFuc2l0aW9uID0gQmFzZVRyYW5zaXRpb25JbXBsO1xuZnVuY3Rpb24gZ2V0TGVhdmluZ05vZGVzRm9yVHlwZShzdGF0ZSwgdm5vZGUpIHtcbiAgY29uc3QgeyBsZWF2aW5nVk5vZGVzIH0gPSBzdGF0ZTtcbiAgbGV0IGxlYXZpbmdWTm9kZXNDYWNoZSA9IGxlYXZpbmdWTm9kZXMuZ2V0KHZub2RlLnR5cGUpO1xuICBpZiAoIWxlYXZpbmdWTm9kZXNDYWNoZSkge1xuICAgIGxlYXZpbmdWTm9kZXNDYWNoZSA9IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIGxlYXZpbmdWTm9kZXMuc2V0KHZub2RlLnR5cGUsIGxlYXZpbmdWTm9kZXNDYWNoZSk7XG4gIH1cbiAgcmV0dXJuIGxlYXZpbmdWTm9kZXNDYWNoZTtcbn1cbmZ1bmN0aW9uIHJlc29sdmVUcmFuc2l0aW9uSG9va3Modm5vZGUsIHByb3BzLCBzdGF0ZSwgaW5zdGFuY2UsIHBvc3RDbG9uZSkge1xuICBjb25zdCB7XG4gICAgYXBwZWFyLFxuICAgIG1vZGUsXG4gICAgcGVyc2lzdGVkID0gZmFsc2UsXG4gICAgb25CZWZvcmVFbnRlcixcbiAgICBvbkVudGVyLFxuICAgIG9uQWZ0ZXJFbnRlcixcbiAgICBvbkVudGVyQ2FuY2VsbGVkLFxuICAgIG9uQmVmb3JlTGVhdmUsXG4gICAgb25MZWF2ZSxcbiAgICBvbkFmdGVyTGVhdmUsXG4gICAgb25MZWF2ZUNhbmNlbGxlZCxcbiAgICBvbkJlZm9yZUFwcGVhcixcbiAgICBvbkFwcGVhcixcbiAgICBvbkFmdGVyQXBwZWFyLFxuICAgIG9uQXBwZWFyQ2FuY2VsbGVkXG4gIH0gPSBwcm9wcztcbiAgY29uc3Qga2V5ID0gU3RyaW5nKHZub2RlLmtleSk7XG4gIGNvbnN0IGxlYXZpbmdWTm9kZXNDYWNoZSA9IGdldExlYXZpbmdOb2Rlc0ZvclR5cGUoc3RhdGUsIHZub2RlKTtcbiAgY29uc3QgY2FsbEhvb2sgPSAoaG9vaywgYXJncykgPT4ge1xuICAgIGhvb2sgJiYgY2FsbFdpdGhBc3luY0Vycm9ySGFuZGxpbmcoXG4gICAgICBob29rLFxuICAgICAgaW5zdGFuY2UsXG4gICAgICA5LFxuICAgICAgYXJnc1xuICAgICk7XG4gIH07XG4gIGNvbnN0IGNhbGxBc3luY0hvb2sgPSAoaG9vaywgYXJncykgPT4ge1xuICAgIGNvbnN0IGRvbmUgPSBhcmdzWzFdO1xuICAgIGNhbGxIb29rKGhvb2ssIGFyZ3MpO1xuICAgIGlmIChpc0FycmF
205785KGhvb2spKSB7XG4gICAgICBpZiAoaG9vay5ldmVyeSgoaG9vazIpID0+IGhvb2syLmxlbmd0aCA8PSAxKSkgZG9uZSgpO1xuICAgIH0gZWxzZSBpZiAoaG9vay5sZW5ndGggPD0gMSkge1xuICAgICAgZG9uZSgpO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgaG9va3MgPSB7XG4gICAgbW9kZSxcbiAgICBwZXJzaXN0ZWQsXG4gICAgYmVmb3JlRW50ZXIoZWwpIHtcbiAgICAgIGxldCBob29rID0gb25CZWZvcmVFbnRlcjtcbiAgICAgIGlmICghc3RhdGUuaXNNb3VudGVkKSB7XG4gICAgICAgIGlmIChhcHBlYXIpIHtcbiAgICAgICAgICBob29rID0gb25CZWZvcmVBcHBlYXIgfHwgb25CZWZvcmVFbnRlcjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChlbFtsZWF2ZUNiS2V5XSkge1xuICAgICAgICBlbFtsZWF2ZUNiS2V5XShcbiAgICAgICAgICB0cnVlXG4gICAgICAgICAgLyogY2FuY2VsbGVkICovXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjb25zdCBsZWF2aW5nVk5vZGUgPSBsZWF2aW5nVk5vZGVzQ2FjaGVba2V5XTtcbiAgICAgIGlmIChsZWF2aW5nVk5vZGUgJiYgaXNTYW1lVk5vZGVUeXBlKHZub2RlLCBsZWF2aW5nVk5vZGUpICYmIGxlYXZpbmdWTm9kZS5lbFtsZWF2ZUNiS2V5XSkge1xuICAgICAgICBsZWF2aW5nVk5vZGUuZWxbbGVhdmVDYktleV0oKTtcbiAgICAgIH1cbiAgICAgIGNhbGxIb29rKGhvb2ssIFtlbF0pO1xuICAgIH0sXG4gICAgZW50ZXIoZWwpIHtcbiAgICAgIGxldCBob29rID0gb25FbnRlcjtcbiAgICAgIGxldCBhZnRlckhvb2sgPSBvbkFmdGVyRW50ZXI7XG4gICAgICBsZXQgY2FuY2VsSG9vayA9IG9uRW50ZXJDYW5jZWxsZWQ7XG4gICAgICBpZiAoIXN0YXRlLmlzTW91bnRlZCkge1xuICAgICAgICBpZiAoYXBwZWFyKSB7XG4gICAgICAgICAgaG9vayA9IG9uQXBwZWFyIHx8IG9uRW50ZXI7XG4gICAgICAgICAgYWZ0ZXJIb29rID0gb25BZnRlckFwcGVhciB8fCBvbkFmdGVyRW50ZXI7XG4gICAgICAgICAgY2FuY2VsSG9vayA9IG9uQXBwZWFyQ2FuY2VsbGVkIHx8IG9uRW50ZXJDYW5jZWxsZWQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBsZXQgY2FsbGVkID0gZmFsc2U7XG4gICAgICBjb25zdCBkb25lID0gZWxbZW50ZXJDYktleV0gPSAoY2FuY2VsbGVkKSA9PiB7XG4gICAgICAgIGlmIChjYWxsZWQpIHJldHVybjtcbiAgICAgICAgY2FsbGVkID0gdHJ1ZTtcbiAgICAgICAgaWYgKGNhbmNlbGxlZCkge1xuICAgICAgICAgIGNhbGxIb29rKGNhbmNlbEhvb2ssIFtlbF0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNhbGxIb29rKGFmdGVySG9vaywgW2VsXSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhvb2tzLmRlbGF5ZWRMZWF2ZSkge1xuICAgICAgICAgIGhvb2tzLmRlbGF5ZWRMZWF2ZSgpO1xuICAgICAgICB9XG4gICAgICAgIGVsW2VudGVyQ2JLZXldID0gdm9pZCAwO1xuICAgICAgfTtcbiAgICAgIGlmIChob29rKSB7XG4gICAgICAgIGNhbGxBc3luY0hvb2soaG9vaywgW2VsLCBkb25lXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkb25lKCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBsZWF2ZShlbCwgcmVtb3ZlKSB7XG4gICAgICBjb25zdCBrZXkyID0gU3RyaW5nKHZub2RlLmtleSk7XG4gICAgICBpZiAoZWxbZW50ZXJDYktleV0pIHtcbiAgICAgICAgZWxbZW50ZXJDYktleV0oXG4gICAgICAgICAgdHJ1ZVxuICAgICAgICAgIC8qIGNhbmNlbGxlZCAqL1xuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKHN0YXRlLmlzVW5tb3VudGluZykge1xuICAgICAgICByZXR1cm4gcmVtb3ZlKCk7XG4gICAgICB9XG4gICAgICBjYWxsSG9vayhvbkJlZm9yZUxlYXZlLCBbZWxdKTtcbiAgICAgIGxldCBjYWxsZWQgPSBmYWxzZTtcbiAgICAgIGNvbnN0IGRvbmUgPSBlbFtsZWF2ZUNiS2V5XSA9IChjYW5jZWxsZWQpID0+IHtcbiAgICAgICAgaWYgKGNhbGxlZCkgcmV0dXJuO1xuICAgICAgICBjYWxsZWQgPSB0cnVlO1xuICAgICAgICByZW1vdmUoKTtcbiAgICAgICAgaWYgKGNhbmNlbGxlZCkge1xuICAgICAgICAgIGNhbGxIb29rKG9uTGVhdmVDYW5jZWxsZWQsIFtlbF0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNhbGxIb29rKG9uQWZ0ZXJMZWF2ZSwgW2VsXSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxbbGVhdmVDYktleV0gPSB2b2lkIDA7XG4gICAgICAgIGlmIChsZWF2aW5nVk5vZGVzQ2FjaGVba2V5Ml0gPT09IHZub2RlKSB7XG4gICAgICAgICAgZGVsZXRlIGxlYXZpbmdWTm9kZXNDYWNoZVtrZXkyXTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGxlYXZpbmdWTm9kZXNDYWNoZVtrZXkyXSA9IHZub2RlO1xuICAgICAgaWYgKG9uTGVhdmUpIHtcbiAgICAgICAgY2FsbEFzeW5jSG9vayhvbkxlYXZlLCBbZWwsIGRvbmVdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRvbmUoKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGNsb25lKHZub2RlMikge1xuICAgICAgY29uc3QgaG9va3MyID0gcmVzb2x2ZVRyYW5zaXRpb25Ib29rcyhcbiAgICAgICAgdm5vZGUyLFxuICAgICAgICBwcm9wcyxcbiAgICAgICAgc3RhdGUsXG4gICAgICAgIGluc3RhbmNlLFxuICAgICAgICBwb3N0Q2xvbmVcbiAgICAgICk7XG4gICAgICBpZiAocG9zdENsb25lKSBwb3N0Q2xvbmUoaG9va3MyKTtcbiAgICAgIHJldHVybiBob29rczI7XG4gICAgfVxuICB9O1xuICByZXR1cm4gaG9va3M7XG59XG5mdW5jdGlvbiBlbXB0eVBsYWNlaG9sZGVyKHZub2RlKSB7XG4gIGlmIChpc0tlZXBBbGl2ZSh2bm9kZSkpIHtcbiAgICB2bm9kZSA9IGNsb25lVk5vZGUodm5vZGUpO1xuICAgIHZub2RlLmNoaWxkcmVuID0gbnVsbDtcbiAgICByZXR1cm4gdm5vZGU7XG4gIH1cbn1cbmZ1bmN0aW9uIGdldEtlZXBBbGl2ZUNoaWxkKHZub2RlKSB7XG4gIGlmICghaXNLZWVwQWxpdmUodm5vZGUpKSB7XG4gICAgcmV0dXJuIHZub2RlO1xuICB9XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9k
20578dWN0aW9uXCIpICYmIHZub2RlLmNvbXBvbmVudCkge1xuICAgIHJldHVybiB2bm9kZS5jb21wb25lbnQuc3ViVHJlZTtcbiAgfVxuICBjb25zdCB7IHNoYXBlRmxhZywgY2hpbGRyZW4gfSA9IHZub2RlO1xuICBpZiAoY2hpbGRyZW4pIHtcbiAgICBpZiAoc2hhcGVGbGFnICYgMTYpIHtcbiAgICAgIHJldHVybiBjaGlsZHJlblswXTtcbiAgICB9XG4gICAgaWYgKHNoYXBlRmxhZyAmIDMyICYmIGlzRnVuY3Rpb24oY2hpbGRyZW4uZGVmYXVsdCkpIHtcbiAgICAgIHJldHVybiBjaGlsZHJlbi5kZWZhdWx0KCk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBzZXRUcmFuc2l0aW9uSG9va3Modm5vZGUsIGhvb2tzKSB7XG4gIGlmICh2bm9kZS5zaGFwZUZsYWcgJiA2ICYmIHZub2RlLmNvbXBvbmVudCkge1xuICAgIHNldFRyYW5zaXRpb25Ib29rcyh2bm9kZS5jb21wb25lbnQuc3ViVHJlZSwgaG9va3MpO1xuICB9IGVsc2UgaWYgKHZub2RlLnNoYXBlRmxhZyAmIDEyOCkge1xuICAgIHZub2RlLnNzQ29udGVudC50cmFuc2l0aW9uID0gaG9va3MuY2xvbmUodm5vZGUuc3NDb250ZW50KTtcbiAgICB2bm9kZS5zc0ZhbGxiYWNrLnRyYW5zaXRpb24gPSBob29rcy5jbG9uZSh2bm9kZS5zc0ZhbGxiYWNrKTtcbiAgfSBlbHNlIHtcbiAgICB2bm9kZS50cmFuc2l0aW9uID0gaG9va3M7XG4gIH1cbn1cbmZ1bmN0aW9uIGdldFRyYW5zaXRpb25SYXdDaGlsZHJlbihjaGlsZHJlbiwga2VlcENvbW1lbnQgPSBmYWxzZSwgcGFyZW50S2V5KSB7XG4gIGxldCByZXQgPSBbXTtcbiAgbGV0IGtleWVkRnJhZ21lbnRDb3VudCA9IDA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICBsZXQgY2hpbGQgPSBjaGlsZHJlbltpXTtcbiAgICBjb25zdCBrZXkgPSBwYXJlbnRLZXkgPT0gbnVsbCA/IGNoaWxkLmtleSA6IFN0cmluZyhwYXJlbnRLZXkpICsgU3RyaW5nKGNoaWxkLmtleSAhPSBudWxsID8gY2hpbGQua2V5IDogaSk7XG4gICAgaWYgKGNoaWxkLnR5cGUgPT09IEZyYWdtZW50KSB7XG4gICAgICBpZiAoY2hpbGQucGF0Y2hGbGFnICYgMTI4KSBrZXllZEZyYWdtZW50Q291bnQrKztcbiAgICAgIHJldCA9IHJldC5jb25jYXQoXG4gICAgICAgIGdldFRyYW5zaXRpb25SYXdDaGlsZHJlbihjaGlsZC5jaGlsZHJlbiwga2VlcENvbW1lbnQsIGtleSlcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChrZWVwQ29tbWVudCB8fCBjaGlsZC50eXBlICE9PSBDb21tZW50KSB7XG4gICAgICByZXQucHVzaChrZXkgIT0gbnVsbCA/IGNsb25lVk5vZGUoY2hpbGQsIHsga2V5IH0pIDogY2hpbGQpO1xuICAgIH1cbiAgfVxuICBpZiAoa2V5ZWRGcmFnbWVudENvdW50ID4gMSkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmV0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICByZXRbaV0ucGF0Y2hGbGFnID0gLTI7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXQ7XG59XG5cbi8qISAjX19OT19TSURFX0VGRkVDVFNfXyAqL1xuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmZ1bmN0aW9uIGRlZmluZUNvbXBvbmVudChvcHRpb25zLCBleHRyYU9wdGlvbnMpIHtcbiAgcmV0dXJuIGlzRnVuY3Rpb24ob3B0aW9ucykgPyAoXG4gICAgLy8gIzgzMjY6IGV4dGVuZCBjYWxsIGFuZCBvcHRpb25zLm5hbWUgYWNjZXNzIGFyZSBjb25zaWRlcmVkIHNpZGUtZWZmZWN0c1xuICAgIC8vIGJ5IFJvbGx1cCwgc28gd2UgaGF2ZSB0byB3cmFwIGl0IGluIGEgcHVyZS1hbm5vdGF0ZWQgSUlGRS5cbiAgICAvKiBAX19QVVJFX18gKi8gKCgpID0+IGV4dGVuZCh7IG5hbWU6IG9wdGlvbnMubmFtZSB9LCBleHRyYU9wdGlvbnMsIHsgc2V0dXA6IG9wdGlvbnMgfSkpKClcbiAgKSA6IG9wdGlvbnM7XG59XG5cbmNvbnN0IGlzQXN5bmNXcmFwcGVyID0gKGkpID0+ICEhaS50eXBlLl9fYXN5bmNMb2FkZXI7XG4vKiEgI19fTk9fU0lERV9FRkZFQ1RTX18gKi9cbi8vIEBfX05PX1NJREVfRUZGRUNUU19fXG5mdW5jdGlvbiBkZWZpbmVBc3luY0NvbXBvbmVudChzb3VyY2UpIHtcbiAgaWYgKGlzRnVuY3Rpb24oc291cmNlKSkge1xuICAgIHNvdXJjZSA9IHsgbG9hZGVyOiBzb3VyY2UgfTtcbiAgfVxuICBjb25zdCB7XG4gICAgbG9hZGVyLFxuICAgIGxvYWRpbmdDb21wb25lbnQsXG4gICAgZXJyb3JDb21wb25lbnQsXG4gICAgZGVsYXkgPSAyMDAsXG4gICAgdGltZW91dCxcbiAgICAvLyB1bmRlZmluZWQgPSBuZXZlciB0aW1lcyBvdXRcbiAgICBzdXNwZW5zaWJsZSA9IHRydWUsXG4gICAgb25FcnJvcjogdXNlck9uRXJyb3JcbiAgfSA9IHNvdXJjZTtcbiAgbGV0IHBlbmRpbmdSZXF1ZXN0ID0gbnVsbDtcbiAgbGV0IHJlc29sdmVkQ29tcDtcbiAgbGV0IHJldHJpZXMgPSAwO1xuICBjb25zdCByZXRyeSA9ICgpID0+IHtcbiAgICByZXRyaWVzKys7XG4gICAgcGVuZGluZ1JlcXVlc3QgPSBudWxsO1xuICAgIHJldHVybiBsb2FkKCk7XG4gIH07XG4gIGNvbnN0IGxvYWQgPSAoKSA9PiB7XG4gICAgbGV0IHRoaXNSZXF1ZXN0O1xuICAgIHJldHVybiBwZW5kaW5nUmVxdWVzdCB8fCAodGhpc1JlcXVlc3QgPSBwZW5kaW5nUmVxdWVzdCA9IGxvYWRlcigpLmNhdGNoKChlcnIpID0+IHtcbiAgICAgIGVyciA9IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyIDogbmV3IEVycm9yKFN0cmluZyhlcnIpKTtcbiAgICAgIGlmICh1c2VyT25FcnJvcikge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHVzZXJSZXRyeSA9ICgpID0+IHJlc29sdmUocmV0cnkoKSk7XG4gICAgICAgICAgY29uc3QgdXNlckZhaWwgPSAoKSA9PiByZWplY3QoZXJyKTtcbiAgICAgICAgICB1c2VyT25FcnJvcihlcnIsIHVzZXJSZXRyeSwgdXNlckZhaWwsIHJldHJpZXMgKyAxKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBlcnI7XG4gICAgICB9XG4gICAgfSkudGhlbigoY29tcCkgPT4ge1xuICAgICAgaWYgKHRoaXNSZXF1ZXN0ICE9PSBwZW5kaW5nUmVxdWVzdCAmJiBwZW5kaW5nUmVxdWVzdCkge1xuICAgICAgICByZXR1cm4gcGVuZGluZ1JlcXVlc3Q7XG4gICAgICB9XG4gICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAhY29tcCkge1xuICAgICAgICB3YXJuJDEoXG4gICAgICAgICAgYEFzeW5jIGNvbXBvbmVudCBsb2FkZXIgcmVzb2x2ZWQgdG8gdW5kZWZpbmVkLiBJZiB5b3UgYXJlIHVzaW5nIHJldHJ5KCksIG1ha2Ugc3VyZSB0byByZXR1cm4gaXRzIHJldHVybi
20578B2YWx1ZS5gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAoY29tcCAmJiAoY29tcC5fX2VzTW9kdWxlIHx8IGNvbXBbU3ltYm9sLnRvU3RyaW5nVGFnXSA9PT0gXCJNb2R1bGVcIikpIHtcbiAgICAgICAgY29tcCA9IGNvbXAuZGVmYXVsdDtcbiAgICAgIH1cbiAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIGNvbXAgJiYgIWlzT2JqZWN0KGNvbXApICYmICFpc0Z1bmN0aW9uKGNvbXApKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBhc3luYyBjb21wb25lbnQgbG9hZCByZXN1bHQ6ICR7Y29tcH1gKTtcbiAgICAgIH1cbiAgICAgIHJlc29sdmVkQ29tcCA9IGNvbXA7XG4gICAgICByZXR1cm4gY29tcDtcbiAgICB9KSk7XG4gIH07XG4gIHJldHVybiBkZWZpbmVDb21wb25lbnQoe1xuICAgIG5hbWU6IFwiQXN5bmNDb21wb25lbnRXcmFwcGVyXCIsXG4gICAgX19hc3luY0xvYWRlcjogbG9hZCxcbiAgICBnZXQgX19hc3luY1Jlc29sdmVkKCkge1xuICAgICAgcmV0dXJuIHJlc29sdmVkQ29tcDtcbiAgICB9LFxuICAgIHNldHVwKCkge1xuICAgICAgY29uc3QgaW5zdGFuY2UgPSBjdXJyZW50SW5zdGFuY2U7XG4gICAgICBpZiAocmVzb2x2ZWRDb21wKSB7XG4gICAgICAgIHJldHVybiAoKSA9PiBjcmVhdGVJbm5lckNvbXAocmVzb2x2ZWRDb21wLCBpbnN0YW5jZSk7XG4gICAgICB9XG4gICAgICBjb25zdCBvbkVycm9yID0gKGVycikgPT4ge1xuICAgICAgICBwZW5kaW5nUmVxdWVzdCA9IG51bGw7XG4gICAgICAgIGhhbmRsZUVycm9yKFxuICAgICAgICAgIGVycixcbiAgICAgICAgICBpbnN0YW5jZSxcbiAgICAgICAgICAxMyxcbiAgICAgICAgICAhZXJyb3JDb21wb25lbnRcbiAgICAgICAgKTtcbiAgICAgIH07XG4gICAgICBpZiAoc3VzcGVuc2libGUgJiYgaW5zdGFuY2Uuc3VzcGVuc2UgfHwgaXNJblNTUkNvbXBvbmVudFNldHVwKSB7XG4gICAgICAgIHJldHVybiBsb2FkKCkudGhlbigoY29tcCkgPT4ge1xuICAgICAgICAgIHJldHVybiAoKSA9PiBjcmVhdGVJbm5lckNvbXAoY29tcCwgaW5zdGFuY2UpO1xuICAgICAgICB9KS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgb25FcnJvcihlcnIpO1xuICAgICAgICAgIHJldHVybiAoKSA9PiBlcnJvckNvbXBvbmVudCA/IGNyZWF0ZVZOb2RlKGVycm9yQ29tcG9uZW50LCB7XG4gICAgICAgICAgICBlcnJvcjogZXJyXG4gICAgICAgICAgfSkgOiBudWxsO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGxvYWRlZCA9IHJlZihmYWxzZSk7XG4gICAgICBjb25zdCBlcnJvciA9IHJlZigpO1xuICAgICAgY29uc3QgZGVsYXllZCA9IHJlZighIWRlbGF5KTtcbiAgICAgIGlmIChkZWxheSkge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBkZWxheWVkLnZhbHVlID0gZmFsc2U7XG4gICAgICAgIH0sIGRlbGF5KTtcbiAgICAgIH1cbiAgICAgIGlmICh0aW1lb3V0ICE9IG51bGwpIHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgaWYgKCFsb2FkZWQudmFsdWUgJiYgIWVycm9yLnZhbHVlKSB7XG4gICAgICAgICAgICBjb25zdCBlcnIgPSBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgIGBBc3luYyBjb21wb25lbnQgdGltZWQgb3V0IGFmdGVyICR7dGltZW91dH1tcy5gXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgb25FcnJvcihlcnIpO1xuICAgICAgICAgICAgZXJyb3IudmFsdWUgPSBlcnI7XG4gICAgICAgICAgfVxuICAgICAgICB9LCB0aW1lb3V0KTtcbiAgICAgIH1cbiAgICAgIGxvYWQoKS50aGVuKCgpID0+IHtcbiAgICAgICAgbG9hZGVkLnZhbHVlID0gdHJ1ZTtcbiAgICAgICAgaWYgKGluc3RhbmNlLnBhcmVudCAmJiBpc0tlZXBBbGl2ZShpbnN0YW5jZS5wYXJlbnQudm5vZGUpKSB7XG4gICAgICAgICAgaW5zdGFuY2UucGFyZW50LmVmZmVjdC5kaXJ0eSA9IHRydWU7XG4gICAgICAgICAgcXVldWVKb2IoaW5zdGFuY2UucGFyZW50LnVwZGF0ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgb25FcnJvcihlcnIpO1xuICAgICAgICBlcnJvci52YWx1ZSA9IGVycjtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgaWYgKGxvYWRlZC52YWx1ZSAmJiByZXNvbHZlZENvbXApIHtcbiAgICAgICAgICByZXR1cm4gY3JlYXRlSW5uZXJDb21wKHJlc29sdmVkQ29tcCwgaW5zdGFuY2UpO1xuICAgICAgICB9IGVsc2UgaWYgKGVycm9yLnZhbHVlICYmIGVycm9yQ29tcG9uZW50KSB7XG4gICAgICAgICAgcmV0dXJuIGNyZWF0ZVZOb2RlKGVycm9yQ29tcG9uZW50LCB7XG4gICAgICAgICAgICBlcnJvcjogZXJyb3IudmFsdWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChsb2FkaW5nQ29tcG9uZW50ICYmICFkZWxheWVkLnZhbHVlKSB7XG4gICAgICAgICAgcmV0dXJuIGNyZWF0ZVZOb2RlKGxvYWRpbmdDb21wb25lbnQpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgfSk7XG59XG5mdW5jdGlvbiBjcmVhdGVJbm5lckNvbXAoY29tcCwgcGFyZW50KSB7XG4gIGNvbnN0IHsgcmVmOiByZWYyLCBwcm9wcywgY2hpbGRyZW4sIGNlIH0gPSBwYXJlbnQudm5vZGU7XG4gIGNvbnN0IHZub2RlID0gY3JlYXRlVk5vZGUoY29tcCwgcHJvcHMsIGNoaWxkcmVuKTtcbiAgdm5vZGUucmVmID0gcmVmMjtcbiAgdm5vZGUuY2UgPSBjZTtcbiAgZGVsZXRlIHBhcmVudC52bm9kZS5jZTtcbiAgcmV0dXJuIHZub2RlO1xufVxuXG5jb25zdCBpc0tlZXBBbGl2ZSA9ICh2bm9kZSkgPT4gdm5vZGUudHlwZS5fX2lzS2VlcEFsaXZlO1xuY29uc3QgS2VlcEFsaXZlSW1wbCA9IHtcbiAgbmFtZTogYEtlZXBBbGl2ZWAsXG4gIC8vIE1hcmtlciBmb3Igc3BlY2lhbCBoYW5kbGluZyBpbnNpZGUgdGhlIHJlbmRlcmVyLiBXZSBhcmUgbm90IHVzaW5nIGEgPT09XG4gIC8vIGNoZWNrIGRpcmVjdGx5IG9uIEtlZXBBbGl2ZSBpbiB0aGUgcmVuZGVyZXIsIGJlY2F1c2UgaW1wb3J0aW5nIGl0IGRpcmVjdGx5XG4gIC8vIHdvdWxkIHByZXZlbnQgaXQgZnJvbSBiZWluZyB0cmVlLXNoYWtlbi5cbiAgX19pc0tlZXBBbGl2ZTogdHJ1ZSxcbiAgcHJvcHM6IHtcbiAgICBpbmNsdWRlOiBbU3RyaW5nLCBSZWdFeHAsIEFycmF5XSxcbiAgICBleGNsdWRlOiBbU3RyaW5nLCBSZWdFeHAsIEFycmF5XSxcbiAgICBtYXg6IFtTdHJpbmcsIE51bWJlcl1cbiAgfSxcbiAgc2V0dXAocHJvcHMsIHsgc2xvdHMgfSkge1xuICAgIGNvbnN0IGluc3RhbmNlID0gZ2V0Q3VycmVudEluc3RhbmNlKCk7XG4gICAgY29uc3Qgc2hhcmVkQ29udGV4dCA9IGluc3RhbmNlLmN0eDtcbiAgICBpZiAoIXNoYXJlZENvbnRleHQucmVuZGVyZXIpIHtcbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gc2xvdHMuZGVmYXVsdCAmJiBzbG90cy5kZWZh
20578dWx0KCk7XG4gICAgICAgIHJldHVybiBjaGlsZHJlbiAmJiBjaGlsZHJlbi5sZW5ndGggPT09IDEgPyBjaGlsZHJlblswXSA6IGNoaWxkcmVuO1xuICAgICAgfTtcbiAgICB9XG4gICAgY29uc3QgY2FjaGUgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuICAgIGNvbnN0IGtleXMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuICAgIGxldCBjdXJyZW50ID0gbnVsbDtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCBfX1ZVRV9QUk9EX0RFVlRPT0xTX18pIHtcbiAgICAgIGluc3RhbmNlLl9fdl9jYWNoZSA9IGNhY2hlO1xuICAgIH1cbiAgICBjb25zdCBwYXJlbnRTdXNwZW5zZSA9IGluc3RhbmNlLnN1c3BlbnNlO1xuICAgIGNvbnN0IHtcbiAgICAgIHJlbmRlcmVyOiB7XG4gICAgICAgIHA6IHBhdGNoLFxuICAgICAgICBtOiBtb3ZlLFxuICAgICAgICB1bTogX3VubW91bnQsXG4gICAgICAgIG86IHsgY3JlYXRlRWxlbWVudCB9XG4gICAgICB9XG4gICAgfSA9IHNoYXJlZENvbnRleHQ7XG4gICAgY29uc3Qgc3RvcmFnZUNvbnRhaW5lciA9IGNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgc2hhcmVkQ29udGV4dC5hY3RpdmF0ZSA9ICh2bm9kZSwgY29udGFpbmVyLCBhbmNob3IsIG5hbWVzcGFjZSwgb3B0aW1pemVkKSA9PiB7XG4gICAgICBjb25zdCBpbnN0YW5jZTIgPSB2bm9kZS5jb21wb25lbnQ7XG4gICAgICBtb3ZlKHZub2RlLCBjb250YWluZXIsIGFuY2hvciwgMCwgcGFyZW50U3VzcGVuc2UpO1xuICAgICAgcGF0Y2goXG4gICAgICAgIGluc3RhbmNlMi52bm9kZSxcbiAgICAgICAgdm5vZGUsXG4gICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgYW5jaG9yLFxuICAgICAgICBpbnN0YW5jZTIsXG4gICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgIHZub2RlLnNsb3RTY29wZUlkcyxcbiAgICAgICAgb3B0aW1pemVkXG4gICAgICApO1xuICAgICAgcXVldWVQb3N0UmVuZGVyRWZmZWN0KCgpID0+IHtcbiAgICAgICAgaW5zdGFuY2UyLmlzRGVhY3RpdmF0ZWQgPSBmYWxzZTtcbiAgICAgICAgaWYgKGluc3RhbmNlMi5hKSB7XG4gICAgICAgICAgaW52b2tlQXJyYXlGbnMoaW5zdGFuY2UyLmEpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZub2RlSG9vayA9IHZub2RlLnByb3BzICYmIHZub2RlLnByb3BzLm9uVm5vZGVNb3VudGVkO1xuICAgICAgICBpZiAodm5vZGVIb29rKSB7XG4gICAgICAgICAgaW52b2tlVk5vZGVIb29rKHZub2RlSG9vaywgaW5zdGFuY2UyLnBhcmVudCwgdm5vZGUpO1xuICAgICAgICB9XG4gICAgICB9LCBwYXJlbnRTdXNwZW5zZSk7XG4gICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCBfX1ZVRV9QUk9EX0RFVlRPT0xTX18pIHtcbiAgICAgICAgZGV2dG9vbHNDb21wb25lbnRBZGRlZChpbnN0YW5jZTIpO1xuICAgICAgfVxuICAgIH07XG4gICAgc2hhcmVkQ29udGV4dC5kZWFjdGl2YXRlID0gKHZub2RlKSA9PiB7XG4gICAgICBjb25zdCBpbnN0YW5jZTIgPSB2bm9kZS5jb21wb25lbnQ7XG4gICAgICBpbnZhbGlkYXRlTW91bnQoaW5zdGFuY2UyLm0pO1xuICAgICAgaW52YWxpZGF0ZU1vdW50KGluc3RhbmNlMi5hKTtcbiAgICAgIG1vdmUodm5vZGUsIHN0b3JhZ2VDb250YWluZXIsIG51bGwsIDEsIHBhcmVudFN1c3BlbnNlKTtcbiAgICAgIHF1ZXVlUG9zdFJlbmRlckVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGlmIChpbnN0YW5jZTIuZGEpIHtcbiAgICAgICAgICBpbnZva2VBcnJheUZucyhpbnN0YW5jZTIuZGEpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZub2RlSG9vayA9IHZub2RlLnByb3BzICYmIHZub2RlLnByb3BzLm9uVm5vZGVVbm1vdW50ZWQ7XG4gICAgICAgIGlmICh2bm9kZUhvb2spIHtcbiAgICAgICAgICBpbnZva2VWTm9kZUhvb2sodm5vZGVIb29rLCBpbnN0YW5jZTIucGFyZW50LCB2bm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgaW5zdGFuY2UyLmlzRGVhY3RpdmF0ZWQgPSB0cnVlO1xuICAgICAgfSwgcGFyZW50U3VzcGVuc2UpO1xuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgX19WVUVfUFJPRF9ERVZUT09MU19fKSB7XG4gICAgICAgIGRldnRvb2xzQ29tcG9uZW50QWRkZWQoaW5zdGFuY2UyKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGZ1bmN0aW9uIHVubW91bnQodm5vZGUpIHtcbiAgICAgIHJlc2V0U2hhcGVGbGFnKHZub2RlKTtcbiAgICAgIF91bm1vdW50KHZub2RlLCBpbnN0YW5jZSwgcGFyZW50U3VzcGVuc2UsIHRydWUpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBwcnVuZUNhY2hlKGZpbHRlcikge1xuICAgICAgY2FjaGUuZm9yRWFjaCgodm5vZGUsIGtleSkgPT4ge1xuICAgICAgICBjb25zdCBuYW1lID0gZ2V0Q29tcG9uZW50TmFtZSh2bm9kZS50eXBlKTtcbiAgICAgICAgaWYgKG5hbWUgJiYgKCFmaWx0ZXIgfHwgIWZpbHRlcihuYW1lKSkpIHtcbiAgICAgICAgICBwcnVuZUNhY2hlRW50cnkoa2V5KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHBydW5lQ2FjaGVFbnRyeShrZXkpIHtcbiAgICAgIGNvbnN0IGNhY2hlZCA9IGNhY2hlLmdldChrZXkpO1xuICAgICAgaWYgKCFjdXJyZW50IHx8ICFpc1NhbWVWTm9kZVR5cGUoY2FjaGVkLCBjdXJyZW50KSkge1xuICAgICAgICB1bm1vdW50KGNhY2hlZCk7XG4gICAgICB9IGVsc2UgaWYgKGN1cnJlbnQpIHtcbiAgICAgICAgcmVzZXRTaGFwZUZsYWcoY3VycmVudCk7XG4gICAgICB9XG4gICAgICBjYWNoZS5kZWxldGUoa2V5KTtcbiAgICAgIGtleXMuZGVsZXRlKGtleSk7XG4gICAgfVxuICAgIHdhdGNoKFxuICAgICAgKCkgPT4gW3Byb3BzLmluY2x1ZGUsIHByb3BzLmV4Y2x1ZGVdLFxuICAgICAgKFtpbmNsdWRlLCBleGNsdWRlXSkgPT4ge1xuICAgICAgICBpbmNsdWRlICYmIHBydW5lQ2FjaGUoKG5hbWUpID0+IG1hdGNoZXMoaW5jbHVkZSwgbmFtZSkpO1xuICAgICAgICBleGNsdWRlICYmIHBydW5lQ2FjaGUoKG5hbWUpID0+ICFtYXRjaGVzKGV4Y2x1ZGUsIG5hbW
20578UpKTtcbiAgICAgIH0sXG4gICAgICAvLyBwcnVuZSBwb3N0LXJlbmRlciBhZnRlciBgY3VycmVudGAgaGFzIGJlZW4gdXBkYXRlZFxuICAgICAgeyBmbHVzaDogXCJwb3N0XCIsIGRlZXA6IHRydWUgfVxuICAgICk7XG4gICAgbGV0IHBlbmRpbmdDYWNoZUtleSA9IG51bGw7XG4gICAgY29uc3QgY2FjaGVTdWJ0cmVlID0gKCkgPT4ge1xuICAgICAgaWYgKHBlbmRpbmdDYWNoZUtleSAhPSBudWxsKSB7XG4gICAgICAgIGlmIChpc1N1c3BlbnNlKGluc3RhbmNlLnN1YlRyZWUudHlwZSkpIHtcbiAgICAgICAgICBxdWV1ZVBvc3RSZW5kZXJFZmZlY3QoKCkgPT4ge1xuICAgICAgICAgICAgY2FjaGUuc2V0KHBlbmRpbmdDYWNoZUtleSwgZ2V0SW5uZXJDaGlsZChpbnN0YW5jZS5zdWJUcmVlKSk7XG4gICAgICAgICAgfSwgaW5zdGFuY2Uuc3ViVHJlZS5zdXNwZW5zZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2FjaGUuc2V0KHBlbmRpbmdDYWNoZUtleSwgZ2V0SW5uZXJDaGlsZChpbnN0YW5jZS5zdWJUcmVlKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIG9uTW91bnRlZChjYWNoZVN1YnRyZWUpO1xuICAgIG9uVXBkYXRlZChjYWNoZVN1YnRyZWUpO1xuICAgIG9uQmVmb3JlVW5tb3VudCgoKSA9PiB7XG4gICAgICBjYWNoZS5mb3JFYWNoKChjYWNoZWQpID0+IHtcbiAgICAgICAgY29uc3QgeyBzdWJUcmVlLCBzdXNwZW5zZSB9ID0gaW5zdGFuY2U7XG4gICAgICAgIGNvbnN0IHZub2RlID0gZ2V0SW5uZXJDaGlsZChzdWJUcmVlKTtcbiAgICAgICAgaWYgKGNhY2hlZC50eXBlID09PSB2bm9kZS50eXBlICYmIGNhY2hlZC5rZXkgPT09IHZub2RlLmtleSkge1xuICAgICAgICAgIHJlc2V0U2hhcGVGbGFnKHZub2RlKTtcbiAgICAgICAgICBjb25zdCBkYSA9IHZub2RlLmNvbXBvbmVudC5kYTtcbiAgICAgICAgICBkYSAmJiBxdWV1ZVBvc3RSZW5kZXJFZmZlY3QoZGEsIHN1c3BlbnNlKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdW5tb3VudChjYWNoZWQpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHBlbmRpbmdDYWNoZUtleSA9IG51bGw7XG4gICAgICBpZiAoIXNsb3RzLmRlZmF1bHQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBjb25zdCBjaGlsZHJlbiA9IHNsb3RzLmRlZmF1bHQoKTtcbiAgICAgIGNvbnN0IHJhd1ZOb2RlID0gY2hpbGRyZW5bMF07XG4gICAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoID4gMSkge1xuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgIHdhcm4kMShgS2VlcEFsaXZlIHNob3VsZCBjb250YWluIGV4YWN0bHkgb25lIGNvbXBvbmVudCBjaGlsZC5gKTtcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50ID0gbnVsbDtcbiAgICAgICAgcmV0dXJuIGNoaWxkcmVuO1xuICAgICAgfSBlbHNlIGlmICghaXNWTm9kZShyYXdWTm9kZSkgfHwgIShyYXdWTm9kZS5zaGFwZUZsYWcgJiA0KSAmJiAhKHJhd1ZOb2RlLnNoYXBlRmxhZyAmIDEyOCkpIHtcbiAgICAgICAgY3VycmVudCA9IG51bGw7XG4gICAgICAgIHJldHVybiByYXdWTm9kZTtcbiAgICAgIH1cbiAgICAgIGxldCB2bm9kZSA9IGdldElubmVyQ2hpbGQocmF3Vk5vZGUpO1xuICAgICAgY29uc3QgY29tcCA9IHZub2RlLnR5cGU7XG4gICAgICBjb25zdCBuYW1lID0gZ2V0Q29tcG9uZW50TmFtZShcbiAgICAgICAgaXNBc3luY1dyYXBwZXIodm5vZGUpID8gdm5vZGUudHlwZS5fX2FzeW5jUmVzb2x2ZWQgfHwge30gOiBjb21wXG4gICAgICApO1xuICAgICAgY29uc3QgeyBpbmNsdWRlLCBleGNsdWRlLCBtYXggfSA9IHByb3BzO1xuICAgICAgaWYgKGluY2x1ZGUgJiYgKCFuYW1lIHx8ICFtYXRjaGVzKGluY2x1ZGUsIG5hbWUpKSB8fCBleGNsdWRlICYmIG5hbWUgJiYgbWF0Y2hlcyhleGNsdWRlLCBuYW1lKSkge1xuICAgICAgICBjdXJyZW50ID0gdm5vZGU7XG4gICAgICAgIHJldHVybiByYXdWTm9kZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGtleSA9IHZub2RlLmtleSA9PSBudWxsID8gY29tcCA6IHZub2RlLmtleTtcbiAgICAgIGNvbnN0IGNhY2hlZFZOb2RlID0gY2FjaGUuZ2V0KGtleSk7XG4gICAgICBpZiAodm5vZGUuZWwpIHtcbiAgICAgICAgdm5vZGUgPSBjbG9uZVZOb2RlKHZub2RlKTtcbiAgICAgICAgaWYgKHJhd1ZOb2RlLnNoYXBlRmxhZyAmIDEyOCkge1xuICAgICAgICAgIHJhd1ZOb2RlLnNzQ29udGVudCA9IHZub2RlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBwZW5kaW5nQ2FjaGVLZXkgPSBrZXk7XG4gICAgICBpZiAoY2FjaGVkVk5vZGUpIHtcbiAgICAgICAgdm5vZGUuZWwgPSBjYWNoZWRWTm9kZS5lbDtcbiAgICAgICAgdm5vZGUuY29tcG9uZW50ID0gY2FjaGVkVk5vZGUuY29tcG9uZW50O1xuICAgICAgICBpZiAodm5vZGUudHJhbnNpdGlvbikge1xuICAgICAgICAgIHNldFRyYW5zaXRpb25Ib29rcyh2bm9kZSwgdm5vZGUudHJhbnNpdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgdm5vZGUuc2hhcGVGbGFnIHw9IDUxMjtcbiAgICAgICAga2V5cy5kZWxldGUoa2V5KTtcbiAgICAgICAga2V5cy5hZGQoa2V5KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGtleXMuYWRkKGtleSk7XG4gICAgICAgIGlmIChtYXggJiYga2V5cy5zaXplID4gcGFyc2VJbnQobWF4LCAxMCkpIHtcbiAgICAgICAgICBwcnVuZUNhY2hlRW50cnkoa2V5cy52YWx1ZXMoKS5uZXh0KCkudmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB2bm9kZS5zaGFwZUZsYWcgfD0gMjU2O1xuICAgICAgY3VycmVudCA9IHZub2RlO1xuICAgICAgcmV0dXJuIGlzU3VzcGVuc2UocmF3Vk5vZGUudHlwZSkgPyByYXdWTm9kZSA6IHZub2RlO1xuICAgIH07XG4gIH1cbn07XG5jb25zdCBLZWVwQWxpdmUgPSBLZWVwQWxpdmVJbXBsO1xuZnVuY3Rpb24gbWF0Y2hlcyhwYXR0ZXJuLCBuYW1lKSB7XG4gIGlmIChpc0FycmF5KHBhdHRlcm4pKSB7XG4gICAgcmV0dXJuIHBhdHRlcm4uc29tZSgocCkgPT4gbWF0Y2hlcyhwLCBuYW1lKSk7XG4gIH0gZWxzZSBpZiAoaXNTdHJpbmcocGF0dGVybikpIHtcbiAgICByZXR1cm4gcGF0dGVybi5zcGxpdChcIixcIikuaW5jbHVkZXMobmFtZSk7XG4gIH0gZWxzZSBpZiAoaXNSZWdFeHAocGF0dGVybikpIHtcbiAgICByZXR1cm4gcGF0dGVybi50ZXN0KG5hbWUpO1xuICB9XG4gI
20578HJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIG9uQWN0aXZhdGVkKGhvb2ssIHRhcmdldCkge1xuICByZWdpc3RlcktlZXBBbGl2ZUhvb2soaG9vaywgXCJhXCIsIHRhcmdldCk7XG59XG5mdW5jdGlvbiBvbkRlYWN0aXZhdGVkKGhvb2ssIHRhcmdldCkge1xuICByZWdpc3RlcktlZXBBbGl2ZUhvb2soaG9vaywgXCJkYVwiLCB0YXJnZXQpO1xufVxuZnVuY3Rpb24gcmVnaXN0ZXJLZWVwQWxpdmVIb29rKGhvb2ssIHR5cGUsIHRhcmdldCA9IGN1cnJlbnRJbnN0YW5jZSkge1xuICBjb25zdCB3cmFwcGVkSG9vayA9IGhvb2suX193ZGMgfHwgKGhvb2suX193ZGMgPSAoKSA9PiB7XG4gICAgbGV0IGN1cnJlbnQgPSB0YXJnZXQ7XG4gICAgd2hpbGUgKGN1cnJlbnQpIHtcbiAgICAgIGlmIChjdXJyZW50LmlzRGVhY3RpdmF0ZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY3VycmVudCA9IGN1cnJlbnQucGFyZW50O1xuICAgIH1cbiAgICByZXR1cm4gaG9vaygpO1xuICB9KTtcbiAgaW5qZWN0SG9vayh0eXBlLCB3cmFwcGVkSG9vaywgdGFyZ2V0KTtcbiAgaWYgKHRhcmdldCkge1xuICAgIGxldCBjdXJyZW50ID0gdGFyZ2V0LnBhcmVudDtcbiAgICB3aGlsZSAoY3VycmVudCAmJiBjdXJyZW50LnBhcmVudCkge1xuICAgICAgaWYgKGlzS2VlcEFsaXZlKGN1cnJlbnQucGFyZW50LnZub2RlKSkge1xuICAgICAgICBpbmplY3RUb0tlZXBBbGl2ZVJvb3Qod3JhcHBlZEhvb2ssIHR5cGUsIHRhcmdldCwgY3VycmVudCk7XG4gICAgICB9XG4gICAgICBjdXJyZW50ID0gY3VycmVudC5wYXJlbnQ7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBpbmplY3RUb0tlZXBBbGl2ZVJvb3QoaG9vaywgdHlwZSwgdGFyZ2V0LCBrZWVwQWxpdmVSb290KSB7XG4gIGNvbnN0IGluamVjdGVkID0gaW5qZWN0SG9vayhcbiAgICB0eXBlLFxuICAgIGhvb2ssXG4gICAga2VlcEFsaXZlUm9vdCxcbiAgICB0cnVlXG4gICAgLyogcHJlcGVuZCAqL1xuICApO1xuICBvblVubW91bnRlZCgoKSA9PiB7XG4gICAgcmVtb3ZlKGtlZXBBbGl2ZVJvb3RbdHlwZV0sIGluamVjdGVkKTtcbiAgfSwgdGFyZ2V0KTtcbn1cbmZ1bmN0aW9uIHJlc2V0U2hhcGVGbGFnKHZub2RlKSB7XG4gIHZub2RlLnNoYXBlRmxhZyAmPSB+MjU2O1xuICB2bm9kZS5zaGFwZUZsYWcgJj0gfjUxMjtcbn1cbmZ1bmN0aW9uIGdldElubmVyQ2hpbGQodm5vZGUpIHtcbiAgcmV0dXJuIHZub2RlLnNoYXBlRmxhZyAmIDEyOCA/IHZub2RlLnNzQ29udGVudCA6IHZub2RlO1xufVxuXG5mdW5jdGlvbiBpbmplY3RIb29rKHR5cGUsIGhvb2ssIHRhcmdldCA9IGN1cnJlbnRJbnN0YW5jZSwgcHJlcGVuZCA9IGZhbHNlKSB7XG4gIGlmICh0YXJnZXQpIHtcbiAgICBjb25zdCBob29rcyA9IHRhcmdldFt0eXBlXSB8fCAodGFyZ2V0W3R5cGVdID0gW10pO1xuICAgIGNvbnN0IHdyYXBwZWRIb29rID0gaG9vay5fX3dlaCB8fCAoaG9vay5fX3dlaCA9ICguLi5hcmdzKSA9PiB7XG4gICAgICBwYXVzZVRyYWNraW5nKCk7XG4gICAgICBjb25zdCByZXNldCA9IHNldEN1cnJlbnRJbnN0YW5jZSh0YXJnZXQpO1xuICAgICAgY29uc3QgcmVzID0gY2FsbFdpdGhBc3luY0Vycm9ySGFuZGxpbmcoaG9vaywgdGFyZ2V0LCB0eXBlLCBhcmdzKTtcbiAgICAgIHJlc2V0KCk7XG4gICAgICByZXNldFRyYWNraW5nKCk7XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH0pO1xuICAgIGlmIChwcmVwZW5kKSB7XG4gICAgICBob29rcy51bnNoaWZ0KHdyYXBwZWRIb29rKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaG9va3MucHVzaCh3cmFwcGVkSG9vayk7XG4gICAgfVxuICAgIHJldHVybiB3cmFwcGVkSG9vaztcbiAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgY29uc3QgYXBpTmFtZSA9IHRvSGFuZGxlcktleShFcnJvclR5cGVTdHJpbmdzJDFbdHlwZV0ucmVwbGFjZSgvIGhvb2skLywgXCJcIikpO1xuICAgIHdhcm4kMShcbiAgICAgIGAke2FwaU5hbWV9IGlzIGNhbGxlZCB3aGVuIHRoZXJlIGlzIG5vIGFjdGl2ZSBjb21wb25lbnQgaW5zdGFuY2UgdG8gYmUgYXNzb2NpYXRlZCB3aXRoLiBMaWZlY3ljbGUgaW5qZWN0aW9uIEFQSXMgY2FuIG9ubHkgYmUgdXNlZCBkdXJpbmcgZXhlY3V0aW9uIG9mIHNldHVwKCkuYCArIChgIElmIHlvdSBhcmUgdXNpbmcgYXN5bmMgc2V0dXAoKSwgbWFrZSBzdXJlIHRvIHJlZ2lzdGVyIGxpZmVjeWNsZSBob29rcyBiZWZvcmUgdGhlIGZpcnN0IGF3YWl0IHN0YXRlbWVudC5gIClcbiAgICApO1xuICB9XG59XG5jb25zdCBjcmVhdGVIb29rID0gKGxpZmVjeWNsZSkgPT4gKGhvb2ssIHRhcmdldCA9IGN1cnJlbnRJbnN0YW5jZSkgPT4ge1xuICBpZiAoIWlzSW5TU1JDb21wb25lbnRTZXR1cCB8fCBsaWZlY3ljbGUgPT09IFwic3BcIikge1xuICAgIGluamVjdEhvb2sobGlmZWN5Y2xlLCAoLi4uYXJncykgPT4gaG9vayguLi5hcmdzKSwgdGFyZ2V0KTtcbiAgfVxufTtcbmNvbnN0IG9uQmVmb3JlTW91bnQgPSBjcmVhdGVIb29rKFwiYm1cIik7XG5jb25zdCBvbk1vdW50ZWQgPSBjcmVhdGVIb29rKFwibVwiKTtcbmNvbnN0IG9uQmVmb3JlVXBkYXRlID0gY3JlYXRlSG9vayhcImJ1XCIpO1xuY29uc3Qgb25VcGRhdGVkID0gY3JlYXRlSG9vayhcInVcIik7XG5jb25zdCBvbkJlZm9yZVVubW91bnQgPSBjcmVhdGVIb29rKFwiYnVtXCIpO1xuY29uc3Qgb25Vbm1vdW50ZWQgPSBjcmVhdGVIb29rKFwidW1cIik7XG5jb25zdCBvblNlcnZlclByZWZldGNoID0gY3JlYXRlSG9vayhcInNwXCIpO1xuY29uc3Qgb25SZW5kZXJUcmlnZ2VyZWQgPSBjcmVhdGVIb29rKFxuICBcInJ0Z1wiXG4pO1xuY29uc3Qgb25SZW5kZXJUcmFja2VkID0gY3JlYXRlSG9vayhcbiAgXCJydGNcIlxuKTtcbmZ1bmN0aW9uIG9uRXJyb3JDYXB0dXJlZChob29rLCB0YXJnZXQgPSBjdXJyZW50SW5zdGFuY2UpIHtcbiAgaW5qZWN0SG9vayhcImVjXCIsIGhvb2ssIHRhcmdldCk7XG59XG5cbmNvbnN0IENPTVBPTkVOVFMgPSBcImNvbXBvbmVudHNcIjtcbmNvbnN0IERJUkVDVElWRVMgPSBcImRpcmVjdGl2ZXNcIjtcbmZ1bmN0aW9uIHJlc29sdmVDb21wb25lbnQobmFtZSwgbWF5YmVTZWxmUmVmZXJlbmNlKSB7XG4gIHJldHVybi
20578ByZXNvbHZlQXNzZXQoQ09NUE9ORU5UUywgbmFtZSwgdHJ1ZSwgbWF5YmVTZWxmUmVmZXJlbmNlKSB8fCBuYW1lO1xufVxuY29uc3QgTlVMTF9EWU5BTUlDX0NPTVBPTkVOVCA9IFN5bWJvbC5mb3IoXCJ2LW5kY1wiKTtcbmZ1bmN0aW9uIHJlc29sdmVEeW5hbWljQ29tcG9uZW50KGNvbXBvbmVudCkge1xuICBpZiAoaXNTdHJpbmcoY29tcG9uZW50KSkge1xuICAgIHJldHVybiByZXNvbHZlQXNzZXQoQ09NUE9ORU5UUywgY29tcG9uZW50LCBmYWxzZSkgfHwgY29tcG9uZW50O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBjb21wb25lbnQgfHwgTlVMTF9EWU5BTUlDX0NPTVBPTkVOVDtcbiAgfVxufVxuZnVuY3Rpb24gcmVzb2x2ZURpcmVjdGl2ZShuYW1lKSB7XG4gIHJldHVybiByZXNvbHZlQXNzZXQoRElSRUNUSVZFUywgbmFtZSk7XG59XG5mdW5jdGlvbiByZXNvbHZlQXNzZXQodHlwZSwgbmFtZSwgd2Fybk1pc3NpbmcgPSB0cnVlLCBtYXliZVNlbGZSZWZlcmVuY2UgPSBmYWxzZSkge1xuICBjb25zdCBpbnN0YW5jZSA9IGN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZSB8fCBjdXJyZW50SW5zdGFuY2U7XG4gIGlmIChpbnN0YW5jZSkge1xuICAgIGNvbnN0IENvbXBvbmVudCA9IGluc3RhbmNlLnR5cGU7XG4gICAgaWYgKHR5cGUgPT09IENPTVBPTkVOVFMpIHtcbiAgICAgIGNvbnN0IHNlbGZOYW1lID0gZ2V0Q29tcG9uZW50TmFtZShcbiAgICAgICAgQ29tcG9uZW50LFxuICAgICAgICBmYWxzZVxuICAgICAgKTtcbiAgICAgIGlmIChzZWxmTmFtZSAmJiAoc2VsZk5hbWUgPT09IG5hbWUgfHwgc2VsZk5hbWUgPT09IGNhbWVsaXplKG5hbWUpIHx8IHNlbGZOYW1lID09PSBjYXBpdGFsaXplKGNhbWVsaXplKG5hbWUpKSkpIHtcbiAgICAgICAgcmV0dXJuIENvbXBvbmVudDtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcmVzID0gKFxuICAgICAgLy8gbG9jYWwgcmVnaXN0cmF0aW9uXG4gICAgICAvLyBjaGVjayBpbnN0YW5jZVt0eXBlXSBmaXJzdCB3aGljaCBpcyByZXNvbHZlZCBmb3Igb3B0aW9ucyBBUElcbiAgICAgIHJlc29sdmUoaW5zdGFuY2VbdHlwZV0gfHwgQ29tcG9uZW50W3R5cGVdLCBuYW1lKSB8fCAvLyBnbG9iYWwgcmVnaXN0cmF0aW9uXG4gICAgICByZXNvbHZlKGluc3RhbmNlLmFwcENvbnRleHRbdHlwZV0sIG5hbWUpXG4gICAgKTtcbiAgICBpZiAoIXJlcyAmJiBtYXliZVNlbGZSZWZlcmVuY2UpIHtcbiAgICAgIHJldHVybiBDb21wb25lbnQ7XG4gICAgfVxuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHdhcm5NaXNzaW5nICYmICFyZXMpIHtcbiAgICAgIGNvbnN0IGV4dHJhID0gdHlwZSA9PT0gQ09NUE9ORU5UUyA/IGBcbklmIHRoaXMgaXMgYSBuYXRpdmUgY3VzdG9tIGVsZW1lbnQsIG1ha2Ugc3VyZSB0byBleGNsdWRlIGl0IGZyb20gY29tcG9uZW50IHJlc29sdXRpb24gdmlhIGNvbXBpbGVyT3B0aW9ucy5pc0N1c3RvbUVsZW1lbnQuYCA6IGBgO1xuICAgICAgd2FybiQxKGBGYWlsZWQgdG8gcmVzb2x2ZSAke3R5cGUuc2xpY2UoMCwgLTEpfTogJHtuYW1lfSR7ZXh0cmF9YCk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIHdhcm4kMShcbiAgICAgIGByZXNvbHZlJHtjYXBpdGFsaXplKHR5cGUuc2xpY2UoMCwgLTEpKX0gY2FuIG9ubHkgYmUgdXNlZCBpbiByZW5kZXIoKSBvciBzZXR1cCgpLmBcbiAgICApO1xuICB9XG59XG5mdW5jdGlvbiByZXNvbHZlKHJlZ2lzdHJ5LCBuYW1lKSB7XG4gIHJldHVybiByZWdpc3RyeSAmJiAocmVnaXN0cnlbbmFtZV0gfHwgcmVnaXN0cnlbY2FtZWxpemUobmFtZSldIHx8IHJlZ2lzdHJ5W2NhcGl0YWxpemUoY2FtZWxpemUobmFtZSkpXSk7XG59XG5cbmZ1bmN0aW9uIHJlbmRlckxpc3Qoc291cmNlLCByZW5kZXJJdGVtLCBjYWNoZSwgaW5kZXgpIHtcbiAgbGV0IHJldDtcbiAgY29uc3QgY2FjaGVkID0gY2FjaGUgJiYgY2FjaGVbaW5kZXhdO1xuICBpZiAoaXNBcnJheShzb3VyY2UpIHx8IGlzU3RyaW5nKHNvdXJjZSkpIHtcbiAgICByZXQgPSBuZXcgQXJyYXkoc291cmNlLmxlbmd0aCk7XG4gICAgZm9yIChsZXQgaSA9IDAsIGwgPSBzb3VyY2UubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICByZXRbaV0gPSByZW5kZXJJdGVtKHNvdXJjZVtpXSwgaSwgdm9pZCAwLCBjYWNoZWQgJiYgY2FjaGVkW2ldKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAodHlwZW9mIHNvdXJjZSA9PT0gXCJudW1iZXJcIikge1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmICFOdW1iZXIuaXNJbnRlZ2VyKHNvdXJjZSkpIHtcbiAgICAgIHdhcm4kMShgVGhlIHYtZm9yIHJhbmdlIGV4cGVjdCBhbiBpbnRlZ2VyIHZhbHVlIGJ1dCBnb3QgJHtzb3VyY2V9LmApO1xuICAgIH1cbiAgICByZXQgPSBuZXcgQXJyYXkoc291cmNlKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNvdXJjZTsgaSsrKSB7XG4gICAgICByZXRbaV0gPSByZW5kZXJJdGVtKGkgKyAxLCBpLCB2b2lkIDAsIGNhY2hlZCAmJiBjYWNoZWRbaV0pO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc09iamVjdChzb3VyY2UpKSB7XG4gICAgaWYgKHNvdXJjZVtTeW1ib2wuaXRlcmF0b3JdKSB7XG4gICAgICByZXQgPSBBcnJheS5mcm9tKFxuICAgICAgICBzb3VyY2UsXG4gICAgICAgIChpdGVtLCBpKSA9PiByZW5kZXJJdGVtKGl0ZW0sIGksIHZvaWQgMCwgY2FjaGVkICYmIGNhY2hlZFtpXSlcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpO1xuICAgICAgcmV0ID0gbmV3IEFycmF5KGtleXMubGVuZ3RoKTtcbiAgICAgIGZvciAobGV0IGkgPSAwLCBsID0ga2V5cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgY29uc3Qga2V5ID0ga2V5c1tpXTtcbiAgICAgICAgcmV0W2ldID0gcmVuZGVySXRlbShzb3VyY2Vba2V5XSwga2V5LCBpLCBjYWNoZWQgJiYgY2FjaGVkW2ldKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcmV0ID0gW107XG4gIH1cbiAgaWYgKGNhY2hlKSB7XG4gICAgY2FjaGVbaW5kZXhdID0gcmV0O1xuICB9XG4gI
20578HJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVNsb3RzKHNsb3RzLCBkeW5hbWljU2xvdHMpIHtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBkeW5hbWljU2xvdHMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBzbG90ID0gZHluYW1pY1Nsb3RzW2ldO1xuICAgIGlmIChpc0FycmF5KHNsb3QpKSB7XG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHNsb3QubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgc2xvdHNbc2xvdFtqXS5uYW1lXSA9IHNsb3Rbal0uZm47XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChzbG90KSB7XG4gICAgICBzbG90c1tzbG90Lm5hbWVdID0gc2xvdC5rZXkgPyAoLi4uYXJncykgPT4ge1xuICAgICAgICBjb25zdCByZXMgPSBzbG90LmZuKC4uLmFyZ3MpO1xuICAgICAgICBpZiAocmVzKSByZXMua2V5ID0gc2xvdC5rZXk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9IDogc2xvdC5mbjtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHNsb3RzO1xufVxuXG5mdW5jdGlvbiByZW5kZXJTbG90KHNsb3RzLCBuYW1lLCBwcm9wcyA9IHt9LCBmYWxsYmFjaywgbm9TbG90dGVkKSB7XG4gIGlmIChjdXJyZW50UmVuZGVyaW5nSW5zdGFuY2UuaXNDRSB8fCBjdXJyZW50UmVuZGVyaW5nSW5zdGFuY2UucGFyZW50ICYmIGlzQXN5bmNXcmFwcGVyKGN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZS5wYXJlbnQpICYmIGN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZS5wYXJlbnQuaXNDRSkge1xuICAgIGlmIChuYW1lICE9PSBcImRlZmF1bHRcIikgcHJvcHMubmFtZSA9IG5hbWU7XG4gICAgcmV0dXJuIGNyZWF0ZVZOb2RlKFwic2xvdFwiLCBwcm9wcywgZmFsbGJhY2sgJiYgZmFsbGJhY2soKSk7XG4gIH1cbiAgbGV0IHNsb3QgPSBzbG90c1tuYW1lXTtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgc2xvdCAmJiBzbG90Lmxlbmd0aCA+IDEpIHtcbiAgICB3YXJuJDEoXG4gICAgICBgU1NSLW9wdGltaXplZCBzbG90IGZ1bmN0aW9uIGRldGVjdGVkIGluIGEgbm9uLVNTUi1vcHRpbWl6ZWQgcmVuZGVyIGZ1bmN0aW9uLiBZb3UgbmVlZCB0byBtYXJrIHRoaXMgY29tcG9uZW50IHdpdGggJGR5bmFtaWMtc2xvdHMgaW4gdGhlIHBhcmVudCB0ZW1wbGF0ZS5gXG4gICAgKTtcbiAgICBzbG90ID0gKCkgPT4gW107XG4gIH1cbiAgaWYgKHNsb3QgJiYgc2xvdC5fYykge1xuICAgIHNsb3QuX2QgPSBmYWxzZTtcbiAgfVxuICBvcGVuQmxvY2soKTtcbiAgY29uc3QgdmFsaWRTbG90Q29udGVudCA9IHNsb3QgJiYgZW5zdXJlVmFsaWRWTm9kZShzbG90KHByb3BzKSk7XG4gIGNvbnN0IHJlbmRlcmVkID0gY3JlYXRlQmxvY2soXG4gICAgRnJhZ21lbnQsXG4gICAge1xuICAgICAga2V5OiAocHJvcHMua2V5IHx8IC8vIHNsb3QgY29udGVudCBhcnJheSBvZiBhIGR5bmFtaWMgY29uZGl0aW9uYWwgc2xvdCBtYXkgaGF2ZSBhIGJyYW5jaFxuICAgICAgLy8ga2V5IGF0dGFjaGVkIGluIHRoZSBgY3JlYXRlU2xvdHNgIGhlbHBlciwgcmVzcGVjdCB0aGF0XG4gICAgICB2YWxpZFNsb3RDb250ZW50ICYmIHZhbGlkU2xvdENvbnRlbnQua2V5IHx8IGBfJHtuYW1lfWApICsgLy8gIzcyNTYgZm9yY2UgZGlmZmVyZW50aWF0ZSBmYWxsYmFjayBjb250ZW50IGZyb20gYWN0dWFsIGNvbnRlbnRcbiAgICAgICghdmFsaWRTbG90Q29udGVudCAmJiBmYWxsYmFjayA/IFwiX2ZiXCIgOiBcIlwiKVxuICAgIH0sXG4gICAgdmFsaWRTbG90Q29udGVudCB8fCAoZmFsbGJhY2sgPyBmYWxsYmFjaygpIDogW10pLFxuICAgIHZhbGlkU2xvdENvbnRlbnQgJiYgc2xvdHMuXyA9PT0gMSA/IDY0IDogLTJcbiAgKTtcbiAgaWYgKCFub1Nsb3R0ZWQgJiYgcmVuZGVyZWQuc2NvcGVJZCkge1xuICAgIHJlbmRlcmVkLnNsb3RTY29wZUlkcyA9IFtyZW5kZXJlZC5zY29wZUlkICsgXCItc1wiXTtcbiAgfVxuICBpZiAoc2xvdCAmJiBzbG90Ll9jKSB7XG4gICAgc2xvdC5fZCA9IHRydWU7XG4gIH1cbiAgcmV0dXJuIHJlbmRlcmVkO1xufVxuZnVuY3Rpb24gZW5zdXJlVmFsaWRWTm9kZSh2bm9kZXMpIHtcbiAgcmV0dXJuIHZub2Rlcy5zb21lKChjaGlsZCkgPT4ge1xuICAgIGlmICghaXNWTm9kZShjaGlsZCkpIHJldHVybiB0cnVlO1xuICAgIGlmIChjaGlsZC50eXBlID09PSBDb21tZW50KSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGNoaWxkLnR5cGUgPT09IEZyYWdtZW50ICYmICFlbnN1cmVWYWxpZFZOb2RlKGNoaWxkLmNoaWxkcmVuKSlcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSkgPyB2bm9kZXMgOiBudWxsO1xufVxuXG5mdW5jdGlvbiB0b0hhbmRsZXJzKG9iaiwgcHJlc2VydmVDYXNlSWZOZWNlc3NhcnkpIHtcbiAgY29uc3QgcmV0ID0ge307XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmICFpc09iamVjdChvYmopKSB7XG4gICAgd2FybiQxKGB2LW9uIHdpdGggbm8gYXJndW1lbnQgZXhwZWN0cyBhbiBvYmplY3QgdmFsdWUuYCk7XG4gICAgcmV0dXJuIHJldDtcbiAgfVxuICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICByZXRbcHJlc2VydmVDYXNlSWZOZWNlc3NhcnkgJiYgL1tBLVpdLy50ZXN0KGtleSkgPyBgb246JHtrZXl9YCA6IHRvSGFuZGxlcktleShrZXkpXSA9IG9ialtrZXldO1xuICB9XG4gIHJldHVybiByZXQ7XG59XG5cbmNvbnN0IGdldFB1YmxpY0luc3RhbmNlID0gKGkpID0+IHtcbiAgaWYgKCFpKSByZXR1cm4gbnVsbDtcbiAgaWYgKGlzU3RhdGVmdWxDb21wb25lbnQoaSkpIHJldHVybiBnZXRDb21wb25lbnRQdWJsaWNJbnN0YW5jZShpKTtcbiAgcmV0dXJuIGdldFB1YmxpY0luc3RhbmNlKGkucGFyZW50KTtcbn07XG5jb25zdCBwdWJsaWNQcm9wZXJ0aWVzTWFwID0gKFxuICAvLyBNb3ZlIFBVUkUgbWFya2VyIHRvIG5ldyBsaW5lIHRvIHdvcmthcm91bmQgY29tcGlsZXIgZGlzY2FyZGluZyBpdFxuICAvLyBkdWUgdG8gdHlwZSBhbm5vdGF0aW9uXG4gIC8qIEBfX1BVUkVfXyAqLyBleHRlbmQoLyogQF9fUFVSRV9fICovIE9iamVjdC5jcmVhdGUobnVsbCksIHtcbiAgICAkOiAoaSkgPT4gaSxcbiAgICAkZWw6IChpKSA9PiBpLnZub2RlLmVsLFxuICAgICRkYXRhOiAoaSkgPT4gaS5kYXRhLFxuICAgICRwcm9wczogKGkpID0+ICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBzaGFsbG93UmVhZG9ubHkoaS5wcm9wcykgOiBpLnByb3BzLFxuICAgICRhdHRyczogKGkpID0+ICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBzaGFsbG93UmVhZG9ubHkoaS5hdHRycykgOiBpLmF0dHJzLFxuICAgICRzbG90czogKGkpID0+ICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBzaGFsbG93UmVhZG9ubHkoaS5zbG90cykgOiBpLnNsb3RzLFxuICAgICRyZWZzOiAoaSkgPT4gISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IHNoYWxsb3dSZWFkb25seShpLnJlZnMpIDogaS5yZWZzLFxuICAgICRwYXJlbnQ6IChpKSA9PiBnZXRQdWJsaWNJbnN0YW5jZShpLnBhcmVudCksXG4gICAgJHJvb3Q6IChpKSA9PiBnZXRQdWJsaWNJbnN0YW5jZShpLnJvb3QpLFxuICAgICRlbWl0OiAoaSkgPT4gaS5lbWl0L
20578FxuICAgICRvcHRpb25zOiAoaSkgPT4gX19WVUVfT1BUSU9OU19BUElfXyA/IHJlc29sdmVNZXJnZWRPcHRpb25zKGkpIDogaS50eXBlLFxuICAgICRmb3JjZVVwZGF0ZTogKGkpID0+IGkuZiB8fCAoaS5mID0gKCkgPT4ge1xuICAgICAgaS5lZmZlY3QuZGlydHkgPSB0cnVlO1xuICAgICAgcXVldWVKb2IoaS51cGRhdGUpO1xuICAgIH0pLFxuICAgICRuZXh0VGljazogKGkpID0+IGkubiB8fCAoaS5uID0gbmV4dFRpY2suYmluZChpLnByb3h5KSksXG4gICAgJHdhdGNoOiAoaSkgPT4gX19WVUVfT1BUSU9OU19BUElfXyA/IGluc3RhbmNlV2F0Y2guYmluZChpKSA6IE5PT1BcbiAgfSlcbik7XG5jb25zdCBpc1Jlc2VydmVkUHJlZml4ID0gKGtleSkgPT4ga2V5ID09PSBcIl9cIiB8fCBrZXkgPT09IFwiJFwiO1xuY29uc3QgaGFzU2V0dXBCaW5kaW5nID0gKHN0YXRlLCBrZXkpID0+IHN0YXRlICE9PSBFTVBUWV9PQkogJiYgIXN0YXRlLl9faXNTY3JpcHRTZXR1cCAmJiBoYXNPd24oc3RhdGUsIGtleSk7XG5jb25zdCBQdWJsaWNJbnN0YW5jZVByb3h5SGFuZGxlcnMgPSB7XG4gIGdldCh7IF86IGluc3RhbmNlIH0sIGtleSkge1xuICAgIGlmIChrZXkgPT09IFwiX192X3NraXBcIikge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNvbnN0IHsgY3R4LCBzZXR1cFN0YXRlLCBkYXRhLCBwcm9wcywgYWNjZXNzQ2FjaGUsIHR5cGUsIGFwcENvbnRleHQgfSA9IGluc3RhbmNlO1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIGtleSA9PT0gXCJfX2lzVnVlXCIpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBsZXQgbm9ybWFsaXplZFByb3BzO1xuICAgIGlmIChrZXlbMF0gIT09IFwiJFwiKSB7XG4gICAgICBjb25zdCBuID0gYWNjZXNzQ2FjaGVba2V5XTtcbiAgICAgIGlmIChuICE9PSB2b2lkIDApIHtcbiAgICAgICAgc3dpdGNoIChuKSB7XG4gICAgICAgICAgY2FzZSAxIC8qIFNFVFVQICovOlxuICAgICAgICAgICAgcmV0dXJuIHNldHVwU3RhdGVba2V5XTtcbiAgICAgICAgICBjYXNlIDIgLyogREFUQSAqLzpcbiAgICAgICAgICAgIHJldHVybiBkYXRhW2tleV07XG4gICAgICAgICAgY2FzZSA0IC8qIENPTlRFWFQgKi86XG4gICAgICAgICAgICByZXR1cm4gY3R4W2tleV07XG4gICAgICAgICAgY2FzZSAzIC8qIFBST1BTICovOlxuICAgICAgICAgICAgcmV0dXJuIHByb3BzW2tleV07XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaGFzU2V0dXBCaW5kaW5nKHNldHVwU3RhdGUsIGtleSkpIHtcbiAgICAgICAgYWNjZXNzQ2FjaGVba2V5XSA9IDEgLyogU0VUVVAgKi87XG4gICAgICAgIHJldHVybiBzZXR1cFN0YXRlW2tleV07XG4gICAgICB9IGVsc2UgaWYgKGRhdGEgIT09IEVNUFRZX09CSiAmJiBoYXNPd24oZGF0YSwga2V5KSkge1xuICAgICAgICBhY2Nlc3NDYWNoZVtrZXldID0gMiAvKiBEQVRBICovO1xuICAgICAgICByZXR1cm4gZGF0YVtrZXldO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgLy8gb25seSBjYWNoZSBvdGhlciBwcm9wZXJ0aWVzIHdoZW4gaW5zdGFuY2UgaGFzIGRlY2xhcmVkICh0aHVzIHN0YWJsZSlcbiAgICAgICAgLy8gcHJvcHNcbiAgICAgICAgKG5vcm1hbGl6ZWRQcm9wcyA9IGluc3RhbmNlLnByb3BzT3B0aW9uc1swXSkgJiYgaGFzT3duKG5vcm1hbGl6ZWRQcm9wcywga2V5KVxuICAgICAgKSB7XG4gICAgICAgIGFjY2Vzc0NhY2hlW2tleV0gPSAzIC8qIFBST1BTICovO1xuICAgICAgICByZXR1cm4gcHJvcHNba2V5XTtcbiAgICAgIH0gZWxzZSBpZiAoY3R4ICE9PSBFTVBUWV9PQkogJiYgaGFzT3duKGN0eCwga2V5KSkge1xuICAgICAgICBhY2Nlc3NDYWNoZVtrZXldID0gNCAvKiBDT05URVhUICovO1xuICAgICAgICByZXR1cm4gY3R4W2tleV07XG4gICAgICB9IGVsc2UgaWYgKCFfX1ZVRV9PUFRJT05TX0FQSV9fIHx8IHNob3VsZENhY2hlQWNjZXNzKSB7XG4gICAgICAgIGFjY2Vzc0NhY2hlW2tleV0gPSAwIC8qIE9USEVSICovO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBwdWJsaWNHZXR0ZXIgPSBwdWJsaWNQcm9wZXJ0aWVzTWFwW2tleV07XG4gICAgbGV0IGNzc01vZHVsZSwgZ2xvYmFsUHJvcGVydGllcztcbiAgICBpZiAocHVibGljR2V0dGVyKSB7XG4gICAgICBpZiAoa2V5ID09PSBcIiRhdHRyc1wiKSB7XG4gICAgICAgIHRyYWNrKGluc3RhbmNlLmF0dHJzLCBcImdldFwiLCBcIlwiKTtcbiAgICAgICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBtYXJrQXR0cnNBY2Nlc3NlZCgpO1xuICAgICAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIGtleSA9PT0gXCIkc2xvdHNcIikge1xuICAgICAgICB0cmFjayhpbnN0YW5jZSwgXCJnZXRcIiwga2V5KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwdWJsaWNHZXR0ZXIoaW5zdGFuY2UpO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICAvLyBjc3MgbW9kdWxlIChpbmplY3RlZCBieSB2dWUtbG9hZGVyKVxuICAgICAgKGNzc01vZHVsZSA9IHR5cGUuX19jc3NNb2R1bGVzKSAmJiAoY3NzTW9kdWxlID0gY3NzTW9kdWxlW2tleV0pXG4gICAgKSB7XG4gICAgICByZXR1cm4gY3NzTW9kdWxlO1xuICAgIH0gZWxzZSBpZiAoY3R4ICE9PSBFTVBUWV9PQkogJiYgaGFzT3duKGN0eCwga2V5KSkge1xuICAgICAgYWNjZXNzQ2FjaGVba2V5XSA9IDQgLyogQ09OVEVYVCAqLztcbiAgICAgIHJldHVybiBjdHhba2V5XTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgLy8gZ2xvYmFsIHByb3BlcnRpZXNcbiAgICAgIGdsb2JhbFByb3BlcnRpZXMgPSBhcHBDb250ZXh0LmNvbmZpZy5nbG9iYWxQcm9wZXJ0aWVzLCBoYXNPd24oZ2xvYmFsUHJvcGVydGllcywga2V5KVxuICAgICkge1xuICAgICAge1xuICAgICAgICByZXR1cm4gZ2xvYmFsUHJvcGVydGllc1trZXldO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBjdXJyZW50UmVuZGVyaW5nSW5zdGFuY2UgJiYgKCFpc1N0cmluZyhrZXkpIHx8IC8vICMxMDkxIGF2b2lkIGludGVybmFsIGlzUmVmL2lzVk5vZGUgY2hlY2tzIG9uIGNvbXBvbmVudCBpbnN0YW5jZSBsZWFkaW5nXG4gICAgLy8gdG8gaW5maW5pdGUgd2FybmluZyBsb29wXG4gICAga2V5LmluZGV4T2YoXCJfX3ZcIikgIT09IDApKSB7XG4gICAgICBpZiAoZGF0YSAhPT0gRU1QVFlfT0JKICYmIGlzUmVzZXJ2ZWRQcmVmaXgoa2V5WzBdKSAmJiBoYXNPd24oZGF0YSwga2V5KSkge1xuICAgICAgICB3YXJuJDEoXG4gICAgICAgICAgYFByb3BlcnR5ICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICBrZXlcbiAgICAgICAgICApfSBtdXN0IGJlIGFjY2Vzc2VkIHZpYSAkZGF0YSBiZWNhdXNlIGl0IHN0YXJ0cyB3aXRoIGEgcmVzZXJ2ZWQgY2hhcmFjdGVyIChcIiRcIiBvciBcIl9cIikgYW5kIGlzIG5vdCBwcm94aWVkIG9uIHRoZSByZW5kZXIgY29udGV4dC5gXG4gICAgICAgICk7XG4gICAgICB9IGVsc2UgaWYgKGluc3RhbmNlID09PSBjdXJyZW50UmVuZGVyaW5nSW5zdGFuY2UpIHtcbiAgICAgICAgd2FybiQxKFxuICAgICAgICAgIGBQcm9wZXJ0eSAke0pTT04uc3RyaW5naWZ5KGtleSl9IHdhcyBhY2Nlc3NlZCBkdXJpbmcgcmVuZGVyIGJ1dCBpcyBub3QgZGVmaW5lZCBvbiBpbnN0YW5jZS5gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBzZXQoeyBfOiBpbnN0YW5jZSB9LCBrZXksIHZhbHVlKSB7XG4gICAgY29uc3QgeyBkYXRhLCBzZXR1cFN0YXRlLCBjdHggfSA9IGluc3RhbmNlO1xuICAgIGlmIChoYXNTZXR1cEJpbmRpbmcoc2V0dXBTdGF0ZSwga2V5KSkge1xuICAgICAgc2V0dXBTdGF0ZVtrZXldID0gdmFsdWU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgc2V0dXBTdGF0ZS5fX2lzU2NyaXB0U2V0dXAgJiYgaGFzT3duKHNldHVwU3RhdGUsIGtleSkpIHtcbiAgICAgIHdhcm4kMShgQ2Fubm90IG11dGF0ZSA8c2NyaXB0IHNldHVwPiBiaW5kaW5nIFwiJHtrZXl9XCIgZnJvbSBPcHRpb25zIEFQSS5gKTtcbiAgICAgIHJldHVybi
20578BmYWxzZTtcbiAgICB9IGVsc2UgaWYgKGRhdGEgIT09IEVNUFRZX09CSiAmJiBoYXNPd24oZGF0YSwga2V5KSkge1xuICAgICAgZGF0YVtrZXldID0gdmFsdWU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKGhhc093bihpbnN0YW5jZS5wcm9wcywga2V5KSkge1xuICAgICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiB3YXJuJDEoYEF0dGVtcHRpbmcgdG8gbXV0YXRlIHByb3AgXCIke2tleX1cIi4gUHJvcHMgYXJlIHJlYWRvbmx5LmApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoa2V5WzBdID09PSBcIiRcIiAmJiBrZXkuc2xpY2UoMSkgaW4gaW5zdGFuY2UpIHtcbiAgICAgICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgd2FybiQxKFxuICAgICAgICBgQXR0ZW1wdGluZyB0byBtdXRhdGUgcHVibGljIHByb3BlcnR5IFwiJHtrZXl9XCIuIFByb3BlcnRpZXMgc3RhcnRpbmcgd2l0aCAkIGFyZSByZXNlcnZlZCBhbmQgcmVhZG9ubHkuYFxuICAgICAgKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYga2V5IGluIGluc3RhbmNlLmFwcENvbnRleHQuY29uZmlnLmdsb2JhbFByb3BlcnRpZXMpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGN0eCwga2V5LCB7XG4gICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgdmFsdWVcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjdHhba2V5XSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcbiAgaGFzKHtcbiAgICBfOiB7IGRhdGEsIHNldHVwU3RhdGUsIGFjY2Vzc0NhY2hlLCBjdHgsIGFwcENvbnRleHQsIHByb3BzT3B0aW9ucyB9XG4gIH0sIGtleSkge1xuICAgIGxldCBub3JtYWxpemVkUHJvcHM7XG4gICAgcmV0dXJuICEhYWNjZXNzQ2FjaGVba2V5XSB8fCBkYXRhICE9PSBFTVBUWV9PQkogJiYgaGFzT3duKGRhdGEsIGtleSkgfHwgaGFzU2V0dXBCaW5kaW5nKHNldHVwU3RhdGUsIGtleSkgfHwgKG5vcm1hbGl6ZWRQcm9wcyA9IHByb3BzT3B0aW9uc1swXSkgJiYgaGFzT3duKG5vcm1hbGl6ZWRQcm9wcywga2V5KSB8fCBoYXNPd24oY3R4LCBrZXkpIHx8IGhhc093bihwdWJsaWNQcm9wZXJ0aWVzTWFwLCBrZXkpIHx8IGhhc093bihhcHBDb250ZXh0LmNvbmZpZy5nbG9iYWxQcm9wZXJ0aWVzLCBrZXkpO1xuICB9LFxuICBkZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgZGVzY3JpcHRvcikge1xuICAgIGlmIChkZXNjcmlwdG9yLmdldCAhPSBudWxsKSB7XG4gICAgICB0YXJnZXQuXy5hY2Nlc3NDYWNoZVtrZXldID0gMDtcbiAgICB9IGVsc2UgaWYgKGhhc093bihkZXNjcmlwdG9yLCBcInZhbHVlXCIpKSB7XG4gICAgICB0aGlzLnNldCh0YXJnZXQsIGtleSwgZGVzY3JpcHRvci
2057852YWx1ZSwgbnVsbCk7XG4gICAgfVxuICAgIHJldHVybiBSZWZsZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBkZXNjcmlwdG9yKTtcbiAgfVxufTtcbmlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHRydWUpIHtcbiAgUHVibGljSW5zdGFuY2VQcm94eUhhbmRsZXJzLm93bktleXMgPSAodGFyZ2V0KSA9PiB7XG4gICAgd2FybiQxKFxuICAgICAgYEF2b2lkIGFwcCBsb2dpYyB0aGF0IHJlbGllcyBvbiBlbnVtZXJhdGluZyBrZXlzIG9uIGEgY29tcG9uZW50IGluc3RhbmNlLiBUaGUga2V5cyB3aWxsIGJlIGVtcHR5IGluIHByb2R1Y3Rpb24gbW9kZSB0byBhdm9pZCBwZXJmb3JtYW5jZSBvdmVyaGVhZC5gXG4gICAgKTtcbiAgICByZXR1cm4gUmVmbGVjdC5vd25LZXlzKHRhcmdldCk7XG4gIH07XG59XG5jb25zdCBSdW50aW1lQ29tcGlsZWRQdWJsaWNJbnN0YW5jZVByb3h5SGFuZGxlcnMgPSAvKiBAX19QVVJFX18gKi8gZXh0ZW5kKFxuICB7fSxcbiAgUHVibGljSW5zdGFuY2VQcm94eUhhbmRsZXJzLFxuICB7XG4gICAgZ2V0KHRhcmdldCwga2V5KSB7XG4gICAgICBpZiAoa2V5ID09PSBTeW1ib2wudW5zY29wYWJsZXMpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFB1YmxpY0luc3RhbmNlUHJveHlIYW5kbGVycy5nZXQodGFyZ2V0LCBrZXksIHRhcmdldCk7XG4gICAgfSxcbiAgICBoYXMoXywga2V5KSB7XG4gICAgICBjb25zdCBoYXMgPSBrZXlbMF0gIT09IFwiX1wiICYmICFpc0dsb2JhbGx5QWxsb3dlZChrZXkpO1xuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgIWhhcyAmJiBQdWJsaWNJbnN0YW5jZVByb3h5SGFuZGxlcnMuaGFzKF8sIGtleSkpIHtcbiAgICAgICAgd2FybiQxKFxuICAgICAgICAgIGBQcm9wZXJ0eSAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAga2V5XG4gICAgICAgICAgKX0gc2hvdWxkIG5vdCBzdGFydCB3aXRoIF8gd2hpY2ggaXMgYSByZXNlcnZlZCBwcmVmaXggZm9yIFZ1ZSBpbnRlcm5hbHMuYFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGhhcztcbiAgICB9XG4gIH1cbik7XG5mdW5jdGlvbiBjcmVhdGVEZXZSZW5kZXJDb250ZXh0KGluc3RhbmNlKSB7XG4gIGNvbnN0IHRhcmdldCA9IHt9O1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBgX2AsIHtcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgZ2V0OiAoKSA9PiBpbnN0YW5jZVxuICB9KTtcbiAgT2JqZWN0LmtleXMocHVibGljUHJvcGVydGllc01hcCkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCB7XG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIGdldDogKCkgPT4gcHVibGljUHJvcGVydGllc01hcFtrZXldKGluc3RhbmNlKSxcbiAgICAgIC8vIGludGVyY2VwdGVkIGJ5IHRoZSBwcm94eSBzbyBubyBuZWVkIGZvciBpbXBsZW1lbnRhdGlvbixcbiAgICAgIC8vIGJ1dCBuZWVkZWQgdG8gcHJldmVudCBzZXQgZXJyb3JzXG4gICAgICBzZXQ6IE5PT1BcbiAgICB9KTtcbiAgfSk7XG4gIHJldHVybiB0YXJnZXQ7XG59XG5mdW5jdGlvbiBleHBvc2VQcm9wc09uUmVuZGVyQ29udGV4dChpbnN0YW5jZSkge1xuICBjb25zdCB7XG4gICAgY3R4LFxuICAgIHByb3BzT3B0aW9uczogW3Byb3BzT3B0aW9uc11cbiAgfSA9IGluc3RhbmNlO1xuICBpZiAocHJvcHNPcHRpb25zKSB7XG4gICAgT2JqZWN0LmtleXMocHJvcHNPcHRpb25zKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjdHgsIGtleSwge1xuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGdldDogKCkgPT4gaW5zdGFuY2UucHJvcHNba2V5XSxcbiAgICAgICAgc2V0OiBOT09QXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxufVxuZnVuY3Rpb24gZXhwb3NlU2V0dXBTdGF0ZU9uUmVuZGVyQ29udGV4dChpbnN0YW5jZSkge1xuICBjb25zdCB7IGN0eCwgc2V0dXBTdGF0ZSB9ID0gaW5zdGFuY2U7XG4gIE9iamVjdC5rZXlzKHRvUmF3KHNldHVwU3RhdGUpKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICBpZiAoIXNldHVwU3RhdGUuX19pc1NjcmlwdFNldHVwKSB7XG4gICAgICBpZiAoaXNSZXNlcnZlZFByZWZpeChrZXlbMF0pKSB7XG4gICAgICAgIHdhcm4kMShcbiAgICAgICAgICBgc2V0dXAoKSByZXR1cm4gcHJvcGVydHkgJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgIGtleVxuICAgICAgICAgICl9IHNob3VsZCBub3Qgc3RhcnQgd2l0aCBcIiRcIiBvciBcIl9cIiB3aGljaCBhcmUgcmVzZXJ2ZWQgcHJlZml4ZXMgZm9yIFZ1ZSBpbnRlcm5hbHMuYFxuICAgICAgICApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY3R4LCBrZXksIHtcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6ICgpID0+IHNldHVwU3RhdGVba2V5XSxcbiAgICAgICAgc2V0OiBOT09QXG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xufVxuXG5jb25zdCB3YXJuUnVudGltZVVzYWdlID0gKG1ldGhvZCkgPT4gd2FybiQxKFxuICBgJHttZXRob2R9KCkgaXMgYSBjb21waWxlci1oaW50IGhlbHBlciB0aGF0IGlzIG9ubHkgdXNhYmxlIGluc2lkZSA8c2NyaXB0IHNldHVwPiBvZiBhIHNpbmdsZSBmaWxlIGNvbXBvbmVudC4gSXRzIGFyZ3VtZW50cyBzaG91bGQgYmUgY29tcGlsZWQgYXdheSBhbmQgcGFzc2luZyBpdCBhdCBydW50aW1lIGhhcyBubyBlZmZlY3QuYFxuKTtcbmZ1bmN0aW9uIGRlZmluZVByb3BzKCkge1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIHdhcm5SdW50aW1lVXNhZ2UoYGRlZmluZVByb3BzYCk7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBkZWZpbmVFbWl0cygpIHtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICB3YXJuUnVudGltZVVzYWdlKGBkZWZpbmVFbWl0c2ApO1xuICB9XG4gI
20578HJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gZGVmaW5lRXhwb3NlKGV4cG9zZWQpIHtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICB3YXJuUnVudGltZVVzYWdlKGBkZWZpbmVFeHBvc2VgKTtcbiAgfVxufVxuZnVuY3Rpb24gZGVmaW5lT3B0aW9ucyhvcHRpb25zKSB7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgd2FyblJ1bnRpbWVVc2FnZShgZGVmaW5lT3B0aW9uc2ApO1xuICB9XG59XG5mdW5jdGlvbiBkZWZpbmVTbG90cygpIHtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICB3YXJuUnVudGltZVVzYWdlKGBkZWZpbmVTbG90c2ApO1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gZGVmaW5lTW9kZWwoKSB7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgd2FyblJ1bnRpbWVVc2FnZShcImRlZmluZU1vZGVsXCIpO1xuICB9XG59XG5mdW5jdGlvbiB3aXRoRGVmYXVsdHMocHJvcHMsIGRlZmF1bHRzKSB7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgd2FyblJ1bnRpbWVVc2FnZShgd2l0aERlZmF1bHRzYCk7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiB1c2VTbG90cygpIHtcbiAgcmV0dXJuIGdldENvbnRleHQoKS5zbG90cztcbn1cbmZ1bmN0aW9uIHVzZUF0dHJzKCkge1xuICByZXR1cm4gZ2V0Q29udGV4dCgpLmF0dHJzO1xufVxuZnVuY3Rpb24gZ2V0Q29udGV4dCgpIHtcbiAgY29uc3QgaSA9IGdldEN1cnJlbnRJbnN0YW5jZSgpO1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAhaSkge1xuICAgIHdhcm4kMShgdXNlQ29udGV4dCgpIGNhbGxlZCB3aXRob3V0IGFjdGl2ZSBpbnN0YW5jZS5gKTtcbiAgfVxuICByZXR1cm4gaS5zZXR1cENvbnRleHQgfHwgKGkuc2V0dXBDb250ZXh0ID0gY3JlYXRlU2V0dXBDb250ZXh0KGkpKTtcbn1cbmZ1bmN0aW9uIG5vcm1hbGl6ZVByb3BzT3JFbWl0cyhwcm9wcykge1xuICByZXR1cm4gaXNBcnJheShwcm9wcykgPyBwcm9wcy5yZWR1Y2UoXG4gICAgKG5vcm1hbGl6ZWQsIHApID0+IChub3JtYWxpemVkW3BdID0gbnVsbCwgbm9ybWFsaXplZCksXG4gICAge31cbiAgKSA6IHByb3BzO1xufVxuZnVuY3Rpb24gbWVyZ2VEZWZhdWx0cyhyYXcsIGRlZmF1bHRzKSB7XG4gIGNvbnN0IHByb3BzID0gbm9ybWFsaXplUHJvcHNPckVtaXRzKHJhdyk7XG4gIGZvciAoY29uc3Qga2V5IGluIGRlZmF1bHRzKSB7XG4gICAgaWYgKGtleS5zdGFydHNXaXRoKFwiX19za2lwXCIpKSBjb250aW51ZTtcbiAgICBsZXQgb3B0ID0gcHJvcHNba2V5XTtcbiAgICBpZiAob3B0KSB7XG4gICAgICBpZiAoaXNBcnJheShvcHQpIHx8IGlzRnVuY3Rpb24ob3B0KSkge1xuICAgICAgICBvcHQgPSBwcm9wc1trZXldID0geyB0eXBlOiBvcHQsIGRlZmF1bHQ6IGRlZmF1bHRzW2tleV0gfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9wdC5kZWZhdWx0ID0gZGVmYXVsdHNba2V5XTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG9wdCA9PT0gbnVsbCkge1xuICAgICAgb3B0ID0gcHJvcHNba2V5XSA9IHsgZGVmYXVsdDogZGVmYXVsdHNba2V5XSB9O1xuICAgIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgd2FybiQxKGBwcm9wcyBkZWZhdWx0IGtleSBcIiR7a2V5fVwiIGhhcyBubyBjb3JyZXNwb25kaW5nIGRlY2xhcmF0aW9uLmApO1xuICAgIH1cbiAgICBpZiAob3B0ICYmIGRlZmF1bHRzW2BfX3NraXBfJHtrZXl9YF0pIHtcbiAgICAgIG9wdC5za2lwRmFjdG9yeSA9IHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBwcm9wcztcbn1cbmZ1bmN0aW9uIG1lcmdlTW9kZWxzKGEsIGIpIHtcbiAgaWYgKCFhIHx8ICFiKSByZXR1cm4gYSB8fCBiO1xuICBpZiAoaXNBcnJheShhKSAmJiBpc0FycmF5KGIpKSByZXR1cm4gYS5jb25jYXQoYik7XG4gIHJldHVybiBleHRlbmQoe30sIG5vcm1hbGl6ZVByb3BzT3JFbWl0cyhhKSwgbm9ybWFsaXplUHJvcHNPckVtaXRzKGIpKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVByb3BzUmVzdFByb3h5KHByb3BzLCBleGNsdWRlZEtleXMpIHtcbiAgY29uc3QgcmV0ID0ge307XG4gIGZvciAoY29uc3Qga2V5IGluIHByb3BzKSB7XG4gICAgaWYgKCFleGNsdWRlZEtleXMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJldCwga2V5LCB7XG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGdldDogKCkgPT4gcHJvcHNba2V5XVxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXQ7XG59XG5mdW5jdGlvbiB3aXRoQXN5bmNDb250ZXh0KGdldEF3YWl0YWJsZSkge1xuICBjb25zdCBjdHggPSBnZXRDdXJyZW50SW5zdGFuY2UoKTtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgIWN0eCkge1xuICAgIHdhcm4kMShcbiAgICAgIGB3aXRoQXN5bmNDb250ZXh0IGNhbGxlZCB3aXRob3V0IGFjdGl2ZSBjdXJyZW50IGluc3RhbmNlLiBUaGlzIGlzIGxpa2VseSBhIGJ1Zy5gXG4gICAgKTtcbiAgfVxuICBsZXQgYXdhaXRhYmxlID0gZ2V0QXdhaXRhYmxlKCk7XG4gIHVuc2V0Q3VycmVudEluc3RhbmNlKCk7XG4gIGlmIChpc1Byb21pc2UoYXdhaXRhYmxlKSkge1xuICAgIGF3YWl0YWJsZSA9IGF3YWl0YWJsZS5jYXRjaCgoZSkgPT4ge1xuICAgICAgc2V0Q3VycmVudEluc3RhbmNlKGN0eCk7XG4gICAgICB0aHJvdyBlO1xuICAgIH0pO1xuICB9XG4gIHJldHVybiBbYXdhaXRhYmxlLCAoKSA9PiBzZXRDdXJyZW50SW5zdGFuY2UoY3R4KV07XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUR1cGxpY2F0ZUNoZWNrZXIoKSB7XG4gIGNvbnN0IGNhY2hlID0gLyogQF9fUFVSRV9fICovIE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIHJldHVybiAodHlwZSwga2V5KSA9PiB7XG4gICAgaWYgKGNhY2hlW2tleV0pIHtcbiAgICAgIHdhcm4kMShgJHt0eXBlfSBwcm9wZXJ0eSBcIiR7a2V5fVwiIGlzIGFscmVhZHkgZGVmaW5lZCBpbiAke2NhY2hlW2tleV19LmApO1xuICAgIH0gZWxzZSB7XG4gICAgICBjYWNoZVtrZXldID0gdHlwZTtcbiAgICB9XG4gI
20578H07XG59XG5sZXQgc2hvdWxkQ2FjaGVBY2Nlc3MgPSB0cnVlO1xuZnVuY3Rpb24gYXBwbHlPcHRpb25zKGluc3RhbmNlKSB7XG4gIGNvbnN0IG9wdGlvbnMgPSByZXNvbHZlTWVyZ2VkT3B0aW9ucyhpbnN0YW5jZSk7XG4gIGNvbnN0IHB1YmxpY1RoaXMgPSBpbnN0YW5jZS5wcm94eTtcbiAgY29uc3QgY3R4ID0gaW5zdGFuY2UuY3R4O1xuICBzaG91bGRDYWNoZUFjY2VzcyA9IGZhbHNlO1xuICBpZiAob3B0aW9ucy5iZWZvcmVDcmVhdGUpIHtcbiAgICBjYWxsSG9vayhvcHRpb25zLmJlZm9yZUNyZWF0ZSwgaW5zdGFuY2UsIFwiYmNcIik7XG4gIH1cbiAgY29uc3Qge1xuICAgIC8vIHN0YXRlXG4gICAgZGF0YTogZGF0YU9wdGlvbnMsXG4gICAgY29tcHV0ZWQ6IGNvbXB1dGVkT3B0aW9ucyxcbiAgICBtZXRob2RzLFxuICAgIHdhdGNoOiB3YXRjaE9wdGlvbnMsXG4gICAgcHJvdmlkZTogcHJvdmlkZU9wdGlvbnMsXG4gICAgaW5qZWN0OiBpbmplY3RPcHRpb25zLFxuICAgIC8vIGxpZmVjeWNsZVxuICAgIGNyZWF0ZWQsXG4gICAgYmVmb3JlTW91bnQsXG4gICAgbW91bnRlZCxcbiAgICBiZWZvcmVVcGRhdGUsXG4gICAgdXBkYXRlZCxcbiAgICBhY3RpdmF0ZWQsXG4gICAgZGVhY3RpdmF0ZWQsXG4gICAgYmVmb3JlRGVzdHJveSxcbiAgICBiZWZvcmVVbm1vdW50LFxuICAgIGRlc3Ryb3llZCxcbiAgICB1bm1vdW50ZWQsXG4gICAgcmVuZGVyLFxuICAgIHJlbmRlclRyYWNrZWQsXG4gICAgcmVuZGVyVHJpZ2dlcmVkLFxuICAgIGVycm9yQ2FwdHVyZWQsXG4gICAgc2VydmVyUHJlZmV0Y2gsXG4gICAgLy8gcHVibGljIEFQSVxuICAgIGV4cG9zZSxcbiAgICBpbmhlcml0QXR0cnMsXG4gICAgLy8gYXNzZXRzXG4gICAgY29tcG9uZW50cyxcbiAgICBkaXJlY3RpdmVzLFxuICAgIGZpbHRlcnNcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IGNoZWNrRHVwbGljYXRlUHJvcGVydGllcyA9ICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBjcmVhdGVEdXBsaWNhdGVDaGVja2VyKCkgOiBudWxsO1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIGNvbnN0IFtwcm9wc09wdGlvbnNdID0gaW5zdGFuY2UucHJvcHNPcHRpb25zO1xuICAgIGlmIChwcm9wc09wdGlvbnMpIHtcbiAgICAgIGZvciAoY29uc3Qga2V5IGluIHByb3BzT3B0aW9ucykge1xuICAgICAgICBjaGVja0R1cGxpY2F0ZVByb3BlcnRpZXMoXCJQcm9wc1wiIC8qIFBST1BTICovLCBrZXkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAoaW5qZWN0T3B0aW9ucykge1xuICAgIHJlc29sdmVJbmplY3Rpb25zKGluamVjdE9wdGlvbnMsIGN0eCwgY2hlY2tEdXBsaWNhdGVQcm9wZXJ0aWVzKTtcbiAgfVxuICBpZiAobWV0aG9kcykge1xuICAgIGZvciAoY29uc3Qga2V5IGluIG1ldGhvZHMpIHtcbiAgICAgIGNvbnN0IG1ldGhvZEhhbmRsZXIgPSBtZXRob2RzW2tleV07XG4gICAgICBpZiAoaXNGdW5jdGlvbihtZXRob2RIYW5kbGVyKSkge1xuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjdHgsIGtleSwge1xuICAgICAgICAgICAgdmFsdWU6IG1ldGhvZEhhbmRsZXIuYmluZChwdWJsaWNUaGlzKSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGN0eFtrZXldID0gbWV0aG9kSGFuZGxlci5iaW5kKHB1YmxpY1RoaXMpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgY2hlY2tEdXBsaWNhdGVQcm9wZXJ0aWVzKFwiTWV0aG9kc1wiIC8qIE1FVEhPRFMgKi8sIGtleSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICB3YXJuJDEoXG4gICAgICAgICAgYE1ldGhvZCBcIiR7a2V5fVwiIGhhcyB0eXBlIFwiJHt0eXBlb2YgbWV0aG9kSGFuZGxlcn1cIiBpbiB0aGUgY29tcG9uZW50IGRlZmluaXRpb24uIERpZCB5b3UgcmVmZXJlbmNlIHRoZSBmdW5jdGlvbiBjb3JyZWN0bHk/YFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAoZGF0YU9wdGlvbnMpIHtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAhaXNGdW5jdGlvbihkYXRhT3B0aW9ucykpIHtcbiAgICAgIHdhcm4kMShcbiAgICAgICAgYFRoZSBkYXRhIG9wdGlvbiBtdXN0IGJlIGEgZnVuY3Rpb24uIFBsYWluIG9iamVjdCB1c2FnZSBpcyBubyBsb25nZXIgc3VwcG9ydGVkLmBcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IGRhdGEgPSBkYXRhT3B0aW9ucy5jYWxsKHB1YmxpY1RoaXMsIHB1YmxpY1RoaXMpO1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIGlzUHJvbWlzZShkYXRhKSkge1xuICAgICAgd2FybiQxKFxuICAgICAgICBgZGF0YSgpIHJldHVybmVkIGEgUHJvbWlzZSAtIG5vdGUgZGF0YSgpIGNhbm5vdCBiZSBhc3luYzsgSWYgeW91IGludGVuZCB0byBwZXJmb3JtIGRhdGEgZmV0Y2hpbmcgYmVmb3JlIGNvbXBvbmVudCByZW5kZXJzLCB1c2UgYXN5bmMgc2V0dXAoKSArIDxTdXNwZW5zZT4uYFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKCFpc09iamVjdChkYXRhKSkge1xuICAgICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiB3YXJuJDEoYGRhdGEoKSBzaG91bGQgcmV0dXJuIGFuIG9iamVjdC5gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaW5zdGFuY2UuZGF0YSA9IHJlYWN0aXZlKGRhdGEpO1xuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gZGF0YSkge1xuICAgICAgICAgIGNoZWNrRHVwbGljYXRlUHJv
20578cGVydGllcyhcIkRhdGFcIiAvKiBEQVRBICovLCBrZXkpO1xuICAgICAgICAgIGlmICghaXNSZXNlcnZlZFByZWZpeChrZXlbMF0pKSB7XG4gICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY3R4LCBrZXksIHtcbiAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICBnZXQ6ICgpID0+IGRhdGFba2V5XSxcbiAgICAgICAgICAgICAgc2V0OiBOT09QXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgc2hvdWxkQ2FjaGVBY2Nlc3MgPSB0cnVlO1xuICBpZiAoY29tcHV0ZWRPcHRpb25zKSB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gY29tcHV0ZWRPcHRpb25zKSB7XG4gICAgICBjb25zdCBvcHQgPSBjb21wdXRlZE9wdGlvbnNba2V5XTtcbiAgICAgIGNvbnN0IGdldCA9IGlzRnVuY3Rpb24ob3B0KSA/IG9wdC5iaW5kKHB1YmxpY1RoaXMsIHB1YmxpY1RoaXMpIDogaXNGdW5jdGlvbihvcHQuZ2V0KSA/IG9wdC5nZXQuYmluZChwdWJsaWNUaGlzLCBwdWJsaWNUaGlzKSA6IE5PT1A7XG4gICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBnZXQgPT09IE5PT1ApIHtcbiAgICAgICAgd2FybiQxKGBDb21wdXRlZCBwcm9wZXJ0eSBcIiR7a2V5fVwiIGhhcyBubyBnZXR0ZXIuYCk7XG4gICAgICB9XG4gICAgICBjb25zdCBzZXQgPSAhaXNGdW5jdGlvbihvcHQpICYmIGlzRnVuY3Rpb24ob3B0LnNldCkgPyBvcHQuc2V0LmJpbmQocHVibGljVGhpcykgOiAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8gKCkgPT4ge1xuICAgICAgICB3YXJuJDEoXG4gICAgICAgICAgYFdyaXRlIG9wZXJhdGlvbiBmYWlsZWQ6IGNvbXB1dGVkIHByb3BlcnR5IFwiJHtrZXl9XCIgaXMgcmVhZG9ubHkuYFxuICAgICAgICApO1xuICAgICAgfSA6IE5PT1A7XG4gICAgICBjb25zdCBjID0gY29tcHV0ZWQoe1xuICAgICAgICBnZXQsXG4gICAgICAgIHNldFxuICAgICAgfSk7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY3R4LCBrZXksIHtcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6ICgpID0+IGMudmFsdWUsXG4gICAgICAgIHNldDogKHYpID0+IGMudmFsdWUgPSB2XG4gICAgICB9KTtcbiAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgIGNoZWNrRHVwbGljYXRlUHJvcGVydGllcyhcIkNvbXB1dGVkXCIgLyogQ09NUFVURUQgKi8sIGtleSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmICh3YXRjaE9wdGlvbnMpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiB3YXRjaE9wdGlvbnMpIHtcbiAgICAgIGNyZWF0ZVdhdGNoZXIod2F0Y2hPcHRpb25zW2tleV0sIGN0eCwgcHVibGljVGhpcywga2V5KTtcbiAgICB9XG4gIH1cbiAgaWYgKHByb3ZpZGVPcHRpb25zKSB7XG4gICAgY29uc3QgcHJvdmlkZXMgPSBpc0Z1bmN0aW9uKHByb3ZpZGVPcHRpb25zKSA/IHByb3ZpZGVPcHRpb25zLmNhbGwocHVibGljVGhpcykgOiBwcm92aWRlT3B0aW9ucztcbiAgICBSZWZsZWN0Lm93bktleXMocHJvdmlkZXMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgcHJvdmlkZShrZXksIHByb3ZpZGVzW2tleV0pO1xuICAgIH0pO1xuICB9XG4gIGlmIChjcmVhdGVkKSB7XG4gICAgY2FsbEhvb2soY3JlYXRlZCwgaW5zdGFuY2UsIFwiY1wiKTtcbiAgfVxuICBmdW5jdGlvbiByZWdpc3RlckxpZmVjeWNsZUhvb2socmVnaXN0ZXIsIGhvb2spIHtcbiAgICBpZiAoaXNBcnJheShob29rKSkge1xuICAgICAgaG9vay5mb3JFYWNoKChfaG9vaykgPT4gcmVnaXN0ZXIoX2hvb2suYmluZChwdWJsaWNUaGlzKSkpO1xuICAgIH0gZWxzZSBpZiAoaG9vaykge1xuICAgICAgcmVnaXN0ZXIoaG9vay5iaW5kKHB1YmxpY1RoaXMpKTtcbiAgICB9XG4gIH1cbiAgcmVnaXN0ZXJMaWZlY3ljbGVIb29rKG9uQmVmb3JlTW91bnQsIGJlZm9yZU1vdW50KTtcbiAgcmVnaXN0ZXJMaWZlY3ljbGVIb29rKG9uTW91bnRlZCwgbW91bnRlZCk7XG4gIHJlZ2lzdGVyTGlmZWN5Y2xlSG9vayhvbkJlZm9yZVVwZGF0ZSwgYmVmb3JlVXBkYXRlKTtcbiAgcmVnaXN0ZXJMaWZlY3ljbGVIb29rKG9uVXBkYXRlZCwgdXBkYXRlZCk7XG4gIHJlZ2lzdGVyTGlmZWN5Y2xlSG9vayhvbkFjdGl2YXRlZCwgYWN0aXZhdGVkKTtcbiAgcmVnaXN0ZXJMaWZlY3ljbGVIb29rKG9uRGVhY3RpdmF0ZWQsIGRlYWN0aXZhdGVkKTtcbiAgcmVnaXN0ZXJMaWZlY3ljbGVIb29rKG9uRXJyb3JDYXB0dXJlZCwgZXJyb3JDYXB0dXJlZCk7XG4gIHJlZ2lzdGVyTGlmZWN5Y2xlSG9vayhvblJlbmRlclRyYWNrZWQsIHJlbmRlclRyYWNrZWQpO1xuICByZWdpc3RlckxpZmVjeWNsZUhvb2sob25SZW5kZXJUcmlnZ2VyZWQsIHJlbmRlclRyaWdnZXJlZCk7XG4gIHJlZ2lzdGVyTGlmZWN5Y2xlSG9vayhvbkJlZm9yZVVubW91bnQsIGJlZm9yZVVubW91bnQpO1xuICByZWdpc3RlckxpZmVjeWNsZUhvb2sob25Vbm1vdW50ZWQsIHVubW91bnRlZCk7XG4gIHJlZ2lzdGVyTGlmZWN5Y2xlSG9vayhvblNlcnZlclByZWZldGNoLCBzZXJ2ZXJQcmVmZXRjaCk7XG4gIGlmIChpc0FycmF5KGV4cG9zZSkpIHtcbiAgICBpZiAoZXhwb3NlLmxlbmd0aCkge1xuICAgICAgY29uc3QgZXhwb3NlZCA9IGluc3RhbmNlLmV4cG9zZWQgfHwgKGluc3RhbmNlLmV4cG9zZWQgPSB7fSk7XG4gICAgICBleHBvc2UuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvc2VkLCBrZXksIHtcbiAgICAgICAgICBnZXQ6ICgpID0+IHB1YmxpY1RoaXNba2V5XSxcbiAgICAgICAgICBzZXQ6ICh2YWwpID0+IHB1YmxpY1RoaXNba2V5XSA9IHZhbFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoIWluc3RhbmNlLmV4cG9zZWQpIHtcbiAgICAgIGluc3RhbmNlLmV4cG9zZWQgPSB7fTtcbiAgICB9XG4gI
20578H1cbiAgaWYgKHJlbmRlciAmJiBpbnN0YW5jZS5yZW5kZXIgPT09IE5PT1ApIHtcbiAgICBpbnN0YW5jZS5yZW5kZXIgPSByZW5kZXI7XG4gIH1cbiAgaWYgKGluaGVyaXRBdHRycyAhPSBudWxsKSB7XG4gICAgaW5zdGFuY2UuaW5oZXJpdEF0dHJzID0gaW5oZXJpdEF0dHJzO1xuICB9XG4gIGlmIChjb21wb25lbnRzKSBpbnN0YW5jZS5jb21wb25lbnRzID0gY29tcG9uZW50cztcbiAgaWYgKGRpcmVjdGl2ZXMpIGluc3RhbmNlLmRpcmVjdGl2ZXMgPSBkaXJlY3RpdmVzO1xufVxuZnVuY3Rpb24gcmVzb2x2ZUluamVjdGlvbnMoaW5qZWN0T3B0aW9ucywgY3R4LCBjaGVja0R1cGxpY2F0ZVByb3BlcnRpZXMgPSBOT09QKSB7XG4gIGlmIChpc0FycmF5KGluamVjdE9wdGlvbnMpKSB7XG4gICAgaW5qZWN0T3B0aW9ucyA9IG5vcm1hbGl6ZUluamVjdChpbmplY3RPcHRpb25zKTtcbiAgfVxuICBmb3IgKGNvbnN0IGtleSBpbiBpbmplY3RPcHRpb25zKSB7XG4gICAgY29uc3Qgb3B0ID0gaW5qZWN0T3B0aW9uc1trZXldO1xuICAgIGxldCBpbmplY3RlZDtcbiAgICBpZiAoaXNPYmplY3Qob3B0KSkge1xuICAgICAgaWYgKFwiZGVmYXVsdFwiIGluIG9wdCkge1xuICAgICAgICBpbmplY3RlZCA9IGluamVjdChcbiAgICAgICAgICBvcHQuZnJvbSB8fCBrZXksXG4gICAgICAgICAgb3B0LmRlZmF1bHQsXG4gICAgICAgICAgdHJ1ZVxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW5qZWN0ZWQgPSBpbmplY3Qob3B0LmZyb20gfHwga2V5KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaW5qZWN0ZWQgPSBpbmplY3Qob3B0KTtcbiAgICB9XG4gICAgaWYgKGlzUmVmKGluamVjdGVkKSkge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGN0eCwga2V5LCB7XG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiAoKSA9PiBpbmplY3RlZC52YWx1ZSxcbiAgICAgICAgc2V0OiAodikgPT4gaW5qZWN0ZWQudmFsdWUgPSB2XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY3R4W2tleV0gPSBpbmplY3RlZDtcbiAgICB9XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgIGNoZWNrRHVwbGljYXRlUHJvcGVydGllcyhcIkluamVjdFwiIC8qIElOSkVDVCAqLywga2V5KTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGNhbGxIb29rKGhvb2ssIGluc3RhbmNlLCB0eXBlKSB7XG4gIGNhbGxXaXRoQXN5bmNFcnJvckhhbmRsaW5nKFxuICAgIGlzQXJyYXkoaG9vaykgPyBob29rLm1hcCgoaCkgPT4gaC5iaW5kKGluc3RhbmNlLnByb3h5KSkgOiBob29rLmJpbmQoaW5zdGFuY2UucHJveHkpLFxuICAgIGluc3RhbmNlLFxuICAgIHR5cGVcbiAgKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVdhdGNoZXIocmF3LCBjdHgsIHB1YmxpY1RoaXMsIGtleSkge1xuICBjb25zdCBnZXR0ZXIgPSBrZXkuaW5jbHVkZXMoXCIuXCIpID8gY3JlYXRlUGF0aEdldHRlcihwdWJsaWNUaGlzLCBrZXkpIDogKCkgPT4gcHVibGljVGhpc1trZXldO1xuICBpZiAoaXNTdHJpbmcocmF3KSkge1xuICAgIGNvbnN0IGhhbmRsZXIgPSBjdHhbcmF3XTtcbiAgICBpZiAoaXNGdW5jdGlvbihoYW5kbGVyKSkge1xuICAgICAgd2F0Y2goZ2V0dGVyLCBoYW5kbGVyKTtcbiAgICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgIHdhcm4kMShgSW52YWxpZCB3YXRjaCBoYW5kbGVyIHNwZWNpZmllZCBieSBrZXkgXCIke3Jhd31cImAsIGhhbmRsZXIpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc0Z1bmN0aW9uKHJhdykpIHtcbiAgICB3YXRjaChnZXR0ZXIsIHJhdy5iaW5kKHB1YmxpY1RoaXMpKTtcbiAgfSBlbHNlIGlmIChpc09iamVjdChyYXcpKSB7XG4gICAgaWYgKGlzQXJyYXkocmF3KSkge1xuICAgICAgcmF3LmZvckVhY2goKHIpID0+IGNyZWF0ZVdhdGNoZXIociwgY3R4LCBwdWJsaWNUaGlzLCBrZXkpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgaGFuZGxlciA9IGlzRnVuY3Rpb24ocmF3LmhhbmRsZXIpID8gcmF3LmhhbmRsZXIuYmluZChwdWJsaWNUaGlzKSA6IGN0eFtyYXcuaGFuZGxlcl07XG4gICAgICBpZiAoaXNGdW5jdGlvbihoYW5kbGVyKSkge1xuICAgICAgICB3YXRjaChnZXR0ZXIsIGhhbmRsZXIsIHJhdyk7XG4gICAgICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgd2FybiQxKGBJbnZhbGlkIHdhdGNoIGhhbmRsZXIgc3BlY2lmaWVkIGJ5IGtleSBcIiR7cmF3LmhhbmRsZXJ9XCJgLCBoYW5kbGVyKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIHdhcm4kMShgSW52YWxpZCB3YXRjaCBvcHRpb246IFwiJHtrZXl9XCJgLCByYXcpO1xuICB9XG59XG5mdW5jdGlvbiByZXNvbHZlTWVyZ2VkT3B0aW9ucyhpbnN0YW5jZSkge1xuICBjb25zdCBiYXNlID0gaW5zdGFuY2UudHlwZTtcbiAgY29uc3QgeyBtaXhpbnMsIGV4dGVuZHM6IGV4dGVuZHNPcHRpb25zIH0gPSBiYXNlO1xuICBjb25zdCB7XG4gICAgbWl4aW5zOiBnbG9iYWxNaXhpbnMsXG4gICAgb3B0aW9uc0NhY2hlOiBjYWNoZSxcbiAgICBjb25maWc6IHsgb3B0aW9uTWVyZ2VTdHJhdGVnaWVzIH1cbiAgfSA9IGluc3RhbmNlLmFwcENvbnRleHQ7XG4gIGNvbnN0IGNhY2hlZCA9IGNhY2hlLmdldChiYXNlKTtcbiAgbGV0IHJlc29sdmVkO1xuICBpZiAoY2FjaGVkKSB7XG4gICAgcmVzb2x2ZWQgPSBjYWNoZWQ7XG4gIH0gZWxzZSBpZiAoIWdsb2JhbE1peGlucy5sZW5ndGggJiYgIW1peGlucyAmJiAhZXh0ZW5kc09wdGlvbnMpIHtcbiAgICB7XG4gICAgICByZXNvbHZlZCA9IGJhc2U7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHJlc29sdmVkID0ge307XG4gICAgaWYgKGdsb2JhbE1peGlucy5sZW5ndGgpIHtcbiAgICAgIGdsb2JhbE1peGlucy5mb3JFYWNoKFxuICAgICAgICAobSkgPT4gbWVyZ2VPcHRpb25zKHJlc29sdmVkLCBtLCBvcHRpb25NZXJnZVN0cmF0ZWdpZXMsIHRydWUpXG4gICAgICApO1xuICAgIH1cbiAgICBtZXJnZU9wdGlvbnMocmVzb2x2ZWQsIGJhc2UsIG9wdGlvbk1lcmdlU3RyYXRlZ2llcyk7XG4gIH1cbiAgaWYgKGlzT2JqZWN0KGJhc2UpKSB7XG4gICAgY2FjaGUuc2V0KGJhc2UsIHJlc29sdmVkKTtcbiAgfVxuICByZXR1cm4gcmVzb2x2ZWQ7XG59XG5mdW5jdGlvbiBtZXJnZU9wdGlvbnModG8sIGZyb20sIHN0cmF0cywgYXNNaXhpbiA9IGZhbHNlKSB7XG4gIGNvbnN0IHsgbWl4aW5zLCBleHRlbmRzOiBleHRlbmRzT3B0aW9ucyB9ID0gZnJvbTtcbiAgaWYgKGV4dGVuZHNPcHRpb25zKSB7XG4gICAgbWVyZ2VPcHRpb25zKHRvLCBleHRlbmRzT3B0aW9ucywgc3RyYXRzLCB0cnVlKTtcbiAgfVxuICBpZiAobWl4aW5zKSB7XG4gICAgbWl4aW5zLmZvckVhY2goXG4gICAgICAobSkgPT4gbWVyZ2VPcHRpb25zKHRvLCBtLCBzdHJhdHMsIHRydWUpXG4gICAgKTtcbiAgfVxuICBmb3IgKGNvbnN0IGtleSBpbiBmcm9tKSB7XG4gICAgaWYgKGFzTWl4aW4gJiYga2V5ID09PSBcImV4cG9zZVwiKSB7XG4gICAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9k
20578dWN0aW9uXCIpICYmIHdhcm4kMShcbiAgICAgICAgYFwiZXhwb3NlXCIgb3B0aW9uIGlzIGlnbm9yZWQgd2hlbiBkZWNsYXJlZCBpbiBtaXhpbnMgb3IgZXh0ZW5kcy4gSXQgc2hvdWxkIG9ubHkgYmUgZGVjbGFyZWQgaW4gdGhlIGJhc2UgY29tcG9uZW50IGl0c2VsZi5gXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBzdHJhdCA9IGludGVybmFsT3B0aW9uTWVyZ2VTdHJhdHNba2V5XSB8fCBzdHJhdHMgJiYgc3RyYXRzW2tleV07XG4gICAgICB0b1trZXldID0gc3RyYXQgPyBzdHJhdCh0b1trZXldLCBmcm9tW2tleV0pIDogZnJvbVtrZXldO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdG87XG59XG5jb25zdCBpbnRlcm5hbE9wdGlvbk1lcmdlU3RyYXRzID0ge1xuICBkYXRhOiBtZXJnZURhdGFGbixcbiAgcHJvcHM6IG1lcmdlRW1pdHNPclByb3BzT3B0aW9ucyxcbiAgZW1pdHM6IG1lcmdlRW1pdHNPclByb3BzT3B0aW9ucyxcbiAgLy8gb2JqZWN0c1xuICBtZXRob2RzOiBtZXJnZU9iamVjdE9wdGlvbnMsXG4gIGNvbXB1dGVkOiBtZXJnZU9iamVjdE9wdGlvbnMsXG4gIC8vIGxpZmVjeWNsZVxuICBiZWZvcmVDcmVhdGU6IG1lcmdlQXNBcnJheSxcbiAgY3JlYXRlZDogbWVyZ2VBc0FycmF5LFxuICBiZWZvcmVNb3VudDogbWVyZ2VBc0FycmF5LFxuICBtb3VudGVkOiBtZXJnZUFzQXJyYXksXG4gIGJlZm9yZVVwZGF0ZTogbWVyZ2VBc0FycmF5LFxuICB1cGRhdGVkOiBtZXJnZUFzQXJyYXksXG4gIGJlZm9yZURlc3Ryb3k6IG1lcmdlQXNBcnJheSxcbiAgYmVmb3JlVW5tb3VudDogbWVyZ2VBc0FycmF5LFxuICBkZXN0cm95ZWQ6IG1lcmdlQXNBcnJheSxcbiAgdW5tb3VudGVkOiBtZXJnZUFzQXJyYXksXG4gIGFjdGl2YXRlZDogbWVyZ2VBc0FycmF5LFxuICBkZWFjdGl2YXRlZDogbWVyZ2VBc0FycmF5LFxuICBlcnJvckNhcHR1cmVkOiBtZXJnZUFzQXJyYXksXG4gIHNlcnZlclByZWZldGNoOiBtZXJnZUFzQXJyYXksXG4gIC8vIGFzc2V0c1xuICBjb21wb25lbnRzOiBtZXJnZU9iamVjdE9wdGlvbnMsXG4gIGRpcmVjdGl2ZXM6IG1lcmdlT2JqZWN0T3B0aW9ucyxcbiAgLy8gd2F0Y2hcbiAgd2F0Y2g6IG1lcmdlV2F0Y2hPcHRpb25zLFxuICAvLyBwcm92aWRlIC8gaW5qZWN0XG4gIHByb3ZpZGU6IG1lcmdlRGF0YUZuLFxuICBpbmplY3Q6IG1lcmdlSW5qZWN0XG59O1xuZnVuY3Rpb24gbWVyZ2VEYXRhRm4odG8sIGZyb20pIHtcbiAgaWYgKCFmcm9tKSB7XG4gICAgcmV0dXJuIHRvO1xuICB9XG4gIGlmICghdG8pIHtcbiAgICByZXR1cm4gZnJvbTtcbiAgfVxuICByZXR1cm4gZnVuY3Rpb24gbWVyZ2VkRGF0YUZuKCkge1xuICAgIHJldHVybiAoZXh0ZW5kKShcbiAgICAgIGlzRnVuY3Rpb24odG8pID8gdG8uY2FsbCh0aGlzLCB0aGlzKSA6IHRvLFxuICAgICAgaXNGdW5jdGlvbihmcm9tKSA/IGZyb20uY2FsbCh0aGlzLCB0aGlzKSA6IGZyb21cbiAgICApO1xuICB9O1xufVxuZnVuY3Rpb24gbWVyZ2VJbmplY3QodG8sIGZyb20pIHtcbiAgcmV0dXJuIG1lcmdlT2JqZWN0T3B0aW9ucyhub3JtYWxpemVJbmplY3QodG8pLCBub3JtYWxpemVJbmplY3QoZnJvbSkpO1xufVxuZnVuY3Rpb24gbm9ybWFsaXplSW5qZWN0KHJhdykge1xuICBpZiAoaXNBcnJheShyYXcpKSB7XG4gICAgY29uc3QgcmVzID0ge307XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByYXcubGVuZ3RoOyBpKyspIHtcbiAgICAgIHJlc1tyYXdbaV1dID0gcmF3W2ldO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHJldHVybiByYXc7XG59XG5mdW5jdGlvbiBtZXJnZUFzQXJyYXkodG8sIGZyb20pIHtcbiAgcmV0dXJuIHRvID8gWy4uLm5ldyBTZXQoW10uY29uY2F0KHRvLCBmcm9tKSldIDogZnJvbTtcbn1cbmZ1bmN0aW9uIG1lcmdlT2JqZWN0T3B0aW9ucyh0bywgZnJvbSkge1xuICByZXR1cm4gdG8gPyBleHRlbmQoLyogQF9fUFVSRV9fICovIE9iamVjdC5jcmVhdGUobnVsbCksIHRvLCBmcm9tKSA6IGZyb207XG59XG5mdW5jdGlvbiBtZXJnZUVtaXRzT3JQcm9wc09wdGlvbnModG8sIGZyb20pIHtcbiAgaWYgKHRvKSB7XG4gICAgaWYgKGlzQXJyYXkodG8pICYmIGlzQXJyYXkoZnJvbSkpIHtcbiAgICAgIHJldHVybiBbLi4uLyogQF9fUFVSRV9fICovIG5ldyBTZXQoWy4uLnRvLCAuLi5mcm9tXSldO1xuICAgIH1cbiAgICByZXR1cm4gZXh0ZW5kKFxuICAgICAgLyogQF9fUFVSRV9fICovIE9iamVjdC5jcmVhdGUobnVsbCksXG4gICAgICBub3JtYWxpemVQcm9wc09yRW1pdHModG8pLFxuICAgICAgbm9ybWFsaXplUHJvcHNPckVtaXRzKGZyb20gIT0gbnVsbCA/IGZyb20gOiB7fSlcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBmcm9tO1xuICB9XG59XG5mdW5jdGlvbiBtZXJnZVdhdGNoT3B0aW9ucyh0bywgZnJvbSkge1xuICBpZiAoIXRvKSByZXR1cm4gZnJvbTtcbiAgaWYgKCFmcm9tKSByZXR1cm4gdG87XG4gIGNvbnN0IG1lcmdlZCA9IGV4dGVuZCgvKiBAX19QVVJFX18gKi8gT2JqZWN0LmNyZWF0ZShudWxsKSwgdG8pO1xuICBmb3IgKGNvbnN0IGtleSBpbiBmcm9tKSB7XG4gICAgbWVyZ2VkW2tleV0gPSBtZXJnZUFzQXJyYXkodG9ba2V5XSwgZnJvbVtrZXldKTtcbiAgfVxuICByZXR1cm4gbWVyZ2VkO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVBcHBDb250ZXh0KCkge1xuICByZXR1cm4ge1xuICAgIGFwcDogbnVsbCxcbiAgICBjb25maWc6IHtcbiAgICAgIGlzTmF0aXZlVGFnOiBOTyxcbiAgICAgIHBlcmZvcm1hbmNlOiBmYWxzZSxcbiAgICAgIGdsb2JhbFByb3BlcnRpZXM6IHt9LFxuICAgICAgb3B0aW9uTWVyZ2VTdHJhdGVnaWVzOiB7fSxcbiAgICAgIGVycm9ySGFuZGxlcjogdm9pZCAwLFxuICAgICAgd2FybkhhbmRsZXI6IHZvaWQgMCxcbiAgICAgIGNvbXBpbGVyT3B0aW9uczoge31cbiAgICB9LFxuICAgIG1peGluczogW10sXG4gICAgY29tcG9uZW50czoge30sXG4gICAgZGlyZWN0aXZlczoge30sXG4gICAgcHJvdmlkZXM6IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpLFxuICAgIG9wdGlvbnNDYWNoZTogLyogQF9fUFVSRV9fICovIG5ldyBXZWFrTWFwKCksXG4gICAgcHJvcHNDYWNoZTogLyogQF9fUFVSRV9fICovIG5ldyBXZWFrTWFwKCksXG4gICAgZW1pdHNDYWNoZTogLyogQF9fUFVSRV9fICovIG5ldyBXZWFrTWFwKClcbiAgfTtcbn1cbmxldCB1aWQkMSA9IDA7XG5mdW5jdGlvbiBjcmVhdGVBcHBBUEkocmVuZGVyLCBoeWRyYXRlKSB7XG4gIHJldHVybi
20578BmdW5jdGlvbiBjcmVhdGVBcHAocm9vdENvbXBvbmVudCwgcm9vdFByb3BzID0gbnVsbCkge1xuICAgIGlmICghaXNGdW5jdGlvbihyb290Q29tcG9uZW50KSkge1xuICAgICAgcm9vdENvbXBvbmVudCA9IGV4dGVuZCh7fSwgcm9vdENvbXBvbmVudCk7XG4gICAgfVxuICAgIGlmIChyb290UHJvcHMgIT0gbnVsbCAmJiAhaXNPYmplY3Qocm9vdFByb3BzKSkge1xuICAgICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiB3YXJuJDEoYHJvb3QgcHJvcHMgcGFzc2VkIHRvIGFwcC5tb3VudCgpIG11c3QgYmUgYW4gb2JqZWN0LmApO1xuICAgICAgcm9vdFByb3BzID0gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgY29udGV4dCA9IGNyZWF0ZUFwcENvbnRleHQoKTtcbiAgICBjb25zdCBpbnN0YWxsZWRQbHVnaW5zID0gLyogQF9fUFVSRV9fICovIG5ldyBXZWFrU2V0KCk7XG4gICAgbGV0IGlzTW91bnRlZCA9IGZhbHNlO1xuICAgIGNvbnN0IGFwcCA9IGNvbnRleHQuYXBwID0ge1xuICAgICAgX3VpZDogdWlkJDErKyxcbiAgICAgIF9jb21wb25lbnQ6IHJvb3RDb21wb25lbnQsXG4gICAgICBfcHJvcHM6IHJvb3RQcm9wcyxcbiAgICAgIF9jb250YWluZXI6IG51bGwsXG4gICAgICBfY29udGV4dDogY29udGV4dCxcbiAgICAgIF9pbnN0YW5jZTogbnVsbCxcbiAgICAgIHZlcnNpb24sXG4gICAgICBnZXQgY29uZmlnKCkge1xuICAgICAgICByZXR1cm4gY29udGV4dC5jb25maWc7XG4gICAgICB9LFxuICAgICAgc2V0IGNvbmZpZyh2KSB7XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgd2FybiQxKFxuICAgICAgICAgICAgYGFwcC5jb25maWcgY2Fubm90IGJlIHJlcGxhY2VkLiBNb2RpZnkgaW5kaXZpZHVhbCBvcHRpb25zIGluc3RlYWQuYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB1c2UocGx1Z2luLCAuLi5vcHRpb25zKSB7XG4gICAgICAgIGlmIChpbnN0YWxsZWRQbHVnaW5zLmhhcyhwbHVnaW4pKSB7XG4gICAgICAgICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiB3YXJuJDEoYFBsdWdpbiBoYXMgYWxyZWFkeSBiZWVuIGFwcGxpZWQgdG8gdGFyZ2V0IGFwcC5gKTtcbiAgICAgICAgfSBlbHNlIGlmIChwbHVnaW4gJiYgaXNGdW5jdGlvbihwbHVnaW4uaW5zdGFsbCkpIHtcbiAgICAgICAgICBpbnN0YWxsZWRQbHVnaW5zLmFkZChwbHVnaW4pO1xuICAgICAgICAgIHBsdWdpbi5pbnN0YWxsKGFwcCwgLi4ub3B0aW9ucyk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNGdW5jdGlvbihwbHVnaW4pKSB7XG4gICAgICAgICAgaW5zdGFsbGVkUGx1Z2lucy5hZGQocGx1Z2luKTtcbiAgICAgICAgICBwbHVnaW4oYXBwLCAuLi5vcHRpb25zKTtcbiAgICAgICAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgd2FybiQxKFxuICAgICAgICAgICAgYEEgcGx1Z2luIG11c3QgZWl0aGVyIGJlIGEgZnVuY3Rpb24gb3IgYW4gb2JqZWN0IHdpdGggYW4gXCJpbnN0YWxsXCIgZnVuY3Rpb24uYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFwcDtcbiAgICAgIH0sXG4gICAgICBtaXhpbihtaXhpbikge1xuICAgICAgICBpZiAoX19WVUVfT1BUSU9OU19BUElfXykge1xuICAgICAgICAgIGlmICghY29udGV4dC5taXhpbnMuaW5jbHVkZXMobWl4aW4pKSB7XG4gICAgICAgICAgICBjb250ZXh0Lm1peGlucy5wdXNoKG1peGluKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICAgIHdhcm4kMShcbiAgICAgICAgICAgICAgXCJNaXhpbiBoYXMgYWxyZWFkeSBiZWVuIGFwcGxpZWQgdG8gdGFyZ2V0IGFwcFwiICsgKG1peGluLm5hbWUgPyBgOiAke21peGluLm5hbWV9YCA6IFwiXCIpXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgd2FybiQxKFwiTWl4aW5zIGFyZSBvbmx5IGF2YWlsYWJsZSBpbiBidWlsZHMgc3VwcG9ydGluZyBPcHRpb25zIEFQSVwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXBwO1xuICAgICAgfSxcbiAgICAgIGNvbXBvbmVudChuYW1lLCBjb21wb25lbnQpIHtcbiAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICB2YWxpZGF0ZUNvbXBvbmVudE5hbWUobmFtZSwgY29udGV4dC5jb25maWcpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghY29tcG9uZW50KSB7XG4gICAgICAgICAgcmV0dXJuIGNvbnRleHQuY29tcG9uZW50c1tuYW1lXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBjb250ZXh0LmNvbXBvbmVudHNbbmFtZV0pIHtcbiAgICAgICAgICB3YXJuJDEoYENvbXBvbmVudCBcIiR7bmFtZX1cIiBoYXMgYWxyZWFkeSBiZWVuIHJlZ2lzdGVyZWQgaW4gdGFyZ2V0IGFwcC5gKTtcbiAgICAgICAgfVxuICAgICAgICBjb250ZXh0LmNvbXBvbmVudHNbbmFtZV0gPSBjb21wb25lbnQ7XG4gICAgICAgIHJldHVybiBhcHA7XG4gICAgICB9LFxuICAgICAgZGlyZWN0aXZlKG5hbWUsIGRpcmVjdGl2ZSkge1xuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgIHZhbGlkYXRlRGlyZWN0aXZlTmFtZShuYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWRpcmVjdGl2ZSkge1xuICAgICAgICAgIHJldHVybiBjb250ZXh0LmRpcmVjdGl2ZXNbbmFtZV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgY29udGV4dC5kaXJlY3RpdmVzW25hbWVdKSB7XG4gICAgICAgICAgd2FybiQxKGBEaXJlY3RpdmUgXCIke25hbWV9XCIgaGFzIGFscmVhZHkgYmVlbiByZWdpc3RlcmVkIGluIHRhcmdldCBhcHAuYCk7XG4gICAgICAgI
20578H1cbiAgICAgICAgY29udGV4dC5kaXJlY3RpdmVzW25hbWVdID0gZGlyZWN0aXZlO1xuICAgICAgICByZXR1cm4gYXBwO1xuICAgICAgfSxcbiAgICAgIG1vdW50KHJvb3RDb250YWluZXIsIGlzSHlkcmF0ZSwgbmFtZXNwYWNlKSB7XG4gICAgICAgIGlmICghaXNNb3VudGVkKSB7XG4gICAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgcm9vdENvbnRhaW5lci5fX3Z1ZV9hcHBfXykge1xuICAgICAgICAgICAgd2FybiQxKFxuICAgICAgICAgICAgICBgVGhlcmUgaXMgYWxyZWFkeSBhbiBhcHAgaW5zdGFuY2UgbW91bnRlZCBvbiB0aGUgaG9zdCBjb250YWluZXIuXG4gSWYgeW91IHdhbnQgdG8gbW91bnQgYW5vdGhlciBhcHAgb24gdGhlIHNhbWUgaG9zdCBjb250YWluZXIsIHlvdSBuZWVkIHRvIHVubW91bnQgdGhlIHByZXZpb3VzIGFwcCBieSBjYWxsaW5nIFxcYGFwcC51bm1vdW50KClcXGAgZmlyc3QuYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3Qgdm5vZGUgPSBjcmVhdGVWTm9kZShyb290Q29tcG9uZW50LCByb290UHJvcHMpO1xuICAgICAgICAgIHZub2RlLmFwcENvbnRleHQgPSBjb250ZXh0O1xuICAgICAgICAgIGlmIChuYW1lc3BhY2UgPT09IHRydWUpIHtcbiAgICAgICAgICAgIG5hbWVzcGFjZSA9IFwic3ZnXCI7XG4gICAgICAgICAgfSBlbHNlIGlmIChuYW1lc3BhY2UgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBuYW1lc3BhY2UgPSB2b2lkIDA7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgICBjb250ZXh0LnJlbG9hZCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgcmVuZGVyKFxuICAgICAgICAgICAgICAgIGNsb25lVk5vZGUodm5vZGUpLFxuICAgICAgICAgICAgICAgIHJvb3RDb250YWluZXIsXG4gICAgICAgICAgICAgICAgbmFtZXNwYWNlXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaXNIeWRyYXRlICYmIGh5ZHJhdGUpIHtcbiAgICAgICAgICAgIGh5ZHJhdGUodm5vZGUsIHJvb3RDb250YWluZXIpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZW5kZXIodm5vZGUsIHJvb3RDb250YWluZXIsIG5hbWVzcGFjZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlzTW91bnRlZCA9IHRydWU7XG4gICAgICAgICAgYXBwLl9jb250YWluZXIgPSByb290Q29udGFpbmVyO1xuICAgICAgICAgIHJvb3RDb250YWluZXIuX192dWVfYXBwX18gPSBhcHA7XG4gICAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgX19WVUVfUFJPRF9ERVZUT09MU19fKSB7XG4gICAgICAgICAgICBhcHAuX2luc3RhbmNlID0gdm5vZGUuY29tcG9uZW50O1xuICAgICAgICAgICAgZGV2dG9vbHNJbml0QXBwKGFwcCwgdmVyc2lvbik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBnZXRDb21wb25lbnRQdWJsaWNJbnN0YW5jZSh2bm9kZS5jb21wb25lbnQpO1xuICAgICAgICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICB3YXJuJDEoXG4gICAgICAgICAgICBgQXBwIGhhcyBhbHJlYWR5IGJlZW4gbW91bnRlZC5cbklmIHlvdSB3YW50IHRvIHJlbW91bnQgdGhlIHNhbWUgYXBwLCBtb3ZlIHlvdXIgYXBwIGNyZWF0aW9uIGxvZ2ljIGludG8gYSBmYWN0b3J5IGZ1bmN0aW9uIGFuZCBjcmVhdGUgZnJlc2ggYXBwIGluc3RhbmNlcyBmb3IgZWFjaCBtb3VudCAtIGUuZy4gXFxgY29uc3QgY3JlYXRlTXlBcHAgPSAoKSA9PiBjcmVhdGVBcHAoQXBwKVxcYGBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgdW5tb3VudCgpIHtcbiAgICAgICAgaWYgKGlzTW91bnRlZCkge1xuICAgICAgICAgIHJlbmRlcihudWxsLCBhcHAuX2NvbnRhaW5lcik7XG4gICAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgX19WVUVfUFJPRF9ERVZUT09MU19fKSB7XG4gICAgICAgICAgICBhcHAuX2luc3RhbmNlID0gbnVsbDtcbiAgICAgICAgICAgIGRldnRvb2xzVW5tb3VudEFwcChhcHApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBkZWxldGUgYXBwLl9jb250YWluZXIuX192dWVfYXBwX187XG4gICAgICAgIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgIHdhcm4kMShgQ2Fubm90IHVubW91bnQgYW4gYXBwIHRoYXQgaXMgbm90IG1vdW50ZWQuYCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBwcm92aWRlKGtleSwgdmFsdWUpIHtcbiAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYga2V5IGluIGNvbnRleHQucHJvdmlkZXMpIHtcbiAgICAgICAgICB3YXJuJDEoXG4gICAgICAgICAgICBgQXBwIGFscmVhZHkgcHJvdmlkZXMgcHJvcGVydHkgd2l0aCBrZXkgXCIke1N0cmluZyhrZXkpfVwiLiBJdCB3aWxsIGJlIG92ZXJ3cml0dGVuIHdpdGggdGhlIG5ldyB2YWx1ZS5gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBjb250ZXh0LnByb3ZpZGVzW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGFwcDtcbiAgICAgIH0sXG4gICAgICBydW5XaXRoQ29udGV4dChmbikge1xuICAgICAgICBjb25zdCBsYXN0QXBwID0gY3VycmVudEFwcDtcbiAgICAgICAgY3VycmVudEFwcCA9IGFwcDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gZm4oKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBjdXJyZW50QXBwID0gbGFzdEFwcDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIGFwcDtcbiAgfTtcbn1cbmxldCBjdXJyZW50QXBwID0gbnVsbDtcblxuZnVuY3Rpb24gcHJvdmlkZShrZXksIHZhbHVlKSB7XG4gIGlmICghY3VycmVudEluc3RhbmNlKSB7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgIHdhcm4kMShgcHJvdmlkZSgpIGNhbiBvbmx5IGJlIHVzZWQgaW5zaWRlIHNldHVwKCkuYCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGxldCBwcm92aWRlcyA9IGN1cnJlbnRJbnN0YW5jZS5wcm92aWRlcztcbiAgICBjb25zdCBwYXJlbnRQcm92aWRlcyA9IGN1cnJlbnRJbnN0YW5jZS5wYXJlbnQgJiYgY3VycmVudEluc3RhbmNlLnBhcmVudC5wcm92aWRlcztcbiAgICBpZiAocGFyZW50UHJvdmlkZXMgPT09IHByb3ZpZGVzKSB7XG4gICAgICBwcm92aWRlcyA9IGN1cnJlbnRJbnN0YW5jZS5wcm92aWRlcyA9IE9iamVjdC5jcmVhdGUocGFyZW50UHJvdmlkZXMpO1xuICAgIH1cbiAgICBwcm92aWRlc1trZXldID0gdmFsdWU7XG4gIH1cbn1cbmZ1bmN0aW9uIGluamVjdChrZXksIGRlZmF1bHRWYWx1ZSwgdHJlYXREZWZhdWx0QXNGYWN0b3J5ID0gZmFsc2UpIHtcbiAgY29uc3QgaW5zdGFuY2UgPSBjdXJyZW50SW5zdGFuY2UgfHwgY3VycmVudFJlbmRlcmluZ0luc3RhbmNlO1xuICBpZiAoaW5zdGFuY2UgfHwgY3VycmVudEFwcCkge1xuICAgIGNvbnN0IHByb3ZpZGVzID0gaW5zdGFuY2UgPyBpbnN0YW5jZS5wYXJlbnQgPT0gbnVsbCA/IGluc3RhbmNlLnZub2RlLmFwcENvbnRleHQgJiYgaW5zdGFuY2Uudm5vZGUuYXBwQ29udGV4dC5wcm92aWRlcyA6IGluc3RhbmNlLnBhcmVudC5wcm92aWRlcyA6IGN1cnJlbnRBcHAuX2NvbnRleHQucHJvdmlkZXM7XG4gICAgaWYgKHByb3ZpZGVzICYmIGtleSBpbiBwcm92aWRlcykge1xuICAgICAgcmV0dXJuIHByb3ZpZGVzW2tleV07XG4gICAgfSBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgcmV0dXJuIHRyZWF0RGVmYXVsdEFzRmFjdG9yeSAmJiBpc0Z1bmN0aW9uKGRlZmF1bHRWYWx1ZSkgPyBkZWZh
20578dWx0VmFsdWUuY2FsbChpbnN0YW5jZSAmJiBpbnN0YW5jZS5wcm94eSkgOiBkZWZhdWx0VmFsdWU7XG4gICAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICB3YXJuJDEoYGluamVjdGlvbiBcIiR7U3RyaW5nKGtleSl9XCIgbm90IGZvdW5kLmApO1xuICAgIH1cbiAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgd2FybiQxKGBpbmplY3QoKSBjYW4gb25seSBiZSB1c2VkIGluc2lkZSBzZXR1cCgpIG9yIGZ1bmN0aW9uYWwgY29tcG9uZW50cy5gKTtcbiAgfVxufVxuZnVuY3Rpb24gaGFzSW5qZWN0aW9uQ29udGV4dCgpIHtcbiAgcmV0dXJuICEhKGN1cnJlbnRJbnN0YW5jZSB8fCBjdXJyZW50UmVuZGVyaW5nSW5zdGFuY2UgfHwgY3VycmVudEFwcCk7XG59XG5cbmNvbnN0IGludGVybmFsT2JqZWN0UHJvdG8gPSB7fTtcbmNvbnN0IGNyZWF0ZUludGVybmFsT2JqZWN0ID0gKCkgPT4gT2JqZWN0LmNyZWF0ZShpbnRlcm5hbE9iamVjdFByb3RvKTtcbmNvbnN0IGlzSW50ZXJuYWxPYmplY3QgPSAob2JqKSA9PiBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqKSA9PT0gaW50ZXJuYWxPYmplY3RQcm90bztcblxuZnVuY3Rpb24gaW5pdFByb3BzKGluc3RhbmNlLCByYXdQcm9wcywgaXNTdGF0ZWZ1bCwgaXNTU1IgPSBmYWxzZSkge1xuICBjb25zdCBwcm9wcyA9IHt9O1xuICBjb25zdCBhdHRycyA9IGNyZWF0ZUludGVybmFsT2JqZWN0KCk7XG4gIGluc3RhbmNlLnByb3BzRGVmYXVsdHMgPSAvKiBAX19QVVJFX18gKi8gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgc2V0RnVsbFByb3BzKGluc3RhbmNlLCByYXdQcm9wcywgcHJvcHMsIGF0dHJzKTtcbiAgZm9yIChjb25zdCBrZXkgaW4gaW5zdGFuY2UucHJvcHNPcHRpb25zWzBdKSB7XG4gICAgaWYgKCEoa2V5IGluIHByb3BzKSkge1xuICAgICAgcHJvcHNba2V5XSA9IHZvaWQgMDtcbiAgICB9XG4gIH1cbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICB2YWxpZGF0ZVByb3BzKHJhd1Byb3BzIHx8IHt9LCBwcm9wcywgaW5zdGFuY2UpO1xuICB9XG4gIGlmIChpc1N0YXRlZnVsKSB7XG4gICAgaW5zdGFuY2UucHJvcHMgPSBpc1NTUiA/IHByb3BzIDogc2hhbGxvd1JlYWN0aXZlKHByb3BzKTtcbiAgfSBlbHNlIHtcbiAgICBpZiAoIWluc3RhbmNlLnR5cGUucHJvcHMpIHtcbiAgICAgIGluc3RhbmNlLnByb3BzID0gYXR0cnM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGluc3RhbmNlLnByb3BzID0gcHJvcHM7XG4gICAgfVxuICB9XG4gIGluc3RhbmNlLmF0dHJzID0gYXR0cnM7XG59XG5mdW5jdGlvbiBpc0luSG1yQ29udGV4dChpbnN0YW5jZSkge1xuICB3aGlsZSAoaW5zdGFuY2UpIHtcbiAgICBpZiAoaW5zdGFuY2UudHlwZS5fX2htcklkKSByZXR1cm4gdHJ1ZTtcbiAgICBpbnN0YW5jZSA9IGluc3RhbmNlLnBhcmVudDtcbiAgfVxufVxuZnVuY3Rpb24gdXBkYXRlUHJvcHMoaW5zdGFuY2UsIHJhd1Byb3BzLCByYXdQcmV2UHJvcHMsIG9wdGltaXplZCkge1xuICBjb25zdCB7XG4gICAgcHJvcHMsXG4gICAgYXR0cnMsXG4gICAgdm5vZGU6IHsgcGF0Y2hGbGFnIH1cbiAgfSA9IGluc3RhbmNlO1xuICBjb25zdCByYXdDdXJyZW50UHJvcHMgPSB0b1Jhdyhwcm9wcyk7XG4gIGNvbnN0IFtvcHRpb25zXSA9IGluc3RhbmNlLnByb3BzT3B0aW9ucztcbiAgbGV0IGhhc0F0dHJzQ2hhbmdlZCA9IGZhbHNlO1xuICBpZiAoXG4gICAgLy8gYWx3YXlzIGZvcmNlIGZ1bGwgZGlmZiBpbiBkZXZcbiAgICAvLyAtICMxOTQyIGlmIGhtciBpcyBlbmFibGVkIHdpdGggc2ZjIGNvbXBvbmVudFxuICAgIC8vIC0gdml0ZSM4NzIgbm9uLXNmYyBjb21wb25lbnQgdXNlZCBieSBzZmMgY29tcG9uZW50XG4gICAgISghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIGlzSW5IbXJDb250ZXh0KGluc3RhbmNlKSkgJiYgKG9wdGltaXplZCB8fCBwYXRjaEZsYWcgPiAwKSAmJiAhKHBhdGNoRmxhZyAmIDE2KVxuICApIHtcbiAgICBpZiAocGF0Y2hGbGFnICYgOCkge1xuICAgICAgY29uc3QgcHJvcHNUb1VwZGF0ZSA9IGluc3RhbmNlLnZub2RlLmR5bmFtaWNQcm9wcztcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJvcHNUb1VwZGF0ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQga2V5ID0gcHJvcHNUb1VwZGF0ZVtpXTtcbiAgICAgICAgaWYgKGlzRW1pdExpc3RlbmVyKGluc3RhbmNlLmVtaXRzT3B0aW9ucywga2V5KSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZhbHVlID0gcmF3UHJvcHNba2V5XTtcbiAgICAgICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgICAgICBpZiAoaGFzT3duKGF0dHJzLCBrZXkpKSB7XG4gICAgICAgICAgICBpZiAodmFsdWUgIT09IGF0dHJzW2tleV0pIHtcbiAgICAgICAgICAgICAgYXR0cnNba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgICBoYXNBdHRyc0NoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBjYW1lbGl6ZWRLZXkgPSBjYW1lbGl6ZShrZXkpO1xuICAgICAgICAgICAgcHJvcHNbY2FtZWxpemVkS2V5XSA9IHJlc29sdmVQcm9wVmFsdWUoXG4gICAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgICAgIHJhd0N1cnJlbnRQcm9wcyxcbiAgICAgICAgICAgICAgY2FtZWxpemVkS2V5LFxuICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgICAgICAgIGZhbHNlXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAodmFsdWUgIT09IGF0dHJzW2tleV0pIHtcbiAgICAgICAgICAgIGF0dHJzW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgIGhhc0F0dHJzQ2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChzZXRGdWxsUHJvcHMoaW5zdGFuY2UsIHJhd1Byb3BzLCBwcm9wcywgYXR0cnMpKSB7XG4gICAgICBoYXNBdHRyc0NoYW5nZWQgPSB0cnVlO1xuICAgIH1cbiAgICBsZXQga2ViYWJLZXk7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gcmF3Q3VycmVudFByb3BzKSB7XG4gICAgICBpZiAoIXJhd1Byb3BzIHx8IC8vIGZvciBjYW1lbENhc2VcbiAgICAgIC
20578FoYXNPd24ocmF3UHJvcHMsIGtleSkgJiYgLy8gaXQncyBwb3NzaWJsZSB0aGUgb3JpZ2luYWwgcHJvcHMgd2FzIHBhc3NlZCBpbiBhcyBrZWJhYi1jYXNlXG4gICAgICAvLyBhbmQgY29udmVydGVkIHRvIGNhbWVsQ2FzZSAoIzk1NSlcbiAgICAgICgoa2ViYWJLZXkgPSBoeXBoZW5hdGUoa2V5KSkgPT09IGtleSB8fCAhaGFzT3duKHJhd1Byb3BzLCBrZWJhYktleSkpKSB7XG4gICAgICAgIGlmIChvcHRpb25zKSB7XG4gICAgICAgICAgaWYgKHJhd1ByZXZQcm9wcyAmJiAvLyBmb3IgY2FtZWxDYXNlXG4gICAgICAgICAgKHJhd1ByZXZQcm9wc1trZXldICE9PSB2b2lkIDAgfHwgLy8gZm9yIGtlYmFiLWNhc2VcbiAgICAgICAgICByYXdQcmV2UHJvcHNba2ViYWJLZXldICE9PSB2b2lkIDApKSB7XG4gICAgICAgICAgICBwcm9wc1trZXldID0gcmVzb2x2ZVByb3BWYWx1ZShcbiAgICAgICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICAgICAgcmF3Q3VycmVudFByb3BzLFxuICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgIHZvaWQgMCxcbiAgICAgICAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgICAgICAgIHRydWVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRlbGV0ZSBwcm9wc1trZXldO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChhdHRycyAhPT0gcmF3Q3VycmVudFByb3BzKSB7XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBhdHRycykge1xuICAgICAgICBpZiAoIXJhd1Byb3BzIHx8ICFoYXNPd24ocmF3UHJvcHMsIGtleSkgJiYgdHJ1ZSkge1xuICAgICAgICAgIGRlbGV0ZSBhdHRyc1trZXldO1xuICAgICAgICAgIGhhc0F0dHJzQ2hhbmdlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKGhhc0F0dHJzQ2hhbmdlZCkge1xuICAgIHRyaWdnZXIoaW5zdGFuY2UuYXR0cnMsIFwic2V0XCIsIFwiXCIpO1xuICB9XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgdmFsaWRhdGVQcm9wcyhyYXdQcm9wcyB8fCB7fSwgcHJvcHMsIGluc3RhbmNlKTtcbiAgfVxufVxuZnVuY3Rpb24gc2V0RnVsbFByb3BzKGluc3RhbmNlLCByYXdQcm9wcywgcHJvcHMsIGF0dHJzKSB7XG4gIGNvbnN0IFtvcHRpb25zLCBuZWVkQ2FzdEtleXNdID0gaW5zdGFuY2UucHJvcHNPcHRpb25zO1xuICBsZXQgaGFzQXR0cnNDaGFuZ2VkID0gZmFsc2U7XG4gIGxldCByYXdDYXN0VmFsdWVzO1xuICBpZiAocmF3UHJvcHMpIHtcbiAgICBmb3IgKGxldCBrZXkgaW4gcmF3UHJvcHMpIHtcbiAgICAgIGlmIChpc1Jlc2VydmVkUHJvcChrZXkpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgdmFsdWUgPSByYXdQcm9wc1trZXldO1xuICAgICAgbGV0IGNhbWVsS2V5O1xuICAgICAgaWYgKG9wdGlvbnMgJiYgaGFzT3duKG9wdGlvbnMsIGNhbWVsS2V5ID0gY2FtZWxpemUoa2V5KSkpIHtcbiAgICAgICAgaWYgKCFuZWVkQ2FzdEtleXMgfHwgIW5lZWRDYXN0S2V5cy5pbmNsdWRlcyhjYW1lbEtleSkpIHtcbiAgICAgICAgICBwcm9wc1tjYW1lbEtleV0gPSB2YWx1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAocmF3Q2FzdFZhbHVlcyB8fCAocmF3Q2FzdFZhbHVlcyA9IHt9KSlbY2FtZWxLZXldID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoIWlzRW1pdExpc3RlbmVyKGluc3RhbmNlLmVtaXRzT3B0aW9ucywga2V5KSkge1xuICAgICAgICBpZiAoIShrZXkgaW4gYXR0cnMpIHx8IHZhbHVlICE9PSBhdHRyc1trZXldKSB7XG4gICAgICAgICAgYXR0cnNba2V5XSA9IHZhbHVlO1xuICAgICAgICAgIGhhc0F0dHJzQ2hhbmdlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKG5lZWRDYXN0S2V5cykge1xuICAgIGNvbnN0IHJhd0N1cnJlbnRQcm9wcyA9IHRvUmF3KHByb3BzKTtcbiAgICBjb25zdCBjYXN0VmFsdWVzID0gcmF3Q2FzdFZhbHVlcyB8fCBFTVBUWV9PQko7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuZWVkQ2FzdEtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGtleSA9IG5lZWRDYXN0S2V5c1tpXTtcbiAgICAgIHByb3BzW2tleV0gPSByZXNvbHZlUHJvcFZhbHVlKFxuICAgICAgICBvcHRpb25zLFxuICAgICAgICByYXdDdXJyZW50UHJvcHMsXG4gICAgICAgIGtleSxcbiAgICAgICAgY2FzdFZhbHVlc1trZXldLFxuICAgICAgICBpbnN0YW5jZSxcbiAgICAgICAgIWhhc093bihjYXN0VmFsdWVzLCBrZXkpXG4gICAgICApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gaGFzQXR0cnNDaGFuZ2VkO1xufVxuZnVuY3Rpb24gcmVzb2x2ZVByb3BWYWx1ZShvcHRpb25zLCBwcm9wcywga2V5LCB2YWx1ZSwgaW5zdGFuY2UsIGlzQWJzZW50KSB7XG4gIGNvbnN0IG9wdCA9IG9wdGlvbnNba2V5XTtcbiAgaWYgKG9wdCAhPSBudWxsKSB7XG4gICAgY29uc3QgaGFzRGVmYXVsdCA9IGhhc093bihvcHQsIFwiZGVmYXVsdFwiKTtcbiAgICBpZiAoaGFzRGVmYXVsdCAmJiB2YWx1ZSA9PT0gdm9pZCAwKSB7XG4gICAgICBjb25zdCBkZWZhdWx0VmFsdWUgPSBvcHQuZGVmYXVsdDtcbiAgICAgIGlmIChvcHQudHlwZSAhPT0gRnVuY3Rpb24gJiYgIW9wdC5za2lwRmFjdG9yeSAmJiBpc0Z1bmN0aW9uKGRlZmF1bHRWYWx1ZSkpIHtcbiAgICAgICAgY29uc3QgeyBwcm9wc0RlZmF1bHRzIH0gPSBpbnN0YW5jZTtcbiAgICAgICAgaWYgKGtleSBpbiBwcm9wc0RlZmF1bHRzKSB7XG4gICAgICAgICAgdmFsdWUgPSBwcm9wc0RlZmF1bHRzW2tleV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgcmVzZXQgPSBzZXRDdXJyZW50SW5zdGFuY2UoaW5zdGFuY2UpO1xuICAgICAgICAgIHZhbHVlID0gcHJvcHNEZWZhdWx0c1trZXldID0gZGVmYXVsdFZhbHVlLmNhbGwoXG4gICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgcHJvcHNcbiAgICAgICAgICApO1xuICAgICAgICAgIHJlc2V0KCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgI
20578HZhbHVlID0gZGVmYXVsdFZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAob3B0WzAgLyogc2hvdWxkQ2FzdCAqL10pIHtcbiAgICAgIGlmIChpc0Fic2VudCAmJiAhaGFzRGVmYXVsdCkge1xuICAgICAgICB2YWx1ZSA9IGZhbHNlO1xuICAgICAgfSBlbHNlIGlmIChvcHRbMSAvKiBzaG91bGRDYXN0VHJ1ZSAqL10gJiYgKHZhbHVlID09PSBcIlwiIHx8IHZhbHVlID09PSBoeXBoZW5hdGUoa2V5KSkpIHtcbiAgICAgICAgdmFsdWUgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5jb25zdCBtaXhpblByb3BzQ2FjaGUgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKTtcbmZ1bmN0aW9uIG5vcm1hbGl6ZVByb3BzT3B0aW9ucyhjb21wLCBhcHBDb250ZXh0LCBhc01peGluID0gZmFsc2UpIHtcbiAgY29uc3QgY2FjaGUgPSBfX1ZVRV9PUFRJT05TX0FQSV9fICYmIGFzTWl4aW4gPyBtaXhpblByb3BzQ2FjaGUgOiBhcHBDb250ZXh0LnByb3BzQ2FjaGU7XG4gIGNvbnN0IGNhY2hlZCA9IGNhY2hlLmdldChjb21wKTtcbiAgaWYgKGNhY2hlZCkge1xuICAgIHJldHVybiBjYWNoZWQ7XG4gIH1cbiAgY29uc3QgcmF3ID0gY29tcC5wcm9wcztcbiAgY29uc3Qgbm9ybWFsaXplZCA9IHt9O1xuICBjb25zdCBuZWVkQ2FzdEtleXMgPSBbXTtcbiAgbGV0IGhhc0V4dGVuZHMgPSBmYWxzZTtcbiAgaWYgKF9fVlVFX09QVElPTlNfQVBJX18gJiYgIWlzRnVuY3Rpb24oY29tcCkpIHtcbiAgICBjb25zdCBleHRlbmRQcm9wcyA9IChyYXcyKSA9PiB7XG4gICAgICBoYXNFeHRlbmRzID0gdHJ1ZTtcbiAgICAgIGNvbnN0IFtwcm9wcywga2V5c10gPSBub3JtYWxpemVQcm9wc09wdGlvbnMocmF3MiwgYXBwQ29udGV4dCwgdHJ1ZSk7XG4gICAgICBleHRlbmQobm9ybWFsaXplZCwgcHJvcHMpO1xuICAgICAgaWYgKGtleXMpIG5lZWRDYXN0S2V5cy5wdXNoKC4uLmtleXMpO1xuICAgIH07XG4gICAgaWYgKCFhc01peGluICYmIGFwcENvbnRleHQubWl4aW5zLmxlbmd0aCkge1xuICAgICAgYXBwQ29udGV4dC5taXhpbnMuZm9yRWFjaChleHRlbmRQcm9wcyk7XG4gICAgfVxuICAgIGlmIChjb21wLmV4dGVuZHMpIHtcbiAgICAgIGV4dGVuZFByb3BzKGNvbXAuZXh0ZW5kcyk7XG4gICAgfVxuICAgIGlmIChjb21wLm1peGlucykge1xuICAgICAgY29tcC5taXhpbnMuZm9yRWFjaChleHRlbmRQcm9wcyk7XG4gICAgfVxuICB9XG4gIGlmICghcmF3ICYmICFoYXNFeHRlbmRzKSB7XG4gICAgaWYgKGlzT2JqZWN0KGNvbXApKSB7XG4gICAgICBjYWNoZS5zZXQoY29tcCwgRU1QVFlfQVJSKTtcbiAgICB9XG4gICAgcmV0dXJuIEVNUFRZX0FSUjtcbiAgfVxuICBpZiAoaXNBcnJheShyYXcpKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByYXcubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmICFpc1N0cmluZyhyYXdbaV0pKSB7XG4gICAgICAgIHdhcm4kMShgcHJvcHMgbXVzdCBiZSBzdHJpbmdzIHdoZW4gdXNpbmcgYXJyYXkgc3ludGF4LmAsIHJhd1tpXSk7XG4gICAgICB9XG4gICAgICBjb25zdCBub3JtYWxpemVkS2V5ID0gY2FtZWxpemUocmF3W2ldKTtcbiAgICAgIGlmICh2YWxpZGF0ZVByb3BOYW1lKG5vcm1hbGl6ZWRLZXkpKSB7XG4gICAgICAgIG5vcm1hbGl6ZWRbbm9ybWFsaXplZEtleV0gPSBFTVBUWV9PQko7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKHJhdykge1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmICFpc09iamVjdChyYXcpKSB7XG4gICAgICB3YXJuJDEoYGludmFsaWQgcHJvcHMgb3B0aW9uc2AsIHJhdyk7XG4gICAgfVxuICAgIGZvciAoY29uc3Qga2V5IGluIHJhdykge1xuICAgICAgY29uc3Qgbm9ybWFsaXplZEtleSA9IGNhbWVsaXplKGtleSk7XG4gICAgICBpZiAodmFsaWRhdGVQcm9wTmFtZShub3JtYWxpemVkS2V5KSkge1xuICAgICAgICBjb25zdCBvcHQgPSByYXdba2V5XTtcbiAgICAgICAgY29uc3QgcHJvcCA9IG5vcm1hbGl6ZWRbbm9ybWFsaXplZEtleV0gPSBpc0FycmF5KG9wdCkgfHwgaXNGdW5jdGlvbihvcHQpID8geyB0eXBlOiBvcHQgfSA6IGV4dGVuZCh7fSwgb3B0KTtcbiAgICAgICAgaWYgKHByb3ApIHtcbiAgICAgICAgICBjb25zdCBib29sZWFuSW5kZXggPSBnZXRUeXBlSW5kZXgoQm9vbGVhbiwgcHJvcC50eXBlKTtcbiAgICAgICAgICBjb25zdCBzdHJpbmdJbmRleCA9IGdldFR5cGVJbmRleChTdHJpbmcsIHByb3AudHlwZSk7XG4gICAgICAgICAgcHJvcFswIC8qIHNob3VsZENhc3QgKi9dID0gYm9vbGVhbkluZGV4ID4gLTE7XG4gICAgICAgICAgcHJvcFsxIC8qIHNob3VsZENhc3RUcnVlICovXSA9IHN0cmluZ0luZGV4IDwgMCB8fCBib29sZWFuSW5kZXggPCBzdHJpbmdJbmRleDtcbiAgICAgICAgICBpZiAoYm9vbGVhbkluZGV4ID4gLTEgfHwgaGFzT3duKHByb3AsIFwiZGVmYXVsdFwiKSkge1xuICAgICAgICAgICAgbmVlZENhc3RLZXlzLnB1c2gobm9ybWFsaXplZEtleSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGNvbnN0IHJlcyA9IFtub3JtYWxpemVkLCBuZWVkQ2FzdEtleXNdO1xuICBpZiAoaXNPYmplY3QoY29tcCkpIHtcbiAgICBjYWNoZS5zZXQoY29tcCwgcmVzKTtcbiAgfVxuICByZXR1cm4gcmVzO1xufVxuZnVuY3Rpb24gdmFsaWRhdGVQcm9wTmFtZShrZXkpIHtcbiAgaWYgKGtleVswXSAhPT0gXCIkXCIgJiYgIWlzUmVzZXJ2ZWRQcm9wKGtleSkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgd2FybiQxKGBJbnZhbGlkIHByb3AgbmFtZTogXCIke2tleX1cIiBpcyBhIHJlc2VydmVkIHByb3BlcnR5LmApO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGdldFR5cGUoY3Rvcikge1xuICBpZiAoY3RvciA9PT0gbnVsbCkge1xuICAgIHJldHVybiBcIm51bGxcIjtcbiAgfVxuICBpZiAodHlwZW9mIGN0b3IgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIHJldHVybi
20578BjdG9yLm5hbWUgfHwgXCJcIjtcbiAgfSBlbHNlIGlmICh0eXBlb2YgY3RvciA9PT0gXCJvYmplY3RcIikge1xuICAgIGNvbnN0IG5hbWUgPSBjdG9yLmNvbnN0cnVjdG9yICYmIGN0b3IuY29uc3RydWN0b3IubmFtZTtcbiAgICByZXR1cm4gbmFtZSB8fCBcIlwiO1xuICB9XG4gIHJldHVybiBcIlwiO1xufVxuZnVuY3Rpb24gaXNTYW1lVHlwZShhLCBiKSB7XG4gIHJldHVybiBnZXRUeXBlKGEpID09PSBnZXRUeXBlKGIpO1xufVxuZnVuY3Rpb24gZ2V0VHlwZUluZGV4KHR5cGUsIGV4cGVjdGVkVHlwZXMpIHtcbiAgaWYgKGlzQXJyYXkoZXhwZWN0ZWRUeXBlcykpIHtcbiAgICByZXR1cm4gZXhwZWN0ZWRUeXBlcy5maW5kSW5kZXgoKHQpID0+IGlzU2FtZVR5cGUodCwgdHlwZSkpO1xuICB9IGVsc2UgaWYgKGlzRnVuY3Rpb24oZXhwZWN0ZWRUeXBlcykpIHtcbiAgICByZXR1cm4gaXNTYW1lVHlwZShleHBlY3RlZFR5cGVzLCB0eXBlKSA/IDAgOiAtMTtcbiAgfVxuICByZXR1cm4gLTE7XG59XG5mdW5jdGlvbiB2YWxpZGF0ZVByb3BzKHJhd1Byb3BzLCBwcm9wcywgaW5zdGFuY2UpIHtcbiAgY29uc3QgcmVzb2x2ZWRWYWx1ZXMgPSB0b1Jhdyhwcm9wcyk7XG4gIGNvbnN0IG9wdGlvbnMgPSBpbnN0YW5jZS5wcm9wc09wdGlvbnNbMF07XG4gIGZvciAoY29uc3Qga2V5IGluIG9wdGlvbnMpIHtcbiAgICBsZXQgb3B0ID0gb3B0aW9uc1trZXldO1xuICAgIGlmIChvcHQgPT0gbnVsbCkgY29udGludWU7XG4gICAgdmFsaWRhdGVQcm9wKFxuICAgICAga2V5LFxuICAgICAgcmVzb2x2ZWRWYWx1ZXNba2V5XSxcbiAgICAgIG9wdCxcbiAgICAgICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBzaGFsbG93UmVhZG9ubHkocmVzb2x2ZWRWYWx1ZXMpIDogcmVzb2x2ZWRWYWx1ZXMsXG4gICAgICAhaGFzT3duKHJhd1Byb3BzLCBrZXkpICYmICFoYXNPd24ocmF3UHJvcHMsIGh5cGhlbmF0ZShrZXkpKVxuICAgICk7XG4gIH1cbn1cbmZ1bmN0aW9uIHZhbGlkYXRlUHJvcChuYW1lLCB2YWx1ZSwgcHJvcCwgcHJvcHMsIGlzQWJzZW50KSB7XG4gIGNvbnN0IHsgdHlwZSwgcmVxdWlyZWQsIHZhbGlkYXRvciwgc2tpcENoZWNrIH0gPSBwcm9wO1xuICBpZiAocmVxdWlyZWQgJiYgaXNBYnNlbnQpIHtcbiAgICB3YXJuJDEoJ01pc3NpbmcgcmVxdWlyZWQgcHJvcDogXCInICsgbmFtZSArICdcIicpO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAodmFsdWUgPT0gbnVsbCAmJiAhcmVxdWlyZWQpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKHR5cGUgIT0gbnVsbCAmJiB0eXBlICE9PSB0cnVlICYmICFza2lwQ2hlY2spIHtcbiAgICBsZXQgaXNWYWxpZCA9IGZhbHNlO1xuICAgIGNvbnN0IHR5cGVzID0gaXNBcnJheSh0eXBlKSA/IHR5cGUgOiBbdHlwZV07XG4gICAgY29uc3QgZXhwZWN0ZWRUeXBlcyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoICYmICFpc1ZhbGlkOyBpKyspIHtcbiAgICAgIGNvbnN0IHsgdmFsaWQsIGV4cGVjdGVkVHlwZSB9ID0gYXNzZXJ0VHlwZSh2YWx1ZSwgdHlwZXNbaV0pO1xuICAgICAgZXhwZWN0ZWRUeXBlcy5wdXNoKGV4cGVjdGVkVHlwZSB8fCBcIlwiKTtcbiAgICAgIGlzVmFsaWQgPSB2YWxpZDtcbiAgICB9XG4gICAgaWYgKCFpc1ZhbGlkKSB7XG4gICAgICB3YXJuJDEoZ2V0SW52YWxpZFR5cGVNZXNzYWdlKG5hbWUsIHZhbHVlLCBleHBlY3RlZFR5cGVzKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG4gIGlmICh2YWxpZGF0b3IgJiYgIXZhbGlkYXRvcih2YWx1ZSwgcHJvcHMpKSB7XG4gICAgd2FybiQxKCdJbnZhbGlkIHByb3A6IGN1c3RvbSB2YWxpZGF0b3IgY2hlY2sgZmFpbGVkIGZvciBwcm9wIFwiJyArIG5hbWUgKyAnXCIuJyk7XG4gIH1cbn1cbmNvbnN0IGlzU2ltcGxlVHlwZSA9IC8qIEBfX1BVUkVfXyAqLyBtYWtlTWFwKFxuICBcIlN0cmluZyxOdW1iZXIsQm9vbGVhbixGdW5jdGlvbixTeW1ib2wsQmlnSW50XCJcbik7XG5mdW5jdGlvbiBhc3NlcnRUeXBlKHZhbHVlLCB0eXBlKSB7XG4gIGxldCB2YWxpZDtcbiAgY29uc3QgZXhwZWN0ZWRUeXBlID0gZ2V0VHlwZSh0eXBlKTtcbiAgaWYgKGlzU2ltcGxlVHlwZShleHBlY3RlZFR5cGUpKSB7XG4gICAgY29uc3QgdCA9IHR5cGVvZiB2YWx1ZTtcbiAgICB2YWxpZCA9IHQgPT09IGV4cGVjdGVkVHlwZS50b0xvd2VyQ2FzZSgpO1xuICAgIGlmICghdmFsaWQgJiYgdCA9PT0gXCJvYmplY3RcIikge1xuICAgICAgdmFsaWQgPSB2YWx1ZSBpbnN0YW5jZW9mIHR5cGU7XG4gICAgfVxuICB9IGVsc2UgaWYgKGV4cGVjdGVkVHlwZSA9PT0gXCJPYmplY3RcIikge1xuICAgIHZhbGlkID0gaXNPYmplY3QodmFsdWUpO1xuICB9IGVsc2UgaWYgKGV4cGVjdGVkVHlwZSA9PT0gXCJBcnJheVwiKSB7XG4gICAgdmFsaWQgPSBpc0FycmF5KHZhbHVlKTtcbiAgfSBlbHNlIGlmIChleHBlY3RlZFR5cGUgPT09IFwibnVsbFwiKSB7XG4gICAgdmFsaWQgPSB2YWx1ZSA9PT0gbnVsbDtcbiAgfSBlbHNlIHtcbiAgICB2YWxpZCA9IHZhbHVlIGluc3RhbmNlb2YgdHlwZTtcbiAgfVxuICByZXR1cm4ge1xuICAgIHZhbGlkLFxuICAgIGV4cGVjdGVkVHlwZVxuICB9O1xufVxuZnVuY3Rpb24gZ2V0SW52YWxpZFR5cGVNZXNzYWdlKG5hbWUsIHZhbHVlLCBleHBlY3RlZFR5cGVzKSB7XG4gIGlmIChleHBlY3RlZFR5cGVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBgUHJvcCB0eXBlIFtdIGZvciBwcm9wIFwiJHtuYW1lfVwiIHdvbid0IG1hdGNoIGFueXRoaW5nLiBEaWQgeW91IG1lYW4gdG8gdXNlIHR5cGUgQXJyYXkgaW5zdGVhZD9gO1xuICB9XG4gIGxldCBtZXNzYWdlID0gYEludmFsaWQgcHJvcDogdHlwZSBjaGVjayBmYWlsZWQgZm9yIHByb3AgXCIke25hbWV9XCIuIEV4cGVjdGVkICR7ZXhwZWN0ZWRUeXBlcy5tYXAoY2FwaXRhbGl6ZSkuam9pbihcIiB8IFwiKX1gO1xuICBjb25zdCBleHBlY3RlZFR5cGUgPSBleHBlY3RlZFR5cGVzWzBdO1xuICBjb25zdCByZWNlaXZlZFR5cGUgPSB0b1Jhd1R5cGUodmFsdWUpO1xuICBjb25zdCBleHBlY3RlZFZhbHVlID0gc3R5bGVWYWx1ZSh2YWx1ZSwgZXhwZWN0ZWRUeXBlKTtcbiAgY29uc3QgcmVjZWl2ZWRWYWx1ZSA9IHN0eWxlVmFsdWUodmFsdWUsIHJlY2VpdmVkVHlwZSk7XG4gIGlmIChleHBlY3RlZFR5cGVzLmxlbmd0aCA9PT0gMSAmJi
20578Bpc0V4cGxpY2FibGUoZXhwZWN0ZWRUeXBlKSAmJiAhaXNCb29sZWFuKGV4cGVjdGVkVHlwZSwgcmVjZWl2ZWRUeXBlKSkge1xuICAgIG1lc3NhZ2UgKz0gYCB3aXRoIHZhbHVlICR7ZXhwZWN0ZWRWYWx1ZX1gO1xuICB9XG4gIG1lc3NhZ2UgKz0gYCwgZ290ICR7cmVjZWl2ZWRUeXBlfSBgO1xuICBpZiAoaXNFeHBsaWNhYmxlKHJlY2VpdmVkVHlwZSkpIHtcbiAgICBtZXNzYWdlICs9IGB3aXRoIHZhbHVlICR7cmVjZWl2ZWRWYWx1ZX0uYDtcbiAgfVxuICByZXR1cm4gbWVzc2FnZTtcbn1cbmZ1bmN0aW9uIHN0eWxlVmFsdWUodmFsdWUsIHR5cGUpIHtcbiAgaWYgKHR5cGUgPT09IFwiU3RyaW5nXCIpIHtcbiAgICByZXR1cm4gYFwiJHt2YWx1ZX1cImA7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gXCJOdW1iZXJcIikge1xuICAgIHJldHVybiBgJHtOdW1iZXIodmFsdWUpfWA7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGAke3ZhbHVlfWA7XG4gIH1cbn1cbmZ1bmN0aW9uIGlzRXhwbGljYWJsZSh0eXBlKSB7XG4gIGNvbnN0IGV4cGxpY2l0VHlwZXMgPSBbXCJzdHJpbmdcIiwgXCJudW1iZXJcIiwgXCJib29sZWFuXCJdO1xuICByZXR1cm4gZXhwbGljaXRUeXBlcy5zb21lKChlbGVtKSA9PiB0eXBlLnRvTG93ZXJDYXNlKCkgPT09IGVsZW0pO1xufVxuZnVuY3Rpb24gaXNCb29sZWFuKC4uLmFyZ3MpIHtcbiAgcmV0dXJuIGFyZ3Muc29tZSgoZWxlbSkgPT4gZWxlbS50b0xvd2VyQ2FzZSgpID09PSBcImJvb2xlYW5cIik7XG59XG5cbmNvbnN0IGlzSW50ZXJuYWxLZXkgPSAoa2V5KSA9PiBrZXlbMF0gPT09IFwiX1wiIHx8IGtleSA9PT0gXCIkc3RhYmxlXCI7XG5jb25zdCBub3JtYWxpemVTbG90VmFsdWUgPSAodmFsdWUpID0+IGlzQXJyYXkodmFsdWUpID8gdmFsdWUubWFwKG5vcm1hbGl6ZVZOb2RlKSA6IFtub3JtYWxpemVWTm9kZSh2YWx1ZSldO1xuY29uc3Qgbm9ybWFsaXplU2xvdCA9IChrZXksIHJhd1Nsb3QsIGN0eCkgPT4ge1xuICBpZiAocmF3U2xvdC5fbikge1xuICAgIHJldHVybiByYXdTbG90O1xuICB9XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSB3aXRoQ3R4KCguLi5hcmdzKSA9PiB7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgY3VycmVudEluc3RhbmNlICYmICghY3R4IHx8IGN0eC5yb290ID09PSBjdXJyZW50SW5zdGFuY2Uucm9vdCkpIHtcbiAgICAgIHdhcm4kMShcbiAgICAgICAgYFNsb3QgXCIke2tleX1cIiBpbnZva2VkIG91dHNpZGUgb2YgdGhlIHJlbmRlciBmdW5jdGlvbjogdGhpcyB3aWxsIG5vdCB0cmFjayBkZXBlbmRlbmNpZXMgdXNlZCBpbiB0aGUgc2xvdC4gSW52b2tlIHRoZSBzbG90IGZ1bmN0aW9uIGluc2lkZSB0aGUgcmVuZGVyIGZ1bmN0aW9uIGluc3RlYWQuYFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIG5vcm1hbGl6ZVNsb3RWYWx1ZShyYXdTbG90KC4uLmFyZ3MpKTtcbiAgfSwgY3R4KTtcbiAgbm9ybWFsaXplZC5fYyA9IGZhbHNlO1xuICByZXR1cm4gbm9ybWFsaXplZDtcbn07XG5jb25zdCBub3JtYWxpemVPYmplY3RTbG90cyA9IChyYXdTbG90cywgc2xvdHMsIGluc3RhbmNlKSA9PiB7XG4gIGNvbnN0IGN0eCA9IHJhd1Nsb3RzLl9jdHg7XG4gIGZvciAoY29uc3Qga2V5IGluIHJhd1Nsb3RzKSB7XG4gICAgaWYgKGlzSW50ZXJuYWxLZXkoa2V5KSkgY29udGludWU7XG4gICAgY29uc3QgdmFsdWUgPSByYXdTbG90c1trZXldO1xuICAgIGlmIChpc0Z1bmN0aW9uKHZhbHVlKSkge1xuICAgICAgc2xvdHNba2V5XSA9IG5vcm1hbGl6ZVNsb3Qoa2V5LCB2YWx1ZSwgY3R4KTtcbiAgICB9IGVsc2UgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHRydWUpIHtcbiAgICAgICAgd2FybiQxKFxuICAgICAgICAgIGBOb24tZnVuY3Rpb24gdmFsdWUgZW5jb3VudGVyZWQgZm9yIHNsb3QgXCIke2tleX1cIi4gUHJlZmVyIGZ1bmN0aW9uIHNsb3RzIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2UuYFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZVNsb3RWYWx1ZSh2YWx1ZSk7XG4gICAgICBzbG90c1trZXldID0gKCkgPT4gbm9ybWFsaXplZDtcbiAgICB9XG4gIH1cbn07XG5jb25zdCBub3JtYWxpemVWTm9kZVNsb3RzID0gKGluc3RhbmNlLCBjaGlsZHJlbikgPT4ge1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAhaXNLZWVwQWxpdmUoaW5zdGFuY2Uudm5vZGUpICYmIHRydWUpIHtcbiAgICB3YXJuJDEoXG4gICAgICBgTm9uLWZ1bmN0aW9uIHZhbHVlIGVuY291bnRlcmVkIGZvciBkZWZhdWx0IHNsb3QuIFByZWZlciBmdW5jdGlvbiBzbG90cyBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlLmBcbiAgICApO1xuICB9XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBub3JtYWxpemVTbG90VmFsdWUoY2hpbGRyZW4pO1xuICBpbnN0YW5jZS5zbG90cy5kZWZh
20578dWx0ID0gKCkgPT4gbm9ybWFsaXplZDtcbn07XG5jb25zdCBhc3NpZ25TbG90cyA9IChzbG90cywgY2hpbGRyZW4sIG9wdGltaXplZCkgPT4ge1xuICBmb3IgKGNvbnN0IGtleSBpbiBjaGlsZHJlbikge1xuICAgIGlmIChvcHRpbWl6ZWQgfHwga2V5ICE9PSBcIl9cIikge1xuICAgICAgc2xvdHNba2V5XSA9IGNoaWxkcmVuW2tleV07XG4gICAgfVxuICB9XG59O1xuY29uc3QgaW5pdFNsb3RzID0gKGluc3RhbmNlLCBjaGlsZHJlbiwgb3B0aW1pemVkKSA9PiB7XG4gIGNvbnN0IHNsb3RzID0gaW5zdGFuY2Uuc2xvdHMgPSBjcmVhdGVJbnRlcm5hbE9iamVjdCgpO1xuICBpZiAoaW5zdGFuY2Uudm5vZGUuc2hhcGVGbGFnICYgMzIpIHtcbiAgICBjb25zdCB0eXBlID0gY2hpbGRyZW4uXztcbiAgICBpZiAodHlwZSkge1xuICAgICAgYXNzaWduU2xvdHMoc2xvdHMsIGNoaWxkcmVuLCBvcHRpbWl6ZWQpO1xuICAgICAgaWYgKG9wdGltaXplZCkge1xuICAgICAgICBkZWYoc2xvdHMsIFwiX1wiLCB0eXBlLCB0cnVlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbm9ybWFsaXplT2JqZWN0U2xvdHMoY2hpbGRyZW4sIHNsb3RzKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoY2hpbGRyZW4pIHtcbiAgICBub3JtYWxpemVWTm9kZVNsb3RzKGluc3RhbmNlLCBjaGlsZHJlbik7XG4gIH1cbn07XG5jb25zdCB1cGRhdGVTbG90cyA9IChpbnN0YW5jZSwgY2hpbGRyZW4sIG9wdGltaXplZCkgPT4ge1xuICBjb25zdCB7IHZub2RlLCBzbG90cyB9ID0gaW5zdGFuY2U7XG4gIGxldCBuZWVkRGVsZXRpb25DaGVjayA9IHRydWU7XG4gIGxldCBkZWxldGlvbkNvbXBhcmlzb25UYXJnZXQgPSBFTVBUWV9PQko7XG4gIGlmICh2bm9kZS5zaGFwZUZsYWcgJiAzMikge1xuICAgIGNvbnN0IHR5cGUgPSBjaGlsZHJlbi5fO1xuICAgIGlmICh0eXBlKSB7XG4gICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBpc0htclVwZGF0aW5nKSB7XG4gICAgICAgIGFzc2lnblNsb3RzKHNsb3RzLCBjaGlsZHJlbiwgb3B0aW1pemVkKTtcbiAgICAgICAgdHJpZ2dlcihpbnN0YW5jZSwgXCJzZXRcIiwgXCIkc2xvdHNcIik7XG4gICAgICB9IGVsc2UgaWYgKG9wdGltaXplZCAmJiB0eXBlID09PSAxKSB7XG4gICAgICAgIG5lZWREZWxldGlvbkNoZWNrID0gZmFsc2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhc3NpZ25TbG90cyhzbG90cywgY2hpbGRyZW4sIG9wdGltaXplZCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG5lZWREZWxldGlvbkNoZWNrID0gIWNoaWxkcmVuLiRzdGFibGU7XG4gICAgICBub3JtYWxpemVPYmplY3RTbG90cyhjaGlsZHJlbiwgc2xvdHMpO1xuICAgIH1cbiAgICBkZWxldGlvbkNvbXBhcmlzb25UYXJnZXQgPSBjaGlsZHJlbjtcbiAgfSBlbHNlIGlmIChjaGlsZHJlbikge1xuICAgIG5vcm1hbGl6ZVZOb2RlU2xvdHMoaW5zdGFuY2UsIGNoaWxkcmVuKTtcbiAgICBkZWxldGlvbkNvbXBhcmlzb25UYXJnZXQgPSB7IGRlZmF1bHQ6IDEgfTtcbiAgfVxuICBpZiAobmVlZERlbGV0aW9uQ2hlY2spIHtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBzbG90cykge1xuICAgICAgaWYgKCFpc0ludGVybmFsS2V5KGtleSkgJiYgZGVsZXRpb25Db21wYXJpc29uVGFyZ2V0W2tleV0gPT0gbnVsbCkge1xuICAgICAgICBkZWxldGUgc2xvdHNba2V5XTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG5cbmZ1bmN0aW9uIHNldFJlZihyYXdSZWYsIG9sZFJhd1JlZiwgcGFyZW50U3VzcGVuc2UsIHZub2Rl
20578LCBpc1VubW91bnQgPSBmYWxzZSkge1xuICBpZiAoaXNBcnJheShyYXdSZWYpKSB7XG4gICAgcmF3UmVmLmZvckVhY2goXG4gICAgICAociwgaSkgPT4gc2V0UmVmKFxuICAgICAgICByLFxuICAgICAgICBvbGRSYXdSZWYgJiYgKGlzQXJyYXkob2xkUmF3UmVmKSA/IG9sZFJhd1JlZltpXSA6IG9sZFJhd1JlZiksXG4gICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICB2bm9kZSxcbiAgICAgICAgaXNVbm1vdW50XG4gICAgICApXG4gICAgKTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGlzQXN5bmNXcmFwcGVyKHZub2RlKSAmJiAhaXNVbm1vdW50KSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHJlZlZhbHVlID0gdm5vZGUuc2hhcGVGbGFnICYgNCA/IGdldENvbXBvbmVudFB1YmxpY0luc3RhbmNlKHZub2RlLmNvbXBvbmVudCkgOiB2bm9kZS5lbDtcbiAgY29uc3QgdmFsdWUgPSBpc1VubW91bnQgPyBudWxsIDogcmVmVmFsdWU7XG4gIGNvbnN0IHsgaTogb3duZXIsIHI6IHJlZiB9ID0gcmF3UmVmO1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAhb3duZXIpIHtcbiAgICB3YXJuJDEoXG4gICAgICBgTWlzc2luZyByZWYgb3duZXIgY29udGV4dC4gcmVmIGNhbm5vdCBiZSB1c2VkIG9uIGhvaXN0ZWQgdm5vZGVzLiBBIHZub2RlIHdpdGggcmVmIG11c3QgYmUgY3JlYXRlZCBpbnNpZGUgdGhlIHJlbmRlciBmdW5jdGlvbi5gXG4gICAgKTtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3Qgb2xkUmVmID0gb2xkUmF3UmVmICYmIG9sZFJhd1JlZi5yO1xuICBjb25zdCByZWZzID0gb3duZXIucmVmcyA9PT0gRU1QVFlfT0JKID8gb3duZXIucmVmcyA9IHt9IDogb3duZXIucmVmcztcbiAgY29uc3Qgc2V0dXBTdGF0ZSA9IG93bmVyLnNldHVwU3RhdGU7XG4gIGlmIChvbGRSZWYgIT0gbnVsbCAmJiBvbGRSZWYgIT09IHJlZikge1xuICAgIGlmIChpc1N0cmluZyhvbGRSZWYpKSB7XG4gICAgICByZWZzW29sZFJlZl0gPSBudWxsO1xuICAgICAgaWYgKGhhc093bihzZXR1cFN0YXRlLCBvbGRSZWYpKSB7XG4gICAgICAgIHNldHVwU3RhdGVbb2xkUmVmXSA9IG51bGw7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc1JlZihvbGRSZWYpKSB7XG4gICAgICBvbGRSZWYudmFsdWUgPSBudWxsO1xuICAgIH1cbiAgfVxuICBpZiAoaXNGdW5jdGlvbihyZWYpKSB7XG4gICAgY2FsbFdpdGhFcnJvckhhbmRsaW5nKHJlZiwgb3duZXIsIDEyLCBbdmFsdWUsIHJlZnNdKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBfaXNTdHJpbmcgPSBpc1N0cmluZyhyZWYpO1xuICAgIGNvbnN0IF9pc1JlZiA9IGlzUmVmKHJlZik7XG4gICAgaWYgKF9pc1N0cmluZyB8fCBfaXNSZWYpIHtcbiAgICAgIGNvbnN0IGRvU2V0ID0gKCkgPT4ge1xuICAgICAgICBpZiAocmF3UmVmLmYpIHtcbiAgICAgICAgICBjb25zdCBleGlzdGluZyA9IF9pc1N0cmluZyA/IGhhc093bihzZXR1cFN0YXRlLCByZWYpID8gc2V0dXBTdGF0ZVtyZWZdIDogcmVmc1tyZWZdIDogcmVmLnZhbHVlO1xuICAgICAgICAgIGlmIChpc1VubW91bnQpIHtcbiAgICAgICAgICAgIGlzQXJyYXkoZXhpc3RpbmcpICYmIHJlbW92ZShleGlzdGluZywgcmVmVmFsdWUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoIWlzQXJyYXkoZXhpc3RpbmcpKSB7XG4gICAgICAgICAgICAgIGlmIChfaXNTdHJpbmcpIHtcbiAgICAgICAgICAgICAgICByZWZzW3JlZl0gPSBbcmVmVmFsdWVdO1xuICAgICAgICAgICAgICAgIGlmIChoYXNPd24oc2V0dXBTdGF0ZSwgcmVmKSkge1xuICAgICAgICAgICAgICAgICAgc2V0dXBTdGF0ZVtyZWZdID0gcmVmc1tyZWZdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZWYudmFsdWUgPSBbcmVmVmFsdWVdO1xuICAgICAgICAgICAgICAgIGlmIChyYXdSZWYuaykgcmVmc1tyYXdSZWYua10gPSByZWYudmFsdWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIWV4aXN0aW5nLmluY2x1ZGVzKHJlZlZhbHVlKSkge1xuICAgICAgICAgICAgICBleGlzdGluZy5wdXNoKHJlZlZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoX2lzU3RyaW5nKSB7XG4gICAgICAgICAgcmVmc1tyZWZdID0gdmFsdWU7XG4gICAgICAgICAgaWYgKGhhc093bihzZXR1cFN0YXRlLCByZWYpKSB7XG4gICAgICAgICAgICBzZXR1cFN0YXRlW3JlZl0gPSB2YWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoX2lzUmVmKSB7XG4gICAgICAgICAgcmVmLnZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgaWYgKHJhd1JlZi5rKSByZWZzW3Jhd1JlZi5rXSA9IHZhbHVlO1xuICAgICAgICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICB3YXJuJDEoXCJJbnZhbGlkIHRlbXBsYXRlIHJlZiB0eXBlOlwiLCByZWYsIGAoJHt0eXBlb2YgcmVmfSlgKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICBkb1NldC5pZCA9IC0xO1xuICAgICAgICBxdWV1ZVBvc3RSZW5kZXJFZmZlY3QoZG9TZXQsIHBhcmVudFN1c3BlbnNlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRvU2V0KCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICB3YXJuJDEoXCJJbnZhbGlkIHRlbXBsYXRlIHJlZiB0eXBlOlwiLCByZWYsIGAoJHt0eXBlb2YgcmVmfSlgKTtcbiAgICB9XG4gIH1cbn1cblxuY29uc3QgVGVsZXBvcnRFbmRLZXkgPSBTeW1ib2woXCJfdnRlXCIpO1xuY29uc3QgaXNUZWxlcG9ydCA9ICh0eXBlKSA9PiB0eXBlLl9faXNUZWxlcG9ydDtcbmNvbnN0IGlzVGVsZXBvcnREaXNhYmxlZCA9IChwcm9wcykgPT4gcHJvcHMgJiYgKHByb3BzLmRpc2FibGVkIHx8IHByb3BzLmRpc2FibGVkID09PSBcIlwiKTtcbmNvbnN0IGlzVGFyZ2V0U1ZHID0gKHRhcmdldCkgPT4gdHlwZW9mIFNWR0VsZW1lbnQgIT09IFwidW5kZWZpbmVkXCIgJiYgdGFyZ2V0IGluc3RhbmNlb2YgU1ZHRWxlbWVudDtcbmNvbnN0IGlzVGFyZ2V0TWF0aE1MID0gKHRhcmdldCkgPT4gdHlwZW9mIE1hdGhNTEVsZW1lbnQgPT09IFwiZnVuY3Rpb25cIiAmJiB0YXJnZXQgaW5zdGFuY2VvZiBNYXRoTUxFbGVtZW50O1xuY29uc3QgcmVzb2x2ZVRhcmdldCA9IChwcm9wcywgc2VsZWN0KSA9PiB7XG4gIGNvbnN0IHRhcmdldFNlbGVjdG9yID0gcHJvcHMgJiYgcHJvcHMudG87XG4gIGlmIChpc1N0cmluZyh0YXJnZXRTZWxlY3RvcikpIHtcbiAgICBpZiAoIXNlbGVjdCkge1xuICAgICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiB3YXJuJDEoXG4gICAgICAgIGBDdXJyZW50IHJlbmRlcmVyIGRvZXMgbm90IHN1cHBvcnQgc3RyaW5nIHRhcmdldCBmb3IgVGVsZXBvcnRzLiAobWlzc2luZyBxdWVyeVNlbGVjdG9yIHJlbmRlcmVyIG9wdGlvbilgXG4gICAgICApO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHRhcmdldCA9IHNlbGVjdCh0YXJnZXRTZWxlY3Rvcik7XG4gICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAhdGFyZ2V0ICYmICFpc1RlbGVwb3J0RGlzYWJsZWQocHJvcHMpKSB7XG4gICAgICAgI
20578Hdhcm4kMShcbiAgICAgICAgICBgRmFpbGVkIHRvIGxvY2F0ZSBUZWxlcG9ydCB0YXJnZXQgd2l0aCBzZWxlY3RvciBcIiR7dGFyZ2V0U2VsZWN0b3J9XCIuIE5vdGUgdGhlIHRhcmdldCBlbGVtZW50IG11c3QgZXhpc3QgYmVmb3JlIHRoZSBjb21wb25lbnQgaXMgbW91bnRlZCAtIGkuZS4gdGhlIHRhcmdldCBjYW5ub3QgYmUgcmVuZGVyZWQgYnkgdGhlIGNvbXBvbmVudCBpdHNlbGYsIGFuZCBpZGVhbGx5IHNob3VsZCBiZSBvdXRzaWRlIG9mIHRoZSBlbnRpcmUgVnVlIGNvbXBvbmVudCB0cmVlLmBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmICF0YXJnZXRTZWxlY3RvciAmJiAhaXNUZWxlcG9ydERpc2FibGVkKHByb3BzKSkge1xuICAgICAgd2FybiQxKGBJbnZhbGlkIFRlbGVwb3J0IHRhcmdldDogJHt0YXJnZXRTZWxlY3Rvcn1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHRhcmdldFNlbGVjdG9yO1xuICB9XG59O1xuY29uc3QgVGVsZXBvcnRJbXBsID0ge1xuICBuYW1lOiBcIlRlbGVwb3J0XCIsXG4gIF9faXNUZWxlcG9ydDogdHJ1ZSxcbiAgcHJvY2VzcyhuMSwgbjIsIGNvbnRhaW5lciwgYW5jaG9yLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBuYW1lc3BhY2UsIHNsb3RTY29wZUlkcywgb3B0aW1pemVkLCBpbnRlcm5hbHMpIHtcbiAgICBjb25zdCB7XG4gICAgICBtYzogbW91bnRDaGlsZHJlbixcbiAgICAgIHBjOiBwYXRjaENoaWxkcmVuLFxuICAgICAgcGJjOiBwYXRjaEJsb2NrQ2hpbGRyZW4sXG4gICAgICBvOiB7IGluc2VydCwgcXVlcnlTZWxlY3RvciwgY3JlYXRlVGV4dCwgY3JlYXRlQ29tbWVudCB9XG4gICAgfSA9IGludGVybmFscztcbiAgICBjb25zdCBkaXNhYmxlZCA9IGlzVGVsZXBvcnREaXNhYmxlZChuMi5wcm9wcyk7XG4gICAgbGV0IHsgc2hhcGVGbGFnLCBjaGlsZHJlbiwgZHluYW1pY0NoaWxkcmVuIH0gPSBuMjtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBpc0htclVwZGF0aW5nKSB7XG4gICAgICBvcHRpbWl6ZWQgPSBmYWxzZTtcbiAgICAgIGR5bmFtaWNDaGlsZHJlbiA9IG51bGw7XG4gICAgfVxuICAgIGlmIChuMSA9PSBudWxsKSB7XG4gICAgICBjb25zdCBwbGFjZWhvbGRlciA9IG4yLmVsID0gISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IGNyZWF0ZUNvbW1lbnQoXCJ0ZWxlcG9ydCBzdGFydFwiKSA6IGNyZWF0ZVRleHQoXCJcIik7XG4gICAgICBjb25zdCBtYWluQW5jaG9yID0gbjIuYW5jaG9yID0gISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IGNyZWF0ZUNvbW1lbnQoXCJ0ZWxlcG9ydCBlbmRcIikgOiBjcmVhdGVUZXh0KFwiXCIpO1xuICAgICAgY29uc3QgdGFyZ2V0ID0gbjIudGFyZ2V0ID0gcmVzb2x2ZVRhcmdldChuMi5wcm9wcywgcXVlcnlTZWxlY3Rvcik7XG4gICAgICBjb25zdCB0YXJnZXRTdGFydCA9IG4yLnRhcmdldFN0YXJ0ID0gY3JlYXRlVGV4dChcIlwiKTtcbiAgICAgIGNvbnN0IHRhcmdldEFuY2hvciA9IG4yLnRhcmdldEFuY2hvciA9IGNyZWF0ZVRleHQoXCJcIik7XG4gICAgICBpbnNlcnQocGxhY2Vob2xkZXIsIGNvbnRhaW5lciwgYW5jaG9yKTtcbiAgICAgIGluc2VydChtYWluQW5jaG9yLCBjb250YWluZXIsIGFuY2hvcik7XG4gICAgICB0YXJnZXRTdGFydFtUZWxlcG9ydEVuZEtleV0gPSB0YXJnZXRBbmNob3I7XG4gICAgICBpZiAodGFyZ2V0KSB7XG4gICAgICAgIGluc2VydCh0YXJnZXRTdGFydCwgdGFyZ2V0KTtcbiAgICAgICAgaW5zZXJ0KHRhcmdldEFuY2hvciwgdGFyZ2V0KTtcbiAgICAgICAgaWYgKG5hbWVzcGFjZSA9PT0gXCJzdmdcIiB8fCBpc1RhcmdldFNWRyh0YXJnZXQpKSB7XG4gICAgICAgICAgbmFtZXNwYWNlID0gXCJzdmdcIjtcbiAgICAgICAgfSBlbHNlIGlmIChuYW1lc3BhY2UgPT09IFwibWF0aG1sXCIgfHwgaXNUYXJnZXRNYXRoTUwodGFyZ2V0KSkge1xuICAgICAgICAgIG5hbWVzcGFjZSA9IFwibWF0aG1sXCI7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAhZGlzYWJsZWQpIHtcbiAgICAgICAgd2FybiQxKFwiSW52YWxpZCBUZWxlcG9ydCB0YXJnZXQgb24gbW91bnQ6XCIsIHRhcmdldCwgYCgke3R5cGVvZiB0YXJnZXR9KWApO1xuICAgICAgfVxuICAgICAgY29uc3QgbW91bnQgPSAoY29udGFpbmVyMiwgYW5jaG9yMikgPT4ge1xuICAgICAgICBpZiAoc2hhcGVGbGFnICYgMTYpIHtcbiAgICAgICAgICBtb3VudENoaWxkcmVuKFxuICAgICAgICAgICAgY2hpbGRyZW4sXG4gICAgICAgICAgICBjb250YWluZXIyLFxuICAgICAgICAgICAgYW5jaG9yMixcbiAgICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgICAgb3B0aW1pemVkXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGlmIChkaXNhYmxlZCkge1xuICAgICAgICBtb3VudChjb250YWluZXIsIG1haW5BbmNob3IpO1xuICAgICAgfSBlbHNlIGlmICh0YXJnZXQpIHtcbiAgICAgICAgbW91bnQodGFyZ2V0LCB0YXJnZXRBbmNob3IpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBuMi5lbCA9IG4xLmVsO1xuICAgICAgbjIudGFyZ2V0U3RhcnQgPSBuMS50YXJnZXRTdGFydDtcbiAgICAgIGNvbnN0IG1haW5BbmNob3IgPSBuMi5hbmNob3IgPSBuMS5hbmNob3I7XG4gICAgICBjb25zdCB0YXJnZXQgPSBuMi50YXJnZXQgPSBuMS50YXJnZXQ7XG4gICAgICBjb25zdCB0YXJnZXRBbmNob3IgPSBuMi50YXJnZXRBbmNob3IgPSBuMS50YXJnZXRBbmNob3I7XG4gICAgICBjb25zdCB3YXNEaXNhYmxlZCA9IGlzVGVsZXBvcnREaXNhYmxlZChuMS5wcm9wcyk7XG4gICAgICBjb25zdCBjdXJyZW50Q29udGFpbmVyID0gd2FzRGlzYWJsZWQgPyBjb250YWluZXIgOiB0YXJnZXQ7XG4gICAgICBjb25zdCBjdXJyZW50QW5jaG9yID0gd2FzRGlzYWJsZWQgPyBtYWluQW5jaG9yIDogdGFyZ2V0QW5jaG9yO1xuICAgICAgaWYgKG5hbWVzcGFjZSA9PT0gXCJzdmdcIiB8fCBpc1RhcmdldFNWRyh0YXJnZXQpKSB7XG4gICAgICAgIG5hbWVzcGFjZSA9IFwic3ZnXCI7XG4gICAgICB9IGVsc2UgaWYgKG5hbWVzcGFjZSA9PT0gXCJtYXRobWxcIiB8fCBpc1RhcmdldE1hdGhNTCh0YXJnZXQpKSB7XG4gICAgICAgIG5hbWVzcGFjZSA9IFwibWF0aG1sXCI7XG4gICAgICB9XG4gICAgICBpZiAoZHluYW1pY0NoaWxkcmVuKSB7XG4gICAgICAgI
20578HBhdGNoQmxvY2tDaGlsZHJlbihcbiAgICAgICAgICBuMS5keW5hbWljQ2hpbGRyZW4sXG4gICAgICAgICAgZHluYW1pY0NoaWxkcmVuLFxuICAgICAgICAgIGN1cnJlbnRDb250YWluZXIsXG4gICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICBzbG90U2NvcGVJZHNcbiAgICAgICAgKTtcbiAgICAgICAgdHJhdmVyc2VTdGF0aWNDaGlsZHJlbihuMSwgbjIsIHRydWUpO1xuICAgICAgfSBlbHNlIGlmICghb3B0aW1pemVkKSB7XG4gICAgICAgIHBhdGNoQ2hpbGRyZW4oXG4gICAgICAgICAgbjEsXG4gICAgICAgICAgbjIsXG4gICAgICAgICAgY3VycmVudENvbnRhaW5lcixcbiAgICAgICAgICBjdXJyZW50QW5jaG9yLFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgIGZhbHNlXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAoZGlzYWJsZWQpIHtcbiAgICAgICAgaWYgKCF3YXNEaXNhYmxlZCkge1xuICAgICAgICAgIG1vdmVUZWxlcG9ydChcbiAgICAgICAgICAgIG4yLFxuICAgICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgICAgbWFpbkFuY2hvcixcbiAgICAgICAgICAgIGludGVybmFscyxcbiAgICAgICAgICAgIDFcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChuMi5wcm9wcyAmJiBuMS5wcm9wcyAmJiBuMi5wcm9wcy50byAhPT0gbjEucHJvcHMudG8pIHtcbiAgICAgICAgICAgIG4yLnByb3BzLnRvID0gbjEucHJvcHMudG87XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoKG4yLnByb3BzICYmIG4yLnByb3BzLnRvKSAhPT0gKG4xLnByb3BzICYmIG4xLnByb3BzLnRvKSkge1xuICAgICAgICAgIGNvbnN0IG5leHRUYXJnZXQgPSBuMi50YXJnZXQgPSByZXNvbHZlVGFyZ2V0KFxuICAgICAgICAgICAgbjIucHJvcHMsXG4gICAgICAgICAgICBxdWVyeVNlbGVjdG9yXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAobmV4dFRhcmdldCkge1xuICAgICAgICAgICAgbW92ZVRlbGVwb3J0KFxuICAgICAgICAgICAgICBuMixcbiAgICAgICAgICAgICAgbmV4dFRhcmdldCxcbiAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgaW50ZXJuYWxzLFxuICAgICAgICAgICAgICAwXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgICAgd2FybiQxKFxuICAgICAgICAgICAgICBcIkludmFsaWQgVGVsZXBvcnQgdGFyZ2V0IG9uIHVwZGF0ZTpcIixcbiAgICAgICAgICAgICAgdGFyZ2V0LFxuICAgICAgICAgICAgICBgKCR7dHlwZW9mIHRhcmdldH0pYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAod2FzRGlzYWJsZWQpIHtcbiAgICAgICAgICBtb3ZlVGVsZXBvcnQoXG4gICAgICAgICAgICBuMixcbiAgICAgICAgICAgIHRhcmdldCxcbiAgICAgICAgICAgIHRhcmdldEFuY2hvcixcbiAgICAgICAgICAgIGludGVybmFscyxcbiAgICAgICAgICAgIDFcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHVwZGF0ZUNzc1ZhcnMobjIpO1xuICB9LFxuICByZW1vdmUodm5vZGUsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIHsgdW06IHVubW91bnQsIG86IHsgcmVtb3ZlOiBob3N0UmVtb3ZlIH0gfSwgZG9SZW1vdmUpIHtcbiAgICBjb25zdCB7XG4gICAgICBzaGFwZUZsYWcsXG4gICAgICBjaGlsZHJlbixcbiAgICAgIGFuY2hvcixcbiAgICAgIHRhcmdldFN0YXJ0LFxuICAgICAgdGFyZ2V0QW5jaG9yLFxuICAgICAgdGFyZ2V0LFxuICAgICAgcHJvcHNcbiAgICB9ID0gdm5vZGU7XG4gICAgaWYgKHRhcmdldCkge1xuICAgICAgaG9zdFJlbW92ZSh0YXJnZXRTdGFydCk7XG4gICAgICBob3N0UmVtb3ZlKHRhcmdldEFuY2hvcik7XG4gICAgfVxuICAgIGRvUmVtb3ZlICYmIGhvc3RSZW1vdmUoYW5jaG9yKTtcbiAgICBpZiAoc2hhcGVGbGFnICYgMTYpIHtcbiAgICAgIGNvbnN0IHNob3VsZFJlbW92ZSA9IGRvUmVtb3ZlIHx8ICFpc1RlbGVwb3J0RGlzYWJsZWQocHJvcHMpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBjaGlsZCA9IGNoaWxkcmVuW2ldO1xuICAgICAgICB1bm1vdW50KFxuICAgICAgICAgIGNoaWxkLFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICBzaG91bGRSZW1vdmUsXG4gICAgICAgICAgISFjaGlsZC5keW5hbWljQ2hpbGRyZW5cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIG1vdmU6IG1vdmVUZWxlcG9ydCxcbiAgaHlkcmF0ZTogaHlkcmF0ZVRlbGVwb3J0XG59O1xuZnVuY3Rpb24gbW92ZVRlbGVwb3J0KHZub2RlLCBjb250YWluZXIsIHBhcmVudEFuY2hvciwgeyBvOiB7IGluc2VydCB9LCBtOiBtb3ZlIH0sIG1vdmVUeXBlID0gMikge1xuICBpZiAobW92ZVR5cGUgPT09IDApIHtcbiAgICBpbnNlcnQodm5vZGUudGFyZ2V0QW5jaG9yLCBjb250YWluZXIsIHBhcmVudEFuY2hvcik7XG4gIH1cbiAgY29uc3QgeyBlbCwgYW5jaG9yLCBzaGFwZUZsYWcsIGNoaWxkcmVuLCBwcm9wcyB9ID0gdm5vZGU7XG4gIGNvbnN0IGlzUmVvcmRlciA9IG1vdmVUeXBlID09PSAyO1xuICBpZiAoaXNSZW9yZGVyKSB7XG4gICAgaW5zZXJ0KGVsLCBjb250YWluZXIsIHBhcmVudEFuY2hvcik7XG4gIH1cbiAgaWYgKCFpc1Jlb3JkZXIgfHwgaXNUZWxlcG9ydERpc2FibGVkKHByb3BzKSkge1xuICAgIGlmIChzaGFwZUZsYWcgJiAxNikge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICBtb3ZlKFxuICAgICAgICAgIGNoaWxkcmVuW2ldLFxuICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICBwYXJlbnRBbmNob3IsXG4gICAgICAgICAgMlxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAoaXNSZW9yZGVyKSB7XG4gICAgaW5zZXJ0KGFuY2hvciwgY29udGFpbmVyLCBwYXJlbnRBbmNob3IpO1xuICB9XG59XG5mdW5jdGlvbiBoeWRyYXRlVGVsZXBvcnQobm9kZSwgdm5vZGUsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIHNsb3RTY29wZUlkcywgb3B0aW1pemVkLCB7XG4gIG86IHsgbmV4dFNpYmxpbmcsIHBhcmVudE5vZGUsIHF1ZXJ5U2VsZWN0b3IgfVxufSwgaHlkcmF0ZUNoaWxkcmVuKSB7XG4gIGNvbnN0IHRhcmdldCA9IHZub2RlLnRhcmdldCA9IHJlc29sdmVUYXJnZXQoXG4gICAgdm5vZGUucHJvcHMsXG4gICAgcXVlcnlTZWxlY3RvclxuICApO
205781xuICBpZiAodGFyZ2V0KSB7XG4gICAgY29uc3QgdGFyZ2V0Tm9kZSA9IHRhcmdldC5fbHBhIHx8IHRhcmdldC5maXJzdENoaWxkO1xuICAgIGlmICh2bm9kZS5zaGFwZUZsYWcgJiAxNikge1xuICAgICAgaWYgKGlzVGVsZXBvcnREaXNhYmxlZCh2bm9kZS5wcm9wcykpIHtcbiAgICAgICAgdm5vZGUuYW5jaG9yID0gaHlkcmF0ZUNoaWxkcmVuKFxuICAgICAgICAgIG5leHRTaWJsaW5nKG5vZGUpLFxuICAgICAgICAgIHZub2RlLFxuICAgICAgICAgIHBhcmVudE5vZGUobm9kZSksXG4gICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgKTtcbiAgICAgICAgdm5vZGUudGFyZ2V0QW5jaG9yID0gdGFyZ2V0Tm9kZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZub2RlLmFuY2hvciA9IG5leHRTaWJsaW5nKG5vZGUpO1xuICAgICAgICBsZXQgdGFyZ2V0QW5jaG9yID0gdGFyZ2V0Tm9kZTtcbiAgICAgICAgd2hpbGUgKHRhcmdldEFuY2hvcikge1xuICAgICAgICAgIHRhcmdldEFuY2hvciA9IG5leHRTaWJsaW5nKHRhcmdldEFuY2hvcik7XG4gICAgICAgICAgaWYgKHRhcmdldEFuY2hvciAmJiB0YXJnZXRBbmNob3Iubm9kZVR5cGUgPT09IDggJiYgdGFyZ2V0QW5jaG9yLmRhdGEgPT09IFwidGVsZXBvcnQgYW5jaG9yXCIpIHtcbiAgICAgICAgICAgIHZub2RlLnRhcmdldEFuY2hvciA9IHRhcmdldEFuY2hvcjtcbiAgICAgICAgICAgIHRhcmdldC5fbHBhID0gdm5vZGUudGFyZ2V0QW5jaG9yICYmIG5leHRTaWJsaW5nKHZub2RlLnRhcmdldEFuY2hvcik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaHlkcmF0ZUNoaWxkcmVuKFxuICAgICAgICAgIHRhcmdldE5vZGUsXG4gICAgICAgICAgdm5vZGUsXG4gICAgICAgICAgdGFyZ2V0LFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgb3B0aW1pemVkXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIHVwZGF0ZUNzc1ZhcnModm5vZGUpO1xuICB9XG4gIHJldHVybiB2bm9kZS5hbmNob3IgJiYgbmV4dFNpYmxpbmcodm5vZGUuYW5jaG9yKTtcbn1cbmNvbnN0IFRlbGVwb3J0ID0gVGVsZXBvcnRJbXBsO1xuZnVuY3Rpb24gdXBkYXRlQ3NzVmFycyh2bm9kZSkge1xuICBjb25zdCBjdHggPSB2bm9kZS5jdHg7XG4gIGlmIChjdHggJiYgY3R4LnV0KSB7XG4gICAgbGV0IG5vZGUgPSB2bm9kZS5jaGlsZHJlblswXS5lbDtcbiAgICB3aGlsZSAobm9kZSAmJiBub2RlICE9PSB2bm9kZS50YXJnZXRBbmNob3IpIHtcbiAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSAxKSBub2RlLnNldEF0dHJpYnV0ZShcImRhdGEtdi1vd25lclwiLCBjdHgudWlkKTtcbiAgICAgIG5vZGUgPSBub2RlLm5leHRTaWJsaW5nO1xuICAgIH1cbiAgICBjdHgudXQoKTtcbiAgfVxufVxuXG5sZXQgaGFzTG9nZ2VkTWlzbWF0Y2hFcnJvciA9IGZhbHNlO1xuY29uc3QgbG9nTWlzbWF0Y2hFcnJvciA9ICgpID0+IHtcbiAgaWYgKGhhc0xvZ2dlZE1pc21hdGNoRXJyb3IpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc29sZS5lcnJvcihcIkh5ZHJhdGlvbiBjb21wbGV0ZWQgYnV0IGNvbnRhaW5zIG1pc21hdGNoZXMuXCIpO1xuICBoYXNMb2dnZWRNaXNtYXRjaEVycm9yID0gdHJ1ZTtcbn07XG5jb25zdCBpc1NWR0NvbnRhaW5lciA9IChjb250YWluZXIpID0+IGNvbnRhaW5lci5uYW1lc3BhY2VVUkkuaW5jbHVkZXMoXCJzdmdcIikgJiYgY29udGFpbmVyLnRhZ05hbWUgIT09IFwiZm9yZWlnbk9iamVjdFwiO1xuY29uc3QgaXNNYXRoTUxDb250YWluZXIgPSAoY29udGFpbmVyKSA9PiBjb250YWluZXIubmFtZXNwYWNlVVJJLmluY2x1ZGVzKFwiTWF0aE1MXCIpO1xuY29uc3QgZ2V0Q29udGFpbmVyVHlwZSA9IChjb250YWluZXIpID0+IHtcbiAgaWYgKGlzU1ZHQ29udGFpbmVyKGNvbnRhaW5lcikpIHJldHVybiBcInN2Z1wiO1xuICBpZiAoaXNNYXRoTUxDb250YWluZXIoY29udGFpbmVyKSkgcmV0dXJuIFwibWF0aG1sXCI7XG4gIHJldHVybiB2b2lkIDA7XG59O1xuY29uc3QgaXNDb21tZW50ID0gKG5vZGUpID0+IG5vZGUubm9kZVR5cGUgPT09IDggLyogQ09NTUVOVCAqLztcbmZ1bmN0aW9uIGNyZWF0ZUh5ZHJhdGlvbkZ1bmN0aW9ucyhyZW5kZXJlckludGVybmFscykge1xuICBjb25zdCB7XG4gICAgbXQ6IG1vdW50Q29tcG9uZW50LFxuICAgIHA6IHBhdGNoLFxuICAgIG86IHtcbiAgICAgIHBhdGNoUHJvcCxcbiAgICAgIGNyZWF0ZVRleHQsXG4gICAgICBuZXh0U2libGluZyxcbiAgICAgIHBhcmVudE5vZGUsXG4gICAgICByZW1vdmUsXG4gICAgICBpbnNlcnQsXG4gICAgICBjcmVhdGVDb21tZW50XG4gICAgfVxuICB9ID0gcmVuZGVyZXJJbnRlcm5hbHM7XG4gIGNvbnN0IGh5ZHJhdGUgPSAodm5vZGUsIGNvbnRhaW5lcikgPT4ge1xuICAgIGlmICghY29udGFpbmVyLmhhc0NoaWxkTm9kZXMoKSkge1xuICAgICAgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgX19WVUVfUFJPRF9IWURSQVRJT05fTUlTTUFUQ0hfREVUQUlMU19fKSAmJiB3YXJuJDEoXG4gICAgICAgIGBBdHRlbXB0aW5nIHRvIGh5ZHJhdGUgZXhpc3RpbmcgbWFya3VwIGJ1dCBjb250YWluZXIgaXMgZW1wdHkuIFBlcmZvcm1pbmcgZnVsbCBtb3VudCBpbnN0ZWFkLmBcbiAgICAgICk7XG4gICAgICBwYXRjaChudWxsLCB2bm9kZSwgY29udGFpbmVyKTtcbiAgICAgIGZsdXNoUG9zdEZsdXNoQ2JzKCk7XG4gICAgICBjb250YWluZXIuX3Zub2RlID0gdm5vZGU7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGh5ZHJhdGVOb2RlKGNvbnRhaW5lci5maXJzdENoaWxkLCB2bm9kZSwgbnVsbCwgbnVsbCwgbnVsbCk7XG4gICAgZmx1c2hQb3N0Rmx1c2hDYnMoKTtcbiAgICBjb250YWluZXIuX3Zub2RlID0gdm5vZGU7XG4gIH07XG4gIGNvbnN0IGh5ZHJhdGVOb2RlID0gKG5vZGUsIHZub2Rl
20578LCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBzbG90U2NvcGVJZHMsIG9wdGltaXplZCA9IGZhbHNlKSA9PiB7XG4gICAgb3B0aW1pemVkID0gb3B0aW1pemVkIHx8ICEhdm5vZGUuZHluYW1pY0NoaWxkcmVuO1xuICAgIGNvbnN0IGlzRnJhZ21lbnRTdGFydCA9IGlzQ29tbWVudChub2RlKSAmJiBub2RlLmRhdGEgPT09IFwiW1wiO1xuICAgIGNvbnN0IG9uTWlzbWF0Y2ggPSAoKSA9PiBoYW5kbGVNaXNtYXRjaChcbiAgICAgIG5vZGUsXG4gICAgICB2bm9kZSxcbiAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgaXNGcmFnbWVudFN0YXJ0XG4gICAgKTtcbiAgICBjb25zdCB7IHR5cGUsIHJlZiwgc2hhcGVGbGFnLCBwYXRjaEZsYWcgfSA9IHZub2RlO1xuICAgIGxldCBkb21UeXBlID0gbm9kZS5ub2RlVHlwZTtcbiAgICB2bm9kZS5lbCA9IG5vZGU7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgX19WVUVfUFJPRF9ERVZUT09MU19fKSB7XG4gICAgICBkZWYobm9kZSwgXCJfX3Zub2RlXCIsIHZub2RlLCB0cnVlKTtcbiAgICAgIGRlZihub2RlLCBcIl9fdnVlUGFyZW50Q29tcG9uZW50XCIsIHBhcmVudENvbXBvbmVudCwgdHJ1ZSk7XG4gICAgfVxuICAgIGlmIChwYXRjaEZsYWcgPT09IC0yKSB7XG4gICAgICBvcHRpbWl6ZWQgPSBmYWxzZTtcbiAgICAgIHZub2RlLmR5bmFtaWNDaGlsZHJlbiA9IG51bGw7XG4gICAgfVxuICAgIGxldCBuZXh0Tm9kZSA9IG51bGw7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIFRleHQ6XG4gICAgICAgIGlmIChkb21UeXBlICE9PSAzIC8qIFRFWFQgKi8pIHtcbiAgICAgICAgICBpZiAodm5vZGUuY2hpbGRyZW4gPT09IFwiXCIpIHtcbiAgICAgICAgICAgIGluc2VydCh2bm9kZS5lbCA9IGNyZWF0ZVRleHQoXCJcIiksIHBhcmVudE5vZGUobm9kZSksIG5vZGUpO1xuICAgICAgICAgICAgbmV4dE5vZGUgPSBub2RlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBuZXh0Tm9kZSA9IG9uTWlzbWF0Y2goKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKG5vZGUuZGF0YSAhPT0gdm5vZGUuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHx8IF9fVlVFX1BST0RfSFlEUkFUSU9OX01JU01BVENIX0RFVEFJTFNfXykgJiYgd2FybiQxKFxuICAgICAgICAgICAgICBgSHlkcmF0aW9uIHRleHQgbWlzbWF0Y2ggaW5gLFxuICAgICAgICAgICAgICBub2RlLnBhcmVudE5vZGUsXG4gICAgICAgICAgICAgIGBcbiAgLSByZW5kZXJlZCBvbiBzZXJ2ZXI6ICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICAgICAgbm9kZS5kYXRhXG4gICAgICAgICAgICAgICl9XG4gIC0gZXhwZWN0ZWQgb24gY2xpZW50OiAke0pTT04uc3RyaW5naWZ5KHZub2RlLmNoaWxkcmVuKX1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgbG9nTWlzbWF0Y2hFcnJvcigpO1xuICAgICAgICAgICAgbm9kZS5kYXRhID0gdm5vZGUuY2hpbGRyZW47XG4gICAgICAgICAgfVxuICAgICAgICAgIG5leHROb2RlID0gbmV4dFNpYmxpbmcobm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIENvbW1lbnQ6XG4gICAgICAgIGlmIChpc1RlbXBsYXRlTm9kZShub2RlKSkge1xuICAgICAgICAgIG5leHROb2RlID0gbmV4dFNpYmxpbmcobm9kZSk7XG4gICAgICAgICAgcmVwbGFjZU5vZGUoXG4gICAgICAgICAgICB2bm9kZS5lbCA9IG5vZGUuY29udGVudC5maXJzdENoaWxkLFxuICAgICAgICAgICAgbm9kZSxcbiAgICAgICAgICAgIHBhcmVudENvbXBvbmVudFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAoZG9tVHlwZSAhPT0gOCAvKiBDT01NRU5UICovIHx8IGlzRnJhZ21lbnRTdGFydCkge1xuICAgICAgICAgIG5leHROb2RlID0gb25NaXNtYXRjaCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5leHROb2RlID0gbmV4dFNpYmxpbmcobm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFN0YXRpYzpcbiAgICAgICAgaWYgKGlzRnJhZ21lbnRTdGFydCkge1xuICAgICAgICAgIG5vZGUgPSBuZXh0U2libGluZyhub2RlKTtcbiAgICAgICAgICBkb21UeXBlID0gbm9kZS5ub2RlVHlwZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZG9tVHlwZSA9PT0gMSAvKiBFTEVNRU5UICovIHx8IGRvbVR5cGUgPT09IDMgLyogVEVYVCAqLykge1xuICAgICAgICAgIG5leHROb2RlID0gbm9kZTtcbiAgICAgICAgICBjb25zdCBuZWVkVG9BZG9wdENvbnRlbnQgPSAhdm5vZGUuY2hpbGRyZW4ubGVuZ3RoO1xuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdm5vZGUuc3RhdGljQ291bnQ7IGkrKykge1xuICAgICAgICAgICAgaWYgKG5lZWRUb0Fkb3B0Q29udGVudClcbiAgICAgICAgICAgICAgdm5vZGUuY2hpbGRyZW4gKz0gbmV4dE5vZGUubm9kZVR5cGUgPT09IDEgLyogRUxFTUVOVCAqLyA/IG5leHROb2RlLm91dGVySFRNTCA6IG5leHROb2RlLmRhdGE7XG4gICAgICAgICAgICBpZiAoaSA9PT0gdm5vZGUuc3RhdGljQ291bnQgLSAxKSB7XG4gICAgICAgICAgICAgIHZub2RlLmFuY2hvciA9IG5leHROb2RlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbmV4dE5vZGUgPSBuZXh0U2libGluZyhuZXh0Tm9kZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBpc0ZyYWdtZW50U3RhcnQgPyBuZXh0U2libGluZyhuZXh0Tm9kZSkgOiBuZXh0Tm9kZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvbk1pc21hdGNoKCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEZyYWdtZW50OlxuICAgICAgICBpZiAoIWlzRnJhZ21lbnRTdGFydCkge1xuICAgICAgICAgIG5leHROb2RlID0gb25NaXNtYXRjaCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5leHROb2RlID0gaHlkcmF0ZUZyYWdtZW50KFxuICAgICAgICAgICAgbm9kZSxcbiAgICAgICAgICAgI
20578HZub2RlLFxuICAgICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKHNoYXBlRmxhZyAmIDEpIHtcbiAgICAgICAgICBpZiAoKGRvbVR5cGUgIT09IDEgLyogRUxFTUVOVCAqLyB8fCB2bm9kZS50eXBlLnRvTG93ZXJDYXNlKCkgIT09IG5vZGUudGFnTmFtZS50b0xvd2VyQ2FzZSgpKSAmJiAhaXNUZW1wbGF0ZU5vZGUobm9kZSkpIHtcbiAgICAgICAgICAgIG5leHROb2RlID0gb25NaXNtYXRjaCgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBuZXh0Tm9kZSA9IGh5ZHJhdGVFbGVtZW50KFxuICAgICAgICAgICAgICBub2RlLFxuICAgICAgICAgICAgICB2bm9kZSxcbiAgICAgICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHNoYXBlRmxhZyAmIDYpIHtcbiAgICAgICAgICB2bm9kZS5zbG90U2NvcGVJZHMgPSBzbG90U2NvcGVJZHM7XG4gICAgICAgICAgY29uc3QgY29udGFpbmVyID0gcGFyZW50Tm9kZShub2RlKTtcbiAgICAgICAgICBpZiAoaXNGcmFnbWVudFN0YXJ0KSB7XG4gICAgICAgICAgICBuZXh0Tm9kZSA9IGxvY2F0ZUNsb3NpbmdBbmNob3Iobm9kZSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChpc0NvbW1lbnQobm9kZSkgJiYgbm9kZS5kYXRhID09PSBcInRlbGVwb3J0IHN0YXJ0XCIpIHtcbiAgICAgICAgICAgIG5leHROb2RlID0gbG9jYXRlQ2xvc2luZ0FuY2hvcihub2RlLCBub2RlLmRhdGEsIFwidGVsZXBvcnQgZW5kXCIpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBuZXh0Tm9kZSA9IG5leHRTaWJsaW5nKG5vZGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBtb3VudENvbXBvbmVudChcbiAgICAgICAgICAgIHZub2RlLFxuICAgICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgICAgZ2V0Q29udGFpbmVyVHlwZShjb250YWluZXIpLFxuICAgICAgICAgICAgb3B0aW1pemVkXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoaXNBc3luY1dyYXBwZXIodm5vZGUpKSB7XG4gICAgICAgICAgICBsZXQgc3ViVHJlZTtcbiAgICAgICAgICAgIGlmIChpc0ZyYWdtZW50U3RhcnQpIHtcbiAgICAgICAgICAgICAgc3ViVHJlZSA9IGNyZWF0ZVZOb2RlKEZyYWdtZW50KTtcbiAgICAgICAgICAgICAgc3ViVHJlZS5hbmNob3IgPSBuZXh0Tm9kZSA/IG5leHROb2RlLnByZXZpb3VzU2libGluZyA6IGNvbnRhaW5lci5sYXN0Q2hpbGQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzdWJUcmVlID0gbm9kZS5ub2RlVHlwZSA9PT0gMyA/IGNyZWF0ZVRleHRWTm9kZShcIlwiKSA6IGNyZWF0ZVZOb2RlKFwiZGl2XCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3ViVHJlZS5lbCA9IG5vZGU7XG4gICAgICAgICAgICB2bm9kZS5jb21wb25lbnQuc3ViVHJlZSA9IHN1YlRyZWU7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHNoYXBlRmxhZyAmIDY0KSB7XG4gICAgICAgICAgaWYgKGRvbVR5cGUgIT09IDggLyogQ09NTUVOVCAqLykge1xuICAgICAgICAgICAgbmV4dE5vZGUgPSBvbk1pc21hdGNoKCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5leHROb2RlID0gdm5vZGUudHlwZS5oeWRyYXRlKFxuICAgICAgICAgICAgICBub2RlLFxuICAgICAgICAgICAgICB2bm9kZSxcbiAgICAgICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgICAgICBvcHRpbWl6ZWQsXG4gICAgICAgICAgICAgIHJlbmRlcmVySW50ZXJuYWxzLFxuICAgICAgICAgICAgICBoeWRyYXRlQ2hpbGRyZW5cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHNoYXBlRmxhZyAmIDEyOCkge1xuICAgICAgICAgIG5leHROb2RlID0gdm5vZGUudHlwZS5oeWRyYXRlKFxuICAgICAgICAgICAgbm9kZSxcbiAgICAgICAgICAgIHZub2RlLFxuICAgICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgICBnZXRDb250YWluZXJUeXBlKHBhcmVudE5vZGUobm9kZSkpLFxuICAgICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgICAgb3B0aW1pemVkLFxuICAgICAgICAgICAgcmVuZGVyZXJJbnRlcm5hbHMsXG4gICAgICAgICAgICBoeWRyYXRlTm9kZVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCBfX1ZVRV9QUk9EX0hZRFJBVElPTl9NSVNNQVRDSF9ERVRBSUxTX18pIHtcbiAgICAgICAgICB3YXJuJDEoXCJJbnZhbGlkIEhvc3RWTm9kZSB0eXBlOlwiLCB0eXBlLCBgKCR7dHlwZW9mIHR5cGV9KWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChyZWYgIT0gbnVsbCkge1xuICAgICAgc2V0UmVmKHJlZiwgbnVsbCwgcGFyZW50U3VzcGVuc2UsIHZub2RlKTtcbiAgICB9XG4gICAgcmV0dXJuIG5leHROb2RlO1xuICB9O1xuICBjb25zdCBoeWRyYXRlRWxlbWVudCA9IChlbCwgdm5vZGUsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIHNsb3RTY29wZUlkcywgb3B0aW1pemVkKSA9PiB7XG4gICAgb3B0aW1pemVkID0gb3B0aW1pemVkIHx8ICEhdm5vZGUuZHluYW1pY0NoaWxkcmVuO1xuICAgIGNvbnN0IHsgdHlwZSwgcHJvcHMsIHBhdGNoRmxhZywgc2hhcGVGbGFnLCBkaXJzLCB0cmFuc2l0aW9uIH0gPSB2bm9kZTtcbiAgICBjb25zdCBmb3JjZVBhdGNoID0gdHlwZSA9PT0gXCJpbnB1dFwiIHx8IHR5cGUgPT09IFwib3B0aW9uXCI7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgZm9yY2VQYXRjaCB8fCBwYXRjaEZsYWcgIT09IC0xKSB7XG4gICAgICBpZiAoZGlycykge1xuICAgICAgICBpbnZva2VEaXJlY3RpdmVIb29rKHZub2Rl
20578LCBudWxsLCBwYXJlbnRDb21wb25lbnQsIFwiY3JlYXRlZFwiKTtcbiAgICAgIH1cbiAgICAgIGxldCBuZWVkQ2FsbFRyYW5zaXRpb25Ib29rcyA9IGZhbHNlO1xuICAgICAgaWYgKGlzVGVtcGxhdGVOb2RlKGVsKSkge1xuICAgICAgICBuZWVkQ2FsbFRyYW5zaXRpb25Ib29rcyA9IG5lZWRUcmFuc2l0aW9uKHBhcmVudFN1c3BlbnNlLCB0cmFuc2l0aW9uKSAmJiBwYXJlbnRDb21wb25lbnQgJiYgcGFyZW50Q29tcG9uZW50LnZub2RlLnByb3BzICYmIHBhcmVudENvbXBvbmVudC52bm9kZS5wcm9wcy5hcHBlYXI7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBlbC5jb250ZW50LmZpcnN0Q2hpbGQ7XG4gICAgICAgIGlmIChuZWVkQ2FsbFRyYW5zaXRpb25Ib29rcykge1xuICAgICAgICAgIHRyYW5zaXRpb24uYmVmb3JlRW50ZXIoY29udGVudCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVwbGFjZU5vZGUoY29udGVudCwgZWwsIHBhcmVudENvbXBvbmVudCk7XG4gICAgICAgIHZub2RlLmVsID0gZWwgPSBjb250ZW50O1xuICAgICAgfVxuICAgICAgaWYgKHNoYXBlRmxhZyAmIDE2ICYmIC8vIHNraXAgaWYgZWxlbWVudCBoYXMgaW5uZXJIVE1MIC8gdGV4dENvbnRlbnRcbiAgICAgICEocHJvcHMgJiYgKHByb3BzLmlubmVySFRNTCB8fCBwcm9wcy50ZXh0Q29udGVudCkpKSB7XG4gICAgICAgIGxldCBuZXh0ID0gaHlkcmF0ZUNoaWxkcmVuKFxuICAgICAgICAgIGVsLmZpcnN0Q2hpbGQsXG4gICAgICAgICAgdm5vZGUsXG4gICAgICAgICAgZWwsXG4gICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgKTtcbiAgICAgICAgbGV0IGhhc1dhcm5lZCA9IGZhbHNlO1xuICAgICAgICB3aGlsZSAobmV4dCkge1xuICAgICAgICAgIGlmICgoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCBfX1ZVRV9QUk9EX0hZRFJBVElPTl9NSVNNQVRDSF9ERVRBSUxTX18pICYmICFoYXNXYXJuZWQpIHtcbiAgICAgICAgICAgIHdhcm4kMShcbiAgICAgICAgICAgICAgYEh5ZHJhdGlvbiBjaGlsZHJlbiBtaXNtYXRjaCBvbmAsXG4gICAgICAgICAgICAgIGVsLFxuICAgICAgICAgICAgICBgXG5TZXJ2ZXIgcmVuZGVyZWQgZWxlbWVudCBjb250YWlucyBtb3JlIGNoaWxkIG5vZGVzIHRoYW4gY2xpZW50IHZkb20uYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGhhc1dhcm5lZCA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGxvZ01pc21hdGNoRXJyb3IoKTtcbiAgICAgICAgICBjb25zdCBjdXIgPSBuZXh0O1xuICAgICAgICAgIG5leHQgPSBuZXh0Lm5leHRTaWJsaW5nO1xuICAgICAgICAgIHJlbW92ZShjdXIpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHNoYXBlRmxhZyAmIDgpIHtcbiAgICAgICAgaWYgKGVsLnRleHRDb250ZW50ICE9PSB2bm9kZS5jaGlsZHJlbikge1xuICAgICAgICAgICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHx8IF9fVlVFX1BST0RfSFlEUkFUSU9OX01JU01BVENIX0RFVEFJTFNfXykgJiYgd2FybiQxKFxuICAgICAgICAgICAgYEh5ZHJhdGlvbiB0ZXh0IGNvbnRlbnQgbWlzbWF0Y2ggb25gLFxuICAgICAgICAgICAgZWwsXG4gICAgICAgICAgICBgXG4gIC0gcmVuZGVyZWQgb24gc2VydmVyOiAke2VsLnRleHRDb250ZW50fVxuICAtIGV4cGVjdGVkIG9uIGNsaWVudDogJHt2bm9kZS5jaGlsZHJlbn1gXG4gICAgICAgICAgKTtcbiAgICAgICAgICBsb2dNaXNtYXRjaEVycm9yKCk7XG4gICAgICAgICAgZWwudGV4dENvbnRlbnQgPSB2bm9kZS5jaGlsZHJlbjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHByb3BzKSB7XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHx8IF9fVlVFX1BST0RfSFlEUkFUSU9OX01JU01BVENIX0RFVEFJTFNfXyB8fCBmb3JjZVBhdGNoIHx8ICFvcHRpbWl6ZWQgfHwgcGF0Y2hGbGFnICYgKDE2IHwgMzIpKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gcHJvcHMpIHtcbiAgICAgICAgICAgIGlmICgoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCBfX1ZVRV9QUk9EX0hZRFJBVElPTl9NSVNNQVRDSF9ERVRBSUxTX18pICYmIC8vICMxMTE4OSBza2lwIGlmIHRoaXMgbm9kZSBoYXMgZGlyZWN0aXZlcyB0aGF0IGhhdmUgY3JlYXRlZCBob29rc1xuICAgICAgICAgICAgLy8gYXMgaXQgY291bGQgaGF2ZSBtdXRhdGVkIHRoZSBET00gaW4gYW55IHBvc3NpYmxlIHdheVxuICAgICAgICAgICAgIShkaXJzICYmIGRpcnMuc29tZSgoZCkgPT4gZC5kaXIuY3JlYXRlZCkpICYmIHByb3BIYXNNaXNtYXRjaChlbCwga2V5LCBwcm9wc1trZXldLCB2bm9kZSwgcGFyZW50Q29tcG9uZW50KSkge1xuICAgICAgICAgICAgICBsb2dNaXNtYXRjaEVycm9yKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZm9yY2VQYXRjaCAmJiAoa2V5LmVuZHNXaXRoKFwidmFsdWVcIikgfHwga2V5ID09PSBcImluZGV0ZXJtaW5hdGVcIikgfHwgaXNPbihrZXkpICYmICFpc1Jlc2VydmVkUHJvcChrZXkpIHx8IC8vIGZvcmNlIGh5ZHJhdGUgdi1iaW5kIHdpdGggLnByb3AgbW9kaWZpZXJzXG4gICAgICAgICAgICBrZXlbMF0gPT09IFwiLlwiKSB7XG4gICAgICAgICAgICAgIHBhdGNoUHJvcChlbCwga2V5LCBudWxsLCBwcm9wc1trZXldLCB2b2lkIDAsIHBhcmVudENvbXBvbmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHByb3BzLm9uQ2xpY2spIHtcbiAgICAgICAgICBwYXRjaFByb3AoXG4gICAgICAgICAgICBlbCxcbiAgICAgICAgICAgIFwib25DbGlja1wiLFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIHByb3BzLm9uQ2xpY2ssXG4gICAgICAgICAgICB2b2lkIDAsXG4gICAgICAgICAgICBwYXJlbnRDb21wb25lbnRcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKHBhdGNoRmxhZyAmIDQgJiYgaXNSZWFjdGl2ZShwcm9wcy5zdHlsZSkpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBwcm9wcy5zdHlsZSkgcHJvcHMuc3R5bGVba2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbGV0IHZub2RlSG9va3M7XG4gICAgICBpZiAodm5vZGVIb29rcyA9IHByb3BzICYmIHByb3BzLm9uVm5vZGVCZWZvcmVNb3VudCkge1xuICAgICAgICBpbnZva2VWTm9kZUhvb2sodm5vZGVIb29rcywgcGFyZW50Q29tcG9uZW50LCB2bm9kZSk7XG4gICAgICB9XG4gICAgICBpZiAoZGlycykge1xuICAgICAgICBpbnZva2VEaXJlY3RpdmVIb29rKHZub2Rl
20578LCBudWxsLCBwYXJlbnRDb21wb25lbnQsIFwiYmVmb3JlTW91bnRcIik7XG4gICAgICB9XG4gICAgICBpZiAoKHZub2RlSG9va3MgPSBwcm9wcyAmJiBwcm9wcy5vblZub2RlTW91bnRlZCkgfHwgZGlycyB8fCBuZWVkQ2FsbFRyYW5zaXRpb25Ib29rcykge1xuICAgICAgICBxdWV1ZUVmZmVjdFdpdGhTdXNwZW5zZSgoKSA9PiB7XG4gICAgICAgICAgdm5vZGVIb29rcyAmJiBpbnZva2VWTm9kZUhvb2sodm5vZGVIb29rcywgcGFyZW50Q29tcG9uZW50LCB2bm9kZSk7XG4gICAgICAgICAgbmVlZENhbGxUcmFuc2l0aW9uSG9va3MgJiYgdHJhbnNpdGlvbi5lbnRlcihlbCk7XG4gICAgICAgICAgZGlycyAmJiBpbnZva2VEaXJlY3RpdmVIb29rKHZub2RlLCBudWxsLCBwYXJlbnRDb21wb25lbnQsIFwibW91bnRlZFwiKTtcbiAgICAgICAgfSwgcGFyZW50U3VzcGVuc2UpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZWwubmV4dFNpYmxpbmc7XG4gIH07XG4gIGNvbnN0IGh5ZHJhdGVDaGlsZHJlbiA9IChub2RlLCBwYXJlbnRWTm9kZSwgY29udGFpbmVyLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBzbG90U2NvcGVJZHMsIG9wdGltaXplZCkgPT4ge1xuICAgIG9wdGltaXplZCA9IG9wdGltaXplZCB8fCAhIXBhcmVudFZOb2RlLmR5bmFtaWNDaGlsZHJlbjtcbiAgICBjb25zdCBjaGlsZHJlbiA9IHBhcmVudFZOb2RlLmNoaWxkcmVuO1xuICAgIGNvbnN0IGwgPSBjaGlsZHJlbi5sZW5ndGg7XG4gICAgbGV0IGhhc1dhcm5lZCA9IGZhbHNlO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbDsgaSsrKSB7XG4gICAgICBjb25zdCB2bm9kZSA9IG9wdGltaXplZCA/IGNoaWxkcmVuW2ldIDogY2hpbGRyZW5baV0gPSBub3JtYWxpemVWTm9kZShjaGlsZHJlbltpXSk7XG4gICAgICBjb25zdCBpc1RleHQgPSB2bm9kZS50eXBlID09PSBUZXh0O1xuICAgICAgaWYgKG5vZGUpIHtcbiAgICAgICAgaWYgKGlzVGV4dCAmJiAhb3B0aW1pemVkKSB7XG4gICAgICAgICAgbGV0IG5leHQgPSBjaGlsZHJlbltpICsgMV07XG4gICAgICAgICAgaWYgKG5leHQgJiYgKG5leHQgPSBub3JtYWxpemVWTm9kZShuZXh0KSkudHlwZSA9PT0gVGV4dCkge1xuICAgICAgICAgICAgaW5zZXJ0KFxuICAgICAgICAgICAgICBjcmVhdGVUZXh0KFxuICAgICAgICAgICAgICAgIG5vZGUuZGF0YS5zbGljZSh2bm9kZS5jaGlsZHJlbi5sZW5ndGgpXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICAgICAgbmV4dFNpYmxpbmcobm9kZSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBub2RlLmRhdGEgPSB2bm9kZS5jaGlsZHJlbjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbm9kZSA9IGh5ZHJhdGVOb2RlKFxuICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgdm5vZGUsXG4gICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAoaXNUZXh0ICYmICF2bm9kZS5jaGlsZHJlbikge1xuICAgICAgICBpbnNlcnQodm5vZGUuZWwgPSBjcmVhdGVUZXh0KFwiXCIpLCBjb250YWluZXIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKCghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHx8IF9fVlVFX1BST0RfSFlEUkFUSU9OX01JU01BVENIX0RFVEFJTFNfXykgJiYgIWhhc1dhcm5lZCkge1xuICAgICAgICAgIHdhcm4kMShcbiAgICAgICAgICAgIGBIeWRyYXRpb24gY2hpbGRyZW4gbWlzbWF0Y2ggb25gLFxuICAgICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgICAgYFxuU2VydmVyIHJlbmRlcmVkIGVsZW1lbnQgY29udGFpbnMgZmV3ZXIgY2hpbGQgbm9kZXMgdGhhbiBjbGllbnQgdmRvbS5gXG4gICAgICAgICAgKTtcbiAgICAgICAgICBoYXNXYXJuZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGxvZ01pc21hdGNoRXJyb3IoKTtcbiAgICAgICAgcGF0Y2goXG4gICAgICAgICAgbnVsbCxcbiAgICAgICAgICB2bm9kZSxcbiAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgbnVsbCxcbiAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgZ2V0Q29udGFpbmVyVHlwZShjb250YWluZXIpLFxuICAgICAgICAgIHNsb3RTY29wZUlkc1xuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbm9kZTtcbiAgfTtcbiAgY29uc3QgaHlkcmF0ZUZyYWdtZW50ID0gKG5vZGUsIHZub2RlLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBzbG90U2NvcGVJZHMsIG9wdGltaXplZCkgPT4ge1xuICAgIGNvbnN0IHsgc2xvdFNjb3BlSWRzOiBmcmFnbWVudFNsb3RTY29wZUlkcyB9ID0gdm5vZGU7XG4gICAgaWYgKGZyYWdtZW50U2xvdFNjb3BlSWRzKSB7XG4gICAgICBzbG90U2NvcGVJZHMgPSBzbG90U2NvcGVJZHMgPyBzbG90U2NvcGVJZHMuY29uY2F0KGZyYWdtZW50U2xvdFNjb3BlSWRzKSA6IGZyYWdtZW50U2xvdFNjb3BlSWRzO1xuICAgIH1cbiAgICBjb25zdCBjb250YWluZXIgPSBwYXJlbnROb2RlKG5vZGUpO1xuICAgIGNvbnN0IG5leHQgPSBoeWRyYXRlQ2hpbGRyZW4oXG4gICAgICBuZXh0U2libGluZyhub2RlKSxcbiAgICAgIHZub2RlLFxuICAgICAgY29udGFpbmVyLFxuICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICBzbG90U2NvcGVJZHMsXG4gICAgICBvcHRpbWl6ZWRcbiAgICApO1xuICAgIGlmIChuZXh0ICYmIGlzQ29tbWVudChuZXh0KSAmJiBuZXh0LmRhdGEgPT09IFwiXVwiKSB7XG4gICAgICByZXR1cm4gbmV4dFNpYmxpbmcodm5vZGUuYW5jaG9yID0gbmV4dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZ01pc21hdGNoRXJyb3IoKTtcbiAgICAgIGluc2VydCh2bm9kZS5hbmNob3IgPSBjcmVhdGVDb21tZW50KGBdYCksIGNvbnRhaW5lciwgbmV4dCk7XG4gICAgICByZXR1cm4gbmV4dDtcbiAgICB9XG4gI
20578H07XG4gIGNvbnN0IGhhbmRsZU1pc21hdGNoID0gKG5vZGUsIHZub2RlLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBzbG90U2NvcGVJZHMsIGlzRnJhZ21lbnQpID0+IHtcbiAgICAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCBfX1ZVRV9QUk9EX0hZRFJBVElPTl9NSVNNQVRDSF9ERVRBSUxTX18pICYmIHdhcm4kMShcbiAgICAgIGBIeWRyYXRpb24gbm9kZSBtaXNtYXRjaDpcbi0gcmVuZGVyZWQgb24gc2VydmVyOmAsXG4gICAgICBub2RlLFxuICAgICAgbm9kZS5ub2RlVHlwZSA9PT0gMyAvKiBURVhUICovID8gYCh0ZXh0KWAgOiBpc0NvbW1lbnQobm9kZSkgJiYgbm9kZS5kYXRhID09PSBcIltcIiA/IGAoc3RhcnQgb2YgZnJhZ21lbnQpYCA6IGBgLFxuICAgICAgYFxuLSBleHBlY3RlZCBvbiBjbGllbnQ6YCxcbiAgICAgIHZub2RlLnR5cGVcbiAgICApO1xuICAgIGxvZ01pc21hdGNoRXJyb3IoKTtcbiAgICB2bm9kZS5lbCA9IG51bGw7XG4gICAgaWYgKGlzRnJhZ21lbnQpIHtcbiAgICAgIGNvbnN0IGVuZCA9IGxvY2F0ZUNsb3NpbmdBbmNob3Iobm9kZSk7XG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICBjb25zdCBuZXh0MiA9IG5leHRTaWJsaW5nKG5vZGUpO1xuICAgICAgICBpZiAobmV4dDIgJiYgbmV4dDIgIT09IGVuZCkge1xuICAgICAgICAgIHJlbW92ZShuZXh0Mik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgbmV4dCA9IG5leHRTaWJsaW5nKG5vZGUpO1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IHBhcmVudE5vZGUobm9kZSk7XG4gICAgcmVtb3ZlKG5vZGUpO1xuICAgIHBhdGNoKFxuICAgICAgbnVsbCxcbiAgICAgIHZub2RlLFxuICAgICAgY29udGFpbmVyLFxuICAgICAgbmV4dCxcbiAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgZ2V0Q29udGFpbmVyVHlwZShjb250YWluZXIpLFxuICAgICAgc2xvdFNjb3BlSWRzXG4gICAgKTtcbiAgICByZXR1cm4gbmV4dDtcbiAgfTtcbiAgY29uc3QgbG9jYXRlQ2xvc2luZ0FuY2hvciA9IChub2RlLCBvcGVuID0gXCJbXCIsIGNsb3NlID0gXCJdXCIpID0+IHtcbiAgICBsZXQgbWF0Y2ggPSAwO1xuICAgIHdoaWxlIChub2RlKSB7XG4gICAgICBub2RlID0gbmV4dFNpYmxpbmcobm9kZSk7XG4gICAgICBpZiAobm9kZSAmJiBpc0NvbW1lbnQobm9kZSkpIHtcbiAgICAgICAgaWYgKG5vZGUuZGF0YSA9PT0gb3BlbikgbWF0Y2grKztcbiAgICAgICAgaWYgKG5vZGUuZGF0YSA9PT0gY2xvc2UpIHtcbiAgICAgICAgICBpZiAobWF0Y2ggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBuZXh0U2libGluZyhub2RlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbWF0Y2gtLTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5vZGU7XG4gIH07XG4gIGNvbnN0IHJlcGxhY2VOb2RlID0gKG5ld05vZGUsIG9sZE5vZGUsIHBhcmVudENvbXBvbmVudCkgPT4ge1xuICAgIGNvbnN0IHBhcmVudE5vZGUyID0gb2xkTm9kZS5wYXJlbnROb2RlO1xuICAgIGlmIChwYXJlbnROb2RlMikge1xuICAgICAgcGFyZW50Tm9kZTIucmVwbGFjZUNoaWxkKG5ld05vZGUsIG9sZE5vZGUpO1xuICAgIH1cbiAgICBsZXQgcGFyZW50ID0gcGFyZW50Q29tcG9uZW50O1xuICAgIHdoaWxlIChwYXJlbnQpIHtcbiAgICAgIGlmIChwYXJlbnQudm5vZGUuZWwgPT09IG9sZE5vZGUpIHtcbiAgICAgICAgcGFyZW50LnZub2RlLmVsID0gcGFyZW50LnN1YlRyZWUuZWwgPSBuZXdOb2RlO1xuICAgICAgfVxuICAgICAgcGFyZW50ID0gcGFyZW50LnBhcmVudDtcbiAgICB9XG4gIH07XG4gIGNvbnN0IGlzVGVtcGxhdGVOb2RlID0gKG5vZGUpID0+IHtcbiAgICByZXR1cm4gbm9kZS5ub2RlVHlwZSA9PT0gMSAvKiBFTEVNRU5UICovICYmIG5vZGUudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcInRlbXBsYXRlXCI7XG4gIH07XG4gIHJldHVybiBbaHlkcmF0ZSwgaHlkcmF0ZU5vZGVdO1xufVxuZnVuY3Rpb24gcHJvcEhhc01pc21hdGNoKGVsLCBrZXksIGNsaWVudFZhbHVlLCB2bm9kZSwgaW5zdGFuY2UpIHtcbiAgbGV0IG1pc21hdGNoVHlwZTtcbiAgbGV0IG1pc21hdGNoS2V5O1xuICBsZXQgYWN0dWFsO1xuICBsZXQgZXhwZWN0ZWQ7XG4gIGlmIChrZXkgPT09IFwiY2xhc3NcIikge1xuICAgIGFjdHVhbCA9IGVsLmdldEF0dHJpYnV0ZShcImNsYXNzXCIpO1xuICAgIGV4cGVjdGVkID0gbm9ybWFsaXplQ2xhc3MoY2xpZW50VmFsdWUpO1xuICAgIGlmICghaXNTZXRFcXVhbCh0b0NsYXNzU2V0KGFjdHVhbCB8fCBcIlwiKSwgdG9DbGFzc1NldChleHBlY3RlZCkpKSB7XG4gICAgICBtaXNtYXRjaFR5cGUgPSBtaXNtYXRjaEtleSA9IGBjbGFzc2A7XG4gICAgfVxuICB9IGVsc2UgaWYgKGtleSA9PT0gXCJzdHlsZVwiKSB7XG4gICAgYWN0dWFsID0gZWwuZ2V0QXR0cmlidXRlKFwic3R5bGVcIikgfHwgXCJcIjtcbiAgICBleHBlY3RlZCA9IGlzU3RyaW5nKGNsaWVudFZhbHVlKSA/IGNsaWVudFZhbHVlIDogc3RyaW5naWZ5U3R5bGUobm9ybWFsaXplU3R5bGUoY2xpZW50VmFsdWUpKTtcbiAgICBjb25zdCBhY3R1YWxNYXAgPSB0b1N0eWxlTWFwKGFjdHVhbCk7XG4gICAgY29uc3QgZXhwZWN0ZWRNYXAgPSB0b1N0eWxlTWFwKGV4cGVjdGVkKTtcbiAgICBpZiAodm5vZGUuZGlycykge1xuICAgICAgZm9yIChjb25zdCB7IGRpciwgdmFsdWUgfSBvZiB2bm9kZS5kaXJzKSB7XG4gICAgICAgIGlmIChkaXIubmFtZSA9PT0gXCJzaG93XCIgJiYgIXZhbHVlKSB7XG4gICAgICAgICAgZXhwZWN0ZWRNYXAuc2V0KFwiZGlzcGxheVwiLCBcIm5vbmVcIik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGluc3RhbmNlKSB7XG4gICAgICByZXNvbHZlQ3NzVmFycyhpbnN0YW5jZSwgdm5vZGUsIGV4cGVjdGVkTWFwKTtcbiAgICB9XG4gICAgaWYgKCFpc01hcEVxdWFsKGFjdHVhbE1hcCwgZXhwZWN0ZWRNYXApKSB7XG4gICAgICBtaXNtYXRjaFR5cGUgPSBtaXNtYXRjaEtleSA9IFwic3R5bGVcIjtcbiAgICB9XG4gI
20578H0gZWxzZSBpZiAoZWwgaW5zdGFuY2VvZiBTVkdFbGVtZW50ICYmIGlzS25vd25TdmdBdHRyKGtleSkgfHwgZWwgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJiAoaXNCb29sZWFuQXR0cihrZXkpIHx8IGlzS25vd25IdG1sQXR0cihrZXkpKSkge1xuICAgIGlmIChpc0Jvb2xlYW5BdHRyKGtleSkpIHtcbiAgICAgIGFjdHVhbCA9IGVsLmhhc0F0dHJpYnV0ZShrZXkpO1xuICAgICAgZXhwZWN0ZWQgPSBpbmNsdWRlQm9vbGVhbkF0dHIoY2xpZW50VmFsdWUpO1xuICAgIH0gZWxzZSBpZiAoY2xpZW50VmFsdWUgPT0gbnVsbCkge1xuICAgICAgYWN0dWFsID0gZWwuaGFzQXR0cmlidXRlKGtleSk7XG4gICAgICBleHBlY3RlZCA9IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoZWwuaGFzQXR0cmlidXRlKGtleSkpIHtcbiAgICAgICAgYWN0dWFsID0gZWwuZ2V0QXR0cmlidXRlKGtleSk7XG4gICAgICB9IGVsc2UgaWYgKGtleSA9PT0gXCJ2YWx1ZVwiICYmIGVsLnRhZ05hbWUgPT09IFwiVEVYVEFSRUFcIikge1xuICAgICAgICBhY3R1YWwgPSBlbC52YWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFjdHVhbCA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgZXhwZWN0ZWQgPSBpc1JlbmRlcmFibGVBdHRyVmFsdWUoY2xpZW50VmFsdWUpID8gU3RyaW5nKGNsaWVudFZhbHVlKSA6IGZhbHNlO1xuICAgIH1cbiAgICBpZiAoYWN0dWFsICE9PSBleHBlY3RlZCkge1xuICAgICAgbWlzbWF0Y2hUeXBlID0gYGF0dHJpYnV0ZWA7XG4gICAgICBtaXNtYXRjaEtleSA9IGtleTtcbiAgICB9XG4gIH1cbiAgaWYgKG1pc21hdGNoVHlwZSkge1xuICAgIGNvbnN0IGZvcm1hdCA9ICh2KSA9PiB2ID09PSBmYWxzZSA/IGAobm90IHJlbmRlcmVkKWAgOiBgJHttaXNtYXRjaEtleX09XCIke3Z9XCJgO1xuICAgIGNvbnN0IHByZVNlZ21lbnQgPSBgSHlkcmF0aW9uICR7bWlzbWF0Y2hUeXBlfSBtaXNtYXRjaCBvbmA7XG4gICAgY29uc3QgcG9zdFNlZ21lbnQgPSBgXG4gIC0gcmVuZGVyZWQgb24gc2VydmVyOiAke2Zvcm1hdChhY3R1YWwpfVxuICAtIGV4cGVjdGVkIG9uIGNsaWVudDogJHtmb3JtYXQoZXhwZWN0ZWQpfVxuICBOb3RlOiB0aGlzIG1pc21hdGNoIGlzIGNoZWNrLW9ubHkuIFRoZSBET00gd2lsbCBub3QgYmUgcmVjdGlmaWVkIGluIHByb2R1Y3Rpb24gZHVlIHRvIHBlcmZvcm1hbmNlIG92ZXJoZWFkLlxuICBZb3Ugc2hvdWxkIGZpeCB0aGUgc291cmNlIG9mIHRoZSBtaXNtYXRjaC5gO1xuICAgIHtcbiAgICAgIHdhcm4kMShwcmVTZWdtZW50LCBlbCwgcG9zdFNlZ21lbnQpO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiB0b0NsYXNzU2V0KHN0cikge1xuICByZXR1cm4gbmV3IFNldChzdHIudHJpbSgpLnNwbGl0KC9cXHMrLykpO1xufVxuZnVuY3Rpb24gaXNTZXRFcXVhbChhLCBiKSB7XG4gIGlmIChhLnNpemUgIT09IGIuc2l6ZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBmb3IgKGNvbnN0IHMgb2YgYSkge1xuICAgIGlmICghYi5oYXMocykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5mdW5jdGlvbiB0b1N0eWxlTWFwKHN0cikge1xuICBjb25zdCBzdHlsZU1hcCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG4gIGZvciAoY29uc3QgaXRlbSBvZiBzdHIuc3BsaXQoXCI7XCIpKSB7XG4gICAgbGV0IFtrZXksIHZhbHVlXSA9IGl0ZW0uc3BsaXQoXCI6XCIpO1xuICAgIGtleSA9IGtleS50cmltKCk7XG4gICAgdmFsdWUgPSB2YWx1ZSAmJiB2YWx1ZS50cmltKCk7XG4gICAgaWYgKGtleSAmJiB2YWx1ZSkge1xuICAgICAgc3R5bGVNYXAuc2V0KGtleSwgdmFsdWUpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gc3R5bGVNYXA7XG59XG5mdW5jdGlvbiBpc01hcEVxdWFsKGEsIGIpIHtcbiAgaWYgKGEuc2l6ZSAhPT0gYi5zaXplKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGEpIHtcbiAgICBpZiAodmFsdWUgIT09IGIuZ2V0KGtleSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5mdW5jdGlvbiByZXNvbHZlQ3NzVmFycyhpbnN0YW5jZSwgdm5vZGUsIGV4cGVjdGVkTWFwKSB7XG4gIGNvbnN0IHJvb3QgPSBpbnN0YW5jZS5zdWJUcmVlO1xuICBpZiAoaW5zdGFuY2UuZ2V0Q3NzVmFycyAmJiAodm5vZGUgPT09IHJvb3QgfHwgcm9vdCAmJiByb290LnR5cGUgPT09IEZyYWdtZW50ICYmIHJvb3QuY2hpbGRyZW4uaW5jbHVkZXModm5vZGUpKSkge1xuICAgIGNvbnN0IGNzc1ZhcnMgPSBpbnN0YW5jZS5nZXRDc3NWYXJzKCk7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gY3NzVmFycykge1xuICAgICAgZXhwZWN0ZWRNYXAuc2V0KGAtLSR7a2V5fWAsIFN0cmluZyhjc3NWYXJzW2tleV0pKTtcbiAgICB9XG4gIH1cbiAgaWYgKHZub2RlID09PSByb290ICYmIGluc3RhbmNlLnBhcmVudCkge1xuICAgIHJlc29sdmVDc3NWYXJzKGluc3RhbmNlLnBhcmVudCwgaW5zdGFuY2Uudm5vZGUsIGV4cGVjdGVkTWFwKTtcbiAgfVxufVxuXG5sZXQgc3VwcG9ydGVkO1xubGV0IHBlcmY7XG5mdW5jdGlvbiBzdGFydE1lYXN1cmUoaW5zdGFuY2UsIHR5cGUpIHtcbiAgaWYgKGluc3RhbmNlLmFwcENvbnRleHQuY29uZmlnLnBlcmZvcm1hbmNlICYmIGlzU3VwcG9ydGVkKCkpIHtcbiAgICBwZXJmLm1hcmsoYHZ1ZS0ke3R5cGV9LSR7aW5zdGFuY2UudWlkfWApO1xuICB9XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHx8IF9fVlVFX1BST0RfREVWVE9PTFNfXykge1xuICAgIGRldnRvb2xzUGVyZlN0YXJ0KGluc3RhbmNlLCB0eXBlLCBpc1N1cHBvcnRlZCgpID8gcGVyZi5ub3coKSA6IERhdGUubm93KCkpO1xuICB9XG59XG5mdW5jdGlvbiBlbmRNZWFzdXJlKGluc3RhbmNlLCB0eXBlKSB7XG4gIGlmIChpbnN0YW5jZS5hcHBDb250ZXh0LmNvbmZpZy5wZXJmb3JtYW5jZSAmJiBpc1N1cHBvcnRlZCgpKSB7XG4gICAgY29uc3Qgc3RhcnRUYWcgPSBgdnVlLSR7dHlwZX0tJHtpbnN0YW5jZS51aWR9YDtcbiAgICBjb25zdCBlbmRUYWcgPSBzdGFydFRhZyArIGA6ZW5kYDtcbiAgICBwZXJmLm1hcmsoZW5kVGFnKTtcbiAgICBwZXJmLm1lYXN1cmU
20578oXG4gICAgICBgPCR7Zm9ybWF0Q29tcG9uZW50TmFtZShpbnN0YW5jZSwgaW5zdGFuY2UudHlwZSl9PiAke3R5cGV9YCxcbiAgICAgIHN0YXJ0VGFnLFxuICAgICAgZW5kVGFnXG4gICAgKTtcbiAgICBwZXJmLmNsZWFyTWFya3Moc3RhcnRUYWcpO1xuICAgIHBlcmYuY2xlYXJNYXJrcyhlbmRUYWcpO1xuICB9XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHx8IF9fVlVFX1BST0RfREVWVE9PTFNfXykge1xuICAgIGRldnRvb2xzUGVyZkVuZChpbnN0YW5jZSwgdHlwZSwgaXNTdXBwb3J0ZWQoKSA/IHBlcmYubm93KCkgOiBEYXRlLm5vdygpKTtcbiAgfVxufVxuZnVuY3Rpb24gaXNTdXBwb3J0ZWQoKSB7XG4gIGlmIChzdXBwb3J0ZWQgIT09IHZvaWQgMCkge1xuICAgIHJldHVybiBzdXBwb3J0ZWQ7XG4gIH1cbiAgaWYgKHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgJiYgd2luZG93LnBlcmZvcm1hbmNlKSB7XG4gICAgc3VwcG9ydGVkID0gdHJ1ZTtcbiAgICBwZXJmID0gd2luZG93LnBlcmZvcm1hbmNlO1xuICB9IGVsc2Uge1xuICAgIHN1cHBvcnRlZCA9IGZhbHNlO1xuICB9XG4gIHJldHVybiBzdXBwb3J0ZWQ7XG59XG5cbmZ1bmN0aW9uIGluaXRGZWF0dXJlRmxhZ3MoKSB7XG4gIGNvbnN0IG5lZWRXYXJuID0gW107XG4gIGlmICh0eXBlb2YgX19WVUVfT1BUSU9OU19BUElfXyAhPT0gXCJib29sZWFuXCIpIHtcbiAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIG5lZWRXYXJuLnB1c2goYF9fVlVFX09QVElPTlNfQVBJX19gKTtcbiAgICBnZXRHbG9iYWxUaGlzKCkuX19WVUVfT1BUSU9OU19BUElfXyA9IHRydWU7XG4gIH1cbiAgaWYgKHR5cGVvZiBfX1ZVRV9QUk9EX0RFVlRPT0xTX18gIT09IFwiYm9vbGVhblwiKSB7XG4gICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBuZWVkV2Fybi5wdXNoKGBfX1ZVRV9QUk9EX0RFVlRPT0xTX19gKTtcbiAgICBnZXRHbG9iYWxUaGlzKCkuX19WVUVfUFJPRF9ERVZUT09MU19fID0gZmFsc2U7XG4gIH1cbiAgaWYgKHR5cGVvZiBfX1ZVRV9QUk9EX0hZRFJBVElPTl9NSVNNQVRDSF9ERVRBSUxTX18gIT09IFwiYm9vbGVhblwiKSB7XG4gICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBuZWVkV2Fybi5wdXNoKGBfX1ZVRV9QUk9EX0hZRFJBVElPTl9NSVNNQVRDSF9ERVRBSUxTX19gKTtcbiAgICBnZXRHbG9iYWxUaGlzKCkuX19WVUVfUFJPRF9IWURSQVRJT05fTUlTTUFUQ0hfREVUQUlMU19fID0gZmFsc2U7XG4gIH1cbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgbmVlZFdhcm4ubGVuZ3RoKSB7XG4gICAgY29uc3QgbXVsdGkgPSBuZWVkV2Fybi5sZW5ndGggPiAxO1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgIGBGZWF0dXJlIGZsYWcke211bHRpID8gYHNgIDogYGB9ICR7bmVlZFdhcm4uam9pbihcIiwgXCIpfSAke211bHRpID8gYGFyZWAgOiBgaXNgfSBub3QgZXhwbGljaXRseSBkZWZpbmVkLiBZb3UgYXJlIHJ1bm5pbmcgdGhlIGVzbS1idW5kbGVyIGJ1aWxkIG9mIFZ1ZSwgd2hpY2ggZXhwZWN0cyB0aGVzZSBjb21waWxlLXRpbWUgZmVhdHVyZSBmbGFncyB0byBiZSBnbG9iYWxseSBpbmplY3RlZCB2aWEgdGhlIGJ1bmRsZXIgY29uZmlnIGluIG9yZGVyIHRvIGdldCBiZXR0ZXIgdHJlZS1zaGFraW5nIGluIHRoZSBwcm9kdWN0aW9uIGJ1bmRsZS5cblxuRm9yIG1vcmUgZGV0YWlscywgc2VlIGh0dHBzOi8vbGluay52dWVqcy5vcmcvZmVhdHVyZS1mbGFncy5gXG4gICAgKTtcbiAgfVxufVxuXG5jb25zdCBxdWV1ZVBvc3RSZW5kZXJFZmZlY3QgPSBxdWV1ZUVmZmVjdFdpdGhTdXNwZW5zZSA7XG5mdW5jdGlvbiBjcmVhdGVSZW5kZXJlcihvcHRpb25zKSB7XG4gIHJldHVybiBiYXNlQ3JlYXRlUmVuZGVyZXIob3B0aW9ucyk7XG59XG5mdW5jdGlvbiBjcmVhdGVIeWRyYXRpb25SZW5kZXJlcihvcHRpb25zKSB7XG4gIHJldHVybiBiYXNlQ3JlYXRlUmVuZGVyZXIob3B0aW9ucywgY3JlYXRlSHlkcmF0aW9uRnVuY3Rpb25zKTtcbn1cbmZ1bmN0aW9uIGJhc2VDcmVhdGVSZW5kZXJlcihvcHRpb25zLCBjcmVhdGVIeWRyYXRpb25GbnMpIHtcbiAge1xuICAgIGluaXRGZWF0dXJlRmxhZ3MoKTtcbiAgfVxuICBjb25zdCB0YXJnZXQgPSBnZXRHbG9iYWxUaGlzKCk7XG4gIHRhcmdldC5fX1ZVRV9fID0gdHJ1ZTtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgX19WVUVfUFJPRF9ERVZUT09MU19fKSB7XG4gICAgc2V0RGV2dG9vbHNIb29rJDEodGFyZ2V0Ll9fVlVFX0RFVlRPT0xTX0dMT0JBTF9IT09LX18sIHRhcmdldCk7XG4gIH1cbiAgY29uc3Qge1xuICAgIGluc2VydDogaG9zdEluc2VydCxcbiAgICByZW1vdmU6IGhvc3RSZW1vdmUsXG4gICAgcGF0Y2hQcm9wOiBob3N0UGF0Y2hQcm9wLFxuICAgIGNyZWF0ZUVsZW1lbnQ6IGhvc3RDcmVhdGVFbGVtZW50LFxuICAgIGNyZWF0ZVRleHQ6IGhvc3RDcmVhdGVUZXh0LFxuICAgIGNyZWF0ZUNvbW1lbnQ6IGhvc3RDcmVhdGVDb21tZW50LFxuICAgIHNldFRleHQ6IGhvc3RTZXRUZXh0LFxuICAgIHNldEVsZW1lbnRUZXh0OiBob3N0U2V0RWxlbWVudFRleHQsXG4gICAgcGFyZW50Tm9kZTogaG9zdFBhcmVudE5vZGUsXG4gICAgbmV4dFNpYmxpbmc6IGhvc3ROZXh0U2libGluZyxcbiAgICBzZXRTY29wZUlkOiBob3N0U2V0U2NvcGVJZCA9IE5PT1AsXG4gICAgaW5zZXJ0U3RhdGljQ29udGVudDogaG9zdEluc2VydFN0YXRpY0NvbnRlbnRcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IHBhdGNoID0gKG4xLCBuMiwgY29udGFpbmVyLCBhbmNob3IgPSBudWxsLCBwYXJlbnRDb21wb25lbnQgPSBudWxsLCBwYXJlbnRTdXNwZW5zZSA9IG51bGwsIG5hbWVzcGFjZSA9IHZvaWQgMCwgc2xvdFNjb3BlSWRzID0gbnVsbCwgb3B0aW1pemVkID0gISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBpc0htclVwZGF0aW5nID8gZmFsc2UgOiAhIW4yLmR5bmFtaWNDaGlsZHJlbikgPT4ge1xuICAgIGlmIChuMSA9PT0gbjIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKG4xICYmICFpc1NhbWVWTm9kZVR5cGUobjEsIG4yKSkge1xuICAgICAgYW5jaG9yID0gZ2V0TmV4dEhvc3ROb2RlKG4xKTtcbiAgICAgIHVubW91bnQobjEsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIHRydWUpO1xuICAgICAgbjEgPSBudWxsO1xuICAgIH1cbiAgICBpZiAobjIucGF0Y2hGbGFnID09PSAtMikge1xuICAgICAgb3B0aW1pemVkID0gZmFsc2U7XG4gICAgICBuMi5keW5hbWljQ2hpbGRyZW4gPSBudWxsO1xuICAgIH1cbiAgICBjb25zdCB7IHR5cGUsIHJlZiwgc2hhcGVGbGFnIH0gPSBuMjtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgVGV4dDpcbiAgICAgICAgcHJvY2Vzc1RleHQobjEsIG4yLCBjb250YWluZXIsIGFuY2hvcik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBDb21tZW50OlxuICAgICAgICBwcm9jZXNzQ29tbWVudE5vZGUobjEsIG4yLCBjb250YWluZXIsIGFuY2hvcik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBTdGF0aWM6XG4gICAgICAgIGlmIChuMSA9PSBudWxsKSB7XG4gICAgICAgICAgbW91bnRTdGF0aWNOb2RlKG4yLCBjb250YWluZXIsIGFuY2hvciwgbmFtZXNwYWNlKTtcbiAgICAgICAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9k
20578dWN0aW9uXCIpKSB7XG4gICAgICAgICAgcGF0Y2hTdGF0aWNOb2RlKG4xLCBuMiwgY29udGFpbmVyLCBuYW1lc3BhY2UpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBGcmFnbWVudDpcbiAgICAgICAgcHJvY2Vzc0ZyYWdtZW50KFxuICAgICAgICAgIG4xLFxuICAgICAgICAgIG4yLFxuICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICBhbmNob3IsXG4gICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgb3B0aW1pemVkXG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKHNoYXBlRmxhZyAmIDEpIHtcbiAgICAgICAgICBwcm9jZXNzRWxlbWVudChcbiAgICAgICAgICAgIG4xLFxuICAgICAgICAgICAgbjIsXG4gICAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgICBhbmNob3IsXG4gICAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgICAgIG9wdGltaXplZFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAoc2hhcGVGbGFnICYgNikge1xuICAgICAgICAgIHByb2Nlc3NDb21wb25lbnQoXG4gICAgICAgICAgICBuMSxcbiAgICAgICAgICAgIG4yLFxuICAgICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgICAgYW5jaG9yLFxuICAgICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKHNoYXBlRmxhZyAmIDY0KSB7XG4gICAgICAgICAgdHlwZS5wcm9jZXNzKFxuICAgICAgICAgICAgbjEsXG4gICAgICAgICAgICBuMixcbiAgICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICAgIGFuY2hvcixcbiAgICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgICAgb3B0aW1pemVkLFxuICAgICAgICAgICAgaW50ZXJuYWxzXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmIChzaGFwZUZsYWcgJiAxMjgpIHtcbiAgICAgICAgICB0eXBlLnByb2Nlc3MoXG4gICAgICAgICAgICBuMSxcbiAgICAgICAgICAgIG4yLFxuICAgICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgICAgYW5jaG9yLFxuICAgICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgICBvcHRpbWl6ZWQsXG4gICAgICAgICAgICBpbnRlcm5hbHNcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICB3YXJuJDEoXCJJbnZhbGlkIFZOb2RlIHR5cGU6XCIsIHR5cGUsIGAoJHt0eXBlb2YgdHlwZX0pYCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHJlZiAhPSBudWxsICYmIHBhcmVudENvbXBvbmVudCkge1xuICAgICAgc2V0UmVmKHJlZiwgbjEgJiYgbjEucmVmLCBwYXJlbnRTdXNwZW5zZSwgbjIgfHwgbjEsICFuMik7XG4gICAgfVxuICB9O1xuICBjb25zdCBwcm9jZXNzVGV4dCA9IChuMSwgbjIsIGNvbnRhaW5lciwgYW5jaG9yKSA9PiB7XG4gICAgaWYgKG4xID09IG51bGwpIHtcbiAgICAgIGhvc3RJbnNlcnQoXG4gICAgICAgIG4yLmVsID0gaG9zdENyZWF0ZVRleHQobjIuY2hpbGRyZW4pLFxuICAgICAgICBjb250YWluZXIsXG4gICAgICAgIGFuY2hvclxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZWwgPSBuMi5lbCA9IG4xLmVsO1xuICAgICAgaWYgKG4yLmNoaWxkcmVuICE9PSBuMS5jaGlsZHJlbikge1xuICAgICAgICBob3N0U2V0VGV4dChlbCwgbjIuY2hpbGRyZW4pO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgY29uc3QgcHJvY2Vzc0NvbW1lbnROb2RlID0gKG4xLCBuMiwgY29udGFpbmVyLCBhbmNob3IpID0+IHtcbiAgICBpZiAobjEgPT0gbnVsbCkge1xuICAgICAgaG9zdEluc2VydChcbiAgICAgICAgbjIuZWwgPSBob3N0Q3JlYXRlQ29tbWVudChuMi5jaGlsZHJlbiB8fCBcIlwiKSxcbiAgICAgICAgY29udGFpbmVyLFxuICAgICAgICBhbmNob3JcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG4yLmVsID0gbjEuZWw7XG4gICAgfVxuICB9O1xuICBjb25zdCBtb3VudFN0YXRpY05vZGUgPSAobjIsIGNvbnRhaW5lciwgYW5jaG9yLCBuYW1lc3BhY2UpID0+IHtcbiAgICBbbjIuZWwsIG4yLmFuY2hvcl0gPSBob3N0SW5zZXJ0U3RhdGljQ29udGVudChcbiAgICAgIG4yLmNoaWxkcmVuLFxuICAgICAgY29udGFpbmVyLFxuICAgICAgYW5jaG9yLFxuICAgICAgbmFtZXNwYWNlLFxuICAgICAgbjIuZWwsXG4gICAgICBuMi5hbmNob3JcbiAgICApO1xuICB9O1xuICBjb25zdCBwYXRjaFN0YXRpY05vZGUgPSAobjEsIG4yLCBjb250YWluZXIsIG5hbWVzcGFjZSkgPT4ge1xuICAgIGlmIChuMi5jaGlsZHJlbiAhPT0gbjEuY2hpbGRyZW4pIHtcbiAgICAgIGNvbnN0IGFuY2hvciA9IGhvc3ROZXh0U2libGluZyhuMS5hbmNob3IpO1xuICAgICAgcmVtb3ZlU3RhdGljTm9kZShuMSk7XG4gICAgICBbbjIuZWwsIG4yLmFuY2hvcl0gPSBob3N0SW5zZXJ0U3RhdGljQ29udGVudChcbiAgICAgICAgbjIuY2hpbGRyZW4sXG4gICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgYW5jaG9yLFxuICAgICAgICBuYW1lc3BhY2VcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG4yLmVsID0gbjEuZWw7XG4gICAgICBuMi5hbmNob3IgPSBuMS5hbmNob3I7XG4gICAgfVxuICB9O1xuICBjb25zdCBtb3ZlU3Rh
20578dGljTm9kZSA9ICh7IGVsLCBhbmNob3IgfSwgY29udGFpbmVyLCBuZXh0U2libGluZykgPT4ge1xuICAgIGxldCBuZXh0O1xuICAgIHdoaWxlIChlbCAmJiBlbCAhPT0gYW5jaG9yKSB7XG4gICAgICBuZXh0ID0gaG9zdE5leHRTaWJsaW5nKGVsKTtcbiAgICAgIGhvc3RJbnNlcnQoZWwsIGNvbnRhaW5lciwgbmV4dFNpYmxpbmcpO1xuICAgICAgZWwgPSBuZXh0O1xuICAgIH1cbiAgICBob3N0SW5zZXJ0KGFuY2hvciwgY29udGFpbmVyLCBuZXh0U2libGluZyk7XG4gIH07XG4gIGNvbnN0IHJlbW92ZVN0YXRpY05vZGUgPSAoeyBlbCwgYW5jaG9yIH0pID0+IHtcbiAgICBsZXQgbmV4dDtcbiAgICB3aGlsZSAoZWwgJiYgZWwgIT09IGFuY2hvcikge1xuICAgICAgbmV4dCA9IGhvc3ROZXh0U2libGluZyhlbCk7XG4gICAgICBob3N0UmVtb3ZlKGVsKTtcbiAgICAgIGVsID0gbmV4dDtcbiAgICB9XG4gICAgaG9zdFJlbW92ZShhbmNob3IpO1xuICB9O1xuICBjb25zdCBwcm9jZXNzRWxlbWVudCA9IChuMSwgbjIsIGNvbnRhaW5lciwgYW5jaG9yLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBuYW1lc3BhY2UsIHNsb3RTY29wZUlkcywgb3B0aW1pemVkKSA9PiB7XG4gICAgaWYgKG4yLnR5cGUgPT09IFwic3ZnXCIpIHtcbiAgICAgIG5hbWVzcGFjZSA9IFwic3ZnXCI7XG4gICAgfSBlbHNlIGlmIChuMi50eXBlID09PSBcIm1hdGhcIikge1xuICAgICAgbmFtZXNwYWNlID0gXCJtYXRobWxcIjtcbiAgICB9XG4gICAgaWYgKG4xID09IG51bGwpIHtcbiAgICAgIG1vdW50RWxlbWVudChcbiAgICAgICAgbjIsXG4gICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgYW5jaG9yLFxuICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgb3B0aW1pemVkXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXRjaEVsZW1lbnQoXG4gICAgICAgIG4xLFxuICAgICAgICBuMixcbiAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgIG9wdGltaXplZFxuICAgICAgKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IG1vdW50RWxlbWVudCA9ICh2bm9kZSwgY29udGFpbmVyLCBhbmNob3IsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIG5hbWVzcGFjZSwgc2xvdFNjb3BlSWRzLCBvcHRpbWl6ZWQpID0+IHtcbiAgICBsZXQgZWw7XG4gICAgbGV0IHZub2RlSG9vaztcbiAgICBjb25zdCB7IHByb3BzLCBzaGFwZUZsYWcsIHRyYW5zaXRpb24sIGRpcnMgfSA9IHZub2RlO1xuICAgIGVsID0gdm5vZGUuZWwgPSBob3N0Q3JlYXRlRWxlbWVudChcbiAgICAgIHZub2RlLnR5cGUsXG4gICAgICBuYW1lc3BhY2UsXG4gICAgICBwcm9wcyAmJiBwcm9wcy5pcyxcbiAgICAgIHByb3BzXG4gICAgKTtcbiAgICBpZiAoc2hhcGVGbGFnICYgOCkge1xuICAgICAgaG9zdFNldEVsZW1lbnRUZXh0KGVsLCB2bm9kZS5jaGlsZHJlbik7XG4gICAgfSBlbHNlIGlmIChzaGFwZUZsYWcgJiAxNikge1xuICAgICAgbW91bnRDaGlsZHJlbihcbiAgICAgICAgdm5vZGUuY2hpbGRyZW4sXG4gICAgICAgIGVsLFxuICAgICAgICBudWxsLFxuICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICByZXNvbHZlQ2hpbGRyZW5OYW1lc3BhY2Uodm5vZGUsIG5hbWVzcGFjZSksXG4gICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgb3B0aW1pemVkXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoZGlycykge1xuICAgICAgaW52b2tlRGlyZWN0aXZlSG9vayh2bm9kZSwgbnVsbCwgcGFyZW50Q29tcG9uZW50LCBcImNyZWF0ZWRcIik7XG4gICAgfVxuICAgIHNldFNjb3BlSWQoZWwsIHZub2RlLCB2bm9kZS5zY29wZUlkLCBzbG90U2NvcGVJZHMsIHBhcmVudENvbXBvbmVudCk7XG4gICAgaWYgKHByb3BzKSB7XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBwcm9wcykge1xuICAgICAgICBpZiAoa2V5ICE9PSBcInZhbHVlXCIgJiYgIWlzUmVzZXJ2ZWRQcm9wKGtleSkpIHtcbiAgICAgICAgICBob3N0UGF0Y2hQcm9wKGVsLCBrZXksIG51bGwsIHByb3BzW2tleV0sIG5hbWVzcGFjZSwgcGFyZW50Q29tcG9uZW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKFwidmFsdWVcIiBpbiBwcm9wcykge1xuICAgICAgICBob3N0UGF0Y2hQcm9wKGVsLCBcInZhbHVlXCIsIG51bGwsIHByb3BzLnZhbHVlLCBuYW1lc3BhY2UpO1xuICAgICAgfVxuICAgICAgaWYgKHZub2RlSG9vayA9IHByb3BzLm9uVm5vZGVCZWZvcmVNb3VudCkge1xuICAgICAgICBpbnZva2VWTm9kZUhvb2sodm5vZGVIb29rLCBwYXJlbnRDb21wb25lbnQsIHZub2RlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgX19WVUVfUFJPRF9ERVZUT09MU19fKSB7XG4gICAgICBkZWYoZWwsIFwiX192bm9kZVwiLCB2bm9kZSwgdHJ1ZSk7XG4gICAgICBkZWYoZWwsIFwiX192dWVQYXJlbnRDb21wb25lbnRcIiwgcGFyZW50Q29tcG9uZW50LCB0cnVlKTtcbiAgICB9XG4gICAgaWYgKGRpcnMpIHtcbiAgICAgIGludm9rZURpcmVjdGl2ZUhvb2sodm5vZGUsIG51bGwsIHBhcmVudENvbXBvbmVudCwgXCJiZWZvcmVNb3VudFwiKTtcbiAgICB9XG4gICAgY29uc3QgbmVlZENhbGxUcmFuc2l0aW9uSG9va3MgPSBuZWVkVHJhbnNpdGlvbihwYXJlbnRTdXNwZW5zZSwgdHJhbnNpdGlvbik7XG4gICAgaWYgKG5lZWRDYWxsVHJhbnNpdGlvbkhvb2tzKSB7XG4gICAgICB0cmFuc2l0aW9uLmJlZm9yZUVudGVyKGVsKTtcbiAgICB9XG4gICAgaG9zdEluc2VydChlbCwgY29udGFpbmVyLCBhbmNob3IpO1xuICAgIGlmICgodm5vZGVIb29rID0gcHJvcHMgJiYgcHJvcHMub25Wbm9kZU1vdW50ZWQpIHx8IG5lZWRDYWxsVHJhbnNpdGlvbkhvb2tzIHx8IGRpcnMpIHtcbiAgICAgIHF1ZXVlUG9zdFJlbmRlckVmZmVjdCgoKSA9PiB7XG4gICAgICAgI
20578HZub2RlSG9vayAmJiBpbnZva2VWTm9kZUhvb2sodm5vZGVIb29rLCBwYXJlbnRDb21wb25lbnQsIHZub2RlKTtcbiAgICAgICAgbmVlZENhbGxUcmFuc2l0aW9uSG9va3MgJiYgdHJhbnNpdGlvbi5lbnRlcihlbCk7XG4gICAgICAgIGRpcnMgJiYgaW52b2tlRGlyZWN0aXZlSG9vayh2bm9kZSwgbnVsbCwgcGFyZW50Q29tcG9uZW50LCBcIm1vdW50ZWRcIik7XG4gICAgICB9LCBwYXJlbnRTdXNwZW5zZSk7XG4gICAgfVxuICB9O1xuICBjb25zdCBzZXRTY29wZUlkID0gKGVsLCB2bm9kZSwgc2NvcGVJZCwgc2xvdFNjb3BlSWRzLCBwYXJlbnRDb21wb25lbnQpID0+IHtcbiAgICBpZiAoc2NvcGVJZCkge1xuICAgICAgaG9zdFNldFNjb3BlSWQoZWwsIHNjb3BlSWQpO1xuICAgIH1cbiAgICBpZiAoc2xvdFNjb3BlSWRzKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNsb3RTY29wZUlkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBob3N0U2V0U2NvcGVJZChlbCwgc2xvdFNjb3BlSWRzW2ldKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHBhcmVudENvbXBvbmVudCkge1xuICAgICAgbGV0IHN1YlRyZWUgPSBwYXJlbnRDb21wb25lbnQuc3ViVHJlZTtcbiAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHN1YlRyZWUucGF0Y2hGbGFnID4gMCAmJiBzdWJUcmVlLnBhdGNoRmxhZyAmIDIwNDgpIHtcbiAgICAgICAgc3ViVHJlZSA9IGZpbHRlclNpbmdsZVJvb3Qoc3ViVHJlZS5jaGlsZHJlbikgfHwgc3ViVHJlZTtcbiAgICAgIH1cbiAgICAgIGlmICh2bm9kZSA9PT0gc3ViVHJlZSkge1xuICAgICAgICBjb25zdCBwYXJlbnRWTm9kZSA9IHBhcmVudENvbXBvbmVudC52bm9kZTtcbiAgICAgICAgc2V0U2NvcGVJZChcbiAgICAgICAgICBlbCxcbiAgICAgICAgICBwYXJlbnRWTm9kZSxcbiAgICAgICAgICBwYXJlbnRWTm9kZS5zY29wZUlkLFxuICAgICAgICAgIHBhcmVudFZOb2RlLnNsb3RTY29wZUlkcyxcbiAgICAgICAgICBwYXJlbnRDb21wb25lbnQucGFyZW50XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBjb25zdCBtb3VudENoaWxkcmVuID0gKGNoaWxkcmVuLCBjb250YWluZXIsIGFuY2hvciwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgbmFtZXNwYWNlLCBzbG90U2NvcGVJZHMsIG9wdGltaXplZCwgc3RhcnQgPSAwKSA9PiB7XG4gICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGNoaWxkID0gY2hpbGRyZW5baV0gPSBvcHRpbWl6ZWQgPyBjbG9uZUlmTW91bnRlZChjaGlsZHJlbltpXSkgOiBub3JtYWxpemVWTm9kZShjaGlsZHJlbltpXSk7XG4gICAgICBwYXRjaChcbiAgICAgICAgbnVsbCxcbiAgICAgICAgY2hpbGQsXG4gICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgYW5jaG9yLFxuICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgb3B0aW1pemVkXG4gICAgICApO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgcGF0Y2hFbGVtZW50ID0gKG4xLCBuMiwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgbmFtZXNwYWNlLCBzbG90U2NvcGVJZHMsIG9wdGltaXplZCkgPT4ge1xuICAgIGNvbnN0IGVsID0gbjIuZWwgPSBuMS5lbDtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCBfX1ZVRV9QUk9EX0RFVlRPT0xTX18pIHtcbiAgICAgIGVsLl9fdm5vZGUgPSBuMjtcbiAgICB9XG4gICAgbGV0IHsgcGF0Y2hGbGFnLCBkeW5hbWljQ2hpbGRyZW4sIGRpcnMgfSA9IG4yO1xuICAgIHBhdGNoRmxhZyB8PSBuMS5wYXRjaEZsYWcgJiAxNjtcbiAgICBjb25zdCBvbGRQcm9wcyA9IG4xLnByb3BzIHx8IEVNUFRZX09CSjtcbiAgICBjb25zdCBuZXdQcm9wcyA9IG4yLnByb3BzIHx8IEVNUFRZX09CSjtcbiAgICBsZXQgdm5vZGVIb29rO1xuICAgIHBhcmVudENvbXBvbmVudCAmJiB0b2dnbGVSZWN1cnNlKHBhcmVudENvbXBvbmVudCwgZmFsc2UpO1xuICAgIGlmICh2bm9kZUhvb2sgPSBuZXdQcm9wcy5vblZub2RlQmVmb3JlVXBkYXRlKSB7XG4gICAgICBpbnZva2VWTm9kZUhvb2sodm5vZGVIb29rLCBwYXJlbnRDb21wb25lbnQsIG4yLCBuMSk7XG4gICAgfVxuICAgIGlmIChkaXJzKSB7XG4gICAgICBpbnZva2VEaXJlY3RpdmVIb29rKG4yLCBuMSwgcGFyZW50Q29tcG9uZW50LCBcImJlZm9yZVVwZGF0ZVwiKTtcbiAgICB9XG4gICAgcGFyZW50Q29tcG9uZW50ICYmIHRvZ2dsZVJlY3Vyc2UocGFyZW50Q29tcG9uZW50LCB0cnVlKTtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBpc0htclVwZGF0aW5nKSB7XG4gICAgICBwYXRjaEZsYWcgPSAwO1xuICAgICAgb3B0aW1pemVkID0gZmFsc2U7XG4gICAgICBkeW5hbWljQ2hpbGRyZW4gPSBudWxsO1xuICAgIH1cbiAgICBpZiAob2xkUHJvcHMuaW5uZXJIVE1MICYmIG5ld1Byb3BzLmlubmVySFRNTCA9PSBudWxsIHx8IG9sZFByb3BzLnRleHRDb250ZW50ICYmIG5ld1Byb3BzLnRleHRDb250ZW50ID09IG51bGwpIHtcbiAgICAgIGhvc3RTZXRFbGVtZW50VGV4dChlbCwgXCJcIik7XG4gICAgfVxuICAgIGlmIChkeW5hbWljQ2hpbGRyZW4pIHtcbiAgICAgIHBhdGNoQmxvY2tDaGlsZHJlbihcbiAgICAgICAgbjEuZHluYW1pY0NoaWxkcmVuLFxuICAgICAgICBkeW5hbWljQ2hpbGRyZW4sXG4gICAgICAgIGVsLFxuICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICByZXNvbHZlQ2hpbGRyZW5OYW1lc3BhY2UobjIsIG5hbWVzcGFjZSksXG4gICAgICAgIHNsb3RTY29wZUlkc1xuICAgICAgKTtcbiAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgIHRyYXZlcnNlU3RhdGljQ2hpbGRyZW4objEsIG4yKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCFvcHRpbWl6ZWQpIHtcbiAgICAgIHBhdGNoQ2hpbGRyZW4oXG4gICAgICAgIG4xLFxuICAgICAgICBuMixcbiAgICAgICAgZWwsXG4gICAgICAgIG51bGwsXG4gICAgICAgI
20578HBhcmVudENvbXBvbmVudCxcbiAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgIHJlc29sdmVDaGlsZHJlbk5hbWVzcGFjZShuMiwgbmFtZXNwYWNlKSxcbiAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICBmYWxzZVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHBhdGNoRmxhZyA+IDApIHtcbiAgICAgIGlmIChwYXRjaEZsYWcgJiAxNikge1xuICAgICAgICBwYXRjaFByb3BzKGVsLCBvbGRQcm9wcywgbmV3UHJvcHMsIHBhcmVudENvbXBvbmVudCwgbmFtZXNwYWNlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChwYXRjaEZsYWcgJiAyKSB7XG4gICAgICAgICAgaWYgKG9sZFByb3BzLmNsYXNzICE9PSBuZXdQcm9wcy5jbGFzcykge1xuICAgICAgICAgICAgaG9zdFBhdGNoUHJvcChlbCwgXCJjbGFzc1wiLCBudWxsLCBuZXdQcm9wcy5jbGFzcywgbmFtZXNwYWNlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhdGNoRmxhZyAmIDQpIHtcbiAgICAgICAgICBob3N0UGF0Y2hQcm9wKGVsLCBcInN0eWxlXCIsIG9sZFByb3BzLnN0eWxlLCBuZXdQcm9wcy5zdHlsZSwgbmFtZXNwYWNlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGF0Y2hGbGFnICYgOCkge1xuICAgICAgICAgIGNvbnN0IHByb3BzVG9VcGRhdGUgPSBuMi5keW5hbWljUHJvcHM7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcm9wc1RvVXBkYXRlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBrZXkgPSBwcm9wc1RvVXBkYXRlW2ldO1xuICAgICAgICAgICAgY29uc3QgcHJldiA9IG9sZFByb3BzW2tleV07XG4gICAgICAgICAgICBjb25zdCBuZXh0ID0gbmV3UHJvcHNba2V5XTtcbiAgICAgICAgICAgIGlmIChuZXh0ICE9PSBwcmV2IHx8IGtleSA9PT0gXCJ2YWx1ZVwiKSB7XG4gICAgICAgICAgICAgIGhvc3RQYXRjaFByb3AoZWwsIGtleSwgcHJldiwgbmV4dCwgbmFtZXNwYWNlLCBwYXJlbnRDb21wb25lbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHBhdGNoRmxhZyAmIDEpIHtcbiAgICAgICAgaWYgKG4xLmNoaWxkcmVuICE9PSBuMi5jaGlsZHJlbikge1xuICAgICAgICAgIGhvc3RTZXRFbGVtZW50VGV4dChlbCwgbjIuY2hpbGRyZW4pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICghb3B0aW1pemVkICYmIGR5bmFtaWNDaGlsZHJlbiA9PSBudWxsKSB7XG4gICAgICBwYXRjaFByb3BzKGVsLCBvbGRQcm9wcywgbmV3UHJvcHMsIHBhcmVudENvbXBvbmVudCwgbmFtZXNwYWNlKTtcbiAgICB9XG4gICAgaWYgKCh2bm9kZUhvb2sgPSBuZXdQcm9wcy5vblZub2RlVXBkYXRlZCkgfHwgZGlycykge1xuICAgICAgcXVldWVQb3N0UmVuZGVyRWZmZWN0KCgpID0+IHtcbiAgICAgICAgdm5vZGVIb29rICYmIGludm9rZVZOb2RlSG9vayh2bm9kZUhvb2ssIHBhcmVudENvbXBvbmVudCwgbjIsIG4xKTtcbiAgICAgICAgZGlycyAmJiBpbnZva2VEaXJlY3RpdmVIb29rKG4yLCBuMSwgcGFyZW50Q29tcG9uZW50LCBcInVwZGF0ZWRcIik7XG4gICAgICB9LCBwYXJlbnRTdXNwZW5zZSk7XG4gICAgfVxuICB9O1xuICBjb25zdCBwYXRjaEJsb2NrQ2hpbGRyZW4gPSAob2xkQ2hpbGRyZW4sIG5ld0NoaWxkcmVuLCBmYWxsYmFja0NvbnRhaW5lciwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgbmFtZXNwYWNlLCBzbG90U2NvcGVJZHMpID0+IHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5ld0NoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBvbGRWTm9kZSA9IG9sZENoaWxkcmVuW2ldO1xuICAgICAgY29uc3QgbmV3Vk5vZGUgPSBuZXdDaGlsZHJlbltpXTtcbiAgICAgIGNvbnN0IGNvbnRhaW5lciA9IChcbiAgICAgICAgLy8gb2xkVk5vZGUgbWF5IGJlIGFuIGVycm9yZWQgYXN5bmMgc2V0dXAoKSBjb21wb25lbnQgaW5zaWRlIFN1c3BlbnNlXG4gICAgICAgIC8vIHdoaWNoIHdpbGwgbm90IGhhdmUgYSBtb3VudGVkIGVsZW1lbnRcbiAgICAgICAgb2xkVk5vZGUuZWwgJiYgLy8gLSBJbiB0aGUgY2FzZSBvZiBhIEZyYWdtZW50LCB3ZSBuZWVkIHRvIHByb3ZpZGUgdGhlIGFjdHVhbCBwYXJlbnRcbiAgICAgICAgLy8gb2YgdGhlIEZyYWdtZW50IGl0c2VsZiBzbyBpdCBjYW4gbW92ZSBpdHMgY2hpbGRyZW4uXG4gICAgICAgIChvbGRWTm9kZS50eXBlID09PSBGcmFnbWVudCB8fCAvLyAtIEluIHRoZSBjYXNlIG9mIGRpZmZlcmVudCBub2RlcywgdGhlcmUgaXMgZ29pbmcgdG8gYmUgYSByZXBsYWNlbWVudFxuICAgICAgICAvLyB3aGljaCBhbHNvIHJlcXVpcmVzIHRoZSBjb3JyZWN0IHBhcmVudCBjb250YWluZXJcbiAgICAgICAgIWlzU2FtZVZOb2RlVHlwZShvbGRWTm9kZSwgbmV3Vk5vZGUpIHx8IC8vIC0gSW4gdGhlIGNhc2Ugb2YgYSBjb21wb25lbnQsIGl0IGNvdWxkIGNvbnRhaW4gYW55dGhpbmcuXG4gICAgICAgIG9sZFZOb2RlLnNoYXBlRmxhZyAmICg2IHwgNjQpKSA/IGhvc3RQYXJlbnROb2RlKG9sZFZOb2RlLmVsKSA6IChcbiAgICAgICAgICAvLyBJbiBvdGhlciBjYXNlcywgdGhlIHBhcmVudCBjb250YWluZXIgaXMgbm90IGFjdHVhbGx5IHVzZWQgc28gd2VcbiAgICAgICAgICAvLyBqdXN0IHBhc3MgdGhlIGJsb2NrIGVsZW1lbnQgaGVyZSB0byBhdm9pZCBhIERPTSBwYXJlbnROb2RlIGNhbGwuXG4gICAgICAgICAgZmFsbGJhY2tDb250YWluZXJcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICAgIHBhdGNoKFxuICAgICAgICBvbGRWTm9kZSxcbiAgICAgICAgbmV3Vk5vZGUsXG4gICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgbnVsbCxcbiAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgIHRydWVcbiAgICAgICk7XG4gICAgfVxuICB9O1xuICBjb25zdCBwYXRjaFByb3BzID0gKGVsLCBvbGRQcm9wcywgbmV3UHJvcHMsIHBhcmVudENvbXBvbmVudCwgbmFtZXNwYWNlKSA9PiB7XG4gICAgaWYgKG9sZFByb3BzICE9PSBuZXdQcm9wcykge1xuICAgICAgaWYgKG9sZFByb3BzICE9PSBFTVBUWV9PQkopIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gb2xkUHJvcHMpIHtcbiAgICAgICAgICBpZiAoIWlzUmVzZXJ2ZWRQcm9wKGtleSkgJiYgIShrZXkgaW4gbmV3UHJvcHMpKSB7XG4gICAgICAgICAgICBob3N0UGF0Y2hQcm9wKFxuICAgICAgICAgICAgICBlbCxcbiAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICBvbGRQcm9wc1trZXldLFxuICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgICAgI
20578HBhcmVudENvbXBvbmVudFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3Qga2V5IGluIG5ld1Byb3BzKSB7XG4gICAgICAgIGlmIChpc1Jlc2VydmVkUHJvcChrZXkpKSBjb250aW51ZTtcbiAgICAgICAgY29uc3QgbmV4dCA9IG5ld1Byb3BzW2tleV07XG4gICAgICAgIGNvbnN0IHByZXYgPSBvbGRQcm9wc1trZXldO1xuICAgICAgICBpZiAobmV4dCAhPT0gcHJldiAmJiBrZXkgIT09IFwidmFsdWVcIikge1xuICAgICAgICAgIGhvc3RQYXRjaFByb3AoZWwsIGtleSwgcHJldiwgbmV4dCwgbmFtZXNwYWNlLCBwYXJlbnRDb21wb25lbnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoXCJ2YWx1ZVwiIGluIG5ld1Byb3BzKSB7XG4gICAgICAgIGhvc3RQYXRjaFByb3AoZWwsIFwidmFsdWVcIiwgb2xkUHJvcHMudmFsdWUsIG5ld1Byb3BzLnZhbHVlLCBuYW1lc3BhY2UpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgY29uc3QgcHJvY2Vzc0ZyYWdtZW50ID0gKG4xLCBuMiwgY29udGFpbmVyLCBhbmNob3IsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIG5hbWVzcGFjZSwgc2xvdFNjb3BlSWRzLCBvcHRpbWl6ZWQpID0+IHtcbiAgICBjb25zdCBmcmFnbWVudFN0YXJ0QW5jaG9yID0gbjIuZWwgPSBuMSA/IG4xLmVsIDogaG9zdENyZWF0ZVRleHQoXCJcIik7XG4gICAgY29uc3QgZnJhZ21lbnRFbmRBbmNob3IgPSBuMi5hbmNob3IgPSBuMSA/IG4xLmFuY2hvciA6IGhvc3RDcmVhdGVUZXh0KFwiXCIpO1xuICAgIGxldCB7IHBhdGNoRmxhZywgZHluYW1pY0NoaWxkcmVuLCBzbG90U2NvcGVJZHM6IGZyYWdtZW50U2xvdFNjb3BlSWRzIH0gPSBuMjtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAvLyAjNTUyMyBkZXYgcm9vdCBmcmFnbWVudCBtYXkgaW5oZXJpdCBkaXJlY3RpdmVzXG4gICAgKGlzSG1yVXBkYXRpbmcgfHwgcGF0Y2hGbGFnICYgMjA0OCkpIHtcbiAgICAgIHBhdGNoRmxhZyA9IDA7XG4gICAgICBvcHRpbWl6ZWQgPSBmYWxzZTtcbiAgICAgIGR5bmFtaWNDaGlsZHJlbiA9IG51bGw7XG4gICAgfVxuICAgIGlmIChmcmFnbWVudFNsb3RTY29wZUlkcykge1xuICAgICAgc2xvdFNjb3BlSWRzID0gc2xvdFNjb3BlSWRzID8gc2xvdFNjb3BlSWRzLmNvbmNhdChmcmFnbWVudFNsb3RTY29wZUlkcykgOiBmcmFnbWVudFNsb3RTY29wZUlkcztcbiAgICB9XG4gICAgaWYgKG4xID09IG51bGwpIHtcbiAgICAgIGhvc3RJbnNlcnQoZnJhZ21lbnRTdGFydEFuY2hvciwgY29udGFpbmVyLCBhbmNob3IpO1xuICAgICAgaG9zdEluc2VydChmcmFnbWVudEVuZEFuY2hvciwgY29udGFpbmVyLCBhbmNob3IpO1xuICAgICAgbW91bnRDaGlsZHJlbihcbiAgICAgICAgLy8gIzEwMDA3XG4gICAgICAgIC8vIHN1Y2ggZnJhZ21lbnQgbGlrZSBgPD48Lz5gIHdpbGwgYmUgY29tcGlsZWQgaW50b1xuICAgICAgICAvLyBhIGZyYWdtZW50IHdoaWNoIGRvZXNuJ3QgaGF2ZSBhIGNoaWxkcmVuLlxuICAgICAgICAvLyBJbiB0aGlzIGNhc2UgZmFsbGJhY2sgdG8gYW4gZW1wdHkgYXJyYXlcbiAgICAgICAgbjIuY2hpbGRyZW4gfHwgW10sXG4gICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgZnJhZ21lbnRFbmRBbmNob3IsXG4gICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChwYXRjaEZsYWcgPiAwICYmIHBhdGNoRmxhZyAmIDY0ICYmIGR5bmFtaWNDaGlsZHJlbiAmJiAvLyAjMjcxNSB0aGUgcHJldmlvdXMgZnJhZ21lbnQgY291bGQndmUgYmVlbiBhIEJBSUxlZCBvbmUgYXMgYSByZXN1bHRcbiAgICAgIC8vIG9mIHJlbmRlclNsb3QoKSB3aXRoIG5vI
20578HZhbGlkIGNoaWxkcmVuXG4gICAgICBuMS5keW5hbWljQ2hpbGRyZW4pIHtcbiAgICAgICAgcGF0Y2hCbG9ja0NoaWxkcmVuKFxuICAgICAgICAgIG4xLmR5bmFtaWNDaGlsZHJlbixcbiAgICAgICAgICBkeW5hbWljQ2hpbGRyZW4sXG4gICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgc2xvdFNjb3BlSWRzXG4gICAgICAgICk7XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgdHJhdmVyc2VTdGF0aWNDaGlsZHJlbihuMSwgbjIpO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgIC8vICMyMDgwIGlmIHRoZSBzdGFibGUgZnJhZ21lbnQgaGFzIGEga2V5LCBpdCdzIGEgPHRlbXBsYXRlIHYtZm9yPiB0aGF0IG1heVxuICAgICAgICAgIC8vICBnZXQgbW92ZWQgYXJvdW5kLiBNYWtlIHN1cmUgYWxsIHJvb3QgbGV2ZWwgdm5vZGVzIGluaGVyaXQgZWwuXG4gICAgICAgICAgLy8gIzIxMzQgb3IgaWYgaXQncyBhIGNvbXBvbmVudCByb290LCBpdCBtYXkgYWxzbyBnZXQgbW92ZWQgYXJvdW5kXG4gICAgICAgICAgLy8gYXMgdGhlIGNvbXBvbmVudCBpcyBiZWluZyBtb3ZlZC5cbiAgICAgICAgICBuMi5rZXkgIT0gbnVsbCB8fCBwYXJlbnRDb21wb25lbnQgJiYgbjIgPT09IHBhcmVudENvbXBvbmVudC5zdWJUcmVlXG4gICAgICAgICkge1xuICAgICAgICAgIHRyYXZlcnNlU3RhdGljQ2hpbGRyZW4oXG4gICAgICAgICAgICBuMSxcbiAgICAgICAgICAgIG4yLFxuICAgICAgICAgICAgdHJ1ZVxuICAgICAgICAgICAgLyogc2hhbGxvdyAqL1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhdGNoQ2hpbGRyZW4oXG4gICAgICAgICAgbjEsXG4gICAgICAgICAgbjIsXG4gICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgIGZyYWdtZW50RW5kQW5jaG9yLFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgIG9wdGltaXplZFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgY29uc3QgcHJvY2Vzc0NvbXBvbmVudCA9IChuMSwgbjIsIGNvbnRhaW5lciwgYW5jaG9yLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBuYW1lc3BhY2UsIHNsb3RTY29wZUlkcywgb3B0aW1pemVkKSA9PiB7XG4gICAgbjIuc2xvdFNjb3BlSWRzID0gc2xvdFNjb3BlSWRzO1xuICAgIGlmIChuMSA9PSBudWxsKSB7XG4gICAgICBpZiAobjIuc2hhcGVGbGFnICYgNTEyKSB7XG4gICAgICAgIHBhcmVudENvbXBvbmVudC5jdHguYWN0aXZhdGUoXG4gICAgICAgICAgbjIsXG4gICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgIGFuY2hvcixcbiAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgb3B0aW1pemVkXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtb3VudENvbXBvbmVudChcbiAgICAgICAgICBuMixcbiAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgYW5jaG9yLFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgb3B0aW1pemVkXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHVwZGF0ZUNvbXBvbmVudChuMSwgbjIsIG9wdGltaXplZCk7XG4gICAgfVxuICB9O1xuICBjb25zdCBtb3VudENvbXBvbmVudCA9IChpbml0aWFsVk5vZGUsIGNvbnRhaW5lciwgYW5jaG9yLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBuYW1lc3BhY2UsIG9wdGltaXplZCkgPT4ge1xuICAgIGNvbnN0IGluc3RhbmNlID0gKGluaXRpYWxWTm9kZS5jb21wb25lbnQgPSBjcmVhdGVDb21wb25lbnRJbnN0YW5jZShcbiAgICAgIGluaXRpYWxWTm9kZSxcbiAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgIHBhcmVudFN1c3BlbnNlXG4gICAgKSk7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgaW5zdGFuY2UudHlwZS5fX2htcklkKSB7XG4gICAgICByZWdpc3RlckhNUihpbnN0YW5jZSk7XG4gICAgfVxuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICBwdXNoV2FybmluZ0NvbnRleHQoaW5pdGlhbFZOb2RlKTtcbiAgICAgIHN0YXJ0TWVhc3VyZShpbnN0YW5jZSwgYG1vdW50YCk7XG4gICAgfVxuICAgIGlmIChpc0tlZXBBbGl2ZShpbml0aWFsVk5vZGUpKSB7XG4gICAgICBpbnN0YW5jZS5jdHgucmVuZGVyZXIgPSBpbnRlcm5hbHM7XG4gICAgfVxuICAgIHtcbiAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgIHN0YXJ0TWVhc3VyZShpbnN0YW5jZSwgYGluaXRgKTtcbiAgICAgIH1cbiAgICAgIHNldHVwQ29tcG9uZW50KGluc3RhbmNlLCBmYWxzZSwgb3B0aW1pemVkKTtcbiAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgIGVuZE1lYXN1cmUoaW5zdGFuY2UsIGBpbml0YCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpbnN0YW5jZS5hc3luY0RlcCkge1xuICAgICAgcGFyZW50U3VzcGVuc2UgJiYgcGFyZW50U3VzcGVuc2UucmVnaXN0ZXJEZXAoaW5zdGFuY2UsIHNldHVwUmVuZGVyRWZmZWN0LCBvcHRpbWl6ZWQpO1xuICAgICAgaWYgKCFpbml0aWFsVk5vZGUuZWwpIHtcbiAgICAgICAgY29uc3QgcGxhY2Vob2xkZXIgPSBpbnN0YW5jZS5zdWJUcmVlID0gY3JlYXRlVk5vZGUoQ29tbWVudCk7XG4gICAgICAgIHByb2Nlc3NDb21tZW50Tm9kZShudWxsLCBwbGFjZWhvbGRlciwgY29udGFpbmVyLCBhbmNob3IpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzZXR1cFJlbmRlckVmZmVjdChcbiAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgIGluaXRpYWxWTm9kZSxcbiAgICAgICAgY29udGFpbmVyLFxuICAgICAgICBhbmNob3IsXG4gICAgICAgI
20578HBhcmVudFN1c3BlbnNlLFxuICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgIG9wdGltaXplZFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgIHBvcFdhcm5pbmdDb250ZXh0KCk7XG4gICAgICBlbmRNZWFzdXJlKGluc3RhbmNlLCBgbW91bnRgKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IHVwZGF0ZUNvbXBvbmVudCA9IChuMSwgbjIsIG9wdGltaXplZCkgPT4ge1xuICAgIGNvbnN0IGluc3RhbmNlID0gbjIuY29tcG9uZW50ID0gbjEuY29tcG9uZW50O1xuICAgIGlmIChzaG91bGRVcGRhdGVDb21wb25lbnQobjEsIG4yLCBvcHRpbWl6ZWQpKSB7XG4gICAgICBpZiAoaW5zdGFuY2UuYXN5bmNEZXAgJiYgIWluc3RhbmNlLmFzeW5jUmVzb2x2ZWQpIHtcbiAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICBwdXNoV2FybmluZ0NvbnRleHQobjIpO1xuICAgICAgICB9XG4gICAgICAgIHVwZGF0ZUNvbXBvbmVudFByZVJlbmRlcihpbnN0YW5jZSwgbjIsIG9wdGltaXplZCk7XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgcG9wV2FybmluZ0NvbnRleHQoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbnN0YW5jZS5uZXh0ID0gbjI7XG4gICAgICAgIGludmFsaWRhdGVKb2IoaW5zdGFuY2UudXBkYXRlKTtcbiAgICAgICAgaW5zdGFuY2UuZWZmZWN0LmRpcnR5ID0gdHJ1ZTtcbiAgICAgICAgaW5zdGFuY2UudXBkYXRlKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG4yLmVsID0gbjEuZWw7XG4gICAgICBpbnN0YW5jZS52bm9kZSA9IG4yO1xuICAgIH1cbiAgfTtcbiAgY29uc3Qgc2V0dXBSZW5kZXJFZmZlY3QgPSAoaW5zdGFuY2UsIGluaXRpYWxWTm9kZSwgY29udGFpbmVyLCBhbmNob3IsIHBhcmVudFN1c3BlbnNlLCBuYW1lc3BhY2UsIG9wdGltaXplZCkgPT4ge1xuICAgIGNvbnN0IGNvbXBvbmVudFVwZGF0ZUZuID0gKCkgPT4ge1xuICAgICAgaWYgKCFpbnN0YW5jZS5pc01vdW50ZWQpIHtcbiAgICAgICAgbGV0IHZub2RlSG9vaztcbiAgICAgICAgY29uc3QgeyBlbCwgcHJvcHMgfSA9IGluaXRpYWxWTm9kZTtcbiAgICAgICAgY29uc3QgeyBibSwgbSwgcGFyZW50IH0gPSBpbnN0YW5jZTtcbiAgICAgICAgY29uc3QgaXNBc3luY1dyYXBwZXJWTm9kZSA9IGlzQXN5bmNXcmFwcGVyKGluaXRpYWxWTm9kZSk7XG4gICAgICAgIHRvZ2dsZVJlY3Vyc2UoaW5zdGFuY2UsIGZhbHNlKTtcbiAgICAgICAgaWYgKGJtKSB7XG4gICAgICAgICAgaW52b2tlQXJyYXlGbnMoYm0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNBc3luY1dyYXBwZXJWTm9kZSAmJiAodm5vZGVIb29rID0gcHJvcHMgJiYgcHJvcHMub25Wbm9kZUJlZm9yZU1vdW50KSkge1xuICAgICAgICAgIGludm9rZVZOb2RlSG9vayh2bm9kZUhvb2ssIHBhcmVudCwgaW5pdGlhbFZOb2RlKTtcbiAgICAgICAgfVxuICAgICAgICB0b2dnbGVSZWN1cnNlKGluc3RhbmNlLCB0cnVlKTtcbiAgICAgICAgaWYgKGVsICYmIGh5ZHJhdGVOb2RlKSB7XG4gICAgICAgICAgY29uc3QgaHlkcmF0ZVN1YlRyZWUgPSAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgICAgICBzdGFydE1lYXN1cmUoaW5zdGFuY2UsIGByZW5kZXJgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGluc3RhbmNlLnN1YlRyZWUgPSByZW5kZXJDb21wb25lbnRSb290KGluc3RhbmNlKTtcbiAgICAgICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgICAgIGVuZE1lYXN1cmUoaW5zdGFuY2UsIGByZW5kZXJgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgICAgIHN0YXJ0TWVhc3VyZShpbnN0YW5jZSwgYGh5ZHJhdGVgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGh5ZHJhdGVOb2RlKFxuICAgICAgICAgICAgICBlbCxcbiAgICAgICAgICAgICAgaW5zdGFuY2Uuc3ViVHJlZSxcbiAgICAgICAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgICAgICBudWxsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICAgICAgZW5kTWVhc3VyZShpbnN0YW5jZSwgYGh5ZHJhdGVgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICAgIGlmIChpc0FzeW5jV3JhcHBlclZOb2RlKSB7XG4gICAgICAgICAgICBpbml0aWFsVk5vZGUudHlwZS5fX2FzeW5jTG9hZGVyKCkudGhlbihcbiAgICAgICAgICAgICAgLy8gbm90ZTogd2UgYXJlIG1vdmluZyB0aGUgcmVuZGVyIGNhbGwgaW50byBhbiBhc3luYyBjYWxsYmFjayxcbiAgICAgICAgICAgICAgLy8gd2hpY2ggbWVhbnMgaXQgd29uJ3QgdHJhY2sgZGVwZW5kZW5jaWVzIC0gYnV0IGl0J3Mgb2sgYmVjYXVzZVxuICAgICAgICAgICAgICAvLyBhIHNlcnZlci1yZW5kZXJlZCBhc3luYyB3cmFwcGVyIGlzIGFscmVhZHkgaW4gcmVzb2x2ZWQgc3RhdGVcbiAgICAgICAgICAgICAgLy8gYW5kIGl0IHdpbGwgbmV2ZXIgbmVlZCB0byBjaGFuZ2UuXG4gICAgICAgICAgICAgICgpID0+ICFpbnN0YW5jZS5pc1VubW91bnRlZCAmJiBoeWRyYXRlU3ViVHJlZSgpXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBoeWRyYXRlU3ViVHJlZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgICAgc3RhcnRNZWFzdXJlKGluc3RhbmNlLCBgcmVuZGVyYCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHN1YlRyZWUgPSBpbnN0YW5jZS5zdWJUcmVlID0gcmVuZGVyQ29tcG9uZW50Um9vdChpbnN0YW5jZSk7XG4gICAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICAgIGVuZE1lYXN1cmU
20578oaW5zdGFuY2UsIGByZW5kZXJgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICAgIHN0YXJ0TWVhc3VyZShpbnN0YW5jZSwgYHBhdGNoYCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHBhdGNoKFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIHN1YlRyZWUsXG4gICAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgICBhbmNob3IsXG4gICAgICAgICAgICBpbnN0YW5jZSxcbiAgICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgICAgbmFtZXNwYWNlXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgICAgZW5kTWVhc3VyZShpbnN0YW5jZSwgYHBhdGNoYCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGluaXRpYWxWTm9kZS5lbCA9IHN1YlRyZWUuZWw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG0pIHtcbiAgICAgICAgICBxdWV1ZVBvc3RSZW5kZXJFZmZlY3QobSwgcGFyZW50U3VzcGVuc2UpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNBc3luY1dyYXBwZXJWTm9kZSAmJiAodm5vZGVIb29rID0gcHJvcHMgJiYgcHJvcHMub25Wbm9kZU1vdW50ZWQpKSB7XG4gICAgICAgICAgY29uc3Qgc2NvcGVkSW5pdGlhbFZOb2RlID0gaW5pdGlhbFZOb2RlO1xuICAgICAgICAgIHF1ZXVlUG9zdFJlbmRlckVmZmVjdChcbiAgICAgICAgICAgICgpID0+IGludm9rZVZOb2RlSG9vayh2bm9kZUhvb2ssIHBhcmVudCwgc2NvcGVkSW5pdGlhbFZOb2RlKSxcbiAgICAgICAgICAgIHBhcmVudFN1c3BlbnNlXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5pdGlhbFZOb2RlLnNoYXBlRmxhZyAmIDI1NiB8fCBwYXJlbnQgJiYgaXNBc3luY1dyYXBwZXIocGFyZW50LnZub2RlKSAmJiBwYXJlbnQudm5vZGUuc2hhcGVGbGFnICYgMjU2KSB7XG4gICAgICAgICAgaW5zdGFuY2UuYSAmJiBxdWV1ZVBvc3RSZW5kZXJFZmZlY3QoaW5zdGFuY2UuYSwgcGFyZW50U3VzcGVuc2UpO1xuICAgICAgICB9XG4gICAgICAgIGluc3RhbmNlLmlzTW91bnRlZCA9IHRydWU7XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHx8IF9fVlVFX1BST0RfREVWVE9PTFNfXykge1xuICAgICAgICAgIGRldnRvb2xzQ29tcG9uZW50QWRkZWQoaW5zdGFuY2UpO1xuICAgICAgICB9XG4gICAgICAgIGluaXRpYWxWTm9kZSA9IGNvbnRhaW5lciA9IGFuY2hvciA9IG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsZXQgeyBuZXh0LCBidSwgdSwgcGFyZW50LCB2bm9kZSB9ID0gaW5zdGFuY2U7XG4gICAgICAgIHtcbiAgICAgICAgICBjb25zdCBub25IeWRyYXRlZEFzeW5jUm9vdCA9IGxvY2F0ZU5vbkh5ZHJhdGVkQXN5bmNSb290KGluc3RhbmNlKTtcbiAgICAgICAgICBpZiAobm9uSHlkcmF0ZWRBc3luY1Jvb3QpIHtcbiAgICAgICAgICAgIGlmIChuZXh0KSB7XG4gICAgICAgICAgICAgIG5leHQuZWwgPSB2bm9kZS5lbDtcbiAgICAgICAgICAgICAgdXBkYXRlQ29tcG9uZW50UHJlUmVuZGVyKGluc3RhbmNlLCBuZXh0LCBvcHRpbWl6ZWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbm9uSHlkcmF0ZWRBc3luY1Jvb3QuYXN5bmNEZXAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgIGlmICghaW5zdGFuY2UuaXNVbm1vdW50ZWQpIHtcbiAgICAgICAgICAgICAgICBjb21wb25lbnRVcGRhdGVGbigpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG9yaWdpbk5leHQgPSBuZXh0O1xuICAgICAgICBsZXQgdm5vZGVIb29rO1xuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgIHB1c2hXYXJuaW5nQ29udGV4dChuZXh0IHx8IGluc3RhbmNlLnZub2RlKTtcbiAgICAgICAgfVxuICAgICAgICB0b2dnbGVSZWN1cnNlKGluc3RhbmNlLCBmYWxzZSk7XG4gICAgICAgIGlmIChuZXh0KSB7XG4gICAgICAgICAgbmV4dC5lbCA9IHZub2RlLmVsO1xuICAgICAgICAgIHVwZGF0ZUNvbXBvbmVudFByZVJlbmRlcihpbnN0YW5jZSwgbmV4dCwgb3B0aW1pemVkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXh0ID0gdm5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJ1KSB7XG4gICAgICAgICAgaW52b2tlQXJyYXlGbnMoYnUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2bm9kZUhvb2sgPSBuZXh0LnByb3BzICYmIG5leHQucHJvcHMub25Wbm9kZUJlZm9yZVVwZGF0ZSkge1xuICAgICAgICAgIGludm9rZVZOb2RlSG9vayh2bm9kZUhvb2ssIHBhcmVudCwgbmV4dCwgdm5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIHRvZ2dsZVJlY3Vyc2UoaW5zdGFuY2UsIHRydWUpO1xuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgIHN0YXJ0TWVhc3VyZShpbnN0YW5jZSwgYHJlbmRlcmApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5leHRUcmVlID0gcmVuZGVyQ29tcG9uZW50Um9vdChpbnN0YW5jZSk7XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgZW5kTWVhc3VyZShpbnN0YW5jZSwgYHJlbmRlcmApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHByZXZUcmVlID0gaW5zdGFuY2Uuc3ViVHJlZTtcbiAgICAgICAgaW5zdGFuY2Uuc3ViVHJlZSA9IG5leHRUcmVlO1xuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgIHN0YXJ0TWVhc3VyZShpbnN0YW5jZSwgYHBhdGNoYCk7XG4gICAgICAgIH1cbiAgICAgICAgcGF0Y2goXG4gICAgICAgICAgcHJldlRyZWUsXG4gICAgICAgICAgbmV4dFRyZWUsXG4gICAgICAgICAgLy8gcGFyZW50IG1heSBoYXZlIGNoYW5nZWQgaWYgaXQncyBpbiBhIHRlbGVwb3J0XG4gICAgICAgICAgaG9zdFBhcmVudE5vZGUocHJldlRyZWUuZWwpLFxuICAgICAgICAgIC8vIGFuY2hvciBtYXkgaGF2ZSBjaGFuZ2VkIGlmIGl0J3MgaW4gYSBmcmFnbWVudFxuICAgICAgICAgIGdldE5leHRIb3N0Tm9kZShwcmV2VHJlZSksXG4gICAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgbmFtZXNwYWNlXG4gICAgICAgICk7XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9k
20578dWN0aW9uXCIpKSB7XG4gICAgICAgICAgZW5kTWVhc3VyZShpbnN0YW5jZSwgYHBhdGNoYCk7XG4gICAgICAgIH1cbiAgICAgICAgbmV4dC5lbCA9IG5leHRUcmVlLmVsO1xuICAgICAgICBpZiAob3JpZ2luTmV4dCA9PT0gbnVsbCkge1xuICAgICAgICAgIHVwZGF0ZUhPQ0hvc3RFbChpbnN0YW5jZSwgbmV4dFRyZWUuZWwpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1KSB7XG4gICAgICAgICAgcXVldWVQb3N0UmVuZGVyRWZmZWN0KHUsIHBhcmVudFN1c3BlbnNlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodm5vZGVIb29rID0gbmV4dC5wcm9wcyAmJiBuZXh0LnByb3BzLm9uVm5vZGVVcGRhdGVkKSB7XG4gICAgICAgICAgcXVldWVQb3N0UmVuZGVyRWZmZWN0KFxuICAgICAgICAgICAgKCkgPT4gaW52b2tlVk5vZGVIb29rKHZub2RlSG9vaywgcGFyZW50LCBuZXh0LCB2bm9kZSksXG4gICAgICAgICAgICBwYXJlbnRTdXNwZW5zZVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgX19WVUVfUFJPRF9ERVZUT09MU19fKSB7XG4gICAgICAgICAgZGV2dG9vbHNDb21wb25lbnRVcGRhdGVkKGluc3RhbmNlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgIHBvcFdhcm5pbmdDb250ZXh0KCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIGNvbnN0IGVmZmVjdCA9IGluc3RhbmNlLmVmZmVjdCA9IG5ldyBSZWFjdGl2ZUVmZmVjdChcbiAgICAgIGNvbXBvbmVudFVwZGF0ZUZuLFxuICAgICAgTk9PUCxcbiAgICAgICgpID0+IHF1ZXVlSm9iKHVwZGF0ZSksXG4gICAgICBpbnN0YW5jZS5zY29wZVxuICAgICAgLy8gdHJhY2sgaXQgaW4gY29tcG9uZW50J3MgZWZmZWN0IHNjb3BlXG4gICAgKTtcbiAgICBjb25zdCB1cGRhdGUgPSBpbnN0YW5jZS51cGRhdGUgPSAoKSA9PiB7XG4gICAgICBpZiAoZWZmZWN0LmRpcnR5KSB7XG4gICAgICAgIGVmZmVjdC5ydW4oKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHVwZGF0ZS5pID0gaW5zdGFuY2U7XG4gICAgdXBkYXRlLmlkID0gaW5zdGFuY2UudWlkO1xuICAgIHRvZ2dsZVJlY3Vyc2UoaW5zdGFuY2UsIHRydWUpO1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICBlZmZlY3Qub25UcmFjayA9IGluc3RhbmNlLnJ0YyA/IChlKSA9PiBpbnZva2VBcnJheUZucyhpbnN0YW5jZS5ydGMsIGUpIDogdm9pZCAwO1xuICAgICAgZWZmZWN0Lm9uVHJpZ2dlciA9IGluc3RhbmNlLnJ0ZyA/IChlKSA9PiBpbnZva2VBcnJheUZucyhpbnN0YW5jZS5ydGcsIGUpIDogdm9pZCAwO1xuICAgIH1cbiAgICB1cGRhdGUoKTtcbiAgfTtcbiAgY29uc3QgdXBkYXRlQ29tcG9uZW50UHJlUmVuZGVyID0gKGluc3RhbmNlLCBuZXh0Vk5vZGUsIG9wdGltaXplZCkgPT4ge1xuICAgIG5leHRWTm9kZS5jb21wb25lbnQgPSBpbnN0YW5jZTtcbiAgICBjb25zdCBwcmV2UHJvcHMgPSBpbnN0YW5jZS52bm9kZS5wcm9wcztcbiAgICBpbnN0YW5jZS52bm9kZSA9IG5leHRWTm9kZTtcbiAgICBpbnN0YW5jZS5uZXh0ID0gbnVsbDtcbiAgICB1cGRhdGVQcm9wcyhpbnN0YW5jZSwgbmV4dFZOb2RlLnByb3BzLCBwcmV2UHJvcHMsIG9wdGltaXplZCk7XG4gICAgdXBkYXRlU2xvdHMoaW5zdGFuY2UsIG5leHRWTm9kZS5jaGlsZHJlbiwgb3B0aW1pemVkKTtcbiAgICBwYXVzZVRyYWNraW5nKCk7XG4gICAgZmx1c2hQcmVGbHVzaENicyhpbnN0YW5jZSk7XG4gICAgcmVzZXRUcmFja2luZygpO1xuICB9O1xuICBjb25zdCBwYXRjaENoaWxkcmVuID0gKG4xLCBuMiwgY29udGFpbmVyLCBhbmNob3IsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIG5hbWVzcGFjZSwgc2xvdFNjb3BlSWRzLCBvcHRpbWl6ZWQgPSBmYWxzZSkgPT4ge1xuICAgIGNvbnN0IGMxID0gbjEgJiYgbjEuY2hpbGRyZW47XG4gICAgY29uc3QgcHJldlNoYXBlRmxhZyA9IG4xID8gbjEuc2hhcGVGbGFnIDogMDtcbiAgICBjb25zdCBjMiA9IG4yLmNoaWxkcmVuO1xuICAgIGNvbnN0IHsgcGF0Y2hGbGFnLCBzaGFwZUZsYWcgfSA9IG4yO1xuICAgIGlmIChwYXRjaEZsYWcgPiAwKSB7XG4gICAgICBpZiAocGF0Y2hGbGFnICYgMTI4KSB7XG4gICAgICAgIHBhdGNoS2V5ZWRDaGlsZHJlbihcbiAgICAgICAgICBjMSxcbiAgICAgICAgICBjMixcbiAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgYW5jaG9yLFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgIG9wdGltaXplZFxuICAgICAgICApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGVsc2UgaWYgKHBhdGNoRmxhZyAmIDI1Nikge1xuICAgICAgICBwYXRjaFVua2V5ZWRDaGlsZHJlbihcbiAgICAgICAgICBjMSxcbiAgICAgICAgICBjMixcbiAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgYW5jaG9yLFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgIG9wdGltaXplZFxuICAgICAgICApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChzaGFwZUZsYWcgJiA4KSB7XG4gICAgICBpZiAocHJldlNoYXBlRmxhZyAmIDE2KSB7XG4gICAgICAgIHVubW91bnRDaGlsZHJlbihjMSwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSk7XG4gICAgICB9XG4gICAgICBpZiAoYzIgIT09IGMxKSB7XG4gICAgICAgIGhvc3RTZXRFbGVtZW50VGV4dChjb250YWluZXIsIGMyKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHByZXZTaGFwZUZsYWcgJiAxNikge1xuICAgICAgICBpZiAoc2hhcGVGbGFnICYgMTYpIHtcbiAgICAgICAgICBwYXRjaEtleWVkQ2hpbGRyZW4oXG4gICAgICAgICAgICBjMSxcbiAgICAgICAgICAgIGMyLFxuICAgICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgICAgYW5jaG9yLFxuICAgICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgI
20578HVubW91bnRDaGlsZHJlbihjMSwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChwcmV2U2hhcGVGbGFnICYgOCkge1xuICAgICAgICAgIGhvc3RTZXRFbGVtZW50VGV4dChjb250YWluZXIsIFwiXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzaGFwZUZsYWcgJiAxNikge1xuICAgICAgICAgIG1vdW50Q2hpbGRyZW4oXG4gICAgICAgICAgICBjMixcbiAgICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICAgIGFuY2hvcixcbiAgICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgICAgb3B0aW1pemVkXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgY29uc3QgcGF0Y2hVbmtleWVkQ2hpbGRyZW4gPSAoYzEsIGMyLCBjb250YWluZXIsIGFuY2hvciwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgbmFtZXNwYWNlLCBzbG90U2NvcGVJZHMsIG9wdGltaXplZCkgPT4ge1xuICAgIGMxID0gYzEgfHwgRU1QVFlfQVJSO1xuICAgIGMyID0gYzIgfHwgRU1QVFlfQVJSO1xuICAgIGNvbnN0IG9sZExlbmd0aCA9IGMxLmxlbmd0aDtcbiAgICBjb25zdCBuZXdMZW5ndGggPSBjMi5sZW5ndGg7XG4gICAgY29uc3QgY29tbW9uTGVuZ3RoID0gTWF0aC5taW4ob2xkTGVuZ3RoLCBuZXdMZW5ndGgpO1xuICAgIGxldCBpO1xuICAgIGZvciAoaSA9IDA7IGkgPCBjb21tb25MZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgbmV4dENoaWxkID0gYzJbaV0gPSBvcHRpbWl6ZWQgPyBjbG9uZUlmTW91bnRlZChjMltpXSkgOiBub3JtYWxpemVWTm9kZShjMltpXSk7XG4gICAgICBwYXRjaChcbiAgICAgICAgYzFbaV0sXG4gICAgICAgIG5leHRDaGlsZCxcbiAgICAgICAgY29udGFpbmVyLFxuICAgICAgICBudWxsLFxuICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgb3B0aW1pemVkXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAob2xkTGVuZ3RoID4gbmV3TGVuZ3RoKSB7XG4gICAgICB1bm1vdW50Q2hpbGRyZW4oXG4gICAgICAgIGMxLFxuICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICB0cnVlLFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgY29tbW9uTGVuZ3RoXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBtb3VudENoaWxkcmVuKFxuICAgICAgICBjMixcbiAgICAgICAgY29udGFpbmVyLFxuICAgICAgICBhbmNob3IsXG4gICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICBvcHRpbWl6ZWQsXG4gICAgICAgIGNvbW1vbkxlbmd0aFxuICAgICAgKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IHBhdGNoS2V5ZWRDaGlsZHJlbiA9IChjMSwgYzIsIGNvbnRhaW5lciwgcGFyZW50QW5jaG9yLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBuYW1lc3BhY2UsIHNsb3RTY29wZUlkcywgb3B0aW1pemVkKSA9PiB7XG4gICAgbGV0IGkgPSAwO1xuICAgIGNvbnN0IGwyID0gYzIubGVuZ3RoO1xuICAgIGxldCBlMSA9IGMxLmxlbmd0aCAtIDE7XG4gICAgbGV0IGUyID0gbDIgLSAxO1xuICAgIHdoaWxlIChpIDw9IGUxICYmIGkgPD0gZTIpIHtcbiAgICAgIGNvbnN0IG4xID0gYzFbaV07XG4gICAgICBjb25zdCBuMiA9IGMyW2ldID0gb3B0aW1pemVkID8gY2xvbmVJZk1vdW50ZWQoYzJbaV0pIDogbm9ybWFsaXplVk5vZGUoYzJbaV0pO1xuICAgICAgaWYgKGlzU2FtZVZOb2RlVHlwZShuMSwgbjIpKSB7XG4gICAgICAgIHBhdGNoKFxuICAgICAgICAgIG4xLFxuICAgICAgICAgIG4yLFxuICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICBudWxsLFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgIG9wdGltaXplZFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpKys7XG4gICAgfVxuICAgIHdoaWxlIChpIDw9IGUxICYmIGkgPD0gZTIpIHtcbiAgICAgIGNvbnN0IG4xID0gYzFbZTFdO1xuICAgICAgY29uc3QgbjIgPSBjMltlMl0gPSBvcHRpbWl6ZWQgPyBjbG9uZUlmTW91bnRlZChjMltlMl0pIDogbm9ybWFsaXplVk5vZGUoYzJbZTJdKTtcbiAgICAgIGlmIChpc1NhbWVWTm9kZVR5cGUobjEsIG4yKSkge1xuICAgICAgICBwYXRjaChcbiAgICAgICAgICBuMSxcbiAgICAgICAgICBuMixcbiAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgbnVsbCxcbiAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgZTEtLTtcbiAgICAgIGUyLS07XG4gICAgfVxuICAgIGlmIChpID4gZTEpIHtcbiAgICAgIGlmIChpIDw9IGUyKSB7XG4gICAgICAgIGNvbnN0IG5leHRQb3MgPSBlMiArIDE7XG4gICAgICAgIGNvbnN0IGFuY2hvciA9IG5leHRQb3MgPCBsMiA/IGMyW25leHRQb3NdLmVsIDogcGFyZW50QW5jaG9yO1xuICAgICAgICB3aGlsZSAoaSA8PSBlMikge1xuICAgICAgICAgIHBhdGNoKFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIGMyW2ldID0gb3B0aW1pemVkID8gY2xvbmVJZk1vdW50ZWQoYzJbaV0pIDogbm9ybWFsaXplVk5vZGUoYzJbaV0pLFxuICAgICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgICAgYW5jaG9yLFxuICAgICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgICApO1xuICAgICAgICAgIGkrKztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaSA+IGUyKSB7XG4gICAgICB3aGlsZSAoaSA8PSBlMSkge1xuICAgICAgICB1bm1vdW50KGMxW2ldLCBwYXJlbnRDb21wb25lbnQsIH
20578BhcmVudFN1c3BlbnNlLCB0cnVlKTtcbiAgICAgICAgaSsrO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBzMSA9IGk7XG4gICAgICBjb25zdCBzMiA9IGk7XG4gICAgICBjb25zdCBrZXlUb05ld0luZGV4TWFwID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcbiAgICAgIGZvciAoaSA9IHMyOyBpIDw9IGUyOyBpKyspIHtcbiAgICAgICAgY29uc3QgbmV4dENoaWxkID0gYzJbaV0gPSBvcHRpbWl6ZWQgPyBjbG9uZUlmTW91bnRlZChjMltpXSkgOiBub3JtYWxpemVWTm9kZShjMltpXSk7XG4gICAgICAgIGlmIChuZXh0Q2hpbGQua2V5ICE9IG51bGwpIHtcbiAgICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBrZXlUb05ld0luZGV4TWFwLmhhcyhuZXh0Q2hpbGQua2V5KSkge1xuICAgICAgICAgICAgd2FybiQxKFxuICAgICAgICAgICAgICBgRHVwbGljYXRlIGtleXMgZm91bmQgZHVyaW5nIHVwZGF0ZTpgLFxuICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShuZXh0Q2hpbGQua2V5KSxcbiAgICAgICAgICAgICAgYE1ha2Ugc3VyZSBrZXlzIGFyZSB1bmlxdWUuYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAga2V5VG9OZXdJbmRleE1hcC5zZXQobmV4dENoaWxkLmtleSwgaSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGxldCBqO1xuICAgICAgbGV0IHBhdGNoZWQgPSAwO1xuICAgICAgY29uc3QgdG9CZVBhdGNoZWQgPSBlMiAtIHMyICsgMTtcbiAgICAgIGxldCBtb3ZlZCA9IGZhbHNlO1xuICAgICAgbGV0IG1heE5ld0luZGV4U29GYXIgPSAwO1xuICAgICAgY29uc3QgbmV3SW5kZXhUb09sZEluZGV4TWFwID0gbmV3IEFycmF5KHRvQmVQYXRjaGVkKTtcbiAgICAgIGZvciAoaSA9IDA7IGkgPCB0b0JlUGF0Y2hlZDsgaSsrKSBuZXdJbmRleFRvT2xkSW5kZXhNYXBbaV0gPSAwO1xuICAgICAgZm9yIChpID0gczE7IGkgPD0gZTE7IGkrKykge1xuICAgICAgICBjb25zdCBwcmV2Q2hpbGQgPSBjMVtpXTtcbiAgICAgICAgaWYgKHBhdGNoZWQgPj0gdG9CZVBhdGNoZWQpIHtcbiAgICAgICAgICB1bm1vdW50KHByZXZDaGlsZCwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgdHJ1ZSk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG5ld0luZGV4O1xuICAgICAgICBpZiAocHJldkNoaWxkLmtleSAhPSBudWxsKSB7XG4gICAgICAgICAgbmV3SW5kZXggPSBrZXlUb05ld0luZGV4TWFwLmdldChwcmV2Q2hpbGQua2V5KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmb3IgKGogPSBzMjsgaiA8PSBlMjsgaisrKSB7XG4gICAgICAgICAgICBpZiAobmV3SW5kZXhUb09sZEluZGV4TWFwW2ogLSBzMl0gPT09IDAgJiYgaXNTYW1lVk5vZGVUeXBlKHByZXZDaGlsZCwgYzJbal0pKSB7XG4gICAgICAgICAgICAgIG5ld0luZGV4ID0gajtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChuZXdJbmRleCA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgdW5tb3VudChwcmV2Q2hpbGQsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIHRydWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5ld0luZGV4VG9PbGRJbmRleE1hcFtuZXdJbmRleCAtIHMyXSA9IGkgKyAxO1xuICAgICAgICAgIGlmIChuZXdJbmRleCA+PSBtYXhOZXdJbmRleFNvRmFyKSB7XG4gICAgICAgICAgICBtYXhOZXdJbmRleFNvRmFyID0gbmV3SW5kZXg7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG1vdmVkID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcGF0Y2goXG4gICAgICAgICAgICBwcmV2Q2hpbGQsXG4gICAgICAgICAgICBjMltuZXdJbmRleF0sXG4gICAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgICApO1xuICAgICAgICAgIHBhdGNoZWQrKztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3QgaW5jcmVhc2luZ05ld0luZGV4U2VxdWVuY2UgPSBtb3ZlZCA/IGdldFNlcXVlbmNlKG5ld0luZGV4VG9PbGRJbmRleE1hcCkgOiBFTVBUWV9BUlI7XG4gICAgICBqID0gaW5jcmVhc2luZ05ld0luZGV4U2VxdWVuY2UubGVuZ3RoIC0gMTtcbiAgICAgIGZvciAoaSA9IHRvQmVQYXRjaGVkIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgY29uc3QgbmV4dEluZGV4ID0gczIgKyBpO1xuICAgICAgICBjb25zdCBuZXh0Q2hpbGQgPSBjMltuZXh0SW5kZXhdO1xuICAgICAgICBjb25zdCBhbmNob3IgPSBuZXh0SW5kZXggKyAxIDwgbDIgPyBjMltuZXh0SW5kZXggKyAxXS5lbCA6IHBhcmVudEFuY2hvcjtcbiAgICAgICAgaWYgKG5ld0luZGV4VG9PbGRJbmRleE1hcFtpXSA9PT0gMCkge1xuICAgICAgICAgIHBhdGNoKFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIG5leHRDaGlsZCxcbiAgICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICAgIGFuY2hvcixcbiAgICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgICAgb3B0aW1pemVkXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmIChtb3ZlZCkge1xuICAgICAgICAgIGlmIChqIDwgMCB8fCBpICE9PSBpbmNyZWFzaW5nTmV3SW5kZXhTZXF1ZW5jZVtqXSkge1xuICAgICAgICAgICAgbW92ZShuZXh0Q2hpbGQsIGNvbnRhaW5lciwgYW5jaG9yLCAyKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgai0tO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgY29uc3QgbW92ZSA9ICh2bm9kZSwgY29udGFpbmVyLCBhbmNob3IsIG1vdmVUeXBlLCBwYXJlbnRTdXNwZW5zZSA9IG51bGwpID0+IHtcbiAgICBjb25zdCB7IGVsLCB0eX
20578BlLCB0cmFuc2l0aW9uLCBjaGlsZHJlbiwgc2hhcGVGbGFnIH0gPSB2bm9kZTtcbiAgICBpZiAoc2hhcGVGbGFnICYgNikge1xuICAgICAgbW92ZSh2bm9kZS5jb21wb25lbnQuc3ViVHJlZSwgY29udGFpbmVyLCBhbmNob3IsIG1vdmVUeXBlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHNoYXBlRmxhZyAmIDEyOCkge1xuICAgICAgdm5vZGUuc3VzcGVuc2UubW92ZShjb250YWluZXIsIGFuY2hvciwgbW92ZVR5cGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoc2hhcGVGbGFnICYgNjQpIHtcbiAgICAgIHR5cGUubW92ZSh2bm9kZSwgY29udGFpbmVyLCBhbmNob3IsIGludGVybmFscyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0eXBlID09PSBGcmFnbWVudCkge1xuICAgICAgaG9zdEluc2VydChlbCwgY29udGFpbmVyLCBhbmNob3IpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICBtb3ZlKGNoaWxkcmVuW2ldLCBjb250YWluZXIsIGFuY2hvciwgbW92ZVR5cGUpO1xuICAgICAgfVxuICAgICAgaG9zdEluc2VydCh2bm9kZS5hbmNob3IsIGNvbnRhaW5lciwgYW5jaG9yKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHR5cGUgPT09IFN0YXRpYykge1xuICAgICAgbW92ZVN0YXRpY05vZGUodm5vZGUsIGNvbnRhaW5lciwgYW5jaG9yKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbmVlZFRyYW5zaXRpb24yID0gbW92ZVR5cGUgIT09IDIgJiYgc2hhcGVGbGFnICYgMSAmJiB0cmFuc2l0aW9uO1xuICAgIGlmIChuZWVkVHJhbnNpdGlvbjIpIHtcbiAgICAgIGlmIChtb3ZlVHlwZSA9PT0gMCkge1xuICAgICAgICB0cmFuc2l0aW9uLmJlZm9yZUVudGVyKGVsKTtcbiAgICAgICAgaG9zdEluc2VydChlbCwgY29udGFpbmVyLCBhbmNob3IpO1xuICAgICAgICBxdWV1ZVBvc3RSZW5kZXJFZmZlY3QoKCkgPT4gdHJhbnNpdGlvbi5lbnRlcihlbCksIHBhcmVudFN1c3BlbnNlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHsgbGVhdmUsIGRlbGF5TGVhdmUsIGFmdGVyTGVhdmUgfSA9IHRyYW5zaXRpb247XG4gICAgICAgIGNvbnN0IHJlbW92ZTIgPSAoKSA9PiBob3N0SW5zZXJ0KGVsLCBjb250YWluZXIsIGFuY2hvcik7XG4gICAgICAgIGNvbnN0IHBlcmZvcm1MZWF2ZSA9ICgpID0+IHtcbiAgICAgICAgICBsZWF2ZShlbCwgKCkgPT4ge1xuICAgICAgICAgICAgcmVtb3ZlMigpO1xuICAgICAgICAgICAgYWZ0ZXJMZWF2ZSAmJiBhZnRlckxlYXZlKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIGlmIChkZWxheUxlYXZlKSB7XG4gICAgICAgICAgZGVsYXlMZWF2ZShlbCwgcmVtb3ZlMiwgcGVyZm9ybUxlYXZlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwZXJmb3JtTGVhdmUoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBob3N0SW5zZXJ0KGVsLCBjb250YWluZXIsIGFuY2hvcik7XG4gICAgfVxuICB9O1xuICBjb25zdCB1bm1vdW50ID0gKHZub2RlLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBkb1JlbW92ZSA9IGZhbHNlLCBvcHRpbWl6ZWQgPSBmYWxzZSkgPT4ge1xuICAgIGNvbnN0IHtcbiAgICAgIHR5cGUsXG4gICAgICBwcm9wcyxcbiAgICAgIHJlZixcbiAgICAgIGNoaWxkcmVuLFxuICAgICAgZHluYW1pY0NoaWxkcmVuLFxuICAgICAgc2hhcGVGbGFnLFxuICAgICAgcGF0Y2hGbGFnLFxuICAgICAgZGlycyxcbiAgICAgIGNhY2hlSW5kZXhcbiAgICB9ID0gdm5vZGU7XG4gICAgaWYgKHBhdGNoRmxhZyA9PT0gLTIpIHtcbiAgICAgIG9wdGltaXplZCA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAocmVmICE9IG51bGwpIHtcbiAgICAgIHNldFJlZihyZWYsIG51bGwsIHBhcmVudFN1c3BlbnNlLCB2bm9kZSwgdHJ1ZSk7XG4gICAgfVxuICAgIGlmIChjYWNoZUluZGV4ICE9IG51bGwpIHtcbiAgICAgIHBhcmVudENvbXBvbmVudC5yZW5kZXJDYWNoZVtjYWNoZUluZGV4XSA9IHZvaWQgMDtcbiAgICB9XG4gICAgaWYgKHNoYXBlRmxhZyAmIDI1Nikge1xuICAgICAgcGFyZW50Q29tcG9uZW50LmN0eC5kZWFjdGl2YXRlKHZub2RlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc2hvdWxkSW52b2tlRGlycyA9IHNoYXBlRmxhZyAmIDEgJiYgZGlycztcbiAgICBjb25zdCBzaG91bGRJbnZva2VWbm9kZUhvb2sgPSAhaXNBc3luY1dyYXBwZXIodm5vZGUpO1xuICAgIGxldCB2bm9kZUhvb2s7XG4gICAgaWYgKHNob3VsZEludm9rZVZub2RlSG9vayAmJiAodm5vZGVIb29rID0gcHJvcHMgJiYgcHJvcHMub25Wbm9kZUJlZm9yZVVubW91bnQpKSB7XG4gICAgICBpbnZva2VWTm9kZUhvb2sodm5vZGVIb29rLCBwYXJlbnRDb21wb25lbnQsIHZub2RlKTtcbiAgICB9XG4gICAgaWYgKHNoYXBlRmxhZyAmIDYpIHtcbiAgICAgIHVubW91bnRDb21wb25lbnQodm5vZGUuY29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgZG9SZW1vdmUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoc2hhcGVGbGFnICYgMTI4KSB7XG4gICAgICAgIHZub2RlLnN1c3BlbnNlLnVubW91bnQocGFyZW50U3VzcGVuc2UsIGRvUmVtb3ZlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHNob3VsZEludm9rZURpcnMpIHtcbiAgICAgICAgaW52b2tlRGlyZWN0aXZlSG9vayh2bm9kZSwgbnVsbCwgcGFyZW50Q29tcG9uZW50LCBcImJlZm9yZVVubW91bnRcIik7XG4gICAgICB9XG4gICAgICBpZiAoc2hhcGVGbGFnICYgNjQpIHtcbiAgICAgICAgdm5vZGUudHlwZS5yZW1vdmUoXG4gICAgICAgICAgdm5vZGUsXG4gICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgIGludGVybmFscyxcbiAgICAgICAgICBkb1JlbW92ZVxuICAgICAgICApO1xuICAgICAgfSBlbHNlIGlmIChkeW5hbWljQ2hpbGRyZW4gJiYgLy8gIzUxNTRcbiAgICAgIC8vIHdoZW4gdi1vbmNlIGlzIHVzZWQgaW5zaWRlIGEgYmxvY2ssIHNldEJsb2NrVHJhY2tpbmcoLTEpIG1hcmtzIHRoZVxuICAgICAgLy8gcGFyZW50IGJsb2NrIHdpdGggaGFzT25jZTogdHJ1ZVxuICAgICAgLy8gc28gdGhhdCBpdCBkb2Vzbid0IHRha2UgdGhlIGZhc3QgcGF0aCBkdXJpbmcgdW5tb3VudCAtIG90aGVyd2lzZVxuICAgICAgLy8gY29tcG9uZW50cyBuZXN0ZWQgaW4gdi1vbmNlIGFyZSBuZXZlciB1bm1vdW50ZWQuXG4gICAgICAhZHluYW1pY0NoaWxkcmVuLmhhc09uY2UgJiYgLy8gIzExNTM6IGZhc3QgcGF0aCBzaG91bGQgbm90IGJlIHRha2VuIGZvciBub24tc3RhYmxlICh2LWZvcikgZnJhZ21lbn
20578RzXG4gICAgICAodHlwZSAhPT0gRnJhZ21lbnQgfHwgcGF0Y2hGbGFnID4gMCAmJiBwYXRjaEZsYWcgJiA2NCkpIHtcbiAgICAgICAgdW5tb3VudENoaWxkcmVuKFxuICAgICAgICAgIGR5bmFtaWNDaGlsZHJlbixcbiAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgdHJ1ZVxuICAgICAgICApO1xuICAgICAgfSBlbHNlIGlmICh0eXBlID09PSBGcmFnbWVudCAmJiBwYXRjaEZsYWcgJiAoMTI4IHwgMjU2KSB8fCAhb3B0aW1pemVkICYmIHNoYXBlRmxhZyAmIDE2KSB7XG4gICAgICAgIHVubW91bnRDaGlsZHJlbihjaGlsZHJlbiwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSk7XG4gICAgICB9XG4gICAgICBpZiAoZG9SZW1vdmUpIHtcbiAgICAgICAgcmVtb3ZlKHZub2RlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHNob3VsZEludm9rZVZub2RlSG9vayAmJiAodm5vZGVIb29rID0gcHJvcHMgJiYgcHJvcHMub25Wbm9kZVVubW91bnRlZCkgfHwgc2hvdWxkSW52b2tlRGlycykge1xuICAgICAgcXVldWVQb3N0UmVuZGVyRWZmZWN0KCgpID0+IHtcbiAgICAgICAgdm5vZGVIb29rICYmIGludm9rZVZOb2RlSG9vayh2bm9kZUhvb2ssIHBhcmVudENvbXBvbmVudCwgdm5vZGUpO1xuICAgICAgICBzaG91bGRJbnZva2VEaXJzICYmIGludm9rZURpcmVjdGl2ZUhvb2sodm5vZGUsIG51bGwsIHBhcmVudENvbXBvbmVudCwgXCJ1bm1vdW50ZWRcIik7XG4gICAgICB9LCBwYXJlbnRTdXNwZW5zZSk7XG4gICAgfVxuICB9O1xuICBjb25zdCByZW1vdmUgPSAodm5vZGUpID0+IHtcbiAgICBjb25zdCB7IHR5cGUsIGVsLCBhbmNob3IsIHRyYW5zaXRpb24gfSA9IHZub2RlO1xuICAgIGlmICh0eXBlID09PSBGcmFnbWVudCkge1xuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgdm5vZGUucGF0Y2hGbGFnID4gMCAmJiB2bm9kZS5wYXRjaEZsYWcgJiAyMDQ4ICYmIHRyYW5zaXRpb24gJiYgIXRyYW5zaXRpb24ucGVyc2lzdGVkKSB7XG4gICAgICAgIHZub2RlLmNoaWxkcmVuLmZvckVhY2goKGNoaWxkKSA9PiB7XG4gICAgICAgICAgaWYgKGNoaWxkLnR5cGUgPT09IENvbW1lbnQpIHtcbiAgICAgICAgICAgIGhvc3RSZW1vdmUoY2hpbGQuZWwpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZW1vdmUoY2hpbGQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZW1vdmVGcmFnbWVudChlbCwgYW5jaG9yKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHR5cGUgPT09IFN0YXRpYykge1xuICAgICAgcmVtb3ZlU3RhdGljTm9kZSh2bm9kZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHBlcmZvcm1SZW1vdmUgPSAoKSA9PiB7XG4gICAgICBob3N0UmVtb3ZlKGVsKTtcbiAgICAgIGlmICh0cmFuc2l0aW9uICYmICF0cmFuc2l0aW9uLnBlcnNpc3RlZCAmJiB0cmFuc2l0aW9uLmFmdGVyTGVhdmUpIHtcbiAgICAgICAgdHJhbnNpdGlvbi5hZnRlckxlYXZlKCk7XG4gICAgICB9XG4gICAgfTtcbiAgICBpZiAodm5vZGUuc2hhcGVGbGFnICYgMSAmJiB0cmFuc2l0aW9uICYmICF0cmFuc2l0aW9uLnBlcnNpc3RlZCkge1xuICAgICAgY29uc3QgeyBsZWF2ZSwgZGVsYXlMZWF2ZSB9ID0gdHJhbnNpdGlvbjtcbiAgICAgIGNvbnN0IHBlcmZvcm1MZWF2ZSA9ICgpID0+IGxlYXZlKGVsLCBwZXJmb3JtUmVtb3ZlKTtcbiAgICAgIGlmIChkZWxheUxlYXZlKSB7XG4gICAgICAgIGRlbGF5TGVhdmUodm5vZGUuZWwsIHBlcmZvcm1SZW1vdmUsIHBlcmZvcm1MZWF2ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZXJmb3JtTGVhdmUoKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcGVyZm9ybVJlbW92ZSgpO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgcmVtb3ZlRnJhZ21lbnQgPSAoY3VyLCBlbmQpID0+IHtcbiAgICBsZXQgbmV4dDtcbiAgICB3aGlsZSAoY3VyICE9PSBlbmQpIHtcbiAgICAgIG5leHQgPSBob3N0TmV4dFNpYmxpbmcoY3VyKTtcbiAgICAgIGhvc3RSZW1vdmUoY3VyKTtcbiAgICAgIGN1ciA9IG5leHQ7XG4gICAgfVxuICAgIGhvc3RSZW1vdmUoZW5kKTtcbiAgfTtcbiAgY29uc3QgdW5tb3VudENvbXBvbmVudCA9IChpbnN0YW5jZSwgcGFyZW50U3VzcGVuc2UsIGRvUmVtb3ZlKSA9PiB7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgaW5zdGFuY2UudHlwZS5fX2htcklkKSB7XG4gICAgICB1bnJlZ2lzdGVySE1SKGluc3RhbmNlKTtcbiAgICB9XG4gICAgY29uc3QgeyBidW0sIHNjb3BlLCB1cGRhdGUsIHN1YlRyZWUsIHVtLCBtLCBhIH0gPSBpbnN0YW5jZTtcbiAgICBpbnZhbGlkYXRlTW91bnQobSk7XG4gICAgaW52YWxpZGF0ZU1vdW50KGEpO1xuICAgIGlmIChidW0pIHtcbiAgICAgIGludm9rZUFycmF5Rm5zKGJ1bSk7XG4gICAgfVxuICAgIHNjb3BlLnN0b3AoKTtcbiAgICBpZiAodXBkYXRlKSB7XG4gICAgICB1cGRhdGUuYWN0aXZlID0gZmFsc2U7XG4gICAgICB1bm1vdW50KHN1YlRyZWUsIGluc3RhbmNlLCBwYXJlbnRTdXNwZW5zZSwgZG9SZW1vdmUpO1xuICAgIH1cbiAgICBpZiAodW0pIHtcbiAgICAgIHF1ZXVlUG9zdFJlbmRlckVmZmVjdCh1bSwgcGFyZW50U3VzcGVuc2UpO1xuICAgIH1cbiAgICBxdWV1ZVBvc3RSZW5kZXJFZmZlY3QoKCkgPT4ge1xuICAgICAgaW5zdGFuY2UuaXNVbm1vdW50ZWQgPSB0cnVlO1xuICAgIH0sIHBhcmVudFN1c3BlbnNlKTtcbiAgICBpZiAocGFyZW50U3VzcGVuc2UgJiYgcGFyZW50U3VzcGVuc2UucGVuZGluZ0JyYW5jaCAmJiAhcGFyZW50U3VzcGVuc2UuaXNVbm1vdW50ZWQgJiYgaW5zdGFuY2UuYXN5bmNEZXAgJiYgIWluc3RhbmNlLmFzeW5jUmVzb2x2ZWQgJiYgaW5zdGFuY2Uuc3VzcGVuc2VJZCA9PT0gcGFyZW50U3VzcGVuc2UucGVuZGluZ0lkKSB7XG4gICAgICBwYXJlbnRTdXNwZW5zZS5kZXBzLS07XG4gICAgICBpZiAocGFyZW50U3VzcGVuc2UuZGVwcyA9PT0gMCkge1xuICAgICAgICBwYXJlbnRTdXNwZW5zZS5yZXNvbHZlKCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9k
20578dWN0aW9uXCIpIHx8IF9fVlVFX1BST0RfREVWVE9PTFNfXykge1xuICAgICAgZGV2dG9vbHNDb21wb25lbnRSZW1vdmVkKGluc3RhbmNlKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IHVubW91bnRDaGlsZHJlbiA9IChjaGlsZHJlbiwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgZG9SZW1vdmUgPSBmYWxzZSwgb3B0aW1pemVkID0gZmFsc2UsIHN0YXJ0ID0gMCkgPT4ge1xuICAgIGZvciAobGV0IGkgPSBzdGFydDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICB1bm1vdW50KGNoaWxkcmVuW2ldLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBkb1JlbW92ZSwgb3B0aW1pemVkKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IGdldE5leHRIb3N0Tm9kZSA9ICh2bm9kZSkgPT4ge1xuICAgIGlmICh2bm9kZS5zaGFwZUZsYWcgJiA2KSB7XG4gICAgICByZXR1cm4gZ2V0TmV4dEhvc3ROb2RlKHZub2RlLmNvbXBvbmVudC5zdWJUcmVlKTtcbiAgICB9XG4gICAgaWYgKHZub2RlLnNoYXBlRmxhZyAmIDEyOCkge1xuICAgICAgcmV0dXJuIHZub2RlLnN1c3BlbnNlLm5leHQoKTtcbiAgICB9XG4gICAgY29uc3QgZWwgPSBob3N0TmV4dFNpYmxpbmcodm5vZGUuYW5jaG9yIHx8IHZub2RlLmVsKTtcbiAgICBjb25zdCB0ZWxlcG9ydEVuZCA9IGVsICYmIGVsW1RlbGVwb3J0RW5kS2V5XTtcbiAgICByZXR1cm4gdGVsZXBvcnRFbmQgPyBob3N0TmV4dFNpYmxpbmcodGVsZXBvcnRFbmQpIDogZWw7XG4gIH07XG4gIGxldCBpc0ZsdXNoaW5nID0gZmFsc2U7XG4gIGNvbnN0IHJlbmRlciA9ICh2bm9kZSwgY29udGFpbmVyLCBuYW1lc3BhY2UpID0+IHtcbiAgICBpZiAodm5vZGUgPT0gbnVsbCkge1xuICAgICAgaWYgKGNvbnRhaW5lci5fdm5vZGUpIHtcbiAgICAgICAgdW5tb3VudChjb250YWluZXIuX3Zub2RlLCBudWxsLCBudWxsLCB0cnVlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcGF0Y2goXG4gICAgICAgIGNvbnRhaW5lci5fdm5vZGUgfHwgbnVsbCxcbiAgICAgICAgdm5vZGUsXG4gICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgbnVsbCxcbiAgICAgICAgbnVsbCxcbiAgICAgICAgbnVsbCxcbiAgICAgICAgbmFtZXNwYWNlXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoIWlzRmx1c2hpbmcpIHtcbiAgICAgIGlzRmx1c2hpbmcgPSB0cnVlO1xuICAgICAgZmx1c2hQcmVGbHVzaENicygpO1xuICAgICAgZmx1c2hQb3N0Rmx1c2hDYnMoKTtcbiAgICAgIGlzRmx1c2hpbmcgPSBmYWxzZTtcbiAgICB9XG4gICAgY29udGFpbmVyLl92bm9kZSA9IHZub2RlO1xuICB9O1xuICBjb25zdCBpbnRlcm5hbHMgPSB7XG4gICAgcDogcGF0Y2gsXG4gICAgdW06IHVubW91bnQsXG4gICAgbTogbW92ZSxcbiAgICByOiByZW1vdmUsXG4gICAgbXQ6IG1vdW50Q29tcG9uZW50LFxuICAgIG1jOiBtb3VudENoaWxkcmVuLFxuICAgIHBjOiBwYXRjaENoaWxkcmVuLFxuICAgIHBiYzogcGF0Y2hCbG9ja0NoaWxkcmVuLFxuICAgIG46IGdldE5leHRIb3N0Tm9kZSxcbiAgICBvOiBvcHRpb25zXG4gIH07XG4gIGxldCBoeWRyYXRlO1xuICBsZXQgaHlkcmF0ZU5vZGU7XG4gIGlmIChjcmVhdGVIeWRyYXRpb25GbnMpIHtcbiAgICBbaHlkcmF0ZSwgaHlkcmF0ZU5vZGVdID0gY3JlYXRlSHlkcmF0aW9uRm5zKFxuICAgICAgaW50ZXJuYWxzXG4gICAgKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIHJlbmRlcixcbiAgICBoeWRyYXRlLFxuICAgIGNyZWF0ZUFwcDogY3JlYXRlQXBwQVBJKHJlbmRlciwgaHlkcmF0ZSlcbiAgfTtcbn1cbmZ1bmN0aW9uIHJlc29sdmVDaGlsZHJlbk5hbWVzcGFjZSh7IHR5cGUsIHByb3BzIH0sIGN1cnJlbnROYW1lc3BhY2UpIHtcbiAgcmV0dXJuIGN1cnJlbnROYW1lc3BhY2UgPT09IFwic3ZnXCIgJiYgdHlwZSA9PT0gXCJmb3JlaWduT2JqZWN0XCIgfHwgY3VycmVudE5hbWVzcGFjZSA9PT0gXCJtYXRobWxcIiAmJiB0eXBlID09PSBcImFubm90YXRpb24teG1sXCIgJiYgcHJvcHMgJiYgcHJvcHMuZW5jb2RpbmcgJiYgcHJvcHMuZW5jb2RpbmcuaW5jbHVkZXMoXCJodG1sXCIpID8gdm9pZCAwIDogY3VycmVudE5hbWVzcGFjZTtcbn1cbmZ1bmN0aW9uIHRvZ2dsZVJlY3Vyc2UoeyBlZmZlY3QsIHVwZGF0ZSB9LCBhbGxvd2VkKSB7XG4gIGVmZmVjdC5hbGxvd1JlY3Vyc2UgPSB1cGRhdGUuYWxsb3dSZWN1cnNlID0gYWxsb3dlZDtcbn1cbmZ1bmN0aW9uIG5lZWRUcmFuc2l0aW9uKHBhcmVudFN1c3BlbnNlLCB0cmFuc2l0aW9uKSB7XG4gIHJldHVybiAoIXBhcmVudFN1c3BlbnNlIHx8IHBhcmVudFN1c3BlbnNlICYmICFwYXJlbnRTdXNwZW5zZS5wZW5kaW5nQnJhbmNoKSAmJiB0cmFuc2l0aW9uICYmICF0cmFuc2l0aW9uLnBlcnNpc3RlZDtcbn1cbmZ1bmN0aW9uIHRyYXZlcnNlU3RhdGljQ2hpbGRyZW4objEsIG4yLCBzaGFsbG93ID0gZmFsc2UpIHtcbiAgY29uc3QgY2gxID0gbjEuY2hpbGRyZW47XG4gIGNvbnN0IGNoMiA9IG4yLmNoaWxkcmVuO1xuICBpZiAoaXNBcnJheShjaDEpICYmIGlzQXJyYXkoY2gyKSkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2gxLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBjMSA9IGNoMVtpXTtcbiAgICAgIGxldCBjMiA9IGNoMltpXTtcbiAgICAgIGlmIChjMi5zaGFwZUZsYWcgJiAxICYmICFjMi5keW5hbWljQ2hpbGRyZW4pIHtcbiAgICAgICAgaWYgKGMyLnBhdGNoRmxhZyA8PSAwIHx8IGMyLnBhdGNoRmxhZyA9PT0gMzIpIHtcbiAgICAgICAgICBjMiA9IGNoMltpXSA9IGNsb25lSWZNb3VudGVkKGNoMltpXSk7XG4gICAgICAgICAgYzIuZWwgPSBjMS5lbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXNoYWxsb3cgJiYgYzIucGF0Y2hGbGFnICE9PSAtMilcbiAgICAgICAgICB0cmF2ZXJzZVN0YXRpY0NoaWxkcmVuKGMxLCBjMik7XG4gICAgICB9XG4gICAgICBpZiAoYzIudHlwZSA9PT0gVGV4dCkge1xuICAgICAgICBjMi5lbCA9IGMxLmVsO1xuICAgICAgfVxuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgYzIudHlwZSA9PT0gQ29tbWVudCAmJiAhYzIuZWwpIHtcbiAgICAgICAgYzIuZWwgPSBjMS5lbDtcbiAgICAgIH1cbiAgICB9XG4gI
20578H1cbn1cbmZ1bmN0aW9uIGdldFNlcXVlbmNlKGFycikge1xuICBjb25zdCBwID0gYXJyLnNsaWNlKCk7XG4gIGNvbnN0IHJlc3VsdCA9IFswXTtcbiAgbGV0IGksIGosIHUsIHYsIGM7XG4gIGNvbnN0IGxlbiA9IGFyci5sZW5ndGg7XG4gIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIGNvbnN0IGFyckkgPSBhcnJbaV07XG4gICAgaWYgKGFyckkgIT09IDApIHtcbiAgICAgIGogPSByZXN1bHRbcmVzdWx0Lmxlbmd0aCAtIDFdO1xuICAgICAgaWYgKGFycltqXSA8IGFyckkpIHtcbiAgICAgICAgcFtpXSA9IGo7XG4gICAgICAgIHJlc3VsdC5wdXNoKGkpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHUgPSAwO1xuICAgICAgdiA9IHJlc3VsdC5sZW5ndGggLSAxO1xuICAgICAgd2hpbGUgKHUgPCB2KSB7XG4gICAgICAgIGMgPSB1ICsgdiA+PiAxO1xuICAgICAgICBpZiAoYXJyW3Jlc3VsdFtjXV0gPCBhcnJJKSB7XG4gICAgICAgICAgdSA9IGMgKyAxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHYgPSBjO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoYXJySSA8IGFycltyZXN1bHRbdV1dKSB7XG4gICAgICAgIGlmICh1ID4gMCkge1xuICAgICAgICAgIHBbaV0gPSByZXN1bHRbdSAtIDFdO1xuICAgICAgICB9XG4gICAgICAgIHJlc3VsdFt1XSA9IGk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHUgPSByZXN1bHQubGVuZ3RoO1xuICB2ID0gcmVzdWx0W3UgLSAxXTtcbiAgd2hpbGUgKHUtLSA+IDApIHtcbiAgICByZXN1bHRbdV0gPSB2O1xuICAgIHYgPSBwW3ZdO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBsb2NhdGVOb25IeWRyYXRlZEFzeW5jUm9vdChpbnN0YW5jZSkge1xuICBjb25zdCBzdWJDb21wb25lbnQgPSBpbnN0YW5jZS5zdWJUcmVlLmNvbXBvbmVudDtcbiAgaWYgKHN1YkNvbXBvbmVudCkge1xuICAgIGlmIChzdWJDb21wb25lbnQuYXN5bmNEZXAgJiYgIXN1YkNvbXBvbmVudC5hc3luY1Jlc29sdmVkKSB7XG4gICAgICByZXR1cm4gc3ViQ29tcG9uZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbG9jYXRlTm9uSHlkcmF0ZWRBc3luY1Jvb3Qoc3ViQ29tcG9uZW50KTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGludmFsaWRhdGVNb3VudChob29rcykge1xuICBpZiAoaG9va3MpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhvb2tzLmxlbmd0aDsgaSsrKSBob29rc1tpXS5hY3RpdmUgPSBmYWxzZTtcbiAgfVxufVxuXG5jb25zdCBzc3JDb250ZXh0S2V5ID0gU3ltYm9sLmZvcihcInYtc2N4XCIpO1xuY29uc3QgdXNlU1NSQ29udGV4dCA9ICgpID0+IHtcbiAge1xuICAgIGNvbnN0IGN0eCA9IGluamVjdChzc3JDb250ZXh0S2V5KTtcbiAgICBpZiAoIWN0eCkge1xuICAgICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiB3YXJuJDEoXG4gICAgICAgIGBTZXJ2ZXIgcmVuZGVyaW5nIGNvbnRleHQgbm90IHByb3ZpZGVkLiBNYWtlIHN1cmUgdG8gb25seSBjYWxsIHVzZVNTUkNvbnRleHQoKSBjb25kaXRpb25hbGx5IGluIHRoZSBzZXJ2ZXIgYnVpbGQuYFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGN0eDtcbiAgfVxufTtcblxuZnVuY3Rpb24gd2F0Y2hFZmZlY3QoZWZmZWN0LCBvcHRpb25zKSB7XG4gIHJldHVybiBkb1dhdGNoKGVmZmVjdCwgbnVsbCwgb3B0aW9ucyk7XG59XG5mdW5jdGlvbiB3YXRjaFBvc3RFZmZlY3QoZWZmZWN0LCBvcHRpb25zKSB7XG4gIHJldHVybiBkb1dhdGNoKFxuICAgIGVmZmVjdCxcbiAgICBudWxsLFxuICAgICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBleHRlbmQoe30sIG9wdGlvbnMsIHsgZmx1c2g6IFwicG9zdFwiIH0pIDogeyBmbHVzaDogXCJwb3N0XCIgfVxuICApO1xufVxuZnVuY3Rpb24gd2F0Y2hTeW5jRWZmZWN0KGVmZmVjdCwgb3B0aW9ucykge1xuICByZXR1cm4gZG9XYXRjaChcbiAgICBlZmZlY3QsXG4gICAgbnVsbCxcbiAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8gZXh0ZW5kKHt9LCBvcHRpb25zLCB7IGZsdXNoOiBcInN5bmNcIiB9KSA6IHsgZmx1c2g6IFwic3luY1wiIH1cbiAgKTtcbn1cbmNvbnN0IElOSVRJQUxfV0FUQ0hFUl9WQUxVRSA9IHt9O1xuZnVuY3Rpb24gd2F0Y2goc291cmNlLCBjYiwgb3B0aW9ucykge1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAhaXNGdW5jdGlvbihjYikpIHtcbiAgICB3YXJuJDEoXG4gICAgICBgXFxgd2F0Y2goZm4sIG9wdGlvbnM/KVxcYCBzaWduYXR1cmUgaGFzIGJlZW4gbW92ZWQgdG8gYSBzZXBhcmF0ZSBBUEkuIFVzZSBcXGB3YXRjaEVmZmVjdChmbiwgb3B0aW9ucz8pXFxgIGluc3RlYWQuIFxcYHdhdGNoXFxgIG5vdyBvbmx5IHN1cHBvcnRzIFxcYHdhdGNoKHNvdXJjZSwgY2IsIG9wdGlvbnM/KSBzaWduYXR1cmUuYFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIGRvV2F0Y2goc291cmNlLCBjYiwgb3B0aW9ucyk7XG59XG5mdW5jdGlvbiBkb1dhdGNoKHNvdXJjZSwgY2IsIHtcbiAgaW1tZWRpYXRlLFxuICBkZWVwLFxuICBmbHVzaCxcbiAgb25jZSxcbiAgb25UcmFjayxcbiAgb25UcmlnZ2VyXG59ID0gRU1QVFlfT0JKKSB7XG4gIGlmIChjYiAmJiBvbmNlKSB7XG4gICAgY29uc3QgX2NiID0gY2I7XG4gICAgY2IgPSAoLi4uYXJncykgPT4ge1xuICAgICAgX2NiKC4uLmFyZ3MpO1xuICAgICAgdW53YXRjaCgpO1xuICAgIH07XG4gIH1cbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgZGVlcCAhPT0gdm9pZCAwICYmIHR5cGVvZiBkZWVwID09PSBcIm51bWJlclwiKSB7XG4gICAgd2FybiQxKFxuICAgICAgYHdhdGNoKCkgXCJkZWVwXCIgb3B0aW9uIHdpdGggbnVtYmVyIHZhbHVlIHdpbGwgYmUgdXNlZCBhcyB3YXRjaCBkZXB0aCBpbiBmdXR1cmUgdmVyc2lvbnMuIFBsZWFzZSB1c2UgYSBib29sZWFuIGluc3RlYWQgdG8gYXZvaWQgcG90ZW50aWFsIGJyZWFrYWdlLmBcbiAgICApO1xuICB9XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9k
20578dWN0aW9uXCIpICYmICFjYikge1xuICAgIGlmIChpbW1lZGlhdGUgIT09IHZvaWQgMCkge1xuICAgICAgd2FybiQxKFxuICAgICAgICBgd2F0Y2goKSBcImltbWVkaWF0ZVwiIG9wdGlvbiBpcyBvbmx5IHJlc3BlY3RlZCB3aGVuIHVzaW5nIHRoZSB3YXRjaChzb3VyY2UsIGNhbGxiYWNrLCBvcHRpb25zPykgc2lnbmF0dXJlLmBcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChkZWVwICE9PSB2b2lkIDApIHtcbiAgICAgIHdhcm4kMShcbiAgICAgICAgYHdhdGNoKCkgXCJkZWVwXCIgb3B0aW9uIGlzIG9ubHkgcmVzcGVjdGVkIHdoZW4gdXNpbmcgdGhlIHdhdGNoKHNvdXJjZSwgY2FsbGJhY2ssIG9wdGlvbnM/KSBzaWduYXR1cmUuYFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKG9uY2UgIT09IHZvaWQgMCkge1xuICAgICAgd2FybiQxKFxuICAgICAgICBgd2F0Y2goKSBcIm9uY2VcIiBvcHRpb24gaXMgb25seSByZXNwZWN0ZWQgd2hlbiB1c2luZyB0aGUgd2F0Y2goc291cmNlLCBjYWxsYmFjaywgb3B0aW9ucz8pIHNpZ25hdHVyZS5gXG4gICAgICApO1xuICAgIH1cbiAgfVxuICBjb25zdCB3YXJuSW52YWxpZFNvdXJjZSA9IChzKSA9PiB7XG4gICAgd2FybiQxKFxuICAgICAgYEludmFsaWQgd2F0Y2ggc291cmNlOiBgLFxuICAgICAgcyxcbiAgICAgIGBBIHdhdGNoIHNvdXJjZSBjYW4gb25seSBiZSBhIGdldHRlci9lZmZlY3QgZnVuY3Rpb24sIGEgcmVmLCBhIHJlYWN0aXZlIG9iamVjdCwgb3IgYW4gYXJyYXkgb2YgdGhlc2UgdHlwZXMuYFxuICAgICk7XG4gIH07XG4gIGNvbnN0IGluc3RhbmNlID0gY3VycmVudEluc3RhbmNlO1xuICBjb25zdCByZWFjdGl2ZUdldHRlciA9IChzb3VyY2UyKSA9PiBkZWVwID09PSB0cnVlID8gc291cmNlMiA6IChcbiAgICAvLyBmb3IgZGVlcDogZmFsc2UsIG9ubHkgdHJhdmVyc2Ugcm9vdC1sZXZlbCBwcm9wZXJ0aWVzXG4gICAgdHJhdmVyc2Uoc291cmNlMiwgZGVlcCA9PT0gZmFsc2UgPyAxIDogdm9pZCAwKVxuICApO1xuICBsZXQgZ2V0dGVyO1xuICBsZXQgZm9yY2VUcmlnZ2VyID0gZmFsc2U7XG4gIGxldCBpc011bHRpU291cmNlID0gZmFsc2U7XG4gIGlmIChpc1JlZihzb3VyY2UpKSB7XG4gICAgZ2V0dGVyID0gKCkgPT4gc291cmNlLnZhbHVlO1xuICAgIGZvcmNlVHJpZ2dlciA9IGlzU2hhbGxvdyhzb3VyY2UpO1xuICB9IGVsc2UgaWYgKGlzUmVhY3RpdmUoc291cmNlKSkge1xuICAgIGdldHRlciA9ICgpID0+IHJlYWN0aXZlR2V0dGVyKHNvdXJjZSk7XG4gICAgZm9yY2VUcmlnZ2VyID0gdHJ1ZTtcbiAgfSBlbHNlIGlmIChpc0FycmF5KHNvdXJjZSkpIHtcbiAgICBpc011bHRpU291cmNlID0gdHJ1ZTtcbiAgICBmb3JjZVRyaWdnZXIgPSBzb3VyY2Uuc29tZSgocykgPT4gaXNSZWFjdGl2ZShzKSB8fCBpc1NoYWxsb3cocykpO1xuICAgIGdldHRlciA9ICgpID0+IHNvdXJjZS5tYXAoKHMpID0+IHtcbiAgICAgIGlmIChpc1JlZihzKSkge1xuICAgICAgICByZXR1cm4gcy52YWx1ZTtcbiAgICAgIH0gZWxzZSBpZiAoaXNSZWFjdGl2ZShzKSkge1xuICAgICAgICByZXR1cm4gcmVhY3RpdmVHZXR0ZXIocyk7XG4gICAgICB9IGVsc2UgaWYgKGlzRnVuY3Rpb24ocykpIHtcbiAgICAgICAgcmV0dXJuIGNhbGxXaXRoRXJyb3JIYW5kbGluZyhzLCBpbnN0YW5jZSwgMik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHdhcm5JbnZhbGlkU291cmNlKHMpO1xuICAgICAgfVxuICAgIH0pO1xuICB9IGVsc2UgaWYgKGlzRnVuY3Rpb24oc291cmNlKSkge1xuICAgIGlmIChjYikge1xuICAgICAgZ2V0dGVyID0gKCkgPT4gY2FsbFdpdGhFcnJvckhhbmRsaW5nKHNvdXJjZSwgaW5zdGFuY2UsIDIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBnZXR0ZXIgPSAoKSA9PiB7XG4gICAgICAgIGlmIChjbGVhbnVwKSB7XG4gICAgICAgICAgY2xlYW51cCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjYWxsV2l0aEFzeW5jRXJyb3JIYW5kbGluZyhcbiAgICAgICAgICBzb3VyY2UsXG4gICAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgICAgMyxcbiAgICAgICAgICBbb25DbGVhbnVwXVxuICAgICAgICApO1xuICAgICAgfTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZ2V0dGVyID0gTk9PUDtcbiAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHdhcm5JbnZhbGlkU291cmNlKHNvdXJjZSk7XG4gIH1cbiAgaWYgKGNiICYmIGRlZXApIHtcbiAgICBjb25zdCBiYXNlR2V0dGVyID0gZ2V0dGVyO1xuICAgIGdldHRlciA9ICgpID0+IHRyYXZlcnNlKGJhc2VHZXR0ZXIoKSk7XG4gIH1cbiAgbGV0IGNsZWFudXA7XG4gIGxldCBvbkNsZWFudXAgPSAoZm4pID0+IHtcbiAgICBjbGVhbnVwID0gZWZmZWN0Lm9uU3RvcCA9ICgpID0+IHtcbiAgICAgIGNhbGxXaXRoRXJyb3JIYW5kbGluZyhmbiwgaW5zdGFuY2UsIDQpO1xuICAgICAgY2xlYW51cCA9IGVmZmVjdC5vblN0b3AgPSB2b2lkIDA7XG4gICAgfTtcbiAgfTtcbiAgbGV0IHNzckNsZWFudXA7XG4gIGlmIChpc0luU1NSQ29tcG9uZW50U2V0dXApIHtcbiAgICBvbkNsZWFudXAgPSBOT09QO1xuICAgIGlmICghY2IpIHtcbiAgICAgIGdldHRlcigpO1xuICAgIH0gZWxzZSBpZiAoaW1tZWRpYXRlKSB7XG4gICAgICBjYWxsV2l0aEFzeW5jRXJyb3JIYW5kbGluZyhjYiwgaW5zdGFuY2UsIDMsIFtcbiAgICAgICAgZ2V0dGVyKCksXG4gICAgICAgIGlzTXVsdGlTb3VyY2UgPyBbXSA6IHZvaWQgMCxcbiAgICAgICAgb25DbGVhbnVwXG4gICAgICBdKTtcbiAgICB9XG4gICAgaWYgKGZsdXNoID09PSBcInN5bmNcIikge1xuICAgICAgY29uc3QgY3R4ID0gdXNlU1NSQ29udGV4dCgpO1xuICAgICAgc3NyQ2xlYW51cCA9IGN0eC5fX3dhdGNoZXJIYW5kbGVzIHx8IChjdHguX193YXRjaGVySGFuZGxlcyA9IFtdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIE5PT1A7XG4gICAgfVxuICB9XG4gIGxldCBvbGRWYWx1ZSA9IGlzTXVsdGlTb3VyY2UgPyBuZXcgQXJyYXkoc291cmNlLmxlbmd0aCkuZmlsbChJTklUSUFMX1dBVENIRVJfVkFMVUUpIDogSU5JVElBTF9XQVRDSEVSX1ZBTFVFO1xuICBjb25zdCBqb2IgPSAoKSA9PiB7XG4gICAgaWYgKCFlZmZlY3QuYWN0aXZlIHx8ICFlZmZlY3QuZGlydHkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGNiKSB7XG4gICAgICBjb25zdCBuZXdWYWx1ZSA9IGVmZmVjdC5ydW4oKTtcbiAgICAgIGlmIChkZWVwIHx8IGZvcmNlVHJpZ2dlciB8fCAoaXNNdWx0aVNvdXJjZSA/IG5ld1ZhbHVlLnNvbWUoKHYsIGkpID0+IGhhc0NoYW5nZWQodiwgb2xkVmFsdWVbaV0pKSA6IGhhc0NoYW5nZWQobmV3VmFsdWUsIG9sZFZhbHVlKSkgfHwgZmFsc2UpIHtcbiAgICAgICAgaWYgKGNsZWFudXApIHtcbiAgICAgICAgICBjbGVhbnVwKCk7XG4gICAgICAgI
20578H1cbiAgICAgICAgY2FsbFdpdGhBc3luY0Vycm9ySGFuZGxpbmcoY2IsIGluc3RhbmNlLCAzLCBbXG4gICAgICAgICAgbmV3VmFsdWUsXG4gICAgICAgICAgLy8gcGFzcyB1bmRlZmluZWQgYXMgdGhlIG9sZCB2YWx1ZSB3aGVuIGl0J3MgY2hhbmdlZCBmb3IgdGhlIGZpcnN0IHRpbWVcbiAgICAgICAgICBvbGRWYWx1ZSA9PT0gSU5JVElBTF9XQVRDSEVSX1ZBTFVFID8gdm9pZCAwIDogaXNNdWx0aVNvdXJjZSAmJiBvbGRWYWx1ZVswXSA9PT0gSU5JVElBTF9XQVRDSEVSX1ZBTFVFID8gW10gOiBvbGRWYWx1ZSxcbiAgICAgICAgICBvbkNsZWFudXBcbiAgICAgICAgXSk7XG4gICAgICAgIG9sZFZhbHVlID0gbmV3VmFsdWU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGVmZmVjdC5ydW4oKTtcbiAgICB9XG4gIH07XG4gIGpvYi5hbGxvd1JlY3Vyc2UgPSAhIWNiO1xuICBsZXQgc2NoZWR1bGVyO1xuICBpZiAoZmx1c2ggPT09IFwic3luY1wiKSB7XG4gICAgc2NoZWR1bGVyID0gam9iO1xuICB9IGVsc2UgaWYgKGZsdXNoID09PSBcInBvc3RcIikge1xuICAgIHNjaGVkdWxlciA9ICgpID0+IHF1ZXVlUG9zdFJlbmRlckVmZmVjdChqb2IsIGluc3RhbmNlICYmIGluc3RhbmNlLnN1c3BlbnNlKTtcbiAgfSBlbHNlIHtcbiAgICBqb2IucHJlID0gdHJ1ZTtcbiAgICBpZiAoaW5zdGFuY2UpIGpvYi5pZCA9IGluc3RhbmNlLnVpZDtcbiAgICBzY2hlZHVsZXIgPSAoKSA9PiBxdWV1ZUpvYihqb2IpO1xuICB9XG4gIGNvbnN0IGVmZmVjdCA9IG5ldyBSZWFjdGl2ZUVmZmVjdChnZXR0ZXIsIE5PT1AsIHNjaGVkdWxlcik7XG4gIGNvbnN0IHNjb3BlID0gZ2V0Q3VycmVudFNjb3BlKCk7XG4gIGNvbnN0IHVud2F0Y2ggPSAoKSA9PiB7XG4gICAgZWZmZWN0LnN0b3AoKTtcbiAgICBpZiAoc2NvcGUpIHtcbiAgICAgIHJlbW92ZShzY29wZS5lZmZlY3RzLCBlZmZlY3QpO1xuICAgIH1cbiAgfTtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICBlZmZlY3Qub25UcmFjayA9IG9uVHJhY2s7XG4gICAgZWZmZWN0Lm9uVHJpZ2dlciA9IG9uVHJpZ2dlcjtcbiAgfVxuICBpZiAoY2IpIHtcbiAgICBpZiAoaW1tZWRpYXRlKSB7XG4gICAgICBqb2IoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb2xkVmFsdWUgPSBlZmZlY3QucnVuKCk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGZsdXNoID09PSBcInBvc3RcIikge1xuICAgIHF1ZXVlUG9zdFJlbmRlckVmZmVjdChcbiAgICAgIGVmZmVjdC5ydW4uYmluZChlZmZlY3QpLFxuICAgICAgaW5zdGFuY2UgJiYgaW5zdGFuY2Uuc3VzcGVuc2VcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIGVmZmVjdC5ydW4oKTtcbiAgfVxuICBpZiAoc3NyQ2xlYW51cCkgc3NyQ2xlYW51cC5wdXNoKHVud2F0Y2gpO1xuICByZXR1cm4gdW53YXRjaDtcbn1cbmZ1bmN0aW9uIGluc3RhbmNlV2F0Y2goc291cmNlLCB2YWx1ZSwgb3B0aW9ucykge1xuICBjb25zdCBwdWJsaWNUaGlzID0gdGhpcy5wcm94eTtcbiAgY29uc3QgZ2V0dGVyID0gaXNTdHJpbmcoc291cmNlKSA/IHNvdXJjZS5pbmNsdWRlcyhcIi5cIikgPyBjcmVhdGVQYXRoR2V0dGVyKHB1YmxpY1RoaXMsIHNvdXJjZSkgOiAoKSA9PiBwdWJsaWNUaGlzW3NvdXJjZV0gOiBzb3VyY2UuYmluZChwdWJsaWNUaGlzLCBwdWJsaWNUaGlzKTtcbiAgbGV0IGNiO1xuICBpZiAoaXNGdW5jdGlvbih2YWx1ZSkpIHtcbiAgICBjYiA9IHZhbHVlO1xuICB9IGVsc2Uge1xuICAgIGNiID0gdmFsdWUuaGFuZGxlcjtcbiAgICBvcHRpb25zID0gdmFsdWU7XG4gIH1cbiAgY29uc3QgcmVzZXQgPSBzZXRDdXJyZW50SW5zdGFuY2UodGhpcyk7XG4gIGNvbnN0IHJlcyA9IGRvV2F0Y2goZ2V0dGVyLCBjYi5iaW5kKHB1YmxpY1RoaXMpLCBvcHRpb25zKTtcbiAgcmVzZXQoKTtcbiAgcmV0dXJuIHJlcztcbn1cbmZ1bmN0aW9uIGNyZWF0ZVBhdGhHZXR0ZXIoY3R4LCBwYXRoKSB7XG4gIGNvbnN0IHNlZ21lbnRzID0gcGF0aC5zcGxpdChcIi5cIik7XG4gIHJldHVybiAoKSA9PiB7XG4gICAgbGV0IGN1ciA9IGN0eDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNlZ21lbnRzLmxlbmd0aCAmJiBjdXI7IGkrKykge1xuICAgICAgY3VyID0gY3VyW3NlZ21lbnRzW2ldXTtcbiAgICB9XG4gICAgcmV0dXJuIGN1cjtcbiAgfTtcbn1cbmZ1bmN0aW9uIHRyYXZlcnNlKHZhbHVlLCBkZXB0aCA9IEluZmluaXR5LCBzZWVuKSB7XG4gIGlmIChkZXB0aCA8PSAwIHx8ICFpc09iamVjdCh2YWx1ZSkgfHwgdmFsdWVbXCJfX3Zfc2tpcFwiXSkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBzZWVuID0gc2VlbiB8fCAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuICBpZiAoc2Vlbi5oYXModmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIHNlZW4uYWRkKHZhbHVlKTtcbiAgZGVwdGgtLTtcbiAgaWYgKGlzUmVmKHZhbHVlKSkge1xuICAgIHRyYXZlcnNlKHZhbHVlLnZhbHVlLCBkZXB0aCwgc2Vlbik7XG4gIH0gZWxzZSBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0cmF2ZXJzZSh2YWx1ZVtpXSwgZGVwdGgsIHNlZW4pO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc1NldCh2YWx1ZSkgfHwgaXNNYXAodmFsdWUpKSB7XG4gICAgdmFsdWUuZm9yRWFjaCgodikgPT4ge1xuICAgICAgdHJhdmVyc2UodiwgZGVwdGgsIHNlZW4pO1xuICAgIH0pO1xuICB9IGVsc2UgaWYgKGlzUGxhaW5PYmplY3QodmFsdWUpKSB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gdmFsdWUpIHtcbiAgICAgIHRyYXZlcnNlKHZhbHVlW2tleV0sIGRlcHRoLCBzZWVuKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyh2YWx1ZSkpIHtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwodmFsdWUsIGtleSkpIHtcbiAgICAgICAgdHJhdmVyc2UodmFsdWVba2V5XSwgZGVwdGgsIHNlZW4pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIHVzZU1vZGVsKHByb3BzLCBuYW1lLCBvcHRpb25zID0gRU1QVFlfT0JKKSB7XG4gIGNvbnN0IGkgPSBnZXRDdXJyZW50SW5zdGFuY2UoKTtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgIWkpIHtcbiAgICB3YXJuJDEoYHVzZU1vZGVsKCkgY2FsbGVkIHdpdGhvdXQgYWN0aXZlIGluc3RhbmNlLmApO1xuICAgIHJldHVybi
20578ByZWYoKTtcbiAgfVxuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAhaS5wcm9wc09wdGlvbnNbMF1bbmFtZV0pIHtcbiAgICB3YXJuJDEoYHVzZU1vZGVsKCkgY2FsbGVkIHdpdGggcHJvcCBcIiR7bmFtZX1cIiB3aGljaCBpcyBub3QgZGVjbGFyZWQuYCk7XG4gICAgcmV0dXJuIHJlZigpO1xuICB9XG4gIGNvbnN0IGNhbWVsaXplZE5hbWUgPSBjYW1lbGl6ZShuYW1lKTtcbiAgY29uc3QgaHlwaGVuYXRlZE5hbWUgPSBoeXBoZW5hdGUobmFtZSk7XG4gIGNvbnN0IG1vZGlmaWVycyA9IGdldE1vZGVsTW9kaWZpZXJzKHByb3BzLCBuYW1lKTtcbiAgY29uc3QgcmVzID0gY3VzdG9tUmVmKCh0cmFjaywgdHJpZ2dlcikgPT4ge1xuICAgIGxldCBsb2NhbFZhbHVlO1xuICAgIGxldCBwcmV2U2V0VmFsdWUgPSBFTVBUWV9PQko7XG4gICAgbGV0IHByZXZFbWl0dGVkVmFsdWU7XG4gICAgd2F0Y2hTeW5jRWZmZWN0KCgpID0+IHtcbiAgICAgIGNvbnN0IHByb3BWYWx1ZSA9IHByb3BzW25hbWVdO1xuICAgICAgaWYgKGhhc0NoYW5nZWQobG9jYWxWYWx1ZSwgcHJvcFZhbHVlKSkge1xuICAgICAgICBsb2NhbFZhbHVlID0gcHJvcFZhbHVlO1xuICAgICAgICB0cmlnZ2VyKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGdldCgpIHtcbiAgICAgICAgdHJhY2soKTtcbiAgICAgICAgcmV0dXJuIG9wdGlvbnMuZ2V0ID8gb3B0aW9ucy5nZXQobG9jYWxWYWx1ZSkgOiBsb2NhbFZhbHVlO1xuICAgICAgfSxcbiAgICAgIHNldCh2YWx1ZSkge1xuICAgICAgICBpZiAoIWhhc0NoYW5nZWQodmFsdWUsIGxvY2FsVmFsdWUpICYmICEocHJldlNldFZhbHVlICE9PSBFTVBUWV9PQkogJiYgaGFzQ2hhbmdlZCh2YWx1ZSwgcHJldlNldFZhbHVlKSkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmF3UHJvcHMgPSBpLnZub2RlLnByb3BzO1xuICAgICAgICBpZiAoIShyYXdQcm9wcyAmJiAvLyBjaGVjayBpZiBwYXJlbnQgaGFzIHBhc3NlZCB2LW1vZGVsXG4gICAgICAgIChuYW1lIGluIHJhd1Byb3BzIHx8IGNhbWVsaXplZE5hbWUgaW4gcmF3UHJvcHMgfHwgaHlwaGVuYXRlZE5hbWUgaW4gcmF3UHJvcHMpICYmIChgb25VcGRhdGU6JHtuYW1lfWAgaW4gcmF3UHJvcHMgfHwgYG9uVXBkYXRlOiR7Y2FtZWxpemVkTmFtZX1gIGluIHJhd1Byb3BzIHx8IGBvblVwZGF0ZToke2h5cGhlbmF0ZWROYW1lfWAgaW4gcmF3UHJvcHMpKSkge1xuICAgICAgICAgIGxvY2FsVmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICB0cmlnZ2VyKCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZW1pdHRlZFZhbHVlID0gb3B0aW9ucy5zZXQgPyBvcHRpb25zLnNldCh2YWx1ZSkgOiB2YWx1ZTtcbiAgICAgICAgaS5lbWl0KGB1cGRhdGU6JHtuYW1lfWAsIGVtaXR0ZWRWYWx1ZSk7XG4gICAgICAgIGlmIChoYXNDaGFuZ2VkKHZhbHVlLCBlbWl0dGVkVmFsdWUpICYmIGhhc0NoYW5nZWQodmFsdWUsIHByZXZTZXRWYWx1ZSkgJiYgIWhhc0NoYW5nZWQoZW1pdHRlZFZhbHVlLCBwcmV2RW1pdHRlZFZhbHVlKSkge1xuICAgICAgICAgIHRyaWdnZXIoKTtcbiAgICAgICAgfVxuICAgICAgICBwcmV2U2V0VmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgcHJldkVtaXR0ZWRWYWx1ZSA9IGVtaXR0ZWRWYWx1ZTtcbiAgICAgIH1cbiAgICB9O1xuICB9KTtcbiAgcmVzW1N5bWJvbC5pdGVyYXRvcl0gPSAoKSA9PiB7XG4gICAgbGV0IGkyID0gMDtcbiAgICByZXR1cm4ge1xuICAgICAgbmV4dCgpIHtcbiAgICAgICAgaWYgKGkyIDwgMikge1xuICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBpMisrID8gbW9kaWZpZXJzIHx8IEVNUFRZX09CSiA6IHJlcywgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4geyBkb25lOiB0cnVlIH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9O1xuICByZXR1cm4gcmVzO1xufVxuY29uc3QgZ2V0TW9kZWxNb2RpZmllcnMgPSAocHJvcHMsIG1vZGVsTmFtZSkgPT4ge1xuICByZXR1cm4gbW9kZWxOYW1lID09PSBcIm1vZGVsVmFsdWVcIiB8fCBtb2RlbE5hbWUgPT09IFwibW9kZWwtdmFsdWVcIiA/IHByb3BzLm1vZGVsTW9kaWZpZXJzIDogcHJvcHNbYCR7bW9kZWxOYW1lfU1vZGlmaWVyc2BdIHx8IHByb3BzW2Ake2NhbWVsaXplKG1vZGVsTmFtZSl9TW9kaWZpZXJzYF0gfHwgcHJvcHNbYCR7aHlwaGVuYXRlKG1vZGVsTmFtZSl9TW9kaWZpZXJzYF07XG59O1xuXG5mdW5jdGlvbiBlbWl0KGluc3RhbmNlLCBldmVudCwgLi4ucmF3QXJncykge1xuICBpZiAoaW5zdGFuY2UuaXNVbm1vdW50ZWQpIHJldHVybjtcbiAgY29uc3QgcHJvcHMgPSBpbnN0YW5jZS52bm9kZS5wcm9wcyB8fCBFTVBUWV9PQko7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgY29uc3Qge1xuICAgICAgZW1pdHNPcHRpb25zLFxuICAgICAgcHJvcHNPcHRpb25zOiBbcHJvcHNPcHRpb25zXVxuICAgIH0gPSBpbnN0YW5jZTtcbiAgICBpZiAoZW1pdHNPcHRpb25zKSB7XG4gICAgICBpZiAoIShldmVudCBpbiBlbWl0c09wdGlvbnMpICYmIHRydWUpIHtcbiAgICAgICAgaWYgKCFwcm9wc09wdGlvbnMgfHwgISh0b0hhbmRsZXJLZXkoZXZlbnQpIGluIHByb3BzT3B0aW9ucykpIHtcbiAgICAgICAgICB3YXJuJDEoXG4gICAgICAgICAgICBgQ29tcG9uZW50IGVtaXR0ZWQgZXZlbnQgXCIke2V2ZW50fVwiIGJ1dCBpdCBpcyBuZWl0aGVyIGRlY2xhcmVkIGluIHRoZSBlbWl0cyBvcHRpb24gbm9yIGFzIGFuIFwiJHt0b0hhbmRsZXJLZXkoZXZlbnQpfVwiIHByb3AuYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRvciA9IGVtaXRzT3B0aW9uc1tldmVudF07XG4gICAgICAgIGlmIChpc0Z1bmN0aW9uKHZhbGlkYXRvcikpIHtcbiAgICAgICAgICBjb25zdCBpc1ZhbGlkID0gdmFsaWRhdG9yKC4uLnJhd0FyZ3MpO1xuICAgICAgICAgIGlmICghaXNWYWxpZCkge1xuICAgICAgICAgICAgd2FybiQxKFxuICAgICAgICAgICAgICBgSW52YWxpZCBldmVudCBhcmd1bWVudHM6IGV2ZW50IHZhbGlkYXRpb24gZmFpbGVkIGZvciBldmVudCBcIiR7ZXZlbnR9XCIuYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgI
20578H1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgbGV0IGFyZ3MgPSByYXdBcmdzO1xuICBjb25zdCBpc01vZGVsTGlzdGVuZXIgPSBldmVudC5zdGFydHNXaXRoKFwidXBkYXRlOlwiKTtcbiAgY29uc3QgbW9kaWZpZXJzID0gaXNNb2RlbExpc3RlbmVyICYmIGdldE1vZGVsTW9kaWZpZXJzKHByb3BzLCBldmVudC5zbGljZSg3KSk7XG4gIGlmIChtb2RpZmllcnMpIHtcbiAgICBpZiAobW9kaWZpZXJzLnRyaW0pIHtcbiAgICAgIGFyZ3MgPSByYXdBcmdzLm1hcCgoYSkgPT4gaXNTdHJpbmcoYSkgPyBhLnRyaW0oKSA6IGEpO1xuICAgIH1cbiAgICBpZiAobW9kaWZpZXJzLm51bWJlcikge1xuICAgICAgYXJncyA9IHJhd0FyZ3MubWFwKGxvb3NlVG9OdW1iZXIpO1xuICAgIH1cbiAgfVxuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCBfX1ZVRV9QUk9EX0RFVlRPT0xTX18pIHtcbiAgICBkZXZ0b29sc0NvbXBvbmVudEVtaXQoaW5zdGFuY2UsIGV2ZW50LCBhcmdzKTtcbiAgfVxuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIGNvbnN0IGxvd2VyQ2FzZUV2ZW50ID0gZXZlbnQudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAobG93ZXJDYXNlRXZlbnQgIT09IGV2ZW50ICYmIHByb3BzW3RvSGFuZGxlcktleShsb3dlckNhc2VFdmVudCldKSB7XG4gICAgICB3YXJuJDEoXG4gICAgICAgIGBFdmVudCBcIiR7bG93ZXJDYXNlRXZlbnR9XCIgaXMgZW1pdHRlZCBpbiBjb21wb25lbnQgJHtmb3JtYXRDb21wb25lbnROYW1lKFxuICAgICAgICAgIGluc3RhbmNlLFxuICAgICAgICAgIGluc3RhbmNlLnR5cGVcbiAgICAgICAgKX0gYnV0IHRoZSBoYW5kbGVyIGlzIHJlZ2lzdGVyZWQgZm9yIFwiJHtldmVudH1cIi4gTm90ZSB0aGF0IEhUTUwgYXR0cmlidXRlcyBhcmUgY2FzZS1pbnNlbnNpdGl2ZSBhbmQgeW91IGNhbm5vdCB1c2Ugdi1vbiB0byBsaXN0ZW4gdG8gY2FtZWxDYXNlIGV2ZW50cyB3aGVuIHVzaW5nIGluLURPTSB0ZW1wbGF0ZXMuIFlvdSBzaG91bGQgcHJvYmFibHkgdXNlIFwiJHtoeXBoZW5hdGUoXG4gICAgICAgICAgZXZlbnRcbiAgICAgICAgKX1cIiBpbnN0ZWFkIG9mIFwiJHtldmVudH1cIi5gXG4gICAgICApO1xuICAgIH1cbiAgfVxuICBsZXQgaGFuZGxlck5hbWU7XG4gIGxldCBoYW5kbGVyID0gcHJvcHNbaGFuZGxlck5hbWUgPSB0b0hhbmRsZXJLZXkoZXZlbnQpXSB8fCAvLyBhbHNvIHRyeSBjYW1lbENhc2UgZXZlbnQgaGFuZGxlciAoIzIyNDkpXG4gIHByb3BzW2hhbmRsZXJOYW1lID0gdG9IYW5kbGVyS2V5KGNhbWVsaXplKGV2ZW50KSldO1xuICBpZiAoIWhhbmRsZXIgJiYgaXNNb2RlbExpc3RlbmVyKSB7XG4gICAgaGFuZGxlciA9IHByb3BzW2hhbmRsZXJOYW1lID0gdG9IYW5kbGVyS2V5KGh5cGhlbmF0ZShldmVudCkpXTtcbiAgfVxuICBpZiAoaGFuZGxlcikge1xuICAgIGNhbGxXaXRoQXN5bmNFcnJvckhhbmRsaW5nKFxuICAgICAgaGFuZGxlcixcbiAgICAgIGluc3RhbmNlLFxuICAgICAgNixcbiAgICAgIGFyZ3NcbiAgICApO1xuICB9XG4gIGNvbnN0IG9uY2VIYW5kbGVyID0gcHJvcHNbaGFuZGxlck5hbWUgKyBgT25jZWBdO1xuICBpZiAob25jZUhhbmRsZXIpIHtcbiAgICBpZiAoIWluc3RhbmNlLmVtaXR0ZWQpIHtcbiAgICAgIGluc3RhbmNlLmVtaXR0ZWQgPSB7fTtcbiAgICB9IGVsc2UgaWYgKGluc3RhbmNlLmVtaXR0ZWRbaGFuZGxlck5hbWVdKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGluc3RhbmNlLmVtaXR0ZWRbaGFuZGxlck5hbWVdID0gdHJ1ZTtcbiAgICBjYWxsV2l0aEFzeW5jRXJyb3JIYW5kbGluZyhcbiAgICAgIG9uY2VIYW5kbGVyLFxuICAgICAgaW5zdGFuY2UsXG4gICAgICA2LFxuICAgICAgYXJnc1xuICAgICk7XG4gIH1cbn1cbmZ1bmN0aW9uIG5vcm1hbGl6ZUVtaXRzT3B0aW9ucyhjb21wLCBhcHBDb250ZXh0LCBhc01peGluID0gZmFsc2UpIHtcbiAgY29uc3QgY2FjaGUgPSBhcHBDb250ZXh0LmVtaXRzQ2FjaGU7XG4gIGNvbnN0IGNhY2hlZCA9IGNhY2hlLmdldChjb21wKTtcbiAgaWYgKGNhY2hlZCAhPT0gdm9pZCAwKSB7XG4gICAgcmV0dXJuIGNhY2hlZDtcbiAgfVxuICBjb25zdCByYXcgPSBjb21wLmVtaXRzO1xuICBsZXQgbm9ybWFsaXplZCA9IHt9O1xuICBsZXQgaGFzRXh0ZW5kcyA9IGZhbHNlO1xuICBpZiAoX19WVUVfT1BUSU9OU19BUElfXyAmJiAhaXNGdW5jdGlvbihjb21wKSkge1xuICAgIGNvbnN0IGV4dGVuZEVtaXRzID0gKHJhdzIpID0+IHtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRGcm9tRXh0ZW5kID0gbm9ybWFsaXplRW1pdHNPcHRpb25zKHJhdzIsIGFwcENvbnRleHQsIHRydWUpO1xuICAgICAgaWYgKG5vcm1hbGl6ZWRGcm9tRXh0ZW5kKSB7XG4gICAgICAgIGhhc0V4dGVuZHMgPSB0cnVlO1xuICAgICAgICBleHRlbmQobm9ybWFsaXplZCwgbm9ybWFsaXplZEZyb21FeHRlbmQpO1xuICAgICAgfVxuICAgIH07XG4gICAgaWYgKCFhc01peGluICYmIGFwcENvbnRleHQubWl4aW5zLmxlbmd0aCkge1xuICAgICAgYXBwQ29udGV4dC5taXhpbnMuZm9yRWFjaChleHRlbmRFbWl0cyk7XG4gICAgfVxuICAgIGlmIChjb21wLmV4dGVuZHMpIHtcbiAgICAgIGV4dGVuZEVtaXRzKGNvbXAuZXh0ZW5kcyk7XG4gICAgfVxuICAgIGlmIChjb21wLm1peGlucykge1xuICAgICAgY29tcC5taXhpbnMuZm9yRWFjaChleHRlbmRFbWl0cyk7XG4gICAgfVxuICB9XG4gIGlmICghcmF3ICYmICFoYXNFeHRlbmRzKSB7XG4gICAgaWYgKGlzT2JqZWN0KGNvbXApKSB7XG4gICAgICBjYWNoZS5zZXQoY29tcCwgbnVsbCk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGlmIChpc0FycmF5KHJhdykpIHtcbiAgICByYXcuZm9yRWFjaCgoa2V5KSA9PiBub3JtYWxpemVkW2tleV0gPSBudWxsKTtcbiAgfSBlbHNlIHtcbiAgICBleHRlbmQobm9ybWFsaXplZCwgcmF3KTtcbiAgfVxuICBpZiAoaXNPYmplY3QoY29tcCkpIHtcbiAgICBjYWNoZS5zZXQoY29tcCwgbm9ybWFsaXplZCk7XG4gIH1cbiAgcmV0dXJuIG5vcm1hbGl6ZWQ7XG59XG5mdW5jdGlvbiBpc0VtaXRMaXN0ZW5lcihvcHRpb25zLCBrZXkpIHtcbiAgaWYgKCFvcHRpb25zIHx8ICFpc09uKGtleSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAga2V5ID0ga2V5LnNsaWNlKDIpLnJlcGxhY2UoL09uY2UkLywgXCJcIik7XG4gIHJldHVybi
20578BoYXNPd24ob3B0aW9ucywga2V5WzBdLnRvTG93ZXJDYXNlKCkgKyBrZXkuc2xpY2UoMSkpIHx8IGhhc093bihvcHRpb25zLCBoeXBoZW5hdGUoa2V5KSkgfHwgaGFzT3duKG9wdGlvbnMsIGtleSk7XG59XG5cbmxldCBhY2Nlc3NlZEF0dHJzID0gZmFsc2U7XG5mdW5jdGlvbiBtYXJrQXR0cnNBY2Nlc3NlZCgpIHtcbiAgYWNjZXNzZWRBdHRycyA9IHRydWU7XG59XG5mdW5jdGlvbiByZW5kZXJDb21wb25lbnRSb290KGluc3RhbmNlKSB7XG4gIGNvbnN0IHtcbiAgICB0eXBlOiBDb21wb25lbnQsXG4gICAgdm5vZGUsXG4gICAgcHJveHksXG4gICAgd2l0aFByb3h5LFxuICAgIHByb3BzT3B0aW9uczogW3Byb3BzT3B0aW9uc10sXG4gICAgc2xvdHMsXG4gICAgYXR0cnMsXG4gICAgZW1pdCxcbiAgICByZW5kZXIsXG4gICAgcmVuZGVyQ2FjaGUsXG4gICAgcHJvcHMsXG4gICAgZGF0YSxcbiAgICBzZXR1cFN0YXRlLFxuICAgIGN0eCxcbiAgICBpbmhlcml0QXR0cnNcbiAgfSA9IGluc3RhbmNlO1xuICBjb25zdCBwcmV2ID0gc2V0Q3VycmVudFJlbmRlcmluZ0luc3RhbmNlKGluc3RhbmNlKTtcbiAgbGV0IHJlc3VsdDtcbiAgbGV0IGZhbGx0aHJvdWdoQXR0cnM7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgYWNjZXNzZWRBdHRycyA9IGZhbHNlO1xuICB9XG4gIHRyeSB7XG4gICAgaWYgKHZub2RlLnNoYXBlRmxhZyAmIDQpIHtcbiAgICAgIGNvbnN0IHByb3h5VG9Vc2UgPSB3aXRoUHJveHkgfHwgcHJveHk7XG4gICAgICBjb25zdCB0aGlzUHJveHkgPSAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHNldHVwU3RhdGUuX19pc1NjcmlwdFNldHVwID8gbmV3IFByb3h5KHByb3h5VG9Vc2UsIHtcbiAgICAgICAgZ2V0KHRhcmdldCwga2V5LCByZWNlaXZlcikge1xuICAgICAgICAgIHdhcm4kMShcbiAgICAgICAgICAgIGBQcm9wZXJ0eSAnJHtTdHJpbmcoXG4gICAgICAgICAgICAgIGtleVxuICAgICAgICAgICAgKX0nIHdhcyBhY2Nlc3NlZCB2aWEgJ3RoaXMnLiBBdm9pZCB1c2luZyAndGhpcycgaW4gdGVtcGxhdGVzLmBcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiBSZWZsZWN0LmdldCh0YXJnZXQsIGtleSwgcmVjZWl2ZXIpO1xuICAgICAgICB9XG4gICAgICB9KSA6IHByb3h5VG9Vc2U7XG4gICAgICByZXN1bHQgPSBub3JtYWxpemVWTm9kZShcbiAgICAgICAgcmVuZGVyLmNhbGwoXG4gICAgICAgICAgdGhpc1Byb3h5LFxuICAgICAgICAgIHByb3h5VG9Vc2UsXG4gICAgICAgICAgcmVuZGVyQ2FjaGUsXG4gICAgICAgICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IHNoYWxsb3dSZWFkb25seShwcm9wcykgOiBwcm9wcyxcbiAgICAgICAgICBzZXR1cFN0YXRlLFxuICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgY3R4XG4gICAgICAgIClcbiAgICAgICk7XG4gICAgICBmYWxsdGhyb3VnaEF0dHJzID0gYXR0cnM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHJlbmRlcjIgPSBDb21wb25lbnQ7XG4gICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBhdHRycyA9PT0gcHJvcHMpIHtcbiAgICAgICAgbWFya0F0dHJzQWNjZXNzZWQoKTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdCA9IG5vcm1hbGl6ZVZOb2RlKFxuICAgICAgICByZW5kZXIyLmxlbmd0aCA+IDEgPyByZW5kZXIyKFxuICAgICAgICAgICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBzaGFsbG93UmVhZG9ubHkocHJvcHMpIDogcHJvcHMsXG4gICAgICAgICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IHtcbiAgICAgICAgICAgIGdldCBhdHRycygpIHtcbiAgICAgICAgICAgICAgbWFya0F0dHJzQWNjZXNzZWQoKTtcbiAgICAgICAgICAgICAgcmV0dXJuIHNoYWxsb3dSZWFkb25seShhdHRycyk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2xvdHMsXG4gICAgICAgICAgICBlbWl0XG4gICAgICAgICAgfSA6IHsgYXR0cnMsIHNsb3RzLCBlbWl0IH1cbiAgICAgICAgKSA6IHJlbmRlcjIoXG4gICAgICAgICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IHNoYWxsb3dSZWFkb25seShwcm9wcykgOiBwcm9wcyxcbiAgICAgICAgICBudWxsXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgICBmYWxsdGhyb3VnaEF0dHJzID0gQ29tcG9uZW50LnByb3BzID8gYXR0cnMgOiBnZXRGdW5jdGlvbmFsRmFsbHRocm91Z2goYXR0cnMpO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgYmxvY2tTdGFjay5sZW5ndGggPSAwO1xuICAgIGhhbmRsZUVycm9yKGVyciwgaW5zdGFuY2UsIDEpO1xuICAgIHJlc3VsdCA9IGNyZWF0ZVZOb2RlKENvbW1lbnQpO1xuICB9XG4gIGxldCByb290ID0gcmVzdWx0O1xuICBsZXQgc2V0Um9vdCA9IHZvaWQgMDtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgcmVzdWx0LnBhdGNoRmxhZyA+IDAgJiYgcmVzdWx0LnBhdGNoRmxhZyAmIDIwNDgpIHtcbiAgICBbcm9vdCwgc2V0Um9vdF0gPSBnZXRDaGlsZFJvb3QocmVzdWx0KTtcbiAgfVxuICBpZiAoZmFsbHRocm91Z2hBdHRycyAmJiBpbmhlcml0QXR0cnMgIT09IGZhbHNlKSB7XG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGZhbGx0aHJvdWdoQXR0cnMpO1xuICAgIGNvbnN0IHsgc2hhcGVGbGFnIH0gPSByb290O1xuICAgIGlmIChrZXlzLmxlbmd0aCkge1xuICAgICAgaWYgKHNoYXBlRmxhZyAmICgxIHwgNikpIHtcbiAgICAgICAgaWYgKHByb3BzT3B0aW9ucyAmJiBrZXlzLnNvbWUoaXNNb2RlbExpc3RlbmVyKSkge1xuICAgICAgICAgIGZhbGx0aHJvdWdoQXR0cnMgPSBmaWx0ZXJNb2RlbExpc3RlbmVycyhcbiAgICAgICAgICAgIGZhbGx0aHJvdWdoQXR0cnMsXG4gICAgICAgICAgICBwcm9wc09wdGlvbnNcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJvb3QgPSBjbG9uZVZOb2RlKHJvb3QsIGZhbGx0aHJvdWdoQXR0cnMsIGZhbHNlLCB0cnVlKTtcbiAgICAgIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAhYWNjZXNzZWRBdHRycyAmJiByb290LnR5cGUgIT09IENvbW1lbnQpIHtcbiAgICAgICAgY29uc3QgYWxsQXR0cnMgPSBPYmplY3Qua2V5cyhhdHRycyk7XG4gICAgICAgIGNvbnN0IGV2ZW50QXR0cnMgPSBbXTtcbiAgICAgICAgY29uc3QgZXh0cmFBdHRycyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMCwgbCA9IGFsbEF0dHJzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGtleSA9IGFsbEF0dHJzW2ldO1xuICAgICAgICAgIGlmIChpc09uKGtleSkpIHtcbiAgICAgICAgICAgIGlmICghaXNNb2RlbExpc3RlbmVyKGtleSkpIHtcbiAgICAgICAgICAgICAgZXZlbnRBdHRycy5wdXNoKGtleVsyXS50b0xvd2VyQ2FzZSgpICsga2V5LnNsaWNlKDMpKTtcbiAgICAgICAgICAgI
20578H1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZXh0cmFBdHRycy5wdXNoKGtleSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChleHRyYUF0dHJzLmxlbmd0aCkge1xuICAgICAgICAgIHdhcm4kMShcbiAgICAgICAgICAgIGBFeHRyYW5lb3VzIG5vbi1wcm9wcyBhdHRyaWJ1dGVzICgke2V4dHJhQXR0cnMuam9pbihcIiwgXCIpfSkgd2VyZSBwYXNzZWQgdG8gY29tcG9uZW50IGJ1dCBjb3VsZCBub3QgYmUgYXV0b21hdGljYWxseSBpbmhlcml0ZWQgYmVjYXVzZSBjb21wb25lbnQgcmVuZGVycyBmcmFnbWVudCBvciB0ZXh0IHJvb3Qgbm9kZXMuYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV2ZW50QXR0cnMubGVuZ3RoKSB7XG4gICAgICAgICAgd2FybiQxKFxuICAgICAgICAgICAgYEV4dHJhbmVvdXMgbm9uLWVtaXRzIGV2ZW50IGxpc3RlbmVycyAoJHtldmVudEF0dHJzLmpvaW4oXCIsIFwiKX0pIHdlcmUgcGFzc2VkIHRvIGNvbXBvbmVudCBidXQgY291bGQgbm90IGJlIGF1dG9tYXRpY2FsbHkgaW5oZXJpdGVkIGJlY2F1c2UgY29tcG9uZW50IHJlbmRlcnMgZnJhZ21lbnQgb3IgdGV4dCByb290IG5vZGVzLiBJZiB0aGUgbGlzdGVuZXIgaXMgaW50ZW5kZWQgdG8gYmUgYSBjb21wb25lbnQgY3VzdG9tIGV2ZW50IGxpc3RlbmVyIG9ubHksIGRlY2xhcmUgaXQgdXNpbmcgdGhlIFwiZW1pdHNcIiBvcHRpb24uYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKHZub2RlLmRpcnMpIHtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAhaXNFbGVtZW50Um9vdChyb290KSkge1xuICAgICAgd2FybiQxKFxuICAgICAgICBgUnVudGltZSBkaXJlY3RpdmUgdXNlZCBvbiBjb21wb25lbnQgd2l0aCBub24tZWxlbWVudCByb290IG5vZGUuIFRoZSBkaXJlY3RpdmVzIHdpbGwgbm90IGZ1bmN0aW9uIGFzIGludGVuZGVkLmBcbiAgICAgICk7XG4gICAgfVxuICAgIHJvb3QgPSBjbG9uZVZOb2RlKHJvb3QsIG51bGwsIGZhbHNlLCB0cnVlKTtcbiAgICByb290LmRpcnMgPSByb290LmRpcnMgPyByb290LmRpcnMuY29uY2F0KHZub2RlLmRpcnMpIDogdm5vZGUuZGlycztcbiAgfVxuICBpZiAodm5vZGUudHJhbnNpdGlvbikge1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmICFpc0VsZW1lbnRSb290KHJvb3QpKSB7XG4gICAgICB3YXJuJDEoXG4gICAgICAgIGBDb21wb25lbnQgaW5zaWRlIDxUcmFuc2l0aW9uPiByZW5kZXJzIG5vbi1lbGVtZW50IHJvb3Qgbm9kZSB0aGF0IGNhbm5vdCBiZSBhbmltYXRlZC5gXG4gICAgICApO1xuICAgIH1cbiAgICByb290LnRyYW5zaXRpb24gPSB2bm9kZS50cmFuc2l0aW9uO1xuICB9XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHNldFJvb3QpIHtcbiAgICBzZXRSb290KHJvb3QpO1xuICB9IGVsc2Uge1xuICAgIHJlc3VsdCA9IHJvb3Q7XG4gIH1cbiAgc2V0Q3VycmVudFJlbmRlcmluZ0luc3RhbmNlKHByZXYpO1xuICByZXR1cm4gcmVzdWx0O1xufVxuY29uc3QgZ2V0Q2hpbGRSb290ID0gKHZub2RlKSA9PiB7XG4gIGNvbnN0IHJhd0NoaWxkcmVuID0gdm5vZGUuY2hpbGRyZW47XG4gIGNvbnN0IGR5bmFtaWNDaGlsZHJlbiA9IHZub2RlLmR5bmFtaWNDaGlsZHJlbjtcbiAgY29uc3QgY2hpbGRSb290ID0gZmlsdGVyU2luZ2xlUm9vdChyYXdDaGlsZHJlbiwgZmFsc2UpO1xuICBpZiAoIWNoaWxkUm9vdCkge1xuICAgIHJldHVybiBbdm5vZGUsIHZvaWQgMF07XG4gIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBjaGlsZFJvb3QucGF0Y2hGbGFnID4gMCAmJiBjaGlsZFJvb3QucGF0Y2hGbGFnICYgMjA0OCkge1xuICAgIHJldHVybiBnZXRDaGlsZFJvb3QoY2hpbGRSb290KTtcbiAgfVxuICBjb25zdCBpbmRleCA9IHJhd0NoaWxkcmVuLmluZGV4T2YoY2hpbGRSb290KTtcbiAgY29uc3QgZHluYW1pY0luZGV4ID0gZHluYW1pY0NoaWxkcmVuID8gZHluYW1pY0NoaWxkcmVuLmluZGV4T2YoY2hpbGRSb290KSA6IC0xO1xuICBjb25zdCBzZXRSb290ID0gKHVwZGF0ZWRSb290KSA9PiB7XG4gICAgcmF3Q2hpbGRyZW5baW5kZXhdID0gdXBkYXRlZFJvb3Q7XG4gICAgaWYgKGR5bmFtaWNDaGlsZHJlbikge1xuICAgICAgaWYgKGR5bmFtaWNJbmRleCA+IC0xKSB7XG4gICAgICAgIGR5bmFtaWNDaGlsZHJlbltkeW5hbWljSW5kZXhdID0gdXBkYXRlZFJvb3Q7XG4gICAgICB9IGVsc2UgaWYgKHVwZGF0ZWRSb290LnBhdGNoRmxhZyA+IDApIHtcbiAgICAgICAgdm5vZGUuZHluYW1pY0NoaWxkcmVuID0gWy4uLmR5bmFtaWNDaGlsZHJlbiwgdXBkYXRlZFJvb3RdO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgcmV0dXJuIFtub3JtYWxpemVWTm9kZShjaGlsZFJvb3QpLCBzZXRSb290XTtcbn07XG5mdW5jdGlvbiBmaWx0ZXJTaW5nbGVSb290KGNoaWxkcmVuLCByZWN1cnNlID0gdHJ1ZSkge1xuICBsZXQgc2luZ2xlUm9vdDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGNoaWxkID0gY2hpbGRyZW5baV07XG4gICAgaWYgKGlzVk5vZGUoY2hpbGQpKSB7XG4gICAgICBpZiAoY2hpbGQudHlwZSAhPT0gQ29tbWVudCB8fCBjaGlsZC5jaGlsZHJlbiA9PT0gXCJ2LWlmXCIpIHtcbiAgICAgICAgaWYgKHNpbmdsZVJvb3QpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2luZ2xlUm9vdCA9IGNoaWxkO1xuICAgICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHJlY3Vyc2UgJiYgc2luZ2xlUm9vdC5wYXRjaEZsYWcgPiAwICYmIHNpbmdsZVJvb3QucGF0Y2hGbGFnICYgMjA0OCkge1xuICAgICAgICAgICAgcmV0dXJuIGZpbHRlclNpbmdsZVJvb3Qoc2luZ2xlUm9vdC5jaGlsZHJlbik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gI
20578H1cbiAgcmV0dXJuIHNpbmdsZVJvb3Q7XG59XG5jb25zdCBnZXRGdW5jdGlvbmFsRmFsbHRocm91Z2ggPSAoYXR0cnMpID0+IHtcbiAgbGV0IHJlcztcbiAgZm9yIChjb25zdCBrZXkgaW4gYXR0cnMpIHtcbiAgICBpZiAoa2V5ID09PSBcImNsYXNzXCIgfHwga2V5ID09PSBcInN0eWxlXCIgfHwgaXNPbihrZXkpKSB7XG4gICAgICAocmVzIHx8IChyZXMgPSB7fSkpW2tleV0gPSBhdHRyc1trZXldO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzO1xufTtcbmNvbnN0IGZpbHRlck1vZGVsTGlzdGVuZXJzID0gKGF0dHJzLCBwcm9wcykgPT4ge1xuICBjb25zdCByZXMgPSB7fTtcbiAgZm9yIChjb25zdCBrZXkgaW4gYXR0cnMpIHtcbiAgICBpZiAoIWlzTW9kZWxMaXN0ZW5lcihrZXkpIHx8ICEoa2V5LnNsaWNlKDkpIGluIHByb3BzKSkge1xuICAgICAgcmVzW2tleV0gPSBhdHRyc1trZXldO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzO1xufTtcbmNvbnN0IGlzRWxlbWVudFJvb3QgPSAodm5vZGUpID0+IHtcbiAgcmV0dXJuIHZub2RlLnNoYXBlRmxhZyAmICg2IHwgMSkgfHwgdm5vZGUudHlwZSA9PT0gQ29tbWVudDtcbn07XG5mdW5jdGlvbiBzaG91bGRVcGRhdGVDb21wb25lbnQocHJldlZOb2RlLCBuZXh0Vk5vZGUsIG9wdGltaXplZCkge1xuICBjb25zdCB7IHByb3BzOiBwcmV2UHJvcHMsIGNoaWxkcmVuOiBwcmV2Q2hpbGRyZW4sIGNvbXBvbmVudCB9ID0gcHJldlZOb2RlO1xuICBjb25zdCB7IHByb3BzOiBuZXh0UHJvcHMsIGNoaWxkcmVuOiBuZXh0Q2hpbGRyZW4sIHBhdGNoRmxhZyB9ID0gbmV4dFZOb2RlO1xuICBjb25zdCBlbWl0cyA9IGNvbXBvbmVudC5lbWl0c09wdGlvbnM7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIChwcmV2Q2hpbGRyZW4gfHwgbmV4dENoaWxkcmVuKSAmJiBpc0htclVwZGF0aW5nKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKG5leHRWTm9kZS5kaXJzIHx8IG5leHRWTm9kZS50cmFuc2l0aW9uKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKG9wdGltaXplZCAmJiBwYXRjaEZsYWcgPj0gMCkge1xuICAgIGlmIChwYXRjaEZsYWcgJiAxMDI0KSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHBhdGNoRmxhZyAmIDE2KSB7XG4gICAgICBpZiAoIXByZXZQcm9wcykge1xuICAgICAgICByZXR1cm4gISFuZXh0UHJvcHM7XG4gICAgICB9XG4gICAgICByZXR1cm4gaGFzUHJvcHNDaGFuZ2VkKHByZXZQcm9wcywgbmV4dFByb3BzLCBlbWl0cyk7XG4gICAgfSBlbHNlIGlmIChwYXRjaEZsYWcgJiA4KSB7XG4gICAgICBjb25zdCBkeW5hbWljUHJvcHMgPSBuZXh0Vk5vZGUuZHluYW1pY1Byb3BzO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkeW5hbWljUHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3Qga2V5ID0gZHluYW1pY1Byb3BzW2ldO1xuICAgICAgICBpZiAobmV4dFByb3BzW2tleV0gIT09IHByZXZQcm9wc1trZXldICYmICFpc0VtaXRMaXN0ZW5lcihlbWl0cywga2V5KSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChwcmV2Q2hpbGRyZW4gfHwgbmV4dENoaWxkcmVuKSB7XG4gICAgICBpZiAoIW5leHRDaGlsZHJlbiB8fCAhbmV4dENoaWxkcmVuLiRzdGFibGUpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChwcmV2UHJvcHMgPT09IG5leHRQcm9wcykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoIXByZXZQcm9wcykge1xuICAgICAgcmV0dXJuICEhbmV4dFByb3BzO1xuICAgIH1cbiAgICBpZiAoIW5leHRQcm9wcykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBoYXNQcm9wc0NoYW5nZWQocHJldlByb3BzLCBuZXh0UHJvcHMsIGVtaXRzKTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBoYXNQcm9wc0NoYW5nZWQocHJldlByb3BzLCBuZXh0UHJvcHMsIGVtaXRzT3B0aW9ucykge1xuICBjb25zdCBuZXh0S2V5cyA9IE9iamVjdC5rZXlzKG5leHRQcm9wcyk7XG4gIGlmIChuZXh0S2V5cy5sZW5ndGggIT09IE9iamVjdC5rZXlzKHByZXZQcm9wcykubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBuZXh0S2V5cy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGtleSA9IG5leHRLZXlzW2ldO1xuICAgIGlmIChuZXh0UHJvcHNba2V5XSAhPT0gcHJldlByb3BzW2tleV0gJiYgIWlzRW1pdExpc3RlbmVyKGVtaXRzT3B0aW9ucywga2V5KSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIHVwZGF0ZUhPQ0hvc3RFbCh7IHZub2RlLCBwYXJlbnQgfSwgZWwpIHtcbiAgd2hpbGUgKHBhcmVudCkge1xuICAgIGNvbnN0IHJvb3QgPSBwYXJlbnQuc3ViVHJlZTtcbiAgICBpZiAocm9vdC5zdXNwZW5zZSAmJiByb290LnN1c3BlbnNlLmFjdGl2ZUJyYW5jaCA9PT0gdm5vZGUpIHtcbiAgICAgIHJvb3QuZWwgPSB2bm9kZS5lbDtcbiAgICB9XG4gICAgaWYgKHJvb3QgPT09IHZub2RlKSB7XG4gICAgICAodm5vZGUgPSBwYXJlbnQudm5vZGUpLmVsID0gZWw7XG4gICAgICBwYXJlbnQgPSBwYXJlbnQucGFyZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbn1cblxuY29uc3QgaXNTdXNwZW5zZSA9ICh0eXBlKSA9PiB0eXBlLl9faXNTdXNwZW5zZTtcbmxldCBzdXNwZW5zZUlkID0gMDtcbmNvbnN0IFN1c3BlbnNlSW1wbCA9IHtcbiAgbmFtZTogXCJTdXNwZW5zZVwiLFxuICAvLyBJbiBvcmRlciB0byBtYWtlIFN1c3BlbnNlIHRyZWUtc2hha2FibGUsIHdlIG5lZWQgdG8gYXZvaWQgaW1wb3J0aW5nIGl0XG4gIC8vIGRpcmVjdGx5IGluIHRoZSByZW5kZXJlci4gVGhlIHJlbmRlcmVyIGNoZWNrcyBmb3IgdGhlIF9faXNTdXNwZW5zZSBmbGFnXG4gIC8vIG9uIGEgdm5vZGUncyB0eXBlIGFuZCBjYWxscyB0aGUgYHByb2Nlc3NgIG1ldGhvZCwgcGFzc2luZyBpbiByZW5kZXJlclxuICAvLyBpbnRlcm5hbHMuXG4gIF9faXNTdXNwZW5zZTogdHJ1ZSxcbiAgcHJvY2VzcyhuMSwgbjIsIGNvbnRhaW5lciwgYW5jaG9yLCBwYXJlbnRDb21wb25lbnQsIH
20578BhcmVudFN1c3BlbnNlLCBuYW1lc3BhY2UsIHNsb3RTY29wZUlkcywgb3B0aW1pemVkLCByZW5kZXJlckludGVybmFscykge1xuICAgIGlmIChuMSA9PSBudWxsKSB7XG4gICAgICBtb3VudFN1c3BlbnNlKFxuICAgICAgICBuMixcbiAgICAgICAgY29udGFpbmVyLFxuICAgICAgICBhbmNob3IsXG4gICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICBvcHRpbWl6ZWQsXG4gICAgICAgIHJlbmRlcmVySW50ZXJuYWxzXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAocGFyZW50U3VzcGVuc2UgJiYgcGFyZW50U3VzcGVuc2UuZGVwcyA+IDAgJiYgIW4xLnN1c3BlbnNlLmlzSW5GYWxsYmFjaykge1xuICAgICAgICBuMi5zdXNwZW5zZSA9IG4xLnN1c3BlbnNlO1xuICAgICAgICBuMi5zdXNwZW5zZS52bm9kZSA9IG4yO1xuICAgICAgICBuMi5lbCA9IG4xLmVsO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBwYXRjaFN1c3BlbnNlKFxuICAgICAgICBuMSxcbiAgICAgICAgbjIsXG4gICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgYW5jaG9yLFxuICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICBvcHRpbWl6ZWQsXG4gICAgICAgIHJlbmRlcmVySW50ZXJuYWxzXG4gICAgICApO1xuICAgIH1cbiAgfSxcbiAgaHlkcmF0ZTogaHlkcmF0ZVN1c3BlbnNlLFxuICBub3JtYWxpemU6IG5vcm1hbGl6ZVN1c3BlbnNlQ2hpbGRyZW5cbn07XG5jb25zdCBTdXNwZW5zZSA9IFN1c3BlbnNlSW1wbCA7XG5mdW5jdGlvbiB0cmlnZ2VyRXZlbnQodm5vZGUsIG5hbWUpIHtcbiAgY29uc3QgZXZlbnRMaXN0ZW5lciA9IHZub2RlLnByb3BzICYmIHZub2RlLnByb3BzW25hbWVdO1xuICBpZiAoaXNGdW5jdGlvbihldmVudExpc3RlbmVyKSkge1xuICAgIGV2ZW50TGlzdGVuZXIoKTtcbiAgfVxufVxuZnVuY3Rpb24gbW91bnRTdXNwZW5zZSh2bm9kZSwgY29udGFpbmVyLCBhbmNob3IsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIG5hbWVzcGFjZSwgc2xvdFNjb3BlSWRzLCBvcHRpbWl6ZWQsIHJlbmRlcmVySW50ZXJuYWxzKSB7XG4gIGNvbnN0IHtcbiAgICBwOiBwYXRjaCxcbiAgICBvOiB7IGNyZWF0ZUVsZW1lbnQgfVxuICB9ID0gcmVuZGVyZXJJbnRlcm5hbHM7XG4gIGNvbnN0IGhpZGRlbkNvbnRhaW5lciA9IGNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gIGNvbnN0IHN1c3BlbnNlID0gdm5vZGUuc3VzcGVuc2UgPSBjcmVhdGVTdXNwZW5zZUJvdW5kYXJ5KFxuICAgIHZub2RlLFxuICAgIHBhcmVudFN1c3BlbnNlLFxuICAgIHBhcmVudENvbXBvbmVudCxcbiAgICBjb250YWluZXIsXG4gICAgaGlkZGVuQ29udGFpbmVyLFxuICAgIGFuY2hvcixcbiAgICBuYW1lc3BhY2UsXG4gICAgc2xvdFNjb3BlSWRzLFxuICAgIG9wdGltaXplZCxcbiAgICByZW5kZXJlckludGVybmFsc1xuICApO1xuICBwYXRjaChcbiAgICBudWxsLFxuICAgIHN1c3BlbnNlLnBlbmRpbmdCcmFuY2ggPSB2bm9kZS5zc0NvbnRlbnQsXG4gICAgaGlkZGVuQ29udGFpbmVyLFxuICAgIG51bGwsXG4gICAgcGFyZW50Q29tcG9uZW50LFxuICAgIHN1c3BlbnNlLFxuICAgIG5hbWVzcGFjZSxcbiAgICBzbG90U2NvcGVJZHNcbiAgKTtcbiAgaWYgKHN1c3BlbnNlLmRlcHMgPiAwKSB7XG4gICAgdHJpZ2dlckV2ZW50KHZub2RlLCBcIm9uUGVuZGluZ1wiKTtcbiAgICB0cmlnZ2VyRXZlbnQodm5vZGUsIFwib25GYWxsYmFja1wiKTtcbiAgICBwYXRjaChcbiAgICAgIG51bGwsXG4gICAgICB2bm9kZS5zc0ZhbGxiYWNrLFxuICAgICAgY29udGFpbmVyLFxuICAgICAgYW5jaG9yLFxuICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgbnVsbCxcbiAgICAgIC8vIGZhbGxiYWNrIHRyZWUgd2lsbCBub3QgaGF2ZSBzdXNwZW5zZSBjb250ZXh0XG4gICAgICBuYW1lc3BhY2UsXG4gICAgICBzbG90U2NvcGVJZHNcbiAgICApO1xuICAgIHNldEFjdGl2ZUJyYW5jaChzdXNwZW5zZSwgdm5vZGUuc3NGYWxsYmFjayk7XG4gIH0gZWxzZSB7XG4gICAgc3VzcGVuc2UucmVzb2x2ZShmYWxzZSwgdHJ1ZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHBhdGNoU3VzcGVuc2UobjEsIG4yLCBjb250YWluZXIsIGFuY2hvciwgcGFyZW50Q29tcG9uZW50LCBuYW1lc3BhY2UsIHNsb3RTY29wZUlkcywgb3B0aW1pemVkLCB7IHA6IHBhdGNoLCB1bTogdW5tb3VudCwgbzogeyBjcmVhdGVFbGVtZW50IH0gfSkge1xuICBjb25zdCBzdXNwZW5zZSA9IG4yLnN1c3BlbnNlID0gbjEuc3VzcGVuc2U7XG4gIHN1c3BlbnNlLnZub2RlID0gbjI7XG4gIG4yLmVsID0gbjEuZWw7XG4gIGNvbnN0IG5ld0JyYW5jaCA9IG4yLnNzQ29udGVudDtcbiAgY29uc3QgbmV3RmFsbGJhY2sgPSBuMi5zc0ZhbGxiYWNrO1xuICBjb25zdCB7IGFjdGl2ZUJyYW5jaCwgcGVuZGluZ0JyYW5jaCwgaXNJbkZhbGxiYWNrLCBpc0h5ZHJhdGluZyB9ID0gc3VzcGVuc2U7XG4gIGlmIChwZW5kaW5nQnJhbmNoKSB7XG4gICAgc3VzcGVuc2UucGVuZGluZ0JyYW5jaCA9IG5ld0JyYW5jaDtcbiAgICBpZiAoaXNTYW1lVk5vZGVUeXBlKG5ld0JyYW5jaCwgcGVuZGluZ0JyYW5jaCkpIHtcbiAgICAgIHBhdGNoKFxuICAgICAgICBwZW5kaW5nQnJhbmNoLFxuICAgICAgICBuZXdCcmFuY2gsXG4gICAgICAgIHN1c3BlbnNlLmhpZGRlbkNvbnRhaW5lcixcbiAgICAgICAgbnVsbCxcbiAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICBzdXNwZW5zZSxcbiAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgIG9wdGltaXplZFxuICAgICAgKTtcbiAgICAgIGlmIChzdXNwZW5zZS5kZXBzIDw9IDApIHtcbiAgICAgICAgc3VzcGVuc2UucmVzb2x2ZSgpO1xuICAgICAgfSBlbHNlIGlmIChpc0luRmFsbGJhY2spIHtcbiAgICAgICAgaWYgKCFpc0h5ZHJhdGluZykge1xuICAgICAgICAgIHBhdGNoKFxuICAgICAgICAgICAgYWN0aXZlQnJhbmNoLFxuICAgICAgICAgICAgbmV3RmFsbGJhY2ssXG4gICAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgICBhbmNob3IsXG4gICAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgLy8gZmFsbGJhY2sgdHJlZSB3aWxsIG5vdCBoYXZlIHN1c3BlbnNlIGNvbnRleHRcbiAgICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICAgI
20578HNsb3RTY29wZUlkcyxcbiAgICAgICAgICAgIG9wdGltaXplZFxuICAgICAgICAgICk7XG4gICAgICAgICAgc2V0QWN0aXZlQnJhbmNoKHN1c3BlbnNlLCBuZXdGYWxsYmFjayk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc3VzcGVuc2UucGVuZGluZ0lkID0gc3VzcGVuc2VJZCsrO1xuICAgICAgaWYgKGlzSHlkcmF0aW5nKSB7XG4gICAgICAgIHN1c3BlbnNlLmlzSHlkcmF0aW5nID0gZmFsc2U7XG4gICAgICAgIHN1c3BlbnNlLmFjdGl2ZUJyYW5jaCA9IHBlbmRpbmdCcmFuY2g7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB1bm1vdW50KHBlbmRpbmdCcmFuY2gsIHBhcmVudENvbXBvbmVudCwgc3VzcGVuc2UpO1xuICAgICAgfVxuICAgICAgc3VzcGVuc2UuZGVwcyA9IDA7XG4gICAgICBzdXNwZW5zZS5lZmZlY3RzLmxlbmd0aCA9IDA7XG4gICAgICBzdXNwZW5zZS5oaWRkZW5Db250YWluZXIgPSBjcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgaWYgKGlzSW5GYWxsYmFjaykge1xuICAgICAgICBwYXRjaChcbiAgICAgICAgICBudWxsLFxuICAgICAgICAgIG5ld0JyYW5jaCxcbiAgICAgICAgICBzdXNwZW5zZS5oaWRkZW5Db250YWluZXIsXG4gICAgICAgICAgbnVsbCxcbiAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgc3VzcGVuc2UsXG4gICAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHN1c3BlbnNlLmRlcHMgPD0gMCkge1xuICAgICAgICAgIHN1c3BlbnNlLnJlc29sdmUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwYXRjaChcbiAgICAgICAgICAgIGFjdGl2ZUJyYW5jaCxcbiAgICAgICAgICAgIG5ld0ZhbGxiYWNrLFxuICAgICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgICAgYW5jaG9yLFxuICAgICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIC8vIGZhbGxiYWNrIHRyZWUgd2lsbCBub3QgaGF2ZSBzdXNwZW5zZSBjb250ZXh0XG4gICAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgICApO1xuICAgICAgICAgIHNldEFjdGl2ZUJyYW5jaChzdXNwZW5zZSwgbmV3RmFsbGJhY2spO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGFjdGl2ZUJyYW5jaCAmJiBpc1NhbWVWTm9kZVR5cGUobmV3QnJhbmNoLCBhY3RpdmVCcmFuY2gpKSB7XG4gICAgICAgIHBhdGNoKFxuICAgICAgICAgIGFjdGl2ZUJyYW5jaCxcbiAgICAgICAgICBuZXdCcmFuY2gsXG4gICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgIGFuY2hvcixcbiAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgc3VzcGVuc2UsXG4gICAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgKTtcbiAgICAgICAgc3VzcGVuc2UucmVzb2x2ZSh0cnVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhdGNoKFxuICAgICAgICAgIG51bGwsXG4gICAgICAgICAgbmV3QnJhbmNoLFxuICAgICAgICAgIHN1c3BlbnNlLmhpZGRlbkNvbnRhaW5lcixcbiAgICAgICAgICBudWxsLFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICBzdXNwZW5zZSxcbiAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgIG9wdGltaXplZFxuICAgICAgICApO1xuICAgICAgICBpZiAoc3VzcGVuc2UuZGVwcyA8PSAwKSB7XG4gICAgICAgICAgc3VzcGVuc2UucmVzb2x2ZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChhY3RpdmVCcmFuY2ggJiYgaXNTYW1lVk5vZGVUeXBlKG5ld0JyYW5jaCwgYWN0aXZlQnJhbmNoKSkge1xuICAgICAgcGF0Y2goXG4gICAgICAgIGFjdGl2ZUJyYW5jaCxcbiAgICAgICAgbmV3QnJhbmNoLFxuICAgICAgICBjb250YWluZXIsXG4gICAgICAgIGFuY2hvcixcbiAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICBzdXNwZW5zZSxcbiAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgIG9wdGltaXplZFxuICAgICAgKTtcbiAgICAgIHNldEFjdGl2ZUJyYW5jaChzdXNwZW5zZSwgbmV3QnJhbmNoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdHJpZ2dlckV2ZW50KG4yLCBcIm9uUGVuZGluZ1wiKTtcbiAgICAgIHN1c3BlbnNlLnBlbmRpbmdCcmFuY2ggPSBuZXdCcmFuY2g7XG4gICAgICBpZiAobmV3QnJhbmNoLnNoYXBlRmxhZyAmIDUxMikge1xuICAgICAgICBzdXNwZW5zZS5wZW5kaW5nSWQgPSBuZXdCcmFuY2guY29tcG9uZW50LnN1c3BlbnNlSWQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdXNwZW5zZS5wZW5kaW5nSWQgPSBzdXNwZW5zZUlkKys7XG4gICAgICB9XG4gICAgICBwYXRjaChcbiAgICAgICAgbnVsbCxcbiAgICAgICAgbmV3QnJhbmNoLFxuICAgICAgICBzdXNwZW5zZS5oaWRkZW5Db250YWluZXIsXG4gICAgICAgIG51bGwsXG4gICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgc3VzcGVuc2UsXG4gICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICk7XG4gICAgICBpZiAoc3VzcGVuc2UuZGVwcyA8PSAwKSB7XG4gICAgICAgIHN1c3BlbnNlLnJlc29sdmUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHsgdGltZW91dCwgcGVuZGluZ0lkIH0gPSBzdXNwZW5zZTtcbiAgICAgICAgaWYgKHRpbWVvdXQgPiAwKSB7XG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoc3VzcGVuc2UucGVuZGluZ0lkID09PSBwZW5kaW5nSWQpIHtcbiAgICAgICAgICAgICAgc3VzcGVuc2UuZmFsbGJhY2sobmV3RmFsbGJhY2spO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sIHRpbWVvdXQpO1xuICAgICAgICB9IGVsc2UgaWYgKHRpbWVvdXQgPT09IDApIHtcbiAgICAgICAgICBzdXNwZW5zZS5mYWxsYmFjayhuZXdGYWxsYmFjayk7XG4gICAgICAgI
20578H1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbmxldCBoYXNXYXJuZWQgPSBmYWxzZTtcbmZ1bmN0aW9uIGNyZWF0ZVN1c3BlbnNlQm91bmRhcnkodm5vZGUsIHBhcmVudFN1c3BlbnNlLCBwYXJlbnRDb21wb25lbnQsIGNvbnRhaW5lciwgaGlkZGVuQ29udGFpbmVyLCBhbmNob3IsIG5hbWVzcGFjZSwgc2xvdFNjb3BlSWRzLCBvcHRpbWl6ZWQsIHJlbmRlcmVySW50ZXJuYWxzLCBpc0h5ZHJhdGluZyA9IGZhbHNlKSB7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHRydWUgJiYgIWhhc1dhcm5lZCkge1xuICAgIGhhc1dhcm5lZCA9IHRydWU7XG4gICAgY29uc29sZVtjb25zb2xlLmluZm8gPyBcImluZm9cIiA6IFwibG9nXCJdKFxuICAgICAgYDxTdXNwZW5zZT4gaXMgYW4gZXhwZXJpbWVudGFsIGZlYXR1cmUgYW5kIGl0cyBBUEkgd2lsbCBsaWtlbHkgY2hhbmdlLmBcbiAgICApO1xuICB9XG4gIGNvbnN0IHtcbiAgICBwOiBwYXRjaCxcbiAgICBtOiBtb3ZlLFxuICAgIHVtOiB1bm1vdW50LFxuICAgIG46IG5leHQsXG4gICAgbzogeyBwYXJlbnROb2RlLCByZW1vdmUgfVxuICB9ID0gcmVuZGVyZXJJbnRlcm5hbHM7XG4gIGxldCBwYXJlbnRTdXNwZW5zZUlkO1xuICBjb25zdCBpc1N1c3BlbnNpYmxlID0gaXNWTm9kZVN1c3BlbnNpYmxlKHZub2RlKTtcbiAgaWYgKGlzU3VzcGVuc2libGUpIHtcbiAgICBpZiAocGFyZW50U3VzcGVuc2UgJiYgcGFyZW50U3VzcGVuc2UucGVuZGluZ0JyYW5jaCkge1xuICAgICAgcGFyZW50U3VzcGVuc2VJZCA9IHBhcmVudFN1c3BlbnNlLnBlbmRpbmdJZDtcbiAgICAgIHBhcmVudFN1c3BlbnNlLmRlcHMrKztcbiAgICB9XG4gIH1cbiAgY29uc3QgdGltZW91dCA9IHZub2RlLnByb3BzID8gdG9OdW1iZXIodm5vZGUucHJvcHMudGltZW91dCkgOiB2b2lkIDA7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgYXNzZXJ0TnVtYmVyKHRpbWVvdXQsIGBTdXNwZW5zZSB0aW1lb3V0YCk7XG4gIH1cbiAgY29uc3QgaW5pdGlhbEFuY2hvciA9IGFuY2hvcjtcbiAgY29uc3Qgc3VzcGVuc2UgPSB7XG4gICAgdm5vZGUsXG4gICAgcGFyZW50OiBwYXJlbnRTdXNwZW5zZSxcbiAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgbmFtZXNwYWNlLFxuICAgIGNvbnRhaW5lcixcbiAgICBoaWRkZW5Db250YWluZXIsXG4gICAgZGVwczogMCxcbiAgICBwZW5kaW5nSWQ6IHN1c3BlbnNlSWQrKyxcbiAgICB0aW1lb3V0OiB0eXBlb2YgdGltZW91dCA9PT0gXCJudW1iZXJcIiA/IHRpbWVvdXQgOiAtMSxcbiAgICBhY3RpdmVCcmFuY2g6IG51bGwsXG4gICAgcGVuZGluZ0JyYW5jaDogbnVsbCxcbiAgICBpc0luRmFsbGJhY2s6ICFpc0h5ZHJhdGluZyxcbiAgICBpc0h5ZHJhdGluZyxcbiAgICBpc1VubW91bnRlZDogZmFsc2UsXG4gICAgZWZmZWN0czogW10sXG4gICAgcmVzb2x2ZShyZXN1bWUgPSBmYWxzZSwgc3luYyA9IGZhbHNlKSB7XG4gICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICBpZiAoIXJlc3VtZSAmJiAhc3VzcGVuc2UucGVuZGluZ0JyYW5jaCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBzdXNwZW5zZS5yZXNvbHZlKCkgaXMgY2FsbGVkIHdpdGhvdXQgYSBwZW5kaW5nIGJyYW5jaC5gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3VzcGVuc2UuaXNVbm1vdW50ZWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgc3VzcGVuc2UucmVzb2x2ZSgpIGlzIGNhbGxlZCBvbiBhbiBhbHJlYWR5IHVubW91bnRlZCBzdXNwZW5zZSBib3VuZGFyeS5gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3Qge1xuICAgICAgICB2bm9kZTogdm5vZGUyLFxuICAgICAgICBhY3RpdmVCcmFuY2gsXG4gICAgICAgIHBlbmRpbmdCcmFuY2gsXG4gICAgICAgIHBlbmRpbmdJZCxcbiAgICAgICAgZWZmZWN0cyxcbiAgICAgICAgcGFyZW50Q29tcG9uZW50OiBwYXJlbnRDb21wb25lbnQyLFxuICAgICAgICBjb250YWluZXI6IGNvbnRhaW5lcjJcbiAgICAgIH0gPSBzdXNwZW5zZTtcbiAgICAgIGxldCBkZWxheUVudGVyID0gZmFsc2U7XG4gICAgICBpZiAoc3VzcGVuc2UuaXNIeWRyYXRpbmcpIHtcbiAgICAgICAgc3VzcGVuc2UuaXNIeWRyYXRpbmcgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSBpZiAoIXJlc3VtZSkge1xuICAgICAgICBkZWxheUVudGVyID0gYWN0aXZlQnJhbmNoICYmIHBlbmRpbmdCcmFuY2gudHJhbnNpdGlvbiAmJiBwZW5kaW5nQnJhbmNoLnRyYW5zaXRpb24ubW9kZSA9PT0gXCJvdXQtaW5cIjtcbiAgICAgICAgaWYgKGRlbGF5RW50ZXIpIHtcbiAgICAgICAgICBhY3RpdmVCcmFuY2gudHJhbnNpdGlvbi5hZnRlckxlYXZlID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHBlbmRpbmdJZCA9PT0gc3VzcGVuc2UucGVuZGluZ0lkKSB7XG4gICAgICAgICAgICAgIG1vdmUoXG4gICAgICAgICAgICAgICAgcGVuZGluZ0JyYW5jaCxcbiAgICAgICAgICAgICAgICBjb250YWluZXIyLFxuICAgICAgICAgICAgICAgIGFuY2hvciA9PT0gaW5pdGlhbEFuY2hvciA/IG5leHQoYWN0aXZlQnJhbmNoKSA6IGFuY2hvcixcbiAgICAgICAgICAgICAgICAwXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIHF1ZXVlUG9zdEZsdXNoQ2IoZWZmZWN0cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYWN0aXZlQnJhbmNoKSB7XG4gICAgICAgICAgaWYgKHBhcmVudE5vZGUoYWN0aXZlQnJhbmNoLmVsKSAhPT0gc3VzcGVuc2UuaGlkZGVuQ29udGFpbmVyKSB7XG4gICAgICAgICAgICBhbmNob3IgPSBuZXh0KGFjdGl2ZUJyYW5jaCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHVubW91bnQoYWN0aXZlQnJhbmNoLCBwYXJlbnRDb21wb25lbnQyLCBzdXNwZW5zZSwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFkZWxheUVudGVyKSB7XG4gICAgICAgICAgbW92ZShwZW5kaW5nQnJhbmNoLCBjb250YWluZXIyLCBhbmNob3IsIDApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBzZXRBY3RpdmVCcmFuY2goc3VzcGVuc2UsIHBlbmRpbmdCcmFuY2gpO1xuICAgICAgc3VzcGVuc2UucGVuZGluZ0JyYW5jaCA9IG51bGw7XG4gICAgICBzdXNwZW5zZS5pc0luRmFsbGJhY2sgPSBmYWxzZTtcbiAgICAgIGxldCBwYXJlbnQgPSBzdXNwZW5zZS5wYXJlbnQ7XG4gICAgICBsZXQgaGFzVW5yZXNvbHZlZEFuY2VzdG9yID0gZmFsc2U7XG4gICAgICB3aGlsZSAocGFyZW50KSB7XG4gICAgICAgIGlmIChwYXJlbnQucGVuZGluZ0JyYW5jaCkge1xuICAgICAgICAgI
20578HBhcmVudC5lZmZlY3RzLnB1c2goLi4uZWZmZWN0cyk7XG4gICAgICAgICAgaGFzVW5yZXNvbHZlZEFuY2VzdG9yID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBwYXJlbnQgPSBwYXJlbnQucGFyZW50O1xuICAgICAgfVxuICAgICAgaWYgKCFoYXNVbnJlc29sdmVkQW5jZXN0b3IgJiYgIWRlbGF5RW50ZXIpIHtcbiAgICAgICAgcXVldWVQb3N0Rmx1c2hDYihlZmZlY3RzKTtcbiAgICAgIH1cbiAgICAgIHN1c3BlbnNlLmVmZmVjdHMgPSBbXTtcbiAgICAgIGlmIChpc1N1c3BlbnNpYmxlKSB7XG4gICAgICAgIGlmIChwYXJlbnRTdXNwZW5zZSAmJiBwYXJlbnRTdXNwZW5zZS5wZW5kaW5nQnJhbmNoICYmIHBhcmVudFN1c3BlbnNlSWQgPT09IHBhcmVudFN1c3BlbnNlLnBlbmRpbmdJZCkge1xuICAgICAgICAgIHBhcmVudFN1c3BlbnNlLmRlcHMtLTtcbiAgICAgICAgICBpZiAocGFyZW50U3VzcGVuc2UuZGVwcyA9PT0gMCAmJiAhc3luYykge1xuICAgICAgICAgICAgcGFyZW50U3VzcGVuc2UucmVzb2x2ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdHJpZ2dlckV2ZW50KHZub2RlMiwgXCJvblJlc29sdmVcIik7XG4gICAgfSxcbiAgICBmYWxsYmFjayhmYWxsYmFja1ZOb2RlKSB7XG4gICAgICBpZiAoIXN1c3BlbnNlLnBlbmRpbmdCcmFuY2gpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgeyB2bm9kZTogdm5vZGUyLCBhY3RpdmVCcmFuY2gsIHBhcmVudENvbXBvbmVudDogcGFyZW50Q29tcG9uZW50MiwgY29udGFpbmVyOiBjb250YWluZXIyLCBuYW1lc3BhY2U6IG5hbWVzcGFjZTIgfSA9IHN1c3BlbnNlO1xuICAgICAgdHJpZ2dlckV2ZW50KHZub2RlMiwgXCJvbkZhbGxiYWNrXCIpO1xuICAgICAgY29uc3QgYW5jaG9yMiA9IG5leHQoYWN0aXZlQnJhbmNoKTtcbiAgICAgIGNvbnN0IG1vdW50RmFsbGJhY2sgPSAoKSA9PiB7XG4gICAgICAgIGlmICghc3VzcGVuc2UuaXNJbkZhbGxiYWNrKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHBhdGNoKFxuICAgICAgICAgIG51bGwsXG4gICAgICAgICAgZmFsbGJhY2tWTm9kZSxcbiAgICAgICAgICBjb250YWluZXIyLFxuICAgICAgICAgIGFuY2hvcjIsXG4gICAgICAgICAgcGFyZW50Q29tcG9uZW50MixcbiAgICAgICAgICBudWxsLFxuICAgICAgICAgIC8vIGZhbGxiYWNrIHRyZWUgd2lsbCBub3QgaGF2ZSBzdXNwZW5zZSBjb250ZXh0XG4gICAgICAgICAgbmFtZXNwYWNlMixcbiAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgb3B0aW1pemVkXG4gICAgICAgICk7XG4gICAgICAgIHNldEFjdGl2ZUJyYW5jaChzdXNwZW5zZSwgZmFsbGJhY2tWTm9kZSk7XG4gICAgICB9O1xuICAgICAgY29uc3QgZGVsYXlFbnRlciA9IGZhbGxiYWNrVk5vZGUudHJhbnNpdGlvbiAmJiBmYWxsYmFja1ZOb2RlLnRyYW5zaXRpb24ubW9kZSA9PT0gXCJvdXQtaW5cIjtcbiAgICAgIGlmIChkZWxheUVudGVyKSB7XG4gICAgICAgIGFjdGl2ZUJyYW5jaC50cmFuc2l0aW9uLmFmdGVyTGVhdmUgPSBtb3VudEZhbGxiYWNrO1xuICAgICAgfVxuICAgICAgc3VzcGVuc2UuaXNJbkZhbGxiYWNrID0gdHJ1ZTtcbiAgICAgIHVubW91bnQoXG4gICAgICAgIGFjdGl2ZUJyYW5jaCxcbiAgICAgICAgcGFyZW50Q29tcG9uZW50MixcbiAgICAgICAgbnVsbCxcbiAgICAgICAgLy8gbm8gc3VzcGVuc2Ugc28gdW5tb3VudCBob29rcyBmaXJlIG5vd1xuICAgICAgICB0cnVlXG4gICAgICAgIC8vIHNob3VsZFJlbW92ZVxuICAgICAgKTtcbiAgICAgIGlmICghZGVsYXlFbnRlcikge1xuICAgICAgICBtb3VudEZhbGxiYWNrKCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBtb3ZlKGNvbnRhaW5lcjIsIGFuY2hvcjIsIHR5cGUpIHtcbiAgICAgIHN1c3BlbnNlLmFjdGl2ZUJyYW5jaCAmJiBtb3ZlKHN1c3BlbnNlLmFjdGl2ZUJyYW5jaCwgY29udGFpbmVyMiwgYW5jaG9yMiwgdHlwZSk7XG4gICAgICBzdXNwZW5zZS5jb250YWluZXIgPSBjb250YWluZXIyO1xuICAgIH0sXG4gICAgbmV4dCgpIHtcbiAgICAgIHJldHVybiBzdXNwZW5zZS5hY3RpdmVCcmFuY2ggJiYgbmV4dChzdXNwZW5zZS5hY3RpdmVCcmFuY2gpO1xuICAgIH0sXG4gICAgcmVnaXN0ZXJEZXAoaW5zdGFuY2UsIHNldHVwUmVuZGVyRWZmZWN0LCBvcHRpbWl6ZWQyKSB7XG4gICAgICBjb25zdCBpc0luUGVuZGluZ1N1c3BlbnNlID0gISFzdXNwZW5zZS5wZW5kaW5nQnJhbmNoO1xuICAgICAgaWYgKGlzSW5QZW5kaW5nU3VzcGVuc2UpIHtcbiAgICAgICAgc3VzcGVuc2UuZGVwcysrO1xuICAgICAgfVxuICAgICAgY29uc3QgaHlkcmF0ZWRFbCA9IGluc3RhbmNlLnZub2RlLmVsO1xuICAgICAgaW5zdGFuY2UuYXN5bmNEZXAuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICBoYW5kbGVFcnJvcihlcnIsIGluc3RhbmNlLCAwKTtcbiAgICAgIH0pLnRoZW4oKGFzeW5jU2V0dXBSZXN1bHQpID0+IHtcbiAgICAgICAgaWYgKGluc3RhbmNlLmlzVW5tb3VudGVkIHx8IHN1c3BlbnNlLmlzVW5tb3VudGVkIHx8IHN1c3BlbnNlLnBlbmRpbmdJZCAhPT0gaW5zdGFuY2Uuc3VzcGVuc2VJZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpbnN0YW5jZS5hc3luY1Jlc29sdmVkID0gdHJ1ZTtcbiAgICAgICAgY29uc3QgeyB2bm9kZTogdm5vZGUyIH0gPSBpbnN0YW5jZTtcbiAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICBwdXNoV2FybmluZ0NvbnRleHQodm5vZGUyKTtcbiAgICAgICAgfVxuICAgICAgICBoYW5kbGVTZXR1cFJlc3VsdChpbnN0YW5jZSwgYXN5bmNTZXR1cFJlc3VsdCwgZmFsc2UpO1xuICAgICAgICBpZiAoaHlkcmF0ZWRFbCkge1xuICAgICAgICAgIHZub2RlMi5lbCA9IGh5ZHJhdGVkRWw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGxhY2Vob2xkZXIgPSAhaHlkcmF0ZWRFbCAmJiBpbnN0YW5jZS5zdWJUcmVlLmVsO1xuICAgICAgICBzZXR1cFJlbmRlckVmZmVjdChcbiAgICAgICAgICBpbnN0YW5jZSxcbiAgICAgICAgICB2bm9kZTIsXG4gICAgICAgICAgLy8gY29tcG9uZW50IG1heSBoYXZlIGJlZW4gbW92ZWQgYmVmb3JlIHJlc29sdmUuXG4gICAgICAgICAgLy8gaWYgdGhpcyBpcyBub3QgYSBoeWRyYXRpb24sIGluc3RhbmNlLnN1YlRyZWUgd2lsbCBiZSB0aGUgY29tbWVudFxuICAgICAgICAgIC8vIHBsYWNlaG9sZG
20578VyLlxuICAgICAgICAgIHBhcmVudE5vZGUoaHlkcmF0ZWRFbCB8fCBpbnN0YW5jZS5zdWJUcmVlLmVsKSxcbiAgICAgICAgICAvLyBhbmNob3Igd2lsbCBub3QgYmUgdXNlZCBpZiB0aGlzIGlzIGh5ZHJhdGlvbiwgc28gb25seSBuZWVkIHRvXG4gICAgICAgICAgLy8gY29uc2lkZXIgdGhlIGNvbW1lbnQgcGxhY2Vob2xkZXIgY2FzZS5cbiAgICAgICAgICBoeWRyYXRlZEVsID8gbnVsbCA6IG5leHQoaW5zdGFuY2Uuc3ViVHJlZSksXG4gICAgICAgICAgc3VzcGVuc2UsXG4gICAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICAgIG9wdGltaXplZDJcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHBsYWNlaG9sZGVyKSB7XG4gICAgICAgICAgcmVtb3ZlKHBsYWNlaG9sZGVyKTtcbiAgICAgICAgfVxuICAgICAgICB1cGRhdGVIT0NIb3N0RWwoaW5zdGFuY2UsIHZub2RlMi5lbCk7XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgcG9wV2FybmluZ0NvbnRleHQoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNJblBlbmRpbmdTdXNwZW5zZSAmJiAtLXN1c3BlbnNlLmRlcHMgPT09IDApIHtcbiAgICAgICAgICBzdXNwZW5zZS5yZXNvbHZlKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0sXG4gICAgdW5tb3VudChwYXJlbnRTdXNwZW5zZTIsIGRvUmVtb3ZlKSB7XG4gICAgICBzdXNwZW5zZS5pc1VubW91bnRlZCA9IHRydWU7XG4gICAgICBpZiAoc3VzcGVuc2UuYWN0aXZlQnJhbmNoKSB7XG4gICAgICAgIHVubW91bnQoXG4gICAgICAgICAgc3VzcGVuc2UuYWN0aXZlQnJhbmNoLFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICBwYXJlbnRTdXNwZW5zZTIsXG4gICAgICAgICAgZG9SZW1vdmVcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChzdXNwZW5zZS5wZW5kaW5nQnJhbmNoKSB7XG4gICAgICAgIHVubW91bnQoXG4gICAgICAgICAgc3VzcGVuc2UucGVuZGluZ0JyYW5jaCxcbiAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgcGFyZW50U3VzcGVuc2UyLFxuICAgICAgICAgIGRvUmVtb3ZlXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICByZXR1cm4gc3VzcGVuc2U7XG59XG5mdW5jdGlvbiBoeWRyYXRlU3VzcGVuc2Uobm9kZSwgdm5vZGUsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIG5hbWVzcGFjZSwgc2xvdFNjb3BlSWRzLCBvcHRpbWl6ZWQsIHJlbmRlcmVySW50ZXJuYWxzLCBoeWRyYXRlTm9kZSkge1xuICBjb25zdCBzdXNwZW5zZSA9IHZub2RlLnN1c3BlbnNlID0gY3JlYXRlU3VzcGVuc2VCb3VuZGFyeShcbiAgICB2bm9kZSxcbiAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgbm9kZS5wYXJlbnROb2RlLFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLWdsb2JhbHNcbiAgICBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpLFxuICAgIG51bGwsXG4gICAgbmFtZXNwYWNlLFxuICAgIHNsb3RTY29wZUlkcyxcbiAgICBvcHRpbWl6ZWQsXG4gICAgcmVuZGVyZXJJbnRlcm5hbHMsXG4gICAgdHJ1ZVxuICApO1xuICBjb25zdCByZXN1bHQgPSBoeWRyYXRlTm9kZShcbiAgICBub2RlLFxuICAgIHN1c3BlbnNlLnBlbmRpbmdCcmFuY2ggPSB2bm9kZS5zc0NvbnRlbnQsXG4gICAgcGFyZW50Q29tcG9uZW50LFxuICAgIHN1c3BlbnNlLFxuICAgIHNsb3RTY29wZUlkcyxcbiAgICBvcHRpbWl6ZWRcbiAgKTtcbiAgaWYgKHN1c3BlbnNlLmRlcHMgPT09IDApIHtcbiAgICBzdXNwZW5zZS5yZXNvbHZlKGZhbHNlLCB0cnVlKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gbm9ybWFsaXplU3VzcGVuc2VDaGlsZHJlbih2bm9kZSkge1xuICBjb25zdCB7IHNoYXBlRmxhZywgY2hpbGRyZW4gfSA9IHZub2RlO1xuICBjb25zdCBpc1Nsb3RDaGlsZHJlbiA9IHNoYXBlRmxhZyAmIDMyO1xuICB2bm9kZS5zc0NvbnRlbnQgPSBub3JtYWxpemVTdXNwZW5zZVNsb3QoXG4gICAgaXNTbG90Q2hpbGRyZW4gPyBjaGlsZHJlbi5kZWZhdWx0IDogY2hpbGRyZW5cbiAgKTtcbiAgdm5vZGUuc3NGYWxsYmFjayA9IGlzU2xvdENoaWxkcmVuID8gbm9ybWFsaXplU3VzcGVuc2VTbG90KGNoaWxkcmVuLmZhbGxiYWNrKSA6IGNyZWF0ZVZOb2RlKENvbW1lbnQpO1xufVxuZnVuY3Rpb24gbm9ybWFsaXplU3VzcGVuc2VTbG90KHMpIHtcbiAgbGV0IGJsb2NrO1xuICBpZiAoaXNGdW5jdGlvbihzKSkge1xuICAgIGNvbnN0IHRyYWNrQmxvY2sgPSBpc0Jsb2NrVHJlZUVuYWJsZWQgJiYgcy5fYztcbiAgICBpZiAodHJhY2tCbG9jaykge1xuICAgICAgcy5fZCA9IGZhbHNlO1xuICAgICAgb3BlbkJsb2NrKCk7XG4gICAgfVxuICAgIHMgPSBzKCk7XG4gICAgaWYgKHRyYWNrQmxvY2spIHtcbiAgICAgIHMuX2QgPSB0cnVlO1xuICAgICAgYmxvY2sgPSBjdXJyZW50QmxvY2s7XG4gICAgICBjbG9zZUJsb2NrKCk7XG4gICAgfVxuICB9XG4gIGlmIChpc0FycmF5KHMpKSB7XG4gICAgY29uc3Qgc2luZ2xlQ2hpbGQgPSBmaWx0ZXJTaW5nbGVSb290KHMpO1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmICFzaW5nbGVDaGlsZCAmJiBzLmZpbHRlcigoY2hpbGQpID0+IGNoaWxkICE9PSBOVUxMX0RZTkFNSUNfQ09NUE9ORU5UKS5sZW5ndGggPiAwKSB7XG4gICAgICB3YXJuJDEoYDxTdXNwZW5zZT4gc2xvdHMgZXhwZWN0IGEgc2luZ2xlIHJvb3Qgbm9kZS5gKTtcbiAgICB9XG4gICAgcyA9IHNpbmdsZUNoaWxkO1xuICB9XG4gIHMgPSBub3JtYWxpemVWTm9kZShzKTtcbiAgaWYgKGJsb2NrICYmICFzLmR5bmFtaWNDaGlsZHJlbikge1xuICAgIHMuZHluYW1pY0NoaWxkcmVuID0gYmxvY2suZmlsdGVyKChjKSA9PiBjICE9PSBzKTtcbiAgfVxuICByZXR1cm4gcztcbn1cbmZ1bmN0aW9uIHF1ZXVlRWZmZWN0V2l0aFN1c3BlbnNlKGZuLCBzdXNwZW5zZSkge1xuICBpZiAoc3VzcGVuc2UgJiYgc3VzcGVuc2UucGVuZGluZ0JyYW5jaCkge1xuICAgIGlmIChpc0FycmF
205785KGZuKSkge1xuICAgICAgc3VzcGVuc2UuZWZmZWN0cy5wdXNoKC4uLmZuKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3VzcGVuc2UuZWZmZWN0cy5wdXNoKGZuKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcXVldWVQb3N0Rmx1c2hDYihmbik7XG4gIH1cbn1cbmZ1bmN0aW9uIHNldEFjdGl2ZUJyYW5jaChzdXNwZW5zZSwgYnJhbmNoKSB7XG4gIHN1c3BlbnNlLmFjdGl2ZUJyYW5jaCA9IGJyYW5jaDtcbiAgY29uc3QgeyB2bm9kZSwgcGFyZW50Q29tcG9uZW50IH0gPSBzdXNwZW5zZTtcbiAgbGV0IGVsID0gYnJhbmNoLmVsO1xuICB3aGlsZSAoIWVsICYmIGJyYW5jaC5jb21wb25lbnQpIHtcbiAgICBicmFuY2ggPSBicmFuY2guY29tcG9uZW50LnN1YlRyZWU7XG4gICAgZWwgPSBicmFuY2guZWw7XG4gIH1cbiAgdm5vZGUuZWwgPSBlbDtcbiAgaWYgKHBhcmVudENvbXBvbmVudCAmJiBwYXJlbnRDb21wb25lbnQuc3ViVHJlZSA9PT0gdm5vZGUpIHtcbiAgICBwYXJlbnRDb21wb25lbnQudm5vZGUuZWwgPSBlbDtcbiAgICB1cGRhdGVIT0NIb3N0RWwocGFyZW50Q29tcG9uZW50LCBlbCk7XG4gIH1cbn1cbmZ1bmN0aW9uIGlzVk5vZGVTdXNwZW5zaWJsZSh2bm9kZSkge1xuICBjb25zdCBzdXNwZW5zaWJsZSA9IHZub2RlLnByb3BzICYmIHZub2RlLnByb3BzLnN1c3BlbnNpYmxlO1xuICByZXR1cm4gc3VzcGVuc2libGUgIT0gbnVsbCAmJiBzdXNwZW5zaWJsZSAhPT0gZmFsc2U7XG59XG5cbmNvbnN0IEZyYWdtZW50ID0gU3ltYm9sLmZvcihcInYtZmd0XCIpO1xuY29uc3QgVGV4dCA9IFN5bWJvbC5mb3IoXCJ2LXR4dFwiKTtcbmNvbnN0IENvbW1lbnQgPSBTeW1ib2wuZm9yKFwidi1jbXRcIik7XG5jb25zdCBTdGF0aWMgPSBTeW1ib2wuZm9yKFwidi1zdGNcIik7XG5jb25zdCBibG9ja1N0YWNrID0gW107XG5sZXQgY3VycmVudEJsb2NrID0gbnVsbDtcbmZ1bmN0aW9uIG9wZW5CbG9jayhkaXNhYmxlVHJhY2tpbmcgPSBmYWxzZSkge1xuICBibG9ja1N0YWNrLnB1c2goY3VycmVudEJsb2NrID0gZGlzYWJsZVRyYWNraW5nID8gbnVsbCA6IFtdKTtcbn1cbmZ1bmN0aW9uIGNsb3NlQmxvY2soKSB7XG4gIGJsb2NrU3RhY2sucG9wKCk7XG4gIGN1cnJlbnRCbG9jayA9IGJsb2NrU3RhY2tbYmxvY2tTdGFjay5sZW5ndGggLSAxXSB8fCBudWxsO1xufVxubGV0IGlzQmxvY2tUcmVlRW5hYmxlZCA9IDE7XG5mdW5jdGlvbiBzZXRCbG9ja1RyYWNraW5nKHZhbHVlKSB7XG4gIGlzQmxvY2tUcmVlRW5hYmxlZCArPSB2YWx1ZTtcbiAgaWYgKHZhbHVlIDwgMCAmJiBjdXJyZW50QmxvY2spIHtcbiAgICBjdXJyZW50QmxvY2suaGFzT25jZSA9IHRydWU7XG4gIH1cbn1cbmZ1bmN0aW9uIHNldHVwQmxvY2sodm5vZGUpIHtcbiAgdm5vZGUuZHluYW1pY0NoaWxkcmVuID0gaXNCbG9ja1RyZWVFbmFibGVkID4gMCA/IGN1cnJlbnRCbG9jayB8fCBFTVBUWV9BUlIgOiBudWxsO1xuICBjbG9zZUJsb2NrKCk7XG4gIGlmIChpc0Jsb2NrVHJlZUVuYWJsZWQgPiAwICYmIGN1cnJlbnRCbG9jaykge1xuICAgIGN1cnJlbnRCbG9jay5wdXNoKHZub2RlKTtcbiAgfVxuICByZXR1cm4gdm5vZGU7XG59XG5mdW5jdGlvbiBjcmVhdGVFbGVtZW50QmxvY2sodHlwZSwgcHJvcHMsIGNoaWxkcmVuLCBwYXRjaEZsYWcsIGR5bmFtaWNQcm9wcywgc2hhcGVGbGFnKSB7XG4gIHJldHVybiBzZXR1cEJsb2NrKFxuICAgIGNyZWF0ZUJhc2VWTm9kZShcbiAgICAgIHR5cGUsXG4gICAgICBwcm9wcyxcbiAgICAgIGNoaWxkcmVuLFxuICAgICAgcGF0Y2hGbGFnLFxuICAgICAgZHluYW1pY1Byb3BzLFxuICAgICAgc2hhcGVGbGFnLFxuICAgICAgdHJ1ZVxuICAgIClcbiAgKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUJsb2NrKHR5cGUsIHByb3BzLCBjaGlsZHJlbiwgcGF0Y2hGbGFnLCBkeW5hbWljUHJvcHMpIHtcbiAgcmV0dXJuIHNldHVwQmxvY2soXG4gICAgY3JlYXRlVk5vZGUoXG4gICAgICB0eXBlLFxuICAgICAgcHJvcHMsXG4gICAgICBjaGlsZHJlbixcbiAgICAgIHBhdGNoRmxhZyxcbiAgICAgIGR5bmFtaWNQcm9wcyxcbiAgICAgIHRydWVcbiAgICApXG4gICk7XG59XG5mdW5jdGlvbiBpc1ZOb2RlKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA/IHZhbHVlLl9fdl9pc1ZOb2RlID09PSB0cnVlIDogZmFsc2U7XG59XG5mdW5jdGlvbiBpc1NhbWVWTm9kZVR5cGUobjEsIG4yKSB7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIG4yLnNoYXBlRmxhZyAmIDYgJiYgbjEuY29tcG9uZW50KSB7XG4gICAgY29uc3QgZGlydHlJbnN0YW5jZXMgPSBobXJEaXJ0eUNvbXBvbmVudHMuZ2V0KG4yLnR5cGUpO1xuICAgIGlmIChkaXJ0eUluc3RhbmNlcyAmJiBkaXJ0eUluc3RhbmNlcy5oYXMobjEuY29tcG9uZW50KSkge1xuICAgICAgbjEuc2hhcGVGbGFnICY9IH4yNTY7XG4gICAgICBuMi5zaGFwZUZsYWcgJj0gfjUxMjtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG4xLnR5cGUgPT09IG4yLnR5cGUgJiYgbjEua2V5ID09PSBuMi5rZXk7XG59XG5sZXQgdm5vZGVBcmdzVHJhbnNmb3JtZXI7XG5mdW5jdGlvbiB0cmFuc2Zvcm1WTm9kZUFyZ3ModHJhbnNmb3JtZXIpIHtcbiAgdm5vZGVBcmdzVHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lcjtcbn1cbmNvbnN0IGNyZWF0ZVZOb2RlV2l0aEFyZ3NUcmFuc2Zvcm0gPSAoLi4uYXJncykgPT4ge1xuICByZXR1cm4gX2NyZWF0ZVZOb2RlKFxuICAgIC4uLnZub2RlQXJnc1RyYW5zZm9ybWVyID8gdm5vZGVBcmdzVHJhbnNmb3JtZXIoYXJncywgY3VycmVudFJlbmRlcmluZ0luc3RhbmNlKSA6IGFyZ3NcbiAgKTtcbn07XG5jb25zdCBub3JtYWxpemVLZXkgPSAoeyBrZXkgfSkgPT4ga2V5ICE9IG51bGwgPyBrZXkgOiBudWxsO1xuY29uc3Qgbm9ybWFsaXplUmVmID0gKHtcbiAgcmVmLFxuICByZWZfa2V5LFxuICByZWZfZm9yXG59KSA9PiB7XG4gIGlmICh0eXBlb2YgcmVmID09PSBcIm51bWJlclwiKSB7XG4gICAgcmVmID0gXCJcIiArIHJlZjtcbiAgfVxuICByZXR1cm4gcmVmICE9IG51bGwgPyBpc1N0cmluZyhyZWYpIHx8IGlzUmVmKHJlZikgfHwgaXNGdW5jdGlvbihyZWYpID8gey
20578BpOiBjdXJyZW50UmVuZGVyaW5nSW5zdGFuY2UsIHI6IHJlZiwgazogcmVmX2tleSwgZjogISFyZWZfZm9yIH0gOiByZWYgOiBudWxsO1xufTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VWTm9kZSh0eXBlLCBwcm9wcyA9IG51bGwsIGNoaWxkcmVuID0gbnVsbCwgcGF0Y2hGbGFnID0gMCwgZHluYW1pY1Byb3BzID0gbnVsbCwgc2hhcGVGbGFnID0gdHlwZSA9PT0gRnJhZ21lbnQgPyAwIDogMSwgaXNCbG9ja05vZGUgPSBmYWxzZSwgbmVlZEZ1bGxDaGlsZHJlbk5vcm1hbGl6YXRpb24gPSBmYWxzZSkge1xuICBjb25zdCB2bm9kZSA9IHtcbiAgICBfX3ZfaXNWTm9kZTogdHJ1ZSxcbiAgICBfX3Zfc2tpcDogdHJ1ZSxcbiAgICB0eXBlLFxuICAgIHByb3BzLFxuICAgIGtleTogcHJvcHMgJiYgbm9ybWFsaXplS2V5KHByb3BzKSxcbiAgICByZWY6IHByb3BzICYmIG5vcm1hbGl6ZVJlZihwcm9wcyksXG4gICAgc2NvcGVJZDogY3VycmVudFNjb3BlSWQsXG4gICAgc2xvdFNjb3BlSWRzOiBudWxsLFxuICAgIGNoaWxkcmVuLFxuICAgIGNvbXBvbmVudDogbnVsbCxcbiAgICBzdXNwZW5zZTogbnVsbCxcbiAgICBzc0NvbnRlbnQ6IG51bGwsXG4gICAgc3NGYWxsYmFjazogbnVsbCxcbiAgICBkaXJzOiBudWxsLFxuICAgIHRyYW5zaXRpb246IG51bGwsXG4gICAgZWw6IG51bGwsXG4gICAgYW5jaG9yOiBudWxsLFxuICAgIHRhcmdldDogbnVsbCxcbiAgICB0YXJnZXRTdGFydDogbnVsbCxcbiAgICB0YXJnZXRBbmNob3I6IG51bGwsXG4gICAgc3RhdGljQ291bnQ6IDAsXG4gICAgc2hhcGVGbGFnLFxuICAgIHBhdGNoRmxhZyxcbiAgICBkeW5hbWljUHJvcHMsXG4gICAgZHluYW1pY0NoaWxkcmVuOiBudWxsLFxuICAgIGFwcENvbnRleHQ6IG51bGwsXG4gICAgY3R4OiBjdXJyZW50UmVuZGVyaW5nSW5zdGFuY2VcbiAgfTtcbiAgaWYgKG5lZWRGdWxsQ2hpbGRyZW5Ob3JtYWxpemF0aW9uKSB7XG4gICAgbm9ybWFsaXplQ2hpbGRyZW4odm5vZGUsIGNoaWxkcmVuKTtcbiAgICBpZiAoc2hhcGVGbGFnICYgMTI4KSB7XG4gICAgICB0eXBlLm5vcm1hbGl6ZSh2bm9kZSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGNoaWxkcmVuKSB7XG4gICAgdm5vZGUuc2hhcGVGbGFnIHw9IGlzU3RyaW5nKGNoaWxkcmVuKSA/IDggOiAxNjtcbiAgfVxuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiB2bm9kZS5rZXkgIT09IHZub2RlLmtleSkge1xuICAgIHdhcm4kMShgVk5vZGUgY3JlYXRlZCB3aXRoIGludmFsaWQga2V5IChOYU4pLiBWTm9kZSB0eXBlOmAsIHZub2RlLnR5cGUpO1xuICB9XG4gIGlmIChpc0Jsb2NrVHJlZUVuYWJsZWQgPiAwICYmIC8vIGF2b2lkIGEgYmxvY2sgbm9kZSBmcm9tIHRyYWNraW5nIGl0c2VsZlxuICAhaXNCbG9ja05vZGUgJiYgLy8gaGFzIGN1cnJlbnQgcGFyZW50IGJsb2NrXG4gIGN1cnJlbnRCbG9jayAmJiAvLyBwcmVzZW5jZSBvZiBhIHBhdGNoIGZsYWcgaW5kaWNhdGVzIHRoaXMgbm9kZSBuZWVkcyBwYXRjaGluZyBvbiB1cGRhdGVzLlxuICAvLyBjb21wb25lbnQgbm9kZXMgYWxzbyBzaG91bGQgYWx3YXlzIGJlIHBhdGNoZWQsIGJlY2F1c2UgZXZlbiBpZiB0aGVcbiAgLy8gY29tcG9uZW50IGRvZXNuJ3QgbmVlZCB0byB1cGRhdGUsIGl0IG5lZWRzIHRvIHBlcnNpc3QgdGhlIGluc3RhbmNlIG9uIHRvXG4gIC8vIHRoZSBuZXh0IHZub2RlIHNvIHRoYXQgaXQgY2FuIGJlIHByb3Blcmx5IHVubW91bnRlZCBsYXRlci5cbiAgKHZub2RlLnBhdGNoRmxhZyA+IDAgfHwgc2hhcGVGbGFnICYgNikgJiYgLy8gdGhlIEVWRU5UUyBmbGFnIGlzIG9ubHkgZm9yIGh5ZHJhdGlvbiBhbmQgaWYgaXQgaXMgdGhlIG9ubHkgZmxhZywgdGhlXG4gIC8vIHZub2RlIHNob3VsZCBub3QgYmUgY29uc2lkZXJlZCBkeW5hbWljIGR1ZSB0byBoYW5kbGVyIGNhY2hpbmcuXG4gIHZub2RlLnBhdGNoRmxhZyAhPT0gMzIpIHtcbiAgICBjdXJyZW50QmxvY2sucHVzaCh2bm9kZSk7XG4gIH1cbiAgcmV0dXJuIHZub2RlO1xufVxuY29uc3QgY3JlYXRlVk5vZGUgPSAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8gY3JlYXRlVk5vZGVXaXRoQXJnc1RyYW5zZm9ybSA6IF9jcmVhdGVWTm9kZTtcbmZ1bmN0aW9uIF9jcmVhdGVWTm9kZSh0eXBlLCBwcm9wcyA9IG51bGwsIGNoaWxkcmVuID0gbnVsbCwgcGF0Y2hGbGFnID0gMCwgZHluYW1pY1Byb3BzID0gbnVsbCwgaXNCbG9ja05vZGUgPSBmYWxzZSkge1xuICBpZiAoIXR5cGUgfHwgdHlwZSA9PT0gTlVMTF9EWU5BTUlDX0NPTVBPTkVOVCkge1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmICF0eXBlKSB7XG4gICAgICB3YXJuJDEoYEludmFsaWQgdm5vZGUgdHlwZSB3aGVuIGNyZWF0aW5nIHZub2RlOiAke3R5cGV9LmApO1xuICAgIH1cbiAgICB0eXBlID0gQ29tbWVudDtcbiAgfVxuICBpZiAoaXNWTm9kZSh0eXBlKSkge1xuICAgIGNvbnN0IGNsb25lZCA9IGNsb25lVk5vZGUoXG4gICAgICB0eXBlLFxuICAgICAgcHJvcHMsXG4gICAgICB0cnVlXG4gICAgICAvKiBtZXJnZVJlZjogdHJ1ZSAqL1xuICAgICk7XG4gICAgaWYgKGNoaWxkcmVuKSB7XG4gICAgICBub3JtYWxpemVDaGlsZHJlbihjbG9uZWQsIGNoaWxkcmVuKTtcbiAgICB9XG4gICAgaWYgKGlzQmxvY2tUcmVlRW5hYmxlZCA+IDAgJiYgIWlzQmxvY2tOb2RlICYmIGN1cnJlbnRCbG9jaykge1xuICAgICAgaWYgKGNsb25lZC5zaGFwZUZsYWcgJiA2KSB7XG4gICAgICAgIGN1cnJlbnRCbG9ja1tjdXJyZW50QmxvY2suaW5kZXhPZih0eXBlKV0gPSBjbG9uZWQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjdXJyZW50QmxvY2sucHVzaChjbG9uZWQpO1xuICAgICAgfVxuICAgIH1cbiAgICBjbG9uZWQucGF0Y2hGbGFnID0gLTI7XG4gICAgcmV0dXJuIGNsb25lZDtcbiAgfVxuICBpZiAoaXNDbGFzc0NvbXBvbmVudCh0eXBlKSkge1xuICAgIHR5cGUgPSB0eXBlLl9fdmNjT3B0cztcbiAgfVxuICBpZiAocHJvcHMpIHtcbiAgICBwcm9wcyA9IGd1YXJkUmVhY3RpdmVQcm9wcyhwcm9wcyk7XG4gICAgbGV0IHsgY2xhc3M6IGtsYXNzLCBzdHlsZSB9ID0gcHJvcHM7XG4gICAgaWYgKGtsYXNzICYmICFpc1N0cmluZyhrbGFzcykpIHtcbiAgICAgIHByb3BzLmNsYXNzID0gbm9ybWFsaXplQ2xhc3Moa2xhc3MpO1xuICAgIH1cbiAgICBpZiAoaXNPYmplY3Qoc3R5bGUpKSB7XG4gICAgICBpZiAoaXNQcm94eShzdHlsZSkgJiYgIWlzQXJyYXkoc3R5bGUpKSB7XG4gICAgICAgI
20578HN0eWxlID0gZXh0ZW5kKHt9LCBzdHlsZSk7XG4gICAgICB9XG4gICAgICBwcm9wcy5zdHlsZSA9IG5vcm1hbGl6ZVN0eWxlKHN0eWxlKTtcbiAgICB9XG4gIH1cbiAgY29uc3Qgc2hhcGVGbGFnID0gaXNTdHJpbmcodHlwZSkgPyAxIDogaXNTdXNwZW5zZSh0eXBlKSA/IDEyOCA6IGlzVGVsZXBvcnQodHlwZSkgPyA2NCA6IGlzT2JqZWN0KHR5cGUpID8gNCA6IGlzRnVuY3Rpb24odHlwZSkgPyAyIDogMDtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgc2hhcGVGbGFnICYgNCAmJiBpc1Byb3h5KHR5cGUpKSB7XG4gICAgdHlwZSA9IHRvUmF3KHR5cGUpO1xuICAgIHdhcm4kMShcbiAgICAgIGBWdWUgcmVjZWl2ZWQgYSBDb21wb25lbnQgdGhhdCB3YXMgbWFkZSBhIHJlYWN0aXZlIG9iamVjdC4gVGhpcyBjYW4gbGVhZCB0byB1bm5lY2Vzc2FyeSBwZXJmb3JtYW5jZSBvdmVyaGVhZCBhbmQgc2hvdWxkIGJlIGF2b2lkZWQgYnkgbWFya2luZyB0aGUgY29tcG9uZW50IHdpdGggXFxgbWFya1Jhd1xcYCBvciB1c2luZyBcXGBzaGFsbG93UmVmXFxgIGluc3RlYWQgb2YgXFxgcmVmXFxgLmAsXG4gICAgICBgXG5Db21wb25lbnQgdGhhdCB3YXMgbWFkZSByZWFjdGl2ZTogYCxcbiAgICAgIHR5cGVcbiAgICApO1xuICB9XG4gIHJldHVybiBjcmVhdGVCYXNlVk5vZGUoXG4gICAgdHlwZSxcbiAgICBwcm9wcyxcbiAgICBjaGlsZHJlbixcbiAgICBwYXRjaEZsYWcsXG4gICAgZHluYW1pY1Byb3BzLFxuICAgIHNoYXBlRmxhZyxcbiAgICBpc0Jsb2NrTm9kZSxcbiAgICB0cnVlXG4gICk7XG59XG5mdW5jdGlvbiBndWFyZFJlYWN0aXZlUHJvcHMocHJvcHMpIHtcbiAgaWYgKCFwcm9wcykgcmV0dXJuIG51bGw7XG4gIHJldHVybiBpc1Byb3h5KHByb3BzKSB8fCBpc0ludGVybmFsT2JqZWN0KHByb3BzKSA/IGV4dGVuZCh7fSwgcHJvcHMpIDogcHJvcHM7XG59XG5mdW5jdGlvbiBjbG9uZVZOb2RlKHZub2RlLCBleHRyYVByb3BzLCBtZXJnZVJlZiA9IGZhbHNlLCBjbG9uZVRyYW5zaXRpb24gPSBmYWxzZSkge1xuICBjb25zdCB7IHByb3BzLCByZWYsIHBhdGNoRmxhZywgY2hpbGRyZW4sIHRyYW5zaXRpb24gfSA9IHZub2RlO1xuICBjb25zdCBtZXJnZWRQcm9wcyA9IGV4dHJhUHJvcHMgPyBtZXJnZVByb3BzKHByb3BzIHx8IHt9LCBleHRyYVByb3BzKSA6IHByb3BzO1xuICBjb25zdCBjbG9uZWQgPSB7XG4gICAgX192X2lzVk5vZGU6IHRydWUsXG4gICAgX192X3NraXA6IHRydWUsXG4gICAgdHlwZTogdm5vZGUudHlwZSxcbiAgICBwcm9wczogbWVyZ2VkUHJvcHMsXG4gICAga2V5OiBtZXJnZWRQcm9wcyAmJiBub3JtYWxpemVLZXkobWVyZ2VkUHJvcHMpLFxuICAgIHJlZjogZXh0cmFQcm9wcyAmJiBleHRyYVByb3BzLnJlZiA/IChcbiAgICAgIC8vICMyMDc4IGluIHRoZSBjYXNlIG9mIDxjb21wb25lbnQgOmlzPVwidm5vZGVcIiByZWY9XCJleHRyYVwiLz5cbiAgICAgIC8vIGlmIHRoZSB2bm9kZSBpdHNlbGYgYWxyZWFkeSBoYXMgYSByZWYsIGNsb25lVk5vZGUgd2lsbCBuZWVkIHRvIG1lcmdlXG4gICAgICAvLyB0aGUgcmVmcyBzbyB0aGUgc2luZ2xlIHZub2RlIGNhbiBiZSBzZXQgb24gbXVsdGlwbGUgcmVmc1xuICAgICAgbWVyZ2VSZWYgJiYgcmVmID8gaXNBcnJheShyZWYpID8gcmVmLmNvbmNhdChub3JtYWxpemVSZWYoZXh0cmFQcm9wcykpIDogW3JlZiwgbm9ybWFsaXplUmVmKGV4dHJhUHJvcHMpXSA6IG5vcm1hbGl6ZVJlZihleHRyYVByb3BzKVxuICAgICkgOiByZWYsXG4gICAgc2NvcGVJZDogdm5vZGUuc2NvcGVJZCxcbiAgICBzbG90U2NvcGVJZHM6IHZub2RlLnNsb3RTY29wZUlkcyxcbiAgICBjaGlsZHJlbjogISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBwYXRjaEZsYWcgPT09IC0xICYmIGlzQXJyYXkoY2hpbGRyZW4pID8gY2hpbGRyZW4ubWFwKGRlZXBDbG9uZVZOb2RlKSA6IGNoaWxkcmVuLFxuICAgIHRhcmdldDogdm5vZGUudGFyZ2V0LFxuICAgIHRhcmdldFN0YXJ0OiB2bm9kZS50YXJnZXRTdGFydCxcbiAgICB0YXJnZXRBbmNob3I6IHZub2RlLnRhcmdldEFuY2hvcixcbiAgICBzdGF0aWNDb3VudDogdm5vZGUuc3RhdGljQ291bnQsXG4gICAgc2hhcGVGbGFnOiB2bm9kZS5zaGFwZUZsYWcsXG4gICAgLy8gaWYgdGhlIHZub2RlIGlzIGNsb25lZCB3aXRoIGV4dHJhIHByb3BzLCB3ZSBjYW4gbm8gbG9uZ2VyIGFzc3VtZSBpdHNcbiAgICAvLyBleGlzdGluZyBwYXRjaCBmbGFnIHRvIGJlIHJlbGlhYmxlIGFuZCBuZWVkIHRvIGFkZCB0aGUgRlVMTF9QUk9QUyBmbGFnLlxuICAgIC8vIG5vdGU6IHByZXNlcnZlIGZsYWcgZm9yIGZyYWdtZW50cyBzaW5jZSB0aGV5IHVzZSB0aGUgZmxhZyBmb3IgY2hpbGRyZW5cbiAgICAvLyBmYXN0IHBhdGhzIG9ubHkuXG4gICAgcGF0Y2hGbGFnOiBleHRyYVByb3BzICYmIHZub2RlLnR5cGUgIT09IEZyYWdtZW50ID8gcGF0Y2hGbGFnID09PSAtMSA/IDE2IDogcGF0Y2hGbGFnIHwgMTYgOiBwYXRjaEZsYWcsXG4gICAgZHluYW1pY1Byb3BzOiB2bm9kZS5keW5hbWljUHJvcHMsXG4gICAgZHluYW1pY0NoaWxkcmVuOiB2bm9kZS5keW5hbWljQ2hpbGRyZW4sXG4gICAgYXBwQ29udGV4dDogdm5vZGUuYXBwQ29udGV4dCxcbiAgICBkaXJzOiB2bm9kZS5kaXJzLFxuICAgIHRyYW5zaXRpb24sXG4gICAgLy8gVGhlc2Ugc2hvdWxkIHRlY2huaWNhbGx5IG9ubHkgYmUgbm9uLW51bGwgb24gbW91bnRlZCBWTm9kZXMuIEhvd2V2ZXIsXG4gICAgLy8gdGhleSAqc2hvdWxkKiBiZSBjb3BpZWQgZm9yIGtlcHQtYWxpdmUgdm5vZGVzLiBTbyB3ZSBqdXN0IGFsd2F5cyBjb3B5XG4gICAgLy8gdGhlbSBzaW5jZSB0aGVtIGJlaW5nIG5vbi1udWxsIGR1cmluZyBhIG1vdW50IGRvZXNuJ3QgYWZmZWN0IHRoZSBsb2dpYyBhc1xuICAgIC8vIHRoZXkgd2lsbCBzaW1wbHkgYmUgb3ZlcndyaXR0ZW4uXG4gICAgY29tcG9uZW50OiB2bm9kZS5jb21wb25lbnQsXG4gICAgc3VzcGVuc2U6IHZub2RlLnN1c3BlbnNlLFxuICAgIHNzQ29udGVudDogdm5vZGUuc3NDb250ZW50ICYmIGNsb25lVk5vZGUodm5vZGUuc3NDb250ZW50KSxcbiAgICBzc0ZhbGxiYWNrOiB2bm9kZS5zc0ZhbGxiYWNrICYmIGNsb25lVk5vZGUodm5vZGUuc3NGYWxsYmFjayksXG4gICAgZWw6IHZub2Rl
20578LmVsLFxuICAgIGFuY2hvcjogdm5vZGUuYW5jaG9yLFxuICAgIGN0eDogdm5vZGUuY3R4LFxuICAgIGNlOiB2bm9kZS5jZVxuICB9O1xuICBpZiAodHJhbnNpdGlvbiAmJiBjbG9uZVRyYW5zaXRpb24pIHtcbiAgICBzZXRUcmFuc2l0aW9uSG9va3MoXG4gICAgICBjbG9uZWQsXG4gICAgICB0cmFuc2l0aW9uLmNsb25lKGNsb25lZClcbiAgICApO1xuICB9XG4gIHJldHVybiBjbG9uZWQ7XG59XG5mdW5jdGlvbiBkZWVwQ2xvbmVWTm9kZSh2bm9kZSkge1xuICBjb25zdCBjbG9uZWQgPSBjbG9uZVZOb2RlKHZub2RlKTtcbiAgaWYgKGlzQXJyYXkodm5vZGUuY2hpbGRyZW4pKSB7XG4gICAgY2xvbmVkLmNoaWxkcmVuID0gdm5vZGUuY2hpbGRyZW4ubWFwKGRlZXBDbG9uZVZOb2RlKTtcbiAgfVxuICByZXR1cm4gY2xvbmVkO1xufVxuZnVuY3Rpb24gY3JlYXRlVGV4dFZOb2RlKHRleHQgPSBcIiBcIiwgZmxhZyA9IDApIHtcbiAgcmV0dXJuIGNyZWF0ZVZOb2RlKFRleHQsIG51bGwsIHRleHQsIGZsYWcpO1xufVxuZnVuY3Rpb24gY3JlYXRlU3RhdGljVk5vZGUoY29udGVudCwgbnVtYmVyT2ZOb2Rlcykge1xuICBjb25zdCB2bm9kZSA9IGNyZWF0ZVZOb2RlKFN0YXRpYywgbnVsbCwgY29udGVudCk7XG4gIHZub2RlLnN0YXRpY0NvdW50ID0gbnVtYmVyT2ZOb2RlcztcbiAgcmV0dXJuIHZub2RlO1xufVxuZnVuY3Rpb24gY3JlYXRlQ29tbWVudFZOb2RlKHRleHQgPSBcIlwiLCBhc0Jsb2NrID0gZmFsc2UpIHtcbiAgcmV0dXJuIGFzQmxvY2sgPyAob3BlbkJsb2NrKCksIGNyZWF0ZUJsb2NrKENvbW1lbnQsIG51bGwsIHRleHQpKSA6IGNyZWF0ZVZOb2RlKENvbW1lbnQsIG51bGwsIHRleHQpO1xufVxuZnVuY3Rpb24gbm9ybWFsaXplVk5vZGUoY2hpbGQpIHtcbiAgaWYgKGNoaWxkID09IG51bGwgfHwgdHlwZW9mIGNoaWxkID09PSBcImJvb2xlYW5cIikge1xuICAgIHJldHVybiBjcmVhdGVWTm9kZShDb21tZW50KTtcbiAgfSBlbHNlIGlmIChpc0FycmF5KGNoaWxkKSkge1xuICAgIHJldHVybiBjcmVhdGVWTm9kZShcbiAgICAgIEZyYWdtZW50LFxuICAgICAgbnVsbCxcbiAgICAgIC8vICMzNjY2LCBhdm9pZCByZWZlcmVuY2UgcG9sbHV0aW9uIHdoZW4gcmV1c2luZyB2bm9kZVxuICAgICAgY2hpbGQuc2xpY2UoKVxuICAgICk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGNoaWxkID09PSBcIm9iamVjdFwiKSB7XG4gICAgcmV0dXJuIGNsb25lSWZNb3VudGVkKGNoaWxkKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gY3JlYXRlVk5vZGUoVGV4dCwgbnVsbCwgU3RyaW5nKGNoaWxkKSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGNsb25lSWZNb3VudGVkKGNoaWxkKSB7XG4gIHJldHVybiBjaGlsZC5lbCA9PT0gbnVsbCAmJiBjaGlsZC5wYXRjaEZsYWcgIT09IC0xIHx8IGNoaWxkLm1lbW8gPyBjaGlsZCA6IGNsb25lVk5vZGUoY2hpbGQpO1xufVxuZnVuY3Rpb24gbm9ybWFsaXplQ2hpbGRyZW4odm5vZGUsIGNoaWxkcmVuKSB7XG4gIGxldCB0eXBlID0gMDtcbiAgY29uc3QgeyBzaGFwZUZsYWcgfSA9IHZub2RlO1xuICBpZiAoY2hpbGRyZW4gPT0gbnVsbCkge1xuICAgIGNoaWxkcmVuID0gbnVsbDtcbiAgfSBlbHNlIGlmIChpc0FycmF5KGNoaWxkcmVuKSkge1xuICAgIHR5cGUgPSAxNjtcbiAgfSBlbHNlIGlmICh0eXBlb2YgY2hpbGRyZW4gPT09IFwib2JqZWN0XCIpIHtcbiAgICBpZiAoc2hhcGVGbGFnICYgKDEgfCA2NCkpIHtcbiAgICAgIGNvbnN0IHNsb3QgPSBjaGlsZHJlbi5kZWZhdWx0O
205781xuICAgICAgaWYgKHNsb3QpIHtcbiAgICAgICAgc2xvdC5fYyAmJiAoc2xvdC5fZCA9IGZhbHNlKTtcbiAgICAgICAgbm9ybWFsaXplQ2hpbGRyZW4odm5vZGUsIHNsb3QoKSk7XG4gICAgICAgIHNsb3QuX2MgJiYgKHNsb3QuX2QgPSB0cnVlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2Uge1xuICAgICAgdHlwZSA9IDMyO1xuICAgICAgY29uc3Qgc2xvdEZsYWcgPSBjaGlsZHJlbi5fO1xuICAgICAgaWYgKCFzbG90RmxhZyAmJiAhaXNJbnRlcm5hbE9iamVjdChjaGlsZHJlbikpIHtcbiAgICAgICAgY2hpbGRyZW4uX2N0eCA9IGN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZTtcbiAgICAgIH0gZWxzZSBpZiAoc2xvdEZsYWcgPT09IDMgJiYgY3VycmVudFJlbmRlcmluZ0luc3RhbmNlKSB7XG4gICAgICAgIGlmIChjdXJyZW50UmVuZGVyaW5nSW5zdGFuY2Uuc2xvdHMuXyA9PT0gMSkge1xuICAgICAgICAgIGNoaWxkcmVuLl8gPSAxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNoaWxkcmVuLl8gPSAyO1xuICAgICAgICAgIHZub2RlLnBhdGNoRmxhZyB8PSAxMDI0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzRnVuY3Rpb24oY2hpbGRyZW4pKSB7XG4gICAgY2hpbGRyZW4gPSB7IGRlZmF1bHQ6IGNoaWxkcmVuLCBfY3R4OiBjdXJyZW50UmVuZGVyaW5nSW5zdGFuY2UgfTtcbiAgICB0eXBlID0gMzI7XG4gIH0gZWxzZSB7XG4gICAgY2hpbGRyZW4gPSBTdHJpbmcoY2hpbGRyZW4pO1xuICAgIGlmIChzaGFwZUZsYWcgJiA2NCkge1xuICAgICAgdHlwZSA9IDE2O1xuICAgICAgY2hpbGRyZW4gPSBbY3JlYXRlVGV4dFZOb2RlKGNoaWxkcmVuKV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHR5cGUgPSA4O1xuICAgIH1cbiAgfVxuICB2bm9kZS5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICB2bm9kZS5zaGFwZUZsYWcgfD0gdHlwZTtcbn1cbmZ1bmN0aW9uIG1lcmdlUHJvcHMoLi4uYXJncykge1xuICBjb25zdCByZXQgPSB7fTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgdG9NZXJnZSA9IGFyZ3NbaV07XG4gICAgZm9yIChjb25zdCBrZXkgaW4gdG9NZXJnZSkge1xuICAgICAgaWYgKGtleSA9PT0gXCJjbGFzc1wiKSB7XG4gICAgICAgIGlmIChyZXQuY2xhc3MgIT09IHRvTWVyZ2UuY2xhc3MpIHtcbiAgICAgICAgICByZXQuY2xhc3MgPSBub3JtYWxpemVDbGFzcyhbcmV0LmNsYXNzLCB0b01lcmdlLmNsYXNzXSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSBcInN0eWxlXCIpIHtcbiAgICAgICAgcmV0LnN0eWxlID0gbm9ybWFsaXplU3R5bGUoW3JldC5zdHlsZSwgdG9NZXJnZS5zdHlsZV0pO1xuICAgICAgfSBlbHNlIGlmIChpc09uKGtleSkpIHtcbiAgICAgICAgY29uc3QgZXhpc3RpbmcgPSByZXRba2V5XTtcbiAgICAgICAgY29uc3QgaW5jb21pbmcgPSB0b01lcmdlW2tleV07XG4gICAgICAgIGlmIChpbmNvbWluZyAmJiBleGlzdGluZyAhPT0gaW5jb21pbmcgJiYgIShpc0FycmF5KGV4aXN0aW5nKSAmJiBleGlzdGluZy5pbmNsdWRlcyhpbmNvbWluZykpKSB7XG4gICAgICAgICAgcmV0W2tleV0gPSBleGlzdGluZyA/IFtdLmNvbmNhdChleGlzdGluZywgaW5jb21pbmcpIDogaW5jb21pbmc7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoa2V5ICE9PSBcIlwiKSB7XG4gICAgICAgIHJldFtrZXldID0gdG9NZXJnZVtrZXldO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gcmV0O1xufVxuZnVuY3Rpb24gaW52b2tlVk5vZGVIb29rKGhvb2ssIGluc3RhbmNlLCB2bm9kZSwgcHJldlZOb2RlID0gbnVsbCkge1xuICBjYWxsV2l0aEFzeW5jRXJyb3JIYW5kbGluZyhob29rLCBpbnN0YW5jZSwgNywgW1xuICAgIHZub2RlLFxuICAgIHByZXZWTm9kZVxuICBdKTtcbn1cblxuY29uc3QgZW1wdHlBcHBDb250ZXh0ID0gY3JlYXRlQXBwQ29udGV4dCgpO1xubGV0IHVpZCA9IDA7XG5mdW5jdGlvbiBjcmVhdGVDb21wb25lbnRJbnN0YW5jZSh2bm9kZSwgcGFyZW50LCBzdXNwZW5zZSkge1xuICBjb25zdCB0eXBlID0gdm5vZGUudHlwZTtcbiAgY29uc3QgYXBwQ29udGV4dCA9IChwYXJlbnQgPyBwYXJlbnQuYXBwQ29udGV4dCA6IHZub2RlLmFwcENvbnRleHQpIHx8IGVtcHR5QXBwQ29udGV4dDtcbiAgY29uc3QgaW5zdGFuY2UgPSB7XG4gICAgdWlkOiB1aWQrKyxcbiAgICB2bm9kZSxcbiAgICB0eXBlLFxuICAgIHBhcmVudCxcbiAgICBhcHBDb250ZXh0LFxuICAgIHJvb3Q6IG51bGwsXG4gICAgLy8gdG8gYmUgaW1tZWRpYXRlbHkgc2V0XG4gICAgbmV4dDogbnVsbCxcbiAgICBzdWJUcmVlOiBudWxsLFxuICAgIC8vIHdpbGwgYmUgc2V0IHN5bmNocm9ub3VzbHkgcmlnaHQgYWZ0ZXIgY3JlYXRpb25cbiAgICBlZmZlY3Q6IG51bGwsXG4gICAgdXBkYXRlOiBudWxsLFxuICAgIC8vIHdpbGwgYmUgc2V0IHN5bmNocm9ub3VzbHkgcmlnaHQgYWZ0ZXIgY3JlYXRpb25cbiAgICBzY29wZTogbmV3IEVmZmVjdFNjb3BlKFxuICAgICAgdHJ1ZVxuICAgICAgLyogZGV0YWNoZWQgKi9cbiAgICApLFxuICAgIHJlbmRlcjogbnVsbCxcbiAgICBwcm94eTogbnVsbCxcbiAgICBleHBvc2VkOiBudWxsLFxuICAgIGV4cG9zZVByb3h5OiBudWxsLFxuICAgIHdpdGhQcm94eTogbnVsbCxcbiAgICBwcm92aWRlczogcGFyZW50ID8gcGFyZW50LnByb3ZpZGVzIDogT2JqZWN0LmNyZWF0ZShhcHBDb250ZXh0LnByb3ZpZGVzKSxcbiAgICBhY2Nlc3NDYWNoZTogbnVsbCxcbiAgICByZW5kZXJDYWNoZTogW10sXG4gICAgLy8gbG9jYWwgcmVzb2x2ZWQgYXNzZXRzXG4gICAgY29tcG9uZW50czogbnVsbCxcbiAgICBkaXJlY3RpdmVzOiBudWxsLFxuICAgIC8vIHJlc29sdmVkIHByb3BzIGFuZCBlbWl0cyBvcHRpb25zXG4gICAgcHJvcHNPcHRpb25zOiBub3JtYWxpemVQcm9wc09wdGlvbnModHlwZSwgYXBwQ29udGV4dCksXG4gICAgZW1pdHNPcHRpb25zOiBub3JtYWxpemVFbWl0c09wdGlvbnModHlwZSwgYXBwQ29udGV4dCksXG4gICAgLy8gZW1pdFxuICAgIGVtaXQ6IG51bGwsXG4gICAgLy8gdG8gYmUgc2V0IGltbWVkaWF0ZWx5XG4gICAgZW1pdHRlZDogbnVsbCxcbiAgICAvLyBwcm9wcyBkZWZhdWx0IHZhbHVlXG4gICAgcHJvcHNEZWZh
20578dWx0czogRU1QVFlfT0JKLFxuICAgIC8vIGluaGVyaXRBdHRyc1xuICAgIGluaGVyaXRBdHRyczogdHlwZS5pbmhlcml0QXR0cnMsXG4gICAgLy8gc3RhdGVcbiAgICBjdHg6IEVNUFRZX09CSixcbiAgICBkYXRhOiBFTVBUWV9PQkosXG4gICAgcHJvcHM6IEVNUFRZX09CSixcbiAgICBhdHRyczogRU1QVFlfT0JKLFxuICAgIHNsb3RzOiBFTVBUWV9PQkosXG4gICAgcmVmczogRU1QVFlfT0JKLFxuICAgIHNldHVwU3RhdGU6IEVNUFRZX09CSixcbiAgICBzZXR1cENvbnRleHQ6IG51bGwsXG4gICAgLy8gc3VzcGVuc2UgcmVsYXRlZFxuICAgIHN1c3BlbnNlLFxuICAgIHN1c3BlbnNlSWQ6IHN1c3BlbnNlID8gc3VzcGVuc2UucGVuZGluZ0lkIDogMCxcbiAgICBhc3luY0RlcDogbnVsbCxcbiAgICBhc3luY1Jlc29sdmVkOiBmYWxzZSxcbiAgICAvLyBsaWZlY3ljbGUgaG9va3NcbiAgICAvLyBub3QgdXNpbmcgZW51bXMgaGVyZSBiZWNhdXNlIGl0IHJlc3VsdHMgaW4gY29tcHV0ZWQgcHJvcGVydGllc1xuICAgIGlzTW91bnRlZDogZmFsc2UsXG4gICAgaXNVbm1vdW50ZWQ6IGZhbHNlLFxuICAgIGlzRGVhY3RpdmF0ZWQ6IGZhbHNlLFxuICAgIGJjOiBudWxsLFxuICAgIGM6IG51bGwsXG4gICAgYm06IG51bGwsXG4gICAgbTogbnVsbCxcbiAgICBidTogbnVsbCxcbiAgICB1OiBudWxsLFxuICAgIHVtOiBudWxsLFxuICAgIGJ1bTogbnVsbCxcbiAgICBkYTogbnVsbCxcbiAgICBhOiBudWxsLFxuICAgIHJ0ZzogbnVsbCxcbiAgICBydGM6IG51bGwsXG4gICAgZWM6IG51bGwsXG4gICAgc3A6IG51bGxcbiAgfTtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICBpbnN0YW5jZS5jdHggPSBjcmVhdGVEZXZSZW5kZXJDb250ZXh0KGluc3RhbmNlKTtcbiAgfSBlbHNlIHtcbiAgICBpbnN0YW5jZS5jdHggPSB7IF86IGluc3RhbmNlIH07XG4gIH1cbiAgaW5zdGFuY2Uucm9vdCA9IHBhcmVudCA/IHBhcmVudC5yb290IDogaW5zdGFuY2U7XG4gIGluc3RhbmNlLmVtaXQgPSBlbWl0LmJpbmQobnVsbCwgaW5zdGFuY2UpO1xuICBpZiAodm5vZGUuY2UpIHtcbiAgICB2bm9kZS5jZShpbnN0YW5jZSk7XG4gIH1cbiAgcmV0dXJuIGluc3RhbmNlO1xufVxubGV0IGN1cnJlbnRJbnN0YW5jZSA9IG51bGw7XG5jb25zdCBnZXRDdXJyZW50SW5zdGFuY2UgPSAoKSA9PiBjdXJyZW50SW5zdGFuY2UgfHwgY3VycmVudFJlbmRlcmluZ0luc3RhbmNlO1xubGV0IGludGVybmFsU2V0Q3VycmVudEluc3RhbmNlO1xubGV0IHNldEluU1NSU2V0dXBTdGF0ZTtcbntcbiAgY29uc3QgZyA9IGdldEdsb2JhbFRoaXMoKTtcbiAgY29uc3QgcmVnaXN0ZXJHbG9iYWxTZXR0ZXIgPSAoa2V5LCBzZXR0ZXIpID0+IHtcbiAgICBsZXQgc2V0dGVycztcbiAgICBpZiAoIShzZXR0ZXJzID0gZ1trZXldKSkgc2V0dGVycyA9IGdba2V5XSA9IFtdO1xuICAgIHNldHRlcnMucHVzaChzZXR0ZXIpO1xuICAgIHJldHVybiAodikgPT4ge1xuICAgICAgaWYgKHNldHRlcnMubGVuZ3RoID4gMSkgc2V0dGVycy5mb3JFYWNoKChzZXQpID0+IHNldCh2KSk7XG4gICAgICBlbHNlIHNldHRlcnNbMF0odik7XG4gICAgfTtcbiAgfTtcbiAgaW50ZXJuYWxTZXRDdXJyZW50SW5zdGFuY2UgPSByZWdpc3Rlckdsb2JhbFNldHRlcihcbiAgICBgX19WVUVfSU5TVEFOQ0VfU0VUVEVSU19fYCxcbiAgICAodikgPT4gY3VycmVudEluc3RhbmNlID0gdlxuICApO1xuICBzZXRJblNTUlNldHVwU3RhdGUgPSByZWdpc3Rlckdsb2JhbFNldHRlcihcbiAgICBgX19WVUVfU1NSX1NFVFRFUlNfX2AsXG4gICAgKHYpID0+IGlzSW5TU1JDb21wb25lbnRTZXR1cCA9IHZcbiAgKTtcbn1cbmNvbnN0IHNldEN1cnJlbnRJbnN0YW5jZSA9IChpbnN0YW5jZSkgPT4ge1xuICBjb25zdCBwcmV2ID0gY3VycmVudEluc3RhbmNlO1xuICBpbnRlcm5hbFNldEN1cnJlbnRJbnN0YW5jZShpbnN0YW5jZSk7XG4gIGluc3RhbmNlLnNjb3BlLm9uKCk7XG4gIHJldHVybiAoKSA9PiB7XG4gICAgaW5zdGFuY2Uuc2NvcGUub2ZmKCk7XG4gICAgaW50ZXJuYWxTZXRDdXJyZW50SW5zdGFuY2UocHJldik7XG4gIH07XG59O1xuY29uc3QgdW5zZXRDdXJyZW50SW5zdGFuY2UgPSAoKSA9PiB7XG4gIGN1cnJlbnRJbnN0YW5jZSAmJiBjdXJyZW50SW5zdGFuY2Uuc2NvcGUub2ZmKCk7XG4gIGludGVybmFsU2V0Q3VycmVudEluc3RhbmNlKG51bGwpO1xufTtcbmNvbnN0IGlzQnVpbHRJblRhZyA9IC8qIEBfX1BVUkVfXyAqLyBtYWtlTWFwKFwic2xvdCxjb21wb25lbnRcIik7XG5mdW5jdGlvbiB2YWxpZGF0ZUNvbXBvbmVudE5hbWUobmFtZSwgeyBpc05hdGl2ZVRhZyB9KSB7XG4gIGlmIChpc0J1aWx0SW5UYWcobmFtZSkgfHwgaXNOYXRpdmVUYWcobmFtZSkpIHtcbiAgICB3YXJuJDEoXG4gICAgICBcIkRvIG5vdCB1c2UgYnVpbHQtaW4gb3IgcmVzZXJ2ZWQgSFRNTCBlbGVtZW50cyBhcyBjb21wb25lbnQgaWQ6IFwiICsgbmFtZVxuICAgICk7XG4gIH1cbn1cbmZ1bmN0aW9uIGlzU3RhdGVmdWxDb21wb25lbnQoaW5zdGFuY2UpIHtcbiAgcmV0dXJuIGluc3RhbmNlLnZub2RlLnNoYXBlRmxhZyAmIDQ7XG59XG5sZXQgaXNJblNTUkNvbXBvbmVudFNldHVwID0gZmFsc2U7XG5mdW5jdGlvbiBzZXR1cENvbXBvbmVudChpbnN0YW5jZSwgaXNTU1IgPSBmYWxzZSwgb3B0aW1pemVkID0gZmFsc2UpIHtcbiAgaXNTU1IgJiYgc2V0SW5TU1JTZXR1cFN0YXRlKGlzU1NSKTtcbiAgY29uc3QgeyBwcm9wcywgY2hpbGRyZW4gfSA9IGluc3RhbmNlLnZub2RlO1xuICBjb25zdCBpc1N0YXRlZnVsI
20578D0gaXNTdGF0ZWZ1bENvbXBvbmVudChpbnN0YW5jZSk7XG4gIGluaXRQcm9wcyhpbnN0YW5jZSwgcHJvcHMsIGlzU3RhdGVmdWwsIGlzU1NSKTtcbiAgaW5pdFNsb3RzKGluc3RhbmNlLCBjaGlsZHJlbiwgb3B0aW1pemVkKTtcbiAgY29uc3Qgc2V0dXBSZXN1bHQgPSBpc1N0YXRlZnVsID8gc2V0dXBTdGF0ZWZ1bENvbXBvbmVudChpbnN0YW5jZSwgaXNTU1IpIDogdm9pZCAwO1xuICBpc1NTUiAmJiBzZXRJblNTUlNldHVwU3RhdGUoZmFsc2UpO1xuICByZXR1cm4gc2V0dXBSZXN1bHQ7XG59XG5mdW5jdGlvbiBzZXR1cFN0YXRlZnVsQ29tcG9uZW50KGluc3RhbmNlLCBpc1NTUikge1xuICB2YXIgX2E7XG4gIGNvbnN0IENvbXBvbmVudCA9IGluc3RhbmNlLnR5cGU7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgaWYgKENvbXBvbmVudC5uYW1lKSB7XG4gICAgICB2YWxpZGF0ZUNvbXBvbmVudE5hbWUoQ29tcG9uZW50Lm5hbWUsIGluc3RhbmNlLmFwcENvbnRleHQuY29uZmlnKTtcbiAgICB9XG4gICAgaWYgKENvbXBvbmVudC5jb21wb25lbnRzKSB7XG4gICAgICBjb25zdCBuYW1lcyA9IE9iamVjdC5rZXlzKENvbXBvbmVudC5jb21wb25lbnRzKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFsaWRhdGVDb21wb25lbnROYW1lKG5hbWVzW2ldLCBpbnN0YW5jZS5hcHBDb250ZXh0LmNvbmZpZyk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChDb21wb25lbnQuZGlyZWN0aXZlcykge1xuICAgICAgY29uc3QgbmFtZXMgPSBPYmplY3Qua2V5cyhDb21wb25lbnQuZGlyZWN0aXZlcyk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhbGlkYXRlRGlyZWN0aXZlTmFtZShuYW1lc1tpXSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChDb21wb25lbnQuY29tcGlsZXJPcHRpb25zICYmIGlzUnVudGltZU9ubHkoKSkge1xuICAgICAgd2FybiQxKFxuICAgICAgICBgXCJjb21waWxlck9wdGlvbnNcIiBpcyBvbmx5IHN1cHBvcnRlZCB3aGVuIHVzaW5nIGEgYnVpbGQgb2YgVnVlIHRoYXQgaW5jbHVkZXMgdGhlIHJ1bnRpbWUgY29tcGlsZXIuIFNpbmNlIHlvdSBhcmUgdXNpbmcgYSBydW50aW1lLW9ubHkgYnVpbGQsIHRoZSBvcHRpb25zIHNob3VsZCBiZSBwYXNzZWQgdmlhIHlvdXIgYnVpbGQgdG9vbCBjb25maWcgaW5zdGVhZC5gXG4gICAgICApO1xuICAgIH1cbiAgfVxuICBpbnN0YW5jZS5hY2Nlc3NDYWNoZSA9IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpO1xuICBpbnN0YW5jZS5wcm94eSA9IG5ldyBQcm94eShpbnN0YW5jZS5jdHgsIFB1YmxpY0luc3RhbmNlUHJveHlIYW5kbGVycyk7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgZXhwb3NlUHJvcHNPblJlbmRlckNvbnRleHQoaW5zdGFuY2UpO1xuICB9XG4gIGNvbnN0IHsgc2V0dXAgfSA9IENvbXBvbmVudDtcbiAgaWYgKHNldHVwKSB7XG4gICAgY29uc3Qgc2V0dXBDb250ZXh0ID0gaW5zdGFuY2Uuc2V0dXBDb250ZXh0ID0gc2V0dXAubGVuZ3RoID4gMSA/IGNyZWF0ZVNldHVwQ29udGV4dChpbnN0YW5jZSkgOiBudWxsO1xuICAgIGNvbnN0IHJlc2V0ID0gc2V0Q3VycmVudEluc3RhbmNlKGluc3RhbmNlKTtcbiAgICBwYXVzZVRyYWNraW5nKCk7XG4gICAgY29uc3Qgc2V0dXBSZXN1bHQgPSBjYWxsV2l0aEVycm9ySGFuZGxpbmcoXG4gICAgICBzZXR1cCxcbiAgICAgIGluc3RhbmNlLFxuICAgICAgMCxcbiAgICAgIFtcbiAgICAgICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IHNoYWxsb3dSZWFkb25seShpbnN0YW5jZS5wcm9wcykgOiBpbnN0YW5jZS5wcm9wcyxcbiAgICAgICAgc2V0dXBDb250ZXh0XG4gICAgICBdXG4gICAgKTtcbiAgICByZXNldFRyYWNraW5nKCk7XG4gICAgcmVzZXQoKTtcbiAgICBpZiAoaXNQcm9taXNlKHNldHVwUmVzdWx0KSkge1xuICAgICAgc2V0dXBSZXN1bHQudGhlbih1bnNldEN1cnJlbnRJbnN0YW5jZSwgdW5zZXRDdXJyZW50SW5zdGFuY2UpO1xuICAgICAgaWYgKGlzU1NSKSB7XG4gICAgICAgIHJldHVybiBzZXR1cFJlc3VsdC50aGVuKChyZXNvbHZlZFJlc3VsdCkgPT4ge1xuICAgICAgICAgIGhhbmRsZVNldHVwUmVzdWx0KGluc3RhbmNlLCByZXNvbHZlZFJlc3VsdCwgaXNTU1IpO1xuICAgICAgICB9KS5jYXRjaCgoZSkgPT4ge1xuICAgICAgICAgIGhhbmRsZUVycm9yKGUsIGluc3RhbmNlLCAwKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbnN0YW5jZS5hc3luY0RlcCA9IHNldHVwUmVzdWx0O1xuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAhaW5zdGFuY2Uuc3VzcGVuc2UpIHtcbiAgICAgICAgICBjb25zdCBuYW1lID0gKF9hID0gQ29tcG9uZW50Lm5hbWUpICE9IG51bGwgPyBfYSA6IFwiQW5vbnltb3VzXCI7XG4gICAgICAgICAgd2FybiQxKFxuICAgICAgICAgICAgYENvbXBvbmVudCA8JHtuYW1lfT46IHNldHVwIGZ1bmN0aW9uIHJldHVybmVkIGEgcHJvbWlzZSwgYnV0IG5vIDxTdXNwZW5zZT4gYm91bmRhcnkgd2FzIGZvdW5kIGluIHRoZSBwYXJlbnQgY29tcG9uZW50IHRyZWUuIEEgY29tcG9uZW50IHdpdGggYXN5bmMgc2V0dXAoKSBtdXN0IGJlIG5lc3RlZCBpbiBhIDxTdXNwZW5zZT4gaW4gb3JkZXIgdG8gYmUgcmVuZGVyZWQuYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaGFuZGxlU2V0dXBSZXN1bHQoaW5zdGFuY2UsIHNldHVwUmVzdWx0LCBpc1NTUik7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGZpbmlzaENvbXBvbmVudFNldHVwKGluc3RhbmNlLCBpc1NTUik7XG4gIH1cbn1cbmZ1bmN0aW9uIGhhbmRsZVNldHVwUmVzdWx0KGluc3RhbmNlLCBzZXR1cFJlc3VsdCwgaXNTU1IpIHtcbiAgaWYgKGlzRnVuY3Rpb24oc2V0dXBSZXN1bHQpKSB7XG4gICAgaWYgKGluc3RhbmNlLnR5cGUuX19zc3JJbmxpbmVSZW5kZXIpIHtcbiAgICAgIGluc3RhbmNlLnNzclJlbmRlciA9IHNldHVwUmVzdWx0O1xuICAgIH0gZWxzZSB7XG4gICAgICBpbnN0YW5jZS5yZW5kZXIgPSBzZXR1cFJlc3VsdDtcbiAgICB9XG4gI
20578H0gZWxzZSBpZiAoaXNPYmplY3Qoc2V0dXBSZXN1bHQpKSB7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgaXNWTm9kZShzZXR1cFJlc3VsdCkpIHtcbiAgICAgIHdhcm4kMShcbiAgICAgICAgYHNldHVwKCkgc2hvdWxkIG5vdCByZXR1cm4gVk5vZGVzIGRpcmVjdGx5IC0gcmV0dXJuIGEgcmVuZGVyIGZ1bmN0aW9uIGluc3RlYWQuYFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgX19WVUVfUFJPRF9ERVZUT09MU19fKSB7XG4gICAgICBpbnN0YW5jZS5kZXZ0b29sc1Jhd1NldHVwU3RhdGUgPSBzZXR1cFJlc3VsdDtcbiAgICB9XG4gICAgaW5zdGFuY2Uuc2V0dXBTdGF0ZSA9IHByb3h5UmVmcyhzZXR1cFJlc3VsdCk7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgIGV4cG9zZVNldHVwU3RhdGVPblJlbmRlckNvbnRleHQoaW5zdGFuY2UpO1xuICAgIH1cbiAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHNldHVwUmVzdWx0ICE9PSB2b2lkIDApIHtcbiAgICB3YXJuJDEoXG4gICAgICBgc2V0dXAoKSBzaG91bGQgcmV0dXJuIGFuIG9iamVjdC4gUmVjZWl2ZWQ6ICR7c2V0dXBSZXN1bHQgPT09IG51bGwgPyBcIm51bGxcIiA6IHR5cGVvZiBzZXR1cFJlc3VsdH1gXG4gICAgKTtcbiAgfVxuICBmaW5pc2hDb21wb25lbnRTZXR1cChpbnN0YW5jZSwgaXNTU1IpO1xufVxubGV0IGNvbXBpbGU7XG5sZXQgaW5zdGFsbFdpdGhQcm94eTtcbmZ1bmN0aW9uIHJlZ2lzdGVyUnVudGltZUNvbXBpbGVyKF9jb21waWxlKSB7XG4gIGNvbXBpbGUgPSBfY29tcGlsZTtcbiAgaW5zdGFsbFdpdGhQcm94eSA9IChpKSA9PiB7XG4gICAgaWYgKGkucmVuZGVyLl9yYykge1xuICAgICAgaS53aXRoUHJveHkgPSBuZXcgUHJveHkoaS5jdHgsIFJ1bnRpbWVDb21waWxlZFB1YmxpY0luc3RhbmNlUHJveHlIYW5kbGVycyk7XG4gICAgfVxuICB9O1xufVxuY29uc3QgaXNSdW50aW1lT25seSA9ICgpID0+ICFjb21waWxlO1xuZnVuY3Rpb24gZmluaXNoQ29tcG9uZW50U2V0dXAoaW5zdGFuY2UsIGlzU1NSLCBza2lwT3B0aW9ucykge1xuICBjb25zdCBDb21wb25lbnQgPSBpbnN0YW5jZS50eXBlO1xuICBpZiAoIWluc3RhbmNlLnJlbmRlcikge1xuICAgIGlmICghaXNTU1IgJiYgY29tcGlsZSAmJiAhQ29tcG9uZW50LnJlbmRlcikge1xuICAgICAgY29uc3QgdGVtcGxhdGUgPSBDb21wb25lbnQudGVtcGxhdGUgfHwgcmVzb2x2ZU1lcmdlZE9wdGlvbnMoaW5zdGFuY2UpLnRlbXBsYXRlO1xuICAgICAgaWYgKHRlbXBsYXRlKSB7XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgc3RhcnRNZWFzdXJlKGluc3RhbmNlLCBgY29tcGlsZWApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHsgaXNDdXN0b21FbGVtZW50LCBjb21waWxlck9wdGlvbnMgfSA9IGluc3RhbmNlLmFwcENvbnRleHQuY29uZmlnO1xuICAgICAgICBjb25zdCB7IGRlbGltaXRlcnMsIGNvbXBpbGVyT3B0aW9uczogY29tcG9uZW50Q29tcGlsZXJPcHRpb25zIH0gPSBDb21wb25lbnQ7XG4gICAgICAgIGNvbnN0IGZpbmFsQ29tcGlsZXJPcHRpb25zID0gZXh0ZW5kKFxuICAgICAgICAgIGV4dGVuZChcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaXNDdXN0b21FbGVtZW50LFxuICAgICAgICAgICAgICBkZWxpbWl0ZXJzXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29tcGlsZXJPcHRpb25zXG4gICAgICAgICAgKSxcbiAgICAgICAgICBjb21wb25lbnRDb21waWxlck9wdGlvbnNcbiAgICAgICAgKTtcbiAgICAgICAgQ29tcG9uZW50LnJlbmRlciA9IGNvbXBpbGUodGVtcGxhdGUsIGZpbmFsQ29tcGlsZXJPcHRpb25zKTtcbiAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICBlbmRNZWFzdXJlKGluc3RhbmNlLCBgY29tcGlsZWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGluc3RhbmNlLnJlbmRlciA9IENvbXBvbmVudC5yZW5kZXIgfHwgTk9PUDtcbiAgICBpZiAoaW5zdGFsbFdpdGhQcm94eSkge1xuICAgICAgaW5zdGFsbFdpdGhQcm94eShpbnN0YW5jZSk7XG4gICAgfVxuICB9XG4gIGlmIChfX1ZVRV9PUFRJT05TX0FQSV9fICYmIHRydWUpIHtcbiAgICBjb25zdCByZXNldCA9IHNldEN1cnJlbnRJbnN0YW5jZShpbnN0YW5jZSk7XG4gICAgcGF1c2VUcmFja2luZygpO1xuICAgIHRyeSB7XG4gICAgICBhcHBseU9wdGlvbnMoaW5zdGFuY2UpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICByZXNldFRyYWNraW5nKCk7XG4gICAgICByZXNldCgpO1xuICAgIH1cbiAgfVxuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAhQ29tcG9uZW50LnJlbmRlciAmJiBpbnN0YW5jZS5yZW5kZXIgPT09IE5PT1AgJiYgIWlzU1NSKSB7XG4gICAgaWYgKCFjb21waWxlICYmIENvbXBvbmVudC50ZW1wbGF0ZSkge1xuICAgICAgd2FybiQxKFxuICAgICAgICBgQ29tcG9uZW50IHByb3ZpZGVkIHRlbXBsYXRlIG9wdGlvbiBidXQgcnVudGltZSBjb21waWxhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGluIHRoaXMgYnVpbGQgb2YgVnVlLmAgKyAoYCBDb25maWd1cmUgeW91ciBidW5kbGVyIHRvIGFsaWFzIFwidnVlXCIgdG8gXCJ2dWUvZGlzdC92dWUuZXNtLWJ1bmRsZXIuanNcIi5gIClcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdhcm4kMShgQ29tcG9uZW50IGlzIG1pc3NpbmcgdGVtcGxhdGUgb3IgcmVuZGVyIGZ1bmN0aW9uOiBgLCBDb21wb25lbnQpO1xuICAgIH1cbiAgfVxufVxuY29uc3QgYXR0cnNQcm94eUhhbmRsZXJzID0gISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IHtcbiAgZ2V0KHRhcmdldCwga2V5KSB7XG4gICAgbWFya0F0dHJzQWNjZXNzZWQoKTtcbiAgICB0cmFjayh0YXJnZXQsIFwiZ2V0XCIsIFwiXCIpO1xuICAgIHJldHVybi
20578B0YXJnZXRba2V5XTtcbiAgfSxcbiAgc2V0KCkge1xuICAgIHdhcm4kMShgc2V0dXBDb250ZXh0LmF0dHJzIGlzIHJlYWRvbmx5LmApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSxcbiAgZGVsZXRlUHJvcGVydHkoKSB7XG4gICAgd2FybiQxKGBzZXR1cENvbnRleHQuYXR0cnMgaXMgcmVhZG9ubHkuYCk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59IDoge1xuICBnZXQodGFyZ2V0LCBrZXkpIHtcbiAgICB0cmFjayh0YXJnZXQsIFwiZ2V0XCIsIFwiXCIpO1xuICAgIHJldHVybiB0YXJnZXRba2V5XTtcbiAgfVxufTtcbmZ1bmN0aW9uIGdldFNsb3RzUHJveHkoaW5zdGFuY2UpIHtcbiAgcmV0dXJuIG5ldyBQcm94eShpbnN0YW5jZS5zbG90cywge1xuICAgIGdldCh0YXJnZXQsIGtleSkge1xuICAgICAgdHJhY2soaW5zdGFuY2UsIFwiZ2V0XCIsIFwiJHNsb3RzXCIpO1xuICAgICAgcmV0dXJuIHRhcmdldFtrZXldO1xuICAgIH1cbiAgfSk7XG59XG5mdW5jdGlvbiBjcmVhdGVTZXR1cENvbnRleHQoaW5zdGFuY2UpIHtcbiAgY29uc3QgZXhwb3NlID0gKGV4cG9zZWQpID0+IHtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgaWYgKGluc3RhbmNlLmV4cG9zZWQpIHtcbiAgICAgICAgd2FybiQxKGBleHBvc2UoKSBzaG91bGQgYmUgY2FsbGVkIG9ubHkgb25jZSBwZXIgc2V0dXAoKS5gKTtcbiAgICAgIH1cbiAgICAgIGlmIChleHBvc2VkICE9IG51bGwpIHtcbiAgICAgICAgbGV0IGV4cG9zZWRUeXBlID0gdHlwZW9mIGV4cG9zZWQ7XG4gICAgICAgIGlmIChleHBvc2VkVHlwZSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgIGlmIChpc0FycmF5KGV4cG9zZWQpKSB7XG4gICAgICAgICAgICBleHBvc2VkVHlwZSA9IFwiYXJyYXlcIjtcbiAgICAgICAgICB9IGVsc2UgaWYgKGlzUmVmKGV4cG9zZWQpKSB7XG4gICAgICAgICAgICBleHBvc2VkVHlwZSA9IFwicmVmXCI7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChleHBvc2VkVHlwZSAhPT0gXCJvYmplY3RcIikge1xuICAgICAgICAgIHdhcm4kMShcbiAgICAgICAgICAgIGBleHBvc2UoKSBzaG91bGQgYmUgcGFzc2VkIGEgcGxhaW4gb2JqZWN0LCByZWNlaXZlZCAke2V4cG9zZWRUeXBlfS5gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpbnN0YW5jZS5leHBvc2VkID0gZXhwb3NlZCB8fCB7fTtcbiAgfTtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICBsZXQgYXR0cnNQcm94eTtcbiAgICBsZXQgc2xvdHNQcm94eTtcbiAgICByZXR1cm4gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICBnZXQgYXR0cnMoKSB7XG4gICAgICAgIHJldHVybiBhdHRyc1Byb3h5IHx8IChhdHRyc1Byb3h5ID0gbmV3IFByb3h5KGluc3RhbmNlLmF0dHJzLCBhdHRyc1Byb3h5SGFuZGxlcnMpKTtcbiAgICAgIH0sXG4gICAgICBnZXQgc2xvdHMoKSB7XG4gICAgICAgIHJldHVybiBzbG90c1Byb3h5IHx8IChzbG90c1Byb3h5ID0gZ2V0U2xvdHNQcm94eShpbnN0YW5jZSkpO1xuICAgICAgfSxcbiAgICAgIGdldCBlbWl0KCkge1xuICAgICAgICByZXR1cm4gKGV2ZW50LCAuLi5hcmdzKSA9PiBpbnN0YW5jZS5lbWl0KGV2ZW50LCAuLi5hcmdzKTtcbiAgICAgIH0sXG4gICAgICBleHBvc2VcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4ge1xuICAgICAgYXR0cnM6IG5ldyBQcm94eShpbnN0YW5jZS5hdHRycywgYXR0cnNQcm94eUhhbmRsZXJzKSxcbiAgICAgIHNsb3RzOiBpbnN0YW5jZS5zbG90cyxcbiAgICAgIGVtaXQ6IGluc3RhbmNlLmVtaXQsXG4gICAgICBleHBvc2VcbiAgICB9O1xuICB9XG59XG5mdW5jdGlvbiBnZXRDb21wb25lbnRQdWJsaWNJbnN0YW5jZShpbnN0YW5jZSkge1xuICBpZiAoaW5zdGFuY2UuZXhwb3NlZCkge1xuICAgIHJldHVybiBpbnN0YW5jZS5leHBvc2VQcm94eSB8fCAoaW5zdGFuY2UuZXhwb3NlUHJveHkgPSBuZXcgUHJveHkocHJveHlSZWZzKG1hcmtSYXcoaW5zdGFuY2UuZXhwb3NlZCkpLCB7XG4gICAgICBnZXQodGFyZ2V0LCBrZXkpIHtcbiAgICAgICAgaWYgKGtleSBpbiB0YXJnZXQpIHtcbiAgICAgICAgICByZXR1cm4gdGFyZ2V0W2tleV07XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5IGluIHB1YmxpY1Byb3BlcnRpZXNNYXApIHtcbiAgICAgICAgICByZXR1cm4gcHVibGljUHJvcGVydGllc01hcFtrZXldKGluc3RhbmNlKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGhhcyh0YXJnZXQsIGtleSkge1xuICAgICAgICByZXR1cm4ga2V5IGluIHRhcmdldCB8fCBrZXkgaW4gcHVibGljUHJvcGVydGllc01hcDtcbiAgICAgIH1cbiAgICB9KSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGluc3RhbmNlLnByb3h5O1xuICB9XG59XG5jb25zdCBjbGFzc2lmeVJFID0gLyg/Ol58Wy1fXSkoXFx3KS9nO1xuY29uc3QgY2xhc3NpZnkgPSAoc3RyKSA9PiBzdHIucmVwbGFjZShjbGFzc2lmeVJFLCAoYykgPT4gYy50b1VwcGVyQ2FzZSgpKS5yZXBsYWNlKC9bLV9dL2csIFwiXCIpO1xuZnVuY3Rpb24gZ2V0Q29tcG9uZW50TmFtZShDb21wb25lbnQsIGluY2x1ZGVJbmZlcnJlZCA9IHRydWUpIHtcbiAgcmV0dXJuIGlzRnVuY3Rpb24oQ29tcG9uZW50KSA/IENvbXBvbmVudC5kaXNwbGF5TmFtZSB8fCBDb21wb25lbnQubmFtZSA6IENvbXBvbmVudC5uYW1lIHx8IGluY2x1ZGVJbmZlcnJlZCAmJiBDb21wb25lbnQuX19uYW1lO1xufVxuZnVuY3Rpb24gZm9ybWF0Q29tcG9uZW50TmFtZShpbnN0YW5jZSwgQ29tcG9uZW50LCBpc1Jvb3QgPSBmYWxzZSkge1xuICBsZXQgbmFtZSA9IGdldENvbXBvbmVudE5hbWUoQ29tcG9uZW50KTtcbiAgaWYgKCFuYW1lICYmIENvbXBvbmVudC5fX2ZpbGUpIHtcbiAgICBjb25zdCBtYXRjaCA9IENvbXBvbmVudC5fX2ZpbGUubWF0Y2goLyhbXi9cXFxcXSspXFwuXFx3KyQvKTtcbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgIG5hbWUgPSBtYXRjaFsxXTtcbiAgICB9XG4gIH1cbiAgaWYgKCFuYW1lICYmIGluc3RhbmNlICYmIGluc3RhbmNlLnBhcmVudCkge1xuICAgIGNvbnN0IGluZmVyRnJvbVJlZ2lzdHJ5ID0gKHJlZ2lzdHJ5KSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiByZWdpc3RyeSkge1xuICAgICAgICBpZiAocmVnaXN0cnlba2V5XSA9PT0gQ29tcG9uZW50KSB7XG4gICAgICAgICAgcmV0dXJuIGtleTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gICAgbmFtZSA9IGluZmVyRnJvbVJlZ2lzdHJ5KFxuICAgICAgaW5zdGFuY2UuY29tcG9uZW50cyB8fCBpbnN0YW5jZS5wYXJlbnQud
20578HlwZS5jb21wb25lbnRzXG4gICAgKSB8fCBpbmZlckZyb21SZWdpc3RyeShpbnN0YW5jZS5hcHBDb250ZXh0LmNvbXBvbmVudHMpO1xuICB9XG4gIHJldHVybiBuYW1lID8gY2xhc3NpZnkobmFtZSkgOiBpc1Jvb3QgPyBgQXBwYCA6IGBBbm9ueW1vdXNgO1xufVxuZnVuY3Rpb24gaXNDbGFzc0NvbXBvbmVudCh2YWx1ZSkge1xuICByZXR1cm4gaXNGdW5jdGlvbih2YWx1ZSkgJiYgXCJfX3ZjY09wdHNcIiBpbiB2YWx1ZTtcbn1cblxuY29uc3QgY29tcHV0ZWQgPSAoZ2V0dGVyT3JPcHRpb25zLCBkZWJ1Z09wdGlvbnMpID0+IHtcbiAgY29uc3QgYyA9IGNvbXB1dGVkJDEoZ2V0dGVyT3JPcHRpb25zLCBkZWJ1Z09wdGlvbnMsIGlzSW5TU1JDb21wb25lbnRTZXR1cCk7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgY29uc3QgaSA9IGdldEN1cnJlbnRJbnN0YW5jZSgpO1xuICAgIGlmIChpICYmIGkuYXBwQ29udGV4dC5jb25maWcud2FyblJlY3Vyc2l2ZUNvbXB1dGVkKSB7XG4gICAgICBjLl93YXJuUmVjdXJzaXZlID0gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGM7XG59O1xuXG5mdW5jdGlvbiBoKHR5cGUsIHByb3BzT3JDaGlsZHJlbiwgY2hpbGRyZW4pIHtcbiAgY29uc3QgbCA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gIGlmIChsID09PSAyKSB7XG4gICAgaWYgKGlzT2JqZWN0KHByb3BzT3JDaGlsZHJlbikgJiYgIWlzQXJyYXkocHJvcHNPckNoaWxkcmVuKSkge1xuICAgICAgaWYgKGlzVk5vZGUocHJvcHNPckNoaWxkcmVuKSkge1xuICAgICAgICByZXR1cm4gY3JlYXRlVk5vZGUodHlwZSwgbnVsbCwgW3Byb3BzT3JDaGlsZHJlbl0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNyZWF0ZVZOb2RlKHR5cGUsIHByb3BzT3JDaGlsZHJlbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBjcmVhdGVWTm9kZSh0eXBlLCBudWxsLCBwcm9wc09yQ2hpbGRyZW4pO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAobCA+IDMpIHtcbiAgICAgIGNoaWxkcmVuID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAyKTtcbiAgICB9IGVsc2UgaWYgKGwgPT09IDMgJiYgaXNWTm9kZShjaGlsZHJlbikpIHtcbiAgICAgIGNoaWxkcmVuID0gW2NoaWxkcmVuXTtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZVZOb2RlKHR5cGUsIHByb3BzT3JDaGlsZHJlbiwgY2hpbGRyZW4pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGluaXRDdXN0b21Gb3JtYXR0ZXIoKSB7XG4gIGlmICghISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCB0eXBlb2Ygd2luZG93ID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHZ1ZVN0eWxlID0geyBzdHlsZTogXCJjb2xvcjojM2JhNzc2XCIgfTtcbiAgY29uc3QgbnVtYmVyU3R5bGUgPSB7IHN0eWxlOiBcImNvbG9yOiMxNjc3ZmZcIiB9O1xuICBjb25zdCBzdHJpbmdTdHlsZSA9IHsgc3R5bGU6IFwiY29sb3I6I2Y1MjIyZFwiIH07XG4gIGNvbnN0IGtleXdvcmRTdHlsZSA9IHsgc3R5bGU6IFwiY29sb3I6I2ViMmY5NlwiIH07XG4gIGNvbnN0IGZvcm1hdHRlciA9IHtcbiAgICBfX3Z1ZV9jdXN0b21fZm9ybWF0dGVyOiB0cnVlLFxuICAgIGhlYWRlcihvYmopIHtcbiAgICAgIGlmICghaXNPYmplY3Qob2JqKSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGlmIChvYmouX19pc1Z1ZSkge1xuICAgICAgICByZXR1cm4gW1wiZGl2XCIsIHZ1ZVN0eWxlLCBgVnVlSW5zdGFuY2VgXTtcbiAgICAgIH0gZWxzZSBpZiAoaXNSZWYob2JqKSkge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAge30sXG4gICAgICAgICAgW1wic3BhblwiLCB2dWVTdHlsZSwgZ2VuUmVmRmxhZyhvYmopXSxcbiAgICAgICAgICBcIjxcIixcbiAgICAgICAgICBmb3JtYXRWYWx1ZShvYmoudmFsdWUpLFxuICAgICAgICAgIGA+YFxuICAgICAgICBdO1xuICAgICAgfSBlbHNlIGlmIChpc1JlYWN0aXZlKG9iaikpIHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgIHt9LFxuICAgICAgICAgIFtcInNwYW5cIiwgdnVlU3R5bGUsIGlzU2hhbGxvdyhvYmopID8gXCJTaGFsbG93UmVhY3RpdmVcIiA6IFwiUmVhY3RpdmVcIl0sXG4gICAgICAgICAgXCI8XCIsXG4gICAgICAgICAgZm9ybWF0VmFsdWUob2JqKSxcbiAgICAgICAgICBgPiR7aXNSZWFkb25seShvYmopID8gYCAocmVhZG9ubHkpYCA6IGBgfWBcbiAgICAgICAgXTtcbiAgICAgIH0gZWxzZSBpZiAoaXNSZWFkb25seShvYmopKSB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICB7fSxcbiAgICAgICAgICBbXCJzcGFuXCIsIHZ1ZVN0eWxlLCBpc1NoYWxsb3cob2JqKSA/IFwiU2hhbGxvd1JlYWRvbmx5XCIgOiBcIlJlYWRvbmx5XCJdLFxuICAgICAgICAgIFwiPFwiLFxuICAgICAgICAgIGZvcm1hdFZhbHVlKG9iaiksXG4gICAgICAgICAgXCI+XCJcbiAgICAgICAgXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0sXG4gICAgaGFzQm9keShvYmopIHtcbiAgICAgIHJldHVybiBvYmogJiYgb2JqLl9faXNWdWU7XG4gICAgfSxcbiAgICBib2R5KG9iaikge1xuICAgICAgaWYgKG9iaiAmJiBvYmouX19pc1Z1ZSkge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAge30sXG4gICAgICAgICAgLi4uZm9ybWF0SW5zdGFuY2Uob2JqLiQpXG4gICAgICAgIF07XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBmdW5jdGlvbiBmb3JtYXRJbnN0YW5jZShpbnN0YW5jZSkge1xuICAgIGNvbnN0IGJsb2NrcyA9IFtdO1xuICAgIGlmIChpbnN0YW5jZS50eXBlLnByb3BzICYmIGluc3RhbmNlLnByb3BzKSB7XG4gICAgICBibG9ja3MucHVzaChjcmVhdGVJbnN0YW5jZUJsb2NrKFwicHJvcHNcIiwgdG9SYXcoaW5zdGFuY2UucHJvcHMpKSk7XG4gICAgfVxuICAgIGlmIChpbnN0YW5jZS5zZXR1cFN0YXRlICE9PSBFTVBUWV9PQkopIHtcbiAgICAgIGJsb2Nrcy5wdXNoKGNyZWF0ZUluc3RhbmNlQmxvY2soXCJzZXR1cFwiLCBpbnN0YW5jZS5zZXR1cFN0YXRlKSk7XG4gICAgfVxuICAgIGlmIChpbnN0YW5jZS5kYXRhICE9PSBFTVBUWV9PQkopIHtcbiAgICAgIGJsb2Nrcy5wdXNoKGNyZWF0ZUluc3RhbmNlQmxvY2soXCJkYXRhXCIsIHRvUmF3KGluc3RhbmNlLmRhdGEpKSk7XG4gICAgfVxuICAgIGNvbnN0IGNvbXB1dGVkID0gZXh0cmFjdEtleXMoaW5zdGFuY2UsIFwiY29tcHV0ZWRcIik7XG4gICAgaWYgKGNvbXB1dGVkKSB7XG4gICAgICBibG9ja3MucHVzaChjcmVhdGVJbnN0YW5jZUJsb2NrKFwiY29tcHV0ZWRcIiwgY29tcHV0ZWQpKTtcbiAgICB9XG4gICAgY29uc3QgaW5qZWN0ZWQgPSBleHRyYWN0S2V5cyhpbnN0YW5jZSwgXCJpbmplY3RcIik7XG4gICAgaWYgKGluamVjdGVkKSB7XG4gICAgICBibG9ja3MucHVzaChjcmVhdGVJbnN0YW5jZUJsb2NrKFwiaW5qZWN0ZWRcIiwgaW5qZWN0ZWQpKTtcbiAgICB9XG4gICAgYmxvY2tzLnB1c2goW1xuICAgICAgXCJkaXZcIixcbiAgICAgIHt9LFxuICAgICAgW1xuICAgICAgICBcInNwYW5cIixcbiAgICAgICAge1xuICAgICAgICAgI
20578HN0eWxlOiBrZXl3b3JkU3R5bGUuc3R5bGUgKyBcIjtvcGFjaXR5OjAuNjZcIlxuICAgICAgICB9LFxuICAgICAgICBcIiQgKGludGVybmFsKTogXCJcbiAgICAgIF0sXG4gICAgICBbXCJvYmplY3RcIiwgeyBvYmplY3Q6IGluc3RhbmNlIH1dXG4gICAgXSk7XG4gICAgcmV0dXJuIGJsb2NrcztcbiAgfVxuICBmdW5jdGlvbiBjcmVhdGVJbnN0YW5jZUJsb2NrKHR5cGUsIHRhcmdldCkge1xuICAgIHRhcmdldCA9IGV4dGVuZCh7fSwgdGFyZ2V0KTtcbiAgICBpZiAoIU9iamVjdC5rZXlzKHRhcmdldCkubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gW1wic3BhblwiLCB7fV07XG4gICAgfVxuICAgIHJldHVybiBbXG4gICAgICBcImRpdlwiLFxuICAgICAgeyBzdHlsZTogXCJsaW5lLWhlaWdodDoxLjI1ZW07bWFyZ2luLWJvdHRvbTowLjZlbVwiIH0sXG4gICAgICBbXG4gICAgICAgIFwiZGl2XCIsXG4gICAgICAgIHtcbiAgICAgICAgICBzdHlsZTogXCJjb2xvcjojNDc2NTgyXCJcbiAgICAgICAgfSxcbiAgICAgICAgdHlwZVxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgXCJkaXZcIixcbiAgICAgICAge1xuICAgICAgICAgIHN0eWxlOiBcInBhZGRpbmctbGVmdDoxLjI1ZW1cIlxuICAgICAgICB9LFxuICAgICAgICAuLi5PYmplY3Qua2V5cyh0YXJnZXQpLm1hcCgoa2V5KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICB7fSxcbiAgICAgICAgICAgIFtcInNwYW5cIiwga2V5d29yZFN0eWxlLCBrZXkgKyBcIjogXCJdLFxuICAgICAgICAgICAgZm9ybWF0VmFsdWUodGFyZ2V0W2tleV0sIGZhbHNlKVxuICAgICAgICAgIF07XG4gICAgICAgIH0pXG4gICAgICBdXG4gICAgXTtcbiAgfVxuICBmdW5jdGlvbiBmb3JtYXRWYWx1ZSh2LCBhc1JhdyA9IHRydWUpIHtcbiAgICBpZiAodHlwZW9mIHYgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgIHJldHVybiBbXCJzcGFuXCIsIG51bWJlclN0eWxlLCB2XTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB2ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm4gW1wic3BhblwiLCBzdHJpbmdTdHlsZSwgSlNPTi5zdHJpbmdpZnkodildO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHYgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICByZXR1cm4gW1wic3BhblwiLCBrZXl3b3JkU3R5bGUsIHZdO1xuICAgIH0gZWxzZSBpZiAoaXNPYmplY3QodikpIHtcbiAgICAgIHJldHVybiBbXCJvYmplY3RcIiwgeyBvYmplY3Q6IGFzUmF3ID8gdG9SYXcodikgOiB2IH1dO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gW1wic3BhblwiLCBzdHJpbmdTdHlsZSwgU3RyaW5nKHYpXTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gZXh0cmFjdEtleXMoaW5zdGFuY2UsIHR5cGUpIHtcbiAgICBjb25zdCBDb21wID0gaW5zdGFuY2UudHlwZTtcbiAgICBpZiAoaXNGdW5jdGlvbihDb21wKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBleHRyYWN0ZWQgPSB7fTtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBpbnN0YW5jZS5jdHgpIHtcbiAgICAgIGlmIChpc0tleU9mVHlwZShDb21wLCBrZXksIHR5cGUpKSB7XG4gICAgICAgIGV4dHJhY3RlZFtrZXldID0gaW5zdGFuY2UuY3R4W2tleV07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBleHRyYWN0ZWQ7XG4gIH1cbiAgZnVuY3Rpb24gaXNLZXlPZlR5cGUoQ29tcCwga2V5LCB0eXBlKSB7XG4gICAgY29uc3Qgb3B0cyA9IENvbXBbdHlwZV07XG4gICAgaWYgKGlzQXJyYXkob3B0cykgJiYgb3B0cy5pbmNsdWRlcyhrZXkpIHx8IGlzT2JqZWN0KG9wdHMpICYmIGtleSBpbiBvcHRzKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKENvbXAuZXh0ZW5kcyAmJiBpc0tleU9mVHlwZShDb21wLmV4dGVuZHMsIGtleSwgdHlwZSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoQ29tcC5taXhpbnMgJiYgQ29tcC5taXhpbnMuc29tZSgobSkgPT4gaXNLZXlPZlR5cGUobSwga2V5LCB0eXBlKSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBnZW5SZWZGbGFnKHYpIHtcbiAgICBpZiAoaXNTaGFsbG93KHYpKSB7XG4gICAgICByZXR1cm4gYFNoYWxsb3dSZWZgO1xuICAgIH1cbiAgICBpZiAodi5lZmZlY3QpIHtcbiAgICAgIHJldHVybiBgQ29tcHV0ZWRSZWZgO1xuICAgIH1cbiAgICByZXR1cm4gYFJlZmA7XG4gIH1cbiAgaWYgKHdpbmRvdy5kZXZ0b29sc0Zvcm1hdHRlcnMpIHtcbiAgICB3aW5kb3cuZGV2dG9vbHNGb3JtYXR0ZXJzLnB1c2goZm9ybWF0dGVyKTtcbiAgfSBlbHNlIHtcbiAgICB3aW5kb3cuZGV2dG9vbHNGb3JtYXR0ZXJzID0gW2Zvcm1hdHRlcl07XG4gIH1cbn1cblxuZnVuY3Rpb24gd2l0aE1lbW8obWVtbywgcmVuZGVyLCBjYWNoZSwgaW5kZXgpIHtcbiAgY29uc3QgY2FjaGVkID0gY2FjaGVbaW5kZXhdO1xuICBpZiAoY2FjaGVkICYmIGlzTWVtb1NhbWUoY2FjaGVkLCBtZW1vKSkge1xuICAgIHJldHVybiBjYWNoZWQ7XG4gIH1cbiAgY29uc3QgcmV0ID0gcmVuZGVyKCk7XG4gIHJldC5tZW1vID0gbWVtby5zbGljZSgpO1xuICByZXQuY2FjaGVJbmRleCA9IGluZGV4O1xuICByZXR1cm4gY2FjaGVbaW5kZXhdID0gcmV0O1xufVxuZnVuY3Rpb24gaXNNZW1vU2FtZShjYWNoZWQsIG1lbW8pIHtcbiAgY29uc3QgcHJldiA9IGNhY2hlZC5tZW1vO1xuICBpZiAocHJldi5sZW5ndGggIT0gbWVtby5sZW5ndGgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcmV2Lmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGhhc0NoYW5nZWQocHJldltpXSwgbWVtb1tpXSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgaWYgKGlzQmxvY2tUcmVlRW5hYmxlZCA+IDAgJiYgY3VycmVudEJsb2NrKSB7XG4gICAgY3VycmVudEJsb2NrLnB1c2goY2FjaGVkKTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuY29uc3QgdmVyc2lvbiA9I
20578FwiMy40LjM0XCI7XG5jb25zdCB3YXJuID0gISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IHdhcm4kMSA6IE5PT1A7XG5jb25zdCBFcnJvclR5cGVTdHJpbmdzID0gRXJyb3JUeXBlU3RyaW5ncyQxIDtcbmNvbnN0IGRldnRvb2xzID0gISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCB0cnVlID8gZGV2dG9vbHMkMSA6IHZvaWQgMDtcbmNvbnN0IHNldERldnRvb2xzSG9vayA9ICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgdHJ1ZSA/IHNldERldnRvb2xzSG9vayQxIDogTk9PUDtcbmNvbnN0IF9zc3JVdGlscyA9IHtcbiAgY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UsXG4gIHNldHVwQ29tcG9uZW50LFxuICByZW5kZXJDb21wb25lbnRSb290LFxuICBzZXRDdXJyZW50UmVuZGVyaW5nSW5zdGFuY2UsXG4gIGlzVk5vZGU6IGlzVk5vZGUsXG4gIG5vcm1hbGl6ZVZOb2RlLFxuICBnZXRDb21wb25lbnRQdWJsaWNJbnN0YW5jZVxufTtcbmNvbnN0IHNzclV0aWxzID0gX3NzclV0aWxzIDtcbmNvbnN0IHJlc29sdmVGaWx0ZXIgPSBudWxsO1xuY29uc3QgY29tcGF0VXRpbHMgPSBudWxsO1xuY29uc3QgRGVwcmVjYXRpb25UeXBlcyA9IG51bGw7XG5cbmV4cG9ydCB7IEJhc2VUcmFuc2l0aW9uLCBCYXNlVHJhbnNpdGlvblByb3BzVmFsaWRhdG9ycywgQ29tbWVudCwgRGVwcmVjYXRpb25UeXBlcywgRXJyb3JDb2RlcywgRXJyb3JUeXBlU3RyaW5ncywgRnJhZ21lbnQsIEtlZXBBbGl2ZSwgU3RhdGljLCBTdXNwZW5zZSwgVGVsZXBvcnQsIFRleHQsIGFzc2VydE51bWJlciwgY2FsbFdpdGhBc3luY0Vycm9ySGFuZGxpbmcsIGNhbGxXaXRoRXJyb3JIYW5kbGluZywgY2xvbmVWTm9kZSwgY29tcGF0VXRpbHMsIGNvbXB1dGVkLCBjcmVhdGVCbG9jaywgY3JlYXRlQ29tbWVudFZOb2RlLCBjcmVhdGVFbGVtZW50QmxvY2ssIGNyZWF0ZUJhc2VWTm9kZSBhcyBjcmVhdGVFbGVtZW50Vk5vZGUsIGNyZWF0ZUh5ZHJhdGlvblJlbmRlcmVyLCBjcmVhdGVQcm9wc1Jlc3RQcm94eSwgY3JlYXRlUmVuZGVyZXIsIGNyZWF0ZVNsb3RzLCBjcmVhdGVTdGF0aWNWTm9kZSwgY3JlYXRlVGV4dFZOb2RlLCBjcmVhdGVWTm9kZSwgZGVmaW5lQXN5bmNDb21wb25lbnQsIGRlZmluZUNvbXBvbmVudCwgZGVmaW5lRW1pdHMsIGRlZmluZUV4cG9zZSwgZGVmaW5lTW9kZWwsIGRlZmluZU9wdGlvbnMsIGRlZmluZVByb3BzLCBkZWZpbmVTbG90cywgZGV2dG9vbHMsIGdldEN1cnJlbnRJbnN0YW5jZSwgZ2V0VHJhbnNpdGlvblJhd0NoaWxkcmVuLCBndWFyZFJlYWN0aXZlUHJvcHMsIGgsIGhhbmRsZUVycm9yLCBoYXNJbmplY3Rpb25Db250ZXh0LCBpbml0Q3VzdG9tRm9ybWF0dGVyLCBpbmplY3QsIGlzTWVtb1NhbWUsIGlzUnVudGltZU9ubHksIGlzVk5vZGUsIG1lcmdlRGVmYXVsdHMsIG1lcmdlTW9kZWxzLCBtZXJnZVByb3BzLCBuZXh0VGljaywgb25BY3RpdmF0ZWQsIG9uQmVmb3JlTW91bnQsIG9uQmVmb3JlVW5tb3VudCwgb25CZWZvcmVVcGRhdGUsIG9uRGVhY3RpdmF0ZWQsIG9uRXJyb3JDYXB0dXJlZCwgb25Nb3VudGVkLCBvblJlbmRlclRyYWNrZWQsIG9uUmVuZGVyVHJpZ2dlcmVkLCBvblNlcnZlclByZWZldGNoLCBvblVubW91bnRlZCwgb25VcGRhdGVkLCBvcGVuQmxvY2ssIHBvcFNjb3BlSWQsIHByb3ZpZGUsIHB1c2hTY29wZUlkLCBxdWV1ZVBvc3RGbHVzaENiLCByZWdpc3RlclJ1bnRpbWVDb21waWxlciwgcmVuZGVyTGlzdCwgcmVuZGVyU2xvdCwgcmVzb2x2ZUNvbXBvbmVudCwgcmVzb2x2ZURpcmVjdGl2ZSwgcmVzb2x2ZUR5bmFtaWNDb21wb25lbnQsIHJlc29sdmVGaWx0ZXIsIHJlc29sdmVUcmFuc2l0aW9uSG9va3MsIHNldEJsb2NrVHJhY2tpbmcsIHNldERldnRvb2xzSG9vaywgc2V0VHJhbnNpdGlvbkhvb2tzLCBzc3JDb250ZXh0S2V5LCBzc3JVdGlscywgdG9IYW5kbGVycywgdHJhbnNmb3JtVk5vZGVBcmdzLCB1c2VBdHRycywgdXNlTW9kZWwsIHVzZVNTUkNvbnRleHQsIHVzZVNsb3RzLCB1c2VUcmFuc2l0aW9uU3RhdGUsIHZlcnNpb24sIHdhcm4sIHdhdGNoLCB3YXRjaEVmZmVjdCwgd2F0Y2hQb3N0RWZmZWN0LCB3YXRjaFN5bmNFZmZlY3QsIHdpdGhBc3luY0NvbnRleHQsIHdpdGhDdHgsIHdpdGhEZWZhdWx0cywgd2l0aERpcmVjdGl2ZXMsIHdpdGhNZW1vLCB3aXRoU2NvcGVJZCB9O1xuIiwiLyoqXG4qIEB2dWUvcnVudGltZS1kb20gdjMuNC4zNFxuKiAoYykgMjAxOC1wcmVzZW50IFl1eGkgKEV2YW4pIFlvdSBhbmQgVnVlIGNvbnRyaWJ1dG9yc1xuKiBAbGljZW5zZSBNSVRcbioqL1xuaW1wb3J0IHsgaCwgQmFzZVRyYW5zaXRpb24sIEJhc2VUcmFuc2l0aW9uUHJvcHNWYWxpZGF0b3JzLCBhc3NlcnROdW1iZXIsIGdldEN1cnJlbnRJbnN0YW5jZSwgd2Fybiwgb25Nb3VudGVkLCB3YXRjaFBvc3RFZmZlY3QsIG9uVW5tb3VudGVkLCBGcmFnbWVudCwgU3RhdGljLCBjYW1lbGl6ZSwgY2FsbFdpdGhBc3luY0Vycm9ySGFuZGxpbmcsIGRlZmluZUNvbXBvbmVudCwgbmV4dFRpY2ssIGNyZWF0ZVZOb2RlLCB1c2VUcmFuc2l0aW9uU3RhdGUsIG9uVXBkYXRlZCwgdG9SYXcsIGdldFRyYW5zaXRpb25SYXdDaGlsZHJlbiwgc2V0VHJhbnNpdGlvbkhvb2tzLCByZXNvbHZlVHJhbnNpdGlvbkhvb2tzLCBpc1J1bnRpbWVPbmx5LCBjcmVhdGVSZW5kZXJlciwgY3JlYXRlSHlkcmF0aW9uUmVuZGVyZXIgfSBmcm9tICdAdnVlL3J1bnRpbWUtY29yZSc7XG5leHBvcnQgKiBmcm9tICdAdnVlL3J1bnRpbWUtY29yZSc7XG5pbXBvcnQgeyBleHRlbmQsIGlzT2JqZWN0LCB0b051bWJlciwgaXNBcnJheSwgaXNTdHJpbmcsIGh5cGhlbmF0ZSwgY2FwaXRhbGl6ZSwgaW5jbHVkZUJvb2xlYW5BdHRyLCBpc1N5bWJvbCwgaXNTcGVjaWFsQm9vbGVhbkF0dHIsIGlzRnVuY3Rpb24sIE5PT1AsIGlzT24sIGlzTW9kZWxMaXN0ZW5lciwgY2FtZWxpemUgYXMgY2FtZWxpemUkMSwgRU1QVFlfT0JKLCBsb29zZVRvTnVtYmVyLCBsb29zZUluZGV4T2YsIGlzU2V0LCBsb29zZUVxdWFsLCBpbnZva2VBcnJheUZucywgaXNIVE1MVGFnLCBpc1NWR1RhZywgaXNNYXRoTUxUYWcgfSBmcm9tICdAdnVlL3NoYXJlZCc7XG5cbmNvbnN0IHN2Z05TID0gXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiO1xuY29uc3QgbWF0aG1sTlMgPSBcImh0dHA6Ly93d3cudzMub3JnLzE5OTgvTWF0aC9NYXRoTUxcIjtcbmNvbnN0IGRvYyA9IHR5cGVvZiBkb2N1bWVudCAhPT0gXCJ1bmRlZmluZWRcIiA/IGRvY3VtZW50IDogbnVsbDtcbmNvbnN0IHRlbXBsYXRlQ29udGFpbmVyID0gZG9jICYmIC8qIEBfX1BVUkVfXyAqLyBkb2MuY3JlYXRlRWxlbWVudChcInRlbXBsYXRlXCIpO1xuY29uc3Qgbm9kZU9wcyA9IHtcbiAgaW5zZXJ0OiAoY2hpbGQsIHBhcmVudCwgYW5jaG9yKSA9PiB7XG4gICAgcGFyZW50Lmluc2VydEJlZm9yZShjaGlsZCwgYW5jaG9yIHx8IG51bGwpO1xuICB9LFxuICByZW1vdmU6IChjaGlsZCkgPT4ge1xuICAgIGNvbnN0IHBhcmVudCA9IGNoaWxkLnBhcmVudE5vZGU7XG4gICAgaWYgKHBhcmVudCkge1xuICAgICAgcGFyZW50LnJlbW92ZUNoaWxkKGNoaWxkKTtcbiAgICB9XG4gI
20578H0sXG4gIGNyZWF0ZUVsZW1lbnQ6ICh0YWcsIG5hbWVzcGFjZSwgaXMsIHByb3BzKSA9PiB7XG4gICAgY29uc3QgZWwgPSBuYW1lc3BhY2UgPT09IFwic3ZnXCIgPyBkb2MuY3JlYXRlRWxlbWVudE5TKHN2Z05TLCB0YWcpIDogbmFtZXNwYWNlID09PSBcIm1hdGhtbFwiID8gZG9jLmNyZWF0ZUVsZW1lbnROUyhtYXRobWxOUywgdGFnKSA6IGlzID8gZG9jLmNyZWF0ZUVsZW1lbnQodGFnLCB7IGlzIH0pIDogZG9jLmNyZWF0ZUVsZW1lbnQodGFnKTtcbiAgICBpZiAodGFnID09PSBcInNlbGVjdFwiICYmIHByb3BzICYmIHByb3BzLm11bHRpcGxlICE9IG51bGwpIHtcbiAgICAgIGVsLnNldEF0dHJpYnV0ZShcIm11bHRpcGxlXCIsIHByb3BzLm11bHRpcGxlKTtcbiAgICB9XG4gICAgcmV0dXJuIGVsO1xuICB9LFxuICBjcmVhdGVUZXh0OiAodGV4dCkgPT4gZG9jLmNyZWF0ZVRleHROb2RlKHRleHQpLFxuICBjcmVhdGVDb21tZW50OiAodGV4dCkgPT4gZG9jLmNyZWF0ZUNvbW1lbnQodGV4dCksXG4gIHNldFRleHQ6IChub2RlLCB0ZXh0KSA9PiB7XG4gICAgbm9kZS5ub2RlVmFsdWUgPSB0ZXh0O1xuICB9LFxuICBzZXRFbGVtZW50VGV4dDogKGVsLCB0ZXh0KSA9PiB7XG4gICAgZWwudGV4dENvbnRlbnQgPSB0ZXh0O1xuICB9LFxuICBwYXJlbnROb2RlOiAobm9kZSkgPT4gbm9kZS5wYXJlbnROb2RlLFxuICBuZXh0U2libGluZzogKG5vZGUpID0+IG5vZGUubmV4dFNpYmxpbmcsXG4gIHF1ZXJ5U2VsZWN0b3I6IChzZWxlY3RvcikgPT4gZG9jLnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpLFxuICBzZXRTY29wZUlkKGVsLCBpZCkge1xuICAgIGVsLnNldEF0dHJpYnV0ZShpZCwgXCJcIik7XG4gIH0sXG4gIC8vIF9fVU5TQUZFX19cbiAgLy8gUmVhc29uOiBpbm5lckhUTUwuXG4gIC8vIFN0YXRpYyBjb250ZW50IGhlcmUgY2FuIG9ubHkgY29tZSBmcm9tIGNvbXBpbGVkIHRlbXBsYXRlcy5cbiAgLy8gQXMgbG9uZyBhcyB0aGUgdXNlciBvbmx5IHVzZXMgdHJ1c3RlZCB0ZW1wbGF0ZXMsIHRoaXMgaXMgc2FmZS5cbiAgaW5zZXJ0U3RhdGljQ29udGVudChjb250ZW50LCBwYXJlbnQsIGFuY2hvciwgbmFtZXNwYWNlLCBzdGFydCwgZW5kKSB7XG4gICAgY29uc3QgYmVmb3JlID0gYW5jaG9yID8gYW5jaG9yLnByZXZpb3VzU2libGluZyA6IHBhcmVudC5sYXN0Q2hpbGQ7XG4gICAgaWYgKHN0YXJ0ICYmIChzdGFydCA9PT0gZW5kIHx8IHN0YXJ0Lm5leHRTaWJsaW5nKSkge1xuICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgcGFyZW50Lmluc2VydEJlZm9yZShzdGFydC5jbG9uZU5vZGUodHJ1ZSksIGFuY2hvcik7XG4gICAgICAgIGlmIChzdGFydCA9PT0gZW5kIHx8ICEoc3RhcnQgPSBzdGFydC5uZXh0U2libGluZykpIGJyZWFrO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0ZW1wbGF0ZUNvbnRhaW5lci5pbm5lckhUTUwgPSBuYW1lc3BhY2UgPT09IFwic3ZnXCIgPyBgPHN2Zz4ke2NvbnRlbnR9PC9zdmc+YCA6IG5hbWVzcGFjZSA9PT0gXCJtYXRobWxcIiA/IGA8bWF0aD4ke2NvbnRlbnR9PC9tYXRoPmAgOiBjb250ZW50O1xuICAgICAgY29uc3QgdGVtcGxhdGUgPSB0ZW1wbGF0ZUNvbnRhaW5lci5jb250ZW50O1xuICAgICAgaWYgKG5hbWVzcGFjZSA9PT0gXCJzdmdcIiB8fCBuYW1lc3BhY2UgPT09IFwibWF0aG1sXCIpIHtcbiAgICAgICAgY29uc3Qgd3JhcHBlciA9IHRlbXBsYXRlLmZpcnN0Q2hpbGQ7XG4gICAgICAgIHdoaWxlICh3cmFwcGVyLmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgICB0ZW1wbGF0ZS5hcHBlbmRDaGlsZCh3cmFwcGVyLmZpcnN0Q2hpbGQpO1xuICAgICAgICB9XG4gICAgICAgIHRlbXBsYXRlLnJlbW92ZUNoaWxkKHdyYXBwZXIpO1xuICAgICAgfVxuICAgICAgcGFyZW50Lmluc2VydEJlZm9yZSh0ZW1wbGF0ZSwgYW5jaG9yKTtcbiAgICB9XG4gICAgcmV0dXJuIFtcbiAgICAgIC8vIGZpcnN0XG4gICAgICBiZWZvcmUgPyBiZWZvcmUubmV4dFNpYmxpbmcgOiBwYXJlbnQuZmlyc3RDaGlsZCxcbiAgICAgIC8vIGxhc3RcbiAgICAgIGFuY2hvciA/IGFuY2hvci5wcmV2aW91c1NpYmxpbmcgOiBwYXJlbnQubGFzdENoaWxkXG4gICAgXTtcbiAgfVxufTtcblxuY29uc3QgVFJBTlNJVElPTiA9IFwidHJhbnNpdGlvblwiO1xuY29uc3QgQU5JTUFUSU9OID0gXCJhbmltYXRpb25cIjtcbmNvbnN0IHZ0Y0tleSA9IFN5bWJvbChcIl92dGNcIik7XG5jb25zdCBUcmFuc2l0aW9uID0gKHByb3BzLCB7IHNsb3RzIH0pID0+IGgoQmFzZVRyYW5zaXRpb24sIHJlc29sdmVUcmFuc2l0aW9uUHJvcHMocHJvcHMpLCBzbG90cyk7XG5UcmFuc2l0aW9uLmRpc3BsYXlOYW1lID0gXCJUcmFuc2l0aW9uXCI7XG5jb25zdCBET01UcmFuc2l0aW9uUHJvcHNWYWxpZGF0b3JzID0ge1xuICBuYW1lOiBTdHJpbmcsXG4gIHR5cGU6IFN0cmluZyxcbiAgY3NzOiB7XG4gICAgdHlwZTogQm9vbGVhbixcbiAgICBkZWZhdWx0OiB0cnVlXG4gIH0sXG4gIGR1cmF0aW9uOiBbU3RyaW5nLCBOdW1iZXIsIE9iamVjdF0sXG4gIGVudGVyRnJvbUNsYXNzOiBTdHJpbmcsXG4gIGVudGVyQWN0aXZlQ2xhc3M6IFN0cmluZyxcbiAgZW50ZXJUb0NsYXNzOiBTdHJpbmcsXG4gIGFwcGVhckZyb21DbGFzczogU3RyaW5nLFxuICBhcHBlYXJBY3RpdmVDbGFzczogU3RyaW5nLFxuICBhcHBlYXJUb0NsYXNzOiBTdHJpbmcsXG4gIGxlYXZlRnJvbUNsYXNzOiBTdHJpbmcsXG4gIGxlYXZlQWN0aXZlQ2xhc3M6IFN0cmluZyxcbiAgbGVhdmVUb0NsYXNzOiBTdHJpbmdcbn07XG5jb25zdCBUcmFuc2l0aW9uUHJvcHNWYWxpZGF0b3JzID0gVHJhbnNpdGlvbi5wcm9wcyA9IC8qIEBfX1BVUkVfXyAqLyBleHRlbmQoXG4gIHt9LFxuICBCYXNlVHJhbnNpdGlvblByb3BzVmFsaWRhdG9ycyxcbiAgRE9NVHJhbnNpdGlvblByb3BzVmFsaWRhdG9yc1xuKTtcbmNvbnN0IGNhbGxIb29rID0gKGhvb2ssIGFyZ3MgPSBbXSkgPT4ge1xuICBpZiAoaXNBcnJheShob29rKSkge1xuICAgIGhvb2suZm9yRWFjaCgoaDIpID0+IGgyKC4uLmFyZ3MpKTtcbiAgfSBlbHNlIGlmIChob29rKSB7XG4gICAgaG9vayguLi5hcmdzKTtcbiAgfVxufTtcbmNvbnN0IGhhc0V4cGxpY2l0Q2FsbGJhY2sgPSAoaG9vaykgPT4ge1xuICByZXR1cm4gaG9vayA/IGlzQXJyYXkoaG9vaykgPyBob29rLnNvbWUoKGgyKSA9PiBoMi5sZW5ndGggPiAxKSA6IGhvb2subGVuZ3RoID4gMSA6IGZhbHNlO1xufTtcbmZ1bmN0aW9uIHJlc29sdmVUcmFuc2l0aW9uUHJvcHMocmF3UHJvcHMpIHtcbiAgY29uc3QgYmFzZVByb3BzID0ge307XG4gIGZvciAoY29uc3Qga2V5IGluIHJhd1Byb3BzKSB7XG4gICAgaWYgKCEoa2V5IGluIERPTVRyYW5zaXRpb25Qcm9wc1ZhbGlkYXRvcnMpKSB7XG4gICAgICBiYXNlUHJvcHNba2V5XSA9IHJhd1Byb3BzW2tleV07XG4gICAgfVxuICB9XG4gIGlmIChyYXdQcm9wcy5jc3MgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIGJhc2VQcm9wcztcbiAgfVxuICBjb25zdCB7XG4gICAgbmFtZSA9IFwidlwiLFxuICAgIHR5cGUsXG4gICAgZHVyYXRpb24sXG4gICAgZW50ZXJGcm9tQ2xhc3MgPSBgJHtuYW1lfS1lbnRlci1mcm9tYCxcbiAgICBlbnRlckFjdGl2ZUNsYXNzID0gYCR7bmFtZX0tZW50ZXItYWN0aXZlYCxcbiAgICBlbnRlclRvQ2xhc3MgPSBgJHtuYW1lfS1lbnRlci10b2AsXG4gICAgYXBwZWFyRnJvbUNsYXNzID0gZW50ZXJGcm9tQ2xhc3MsXG4gICAgYXBwZWFyQWN0aXZlQ2xhc3MgPSBlbnRlckFjdGl2ZUNsYXNzLFxuICAgIGFwcGVhclRvQ2xhc3MgPSBlbnRlclRvQ2xhc3MsXG4gICAgbGVhdmVGcm9tQ2xhc3MgPSBgJHtuYW1lfS1sZWF2ZS1mcm9tYCxcbiAgICBsZWF2ZUFjdGl2ZUNsYXNzID0gYCR7bmFtZX0tbGVhdmUtYWN0aXZlYCxcbiAgICBsZWF2ZVRvQ2xhc3MgPSBgJHtuYW1lfS1sZWF2ZS10b2BcbiAgfSA9IHJhd1Byb3BzO1xuICBjb25zdCBkdXJhdGlvbnMgPSBub3JtYWxpem
20578VEdXJhdGlvbihkdXJhdGlvbik7XG4gIGNvbnN0IGVudGVyRHVyYXRpb24gPSBkdXJhdGlvbnMgJiYgZHVyYXRpb25zWzBdO1xuICBjb25zdCBsZWF2ZUR1cmF0aW9uID0gZHVyYXRpb25zICYmIGR1cmF0aW9uc1sxXTtcbiAgY29uc3Qge1xuICAgIG9uQmVmb3JlRW50ZXIsXG4gICAgb25FbnRlcixcbiAgICBvbkVudGVyQ2FuY2VsbGVkLFxuICAgIG9uTGVhdmUsXG4gICAgb25MZWF2ZUNhbmNlbGxlZCxcbiAgICBvbkJlZm9yZUFwcGVhciA9IG9uQmVmb3JlRW50ZXIsXG4gICAgb25BcHBlYXIgPSBvbkVudGVyLFxuICAgIG9uQXBwZWFyQ2FuY2VsbGVkID0gb25FbnRlckNhbmNlbGxlZFxuICB9ID0gYmFzZVByb3BzO1xuICBjb25zdCBmaW5pc2hFbnRlciA9IChlbCwgaXNBcHBlYXIsIGRvbmUpID0+IHtcbiAgICByZW1vdmVUcmFuc2l0aW9uQ2xhc3MoZWwsIGlzQXBwZWFyID8gYXBwZWFyVG9DbGFzcyA6IGVudGVyVG9DbGFzcyk7XG4gICAgcmVtb3ZlVHJhbnNpdGlvbkNsYXNzKGVsLCBpc0FwcGVhciA/IGFwcGVhckFjdGl2ZUNsYXNzIDogZW50ZXJBY3RpdmVDbGFzcyk7XG4gICAgZG9uZSAmJiBkb25lKCk7XG4gIH07XG4gIGNvbnN0IGZpbmlzaExlYXZlID0gKGVsLCBkb25lKSA9PiB7XG4gICAgZWwuX2lzTGVhdmluZyA9IGZhbHNlO1xuICAgIHJlbW92ZVRyYW5zaXRpb25DbGFzcyhlbCwgbGVhdmVGcm9tQ2xhc3MpO1xuICAgIHJlbW92ZVRyYW5zaXRpb25DbGFzcyhlbCwgbGVhdmVUb0NsYXNzKTtcbiAgICByZW1vdmVUcmFuc2l0aW9uQ2xhc3MoZWwsIGxlYXZlQWN0aXZlQ2xhc3MpO1xuICAgIGRvbmUgJiYgZG9uZSgpO1xuICB9O1xuICBjb25zdCBtYWtlRW50ZXJIb29rID0gKGlzQXBwZWFyKSA9PiB7XG4gICAgcmV0dXJuIChlbCwgZG9uZSkgPT4ge1xuICAgICAgY29uc3QgaG9vayA9IGlzQXBwZWFyID8gb25BcHBlYXIgOiBvbkVudGVyO1xuICAgICAgY29uc3QgcmVzb2x2ZSA9ICgpID0+IGZpbmlzaEVudGVyKGVsLCBpc0FwcGVhciwgZG9uZSk7XG4gICAgICBjYWxsSG9vayhob29rLCBbZWwsIHJlc29sdmVdKTtcbiAgICAgIG5leHRGcmFtZSgoKSA9PiB7XG4gICAgICAgIHJlbW92ZVRyYW5zaXRpb25DbGFzcyhlbCwgaXNBcHBlYXIgPyBhcHBlYXJGcm9tQ2xhc3MgOiBlbnRlckZyb21DbGFzcyk7XG4gICAgICAgIGFkZFRyYW5zaXRpb25DbGFzcyhlbCwgaXNBcHBlYXIgPyBhcHBlYXJUb0NsYXNzIDogZW50ZXJUb0NsYXNzKTtcbiAgICAgICAgaWYgKCFoYXNFeHBsaWNpdENhbGxiYWNrKGhvb2spKSB7XG4gICAgICAgICAgd2hlblRyYW5zaXRpb25FbmRzKGVsLCB0eXBlLCBlbnRlckR1cmF0aW9uLCByZXNvbHZlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcbiAgfTtcbiAgcmV0dXJuIGV4dGVuZChiYXNlUHJvcHMsIHtcbiAgICBvbkJlZm9yZUVudGVyKGVsKSB7XG4gICAgICBjYWxsSG9vayhvbkJlZm9yZUVudGVyLCBbZWxdKTtcbiAgICAgIGFkZFRyYW5zaXRpb25DbGFzcyhlbCwgZW50ZXJGcm9tQ2xhc3MpO1xuICAgICAgYWRkVHJhbnNpdGlvbkNsYXNzKGVsLCBlbnRlckFjdGl2ZUNsYXNzKTtcbiAgICB9LFxuICAgIG9uQmVmb3JlQXBwZWFyKGVsKSB7XG4gICAgICBjYWxsSG9vayhvbkJlZm9yZUFwcGVhciwgW2VsXSk7XG4gICAgICBhZGRUcmFuc2l0aW9uQ2xhc3MoZWwsIGFwcGVhckZyb21DbGFzcyk7XG4gICAgICBhZGRUcmFuc2l0aW9uQ2xhc3MoZWwsIGFwcGVhckFjdGl2ZUNsYXNzKTtcbiAgICB9LFxuICAgIG9uRW50ZXI6IG1ha2VFbnRlckhvb2soZmFsc2UpLFxuICAgIG9uQXBwZWFyOiBtYWtlRW50ZXJIb29rKHRydWUpLFxuICAgIG9uTGVhdmUoZWwsIGRvbmUpIHtcbiAgICAgIGVsLl9pc0xlYXZpbmcgPSB0cnVlO1xuICAgICAgY29uc3QgcmVzb2x2ZSA9ICgpID0+IGZpbmlzaExlYXZlKGVsLCBkb25lKTtcbiAgICAgIGFkZFRyYW5zaXRpb25DbGFzcyhlbCwgbGVhdmVGcm9tQ2xhc3MpO1xuICAgICAgYWRkVHJhbnNpdGlvbkNsYXNzKGVsLCBsZWF2ZUFjdGl2ZUNsYXNzKTtcbiAgICAgIGZvcmNlUmVmbG93KCk7XG4gICAgICBuZXh0RnJhbWUoKCkgPT4ge1xuICAgICAgICBpZiAoIWVsLl9pc0xlYXZpbmcpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcmVtb3ZlVHJhbnNpdGlvbkNsYXNzKGVsLCBsZWF2ZUZyb21DbGFzcyk7XG4gICAgICAgIGFkZFRyYW5zaXRpb25DbGFzcyhlbCwgbGVhdmVUb0NsYXNzKTtcbiAgICAgICAgaWYgKCFoYXNFeHBsaWNpdENhbGxiYWNrKG9uTGVhdmUpKSB7XG4gICAgICAgICAgd2hlblRyYW5zaXRpb25FbmRzKGVsLCB0eXBlLCBsZWF2ZUR1cmF0aW9uLCByZXNvbHZlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBjYWxsSG9vayhvbkxlYXZlLCBbZWwsIHJlc29sdmVdKTtcbiAgICB9LFxuICAgIG9uRW50ZXJDYW5jZWxsZWQoZWwpIHtcbiAgICAgIGZpbmlzaEVudGVyKGVsLCBmYWxzZSk7XG4gICAgICBjYWxsSG9vayhvbkVudGVyQ2FuY2VsbGVkLCBbZWxdKTtcbiAgICB9LFxuICAgIG9uQXBwZWFyQ2FuY2VsbGVkKGVsKSB7XG4gICAgICBmaW5pc2hFbnRlcihlbCwgdHJ1ZSk7XG4gICAgICBjYWxsSG9vayhvbkFwcGVhckNhbmNlbGxlZCwgW2VsXSk7XG4gICAgfSxcbiAgICBvbkxlYXZlQ2FuY2VsbGVkKGVsKSB7XG4gICAgICBmaW5pc2hMZWF2ZShlbCk7XG4gICAgICBjYWxsSG9vayhvbkxlYXZlQ2FuY2VsbGVkLCBbZWxdKTtcbiAgICB9XG4gIH0pO1xufVxuZnVuY3Rpb24gbm9ybWFsaXplRHVyYXRpb24oZHVyYXRpb24pIHtcbiAgaWYgKGR1cmF0aW9uID09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfSBlbHNlIGlmIChpc09iamVjdChkdXJhdGlvbikpIHtcbiAgICByZXR1cm4gW051bWJlck9mKGR1cmF0aW9uLmVudGVyKSwgTnVtYmVyT2YoZHVyYXRpb24ubGVhdmUpXTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBuID0gTnVtYmVyT2YoZHVyYXRpb24pO1xuICAgIHJldHVybiBbbiwgbl07XG4gIH1cbn1cbmZ1bmN0aW9uIE51bWJlck9mKHZhbCkge1xuICBjb25zdCByZXMgPSB0b051bWJlcih2YWwpO1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIGFzc2VydE51bWJlcihyZXMsIFwiPHRyYW5zaXRpb24+IGV4cGxpY2l0IGR1cmF0aW9uXCIpO1xuICB9XG4gI
20578HJldHVybiByZXM7XG59XG5mdW5jdGlvbiBhZGRUcmFuc2l0aW9uQ2xhc3MoZWwsIGNscykge1xuICBjbHMuc3BsaXQoL1xccysvKS5mb3JFYWNoKChjKSA9PiBjICYmIGVsLmNsYXNzTGlzdC5hZGQoYykpO1xuICAoZWxbdnRjS2V5XSB8fCAoZWxbdnRjS2V5XSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCkpKS5hZGQoY2xzKTtcbn1cbmZ1bmN0aW9uIHJlbW92ZVRyYW5zaXRpb25DbGFzcyhlbCwgY2xzKSB7XG4gIGNscy5zcGxpdCgvXFxzKy8pLmZvckVhY2goKGMpID0+IGMgJiYgZWwuY2xhc3NMaXN0LnJlbW92ZShjKSk7XG4gIGNvbnN0IF92dGMgPSBlbFt2dGNLZXldO1xuICBpZiAoX3Z0Yykge1xuICAgIF92dGMuZGVsZXRlKGNscyk7XG4gICAgaWYgKCFfdnRjLnNpemUpIHtcbiAgICAgIGVsW3Z0Y0tleV0gPSB2b2lkIDA7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBuZXh0RnJhbWUoY2IpIHtcbiAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoY2IpO1xuICB9KTtcbn1cbmxldCBlbmRJZCA9IDA7XG5mdW5jdGlvbiB3aGVuVHJhbnNpdGlvbkVuZHMoZWwsIGV4cGVjdGVkVHlwZSwgZXhwbGljaXRUaW1lb3V0LCByZXNvbHZlKSB7XG4gIGNvbnN0IGlkID0gZWwuX2VuZElkID0gKytlbmRJZDtcbiAgY29uc3QgcmVzb2x2ZUlmTm90U3RhbGUgPSAoKSA9PiB7XG4gICAgaWYgKGlkID09PSBlbC5fZW5kSWQpIHtcbiAgICAgIHJlc29sdmUoKTtcbiAgICB9XG4gIH07XG4gIGlmIChleHBsaWNpdFRpbWVvdXQpIHtcbiAgICByZXR1cm4gc2V0VGltZW91dChyZXNvbHZlSWZOb3RTdGFsZSwgZXhwbGljaXRUaW1lb3V0KTtcbiAgfVxuICBjb25zdCB7IHR5cGUsIHRpbWVvdXQsIHByb3BDb3VudCB9ID0gZ2V0VHJhbnNpdGlvbkluZm8oZWwsIGV4cGVjdGVkVHlwZSk7XG4gIGlmICghdHlwZSkge1xuICAgIHJldHVybiByZXNvbHZlKCk7XG4gIH1cbiAgY29uc3QgZW5kRXZlbnQgPSB0eXBlICsgXCJlbmRcIjtcbiAgbGV0IGVuZGVkID0gMDtcbiAgY29uc3QgZW5kID0gKCkgPT4ge1xuICAgIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoZW5kRXZlbnQsIG9uRW5kKTtcbiAgICByZXNvbHZlSWZOb3RTdGFsZSgpO1xuICB9O1xuICBjb25zdCBvbkVuZCA9IChlKSA9PiB7XG4gICAgaWYgKGUudGFyZ2V0ID09PSBlbCAmJiArK2VuZGVkID49IHByb3BDb3VudCkge1xuICAgICAgZW5kKCk7XG4gICAgfVxuICB9O1xuICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICBpZiAoZW5kZWQgPCBwcm9wQ291bnQpIHtcbiAgICAgIGVuZCgpO1xuICAgIH1cbiAgfSwgdGltZW91dCArIDEpO1xuICBlbC5hZGRFdmVudExpc3RlbmVyKGVuZEV2ZW50LCBvbkVuZCk7XG59XG5mdW5jdGlvbiBnZXRUcmFuc2l0aW9uSW5mbyhlbCwgZXhwZWN0ZWRUeXBlKSB7XG4gIGNvbnN0IHN0eWxlcyA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsKTtcbiAgY29uc3QgZ2V0U3R5bGVQcm9wZXJ0aWVzID0gKGtleSkgPT4gKHN0eWxlc1trZXldIHx8IFwiXCIpLnNwbGl0KFwiLCBcIik7XG4gIGNvbnN0IHRyYW5zaXRpb25EZWxheXMgP
20578SBnZXRTdHlsZVByb3BlcnRpZXMoYCR7VFJBTlNJVElPTn1EZWxheWApO1xuICBjb25zdCB0cmFuc2l0aW9uRHVyYXRpb25zID0gZ2V0U3R5bGVQcm9wZXJ0aWVzKGAke1RSQU5TSVRJT059RHVyYXRpb25gKTtcbiAgY29uc3QgdHJhbnNpdGlvblRpbWVvdXQgPSBnZXRUaW1lb3V0KHRyYW5zaXRpb25EZWxheXMsIHRyYW5zaXRpb25EdXJhdGlvbnMpO1xuICBjb25zdCBhbmltYXRpb25EZWxheXMgPSBnZXRTdHlsZVByb3BlcnRpZXMoYCR7QU5JTUFUSU9OfURlbGF5YCk7XG4gIGNvbnN0IGFuaW1hdGlvbkR1cmF0aW9ucyA9IGdldFN0eWxlUHJvcGVydGllcyhgJHtBTklNQVRJT059RHVyYXRpb25gKTtcbiAgY29uc3QgYW5pbWF0aW9uVGltZW91dCA9IGdldFRpbWVvdXQoYW5pbWF0aW9uRGVsYXlzLCBhbmltYXRpb25EdXJhdGlvbnMpO1xuICBsZXQgdHlwZSA9IG51bGw7XG4gIGxldCB0aW1lb3V0ID0gMDtcbiAgbGV0IHByb3BDb3VudCA9IDA7XG4gIGlmIChleHBlY3RlZFR5cGUgPT09IFRSQU5TSVRJT04pIHtcbiAgICBpZiAodHJhbnNpdGlvblRpbWVvdXQgPiAwKSB7XG4gICAgICB0eXBlID0gVFJBTlNJVElPTjtcbiAgICAgIHRpbWVvdXQgPSB0cmFuc2l0aW9uVGltZW91dDtcbiAgICAgIHByb3BDb3VudCA9IHRyYW5zaXRpb25EdXJhdGlvbnMubGVuZ3RoO1xuICAgIH1cbiAgfSBlbHNlIGlmIChleHBlY3RlZFR5cGUgPT09IEFOSU1BVElPTikge1xuICAgIGlmIChhbmltYXRpb25UaW1lb3V0ID4gMCkge1xuICAgICAgdHlwZSA9IEFOSU1BVElPTjtcbiAgICAgIHRpbWVvdXQgPSBhbmltYXRpb25UaW1lb3V0O1xuICAgICAgcHJvcENvdW50ID0gYW5pbWF0aW9uRHVyYXRpb25zLmxlbmd0aDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGltZW91dCA9IE1hdGgubWF4KHRyYW5zaXRpb25UaW1lb3V0LCBhbmltYXRpb25UaW1lb3V0KTtcbiAgICB0eXBlID0gdGltZW91dCA+IDAgPyB0cmFuc2l0aW9uVGltZW91dCA+IGFuaW1hdGlvblRpbWVvdXQgPyBUUkFOU0lUSU9OIDogQU5JTUFUSU9OIDogbnVsbDtcbiAgICBwcm9wQ291bnQgPSB0eXBlID8gdHlwZSA9PT0gVFJBTlNJVElPTiA/IHRyYW5zaXRpb25EdXJhdGlvbnMubGVuZ3RoIDogYW5pbWF0aW9uRHVyYXRpb25zLmxlbmd0aCA6IDA7XG4gIH1cbiAgY29uc3QgaGFzVHJhbnNmb3JtID0gdHlwZSA9PT0gVFJBTlNJVElPTiAmJiAvXFxiKHRyYW5zZm9ybXxhbGwpKCx8JCkvLnRlc3QoXG4gICAgZ2V0U3R5bGVQcm9wZXJ0aWVzKGAke1RSQU5TSVRJT059UHJvcGVydHlgKS50b1N0cmluZygpXG4gICk7XG4gIHJldHVybiB7XG4gICAgdHlwZSxcbiAgICB0aW1lb3V0LFxuICAgIHByb3BDb3VudCxcbiAgICBoYXNUcmFuc2Zvcm1cbiAgfTtcbn1cbmZ1bmN0aW9uIGdldFRpbWVvdXQoZGVsYXlzLCBkdXJhdGlvbnMpIHtcbiAgd2hpbGUgKGRlbGF5cy5sZW5ndGggPCBkdXJhdGlvbnMubGVuZ3RoKSB7XG4gICAgZGVsYXlzID0gZGVsYXlzLmNvbmNhdChkZWxheXMpO1xuICB9XG4gIHJldHVybiBNYXRoLm1heCguLi5kdXJhdGlvbnMubWFwKChkLCBpKSA9PiB0b01zKGQpICsgdG9NcyhkZWxheXNbaV0pKSk7XG59XG5mdW5jdGlvbiB0b01zKHMpIHtcbiAgaWYgKHMgPT09IFwiYXV0b1wiKSByZXR1cm4gMDtcbiAgcmV0dXJuIE51bWJlcihzLnNsaWNlKDAsIC0xKS5yZXBsYWNlKFwiLFwiLCBcIi5cIikpICogMWUzO1xufVxuZnVuY3Rpb24gZm9yY2VSZWZsb3coKSB7XG4gIHJldHVybiBkb2N1bWVudC5ib2R5Lm9mZnNldEhlaWdodDtcbn1cblxuZnVuY3Rpb24gcGF0Y2hDbGFzcyhlbCwgdmFsdWUsIGlzU1ZHKSB7XG4gIGNvbnN0IHRyYW5zaXRpb25DbGFzc2VzID0gZWxbdnRjS2V5XTtcbiAgaWYgKHRyYW5zaXRpb25DbGFzc2VzKSB7XG4gICAgdmFsdWUgPSAodmFsdWUgPyBbdmFsdWUsIC4uLnRyYW5zaXRpb25DbGFzc2VzXSA6IFsuLi50cmFuc2l0aW9uQ2xhc3Nlc10pLmpvaW4oXCIgXCIpO1xuICB9XG4gIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgZWwucmVtb3ZlQXR0cmlidXRlKFwiY2xhc3NcIik7XG4gIH0gZWxzZSBpZiAoaXNTVkcpIHtcbiAgICBlbC5zZXRBdHRyaWJ1dGUoXCJjbGFzc1wiLCB2YWx1ZSk7XG4gIH0gZWxzZSB7XG4gICAgZWwuY2xhc3NOYW1lID0gdmFsdWU7XG4gIH1cbn1cblxuY29uc3QgdlNob3dPcmlnaW5hbERpc3BsYXkgPSBTeW1ib2woXCJfdm9kXCIpO1xuY29uc3QgdlNob3dIaWRkZW4gPSBTeW1ib2woXCJfdnNoXCIpO1xuY29uc3QgdlNob3cgPSB7XG4gIGJlZm9yZU1vdW50KGVsLCB7IHZhbHVlIH0sIHsgdHJhbnNpdGlvbiB9KSB7XG4gICAgZWxbdlNob3dPcmlnaW5hbERpc3BsYXldID0gZWwuc3R5bGUuZGlzcGxheSA9PT0gXCJub25lXCIgPyBcIlwiIDogZWwuc3R5bGUuZGlzcGxheTtcbiAgICBpZiAodHJhbnNpdGlvbiAmJiB2YWx1ZSkge1xuICAgICAgdHJhbnNpdGlvbi5iZWZvcmVFbnRlcihlbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldERpc3BsYXkoZWwsIHZhbHVlKTtcbiAgICB9XG4gIH0sXG4gIG1vdW50ZWQoZWwsIHsgdmFsdWUgfSwgeyB0cmFuc2l0aW9uIH0pIHtcbiAgICBpZiAodHJhbnNpdGlvbiAmJiB2YWx1ZSkge1xuICAgICAgdHJhbnNpdGlvbi5lbnRlcihlbCk7XG4gICAgfVxuICB9LFxuICB1cGRhdGVkKGVsLCB7IHZhbHVlLCBvbGRWYWx1ZSB9LCB7IHRyYW5zaXRpb24gfSkge1xuICAgIGlmICghdmFsdWUgPT09ICFvbGRWYWx1ZSkgcmV0dXJuO1xuICAgIGlmICh0cmFuc2l0aW9uKSB7XG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgdHJhbnNpdGlvbi5iZWZvcmVFbnRlcihlbCk7XG4gICAgICAgIHNldERpc3BsYXkoZWwsIHRydWUpO1xuICAgICAgICB0cmFuc2l0aW9uLmVudGVyKGVsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyYW5zaXRpb24ubGVhdmUoZWwsICgpID0+IHtcbiAgICAgICAgICBzZXREaXNwbGF5KGVsLCBmYWxzZSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzZXREaXNwbGF5KGVsLCB2YWx1ZSk7XG4gICAgfVxuICB9LFxuICBiZWZvcmVVbm1vdW50KGVsLCB7IHZhbHVlIH0pIHtcbiAgICBzZXREaXNwbGF5KGVsLCB2YWx1ZSk7XG4gIH1cbn07XG5pZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICB2U2hvdy5uYW1lID0gXCJzaG93XCI7XG59XG5mdW5jdGlvbiBzZXREaXNwbGF5KGVsLCB2YWx1ZSkge1xuICBlbC5zdHlsZS5kaXNwbGF5ID0gdmFsdWUgPyBlbFt2U2hvd09yaWdpbmFsRGlzcGxheV0gOiBcIm5vbmVcIjtcbiAgZWxbdlNob3dIaWRkZW5dID0gIXZhbHVlO1xufVxuZnVuY3Rpb24gaW5pdFZTaG93Rm9yU1NSKCkge1xuICB2U2hvdy5nZXRTU1JQcm9wcyA9ICh7IHZhbHVlIH0pID0+IHtcbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICByZXR1cm4geyBzdHlsZTogeyBkaXNwbGF5OiBcIm5vbmVcIiB9IH07XG4gICAgfVxuICB9O1xufVxuXG5jb25zdCBDU1NfVkFSX1RFWFQgPSBTeW1ib2woISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IFwiQ1NTX1ZBUl9URVhUXCIgOiBcIlwiKTtcbmZ1bmN0aW9uIHVzZUNzc1ZhcnMoZ2V0dGVyKSB7XG4gIGNvbnN0IGluc3RhbmNlID0gZ2V0Q3VycmVudEluc3RhbmNlKCk7XG4gIGlmICghaW5zdGFuY2UpIHtcbiAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9k
20578dWN0aW9uXCIpICYmIHdhcm4oYHVzZUNzc1ZhcnMgaXMgY2FsbGVkIHdpdGhvdXQgY3VycmVudCBhY3RpdmUgY29tcG9uZW50IGluc3RhbmNlLmApO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCB1cGRhdGVUZWxlcG9ydHMgPSBpbnN0YW5jZS51dCA9ICh2YXJzID0gZ2V0dGVyKGluc3RhbmNlLnByb3h5KSkgPT4ge1xuICAgIEFycmF5LmZyb20oXG4gICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGBbZGF0YS12LW93bmVyPVwiJHtpbnN0YW5jZS51aWR9XCJdYClcbiAgICApLmZvckVhY2goKG5vZGUpID0+IHNldFZhcnNPbk5vZGUobm9kZSwgdmFycykpO1xuICB9O1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIGluc3RhbmNlLmdldENzc1ZhcnMgPSAoKSA9PiBnZXR0ZXIoaW5zdGFuY2UucHJveHkpO1xuICB9XG4gIGNvbnN0IHNldFZhcnMgPSAoKSA9PiB7XG4gICAgY29uc3QgdmFycyA9IGdldHRlcihpbnN0YW5jZS5wcm94eSk7XG4gICAgc2V0VmFyc09uVk5vZGUoaW5zdGFuY2Uuc3ViVHJlZSwgdmFycyk7XG4gICAgdXBkYXRlVGVsZXBvcnRzKHZhcnMpO1xuICB9O1xuICBvbk1vdW50ZWQoKCkgPT4ge1xuICAgIHdhdGNoUG9zdEVmZmVjdChzZXRWYXJzKTtcbiAgICBjb25zdCBvYiA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKHNldFZhcnMpO1xuICAgIG9iLm9ic2VydmUoaW5zdGFuY2Uuc3ViVHJlZS5lbC5wYXJlbnROb2RlLCB7IGNoaWxkTGlzdDogdHJ1ZSB9KTtcbiAgICBvblVubW91bnRlZCgoKSA9PiBvYi5kaXNjb25uZWN0KCkpO1xuICB9KTtcbn1cbmZ1bmN0aW9uIHNldFZhcnNPblZOb2RlKHZub2RlLCB2YXJzKSB7XG4gIGlmICh2bm9kZS5zaGFwZUZsYWcgJiAxMjgpIHtcbiAgICBjb25zdCBzdXNwZW5zZSA9IHZub2RlLnN1c3BlbnNlO1xuICAgIHZub2RlID0gc3VzcGVuc2UuYWN0aXZlQnJhbmNoO1xuICAgIGlmIChzdXNwZW5zZS5wZW5kaW5nQnJhbmNoICYmICFzdXNwZW5zZS5pc0h5ZHJhdGluZykge1xuICAgICAgc3VzcGVuc2UuZWZmZWN0cy5wdXNoKCgpID0+IHtcbiAgICAgICAgc2V0VmFyc09uVk5vZGUoc3VzcGVuc2UuYWN0aXZlQnJhbmNoLCB2YXJzKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICB3aGlsZSAodm5vZGUuY29tcG9uZW50KSB7XG4gICAgdm5vZGUgPSB2bm9kZS5jb21wb25lbnQuc3ViVHJlZTtcbiAgfVxuICBpZiAodm5vZGUuc2hhcGVGbGFnICYgMSAmJiB2bm9kZS5lbCkge1xuICAgIHNldFZhcnNPbk5vZGUodm5vZGUuZWwsIHZhcnMpO1xuICB9IGVsc2UgaWYgKHZub2RlLnR5cGUgPT09IEZyYWdtZW50KSB7XG4gICAgdm5vZGUuY2hpbGRyZW4uZm9yRWFjaCgoYykgPT4gc2V0VmFyc09uVk5vZGUoYywgdmFycykpO1xuICB9IGVsc2UgaWYgKHZub2RlLnR5cGUgPT09IFN0YXRpYykge1xuICAgIGxldCB7IGVsLCBhbmNob3IgfSA9IHZub2RlO1xuICAgIHdoaWxlIChlbCkge1xuICAgICAgc2V0VmFyc09uTm9kZShlbCwgdmFycyk7XG4gICAgICBpZiAoZWwgPT09IGFuY2hvcikgYnJlYWs7XG4gICAgICBlbCA9IGVsLm5leHRTaWJsaW5nO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gc2V0VmFyc09uTm9kZShlbCwgdmFycykge1xuICBpZiAoZWwubm9kZVR5cGUgPT09IDEpIHtcbiAgICBjb25zdCBzdHlsZSA9IGVsLnN0eWxlO1xuICAgIGxldCBjc3NUZXh0ID0gXCJcIjtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiB2YXJzKSB7XG4gICAgICBzdHlsZS5zZXRQcm9wZXJ0eShgLS0ke2tleX1gLCB2YXJzW2tleV0pO1xuICAgICAgY3NzVGV4dCArPSBgLS0ke2tleX06ICR7dmFyc1trZXldfTtgO1xuICAgIH1cbiAgICBzdHlsZVtDU1NfVkFSX1RFWFRdID0gY3NzVGV4dDtcbiAgfVxufVxuXG5jb25zdCBkaXNwbGF5UkUgPSAvKF58OylcXHMqZGlzcGxheVxccyo6LztcbmZ1bmN0aW9uIHBhdGNoU3R5bGUoZWwsIHByZXYsIG5leHQpIHtcbiAgY29uc3Qgc3R5bGUgPSBlbC5zdHlsZTtcbiAgY29uc3QgaXNDc3NTdHJpbmcgPSBpc1N0cmluZyhuZXh0KTtcbiAgbGV0IGhhc0NvbnRyb2xsZWREaXNwbGF5ID0gZmFsc2U7XG4gIGlmIChuZXh0ICYmICFpc0Nzc1N0cmluZykge1xuICAgIGlmIChwcmV2KSB7XG4gICAgICBpZiAoIWlzU3RyaW5nKHByZXYpKSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIHByZXYpIHtcbiAgICAgICAgICBpZiAobmV4dFtrZXldID09IG51bGwpIHtcbiAgICAgICAgICAgIHNldFN0eWxlKHN0eWxlLCBrZXksIFwiXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9yIChjb25zdCBwcmV2U3R5bGUgb2YgcHJldi5zcGxpdChcIjtcIikpIHtcbiAgICAgICAgICBjb25zdCBrZXkgPSBwcmV2U3R5bGUuc2xpY2UoMCwgcHJldlN0eWxlLmluZGV4T2YoXCI6XCIpKS50cmltKCk7XG4gICAgICAgICAgaWYgKG5leHRba2V5XSA9PSBudWxsKSB7XG4gICAgICAgICAgICBzZXRTdHlsZShzdHlsZSwga2V5LCBcIlwiKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCBrZXkgaW4gbmV4dCkge1xuICAgICAgaWYgKGtleSA9PT0gXCJkaXNwbGF5XCIpIHtcbiAgICAgICAgaGFzQ29udHJvbGxlZERpc3BsYXkgPSB0cnVlO1xuICAgICAgfVxuICAgICAgc2V0U3R5bGUoc3R5bGUsIGtleSwgbmV4dFtrZXldKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKGlzQ3NzU3RyaW5nKSB7XG4gICAgICBpZiAocHJldiAhPT0gbm
20578V4dCkge1xuICAgICAgICBjb25zdCBjc3NWYXJUZXh0ID0gc3R5bGVbQ1NTX1ZBUl9URVhUXTtcbiAgICAgICAgaWYgKGNzc1ZhclRleHQpIHtcbiAgICAgICAgICBuZXh0ICs9IFwiO1wiICsgY3NzVmFyVGV4dDtcbiAgICAgICAgfVxuICAgICAgICBzdHlsZS5jc3NUZXh0ID0gbmV4dDtcbiAgICAgICAgaGFzQ29udHJvbGxlZERpc3BsYXkgPSBkaXNwbGF5UkUudGVzdChuZXh0KTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHByZXYpIHtcbiAgICAgIGVsLnJlbW92ZUF0dHJpYnV0ZShcInN0eWxlXCIpO1xuICAgIH1cbiAgfVxuICBpZiAodlNob3dPcmlnaW5hbERpc3BsYXkgaW4gZWwpIHtcbiAgICBlbFt2U2hvd09yaWdpbmFsRGlzcGxheV0gPSBoYXNDb250cm9sbGVkRGlzcGxheSA/IHN0eWxlLmRpc3BsYXkgOiBcIlwiO1xuICAgIGlmIChlbFt2U2hvd0hpZGRlbl0pIHtcbiAgICAgIHN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICB9XG4gIH1cbn1cbmNvbnN0IHNlbWljb2xvblJFID0gL1teXFxcXF07XFxzKiQvO1xuY29uc3QgaW1wb3J0YW50UkUgPSAvXFxzKiFpbXBvcnRhbnQkLztcbmZ1bmN0aW9uIHNldFN0eWxlKHN0eWxlLCBuYW1lLCB2YWwpIHtcbiAgaWYgKGlzQXJyYXkodmFsKSkge1xuICAgIHZhbC5mb3JFYWNoKCh2KSA9PiBzZXRTdHlsZShzdHlsZSwgbmFtZSwgdikpO1xuICB9IGVsc2Uge1xuICAgIGlmICh2YWwgPT0gbnVsbCkgdmFsID0gXCJcIjtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgaWYgKHNlbWljb2xvblJFLnRlc3QodmFsKSkge1xuICAgICAgICB3YXJuKFxuICAgICAgICAgIGBVbmV4cGVjdGVkIHNlbWljb2xvbiBhdCB0aGUgZW5kIG9mICcke25hbWV9JyBzdHlsZSB2YWx1ZTogJyR7dmFsfSdgXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgoXCItLVwiKSkge1xuICAgICAgc3R5bGUuc2V0UHJvcGVydHkobmFtZSwgdmFsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgcHJlZml4ZWQgPSBhdXRvUHJlZml4KHN0eWxlLCBuYW1lKTtcbiAgICAgIGlmIChpbXBvcnRhbnRSRS50ZXN0KHZhbCkpIHtcbiAgICAgICAgc3R5bGUuc2V0UHJvcGVydHkoXG4gICAgICAgICAgaHlwaGVuYXRlKHByZWZpeGVkKSxcbiAgICAgICAgICB2YWwucmVwbGFjZShpbXBvcnRhbnRSRSwgXCJcIiksXG4gICAgICAgICAgXCJpbXBvcnRhbnRcIlxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3R5bGVbcHJlZml4ZWRdID0gdmFsO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuY29uc3QgcHJlZml4ZXMgPSBbXCJXZWJraXRcIiwgXCJNb3pcIiwgXCJtc1wiXTtcbmNvbnN0IHByZWZpeENhY2hlID0ge307XG5mdW5jdGlvbiBhdXRvUHJlZml4KHN0eWxlLCByYXdOYW1lKSB7XG4gIGNvbnN0IGNhY2hlZCA9IHByZWZpeENhY2hlW3Jhd05hbWVdO1xuICBpZiAoY2FjaGVkKSB7XG4gICAgcmV0dXJuIGNhY2hlZDtcbiAgfVxuICBsZXQgbmFtZSA9IGNhbWVsaXplKHJhd05hbWUpO1xuICBpZiAobmFtZSAhPT0gXCJmaWx0ZXJcIiAmJiBuYW1lIGluIHN0eWxlKSB7XG4gICAgcmV0dXJuIHByZWZpeENhY2hlW3Jhd05hbWVdID0gbmFtZTtcbiAgfVxuICBuYW1lID0gY2FwaXRhbGl6ZShuYW1lKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcmVmaXhlcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHByZWZpeGVkID0gcHJlZml4ZXNbaV0gKyBuYW1lO1xuICAgIGlmIChwcmVmaXhlZCBpbiBzdHlsZSkge1xuICAgICAgcmV0dXJuIHByZWZpeENhY2hlW3Jhd05hbWVdID0gcHJlZml4ZWQ7XG4gICAgfVxuICB9XG4gIHJldHVybiByYXdOYW1lO1xufVxuXG5jb25zdCB4bGlua05TID0gXCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCI7XG5mdW5jdGlvbiBwYXRjaEF0dHIoZWwsIGtleSwgdmFsdWUsIGlzU1ZHLCBpbnN0YW5jZSwgaXNCb29sZWFuID0gaXNTcGVjaWFsQm9vbGVhbkF0dHIoa2V5KSkge1xuICBpZiAoaXNTVkcgJiYga2V5LnN0YXJ0c1dpdGgoXCJ4bGluazpcIikpIHtcbiAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgZWwucmVtb3ZlQXR0cmlidXRlTlMoeGxpbmtOUywga2V5LnNsaWNlKDYsIGtleS5sZW5ndGgpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZWwuc2V0QXR0cmlidXRlTlMoeGxpbmtOUywga2V5LCB2YWx1ZSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmICh2YWx1ZSA9PSBudWxsIHx8IGlzQm9vbGVhbiAmJiAhaW5jbHVkZUJvb2xlYW5BdHRyKHZhbHVlKSkge1xuICAgICAgZWwucmVtb3ZlQXR0cmlidXRlKGtleSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsLnNldEF0dHJpYnV0ZShcbiAgICAgICAga2V5LFxuICAgICAgICBpc0Jvb2xlYW4gPyBcIlwiIDogaXNTeW1ib2wodmFsdWUpID8gU3RyaW5nKHZhbHVlKSA6IHZhbHVlXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBwYXRjaERPTVByb3AoZWwsIGtleSwgdmFsdWUsIHBhcmVudENvbXBvbmVudCkge1xuICBpZiAoa2V5ID09PSBcImlubmVySFRNTFwiIHx8IGtleSA9PT0gXCJ0ZXh0Q29udGVudFwiKSB7XG4gICAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybjtcbiAgICBlbFtrZXldID0gdmFsdWU7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHRhZyA9IGVsLnRhZ05hbWU7XG4gIGlmIChrZXkgPT09IFwidmFsdWVcIiAmJiB0YWcgIT09IFwiUFJPR1JFU1NcIiAmJiAvLyBjdXN0b20gZWxlbWVudHMgbWF5IHVzZSBfdmFsdWUgaW50ZXJuYWxseVxuICAhdGFnLmluY2x1ZGVzKFwiLVwiKSkge1xuICAgIGNvbnN0IG9sZFZhbHVlID0gdGFnID09PSBcIk9QVElPTlwiID8gZWwuZ2V0QXR0cmlidXRlKFwidmFsdWVcIikgfHwgXCJcIiA6IGVsLnZhbHVlO1xuICAgIGNvbnN0IG5ld1ZhbHVlID0gdmFsdWUgPT0gbnVsbCA/IFwiXCIgOiBTdHJpbmcodmFsdWUpO1xuICAgIGlmIChvbGRWYWx1ZSAhPT0gbmV3VmFsdWUgfHwgIShcIl92YWx1ZVwiIGluIGVsKSkge1xuICAgICAgZWwudmFsdWUgPSBuZXdWYWx1ZTtcbiAgICB9XG4gICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgIGVsLnJlbW92ZUF0dHJpYnV0ZShrZXkpO1xuICAgIH1cbiAgICBlbC5fdmFsdWUgPSB2YWx1ZTtcbiAgICByZXR1cm47XG4gIH1cbiAgbGV0IG5lZWRSZW1vdmUgPSBmYWxzZTtcbiAgaWYgKHZhbHVlID09PSBcIlwiIHx8IHZhbHVlID09IG51bGwpIHtcbiAgICBjb25zdCB0eXBlID0gdHlwZW9mIGVsW2tleV07XG4gICAgaWYgKHR5cGUgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICB2YWx1ZSA9IGluY2x1ZGVCb29sZWFuQXR0cih2YWx1ZSk7XG4gICAgfSBlbHNlIGlmICh2YWx1ZSA9PSBudWxsICYmIHR5cGUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHZhbHVlID0gXCJcIjtcbiAgICAgIG5lZWRSZW1vdmUgPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgdmFsdWUgPSAwO1xuICAgICAgbmVlZFJlbW92ZSA9IHRydWU7XG4gICAgfVxuICB9XG4gI
20578HRyeSB7XG4gICAgZWxba2V5XSA9IHZhbHVlO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgIW5lZWRSZW1vdmUpIHtcbiAgICAgIHdhcm4oXG4gICAgICAgIGBGYWlsZWQgc2V0dGluZyBwcm9wIFwiJHtrZXl9XCIgb24gPCR7dGFnLnRvTG93ZXJDYXNlKCl9PjogdmFsdWUgJHt2YWx1ZX0gaXMgaW52YWxpZC5gLFxuICAgICAgICBlXG4gICAgICApO1xuICAgIH1cbiAgfVxuICBuZWVkUmVtb3ZlICYmIGVsLnJlbW92ZUF0dHJpYnV0ZShrZXkpO1xufVxuXG5mdW5jdGlvbiBhZGRFdmVudExpc3RlbmVyKGVsLCBldmVudCwgaGFuZGxlciwgb3B0aW9ucykge1xuICBlbC5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCBoYW5kbGVyLCBvcHRpb25zKTtcbn1cbmZ1bmN0aW9uIHJlbW92ZUV2ZW50TGlzdGVuZXIoZWwsIGV2ZW50LCBoYW5kbGVyLCBvcHRpb25zKSB7XG4gIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQsIGhhbmRsZXIsIG9wdGlvbnMpO1xufVxuY29uc3QgdmVpS2V5ID0gU3ltYm9sKFwiX3ZlaVwiKTtcbmZ1bmN0aW9uIHBhdGNoRXZlbnQoZWwsIHJhd05hbWUsIHByZXZWYWx1ZSwgbmV4dFZhbHVlLCBpbnN0YW5jZSA9IG51bGwpIHtcbiAgY29uc3QgaW52b2tlcnMgPSBlbFt2ZWlLZXldIHx8IChlbFt2ZWlLZXldID0ge30pO1xuICBjb25zdCBleGlzdGluZ0ludm9rZXIgPSBpbnZva2Vyc1tyYXdOYW1lXTtcbiAgaWYgKG5leHRWYWx1ZSAmJiBleGlzdGluZ0ludm9rZXIpIHtcbiAgICBleGlzdGluZ0ludm9rZXIudmFsdWUgPSAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8gc2FuaXRpemVFdmVudFZhbHVlKG5leHRWYWx1ZSwgcmF3TmFtZSkgOiBuZXh0VmFsdWU7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgW25hbWUsIG9wdGlvbnNdID0gcGFyc2VOYW1lKHJhd05hbWUpO1xuICAgIGlmIChuZXh0VmFsdWUpIHtcbiAgICAgIGNvbnN0IGludm9rZXIgPSBpbnZva2Vyc1tyYXdOYW1lXSA9IGNyZWF0ZUludm9rZXIoXG4gICAgICAgICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBzYW5pdGl6ZUV2ZW50VmFsdWUobmV4dFZhbHVlLCByYXdOYW1lKSA6IG5leHRWYWx1ZSxcbiAgICAgICAgaW5zdGFuY2VcbiAgICAgICk7XG4gICAgICBhZGRFdmVudExpc3RlbmVyKGVsLCBuYW1lLCBpbnZva2VyLCBvcHRpb25zKTtcbiAgICB9IGVsc2UgaWYgKGV4aXN0aW5nSW52b2tlcikge1xuICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcihlbCwgbmFtZSwgZXhpc3RpbmdJbnZva2VyLCBvcHRpb25zKTtcbiAgICAgIGludm9rZXJzW3Jhd05hbWVdID0gdm9pZCAwO1xuICAgIH1cbiAgfVxufVxuY29uc3Qgb3B0aW9uc01vZGlmaWVyUkUgPSAvKD86T25jZXxQYXNzaXZlfENhcHR1cmUpJC87XG5mdW5jdGlvbiBwYXJzZU5hbWUobmFtZSkge1xuICBsZXQgb3B0aW9ucztcbiAgaWYgKG9wdGlvbnNNb2RpZmllclJFLnRlc3QobmFtZSkpIHtcbiAgICBvcHRpb25zID0ge307XG4gICAgbGV0IG07XG4gICAgd2hpbGUgKG0gPSBuYW1lLm1hdGNoKG9wdGlvbnNNb2RpZmllclJFKSkge1xuICAgICAgbmFtZSA9IG5hbWUuc2xpY2UoMCwgbmFtZS5sZW5ndGggLSBtWzBdLmxlbmd0aCk7XG4gICAgICBvcHRpb25zW21bMF0udG9Mb3dlckNhc2UoKV0gPSB0cnVlO1xuICAgIH1cbiAgfVxuICBjb25zdCBldmVudCA9IG5hbWVbMl0gPT09IFwiOlwiID8gbmFtZS5zbGljZSgzKSA6IGh5cGhlbmF0ZShuYW1lLnNsaWNlKDIpKTtcbiAgcmV0dXJuIFtldmVudCwgb3B0aW9uc107XG59XG5sZXQgY2FjaGVkTm93ID0gMDtcbmNvbnN0IHAgPSAvKiBAX19QVVJFX18gKi8gUHJvbWlzZS5yZXNvbHZlKCk7XG5jb25zdCBnZXROb3cgPSAoKSA9PiBjYWNoZWROb3cgfHwgKHAudGhlbigoKSA9PiBjYWNoZWROb3cgPSAwKSwgY2FjaGVkTm93ID0gRGF0ZS5ub3coKSk7XG5mdW5jdGlvbiBjcmVhdGVJbnZva2VyKGluaXRpYWxWYWx1ZSwgaW5zdGFuY2UpIHtcbiAgY29uc3QgaW52b2tlciA9IChlKSA9PiB7XG4gICAgaWYgKCFlLl92dHMpIHtcbiAgICAgIGUuX3Z0cyA9IERhdGUubm93KCk7XG4gICAgfSBlbHNlIGlmIChlLl92dHMgPD0gaW52b2tlci5hdHRhY2hlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjYWxsV2l0aEFzeW5jRXJyb3JIYW5kbGluZyhcbiAgICAgIHBhdGNoU3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKGUsIGludm9rZXIudmFsdWUpLFxuICAgICAgaW5zdGFuY2UsXG4gICAgICA1LFxuICAgICAgW2VdXG4gICAgKTtcbiAgfTtcbiAgaW52b2tlci52YWx1ZSA9IGluaXRpYWxWYWx1ZTtcbiAgaW52b2tlci5hdHRhY2hlZCA9IGdldE5vdygpO1xuICByZXR1cm4gaW52b2tlcjtcbn1cbmZ1bmN0aW9uIHNhbml0aXplRXZlbnRWYWx1ZSh2YWx1ZSwgcHJvcE5hbWUpIHtcbiAgaWYgKGlzRnVuY3Rpb24odmFsdWUpIHx8IGlzQXJyYXkodmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIHdhcm4oXG4gICAgYFdyb25nIHR5cGUgcGFzc2VkIGFzIGV2ZW50IGhhbmRsZXIgdG8gJHtwcm9wTmFtZX0gLSBkaWQgeW91IGZvcmdldCBAIG9yIDogaW4gZnJvbnQgb2YgeW91ciBwcm9wP1xuRXhwZWN0ZWQgZnVuY3Rpb24gb3IgYXJyYXkgb2YgZnVuY3Rpb25zLCByZWNlaXZlZCB0eXBlICR7dHlwZW9mIHZhbHVlfS5gXG4gICk7XG4gIHJldHVybiBOT09QO1xufVxuZnVuY3Rpb24gcGF0Y2hTdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oZSwgdmFsdWUpIHtcbiAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgY29uc3Qgb3JpZ2luYWxTdG9wID0gZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb247XG4gICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24gPSAoKSA9PiB7XG4gICAgICBvcmlnaW5hbFN0b3AuY2FsbChlKTtcbiAgICAgIGUuX3N0b3BwZWQgPSB0cnVlO1xuICAgIH07XG4gICAgcmV0dXJuIHZhbHVlLm1hcChcbiAgICAgIChmbikgPT4gKGUyKSA9PiAhZTIuX3N0b3BwZWQgJiYgZm4gJiYgZm4oZTIpXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbn1cblxuY29uc3QgaXNOYXRpdmVPbiA9IChrZXkpID0+IGtleS5jaGFyQ29kZUF0KDApID09PSAxMTEgJiYga2V5LmNoYXJDb2RlQXQoMSkgPT09IDExMCAmJiAvLyBsb3dlcmNhc2UgbGV0dGVyXG5rZXkuY2hhckNvZGVBdCgyKSA+IDk2ICYmIGtleS5jaGFyQ29kZUF0KDIpIDwgMTIzO1xuY29uc3QgcGF0Y2hQcm9wID0gKGVsLCBrZXksIHByZXZWYWx1ZSwgbmV4dFZhbHVlLCBuYW1lc3BhY2UsIHBhcmVudENvbXBvbmVudCkgPT4ge1xuICBjb25zdCBpc1NWRyA9IG5hbWVzcGFjZSA9PT0gXCJzdmdcIjtcbiAgaWYgKGtleSA9PT0gXCJjbGFzc1wiKSB7XG4gICAgcGF0Y2hDbGFzcyhlbCwgbmV4dFZhbHVlLCBpc1NWRyk7XG4gIH0gZWxzZSBpZiAoa2V5ID09PSBcInN0eWxlXCIpIHtcbiAgICBwYXRjaFN0eWxlKGVsLCBwcmV2VmFsdWUsIG5leHRWYWx1ZSk7XG4gIH0gZWxzZSBpZiAoaXNPbihrZXkpKSB7XG4gICAgaWYgKCFpc01vZGVsTGlzdGVuZXIoa2V5KSkge1xuICAgICAgcGF0Y2hFdmVudChlbCwga2V5LCBwcmV2VmFsdWUsIG5leHRWYWx1ZSwgcGFyZW50Q29tcG9uZW50KTtcbiAgICB9XG4gI
20578H0gZWxzZSBpZiAoa2V5WzBdID09PSBcIi5cIiA/IChrZXkgPSBrZXkuc2xpY2UoMSksIHRydWUpIDoga2V5WzBdID09PSBcIl5cIiA/IChrZXkgPSBrZXkuc2xpY2UoMSksIGZhbHNlKSA6IHNob3VsZFNldEFzUHJvcChlbCwga2V5LCBuZXh0VmFsdWUsIGlzU1ZHKSkge1xuICAgIHBhdGNoRE9NUHJvcChlbCwga2V5LCBuZXh0VmFsdWUpO1xuICAgIGlmICghZWwudGFnTmFtZS5pbmNsdWRlcyhcIi1cIikgJiYgKGtleSA9PT0gXCJ2YWx1ZVwiIHx8IGtleSA9PT0gXCJjaGVja2VkXCIgfHwga2V5ID09PSBcInNlbGVjdGVkXCIpKSB7XG4gICAgICBwYXRjaEF0dHIoZWwsIGtleSwgbmV4dFZhbHVlLCBpc1NWRywgcGFyZW50Q29tcG9uZW50LCBrZXkgIT09IFwidmFsdWVcIik7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChrZXkgPT09IFwidHJ1ZS12YWx1ZVwiKSB7XG4gICAgICBlbC5fdHJ1ZVZhbHVlID0gbmV4dFZhbHVlO1xuICAgIH0gZWxzZSBpZiAoa2V5ID09PSBcImZhbHNlLXZhbHVlXCIpIHtcbiAgICAgIGVsLl9mYWxzZVZhbHVlID0gbmV4dFZhbHVlO1xuICAgIH1cbiAgICBwYXRjaEF0dHIoZWwsIGtleSwgbmV4dFZhbHVlLCBpc1NWRyk7XG4gIH1cbn07XG5mdW5jdGlvbiBzaG91bGRTZXRBc1Byb3AoZWwsIGtleSwgdmFsdWUsIGlzU1ZHKSB7XG4gIGlmIChpc1NWRykge1xuICAgIGlmIChrZXkgPT09IFwiaW5uZXJIVE1MXCIgfHwga2V5ID09PSBcInRleHRDb250ZW50XCIpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoa2V5IGluIGVsICYmIGlzTmF0aXZlT24oa2V5KSAmJiBpc0Z1bmN0aW9uKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoa2V5ID09PSBcInNwZWxsY2hlY2tcIiB8fCBrZXkgPT09IFwiZHJhZ2dhYmxlXCIgfHwga2V5ID09PSBcInRyYW5zbGF0ZVwiKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChrZXkgPT09IFwiZm9ybVwiKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChrZXkgPT09IFwibGlzdFwiICYmIGVsLnRhZ05hbWUgPT09IFwiSU5QVVRcIikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoa2V5ID09PSBcInR5cGVcIiAmJiBlbC50YWdOYW1lID09PSBcIlRFWFRBUkVBXCIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKGtleSA9PT0gXCJ3aWR0aFwiIHx8IGtleSA9PT0gXCJoZWlnaHRcIikge1xuICAgIGNvbnN0IHRhZyA9IGVsLnRhZ05hbWU7XG4gICAgaWYgKHRhZyA9PT0gXCJJTUdcIiB8fCB0YWcgPT09IFwiVklERU9cIiB8fCB0YWcgPT09IFwiQ0FOVkFTXCIgfHwgdGFnID09PSBcIlNPVVJDRVwiKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIGlmIChpc05hdGl2ZU9uKGtleSkgJiYgaXNTdHJpbmcodmFsdWUpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiBrZXkgaW4gZWw7XG59XG5cbi8qISAjX19OT19TSURFX0VGRkVDVFNfXyAqL1xuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmZ1bmN0aW9uIGRlZmluZUN1c3RvbUVsZW1lbnQob3B0aW9ucywgZXh0cmFPcHRpb25zLCBoeWRyYXRlMikge1xuICBjb25zdCBDb21wID0gZGVmaW5lQ29tcG9uZW50KG9wdGlvbnMsIGV4dHJhT3B0aW9ucyk7XG4gIGNsYXNzIFZ1ZUN1c3RvbUVsZW1lbnQgZXh0ZW5kcyBWdWVFbGVtZW50IHtcbiAgICBjb25zdHJ1Y3Rvcihpbml0aWFsUHJvcHMpIHtcbiAgICAgIHN1cGVyKENvbXAsIGluaXRpYWxQcm9wcywgaHlkcmF0ZTIpO1xuICAgIH1cbiAgfVxuICBWdWVDdXN0b21FbGVtZW50LmRlZiA9IENvbXA7XG4gIHJldHVybiBWdWVDdXN0b21FbGVtZW50O1xufVxuLyohICNfX05PX1NJREVfRUZGRUNUU19fICovXG5jb25zdCBkZWZpbmVTU1JDdXN0b21FbGVtZW50ID0gLyogQF9fTk9fU0lERV9FRkZFQ1RTX18gKi8gKG9wdGlvbnMsIGV4dHJhT3B0aW9ucykgPT4ge1xuICByZXR1cm4gLyogQF9fUFVSRV9fICovIGRlZmluZUN1c3RvbUVsZW1lbnQob3B0aW9ucywgZXh0cmFPcHRpb25zLCBoeWRyYXRlKTtcbn07XG5jb25zdCBCYXNlQ2xhc3MgPSB0eXBlb2YgSFRNTEVsZW1lbnQgIT09IFwidW5kZWZpbmVkXCIgPyBIVE1MRWxlbWVudCA6IGNsYXNzIHtcbn07XG5jbGFzcyBWdWVFbGVtZW50IGV4dGVuZHMgQmFzZUNsYXNzIHtcbiAgY29uc3RydWN0b3IoX2RlZiwgX3Byb3BzID0ge30sIGh5ZHJhdGUyKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLl9kZWYgPSBfZGVmO1xuICAgIHRoaXMuX3Byb3BzID0gX3Byb3BzO1xuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHRoaXMuX2luc3RhbmNlID0gbnVsbDtcbiAgICB0aGlzLl9jb25uZWN0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9yZXNvbHZlZCA9IGZhbHNlO1xuICAgIHRoaXMuX251bWJlclByb3BzID0gbnVsbDtcbiAgICB0aGlzLl9vYiA9IG51bGw7XG4gICAgaWYgKHRoaXMuc2hhZG93Um9vdCAmJiBoeWRyYXRlMikge1xuICAgICAgaHlkcmF0ZTIodGhpcy5fY3JlYXRlVk5vZGUoKSwgdGhpcy5zaGFkb3dSb290KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgdGhpcy5zaGFkb3dSb290KSB7XG4gICAgICAgIHdhcm4oXG4gICAgICAgICAgYEN1c3RvbSBlbGVtZW50IGhhcyBwcmUtcmVuZGVyZWQgZGVjbGFyYXRpdmUgc2hhZG93IHJvb3QgYnV0IGlzIG5vdCBkZWZpbmVkIGFzIGh5ZHJhdGFibGUuIFVzZSBcXGBkZWZpbmVTU1JDdXN0b21FbGVtZW50XFxgLmBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuYXR0YWNoU2hhZG93KHsgbW9kZTogXCJvcGVuXCIgfSk7XG4gICAgICBpZiAoIXRoaXMuX2RlZi5fX2FzeW5jTG9hZGVyKSB7XG4gICAgICAgIHRoaXMuX3Jlc29sdmVQcm9wcyh0aGlzLl9kZWYpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICB0aGlzLl9jb25uZWN0ZWQgPSB0cnVlO1xuICAgIGlmICghdGhpcy5faW5zdGFuY2UpIHtcbiAgICAgIGlmICh0aGlzLl9yZXNvbHZlZCkge1xuICAgICAgICB0aGlzLl91cGRhdGUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgI
20578HRoaXMuX3Jlc29sdmVEZWYoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgdGhpcy5fY29ubmVjdGVkID0gZmFsc2U7XG4gICAgbmV4dFRpY2soKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLl9jb25uZWN0ZWQpIHtcbiAgICAgICAgaWYgKHRoaXMuX29iKSB7XG4gICAgICAgICAgdGhpcy5fb2IuZGlzY29ubmVjdCgpO1xuICAgICAgICAgIHRoaXMuX29iID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZW5kZXIobnVsbCwgdGhpcy5zaGFkb3dSb290KTtcbiAgICAgICAgdGhpcy5faW5zdGFuY2UgPSBudWxsO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIC8qKlxuICAgKiByZXNvbHZlIGlubmVyIGNvbXBvbmVudCBkZWZpbml0aW9uIChoYW5kbGUgcG9zc2libGUgYXN5bmMgY29tcG9uZW50KVxuICAgKi9cbiAgX3Jlc29sdmVEZWYoKSB7XG4gICAgdGhpcy5fcmVzb2x2ZWQgPSB0cnVlO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5hdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLl9zZXRBdHRyKHRoaXMuYXR0cmlidXRlc1tpXS5uYW1lKTtcbiAgICB9XG4gICAgdGhpcy5fb2IgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigobXV0YXRpb25zKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IG0gb2YgbXV0YXRpb25zKSB7XG4gICAgICAgIHRoaXMuX3NldEF0dHIobS5hdHRyaWJ1dGVOYW1lKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLl9vYi5vYnNlcnZlKHRoaXMsIHsgYXR0cmlidXRlczogdHJ1ZSB9KTtcbiAgICBjb25zdCByZXNvbHZlID0gKGRlZiwgaXNBc3luYyA9IGZhbHNlKSA9PiB7XG4gICAgICBjb25zdCB7IHByb3BzLCBzdHlsZXMgfSA9IGRlZjtcbiAgICAgIGxldCBudW1iZXJQcm9wcztcbiAgICAgIGlmIChwcm9wcyAmJiAhaXNBcnJheShwcm9wcykpIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gcHJvcHMpIHtcbiAgICAgICAgICBjb25zdCBvcHQgPSBwcm9wc1trZXldO1xuICAgICAgICAgIGlmIChvcHQgPT09IE51bWJlciB8fCBvcHQgJiYgb3B0LnR5cGUgPT09IE51bWJlcikge1xuICAgICAgICAgICAgaWYgKGtleSBpbiB0aGlzLl9wcm9wcykge1xuICAgICAgICAgICAgICB0aGlzLl9wcm9wc1trZXldID0gdG9OdW1iZXIodGhpcy5fcHJvcHNba2V5XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAobnVtYmVyUHJvcHMgfHwgKG51bWJlclByb3BzID0gLyogQF9fUFVSRV9fICovIE9iamVjdC5jcmVhdGUobnVsbCkpKVtjYW1lbGl6ZSQxKGtleSldID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuX251bWJlclByb3BzID0gbnVtYmVyUHJvcHM7XG4gICAgICBpZiAoaXNBc3luYykge1xuICAgICAgICB0aGlzLl9yZXNvbHZlUHJvcHMoZGVmKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2FwcGx5U3R5bGVzKHN0eWxlcyk7XG4gICAgICB0aGlzLl91cGRhdGUoKTtcbiAgICB9O1xuICAgIGNvbnN0IGFzeW5jRGVmID0gdGhpcy5fZGVmLl9fYXN5bmNMb2FkZXI7XG4gICAgaWYgKGFzeW5jRGVmKSB7XG4gICAgICBhc3luY0RlZigpLnRoZW4oKGRlZikgPT4gcmVzb2x2ZShkZWYsIHRydWUpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzb2x2ZSh0aGlzLl9kZWYpO1xuICAgIH1cbiAgfVxuICBfcmVzb2x2ZVByb3BzKGRlZikge1xuICAgIGNvbnN0IHsgcHJvcHMgfSA9IGRlZjtcbiAgICBjb25zdCBkZWNsYXJlZFByb3BLZXlzID0gaXNBcnJheShwcm9wcykgPyBwcm9wcyA6IE9iamVjdC5rZXlzKHByb3BzIHx8IHt9KTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh0aGlzKSkge1xuICAgICAgaWYgKGtleVswXSAhPT0gXCJfXCIgJiYgZGVjbGFyZWRQcm9wS2V5cy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgIHRoaXMuX3NldFByb3Aoa2V5LCB0aGlzW2tleV0sIHRydWUsIGZhbHNlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCBrZXkgb2YgZGVjbGFyZWRQcm9wS2V5cy5tYXAoY2FtZWxpemUkMSkpIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBrZXksIHtcbiAgICAgICAgZ2V0KCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRQcm9wKGtleSk7XG4gICAgICAgIH0sXG4gICAgICAgIHNldCh2YWwpIHtcbiAgICAgICAgICB0aGlzLl9zZXRQcm9wKGtleSwgdmFsKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIF9zZXRBdHRyKGtleSkge1xuICAgIGxldCB2YWx1ZSA9IHRoaXMuaGFzQXR0cmlidXRlKGtleSkgPyB0aGlzLmdldEF0dHJpYnV0ZShrZXkpIDogdm9pZCAwO1xuICAgIGNvbnN0IGNhbWVsS2V5ID0gY2FtZWxpemUkMShrZXkpO1xuICAgIGlmICh0aGlzLl9udW1iZXJQcm9wcyAmJiB0aGlzLl9udW1iZXJQcm9wc1tjYW1lbEtleV0pIHtcbiAgICAgIHZhbHVlID0gdG9OdW1iZXIodmFsdWUpO1xuICAgIH1cbiAgICB0aGlzLl9zZXRQcm9wKGNhbWVsS2V5LCB2YWx1ZSwgZmFsc2UpO1xuICB9XG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIF9nZXRQcm9wKGtleSkge1xuICAgIHJldHVybiB0aGlzLl9wcm9wc1trZXldO1xuICB9XG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIF9zZXRQcm9wKGtleSwgdmFsLCBzaG91bGRSZWZsZWN0ID0gdHJ1ZSwgc2hvdWxkVXBkYXRlID0gdHJ1ZSkge1xuICAgIGlmICh2YWwgIT09IHRoaXMuX3Byb3BzW2tleV0pIHtcbiAgICAgIHRoaXMuX3Byb3BzW2tleV0gPSB2YWw7XG4gICAgICBpZiAoc2hvdWxkVXBkYXRlICYmIHRoaXMuX2luc3RhbmNlKSB7XG4gICAgICAgIHRoaXMuX3VwZGF0ZSgpO1xuICAgICAgfVxuICAgICAgaWYgKHNob3VsZFJlZmxlY3QpIHtcbiAgICAgICAgaWYgKHZhbCA9PT0gdHJ1ZSkge1xuICAgICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKGh5cGhlbmF0ZShrZXkpLCBcIlwiKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsID09PSBcInN0cmluZ1wiIHx8IHR5cGVvZiB2YWwgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZShoeXBoZW5
20578hdGUoa2V5KSwgdmFsICsgXCJcIik7XG4gICAgICAgIH0gZWxzZSBpZiAoIXZhbCkge1xuICAgICAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKGh5cGhlbmF0ZShrZXkpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBfdXBkYXRlKCkge1xuICAgIHJlbmRlcih0aGlzLl9jcmVhdGVWTm9kZSgpLCB0aGlzLnNoYWRvd1Jvb3QpO1xuICB9XG4gIF9jcmVhdGVWTm9kZSgpIHtcbiAgICBjb25zdCB2bm9kZSA9IGNyZWF0ZVZOb2RlKHRoaXMuX2RlZiwgZXh0ZW5kKHt9LCB0aGlzLl9wcm9wcykpO1xuICAgIGlmICghdGhpcy5faW5zdGFuY2UpIHtcbiAgICAgIHZub2RlLmNlID0gKGluc3RhbmNlKSA9PiB7XG4gICAgICAgIHRoaXMuX2luc3RhbmNlID0gaW5zdGFuY2U7XG4gICAgICAgIGluc3RhbmNlLmlzQ0UgPSB0cnVlO1xuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgIGluc3RhbmNlLmNlUmVsb2FkID0gKG5ld1N0eWxlcykgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3N0eWxlcykge1xuICAgICAgICAgICAgICB0aGlzLl9zdHlsZXMuZm9yRWFjaCgocykgPT4gdGhpcy5zaGFkb3dSb290LnJlbW92ZUNoaWxkKHMpKTtcbiAgICAgICAgICAgICAgdGhpcy5fc3R5bGVzLmxlbmd0aCA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9hcHBseVN0eWxlcyhuZXdTdHlsZXMpO1xuICAgICAgICAgICAgdGhpcy5faW5zdGFuY2UgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlKCk7XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkaXNwYXRjaCA9IChldmVudCwgYXJncykgPT4ge1xuICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgICAgICAgIG5ldyBDdXN0b21FdmVudChldmVudCwge1xuICAgICAgICAgICAgICBkZXRhaWw6IGFyZ3NcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKTtcbiAgICAgICAgfTtcbiAgICAgICAgaW5zdGFuY2UuZW1pdCA9IChldmVudCwgLi4uYXJncykgPT4ge1xuICAgICAgICAgIGRpc3BhdGNoKGV2ZW50LCBhcmdzKTtcbiAgICAgICAgICBpZiAoaHlwaGVuYXRlKGV2ZW50KSAhPT0gZXZlbnQpIHtcbiAgICAgICAgICAgIGRpc3BhdGNoKGh5cGhlbmF0ZShldmVudCksIGFyZ3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgbGV0IHBhcmVudCA9IHRoaXM7XG4gICAgICAgIHdoaWxlIChwYXJlbnQgPSBwYXJlbnQgJiYgKHBhcmVudC5wYXJlbnROb2RlIHx8IHBhcmVudC5ob3N0KSkge1xuICAgICAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBWdWVFbGVtZW50KSB7XG4gICAgICAgICAgICBpbnN0YW5jZS5wYXJlbnQgPSBwYXJlbnQuX2luc3RhbmNlO1xuICAgICAgICAgICAgaW5zdGFuY2UucHJvdmlkZXMgPSBwYXJlbnQuX2luc3RhbmNlLnByb3ZpZGVzO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gdm5vZGU7XG4gIH1cbiAgX2FwcGx5U3R5bGVzKHN0eWxlcykge1xuICAgIGlmIChzdHlsZXMpIHtcbiAgICAgIHN0eWxlcy5mb3JFYWNoKChjc3MpID0+IHtcbiAgICAgICAgY29uc3QgcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzdHlsZVwiKTtcbiAgICAgICAgcy50ZXh0Q29udGVudCA9IGNzcztcbiAgICAgICAgdGhpcy5zaGFkb3dSb290LmFwcGVuZENoaWxkKHMpO1xuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgICh0aGlzLl9zdHlsZXMgfHwgKHRoaXMuX3N0eWxlcyA9IFtdKSkucHVzaChzKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHVzZUNzc01vZHVsZShuYW1lID0gXCIkc3R5bGVcIikge1xuICB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBnZXRDdXJyZW50SW5zdGFuY2UoKTtcbiAgICBpZiAoIWluc3RhbmNlKSB7XG4gICAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHdhcm4oYHVzZUNzc01vZHVsZSBtdXN0IGJlIGNhbGxlZCBpbnNpZGUgc2V0dXAoKWApO1xuICAgICAgcmV0dXJuIEVNUFRZX09CSjtcbiAgICB9XG4gICAgY29uc3QgbW9kdWxlcyA9IGluc3RhbmNlLnR5cGUuX19jc3NNb2R1bGVzO1xuICAgIGlmICghbW9kdWxlcykge1xuICAgICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiB3YXJuKGBDdXJyZW50IGluc3RhbmNlIGRvZXMgbm90IGhhdmUgQ1NTIG1vZHVsZXMgaW5qZWN0ZWQuYCk7XG4gICAgICByZXR1cm4gRU1QVFlfT0JKO1xuICAgIH1cbiAgICBjb25zdCBtb2QgPSBtb2R1bGVzW25hbWVdO1xuICAgIGlmICghbW9kKSB7XG4gICAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHdhcm4oYEN1cnJlbnQgaW5zdGFuY2UgZG9lcyBub3QgaGF2ZSBDU1MgbW9kdWxlIG5hbWVkIFwiJHtuYW1lfVwiLmApO1xuICAgICAgcmV0dXJuIEVNUFRZX09CSjtcbiAgICB9XG4gICAgcmV0dXJuIG1vZDtcbiAgfVxufVxuXG5jb25zdCBwb3NpdGlvbk1hcCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpO1xuY29uc3QgbmV3UG9zaXRpb25NYXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKTtcbmNvbnN0IG1vdmVDYktleSA9IFN5bWJvbChcIl9tb3ZlQ2JcIik7XG5jb25zdCBlbnRlckNiS2V5ID0gU3ltYm9sKFwiX2VudGVyQ2JcIik7XG5jb25zdCBUcmFuc2l0aW9uR3JvdXBJbXBsID0ge1xuICBuYW1lOiBcIlRyYW5zaXRpb25Hcm91cFwiLFxuICBwcm9wczogLyogQF9fUFVSRV9fICovIGV4dGVuZCh7fSwgVHJhbnNpdGlvblByb3BzVmFsaWRhdG9ycywge1xuICAgIHRhZzogU3RyaW5nLFxuICAgIG1vdmVDbGFzczogU3RyaW5nXG4gIH0pLFxuICBzZXR1cChwcm9wcywgeyBzbG90cyB9KSB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBnZXRDdXJyZW50SW5zdGFuY2UoKTtcbiAgICBjb25zdCBzdGF0ZSA9IHVzZVRyYW5zaXRpb25TdGF0ZSgpO1xuICAgIGxldCBwcmV2Q2hpbGRyZW47XG4gICAgbGV0IGNoaWxkcmVuO1xuICAgIG9uVXBkYXRlZCgoKSA9PiB7XG4gICAgICBpZiAoIXByZXZDaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgbW92ZUNsYXNzID0gcHJvcHMubW92ZUNsYXNzIHx8IGAke3Byb3BzLm5hbWUgfHwgXCJ2XCJ9LW1vdmVgO1xuICAgICAgaWYgKCFoYXNDU1NUcmFuc2Zvcm0oXG4gICAgICAgI
20578HByZXZDaGlsZHJlblswXS5lbCxcbiAgICAgICAgaW5zdGFuY2Uudm5vZGUuZWwsXG4gICAgICAgIG1vdmVDbGFzc1xuICAgICAgKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBwcmV2Q2hpbGRyZW4uZm9yRWFjaChjYWxsUGVuZGluZ0Nicyk7XG4gICAgICBwcmV2Q2hpbGRyZW4uZm9yRWFjaChyZWNvcmRQb3NpdGlvbik7XG4gICAgICBjb25zdCBtb3ZlZENoaWxkcmVuID0gcHJldkNoaWxkcmVuLmZpbHRlcihhcHBseVRyYW5zbGF0aW9uKTtcbiAgICAgIGZvcmNlUmVmbG93KCk7XG4gICAgICBtb3ZlZENoaWxkcmVuLmZvckVhY2goKGMpID0+IHtcbiAgICAgICAgY29uc3QgZWwgPSBjLmVsO1xuICAgICAgICBjb25zdCBzdHlsZSA9IGVsLnN0eWxlO1xuICAgICAgICBhZGRUcmFuc2l0aW9uQ2xhc3MoZWwsIG1vdmVDbGFzcyk7XG4gICAgICAgIHN0eWxlLnRyYW5zZm9ybSA9IHN0eWxlLndlYmtpdFRyYW5zZm9ybSA9IHN0eWxlLnRyYW5zaXRpb25EdXJhdGlvbiA9IFwiXCI7XG4gICAgICAgIGNvbnN0IGNiID0gZWxbbW92ZUNiS2V5XSA9IChlKSA9PiB7XG4gICAgICAgICAgaWYgKGUgJiYgZS50YXJnZXQgIT09IGVsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghZSB8fCAvdHJhbnNmb3JtJC8udGVzdChlLnByb3BlcnR5TmFtZSkpIHtcbiAgICAgICAgICAgIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ0cmFuc2l0aW9uZW5kXCIsIGNiKTtcbiAgICAgICAgICAgIGVsW21vdmVDYktleV0gPSBudWxsO1xuICAgICAgICAgICAgcmVtb3ZlVHJhbnNpdGlvbkNsYXNzKGVsLCBtb3ZlQ2xhc3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcihcInRyYW5zaXRpb25lbmRcIiwgY2IpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGNvbnN0IHJhd1Byb3BzID0gdG9SYXcocHJvcHMpO1xuICAgICAgY29uc3QgY3NzVHJhbnNpdGlvblByb3BzID0gcmVzb2x2ZVRyYW5zaXRpb25Qcm9wcyhyYXdQcm9wcyk7XG4gICAgICBsZXQgdGFnID0gcmF3UHJvcHMudGFnIHx8IEZyYWdtZW50O1xuICAgICAgcHJldkNoaWxkcmVuID0gW107XG4gICAgICBpZiAoY2hpbGRyZW4pIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGNoaWxkID0gY2hpbGRyZW5baV07XG4gICAgICAgICAgaWYgKGNoaWxkLmVsICYmIGNoaWxkLmVsIGluc3RhbmNlb2YgRWxlbWVudCkge1xuICAgICAgICAgICAgcHJldkNoaWxkcmVuLnB1c2goY2hpbGQpO1xuICAgICAgICAgICAgc2V0VHJhbnNpdGlvbkhvb2tzKFxuICAgICAgICAgICAgICBjaGlsZCxcbiAgICAgICAgICAgICAgcmVzb2x2ZVRyYW5zaXRpb25Ib29rcyhcbiAgICAgICAgICAgICAgICBjaGlsZCxcbiAgICAgICAgICAgICAgICBjc3NUcmFuc2l0aW9uUHJvcHMsXG4gICAgICAgICAgICAgICAgc3RhdGUsXG4gICAgICAgICAgICAgICAgaW5zdGFuY2VcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHBvc2l0aW9uTWFwLnNldChcbiAgICAgICAgICAgICAgY2hpbGQsXG4gICAgICAgICAgICAgIGNoaWxkLmVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY2hpbGRyZW4gPSBzbG90cy5kZWZh
20578dWx0ID8gZ2V0VHJhbnNpdGlvblJhd0NoaWxkcmVuKHNsb3RzLmRlZmF1bHQoKSkgOiBbXTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgY2hpbGQgPSBjaGlsZHJlbltpXTtcbiAgICAgICAgaWYgKGNoaWxkLmtleSAhPSBudWxsKSB7XG4gICAgICAgICAgc2V0VHJhbnNpdGlvbkhvb2tzKFxuICAgICAgICAgICAgY2hpbGQsXG4gICAgICAgICAgICByZXNvbHZlVHJhbnNpdGlvbkhvb2tzKGNoaWxkLCBjc3NUcmFuc2l0aW9uUHJvcHMsIHN0YXRlLCBpbnN0YW5jZSlcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICB3YXJuKGA8VHJhbnNpdGlvbkdyb3VwPiBjaGlsZHJlbiBtdXN0IGJlIGtleWVkLmApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gY3JlYXRlVk5vZGUodGFnLCBudWxsLCBjaGlsZHJlbik7XG4gICAgfTtcbiAgfVxufTtcbmNvbnN0IHJlbW92ZU1vZGUgPSAocHJvcHMpID0+IGRlbGV0ZSBwcm9wcy5tb2RlO1xuLyogQF9fUFVSRV9fICovIHJlbW92ZU1vZGUoVHJhbnNpdGlvbkdyb3VwSW1wbC5wcm9wcyk7XG5jb25zdCBUcmFuc2l0aW9uR3JvdXAgPSBUcmFuc2l0aW9uR3JvdXBJbXBsO1xuZnVuY3Rpb24gY2FsbFBlbmRpbmdDYnMoYykge1xuICBjb25zdCBlbCA9IGMuZWw7XG4gIGlmIChlbFttb3ZlQ2JLZXldKSB7XG4gICAgZWxbbW92ZUNiS2V5XSgpO1xuICB9XG4gIGlmIChlbFtlbnRlckNiS2V5XSkge1xuICAgIGVsW2VudGVyQ2JLZXldKCk7XG4gIH1cbn1cbmZ1bmN0aW9uIHJlY29yZFBvc2l0aW9uKGMpIHtcbiAgbmV3UG9zaXRpb25NYXAuc2V0KGMsIGMuZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpO1xufVxuZnVuY3Rpb24gYXBwbHlUcmFuc2xhdGlvbihjKSB7XG4gIGNvbnN0IG9sZFBvcyA9IHBvc2l0aW9uTWFwLmdldChjKTtcbiAgY29uc3QgbmV3UG9zID0gbmV3UG9zaXRpb25NYXAuZ2V0KGMpO1xuICBjb25zdCBkeCA9IG9sZFBvcy5sZWZ0IC0gbmV3UG9zLmxlZnQ7XG4gIGNvbnN0IGR5ID0gb2xkUG9zLnRvcCAtIG5ld1Bvcy50b3A7XG4gIGlmIChkeCB8fCBkeSkge1xuICAgIGNvbnN0IHMgPSBjLmVsLnN0eWxlO1xuICAgIHMudHJhbnNmb3JtID0gcy53ZWJraXRUcmFuc2Zvcm0gPSBgdHJhbnNsYXRlKCR7ZHh9cHgsJHtkeX1weClgO1xuICAgIHMudHJhbnNpdGlvbkR1cmF0aW9uID0gXCIwc1wiO1xuICAgIHJldHVybiBjO1xuICB9XG59XG5mdW5jdGlvbiBoYXNDU1NUcmFuc2Zvcm0oZWwsIHJvb3QsIG1vdmVDbGFzcykge1xuICBjb25zdCBjbG9uZSA9IGVsLmNsb25lTm9kZSgpO1xuICBjb25zdCBfdnRjID0gZWxbdnRjS2V5XTtcbiAgaWYgKF92dGMpIHtcbiAgICBfdnRjLmZvckVhY2goKGNscykgPT4ge1xuICAgICAgY2xzLnNwbGl0KC9cXHMrLykuZm9yRWFjaCgoYykgPT4gYyAmJiBjbG9uZS5jbGFzc0xpc3QucmVtb3ZlKGMpKTtcbiAgICB9KTtcbiAgfVxuICBtb3ZlQ2xhc3Muc3BsaXQoL1xccysvKS5mb3JFYWNoKChjKSA9PiBjICYmIGNsb25lLmNsYXNzTGlzdC5hZGQoYykpO1xuICBjbG9uZS5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG4gIGNvbnN0IGNvbnRhaW5lciA9IHJvb3Qubm9kZVR5cGUgPT09IDEgPyByb290IDogcm9vdC5wYXJlbnROb2RlO1xuICBjb250YWluZXIuYXBwZW5kQ2hpbGQoY2xvbmUpO1xuICBjb25zdCB7IGhhc1RyYW5zZm9ybSB9ID0gZ2V0VHJhbnNpdGlvbkluZm8oY2xvbmUpO1xuICBjb250YWluZXIucmVtb3ZlQ2hpbGQoY2xvbmUpO1xuICByZXR1cm4gaGFzVHJhbnNmb3JtO1xufVxuXG5jb25zdCBnZXRNb2RlbEFzc2lnbmVyID0gKHZub2RlKSA9PiB7XG4gIGNvbnN0IGZuID0gdm5vZGUucHJvcHNbXCJvblVwZGF0ZTptb2RlbFZhbHVlXCJdIHx8IGZhbHNlO1xuICByZXR1cm4gaXNBcnJheShmbikgPyAodmFsdWUpID0+IGludm9rZUFycmF5Rm5zKGZuLCB2YWx1ZSkgOiBmbjtcbn07XG5mdW5jdGlvbiBvbkNvbXBvc2l0aW9uU3RhcnQoZSkge1xuICBlLnRhcmdldC5jb21wb3NpbmcgPSB0cnVlO1xufVxuZnVuY3Rpb24gb25Db21wb3NpdGlvbkVuZChlKSB7XG4gIGNvbnN0IHRhcmdldCA9IGUudGFyZ2V0O1xuICBpZiAodGFyZ2V0LmNvbXBvc2luZykge1xuICAgIHRhcmdldC5jb21wb3NpbmcgPSBmYWxzZTtcbiAgICB0YXJnZXQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoXCJpbnB1dFwiKSk7XG4gIH1cbn1cbmNvbnN0IGFzc2lnbktleSA9IFN5bWJvbChcIl9hc3NpZ25cIik7XG5jb25zdCB2TW9kZWxUZXh0ID0ge1xuICBjcmVhdGVkKGVsLCB7IG1vZGlmaWVyczogeyBsYXp5LCB0cmltLCBudW1iZXIgfSB9LCB2bm9kZSkge1xuICAgIGVsW2Fzc2lnbktleV0gPSBnZXRNb2RlbEFzc2lnbmVyKHZub2RlKTtcbiAgICBjb25zdCBjYXN0VG9OdW1iZXIgPSBudW1iZXIgfHwgdm5vZGUucHJvcHMgJiYgdm5vZGUucHJvcHMudHlwZSA9PT0gXCJudW1iZXJcIjtcbiAgICBhZGRFdmVudExpc3RlbmVyKGVsLCBsYXp5ID8gXCJjaGFuZ2VcIiA6IFwiaW5wdXRcIiwgKGUpID0+IHtcbiAgICAgIGlmIChlLnRhcmdldC5jb21wb3NpbmcpIHJldHVybjtcbiAgICAgIGxldCBkb21WYWx1ZSA9IGVsLnZhbHVlO1xuICAgICAgaWYgKHRyaW0pIHtcbiAgICAgICAgZG9tVmFsdWUgPSBkb21WYWx1ZS50cmltKCk7XG4gICAgICB9XG4gICAgICBpZiAoY2FzdFRvTnVtYmVyKSB7XG4gICAgICAgIGRvbVZhbHVlID0gbG9vc2VUb051bWJlcihkb21WYWx1ZSk7XG4gICAgICB9XG4gICAgICBlbFthc3NpZ25LZXldKGRvbVZhbHVlKTtcbiAgICB9KTtcbiAgICBpZiAodHJpbSkge1xuICAgICAgYWRkRXZlbnRMaXN0ZW5lcihlbCwgXCJjaGFuZ2VcIiwgKCkgPT4ge1xuICAgICAgICBlbC52YWx1ZSA9IGVsLnZhbHVlLnRyaW0oKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoIWxhenkpIHtcbiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoZWwsIFwiY29tcG9zaXRpb25zdGFydFwiLCBvbkNvbXBvc2l0aW9uU3RhcnQpO1xuICAgICAgYWRkRXZlbnRMaXN0ZW5lcihlbCwgXCJjb21wb3NpdGlvbmVuZFwiLCBvbkNvbXBvc2l0aW9uRW5kKTtcbiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoZWwsIFwiY2hhbmdlXCIsIG9uQ29tcG9zaXRpb25
20578FbmQpO1xuICAgIH1cbiAgfSxcbiAgLy8gc2V0IHZhbHVlIG9uIG1vdW50ZWQgc28gaXQncyBhZnRlciBtaW4vbWF4IGZvciB0eXBlPVwicmFuZ2VcIlxuICBtb3VudGVkKGVsLCB7IHZhbHVlIH0pIHtcbiAgICBlbC52YWx1ZSA9IHZhbHVlID09IG51bGwgPyBcIlwiIDogdmFsdWU7XG4gIH0sXG4gIGJlZm9yZVVwZGF0ZShlbCwgeyB2YWx1ZSwgb2xkVmFsdWUsIG1vZGlmaWVyczogeyBsYXp5LCB0cmltLCBudW1iZXIgfSB9LCB2bm9kZSkge1xuICAgIGVsW2Fzc2lnbktleV0gPSBnZXRNb2RlbEFzc2lnbmVyKHZub2RlKTtcbiAgICBpZiAoZWwuY29tcG9zaW5nKSByZXR1cm47XG4gICAgY29uc3QgZWxWYWx1ZSA9IChudW1iZXIgfHwgZWwudHlwZSA9PT0gXCJudW1iZXJcIikgJiYgIS9eMFxcZC8udGVzdChlbC52YWx1ZSkgPyBsb29zZVRvTnVtYmVyKGVsLnZhbHVlKSA6IGVsLnZhbHVlO1xuICAgIGNvbnN0IG5ld1ZhbHVlID0gdmFsdWUgPT0gbnVsbCA/IFwiXCIgOiB2YWx1ZTtcbiAgICBpZiAoZWxWYWx1ZSA9PT0gbmV3VmFsdWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgPT09IGVsICYmIGVsLnR5cGUgIT09IFwicmFuZ2VcIikge1xuICAgICAgaWYgKGxhenkgJiYgdmFsdWUgPT09IG9sZFZhbHVlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICh0cmltICYmIGVsLnZhbHVlLnRyaW0oKSA9PT0gbmV3VmFsdWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICBlbC52YWx1ZSA9IG5ld1ZhbHVlO1xuICB9XG59O1xuY29uc3Qgdk1vZGVsQ2hlY2tib3ggPSB7XG4gIC8vICM0MDk2IGFycmF5IGNoZWNrYm94ZXMgbmVlZCB0byBiZSBkZWVwIHRyYXZlcnNlZFxuICBkZWVwOiB0cnVlLFxuICBjcmVhdGVkKGVsLCBfLCB2bm9kZSkge1xuICAgIGVsW2Fzc2lnbktleV0gPSBnZXRNb2RlbEFzc2lnbmVyKHZub2RlKTtcbiAgICBhZGRFdmVudExpc3RlbmVyKGVsLCBcImNoYW5nZVwiLCAoKSA9PiB7XG4gICAgICBjb25zdCBtb2RlbFZhbHVlID0gZWwuX21vZGVsVmFsdWU7XG4gICAgICBjb25zdCBlbGVtZW50VmFsdWUgPSBnZXRWYWx1ZShlbCk7XG4gICAgICBjb25zdCBjaGVja2VkID0gZWwuY2hlY2tlZDtcbiAgICAgIGNvbnN0IGFzc2lnbiA9IGVsW2Fzc2lnbktleV07XG4gICAgICBpZiAoaXNBcnJheShtb2RlbFZhbHVlKSkge1xuICAgICAgICBjb25zdCBpbmRleCA9IGxvb3NlSW5kZXhPZihtb2RlbFZhbHVlLCBlbGVtZW50VmFsdWUpO1xuICAgICAgICBjb25zdCBmb3VuZCA9IGluZGV4ICE9PSAtMTtcbiAgICAgICAgaWYgKGNoZWNrZWQgJiYgIWZvdW5kKSB7XG4gICAgICAgICAgYXNzaWduKG1vZGVsVmFsdWUuY29uY2F0KGVsZW1lbnRWYWx1ZSkpO1xuICAgICAgICB9IGVsc2UgaWYgKCFjaGVja2VkICYmIGZvdW5kKSB7XG4gICAgICAgICAgY29uc3QgZmlsdGVyZWQgPSBbLi4ubW9kZWxWYWx1ZV07XG4gICAgICAgICAgZmlsdGVyZWQuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICBhc3NpZ24oZmlsdGVyZWQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGlzU2V0KG1vZGVsVmFsdWUpKSB7XG4gICAgICAgIGNvbnN0IGNsb25lZCA9IG5ldyBTZXQobW9kZWxWYWx1ZSk7XG4gICAgICAgIGlmIChjaGVja2VkKSB7XG4gICAgICAgICAgY2xvbmVkLmFkZChlbGVtZW50VmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNsb25lZC5kZWxldGUoZWxlbWVudFZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBhc3NpZ24oY2xvbmVkKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFzc2lnbihnZXRDaGVja2JveFZhbHVlKGVsLCBjaGVja2VkKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0sXG4gIC8vIHNldCBpbml0aWFsIGNoZWNrZWQgb24gbW91bnQgdG8gd2FpdCBmb3IgdHJ1ZS12YWx1ZS9mYWxzZS12YWx1ZVxuICBtb3VudGVkOiBzZXRDaGVja2VkLFxuICBiZWZvcmVVcGRhdGUoZWwsIGJpbmRpbmcsIHZub2RlKSB7XG4gICAgZWxbYXNzaWduS2V5XSA9IGdldE1vZGVsQXNzaWduZXIodm5vZGUpO1xuICAgIHNldENoZWNrZWQoZWwsIGJpbmRpbmcsIHZub2RlKTtcbiAgfVxufTtcbmZ1bmN0aW9uIHNldENoZWNrZWQoZWwsIHsgdmFsdWUsIG9sZFZhbHVlIH0sIHZub2RlKSB7XG4gIGVsLl9tb2RlbFZhbHVlID0gdmFsdWU7XG4gIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgIGVsLmNoZWNrZWQgPSBsb29zZUluZGV4T2YodmFsdWUsIHZub2Rl
20578LnByb3BzLnZhbHVlKSA+IC0xO1xuICB9IGVsc2UgaWYgKGlzU2V0KHZhbHVlKSkge1xuICAgIGVsLmNoZWNrZWQgPSB2YWx1ZS5oYXModm5vZGUucHJvcHMudmFsdWUpO1xuICB9IGVsc2UgaWYgKHZhbHVlICE9PSBvbGRWYWx1ZSkge1xuICAgIGVsLmNoZWNrZWQgPSBsb29zZUVxdWFsKHZhbHVlLCBnZXRDaGVja2JveFZhbHVlKGVsLCB0cnVlKSk7XG4gIH1cbn1cbmNvbnN0IHZNb2RlbFJhZGlvID0ge1xuICBjcmVhdGVkKGVsLCB7IHZhbHVlIH0sIHZub2RlKSB7XG4gICAgZWwuY2hlY2tlZCA9IGxvb3NlRXF1YWwodmFsdWUsIHZub2RlLnByb3BzLnZhbHVlKTtcbiAgICBlbFthc3NpZ25LZXldID0gZ2V0TW9kZWxBc3NpZ25lcih2bm9kZSk7XG4gICAgYWRkRXZlbnRMaXN0ZW5lcihlbCwgXCJjaGFuZ2VcIiwgKCkgPT4ge1xuICAgICAgZWxbYXNzaWduS2V5XShnZXRWYWx1ZShlbCkpO1xuICAgIH0pO1xuICB9LFxuICBiZWZvcmVVcGRhdGUoZWwsIHsgdmFsdWUsIG9sZFZhbHVlIH0sIHZub2RlKSB7XG4gICAgZWxbYXNzaWduS2V5XSA9IGdldE1vZGVsQXNzaWduZXIodm5vZGUpO1xuICAgIGlmICh2YWx1ZSAhPT0gb2xkVmFsdWUpIHtcbiAgICAgIGVsLmNoZWNrZWQgPSBsb29zZUVxdWFsKHZhbHVlLCB2bm9kZS5wcm9wcy52YWx1ZSk7XG4gICAgfVxuICB9XG59O1xuY29uc3Qgdk1vZGVsU2VsZWN0ID0ge1xuICAvLyA8c2VsZWN0IG11bHRpcGxlPiB2YWx1ZSBuZWVkIHRvIGJlIGRlZXAgdHJhdmVyc2VkXG4gIGRlZXA6IHRydWUsXG4gIGNyZWF0ZWQoZWwsIHsgdmFsdWUsIG1vZGlmaWVyczogeyBudW1iZXIgfSB9LCB2bm9kZSkge1xuICAgIGNvbnN0IGlzU2V0TW9kZWwgPSBpc1NldCh2YWx1ZSk7XG4gICAgYWRkRXZlbnRMaXN0ZW5lcihlbCwgXCJjaGFuZ2VcIiwgKCkgPT4ge1xuICAgICAgY29uc3Qgc2VsZWN0ZWRWYWwgPSBBcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwoZWwub3B0aW9ucywgKG8pID0+IG8uc2VsZWN0ZWQpLm1hcChcbiAgICAgICAgKG8pID0+IG51bWJlciA/IGxvb3NlVG9OdW1iZXIoZ2V0VmFsdWUobykpIDogZ2V0VmFsdWUobylcbiAgICAgICk7XG4gICAgICBlbFthc3NpZ25LZXldKFxuICAgICAgICBlbC5tdWx0aXBsZSA/IGlzU2V0TW9kZWwgPyBuZXcgU2V0KHNlbGVjdGVkVmFsKSA6IHNlbGVjdGVkVmFsIDogc2VsZWN0ZWRWYWxbMF1cbiAgICAgICk7XG4gICAgICBlbC5fYXNzaWduaW5nID0gdHJ1ZTtcbiAgICAgIG5leHRUaWNrKCgpID0+IHtcbiAgICAgICAgZWwuX2Fzc2lnbmluZyA9IGZhbHNlO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgZWxbYXNzaWduS2V5XSA9IGdldE1vZGVsQXNzaWduZXIodm5vZGUpO1xuICB9LFxuICAvLyBzZXQgdmFsdWUgaW4gbW91bnRlZCAmIHVwZGF0ZWQgYmVjYXVzZSA8c2VsZWN0PiByZWxpZXMgb24gaXRzIGNoaWxkcmVuXG4gIC8vIDxvcHRpb24+cy5cbiAgbW91bnRlZChlbCwgeyB2YWx1ZSwgbW9kaWZpZXJzOiB7IG51bWJlciB9I
20578H0pIHtcbiAgICBzZXRTZWxlY3RlZChlbCwgdmFsdWUpO1xuICB9LFxuICBiZWZvcmVVcGRhdGUoZWwsIF9iaW5kaW5nLCB2bm9kZSkge1xuICAgIGVsW2Fzc2lnbktleV0gPSBnZXRNb2RlbEFzc2lnbmVyKHZub2RlKTtcbiAgfSxcbiAgdXBkYXRlZChlbCwgeyB2YWx1ZSwgbW9kaWZpZXJzOiB7IG51bWJlciB9IH0pIHtcbiAgICBpZiAoIWVsLl9hc3NpZ25pbmcpIHtcbiAgICAgIHNldFNlbGVjdGVkKGVsLCB2YWx1ZSk7XG4gICAgfVxuICB9XG59O1xuZnVuY3Rpb24gc2V0U2VsZWN0ZWQoZWwsIHZhbHVlLCBudW1iZXIpIHtcbiAgY29uc3QgaXNNdWx0aXBsZSA9IGVsLm11bHRpcGxlO1xuICBjb25zdCBpc0FycmF5VmFsdWUgPSBpc0FycmF5KHZhbHVlKTtcbiAgaWYgKGlzTXVsdGlwbGUgJiYgIWlzQXJyYXlWYWx1ZSAmJiAhaXNTZXQodmFsdWUpKSB7XG4gICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiB3YXJuKFxuICAgICAgYDxzZWxlY3QgbXVsdGlwbGUgdi1tb2RlbD4gZXhwZWN0cyBhbiBBcnJheSBvciBTZXQgdmFsdWUgZm9yIGl0cyBiaW5kaW5nLCBidXQgZ290ICR7T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKS5zbGljZSg4LCAtMSl9LmBcbiAgICApO1xuICAgIHJldHVybjtcbiAgfVxuICBmb3IgKGxldCBpID0gMCwgbCA9IGVsLm9wdGlvbnMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgY29uc3Qgb3B0aW9uID0gZWwub3B0aW9uc1tpXTtcbiAgICBjb25zdCBvcHRpb25WYWx1ZSA9IGdldFZhbHVlKG9wdGlvbik7XG4gICAgaWYgKGlzTXVsdGlwbGUpIHtcbiAgICAgIGlmIChpc0FycmF5VmFsdWUpIHtcbiAgICAgICAgY29uc3Qgb3B0aW9uVHlwZSA9IHR5cGVvZiBvcHRpb25WYWx1ZTtcbiAgICAgICAgaWYgKG9wdGlvblR5cGUgPT09IFwic3RyaW5nXCIgfHwgb3B0aW9uVHlwZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgIG9wdGlvbi5zZWxlY3RlZCA9IHZhbHVlLnNvbWUoKHYpID0+IFN0cmluZyh2KSA9PT0gU3RyaW5nKG9wdGlvblZhbHVlKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb3B0aW9uLnNlbGVjdGVkID0gbG9vc2VJbmRleE9mKHZhbHVlLCBvcHRpb25WYWx1ZSkgPiAtMTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3B0aW9uLnNlbGVjdGVkID0gdmFsdWUuaGFzKG9wdGlvblZhbHVlKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGxvb3NlRXF1YWwoZ2V0VmFsdWUob3B0aW9uKSwgdmFsdWUpKSB7XG4gICAgICBpZiAoZWwuc2VsZWN0ZWRJbmRleCAhPT0gaSkgZWwuc2VsZWN0ZWRJbmRleCA9IGk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG4gIGlmICghaXNNdWx0aXBsZSAmJiBlbC5zZWxlY3RlZEluZGV4ICE9PSAtMSkge1xuICAgIGVsLnNlbGVjdGVkSW5kZXggPSAtMTtcbiAgfVxufVxuZnVuY3Rpb24gZ2V0VmFsdWUoZWwpIHtcbiAgcmV0dXJuIFwiX3ZhbHVlXCIgaW4gZWwgPyBlbC5fdmFsdWUgOiBlbC52YWx1ZTtcbn1cbmZ1bmN0aW9uIGdldENoZWNrYm94VmFsdWUoZWwsIGNoZWNrZWQpIHtcbiAgY29uc3Qga2V5ID0gY2hlY2tlZCA/IFwiX3RydWVWYWx1ZVwiIDogXCJfZmFsc2VWYWx1ZVwiO1xuICByZXR1cm4ga2V5IGluIGVsID8gZWxba2V5XSA6IGNoZWNrZWQ7XG59XG5jb25zdCB2TW9kZWxEeW5hbWljID0ge1xuICBjcmVhdGVkKGVsLCBiaW5kaW5nLCB2bm9kZSkge1xuICAgIGNhbGxNb2RlbEhvb2soZWwsIGJpbmRpbmcsIHZub2RlLCBudWxsLCBcImNyZWF0ZWRcIik7XG4gIH0sXG4gIG1vdW50ZWQoZWwsIGJpbmRpbmcsIHZub2RlKSB7XG4gICAgY2FsbE1vZGVsSG9vayhlbCwgYmluZGluZywgdm5vZGUsIG51bGwsIFwibW91bnRlZFwiKTtcbiAgfSxcbiAgYmVmb3JlVXBkYXRlKGVsLCBiaW5kaW5nLCB2bm9kZSwgcHJldlZOb2RlKSB7XG4gICAgY2FsbE1vZGVsSG9vayhlbCwgYmluZGluZywgdm5vZGUsIHByZXZWTm9kZSwgXCJiZWZvcmVVcGRhdGVcIik7XG4gIH0sXG4gIHVwZGF0ZWQoZWwsIGJpbmRpbmcsIHZub2RlLCBwcmV2Vk5vZGUpIHtcbiAgICBjYWxsTW9kZWxIb29rKGVsLCBiaW5kaW5nLCB2bm9kZSwgcHJldlZOb2RlLCBcInVwZGF0ZWRcIik7XG4gIH1cbn07XG5mdW5jdGlvbiByZXNvbHZlRHluYW1pY01vZGVsKHRhZ05hbWUsIHR5cGUpIHtcbiAgc3dpdGNoICh0YWdOYW1lKSB7XG4gICAgY2FzZSBcIlNFTEVDVFwiOlxuICAgICAgcmV0dXJuIHZNb2RlbFNlbGVjdDtcbiAgICBjYXNlIFwiVEVYVEFSRUFcIjpcbiAgICAgIHJldHVybiB2TW9kZWxUZXh0O1xuICAgIGRlZmF1bHQ6XG4gICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgY2FzZSBcImNoZWNrYm94XCI6XG4gICAgICAgICAgcmV0dXJuIHZNb2RlbENoZWNrYm94O1xuICAgICAgICBjYXNlIFwicmFkaW9cIjpcbiAgICAgICAgICByZXR1cm4gdk1vZGVsUmFkaW87XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIHZNb2RlbFRleHQ7XG4gICAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGNhbGxNb2RlbEhvb2soZWwsIGJpbmRpbmcsIHZub2RlLCBwcmV2Vk5vZGUsIGhvb2spIHtcbiAgY29uc3QgbW9kZWxUb1VzZSA9IHJlc29sdmVEeW5hbWljTW9kZWwoXG4gICAgZWwudGFnTmFtZSxcbiAgICB2bm9kZS5wcm9wcyAmJiB2bm9kZS5wcm9wcy50eXBlXG4gICk7XG4gIGNvbnN0IGZuID0gbW9kZWxUb1VzZVtob29rXTtcbiAgZm4gJiYgZm4oZWwsIGJpbmRpbmcsIHZub2RlLCBwcmV2Vk5vZGUpO1xufVxuZnVuY3Rpb24gaW5pdFZNb2RlbEZvclNTUigpIHtcbiAgdk1vZGVsVGV4dC5nZXRTU1JQcm9wcyA9ICh7IHZhbHVlIH0pID0+ICh7IHZhbHVlIH0pO1xuICB2TW9kZWxSYWRpby5nZXRTU1JQcm9wcyA9ICh7IHZhbHVlIH0sIHZub2RlKSA9PiB7XG4gICAgaWYgKHZub2RlLnByb3BzICYmIGxvb3NlRXF1YWwodm5vZGUucHJvcHMudmFsdWUsIHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHsgY2hlY2tlZDogdHJ1ZSB9O1xuICAgIH1cbiAgfTtcbiAgdk1vZGVsQ2hlY2tib3guZ2V0U1NSUHJvcHMgPSAoeyB2YWx1ZSB9LCB2bm9kZSkgPT4ge1xuICAgIGlmIChpc0FycmF
205785KHZhbHVlKSkge1xuICAgICAgaWYgKHZub2RlLnByb3BzICYmIGxvb3NlSW5kZXhPZih2YWx1ZSwgdm5vZGUucHJvcHMudmFsdWUpID4gLTEpIHtcbiAgICAgICAgcmV0dXJuIHsgY2hlY2tlZDogdHJ1ZSB9O1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaXNTZXQodmFsdWUpKSB7XG4gICAgICBpZiAodm5vZGUucHJvcHMgJiYgdmFsdWUuaGFzKHZub2RlLnByb3BzLnZhbHVlKSkge1xuICAgICAgICByZXR1cm4geyBjaGVja2VkOiB0cnVlIH07XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHsgY2hlY2tlZDogdHJ1ZSB9O1xuICAgIH1cbiAgfTtcbiAgdk1vZGVsRHluYW1pYy5nZXRTU1JQcm9wcyA9IChiaW5kaW5nLCB2bm9kZSkgPT4ge1xuICAgIGlmICh0eXBlb2Ygdm5vZGUudHlwZSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBtb2RlbFRvVXNlID0gcmVzb2x2ZUR5bmFtaWNNb2RlbChcbiAgICAgIC8vIHJlc29sdmVEeW5hbWljTW9kZWwgZXhwZWN0cyBhbiB1cHBlcmNhc2UgdGFnIG5hbWUsIGJ1dCB2bm9kZS50eXBlIGlzIGxvd2VyY2FzZVxuICAgICAgdm5vZGUudHlwZS50b1VwcGVyQ2FzZSgpLFxuICAgICAgdm5vZGUucHJvcHMgJiYgdm5vZGUucHJvcHMudHlwZVxuICAgICk7XG4gICAgaWYgKG1vZGVsVG9Vc2UuZ2V0U1NSUHJvcHMpIHtcbiAgICAgIHJldHVybiBtb2RlbFRvVXNlLmdldFNTUlByb3BzKGJpbmRpbmcsIHZub2RlKTtcbiAgICB9XG4gIH07XG59XG5cbmNvbnN0IHN5c3RlbU1vZGlmaWVycyA9IFtcImN0cmxcIiwgXCJzaGlmdFwiLCBcImFsdFwiLCBcIm1ldGFcIl07XG5jb25zdCBtb2RpZmllckd1YXJkcyA9IHtcbiAgc3RvcDogKGUpID0+IGUuc3RvcFByb3BhZ2F0aW9uKCksXG4gIHByZXZlbnQ6IChlKSA9PiBlLnByZXZlbnREZWZhdWx0KCksXG4gIHNlbGY6IChlKSA9PiBlLnRhcmdldCAhPT0gZS5jdXJyZW50VGFyZ2V0LFxuICBjdHJsOiAoZSkgPT4gIWUuY3RybEtleSxcbiAgc2hpZnQ6IChlKSA9PiAhZS5zaGlmdEtleSxcbiAgYWx0OiAoZSkgPT4gIWUuYWx0S2V5LFxuICBtZXRhOiAoZSkgPT4gIWUubWV0YUtleSxcbiAgbGVmdDogKGUpID0+IFwiYnV0dG9uXCIgaW4gZSAmJiBlLmJ1dHRvbiAhPT0gMCxcbiAgbWlkZGxlOiAoZSkgPT4gXCJidXR0b25cIiBpbiBlICYmIGUuYnV0dG9uICE9PSAxLFxuICByaWdodDogKGUpID0+IFwiYnV0dG9uXCIgaW4gZSAmJiBlLmJ1dHRvbiAhPT0gMixcbiAgZXhhY3Q6IChlLCBtb2RpZmllcnMpID0+IHN5c3RlbU1vZGlmaWVycy5zb21lKChtKSA9PiBlW2Ake219S2V5YF0gJiYgIW1vZGlmaWVycy5pbmNsdWRlcyhtKSlcbn07XG5jb25zdCB3aXRoTW9kaWZpZXJzID0gKGZuLCBtb2RpZmllcnMpID0+IHtcbiAgY29uc3QgY2FjaGUgPSBmbi5fd2l0aE1vZHMgfHwgKGZuLl93aXRoTW9kcyA9IHt9KTtcbiAgY29uc3QgY2FjaGVLZXkgPSBtb2RpZmllcnMuam9pbihcIi5cIik7XG4gIHJldHVybiBjYWNoZVtjYWNoZUtleV0gfHwgKGNhY2hlW2NhY2hlS2V5XSA9IChldmVudCwgLi4uYXJncykgPT4ge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbW9kaWZpZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBndWFyZCA9IG1vZGlmaWVyR3VhcmRzW21vZGlmaWVyc1tpXV07XG4gICAgICBpZiAoZ3VhcmQgJiYgZ3VhcmQoZXZlbnQsIG1vZGlmaWVycykpIHJldHVybjtcbiAgICB9XG4gICAgcmV0dXJuIGZuKGV2ZW50LCAuLi5hcmdzKTtcbiAgfSk7XG59O1xuY29uc3Qga2V5TmFtZXMgPSB7XG4gIGVzYzogXCJlc2NhcGVcIixcbiAgc3BhY2U6IFwiIFwiLFxuICB1cDogXCJhcnJvdy11cFwiLFxuICBsZWZ0OiBcImFycm93LWxlZnRcIixcbiAgcmlnaHQ6IFwiYXJyb3ctcmlnaHRcIixcbiAgZG93bjogXCJhcnJvdy1kb3duXCIsXG4gIGRlbGV0ZTogXCJiYWNrc3BhY2VcIlxufTtcbmNvbnN0IHdpdGhLZXlzID0gKGZuLCBtb2RpZmllcnMpID0+IHtcbiAgY29uc3QgY2FjaGUgPSBmbi5fd2l0aEtleXMgfHwgKGZuLl93aXRoS2V5cyA9IHt9KTtcbiAgY29uc3QgY2FjaGVLZXkgPSBtb2RpZmllcnMuam9pbihcIi5cIik7XG4gIHJldHVybiBjYWNoZVtjYWNoZUtleV0gfHwgKGNhY2hlW2NhY2hlS2V5XSA9IChldmVudCkgPT4ge1xuICAgIGlmICghKFwia2V5XCIgaW4gZXZlbnQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGV2ZW50S2V5ID0gaHlwaGVuYXRlKGV2ZW50LmtleSk7XG4gICAgaWYgKG1vZGlmaWVycy5zb21lKChrKSA9PiBrID09PSBldmVudEtleSB8fCBrZXlOYW1lc1trXSA9PT0gZXZlbnRLZXkpKSB7XG4gICAgICByZXR1cm4gZm4oZXZlbnQpO1xuICAgIH1cbiAgfSk7XG59O1xuXG5jb25zdCByZW5kZXJlck9wdGlvbnMgPSAvKiBAX19QVVJFX18gKi8gZXh0ZW5kKHsgcGF0Y2hQcm9wIH0sIG5vZGVPcHMpO1xubGV0IHJlbmRlcmVyO1xubGV0IGVuYWJsZWRIeWRyYXRpb24gPSBmYWxzZTtcbmZ1bmN0aW9uIGVuc3VyZVJlbmRlcmVyKCkge1xuICByZXR1cm4gcmVuZGVyZXIgfHwgKHJlbmRlcmVyID0gY3JlYXRlUmVuZGVyZXIocmVuZGVyZXJPcHRpb25zKSk7XG59XG5mdW5jdGlvbiBlbnN1cmVIeWRyYXRpb25SZW5kZXJlcigpIHtcbiAgcmVuZGVyZXIgPSBlbmFibGVkSHlkcmF0aW9uID8gcmVuZGVyZXIgOiBjcmVhdGVIeWRyYXRpb25SZW5kZXJlcihyZW5kZXJlck9wdGlvbnMpO1xuICBlbmFibGVkSHlkcmF0aW9uID0gdHJ1ZTtcbiAgcmV0dXJuIHJlbmRlcmVyO1xufVxuY29uc3QgcmVuZGVyID0gKC4uLmFyZ3MpID0+IHtcbiAgZW5zdXJlUmVuZGVyZXIoKS5yZW5kZXIoLi4uYXJncyk7XG59O1xuY29uc3QgaHlkcmF0ZSA9ICguLi5hcmdzKSA9PiB7XG4gIGVuc3VyZUh5ZHJhdGlvblJlbmRlcmVyKCkuaHlkcmF0ZSguLi5hcmdzKTtcbn07XG5jb25zdCBjcmVhdGVBcHAgPSAoLi4uYXJncykgPT4ge1xuICBjb25zdCBhcHAgPSBlbnN1cmVSZW5kZXJlcigpLmNyZWF0ZUFwcCguLi5hcmdzKTtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICBpbmplY3ROYXRpdmVUYWdDaGVjayhhcHApO1xuICAgIGluamVjdENvbXBpbGVyT3B0aW9uc0NoZWNrKGFwcCk7XG4gIH1cbiAgY29uc3QgeyBtb3VudCB9ID0gYXBwO
205781xuICBhcHAubW91bnQgPSAoY29udGFpbmVyT3JTZWxlY3RvcikgPT4ge1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IG5vcm1hbGl6ZUNvbnRhaW5lcihjb250YWluZXJPclNlbGVjdG9yKTtcbiAgICBpZiAoIWNvbnRhaW5lcikgcmV0dXJuO1xuICAgIGNvbnN0IGNvbXBvbmVudCA9IGFwcC5fY29tcG9uZW50O1xuICAgIGlmICghaXNGdW5jdGlvbihjb21wb25lbnQpICYmICFjb21wb25lbnQucmVuZGVyICYmICFjb21wb25lbnQudGVtcGxhdGUpIHtcbiAgICAgIGNvbXBvbmVudC50ZW1wbGF0ZSA9IGNvbnRhaW5lci5pbm5lckhUTUw7XG4gICAgfVxuICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSBcIlwiO1xuICAgIGNvbnN0IHByb3h5ID0gbW91bnQoY29udGFpbmVyLCBmYWxzZSwgcmVzb2x2ZVJvb3ROYW1lc3BhY2UoY29udGFpbmVyKSk7XG4gICAgaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIEVsZW1lbnQpIHtcbiAgICAgIGNvbnRhaW5lci5yZW1vdmVBdHRyaWJ1dGUoXCJ2LWNsb2FrXCIpO1xuICAgICAgY29udGFpbmVyLnNldEF0dHJpYnV0ZShcImRhdGEtdi1hcHBcIiwgXCJcIik7XG4gICAgfVxuICAgIHJldHVybiBwcm94eTtcbiAgfTtcbiAgcmV0dXJuIGFwcDtcbn07XG5jb25zdCBjcmVhdGVTU1JBcHAgPSAoLi4uYXJncykgPT4ge1xuICBjb25zdCBhcHAgPSBlbnN1cmVIeWRyYXRpb25SZW5kZXJlcigpLmNyZWF0ZUFwcCguLi5hcmdzKTtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICBpbmplY3ROYXRpdmVUYWdDaGVjayhhcHApO1xuICAgIGluamVjdENvbXBpbGVyT3B0aW9uc0NoZWNrKGFwcCk7XG4gIH1cbiAgY29uc3QgeyBtb3VudCB9ID0gYXBwO1xuICBhcHAubW91bnQgPSAoY29udGFpbmVyT3JTZWxlY3RvcikgPT4ge1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IG5vcm1hbGl6ZUNvbnRhaW5lcihjb250YWluZXJPclNlbGVjdG9yKTtcbiAgICBpZiAoY29udGFpbmVyKSB7XG4gICAgICByZXR1cm4gbW91bnQoY29udGFpbmVyLCB0cnVlLCByZXNvbHZlUm9vdE5hbWVzcGFjZShjb250YWluZXIpKTtcbiAgICB9XG4gIH07XG4gIHJldHVybiBhcHA7XG59O1xuZnVuY3Rpb24gcmVzb2x2ZVJvb3ROYW1lc3BhY2UoY29udGFpbmVyKSB7XG4gIGlmIChjb250YWluZXIgaW5zdGFuY2VvZiBTVkdFbGVtZW50KSB7XG4gICAgcmV0dXJuIFwic3ZnXCI7XG4gIH1cbiAgaWYgKHR5cGVvZiBNYXRoTUxFbGVtZW50ID09PSBcImZ1bmN0aW9uXCIgJiYgY29udGFpbmVyIGluc3RhbmNlb2YgTWF0aE1MRWxlbWVudCkge1xuICAgIHJldHVybiBcIm1hdGhtbFwiO1xuICB9XG59XG5mdW5jdGlvbiBpbmplY3ROYXRpdmVUYWdDaGVjayhhcHApIHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGFwcC5jb25maWcsIFwiaXNOYXRpdmVUYWdcIiwge1xuICAgIHZhbHVlOiAodGFnKSA9PiBpc0hUTUxUYWcodGFnKSB8fCBpc1NWR1RhZyh0YWcpIHx8IGlzTWF0aE1MVGFnKHRhZyksXG4gICAgd3JpdGFibGU6IGZhbHNlXG4gIH0pO1xufVxuZnVuY3Rpb24gaW5qZWN0Q29tcGlsZXJPcHRpb25zQ2hlY2soYXBwKSB7XG4gIGlmIChpc1J1bnRpbWVPbmx5KCkpIHtcbiAgICBjb25zdCBpc0N1c3RvbUVsZW1lbnQgPSBhcHAuY29uZmlnLmlzQ3VzdG9tRWxlbWVudDtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoYXBwLmNvbmZpZywgXCJpc0N1c3RvbUVsZW1lbnRcIiwge1xuICAgICAgZ2V0KCkge1xuICAgICAgICByZXR1cm4gaXNDdXN0b21FbGVtZW50O1xuICAgICAgfSxcbiAgICAgIHNldCgpIHtcbiAgICAgICAgd2FybihcbiAgICAgICAgICBgVGhlIFxcYGlzQ3VzdG9tRWxlbWVudFxcYCBjb25maWcgb3B0aW9uIGlzIGRlcHJlY2F0ZWQuIFVzZSBcXGBjb21waWxlck9wdGlvbnMuaXNDdXN0b21FbGVtZW50XFxgIGluc3RlYWQuYFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IGNvbXBpbGVyT3B0aW9ucyA9IGFwcC5jb25maWcuY29tcGlsZXJPcHRpb25zO1xuICAgIGNvbnN0IG1zZyA9IGBUaGUgXFxgY29tcGlsZXJPcHRpb25zXFxgIGNvbmZpZyBvcHRpb24gaXMgb25seSByZXNwZWN0ZWQgd2hlbiB1c2luZyBhIGJ1aWxkIG9mIFZ1ZS5qcyB0aGF0IGluY2x1ZGVzIHRoZSBydW50aW1lIGNvbXBpbGVyIChha2EgXCJmdWxsIGJ1aWxkXCIpLiBTaW5jZSB5b3UgYXJlIHVzaW5nIHRoZSBydW50aW1lLW9ubHkgYnVpbGQsIFxcYGNvbXBpbGVyT3B0aW9uc1xcYCBtdXN0IGJlIHBhc3NlZCB0byBcXGBAdnVlL2NvbXBpbGVyLWRvbVxcYCBpbiB0aGUgYnVpbGQgc2V0dXAgaW5zdGVhZC5cbi0gRm9yIHZ1ZS1sb2FkZXI6IHBhc3MgaXQgdmlhIHZ1ZS1sb2FkZXIncyBcXGBjb21waWxlck9wdGlvbnNcXGAgbG9hZGVyIG9wdGlvbi5cbi0gRm9yIHZ1ZS1jbGk6IHNlZSBodHRwczovL2NsaS52dWVqcy5vcmcvZ3VpZGUvd2VicGFjay5odG1sI21vZGlmeWluZy1vcHRpb25zLW9mLWEtbG9hZGVyXG4tIEZvciB2aXRlOiBwYXNzIGl0IHZpYSBAdml0ZWpzL3BsdWdpbi12dWUgb3B0aW9ucy4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS92aXRlanMvdml0ZS1wbHVnaW4tdnVlL3RyZWUvbWFpbi9wYWNrYWdlcy9wbHVnaW4tdnVlI2V4YW1wbGUtZm9yLXBhc3Npbmctb3B0aW9ucy10by12dWVjb21waWxlci1zZmNgO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhcHAuY29uZmlnLCBcImNvbXBpbGVyT3B0aW9uc1wiLCB7XG4gICAgICBnZXQoKSB7XG4gICAgICAgIHdhcm4obXNnKTtcbiAgICAgICAgcmV0dXJuIGNvbXBpbGVyT3B0aW9ucztcbiAgICAgIH0sXG4gICAgICBzZXQoKSB7XG4gICAgICAgIHdhcm4obXNnKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuZnVuY3Rpb24gbm9ybWFsaXplQ29udGFpbmVyKGNvbnRhaW5lcikge1xuICBpZiAoaXNTdHJpbmcoY29udGFpbmVyKSkge1xuICAgIGNvbnN0IHJlcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoY29udGFpbmVyKTtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAhcmVzKSB7XG4gICAgICB3YXJuKFxuICAgICAgICBgRmFpbGVkIHRvIG1vdW50IGFwcDogbW91bnQgdGFyZ2V0IHNlbGVjdG9yIFwiJHtjb250YWluZXJ9XCIgcmV0dXJuZWQgbnVsbC5gXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9k
20578dWN0aW9uXCIpICYmIHdpbmRvdy5TaGFkb3dSb290ICYmIGNvbnRhaW5lciBpbnN0YW5jZW9mIHdpbmRvdy5TaGFkb3dSb290ICYmIGNvbnRhaW5lci5tb2RlID09PSBcImNsb3NlZFwiKSB7XG4gICAgd2FybihcbiAgICAgIGBtb3VudGluZyBvbiBhIFNoYWRvd1Jvb3Qgd2l0aCBcXGB7bW9kZTogXCJjbG9zZWRcIn1cXGAgbWF5IGxlYWQgdG8gdW5wcmVkaWN0YWJsZSBidWdzYFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIGNvbnRhaW5lcjtcbn1cbmxldCBzc3JEaXJlY3RpdmVJbml0aWFsaXplZCA9IGZhbHNlO1xuY29uc3QgaW5pdERpcmVjdGl2ZXNGb3JTU1IgPSAoKSA9PiB7XG4gIGlmICghc3NyRGlyZWN0aXZlSW5pdGlhbGl6ZWQpIHtcbiAgICBzc3JEaXJlY3RpdmVJbml0aWFsaXplZCA9IHRydWU7XG4gICAgaW5pdFZNb2RlbEZvclNTUigpO1xuICAgIGluaXRWU2hvd0ZvclNTUigpO1xuICB9XG59IDtcblxuZXhwb3J0IHsgVHJhbnNpdGlvbiwgVHJhbnNpdGlvbkdyb3VwLCBWdWVFbGVtZW50LCBjcmVhdGVBcHAsIGNyZWF0ZVNTUkFwcCwgZGVmaW5lQ3VzdG9tRWxlbWVudCwgZGVmaW5lU1NSQ3VzdG9tRWxlbWVudCwgaHlkcmF0ZSwgaW5pdERpcmVjdGl2ZXNGb3JTU1IsIHJlbmRlciwgdXNlQ3NzTW9kdWxlLCB1c2VDc3NWYXJzLCB2TW9kZWxDaGVja2JveCwgdk1vZGVsRHluYW1pYywgdk1vZGVsUmFkaW8sIHZNb2RlbFNlbGVjdCwgdk1vZGVsVGV4dCwgdlNob3csIHdpdGhLZXlzLCB3aXRoTW9kaWZpZXJzIH07XG4iLCIvKipcbiogQHZ1ZS9zaGFyZWQgdjMuNC4zNFxuKiAoYykgMjAxOC1wcmVzZW50IFl1eGkgKEV2YW4pIFlvdSBhbmQgVnVlIGNvbnRyaWJ1dG9yc1xuKiBAbGljZW5zZSBNSVRcbioqL1xuLyohICNfX05PX1NJREVfRUZGRUNUU19fICovXG4vLyBAX19OT19TSURFX0VGRkVDVFNfX1xuZnVuY3Rpb24gbWFrZU1hcChzdHIsIGV4cGVjdHNMb3dlckNhc2UpIHtcbiAgY29uc3Qgc2V0ID0gbmV3IFNldChzdHIuc3BsaXQoXCIsXCIpKTtcbiAgcmV0dXJuIGV4cGVjdHNMb3dlckNhc2UgPyAodmFsKSA9PiBzZXQuaGFzKHZhbC50b0xvd2VyQ2FzZSgpKSA6ICh2YWwpID0+IHNldC5oYXModmFsKTtcbn1cblxuY29uc3QgRU1QVFlfT0JKID0gISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IE9iamVjdC5mcmVlemUoe30pIDoge307XG5jb25zdCBFTVBUWV9BUlIgPSAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8gT2JqZWN0LmZyZWV6ZShbXSkgOiBbXTtcbmNvbnN0IE5PT1AgPSAoKSA9PiB7XG59O1xuY29uc3QgTk8gPSAoKSA9PiBmYWxzZTtcbmNvbnN0IGlzT24gPSAoa2V5KSA9PiBrZXkuY2hhckNvZGVBdCgwKSA9PT0gMTExICYmIGtleS5jaGFyQ29kZUF0KDEpID09PSAxMTAgJiYgLy8gdXBwZXJjYXNlIGxldHRlclxuKGtleS5jaGFyQ29kZUF0KDIpID4gMTIyIHx8IGtleS5jaGFyQ29kZUF0KDIpIDwgOTcpO1xuY29uc3QgaXNNb2RlbExpc3RlbmVyID0gKGtleSkgPT4ga2V5LnN0YXJ0c1dpdGgoXCJvblVwZGF0ZTpcIik7XG5jb25zdCBleHRlbmQgPSBPYmplY3QuYXNzaWduO1xuY29uc3QgcmVtb3ZlID0gKGFyciwgZWwpID0+IHtcbiAgY29uc3QgaSA9IGFyci5pbmRleE9mKGVsKTtcbiAgaWYgKGkgPiAtMSkge1xuICAgIGFyci5zcGxpY2UoaSwgMSk7XG4gIH1cbn07XG5jb25zdCBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5jb25zdCBoYXNPd24gPSAodmFsLCBrZXkpID0+IGhhc093blByb3BlcnR5LmNhbGwodmFsLCBrZXkpO1xuY29uc3QgaXNBcnJheSA9IEFycmF5LmlzQXJyYXk7XG5jb25zdCBpc01hcCA9ICh2YWwpID0+IHRvVHlwZVN0cmluZyh2YWwpID09PSBcIltvYmplY3QgTWFwXVwiO1xuY29uc3QgaXNTZXQgPSAodmFsKSA9PiB0b1R5cGVTdHJpbmcodmFsKSA9PT0gXCJbb2JqZWN0IFNldF1cIjtcbmNvbnN0IGlzRGF0ZSA9ICh2YWwpID0+IHRvVHlwZVN0cmluZyh2YWwpID09PSBcIltvYmplY3QgRGF0ZV1cIjtcbmNvbnN0IGlzUmVnRXhwID0gKHZhbCkgPT4gdG9UeXBlU3RyaW5nKHZhbCkgPT09IFwiW29iamVjdCBSZWdFeHBdXCI7XG5jb25zdCBpc0Z1bmN0aW9uID0gKHZhbCkgPT4gdHlwZW9mIHZhbCA9PT0gXCJmdW5jdGlvblwiO1xuY29uc3QgaXNTdHJpbmcgPSAodmFsKSA9PiB0eXBlb2YgdmFsID09PSBcInN0cmluZ1wiO1xuY29uc3QgaXNTeW1ib2wgPSAodmFsKSA9PiB0eXBlb2YgdmFsID09PSBcInN5bWJvbFwiO1xuY29uc3QgaXNPYmplY3QgPSAodmFsKSA9PiB2YWwgIT09IG51bGwgJiYgdHlwZW9mIHZhbCA9PT0gXCJvYmplY3RcIjtcbmNvbnN0IGlzUHJvbWlzZSA9ICh2YWwpID0+IHtcbiAgcmV0dXJuIChpc09iamVjdCh2YWwpIHx8IGlzRnVuY3Rpb24odmFsKSkgJiYgaXNGdW5jdGlvbih2YWwudGhlbikgJiYgaXNGdW5jdGlvbih2YWwuY2F0Y2gpO1xufTtcbmNvbnN0IG9iamVjdFRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcbmNvbnN0IHRvVHlwZVN0cmluZyA9ICh2YWx1ZSkgPT4gb2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSk7XG5jb25zdCB0b1Jhd1R5cGUgPSAodmFsdWUpID0+IHtcbiAgcmV0dXJuIHRvVHlwZVN0cmluZyh2YWx1ZSkuc2xpY2UoOCwgLTEpO1xufTtcbmNvbnN0IGlzUGxhaW5PYmplY3QgPSAodmFsKSA9PiB0b1R5cGVTdHJpbmcodmFsKSA9PT0gXCJbb2JqZWN0IE9iamVjdF1cIjtcbmNvbnN0IGlzSW50ZWdlcktleSA9IChrZXkpID0+IGlzU3RyaW5nKGtleSkgJiYga2V5ICE9PSBcIk5hTlwiICYmIGtleVswXSAhPT0gXCItXCIgJiYgXCJcIiArIHBhcnNlSW50KGtleSwgMTApID09PSBrZXk7XG5jb25zdCBpc1Jlc2VydmVkUHJvcCA9IC8qIEBfX1BVUkVfXyAqLyBtYWtlTWFwKFxuICAvLyB0aGUgbGVhZGluZyBjb21tYSBpcyBpbnRlbnRpb25hbCBzbyBlbXB0eSBzdHJpbmcgXCJcIiBpcyBhbHNvIGluY2x1ZGVkXG4gIFwiLGtleSxyZWYscmVmX2ZvcixyZWZfa2V5LG9uVm5vZGVCZWZvcmVNb3VudCxvblZub2RlTW91bnRlZCxvblZub2RlQmVmb3JlVXBkYXRlLG9uVm5vZGVVcGRhdGVkLG9uVm5vZGVCZWZvcmVVbm1vdW50LG9uVm5vZGVVbm1vdW50ZWRcIlxuKTtcbmNvbnN0IGlzQnVpbHRJbkRpcmVjdGl2ZSA9IC8qIEBfX1BVUkVfXyAqLyBtYWtlTWFwKFxuICBcImJpbmQsY2xvYWssZWxzZS1pZixlbHNlLGZvcixodG1sLGlmLG1vZGVsLG9uLG9uY2UscHJlLHNob3csc2xvdCx0ZXh0LG1lbW9cIlxuKTtcbmNvbnN0IGNhY2hlU3RyaW5nRnVuY3Rpb24gPSAoZm4pID0+IHtcbiAgY29uc3QgY2FjaGUgPSAvKiBAX19QVVJFX18gKi8gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgcmV0dXJuIChzdHIpID0+IHtcbiAgICBjb25zdCBoaXQgPSBjYWNoZVtzdHJdO1xuICAgIHJldHVybi
20578BoaXQgfHwgKGNhY2hlW3N0cl0gPSBmbihzdHIpKTtcbiAgfTtcbn07XG5jb25zdCBjYW1lbGl6ZVJFID0gLy0oXFx3KS9nO1xuY29uc3QgY2FtZWxpemUgPSBjYWNoZVN0cmluZ0Z1bmN0aW9uKChzdHIpID0+IHtcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKGNhbWVsaXplUkUsIChfLCBjKSA9PiBjID8gYy50b1VwcGVyQ2FzZSgpIDogXCJcIik7XG59KTtcbmNvbnN0IGh5cGhlbmF0ZVJFID0gL1xcQihbQS1aXSkvZztcbmNvbnN0IGh5cGhlbmF0ZSA9IGNhY2hlU3RyaW5nRnVuY3Rpb24oXG4gIChzdHIpID0+IHN0ci5yZXBsYWNlKGh5cGhlbmF0ZVJFLCBcIi0kMVwiKS50b0xvd2VyQ2FzZSgpXG4pO1xuY29uc3QgY2FwaXRhbGl6ZSA9IGNhY2hlU3RyaW5nRnVuY3Rpb24oKHN0cikgPT4ge1xuICByZXR1cm4gc3RyLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgc3RyLnNsaWNlKDEpO1xufSk7XG5jb25zdCB0b0hhbmRsZXJLZXkgPSBjYWNoZVN0cmluZ0Z1bmN0aW9uKChzdHIpID0+IHtcbiAgY29uc3QgcyA9IHN0ciA/IGBvbiR7Y2FwaXRhbGl6ZShzdHIpfWAgOiBgYDtcbiAgcmV0dXJuIHM7XG59KTtcbmNvbnN0IGhhc0NoYW5nZWQgPSAodmFsdWUsIG9sZFZhbHVlKSA9PiAhT2JqZWN0LmlzKHZhbHVlLCBvbGRWYWx1ZSk7XG5jb25zdCBpbnZva2VBcnJheUZucyA9IChmbnMsIC4uLmFyZykgPT4ge1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGZucy5sZW5ndGg7IGkrKykge1xuICAgIGZuc1tpXSguLi5hcmcpO1xuICB9XG59O1xuY29uc3QgZGVmID0gKG9iaiwga2V5LCB2YWx1ZSwgd3JpdGFibGUgPSBmYWxzZSkgPT4ge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHtcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgd3JpdGFibGUsXG4gICAgdmFsdWVcbiAgfSk7XG59O1xuY29uc3QgbG9vc2VUb051bWJlciA9ICh2YWwpID0+IHtcbiAgY29uc3QgbiA9IHBhcnNlRmxvYXQodmFsKTtcbiAgcmV0dXJuIGlzTmFOKG4pID8gdmFsIDogbjtcbn07XG5jb25zdCB0b051bWJlciA9ICh2YWwpID0+IHtcbiAgY29uc3QgbiA9IGlzU3RyaW5nKHZhbCkgPyBOdW1iZXIodmFsKSA6IE5hTjtcbiAgcmV0dXJuIGlzTmFOKG4pID8gdmFsIDogbjtcbn07XG5sZXQgX2dsb2JhbFRoaXM7XG5jb25zdCBnZXRHbG9iYWxUaGlzID0gKCkgPT4ge1xuICByZXR1cm4gX2dsb2JhbFRoaXMgfHwgKF9nbG9iYWxUaGlzID0gdHlwZW9mIGdsb2JhbFRoaXMgIT09IFwidW5kZWZpbmVkXCIgPyBnbG9iYWxUaGlzIDogdHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIgPyBzZWxmIDogdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiA/IHdpbmRvdyA6IHR5cGVvZiBnbG9iYWwgIT09IFwidW5kZWZpbmVkXCIgPyBnbG9iYWwgOiB7fSk7XG59O1xuY29uc3QgaWRlbnRSRSA9IC9eW18kYS16QS1aXFx4QTAtXFx1RkZGRl1bXyRhLXpBLVowLTlcXHhBMC1cXHVGRkZGXSokLztcbmZ1bmN0aW9uIGdlblByb3BzQWNjZXNzRXhwKG5hbWUpIHtcbiAgcmV0dXJuIGlkZW50UkUudGVzdChuYW1lKSA/IGBfX3Byb3BzLiR7bmFtZX1gIDogYF9fcHJvcHNbJHtKU09OLnN0cmluZ2lmeShuYW1lKX1dYDtcbn1cblxuY29uc3QgUGF0Y2hGbGFncyA9IHtcbiAgXCJURVhUXCI6IDEsXG4gIFwiMVwiOiBcIlRFWFRcIixcbiAgXCJDTEFTU1wiOiAyLFxuICBcIjJcIjogXCJDTEFTU1wiLFxuICBcIlNUWUxFXCI6IDQsXG4gIFwiNFwiOiBcIlNUWUxFXCIsXG4gIFwiUFJPUFNcIjogOCxcbiAgXCI4XCI6IFwiUFJPUFNcIixcbiAgXCJGVUxMX1BST1BTXCI6IDE2LFxuICBcIjE2XCI6IFwiRlVMTF9QUk9QU1wiLFxuICBcIk5FRURfSFlEUkFUSU9OXCI6IDMyLFxuICBcIjMyXCI6IFwiTkVFRF9IWURSQVRJT05cIixcbiAgXCJTVEFCTEVfRlJBR01FTlRcIjogNjQsXG4gIFwiNjRcIjogXCJTVEFCTEVfRlJBR01FTlRcIixcbiAgXCJLRVlFRF9GUkFHTUVOVFwiOiAxMjgsXG4gIFwiMTI4XCI6IFwiS0VZRURfRlJBR01FTlRcIixcbiAgXCJVTktFWUVEX0ZSQUdNRU5UXCI6IDI1NixcbiAgXCIyNTZcIjogXCJVTktFWUVEX0ZSQUdNRU5UXCIsXG4gIFwiTkVFRF9QQVRDSFwiOiA1MTIsXG4gIFwiNTEyXCI6IFwiTkVFRF9QQVRDSFwiLFxuICBcIkRZTkFNSUNfU0xPVFNcIjogMTAyNCxcbiAgXCIxMDI0XCI6IFwiRFlOQU1JQ19TTE9UU1wiLFxuICBcIkRFVl9ST09UX0ZSQUdNRU5UXCI6IDIwNDgsXG4gIFwiMjA0OFwiOiBcIkRFVl9ST09UX0ZSQUdNRU5UXCIsXG4gIFwiSE9JU1RFRFwiOiAtMSxcbiAgXCItMVwiOiBcIkhPSVNURURcIixcbiAgXCJCQUlMXCI6IC0yLFxuICBcIi0yXCI6IFwiQkFJTFwiXG59O1xuY29uc3QgUGF0Y2hGbGFnTmFtZXMgPSB7XG4gIFsxXTogYFRFWFRgLFxuICBbMl06IGBDTEFTU2AsXG4gIFs0XTogYFNUWUxFYCxcbiAgWzhdOiBgUFJPUFNgLFxuICBbMTZdOiBgRlVMTF9QUk9QU2AsXG4gIFszMl06IGBORUVEX0hZRFJBVElPTmAsXG4gIFs2NF06IGBTVEFCTEVfRlJBR01FTlRgLFxuICBbMTI4XTogYEtFWUVEX0ZSQUdNRU5UYCxcbiAgWzI1Nl06IGBVTktFWUVEX0ZSQUdNRU5UYCxcbiAgWzUxMl06IGBORUVEX1BBVENIYCxcbiAgWzEwMjRdOiBgRFlOQU1JQ19TTE9UU2AsXG4gIFsyMDQ4XTogYERFVl9ST09UX0ZSQUdNRU5UYCxcbiAgWy0xXTogYEhPSVNURURgLFxuICBbLTJdOiBgQkFJTGBcbn07XG5cbmNvbnN0IFNoYXBlRmxhZ3MgPSB7XG4gIFwiRUxFTUVOVFwiOiAxLFxuICBcIjFcIjogXCJFTEVNRU5UXCIsXG4gIFwiRlVOQ1RJT05BTF9DT01QT05FTlRcIjogMixcbiAgXCIyXCI6IFwiRlVOQ1RJT05BTF9DT01QT05FTlRcIixcbiAgXCJTVEFURUZVTF9DT01QT05FTlRcIjogNCxcbiAgXCI0XCI6IFwiU1RBVEVGVUxfQ09NUE9ORU5UXCIsXG4gIFwiVEVYVF9DSElMRFJFTlwiOiA4LFxuICBcIjhcIjogXCJURVhUX0NISUxEUkVOXCIsXG4gIFwiQVJSQVlfQ0hJTERSRU5cIjogMTYsXG4gIFwiMTZcIjogXCJBUlJBWV9DSElMRFJFTlwiLFxuICBcIlNMT1RTX0NISUxEUkVOXCI6IDMyLFxuICBcIjMyXCI6IFwiU0xPVFNfQ0hJTERSRU5cIixcbiAgXCJURUxFUE9SVFwiOiA2NCxcbiAgXCI2NFwiOiBcIlRFTEVQT1J
20578UXCIsXG4gIFwiU1VTUEVOU0VcIjogMTI4LFxuICBcIjEyOFwiOiBcIlNVU1BFTlNFXCIsXG4gIFwiQ09NUE9ORU5UX1NIT1VMRF9LRUVQX0FMSVZFXCI6IDI1NixcbiAgXCIyNTZcIjogXCJDT01QT05FTlRfU0hPVUxEX0tFRVBfQUxJVkVcIixcbiAgXCJDT01QT05FTlRfS0VQVF9BTElWRVwiOiA1MTIsXG4gIFwiNTEyXCI6IFwiQ09NUE9ORU5UX0tFUFRfQUxJVkVcIixcbiAgXCJDT01QT05FTlRcIjogNixcbiAgXCI2XCI6IFwiQ09NUE9ORU5UXCJcbn07XG5cbmNvbnN0IFNsb3RGbGFncyA9IHtcbiAgXCJTVEFCTEVcIjogMSxcbiAgXCIxXCI6IFwiU1RBQkxFXCIsXG4gIFwiRFlOQU1JQ1wiOiAyLFxuICBcIjJcIjogXCJEWU5BTUlDXCIsXG4gIFwiRk9SV0FSREVEXCI6IDMsXG4gIFwiM1wiOiBcIkZPUldBUkRFRFwiXG59O1xuY29uc3Qgc2xvdEZsYWdzVGV4dCA9IHtcbiAgWzFdOiBcIlNUQUJMRVwiLFxuICBbMl06IFwiRFlOQU1JQ1wiLFxuICBbM106IFwiRk9SV0FSREVEXCJcbn07XG5cbmNvbnN0IEdMT0JBTFNfQUxMT1dFRCA9IFwiSW5maW5pdHksdW5kZWZpbmVkLE5hTixpc0Zpbml0ZSxpc05hTixwYXJzZUZsb2F0LHBhcnNlSW50LGRlY29kZVVSSSxkZWNvZGVVUklDb21wb25lbnQsZW5jb2RlVVJJLGVuY29kZVVSSUNvbXBvbmVudCxNYXRoLE51bWJlcixEYXRlLEFycmF5LE9iamVjdCxCb29sZWFuLFN0cmluZyxSZWdFeHAsTWFwLFNldCxKU09OLEludGwsQmlnSW50LGNvbnNvbGUsRXJyb3JcIjtcbmNvbnN0IGlzR2xvYmFsbHlBbGxvd2VkID0gLyogQF9fUFVSRV9fICovIG1ha2VNYXAoR0xPQkFMU19BTExPV0VEKTtcbmNvbnN0IGlzR2xvYmFsbHlXaGl0ZWxpc3RlZCA9IGlzR2xvYmFsbHlBbGxvd2VkO1xuXG5jb25zdCByYW5nZSA9IDI7XG5mdW5jdGlvbiBnZW5lcmF0ZUNvZGVGcmFtZShzb3VyY2UsIHN0YXJ0ID0gMCwgZW5kID0gc291cmNlLmxlbmd0aCkge1xuICBzdGFydCA9IE1hdGgubWF4KDAsIE1hdGgubWluKHN0YXJ0LCBzb3VyY2UubGVuZ3RoKSk7XG4gIGVuZCA9IE1hdGgubWF4KDAsIE1hdGgubWluKGVuZCwgc291cmNlLmxlbmd0aCkpO1xuICBpZiAoc3RhcnQgPiBlbmQpIHJldHVybiBcIlwiO1xuICBsZXQgbGluZXMgPSBzb3VyY2Uuc3BsaXQoLyhcXHI/XFxuKS8pO1xuICBjb25zdCBuZXdsaW5lU2VxdWVuY2VzID0gbGluZXMuZmlsdGVyKChfLCBpZHgpID0+IGlkeCAlIDIgPT09IDEpO1xuICBsaW5lcyA9IGxpbmVzLmZpbHRlcigoXywgaWR4KSA9PiBpZHggJSAyID09PSAwKTtcbiAgbGV0IGNvdW50ID0gMDtcbiAgY29uc3QgcmVzID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb3VudCArPSBsaW5lc1tpXS5sZW5ndGggKyAobmV3bGluZVNlcXVlbmNlc1tpXSAmJiBuZXdsaW5lU2VxdWVuY2VzW2ldLmxlbmd0aCB8fCAwKTtcbiAgICBpZiAoY291bnQgPj0gc3RhcnQpIHtcbiAgICAgIGZvciAobGV0IGogPSBpIC0gcmFuZ2U7IGogPD0gaSArIHJhbmdlIHx8IGVuZCA+IGNvdW50OyBqKyspIHtcbiAgICAgICAgaWYgKGogPCAwIHx8IGogPj0gbGluZXMubGVuZ3RoKSBjb250aW51ZTtcbiAgICAgICAgY29uc3QgbGluZSA9IGogKyAxO1xuICAgICAgICByZXMucHVzaChcbiAgICAgICAgICBgJHtsaW5lfSR7XCIgXCIucmVwZWF0KE1hdGgubWF4KDMgLSBTdHJpbmcobGluZSkubGVuZ3RoLCAwKSl9fCAgJHtsaW5lc1tqXX1gXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGxpbmVMZW5ndGggPSBsaW5lc1tqXS5sZW5ndGg7XG4gICAgICAgIGNvbnN0IG5ld0xpbmVTZXFMZW5ndGggPSBuZXdsaW5lU2VxdWVuY2VzW2pdICYmIG5ld2xpbmVTZXF1ZW5jZXNbal0ubGVuZ3RoIHx8IDA7XG4gICAgICAgIGlmIChqID09PSBpKSB7XG4gICAgICAgICAgY29uc3QgcGFkID0gc3RhcnQgLSAoY291bnQgLSAobGluZUxlbmd0aCArIG5ld0xpbmVTZXFMZW5ndGgpKTtcbiAgICAgICAgICBjb25zdCBsZW5ndGggPSBNYXRoLm1heChcbiAgICAgICAgICAgIDEsXG4gICAgICAgICAgICBlbmQgPiBjb3VudCA/IGxpbmVMZW5ndGggLSBwYWQgOiBlbmQgLSBzdGFydFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmVzLnB1c2goYCAgIHwgIGAgKyBcIiBcIi5yZXBlYXQocGFkKSArIFwiXlwiLnJlcGVhdChsZW5ndGgpKTtcbiAgICAgICAgfSBlbHNlIGlmIChqID4gaSkge1xuICAgICAgICAgIGlmIChlbmQgPiBjb3VudCkge1xuICAgICAgICAgICAgY29uc3QgbGVuZ3RoID0gTWF0aC5tYXgoTWF0aC5taW4oZW5kIC0gY291bnQsIGxpbmVMZW5ndGgpLCAxKTtcbiAgICAgICAgICAgIHJlcy5wdXNoKGAgICB8ICBgICsgXCJeXCIucmVwZWF0KGxlbmd0aCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb3VudCArPSBsaW5lTGVuZ3RoICsgbmV3TGluZVNlcUxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXMuam9pbihcIlxcblwiKTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplU3R5bGUodmFsdWUpIHtcbiAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgY29uc3QgcmVzID0ge307XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgaXRlbSA9IHZhbHVlW2ldO1xuICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IGlzU3RyaW5nKGl0ZW0pID8gcGFyc2VTdHJpbmdTdHlsZShpdGVtKSA6IG5vcm1hbGl6ZVN0eWxlKGl0ZW0pO1xuICAgICAgaWYgKG5vcm1hbGl6ZWQpIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gbm9ybWFsaXplZCkge1xuICAgICAgICAgIHJlc1trZXldID0gbm9ybWFsaXplZFtrZXldO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH0gZWxzZSBpZiAoaXNTdHJpbmcodmFsdWUpIHx8IGlzT2JqZWN0KHZhbHVlKSkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxufVxuY29uc3QgbGlzdERlbGltaXRlclJFID0gLzsoPyFbXihdKlxcKSkvZztcbmNvbnN0IHByb3BlcnR5RGVsaW1pdGVyUkUgPSAvOihbXl0rKS87XG5jb25zdCBzdHlsZUNvbW1lbnRSRSA9IC9cXC9cXCpbXl0qP1xcKlxcLy9nO1xuZnVuY3Rpb24gcGFyc2VTdHJpbmdTdHlsZShjc3NUZXh0KSB7XG4gIGNvbnN0IHJldCA9IHt9O1xuICBjc3NUZXh0LnJlcGxhY2Uoc3R5bGVDb21tZW50UkUsIFwiXCIpLnNwbGl0KGxpc3REZWxpbWl0ZXJSRSkuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgIGlmIChpdGVtKSB7XG4gICAgICBjb25zdCB0bXAgPSBpdGVtLnNwbGl0KHByb3BlcnR5RGVsaW
205781pdGVyUkUpO1xuICAgICAgdG1wLmxlbmd0aCA+IDEgJiYgKHJldFt0bXBbMF0udHJpbSgpXSA9IHRtcFsxXS50cmltKCkpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiByZXQ7XG59XG5mdW5jdGlvbiBzdHJpbmdpZnlTdHlsZShzdHlsZXMpIHtcbiAgbGV0IHJldCA9IFwiXCI7XG4gIGlmICghc3R5bGVzIHx8IGlzU3RyaW5nKHN0eWxlcykpIHtcbiAgICByZXR1cm4gcmV0O1xuICB9XG4gIGZvciAoY29uc3Qga2V5IGluIHN0eWxlcykge1xuICAgIGNvbnN0IHZhbHVlID0gc3R5bGVzW2tleV07XG4gICAgaWYgKGlzU3RyaW5nKHZhbHVlKSB8fCB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRLZXkgPSBrZXkuc3RhcnRzV2l0aChgLS1gKSA/IGtleSA6IGh5cGhlbmF0ZShrZXkpO1xuICAgICAgcmV0ICs9IGAke25vcm1hbGl6ZWRLZXl9OiR7dmFsdWV9O2A7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXQ7XG59XG5mdW5jdGlvbiBub3JtYWxpemVDbGFzcyh2YWx1ZSkge1xuICBsZXQgcmVzID0gXCJcIjtcbiAgaWYgKGlzU3RyaW5nKHZhbHVlKSkge1xuICAgIHJlcyA9IHZhbHVlO1xuICB9IGVsc2UgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZUNsYXNzKHZhbHVlW2ldKTtcbiAgICAgIGlmIChub3JtYWxpemVkKSB7XG4gICAgICAgIHJlcyArPSBub3JtYWxpemVkICsgXCIgXCI7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzT2JqZWN0KHZhbHVlKSkge1xuICAgIGZvciAoY29uc3QgbmFtZSBpbiB2YWx1ZSkge1xuICAgICAgaWYgKHZhbHVlW25hbWVdKSB7XG4gICAgICAgIHJlcyArPSBuYW1lICsgXCIgXCI7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiByZXMudHJpbSgpO1xufVxuZnVuY3Rpb24gbm9ybWFsaXplUHJvcHMocHJvcHMpIHtcbiAgaWYgKCFwcm9wcykgcmV0dXJuIG51bGw7XG4gIGxldCB7IGNsYXNzOiBrbGFzcywgc3R5bGUgfSA9IHByb3BzO1xuICBpZiAoa2xhc3MgJiYgIWlzU3RyaW5nKGtsYXNzKSkge1xuICAgIHByb3BzLmNsYXNzID0gbm9ybWFsaXplQ2xhc3Moa2xhc3MpO1xuICB9XG4gIGlmIChzdHlsZSkge1xuICAgIHByb3BzLnN0eWxlID0gbm9ybWFsaXplU3R5bGUoc3R5bGUpO1xuICB9XG4gIHJldHVybiBwcm9wcztcbn1cblxuY29uc3QgSFRNTF9UQUdTID0gXCJodG1sLGJvZHksYmFzZSxoZWFkLGxpbmssbWV0YSxzdHlsZSx0aXRsZSxhZGRyZXNzLGFydGljbGUsYXNpZGUsZm9vdGVyLGhlYWRlcixoZ3JvdXAsaDEsaDIsaDMsaDQsaDUsaDYsbmF2LHNlY3Rpb24sZGl2LGRkLGRsLGR0LGZpZ2NhcHRpb24sZmlndXJlLHBpY3R1cmUsaHIsaW1nLGxpLG1haW4sb2wscCxwcmUsdWwsYSxiLGFiYnIsYmRpLGJkbyxicixjaXRlLGNvZGUsZGF0YSxkZm4sZW0saSxrYmQsbWFyayxxLHJwLHJ0LHJ1YnkscyxzYW1wLHNtYWxsLHNwYW4sc3Ryb25nLHN1YixzdXAsdGltZSx1LHZhcix3YnIsYXJlYSxhdWRpbyxtYXAsdHJhY2ssdmlkZW8sZW1iZWQsb2JqZWN0LHBhcmFtLHNvdXJjZSxjYW52YXMsc2NyaXB0LG5vc2NyaXB0LGRlbCxpbnMsY2FwdGlvbixjb2wsY29sZ3JvdXAsdGFibGUsdGhlYWQsdGJvZHksdGQsdGgsdHIsYnV0dG9uLGRhdGFsaXN0LGZpZWxkc2V0LGZvcm0saW5wdXQsbGFiZWwsbGVnZW5kLG1ldGVyLG9wdGdyb3VwLG9wdGlvbixvdXRwdXQscHJvZ3Jlc3Msc2VsZWN0LHRleHRhcmVhLGRldGFpbHMsZGlhbG9nLG1lbnUsc3VtbWFyeSx0ZW1wbGF0ZSxibG9ja3F1b3RlLGlmcmFtZSx0Zm9vdFwiO1xuY29uc3QgU1ZHX1RBR1MgPSBcInN2ZyxhbmltYXRlLGFuaW1hdGVNb3Rpb24sYW5pbWF0ZVRyYW5zZm9ybSxjaXJjbGUsY2xpcFBhdGgsY29sb3ItcHJvZmlsZSxkZWZzLGRlc2MsZGlzY2FyZCxlbGxpcHNlLGZlQmxlbmQsZmVDb2xvck1hdHJpeCxmZUNvbXBvbmVudFRyYW5zZmVyLGZlQ29tcG9zaXRlLGZlQ29udm9sdmVNYXRyaXgsZmVEaWZmdXNlTGlnaHRpbmcsZmVEaXNwbGFjZW1lbnRNYXAsZmVEaXN0YW50TGlnaHQsZmVEcm9wU2hhZG93LGZlRmxvb2QsZmVGdW5jQSxmZUZ1bmNCLGZlRnVuY0csZmVGdW5jUixmZUdhdXNzaWFuQmx1cixmZUltYWdlLGZlTWVyZ2UsZmVNZXJnZU5vZGUsZmVNb3JwaG9sb2d5LGZlT2Zmc2V0LGZlUG9pbnRMaWdodCxmZVNwZWN1bGFyTGlnaHRpbmcsZmVTcG90TGlnaHQsZmVUaWxlLGZlVHVyYnVsZW5jZSxmaWx0ZXIsZm9yZWlnbk9iamVjdCxnLGhhdGNoLGhhdGNocGF0aCxpbWFnZSxsaW5lLGxpbmVhckdyYWRpZW50LG1hcmtlcixtYXNrLG1lc2gsbWVzaGdyYWRpZW50LG1lc2hwYXRjaCxtZXNocm93LG1ldGFkYXRhLG1wYXRoLHBhdGgscGF0dGVybixwb2x5Z29uLHBvbHlsaW5lLHJhZGlhbEdyYWRpZW50LHJlY3Qsc2V0LHNvbGlkY29sb3Isc3RvcCxzd2l0Y2gsc3ltYm9sLHRleHQsdGV4dFBhdGgsdGl0bGUsdHNwYW4sdW5rbm93bix1c2Usdmlld1wiO1xuY29uc3QgTUFUSF9UQUdTID0gXCJhbm5vdGF0aW9uLGFubm90YXRpb24teG1sLG1hY3Rpb24sbWFsaWduZ3JvdXAsbWFsaWdubWFyayxtYXRoLG1lbmNsb3NlLG1lcnJvcixtZmVuY2VkLG1mcmFjLG1mcmFjdGlvbixtZ2x5cGgsbWksbWxhYmVsZWR0cixtbG9uZ2RpdixtbXVsdGlzY3JpcHRzLG1uLG1vLG1vdmVyLG1wYWRkZWQsbXBoYW50b20sbXByZXNjcmlwdHMsbXJvb3QsbXJvdyxtcyxtc2NhcnJpZXMsbXNjYXJyeSxtc2dyb3VwLG1zbGluZSxtc3BhY2UsbXNxcnQsbXNyb3csbXN0YWNrLG1zdHlsZSxtc3ViLG1zdWJzdXAsbXN1cCxtdGFibGUsbXRkLG10ZXh0LG10cixtdW5kZXIsbXVuZGVyb3Zlcixub25lLHNlbWFudGljc1wiO1xuY29uc3QgVk9JRF9UQUdTID0gXCJhcmVhLGJhc2UsYnIsY29sLGVtYmVkLGhyLGltZyxpbnB1dCxsaW5rLG1ldGEscGFyYW0sc291cmNlLHRyYWNrLHdiclwiO1xuY29uc3QgaXNIVE1MVGFnID0gLyogQF9fUFVSRV9fICovIG1ha2VNYXAoSFRNTF9UQUdTKTtcbmNvbnN0IGlzU1ZHVGFnID0gLyogQF9fUFVSRV9fICovIG1ha2VNYXAoU1ZHX1RBR1MpO1xuY29uc3QgaXNNYXRoTUxUYWcgPSAvKiBAX19QVVJFX18gKi8gbWFrZU1hcChNQVRIX1RB
20578R1MpO1xuY29uc3QgaXNWb2lkVGFnID0gLyogQF9fUFVSRV9fICovIG1ha2VNYXAoVk9JRF9UQUdTKTtcblxuY29uc3Qgc3BlY2lhbEJvb2xlYW5BdHRycyA9IGBpdGVtc2NvcGUsYWxsb3dmdWxsc2NyZWVuLGZvcm1ub3ZhbGlkYXRlLGlzbWFwLG5vbW9kdWxlLG5vdmFsaWRhdGUscmVhZG9ubHlgO1xuY29uc3QgaXNTcGVjaWFsQm9vbGVhbkF0dHIgPSAvKiBAX19QVVJFX18gKi8gbWFrZU1hcChzcGVjaWFsQm9vbGVhbkF0dHJzKTtcbmNvbnN0IGlzQm9vbGVhbkF0dHIgPSAvKiBAX19QVVJFX18gKi8gbWFrZU1hcChcbiAgc3BlY2lhbEJvb2xlYW5BdHRycyArIGAsYXN5bmMsYXV0b2ZvY3VzLGF1dG9wbGF5LGNvbnRyb2xzLGRlZmF1bHQsZGVmZXIsZGlzYWJsZWQsaGlkZGVuLGluZXJ0LGxvb3Asb3BlbixyZXF1aXJlZCxyZXZlcnNlZCxzY29wZWQsc2VhbWxlc3MsY2hlY2tlZCxtdXRlZCxtdWx0aXBsZSxzZWxlY3RlZGBcbik7XG5mdW5jdGlvbiBpbmNsdWRlQm9vbGVhbkF0dHIodmFsdWUpIHtcbiAgcmV0dXJuICEhdmFsdWUgfHwgdmFsdWUgPT09IFwiXCI7XG59XG5jb25zdCB1bnNhZmVBdHRyQ2hhclJFID0gL1s+Lz1cIidcXHUwMDA5XFx1MDAwYVxcdTAwMGNcXHUwMDIwXS87XG5jb25zdCBhdHRyVmFsaWRhdGlvbkNhY2hlID0ge307XG5mdW5jdGlvbiBpc1NTUlNhZmVBdHRyTmFtZShuYW1lKSB7XG4gIGlmIChhdHRyVmFsaWRhdGlvbkNhY2hlLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgcmV0dXJuIGF0dHJWYWxpZGF0aW9uQ2FjaGVbbmFtZV07XG4gIH1cbiAgY29uc3QgaXNVbnNhZmUgPSB1bnNhZmVBdHRyQ2hhclJFLnRlc3QobmFtZSk7XG4gIGlmIChpc1Vuc2FmZSkge1xuICAgIGNvbnNvbGUuZXJyb3IoYHVuc2FmZSBhdHRyaWJ1dGUgbmFtZTogJHtuYW1lfWApO1xuICB9XG4gIHJldHVybiBhdHRyVmFsaWRhdGlvbkNhY2hlW25hbWVdID0gIWlzVW5zYWZlO1xufVxuY29uc3QgcHJvcHNUb0F0dHJNYXAgPSB7XG4gIGFjY2VwdENoYXJzZXQ6IFwiYWNjZXB0LWNoYXJzZXRcIixcbiAgY2xhc3NOYW1lOiBcImNsYXNzXCIsXG4gIGh0bWxGb3I6IFwiZm9yXCIsXG4gIGh0dHBFcXVpdjogXCJodHRwLWVxdWl2XCJcbn07XG5jb25zdCBpc0tub3duSHRtbEF0dHIgPSAvKiBAX19QVVJFX18gKi8gbWFrZU1hcChcbiAgYGFjY2VwdCxhY2NlcHQtY2hhcnNldCxhY2Nlc3NrZXksYWN0aW9uLGFsaWduLGFsbG93LGFsdCxhc3luYyxhdXRvY2FwaXRhbGl6ZSxhdXRvY29tcGxldGUsYXV0b2ZvY3VzLGF1dG9wbGF5LGJhY2tncm91bmQsYmdjb2xvcixib3JkZXIsYnVmZmVyZWQsY2FwdHVyZSxjaGFsbGVuZ2UsY2hhcnNldCxjaGVja2VkLGNpdGUsY2xhc3MsY29kZSxjb2RlYmFzZSxjb2xvcixjb2xzLGNvbHNwYW4sY29udGVudCxjb250ZW50ZWRpdGFibGUsY29udGV4dG1lbnUsY29udHJvbHMsY29vcmRzLGNyb3Nzb3JpZ2luLGNzcCxkYXRhLGRhdGV0aW1lLGRlY29kaW5nLGRlZmF1bHQsZGVmZXIsZGlyLGRpcm5hbWUsZGlzYWJsZWQsZG93bmxvYWQsZHJhZ2dhYmxlLGRyb3B6b25lLGVuY3R5cGUsZW50ZXJrZXloaW50LGZvcixmb3JtLGZvcm1hY3Rpb24sZm9ybWVuY3R5cGUsZm9ybW1ldGhvZCxmb3Jtbm92YWxpZGF0ZSxmb3JtdGFyZ2V0LGhlYWRlcnMsaGVpZ2h0LGhpZGRlbixoaWdoLGhyZWYsaHJlZmxhbmcsaHR0cC1lcXVpdixpY29uLGlkLGltcG9ydGFuY2
20578UsaW5lcnQsaW50ZWdyaXR5LGlzbWFwLGl0ZW1wcm9wLGtleXR5cGUsa2luZCxsYWJlbCxsYW5nLGxhbmd1YWdlLGxvYWRpbmcsbGlzdCxsb29wLGxvdyxtYW5pZmVzdCxtYXgsbWF4bGVuZ3RoLG1pbmxlbmd0aCxtZWRpYSxtaW4sbXVsdGlwbGUsbXV0ZWQsbmFtZSxub3ZhbGlkYXRlLG9wZW4sb3B0aW11bSxwYXR0ZXJuLHBpbmcscGxhY2Vob2xkZXIscG9zdGVyLHByZWxvYWQscmFkaW9ncm91cCxyZWFkb25seSxyZWZlcnJlcnBvbGljeSxyZWwscmVxdWlyZWQscmV2ZXJzZWQscm93cyxyb3dzcGFuLHNhbmRib3gsc2NvcGUsc2NvcGVkLHNlbGVjdGVkLHNoYXBlLHNpemUsc2l6ZXMsc2xvdCxzcGFuLHNwZWxsY2hlY2ssc3JjLHNyY2RvYyxzcmNsYW5nLHNyY3NldCxzdGFydCxzdGVwLHN0eWxlLHN1bW1hcnksdGFiaW5kZXgsdGFyZ2V0LHRpdGxlLHRyYW5zbGF0ZSx0eXBlLHVzZW1hcCx2YWx1ZSx3aWR0aCx3cmFwYFxuKTtcbmNvbnN0IGlzS25vd25TdmdBdHRyID0gLyogQF9fUFVSRV9fICovIG1ha2VNYXAoXG4gIGB4bWxucyxhY2NlbnQtaGVpZ2h0LGFjY3VtdWxhdGUsYWRkaXRpdmUsYWxpZ25tZW50LWJhc2VsaW5lLGFscGhhYmV0aWMsYW1wbGl0dWRlLGFyYWJpYy1mb3JtLGFzY2VudCxhdHRyaWJ1dGVOYW1lLGF0dHJpYnV0ZVR5cGUsYXppbXV0aCxiYXNlRnJlcXVlbmN5LGJhc2VsaW5lLXNoaWZ0LGJhc2VQcm9maWxlLGJib3gsYmVnaW4sYmlhcyxieSxjYWxjTW9kZSxjYXAtaGVpZ2h0LGNsYXNzLGNsaXAsY2xpcFBhdGhVbml0cyxjbGlwLXBhdGgsY2xpcC1ydWxlLGNvbG9yLGNvbG9yLWludGVycG9sYXRpb24sY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzLGNvbG9yLXByb2ZpbGUsY29sb3ItcmVuZGVyaW5nLGNvbnRlbnRTY3JpcHRUeXBlLGNvbnRlbnRTdHlsZVR5cGUsY3Jvc3NvcmlnaW4sY3Vyc29yLGN4LGN5LGQsZGVjZWxlcmF0ZSxkZXNjZW50LGRpZmZ1c2VDb25zdGFudCxkaXJlY3Rpb24sZGlzcGxheSxkaXZpc29yLGRvbWluYW50LWJhc2VsaW5lLGR1cixkeCxkeSxlZGdlTW9kZSxlbGV2YXRpb24sZW5hYmxlLWJhY2tncm91bmQsZW5kLGV4cG9uZW50LGZpbGwsZmlsbC1vcGFjaXR5LGZpbGwtcnVsZSxmaWx0ZXIsZmlsdGVyUmVzLGZpbHRlclVuaXRzLGZsb29kLWNvbG9yLGZsb29kLW9wYWNpdHksZm9udC1mYW1pbHksZm9udC1zaXplLGZvbnQtc2l6ZS1hZGp1c3QsZm9udC1zdHJldGNoLGZvbnQtc3R5bGUsZm9udC12YXJpYW50LGZvbnQtd2VpZ2h0LGZvcm1hdCxmcm9tLGZyLGZ4LGZ5LGcxLGcyLGdseXBoLW5hbWUsZ2x5cGgtb3JpZW50YXRpb24taG9yaXpvbnRhbCxnbHlwaC1vcmllbnRhdGlvbi12ZXJ0aWNhbCxnbHlwaFJlZixncmFkaWVudFRyYW5zZm9ybSxncmFkaWVudFVuaXRzLGhhbmdpbmcsaGVpZ2h0LGhyZWYsaHJlZmxhbmcsaG9yaXotYWR2LXgsaG9yaXotb3JpZ2luLXgsaWQsaWRlb2dyYXBoaWMsaW1hZ2UtcmVuZGVyaW5nLGluLGluMixpbnRlcmNlcHQsayxrMSxrMixrMyxrNCxrZXJuZWxNYXRyaXgsa2VybmVsVW5pdExlbmd0aCxrZXJuaW5nLGtleVBvaW50cyxrZXlTcGxpbmVzLGtleVRpbWVzLGxhbmcsbGVuZ3RoQWRqdXN0LGxldHRlci1zcGFjaW5nLGxpZ2h0aW5nLWNvbG9yLGxpbWl0aW5nQ29uZUFuZ2xlLGxvY2FsLG1hcmtlci1lbmQsbWFya2VyLW1pZCxtYXJrZXItc3RhcnQsbWFya2VySGVpZ2h0LG1hcmtlclVuaXRzLG1hcmtlcldpZHRoLG1hc2ssbWFza0NvbnRlbnRVbml0cyxtYXNrVW5pdHMsbWF0aGVtYXRpY2FsLG1heCxtZWRpYSxtZXRob2QsbWluLG1vZGUsbmFtZSxudW1PY3RhdmVzLG9mZnNldCxvcGFjaXR5LG9wZXJhdG9yLG9yZGVyLG9yaWVudCxvcmllbnRhdGlvbixvcmlnaW4sb3ZlcmZsb3csb3ZlcmxpbmUtcG9zaXRpb24sb3ZlcmxpbmUtdGhpY2tuZXNzLHBhbm9zZS0xLHBhaW50LW9yZGVyLHBhdGgscGF0aExlbmd0aCxwYXR0ZXJuQ29udGVudFVuaXRzLHBhdHRlcm5UcmFuc2Zvcm0scGF0dGVyblVuaXRzLHBpbmcscG9pbnRlci1ldmVudHMscG9pbnRzLHBvaW50c0F0WCxwb2ludHNBdFkscG9pbnRzQXRaLHByZXNlcnZlQWxwaGEscHJlc2VydmVBc3BlY3RSYXRpbyxwcmltaXRpdmVVbml0cyxyLHJhZGl1cyxyZWZlcnJlclBvbGljeSxyZWZYLHJlZlkscmVsLHJlbmRlcmluZy1pbnRlbnQscmVwZWF0Q291bnQscmVwZWF0RHVyLHJlcXVpcmVkRXh0ZW5zaW9ucyxyZXF1aXJlZEZlYXR1cmVzLHJlc3RhcnQscmVzdWx0LHJvdGF0ZSxyeCxyeSxzY2FsZSxzZWVkLHNoYXBlLXJlbmRlcmluZyxzbG9wZSxzcGFjaW5nLHNwZWN1bGFyQ29uc3RhbnQsc3BlY3VsYXJFeHBvbmVudCxzcGVlZCxzcHJlYWRNZXRob2Qsc3RhcnRPZmZzZXQsc3RkRGV2aWF0aW9uLHN0ZW1oLHN0ZW12LHN0aXRjaFRpbGVzLHN0b3AtY29sb3Isc3RvcC1vcGFjaXR5LHN0cmlrZXRocm91Z2gtcG9zaXRpb24sc3RyaWtldGhyb3VnaC10aGlja25lc3Msc3RyaW5nLHN0cm9rZSxzdHJva2UtZGFzaGFycmF5LHN0cm9rZS1kYXNob2Zmc2V0LHN0cm9rZS1saW5lY2FwLHN0cm9rZS1saW5lam9pbixzdHJva2UtbWl0ZXJsaW1pdCxzdHJva2Utb3BhY2l0eSxzdHJva2Utd2lkdGgsc3R5bGUsc3VyZmFjZVNjYWxlLHN5c3RlbUxhbmd1YWdlLHRhYmluZGV4LHRhYmxlVmFsdWVzLHRhcmdldCx0YXJnZXRYLHRhcmdldFksdGV4dC1hbmNob3IsdGV4dC1kZWNvcmF0aW9uLHRleHQtcmVuZGVyaW5nLHRleHRMZW5ndGgsdG8sdHJhbnNmb3JtLHRyYW5zZm9ybS1vcmlnaW4sdHlwZSx1MSx1Mix1bmRlcmxpbmUtcG9zaXRpb24sdW5kZXJsaW5lLXRoaWNrbmVzcyx1bmljb2RlLHVuaWNvZGUtYmlkaSx1bmljb2RlLXJhbmdlLHVuaXRzLXBlci1lbSx2LWFscGhhYmV0aWMsdi1oYW5naW5nLHYtaWRlb2dyYXBoaWMsdi1tYXRoZW1hdGljYWwsdmFsdWVzLHZlY3Rvci1lZmZlY3QsdmVyc2lvbix2ZXJ0LWFkdi15LHZlcnQtb3JpZ2luLXgsdmVydC1vcmlnaW4teSx2aWV3Qm94LHZpZXdUYXJnZXQsdmlzaWJpbGl0eSx3aWR0aCx3aWR0aHMsd29yZC1zcGFjaW5nLHdyaXRpbmctbW9kZSx4LHgtaGVpZ2h0LHgxLHgyLHhDaGFubmVsU2VsZWN0b3IseGxpbms6YWN0dWF0ZSx4bGluazphcmNyb2xlLHhsaW5rOmhyZWYseGxpbms6cm9sZSx4bGluazpzaG93LHhsaW5rOnRpdGxlLHhsaW5rOnR5cGUseG1sbnM6eGxpbmsseG1sOmJhc2UseG1sOmxhbmcseG1sOnNwYWNlLHkseTEseTIseUNoYW5uZWxTZWxlY3Rvcix6LHpvb21BbmRQYW5gXG4pO1xuZnVuY3Rpb24gaXNSZW5kZXJhYmxlQXR0clZhbHVlKHZhbHVlKSB7XG4gIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gIHJldHVybi
20578B0eXBlID09PSBcInN0cmluZ1wiIHx8IHR5cGUgPT09IFwibnVtYmVyXCIgfHwgdHlwZSA9PT0gXCJib29sZWFuXCI7XG59XG5cbmNvbnN0IGVzY2FwZVJFID0gL1tcIicmPD5dLztcbmZ1bmN0aW9uIGVzY2FwZUh0bWwoc3RyaW5nKSB7XG4gIGNvbnN0IHN0ciA9IFwiXCIgKyBzdHJpbmc7XG4gIGNvbnN0IG1hdGNoID0gZXNjYXBlUkUuZXhlYyhzdHIpO1xuICBpZiAoIW1hdGNoKSB7XG4gICAgcmV0dXJuIHN0cjtcbiAgfVxuICBsZXQgaHRtbCA9IFwiXCI7XG4gIGxldCBlc2NhcGVkO1xuICBsZXQgaW5kZXg7XG4gIGxldCBsYXN0SW5kZXggPSAwO1xuICBmb3IgKGluZGV4ID0gbWF0Y2guaW5kZXg7IGluZGV4IDwgc3RyLmxlbmd0aDsgaW5kZXgrKykge1xuICAgIHN3aXRjaCAoc3RyLmNoYXJDb2RlQXQoaW5kZXgpKSB7XG4gICAgICBjYXNlIDM0OlxuICAgICAgICBlc2NhcGVkID0gXCImcXVvdDtcIjtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDM4OlxuICAgICAgICBlc2NhcGVkID0gXCImYW1wO1wiO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMzk6XG4gICAgICAgIGVzY2FwZWQgPSBcIiYjMzk7XCI7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSA2MDpcbiAgICAgICAgZXNjYXBlZCA9IFwiJmx0O1wiO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNjI6XG4gICAgICAgIGVzY2FwZWQgPSBcIiZndDtcIjtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGxhc3RJbmRleCAhPT0gaW5kZXgpIHtcbiAgICAgIGh0bWwgKz0gc3RyLnNsaWNlKGxhc3RJbmRleCwgaW5kZXgpO1xuICAgIH1cbiAgICBsYXN0SW5kZXggPSBpbmRleCArIDE7XG4gICAgaHRtbCArPSBlc2NhcGVkO1xuICB9XG4gIHJldHVybiBsYXN0SW5kZXggIT09IGluZGV4ID8gaHRtbCArIHN0ci5zbGljZShsYXN0SW5kZXgsIGluZGV4KSA6IGh0bWw7XG59XG5jb25zdCBjb21tZW50U3RyaXBSRSA9IC9eLT8+fDwhLS18LS0+fC0tIT58PCEtJC9nO1xuZnVuY3Rpb24gZXNjYXBlSHRtbENvbW1lbnQoc3JjKSB7XG4gIHJldHVybiBzcmMucmVwbGFjZShjb21tZW50U3RyaXBSRSwgXCJcIik7XG59XG5cbmZ1bmN0aW9uIGxvb3NlQ29tcGFyZUFycmF5cyhhLCBiKSB7XG4gIGlmIChhLmxlbmd0aCAhPT0gYi5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgbGV0IGVxdWFsID0gdHJ1ZTtcbiAgZm9yIChsZXQgaSA9IDA7IGVxdWFsICYmIGkgPCBhLmxlbmd0aDsgaSsrKSB7XG4gICAgZXF1YWwgPSBsb29zZUVxdWFsKGFbaV0sIGJbaV0pO1xuICB9XG4gIHJldHVybiBlcXVhbDtcbn1cbmZ1bmN0aW9uIGxvb3NlRXF1YWwoYSwgYikge1xuICBpZiAoYSA9PT0gYikgcmV0dXJuIHRydWU7XG4gIGxldCBhVmFsaWRUeXBlID0gaXNEYXRlKGEpO1xuICBsZXQgYlZhbGlkVHlwZSA9IGlzRGF0ZShiKTtcbiAgaWYgKGFWYWxpZFR5cGUgfHwgYlZhbGlkVHlwZSkge1xuICAgIHJldHVybiBhVmFsaWRUeXBlICYmIGJWYWxpZFR5cGUgPyBhLmdldFRpbWUoKSA9PT0gYi5nZXRUaW1lKCkgOiBmYWxzZTtcbiAgfVxuICBhVmFsaWRUeXBlID0gaXNTeW1ib2woYSk7XG4gIGJWYWxpZFR5cGUgPSBpc1N5bWJvbChiKTtcbiAgaWYgKGFWYWxpZFR5cGUgfHwgYlZhbGlkVHlwZSkge1xuICAgIHJldHVybiBhID09PSBiO1xuICB9XG4gIGFWYWxpZFR5cGUgPSBpc0FycmF5KGEpO1xuICBiVmFsaWRUeXBlID0gaXNBcnJheShiKTtcbiAgaWYgKGFWYWxpZFR5cGUgfHwgYlZhbGlkVHlwZSkge1xuICAgIHJldHVybiBhVmFsaWRUeXBlICYmIGJWYWxpZFR5cGUgPyBsb29zZUNvbXBhcmVBcnJheXMoYSwgYikgOiBmYWxzZTtcbiAgfVxuICBhVmFsaWRUeXBlID0gaXNPYmplY3QoYSk7XG4gIGJWYWxpZFR5cGUgPSBpc09iamVjdChiKTtcbiAgaWYgKGFWYWxpZFR5cGUgfHwgYlZhbGlkVHlwZSkge1xuICAgIGlmICghYVZhbGlkVHlwZSB8fCAhYlZhbGlkVHlwZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBhS2V5c0NvdW50ID0gT2JqZWN0LmtleXMoYSkubGVuZ3RoO1xuICAgIGNvbnN0IGJLZXlzQ291bnQgPSBPYmplY3Qua2V5cyhiKS5sZW5ndGg7XG4gICAgaWYgKGFLZXlzQ291bnQgIT09IGJLZXlzQ291bnQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBrZXkgaW4gYSkge1xuICAgICAgY29uc3QgYUhhc0tleSA9IGEuaGFzT3duUHJvcGVydHkoa2V5KTtcbiAgICAgIGNvbnN0IGJIYXNLZXkgPSBiLmhhc093blByb3BlcnR5KGtleSk7XG4gICAgICBpZiAoYUhhc0tleSAmJiAhYkhhc0tleSB8fCAhYUhhc0tleSAmJiBiSGFzS2V5IHx8ICFsb29zZUVxdWFsKGFba2V5XSwgYltrZXldKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBTdHJpbmcoYSkgPT09IFN0cmluZyhiKTtcbn1cbmZ1bmN0aW9uIGxvb3NlSW5kZXhPZihhcnIsIHZhbCkge1xuICByZXR1cm4gYXJyLmZpbmRJbmRleCgoaXRlbSkgPT4gbG9vc2VFcXVhbChpdGVtLCB2YWwpKTtcbn1cblxuY29uc3QgaXNSZWYgPSAodmFsKSA9PiB7XG4gIHJldHVybiAhISh2YWwgJiYgdmFsLl9fdl9pc1JlZiA9PT0gdHJ1ZSk7XG59O1xuY29uc3QgdG9EaXNwbGF5U3RyaW5nID0gKHZhbCkgPT4ge1xuICByZXR1cm4gaXNTdHJpbmcodmFsKSA/IHZhbCA6IHZhbCA9PSBudWxsID8gXCJcIiA6IGlzQXJyYXkodmFsKSB8fCBpc09iamVjdCh2YWwpICYmICh2YWwudG9TdHJpbmcgPT09IG9iamVjdFRvU3RyaW5nIHx8ICFpc0Z1bmN0aW9uKHZhbC50b1N0cmluZykpID8gaXNSZWYodmFsKSA/IHRvRGlzcGxheVN0cmluZyh2YWwudmFsdWUpIDogSlNPTi5zdHJpbmdpZnkodmFsLCByZXBsYWNlciwgMikgOiBTdHJpbmcodmFsKTtcbn07XG5jb25zdCByZXBsYWNlciA9IChfa2V5LCB2YWwpID0+IHtcbiAgaWYgKGlzUmVmKHZhbCkpIHtcbiAgICByZXR1cm4gcmVwbGFjZXIoX2tleSwgdmFsLnZhbHVlKTtcbiAgfSBlbHNlIGlmIChpc01hcCh2YWwpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIFtgTWFwKCR7dmFsLnNpemV9KWBdOiBbLi4udmFsLmVud
20578HJpZXMoKV0ucmVkdWNlKFxuICAgICAgICAoZW50cmllcywgW2tleSwgdmFsMl0sIGkpID0+IHtcbiAgICAgICAgICBlbnRyaWVzW3N0cmluZ2lmeVN5bWJvbChrZXksIGkpICsgXCIgPT5cIl0gPSB2YWwyO1xuICAgICAgICAgIHJldHVybiBlbnRyaWVzO1xuICAgICAgICB9LFxuICAgICAgICB7fVxuICAgICAgKVxuICAgIH07XG4gIH0gZWxzZSBpZiAoaXNTZXQodmFsKSkge1xuICAgIHJldHVybiB7XG4gICAgICBbYFNldCgke3ZhbC5zaXplfSlgXTogWy4uLnZhbC52YWx1ZXMoKV0ubWFwKCh2KSA9PiBzdHJpbmdpZnlTeW1ib2wodikpXG4gICAgfTtcbiAgfSBlbHNlIGlmIChpc1N5bWJvbCh2YWwpKSB7XG4gICAgcmV0dXJuIHN0cmluZ2lmeVN5bWJvbCh2YWwpO1xuICB9IGVsc2UgaWYgKGlzT2JqZWN0KHZhbCkgJiYgIWlzQXJyYXkodmFsKSAmJiAhaXNQbGFpbk9iamVjdCh2YWwpKSB7XG4gICAgcmV0dXJuIFN0cmluZyh2YWwpO1xuICB9XG4gIHJldHVybiB2YWw7XG59O1xuY29uc3Qgc3RyaW5naWZ5U3ltYm9sID0gKHYsIGkgPSBcIlwiKSA9PiB7XG4gIHZhciBfYTtcbiAgcmV0dXJuIChcbiAgICAvLyBTeW1ib2wuZGVzY3JpcHRpb24gaW4gZXMyMDE5KyBzbyB3ZSBuZWVkIHRvIGNhc3QgaGVyZSB0byBwYXNzXG4gICAgLy8gdGhlIGxpYjogZXMyMDE2IGNoZWNrXG4gICAgaXNTeW1ib2wodikgPyBgU3ltYm9sKCR7KF9hID0gdi5kZXNjcmlwdGlvbikgIT0gbnVsbCA/IF9hIDogaX0pYCA6IHZcbiAgKTtcbn07XG5cbmV4cG9ydCB7IEVNUFRZX0FSUiwgRU1QVFlfT0JKLCBOTywgTk9PUCwgUGF0Y2hGbGFnTmFtZXMsIFBhdGNoRmxhZ3MsIFNoYXBlRmxhZ3MsIFNsb3RGbGFncywgY2FtZWxpemUsIGNhcGl0YWxpemUsIGRlZiwgZXNjYXBlSHRtbCwgZXNjYXBlSHRtbENvbW1lbnQsIGV4dGVuZCwgZ2VuUHJvcHNBY2Nlc3NFeHAsIGdlbmVyYXRlQ29kZUZyYW1lLCBnZXRHbG9iYWxUaGlzLCBoYXNDaGFuZ2VkLCBoYXNPd24sIGh5cGhlbmF0ZSwgaW5jbHVkZUJvb2xlYW5BdHRyLCBpbnZva2VBcnJheUZucywgaXNBcnJheSwgaXNCb29sZWFuQXR0ciwgaXNCdWlsdEluRGlyZWN0aXZlLCBpc0RhdGUsIGlzRnVuY3Rpb24sIGlzR2xvYmFsbHlBbGxvd2VkLCBpc0dsb2JhbGx5V2hpdGVsaXN0ZWQsIGlzSFRNTFRhZywgaXNJbnRlZ2VyS2V5LCBpc0tub3duSHRtbEF0dHIsIGlzS25vd25TdmdBdHRyLCBpc01hcCwgaXNNYXRoTUxUYWcsIGlzTW9kZWxMaXN0ZW5lciwgaXNPYmplY3QsIGlzT24sIGlzUGxhaW5PYmplY3QsIGlzUHJvbWlzZSwgaXNSZWdFeHAsIGlzUmVuZGVyYWJsZUF0dHJWYWx1ZSwgaXNSZXNlcnZlZFByb3AsIGlzU1NSU2FmZUF0dHJOYW1lLCBpc1NWR1RhZywgaXNTZXQsIGlzU3BlY2lhbEJvb2xlYW5BdHRyLCBpc1N0cmluZywgaXNTeW1ib2wsIGlzVm9pZFRhZywgbG9vc2VFcXVhbCwgbG9vc2VJbmRleE9mLCBsb29zZVRvTnVtYmVyLCBtYWtlTWFwLCBub3JtYWxpemVDbGFzcywgbm9ybWFsaXplUHJvcHMsIG5vcm1hbGl6ZVN0eWxlLCBvYmplY3RUb1N0cmluZywgcGFyc2VTdHJpbmdTdHlsZSwgcHJvcHNUb0F0dHJNYXAsIHJlbW92ZSwgc2xvdEZsYWdzVGV4dCwgc3RyaW5naWZ5U3R5bGUsIHRvRGlzcGxheVN0cmluZywgdG9IYW5kbGVyS2V5LCB0b051bWJlciwgdG9SYXdUeXBlLCB0b1R5cGVTdHJpbmcgfTtcbiIsIi8qKlxuICog55S75YOP44Gu6YGF5bu26Kqt44G/6L6844G/XG4gKiBodHRwczovL25vdGVzLnNoYXJlc2wubmV0L2FydGljbGVzLzEyNzEvXG4gKlxuICogPGltZyBzcmM9XCJkdW1teS5wbmdcIiBkYXRhLXNyYz1cImhvZ2UuanBnXCIgY2xhc3M9XCJqcy1sYXp5XCI+XG4gKiBkYXRhLXNyYyDlsZ7mgKfjgavpgYXlu7boqq3jgb/ovrzjgb/jgZXjgZvjgZ/jgYTnlLvlg4/jgpLmjIflrprjgZnjgovjgIJcbiAqXG4gKiBkYXRhLXNyYyA6IHNyY+OBq+OCu+ODg+ODiOOBleOCjOOCi1xuICogZGF0YS1zcmNzZXQgOiBzcmNzZXTjgavjgrvjg4Pjg4jjgZXjgozjgotcbiAqIGRhdGEtYmcgOiBiYWNrZ3JvdW5kSW1hZ2Xjgavjgrvjg4Pjg4jjgZXjgozjgotcblxuICovXG5cbi8qIGVzbGludCBuby11bnVzZWQtdmFyczpvZmYgKi9cbi8qIGVzbGludCBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnM6b2ZmICovXG5cbmltcG9ydCBsYXp5U2l6ZXMgZnJvbSAnbGF6eXNpemVzJztcbmltcG9ydCB1bnZlaWxob29rcyBmcm9tICdsYXp5c2l6ZXMvcGx1Z2lucy91bnZlaWxob29rcy9scy51bnZlaWxob29rcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uICgpIHtcbiAgbGF6eVNpemVzLmNmZy5sYXp5Q2xhc3MgPSAnanMtbGF6eSc7XG59XG4iLCIvKipcbiAqIOODmuODvOOCuOiqreOBv+i+vOOBv+ODl+ODreOCsOODrOOCueODkOODvFxuICovXG5cbi8qIGVzbGludCBuby11bnVzZWQtdmFyczpvZmYgKi9cbi8qIGVzbGludCBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnM6b2ZmICovXG5cbmltcG9ydCBwcmVsb2FkZXIgZnJvbSAncHJlbG9hZGVyJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKGFkZF91cmxzID0gW10pIHtcbiAgLy8g44OX44Ot44Kw44Os44K544OQ44O844Ko44Os44Oh44Oz44OIXG4gIGNvbnN0ICRwcm9ncmVzc19iYXIgPSAkKCcuanMtbG9hZGluZy1wcm9ncmVzcycpO1xuICAvLyDjg5fjg6rjg63jg7zjg4Djg7xcbiAgY29uc3QgbG9hZGVyID0gcHJlbG9hZGVyKHsgeGhySW1hZ2VzOiBmYWxzZSB9KTtcblxuICAvLyB1cmzjg6rjgrnjg4jkvZzmiJBcbiAgY29uc3QgaW1hZ2VfdXJscyA9IGdldF9pbWFnZV9saXN0KCk7XG4gIGNvbnN0IHVybHMgPSBPYmplY3QuYXNzaWduKGltYWdlX3VybHMsIGFkZF91cmxzKTtcblxuICAvLyBQcm9taXNl44KS6L+U44GZXG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgLy8g44OX44Oq44Ot44O844OA44O844Gr55m76YyyXG4gICAgdXJscy5mb3JFYWNoKCh1cmwpID0+IHtcbiAgICAgIGxvYWRlci5hZGQodXJsKTtcbiAgICB9KTtcblxuICAgIC8vIOiqreOBv+i+vOOBv+S4re+8muODkOODvOOCqOODrOODoeODs+ODiOOBruW5heiqv+aVtFxuICAgIGxvYWRlci5vbigncHJvZ3Jlc3MnLCAocGVyY2VudCwgdXJsKSA9PiB7XG4gICAgICAkcHJvZ3Jlc3NfYmFyLmNzcyh7IHdpZHRoOiBgJHtwZXJjZW50ICogMTAwfSVgIH0
20578pO1xuICAgIH0pO1xuXG4gICAgLy8g6Kqt44G/6L6844G/5a6M5LqGXG4gICAgLy8g6Kqt44G/6L6844G/5a6M5LqG6YCa55+l44CB44OX44Ot44Kw44Os44K544Ko44Os44Oh44Oz44OI44KS5bmFMTAwJeOBq+OBmeOCi1xuICAgIGxvYWRlci5vbignY29tcGxldGUnLCAoKSA9PiB7XG4gICAgICAkcHJvZ3Jlc3NfYmFyLmNzcyh7IHdpZHRoOiAnMTAwJScgfSk7XG4gICAgICAkKHdpbmRvdykudHJpZ2dlcigncGFnZV9sb2FkX2NvbXBsZXRlJyk7XG4gICAgICByZXNvbHZlKCk7XG4gICAgfSk7XG5cbiAgICAvLyDoqq3jgb/ovrzjgb/plovlp4tcbiAgICBsb2FkZXIubG9hZCgpO1xuICB9KTtcbn1cblxuLyoqXG4gKiA8aW1nPiDjgpLjg4Hjgqfjg4Pjgq/jgZnjgotcbiAqIEByZXR1cm4gdXJscyB7QXJyYXl9IFVSTOOBrumFjeWIl1xuICovXG5mdW5jdGlvbiBnZXRfaW1hZ2VfbGlzdCgpIHtcbiAgY29uc3QgaG9zdG5hbWUgPSAvXmh0dHBzPzpcXC9cXC9bXi9dK1xcLy8uZXhlYyh3aW5kb3cubG9jYXRpb24uaHJlZilbMF07XG4gIGNvbnN0IGltYWdlcyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdpbWcnKTtcbiAgY29uc3QgdXJscyA9IFtdO1xuXG4gIC8vIDxpbWc+44K/44Kw44KS5YWo44Gm44OB44Kn44OD44KvXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgaW1hZ2VzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgY29uc3Qgc3JjID0gaW1hZ2VzW2ldLnNyYztcbiAgICAvLyDpgZXjgYbjg5vjgrnjg4jjga7jgoLjga7jga/lvL7jgY9cbiAgICBpZiAoc3JjLmluZGV4T2YoaG9zdG5hbWUpID09PSAwKSB7XG4gICAgICB1cmxzLnB1c2goc3JjKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHVybHM7XG59XG4iLCIvKipcbiAqIOODmuODvOOCuOiqreOBv+i+vOOBv+OBjOe1guOCj+OBo+OBn+W+jOOBruWHpueQhlxuICovXG5cbi8vIOOCueOCr+ODreODvOODq+aknOefpeihqOekulxuaW1wb3J0IGludmlldyBmcm9tICcuL3Njcm9sbC1pbnZldyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uICgpIHtcbiAgY29uc3QgZGVsYXkgPSA2MDA7XG4gIHNldFRpbWVvdXQoZmFkZWluLCAyMDAgKyBkZWxheSk7XG4gIHNldFRpbWVvdXQocmVtb3ZlX2ZhZGVpbiwgMTIwMCArIGRlbGF5KTtcbiAgc2V0VGltZW91dChpbnZpZXcsIDEyMDAgKyBkZWxheSk7XG59XG5cbi8qKlxuICog44OV44Kn44O844OJ44Kk44Oz44GV44Gb44KLXG4gKi9cbmZ1bmN0aW9uIGZ
20578hZGVpbigpIHtcbiAgJCgnLmpzLWxvYWRpbmcnKS5hdHRyKCdkYXRhLWxvYWRpbmctZmluaXNoJywgJ3RydWUnKTtcbiAgLy8g44OV44Kn44O844OJ44Kk44Oz44Kk44OZ44Oz44OI44Gu6YCa55+lXG4gICQod2luZG93KS50cmlnZ2VyKCdwYWdlX2ZhZGVpbicpO1xufVxuXG4vKipcbiAqIOODleOCp+ODvOODieOCpOODs+OCqOODrOODoeODs+ODiOOCkuWJiumZpFxuICovXG5mdW5jdGlvbiByZW1vdmVfZmFkZWluKCkge1xuICAkKCcuanMtbG9hZGluZycpLnJlbW92ZSgpO1xufVxuIiwiLyoqXG4gKiBmYW5jeWJveDUg44KS5L2/44Gj44Gf44Od44OD44OX44Ki44OD44OXXG4gKiDjgqrjg5fjgrfjg6fjg7Pjga4gdHBsIOOBr+eUu+WDj+OBp+OBr+eEoeWKueOBq+OBquOCi1xuICovXG5cbmltcG9ydCBsYXp5bG9hZCBmcm9tICcuL2xhenlsb2FkJztcbmltcG9ydCB7IEZhbmN5Ym94IH0gZnJvbSAnQGZhbmN5YXBwcy91aSc7XG5cbmNvbnN0IGNsb3NlQnV0dG9uID1cbiAgJzxidXR0b24gZGF0YS1mYW5jeWJveC1jbG9zZSBjbGFzcz1cImYtYnV0dG9uIGlzLWNsb3NlLWJ0blwiIHRpdGxlPVwie3tDTE9TRX19XCI+PGkgY2xhc3M9XCJpLWFycm93cy10aW1lcy0xXCI+PC9pPjwvYnV0dG9uPic7XG5cbmV4cG9ydCBjb25zdCBOT1JNQUxfU0VUVElOR1MgPSB7XG4gIG1haW5DbGFzczogJycsXG4gIGRyYWdUb0Nsb3NlOiBmYWxzZSxcbiAgdHBsOiB7IGNsb3NlQnV0dG9uIH0sXG59O1xuXG5leHBvcnQgY29uc3QgQUpBWF9TRVRUSU5HUyA9IHtcbiAgdHlwZTogJ2FqYXgnLFxuICBkcmFnVG9DbG9zZTogZmFsc2UsXG4gIG1haW5DbGFzczogJycsXG4gIHRvb2xiYXI6IHRydWUsXG4gIHRwbDogeyBjbG9zZUJ1dHRvbiB9LFxuICBvbjoge1xuICAgIHJldmVhbDogKCkgPT4ge1xuICAgICAgbGF6eWxvYWQoKTtcbiAgICB9LFxuICB9LFxufTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKCkge1xuICBGYW5jeWJveC5iaW5kKCdbZGF0YS1mYW5jeWJveF0nLCBOT1JNQUxfU0VUVElOR1MpO1xuICBGYW5jeWJveC5iaW5kKCdbZGF0YS1mYW5jeWJveC1hamF4XScsIEFKQVhfU0VUVElOR1MpO1xufVxuIiwiLyoqXG4gKiDjg6bjg7zjgrbjg7zjgqjjg7zjgrjjgqfjg7Pjg4jnorroqo1cbiAqIE9T44KS6KaL44Gm44K544Oe44Ob57O744Gg44Go5Yik5a6a44GX44Gf44KJIDxib2R5IGRhdGEtaXMtbW9iaWxlPVwidHJ1ZVwiPiDjgpLoqK3lrprjgZnjgotcbiAqIFBD44Gg44Go5Yik5a6a44GX44Gf44KJIDxib2R5IGRhdGEtaXMtbW9iaWxlPVwiZmFsc2VcIj4g44KS6Kit5a6aXG4gKi9cblxuaW1wb3J0IGlzVG91Y2hEZXZpY2UgZnJvbSAnaXMtdG91Y2gtZGV2aWNlJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKCkge1xuICBpZiAoaXNUb3VjaERldmljZSgpKSB7XG4gICAgZG9jdW1lbnQuYm9keS5zZXRBdHRyaWJ1dGUoJ2RhdGEtaXMtbW9iaWxlJywgJ3RydWUnKTtcbiAgfSBlbHNlIHtcbiAgICBkb2N1bWVudC5ib2R5LnNldEF0dHJpYnV0ZSgnZGF0YS1pcy1tb2JpbGUnLCAnZmFsc2UnKTtcbiAgfVxufVxuIiwiLy8g5YWo44Oa44O844K45YWx6YCa5Yem55CGXG5cbi8qIGVzbGludCBuby11bnVzZWQtdmFyczpvZmYgKi9cbi8qIGVzbGludCBuby1jb25zb2xlOm9mZiAqL1xuXG4vLyDnlLvlg4/jga7pgYXlu7boqq3jgb/ovrzjgb9cbmltcG9ydCBsYXp5bG9hZCBmcm9tICcuL2xhenlsb2FkJztcbi8vIOODoeODh+OCo+OCouOCr+OCqOODquODvOeuoeeQhlxuaW1wb3J0IG1lZGlhcXVlcnkgZnJvbSAnLi9tZWRpYXF1ZXJ5Jztcbi8vIOODpuODvOOCtuODvOOCqOODvOOCuOOCp+ODs+ODiOWIpOWumlxuaW1wb3J0IGNoZWNrX3VhIGZyb20gJy4vY2hlY2stdWEnO1xuLy8g44Oa44O844K45YaF44K544Kv44Ot44O844OrXG5pbXBvcnQgcGFnZXNjcm9sbCBmcm9tICcuL3BhZ2VzY3JvbGwnO1xuLy8g55S76Z2i5L2N572u44Gr5b+c44GY44Gf44GmIGRhdGEg5bGe5oCn5aSJ5YyW44CC44Oa44O844K444OI44OD44OX5oi744KL44Oc44K/44Oz44Gq44GpXG5pbXBvcnQgc2Nyb2xsX2Ftb3VudCBmcm9tICcuL3Njcm9sbC1hbW91bnQnO1xuLy8g44K944O844K344Oj44Or44K344Kn44Ki44Oc44K/44OzXG5pbXBvcnQgc29jaWFsX3NoYXJlIGZyb20gJy4vc29jaWFsLXNoYXJlJztcbi8vIOODneODg+ODl+OCouODg+ODl1xuaW1wb3J0IHBvcHVwIGZyb20gJy4vcG9wdXAnO1xuLy8g44Kq44O844OH44Kj44Kq5YaN55Sf44Oc44K/44OzXG4vLyBpbXBvcnQgYXVkaW8gZnJvbSAnLi9hdWRpbyc7XG4vLyDjgr/jg5bjg6Hjg4vjg6Xjg7xcbmltcG9ydCB0YWJzIGZyb20gJy4vdGFicyc7XG4vLyDjg6HjgqTjg7Pjg6Hjg4vjg6Xjg7xcbmltcG9ydCBtZW51IGZyb20gJy4vbWVudSc7XG4vLyDjgrnjgq/jg63jg7zjg6vjgafjg6Hjg4vjg6Xjg7zjga7jgqLjgq/jg4bjgqPjg5bljJZcbmltcG9ydCBtZW51QWN0aXZlIGZyb20gJy4vbWVudUFjdGl2ZSc7XG4vLyDjg5rjg7zjgrjoqq3jgb/ovrzjgb9cbmltcG9ydCBsb2FkaW5nIGZyb20gJy4vbG9hZGluZyc7XG4vLyDjg5rjg7zjgrjoqq3jgb/ovrzjgb/lrozkuoZcbmltcG9ydCBsb2FkaW5nX2NvbXBsZXRlIGZyb20gJy4vbG9hZGluZ19jb21wbGV0ZSc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uICgpIHtcbiAgbGF6eWxvYWQoKTtcbiAgbWVkaWFxdWVyeSgpO1xuICBjaGVja191YSgpO1xuICBwYWdlc2Nyb2xsKCk7XG4gIHNjcm9sbF9hbW91bnQoKTtcbiAgc29jaWFsX3NoYXJlKCk7XG4gIG1lbnUoKTtcbiAgbWVudUFjdGl2ZSgpO1xuICBwb3B1cCgpO1xuICAvLyBhdWRpbygpO1xuICB0YWJzKCk7XG4gIGxvYWRpbmcoKS50aGVuKGxvYWRpbmdfY29tcGxldGUpO1xufVxuIiwiLyoqXG4gKiDjg6Hjg4fjgqPjgqLjgq/jgqjjg6rjg7zjgpLnrqHnkIZcbiAqL1xuXG5pbXBvcnQgTWVkaWFxdWVyeSBmcm9tICdAc3lnbmFzL21lZGlhcXVlcnknO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAoKSB7XG4gIE1lZGlhcXVlcnkuYWRkTWVkaWEoJ3BjJywgJ3NjcmVlbiBhbmQgKG1pbi13aWR0aDogODUxcHgpJyk7XG4gIE1lZGlhcXVlcnkuYWRkTWVkaWEoJ3RiJywgJ3NjcmVlbiBhbmQgKG1pbi13aWR0aDogNTUxcHgpIGFuZCAobWF4LXdpZHRoOiA4NTBweCknKTtcbiAgTWVkaWFxdWVyeS5hZGRNZWRpYSgndGItbG8nLCAnc2NyZWVuIChtYXgtd2lkdGg6IDg1MHB4KScpO1xuICBNZWRpYXF1ZXJ5LmFkZE1lZGlhKCdz
20578cC11cCcsICdzY3JlZW4gYW5kIChtaW4td2lkdGg6IDU1MXB4KScpO1xuICBNZWRpYXF1ZXJ5LmFkZE1lZGlhKCdzcCcsICdzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDU1MHB4KScpO1xufVxuIiwiLyoqXG4gKiDjg6HjgqTjg7Pjg6Hjg4vjg6Xjg7xcbiAqL1xuY29uc3QgZ2V0SGFtYnVyZ2VyID0gKCkgPT4ge1xuICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmpzLWhhbWJ1cmdlcicpIGFzIEhUTUxFbGVtZW50O1xufTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKCkge1xuICAvLyDjgq/jg6rjg4Pjgq/jgacgZGF0YS1oYW1idXJnZXItb3BlbiA9IFwidHJ1ZVwiIOOBq+OBmeOCi1xuICBjb25zdCAkaGFtYnVyZ2VyID0gJCgnLmpzLWhhbWJ1cmdlcicpO1xuXG4gIC8vIOODj+ODs+ODkOODvOOCrOODvOODnOOCv+ODs+OBruOCr+ODquODg+OCr+OBp+ODoeODi+ODpeODvOOBrumWi+mWiVxuICAkaGFtYnVyZ2VyLm9uKCdjbGljaycsIHRvZ2dsZV9tZW51KTtcblxuICAvLyDjg6Hjg4vjg6Xjg7zjga7jg5zjgr/jg7PjgpLmirzjgZfjgabjgoLplovplonjgZnjgotcbiAgJCgnLmMtbWFpbm1lbnUgYS5qcy1wYWdlc2Nyb2xsJykub24oJ2NsaWNrJywgdG9nZ2xlX21lbnUpO1xuXG4gIC8vIOOCteODluODoeODi+ODpeODvOmWi+mWiVxuICAkKCcuanMtaGFzLXN1Ym1lbnUnKS5vbignY2xpY2snLCB0b2dnbGVfc3VibWVudSk7XG59XG5cbi8qKlxuICog44Oh44OL44Ol44O844KS6ZaL6ZaJ44GZ44KLXG4gKiBAcGFyYW0ge0V2ZW50fSBldiDjgq/jg6rjg4Pjgq/jgqTjg5njg7Pjg4hcbiAqL1xuZnVuY3Rpb24gdG9nZ2xlX21lbnUoZXYpIHtcbiAgLy8g44OP44Oz44OQ44O844Ks44O844Oh44OL44Ol44O844Gu5YiH44KK5pu/44GIXG4gIGNvbnN0IGhhbWJ1cmdlciA9IGdldEhhbWJ1cmdlcigpO1xuICBjb25zdCBzdGF0ZSA9IGhhbWJ1cmdlcj8uZ2V0QXR0cmlidXRlKCdkYXRhLWhhbWJ1cmdlci1vcGVuJyk7XG4gIGNvbnN0IGlzX29wZW4gPSBzdGF0ZSA9PT0gJ3RydWUnID8gJ2ZhbHNlJyA6ICd0cnVlJztcbiAgaGFtYnVyZ2VyLnNldEF0dHJpYnV0ZSgnZGF0YS1oYW1idXJnZXItb3BlbicsIGlzX29wZW4pO1xuXG4gIC8vIOOCueODnuODm+eUqOODoeODi+ODpeODvOOBruOCqOODleOCp+OCr+ODiFxuICAkKCcuanMtc3BtZW51JykuYXR0cignZGF0YS1zcG1lbnUnLCBpc19vcGVuID09PSAndHJ1ZScgPyAnb3BlbicgOiAnY2xvc2UnKTtcblxuICBpZiAoZXYuY3VycmVudFRhcmdldCA9PT0gaGFtYnVyZ2VyKSB7XG4gICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgfVxufVxuXG4vKipcbiAqIOOCteODluODoeODi+ODpeODvOOBrumWi+mWiVxuICogQHBhcmFtIHtFdmVudH0gZXYg44Kv44Oq44OD44Kv44Kk44OZ44Oz44OIXG4gKi9cbmZ1bmN0aW9uIHRvZ2dsZV9zdWJtZW51KGV2KSB7XG4gIC8vIOODoeODi+ODpeODvOODnOOCv+ODs+OBqOOAgeWFhOW8n+imgee0oOOBruOCteODluODoeODi+ODpeODvFxuICBjb25zdCAkYnV0dG9uID0gJChldi5jdXJyZW50VGFyZ2V0KTtcbiAgY29uc3QgJHN1Ym1lbnUgPSAkYnV0dG9uLm5leHQoKTtcbiAgY29uc3QgaXNfb3BlbmVkID0gJGJ1dHRvbi5hdHRyKCdkYXRhLXN1Ym1lbnUtb3BlbmVkJykgPT09ICd0cnVlJztcblxuICBpZiAoaXNfb3BlbmVkKSB7XG4gICAgJGJ1dHRvbi5hdHRyKCdkYXRhLXN1Ym1lbnUtb3BlbmVkJywgJ2ZhbHNlJyk7XG4gICAgJHN1Ym1lbnUuYXR0cignZGF0YS1zdWJtZW51LW9wZW5lZCcsICdmYWxzZScpO1xuICB9IGVsc2Uge1xuICAgICRidXR0b24uYXR0cignZGF0YS1zdWJtZW51LW9wZW5lZCcsICd0cnVlJyk7XG4gICAgJHN1Ym1lbnUuYXR0cignZGF0YS1zdWJtZW51LW9wZW5lZCcsICd0cnVlJyk7XG4gIH1cbiAgZXYucHJldmVudERlZmF1bHQoKTtcbn1cbiIsIi8qKlxuICog44Oa44O844K444K544Kv44Ot44O844Or44Gn44Oh44Kk44Oz44Oh44OL44Ol44O844KS44Ki44Kv44OG44Kj44OW54q25oWL44Gr44GZ44KLXG5cbi5qcy1tZW51LWFjdGl2ZSDjgYzlr77osaHjgqjjg6rjgqLjgajjgarjgotcbuWvvuixoeOCqOODquOCouOBq+OBryBkYXRhLW1lbnUg5bGe5oCn44KS5oyH5a6a44GZ44KLXG7lkI3liY3jga8gYGNvbnN0IGl0ZW1zYCDjgajkuIDoh7TjgZXjgZvjgotcbjxkaXYgaWQ9XCJzdG9yeVwiIGNsYXNzPVwianMtbWVudS1hY3RpdmVcIiBkYXRhLW1lbnU9XCJzdG9yeVwiPiA8L2Rpdj5cblxuaWTlsZ7mgKfjgpLkvb/jgo/jgZogZGF0YS1tZW515bGe5oCn44KS5L2/44GG55CG55Sx44Gv44CBaWTlsZ7mgKfjgaDjgajku5bjga7nlKjpgJTjgajooqvjgovlj6/og73mgKfjgYzjgYLjgovjgZ/jgoHjgIJcbmRhdGEtbWVudeWxnuaAp+OBq+OBl+OBn+OBu+OBhuOBjOiHqueUseW6puOBjOS4iuOBjOOCi+OAglxuICovXG5cbi8vIOOCqOODquOCouODgeOCp+ODg+OCr+OBruWvvuixoUlEXG5jb25zdCBpdGVtcyA9IHtcbiAgbmV3czogZmFsc2UsXG4gIHN0b3J5OiBmYWxzZSxcbiAgc3RhZmY6IGZhbHNlLFxuICBjaGFyYWN0ZXI6IGZhbHNlLFxuICBib29rOiBmYWxzZSxcbn07XG5cbi8vIEludGVyc2VjdGlvbk9ic2VydmVyIOOCquODl+OCt+ODp+ODs1xuY29uc3Qgb3B0aW9uID0ge1xuICByb290TWFyZ2luOiAnLTQ4JSAwcHgnLFxuICB0aHJlc2hvbGQ6IDAsXG59O1xuXG5jb25zdCBjYWxsYmFjayA9IChlbnRyaWVzKSA9PiB7XG4gIGVudHJpZXMuZm9yRWFjaCgoZW50cnkpID0+IHtcbiAgICBjb25zdCBtZW51ID0gZW50cnkudGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS1tZW51Jyk7XG4gICAgY29uc3QgaXNBY3RpdmUgPSBlbnRyeS5pc0ludGVyc2VjdGluZztcblxuICAgIC8vIG9uIOOBq+OBquOBo+OBn+aZguOBr+WFqOOBpiBvZmYg44Gr44GX44Gm44GL44KJIG9uIOOBq+OBmeOCi1xuICAgIC8vIG9mZiDjgavjgarjgaPjgZ/mmYLjga/jgZ3jgozjgaDjgZEgb2ZmIOOBq+OBmeOCi1xuICAgIGlmIChpc0FjdGl2ZSkge1xuICAgICAgT2JqZWN0LmtleXMoaXRlbXMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICBpdGVtc1trZXldID0gZmFsc2U7XG4gICAgICB9KTtcbiAgICB9XG4gICAgaXRlbXNbbWVudV0gPSBpc0FjdGl2ZTtcbiAgfSk7XG5cbiAgLy8g44Oh44OL44Ol44O844Gr5Y+N5pig44GZ44KLXG4gIE9iamVjdC5rZXlzKGl0ZW1zKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICBjb25zdCBtZW51SXRlbSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYC5jLW1haW5tZW51X19saW5rLS0ke2tleX1gKTtcbiAgICBjb25zdCBpc0FjdGl2ZSA9IGl0ZW1zW2tleV07XG4gICAgbWVudUl0ZW0/LnNldEF0dHJpYnV0ZSgnZGF0YS1tZW51LWFjdGl2ZScsIGlzQWN0aXZlID8gJ3RydWUnIDogJ2ZhbHNlJyk7XG4gIH0pO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgKCkgPT4ge1xuICBjb25zdCBvYnNlcnZlciA9IG5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcihjYWxsYmFjaywgb3B0aW9uKTtcbiAgY29uc3QgY29udGVudHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuanMtbWVudS1hY3RpdmUnKTtcblxuICBjb250ZW50cy5mb3JFYWNoKChjb250ZW50KSA9PiB7XG4gICAgb2JzZXJ2ZXIub2JzZXJ2ZShjb250ZW50IGFzIEVsZW1lbnQpO1xuICB9KTtcbn07XG4iLCIvKipcbiAqIOODmuODvOOCuOWGheOCueOCr+ODreODvOODq1xuICogaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2Uvc21vb3RoLXNjcm9sbFxuICogPGEgaHJlZj1cIiN0YXJnZXRcIiBjbGFzcz1cImpzLXBhZ2VzY3JvbGxcIj5cbiAqXG4gKiDjgrnjgq/jg63jg7zjg6vjgpLnmbrnlJ/jgZXjgZv
20578jgovjgZPjgajjgoLlj6/og71cbiAqIHNjcm9sbC5hbmltYXRlU2Nyb2xsKFxuICogICB0YXJnZXRfeSxcbiAqICAgJycsXG4gKiAgIHtcbiAqICAgICAgIHNwZWVkOiAxNTAwLFxuICogICAgICAgZWFzaW5nOiAnZWFzZUluT3V0Q3ViaWMnXG4gKiAgIH1cbiAqICk7XG4gKlxuICog44Kt44Oj44Oz44K744Or44KC5Y+v6IO9XG4gKiBzY3JvbGwuY2FuY2VsU2Nyb2xsKCk7XG4gKlxuICovXG5cbi8qIGVzbGludCBuby11bnVzZWQtdmFyczpvZmYgKi9cbi8qIGVzbGludCBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnM6b2ZmICovXG5cbmltcG9ydCBTbW9vdGhTY3JvbGwgZnJvbSAnc21vb3RoLXNjcm9sbCc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uICgpIHtcbiAgLy8g5rGO55So44K544Kv44Ot44O844OrXG4gIGNvbnN0IGNsaWNrX3Njcm9sbCA9IG5ldyBTbW9vdGhTY3JvbGwoJ2EuanMtcGFnZXNjcm9sbCcsIHtcbiAgICBzcGVlZDogNTAwLFxuICAgIG9mZnNldDogMCxcbiAgICBlYXNpbmc6ICdlYXNlSW5PdXRDdWJpYycsXG4gIH0pO1xuXG4gIGNvbnN0IHNjcm9sbCA9IG5ldyBTbW9vdGhTY3JvbGwoKTtcblxuICAvLyDjg5rjg7zjgrjjg4jjg4Pjg5fjgavjgrnjgq/jg63jg7zjg6tcbiAgJCgnLmpzLXJldHVybi11cCcpLm9uKCdjbGljaycsIChldikgPT4ge1xuICAgIHNjcm9sbC5hbmltYXRlU2Nyb2xsKDAsIG51bGwsIHtcbiAgICAgIHNwZWVkOiA1MDAsXG4gICAgICBvZmZzZXQ6IDAsXG4gICAgICBlYXNpbmc6ICdlYXNlSW5PdXRDdWJpYycsXG4gICAgfSk7XG4gICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgfSk7XG59XG4iLCIvKipcbiAqIOeUu+mdouWGheOBruS9jee9ruOBq+W/nOOBmOOBpiBkYXRhLXNjcm9sbC1hbW91bnQg5bGe5oCn44KS5aSJ5YyW44GV44Gb44KLXG4gKiDjgIzjg5rjg7zjgrjjg4jjg4Pjg5fjgavmiLvjgovjg5zjgr/jg7PjgI3jga7ooajnpLrliIfjgormm7/jgYjjgarjgalcbiAqL1xuXG4vKiBlc2xpbnQgbm8tdW51c2VkLXZhcnM6b2ZmICovXG4vKiBlc2xpbnQgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzOm9mZiAqL1xuXG5pbXBvcnQgU2Nyb2xsQW1vdW50IGZyb20gJ0BzeWduYXMvc2Nyb2xsLWFtb3VudCc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uICgpIHtcbiAgY29uc3Qgc2Nyb2xsX2Ftb3VudCA9IG5ldyBTY3JvbGxBbW91bnQoJy5qcy1zY3JvbGwtYW1vdW50Jyk7XG59XG4iLCIvKipcbiAqIOOCueOCr+ODreODvOODqyBpbiBWaWV3XG4gKiDnlLvpnaLjgavlhaXjgovjgaggZGF0YS1pbnZpZXcg5bGe5oCn44GM44CMdHJ1ZeOAjeOBq+OBquOCi+OBruOBp+OAgVxuICogY3NzIOWBtOOBp+OCqOODleOCp+OCr+ODiOOCkuWItuW+oeOBmeOCi1xuICovXG5cbmltcG9ydCBJblZpZXcgZnJvbSAnQHN5Z25hcy9zY3JvbGwtaW52aWV3JztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKCkge1xuICBjb25zdCBpbnZpZXcgPSBuZXcgSW5WaWV3KCcuanMtaW52aWV3JywgeyByb290TWFyZ2luOiAnMHB4IDBweCAtMjAlIDBweCcgfSk7XG4gIGludmlldy5zdGFydCgpO1xufVxuIiwiLyoqXG4gKiDjgr3jg7zjgrfjg6Pjg6vjgrfjgqfjgqLjg5zjgr/jg7NcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9zeWduYXMvc3lnLWpwLXNvY2lhbC1zaGFyZVxuICovXG5cbmltcG9ydCBzb2NpYWxTaGFyZSBmcm9tICdAc3lnbmFzL2pwLXNvY2lhbC1zaGFyZSc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uICgpIHtcbiAgc29jaWFsU2hhcmUuc2V0U2hhcmVCdXR0b24oJy5qcy1zaGFyZS1idXR0b24nKTtcbn1cbiIsImltcG9ydCB7IGNyZWF0ZUFwcCB9IGZyb20gJ3Z1ZSc7XG5pbXBvcnQgeyBWdWVUYWJzLCBWdWVUYWJzQ29udGVudCwgdXNlVGFiQ29udHJvbCB9IGZyb20gJ0BzeWduYXMvdnVlLXRhYnMnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAoKSB7XG4gIGxldCB0YXJnZXQgPSAnI2FwcC10YWJzMSc7XG5cbiAgaWYgKCEkKHRhcmdldCkubGVuZ3RoKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgYXBwID0gY3JlYXRlQXBwKHtcbiAgICBjb21wb25lbnRzOiB7XG4gICAgICBWdWVUYWJzLFxuICAgICAgVnVlVGFic0NvbnRlbnQsXG4gICAgfSxcbiAgfSk7XG4gIGFwcC5tb3VudCh0YXJnZXQpO1xuXG4gIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuICB0YXJnZXQgPSAnI2FwcC10YWJzMic7XG5cbiAgY29uc3QgdGFiQ29udHJvbCA9IHVzZVRhYkNvbnRyb2woJ3RhYkdyb3VwMicpO1xuXG4gIGNvbnN0IGFwcDIgPSBjcmVhdGVBcHAoe1xuICAgIGNvbXBvbmVudHM6IHtcbiAgICAgIFZ1ZVRhYnMsXG4gICAgICBWdWVUYWJzQ29udGVudCxcbiAgICB9LFxuICAgIGNvbXB1dGVkOiB7XG4gICAgICBhY3RpdmVJZCgpIHtcbiAgICAgICAgcmV0dXJuIHRhYkNvbnRyb2wuYWN0aXZlSWQudmFsdWU7XG4gICAgICB9LFxuICAgIH0sXG4gICAgbWV0aG9kczoge1xuICAgICAgY2hhbmdlVGFiKCkge1xuICAgICAgICAvLyBjb25zb2xlLmxvZygnY2hhbmdlIGZyb20gb3V0c2lkZScpO1xuICAgICAgICB0YWJDb250cm9sLnNldEFjdGl2ZUlkKCd0YWJCJyk7XG4gICAgICB9LFxuICAgICAgcHJldlRhYigpIHtcbiAgICAgICAgdGFiQ29udHJvbC5jaGFuZ2VQcmV2VGFiKCk7XG4gICAgICB9LFxuICAgICAgbmV4dFRhYigpIHtcbiAgICAgICAgdGFiQ29udHJvbC5jaGFuZ2VOZXh0VGFiKCk7XG4gICAgICB9LFxuICAgIH0sXG4gICAgbW91bnRlZCgpIHtcbiAgICAgIC8vIGNvbnNvbGUubG9nKCdtb3VudGVkJyk7XG5cbiAgICAgIC8vIHRhYkNvbnRyb2wuYWRkQ2hhbmdlTGlzdGVuZXIoKGV2KSA9PiB7XG4gICAgICAvLyAgIGNvbnNvbGUubG9nKCd0YWIgY2hhbmdlZCcsIGV2LmRldGFpbCk7XG4gICAgICAvLyB9KTtcbiAgICAgIHRhYkNvbnRyb2wuYWRkQ2hhbmdlTGlzdGVuZXIoKChldjogQ3VzdG9tRXZlbnQpID0+IHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ3RhYiBjaGFuZ2VkJywgZXYuZGV0YWlsKTtcbiAgICAgIH0pIGFzIEV2ZW50TGlzdGVuZXIpO1xuICAgIH0sXG4gIH0pO1xuICBhcHAyLm1vdW50KHRhcmdldCk7XG59XG4iLCJPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0c1snZGVmYXVsdCddID0gaXNUb3VjaERldmljZTtcbmZ1bmN0aW9uIGlzVG91Y2hEZXZpY2UoKSB7XG4gIHJldHVybiAhISh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiAoJ29udG91Y2hzdGFydCcgaW4gd2luZG93IHx8IHdpbmRvdy5Eb2N1bWVudFRvdWNoICYmIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgZG9jdW1lbnQgaW5zdGFuY2VvZiB3aW5kb3cuRG9jdW1lbnRUb3VjaCkpIHx8ICEhKHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmIChuYXZpZ2F0b3IubWF4
20578VG91Y2hQb2ludHMgfHwgbmF2aWdhdG9yLm1zTWF4VG91Y2hQb2ludHMpKTtcbn1cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIi8qXG5UaGlzIHBsdWdpbiBleHRlbmRzIGxhenlTaXplcyB0byBsYXp5TG9hZDpcbmJhY2tncm91bmQgaW1hZ2VzLCB2aWRlb3MvcG9zdGVycyBhbmQgc2NyaXB0c1xuXG5CYWNrZ3JvdW5kLUltYWdlOlxuRm9yIGJhY2tncm91bmQgaW1hZ2VzLCB1c2UgZGF0YS1iZyBhdHRyaWJ1dGU6XG48ZGl2IGNsYXNzPVwibGF6eWxvYWRcIiBkYXRhLWJnPVwiYmctaW1nLmpwZ1wiPjwvZGl2PlxuXG4gVmlkZW86XG4gRm9yIHZpZGVvL2F1ZGlvIHVzZSBkYXRhLXBvc3RlciBhbmQgcHJlbG9hZD1cIm5vbmVcIjpcbiA8dmlkZW8gY2xhc3M9XCJsYXp5bG9hZFwiIHByZWxvYWQ9XCJub25lXCIgZGF0YS1wb3N0ZXI9XCJwb3N0ZXIuanBnXCIgc3JjPVwic3JjLm1wNFwiPlxuIDwhLS0gc291cmNlcyAtLT5cbiA8L3ZpZGVvPlxuXG4gRm9yIHZpZGVvIHRoYXQgcGxheXMgYXV0b21hdGljYWxseSBpZiBpbiB2aWV3OlxuIDx2aWRlb1xuXHRjbGFzcz1cImxhenlsb2FkXCJcblx0cHJlbG9hZD1cIm5vbmVcIlxuXHRtdXRlZD1cIlwiXG5cdGRhdGEtYXV0b3BsYXk9XCJcIlxuXHRkYXRhLXBvc3Rlcj1cInBvc3Rlci5qcGdcIlxuXHRzcmM9XCJzcmMubXA0XCI+XG48L3ZpZGVvPlxuXG4gU2NyaXB0czpcbiBGb3Igc2NyaXB0cyB1c2UgZGF0YS1zY3JpcHQ6XG4gPGRpdiBjbGFzcz1cImxhenlsb2FkXCIgZGF0YS1zY3JpcHQ9XCJtb2R1bGUtbmFtZS5qc1wiPjwvZGl2PlxuXG5cbiBTY3JpcHQgbW9kdWxlcyB1c2luZyByZXF1aXJlOlxuIEZvciBtb2R1bGVzIHVzaW5nIHJlcXVpcmUgdXNlIGRhdGEtcmVxdWlyZTpcbiA8ZGl2IGNsYXNzPVwibGF6eWxvYWRcIiBkYXRhLXJlcXVpcmU9XCJtb2R1bGUtbmFtZVwiPjwvZGl2PlxuKi9cblxuKGZ1bmN0aW9uKHdpbmRvdywgZmFjdG9yeSkge1xuXHR2YXIgZ2xvYmFsSW5zdGFsbCA9IGZ1bmN0aW9uKCl7XG5cdFx0ZmFjdG9yeSh3aW5kb3cubGF6eVNpemVzKTtcblx0XHR3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbGF6eXVudmVpbHJlYWQnLCBnbG9iYWxJbnN0YWxsLCB0cnVlKTtcblx0fTtcblxuXHRmYWN0b3J5ID0gZmFjdG9yeS5iaW5kKG51bGwsIHdpbmRvdywgd2luZG93LmRvY3VtZW50KTtcblxuXHRpZih0eXBlb2YgbW9kdWxlID09ICdvYmplY3QnICYmIG1vZHVsZS5leHBvcnRzKXtcblx0XHRmYWN0b3J5KHJlcXVpcmUoJ2xhenlzaXplcycpKTtcblx0fSBlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkge1xuXHRcdGRlZmluZShbJ2xhenlzaXplcyddLCBmYWN0b3J5KTtcblx0fSBlbHNlIGlmKHdpbmRvdy5sYXp5U2l6ZXMpIHtcblx0XHRnbG9iYWxJbnN0YWxsKCk7XG5cdH0gZWxzZSB7XG5cdFx0d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2xhenl1bnZlaWxyZWFkJywgZ2xvYmFsSW5zdGFsbCwgdHJ1ZSk7XG5cdH1cbn0od2luZG93LCBmdW5jdGlvbih3aW5kb3csIGRvY3VtZW50LCBsYXp5U2l6ZXMpIHtcblx0Lypqc2hpbnQgZXFudWxsOnRydWUgKi9cblx0J3VzZSBzdHJpY3QnO1xuXHR2YXIgYmdMb2FkLCByZWdCZ1VybEVzY2FwZTtcblx0dmFyIHVuaXF1ZVVybHMgPSB7fTtcblxuXHRpZihkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKXtcblx0XHRyZWdCZ1VybEVzY2FwZSA9IC9cXCh8XFwpfFxcc3wnLztcblxuXHRcdGJnTG9hZCA9IGZ1bmN0aW9uICh1cmwsIGNiKXtcblx0XHRcdHZhciBpbWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTtcblx0XHRcdGltZy5vbmxvYWQgPSBmdW5jdGlvbigpe1xuXHRcdFx0XHRpbWcub25sb2FkID0gbnVsbDtcblx0XHRcdFx0aW1nLm9uZXJyb3IgPSBudWxsO1xuXHRcdFx0XHRpbWcgPSBudWxsO1xuXHRcdFx0XHRjYigpO1xuXHRcdFx0fTtcblx0XHRcdGltZy5vbmVycm9yID0gaW1nLm9ubG9hZDtcblxuXHRcdFx0aW1nLnNyYyA9IHVybDtcblxuXHRcdFx0aWYoaW1nICYmIGltZy5jb21wbGV0ZSAmJiBpbWcub25sb2FkKXtcblx0XHRcdFx0aW1nLm9ubG9hZCgpO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHRhZGRFdmVudExpc3RlbmVyKCdsYXp5YmVmb3JldW52ZWlsJywgZnVuY3Rpb24oZSl7XG5cdFx0XHRpZihlLmRldGFpbC5pbnN0YW5jZSAhPSBsYXp5U2l6ZXMpe3JldHVybjt9XG5cblx0XHRcdHZhciB0bXAsIGxvYWQsIGJnLCBwb3N0ZXI7XG5cdFx0XHRpZighZS5kZWZhdWx0UHJldmVudGVkKSB7XG5cblx0XHRcdFx0dmFyIHRhcmdldCA9IGUudGFyZ2V0O1xuXG5cdFx0XHRcdGlmKHRhcmdldC5wcmVsb2FkID09ICdub25lJyl7XG5cdFx0XHRcdFx0dGFyZ2V0LnByZWxvYWQgPSB0YXJnZXQuZ2V0QXR0cmlidXRlKCdkYXRhLXByZWxvYWQnKSB8fCAnYXV0byc7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAodGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS1hdXRvcGxheScpICE9IG51bGwpIHtcblx0XHRcdFx0XHRpZiAodGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS1leHBhbmQnKSAmJiAhdGFyZ2V0LmF1dG9wbGF5KSB7XG5cdFx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0XHR0YXJnZXQucGxheSgpO1xuXHRcdFx0XHRcdFx0fSBjYXRjaCAoZXIpIHt9XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdHRhcmdldC5zZXRBdHRyaWJ1dGUoJ2RhdGEtZXhwYW5kJywgJy0xMCcpO1xuXHRcdFx0XHRcdFx0XHRsYXp5U2l6ZXMuYUModGFyZ2V0LCBsYXp5U2l6ZXMuY2ZnLmxhenlDbGFzcyk7XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0bXAgPSB0YXJnZXQuZ2V0QXR0cmlidXRlKCdkYXRhLWxpbmsnKTtcblx0XHRcdFx0aWYodG1wKXtcblx0XHRcdFx0XHRhZGRTdHlsZVNjcmlwdCh0bXAsIHRydWUpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gaGFuZGxlIGRhdGEtc2NyaXB0XG5cdFx0XHRcdHRtcCA9IHRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEtc2NyaXB0Jyk7XG5cdFx0XHRcdGlmKHRtcCl7XG5cdFx0XHRcdFx0ZS5kZXRhaWwuZmlyZXNMb2FkID0gdHJ1ZTtcblx0XHRcdFx0XHRsb2FkID0gZnVuY3Rpb24oKXtcblx0XHRcdFx0XHRcdGUuZGV0YWlsLmZpcmVzTG9hZCA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0bGF6eVNpemVzLmZpcmUodGFyZ2V0LCAnX2xhenlsb2FkZWQnLCB7fSwgdHJ1ZSwgdHJ1ZSk7XG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRhZGRTdHlsZVNjcmlwdCh0bXAsIG51bGwsIGxvYWQpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gaGFuZGxlIGRhdGEtcmVxdWlyZVxuXHRcdFx0XHR0bXAgPSB0YXJnZXQuZ2V0QXR0cmlidXRlKCdkYXRhLXJlcXVpcmUnKTtcblx0XHRcdFx0aWYodG1wKXtcblx0XHRcdFx0XHRpZihsYXp5U2l6ZXMuY2ZnLnJlcXVpcmVKcyl7XG5cdFx0XHRcdFx0XHRsYXp5U2l6ZXMuY2ZnLnJlcXVpcmVKcyhbdG1wXSk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGFkZFN0eWxlU2NyaXB0KHRtcCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gaGFuZGxlIGRhdGEtYmdcblx0XHRcdFx0YmcgPSB0YXJnZXQuZ2V0QXR0cmlidXRlKCdkYXRhLWJnJyk7XG5cdFx0XHRcdGlmIChiZykge1xuXHRcdFx0XHRcdGUuZGV0YWlsLmZpcmVzTG9hZCA9IHRydWU7XG5cdFx0XHRcdFx0bG9hZCA9IGZ1bmN0aW9uKCl7XG5cdFx0XHRcdFx0XHR0YXJnZXQuc3R5bGUuYmFja2dyb3VuZEltYWdlID0gJ3Vyb
20578CgnICsgKHJlZ0JnVXJsRXNjYXBlLnRlc3QoYmcpID8gSlNPTi5zdHJpbmdpZnkoYmcpIDogYmcgKSArICcpJztcblx0XHRcdFx0XHRcdGUuZGV0YWlsLmZpcmVzTG9hZCA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0bGF6eVNpemVzLmZpcmUodGFyZ2V0LCAnX2xhenlsb2FkZWQnLCB7fSwgdHJ1ZSwgdHJ1ZSk7XG5cdFx0XHRcdFx0fTtcblxuXHRcdFx0XHRcdGJnTG9hZChiZywgbG9hZCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBoYW5kbGUgZGF0YS1wb3N0ZXJcblx0XHRcdFx0cG9zdGVyID0gdGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS1wb3N0ZXInKTtcblx0XHRcdFx0aWYocG9zdGVyKXtcblx0XHRcdFx0XHRlLmRldGFpbC5maXJlc0xvYWQgPSB0cnVlO1xuXHRcdFx0XHRcdGxvYWQgPSBmdW5jdGlvbigpe1xuXHRcdFx0XHRcdFx0dGFyZ2V0LnBvc3RlciA9IHBvc3Rlcjtcblx0XHRcdFx0XHRcdGUuZGV0YWlsLmZpcmVzTG9hZCA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0bGF6eVNpemVzLmZpcmUodGFyZ2V0LCAnX2xhenlsb2FkZWQnLCB7fSwgdHJ1ZSwgdHJ1ZSk7XG5cdFx0XHRcdFx0fTtcblxuXHRcdFx0XHRcdGJnTG9hZChwb3N0ZXIsIGxvYWQpO1xuXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9LCBmYWxzZSk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGFkZFN0eWxlU2NyaXB0KHNyYywgc3R5bGUsIGNiKXtcblx0XHRpZih1bmlxdWVVcmxzW3NyY10pe1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHR2YXIgZWxlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoc3R5bGUgPyAnbGluaycgOiAnc2NyaXB0Jyk7XG5cdFx0dmFyIGluc2VydEVsZW0gP
20578SBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnc2NyaXB0JylbMF07XG5cblx0XHRpZihzdHlsZSl7XG5cdFx0XHRlbGVtLnJlbCA9ICdzdHlsZXNoZWV0Jztcblx0XHRcdGVsZW0uaHJlZiA9IHNyYztcblx0XHR9IGVsc2Uge1xuXHRcdFx0ZWxlbS5vbmxvYWQgPSBmdW5jdGlvbigpe1xuXHRcdFx0XHRlbGVtLm9uZXJyb3IgPSBudWxsO1xuXHRcdFx0XHRlbGVtLm9ubG9hZCA9IG51bGw7XG5cdFx0XHRcdGNiKCk7XG5cdFx0XHR9O1xuXHRcdFx0ZWxlbS5vbmVycm9yID0gZWxlbS5vbmxvYWQ7XG5cblx0XHRcdGVsZW0uc3JjID0gc3JjO1xuXHRcdH1cblx0XHR1bmlxdWVVcmxzW3NyY10gPSB0cnVlO1xuXHRcdHVuaXF1ZVVybHNbZWxlbS5zcmMgfHwgZWxlbS5ocmVmXSA9IHRydWU7XG5cdFx0aW5zZXJ0RWxlbS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShlbGVtLCBpbnNlcnRFbGVtKTtcblx0fVxufSkpO1xuIiwiLyoqXG4qIHZ1ZSB2My40LjM0XG4qIChjKSAyMDE4LXByZXNlbnQgWXV4aSAoRXZhbikgWW91IGFuZCBWdWUgY29udHJpYnV0b3JzXG4qIEBsaWNlbnNlIE1JVFxuKiovXG5pbXBvcnQgKiBhcyBydW50aW1lRG9tIGZyb20gJ0B2dWUvcnVudGltZS1kb20nO1xuaW1wb3J0IHsgaW5pdEN1c3RvbUZvcm1hdHRlciwgcmVnaXN0ZXJSdW50aW1lQ29tcGlsZXIsIHdhcm4gfSBmcm9tICdAdnVlL3J1bnRpbWUtZG9tJztcbmV4cG9ydCAqIGZyb20gJ0B2dWUvcnVudGltZS1kb20nO1xuaW1wb3J0IHsgY29tcGlsZSB9IGZyb20gJ0B2dWUvY29tcGlsZXItZG9tJztcbmltcG9ydCB7IGlzU3RyaW5nLCBOT09QLCBleHRlbmQsIGdlbmVyYXRlQ29kZUZyYW1lLCBFTVBUWV9PQkogfSBmcm9tICdAdnVlL3NoYXJlZCc7XG5cbmZ1bmN0aW9uIGluaXREZXYoKSB7XG4gIHtcbiAgICBpbml0Q3VzdG9tRm9ybWF0dGVyKCk7XG4gIH1cbn1cblxuaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgaW5pdERldigpO1xufVxuY29uc3QgY29tcGlsZUNhY2hlID0gLyogQF9fUFVSRV9fICovIG5ldyBXZWFrTWFwKCk7XG5mdW5jdGlvbiBnZXRDYWNoZShvcHRpb25zKSB7XG4gIGxldCBjID0gY29tcGlsZUNhY2hlLmdldChvcHRpb25zICE9IG51bGwgPyBvcHRpb25zIDogRU1QVFlfT0JKKTtcbiAgaWYgKCFjKSB7XG4gICAgYyA9IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIGNvbXBpbGVDYWNoZS5zZXQob3B0aW9ucyAhPSBudWxsID8gb3B0aW9ucyA6IEVNUFRZX09CSiwgYyk7XG4gIH1cbiAgcmV0dXJuIGM7XG59XG5mdW5jdGlvbiBjb21waWxlVG9GdW5jdGlvbih0ZW1wbGF0ZSwgb3B0aW9ucykge1xuICBpZiAoIWlzU3RyaW5nKHRlbXBsYXRlKSkge1xuICAgIGlmICh0ZW1wbGF0ZS5ub2RlVHlwZSkge1xuICAgICAgdGVtcGxhdGUgPSB0ZW1wbGF0ZS5pbm5lckhUTUw7XG4gICAgfSBlbHNlIHtcbiAgICAgICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgd2FybihgaW52YWxpZCB0ZW1wbGF0ZSBvcHRpb246IGAsIHRlbXBsYXRlKTtcbiAgICAgIHJldHVybiBOT09QO1xuICAgIH1cbiAgfVxuICBjb25zdCBrZXkgPSB0ZW1wbGF0ZTtcbiAgY29uc3QgY2FjaGUgPSBnZXRDYWNoZShvcHRpb25zKTtcbiAgY29uc3QgY2FjaGVkID0gY2FjaGVba2V5XTtcbiAgaWYgKGNhY2hlZCkge1xuICAgIHJldHVybiBjYWNoZWQ7XG4gIH1cbiAgaWYgKHRlbXBsYXRlWzBdID09PSBcIiNcIikge1xuICAgIGNvbnN0IGVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0ZW1wbGF0ZSk7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgIWVsKSB7XG4gICAgICB3YXJuKGBUZW1wbGF0ZSBlbGVtZW50IG5vdCBmb3VuZCBvciBpcyBlbXB0eTogJHt0ZW1wbGF0ZX1gKTtcbiAgICB9XG4gICAgdGVtcGxhdGUgPSBlbCA/IGVsLmlubmVySFRNTCA6IGBgO1xuICB9XG4gIGNvbnN0IG9wdHMgPSBleHRlbmQoXG4gICAge1xuICAgICAgaG9pc3RTdGF0aWM6IHRydWUsXG4gICAgICBvbkVycm9yOiAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8gb25FcnJvciA6IHZvaWQgMCxcbiAgICAgIG9uV2FybjogISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IChlKSA9PiBvbkVycm9yKGUsIHRydWUpIDogTk9PUFxuICAgIH0sXG4gICAgb3B0aW9uc1xuICApO1xuICBpZiAoIW9wdHMuaXNDdXN0b21FbGVtZW50ICYmIHR5cGVvZiBjdXN0b21FbGVtZW50cyAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgIG9wdHMuaXNDdXN0b21FbGVtZW50ID0gKHRhZykgPT4gISFjdXN0b21FbGVtZW50cy5nZXQodGFnKTtcbiAgfVxuICBjb25zdCB7IGNvZGUgfSA9IGNvbXBpbGUodGVtcGxhdGUsIG9wdHMpO1xuICBmdW5jdGlvbiBvbkVycm9yKGVyciwgYXNXYXJuaW5nID0gZmFsc2UpIHtcbiAgICBjb25zdCBtZXNzYWdlID0gYXNXYXJuaW5nID8gZXJyLm1lc3NhZ2UgOiBgVGVtcGxhdGUgY29tcGlsYXRpb24gZXJyb3I6ICR7ZXJyLm1lc3NhZ2V9YDtcbiAgICBjb25zdCBjb2RlRnJhbWUgPSBlcnIubG9jICYmIGdlbmVyYXRlQ29kZUZyYW1lKFxuICAgICAgdGVtcGxhdGUsXG4gICAgICBlcnIubG9jLnN0YXJ0Lm9mZnNldCxcbiAgICAgIGVyci5sb2MuZW5kLm9mZnNldFxuICAgICk7XG4gICAgd2Fybihjb2RlRnJhbWUgPyBgJHttZXNzYWdlfVxuJHtjb2RlRnJhbWV9YCA6IG1lc3NhZ2UpO1xuICB9XG4gIGNvbnN0IHJlbmRlciA9IG5ldyBGdW5jdGlvbihcIlZ1ZVwiLCBjb2RlKShydW50aW1lRG9tKTtcbiAgcmVuZGVyLl9yYyA9IHRydWU7XG4gIHJldHVybiBjYWNoZVtrZXldID0gcmVuZGVyO1xufVxucmVnaXN0ZXJSdW50aW1lQ29tcGlsZXIoY29tcGlsZVRvRnVuY3Rpb24pO1xuXG5leHBvcnQgeyBjb21waWxlVG9GdW5jdGlvbiBhcyBjb21waWxlIH07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IChfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBkbGwtcmVmZXJlbmNlIHZlbmRvcl9saWJyYXJ5ICovIFwiZGxsLXJlZmVyZW5jZSB2ZW5kb3JfbGlicmFyeVwiKSkoMTk3KTsiLCJtb2R1bGUuZXhwb3J0cyA9IChfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBkbGwtcmVmZXJlbmNlIHZlbmRvcl9saWJyYXJ5ICovIFwiZGxsLXJlZmVyZW5jZSB2ZW5kb3JfbGlicmFyeVwiKSkoMjQwKTsiLCJtb2R1bGUuZXhwb3J0cyA9IChfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBkbGwtcmVmZXJlbmNlIHZlbmRvcl9saWJyYXJ5ICovIFwiZGxsLXJlZmVyZW5jZSB2ZW5kb3JfbGlicmFyeVwiKSkoNDk2KTsiLCJtb2R1bGUuZXhwb3J0cyA9IChfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBkbGwtcmVmZXJlbmNlIHZlbmRvcl9saWJyYXJ5ICovIFwiZGxsLXJlZmVyZW5jZSB2ZW5kb3JfbGlicmFyeVwiKSkoNjI1KTsiLCJtb2R1bGUuZXhwb3J0cyA9IChfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBkbGwtcmVmZXJlbmNlIHZlbmRvcl9saWJyYXJ5ICovIFwiZGxsLXJlZmVyZW5jZSB2ZW5kb3JfbGlicmFyeVwiKSkoODc5KTsiLCJtb2R1bGUuZXhwb3J0cyA9IHZlbmRvcl9saWJyYXJ5OyIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuXHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0obW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4iLCIvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuX193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG5cdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuXHRcdGZ1bmN0aW9uKCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuXHRcdGZ1bmN0aW9uKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCB7IGE6IGdldHRlciB9KTtcblx0cmV0dXJuIGdldHRlcjtcbn07IiwiLy8gZGVmaW5lIGdldHRlciBmdW5jdGlvbnMgZm9yIGhhcm1vbnkgZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgZGVmaW5pdGlvbikge1xuXHRmb3IodmFyIGtleSBpbiBkZWZpbml0aW9uKSB7XG5cdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKGRlZmluaXRpb24sIGtleSkgJiYgIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBrZXkpKSB7XG5cdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywga2V5LCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZGVmaW5pdGlvbltrZXldIH0pO1xuXHRcdH1cblx0fVxufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLmcgPSAoZnVuY3Rpb24oKSB7XG5cdGlmICh0eXBlb2YgZ2xvYmFsVGh
20578pcyA9PT0gJ29iamVjdCcpIHJldHVybiBnbG9iYWxUaGlzO1xuXHR0cnkge1xuXHRcdHJldHVybiB0aGlzIHx8IG5ldyBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0aWYgKHR5cGVvZiB3aW5kb3cgPT09ICdvYmplY3QnKSByZXR1cm4gd2luZG93O1xuXHR9XG59KSgpOyIsIl9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iaiwgcHJvcCkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCk7IH0iLCIvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG5cdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuXHR9XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG59OyIsIi8qIGVzbGludCBuby11bnVzZWQtdmFyczpvZmYgKi9cblxuLy8g5YWo44Oa44O844K45YWx6YCa5Yem55CGXG5pbXBvcnQgY29tbW9uIGZyb20gJy4vcGFnZXMvY29tbW9uJztcblxuY29tbW9uKCk7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.