PageSourceSearch

https://www.it-hiroshima.ac.jp/common/js/script.js

js it-hiroshima.ac.jp collected 2026-09-24 09:40:23 UTC 62,896 bytes, 746 lines download raw bytes

1/******/ (function(modules) { // webpackBootstrap
2/******/ 	// The module cache
3/******/ 	var installedModules = {};
4/******/
5/******/ 	// The require function
6/******/ 	function __webpack_require__(moduleId) {
7/******/
8/******/ 		// Check if module is in cache
9/******/ 		if(installedModules[moduleId]) {
10/******/ 			return installedModules[moduleId].exports;
11/******/ 		}
12/******/ 		// Create a new module (and put it into the cache)
13/******/ 		var module = installedModules[moduleId] = {
14/******/ 			i: moduleId,
15/******/ 			l: false,
16/******/ 			exports: {}
17/******/ 		};
18/******/
19/******/ 		// Execute the module function
20/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
21/******/
22/******/ 		// Flag the module as loaded
23/******/ 		module.l = true;
24/******/
25/******/ 		// Return the exports of the module
26/******/ 		return module.exports;
27/******/ 	}
28/******/
29/******/
30/******/ 	// expose the modules object (__webpack_modules__)
31/******/ 	__webpack_require__.m = modules;
32/******/
33/******/ 	// expose the module cache
34/******/ 	__webpack_require__.c = installedModules;
35/******/
36/******/ 	// define getter function for harmony exports
37/******/ 	__webpack_require__.d = function(exports, name, getter) {
38/******/ 		if(!__webpack_require__.o(exports, name)) {
39/******/ 			Object.defineProperty(exports, name, {
40/******/ 				configurable: false,
41/******/ 				enumerable: true,
42/******/ 				get: getter
43/******/ 			});
44/******/ 		}
45/******/ 	};
46/******/
47/******/ 	// getDefaultExport function for compatibility with non-harmony modules
48/******/ 	__webpack_require__.n = function(module) {
49/******/ 		var getter = module && module.__esModule ?
50/******/ 			function getDefault() { return module['default']; } :
51/******/ 			function getModuleExports() { return module; };
52/******/ 		__webpack_require__.d(getter, 'a', getter);
53/******/ 		return getter;
54/******/ 	};
55/******/
56/******/ 	// Object.prototype.hasOwnProperty.call
57/******/ 	__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
58/******/
59/******/ 	// __webpack_public_path__
60/******/ 	__webpack_require__.p = "/";
61/******/
62/******/ 	// Load entry module and return exports
63/******/ 	return __webpack_require__(__webpack_require__.s = 0);
64/******/ })
65/************************************************************************/
66/******/ ([
67/* 0 */
68/***/ (function(module, exports, __webpack_require__) {
69
70__webpack_require__(1);
71__webpack_require__(6);
72__webpack_require__(7);
73__webpack_require__(8);
74module.exports = __webpack_require__(9);
75
76
77/***/ }),
78/* 1 */
79/***/ (function(module, __webpack_exports__, __webpack_require__) {
80
81"use strict";
82Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
83/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_js_cookie__ = __webpack_require__(2);
84/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_js_cookie___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_js_cookie__);
85/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_scroll_hint__ = __webpack_require__(3);
86/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_scroll_hint___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_scroll_hint__);
87//import $ from "jquery"
88
89//import 'lity'
90
91
92//document.oncontextmenu = function () {return false;}
93var widthOrg = $(window).width();
94$(function () {
95    //$("img").wrap('<div class="img_wrap"></div>');
96    /* ********************
97    * 検索ボタン押下で検索窓の表示
98    ******************** */
99    var loupe = $(".loupe");
100    loupe.on("click", function () {
101        $(".show_search").slideToggle(200);
102    });
103
104    /* ********************
105    * ばつボタン押下で検索窓を非表示
106    ******************** */
107    var search_close = $(".search_close");
108    search_close.on("click", function () {
109        $(".show_search").slideUp(200);
110    });
111
112    $(window).resize(function () {
113        $(".show_search").hide();
114    });
115
116    /* ********************
117    * ハンバーガーボタン押下でメニューを表示
118    ******************** */
119    //SP時のハンバーガーボタン
120    var sp_menu = $(".sp_menu");
121    var sp_nav = $(".sp_nav");
122    sp_menu.on("click", function () {
123        sp_nav.fadeIn(250);
124    });
125
126    //ナビゲーションを閉じるボタン
127    var close_btn = $(".close_btn");
128    close_btn.on("click", function () {
129        sp_nav.fadeOut(200);
130    });
131
132    //リサイズされた時の処理
133    //SP時にメニューを非表示にしても閾値を上回るとメニューを表示する。
134    $(window).resize(function () {
135        var w = $(window).width();
136        if (widthOrg != w) {
137            widthOrg = w;
138            if (w <= 840) {
139                sp_nav.hide();
140            } else {
141                sp_nav.show();
142            }
143        }
144    });
145
146    /* ********************
147    * 第2階層がある場合はアコーディオン
148    ******************** */
149    var has_menu = $(".has_menu");
150    has_menu.on("click", function () {
151        $(this).children("ul").slideToggle(300);
152    });
153
154    /* ********************
155    * スムーススクロール
156    ******************** */
157    $(document).on("click", 'a[href^="#"]:not([data-lity])', function () {
158        var headerHeight = 0;
159        if ($(window).width() <= 840) {
160            headerHeight = 93;
161        }
162        //console.log(headerHeight);
163        var speed = 500;
164        var href = $(this).attr("href");
165        var target = $(href == "#" || href == "" ? 'html' : href);
166        var position = target.offset().top - headerHeight;
167        $("html, body").animate({ scrollTop: position }, speed, "swing");
168        return false;
169    });
170    // 外部からのページ内リンク
171    var urlHash = location.hash; // ハッシュ値があればページ内スクロール
172    if (urlHash) {
173        // 外部リンクからのクリック時
174        $('body,html').stop().scrollTop(0); // スクロールを0に戻す
175        setTimeout(function () {
176            // ロード時の処理を待ち、時間差でスクロール実行
177            var target = $(urlHash);
178            var headerHeight = 0;
179            if ($(window).width() <= 840) {
180                headerHeight = 93;
181            }
182            var speed = 500;
183            var position = target.offset().top - headerHeight;
184            $("html, body").animate({ scrollTop: position }, speed, "swing");
185        }, 1000);
186    }
187
188    /* ********************
189    * 翻訳
190    ******************** */
191    var lang_select = $(".lang-select");
192    lang_select.click(function () {
193        var lang = $(this).attr('data-lang');
194        var anchor = $(this).attr('data-anchor');
195        var url = location.protocol + "//" + location.host + location.pathname + '#' + anchor;
196        window.location = url;
197        location.reload();
198    });
199    /* ********************
200       * 翻訳リセット
201       ******************** */
202    var lang_reset = $(".lang-reset");
203    lang_reset.click(function () {
204        __WEBPACK_IMPORTED_MODULE_0_js_cookie___default.a.remove("googtrans");
205        __WEBPACK_IMPORTED_MODULE_0_js_cookie___default.a.remove('googtrans', { domain: '.concept-h.asia' });
206        var url = location.protocol + "//" + location.host + location.pathname + location.search;
207        window.location.href = url;
208    });
209    /* ********************
210       * 横スクロール
211       ******************** */
212    new __WEBPACK_IMPORTED_MODULE_1_scroll_hint___default.a('.js-scrollable');
213
214    /* ********************
215    * 緊急時の表示
216    ******************** */
217    $('.emergency_contents').infiniteslide({
218        'speed': 80,
219        'direction': 'left',
220        'pauseonhover': true,
221        'responsive': true,
222        'clone': 1
223    });
224
225    /* ********************
226    * 翻訳
227    * コンボボックス
228    ******************** */
229    $('.languageSelect').clone().appendTo('.pcLang');
230    var lang_func = $(".languageSelect .langBtn");
231    lang_func.on("click", function () {
232        $(event.currentTarget).next('.langList').toggleClass('langShow');
233    });
234    $(document).on('click', function () {
235        $('.langList').removeClass('langShow');
236    });
237    $(document).on('click', '.languageSelect', function (e) {
238        e.stopPropagation();
239    });
240
241    /* ********************
242    * スマホSNSアイコン
243    * スクロール停止時
244    ******************** */
245    var scrollTimeoutId;
246    window.addEventListener("scroll", function () {
247        $('body').addClass('scrollNow');
248        clearTimeout(scrollTimeoutId);
249        scrollTimeoutId = setTimeout(function () {
250            $('body').removeClass('scrollNow');
251        }, 300);
252    });
253});
254
255/***/ }),
256/* 2 */
257/***/ (function(module, exports, __webpack_require__) {
258
259var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!
260 * JavaScript Cookie v2.2.1
261 * https://github.com/js-cookie/js-cookie
262 *
263 * Copyright 2006, 2015 Klaus Hartl & Fagner Brack
264 * Released under the MIT license
265 */
266;(function (factory) {
267	var registeredInModuleLoader;
268	if (true) {
269		!(__WEBPACK_AMD_DEFINE_FACTORY__ = (factory),
270				__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
271				(__WEBPACK_AMD_DEFINE_FACTORY__.call(exports, __webpack_require__, exports, module)) :
272				__WEBPACK_AMD_DEFINE_FACTORY__),
vendor: 5,638 bytes, lines 273-479
273				__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
274		registeredInModuleLoader = true;
275	}
276	if (true) {
277		module.exports = factory();
278		registeredInModuleLoader = true;
279	}
280	if (!registeredInModuleLoader) {
281		var OldCookies = window.Cookies;
282		var api = window.Cookies = factory();
283		api.noConflict = function () {
284			window.Cookies = OldCookies;
285			return api;
286		};
287	}
288}(function () {
289	function extend () {
290		var i = 0;
291		var result = {};
292		for (; i < arguments.length; i++) {
293			var attributes = arguments[ i ];
294			for (var key in attributes) {
295				result[key] = attributes[key];
296			}
297		}
298		return result;
299	}
300
301	function decode (s) {
302		return s.replace(/(%[0-9A-Z]{2})+/g, decodeURIComponent);
303	}
304
305	function init (converter) {
306		function api() {}
307
308		function set (key, value, attributes) {
309			if (typeof document === 'undefined') {
310				return;
311			}
312
313			attributes = extend({
314				path: '/'
315			}, api.defaults, attributes);
316
317			if (typeof attributes.expires === 'number') {
318				attributes.expires = new Date(new Date() * 1 + attributes.expires * 864e+5);
319			}
320
321			// We're using "expires" because "max-age" is not supported by IE
322			attributes.expires = attributes.expires ? attributes.expires.toUTCString() : '';
323
324			try {
325				var result = JSON.stringify(value);
326				if (/^[\{\[]/.test(result)) {
327					value = result;
328				}
329			} catch (e) {}
330
331			value = converter.write ?
332				converter.write(value, key) :
333				encodeURIComponent(String(value))
334					.replace(/%(23|24|26|2B|3A|3C|3E|3D|2F|3F|40|5B|5D|5E|60|7B|7D|7C)/g, decodeURIComponent);
335
336			key = encodeURIComponent(String(key))
337				.replace(/%(23|24|26|2B|5E|60|7C)/g, decodeURIComponent)
338				.replace(/[\(\)]/g, escape);
339
340			var stringifiedAttributes = '';
341			for (var attributeName in attributes) {
342				if (!attributes[attributeName]) {
343					continue;
344				}
345				stringifiedAttributes += '; ' + attributeName;
346				if (attributes[attributeName] === true) {
347					continue;
348				}
349
350				// Considers RFC 6265 section 5.2:
351				// ...
352				// 3.  If the remaining unparsed-attributes contains a %x3B (";")
353				//     character:
354				// Consume the characters of the unparsed-attributes up to,
355				// not including, the first %x3B (";") character.
356				// ...
357				stringifiedAttributes += '=' + attributes[attributeName].split(';')[0];
358			}
359
360			return (document.cookie = key + '=' + value + stringifiedAttributes);
361		}
362
363		function get (key, json) {
364			if (typeof document === 'undefined') {
365				return;
366			}
367
368			var jar = {};
369			// To prevent the for loop in the first place assign an empty array
370			// in case there are no cookies at all.
371			var cookies = document.cookie ? document.cookie.split('; ') : [];
372			var i = 0;
373
374			for (; i < cookies.length; i++) {
375				var parts = cookies[i].split('=');
376				var cookie = parts.slice(1).join('=');
377
378				if (!json && cookie.charAt(0) === '"') {
379					cookie = cookie.slice(1, -1);
380				}
381
382				try {
383					var name = decode(parts[0]);
384					cookie = (converter.read || converter)(cookie, name) ||
385						decode(cookie);
386
387					if (json) {
388						try {
389							cookie = JSON.parse(cookie);
390						} catch (e) {}
391					}
392
393					jar[name] = cookie;
394
395					if (key === name) {
396						break;
397					}
398				} catch (e) {}
399			}
400
401			return key ? jar[key] : jar;
402		}
403
404		api.set = set;
405		api.get = function (key) {
406			return get(key, false /* read as raw */);
407		};
408		api.getJSON = function (key) {
409			return get(key, true /* read as json */);
410		};
411		api.remove = function (key, attributes) {
412			set(key, '', extend(attributes, {
413				expires: -1
414			}));
415		};
416
417		api.defaults = {};
418
419		api.withConverter = init;
420
421		return api;
422	}
423
424	return init(function () {});
425}));
426
427
428/***/ }),
429/* 3 */
430/***/ (function(module, exports, __webpack_require__) {
431
432"use strict";
433
434
435Object.defineProperty(exports, "__esModule", {
436  value: true
437});
438
439var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
440
441var _es6ObjectAssign = __webpack_require__(4);
442
443var _util = __webpack_require__(5);
444
445function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
446
447var defaults = {
448  suggestClass: 'is-active',
449  scrollableClass: 'is-scrollable',
450  scrollableRightClass: 'is-right-scrollable',
451  scrollableLeftClass: 'is-left-scrollable',
452  scrollHintClass: 'scroll-hint',
453  scrollHintIconClass: 'scroll-hint-icon',
454  scrollHintIconAppendClass: '', // 'scroll-hint-icon-white'
455  scrollHintIconWrapClass: 'scroll-hint-icon-wrap',
456  scrollHintText: 'scroll-hint-text',
457  scrollHintBorderWidth: 10,
458  remainingTime: -1,
459  enableOverflowScrolling: true,
460  applyToParents: false,
461  suggestiveShadow: false,
462  offset: 0,
463  i18n: {
464    scrollable: 'scrollable'
465  }
466};
467
468var ScrollHint = function () {
469  function ScrollHint(ele, option) {
470    var _this = this;
471
472    _classCallCheck(this, ScrollHint);
473
474    this.opt = (0, _es6ObjectAssign.assign)({}, defaults, option);
475    this.items = [];
476    var elements = typeof ele === 'string' ? document.querySelectorAll(ele) : ele;
477    var applyToParents = this.opt.applyToParents;
478
479    [].forEach.call(elements, function (element) {
480      if (applyToParents) {
481        element = element.parentElement;
482      }
483      element.style.position = 'relative';
484      element.style.overflow = 'auto';
485      if (_this.opt.enableOverflowScrolling) {
486        if ('overflowScrolling' in element.style) {
487          element.style.overflowScrolling = 'touch';
488        } else if ('webkitOverflowScrolling' in element.style) {
489          element.style.webkitOverflowScrolling = 'touch';
490        }
491      }
492      var item = {
493        element: element,
494        scrolledIn: false,
495        interacted: false
496      };
497      document.addEventListener('scroll', function (e) {
498        if (e.target === element) {
499          item.interacted = true;
500          _this.updateItem(item);
501        }
502      }, true);
503      (0, _util.addClass)(element, _this.opt.scrollHintClass);
504      (0, _util.append)(element, '<div class="' + _this.opt.scrollHintIconWrapClass + '" data-target="scrollable-icon">\n        <span class="' + _this.opt.scrollHintIconClass + (_this.opt.scrollHintIconAppendClass ? ' ' + _this.opt.scrollHintIconAppendClass : '') + '">\n          <div class="' + _this.opt.scrollHintText + '">' + _this.opt.i18n.scrollable + '</div>\n        </span>\n      </div>');
505      _this.items.push(item);
506    });
507    window.addEventListener('scroll', function () {
508      _this.updateItems();
509    });
510    window.addEventListener('resize', function () {
511      _this.updateItems();
512    });
513    this.updateItems();
514  }
515
516  _createClass(ScrollHint, [{
517    key: 'isScrollable',
518    value: function isScrollable(item) {
519      var offset = this.opt.offset;
520      var element = item.element;
521      var offsetWidth = element.offsetWidth;
522
523      return offsetWidth + offset < element.scrollWidth;
524    }
525  }, {
526    key: 'checkScrollableDir',
527    value: function checkScrollableDir(item) {
528      var _opt = this.opt,
529          scrollHintBorderWidth = _opt.scrollHintBorderWidth,
530          scrollableRightClass = _opt.scrollableRightClass,
531          scrollableLeftClass = _opt.scrollableLeftClass;
532      var element = item.element;
533
534      var child = element.children[0];
535      var width = child.scrollWidth;
536      var parentWidth = element.offsetWidth;
537      var scrollLeft = element.scrollLeft;
538      if (parentWidth + scrollLeft < width - scrollHintBorderWidth) {
539        (0, _util.addClass)(element, scrollableRightClass);
540      } else {
541        (0, _util.removeClass)(element, scrollableRightClass);
542      }
543      if (parentWidth < width && scrollLeft > scrollHintBorderWidth) {
544        (0, _util.addClass)(element, scrollableLeftClass);
545      } else {
546        (0, _util.removeClass)(element, scrollableLeftClass);
547      }
548    }
549  }, {
550    key: 'needSuggest',
551    value: function needSuggest(item) {
552      var scrolledIn = item.scrolledIn,
553          interacted = item.interacted;
554
555      return !interacted && scrolledIn && this.isScrollable(item);
556    }
557  }, {
558    key: 'updateItems',
559    value: function updateItems() {
560      var _this2 = this;
561
562      [].forEach.call(this.items, function (item) {
563        _this2.updateItem(item);
564      });
565    }
566  }, {
567    key: 'updateStatus',
568    value: function updateStatus(item) {
569      var _this3 = this;
570
571      var element = item.element,
572          scrolledIn = item.scrolledIn;
573
574      if (scrolledIn) {
575        return;
576      }
577      if ((0, _util.getOffset)(element).top + element.offsetHeight / 2 < (0, _util.getScrollTop)() + window.innerHeight) {
578        item.scrolledIn = true;
579        if (this.opt.remainingTime !== -1) {
580          setTimeout(function () {
581            item.interacted = true;
582            _this3.updateItem(item);
583          }, this.opt.remainingTime);
584        }
585      }
586    }
587  }, {
588    key: 'updateItem',
589    value: function updateItem(item) {
590      var opt = this.opt;
591      var element = item.element;
592
593      var target = element.querySelector('[data-target="scrollable-icon"]');
594      this.updateStatus(item);
595      if (this.isScrollable(item)) {
596        (0, _util.addClass)(element, opt.scrollableClass);
597      } else {
598        (0, _util.removeClass)(element, opt.scrollableClass);
599      }
600      if (this.needSuggest(item)) {
601        (0, _util.addClass)(target, opt.suggestClass);
602      } else {
603        (0, _util.removeClass)(target, opt.suggestClass);
604      }
605      if (opt.suggestiveShadow) {
606        this.checkScrollableDir(item);
607      }
608    }
609  }]);
610
611  return ScrollHint;
612}();
613
614exports.default = ScrollHint;
615module.exports = exports['default'];
616
617/***/ }),
618/* 4 */
619/***/ (function(module, exports, __webpack_require__) {
620
621"use strict";
622/**
623 * Code refactored from Mozilla Developer Network:
624 * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign
625 */
626
627
628
629function assign(target, firstSource) {
630  if (target === undefined || target === null) {
631    throw new TypeError('Cannot convert first argument to object');
632  }
633
634  var to = Object(target);
635  for (var i = 1; i < arguments.length; i++) {
636    var nextSource = arguments[i];
637    if (nextSource === undefined || nextSource === null) {
638      continue;
639    }
640
641    var keysArray = Object.keys(Object(nextSource));
642    for (var nextIndex = 0, len = keysArray.length; nextIndex < len; nextIndex++) {
643      var nextKey = keysArray[nextIndex];
644      var desc = Object.getOwnPropertyDescriptor(nextSource, nextKey);
645      if (desc !== undefined && desc.enumerable) {
646        to[nextKey] = nextSource[nextKey];
647      }
648    }
649  }
650  return to;
651}
652
653function polyfill() {
654  if (!Object.assign) {
655    Object.defineProperty(Object, 'assign', {
656      enumerable: false,
657      configurable: true,
658      writable: true,
659      value: assign
660    });
661  }
662}
663
664module.exports = {
665  assign: assign,
666  polyfill: polyfill
667};
668
669
670/***/ }),
671/* 5 */
672/***/ (function(module, exports, __webpack_require__) {
673
674"use strict";
675
676
677Object.defineProperty(exports, "__esModule", {
678  value: true
679});
680var append = exports.append = function append(element, string) {
681  var div = document.createElement('div');
682  div.innerHTML = string;
683  while (div.children.length > 0) {
684    element.appendChild(div.children[0]);
685  }
686};
687
688var addClass = exports.addClass = function addClass(element, className) {
689  if (element.classList) {
690    element.classList.add(className);
691  } else {
692    element.className += ' ' + className;
693  }
694};
695
696var removeClass = exports.removeClass = function removeClass(element, className) {
697  if (element.classList) {
698    element.classList.remove(className);
699  } else {
700    element.className = element.className.replace(new RegExp('(^|\\b)' + className.split(' ').join('|') + '(\\b|$)', 'gi'), ' ');
701  }
702};
703
704var getScrollTop = exports.getScrollTop = function getScrollTop() {
705  return window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0;
706};
707
708var getScrollLeft = exports.getScrollLeft = function getScrollLeft() {
709  return window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft || 0;
710};
711
712var getOffset = exports.getOffset = function getOffset(el) {
713  var rect = el.getBoundingClientRect();
714  return {
715    top: rect.top + getScrollTop(),
716    left: rect.left + getScrollLeft()
717  };
718};
719
720/***/ }),
721/* 6 */
722/***/ (function(module, exports) {
723
724// removed by extract-text-webpack-plugin
725
726/***/ }),
727/* 7 */
728/***/ (function(module, exports) {
729
730// removed by extract-text-webpack-plugin
731
732/***/ }),
733/* 8 */
734/***/ (function(module, exports) {
735
736// removed by extract-text-webpack-plugin
737
738/***/ }),
739/* 9 */
740/***/ (function(module, exports) {
741
742// removed by extract-text-webpack-plugin
743
744/***/ })
745/******/ ]);
746//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAgMmMyYmY1N2E5YWM4NzBjMGZjYWIiLCJ3ZWJwYWNrOi8vLy4vcmVzb3VyY2VzL2Fzc2V0cy9qcy9zY3JpcHQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2pzLWNvb2tpZS9zcmMvanMuY29va2llLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9zY3JvbGwtaGludC9saWIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2VzNi1vYmplY3QtYXNzaWduL2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9zY3JvbGwtaGludC9saWIvdXRpbC5qcyIsIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvYXNzZXRzL3Njc3Mvc3R5bGUuc2Nzcz80Zjc1Iiwid2VicGFjazovLy8uL3Jlc291cmNlcy9hc3NldHMvc2Nzcy9zbGljay5zY3NzP2JhN2MiLCJ3ZWJwYWNrOi8vLy4vcmVzb3VyY2VzL2Fzc2V0cy9zY3NzL3JlbW9kYWwuc2Nzcz8zNTdhIiwid2VicGFjazovLy8uL3Jlc291cmNlcy9hc3NldHMvc2Nzcy9sb2dvX2FuaW1hdGlvbi5zY3NzP2M1YjQiXSwibmFtZXMiOlsid2lkdGhPcmciLCIkIiwid2luZG93Iiwid2lkdGgiLCJsb3VwZSIsIm9uIiwic2xpZGVUb2dnbGUiLCJzZWFyY2hfY2xvc2UiLCJzbGlkZVVwIiwicmVzaXplIiwiaGlkZSIsInNwX21lbnUiLCJzcF9uYXYiLCJmYWRlSW4iLCJjbG9zZV9idG4iLCJmYWRlT3V0IiwidyIsInNob3ciLCJoYXNfbWVudSIsImNoaWxkcmVuIiwiZG9jdW1lbnQiLCJoZWFkZXJIZWlnaHQiLCJzcGVlZCIsImhyZWYiLCJhdHRyIiwidGFyZ2V0IiwicG9zaXRpb24iLCJvZmZzZXQiLCJ0b3AiLCJhbmltYXRlIiwic2Nyb2xsVG9wIiwidXJsSGFzaCIsImxvY2F0aW9uIiwiaGFzaCIsInN0b3AiLCJzZXRUaW1lb3V0IiwibGFuZ19zZWxlY3QiLCJjbGljayIsImxhbmciLCJhbmNob3IiLCJ1cmwiLCJwcm90b2NvbCIsImhvc3QiLCJwYXRobmFtZSIsInJlbG9hZCIsImxhbmdfcmVzZXQiLCJDb29raWVzIiwicmVtb3ZlIiwiZG9tYWluIiwic2VhcmNoIiwiU2Nyb2xsSGludCIsImluZmluaXRlc2xpZGUiLCJjbG9uZSIsImFwcGVuZFRvIiwibGFuZ19mdW5jIiwiZXZlbnQiLCJjdXJyZW50VGFyZ2V0IiwibmV4dCIsInRvZ2dsZUNsYXNzIiwicmVtb3ZlQ2xhc3MiLCJlIiwic3RvcFByb3BhZ2F0aW9uIiwic2Nyb2xsVGltZW91dElkIiwiYWRkRXZlbnRMaXN0ZW5lciIsImFkZENsYXNzIiwiY2xlYXJUaW1lb3V0Il0sIm1hcHBpbmdzIjoiO1FBQUE7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7OztRQUdBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBLEtBQUs7UUFDTDtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBLDJCQUEyQiwwQkFBMEIsRUFBRTtRQUN2RCxpQ0FBaUMsZUFBZTtRQUNoRDtRQUNBO1FBQ0E7O1FBRUE7UUFDQSxzREFBc0QsK0RBQStEOztRQUVySDtRQUNBOztRQUVBO1FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUM3REE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsSUFBSUEsV0FBV0MsRUFBRUMsTUFBRixFQUFVQyxLQUFWLEVBQWY7QUFDQUYsRUFBRSxZQUFVO0FBQ1g7QUFDRzs7O0FBR0EsUUFBTUcsUUFBUUgsRUFBRSxRQUFGLENBQWQ7QUFDQUcsVUFBTUMsRUFBTixDQUFTLE9BQVQsRUFBa0IsWUFBVTtBQUN4QkosVUFBRSxjQUFGLEVBQWtC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QSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBLG9DOzs7Ozs7O0FDdExBO0F
746BQ0E7QUFDQTtBQUNBOztBQUVhOztBQUViO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsaUJBQWlCLHNCQUFzQjtBQUN2QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG1EQUFtRCxpQkFBaUI7QUFDcEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7O0FDN0NhOztBQUViO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRTs7Ozs7O0FDM0NBLHlDOzs7Ozs7QUNBQSx5Qzs7Ozs7O0FDQUEseUM7Ozs7OztBQ0FBLHlDIiwiZmlsZSI6Ii9wdWJsaWMvY29tbW9uL2pzL3NjcmlwdC5qcyIsInNvdXJjZXNDb250ZW50IjpbIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwge1xuIFx0XHRcdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcbiBcdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXG4gXHRcdFx0XHRnZXQ6IGdldHRlclxuIFx0XHRcdH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIi9cIjtcblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSAwKTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyB3ZWJwYWNrL2Jvb3RzdHJhcCAyYzJiZjU3YTlhYzg3MGMwZmNhYiIsIi8vaW1wb3J0ICQgZnJvbSBcImpxdWVyeVwiXG5pbXBvcnQgQ29va2llcyBmcm9tICdqcy1jb29raWUnXG4vL2ltcG9ydCAnbGl0eSdcbmltcG9ydCBTY3JvbGxIaW50IGZyb20gJ3Njcm9sbC1oaW50JztcblxuLy9kb2N1bWVudC5vbmNvbnRleHRtZW51ID0gZnVuY3Rpb24gKCkge3JldHVybiBmYWxzZTt9XG52YXIgd2lkdGhPcmcgPSAkKHdpbmRvdykud2lkdGgoKTtcbiQoZnVuY3Rpb24oKXtcblx0Ly8kKFwiaW1nXCIpLndyYXAoJzxkaXYgY2xhc3M9XCJpbWdfd3JhcFwiPjwvZGl2PicpO1xuICAgIC8qICoqKioqKioqKioqKioqKioqKioqXG4gICAgKiDmpJzntKLjg5zjgr/jg7PmirzkuIvjgafmpJzntKLnqpPjga7ooajnpLpcbiAgICAqKioqKioqKioqKioqKioqKioqKiAqL1xuICAgIGNvbnN0IGxvdXBlID0gJChcIi5sb3VwZVwiKVxuICAgIGxvdXBlLm9uKFwiY2xpY2tcIiwgZnVuY3Rpb24oKXtcbiAgICAgICAgJChcIi5zaG93X3NlYXJjaFwiKS5zbGlkZVRvZ2dsZSgyMDApO1xuICAgIH0pXG4gICAgXG4gICAgLyogKioqKioqKioqKioqKioqKioqKipcbiAgICAqIOOBsOOBpOODnOOCv+ODs+aKvOS4i+OBp+aknOe0oueqk+OCkumdnuihqOekulxuICAgICoqKioqKioqKioqKioqKioqKioqICovXG4gICAgY29uc3Qgc2VhcmNoX2Nsb3NlID0gJChcIi5zZWFyY2hfY2xvc2VcIilcbiAgICBzZWFyY2hfY2xvc2Uub24oXCJjbGlja1wiLCBmdW5jdGlvbigpe1xuICAgICAgICAkKFwiLnNob3dfc2VhcmNoXCIpLnNsaWRlVXAoMjAwKTtcbiAgICB9KVxuICAgIFxuICAgICQo
746d2luZG93KS5yZXNpemUoZnVuY3Rpb24oKSB7XG4gICAgICAgICQoXCIuc2hvd19zZWFyY2hcIikuaGlkZSgpXG4gICAgfSlcbiAgICBcbiAgICBcbiAgICAvKiAqKioqKioqKioqKioqKioqKioqKlxuICAgICog44OP44Oz44OQ44O844Ks44O844Oc44K/44Oz5oq85LiL44Gn44Oh44OL44Ol44O844KS6KGo56S6XG4gICAgKioqKioqKioqKioqKioqKioqKiogKi9cbiAgICAvL1NQ5pmC44Gu44OP44Oz44OQ44O844Ks44O844Oc44K/44OzXG4gICAgY29uc3Qgc3BfbWVudSA9ICQoXCIuc3BfbWVudVwiKVxuICAgIGNvbnN0IHNwX25hdiA9ICQoXCIuc3BfbmF2XCIpXG4gICAgc3BfbWVudS5vbihcImNsaWNrXCIsIGZ1bmN0aW9uKCl7XG4gICAgICAgIHNwX25hdi5mYWRlSW4oMjUwKVxuICAgIH0pXG4gICAgXG4gICAgLy/jg4rjg5PjgrLjg7zjgrfjg6fjg7PjgpLplonjgZjjgovjg5zjgr/jg7NcbiAgICBjb25zdCBjbG9zZV9idG4gPSAkKFwiLmNsb3NlX2J0blwiKVxuICAgIGNsb3NlX2J0bi5vbihcImNsaWNrXCIsIGZ1bmN0aW9uKCl7XG4gICAgICAgIHNwX25hdi5mYWRlT3V0KDIwMClcbiAgICB9KVxuICAgIFxuICAgIC8v44Oq44K144Kk44K644GV44KM44Gf5pmC44Gu5Yem55CGXG4gICAgLy9TUOaZguOBq+ODoeODi+ODpeODvOOCkumdnuihqOekuuOBq+OBl+OBpuOCgumWvuWApOOCkuS4iuWbnuOCi+OBqOODoeODi+ODpeODvOOCkuihqOekuuOBmeOCi+OAglxuICAgICQod2luZG93KS5yZXNpemUoZnVuY3Rpb24oKSB7XG4gICAgICAgIGxldCB3ID0gJCh3aW5kb3cpLndpZHRoKCk7XG4gICAgICAgIGlmKHdpZHRoT3JnICE9IHcpe1xuICAgICAgICBcdHdpZHRoT3JnID0gdztcblx0ICAgICAgICBpZih3IDw9IDg0MCl7XG5cdCAgICAgICAgICAgIHNwX25hdi5oaWRlKClcblx0ICAgICAgICB9ZWxzZXtcblx0ICAgICAgICAgICAgc3BfbmF2LnNob3coKVxuXHQgICAgICAgIH1cblx0XHR9XG4gICAgfSlcbiAgICBcbiAgICAvKiAqKioqKioqKioqKioqKioqKioqKlxuICAgICog56ysMumajuWxpOOBjOOBguOCi+WgtOWQiOOBr+OCouOCs+ODvOODh+OCo+OCquODs1xuICAgICoqKioqKioqKioqKioqKioqKioqICovXG4gICAgY29uc3QgaGFzX21lbnUgPSAkKFwiLmhhc19tZW51XCIpXG4gICAgaGFzX21lbnUub24oXCJjbGlja1wiLCBmdW5jdGlvbigpe1xuICAgICAgICAkKHRoaXMpLmNoaWxkcmVuKFwidWxcIikuc2xpZGVUb2dnbGUoMzAwKTtcbiAgICB9KVxuICAgIFxuICAgIC8qICoqKioqKioqKioqKioqKioqKioqXG4gICAgKiDjgrnjg6Djg7zjgrnjgrnjgq/jg63jg7zjg6tcbiAgICAqKioqKioqKioqKioqKioqKioqKiAqL1xuICAgICQoZG9jdW1lbnQpLm9uKFwiY2xpY2tcIiwgJ2FbaHJlZl49XCIjXCJdOm5vdChbZGF0YS1saXR5XSknLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGxldCBoZWFkZXJIZWlnaHQgPSAwO1xuICAgICAgICBpZigkKHdpbmRvdykud2lkdGgoKSA8PSA4NDApe1xuICAgICAgICAgICAgaGVhZGVySGVpZ2h0ID0gOTM7XG4gICAgICAgIH1cbiAgICAgICAgLy9jb25zb2xlLmxvZyhoZWFkZXJIZWlnaHQpO1xuICAgICAgICBjb25zdCBzcGVlZCA9IDUwMDtcbiAgICAgICAgY29uc3QgaHJlZj0gJCh0aGlzKS5hdHRyKFwiaHJlZlwiKTtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gJChocmVmID09IFwiI1wiIHx8IGhyZWYgPT0gXCJcIiA/ICdodG1sJyA6IGhyZWYpO1xuICAgICAgICBjb25zdCBwb3NpdGlvbiA9IHRhcmdldC5vZmZzZXQoKS50b3AgLSBoZWFkZXJIZWlnaHQ7XG4gICAgICAgICQoXCJodG1sLCBib2R5XCIpLmFuaW1hdGUoe3Njcm9sbFRvcDpwb3NpdGlvbn0sIHNwZWVkLCBcInN3aW5nXCIpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSk7XG4gICAgLy8g5aSW6YOo44GL44KJ44Gu44Oa44O844K45YaF44Oq44Oz44KvXG4gICAgdmFyIHVybEhhc2ggPSBsb2NhdGlvbi5oYXNoOyAvLyDjg4/jg4Pjgrfjg6XlgKTjgYzjgYLjgozjgbDjg5rjg7zjgrjlhoXjgrnjgq/jg63jg7zjg6tcblx0aWYodXJsSGFzaCkgeyAvLyDlpJbpg6jjg6rjg7Pjgq/jgYvjgonjga7jgq/jg6rjg4Pjgq/mmYJcblx0XHQkKCdib2R5LGh0bWwnKS5zdG9wKCkuc2Nyb2xsVG9wKDApOyAvLyDjgrnjgq/jg63jg7zjg6vjgpIw44Gr5oi744GZXG5cdFx0c2V0VGltZW91dChmdW5jdGlvbigpeyAvLyDjg63jg7zjg4nmmYLjga7lh6bnkIbjgpLlvoXjgaHjgIHmmYLplpPlt67jgafjgrnjgq/jg63jg7zjg6vlrp/ooYxcblx0ICBcdFx0Y29uc3QgdGFyZ2V0ID0gJCh1cmxIYXNoKTtcblx0ICBcdFx0bGV0IGhlYWRlckhlaWdodCA9IDA7XG4gICAgICAgIFx0aWYoJCh3aW5kb3cpLndpZHRoKCkgPD0gODQwKXtcbiAgICAgICAgICAgIFx0aGVhZGVySGVpZ2h0ID0gOTM7XG4gICAgICAgIFx0fVxuICAgICAgICBcdGNvbnN0IHNwZWVkID0gNTAwO1xuXHQgIFx0XHRjb25zdCBwb3NpdGlvbiA9IHRhcmdldC5vZmZzZXQoKS50b3AgLSBoZWFkZXJIZWlnaHQ7XG5cdCAgXHRcdCQoXCJodG1sLCBib2R5XCIpLmFuaW1hdGUoe3Njcm9sbFRvcDpwb3NpdGlvbn0sIHNwZWVkLCBcInN3aW5nXCIpO1xuICAgIFx0fSwgMTAwMCk7XG4gIFx0fVxuICAgIFxuICAgIC8qICoqKioqKioqKioqKioqKioqKioqXG4gICAgKiDnv7voqLNcbiAgICAqKioqKioqKioqKioqKioqKioqKiAqL1xuICAgIGNvbnN0IGxhbmdfc2VsZWN0ID0gJChcIi5sYW5nLXNlbGVjdFwiKVxuICAgIGxhbmdfc2VsZWN0LmNsaWNrKGZ1bmN0aW9uKCkge1xuXHQgIHZhciBsYW5nID0gJCh0aGlzKS5hdHRyKCdkYXRhLWxhbmcnKTtcblx0ICB2YXIgYW5jaG9yID0gJ
746Ch0aGlzKS5hdHRyKCdkYXRhLWFuY2hvcicpO1xuXHQgIHZhciB1cmwgPSBsb2NhdGlvbi5wcm90b2NvbCArIFwiLy9cIiArIGxvY2F0aW9uLmhvc3QgKyBsb2NhdGlvbi5wYXRobmFtZSArICcjJyArIGFuY2hvcjtcblx0ICB3aW5kb3cubG9jYXRpb24gPSB1cmw7XG5cdCAgbG9jYXRpb24ucmVsb2FkKCk7XG5cdH0pXG5cdC8qICoqKioqKioqKioqKioqKioqKioqXG4gICAgKiDnv7voqLPjg6rjgrvjg4Pjg4hcbiAgICAqKioqKioqKioqKioqKioqKioqKiAqL1xuICAgIGNvbnN0IGxhbmdfcmVzZXQgPSAkKFwiLmxhbmctcmVzZXRcIilcbiAgICBsYW5nX3Jlc2V0LmNsaWNrKGZ1bmN0aW9uKCkge1xuXHQgIENvb2tpZXMucmVtb3ZlKFwiZ29vZ3RyYW5zXCIpO1xuXHQgIENvb2tpZXMucmVtb3ZlKCdnb29ndHJhbnMnLCB7IGRvbWFpbjogJy5jb25jZXB0LWguYXNpYScgfSk7XG5cdCAgdmFyIHVybCA9IGxvY2F0aW9uLnByb3RvY29sICsgXCIvL1wiICsgbG9jYXRpb24uaG9zdCArIGxvY2F0aW9uLnBhdGhuYW1lICsgbG9jYXRpb24uc2VhcmNoO1xuXHQgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gdXJsO1xuXHR9KVxuXHQvKiAqKioqKioqKioqKioqKioqKioqKlxuICAgICog5qiq44K544Kv44Ot44O844OrXG4gICAgKioqKioqKioqKioqKioqKioqKiogKi9cblx0bmV3IFNjcm9sbEhpbnQoJy5qcy1zY3JvbGxhYmxlJyk7XG4gICAgXG4gICAgXG4gICAgLyogKioqKioqKioqKioqKioqKioqKipcbiAgICAqIOe3iuaApeaZguOBruihqOekulxuICAgICoqKioqKioqKioqKioqKioqKioqICovXG4gICAgJCgnLmVtZXJnZW5jeV9jb250ZW50cycpLmluZmluaXRlc2xpZGUoe1xuICAgICAgICAnc3BlZWQnOiA4MCxcbiAgICAgICAgJ2RpcmVjdGlvbic6ICdsZWZ0JyxcbiAgICAgICAgJ3BhdXNlb25ob3Zlcic6IHRydWUsXG4gICAgICAgICdyZXNwb25zaXZlJzogdHJ1ZSxcbiAgICAgICAgJ2Nsb25lJzogMVxuICAgIH0pO1xuICAgIFxuICAgIC8qICoqKioqKioqKioqKioqKioqKioqXG4gICAgKiDnv7voqLNcbiAgICAqIOOCs+ODs+ODnOODnOODg+OCr+OCuVxuICAgICoqKioqKioqKioqKioqKioqKioqICovXG4gICAkKCcubGFuZ3VhZ2VTZWxlY3QnKS5jbG9uZSgpLmFwcGVuZFRvKCcucGNMYW5nJyk7XG4gICAgY29uc3QgbGFuZ19mdW5jID0gJChcIi5sYW5ndWFnZVNlbGVjdCAubGFuZ0J0blwiKVxuICAgIGxhbmdfZnVuYy5vbihcImNsaWNrXCIsICgpPT57XG4gICAgICAgICQoZXZlbnQuY3VycmVudFRhcmdldCkubmV4dCgnLmxhbmdMaXN0JykudG9nZ2xlQ2xhc3MoJ2xhbmdTaG93Jyk7XG4gICAgfSlcbiAgICAkKGRvY3VtZW50KS5vbignY2xpY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICQoJy5sYW5nTGlzdCcpLnJlbW92ZUNsYXNzKCdsYW5nU2hvdycpO1xuICAgIH0pXG4gICAgJChkb2N1bWVudCkub24oJ2NsaWNrJywgJy5sYW5ndWFnZVNlbGVjdCcsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfSlcblxuICAgIC8qICoqKioqKioqKioqKioqKioqKioqXG4gICAgKiDjgrnjg57jg5tTTlPjgqLjgqTjgrPjg7NcbiAgICAqIOOCueOCr+ODreODvOODq+WBnOatouaZglxuICAgICoqKioqKioqKioqKioqKioqKioqICovXG4gICAgdmFyIHNjcm9sbFRpbWVvdXRJZDtcblx0d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIixmdW5jdGlvbigpIHtcblx0XHQkKCdib2R5JykuYWRkQ2xhc3MoJ3Njcm9sbE5vdycpO1xuXHRcdGNsZWFyVGltZW91dChzY3JvbGxUaW1lb3V0SWQpO1xuXHRcdHNjcm9sbFRpbWVvdXRJZCA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG5cdFx0XHQkKCdib2R5JykucmVtb3ZlQ2xhc3MoJ3Njcm9sbE5vdycpO1xuXHRcdH0sMzAwKTtcblx0fSk7XG59KVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3Jlc291cmNlcy9hc3NldHMvanMvc2NyaXB0LmpzIiwiLyohXG4gKiBKYXZhU2NyaXB0IENvb2tpZSB2Mi4yLjFcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9qcy1jb29raWUvanMtY29va2llXG4gKlxuICogQ29weXJpZ2h0IDIwMDYsIDIwMTUgS2xhdXMgSGFydGwgJiBGYWduZXIgQnJhY2tcbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZVxuICovXG47KGZ1bmN0aW9uIChmYWN0b3J5KSB7XG5cdHZhciByZWdpc3RlcmVkSW5Nb2R1bGVMb2FkZXI7XG5cdGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHtcblx0XHRkZWZpbmUoZmFjdG9yeSk7XG5cdFx0cmVnaXN0ZXJlZEluTW9kdWxlTG9hZGVyID0gdHJ1ZTtcblx0fVxuXHRpZiAodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKSB7XG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7XG5cdFx0cmVnaXN0ZXJlZEluTW9kdWxlTG9hZGVyID0gdHJ1ZTtcblx0fVxuXHRpZiAoIXJlZ2lzdGVyZWRJbk1vZHVsZUxvYWRlcikge1xuXHRcdHZhciBPbGRDb29raWVzID0gd2luZG93LkNvb2tpZXM7XG5cdFx0dmFyIGFwaSA9IHdpbmRvdy5Db29raWVzID0gZmFjdG9yeSgpO1xuXHRcdGFwaS5ub0NvbmZsaWN0ID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0d2luZG93LkNvb2tpZXMgPSBPbGRDb29raWVzO1xuXHRcdFx0cmV0dXJuIGFwaTtcblx0XHR9O1xuXHR9XG59KGZ1bmN0aW9uICgpIHtcblx0ZnVuY3Rpb24gZXh0ZW5kICgpIHtcblx0XHR2YXIgaSA9IDA7XG5cdFx0dmFyIHJlc3VsdCA9IHt9O1xuXHRcdGZvciAoOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHR2YXIgYXR0cmlidXRlcyA9IGFyZ3VtZW50c1sgaSBdO1xuXHRcdFx0Zm9yICh2YXIga2V5IGluIGF0dHJpYnV0ZXMpIHtcblx0XHRcdFx0cmVzdWx0W2tleV0gPSBhdHRyaWJ1dGVzW2tleV07XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRmdW5jdGlvbiBkZWNvZGUgKHMpIHtcblx0XHRyZXR1cm4gcy5yZXBsYWNlKC8oJVswLTlBLVpdezJ9KSsvZywgZGVjb2RlVVJJQ29tcG9uZW50KTtcblx0fVxuXG5cdGZ1bmN0aW9uIGluaXQgKGNvbnZlcnRlcikge1xuXHRcdGZ1bmN0aW9uIGFwaSgpIHt9XG5cblx0XHRmdW5jdGlvbiBzZXQgKGtleSwgdmFsdWUsIGF0dHJpYnV0ZXMpIHtcblx0XHRcdGlmICh0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0YXR0cmlidXRlcyA9IGV4dGVuZCh7XG5cdFx0XHRcdHBhdGg6ICcvJ1xuXHRcdFx0fSwgYXBpLmRlZmF1bHRzLCBhdHRyaWJ1dGVzKTtcblxuXHRcdFx0aWYgKHR5cGVvZiBhdHRyaWJ1dGVzLmV4cGlyZXMgPT09ICdudW1iZXInKSB7XG5cdFx0XHRcdGF0dHJpYnV0ZXMuZXhwaXJlcyA9IG5ldyBEYXRlKG5ldyBEYXRlKCkgKiAxICsgYXR0cmlidXRlcy5leHBpcmVzICogODY0ZSs1KTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gV2UncmUgdXNpbmcgXCJleHBpcmVzXCIgYmVjYXVzZSBcIm1heC1hZ2
746VcIiBpcyBub3Qgc3VwcG9ydGVkIGJ5IElFXG5cdFx0XHRhdHRyaWJ1dGVzLmV4cGlyZXMgPSBhdHRyaWJ1dGVzLmV4cGlyZXMgPyBhdHRyaWJ1dGVzLmV4cGlyZXMudG9VVENTdHJpbmcoKSA6ICcnO1xuXG5cdFx0XHR0cnkge1xuXHRcdFx0XHR2YXIgcmVzdWx0ID0gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuXHRcdFx0XHRpZiAoL15bXFx7XFxbXS8udGVzdChyZXN1bHQpKSB7XG5cdFx0XHRcdFx0dmFsdWUgPSByZXN1bHQ7XG5cdFx0XHRcdH1cblx0XHRcdH0gY2F0Y2ggKGUpIHt9XG5cblx0XHRcdHZhbHVlID0gY29udmVydGVyLndyaXRlID9cblx0XHRcdFx0Y29udmVydGVyLndyaXRlKHZhbHVlLCBrZXkpIDpcblx0XHRcdFx0ZW5jb2RlVVJJQ29tcG9uZW50KFN0cmluZyh2YWx1ZSkpXG5cdFx0XHRcdFx0LnJlcGxhY2UoLyUoMjN8MjR8MjZ8MkJ8M0F8M0N8M0V8M0R8MkZ8M0Z8NDB8NUJ8NUR8NUV8NjB8N0J8N0R8N0MpL2csIGRlY29kZVVSSUNvbXBvbmVudCk7XG5cblx0XHRcdGtleSA9IGVuY29kZVVSSUNvbXBvbmVudChTdHJpbmcoa2V5KSlcblx0XHRcdFx0LnJlcGxhY2UoLyUoMjN8MjR8MjZ8MkJ8NUV8NjB8N0MpL2csIGRlY29kZVVSSUNvbXBvbmVudClcblx0XHRcdFx0LnJlcGxhY2UoL1tcXChcXCldL2csIGVzY2FwZSk7XG5cblx0XHRcdHZhciBzdHJpbmdpZmllZEF0dHJpYnV0ZXMgPSAnJztcblx0XHRcdGZvciAodmFyIGF0dHJpYnV0ZU5hbWUgaW4gYXR0cmlidXRlcykge1xuXHRcdFx0XHRpZiAoIWF0dHJpYnV0ZXNbYXR0cmlidXRlTmFtZV0pIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRzdHJpbmdpZmllZEF0dHJpYnV0ZXMgKz0gJzsgJyArIGF0dHJpYnV0ZU5hbWU7XG5cdFx0XHRcdGlmIChhdHRyaWJ1dGVzW2F0dHJpYnV0ZU5hbWVdID09PSB0cnVlKSB7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBDb25zaWRlcnMgUkZDIDYyNjUgc2VjdGlvbiA1LjI6XG5cdFx0XHRcdC8vIC4uLlxuXHRcdFx0XHQvLyAzLiAgSWYgdGhlIHJlbWFpbmluZyB1bnBhcnNlZC1hdHRyaWJ1dGVzIGNvbnRhaW5zIGEgJXgzQiAoXCI7XCIpXG5cdFx0XHRcdC8vICAgICBjaGFyYWN0ZXI6XG5cdFx0XHRcdC8vIENvbnN1bWUgdGhlIGNoYXJhY3RlcnMgb2YgdGhlIHVucGFyc2VkLWF0dHJpYnV0ZXMgdXAgdG8sXG5cdFx0XHRcdC8vIG5vdCBpbmNsdWRpbmcsIHRoZSBmaXJzdCAleDNCIChcIjtcIikgY2hhcmFjdGVyLlxuXHRcdFx0XHQvLyAuLi5cblx0XHRcdFx0c3RyaW5naWZpZWRBdHRyaWJ1dGVzICs9ICc9JyArIGF0dHJpYnV0ZXNbYXR0cmlidXRlTmFtZV0uc3BsaXQoJzsnKVswXTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIChkb2N1bWVudC5jb29raWUgPSBrZXkgKyAnPScgKyB2YWx1ZSArIHN0cmluZ2lmaWVkQXR0cmlidXRlcyk7XG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gZ2V0IChrZXksIGpzb24pIHtcblx0XHRcdGlmICh0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0dmFyIGphciA9IHt9O1xuXHRcdFx0Ly8gVG8gcHJldmVudCB0aGUgZm9yIGxvb3AgaW4gdGhlIGZpcnN0IHBsYWNlIGFzc2lnbiBhbiBlbXB0eSBhcnJheVxuXHRcdFx0Ly8gaW4gY2FzZSB0aGVyZSBhcmUgbm8gY29va2llcyBhdCBhbGwuXG5cdFx0XHR2YXIgY29va2llcyA9IGRvY3VtZW50LmNvb2tpZSA/IGRvY3VtZW50LmNvb2tpZS5zcGxpdCgnOyAnKSA6IFtdO1xuXHRcdFx0dmFyIGkgPSAwO1xuXG5cdFx0XHRmb3IgKDsgaSA8IGNvb2tpZXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0dmFyIHBhcnRzID0gY29va2llc1tpXS5zcGxpdCgnPScpO1xuXHRcdFx0XHR2YXIgY29va2llID0gcGFydHMuc2xpY2UoMSkuam9pbignPScpO1xuXG5cdFx0XHRcdGlmICghanNvbiAmJiBjb29raWUuY2hhckF0KDApID09PSAnXCInKSB7XG5cdFx0XHRcdFx0Y29va2llID0gY29va2llLnNsaWNlKDEsIC0xKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0dmFyIG5hbWUgPSBkZWNvZGUocGFydHNbMF0pO1xuXHRcdFx0XHRcdGNvb2tpZSA9IChjb252ZXJ0ZXIucmVhZCB8fCBjb252ZXJ0ZXIpKGNvb2tpZSwgbmFtZSkgfHxcblx0XHRcdFx0XHRcdGRlY29kZShjb29raWUpO1xuXG5cdFx0XHRcdFx0aWYgKGpzb24pIHtcblx0XHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRcdGNvb2tpZSA9IEpTT04ucGFyc2UoY29va2llKTtcblx0XHRcdFx0XHRcdH0gY2F0Y2ggKGUpIHt9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0amFyW25hbWVdID0gY29va2llO1xuXG5cdFx0XHRcdFx0aWYgKGtleSA9PT0gbmFtZSkge1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGNhdGNoIChlKSB7fVxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4ga2V5ID8gamFyW2tleV0gOiBqYXI7XG5cdFx0fVxuXG5cdFx0YXBpLnNldCA9IHNldDtcblx0XHRhcGkuZ2V0ID0gZnVuY3Rpb24gKGtleSkge1xuXHRcdFx0cmV0dXJuIGdldChrZXksIGZhbHNlIC8qIHJlYWQgYXMgcmF3ICovKTtcblx0XHR9O1xuXHRcdGFwaS5nZXRKU09OID0gZnVuY3Rpb24gKGtleSkge1xuXHRcdFx0cmV0dXJuIGdldChrZXksIHRydWUgLyogcmVhZCBhcyBqc29uICovKTtcblx0XHR9O1xuXHRcdGFwaS5yZW1vdmUgPSBmdW5jdGlvbiAoa2V5LCBhdHRyaWJ1dGVzKSB7XG5cdFx0XHRzZXQoa2V5LCAnJywgZXh0ZW5kKGF0dHJpYnV0ZXMsIHtcblx0XHRcdFx0ZXhwaXJlczogLTFcblx0XHRcdH0pKTtcblx0XHR9O1xuXG5cdFx0YXBpLmRlZmF1bHRzID0ge307XG5cblx0XHRhcGkud2l0aENvbnZlcnRlciA9IGluaXQ7XG5cblx0XHRyZXR1cm4gYXBpO1xuXHR9XG5cblx0cmV0dXJuIGluaXQoZnVuY3Rpb24gKCkge30pO1xufSkpO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvanMtY29va2llL3NyYy9qcy5jb29raWUuanNcbi8vIG1vZHVsZSBpZCA9IDJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX2NyZWF0ZUNsYXNzID0gZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci
7465rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSgpO1xuXG52YXIgX2VzNk9iamVjdEFzc2lnbiA9IHJlcXVpcmUoJ2VzNi1vYmplY3QtYXNzaWduJyk7XG5cbnZhciBfdXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpO1xuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG52YXIgZGVmYXVsdHMgPSB7XG4gIHN1Z2dlc3RDbGFzczogJ2lzLWFjdGl2ZScsXG4gIHNjcm9sbGFibGVDbGFzczogJ2lzLXNjcm9sbGFibGUnLFxuICBzY3JvbGxhYmxlUmlnaHRDbGFzczogJ2lzLXJpZ2h0LXNjcm9sbGFibGUnLFxuICBzY3JvbGxhYmxlTGVmdENsYXNzOiAnaXMtbGVmdC1zY3JvbGxhYmxlJyxcbiAgc2Nyb2xsSGludENsYXNzOiAnc2Nyb2xsLWhpbnQnLFxuICBzY3JvbGxIaW50SWNvbkNsYXNzOiAnc2Nyb2xsLWhpbnQtaWNvbicsXG4gIHNjcm9sbEhpbnRJY29uQXBwZW5kQ2xhc3M6ICcnLCAvLyAnc2Nyb2xsLWhpbnQtaWNvbi13aGl0ZSdcbiAgc2Nyb2xsSGludEljb25XcmFwQ2xhc3M6ICdzY3JvbGwtaGludC1pY29uLXdyYXAnLFxuICBzY3JvbGxIaW50VGV4dDogJ3Njcm9sbC1oaW50LXRleHQnLFxuICBzY3JvbGxIaW50Qm9yZGVyV2lkdGg6IDEwLFxuICByZW1haW5pbmdUaW1lOiAtMSxcbiAgZW5hYmxlT3ZlcmZsb3dTY3JvbGxpbmc6IHRydWUsXG4gIGFwcGx5VG9QYXJlbnRzOiBmYWxzZSxcbiAgc3VnZ2VzdGl2ZVNoYWRvdzogZmFsc2UsXG4gIG9mZnNldDogMCxcbiAgaTE4bjoge1xuICAgIHNjcm9sbGFibGU6ICdzY3JvbGxhYmxlJ1xuICB9XG59O1xuXG52YXIgU2Nyb2xsSGludCA9IGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gU2Nyb2xsSGludChlbGUsIG9wdGlvbikge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgU2Nyb2xsSGludCk7XG5cbiAgICB0aGlzLm9wdCA9ICgwLCBfZXM2T2JqZWN0QXNzaWduLmFzc2lnbikoe30sIGRlZmF1bHRzLCBvcHRpb24pO1xuICAgIHRoaXMuaXRlbXMgPSBbXTtcbiAgICB2YXIgZWxlbWVudHMgPSB0eXBlb2YgZWxlID09PSAnc3RyaW5nJyA/IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoZWxlKSA6IGVsZTtcbiAgICB2YXIgYXBwbHlUb1BhcmVudHMgPSB0aGlzLm9wdC5hcHBseVRvUGFyZW50cztcblxuICAgIFtdLmZvckVhY2guY2FsbChlbGVtZW50cywgZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgIGlmIChhcHBseVRvUGFyZW50cykge1xuICAgICAgICBlbGVtZW50ID0gZWxlbWVudC5wYXJlbnRFbGVtZW50O1xuICAgICAgfVxuICAgICAgZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSc7XG4gICAgICBlbGVtZW50LnN0eWxlLm92ZXJmbG93ID0gJ2F1dG8nO1xuICAgICAgaWYgKF90aGlzLm9wdC5lbmFibGVPdmVyZmxvd1Njcm9sbGluZykge1xuICAgICAgICBpZiAoJ292ZXJmbG93U2Nyb2xsaW5nJyBpbiBlbGVtZW50LnN0eWxlKSB7XG4gICAgICAgICAgZWxlbWVudC5zdHlsZS5vdmVyZmxvd1Njcm9sbGluZyA9ICd0b3VjaCc7XG4gICAgICAgIH0gZWxzZSBpZiAoJ3dlYmtpdE92ZXJmbG93U2Nyb2xsaW5nJyBpbiBlbGVtZW50LnN0eWxlKSB7XG4gICAgICAgICAgZWxlbWVudC5zdHlsZS53ZWJraXRPdmVyZmxvd1Njcm9sbGluZyA9ICd0b3VjaCc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHZhciBpdGVtID0ge1xuICAgICAgICBlbGVtZW50OiBlbGVtZW50LFxuICAgICAgICBzY3JvbGxlZEluOiBmYWxzZSxcbiAgICAgICAgaW50ZXJhY3RlZDogZmFsc2VcbiAgICAgIH07XG4gICAgICBkb2
746N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBpZiAoZS50YXJnZXQgPT09IGVsZW1lbnQpIHtcbiAgICAgICAgICBpdGVtLmludGVyYWN0ZWQgPSB0cnVlO1xuICAgICAgICAgIF90aGlzLnVwZGF0ZUl0ZW0oaXRlbSk7XG4gICAgICAgIH1cbiAgICAgIH0sIHRydWUpO1xuICAgICAgKDAsIF91dGlsLmFkZENsYXNzKShlbGVtZW50LCBfdGhpcy5vcHQuc2Nyb2xsSGludENsYXNzKTtcbiAgICAgICgwLCBfdXRpbC5hcHBlbmQpKGVsZW1lbnQsICc8ZGl2IGNsYXNzPVwiJyArIF90aGlzLm9wdC5zY3JvbGxIaW50SWNvbldyYXBDbGFzcyArICdcIiBkYXRhLXRhcmdldD1cInNjcm9sbGFibGUtaWNvblwiPlxcbiAgICAgICAgPHNwYW4gY2xhc3M9XCInICsgX3RoaXMub3B0LnNjcm9sbEhpbnRJY29uQ2xhc3MgKyAoX3RoaXMub3B0LnNjcm9sbEhpbnRJY29uQXBwZW5kQ2xhc3MgPyAnICcgKyBfdGhpcy5vcHQuc2Nyb2xsSGludEljb25BcHBlbmRDbGFzcyA6ICcnKSArICdcIj5cXG4gICAgICAgICAgPGRpdiBjbGFzcz1cIicgKyBfdGhpcy5vcHQuc2Nyb2xsSGludFRleHQgKyAnXCI+JyArIF90aGlzLm9wdC5pMThuLnNjcm9sbGFibGUgKyAnPC9kaXY+XFxuICAgICAgICA8L3NwYW4+XFxuICAgICAgPC9kaXY+Jyk7XG4gICAgICBfdGhpcy5pdGVtcy5wdXNoKGl0ZW0pO1xuICAgIH0pO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBfdGhpcy51cGRhdGVJdGVtcygpO1xuICAgIH0pO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBfdGhpcy51cGRhdGVJdGVtcygpO1xuICAgIH0pO1xuICAgIHRoaXMudXBkYXRlSXRlbXMoKTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhTY3JvbGxIaW50LCBbe1xuICAgIGtleTogJ2lzU2Nyb2xsYWJsZScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGlzU2Nyb2xsYWJsZShpdGVtKSB7XG4gICAgICB2Y
746XIgb2Zmc2V0ID0gdGhpcy5vcHQub2Zmc2V0O1xuICAgICAgdmFyIGVsZW1lbnQgPSBpdGVtLmVsZW1lbnQ7XG4gICAgICB2YXIgb2Zmc2V0V2lkdGggPSBlbGVtZW50Lm9mZnNldFdpZHRoO1xuXG4gICAgICByZXR1cm4gb2Zmc2V0V2lkdGggKyBvZmZzZXQgPCBlbGVtZW50LnNjcm9sbFdpZHRoO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2NoZWNrU2Nyb2xsYWJsZURpcicsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNoZWNrU2Nyb2xsYWJsZURpcihpdGVtKSB7XG4gICAgICB2YXIgX29wdCA9IHRoaXMub3B0LFxuICAgICAgICAgIHNjcm9sbEhpbnRCb3JkZXJXaWR0aCA9IF9vcHQuc2Nyb2xsSGludEJvcmRlcldpZHRoLFxuICAgICAgICAgIHNjcm9sbGFibGVSaWdodENsYXNzID0gX29wdC5zY3JvbGxhYmxlUmlnaHRDbGFzcyxcbiAgICAgICAgICBzY3JvbGxhYmxlTGVmdENsYXNzID0gX29wdC5zY3JvbGxhYmxlTGVmdENsYXNzO1xuICAgICAgdmFyIGVsZW1lbnQgPSBpdGVtLmVsZW1lbnQ7XG5cbiAgICAgIHZhciBjaGlsZCA9IGVsZW1lbnQuY2hpbGRyZW5bMF07XG4gICAgICB2YXIgd2lkdGggPSBjaGlsZC5zY3JvbGxXaWR0aDtcbiAgICAgIHZhciBwYXJlbnRXaWR0aCA9IGVsZW1lbnQub2Zmc2V0V2lkdGg7XG4gICAgICB2YXIgc2Nyb2xsTGVmdCA9IGVsZW1lbnQuc2Nyb2xsTGVmdDtcbiAgICAgIGlmIChwYXJlbnRXaWR0aCArIHNjcm9sbExlZnQgPCB3aWR0aCAtIHNjcm9sbEhpbnRCb3JkZXJXaWR0aCkge1xuICAgICAgICAoMCwgX3V0aWwuYWRkQ2xhc3MpKGVsZW1lbnQsIHNjcm9sbGFibGVSaWdodENsYXNzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICgwLCBfdXRpbC5yZW1vdmVDbGFzcykoZWxlbWVudCwgc2Nyb2xsYWJsZVJpZ2h0Q2xhc3MpO1xuICAgICAgfVxuICAgICAgaWYgKHBhcmVudFdpZHRoIDwgd2lkdGggJiYgc2Nyb2xsTGVmdCA+IHNjcm9sbEhpbnRCb3JkZXJXaWR0aCkge1xuICAgICAgICAoMCwgX3V0aWwuYWRkQ2xhc3MpKGVsZW1lbnQsIHNjcm9sbGFibGVMZWZ0Q2xhc3MpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgKDAsIF91dGlsLnJlbW92ZUNsYXNzKShlbGVtZW50LCBzY3JvbGxhYmxlTGVmdENsYXNzKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICduZWVkU3VnZ2VzdCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG5lZWRTdWdnZXN0KGl0ZW0pIHtcbiAgICAgIHZhciBzY3JvbGxlZEluID0gaXRlbS5zY3JvbGxlZEluLFxuICAgICAgICAgIGludGVyYWN0ZWQgPSBpdGVtLmludGVyYWN0ZWQ7XG5cbiAgICAgIHJldHVybiAhaW50ZXJhY3RlZCAmJiBzY3JvbGxlZEluICYmIHRoaXMuaXNTY3JvbGxhYmxlKGl0ZW0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ3VwZGF0ZUl0ZW1zJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gdXBkYXRlSXRlbXMoKSB7XG4gICAgICB2Y
746XIgX3RoaXMyID0gdGhpcztcblxuICAgICAgW10uZm9yRWFjaC5jYWxsKHRoaXMuaXRlbXMsIGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgIF90aGlzMi51cGRhdGVJdGVtKGl0ZW0pO1xuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAndXBkYXRlU3RhdHVzJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gdXBkYXRlU3RhdHVzKGl0ZW0pIHtcbiAgICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gICAgICB2YXIgZWxlbWVudCA9IGl0ZW0uZWxlbWVudCxcbiAgICAgICAgICBzY3JvbGxlZEluID0gaXRlbS5zY3JvbGxlZEluO1xuXG4gICAgICBpZiAoc2Nyb2xsZWRJbikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoKDAsIF91dGlsLmdldE9mZnNldCkoZWxlbWVudCkudG9wICsgZWxlbWVudC5vZmZzZXRIZWlnaHQgLyAyIDwgKDAsIF91dGlsLmdldFNjcm9sbFRvcCkoKSArIHdpbmRvdy5pbm5lckhlaWdodCkge1xuICAgICAgICBpdGVtLnNjcm9sbGVkSW4gPSB0cnVlO1xuICAgICAgICBpZiAodGhpcy5vcHQucmVtYWluaW5nVGltZSAhPT0gLTEpIHtcbiAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGl0ZW0uaW50ZXJhY3RlZCA9IHRydWU7XG4gICAgICAgICAgICBfdGhpczMudXBkYXRlSXRlbShpdGVtKTtcbiAgICAgICAgICB9LCB0aGlzLm9wdC5yZW1haW5pbmdUaW1lKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ3VwZGF0ZUl0ZW0nLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB1cGRhdGVJdGVtKGl0ZW0pIHtcbiAgICAgIHZhciBvcHQgPSB0aGlzLm9wdDtcbiAgICAgIHZhciBlbGVtZW50ID0gaXRlbS5lbGVtZW50O1xuXG4gICAgICB2Y
746XIgdGFyZ2V0ID0gZWxlbWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS10YXJnZXQ9XCJzY3JvbGxhYmxlLWljb25cIl0nKTtcbiAgICAgIHRoaXMudXBkYXRlU3RhdHVzKGl0ZW0pO1xuICAgICAgaWYgKHRoaXMuaXNTY3JvbGxhYmxlKGl0ZW0pKSB7XG4gICAgICAgICgwLCBfdXRpbC5hZGRDbGFzcykoZWxlbWVudCwgb3B0LnNjcm9sbGFibGVDbGFzcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAoMCwgX3V0aWwucmVtb3ZlQ2xhc3MpKGVsZW1lbnQsIG9wdC5zY3JvbGxhYmxlQ2xhc3MpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMubmVlZFN1Z2dlc3QoaXRlbSkpIHtcbiAgICAgICAgKDAsIF91dGlsLmFkZENsYXNzKSh0YXJnZXQsIG9wdC5zdWdnZXN0Q2xhc3MpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgKDAsIF91dGlsLnJlbW92ZUNsYXNzKSh0YXJnZXQsIG9wdC5zdWdnZXN0Q2xhc3MpO1xuICAgICAgfVxuICAgICAgaWYgKG9wdC5zdWdnZXN0aXZlU2hhZG93KSB7XG4gICAgICAgIHRoaXMuY2hlY2tTY3JvbGxhYmxlRGlyKGl0ZW0pO1xuICAgICAgfVxuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBTY3JvbGxIaW50O1xufSgpO1xuXG5leHBvcnRzLmRlZmF1bHQgPSBTY3JvbGxIaW50O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvc2Nyb2xsLWhpbnQvbGliL2luZGV4LmpzXG4vLyBtb2R1bGUgaWQgPSAzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8qKlxuICogQ29kZSByZWZhY3RvcmVkIGZyb20gTW96aWxsYSBEZXZlbG9wZXIgTmV0d29yazpcbiAqIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL09iamVjdC9hc3NpZ25cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbmZ1bmN0aW9uIGFzc2lnbih0YXJnZXQsIGZpcnN0U291cmNlKSB7XG4gIGlmICh0YXJnZXQgPT09IHVuZGVmaW5lZCB8fCB0YXJnZXQgPT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgY29udmVydCBmaXJzdCBhcmd1bWVudCB0byBvYmplY3QnKTtcbiAgfVxuXG4gIHZhciB0byA9IE9iamVjdCh0YXJnZXQpO1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBuZXh0U291cmNlID0gYXJndW1lbnRzW2ldO1xuICAgIGlmIChuZXh0U291cmNlID09PSB1bmRlZmluZWQgfHwgbmV4dFNvdXJjZSA9PT0gbnVsbCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgdmFyIGtleXNBcnJheSA9IE9iamVjdC5rZXlzKE9iamVjdChuZXh0U291cmNlKSk7XG4gICAgZm9yICh2YXIgbmV4dEluZGV4ID0gMCwgbGVuID0ga2V5c0FycmF5Lmxlbmd0aDsgbmV4dEluZGV4IDwgbGVuOyBuZXh0SW5kZXgrKykge1xuICAgICAgdmFyIG5leHRLZXkgPSBrZXlzQXJyYXlbbmV4dEluZGV4XTtcbiAgICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihuZXh0U291cmNlLCBuZXh0S2V5KTtcbiAgICAgIGlmIChkZXNjICE9PSB1bmRlZmluZWQgJiYgZGVzYy5lbnVtZXJhYmxlKSB7XG4gICAgICAgIHRvW25leHRLZXldID0gbmV4dFNvdXJjZVtuZXh0S2V5XTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRvO1xufVxuXG5mdW5jdGlvbiBwb2x5ZmlsbCgpIHtcbiAgaWYgKCFPYmplY3QuYXNzaWduKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KE9iamVjdCwgJ2Fzc2lnbicsIHtcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICB2YWx1ZTogYXNzaWduXG4gICAgfSk7XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGFzc2lnbjogYXNzaWduLFxuICBwb2x5ZmlsbDogcG9seWZpbGxcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9lczYtb2JqZWN0LWFzc2lnbi9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gNFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG52YXIgYXBwZW5kID0gZXhwb3J0cy5hcHBlbmQgPSBmdW5jdGlvbiBhcHBlbmQoZWxlbWVudCwgc3RyaW5nKSB7XG4gIHZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgZGl2LmlubmVySFRNTCA9IHN0cmluZztcbiAgd2hpbGUgKGRpdi5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgZWxlbWVudC5hcHBlbmRDaGlsZChkaXYuY2hpbGRyZW5bMF0pO1xuICB9XG59O1xuXG52YXIgYWRkQ2xhc3MgPSBleHBvcnRzLmFkZENsYXNzID0gZnVuY3Rpb24gYWRkQ2xhc3MoZWxlbWVudCwgY2xhc3NOYW1lKSB7XG4gIGlmIChlbGVtZW50LmNsYXNzTGlzdCkge1xuICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChjbGFzc05hbWUpO1xuICB9IGVsc2Uge1xuICAgIGVsZW1lbnQuY2xhc3NOYW1lICs9ICcgJyArIGNsYXNzTmFtZTtcbiAgfVxufTtcblxudmFyIHJlbW92ZUNsYXNzID0gZXhwb3J0cy5yZW1vdmVDbGFzcyA9IGZ1bmN0aW9uIHJlbW92ZUNsYXNzKGVsZW1lbnQsIGNsYXNzTmFtZSkge1xuICBpZiAoZWxlbWVudC5jbGFzc0xpc3QpIHtcbiAgICBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoY2xhc3NOYW1lKTtcbiAgfSBlbHNlIHtcbiAgICBlbGVtZW50LmNsYXNzTmFtZSA9IGVsZW1lbnQuY2xhc3NOYW1lLnJlcGxhY2UobmV3IFJlZ0V4cCgnKF58XFxcXGIpJyArIGNsYXNzTmFtZS5zcGxpdCgnICcpLmpvaW4oJ3wnKSArICcoXFxcXGJ8JCknLCAnZ2knKSwgJyAnKTtcbiAgfVxufTtcblxudmFyIGdldFNjcm9sbFRvcCA9IGV4cG9ydHMuZ2V0U2Nyb2xsVG9wID0gZnVuY3Rpb24gZ2V0U2Nyb2xsVG9wKCkge1xuICByZXR1cm4gd2luZG93LnBhZ2VZT2Zmc2V0IHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3AgfHwgZG9jdW1lbnQuYm9keS5zY3JvbGxUb3AgfHwgMDtcbn07XG5cbnZhciBnZXRTY3JvbGxMZWZ0ID0gZXhwb3J0cy5nZXRTY3JvbGxMZWZ0ID0gZnVuY3Rpb24gZ2V0U2Nyb2xsTGVmdCgpIHtcbiAgcmV0dXJuIHdpbmRvdy5wYWdlWE9mZnNldCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdCB8fCBkb2N1bWVudC5ib2R5LnNjcm9sbExlZnQgfHwgMDtcbn07XG5cbnZhciBnZXRPZmZzZXQgPSBleHBvcnRzLmdldE9mZnNldCA9IGZ1bmN0aW9uIGdldE9mZnNldChlbCkge1xuICB2YXIgcmVjdCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICByZXR1cm4ge1xuICAgIHRvcDogcmVjdC50b3AgKyBnZXRTY3JvbGxUb3AoKSxcbiAgICBsZWZ0OiByZWN0LmxlZnQgKyBnZXRTY3JvbGxMZWZ0KClcbiAgfTtcbn07XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvc2Nyb2xsLWhpbnQvbGliL3V0aWwuanNcbi8vIG1vZHVsZSBpZCA9IDVcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gcmVtb3ZlZCBieSBleHRyYWN0LXRleHQtd2VicGFjay1wbHVnaW5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL3Jlc291cmNlcy9hc3NldHMvc2Nzcy9zdHlsZS5zY3NzXG4vLyBtb2R1bGUgaWQgPSA2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIHJlbW92ZWQgYnkgZXh0cmFjdC10ZX
746h0LXdlYnBhY2stcGx1Z2luXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9yZXNvdXJjZXMvYXNzZXRzL3Njc3Mvc2xpY2suc2Nzc1xuLy8gbW9kdWxlIGlkID0gN1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyByZW1vdmVkIGJ5IGV4dHJhY3QtdGV4dC13ZWJwYWNrLXBsdWdpblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vcmVzb3VyY2VzL2Fzc2V0cy9zY3NzL3JlbW9kYWwuc2Nzc1xuLy8gbW9kdWxlIGlkID0gOFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyByZW1vdmVkIGJ5IGV4dHJhY3QtdGV4dC13ZWJwYWNrLXBsdWdpblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vcmVzb3VyY2VzL2Fzc2V0cy9zY3NzL2xvZ29fYW5pbWF0aW9uLnNjc3Ncbi8vIG1vZHVsZSBpZCA9IDlcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sInNvdXJjZVJvb3QiOiIifQ==

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.