PageSourceSearch

https://www.viniportugal.pt/static/js/navbar.view.js

js viniportugal.pt collected 2026-10-02 08:17:51 UTC 79,485 bytes, 1,023 lines download raw bytes

1$(document).ready(function () {
2  if ($("body").scrollTop() > 0) {
3    $("nav.navbar").addClass("navbar--scrolled");
4  } else {
5    $("nav.navbar").removeClass("navbar--scrolled");
6  }
7});
8
9(function () {
10  function r(e, n, t) {
11    function o(i, f) {
12      if (!n[i]) {
13        if (!e[i]) {
14          var c = "function" == typeof require && require;
15          if (!f && c) return c(i, !0);
16          if (u) return u(i, !0);
17          var a = new Error("Cannot find module '" + i + "'");
18          throw ((a.code = "MODULE_NOT_FOUND"), a);
19        }
20        var p = (n[i] = { exports: {} });
21        e[i][0].call(
22          p.exports,
23          function (r) {
24            var n = e[i][1][r];
25            return o(n || r);
26          },
27          p,
28          p.exports,
29          r,
30          e,
31          n,
32          t
33        );
34      }
35      return n[i].exports;
36    }
37    for (
38      var u = "function" == typeof require && require, i = 0;
39      i < t.length;
40      i++
41    )
42      o(t[i]);
43    return o;
44  }
45  return r;
46})()(
47  {
48    1: [
49      function (require, module, exports) {
50        "use strict";
51
52        var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
53
54        Object.defineProperty(exports, "__esModule", {
55          value: true,
56        });
57        exports.Accordion = void 0;
58
59        var _classCallCheck2 = _interopRequireDefault(
60          require("@babel/runtime/helpers/classCallCheck")
61        );
62
63        var _defineProperty2 = _interopRequireDefault(
64          require("@babel/runtime/helpers/defineProperty")
65        );
66
67        function ownKeys(object, enumerableOnly) {
68          var keys = Object.keys(object);
69          if (Object.getOwnPropertySymbols) {
70            var symbols = Object.getOwnPropertySymbols(object);
71            if (enumerableOnly) {
72              symbols = symbols.filter(function (sym) {
73                return Object.getOwnPropertyDescriptor(object, sym).enumerable;
74              });
75            }
76            keys.push.apply(keys, symbols);
77          }
78          return keys;
79        }
80
81        function _objectSpread(target) {
82          for (var i = 1; i < arguments.length; i++) {
83            var source = arguments[i] != null ? arguments[i] : {};
84            if (i % 2) {
85              ownKeys(Object(source), true).forEach(function (key) {
86                (0, _defineProperty2.default)(target, key, source[key]);
87              });
88            } else if (Object.getOwnPropertyDescriptors) {
89              Object.defineProperties(
90                target,
91                Object.getOwnPropertyDescriptors(source)
92              );
93            } else {
94              ownKeys(Object(source)).forEach(function (key) {
95                Object.defineProperty(
96                  target,
97                  key,
98                  Object.getOwnPropertyDescriptor(source, key)
99                );
100              });
101            }
102          }
103          return target;
104        }
105
106        /**
107         *
108         ***** RELATED IMPORTS *****
109         *
110         * assets/sass/components/_accordion.scss
111         *
112         ***** USAGE *****
113         *
114         * HTML
115         *
116         *
117         * <div class="accordion">
118         *      <div class="accordion__toggle">
119         *          Title
120         *      </div>
121         *      <div class="accordion__content-wrapper">
122         *          <div class="accordion__content-wrapper__content">
123         *              <!-- content -->
124         *          </div>
125         *      </div>
126         *  </div>
127         *
128         *
129         * JAVASCRIPT
130         *
131         * new Accordion(element, OPTIONS);
132         *
133         * -- element: the html element to convert to this component
134         * -- OPTIONS: component options, check DEFAULT_OPTIONS below
135         *
136         ***** ACCESSIBILITY TO THE CLASS ****
137         *
138         * const storedAccordion = new Accordion();
139         * document.querySelector("#accordion-id").Accordion;
140         *
141         ***** PUBLIC METHODS *****
142         *
143         * isActive() - returns true/false depending on the accordion state
144         * toggleActive(boolean) - changes the accordion state
145         *
146         *
147         */
148        var DEFAULT_OPTIONS = {
149          enableIcon: true,
150        };
151
152        var Accordion = function Accordion(element, options) {
153          var _this = this;
154
155          (0, _classCallCheck2.default)(this, Accordion);
156          (0, _defineProperty2.default)(this, "isActive", function () {
157            return _this.element.classList.contains("accordion--active");
158          });
159          (0, _defineProperty2.default)(this, "toggleActive", function () {
160            if (_this.isActive())
161              _this.element.classList.remove("accordion--active");
162            else _this.element.classList.add("accordion--active");
163
164            _this.refreshHeight();
165          });
166          (0, _defineProperty2.default)(this, "refreshHeight", function () {
167            var isActive = _this.isActive();
168
169            var contentHeight = _this.content.offsetHeight;
170
171            if (isActive) {
172              _this.wrapper.style.height = "".concat(contentHeight, "px");
173              setTimeout(function () {
174                _this.wrapper.style.height = "auto";
175              }, 300);
176            } else {
177              _this.wrapper.style.height = "".concat(contentHeight, "px");
178              setTimeout(function () {
179                return (_this.wrapper.style.height = 0);
180              }, 0);
181            }
182          });
183          this.options = _objectSpread(
184            _objectSpread({}, DEFAULT_OPTIONS),
185            options
186          );
187          if (element.Accordion) return;
188          this.element = element;
189          this.toggleZone = element.querySelector(".accordion__toggle");
190          this.wrapper = element.querySelector(".accordion__content-wrapper");
191          this.content = element.querySelector(
192            ".accordion__content-wrapper__content"
193          );
194          this.element.Accordion = this;
195          this.element.classList.add("accordion");
196          this.refreshHeight();
197
198          if (this.options.enableIcon) {
199            this.toggleZone.innerHTML +=
200              '\n                <svg class="accordion__toggle__icon" width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">\n                    <path fill-rule="evenodd" clip-rule="evenodd" d="M9.25105 6.25105C9.58579 5.91632 10.1285 5.91632 10.4632 6.25105L15.6061 11.3939C15.9408 11.7286 15.9408 12.2714 15.6061 12.6061L10.4632 17.7489C10.1285 18.0837 9.58579 18.0837 9.25105 17.7489C8.91632 17.4142 8.91632 16.8715 9.25105 16.5368L13.7878 12L9.25105 7.46323C8.91632 7.1285 8.91632 
2006.58579 9.25105 6.25105Z" fill="currentColor"/>\n                    <path fill-rule="evenodd" clip-rule="evenodd" d="M12 22.5C17.799 22.5 22.5 17.799 22.5 12C22.5 6.20101 17.799 1.5 12 1.5C6.20101 1.5 1.5 6.20101 1.5 12C1.5 17.799 6.20101 22.5 12 22.5ZM12 24C18.6274 24 24 18.6274 24 12C24 5.37258 18.6274 0 12 0C5.37258 0 0 5.37258 0 12C0 18.6274 5.37258 24 12 24Z" fill="currentColor"/>\n                </svg>\n            ';
201          }
202
203          this.toggleZone.parentNode.addEventListener("click", function () {
204            _this.toggleActive();
205          });
206        };
207
208        exports.Accordion = Accordion;
209      },
210      {
211        "@babel/runtime/helpers/classCallCheck": 4,
212        "@babel/runtime/helpers/defineProperty": 6,
213        "@babel/runtime/helpers/interopRequireDefault": 7,
214      },
215    ],
216    2: [
217      function (require, module, exports) {
218        "use strict";
219
220        var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
221
222        Object.defineProperty(exports, "__esModule", {
223          value: true,
224        });
225        exports.NavbarView = void 0;
226
227        var _classCallCheck2 = _interopRequireDefault(
228          require("@babel/runtime/helpers/classCallCheck")
229        );
230
231        var _createClass2 = _interopRequireDefault(
232          require("@babel/runtime/helpers/createClass")
233        );
234
235        var _defineProperty2 = _interopRequireDefault(
236          require("@babel/runtime/helpers/defineProperty")
237        );
238
239        var _accordion = require("./accordion");
240
241        var _languagePreference = require("../language-preference");
242
243        $(function () {
244          var navbarView = new NavbarView();
245          navbarView.bindOnLanguageSelection(function (language) {
246            _languagePreference.LanguagePreference.storeLanguage(
247              language.toLowerCase()
248            );
249          });
250        });
251
252        var NavbarView = /*#__PURE__*/ (function () {
253          function NavbarView() {
254            var _this = this;
255
256            (0, _classCallCheck2.default)(this, NavbarView);
257            (0, _defineProperty2.default)(
258              this,
259              "searchKeyPress",
260              function (ev) {
261                switch (ev.key) {
262                  case "Escape":
263                    _this.toggleSearch(false);
264
265                    break;
266
267                  case "Enter":
268                    _this.doSearch();
269
270                    break;
271
272                  default:
273                    break;
274                }
275              }
276            );
277            (0, _defineProperty2.default)(this, "doSearch", function () {
278              var text = _this.searchInput.value;
279              if (text)
280                window.location.href = general_search_link + "?q=" + text;
281            });
282            (0, _defineProperty2.default)(
283              this,
284              "toggleSearch",
285              function (enabled) {
286                if (_this.isSearchActive == enabled) return;
287                _this.isSearchActive = enabled;
288
289                if (enabled) {
290                  _this.searchWrapper.style.display = "flex";
291                  setTimeout(function () {
292                    _this.searchWrapper.classList.add(
293                      _this.searchWrapperActiveClass
294                    );
295
296                    _this.searchInput.focus();
297                  }, 0);
298
299                  _this.documentHtml.classList.add("search-enabled");
300
301                  document.addEventListener("keyup", _this.searchKeyPress);
302                } else {
303                  _this.searchWrapper.classList.remove(
304                    _this.searchWrapperActiveClass
305                  );
306
307                  setTimeout(function () {
308                    if (!_this.isSearchActive)
309                      _this.searchWrapper.style.display = "none";
310                  }, 300);
311
312                  _this.documentHtml.classList.remove("search-enabled");
313
314                  document.removeEventListener("keyup", _this.searchKeyPress);
315                }
316              }
317            );
318            (0, _defineProperty2.default)(
319              this,
320              "bindOnLanguageSelection",
321              function (callback) {
322                _this.onLanguageSelection = callback;
323              }
324            );
325            this.navbarClass = "navbar";
326            this.navbarActiveClass = "".concat(this.navbarClass, "--active");
327            this.scrolledClass = "".concat(this.navbarClass, "--scrolled");
328            this.isScrolledDown = false;
329            this.menuClass = "menu";
330            this.activeMenuClass = "".concat(this.menuClass, "--active");
331            this.isMenuOpen = false;
332            this.navigationClass = "".concat(this.navbarClass, "__navigation");
333            this.navigationItemDropdownActiveClass = "".concat(
334              this.navigationClass,
335              "__item--dropdown-active"
336            );
337            this.dropdownWrapperClass = "".concat(
338              this.navigationClass,
339              "__dropdown-wrapper"
340            );
341            this.dropdownWrapperHiddenClass = "".concat(
342              this.dropdownWrapperClass,
343              "--hidden"
344            );
345            this.dropdownWrapperActiveClass = "".concat(
346              this.dropdownWrapperClass,
347              "--active"
348            );
349            this.dropdownClass = "".concat(
350              this.dropdownWrapperClass,
351              "__dropdown"
352            );
353            this.dropdownItemClass = "".concat(this.dropdownClass, "__item");
354            this.dropdownItemActiveClass = "".concat(
355              this.dropdownItemClass,
356              "--active"
357            );
358            this.searchWrapperClass = "search-wrapper";
359            this.searchWrapperActiveClass = "".concat(
360              this.searchWrapperClass,
361              "--active"
362            );
363            this.searchWrapperCloseClass = "".concat(
364              this.searchWrapperClass,
365              "__close"
366            );
367            this.searchWrapperContentClass = "".concat(
368              this.searchWrapperClass,
369              "__content"
370            );
371            this.searchInputClass = "".concat(
372              this.searchWrapperContentClass,
373              "__input-wrapper__input"
374            );
375            this.searchInputIconClass = "".concat(
376              this.searchWrapperContentClass,
377              "__input-wrapper__icon"
378            );
379            this.navigation = document.querySelector(
380              ".".concat(this.navigationClass)
381            );
382            this.dropdownWrapper = this.navigation.querySelector(
383              ".".concat(this.dropdownWrapperClass)
384            );
385            this.dropdown = this.dropdownWrapper.querySelector(
386              ".".concat(this.dropdownClass)
387            );
388            this.navigationItems = this.navigation.querySelectorAll(
389              ".".concat(this.navigationClass, "__item")
390            );
391            this.menu = document.querySelector(".".concat(this.menuClass));
392            this.navbar = document.querySelector(".".concat(this.navbarClass));
393            this.openMenuButton = document.getElementById("navbar-menu");
394            this.closeMenuButton = document.getElementById("navbar-menu-close");
395            this.searchWrapper = document.querySelector(
396              ".".concat(this.searchWrapperClass)
397            );
398            this.searchWrapperContent = this.searchWrapper.querySelector(
399              ".".concat(this.searchWrapperContentClass)
400            );
401            this.searchInput = this.searchWrapper.querySelector(
402              ".".concat(this.searchInputClass)
403            );
404            this.searchInputIcon = this.searchWrapper.querySelector(
405              ".".concat(this.searchInputIconClass)
406            );
407            this.searchClose = this.searchWrapper.querySelector(
408              ".".concat(this.searchWrapperCloseClass)
409            );
410            this.searchButton = this.navbar.querySelector(
411              ".navbar__shortcut__icon"
412            );
413            this.documentHtml = document.querySelector("html");
414            this.isSearchActive = false;
415            this.languageSelectorLists = Array.from(
416              document.querySelectorAll(".language-selector__dropdown")
417            );
418            this.init();
419          }
420
421          (0, _createClass2.default)(NavbarView, [
422            {
423              key: "init",
424              value: function init() {
425                var _this2 = this;
426
427                // search
428                this.searchButton.addEventListener("click", function () {
429                  return _this2.toggleSearch(true);
430                });
431                this.searchClose.addEventListener("click", function () {
432                  return _this2.toggleSearch(false);
433                });
434                this.searchInputIcon.addEventListener("click", this.doSearch);
435                this.searchWrapper.addEventListener("click", function () {
436                  return _this2.toggleSearch(false);
437                });
438                this.searchWrapperContent.addEventListener(
439                  "click",
440                  function (e) {
441                    return e.stopPropagation();
442                  }
443                ); // end search
444
445                window.addEventListener("scroll", function () {
446                  return _this2.onNavbarScroll();
447                });
448                document
449                  .querySelectorAll(".accordion")
450                  .forEach(function (element) {
451                    return new _accordion.Accordion(element);
452                  });
453
454                var setHiddenClass = function setHiddenClass() {
455                  setTimeout(function () {
456                    if (
457                      !_this2.dropdownWrapper.classList.contains(
458                        _this2.dropdownWrapperActiveClass
459                      )
460                    ) {
461                      _this2.dropdownWrapper.classList.add(
462                        _this2.dropdownWrapperHiddenClass
463                      );
464                    }
465                  }, 250);
466                };
467
468                this.navigation.addEventListener("mouseleave", function () {
469                  _this2.dropdown.classList.remove(_this2.dropdownActiveClass);
470
471                  _this2.dropdownHoveredElement = null;
472                  //_this2.dropdownWrapper.style.height = "0px";
473                  _this2.dropdownWrapper.style.opacity = "0";
474                  _this2.dropdownWrapper.style.visibility = "hidden";
475                  document
476                    .querySelector(".navbar")
477                    .classList.remove("active--submenu");
478
479                  _this2.dropdownWrapper.classList.remove(
480                    _this2.dropdownWrapperActiveClass
481                  );
482
483                  var item = _this2.navigation.querySelector(
484                    ".".concat(_this2.navigationItemDropdownActiveClass)
485                  );
486
487                  if (item)
488                    item.classList.remove(
489                      _this2.navigationItemDropdownActiveClass
490                    );
491                  setHiddenClass();
492                });
493
494                var updateDropdown = function updateDropdown(
495                  el,
496                  items,
497                  title,
498                  menuD
499                ) {
500                  var parentLeft = _this2.navigation.offsetLeft;
501                  var targetLeft = el.offsetLeft - parentLeft;
502
503                  if (!items.length) {
504                    _this2.dropdownHoveredElement = null;
505                    _this2.dropdown.innerHTML = "";
506                    //_this2.dropdownWrapper.style.height = "0px";
507                    //_this2.dropdownWrapper.style.display = "none";
508                    _this2.dropdownWrapper.style.opacity = "0";
509                    _this2.dropdownWrapper.style.visibility = "hidden";
510                    document
511                      .querySelector(".navbar")
512                      .classList.remove("active--submenu");
513
514                    _this2.dropdownWrapper.classList.remove(
515                      _this2.dropdownWrapperActiveClass
516                    );
517
518                    setHiddenClass();
519                    return;
520                  }
521
522                  el.classList.add(_this2.navigationItemDropdownActiveClass);
523                  var html = "";
524                  html += '<div class="menu--intro">';
525                  html += "<h3>" + title + "</h3>";
526                  html += "<p>" + menuD + "</p>";
527                  html += "</div>";
528                  html += '<div class="grid--menus-itens">';
529                  items.forEach(function (item) {
530                    var url = item.url,
531                      isActive = item.isActive,
532                      name = item.name;
533                    html += '<a href="'
534                      .concat(url, '" class="')
535                      .concat(_this2.dropdownItemClass)
536                      .concat(
537                        isActive
538                          ? " ".concat(_this2.dropdownItemActiveClass)
539                          : "",
540                        '">'
541                      )
542                      .concat(name, "</a>");
543                  });
544                  html += "</div>";
545                  _this2.dropdown.innerHTML = html;
546                  _this2.dropdownWrapper.style.height = "auto";
547                  //_this2.dropdownWrapper.style.transform = "translateX(".concat(targetLeft, "px)");
548                  //_this2.dropdownWrapper.style.display = "block";
549                  _this2.dropdownWrapper.style.opacity = "1";
550                  _this2.dropdownWrapper.style.visibility = "visible";
551                  document
552                    .querySelector(".navbar")
553                    .classList.add("active--submenu");
554
555                  _this2.dropdownWrapper.classList.add(
556                    _this2.dropdownWrapperActiveClass
557                  );
558                };
559
560                var getElementData = function getElementData(el) {
561                  if (!el.parsedData) {
562                    el.parsedData = JSON.parse(el.getAttribute("data") || "[]");
563                  }
564
565                  return el.parsedData;
566                };
567
568                this.navigationItems.forEach(function (el) {
569                  el.addEventListener("mouseover", function () {
570                    if (_this2.dropdownHoveredElement == el) return;
571                    _this2.dropdownHoveredElement = el;
572
573                    var item = _this2.navigation.querySelector(
574                      ".".concat(_this2.navigationItemDropdownActiveClass)
575                    );
576
577                    if (item)
578                      item.classList.remove(
579                        _this2.navigationItemDropdownActiveClass
580                      );
581                    var items = getElementData(el);
582                    var title = el.getAttribute("menu");
583                    var menuD = el.getAttribute("menuD");
584
585                    if (
586                      _this2.dropdownWrapper.classList.contains(
587                        _this2.dropdownWrapperHiddenClass
588                      )
589                    ) {
590                      if (!items.length) return;
591                      var parentLeft = _this2.navigation.offsetLeft;
592                      var targetLeft = el.offsetLeft - parentLeft;
593                      //_this2.dropdownWrapper.style.transform = "translateX(0px)";
594                      setTimeout(function () {
595                        _this2.dropdownWrapper.classList.remove(
596                          _this2.dropdownWrapperHiddenClass
597                        );
598
599                        updateDropdown(el, items, title, menuD);
600                      }, 10);
601                    } else updateDropdown(el, items, title, menuD);
602                  });
603                });
604
605                this.openMenuButton.addEventListener("click", function () {
606                  return _this2.updateMenu(true);
607                });
608                this.closeMenuButton.addEventListener("click", function () {
609                  return _this2.updateMenu(false);
610                });
611                this.watchLanguageSelection();
612              },
613            },
614            {
615              key: "onNavbarScroll",
616              value: function onNavbarScroll() {
617                var THRESHOLD = 4;
618                var scrolledY = Math.round(window.scrollY);
619                var remValue = parseInt(
620                  window.getComputedStyle(document.body).fontSize
621                );
622                var scrollInRem = Math.min(
623                  THRESHOLD,
624                  (scrolledY * 1) / remValue
625                );
626                var userSrolledDown = scrollInRem === THRESHOLD;
627
628                if (userSrolledDown && !this.isScrolledDown) {
629                  this.navbar.classList.add(this.scrolledClass);
630                  this.isScrolledDown = true;
631                } else if (!userSrolledDown && this.isScrolledDown) {
632                  this.navbar.classList.remove(this.scrolledClass);
633                  this.isScrolledDown = false;
634                }
635              },
636            },
637            {
638              key: "updateMenu",
639              value: function updateMenu(isOpen) {
640                this.isMenuOpen = isOpen;
641
642                if (isOpen) {
643                  document.documentElement.style.overflow = "hidden";
644                  this.navbar.classList.add(this.navbarActiveClass);
645                  this.menu.classList.add(this.activeMenuClass);
646                } else {
647                  document.documentElement.style.overflow = "";
648                  this.navbar.classList.remove(this.navbarActiveClass);
649                  this.menu.classList.remove(this.activeMenuClass);
650                }
651              },
652            },
653            {
654              key: "watchLanguageSelection",
655              value: function watchLanguageSelection() {
656                var _this3 = this;
657
658                this.languageSelectorLists.forEach(function (languageList) {
659                  languageList.addEventListener(
660                    "click",
661                    function (e) {
662                      var languageItem = e.target.closest(
663                        ".language-selector__dropdown__item"
664                      );
665
666                      if (languageItem) {
667                        var language =
668                          languageItem.getAttribute("data-language");
669
670                        _this3.onLanguageSelection(language);
671                      }
672                    },
673                    {
674                      passive: true,
675                    }
676                  );
677                });
678              },
679            },
680          ]);
681          return NavbarView;
682        })();
683
684        exports.NavbarView = NavbarView;
685      },
686      {
687        "../language-preference": 3,
688        "./accordion": 1,
689        "@babel/runtime/helpers/classCallCheck": 4,
690        "@babel/runtime/helpers/createClass": 5,
691        "@babel/runtime/helpers/defineProperty": 6,
692        "@babel/runtime/helpers/interopRequireDefault": 7,
693      },
694    ],
695    3: [
696      function (require, module, exports) {
697        "use strict";
698
699        var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
700
701        Object.defineProperty(exports, "__esModule", {
702          value: true,
703        });
704        exports.LanguagePreference = void 0;
705
706        var _classCallCheck2 = _interopRequireDefault(
707          require("@babel/runtime/helpers/classCallCheck")
708        );
709
710        var _createClass2 = _interopRequireDefault(
711          require("@babel/runtime/helpers/createClass")
712        );
713
714        var _jsCookie = _interopRequireDefault(require("js-cookie"));
715
716        var LANGUAGE_PREFERENCE_STORAGE_KEY = "django_language";
717
718        var LanguagePreference = /*#__PURE__*/ (function () {
719          function LanguagePreference() {
720            (0, _classCallCheck2.default)(this, LanguagePreference);
721          }
722
723          (0, _createClass2.default)(LanguagePreference, null, [
724            {
725              key: "storeLanguage",
726              value: function storeLanguage(language) {
727                return _jsCookie.default.set(
728                  LANGUAGE_PREFERENCE_STORAGE_KEY,
729                  language,
730                  {
731                    sameSite: "strict",
732                    secure: true,
733                    expires: 30,
734                  }
735                );
736              },
737            },
738            {
739              key: "getStoredLanguage",
740              value: function getStoredLanguage() {
741                return _jsCookie.default.get(LANGUAGE_PREFERENCE_STORAGE_KEY);
742              },
743            },
744          ]);
745          return LanguagePreference;
746        })();
747
748        exports.LanguagePreference = LanguagePreference;
749      },
750      {
751        "@babel/runtime/helpers/classCallCheck": 4,
752        "@babel/runtime/helpers/createClass": 5,
753        "@babel/runtime/helpers/interopRequireDefault": 7,
754        "js-cookie": 8,
755      },
756    ],
757    4: [
758      function (require, module, exports) {
759        function _classCallCheck(instance, Constructor) {
760          if (!(instance instanceof Constructor)) {
761            throw new TypeError("Cannot call a class as a function");
762          }
763        }
764
765        module.exports = _classCallCheck;
766        (module.exports["default"] = module.exports),
767          (module.exports.__esModule = true);
768      },
769      {},
770    ],
771    5: [
772      function (require, module, exports) {
773        function _defineProperties(target, props) {
774          for (var i = 0; i < props.length; i++) {
775            var descriptor = props[i];
776            descriptor.enumerable = descriptor.enumerable || false;
777            descriptor.configurable = true;
778            if ("value" in descriptor) descriptor.writable = true;
779            Object.defineProperty(target, descriptor.key, descriptor);
780          }
781        }
782
783        function _createClass(Constructor, protoProps, staticProps) {
784          if (protoProps) _defineProperties(Constructor.prototype, protoProps);
785          if (staticProps) _defineProperties(Constructor, staticProps);
786          return Constructor;
787        }
788
789        module.exports = _createClass;
790        (module.exports["default"] = module.exports),
791          (module.exports.__esModule = true);
792      },
793      {},
794    ],
795    6: [
796      function (require, module, exports) {
797        function _defineProperty(obj, key, value) {
798          if (key in obj) {
799            Object.defineProperty(obj, key, {
800              value: value,
801              enumerable: true,
802              configurable: true,
803              writable: true,
804            });
805          } else {
806            obj[key] = value;
807          }
808
809          return obj;
810        }
811
812        module.exports = _defineProperty;
813        (module.exports["default"] = module.exports),
814          (module.exports.__esModule = true);
815      },
816      {},
817    ],
818    7: [
819      function (require, module, exports) {
820        function _interopRequireDefault(obj) {
821          return obj && obj.__esModule
822            ? obj
823            : {
824                default: obj,
825              };
826        }
827
828        module.exports = _interopRequireDefault;
829        (module.exports["default"] = module.exports),
830          (module.exports.__esModule = true);
831      },
832      {},
833    ],
834    8: [
vendor: 6,907 bytes, lines 835-1023
835      function (require, module, exports) {
836        /*!
837         * JavaScript Cookie v2.2.1
838         * https://github.com/js-cookie/js-cookie
839         *
840         * Copyright 2006, 2015 Klaus Hartl & Fagner Brack
841         * Released under the MIT license
842         */
843        (function (factory) {
844          var registeredInModuleLoader;
845          if (typeof define === "function" && define.amd) {
846            define(factory);
847            registeredInModuleLoader = true;
848          }
849          if (typeof exports === "object") {
850            module.exports = factory();
851            registeredInModuleLoader = true;
852          }
853          if (!registeredInModuleLoader) {
854            var OldCookies = window.Cookies;
855            var api = (window.Cookies = factory());
856            api.noConflict = function () {
857              window.Cookies = OldCookies;
858              return api;
859            };
860          }
861        })(function () {
862          function extend() {
863            var i = 0;
864            var result = {};
865            for (; i < arguments.length; i++) {
866              var attributes = arguments[i];
867              for (var key in attributes) {
868                result[key] = attributes[key];
869              }
870            }
871            return result;
872          }
873
874          function decode(s) {
875            return s.replace(/(%[0-9A-Z]{2})+/g, decodeURIComponent);
876          }
877
878          function init(converter) {
879            function api() {}
880
881            function set(key, value, attributes) {
882              if (typeof document === "undefined") {
883                return;
884              }
885
886              attributes = extend(
887                {
888                  path: "/",
889                },
890                api.defaults,
891                attributes
892              );
893
894              if (typeof attributes.expires === "number") {
895                attributes.expires = new Date(
896                  new Date() * 1 + attributes.expires * 864e5
897                );
898              }
899
900              // We're using "expires" because "max-age" is not supported by IE
901              attributes.expires = attributes.expires
902                ? attributes.expires.toUTCString()
903                : "";
904
905              try {
906                var result = JSON.stringify(value);
907                if (/^[\{\[]/.test(result)) {
908                  value = result;
909                }
910              } catch (e) {}
911
912              value = converter.write
913                ? converter.write(value, key)
914                : encodeURIComponent(String(value)).replace(
915                    /%(23|24|26|2B|3A|3C|3E|3D|2F|3F|40|5B|5D|5E|60|7B|7D|7C)/g,
916                    decodeURIComponent
917                  );
918
919              key = encodeURIComponent(String(key))
920                .replace(/%(23|24|26|2B|5E|60|7C)/g, decodeURIComponent)
921                .replace(/[\(\)]/g, escape);
922
923              var stringifiedAttributes = "";
924              for (var attributeName in attributes) {
925                if (!attributes[attributeName]) {
926                  continue;
927                }
928                stringifiedAttributes += "; " + attributeName;
929                if (attributes[attributeName] === true) {
930                  continue;
931                }
932
933                // Considers RFC 6265 section 5.2:
934                // ...
935                // 3.  If the remaining unparsed-attributes contains a %x3B (";")
936                //     character:
937                // Consume the characters of the unparsed-attributes up to,
938                // not including, the first %x3B (";") character.
939                // ...
940                stringifiedAttributes +=
941                  "=" + attributes[attributeName].split(";")[0];
942              }
943
944              return (document.cookie =
945                key + "=" + value + stringifiedAttributes);
946            }
947
948            function get(key, json) {
949              if (typeof document === "undefined") {
950                return;
951              }
952
953              var jar = {};
954              // To prevent the for loop in the first place assign an empty array
955              // in case there are no cookies at all.
956              var cookies = document.cookie ? document.cookie.split("; ") : [];
957              var i = 0;
958
959              for (; i < cookies.length; i++) {
960                var parts = cookies[i].split("=");
961                var cookie = parts.slice(1).join("=");
962
963                if (!json && cookie.charAt(0) === '"') {
964                  cookie = cookie.slice(1, -1);
965                }
966
967                try {
968                  var name = decode(parts[0]);
969                  cookie =
970                    (converter.read || converter)(cookie, name) ||
971                    decode(cookie);
972
973                  if (json) {
974                    try {
975                      cookie = JSON.parse(cookie);
976                    } catch (e) {}
977                  }
978
979                  jar[name] = cookie;
980
981                  if (key === name) {
982                    break;
983                  }
984                } catch (e) {}
985              }
986
987              return key ? jar[key] : jar;
988            }
989
990            api.set = set;
991            api.get = function (key) {
992              return get(key, false /* read as raw */);
993            };
994            api.getJSON = function (key) {
995              return get(key, true /* read as json */);
996            };
997            api.remove = function (key, attributes) {
998              set(
999                key,
1000                "",
1001                extend(attributes, {
1002                  expires: -1,
1003                })
1004              );
1005            };
1006
1007            api.defaults = {};
1008
1009            api.withConverter = init;
1010
1011            return api;
1012          }
1013
1014          return init(function () {});
1015        });
1016      },
1017      {},
1018    ],
1019  },
1020  {},
1021  [2]
1022);
1023//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJhc3NldHMvanMvY29tcG9uZW50cy9hY2NvcmRpb24uanMiLCJhc3NldHMvanMvY29tcG9uZW50cy9uYXZiYXIudmlldy5qcyIsImFzc2V0cy9qcy9sYW5ndWFnZS1wcmVmZXJlbmNlLmpzIiwibm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2suanMiLCJub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVDbGFzcy5qcyIsIm5vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5LmpzIiwibm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0LmpzIiwibm9kZV9tb2R1bGVzL2pzLWNvb2tpZS9zcmMvanMuY29va2llLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQSxJQUFNLGVBQWUsR0FBRztBQUNwQixFQUFBLFVBQVUsRUFBRTtBQURRLENBQXhCOztJQUlhLFMsR0FDVCxtQkFBWSxPQUFaLEVBQXFCLE9BQXJCLEVBQThCO0FBQUE7O0FBQUE7QUFBQSxrREFn
1023Q25CO0FBQUEsV0FBTSxLQUFJLENBQUMsT0FBTCxDQUFhLFNBQWIsQ0FBdUIsUUFBdkIsQ0FBZ0MsbUJBQWhDLENBQU47QUFBQSxHQWhDbUI7QUFBQSxzREFrQ2YsWUFBTTtBQUNqQixRQUFJLEtBQUksQ0FBQyxRQUFMLEVBQUosRUFBcUIsS0FBSSxDQUFDLE9BQUwsQ0FBYSxTQUFiLENBQXVCLE1BQXZCLENBQThCLG1CQUE5QixFQUFyQixLQUNLLEtBQUksQ0FBQyxPQUFMLENBQWEsU0FBYixDQUF1QixHQUF2QixDQUEyQixtQkFBM0I7O0FBQ0wsSUFBQSxLQUFJLENBQUMsYUFBTDtBQUNILEdBdEM2QjtBQUFBLHVEQXdDZCxZQUFNO0FBQ2xCLFFBQU0sUUFBUSxHQUFHLEtBQUksQ0FBQyxRQUFMLEVBQWpCOztBQUNBLFFBQU0sYUFBYSxHQUFHLEtBQUksQ0FBQyxPQUFMLENBQWEsWUFBbkM7O0FBRUEsUUFBSSxRQUFKLEVBQWM7QUFDVixNQUFBLEtBQUksQ0FBQyxPQUFMLENBQWEsS0FBYixDQUFtQixNQUFuQixhQUErQixhQUEvQjtBQUNBLE1BQUEsVUFBVSxDQUFDLFlBQU07QUFDYixRQUFBLEtBQUksQ0FBQyxPQUFMLENBQWEsS0FBYixDQUFtQixNQUFuQixHQUE0QixNQUE1QjtBQUNILE9BRlMsRUFFUCxHQUZPLENBQVY7QUFHSCxLQUxELE1BTUs7QUFDRCxNQUFBLEtBQUksQ0FBQyxPQUFMLENBQWEsS0FBYixDQUFtQixNQUFuQixhQUErQixhQUEvQjtBQUNBLE1BQUEsVUFBVSxDQUFDO0FBQUEsZUFBTSxLQUFJLENBQUMsT0FBTCxDQUFhLEtBQWIsQ0FBbUIsTUFBbkIsR0FBNEIsQ0FBbEM7QUFBQSxPQUFELEVBQXNDLENBQXRDLENBQVY7QUFDSDtBQUVKLEdBdkQ2QjtBQUUxQixPQUFLLE9BQUwsbUNBQW9CLGVBQXBCLEdBQXdDLE9BQXhDO0FBRUEsTUFBSSxPQUFPLENBQUMsU0FBWixFQUF1QjtBQUV2QixPQUFLLE9BQUwsR0FBZSxPQUFmO0FBQ0EsT0FBSyxVQUFMLEdBQWtCLE9B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sQ0FBUDtBQUNEOzs7Ozs7OztBQ2ZIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbigpe2Z1bmN0aW9uIHIoZSxuLHQpe2Z1bmN0aW9uIG8oaSxmKXtpZighbltpXSl7aWYoIWVbaV0pe3ZhciBjPVwiZnVuY3Rpb25cIj09dHlwZW9mIHJlcXVpcmUmJnJlcXVpcmU7aWYoIWYmJmMpcmV0dXJuIGMoaSwhMCk7aWYodSlyZXR1cm4gdShpLCEwKTt2YXIgYT1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK2krXCInXCIpO3Rocm93IGEuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixhfXZhciBwPW5baV09e2V4cG9ydHM6e319O2VbaV1bMF0uY2FsbChwLmV4cG9ydHMsZnVuY3Rpb24ocil7dmFyIG49ZVtpXVsxXVtyXTtyZXR1cm4gbyhufHxyKX0scCxwLmV4cG9ydHMscixlLG4sdCl9cmV0dXJuIG5baV0uZXhwb3J0c31mb3IodmFyIHU9XCJmdW5jdGlvblwiPT10eXBlb2YgcmVxdWlyZSYmcmVxdWlyZSxpPTA7aTx0Lmxlbmd0aDtpKyspbyh0W2ldKTtyZXR1cm4gb31yZXR1cm4gcn0pKCkiLCJcblxuLyoqXG4gKiBcbiAqKioqKiBSRUxBVEVEIElNUE9SVFMgKioqKipcbiAqIFxuICogYXNzZXRzL3Nhc3MvY29tcG9uZW50cy9fYWNjb3JkaW9uLnNjc3NcbiAqIFxuICoqKioqIFVTQUdFICoqKioqXG4gKiBcbiAqIEhUTUxcbiAqIFxuICogXG4gKiA8ZGl2IGNsYXNzPVwiYWNjb3JkaW9uXCI+XG4gKiAgICAgIDxkaXYgY2xhc3M9XCJhY2NvcmRpb25fX3RvZ2dsZVwiPlxuICogICAgICAgICAgVGl0bGVcbiAqICAgICAgPC9kaXY+XG4gKiAgICAgIDxkaXYgY2xhc3M9XCJhY2NvcmRpb25fX2NvbnRlbnQtd3JhcHBlclwiPlxuICogICAgICAgICAgPGRpdiBjbGFzcz1cImFjY29yZGlvbl9fY29udGVudC13cmFwcGVyX19jb250ZW50XCI+XG4gKiAgICAgICAgICAgICAgPCEtLSBjb250ZW50IC0tPlxuICogICAgICAgICAgPC9kaXY+XG4gKiAgICAgIDwvZGl2PlxuICogIDwvZGl2PlxuICogXG4gKiBcbiAqIEpBVkFTQ1JJUFRcbiAqIFxuICogbmV3IEFjY29yZGlvbihlbGVtZW50LCBPUFRJT05TKTtcbiAqIFxuICogLS0gZWxlbWVudDogdGhlIGh0bWwgZWxlbWVudCB0byBjb252ZXJ0IHRvIHRoaXMgY29tcG9uZW50XG4gKiAtLSBPUFRJT05TOiBjb21wb25lbnQgb3B0aW9ucywgY2hlY2sgREVGQVVMVF9PUFRJT05TIGJlbG93XG4gKiBcbiAqKioqKiBBQ0NFU1NJQklMSVRZIFRPIFRIRSBDTEFTUyAqKioqXG4gKiBcbiAqIGNvbnN0IHN0b3JlZEFjY29yZGlvbiA9IG5ldyBBY2NvcmRpb24oKTtcbiAqIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjYWNjb3JkaW9uLWlkXCIpLkFjY29yZGlvbjtcbiAqIFxuICoqKioqIFBVQkxJQyBNRVRIT0RTICoqKioqXG4gKlxuICogaXNBY3RpdmUoKSAtIHJldHVybnMgdHJ1ZS9mYWxzZSBkZXBlbmRpbmcgb24gdGhlIGFjY29yZGlvbiBzdGF0ZVxuICogdG9nZ2xlQWN0aXZlKGJvb2xlYW4pIC0gY2hhbmdlcyB0aGUgYWNjb3JkaW9uIHN0YXRlXG4gKiBcbiAqIFxuICovXG5cbmNvbnN0IERFRkFVTFRfT1BUSU9OUyA9IHtcbiAgICBlbmFibGVJY29uOiB0cnVlXG59XG5cbmV4cG9ydCBjbGFzcyBBY2NvcmRpb24ge1xuICAgIGNvbnN0cnVjdG9yKGVsZW1lbnQsIG9wdGlvbnMpIHtcblxuICAgICAgICB0aGlzLm9wdGlvbnMgPSB7IC4uLkRFRkFVTFRfT1BUSU9OUywgLi4ub3B0aW9ucyB9O1xuXG4gICAgICAgIGlmIChlbGVtZW50LkFjY29yZGlvbikgcmV0dXJuO1xuXG4gICAgICAgI
1023HRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgICAgIHRoaXMudG9nZ2xlWm9uZSA9IGVsZW1lbnQucXVlcnlTZWxlY3RvcignLmFjY29yZGlvbl9fdG9nZ2xlJyk7XG4gICAgICAgIHRoaXMud3JhcHBlciA9IGVsZW1lbnQucXVlcnlTZWxlY3RvcignLmFjY29yZGlvbl9fY29udGVudC13cmFwcGVyJyk7XG4gICAgICAgIHRoaXMuY29udGVudCA9IGVsZW1lbnQucXVlcnlTZWxlY3RvcignLmFjY29yZGlvbl9fY29udGVudC13cmFwcGVyX19jb250ZW50Jyk7XG5cbiAgICAgICAgdGhpcy5lbGVtZW50LkFjY29yZGlvbiA9IHRoaXM7XG5cbiAgICAgICAgdGhpcy5lbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJhY2NvcmRpb25cIik7XG5cbiAgICAgICAgdGhpcy5yZWZyZXNoSGVpZ2h0KCk7XG5cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5lbmFibGVJY29uKSB7XG4gICAgICAgICAgICB0aGlzLnRvZ2dsZVpvbmUuaW5uZXJIVE1MICs9IGBcbiAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVwiYWNjb3JkaW9uX190b2dnbGVfX2ljb25cIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgICAgICAgICAgIDxwYXRoIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgZD1cIk05LjI1MTA1IDYuMjUxMDVDOS41ODU3OSA1LjkxNjMyIDEwLjEyODUgNS45MTYzMiAxMC40NjMyIDYuMjUxMDVMMTUuNjA2MSAxMS4zOTM5QzE1Ljk0MDggMTEuNzI4NiAxNS45NDA4IDEyLjI3MTQgMTUuNjA2MSAxMi42MDYxTDEwLjQ2MzIgMTcuNzQ4OUMxMC4xMjg1IDE4LjA4MzcgOS41ODU3OSAxOC4wODM3IDkuMjUxMDUgMTcuNzQ4OUM4LjkxNjMyIDE3LjQxNDIgOC45MTYzMiAxNi44NzE1IDkuMjUxMDUgMTYuNTM2OEwxMy43ODc4IDEyTDkuMjUxMDUgNy40NjMyM0M4LjkxNjMyIDcuMTI4NSA4LjkxNjMyIDYuNTg1NzkgOS4yNTEwNSA2LjI1MTA1WlwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIi8+XG4gICAgICAgICAgICAgICAgICAgIDxwYXRoIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgZD1cIk0xMiAyMi41QzE3Ljc5OSAyMi41IDIyLjUgMTcuNzk5IDIyLjUgMTJDMjIuNSA2LjIwMTAxIDE3Ljc5OSAxLjUgMTIgMS41QzYuMjAxMDEgMS41IDEuNSA2LjIwMTAxIDEuNSAxMkMxLjUgMTcuNzk5IDYuMjAxM
1023DEgMjIuNSAxMiAyMi41Wk0xMiAyNEMxOC42Mjc0IDI0IDI0IDE4LjYyNzQgMjQgMTJDMjQgNS4zNzI1OCAxOC42Mjc0IDAgMTIgMEM1LjM3MjU4IDAgMCA1LjM3MjU4IDAgMTJDMCAxOC42Mjc0IDUuMzcyNTggMjQgMTIgMjRaXCIgZmlsbD1cImN1cnJlbnRDb2xvclwiLz5cbiAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgIGA7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnRvZ2dsZVpvbmUuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlQWN0aXZlKCk7XG4gICAgICAgIH0pO1xuXG4gICAgfVxuXG4gICAgaXNBY3RpdmUgPSAoKSA9PiB0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKFwiYWNjb3JkaW9uLS1hY3RpdmVcIik7XG5cbiAgICB0b2dnbGVBY3RpdmUgPSAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmlzQWN0aXZlKCkpIHRoaXMuZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKFwiYWNjb3JkaW9uLS1hY3RpdmVcIik7XG4gICAgICAgIGVsc2UgdGhpcy5lbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJhY2NvcmRpb24tLWFjdGl2ZVwiKTtcbiAgICAgICAgdGhpcy5yZWZyZXNoSGVpZ2h0KCk7XG4gICAgfVxuXG4gICAgcmVmcmVzaEhlaWdodCA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgaXNBY3RpdmUgPSB0aGlzLmlzQWN0aXZlKCk7XG4gICAgICAgIGNvbnN0IGNvbnRlbnRIZWlnaHQgPSB0aGlzLmNvbnRlbnQub2Zmc2V0SGVpZ2h0O1xuXG4gICAgICAgIGlmIChpc0FjdGl2ZSkge1xuICAgICAgICAgICAgdGhpcy53cmFwcGVyLnN0eWxlLmhlaWdodCA9IGAke2NvbnRlbnRIZWlnaHR9cHhgO1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy53cmFwcGVyLnN0eWxlLmhlaWdodCA9ICdhdXRvJztcbiAgICAgICAgICAgIH0sIDMwMCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLndyYXBwZXIuc3R5bGUuaGVpZ2h0ID0gYCR7Y29udGVudEhlaWdodH1weGA7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMud3JhcHBlci5zdHlsZS5oZWlnaHQgPSAwLCAwKTtcbiAgICAgICAgfVxuXG4gICAgfVxuXG5cbn0iLCJpbXBvcnQgeyBBY2NvcmRpb24gfSBmcm9tIFwiLi9hY2NvcmRpb25cIjtcbmltcG9ydCB7IExhbmd1YWdlUHJlZmVyZW5jZSB9IGZyb20gXCIuLi9sYW5ndWFnZS1wcmVmZXJlbmNlXCI7XG5cbiQoZnVuY3Rpb24gKCkge1xuICBjb25zdCBuYXZiYXJWaWV3ID0gbmV3IE5hdmJhclZpZXcoKTtcbiAgbmF2YmFyVmlldy5iaW5kT25MYW5ndWFnZVNlbGVjdGlvbigobGFuZ3VhZ2UpID0+IHtcbiAgICBMYW5ndWFnZVByZWZlcmVuY2Uuc3RvcmVMYW5ndWFnZShsYW5ndWFnZS50b0xvd2VyQ2FzZSgpKTtcbiAgfSk7XG59KTtcblxuZXhwb3J0IGNsYXNzIE5hdmJhclZpZXcge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLm5hdmJhckNsYXNzID0gXCJuYXZiYXJcIjtcbiAgICB0aGlzLm5hdmJhckFjdGl2ZUNsYXNzID0gYCR7dGhpcy5uYXZiYXJDbGFzc30tLWFjdGl2ZWA7XG4gICAgdGhpcy5zY3JvbGxlZENsYXNzID0gYCR7dGhpcy5uYXZiYXJDbGFzc30tLXNjcm9sbGVkYDtcbiAgICB0aGlzLmlzU2Nyb2xsZWREb3duID0gZmFsc2U7XG5cbiAgICB0aGlzLm1lbnVDbGFzcyA9IFwibWVudVwiO1xuICAgIHRoaXMuYWN0aXZlTWVudUNsYXNzID0gYCR7dGhpcy5tZW51Q2xhc3N9LS1hY3RpdmVgO1xuICAgIHRoaXMuaXNNZW51T3BlbiA9IGZhbHNlO1xuXG4gICAgdGhpcy5uYXZpZ2F0aW9uQ2xhc3MgPSBgJHt0aGlzLm5hdmJhckNsYXNzfV9fbmF2aWdhdGlvbmA7XG4gICAgdGhpcy5uYXZpZ2F0aW9uSXRlbURyb3Bkb3duQWN0aXZlQ2xhc3MgPSBgJHt0aGlzLm5hdmlnYXRpb25DbGFzc31fX2l0ZW0tLWRyb3Bkb3duLWFjdGl2ZWA7XG4gICAgdGhpcy5kcm9wZG93bldyYXBwZXJDbGFzcyA9IGAke3RoaXMubmF2aWdhdGlvbkNsYXNzfV9fZHJvcGRvd24td3JhcHBlcmA7XG4gICAgdGhpcy5kcm9wZG93bldyYXBwZXJIaWRkZW5DbGFzcyA9IGAke3RoaXMuZHJvcGRvd25XcmFwcGVyQ2xhc3N9LS1oaWRkZW5gO1xuICAgIHRoaXMuZHJvcGRvd25XcmFwcGVyQWN0aXZlQ2xhc3MgPSBgJHt0aGlzLmRyb3Bkb3duV3JhcHBlckNsYXNzfS0tYWN0aXZlYDtcbiAgICB0aGlzLmRyb3Bkb3duQ2xhc3MgPSBgJHt0aGlzLmRyb3Bkb3duV3JhcHBlckNsYXNzfV9fZHJvcGRvd25gO1xuICAgIHRoaXMuZHJvcGRvd25JdGVtQ2xhc3MgPSBgJHt0aGlzLmRyb3Bkb3duQ2xhc3N9X19pdGVtYDtcbiAgICB0aGlzLmRyb3Bkb3duSXRlbUFjdGl2ZUNsYXNzID0gYCR7dGhpcy5kcm9wZG93bkl0ZW1DbGFzc30tLWFjdGl2ZWA7XG5cbiAgICB0aGlzLnNlYXJjaFdyYXBwZXJDbGFzcyA9IGBzZWFyY2gtd3JhcHBlcmA7XG4gICAgdGhpcy5zZWFyY2hXcmFwcGVyQWN0aXZlQ2xhc3MgPSBgJHt0aGlzLnNlYXJjaFdyYXBwZXJDbGFzc30tLWFjdGl2ZWA7XG4gICAgdGhpcy5zZWFyY2hXcmFwcGVyQ2xvc2VDbGFzcyA9IGAke3RoaXMuc2VhcmNoV3JhcHBlckNsYXNzfV9fY2xvc2VgO1xuICAgIHRoaXMuc2VhcmNoV3JhcHBlckNvbnRlbnRDbGFzcyA9IGAke3RoaXMuc2VhcmNoV3JhcHBlckNsYXNzfV9fY29udGVudGA7XG4gICAgdGhpcy5zZWFyY2hJbnB1dENsYXNzID0gYCR7dGhpcy5zZWFyY2hXcmFwcGVyQ29udGVudENsYXNzfV9faW5wdXQtd3JhcHBlcl9faW5wdXRgO1xuICAgIHRoaXMuc2VhcmNoSW5wdXRJY29uQ2xhc3MgPSBgJHt0aGlzLnNlYXJjaFdyYXBwZXJDb250ZW50Q2xhc3N9X19pbnB1dC13cmFwcGVyX19pY29uYDtcblxuICAgIHRoaXMubmF2aWdhdGlvbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYC4ke3RoaXMubmF2aWdhdGlvbkNsYXNzfWApO1xuICAgIHRoaXMuZHJvcGRvd25XcmFwcGVyID0gdGhpcy5uYXZpZ2F0aW9uLnF1ZXJ5U2VsZWN0b3IoXG4gICAgICBgLiR7dGhpcy5kcm9wZG93bldyYXBwZXJDbGFzc31gXG4gICAgKTtcbiAgICB0aGlzLmRyb3Bkb3duID0gdGhpcy5kcm9wZG93bldyYXBwZXIucXVlcnlTZWxlY3RvcihcbiAgICAgIGAuJHt0aGlzLmRyb3Bkb3duQ2xhc3N9YFxuICAgICk7XG4gICAgdGhpcy5uYXZpZ2F0aW9uSXRlbXMgPSB0aGlzLm5hdmlnYXRpb24ucXVlcnlTZWxlY3RvckFsbChcbiAgICAgIGAuJHt0aGlzLm5hdmlnYXRpb25DbGFzc31fX2l0ZW1gXG4gICAgKTtcblxuICAgI
1023HRoaXMubWVudSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYC4ke3RoaXMubWVudUNsYXNzfWApO1xuICAgIHRoaXMubmF2YmFyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgLiR7dGhpcy5uYXZiYXJDbGFzc31gKTtcbiAgICB0aGlzLm9wZW5NZW51QnV0dG9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJuYXZiYXItbWVudVwiKTtcbiAgICB0aGlzLmNsb3NlTWVudUJ1dHRvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwibmF2YmFyLW1lbnUtY2xvc2VcIik7XG5cbiAgICB0aGlzLnNlYXJjaFdyYXBwZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAuJHt0aGlzLnNlYXJjaFdyYXBwZXJDbGFzc31gKTtcbiAgICB0aGlzLnNlYXJjaFdyYXBwZXJDb250ZW50ID0gdGhpcy5zZWFyY2hXcmFwcGVyLnF1ZXJ5U2VsZWN0b3IoXG4gICAgICBgLiR7dGhpcy5zZWFyY2hXcmFwcGVyQ29udGVudENsYXNzfWBcbiAgICApO1xuICAgIHRoaXMuc2VhcmNoSW5wdXQgPSB0aGlzLnNlYXJjaFdyYXBwZXIucXVlcnlTZWxlY3RvcihcbiAgICAgIGAuJHt0aGlzLnNlYXJjaElucHV0Q2xhc3N9YFxuICAgICk7XG4gICAgdGhpcy5zZWFyY2hJbnB1dEljb24gPSB0aGlzLnNlYXJjaFdyYXBwZXIucXVlcnlTZWxlY3RvcihcbiAgICAgIGAuJHt0aGlzLnNlYXJjaElucHV0SWNvbkNsYXNzfWBcbiAgICApO1xuICAgIHRoaXMuc2VhcmNoQ2xvc2UgPSB0aGlzLnNlYXJjaFdyYXBwZXIucXVlcnlTZWxlY3RvcihcbiAgICAgIGAuJHt0aGlzLnNlYXJjaFdyYXBwZXJDbG9zZUNsYXNzfWBcbiAgICApO1xuICAgIHRoaXMuc2VhcmNoQnV0dG9uID0gdGhpcy5uYXZiYXIucXVlcnlTZWxlY3RvcihcIi5uYXZiYXJfX3Nob3J0Y3V0X19pY29uXCIpO1xuICAgIHRoaXMuZG9jdW1lbnRIdG1sID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcImh0bWxcIik7XG4gICAgdGhpcy5pc1NlYXJjaEFjdGl2ZSA9IGZhbHNlO1xuXG4gICAgdGhpcy5sYW5ndWFnZVNlbGVjdG9yTGlzdHMgPSBBcnJheS5mcm9tKFxuICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcIi5sYW5ndWFnZS1zZWxlY3Rvcl9fZHJvcGRvd25cIilcbiAgICApO1xuXG4gICAgdGhpcy5pbml0KCk7XG4gIH1cblxuICBzZWFyY2hLZXlQcmVzcyA9IChldikgPT4ge1xuICAgIHN3aXRjaCAoZXYua2V5KSB7XG4gICAgICBjYXNlIFwiRXNjYXBlXCI6XG4gICAgICAgIHRoaXMudG9nZ2xlU2VhcmNoKGZhbHNlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiRW50ZXJcIjpcbiAgICAgICAgdGhpcy5kb1NlYXJjaCgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfTtcblxuICBkb1NlYXJjaCA9ICgpID0+IHtcbiAgICBjb25zdCB0ZXh0ID0gdGhpcy5zZWFyY2hJbnB1dC52YWx1ZTtcbiAgICBpZiAodGV4dCkgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBnZW5lcmFsX3NlYXJjaF9saW5rICsgXCI/cT1cIiArIHRleHQ7XG4gIH07XG5cbiAgdG9nZ2xlU2VhcmNoID0gKGVuYWJsZWQpID0+IHtcbiAgICBpZiAodGhpcy5pc1NlYXJjaEFjdGl2ZSA9PSBlbmFibGVkKSByZXR1cm47XG5cbiAgICB0aGlzLmlzU2VhcmNoQWN0aXZlID0gZW5hYmxlZDtcblxuICAgIGlmIChlbmFibGVkKSB7XG4gICAgICB0aGlzLnNlYXJjaFdyYXBwZXIuc3R5bGUuZGlzcGxheSA9IFwiZmxleFwiO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuc2VhcmNoV3JhcHBlci5jbGFzc0xpc3QuYWRkKHRoaXMuc2VhcmNoV3JhcHBlckFjdGl2ZUNsYXNzKTtcbiAgICAgICAgdGhpcy5zZWFyY2hJbnB1dC5mb2N1cygpO1xuICAgICAgfSwgMCk7XG4gICAgICB0aGlzLmRvY3VtZW50SHRtbC5jbGFzc0xpc3QuYWRkKFwic2VhcmNoLWVuYWJsZWRcIik7XG4gICAgICBkb2
1023N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwia2V5dXBcIiwgdGhpcy5zZWFyY2hLZXlQcmVzcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VhcmNoV3JhcHBlci5jbGFzc0xpc3QucmVtb3ZlKHRoaXMuc2VhcmNoV3JhcHBlckFjdGl2ZUNsYXNzKTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuaXNTZWFyY2hBY3RpdmUpIHRoaXMuc2VhcmNoV3JhcHBlci5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG4gICAgICB9LCAzMDApO1xuICAgICAgdGhpcy5kb2N1bWVudEh0bWwuY2xhc3NMaXN0LnJlbW92ZShcInNlYXJjaC1lbmFibGVkXCIpO1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImtleXVwXCIsIHRoaXMuc2VhcmNoS2V5UHJlc3MpO1xuICAgIH1cbiAgfTtcblxuICBpbml0KCkge1xuICAgIC8vIHNlYXJjaFxuXG4gICAgdGhpcy5zZWFyY2hCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHRoaXMudG9nZ2xlU2VhcmNoKHRydWUpKTtcbiAgICB0aGlzLnNlYXJjaENsb3NlLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB0aGlzLnRvZ2dsZVNlYXJjaChmYWxzZSkpO1xuICAgIHRoaXMuc2VhcmNoSW5wdXRJY29uLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCB0aGlzLmRvU2VhcmNoKTtcbiAgICB0aGlzLnNlYXJjaFdyYXBwZXIuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+XG4gICAgICB0aGlzLnRvZ2dsZVNlYXJjaChmYWxzZSlcbiAgICApO1xuICAgIHRoaXMuc2VhcmNoV3JhcHBlckNvbnRlbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIChlKSA9PlxuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKVxuICAgICk7XG5cbiAgICAvLyBlbmQgc2VhcmNoXG5cbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInNjcm9sbFwiLCAoKSA9PiB0aGlzLm9uTmF2YmFyU2Nyb2xsKCkpO1xuXG4gICAgZG9jdW1lbnRcbiAgICAgIC5xdWVyeVNlbGVjdG9yQWxsKFwiLmFjY29yZGlvblwiKVxuICAgICAgLmZvckVhY2goKGVsZW1lbnQpID0+IG5ldyBBY2NvcmRpb24oZWxlbWVudCkpO1xuXG4gICAgY29uc3Qgc2V0SGlkZGVuQ2xhc3MgPSAoKSA9PiB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICF0aGlzLmRyb3Bkb3duV3JhcHBlci5jbGFzc0xpc3QuY29udGFpbnMoXG4gICAgICAgICAgICB0aGlzLmRyb3Bkb3duV3JhcHBlckFjdGl2ZUNsYXNzXG4gICAgICAgICAgKVxuICAgICAgICApIHtcbiAgICAgICAgICB0aGlzLmRyb3Bkb3duV3JhcHBlci5jbGFzc0xpc3QuYWRkKHRoaXMuZHJvcGRvd25XcmFwcGVySGlkZGVuQ2xhc3MpO1xuICAgICAgICB9XG4gICAgICB9LCAyNTApO1xuICAgIH07XG5cbiAgICB0aGlzLm5hdmlnYXRpb24uYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlbGVhdmVcIiwgKCkgPT4ge1xuICAgICAgdGhpcy5kcm9wZG93bi5jbGFzc0xpc3QucmVtb3ZlKHRoaXMuZHJvcGRvd25BY3RpdmVDbGFzcyk7XG4gICAgICB0aGlzLmRyb3Bkb3duSG92ZXJlZEVsZW1lbnQgPSBudWxsO1xuICAgICAgdGhpcy5kcm9wZG93bldyYXBwZXIuc3R5bGUuaGVpZ2h0ID0gYDBweGA7XG4gICAgICB0aGlzLmRyb3Bkb3duV3JhcHBlci5jbGFzc0xpc3QucmVtb3ZlKHRoaXMuZHJvcGRvd25XcmFwcGVyQWN0aXZlQ2xhc3MpO1xuICAgICAgY29uc3QgaXRlbSA9IHRoaXMubmF2aWdhdGlvbi5xdWVyeVNlbGVjdG9yKFxuICAgICAgICBgLiR7dGhpcy5uYXZpZ2F0aW9uSXRlbURyb3Bkb3duQWN0aXZlQ2xhc3N9YFxuICAgICAgKTtcbiAgICAgIGlmIChpdGVtKSBpdGVtLmNsYXNzTGlzdC5yZW1vdmUodGhpcy5uYXZpZ2F0aW9uSXRlbURyb3Bkb3duQWN0aXZlQ2xhc3MpO1xuICAgICAgc2V0SGlkZGVuQ2xhc3MoKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHVwZGF0ZURyb3Bkb3duID0gKGVsLCBpdGVtcykgPT4ge1xuICAgICAgY29uc3QgcGFyZW50TGVmdCA9IHRoaXMubmF2aWdhdGlvbi5vZmZzZXRMZWZ0O1xuICAgICAgY29uc3QgdGFyZ2V0TGVmdCA9IGVsLm9mZnNldExlZnQgLSBwYXJlbnRMZWZ0O1xuXG4gICAgICBpZiAoIWl0ZW1zLmxlbmd0aCkge1xuICAgICAgICB0aGlzLmRyb3Bkb3duSG92ZXJlZEVsZW1lbnQgPSBudWxsO1xuICAgICAgICB0aGlzLmRyb3Bkb3duLmlubmVySFRNTCA9IFwiXCI7XG4gICAgICAgIHRoaXMuZHJvcGRvd25XcmFwcGVyLnN0eWxlLmhlaWdodCA9IGAwcHhgO1xuICAgICAgICB0aGlzLmRyb3Bkb3duV3JhcHBlci5jbGFzc0xpc3QucmVtb3ZlKHRoaXMuZHJvcGRvd25XcmFwcGVyQWN0aXZlQ2xhc3MpO1xuICAgICAgICBzZXRIaWRkZW5DbGFzcygpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGVsLmNsYXNzTGlzdC5hZGQodGhpcy5uYXZpZ2F0aW9uSXRlbURyb3Bkb3duQWN0aXZlQ2xhc3MpO1xuXG4gICAgICBsZXQgaHRtbCA9IFwiXCI7XG5cbiAgICAgIGl0ZW1zLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgY29uc3QgeyB1cmwsIGlzQWN0aXZlLCBuYW1lIH0gPSBpdGVtO1xuXG4gICAgICAgIGh0bWwgKz0gYDxhIGhyZWY9XCIke3VybH1cIiBjbGFzcz1cIiR7dGhpcy5kcm9wZG93bkl0ZW1DbGFzc30ke1xuICAgICAgICAgIGlzQWN0aXZlID8gYCAke3RoaXMuZHJvcGRvd25JdGVtQWN0aXZlQ2xhc3N9YCA6IFwiXCJcbiAgICAgICAgfVwiPiR7bmFtZX08L2E+YDtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLmRyb3Bkb3duLmlubmVySFRNTCA9IGh0bWw7XG4gICAgICB0aGlzLmRyb3Bkb3duV3JhcHBlci5zdHlsZS5oZWlnaHQgPSBgJHt0aGlzLmRyb3Bkb3duLm9mZnNldEhlaWdodH1weGA7XG4gICAgICB0aGlzLmRyb3Bkb3duV3JhcHBlci5zdHlsZS50cmFuc2Zvcm0gPSBgdHJhbnNsYXRlWCgke3RhcmdldExlZnR9cHgpYDtcbiAgICAgIHRoaXMuZHJvcGRvd25XcmFwcGVyLmNsYXNzTGlzdC5hZGQodGhpcy5kcm9wZG93bldyYXBwZXJBY3RpdmVDbGFzcyk7XG4gICAgfTtcblxuICAgIGNvbnN0IGdldEVsZW1lbnREYXRhID0gKGVsKSA9PiB7XG4gICAgICBpZiAoIWVsLnBhcnNlZERhdGEpIHtcbiAgICAgICAgZWwucGFyc2VkRGF0YSA9IEpTT04ucGFyc2UoZWwuZ2V0QXR0cmlidXRlKFwiZGF0YVwiKSB8fCBcIltdXCIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZWwucGFyc2VkRGF0YTtcbiAgICB9O1xuXG4gICAgdGhpcy5uYXZpZ2F0aW9uSXRlbXMuZm9yRWFjaCgoZWwpID0+IHtcbiAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZW92ZXJcIiwgKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5kcm9wZG93bkhvdmVyZWRFbGVtZW50ID09IGVsKSByZXR1cm47XG4gICAgICAgI
1023HRoaXMuZHJvcGRvd25Ib3ZlcmVkRWxlbWVudCA9IGVsO1xuXG4gICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLm5hdmlnYXRpb24ucXVlcnlTZWxlY3RvcihcbiAgICAgICAgICBgLiR7dGhpcy5uYXZpZ2F0aW9uSXRlbURyb3Bkb3duQWN0aXZlQ2xhc3N9YFxuICAgICAgICApO1xuICAgICAgICBpZiAoaXRlbSkgaXRlbS5jbGFzc0xpc3QucmVtb3ZlKHRoaXMubmF2aWdhdGlvbkl0ZW1Ecm9wZG93bkFjdGl2ZUNsYXNzKTtcblxuICAgICAgICBjb25zdCBpdGVtcyA9IGdldEVsZW1lbnREYXRhKGVsKTtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgdGhpcy5kcm9wZG93bldyYXBwZXIuY2xhc3NMaXN0LmNvbnRhaW5zKFxuICAgICAgICAgICAgdGhpcy5kcm9wZG93bldyYXBwZXJIaWRkZW5DbGFzc1xuICAgICAgICAgIClcbiAgICAgICAgKSB7XG4gICAgICAgICAgaWYgKCFpdGVtcy5sZW5ndGgpIHJldHVybjtcblxuICAgICAgICAgIGNvbnN0IHBhcmVudExlZnQgPSB0aGlzLm5hdmlnYXRpb24ub2Zmc2V0TGVmdDtcbiAgICAgICAgICBjb25zdCB0YXJnZXRMZWZ0ID0gZWwub2Zmc2V0TGVmdCAtIHBhcmVudExlZnQ7XG4gICAgICAgICAgdGhpcy5kcm9wZG93bldyYXBwZXIuc3R5bGUudHJhbnNmb3JtID0gYHRyYW5zbGF0ZVgoJHt0YXJnZXRMZWZ0fXB4KWA7XG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmRyb3Bkb3duV3JhcHBlci5jbGFzc0xpc3QucmVtb3ZlKFxuICAgICAgICAgICAgICB0aGlzLmRyb3Bkb3duV3JhcHBlckhpZGRlbkNsYXNzXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdXBkYXRlRHJvcGRvd24oZWwsIGl0ZW1zKTtcbiAgICAgICAgICB9LCAxMCk7XG4gICAgICAgIH0gZWxzZSB1cGRhdGVEcm9wZG93bihlbCwgaXRlbXMpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLm9wZW5NZW51QnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB0aGlzLnVwZGF0ZU1lbnUodHJ1ZSkpO1xuICAgIHRoaXMuY2xvc2VNZW51QnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PlxuICAgICAgdGhpcy51cGRhdGVNZW51KGZhbHNlKVxuICAgICk7XG5cbiAgICB0aGlzLndhdGNoTGFuZ3VhZ2VTZWxlY3Rpb24oKTtcbiAgfVxuXG4gIG9uTmF2YmFyU2Nyb2xsKCkge1xuICAgIGNvbnN0IFRIUkVTSE9MRCA9IDQ7XG4gICAgY29uc3Qgc2Nyb2xsZWRZID0gTWF0aC5yb3VuZCh3aW5kb3cuc2Nyb2xsWSk7XG4gICAgY29uc3QgcmVtVmFsdWUgPSBwYXJzZUludCh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5ib2R5KS5mb250U2l6ZSk7XG4gICAgY29uc3Qgc2Nyb2xsSW5SZW0gPSBNYXRoLm1pbihUSFJFU0hPTEQsIChzY3JvbGxlZFkgKiAxKSAvIHJlbVZhbHVlKTtcblxuICAgIGNvbnN0IHVzZXJTcm9sbGVkRG93biA9IHNjcm9sbEluUmVtID09PSBUSFJFU0hPTEQ7XG5cbiAgICBpZiAodXNlclNyb2xsZWREb3duICYmICF0aGlzLmlzU2Nyb2xsZWREb3duKSB7XG4gICAgICB0aGlzLm5hdmJhci5jbGFzc0xpc3QuYWRkKHRoaXMuc2Nyb2xsZWRDbGFzcyk7XG4gICAgICB0aGlzLmlzU2Nyb2xsZWREb3duID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKCF1c2VyU3JvbGxlZERvd24gJiYgdGhpcy5pc1Njcm9sbGVkRG93bikge1xuICAgICAgdGhpcy5uYXZiYXIuY2xhc3NMaXN0LnJlbW92ZSh0aGlzLnNjcm9sbGVkQ2xhc3MpO1xuICAgICAgdGhpcy5pc1Njcm9sbGVkRG93biA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZU1lbnUoaXNPcGVuKSB7XG4gICAgdGhpcy5pc01lbnVPcGVuID0gaXNPcGVuO1xuXG4gICAgaWYgKGlzT3Blbikge1xuICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLm92ZXJmbG93ID0gXCJoaWRkZW5cIjtcbiAgICAgIHRoaXMubmF2YmFyLmNsYXNzTGlzdC5hZGQodGhpcy5uYXZiYXJBY3RpdmVDbGFzcyk7XG4gICAgICB0aGlzLm1lbnUuY2xhc3NMaXN0LmFkZCh0aGlzLmFjdGl2ZU1lbnVDbGFzcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5vdmVyZmxvdyA9IFwiXCI7XG4gICAgICB0aGlzLm5hdmJhci5jbGFzc0xpc3QucmVtb3ZlKHRoaXMubmF2YmFyQWN0aXZlQ2xhc3MpO1xuICAgICAgdGhpcy5tZW51LmNsYXNzTGlzdC5yZW1vdmUodGhpcy5hY3RpdmVNZW51Q2xhc3MpO1xuICAgIH1cbiAgfVxuXG4gIHdhdGNoTGFuZ3VhZ2VTZWxlY3Rpb24oKSB7XG4gICAgdGhpcy5sYW5ndWFnZVNlbGVjdG9yTGlzdHMuZm9yRWFjaCgobGFuZ3VhZ2VMaXN0KSA9PiB7XG4gICAgICBsYW5ndWFnZUxpc3QuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgXCJjbGlja1wiLFxuICAgICAgICAoZSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGxhbmd1YWdlSXRlbSA9IGUudGFyZ2V0LmNsb3Nlc3QoXG4gICAgICAgICAgICBgLmxhbmd1YWdlLXNlbGVjdG9yX19kcm9wZG93bl9faXRlbWBcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKGxhbmd1YWdlSXRlbSkge1xuICAgICAgICAgICAgY29uc3QgbGFuZ3VhZ2UgPSBsYW5ndWFnZUl0ZW0uZ2V0QXR0cmlidXRlKFwiZGF0YS1sYW5ndWFnZVwiKTtcblxuICAgICAgICAgICAgdGhpcy5vbkxhbmd1YWdlU2VsZWN0aW9uKGxhbmd1YWdlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHsgcGFzc2l2ZTogdHJ1ZSB9XG4gICAgICApO1xuICAgIH0pO1xuICB9XG5cbiAgYmluZE9uTGFuZ3VhZ2VTZWxlY3Rpb24gPSAoY2FsbGJhY2spID0+IHtcbiAgICB0aGlzLm9uTGFuZ3VhZ2VTZWxlY3Rpb24gPSBjYWxsYmFjaztcbiAgfTtcbn1cbiIsImltcG9ydCBDb29raWVzIGZyb20gXCJqcy1jb29raWVcIjtcblxuY29uc3QgTEFOR1VBR0VfUFJFRkVSRU5DRV9TVE9SQUdFX0tFWSA9IFwiZGphbmdvX2xhbmd1YWdlXCI7XG5cbmV4cG9ydCBjbGFzcyBMYW5ndWFnZVByZWZlcmVuY2Uge1xuICBzdGF0aWMgc3RvcmVMYW5ndWFnZShsYW5ndWFnZSkge1xuICAgIHJldHVybiBDb29raWVzLnNldChMQU5HVUFHRV9QUkVGRVJFTkNFX1NUT1JBR0VfS0VZLCBsYW5ndWFnZSwge1xuICAgICAgc2FtZVNpdGU6IFwic3RyaWN0XCIsXG4gICAgICBzZWN1cmU6IHRydWUsXG4gICAgICBleHBpcmVzO
1023iAzMCxcbiAgICB9KTtcbiAgfVxuXG4gIHN0YXRpYyBnZXRTdG9yZWRMYW5ndWFnZSgpIHtcbiAgICByZXR1cm4gQ29va2llcy5nZXQoTEFOR1VBR0VfUFJFRkVSRU5DRV9TVE9SQUdFX0tFWSk7XG4gIH1cbn1cbiIsImZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHtcbiAgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2NsYXNzQ2FsbENoZWNrO1xubW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHMsIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOyIsImZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07XG4gICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlO1xuICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTtcbiAgICBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7XG4gIGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpO1xuICBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7XG4gIHJldHVybiBDb25zdHJ1Y3Rvcjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfY3JlYXRlQ2xhc3M7XG5tb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0cywgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7IiwiZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkge1xuICBpZiAoa2V5IGluIG9iaikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwge1xuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgb2JqW2tleV0gPSB2YWx1ZTtcbiAgfVxuXG4gIHJldHVybiBvYmo7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2RlZmluZVByb3BlcnR5O1xubW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHMsIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOyIsImZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7XG4gIHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7XG4gICAgXCJkZWZhdWx0XCI6IG9ialxuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQ7XG5tb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0cywgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7IiwiLyohXG4gKiBKYXZhU2NyaXB0IENvb2tpZSB2Mi4yLjFcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9qcy1jb29raWUvanMtY29va2llXG4gKlxuICogQ29weXJpZ2h0IDIwMDYsIDIwMTUgS2xhdXMgSGFydGwgJiBGYWduZXIgQnJhY2tcbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZVxuICovXG47KGZ1bmN0aW9uIChmYWN0b3J5KSB7XG5cdHZhciByZWdpc3RlcmVkSW5Nb2R1bGVMb2FkZXI7XG5cdGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHtcblx0XHRkZWZpbmUoZmFjdG9yeSk7XG5cdFx0cmVnaXN0ZXJlZEluTW9kdWxlTG9hZGVyID0gdHJ1ZTtcblx0fVxuXHRpZiAodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKSB7XG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7XG5cdFx0cmVnaXN0ZXJlZEluTW9kdWxlTG9hZGVyID0gdHJ1ZTtcblx0fVxuXHRpZiAoIXJlZ2lzdGVyZWRJbk1vZHVsZUxvYWRlcikge1xuXHRcdHZhciBPbGRDb29raWVzID0gd2luZG93LkNvb2tpZXM7XG5cdFx0dmFyIGFwaSA9IHdpbmRvdy5Db29raWVzID0gZmFjdG9yeSgpO1xuXHRcdGFwaS5ub0NvbmZsaWN0ID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0d2luZG93LkNvb2tpZXMgPSBPbGRDb29raWVzO1xuXHRcdFx0cmV0dXJuIGFwaTtcblx0XHR9O1xuXHR9XG59KGZ1bmN0aW9uICgpIHtcblx0ZnVuY3Rpb24gZXh0ZW5kICgpIHtcblx0XHR2YXIgaSA9IDA7XG5cdFx0dmFyIHJlc3VsdCA9IHt9O1xuXHRcdGZvciAoOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHR2YXIgYXR0cmlidXRlcyA9IGFyZ3VtZW50c1sgaSBdO1xuXHRcdFx0Zm9yICh2YXIga2V5IGluIGF0dHJpYnV0ZXMpIHtcblx0XHRcdFx0cmVzdWx0W2tleV0gPSBhdHRyaWJ1dGVzW2tleV07XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRmdW5jdGlvbiBkZWNvZGUgKHMpIHtcblx0XHRyZXR1cm4gcy5yZXBsYWNlKC8oJVswLTlBLVpdezJ9KSsvZywgZGVjb2RlVVJJQ29tcG9uZW50KTtcblx0fVxuXG5cdGZ1bmN0aW9uIGluaXQgKGNvbnZlcnRlcikge1xuXHRcdGZ1bmN0aW9uIGFwaSgpIHt9XG5cblx0XHRmdW5jdGlvbiBzZXQgKGtleSwgdmFsdWUsIGF0dHJpYnV0ZXMpIHtcblx0XHRcdGlmICh0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0YXR0cmlidXRlcyA9IGV4dGVuZCh7XG5cdFx0XHRcdHBhdGg6ICcvJ1xuXHRcdFx0fSwgYXBpLmRlZmF1bHRzLCBhdHRyaWJ1dGVzKTtcblxuXHRcdFx0aWYgKHR5cGVvZiBhdHRyaWJ1dGVzLmV4cGlyZXMgPT09ICdudW1iZXInKSB7XG5cdFx0XHRcdGF0dHJpYnV0ZXMuZXhwaXJlcyA9IG5ldyBEYXRlKG5ldyBEYXRlKCkgKiAxICsgYXR0cmlidXRlcy5leHBpcmVzICogODY0ZSs1KTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gV2UncmUgdXNpbmcgXCJleHBpcmVzXCIgYmVjYXVzZSBcIm1heC1hZ2
1023VcIiBpcyBub3Qgc3VwcG9ydGVkIGJ5IElFXG5cdFx0XHRhdHRyaWJ1dGVzLmV4cGlyZXMgPSBhdHRyaWJ1dGVzLmV4cGlyZXMgPyBhdHRyaWJ1dGVzLmV4cGlyZXMudG9VVENTdHJpbmcoKSA6ICcnO1xuXG5cdFx0XHR0cnkge1xuXHRcdFx0XHR2YXIgcmVzdWx0ID0gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuXHRcdFx0XHRpZiAoL15bXFx7XFxbXS8udGVzdChyZXN1bHQpKSB7XG5cdFx0XHRcdFx0dmFsdWUgPSByZXN1bHQ7XG5cdFx0XHRcdH1cblx0XHRcdH0gY2F0Y2ggKGUpIHt9XG5cblx0XHRcdHZhbHVlID0gY29udmVydGVyLndyaXRlID9cblx0XHRcdFx0Y29udmVydGVyLndyaXRlKHZhbHVlLCBrZXkpIDpcblx0XHRcdFx0ZW5jb2RlVVJJQ29tcG9uZW50KFN0cmluZyh2YWx1ZSkpXG5cdFx0XHRcdFx0LnJlcGxhY2UoLyUoMjN8MjR8MjZ8MkJ8M0F8M0N8M0V8M0R8MkZ8M0Z8NDB8NUJ8NUR8NUV8NjB8N0J8N0R8N0MpL2csIGRlY29kZVVSSUNvbXBvbmVudCk7XG5cblx0XHRcdGtleSA9IGVuY29kZVVSSUNvbXBvbmVudChTdHJpbmcoa2V5KSlcblx0XHRcdFx0LnJlcGxhY2UoLyUoMjN8MjR8MjZ8MkJ8NUV8NjB8N0MpL2csIGRlY29kZVVSSUNvbXBvbmVudClcblx0XHRcdFx0LnJlcGxhY2UoL1tcXChcXCldL2csIGVzY2FwZSk7XG5cblx0XHRcdHZhciBzdHJpbmdpZmllZEF0dHJpYnV0ZXMgPSAnJztcblx0XHRcdGZvciAodmFyIGF0dHJpYnV0ZU5hbWUgaW4gYXR0cmlidXRlcykge1xuXHRcdFx0XHRpZiAoIWF0dHJpYnV0ZXNbYXR0cmlidXRlTmFtZV0pIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRzdHJpbmdpZmllZEF0dHJpYnV0ZXMgKz0gJzsgJyArIGF0dHJpYnV0ZU5hbWU7XG5cdFx0XHRcdGlmIChhdHRyaWJ1dGVzW2F0dHJpYnV0ZU5hbWVdID09PSB0cnVlKSB7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBDb25zaWRlcnMgUkZDIDYyNjUgc2VjdGlvbiA1LjI6XG5cdFx0XHRcdC8vIC4uLlxuXHRcdFx0XHQvLyAzLiAgSWYgdGhlIHJlbWFpbmluZyB1bnBhcnNlZC1hdHRyaWJ1dGVzIGNvbnRhaW5zIGEgJXgzQiAoXCI7XCIpXG5cdFx0XHRcdC8vICAgICBjaGFyYWN0ZXI6XG5cdFx0XHRcdC8vIENvbnN1bWUgdGhlIGNoYXJhY3RlcnMgb2YgdGhlIHVucGFyc2VkLWF0dHJpYnV0ZXMgdXAgdG8sXG5cdFx0XHRcdC8vIG5vdCBpbmNsdWRpbmcsIHRoZSBmaXJzdCAleDNCIChcIjtcIikgY2hhcmFjdGVyLlxuXHRcdFx0XHQvLyAuLi5cblx0XHRcdFx0c3RyaW5naWZpZWRBdHRyaWJ1dGVzICs9ICc9JyArIGF0dHJpYnV0ZXNbYXR0cmlidXRlTmFtZV0uc3BsaXQoJzsnKVswXTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIChkb2N1bWVudC5jb29raWUgPSBrZXkgKyAnPScgKyB2YWx1ZSArIHN0cmluZ2lmaWVkQXR0cmlidXRlcyk7XG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gZ2V0IChrZXksIGpzb24pIHtcblx0XHRcdGlmICh0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0dmFyIGphciA9IHt9O1xuXHRcdFx0Ly8gVG8gcHJldmVudCB0aGUgZm9yIGxvb3AgaW4gdGhlIGZpcnN0IHBsYWNlIGFzc2lnbiBhbiBlbXB0eSBhcnJheVxuXHRcdFx0Ly8gaW4gY2FzZSB0aGVyZSBhcmUgbm8gY29va2llcyBhdCBhbGwuXG5cdFx0XHR2YXIgY29va2llcyA9IGRvY3VtZW50LmNvb2tpZSA/IGRvY3VtZW50LmNvb2tpZS5zcGxpdCgnOyAnKSA6IFtdO1xuXHRcdFx0dmFyIGkgPSAwO1xuXG5cdFx0XHRmb3IgKDsgaSA8IGNvb2tpZXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0dmFyIHBhcnRzID0gY29va2llc1tpXS5zcGxpdCgnPScpO1xuXHRcdFx0XHR2YXIgY29va2llID0gcGFydHMuc2xpY2UoMSkuam9pbignPScpO1xuXG5cdFx0XHRcdGlmICghanNvbiAmJiBjb29raWUuY2hhckF0KDApID09PSAnXCInKSB7XG5cdFx0XHRcdFx0Y29va2llID0gY29va2llLnNsaWNlKDEsIC0xKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0dmFyIG5hbWUgPSBkZWNvZGUocGFydHNbMF0pO1xuXHRcdFx0XHRcdGNvb2tpZSA9IChjb252ZXJ0ZXIucmVhZCB8fCBjb252ZXJ0ZXIpKGNvb2tpZSwgbmFtZSkgfHxcblx0XHRcdFx0XHRcdGRlY29kZShjb29raWUpO1xuXG5cdFx0XHRcdFx0aWYgKGpzb24pIHtcblx0XHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRcdGNvb2tpZSA9IEpTT04ucGFyc2UoY29va2llKTtcblx0XHRcdFx0XHRcdH0gY2F0Y2ggKGUpIHt9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0amFyW25hbWVdID0gY29va2llO1xuXG5cdFx0XHRcdFx0aWYgKGtleSA9PT0gbmFtZSkge1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGNhdGNoIChlKSB7fVxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4ga2V5ID8gamFyW2tleV0gOiBqYXI7XG5cdFx0fVxuXG5cdFx0YXBpLnNldCA9IHNldDtcblx0XHRhcGkuZ2V0ID0gZnVuY3Rpb24gKGtleSkge1xuXHRcdFx0cmV0dXJuIGdldChrZXksIGZhbHNlIC8qIHJlYWQgYXMgcmF3ICovKTtcblx0XHR9O1xuXHRcdGFwaS5nZXRKU09OID0gZnVuY3Rpb24gKGtleSkge1xuXHRcdFx0cmV0dXJuIGdldChrZXksIHRydWUgLyogcmVhZCBhcyBqc29uICovKTtcblx0XHR9O1xuXHRcdGFwaS5yZW1vdmUgPSBmdW5jdGlvbiAoa2V5LCBhdHRyaWJ1dGVzKSB7XG5cdFx0XHRzZXQoa2V5LCAnJywgZXh0ZW5kKGF0dHJpYnV0ZXMsIHtcblx0XHRcdFx0ZXhwaXJlczogLTFcblx0XHRcdH0pKTtcblx0XHR9O1xuXG5cdFx0YXBpLmRlZmF1bHRzID0ge307XG5cblx0XHRhcGkud2l0aENvbnZlcnRlciA9IGluaXQ7XG5cblx0XHRyZXR1cm4gYXBpO1xuXHR9XG5cblx0cmV0dXJuIGluaXQoZnVuY3Rpb24gKCkge30pO1xufSkpO1xuIl19

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.