(function webpackUniversalModuleDefinition(root, factory) { if(typeof exports === 'object' && typeof module === 'object') module.exports = factory(); else if(typeof define === 'function' && define.amd) define([], factory); else if(typeof exports === 'object') exports["customEntityAssetLink"] = factory(); else root["ntt"] = root["ntt"] || {}, root["ntt"]["smartit"] = root["ntt"]["smartit"] || {}, root["ntt"]["smartit"]["customEntityAssetLink"] = factory(); })(window, function() { return /******/ (function(modules) { // webpackBootstrap /******/ // The module cache /******/ var installedModules = {}; /******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ /******/ // Check if module is in cache /******/ if(installedModules[moduleId]) { /******/ return installedModules[moduleId].exports; /******/ } /******/ // Create a new module (and put it into the cache) /******/ var module = installedModules[moduleId] = { /******/ i: moduleId, /******/ l: false, /******/ exports: {} /******/ }; /******/ /******/ // Execute the module function /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); /******/ /******/ // Flag the module as loaded /******/ module.l = true; /******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ /******/ /******/ // expose the modules object (__webpack_modules__) /******/ __webpack_require__.m = modules; /******/ /******/ // expose the module cache /******/ __webpack_require__.c = installedModules; /******/ /******/ // define getter function for harmony exports /******/ __webpack_require__.d = function(exports, name, getter) { /******/ if(!__webpack_require__.o(exports, name)) { /******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); /******/ } /******/ }; /******/ /******/ // define __esModule on exports /******/ __webpack_require__.r = function(exports) { /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); /******/ } /******/ Object.defineProperty(exports, '__esModule', { value: true }); /******/ }; /******/ /******/ // create a fake namespace object /******/ // mode & 1: value is a module id, require it /******/ // mode & 2: merge all properties of value into the ns /******/ // mode & 4: return value when already ns object /******/ // mode & 8|1: behave like require /******/ __webpack_require__.t = function(value, mode) { /******/ if(mode & 1) value = __webpack_require__(value); /******/ if(mode & 8) return value; /******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; /******/ var ns = Object.create(null); /******/ __webpack_require__.r(ns); /******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); /******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); /******/ return ns; /******/ }; /******/ /******/ // getDefaultExport function for compatibility with non-harmony modules /******/ __webpack_require__.n = function(module) { /******/ var getter = module && module.__esModule ? /******/ function getDefault() { return module['default']; } : /******/ function getModuleExports() { return module; }; /******/ __webpack_require__.d(getter, 'a', getter); /******/ return getter; /******/ }; /******/ /******/ // Object.prototype.hasOwnProperty.call /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; /******/ /******/ // __webpack_public_path__ /******/ __webpack_require__.p = ""; /******/ /******/ /******/ // Load entry module and return exports /******/ return __webpack_require__(__webpack_require__.s = "./src/modules/customEntityAssetLink/index.js"); /******/ }) /************************************************************************/ /******/ ({ /***/ "./src/modules/customEntityAssetLink/directives/ntt-custom-affected-asset-link-directive.js": /*!**************************************************************************************************!*\ !*** ./src/modules/customEntityAssetLink/directives/ntt-custom-affected-asset-link-directive.js ***! \**************************************************************************************************/ /*! no static exports found */ /***/ (function(module, exports) { angular.module('myitsmApp').directive('customAffectedAssetLink', ['ModuleConfigService', 'customAssetLinkService', function (ModuleConfigService, customAssetLinkService) { return { restrict: 'A', scope: { ciData: '=customAffectedAssetLink', mapping: '=mapping' }, link: function link(scope, iElement) { var p = iElement.parents(".profile-relation__item")[0]; if (p) { p.removeAttribute("ng-click"); p.setAttribute("style", "cursor: default !important"); } scope.$parent.$parent.showDetails = null; if (!scope.ciData) { console.log('No information about entity'); } else { var linkFormat = ModuleConfigService.getModuleConfig("customEntityAssetLink")["linkFormat"]; var link = customAssetLinkService.parseLink(linkFormat, scope.ciData, scope.mapping); //var object = scope.ciData; //var entityLink = linkFormat.replace("{Name}", object.name); //entityLink = entityLink.replace("{ReconciliationId}", object.reconciliationId); iElement.attr('href', link); var openInNewTab = ModuleConfigService.getModuleConfig("customEntityAssetLink")["openInNewTab"]; openInNewTab = typeof openInNewTab == "undefined" ? true : openInNewTab; if (openInNewTab) iElement.attr('target', '_blank'); } } }; }]); /***/ }), /***/ "./src/modules/customEntityAssetLink/directives/ntt-scopecontroller-ci-relations-directive.js": /*!****************************************************************************************************!*\ !*** ./src/modules/customEntityAssetLink/directives/ntt-scopecontroller-ci-relations-directive.js ***! \****************************************************************************************************/ /*! no static exports found */ /***/ (function(module, exports) { angular.module('myitsmApp').directive('scopeControllerCiRelations', ['customAssetLinkService', 'ModuleConfigService', '$window', function (customAssetLinkService, ModuleConfigService, $window) { return { restrict: 'E', template: '', replace: false, scope: { variable: '=' }, link: function link(scope, element, attrs) {}, controller: ['$element', '$attrs', '$scope', function ($element, $attrs, $scope) { var linkFormat = ModuleConfigService.getModuleConfig("customEntityAssetLink")["linkFormat"]; var openInNewTab = ModuleConfigService.getModuleConfig("customEntityAssetLink")["openInNewTab"]; openInNewTab = typeof openInNewTab == "undefined" ? true : openInNewTab; $scope.$parent.showPreview = function (row) { var link = customAssetLinkService.parseLink(linkFormat, row); if (link) { if (!openInNewTab) $window.location.href = link;else $window.open(link, '_blank'); } }; }] }; }]); /***/ }), /***/ "./src/modules/customEntityAssetLink/index.js": /*!****************************************************!*\ !*** ./src/modules/customEntityAssetLink/index.js ***! \****************************************************/ /*! exports provided: customEnitiyProfileLink */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "customEnitiyProfileLink", function() { return customEnitiyProfileLink; }); function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a 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); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } //require('./directives/ntt-custom-asset-entity-profile-link-directive'); __webpack_require__(/*! ./services/custom-asset-link-service */ "./src/modules/customEntityAssetLink/services/custom-asset-link-service.js"); __webpack_require__(/*! ./directives/ntt-custom-affected-asset-link-directive */ "./src/modules/customEntityAssetLink/directives/ntt-custom-affected-asset-link-directive.js"); __webpack_require__(/*! ./directives/ntt-scopecontroller-ci-relations-directive */ "./src/modules/customEntityAssetLink/directives/ntt-scopecontroller-ci-relations-directive.js"); var customEnitiyProfileLink = /*#__PURE__*/ function (_ntt$smartit$api$ICus) { _inherits(customEnitiyProfileLink, _ntt$smartit$api$ICus); function customEnitiyProfileLink() { _classCallCheck(this, customEnitiyProfileLink); return _possibleConstructorReturn(this, _getPrototypeOf(customEnitiyProfileLink).apply(this, arguments)); } _createClass(customEnitiyProfileLink, [{ key: "name", value: function name() { return "customEntityAssetLink"; } }, { key: "injectTemplates", value: function injectTemplates() { return { "views/common/related-item.html": [{ id: "customEnitiyProfileLink", method: "replace", mode: "partial", type: "jquery", selector: function selector($jqueryTemplate) { return $jqueryTemplate.find("table.asset-table").find("a[entity-profile-link='item']"); }, snippet: '{{item.realObject.name}}' }], "views/custom-widgets/affected-asset.html": [{ id: "affectedAsset", method: "replace", mode: "partial", type: "jquery", selector: function selector($jqueryTemplate) { return $jqueryTemplate.find("span.custom-field__value").find("a[ng-if='data.value.ci.name']"); }, snippet: '{{data.value.ci.name}}' }], "views/known-error/known-error-details-editor.html": [{ id: "affectedAsset2", method: "replace", mode: "partial", type: "jquery", selector: function selector($jqueryTemplate) { return $jqueryTemplate.find("a[ng-if='ticket.causalCI.name']"); }, snippet: '{{ticket.causalCI.name}}' }], "views/problem/problem-details-editor.html": [{ id: "affectedAsset3", method: "replace", mode: "partial", type: "jquery", selector: function selector($jqueryTemplate) { return $jqueryTemplate.find("a[ng-if='ticket.causalCI.name']"); }, snippet: '{{ticket.causalCI.name}}' }], "views/change/ci-relations.html": [{ id: "affectedAsset4", method: "add", mode: "partial", type: "jquery", selector: function selector($jqueryTemplate) { return $jqueryTemplate.find("div")[0]; }, snippet: '' }], "views/feed/feed-item-renderer.html": [{ id: "affectedAsset15", method: "add", mode: "partial", type: "jquery", selector: function selector($jqueryTemplate) { //return $jqueryTemplate.find("a[ng-if=\"item.isAppEnabled && item.relatedObject.type !== 'knowledge'\"]"); return $jqueryTemplate.find(".feed-item__header")[0]; }, snippet: '{{item.relatedObject.title}}' }, { id: "affectedAsset16", type: "jquery", mode: "attribute", attributes: { "replace": { //"ng-if": "field.isTextField() && showField(field) && field.name != \'"+this.injectConfig.params.injectFieldName+"\'" "ng-if": "item.isAppEnabled && item.relatedObject.type !== 'knowledge' && item.relatedObject.type !== 'asset'" } }, selector: function selector($jqueryTemplate) { return $jqueryTemplate.find("a[ng-if=\"item.isAppEnabled && item.relatedObject.type !== 'knowledge'\"]"); } }], "views/asset/asset-details-lifecycle.html": [{ id: "affectedAsset5", method: "replace", mode: "partial", type: "jquery", selector: function selector($jqueryTemplate) { return $jqueryTemplate.find(".profile__title-link > .profile__title"); }, snippet: '{{asset.name}}' }, { id: "affectedAsset6", method: "replace", mode: "partial", type: "jquery", selector: function selector($jqueryTemplate) { return $jqueryTemplate.find(".ticket__name-link"); }, snippet: '{{\'search.preview.viewFullAsset\' | i18n}}' }], "views/person/person-asset-renderer.html": [{ id: "affectedAsset7", method: "replace", mode: "partial", type: "jquery", selector: function selector($jqueryTemplate) { return $jqueryTemplate.find(".resource-slice__linked-item_title").find("a[entity-profile-link='data']"); ; }, snippet: '{{data.name}}' }], "views/person/person-details.html": [ /*{ id: "affectedAsset8", type: "jquery", mode: "partial", method: "replace", selector: function ($jqueryTemplate) { return $jqueryTemplate.find("person-asset-renderer")[1]; }, snippet: '', }, */ { id: "affectedAsset9", type: "jquery", mode: "attribute", attributes: { "add": { //"ng-if": "field.isTextField() && showField(field) && field.name != \'"+this.injectConfig.params.injectFieldName+"\'" "style": "cursor: default !important" } }, selector: function selector($jqueryTemplate) { return $jqueryTemplate.find("person-asset-renderer").parents(".person-item__template"); }, snippet: '' }, { id: "affectedAsset8", type: "jquery", mode: "partial", method: "replace", selector: function selector($jqueryTemplate) { return $jqueryTemplate.find("person-asset-renderer")[1]; }, snippet: '' }] }; } }, { key: "injectDynTemplates", value: function injectDynTemplates() { return {}; } }, { key: "templates", value: function templates() { return [{//origin: "views/ticket/incident-details-v2.html", //template: "views/ticket/incident-details-v2.html" }, {//origin: "views/ticket/task-details-v2.html", //template: "views/ticket/task-details-v2.html" }, {//template: "views/ticket/ticket-gtw-panel.html" }, {//template: "views/ticket/ticket-gtw-item.html" }, {//template: "views/ticket/ticket-gtw-item-dialog.html" }, {//template: "views/ticket/ticket-gtw-details.html" }, {//template: "views/ticket/ticket-gtw-item-interface.html" }]; } }, { key: "i18nLocales", value: function i18nLocales() { return {// "de":["i18n/ntt-resources-locale_de.json"], // "en":["i18n/ntt-resources-locale_en.json"] }; } }]); return customEnitiyProfileLink; }(ntt.smartit.api.ICustomModule); ntt.smartit.api.nttSmartitModules.push(new customEnitiyProfileLink()); /***/ }), /***/ "./src/modules/customEntityAssetLink/services/custom-asset-link-service.js": /*!*********************************************************************************!*\ !*** ./src/modules/customEntityAssetLink/services/custom-asset-link-service.js ***! \*********************************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; (function () { 'use strict'; angular.module('myitsmApp').factory('customAssetLinkService', function () { return { parseLink: function parseLink(pattern, ciData, mapping) { if (!ciData) { console.log('No information about entity!'); } else if (!pattern) console.log('link pattern missing...check configuration!');else { var object = ciData; if (mapping) { object["name"] = ciData[mapping["name"]]; object["reconciliationId"] = ciData[mapping["reconciliationId"]]; } var entityLink = pattern.replace("{Name}", object.name); entityLink = entityLink.replace("{ReconciliationId}", object.reconciliationId); return entityLink; } return null; } }; }); })(); /***/ }) /******/ }); }); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9udHQuc21hcnRpdC5jdXN0b21FbnRpdHlBc3NldExpbmsvd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovL250dC5zbWFydGl0LmN1c3RvbUVudGl0eUFzc2V0TGluay93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9udHQuc21hcnRpdC5jdXN0b21FbnRpdHlBc3NldExpbmsvLi9zcmMvbW9kdWxlcy9jdXN0b21FbnRpdHlBc3NldExpbmsvZGlyZWN0aXZlcy9udHQtY3VzdG9tLWFmZmVjdGVkLWFzc2V0LWxpbmstZGlyZWN0aXZlLmpzIiwid2VicGFjazovL250dC5zbWFydGl0LmN1c3RvbUVudGl0eUFzc2V0TGluay8uL3NyYy9tb2R1bGVzL2N1c3RvbUVudGl0eUFzc2V0TGluay9kaXJlY3RpdmVzL250dC1zY29wZWNvbnRyb2xsZXItY2ktcmVsYXRpb25zLWRpcmVjdGl2ZS5qcyIsIndlYnBhY2s6Ly9udHQuc21hcnRpdC5jdXN0b21FbnRpdHlBc3NldExpbmsvLi9zcmMvbW9kdWxlcy9jdXN0b21FbnRpdHlBc3NldExpbmsvaW5kZXguanMiLCJ3ZWJwYWNrOi8vbnR0LnNtYXJ0aXQuY3VzdG9tRW50aXR5QXNzZXRMaW5rLy4vc3JjL21vZHVsZXMvY3VzdG9tRW50aXR5QXNzZXRMaW5rL3NlcnZpY2VzL2N1c3RvbS1hc3NldC1saW5rLXNlcnZpY2UuanMiXSwibmFtZXMiOlsiYW5ndWxhciIsIm1vZHVsZSIsImRpcmVjdGl2ZSIsIk1vZHVsZUNvbmZpZ1NlcnZpY2UiLCJjdXN0b21Bc3NldExpbmtTZXJ2aWNlIiwicmVzdHJpY3QiLCJzY29wZSIsImNpRGF0YSIsIm1hcHBpbmciLCJsaW5rIiwiaUVsZW1lbnQiLCJwIiwicGFyZW50cyIsInJlbW92ZUF0dHJpYnV0ZSIsInNldEF0dHJpYnV0ZSIsIiRwYXJlbnQiLCJzaG93RGV0YWlscyIsImNvbnNvbGUiLCJsb2ciLCJsaW5rRm9ybWF0IiwiZ2V0TW9kdWxlQ29uZmlnIiwicGFyc2VMaW5rIiwiYXR0ciIsIm9wZW5Jbk5ld1RhYiIsIiR3aW5kb3ciLCJ0ZW1wbGF0ZSIsInJlcGxhY2UiLCJ2YXJpYWJsZSIsImVsZW1lbnQiLCJhdHRycyIsImNvbnRyb2xsZXIiLCIkZWxlbWVudCIsIiRhdHRycyIsIiRzY29wZSIsInNob3dQcmV2aWV3Iiwicm93IiwibG9jYXRpb24iLCJocmVmIiwib3BlbiIsInJlcXVpcmUiLCJjdXN0b21Fbml0aXlQcm9maWxlTGluayIsImlkIiwibWV0aG9kIiwibW9kZSIsInR5cGUiLCJzZWxlY3RvciIsIiRqcXVlcnlUZW1wbGF0ZSIsImZpbmQiLCJzbmlwcGV0IiwiYXR0cmlidXRlcyIsIm50dCIsInNtYXJ0aXQiLCJhcGkiLCJJQ3VzdG9tTW9kdWxlIiwibnR0U21hcnRpdE1vZHVsZXMiLCJwdXNoIiwiZmFjdG9yeSIsInBhdHRlcm4iLCJvYmplY3QiLCJlbnRpdHlMaW5rIiwibmFtZSIsInJlY29uY2lsaWF0aW9uSWQiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUMsdURBQXVEO0FBQ3hGLENBQUM7QUFDRCxPO0FDVkE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxrREFBMEMsZ0NBQWdDO0FBQzFFO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZ0VBQXdELGtCQUFrQjtBQUMxRTtBQUNBLHlEQUFpRCxjQUFjO0FBQy9EOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpREFBeUMsaUNBQWlDO0FBQzFFLHdIQUFnSCxtQkFBbUIsRUFBRTtBQUNySTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG1DQUEyQiwwQkFBMEIsRUFBRTtBQUN2RCx5Q0FBaUMsZUFBZTtBQUNoRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw4REFBc0QsK0RBQStEOztBQUVySDtBQUNBOzs7QUFHQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNqRkFBLE9BQU8sQ0FBQ0MsTUFBUixDQUFlLFdBQWYsRUFDS0MsU0FETCxDQUNlLHlCQURmLEVBQzBDLENBQUMscUJBQUQsRUFBd0Isd0JBQXhCLEVBQ2xDLFVBQVVDLG1CQUFWLEVBQStCQyxzQkFBL0IsRUFBdUQ7QUFDbkQsU0FBTztBQUNIQyxZQUFRLEVBQUUsR0FEUDtBQUVIQyxTQUFLLEVBQUU7QUFDSEMsWUFBTSxFQUFFLDBCQURMO0FBRUhDLGFBQU8sRUFBRTtBQUZOLEtBRko7QUFNSEMsUUFBSSxFQUFFLGNBQVVILEtBQVYsRUFBaUJJLFFBQWpCLEVBQTJCO0FBRTdCLFVBQUlDLENBQUMsR0FBR0QsUUFBUSxDQUFDRSxPQUFULENBQWlCLHlCQUFqQixFQUE0QyxDQUE1QyxDQUFSOztBQUNBLFVBQUdELENBQUgsRUFBTTtBQUNGQSxTQUFDLENBQUNFLGVBQUYsQ0FBa0IsVUFBbEI7QUFDQUYsU0FBQyxDQUFDRyxZQUFGLENBQWUsT0FBZixFQUF1Qiw0QkFBdkI7QUFDSDs7QUFFRFIsV0FBSyxDQUFDUyxPQUFOLENBQWNBLE9BQWQsQ0FBc0JDLFdBQXRCLEdBQWtDLElBQWxDOztBQUNBLFVBQUksQ0FBQ1YsS0FBSyxDQUFDQyxNQUFYLEVBQW1CO0FBQ2ZVLGVBQU8sQ0FBQ0MsR0FBUixDQUFZLDZCQUFaO0FBQ0gsT0FGRCxNQUdLO0FBQ0QsWUFBSUMsVUFBVSxHQUFHaEIsbUJBQW1CLENBQUNpQixlQUFwQixDQUFvQyx1QkFBcEMsRUFBNkQsWUFBN0QsQ0FBakI7QUFDQSxZQUFJWCxJQUFJLEdBQUdMLHNCQUFzQixDQUFDaUIsU0FBdkIsQ0FBaUNGLFVBQWpDLEVBQTZDYixLQUFLLENBQUNDLE1BQW5ELEVBQTBERCxLQUFLLENBQUNFLE9BQWhFLENBQVgsQ0FGQyxDQUdEO0FBRUE7QUFDQTs7QUFFQUUsZ0JBQVEsQ0FBQ1ksSUFBVCxDQUFjLE1BQWQsRUFBc0JiLElBQXRCO0FBRUEsWUFBSWMsWUFBWSxHQUFHcEIsbUJBQW1CLENBQUNpQixlQUFwQixDQUFvQyx1QkFBcEMsRUFBNkQsY0FBN0QsQ0FBbkI7QUFDQUcsb0JBQVksR0FBRyxPQUFPQSxZQUFQLElBQXVCLFdBQXZCLEdBQXFDLElBQXJDLEdBQTRDQSxZQUEzRDtBQUNBLFlBQUdBLFlBQUgsRUFDQWIsUUFBUSxDQUFDWSxJQUFULENBQWMsUUFBZCxFQUF1QixRQUF2QjtBQUVIO0FBRUo7QUFuQ0UsR0FBUDtBQXFDSCxDQXZDaUMsQ0FEMUMsRTs7Ozs7Ozs7Ozs7QUNEQXRCLE9BQU8sQ0FBQ0MsTUFBUixDQUFlLFdBQWYsRUFDR0MsU0FESCxDQUNhLDRCQURiLEVBQzJDLENBQUMsd0JBQUQsRUFBMkIscUJBQTNCLEVBQWtELFNBQWxELEVBQ3ZDLFVBQVVFLHNCQUFWLEVBQWtDRCxtQkFBbEMsRUFBdURxQixPQUF2RCxFQUFnRTtBQUM5RCxTQUFPO0FBQ0xuQixZQUFRLEVBQUUsR0FETDtBQUVMb0IsWUFBUSxFQUFFLEVBRkw7QUFHTEMsV0FBTyxFQUFFLEtBSEo7QUFJTHBCLFNBQUssRUFBRTtBQUNMcUIsY0FBUSxFQUFFO0FBREwsS0FKRjtBQU9MbEIsUUFBSSxFQUFFLGNBQVVILEtBQVYsRUFBaUJzQixPQUFqQixFQUEwQkMsS0FBMUIsRUFBaUMsQ0FDdEMsQ0FSSTtBQVNMQyxjQUFVLEVBQUMsQ0FBQyxVQUFELEVBQVksUUFBWixFQUFxQixRQUFyQixFQUE4QixVQUFVQyxRQUFWLEVBQW9CQyxNQUFwQixFQUE0QkMsTUFBNUIsRUFBb0M7QUFFM0UsVUFBSWQsVUFBVSxHQUFHaEIsbUJBQW1CLENBQUNpQixlQUFwQixDQUFvQyx1QkFBcEMsRUFBNkQsWUFBN0QsQ0FBakI7QUFDQSxVQUFJRyxZQUFZLEdBQUdwQixtQkFBbUIsQ0FBQ2lCLGVBQXBCLENBQW9DLHVCQUFwQyxFQUE2RCxjQUE3RCxDQUFuQjtBQUNBRyxrQkFBWSxHQUFHLE9BQU9BLFlBQVAsSUFBdUIsV0FBdkIsR0FBcUMsSUFBckMsR0FBNENBLFlBQTNEOztBQUVBVSxZQUFNLENBQUNsQixPQUFQLENBQWVtQixXQUFmLEdBQTZCLFVBQVVDLEdBQVYsRUFBZTtBQUMxQyxZQUFJMUIsSUFBSSxHQUFHTCxzQkFBc0IsQ0FBQ2lCLFNBQXZCLENBQWlDRixVQUFqQyxFQUE2Q2dCLEdBQTdDLENBQVg7O0FBQ0EsWUFBSTFCLElBQUosRUFBVTtBQUNSLGNBQUcsQ0FBQ2MsWUFBSixFQUNFQyxPQUFPLENBQUNZLFFBQVIsQ0FBaUJDLElBQWpCLEdBQXdCNUIsSUFBeEIsQ0FERixLQUdHZSxPQUFPLENBQUNjLElBQVIsQ0FBYTdCLElBQWIsRUFBbUIsUUFBbkI7QUFDSjtBQUNGLE9BUkQ7QUFTRCxLQWZVO0FBVE4sR0FBUDtBQTJCRCxDQTdCc0MsQ0FEM0MsRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNBQTtBQUNBOEIsbUJBQU8sQ0FBQyx1SEFBRCxDQUFQOztBQUNBQSxtQkFBTyxDQUFDLHlKQUFELENBQVA7O0FBQ0FBLG1CQUFPLENBQUMsNkpBQUQsQ0FBUDs7QUFFTyxJQUFNQyx1QkFBYjtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBOztBQUFBO0FBQUE7O0FBQUE7QUFBQTtBQUFBLDJCQUVTO0FBQ0wsYUFBTyx1QkFBUDtBQUNEO0FBSkg7QUFBQTtBQUFBLHNDQU9vQjtBQUNoQixhQUFPO0FBQ0wsMENBQWtDLENBQUM7QUFDakNDLFlBQUUsRUFBRSx5QkFENkI7QUFFakNDLGdCQUFNLEVBQUUsU0FGeUI7QUFHakNDLGNBQUksRUFBRSxTQUgyQjtBQUlqQ0MsY0FBSSxFQUFFLFFBSjJCO0FBS2pDQyxrQkFBUSxFQUFFLGtCQUFVQyxlQUFWLEVBQTJCO0FBQ25DLG1CQUFPQSxlQUFlLENBQUNDLElBQWhCLENBQXFCLG1CQUFyQixFQUEwQ0EsSUFBMUMsQ0FBK0MsK0JBQS9DLENBQVA7QUFDRCxXQVBnQztBQVFqQ0MsaUJBQU8sRUFBRTtBQVJ3QixTQUFELENBRDdCO0FBV0wsb0RBQTRDLENBQUM7QUFDM0NQLFlBQUUsRUFBRSxlQUR1QztBQUUzQ0MsZ0JBQU0sRUFBRSxTQUZtQztBQUczQ0MsY0FBSSxFQUFFLFNBSHFDO0FBSTNDQyxjQUFJLEVBQUUsUUFKcUM7QUFLM0NDLGtCQUFRLEVBQUUsa0JBQVVDLGVBQVYsRUFBMkI7QUFDbkMsbUJBQU9BLGVBQWUsQ0FBQ0MsSUFBaEIsQ0FBcUIsMEJBQXJCLEVBQWlEQSxJQUFqRCxDQUFzRCwrQkFBdEQsQ0FBUDtBQUNELFdBUDBDO0FBUTNDQyxpQkFBTyxFQUFFO0FBUmtDLFNBQUQsQ0FYdkM7QUFxQkwsNkRBQXFELENBQUM7QUFDcERQLFlBQUUsRUFBRSxnQkFEZ0Q7QUFFcERDLGdCQUFNLEVBQUUsU0FGNEM7QUFHcERDLGNBQUksRUFBRSxTQUg4QztBQUlwREMsY0FBSSxFQUFFLFFBSjhDO0FBS3BEQyxrQkFBUSxFQUFFLGtCQUFVQyxlQUFWLEVBQTJCO0FBQ25DLG1CQUFPQSxlQUFlLENBQUNDLElBQWhCLENBQXFCLGlDQUFyQixDQUFQO0FBQ0QsV0FQbUQ7QUFRcERDLGlCQUFPLEVBQUU7QUFSMkMsU0FBRCxDQXJCaEQ7QUErQkwscURBQTZDLENBQUM7QUFDNUNQLFlBQUUsRUFBRSxnQkFEd0M7QUFFNUNDLGdCQUFNLEVBQUUsU0FGb0M7QUFHNUNDLGNBQUksRUFBRSxTQUhzQztBQUk1Q0MsY0FBSSxFQUFFLFFBSnNDO0FBSzVDQyxrQkFBUSxFQUFFLGtCQUFVQyxlQUFWLEVBQTJCO0FBQ25DLG1CQUFPQSxlQUFlLENBQUNDLElBQWhCLENBQXFCLGlDQUFyQixDQUFQO0FBQ0QsV0FQMkM7QUFRNUNDLGlCQUFPLEVBQUU7QUFSbUMsU0FBRCxDQS9CeEM7QUF5Q0wsMENBQWtDLENBQUM7QUFDakNQLFlBQUUsRUFBRSxnQkFENkI7QUFFakNDLGdCQUFNLEVBQUUsS0FGeUI7QUFHakNDLGNBQUksRUFBRSxTQUgyQjtBQUlqQ0MsY0FBSSxFQUFFLFFBSjJCO0FBS2pDQyxrQkFBUSxFQUFFLGtCQUFVQyxlQUFWLEVBQTJCO0FBQ25DLG1CQUFPQSxlQUFlLENBQUNDLElBQWhCLENBQXFCLEtBQXJCLEVBQTRCLENBQTVCLENBQVA7QUFDRCxXQVBnQztBQVFqQ0MsaUJBQU8sRUFBRTtBQVJ3QixTQUFELENBekM3QjtBQW9ETCw4Q0FBcUMsQ0FBQztBQUNwQ1AsWUFBRSxFQUFFLGlCQURnQztBQUVwQ0MsZ0JBQU0sRUFBRSxLQUY0QjtBQUdwQ0MsY0FBSSxFQUFFLFNBSDhCO0FBSXBDQyxjQUFJLEVBQUUsUUFKOEI7QUFLcENDLGtCQUFRLEVBQUUsa0JBQVVDLGVBQVYsRUFBMkI7QUFDbkM7QUFDQSxtQkFBT0EsZUFBZSxDQUFDQyxJQUFoQixDQUFxQixvQkFBckIsRUFBMkMsQ0FBM0MsQ0FBUDtBQUNELFdBUm1DO0FBU3BDQyxpQkFBTyxFQUFFO0FBVDJCLFNBQUQsRUFXckM7QUFDRVAsWUFBRSxFQUFFLGlCQUROO0FBRUVHLGNBQUksRUFBRSxRQUZSO0FBR0VELGNBQUksRUFBRSxXQUhSO0FBSUVNLG9CQUFVLEVBQUU7QUFDVix1QkFBVztBQUNUO0FBQ0EsdUJBQVM7QUFGQTtBQURELFdBSmQ7QUFVQUosa0JBQVEsRUFBRSxrQkFBVUMsZUFBVixFQUEyQjtBQUNuQyxtQkFBT0EsZUFBZSxDQUFDQyxJQUFoQixDQUFxQiwyRUFBckIsQ0FBUDtBQUNEO0FBWkQsU0FYcUMsQ0FwRGhDO0FBOEVMLG9EQUE0QyxDQUFDO0FBQzNDTixZQUFFLEVBQUUsZ0JBRHVDO0FBRTNDQyxnQkFBTSxFQUFFLFNBRm1DO0FBRzNDQyxjQUFJLEVBQUUsU0FIcUM7QUFJM0NDLGNBQUksRUFBRSxRQUpxQztBQUszQ0Msa0JBQVEsRUFBRSxrQkFBVUMsZUFBVixFQUEyQjtBQUNuQyxtQkFBT0EsZUFBZSxDQUFDQyxJQUFoQixDQUFxQix3Q0FBckIsQ0FBUDtBQUNELFdBUDBDO0FBUTNDQyxpQkFBTyxFQUFFO0FBUmtDLFNBQUQsRUFVNUM7QUFDRVAsWUFBRSxFQUFFLGdCQUROO0FBRUVDLGdCQUFNLEVBQUUsU0FGVjtBQUdFQyxjQUFJLEVBQUUsU0FIUjtBQUlFQyxjQUFJLEVBQUUsUUFKUjtBQUtFQyxrQkFBUSxFQUFFLGtCQUFVQyxlQUFWLEVBQTJCO0FBQ25DLG1CQUFPQSxlQUFlLENBQUNDLElBQWhCLENBQXFCLG9CQUFyQixDQUFQO0FBQ0QsV0FQSDtBQVFFQyxpQkFBTyxFQUFFO0FBUlgsU0FWNEMsQ0E5RXZDO0FBbUdQLG1EQUEyQyxDQUFDO0FBQzFDUCxZQUFFLEVBQUUsZ0JBRHNDO0FBRTFDQyxnQkFBTSxFQUFFLFNBRmtDO0FBRzFDQyxjQUFJLEVBQUUsU0FIb0M7QUFJMUNDLGNBQUksRUFBRSxRQUpvQztBQUsxQ0Msa0JBQVEsRUFBRSxrQkFBVUMsZUFBVixFQUEyQjtBQUNuQyxtQkFBT0EsZUFBZSxDQUFDQyxJQUFoQixDQUFxQixvQ0FBckIsRUFBMkRBLElBQTNELENBQWdFLCtCQUFoRSxDQUFQO0FBQXdHO0FBQ3pHLFdBUHlDO0FBUTFDQyxpQkFBTyxFQUFFO0FBUmlDLFNBQUQsQ0FuR3BDO0FBOEdQLDRDQUFvQztBQUNsQzs7Ozs7Ozs7OztBQVdGO0FBQ0VQLFlBQUUsRUFBRSxnQkFETjtBQUVFRyxjQUFJLEVBQUUsUUFGUjtBQUdFRCxjQUFJLEVBQUUsV0FIUjtBQUlFTSxvQkFBVSxFQUFFO0FBQ1YsbUJBQU87QUFDSDtBQUNBLHVCQUFTO0FBRk47QUFERyxXQUpkO0FBVUVKLGtCQUFRLEVBQUUsa0JBQVVDLGVBQVYsRUFBMkI7QUFDbkMsbUJBQU9BLGVBQWUsQ0FBQ0MsSUFBaEIsQ0FBcUIsdUJBQXJCLEVBQThDbkMsT0FBOUMsQ0FBc0Qsd0JBQXRELENBQVA7QUFDRCxXQVpIO0FBYUdvQyxpQkFBTyxFQUFFO0FBYlosU0Fab0MsRUE0QnBDO0FBQ0VQLFlBQUUsRUFBRSxnQkFETjtBQUVFRyxjQUFJLEVBQUUsUUFGUjtBQUdFRCxjQUFJLEVBQUUsU0FIUjtBQUlFRCxnQkFBTSxFQUFFLFNBSlY7QUFLRUcsa0JBQVEsRUFBRSxrQkFBVUMsZUFBVixFQUEyQjtBQUNuQyxtQkFBT0EsZUFBZSxDQUFDQyxJQUFoQixDQUFxQix1QkFBckIsRUFBOEMsQ0FBOUMsQ0FBUDtBQUNELFdBUEg7QUFRR0MsaUJBQU8sRUFBRTtBQVJaLFNBNUJvQztBQTlHN0IsT0FBUDtBQXdKRDtBQWhLSDtBQUFBO0FBQUEseUNBa0t1QjtBQUNuQixhQUFPLEVBQVA7QUFHRDtBQXRLSDtBQUFBO0FBQUEsZ0NBMktjO0FBQ1YsYUFBTyxDQUNMLENBQ0U7QUFDQTtBQUZGLE9BREssRUFLTCxDQUNFO0FBQ0E7QUFGRixPQUxLLEVBU0wsQ0FDRTtBQURGLE9BVEssRUFZTCxDQUNFO0FBREYsT0FaSyxFQWVMLENBQ0U7QUFERixPQWZLLEVBa0JMLENBQ0U7QUFERixPQWxCSyxFQXFCTCxDQUNFO0FBREYsT0FyQkssQ0FBUDtBQXlCRDtBQXJNSDtBQUFBO0FBQUEsa0NBdU1nQjtBQUVaLGFBQU8sQ0FDTDtBQUNBO0FBRkssT0FBUDtBQUtEO0FBOU1IOztBQUFBO0FBQUEsRUFBNkNFLEdBQUcsQ0FBQ0MsT0FBSixDQUFZQyxHQUFaLENBQWdCQyxhQUE3RDtBQWtOQUgsR0FBRyxDQUFDQyxPQUFKLENBQVlDLEdBQVosQ0FBZ0JFLGlCQUFoQixDQUFrQ0MsSUFBbEMsQ0FBdUMsSUFBSWYsdUJBQUosRUFBdkMsRTs7Ozs7Ozs7Ozs7O0FDdk5hOztBQUNaLGFBQVk7QUFDVDs7QUFDQXhDLFNBQU8sQ0FBQ0MsTUFBUixDQUFlLFdBQWYsRUFDS3VELE9BREwsQ0FDYSx3QkFEYixFQUVJLFlBQVk7QUFFTixXQUFPO0FBQ0huQyxlQUFTLEVBQUUsbUJBQVNvQyxPQUFULEVBQWtCbEQsTUFBbEIsRUFBMEJDLE9BQTFCLEVBQW1DO0FBRTVDLFlBQUcsQ0FBQ0QsTUFBSixFQUFZO0FBQ1JVLGlCQUFPLENBQUNDLEdBQVIsQ0FBWSw4QkFBWjtBQUNILFNBRkQsTUFHSyxJQUFJLENBQUN1QyxPQUFMLEVBQ0R4QyxPQUFPLENBQUNDLEdBQVIsQ0FBWSw2Q0FBWixFQURDLEtBRUE7QUFFRCxjQUFJd0MsTUFBTSxHQUFHbkQsTUFBYjs7QUFFQSxjQUFHQyxPQUFILEVBQVk7QUFDUmtELGtCQUFNLENBQUMsTUFBRCxDQUFOLEdBQWlCbkQsTUFBTSxDQUFDQyxPQUFPLENBQUMsTUFBRCxDQUFSLENBQXZCO0FBQ0FrRCxrQkFBTSxDQUFDLGtCQUFELENBQU4sR0FBMkJuRCxNQUFNLENBQUNDLE9BQU8sQ0FBQyxrQkFBRCxDQUFSLENBQWpDO0FBQ0g7O0FBRUQsY0FBSW1ELFVBQVUsR0FBR0YsT0FBTyxDQUFDL0IsT0FBUixDQUFnQixRQUFoQixFQUEwQmdDLE1BQU0sQ0FBQ0UsSUFBakMsQ0FBakI7QUFDQUQsb0JBQVUsR0FBR0EsVUFBVSxDQUFDakMsT0FBWCxDQUFtQixvQkFBbkIsRUFBeUNnQyxNQUFNLENBQUNHLGdCQUFoRCxDQUFiO0FBRUEsaUJBQVFGLFVBQVI7QUFFSDs7QUFFRCxlQUFPLElBQVA7QUFFRDtBQTFCRSxLQUFQO0FBK0JMLEdBbkNMO0FBb0NILENBdENBLEdBQUQsQyIsImZpbGUiOiJudHQuc21hcnRpdC5jdXN0b21FbnRpdHlBc3NldExpbmsuanMiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShbXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJjdXN0b21FbnRpdHlBc3NldExpbmtcIl0gPSBmYWN0b3J5KCk7XG5cdGVsc2Vcblx0XHRyb290W1wibnR0XCJdID0gcm9vdFtcIm50dFwiXSB8fCB7fSwgcm9vdFtcIm50dFwiXVtcInNtYXJ0aXRcIl0gPSByb290W1wibnR0XCJdW1wic21hcnRpdFwiXSB8fCB7fSwgcm9vdFtcIm50dFwiXVtcInNtYXJ0aXRcIl1bXCJjdXN0b21FbnRpdHlBc3NldExpbmtcIl0gPSBmYWN0b3J5KCk7XG59KSh3aW5kb3csIGZ1bmN0aW9uKCkge1xucmV0dXJuICIsIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGdldHRlciB9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuIFx0XHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcbiBcdFx0fVxuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuIFx0fTtcblxuIFx0Ly8gY3JlYXRlIGEgZmFrZSBuYW1lc3BhY2Ugb2JqZWN0XG4gXHQvLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXRcbiBcdC8vIG1vZGUgJiAyOiBtZXJnZSBhbGwgcHJvcGVydGllcyBvZiB2YWx1ZSBpbnRvIHRoZSBuc1xuIFx0Ly8gbW9kZSAmIDQ6IHJldHVybiB2YWx1ZSB3aGVuIGFscmVhZHkgbnMgb2JqZWN0XG4gXHQvLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnQgPSBmdW5jdGlvbih2YWx1ZSwgbW9kZSkge1xuIFx0XHRpZihtb2RlICYgMSkgdmFsdWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKHZhbHVlKTtcbiBcdFx0aWYobW9kZSAmIDgpIHJldHVybiB2YWx1ZTtcbiBcdFx0aWYoKG1vZGUgJiA0KSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTtcbiBcdFx0dmFyIG5zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yKG5zKTtcbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG5zLCAnZGVmYXVsdCcsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0pO1xuIFx0XHRpZihtb2RlICYgMiAmJiB0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIGZvcih2YXIga2V5IGluIHZhbHVlKSBfX3dlYnBhY2tfcmVxdWlyZV9fLmQobnMsIGtleSwgZnVuY3Rpb24oa2V5KSB7IHJldHVybiB2YWx1ZVtrZXldOyB9LmJpbmQobnVsbCwga2V5KSk7XG4gXHRcdHJldHVybiBucztcbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSBcIi4vc3JjL21vZHVsZXMvY3VzdG9tRW50aXR5QXNzZXRMaW5rL2luZGV4LmpzXCIpO1xuIiwiXHJcbmFuZ3VsYXIubW9kdWxlKCdteWl0c21BcHAnKVxyXG4gICAgLmRpcmVjdGl2ZSgnY3VzdG9tQWZmZWN0ZWRBc3NldExpbmsnLCBbJ01vZHVsZUNvbmZpZ1NlcnZpY2UnLCAnY3VzdG9tQXNzZXRMaW5rU2VydmljZScsXHJcbiAgICAgICAgZnVuY3Rpb24gKE1vZHVsZUNvbmZpZ1NlcnZpY2UsIGN1c3RvbUFzc2V0TGlua1NlcnZpY2UpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIHJlc3RyaWN0OiAnQScsXHJcbiAgICAgICAgICAgICAgICBzY29wZToge1xyXG4gICAgICAgICAgICAgICAgICAgIGNpRGF0YTogJz1jdXN0b21BZmZlY3RlZEFzc2V0TGluaycsXHJcbiAgICAgICAgICAgICAgICAgICAgbWFwcGluZzogJz1tYXBwaW5nJ1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGxpbms6IGZ1bmN0aW9uIChzY29wZSwgaUVsZW1lbnQpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHAgPSBpRWxlbWVudC5wYXJlbnRzKFwiLnByb2ZpbGUtcmVsYXRpb25fX2l0ZW1cIilbMF07XHJcbiAgICAgICAgICAgICAgICAgICAgaWYocCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwLnJlbW92ZUF0dHJpYnV0ZShcIm5nLWNsaWNrXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwLnNldEF0dHJpYnV0ZShcInN0eWxlXCIsXCJjdXJzb3I6IGRlZmF1bHQgIWltcG9ydGFudFwiKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHNjb3BlLiRwYXJlbnQuJHBhcmVudC5zaG93RGV0YWlscz1udWxsO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghc2NvcGUuY2lEYXRhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdObyBpbmZvcm1hdGlvbiBhYm91dCBlbnRpdHknKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsaW5rRm9ybWF0ID0gTW9kdWxlQ29uZmlnU2VydmljZS5nZXRNb2R1bGVDb25maWcoXCJjdXN0b21FbnRpdHlBc3NldExpbmtcIilbXCJsaW5rRm9ybWF0XCJdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbGluayA9IGN1c3RvbUFzc2V0TGlua1NlcnZpY2UucGFyc2VMaW5rKGxpbmtGb3JtYXQsIHNjb3BlLmNpRGF0YSxzY29wZS5tYXBwaW5nKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy92YXIgb2JqZWN0ID0gc2NvcGUuY2lEYXRhO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy92YXIgZW50aXR5TGluayA9IGxpbmtGb3JtYXQucmVwbGFjZShcIntOYW1lfVwiLCBvYmplY3QubmFtZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vZW50aXR5TGluayA9IGVudGl0eUxpbmsucmVwbGFjZShcIntSZWNvbmNpbGlhdGlvbklkfVwiLCBvYmplY3QucmVjb25jaWxpYXRpb25JZCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpRWxlbWVudC5hdHRyKCdocmVmJywgbGluayk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgb3BlbkluTmV3VGFiID0gTW9kdWxlQ29uZmlnU2VydmljZS5nZXRNb2R1bGVDb25maWcoXCJjdXN0b21FbnRpdHlBc3NldExpbmtcIilbXCJvcGVuSW5OZXdUYWJcIl07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5Jbk5ld1RhYiA9IHR5cGVvZiBvcGVuSW5OZXdUYWIgPT0gXCJ1bmRlZmluZWRcIiA/IHRydWUgOiBvcGVuSW5OZXdUYWI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKG9wZW5Jbk5ld1RhYilcclxuICAgICAgICAgICAgICAgICAgICAgICAgaUVsZW1lbnQuYXR0cigndGFyZ2V0JywnX2JsYW5rJyk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfV0pOyIsImFuZ3VsYXIubW9kdWxlKCdteWl0c21BcHAnKVxyXG4gIC5kaXJlY3RpdmUoJ3Njb3BlQ29udHJvbGxlckNpUmVsYXRpb25zJywgWydjdXN0b21Bc3NldExpbmtTZXJ2aWNlJywgJ01vZHVsZUNvbmZpZ1NlcnZpY2UnLCAnJHdpbmRvdycsXHJcbiAgICBmdW5jdGlvbiAoY3VzdG9tQXNzZXRMaW5rU2VydmljZSwgTW9kdWxlQ29uZmlnU2VydmljZSwgJHdpbmRvdykge1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIHJlc3RyaWN0OiAnRScsXHJcbiAgICAgICAgdGVtcGxhdGU6ICcnLFxyXG4gICAgICAgIHJlcGxhY2U6IGZhbHNlLFxyXG4gICAgICAgIHNjb3BlOiB7XHJcbiAgICAgICAgICB2YXJpYWJsZTogJz0nXHJcbiAgICAgICAgfSxcclxuICAgICAgICBsaW5rOiBmdW5jdGlvbiAoc2NvcGUsIGVsZW1lbnQsIGF0dHJzKSB7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBjb250cm9sbGVyOlsnJGVsZW1lbnQnLCckYXR0cnMnLCckc2NvcGUnLGZ1bmN0aW9uICgkZWxlbWVudCwgJGF0dHJzLCAkc2NvcGUpIHtcclxuXHJcbiAgICAgICAgICB2YXIgbGlua0Zvcm1hdCA9IE1vZHVsZUNvbmZpZ1NlcnZpY2UuZ2V0TW9kdWxlQ29uZmlnKFwiY3VzdG9tRW50aXR5QXNzZXRMaW5rXCIpW1wibGlua0Zvcm1hdFwiXTtcclxuICAgICAgICAgIHZhciBvcGVuSW5OZXdUYWIgPSBNb2R1bGVDb25maWdTZXJ2aWNlLmdldE1vZHVsZUNvbmZpZyhcImN1c3RvbUVudGl0eUFzc2V0TGlua1wiKVtcIm9wZW5Jbk5ld1RhYlwiXTtcclxuICAgICAgICAgIG9wZW5Jbk5ld1RhYiA9IHR5cGVvZiBvcGVuSW5OZXdUYWIgPT0gXCJ1bmRlZmluZWRcIiA/IHRydWUgOiBvcGVuSW5OZXdUYWI7XHJcblxyXG4gICAgICAgICAgJHNjb3BlLiRwYXJlbnQuc2hvd1ByZXZpZXcgPSBmdW5jdGlvbiAocm93KSB7XHJcbiAgICAgICAgICAgIHZhciBsaW5rID0gY3VzdG9tQXNzZXRMaW5rU2VydmljZS5wYXJzZUxpbmsobGlua0Zvcm1hdCwgcm93KTtcclxuICAgICAgICAgICAgaWYgKGxpbmspIHtcclxuICAgICAgICAgICAgICBpZighb3BlbkluTmV3VGFiKVxyXG4gICAgICAgICAgICAgICAgJHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gbGluaztcclxuICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgJHdpbmRvdy5vcGVuKGxpbmssICdfYmxhbmsnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1dXHJcblxyXG4gICAgICB9XHJcbiAgICB9XSk7IiwiLy9yZXF1aXJlKCcuL2RpcmVjdGl2ZXMvbnR0LWN1c3RvbS1hc3NldC1lbnRpdHktcHJvZmlsZS1saW5rLWRpcmVjdGl2ZScpO1xyXG5yZXF1aXJlKCcuL3NlcnZpY2VzL2N1c3RvbS1hc3NldC1saW5rLXNlcnZpY2UnKTtcclxucmVxdWlyZSgnLi9kaXJlY3RpdmVzL250dC1jdXN0b20tYWZmZWN0ZWQtYXNzZXQtbGluay1kaXJlY3RpdmUnKTtcclxucmVxdWlyZSgnLi9kaXJlY3RpdmVzL250dC1zY29wZWNvbnRyb2xsZXItY2ktcmVsYXRpb25zLWRpcmVjdGl2ZScpO1xyXG5cclxuZXhwb3J0IGNsYXNzIGN1c3RvbUVuaXRpeVByb2ZpbGVMaW5rIGV4dGVuZHMgbnR0LnNtYXJ0aXQuYXBpLklDdXN0b21Nb2R1bGUge1xyXG5cclxuICBuYW1lKCkge1xyXG4gICAgcmV0dXJuIFwiY3VzdG9tRW50aXR5QXNzZXRMaW5rXCI7XHJcbiAgfVxyXG5cclxuXHJcbiAgaW5qZWN0VGVtcGxhdGVzKCkge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgXCJ2aWV3cy9jb21tb24vcmVsYXRlZC1pdGVtLmh0bWxcIjogW3tcclxuICAgICAgICBpZDogXCJjdXN0b21Fbml0aXlQcm9maWxlTGlua1wiLFxyXG4gICAgICAgIG1ldGhvZDogXCJyZXBsYWNlXCIsXHJcbiAgICAgICAgbW9kZTogXCJwYXJ0aWFsXCIsXHJcbiAgICAgICAgdHlwZTogXCJqcXVlcnlcIixcclxuICAgICAgICBzZWxlY3RvcjogZnVuY3Rpb24gKCRqcXVlcnlUZW1wbGF0ZSkge1xyXG4gICAgICAgICAgcmV0dXJuICRqcXVlcnlUZW1wbGF0ZS5maW5kKFwidGFibGUuYXNzZXQtdGFibGVcIikuZmluZChcImFbZW50aXR5LXByb2ZpbGUtbGluaz0naXRlbSddXCIpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgc25pcHBldDogJzxhIGN1c3RvbS1hZmZlY3RlZC1hc3NldC1saW5rPVwiaXRlbS5yZWFsT2JqZWN0XCIgY2xhc3M9XCJ0aWNrZXQtc3VtbWFyeS10cnVuY2F0ZVwiIHRpdGxlPVwie3tpdGVtLnJlYWxPYmplY3QubmFtZX19XCI+e3tpdGVtLnJlYWxPYmplY3QubmFtZX19PC9hPicsXHJcbiAgICAgIH1dLFxyXG4gICAgICBcInZpZXdzL2N1c3RvbS13aWRnZXRzL2FmZmVjdGVkLWFzc2V0Lmh0bWxcIjogW3tcclxuICAgICAgICBpZDogXCJhZmZlY3RlZEFzc2V0XCIsXHJcbiAgICAgICAgbWV0aG9kOiBcInJlcGxhY2VcIixcclxuICAgICAgICBtb2RlOiBcInBhcnRpYWxcIixcclxuICAgICAgICB0eXBlOiBcImpxdWVyeVwiLFxyXG4gICAgICAgIHNlbGVjdG9yOiBmdW5jdGlvbiAoJGpxdWVyeVRlbXBsYXRlKSB7XHJcbiAgICAgICAgICByZXR1cm4gJGpxdWVyeVRlbXBsYXRlLmZpbmQoXCJzcGFuLmN1c3RvbS1maWVsZF9fdmFsdWVcIikuZmluZChcImFbbmctaWY9J2RhdGEudmFsdWUuY2kubmFtZSddXCIpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgc25pcHBldDogJzxhIGN1c3RvbS1hZmZlY3RlZC1hc3NldC1saW5rPVwiZGF0YS52YWx1ZS5jaVwiIG5nLWlmPVwiZGF0YS52YWx1ZS5jaS5uYW1lXCIgYXJpYS1sYWJlbD1cInt7ZGF0YS5sYWJlbH19IHt7ZGF0YS52YWx1ZS5jaS5uYW1lfX1cIiAgY2xhc3M9XCJ0aWNrZXRfX2ZpZWxkLXZhbHVlXCI+e3tkYXRhLnZhbHVlLmNpLm5hbWV9fTwvYT4nXHJcbiAgICAgIH1dLFxyXG4gICAgICBcInZpZXdzL2tub3duLWVycm9yL2tub3duLWVycm9yLWRldGFpbHMtZWRpdG9yLmh0bWxcIjogW3tcclxuICAgICAgICBpZDogXCJhZmZlY3RlZEFzc2V0MlwiLFxyXG4gICAgICAgIG1ldGhvZDogXCJyZXBsYWNlXCIsXHJcbiAgICAgICAgbW9kZTogXCJwYXJ0aWFsXCIsXHJcbiAgICAgICAgdHlwZTogXCJqcXVlcnlcIixcclxuICAgICAgICBzZWxlY3RvcjogZnVuY3Rpb24gKCRqcXVlcnlUZW1wbGF0ZSkge1xyXG4gICAgICAgICAgcmV0dXJuICRqcXVlcnlUZW1wbGF0ZS5maW5kKFwiYVtuZy1pZj0ndGlja2V0LmNhdXNhbENJLm5hbWUnXVwiKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIHNuaXBwZXQ6ICc8YSBjdXN0b20tYWZmZWN0ZWQtYXNzZXQtbGluaz1cInRpY2tldC5jYXVzYWxDSVwiIG5nLWlmPVwidGlja2V0LmNhdXNhbENJLm5hbWVcIj57e3RpY2tldC5jYXVzYWxDSS5uYW1lfX08L2E+J1xyXG4gICAgICB9XSxcclxuICAgICAgXCJ2aWV3cy9wcm9ibGVtL3Byb2JsZW0tZGV0YWlscy1lZGl0b3IuaHRtbFwiOiBbe1xyXG4gICAgICAgIGlkOiBcImFmZmVjdGVkQXNzZXQzXCIsXHJcbiAgICAgICAgbWV0aG9kOiBcInJlcGxhY2VcIixcclxuICAgICAgICBtb2RlOiBcInBhcnRpYWxcIixcclxuICAgICAgICB0eXBlOiBcImpxdWVyeVwiLFxyXG4gICAgICAgIHNlbGVjdG9yOiBmdW5jdGlvbiAoJGpxdWVyeVRlbXBsYXRlKSB7XHJcbiAgICAgICAgICByZXR1cm4gJGpxdWVyeVRlbXBsYXRlLmZpbmQoXCJhW25nLWlmPSd0aWNrZXQuY2F1c2FsQ0kubmFtZSddXCIpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgc25pcHBldDogJzxhIGN1c3RvbS1hZmZlY3RlZC1hc3NldC1saW5rPVwidGlja2V0LmNhdXNhbENJXCIgbmctaWY9XCJ0aWNrZXQuY2F1c2FsQ0kubmFtZVwiPnt7dGlja2V0LmNhdXNhbENJLm5hbWV9fTwvYT4nXHJcbiAgICAgIH1dLFxyXG4gICAgICBcInZpZXdzL2NoYW5nZS9jaS1yZWxhdGlvbnMuaHRtbFwiOiBbe1xyXG4gICAgICAgIGlkOiBcImFmZmVjdGVkQXNzZXQ0XCIsXHJcbiAgICAgICAgbWV0aG9kOiBcImFkZFwiLFxyXG4gICAgICAgIG1vZGU6IFwicGFydGlhbFwiLFxyXG4gICAgICAgIHR5cGU6IFwianF1ZXJ5XCIsXHJcbiAgICAgICAgc2VsZWN0b3I6IGZ1bmN0aW9uICgkanF1ZXJ5VGVtcGxhdGUpIHtcclxuICAgICAgICAgIHJldHVybiAkanF1ZXJ5VGVtcGxhdGUuZmluZChcImRpdlwiKVswXTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIHNuaXBwZXQ6ICc8c2NvcGUtY29udHJvbGxlci1jaS1yZWxhdGlvbnMgdmFyaWFibGU9XCJpdGVtTGlzdFwiPjwvc2NvcGUtY29udHJvbGxlci1jaS1yZWxhdGlvbnM+JyxcclxuXHJcbiAgICAgIH1dLFxyXG4gICAgICBcInZpZXdzL2ZlZWQvZmVlZC1pdGVtLXJlbmRlcmVyLmh0bWxcIjpbe1xyXG4gICAgICAgIGlkOiBcImFmZmVjdGVkQXNzZXQxNVwiLFxyXG4gICAgICAgIG1ldGhvZDogXCJhZGRcIixcclxuICAgICAgICBtb2RlOiBcInBhcnRpYWxcIixcclxuICAgICAgICB0eXBlOiBcImpxdWVyeVwiLFxyXG4gICAgICAgIHNlbGVjdG9yOiBmdW5jdGlvbiAoJGpxdWVyeVRlbXBsYXRlKSB7XHJcbiAgICAgICAgICAvL3JldHVybiAkanF1ZXJ5VGVtcGxhdGUuZmluZChcImFbbmctaWY9XFxcIml0ZW0uaXNBcHBFbmFibGVkICYmIGl0ZW0ucmVsYXRlZE9iamVjdC50eXBlICE9PSAna25vd2xlZGdlJ1xcXCJdXCIpO1xyXG4gICAgICAgICAgcmV0dXJuICRqcXVlcnlUZW1wbGF0ZS5maW5kKFwiLmZlZWQtaXRlbV9faGVhZGVyXCIpWzBdO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgc25pcHBldDogJzxhIGNsYXNzPVwiZmVlZF9pdGVtX19kZXRhaWxzLWxpbmtcIiBjdXN0b20tYWZmZWN0ZWQtYXNzZXQtbGluaz1cIml0ZW0ucmVsYXRlZE9iamVjdFwiIG5nLWlmPVwiaXRlbS5yZWxhdGVkT2JqZWN0LnRpdGxlICYmIGl0ZW0ucmVsYXRlZE9iamVjdC50eXBlPT1cXCdhc3NldFxcJ1wiIG1hcHBpbmc9XCJ7XFwnbmFtZVxcJzogXFwndGl0bGVcXCcsIFxcJ3JlY29uY2lsaWF0aW9uSWRcXCc6IFxcJ2lkXFwnfVwiPnt7aXRlbS5yZWxhdGVkT2JqZWN0LnRpdGxlfX08L2E+J1xyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgaWQ6IFwiYWZmZWN0ZWRBc3NldDE2XCIsXHJcbiAgICAgICAgdHlwZTogXCJqcXVlcnlcIixcclxuICAgICAgICBtb2RlOiBcImF0dHJpYnV0ZVwiLFxyXG4gICAgICAgIGF0dHJpYnV0ZXM6IHtcclxuICAgICAgICAgIFwicmVwbGFjZVwiOiB7XHJcbiAgICAgICAgICAgIC8vXCJuZy1pZlwiOiBcImZpZWxkLmlzVGV4dEZpZWxkKCkgJiYgc2hvd0ZpZWxkKGZpZWxkKSAmJiBmaWVsZC5uYW1lICE9IFxcJ1wiK3RoaXMuaW5qZWN0Q29uZmlnLnBhcmFtcy5pbmplY3RGaWVsZE5hbWUrXCJcXCdcIlxyXG4gICAgICAgICAgICBcIm5nLWlmXCI6IFwiaXRlbS5pc0FwcEVuYWJsZWQgJiYgaXRlbS5yZWxhdGVkT2JqZWN0LnR5cGUgIT09ICdrbm93bGVkZ2UnICYmIGl0ZW0ucmVsYXRlZE9iamVjdC50eXBlICE9PSAnYXNzZXQnXCJcclxuICAgICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgc2VsZWN0b3I6IGZ1bmN0aW9uICgkanF1ZXJ5VGVtcGxhdGUpIHtcclxuICAgICAgICByZXR1cm4gJGpxdWVyeVRlbXBsYXRlLmZpbmQoXCJhW25nLWlmPVxcXCJpdGVtLmlzQXBwRW5hYmxlZCAmJiBpdGVtLnJlbGF0ZWRPYmplY3QudHlwZSAhPT0gJ2tub3dsZWRnZSdcXFwiXVwiKTtcclxuICAgICAgfX1cclxuXHJcbiAgICAgIF0sXHJcbiAgICAgIFwidmlld3MvYXNzZXQvYXNzZXQtZGV0YWlscy1saWZlY3ljbGUuaHRtbFwiOiBbe1xyXG4gICAgICAgIGlkOiBcImFmZmVjdGVkQXNzZXQ1XCIsXHJcbiAgICAgICAgbWV0aG9kOiBcInJlcGxhY2VcIixcclxuICAgICAgICBtb2RlOiBcInBhcnRpYWxcIixcclxuICAgICAgICB0eXBlOiBcImpxdWVyeVwiLFxyXG4gICAgICAgIHNlbGVjdG9yOiBmdW5jdGlvbiAoJGpxdWVyeVRlbXBsYXRlKSB7XHJcbiAgICAgICAgICByZXR1cm4gJGpxdWVyeVRlbXBsYXRlLmZpbmQoXCIucHJvZmlsZV9fdGl0bGUtbGluayA+IC5wcm9maWxlX190aXRsZVwiKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIHNuaXBwZXQ6ICc8YSBjdXN0b20tYWZmZWN0ZWQtYXNzZXQtbGluaz1cImFzc2V0XCIgbmctaWY9XCJhc3NldFwiPnt7YXNzZXQubmFtZX19PC9hPicsXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBpZDogXCJhZmZlY3RlZEFzc2V0NlwiLFxyXG4gICAgICAgIG1ldGhvZDogXCJyZXBsYWNlXCIsXHJcbiAgICAgICAgbW9kZTogXCJwYXJ0aWFsXCIsXHJcbiAgICAgICAgdHlwZTogXCJqcXVlcnlcIixcclxuICAgICAgICBzZWxlY3RvcjogZnVuY3Rpb24gKCRqcXVlcnlUZW1wbGF0ZSkge1xyXG4gICAgICAgICAgcmV0dXJuICRqcXVlcnlUZW1wbGF0ZS5maW5kKFwiLnRpY2tldF9fbmFtZS1saW5rXCIpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgc25pcHBldDogJzxhIGN1c3RvbS1hZmZlY3RlZC1hc3NldC1saW5rPVwiYXNzZXRcIiBuZy1pZj1cIiFpc0Z1bGxWZXJzaW9uXCI+e3tcXCdzZWFyY2gucHJldmlldy52aWV3RnVsbEFzc2V0XFwnIHwgaTE4bn19PC9hPicsXHJcbiAgICAgIH0gICAgIFxyXG4gICAgXSwgXHJcbiAgICBcInZpZXdzL3BlcnNvbi9wZXJzb24tYXNzZXQtcmVuZGVyZXIuaHRtbFwiOiBbe1xyXG4gICAgICBpZDogXCJhZmZlY3RlZEFzc2V0N1wiLFxyXG4gICAgICBtZXRob2Q6IFwicmVwbGFjZVwiLFxyXG4gICAgICBtb2RlOiBcInBhcnRpYWxcIixcclxuICAgICAgdHlwZTogXCJqcXVlcnlcIixcclxuICAgICAgc2VsZWN0b3I6IGZ1bmN0aW9uICgkanF1ZXJ5VGVtcGxhdGUpIHtcclxuICAgICAgICByZXR1cm4gJGpxdWVyeVRlbXBsYXRlLmZpbmQoXCIucmVzb3VyY2Utc2xpY2VfX2xpbmtlZC1pdGVtX3RpdGxlXCIpLmZpbmQoXCJhW2VudGl0eS1wcm9maWxlLWxpbms9J2RhdGEnXVwiKTs7XHJcbiAgICAgIH0sXHJcbiAgICAgIHNuaXBwZXQ6ICc8YSBjdXN0b20tYWZmZWN0ZWQtYXNzZXQtbGluaz1cImRhdGFcIiBuZy1pZj1cImRhdGFcIj57e2RhdGEubmFtZX19PC9hPicsXHJcblxyXG4gICAgfV0sXHJcbiAgICBcInZpZXdzL3BlcnNvbi9wZXJzb24tZGV0YWlscy5odG1sXCI6IFtcclxuICAgICAgLyp7XHJcbiAgICAgIGlkOiBcImFmZmVjdGVkQXNzZXQ4XCIsXHJcbiAgICAgIHR5cGU6IFwianF1ZXJ5XCIsXHJcbiAgICAgIG1vZGU6IFwicGFydGlhbFwiLFxyXG4gICAgICBtZXRob2Q6IFwicmVwbGFjZVwiLFxyXG4gICAgICBzZWxlY3RvcjogZnVuY3Rpb24gKCRqcXVlcnlUZW1wbGF0ZSkge1xyXG4gICAgICAgIHJldHVybiAkanF1ZXJ5VGVtcGxhdGUuZmluZChcInBlcnNvbi1hc3NldC1yZW5kZXJlclwiKVsxXTtcclxuICAgICAgfSxcclxuICAgICAgIHNuaXBwZXQ6ICc8cGVyc29uLWFzc2V0LXJlbmRlcmVyIGRhdGE9XCJhc3NldFwiPjwvcGVyc29uLWFzc2V0LXJlbmRlcmVyPicsXHJcblxyXG4gICAgfSwgKi9cclxuICAgIHtcclxuICAgICAgaWQ6IFwiYWZmZWN0ZWRBc3NldDlcIixcclxuICAgICAgdHlwZTogXCJqcXVlcnlcIixcclxuICAgICAgbW9kZTogXCJhdHRyaWJ1dGVcIixcclxuICAgICAgYXR0cmlidXRlczoge1xyXG4gICAgICAgIFwiYWRkXCI6IHtcclxuICAgICAgICAgICAgLy9cIm5nLWlmXCI6IFwiZmllbGQuaXNUZXh0RmllbGQoKSAmJiBzaG93RmllbGQoZmllbGQpICYmIGZpZWxkLm5hbWUgIT0gXFwnXCIrdGhpcy5pbmplY3RDb25maWcucGFyYW1zLmluamVjdEZpZWxkTmFtZStcIlxcJ1wiXHJcbiAgICAgICAgICAgIFwic3R5bGVcIjogXCJjdXJzb3I6IGRlZmF1bHQgIWltcG9ydGFudFwiXHJcbiAgICAgICAgfVxyXG4gICAgIH0sXHJcbiAgICAgIHNlbGVjdG9yOiBmdW5jdGlvbiAoJGpxdWVyeVRlbXBsYXRlKSB7XHJcbiAgICAgICAgcmV0dXJuICRqcXVlcnlUZW1wbGF0ZS5maW5kKFwicGVyc29uLWFzc2V0LXJlbmRlcmVyXCIpLnBhcmVudHMoXCIucGVyc29uLWl0ZW1fX3RlbXBsYXRlXCIpO1xyXG4gICAgICB9LFxyXG4gICAgICAgc25pcHBldDogJzxwZXJzb24tYXNzZXQtcmVuZGVyZXIgZGF0YT1cImFzc2V0XCI+PC9wZXJzb24tYXNzZXQtcmVuZGVyZXI+JyxcclxuXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBpZDogXCJhZmZlY3RlZEFzc2V0OFwiLFxyXG4gICAgICB0eXBlOiBcImpxdWVyeVwiLFxyXG4gICAgICBtb2RlOiBcInBhcnRpYWxcIixcclxuICAgICAgbWV0aG9kOiBcInJlcGxhY2VcIixcclxuICAgICAgc2VsZWN0b3I6IGZ1bmN0aW9uICgkanF1ZXJ5VGVtcGxhdGUpIHtcclxuICAgICAgICByZXR1cm4gJGpxdWVyeVRlbXBsYXRlLmZpbmQoXCJwZXJzb24tYXNzZXQtcmVuZGVyZXJcIilbMV07XHJcbiAgICAgIH0sXHJcbiAgICAgICBzbmlwcGV0OiAnPHBlcnNvbi1hc3NldC1yZW5kZXJlciBkYXRhPVwiYXNzZXRcIj48L3BlcnNvbi1hc3NldC1yZW5kZXJlcj4nLFxyXG5cclxuICAgIH0sXVxyXG5cclxuXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBpbmplY3REeW5UZW1wbGF0ZXMoKSB7XHJcbiAgICByZXR1cm4ge1xyXG5cclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuXHJcblxyXG4gIHRlbXBsYXRlcygpIHtcclxuICAgIHJldHVybiBbXHJcbiAgICAgIHtcclxuICAgICAgICAvL29yaWdpbjogXCJ2aWV3cy90aWNrZXQvaW5jaWRlbnQtZGV0YWlscy12Mi5odG1sXCIsXHJcbiAgICAgICAgLy90ZW1wbGF0ZTogXCJ2aWV3cy90aWNrZXQvaW5jaWRlbnQtZGV0YWlscy12Mi5odG1sXCJcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIC8vb3JpZ2luOiBcInZpZXdzL3RpY2tldC90YXNrLWRldGFpbHMtdjIuaHRtbFwiLFxyXG4gICAgICAgIC8vdGVtcGxhdGU6IFwidmlld3MvdGlja2V0L3Rhc2stZGV0YWlscy12Mi5odG1sXCJcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIC8vdGVtcGxhdGU6IFwidmlld3MvdGlja2V0L3RpY2tldC1ndHctcGFuZWwuaHRtbFwiXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICAvL3RlbXBsYXRlOiBcInZpZXdzL3RpY2tldC90aWNrZXQtZ3R3LWl0ZW0uaHRtbFwiXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICAvL3RlbXBsYXRlOiBcInZpZXdzL3RpY2tldC90aWNrZXQtZ3R3LWl0ZW0tZGlhbG9nLmh0bWxcIlxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgLy90ZW1wbGF0ZTogXCJ2aWV3cy90aWNrZXQvdGlja2V0LWd0dy1kZXRhaWxzLmh0bWxcIlxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgLy90ZW1wbGF0ZTogXCJ2aWV3cy90aWNrZXQvdGlja2V0LWd0dy1pdGVtLWludGVyZmFjZS5odG1sXCJcclxuICAgICAgfVxyXG4gICAgXVxyXG4gIH1cclxuXHJcbiAgaTE4bkxvY2FsZXMoKSB7XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgLy8gXCJkZVwiOltcImkxOG4vbnR0LXJlc291cmNlcy1sb2NhbGVfZGUuanNvblwiXSxcclxuICAgICAgLy8gXCJlblwiOltcImkxOG4vbnR0LXJlc291cmNlcy1sb2NhbGVfZW4uanNvblwiXVxyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG59XHJcblxyXG5udHQuc21hcnRpdC5hcGkubnR0U21hcnRpdE1vZHVsZXMucHVzaChuZXcgY3VzdG9tRW5pdGl5UHJvZmlsZUxpbmsoKSk7IiwiXCJ1c2Ugc3RyaWN0XCI7XHJcbihmdW5jdGlvbiAoKSB7XHJcbiAgICAndXNlIHN0cmljdCc7XHJcbiAgICBhbmd1bGFyLm1vZHVsZSgnbXlpdHNtQXBwJylcclxuICAgICAgICAuZmFjdG9yeSgnY3VzdG9tQXNzZXRMaW5rU2VydmljZScsXHJcbiAgICAgICAgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgIFxyXG4gICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAgIHBhcnNlTGluazogZnVuY3Rpb24ocGF0dGVybiwgY2lEYXRhLCBtYXBwaW5nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgaWYoIWNpRGF0YSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnTm8gaW5mb3JtYXRpb24gYWJvdXQgZW50aXR5IScpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICghcGF0dGVybilcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2xpbmsgcGF0dGVybiBtaXNzaW5nLi4uY2hlY2sgY29uZmlndXJhdGlvbiEnKTtcclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG9iamVjdCA9IGNpRGF0YTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKG1hcHBpbmcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdFtcIm5hbWVcIl0gPSBjaURhdGFbbWFwcGluZ1tcIm5hbWVcIl1dO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0W1wicmVjb25jaWxpYXRpb25JZFwiXT1jaURhdGFbbWFwcGluZ1tcInJlY29uY2lsaWF0aW9uSWRcIl1dO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVudGl0eUxpbmsgPSBwYXR0ZXJuLnJlcGxhY2UoXCJ7TmFtZX1cIiwgb2JqZWN0Lm5hbWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbnRpdHlMaW5rID0gZW50aXR5TGluay5yZXBsYWNlKFwie1JlY29uY2lsaWF0aW9uSWR9XCIsIG9iamVjdC5yZWNvbmNpbGlhdGlvbklkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICBlbnRpdHlMaW5rO1xyXG4gICAgXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICBcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgXHJcbiAgICAgICAgfSk7XHJcbn0oKSk7Il0sInNvdXJjZVJvb3QiOiIifQ==