var AdminJS = (function (React$1, require$$3, reactRouterDom, styled, DesignSystem, reactRouter, require$$1, require$$2) { 'use strict'; function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; } function _interopNamespace(e) { if (e && e.__esModule) return e; var n = Object.create(null); if (e) { Object.keys(e).forEach(function (k) { if (k !== 'default') { var d = Object.getOwnPropertyDescriptor(e, k); Object.defineProperty(n, k, d.get ? d : { enumerable: true, get: function () { return e[k]; } }); } }); } n["default"] = e; return Object.freeze(n); } var React__default$1 = /*#__PURE__*/_interopDefaultLegacy(React$1); var require$$3__default = /*#__PURE__*/_interopDefaultLegacy(require$$3); var styled__default = /*#__PURE__*/_interopDefaultLegacy(styled); var DesignSystem__namespace = /*#__PURE__*/_interopNamespace(DesignSystem); var require$$1__default = /*#__PURE__*/_interopDefaultLegacy(require$$1); var require$$2__default = /*#__PURE__*/_interopDefaultLegacy(require$$2); var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {}; function getDefaultExportFromCjs (x) { return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x; } var regeneratorRuntime$1 = {exports: {}}; var _typeof$1 = {exports: {}}; (function (module) { function _typeof(obj) { "@babel/helpers - typeof"; return (module.exports = _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, module.exports.__esModule = true, module.exports["default"] = module.exports), _typeof(obj); } module.exports = _typeof, module.exports.__esModule = true, module.exports["default"] = module.exports; } (_typeof$1)); (function (module) { var _typeof = _typeof$1.exports["default"]; function _regeneratorRuntime() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ module.exports = _regeneratorRuntime = function _regeneratorRuntime() { return exports; }, module.exports.__esModule = true, module.exports["default"] = module.exports; var exports = {}, Op = Object.prototype, hasOwn = Op.hasOwnProperty, $Symbol = "function" == typeof Symbol ? Symbol : {}, iteratorSymbol = $Symbol.iterator || "@@iterator", asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator", toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag"; function define(obj, key, value) { return Object.defineProperty(obj, key, { value: value, enumerable: !0, configurable: !0, writable: !0 }), obj[key]; } try { define({}, ""); } catch (err) { define = function define(obj, key, value) { return obj[key] = value; }; } function wrap(innerFn, outerFn, self, tryLocsList) { var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator, generator = Object.create(protoGenerator.prototype), context = new Context(tryLocsList || []); return generator._invoke = function (innerFn, self, context) { var state = "suspendedStart"; return function (method, arg) { if ("executing" === state) throw new Error("Generator is already running"); if ("completed" === state) { if ("throw" === method) throw arg; return doneResult(); } for (context.method = method, context.arg = arg;;) { var delegate = context.delegate; if (delegate) { var delegateResult = maybeInvokeDelegate(delegate, context); if (delegateResult) { if (delegateResult === ContinueSentinel) continue; return delegateResult; } } if ("next" === context.method) context.sent = context._sent = context.arg;else if ("throw" === context.method) { if ("suspendedStart" === state) throw state = "completed", context.arg; context.dispatchException(context.arg); } else "return" === context.method && context.abrupt("return", context.arg); state = "executing"; var record = tryCatch(innerFn, self, context); if ("normal" === record.type) { if (state = context.done ? "completed" : "suspendedYield", record.arg === ContinueSentinel) continue; return { value: record.arg, done: context.done }; } "throw" === record.type && (state = "completed", context.method = "throw", context.arg = record.arg); } }; }(innerFn, self, context), generator; } function tryCatch(fn, obj, arg) { try { return { type: "normal", arg: fn.call(obj, arg) }; } catch (err) { return { type: "throw", arg: err }; } } exports.wrap = wrap; var ContinueSentinel = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var IteratorPrototype = {}; define(IteratorPrototype, iteratorSymbol, function () { return this; }); var getProto = Object.getPrototypeOf, NativeIteratorPrototype = getProto && getProto(getProto(values([]))); NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol) && (IteratorPrototype = NativeIteratorPrototype); var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype); function defineIteratorMethods(prototype) { ["next", "throw", "return"].forEach(function (method) { define(prototype, method, function (arg) { return this._invoke(method, arg); }); }); } function AsyncIterator(generator, PromiseImpl) { function invoke(method, arg, resolve, reject) { var record = tryCatch(generator[method], generator, arg); if ("throw" !== record.type) { var result = record.arg, value = result.value; return value && "object" == _typeof(value) && hasOwn.call(value, "__await") ? PromiseImpl.resolve(value.__await).then(function (value) { invoke("next", value, resolve, reject); }, function (err) { invoke("throw", err, resolve, reject); }) : PromiseImpl.resolve(value).then(function (unwrapped) { result.value = unwrapped, resolve(result); }, function (error) { return invoke("throw", error, resolve, reject); }); } reject(record.arg); } var previousPromise; this._invoke = function (method, arg) { function callInvokeWithMethodAndArg() { return new PromiseImpl(function (resolve, reject) { invoke(method, arg, resolve, reject); }); } return previousPromise = previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); }; } function maybeInvokeDelegate(delegate, context) { var method = delegate.iterator[context.method]; if (undefined === method) { if (context.delegate = null, "throw" === context.method) { if (delegate.iterator["return"] && (context.method = "return", context.arg = undefined, maybeInvokeDelegate(delegate, context), "throw" === context.method)) return ContinueSentinel; context.method = "throw", context.arg = new TypeError("The iterator does not provide a 'throw' method"); } return ContinueSentinel; } var record = tryCatch(method, delegate.iterator, context.arg); if ("throw" === record.type) return context.method = "throw", context.arg = record.arg, context.delegate = null, ContinueSentinel; var info = record.arg; return info ? info.done ? (context[delegate.resultName] = info.value, context.next = delegate.nextLoc, "return" !== context.method && (context.method = "next", context.arg = undefined), context.delegate = null, ContinueSentinel) : info : (context.method = "throw", context.arg = new TypeError("iterator result is not an object"), context.delegate = null, ContinueSentinel); } function pushTryEntry(locs) { var entry = { tryLoc: locs[0] }; 1 in locs && (entry.catchLoc = locs[1]), 2 in locs && (entry.finallyLoc = locs[2], entry.afterLoc = locs[3]), this.tryEntries.push(entry); } function resetTryEntry(entry) { var record = entry.completion || {}; record.type = "normal", delete record.arg, entry.completion = record; } function Context(tryLocsList) { this.tryEntries = [{ tryLoc: "root" }], tryLocsList.forEach(pushTryEntry, this), this.reset(!0); } function values(iterable) { if (iterable) { var iteratorMethod = iterable[iteratorSymbol]; if (iteratorMethod) return iteratorMethod.call(iterable); if ("function" == typeof iterable.next) return iterable; if (!isNaN(iterable.length)) { var i = -1, next = function next() { for (; ++i < iterable.length;) { if (hasOwn.call(iterable, i)) return next.value = iterable[i], next.done = !1, next; } return next.value = undefined, next.done = !0, next; }; return next.next = next; } } return { next: doneResult }; } function doneResult() { return { value: undefined, done: !0 }; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, define(Gp, "constructor", GeneratorFunctionPrototype), define(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, toStringTagSymbol, "GeneratorFunction"), exports.isGeneratorFunction = function (genFun) { var ctor = "function" == typeof genFun && genFun.constructor; return !!ctor && (ctor === GeneratorFunction || "GeneratorFunction" === (ctor.displayName || ctor.name)); }, exports.mark = function (genFun) { return Object.setPrototypeOf ? Object.setPrototypeOf(genFun, GeneratorFunctionPrototype) : (genFun.__proto__ = GeneratorFunctionPrototype, define(genFun, toStringTagSymbol, "GeneratorFunction")), genFun.prototype = Object.create(Gp), genFun; }, exports.awrap = function (arg) { return { __await: arg }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, asyncIteratorSymbol, function () { return this; }), exports.AsyncIterator = AsyncIterator, exports.async = function (innerFn, outerFn, self, tryLocsList, PromiseImpl) { void 0 === PromiseImpl && (PromiseImpl = Promise); var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList), PromiseImpl); return exports.isGeneratorFunction(outerFn) ? iter : iter.next().then(function (result) { return result.done ? result.value : iter.next(); }); }, defineIteratorMethods(Gp), define(Gp, toStringTagSymbol, "Generator"), define(Gp, iteratorSymbol, function () { return this; }), define(Gp, "toString", function () { return "[object Generator]"; }), exports.keys = function (object) { var keys = []; for (var key in object) { keys.push(key); } return keys.reverse(), function next() { for (; keys.length;) { var key = keys.pop(); if (key in object) return next.value = key, next.done = !1, next; } return next.done = !0, next; }; }, exports.values = values, Context.prototype = { constructor: Context, reset: function reset(skipTempReset) { if (this.prev = 0, this.next = 0, this.sent = this._sent = undefined, this.done = !1, this.delegate = null, this.method = "next", this.arg = undefined, this.tryEntries.forEach(resetTryEntry), !skipTempReset) for (var name in this) { "t" === name.charAt(0) && hasOwn.call(this, name) && !isNaN(+name.slice(1)) && (this[name] = undefined); } }, stop: function stop() { this.done = !0; var rootRecord = this.tryEntries[0].completion; if ("throw" === rootRecord.type) throw rootRecord.arg; return this.rval; }, dispatchException: function dispatchException(exception) { if (this.done) throw exception; var context = this; function handle(loc, caught) { return record.type = "throw", record.arg = exception, context.next = loc, caught && (context.method = "next", context.arg = undefined), !!caught; } for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i], record = entry.completion; if ("root" === entry.tryLoc) return handle("end"); if (entry.tryLoc <= this.prev) { var hasCatch = hasOwn.call(entry, "catchLoc"), hasFinally = hasOwn.call(entry, "finallyLoc"); if (hasCatch && hasFinally) { if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); } else if (hasCatch) { if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); } else { if (!hasFinally) throw new Error("try statement without catch or finally"); if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); } } } }, abrupt: function abrupt(type, arg) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc <= this.prev && hasOwn.call(entry, "finallyLoc") && this.prev < entry.finallyLoc) { var finallyEntry = entry; break; } } finallyEntry && ("break" === type || "continue" === type) && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc && (finallyEntry = null); var record = finallyEntry ? finallyEntry.completion : {}; return record.type = type, record.arg = arg, finallyEntry ? (this.method = "next", this.next = finallyEntry.finallyLoc, ContinueSentinel) : this.complete(record); }, complete: function complete(record, afterLoc) { if ("throw" === record.type) throw record.arg; return "break" === record.type || "continue" === record.type ? this.next = record.arg : "return" === record.type ? (this.rval = this.arg = record.arg, this.method = "return", this.next = "end") : "normal" === record.type && afterLoc && (this.next = afterLoc), ContinueSentinel; }, finish: function finish(finallyLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.finallyLoc === finallyLoc) return this.complete(entry.completion, entry.afterLoc), resetTryEntry(entry), ContinueSentinel; } }, "catch": function _catch(tryLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc === tryLoc) { var record = entry.completion; if ("throw" === record.type) { var thrown = record.arg; resetTryEntry(entry); } return thrown; } } throw new Error("illegal catch attempt"); }, delegateYield: function delegateYield(iterable, resultName, nextLoc) { return this.delegate = { iterator: values(iterable), resultName: resultName, nextLoc: nextLoc }, "next" === this.method && (this.arg = undefined), ContinueSentinel; } }, exports; } module.exports = _regeneratorRuntime, module.exports.__esModule = true, module.exports["default"] = module.exports; } (regeneratorRuntime$1)); // TODO(Babel 8): Remove this file. var runtime = regeneratorRuntime$1.exports(); var regenerator = runtime; // Copied from https://github.com/facebook/regenerator/blob/main/packages/runtime/runtime.js#L736= try { regeneratorRuntime = runtime; } catch (accidentalStrictMode) { if (typeof globalThis === "object") { globalThis.regeneratorRuntime = runtime; } else { Function("r", "regeneratorRuntime = r")(runtime); } } var commonjs = {}; var Trans$1 = {}; var interopRequireDefault = {exports: {}}; (function (module) { function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } module.exports = _interopRequireDefault, module.exports.__esModule = true, module.exports["default"] = module.exports; } (interopRequireDefault)); var objectWithoutProperties = {exports: {}}; var objectWithoutPropertiesLoose = {exports: {}}; var hasRequiredObjectWithoutPropertiesLoose; function requireObjectWithoutPropertiesLoose () { if (hasRequiredObjectWithoutPropertiesLoose) return objectWithoutPropertiesLoose.exports; hasRequiredObjectWithoutPropertiesLoose = 1; (function (module) { function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; } module.exports = _objectWithoutPropertiesLoose, module.exports.__esModule = true, module.exports["default"] = module.exports; } (objectWithoutPropertiesLoose)); return objectWithoutPropertiesLoose.exports; } var hasRequiredObjectWithoutProperties; function requireObjectWithoutProperties () { if (hasRequiredObjectWithoutProperties) return objectWithoutProperties.exports; hasRequiredObjectWithoutProperties = 1; (function (module) { var objectWithoutPropertiesLoose = requireObjectWithoutPropertiesLoose(); function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; } module.exports = _objectWithoutProperties, module.exports.__esModule = true, module.exports["default"] = module.exports; } (objectWithoutProperties)); return objectWithoutProperties.exports; } var defineProperty = {exports: {}}; var hasRequiredDefineProperty; function requireDefineProperty () { if (hasRequiredDefineProperty) return defineProperty.exports; hasRequiredDefineProperty = 1; (function (module) { function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } module.exports = _defineProperty, module.exports.__esModule = true, module.exports["default"] = module.exports; } (defineProperty)); return defineProperty.exports; } /** * This file automatically generated from `pre-publish.js`. * Do not manually edit. */ var voidElements; var hasRequiredVoidElements; function requireVoidElements () { if (hasRequiredVoidElements) return voidElements; hasRequiredVoidElements = 1; voidElements = { "area": true, "base": true, "br": true, "col": true, "embed": true, "hr": true, "img": true, "input": true, "link": true, "meta": true, "param": true, "source": true, "track": true, "wbr": true }; return voidElements; } var htmlParseStringify; var hasRequiredHtmlParseStringify; function requireHtmlParseStringify () { if (hasRequiredHtmlParseStringify) return htmlParseStringify; hasRequiredHtmlParseStringify = 1; var e,t=(e=requireVoidElements())&&"object"==typeof e&&"default"in e?e.default:e,n=/\s([^'"/\s><]+?)[\s/>]|([^\s=]+)=\s?(".*?"|'.*?')/g;function r(e){var r={type:"tag",name:"",voidElement:!1,attrs:{},children:[]},i=e.match(/<\/?([^\s]+?)[/\s>]/);if(i&&(r.name=i[1],(t[i[1]]||"/"===e.charAt(e.length-2))&&(r.voidElement=!0),r.name.startsWith("!--"))){var s=e.indexOf("--\x3e");return {type:"comment",comment:-1!==s?e.slice(4,s):""}}for(var c=new RegExp(n),a=null;null!==(a=c.exec(e));)if(a[0].trim())if(a[1]){var o=a[1].trim(),u=[o,""];o.indexOf("=")>-1&&(u=o.split("=")),r.attrs[u[0]]=u[1],c.lastIndex--;}else a[2]&&(r.attrs[a[2]]=a[3].trim().substring(1,a[3].length-1));return r}var i=/<[a-zA-Z0-9\-\!\/](?:"[^"]*"|'[^']*'|[^'">])*>/g,s=/^\s*$/,c=Object.create(null);function a(e,t){switch(t.type){case"text":return e+t.content;case"tag":return e+="<"+t.name+(t.attrs?function(e){var t=[];for(var n in e)t.push(n+'="'+e[n]+'"');return t.length?" "+t.join(" "):""}(t.attrs):"")+(t.voidElement?"/>":">"),t.voidElement?e:e+t.children.reduce(a,"")+"";case"comment":return e+"\x3c!--"+t.comment+"--\x3e"}}htmlParseStringify={parse:function(e,t){t||(t={}),t.components||(t.components=c);var n,a=[],o=[],u=-1,l=!1;if(0!==e.indexOf("<")){var m=e.indexOf("<");a.push({type:"text",content:-1===m?e:e.substring(0,m)});}return e.replace(i,function(i,c){if(l){if(i!=="")return;l=!1;}var m,d="/"!==i.charAt(1),f=i.startsWith("\x3c!--"),h=c+i.length,p=e.charAt(h);if(f){var v=r(i);return u<0?(a.push(v),a):((m=o[u]).children.push(v),a)}if(d&&(u++,"tag"===(n=r(i)).type&&t.components[n.name]&&(n.type="component",l=!0),n.voidElement||l||!p||"<"===p||n.children.push({type:"text",content:e.slice(h,e.indexOf("<",h))}),0===u&&a.push(n),(m=o[u-1])&&m.children.push(n),o[u]=n),(!d||n.voidElement)&&(u>-1&&(n.voidElement||n.name===i.slice(2,-1))&&(u--,n=-1===u?a:o[u]),!l&&"<"!==p&&p)){m=-1===u?a:o[u].children;var x=e.indexOf("<",h),g=e.slice(h,-1===x?void 0:x);s.test(g)&&(g=" "),(x>-1&&u+m.length>=0||" "!==g)&&m.push({type:"text",content:g});}}),a},stringify:function(e){return e.reduce(function(e,t){return e+a("",t)},"")}}; return htmlParseStringify; } var context = {}; var classCallCheck = {exports: {}}; var hasRequiredClassCallCheck; function requireClassCallCheck () { if (hasRequiredClassCallCheck) return classCallCheck.exports; hasRequiredClassCallCheck = 1; (function (module) { function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } module.exports = _classCallCheck, module.exports.__esModule = true, module.exports["default"] = module.exports; } (classCallCheck)); return classCallCheck.exports; } var createClass = {exports: {}}; var hasRequiredCreateClass; function requireCreateClass () { if (hasRequiredCreateClass) return createClass.exports; hasRequiredCreateClass = 1; (function (module) { 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); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } module.exports = _createClass, module.exports.__esModule = true, module.exports["default"] = module.exports; } (createClass)); return createClass.exports; } var _unescape$1 = {}; var hasRequired_unescape; function require_unescape () { if (hasRequired_unescape) return _unescape$1; hasRequired_unescape = 1; Object.defineProperty(_unescape$1, "__esModule", { value: true }); _unescape$1.unescape = void 0; var matchHtmlEntity = /&(?:amp|#38|lt|#60|gt|#62|apos|#39|quot|#34|nbsp|#160|copy|#169|reg|#174|hellip|#8230|#x2F|#47);/g; var htmlEntities = { '&': '&', '&': '&', '<': '<', '<': '<', '>': '>', '>': '>', ''': "'", ''': "'", '"': '"', '"': '"', ' ': ' ', ' ': ' ', '©': '©', '©': '©', '®': '®', '®': '®', '…': '…', '…': '…', '/': '/', '/': '/' }; var unescapeHtmlEntity = function unescapeHtmlEntity(m) { return htmlEntities[m]; }; var unescape = function unescape(text) { return text.replace(matchHtmlEntity, unescapeHtmlEntity); }; _unescape$1.unescape = unescape; return _unescape$1; } var _interopRequireDefault$5 = interopRequireDefault.exports; Object.defineProperty(context, "__esModule", { value: true }); context.setDefaults = setDefaults; context.getDefaults = getDefaults; context.setI18n = setI18n; context.getI18n = getI18n; context.composeInitialProps = composeInitialProps; context.getInitialProps = getInitialProps; context.initReactI18next = context.ReportNamespaces = context.I18nContext = void 0; var _classCallCheck2 = _interopRequireDefault$5(requireClassCallCheck()); var _createClass2 = _interopRequireDefault$5(requireCreateClass()); var _defineProperty2$4 = _interopRequireDefault$5(requireDefineProperty()); var _react$6 = React__default$1["default"]; var _unescape = require_unescape(); function ownKeys$b(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; } function _objectSpread$b(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$b(Object(source), true).forEach(function (key) { (0, _defineProperty2$4["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$b(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } var defaultOptions = { bindI18n: 'languageChanged', bindI18nStore: '', transEmptyNodeValue: '', transSupportBasicHtmlNodes: true, transWrapTextNodes: '', transKeepBasicHtmlNodesFor: ['br', 'strong', 'i', 'p'], useSuspense: true, unescape: _unescape.unescape }; var i18nInstance; var I18nContext = (0, _react$6.createContext)(); context.I18nContext = I18nContext; function setDefaults() { var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; defaultOptions = _objectSpread$b(_objectSpread$b({}, defaultOptions), options); } function getDefaults() { return defaultOptions; } var ReportNamespaces = function () { function ReportNamespaces() { (0, _classCallCheck2["default"])(this, ReportNamespaces); this.usedNamespaces = {}; } (0, _createClass2["default"])(ReportNamespaces, [{ key: "addUsedNamespaces", value: function addUsedNamespaces(namespaces) { var _this = this; namespaces.forEach(function (ns) { if (!_this.usedNamespaces[ns]) _this.usedNamespaces[ns] = true; }); } }, { key: "getUsedNamespaces", value: function getUsedNamespaces() { return Object.keys(this.usedNamespaces); } }]); return ReportNamespaces; }(); context.ReportNamespaces = ReportNamespaces; function setI18n(instance) { i18nInstance = instance; } function getI18n() { return i18nInstance; } var initReactI18next = { type: '3rdParty', init: function init(instance) { setDefaults(instance.options.react); setI18n(instance); } }; context.initReactI18next = initReactI18next; function composeInitialProps(ForComponent) { return function (ctx) { return new Promise(function (resolve) { var i18nInitialProps = getInitialProps(); if (ForComponent.getInitialProps) { ForComponent.getInitialProps(ctx).then(function (componentsInitialProps) { resolve(_objectSpread$b(_objectSpread$b({}, componentsInitialProps), i18nInitialProps)); }); } else { resolve(i18nInitialProps); } }); }; } function getInitialProps() { var i18n = getI18n(); var namespaces = i18n.reportNamespaces ? i18n.reportNamespaces.getUsedNamespaces() : []; var ret = {}; var initialI18nStore = {}; i18n.languages.forEach(function (l) { initialI18nStore[l] = {}; namespaces.forEach(function (ns) { initialI18nStore[l][ns] = i18n.getResourceBundle(l, ns) || {}; }); }); ret.initialI18nStore = initialI18nStore; ret.initialLanguage = i18n.language; return ret; } var utils$a = {}; var hasRequiredUtils; function requireUtils () { if (hasRequiredUtils) return utils$a; hasRequiredUtils = 1; Object.defineProperty(utils$a, "__esModule", { value: true }); utils$a.warn = warn; utils$a.warnOnce = warnOnce; utils$a.loadNamespaces = loadNamespaces; utils$a.hasLoadedNamespace = hasLoadedNamespace; utils$a.getDisplayName = getDisplayName; function warn() { if (console && console.warn) { var _console; for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } if (typeof args[0] === 'string') args[0] = "react-i18next:: ".concat(args[0]); (_console = console).warn.apply(_console, args); } } var alreadyWarned = {}; function warnOnce() { for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { args[_key2] = arguments[_key2]; } if (typeof args[0] === 'string' && alreadyWarned[args[0]]) return; if (typeof args[0] === 'string') alreadyWarned[args[0]] = new Date(); warn.apply(void 0, args); } function loadNamespaces(i18n, ns, cb) { i18n.loadNamespaces(ns, function () { if (i18n.isInitialized) { cb(); } else { var initialized = function initialized() { setTimeout(function () { i18n.off('initialized', initialized); }, 0); cb(); }; i18n.on('initialized', initialized); } }); } function oldI18nextHasLoadedNamespace(ns, i18n) { var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; var lng = i18n.languages[0]; var fallbackLng = i18n.options ? i18n.options.fallbackLng : false; var lastLng = i18n.languages[i18n.languages.length - 1]; if (lng.toLowerCase() === 'cimode') return true; var loadNotPending = function loadNotPending(l, n) { var loadState = i18n.services.backendConnector.state["".concat(l, "|").concat(n)]; return loadState === -1 || loadState === 2; }; if (options.bindI18n && options.bindI18n.indexOf('languageChanging') > -1 && i18n.services.backendConnector.backend && i18n.isLanguageChangingTo && !loadNotPending(i18n.isLanguageChangingTo, ns)) return false; if (i18n.hasResourceBundle(lng, ns)) return true; if (!i18n.services.backendConnector.backend || i18n.options.resources && !i18n.options.partialBundledLanguages) return true; if (loadNotPending(lng, ns) && (!fallbackLng || loadNotPending(lastLng, ns))) return true; return false; } function hasLoadedNamespace(ns, i18n) { var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; if (!i18n.languages || !i18n.languages.length) { warnOnce('i18n.languages were undefined or empty', i18n.languages); return true; } var isNewerI18next = i18n.options.ignoreJSONStructure !== undefined; if (!isNewerI18next) { return oldI18nextHasLoadedNamespace(ns, i18n, options); } return i18n.hasLoadedNamespace(ns, { precheck: function precheck(i18nInstance, loadNotPending) { if (options.bindI18n && options.bindI18n.indexOf('languageChanging') > -1 && i18nInstance.services.backendConnector.backend && i18nInstance.isLanguageChangingTo && !loadNotPending(i18nInstance.isLanguageChangingTo, ns)) return false; } }); } function getDisplayName(Component) { return Component.displayName || Component.name || (typeof Component === 'string' && Component.length > 0 ? Component : 'Unknown'); } return utils$a; } var _interopRequireDefault$4 = interopRequireDefault.exports; Object.defineProperty(Trans$1, "__esModule", { value: true }); Trans$1.nodesToString = nodesToString; Trans$1.Trans = Trans; var _objectWithoutProperties2$3 = _interopRequireDefault$4(requireObjectWithoutProperties()); var _typeof2 = _interopRequireDefault$4(_typeof$1.exports); var _defineProperty2$3 = _interopRequireDefault$4(requireDefineProperty()); var _react$5 = React__default$1["default"]; var _htmlParseStringify = _interopRequireDefault$4(requireHtmlParseStringify()); var _context$4 = context; var _utils$3 = requireUtils(); var _excluded$3 = ["format"], _excluded2 = ["children", "count", "parent", "i18nKey", "context", "tOptions", "values", "defaults", "components", "ns", "i18n", "t", "shouldUnescape"]; function ownKeys$a(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; } function _objectSpread$a(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$a(Object(source), true).forEach(function (key) { (0, _defineProperty2$3["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$a(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } function hasChildren(node, checkLength) { if (!node) return false; var base = node.props ? node.props.children : node.children; if (checkLength) return base.length > 0; return !!base; } function getChildren(node) { if (!node) return []; return node.props ? node.props.children : node.children; } function hasValidReactChildren(children) { if (Object.prototype.toString.call(children) !== '[object Array]') return false; return children.every(function (child) { return (0, _react$5.isValidElement)(child); }); } function getAsArray(data) { return Array.isArray(data) ? data : [data]; } function mergeProps(source, target) { var newTarget = _objectSpread$a({}, target); newTarget.props = Object.assign(source.props, target.props); return newTarget; } function nodesToString(children, i18nOptions) { if (!children) return ''; var stringNode = ''; var childrenArray = getAsArray(children); var keepArray = i18nOptions.transSupportBasicHtmlNodes && i18nOptions.transKeepBasicHtmlNodesFor ? i18nOptions.transKeepBasicHtmlNodesFor : []; childrenArray.forEach(function (child, childIndex) { if (typeof child === 'string') { stringNode += "".concat(child); } else if ((0, _react$5.isValidElement)(child)) { var childPropsCount = Object.keys(child.props).length; var shouldKeepChild = keepArray.indexOf(child.type) > -1; var childChildren = child.props.children; if (!childChildren && shouldKeepChild && childPropsCount === 0) { stringNode += "<".concat(child.type, "/>"); } else if (!childChildren && (!shouldKeepChild || childPropsCount !== 0)) { stringNode += "<".concat(childIndex, ">"); } else if (child.props.i18nIsDynamicList) { stringNode += "<".concat(childIndex, ">"); } else if (shouldKeepChild && childPropsCount === 1 && typeof childChildren === 'string') { stringNode += "<".concat(child.type, ">").concat(childChildren, ""); } else { var content = nodesToString(childChildren, i18nOptions); stringNode += "<".concat(childIndex, ">").concat(content, ""); } } else if (child === null) { (0, _utils$3.warn)("Trans: the passed in value is invalid - seems you passed in a null child."); } else if ((0, _typeof2["default"])(child) === 'object') { var format = child.format, clone = (0, _objectWithoutProperties2$3["default"])(child, _excluded$3); var keys = Object.keys(clone); if (keys.length === 1) { var value = format ? "".concat(keys[0], ", ").concat(format) : keys[0]; stringNode += "{{".concat(value, "}}"); } else { (0, _utils$3.warn)("react-i18next: the passed in object contained more than one variable - the object should look like {{ value, format }} where format is optional.", child); } } else { (0, _utils$3.warn)("Trans: the passed in value is invalid - seems you passed in a variable like {number} - please pass in variables for interpolation as full objects like {{number}}.", child); } }); return stringNode; } function renderNodes(children, targetString, i18n, i18nOptions, combinedTOpts, shouldUnescape) { if (targetString === '') return []; var keepArray = i18nOptions.transKeepBasicHtmlNodesFor || []; var emptyChildrenButNeedsHandling = targetString && new RegExp(keepArray.join('|')).test(targetString); if (!children && !emptyChildrenButNeedsHandling) return [targetString]; var data = {}; function getData(childs) { var childrenArray = getAsArray(childs); childrenArray.forEach(function (child) { if (typeof child === 'string') return; if (hasChildren(child)) getData(getChildren(child));else if ((0, _typeof2["default"])(child) === 'object' && !(0, _react$5.isValidElement)(child)) Object.assign(data, child); }); } getData(children); var ast = _htmlParseStringify["default"].parse("<0>".concat(targetString, "")); var opts = _objectSpread$a(_objectSpread$a({}, data), combinedTOpts); function renderInner(child, node, rootReactNode) { var childs = getChildren(child); var mappedChildren = mapAST(childs, node.children, rootReactNode); return hasValidReactChildren(childs) && mappedChildren.length === 0 ? childs : mappedChildren; } function pushTranslatedJSX(child, inner, mem, i, isVoid) { if (child.dummy) child.children = inner; mem.push((0, _react$5.cloneElement)(child, _objectSpread$a(_objectSpread$a({}, child.props), {}, { key: i }), isVoid ? undefined : inner)); } function mapAST(reactNode, astNode, rootReactNode) { var reactNodes = getAsArray(reactNode); var astNodes = getAsArray(astNode); return astNodes.reduce(function (mem, node, i) { var translationContent = node.children && node.children[0] && node.children[0].content && i18n.services.interpolator.interpolate(node.children[0].content, opts, i18n.language); if (node.type === 'tag') { var tmp = reactNodes[parseInt(node.name, 10)]; if (!tmp && rootReactNode.length === 1 && rootReactNode[0][node.name]) tmp = rootReactNode[0][node.name]; if (!tmp) tmp = {}; var child = Object.keys(node.attrs).length !== 0 ? mergeProps({ props: node.attrs }, tmp) : tmp; var isElement = (0, _react$5.isValidElement)(child); var isValidTranslationWithChildren = isElement && hasChildren(node, true) && !node.voidElement; var isEmptyTransWithHTML = emptyChildrenButNeedsHandling && (0, _typeof2["default"])(child) === 'object' && child.dummy && !isElement; var isKnownComponent = (0, _typeof2["default"])(children) === 'object' && children !== null && Object.hasOwnProperty.call(children, node.name); if (typeof child === 'string') { var value = i18n.services.interpolator.interpolate(child, opts, i18n.language); mem.push(value); } else if (hasChildren(child) || isValidTranslationWithChildren) { var inner = renderInner(child, node, rootReactNode); pushTranslatedJSX(child, inner, mem, i); } else if (isEmptyTransWithHTML) { var _inner = mapAST(reactNodes, node.children, rootReactNode); mem.push((0, _react$5.cloneElement)(child, _objectSpread$a(_objectSpread$a({}, child.props), {}, { key: i }), _inner)); } else if (Number.isNaN(parseFloat(node.name))) { if (isKnownComponent) { var _inner2 = renderInner(child, node, rootReactNode); pushTranslatedJSX(child, _inner2, mem, i, node.voidElement); } else if (i18nOptions.transSupportBasicHtmlNodes && keepArray.indexOf(node.name) > -1) { if (node.voidElement) { mem.push((0, _react$5.createElement)(node.name, { key: "".concat(node.name, "-").concat(i) })); } else { var _inner3 = mapAST(reactNodes, node.children, rootReactNode); mem.push((0, _react$5.createElement)(node.name, { key: "".concat(node.name, "-").concat(i) }, _inner3)); } } else if (node.voidElement) { mem.push("<".concat(node.name, " />")); } else { var _inner4 = mapAST(reactNodes, node.children, rootReactNode); mem.push("<".concat(node.name, ">").concat(_inner4, "")); } } else if ((0, _typeof2["default"])(child) === 'object' && !isElement) { var content = node.children[0] ? translationContent : null; if (content) mem.push(content); } else if (node.children.length === 1 && translationContent) { mem.push((0, _react$5.cloneElement)(child, _objectSpread$a(_objectSpread$a({}, child.props), {}, { key: i }), translationContent)); } else { mem.push((0, _react$5.cloneElement)(child, _objectSpread$a(_objectSpread$a({}, child.props), {}, { key: i }))); } } else if (node.type === 'text') { var wrapTextNodes = i18nOptions.transWrapTextNodes; var _content = shouldUnescape ? i18nOptions.unescape(i18n.services.interpolator.interpolate(node.content, opts, i18n.language)) : i18n.services.interpolator.interpolate(node.content, opts, i18n.language); if (wrapTextNodes) { mem.push((0, _react$5.createElement)(wrapTextNodes, { key: "".concat(node.name, "-").concat(i) }, _content)); } else { mem.push(_content); } } return mem; }, []); } var result = mapAST([{ dummy: true, children: children || [] }], ast, getAsArray(children || [])); return getChildren(result[0]); } function Trans(_ref) { var children = _ref.children, count = _ref.count, parent = _ref.parent, i18nKey = _ref.i18nKey, context = _ref.context, _ref$tOptions = _ref.tOptions, tOptions = _ref$tOptions === void 0 ? {} : _ref$tOptions, values = _ref.values, defaults = _ref.defaults, components = _ref.components, ns = _ref.ns, i18nFromProps = _ref.i18n, tFromProps = _ref.t, shouldUnescape = _ref.shouldUnescape, additionalProps = (0, _objectWithoutProperties2$3["default"])(_ref, _excluded2); var _ref2 = (0, _react$5.useContext)(_context$4.I18nContext) || {}, i18nFromContext = _ref2.i18n, defaultNSFromContext = _ref2.defaultNS; var i18n = i18nFromProps || i18nFromContext || (0, _context$4.getI18n)(); if (!i18n) { (0, _utils$3.warnOnce)('You will need to pass in an i18next instance by using i18nextReactModule'); return children; } var t = tFromProps || i18n.t.bind(i18n) || function (k) { return k; }; if (context) tOptions.context = context; var reactI18nextOptions = _objectSpread$a(_objectSpread$a({}, (0, _context$4.getDefaults)()), i18n.options && i18n.options.react); var namespaces = ns || t.ns || defaultNSFromContext || i18n.options && i18n.options.defaultNS; namespaces = typeof namespaces === 'string' ? [namespaces] : namespaces || ['translation']; var defaultValue = defaults || nodesToString(children, reactI18nextOptions) || reactI18nextOptions.transEmptyNodeValue || i18nKey; var hashTransKey = reactI18nextOptions.hashTransKey; var key = i18nKey || (hashTransKey ? hashTransKey(defaultValue) : defaultValue); var interpolationOverride = values ? tOptions.interpolation : { interpolation: _objectSpread$a(_objectSpread$a({}, tOptions.interpolation), {}, { prefix: '#$?', suffix: '?$#' }) }; var combinedTOpts = _objectSpread$a(_objectSpread$a(_objectSpread$a(_objectSpread$a({}, tOptions), {}, { count: count }, values), interpolationOverride), {}, { defaultValue: defaultValue, ns: namespaces }); var translation = key ? t(key, combinedTOpts) : defaultValue; var content = renderNodes(components || children, translation, i18n, reactI18nextOptions, combinedTOpts, shouldUnescape); var useAsParent = parent !== undefined ? parent : reactI18nextOptions.defaultTransParent; return useAsParent ? (0, _react$5.createElement)(useAsParent, additionalProps, content) : content; } var useTranslation$2 = {}; var slicedToArray = {exports: {}}; var arrayWithHoles = {exports: {}}; var hasRequiredArrayWithHoles; function requireArrayWithHoles () { if (hasRequiredArrayWithHoles) return arrayWithHoles.exports; hasRequiredArrayWithHoles = 1; (function (module) { function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } module.exports = _arrayWithHoles, module.exports.__esModule = true, module.exports["default"] = module.exports; } (arrayWithHoles)); return arrayWithHoles.exports; } var iterableToArrayLimit = {exports: {}}; var hasRequiredIterableToArrayLimit; function requireIterableToArrayLimit () { if (hasRequiredIterableToArrayLimit) return iterableToArrayLimit.exports; hasRequiredIterableToArrayLimit = 1; (function (module) { function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } module.exports = _iterableToArrayLimit, module.exports.__esModule = true, module.exports["default"] = module.exports; } (iterableToArrayLimit)); return iterableToArrayLimit.exports; } var unsupportedIterableToArray = {exports: {}}; var arrayLikeToArray = {exports: {}}; var hasRequiredArrayLikeToArray; function requireArrayLikeToArray () { if (hasRequiredArrayLikeToArray) return arrayLikeToArray.exports; hasRequiredArrayLikeToArray = 1; (function (module) { function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } module.exports = _arrayLikeToArray, module.exports.__esModule = true, module.exports["default"] = module.exports; } (arrayLikeToArray)); return arrayLikeToArray.exports; } var hasRequiredUnsupportedIterableToArray; function requireUnsupportedIterableToArray () { if (hasRequiredUnsupportedIterableToArray) return unsupportedIterableToArray.exports; hasRequiredUnsupportedIterableToArray = 1; (function (module) { var arrayLikeToArray = requireArrayLikeToArray(); function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return arrayLikeToArray(o, minLen); } module.exports = _unsupportedIterableToArray, module.exports.__esModule = true, module.exports["default"] = module.exports; } (unsupportedIterableToArray)); return unsupportedIterableToArray.exports; } var nonIterableRest = {exports: {}}; var hasRequiredNonIterableRest; function requireNonIterableRest () { if (hasRequiredNonIterableRest) return nonIterableRest.exports; hasRequiredNonIterableRest = 1; (function (module) { function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } module.exports = _nonIterableRest, module.exports.__esModule = true, module.exports["default"] = module.exports; } (nonIterableRest)); return nonIterableRest.exports; } var hasRequiredSlicedToArray; function requireSlicedToArray () { if (hasRequiredSlicedToArray) return slicedToArray.exports; hasRequiredSlicedToArray = 1; (function (module) { var arrayWithHoles = requireArrayWithHoles(); var iterableToArrayLimit = requireIterableToArrayLimit(); var unsupportedIterableToArray = requireUnsupportedIterableToArray(); var nonIterableRest = requireNonIterableRest(); function _slicedToArray(arr, i) { return arrayWithHoles(arr) || iterableToArrayLimit(arr, i) || unsupportedIterableToArray(arr, i) || nonIterableRest(); } module.exports = _slicedToArray, module.exports.__esModule = true, module.exports["default"] = module.exports; } (slicedToArray)); return slicedToArray.exports; } var _interopRequireDefault$3 = interopRequireDefault.exports; Object.defineProperty(useTranslation$2, "__esModule", { value: true }); useTranslation$2.useTranslation = useTranslation$1; var _slicedToArray2$2 = _interopRequireDefault$3(requireSlicedToArray()); var _defineProperty2$2 = _interopRequireDefault$3(requireDefineProperty()); var _react$4 = React__default$1["default"]; var _context$3 = context; var _utils$2 = requireUtils(); function ownKeys$9(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; } function _objectSpread$9(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$9(Object(source), true).forEach(function (key) { (0, _defineProperty2$2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$9(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } var usePrevious$1 = function usePrevious(value, ignore) { var ref = (0, _react$4.useRef)(); (0, _react$4.useEffect)(function () { ref.current = ignore ? ref.current : value; }, [value, ignore]); return ref.current; }; function useTranslation$1(ns) { var props = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; var i18nFromProps = props.i18n; var _ref = (0, _react$4.useContext)(_context$3.I18nContext) || {}, i18nFromContext = _ref.i18n, defaultNSFromContext = _ref.defaultNS; var i18n = i18nFromProps || i18nFromContext || (0, _context$3.getI18n)(); if (i18n && !i18n.reportNamespaces) i18n.reportNamespaces = new _context$3.ReportNamespaces(); if (!i18n) { (0, _utils$2.warnOnce)('You will need to pass in an i18next instance by using initReactI18next'); var notReadyT = function notReadyT(k) { return Array.isArray(k) ? k[k.length - 1] : k; }; var retNotReady = [notReadyT, {}, false]; retNotReady.t = notReadyT; retNotReady.i18n = {}; retNotReady.ready = false; return retNotReady; } if (i18n.options.react && i18n.options.react.wait !== undefined) (0, _utils$2.warnOnce)('It seems you are still using the old wait option, you may migrate to the new useSuspense behaviour.'); var i18nOptions = _objectSpread$9(_objectSpread$9(_objectSpread$9({}, (0, _context$3.getDefaults)()), i18n.options.react), props); var useSuspense = i18nOptions.useSuspense, keyPrefix = i18nOptions.keyPrefix; var namespaces = ns || defaultNSFromContext || i18n.options && i18n.options.defaultNS; namespaces = typeof namespaces === 'string' ? [namespaces] : namespaces || ['translation']; if (i18n.reportNamespaces.addUsedNamespaces) i18n.reportNamespaces.addUsedNamespaces(namespaces); var ready = (i18n.isInitialized || i18n.initializedStoreOnce) && namespaces.every(function (n) { return (0, _utils$2.hasLoadedNamespace)(n, i18n, i18nOptions); }); function getT() { return i18n.getFixedT(null, i18nOptions.nsMode === 'fallback' ? namespaces : namespaces[0], keyPrefix); } var _useState = (0, _react$4.useState)(getT), _useState2 = (0, _slicedToArray2$2["default"])(_useState, 2), t = _useState2[0], setT = _useState2[1]; var joinedNS = namespaces.join(); var previousJoinedNS = usePrevious$1(joinedNS); var isMounted = (0, _react$4.useRef)(true); (0, _react$4.useEffect)(function () { var bindI18n = i18nOptions.bindI18n, bindI18nStore = i18nOptions.bindI18nStore; isMounted.current = true; if (!ready && !useSuspense) { (0, _utils$2.loadNamespaces)(i18n, namespaces, function () { if (isMounted.current) setT(getT); }); } if (ready && previousJoinedNS && previousJoinedNS !== joinedNS && isMounted.current) { setT(getT); } function boundReset() { if (isMounted.current) setT(getT); } if (bindI18n && i18n) i18n.on(bindI18n, boundReset); if (bindI18nStore && i18n) i18n.store.on(bindI18nStore, boundReset); return function () { isMounted.current = false; if (bindI18n && i18n) bindI18n.split(' ').forEach(function (e) { return i18n.off(e, boundReset); }); if (bindI18nStore && i18n) bindI18nStore.split(' ').forEach(function (e) { return i18n.store.off(e, boundReset); }); }; }, [i18n, joinedNS]); var isInitial = (0, _react$4.useRef)(true); (0, _react$4.useEffect)(function () { if (isMounted.current && !isInitial.current) { setT(getT); } isInitial.current = false; }, [i18n, keyPrefix]); var ret = [t, i18n, ready]; ret.t = t; ret.i18n = i18n; ret.ready = ready; if (ready) return ret; if (!ready && !useSuspense) return ret; throw new Promise(function (resolve) { (0, _utils$2.loadNamespaces)(i18n, namespaces, function () { resolve(); }); }); } var withTranslation$1 = {}; var _interopRequireDefault$2 = interopRequireDefault.exports; Object.defineProperty(withTranslation$1, "__esModule", { value: true }); withTranslation$1.withTranslation = withTranslation; var _defineProperty2$1 = _interopRequireDefault$2(requireDefineProperty()); var _slicedToArray2$1 = _interopRequireDefault$2(requireSlicedToArray()); var _objectWithoutProperties2$2 = _interopRequireDefault$2(requireObjectWithoutProperties()); var _react$3 = React__default$1["default"]; var _useTranslation3$1 = useTranslation$2; var _utils$1 = requireUtils(); var _excluded$2 = ["forwardedRef"]; function ownKeys$8(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; } function _objectSpread$8(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$8(Object(source), true).forEach(function (key) { (0, _defineProperty2$1["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$8(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } function withTranslation(ns) { var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; return function Extend(WrappedComponent) { function I18nextWithTranslation(_ref) { var forwardedRef = _ref.forwardedRef, rest = (0, _objectWithoutProperties2$2["default"])(_ref, _excluded$2); var _useTranslation = (0, _useTranslation3$1.useTranslation)(ns, _objectSpread$8(_objectSpread$8({}, rest), {}, { keyPrefix: options.keyPrefix })), _useTranslation2 = (0, _slicedToArray2$1["default"])(_useTranslation, 3), t = _useTranslation2[0], i18n = _useTranslation2[1], ready = _useTranslation2[2]; var passDownProps = _objectSpread$8(_objectSpread$8({}, rest), {}, { t: t, i18n: i18n, tReady: ready }); if (options.withRef && forwardedRef) { passDownProps.ref = forwardedRef; } else if (!options.withRef && forwardedRef) { passDownProps.forwardedRef = forwardedRef; } return (0, _react$3.createElement)(WrappedComponent, passDownProps); } I18nextWithTranslation.displayName = "withI18nextTranslation(".concat((0, _utils$1.getDisplayName)(WrappedComponent), ")"); I18nextWithTranslation.WrappedComponent = WrappedComponent; var forwardRef = function forwardRef(props, ref) { return (0, _react$3.createElement)(I18nextWithTranslation, Object.assign({}, props, { forwardedRef: ref })); }; return options.withRef ? (0, _react$3.forwardRef)(forwardRef) : I18nextWithTranslation; }; } var Translation$1 = {}; var _interopRequireDefault$1 = interopRequireDefault.exports; Object.defineProperty(Translation$1, "__esModule", { value: true }); Translation$1.Translation = Translation; var _slicedToArray2 = _interopRequireDefault$1(requireSlicedToArray()); var _objectWithoutProperties2$1 = _interopRequireDefault$1(requireObjectWithoutProperties()); var _useTranslation3 = useTranslation$2; var _excluded$1 = ["ns", "children"]; function Translation(props) { var ns = props.ns, children = props.children, options = (0, _objectWithoutProperties2$1["default"])(props, _excluded$1); var _useTranslation = (0, _useTranslation3.useTranslation)(ns, options), _useTranslation2 = (0, _slicedToArray2["default"])(_useTranslation, 3), t = _useTranslation2[0], i18n = _useTranslation2[1], ready = _useTranslation2[2]; return children(t, { i18n: i18n, lng: i18n.language }, ready); } var I18nextProvider$1 = {}; Object.defineProperty(I18nextProvider$1, "__esModule", { value: true }); I18nextProvider$1.I18nextProvider = I18nextProvider; var _react$2 = React__default$1["default"]; var _context$2 = context; function I18nextProvider(_ref) { var i18n = _ref.i18n, defaultNS = _ref.defaultNS, children = _ref.children; var value = (0, _react$2.useMemo)(function () { return { i18n: i18n, defaultNS: defaultNS }; }, [i18n, defaultNS]); return (0, _react$2.createElement)(_context$2.I18nContext.Provider, { value: value }, children); } var withSSR$1 = {}; var useSSR$1 = {}; Object.defineProperty(useSSR$1, "__esModule", { value: true }); useSSR$1.useSSR = useSSR; var _react$1 = React__default$1["default"]; var _context$1 = context; function useSSR(initialI18nStore, initialLanguage) { var props = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; var i18nFromProps = props.i18n; var _ref = (0, _react$1.useContext)(_context$1.I18nContext) || {}, i18nFromContext = _ref.i18n; var i18n = i18nFromProps || i18nFromContext || (0, _context$1.getI18n)(); if (i18n.options && i18n.options.isClone) return; if (initialI18nStore && !i18n.initializedStoreOnce) { i18n.services.resourceStore.data = initialI18nStore; i18n.options.ns = Object.values(initialI18nStore).reduce(function (mem, lngResources) { Object.keys(lngResources).forEach(function (ns) { if (mem.indexOf(ns) < 0) mem.push(ns); }); return mem; }, i18n.options.ns); i18n.initializedStoreOnce = true; i18n.isInitialized = true; } if (initialLanguage && !i18n.initializedLanguageOnce) { i18n.changeLanguage(initialLanguage); i18n.initializedLanguageOnce = true; } } var _interopRequireDefault = interopRequireDefault.exports; Object.defineProperty(withSSR$1, "__esModule", { value: true }); withSSR$1.withSSR = withSSR; var _defineProperty2 = _interopRequireDefault(requireDefineProperty()); var _objectWithoutProperties2 = _interopRequireDefault(requireObjectWithoutProperties()); var _react = React__default$1["default"]; var _useSSR = useSSR$1; var _context = context; var _utils = requireUtils(); var _excluded = ["initialI18nStore", "initialLanguage"]; function ownKeys$7(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; } function _objectSpread$7(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$7(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$7(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } function withSSR() { return function Extend(WrappedComponent) { function I18nextWithSSR(_ref) { var initialI18nStore = _ref.initialI18nStore, initialLanguage = _ref.initialLanguage, rest = (0, _objectWithoutProperties2["default"])(_ref, _excluded); (0, _useSSR.useSSR)(initialI18nStore, initialLanguage); return (0, _react.createElement)(WrappedComponent, _objectSpread$7({}, rest)); } I18nextWithSSR.getInitialProps = (0, _context.composeInitialProps)(WrappedComponent); I18nextWithSSR.displayName = "withI18nextSSR(".concat((0, _utils.getDisplayName)(WrappedComponent), ")"); I18nextWithSSR.WrappedComponent = WrappedComponent; return I18nextWithSSR; }; } (function (exports) { Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "Trans", { enumerable: true, get: function get() { return _Trans.Trans; } }); Object.defineProperty(exports, "useTranslation", { enumerable: true, get: function get() { return _useTranslation.useTranslation; } }); Object.defineProperty(exports, "withTranslation", { enumerable: true, get: function get() { return _withTranslation.withTranslation; } }); Object.defineProperty(exports, "Translation", { enumerable: true, get: function get() { return _Translation.Translation; } }); Object.defineProperty(exports, "I18nextProvider", { enumerable: true, get: function get() { return _I18nextProvider.I18nextProvider; } }); Object.defineProperty(exports, "withSSR", { enumerable: true, get: function get() { return _withSSR.withSSR; } }); Object.defineProperty(exports, "useSSR", { enumerable: true, get: function get() { return _useSSR.useSSR; } }); Object.defineProperty(exports, "I18nContext", { enumerable: true, get: function get() { return _context.I18nContext; } }); Object.defineProperty(exports, "initReactI18next", { enumerable: true, get: function get() { return _context.initReactI18next; } }); Object.defineProperty(exports, "setDefaults", { enumerable: true, get: function get() { return _context.setDefaults; } }); Object.defineProperty(exports, "getDefaults", { enumerable: true, get: function get() { return _context.getDefaults; } }); Object.defineProperty(exports, "setI18n", { enumerable: true, get: function get() { return _context.setI18n; } }); Object.defineProperty(exports, "getI18n", { enumerable: true, get: function get() { return _context.getI18n; } }); Object.defineProperty(exports, "composeInitialProps", { enumerable: true, get: function get() { return _context.composeInitialProps; } }); Object.defineProperty(exports, "getInitialProps", { enumerable: true, get: function get() { return _context.getInitialProps; } }); exports.selectOrdinal = exports.plural = exports.select = exports.number = exports.time = exports.date = void 0; var _Trans = Trans$1; var _useTranslation = useTranslation$2; var _withTranslation = withTranslation$1; var _Translation = Translation$1; var _I18nextProvider = I18nextProvider$1; var _withSSR = withSSR$1; var _useSSR = useSSR$1; var _context = context; var date = function date() { return ''; }; exports.date = date; var time = function time() { return ''; }; exports.time = time; var number = function number() { return ''; }; exports.number = number; var select = function select() { return ''; }; exports.select = select; var plural = function plural() { return ''; }; exports.plural = plural; var selectOrdinal = function selectOrdinal() { return ''; }; exports.selectOrdinal = selectOrdinal; } (commonjs)); function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _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); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } 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 } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _toArray(arr) { return _arrayWithHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableRest(); } function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } var consoleLogger = { type: 'logger', log: function log(args) { this.output('log', args); }, warn: function warn(args) { this.output('warn', args); }, error: function error(args) { this.output('error', args); }, output: function output(type, args) { if (console && console[type]) console[type].apply(console, args); } }; var Logger = function () { function Logger(concreteLogger) { var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; _classCallCheck(this, Logger); this.init(concreteLogger, options); } _createClass(Logger, [{ key: "init", value: function init(concreteLogger) { var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; this.prefix = options.prefix || 'i18next:'; this.logger = concreteLogger || consoleLogger; this.options = options; this.debug = options.debug; } }, { key: "setDebug", value: function setDebug(bool) { this.debug = bool; } }, { key: "log", value: function log() { for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } return this.forward(args, 'log', '', true); } }, { key: "warn", value: function warn() { for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { args[_key2] = arguments[_key2]; } return this.forward(args, 'warn', '', true); } }, { key: "error", value: function error() { for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) { args[_key3] = arguments[_key3]; } return this.forward(args, 'error', ''); } }, { key: "deprecate", value: function deprecate() { for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) { args[_key4] = arguments[_key4]; } return this.forward(args, 'warn', 'WARNING DEPRECATED: ', true); } }, { key: "forward", value: function forward(args, lvl, prefix, debugOnly) { if (debugOnly && !this.debug) return null; if (typeof args[0] === 'string') args[0] = "".concat(prefix).concat(this.prefix, " ").concat(args[0]); return this.logger[lvl](args); } }, { key: "create", value: function create(moduleName) { return new Logger(this.logger, _objectSpread(_objectSpread({}, { prefix: "".concat(this.prefix, ":").concat(moduleName, ":") }), this.options)); } }, { key: "clone", value: function clone(options) { options = options || this.options; options.prefix = options.prefix || this.prefix; return new Logger(this.logger, options); } }]); return Logger; }(); var baseLogger = new Logger(); var EventEmitter = function () { function EventEmitter() { _classCallCheck(this, EventEmitter); this.observers = {}; } _createClass(EventEmitter, [{ key: "on", value: function on(events, listener) { var _this = this; events.split(' ').forEach(function (event) { _this.observers[event] = _this.observers[event] || []; _this.observers[event].push(listener); }); return this; } }, { key: "off", value: function off(event, listener) { if (!this.observers[event]) return; if (!listener) { delete this.observers[event]; return; } this.observers[event] = this.observers[event].filter(function (l) { return l !== listener; }); } }, { key: "emit", value: function emit(event) { for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { args[_key - 1] = arguments[_key]; } if (this.observers[event]) { var cloned = [].concat(this.observers[event]); cloned.forEach(function (observer) { observer.apply(void 0, args); }); } if (this.observers['*']) { var _cloned = [].concat(this.observers['*']); _cloned.forEach(function (observer) { observer.apply(observer, [event].concat(args)); }); } } }]); return EventEmitter; }(); function defer() { var res; var rej; var promise = new Promise(function (resolve, reject) { res = resolve; rej = reject; }); promise.resolve = res; promise.reject = rej; return promise; } function makeString(object) { if (object == null) return ''; return '' + object; } function copy(a, s, t) { a.forEach(function (m) { if (s[m]) t[m] = s[m]; }); } function getLastOfPath(object, path, Empty) { function cleanKey(key) { return key && key.indexOf('###') > -1 ? key.replace(/###/g, '.') : key; } function canNotTraverseDeeper() { return !object || typeof object === 'string'; } var stack = typeof path !== 'string' ? [].concat(path) : path.split('.'); while (stack.length > 1) { if (canNotTraverseDeeper()) return {}; var key = cleanKey(stack.shift()); if (!object[key] && Empty) object[key] = new Empty(); if (Object.prototype.hasOwnProperty.call(object, key)) { object = object[key]; } else { object = {}; } } if (canNotTraverseDeeper()) return {}; return { obj: object, k: cleanKey(stack.shift()) }; } function setPath(object, path, newValue) { var _getLastOfPath = getLastOfPath(object, path, Object), obj = _getLastOfPath.obj, k = _getLastOfPath.k; obj[k] = newValue; } function pushPath(object, path, newValue, concat) { var _getLastOfPath2 = getLastOfPath(object, path, Object), obj = _getLastOfPath2.obj, k = _getLastOfPath2.k; obj[k] = obj[k] || []; if (concat) obj[k] = obj[k].concat(newValue); if (!concat) obj[k].push(newValue); } function getPath(object, path) { var _getLastOfPath3 = getLastOfPath(object, path), obj = _getLastOfPath3.obj, k = _getLastOfPath3.k; if (!obj) return undefined; return obj[k]; } function getPathWithDefaults(data, defaultData, key) { var value = getPath(data, key); if (value !== undefined) { return value; } return getPath(defaultData, key); } function deepExtend(target, source, overwrite) { for (var prop in source) { if (prop !== '__proto__' && prop !== 'constructor') { if (prop in target) { if (typeof target[prop] === 'string' || target[prop] instanceof String || typeof source[prop] === 'string' || source[prop] instanceof String) { if (overwrite) target[prop] = source[prop]; } else { deepExtend(target[prop], source[prop], overwrite); } } else { target[prop] = source[prop]; } } } return target; } function regexEscape(str) { return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, '\\$&'); } var _entityMap = { '&': '&', '<': '<', '>': '>', '"': '"', "'": ''', '/': '/' }; function escape$1(data) { if (typeof data === 'string') { return data.replace(/[&<>"'\/]/g, function (s) { return _entityMap[s]; }); } return data; } var isIE10 = typeof window !== 'undefined' && window.navigator && typeof window.navigator.userAgentData === 'undefined' && window.navigator.userAgent && window.navigator.userAgent.indexOf('MSIE') > -1; var chars = [' ', ',', '?', '!', ';']; function looksLikeObjectPath(key, nsSeparator, keySeparator) { nsSeparator = nsSeparator || ''; keySeparator = keySeparator || ''; var possibleChars = chars.filter(function (c) { return nsSeparator.indexOf(c) < 0 && keySeparator.indexOf(c) < 0; }); if (possibleChars.length === 0) return true; var r = new RegExp("(".concat(possibleChars.map(function (c) { return c === '?' ? '\\?' : c; }).join('|'), ")")); var matched = !r.test(key); if (!matched) { var ki = key.indexOf(keySeparator); if (ki > 0 && !r.test(key.substring(0, ki))) { matched = true; } } return matched; } function ownKeys$1(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; } function _objectSpread$1(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$1(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$1(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } function deepFind(obj, path) { var keySeparator = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '.'; if (!obj) return undefined; if (obj[path]) return obj[path]; var paths = path.split(keySeparator); var current = obj; for (var i = 0; i < paths.length; ++i) { if (!current) return undefined; if (typeof current[paths[i]] === 'string' && i + 1 < paths.length) { return undefined; } if (current[paths[i]] === undefined) { var j = 2; var p = paths.slice(i, i + j).join(keySeparator); var mix = current[p]; while (mix === undefined && paths.length > i + j) { j++; p = paths.slice(i, i + j).join(keySeparator); mix = current[p]; } if (mix === undefined) return undefined; if (mix === null) return null; if (path.endsWith(p)) { if (typeof mix === 'string') return mix; if (p && typeof mix[p] === 'string') return mix[p]; } var joinedPath = paths.slice(i + j).join(keySeparator); if (joinedPath) return deepFind(mix, joinedPath, keySeparator); return undefined; } current = current[paths[i]]; } return current; } var ResourceStore = function (_EventEmitter) { _inherits(ResourceStore, _EventEmitter); var _super = _createSuper(ResourceStore); function ResourceStore(data) { var _this; var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : { ns: ['translation'], defaultNS: 'translation' }; _classCallCheck(this, ResourceStore); _this = _super.call(this); if (isIE10) { EventEmitter.call(_assertThisInitialized(_this)); } _this.data = data || {}; _this.options = options; if (_this.options.keySeparator === undefined) { _this.options.keySeparator = '.'; } if (_this.options.ignoreJSONStructure === undefined) { _this.options.ignoreJSONStructure = true; } return _this; } _createClass(ResourceStore, [{ key: "addNamespaces", value: function addNamespaces(ns) { if (this.options.ns.indexOf(ns) < 0) { this.options.ns.push(ns); } } }, { key: "removeNamespaces", value: function removeNamespaces(ns) { var index = this.options.ns.indexOf(ns); if (index > -1) { this.options.ns.splice(index, 1); } } }, { key: "getResource", value: function getResource(lng, ns, key) { var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; var keySeparator = options.keySeparator !== undefined ? options.keySeparator : this.options.keySeparator; var ignoreJSONStructure = options.ignoreJSONStructure !== undefined ? options.ignoreJSONStructure : this.options.ignoreJSONStructure; var path = [lng, ns]; if (key && typeof key !== 'string') path = path.concat(key); if (key && typeof key === 'string') path = path.concat(keySeparator ? key.split(keySeparator) : key); if (lng.indexOf('.') > -1) { path = lng.split('.'); } var result = getPath(this.data, path); if (result || !ignoreJSONStructure || typeof key !== 'string') return result; return deepFind(this.data && this.data[lng] && this.data[lng][ns], key, keySeparator); } }, { key: "addResource", value: function addResource(lng, ns, key, value) { var options = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : { silent: false }; var keySeparator = this.options.keySeparator; if (keySeparator === undefined) keySeparator = '.'; var path = [lng, ns]; if (key) path = path.concat(keySeparator ? key.split(keySeparator) : key); if (lng.indexOf('.') > -1) { path = lng.split('.'); value = ns; ns = path[1]; } this.addNamespaces(ns); setPath(this.data, path, value); if (!options.silent) this.emit('added', lng, ns, key, value); } }, { key: "addResources", value: function addResources(lng, ns, resources) { var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : { silent: false }; for (var m in resources) { if (typeof resources[m] === 'string' || Object.prototype.toString.apply(resources[m]) === '[object Array]') this.addResource(lng, ns, m, resources[m], { silent: true }); } if (!options.silent) this.emit('added', lng, ns, resources); } }, { key: "addResourceBundle", value: function addResourceBundle(lng, ns, resources, deep, overwrite) { var options = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : { silent: false }; var path = [lng, ns]; if (lng.indexOf('.') > -1) { path = lng.split('.'); deep = resources; resources = ns; ns = path[1]; } this.addNamespaces(ns); var pack = getPath(this.data, path) || {}; if (deep) { deepExtend(pack, resources, overwrite); } else { pack = _objectSpread$1(_objectSpread$1({}, pack), resources); } setPath(this.data, path, pack); if (!options.silent) this.emit('added', lng, ns, resources); } }, { key: "removeResourceBundle", value: function removeResourceBundle(lng, ns) { if (this.hasResourceBundle(lng, ns)) { delete this.data[lng][ns]; } this.removeNamespaces(ns); this.emit('removed', lng, ns); } }, { key: "hasResourceBundle", value: function hasResourceBundle(lng, ns) { return this.getResource(lng, ns) !== undefined; } }, { key: "getResourceBundle", value: function getResourceBundle(lng, ns) { if (!ns) ns = this.options.defaultNS; if (this.options.compatibilityAPI === 'v1') return _objectSpread$1(_objectSpread$1({}, {}), this.getResource(lng, ns)); return this.getResource(lng, ns); } }, { key: "getDataByLanguage", value: function getDataByLanguage(lng) { return this.data[lng]; } }, { key: "hasLanguageSomeTranslations", value: function hasLanguageSomeTranslations(lng) { var data = this.getDataByLanguage(lng); var n = data && Object.keys(data) || []; return !!n.find(function (v) { return data[v] && Object.keys(data[v]).length > 0; }); } }, { key: "toJSON", value: function toJSON() { return this.data; } }]); return ResourceStore; }(EventEmitter); var postProcessor = { processors: {}, addPostProcessor: function addPostProcessor(module) { this.processors[module.name] = module; }, handle: function handle(processors, value, key, options, translator) { var _this = this; processors.forEach(function (processor) { if (_this.processors[processor]) value = _this.processors[processor].process(value, key, options, translator); }); return value; } }; function ownKeys$2(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; } function _objectSpread$2(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$2(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$2(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } function _createSuper$1(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$1(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } function _isNativeReflectConstruct$1() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } var checkedLoadedFor = {}; var Translator = function (_EventEmitter) { _inherits(Translator, _EventEmitter); var _super = _createSuper$1(Translator); function Translator(services) { var _this; var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; _classCallCheck(this, Translator); _this = _super.call(this); if (isIE10) { EventEmitter.call(_assertThisInitialized(_this)); } copy(['resourceStore', 'languageUtils', 'pluralResolver', 'interpolator', 'backendConnector', 'i18nFormat', 'utils'], services, _assertThisInitialized(_this)); _this.options = options; if (_this.options.keySeparator === undefined) { _this.options.keySeparator = '.'; } _this.logger = baseLogger.create('translator'); return _this; } _createClass(Translator, [{ key: "changeLanguage", value: function changeLanguage(lng) { if (lng) this.language = lng; } }, { key: "exists", value: function exists(key) { var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : { interpolation: {} }; if (key === undefined || key === null) { return false; } var resolved = this.resolve(key, options); return resolved && resolved.res !== undefined; } }, { key: "extractFromKey", value: function extractFromKey(key, options) { var nsSeparator = options.nsSeparator !== undefined ? options.nsSeparator : this.options.nsSeparator; if (nsSeparator === undefined) nsSeparator = ':'; var keySeparator = options.keySeparator !== undefined ? options.keySeparator : this.options.keySeparator; var namespaces = options.ns || this.options.defaultNS || []; var wouldCheckForNsInKey = nsSeparator && key.indexOf(nsSeparator) > -1; var seemsNaturalLanguage = !this.options.userDefinedKeySeparator && !options.keySeparator && !this.options.userDefinedNsSeparator && !options.nsSeparator && !looksLikeObjectPath(key, nsSeparator, keySeparator); if (wouldCheckForNsInKey && !seemsNaturalLanguage) { var m = key.match(this.interpolator.nestingRegexp); if (m && m.length > 0) { return { key: key, namespaces: namespaces }; } var parts = key.split(nsSeparator); if (nsSeparator !== keySeparator || nsSeparator === keySeparator && this.options.ns.indexOf(parts[0]) > -1) namespaces = parts.shift(); key = parts.join(keySeparator); } if (typeof namespaces === 'string') namespaces = [namespaces]; return { key: key, namespaces: namespaces }; } }, { key: "translate", value: function translate(keys, options, lastKey) { var _this2 = this; if (_typeof(options) !== 'object' && this.options.overloadTranslationOptionHandler) { options = this.options.overloadTranslationOptionHandler(arguments); } if (!options) options = {}; if (keys === undefined || keys === null) return ''; if (!Array.isArray(keys)) keys = [String(keys)]; var returnDetails = options.returnDetails !== undefined ? options.returnDetails : this.options.returnDetails; var keySeparator = options.keySeparator !== undefined ? options.keySeparator : this.options.keySeparator; var _this$extractFromKey = this.extractFromKey(keys[keys.length - 1], options), key = _this$extractFromKey.key, namespaces = _this$extractFromKey.namespaces; var namespace = namespaces[namespaces.length - 1]; var lng = options.lng || this.language; var appendNamespaceToCIMode = options.appendNamespaceToCIMode || this.options.appendNamespaceToCIMode; if (lng && lng.toLowerCase() === 'cimode') { if (appendNamespaceToCIMode) { var nsSeparator = options.nsSeparator || this.options.nsSeparator; if (returnDetails) { resolved.res = "".concat(namespace).concat(nsSeparator).concat(key); return resolved; } return "".concat(namespace).concat(nsSeparator).concat(key); } if (returnDetails) { resolved.res = key; return resolved; } return key; } var resolved = this.resolve(keys, options); var res = resolved && resolved.res; var resUsedKey = resolved && resolved.usedKey || key; var resExactUsedKey = resolved && resolved.exactUsedKey || key; var resType = Object.prototype.toString.apply(res); var noObject = ['[object Number]', '[object Function]', '[object RegExp]']; var joinArrays = options.joinArrays !== undefined ? options.joinArrays : this.options.joinArrays; var handleAsObjectInI18nFormat = !this.i18nFormat || this.i18nFormat.handleAsObject; var handleAsObject = typeof res !== 'string' && typeof res !== 'boolean' && typeof res !== 'number'; if (handleAsObjectInI18nFormat && res && handleAsObject && noObject.indexOf(resType) < 0 && !(typeof joinArrays === 'string' && resType === '[object Array]')) { if (!options.returnObjects && !this.options.returnObjects) { if (!this.options.returnedObjectHandler) { this.logger.warn('accessing an object - but returnObjects options is not enabled!'); } var r = this.options.returnedObjectHandler ? this.options.returnedObjectHandler(resUsedKey, res, _objectSpread$2(_objectSpread$2({}, options), {}, { ns: namespaces })) : "key '".concat(key, " (").concat(this.language, ")' returned an object instead of string."); if (returnDetails) { resolved.res = r; return resolved; } return r; } if (keySeparator) { var resTypeIsArray = resType === '[object Array]'; var copy = resTypeIsArray ? [] : {}; var newKeyToUse = resTypeIsArray ? resExactUsedKey : resUsedKey; for (var m in res) { if (Object.prototype.hasOwnProperty.call(res, m)) { var deepKey = "".concat(newKeyToUse).concat(keySeparator).concat(m); copy[m] = this.translate(deepKey, _objectSpread$2(_objectSpread$2({}, options), { joinArrays: false, ns: namespaces })); if (copy[m] === deepKey) copy[m] = res[m]; } } res = copy; } } else if (handleAsObjectInI18nFormat && typeof joinArrays === 'string' && resType === '[object Array]') { res = res.join(joinArrays); if (res) res = this.extendTranslation(res, keys, options, lastKey); } else { var usedDefault = false; var usedKey = false; var needsPluralHandling = options.count !== undefined && typeof options.count !== 'string'; var hasDefaultValue = Translator.hasDefaultValue(options); var defaultValueSuffix = needsPluralHandling ? this.pluralResolver.getSuffix(lng, options.count, options) : ''; var defaultValue = options["defaultValue".concat(defaultValueSuffix)] || options.defaultValue; if (!this.isValidLookup(res) && hasDefaultValue) { usedDefault = true; res = defaultValue; } if (!this.isValidLookup(res)) { usedKey = true; res = key; } var missingKeyNoValueFallbackToKey = options.missingKeyNoValueFallbackToKey || this.options.missingKeyNoValueFallbackToKey; var resForMissing = missingKeyNoValueFallbackToKey && usedKey ? undefined : res; var updateMissing = hasDefaultValue && defaultValue !== res && this.options.updateMissing; if (usedKey || usedDefault || updateMissing) { this.logger.log(updateMissing ? 'updateKey' : 'missingKey', lng, namespace, key, updateMissing ? defaultValue : res); if (keySeparator) { var fk = this.resolve(key, _objectSpread$2(_objectSpread$2({}, options), {}, { keySeparator: false })); if (fk && fk.res) this.logger.warn('Seems the loaded translations were in flat JSON format instead of nested. Either set keySeparator: false on init or make sure your translations are published in nested format.'); } var lngs = []; var fallbackLngs = this.languageUtils.getFallbackCodes(this.options.fallbackLng, options.lng || this.language); if (this.options.saveMissingTo === 'fallback' && fallbackLngs && fallbackLngs[0]) { for (var i = 0; i < fallbackLngs.length; i++) { lngs.push(fallbackLngs[i]); } } else if (this.options.saveMissingTo === 'all') { lngs = this.languageUtils.toResolveHierarchy(options.lng || this.language); } else { lngs.push(options.lng || this.language); } var send = function send(l, k, specificDefaultValue) { var defaultForMissing = hasDefaultValue && specificDefaultValue !== res ? specificDefaultValue : resForMissing; if (_this2.options.missingKeyHandler) { _this2.options.missingKeyHandler(l, namespace, k, defaultForMissing, updateMissing, options); } else if (_this2.backendConnector && _this2.backendConnector.saveMissing) { _this2.backendConnector.saveMissing(l, namespace, k, defaultForMissing, updateMissing, options); } _this2.emit('missingKey', l, namespace, k, res); }; if (this.options.saveMissing) { if (this.options.saveMissingPlurals && needsPluralHandling) { lngs.forEach(function (language) { _this2.pluralResolver.getSuffixes(language, options).forEach(function (suffix) { send([language], key + suffix, options["defaultValue".concat(suffix)] || defaultValue); }); }); } else { send(lngs, key, defaultValue); } } } res = this.extendTranslation(res, keys, options, resolved, lastKey); if (usedKey && res === key && this.options.appendNamespaceToMissingKey) res = "".concat(namespace, ":").concat(key); if ((usedKey || usedDefault) && this.options.parseMissingKeyHandler) { if (this.options.compatibilityAPI !== 'v1') { res = this.options.parseMissingKeyHandler(this.options.appendNamespaceToMissingKey ? "".concat(namespace, ":").concat(key) : key, usedDefault ? res : undefined); } else { res = this.options.parseMissingKeyHandler(res); } } } if (returnDetails) { resolved.res = res; return resolved; } return res; } }, { key: "extendTranslation", value: function extendTranslation(res, key, options, resolved, lastKey) { var _this3 = this; if (this.i18nFormat && this.i18nFormat.parse) { res = this.i18nFormat.parse(res, _objectSpread$2(_objectSpread$2({}, this.options.interpolation.defaultVariables), options), resolved.usedLng, resolved.usedNS, resolved.usedKey, { resolved: resolved }); } else if (!options.skipInterpolation) { if (options.interpolation) this.interpolator.init(_objectSpread$2(_objectSpread$2({}, options), { interpolation: _objectSpread$2(_objectSpread$2({}, this.options.interpolation), options.interpolation) })); var skipOnVariables = typeof res === 'string' && (options && options.interpolation && options.interpolation.skipOnVariables !== undefined ? options.interpolation.skipOnVariables : this.options.interpolation.skipOnVariables); var nestBef; if (skipOnVariables) { var nb = res.match(this.interpolator.nestingRegexp); nestBef = nb && nb.length; } var data = options.replace && typeof options.replace !== 'string' ? options.replace : options; if (this.options.interpolation.defaultVariables) data = _objectSpread$2(_objectSpread$2({}, this.options.interpolation.defaultVariables), data); res = this.interpolator.interpolate(res, data, options.lng || this.language, options); if (skipOnVariables) { var na = res.match(this.interpolator.nestingRegexp); var nestAft = na && na.length; if (nestBef < nestAft) options.nest = false; } if (options.nest !== false) res = this.interpolator.nest(res, function () { for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } if (lastKey && lastKey[0] === args[0] && !options.context) { _this3.logger.warn("It seems you are nesting recursively key: ".concat(args[0], " in key: ").concat(key[0])); return null; } return _this3.translate.apply(_this3, args.concat([key])); }, options); if (options.interpolation) this.interpolator.reset(); } var postProcess = options.postProcess || this.options.postProcess; var postProcessorNames = typeof postProcess === 'string' ? [postProcess] : postProcess; if (res !== undefined && res !== null && postProcessorNames && postProcessorNames.length && options.applyPostProcessor !== false) { res = postProcessor.handle(postProcessorNames, res, key, this.options && this.options.postProcessPassResolved ? _objectSpread$2({ i18nResolved: resolved }, options) : options, this); } return res; } }, { key: "resolve", value: function resolve(keys) { var _this4 = this; var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; var found; var usedKey; var exactUsedKey; var usedLng; var usedNS; if (typeof keys === 'string') keys = [keys]; keys.forEach(function (k) { if (_this4.isValidLookup(found)) return; var extracted = _this4.extractFromKey(k, options); var key = extracted.key; usedKey = key; var namespaces = extracted.namespaces; if (_this4.options.fallbackNS) namespaces = namespaces.concat(_this4.options.fallbackNS); var needsPluralHandling = options.count !== undefined && typeof options.count !== 'string'; var needsZeroSuffixLookup = needsPluralHandling && !options.ordinal && options.count === 0 && _this4.pluralResolver.shouldUseIntlApi(); var needsContextHandling = options.context !== undefined && (typeof options.context === 'string' || typeof options.context === 'number') && options.context !== ''; var codes = options.lngs ? options.lngs : _this4.languageUtils.toResolveHierarchy(options.lng || _this4.language, options.fallbackLng); namespaces.forEach(function (ns) { if (_this4.isValidLookup(found)) return; usedNS = ns; if (!checkedLoadedFor["".concat(codes[0], "-").concat(ns)] && _this4.utils && _this4.utils.hasLoadedNamespace && !_this4.utils.hasLoadedNamespace(usedNS)) { checkedLoadedFor["".concat(codes[0], "-").concat(ns)] = true; _this4.logger.warn("key \"".concat(usedKey, "\" for languages \"").concat(codes.join(', '), "\" won't get resolved as namespace \"").concat(usedNS, "\" was not yet loaded"), 'This means something IS WRONG in your setup. You access the t function before i18next.init / i18next.loadNamespace / i18next.changeLanguage was done. Wait for the callback or Promise to resolve before accessing it!!!'); } codes.forEach(function (code) { if (_this4.isValidLookup(found)) return; usedLng = code; var finalKeys = [key]; if (_this4.i18nFormat && _this4.i18nFormat.addLookupKeys) { _this4.i18nFormat.addLookupKeys(finalKeys, key, code, ns, options); } else { var pluralSuffix; if (needsPluralHandling) pluralSuffix = _this4.pluralResolver.getSuffix(code, options.count, options); var zeroSuffix = "".concat(_this4.options.pluralSeparator, "zero"); if (needsPluralHandling) { finalKeys.push(key + pluralSuffix); if (needsZeroSuffixLookup) { finalKeys.push(key + zeroSuffix); } } if (needsContextHandling) { var contextKey = "".concat(key).concat(_this4.options.contextSeparator).concat(options.context); finalKeys.push(contextKey); if (needsPluralHandling) { finalKeys.push(contextKey + pluralSuffix); if (needsZeroSuffixLookup) { finalKeys.push(contextKey + zeroSuffix); } } } } var possibleKey; while (possibleKey = finalKeys.pop()) { if (!_this4.isValidLookup(found)) { exactUsedKey = possibleKey; found = _this4.getResource(code, ns, possibleKey, options); } } }); }); }); return { res: found, usedKey: usedKey, exactUsedKey: exactUsedKey, usedLng: usedLng, usedNS: usedNS }; } }, { key: "isValidLookup", value: function isValidLookup(res) { return res !== undefined && !(!this.options.returnNull && res === null) && !(!this.options.returnEmptyString && res === ''); } }, { key: "getResource", value: function getResource(code, ns, key) { var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; if (this.i18nFormat && this.i18nFormat.getResource) return this.i18nFormat.getResource(code, ns, key, options); return this.resourceStore.getResource(code, ns, key, options); } }], [{ key: "hasDefaultValue", value: function hasDefaultValue(options) { var prefix = 'defaultValue'; for (var option in options) { if (Object.prototype.hasOwnProperty.call(options, option) && prefix === option.substring(0, prefix.length) && undefined !== options[option]) { return true; } } return false; } }]); return Translator; }(EventEmitter); function capitalize(string) { return string.charAt(0).toUpperCase() + string.slice(1); } var LanguageUtil = function () { function LanguageUtil(options) { _classCallCheck(this, LanguageUtil); this.options = options; this.supportedLngs = this.options.supportedLngs || false; this.logger = baseLogger.create('languageUtils'); } _createClass(LanguageUtil, [{ key: "getScriptPartFromCode", value: function getScriptPartFromCode(code) { if (!code || code.indexOf('-') < 0) return null; var p = code.split('-'); if (p.length === 2) return null; p.pop(); if (p[p.length - 1].toLowerCase() === 'x') return null; return this.formatLanguageCode(p.join('-')); } }, { key: "getLanguagePartFromCode", value: function getLanguagePartFromCode(code) { if (!code || code.indexOf('-') < 0) return code; var p = code.split('-'); return this.formatLanguageCode(p[0]); } }, { key: "formatLanguageCode", value: function formatLanguageCode(code) { if (typeof code === 'string' && code.indexOf('-') > -1) { var specialCases = ['hans', 'hant', 'latn', 'cyrl', 'cans', 'mong', 'arab']; var p = code.split('-'); if (this.options.lowerCaseLng) { p = p.map(function (part) { return part.toLowerCase(); }); } else if (p.length === 2) { p[0] = p[0].toLowerCase(); p[1] = p[1].toUpperCase(); if (specialCases.indexOf(p[1].toLowerCase()) > -1) p[1] = capitalize(p[1].toLowerCase()); } else if (p.length === 3) { p[0] = p[0].toLowerCase(); if (p[1].length === 2) p[1] = p[1].toUpperCase(); if (p[0] !== 'sgn' && p[2].length === 2) p[2] = p[2].toUpperCase(); if (specialCases.indexOf(p[1].toLowerCase()) > -1) p[1] = capitalize(p[1].toLowerCase()); if (specialCases.indexOf(p[2].toLowerCase()) > -1) p[2] = capitalize(p[2].toLowerCase()); } return p.join('-'); } return this.options.cleanCode || this.options.lowerCaseLng ? code.toLowerCase() : code; } }, { key: "isSupportedCode", value: function isSupportedCode(code) { if (this.options.load === 'languageOnly' || this.options.nonExplicitSupportedLngs) { code = this.getLanguagePartFromCode(code); } return !this.supportedLngs || !this.supportedLngs.length || this.supportedLngs.indexOf(code) > -1; } }, { key: "getBestMatchFromCodes", value: function getBestMatchFromCodes(codes) { var _this = this; if (!codes) return null; var found; codes.forEach(function (code) { if (found) return; var cleanedLng = _this.formatLanguageCode(code); if (!_this.options.supportedLngs || _this.isSupportedCode(cleanedLng)) found = cleanedLng; }); if (!found && this.options.supportedLngs) { codes.forEach(function (code) { if (found) return; var lngOnly = _this.getLanguagePartFromCode(code); if (_this.isSupportedCode(lngOnly)) return found = lngOnly; found = _this.options.supportedLngs.find(function (supportedLng) { if (supportedLng.indexOf(lngOnly) === 0) return supportedLng; }); }); } if (!found) found = this.getFallbackCodes(this.options.fallbackLng)[0]; return found; } }, { key: "getFallbackCodes", value: function getFallbackCodes(fallbacks, code) { if (!fallbacks) return []; if (typeof fallbacks === 'function') fallbacks = fallbacks(code); if (typeof fallbacks === 'string') fallbacks = [fallbacks]; if (Object.prototype.toString.apply(fallbacks) === '[object Array]') return fallbacks; if (!code) return fallbacks["default"] || []; var found = fallbacks[code]; if (!found) found = fallbacks[this.getScriptPartFromCode(code)]; if (!found) found = fallbacks[this.formatLanguageCode(code)]; if (!found) found = fallbacks[this.getLanguagePartFromCode(code)]; if (!found) found = fallbacks["default"]; return found || []; } }, { key: "toResolveHierarchy", value: function toResolveHierarchy(code, fallbackCode) { var _this2 = this; var fallbackCodes = this.getFallbackCodes(fallbackCode || this.options.fallbackLng || [], code); var codes = []; var addCode = function addCode(c) { if (!c) return; if (_this2.isSupportedCode(c)) { codes.push(c); } else { _this2.logger.warn("rejecting language code not found in supportedLngs: ".concat(c)); } }; if (typeof code === 'string' && code.indexOf('-') > -1) { if (this.options.load !== 'languageOnly') addCode(this.formatLanguageCode(code)); if (this.options.load !== 'languageOnly' && this.options.load !== 'currentOnly') addCode(this.getScriptPartFromCode(code)); if (this.options.load !== 'currentOnly') addCode(this.getLanguagePartFromCode(code)); } else if (typeof code === 'string') { addCode(this.formatLanguageCode(code)); } fallbackCodes.forEach(function (fc) { if (codes.indexOf(fc) < 0) addCode(_this2.formatLanguageCode(fc)); }); return codes; } }]); return LanguageUtil; }(); var sets = [{ lngs: ['ach', 'ak', 'am', 'arn', 'br', 'fil', 'gun', 'ln', 'mfe', 'mg', 'mi', 'oc', 'pt', 'pt-BR', 'tg', 'tl', 'ti', 'tr', 'uz', 'wa'], nr: [1, 2], fc: 1 }, { lngs: ['af', 'an', 'ast', 'az', 'bg', 'bn', 'ca', 'da', 'de', 'dev', 'el', 'en', 'eo', 'es', 'et', 'eu', 'fi', 'fo', 'fur', 'fy', 'gl', 'gu', 'ha', 'hi', 'hu', 'hy', 'ia', 'it', 'kk', 'kn', 'ku', 'lb', 'mai', 'ml', 'mn', 'mr', 'nah', 'nap', 'nb', 'ne', 'nl', 'nn', 'no', 'nso', 'pa', 'pap', 'pms', 'ps', 'pt-PT', 'rm', 'sco', 'se', 'si', 'so', 'son', 'sq', 'sv', 'sw', 'ta', 'te', 'tk', 'ur', 'yo'], nr: [1, 2], fc: 2 }, { lngs: ['ay', 'bo', 'cgg', 'fa', 'ht', 'id', 'ja', 'jbo', 'ka', 'km', 'ko', 'ky', 'lo', 'ms', 'sah', 'su', 'th', 'tt', 'ug', 'vi', 'wo', 'zh'], nr: [1], fc: 3 }, { lngs: ['be', 'bs', 'cnr', 'dz', 'hr', 'ru', 'sr', 'uk'], nr: [1, 2, 5], fc: 4 }, { lngs: ['ar'], nr: [0, 1, 2, 3, 11, 100], fc: 5 }, { lngs: ['cs', 'sk'], nr: [1, 2, 5], fc: 6 }, { lngs: ['csb', 'pl'], nr: [1, 2, 5], fc: 7 }, { lngs: ['cy'], nr: [1, 2, 3, 8], fc: 8 }, { lngs: ['fr'], nr: [1, 2], fc: 9 }, { lngs: ['ga'], nr: [1, 2, 3, 7, 11], fc: 10 }, { lngs: ['gd'], nr: [1, 2, 3, 20], fc: 11 }, { lngs: ['is'], nr: [1, 2], fc: 12 }, { lngs: ['jv'], nr: [0, 1], fc: 13 }, { lngs: ['kw'], nr: [1, 2, 3, 4], fc: 14 }, { lngs: ['lt'], nr: [1, 2, 10], fc: 15 }, { lngs: ['lv'], nr: [1, 2, 0], fc: 16 }, { lngs: ['mk'], nr: [1, 2], fc: 17 }, { lngs: ['mnk'], nr: [0, 1, 2], fc: 18 }, { lngs: ['mt'], nr: [1, 2, 11, 20], fc: 19 }, { lngs: ['or'], nr: [2, 1], fc: 2 }, { lngs: ['ro'], nr: [1, 2, 20], fc: 20 }, { lngs: ['sl'], nr: [5, 1, 2, 3], fc: 21 }, { lngs: ['he', 'iw'], nr: [1, 2, 20, 21], fc: 22 }]; var _rulesPluralsTypes = { 1: function _(n) { return Number(n > 1); }, 2: function _(n) { return Number(n != 1); }, 3: function _(n) { return 0; }, 4: function _(n) { return Number(n % 10 == 1 && n % 100 != 11 ? 0 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 1 : 2); }, 5: function _(n) { return Number(n == 0 ? 0 : n == 1 ? 1 : n == 2 ? 2 : n % 100 >= 3 && n % 100 <= 10 ? 3 : n % 100 >= 11 ? 4 : 5); }, 6: function _(n) { return Number(n == 1 ? 0 : n >= 2 && n <= 4 ? 1 : 2); }, 7: function _(n) { return Number(n == 1 ? 0 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 1 : 2); }, 8: function _(n) { return Number(n == 1 ? 0 : n == 2 ? 1 : n != 8 && n != 11 ? 2 : 3); }, 9: function _(n) { return Number(n >= 2); }, 10: function _(n) { return Number(n == 1 ? 0 : n == 2 ? 1 : n < 7 ? 2 : n < 11 ? 3 : 4); }, 11: function _(n) { return Number(n == 1 || n == 11 ? 0 : n == 2 || n == 12 ? 1 : n > 2 && n < 20 ? 2 : 3); }, 12: function _(n) { return Number(n % 10 != 1 || n % 100 == 11); }, 13: function _(n) { return Number(n !== 0); }, 14: function _(n) { return Number(n == 1 ? 0 : n == 2 ? 1 : n == 3 ? 2 : 3); }, 15: function _(n) { return Number(n % 10 == 1 && n % 100 != 11 ? 0 : n % 10 >= 2 && (n % 100 < 10 || n % 100 >= 20) ? 1 : 2); }, 16: function _(n) { return Number(n % 10 == 1 && n % 100 != 11 ? 0 : n !== 0 ? 1 : 2); }, 17: function _(n) { return Number(n == 1 || n % 10 == 1 && n % 100 != 11 ? 0 : 1); }, 18: function _(n) { return Number(n == 0 ? 0 : n == 1 ? 1 : 2); }, 19: function _(n) { return Number(n == 1 ? 0 : n == 0 || n % 100 > 1 && n % 100 < 11 ? 1 : n % 100 > 10 && n % 100 < 20 ? 2 : 3); }, 20: function _(n) { return Number(n == 1 ? 0 : n == 0 || n % 100 > 0 && n % 100 < 20 ? 1 : 2); }, 21: function _(n) { return Number(n % 100 == 1 ? 1 : n % 100 == 2 ? 2 : n % 100 == 3 || n % 100 == 4 ? 3 : 0); }, 22: function _(n) { return Number(n == 1 ? 0 : n == 2 ? 1 : (n < 0 || n > 10) && n % 10 == 0 ? 2 : 3); } }; var deprecatedJsonVersions = ['v1', 'v2', 'v3']; var suffixesOrder = { zero: 0, one: 1, two: 2, few: 3, many: 4, other: 5 }; function createRules() { var rules = {}; sets.forEach(function (set) { set.lngs.forEach(function (l) { rules[l] = { numbers: set.nr, plurals: _rulesPluralsTypes[set.fc] }; }); }); return rules; } var PluralResolver = function () { function PluralResolver(languageUtils) { var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; _classCallCheck(this, PluralResolver); this.languageUtils = languageUtils; this.options = options; this.logger = baseLogger.create('pluralResolver'); if ((!this.options.compatibilityJSON || this.options.compatibilityJSON === 'v4') && (typeof Intl === 'undefined' || !Intl.PluralRules)) { this.options.compatibilityJSON = 'v3'; this.logger.error('Your environment seems not to be Intl API compatible, use an Intl.PluralRules polyfill. Will fallback to the compatibilityJSON v3 format handling.'); } this.rules = createRules(); } _createClass(PluralResolver, [{ key: "addRule", value: function addRule(lng, obj) { this.rules[lng] = obj; } }, { key: "getRule", value: function getRule(code) { var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; if (this.shouldUseIntlApi()) { try { return new Intl.PluralRules(code, { type: options.ordinal ? 'ordinal' : 'cardinal' }); } catch (_unused) { return; } } return this.rules[code] || this.rules[this.languageUtils.getLanguagePartFromCode(code)]; } }, { key: "needsPlural", value: function needsPlural(code) { var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; var rule = this.getRule(code, options); if (this.shouldUseIntlApi()) { return rule && rule.resolvedOptions().pluralCategories.length > 1; } return rule && rule.numbers.length > 1; } }, { key: "getPluralFormsOfKey", value: function getPluralFormsOfKey(code, key) { var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; return this.getSuffixes(code, options).map(function (suffix) { return "".concat(key).concat(suffix); }); } }, { key: "getSuffixes", value: function getSuffixes(code) { var _this = this; var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; var rule = this.getRule(code, options); if (!rule) { return []; } if (this.shouldUseIntlApi()) { return rule.resolvedOptions().pluralCategories.sort(function (pluralCategory1, pluralCategory2) { return suffixesOrder[pluralCategory1] - suffixesOrder[pluralCategory2]; }).map(function (pluralCategory) { return "".concat(_this.options.prepend).concat(pluralCategory); }); } return rule.numbers.map(function (number) { return _this.getSuffix(code, number, options); }); } }, { key: "getSuffix", value: function getSuffix(code, count) { var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; var rule = this.getRule(code, options); if (rule) { if (this.shouldUseIntlApi()) { return "".concat(this.options.prepend).concat(rule.select(count)); } return this.getSuffixRetroCompatible(rule, count); } this.logger.warn("no plural rule found for: ".concat(code)); return ''; } }, { key: "getSuffixRetroCompatible", value: function getSuffixRetroCompatible(rule, count) { var _this2 = this; var idx = rule.noAbs ? rule.plurals(count) : rule.plurals(Math.abs(count)); var suffix = rule.numbers[idx]; if (this.options.simplifyPluralSuffix && rule.numbers.length === 2 && rule.numbers[0] === 1) { if (suffix === 2) { suffix = 'plural'; } else if (suffix === 1) { suffix = ''; } } var returnSuffix = function returnSuffix() { return _this2.options.prepend && suffix.toString() ? _this2.options.prepend + suffix.toString() : suffix.toString(); }; if (this.options.compatibilityJSON === 'v1') { if (suffix === 1) return ''; if (typeof suffix === 'number') return "_plural_".concat(suffix.toString()); return returnSuffix(); } else if (this.options.compatibilityJSON === 'v2') { return returnSuffix(); } else if (this.options.simplifyPluralSuffix && rule.numbers.length === 2 && rule.numbers[0] === 1) { return returnSuffix(); } return this.options.prepend && idx.toString() ? this.options.prepend + idx.toString() : idx.toString(); } }, { key: "shouldUseIntlApi", value: function shouldUseIntlApi() { return !deprecatedJsonVersions.includes(this.options.compatibilityJSON); } }]); return PluralResolver; }(); function ownKeys$3(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; } function _objectSpread$3(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$3(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$3(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } var Interpolator = function () { function Interpolator() { var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; _classCallCheck(this, Interpolator); this.logger = baseLogger.create('interpolator'); this.options = options; this.format = options.interpolation && options.interpolation.format || function (value) { return value; }; this.init(options); } _createClass(Interpolator, [{ key: "init", value: function init() { var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; if (!options.interpolation) options.interpolation = { escapeValue: true }; var iOpts = options.interpolation; this.escape = iOpts.escape !== undefined ? iOpts.escape : escape$1; this.escapeValue = iOpts.escapeValue !== undefined ? iOpts.escapeValue : true; this.useRawValueToEscape = iOpts.useRawValueToEscape !== undefined ? iOpts.useRawValueToEscape : false; this.prefix = iOpts.prefix ? regexEscape(iOpts.prefix) : iOpts.prefixEscaped || '{{'; this.suffix = iOpts.suffix ? regexEscape(iOpts.suffix) : iOpts.suffixEscaped || '}}'; this.formatSeparator = iOpts.formatSeparator ? iOpts.formatSeparator : iOpts.formatSeparator || ','; this.unescapePrefix = iOpts.unescapeSuffix ? '' : iOpts.unescapePrefix || '-'; this.unescapeSuffix = this.unescapePrefix ? '' : iOpts.unescapeSuffix || ''; this.nestingPrefix = iOpts.nestingPrefix ? regexEscape(iOpts.nestingPrefix) : iOpts.nestingPrefixEscaped || regexEscape('$t('); this.nestingSuffix = iOpts.nestingSuffix ? regexEscape(iOpts.nestingSuffix) : iOpts.nestingSuffixEscaped || regexEscape(')'); this.nestingOptionsSeparator = iOpts.nestingOptionsSeparator ? iOpts.nestingOptionsSeparator : iOpts.nestingOptionsSeparator || ','; this.maxReplaces = iOpts.maxReplaces ? iOpts.maxReplaces : 1000; this.alwaysFormat = iOpts.alwaysFormat !== undefined ? iOpts.alwaysFormat : false; this.resetRegExp(); } }, { key: "reset", value: function reset() { if (this.options) this.init(this.options); } }, { key: "resetRegExp", value: function resetRegExp() { var regexpStr = "".concat(this.prefix, "(.+?)").concat(this.suffix); this.regexp = new RegExp(regexpStr, 'g'); var regexpUnescapeStr = "".concat(this.prefix).concat(this.unescapePrefix, "(.+?)").concat(this.unescapeSuffix).concat(this.suffix); this.regexpUnescape = new RegExp(regexpUnescapeStr, 'g'); var nestingRegexpStr = "".concat(this.nestingPrefix, "(.+?)").concat(this.nestingSuffix); this.nestingRegexp = new RegExp(nestingRegexpStr, 'g'); } }, { key: "interpolate", value: function interpolate(str, data, lng, options) { var _this = this; var match; var value; var replaces; var defaultData = this.options && this.options.interpolation && this.options.interpolation.defaultVariables || {}; function regexSafe(val) { return val.replace(/\$/g, '$$$$'); } var handleFormat = function handleFormat(key) { if (key.indexOf(_this.formatSeparator) < 0) { var path = getPathWithDefaults(data, defaultData, key); return _this.alwaysFormat ? _this.format(path, undefined, lng, _objectSpread$3(_objectSpread$3(_objectSpread$3({}, options), data), {}, { interpolationkey: key })) : path; } var p = key.split(_this.formatSeparator); var k = p.shift().trim(); var f = p.join(_this.formatSeparator).trim(); return _this.format(getPathWithDefaults(data, defaultData, k), f, lng, _objectSpread$3(_objectSpread$3(_objectSpread$3({}, options), data), {}, { interpolationkey: k })); }; this.resetRegExp(); var missingInterpolationHandler = options && options.missingInterpolationHandler || this.options.missingInterpolationHandler; var skipOnVariables = options && options.interpolation && options.interpolation.skipOnVariables !== undefined ? options.interpolation.skipOnVariables : this.options.interpolation.skipOnVariables; var todos = [{ regex: this.regexpUnescape, safeValue: function safeValue(val) { return regexSafe(val); } }, { regex: this.regexp, safeValue: function safeValue(val) { return _this.escapeValue ? regexSafe(_this.escape(val)) : regexSafe(val); } }]; todos.forEach(function (todo) { replaces = 0; while (match = todo.regex.exec(str)) { var matchedVar = match[1].trim(); value = handleFormat(matchedVar); if (value === undefined) { if (typeof missingInterpolationHandler === 'function') { var temp = missingInterpolationHandler(str, match, options); value = typeof temp === 'string' ? temp : ''; } else if (options && options.hasOwnProperty(matchedVar)) { value = ''; } else if (skipOnVariables) { value = match[0]; continue; } else { _this.logger.warn("missed to pass in variable ".concat(matchedVar, " for interpolating ").concat(str)); value = ''; } } else if (typeof value !== 'string' && !_this.useRawValueToEscape) { value = makeString(value); } var safeValue = todo.safeValue(value); str = str.replace(match[0], safeValue); if (skipOnVariables) { todo.regex.lastIndex += value.length; todo.regex.lastIndex -= match[0].length; } else { todo.regex.lastIndex = 0; } replaces++; if (replaces >= _this.maxReplaces) { break; } } }); return str; } }, { key: "nest", value: function nest(str, fc) { var _this2 = this; var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; var match; var value; var clonedOptions = _objectSpread$3({}, options); clonedOptions.applyPostProcessor = false; delete clonedOptions.defaultValue; function handleHasOptions(key, inheritedOptions) { var sep = this.nestingOptionsSeparator; if (key.indexOf(sep) < 0) return key; var c = key.split(new RegExp("".concat(sep, "[ ]*{"))); var optionsString = "{".concat(c[1]); key = c[0]; optionsString = this.interpolate(optionsString, clonedOptions); var matchedSingleQuotes = optionsString.match(/'/g); var matchedDoubleQuotes = optionsString.match(/"/g); if (matchedSingleQuotes && matchedSingleQuotes.length % 2 === 0 && !matchedDoubleQuotes || matchedDoubleQuotes.length % 2 !== 0) { optionsString = optionsString.replace(/'/g, '"'); } try { clonedOptions = JSON.parse(optionsString); if (inheritedOptions) clonedOptions = _objectSpread$3(_objectSpread$3({}, inheritedOptions), clonedOptions); } catch (e) { this.logger.warn("failed parsing options string in nesting for key ".concat(key), e); return "".concat(key).concat(sep).concat(optionsString); } delete clonedOptions.defaultValue; return key; } while (match = this.nestingRegexp.exec(str)) { var formatters = []; var doReduce = false; if (match[0].indexOf(this.formatSeparator) !== -1 && !/{.*}/.test(match[1])) { var r = match[1].split(this.formatSeparator).map(function (elem) { return elem.trim(); }); match[1] = r.shift(); formatters = r; doReduce = true; } value = fc(handleHasOptions.call(this, match[1].trim(), clonedOptions), clonedOptions); if (value && match[0] === str && typeof value !== 'string') return value; if (typeof value !== 'string') value = makeString(value); if (!value) { this.logger.warn("missed to resolve ".concat(match[1], " for nesting ").concat(str)); value = ''; } if (doReduce) { value = formatters.reduce(function (v, f) { return _this2.format(v, f, options.lng, _objectSpread$3(_objectSpread$3({}, options), {}, { interpolationkey: match[1].trim() })); }, value.trim()); } str = str.replace(match[0], value); this.regexp.lastIndex = 0; } return str; } }]); return Interpolator; }(); function ownKeys$4(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; } function _objectSpread$4(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$4(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$4(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } function parseFormatStr(formatStr) { var formatName = formatStr.toLowerCase().trim(); var formatOptions = {}; if (formatStr.indexOf('(') > -1) { var p = formatStr.split('('); formatName = p[0].toLowerCase().trim(); var optStr = p[1].substring(0, p[1].length - 1); if (formatName === 'currency' && optStr.indexOf(':') < 0) { if (!formatOptions.currency) formatOptions.currency = optStr.trim(); } else if (formatName === 'relativetime' && optStr.indexOf(':') < 0) { if (!formatOptions.range) formatOptions.range = optStr.trim(); } else { var opts = optStr.split(';'); opts.forEach(function (opt) { if (!opt) return; var _opt$split = opt.split(':'), _opt$split2 = _toArray(_opt$split), key = _opt$split2[0], rest = _opt$split2.slice(1); var val = rest.join(':').trim().replace(/^'+|'+$/g, ''); if (!formatOptions[key.trim()]) formatOptions[key.trim()] = val; if (val === 'false') formatOptions[key.trim()] = false; if (val === 'true') formatOptions[key.trim()] = true; if (!isNaN(val)) formatOptions[key.trim()] = parseInt(val, 10); }); } } return { formatName: formatName, formatOptions: formatOptions }; } var Formatter = function () { function Formatter() { var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; _classCallCheck(this, Formatter); this.logger = baseLogger.create('formatter'); this.options = options; this.formats = { number: function number(val, lng, options) { return new Intl.NumberFormat(lng, options).format(val); }, currency: function currency(val, lng, options) { return new Intl.NumberFormat(lng, _objectSpread$4(_objectSpread$4({}, options), {}, { style: 'currency' })).format(val); }, datetime: function datetime(val, lng, options) { return new Intl.DateTimeFormat(lng, _objectSpread$4({}, options)).format(val); }, relativetime: function relativetime(val, lng, options) { return new Intl.RelativeTimeFormat(lng, _objectSpread$4({}, options)).format(val, options.range || 'day'); }, list: function list(val, lng, options) { return new Intl.ListFormat(lng, _objectSpread$4({}, options)).format(val); } }; this.init(options); } _createClass(Formatter, [{ key: "init", value: function init(services) { var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : { interpolation: {} }; var iOpts = options.interpolation; this.formatSeparator = iOpts.formatSeparator ? iOpts.formatSeparator : iOpts.formatSeparator || ','; } }, { key: "add", value: function add(name, fc) { this.formats[name.toLowerCase().trim()] = fc; } }, { key: "format", value: function format(value, _format, lng, options) { var _this = this; var formats = _format.split(this.formatSeparator); var result = formats.reduce(function (mem, f) { var _parseFormatStr = parseFormatStr(f), formatName = _parseFormatStr.formatName, formatOptions = _parseFormatStr.formatOptions; if (_this.formats[formatName]) { var formatted = mem; try { var valOptions = options && options.formatParams && options.formatParams[options.interpolationkey] || {}; var l = valOptions.locale || valOptions.lng || options.locale || options.lng || lng; formatted = _this.formats[formatName](mem, l, _objectSpread$4(_objectSpread$4(_objectSpread$4({}, formatOptions), options), valOptions)); } catch (error) { _this.logger.warn(error); } return formatted; } else { _this.logger.warn("there was no format function for ".concat(formatName)); } return mem; }, value); return result; } }]); return Formatter; }(); function ownKeys$5(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; } function _objectSpread$5(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$5(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$5(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } function _createSuper$2(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$2(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } function _isNativeReflectConstruct$2() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } function removePending(q, name) { if (q.pending[name] !== undefined) { delete q.pending[name]; q.pendingCount--; } } var Connector = function (_EventEmitter) { _inherits(Connector, _EventEmitter); var _super = _createSuper$2(Connector); function Connector(backend, store, services) { var _this; var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; _classCallCheck(this, Connector); _this = _super.call(this); if (isIE10) { EventEmitter.call(_assertThisInitialized(_this)); } _this.backend = backend; _this.store = store; _this.services = services; _this.languageUtils = services.languageUtils; _this.options = options; _this.logger = baseLogger.create('backendConnector'); _this.waitingReads = []; _this.maxParallelReads = options.maxParallelReads || 10; _this.readingCalls = 0; _this.maxRetries = options.maxRetries >= 0 ? options.maxRetries : 5; _this.retryTimeout = options.retryTimeout >= 1 ? options.retryTimeout : 350; _this.state = {}; _this.queue = []; if (_this.backend && _this.backend.init) { _this.backend.init(services, options.backend, options); } return _this; } _createClass(Connector, [{ key: "queueLoad", value: function queueLoad(languages, namespaces, options, callback) { var _this2 = this; var toLoad = {}; var pending = {}; var toLoadLanguages = {}; var toLoadNamespaces = {}; languages.forEach(function (lng) { var hasAllNamespaces = true; namespaces.forEach(function (ns) { var name = "".concat(lng, "|").concat(ns); if (!options.reload && _this2.store.hasResourceBundle(lng, ns)) { _this2.state[name] = 2; } else if (_this2.state[name] < 0) ; else if (_this2.state[name] === 1) { if (pending[name] === undefined) pending[name] = true; } else { _this2.state[name] = 1; hasAllNamespaces = false; if (pending[name] === undefined) pending[name] = true; if (toLoad[name] === undefined) toLoad[name] = true; if (toLoadNamespaces[ns] === undefined) toLoadNamespaces[ns] = true; } }); if (!hasAllNamespaces) toLoadLanguages[lng] = true; }); if (Object.keys(toLoad).length || Object.keys(pending).length) { this.queue.push({ pending: pending, pendingCount: Object.keys(pending).length, loaded: {}, errors: [], callback: callback }); } return { toLoad: Object.keys(toLoad), pending: Object.keys(pending), toLoadLanguages: Object.keys(toLoadLanguages), toLoadNamespaces: Object.keys(toLoadNamespaces) }; } }, { key: "loaded", value: function loaded(name, err, data) { var s = name.split('|'); var lng = s[0]; var ns = s[1]; if (err) this.emit('failedLoading', lng, ns, err); if (data) { this.store.addResourceBundle(lng, ns, data); } this.state[name] = err ? -1 : 2; var loaded = {}; this.queue.forEach(function (q) { pushPath(q.loaded, [lng], ns); removePending(q, name); if (err) q.errors.push(err); if (q.pendingCount === 0 && !q.done) { Object.keys(q.loaded).forEach(function (l) { if (!loaded[l]) loaded[l] = {}; var loadedKeys = q.loaded[l]; if (loadedKeys.length) { loadedKeys.forEach(function (ns) { if (loaded[l][ns] === undefined) loaded[l][ns] = true; }); } }); q.done = true; if (q.errors.length) { q.callback(q.errors); } else { q.callback(); } } }); this.emit('loaded', loaded); this.queue = this.queue.filter(function (q) { return !q.done; }); } }, { key: "read", value: function read(lng, ns, fcName) { var _this3 = this; var tried = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0; var wait = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : this.retryTimeout; var callback = arguments.length > 5 ? arguments[5] : undefined; if (!lng.length) return callback(null, {}); if (this.readingCalls >= this.maxParallelReads) { this.waitingReads.push({ lng: lng, ns: ns, fcName: fcName, tried: tried, wait: wait, callback: callback }); return; } this.readingCalls++; return this.backend[fcName](lng, ns, function (err, data) { _this3.readingCalls--; if (_this3.waitingReads.length > 0) { var next = _this3.waitingReads.shift(); _this3.read(next.lng, next.ns, next.fcName, next.tried, next.wait, next.callback); } if (err && data && tried < _this3.maxRetries) { setTimeout(function () { _this3.read.call(_this3, lng, ns, fcName, tried + 1, wait * 2, callback); }, wait); return; } callback(err, data); }); } }, { key: "prepareLoading", value: function prepareLoading(languages, namespaces) { var _this4 = this; var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; var callback = arguments.length > 3 ? arguments[3] : undefined; if (!this.backend) { this.logger.warn('No backend was added via i18next.use. Will not load resources.'); return callback && callback(); } if (typeof languages === 'string') languages = this.languageUtils.toResolveHierarchy(languages); if (typeof namespaces === 'string') namespaces = [namespaces]; var toLoad = this.queueLoad(languages, namespaces, options, callback); if (!toLoad.toLoad.length) { if (!toLoad.pending.length) callback(); return null; } toLoad.toLoad.forEach(function (name) { _this4.loadOne(name); }); } }, { key: "load", value: function load(languages, namespaces, callback) { this.prepareLoading(languages, namespaces, {}, callback); } }, { key: "reload", value: function reload(languages, namespaces, callback) { this.prepareLoading(languages, namespaces, { reload: true }, callback); } }, { key: "loadOne", value: function loadOne(name) { var _this5 = this; var prefix = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; var s = name.split('|'); var lng = s[0]; var ns = s[1]; this.read(lng, ns, 'read', undefined, undefined, function (err, data) { if (err) _this5.logger.warn("".concat(prefix, "loading namespace ").concat(ns, " for language ").concat(lng, " failed"), err); if (!err && data) _this5.logger.log("".concat(prefix, "loaded namespace ").concat(ns, " for language ").concat(lng), data); _this5.loaded(name, err, data); }); } }, { key: "saveMissing", value: function saveMissing(languages, namespace, key, fallbackValue, isUpdate) { var options = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {}; if (this.services.utils && this.services.utils.hasLoadedNamespace && !this.services.utils.hasLoadedNamespace(namespace)) { this.logger.warn("did not save key \"".concat(key, "\" as the namespace \"").concat(namespace, "\" was not yet loaded"), 'This means something IS WRONG in your setup. You access the t function before i18next.init / i18next.loadNamespace / i18next.changeLanguage was done. Wait for the callback or Promise to resolve before accessing it!!!'); return; } if (key === undefined || key === null || key === '') return; if (this.backend && this.backend.create) { this.backend.create(languages, namespace, key, fallbackValue, null, _objectSpread$5(_objectSpread$5({}, options), {}, { isUpdate: isUpdate })); } if (!languages || !languages[0]) return; this.store.addResource(languages[0], namespace, key, fallbackValue); } }]); return Connector; }(EventEmitter); function get$1() { return { debug: false, initImmediate: true, ns: ['translation'], defaultNS: ['translation'], fallbackLng: ['dev'], fallbackNS: false, supportedLngs: false, nonExplicitSupportedLngs: false, load: 'all', preload: false, simplifyPluralSuffix: true, keySeparator: '.', nsSeparator: ':', pluralSeparator: '_', contextSeparator: '_', partialBundledLanguages: false, saveMissing: false, updateMissing: false, saveMissingTo: 'fallback', saveMissingPlurals: true, missingKeyHandler: false, missingInterpolationHandler: false, postProcess: false, postProcessPassResolved: false, returnNull: true, returnEmptyString: true, returnObjects: false, joinArrays: false, returnedObjectHandler: false, parseMissingKeyHandler: false, appendNamespaceToMissingKey: false, appendNamespaceToCIMode: false, overloadTranslationOptionHandler: function handle(args) { var ret = {}; if (_typeof(args[1]) === 'object') ret = args[1]; if (typeof args[1] === 'string') ret.defaultValue = args[1]; if (typeof args[2] === 'string') ret.tDescription = args[2]; if (_typeof(args[2]) === 'object' || _typeof(args[3]) === 'object') { var options = args[3] || args[2]; Object.keys(options).forEach(function (key) { ret[key] = options[key]; }); } return ret; }, interpolation: { escapeValue: true, format: function format(value, _format, lng, options) { return value; }, prefix: '{{', suffix: '}}', formatSeparator: ',', unescapePrefix: '-', nestingPrefix: '$t(', nestingSuffix: ')', nestingOptionsSeparator: ',', maxReplaces: 1000, skipOnVariables: true } }; } function transformOptions(options) { if (typeof options.ns === 'string') options.ns = [options.ns]; if (typeof options.fallbackLng === 'string') options.fallbackLng = [options.fallbackLng]; if (typeof options.fallbackNS === 'string') options.fallbackNS = [options.fallbackNS]; if (options.supportedLngs && options.supportedLngs.indexOf('cimode') < 0) { options.supportedLngs = options.supportedLngs.concat(['cimode']); } return options; } function ownKeys$6(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; } function _objectSpread$6(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$6(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$6(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } function _createSuper$3(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$3(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } function _isNativeReflectConstruct$3() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } function noop$3() {} function bindMemberFunctions(inst) { var mems = Object.getOwnPropertyNames(Object.getPrototypeOf(inst)); mems.forEach(function (mem) { if (typeof inst[mem] === 'function') { inst[mem] = inst[mem].bind(inst); } }); } var I18n = function (_EventEmitter) { _inherits(I18n, _EventEmitter); var _super = _createSuper$3(I18n); function I18n() { var _this; var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; var callback = arguments.length > 1 ? arguments[1] : undefined; _classCallCheck(this, I18n); _this = _super.call(this); if (isIE10) { EventEmitter.call(_assertThisInitialized(_this)); } _this.options = transformOptions(options); _this.services = {}; _this.logger = baseLogger; _this.modules = { external: [] }; bindMemberFunctions(_assertThisInitialized(_this)); if (callback && !_this.isInitialized && !options.isClone) { if (!_this.options.initImmediate) { _this.init(options, callback); return _possibleConstructorReturn(_this, _assertThisInitialized(_this)); } setTimeout(function () { _this.init(options, callback); }, 0); } return _this; } _createClass(I18n, [{ key: "init", value: function init() { var _this2 = this; var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; var callback = arguments.length > 1 ? arguments[1] : undefined; if (typeof options === 'function') { callback = options; options = {}; } if (!options.defaultNS && options.defaultNS !== false && options.ns) { if (typeof options.ns === 'string') { options.defaultNS = options.ns; } else if (options.ns.indexOf('translation') < 0) { options.defaultNS = options.ns[0]; } } var defOpts = get$1(); this.options = _objectSpread$6(_objectSpread$6(_objectSpread$6({}, defOpts), this.options), transformOptions(options)); if (this.options.compatibilityAPI !== 'v1') { this.options.interpolation = _objectSpread$6(_objectSpread$6({}, defOpts.interpolation), this.options.interpolation); } if (options.keySeparator !== undefined) { this.options.userDefinedKeySeparator = options.keySeparator; } if (options.nsSeparator !== undefined) { this.options.userDefinedNsSeparator = options.nsSeparator; } function createClassOnDemand(ClassOrObject) { if (!ClassOrObject) return null; if (typeof ClassOrObject === 'function') return new ClassOrObject(); return ClassOrObject; } if (!this.options.isClone) { if (this.modules.logger) { baseLogger.init(createClassOnDemand(this.modules.logger), this.options); } else { baseLogger.init(null, this.options); } var formatter; if (this.modules.formatter) { formatter = this.modules.formatter; } else if (typeof Intl !== 'undefined') { formatter = Formatter; } var lu = new LanguageUtil(this.options); this.store = new ResourceStore(this.options.resources, this.options); var s = this.services; s.logger = baseLogger; s.resourceStore = this.store; s.languageUtils = lu; s.pluralResolver = new PluralResolver(lu, { prepend: this.options.pluralSeparator, compatibilityJSON: this.options.compatibilityJSON, simplifyPluralSuffix: this.options.simplifyPluralSuffix }); if (formatter && (!this.options.interpolation.format || this.options.interpolation.format === defOpts.interpolation.format)) { s.formatter = createClassOnDemand(formatter); s.formatter.init(s, this.options); this.options.interpolation.format = s.formatter.format.bind(s.formatter); } s.interpolator = new Interpolator(this.options); s.utils = { hasLoadedNamespace: this.hasLoadedNamespace.bind(this) }; s.backendConnector = new Connector(createClassOnDemand(this.modules.backend), s.resourceStore, s, this.options); s.backendConnector.on('*', function (event) { for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { args[_key - 1] = arguments[_key]; } _this2.emit.apply(_this2, [event].concat(args)); }); if (this.modules.languageDetector) { s.languageDetector = createClassOnDemand(this.modules.languageDetector); s.languageDetector.init(s, this.options.detection, this.options); } if (this.modules.i18nFormat) { s.i18nFormat = createClassOnDemand(this.modules.i18nFormat); if (s.i18nFormat.init) s.i18nFormat.init(this); } this.translator = new Translator(this.services, this.options); this.translator.on('*', function (event) { for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { args[_key2 - 1] = arguments[_key2]; } _this2.emit.apply(_this2, [event].concat(args)); }); this.modules.external.forEach(function (m) { if (m.init) m.init(_this2); }); } this.format = this.options.interpolation.format; if (!callback) callback = noop$3; if (this.options.fallbackLng && !this.services.languageDetector && !this.options.lng) { var codes = this.services.languageUtils.getFallbackCodes(this.options.fallbackLng); if (codes.length > 0 && codes[0] !== 'dev') this.options.lng = codes[0]; } if (!this.services.languageDetector && !this.options.lng) { this.logger.warn('init: no languageDetector is used and no lng is defined'); } var storeApi = ['getResource', 'hasResourceBundle', 'getResourceBundle', 'getDataByLanguage']; storeApi.forEach(function (fcName) { _this2[fcName] = function () { var _this2$store; return (_this2$store = _this2.store)[fcName].apply(_this2$store, arguments); }; }); var storeApiChained = ['addResource', 'addResources', 'addResourceBundle', 'removeResourceBundle']; storeApiChained.forEach(function (fcName) { _this2[fcName] = function () { var _this2$store2; (_this2$store2 = _this2.store)[fcName].apply(_this2$store2, arguments); return _this2; }; }); var deferred = defer(); var load = function load() { var finish = function finish(err, t) { if (_this2.isInitialized && !_this2.initializedStoreOnce) _this2.logger.warn('init: i18next is already initialized. You should call init just once!'); _this2.isInitialized = true; if (!_this2.options.isClone) _this2.logger.log('initialized', _this2.options); _this2.emit('initialized', _this2.options); deferred.resolve(t); callback(err, t); }; if (_this2.languages && _this2.options.compatibilityAPI !== 'v1' && !_this2.isInitialized) return finish(null, _this2.t.bind(_this2)); _this2.changeLanguage(_this2.options.lng, finish); }; if (this.options.resources || !this.options.initImmediate) { load(); } else { setTimeout(load, 0); } return deferred; } }, { key: "loadResources", value: function loadResources(language) { var _this3 = this; var callback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : noop$3; var usedCallback = callback; var usedLng = typeof language === 'string' ? language : this.language; if (typeof language === 'function') usedCallback = language; if (!this.options.resources || this.options.partialBundledLanguages) { if (usedLng && usedLng.toLowerCase() === 'cimode') return usedCallback(); var toLoad = []; var append = function append(lng) { if (!lng) return; var lngs = _this3.services.languageUtils.toResolveHierarchy(lng); lngs.forEach(function (l) { if (toLoad.indexOf(l) < 0) toLoad.push(l); }); }; if (!usedLng) { var fallbacks = this.services.languageUtils.getFallbackCodes(this.options.fallbackLng); fallbacks.forEach(function (l) { return append(l); }); } else { append(usedLng); } if (this.options.preload) { this.options.preload.forEach(function (l) { return append(l); }); } this.services.backendConnector.load(toLoad, this.options.ns, function (e) { if (!e && !_this3.resolvedLanguage && _this3.language) _this3.setResolvedLanguage(_this3.language); usedCallback(e); }); } else { usedCallback(null); } } }, { key: "reloadResources", value: function reloadResources(lngs, ns, callback) { var deferred = defer(); if (!lngs) lngs = this.languages; if (!ns) ns = this.options.ns; if (!callback) callback = noop$3; this.services.backendConnector.reload(lngs, ns, function (err) { deferred.resolve(); callback(err); }); return deferred; } }, { key: "use", value: function use(module) { if (!module) throw new Error('You are passing an undefined module! Please check the object you are passing to i18next.use()'); if (!module.type) throw new Error('You are passing a wrong module! Please check the object you are passing to i18next.use()'); if (module.type === 'backend') { this.modules.backend = module; } if (module.type === 'logger' || module.log && module.warn && module.error) { this.modules.logger = module; } if (module.type === 'languageDetector') { this.modules.languageDetector = module; } if (module.type === 'i18nFormat') { this.modules.i18nFormat = module; } if (module.type === 'postProcessor') { postProcessor.addPostProcessor(module); } if (module.type === 'formatter') { this.modules.formatter = module; } if (module.type === '3rdParty') { this.modules.external.push(module); } return this; } }, { key: "setResolvedLanguage", value: function setResolvedLanguage(l) { if (!l || !this.languages) return; if (['cimode', 'dev'].indexOf(l) > -1) return; for (var li = 0; li < this.languages.length; li++) { var lngInLngs = this.languages[li]; if (['cimode', 'dev'].indexOf(lngInLngs) > -1) continue; if (this.store.hasLanguageSomeTranslations(lngInLngs)) { this.resolvedLanguage = lngInLngs; break; } } } }, { key: "changeLanguage", value: function changeLanguage(lng, callback) { var _this4 = this; this.isLanguageChangingTo = lng; var deferred = defer(); this.emit('languageChanging', lng); var setLngProps = function setLngProps(l) { _this4.language = l; _this4.languages = _this4.services.languageUtils.toResolveHierarchy(l); _this4.resolvedLanguage = undefined; _this4.setResolvedLanguage(l); }; var done = function done(err, l) { if (l) { setLngProps(l); _this4.translator.changeLanguage(l); _this4.isLanguageChangingTo = undefined; _this4.emit('languageChanged', l); _this4.logger.log('languageChanged', l); } else { _this4.isLanguageChangingTo = undefined; } deferred.resolve(function () { return _this4.t.apply(_this4, arguments); }); if (callback) callback(err, function () { return _this4.t.apply(_this4, arguments); }); }; var setLng = function setLng(lngs) { if (!lng && !lngs && _this4.services.languageDetector) lngs = []; var l = typeof lngs === 'string' ? lngs : _this4.services.languageUtils.getBestMatchFromCodes(lngs); if (l) { if (!_this4.language) { setLngProps(l); } if (!_this4.translator.language) _this4.translator.changeLanguage(l); if (_this4.services.languageDetector) _this4.services.languageDetector.cacheUserLanguage(l); } _this4.loadResources(l, function (err) { done(err, l); }); }; if (!lng && this.services.languageDetector && !this.services.languageDetector.async) { setLng(this.services.languageDetector.detect()); } else if (!lng && this.services.languageDetector && this.services.languageDetector.async) { this.services.languageDetector.detect(setLng); } else { setLng(lng); } return deferred; } }, { key: "getFixedT", value: function getFixedT(lng, ns, keyPrefix) { var _this5 = this; var fixedT = function fixedT(key, opts) { var options; if (_typeof(opts) !== 'object') { for (var _len3 = arguments.length, rest = new Array(_len3 > 2 ? _len3 - 2 : 0), _key3 = 2; _key3 < _len3; _key3++) { rest[_key3 - 2] = arguments[_key3]; } options = _this5.options.overloadTranslationOptionHandler([key, opts].concat(rest)); } else { options = _objectSpread$6({}, opts); } options.lng = options.lng || fixedT.lng; options.lngs = options.lngs || fixedT.lngs; options.ns = options.ns || fixedT.ns; options.keyPrefix = options.keyPrefix || keyPrefix || fixedT.keyPrefix; var keySeparator = _this5.options.keySeparator || '.'; var resultKey = options.keyPrefix ? "".concat(options.keyPrefix).concat(keySeparator).concat(key) : key; return _this5.t(resultKey, options); }; if (typeof lng === 'string') { fixedT.lng = lng; } else { fixedT.lngs = lng; } fixedT.ns = ns; fixedT.keyPrefix = keyPrefix; return fixedT; } }, { key: "t", value: function t() { var _this$translator; return this.translator && (_this$translator = this.translator).translate.apply(_this$translator, arguments); } }, { key: "exists", value: function exists() { var _this$translator2; return this.translator && (_this$translator2 = this.translator).exists.apply(_this$translator2, arguments); } }, { key: "setDefaultNamespace", value: function setDefaultNamespace(ns) { this.options.defaultNS = ns; } }, { key: "hasLoadedNamespace", value: function hasLoadedNamespace(ns) { var _this6 = this; var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; if (!this.isInitialized) { this.logger.warn('hasLoadedNamespace: i18next was not initialized', this.languages); return false; } if (!this.languages || !this.languages.length) { this.logger.warn('hasLoadedNamespace: i18n.languages were undefined or empty', this.languages); return false; } var lng = this.resolvedLanguage || this.languages[0]; var fallbackLng = this.options ? this.options.fallbackLng : false; var lastLng = this.languages[this.languages.length - 1]; if (lng.toLowerCase() === 'cimode') return true; var loadNotPending = function loadNotPending(l, n) { var loadState = _this6.services.backendConnector.state["".concat(l, "|").concat(n)]; return loadState === -1 || loadState === 2; }; if (options.precheck) { var preResult = options.precheck(this, loadNotPending); if (preResult !== undefined) return preResult; } if (this.hasResourceBundle(lng, ns)) return true; if (!this.services.backendConnector.backend || this.options.resources && !this.options.partialBundledLanguages) return true; if (loadNotPending(lng, ns) && (!fallbackLng || loadNotPending(lastLng, ns))) return true; return false; } }, { key: "loadNamespaces", value: function loadNamespaces(ns, callback) { var _this7 = this; var deferred = defer(); if (!this.options.ns) { callback && callback(); return Promise.resolve(); } if (typeof ns === 'string') ns = [ns]; ns.forEach(function (n) { if (_this7.options.ns.indexOf(n) < 0) _this7.options.ns.push(n); }); this.loadResources(function (err) { deferred.resolve(); if (callback) callback(err); }); return deferred; } }, { key: "loadLanguages", value: function loadLanguages(lngs, callback) { var deferred = defer(); if (typeof lngs === 'string') lngs = [lngs]; var preloaded = this.options.preload || []; var newLngs = lngs.filter(function (lng) { return preloaded.indexOf(lng) < 0; }); if (!newLngs.length) { if (callback) callback(); return Promise.resolve(); } this.options.preload = preloaded.concat(newLngs); this.loadResources(function (err) { deferred.resolve(); if (callback) callback(err); }); return deferred; } }, { key: "dir", value: function dir(lng) { if (!lng) lng = this.resolvedLanguage || (this.languages && this.languages.length > 0 ? this.languages[0] : this.language); if (!lng) return 'rtl'; var rtlLngs = ['ar', 'shu', 'sqr', 'ssh', 'xaa', 'yhd', 'yud', 'aao', 'abh', 'abv', 'acm', 'acq', 'acw', 'acx', 'acy', 'adf', 'ads', 'aeb', 'aec', 'afb', 'ajp', 'apc', 'apd', 'arb', 'arq', 'ars', 'ary', 'arz', 'auz', 'avl', 'ayh', 'ayl', 'ayn', 'ayp', 'bbz', 'pga', 'he', 'iw', 'ps', 'pbt', 'pbu', 'pst', 'prp', 'prd', 'ug', 'ur', 'ydd', 'yds', 'yih', 'ji', 'yi', 'hbo', 'men', 'xmn', 'fa', 'jpr', 'peo', 'pes', 'prs', 'dv', 'sam', 'ckb']; return rtlLngs.indexOf(this.services.languageUtils.getLanguagePartFromCode(lng)) > -1 || lng.toLowerCase().indexOf('-arab') > 1 ? 'rtl' : 'ltr'; } }, { key: "cloneInstance", value: function cloneInstance() { var _this8 = this; var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; var callback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : noop$3; var mergedOptions = _objectSpread$6(_objectSpread$6(_objectSpread$6({}, this.options), options), { isClone: true }); var clone = new I18n(mergedOptions); if (options.debug !== undefined || options.prefix !== undefined) { clone.logger = clone.logger.clone(options); } var membersToCopy = ['store', 'services', 'language']; membersToCopy.forEach(function (m) { clone[m] = _this8[m]; }); clone.services = _objectSpread$6({}, this.services); clone.services.utils = { hasLoadedNamespace: clone.hasLoadedNamespace.bind(clone) }; clone.translator = new Translator(clone.services, clone.options); clone.translator.on('*', function (event) { for (var _len4 = arguments.length, args = new Array(_len4 > 1 ? _len4 - 1 : 0), _key4 = 1; _key4 < _len4; _key4++) { args[_key4 - 1] = arguments[_key4]; } clone.emit.apply(clone, [event].concat(args)); }); clone.init(mergedOptions, callback); clone.translator.options = clone.options; clone.translator.backendConnector.services.utils = { hasLoadedNamespace: clone.hasLoadedNamespace.bind(clone) }; return clone; } }, { key: "toJSON", value: function toJSON() { return { options: this.options, store: this.store, language: this.language, languages: this.languages, resolvedLanguage: this.resolvedLanguage }; } }]); return I18n; }(EventEmitter); _defineProperty(I18n, "createInstance", function () { var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; var callback = arguments.length > 1 ? arguments[1] : undefined; return new I18n(options, callback); }); var instance = I18n.createInstance(); instance.createInstance = I18n.createInstance; instance.createInstance; instance.init; instance.loadResources; instance.reloadResources; instance.use; instance.changeLanguage; instance.getFixedT; instance.t; instance.exists; instance.setDefaultNamespace; instance.hasLoadedNamespace; instance.loadNamespaces; instance.loadLanguages; let globalAny$2 = {}; try { globalAny$2 = window; } catch (error) { if (error.message !== 'window is not defined') { throw error; } } /** * Base Params for a any function * @alias ActionParams * @memberof ViewHelpers */ const runDate = new Date(); /** * Collection of helper methods available in the views */ class ViewHelpers { constructor({ options } = {}) { let opts = ViewHelpers.getPaths(options); opts = opts || { rootPath: '/admin' }; // when ViewHelpers are used on the frontend, paths are taken from global Redux State this.options = opts; } static getPaths(options) { return options || globalAny$2.REDUX_STATE?.paths; } /** * To each related path adds rootPath passed by the user, as well as a query string * @private * @param {Array} [paths] list of parts of the url * @return {string} path * @return {query} [search=''] query string which can be fetch * from `location.search` */ urlBuilder(paths = [], search = '') { const separator = '/'; const replace = new RegExp(`${separator}{1,}`, 'g'); let { rootPath } = this.options; if (!rootPath.startsWith(separator)) { rootPath = `${separator}${rootPath}`; } const parts = [rootPath, ...paths]; return `${parts.join(separator).replace(replace, separator)}${search}`; } /** * Returns login URL * @return {string} */ loginUrl() { return this.options.loginPath; } /** * Returns logout URL * @return {string} */ logoutUrl() { return this.options.logoutPath; } /** * Returns URL for the dashboard * @return {string} */ dashboardUrl() { return this.options.rootPath; } /** * Returns URL for given page name * @param {string} pageName page name which is a unique key specified in * {@link AdminJSOptions} * @return {string} */ pageUrl(pageName) { return this.urlBuilder(['pages', pageName]); } /** * Returns url for a `edit` action in given Resource. Uses {@link recordActionUrl} * * @param {string} resourceId id to the resource * @param {string} recordId id to the record * @param {string} [search] optional query string */ editUrl(resourceId, recordId, search) { return this.recordActionUrl({ resourceId, recordId, actionName: 'edit', search }); } /** * Returns url for a `show` action in given Resource. Uses {@link recordActionUrl} * * @param {string} resourceId id to the resource * @param {string} recordId id to the record * @param {string} [search] optional query string */ showUrl(resourceId, recordId, search) { return this.recordActionUrl({ resourceId, recordId, actionName: 'show', search }); } /** * Returns url for a `delete` action in given Resource. Uses {@link recordActionUrl} * * @param {string} resourceId id to the resource * @param {string} recordId id to the record * @param {string} [search] optional query string */ deleteUrl(resourceId, recordId, search) { return this.recordActionUrl({ resourceId, recordId, actionName: 'delete', search }); } /** * Returns url for a `new` action in given Resource. Uses {@link resourceActionUrl} * * @param {string} resourceId id to the resource * @param {string} [search] optional query string */ newUrl(resourceId, search) { return this.resourceActionUrl({ resourceId, actionName: 'new', search }); } /** * Returns url for a `list` action in given Resource. Uses {@link resourceActionUrl} * * @param {string} resourceId id to the resource * @param {string} [search] optional query string */ listUrl(resourceId, search) { return this.resourceActionUrl({ resourceId, actionName: 'list', search }); } /** * Returns url for a `bulkDelete` action in given Resource. Uses {@link bulkActionUrl} * * @param {string} resourceId id to the resource * @param {Array} recordIds separated by comma records * @param {string} [search] optional query string */ bulkDeleteUrl(resourceId, recordIds, search) { return this.bulkActionUrl({ resourceId, recordIds, actionName: 'bulkDelete', search }); } /** * Returns resourceAction url * * @param {ResourceActionParams} options * @param {string} options.resourceId * @param {string} options.actionName * @param {string} [options.search] optional query string * * @return {string} */ resourceActionUrl({ resourceId, actionName, search }) { return this.urlBuilder(['resources', resourceId, 'actions', actionName], search); } resourceUrl({ resourceId, search }) { return this.urlBuilder(['resources', resourceId], search); } /** * Returns recordAction url * * @param {RecordActionParams} options * @param {string} options.resourceId * @param {string} options.recordId * @param {string} options.actionName * * @return {string} */ recordActionUrl({ resourceId, recordId, actionName, search }) { return this.urlBuilder(['resources', resourceId, 'records', recordId, actionName], search); } /** * Returns bulkAction url * * @param {BulkActionParams} options * @param {string} options.resourceId * @param {Array} [options.recordIds] * @param {string} options.actionName * * @return {string} */ bulkActionUrl({ resourceId, recordIds, actionName, search }) { const url = this.urlBuilder(['resources', resourceId, 'bulk', actionName]); if (recordIds && recordIds.length) { const query = new URLSearchParams(search); query.set('recordIds', recordIds.join(',')); return `${url}?${query.toString()}`; } return `${url}${search || ''}`; } /** * Returns absolute path to a given asset. * @private * * @param {string} asset * @param {Assets | undefined} assetsConfig * @return {string} */ assetPath(asset, assetsConfig) { if (this.options.assetsCDN) { const pathname = assetsConfig?.coreScripts?.[asset] ?? asset; const url = new URL(pathname, this.options.assetsCDN).href; // adding timestamp to the href invalidates the CDN cache return `${url}?date=${runDate.getTime()}`; } return this.urlBuilder(['frontend', 'assets', asset]); } } function _extends$2() { _extends$2 = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends$2.apply(this, arguments); } /** * @private * * @classdesc * Overrides one of the component form AdminJS core when user pass its name to * {@link ComponentLoader.add} or {@link ComponentLoader.override} method. * * If case of being overridden, component receives additional prop: `OriginalComponent` * * @example * new ComponentLoader().override('SidebarFooter', MySidebarFooter) */ function allowOverride(OriginalComponent, name) { const WrapperComponent = props => { let Component = OriginalComponent; /** * @new in version 6.3 * * This adds support for future theme-specific components via their "theme.bundle.js" * */ if (typeof window !== 'undefined') { Component = window.AdminJS?.UserComponents?.[name] ?? window.THEME?.Components?.[name] ?? OriginalComponent; } return /*#__PURE__*/React__default$1["default"].createElement(Component, _extends$2({}, props, { OriginalComponent: OriginalComponent })); }; return WrapperComponent; } const StyledLogo = styled__default["default"](reactRouterDom.Link).withConfig({ displayName: "sidebar-branding__StyledLogo", componentId: "sc-13gs4e8-0" })(["text-align:center;display:flex;align-content:center;justify-content:center;flex-shrink:0;padding:", " ", " ", ";text-decoration:none;& > h1{text-decoration:none;font-weight:", ";font-size:", ";color:", ";font-size:", ";line-height:", ";}& > img{max-width:170px;}&:hover h1{color:", ";}"], DesignSystem.themeGet('space', 'lg'), DesignSystem.themeGet('space', 'xxl'), DesignSystem.themeGet('space', 'xxl'), DesignSystem.themeGet('fontWeights', 'bolder'), DesignSystem.themeGet('fontWeights', 'bolder'), DesignSystem.themeGet('colors', 'grey80'), DesignSystem.themeGet('fontSizes', 'xl'), DesignSystem.themeGet('lineHeights', 'xl'), DesignSystem.themeGet('colors', 'primary100')); const h$3 = new ViewHelpers(); const SidebarBranding = props => { const { branding } = props; const { logo, companyName } = branding; return /*#__PURE__*/React__default$1["default"].createElement(StyledLogo, { className: DesignSystem.cssClass('Logo'), to: h$3.dashboardUrl(), "data-css": "sidebar-logo" }, logo ? /*#__PURE__*/React__default$1["default"].createElement("img", { src: logo, alt: companyName }) : /*#__PURE__*/React__default$1["default"].createElement("h1", null, companyName)); }; var SidebarBranding$1 = allowOverride(SidebarBranding, 'SidebarBranding'); /** * A specialized version of `_.reduce` for arrays without support for * iteratee shorthands. * * @private * @param {Array} [array] The array to iterate over. * @param {Function} iteratee The function invoked per iteration. * @param {*} [accumulator] The initial value. * @param {boolean} [initAccum] Specify using the first element of `array` as * the initial value. * @returns {*} Returns the accumulated value. */ function arrayReduce$1(array, iteratee, accumulator, initAccum) { var index = -1, length = array == null ? 0 : array.length; if (initAccum && length) { accumulator = array[++index]; } while (++index < length) { accumulator = iteratee(accumulator, array[index], index, array); } return accumulator; } var _arrayReduce = arrayReduce$1; /** * The base implementation of `_.propertyOf` without support for deep paths. * * @private * @param {Object} object The object to query. * @returns {Function} Returns the new accessor function. */ function basePropertyOf$1(object) { return function(key) { return object == null ? undefined : object[key]; }; } var _basePropertyOf = basePropertyOf$1; var basePropertyOf = _basePropertyOf; /** Used to map Latin Unicode letters to basic Latin letters. */ var deburredLetters = { // Latin-1 Supplement block. '\xc0': 'A', '\xc1': 'A', '\xc2': 'A', '\xc3': 'A', '\xc4': 'A', '\xc5': 'A', '\xe0': 'a', '\xe1': 'a', '\xe2': 'a', '\xe3': 'a', '\xe4': 'a', '\xe5': 'a', '\xc7': 'C', '\xe7': 'c', '\xd0': 'D', '\xf0': 'd', '\xc8': 'E', '\xc9': 'E', '\xca': 'E', '\xcb': 'E', '\xe8': 'e', '\xe9': 'e', '\xea': 'e', '\xeb': 'e', '\xcc': 'I', '\xcd': 'I', '\xce': 'I', '\xcf': 'I', '\xec': 'i', '\xed': 'i', '\xee': 'i', '\xef': 'i', '\xd1': 'N', '\xf1': 'n', '\xd2': 'O', '\xd3': 'O', '\xd4': 'O', '\xd5': 'O', '\xd6': 'O', '\xd8': 'O', '\xf2': 'o', '\xf3': 'o', '\xf4': 'o', '\xf5': 'o', '\xf6': 'o', '\xf8': 'o', '\xd9': 'U', '\xda': 'U', '\xdb': 'U', '\xdc': 'U', '\xf9': 'u', '\xfa': 'u', '\xfb': 'u', '\xfc': 'u', '\xdd': 'Y', '\xfd': 'y', '\xff': 'y', '\xc6': 'Ae', '\xe6': 'ae', '\xde': 'Th', '\xfe': 'th', '\xdf': 'ss', // Latin Extended-A block. '\u0100': 'A', '\u0102': 'A', '\u0104': 'A', '\u0101': 'a', '\u0103': 'a', '\u0105': 'a', '\u0106': 'C', '\u0108': 'C', '\u010a': 'C', '\u010c': 'C', '\u0107': 'c', '\u0109': 'c', '\u010b': 'c', '\u010d': 'c', '\u010e': 'D', '\u0110': 'D', '\u010f': 'd', '\u0111': 'd', '\u0112': 'E', '\u0114': 'E', '\u0116': 'E', '\u0118': 'E', '\u011a': 'E', '\u0113': 'e', '\u0115': 'e', '\u0117': 'e', '\u0119': 'e', '\u011b': 'e', '\u011c': 'G', '\u011e': 'G', '\u0120': 'G', '\u0122': 'G', '\u011d': 'g', '\u011f': 'g', '\u0121': 'g', '\u0123': 'g', '\u0124': 'H', '\u0126': 'H', '\u0125': 'h', '\u0127': 'h', '\u0128': 'I', '\u012a': 'I', '\u012c': 'I', '\u012e': 'I', '\u0130': 'I', '\u0129': 'i', '\u012b': 'i', '\u012d': 'i', '\u012f': 'i', '\u0131': 'i', '\u0134': 'J', '\u0135': 'j', '\u0136': 'K', '\u0137': 'k', '\u0138': 'k', '\u0139': 'L', '\u013b': 'L', '\u013d': 'L', '\u013f': 'L', '\u0141': 'L', '\u013a': 'l', '\u013c': 'l', '\u013e': 'l', '\u0140': 'l', '\u0142': 'l', '\u0143': 'N', '\u0145': 'N', '\u0147': 'N', '\u014a': 'N', '\u0144': 'n', '\u0146': 'n', '\u0148': 'n', '\u014b': 'n', '\u014c': 'O', '\u014e': 'O', '\u0150': 'O', '\u014d': 'o', '\u014f': 'o', '\u0151': 'o', '\u0154': 'R', '\u0156': 'R', '\u0158': 'R', '\u0155': 'r', '\u0157': 'r', '\u0159': 'r', '\u015a': 'S', '\u015c': 'S', '\u015e': 'S', '\u0160': 'S', '\u015b': 's', '\u015d': 's', '\u015f': 's', '\u0161': 's', '\u0162': 'T', '\u0164': 'T', '\u0166': 'T', '\u0163': 't', '\u0165': 't', '\u0167': 't', '\u0168': 'U', '\u016a': 'U', '\u016c': 'U', '\u016e': 'U', '\u0170': 'U', '\u0172': 'U', '\u0169': 'u', '\u016b': 'u', '\u016d': 'u', '\u016f': 'u', '\u0171': 'u', '\u0173': 'u', '\u0174': 'W', '\u0175': 'w', '\u0176': 'Y', '\u0177': 'y', '\u0178': 'Y', '\u0179': 'Z', '\u017b': 'Z', '\u017d': 'Z', '\u017a': 'z', '\u017c': 'z', '\u017e': 'z', '\u0132': 'IJ', '\u0133': 'ij', '\u0152': 'Oe', '\u0153': 'oe', '\u0149': "'n", '\u017f': 's' }; /** * Used by `_.deburr` to convert Latin-1 Supplement and Latin Extended-A * letters to basic Latin letters. * * @private * @param {string} letter The matched letter to deburr. * @returns {string} Returns the deburred letter. */ var deburrLetter$1 = basePropertyOf(deburredLetters); var _deburrLetter = deburrLetter$1; /** Detect free variable `global` from Node.js. */ var freeGlobal$1 = typeof commonjsGlobal == 'object' && commonjsGlobal && commonjsGlobal.Object === Object && commonjsGlobal; var _freeGlobal = freeGlobal$1; var freeGlobal = _freeGlobal; /** Detect free variable `self`. */ var freeSelf = typeof self == 'object' && self && self.Object === Object && self; /** Used as a reference to the global object. */ var root$1 = freeGlobal || freeSelf || Function('return this')(); var _root = root$1; var root = _root; /** Built-in value references. */ var Symbol$4 = root.Symbol; var _Symbol = Symbol$4; /** * A specialized version of `_.map` for arrays without support for iteratee * shorthands. * * @private * @param {Array} [array] The array to iterate over. * @param {Function} iteratee The function invoked per iteration. * @returns {Array} Returns the new mapped array. */ function arrayMap$1(array, iteratee) { var index = -1, length = array == null ? 0 : array.length, result = Array(length); while (++index < length) { result[index] = iteratee(array[index], index, array); } return result; } var _arrayMap = arrayMap$1; /** * Checks if `value` is classified as an `Array` object. * * @static * @memberOf _ * @since 0.1.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is an array, else `false`. * @example * * _.isArray([1, 2, 3]); * // => true * * _.isArray(document.body.children); * // => false * * _.isArray('abc'); * // => false * * _.isArray(_.noop); * // => false */ var isArray$2 = Array.isArray; var isArray_1 = isArray$2; var Symbol$3 = _Symbol; /** Used for built-in method references. */ var objectProto$1 = Object.prototype; /** Used to check objects for own properties. */ var hasOwnProperty = objectProto$1.hasOwnProperty; /** * Used to resolve the * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) * of values. */ var nativeObjectToString$1 = objectProto$1.toString; /** Built-in value references. */ var symToStringTag$1 = Symbol$3 ? Symbol$3.toStringTag : undefined; /** * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values. * * @private * @param {*} value The value to query. * @returns {string} Returns the raw `toStringTag`. */ function getRawTag$1(value) { var isOwn = hasOwnProperty.call(value, symToStringTag$1), tag = value[symToStringTag$1]; try { value[symToStringTag$1] = undefined; var unmasked = true; } catch (e) {} var result = nativeObjectToString$1.call(value); if (unmasked) { if (isOwn) { value[symToStringTag$1] = tag; } else { delete value[symToStringTag$1]; } } return result; } var _getRawTag = getRawTag$1; /** Used for built-in method references. */ var objectProto = Object.prototype; /** * Used to resolve the * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) * of values. */ var nativeObjectToString = objectProto.toString; /** * Converts `value` to a string using `Object.prototype.toString`. * * @private * @param {*} value The value to convert. * @returns {string} Returns the converted string. */ function objectToString$1(value) { return nativeObjectToString.call(value); } var _objectToString = objectToString$1; var Symbol$2 = _Symbol, getRawTag = _getRawTag, objectToString = _objectToString; /** `Object#toString` result references. */ var nullTag = '[object Null]', undefinedTag = '[object Undefined]'; /** Built-in value references. */ var symToStringTag = Symbol$2 ? Symbol$2.toStringTag : undefined; /** * The base implementation of `getTag` without fallbacks for buggy environments. * * @private * @param {*} value The value to query. * @returns {string} Returns the `toStringTag`. */ function baseGetTag$2(value) { if (value == null) { return value === undefined ? undefinedTag : nullTag; } return (symToStringTag && symToStringTag in Object(value)) ? getRawTag(value) : objectToString(value); } var _baseGetTag = baseGetTag$2; /** * Checks if `value` is object-like. A value is object-like if it's not `null` * and has a `typeof` result of "object". * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is object-like, else `false`. * @example * * _.isObjectLike({}); * // => true * * _.isObjectLike([1, 2, 3]); * // => true * * _.isObjectLike(_.noop); * // => false * * _.isObjectLike(null); * // => false */ function isObjectLike$2(value) { return value != null && typeof value == 'object'; } var isObjectLike_1 = isObjectLike$2; var baseGetTag$1 = _baseGetTag, isObjectLike$1 = isObjectLike_1; /** `Object#toString` result references. */ var symbolTag = '[object Symbol]'; /** * Checks if `value` is classified as a `Symbol` primitive or object. * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a symbol, else `false`. * @example * * _.isSymbol(Symbol.iterator); * // => true * * _.isSymbol('abc'); * // => false */ function isSymbol$2(value) { return typeof value == 'symbol' || (isObjectLike$1(value) && baseGetTag$1(value) == symbolTag); } var isSymbol_1 = isSymbol$2; var Symbol$1 = _Symbol, arrayMap = _arrayMap, isArray$1 = isArray_1, isSymbol$1 = isSymbol_1; /** Used as references for various `Number` constants. */ var INFINITY$1 = 1 / 0; /** Used to convert symbols to primitives and strings. */ var symbolProto = Symbol$1 ? Symbol$1.prototype : undefined, symbolToString = symbolProto ? symbolProto.toString : undefined; /** * The base implementation of `_.toString` which doesn't convert nullish * values to empty strings. * * @private * @param {*} value The value to process. * @returns {string} Returns the string. */ function baseToString$2(value) { // Exit early for strings to avoid a performance hit in some environments. if (typeof value == 'string') { return value; } if (isArray$1(value)) { // Recursively convert values (susceptible to call stack limits). return arrayMap(value, baseToString$2) + ''; } if (isSymbol$1(value)) { return symbolToString ? symbolToString.call(value) : ''; } var result = (value + ''); return (result == '0' && (1 / value) == -INFINITY$1) ? '-0' : result; } var _baseToString = baseToString$2; var baseToString$1 = _baseToString; /** * Converts `value` to a string. An empty string is returned for `null` * and `undefined` values. The sign of `-0` is preserved. * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to convert. * @returns {string} Returns the converted string. * @example * * _.toString(null); * // => '' * * _.toString(-0); * // => '-0' * * _.toString([1, 2, 3]); * // => '1,2,3' */ function toString$5(value) { return value == null ? '' : baseToString$1(value); } var toString_1 = toString$5; var deburrLetter = _deburrLetter, toString$4 = toString_1; /** Used to match Latin Unicode letters (excluding mathematical operators). */ var reLatin = /[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g; /** Used to compose unicode character classes. */ var rsComboMarksRange$4 = '\\u0300-\\u036f', reComboHalfMarksRange$4 = '\\ufe20-\\ufe2f', rsComboSymbolsRange$4 = '\\u20d0-\\u20ff', rsComboRange$4 = rsComboMarksRange$4 + reComboHalfMarksRange$4 + rsComboSymbolsRange$4; /** Used to compose unicode capture groups. */ var rsCombo$3 = '[' + rsComboRange$4 + ']'; /** * Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks) and * [combining diacritical marks for symbols](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks_for_Symbols). */ var reComboMark = RegExp(rsCombo$3, 'g'); /** * Deburrs `string` by converting * [Latin-1 Supplement](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table) * and [Latin Extended-A](https://en.wikipedia.org/wiki/Latin_Extended-A) * letters to basic Latin letters and removing * [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks). * * @static * @memberOf _ * @since 3.0.0 * @category String * @param {string} [string=''] The string to deburr. * @returns {string} Returns the deburred string. * @example * * _.deburr('déjà vu'); * // => 'deja vu' */ function deburr$1(string) { string = toString$4(string); return string && string.replace(reLatin, deburrLetter).replace(reComboMark, ''); } var deburr_1 = deburr$1; /** Used to match words composed of alphanumeric characters. */ var reAsciiWord = /[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g; /** * Splits an ASCII `string` into an array of its words. * * @private * @param {string} The string to inspect. * @returns {Array} Returns the words of `string`. */ function asciiWords$1(string) { return string.match(reAsciiWord) || []; } var _asciiWords = asciiWords$1; /** Used to detect strings that need a more robust regexp to match words. */ var reHasUnicodeWord = /[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/; /** * Checks if `string` contains a word composed of Unicode symbols. * * @private * @param {string} string The string to inspect. * @returns {boolean} Returns `true` if a word is found, else `false`. */ function hasUnicodeWord$1(string) { return reHasUnicodeWord.test(string); } var _hasUnicodeWord = hasUnicodeWord$1; /** Used to compose unicode character classes. */ var rsAstralRange$3 = '\\ud800-\\udfff', rsComboMarksRange$3 = '\\u0300-\\u036f', reComboHalfMarksRange$3 = '\\ufe20-\\ufe2f', rsComboSymbolsRange$3 = '\\u20d0-\\u20ff', rsComboRange$3 = rsComboMarksRange$3 + reComboHalfMarksRange$3 + rsComboSymbolsRange$3, rsDingbatRange = '\\u2700-\\u27bf', rsLowerRange = 'a-z\\xdf-\\xf6\\xf8-\\xff', rsMathOpRange = '\\xac\\xb1\\xd7\\xf7', rsNonCharRange = '\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf', rsPunctuationRange = '\\u2000-\\u206f', rsSpaceRange = ' \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000', rsUpperRange = 'A-Z\\xc0-\\xd6\\xd8-\\xde', rsVarRange$3 = '\\ufe0e\\ufe0f', rsBreakRange = rsMathOpRange + rsNonCharRange + rsPunctuationRange + rsSpaceRange; /** Used to compose unicode capture groups. */ var rsApos$1 = "['\u2019]", rsBreak = '[' + rsBreakRange + ']', rsCombo$2 = '[' + rsComboRange$3 + ']', rsDigits = '\\d+', rsDingbat = '[' + rsDingbatRange + ']', rsLower = '[' + rsLowerRange + ']', rsMisc = '[^' + rsAstralRange$3 + rsBreakRange + rsDigits + rsDingbatRange + rsLowerRange + rsUpperRange + ']', rsFitz$2 = '\\ud83c[\\udffb-\\udfff]', rsModifier$2 = '(?:' + rsCombo$2 + '|' + rsFitz$2 + ')', rsNonAstral$2 = '[^' + rsAstralRange$3 + ']', rsRegional$2 = '(?:\\ud83c[\\udde6-\\uddff]){2}', rsSurrPair$2 = '[\\ud800-\\udbff][\\udc00-\\udfff]', rsUpper = '[' + rsUpperRange + ']', rsZWJ$3 = '\\u200d'; /** Used to compose unicode regexes. */ var rsMiscLower = '(?:' + rsLower + '|' + rsMisc + ')', rsMiscUpper = '(?:' + rsUpper + '|' + rsMisc + ')', rsOptContrLower = '(?:' + rsApos$1 + '(?:d|ll|m|re|s|t|ve))?', rsOptContrUpper = '(?:' + rsApos$1 + '(?:D|LL|M|RE|S|T|VE))?', reOptMod$2 = rsModifier$2 + '?', rsOptVar$2 = '[' + rsVarRange$3 + ']?', rsOptJoin$2 = '(?:' + rsZWJ$3 + '(?:' + [rsNonAstral$2, rsRegional$2, rsSurrPair$2].join('|') + ')' + rsOptVar$2 + reOptMod$2 + ')*', rsOrdLower = '\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])', rsOrdUpper = '\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])', rsSeq$2 = rsOptVar$2 + reOptMod$2 + rsOptJoin$2, rsEmoji = '(?:' + [rsDingbat, rsRegional$2, rsSurrPair$2].join('|') + ')' + rsSeq$2; /** Used to match complex or compound words. */ var reUnicodeWord = RegExp([ rsUpper + '?' + rsLower + '+' + rsOptContrLower + '(?=' + [rsBreak, rsUpper, '$'].join('|') + ')', rsMiscUpper + '+' + rsOptContrUpper + '(?=' + [rsBreak, rsUpper + rsMiscLower, '$'].join('|') + ')', rsUpper + '?' + rsMiscLower + '+' + rsOptContrLower, rsUpper + '+' + rsOptContrUpper, rsOrdUpper, rsOrdLower, rsDigits, rsEmoji ].join('|'), 'g'); /** * Splits a Unicode `string` into an array of its words. * * @private * @param {string} The string to inspect. * @returns {Array} Returns the words of `string`. */ function unicodeWords$1(string) { return string.match(reUnicodeWord) || []; } var _unicodeWords = unicodeWords$1; var asciiWords = _asciiWords, hasUnicodeWord = _hasUnicodeWord, toString$3 = toString_1, unicodeWords = _unicodeWords; /** * Splits `string` into an array of its words. * * @static * @memberOf _ * @since 3.0.0 * @category String * @param {string} [string=''] The string to inspect. * @param {RegExp|string} [pattern] The pattern to match words. * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. * @returns {Array} Returns the words of `string`. * @example * * _.words('fred, barney, & pebbles'); * // => ['fred', 'barney', 'pebbles'] * * _.words('fred, barney, & pebbles', /[^, ]+/g); * // => ['fred', 'barney', '&', 'pebbles'] */ function words$1(string, pattern, guard) { string = toString$3(string); pattern = guard ? undefined : pattern; if (pattern === undefined) { return hasUnicodeWord(string) ? unicodeWords(string) : asciiWords(string); } return string.match(pattern) || []; } var words_1 = words$1; var arrayReduce = _arrayReduce, deburr = deburr_1, words = words_1; /** Used to compose unicode capture groups. */ var rsApos = "['\u2019]"; /** Used to match apostrophes. */ var reApos = RegExp(rsApos, 'g'); /** * Creates a function like `_.camelCase`. * * @private * @param {Function} callback The function to combine each word. * @returns {Function} Returns the new compounder function. */ function createCompounder$1(callback) { return function(string) { return arrayReduce(words(deburr(string).replace(reApos, '')), callback, ''); }; } var _createCompounder = createCompounder$1; /** * The base implementation of `_.slice` without an iteratee call guard. * * @private * @param {Array} array The array to slice. * @param {number} [start=0] The start position. * @param {number} [end=array.length] The end position. * @returns {Array} Returns the slice of `array`. */ function baseSlice$1(array, start, end) { var index = -1, length = array.length; if (start < 0) { start = -start > length ? 0 : (length + start); } end = end > length ? length : end; if (end < 0) { end += length; } length = start > end ? 0 : ((end - start) >>> 0); start >>>= 0; var result = Array(length); while (++index < length) { result[index] = array[index + start]; } return result; } var _baseSlice = baseSlice$1; var baseSlice = _baseSlice; /** * Casts `array` to a slice if it's needed. * * @private * @param {Array} array The array to inspect. * @param {number} start The start position. * @param {number} [end=array.length] The end position. * @returns {Array} Returns the cast slice. */ function castSlice$2(array, start, end) { var length = array.length; end = end === undefined ? length : end; return (!start && end >= length) ? array : baseSlice(array, start, end); } var _castSlice = castSlice$2; /** Used to compose unicode character classes. */ var rsAstralRange$2 = '\\ud800-\\udfff', rsComboMarksRange$2 = '\\u0300-\\u036f', reComboHalfMarksRange$2 = '\\ufe20-\\ufe2f', rsComboSymbolsRange$2 = '\\u20d0-\\u20ff', rsComboRange$2 = rsComboMarksRange$2 + reComboHalfMarksRange$2 + rsComboSymbolsRange$2, rsVarRange$2 = '\\ufe0e\\ufe0f'; /** Used to compose unicode capture groups. */ var rsZWJ$2 = '\\u200d'; /** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */ var reHasUnicode = RegExp('[' + rsZWJ$2 + rsAstralRange$2 + rsComboRange$2 + rsVarRange$2 + ']'); /** * Checks if `string` contains Unicode symbols. * * @private * @param {string} string The string to inspect. * @returns {boolean} Returns `true` if a symbol is found, else `false`. */ function hasUnicode$4(string) { return reHasUnicode.test(string); } var _hasUnicode = hasUnicode$4; /** * Converts an ASCII `string` to an array. * * @private * @param {string} string The string to convert. * @returns {Array} Returns the converted array. */ function asciiToArray$1(string) { return string.split(''); } var _asciiToArray = asciiToArray$1; /** Used to compose unicode character classes. */ var rsAstralRange$1 = '\\ud800-\\udfff', rsComboMarksRange$1 = '\\u0300-\\u036f', reComboHalfMarksRange$1 = '\\ufe20-\\ufe2f', rsComboSymbolsRange$1 = '\\u20d0-\\u20ff', rsComboRange$1 = rsComboMarksRange$1 + reComboHalfMarksRange$1 + rsComboSymbolsRange$1, rsVarRange$1 = '\\ufe0e\\ufe0f'; /** Used to compose unicode capture groups. */ var rsAstral$1 = '[' + rsAstralRange$1 + ']', rsCombo$1 = '[' + rsComboRange$1 + ']', rsFitz$1 = '\\ud83c[\\udffb-\\udfff]', rsModifier$1 = '(?:' + rsCombo$1 + '|' + rsFitz$1 + ')', rsNonAstral$1 = '[^' + rsAstralRange$1 + ']', rsRegional$1 = '(?:\\ud83c[\\udde6-\\uddff]){2}', rsSurrPair$1 = '[\\ud800-\\udbff][\\udc00-\\udfff]', rsZWJ$1 = '\\u200d'; /** Used to compose unicode regexes. */ var reOptMod$1 = rsModifier$1 + '?', rsOptVar$1 = '[' + rsVarRange$1 + ']?', rsOptJoin$1 = '(?:' + rsZWJ$1 + '(?:' + [rsNonAstral$1, rsRegional$1, rsSurrPair$1].join('|') + ')' + rsOptVar$1 + reOptMod$1 + ')*', rsSeq$1 = rsOptVar$1 + reOptMod$1 + rsOptJoin$1, rsSymbol$1 = '(?:' + [rsNonAstral$1 + rsCombo$1 + '?', rsCombo$1, rsRegional$1, rsSurrPair$1, rsAstral$1].join('|') + ')'; /** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */ var reUnicode$1 = RegExp(rsFitz$1 + '(?=' + rsFitz$1 + ')|' + rsSymbol$1 + rsSeq$1, 'g'); /** * Converts a Unicode `string` to an array. * * @private * @param {string} string The string to convert. * @returns {Array} Returns the converted array. */ function unicodeToArray$1(string) { return string.match(reUnicode$1) || []; } var _unicodeToArray = unicodeToArray$1; var asciiToArray = _asciiToArray, hasUnicode$3 = _hasUnicode, unicodeToArray = _unicodeToArray; /** * Converts `string` to an array. * * @private * @param {string} string The string to convert. * @returns {Array} Returns the converted array. */ function stringToArray$2(string) { return hasUnicode$3(string) ? unicodeToArray(string) : asciiToArray(string); } var _stringToArray = stringToArray$2; var castSlice$1 = _castSlice, hasUnicode$2 = _hasUnicode, stringToArray$1 = _stringToArray, toString$2 = toString_1; /** * Creates a function like `_.lowerFirst`. * * @private * @param {string} methodName The name of the `String` case method to use. * @returns {Function} Returns the new case function. */ function createCaseFirst$1(methodName) { return function(string) { string = toString$2(string); var strSymbols = hasUnicode$2(string) ? stringToArray$1(string) : undefined; var chr = strSymbols ? strSymbols[0] : string.charAt(0); var trailing = strSymbols ? castSlice$1(strSymbols, 1).join('') : string.slice(1); return chr[methodName]() + trailing; }; } var _createCaseFirst = createCaseFirst$1; var createCaseFirst = _createCaseFirst; /** * Converts the first character of `string` to upper case. * * @static * @memberOf _ * @since 4.0.0 * @category String * @param {string} [string=''] The string to convert. * @returns {string} Returns the converted string. * @example * * _.upperFirst('fred'); * // => 'Fred' * * _.upperFirst('FRED'); * // => 'FRED' */ var upperFirst$1 = createCaseFirst('toUpperCase'); var upperFirst_1 = upperFirst$1; var createCompounder = _createCompounder, upperFirst = upperFirst_1; /** * Converts `string` to * [start case](https://en.wikipedia.org/wiki/Letter_case#Stylistic_or_specialised_usage). * * @static * @memberOf _ * @since 3.1.0 * @category String * @param {string} [string=''] The string to convert. * @returns {string} Returns the start cased string. * @example * * _.startCase('--foo-bar--'); * // => 'Foo Bar' * * _.startCase('fooBar'); * // => 'Foo Bar' * * _.startCase('__FOO_BAR__'); * // => 'FOO BAR' */ var startCase = createCompounder(function(result, word, index) { return result + (index ? ' ' : '') + upperFirst(word); }); var startCase_1 = startCase; /** * @memberof TranslateFunctions * @alias TranslateFunction */ const formatName = name => name.split('.').join('.'); const translate = (i18n, key, name, resourceId, options) => { const realOptions = (typeof resourceId === 'string' ? options : resourceId) || {}; const formattedName = formatName(name); let keys = [`${key}.${formattedName}`]; if (resourceId) { keys = [`resources.${resourceId}.${key}.${formattedName}`, ...keys]; } if (i18n.exists(keys)) { return i18n.t(keys, realOptions); } return realOptions.defaultValue ?? startCase_1(name); }; const createFunctions = i18n => { const translateAction = (actionName, resourceId, options) => translate(i18n, 'actions', actionName, resourceId, options); const translateButton = (buttonLabel, resourceId, options) => translate(i18n, 'buttons', buttonLabel, resourceId, options); const translateLabel = (label, resourceId, options) => translate(i18n, 'labels', label, resourceId, options); const translateProperty = (propertyName, resourceId, options) => translate(i18n, 'properties', propertyName, resourceId, options); const translateMessage = (messageName, resourceId, options) => translate(i18n, 'messages', messageName, resourceId, options); return { translateAction, ta: translateAction, translateButton, tb: translateButton, translateLabel, tl: translateLabel, translateProperty, tp: translateProperty, translateMessage, tm: translateMessage, t: i18n.t, translate: i18n.t }; }; /** * Extends {@link TranslateFunctions}. Apart from that it also returns all the properties * defined below. * * ```javascript * import { useTranslation } from 'adminjs' * * const MyComponent = () => { * const { translateButton } = useTranslation() * * return ( * * * ) * } * ``` * * @class * @subcategory Hooks * @bundle * @hideconstructor */ const useNotice = () => { const dispatch = require$$3.useDispatch(); return notice => dispatch(addNotice(notice)); }; /** * Handlers of all [Actions]{@link Action} of type `record` returns record. * Depending on a place and response we have to merge what was returned * to the actual state. It is done in following places: * - {@link useRecord} hook * - {@link RecordInList} component * - {@link RecordAction} component * * @private */ const mergeRecordResponse = (record, response) => ({ // we start from the response because it can have different recordActions or bulkActions ...(response.record || record), // records has to be reset every time because so that user wont // see old errors which are not relevant anymore errors: response.record.errors, populated: { ...record.populated, ...response.record.populated }, params: { ...record.params, ...response.record.params } }); /*! * Determine if an object is a Buffer * * @author Feross Aboukhadijeh * @license MIT */ var isBuffer$1 = function isBuffer (obj) { return obj != null && obj.constructor != null && typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj) }; var isBuffer = isBuffer$1; var flat$1 = flatten; flatten.flatten = flatten; flatten.unflatten = unflatten; function flatten (target, opts) { opts = opts || {}; var delimiter = opts.delimiter || '.'; var maxDepth = opts.maxDepth; var output = {}; function step (object, prev, currentDepth) { currentDepth = currentDepth || 1; Object.keys(object).forEach(function (key) { var value = object[key]; var isarray = opts.safe && Array.isArray(value); var type = Object.prototype.toString.call(value); var isbuffer = isBuffer(value); var isobject = ( type === '[object Object]' || type === '[object Array]' ); var newKey = prev ? prev + delimiter + key : key; if (!isarray && !isbuffer && isobject && Object.keys(value).length && (!opts.maxDepth || currentDepth < maxDepth)) { return step(value, newKey, currentDepth + 1) } output[newKey] = value; }); } step(target); return output } function unflatten (target, opts) { opts = opts || {}; var delimiter = opts.delimiter || '.'; var overwrite = opts.overwrite || false; var result = {}; var isbuffer = isBuffer(target); if (isbuffer || Object.prototype.toString.call(target) !== '[object Object]') { return target } // safely ensure that the key is // an integer. function getkey (key) { var parsedKey = Number(key); return ( isNaN(parsedKey) || key.indexOf('.') !== -1 || opts.object ) ? key : parsedKey } var sortedKeys = Object.keys(target).sort(function (keyA, keyB) { return keyA.length - keyB.length }); sortedKeys.forEach(function (key) { var split = key.split(delimiter); var key1 = getkey(split.shift()); var key2 = getkey(split[0]); var recipient = result; while (key2 !== undefined) { if (key1 === '__proto__') { return } var type = Object.prototype.toString.call(recipient[key1]); var isobject = ( type === '[object Object]' || type === '[object Array]' ); // do not write over falsey, non-undefined values if overwrite is false if (!overwrite && !isobject && typeof recipient[key1] !== 'undefined') { return } if ((overwrite && !isobject) || (!overwrite && recipient[key1] == null)) { recipient[key1] = ( typeof key2 === 'number' && !opts.object ? [] : {} ); } recipient = recipient[key1]; if (split.length > 0) { key1 = getkey(split.shift()); key2 = getkey(split[0]); } } // unflatten again for 'messy objects' recipient[key1] = unflatten(target[key], opts); }); return result } const DELIMITER = '.'; // this is the regex used to find all existing properties starting with a key const propertyKeyRegex = (propertyPath, options) => { const delimiter = new RegExp(`\\${DELIMITER}`, 'g'); const escapedDelimiter = `\\${DELIMITER}`; // but for `nested.1.property.0` it will produce `nested(\.|\.\d+\.)1(\.|\.\d+\.)property.0` // and this is intentional because user can give an one index in property path for with deeply // nested arrays const escapedDelimiterOrIndex = `(${escapedDelimiter}|${escapedDelimiter}\\d+${escapedDelimiter})`; const path = options?.includeAllSiblings ? propertyPath.replace(delimiter, escapedDelimiterOrIndex) : propertyPath.replace(delimiter, escapedDelimiter); return new RegExp(`^${path}($|${escapedDelimiter})`, ''); }; /** * @load ./select-params.doc.md * @memberof module:flat * @param {FlattenParams} params * @param {string | Array} properties * @param {GetOptions} [options] * @returns {FlattenParams} */ const selectParams = (params, properties, options) => { const propertyArray = Array.isArray(properties) ? properties : [properties]; const selected = propertyArray.filter(propertyPath => !!propertyPath).reduce((globalMemo, propertyPath) => { const regex = propertyKeyRegex(propertyPath, options); const filtered = Object.keys(params) // filter all keys which starts with property path .filter(key => key.match(regex)).reduce((memo, key) => { memo[key] = params[key]; return memo; }, {}); return { ...globalMemo, ...filtered }; }, {}); return selected; }; /** * @load ./filter-out-params.doc.md * @memberof module:flat * @param {FlattenParams} params * @param {string | Array} properties * @returns {FlattenParams} */ const filterOutParams = (params, properties) => { const propertyArray = Array.isArray(properties) ? properties : [properties]; return propertyArray.filter(propertyPath => !!propertyPath).reduce((globalFiltered, propertyPath) => { const regex = propertyKeyRegex(propertyPath); return Object.keys(globalFiltered).filter(key => !key.match(regex)).reduce((memo, key) => { memo[key] = params[key]; return memo; }, {}); }, params); }; /** * @memberof module:flat * @alias PathToPartsOptions */ /** * @load ./path-to-parts.doc.md * @param {string} propertyPath * @param {PathToPartsOptions} options * @returns {PathParts} * * @memberof module:flat * @alias pathToParts */ const pathToParts = (propertyPath, options = {}) => { let allParts = propertyPath.split('.'); if (options.skipArrayIndexes) { // eslint-disable-next-line no-restricted-globals allParts = allParts.filter(part => isNaN(+part)); } return allParts.reduce((memo, part) => { if (memo.length) { return [...memo, [memo[memo.length - 1], part].join('.')]; } return [part]; }, []); }; const isObject$3 = value => { // Node environment if (typeof File === 'undefined') { return typeof value === 'object' && value !== null; } // Window environment return typeof value === 'object' && !(value instanceof File) && value !== null; }; /** * @load ./set.doc.md * @memberof module:flat * @param {FlattenParams} params * @param {string} propertyPath * @param {any} [value] if not give function will only try to remove old keys * @returns {FlattenParams} */ const set = (params = {}, propertyPath, value) => { const regex = propertyKeyRegex(propertyPath); // remove all existing keys const paramsCopy = Object.keys(params).filter(key => !key.match(regex)).reduce((memo, key) => { memo[key] = params[key]; return memo; }, {}); if (typeof value !== 'undefined') { if (isObject$3(value) && !(value instanceof Date)) { const flattened = flat$1.flatten(value); if (Object.keys(flattened).length) { Object.keys(flattened).forEach(key => { paramsCopy[`${propertyPath}${DELIMITER}${key}`] = flattened[key]; }); } else if (Array.isArray(value)) { paramsCopy[propertyPath] = []; } else { paramsCopy[propertyPath] = {}; } } else { paramsCopy[propertyPath] = value; } // when user gave { "nested.value": "something" } and had "nested" set to `null`, then // nested should be removed const parts = pathToParts(propertyPath).slice(0, -1); if (parts.length) { return Object.keys(paramsCopy).filter(key => !parts.includes(key)).reduce((memo, key) => { memo[key] = paramsCopy[key]; return memo; }, {}); } } return paramsCopy; }; const TEMP_HOLDING_KEY = 'TEMP_HOLDING_KEY'; /** * @load ./get.doc.md * @memberof module:flat * @param {FlattenParams} params flatten params from which property has to be taken * @param {string} [propertyPath] name of the property * @param {GetOptions} options options * @returns {any} when property key exists directly it returns what is inside, * otherwise it tries to find any nested objects and returns * them */ const get = (params = {}, propertyPath, options) => { if (!propertyPath) { return flat$1.unflatten(params); } // when object has this key - simply return it // we cannot rely on typeof params[propertyPath !== 'undefined' because params can actually be // undefined and in such case if would pass and function would return [undefined] if (Object.keys(params).find(key => key === propertyPath)) { return params[propertyPath]; } const regex = propertyKeyRegex(propertyPath, options); const selectedParams = selectParams(params, propertyPath, options); const nestedProperties = Object.keys(selectedParams).reduce((memo, key, index) => { let newKey = key.replace(regex, `${TEMP_HOLDING_KEY}${DELIMITER}`); // when user wants to take allSiblings we have to fix the indexes so nested items from // different siblings don't overlap // // Example for key `nested.1.el`: // 'nested.0.el.0.value': 'val0.0', // 'nested.0.el.1.value': 'val0.1', // 'nested.1.el.0.value': 'val1', // 'nested.1.el.1.value': 'val2', // // has to be changed to: // 'TEMP_HOLDING_KEY.0.value': 'val0.0', // 'TEMP_HOLDING_KEY.1.value': 'val0.1', // 'TEMP_HOLDING_KEY.2.value': 'val1', // 'TEMP_HOLDING_KEY.3.value': 'val2', if (options?.includeAllSiblings) { newKey = newKey.replace(new RegExp(`${TEMP_HOLDING_KEY}\\${DELIMITER}(\\d*)`), `${TEMP_HOLDING_KEY}${DELIMITER}${index}`); } memo[newKey] = selectedParams[key]; return memo; }, {}); if (Object.keys(nestedProperties).length) { return flat$1.unflatten(nestedProperties)[TEMP_HOLDING_KEY]; } return undefined; }; /** * Merges params together and returns flatten result * * @param {any} params * @param {Array} ...mergeParams * @returns {FlattenParams} * @memberof module:flat */ const merge = (params = {}, ...mergeParams) => { const flattenParams = flat$1.flatten(params); // reverse because we merge from right return mergeParams.reverse().reduce((globalMemo, mergeParam) => Object.keys(mergeParam).reduce((memo, key) => set(memo, key, mergeParam[key]), globalMemo), flattenParams); }; /** * @load ./remove-path.doc.md * @memberof module:flat * @param {FlattenParams} params * @param {...string} properties * @returns {FlattenParams} */ const removePath = (params, path) => { // by default simply filter out elements from the object let filtered = filterOutParams(params, path); // reverse means that we iterate from the closes parent const parentPaths = pathToParts(path).reverse(); // but if one of the parent is an array parentPaths.find((parentPath, parentIndex) => { const parent = get(params, parentPath); if (Array.isArray(parent)) { // previous element is stringified index like 'property.1' const previousPaths = parentPaths[parentIndex - 1].split(DELIMITER); // so this is the index: 1 const previousPathIndex = previousPaths[previousPaths.length - 1]; parent.splice(+previousPathIndex, 1); filtered = set(params, parentPath, parent); // this works just for the firstly found array item, because in case of removing the last one // it leaves `[]` as a value. return true; } return false; }); return filtered; }; /** * @module flat * @name flat * @new in version 3.3 * @load ./flat.doc.md */ const flat = { /** * Raw `flatten` function exported from original {@link https://www.npmjs.com/package/flat flat} * package. */ flatten: flat$1.flatten, /** * Raw `unflatten` function exported from original {@link https://www.npmjs.com/package/flat flat} * package. */ unflatten: flat$1.unflatten, set, get, selectParams, filterOutParams, removePath, DELIMITER, pathToParts, merge }; /** * HOF returning a function which takes a record and returns an updated record. * This way we can pass this to setState in react, which takes old state * (in our case previousRecord) as an argument. * * Function is used when to the {@link OnPropertyChange} callback, user passes * key (property name) and the value (followed by an optional selectedRecord). * * The responsibility of the function is to: * - clear old values under passed key: so when user passes property === `some.key` * function removes `some.key.1`, `some.key.2` etc * - sets new value under the passed key for primitive types * - in case of objects - it flattens them first and then sets all the resulted values * under the path provided in the property argument * - it fills value in RecordJSON#populated when selectedRecord is given * - finally it invalidates populated for given property * * * @param {string} property property that must be updated, supports nesting * with dots * @param {any} value value that must be set, undefined or null if * deleting, will be flattened * @param {RecordJSON} selectedRecord if value is reference ID, this must be a record * it's referencing to * @private */ const updateRecord = (property, value, selectedRecord) => previousRecord => { let populatedModified = false; const populatedCopy = { ...previousRecord.populated }; const paramsCopy = flat.set(previousRecord.params, property, value); if (property in populatedCopy) { delete populatedCopy[property]; populatedModified = true; } if (selectedRecord) { populatedCopy[property] = selectedRecord; populatedModified = true; } return { ...previousRecord, params: paramsCopy, populated: populatedModified ? populatedCopy : previousRecord.populated }; }; const isEntireRecordGiven = (propertyOrRecord, value) => !!(typeof value === 'undefined' // user can pass property and omit value. This makes sense when // third argument of the function (selectedRecord) is passed to onChange // callback && !(typeof propertyOrRecord === 'string') // we assume that only params has to be given && propertyOrRecord.params); // eslint-disable-next-line no-shadow let ErrorTypeEnum; (function (ErrorTypeEnum) { ErrorTypeEnum["App"] = "AppError"; ErrorTypeEnum["Configuration"] = "ConfigurationError"; ErrorTypeEnum["Forbidden"] = "ForbiddenError"; ErrorTypeEnum["NotFound"] = "NotFoundError"; ErrorTypeEnum["NotImplemented"] = "NotImplementedError"; ErrorTypeEnum["Record"] = "RecordError"; ErrorTypeEnum["Validation"] = "ValidationError"; })(ErrorTypeEnum || (ErrorTypeEnum = {})); const filterRecordParams = function (record, options = {}) { if (options.includeParams && record) { return { ...record, params: flat.selectParams(record.params || {}, options.includeParams) }; } return record; }; const isPropertyPermitted = (propertyName, options = {}) => { const { includeParams } = options; if (includeParams) { const parts = flat.pathToParts(propertyName, { skipArrayIndexes: true }); return parts.some(part => includeParams.includes(part)); } return true; }; const api$4 = new ApiClient(); /** * @load ./use-record.doc.md * @subcategory Hooks * @class * @hideconstructor * @bundle * @param {RecordJSON} [initialRecord], * @param {string} resourceId * @param {UseRecordOptions} [options] * @return {UseRecordResult} */ const useRecord = (initialRecord, resourceId, options) => { // setting up state const [loading, setLoading] = React$1.useState(false); const [isSynced, setIsSynced] = React$1.useState(true); const [progress, setProgress] = React$1.useState(0); const filteredRecord = initialRecord ? filterRecordParams(initialRecord, options) : null; const [record, setRecord] = React$1.useState({ ...filteredRecord, params: filteredRecord?.params ?? {}, errors: initialRecord?.errors ?? {}, populated: initialRecord?.populated ?? {} }); // it keeps the same format as useState function which can take either value or function const setFilteredRecord = React$1.useCallback(value => { const newRecord = value instanceof Function ? value(record) : value; setRecord(filterRecordParams(newRecord, options)); }, [options, record]); const onNotice = useNotice(); const handleChange = React$1.useCallback((propertyOrRecord, value, incomingRecord) => { if (isEntireRecordGiven(propertyOrRecord, value)) { setFilteredRecord(propertyOrRecord); } else if (isPropertyPermitted(propertyOrRecord, options)) { setRecord(updateRecord(propertyOrRecord, value, incomingRecord)); } else { // eslint-disable-next-line no-console console.warn([`You are trying to set property: "${propertyOrRecord}" which`, 'is not permitted. Take a look at `useRecord(..., { includeParams: [...]})`'].join('\n')); } setIsSynced(false); }, [setRecord, options]); const handleSubmit = React$1.useCallback((customParams = {}, submitOptions) => { setLoading(true); const mergedParams = flat.merge(record.params, customParams); const formData = paramsToFormData(mergedParams); const params = { resourceId, onUploadProgress: e => setProgress(Math.round(e.loaded * 100 / e.total)), data: formData, headers: { 'Content-Type': 'multipart/form-data' } }; const promise = initialRecord?.id ? api$4.recordAction({ ...params, actionName: 'edit', recordId: record.id }) : api$4.resourceAction({ ...params, actionName: 'new' }); promise.then(response => { if (response.data.notice) { onNotice(response.data.notice); } if (submitOptions?.updateOnSave !== false) { setFilteredRecord(prev => mergeRecordResponse(prev, response.data)); } setProgress(0); setLoading(false); setIsSynced(true); }).catch(() => { onNotice({ message: 'There was an error updating record, Check out console to see more information.', type: 'error' }); setProgress(0); setLoading(false); }); return promise; }, [record, resourceId, setLoading, setProgress, setRecord]); return { record, handleChange, submit: handleSubmit, loading, progress, setRecord: setFilteredRecord, isSynced }; }; const actionHasComponent = action => typeof action.component !== 'undefined' && action.component === false; const h$1 = new ViewHelpers(); const actionHref = (action, params) => { const actionName = action.name; if (!action.component && !action.hasHandler) { return null; } const hrefMap = { record: () => h$1.recordActionUrl({ ...params, actionName }), resource: () => h$1.resourceActionUrl({ resourceId: params.resourceId, actionName }), bulk: () => h$1.bulkActionUrl({ ...params, actionName }) }; if (hrefMap[action.actionType]) { return hrefMap[action.actionType](); } throw new Error('"actionType" should be either record, resource or bulk'); }; const getResourceElementCss = (resourceId, suffix) => `${resourceId}-${suffix}`; const getActionElementCss = (resourceId, actionName, suffix) => `${resourceId}-${actionName}-${suffix}`; const api$3 = new ApiClient(); function callActionApi(action, params, search) { let promise; const { recordId, recordIds, resourceId } = params; switch (action.actionType) { case 'record': if (!recordId) { throw new Error('You have to specify "recordId" for record action'); } promise = api$3.recordAction({ resourceId, actionName: action.name, recordId, search }); break; case 'resource': promise = api$3.resourceAction({ resourceId, actionName: action.name }); break; case 'bulk': if (!recordIds) { throw new Error('You have to specify "recordIds" for bulk action'); } promise = api$3.bulkAction({ resourceId, actionName: action.name, recordIds, search }); break; default: throw new Error('"actionType" should be either record, resource or bulk'); } return promise; } /* eslint-disable arrow-parens */ const buildActionCallApiTrigger = options => { const { action, params, actionResponseHandler, search } = options; const callApi = () => { const promise = callActionApi(action, params, search); promise.then(actionResponseHandler).catch(error => { throw error; }); return promise; }; return callApi; }; const buildActionTestId = action => `action-${action.name}`; /* eslint-disable no-restricted-globals */ const buildActionClickHandler = options => { const { action, params, actionResponseHandler, navigate } = options; const handleActionClick = event => { event.preventDefault(); event.stopPropagation(); const href = actionHref(action, params); const callApi = buildActionCallApiTrigger({ params, action, actionResponseHandler }); if (action.guard && !confirm(action.guard)) { return; } if (actionHasComponent(action)) { // eslint-disable-next-line consistent-return return callApi(); } if (href) { navigate(href); } }; return handleActionClick; }; const REFRESH_KEY = 'refresh'; const IGNORE_PARAMS_KEY = 'ignore_params'; /** * Adds refresh=true to the url, which in turn should cause list to reload. * * @param {string} url url to which function should add `refresh` * @param {string} [search] optional search query which should be updated, * if not given function will use window.location.search * @private */ const appendForceRefresh = (url, search) => { const searchParamsIdx = url.lastIndexOf('?'); const urlSearchParams = searchParamsIdx !== -1 ? url.substring(searchParamsIdx + 1) : null; const oldParams = new URLSearchParams(search ?? urlSearchParams ?? window.location.search ?? ''); const shouldIgnoreOldParams = new URLSearchParams(urlSearchParams || '').get(IGNORE_PARAMS_KEY) === 'true'; const newParams = shouldIgnoreOldParams ? new URLSearchParams('') : new URLSearchParams(oldParams.toString()); newParams.set(REFRESH_KEY, 'true'); const newUrl = searchParamsIdx !== -1 ? url.substring(0, searchParamsIdx) : url; return `${newUrl}?${newParams.toString()}`; }; const hasForceRefresh = search => { const params = new URLSearchParams(search); return !!params.get(REFRESH_KEY); }; const removeForceRefresh = search => { const params = new URLSearchParams(search); if (params.get(REFRESH_KEY)) { params.delete(REFRESH_KEY); } return params.toString(); }; /* eslint-disable @typescript-eslint/explicit-function-return-type */ const useActionResponseHandler = onActionCall => { const location = reactRouter.useLocation(); const navigate = reactRouter.useNavigate(); const addNotice = useNotice(); return response => { const { data } = response; if (data.notice) { addNotice(data.notice); } if (data.redirectUrl && location.pathname !== data.redirectUrl) { const appended = appendForceRefresh(data.redirectUrl); navigate(appended); } if (onActionCall) { onActionCall(data); } }; }; /** * @load ./use-action.doc.md * @subcategory Hooks * * @param {ActionJSON} action action object * @param {ActionParams} params * @param {ActionCallCallback} onActionCall - callback triggered when action is performed * @return {UseActionResult} * @class * @hideconstructor */ function useAction(action, params, onActionCall) { const navigate = reactRouter.useNavigate(); const actionResponseHandler = useActionResponseHandler(onActionCall); const href = actionHref(action, params); const callApi = buildActionCallApiTrigger({ action, params, actionResponseHandler }); const handleClick = buildActionClickHandler({ action, params, actionResponseHandler, navigate }); return { href, callApi, handleClick }; } const SESSION_INITIALIZE = 'SESSION_INITIALIZE'; const setCurrentAdmin = (data = null) => ({ type: SESSION_INITIALIZE, data }); /** * @classdesc * Hook which allows you to get and set currentAdmin * * ### Usage * * ```javascript * import { useCurrentAdmin } from 'adminjs' * * const myComponent = () => { * const [currentAdmin, setCurrentAdmin] = useCurrentAdmin() * // ... * } * ``` * * @class * @subcategory Hooks * @bundle * @returns {UseCurrentAdminResponse} * @hideconstructor */ function useCurrentAdmin() { const currentAdmin = require$$3.useSelector(state => state.session); const dispatch = require$$3.useDispatch(); return [currentAdmin, admin => dispatch(setCurrentAdmin(admin))]; } /** * Result of the {@link useCurrentAdmin}. * It is a tuple containing value and the setter * * @typedef {Array} UseCurrentAdminResponse * @memberof useCurrentAdmin * @alias UseCurrentAdminResponse * @property {CurrentAdmin | null} [0] current admin * @property {React.Dispatch>} [1] value setter compatible * with react useState */ /* eslint-disable no-console */ /** * @load ./use-local-storage.doc.md * @subcategory Hooks * @class * @see https://usehooks.com/useLocalStorage * * @param {string} key key under which hook will store the data * @param {T} initialValue value which will be stringified and stored * @return {UseLocalStorageResult} * @bundle * @type {Function} */ function useLocalStorage(key, initialValue) { // State to store our value // Pass initial state function to useState so logic is only executed once const [storedValue, setStoredValue] = React$1.useState(() => { try { // Get from local storage by key const item = window.localStorage.getItem(key); // Parse stored json or if none return initialValue return item ? JSON.parse(item) : initialValue; } catch (error) { // If error also return initialValue console.log(error); return initialValue; } }); // Return a wrapped version of useState's setter function that ... // ... persists the new value to localStorage. const setValue = value => { try { // Allow value to be a function so we have same API as useState const valueToStore = value instanceof Function ? value(storedValue) : value; // Save state setStoredValue(valueToStore); // Save to local storage window.localStorage.setItem(key, JSON.stringify(valueToStore)); } catch (error) { // A more advanced implementation would handle the error case console.log(error); } }; return [storedValue, setValue]; } const isSelected = (href, location) => { const regExp = new RegExp(`${href}($|/)`); return !!location.pathname.match(regExp); }; function useNavigationResources(resources) { const [openElements, setOpenElements] = useLocalStorage('sidebarElements', {}); const navigate = reactRouter.useNavigate(); const location = reactRouter.useLocation(); const enrichResource = React$1.useMemo(() => (resource, icon) => ({ href: resource.href || undefined, icon, isSelected: isSelected(resource.href, location), label: resource.name, id: resource.id, onClick: event => { if (resource.href) { event.preventDefault(); navigate(resource.href); } } }), [location, navigate]); // grouping resources into parents const map = resources // first filter out resources which are not visible .filter(res => res.href && res.navigation?.show !== false).reduce((memo, resource) => { // in case resource has the same name as parent we namespace it wit "resource-"" const key = resource.navigation?.name || ['resource', resource.name].join('-'); if (!resource.navigation || resource.navigation.name === null) { memo[key] = enrichResource(resource, resource.navigation?.icon); } else if (memo[key] && memo[key].elements && resource.navigation?.name) { memo[key].elements.push(enrichResource(resource)); } else { memo[key] = { elements: [enrichResource(resource)], label: resource.navigation?.name, icon: resource.navigation?.icon, onClick: () => setOpenElements({ ...openElements, [key]: !openElements[key] }), isOpen: !!openElements[key] }; } return memo; }, {}); return Object.values(map); } const api$2 = new ApiClient(); /** * @load ./use-records.doc.md * @subcategory Hooks * @class * @hideconstructor * * @param {string} resourceId id of a resource for which you want to fetch records * @return {UseRecordsResult} * @bundle * @type {Function} */ function useRecords(resourceId) { const [records, setRecords] = React$1.useState([]); const [loading, setLoading] = React$1.useState(false); const [perPage, setPerPage] = React$1.useState(10); const [page, setPage] = React$1.useState(1); const [total, setTotal] = React$1.useState(0); const [direction, setDirection] = React$1.useState('asc'); const [sortBy, setSortBy] = React$1.useState(); const location = reactRouter.useLocation(); const navigate = reactRouter.useNavigate(); const addNotice = useNotice(); const { translateMessage } = useTranslation(); const onNotice = useNotice(); const fetchData = () => { setLoading(true); const query = new URLSearchParams(location.search); const promise = api$2.resourceAction({ actionName: 'list', resourceId, params: query }); promise.then(response => { const listActionResponse = response.data; if (listActionResponse.notice) { onNotice(listActionResponse.notice); } if (listActionResponse.redirectUrl) { navigate(listActionResponse.redirectUrl); return; } setRecords(listActionResponse.records); setPage(listActionResponse.meta.page); setPerPage(listActionResponse.meta.perPage); setTotal(listActionResponse.meta.total); setDirection(listActionResponse.meta.direction); setSortBy(listActionResponse.meta.sortBy); setLoading(false); }).catch(() => { addNotice({ message: translateMessage('errorFetchingRecords', resourceId), type: 'error' }); }); return promise; }; React$1.useEffect(() => { if (hasForceRefresh(location.search)) { navigate({ pathname: location.pathname, search: removeForceRefresh(location.search).toString() }, { replace: true }); } else { fetchData(); } }, [resourceId, location.search, location.state]); return { records, loading, page, total, direction, sortBy, perPage, fetchData }; } /** * @load ./use-selected-records.doc.md * @subcategory Hooks * @class * @hideconstructor * @param {Array} records List of records on which you can perform `select` action * @return {UseSelectedRecordsResult} * @bundle * @type {Function} */ function useSelectedRecords(records) { const [selectedRecords, setSelectedRecords] = React$1.useState([]); const handleSelect = record => { const selectedIndex = selectedRecords.findIndex(selected => selected.id === record.id); if (selectedIndex < 0) { setSelectedRecords([...selectedRecords, record]); } else { const newSelectedRecords = [...selectedRecords]; newSelectedRecords.splice(selectedIndex, 1); setSelectedRecords(newSelectedRecords); } }; const handleSelectAll = () => { const missing = records.filter(record => !selectedRecords.find(selected => selected.id === record.id) && record.bulkActions.length); if (missing.length) { setSelectedRecords([...selectedRecords, ...missing]); } else { const newSelectedRecords = selectedRecords.filter(selected => !records.find(record => record.id === selected.id)); setSelectedRecords(newSelectedRecords); } }; return { handleSelect, handleSelectAll, selectedRecords, setSelectedRecords }; } /** * @load ./use-resource.doc.md * @subcategory Hooks * @class * @hideconstructor * @bundle * @param {string} resourceId Id of a resource you want to get */ const useResource = resourceId => { const resources = require$$3.useSelector(state => state.resources); const foundResource = resources.find(resource => resource.id === resourceId); return foundResource; }; const INITIAL_ROUTE = 'INITIAL_ROUTE'; const ROUTE_CHANGED = 'ROUTE_CHANGED'; const initializeRoute = location => ({ type: ROUTE_CHANGED, data: location }); const changeRoute = location => ({ type: ROUTE_CHANGED, data: location }); const useHistoryListen = () => { const location = reactRouter.useLocation(); const [storedPath, setStoredPath] = useLocalStorage('prevPage', {}); const { to = {}, from = {} } = require$$3.useSelector(state => state.router); const dispatch = require$$3.useDispatch(); React$1.useEffect(() => { if (storedPath) { dispatch(initializeRoute(storedPath)); } }, []); React$1.useEffect(() => { const previousPath = [to.pathname, to.search].join(''); const currentPath = [location.pathname, location.search].join(''); if (previousPath !== currentPath) { dispatch(changeRoute(location)); } }, [location]); React$1.useEffect(() => { if (from.pathname) { setStoredPath(from); } }, [from]); }; var Hooks = /*#__PURE__*/Object.freeze({ __proto__: null, useRecord: useRecord, isEntireRecordGiven: isEntireRecordGiven, FORM_VALUE_NULL: FORM_VALUE_NULL, FORM_VALUE_EMPTY_OBJECT: FORM_VALUE_EMPTY_OBJECT, FORM_VALUE_EMPTY_ARRAY: FORM_VALUE_EMPTY_ARRAY, paramsToFormData: paramsToFormData, updateRecord: updateRecord, useAction: useAction, useActionResponseHandler: useActionResponseHandler, useCurrentAdmin: useCurrentAdmin, useLocalStorage: useLocalStorage, useNavigationResources: useNavigationResources, useNotice: useNotice, useRecords: useRecords, useSelectedRecords: useSelectedRecords, useTranslation: useTranslation, useResource: useResource, useHistoryListen: useHistoryListen }); /** * @alias SidebarResourceSectionProps * @memberof SidebarResourceSection */ /** * Groups resources by sections and renders the list in {@link Sidebar} * * ### Usage * * ``` * import { SidebarResourceSection } from 'adminjs` * ``` * * @component * @subcategory Application * @name SidebarResourceSection */ const SidebarResourceSectionOriginal = ({ resources }) => { const elements = useNavigationResources(resources); const { translateLabel } = useTranslation(); return /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Navigation, { label: translateLabel('navigation'), elements: elements }); }; // Rollup cannot handle type exports well - that is why we need to do this hack with // exporting default and named SidebarResourceSection const SidebarResourceSection = allowOverride(SidebarResourceSectionOriginal, 'SidebarResourceSection'); const StyledSidebar = styled__default["default"](DesignSystem.Box).withConfig({ displayName: "sidebar__StyledSidebar", componentId: "sc-rspq5q-0" })(["transition:left 0.3s;top:0;bottom:0;flex-shrink:0;overflow-y:auto;&.hidden{left:-", ";}&.visible{left:0;}"], DesignSystem.themeGet('sizes', 'sidebarWidth')); StyledSidebar.defaultProps = { position: ['absolute', 'absolute', 'absolute', 'absolute', 'inherit'], width: 'sidebarWidth', borderRight: 'default', display: 'flex', flexDirection: 'column', zIndex: 50, bg: 'white' }; const SidebarOriginal = props => { const { isVisible } = props; const [branding, resources, pages] = require$$3.useSelector(state => [state.branding, state.resources, state.pages]); return /*#__PURE__*/React__default$1["default"].createElement(StyledSidebar, { className: isVisible ? 'visible' : 'hidden', "data-css": "sidebar" }, /*#__PURE__*/React__default$1["default"].createElement(SidebarBranding$1, { branding: branding }), /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Box, { flexGrow: 1, className: DesignSystem.cssClass('Resources'), "data-css": "sidebar-resources" }, /*#__PURE__*/React__default$1["default"].createElement(SidebarResourceSection, { resources: resources })), /*#__PURE__*/React__default$1["default"].createElement(SidebarPages$1, { pages: pages }), /*#__PURE__*/React__default$1["default"].createElement(SidebarFooter$1, null)); }; const Sidebar = allowOverride(SidebarOriginal, 'Sidebar'); const LoggedIn = props => { const { session, paths } = props; const { translateButton } = useTranslation(); const dropActions = [{ label: translateButton('logout'), onClick: event => { event.preventDefault(); window.location.href = paths.logoutPath; }, icon: 'Logout' }]; return /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Box, { flexShrink: 0, "data-css": "logged-in" }, /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.CurrentUserNav, { name: session.email, title: session.title, avatarUrl: session.avatarUrl, dropActions: dropActions })); }; const OverridableLoggedIn = allowOverride(LoggedIn, 'LoggedIn'); const VersionItem = styled__default["default"](DesignSystem.Text).withConfig({ displayName: "version__VersionItem", componentId: "sc-r49gcr-0" })(["padding:12px 24px 12px 0;"]); VersionItem.defaultProps = { display: ['none', 'block'], color: 'grey100' }; const Version = props => { const { versions } = props; const { admin, app } = versions; const { translateLabel } = useTranslation(); return /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Box, { flex: true, flexGrow: 1, py: "default", px: "xxl", className: DesignSystem.cssClass('Version'), "data-css": "version" }, admin && /*#__PURE__*/React__default$1["default"].createElement(VersionItem, null, translateLabel('adminVersion', { version: admin })), app && /*#__PURE__*/React__default$1["default"].createElement(VersionItem, null, translateLabel('appVersion', { version: app }))); }; const OverridableVersion = allowOverride(Version, 'Version'); const NavBar = styled__default["default"](DesignSystem.Box).withConfig({ displayName: "top-bar__NavBar", componentId: "sc-vpnnkx-0" })(["height:", ";border-bottom:", ";background:", ";display:flex;flex-direction:row;flex-shrink:0;"], ({ theme }) => theme.sizes.navbarHeight, DesignSystem.themeGet('borders', 'default'), ({ theme }) => theme.colors.white); NavBar.defaultProps = { className: DesignSystem.cssClass('NavBar') }; const TopBar = props => { const { toggleSidebar } = props; const [session, paths, versions] = require$$3.useSelector(state => [state.session, state.paths, state.versions]); return /*#__PURE__*/React__default$1["default"].createElement(NavBar, { "data-css": "topbar" }, /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Box, { py: "lg", px: ['default', 'lg'], onClick: toggleSidebar, display: ['block', 'block', 'block', 'block', 'none'], style: { cursor: 'pointer' } }, /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Icon, { icon: "Menu", size: 32, color: "grey100" })), /*#__PURE__*/React__default$1["default"].createElement(OverridableVersion, { versions: versions }), session && session.email ? /*#__PURE__*/React__default$1["default"].createElement(OverridableLoggedIn, { session: session, paths: paths }) : ''); }; const OverridableTopbar = allowOverride(TopBar, 'TopBar'); const DROP_NOTICE = 'DROP_NOTICE'; const dropNotice = noticeId => ({ type: 'DROP_NOTICE', data: { noticeId } }); const SET_NOTICE_PROGRESS = 'SET_NOTICE_PROGRESS'; const setNoticeProgress = data => ({ type: SET_NOTICE_PROGRESS, data }); const TIME_TO_DISAPPEAR = 3; class NoticeElement extends React__default$1["default"].Component { constructor(props) { super(props); const { notice } = props; this.timer = null; this.state = { progress: notice.progress || 0 }; } componentDidMount() { const { drop, notice, notifyProgress } = this.props; this.timer = setInterval(() => { this.setState(state => { const progress = state.progress + 100 / TIME_TO_DISAPPEAR; notifyProgress({ noticeId: notice.id, progress }); return { progress }; }); }, 1000); setTimeout(() => { if (this.timer) { clearInterval(this.timer); } drop(); }, 1000 * (TIME_TO_DISAPPEAR + 1)); } componentWillUnmount() { if (this.timer) { clearInterval(this.timer); } } render() { const { notice, drop } = this.props; return /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.MessageBox, { style: { minWidth: '480px' }, message: notice.message, variant: notice.type === 'success' ? 'success' : 'danger', onCloseClick: drop }); } } const NoticeBox = props => { const { drop, notices, notifyProgress } = props; const notice = notices.length ? notices[notices.length - 1] : null; if (notice) { return /*#__PURE__*/React__default$1["default"].createElement("div", { "data-testid": "notice-wrapper", "data-css": "notice-wrapper" }, /*#__PURE__*/React__default$1["default"].createElement(NoticeElement, { key: notice.id, notice: notice, drop: () => drop(notice.id), notifyProgress: notifyProgress })); } return /*#__PURE__*/React__default$1["default"].createElement("div", null); }; const mapStateToProps$3 = state => ({ notices: state.notices }); const mapDispatchToProps$3 = dispatch => ({ drop: noticeId => dispatch(dropNotice(noticeId)), notifyProgress: ({ noticeId, progress }) => dispatch(setNoticeProgress({ noticeId, progress })) }); const ConnectedNoticeBox = require$$3.connect(mapStateToProps$3, mapDispatchToProps$3)(NoticeBox); const OverridableConnectedNoticeBox = allowOverride(ConnectedNoticeBox, 'NoticeBox'); const pageHeaderHeight = 284; const pageHeaderPaddingY = 74; const pageHeaderPaddingX = 250; const DashboardHeader = () => { const { translateMessage } = useTranslation(); return /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Box, { position: "relative", overflow: "hidden", "data-css": "default-dashboard" }, /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Box, { position: "absolute", top: 50, left: -10, opacity: [0.2, 0.4, 1], animate: true }, /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Illustration, { variant: "Rocket" })), /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Box, { position: "absolute", top: -70, right: -15, opacity: [0.2, 0.4, 1], animate: true }, /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Illustration, { variant: "Moon" })), /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Box, { bg: "grey100", height: pageHeaderHeight, py: pageHeaderPaddingY, px: ['default', 'lg', pageHeaderPaddingX] }, /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Text, { textAlign: "center", color: "white" }, /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.H2, null, translateMessage('welcomeOnBoard_title')), /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Text, { opacity: 0.8 }, translateMessage('welcomeOnBoard_subtitle'))))); }; const boxes = ({ translateMessage }) => [{ variant: 'Planet', title: translateMessage('addingResources_title'), subtitle: translateMessage('addingResources_subtitle'), href: 'https://adminjs.co/tutorial-passing-resources.html' }, { variant: 'DocumentCheck', title: translateMessage('customizeResources_title'), subtitle: translateMessage('customizeResources_subtitle'), href: 'https://adminjs.co/tutorial-customizing-resources.html' }, { variant: 'DocumentSearch', title: translateMessage('customizeActions_title'), subtitle: translateMessage('customizeActions_subtitle'), href: 'https://adminjs.co/tutorial-actions.html' }, { variant: 'FlagInCog', title: translateMessage('writeOwnComponents_title'), subtitle: translateMessage('writeOwnComponents_subtitle'), href: 'https://adminjs.co/tutorial-writing-react-components.html' }, { variant: 'Folders', title: translateMessage('customDashboard_title'), subtitle: translateMessage('customDashboard_subtitle'), href: 'https://adminjs.co/tutorial-custom-dashboard.html' }, { variant: 'Astronaut', title: translateMessage('roleBasedAccess_title'), subtitle: translateMessage('roleBasedAccess_subtitle'), href: 'https://adminjs.co/tutorial-rbac.html' }]; const Card = styled__default["default"](DesignSystem.Box).withConfig({ displayName: "default-dashboard__Card", componentId: "sc-1be5kmo-0" })(["display:", ";color:", ";text-decoration:none;border:1px solid transparent;&:hover{border:1px solid ", ";box-shadow:", ";}"], ({ flex }) => flex ? 'flex' : 'block', ({ theme }) => theme.colors.grey100, ({ theme }) => theme.colors.primary100, ({ theme }) => theme.shadows.cardHover); Card.defaultProps = { variant: 'white', boxShadow: 'card' }; const Dashboard$1 = () => { const { translateMessage, translateButton } = useTranslation(); return /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Box, null, /*#__PURE__*/React__default$1["default"].createElement(DashboardHeader, null), /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Box, { mt: ['xl', 'xl', '-100px'], mb: "xl", mx: [0, 0, 0, 'auto'], px: ['default', 'lg', 'xxl', '0'], position: "relative", flex: true, flexDirection: "row", flexWrap: "wrap", width: [1, 1, 1, 1024] }, boxes({ translateMessage }).map((box, index) => /*#__PURE__*/ // eslint-disable-next-line react/no-array-index-key React__default$1["default"].createElement(DesignSystem.Box, { key: index, width: [1, 1 / 2, 1 / 2, 1 / 3], p: "lg" }, /*#__PURE__*/React__default$1["default"].createElement(Card, { as: "a", href: box.href, target: "_blank" }, /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Text, { textAlign: "center" }, /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Illustration, { variant: box.variant, width: 100, height: 70 }), /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.H5, { mt: "lg" }, box.title), /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Text, null, box.subtitle))))), /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Box, { width: [1, 1, 1 / 2], p: "lg" }, /*#__PURE__*/React__default$1["default"].createElement(Card, { as: "a", flex: true, href: "https://join.slack.com/t/adminbro/shared_invite/zt-djsqxxpz-_YCS8UMtQ9Ade6DPuLR7Zw", target: "_blank" }, /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Box, { flexShrink: 0 }, /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Illustration, { variant: "SlackLogo" })), /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Box, { ml: "xl" }, /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.H4, null, translateMessage('community_title')), /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Text, null, translateMessage('community_subtitle'))))), /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Box, { width: [1, 1, 1 / 2], p: "lg" }, /*#__PURE__*/React__default$1["default"].createElement(Card, { as: "a", flex: true, href: "https://github.com/SoftwareBrothers/adminjs/issues", target: "_blank" }, /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Box, { flexShrink: 0 }, /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Illustration, { variant: "GithubLogo" })), /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Box, { ml: "xl" }, /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.H4, null, translateMessage('foundBug_title')), /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Text, null, translateMessage('foundBug_subtitle'))))), /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Box, { variant: "white", boxShadow: "card", width: 1, m: "lg" }, /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Text, { textAlign: "center" }, /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Illustration, { variant: "AdminJSLogo" }), /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.H4, null, translateMessage('needMoreSolutions_title')), /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Text, null, translateMessage('needMoreSolutions_subtitle')), /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Text, { mt: "xxl" }, /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Button, { as: "a", variant: "primary", href: "https://share.hsforms.com/1IedvmEz6RH2orhcL6g2UHA8oc5a", target: "_blank" }, translateButton('contactUs'))))))); }; const ErrorMessage = ({ error }) => { const { translateMessage } = useTranslation(); return /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.MessageBox, { m: "xxl", variant: "danger", message: "Javascript Error" }, /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Text, null, error.toString()), /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Text, { mt: "default" }, translateMessage('seeConsoleForMore'))); }; class ErrorBoundary$1 extends React__default$1["default"].Component { constructor(props) { super(props); this.state = { error: null }; } componentDidCatch(error) { this.setState({ error }); } render() { const { children } = this.props; const { error } = this.state; if (error !== null) { return /*#__PURE__*/React__default$1["default"].createElement(ErrorMessage, { error: error }); } return children || null; } } class Dashboard extends React__default$1["default"].Component { constructor(props) { super(props); this.state = { isClient: false }; } componentDidMount() { this.setState({ isClient: true }); } render() { const { dashboard } = this.props; const { isClient } = this.state; let Component; if (dashboard && dashboard.component && isClient && AdminJS.UserComponents[dashboard.component]) { Component = AdminJS.UserComponents[dashboard.component]; } else { Component = Dashboard$1; } return /*#__PURE__*/React__default$1["default"].createElement(ErrorBoundary$1, null, /*#__PURE__*/React__default$1["default"].createElement(Component, null)); } } const mapStateToProps$2 = state => ({ dashboard: state.dashboard }); var DashboardRoute = allowOverride(require$$3.connect(mapStateToProps$2)(Dashboard), 'DashboardRoute'); const BreadcrumbLink = styled__default["default"](reactRouterDom.Link).withConfig({ displayName: "breadcrumbs__BreadcrumbLink", componentId: "sc-tbb6y0-0" })(["color:", ";font-family:", ";line-height:", ";font-size:", ";text-decoration:none;&:hover{color:", ";}&:after{content:'/';padding:0 ", ";}&:last-child{&:after{content:'';}}"], ({ theme }) => theme.colors.grey40, ({ theme }) => theme.font, ({ theme }) => theme.lineHeights.default, ({ theme }) => theme.fontSizes.default, ({ theme }) => theme.colors.primary100, ({ theme }) => theme.space.default); const BreadcrumbText = styled__default["default"](DesignSystem.Text).withConfig({ displayName: "breadcrumbs__BreadcrumbText", componentId: "sc-tbb6y0-1" })(["color:", ";font-family:", ";font-weight:", ";line-height:", ";font-size:", ";cursor:pointer;display:inline;&:after{content:'/';padding:0 ", ";}&:last-child{&:after{content:'';}}"], ({ theme }) => theme.colors.grey40, ({ theme }) => theme.font, ({ theme }) => theme.fontWeights.normal.toString(), ({ theme }) => theme.lineHeights.default, ({ theme }) => theme.fontSizes.default, ({ theme }) => theme.space.default); /** * @memberof Breadcrumbs */ /** * @component * @private */ const Breadcrumbs = props => { const { resource, record, actionName } = props; const listAction = resource.resourceActions.find(({ name }) => name === 'list'); const action = resource.actions.find(a => a.name === actionName); const h = new ViewHelpers(); const { translateLabel: tl } = useTranslation(); const contentTag = getActionElementCss(resource.id, actionName, 'breadcrumbs'); return /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Box, { flexGrow: 1, className: DesignSystem.cssClass('Breadcrumbs'), "data-css": contentTag }, /*#__PURE__*/React__default$1["default"].createElement(BreadcrumbLink, { to: h.dashboardUrl() }, tl('dashboard')), listAction ? /*#__PURE__*/React__default$1["default"].createElement(BreadcrumbLink, { to: resource.href ? resource.href : '/', className: record ? 'is-active' : '' }, resource.name) : /*#__PURE__*/React__default$1["default"].createElement(BreadcrumbText, null, resource.name), action && action.name !== 'list' && /*#__PURE__*/React__default$1["default"].createElement(BreadcrumbLink, { to: "#" }, action.label)); }; const OverridableBreadcrumbs = allowOverride(Breadcrumbs, 'Breadcrumbs'); const actionsToButtonGroup = options => { const { actions, params, handleClick } = options; const buttons = actions.map(action => { const href = actionHref(action, params); return { icon: action.icon, label: action.label, variant: action.variant, source: action, href: href || undefined, // when href is not defined - handle click should also be not defined // This prevents from "cursor: pointer;" onClick: href ? handleClick : undefined, 'data-testid': buildActionTestId(action), buttons: [], 'data-css': `${action.resourceId}-${action.name}-button` }; }); // nesting buttons const buttonsMap = buttons.reduce((memo, button) => { const action = button.source; if (action.parent) { const parent = memo[action.parent] || buttons.find(btn => btn.source.name === action.parent) || { label: action.parent }; parent.buttons = parent.buttons || []; parent.buttons.push(button); return { ...memo, [action.parent]: parent }; } return { ...memo, [button.source.name]: button }; }, {}); return Object.values(buttonsMap); }; const StyledLink$1 = styled__default["default"](({ rounded, ...rest }) => /*#__PURE__*/React__default$1["default"].createElement(reactRouterDom.Link, rest)).withConfig({ displayName: "styled-back-button__StyledLink", componentId: "sc-pn0p1u-0" })(["", ""], DesignSystem.ButtonCSS); const StyledBackButton = props => { const { showInDrawer } = props; const cssCloseIcon = showInDrawer ? 'ChevronRight' : 'ChevronLeft'; const navigate = reactRouterDom.useNavigate(); return /*#__PURE__*/React__default$1["default"].createElement(StyledLink$1, { size: "icon", to: navigate(-1), rounded: true, mr: "lg", type: "button" }, /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Icon, { icon: cssCloseIcon })); }; const OverridableStyledBackButton = allowOverride(StyledBackButton, 'StyledBackButton'); /* eslint-disable jsx-a11y/anchor-is-valid */ /** * Header of an action. It renders Action name with buttons for all the actions. * * ### Usage * * ``` * import { ActionHeader } from 'adminjs' * ``` * * @component * @subcategory Application */ const ActionHeader = props => { const { resource, toggleFilter, actionPerformed, record, action, tag, omitActions } = props; const { translateButton } = useTranslation(); const navigate = reactRouter.useNavigate(); const actionResponseHandler = useActionResponseHandler(actionPerformed); if (action.hideActionHeader) { return null; } const resourceId = resource.id; const params = { resourceId, recordId: record?.id }; const handleActionClick = (event, sourceAction) => buildActionClickHandler({ action: sourceAction, params, actionResponseHandler, navigate })(event); const actionButtons = actionsToButtonGroup({ actions: record ? record.recordActions.filter(ra => !action || action.name !== ra.name) // only new action should be seen in regular "Big" actions place : resource.resourceActions.filter(ra => ra.name === 'new' && (!action || action.name !== ra.name)), params, handleClick: handleActionClick }); if (toggleFilter) { actionButtons.push({ label: translateButton('filter', resource.id), onClick: toggleFilter, icon: 'SettingsAdjust', 'data-css': getResourceElementCss(resource.id, 'filter-button') }); } // list and new actions are special and are are always const customResourceButtons = actionsToButtonGroup({ actions: action.showResourceActions ? resource.resourceActions.filter(ra => !['list', 'new'].includes(ra.name)) : [], params: { resourceId }, handleClick: handleActionClick }); const title = action ? action.label : resource.name; // styled which differs if action header is in the drawer or not const cssIsRootFlex = !action.showInDrawer; const cssHeaderMT = action.showInDrawer ? '' : 'lg'; const cssActionsMB = action.showInDrawer ? 'xl' : 'default'; const CssHComponent = action.showInDrawer ? DesignSystem.H3 : DesignSystem.H2; const contentTag = getActionElementCss(resourceId, action.name, 'action-header'); return /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Box, { className: DesignSystem.cssClass('ActionHeader'), "data-css": contentTag }, action.showInDrawer ? '' : /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Box, { flex: true, flexDirection: "row", px: ['default', 0] }, /*#__PURE__*/React__default$1["default"].createElement(OverridableBreadcrumbs, { resource: resource, actionName: action.name, record: record }), /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Box, { flexShrink: 0 }, /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.ButtonGroup, { size: "sm", rounded: true, buttons: customResourceButtons }))), /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Box, { display: ['block', cssIsRootFlex ? 'flex' : 'block'] }, /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Box, { mt: cssHeaderMT, flexGrow: 1, px: ['default', 0] }, /*#__PURE__*/React__default$1["default"].createElement(CssHComponent, { mb: "lg" }, action.showInDrawer ? /*#__PURE__*/React__default$1["default"].createElement(OverridableStyledBackButton, { showInDrawer: action.showInDrawer }) : '', title, tag ? /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Badge, { variant: "primary", ml: "default" }, tag) : '')), omitActions ? '' : /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Box, { mt: "xl", mb: cssActionsMB, flexShrink: 0 }, /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.ButtonGroup, { buttons: actionButtons })))); }; const OverridableActionHeader = allowOverride(ActionHeader, 'ActionHeader'); var dnd_cjs = {}; var useMemoOne_cjs = {}; Object.defineProperty(useMemoOne_cjs, '__esModule', { value: true }); var react = React__default$1["default"]; function areInputsEqual$1(newInputs, lastInputs) { if (newInputs.length !== lastInputs.length) { return false; } for (var i = 0; i < newInputs.length; i++) { if (newInputs[i] !== lastInputs[i]) { return false; } } return true; } function useMemoOne$1(getResult, inputs) { var initial = react.useState(function () { return { inputs: inputs, result: getResult() }; })[0]; var isFirstRun = react.useRef(true); var committed = react.useRef(initial); var useCache = isFirstRun.current || Boolean(inputs && committed.current.inputs && areInputsEqual$1(inputs, committed.current.inputs)); var cache = useCache ? committed.current : { inputs: inputs, result: getResult() }; react.useEffect(function () { isFirstRun.current = false; committed.current = cache; }, [cache]); return cache.result; } function useCallbackOne(callback, inputs) { return useMemoOne$1(function () { return callback; }, inputs); } var useMemo = useMemoOne$1; var useCallback = useCallbackOne; useMemoOne_cjs.useCallback = useCallback; useMemoOne_cjs.useCallbackOne = useCallbackOne; useMemoOne_cjs.useMemo = useMemo; useMemoOne_cjs.useMemoOne = useMemoOne$1; var cssBoxModel_cjs = {}; var prefix$2 = 'Invariant failed'; function invariant$2(condition, message) { if (condition) { return; } var provided = typeof message === 'function' ? message() : message; var value = provided ? "".concat(prefix$2, ": ").concat(provided) : prefix$2; throw new Error(value); } var tinyInvariant_cjs = invariant$2; Object.defineProperty(cssBoxModel_cjs, '__esModule', { value: true }); function _interopDefault$1 (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; } var invariant$1 = _interopDefault$1(tinyInvariant_cjs); var getRect = function getRect(_ref) { var top = _ref.top, right = _ref.right, bottom = _ref.bottom, left = _ref.left; var width = right - left; var height = bottom - top; var rect = { top: top, right: right, bottom: bottom, left: left, width: width, height: height, x: left, y: top, center: { x: (right + left) / 2, y: (bottom + top) / 2 } }; return rect; }; var expand = function expand(target, expandBy) { return { top: target.top - expandBy.top, left: target.left - expandBy.left, bottom: target.bottom + expandBy.bottom, right: target.right + expandBy.right }; }; var shrink = function shrink(target, shrinkBy) { return { top: target.top + shrinkBy.top, left: target.left + shrinkBy.left, bottom: target.bottom - shrinkBy.bottom, right: target.right - shrinkBy.right }; }; var shift = function shift(target, shiftBy) { return { top: target.top + shiftBy.y, left: target.left + shiftBy.x, bottom: target.bottom + shiftBy.y, right: target.right + shiftBy.x }; }; var noSpacing$1 = { top: 0, right: 0, bottom: 0, left: 0 }; var createBox = function createBox(_ref2) { var borderBox = _ref2.borderBox, _ref2$margin = _ref2.margin, margin = _ref2$margin === void 0 ? noSpacing$1 : _ref2$margin, _ref2$border = _ref2.border, border = _ref2$border === void 0 ? noSpacing$1 : _ref2$border, _ref2$padding = _ref2.padding, padding = _ref2$padding === void 0 ? noSpacing$1 : _ref2$padding; var marginBox = getRect(expand(borderBox, margin)); var paddingBox = getRect(shrink(borderBox, border)); var contentBox = getRect(shrink(paddingBox, padding)); return { marginBox: marginBox, borderBox: getRect(borderBox), paddingBox: paddingBox, contentBox: contentBox, margin: margin, border: border, padding: padding }; }; var parse = function parse(raw) { var value = raw.slice(0, -2); var suffix = raw.slice(-2); if (suffix !== 'px') { return 0; } var result = Number(value); !!isNaN(result) ? invariant$1(false, "Could not parse value [raw: " + raw + ", without suffix: " + value + "]") : void 0; return result; }; var getWindowScroll$1 = function getWindowScroll() { return { x: window.pageXOffset, y: window.pageYOffset }; }; var offset = function offset(original, change) { var borderBox = original.borderBox, border = original.border, margin = original.margin, padding = original.padding; var shifted = shift(borderBox, change); return createBox({ borderBox: shifted, border: border, margin: margin, padding: padding }); }; var withScroll = function withScroll(original, scroll) { if (scroll === void 0) { scroll = getWindowScroll$1(); } return offset(original, scroll); }; var calculateBox = function calculateBox(borderBox, styles) { var margin = { top: parse(styles.marginTop), right: parse(styles.marginRight), bottom: parse(styles.marginBottom), left: parse(styles.marginLeft) }; var padding = { top: parse(styles.paddingTop), right: parse(styles.paddingRight), bottom: parse(styles.paddingBottom), left: parse(styles.paddingLeft) }; var border = { top: parse(styles.borderTopWidth), right: parse(styles.borderRightWidth), bottom: parse(styles.borderBottomWidth), left: parse(styles.borderLeftWidth) }; return createBox({ borderBox: borderBox, margin: margin, padding: padding, border: border }); }; var getBox = function getBox(el) { var borderBox = el.getBoundingClientRect(); var styles = window.getComputedStyle(el); return calculateBox(borderBox, styles); }; cssBoxModel_cjs.calculateBox = calculateBox; cssBoxModel_cjs.createBox = createBox; cssBoxModel_cjs.expand = expand; cssBoxModel_cjs.getBox = getBox; cssBoxModel_cjs.getRect = getRect; cssBoxModel_cjs.offset = offset; cssBoxModel_cjs.shrink = shrink; cssBoxModel_cjs.withScroll = withScroll; var safeIsNaN = Number.isNaN || function ponyfill(value) { return typeof value === 'number' && value !== value; }; function isEqual$2(first, second) { if (first === second) { return true; } if (safeIsNaN(first) && safeIsNaN(second)) { return true; } return false; } function areInputsEqual(newInputs, lastInputs) { if (newInputs.length !== lastInputs.length) { return false; } for (var i = 0; i < newInputs.length; i++) { if (!isEqual$2(newInputs[i], lastInputs[i])) { return false; } } return true; } function memoizeOne$1(resultFn, isEqual) { if (isEqual === void 0) { isEqual = areInputsEqual; } var cache = null; function memoized() { var newArgs = []; for (var _i = 0; _i < arguments.length; _i++) { newArgs[_i] = arguments[_i]; } if (cache && cache.lastThis === this && isEqual(newArgs, cache.lastArgs)) { return cache.lastResult; } var lastResult = resultFn.apply(this, newArgs); cache = { lastResult: lastResult, lastArgs: newArgs, lastThis: this, }; return lastResult; } memoized.clear = function clear() { cache = null; }; return memoized; } var memoizeOne_cjs = memoizeOne$1; var rafSchd$1 = function rafSchd(fn) { var lastArgs = []; var frameId = null; var wrapperFn = function wrapperFn() { for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } lastArgs = args; if (frameId) { return; } frameId = requestAnimationFrame(function () { frameId = null; fn.apply(void 0, lastArgs); }); }; wrapperFn.cancel = function () { if (!frameId) { return; } cancelAnimationFrame(frameId); frameId = null; }; return wrapperFn; }; var rafSchd_cjs = rafSchd$1; var _extends$1 = {exports: {}}; (function (module) { function _extends() { module.exports = _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }, module.exports.__esModule = true, module.exports["default"] = module.exports; return _extends.apply(this, arguments); } module.exports = _extends, module.exports.__esModule = true, module.exports["default"] = module.exports; } (_extends$1)); Object.defineProperty(dnd_cjs, '__esModule', { value: true }); var React = React__default$1["default"]; var ReactDOM = require$$1__default["default"]; var redux = require$$2__default["default"]; var reactRedux = require$$3__default["default"]; var useMemoOne = useMemoOne_cjs; var cssBoxModel = cssBoxModel_cjs; var memoizeOne = memoizeOne_cjs; var rafSchd = rafSchd_cjs; var _extends = _extends$1.exports; function _interopDefaultLegacy$1 (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; } var React__default = /*#__PURE__*/_interopDefaultLegacy$1(React); var ReactDOM__default = /*#__PURE__*/_interopDefaultLegacy$1(ReactDOM); var memoizeOne__default = /*#__PURE__*/_interopDefaultLegacy$1(memoizeOne); var rafSchd__default = /*#__PURE__*/_interopDefaultLegacy$1(rafSchd); var _extends__default = /*#__PURE__*/_interopDefaultLegacy$1(_extends); const spacesAndTabs = /[ \t]{2,}/g; const lineStartWithSpaces = /^[ \t]*/gm; const clean$2 = value => value.replace(spacesAndTabs, ' ').replace(lineStartWithSpaces, '').trim(); const getDevMessage = message => clean$2(` %c@hello-pangea/dnd %c${clean$2(message)} %c👷‍ This is a development only message. It will be removed in production builds. `); const getFormattedMessage = message => [getDevMessage(message), 'color: #00C584; font-size: 1.2em; font-weight: bold;', 'line-height: 1.5', 'color: #723874;']; const isDisabledFlag = '__@hello-pangea/dnd-disable-dev-warnings'; function log(type, message) { if (typeof window !== 'undefined' && window[isDisabledFlag]) { return; } console[type](...getFormattedMessage(message)); } const warning = log.bind(null, 'warn'); const error = log.bind(null, 'error'); function noop$2() {} function getOptions(shared, fromBinding) { return { ...shared, ...fromBinding }; } function bindEvents(el, bindings, sharedOptions) { const unbindings = bindings.map(binding => { const options = getOptions(sharedOptions, binding.options); el.addEventListener(binding.eventName, binding.fn, options); return function unbind() { el.removeEventListener(binding.eventName, binding.fn, options); }; }); return function unbindAll() { unbindings.forEach(unbind => { unbind(); }); }; } const prefix$1 = 'Invariant failed'; class RbdInvariant extends Error {} RbdInvariant.prototype.toString = function toString() { return this.message; }; function invariant(condition, message) { if (condition) { return; } { throw new RbdInvariant(`${prefix$1}: ${message || ''}`); } } class ErrorBoundary extends React__default["default"].Component { constructor() { super(...arguments); this.callbacks = null; this.unbind = noop$2; this.onWindowError = event => { const callbacks = this.getCallbacks(); if (callbacks.isDragging()) { callbacks.tryAbort(); warning(` An error was caught by our window 'error' event listener while a drag was occurring. The active drag has been aborted. `) ; } const err = event.error; if (err instanceof RbdInvariant) { event.preventDefault(); { error(err.message); } } }; this.getCallbacks = () => { if (!this.callbacks) { throw new Error('Unable to find AppCallbacks in '); } return this.callbacks; }; this.setCallbacks = callbacks => { this.callbacks = callbacks; }; } componentDidMount() { this.unbind = bindEvents(window, [{ eventName: 'error', fn: this.onWindowError }]); } componentDidCatch(err) { if (err instanceof RbdInvariant) { { error(err.message); } this.setState({}); return; } throw err; } componentWillUnmount() { this.unbind(); } render() { return this.props.children(this.setCallbacks); } } const dragHandleUsageInstructions = ` Press space bar to start a drag. When dragging you can use the arrow keys to move the item around and escape to cancel. Some screen readers may require you to be in focus mode or to use your pass through key `; const position = index => index + 1; const onDragStart = start => ` You have lifted an item in position ${position(start.source.index)} `; const withLocation = (source, destination) => { const isInHomeList = source.droppableId === destination.droppableId; const startPosition = position(source.index); const endPosition = position(destination.index); if (isInHomeList) { return ` You have moved the item from position ${startPosition} to position ${endPosition} `; } return ` You have moved the item from position ${startPosition} in list ${source.droppableId} to list ${destination.droppableId} in position ${endPosition} `; }; const withCombine = (id, source, combine) => { const inHomeList = source.droppableId === combine.droppableId; if (inHomeList) { return ` The item ${id} has been combined with ${combine.draggableId}`; } return ` The item ${id} in list ${source.droppableId} has been combined with ${combine.draggableId} in list ${combine.droppableId} `; }; const onDragUpdate = update => { const location = update.destination; if (location) { return withLocation(update.source, location); } const combine = update.combine; if (combine) { return withCombine(update.draggableId, update.source, combine); } return 'You are over an area that cannot be dropped on'; }; const returnedToStart = source => ` The item has returned to its starting position of ${position(source.index)} `; const onDragEnd = result => { if (result.reason === 'CANCEL') { return ` Movement cancelled. ${returnedToStart(result.source)} `; } const location = result.destination; const combine = result.combine; if (location) { return ` You have dropped the item. ${withLocation(result.source, location)} `; } if (combine) { return ` You have dropped the item. ${withCombine(result.draggableId, result.source, combine)} `; } return ` The item has been dropped while not over a drop area. ${returnedToStart(result.source)} `; }; const preset = { dragHandleUsageInstructions, onDragStart, onDragUpdate, onDragEnd }; var preset$1 = preset; const origin = { x: 0, y: 0 }; const add = (point1, point2) => ({ x: point1.x + point2.x, y: point1.y + point2.y }); const subtract = (point1, point2) => ({ x: point1.x - point2.x, y: point1.y - point2.y }); const isEqual$1 = (point1, point2) => point1.x === point2.x && point1.y === point2.y; const negate = point => ({ x: point.x !== 0 ? -point.x : 0, y: point.y !== 0 ? -point.y : 0 }); const patch = function (line, value, otherValue) { if (otherValue === void 0) { otherValue = 0; } if (line === 'x') { return { x: value, y: otherValue }; } return { x: otherValue, y: value }; }; const distance = (point1, point2) => Math.sqrt((point2.x - point1.x) ** 2 + (point2.y - point1.y) ** 2); const closest$1 = (target, points) => Math.min(...points.map(point => distance(target, point))); const apply = fn => point => ({ x: fn(point.x), y: fn(point.y) }); var executeClip = ((frame, subject) => { const result = cssBoxModel.getRect({ top: Math.max(subject.top, frame.top), right: Math.min(subject.right, frame.right), bottom: Math.min(subject.bottom, frame.bottom), left: Math.max(subject.left, frame.left) }); if (result.width <= 0 || result.height <= 0) { return null; } return result; }); const offsetByPosition = (spacing, point) => ({ top: spacing.top + point.y, left: spacing.left + point.x, bottom: spacing.bottom + point.y, right: spacing.right + point.x }); const getCorners = spacing => [{ x: spacing.left, y: spacing.top }, { x: spacing.right, y: spacing.top }, { x: spacing.left, y: spacing.bottom }, { x: spacing.right, y: spacing.bottom }]; const noSpacing = { top: 0, right: 0, bottom: 0, left: 0 }; const scroll$1 = (target, frame) => { if (!frame) { return target; } return offsetByPosition(target, frame.scroll.diff.displacement); }; const increase = (target, axis, withPlaceholder) => { if (withPlaceholder && withPlaceholder.increasedBy) { return { ...target, [axis.end]: target[axis.end] + withPlaceholder.increasedBy[axis.line] }; } return target; }; const clip = (target, frame) => { if (frame && frame.shouldClipSubject) { return executeClip(frame.pageMarginBox, target); } return cssBoxModel.getRect(target); }; var getSubject = (_ref => { let { page, withPlaceholder, axis, frame } = _ref; const scrolled = scroll$1(page.marginBox, frame); const increased = increase(scrolled, axis, withPlaceholder); const clipped = clip(increased, frame); return { page, withPlaceholder, active: clipped }; }); var scrollDroppable = ((droppable, newScroll) => { !droppable.frame ? invariant(false) : void 0; const scrollable = droppable.frame; const scrollDiff = subtract(newScroll, scrollable.scroll.initial); const scrollDisplacement = negate(scrollDiff); const frame = { ...scrollable, scroll: { initial: scrollable.scroll.initial, current: newScroll, diff: { value: scrollDiff, displacement: scrollDisplacement }, max: scrollable.scroll.max } }; const subject = getSubject({ page: droppable.subject.page, withPlaceholder: droppable.subject.withPlaceholder, axis: droppable.axis, frame }); const result = { ...droppable, frame, subject }; return result; }); const toDroppableMap = memoizeOne__default["default"](droppables => droppables.reduce((previous, current) => { previous[current.descriptor.id] = current; return previous; }, {})); const toDraggableMap = memoizeOne__default["default"](draggables => draggables.reduce((previous, current) => { previous[current.descriptor.id] = current; return previous; }, {})); const toDroppableList = memoizeOne__default["default"](droppables => Object.values(droppables)); const toDraggableList = memoizeOne__default["default"](draggables => Object.values(draggables)); var getDraggablesInsideDroppable = memoizeOne__default["default"]((droppableId, draggables) => { const result = toDraggableList(draggables).filter(draggable => droppableId === draggable.descriptor.droppableId).sort((a, b) => a.descriptor.index - b.descriptor.index); return result; }); function tryGetDestination(impact) { if (impact.at && impact.at.type === 'REORDER') { return impact.at.destination; } return null; } function tryGetCombine(impact) { if (impact.at && impact.at.type === 'COMBINE') { return impact.at.combine; } return null; } var removeDraggableFromList = memoizeOne__default["default"]((remove, list) => list.filter(item => item.descriptor.id !== remove.descriptor.id)); var moveToNextCombine = (_ref => { let { isMovingForward, draggable, destination, insideDestination, previousImpact } = _ref; if (!destination.isCombineEnabled) { return null; } const location = tryGetDestination(previousImpact); if (!location) { return null; } function getImpact(target) { const at = { type: 'COMBINE', combine: { draggableId: target, droppableId: destination.descriptor.id } }; return { ...previousImpact, at }; } const all = previousImpact.displaced.all; const closestId = all.length ? all[0] : null; if (isMovingForward) { return closestId ? getImpact(closestId) : null; } const withoutDraggable = removeDraggableFromList(draggable, insideDestination); if (!closestId) { if (!withoutDraggable.length) { return null; } const last = withoutDraggable[withoutDraggable.length - 1]; return getImpact(last.descriptor.id); } const indexOfClosest = withoutDraggable.findIndex(d => d.descriptor.id === closestId); !(indexOfClosest !== -1) ? invariant(false, 'Could not find displaced item in set') : void 0; const proposedIndex = indexOfClosest - 1; if (proposedIndex < 0) { return null; } const before = withoutDraggable[proposedIndex]; return getImpact(before.descriptor.id); }); var isHomeOf = ((draggable, destination) => draggable.descriptor.droppableId === destination.descriptor.id); const noDisplacedBy = { point: origin, value: 0 }; const emptyGroups = { invisible: {}, visible: {}, all: [] }; const noImpact = { displaced: emptyGroups, displacedBy: noDisplacedBy, at: null }; var noImpact$1 = noImpact; var isWithin = ((lowerBound, upperBound) => value => lowerBound <= value && value <= upperBound); var isPartiallyVisibleThroughFrame = (frame => { const isWithinVertical = isWithin(frame.top, frame.bottom); const isWithinHorizontal = isWithin(frame.left, frame.right); return subject => { const isContained = isWithinVertical(subject.top) && isWithinVertical(subject.bottom) && isWithinHorizontal(subject.left) && isWithinHorizontal(subject.right); if (isContained) { return true; } const isPartiallyVisibleVertically = isWithinVertical(subject.top) || isWithinVertical(subject.bottom); const isPartiallyVisibleHorizontally = isWithinHorizontal(subject.left) || isWithinHorizontal(subject.right); const isPartiallyContained = isPartiallyVisibleVertically && isPartiallyVisibleHorizontally; if (isPartiallyContained) { return true; } const isBiggerVertically = subject.top < frame.top && subject.bottom > frame.bottom; const isBiggerHorizontally = subject.left < frame.left && subject.right > frame.right; const isTargetBiggerThanFrame = isBiggerVertically && isBiggerHorizontally; if (isTargetBiggerThanFrame) { return true; } const isTargetBiggerOnOneAxis = isBiggerVertically && isPartiallyVisibleHorizontally || isBiggerHorizontally && isPartiallyVisibleVertically; return isTargetBiggerOnOneAxis; }; }); var isTotallyVisibleThroughFrame = (frame => { const isWithinVertical = isWithin(frame.top, frame.bottom); const isWithinHorizontal = isWithin(frame.left, frame.right); return subject => { const isContained = isWithinVertical(subject.top) && isWithinVertical(subject.bottom) && isWithinHorizontal(subject.left) && isWithinHorizontal(subject.right); return isContained; }; }); const vertical = { direction: 'vertical', line: 'y', crossAxisLine: 'x', start: 'top', end: 'bottom', size: 'height', crossAxisStart: 'left', crossAxisEnd: 'right', crossAxisSize: 'width' }; const horizontal = { direction: 'horizontal', line: 'x', crossAxisLine: 'y', start: 'left', end: 'right', size: 'width', crossAxisStart: 'top', crossAxisEnd: 'bottom', crossAxisSize: 'height' }; var isTotallyVisibleThroughFrameOnAxis = (axis => frame => { const isWithinVertical = isWithin(frame.top, frame.bottom); const isWithinHorizontal = isWithin(frame.left, frame.right); return subject => { if (axis === vertical) { return isWithinVertical(subject.top) && isWithinVertical(subject.bottom); } return isWithinHorizontal(subject.left) && isWithinHorizontal(subject.right); }; }); const getDroppableDisplaced = (target, destination) => { const displacement = destination.frame ? destination.frame.scroll.diff.displacement : origin; return offsetByPosition(target, displacement); }; const isVisibleInDroppable = (target, destination, isVisibleThroughFrameFn) => { if (!destination.subject.active) { return false; } return isVisibleThroughFrameFn(destination.subject.active)(target); }; const isVisibleInViewport = (target, viewport, isVisibleThroughFrameFn) => isVisibleThroughFrameFn(viewport)(target); const isVisible$1 = _ref => { let { target: toBeDisplaced, destination, viewport, withDroppableDisplacement, isVisibleThroughFrameFn } = _ref; const displacedTarget = withDroppableDisplacement ? getDroppableDisplaced(toBeDisplaced, destination) : toBeDisplaced; return isVisibleInDroppable(displacedTarget, destination, isVisibleThroughFrameFn) && isVisibleInViewport(displacedTarget, viewport, isVisibleThroughFrameFn); }; const isPartiallyVisible = args => isVisible$1({ ...args, isVisibleThroughFrameFn: isPartiallyVisibleThroughFrame }); const isTotallyVisible = args => isVisible$1({ ...args, isVisibleThroughFrameFn: isTotallyVisibleThroughFrame }); const isTotallyVisibleOnAxis = args => isVisible$1({ ...args, isVisibleThroughFrameFn: isTotallyVisibleThroughFrameOnAxis(args.destination.axis) }); const getShouldAnimate = (id, last, forceShouldAnimate) => { if (typeof forceShouldAnimate === 'boolean') { return forceShouldAnimate; } if (!last) { return true; } const { invisible, visible } = last; if (invisible[id]) { return false; } const previous = visible[id]; return previous ? previous.shouldAnimate : true; }; function getTarget(draggable, displacedBy) { const marginBox = draggable.page.marginBox; const expandBy = { top: displacedBy.point.y, right: 0, bottom: 0, left: displacedBy.point.x }; return cssBoxModel.getRect(cssBoxModel.expand(marginBox, expandBy)); } function getDisplacementGroups(_ref) { let { afterDragging, destination, displacedBy, viewport, forceShouldAnimate, last } = _ref; return afterDragging.reduce(function process(groups, draggable) { const target = getTarget(draggable, displacedBy); const id = draggable.descriptor.id; groups.all.push(id); const isVisible = isPartiallyVisible({ target, destination, viewport, withDroppableDisplacement: true }); if (!isVisible) { groups.invisible[draggable.descriptor.id] = true; return groups; } const shouldAnimate = getShouldAnimate(id, last, forceShouldAnimate); const displacement = { draggableId: id, shouldAnimate }; groups.visible[id] = displacement; return groups; }, { all: [], visible: {}, invisible: {} }); } function getIndexOfLastItem(draggables, options) { if (!draggables.length) { return 0; } const indexOfLastItem = draggables[draggables.length - 1].descriptor.index; return options.inHomeList ? indexOfLastItem : indexOfLastItem + 1; } function goAtEnd(_ref) { let { insideDestination, inHomeList, displacedBy, destination } = _ref; const newIndex = getIndexOfLastItem(insideDestination, { inHomeList }); return { displaced: emptyGroups, displacedBy, at: { type: 'REORDER', destination: { droppableId: destination.descriptor.id, index: newIndex } } }; } function calculateReorderImpact(_ref2) { let { draggable, insideDestination, destination, viewport, displacedBy, last, index, forceShouldAnimate } = _ref2; const inHomeList = isHomeOf(draggable, destination); if (index == null) { return goAtEnd({ insideDestination, inHomeList, displacedBy, destination }); } const match = insideDestination.find(item => item.descriptor.index === index); if (!match) { return goAtEnd({ insideDestination, inHomeList, displacedBy, destination }); } const withoutDragging = removeDraggableFromList(draggable, insideDestination); const sliceFrom = insideDestination.indexOf(match); const impacted = withoutDragging.slice(sliceFrom); const displaced = getDisplacementGroups({ afterDragging: impacted, destination, displacedBy, last, viewport: viewport.frame, forceShouldAnimate }); return { displaced, displacedBy, at: { type: 'REORDER', destination: { droppableId: destination.descriptor.id, index } } }; } function didStartAfterCritical(draggableId, afterCritical) { return Boolean(afterCritical.effected[draggableId]); } var fromCombine = (_ref => { let { isMovingForward, destination, draggables, combine, afterCritical } = _ref; if (!destination.isCombineEnabled) { return null; } const combineId = combine.draggableId; const combineWith = draggables[combineId]; const combineWithIndex = combineWith.descriptor.index; const didCombineWithStartAfterCritical = didStartAfterCritical(combineId, afterCritical); if (didCombineWithStartAfterCritical) { if (isMovingForward) { return combineWithIndex; } return combineWithIndex - 1; } if (isMovingForward) { return combineWithIndex + 1; } return combineWithIndex; }); var fromReorder = (_ref => { let { isMovingForward, isInHomeList, insideDestination, location } = _ref; if (!insideDestination.length) { return null; } const currentIndex = location.index; const proposedIndex = isMovingForward ? currentIndex + 1 : currentIndex - 1; const firstIndex = insideDestination[0].descriptor.index; const lastIndex = insideDestination[insideDestination.length - 1].descriptor.index; const upperBound = isInHomeList ? lastIndex : lastIndex + 1; if (proposedIndex < firstIndex) { return null; } if (proposedIndex > upperBound) { return null; } return proposedIndex; }); var moveToNextIndex = (_ref => { let { isMovingForward, isInHomeList, draggable, draggables, destination, insideDestination, previousImpact, viewport, afterCritical } = _ref; const wasAt = previousImpact.at; !wasAt ? invariant(false, 'Cannot move in direction without previous impact location') : void 0; if (wasAt.type === 'REORDER') { const newIndex = fromReorder({ isMovingForward, isInHomeList, location: wasAt.destination, insideDestination }); if (newIndex == null) { return null; } return calculateReorderImpact({ draggable, insideDestination, destination, viewport, last: previousImpact.displaced, displacedBy: previousImpact.displacedBy, index: newIndex }); } const newIndex = fromCombine({ isMovingForward, destination, displaced: previousImpact.displaced, draggables, combine: wasAt.combine, afterCritical }); if (newIndex == null) { return null; } return calculateReorderImpact({ draggable, insideDestination, destination, viewport, last: previousImpact.displaced, displacedBy: previousImpact.displacedBy, index: newIndex }); }); var getCombinedItemDisplacement = (_ref => { let { displaced, afterCritical, combineWith, displacedBy } = _ref; const isDisplaced = Boolean(displaced.visible[combineWith] || displaced.invisible[combineWith]); if (didStartAfterCritical(combineWith, afterCritical)) { return isDisplaced ? origin : negate(displacedBy.point); } return isDisplaced ? displacedBy.point : origin; }); var whenCombining = (_ref => { let { afterCritical, impact, draggables } = _ref; const combine = tryGetCombine(impact); !combine ? invariant(false) : void 0; const combineWith = combine.draggableId; const center = draggables[combineWith].page.borderBox.center; const displaceBy = getCombinedItemDisplacement({ displaced: impact.displaced, afterCritical, combineWith, displacedBy: impact.displacedBy }); return add(center, displaceBy); }); const distanceFromStartToBorderBoxCenter = (axis, box) => box.margin[axis.start] + box.borderBox[axis.size] / 2; const distanceFromEndToBorderBoxCenter = (axis, box) => box.margin[axis.end] + box.borderBox[axis.size] / 2; const getCrossAxisBorderBoxCenter = (axis, target, isMoving) => target[axis.crossAxisStart] + isMoving.margin[axis.crossAxisStart] + isMoving.borderBox[axis.crossAxisSize] / 2; const goAfter = _ref => { let { axis, moveRelativeTo, isMoving } = _ref; return patch(axis.line, moveRelativeTo.marginBox[axis.end] + distanceFromStartToBorderBoxCenter(axis, isMoving), getCrossAxisBorderBoxCenter(axis, moveRelativeTo.marginBox, isMoving)); }; const goBefore = _ref2 => { let { axis, moveRelativeTo, isMoving } = _ref2; return patch(axis.line, moveRelativeTo.marginBox[axis.start] - distanceFromEndToBorderBoxCenter(axis, isMoving), getCrossAxisBorderBoxCenter(axis, moveRelativeTo.marginBox, isMoving)); }; const goIntoStart = _ref3 => { let { axis, moveInto, isMoving } = _ref3; return patch(axis.line, moveInto.contentBox[axis.start] + distanceFromStartToBorderBoxCenter(axis, isMoving), getCrossAxisBorderBoxCenter(axis, moveInto.contentBox, isMoving)); }; var whenReordering = (_ref => { let { impact, draggable, draggables, droppable, afterCritical } = _ref; const insideDestination = getDraggablesInsideDroppable(droppable.descriptor.id, draggables); const draggablePage = draggable.page; const axis = droppable.axis; if (!insideDestination.length) { return goIntoStart({ axis, moveInto: droppable.page, isMoving: draggablePage }); } const { displaced, displacedBy } = impact; const closestAfter = displaced.all[0]; if (closestAfter) { const closest = draggables[closestAfter]; if (didStartAfterCritical(closestAfter, afterCritical)) { return goBefore({ axis, moveRelativeTo: closest.page, isMoving: draggablePage }); } const withDisplacement = cssBoxModel.offset(closest.page, displacedBy.point); return goBefore({ axis, moveRelativeTo: withDisplacement, isMoving: draggablePage }); } const last = insideDestination[insideDestination.length - 1]; if (last.descriptor.id === draggable.descriptor.id) { return draggablePage.borderBox.center; } if (didStartAfterCritical(last.descriptor.id, afterCritical)) { const page = cssBoxModel.offset(last.page, negate(afterCritical.displacedBy.point)); return goAfter({ axis, moveRelativeTo: page, isMoving: draggablePage }); } return goAfter({ axis, moveRelativeTo: last.page, isMoving: draggablePage }); }); var withDroppableDisplacement = ((droppable, point) => { const frame = droppable.frame; if (!frame) { return point; } return add(point, frame.scroll.diff.displacement); }); const getResultWithoutDroppableDisplacement = _ref => { let { impact, draggable, droppable, draggables, afterCritical } = _ref; const original = draggable.page.borderBox.center; const at = impact.at; if (!droppable) { return original; } if (!at) { return original; } if (at.type === 'REORDER') { return whenReordering({ impact, draggable, draggables, droppable, afterCritical }); } return whenCombining({ impact, draggables, afterCritical }); }; var getPageBorderBoxCenterFromImpact = (args => { const withoutDisplacement = getResultWithoutDroppableDisplacement(args); const droppable = args.droppable; const withDisplacement = droppable ? withDroppableDisplacement(droppable, withoutDisplacement) : withoutDisplacement; return withDisplacement; }); var scrollViewport = ((viewport, newScroll) => { const diff = subtract(newScroll, viewport.scroll.initial); const displacement = negate(diff); const frame = cssBoxModel.getRect({ top: newScroll.y, bottom: newScroll.y + viewport.frame.height, left: newScroll.x, right: newScroll.x + viewport.frame.width }); const updated = { frame, scroll: { initial: viewport.scroll.initial, max: viewport.scroll.max, current: newScroll, diff: { value: diff, displacement } } }; return updated; }); function getDraggables$1(ids, draggables) { return ids.map(id => draggables[id]); } function tryGetVisible(id, groups) { for (let i = 0; i < groups.length; i++) { const displacement = groups[i].visible[id]; if (displacement) { return displacement; } } return null; } var speculativelyIncrease = (_ref => { let { impact, viewport, destination, draggables, maxScrollChange } = _ref; const scrolledViewport = scrollViewport(viewport, add(viewport.scroll.current, maxScrollChange)); const scrolledDroppable = destination.frame ? scrollDroppable(destination, add(destination.frame.scroll.current, maxScrollChange)) : destination; const last = impact.displaced; const withViewportScroll = getDisplacementGroups({ afterDragging: getDraggables$1(last.all, draggables), destination, displacedBy: impact.displacedBy, viewport: scrolledViewport.frame, last, forceShouldAnimate: false }); const withDroppableScroll = getDisplacementGroups({ afterDragging: getDraggables$1(last.all, draggables), destination: scrolledDroppable, displacedBy: impact.displacedBy, viewport: viewport.frame, last, forceShouldAnimate: false }); const invisible = {}; const visible = {}; const groups = [last, withViewportScroll, withDroppableScroll]; last.all.forEach(id => { const displacement = tryGetVisible(id, groups); if (displacement) { visible[id] = displacement; return; } invisible[id] = true; }); const newImpact = { ...impact, displaced: { all: last.all, invisible, visible } }; return newImpact; }); var withViewportDisplacement = ((viewport, point) => add(viewport.scroll.diff.displacement, point)); var getClientFromPageBorderBoxCenter = (_ref => { let { pageBorderBoxCenter, draggable, viewport } = _ref; const withoutPageScrollChange = withViewportDisplacement(viewport, pageBorderBoxCenter); const offset = subtract(withoutPageScrollChange, draggable.page.borderBox.center); return add(draggable.client.borderBox.center, offset); }); var isTotallyVisibleInNewLocation = (_ref => { let { draggable, destination, newPageBorderBoxCenter, viewport, withDroppableDisplacement, onlyOnMainAxis = false } = _ref; const changeNeeded = subtract(newPageBorderBoxCenter, draggable.page.borderBox.center); const shifted = offsetByPosition(draggable.page.borderBox, changeNeeded); const args = { target: shifted, destination, withDroppableDisplacement, viewport }; return onlyOnMainAxis ? isTotallyVisibleOnAxis(args) : isTotallyVisible(args); }); var moveToNextPlace = (_ref => { let { isMovingForward, draggable, destination, draggables, previousImpact, viewport, previousPageBorderBoxCenter, previousClientSelection, afterCritical } = _ref; if (!destination.isEnabled) { return null; } const insideDestination = getDraggablesInsideDroppable(destination.descriptor.id, draggables); const isInHomeList = isHomeOf(draggable, destination); const impact = moveToNextCombine({ isMovingForward, draggable, destination, insideDestination, previousImpact }) || moveToNextIndex({ isMovingForward, isInHomeList, draggable, draggables, destination, insideDestination, previousImpact, viewport, afterCritical }); if (!impact) { return null; } const pageBorderBoxCenter = getPageBorderBoxCenterFromImpact({ impact, draggable, droppable: destination, draggables, afterCritical }); const isVisibleInNewLocation = isTotallyVisibleInNewLocation({ draggable, destination, newPageBorderBoxCenter: pageBorderBoxCenter, viewport: viewport.frame, withDroppableDisplacement: false, onlyOnMainAxis: true }); if (isVisibleInNewLocation) { const clientSelection = getClientFromPageBorderBoxCenter({ pageBorderBoxCenter, draggable, viewport }); return { clientSelection, impact, scrollJumpRequest: null }; } const distance = subtract(pageBorderBoxCenter, previousPageBorderBoxCenter); const cautious = speculativelyIncrease({ impact, viewport, destination, draggables, maxScrollChange: distance }); return { clientSelection: previousClientSelection, impact: cautious, scrollJumpRequest: distance }; }); const getKnownActive = droppable => { const rect = droppable.subject.active; !rect ? invariant(false, 'Cannot get clipped area from droppable') : void 0; return rect; }; var getBestCrossAxisDroppable = (_ref => { let { isMovingForward, pageBorderBoxCenter, source, droppables, viewport } = _ref; const active = source.subject.active; if (!active) { return null; } const axis = source.axis; const isBetweenSourceClipped = isWithin(active[axis.start], active[axis.end]); const candidates = toDroppableList(droppables).filter(droppable => droppable !== source).filter(droppable => droppable.isEnabled).filter(droppable => Boolean(droppable.subject.active)).filter(droppable => isPartiallyVisibleThroughFrame(viewport.frame)(getKnownActive(droppable))).filter(droppable => { const activeOfTarget = getKnownActive(droppable); if (isMovingForward) { return active[axis.crossAxisEnd] < activeOfTarget[axis.crossAxisEnd]; } return activeOfTarget[axis.crossAxisStart] < active[axis.crossAxisStart]; }).filter(droppable => { const activeOfTarget = getKnownActive(droppable); const isBetweenDestinationClipped = isWithin(activeOfTarget[axis.start], activeOfTarget[axis.end]); return isBetweenSourceClipped(activeOfTarget[axis.start]) || isBetweenSourceClipped(activeOfTarget[axis.end]) || isBetweenDestinationClipped(active[axis.start]) || isBetweenDestinationClipped(active[axis.end]); }).sort((a, b) => { const first = getKnownActive(a)[axis.crossAxisStart]; const second = getKnownActive(b)[axis.crossAxisStart]; if (isMovingForward) { return first - second; } return second - first; }).filter((droppable, index, array) => getKnownActive(droppable)[axis.crossAxisStart] === getKnownActive(array[0])[axis.crossAxisStart]); if (!candidates.length) { return null; } if (candidates.length === 1) { return candidates[0]; } const contains = candidates.filter(droppable => { const isWithinDroppable = isWithin(getKnownActive(droppable)[axis.start], getKnownActive(droppable)[axis.end]); return isWithinDroppable(pageBorderBoxCenter[axis.line]); }); if (contains.length === 1) { return contains[0]; } if (contains.length > 1) { return contains.sort((a, b) => getKnownActive(a)[axis.start] - getKnownActive(b)[axis.start])[0]; } return candidates.sort((a, b) => { const first = closest$1(pageBorderBoxCenter, getCorners(getKnownActive(a))); const second = closest$1(pageBorderBoxCenter, getCorners(getKnownActive(b))); if (first !== second) { return first - second; } return getKnownActive(a)[axis.start] - getKnownActive(b)[axis.start]; })[0]; }); const getCurrentPageBorderBoxCenter = (draggable, afterCritical) => { const original = draggable.page.borderBox.center; return didStartAfterCritical(draggable.descriptor.id, afterCritical) ? subtract(original, afterCritical.displacedBy.point) : original; }; const getCurrentPageBorderBox = (draggable, afterCritical) => { const original = draggable.page.borderBox; return didStartAfterCritical(draggable.descriptor.id, afterCritical) ? offsetByPosition(original, negate(afterCritical.displacedBy.point)) : original; }; var getClosestDraggable = (_ref => { let { pageBorderBoxCenter, viewport, destination, insideDestination, afterCritical } = _ref; const sorted = insideDestination.filter(draggable => isTotallyVisible({ target: getCurrentPageBorderBox(draggable, afterCritical), destination, viewport: viewport.frame, withDroppableDisplacement: true })).sort((a, b) => { const distanceToA = distance(pageBorderBoxCenter, withDroppableDisplacement(destination, getCurrentPageBorderBoxCenter(a, afterCritical))); const distanceToB = distance(pageBorderBoxCenter, withDroppableDisplacement(destination, getCurrentPageBorderBoxCenter(b, afterCritical))); if (distanceToA < distanceToB) { return -1; } if (distanceToB < distanceToA) { return 1; } return a.descriptor.index - b.descriptor.index; }); return sorted[0] || null; }); var getDisplacedBy = memoizeOne__default["default"](function getDisplacedBy(axis, displaceBy) { const displacement = displaceBy[axis.line]; return { value: displacement, point: patch(axis.line, displacement) }; }); const getRequiredGrowthForPlaceholder = (droppable, placeholderSize, draggables) => { const axis = droppable.axis; if (droppable.descriptor.mode === 'virtual') { return patch(axis.line, placeholderSize[axis.line]); } const availableSpace = droppable.subject.page.contentBox[axis.size]; const insideDroppable = getDraggablesInsideDroppable(droppable.descriptor.id, draggables); const spaceUsed = insideDroppable.reduce((sum, dimension) => sum + dimension.client.marginBox[axis.size], 0); const requiredSpace = spaceUsed + placeholderSize[axis.line]; const needsToGrowBy = requiredSpace - availableSpace; if (needsToGrowBy <= 0) { return null; } return patch(axis.line, needsToGrowBy); }; const withMaxScroll = (frame, max) => ({ ...frame, scroll: { ...frame.scroll, max } }); const addPlaceholder = (droppable, draggable, draggables) => { const frame = droppable.frame; !!isHomeOf(draggable, droppable) ? invariant(false, 'Should not add placeholder space to home list') : void 0; !!droppable.subject.withPlaceholder ? invariant(false, 'Cannot add placeholder size to a subject when it already has one') : void 0; const placeholderSize = getDisplacedBy(droppable.axis, draggable.displaceBy).point; const requiredGrowth = getRequiredGrowthForPlaceholder(droppable, placeholderSize, draggables); const added = { placeholderSize, increasedBy: requiredGrowth, oldFrameMaxScroll: droppable.frame ? droppable.frame.scroll.max : null }; if (!frame) { const subject = getSubject({ page: droppable.subject.page, withPlaceholder: added, axis: droppable.axis, frame: droppable.frame }); return { ...droppable, subject }; } const maxScroll = requiredGrowth ? add(frame.scroll.max, requiredGrowth) : frame.scroll.max; const newFrame = withMaxScroll(frame, maxScroll); const subject = getSubject({ page: droppable.subject.page, withPlaceholder: added, axis: droppable.axis, frame: newFrame }); return { ...droppable, subject, frame: newFrame }; }; const removePlaceholder = droppable => { const added = droppable.subject.withPlaceholder; !added ? invariant(false, 'Cannot remove placeholder form subject when there was none') : void 0; const frame = droppable.frame; if (!frame) { const subject = getSubject({ page: droppable.subject.page, axis: droppable.axis, frame: null, withPlaceholder: null }); return { ...droppable, subject }; } const oldMaxScroll = added.oldFrameMaxScroll; !oldMaxScroll ? invariant(false, 'Expected droppable with frame to have old max frame scroll when removing placeholder') : void 0; const newFrame = withMaxScroll(frame, oldMaxScroll); const subject = getSubject({ page: droppable.subject.page, axis: droppable.axis, frame: newFrame, withPlaceholder: null }); return { ...droppable, subject, frame: newFrame }; }; var moveToNewDroppable = (_ref => { let { previousPageBorderBoxCenter, moveRelativeTo, insideDestination, draggable, draggables, destination, viewport, afterCritical } = _ref; if (!moveRelativeTo) { if (insideDestination.length) { return null; } const proposed = { displaced: emptyGroups, displacedBy: noDisplacedBy, at: { type: 'REORDER', destination: { droppableId: destination.descriptor.id, index: 0 } } }; const proposedPageBorderBoxCenter = getPageBorderBoxCenterFromImpact({ impact: proposed, draggable, droppable: destination, draggables, afterCritical }); const withPlaceholder = isHomeOf(draggable, destination) ? destination : addPlaceholder(destination, draggable, draggables); const isVisibleInNewLocation = isTotallyVisibleInNewLocation({ draggable, destination: withPlaceholder, newPageBorderBoxCenter: proposedPageBorderBoxCenter, viewport: viewport.frame, withDroppableDisplacement: false, onlyOnMainAxis: true }); return isVisibleInNewLocation ? proposed : null; } const isGoingBeforeTarget = Boolean(previousPageBorderBoxCenter[destination.axis.line] <= moveRelativeTo.page.borderBox.center[destination.axis.line]); const proposedIndex = (() => { const relativeTo = moveRelativeTo.descriptor.index; if (moveRelativeTo.descriptor.id === draggable.descriptor.id) { return relativeTo; } if (isGoingBeforeTarget) { return relativeTo; } return relativeTo + 1; })(); const displacedBy = getDisplacedBy(destination.axis, draggable.displaceBy); return calculateReorderImpact({ draggable, insideDestination, destination, viewport, displacedBy, last: emptyGroups, index: proposedIndex }); }); var moveCrossAxis = (_ref => { let { isMovingForward, previousPageBorderBoxCenter, draggable, isOver, draggables, droppables, viewport, afterCritical } = _ref; const destination = getBestCrossAxisDroppable({ isMovingForward, pageBorderBoxCenter: previousPageBorderBoxCenter, source: isOver, droppables, viewport }); if (!destination) { return null; } const insideDestination = getDraggablesInsideDroppable(destination.descriptor.id, draggables); const moveRelativeTo = getClosestDraggable({ pageBorderBoxCenter: previousPageBorderBoxCenter, viewport, destination, insideDestination, afterCritical }); const impact = moveToNewDroppable({ previousPageBorderBoxCenter, destination, draggable, draggables, moveRelativeTo, insideDestination, viewport, afterCritical }); if (!impact) { return null; } const pageBorderBoxCenter = getPageBorderBoxCenterFromImpact({ impact, draggable, droppable: destination, draggables, afterCritical }); const clientSelection = getClientFromPageBorderBoxCenter({ pageBorderBoxCenter, draggable, viewport }); return { clientSelection, impact, scrollJumpRequest: null }; }); var whatIsDraggedOver = (impact => { const at = impact.at; if (!at) { return null; } if (at.type === 'REORDER') { return at.destination.droppableId; } return at.combine.droppableId; }); const getDroppableOver$1 = (impact, droppables) => { const id = whatIsDraggedOver(impact); return id ? droppables[id] : null; }; var moveInDirection = (_ref => { let { state, type } = _ref; const isActuallyOver = getDroppableOver$1(state.impact, state.dimensions.droppables); const isMainAxisMovementAllowed = Boolean(isActuallyOver); const home = state.dimensions.droppables[state.critical.droppable.id]; const isOver = isActuallyOver || home; const direction = isOver.axis.direction; const isMovingOnMainAxis = direction === 'vertical' && (type === 'MOVE_UP' || type === 'MOVE_DOWN') || direction === 'horizontal' && (type === 'MOVE_LEFT' || type === 'MOVE_RIGHT'); if (isMovingOnMainAxis && !isMainAxisMovementAllowed) { return null; } const isMovingForward = type === 'MOVE_DOWN' || type === 'MOVE_RIGHT'; const draggable = state.dimensions.draggables[state.critical.draggable.id]; const previousPageBorderBoxCenter = state.current.page.borderBoxCenter; const { draggables, droppables } = state.dimensions; return isMovingOnMainAxis ? moveToNextPlace({ isMovingForward, previousPageBorderBoxCenter, draggable, destination: isOver, draggables, viewport: state.viewport, previousClientSelection: state.current.client.selection, previousImpact: state.impact, afterCritical: state.afterCritical }) : moveCrossAxis({ isMovingForward, previousPageBorderBoxCenter, draggable, isOver, draggables, droppables, viewport: state.viewport, afterCritical: state.afterCritical }); }); function isMovementAllowed(state) { return state.phase === 'DRAGGING' || state.phase === 'COLLECTING'; } function isPositionInFrame(frame) { const isWithinVertical = isWithin(frame.top, frame.bottom); const isWithinHorizontal = isWithin(frame.left, frame.right); return function run(point) { return isWithinVertical(point.y) && isWithinHorizontal(point.x); }; } function getHasOverlap(first, second) { return first.left < second.right && first.right > second.left && first.top < second.bottom && first.bottom > second.top; } function getFurthestAway(_ref) { let { pageBorderBox, draggable, candidates } = _ref; const startCenter = draggable.page.borderBox.center; const sorted = candidates.map(candidate => { const axis = candidate.axis; const target = patch(candidate.axis.line, pageBorderBox.center[axis.line], candidate.page.borderBox.center[axis.crossAxisLine]); return { id: candidate.descriptor.id, distance: distance(startCenter, target) }; }).sort((a, b) => b.distance - a.distance); return sorted[0] ? sorted[0].id : null; } function getDroppableOver(_ref2) { let { pageBorderBox, draggable, droppables } = _ref2; const candidates = toDroppableList(droppables).filter(item => { if (!item.isEnabled) { return false; } const active = item.subject.active; if (!active) { return false; } if (!getHasOverlap(pageBorderBox, active)) { return false; } if (isPositionInFrame(active)(pageBorderBox.center)) { return true; } const axis = item.axis; const childCenter = active.center[axis.crossAxisLine]; const crossAxisStart = pageBorderBox[axis.crossAxisStart]; const crossAxisEnd = pageBorderBox[axis.crossAxisEnd]; const isContained = isWithin(active[axis.crossAxisStart], active[axis.crossAxisEnd]); const isStartContained = isContained(crossAxisStart); const isEndContained = isContained(crossAxisEnd); if (!isStartContained && !isEndContained) { return true; } if (isStartContained) { return crossAxisStart < childCenter; } return crossAxisEnd > childCenter; }); if (!candidates.length) { return null; } if (candidates.length === 1) { return candidates[0].descriptor.id; } return getFurthestAway({ pageBorderBox, draggable, candidates }); } const offsetRectByPosition = (rect, point) => cssBoxModel.getRect(offsetByPosition(rect, point)); var withDroppableScroll = ((droppable, area) => { const frame = droppable.frame; if (!frame) { return area; } return offsetRectByPosition(area, frame.scroll.diff.value); }); function getIsDisplaced(_ref) { let { displaced, id } = _ref; return Boolean(displaced.visible[id] || displaced.invisible[id]); } function atIndex(_ref) { let { draggable, closest, inHomeList } = _ref; if (!closest) { return null; } if (!inHomeList) { return closest.descriptor.index; } if (closest.descriptor.index > draggable.descriptor.index) { return closest.descriptor.index - 1; } return closest.descriptor.index; } var getReorderImpact = (_ref2 => { let { pageBorderBoxWithDroppableScroll: targetRect, draggable, destination, insideDestination, last, viewport, afterCritical } = _ref2; const axis = destination.axis; const displacedBy = getDisplacedBy(destination.axis, draggable.displaceBy); const displacement = displacedBy.value; const targetStart = targetRect[axis.start]; const targetEnd = targetRect[axis.end]; const withoutDragging = removeDraggableFromList(draggable, insideDestination); const closest = withoutDragging.find(child => { const id = child.descriptor.id; const childCenter = child.page.borderBox.center[axis.line]; const didStartAfterCritical$1 = didStartAfterCritical(id, afterCritical); const isDisplaced = getIsDisplaced({ displaced: last, id }); if (didStartAfterCritical$1) { if (isDisplaced) { return targetEnd <= childCenter; } return targetStart < childCenter - displacement; } if (isDisplaced) { return targetEnd <= childCenter + displacement; } return targetStart < childCenter; }) || null; const newIndex = atIndex({ draggable, closest, inHomeList: isHomeOf(draggable, destination) }); return calculateReorderImpact({ draggable, insideDestination, destination, viewport, last, displacedBy, index: newIndex }); }); const combineThresholdDivisor = 4; var getCombineImpact = (_ref => { let { draggable, pageBorderBoxWithDroppableScroll: targetRect, previousImpact, destination, insideDestination, afterCritical } = _ref; if (!destination.isCombineEnabled) { return null; } const axis = destination.axis; const displacedBy = getDisplacedBy(destination.axis, draggable.displaceBy); const displacement = displacedBy.value; const targetStart = targetRect[axis.start]; const targetEnd = targetRect[axis.end]; const withoutDragging = removeDraggableFromList(draggable, insideDestination); const combineWith = withoutDragging.find(child => { const id = child.descriptor.id; const childRect = child.page.borderBox; const childSize = childRect[axis.size]; const threshold = childSize / combineThresholdDivisor; const didStartAfterCritical$1 = didStartAfterCritical(id, afterCritical); const isDisplaced = getIsDisplaced({ displaced: previousImpact.displaced, id }); if (didStartAfterCritical$1) { if (isDisplaced) { return targetEnd > childRect[axis.start] + threshold && targetEnd < childRect[axis.end] - threshold; } return targetStart > childRect[axis.start] - displacement + threshold && targetStart < childRect[axis.end] - displacement - threshold; } if (isDisplaced) { return targetEnd > childRect[axis.start] + displacement + threshold && targetEnd < childRect[axis.end] + displacement - threshold; } return targetStart > childRect[axis.start] + threshold && targetStart < childRect[axis.end] - threshold; }); if (!combineWith) { return null; } const impact = { displacedBy, displaced: previousImpact.displaced, at: { type: 'COMBINE', combine: { draggableId: combineWith.descriptor.id, droppableId: destination.descriptor.id } } }; return impact; }); var getDragImpact = (_ref => { let { pageOffset, draggable, draggables, droppables, previousImpact, viewport, afterCritical } = _ref; const pageBorderBox = offsetRectByPosition(draggable.page.borderBox, pageOffset); const destinationId = getDroppableOver({ pageBorderBox, draggable, droppables }); if (!destinationId) { return noImpact$1; } const destination = droppables[destinationId]; const insideDestination = getDraggablesInsideDroppable(destination.descriptor.id, draggables); const pageBorderBoxWithDroppableScroll = withDroppableScroll(destination, pageBorderBox); return getCombineImpact({ pageBorderBoxWithDroppableScroll, draggable, previousImpact, destination, insideDestination, afterCritical }) || getReorderImpact({ pageBorderBoxWithDroppableScroll, draggable, destination, insideDestination, last: previousImpact.displaced, viewport, afterCritical }); }); var patchDroppableMap = ((droppables, updated) => ({ ...droppables, [updated.descriptor.id]: updated })); const clearUnusedPlaceholder = _ref => { let { previousImpact, impact, droppables } = _ref; const last = whatIsDraggedOver(previousImpact); const now = whatIsDraggedOver(impact); if (!last) { return droppables; } if (last === now) { return droppables; } const lastDroppable = droppables[last]; if (!lastDroppable.subject.withPlaceholder) { return droppables; } const updated = removePlaceholder(lastDroppable); return patchDroppableMap(droppables, updated); }; var recomputePlaceholders = (_ref2 => { let { draggable, draggables, droppables, previousImpact, impact } = _ref2; const cleaned = clearUnusedPlaceholder({ previousImpact, impact, droppables }); const isOver = whatIsDraggedOver(impact); if (!isOver) { return cleaned; } const droppable = droppables[isOver]; if (isHomeOf(draggable, droppable)) { return cleaned; } if (droppable.subject.withPlaceholder) { return cleaned; } const patched = addPlaceholder(droppable, draggable, draggables); return patchDroppableMap(cleaned, patched); }); var update = (_ref => { let { state, clientSelection: forcedClientSelection, dimensions: forcedDimensions, viewport: forcedViewport, impact: forcedImpact, scrollJumpRequest } = _ref; const viewport = forcedViewport || state.viewport; const dimensions = forcedDimensions || state.dimensions; const clientSelection = forcedClientSelection || state.current.client.selection; const offset = subtract(clientSelection, state.initial.client.selection); const client = { offset, selection: clientSelection, borderBoxCenter: add(state.initial.client.borderBoxCenter, offset) }; const page = { selection: add(client.selection, viewport.scroll.current), borderBoxCenter: add(client.borderBoxCenter, viewport.scroll.current), offset: add(client.offset, viewport.scroll.diff.value) }; const current = { client, page }; if (state.phase === 'COLLECTING') { return { ...state, dimensions, viewport, current }; } const draggable = dimensions.draggables[state.critical.draggable.id]; const newImpact = forcedImpact || getDragImpact({ pageOffset: page.offset, draggable, draggables: dimensions.draggables, droppables: dimensions.droppables, previousImpact: state.impact, viewport, afterCritical: state.afterCritical }); const withUpdatedPlaceholders = recomputePlaceholders({ draggable, impact: newImpact, previousImpact: state.impact, draggables: dimensions.draggables, droppables: dimensions.droppables }); const result = { ...state, current, dimensions: { draggables: dimensions.draggables, droppables: withUpdatedPlaceholders }, impact: newImpact, viewport, scrollJumpRequest: scrollJumpRequest || null, forceShouldAnimate: scrollJumpRequest ? false : null }; return result; }); function getDraggables(ids, draggables) { return ids.map(id => draggables[id]); } var recompute = (_ref => { let { impact, viewport, draggables, destination, forceShouldAnimate } = _ref; const last = impact.displaced; const afterDragging = getDraggables(last.all, draggables); const displaced = getDisplacementGroups({ afterDragging, destination, displacedBy: impact.displacedBy, viewport: viewport.frame, forceShouldAnimate, last }); return { ...impact, displaced }; }); var getClientBorderBoxCenter = (_ref => { let { impact, draggable, droppable, draggables, viewport, afterCritical } = _ref; const pageBorderBoxCenter = getPageBorderBoxCenterFromImpact({ impact, draggable, draggables, droppable, afterCritical }); return getClientFromPageBorderBoxCenter({ pageBorderBoxCenter, draggable, viewport }); }); var refreshSnap = (_ref => { let { state, dimensions: forcedDimensions, viewport: forcedViewport } = _ref; !(state.movementMode === 'SNAP') ? invariant(false) : void 0; const needsVisibilityCheck = state.impact; const viewport = forcedViewport || state.viewport; const dimensions = forcedDimensions || state.dimensions; const { draggables, droppables } = dimensions; const draggable = draggables[state.critical.draggable.id]; const isOver = whatIsDraggedOver(needsVisibilityCheck); !isOver ? invariant(false, 'Must be over a destination in SNAP movement mode') : void 0; const destination = droppables[isOver]; const impact = recompute({ impact: needsVisibilityCheck, viewport, destination, draggables }); const clientSelection = getClientBorderBoxCenter({ impact, draggable, droppable: destination, draggables, viewport, afterCritical: state.afterCritical }); return update({ impact, clientSelection, state, dimensions, viewport }); }); var getHomeLocation = (descriptor => ({ index: descriptor.index, droppableId: descriptor.droppableId })); var getLiftEffect = (_ref => { let { draggable, home, draggables, viewport } = _ref; const displacedBy = getDisplacedBy(home.axis, draggable.displaceBy); const insideHome = getDraggablesInsideDroppable(home.descriptor.id, draggables); const rawIndex = insideHome.indexOf(draggable); !(rawIndex !== -1) ? invariant(false, 'Expected draggable to be inside home list') : void 0; const afterDragging = insideHome.slice(rawIndex + 1); const effected = afterDragging.reduce((previous, item) => { previous[item.descriptor.id] = true; return previous; }, {}); const afterCritical = { inVirtualList: home.descriptor.mode === 'virtual', displacedBy, effected }; const displaced = getDisplacementGroups({ afterDragging, destination: home, displacedBy, last: null, viewport: viewport.frame, forceShouldAnimate: false }); const impact = { displaced, displacedBy, at: { type: 'REORDER', destination: getHomeLocation(draggable.descriptor) } }; return { impact, afterCritical }; }); var patchDimensionMap = ((dimensions, updated) => ({ draggables: dimensions.draggables, droppables: patchDroppableMap(dimensions.droppables, updated) })); var offsetDraggable = (_ref => { let { draggable, offset, initialWindowScroll } = _ref; const client = cssBoxModel.offset(draggable.client, offset); const page = cssBoxModel.withScroll(client, initialWindowScroll); const moved = { ...draggable, placeholder: { ...draggable.placeholder, client }, client, page }; return moved; }); var getFrame = (droppable => { const frame = droppable.frame; !frame ? invariant(false, 'Expected Droppable to have a frame') : void 0; return frame; }); var adjustAdditionsForScrollChanges = (_ref => { let { additions, updatedDroppables, viewport } = _ref; const windowScrollChange = viewport.scroll.diff.value; return additions.map(draggable => { const droppableId = draggable.descriptor.droppableId; const modified = updatedDroppables[droppableId]; const frame = getFrame(modified); const droppableScrollChange = frame.scroll.diff.value; const totalChange = add(windowScrollChange, droppableScrollChange); const moved = offsetDraggable({ draggable, offset: totalChange, initialWindowScroll: viewport.scroll.initial }); return moved; }); }); var publishWhileDraggingInVirtual = (_ref => { let { state, published } = _ref; const withScrollChange = published.modified.map(update => { const existing = state.dimensions.droppables[update.droppableId]; const scrolled = scrollDroppable(existing, update.scroll); return scrolled; }); const droppables = { ...state.dimensions.droppables, ...toDroppableMap(withScrollChange) }; const updatedAdditions = toDraggableMap(adjustAdditionsForScrollChanges({ additions: published.additions, updatedDroppables: droppables, viewport: state.viewport })); const draggables = { ...state.dimensions.draggables, ...updatedAdditions }; published.removals.forEach(id => { delete draggables[id]; }); const dimensions = { droppables, draggables }; const wasOverId = whatIsDraggedOver(state.impact); const wasOver = wasOverId ? dimensions.droppables[wasOverId] : null; const draggable = dimensions.draggables[state.critical.draggable.id]; const home = dimensions.droppables[state.critical.droppable.id]; const { impact: onLiftImpact, afterCritical } = getLiftEffect({ draggable, home, draggables, viewport: state.viewport }); const previousImpact = wasOver && wasOver.isCombineEnabled ? state.impact : onLiftImpact; const impact = getDragImpact({ pageOffset: state.current.page.offset, draggable: dimensions.draggables[state.critical.draggable.id], draggables: dimensions.draggables, droppables: dimensions.droppables, previousImpact, viewport: state.viewport, afterCritical }); const draggingState = { ...state, phase: 'DRAGGING', impact, onLiftImpact, dimensions, afterCritical, forceShouldAnimate: false }; if (state.phase === 'COLLECTING') { return draggingState; } const dropPending = { ...draggingState, phase: 'DROP_PENDING', reason: state.reason, isWaiting: false }; return dropPending; }); const isSnapping = state => state.movementMode === 'SNAP'; const postDroppableChange = (state, updated, isEnabledChanging) => { const dimensions = patchDimensionMap(state.dimensions, updated); if (!isSnapping(state) || isEnabledChanging) { return update({ state, dimensions }); } return refreshSnap({ state, dimensions }); }; function removeScrollJumpRequest(state) { if (state.isDragging && state.movementMode === 'SNAP') { return { ...state, scrollJumpRequest: null }; } return state; } const idle$2 = { phase: 'IDLE', completed: null, shouldFlush: false }; var reducer$1 = (function (state, action) { if (state === void 0) { state = idle$2; } if (action.type === 'FLUSH') { return { ...idle$2, shouldFlush: true }; } if (action.type === 'INITIAL_PUBLISH') { !(state.phase === 'IDLE') ? invariant(false, 'INITIAL_PUBLISH must come after a IDLE phase') : void 0; const { critical, clientSelection, viewport, dimensions, movementMode } = action.payload; const draggable = dimensions.draggables[critical.draggable.id]; const home = dimensions.droppables[critical.droppable.id]; const client = { selection: clientSelection, borderBoxCenter: draggable.client.borderBox.center, offset: origin }; const initial = { client, page: { selection: add(client.selection, viewport.scroll.initial), borderBoxCenter: add(client.selection, viewport.scroll.initial), offset: add(client.selection, viewport.scroll.diff.value) } }; const isWindowScrollAllowed = toDroppableList(dimensions.droppables).every(item => !item.isFixedOnPage); const { impact, afterCritical } = getLiftEffect({ draggable, home, draggables: dimensions.draggables, viewport }); const result = { phase: 'DRAGGING', isDragging: true, critical, movementMode, dimensions, initial, current: initial, isWindowScrollAllowed, impact, afterCritical, onLiftImpact: impact, viewport, scrollJumpRequest: null, forceShouldAnimate: null }; return result; } if (action.type === 'COLLECTION_STARTING') { if (state.phase === 'COLLECTING' || state.phase === 'DROP_PENDING') { return state; } !(state.phase === 'DRAGGING') ? invariant(false, `Collection cannot start from phase ${state.phase}`) : void 0; const result = { ...state, phase: 'COLLECTING' }; return result; } if (action.type === 'PUBLISH_WHILE_DRAGGING') { !(state.phase === 'COLLECTING' || state.phase === 'DROP_PENDING') ? invariant(false, `Unexpected ${action.type} received in phase ${state.phase}`) : void 0; return publishWhileDraggingInVirtual({ state, published: action.payload }); } if (action.type === 'MOVE') { if (state.phase === 'DROP_PENDING') { return state; } !isMovementAllowed(state) ? invariant(false, `${action.type} not permitted in phase ${state.phase}`) : void 0; const { client: clientSelection } = action.payload; if (isEqual$1(clientSelection, state.current.client.selection)) { return state; } return update({ state, clientSelection, impact: isSnapping(state) ? state.impact : null }); } if (action.type === 'UPDATE_DROPPABLE_SCROLL') { if (state.phase === 'DROP_PENDING') { return removeScrollJumpRequest(state); } if (state.phase === 'COLLECTING') { return removeScrollJumpRequest(state); } !isMovementAllowed(state) ? invariant(false, `${action.type} not permitted in phase ${state.phase}`) : void 0; const { id, newScroll } = action.payload; const target = state.dimensions.droppables[id]; if (!target) { return state; } const scrolled = scrollDroppable(target, newScroll); return postDroppableChange(state, scrolled, false); } if (action.type === 'UPDATE_DROPPABLE_IS_ENABLED') { if (state.phase === 'DROP_PENDING') { return state; } !isMovementAllowed(state) ? invariant(false, `Attempting to move in an unsupported phase ${state.phase}`) : void 0; const { id, isEnabled } = action.payload; const target = state.dimensions.droppables[id]; !target ? invariant(false, `Cannot find Droppable[id: ${id}] to toggle its enabled state`) : void 0; !(target.isEnabled !== isEnabled) ? invariant(false, `Trying to set droppable isEnabled to ${String(isEnabled)} but it is already ${String(target.isEnabled)}`) : void 0; const updated = { ...target, isEnabled }; return postDroppableChange(state, updated, true); } if (action.type === 'UPDATE_DROPPABLE_IS_COMBINE_ENABLED') { if (state.phase === 'DROP_PENDING') { return state; } !isMovementAllowed(state) ? invariant(false, `Attempting to move in an unsupported phase ${state.phase}`) : void 0; const { id, isCombineEnabled } = action.payload; const target = state.dimensions.droppables[id]; !target ? invariant(false, `Cannot find Droppable[id: ${id}] to toggle its isCombineEnabled state`) : void 0; !(target.isCombineEnabled !== isCombineEnabled) ? invariant(false, `Trying to set droppable isCombineEnabled to ${String(isCombineEnabled)} but it is already ${String(target.isCombineEnabled)}`) : void 0; const updated = { ...target, isCombineEnabled }; return postDroppableChange(state, updated, true); } if (action.type === 'MOVE_BY_WINDOW_SCROLL') { if (state.phase === 'DROP_PENDING' || state.phase === 'DROP_ANIMATING') { return state; } !isMovementAllowed(state) ? invariant(false, `Cannot move by window in phase ${state.phase}`) : void 0; !state.isWindowScrollAllowed ? invariant(false, 'Window scrolling is currently not supported for fixed lists') : void 0; const newScroll = action.payload.newScroll; if (isEqual$1(state.viewport.scroll.current, newScroll)) { return removeScrollJumpRequest(state); } const viewport = scrollViewport(state.viewport, newScroll); if (isSnapping(state)) { return refreshSnap({ state, viewport }); } return update({ state, viewport }); } if (action.type === 'UPDATE_VIEWPORT_MAX_SCROLL') { if (!isMovementAllowed(state)) { return state; } const maxScroll = action.payload.maxScroll; if (isEqual$1(maxScroll, state.viewport.scroll.max)) { return state; } const withMaxScroll = { ...state.viewport, scroll: { ...state.viewport.scroll, max: maxScroll } }; return { ...state, viewport: withMaxScroll }; } if (action.type === 'MOVE_UP' || action.type === 'MOVE_DOWN' || action.type === 'MOVE_LEFT' || action.type === 'MOVE_RIGHT') { if (state.phase === 'COLLECTING' || state.phase === 'DROP_PENDING') { return state; } !(state.phase === 'DRAGGING') ? invariant(false, `${action.type} received while not in DRAGGING phase`) : void 0; const result = moveInDirection({ state, type: action.type }); if (!result) { return state; } return update({ state, impact: result.impact, clientSelection: result.clientSelection, scrollJumpRequest: result.scrollJumpRequest }); } if (action.type === 'DROP_PENDING') { const reason = action.payload.reason; !(state.phase === 'COLLECTING') ? invariant(false, 'Can only move into the DROP_PENDING phase from the COLLECTING phase') : void 0; const newState = { ...state, phase: 'DROP_PENDING', isWaiting: true, reason }; return newState; } if (action.type === 'DROP_ANIMATE') { const { completed, dropDuration, newHomeClientOffset } = action.payload; !(state.phase === 'DRAGGING' || state.phase === 'DROP_PENDING') ? invariant(false, `Cannot animate drop from phase ${state.phase}`) : void 0; const result = { phase: 'DROP_ANIMATING', completed, dropDuration, newHomeClientOffset, dimensions: state.dimensions }; return result; } if (action.type === 'DROP_COMPLETE') { const { completed } = action.payload; return { phase: 'IDLE', completed, shouldFlush: false }; } return state; }); const beforeInitialCapture = args => ({ type: 'BEFORE_INITIAL_CAPTURE', payload: args }); const lift$1 = args => ({ type: 'LIFT', payload: args }); const initialPublish = args => ({ type: 'INITIAL_PUBLISH', payload: args }); const publishWhileDragging = args => ({ type: 'PUBLISH_WHILE_DRAGGING', payload: args }); const collectionStarting = () => ({ type: 'COLLECTION_STARTING', payload: null }); const updateDroppableScroll = args => ({ type: 'UPDATE_DROPPABLE_SCROLL', payload: args }); const updateDroppableIsEnabled = args => ({ type: 'UPDATE_DROPPABLE_IS_ENABLED', payload: args }); const updateDroppableIsCombineEnabled = args => ({ type: 'UPDATE_DROPPABLE_IS_COMBINE_ENABLED', payload: args }); const move = args => ({ type: 'MOVE', payload: args }); const moveByWindowScroll = args => ({ type: 'MOVE_BY_WINDOW_SCROLL', payload: args }); const updateViewportMaxScroll = args => ({ type: 'UPDATE_VIEWPORT_MAX_SCROLL', payload: args }); const moveUp = () => ({ type: 'MOVE_UP', payload: null }); const moveDown = () => ({ type: 'MOVE_DOWN', payload: null }); const moveRight = () => ({ type: 'MOVE_RIGHT', payload: null }); const moveLeft = () => ({ type: 'MOVE_LEFT', payload: null }); const flush = () => ({ type: 'FLUSH', payload: null }); const animateDrop = args => ({ type: 'DROP_ANIMATE', payload: args }); const completeDrop = args => ({ type: 'DROP_COMPLETE', payload: args }); const drop$1 = args => ({ type: 'DROP', payload: args }); const dropPending = args => ({ type: 'DROP_PENDING', payload: args }); const dropAnimationFinished = () => ({ type: 'DROP_ANIMATION_FINISHED', payload: null }); function checkIndexes(insideDestination) { if (insideDestination.length <= 1) { return; } const indexes = insideDestination.map(d => d.descriptor.index); const errors = {}; for (let i = 1; i < indexes.length; i++) { const current = indexes[i]; const previous = indexes[i - 1]; if (current !== previous + 1) { errors[current] = true; } } if (!Object.keys(errors).length) { return; } const formatted = indexes.map(index => { const hasError = Boolean(errors[index]); return hasError ? `[🔥${index}]` : `${index}`; }).join(', '); warning(` Detected non-consecutive indexes. (This can cause unexpected bugs) ${formatted} `) ; } function validateDimensions(critical, dimensions) { { const insideDestination = getDraggablesInsideDroppable(critical.droppable.id, dimensions.draggables); checkIndexes(insideDestination); } } var lift = (marshal => _ref => { let { getState, dispatch } = _ref; return next => action => { if (action.type !== 'LIFT') { next(action); return; } const { id, clientSelection, movementMode } = action.payload; const initial = getState(); if (initial.phase === 'DROP_ANIMATING') { dispatch(completeDrop({ completed: initial.completed })); } !(getState().phase === 'IDLE') ? invariant(false, 'Unexpected phase to start a drag') : void 0; dispatch(flush()); dispatch(beforeInitialCapture({ draggableId: id, movementMode })); const scrollOptions = { shouldPublishImmediately: movementMode === 'SNAP' }; const request = { draggableId: id, scrollOptions }; const { critical, dimensions, viewport } = marshal.startPublishing(request); validateDimensions(critical, dimensions); dispatch(initialPublish({ critical, dimensions, clientSelection, movementMode, viewport })); }; }); var style = (marshal => () => next => action => { if (action.type === 'INITIAL_PUBLISH') { marshal.dragging(); } if (action.type === 'DROP_ANIMATE') { marshal.dropping(action.payload.completed.result.reason); } if (action.type === 'FLUSH' || action.type === 'DROP_COMPLETE') { marshal.resting(); } next(action); }); const curves = { outOfTheWay: 'cubic-bezier(0.2, 0, 0, 1)', drop: 'cubic-bezier(.2,1,.1,1)' }; const combine = { opacity: { drop: 0, combining: 0.7 }, scale: { drop: 0.75 } }; const timings = { outOfTheWay: 0.2, minDropTime: 0.33, maxDropTime: 0.55 }; const outOfTheWayTiming = `${timings.outOfTheWay}s ${curves.outOfTheWay}`; const transitions = { fluid: `opacity ${outOfTheWayTiming}`, snap: `transform ${outOfTheWayTiming}, opacity ${outOfTheWayTiming}`, drop: duration => { const timing = `${duration}s ${curves.drop}`; return `transform ${timing}, opacity ${timing}`; }, outOfTheWay: `transform ${outOfTheWayTiming}`, placeholder: `height ${outOfTheWayTiming}, width ${outOfTheWayTiming}, margin ${outOfTheWayTiming}` }; const moveTo = offset => isEqual$1(offset, origin) ? undefined : `translate(${offset.x}px, ${offset.y}px)`; const transforms = { moveTo, drop: (offset, isCombining) => { const translate = moveTo(offset); if (!translate) { return undefined; } if (!isCombining) { return translate; } return `${translate} scale(${combine.scale.drop})`; } }; const { minDropTime, maxDropTime } = timings; const dropTimeRange = maxDropTime - minDropTime; const maxDropTimeAtDistance = 1500; const cancelDropModifier = 0.6; var getDropDuration = (_ref => { let { current, destination, reason } = _ref; const distance$1 = distance(current, destination); if (distance$1 <= 0) { return minDropTime; } if (distance$1 >= maxDropTimeAtDistance) { return maxDropTime; } const percentage = distance$1 / maxDropTimeAtDistance; const duration = minDropTime + dropTimeRange * percentage; const withDuration = reason === 'CANCEL' ? duration * cancelDropModifier : duration; return Number(withDuration.toFixed(2)); }); var getNewHomeClientOffset = (_ref => { let { impact, draggable, dimensions, viewport, afterCritical } = _ref; const { draggables, droppables } = dimensions; const droppableId = whatIsDraggedOver(impact); const destination = droppableId ? droppables[droppableId] : null; const home = droppables[draggable.descriptor.droppableId]; const newClientCenter = getClientBorderBoxCenter({ impact, draggable, draggables, afterCritical, droppable: destination || home, viewport }); const offset = subtract(newClientCenter, draggable.client.borderBox.center); return offset; }); var getDropImpact = (_ref => { let { draggables, reason, lastImpact, home, viewport, onLiftImpact } = _ref; if (!lastImpact.at || reason !== 'DROP') { const recomputedHomeImpact = recompute({ draggables, impact: onLiftImpact, destination: home, viewport, forceShouldAnimate: true }); return { impact: recomputedHomeImpact, didDropInsideDroppable: false }; } if (lastImpact.at.type === 'REORDER') { return { impact: lastImpact, didDropInsideDroppable: true }; } const withoutMovement = { ...lastImpact, displaced: emptyGroups }; return { impact: withoutMovement, didDropInsideDroppable: true }; }); const dropMiddleware = _ref => { let { getState, dispatch } = _ref; return next => action => { if (action.type !== 'DROP') { next(action); return; } const state = getState(); const reason = action.payload.reason; if (state.phase === 'COLLECTING') { dispatch(dropPending({ reason })); return; } if (state.phase === 'IDLE') { return; } const isWaitingForDrop = state.phase === 'DROP_PENDING' && state.isWaiting; !!isWaitingForDrop ? invariant(false, 'A DROP action occurred while DROP_PENDING and still waiting') : void 0; !(state.phase === 'DRAGGING' || state.phase === 'DROP_PENDING') ? invariant(false, `Cannot drop in phase: ${state.phase}`) : void 0; const critical = state.critical; const dimensions = state.dimensions; const draggable = dimensions.draggables[state.critical.draggable.id]; const { impact, didDropInsideDroppable } = getDropImpact({ reason, lastImpact: state.impact, afterCritical: state.afterCritical, onLiftImpact: state.onLiftImpact, home: state.dimensions.droppables[state.critical.droppable.id], viewport: state.viewport, draggables: state.dimensions.draggables }); const destination = didDropInsideDroppable ? tryGetDestination(impact) : null; const combine = didDropInsideDroppable ? tryGetCombine(impact) : null; const source = { index: critical.draggable.index, droppableId: critical.droppable.id }; const result = { draggableId: draggable.descriptor.id, type: draggable.descriptor.type, source, reason, mode: state.movementMode, destination, combine }; const newHomeClientOffset = getNewHomeClientOffset({ impact, draggable, dimensions, viewport: state.viewport, afterCritical: state.afterCritical }); const completed = { critical: state.critical, afterCritical: state.afterCritical, result, impact }; const isAnimationRequired = !isEqual$1(state.current.client.offset, newHomeClientOffset) || Boolean(result.combine); if (!isAnimationRequired) { dispatch(completeDrop({ completed })); return; } const dropDuration = getDropDuration({ current: state.current.client.offset, destination: newHomeClientOffset, reason }); const args = { newHomeClientOffset, dropDuration, completed }; dispatch(animateDrop(args)); }; }; var drop = dropMiddleware; var getWindowScroll = (() => ({ x: window.pageXOffset, y: window.pageYOffset })); function getWindowScrollBinding(update) { return { eventName: 'scroll', options: { passive: true, capture: false }, fn: event => { if (event.target !== window && event.target !== window.document) { return; } update(); } }; } function getScrollListener(_ref) { let { onWindowScroll } = _ref; function updateScroll() { onWindowScroll(getWindowScroll()); } const scheduled = rafSchd__default["default"](updateScroll); const binding = getWindowScrollBinding(scheduled); let unbind = noop$2; function isActive() { return unbind !== noop$2; } function start() { !!isActive() ? invariant(false, 'Cannot start scroll listener when already active') : void 0; unbind = bindEvents(window, [binding]); } function stop() { !isActive() ? invariant(false, 'Cannot stop scroll listener when not active') : void 0; scheduled.cancel(); unbind(); unbind = noop$2; } return { start, stop, isActive }; } const shouldEnd = action => action.type === 'DROP_COMPLETE' || action.type === 'DROP_ANIMATE' || action.type === 'FLUSH'; const scrollListener = store => { const listener = getScrollListener({ onWindowScroll: newScroll => { store.dispatch(moveByWindowScroll({ newScroll })); } }); return next => action => { if (!listener.isActive() && action.type === 'INITIAL_PUBLISH') { listener.start(); } if (listener.isActive() && shouldEnd(action)) { listener.stop(); } next(action); }; }; var scrollListener$1 = scrollListener; var getExpiringAnnounce = (announce => { let wasCalled = false; let isExpired = false; const timeoutId = setTimeout(() => { isExpired = true; }); const result = message => { if (wasCalled) { warning('Announcement already made. Not making a second announcement') ; return; } if (isExpired) { warning(` Announcements cannot be made asynchronously. Default message has already been announced. `) ; return; } wasCalled = true; announce(message); clearTimeout(timeoutId); }; result.wasCalled = () => wasCalled; return result; }); var getAsyncMarshal = (() => { const entries = []; const execute = timerId => { const index = entries.findIndex(item => item.timerId === timerId); !(index !== -1) ? invariant(false, 'Could not find timer') : void 0; const [entry] = entries.splice(index, 1); entry.callback(); }; const add = fn => { const timerId = setTimeout(() => execute(timerId)); const entry = { timerId, callback: fn }; entries.push(entry); }; const flush = () => { if (!entries.length) { return; } const shallow = [...entries]; entries.length = 0; shallow.forEach(entry => { clearTimeout(entry.timerId); entry.callback(); }); }; return { add, flush }; }); const areLocationsEqual = (first, second) => { if (first == null && second == null) { return true; } if (first == null || second == null) { return false; } return first.droppableId === second.droppableId && first.index === second.index; }; const isCombineEqual = (first, second) => { if (first == null && second == null) { return true; } if (first == null || second == null) { return false; } return first.draggableId === second.draggableId && first.droppableId === second.droppableId; }; const isCriticalEqual = (first, second) => { if (first === second) { return true; } const isDraggableEqual = first.draggable.id === second.draggable.id && first.draggable.droppableId === second.draggable.droppableId && first.draggable.type === second.draggable.type && first.draggable.index === second.draggable.index; const isDroppableEqual = first.droppable.id === second.droppable.id && first.droppable.type === second.droppable.type; return isDraggableEqual && isDroppableEqual; }; const withTimings = (key, fn) => { fn(); }; const getDragStart = (critical, mode) => ({ draggableId: critical.draggable.id, type: critical.droppable.type, source: { droppableId: critical.droppable.id, index: critical.draggable.index }, mode }); function execute(responder, data, announce, getDefaultMessage) { if (!responder) { announce(getDefaultMessage(data)); return; } const willExpire = getExpiringAnnounce(announce); const provided = { announce: willExpire }; responder(data, provided); if (!willExpire.wasCalled()) { announce(getDefaultMessage(data)); } } var getPublisher = ((getResponders, announce) => { const asyncMarshal = getAsyncMarshal(); let dragging = null; const beforeCapture = (draggableId, mode) => { !!dragging ? invariant(false, 'Cannot fire onBeforeCapture as a drag start has already been published') : void 0; withTimings('onBeforeCapture', () => { const fn = getResponders().onBeforeCapture; if (fn) { const before = { draggableId, mode }; fn(before); } }); }; const beforeStart = (critical, mode) => { !!dragging ? invariant(false, 'Cannot fire onBeforeDragStart as a drag start has already been published') : void 0; withTimings('onBeforeDragStart', () => { const fn = getResponders().onBeforeDragStart; if (fn) { fn(getDragStart(critical, mode)); } }); }; const start = (critical, mode) => { !!dragging ? invariant(false, 'Cannot fire onBeforeDragStart as a drag start has already been published') : void 0; const data = getDragStart(critical, mode); dragging = { mode, lastCritical: critical, lastLocation: data.source, lastCombine: null }; asyncMarshal.add(() => { withTimings('onDragStart', () => execute(getResponders().onDragStart, data, announce, preset$1.onDragStart)); }); }; const update = (critical, impact) => { const location = tryGetDestination(impact); const combine = tryGetCombine(impact); !dragging ? invariant(false, 'Cannot fire onDragMove when onDragStart has not been called') : void 0; const hasCriticalChanged = !isCriticalEqual(critical, dragging.lastCritical); if (hasCriticalChanged) { dragging.lastCritical = critical; } const hasLocationChanged = !areLocationsEqual(dragging.lastLocation, location); if (hasLocationChanged) { dragging.lastLocation = location; } const hasGroupingChanged = !isCombineEqual(dragging.lastCombine, combine); if (hasGroupingChanged) { dragging.lastCombine = combine; } if (!hasCriticalChanged && !hasLocationChanged && !hasGroupingChanged) { return; } const data = { ...getDragStart(critical, dragging.mode), combine, destination: location }; asyncMarshal.add(() => { withTimings('onDragUpdate', () => execute(getResponders().onDragUpdate, data, announce, preset$1.onDragUpdate)); }); }; const flush = () => { !dragging ? invariant(false, 'Can only flush responders while dragging') : void 0; asyncMarshal.flush(); }; const drop = result => { !dragging ? invariant(false, 'Cannot fire onDragEnd when there is no matching onDragStart') : void 0; dragging = null; withTimings('onDragEnd', () => execute(getResponders().onDragEnd, result, announce, preset$1.onDragEnd)); }; const abort = () => { if (!dragging) { return; } const result = { ...getDragStart(dragging.lastCritical, dragging.mode), combine: null, destination: null, reason: 'CANCEL' }; drop(result); }; return { beforeCapture, beforeStart, start, update, flush, drop, abort }; }); var responders = ((getResponders, announce) => { const publisher = getPublisher(getResponders, announce); return store => next => action => { if (action.type === 'BEFORE_INITIAL_CAPTURE') { publisher.beforeCapture(action.payload.draggableId, action.payload.movementMode); return; } if (action.type === 'INITIAL_PUBLISH') { const critical = action.payload.critical; publisher.beforeStart(critical, action.payload.movementMode); next(action); publisher.start(critical, action.payload.movementMode); return; } if (action.type === 'DROP_COMPLETE') { const result = action.payload.completed.result; publisher.flush(); next(action); publisher.drop(result); return; } next(action); if (action.type === 'FLUSH') { publisher.abort(); return; } const state = store.getState(); if (state.phase === 'DRAGGING') { publisher.update(state.critical, state.impact); } }; }); const dropAnimationFinishMiddleware = store => next => action => { if (action.type !== 'DROP_ANIMATION_FINISHED') { next(action); return; } const state = store.getState(); !(state.phase === 'DROP_ANIMATING') ? invariant(false, 'Cannot finish a drop animating when no drop is occurring') : void 0; store.dispatch(completeDrop({ completed: state.completed })); }; var dropAnimationFinish = dropAnimationFinishMiddleware; const dropAnimationFlushOnScrollMiddleware = store => { let unbind = null; let frameId = null; function clear() { if (frameId) { cancelAnimationFrame(frameId); frameId = null; } if (unbind) { unbind(); unbind = null; } } return next => action => { if (action.type === 'FLUSH' || action.type === 'DROP_COMPLETE' || action.type === 'DROP_ANIMATION_FINISHED') { clear(); } next(action); if (action.type !== 'DROP_ANIMATE') { return; } const binding = { eventName: 'scroll', options: { capture: true, passive: false, once: true }, fn: function flushDropAnimation() { const state = store.getState(); if (state.phase === 'DROP_ANIMATING') { store.dispatch(dropAnimationFinished()); } } }; frameId = requestAnimationFrame(() => { frameId = null; unbind = bindEvents(window, [binding]); }); }; }; var dropAnimationFlushOnScroll = dropAnimationFlushOnScrollMiddleware; var dimensionMarshalStopper = (marshal => () => next => action => { if (action.type === 'DROP_COMPLETE' || action.type === 'FLUSH' || action.type === 'DROP_ANIMATE') { marshal.stopPublishing(); } next(action); }); var focus = (marshal => { let isWatching = false; return () => next => action => { if (action.type === 'INITIAL_PUBLISH') { isWatching = true; marshal.tryRecordFocus(action.payload.critical.draggable.id); next(action); marshal.tryRestoreFocusRecorded(); return; } next(action); if (!isWatching) { return; } if (action.type === 'FLUSH') { isWatching = false; marshal.tryRestoreFocusRecorded(); return; } if (action.type === 'DROP_COMPLETE') { isWatching = false; const result = action.payload.completed.result; if (result.combine) { marshal.tryShiftRecord(result.draggableId, result.combine.draggableId); } marshal.tryRestoreFocusRecorded(); } }; }); const shouldStop = action => action.type === 'DROP_COMPLETE' || action.type === 'DROP_ANIMATE' || action.type === 'FLUSH'; var autoScroll = (autoScroller => store => next => action => { if (shouldStop(action)) { autoScroller.stop(); next(action); return; } if (action.type === 'INITIAL_PUBLISH') { next(action); const state = store.getState(); !(state.phase === 'DRAGGING') ? invariant(false, 'Expected phase to be DRAGGING after INITIAL_PUBLISH') : void 0; autoScroller.start(state); return; } next(action); autoScroller.scroll(store.getState()); }); const pendingDrop = store => next => action => { next(action); if (action.type !== 'PUBLISH_WHILE_DRAGGING') { return; } const postActionState = store.getState(); if (postActionState.phase !== 'DROP_PENDING') { return; } if (postActionState.isWaiting) { return; } store.dispatch(drop$1({ reason: postActionState.reason })); }; var pendingDrop$1 = pendingDrop; const composeEnhancers = typeof window !== 'undefined' && window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ ? window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__({ name: '@hello-pangea/dnd' }) : redux.compose; var createStore$1 = (_ref => { let { dimensionMarshal, focusMarshal, styleMarshal, getResponders, announce, autoScroller } = _ref; return redux.createStore(reducer$1, composeEnhancers(redux.applyMiddleware(style(styleMarshal), dimensionMarshalStopper(dimensionMarshal), lift(dimensionMarshal), drop, dropAnimationFinish, dropAnimationFlushOnScroll, pendingDrop$1, autoScroll(autoScroller), scrollListener$1, focus(focusMarshal), responders(getResponders, announce)))); }); const clean$1 = () => ({ additions: {}, removals: {}, modified: {} }); function createPublisher(_ref) { let { registry, callbacks } = _ref; let staging = clean$1(); let frameId = null; const collect = () => { if (frameId) { return; } callbacks.collectionStarting(); frameId = requestAnimationFrame(() => { frameId = null; const { additions, removals, modified } = staging; const added = Object.keys(additions).map(id => registry.draggable.getById(id).getDimension(origin)).sort((a, b) => a.descriptor.index - b.descriptor.index); const updated = Object.keys(modified).map(id => { const entry = registry.droppable.getById(id); const scroll = entry.callbacks.getScrollWhileDragging(); return { droppableId: id, scroll }; }); const result = { additions: added, removals: Object.keys(removals), modified: updated }; staging = clean$1(); callbacks.publish(result); }); }; const add = entry => { const id = entry.descriptor.id; staging.additions[id] = entry; staging.modified[entry.descriptor.droppableId] = true; if (staging.removals[id]) { delete staging.removals[id]; } collect(); }; const remove = entry => { const descriptor = entry.descriptor; staging.removals[descriptor.id] = true; staging.modified[descriptor.droppableId] = true; if (staging.additions[descriptor.id]) { delete staging.additions[descriptor.id]; } collect(); }; const stop = () => { if (!frameId) { return; } cancelAnimationFrame(frameId); frameId = null; staging = clean$1(); }; return { add, remove, stop }; } var getMaxScroll = (_ref => { let { scrollHeight, scrollWidth, height, width } = _ref; const maxScroll = subtract({ x: scrollWidth, y: scrollHeight }, { x: width, y: height }); const adjustedMaxScroll = { x: Math.max(0, maxScroll.x), y: Math.max(0, maxScroll.y) }; return adjustedMaxScroll; }); var getDocumentElement = (() => { const doc = document.documentElement; !doc ? invariant(false, 'Cannot find document.documentElement') : void 0; return doc; }); var getMaxWindowScroll = (() => { const doc = getDocumentElement(); const maxScroll = getMaxScroll({ scrollHeight: doc.scrollHeight, scrollWidth: doc.scrollWidth, width: doc.clientWidth, height: doc.clientHeight }); return maxScroll; }); var getViewport = (() => { const scroll = getWindowScroll(); const maxScroll = getMaxWindowScroll(); const top = scroll.y; const left = scroll.x; const doc = getDocumentElement(); const width = doc.clientWidth; const height = doc.clientHeight; const right = left + width; const bottom = top + height; const frame = cssBoxModel.getRect({ top, left, right, bottom }); const viewport = { frame, scroll: { initial: scroll, current: scroll, max: maxScroll, diff: { value: origin, displacement: origin } } }; return viewport; }); var getInitialPublish = (_ref => { let { critical, scrollOptions, registry } = _ref; const viewport = getViewport(); const windowScroll = viewport.scroll.current; const home = critical.droppable; const droppables = registry.droppable.getAllByType(home.type).map(entry => entry.callbacks.getDimensionAndWatchScroll(windowScroll, scrollOptions)); const draggables = registry.draggable.getAllByType(critical.draggable.type).map(entry => entry.getDimension(windowScroll)); const dimensions = { draggables: toDraggableMap(draggables), droppables: toDroppableMap(droppables) }; const result = { dimensions, critical, viewport }; return result; }); function shouldPublishUpdate(registry, dragging, entry) { if (entry.descriptor.id === dragging.id) { return false; } if (entry.descriptor.type !== dragging.type) { return false; } const home = registry.droppable.getById(entry.descriptor.droppableId); if (home.descriptor.mode !== 'virtual') { warning(` You are attempting to add or remove a Draggable [id: ${entry.descriptor.id}] while a drag is occurring. This is only supported for virtual lists. See https://github.com/hello-pangea/dnd/blob/main/docs/patterns/virtual-lists.md `) ; return false; } return true; } var createDimensionMarshal = ((registry, callbacks) => { let collection = null; const publisher = createPublisher({ callbacks: { publish: callbacks.publishWhileDragging, collectionStarting: callbacks.collectionStarting }, registry }); const updateDroppableIsEnabled = (id, isEnabled) => { !registry.droppable.exists(id) ? invariant(false, `Cannot update is enabled flag of Droppable ${id} as it is not registered`) : void 0; if (!collection) { return; } callbacks.updateDroppableIsEnabled({ id, isEnabled }); }; const updateDroppableIsCombineEnabled = (id, isCombineEnabled) => { if (!collection) { return; } !registry.droppable.exists(id) ? invariant(false, `Cannot update isCombineEnabled flag of Droppable ${id} as it is not registered`) : void 0; callbacks.updateDroppableIsCombineEnabled({ id, isCombineEnabled }); }; const updateDroppableScroll = (id, newScroll) => { if (!collection) { return; } !registry.droppable.exists(id) ? invariant(false, `Cannot update the scroll on Droppable ${id} as it is not registered`) : void 0; callbacks.updateDroppableScroll({ id, newScroll }); }; const scrollDroppable = (id, change) => { if (!collection) { return; } registry.droppable.getById(id).callbacks.scroll(change); }; const stopPublishing = () => { if (!collection) { return; } publisher.stop(); const home = collection.critical.droppable; registry.droppable.getAllByType(home.type).forEach(entry => entry.callbacks.dragStopped()); collection.unsubscribe(); collection = null; }; const subscriber = event => { !collection ? invariant(false, 'Should only be subscribed when a collection is occurring') : void 0; const dragging = collection.critical.draggable; if (event.type === 'ADDITION') { if (shouldPublishUpdate(registry, dragging, event.value)) { publisher.add(event.value); } } if (event.type === 'REMOVAL') { if (shouldPublishUpdate(registry, dragging, event.value)) { publisher.remove(event.value); } } }; const startPublishing = request => { !!collection ? invariant(false, 'Cannot start capturing critical dimensions as there is already a collection') : void 0; const entry = registry.draggable.getById(request.draggableId); const home = registry.droppable.getById(entry.descriptor.droppableId); const critical = { draggable: entry.descriptor, droppable: home.descriptor }; const unsubscribe = registry.subscribe(subscriber); collection = { critical, unsubscribe }; return getInitialPublish({ critical, registry, scrollOptions: request.scrollOptions }); }; const marshal = { updateDroppableIsEnabled, updateDroppableIsCombineEnabled, scrollDroppable, updateDroppableScroll, startPublishing, stopPublishing }; return marshal; }); var canStartDrag = ((state, id) => { if (state.phase === 'IDLE') { return true; } if (state.phase !== 'DROP_ANIMATING') { return false; } if (state.completed.result.draggableId === id) { return false; } return state.completed.result.reason === 'DROP'; }); var scrollWindow = (change => { window.scrollBy(change.x, change.y); }); const getScrollableDroppables = memoizeOne__default["default"](droppables => toDroppableList(droppables).filter(droppable => { if (!droppable.isEnabled) { return false; } if (!droppable.frame) { return false; } return true; })); const getScrollableDroppableOver = (target, droppables) => { const maybe = getScrollableDroppables(droppables).find(droppable => { !droppable.frame ? invariant(false, 'Invalid result') : void 0; return isPositionInFrame(droppable.frame.pageMarginBox)(target); }) || null; return maybe; }; var getBestScrollableDroppable = (_ref => { let { center, destination, droppables } = _ref; if (destination) { const dimension = droppables[destination]; if (!dimension.frame) { return null; } return dimension; } const dimension = getScrollableDroppableOver(center, droppables); return dimension; }); const config = { startFromPercentage: 0.25, maxScrollAtPercentage: 0.05, maxPixelScroll: 28, ease: percentage => percentage ** 2, durationDampening: { stopDampeningAt: 1200, accelerateAt: 360 } }; var config$1 = config; var getDistanceThresholds = ((container, axis) => { const startScrollingFrom = container[axis.size] * config$1.startFromPercentage; const maxScrollValueAt = container[axis.size] * config$1.maxScrollAtPercentage; const thresholds = { startScrollingFrom, maxScrollValueAt }; return thresholds; }); var getPercentage = (_ref => { let { startOfRange, endOfRange, current } = _ref; const range = endOfRange - startOfRange; if (range === 0) { warning(` Detected distance range of 0 in the fluid auto scroller This is unexpected and would cause a divide by 0 issue. Not allowing an auto scroll `) ; return 0; } const currentInRange = current - startOfRange; const percentage = currentInRange / range; return percentage; }); var minScroll = 1; var getValueFromDistance = ((distanceToEdge, thresholds) => { if (distanceToEdge > thresholds.startScrollingFrom) { return 0; } if (distanceToEdge <= thresholds.maxScrollValueAt) { return config$1.maxPixelScroll; } if (distanceToEdge === thresholds.startScrollingFrom) { return minScroll; } const percentageFromMaxScrollValueAt = getPercentage({ startOfRange: thresholds.maxScrollValueAt, endOfRange: thresholds.startScrollingFrom, current: distanceToEdge }); const percentageFromStartScrollingFrom = 1 - percentageFromMaxScrollValueAt; const scroll = config$1.maxPixelScroll * config$1.ease(percentageFromStartScrollingFrom); return Math.ceil(scroll); }); const accelerateAt = config$1.durationDampening.accelerateAt; const stopAt = config$1.durationDampening.stopDampeningAt; var dampenValueByTime = ((proposedScroll, dragStartTime) => { const startOfRange = dragStartTime; const endOfRange = stopAt; const now = Date.now(); const runTime = now - startOfRange; if (runTime >= stopAt) { return proposedScroll; } if (runTime < accelerateAt) { return minScroll; } const betweenAccelerateAtAndStopAtPercentage = getPercentage({ startOfRange: accelerateAt, endOfRange, current: runTime }); const scroll = proposedScroll * config$1.ease(betweenAccelerateAtAndStopAtPercentage); return Math.ceil(scroll); }); var getValue = (_ref => { let { distanceToEdge, thresholds, dragStartTime, shouldUseTimeDampening } = _ref; const scroll = getValueFromDistance(distanceToEdge, thresholds); if (scroll === 0) { return 0; } if (!shouldUseTimeDampening) { return scroll; } return Math.max(dampenValueByTime(scroll, dragStartTime), minScroll); }); var getScrollOnAxis = (_ref => { let { container, distanceToEdges, dragStartTime, axis, shouldUseTimeDampening } = _ref; const thresholds = getDistanceThresholds(container, axis); const isCloserToEnd = distanceToEdges[axis.end] < distanceToEdges[axis.start]; if (isCloserToEnd) { return getValue({ distanceToEdge: distanceToEdges[axis.end], thresholds, dragStartTime, shouldUseTimeDampening }); } return -1 * getValue({ distanceToEdge: distanceToEdges[axis.start], thresholds, dragStartTime, shouldUseTimeDampening }); }); var adjustForSizeLimits = (_ref => { let { container, subject, proposedScroll } = _ref; const isTooBigVertically = subject.height > container.height; const isTooBigHorizontally = subject.width > container.width; if (!isTooBigHorizontally && !isTooBigVertically) { return proposedScroll; } if (isTooBigHorizontally && isTooBigVertically) { return null; } return { x: isTooBigHorizontally ? 0 : proposedScroll.x, y: isTooBigVertically ? 0 : proposedScroll.y }; }); const clean = apply(value => value === 0 ? 0 : value); var getScroll$1 = (_ref => { let { dragStartTime, container, subject, center, shouldUseTimeDampening } = _ref; const distanceToEdges = { top: center.y - container.top, right: container.right - center.x, bottom: container.bottom - center.y, left: center.x - container.left }; const y = getScrollOnAxis({ container, distanceToEdges, dragStartTime, axis: vertical, shouldUseTimeDampening }); const x = getScrollOnAxis({ container, distanceToEdges, dragStartTime, axis: horizontal, shouldUseTimeDampening }); const required = clean({ x, y }); if (isEqual$1(required, origin)) { return null; } const limited = adjustForSizeLimits({ container, subject, proposedScroll: required }); if (!limited) { return null; } return isEqual$1(limited, origin) ? null : limited; }); const smallestSigned = apply(value => { if (value === 0) { return 0; } return value > 0 ? 1 : -1; }); const getOverlap = (() => { const getRemainder = (target, max) => { if (target < 0) { return target; } if (target > max) { return target - max; } return 0; }; return _ref => { let { current, max, change } = _ref; const targetScroll = add(current, change); const overlap = { x: getRemainder(targetScroll.x, max.x), y: getRemainder(targetScroll.y, max.y) }; if (isEqual$1(overlap, origin)) { return null; } return overlap; }; })(); const canPartiallyScroll = _ref2 => { let { max: rawMax, current, change } = _ref2; const max = { x: Math.max(current.x, rawMax.x), y: Math.max(current.y, rawMax.y) }; const smallestChange = smallestSigned(change); const overlap = getOverlap({ max, current, change: smallestChange }); if (!overlap) { return true; } if (smallestChange.x !== 0 && overlap.x === 0) { return true; } if (smallestChange.y !== 0 && overlap.y === 0) { return true; } return false; }; const canScrollWindow = (viewport, change) => canPartiallyScroll({ current: viewport.scroll.current, max: viewport.scroll.max, change }); const getWindowOverlap = (viewport, change) => { if (!canScrollWindow(viewport, change)) { return null; } const max = viewport.scroll.max; const current = viewport.scroll.current; return getOverlap({ current, max, change }); }; const canScrollDroppable = (droppable, change) => { const frame = droppable.frame; if (!frame) { return false; } return canPartiallyScroll({ current: frame.scroll.current, max: frame.scroll.max, change }); }; const getDroppableOverlap = (droppable, change) => { const frame = droppable.frame; if (!frame) { return null; } if (!canScrollDroppable(droppable, change)) { return null; } return getOverlap({ current: frame.scroll.current, max: frame.scroll.max, change }); }; var getWindowScrollChange = (_ref => { let { viewport, subject, center, dragStartTime, shouldUseTimeDampening } = _ref; const scroll = getScroll$1({ dragStartTime, container: viewport.frame, subject, center, shouldUseTimeDampening }); return scroll && canScrollWindow(viewport, scroll) ? scroll : null; }); var getDroppableScrollChange = (_ref => { let { droppable, subject, center, dragStartTime, shouldUseTimeDampening } = _ref; const frame = droppable.frame; if (!frame) { return null; } const scroll = getScroll$1({ dragStartTime, container: frame.pageMarginBox, subject, center, shouldUseTimeDampening }); return scroll && canScrollDroppable(droppable, scroll) ? scroll : null; }); var scroll = (_ref => { let { state, dragStartTime, shouldUseTimeDampening, scrollWindow, scrollDroppable } = _ref; const center = state.current.page.borderBoxCenter; const draggable = state.dimensions.draggables[state.critical.draggable.id]; const subject = draggable.page.marginBox; if (state.isWindowScrollAllowed) { const viewport = state.viewport; const change = getWindowScrollChange({ dragStartTime, viewport, subject, center, shouldUseTimeDampening }); if (change) { scrollWindow(change); return; } } const droppable = getBestScrollableDroppable({ center, destination: whatIsDraggedOver(state.impact), droppables: state.dimensions.droppables }); if (!droppable) { return; } const change = getDroppableScrollChange({ dragStartTime, droppable, subject, center, shouldUseTimeDampening }); if (change) { scrollDroppable(droppable.descriptor.id, change); } }); var createFluidScroller = (_ref => { let { scrollWindow, scrollDroppable } = _ref; const scheduleWindowScroll = rafSchd__default["default"](scrollWindow); const scheduleDroppableScroll = rafSchd__default["default"](scrollDroppable); let dragging = null; const tryScroll = state => { !dragging ? invariant(false, 'Cannot fluid scroll if not dragging') : void 0; const { shouldUseTimeDampening, dragStartTime } = dragging; scroll({ state, scrollWindow: scheduleWindowScroll, scrollDroppable: scheduleDroppableScroll, dragStartTime, shouldUseTimeDampening }); }; const start$1 = state => { !!dragging ? invariant(false, 'Cannot start auto scrolling when already started') : void 0; const dragStartTime = Date.now(); let wasScrollNeeded = false; const fakeScrollCallback = () => { wasScrollNeeded = true; }; scroll({ state, dragStartTime: 0, shouldUseTimeDampening: false, scrollWindow: fakeScrollCallback, scrollDroppable: fakeScrollCallback }); dragging = { dragStartTime, shouldUseTimeDampening: wasScrollNeeded }; if (wasScrollNeeded) { tryScroll(state); } }; const stop = () => { if (!dragging) { return; } scheduleWindowScroll.cancel(); scheduleDroppableScroll.cancel(); dragging = null; }; return { start: start$1, stop, scroll: tryScroll }; }); var createJumpScroller = (_ref => { let { move, scrollDroppable, scrollWindow } = _ref; const moveByOffset = (state, offset) => { const client = add(state.current.client.selection, offset); move({ client }); }; const scrollDroppableAsMuchAsItCan = (droppable, change) => { if (!canScrollDroppable(droppable, change)) { return change; } const overlap = getDroppableOverlap(droppable, change); if (!overlap) { scrollDroppable(droppable.descriptor.id, change); return null; } const whatTheDroppableCanScroll = subtract(change, overlap); scrollDroppable(droppable.descriptor.id, whatTheDroppableCanScroll); const remainder = subtract(change, whatTheDroppableCanScroll); return remainder; }; const scrollWindowAsMuchAsItCan = (isWindowScrollAllowed, viewport, change) => { if (!isWindowScrollAllowed) { return change; } if (!canScrollWindow(viewport, change)) { return change; } const overlap = getWindowOverlap(viewport, change); if (!overlap) { scrollWindow(change); return null; } const whatTheWindowCanScroll = subtract(change, overlap); scrollWindow(whatTheWindowCanScroll); const remainder = subtract(change, whatTheWindowCanScroll); return remainder; }; const jumpScroller = state => { const request = state.scrollJumpRequest; if (!request) { return; } const destination = whatIsDraggedOver(state.impact); !destination ? invariant(false, 'Cannot perform a jump scroll when there is no destination') : void 0; const droppableRemainder = scrollDroppableAsMuchAsItCan(state.dimensions.droppables[destination], request); if (!droppableRemainder) { return; } const viewport = state.viewport; const windowRemainder = scrollWindowAsMuchAsItCan(state.isWindowScrollAllowed, viewport, droppableRemainder); if (!windowRemainder) { return; } moveByOffset(state, windowRemainder); }; return jumpScroller; }); var createAutoScroller = (_ref => { let { scrollDroppable, scrollWindow, move } = _ref; const fluidScroller = createFluidScroller({ scrollWindow, scrollDroppable }); const jumpScroll = createJumpScroller({ move, scrollWindow, scrollDroppable }); const scroll = state => { if (state.phase !== 'DRAGGING') { return; } if (state.movementMode === 'FLUID') { fluidScroller.scroll(state); return; } if (!state.scrollJumpRequest) { return; } jumpScroll(state); }; const scroller = { scroll, start: fluidScroller.start, stop: fluidScroller.stop }; return scroller; }); const prefix = 'data-rfd'; const dragHandle = (() => { const base = `${prefix}-drag-handle`; return { base, draggableId: `${base}-draggable-id`, contextId: `${base}-context-id` }; })(); const draggable = (() => { const base = `${prefix}-draggable`; return { base, contextId: `${base}-context-id`, id: `${base}-id` }; })(); const droppable = (() => { const base = `${prefix}-droppable`; return { base, contextId: `${base}-context-id`, id: `${base}-id` }; })(); const scrollContainer = { contextId: `${prefix}-scroll-container-context-id` }; const makeGetSelector = context => attribute => `[${attribute}="${context}"]`; const getStyles = (rules, property) => rules.map(rule => { const value = rule.styles[property]; if (!value) { return ''; } return `${rule.selector} { ${value} }`; }).join(' '); const noPointerEvents = 'pointer-events: none;'; var getStyles$1 = (contextId => { const getSelector = makeGetSelector(contextId); const dragHandle$1 = (() => { const grabCursor = ` cursor: -webkit-grab; cursor: grab; `; return { selector: getSelector(dragHandle.contextId), styles: { always: ` -webkit-touch-callout: none; -webkit-tap-highlight-color: rgba(0,0,0,0); touch-action: manipulation; `, resting: grabCursor, dragging: noPointerEvents, dropAnimating: grabCursor } }; })(); const draggable$1 = (() => { const transition = ` transition: ${transitions.outOfTheWay}; `; return { selector: getSelector(draggable.contextId), styles: { dragging: transition, dropAnimating: transition, userCancel: transition } }; })(); const droppable$1 = { selector: getSelector(droppable.contextId), styles: { always: `overflow-anchor: none;` } }; const body = { selector: 'body', styles: { dragging: ` cursor: grabbing; cursor: -webkit-grabbing; user-select: none; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; overflow-anchor: none; ` } }; const rules = [draggable$1, dragHandle$1, droppable$1, body]; return { always: getStyles(rules, 'always'), resting: getStyles(rules, 'resting'), dragging: getStyles(rules, 'dragging'), dropAnimating: getStyles(rules, 'dropAnimating'), userCancel: getStyles(rules, 'userCancel') }; }); const useIsomorphicLayoutEffect = typeof window !== 'undefined' && typeof window.document !== 'undefined' && typeof window.document.createElement !== 'undefined' ? React.useLayoutEffect : React.useEffect; var useLayoutEffect = useIsomorphicLayoutEffect; const getHead = () => { const head = document.querySelector('head'); !head ? invariant(false, 'Cannot find the head to append a style to') : void 0; return head; }; const createStyleEl = nonce => { const el = document.createElement('style'); if (nonce) { el.setAttribute('nonce', nonce); } el.type = 'text/css'; return el; }; function useStyleMarshal(contextId, nonce) { const styles = useMemoOne.useMemo(() => getStyles$1(contextId), [contextId]); const alwaysRef = React.useRef(null); const dynamicRef = React.useRef(null); const setDynamicStyle = useMemoOne.useCallback(memoizeOne__default["default"](proposed => { const el = dynamicRef.current; !el ? invariant(false, 'Cannot set dynamic style element if it is not set') : void 0; el.textContent = proposed; }), []); const setAlwaysStyle = useMemoOne.useCallback(proposed => { const el = alwaysRef.current; !el ? invariant(false, 'Cannot set dynamic style element if it is not set') : void 0; el.textContent = proposed; }, []); useLayoutEffect(() => { !(!alwaysRef.current && !dynamicRef.current) ? invariant(false, 'style elements already mounted') : void 0; const always = createStyleEl(nonce); const dynamic = createStyleEl(nonce); alwaysRef.current = always; dynamicRef.current = dynamic; always.setAttribute(`${prefix}-always`, contextId); dynamic.setAttribute(`${prefix}-dynamic`, contextId); getHead().appendChild(always); getHead().appendChild(dynamic); setAlwaysStyle(styles.always); setDynamicStyle(styles.resting); return () => { const remove = ref => { const current = ref.current; !current ? invariant(false, 'Cannot unmount ref as it is not set') : void 0; getHead().removeChild(current); ref.current = null; }; remove(alwaysRef); remove(dynamicRef); }; }, [nonce, setAlwaysStyle, setDynamicStyle, styles.always, styles.resting, contextId]); const dragging = useMemoOne.useCallback(() => setDynamicStyle(styles.dragging), [setDynamicStyle, styles.dragging]); const dropping = useMemoOne.useCallback(reason => { if (reason === 'DROP') { setDynamicStyle(styles.dropAnimating); return; } setDynamicStyle(styles.userCancel); }, [setDynamicStyle, styles.dropAnimating, styles.userCancel]); const resting = useMemoOne.useCallback(() => { if (!dynamicRef.current) { return; } setDynamicStyle(styles.resting); }, [setDynamicStyle, styles.resting]); const marshal = useMemoOne.useMemo(() => ({ dragging, dropping, resting }), [dragging, dropping, resting]); return marshal; } function querySelectorAll(parentNode, selector) { return Array.from(parentNode.querySelectorAll(selector)); } var getWindowFromEl = (el => { var _el$ownerDocument; return (el == null ? void 0 : (_el$ownerDocument = el.ownerDocument) == null ? void 0 : _el$ownerDocument.defaultView) || window; }); function isHtmlElement(el) { return el instanceof getWindowFromEl(el).HTMLElement; } function findDragHandle(contextId, draggableId) { const selector = `[${dragHandle.contextId}="${contextId}"]`; const possible = querySelectorAll(document, selector); if (!possible.length) { warning(`Unable to find any drag handles in the context "${contextId}"`) ; return null; } const handle = possible.find(el => { return el.getAttribute(dragHandle.draggableId) === draggableId; }); if (!handle) { warning(`Unable to find drag handle with id "${draggableId}" as no handle with a matching id was found`) ; return null; } if (!isHtmlElement(handle)) { warning('drag handle needs to be a HTMLElement') ; return null; } return handle; } function useFocusMarshal(contextId) { const entriesRef = React.useRef({}); const recordRef = React.useRef(null); const restoreFocusFrameRef = React.useRef(null); const isMountedRef = React.useRef(false); const register = useMemoOne.useCallback(function register(id, focus) { const entry = { id, focus }; entriesRef.current[id] = entry; return function unregister() { const entries = entriesRef.current; const current = entries[id]; if (current !== entry) { delete entries[id]; } }; }, []); const tryGiveFocus = useMemoOne.useCallback(function tryGiveFocus(tryGiveFocusTo) { const handle = findDragHandle(contextId, tryGiveFocusTo); if (handle && handle !== document.activeElement) { handle.focus(); } }, [contextId]); const tryShiftRecord = useMemoOne.useCallback(function tryShiftRecord(previous, redirectTo) { if (recordRef.current === previous) { recordRef.current = redirectTo; } }, []); const tryRestoreFocusRecorded = useMemoOne.useCallback(function tryRestoreFocusRecorded() { if (restoreFocusFrameRef.current) { return; } if (!isMountedRef.current) { return; } restoreFocusFrameRef.current = requestAnimationFrame(() => { restoreFocusFrameRef.current = null; const record = recordRef.current; if (record) { tryGiveFocus(record); } }); }, [tryGiveFocus]); const tryRecordFocus = useMemoOne.useCallback(function tryRecordFocus(id) { recordRef.current = null; const focused = document.activeElement; if (!focused) { return; } if (focused.getAttribute(dragHandle.draggableId) !== id) { return; } recordRef.current = id; }, []); useLayoutEffect(() => { isMountedRef.current = true; return function clearFrameOnUnmount() { isMountedRef.current = false; const frameId = restoreFocusFrameRef.current; if (frameId) { cancelAnimationFrame(frameId); } }; }, []); const marshal = useMemoOne.useMemo(() => ({ register, tryRecordFocus, tryRestoreFocusRecorded, tryShiftRecord }), [register, tryRecordFocus, tryRestoreFocusRecorded, tryShiftRecord]); return marshal; } function createRegistry() { const entries = { draggables: {}, droppables: {} }; const subscribers = []; function subscribe(cb) { subscribers.push(cb); return function unsubscribe() { const index = subscribers.indexOf(cb); if (index === -1) { return; } subscribers.splice(index, 1); }; } function notify(event) { if (subscribers.length) { subscribers.forEach(cb => cb(event)); } } function findDraggableById(id) { return entries.draggables[id] || null; } function getDraggableById(id) { const entry = findDraggableById(id); !entry ? invariant(false, `Cannot find draggable entry with id [${id}]`) : void 0; return entry; } const draggableAPI = { register: entry => { entries.draggables[entry.descriptor.id] = entry; notify({ type: 'ADDITION', value: entry }); }, update: (entry, last) => { const current = entries.draggables[last.descriptor.id]; if (!current) { return; } if (current.uniqueId !== entry.uniqueId) { return; } delete entries.draggables[last.descriptor.id]; entries.draggables[entry.descriptor.id] = entry; }, unregister: entry => { const draggableId = entry.descriptor.id; const current = findDraggableById(draggableId); if (!current) { return; } if (entry.uniqueId !== current.uniqueId) { return; } delete entries.draggables[draggableId]; if (entries.droppables[entry.descriptor.droppableId]) { notify({ type: 'REMOVAL', value: entry }); } }, getById: getDraggableById, findById: findDraggableById, exists: id => Boolean(findDraggableById(id)), getAllByType: type => Object.values(entries.draggables).filter(entry => entry.descriptor.type === type) }; function findDroppableById(id) { return entries.droppables[id] || null; } function getDroppableById(id) { const entry = findDroppableById(id); !entry ? invariant(false, `Cannot find droppable entry with id [${id}]`) : void 0; return entry; } const droppableAPI = { register: entry => { entries.droppables[entry.descriptor.id] = entry; }, unregister: entry => { const current = findDroppableById(entry.descriptor.id); if (!current) { return; } if (entry.uniqueId !== current.uniqueId) { return; } delete entries.droppables[entry.descriptor.id]; }, getById: getDroppableById, findById: findDroppableById, exists: id => Boolean(findDroppableById(id)), getAllByType: type => Object.values(entries.droppables).filter(entry => entry.descriptor.type === type) }; function clean() { entries.draggables = {}; entries.droppables = {}; subscribers.length = 0; } return { draggable: draggableAPI, droppable: droppableAPI, subscribe, clean }; } function useRegistry() { const registry = useMemoOne.useMemo(createRegistry, []); React.useEffect(() => { return function unmount() { if (React__default["default"].version.startsWith('16') || React__default["default"].version.startsWith('17')) { requestAnimationFrame(registry.clean); } else { registry.clean(); } }; }, [registry]); return registry; } var StoreContext = React__default["default"].createContext(null); var getBodyElement = (() => { const body = document.body; !body ? invariant(false, 'Cannot find document.body') : void 0; return body; }); const visuallyHidden = { position: 'absolute', width: '1px', height: '1px', margin: '-1px', border: '0', padding: '0', overflow: 'hidden', clip: 'rect(0 0 0 0)', 'clip-path': 'inset(100%)' }; var visuallyHidden$1 = visuallyHidden; const getId = contextId => `rfd-announcement-${contextId}`; function useAnnouncer(contextId) { const id = useMemoOne.useMemo(() => getId(contextId), [contextId]); const ref = React.useRef(null); React.useEffect(function setup() { const el = document.createElement('div'); ref.current = el; el.id = id; el.setAttribute('aria-live', 'assertive'); el.setAttribute('aria-atomic', 'true'); _extends__default["default"](el.style, visuallyHidden$1); getBodyElement().appendChild(el); return function cleanup() { setTimeout(function remove() { const body = getBodyElement(); if (body.contains(el)) { body.removeChild(el); } if (el === ref.current) { ref.current = null; } }); }; }, [id]); const announce = useMemoOne.useCallback(message => { const el = ref.current; if (el) { el.textContent = message; return; } warning(` A screen reader message was trying to be announced but it was unable to do so. This can occur if you unmount your in your onDragEnd. Consider calling provided.announce() before the unmount so that the instruction will not be lost for users relying on a screen reader. Message not passed to screen reader: "${message}" `) ; }, []); return announce; } let count$1 = 0; const defaults = { separator: '::' }; function reset$1() { count$1 = 0; } function useUniqueId(prefix, options) { if (options === void 0) { options = defaults; } return useMemoOne.useMemo(() => `${prefix}${options.separator}${count$1++}`, [options.separator, prefix]); } function getElementId(_ref) { let { contextId, uniqueId } = _ref; return `rfd-hidden-text-${contextId}-${uniqueId}`; } function useHiddenTextElement(_ref2) { let { contextId, text } = _ref2; const uniqueId = useUniqueId('hidden-text', { separator: '-' }); const id = useMemoOne.useMemo(() => getElementId({ contextId, uniqueId }), [uniqueId, contextId]); React.useEffect(function mount() { const el = document.createElement('div'); el.id = id; el.textContent = text; el.style.display = 'none'; getBodyElement().appendChild(el); return function unmount() { const body = getBodyElement(); if (body.contains(el)) { body.removeChild(el); } }; }, [id, text]); return id; } var AppContext = React__default["default"].createContext(null); var peerDependencies = { react: "^16.8.5 || ^17.0.0 || ^18.0.0", "react-dom": "^16.8.5 || ^17.0.0 || ^18.0.0" }; const semver = /(\d+)\.(\d+)\.(\d+)/; const getVersion = value => { const result = semver.exec(value); !(result != null) ? invariant(false, `Unable to parse React version ${value}`) : void 0; const major = Number(result[1]); const minor = Number(result[2]); const patch = Number(result[3]); return { major, minor, patch, raw: value }; }; const isSatisfied = (expected, actual) => { if (actual.major > expected.major) { return true; } if (actual.major < expected.major) { return false; } if (actual.minor > expected.minor) { return true; } if (actual.minor < expected.minor) { return false; } return actual.patch >= expected.patch; }; var checkReactVersion = ((peerDepValue, actualValue) => { const peerDep = getVersion(peerDepValue); const actual = getVersion(actualValue); if (isSatisfied(peerDep, actual)) { return; } warning(` React version: [${actual.raw}] does not satisfy expected peer dependency version: [${peerDep.raw}] This can result in run time bugs, and even fatal crashes `) ; }); const suffix = ` We expect a html5 doctype: This is to ensure consistent browser layout and measurement More information: https://github.com/hello-pangea/dnd/blob/main/docs/guides/doctype.md `; var checkDoctype = (doc => { const doctype = doc.doctype; if (!doctype) { warning(` No found. ${suffix} `) ; return; } if (doctype.name.toLowerCase() !== 'html') { warning(` Unexpected found: (${doctype.name}) ${suffix} `) ; } if (doctype.publicId !== '') { warning(` Unexpected publicId found: (${doctype.publicId}) A html5 doctype does not have a publicId ${suffix} `) ; } }); function useDev(useHook) { { useHook(); } } function useDevSetupWarning(fn, inputs) { useDev(() => { React.useEffect(() => { try { fn(); } catch (e) { error(` A setup problem was encountered. > ${e.message} `); } }, inputs); }); } function useStartupValidation() { useDevSetupWarning(() => { checkReactVersion(peerDependencies.react, React__default["default"].version); checkDoctype(document); }, []); } function usePrevious(current) { const ref = React.useRef(current); React.useEffect(() => { ref.current = current; }); return ref; } function create() { let lock = null; function isClaimed() { return Boolean(lock); } function isActive(value) { return value === lock; } function claim(abandon) { !!lock ? invariant(false, 'Cannot claim lock as it is already claimed') : void 0; const newLock = { abandon }; lock = newLock; return newLock; } function release() { !lock ? invariant(false, 'Cannot release lock when there is no lock') : void 0; lock = null; } function tryAbandon() { if (lock) { lock.abandon(); release(); } } return { isClaimed, isActive, claim, release, tryAbandon }; } function isDragging(state) { if (state.phase === 'IDLE' || state.phase === 'DROP_ANIMATING') { return false; } return state.isDragging; } const tab = 9; const enter = 13; const escape = 27; const space = 32; const pageUp = 33; const pageDown = 34; const end = 35; const home = 36; const arrowLeft = 37; const arrowUp = 38; const arrowRight = 39; const arrowDown = 40; const preventedKeys = { [enter]: true, [tab]: true }; var preventStandardKeyEvents = (event => { if (preventedKeys[event.keyCode]) { event.preventDefault(); } }); const supportedEventName = (() => { const base = 'visibilitychange'; if (typeof document === 'undefined') { return base; } const candidates = [base, `ms${base}`, `webkit${base}`, `moz${base}`, `o${base}`]; const supported = candidates.find(eventName => `on${eventName}` in document); return supported || base; })(); var supportedPageVisibilityEventName = supportedEventName; const primaryButton = 0; const sloppyClickThreshold = 5; function isSloppyClickThresholdExceeded(original, current) { return Math.abs(current.x - original.x) >= sloppyClickThreshold || Math.abs(current.y - original.y) >= sloppyClickThreshold; } const idle$1 = { type: 'IDLE' }; function getCaptureBindings(_ref) { let { cancel, completed, getPhase, setPhase } = _ref; return [{ eventName: 'mousemove', fn: event => { const { button, clientX, clientY } = event; if (button !== primaryButton) { return; } const point = { x: clientX, y: clientY }; const phase = getPhase(); if (phase.type === 'DRAGGING') { event.preventDefault(); phase.actions.move(point); return; } !(phase.type === 'PENDING') ? invariant(false, 'Cannot be IDLE') : void 0; const pending = phase.point; if (!isSloppyClickThresholdExceeded(pending, point)) { return; } event.preventDefault(); const actions = phase.actions.fluidLift(point); setPhase({ type: 'DRAGGING', actions }); } }, { eventName: 'mouseup', fn: event => { const phase = getPhase(); if (phase.type !== 'DRAGGING') { cancel(); return; } event.preventDefault(); phase.actions.drop({ shouldBlockNextClick: true }); completed(); } }, { eventName: 'mousedown', fn: event => { if (getPhase().type === 'DRAGGING') { event.preventDefault(); } cancel(); } }, { eventName: 'keydown', fn: event => { const phase = getPhase(); if (phase.type === 'PENDING') { cancel(); return; } if (event.keyCode === escape) { event.preventDefault(); cancel(); return; } preventStandardKeyEvents(event); } }, { eventName: 'resize', fn: cancel }, { eventName: 'scroll', options: { passive: true, capture: false }, fn: () => { if (getPhase().type === 'PENDING') { cancel(); } } }, { eventName: 'webkitmouseforcedown', fn: event => { const phase = getPhase(); !(phase.type !== 'IDLE') ? invariant(false, 'Unexpected phase') : void 0; if (phase.actions.shouldRespectForcePress()) { cancel(); return; } event.preventDefault(); } }, { eventName: supportedPageVisibilityEventName, fn: cancel }]; } function useMouseSensor(api) { const phaseRef = React.useRef(idle$1); const unbindEventsRef = React.useRef(noop$2); const startCaptureBinding = useMemoOne.useMemo(() => ({ eventName: 'mousedown', fn: function onMouseDown(event) { if (event.defaultPrevented) { return; } if (event.button !== primaryButton) { return; } if (event.ctrlKey || event.metaKey || event.shiftKey || event.altKey) { return; } const draggableId = api.findClosestDraggableId(event); if (!draggableId) { return; } const actions = api.tryGetLock(draggableId, stop, { sourceEvent: event }); if (!actions) { return; } event.preventDefault(); const point = { x: event.clientX, y: event.clientY }; unbindEventsRef.current(); startPendingDrag(actions, point); } }), [api]); const preventForcePressBinding = useMemoOne.useMemo(() => ({ eventName: 'webkitmouseforcewillbegin', fn: event => { if (event.defaultPrevented) { return; } const id = api.findClosestDraggableId(event); if (!id) { return; } const options = api.findOptionsForDraggable(id); if (!options) { return; } if (options.shouldRespectForcePress) { return; } if (!api.canGetLock(id)) { return; } event.preventDefault(); } }), [api]); const listenForCapture = useMemoOne.useCallback(function listenForCapture() { const options = { passive: false, capture: true }; unbindEventsRef.current = bindEvents(window, [preventForcePressBinding, startCaptureBinding], options); }, [preventForcePressBinding, startCaptureBinding]); const stop = useMemoOne.useCallback(() => { const current = phaseRef.current; if (current.type === 'IDLE') { return; } phaseRef.current = idle$1; unbindEventsRef.current(); listenForCapture(); }, [listenForCapture]); const cancel = useMemoOne.useCallback(() => { const phase = phaseRef.current; stop(); if (phase.type === 'DRAGGING') { phase.actions.cancel({ shouldBlockNextClick: true }); } if (phase.type === 'PENDING') { phase.actions.abort(); } }, [stop]); const bindCapturingEvents = useMemoOne.useCallback(function bindCapturingEvents() { const options = { capture: true, passive: false }; const bindings = getCaptureBindings({ cancel, completed: stop, getPhase: () => phaseRef.current, setPhase: phase => { phaseRef.current = phase; } }); unbindEventsRef.current = bindEvents(window, bindings, options); }, [cancel, stop]); const startPendingDrag = useMemoOne.useCallback(function startPendingDrag(actions, point) { !(phaseRef.current.type === 'IDLE') ? invariant(false, 'Expected to move from IDLE to PENDING drag') : void 0; phaseRef.current = { type: 'PENDING', point, actions }; bindCapturingEvents(); }, [bindCapturingEvents]); useLayoutEffect(function mount() { listenForCapture(); return function unmount() { unbindEventsRef.current(); }; }, [listenForCapture]); } function noop$1() {} const scrollJumpKeys = { [pageDown]: true, [pageUp]: true, [home]: true, [end]: true }; function getDraggingBindings(actions, stop) { function cancel() { stop(); actions.cancel(); } function drop() { stop(); actions.drop(); } return [{ eventName: 'keydown', fn: event => { if (event.keyCode === escape) { event.preventDefault(); cancel(); return; } if (event.keyCode === space) { event.preventDefault(); drop(); return; } if (event.keyCode === arrowDown) { event.preventDefault(); actions.moveDown(); return; } if (event.keyCode === arrowUp) { event.preventDefault(); actions.moveUp(); return; } if (event.keyCode === arrowRight) { event.preventDefault(); actions.moveRight(); return; } if (event.keyCode === arrowLeft) { event.preventDefault(); actions.moveLeft(); return; } if (scrollJumpKeys[event.keyCode]) { event.preventDefault(); return; } preventStandardKeyEvents(event); } }, { eventName: 'mousedown', fn: cancel }, { eventName: 'mouseup', fn: cancel }, { eventName: 'click', fn: cancel }, { eventName: 'touchstart', fn: cancel }, { eventName: 'resize', fn: cancel }, { eventName: 'wheel', fn: cancel, options: { passive: true } }, { eventName: supportedPageVisibilityEventName, fn: cancel }]; } function useKeyboardSensor(api) { const unbindEventsRef = React.useRef(noop$1); const startCaptureBinding = useMemoOne.useMemo(() => ({ eventName: 'keydown', fn: function onKeyDown(event) { if (event.defaultPrevented) { return; } if (event.keyCode !== space) { return; } const draggableId = api.findClosestDraggableId(event); if (!draggableId) { return; } const preDrag = api.tryGetLock(draggableId, stop, { sourceEvent: event }); if (!preDrag) { return; } event.preventDefault(); let isCapturing = true; const actions = preDrag.snapLift(); unbindEventsRef.current(); function stop() { !isCapturing ? invariant(false, 'Cannot stop capturing a keyboard drag when not capturing') : void 0; isCapturing = false; unbindEventsRef.current(); listenForCapture(); } unbindEventsRef.current = bindEvents(window, getDraggingBindings(actions, stop), { capture: true, passive: false }); } }), [api]); const listenForCapture = useMemoOne.useCallback(function tryStartCapture() { const options = { passive: false, capture: true }; unbindEventsRef.current = bindEvents(window, [startCaptureBinding], options); }, [startCaptureBinding]); useLayoutEffect(function mount() { listenForCapture(); return function unmount() { unbindEventsRef.current(); }; }, [listenForCapture]); } const idle = { type: 'IDLE' }; const timeForLongPress = 120; const forcePressThreshold = 0.15; function getWindowBindings(_ref) { let { cancel, getPhase } = _ref; return [{ eventName: 'orientationchange', fn: cancel }, { eventName: 'resize', fn: cancel }, { eventName: 'contextmenu', fn: event => { event.preventDefault(); } }, { eventName: 'keydown', fn: event => { if (getPhase().type !== 'DRAGGING') { cancel(); return; } if (event.keyCode === escape) { event.preventDefault(); } cancel(); } }, { eventName: supportedPageVisibilityEventName, fn: cancel }]; } function getHandleBindings(_ref2) { let { cancel, completed, getPhase } = _ref2; return [{ eventName: 'touchmove', options: { capture: false }, fn: event => { const phase = getPhase(); if (phase.type !== 'DRAGGING') { cancel(); return; } phase.hasMoved = true; const { clientX, clientY } = event.touches[0]; const point = { x: clientX, y: clientY }; event.preventDefault(); phase.actions.move(point); } }, { eventName: 'touchend', fn: event => { const phase = getPhase(); if (phase.type !== 'DRAGGING') { cancel(); return; } event.preventDefault(); phase.actions.drop({ shouldBlockNextClick: true }); completed(); } }, { eventName: 'touchcancel', fn: event => { if (getPhase().type !== 'DRAGGING') { cancel(); return; } event.preventDefault(); cancel(); } }, { eventName: 'touchforcechange', fn: event => { const phase = getPhase(); !(phase.type !== 'IDLE') ? invariant(false) : void 0; const touch = event.touches[0]; if (!touch) { return; } const isForcePress = touch.force >= forcePressThreshold; if (!isForcePress) { return; } const shouldRespect = phase.actions.shouldRespectForcePress(); if (phase.type === 'PENDING') { if (shouldRespect) { cancel(); } return; } if (shouldRespect) { if (phase.hasMoved) { event.preventDefault(); return; } cancel(); return; } event.preventDefault(); } }, { eventName: supportedPageVisibilityEventName, fn: cancel }]; } function useTouchSensor(api) { const phaseRef = React.useRef(idle); const unbindEventsRef = React.useRef(noop$2); const getPhase = useMemoOne.useCallback(function getPhase() { return phaseRef.current; }, []); const setPhase = useMemoOne.useCallback(function setPhase(phase) { phaseRef.current = phase; }, []); const startCaptureBinding = useMemoOne.useMemo(() => ({ eventName: 'touchstart', fn: function onTouchStart(event) { if (event.defaultPrevented) { return; } const draggableId = api.findClosestDraggableId(event); if (!draggableId) { return; } const actions = api.tryGetLock(draggableId, stop, { sourceEvent: event }); if (!actions) { return; } const touch = event.touches[0]; const { clientX, clientY } = touch; const point = { x: clientX, y: clientY }; unbindEventsRef.current(); startPendingDrag(actions, point); } }), [api]); const listenForCapture = useMemoOne.useCallback(function listenForCapture() { const options = { capture: true, passive: false }; unbindEventsRef.current = bindEvents(window, [startCaptureBinding], options); }, [startCaptureBinding]); const stop = useMemoOne.useCallback(() => { const current = phaseRef.current; if (current.type === 'IDLE') { return; } if (current.type === 'PENDING') { clearTimeout(current.longPressTimerId); } setPhase(idle); unbindEventsRef.current(); listenForCapture(); }, [listenForCapture, setPhase]); const cancel = useMemoOne.useCallback(() => { const phase = phaseRef.current; stop(); if (phase.type === 'DRAGGING') { phase.actions.cancel({ shouldBlockNextClick: true }); } if (phase.type === 'PENDING') { phase.actions.abort(); } }, [stop]); const bindCapturingEvents = useMemoOne.useCallback(function bindCapturingEvents() { const options = { capture: true, passive: false }; const args = { cancel, completed: stop, getPhase }; const unbindTarget = bindEvents(window, getHandleBindings(args), options); const unbindWindow = bindEvents(window, getWindowBindings(args), options); unbindEventsRef.current = function unbindAll() { unbindTarget(); unbindWindow(); }; }, [cancel, getPhase, stop]); const startDragging = useMemoOne.useCallback(function startDragging() { const phase = getPhase(); !(phase.type === 'PENDING') ? invariant(false, `Cannot start dragging from phase ${phase.type}`) : void 0; const actions = phase.actions.fluidLift(phase.point); setPhase({ type: 'DRAGGING', actions, hasMoved: false }); }, [getPhase, setPhase]); const startPendingDrag = useMemoOne.useCallback(function startPendingDrag(actions, point) { !(getPhase().type === 'IDLE') ? invariant(false, 'Expected to move from IDLE to PENDING drag') : void 0; const longPressTimerId = setTimeout(startDragging, timeForLongPress); setPhase({ type: 'PENDING', point, actions, longPressTimerId }); bindCapturingEvents(); }, [bindCapturingEvents, getPhase, setPhase, startDragging]); useLayoutEffect(function mount() { listenForCapture(); return function unmount() { unbindEventsRef.current(); const phase = getPhase(); if (phase.type === 'PENDING') { clearTimeout(phase.longPressTimerId); setPhase(idle); } }; }, [getPhase, listenForCapture, setPhase]); useLayoutEffect(function webkitHack() { const unbind = bindEvents(window, [{ eventName: 'touchmove', fn: () => {}, options: { capture: false, passive: false } }]); return unbind; }, []); } function useValidateSensorHooks(sensorHooks) { useDev(() => { const previousRef = usePrevious(sensorHooks); useDevSetupWarning(() => { !(previousRef.current.length === sensorHooks.length) ? "development" !== "production" ? invariant(false, 'Cannot change the amount of sensor hooks after mounting') : invariant(false) : void 0; }); }); } const interactiveTagNames = ['input', 'button', 'textarea', 'select', 'option', 'optgroup', 'video', 'audio']; function isAnInteractiveElement(parent, current) { if (current == null) { return false; } const hasAnInteractiveTag = interactiveTagNames.includes(current.tagName.toLowerCase()); if (hasAnInteractiveTag) { return true; } const attribute = current.getAttribute('contenteditable'); if (attribute === 'true' || attribute === '') { return true; } if (current === parent) { return false; } return isAnInteractiveElement(parent, current.parentElement); } function isEventInInteractiveElement(draggable, event) { const target = event.target; if (!isHtmlElement(target)) { return false; } return isAnInteractiveElement(draggable, target); } var getBorderBoxCenterPosition = (el => cssBoxModel.getRect(el.getBoundingClientRect()).center); function isElement(el) { return el instanceof getWindowFromEl(el).Element; } const supportedMatchesName = (() => { const base = 'matches'; if (typeof document === 'undefined') { return base; } const candidates = [base, 'msMatchesSelector', 'webkitMatchesSelector']; const value = candidates.find(name => name in Element.prototype); return value || base; })(); function closestPonyfill(el, selector) { if (el == null) { return null; } if (el[supportedMatchesName](selector)) { return el; } return closestPonyfill(el.parentElement, selector); } function closest(el, selector) { if (el.closest) { return el.closest(selector); } return closestPonyfill(el, selector); } function getSelector(contextId) { return `[${dragHandle.contextId}="${contextId}"]`; } function findClosestDragHandleFromEvent(contextId, event) { const target = event.target; if (!isElement(target)) { warning('event.target must be a Element') ; return null; } const selector = getSelector(contextId); const handle = closest(target, selector); if (!handle) { return null; } if (!isHtmlElement(handle)) { warning('drag handle must be a HTMLElement') ; return null; } return handle; } function tryGetClosestDraggableIdFromEvent(contextId, event) { const handle = findClosestDragHandleFromEvent(contextId, event); if (!handle) { return null; } return handle.getAttribute(dragHandle.draggableId); } function findDraggable(contextId, draggableId) { const selector = `[${draggable.contextId}="${contextId}"]`; const possible = querySelectorAll(document, selector); const draggable$1 = possible.find(el => { return el.getAttribute(draggable.id) === draggableId; }); if (!draggable$1) { return null; } if (!isHtmlElement(draggable$1)) { warning('Draggable element is not a HTMLElement') ; return null; } return draggable$1; } function preventDefault(event) { event.preventDefault(); } function isActive(_ref) { let { expected, phase, isLockActive, shouldWarn } = _ref; if (!isLockActive()) { if (shouldWarn) { warning(` Cannot perform action. The sensor no longer has an action lock. Tips: - Throw away your action handlers when forceStop() is called - Check actions.isActive() if you really need to `) ; } return false; } if (expected !== phase) { if (shouldWarn) { warning(` Cannot perform action. The actions you used belong to an outdated phase Current phase: ${expected} You called an action from outdated phase: ${phase} Tips: - Do not use preDragActions actions after calling preDragActions.lift() `) ; } return false; } return true; } function canStart(_ref2) { let { lockAPI, store, registry, draggableId } = _ref2; if (lockAPI.isClaimed()) { return false; } const entry = registry.draggable.findById(draggableId); if (!entry) { warning(`Unable to find draggable with id: ${draggableId}`) ; return false; } if (!entry.options.isEnabled) { return false; } if (!canStartDrag(store.getState(), draggableId)) { return false; } return true; } function tryStart(_ref3) { let { lockAPI, contextId, store, registry, draggableId, forceSensorStop, sourceEvent } = _ref3; const shouldStart = canStart({ lockAPI, store, registry, draggableId }); if (!shouldStart) { return null; } const entry = registry.draggable.getById(draggableId); const el = findDraggable(contextId, entry.descriptor.id); if (!el) { warning(`Unable to find draggable element with id: ${draggableId}`) ; return null; } if (sourceEvent && !entry.options.canDragInteractiveElements && isEventInInteractiveElement(el, sourceEvent)) { return null; } const lock = lockAPI.claim(forceSensorStop || noop$2); let phase = 'PRE_DRAG'; function getShouldRespectForcePress() { return entry.options.shouldRespectForcePress; } function isLockActive() { return lockAPI.isActive(lock); } function tryDispatch(expected, getAction) { if (isActive({ expected, phase, isLockActive, shouldWarn: true })) { store.dispatch(getAction()); } } const tryDispatchWhenDragging = tryDispatch.bind(null, 'DRAGGING'); function lift(args) { function completed() { lockAPI.release(); phase = 'COMPLETED'; } if (phase !== 'PRE_DRAG') { completed(); invariant(false, `Cannot lift in phase ${phase}`) ; } store.dispatch(lift$1(args.liftActionArgs)); phase = 'DRAGGING'; function finish(reason, options) { if (options === void 0) { options = { shouldBlockNextClick: false }; } args.cleanup(); if (options.shouldBlockNextClick) { const unbind = bindEvents(window, [{ eventName: 'click', fn: preventDefault, options: { once: true, passive: false, capture: true } }]); setTimeout(unbind); } completed(); store.dispatch(drop$1({ reason })); } return { isActive: () => isActive({ expected: 'DRAGGING', phase, isLockActive, shouldWarn: false }), shouldRespectForcePress: getShouldRespectForcePress, drop: options => finish('DROP', options), cancel: options => finish('CANCEL', options), ...args.actions }; } function fluidLift(clientSelection) { const move$1 = rafSchd__default["default"](client => { tryDispatchWhenDragging(() => move({ client })); }); const api = lift({ liftActionArgs: { id: draggableId, clientSelection, movementMode: 'FLUID' }, cleanup: () => move$1.cancel(), actions: { move: move$1 } }); return { ...api, move: move$1 }; } function snapLift() { const actions = { moveUp: () => tryDispatchWhenDragging(moveUp), moveRight: () => tryDispatchWhenDragging(moveRight), moveDown: () => tryDispatchWhenDragging(moveDown), moveLeft: () => tryDispatchWhenDragging(moveLeft) }; return lift({ liftActionArgs: { id: draggableId, clientSelection: getBorderBoxCenterPosition(el), movementMode: 'SNAP' }, cleanup: noop$2, actions }); } function abortPreDrag() { const shouldRelease = isActive({ expected: 'PRE_DRAG', phase, isLockActive, shouldWarn: true }); if (shouldRelease) { lockAPI.release(); } } const preDrag = { isActive: () => isActive({ expected: 'PRE_DRAG', phase, isLockActive, shouldWarn: false }), shouldRespectForcePress: getShouldRespectForcePress, fluidLift, snapLift, abort: abortPreDrag }; return preDrag; } const defaultSensors = [useMouseSensor, useKeyboardSensor, useTouchSensor]; function useSensorMarshal(_ref4) { let { contextId, store, registry, customSensors, enableDefaultSensors } = _ref4; const useSensors = [...(enableDefaultSensors ? defaultSensors : []), ...(customSensors || [])]; const lockAPI = React.useState(() => create())[0]; const tryAbandonLock = useMemoOne.useCallback(function tryAbandonLock(previous, current) { if (isDragging(previous) && !isDragging(current)) { lockAPI.tryAbandon(); } }, [lockAPI]); useLayoutEffect(function listenToStore() { let previous = store.getState(); const unsubscribe = store.subscribe(() => { const current = store.getState(); tryAbandonLock(previous, current); previous = current; }); return unsubscribe; }, [lockAPI, store, tryAbandonLock]); useLayoutEffect(() => { return lockAPI.tryAbandon; }, [lockAPI.tryAbandon]); const canGetLock = useMemoOne.useCallback(draggableId => { return canStart({ lockAPI, registry, store, draggableId }); }, [lockAPI, registry, store]); const tryGetLock = useMemoOne.useCallback((draggableId, forceStop, options) => tryStart({ lockAPI, registry, contextId, store, draggableId, forceSensorStop: forceStop || null, sourceEvent: options && options.sourceEvent ? options.sourceEvent : null }), [contextId, lockAPI, registry, store]); const findClosestDraggableId = useMemoOne.useCallback(event => tryGetClosestDraggableIdFromEvent(contextId, event), [contextId]); const findOptionsForDraggable = useMemoOne.useCallback(id => { const entry = registry.draggable.findById(id); return entry ? entry.options : null; }, [registry.draggable]); const tryReleaseLock = useMemoOne.useCallback(function tryReleaseLock() { if (!lockAPI.isClaimed()) { return; } lockAPI.tryAbandon(); if (store.getState().phase !== 'IDLE') { store.dispatch(flush()); } }, [lockAPI, store]); const isLockClaimed = useMemoOne.useCallback(() => lockAPI.isClaimed(), [lockAPI]); const api = useMemoOne.useMemo(() => ({ canGetLock, tryGetLock, findClosestDraggableId, findOptionsForDraggable, tryReleaseLock, isLockClaimed }), [canGetLock, tryGetLock, findClosestDraggableId, findOptionsForDraggable, tryReleaseLock, isLockClaimed]); useValidateSensorHooks(useSensors); for (let i = 0; i < useSensors.length; i++) { useSensors[i](api); } } const createResponders = props => ({ onBeforeCapture: t => { const onBeforeCapureCallback = () => { if (props.onBeforeCapture) { props.onBeforeCapture(t); } }; if (React__default["default"].version.startsWith('16') || React__default["default"].version.startsWith('17')) { onBeforeCapureCallback(); } else { ReactDOM.flushSync(onBeforeCapureCallback); } }, onBeforeDragStart: props.onBeforeDragStart, onDragStart: props.onDragStart, onDragEnd: props.onDragEnd, onDragUpdate: props.onDragUpdate }); function getStore(lazyRef) { !lazyRef.current ? invariant(false, 'Could not find store from lazy ref') : void 0; return lazyRef.current; } function App$2(props) { const { contextId, setCallbacks, sensors, nonce, dragHandleUsageInstructions } = props; const lazyStoreRef = React.useRef(null); useStartupValidation(); const lastPropsRef = usePrevious(props); const getResponders = useMemoOne.useCallback(() => { return createResponders(lastPropsRef.current); }, [lastPropsRef]); const announce = useAnnouncer(contextId); const dragHandleUsageInstructionsId = useHiddenTextElement({ contextId, text: dragHandleUsageInstructions }); const styleMarshal = useStyleMarshal(contextId, nonce); const lazyDispatch = useMemoOne.useCallback(action => { getStore(lazyStoreRef).dispatch(action); }, []); const marshalCallbacks = useMemoOne.useMemo(() => redux.bindActionCreators({ publishWhileDragging, updateDroppableScroll, updateDroppableIsEnabled, updateDroppableIsCombineEnabled, collectionStarting }, lazyDispatch), [lazyDispatch]); const registry = useRegistry(); const dimensionMarshal = useMemoOne.useMemo(() => { return createDimensionMarshal(registry, marshalCallbacks); }, [registry, marshalCallbacks]); const autoScroller = useMemoOne.useMemo(() => createAutoScroller({ scrollWindow, scrollDroppable: dimensionMarshal.scrollDroppable, ...redux.bindActionCreators({ move }, lazyDispatch) }), [dimensionMarshal.scrollDroppable, lazyDispatch]); const focusMarshal = useFocusMarshal(contextId); const store = useMemoOne.useMemo(() => createStore$1({ announce, autoScroller, dimensionMarshal, focusMarshal, getResponders, styleMarshal }), [announce, autoScroller, dimensionMarshal, focusMarshal, getResponders, styleMarshal]); { if (lazyStoreRef.current && lazyStoreRef.current !== store) { warning('unexpected store change') ; } } lazyStoreRef.current = store; const tryResetStore = useMemoOne.useCallback(() => { const current = getStore(lazyStoreRef); const state = current.getState(); if (state.phase !== 'IDLE') { current.dispatch(flush()); } }, []); const isDragging = useMemoOne.useCallback(() => { const state = getStore(lazyStoreRef).getState(); if (state.phase === 'DROP_ANIMATING') { return true; } if (state.phase === 'IDLE') { return false; } return state.isDragging; }, []); const appCallbacks = useMemoOne.useMemo(() => ({ isDragging, tryAbort: tryResetStore }), [isDragging, tryResetStore]); setCallbacks(appCallbacks); const getCanLift = useMemoOne.useCallback(id => canStartDrag(getStore(lazyStoreRef).getState(), id), []); const getIsMovementAllowed = useMemoOne.useCallback(() => isMovementAllowed(getStore(lazyStoreRef).getState()), []); const appContext = useMemoOne.useMemo(() => ({ marshal: dimensionMarshal, focus: focusMarshal, contextId, canLift: getCanLift, isMovementAllowed: getIsMovementAllowed, dragHandleUsageInstructionsId, registry }), [contextId, dimensionMarshal, dragHandleUsageInstructionsId, focusMarshal, getCanLift, getIsMovementAllowed, registry]); useSensorMarshal({ contextId, store, registry, customSensors: sensors || null, enableDefaultSensors: props.enableDefaultSensors !== false }); React.useEffect(() => { return tryResetStore; }, [tryResetStore]); return React__default["default"].createElement(AppContext.Provider, { value: appContext }, React__default["default"].createElement(reactRedux.Provider, { context: StoreContext, store: store }, props.children)); } let count = 0; function reset() { count = 0; } function useInstanceCount() { return useMemoOne.useMemo(() => `${count++}`, []); } function resetServerContext() { reset(); reset$1(); } function DragDropContext(props) { const contextId = useInstanceCount(); const dragHandleUsageInstructions = props.dragHandleUsageInstructions || preset$1.dragHandleUsageInstructions; return React__default["default"].createElement(ErrorBoundary, null, setCallbacks => React__default["default"].createElement(App$2, { nonce: props.nonce, contextId: contextId, setCallbacks: setCallbacks, dragHandleUsageInstructions: dragHandleUsageInstructions, enableDefaultSensors: props.enableDefaultSensors, sensors: props.sensors, onBeforeCapture: props.onBeforeCapture, onBeforeDragStart: props.onBeforeDragStart, onDragStart: props.onDragStart, onDragUpdate: props.onDragUpdate, onDragEnd: props.onDragEnd }, props.children)); } const zIndexOptions = { dragging: 5000, dropAnimating: 4500 }; const getDraggingTransition = (shouldAnimateDragMovement, dropping) => { if (dropping) { return transitions.drop(dropping.duration); } if (shouldAnimateDragMovement) { return transitions.snap; } return transitions.fluid; }; const getDraggingOpacity = (isCombining, isDropAnimating) => { if (!isCombining) { return undefined; } return isDropAnimating ? combine.opacity.drop : combine.opacity.combining; }; const getShouldDraggingAnimate = dragging => { if (dragging.forceShouldAnimate != null) { return dragging.forceShouldAnimate; } return dragging.mode === 'SNAP'; }; function getDraggingStyle(dragging) { const dimension = dragging.dimension; const box = dimension.client; const { offset, combineWith, dropping } = dragging; const isCombining = Boolean(combineWith); const shouldAnimate = getShouldDraggingAnimate(dragging); const isDropAnimating = Boolean(dropping); const transform = isDropAnimating ? transforms.drop(offset, isCombining) : transforms.moveTo(offset); const style = { position: 'fixed', top: box.marginBox.top, left: box.marginBox.left, boxSizing: 'border-box', width: box.borderBox.width, height: box.borderBox.height, transition: getDraggingTransition(shouldAnimate, dropping), transform, opacity: getDraggingOpacity(isCombining, isDropAnimating), zIndex: isDropAnimating ? zIndexOptions.dropAnimating : zIndexOptions.dragging, pointerEvents: 'none' }; return style; } function getSecondaryStyle(secondary) { return { transform: transforms.moveTo(secondary.offset), transition: secondary.shouldAnimateDisplacement ? undefined : 'none' }; } function getStyle$1(mapped) { return mapped.type === 'DRAGGING' ? getDraggingStyle(mapped) : getSecondaryStyle(mapped); } function getDimension$1(descriptor, el, windowScroll) { if (windowScroll === void 0) { windowScroll = origin; } const computedStyles = window.getComputedStyle(el); const borderBox = el.getBoundingClientRect(); const client = cssBoxModel.calculateBox(borderBox, computedStyles); const page = cssBoxModel.withScroll(client, windowScroll); const placeholder = { client, tagName: el.tagName.toLowerCase(), display: computedStyles.display }; const displaceBy = { x: client.marginBox.width, y: client.marginBox.height }; const dimension = { descriptor, placeholder, displaceBy, client, page }; return dimension; } function useDraggablePublisher(args) { const uniqueId = useUniqueId('draggable'); const { descriptor, registry, getDraggableRef, canDragInteractiveElements, shouldRespectForcePress, isEnabled } = args; const options = useMemoOne.useMemo(() => ({ canDragInteractiveElements, shouldRespectForcePress, isEnabled }), [canDragInteractiveElements, isEnabled, shouldRespectForcePress]); const getDimension = useMemoOne.useCallback(windowScroll => { const el = getDraggableRef(); !el ? invariant(false, 'Cannot get dimension when no ref is set') : void 0; return getDimension$1(descriptor, el, windowScroll); }, [descriptor, getDraggableRef]); const entry = useMemoOne.useMemo(() => ({ uniqueId, descriptor, options, getDimension }), [descriptor, getDimension, options, uniqueId]); const publishedRef = React.useRef(entry); const isFirstPublishRef = React.useRef(true); useLayoutEffect(() => { registry.draggable.register(publishedRef.current); return () => registry.draggable.unregister(publishedRef.current); }, [registry.draggable]); useLayoutEffect(() => { if (isFirstPublishRef.current) { isFirstPublishRef.current = false; return; } const last = publishedRef.current; publishedRef.current = entry; registry.draggable.update(entry, last); }, [entry, registry.draggable]); } var DroppableContext = React__default["default"].createContext(null); function checkIsValidInnerRef(el) { !(el && isHtmlElement(el)) ? invariant(false, ` provided.innerRef has not been provided with a HTMLElement. You can find a guide on using the innerRef callback functions at: https://github.com/hello-pangea/dnd/blob/main/docs/guides/using-inner-ref.md `) : void 0; } function useValidation$1(props, contextId, getRef) { useDevSetupWarning(() => { function prefix(id) { return `Draggable[id: ${id}]: `; } const id = props.draggableId; !id ? "development" !== "production" ? invariant(false, 'Draggable requires a draggableId') : invariant(false) : void 0; !(typeof id === 'string') ? "development" !== "production" ? invariant(false, `Draggable requires a [string] draggableId. Provided: [type: ${typeof id}] (value: ${id})`) : invariant(false) : void 0; !Number.isInteger(props.index) ? "development" !== "production" ? invariant(false, `${prefix(id)} requires an integer index prop`) : invariant(false) : void 0; if (props.mapped.type === 'DRAGGING') { return; } checkIsValidInnerRef(getRef()); if (props.isEnabled) { !findDragHandle(contextId, id) ? "development" !== "production" ? invariant(false, `${prefix(id)} Unable to find drag handle`) : invariant(false) : void 0; } }); } function useClonePropValidation(isClone) { useDev(() => { const initialRef = React.useRef(isClone); useDevSetupWarning(() => { !(isClone === initialRef.current) ? "development" !== "production" ? invariant(false, 'Draggable isClone prop value changed during component life') : invariant(false) : void 0; }, [isClone]); }); } function useRequiredContext(Context) { const result = React.useContext(Context); !result ? invariant(false, 'Could not find required context') : void 0; return result; } function preventHtml5Dnd(event) { event.preventDefault(); } const Draggable = props => { const ref = React.useRef(null); const setRef = useMemoOne.useCallback(function (el) { if (el === void 0) { el = null; } ref.current = el; }, []); const getRef = useMemoOne.useCallback(() => ref.current, []); const { contextId, dragHandleUsageInstructionsId, registry } = useRequiredContext(AppContext); const { type, droppableId } = useRequiredContext(DroppableContext); const descriptor = useMemoOne.useMemo(() => ({ id: props.draggableId, index: props.index, type, droppableId }), [props.draggableId, props.index, type, droppableId]); const { children, draggableId, isEnabled, shouldRespectForcePress, canDragInteractiveElements, isClone, mapped, dropAnimationFinished: dropAnimationFinishedAction } = props; useValidation$1(props, contextId, getRef); useClonePropValidation(isClone); if (!isClone) { const forPublisher = useMemoOne.useMemo(() => ({ descriptor, registry, getDraggableRef: getRef, canDragInteractiveElements, shouldRespectForcePress, isEnabled }), [descriptor, registry, getRef, canDragInteractiveElements, shouldRespectForcePress, isEnabled]); useDraggablePublisher(forPublisher); } const dragHandleProps = useMemoOne.useMemo(() => isEnabled ? { tabIndex: 0, role: 'button', 'aria-describedby': dragHandleUsageInstructionsId, 'data-rfd-drag-handle-draggable-id': draggableId, 'data-rfd-drag-handle-context-id': contextId, draggable: false, onDragStart: preventHtml5Dnd } : null, [contextId, dragHandleUsageInstructionsId, draggableId, isEnabled]); const onMoveEnd = useMemoOne.useCallback(event => { if (mapped.type !== 'DRAGGING') { return; } if (!mapped.dropping) { return; } if (event.propertyName !== 'transform') { return; } if (React__default["default"].version.startsWith('16') || React__default["default"].version.startsWith('17')) { dropAnimationFinishedAction(); } else { ReactDOM.flushSync(dropAnimationFinishedAction); } }, [dropAnimationFinishedAction, mapped]); const provided = useMemoOne.useMemo(() => { const style = getStyle$1(mapped); const onTransitionEnd = mapped.type === 'DRAGGING' && mapped.dropping ? onMoveEnd : undefined; const result = { innerRef: setRef, draggableProps: { 'data-rfd-draggable-context-id': contextId, 'data-rfd-draggable-id': draggableId, style, onTransitionEnd }, dragHandleProps }; return result; }, [contextId, dragHandleProps, draggableId, mapped, onMoveEnd, setRef]); const rubric = useMemoOne.useMemo(() => ({ draggableId: descriptor.id, type: descriptor.type, source: { index: descriptor.index, droppableId: descriptor.droppableId } }), [descriptor.droppableId, descriptor.id, descriptor.index, descriptor.type]); return React__default["default"].createElement(React__default["default"].Fragment, null, children(provided, mapped.snapshot, rubric)); }; var Draggable$1 = Draggable; var isStrictEqual = ((a, b) => a === b); var whatIsDraggedOverFromResult = (result => { const { combine, destination } = result; if (destination) { return destination.droppableId; } if (combine) { return combine.droppableId; } return null; }); const getCombineWithFromResult = result => { return result.combine ? result.combine.draggableId : null; }; const getCombineWithFromImpact = impact => { return impact.at && impact.at.type === 'COMBINE' ? impact.at.combine.draggableId : null; }; function getDraggableSelector() { const memoizedOffset = memoizeOne__default["default"]((x, y) => ({ x, y })); const getMemoizedSnapshot = memoizeOne__default["default"](function (mode, isClone, draggingOver, combineWith, dropping) { if (draggingOver === void 0) { draggingOver = null; } if (combineWith === void 0) { combineWith = null; } if (dropping === void 0) { dropping = null; } return { isDragging: true, isClone, isDropAnimating: Boolean(dropping), dropAnimation: dropping, mode, draggingOver, combineWith, combineTargetFor: null }; }); const getMemoizedProps = memoizeOne__default["default"](function (offset, mode, dimension, isClone, draggingOver, combineWith, forceShouldAnimate) { if (draggingOver === void 0) { draggingOver = null; } if (combineWith === void 0) { combineWith = null; } if (forceShouldAnimate === void 0) { forceShouldAnimate = null; } return { mapped: { type: 'DRAGGING', dropping: null, draggingOver, combineWith, mode, offset, dimension, forceShouldAnimate, snapshot: getMemoizedSnapshot(mode, isClone, draggingOver, combineWith, null) } }; }); const selector = (state, ownProps) => { if (isDragging(state)) { if (state.critical.draggable.id !== ownProps.draggableId) { return null; } const offset = state.current.client.offset; const dimension = state.dimensions.draggables[ownProps.draggableId]; const draggingOver = whatIsDraggedOver(state.impact); const combineWith = getCombineWithFromImpact(state.impact); const forceShouldAnimate = state.forceShouldAnimate; return getMemoizedProps(memoizedOffset(offset.x, offset.y), state.movementMode, dimension, ownProps.isClone, draggingOver, combineWith, forceShouldAnimate); } if (state.phase === 'DROP_ANIMATING') { const completed = state.completed; if (completed.result.draggableId !== ownProps.draggableId) { return null; } const isClone = ownProps.isClone; const dimension = state.dimensions.draggables[ownProps.draggableId]; const result = completed.result; const mode = result.mode; const draggingOver = whatIsDraggedOverFromResult(result); const combineWith = getCombineWithFromResult(result); const duration = state.dropDuration; const dropping = { duration, curve: curves.drop, moveTo: state.newHomeClientOffset, opacity: combineWith ? combine.opacity.drop : null, scale: combineWith ? combine.scale.drop : null }; return { mapped: { type: 'DRAGGING', offset: state.newHomeClientOffset, dimension, dropping, draggingOver, combineWith, mode, forceShouldAnimate: null, snapshot: getMemoizedSnapshot(mode, isClone, draggingOver, combineWith, dropping) } }; } return null; }; return selector; } function getSecondarySnapshot(combineTargetFor) { if (combineTargetFor === void 0) { combineTargetFor = null; } return { isDragging: false, isDropAnimating: false, isClone: false, dropAnimation: null, mode: null, draggingOver: null, combineTargetFor, combineWith: null }; } const atRest = { mapped: { type: 'SECONDARY', offset: origin, combineTargetFor: null, shouldAnimateDisplacement: true, snapshot: getSecondarySnapshot(null) } }; function getSecondarySelector() { const memoizedOffset = memoizeOne__default["default"]((x, y) => ({ x, y })); const getMemoizedSnapshot = memoizeOne__default["default"](getSecondarySnapshot); const getMemoizedProps = memoizeOne__default["default"](function (offset, combineTargetFor, shouldAnimateDisplacement) { if (combineTargetFor === void 0) { combineTargetFor = null; } return { mapped: { type: 'SECONDARY', offset, combineTargetFor, shouldAnimateDisplacement, snapshot: getMemoizedSnapshot(combineTargetFor) } }; }); const getFallback = combineTargetFor => { return combineTargetFor ? getMemoizedProps(origin, combineTargetFor, true) : null; }; const getProps = (ownId, draggingId, impact, afterCritical) => { const visualDisplacement = impact.displaced.visible[ownId]; const isAfterCriticalInVirtualList = Boolean(afterCritical.inVirtualList && afterCritical.effected[ownId]); const combine = tryGetCombine(impact); const combineTargetFor = combine && combine.draggableId === ownId ? draggingId : null; if (!visualDisplacement) { if (!isAfterCriticalInVirtualList) { return getFallback(combineTargetFor); } if (impact.displaced.invisible[ownId]) { return null; } const change = negate(afterCritical.displacedBy.point); const offset = memoizedOffset(change.x, change.y); return getMemoizedProps(offset, combineTargetFor, true); } if (isAfterCriticalInVirtualList) { return getFallback(combineTargetFor); } const displaceBy = impact.displacedBy.point; const offset = memoizedOffset(displaceBy.x, displaceBy.y); return getMemoizedProps(offset, combineTargetFor, visualDisplacement.shouldAnimate); }; const selector = (state, ownProps) => { if (isDragging(state)) { if (state.critical.draggable.id === ownProps.draggableId) { return null; } return getProps(ownProps.draggableId, state.critical.draggable.id, state.impact, state.afterCritical); } if (state.phase === 'DROP_ANIMATING') { const completed = state.completed; if (completed.result.draggableId === ownProps.draggableId) { return null; } return getProps(ownProps.draggableId, completed.result.draggableId, completed.impact, completed.afterCritical); } return null; }; return selector; } const makeMapStateToProps$1 = () => { const draggingSelector = getDraggableSelector(); const secondarySelector = getSecondarySelector(); const selector = (state, ownProps) => draggingSelector(state, ownProps) || secondarySelector(state, ownProps) || atRest; return selector; }; const mapDispatchToProps$1 = { dropAnimationFinished: dropAnimationFinished }; const ConnectedDraggable = reactRedux.connect(makeMapStateToProps$1, mapDispatchToProps$1, null, { context: StoreContext, areStatePropsEqual: isStrictEqual })(Draggable$1); var ConnectedDraggable$1 = ConnectedDraggable; function PrivateDraggable(props) { const droppableContext = useRequiredContext(DroppableContext); const isUsingCloneFor = droppableContext.isUsingCloneFor; if (isUsingCloneFor === props.draggableId && !props.isClone) { return null; } return React__default["default"].createElement(ConnectedDraggable$1, props); } function PublicDraggable(props) { const isEnabled = typeof props.isDragDisabled === 'boolean' ? !props.isDragDisabled : true; const canDragInteractiveElements = Boolean(props.disableInteractiveElementBlocking); const shouldRespectForcePress = Boolean(props.shouldRespectForcePress); return React__default["default"].createElement(PrivateDraggable, _extends__default["default"]({}, props, { isClone: false, isEnabled: isEnabled, canDragInteractiveElements: canDragInteractiveElements, shouldRespectForcePress: shouldRespectForcePress })); } const isEqual = base => value => base === value; const isScroll = isEqual('scroll'); const isAuto = isEqual('auto'); const isVisible = isEqual('visible'); const isEither = (overflow, fn) => fn(overflow.overflowX) || fn(overflow.overflowY); const isBoth = (overflow, fn) => fn(overflow.overflowX) && fn(overflow.overflowY); const isElementScrollable = el => { const style = window.getComputedStyle(el); const overflow = { overflowX: style.overflowX, overflowY: style.overflowY }; return isEither(overflow, isScroll) || isEither(overflow, isAuto); }; const isBodyScrollable = () => { const body = getBodyElement(); const html = document.documentElement; !html ? invariant(false) : void 0; if (!isElementScrollable(body)) { return false; } const htmlStyle = window.getComputedStyle(html); const htmlOverflow = { overflowX: htmlStyle.overflowX, overflowY: htmlStyle.overflowY }; if (isBoth(htmlOverflow, isVisible)) { return false; } warning(` We have detected that your element might be a scroll container. We have found no reliable way of detecting whether the element is a scroll container. Under most circumstances a scroll bar will be on the element (document.documentElement) Because we cannot determine if the is a scroll container, and generally it is not one, we will be treating the as *not* a scroll container More information: https://github.com/hello-pangea/dnd/blob/main/docs/guides/how-we-detect-scroll-containers.md `) ; return false; }; const getClosestScrollable = el => { if (el == null) { return null; } if (el === document.body) { return isBodyScrollable() ? el : null; } if (el === document.documentElement) { return null; } if (!isElementScrollable(el)) { return getClosestScrollable(el.parentElement); } return el; }; var getClosestScrollable$1 = getClosestScrollable; var checkForNestedScrollContainers = (scrollable => { if (!scrollable) { return; } const anotherScrollParent = getClosestScrollable$1(scrollable.parentElement); if (!anotherScrollParent) { return; } warning(` Droppable: unsupported nested scroll container detected. A Droppable can only have one scroll parent (which can be itself) Nested scroll containers are currently not supported. We hope to support nested scroll containers soon: https://github.com/atlassian/react-beautiful-dnd/issues/131 `) ; }); var getScroll = (el => ({ x: el.scrollLeft, y: el.scrollTop })); const getIsFixed = el => { if (!el) { return false; } const style = window.getComputedStyle(el); if (style.position === 'fixed') { return true; } return getIsFixed(el.parentElement); }; var getEnv = (start => { const closestScrollable = getClosestScrollable$1(start); const isFixedOnPage = getIsFixed(start); return { closestScrollable, isFixedOnPage }; }); var getDroppableDimension = (_ref => { let { descriptor, isEnabled, isCombineEnabled, isFixedOnPage, direction, client, page, closest } = _ref; const frame = (() => { if (!closest) { return null; } const { scrollSize, client: frameClient } = closest; const maxScroll = getMaxScroll({ scrollHeight: scrollSize.scrollHeight, scrollWidth: scrollSize.scrollWidth, height: frameClient.paddingBox.height, width: frameClient.paddingBox.width }); return { pageMarginBox: closest.page.marginBox, frameClient, scrollSize, shouldClipSubject: closest.shouldClipSubject, scroll: { initial: closest.scroll, current: closest.scroll, max: maxScroll, diff: { value: origin, displacement: origin } } }; })(); const axis = direction === 'vertical' ? vertical : horizontal; const subject = getSubject({ page, withPlaceholder: null, axis, frame }); const dimension = { descriptor, isCombineEnabled, isFixedOnPage, axis, isEnabled, client, page, frame, subject }; return dimension; }); const getClient = (targetRef, closestScrollable) => { const base = cssBoxModel.getBox(targetRef); if (!closestScrollable) { return base; } if (targetRef !== closestScrollable) { return base; } const top = base.paddingBox.top - closestScrollable.scrollTop; const left = base.paddingBox.left - closestScrollable.scrollLeft; const bottom = top + closestScrollable.scrollHeight; const right = left + closestScrollable.scrollWidth; const paddingBox = { top, right, bottom, left }; const borderBox = cssBoxModel.expand(paddingBox, base.border); const client = cssBoxModel.createBox({ borderBox, margin: base.margin, border: base.border, padding: base.padding }); return client; }; var getDimension = (_ref => { let { ref, descriptor, env, windowScroll, direction, isDropDisabled, isCombineEnabled, shouldClipSubject } = _ref; const closestScrollable = env.closestScrollable; const client = getClient(ref, closestScrollable); const page = cssBoxModel.withScroll(client, windowScroll); const closest = (() => { if (!closestScrollable) { return null; } const frameClient = cssBoxModel.getBox(closestScrollable); const scrollSize = { scrollHeight: closestScrollable.scrollHeight, scrollWidth: closestScrollable.scrollWidth }; return { client: frameClient, page: cssBoxModel.withScroll(frameClient, windowScroll), scroll: getScroll(closestScrollable), scrollSize, shouldClipSubject }; })(); const dimension = getDroppableDimension({ descriptor, isEnabled: !isDropDisabled, isCombineEnabled, isFixedOnPage: env.isFixedOnPage, direction, client, page, closest }); return dimension; }); const immediate = { passive: false }; const delayed = { passive: true }; var getListenerOptions = (options => options.shouldPublishImmediately ? immediate : delayed); const getClosestScrollableFromDrag = dragging => dragging && dragging.env.closestScrollable || null; function useDroppablePublisher(args) { const whileDraggingRef = React.useRef(null); const appContext = useRequiredContext(AppContext); const uniqueId = useUniqueId('droppable'); const { registry, marshal } = appContext; const previousRef = usePrevious(args); const descriptor = useMemoOne.useMemo(() => ({ id: args.droppableId, type: args.type, mode: args.mode }), [args.droppableId, args.mode, args.type]); const publishedDescriptorRef = React.useRef(descriptor); const memoizedUpdateScroll = useMemoOne.useMemo(() => memoizeOne__default["default"]((x, y) => { !whileDraggingRef.current ? invariant(false, 'Can only update scroll when dragging') : void 0; const scroll = { x, y }; marshal.updateDroppableScroll(descriptor.id, scroll); }), [descriptor.id, marshal]); const getClosestScroll = useMemoOne.useCallback(() => { const dragging = whileDraggingRef.current; if (!dragging || !dragging.env.closestScrollable) { return origin; } return getScroll(dragging.env.closestScrollable); }, []); const updateScroll = useMemoOne.useCallback(() => { const scroll = getClosestScroll(); memoizedUpdateScroll(scroll.x, scroll.y); }, [getClosestScroll, memoizedUpdateScroll]); const scheduleScrollUpdate = useMemoOne.useMemo(() => rafSchd__default["default"](updateScroll), [updateScroll]); const onClosestScroll = useMemoOne.useCallback(() => { const dragging = whileDraggingRef.current; const closest = getClosestScrollableFromDrag(dragging); !(dragging && closest) ? invariant(false, 'Could not find scroll options while scrolling') : void 0; const options = dragging.scrollOptions; if (options.shouldPublishImmediately) { updateScroll(); return; } scheduleScrollUpdate(); }, [scheduleScrollUpdate, updateScroll]); const getDimensionAndWatchScroll = useMemoOne.useCallback((windowScroll, options) => { !!whileDraggingRef.current ? invariant(false, 'Cannot collect a droppable while a drag is occurring') : void 0; const previous = previousRef.current; const ref = previous.getDroppableRef(); !ref ? invariant(false, 'Cannot collect without a droppable ref') : void 0; const env = getEnv(ref); const dragging = { ref, descriptor, env, scrollOptions: options }; whileDraggingRef.current = dragging; const dimension = getDimension({ ref, descriptor, env, windowScroll, direction: previous.direction, isDropDisabled: previous.isDropDisabled, isCombineEnabled: previous.isCombineEnabled, shouldClipSubject: !previous.ignoreContainerClipping }); const scrollable = env.closestScrollable; if (scrollable) { scrollable.setAttribute(scrollContainer.contextId, appContext.contextId); scrollable.addEventListener('scroll', onClosestScroll, getListenerOptions(dragging.scrollOptions)); { checkForNestedScrollContainers(scrollable); } } return dimension; }, [appContext.contextId, descriptor, onClosestScroll, previousRef]); const getScrollWhileDragging = useMemoOne.useCallback(() => { const dragging = whileDraggingRef.current; const closest = getClosestScrollableFromDrag(dragging); !(dragging && closest) ? invariant(false, 'Can only recollect Droppable client for Droppables that have a scroll container') : void 0; return getScroll(closest); }, []); const dragStopped = useMemoOne.useCallback(() => { const dragging = whileDraggingRef.current; !dragging ? invariant(false, 'Cannot stop drag when no active drag') : void 0; const closest = getClosestScrollableFromDrag(dragging); whileDraggingRef.current = null; if (!closest) { return; } scheduleScrollUpdate.cancel(); closest.removeAttribute(scrollContainer.contextId); closest.removeEventListener('scroll', onClosestScroll, getListenerOptions(dragging.scrollOptions)); }, [onClosestScroll, scheduleScrollUpdate]); const scroll = useMemoOne.useCallback(change => { const dragging = whileDraggingRef.current; !dragging ? invariant(false, 'Cannot scroll when there is no drag') : void 0; const closest = getClosestScrollableFromDrag(dragging); !closest ? invariant(false, 'Cannot scroll a droppable with no closest scrollable') : void 0; closest.scrollTop += change.y; closest.scrollLeft += change.x; }, []); const callbacks = useMemoOne.useMemo(() => { return { getDimensionAndWatchScroll, getScrollWhileDragging, dragStopped, scroll }; }, [dragStopped, getDimensionAndWatchScroll, getScrollWhileDragging, scroll]); const entry = useMemoOne.useMemo(() => ({ uniqueId, descriptor, callbacks }), [callbacks, descriptor, uniqueId]); useLayoutEffect(() => { publishedDescriptorRef.current = entry.descriptor; registry.droppable.register(entry); return () => { if (whileDraggingRef.current) { warning('Unsupported: changing the droppableId or type of a Droppable during a drag') ; dragStopped(); } registry.droppable.unregister(entry); }; }, [callbacks, descriptor, dragStopped, entry, marshal, registry.droppable]); useLayoutEffect(() => { if (!whileDraggingRef.current) { return; } marshal.updateDroppableIsEnabled(publishedDescriptorRef.current.id, !args.isDropDisabled); }, [args.isDropDisabled, marshal]); useLayoutEffect(() => { if (!whileDraggingRef.current) { return; } marshal.updateDroppableIsCombineEnabled(publishedDescriptorRef.current.id, args.isCombineEnabled); }, [args.isCombineEnabled, marshal]); } function noop() {} const empty = { width: 0, height: 0, margin: noSpacing }; const getSize = _ref => { let { isAnimatingOpenOnMount, placeholder, animate } = _ref; if (isAnimatingOpenOnMount) { return empty; } if (animate === 'close') { return empty; } return { height: placeholder.client.borderBox.height, width: placeholder.client.borderBox.width, margin: placeholder.client.margin }; }; const getStyle = _ref2 => { let { isAnimatingOpenOnMount, placeholder, animate } = _ref2; const size = getSize({ isAnimatingOpenOnMount, placeholder, animate }); return { display: placeholder.display, boxSizing: 'border-box', width: size.width, height: size.height, marginTop: size.margin.top, marginRight: size.margin.right, marginBottom: size.margin.bottom, marginLeft: size.margin.left, flexShrink: '0', flexGrow: '0', pointerEvents: 'none', transition: animate !== 'none' ? transitions.placeholder : null }; }; const Placeholder = props => { const animateOpenTimerRef = React.useRef(null); const tryClearAnimateOpenTimer = useMemoOne.useCallback(() => { if (!animateOpenTimerRef.current) { return; } clearTimeout(animateOpenTimerRef.current); animateOpenTimerRef.current = null; }, []); const { animate, onTransitionEnd, onClose, contextId } = props; const [isAnimatingOpenOnMount, setIsAnimatingOpenOnMount] = React.useState(props.animate === 'open'); React.useEffect(() => { if (!isAnimatingOpenOnMount) { return noop; } if (animate !== 'open') { tryClearAnimateOpenTimer(); setIsAnimatingOpenOnMount(false); return noop; } if (animateOpenTimerRef.current) { return noop; } animateOpenTimerRef.current = setTimeout(() => { animateOpenTimerRef.current = null; setIsAnimatingOpenOnMount(false); }); return tryClearAnimateOpenTimer; }, [animate, isAnimatingOpenOnMount, tryClearAnimateOpenTimer]); const onSizeChangeEnd = useMemoOne.useCallback(event => { if (event.propertyName !== 'height') { return; } onTransitionEnd(); if (animate === 'close') { onClose(); } }, [animate, onClose, onTransitionEnd]); const style = getStyle({ isAnimatingOpenOnMount, animate: props.animate, placeholder: props.placeholder }); return React__default["default"].createElement(props.placeholder.tagName, { style, 'data-rfd-placeholder-context-id': contextId, onTransitionEnd: onSizeChangeEnd, ref: props.innerRef }); }; var Placeholder$1 = React__default["default"].memo(Placeholder); function isBoolean(value) { return typeof value === 'boolean'; } function runChecks(args, checks) { checks.forEach(check => check(args)); } const shared = [function required(_ref) { let { props } = _ref; !props.droppableId ? invariant(false, 'A Droppable requires a droppableId prop') : void 0; !(typeof props.droppableId === 'string') ? invariant(false, `A Droppable requires a [string] droppableId. Provided: [${typeof props.droppableId}]`) : void 0; }, function boolean(_ref2) { let { props } = _ref2; !isBoolean(props.isDropDisabled) ? invariant(false, 'isDropDisabled must be a boolean') : void 0; !isBoolean(props.isCombineEnabled) ? invariant(false, 'isCombineEnabled must be a boolean') : void 0; !isBoolean(props.ignoreContainerClipping) ? invariant(false, 'ignoreContainerClipping must be a boolean') : void 0; }, function ref(_ref3) { let { getDroppableRef } = _ref3; checkIsValidInnerRef(getDroppableRef()); }]; const standard = [function placeholder(_ref4) { let { props, getPlaceholderRef } = _ref4; if (!props.placeholder) { return; } const ref = getPlaceholderRef(); if (ref) { return; } warning(` Droppable setup issue [droppableId: "${props.droppableId}"]: DroppableProvided > placeholder could not be found. Please be sure to add the {provided.placeholder} React Node as a child of your Droppable. More information: https://github.com/hello-pangea/dnd/blob/main/docs/api/droppable.md `) ; }]; const virtual = [function hasClone(_ref5) { let { props } = _ref5; !props.renderClone ? invariant(false, 'Must provide a clone render function (renderClone) for virtual lists') : void 0; }, function hasNoPlaceholder(_ref6) { let { getPlaceholderRef } = _ref6; !!getPlaceholderRef() ? invariant(false, 'Expected virtual list to not have a placeholder') : void 0; }]; function useValidation(args) { useDevSetupWarning(() => { runChecks(args, shared); if (args.props.mode === 'standard') { runChecks(args, standard); } if (args.props.mode === 'virtual') { runChecks(args, virtual); } }); } class AnimateInOut extends React__default["default"].PureComponent { constructor() { super(...arguments); this.state = { isVisible: Boolean(this.props.on), data: this.props.on, animate: this.props.shouldAnimate && this.props.on ? 'open' : 'none' }; this.onClose = () => { if (this.state.animate !== 'close') { return; } this.setState({ isVisible: false }); }; } static getDerivedStateFromProps(props, state) { if (!props.shouldAnimate) { return { isVisible: Boolean(props.on), data: props.on, animate: 'none' }; } if (props.on) { return { isVisible: true, data: props.on, animate: 'open' }; } if (state.isVisible) { return { isVisible: true, data: state.data, animate: 'close' }; } return { isVisible: false, animate: 'close', data: null }; } render() { if (!this.state.isVisible) { return null; } const provided = { onClose: this.onClose, data: this.state.data, animate: this.state.animate }; return this.props.children(provided); } } const Droppable = props => { const appContext = React.useContext(AppContext); !appContext ? invariant(false, 'Could not find app context') : void 0; const { contextId, isMovementAllowed } = appContext; const droppableRef = React.useRef(null); const placeholderRef = React.useRef(null); const { children, droppableId, type, mode, direction, ignoreContainerClipping, isDropDisabled, isCombineEnabled, snapshot, useClone, updateViewportMaxScroll, getContainerForClone } = props; const getDroppableRef = useMemoOne.useCallback(() => droppableRef.current, []); const setDroppableRef = useMemoOne.useCallback(function (value) { if (value === void 0) { value = null; } droppableRef.current = value; }, []); const getPlaceholderRef = useMemoOne.useCallback(() => placeholderRef.current, []); const setPlaceholderRef = useMemoOne.useCallback(function (value) { if (value === void 0) { value = null; } placeholderRef.current = value; }, []); useValidation({ props, getDroppableRef, getPlaceholderRef }); const onPlaceholderTransitionEnd = useMemoOne.useCallback(() => { if (isMovementAllowed()) { updateViewportMaxScroll({ maxScroll: getMaxWindowScroll() }); } }, [isMovementAllowed, updateViewportMaxScroll]); useDroppablePublisher({ droppableId, type, mode, direction, isDropDisabled, isCombineEnabled, ignoreContainerClipping, getDroppableRef }); const placeholder = useMemoOne.useMemo(() => React__default["default"].createElement(AnimateInOut, { on: props.placeholder, shouldAnimate: props.shouldAnimatePlaceholder }, _ref => { let { onClose, data, animate } = _ref; return React__default["default"].createElement(Placeholder$1, { placeholder: data, onClose: onClose, innerRef: setPlaceholderRef, animate: animate, contextId: contextId, onTransitionEnd: onPlaceholderTransitionEnd }); }), [contextId, onPlaceholderTransitionEnd, props.placeholder, props.shouldAnimatePlaceholder, setPlaceholderRef]); const provided = useMemoOne.useMemo(() => ({ innerRef: setDroppableRef, placeholder, droppableProps: { 'data-rfd-droppable-id': droppableId, 'data-rfd-droppable-context-id': contextId } }), [contextId, droppableId, placeholder, setDroppableRef]); const isUsingCloneFor = useClone ? useClone.dragging.draggableId : null; const droppableContext = useMemoOne.useMemo(() => ({ droppableId, type, isUsingCloneFor }), [droppableId, isUsingCloneFor, type]); function getClone() { if (!useClone) { return null; } const { dragging, render } = useClone; const node = React__default["default"].createElement(PrivateDraggable, { draggableId: dragging.draggableId, index: dragging.source.index, isClone: true, isEnabled: true, shouldRespectForcePress: false, canDragInteractiveElements: true }, (draggableProvided, draggableSnapshot) => render(draggableProvided, draggableSnapshot, dragging)); return ReactDOM__default["default"].createPortal(node, getContainerForClone()); } return React__default["default"].createElement(DroppableContext.Provider, { value: droppableContext }, children(provided, snapshot), getClone()); }; var Droppable$1 = Droppable; const isMatchingType = (type, critical) => type === critical.droppable.type; const getDraggable = (critical, dimensions) => dimensions.draggables[critical.draggable.id]; const makeMapStateToProps = () => { const idleWithAnimation = { placeholder: null, shouldAnimatePlaceholder: true, snapshot: { isDraggingOver: false, draggingOverWith: null, draggingFromThisWith: null, isUsingPlaceholder: false }, useClone: null }; const idleWithoutAnimation = { ...idleWithAnimation, shouldAnimatePlaceholder: false }; const getDraggableRubric = memoizeOne__default["default"](descriptor => ({ draggableId: descriptor.id, type: descriptor.type, source: { index: descriptor.index, droppableId: descriptor.droppableId } })); const getMapProps = memoizeOne__default["default"]((id, isEnabled, isDraggingOverForConsumer, isDraggingOverForImpact, dragging, renderClone) => { const draggableId = dragging.descriptor.id; const isHome = dragging.descriptor.droppableId === id; if (isHome) { const useClone = renderClone ? { render: renderClone, dragging: getDraggableRubric(dragging.descriptor) } : null; const snapshot = { isDraggingOver: isDraggingOverForConsumer, draggingOverWith: isDraggingOverForConsumer ? draggableId : null, draggingFromThisWith: draggableId, isUsingPlaceholder: true }; return { placeholder: dragging.placeholder, shouldAnimatePlaceholder: false, snapshot, useClone }; } if (!isEnabled) { return idleWithoutAnimation; } if (!isDraggingOverForImpact) { return idleWithAnimation; } const snapshot = { isDraggingOver: isDraggingOverForConsumer, draggingOverWith: draggableId, draggingFromThisWith: null, isUsingPlaceholder: true }; return { placeholder: dragging.placeholder, shouldAnimatePlaceholder: true, snapshot, useClone: null }; }); const selector = (state, ownProps) => { const id = ownProps.droppableId; const type = ownProps.type; const isEnabled = !ownProps.isDropDisabled; const renderClone = ownProps.renderClone; if (isDragging(state)) { const critical = state.critical; if (!isMatchingType(type, critical)) { return idleWithoutAnimation; } const dragging = getDraggable(critical, state.dimensions); const isDraggingOver = whatIsDraggedOver(state.impact) === id; return getMapProps(id, isEnabled, isDraggingOver, isDraggingOver, dragging, renderClone); } if (state.phase === 'DROP_ANIMATING') { const completed = state.completed; if (!isMatchingType(type, completed.critical)) { return idleWithoutAnimation; } const dragging = getDraggable(completed.critical, state.dimensions); return getMapProps(id, isEnabled, whatIsDraggedOverFromResult(completed.result) === id, whatIsDraggedOver(completed.impact) === id, dragging, renderClone); } if (state.phase === 'IDLE' && state.completed && !state.shouldFlush) { const completed = state.completed; if (!isMatchingType(type, completed.critical)) { return idleWithoutAnimation; } const wasOver = whatIsDraggedOver(completed.impact) === id; const wasCombining = Boolean(completed.impact.at && completed.impact.at.type === 'COMBINE'); const isHome = completed.critical.droppable.id === id; if (wasOver) { return wasCombining ? idleWithAnimation : idleWithoutAnimation; } if (isHome) { return idleWithAnimation; } return idleWithoutAnimation; } return idleWithoutAnimation; }; return selector; }; const mapDispatchToProps$2 = { updateViewportMaxScroll: updateViewportMaxScroll }; function getBody() { !document.body ? invariant(false, 'document.body is not ready') : void 0; return document.body; } const defaultProps = { mode: 'standard', type: 'DEFAULT', direction: 'vertical', isDropDisabled: false, isCombineEnabled: false, ignoreContainerClipping: false, renderClone: null, getContainerForClone: getBody }; const ConnectedDroppable = reactRedux.connect(makeMapStateToProps, mapDispatchToProps$2, null, { context: StoreContext, areStatePropsEqual: isStrictEqual })(Droppable$1); ConnectedDroppable.defaultProps = defaultProps; var ConnectedDroppable$1 = ConnectedDroppable; var DragDropContext_1 = dnd_cjs.DragDropContext = DragDropContext; var Draggable_1 = dnd_cjs.Draggable = PublicDraggable; var Droppable_1 = dnd_cjs.Droppable = ConnectedDroppable$1; dnd_cjs.resetServerContext = resetServerContext; dnd_cjs.useKeyboardSensor = useKeyboardSensor; dnd_cjs.useMouseSensor = useMouseSensor; dnd_cjs.useTouchSensor = useTouchSensor; const AddNewItemButton = props => { const { resource, property } = props; const { translateProperty, translateButton } = useTranslation(); const label = translateProperty(`${property.path}.addNewItem`, resource.id, { defaultValue: translateButton('addNewItem', resource.id) }); return /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Box, null, /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Icon, { icon: "Add" }), label); }; const PropertyDescription = props => { const { property } = props; if (!property.description) { return null; } const direction = property.custom?.tooltipDirection || 'top'; return /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Box, { mx: "sm", display: "inline-flex" }, /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Tooltip, { direction: direction, title: property.description, size: "lg" }, /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Box, null, /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Icon, { icon: "Help", color: "info" })))); }; const OverridablePropertyDescription = allowOverride(PropertyDescription, 'PropertyDescription'); const PropertyLabel = props => { const { property, props: labelProps } = props; if (property.hideLabel) { return null; } return /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Label, _extends$2({ htmlFor: property.path, required: property.isRequired }, labelProps), property.label, property.description && /*#__PURE__*/React__default$1["default"].createElement(OverridablePropertyDescription, { property: property })); }; const OverridablePropertyLabel = allowOverride(PropertyLabel, 'PropertyLabel'); const getSubpropertyPath = (path, index) => [path, index].join(DELIMITER); /** * Converts property: PropertyJSON from an array to a sub-property for an actual item in the array * It change path that it has index inside along with the label. Futhermore flat isArray is removed * ,because it was already handled, so that itemRenderer can render property as a regular one * * @param {PropertyJSON} arrayProperty property with path set to an root Array type property, * @param {Number} index index under which sub-property should be placed * @private * @hide */ const convertToSubProperty$1 = (arrayProperty, index) => ({ ...arrayProperty, path: getSubpropertyPath(arrayProperty.path, index), label: `[${index + 1}]`, isArray: false, isDraggable: false }); /** * Removes selected array item from given record. It performs following tasks: * 1. removes array item from the array * 2. reorders keys in new array item * 3. if property has populated fields it also reorders them * it uses {@link flat } module and its removePath method * * @param {RecordJSON} record * @param {string} subPropertyPath which has to be removed. It has to be flattened * in notation, and ending with array index * @private * @hide */ const removeSubProperty = (record, subPropertyPath) => { // by default populated is flatten just to the path level - object itself is not flatten. That is // why we have to retrieve the original state. That is why we have to replace record.populated to // from { 'some.nested.1.key': RecordJSON } to { 'some.nested.1.key': 'some.nested.1.key' }, // then remove keys, and refill back some.nested.1.key to the value from the original populated // object. const populatedKeyMap = Object.keys(record.populated).reduce((memo, propertyKey) => ({ ...memo, [propertyKey]: propertyKey }), {}); const newPopulatedKeyMap = flat.removePath(populatedKeyMap, subPropertyPath); const newPopulated = Object.entries(newPopulatedKeyMap).reduce((memo, [newPropertyKey, oldPropertyKey]) => ({ ...memo, [newPropertyKey]: oldPropertyKey && record.populated[oldPropertyKey?.toString()] }), {}); return { ...record, params: flat.removePath(record.params, subPropertyPath), populated: newPopulated }; }; const ItemRenderer = props => { const { ItemComponent, property, onDelete, index, record, isDraggable } = props; const uniqueDraggableId = window.btoa(unescape(encodeURIComponent(`${JSON.stringify(flat.get(record.params, property.path))}-${property.path}`))); return /*#__PURE__*/React__default$1["default"].createElement(Draggable_1, { draggableId: uniqueDraggableId, index: index, key: uniqueDraggableId, isDragDisabled: !isDraggable }, provided => /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Box, _extends$2({ ref: provided.innerRef }, provided.draggableProps, provided.dragHandleProps, { backgroundColor: "white", flex: true, flexDirection: "row", alignItems: "center", "data-testid": property.path }), /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Box, { flexGrow: 1 }, /*#__PURE__*/React__default$1["default"].createElement(ItemComponent, props)), /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Box, { flexShrink: 0, ml: "lg" }, /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Button, { rounded: true, ml: "default", "data-testid": "delete-item", type: "button", size: "icon", onClick: event => onDelete(event, property), variant: "danger" }, /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Icon, { icon: "TrashCan" }))))); }; const InputsInSection = props => { const { property, record, resource, onChange } = props; const items = flat.get(record.params, property.path) || []; const addNew = React$1.useCallback(event => { const newItems = [...items, property.subProperties.length ? {} : '']; onChange(property.path, newItems); event.preventDefault(); return false; }, [record, onChange, property]); const removeItem = React$1.useCallback((event, subProperty) => { const newRecord = removeSubProperty(record, subProperty.path); onChange(newRecord); event.preventDefault(); return false; }, [record, onChange, property]); const handleOnDragEnd = React$1.useCallback(result => { const { source, destination } = result; if (!source || !destination || destination.index === source.index) return; const itemsCopy = Array.from(items); const [sourceItem] = itemsCopy.splice(source.index, 1); itemsCopy.splice(destination.index, 0, sourceItem); onChange(property.path, itemsCopy); }, [record, onChange, property]); return /*#__PURE__*/React__default$1["default"].createElement(DragDropContext_1, { onDragEnd: handleOnDragEnd }, /*#__PURE__*/React__default$1["default"].createElement(Droppable_1, { droppableId: property.path }, provided => /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Section, _extends$2({ ref: provided.innerRef }, provided.droppableProps, { mt: "xl", className: property.path }), items.map((item, i) => { const itemProperty = convertToSubProperty$1(property, i); return /*#__PURE__*/React__default$1["default"].createElement(ItemRenderer, _extends$2({}, props, { property: itemProperty, isDraggable: property.isDraggable, key: itemProperty.path, onDelete: removeItem, index: i })); }), provided.placeholder, /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Button, { onClick: addNew, type: "button", rounded: true }, /*#__PURE__*/React__default$1["default"].createElement(AddNewItemButton, { resource: resource, property: property }))))); }; const Edit$c = props => { const { property, record, testId } = props; const error = record.errors && record.errors[property.propertyPath]; return /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.FormGroup, { error: !!error, "data-testid": testId }, /*#__PURE__*/React__default$1["default"].createElement(OverridablePropertyLabel, { property: property }), /*#__PURE__*/React__default$1["default"].createElement(InputsInSection, props), /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.FormMessage, null, error && error.message)); }; const OverridableEdit$1 = allowOverride(Edit$c, 'DefaultArrayEditProperty'); const List$9 = props => { const { property, record } = props; const values = flat.get(record.params, property.path) || []; const { translateProperty } = useTranslation(); return /*#__PURE__*/React__default$1["default"].createElement("span", null, `${translateProperty('length')}: ${values.length}`); }; var list$8 = allowOverride(List$9, 'DefaultArrayListProperty'); const Show$b = props => { const { property, record, ItemComponent } = props; const items = flat.get(record.params, property.path) || []; return /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.ValueGroup, { label: property.label }, /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Section, null, (items || []).map((item, i) => { const itemProperty = convertToSubProperty$1(property, i); return /*#__PURE__*/React__default$1["default"].createElement(ItemComponent, _extends$2({}, props, { key: itemProperty.path, property: itemProperty })); }))); }; var show$9 = allowOverride(Show$b, 'DefaultArrayShowProperty'); // import Show from './show' var ArrayType = /*#__PURE__*/Object.freeze({ __proto__: null, show: show$9, edit: OverridableEdit$1, list: list$8 }); const EditKeyValuePair = props => { const { onKeyChange, onValueChange, onRemoveItem, property, objectValue, objectKey, error } = props; const { tm } = useTranslation(); const [currentValue, setValue] = React$1.useState(objectValue ?? ''); const [currentKey, setKey] = React$1.useState(objectKey ?? ''); return /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Box, { flex: true, mb: "lg" }, /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Box, { flex: true, justifyContent: "space-between", flexGrow: 1, flexShrink: 0 }, /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.FormGroup, { error: Boolean(error), mr: "lg", mb: "0px" }, /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Input, _extends$2({ placeholder: tm('keyPlaceholder'), onChange: e => setKey(e.target.value), onBlur: () => onKeyChange(objectKey, currentKey), onKeyDown: e => e.keyCode === 13 && onKeyChange(objectKey, currentKey), value: currentKey }, property.props?.keyInputProps ?? {})), error && /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.FormMessage, null, error.message)), /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.FormGroup, { mb: "0px" }, /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Input, _extends$2({ placeholder: tm('valuePlaceholder'), onChange: e => setValue(e.target.value), onBlur: () => onValueChange(currentKey, currentValue), onKeyDown: e => e.keyCode === 13 && onValueChange(currentKey, currentValue), value: currentValue, disabled: !objectKey }, property.props?.valueInputProps ?? {})))), /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Button, { rounded: true, ml: "sm", "data-testid": "delete-item", type: "button", size: "icon", onClick: () => onRemoveItem(currentKey), variant: "danger", flexGrow: 0, flexShrink: 1 }, /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Icon, { icon: "TrashCan" }))); }; const Edit$b = props => { const { property, record, onChange, resource } = props; const { tm, tb } = useTranslation(); const [objectValue, setObjectValue] = React$1.useState(flat.get(record.params, property.path) ?? {}); const handleKeyChange = (oldKey, newKey) => { if (oldKey === newKey) return; const tmpValue = objectValue[oldKey]; // eslint-disable-next-line @typescript-eslint/no-unused-vars const { [oldKey]: _removedKey, ...objectCopy } = objectValue; objectCopy[newKey] = tmpValue ?? ''; setObjectValue(parseObjectValue(objectCopy)); }; const handleValueChange = (key, value) => { objectValue[key] = value; setObjectValue(parseObjectValue({ ...objectValue })); }; const parseObjectValue = obj => Object.entries(obj).reduce((memo, [k, v]) => { if (!k || !k.length) return memo; memo[k] = v; return memo; }, {}); /** * This is used to prevent empty/duplicate keys from being added to JSON */ const getNextKey = previousId => { const nextId = previousId ? previousId + 1 : Object.keys(objectValue ?? {}).length + 1; const nextKey = `${tm('initialKey', resource.id, { number: nextId })}`; if (objectValue[nextKey] !== undefined) { return getNextKey(nextId); } return nextKey; }; const addNewKeyValuePair = event => { event.preventDefault(); const key = getNextKey(); objectValue[key] = ''; setObjectValue(parseObjectValue({ ...objectValue })); }; const handleRemoveItem = key => { // eslint-disable-next-line @typescript-eslint/no-unused-vars const { [key]: _removedKey, ...objectCopy } = objectValue; setObjectValue(parseObjectValue(objectCopy)); }; React$1.useEffect(() => { onChange(property.path, objectValue); }, [objectValue]); const error = record.errors && record.errors[property.path]; if (property.description === undefined) { property.description = tm('keyValuePropertyDefaultDescription', resource.id); } return /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.FormGroup, { error: !!error }, /*#__PURE__*/React__default$1["default"].createElement(OverridablePropertyLabel, { property: property }), /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Section, property.props, Object.entries(objectValue).map(([key, value]) => /*#__PURE__*/React__default$1["default"].createElement(EditKeyValuePair, { key: key, property: property, objectValue: value, objectKey: key, onKeyChange: handleKeyChange, onValueChange: handleValueChange, onRemoveItem: handleRemoveItem, error: record.errors[`${property.path}${flat.DELIMITER}${key}`] })), /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Button, { mt: "lg", variant: "primary", onClick: addNewKeyValuePair }, tb('addNewItem', resource.id))), /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.FormMessage, null, error && error.message)); }; const ShowKeyValuePair = props => { const { objectValue, objectKey } = props; const { tm } = useTranslation(); return /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Box, { flex: true, mb: "lg" }, /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.FormGroup, { mr: "lg", mb: "0px" }, /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Input, { placeholder: tm('keyPlaceholder'), value: objectKey, disabled: true })), /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.FormGroup, { mb: "0px" }, /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Input, { placeholder: tm('valuePlaceholder'), value: objectValue, disabled: true }))); }; const Show$a = props => { const { property, record } = props; const objectValue = flat.get(record.params, property.path) ?? {}; return /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.ValueGroup, { label: property.label }, /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Section, null, Object.entries(objectValue).map(([key, value]) => /*#__PURE__*/React__default$1["default"].createElement(ShowKeyValuePair, { key: key, objectValue: value, objectKey: key })))); }; var KeyValueType = /*#__PURE__*/Object.freeze({ __proto__: null, edit: Edit$b, show: Show$a }); function convertToSubProperty(property, subProperty) { const [subPropertyPath] = subProperty.name.split(DELIMITER).slice(-1); return { ...subProperty, path: [property.path, subPropertyPath].join(DELIMITER) }; } const Edit$a = props => { const { property, record, ItemComponent } = props; const error = record.errors && record.errors[property.path]; return /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.FormGroup, { error: !!error }, /*#__PURE__*/React__default$1["default"].createElement(OverridablePropertyLabel, { property: property }), /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Section, property.props, property.subProperties.filter(subProperty => !subProperty.isId).map(subProperty => { const subPropertyWithPath = convertToSubProperty(property, subProperty); return /*#__PURE__*/React__default$1["default"].createElement(ItemComponent, _extends$2({}, props, { key: subPropertyWithPath.path, property: subPropertyWithPath })); })), /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.FormMessage, null, error && error.message)); }; var edit$9 = allowOverride(Edit$a, 'DefaultMixedEditProperty'); const Show$9 = props => { const { property, ItemComponent } = props; return /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.ValueGroup, { label: property.label }, /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Section, null, property.subProperties.filter(subProperty => !subProperty.isId).map(subProperty => { const subPropertyWithPath = convertToSubProperty(property, subProperty); return /*#__PURE__*/React__default$1["default"].createElement(ItemComponent, _extends$2({}, props, { key: subPropertyWithPath.path, property: subPropertyWithPath })); }))); }; var show$8 = allowOverride(Show$9, 'DefaultMixedShowProperty'); const List$8 = props => { const { property, record, resource, ItemComponent } = props; const renderItems = () => /*#__PURE__*/React__default$1["default"].createElement(React__default$1["default"].Fragment, null, property.subProperties.filter(subProperty => !subProperty.isId).map(subProperty => { const subPropertyWithPath = convertToSubProperty(property, subProperty); return /*#__PURE__*/React__default$1["default"].createElement("div", { key: subPropertyWithPath.path }, /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Label, { inline: true }, `${subProperty.label}: `), /*#__PURE__*/React__default$1["default"].createElement(ItemComponent, _extends$2({}, props, { property: subPropertyWithPath }))); })); const showAction = record.recordActions.find(a => a.name === 'show'); if (resource.titleProperty.propertyPath === property.propertyPath && showAction) { const h = new ViewHelpers(); const href = h.recordActionUrl({ resourceId: resource.id, recordId: record.id, actionName: 'show' }); return /*#__PURE__*/React__default$1["default"].createElement(reactRouterDom.Link, { to: href }, renderItems()); } return renderItems(); }; var list$7 = allowOverride(List$8, 'DefaultMixedListProperty'); // import Show from './show' var MixedType = /*#__PURE__*/Object.freeze({ __proto__: null, show: show$8, edit: edit$9, list: list$7 }); /* eslint-disable import/prefer-default-export */ /** * Function used in React memo to compare if previous property value and next * property value are the same. * * @private */ const recordPropertyIsEqual = (prevProps, nextProps) => { const prevValue = prevProps.record.params[prevProps.property.path]; const nextValue = nextProps.record.params[nextProps.property.path]; const prevError = prevProps.record.errors[prevProps.property.path]; const nextError = nextProps.record.errors[nextProps.property.path]; return prevValue === nextValue && prevError === nextError; }; const parseValue = value => !(!value || value === 'false'); const Edit$9 = props => { const { property, onChange, record } = props; const value = parseValue(record.params && record.params[property.path]); const error = record.errors && record.errors[property.path]; const handleChange = () => { if (!property.isDisabled) { onChange(property.path, !value); } }; return /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.FormGroup, { error: !!error }, /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.CheckBox, _extends$2({ id: property.path, name: property.path, onChange: handleChange, checked: value, disabled: property.isDisabled }, property.props)), /*#__PURE__*/React__default$1["default"].createElement(OverridablePropertyLabel, { property: property, props: { inline: true } }), /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.FormMessage, null, error && error.message)); }; var edit$8 = allowOverride( /*#__PURE__*/React$1.memo(Edit$9, recordPropertyIsEqual), 'DefaultBooleanEditProperty'); var mapValue$1 = (value => { if (typeof value === 'undefined') { return ''; } return value ? 'Yes' : 'No'; }); const BooleanPropertyValue = props => { const { record, property, resource } = props; const { translateProperty } = useTranslation(); const rawValue = record?.params[property.path]; if (typeof rawValue === 'undefined' || rawValue === '') { return null; } const base = mapValue$1(rawValue); const translation = translateProperty(`${property.path}.${rawValue}`, resource.id, { defaultValue: base }); return /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Badge, { outline: true, size: "sm" }, translation); }; var BooleanPropertyValue$1 = allowOverride(BooleanPropertyValue, 'BooleanPropertyValue'); const Show$8 = props => { const { property } = props; return /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.ValueGroup, { label: property.label }, /*#__PURE__*/React__default$1["default"].createElement(BooleanPropertyValue$1, props)); }; var show$7 = allowOverride(Show$8, 'DefaultBooleanShowProperty'); const List$7 = props => /*#__PURE__*/React__default$1["default"].createElement(BooleanPropertyValue$1, props); var list$6 = allowOverride(List$7, 'DefaultBooleanListProperty'); const boolValue = s => { if (/true/i.test(s)) { return true; } return false; }; const Filter$6 = props => { const { property, filter = {}, onChange } = props; const value = typeof filter[property.path] === 'undefined' ? '' : boolValue(filter[property.path]); const options = [{ value: true, label: mapValue$1(true) }, { value: false, label: mapValue$1(false) }]; const selected = options.find(o => o.value === value); const handleChange = s => { const newValue = s ? s.value : undefined; onChange(property.path, newValue); }; return /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.FormGroup, null, /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Label, null, property.label), /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Select, { variant: "filter", value: typeof selected === 'undefined' ? '' : selected, isClearable: true, options: options, onChange: handleChange })); }; var filter$5 = allowOverride(Filter$6, 'DefaultBooleanFilterProperty'); var boolean = /*#__PURE__*/Object.freeze({ __proto__: null, edit: edit$8, show: show$7, list: list$6, filter: filter$5 }); const CurrencyInputWrapper = props => { const { id, initial, onChange, options } = props; const [value, setValue] = React$1.useState(initial); const onValueChange = currentValue => { setValue(currentValue); onChange(currentValue); }; return /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.CurrencyInput, _extends$2({ id: id, name: id, value: value, onValueChange: onValueChange }, options)); }; const OverridableCurrencyInputWrapper = allowOverride(CurrencyInputWrapper, 'CurrencyPropertyInputWrapper'); const Edit$8 = props => { const { onChange, property, record } = props; const propValue = record.params?.[property.path] ?? ''; const error = record.errors?.[property.path]; return /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.FormGroup, { error: Boolean(error) }, /*#__PURE__*/React__default$1["default"].createElement(OverridablePropertyLabel, { property: property }), /*#__PURE__*/React__default$1["default"].createElement(OverridableCurrencyInputWrapper, { id: property.path, initial: propValue, options: property.props, onChange: value => onChange(property.path, value) }), /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.FormMessage, null, error && error.message)); }; var edit$7 = allowOverride( /*#__PURE__*/React$1.memo(Edit$8, recordPropertyIsEqual), 'DefaultCurrencyEditProperty'); const Filter$5 = props => { const { onChange, property, filter } = props; const handleChange = value => { onChange(property.path, value); }; return /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.FormGroup, { variant: "filter" }, /*#__PURE__*/React__default$1["default"].createElement(OverridablePropertyLabel, { property: property }), /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.CurrencyInput, _extends$2({ id: property.path, name: `filter-${property.path}`, onValueChange: handleChange, value: filter[property.path] }, property.props))); }; var filter$4 = allowOverride(Filter$5, 'DefaultCurrencyFilterProperty'); const optionsKeys = ['value', 'decimalSeparator', 'groupSeparator', 'disableGroupSeparators', 'intlConfig', 'decimalScale', 'prefix', 'suffix']; const pickFormatOptions = props => { const pickedProps = Object.keys(props).reduce((acc, curr) => { if (optionsKeys.includes(curr)) acc[curr] = props[curr]; return acc; }, {}); return pickedProps; }; const formatValue = (value, props = {}) => { const formatOptions = pickFormatOptions({ value, ...props }); return DesignSystem.formatCurrencyProperty(formatOptions); }; const List$6 = props => { const { property, record } = props; const value = formatValue(record.params[property.path], property.props); return /*#__PURE__*/React__default$1["default"].createElement("span", null, value); }; var list$5 = allowOverride(List$6, 'DefaultCurrencyListProperty'); const Show$7 = props => { const { property, record } = props; const value = `${record.params[property.path]}`; return /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.ValueGroup, { label: property.label }, formatValue(value, property.props)); }; var show$6 = allowOverride(Show$7, 'DefaultCurrencyShowProperty'); var currency = /*#__PURE__*/Object.freeze({ __proto__: null, edit: edit$7, filter: filter$4, list: list$5, show: show$6 }); const Edit$7 = props => { const { property, onChange, record } = props; const value = record.params && record.params[property.path] || ''; const error = record.errors && record.errors[property.path]; return /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.FormGroup, { error: !!error }, /*#__PURE__*/React__default$1["default"].createElement(OverridablePropertyLabel, { property: property }), /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.DatePicker, _extends$2({ value: value, disabled: property.isDisabled, onChange: date => onChange(property.path, date), propertyType: property.type }, property.props)), /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.FormMessage, null, error && error.message)); }; var edit$6 = allowOverride( /*#__PURE__*/React$1.memo(Edit$7, recordPropertyIsEqual), 'DefaultDatetimeEditProperty'); var mapValue = ((value, propertyType) => { if (!value) { return ''; } const date = new Date(value); if (date) { return DesignSystem.formatDateProperty(date, propertyType); } return ''; }); const Show$6 = props => { const { property, record } = props; const value = mapValue(record.params[property.path], property.type); return /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.ValueGroup, { label: property.label }, value); }; var show$5 = allowOverride(Show$6, 'DefaultDatetimeShowProperty'); const List$5 = props => { const { property, record } = props; const value = mapValue(record.params[property.path], property.type); return /*#__PURE__*/React__default$1["default"].createElement("span", null, value); }; var list$4 = allowOverride(List$5, 'DefaultDatetimeListProperty'); const PARAM_SEPARATOR$1 = '~~'; /** * Filter object wrapping up selected filters. * @private */ class Filter$4 { /** * Changes raw nested filters to form Object. * * @example * const filters = { * nested: {field: 'ala'}, * 'dataField~~from': '2019-08-14' * } * * const normalized = Filter.normalizeFilters(filters) * // { * // 'nested.filter': 'ala', * // 'dataField': {from: '2019-08-14'} * // } * * * @param {Object} filters * * @return {Object} */ static normalizeKeys(filters) { return flat.unflatten(flat.flatten(filters), { delimiter: PARAM_SEPARATOR$1 }); } /** * @param {Object} filters selected filters * @param {BaseResource} resource resource which is filtered */ constructor(filters = {}, resource) { this.resource = resource; const normalized = Filter$4.normalizeKeys(filters); this.filters = Object.keys(normalized).reduce((memo, path) => { memo[path] = { path, property: this.resource.property(path), value: normalized[path] }; return memo; }, {}); } /** * Returns filter for a given property key * * @param {String} key property key * @returns {Filter.Property | undefined} */ get(key) { return this.filters[key]; } /** * Populates all filtered properties which refers to other resources */ async populate() { const keys = Object.keys(this.filters); for (let index = 0; index < keys.length; index += 1) { const key = keys[index]; const referenceResource = this.resource.decorate().getPropertyByKey(key)?.reference(); if (referenceResource) { this.filters[key].populated = await referenceResource.findOne(this.filters[key].value); } } return this; } reduce(callback, initial) { return Object.values(this.filters).reduce(callback, initial || {}); } isVisible() { return !!Object.keys(this.filters).length; } } var BackendFilter = /*#__PURE__*/Object.freeze({ __proto__: null, PARAM_SEPARATOR: PARAM_SEPARATOR$1, Filter: Filter$4, 'default': Filter$4 }); const { PARAM_SEPARATOR } = BackendFilter; const Filter$3 = props => { const { property, filter, onChange } = props; const { translateProperty } = useTranslation(); const fromKey = `${property.path}${PARAM_SEPARATOR}from`; const toKey = `${property.path}${PARAM_SEPARATOR}to`; const fromValue = filter[fromKey]; const toValue = filter[toKey]; return /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.FormGroup, { variant: "filter" }, /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Label, null, property.label), /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Label, null, `- ${translateProperty('from')}: `), /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.DatePicker, { value: fromValue, onChange: date => onChange(fromKey, date), propertyType: property.type }), /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Label, { mt: "default" }, `- ${translateProperty('to')}: `), /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.DatePicker, { value: toValue, onChange: date => onChange(toKey, date), propertyType: property.type })); }; var filter$3 = allowOverride(Filter$3, 'DefaultDatetimeFilterProperty'); var datetime = /*#__PURE__*/Object.freeze({ __proto__: null, edit: edit$6, show: show$5, list: list$4, filter: filter$3 }); const DefaultPropertyValue = props => { const { property, record } = props; const rawValue = record?.params[property.path]; if (typeof rawValue === 'undefined') { return null; } if (property.availableValues) { const option = property.availableValues.find(opt => opt.value === rawValue); if (!option) { return rawValue; } return /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Badge, null, option?.label || rawValue); } return rawValue; }; var DefaultPropertyValue$1 = allowOverride(DefaultPropertyValue, 'DefaultPropertyValue'); const Show$5 = props => { const { property } = props; return /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.ValueGroup, { label: property.label }, /*#__PURE__*/React__default$1["default"].createElement(DefaultPropertyValue$1, props)); }; var show$4 = allowOverride(Show$5, 'DefaultShowProperty'); const Edit$6 = props => { const { property, record } = props; const error = record.errors?.[property.path]; return /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.FormGroup, { error: Boolean(error) }, /*#__PURE__*/React__default$1["default"].createElement(OverridablePropertyLabel, { property: property }), property.availableValues ? /*#__PURE__*/React__default$1["default"].createElement(SelectEdit, props) : /*#__PURE__*/React__default$1["default"].createElement(TextEdit, props), /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.FormMessage, null, error && error.message)); }; const SelectEdit = props => { const { record, property, onChange } = props; if (!property.availableValues) { return null; } const propValue = record.params?.[property.path] ?? ''; const selected = property.availableValues.find(av => av.value === propValue); return /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Select, _extends$2({ value: selected, options: property.availableValues, onChange: s => onChange(property.path, s?.value ?? ''), isDisabled: property.isDisabled }, property.props)); }; const TextEdit = props => { const { property, record, onChange } = props; const propValue = record.params?.[property.path] ?? ''; const [value, setValue] = React$1.useState(propValue); React$1.useEffect(() => { if (value !== propValue) { setValue(propValue); } }, [propValue]); return /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Input, _extends$2({ id: property.path, name: property.path, required: property.isRequired, onChange: e => setValue(e.target.value), onBlur: () => onChange(property.path, value) // handle clicking ENTER , onKeyDown: e => e.keyCode === 13 && onChange(property.path, value), value: value, disabled: property.isDisabled }, property.props)); }; var edit$5 = allowOverride( /*#__PURE__*/React$1.memo(Edit$6, recordPropertyIsEqual), 'DefaultEditProperty'); const Filter$2 = props => { const { property, onChange, filter } = props; const handleInputChange = event => { onChange(property.path, event.target.value); }; const handleSelectChange = selected => { const value = selected ? selected.value : ''; onChange(property.path, value); }; const renderInput = () => { const filterKey = `filter-${property.path}`; const value = filter[property.path] || ''; if (property.availableValues) { const selected = property.availableValues.find(av => av.value === value); return /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Select, { variant: "filter", value: typeof selected === 'undefined' ? '' : selected, isClearable: true, options: property.availableValues, onChange: handleSelectChange }); } return /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Input, { name: filterKey, onChange: handleInputChange, value: value }); }; return /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.FormGroup, { variant: "filter" }, /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Label, null, property.label), renderInput()); }; var filter$2 = allowOverride(Filter$2, 'DefaultFilterProperty'); const List$4 = props => /*#__PURE__*/React__default$1["default"].createElement(DefaultPropertyValue$1, props); var list$3 = allowOverride(List$4, 'DefaultListProperty'); var defaultType = /*#__PURE__*/Object.freeze({ __proto__: null, show: show$4, edit: edit$5, filter: filter$2, list: list$3 }); const Edit$5 = props => { const { property, record, onChange } = props; const propValue = record.params[property.path]; const [value, setValue] = React$1.useState(propValue); const error = record.errors && record.errors[property.path]; const [isInput, setIsInput] = React$1.useState(false); React$1.useEffect(() => { if (value !== propValue) { setValue(propValue); } }, [propValue]); return /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.FormGroup, { error: !!error }, /*#__PURE__*/React__default$1["default"].createElement(OverridablePropertyLabel, { property: property }), /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.InputGroup, null, /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Input, _extends$2({ type: isInput ? 'input' : 'password', className: "input", id: property.path, name: property.path, onChange: event => setValue(event.target.value), onBlur: () => onChange(property.path, value), onKeyDown: e => e.keyCode === 13 && onChange(property.path, value), value: value ?? '', disabled: property.isDisabled }, property.props)), /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Button, { variant: isInput ? 'primary' : 'text', type: "button", size: "icon", onClick: () => setIsInput(!isInput) }, /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Icon, { icon: "View" }))), /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.FormMessage, null, error && error.message)); }; var edit$4 = allowOverride( /*#__PURE__*/React$1.memo(Edit$5, recordPropertyIsEqual), 'DefaultPasswordEditProperty'); /* eslint-disable import/prefer-default-export */ var password = /*#__PURE__*/Object.freeze({ __proto__: null, edit: edit$4 }); const Edit$4 = props => { const { onChange, property, record } = props; const propValue = record.params?.[property.path] ?? ''; const [value, setValue] = React$1.useState(propValue); const error = record.errors?.[property.path]; React$1.useEffect(() => { if (value !== propValue) { setValue(propValue); } }, [propValue]); return /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.FormGroup, { error: Boolean(error) }, /*#__PURE__*/React__default$1["default"].createElement(OverridablePropertyLabel, { property: property }), /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.PhoneInput, _extends$2({ id: property.path, inputProps: { name: property.path, required: property.isRequired }, onChange: setValue, onBlur: () => onChange(property.path, value), value: value }, property.props)), /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.FormMessage, null, error && error.message)); }; var edit$3 = allowOverride( /*#__PURE__*/React$1.memo(Edit$4, recordPropertyIsEqual), 'DefaultPhoneEditProperty'); const Filter$1 = props => { const { onChange, property, filter } = props; const handleChange = React$1.useCallback(value => { onChange(property.path, value); }, []); return /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.FormGroup, { variant: "filter" }, /*#__PURE__*/React__default$1["default"].createElement(OverridablePropertyLabel, { property: property }), /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.PhoneInput, _extends$2({ id: property.path, inputProps: { name: `filter-${property.path}` }, onChange: handleChange, value: filter[property.path] }, property.props))); }; var filter$1 = allowOverride(Filter$1, 'DefaultPhoneFilterProperty'); const List$3 = props => /*#__PURE__*/React__default$1["default"].createElement(DefaultPropertyValue$1, props); var list$2 = allowOverride(List$3, 'DefaultPhoneListProperty'); const Show$4 = props => { const { property } = props; return /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.ValueGroup, { label: property.label }, /*#__PURE__*/React__default$1["default"].createElement(DefaultPropertyValue$1, props)); }; var show$3 = allowOverride(Show$4, 'DefaultPhoneShowProperty'); var phone = /*#__PURE__*/Object.freeze({ __proto__: null, edit: edit$3, filter: filter$1, list: list$2, show: show$3 }); const Edit$3 = props => { const { onChange, property, record } = props; const { reference: resourceId } = property; if (!resourceId) { throw new Error(`Cannot reference resource in property '${property.path}'`); } const handleChange = selected => { if (selected) { onChange(property.path, selected.value, selected.record); } else { onChange(property.path, null); } }; const loadOptions = async inputValue => { const api = new ApiClient(); const optionRecords = await api.searchRecords({ resourceId, query: inputValue }); return optionRecords.map(optionRecord => ({ value: optionRecord.id, label: optionRecord.title, record: optionRecord })); }; const error = record?.errors[property.path]; const selectedId = React$1.useMemo(() => flat.get(record?.params, property.path), [record]); const [loadedRecord, setLoadedRecord] = React$1.useState(); const [loadingRecord, setLoadingRecord] = React$1.useState(0); React$1.useEffect(() => { if (selectedId) { setLoadingRecord(c => c + 1); const api = new ApiClient(); api.recordAction({ actionName: 'show', resourceId, recordId: selectedId }).then(({ data }) => { setLoadedRecord(data.record); }).finally(() => { setLoadingRecord(c => c - 1); }); } }, [selectedId, resourceId]); const selectedValue = loadedRecord; const selectedOption = selectedId && selectedValue ? { value: selectedValue.id, label: selectedValue.title } : { value: '', label: '' }; return /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.FormGroup, { error: Boolean(error) }, /*#__PURE__*/React__default$1["default"].createElement(OverridablePropertyLabel, { property: property }), /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.SelectAsync, _extends$2({ cacheOptions: true, value: selectedOption, defaultOptions: true, loadOptions: loadOptions, onChange: handleChange, isClearable: true, isDisabled: property.isDisabled, isLoading: !!loadingRecord }, property.props)), /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.FormMessage, null, error?.message)); }; var edit$2 = allowOverride( /*#__PURE__*/React$1.memo(Edit$3, recordPropertyIsEqual), 'DefaultReferenceEditProperty'); const StyledLink = styled__default["default"](reactRouterDom.Link).withConfig({ displayName: "reference-value__StyledLink", componentId: "sc-1ujousf-0" })(["", ";padding-left:", ";padding-right:", ";"], DesignSystem.ButtonCSS, ({ theme }) => theme.space.xs, ({ theme }) => theme.space.xs); const ReferenceValue = props => { const { property, record } = props; const h = new ViewHelpers(); const refId = record.params[property.path]; const populated = record.populated[property.path]; const value = populated && populated.title || refId; if (!property.reference) { throw new Error(`property: "${property.path}" does not have a reference`); } if (populated && populated.recordActions.find(a => a.name === 'show')) { const href = h.recordActionUrl({ resourceId: property.reference, recordId: refId, actionName: 'show' }); return /*#__PURE__*/React__default$1["default"].createElement(StyledLink, { variant: "text", to: href }, value); } return /*#__PURE__*/React__default$1["default"].createElement("span", null, value); }; var ReferenceValue$1 = allowOverride(ReferenceValue, 'DefaultReferenceValue'); const Show$3 = props => { const { property, record } = props; return /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.ValueGroup, { label: property.label }, /*#__PURE__*/React__default$1["default"].createElement(ReferenceValue$1, { property: property, record: record })); }; var show$2 = allowOverride(Show$3, 'DefaultReferenceShowProperty'); const List$2 = props => /*#__PURE__*/React__default$1["default"].createElement(ReferenceValue$1, props); var list$1 = allowOverride(List$2, 'DefaultReferenceListProperty'); const Filter = props => { const { property, filter, onChange } = props; const [options, setOptions] = React$1.useState([]); const api = new ApiClient(); const handleChange = selected => { onChange(property.path, selected ? selected.value : ''); }; const loadOptions = async inputValue => { const records = await api.searchRecords({ resourceId: property.reference, query: inputValue }); const loadedOptions = records.map(r => ({ value: r.id, label: r.title })); setOptions(loadedOptions); return loadedOptions; }; const value = typeof filter[property.path] === 'undefined' ? '' : filter[property.path]; const selected = (options || []).find(o => String(o.value) === String(value)); return /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.FormGroup, null, /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Label, null, property.label), /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.SelectAsync, { variant: "filter", value: typeof selected === 'undefined' ? '' : selected, isClearable: true, cacheOptions: true, loadOptions: loadOptions, onChange: handleChange, defaultOptions: true })); }; var filter = allowOverride(Filter, 'DefaultReferenceFilterProperty'); var reference = /*#__PURE__*/Object.freeze({ __proto__: null, edit: edit$2, show: show$2, list: list$1, filter: filter }); const Edit$2 = props => { const { property, record, onChange } = props; const value = record.params?.[property.path]; const error = record.errors && record.errors[property.path]; const handleUpdate = React$1.useCallback(newValue => { onChange(property.path, newValue); }, []); return /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.FormGroup, { error: Boolean(error) }, /*#__PURE__*/React__default$1["default"].createElement(OverridablePropertyLabel, { property: property }), /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.RichTextEditor, { value: value, onChange: handleUpdate, options: property.props }), /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.FormMessage, null, error?.message)); }; var edit$1 = allowOverride( /*#__PURE__*/React$1.memo(Edit$2, recordPropertyIsEqual), 'DefaultRichtextEditProperty'); var lib$1 = {exports: {}}; var _default$1 = {}; var lib = {exports: {}}; var _default = {}; /** * cssfilter * * @author 老雷 */ function getDefaultWhiteList$1 () { // 白名单值说明: // true: 允许该属性 // Function: function (val) { } 返回true表示允许该属性,其他值均表示不允许 // RegExp: regexp.test(val) 返回true表示允许该属性,其他值均表示不允许 // 除上面列出的值外均表示不允许 var whiteList = {}; whiteList['align-content'] = false; // default: auto whiteList['align-items'] = false; // default: auto whiteList['align-self'] = false; // default: auto whiteList['alignment-adjust'] = false; // default: auto whiteList['alignment-baseline'] = false; // default: baseline whiteList['all'] = false; // default: depending on individual properties whiteList['anchor-point'] = false; // default: none whiteList['animation'] = false; // default: depending on individual properties whiteList['animation-delay'] = false; // default: 0 whiteList['animation-direction'] = false; // default: normal whiteList['animation-duration'] = false; // default: 0 whiteList['animation-fill-mode'] = false; // default: none whiteList['animation-iteration-count'] = false; // default: 1 whiteList['animation-name'] = false; // default: none whiteList['animation-play-state'] = false; // default: running whiteList['animation-timing-function'] = false; // default: ease whiteList['azimuth'] = false; // default: center whiteList['backface-visibility'] = false; // default: visible whiteList['background'] = true; // default: depending on individual properties whiteList['background-attachment'] = true; // default: scroll whiteList['background-clip'] = true; // default: border-box whiteList['background-color'] = true; // default: transparent whiteList['background-image'] = true; // default: none whiteList['background-origin'] = true; // default: padding-box whiteList['background-position'] = true; // default: 0% 0% whiteList['background-repeat'] = true; // default: repeat whiteList['background-size'] = true; // default: auto whiteList['baseline-shift'] = false; // default: baseline whiteList['binding'] = false; // default: none whiteList['bleed'] = false; // default: 6pt whiteList['bookmark-label'] = false; // default: content() whiteList['bookmark-level'] = false; // default: none whiteList['bookmark-state'] = false; // default: open whiteList['border'] = true; // default: depending on individual properties whiteList['border-bottom'] = true; // default: depending on individual properties whiteList['border-bottom-color'] = true; // default: current color whiteList['border-bottom-left-radius'] = true; // default: 0 whiteList['border-bottom-right-radius'] = true; // default: 0 whiteList['border-bottom-style'] = true; // default: none whiteList['border-bottom-width'] = true; // default: medium whiteList['border-collapse'] = true; // default: separate whiteList['border-color'] = true; // default: depending on individual properties whiteList['border-image'] = true; // default: none whiteList['border-image-outset'] = true; // default: 0 whiteList['border-image-repeat'] = true; // default: stretch whiteList['border-image-slice'] = true; // default: 100% whiteList['border-image-source'] = true; // default: none whiteList['border-image-width'] = true; // default: 1 whiteList['border-left'] = true; // default: depending on individual properties whiteList['border-left-color'] = true; // default: current color whiteList['border-left-style'] = true; // default: none whiteList['border-left-width'] = true; // default: medium whiteList['border-radius'] = true; // default: 0 whiteList['border-right'] = true; // default: depending on individual properties whiteList['border-right-color'] = true; // default: current color whiteList['border-right-style'] = true; // default: none whiteList['border-right-width'] = true; // default: medium whiteList['border-spacing'] = true; // default: 0 whiteList['border-style'] = true; // default: depending on individual properties whiteList['border-top'] = true; // default: depending on individual properties whiteList['border-top-color'] = true; // default: current color whiteList['border-top-left-radius'] = true; // default: 0 whiteList['border-top-right-radius'] = true; // default: 0 whiteList['border-top-style'] = true; // default: none whiteList['border-top-width'] = true; // default: medium whiteList['border-width'] = true; // default: depending on individual properties whiteList['bottom'] = false; // default: auto whiteList['box-decoration-break'] = true; // default: slice whiteList['box-shadow'] = true; // default: none whiteList['box-sizing'] = true; // default: content-box whiteList['box-snap'] = true; // default: none whiteList['box-suppress'] = true; // default: show whiteList['break-after'] = true; // default: auto whiteList['break-before'] = true; // default: auto whiteList['break-inside'] = true; // default: auto whiteList['caption-side'] = false; // default: top whiteList['chains'] = false; // default: none whiteList['clear'] = true; // default: none whiteList['clip'] = false; // default: auto whiteList['clip-path'] = false; // default: none whiteList['clip-rule'] = false; // default: nonzero whiteList['color'] = true; // default: implementation dependent whiteList['color-interpolation-filters'] = true; // default: auto whiteList['column-count'] = false; // default: auto whiteList['column-fill'] = false; // default: balance whiteList['column-gap'] = false; // default: normal whiteList['column-rule'] = false; // default: depending on individual properties whiteList['column-rule-color'] = false; // default: current color whiteList['column-rule-style'] = false; // default: medium whiteList['column-rule-width'] = false; // default: medium whiteList['column-span'] = false; // default: none whiteList['column-width'] = false; // default: auto whiteList['columns'] = false; // default: depending on individual properties whiteList['contain'] = false; // default: none whiteList['content'] = false; // default: normal whiteList['counter-increment'] = false; // default: none whiteList['counter-reset'] = false; // default: none whiteList['counter-set'] = false; // default: none whiteList['crop'] = false; // default: auto whiteList['cue'] = false; // default: depending on individual properties whiteList['cue-after'] = false; // default: none whiteList['cue-before'] = false; // default: none whiteList['cursor'] = false; // default: auto whiteList['direction'] = false; // default: ltr whiteList['display'] = true; // default: depending on individual properties whiteList['display-inside'] = true; // default: auto whiteList['display-list'] = true; // default: none whiteList['display-outside'] = true; // default: inline-level whiteList['dominant-baseline'] = false; // default: auto whiteList['elevation'] = false; // default: level whiteList['empty-cells'] = false; // default: show whiteList['filter'] = false; // default: none whiteList['flex'] = false; // default: depending on individual properties whiteList['flex-basis'] = false; // default: auto whiteList['flex-direction'] = false; // default: row whiteList['flex-flow'] = false; // default: depending on individual properties whiteList['flex-grow'] = false; // default: 0 whiteList['flex-shrink'] = false; // default: 1 whiteList['flex-wrap'] = false; // default: nowrap whiteList['float'] = false; // default: none whiteList['float-offset'] = false; // default: 0 0 whiteList['flood-color'] = false; // default: black whiteList['flood-opacity'] = false; // default: 1 whiteList['flow-from'] = false; // default: none whiteList['flow-into'] = false; // default: none whiteList['font'] = true; // default: depending on individual properties whiteList['font-family'] = true; // default: implementation dependent whiteList['font-feature-settings'] = true; // default: normal whiteList['font-kerning'] = true; // default: auto whiteList['font-language-override'] = true; // default: normal whiteList['font-size'] = true; // default: medium whiteList['font-size-adjust'] = true; // default: none whiteList['font-stretch'] = true; // default: normal whiteList['font-style'] = true; // default: normal whiteList['font-synthesis'] = true; // default: weight style whiteList['font-variant'] = true; // default: normal whiteList['font-variant-alternates'] = true; // default: normal whiteList['font-variant-caps'] = true; // default: normal whiteList['font-variant-east-asian'] = true; // default: normal whiteList['font-variant-ligatures'] = true; // default: normal whiteList['font-variant-numeric'] = true; // default: normal whiteList['font-variant-position'] = true; // default: normal whiteList['font-weight'] = true; // default: normal whiteList['grid'] = false; // default: depending on individual properties whiteList['grid-area'] = false; // default: depending on individual properties whiteList['grid-auto-columns'] = false; // default: auto whiteList['grid-auto-flow'] = false; // default: none whiteList['grid-auto-rows'] = false; // default: auto whiteList['grid-column'] = false; // default: depending on individual properties whiteList['grid-column-end'] = false; // default: auto whiteList['grid-column-start'] = false; // default: auto whiteList['grid-row'] = false; // default: depending on individual properties whiteList['grid-row-end'] = false; // default: auto whiteList['grid-row-start'] = false; // default: auto whiteList['grid-template'] = false; // default: depending on individual properties whiteList['grid-template-areas'] = false; // default: none whiteList['grid-template-columns'] = false; // default: none whiteList['grid-template-rows'] = false; // default: none whiteList['hanging-punctuation'] = false; // default: none whiteList['height'] = true; // default: auto whiteList['hyphens'] = false; // default: manual whiteList['icon'] = false; // default: auto whiteList['image-orientation'] = false; // default: auto whiteList['image-resolution'] = false; // default: normal whiteList['ime-mode'] = false; // default: auto whiteList['initial-letters'] = false; // default: normal whiteList['inline-box-align'] = false; // default: last whiteList['justify-content'] = false; // default: auto whiteList['justify-items'] = false; // default: auto whiteList['justify-self'] = false; // default: auto whiteList['left'] = false; // default: auto whiteList['letter-spacing'] = true; // default: normal whiteList['lighting-color'] = true; // default: white whiteList['line-box-contain'] = false; // default: block inline replaced whiteList['line-break'] = false; // default: auto whiteList['line-grid'] = false; // default: match-parent whiteList['line-height'] = false; // default: normal whiteList['line-snap'] = false; // default: none whiteList['line-stacking'] = false; // default: depending on individual properties whiteList['line-stacking-ruby'] = false; // default: exclude-ruby whiteList['line-stacking-shift'] = false; // default: consider-shifts whiteList['line-stacking-strategy'] = false; // default: inline-line-height whiteList['list-style'] = true; // default: depending on individual properties whiteList['list-style-image'] = true; // default: none whiteList['list-style-position'] = true; // default: outside whiteList['list-style-type'] = true; // default: disc whiteList['margin'] = true; // default: depending on individual properties whiteList['margin-bottom'] = true; // default: 0 whiteList['margin-left'] = true; // default: 0 whiteList['margin-right'] = true; // default: 0 whiteList['margin-top'] = true; // default: 0 whiteList['marker-offset'] = false; // default: auto whiteList['marker-side'] = false; // default: list-item whiteList['marks'] = false; // default: none whiteList['mask'] = false; // default: border-box whiteList['mask-box'] = false; // default: see individual properties whiteList['mask-box-outset'] = false; // default: 0 whiteList['mask-box-repeat'] = false; // default: stretch whiteList['mask-box-slice'] = false; // default: 0 fill whiteList['mask-box-source'] = false; // default: none whiteList['mask-box-width'] = false; // default: auto whiteList['mask-clip'] = false; // default: border-box whiteList['mask-image'] = false; // default: none whiteList['mask-origin'] = false; // default: border-box whiteList['mask-position'] = false; // default: center whiteList['mask-repeat'] = false; // default: no-repeat whiteList['mask-size'] = false; // default: border-box whiteList['mask-source-type'] = false; // default: auto whiteList['mask-type'] = false; // default: luminance whiteList['max-height'] = true; // default: none whiteList['max-lines'] = false; // default: none whiteList['max-width'] = true; // default: none whiteList['min-height'] = true; // default: 0 whiteList['min-width'] = true; // default: 0 whiteList['move-to'] = false; // default: normal whiteList['nav-down'] = false; // default: auto whiteList['nav-index'] = false; // default: auto whiteList['nav-left'] = false; // default: auto whiteList['nav-right'] = false; // default: auto whiteList['nav-up'] = false; // default: auto whiteList['object-fit'] = false; // default: fill whiteList['object-position'] = false; // default: 50% 50% whiteList['opacity'] = false; // default: 1 whiteList['order'] = false; // default: 0 whiteList['orphans'] = false; // default: 2 whiteList['outline'] = false; // default: depending on individual properties whiteList['outline-color'] = false; // default: invert whiteList['outline-offset'] = false; // default: 0 whiteList['outline-style'] = false; // default: none whiteList['outline-width'] = false; // default: medium whiteList['overflow'] = false; // default: depending on individual properties whiteList['overflow-wrap'] = false; // default: normal whiteList['overflow-x'] = false; // default: visible whiteList['overflow-y'] = false; // default: visible whiteList['padding'] = true; // default: depending on individual properties whiteList['padding-bottom'] = true; // default: 0 whiteList['padding-left'] = true; // default: 0 whiteList['padding-right'] = true; // default: 0 whiteList['padding-top'] = true; // default: 0 whiteList['page'] = false; // default: auto whiteList['page-break-after'] = false; // default: auto whiteList['page-break-before'] = false; // default: auto whiteList['page-break-inside'] = false; // default: auto whiteList['page-policy'] = false; // default: start whiteList['pause'] = false; // default: implementation dependent whiteList['pause-after'] = false; // default: implementation dependent whiteList['pause-before'] = false; // default: implementation dependent whiteList['perspective'] = false; // default: none whiteList['perspective-origin'] = false; // default: 50% 50% whiteList['pitch'] = false; // default: medium whiteList['pitch-range'] = false; // default: 50 whiteList['play-during'] = false; // default: auto whiteList['position'] = false; // default: static whiteList['presentation-level'] = false; // default: 0 whiteList['quotes'] = false; // default: text whiteList['region-fragment'] = false; // default: auto whiteList['resize'] = false; // default: none whiteList['rest'] = false; // default: depending on individual properties whiteList['rest-after'] = false; // default: none whiteList['rest-before'] = false; // default: none whiteList['richness'] = false; // default: 50 whiteList['right'] = false; // default: auto whiteList['rotation'] = false; // default: 0 whiteList['rotation-point'] = false; // default: 50% 50% whiteList['ruby-align'] = false; // default: auto whiteList['ruby-merge'] = false; // default: separate whiteList['ruby-position'] = false; // default: before whiteList['shape-image-threshold'] = false; // default: 0.0 whiteList['shape-outside'] = false; // default: none whiteList['shape-margin'] = false; // default: 0 whiteList['size'] = false; // default: auto whiteList['speak'] = false; // default: auto whiteList['speak-as'] = false; // default: normal whiteList['speak-header'] = false; // default: once whiteList['speak-numeral'] = false; // default: continuous whiteList['speak-punctuation'] = false; // default: none whiteList['speech-rate'] = false; // default: medium whiteList['stress'] = false; // default: 50 whiteList['string-set'] = false; // default: none whiteList['tab-size'] = false; // default: 8 whiteList['table-layout'] = false; // default: auto whiteList['text-align'] = true; // default: start whiteList['text-align-last'] = true; // default: auto whiteList['text-combine-upright'] = true; // default: none whiteList['text-decoration'] = true; // default: none whiteList['text-decoration-color'] = true; // default: currentColor whiteList['text-decoration-line'] = true; // default: none whiteList['text-decoration-skip'] = true; // default: objects whiteList['text-decoration-style'] = true; // default: solid whiteList['text-emphasis'] = true; // default: depending on individual properties whiteList['text-emphasis-color'] = true; // default: currentColor whiteList['text-emphasis-position'] = true; // default: over right whiteList['text-emphasis-style'] = true; // default: none whiteList['text-height'] = true; // default: auto whiteList['text-indent'] = true; // default: 0 whiteList['text-justify'] = true; // default: auto whiteList['text-orientation'] = true; // default: mixed whiteList['text-overflow'] = true; // default: clip whiteList['text-shadow'] = true; // default: none whiteList['text-space-collapse'] = true; // default: collapse whiteList['text-transform'] = true; // default: none whiteList['text-underline-position'] = true; // default: auto whiteList['text-wrap'] = true; // default: normal whiteList['top'] = false; // default: auto whiteList['transform'] = false; // default: none whiteList['transform-origin'] = false; // default: 50% 50% 0 whiteList['transform-style'] = false; // default: flat whiteList['transition'] = false; // default: depending on individual properties whiteList['transition-delay'] = false; // default: 0s whiteList['transition-duration'] = false; // default: 0s whiteList['transition-property'] = false; // default: all whiteList['transition-timing-function'] = false; // default: ease whiteList['unicode-bidi'] = false; // default: normal whiteList['vertical-align'] = false; // default: baseline whiteList['visibility'] = false; // default: visible whiteList['voice-balance'] = false; // default: center whiteList['voice-duration'] = false; // default: auto whiteList['voice-family'] = false; // default: implementation dependent whiteList['voice-pitch'] = false; // default: medium whiteList['voice-range'] = false; // default: medium whiteList['voice-rate'] = false; // default: normal whiteList['voice-stress'] = false; // default: normal whiteList['voice-volume'] = false; // default: medium whiteList['volume'] = false; // default: medium whiteList['white-space'] = false; // default: normal whiteList['widows'] = false; // default: 2 whiteList['width'] = true; // default: auto whiteList['will-change'] = false; // default: auto whiteList['word-break'] = true; // default: normal whiteList['word-spacing'] = true; // default: normal whiteList['word-wrap'] = true; // default: normal whiteList['wrap-flow'] = false; // default: auto whiteList['wrap-through'] = false; // default: wrap whiteList['writing-mode'] = false; // default: horizontal-tb whiteList['z-index'] = false; // default: auto return whiteList; } /** * 匹配到白名单上的一个属性时 * * @param {String} name * @param {String} value * @param {Object} options * @return {String} */ function onAttr (name, value, options) { // do nothing } /** * 匹配到不在白名单上的一个属性时 * * @param {String} name * @param {String} value * @param {Object} options * @return {String} */ function onIgnoreAttr (name, value, options) { // do nothing } var REGEXP_URL_JAVASCRIPT = /javascript\s*\:/img; /** * 过滤属性值 * * @param {String} name * @param {String} value * @return {String} */ function safeAttrValue$1(name, value) { if (REGEXP_URL_JAVASCRIPT.test(value)) return ''; return value; } _default.whiteList = getDefaultWhiteList$1(); _default.getDefaultWhiteList = getDefaultWhiteList$1; _default.onAttr = onAttr; _default.onIgnoreAttr = onIgnoreAttr; _default.safeAttrValue = safeAttrValue$1; var util$1 = { indexOf: function (arr, item) { var i, j; if (Array.prototype.indexOf) { return arr.indexOf(item); } for (i = 0, j = arr.length; i < j; i++) { if (arr[i] === item) { return i; } } return -1; }, forEach: function (arr, fn, scope) { var i, j; if (Array.prototype.forEach) { return arr.forEach(fn, scope); } for (i = 0, j = arr.length; i < j; i++) { fn.call(scope, arr[i], i, arr); } }, trim: function (str) { if (String.prototype.trim) { return str.trim(); } return str.replace(/(^\s*)|(\s*$)/g, ''); }, trimRight: function (str) { if (String.prototype.trimRight) { return str.trimRight(); } return str.replace(/(\s*$)/g, ''); } }; /** * cssfilter * * @author 老雷 */ var _$3 = util$1; /** * 解析style * * @param {String} css * @param {Function} onAttr 处理属性的函数 * 参数格式: function (sourcePosition, position, name, value, source) * @return {String} */ function parseStyle$1 (css, onAttr) { css = _$3.trimRight(css); if (css[css.length - 1] !== ';') css += ';'; var cssLength = css.length; var isParenthesisOpen = false; var lastPos = 0; var i = 0; var retCSS = ''; function addNewAttr () { // 如果没有正常的闭合圆括号,则直接忽略当前属性 if (!isParenthesisOpen) { var source = _$3.trim(css.slice(lastPos, i)); var j = source.indexOf(':'); if (j !== -1) { var name = _$3.trim(source.slice(0, j)); var value = _$3.trim(source.slice(j + 1)); // 必须有属性名称 if (name) { var ret = onAttr(lastPos, retCSS.length, name, value, source); if (ret) retCSS += ret + '; '; } } } lastPos = i + 1; } for (; i < cssLength; i++) { var c = css[i]; if (c === '/' && css[i + 1] === '*') { // 备注开始 var j = css.indexOf('*/', i + 2); // 如果没有正常的备注结束,则后面的部分全部跳过 if (j === -1) break; // 直接将当前位置调到备注结尾,并且初始化状态 i = j + 1; lastPos = i + 1; isParenthesisOpen = false; } else if (c === '(') { isParenthesisOpen = true; } else if (c === ')') { isParenthesisOpen = false; } else if (c === ';') { if (isParenthesisOpen) ; else { addNewAttr(); } } else if (c === '\n') { addNewAttr(); } } return _$3.trim(retCSS); } var parser$2 = parseStyle$1; /** * cssfilter * * @author 老雷 */ var DEFAULT$1 = _default; var parseStyle = parser$2; /** * 返回值是否为空 * * @param {Object} obj * @return {Boolean} */ function isNull$1 (obj) { return (obj === undefined || obj === null); } /** * 浅拷贝对象 * * @param {Object} obj * @return {Object} */ function shallowCopyObject$1 (obj) { var ret = {}; for (var i in obj) { ret[i] = obj[i]; } return ret; } /** * 创建CSS过滤器 * * @param {Object} options * - {Object} whiteList * - {Function} onAttr * - {Function} onIgnoreAttr * - {Function} safeAttrValue */ function FilterCSS$2 (options) { options = shallowCopyObject$1(options || {}); options.whiteList = options.whiteList || DEFAULT$1.whiteList; options.onAttr = options.onAttr || DEFAULT$1.onAttr; options.onIgnoreAttr = options.onIgnoreAttr || DEFAULT$1.onIgnoreAttr; options.safeAttrValue = options.safeAttrValue || DEFAULT$1.safeAttrValue; this.options = options; } FilterCSS$2.prototype.process = function (css) { // 兼容各种奇葩输入 css = css || ''; css = css.toString(); if (!css) return ''; var me = this; var options = me.options; var whiteList = options.whiteList; var onAttr = options.onAttr; var onIgnoreAttr = options.onIgnoreAttr; var safeAttrValue = options.safeAttrValue; var retCSS = parseStyle(css, function (sourcePosition, position, name, value, source) { var check = whiteList[name]; var isWhite = false; if (check === true) isWhite = check; else if (typeof check === 'function') isWhite = check(value); else if (check instanceof RegExp) isWhite = check.test(value); if (isWhite !== true) isWhite = false; // 如果过滤后 value 为空则直接忽略 value = safeAttrValue(name, value); if (!value) return; var opts = { position: position, sourcePosition: sourcePosition, source: source, isWhite: isWhite }; if (isWhite) { var ret = onAttr(name, value, opts); if (isNull$1(ret)) { return name + ':' + value; } else { return ret; } } else { var ret = onIgnoreAttr(name, value, opts); if (!isNull$1(ret)) { return ret; } } }); return retCSS; }; var css = FilterCSS$2; /** * cssfilter * * @author 老雷 */ (function (module, exports) { var DEFAULT = _default; var FilterCSS = css; /** * XSS过滤 * * @param {String} css 要过滤的CSS代码 * @param {Object} options 选项:whiteList, onAttr, onIgnoreAttr * @return {String} */ function filterCSS (html, options) { var xss = new FilterCSS(options); return xss.process(html); } // 输出 exports = module.exports = filterCSS; exports.FilterCSS = FilterCSS; for (var i in DEFAULT) exports[i] = DEFAULT[i]; // 在浏览器端使用 if (typeof window !== 'undefined') { window.filterCSS = module.exports; } } (lib, lib.exports)); var util = { indexOf: function (arr, item) { var i, j; if (Array.prototype.indexOf) { return arr.indexOf(item); } for (i = 0, j = arr.length; i < j; i++) { if (arr[i] === item) { return i; } } return -1; }, forEach: function (arr, fn, scope) { var i, j; if (Array.prototype.forEach) { return arr.forEach(fn, scope); } for (i = 0, j = arr.length; i < j; i++) { fn.call(scope, arr[i], i, arr); } }, trim: function (str) { if (String.prototype.trim) { return str.trim(); } return str.replace(/(^\s*)|(\s*$)/g, ""); }, spaceIndex: function (str) { var reg = /\s|\n|\t/; var match = reg.exec(str); return match ? match.index : -1; }, }; /** * default settings * * @author Zongmin Lei */ var FilterCSS$1 = lib.exports.FilterCSS; var getDefaultCSSWhiteList = lib.exports.getDefaultWhiteList; var _$2 = util; function getDefaultWhiteList() { return { a: ["target", "href", "title"], abbr: ["title"], address: [], area: ["shape", "coords", "href", "alt"], article: [], aside: [], audio: [ "autoplay", "controls", "crossorigin", "loop", "muted", "preload", "src", ], b: [], bdi: ["dir"], bdo: ["dir"], big: [], blockquote: ["cite"], br: [], caption: [], center: [], cite: [], code: [], col: ["align", "valign", "span", "width"], colgroup: ["align", "valign", "span", "width"], dd: [], del: ["datetime"], details: ["open"], div: [], dl: [], dt: [], em: [], figcaption: [], figure: [], font: ["color", "size", "face"], footer: [], h1: [], h2: [], h3: [], h4: [], h5: [], h6: [], header: [], hr: [], i: [], img: ["src", "alt", "title", "width", "height"], ins: ["datetime"], li: [], mark: [], nav: [], ol: [], p: [], pre: [], s: [], section: [], small: [], span: [], sub: [], summary: [], sup: [], strong: [], strike: [], table: ["width", "border", "align", "valign"], tbody: ["align", "valign"], td: ["width", "rowspan", "colspan", "align", "valign"], tfoot: ["align", "valign"], th: ["width", "rowspan", "colspan", "align", "valign"], thead: ["align", "valign"], tr: ["rowspan", "align", "valign"], tt: [], u: [], ul: [], video: [ "autoplay", "controls", "crossorigin", "loop", "muted", "playsinline", "poster", "preload", "src", "height", "width", ], }; } var defaultCSSFilter = new FilterCSS$1(); /** * default onTag function * * @param {String} tag * @param {String} html * @param {Object} options * @return {String} */ function onTag(tag, html, options) { // do nothing } /** * default onIgnoreTag function * * @param {String} tag * @param {String} html * @param {Object} options * @return {String} */ function onIgnoreTag(tag, html, options) { // do nothing } /** * default onTagAttr function * * @param {String} tag * @param {String} name * @param {String} value * @return {String} */ function onTagAttr(tag, name, value) { // do nothing } /** * default onIgnoreTagAttr function * * @param {String} tag * @param {String} name * @param {String} value * @return {String} */ function onIgnoreTagAttr(tag, name, value) { // do nothing } /** * default escapeHtml function * * @param {String} html */ function escapeHtml(html) { return html.replace(REGEXP_LT, "<").replace(REGEXP_GT, ">"); } /** * default safeAttrValue function * * @param {String} tag * @param {String} name * @param {String} value * @param {Object} cssFilter * @return {String} */ function safeAttrValue(tag, name, value, cssFilter) { // unescape attribute value firstly value = friendlyAttrValue(value); if (name === "href" || name === "src") { // filter `href` and `src` attribute // only allow the value that starts with `http://` | `https://` | `mailto:` | `/` | `#` value = _$2.trim(value); if (value === "#") return "#"; if ( !( value.substr(0, 7) === "http://" || value.substr(0, 8) === "https://" || value.substr(0, 7) === "mailto:" || value.substr(0, 4) === "tel:" || value.substr(0, 11) === "data:image/" || value.substr(0, 6) === "ftp://" || value.substr(0, 2) === "./" || value.substr(0, 3) === "../" || value[0] === "#" || value[0] === "/" ) ) { return ""; } } else if (name === "background") { // filter `background` attribute (maybe no use) // `javascript:` REGEXP_DEFAULT_ON_TAG_ATTR_4.lastIndex = 0; if (REGEXP_DEFAULT_ON_TAG_ATTR_4.test(value)) { return ""; } } else if (name === "style") { // `expression()` REGEXP_DEFAULT_ON_TAG_ATTR_7.lastIndex = 0; if (REGEXP_DEFAULT_ON_TAG_ATTR_7.test(value)) { return ""; } // `url()` REGEXP_DEFAULT_ON_TAG_ATTR_8.lastIndex = 0; if (REGEXP_DEFAULT_ON_TAG_ATTR_8.test(value)) { REGEXP_DEFAULT_ON_TAG_ATTR_4.lastIndex = 0; if (REGEXP_DEFAULT_ON_TAG_ATTR_4.test(value)) { return ""; } } if (cssFilter !== false) { cssFilter = cssFilter || defaultCSSFilter; value = cssFilter.process(value); } } // escape `<>"` before returns value = escapeAttrValue(value); return value; } // RegExp list var REGEXP_LT = //g; var REGEXP_QUOTE = /"/g; var REGEXP_QUOTE_2 = /"/g; var REGEXP_ATTR_VALUE_1 = /&#([a-zA-Z0-9]*);?/gim; var REGEXP_ATTR_VALUE_COLON = /:?/gim; var REGEXP_ATTR_VALUE_NEWLINE = /&newline;?/gim; // var REGEXP_DEFAULT_ON_TAG_ATTR_3 = /\/\*|\*\//gm; var REGEXP_DEFAULT_ON_TAG_ATTR_4 = /((j\s*a\s*v\s*a|v\s*b|l\s*i\s*v\s*e)\s*s\s*c\s*r\s*i\s*p\s*t\s*|m\s*o\s*c\s*h\s*a):/gi; // var REGEXP_DEFAULT_ON_TAG_ATTR_5 = /^[\s"'`]*(d\s*a\s*t\s*a\s*)\:/gi; // var REGEXP_DEFAULT_ON_TAG_ATTR_6 = /^[\s"'`]*(d\s*a\s*t\s*a\s*)\:\s*image\//gi; var REGEXP_DEFAULT_ON_TAG_ATTR_7 = /e\s*x\s*p\s*r\s*e\s*s\s*s\s*i\s*o\s*n\s*\(.*/gi; var REGEXP_DEFAULT_ON_TAG_ATTR_8 = /u\s*r\s*l\s*\(.*/gi; /** * escape double quote * * @param {String} str * @return {String} str */ function escapeQuote(str) { return str.replace(REGEXP_QUOTE, """); } /** * unescape double quote * * @param {String} str * @return {String} str */ function unescapeQuote(str) { return str.replace(REGEXP_QUOTE_2, '"'); } /** * escape html entities * * @param {String} str * @return {String} */ function escapeHtmlEntities(str) { return str.replace(REGEXP_ATTR_VALUE_1, function replaceUnicode(str, code) { return code[0] === "x" || code[0] === "X" ? String.fromCharCode(parseInt(code.substr(1), 16)) : String.fromCharCode(parseInt(code, 10)); }); } /** * escape html5 new danger entities * * @param {String} str * @return {String} */ function escapeDangerHtml5Entities(str) { return str .replace(REGEXP_ATTR_VALUE_COLON, ":") .replace(REGEXP_ATTR_VALUE_NEWLINE, " "); } /** * clear nonprintable characters * * @param {String} str * @return {String} */ function clearNonPrintableCharacter(str) { var str2 = ""; for (var i = 0, len = str.length; i < len; i++) { str2 += str.charCodeAt(i) < 32 ? " " : str.charAt(i); } return _$2.trim(str2); } /** * get friendly attribute value * * @param {String} str * @return {String} */ function friendlyAttrValue(str) { str = unescapeQuote(str); str = escapeHtmlEntities(str); str = escapeDangerHtml5Entities(str); str = clearNonPrintableCharacter(str); return str; } /** * unescape attribute value * * @param {String} str * @return {String} */ function escapeAttrValue(str) { str = escapeQuote(str); str = escapeHtml(str); return str; } /** * `onIgnoreTag` function for removing all the tags that are not in whitelist */ function onIgnoreTagStripAll() { return ""; } /** * remove tag body * specify a `tags` list, if the tag is not in the `tags` list then process by the specify function (optional) * * @param {array} tags * @param {function} next */ function StripTagBody(tags, next) { if (typeof next !== "function") { next = function () {}; } var isRemoveAllTag = !Array.isArray(tags); function isRemoveTag(tag) { if (isRemoveAllTag) return true; return _$2.indexOf(tags, tag) !== -1; } var removeList = []; var posStart = false; return { onIgnoreTag: function (tag, html, options) { if (isRemoveTag(tag)) { if (options.isClosing) { var ret = "[/removed]"; var end = options.position + ret.length; removeList.push([ posStart !== false ? posStart : options.position, end, ]); posStart = false; return ret; } else { if (!posStart) { posStart = options.position; } return "[removed]"; } } else { return next(tag, html, options); } }, remove: function (html) { var rethtml = ""; var lastPos = 0; _$2.forEach(removeList, function (pos) { rethtml += html.slice(lastPos, pos[0]); lastPos = pos[1]; }); rethtml += html.slice(lastPos); return rethtml; }, }; } /** * remove html comments * * @param {String} html * @return {String} */ function stripCommentTag(html) { var retHtml = ""; var lastPos = 0; while (lastPos < html.length) { var i = html.indexOf("", i); if (j === -1) { break; } lastPos = j + 3; } return retHtml; } /** * remove invisible characters * * @param {String} html * @return {String} */ function stripBlankChar(html) { var chars = html.split(""); chars = chars.filter(function (char) { var c = char.charCodeAt(0); if (c === 127) return false; if (c <= 31) { if (c === 10 || c === 13) return true; return false; } return true; }); return chars.join(""); } _default$1.whiteList = getDefaultWhiteList(); _default$1.getDefaultWhiteList = getDefaultWhiteList; _default$1.onTag = onTag; _default$1.onIgnoreTag = onIgnoreTag; _default$1.onTagAttr = onTagAttr; _default$1.onIgnoreTagAttr = onIgnoreTagAttr; _default$1.safeAttrValue = safeAttrValue; _default$1.escapeHtml = escapeHtml; _default$1.escapeQuote = escapeQuote; _default$1.unescapeQuote = unescapeQuote; _default$1.escapeHtmlEntities = escapeHtmlEntities; _default$1.escapeDangerHtml5Entities = escapeDangerHtml5Entities; _default$1.clearNonPrintableCharacter = clearNonPrintableCharacter; _default$1.friendlyAttrValue = friendlyAttrValue; _default$1.escapeAttrValue = escapeAttrValue; _default$1.onIgnoreTagStripAll = onIgnoreTagStripAll; _default$1.StripTagBody = StripTagBody; _default$1.stripCommentTag = stripCommentTag; _default$1.stripBlankChar = stripBlankChar; _default$1.cssFilter = defaultCSSFilter; _default$1.getDefaultCSSWhiteList = getDefaultCSSWhiteList; var parser$1 = {}; /** * Simple HTML Parser * * @author Zongmin Lei */ var _$1 = util; /** * get tag name * * @param {String} html e.g. '' * @return {String} */ function getTagName(html) { var i = _$1.spaceIndex(html); var tagName; if (i === -1) { tagName = html.slice(1, -1); } else { tagName = html.slice(1, i + 1); } tagName = _$1.trim(tagName).toLowerCase(); if (tagName.slice(0, 1) === "/") tagName = tagName.slice(1); if (tagName.slice(-1) === "/") tagName = tagName.slice(0, -1); return tagName; } /** * is close tag? * * @param {String} html 如:'' * @return {Boolean} */ function isClosing(html) { return html.slice(0, 2) === "" || currentPos === len - 1) { rethtml += escapeHtml(html.slice(lastPos, tagStart)); currentHtml = html.slice(tagStart, currentPos + 1); currentTagName = getTagName(currentHtml); rethtml += onTag( tagStart, rethtml.length, currentTagName, currentHtml, isClosing(currentHtml) ); lastPos = currentPos + 1; tagStart = false; continue; } if (c === '"' || c === "'") { var i = 1; var ic = html.charAt(currentPos - i); while (ic.trim() === "" || ic === "=") { if (ic === "=") { quoteStart = c; continue chariterator; } ic = html.charAt(currentPos - ++i); } } } else { if (c === quoteStart) { quoteStart = false; continue; } } } } if (lastPos < len) { rethtml += escapeHtml(html.substr(lastPos)); } return rethtml; } var REGEXP_ILLEGAL_ATTR_NAME = /[^a-zA-Z0-9\\_:.-]/gim; /** * parse input attributes and returns processed attributes * * @param {String} html e.g. `href="#" target="_blank"` * @param {Function} onAttr e.g. `function (name, value)` * @return {String} */ function parseAttr$1(html, onAttr) { var lastPos = 0; var lastMarkPos = 0; var retAttrs = []; var tmpName = false; var len = html.length; function addAttr(name, value) { name = _$1.trim(name); name = name.replace(REGEXP_ILLEGAL_ATTR_NAME, "").toLowerCase(); if (name.length < 1) return; var ret = onAttr(name, value || ""); if (ret) retAttrs.push(ret); } // 逐个分析字符 for (var i = 0; i < len; i++) { var c = html.charAt(i); var v, j; if (tmpName === false && c === "=") { tmpName = html.slice(lastPos, i); lastPos = i + 1; lastMarkPos = html.charAt(lastPos) === '"' || html.charAt(lastPos) === "'" ? lastPos : findNextQuotationMark(html, i + 1); continue; } if (tmpName !== false) { if ( i === lastMarkPos ) { j = html.indexOf(c, i + 1); if (j === -1) { break; } else { v = _$1.trim(html.slice(lastMarkPos + 1, j)); addAttr(tmpName, v); tmpName = false; i = j; lastPos = i + 1; continue; } } } if (/\s|\n|\t/.test(c)) { html = html.replace(/\s|\n|\t/g, " "); if (tmpName === false) { j = findNextEqual(html, i); if (j === -1) { v = _$1.trim(html.slice(lastPos, i)); addAttr(v); tmpName = false; lastPos = i + 1; continue; } else { i = j - 1; continue; } } else { j = findBeforeEqual(html, i - 1); if (j === -1) { v = _$1.trim(html.slice(lastPos, i)); v = stripQuoteWrap(v); addAttr(tmpName, v); tmpName = false; lastPos = i + 1; continue; } else { continue; } } } } if (lastPos < html.length) { if (tmpName === false) { addAttr(html.slice(lastPos)); } else { addAttr(tmpName, stripQuoteWrap(_$1.trim(html.slice(lastPos)))); } } return _$1.trim(retAttrs.join(" ")); } function findNextEqual(str, i) { for (; i < str.length; i++) { var c = str[i]; if (c === " ") continue; if (c === "=") return i; return -1; } } function findNextQuotationMark(str, i) { for (; i < str.length; i++) { var c = str[i]; if (c === " ") continue; if (c === "'" || c === '"') return i; return -1; } } function findBeforeEqual(str, i) { for (; i > 0; i--) { var c = str[i]; if (c === " ") continue; if (c === "=") return i; return -1; } } function isQuoteWrapString(text) { if ( (text[0] === '"' && text[text.length - 1] === '"') || (text[0] === "'" && text[text.length - 1] === "'") ) { return true; } else { return false; } } function stripQuoteWrap(text) { if (isQuoteWrapString(text)) { return text.substr(1, text.length - 2); } else { return text; } } parser$1.parseTag = parseTag$1; parser$1.parseAttr = parseAttr$1; /** * filter xss * * @author Zongmin Lei */ var FilterCSS = lib.exports.FilterCSS; var DEFAULT = _default$1; var parser = parser$1; var parseTag = parser.parseTag; var parseAttr = parser.parseAttr; var _ = util; /** * returns `true` if the input value is `undefined` or `null` * * @param {Object} obj * @return {Boolean} */ function isNull(obj) { return obj === undefined || obj === null; } /** * get attributes for a tag * * @param {String} html * @return {Object} * - {String} html * - {Boolean} closing */ function getAttrs(html) { var i = _.spaceIndex(html); if (i === -1) { return { html: "", closing: html[html.length - 2] === "/", }; } html = _.trim(html.slice(i + 1, -1)); var isClosing = html[html.length - 1] === "/"; if (isClosing) html = _.trim(html.slice(0, -1)); return { html: html, closing: isClosing, }; } /** * shallow copy * * @param {Object} obj * @return {Object} */ function shallowCopyObject(obj) { var ret = {}; for (var i in obj) { ret[i] = obj[i]; } return ret; } function keysToLowerCase(obj) { var ret = {}; for (var i in obj) { if (Array.isArray(obj[i])) { ret[i.toLowerCase()] = obj[i].map(function (item) { return item.toLowerCase(); }); } else { ret[i.toLowerCase()] = obj[i]; } } return ret; } /** * FilterXSS class * * @param {Object} options * whiteList (or allowList), onTag, onTagAttr, onIgnoreTag, * onIgnoreTagAttr, safeAttrValue, escapeHtml * stripIgnoreTagBody, allowCommentTag, stripBlankChar * css{whiteList, onAttr, onIgnoreAttr} `css=false` means don't use `cssfilter` */ function FilterXSS(options) { options = shallowCopyObject(options || {}); if (options.stripIgnoreTag) { if (options.onIgnoreTag) { console.error( 'Notes: cannot use these two options "stripIgnoreTag" and "onIgnoreTag" at the same time' ); } options.onIgnoreTag = DEFAULT.onIgnoreTagStripAll; } if (options.whiteList || options.allowList) { options.whiteList = keysToLowerCase(options.whiteList || options.allowList); } else { options.whiteList = DEFAULT.whiteList; } options.onTag = options.onTag || DEFAULT.onTag; options.onTagAttr = options.onTagAttr || DEFAULT.onTagAttr; options.onIgnoreTag = options.onIgnoreTag || DEFAULT.onIgnoreTag; options.onIgnoreTagAttr = options.onIgnoreTagAttr || DEFAULT.onIgnoreTagAttr; options.safeAttrValue = options.safeAttrValue || DEFAULT.safeAttrValue; options.escapeHtml = options.escapeHtml || DEFAULT.escapeHtml; this.options = options; if (options.css === false) { this.cssFilter = false; } else { options.css = options.css || {}; this.cssFilter = new FilterCSS(options.css); } } /** * start process and returns result * * @param {String} html * @return {String} */ FilterXSS.prototype.process = function (html) { // compatible with the input html = html || ""; html = html.toString(); if (!html) return ""; var me = this; var options = me.options; var whiteList = options.whiteList; var onTag = options.onTag; var onIgnoreTag = options.onIgnoreTag; var onTagAttr = options.onTagAttr; var onIgnoreTagAttr = options.onIgnoreTagAttr; var safeAttrValue = options.safeAttrValue; var escapeHtml = options.escapeHtml; var cssFilter = me.cssFilter; // remove invisible characters if (options.stripBlankChar) { html = DEFAULT.stripBlankChar(html); } // remove html comments if (!options.allowCommentTag) { html = DEFAULT.stripCommentTag(html); } // if enable stripIgnoreTagBody var stripIgnoreTagBody = false; if (options.stripIgnoreTagBody) { stripIgnoreTagBody = DEFAULT.StripTagBody( options.stripIgnoreTagBody, onIgnoreTag ); onIgnoreTag = stripIgnoreTagBody.onIgnoreTag; } var retHtml = parseTag( html, function (sourcePosition, position, tag, html, isClosing) { var info = { sourcePosition: sourcePosition, position: position, isClosing: isClosing, isWhite: Object.prototype.hasOwnProperty.call(whiteList, tag), }; // call `onTag()` var ret = onTag(tag, html, info); if (!isNull(ret)) return ret; if (info.isWhite) { if (info.isClosing) { return ""; } var attrs = getAttrs(html); var whiteAttrList = whiteList[tag]; var attrsHtml = parseAttr(attrs.html, function (name, value) { // call `onTagAttr()` var isWhiteAttr = _.indexOf(whiteAttrList, name) !== -1; var ret = onTagAttr(tag, name, value, isWhiteAttr); if (!isNull(ret)) return ret; if (isWhiteAttr) { // call `safeAttrValue()` value = safeAttrValue(tag, name, value, cssFilter); if (value) { return name + '="' + value + '"'; } else { return name; } } else { // call `onIgnoreTagAttr()` ret = onIgnoreTagAttr(tag, name, value, isWhiteAttr); if (!isNull(ret)) return ret; return; } }); // build new tag html html = "<" + tag; if (attrsHtml) html += " " + attrsHtml; if (attrs.closing) html += " /"; html += ">"; return html; } else { // call `onIgnoreTag()` ret = onIgnoreTag(tag, html, info); if (!isNull(ret)) return ret; return escapeHtml(html); } }, escapeHtml ); // if enable stripIgnoreTagBody if (stripIgnoreTagBody) { retHtml = stripIgnoreTagBody.remove(retHtml); } return retHtml; }; var xss$1 = FilterXSS; /** * xss * * @author Zongmin Lei */ (function (module, exports) { var DEFAULT = _default$1; var parser = parser$1; var FilterXSS = xss$1; /** * filter xss function * * @param {String} html * @param {Object} options { whiteList, onTag, onTagAttr, onIgnoreTag, onIgnoreTagAttr, safeAttrValue, escapeHtml } * @return {String} */ function filterXSS(html, options) { var xss = new FilterXSS(options); return xss.process(html); } exports = module.exports = filterXSS; exports.filterXSS = filterXSS; exports.FilterXSS = FilterXSS; (function () { for (var i in DEFAULT) { exports[i] = DEFAULT[i]; } for (var j in parser) { exports[j] = parser[j]; } })(); // using `xss` on the browser, output `filterXSS` to the globals if (typeof window !== "undefined") { window.filterXSS = module.exports; } // using `xss` on the WebWorker, output `filterXSS` to the globals function isWorkerEnv() { return ( typeof self !== "undefined" && typeof DedicatedWorkerGlobalScope !== "undefined" && self instanceof DedicatedWorkerGlobalScope ); } if (isWorkerEnv()) { self.filterXSS = module.exports; } } (lib$1, lib$1.exports)); var xss = lib$1.exports; const Show$2 = props => { const { property, record } = props; const value = record.params[property.path] || ''; const createMarkup = html => ({ __html: xss(html) }); return /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.ValueGroup, { label: property.label }, /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Box, { py: "xl", px: ['0', 'xl'], border: "default" }, /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Text, { dangerouslySetInnerHTML: createMarkup(value) }))); }; var show$1 = allowOverride(Show$2, 'DefaultRichtextShowProperty'); /** * Checks if `value` is the * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types) * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) * * @static * @memberOf _ * @since 0.1.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is an object, else `false`. * @example * * _.isObject({}); * // => true * * _.isObject([1, 2, 3]); * // => true * * _.isObject(_.noop); * // => true * * _.isObject(null); * // => false */ function isObject$2(value) { var type = typeof value; return value != null && (type == 'object' || type == 'function'); } var isObject_1 = isObject$2; var baseGetTag = _baseGetTag, isObjectLike = isObjectLike_1; /** `Object#toString` result references. */ var regexpTag = '[object RegExp]'; /** * The base implementation of `_.isRegExp` without Node.js optimizations. * * @private * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a regexp, else `false`. */ function baseIsRegExp$1(value) { return isObjectLike(value) && baseGetTag(value) == regexpTag; } var _baseIsRegExp = baseIsRegExp$1; /** * The base implementation of `_.unary` without support for storing metadata. * * @private * @param {Function} func The function to cap arguments for. * @returns {Function} Returns the new capped function. */ function baseUnary$1(func) { return function(value) { return func(value); }; } var _baseUnary = baseUnary$1; var _nodeUtil = {exports: {}}; (function (module, exports) { var freeGlobal = _freeGlobal; /** Detect free variable `exports`. */ var freeExports = exports && !exports.nodeType && exports; /** Detect free variable `module`. */ var freeModule = freeExports && 'object' == 'object' && module && !module.nodeType && module; /** Detect the popular CommonJS extension `module.exports`. */ var moduleExports = freeModule && freeModule.exports === freeExports; /** Detect free variable `process` from Node.js. */ var freeProcess = moduleExports && freeGlobal.process; /** Used to access faster Node.js helpers. */ var nodeUtil = (function() { try { // Use `util.types` for Node.js 10+. var types = freeModule && freeModule.require && freeModule.require('util').types; if (types) { return types; } // Legacy `process.binding('util')` for Node.js < 10. return freeProcess && freeProcess.binding && freeProcess.binding('util'); } catch (e) {} }()); module.exports = nodeUtil; } (_nodeUtil, _nodeUtil.exports)); var baseIsRegExp = _baseIsRegExp, baseUnary = _baseUnary, nodeUtil = _nodeUtil.exports; /* Node.js helper references. */ var nodeIsRegExp = nodeUtil && nodeUtil.isRegExp; /** * Checks if `value` is classified as a `RegExp` object. * * @static * @memberOf _ * @since 0.1.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a regexp, else `false`. * @example * * _.isRegExp(/abc/); * // => true * * _.isRegExp('/abc/'); * // => false */ var isRegExp$1 = nodeIsRegExp ? baseUnary(nodeIsRegExp) : baseIsRegExp; var isRegExp_1 = isRegExp$1; /** * The base implementation of `_.property` without support for deep paths. * * @private * @param {string} key The key of the property to get. * @returns {Function} Returns the new accessor function. */ function baseProperty$1(key) { return function(object) { return object == null ? undefined : object[key]; }; } var _baseProperty = baseProperty$1; var baseProperty = _baseProperty; /** * Gets the size of an ASCII `string`. * * @private * @param {string} string The string inspect. * @returns {number} Returns the string size. */ var asciiSize$1 = baseProperty('length'); var _asciiSize = asciiSize$1; /** Used to compose unicode character classes. */ var rsAstralRange = '\\ud800-\\udfff', rsComboMarksRange = '\\u0300-\\u036f', reComboHalfMarksRange = '\\ufe20-\\ufe2f', rsComboSymbolsRange = '\\u20d0-\\u20ff', rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange, rsVarRange = '\\ufe0e\\ufe0f'; /** Used to compose unicode capture groups. */ var rsAstral = '[' + rsAstralRange + ']', rsCombo = '[' + rsComboRange + ']', rsFitz = '\\ud83c[\\udffb-\\udfff]', rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')', rsNonAstral = '[^' + rsAstralRange + ']', rsRegional = '(?:\\ud83c[\\udde6-\\uddff]){2}', rsSurrPair = '[\\ud800-\\udbff][\\udc00-\\udfff]', rsZWJ = '\\u200d'; /** Used to compose unicode regexes. */ var reOptMod = rsModifier + '?', rsOptVar = '[' + rsVarRange + ']?', rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*', rsSeq = rsOptVar + reOptMod + rsOptJoin, rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')'; /** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */ var reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g'); /** * Gets the size of a Unicode `string`. * * @private * @param {string} string The string inspect. * @returns {number} Returns the string size. */ function unicodeSize$1(string) { var result = reUnicode.lastIndex = 0; while (reUnicode.test(string)) { ++result; } return result; } var _unicodeSize = unicodeSize$1; var asciiSize = _asciiSize, hasUnicode$1 = _hasUnicode, unicodeSize = _unicodeSize; /** * Gets the number of symbols in `string`. * * @private * @param {string} string The string to inspect. * @returns {number} Returns the string size. */ function stringSize$1(string) { return hasUnicode$1(string) ? unicodeSize(string) : asciiSize(string); } var _stringSize = stringSize$1; /** Used to match a single whitespace character. */ var reWhitespace = /\s/; /** * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace * character of `string`. * * @private * @param {string} string The string to inspect. * @returns {number} Returns the index of the last non-whitespace character. */ function trimmedEndIndex$1(string) { var index = string.length; while (index-- && reWhitespace.test(string.charAt(index))) {} return index; } var _trimmedEndIndex = trimmedEndIndex$1; var trimmedEndIndex = _trimmedEndIndex; /** Used to match leading whitespace. */ var reTrimStart = /^\s+/; /** * The base implementation of `_.trim`. * * @private * @param {string} string The string to trim. * @returns {string} Returns the trimmed string. */ function baseTrim$1(string) { return string ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, '') : string; } var _baseTrim = baseTrim$1; var baseTrim = _baseTrim, isObject$1 = isObject_1, isSymbol = isSymbol_1; /** Used as references for various `Number` constants. */ var NAN = 0 / 0; /** Used to detect bad signed hexadecimal string values. */ var reIsBadHex = /^[-+]0x[0-9a-f]+$/i; /** Used to detect binary string values. */ var reIsBinary = /^0b[01]+$/i; /** Used to detect octal string values. */ var reIsOctal = /^0o[0-7]+$/i; /** Built-in method references without a dependency on `root`. */ var freeParseInt = parseInt; /** * Converts `value` to a number. * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to process. * @returns {number} Returns the number. * @example * * _.toNumber(3.2); * // => 3.2 * * _.toNumber(Number.MIN_VALUE); * // => 5e-324 * * _.toNumber(Infinity); * // => Infinity * * _.toNumber('3.2'); * // => 3.2 */ function toNumber$1(value) { if (typeof value == 'number') { return value; } if (isSymbol(value)) { return NAN; } if (isObject$1(value)) { var other = typeof value.valueOf == 'function' ? value.valueOf() : value; value = isObject$1(other) ? (other + '') : other; } if (typeof value != 'string') { return value === 0 ? value : +value; } value = baseTrim(value); var isBinary = reIsBinary.test(value); return (isBinary || reIsOctal.test(value)) ? freeParseInt(value.slice(2), isBinary ? 2 : 8) : (reIsBadHex.test(value) ? NAN : +value); } var toNumber_1 = toNumber$1; var toNumber = toNumber_1; /** Used as references for various `Number` constants. */ var INFINITY = 1 / 0, MAX_INTEGER = 1.7976931348623157e+308; /** * Converts `value` to a finite number. * * @static * @memberOf _ * @since 4.12.0 * @category Lang * @param {*} value The value to convert. * @returns {number} Returns the converted number. * @example * * _.toFinite(3.2); * // => 3.2 * * _.toFinite(Number.MIN_VALUE); * // => 5e-324 * * _.toFinite(Infinity); * // => 1.7976931348623157e+308 * * _.toFinite('3.2'); * // => 3.2 */ function toFinite$1(value) { if (!value) { return value === 0 ? value : 0; } value = toNumber(value); if (value === INFINITY || value === -INFINITY) { var sign = (value < 0 ? -1 : 1); return sign * MAX_INTEGER; } return value === value ? value : 0; } var toFinite_1 = toFinite$1; var toFinite = toFinite_1; /** * Converts `value` to an integer. * * **Note:** This method is loosely based on * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger). * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to convert. * @returns {number} Returns the converted integer. * @example * * _.toInteger(3.2); * // => 3 * * _.toInteger(Number.MIN_VALUE); * // => 0 * * _.toInteger(Infinity); * // => 1.7976931348623157e+308 * * _.toInteger('3.2'); * // => 3 */ function toInteger$1(value) { var result = toFinite(value), remainder = result % 1; return result === result ? (remainder ? result - remainder : result) : 0; } var toInteger_1 = toInteger$1; var baseToString = _baseToString, castSlice = _castSlice, hasUnicode = _hasUnicode, isObject = isObject_1, isRegExp = isRegExp_1, stringSize = _stringSize, stringToArray = _stringToArray, toInteger = toInteger_1, toString = toString_1; /** Used as default options for `_.truncate`. */ var DEFAULT_TRUNC_LENGTH = 30, DEFAULT_TRUNC_OMISSION = '...'; /** Used to match `RegExp` flags from their coerced string values. */ var reFlags = /\w*$/; /** * Truncates `string` if it's longer than the given maximum string length. * The last characters of the truncated string are replaced with the omission * string which defaults to "...". * * @static * @memberOf _ * @since 4.0.0 * @category String * @param {string} [string=''] The string to truncate. * @param {Object} [options={}] The options object. * @param {number} [options.length=30] The maximum string length. * @param {string} [options.omission='...'] The string to indicate text is omitted. * @param {RegExp|string} [options.separator] The separator pattern to truncate to. * @returns {string} Returns the truncated string. * @example * * _.truncate('hi-diddly-ho there, neighborino'); * // => 'hi-diddly-ho there, neighbo...' * * _.truncate('hi-diddly-ho there, neighborino', { * 'length': 24, * 'separator': ' ' * }); * // => 'hi-diddly-ho there,...' * * _.truncate('hi-diddly-ho there, neighborino', { * 'length': 24, * 'separator': /,? +/ * }); * // => 'hi-diddly-ho there...' * * _.truncate('hi-diddly-ho there, neighborino', { * 'omission': ' [...]' * }); * // => 'hi-diddly-ho there, neig [...]' */ function truncate(string, options) { var length = DEFAULT_TRUNC_LENGTH, omission = DEFAULT_TRUNC_OMISSION; if (isObject(options)) { var separator = 'separator' in options ? options.separator : separator; length = 'length' in options ? toInteger(options.length) : length; omission = 'omission' in options ? baseToString(options.omission) : omission; } string = toString(string); var strLength = string.length; if (hasUnicode(string)) { var strSymbols = stringToArray(string); strLength = strSymbols.length; } if (length >= strLength) { return string; } var end = length - stringSize(omission); if (end < 1) { return omission; } var result = strSymbols ? castSlice(strSymbols, 0, end).join('') : string.slice(0, end); if (separator === undefined) { return result + omission; } if (strSymbols) { end += (result.length - end); } if (isRegExp(separator)) { if (string.slice(end).search(separator)) { var match, substring = result; if (!separator.global) { separator = RegExp(separator.source, toString(reFlags.exec(separator)) + 'g'); } separator.lastIndex = 0; while ((match = separator.exec(substring))) { var newEnd = match.index; } result = result.slice(0, newEnd === undefined ? end : newEnd); } } else if (string.indexOf(baseToString(separator), end) != end) { var index = result.lastIndexOf(separator); if (index > -1) { result = result.slice(0, index); } } return result + omission; } var truncate_1 = truncate; const stripHtml = html => { const el = window.document.createElement('DIV'); el.innerHTML = html; return el.textContent || el.innerText || ''; }; const List$1 = props => { const { property, record } = props; const maxLength = property.custom?.maxLength || 15; const value = record.params[property.path] || ''; const textValue = stripHtml(value); return /*#__PURE__*/React__default$1["default"].createElement(React__default$1["default"].Fragment, null, truncate_1(textValue, { length: maxLength, separator: ' ' })); }; var list = allowOverride(List$1, 'DefaultReferenceListProperty'); var richtext = /*#__PURE__*/Object.freeze({ __proto__: null, edit: edit$1, show: show$1, list: list }); const Show$1 = props => { const { property, record } = props; const value = record.params[property.path] || ''; return /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.ValueGroup, { label: property.label }, value.split(/(?:\r\n|\r|\n)/g).map((line, i) => /*#__PURE__*/ // eslint-disable-next-line react/no-array-index-key React__default$1["default"].createElement(React__default$1["default"].Fragment, { key: i }, line, /*#__PURE__*/React__default$1["default"].createElement("br", null)))); }; var show = allowOverride(Show$1, 'DefaultTextareaShowProperty'); const Edit$1 = props => { const { onChange, property, record } = props; const propValue = record.params?.[property.path] ?? ''; const [value, setValue] = React$1.useState(propValue); const error = record.errors?.[property.path]; React$1.useEffect(() => { if (value !== propValue) { setValue(propValue); } }, [propValue]); return /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.FormGroup, { error: Boolean(error) }, /*#__PURE__*/React__default$1["default"].createElement(OverridablePropertyLabel, { property: property }), /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Input, _extends$2({ as: "textarea", rows: (value.match(/\n/g) || []).length + 1, id: property.path, name: property.path, onChange: e => setValue(e.target.value), onBlur: () => onChange(property.path, value), value: value, disabled: property.isDisabled }, property.props)), /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.FormMessage, null, error && error.message)); }; var edit = allowOverride( /*#__PURE__*/React$1.memo(Edit$1, recordPropertyIsEqual), 'DefaultTextareaEditProperty'); var textarea = /*#__PURE__*/Object.freeze({ __proto__: null, show: show, edit: edit }); let globalAny = {}; try { globalAny = window; } catch (error) { if (error.message !== 'window is not defined') { throw error; } } const types = { textarea, boolean, datetime, reference, password, date: datetime, richtext, string: defaultType, number: defaultType, float: defaultType, uuid: defaultType, mixed: null, 'key-value': null, currency, phone }; /** * @load ./base-property-component.doc.md * @component * @name BasePropertyComponent * @subcategory Application * @class * @hideconstructor */ const BasePropertyComponent = props => { const { property: baseProperty, resource, record, filter, where, onChange } = props; const property = React$1.useMemo(() => ({ ...baseProperty, // we fill the path if it is not there. That is why all the actual Component Renderers are // called with the path set to this root path. Next mixed and array components adds to this // path either index (for array) or subProperty name. path: baseProperty.path || baseProperty.propertyPath }), [baseProperty]); const testId = `property-${where}-${property.path}`; const contentTag = getActionElementCss(resource.id, where, property.path); let Component = types[property.type] && types[property.type][where] || defaultType[where]; if (property.components && property.components[where]) { const component = property.components[where]; if (!component) { throw new Error(`there is no "${property.path}.components.${where}"`); } Component = globalAny.AdminJS.UserComponents[component] ?? (() => { throw new Error(`Component "${component}" has not been bundled, ensure it was added to your ComponentLoader instance (the one included in AdminJS options).`); }); return /*#__PURE__*/React__default$1["default"].createElement(ErrorBoundary$1, null, /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Box, { "data-css": contentTag, "data-testid": testId }, /*#__PURE__*/React__default$1["default"].createElement(Component, { property: property, resource: resource, record: record, filter: filter, onChange: onChange, where: where }))); } const Array = ArrayType[where]; const Mixed = MixedType[where]; const KeyValue = KeyValueType[where]; if (baseProperty.isArray) { if (!Array) { return /*#__PURE__*/React__default$1["default"].createElement("div", null); } return /*#__PURE__*/React__default$1["default"].createElement(Array, _extends$2({}, props, { property: property, ItemComponent: BasePropertyComponent, testId: testId })); } if (baseProperty.type === 'key-value') { if (!KeyValue) { return /*#__PURE__*/React__default$1["default"].createElement("div", null); } return /*#__PURE__*/React__default$1["default"].createElement(KeyValue, _extends$2({}, props, { property: property, testId: testId })); } if (baseProperty.type === 'mixed') { if (!Mixed) { return /*#__PURE__*/React__default$1["default"].createElement("div", null); } return /*#__PURE__*/React__default$1["default"].createElement(Mixed, _extends$2({}, props, { property: property, ItemComponent: BasePropertyComponent, testId: testId })); } return /*#__PURE__*/React__default$1["default"].createElement(ErrorBoundary$1, null, /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Box, { "data-css": contentTag, "data-testid": testId }, /*#__PURE__*/React__default$1["default"].createElement(Component, { property: property, resource: resource, record: record, filter: filter, onChange: onChange, where: where }))); }; /** * This component is the same as `BasePropertyComponent` but it will not render * custom components. Use this in your custom components to render the default * property component. * * This is useful if you want your custom component to appear custom only for * specific `where` value and default for all others. */ const CleanPropertyComponent = props => { const { property } = props; const cleanProperty = React$1.useMemo(() => ({ ...property, components: {} }), [property]); return /*#__PURE__*/React__default$1["default"].createElement(BasePropertyComponent, _extends$2({}, props, { property: cleanProperty })); }; function camelizePropertyType(type) { return { Edit: type.edit, Show: type.show, List: type.list, Filter: type.filter }; } const BasePropertyComponentExtended = Object.assign(BasePropertyComponent, { DefaultType: camelizePropertyType(defaultType), Boolean: camelizePropertyType(boolean), DateTime: camelizePropertyType(datetime), RichText: camelizePropertyType(richtext), Reference: camelizePropertyType(reference), TextArea: camelizePropertyType(textarea), Password: camelizePropertyType(password), Currency: camelizePropertyType(currency), Phone: camelizePropertyType(phone) }); const LayoutElementRenderer = props => { const { layoutElement, resource, where, record, onChange } = props; const { props: layoutProps, properties: propertyNames, layoutElements: innerLayoutElements, component } = layoutElement; const { children, ...other } = layoutProps; const properties = propertyNames.map(name => resource.properties[name]); const Component = DesignSystem__namespace[component]; if (!Component) { return /*#__PURE__*/React__default$1["default"].createElement(DesignSystem__namespace.MessageBox, { size: "sm", message: "Javascript Error", variant: "danger", py: "xl" }, "There is no component by the name of", /*#__PURE__*/React__default$1["default"].createElement(DesignSystem__namespace.Badge, { size: "sm", variant: "danger", mx: "default" }, component), "in @adminjs/design-system. Change", /*#__PURE__*/React__default$1["default"].createElement(DesignSystem__namespace.Badge, { size: "sm", variant: "danger", mx: "default" }, `@${component}`), "to available component like @Header"); } return /*#__PURE__*/React__default$1["default"].createElement(Component, other, properties.map(property => /*#__PURE__*/React__default$1["default"].createElement(DesignSystem__namespace.Box, { flexGrow: 1, key: property.propertyPath }, /*#__PURE__*/React__default$1["default"].createElement(BasePropertyComponentExtended, { key: property.propertyPath, where: where, property: property, resource: resource, record: record, onChange: onChange }))), innerLayoutElements.map((innerLayoutElement, i) => /*#__PURE__*/React__default$1["default"].createElement(LayoutElementRenderer, _extends$2({}, props, { // eslint-disable-next-line react/no-array-index-key key: i, layoutElement: innerLayoutElement }))), children); }; const New = props => { const { record: initialRecord, resource, action } = props; const { record, handleChange, submit: handleSubmit, loading, setRecord } = useRecord(initialRecord, resource.id); const { translateButton } = useTranslation(); const navigate = reactRouter.useNavigate(); React$1.useEffect(() => { if (initialRecord) { setRecord(initialRecord); } }, [initialRecord]); const submit = event => { event.preventDefault(); handleSubmit().then(response => { if (response.data.redirectUrl) { navigate(appendForceRefresh(response.data.redirectUrl)); } // if record has id === has been created if (response.data.record.id && !Object.keys(response.data.record.errors).length) { handleChange({ params: {}, populated: {}, errors: {} }); } }); return false; }; const contentTag = getActionElementCss(resource.id, action.name, 'drawer-content'); const formTag = getActionElementCss(resource.id, action.name, 'form'); const footerTag = getActionElementCss(resource.id, action.name, 'drawer-footer'); const buttonTag = getActionElementCss(resource.id, action.name, 'drawer-submit'); return /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Box, { as: "form", onSubmit: submit, flex: true, flexGrow: 1, flexDirection: "column", "data-css": formTag }, /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.DrawerContent, { "data-css": contentTag }, action?.showInDrawer ? /*#__PURE__*/React__default$1["default"].createElement(OverridableActionHeader, props) : null, action.layout ? action.layout.map((layoutElement, i) => /*#__PURE__*/React__default$1["default"].createElement(LayoutElementRenderer // eslint-disable-next-line react/no-array-index-key , _extends$2({ key: i, layoutElement: layoutElement }, props, { where: "edit", onChange: handleChange, record: record }))) : resource.editProperties.map(property => /*#__PURE__*/React__default$1["default"].createElement(BasePropertyComponentExtended, { key: property.propertyPath, where: "edit", onChange: handleChange, property: property, resource: resource, record: record }))), /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.DrawerFooter, { "data-css": footerTag }, /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Button, { variant: "primary", size: "lg", type: "submit", "data-css": buttonTag, "data-testid": "button-save", disabled: loading }, loading ? /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Icon, { icon: "Fade", spin: true }) : null, translateButton('save', resource.id)))); }; const OverridableNew = allowOverride(New, 'DefaultNewAction'); const Edit = props => { const { record: initialRecord, resource, action } = props; const { record, handleChange, submit: handleSubmit, loading, setRecord } = useRecord(initialRecord, resource.id); const { translateButton } = useTranslation(); const navigate = reactRouter.useNavigate(); React$1.useEffect(() => { if (initialRecord) { setRecord(initialRecord); } }, [initialRecord]); const submit = event => { event.preventDefault(); handleSubmit().then(response => { if (response.data.redirectUrl) { navigate(appendForceRefresh(response.data.redirectUrl)); } }); return false; }; const contentTag = getActionElementCss(resource.id, action.name, 'drawer-content'); const formTag = getActionElementCss(resource.id, action.name, 'form'); const footerTag = getActionElementCss(resource.id, action.name, 'drawer-footer'); const buttonTag = getActionElementCss(resource.id, action.name, 'drawer-submit'); return /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Box, { as: "form", onSubmit: submit, flex: true, flexDirection: "column", "data-css": formTag }, /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.DrawerContent, { "data-css": contentTag }, action?.showInDrawer ? /*#__PURE__*/React__default$1["default"].createElement(OverridableActionHeader, props) : null, action.layout ? action.layout.map((layoutElement, i) => /*#__PURE__*/React__default$1["default"].createElement(LayoutElementRenderer // eslint-disable-next-line react/no-array-index-key , _extends$2({ key: i, layoutElement: layoutElement }, props, { where: "edit", onChange: handleChange, record: record }))) : resource.editProperties.map(property => /*#__PURE__*/React__default$1["default"].createElement(BasePropertyComponentExtended, { key: property.propertyPath, where: "edit", onChange: handleChange, property: property, resource: resource, record: record }))), /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.DrawerFooter, { "data-css": footerTag }, /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Button, { variant: "primary", size: "lg", type: "submit", "data-css": buttonTag, "data-testid": "button-save", disabled: loading }, loading ? /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Icon, { icon: "Fade", spin: true }) : null, translateButton('save', resource.id)))); }; const OverridableEdit = allowOverride(Edit, 'DefaultEditAction'); /** * @name ShowAction * @category Actions * @description Shows a given record. * @component * @private */ const Show = props => { const { resource, record, action } = props; const properties = resource.showProperties; const contentTag = getActionElementCss(resource.id, action.name, 'drawer-content'); return /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.DrawerContent, { "data-css": contentTag }, action?.showInDrawer ? /*#__PURE__*/React__default$1["default"].createElement(OverridableActionHeader, props) : null, action.layout ? action.layout.map((layoutElement, i) => /*#__PURE__*/React__default$1["default"].createElement(LayoutElementRenderer // eslint-disable-next-line react/no-array-index-key , _extends$2({ key: i, layoutElement: layoutElement }, props, { where: "show" }))) : properties.map(property => /*#__PURE__*/React__default$1["default"].createElement(BasePropertyComponentExtended, { key: property.propertyPath, where: "show", property: property, resource: resource, record: record }))); }; const OverridableShow = allowOverride(Show, 'DefaultShowAction'); /* eslint-disable no-undef */ /** * @alias ActionButtonProps * @memberof ActionButton */ /** * Renders Button which redirects to given action * * ### Usage * * ``` * import { ActionButton } from 'adminjs' * ``` * * @component * @subcategory Application */ const ActionButton = props => { const { children, action, actionPerformed, resourceId, recordId, recordIds } = props; const { href, handleClick } = useAction(action, { resourceId, recordId, recordIds }, actionPerformed); if (!action) { return null; } const firstChild = React__default$1["default"].Children.toArray(children)[0]; if (!firstChild || typeof firstChild === 'string' || typeof firstChild === 'number' || typeof firstChild === 'boolean') { throw new Error('ActionButton has to have one child'); } const contentTag = getActionElementCss(resourceId, action.name, 'button'); const WrappedElement = /*#__PURE__*/React__default$1["default"].cloneElement(firstChild, { onClick: handleClick, 'data-testid': buildActionTestId(action), 'data-css': contentTag, href }); return WrappedElement; }; const OverridableActionButton = allowOverride(ActionButton, 'ActionButton'); const NoRecordsOriginal = props => { const { resource } = props; const { translateButton, translateMessage } = useTranslation(); const canCreate = resource.resourceActions.find(a => a.name === 'new'); return /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.InfoBox, { title: translateMessage('noRecords', resource.id) }, /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Text, { mb: "xxl" }, translateMessage('noRecordsInResource', resource.id)), canCreate ? /*#__PURE__*/React__default$1["default"].createElement(OverridableActionButton, { action: canCreate, resourceId: resource.id }, /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Button, { variant: "primary" }, /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Icon, { icon: "Add" }), translateButton('createFirstRecord', resource.id))) : ''); }; // This hack prevents rollup from throwing an error const NoRecords = allowOverride(NoRecordsOriginal, 'NoRecords'); const display = isTitle => [isTitle ? 'table-cell' : 'none', isTitle ? 'table-cell' : 'none', 'table-cell', 'table-cell']; const RecordInList = props => { const { resource, record: recordFromProps, actionPerformed, isLoading, onSelect, isSelected } = props; const [record, setRecord] = React$1.useState(recordFromProps); const navigate = reactRouter.useNavigate(); const handleActionCallback = React$1.useCallback(actionResponse => { if (actionResponse.record && !actionResponse.redirectUrl) { setRecord(mergeRecordResponse(record, actionResponse)); } else if (actionPerformed) { actionPerformed(actionResponse); } }, [actionPerformed, record]); const actionResponseHandler = useActionResponseHandler(handleActionCallback); React$1.useEffect(() => { setRecord(recordFromProps); }, [recordFromProps]); const { recordActions } = record; const show = record.recordActions.find(({ name }) => name === 'show'); const edit = record.recordActions.find(({ name }) => name === 'edit'); const action = show || edit; const handleClick = event => { const targetTagName = event.target.tagName.toLowerCase(); if (action && targetTagName !== 'a' && targetTagName !== 'button' && targetTagName !== 'svg') { buildActionClickHandler({ action, params: { resourceId: resource.id, recordId: record.id }, actionResponseHandler, navigate })(event); } }; const actionParams = { resourceId: resource.id, recordId: record.id }; const handleActionClick = (event, sourceAction) => buildActionClickHandler({ action: sourceAction, params: actionParams, actionResponseHandler, navigate })(event); const buttons = [{ icon: 'OverflowMenuHorizontal', variant: 'light', label: undefined, 'data-testid': 'actions-dropdown', buttons: actionsToButtonGroup({ actions: recordActions, params: actionParams, handleClick: handleActionClick }) }]; const contentTag = getResourceElementCss(resource.id, 'table-row'); return /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.TableRow, { onClick: handleClick, "data-id": record.id, "data-css": contentTag }, /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.TableCell, { className: isSelected ? 'selected' : 'not-selected' }, onSelect && record.bulkActions.length ? /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.CheckBox, { onChange: () => onSelect(record), checked: isSelected }) : null), resource.listProperties.map(property => { const cellTag = `${resource.id}-${property.name}-table-cell`; return /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.TableCell, { style: { cursor: 'pointer' }, key: property.propertyPath, "data-property-name": property.propertyPath, display: display(property.isTitle), "data-css": cellTag }, isLoading ? /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Placeholder, { style: { height: 14 } }) : /*#__PURE__*/React__default$1["default"].createElement(BasePropertyComponentExtended, { key: property.propertyPath, where: "list", property: property, resource: resource, record: record })); }), /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.TableCell, { key: "options" }, recordActions.length ? /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.ButtonGroup, { buttons: buttons }) : '')); }; const OverridableRecordInList = allowOverride(RecordInList, 'RecordInList'); const SortLink = props => { const { sortBy, property, direction } = props; const location = reactRouterDom.useLocation(); const isActive = React$1.useMemo(() => sortBy === property.propertyPath, [sortBy, property]); const query = new URLSearchParams(location.search); const oppositeDirection = isActive && direction === 'asc' ? 'desc' : 'asc'; const sortedByIcon = `Caret${direction === 'asc' ? 'Up' : 'Down'}`; query.set('direction', oppositeDirection); query.set('sortBy', property.propertyPath); return /*#__PURE__*/React__default$1["default"].createElement(reactRouterDom.NavLink, { to: { search: query.toString() }, className: DesignSystem.cssClass('SortLink') }, property.label, isActive ? /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Icon, { icon: sortedByIcon, color: "primary100", ml: "default" }) : ''); }; const checkSortProps = (prevProps, nextProps) => prevProps.direction === nextProps.direction && prevProps.property.propertyPath === nextProps.property.propertyPath && prevProps.sortBy === nextProps.sortBy; var SortLink$1 = /*#__PURE__*/React$1.memo(SortLink, checkSortProps); const PropertyHeader = props => { const { property, titleProperty, display } = props; const isMain = property.propertyPath === titleProperty.propertyPath; return /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.TableCell, { className: isMain ? 'main' : undefined, display: display }, property.isSortable ? /*#__PURE__*/React__default$1["default"].createElement(SortLink$1, props) : property.label); }; const OverridablePropertyHeader = allowOverride(PropertyHeader, 'PropertyHeader'); /** * @memberof RecordsTableHeader * @alias RecordsTableHeaderProps */ /** * Prints `thead` section for table with records. * * ``` * import { RecordsTableHeader } from 'adminjs' * ``` * * @component * @subcategory Application * @example List with 2 properties * const properties = [{ * label: 'First Name', * name: 'firstName', * isSortable: true, * }, { * label: 'Last Name', * name: 'lastName', * }] * return ( * * * * * * John * Doe * * * * Max * Kodaly * * * *
*
* ) */ const RecordsTableHeader = props => { const { titleProperty, properties, sortBy, direction, onSelectAll, selectedAll } = props; const contentTag = getResourceElementCss(titleProperty.resourceId, 'table-head'); const rowTag = `${titleProperty.resourceId}-table-head-row`; const checkboxCss = `${titleProperty.resourceId}-checkbox-table-cell`; return /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.TableHead, { "data-css": contentTag }, /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.TableRow, { "data-css": rowTag }, /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.TableCell, { "data-css": checkboxCss }, onSelectAll ? /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.CheckBox, { style: { marginLeft: 5 }, onChange: () => onSelectAll(), checked: selectedAll }) : null), properties.map(property => /*#__PURE__*/React__default$1["default"].createElement(OverridablePropertyHeader, { display: display(property.isTitle), key: property.propertyPath, titleProperty: titleProperty, property: property, sortBy: sortBy, direction: direction })), /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.TableCell, { key: "actions", style: { width: 80 } }))); }; const OverridableRecordsTableHeader = allowOverride(RecordsTableHeader, 'RecordsTableHeader'); const getBulkActionsFromRecords = records => { const actions = Object.values(records.reduce((memo, record) => ({ ...memo, ...record.bulkActions.reduce((actionsMemo, action) => ({ ...actionsMemo, [action.name]: action }), {}) }), {})); return actions; }; const SelectedRecords = props => { const { resource, selectedRecords } = props; const { translateLabel } = useTranslation(); const navigate = reactRouter.useNavigate(); const actionResponseHandler = useActionResponseHandler(); if (!selectedRecords || !selectedRecords.length) { return null; } const params = { resourceId: resource.id, recordIds: selectedRecords.map(records => records.id) }; const handleActionClick = (event, sourceAction) => buildActionClickHandler({ action: sourceAction, params, actionResponseHandler, navigate })(event); const bulkButtons = actionsToButtonGroup({ actions: getBulkActionsFromRecords(selectedRecords), params, handleClick: handleActionClick }); const contentTag = getResourceElementCss(resource.id, 'table-caption'); return /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.TableCaption, { "data-css": contentTag }, /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Box, { flex: true, py: "sm", alignItems: "center" }, /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Title, { mr: "lg" }, translateLabel('selectedRecords', resource.id, { selected: selectedRecords.length })), /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.ButtonGroup, { size: "sm", rounded: true, buttons: bulkButtons }))); }; const OverridableSelectedRecords = allowOverride(SelectedRecords, 'SelectedRecords'); /** * @alias RecordsTableProps * @memberof RecordsTable */ /** * @classdesc * Renders an entire records table. To fill the data you might need: * * - {@link useRecords} and * - {@link useSelectedRecords} hooks * * so make sure to see at the documentation pages for both of them * * @component * @class * @hideconstructor * @subcategory Application */ const RecordsTable = props => { const { resource, records, actionPerformed, sortBy, direction, isLoading, onSelect, selectedRecords, onSelectAll } = props; if (!records.length) { if (isLoading) { return /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Loader, null); } return /*#__PURE__*/React__default$1["default"].createElement(NoRecords, { resource: resource }); } const selectedAll = selectedRecords && !!records.find(record => selectedRecords.find(selected => selected.id === record.id)); const recordsHaveBulkAction = !!records.find(record => record.bulkActions.length); const contentTag = getResourceElementCss(resource.id, 'table'); const selectedTag = getResourceElementCss(resource.id, 'table-selected-records'); const bodyTag = getResourceElementCss(resource.id, 'table-body'); return /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Table, { "data-css": contentTag }, /*#__PURE__*/React__default$1["default"].createElement(OverridableSelectedRecords, { resource: resource, selectedRecords: selectedRecords, "data-css": selectedTag }), /*#__PURE__*/React__default$1["default"].createElement(OverridableRecordsTableHeader, { properties: resource.listProperties, titleProperty: resource.titleProperty, direction: direction, sortBy: sortBy, onSelectAll: recordsHaveBulkAction ? onSelectAll : undefined, selectedAll: selectedAll }), /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.TableBody, { "data-css": bodyTag }, records.map(record => /*#__PURE__*/React__default$1["default"].createElement(OverridableRecordInList, { record: record, resource: resource, key: record.id, actionPerformed: actionPerformed, isLoading: isLoading, onSelect: onSelect, isSelected: selectedRecords && !!selectedRecords.find(selected => selected.id === record.id) })))); }; const OverridableRecordsTable = allowOverride(RecordsTable, 'RecordsTable'); const List = ({ resource, setTag }) => { const { records, loading, direction, sortBy, page, total, fetchData, perPage } = useRecords(resource.id); const { selectedRecords, handleSelect, handleSelectAll, setSelectedRecords } = useSelectedRecords(records); const location = reactRouter.useLocation(); const navigate = reactRouter.useNavigate(); React$1.useEffect(() => { if (setTag) { setTag(total.toString()); } }, [total]); React$1.useEffect(() => { setSelectedRecords([]); }, [resource.id]); React$1.useEffect(() => { const search = new URLSearchParams(location.search); if (search.get(REFRESH_KEY)) { setSelectedRecords([]); } }, [location.search]); const handleActionPerformed = () => fetchData(); const handlePaginationChange = pageNumber => { const search = new URLSearchParams(location.search); search.set('page', pageNumber.toString()); navigate({ search: search.toString() }); }; const contentTag = getActionElementCss(resource.id, 'list', 'table-wrapper'); return /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Box, { variant: "white", "data-css": contentTag }, /*#__PURE__*/React__default$1["default"].createElement(OverridableRecordsTable, { resource: resource, records: records, actionPerformed: handleActionPerformed, onSelect: handleSelect, onSelectAll: handleSelectAll, selectedRecords: selectedRecords, direction: direction, sortBy: sortBy, isLoading: loading }), /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Text, { mt: "xl", textAlign: "center" }, /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Pagination, { page: page, perPage: perPage, total: total, onChange: handlePaginationChange }))); }; const OverridableList = allowOverride(List, 'DefaultListAction'); /* eslint-disable @typescript-eslint/explicit-function-return-type */ /** * NoticeMessage which can be presented as a "Toast" message. * @alias NoticeMessage * @memberof withNotice */ const mapDispatchToProps = dispatch => ({ addNotice: notice => dispatch(addNotice(notice)) }); /** * Higher Order Component which allows you to post notice messages from your components * * It gives you the additional prop: `addNotice(noticeMessage)` taking {@link NoticeMessage}. * * ```javascript * import { withNotice } from 'adminjs/core' * * const MY_MESSAGE = { * message: 'I am toast message', * type: 'success', * } * const MyCustomComponent = ({ addNotice }) => { * return ( *
addNotice(MY_MESSAGE)}>Click Me * ) * } * export default withNotice(MyCustomComponent) * ``` * * @component * @subcategory HOC */ const withNotice = Component => require$$3.connect(null, mapDispatchToProps)(Component); /** * @name BulkDeleteAction * @category Actions * @description Deletes selected records. * @component * @private */ const BulkDelete = props => { const { resource, records, action, addNotice } = props; const navigate = reactRouter.useNavigate(); const [loading, setLoading] = React$1.useState(false); const { translateMessage, translateButton } = useTranslation(); if (!records) { return /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Text, null, translateMessage('pickSomeFirstToRemove', resource.id)); } const handleClick = () => { const api = new ApiClient(); setLoading(true); const recordIds = records.map(r => r.id); api.bulkAction({ resourceId: resource.id, actionName: action.name, recordIds, method: 'post' }).then(response => { setLoading(false); if (response.data.notice) { addNotice(response.data.notice); } if (response.data.redirectUrl) { const search = new URLSearchParams(window.location.search); // bulk function have recordIds in the URL so it has to be stripped before redirect search.delete('recordIds'); navigate(appendForceRefresh(response.data.redirectUrl, search.toString())); } }).catch(error => { setLoading(false); addNotice({ message: translateMessage('bulkDeleteError', resource.id), type: 'error' }); throw error; }); }; const contentTag = getActionElementCss(resource.id, action.name, 'drawer-content'); const tableTag = getActionElementCss(resource.id, action.name, 'table'); const footerTag = getActionElementCss(resource.id, action.name, 'drawer-footer'); return /*#__PURE__*/React__default$1["default"].createElement(React__default$1["default"].Fragment, null, /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.DrawerContent, { "data-css": contentTag }, action?.showInDrawer ? /*#__PURE__*/React__default$1["default"].createElement(OverridableActionHeader, _extends$2({ omitActions: true }, props)) : null, /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.MessageBox, { mb: "xxl", variant: "danger", message: translateMessage(records.length > 1 ? 'theseRecordsWillBeRemoved_plural' : 'theseRecordsWillBeRemoved', resource.id, { count: records.length }) }), /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Table, { "data-css": tableTag }, /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.TableBody, null, records.map(record => /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.TableRow, { key: record.id }, /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.TableCell, null, /*#__PURE__*/React__default$1["default"].createElement(BasePropertyComponentExtended, { where: "list", property: resource.titleProperty, resource: resource, record: record }))))))), /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.DrawerFooter, { "data-css": footerTag }, /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Button, { variant: "primary", size: "lg", onClick: handleClick, disabled: loading }, loading ? /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Icon, { icon: "Fade", spin: true }) : null, translateButton(records.length > 1 ? 'confirmRemovalMany_plural' : 'confirmRemovalMany', resource.id, { count: records.length })))); }; const FormattedBulkDelete = withNotice(BulkDelete); const OverridableFormattedBulkDelete = allowOverride(FormattedBulkDelete, 'DefaultBulkDeleteAction'); const actions = { new: OverridableNew, edit: OverridableEdit, show: OverridableShow, list: OverridableList, bulkDelete: OverridableFormattedBulkDelete }; /* cspell: disable */ const DOCS = 'https://docs.adminjs.co'; const DEFAULT_PATHS = { rootPath: '/admin', logoutPath: '/admin/logout', loginPath: '/admin/login', }; const DEFAULT_TMP_DIR = '.adminjs'; typeof process === 'object' ? AdminJS.env.ADMIN_JS_TMP_DIR || DEFAULT_TMP_DIR : DEFAULT_TMP_DIR; /** * Component which renders all the default and custom actions for both the Resource and the Record. * * It passes all props down to the actual Action component. * * Example of creating your own actions: * ``` * // AdminJS options * const AdminJSOptions = { * resources: [ * resource, * options: { * actions: { * myNewAction: { * label: 'amazing action', * icon: 'Add', * inVisible: (resource, record) => record.param('email') !== '', * actionType: 'record', * component: 'MyNewAction', * handler: (request, response, data) => { * return { * ... * } * } * } * } * } * ] * } * ``` * * ``` * // ./my-new-action.jsx * import { Box } from 'adminjs' * * const MyNewAction = (props) => { * const { resource, action, record } = props * // do something with the props and render action * return ( * Some Action Content * ) * } * ``` * * @component * @name BaseActionComponent * @subcategory Application */ const BaseActionComponent = props => { const { resource, action, record, records, setTag } = props; const documentationLink = [DOCS, 'BaseAction.html'].join('/'); const { translateMessage } = useTranslation(); let Action = actions[action.name]; if (action.component) { Action = AdminJS.UserComponents[action.component]; } if (Action) { return /*#__PURE__*/React__default$1["default"].createElement(ErrorBoundary$1, null, /*#__PURE__*/React__default$1["default"].createElement(Action, { action: action, resource: resource, record: record, records: records, setTag: setTag })); } return Action || /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.MessageBox, { variant: "danger" }, translateMessage('noActionComponent'), /*#__PURE__*/React__default$1["default"].createElement(commonjs.Trans, { key: "messages.buttons.seeTheDocumentation" }, "See:", /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Link, { ml: "default", href: documentationLink }, "the documentation"))); }; /** * @memberof ErrorMessageBox * @alias ErrorMessageBoxProps */ /** * @class * Prints error message * * @component * @private * @example * return ( * *

Text below the title

*
* ) */ const ErrorMessageBox = props => { const { children, title, testId } = props; return /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.MessageBox, { "data-testid": testId, message: title }, /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Text, null, children)); }; const NoResourceError = props => { const { resourceId } = props; const { translateMessage } = useTranslation(); return /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.MessageBox, { message: "404 - PAGE NOT FOUND", "data-testid": "NoResourceError", variant: "info", m: "xxl" }, /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Text, null, translateMessage('error404Resource', resourceId, { resourceId }))); }; const NoActionError = props => { const { resourceId, actionName } = props; const { translateMessage } = useTranslation(); return /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.MessageBox, { message: "404 - PAGE NOT FOUND", "data-testid": "NoActionError", variant: "info", m: "xxl" }, /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Text, null, translateMessage('error404Action', resourceId, { resourceId, actionName }))); }; const NoRecordError = props => { const { resourceId, recordId } = props; const { translateMessage } = useTranslation(); return /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.MessageBox, { message: "404 - PAGE NOT FOUND", "data-testid": "NoRecordError", variant: "info", m: "xxl" }, /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Text, null, translateMessage('error404Record', resourceId, { resourceId, recordId }))); }; const StyledWrapperWithFilter = styled__default["default"](DesignSystem.Box).withConfig({ displayName: "wrapper__StyledWrapperWithFilter", componentId: "sc-1jcopgf-0" })(["& > ", "{background:", ";padding:", ";overflow:visible;}& > ", "{background:", ";padding:0 ", " ", ";}"], DesignSystem.DrawerContent, ({ theme }) => theme.colors.white, ({ theme }) => theme.space.xxl, DesignSystem.DrawerFooter, ({ theme }) => theme.colors.white, ({ theme }) => theme.space.xxl, ({ theme }) => theme.space.xxl); const StyledWrapper = styled__default["default"](DesignSystem.Box).withConfig({ displayName: "wrapper__StyledWrapper", componentId: "sc-1jcopgf-1" })(["& ", "{background:", ";padding:", ";overflow:visible;}& ", "{background:", ";padding:0 ", " ", ";}"], DesignSystem.DrawerContent, ({ theme }) => theme.colors.white, ({ theme }) => theme.space.xxl, DesignSystem.DrawerFooter, ({ theme }) => theme.colors.white, ({ theme }) => theme.space.xxl, ({ theme }) => theme.space.xxl); const Wrapper = props => { // eslint-disable-next-line @typescript-eslint/no-unused-vars const { children, variant, color, showFilter = false, ...rest } = props; const Component = showFilter ? StyledWrapperWithFilter : StyledWrapper; return /*#__PURE__*/React__default$1["default"].createElement(Component, _extends$2({}, rest, { variant: "grey", mx: "auto", "data-css": "styled-wrapper" }), children); }; var Wrapper$1 = allowOverride(Wrapper, 'RouteWrapper'); var createRoot; var m = require$$1__default["default"]; { var i = m.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED; createRoot = function(c, o) { i.usingClientEntryPoint = true; try { return m.createRoot(c, o); } finally { i.usingClientEntryPoint = false; } }; } /** * @alias DrawerPortalProps * @memberof DrawerPortal */ const DRAWER_PORTAL_ID = 'drawerPortal'; const DRAWER_PORTAL_WRAPPER_ID = 'drawerPortalWrapper'; const DrawerWrapper = ({ onMount }) => { React$1.useEffect(() => { onMount(); }, []); return /*#__PURE__*/React__default$1["default"].createElement(styled.ThemeProvider, { theme: window.THEME }, /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Drawer, { id: DRAWER_PORTAL_ID, className: "hidden", "data-css": "drawer" })); }; const getOrCreatePortalContainer = id => { let container = document.getElementById(id); if (!container) { container = window.document.createElement('div'); container.id = id; window.document.body.appendChild(container); } return container; }; /** * Shows all of its children in a Drawer on the right. * Instead of rendering it's own {@link Drawer} component it reuses * the global Drawer via React Portal. * * ### Usage * * ``` * import { DrawerPortal } from 'adminjs' * ``` * * @component * @subcategory Application */ const DrawerPortal = ({ children, width }) => { const [drawerElement, setDrawerElement] = React$1.useState(document.getElementById(DRAWER_PORTAL_ID)); const handleDrawerMount = () => { setDrawerElement(document.getElementById(DRAWER_PORTAL_ID)); }; React$1.useEffect(() => { const innerWrapperElement = getOrCreatePortalContainer(DRAWER_PORTAL_WRAPPER_ID); if (!drawerElement && window) { const drawerRoot = createRoot(innerWrapperElement); drawerRoot.render( /*#__PURE__*/React__default$1["default"].createElement(DrawerWrapper, { onMount: handleDrawerMount })); } return () => { const innerWrapper = document.getElementById(DRAWER_PORTAL_WRAPPER_ID); if (innerWrapper) document.body.removeChild(innerWrapper); }; }, []); React$1.useEffect(() => { if (drawerElement) { drawerElement.classList.remove('hidden'); if (width) { drawerElement.style.width = Array.isArray(width) ? width[0].toString() : width.toString(); } return () => { drawerElement.style.width = DesignSystem.DEFAULT_DRAWER_WIDTH; drawerElement.classList.add('hidden'); drawerElement.setAttribute('data-css', 'drawer-element'); }; } return () => undefined; }, [drawerElement]); if (!drawerElement) { return null; } return /*#__PURE__*/require$$1.createPortal(children, drawerElement); }; const parseQuery = location => { const filter = {}; const query = new URLSearchParams(location.search); for (const entry of query.entries()) { const [key, value] = entry; if (key.match('filters.')) { filter[key.replace('filters.', '')] = value; } } return filter; }; const FilterDrawer = props => { const { resource, isVisible, toggleFilter } = props; const properties = resource.filterProperties; const location = reactRouterDom.useLocation(); const [filter, setFilter] = React$1.useState(parseQuery(location)); const params = reactRouterDom.useParams(); const navigate = reactRouterDom.useNavigate(); const { translateLabel, translateButton } = useTranslation(); const initialLoad = React$1.useRef(true); React$1.useEffect(() => { if (initialLoad.current) { initialLoad.current = false; } else { setFilter({}); } }, [params.resourceId]); const handleSubmit = event => { event.preventDefault(); const search = new URLSearchParams(window.location.search); Object.keys(filter).forEach(key => { if (filter[key] !== '') { search.set(`filters.${key}`, filter[key]); } else { search.delete(`filters.${key}`); } }); toggleFilter(); search.set('page', '1'); navigate(`${location.pathname}?${search.toString()}`); return false; }; const resetFilter = event => { event.preventDefault(); const filteredSearch = new URLSearchParams(); const search = new URLSearchParams(window.location.search); for (const key of search.keys()) { if (!key.match('filters.')) { filteredSearch.set(key, search.get(key)); } } const query = filteredSearch.toString() === '' ? `?${filteredSearch.toString()}` : ''; toggleFilter(); navigate(location.pathname + query); setFilter({}); }; const handleChange = (propertyName, value) => { if (propertyName.params) { throw new Error('you can not pass RecordJSON to filters'); } setFilter({ ...filter, [propertyName]: value }); }; const contentTag = getResourceElementCss(params.resourceId, 'filter-drawer'); const cssContent = getResourceElementCss(params.resourceId, 'filter-drawer-content'); const cssFooter = getResourceElementCss(params.resourceId, 'filter-drawer-footer'); const cssButtonApply = getResourceElementCss(params.resourceId, 'filter-drawer-button-apply'); const cssButtonReset = getResourceElementCss(params.resourceId, 'filter-drawer-button-reset'); return /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Drawer, { variant: "filter", isHidden: !isVisible, as: "form", onSubmit: handleSubmit, "data-css": contentTag }, /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.DrawerContent, { "data-css": cssContent }, /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.H3, null, /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Button, { type: "button", size: "icon", rounded: true, mr: "lg", onClick: () => toggleFilter() }, /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Icon, { icon: "ChevronRight", color: "white" })), translateLabel('filters', resource.id)), /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Box, { my: "x3" }, properties.map(property => /*#__PURE__*/React__default$1["default"].createElement(BasePropertyComponentExtended, { key: property.propertyPath, where: "filter", onChange: handleChange, property: property, filter: filter, resource: resource })))), /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.DrawerFooter, { "data-css": cssFooter }, /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Button, { variant: "primary", size: "lg", "data-css": cssButtonApply }, translateButton('applyChanges', resource.id)), /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Button, { variant: "text", size: "lg", onClick: resetFilter, type: "button", color: "white", "data-css": cssButtonReset }, translateButton('resetFilter', resource.id)))); }; const OverridableFilterDrawer = allowOverride(FilterDrawer, 'FilterDrawer'); var AppComponents = /*#__PURE__*/Object.freeze({ __proto__: null, SortLink: SortLink$1, NoRecords: NoRecords, PropertyHeader: OverridablePropertyHeader, RecordInList: OverridableRecordInList, RecordsTableHeader: OverridableRecordsTableHeader, RecordsTable: OverridableRecordsTable, SelectedRecords: OverridableSelectedRecords, SidebarResourceSection: SidebarResourceSection, Sidebar: Sidebar, ActionButton: OverridableActionButton, ActionHeader: OverridableActionHeader, BaseActionComponent: BaseActionComponent, BreadcrumbLink: BreadcrumbLink, BreadcrumbText: BreadcrumbText, Breadcrumbs: OverridableBreadcrumbs, DashboardHeader: DashboardHeader, Dashboard: Dashboard$1, ErrorBoundary: ErrorBoundary$1, DrawerPortal: DrawerPortal, NoResourceError: NoResourceError, NoActionError: NoActionError, NoRecordError: NoRecordError, ErrorMessageBox: ErrorMessageBox, FilterDrawer: OverridableFilterDrawer, LoggedIn: OverridableLoggedIn, NoticeElement: NoticeElement, NoticeBox: OverridableConnectedNoticeBox, TopBar: OverridableTopbar, Version: OverridableVersion }); const api$1 = new ApiClient(); const RecordAction = () => { const [record, setRecord] = React$1.useState(); const [loading, setLoading] = React$1.useState(true); const params = reactRouter.useParams(); const addNotice = useNotice(); const { translateMessage } = useTranslation(); const { actionName, recordId, resourceId } = params; const resource = useResource(resourceId); const action = record && record.recordActions.find(r => r.name === actionName); const fetchRecord = () => { setLoading(true); api$1.recordAction(params).then(response => { if (response.data.notice && response.data.notice.type === 'error') { addNotice(response.data.notice); } if (!response.data.record?.baseError?.type || ![ErrorTypeEnum.App, ErrorTypeEnum.NotFound, ErrorTypeEnum.Forbidden].includes(response.data.record?.baseError?.type)) { setRecord(response.data.record); } }).catch(error => { addNotice({ message: translateMessage('errorFetchingRecord', resourceId), type: 'error' }); throw error; }).finally(() => { setLoading(false); }); }; React$1.useEffect(() => { fetchRecord(); }, [actionName, recordId, resourceId]); const handleActionPerformed = React$1.useCallback((oldRecord, response) => { if (response.record) { setRecord(mergeRecordResponse(oldRecord, response)); } else { fetchRecord(); } }, [fetchRecord]); if (!resource) { return /*#__PURE__*/React__default$1["default"].createElement(NoResourceError, { resourceId: resourceId }); } // When the user visits this route (record action) from a different, than the current one, record. // It renders everything with a new resource. The old record remains until useEffect fetches data // from the API. that is why we have to check if the current record has correct record.id. // Alternative approach would be to setRecord(undefined) before the fetch, but it is async and // we cannot be sure that the component wont be rendered (it will be at least once) with the // wrong data. const hasDifferentRecord = record && record.id && record.id.toString() !== recordId; if (loading || hasDifferentRecord) { const actionFromResource = resource.actions.find(r => r.name === actionName); return actionFromResource?.showInDrawer ? /*#__PURE__*/React__default$1["default"].createElement(DrawerPortal, null, /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Loader, null)) : /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Loader, null); } if (!action) { return /*#__PURE__*/React__default$1["default"].createElement(NoActionError, { resourceId: resourceId, actionName: actionName }); } if (!record) { return /*#__PURE__*/React__default$1["default"].createElement(NoRecordError, { resourceId: resourceId, recordId: recordId }); } if (action.showInDrawer) { return /*#__PURE__*/React__default$1["default"].createElement(DrawerPortal, { width: action.containerWidth }, /*#__PURE__*/React__default$1["default"].createElement(BaseActionComponent, { action: action, resource: resource, record: record })); } return /*#__PURE__*/React__default$1["default"].createElement(Wrapper$1, { width: action.containerWidth }, /*#__PURE__*/React__default$1["default"].createElement(OverridableActionHeader, { resource: resource, action: action, record: record, actionPerformed: response => handleActionPerformed(record, response) }), /*#__PURE__*/React__default$1["default"].createElement(BaseActionComponent, { action: action, resource: resource, record: record })); }; var RecordActionRoute = allowOverride(RecordAction, 'RecordActionRoute'); const ResourceAction$1 = props => { const params = reactRouter.useParams(); const { resources } = props; const { resourceId, actionName } = params; const [filterVisible, setFilterVisible] = React$1.useState(false); const [tag, setTag] = React$1.useState(''); const resource = resources.find(r => r.id === resourceId); if (!resource) { return /*#__PURE__*/React__default$1["default"].createElement(NoResourceError, { resourceId: resourceId }); } const action = resource.resourceActions.find(r => r.name === actionName); if (!action) { return /*#__PURE__*/React__default$1["default"].createElement(NoActionError, { resourceId: resourceId, actionName: actionName }); } const toggleFilter = action.showFilter ? () => setFilterVisible(!filterVisible) : undefined; if (action.showInDrawer) { return /*#__PURE__*/React__default$1["default"].createElement(DrawerPortal, { width: action.containerWidth }, /*#__PURE__*/React__default$1["default"].createElement(BaseActionComponent, { action: action, resource: resource })); } return /*#__PURE__*/React__default$1["default"].createElement(Wrapper$1, { width: action.containerWidth, showFilter: action.showFilter }, /*#__PURE__*/React__default$1["default"].createElement(OverridableActionHeader, { resource: resource, action: action, toggleFilter: toggleFilter, tag: tag }), /*#__PURE__*/React__default$1["default"].createElement(BaseActionComponent, { action: action, resource: resource, setTag: setTag }), action.showFilter ? /*#__PURE__*/React__default$1["default"].createElement(OverridableFilterDrawer, { key: filterVisible.toString(), resource: resource, isVisible: filterVisible, toggleFilter: toggleFilter }) : ''); }; const mapStateToProps$1 = state => ({ resources: state.resources }); var ResourceActionRoute = allowOverride(require$$3.connect(mapStateToProps$1)(ResourceAction$1), 'ResourceActionRoute'); const api = new ApiClient(); const BulkAction = () => { const params = reactRouter.useParams(); const [records, setRecords] = React$1.useState([]); const [loading, setLoading] = React$1.useState(false); const { translateMessage } = useTranslation(); const addNotice = useNotice(); const location = reactRouter.useLocation(); const { resourceId, actionName } = params; const resource = useResource(resourceId); const fetchRecords = () => { const recordIdsString = new URLSearchParams(location.search).get('recordIds'); const recordIds = recordIdsString ? recordIdsString.split(',') : []; setLoading(true); return api.bulkAction({ resourceId: resourceId, recordIds, actionName: actionName }).then(response => { setLoading(false); setRecords(response.data.records); }).catch(error => { setLoading(false); addNotice({ message: translateMessage('errorFetchingRecords', resourceId), type: 'error' }); throw error; }); }; React$1.useEffect(() => { fetchRecords(); }, [params.resourceId, params.actionName]); if (!resource) { return /*#__PURE__*/React__default$1["default"].createElement(NoResourceError, { resourceId: resourceId }); } if (!records && !loading) { return /*#__PURE__*/React__default$1["default"].createElement(ErrorMessageBox, { title: "No records" }, /*#__PURE__*/React__default$1["default"].createElement("p", null, translateMessage('noRecordsSelected', resourceId))); } const action = getBulkActionsFromRecords(records || []).find(r => r.name === actionName); if (loading) { const actionFromResource = resource.actions.find(r => r.name === actionName); return actionFromResource?.showInDrawer ? /*#__PURE__*/React__default$1["default"].createElement(DrawerPortal, null, /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Loader, null)) : /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Loader, null); } if (!action) { return /*#__PURE__*/React__default$1["default"].createElement(NoActionError, { resourceId: resourceId, actionName: actionName }); } if (action.showInDrawer) { return /*#__PURE__*/React__default$1["default"].createElement(DrawerPortal, { width: action.containerWidth }, /*#__PURE__*/React__default$1["default"].createElement(BaseActionComponent, { action: action, resource: resource, records: records })); } return /*#__PURE__*/React__default$1["default"].createElement(Wrapper$1, { width: action.containerWidth }, !action?.showInDrawer ? /*#__PURE__*/React__default$1["default"].createElement(OverridableActionHeader, { resource: resource, action: action }) : '', /*#__PURE__*/React__default$1["default"].createElement(BaseActionComponent, { action: action, resource: resource, records: records })); }; var BulkActionRoute = allowOverride(BulkAction, 'BulkActionRoute'); const Page = () => { const [pages] = require$$3.useSelector(state => [state.pages]); const params = reactRouter.useParams(); const { pageName } = params; const [isClient, setIsClient] = React$1.useState(false); const currentPage = pages.find(page => page.name === pageName); React$1.useEffect(() => { setIsClient(true); }, []); if (!currentPage) { return /*#__PURE__*/React__default$1["default"].createElement(ErrorMessageBox, { title: "There is no page of given name" }, /*#__PURE__*/React__default$1["default"].createElement("p", null, "Page:", /*#__PURE__*/React__default$1["default"].createElement("b", null, ` "${pageName}" `), "does not exist.")); } const Component = AdminJS.UserComponents[currentPage.component]; if (!Component || !isClient) { return /*#__PURE__*/React__default$1["default"].createElement(ErrorMessageBox, { title: "No component specified" }, /*#__PURE__*/React__default$1["default"].createElement("p", null, "You have to specify component which will render this Page")); } return /*#__PURE__*/React__default$1["default"].createElement(ErrorBoundary$1, null, /*#__PURE__*/React__default$1["default"].createElement(Component, null)); }; var PageRoute = allowOverride(Page, 'PageRoute'); const getAction = resource => { const h = new ViewHelpers(); const resourceId = ':resourceId'; const actionName = ':actionName'; const recordId = ':recordId'; const recordActionUrl = h.recordActionUrl({ resourceId, recordId, actionName }); const resourceActionUrl = h.resourceActionUrl({ resourceId, actionName }); const bulkActionUrl = h.bulkActionUrl({ resourceId, actionName }); const resourceActionMatch = reactRouter.useMatch(resourceActionUrl); const recordActionMatch = reactRouter.useMatch(recordActionUrl); const bulkActionMatch = reactRouter.useMatch(bulkActionUrl); const action = resourceActionMatch?.params.actionName || recordActionMatch?.params.actionName || bulkActionMatch?.params.actionName; return action ? resource.actions.find(a => a.name === action) : undefined; }; const ResourceAction = props => { const params = reactRouter.useParams(); const { resources } = props; const { resourceId } = params; const [filterVisible, setFilterVisible] = React$1.useState(false); const [tag, setTag] = React$1.useState(''); if (!resourceId) { return null; } const resource = resources.find(r => r.id === resourceId); if (!resource) { return /*#__PURE__*/React__default$1["default"].createElement(NoResourceError, { resourceId: resourceId }); } const realEndAction = getAction(resource); if (realEndAction && !realEndAction.showInDrawer) { return null; } const listActionName = 'list'; const listAction = resource.resourceActions.find(r => r.name === listActionName); if (!listAction) { return /*#__PURE__*/React__default$1["default"].createElement(NoActionError, { resourceId: resourceId, actionName: listActionName }); } const toggleFilter = listAction.showFilter ? () => setFilterVisible(!filterVisible) : undefined; const contentTag = getResourceElementCss(resource.id, 'list'); return /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Box, { variant: "grey", width: listAction.containerWidth, mx: "auto", "data-css": contentTag }, /*#__PURE__*/React__default$1["default"].createElement(OverridableActionHeader, { resource: resource, action: listAction, tag: tag, toggleFilter: toggleFilter }), /*#__PURE__*/React__default$1["default"].createElement(BaseActionComponent, { action: listAction, resource: resource, setTag: setTag }), listAction.showFilter ? /*#__PURE__*/React__default$1["default"].createElement(OverridableFilterDrawer, { key: filterVisible.toString(), resource: resource, isVisible: filterVisible, toggleFilter: () => { setFilterVisible(!filterVisible); } }) : ''); }; const mapStateToProps = state => ({ resources: state.resources }); var ResourceRoute = allowOverride(require$$3.connect(mapStateToProps)(ResourceAction), 'ResourceRoute'); /* eslint-disable react/no-children-prop */ const GlobalStyle = styled.createGlobalStyle(["html,body,#app{margin:0;padding:0;width:100%;height:100%;color:", "}"], ({ theme }) => theme.colors.grey100); const h = new ViewHelpers(); const App = () => { const [sidebarVisible, toggleSidebar] = React$1.useState(false); const location = reactRouter.useLocation(); useHistoryListen(); React$1.useEffect(() => { if (sidebarVisible) { toggleSidebar(false); } }, [location]); const resourceId = ':resourceId'; const actionName = ':actionName'; const recordId = ':recordId'; const pageName = ':pageName'; const dashboardUrl = h.dashboardUrl(); const recordActionUrl = h.recordActionUrl({ resourceId, recordId, actionName }); const resourceActionUrl = h.resourceActionUrl({ resourceId, actionName }); const bulkActionUrl = h.bulkActionUrl({ resourceId, actionName }); const resourceUrl = h.resourceUrl({ resourceId }); const pageUrl = h.pageUrl(pageName); /** * When defining AdminJS routes, we use Routes component twice. * This results in warnings appearing in console, for example about not being able to locate * "/admin" route. They can be safely ignored though and should appear only * in development environment. The warnings originate from the difference between * "Switch" component that AdminJS had used in "react-router" v5 which was later replaced * with "Routes" in "react-router" v6. "Switch" would use the first "Route" component * that matched the provided path, while "Routes" searches for the best matching pattern. * In AdminJS we use "DrawerPortal" to display actions in a drawer when * "showInDrawer" option is set to true. The drawer should appear above the currently viewed * page, but "Routes" broke this behavior because it instead showed a record action route with * an empty background. * The current flow is that first "Routes" component includes "Resource" route component * for drawer-placed actions and the second "Routes" is entered for record actions * on a separate page. */ return /*#__PURE__*/React__default$1["default"].createElement(React__default$1["default"].Fragment, null, /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Reset, null), /*#__PURE__*/React__default$1["default"].createElement(GlobalStyle, null), /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Box, { height: "100%", flex: true, "data-css": "app" }, sidebarVisible ? /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Overlay, { onClick: () => toggleSidebar(!sidebarVisible) }) : null, /*#__PURE__*/React__default$1["default"].createElement(Sidebar, { isVisible: sidebarVisible, "data-css": "sidebar" }), /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Box, { flex: true, flexGrow: 1, flexDirection: "column", overflowY: "auto", bg: "bg", "data-css": "app-content" }, /*#__PURE__*/React__default$1["default"].createElement(OverridableTopbar, { toggleSidebar: () => toggleSidebar(!sidebarVisible) }), /*#__PURE__*/React__default$1["default"].createElement(DesignSystem.Box, { position: "absolute", top: 0, zIndex: 2000, "data-css": "notice" }, /*#__PURE__*/React__default$1["default"].createElement(OverridableConnectedNoticeBox, null)), /*#__PURE__*/React__default$1["default"].createElement(reactRouterDom.Routes, null, /*#__PURE__*/React__default$1["default"].createElement(reactRouterDom.Route, { path: `${resourceUrl}/*`, element: /*#__PURE__*/React__default$1["default"].createElement(ResourceRoute, null) }), /*#__PURE__*/React__default$1["default"].createElement(reactRouterDom.Route, { path: pageUrl, element: /*#__PURE__*/React__default$1["default"].createElement(PageRoute, null) }), /*#__PURE__*/React__default$1["default"].createElement(reactRouterDom.Route, { path: dashboardUrl, element: /*#__PURE__*/React__default$1["default"].createElement(DashboardRoute, null) })), /*#__PURE__*/React__default$1["default"].createElement(reactRouterDom.Routes, null, /*#__PURE__*/React__default$1["default"].createElement(reactRouterDom.Route, { path: `${resourceActionUrl}/*`, element: /*#__PURE__*/React__default$1["default"].createElement(ResourceActionRoute, null) }), /*#__PURE__*/React__default$1["default"].createElement(reactRouterDom.Route, { path: `${bulkActionUrl}/*`, element: /*#__PURE__*/React__default$1["default"].createElement(BulkActionRoute, null) }), /*#__PURE__*/React__default$1["default"].createElement(reactRouterDom.Route, { path: `${recordActionUrl}/*`, element: /*#__PURE__*/React__default$1["default"].createElement(RecordActionRoute, null) }))))); }; var App$1 = allowOverride(App, 'Application'); const ASSETS_INITIALIZE = 'ASSETS_INITIALIZE'; const BRANDING_INITIALIZE = 'BRANDING_INITIALIZE'; const DASHBOARD_INITIALIZE = 'DASHBOARD_INITIALIZE'; const LOCALE_INITIALIZE = 'LOCALE_INITIALIZE'; const PAGES_INITIALIZE = 'PAGES_INITIALIZE'; const PATHS_INITIALIZE = 'PATHS_INITIALIZE'; const RESOURCES_INITIALIZE = 'RESOURCES_INITIALIZE'; const VERSIONS_INITIALIZE = 'VERSIONS_INITIALIZE'; /* eslint-disable @typescript-eslint/explicit-function-return-type */ const resourcesReducer = (state = [], action) => { switch (action.type) { case RESOURCES_INITIALIZE: return action.data; default: return state; } }; const pagesReducer = (state = [], action) => { switch (action.type) { case PAGES_INITIALIZE: return action.data; default: return state; } }; const localesReducer = (state = { language: 'en', translations: {} }, action) => { switch (action.type) { case LOCALE_INITIALIZE: return action.data; default: return state; } }; const brandingReducer = (state = {}, action) => { switch (action.type) { case BRANDING_INITIALIZE: return action.data; default: return state; } }; const assetsReducer = (state = {}, action) => { switch (action.type) { case ASSETS_INITIALIZE: return action.data; default: return state; } }; const pathsReducer = (state = DEFAULT_PATHS, action) => { switch (action.type) { case PATHS_INITIALIZE: return action.data; default: return state; } }; const dashboardReducer = (state = {}, action) => { switch (action.type) { case DASHBOARD_INITIALIZE: return action.data; default: return state; } }; const sessionReducer = (state = null, action) => { switch (action.type) { case SESSION_INITIALIZE: return action.data; default: return state; } }; const versionsReducer = (state = {}, action) => { switch (action.type) { case VERSIONS_INITIALIZE: return { admin: action.data.admin, app: action.data.app }; default: return state; } }; const routerReducer = (state = { from: {}, to: {} }, action) => { switch (action.type) { case INITIAL_ROUTE: return { ...state, from: { ...action.data } }; case ROUTE_CHANGED: return { from: { ...state.to }, to: { ...action.data } }; default: return state; } }; const noticesReducer = (state = [], action) => { switch (action.type) { case ADD_NOTICE: { const notices = [action.data]; return notices; } case DROP_NOTICE: { return state.filter(notice => notice.id !== action.data.noticeId); } case SET_NOTICE_PROGRESS: { return state.map(notice => ({ ...notice, progress: notice.id === action.data.noticeId ? action.data.progress : notice.progress })); } default: return state; } }; const reducer = require$$2.combineReducers({ resources: resourcesReducer, branding: brandingReducer, assets: assetsReducer, paths: pathsReducer, session: sessionReducer, dashboard: dashboardReducer, notices: noticesReducer, versions: versionsReducer, pages: pagesReducer, locale: localesReducer, router: routerReducer }); var createStore = ((initialState = {}) => require$$2.legacy_createStore(reducer, initialState)); const env = { NODE_ENV: "development" }; const store = createStore(window.REDUX_STATE); const theme = window.THEME; const { locale } = window.REDUX_STATE; instance.use(commonjs.initReactI18next).init({ resources: { [locale.language]: { translation: locale.translations } }, lng: locale.language, interpolation: { escapeValue: false } }); const Application = /*#__PURE__*/React__default$1["default"].createElement(require$$3.Provider, { store: store }, /*#__PURE__*/React__default$1["default"].createElement(styled.ThemeProvider, { theme: theme }, /*#__PURE__*/React__default$1["default"].createElement(reactRouterDom.BrowserRouter, null, /*#__PURE__*/React__default$1["default"].createElement(App$1, null)))); // eslint-disable-next-line no-undef window.regeneratorRuntime = regenerator; var bundleEntry = { withNotice, Application, ViewHelpers, UserComponents: {}, ApiClient, BasePropertyComponent: BasePropertyComponentExtended, CleanPropertyComponent, env, ...AppComponents, ...Hooks, flat }; return bundleEntry; })(React, ReactRedux, ReactRouterDOM, styled, AdminJSDesignSystem, ReactRouter, ReactDOM, Redux); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLWJ1bmRsZS5kZXZlbG9wbWVudC5qcyIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvdHlwZW9mLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvcmVnZW5lcmF0b3JSdW50aW1lLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL3JlZ2VuZXJhdG9yL2luZGV4LmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0LmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZS5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHkuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvdm9pZC1lbGVtZW50cy9pbmRleC5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9odG1sLXBhcnNlLXN0cmluZ2lmeS9kaXN0L2h0bWwtcGFyc2Utc3RyaW5naWZ5LmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2suanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVDbGFzcy5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9yZWFjdC1pMThuZXh0L2Rpc3QvY29tbW9uanMvdW5lc2NhcGUuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvcmVhY3QtaTE4bmV4dC9kaXN0L2NvbW1vbmpzL2NvbnRleHQuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvcmVhY3QtaTE4bmV4dC9kaXN0L2NvbW1vbmpzL3V0aWxzLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3JlYWN0LWkxOG5leHQvZGlzdC9jb21tb25qcy9UcmFucy5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2FycmF5V2l0aEhvbGVzLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvaXRlcmFibGVUb0FycmF5TGltaXQuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hcnJheUxpa2VUb0FycmF5LmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9ub25JdGVyYWJsZVJlc3QuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9zbGljZWRUb0FycmF5LmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3JlYWN0LWkxOG5leHQvZGlzdC9jb21tb25qcy91c2VUcmFuc2xhdGlvbi5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9yZWFjdC1pMThuZXh0L2Rpc3QvY29tbW9uanMvd2l0aFRyYW5zbGF0aW9uLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3JlYWN0LWkxOG5leHQvZGlzdC9jb21tb25qcy9UcmFuc2xhdGlvbi5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9yZWFjdC1pMThuZXh0L2Rpc3QvY29tbW9uanMvSTE4bmV4dFByb3ZpZGVyLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3JlYWN0LWkxOG5leHQvZGlzdC9jb21tb25qcy91c2VTU1IuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvcmVhY3QtaTE4bmV4dC9kaXN0L2NvbW1vbmpzL3dpdGhTU1IuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvcmVhY3QtaTE4bmV4dC9kaXN0L2NvbW1vbmpzL2luZGV4LmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3R5cGVvZi5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jbGFzc0NhbGxDaGVjay5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jcmVhdGVDbGFzcy5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2V0UHJvdG90eXBlT2YuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vaW5oZXJpdHMuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vcG9zc2libGVDb25zdHJ1Y3RvclJldHVybi5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9nZXRQcm90b3R5cGVPZi5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eS5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9hcnJheVdpdGhIb2xlcy5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9pdGVyYWJsZVRvQXJyYXkuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vYXJyYXlMaWtlVG9BcnJheS5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheS5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9ub25JdGVyYWJsZVJlc3QuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdG9BcnJheS5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9pMThuZXh0L2Rpc3QvZXNtL2kxOG5leHQuanMiLCIuLi8uLi8uLi9iYWNrZW5kL3V0aWxzL3ZpZXctaGVscGVycy92aWV3LWhlbHBlcnMudHMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kcy5qcyIsIi4uLy4uL2hvYy9hbGxvdy1vdmVycmlkZS50c3giLCIuLi8uLi9jb21wb25lbnRzL2FwcC9zaWRlYmFyL3NpZGViYXItYnJhbmRpbmcudHN4IiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYXJyYXlSZWR1Y2UuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlUHJvcGVydHlPZi5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2RlYnVyckxldHRlci5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2ZyZWVHbG9iYWwuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvbG9kYXNoL19yb290LmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fU3ltYm9sLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYXJyYXlNYXAuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzQXJyYXkuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvbG9kYXNoL19nZXRSYXdUYWcuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvbG9kYXNoL19vYmplY3RUb1N0cmluZy5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VHZXRUYWcuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzT2JqZWN0TGlrZS5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNTeW1ib2wuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlVG9TdHJpbmcuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvbG9kYXNoL3RvU3RyaW5nLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2xvZGFzaC9kZWJ1cnIuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvbG9kYXNoL19hc2NpaVdvcmRzLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2xvZGFzaC9faGFzVW5pY29kZVdvcmQuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvbG9kYXNoL191bmljb2RlV29yZHMuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvbG9kYXNoL3dvcmRzLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fY3JlYXRlQ29tcG91bmRlci5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VTbGljZS5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Nhc3RTbGljZS5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2hhc1VuaWNvZGUuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvbG9kYXNoL19hc2NpaVRvQXJyYXkuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvbG9kYXNoL191bmljb2RlVG9BcnJheS5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX3N0cmluZ1RvQXJyYXkuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvbG9kYXNoL19jcmVhdGVDYXNlRmlyc3QuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvbG9kYXNoL3VwcGVyRmlyc3QuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvbG9kYXNoL3N0YXJ0Q2FzZS5qcyIsIi4uLy4uLy4uL3V0aWxzL3RyYW5zbGF0ZS1mdW5jdGlvbnMuZmFjdG9yeS50cyIsIi4uLy4uL2hvb2tzL3VzZS10cmFuc2xhdGlvbi50cyIsIi4uLy4uL2NvbXBvbmVudHMvYXBwL3NpZGViYXIvc2lkZWJhci1wYWdlcy50c3giLCIuLi8uLi9jb21wb25lbnRzL2FwcC9zaWRlYmFyL3NpZGViYXItZm9vdGVyLnRzeCIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9iaW5kLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi91dGlscy5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9idWlsZFVSTC5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvY29yZS9JbnRlcmNlcHRvck1hbmFnZXIuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvbm9ybWFsaXplSGVhZGVyTmFtZS5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvY29yZS9BeGlvc0Vycm9yLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9kZWZhdWx0cy90cmFuc2l0aW9uYWwuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvdG9Gb3JtRGF0YS5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvY29yZS9zZXR0bGUuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvY29va2llcy5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9pc0Fic29sdXRlVVJMLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL2NvbWJpbmVVUkxzLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9jb3JlL2J1aWxkRnVsbFBhdGguanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvcGFyc2VIZWFkZXJzLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL2lzVVJMU2FtZU9yaWdpbi5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvY2FuY2VsL0NhbmNlbGVkRXJyb3IuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvcGFyc2VQcm90b2NvbC5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvYWRhcHRlcnMveGhyLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL251bGwuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2RlZmF1bHRzL2luZGV4LmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9jb3JlL3RyYW5zZm9ybURhdGEuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NhbmNlbC9pc0NhbmNlbC5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvY29yZS9kaXNwYXRjaFJlcXVlc3QuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvbWVyZ2VDb25maWcuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2Vudi9kYXRhLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL3ZhbGlkYXRvci5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvY29yZS9BeGlvcy5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvY2FuY2VsL0NhbmNlbFRva2VuLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL3NwcmVhZC5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9pc0F4aW9zRXJyb3IuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2F4aW9zLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2F4aW9zL2luZGV4LmpzIiwiLi4vLi4vdXRpbHMvYXBpLWNsaWVudC50cyIsIi4uLy4uL2hvb2tzL3VzZS1yZWNvcmQvcGFyYW1zLXRvLWZvcm0tZGF0YS50cyIsIi4uLy4uL3N0b3JlL2FjdGlvbnMvYWRkLW5vdGljZS50cyIsIi4uLy4uL2hvb2tzL3VzZS1ub3RpY2UudHMiLCIuLi8uLi9ob29rcy91c2UtcmVjb3JkL21lcmdlLXJlY29yZC1yZXNwb25zZS50cyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9pcy1idWZmZXIvaW5kZXguanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvZmxhdC9pbmRleC5qcyIsIi4uLy4uLy4uL3V0aWxzL2ZsYXQvY29uc3RhbnRzLnRzIiwiLi4vLi4vLi4vdXRpbHMvZmxhdC9wcm9wZXJ0eS1rZXktcmVnZXgudHMiLCIuLi8uLi8uLi91dGlscy9mbGF0L3NlbGVjdC1wYXJhbXMudHMiLCIuLi8uLi8uLi91dGlscy9mbGF0L2ZpbHRlci1vdXQtcGFyYW1zLnRzIiwiLi4vLi4vLi4vdXRpbHMvZmxhdC9wYXRoLXRvLXBhcnRzLnRzIiwiLi4vLi4vLi4vdXRpbHMvZmxhdC9zZXQudHMiLCIuLi8uLi8uLi91dGlscy9mbGF0L2dldC50cyIsIi4uLy4uLy4uL3V0aWxzL2ZsYXQvbWVyZ2UudHMiLCIuLi8uLi8uLi91dGlscy9mbGF0L3JlbW92ZS1wYXRoLnRzIiwiLi4vLi4vLi4vdXRpbHMvZmxhdC9mbGF0LW1vZHVsZS50cyIsIi4uLy4uL2hvb2tzL3VzZS1yZWNvcmQvdXBkYXRlLXJlY29yZC50cyIsIi4uLy4uL2hvb2tzL3VzZS1yZWNvcmQvaXMtZW50aXJlLXJlY29yZC1naXZlbi50cyIsIi4uLy4uLy4uL3V0aWxzL2Vycm9yLXR5cGUuZW51bS50cyIsIi4uLy4uL2hvb2tzL3VzZS1yZWNvcmQvZmlsdGVyLXJlY29yZC50cyIsIi4uLy4uL2hvb2tzL3VzZS1yZWNvcmQvdXNlLXJlY29yZC50c3giLCIuLi8uLi9pbnRlcmZhY2VzL2FjdGlvbi9hY3Rpb24taGFzLWNvbXBvbmVudC50cyIsIi4uLy4uL2ludGVyZmFjZXMvYWN0aW9uL2FjdGlvbi1ocmVmLnRzIiwiLi4vLi4vdXRpbHMvZGF0YS1jc3MtbmFtZS50cyIsIi4uLy4uL2ludGVyZmFjZXMvYWN0aW9uL2NhbGwtYWN0aW9uLWFwaS50cyIsIi4uLy4uL2ludGVyZmFjZXMvYWN0aW9uL2J1aWxkLWFjdGlvbi1hcGktY2FsbC10cmlnZ2VyLnRzIiwiLi4vLi4vaW50ZXJmYWNlcy9hY3Rpb24vYnVpbGQtYWN0aW9uLXRlc3QtaWQudHMiLCIuLi8uLi9pbnRlcmZhY2VzL2FjdGlvbi9idWlsZC1hY3Rpb24tY2xpY2staGFuZGxlci50cyIsIi4uLy4uL2NvbXBvbmVudHMvYWN0aW9ucy91dGlscy9hcHBlbmQtZm9yY2UtcmVmcmVzaC50cyIsIi4uLy4uL2hvb2tzL3VzZS1hY3Rpb24vdXNlLWFjdGlvbi1yZXNwb25zZS1oYW5kbGVyLnRzIiwiLi4vLi4vaG9va3MvdXNlLWFjdGlvbi91c2UtYWN0aW9uLnRzIiwiLi4vLi4vc3RvcmUvYWN0aW9ucy9zZXQtY3VycmVudC1hZG1pbi50cyIsIi4uLy4uL2hvb2tzL3VzZS1jdXJyZW50LWFkbWluLnRzIiwiLi4vLi4vaG9va3MvdXNlLWxvY2FsLXN0b3JhZ2UvdXNlLWxvY2FsLXN0b3JhZ2UudHMiLCIuLi8uLi9ob29rcy91c2UtbmF2aWdhdGlvbi1yZXNvdXJjZXMudHMiLCIuLi8uLi9ob29rcy91c2UtcmVjb3Jkcy91c2UtcmVjb3Jkcy50cyIsIi4uLy4uL2hvb2tzL3VzZS1zZWxlY3RlZC1yZWNvcmRzL3VzZS1zZWxlY3RlZC1yZWNvcmRzLnRzIiwiLi4vLi4vaG9va3MvdXNlLXJlc291cmNlL3VzZS1yZXNvdXJjZS50cyIsIi4uLy4uL3N0b3JlL2FjdGlvbnMvcm91dGUtY2hhbmdlZC50cyIsIi4uLy4uL2hvb2tzL3VzZS1oaXN0b3J5LWxpc3Rlbi50cyIsIi4uLy4uL2NvbXBvbmVudHMvYXBwL3NpZGViYXIvc2lkZWJhci1yZXNvdXJjZS1zZWN0aW9uLnRzeCIsIi4uLy4uL2NvbXBvbmVudHMvYXBwL3NpZGViYXIvc2lkZWJhci50c3giLCIuLi8uLi9jb21wb25lbnRzL2FwcC9sb2dnZWQtaW4udHN4IiwiLi4vLi4vY29tcG9uZW50cy9hcHAvdmVyc2lvbi50c3giLCIuLi8uLi9jb21wb25lbnRzL2FwcC90b3AtYmFyLnRzeCIsIi4uLy4uL3N0b3JlL2FjdGlvbnMvZHJvcC1ub3RpY2UudHMiLCIuLi8uLi9zdG9yZS9hY3Rpb25zL3NldC1ub3RpY2UtcHJvZ3Jlc3MudHMiLCIuLi8uLi9jb21wb25lbnRzL2FwcC9ub3RpY2UudHN4IiwiLi4vLi4vY29tcG9uZW50cy9hcHAvZGVmYXVsdC1kYXNoYm9hcmQudHN4IiwiLi4vLi4vY29tcG9uZW50cy9hcHAvZXJyb3ItYm91bmRhcnkudHN4IiwiLi4vLi4vY29tcG9uZW50cy9yb3V0ZXMvZGFzaGJvYXJkLnRzeCIsIi4uLy4uL2NvbXBvbmVudHMvYXBwL2JyZWFkY3J1bWJzLnRzeCIsIi4uLy4uL2NvbXBvbmVudHMvYXBwL2FjdGlvbi1oZWFkZXIvYWN0aW9ucy10by1idXR0b24tZ3JvdXAudHMiLCIuLi8uLi9jb21wb25lbnRzL2FwcC9hY3Rpb24taGVhZGVyL3N0eWxlZC1iYWNrLWJ1dHRvbi50c3giLCIuLi8uLi9jb21wb25lbnRzL2FwcC9hY3Rpb24taGVhZGVyL2FjdGlvbi1oZWFkZXIudHN4IiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3VzZS1tZW1vLW9uZS9kaXN0L3VzZS1tZW1vLW9uZS5janMuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvdGlueS1pbnZhcmlhbnQvZGlzdC90aW55LWludmFyaWFudC5janMuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWJveC1tb2RlbC9kaXN0L2Nzcy1ib3gtbW9kZWwuY2pzLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL21lbW9pemUtb25lL2Rpc3QvbWVtb2l6ZS1vbmUuY2pzLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3JhZi1zY2hkL2Rpc3QvcmFmLXNjaGQuY2pzLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXh0ZW5kcy5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaGVsbG8tcGFuZ2VhL2RuZC9kaXN0L2RuZC5janMuanMiLCIuLi8uLi9jb21wb25lbnRzL3Byb3BlcnR5LXR5cGUvYXJyYXkvYWRkLW5ldy1pdGVtLXRyYW5zbGF0aW9uLnRzeCIsIi4uLy4uL2NvbXBvbmVudHMvcHJvcGVydHktdHlwZS91dGlscy9wcm9wZXJ0eS1kZXNjcmlwdGlvbi9wcm9wZXJ0eS1kZXNjcmlwdGlvbi50c3giLCIuLi8uLi9jb21wb25lbnRzL3Byb3BlcnR5LXR5cGUvdXRpbHMvcHJvcGVydHktbGFiZWwvcHJvcGVydHktbGFiZWwudHN4IiwiLi4vLi4vY29tcG9uZW50cy9wcm9wZXJ0eS10eXBlL2FycmF5L2NvbnZlcnQtdG8tc3ViLXByb3BlcnR5LnRzeCIsIi4uLy4uL2NvbXBvbmVudHMvcHJvcGVydHktdHlwZS9hcnJheS9yZW1vdmUtc3ViLXByb3BlcnR5LnRzIiwiLi4vLi4vY29tcG9uZW50cy9wcm9wZXJ0eS10eXBlL2FycmF5L2VkaXQudHN4IiwiLi4vLi4vY29tcG9uZW50cy9wcm9wZXJ0eS10eXBlL2FycmF5L2xpc3QudHN4IiwiLi4vLi4vY29tcG9uZW50cy9wcm9wZXJ0eS10eXBlL2FycmF5L3Nob3cudHN4IiwiLi4vLi4vY29tcG9uZW50cy9wcm9wZXJ0eS10eXBlL2FycmF5L2luZGV4LnRzIiwiLi4vLi4vY29tcG9uZW50cy9wcm9wZXJ0eS10eXBlL2tleS12YWx1ZS9lZGl0LnRzeCIsIi4uLy4uL2NvbXBvbmVudHMvcHJvcGVydHktdHlwZS9rZXktdmFsdWUvc2hvdy50c3giLCIuLi8uLi9jb21wb25lbnRzL3Byb3BlcnR5LXR5cGUvbWl4ZWQvY29udmVydC10by1zdWItcHJvcGVydHkudHMiLCIuLi8uLi9jb21wb25lbnRzL3Byb3BlcnR5LXR5cGUvbWl4ZWQvZWRpdC50c3giLCIuLi8uLi9jb21wb25lbnRzL3Byb3BlcnR5LXR5cGUvbWl4ZWQvc2hvdy50c3giLCIuLi8uLi9jb21wb25lbnRzL3Byb3BlcnR5LXR5cGUvbWl4ZWQvbGlzdC50c3giLCIuLi8uLi9jb21wb25lbnRzL3Byb3BlcnR5LXR5cGUvbWl4ZWQvaW5kZXgudHMiLCIuLi8uLi9jb21wb25lbnRzL3Byb3BlcnR5LXR5cGUvcmVjb3JkLXByb3BlcnR5LWlzLWVxdWFsLnRzIiwiLi4vLi4vY29tcG9uZW50cy9wcm9wZXJ0eS10eXBlL2Jvb2xlYW4vZWRpdC50c3giLCIuLi8uLi9jb21wb25lbnRzL3Byb3BlcnR5LXR5cGUvYm9vbGVhbi9tYXAtdmFsdWUudHN4IiwiLi4vLi4vY29tcG9uZW50cy9wcm9wZXJ0eS10eXBlL2Jvb2xlYW4vYm9vbGVhbi1wcm9wZXJ0eS12YWx1ZS50c3giLCIuLi8uLi9jb21wb25lbnRzL3Byb3BlcnR5LXR5cGUvYm9vbGVhbi9zaG93LnRzeCIsIi4uLy4uL2NvbXBvbmVudHMvcHJvcGVydHktdHlwZS9ib29sZWFuL2xpc3QudHN4IiwiLi4vLi4vY29tcG9uZW50cy9wcm9wZXJ0eS10eXBlL2Jvb2xlYW4vZmlsdGVyLnRzeCIsIi4uLy4uL2NvbXBvbmVudHMvcHJvcGVydHktdHlwZS9jdXJyZW5jeS9jdXJyZW5jeS1pbnB1dC13cmFwcGVyLnRzeCIsIi4uLy4uL2NvbXBvbmVudHMvcHJvcGVydHktdHlwZS9jdXJyZW5jeS9lZGl0LnRzeCIsIi4uLy4uL2NvbXBvbmVudHMvcHJvcGVydHktdHlwZS9jdXJyZW5jeS9maWx0ZXIudHN4IiwiLi4vLi4vY29tcG9uZW50cy9wcm9wZXJ0eS10eXBlL2N1cnJlbmN5L2Zvcm1hdC12YWx1ZS50cyIsIi4uLy4uL2NvbXBvbmVudHMvcHJvcGVydHktdHlwZS9jdXJyZW5jeS9saXN0LnRzeCIsIi4uLy4uL2NvbXBvbmVudHMvcHJvcGVydHktdHlwZS9jdXJyZW5jeS9zaG93LnRzeCIsIi4uLy4uL2NvbXBvbmVudHMvcHJvcGVydHktdHlwZS9kYXRldGltZS9lZGl0LnRzeCIsIi4uLy4uL2NvbXBvbmVudHMvcHJvcGVydHktdHlwZS9kYXRldGltZS9tYXAtdmFsdWUudHMiLCIuLi8uLi9jb21wb25lbnRzL3Byb3BlcnR5LXR5cGUvZGF0ZXRpbWUvc2hvdy50c3giLCIuLi8uLi9jb21wb25lbnRzL3Byb3BlcnR5LXR5cGUvZGF0ZXRpbWUvbGlzdC50c3giLCIuLi8uLi8uLi9iYWNrZW5kL3V0aWxzL2ZpbHRlci9maWx0ZXIudHMiLCIuLi8uLi9jb21wb25lbnRzL3Byb3BlcnR5LXR5cGUvZGF0ZXRpbWUvZmlsdGVyLnRzeCIsIi4uLy4uL2NvbXBvbmVudHMvcHJvcGVydHktdHlwZS9kZWZhdWx0LXR5cGUvZGVmYXVsdC1wcm9wZXJ0eS12YWx1ZS50c3giLCIuLi8uLi9jb21wb25lbnRzL3Byb3BlcnR5LXR5cGUvZGVmYXVsdC10eXBlL3Nob3cudHN4IiwiLi4vLi4vY29tcG9uZW50cy9wcm9wZXJ0eS10eXBlL2RlZmF1bHQtdHlwZS9lZGl0LnRzeCIsIi4uLy4uL2NvbXBvbmVudHMvcHJvcGVydHktdHlwZS9kZWZhdWx0LXR5cGUvZmlsdGVyLnRzeCIsIi4uLy4uL2NvbXBvbmVudHMvcHJvcGVydHktdHlwZS9kZWZhdWx0LXR5cGUvbGlzdC50c3giLCIuLi8uLi9jb21wb25lbnRzL3Byb3BlcnR5LXR5cGUvcGFzc3dvcmQvZWRpdC50c3giLCIuLi8uLi9jb21wb25lbnRzL3Byb3BlcnR5LXR5cGUvcGFzc3dvcmQvaW5kZXgudHMiLCIuLi8uLi9jb21wb25lbnRzL3Byb3BlcnR5LXR5cGUvcGhvbmUvZWRpdC50c3giLCIuLi8uLi9jb21wb25lbnRzL3Byb3BlcnR5LXR5cGUvcGhvbmUvZmlsdGVyLnRzeCIsIi4uLy4uL2NvbXBvbmVudHMvcHJvcGVydHktdHlwZS9waG9uZS9saXN0LnRzeCIsIi4uLy4uL2NvbXBvbmVudHMvcHJvcGVydHktdHlwZS9waG9uZS9zaG93LnRzeCIsIi4uLy4uL2NvbXBvbmVudHMvcHJvcGVydHktdHlwZS9yZWZlcmVuY2UvZWRpdC50c3giLCIuLi8uLi9jb21wb25lbnRzL3Byb3BlcnR5LXR5cGUvcmVmZXJlbmNlL3JlZmVyZW5jZS12YWx1ZS50c3giLCIuLi8uLi9jb21wb25lbnRzL3Byb3BlcnR5LXR5cGUvcmVmZXJlbmNlL3Nob3cudHN4IiwiLi4vLi4vY29tcG9uZW50cy9wcm9wZXJ0eS10eXBlL3JlZmVyZW5jZS9saXN0LnRzeCIsIi4uLy4uL2NvbXBvbmVudHMvcHJvcGVydHktdHlwZS9yZWZlcmVuY2UvZmlsdGVyLnRzeCIsIi4uLy4uL2NvbXBvbmVudHMvcHJvcGVydHktdHlwZS9yaWNodGV4dC9lZGl0LnRzeCIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3NmaWx0ZXIvbGliL2RlZmF1bHQuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzZmlsdGVyL2xpYi91dGlsLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzc2ZpbHRlci9saWIvcGFyc2VyLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzc2ZpbHRlci9saWIvY3NzLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzc2ZpbHRlci9saWIvaW5kZXguanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMveHNzL2xpYi91dGlsLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3hzcy9saWIvZGVmYXVsdC5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy94c3MvbGliL3BhcnNlci5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy94c3MvbGliL3hzcy5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy94c3MvbGliL2luZGV4LmpzIiwiLi4vLi4vY29tcG9uZW50cy9wcm9wZXJ0eS10eXBlL3JpY2h0ZXh0L3Nob3cudHN4IiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2xvZGFzaC9pc09iamVjdC5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VJc1JlZ0V4cC5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VVbmFyeS5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX25vZGVVdGlsLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2xvZGFzaC9pc1JlZ0V4cC5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VQcm9wZXJ0eS5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2FzY2lpU2l6ZS5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX3VuaWNvZGVTaXplLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fc3RyaW5nU2l6ZS5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX3RyaW1tZWRFbmRJbmRleC5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VUcmltLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2xvZGFzaC90b051bWJlci5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9sb2Rhc2gvdG9GaW5pdGUuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvbG9kYXNoL3RvSW50ZWdlci5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9sb2Rhc2gvdHJ1bmNhdGUuanMiLCIuLi8uLi9jb21wb25lbnRzL3Byb3BlcnR5LXR5cGUvcmljaHRleHQvbGlzdC50c3giLCIuLi8uLi9jb21wb25lbnRzL3Byb3BlcnR5LXR5cGUvdGV4dGFyZWEvc2hvdy50c3giLCIuLi8uLi9jb21wb25lbnRzL3Byb3BlcnR5LXR5cGUvdGV4dGFyZWEvZWRpdC50c3giLCIuLi8uLi9jb21wb25lbnRzL3Byb3BlcnR5LXR5cGUvYmFzZS1wcm9wZXJ0eS1jb21wb25lbnQudHN4IiwiLi4vLi4vY29tcG9uZW50cy9wcm9wZXJ0eS10eXBlL2NsZWFuLXByb3BlcnR5LWNvbXBvbmVudC50c3giLCIuLi8uLi9jb21wb25lbnRzL3Byb3BlcnR5LXR5cGUvaW5kZXgudHN4IiwiLi4vLi4vY29tcG9uZW50cy9hY3Rpb25zL3V0aWxzL2xheW91dC1lbGVtZW50LXJlbmRlcmVyLnRzeCIsIi4uLy4uL2NvbXBvbmVudHMvYWN0aW9ucy9uZXcudHN4IiwiLi4vLi4vY29tcG9uZW50cy9hY3Rpb25zL2VkaXQudHN4IiwiLi4vLi4vY29tcG9uZW50cy9hY3Rpb25zL3Nob3cudHN4IiwiLi4vLi4vY29tcG9uZW50cy9hcHAvYWN0aW9uLWJ1dHRvbi9hY3Rpb24tYnV0dG9uLnRzeCIsIi4uLy4uL2NvbXBvbmVudHMvYXBwL3JlY29yZHMtdGFibGUvbm8tcmVjb3Jkcy50c3giLCIuLi8uLi9jb21wb25lbnRzL2FwcC9yZWNvcmRzLXRhYmxlL3V0aWxzL2Rpc3BsYXkudHN4IiwiLi4vLi4vY29tcG9uZW50cy9hcHAvcmVjb3Jkcy10YWJsZS9yZWNvcmQtaW4tbGlzdC50c3giLCIuLi8uLi9jb21wb25lbnRzL2FwcC9zb3J0LWxpbmsudHN4IiwiLi4vLi4vY29tcG9uZW50cy9hcHAvcmVjb3Jkcy10YWJsZS9wcm9wZXJ0eS1oZWFkZXIudHN4IiwiLi4vLi4vY29tcG9uZW50cy9hcHAvcmVjb3Jkcy10YWJsZS9yZWNvcmRzLXRhYmxlLWhlYWRlci50c3giLCIuLi8uLi9jb21wb25lbnRzL2FwcC9yZWNvcmRzLXRhYmxlL3V0aWxzL2dldC1idWxrLWFjdGlvbnMtZnJvbS1yZWNvcmRzLnRzIiwiLi4vLi4vY29tcG9uZW50cy9hcHAvcmVjb3Jkcy10YWJsZS9zZWxlY3RlZC1yZWNvcmRzLnRzeCIsIi4uLy4uL2NvbXBvbmVudHMvYXBwL3JlY29yZHMtdGFibGUvcmVjb3Jkcy10YWJsZS50c3giLCIuLi8uLi9jb21wb25lbnRzL2FjdGlvbnMvbGlzdC50c3giLCIuLi8uLi9ob2Mvd2l0aC1ub3RpY2UudHMiLCIuLi8uLi9jb21wb25lbnRzL2FjdGlvbnMvYnVsay1kZWxldGUudHN4IiwiLi4vLi4vY29tcG9uZW50cy9hY3Rpb25zL2luZGV4LnRzIiwiLi4vLi4vLi4vY29uc3RhbnRzLnRzIiwiLi4vLi4vY29tcG9uZW50cy9hcHAvYmFzZS1hY3Rpb24tY29tcG9uZW50LnRzeCIsIi4uLy4uL2NvbXBvbmVudHMvYXBwL2Vycm9yLW1lc3NhZ2UudHN4IiwiLi4vLi4vY29tcG9uZW50cy9yb3V0ZXMvdXRpbHMvd3JhcHBlci50c3giLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvcmVhY3QtZG9tL2NsaWVudC5qcyIsIi4uLy4uL2NvbXBvbmVudHMvYXBwL2RyYXdlci1wb3J0YWwudHN4IiwiLi4vLi4vY29tcG9uZW50cy9hcHAvZmlsdGVyLWRyYXdlci50c3giLCIuLi8uLi9jb21wb25lbnRzL3JvdXRlcy9yZWNvcmQtYWN0aW9uLnRzeCIsIi4uLy4uL2NvbXBvbmVudHMvcm91dGVzL3Jlc291cmNlLWFjdGlvbi50c3giLCIuLi8uLi9jb21wb25lbnRzL3JvdXRlcy9idWxrLWFjdGlvbi50c3giLCIuLi8uLi9jb21wb25lbnRzL3JvdXRlcy9wYWdlLnRzeCIsIi4uLy4uL2NvbXBvbmVudHMvcm91dGVzL3Jlc291cmNlLnRzeCIsIi4uLy4uL2NvbXBvbmVudHMvYXBwbGljYXRpb24udHN4IiwiLi4vLi4vc3RvcmUvYWN0aW9ucy9pbml0aWFsaXplLWFzc2V0cy50cyIsIi4uLy4uL3N0b3JlL2FjdGlvbnMvaW5pdGlhbGl6ZS1icmFuZGluZy50cyIsIi4uLy4uL3N0b3JlL2FjdGlvbnMvaW5pdGlhbGl6ZS1kYXNoYm9hcmQudHMiLCIuLi8uLi9zdG9yZS9hY3Rpb25zL2luaXRpYWxpemUtbG9jYWxlLnRzIiwiLi4vLi4vc3RvcmUvYWN0aW9ucy9pbml0aWFsaXplLXBhZ2VzLnRzIiwiLi4vLi4vc3RvcmUvYWN0aW9ucy9pbml0aWFsaXplLXBhdGhzLnRzIiwiLi4vLi4vc3RvcmUvYWN0aW9ucy9pbml0aWFsaXplLXJlc291cmNlcy50cyIsIi4uLy4uL3N0b3JlL2FjdGlvbnMvaW5pdGlhbGl6ZS12ZXJzaW9ucy50cyIsIi4uLy4uL3N0b3JlL3N0b3JlLnRzIiwiLi4vLi4vYnVuZGxlLWVudHJ5LmpzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJmdW5jdGlvbiBfdHlwZW9mKG9iaikge1xuICBcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7XG5cbiAgcmV0dXJuIChtb2R1bGUuZXhwb3J0cyA9IF90eXBlb2YgPSBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBcInN5bWJvbFwiID09IHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPyBmdW5jdGlvbiAob2JqKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBvYmo7XG4gIH0gOiBmdW5jdGlvbiAob2JqKSB7XG4gICAgcmV0dXJuIG9iaiAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajtcbiAgfSwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzKSwgX3R5cGVvZihvYmopO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF90eXBlb2YsIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0czsiLCJ2YXIgX3R5cGVvZiA9IHJlcXVpcmUoXCIuL3R5cGVvZi5qc1wiKVtcImRlZmF1bHRcIl07XG5cbmZ1bmN0aW9uIF9yZWdlbmVyYXRvclJ1bnRpbWUoKSB7XG4gIFwidXNlIHN0cmljdFwiO1xuICAvKiEgcmVnZW5lcmF0b3ItcnVudGltZSAtLSBDb3B5cmlnaHQgKGMpIDIwMTQtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4gLS0gbGljZW5zZSAoTUlUKTogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlZ2VuZXJhdG9yL2Jsb2IvbWFpbi9MSUNFTlNFICovXG5cbiAgbW9kdWxlLmV4cG9ydHMgPSBfcmVnZW5lcmF0b3JSdW50aW1lID0gZnVuY3Rpb24gX3JlZ2VuZXJhdG9yUnVudGltZSgpIHtcbiAgICByZXR1cm4gZXhwb3J0cztcbiAgfSwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzO1xuICB2YXIgZXhwb3J0cyA9IHt9LFxuICAgICAgT3AgPSBPYmplY3QucHJvdG90eXBlLFxuICAgICAgaGFzT3duID0gT3AuaGFzT3duUHJvcGVydHksXG4gICAgICAkU3ltYm9sID0gXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgPyBTeW1ib2wgOiB7fSxcbiAgICAgIGl0ZXJhdG9yU3ltYm9sID0gJFN5bWJvbC5pdGVyYXRvciB8fCBcIkBAaXRlcmF0b3JcIixcbiAgICAgIGFzeW5jSXRlcmF0b3JTeW1ib2wgPSAkU3ltYm9sLmFzeW5jSXRlcmF0b3IgfHwgXCJAQGFzeW5jSXRlcmF0b3JcIixcbiAgICAgIHRvU3RyaW5nVGFnU3ltYm9sID0gJFN5bWJvbC50b1N0cmluZ1RhZyB8fCBcIkBAdG9TdHJpbmdUYWdcIjtcblxuICBmdW5jdGlvbiBkZWZpbmUob2JqLCBrZXksIHZhbHVlKSB7XG4gICAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwge1xuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBjb25maWd1cmFibGU6ICEwLFxuICAgICAgd3JpdGFibGU6ICEwXG4gICAgfSksIG9ialtrZXldO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBkZWZpbmUoe30sIFwiXCIpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBkZWZpbmUgPSBmdW5jdGlvbiBkZWZpbmUob2JqLCBrZXksIHZhbHVlKSB7XG4gICAgICByZXR1cm4gb2JqW2tleV0gPSB2YWx1ZTtcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gd3JhcChpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdCkge1xuICAgIHZhciBwcm90b0dlbmVyYXRvciA9IG91dGVyRm4gJiYgb3V0ZXJGbi5wcm90b3R5cGUgaW5zdGFuY2VvZiBHZW5lcmF0b3IgPyBvdXRlckZuIDogR2VuZXJhdG9yLFxuICAgICAgICBnZW5lcmF0b3IgPSBPYmplY3QuY3JlYXRlKHByb3RvR2VuZXJhdG9yLnByb3RvdHlwZSksXG4gICAgICAgIGNvbnRleHQgPSBuZXcgQ29udGV4dCh0cnlMb2NzTGlzdCB8fCBbXSk7XG4gICAgcmV0dXJuIGdlbmVyYXRvci5faW52b2tlID0gZnVuY3Rpb24gKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpIHtcbiAgICAgIHZhciBzdGF0ZSA9IFwic3VzcGVuZGVkU3RhcnRcIjtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAobWV0aG9kLCBhcmcpIHtcbiAgICAgICAgaWYgKFwiZXhlY3V0aW5nXCIgPT09IHN0YXRlKSB0aHJvdyBuZXcgRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBydW5uaW5nXCIpO1xuXG4gICAgICAgIGlmIChcImNvbXBsZXRlZFwiID09PSBzdGF0ZSkge1xuICAgICAgICAgIGlmIChcInRocm93XCIgPT09IG1ldGhvZCkgdGhyb3cgYXJnO1xuICAgICAgICAgIHJldHVybiBkb25lUmVzdWx0KCk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnRleHQubWV0aG9kID0gbWV0aG9kLCBjb250ZXh0LmFyZyA9IGFyZzs7KSB7XG4gICAgICAgICAgdmFyIGRlbGVnYXRlID0gY29udGV4dC5kZWxlZ2F0ZTtcblxuICAgICAgICAgIGlmIChkZWxlZ2F0ZSkge1xuICAgICAgICAgICAgdmFyIGRlbGVnYXRlUmVzdWx0ID0gbWF5YmVJbnZva2VEZWxlZ2F0ZShkZWxlZ2F0ZSwgY29udGV4dCk7XG5cbiAgICAgICAgICAgIGlmIChkZWxlZ2F0ZVJlc3VsdCkge1xuICAgICAgICAgICAgICBpZiAoZGVsZWdhdGVSZXN1bHQgPT09IENvbnRpbnVlU2VudGluZWwpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICByZXR1cm4gZGVsZWdhdGVSZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKFwibmV4dFwiID09PSBjb250ZXh0Lm1ldGhvZCkgY29udGV4dC5zZW50ID0gY29udGV4dC5fc2VudCA9IGNvbnRleHQuYXJnO2Vsc2UgaWYgKFwidGhyb3dcIiA9PT0gY29udGV4dC5tZXRob2QpIHtcbiAgICAgICAgICAgIGlmIChcInN1c3BlbmRlZFN0YXJ0XCIgPT09IHN0YXRlKSB0aHJvdyBzdGF0ZSA9IFwiY29tcGxldGVkXCIsIGNvbnRleHQuYXJnO1xuICAgICAgICAgICAgY29udGV4dC5kaXNwYXRjaEV4Y2VwdGlvbihjb250ZXh0LmFyZyk7XG4gICAgICAgICAgfSBlbHNlIFwicmV0dXJuXCIgPT09IGNvbnRleHQubWV0aG9kICYmIGNvbnRleHQuYWJydXB0KFwicmV0dXJuXCIsIGNvbnRleHQuYXJnKTtcbiAgICAgICAgICBzdGF0ZSA9IFwiZXhlY3V0aW5nXCI7XG4gICAgICAgICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpO1xuXG4gICAgICAgICAgaWYgKFwibm9ybWFsXCIgPT09IHJlY29yZC50eXBlKSB7XG4gICAgICAgICAgICBpZiAoc3RhdGUgPSBjb250ZXh0LmRvbmUgPyBcImNvbXBsZXRlZFwiIDogXCJzdXNwZW5kZWRZaWVsZFwiLCByZWNvcmQuYXJnID09PSBDb250aW51ZVNlbnRpbmVsKSBjb250aW51ZTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIHZhbHVlOiByZWNvcmQuYXJnLFxuICAgICAgICAgICAgICBkb25lOiBjb250ZXh0LmRvbmVcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgXCJ0aHJvd1wiID09PSByZWNvcmQudHlwZSAmJiAoc3RhdGUgPSBcImNvbXBsZXRlZFwiLCBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIiwgY29udGV4dC5hcmcgPSByZWNvcmQuYXJnKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9KGlubmVyRm4sIHNlbGYsIGNvbnRleHQpLCBnZW5lcmF0b3I7XG4gIH1cblxuICBmdW5jdGlvbiB0cnlDYXRjaChmbiwgb2JqLCBhcmcpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogXCJub3JtYWxcIixcbiAgICAgICAgYXJnOiBmbi5jYWxsKG9iaiwgYXJnKVxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IFwidGhyb3dcIixcbiAgICAgICAgYXJnOiBlcnJcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgZXhwb3J0cy53cmFwID0gd3JhcDtcbiAgdmFyIENvbnRpbnVlU2VudGluZWwgPSB7fTtcblxuICBmdW5jdGlvbiBHZW5lcmF0b3IoKSB7fVxuXG4gIGZ1bmN0aW9uIEdlbmVyYXRvckZ1bmN0aW9uKCkge31cblxuICBmdW5jdGlvbiBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSgpIHt9XG5cbiAgdmFyIEl0ZXJhdG9yUHJvdG90eXBlID0ge307XG4gIGRlZmluZShJdGVyYXRvclByb3RvdHlwZSwgaXRlcmF0b3JTeW1ib2wsIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfSk7XG4gIHZhciBnZXRQcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZixcbiAgICAgIE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlID0gZ2V0UHJvdG8gJiYgZ2V0UHJvdG8oZ2V0UHJvdG8odmFsdWVzKFtdKSkpO1xuICBOYXRpdmVJdGVyYXRvclByb3RvdHlwZSAmJiBOYXRpdmVJdGVyYXRvclByb3RvdHlwZSAhPT0gT3AgJiYgaGFzT3duLmNhbGwoTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUsIGl0ZXJhdG9yU3ltYm9sKSAmJiAoSXRlcmF0b3JQcm90b3R5cGUgPSBOYXRpdmVJdGVyYXRvclByb3RvdHlwZSk7XG4gIHZhciBHcCA9IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLnByb3RvdHlwZSA9IEdlbmVyYXRvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEl0ZXJhdG9yUHJvdG90eXBlKTtcblxuICBmdW5jdGlvbiBkZWZpbmVJdGVyYXRvck1ldGhvZHMocHJvdG90eXBlKSB7XG4gICAgW1wibmV4dFwiLCBcInRocm93XCIsIFwicmV0dXJuXCJdLmZvckVhY2goZnVuY3Rpb24gKG1ldGhvZCkge1xuICAgICAgZGVmaW5lKHByb3RvdHlwZSwgbWV0aG9kLCBmdW5jdGlvbiAoYXJnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbnZva2UobWV0aG9kLCBhcmcpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBBc3luY0l0ZXJhdG9yKGdlbmVyYXRvciwgUHJvbWlzZUltcGwpIHtcbiAgICBmdW5jdGlvbiBpbnZva2UobWV0aG9kLCBhcmcsIHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKGdlbmVyYXRvclttZXRob2RdLCBnZW5lcmF0b3IsIGFyZyk7XG5cbiAgICAgIGlmIChcInRocm93XCIgIT09IHJlY29yZC50eXBlKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSByZWNvcmQuYXJnLFxuICAgICAgICAgICAgdmFsdWUgPSByZXN1bHQudmFsdWU7XG4gICAgICAgIHJldHVybiB2YWx1ZSAmJiBcIm9iamVjdFwiID09IF90eXBlb2YodmFsdWUpICYmIGhhc093bi5jYWxsKHZhbHVlLCBcIl9fYXdhaXRcIikgPyBQcm9taXNlSW1wbC5yZXNvbHZlKHZhbHVlLl9fYXdhaXQpLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgaW52b2tlKFwibmV4dFwiLCB2YWx1ZSwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgfSwgZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgIGludm9rZShcInRocm93XCIsIGVyciwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgfSkgOiBQcm9taXNlSW1wbC5yZXNvbHZlKHZhbHVlKS50aGVuKGZ1bmN0aW9uICh1bndyYXBwZWQpIHtcbiAgICAgICAgICByZXN1bHQudmFsdWUgPSB1bndyYXBwZWQsIHJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgfSwgZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGludm9rZShcInRocm93XCIsIGVycm9yLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmVqZWN0KHJlY29yZC5hcmcpO1xuICAgIH1cblxuICAgIHZhciBwcmV2aW91c1Byb21pc2U7XG5cbiAgICB0aGlzLl9pbnZva2UgPSBmdW5jdGlvbiAobWV0aG9kLCBhcmcpIHtcbiAgICAgIGZ1bmN0aW9uIGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnKCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2VJbXBsKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICBpbnZva2UobWV0aG9kLCBhcmcsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcHJldmlvdXNQcm9taXNlID0gcHJldmlvdXNQcm9taXNlID8gcHJldmlvdXNQcm9taXNlLnRoZW4oY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmcsIGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnKSA6IGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnKCk7XG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpIHtcbiAgICB2YXIgbWV0aG9kID0gZGVsZWdhdGUuaXRlcmF0b3JbY29udGV4dC5tZXRob2RdO1xuXG4gICAgaWYgKHVuZGVmaW5lZCA9PT0gbWV0aG9kKSB7XG4gICAgICBpZiAoY29udGV4dC5kZWxlZ2F0ZSA9IG51bGwsIFwidGhyb3dcIiA9PT0gY29udGV4dC5tZXRob2QpIHtcbiAgICAgICAgaWYgKGRlbGVnYXRlLml0ZXJhdG9yW1wicmV0dXJuXCJdICYmIChjb250ZXh0Lm1ldGhvZCA9IFwicmV0dXJuXCIsIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkLCBtYXliZUludm9rZURlbGVnYXRlKGRlbGVnYXRlLCBjb250ZXh0KSwgXCJ0aHJvd1wiID09PSBjb250ZXh0Lm1ldGhvZCkpIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIiwgY29udGV4dC5hcmcgPSBuZXcgVHlwZUVycm9yKFwiVGhlIGl0ZXJhdG9yIGRvZXMgbm90IHByb3ZpZGUgYSAndGhyb3cnIG1ldGhvZFwiKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuXG4gICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKG1ldGhvZCwgZGVsZWdhdGUuaXRlcmF0b3IsIGNvbnRleHQuYXJnKTtcbiAgICBpZiAoXCJ0aHJvd1wiID09PSByZWNvcmQudHlwZSkgcmV0dXJuIGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiLCBjb250ZXh0LmFyZyA9IHJlY29yZC5hcmcsIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsLCBDb250aW51ZVNlbnRpbmVsO1xuICAgIHZhciBpbmZvID0gcmVjb3JkLmFyZztcbiAgICByZXR1cm4gaW5mbyA/IGluZm8uZG9uZSA/IChjb250ZXh0W2RlbGVnYXRlLnJlc3VsdE5hbWVdID0gaW5mby52YWx1ZSwgY29udGV4dC5uZXh0ID0gZGVsZWdhdGUubmV4dExvYywgXCJyZXR1cm5cIiAhPT0gY29udGV4dC5tZXRob2QgJiYgKGNvbnRleHQubWV0aG9kID0gXCJuZXh0XCIsIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkKSwgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGwsIENvbnRpbnVlU2VudGluZWwpIDogaW5mbyA6IChjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIiwgY29udGV4dC5hcmcgPSBuZXcgVHlwZUVycm9yKFwiaXRlcmF0b3IgcmVzdWx0IGlzIG5vdCBhbiBvYmplY3RcIiksIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsLCBDb250aW51ZVNlbnRpbmVsKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHB1c2hUcnlFbnRyeShsb2NzKSB7XG4gICAgdmFyIGVudHJ5ID0ge1xuICAgICAgdHJ5TG9jOiBsb2NzWzBdXG4gICAgfTtcbiAgICAxIGluIGxvY3MgJiYgKGVudHJ5LmNhdGNoTG9jID0gbG9jc1sxXSksIDIgaW4gbG9jcyAmJiAoZW50cnkuZmluYWxseUxvYyA9IGxvY3NbMl0sIGVudHJ5LmFmdGVyTG9jID0gbG9jc1szXSksIHRoaXMudHJ5RW50cmllcy5wdXNoKGVudHJ5KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlc2V0VHJ5RW50cnkoZW50cnkpIHtcbiAgICB2YXIgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbiB8fCB7fTtcbiAgICByZWNvcmQudHlwZSA9IFwibm9ybWFsXCIsIGRlbGV0ZSByZWNvcmQuYXJnLCBlbnRyeS5jb21wbGV0aW9uID0gcmVjb3JkO1xuICB9XG5cbiAgZnVuY3Rpb24gQ29udGV4dCh0cnlMb2NzTGlzdCkge1xuICAgIHRoaXMudHJ5RW50cmllcyA9IFt7XG4gICAgICB0cnlMb2M6IFwicm9vdFwiXG4gICAgfV0sIHRyeUxvY3NMaXN0LmZvckVhY2gocHVzaFRyeUVudHJ5LCB0aGlzKSwgdGhpcy5yZXNldCghMCk7XG4gIH1cblxuICBmdW5jdGlvbiB2YWx1ZXMoaXRlcmFibGUpIHtcbiAgICBpZiAoaXRlcmFibGUpIHtcbiAgICAgIHZhciBpdGVyYXRvck1ldGhvZCA9IGl0ZXJhYmxlW2l0ZXJhdG9yU3ltYm9sXTtcbiAgICAgIGlmIChpdGVyYXRvck1ldGhvZCkgcmV0dXJuIGl0ZXJhdG9yTWV0aG9kLmNhbGwoaXRlcmFibGUpO1xuICAgICAgaWYgKFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgaXRlcmFibGUubmV4dCkgcmV0dXJuIGl0ZXJhYmxlO1xuXG4gICAgICBpZiAoIWlzTmFOKGl0ZXJhYmxlLmxlbmd0aCkpIHtcbiAgICAgICAgdmFyIGkgPSAtMSxcbiAgICAgICAgICAgIG5leHQgPSBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgICAgIGZvciAoOyArK2kgPCBpdGVyYWJsZS5sZW5ndGg7KSB7XG4gICAgICAgICAgICBpZiAoaGFzT3duLmNhbGwoaXRlcmFibGUsIGkpKSByZXR1cm4gbmV4dC52YWx1ZSA9IGl0ZXJhYmxlW2ldLCBuZXh0LmRvbmUgPSAhMSwgbmV4dDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gbmV4dC52YWx1ZSA9IHVuZGVmaW5lZCwgbmV4dC5kb25lID0gITAsIG5leHQ7XG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIG5leHQubmV4dCA9IG5leHQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIG5leHQ6IGRvbmVSZXN1bHRcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gZG9uZVJlc3VsdCgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdmFsdWU6IHVuZGVmaW5lZCxcbiAgICAgIGRvbmU6ICEwXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBHZW5lcmF0b3JGdW5jdGlvbi5wcm90b3R5cGUgPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSwgZGVmaW5lKEdwLCBcImNvbnN0cnVjdG9yXCIsIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlKSwgZGVmaW5lKEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLCBcImNvbnN0cnVjdG9yXCIsIEdlbmVyYXRvckZ1bmN0aW9uKSwgR2VuZXJhdG9yRnVuY3Rpb24uZGlzcGxheU5hbWUgPSBkZWZpbmUoR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUsIHRvU3RyaW5nVGFnU3ltYm9sLCBcIkdlbmVyYXRvckZ1bmN0aW9uXCIpLCBleHBvcnRzLmlzR2VuZXJhdG9yRnVuY3Rpb24gPSBmdW5jdGlvbiAoZ2VuRnVuKSB7XG4gICAgdmFyIGN0b3IgPSBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIGdlbkZ1biAmJiBnZW5GdW4uY29uc3RydWN0b3I7XG4gICAgcmV0dXJuICEhY3RvciAmJiAoY3RvciA9PT0gR2VuZXJhdG9yRnVuY3Rpb24gfHwgXCJHZW5lcmF0b3JGdW5jdGlvblwiID09PSAoY3Rvci5kaXNwbGF5TmFtZSB8fCBjdG9yLm5hbWUpKTtcbiAgfSwgZXhwb3J0cy5tYXJrID0gZnVuY3Rpb24gKGdlbkZ1bikge1xuICAgIHJldHVybiBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2YoZ2VuRnVuLCBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSkgOiAoZ2VuRnVuLl9fcHJvdG9fXyA9IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLCBkZWZpbmUoZ2VuRnVuLCB0b1N0cmluZ1RhZ1N5bWJvbCwgXCJHZW5lcmF0b3JGdW5jdGlvblwiKSksIGdlbkZ1bi5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEdwKSwgZ2VuRnVuO1xuICB9LCBleHBvcnRzLmF3cmFwID0gZnVuY3Rpb24gKGFyZykge1xuICAgIHJldHVybiB7XG4gICAgICBfX2F3YWl0OiBhcmdcbiAgICB9O1xuICB9LCBkZWZpbmVJdGVyYXRvck1ldGhvZHMoQXN5bmNJdGVyYXRvci5wcm90b3R5cGUpLCBkZWZpbmUoQXN5bmNJdGVyYXRvci5wcm90b3R5cGUsIGFzeW5jSXRlcmF0b3JTeW1ib2wsIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfSksIGV4cG9ydHMuQXN5bmNJdGVyYXRvciA9IEFzeW5jSXRlcmF0b3IsIGV4cG9ydHMuYXN5bmMgPSBmdW5jdGlvbiAoaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QsIFByb21pc2VJbXBsKSB7XG4gICAgdm9pZCAwID09PSBQcm9taXNlSW1wbCAmJiAoUHJvbWlzZUltcGwgPSBQcm9taXNlKTtcbiAgICB2YXIgaXRlciA9IG5ldyBBc3luY0l0ZXJhdG9yKHdyYXAoaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QpLCBQcm9taXNlSW1wbCk7XG4gICAgcmV0dXJuIGV4cG9ydHMuaXNHZW5lcmF0b3JGdW5jdGlvbihvdXRlckZuKSA/IGl0ZXIgOiBpdGVyLm5leHQoKS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgIHJldHVybiByZXN1bHQuZG9uZSA/IHJlc3VsdC52YWx1ZSA6IGl0ZXIubmV4dCgpO1xuICAgIH0pO1xuICB9LCBkZWZpbmVJdGVyYXRvck1ldGhvZHMoR3ApLCBkZWZpbmUoR3AsIHRvU3RyaW5nVGFnU3ltYm9sLCBcIkdlbmVyYXRvclwiKSwgZGVmaW5lKEdwLCBpdGVyYXRvclN5bWJvbCwgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9KSwgZGVmaW5lKEdwLCBcInRvU3RyaW5nXCIsIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gXCJbb2JqZWN0IEdlbmVyYXRvcl1cIjtcbiAgfSksIGV4cG9ydHMua2V5cyA9IGZ1bmN0aW9uIChvYmplY3QpIHtcbiAgICB2YXIga2V5cyA9IFtdO1xuXG4gICAgZm9yICh2YXIga2V5IGluIG9iamVjdCkge1xuICAgICAga2V5cy5wdXNoKGtleSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGtleXMucmV2ZXJzZSgpLCBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgZm9yICg7IGtleXMubGVuZ3RoOykge1xuICAgICAgICB2YXIga2V5ID0ga2V5cy5wb3AoKTtcbiAgICAgICAgaWYgKGtleSBpbiBvYmplY3QpIHJldHVybiBuZXh0LnZhbHVlID0ga2V5LCBuZXh0LmRvbmUgPSAhMSwgbmV4dDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5leHQuZG9uZSA9ICEwLCBuZXh0O1xuICAgIH07XG4gIH0sIGV4cG9ydHMudmFsdWVzID0gdmFsdWVzLCBDb250ZXh0LnByb3RvdHlwZSA9IHtcbiAgICBjb25zdHJ1Y3RvcjogQ29udGV4dCxcbiAgICByZXNldDogZnVuY3Rpb24gcmVzZXQoc2tpcFRlbXBSZXNldCkge1xuICAgICAgaWYgKHRoaXMucHJldiA9IDAsIHRoaXMubmV4dCA9IDAsIHRoaXMuc2VudCA9IHRoaXMuX3NlbnQgPSB1bmRlZmluZWQsIHRoaXMuZG9uZSA9ICExLCB0aGlzLmRlbGVnYXRlID0gbnVsbCwgdGhpcy5tZXRob2QgPSBcIm5leHRcIiwgdGhpcy5hcmcgPSB1bmRlZmluZWQsIHRoaXMudHJ5RW50cmllcy5mb3JFYWNoKHJlc2V0VHJ5RW50cnkpLCAhc2tpcFRlbXBSZXNldCkgZm9yICh2YXIgbmFtZSBpbiB0aGlzKSB7XG4gICAgICAgIFwidFwiID09PSBuYW1lLmNoYXJBdCgwKSAmJiBoYXNPd24uY2FsbCh0aGlzLCBuYW1lKSAmJiAhaXNOYU4oK25hbWUuc2xpY2UoMSkpICYmICh0aGlzW25hbWVdID0gdW5kZWZpbmVkKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHN0b3A6IGZ1bmN0aW9uIHN0b3AoKSB7XG4gICAgICB0aGlzLmRvbmUgPSAhMDtcbiAgICAgIHZhciByb290UmVjb3JkID0gdGhpcy50cnlFbnRyaWVzWzBdLmNvbXBsZXRpb247XG4gICAgICBpZiAoXCJ0aHJvd1wiID09PSByb290UmVjb3JkLnR5cGUpIHRocm93IHJvb3RSZWNvcmQuYXJnO1xuICAgICAgcmV0dXJuIHRoaXMucnZhbDtcbiAgICB9LFxuICAgIGRpc3BhdGNoRXhjZXB0aW9uOiBmdW5jdGlvbiBkaXNwYXRjaEV4Y2VwdGlvbihleGNlcHRpb24pIHtcbiAgICAgIGlmICh0aGlzLmRvbmUpIHRocm93IGV4Y2VwdGlvbjtcbiAgICAgIHZhciBjb250ZXh0ID0gdGhpcztcblxuICAgICAgZnVuY3Rpb24gaGFuZGxlKGxvYywgY2F1Z2h0KSB7XG4gICAgICAgIHJldHVybiByZWNvcmQudHlwZSA9IFwidGhyb3dcIiwgcmVjb3JkLmFyZyA9IGV4Y2VwdGlvbiwgY29udGV4dC5uZXh0ID0gbG9jLCBjYXVnaHQgJiYgKGNvbnRleHQubWV0aG9kID0gXCJuZXh0XCIsIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkKSwgISFjYXVnaHQ7XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldLFxuICAgICAgICAgICAgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbjtcbiAgICAgICAgaWYgKFwicm9vdFwiID09PSBlbnRyeS50cnlMb2MpIHJldHVybiBoYW5kbGUoXCJlbmRcIik7XG5cbiAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA8PSB0aGlzLnByZXYpIHtcbiAgICAgICAgICB2YXIgaGFzQ2F0Y2ggPSBoYXNPd24uY2FsbChlbnRyeSwgXCJjYXRjaExvY1wiKSxcbiAgICAgICAgICAgICAgaGFzRmluYWxseSA9IGhhc093bi5jYWxsKGVudHJ5LCBcImZpbmFsbHlMb2NcIik7XG5cbiAgICAgICAgICBpZiAoaGFzQ2F0Y2ggJiYgaGFzRmluYWxseSkge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGVudHJ5LmNhdGNoTG9jKSByZXR1cm4gaGFuZGxlKGVudHJ5LmNhdGNoTG9jLCAhMCk7XG4gICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuZmluYWxseUxvYykgcmV0dXJuIGhhbmRsZShlbnRyeS5maW5hbGx5TG9jKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGhhc0NhdGNoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuY2F0Y2hMb2MpIHJldHVybiBoYW5kbGUoZW50cnkuY2F0Y2hMb2MsICEwKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKCFoYXNGaW5hbGx5KSB0aHJvdyBuZXcgRXJyb3IoXCJ0cnkgc3RhdGVtZW50IHdpdGhvdXQgY2F0Y2ggb3IgZmluYWxseVwiKTtcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSByZXR1cm4gaGFuZGxlKGVudHJ5LmZpbmFsbHlMb2MpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgYWJydXB0OiBmdW5jdGlvbiBhYnJ1cHQodHlwZSwgYXJnKSB7XG4gICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTtcblxuICAgICAgICBpZiAoZW50cnkudHJ5TG9jIDw9IHRoaXMucHJldiAmJiBoYXNPd24uY2FsbChlbnRyeSwgXCJmaW5hbGx5TG9jXCIpICYmIHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgICB2YXIgZmluYWxseUVudHJ5ID0gZW50cnk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZmluYWxseUVudHJ5ICYmIChcImJyZWFrXCIgPT09IHR5cGUgfHwgXCJjb250aW51ZVwiID09PSB0eXBlKSAmJiBmaW5hbGx5RW50cnkudHJ5TG9jIDw9IGFyZyAmJiBhcmcgPD0gZmluYWxseUVudHJ5LmZpbmFsbHlMb2MgJiYgKGZpbmFsbHlFbnRyeSA9IG51bGwpO1xuICAgICAgdmFyIHJlY29yZCA9IGZpbmFsbHlFbnRyeSA/IGZpbmFsbHlFbnRyeS5jb21wbGV0aW9uIDoge307XG4gICAgICByZXR1cm4gcmVjb3JkLnR5cGUgPSB0eXBlLCByZWNvcmQuYXJnID0gYXJnLCBmaW5hbGx5RW50cnkgPyAodGhpcy5tZXRob2QgPSBcIm5leHRcIiwgdGhpcy5uZXh0ID0gZmluYWxseUVudHJ5LmZpbmFsbHlMb2MsIENvbnRpbnVlU2VudGluZWwpIDogdGhpcy5jb21wbGV0ZShyZWNvcmQpO1xuICAgIH0sXG4gICAgY29tcGxldGU6IGZ1bmN0aW9uIGNvbXBsZXRlKHJlY29yZCwgYWZ0ZXJMb2MpIHtcbiAgICAgIGlmIChcInRocm93XCIgPT09IHJlY29yZC50eXBlKSB0aHJvdyByZWNvcmQuYXJnO1xuICAgICAgcmV0dXJuIFwiYnJlYWtcIiA9PT0gcmVjb3JkLnR5cGUgfHwgXCJjb250aW51ZVwiID09PSByZWNvcmQudHlwZSA/IHRoaXMubmV4dCA9IHJlY29yZC5hcmcgOiBcInJldHVyblwiID09PSByZWNvcmQudHlwZSA/ICh0aGlzLnJ2YWwgPSB0aGlzLmFyZyA9IHJlY29yZC5hcmcsIHRoaXMubWV0aG9kID0gXCJyZXR1cm5cIiwgdGhpcy5uZXh0ID0gXCJlbmRcIikgOiBcIm5vcm1hbFwiID09PSByZWNvcmQudHlwZSAmJiBhZnRlckxvYyAmJiAodGhpcy5uZXh0ID0gYWZ0ZXJMb2MpLCBDb250aW51ZVNlbnRpbmVsO1xuICAgIH0sXG4gICAgZmluaXNoOiBmdW5jdGlvbiBmaW5pc2goZmluYWxseUxvYykge1xuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIGlmIChlbnRyeS5maW5hbGx5TG9jID09PSBmaW5hbGx5TG9jKSByZXR1cm4gdGhpcy5jb21wbGV0ZShlbnRyeS5jb21wbGV0aW9uLCBlbnRyeS5hZnRlckxvYyksIHJlc2V0VHJ5RW50cnkoZW50cnkpLCBDb250aW51ZVNlbnRpbmVsO1xuICAgICAgfVxuICAgIH0sXG4gICAgXCJjYXRjaFwiOiBmdW5jdGlvbiBfY2F0Y2godHJ5TG9jKSB7XG4gICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTtcblxuICAgICAgICBpZiAoZW50cnkudHJ5TG9jID09PSB0cnlMb2MpIHtcbiAgICAgICAgICB2YXIgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbjtcblxuICAgICAgICAgIGlmIChcInRocm93XCIgPT09IHJlY29yZC50eXBlKSB7XG4gICAgICAgICAgICB2YXIgdGhyb3duID0gcmVjb3JkLmFyZztcbiAgICAgICAgICAgIHJlc2V0VHJ5RW50cnkoZW50cnkpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB0aHJvd247XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaWxsZWdhbCBjYXRjaCBhdHRlbXB0XCIpO1xuICAgIH0sXG4gICAgZGVsZWdhdGVZaWVsZDogZnVuY3Rpb24gZGVsZWdhdGVZaWVsZChpdGVyYWJsZSwgcmVzdWx0TmFtZSwgbmV4dExvYykge1xuICAgICAgcmV0dXJuIHRoaXMuZGVsZWdhdGUgPSB7XG4gICAgICAgIGl0ZXJhdG9yOiB2YWx1ZXMoaXRlcmFibGUpLFxuICAgICAgICByZXN1bHROYW1lOiByZXN1bHROYW1lLFxuICAgICAgICBuZXh0TG9jOiBuZXh0TG9jXG4gICAgICB9LCBcIm5leHRcIiA9PT0gdGhpcy5tZXRob2QgJiYgKHRoaXMuYXJnID0gdW5kZWZpbmVkKSwgQ29udGludWVTZW50aW5lbDtcbiAgICB9XG4gIH0sIGV4cG9ydHM7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX3JlZ2VuZXJhdG9yUnVudGltZSwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzOyIsIi8vIFRPRE8oQmFiZWwgOCk6IFJlbW92ZSB0aGlzIGZpbGUuXG5cbnZhciBydW50aW1lID0gcmVxdWlyZShcIi4uL2hlbHBlcnMvcmVnZW5lcmF0b3JSdW50aW1lXCIpKCk7XG5tb2R1bGUuZXhwb3J0cyA9IHJ1bnRpbWU7XG5cbi8vIENvcGllZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWdlbmVyYXRvci9ibG9iL21haW4vcGFja2FnZXMvcnVudGltZS9ydW50aW1lLmpzI0w3MzY9XG50cnkge1xuICByZWdlbmVyYXRvclJ1bnRpbWUgPSBydW50aW1lO1xufSBjYXRjaCAoYWNjaWRlbnRhbFN0cmljdE1vZGUpIHtcbiAgaWYgKHR5cGVvZiBnbG9iYWxUaGlzID09PSBcIm9iamVjdFwiKSB7XG4gICAgZ2xvYmFsVGhpcy5yZWdlbmVyYXRvclJ1bnRpbWUgPSBydW50aW1lO1xuICB9IGVsc2Uge1xuICAgIEZ1bmN0aW9uKFwiclwiLCBcInJlZ2VuZXJhdG9yUnVudGltZSA9IHJcIikocnVudGltZSk7XG4gIH1cbn1cbiIsImZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7XG4gIHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7XG4gICAgXCJkZWZhdWx0XCI6IG9ialxuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQsIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0czsiLCJmdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShzb3VyY2UsIGV4Y2x1ZGVkKSB7XG4gIGlmIChzb3VyY2UgPT0gbnVsbCkgcmV0dXJuIHt9O1xuICB2YXIgdGFyZ2V0ID0ge307XG4gIHZhciBzb3VyY2VLZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTtcbiAgdmFyIGtleSwgaTtcblxuICBmb3IgKGkgPSAwOyBpIDwgc291cmNlS2V5cy5sZW5ndGg7IGkrKykge1xuICAgIGtleSA9IHNvdXJjZUtleXNbaV07XG4gICAgaWYgKGV4Y2x1ZGVkLmluZGV4T2Yoa2V5KSA+PSAwKSBjb250aW51ZTtcbiAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZSwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzOyIsInZhciBvYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlID0gcmVxdWlyZShcIi4vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZS5qc1wiKTtcblxuZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKHNvdXJjZSwgZXhjbHVkZWQpIHtcbiAgaWYgKHNvdXJjZSA9PSBudWxsKSByZXR1cm4ge307XG4gIHZhciB0YXJnZXQgPSBvYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKHNvdXJjZSwgZXhjbHVkZWQpO1xuICB2YXIga2V5LCBpO1xuXG4gIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgdmFyIHNvdXJjZVN5bWJvbEtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHNvdXJjZSk7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgc291cmNlU3ltYm9sS2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAga2V5ID0gc291cmNlU3ltYm9sS2V5c1tpXTtcbiAgICAgIGlmIChleGNsdWRlZC5pbmRleE9mKGtleSkgPj0gMCkgY29udGludWU7XG4gICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzb3VyY2UsIGtleSkpIGNvbnRpbnVlO1xuICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcywgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzOyIsImZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHtcbiAgaWYgKGtleSBpbiBvYmopIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHtcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB3cml0YWJsZTogdHJ1ZVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIG9ialtrZXldID0gdmFsdWU7XG4gIH1cblxuICByZXR1cm4gb2JqO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9kZWZpbmVQcm9wZXJ0eSwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzOyIsIi8qKlxuICogVGhpcyBmaWxlIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGZyb20gYHByZS1wdWJsaXNoLmpzYC5cbiAqIERvIG5vdCBtYW51YWxseSBlZGl0LlxuICovXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBcImFyZWFcIjogdHJ1ZSxcbiAgXCJiYXNlXCI6IHRydWUsXG4gIFwiYnJcIjogdHJ1ZSxcbiAgXCJjb2xcIjogdHJ1ZSxcbiAgXCJlbWJlZFwiOiB0cnVlLFxuICBcImhyXCI6IHRydWUsXG4gIFwiaW1nXCI6IHRydWUsXG4gIFwiaW5wdXRcIjogdHJ1ZSxcbiAgXCJsaW5rXCI6IHRydWUsXG4gIFwibWV0YVwiOiB0cnVlLFxuICBcInBhcmFtXCI6IHRydWUsXG4gIFwic291cmNlXCI6IHRydWUsXG4gIFwidHJhY2tcIjogdHJ1ZSxcbiAgXCJ3YnJcIjogdHJ1ZVxufTtcbiIsInZhciBlLHQ9KGU9cmVxdWlyZShcInZvaWQtZWxlbWVudHNcIikpJiZcIm9iamVjdFwiPT10eXBlb2YgZSYmXCJkZWZhdWx0XCJpbiBlP2UuZGVmYXVsdDplLG49L1xccyhbXidcIi9cXHM+PF0rPylbXFxzLz5dfChbXlxccz1dKyk9XFxzPyhcIi4qP1wifCcuKj8nKS9nO2Z1bmN0aW9uIHIoZSl7dmFyIHI9e3R5cGU6XCJ0YWdcIixuYW1lOlwiXCIsdm9pZEVsZW1lbnQ6ITEsYXR0cnM6e30sY2hpbGRyZW46W119LGk9ZS5tYXRjaCgvPFxcLz8oW15cXHNdKz8pWy9cXHM+XS8pO2lmKGkmJihyLm5hbWU9aVsxXSwodFtpWzFdXXx8XCIvXCI9PT1lLmNoYXJBdChlLmxlbmd0aC0yKSkmJihyLnZvaWRFbGVtZW50PSEwKSxyLm5hbWUuc3RhcnRzV2l0aChcIiEtLVwiKSkpe3ZhciBzPWUuaW5kZXhPZihcIi0tXFx4M2VcIik7cmV0dXJue3R5cGU6XCJjb21tZW50XCIsY29tbWVudDotMSE9PXM/ZS5zbGljZSg0LHMpOlwiXCJ9fWZvcih2YXIgYz1uZXcgUmVnRXhwKG4pLGE9bnVsbDtudWxsIT09KGE9Yy5leGVjKGUpKTspaWYoYVswXS50cmltKCkpaWYoYVsxXSl7dmFyIG89YVsxXS50cmltKCksdT1bbyxcIlwiXTtvLmluZGV4T2YoXCI9XCIpPi0xJiYodT1vLnNwbGl0KFwiPVwiKSksci5hdHRyc1t1WzBdXT11WzFdLGMubGFzdEluZGV4LS19ZWxzZSBhWzJdJiYoci5hdHRyc1thWzJdXT1hWzNdLnRyaW0oKS5zdWJzdHJpbmcoMSxhWzNdLmxlbmd0aC0xKSk7cmV0dXJuIHJ9dmFyIGk9LzxbYS16QS1aMC05XFwtXFwhXFwvXSg/OlwiW15cIl0qXCJ8J1teJ10qJ3xbXidcIj5dKSo+L2cscz0vXlxccyokLyxjPU9iamVjdC5jcmVhdGUobnVsbCk7ZnVuY3Rpb24gYShlLHQpe3N3aXRjaCh0LnR5cGUpe2Nhc2VcInRleHRcIjpyZXR1cm4gZSt0LmNvbnRlbnQ7Y2FzZVwidGFnXCI6cmV0dXJuIGUrPVwiPFwiK3QubmFtZSsodC5hdHRycz9mdW5jdGlvbihlKXt2YXIgdD1bXTtmb3IodmFyIG4gaW4gZSl0LnB1c2gobisnPVwiJytlW25dKydcIicpO3JldHVybiB0Lmxlbmd0aD9cIiBcIit0LmpvaW4oXCIgXCIpOlwiXCJ9KHQuYXR0cnMpOlwiXCIpKyh0LnZvaWRFbGVtZW50P1wiLz5cIjpcIj5cIiksdC52b2lkRWxlbWVudD9lOmUrdC5jaGlsZHJlbi5yZWR1Y2UoYSxcIlwiKStcIjwvXCIrdC5uYW1lK1wiPlwiO2Nhc2VcImNvbW1lbnRcIjpyZXR1cm4gZStcIlxceDNjIS0tXCIrdC5jb21tZW50K1wiLS1cXHgzZVwifX1tb2R1bGUuZXhwb3J0cz17cGFyc2U6ZnVuY3Rpb24oZSx0KXt0fHwodD17fSksdC5jb21wb25lbnRzfHwodC5jb21wb25lbnRzPWMpO3ZhciBuLGE9W10sbz1bXSx1PS0xLGw9ITE7aWYoMCE9PWUuaW5kZXhPZihcIjxcIikpe3ZhciBtPWUuaW5kZXhPZihcIjxcIik7YS5wdXNoKHt0eXBlOlwidGV4dFwiLGNvbnRlbnQ6LTE9PT1tP2U6ZS5zdWJzdHJpbmcoMCxtKX0pfXJldHVybiBlLnJlcGxhY2UoaSxmdW5jdGlvbihpLGMpe2lmKGwpe2lmKGkhPT1cIjwvXCIrbi5uYW1lK1wiPlwiKXJldHVybjtsPSExfXZhciBtLGQ9XCIvXCIhPT1pLmNoYXJBdCgxKSxmPWkuc3RhcnRzV2l0aChcIlxceDNjIS0tXCIpLGg9YytpLmxlbmd0aCxwPWUuY2hhckF0KGgpO2lmKGYpe3ZhciB2PXIoaSk7cmV0dXJuIHU8MD8oYS5wdXNoKHYpLGEpOigobT1vW3VdKS5jaGlsZHJlbi5wdXNoKHYpLGEpfWlmKGQmJih1KyssXCJ0YWdcIj09PShuPXIoaSkpLnR5cGUmJnQuY29tcG9uZW50c1tuLm5hbWVdJiYobi50eXBlPVwiY29tcG9uZW50XCIsbD0hMCksbi52b2lkRWxlbWVudHx8bHx8IXB8fFwiPFwiPT09cHx8bi5jaGlsZHJlbi5wdXNoKHt0eXBlOlwidGV4dFwiLGNvbnRlbnQ6ZS5zbGljZShoLGUuaW5kZXhPZihcIjxcIixoKSl9KSwwPT09dSYmYS5wdXNoKG4pLChtPW9bdS0xXSkmJm0uY2hpbGRyZW4ucHVzaChuKSxvW3VdPW4pLCghZHx8bi52b2lkRWxlbWVudCkmJih1Pi0xJiYobi52b2lkRWxlbWVudHx8bi5uYW1lPT09aS5zbGljZSgyLC0xKSkmJih1LS0sbj0tMT09PXU/YTpvW3VdKSwhbCYmXCI8XCIhPT1wJiZwKSl7bT0tMT09PXU/YTpvW3VdLmNoaWxkcmVuO3ZhciB4PWUuaW5kZXhPZihcIjxcIixoKSxnPWUuc2xpY2UoaCwtMT09PXg/dm9pZCAwOngpO3MudGVzdChnKSYmKGc9XCIgXCIpLCh4Pi0xJiZ1K20ubGVuZ3RoPj0wfHxcIiBcIiE9PWcpJiZtLnB1c2goe3R5cGU6XCJ0ZXh0XCIsY29udGVudDpnfSl9fSksYX0sc3RyaW5naWZ5OmZ1bmN0aW9uKGUpe3JldHVybiBlLnJlZHVjZShmdW5jdGlvbihlLHQpe3JldHVybiBlK2EoXCJcIix0KX0sXCJcIil9fTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWh0bWwtcGFyc2Utc3RyaW5naWZ5LmpzLm1hcFxuIiwiZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3Rvcikge1xuICBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfY2xhc3NDYWxsQ2hlY2ssIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0czsiLCJmdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldO1xuICAgIGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTtcbiAgICBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7XG4gICAgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykge1xuICBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTtcbiAgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ29uc3RydWN0b3IsIFwicHJvdG90eXBlXCIsIHtcbiAgICB3cml0YWJsZTogZmFsc2VcbiAgfSk7XG4gIHJldHVybiBDb25zdHJ1Y3Rvcjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfY3JlYXRlQ2xhc3MsIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0czsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMudW5lc2NhcGUgPSB2b2lkIDA7XG52YXIgbWF0Y2hIdG1sRW50aXR5ID0gLyYoPzphbXB8IzM4fGx0fCM2MHxndHwjNjJ8YXBvc3wjMzl8cXVvdHwjMzR8bmJzcHwjMTYwfGNvcHl8IzE2OXxyZWd8IzE3NHxoZWxsaXB8IzgyMzB8I3gyRnwjNDcpOy9nO1xudmFyIGh0bWxFbnRpdGllcyA9IHtcbiAgJyZhbXA7JzogJyYnLFxuICAnJiMzODsnOiAnJicsXG4gICcmbHQ7JzogJzwnLFxuICAnJiM2MDsnOiAnPCcsXG4gICcmZ3Q7JzogJz4nLFxuICAnJiM2MjsnOiAnPicsXG4gICcmYXBvczsnOiBcIidcIixcbiAgJyYjMzk7JzogXCInXCIsXG4gICcmcXVvdDsnOiAnXCInLFxuICAnJiMzNDsnOiAnXCInLFxuICAnJm5ic3A7JzogJyAnLFxuICAnJiMxNjA7JzogJyAnLFxuICAnJmNvcHk7JzogJ8KpJyxcbiAgJyYjMTY5Oyc6ICfCqScsXG4gICcmcmVnOyc6ICfCricsXG4gICcmIzE3NDsnOiAnwq4nLFxuICAnJmhlbGxpcDsnOiAn4oCmJyxcbiAgJyYjODIzMDsnOiAn4oCmJyxcbiAgJyYjeDJGOyc6ICcvJyxcbiAgJyYjNDc7JzogJy8nXG59O1xuXG52YXIgdW5lc2NhcGVIdG1sRW50aXR5ID0gZnVuY3Rpb24gdW5lc2NhcGVIdG1sRW50aXR5KG0pIHtcbiAgcmV0dXJuIGh0bWxFbnRpdGllc1ttXTtcbn07XG5cbnZhciB1bmVzY2FwZSA9IGZ1bmN0aW9uIHVuZXNjYXBlKHRleHQpIHtcbiAgcmV0dXJuIHRleHQucmVwbGFjZShtYXRjaEh0bWxFbnRpdHksIHVuZXNjYXBlSHRtbEVudGl0eSk7XG59O1xuXG5leHBvcnRzLnVuZXNjYXBlID0gdW5lc2NhcGU7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5zZXREZWZhdWx0cyA9IHNldERlZmF1bHRzO1xuZXhwb3J0cy5nZXREZWZhdWx0cyA9IGdldERlZmF1bHRzO1xuZXhwb3J0cy5zZXRJMThuID0gc2V0STE4bjtcbmV4cG9ydHMuZ2V0STE4biA9IGdldEkxOG47XG5leHBvcnRzLmNvbXBvc2VJbml0aWFsUHJvcHMgPSBjb21wb3NlSW5pdGlhbFByb3BzO1xuZXhwb3J0cy5nZXRJbml0aWFsUHJvcHMgPSBnZXRJbml0aWFsUHJvcHM7XG5leHBvcnRzLmluaXRSZWFjdEkxOG5leHQgPSBleHBvcnRzLlJlcG9ydE5hbWVzcGFjZXMgPSBleHBvcnRzLkkxOG5Db250ZXh0ID0gdm9pZCAwO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2tcIikpO1xuXG52YXIgX2NyZWF0ZUNsYXNzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY3JlYXRlQ2xhc3NcIikpO1xuXG52YXIgX2RlZmluZVByb3BlcnR5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIikpO1xuXG52YXIgX3JlYWN0ID0gcmVxdWlyZShcInJlYWN0XCIpO1xuXG52YXIgX3VuZXNjYXBlID0gcmVxdWlyZShcIi4vdW5lc2NhcGVcIik7XG5cbmZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkgeyB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOyBpZiAoZW51bWVyYWJsZU9ubHkpIHsgc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7IH0pOyB9IGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTsgfSByZXR1cm4ga2V5czsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldICE9IG51bGwgPyBhcmd1bWVudHNbaV0gOiB7fTsgaWYgKGkgJSAyKSB7IG93bktleXMoT2JqZWN0KHNvdXJjZSksIHRydWUpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyAoMCwgX2RlZmluZVByb3BlcnR5MltcImRlZmF1bHRcIl0pKHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pOyB9IGVsc2UgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSk7IH0gZWxzZSB7IG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTsgfSk7IH0gfSByZXR1cm4gdGFyZ2V0OyB9XG5cbnZhciBkZWZhdWx0T3B0aW9ucyA9IHtcbiAgYmluZEkxOG46ICdsYW5ndWFnZUNoYW5nZWQnLFxuICBiaW5kSTE4blN0b3JlOiAnJyxcbiAgdHJhbnNFbXB0eU5vZGVWYWx1ZTogJycsXG4gIHRyYW5zU3VwcG9ydEJhc2ljSHRtbE5vZGVzOiB0cnVlLFxuICB0cmFuc1dyYXBUZXh0Tm9kZXM6ICcnLFxuICB0cmFuc0tlZXBCYXNpY0h0bWxOb2Rlc0ZvcjogWydicicsICdzdHJvbmcnLCAnaScsICdwJ10sXG4gIHVzZVN1c3BlbnNlOiB0cnVlLFxuICB1bmVzY2FwZTogX3VuZXNjYXBlLnVuZXNjYXBlXG59O1xudmFyIGkxOG5JbnN0YW5jZTtcbnZhciBJMThuQ29udGV4dCA9ICgwLCBfcmVhY3QuY3JlYXRlQ29udGV4dCkoKTtcbmV4cG9ydHMuSTE4bkNvbnRleHQgPSBJMThuQ29udGV4dDtcblxuZnVuY3Rpb24gc2V0RGVmYXVsdHMoKSB7XG4gIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcbiAgZGVmYXVsdE9wdGlvbnMgPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGRlZmF1bHRPcHRpb25zKSwgb3B0aW9ucyk7XG59XG5cbmZ1bmN0aW9uIGdldERlZmF1bHRzKCkge1xuICByZXR1cm4gZGVmYXVsdE9wdGlvbnM7XG59XG5cbnZhciBSZXBvcnROYW1lc3BhY2VzID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBSZXBvcnROYW1lc3BhY2VzKCkge1xuICAgICgwLCBfY2xhc3NDYWxsQ2hlY2syW1wiZGVmYXVsdFwiXSkodGhpcywgUmVwb3J0TmFtZXNwYWNlcyk7XG4gICAgdGhpcy51c2VkTmFtZXNwYWNlcyA9IHt9O1xuICB9XG5cbiAgKDAsIF9jcmVhdGVDbGFzczJbXCJkZWZhdWx0XCJdKShSZXBvcnROYW1lc3BhY2VzLCBbe1xuICAgIGtleTogXCJhZGRVc2VkTmFtZXNwYWNlc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhZGRVc2VkTmFtZXNwYWNlcyhuYW1lc3BhY2VzKSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICBuYW1lc3BhY2VzLmZvckVhY2goZnVuY3Rpb24gKG5zKSB7XG4gICAgICAgIGlmICghX3RoaXMudXNlZE5hbWVzcGFjZXNbbnNdKSBfdGhpcy51c2VkTmFtZXNwYWNlc1tuc10gPSB0cnVlO1xuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldFVzZWROYW1lc3BhY2VzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldFVzZWROYW1lc3BhY2VzKCkge1xuICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMudXNlZE5hbWVzcGFjZXMpO1xuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gUmVwb3J0TmFtZXNwYWNlcztcbn0oKTtcblxuZXhwb3J0cy5SZXBvcnROYW1lc3BhY2VzID0gUmVwb3J0TmFtZXNwYWNlcztcblxuZnVuY3Rpb24gc2V0STE4bihpbnN0YW5jZSkge1xuICBpMThuSW5zdGFuY2UgPSBpbnN0YW5jZTtcbn1cblxuZnVuY3Rpb24gZ2V0STE4bigpIHtcbiAgcmV0dXJuIGkxOG5JbnN0YW5jZTtcbn1cblxudmFyIGluaXRSZWFjdEkxOG5leHQgPSB7XG4gIHR5cGU6ICczcmRQYXJ0eScsXG4gIGluaXQ6IGZ1bmN0aW9uIGluaXQoaW5zdGFuY2UpIHtcbiAgICBzZXREZWZhdWx0cyhpbnN0YW5jZS5vcHRpb25zLnJlYWN0KTtcbiAgICBzZXRJMThuKGluc3RhbmNlKTtcbiAgfVxufTtcbmV4cG9ydHMuaW5pdFJlYWN0STE4bmV4dCA9IGluaXRSZWFjdEkxOG5leHQ7XG5cbmZ1bmN0aW9uIGNvbXBvc2VJbml0aWFsUHJvcHMoRm9yQ29tcG9uZW50KSB7XG4gIHJldHVybiBmdW5jdGlvbiAoY3R4KSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICB2YXIgaTE4bkluaXRpYWxQcm9wcyA9IGdldEluaXRpYWxQcm9wcygpO1xuXG4gICAgICBpZiAoRm9yQ29tcG9uZW50LmdldEluaXRpYWxQcm9wcykge1xuICAgICAgICBGb3JDb21wb25lbnQuZ2V0SW5pdGlhbFByb3BzKGN0eCkudGhlbihmdW5jdGlvbiAoY29tcG9uZW50c0luaXRpYWxQcm9wcykge1xuICAgICAgICAgIHJlc29sdmUoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBjb21wb25lbnRzSW5pdGlhbFByb3BzKSwgaTE4bkluaXRpYWxQcm9wcykpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc29sdmUoaTE4bkluaXRpYWxQcm9wcyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGdldEluaXRpYWxQcm9wcygpIHtcbiAgdmFyIGkxOG4gPSBnZXRJMThuKCk7XG4gIHZhciBuYW1lc3BhY2VzID0gaTE4bi5yZXBvcnROYW1lc3BhY2VzID8gaTE4bi5yZXBvcnROYW1lc3BhY2VzLmdldFVzZWROYW1lc3BhY2VzKCkgOiBbXTtcbiAgdmFyIHJldCA9IHt9O1xuICB2YXIgaW5pdGlhbEkxOG5TdG9yZSA9IHt9O1xuICBpMThuLmxhbmd1YWdlcy5mb3JFYWNoKGZ1bmN0aW9uIChsKSB7XG4gICAgaW5pdGlhbEkxOG5TdG9yZVtsXSA9IHt9O1xuICAgIG5hbWVzcGFjZXMuZm9yRWFjaChmdW5jdGlvbiAobnMpIHtcbiAgICAgIGluaXRpYWxJMThuU3RvcmVbbF1bbnNdID0gaTE4bi5nZXRSZXNvdXJjZUJ1bmRsZShsLCBucykgfHwge307XG4gICAgfSk7XG4gIH0pO1xuICByZXQuaW5pdGlhbEkxOG5TdG9yZSA9IGluaXRpYWxJMThuU3RvcmU7XG4gIHJldC5pbml0aWFsTGFuZ3VhZ2UgPSBpMThuLmxhbmd1YWdlO1xuICByZXR1cm4gcmV0O1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy53YXJuID0gd2FybjtcbmV4cG9ydHMud2Fybk9uY2UgPSB3YXJuT25jZTtcbmV4cG9ydHMubG9hZE5hbWVzcGFjZXMgPSBsb2FkTmFtZXNwYWNlcztcbmV4cG9ydHMuaGFzTG9hZGVkTmFtZXNwYWNlID0gaGFzTG9hZGVkTmFtZXNwYWNlO1xuZXhwb3J0cy5nZXREaXNwbGF5TmFtZSA9IGdldERpc3BsYXlOYW1lO1xuXG5mdW5jdGlvbiB3YXJuKCkge1xuICBpZiAoY29uc29sZSAmJiBjb25zb2xlLndhcm4pIHtcbiAgICB2YXIgX2NvbnNvbGU7XG5cbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBhcmdzWzBdID09PSAnc3RyaW5nJykgYXJnc1swXSA9IFwicmVhY3QtaTE4bmV4dDo6IFwiLmNvbmNhdChhcmdzWzBdKTtcblxuICAgIChfY29uc29sZSA9IGNvbnNvbGUpLndhcm4uYXBwbHkoX2NvbnNvbGUsIGFyZ3MpO1xuICB9XG59XG5cbnZhciBhbHJlYWR5V2FybmVkID0ge307XG5cbmZ1bmN0aW9uIHdhcm5PbmNlKCkge1xuICBmb3IgKHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbjIpLCBfa2V5MiA9IDA7IF9rZXkyIDwgX2xlbjI7IF9rZXkyKyspIHtcbiAgICBhcmdzW19rZXkyXSA9IGFyZ3VtZW50c1tfa2V5Ml07XG4gIH1cblxuICBpZiAodHlwZW9mIGFyZ3NbMF0gPT09ICdzdHJpbmcnICYmIGFscmVhZHlXYXJuZWRbYXJnc1swXV0pIHJldHVybjtcbiAgaWYgKHR5cGVvZiBhcmdzWzBdID09PSAnc3RyaW5nJykgYWxyZWFkeVdhcm5lZFthcmdzWzBdXSA9IG5ldyBEYXRlKCk7XG4gIHdhcm4uYXBwbHkodm9pZCAwLCBhcmdzKTtcbn1cblxuZnVuY3Rpb24gbG9hZE5hbWVzcGFjZXMoaTE4biwgbnMsIGNiKSB7XG4gIGkxOG4ubG9hZE5hbWVzcGFjZXMobnMsIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoaTE4bi5pc0luaXRpYWxpemVkKSB7XG4gICAgICBjYigpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgaW5pdGlhbGl6ZWQgPSBmdW5jdGlvbiBpbml0aWFsaXplZCgpIHtcbiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaTE4bi5vZmYoJ2luaXRpYWxpemVkJywgaW5pdGlhbGl6ZWQpO1xuICAgICAgICB9LCAwKTtcbiAgICAgICAgY2IoKTtcbiAgICAgIH07XG5cbiAgICAgIGkxOG4ub24oJ2luaXRpYWxpemVkJywgaW5pdGlhbGl6ZWQpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIG9sZEkxOG5leHRIYXNMb2FkZWROYW1lc3BhY2UobnMsIGkxOG4pIHtcbiAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IHt9O1xuICB2YXIgbG5nID0gaTE4bi5sYW5ndWFnZXNbMF07XG4gIHZhciBmYWxsYmFja0xuZyA9IGkxOG4ub3B0aW9ucyA/IGkxOG4ub3B0aW9ucy5mYWxsYmFja0xuZyA6IGZhbHNlO1xuICB2YXIgbGFzdExuZyA9IGkxOG4ubGFuZ3VhZ2VzW2kxOG4ubGFuZ3VhZ2VzLmxlbmd0aCAtIDFdO1xuICBpZiAobG5nLnRvTG93ZXJDYXNlKCkgPT09ICdjaW1vZGUnKSByZXR1cm4gdHJ1ZTtcblxuICB2YXIgbG9hZE5vdFBlbmRpbmcgPSBmdW5jdGlvbiBsb2FkTm90UGVuZGluZyhsLCBuKSB7XG4gICAgdmFyIGxvYWRTdGF0ZSA9IGkxOG4uc2VydmljZXMuYmFja2VuZENvbm5lY3Rvci5zdGF0ZVtcIlwiLmNvbmNhdChsLCBcInxcIikuY29uY2F0KG4pXTtcbiAgICByZXR1cm4gbG9hZFN0YXRlID09PSAtMSB8fCBsb2FkU3RhdGUgPT09IDI7XG4gIH07XG5cbiAgaWYgKG9wdGlvbnMuYmluZEkxOG4gJiYgb3B0aW9ucy5iaW5kSTE4bi5pbmRleE9mKCdsYW5ndWFnZUNoYW5naW5nJykgPiAtMSAmJiBpMThuLnNlcnZpY2VzLmJhY2tlbmRDb25uZWN0b3IuYmFja2VuZCAmJiBpMThuLmlzTGFuZ3VhZ2VDaGFuZ2luZ1RvICYmICFsb2FkTm90UGVuZGluZyhpMThuLmlzTGFuZ3VhZ2VDaGFuZ2luZ1RvLCBucykpIHJldHVybiBmYWxzZTtcbiAgaWYgKGkxOG4uaGFzUmVzb3VyY2VCdW5kbGUobG5nLCBucykpIHJldHVybiB0cnVlO1xuICBpZiAoIWkxOG4uc2VydmljZXMuYmFja2VuZENvbm5lY3Rvci5iYWNrZW5kIHx8IGkxOG4ub3B0aW9ucy5yZXNvdXJjZXMgJiYgIWkxOG4ub3B0aW9ucy5wYXJ0aWFsQnVuZGxlZExhbmd1YWdlcykgcmV0dXJuIHRydWU7XG4gIGlmIChsb2FkTm90UGVuZGluZyhsbmcsIG5zKSAmJiAoIWZhbGxiYWNrTG5nIHx8IGxvYWROb3RQZW5kaW5nKGxhc3RMbmcsIG5zKSkpIHJldHVybiB0cnVlO1xuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGhhc0xvYWRlZE5hbWVzcGFjZShucywgaTE4bikge1xuICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDoge307XG5cbiAgaWYgKCFpMThuLmxhbmd1YWdlcyB8fCAhaTE4bi5sYW5ndWFnZXMubGVuZ3RoKSB7XG4gICAgd2Fybk9uY2UoJ2kxOG4ubGFuZ3VhZ2VzIHdlcmUgdW5kZWZpbmVkIG9yIGVtcHR5JywgaTE4bi5sYW5ndWFnZXMpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgdmFyIGlzTmV3ZXJJMThuZXh0ID0gaTE4bi5vcHRpb25zLmlnbm9yZUpTT05TdHJ1Y3R1cmUgIT09IHVuZGVmaW5lZDtcblxuICBpZiAoIWlzTmV3ZXJJMThuZXh0KSB7XG4gICAgcmV0dXJuIG9sZEkxOG5leHRIYXNMb2FkZWROYW1lc3BhY2UobnMsIGkxOG4sIG9wdGlvbnMpO1xuICB9XG5cbiAgcmV0dXJuIGkxOG4uaGFzTG9hZGVkTmFtZXNwYWNlKG5zLCB7XG4gICAgcHJlY2hlY2s6IGZ1bmN0aW9uIHByZWNoZWNrKGkxOG5JbnN0YW5jZSwgbG9hZE5vdFBlbmRpbmcpIHtcbiAgICAgIGlmIChvcHRpb25zLmJpbmRJMThuICYmIG9wdGlvbnMuYmluZEkxOG4uaW5kZXhPZignbGFuZ3VhZ2VDaGFuZ2luZycpID4gLTEgJiYgaTE4bkluc3RhbmNlLnNlcnZpY2VzLmJhY2tlbmRDb25uZWN0b3IuYmFja2VuZCAmJiBpMThuSW5zdGFuY2UuaXNMYW5ndWFnZUNoYW5naW5nVG8gJiYgIWxvYWROb3RQZW5kaW5nKGkxOG5JbnN0YW5jZS5pc0xhbmd1YWdlQ2hhbmdpbmdUbywgbnMpKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0RGlzcGxheU5hbWUoQ29tcG9uZW50KSB7XG4gIHJldHVybiBDb21wb25lbnQuZGlzcGxheU5hbWUgfHwgQ29tcG9uZW50Lm5hbWUgfHwgKHR5cGVvZiBDb21wb25lbnQgPT09ICdzdHJpbmcnICYmIENvbXBvbmVudC5sZW5ndGggPiAwID8gQ29tcG9uZW50IDogJ1Vua25vd24nKTtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLm5vZGVzVG9TdHJpbmcgPSBub2Rlc1RvU3RyaW5nO1xuZXhwb3J0cy5UcmFucyA9IFRyYW5zO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIikpO1xuXG52YXIgX3R5cGVvZjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3R5cGVvZlwiKSk7XG5cbnZhciBfZGVmaW5lUHJvcGVydHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiKSk7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKFwicmVhY3RcIik7XG5cbnZhciBfaHRtbFBhcnNlU3RyaW5naWZ5ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiaHRtbC1wYXJzZS1zdHJpbmdpZnlcIikpO1xuXG52YXIgX2NvbnRleHQgPSByZXF1aXJlKFwiLi9jb250ZXh0XCIpO1xuXG52YXIgX3V0aWxzID0gcmVxdWlyZShcIi4vdXRpbHNcIik7XG5cbnZhciBfZXhjbHVkZWQgPSBbXCJmb3JtYXRcIl0sXG4gICAgX2V4Y2x1ZGVkMiA9IFtcImNoaWxkcmVuXCIsIFwiY291bnRcIiwgXCJwYXJlbnRcIiwgXCJpMThuS2V5XCIsIFwiY29udGV4dFwiLCBcInRPcHRpb25zXCIsIFwidmFsdWVzXCIsIFwiZGVmYXVsdHNcIiwgXCJjb21wb25lbnRzXCIsIFwibnNcIiwgXCJpMThuXCIsIFwidFwiLCBcInNob3VsZFVuZXNjYXBlXCJdO1xuXG5mdW5jdGlvbiBvd25LZXlzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHsgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTsgaWYgKGVudW1lcmFibGVPbmx5KSB7IHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlOyB9KTsgfSBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7IH0gcmV0dXJuIGtleXM7IH1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXSAhPSBudWxsID8gYXJndW1lbnRzW2ldIDoge307IGlmIChpICUgMikgeyBvd25LZXlzKE9iamVjdChzb3VyY2UpLCB0cnVlKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOyB9KTsgfSBlbHNlIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycykgeyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpOyB9IGVsc2UgeyBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7IH0pOyB9IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBoYXNDaGlsZHJlbihub2RlLCBjaGVja0xlbmd0aCkge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcbiAgdmFyIGJhc2UgPSBub2RlLnByb3BzID8gbm9kZS5wcm9wcy5jaGlsZHJlbiA6IG5vZGUuY2hpbGRyZW47XG4gIGlmIChjaGVja0xlbmd0aCkgcmV0dXJuIGJhc2UubGVuZ3RoID4gMDtcbiAgcmV0dXJuICEhYmFzZTtcbn1cblxuZnVuY3Rpb24gZ2V0Q2hpbGRyZW4obm9kZSkge1xuICBpZiAoIW5vZGUpIHJldHVybiBbXTtcbiAgcmV0dXJuIG5vZGUucHJvcHMgPyBub2RlLnByb3BzLmNoaWxkcmVuIDogbm9kZS5jaGlsZHJlbjtcbn1cblxuZnVuY3Rpb24gaGFzVmFsaWRSZWFjdENoaWxkcmVuKGNoaWxkcmVuKSB7XG4gIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoY2hpbGRyZW4pICE9PSAnW29iamVjdCBBcnJheV0nKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiBjaGlsZHJlbi5ldmVyeShmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICByZXR1cm4gKDAsIF9yZWFjdC5pc1ZhbGlkRWxlbWVudCkoY2hpbGQpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0QXNBcnJheShkYXRhKSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KGRhdGEpID8gZGF0YSA6IFtkYXRhXTtcbn1cblxuZnVuY3Rpb24gbWVyZ2VQcm9wcyhzb3VyY2UsIHRhcmdldCkge1xuICB2YXIgbmV3VGFyZ2V0ID0gX29iamVjdFNwcmVhZCh7fSwgdGFyZ2V0KTtcblxuICBuZXdUYXJnZXQucHJvcHMgPSBPYmplY3QuYXNzaWduKHNvdXJjZS5wcm9wcywgdGFyZ2V0LnByb3BzKTtcbiAgcmV0dXJuIG5ld1RhcmdldDtcbn1cblxuZnVuY3Rpb24gbm9kZXNUb1N0cmluZyhjaGlsZHJlbiwgaTE4bk9wdGlvbnMpIHtcbiAgaWYgKCFjaGlsZHJlbikgcmV0dXJuICcnO1xuICB2YXIgc3RyaW5nTm9kZSA9ICcnO1xuICB2YXIgY2hpbGRyZW5BcnJheSA9IGdldEFzQXJyYXkoY2hpbGRyZW4pO1xuICB2YXIga2VlcEFycmF5ID0gaTE4bk9wdGlvbnMudHJhbnNTdXBwb3J0QmFzaWNIdG1sTm9kZXMgJiYgaTE4bk9wdGlvbnMudHJhbnNLZWVwQmFzaWNIdG1sTm9kZXNGb3IgPyBpMThuT3B0aW9ucy50cmFuc0tlZXBCYXNpY0h0bWxOb2Rlc0ZvciA6IFtdO1xuICBjaGlsZHJlbkFycmF5LmZvckVhY2goZnVuY3Rpb24gKGNoaWxkLCBjaGlsZEluZGV4KSB7XG4gICAgaWYgKHR5cGVvZiBjaGlsZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHN0cmluZ05vZGUgKz0gXCJcIi5jb25jYXQoY2hpbGQpO1xuICAgIH0gZWxzZSBpZiAoKDAsIF9yZWFjdC5pc1ZhbGlkRWxlbWVudCkoY2hpbGQpKSB7XG4gICAgICB2YXIgY2hpbGRQcm9wc0NvdW50ID0gT2JqZWN0LmtleXMoY2hpbGQucHJvcHMpLmxlbmd0aDtcbiAgICAgIHZhciBzaG91bGRLZWVwQ2hpbGQgPSBrZWVwQXJyYXkuaW5kZXhPZihjaGlsZC50eXBlKSA+IC0xO1xuICAgICAgdmFyIGNoaWxkQ2hpbGRyZW4gPSBjaGlsZC5wcm9wcy5jaGlsZHJlbjtcblxuICAgICAgaWYgKCFjaGlsZENoaWxkcmVuICYmIHNob3VsZEtlZXBDaGlsZCAmJiBjaGlsZFByb3BzQ291bnQgPT09IDApIHtcbiAgICAgICAgc3RyaW5nTm9kZSArPSBcIjxcIi5jb25jYXQoY2hpbGQudHlwZSwgXCIvPlwiKTtcbiAgICAgIH0gZWxzZSBpZiAoIWNoaWxkQ2hpbGRyZW4gJiYgKCFzaG91bGRLZWVwQ2hpbGQgfHwgY2hpbGRQcm9wc0NvdW50ICE9PSAwKSkge1xuICAgICAgICBzdHJpbmdOb2RlICs9IFwiPFwiLmNvbmNhdChjaGlsZEluZGV4LCBcIj48L1wiKS5jb25jYXQoY2hpbGRJbmRleCwgXCI+XCIpO1xuICAgICAgfSBlbHNlIGlmIChjaGlsZC5wcm9wcy5pMThuSXNEeW5hbWljTGlzdCkge1xuICAgICAgICBzdHJpbmdOb2RlICs9IFwiPFwiLmNvbmNhdChjaGlsZEluZGV4LCBcIj48L1wiKS5jb25jYXQoY2hpbGRJbmRleCwgXCI+XCIpO1xuICAgICAgfSBlbHNlIGlmIChzaG91bGRLZWVwQ2hpbGQgJiYgY2hpbGRQcm9wc0NvdW50ID09PSAxICYmIHR5cGVvZiBjaGlsZENoaWxkcmVuID09PSAnc3RyaW5nJykge1xuICAgICAgICBzdHJpbmdOb2RlICs9IFwiPFwiLmNvbmNhdChjaGlsZC50eXBlLCBcIj5cIikuY29uY2F0KGNoaWxkQ2hpbGRyZW4sIFwiPC9cIikuY29uY2F0KGNoaWxkLnR5cGUsIFwiPlwiKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBjb250ZW50ID0gbm9kZXNUb1N0cmluZyhjaGlsZENoaWxkcmVuLCBpMThuT3B0aW9ucyk7XG4gICAgICAgIHN0cmluZ05vZGUgKz0gXCI8XCIuY29uY2F0KGNoaWxkSW5kZXgsIFwiPlwiKS5jb25jYXQoY29udGVudCwgXCI8L1wiKS5jb25jYXQoY2hpbGRJbmRleCwgXCI+XCIpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoY2hpbGQgPT09IG51bGwpIHtcbiAgICAgICgwLCBfdXRpbHMud2FybikoXCJUcmFuczogdGhlIHBhc3NlZCBpbiB2YWx1ZSBpcyBpbnZhbGlkIC0gc2VlbXMgeW91IHBhc3NlZCBpbiBhIG51bGwgY2hpbGQuXCIpO1xuICAgIH0gZWxzZSBpZiAoKDAsIF90eXBlb2YyW1wiZGVmYXVsdFwiXSkoY2hpbGQpID09PSAnb2JqZWN0Jykge1xuICAgICAgdmFyIGZvcm1hdCA9IGNoaWxkLmZvcm1hdCxcbiAgICAgICAgICBjbG9uZSA9ICgwLCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyW1wiZGVmYXVsdFwiXSkoY2hpbGQsIF9leGNsdWRlZCk7XG4gICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGNsb25lKTtcblxuICAgICAgaWYgKGtleXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IGZvcm1hdCA/IFwiXCIuY29uY2F0KGtleXNbMF0sIFwiLCBcIikuY29uY2F0KGZvcm1hdCkgOiBrZXlzWzBdO1xuICAgICAgICBzdHJpbmdOb2RlICs9IFwie3tcIi5jb25jYXQodmFsdWUsIFwifX1cIik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAoMCwgX3V0aWxzLndhcm4pKFwicmVhY3QtaTE4bmV4dDogdGhlIHBhc3NlZCBpbiBvYmplY3QgY29udGFpbmVkIG1vcmUgdGhhbiBvbmUgdmFyaWFibGUgLSB0aGUgb2JqZWN0IHNob3VsZCBsb29rIGxpa2Uge3sgdmFsdWUsIGZvcm1hdCB9fSB3aGVyZSBmb3JtYXQgaXMgb3B0aW9uYWwuXCIsIGNoaWxkKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgKDAsIF91dGlscy53YXJuKShcIlRyYW5zOiB0aGUgcGFzc2VkIGluIHZhbHVlIGlzIGludmFsaWQgLSBzZWVtcyB5b3UgcGFzc2VkIGluIGEgdmFyaWFibGUgbGlrZSB7bnVtYmVyfSAtIHBsZWFzZSBwYXNzIGluIHZhcmlhYmxlcyBmb3IgaW50ZXJwb2xhdGlvbiBhcyBmdWxsIG9iamVjdHMgbGlrZSB7e251bWJlcn19LlwiLCBjaGlsZCk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHN0cmluZ05vZGU7XG59XG5cbmZ1bmN0aW9uIHJlbmRlck5vZGVzKGNoaWxkcmVuLCB0YXJnZXRTdHJpbmcsIGkxOG4sIGkxOG5PcHRpb25zLCBjb21iaW5lZFRPcHRzLCBzaG91bGRVbmVzY2FwZSkge1xuICBpZiAodGFyZ2V0U3RyaW5nID09PSAnJykgcmV0dXJuIFtdO1xuICB2YXIga2VlcEFycmF5ID0gaTE4bk9wdGlvbnMudHJhbnNLZWVwQmFzaWNIdG1sTm9kZXNGb3IgfHwgW107XG4gIHZhciBlbXB0eUNoaWxkcmVuQnV0TmVlZHNIYW5kbGluZyA9IHRhcmdldFN0cmluZyAmJiBuZXcgUmVnRXhwKGtlZXBBcnJheS5qb2luKCd8JykpLnRlc3QodGFyZ2V0U3RyaW5nKTtcbiAgaWYgKCFjaGlsZHJlbiAmJiAhZW1wdHlDaGlsZHJlbkJ1dE5lZWRzSGFuZGxpbmcpIHJldHVybiBbdGFyZ2V0U3RyaW5nXTtcbiAgdmFyIGRhdGEgPSB7fTtcblxuICBmdW5jdGlvbiBnZXREYXRhKGNoaWxkcykge1xuICAgIHZhciBjaGlsZHJlbkFycmF5ID0gZ2V0QXNBcnJheShjaGlsZHMpO1xuICAgIGNoaWxkcmVuQXJyYXkuZm9yRWFjaChmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgIGlmICh0eXBlb2YgY2hpbGQgPT09ICdzdHJpbmcnKSByZXR1cm47XG4gICAgICBpZiAoaGFzQ2hpbGRyZW4oY2hpbGQpKSBnZXREYXRhKGdldENoaWxkcmVuKGNoaWxkKSk7ZWxzZSBpZiAoKDAsIF90eXBlb2YyW1wiZGVmYXVsdFwiXSkoY2hpbGQpID09PSAnb2JqZWN0JyAmJiAhKDAsIF9yZWFjdC5pc1ZhbGlkRWxlbWVudCkoY2hpbGQpKSBPYmplY3QuYXNzaWduKGRhdGEsIGNoaWxkKTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldERhdGEoY2hpbGRyZW4pO1xuXG4gIHZhciBhc3QgPSBfaHRtbFBhcnNlU3RyaW5naWZ5W1wiZGVmYXVsdFwiXS5wYXJzZShcIjwwPlwiLmNvbmNhdCh0YXJnZXRTdHJpbmcsIFwiPC8wPlwiKSk7XG5cbiAgdmFyIG9wdHMgPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGRhdGEpLCBjb21iaW5lZFRPcHRzKTtcblxuICBmdW5jdGlvbiByZW5kZXJJbm5lcihjaGlsZCwgbm9kZSwgcm9vdFJlYWN0Tm9kZSkge1xuICAgIHZhciBjaGlsZHMgPSBnZXRDaGlsZHJlbihjaGlsZCk7XG4gICAgdmFyIG1hcHBlZENoaWxkcmVuID0gbWFwQVNUKGNoaWxkcywgbm9kZS5jaGlsZHJlbiwgcm9vdFJlYWN0Tm9kZSk7XG4gICAgcmV0dXJuIGhhc1ZhbGlkUmVhY3RDaGlsZHJlbihjaGlsZHMpICYmIG1hcHBlZENoaWxkcmVuLmxlbmd0aCA9PT0gMCA/IGNoaWxkcyA6IG1hcHBlZENoaWxkcmVuO1xuICB9XG5cbiAgZnVuY3Rpb24gcHVzaFRyYW5zbGF0ZWRKU1goY2hpbGQsIGlubmVyLCBtZW0sIGksIGlzVm9pZCkge1xuICAgIGlmIChjaGlsZC5kdW1teSkgY2hpbGQuY2hpbGRyZW4gPSBpbm5lcjtcbiAgICBtZW0ucHVzaCgoMCwgX3JlYWN0LmNsb25lRWxlbWVudCkoY2hpbGQsIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgY2hpbGQucHJvcHMpLCB7fSwge1xuICAgICAga2V5OiBpXG4gICAgfSksIGlzVm9pZCA/IHVuZGVmaW5lZCA6IGlubmVyKSk7XG4gIH1cblxuICBmdW5jdGlvbiBtYXBBU1QocmVhY3ROb2RlLCBhc3ROb2RlLCByb290UmVhY3ROb2RlKSB7XG4gICAgdmFyIHJlYWN0Tm9kZXMgPSBnZXRBc0FycmF5KHJlYWN0Tm9kZSk7XG4gICAgdmFyIGFzdE5vZGVzID0gZ2V0QXNBcnJheShhc3ROb2RlKTtcbiAgICByZXR1cm4gYXN0Tm9kZXMucmVkdWNlKGZ1bmN0aW9uIChtZW0sIG5vZGUsIGkpIHtcbiAgICAgIHZhciB0cmFuc2xhdGlvbkNvbnRlbnQgPSBub2RlLmNoaWxkcmVuICYmIG5vZGUuY2hpbGRyZW5bMF0gJiYgbm9kZS5jaGlsZHJlblswXS5jb250ZW50ICYmIGkxOG4uc2VydmljZXMuaW50ZXJwb2xhdG9yLmludGVycG9sYXRlKG5vZGUuY2hpbGRyZW5bMF0uY29udGVudCwgb3B0cywgaTE4bi5sYW5ndWFnZSk7XG5cbiAgICAgIGlmIChub2RlLnR5cGUgPT09ICd0YWcnKSB7XG4gICAgICAgIHZhciB0bXAgPSByZWFjdE5vZGVzW3BhcnNlSW50KG5vZGUubmFtZSwgMTApXTtcbiAgICAgICAgaWYgKCF0bXAgJiYgcm9vdFJlYWN0Tm9kZS5sZW5ndGggPT09IDEgJiYgcm9vdFJlYWN0Tm9kZVswXVtub2RlLm5hbWVdKSB0bXAgPSByb290UmVhY3ROb2RlWzBdW25vZGUubmFtZV07XG4gICAgICAgIGlmICghdG1wKSB0bXAgPSB7fTtcbiAgICAgICAgdmFyIGNoaWxkID0gT2JqZWN0LmtleXMobm9kZS5hdHRycykubGVuZ3RoICE9PSAwID8gbWVyZ2VQcm9wcyh7XG4gICAgICAgICAgcHJvcHM6IG5vZGUuYXR0cnNcbiAgICAgICAgfSwgdG1wKSA6IHRtcDtcbiAgICAgICAgdmFyIGlzRWxlbWVudCA9ICgwLCBfcmVhY3QuaXNWYWxpZEVsZW1lbnQpKGNoaWxkKTtcbiAgICAgICAgdmFyIGlzVmFsaWRUcmFuc2xhdGlvbldpdGhDaGlsZHJlbiA9IGlzRWxlbWVudCAmJiBoYXNDaGlsZHJlbihub2RlLCB0cnVlKSAmJiAhbm9kZS52b2lkRWxlbWVudDtcbiAgICAgICAgdmFyIGlzRW1wdHlUcmFuc1dpdGhIVE1MID0gZW1wdHlDaGlsZHJlbkJ1dE5lZWRzSGFuZGxpbmcgJiYgKDAsIF90eXBlb2YyW1wiZGVmYXVsdFwiXSkoY2hpbGQpID09PSAnb2JqZWN0JyAmJiBjaGlsZC5kdW1teSAmJiAhaXNFbGVtZW50O1xuICAgICAgICB2YXIgaXNLbm93bkNvbXBvbmVudCA9ICgwLCBfdHlwZW9mMltcImRlZmF1bHRcIl0pKGNoaWxkcmVuKSA9PT0gJ29iamVjdCcgJiYgY2hpbGRyZW4gIT09IG51bGwgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoY2hpbGRyZW4sIG5vZGUubmFtZSk7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBjaGlsZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB2YXIgdmFsdWUgPSBpMThuLnNlcnZpY2VzLmludGVycG9sYXRvci5pbnRlcnBvbGF0ZShjaGlsZCwgb3B0cywgaTE4bi5sYW5ndWFnZSk7XG4gICAgICAgICAgbWVtLnB1c2godmFsdWUpO1xuICAgICAgICB9IGVsc2UgaWYgKGhhc0NoaWxkcmVuKGNoaWxkKSB8fCBpc1ZhbGlkVHJhbnNsYXRpb25XaXRoQ2hpbGRyZW4pIHtcbiAgICAgICAgICAgIHZhciBpbm5lciA9IHJlbmRlcklubmVyKGNoaWxkLCBub2RlLCByb290UmVhY3ROb2RlKTtcbiAgICAgICAgICAgIHB1c2hUcmFuc2xhdGVkSlNYKGNoaWxkLCBpbm5lciwgbWVtLCBpKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGlzRW1wdHlUcmFuc1dpdGhIVE1MKSB7XG4gICAgICAgICAgdmFyIF9pbm5lciA9IG1hcEFTVChyZWFjdE5vZGVzLCBub2RlLmNoaWxkcmVuLCByb290UmVhY3ROb2RlKTtcblxuICAgICAgICAgIG1lbS5wdXNoKCgwLCBfcmVhY3QuY2xvbmVFbGVtZW50KShjaGlsZCwgX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBjaGlsZC5wcm9wcyksIHt9LCB7XG4gICAgICAgICAgICBrZXk6IGlcbiAgICAgICAgICB9KSwgX2lubmVyKSk7XG4gICAgICAgIH0gZWxzZSBpZiAoTnVtYmVyLmlzTmFOKHBhcnNlRmxvYXQobm9kZS5uYW1lKSkpIHtcbiAgICAgICAgICBpZiAoaXNLbm93bkNvbXBvbmVudCkge1xuICAgICAgICAgICAgdmFyIF9pbm5lcjIgPSByZW5kZXJJbm5lcihjaGlsZCwgbm9kZSwgcm9vdFJlYWN0Tm9kZSk7XG5cbiAgICAgICAgICAgIHB1c2hUcmFuc2xhdGVkSlNYKGNoaWxkLCBfaW5uZXIyLCBtZW0sIGksIG5vZGUudm9pZEVsZW1lbnQpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaTE4bk9wdGlvbnMudHJhbnNTdXBwb3J0QmFzaWNIdG1sTm9kZXMgJiYga2VlcEFycmF5LmluZGV4T2Yobm9kZS5uYW1lKSA+IC0xKSB7XG4gICAgICAgICAgICBpZiAobm9kZS52b2lkRWxlbWVudCkge1xuICAgICAgICAgICAgICBtZW0ucHVzaCgoMCwgX3JlYWN0LmNyZWF0ZUVsZW1lbnQpKG5vZGUubmFtZSwge1xuICAgICAgICAgICAgICAgIGtleTogXCJcIi5jb25jYXQobm9kZS5uYW1lLCBcIi1cIikuY29uY2F0KGkpXG4gICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHZhciBfaW5uZXIzID0gbWFwQVNUKHJlYWN0Tm9kZXMsIG5vZGUuY2hpbGRyZW4sIHJvb3RSZWFjdE5vZGUpO1xuXG4gICAgICAgICAgICAgIG1lbS5wdXNoKCgwLCBfcmVhY3QuY3JlYXRlRWxlbWVudCkobm9kZS5uYW1lLCB7XG4gICAgICAgICAgICAgICAga2V5OiBcIlwiLmNvbmNhdChub2RlLm5hbWUsIFwiLVwiKS5jb25jYXQoaSlcbiAgICAgICAgICAgICAgfSwgX2lubmVyMykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAobm9kZS52b2lkRWxlbWVudCkge1xuICAgICAgICAgICAgbWVtLnB1c2goXCI8XCIuY29uY2F0KG5vZGUubmFtZSwgXCIgLz5cIikpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgX2lubmVyNCA9IG1hcEFTVChyZWFjdE5vZGVzLCBub2RlLmNoaWxkcmVuLCByb290UmVhY3ROb2RlKTtcblxuICAgICAgICAgICAgbWVtLnB1c2goXCI8XCIuY29uY2F0KG5vZGUubmFtZSwgXCI+XCIpLmNvbmNhdChfaW5uZXI0LCBcIjwvXCIpLmNvbmNhdChub2RlLm5hbWUsIFwiPlwiKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKCgwLCBfdHlwZW9mMltcImRlZmF1bHRcIl0pKGNoaWxkKSA9PT0gJ29iamVjdCcgJiYgIWlzRWxlbWVudCkge1xuICAgICAgICAgIHZhciBjb250ZW50ID0gbm9kZS5jaGlsZHJlblswXSA/IHRyYW5zbGF0aW9uQ29udGVudCA6IG51bGw7XG4gICAgICAgICAgaWYgKGNvbnRlbnQpIG1lbS5wdXNoKGNvbnRlbnQpO1xuICAgICAgICB9IGVsc2UgaWYgKG5vZGUuY2hpbGRyZW4ubGVuZ3RoID09PSAxICYmIHRyYW5zbGF0aW9uQ29udGVudCkge1xuICAgICAgICAgIG1lbS5wdXNoKCgwLCBfcmVhY3QuY2xvbmVFbGVtZW50KShjaGlsZCwgX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBjaGlsZC5wcm9wcyksIHt9LCB7XG4gICAgICAgICAgICBrZXk6IGlcbiAgICAgICAgICB9KSwgdHJhbnNsYXRpb25Db250ZW50KSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbWVtLnB1c2goKDAsIF9yZWFjdC5jbG9uZUVsZW1lbnQpKGNoaWxkLCBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGNoaWxkLnByb3BzKSwge30sIHtcbiAgICAgICAgICAgIGtleTogaVxuICAgICAgICAgIH0pKSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAobm9kZS50eXBlID09PSAndGV4dCcpIHtcbiAgICAgICAgdmFyIHdyYXBUZXh0Tm9kZXMgPSBpMThuT3B0aW9ucy50cmFuc1dyYXBUZXh0Tm9kZXM7XG5cbiAgICAgICAgdmFyIF9jb250ZW50ID0gc2hvdWxkVW5lc2NhcGUgPyBpMThuT3B0aW9ucy51bmVzY2FwZShpMThuLnNlcnZpY2VzLmludGVycG9sYXRvci5pbnRlcnBvbGF0ZShub2RlLmNvbnRlbnQsIG9wdHMsIGkxOG4ubGFuZ3VhZ2UpKSA6IGkxOG4uc2VydmljZXMuaW50ZXJwb2xhdG9yLmludGVycG9sYXRlKG5vZGUuY29udGVudCwgb3B0cywgaTE4bi5sYW5ndWFnZSk7XG5cbiAgICAgICAgaWYgKHdyYXBUZXh0Tm9kZXMpIHtcbiAgICAgICAgICBtZW0ucHVzaCgoMCwgX3JlYWN0LmNyZWF0ZUVsZW1lbnQpKHdyYXBUZXh0Tm9kZXMsIHtcbiAgICAgICAgICAgIGtleTogXCJcIi5jb25jYXQobm9kZS5uYW1lLCBcIi1cIikuY29uY2F0KGkpXG4gICAgICAgICAgfSwgX2NvbnRlbnQpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBtZW0ucHVzaChfY29udGVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG1lbTtcbiAgICB9LCBbXSk7XG4gIH1cblxuICB2YXIgcmVzdWx0ID0gbWFwQVNUKFt7XG4gICAgZHVtbXk6IHRydWUsXG4gICAgY2hpbGRyZW46IGNoaWxkcmVuIHx8IFtdXG4gIH1dLCBhc3QsIGdldEFzQXJyYXkoY2hpbGRyZW4gfHwgW10pKTtcbiAgcmV0dXJuIGdldENoaWxkcmVuKHJlc3VsdFswXSk7XG59XG5cbmZ1bmN0aW9uIFRyYW5zKF9yZWYpIHtcbiAgdmFyIGNoaWxkcmVuID0gX3JlZi5jaGlsZHJlbixcbiAgICAgIGNvdW50ID0gX3JlZi5jb3VudCxcbiAgICAgIHBhcmVudCA9IF9yZWYucGFyZW50LFxuICAgICAgaTE4bktleSA9IF9yZWYuaTE4bktleSxcbiAgICAgIGNvbnRleHQgPSBfcmVmLmNvbnRleHQsXG4gICAgICBfcmVmJHRPcHRpb25zID0gX3JlZi50T3B0aW9ucyxcbiAgICAgIHRPcHRpb25zID0gX3JlZiR0T3B0aW9ucyA9PT0gdm9pZCAwID8ge30gOiBfcmVmJHRPcHRpb25zLFxuICAgICAgdmFsdWVzID0gX3JlZi52YWx1ZXMsXG4gICAgICBkZWZhdWx0cyA9IF9yZWYuZGVmYXVsdHMsXG4gICAgICBjb21wb25lbnRzID0gX3JlZi5jb21wb25lbnRzLFxuICAgICAgbnMgPSBfcmVmLm5zLFxuICAgICAgaTE4bkZyb21Qcm9wcyA9IF9yZWYuaTE4bixcbiAgICAgIHRGcm9tUHJvcHMgPSBfcmVmLnQsXG4gICAgICBzaG91bGRVbmVzY2FwZSA9IF9yZWYuc2hvdWxkVW5lc2NhcGUsXG4gICAgICBhZGRpdGlvbmFsUHJvcHMgPSAoMCwgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMltcImRlZmF1bHRcIl0pKF9yZWYsIF9leGNsdWRlZDIpO1xuXG4gIHZhciBfcmVmMiA9ICgwLCBfcmVhY3QudXNlQ29udGV4dCkoX2NvbnRleHQuSTE4bkNvbnRleHQpIHx8IHt9LFxuICAgICAgaTE4bkZyb21Db250ZXh0ID0gX3JlZjIuaTE4bixcbiAgICAgIGRlZmF1bHROU0Zyb21Db250ZXh0ID0gX3JlZjIuZGVmYXVsdE5TO1xuXG4gIHZhciBpMThuID0gaTE4bkZyb21Qcm9wcyB8fCBpMThuRnJvbUNvbnRleHQgfHwgKDAsIF9jb250ZXh0LmdldEkxOG4pKCk7XG5cbiAgaWYgKCFpMThuKSB7XG4gICAgKDAsIF91dGlscy53YXJuT25jZSkoJ1lvdSB3aWxsIG5lZWQgdG8gcGFzcyBpbiBhbiBpMThuZXh0IGluc3RhbmNlIGJ5IHVzaW5nIGkxOG5leHRSZWFjdE1vZHVsZScpO1xuICAgIHJldHVybiBjaGlsZHJlbjtcbiAgfVxuXG4gIHZhciB0ID0gdEZyb21Qcm9wcyB8fCBpMThuLnQuYmluZChpMThuKSB8fCBmdW5jdGlvbiAoaykge1xuICAgIHJldHVybiBrO1xuICB9O1xuXG4gIGlmIChjb250ZXh0KSB0T3B0aW9ucy5jb250ZXh0ID0gY29udGV4dDtcblxuICB2YXIgcmVhY3RJMThuZXh0T3B0aW9ucyA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgKDAsIF9jb250ZXh0LmdldERlZmF1bHRzKSgpKSwgaTE4bi5vcHRpb25zICYmIGkxOG4ub3B0aW9ucy5yZWFjdCk7XG5cbiAgdmFyIG5hbWVzcGFjZXMgPSBucyB8fCB0Lm5zIHx8IGRlZmF1bHROU0Zyb21Db250ZXh0IHx8IGkxOG4ub3B0aW9ucyAmJiBpMThuLm9wdGlvbnMuZGVmYXVsdE5TO1xuICBuYW1lc3BhY2VzID0gdHlwZW9mIG5hbWVzcGFjZXMgPT09ICdzdHJpbmcnID8gW25hbWVzcGFjZXNdIDogbmFtZXNwYWNlcyB8fCBbJ3RyYW5zbGF0aW9uJ107XG4gIHZhciBkZWZhdWx0VmFsdWUgPSBkZWZhdWx0cyB8fCBub2Rlc1RvU3RyaW5nKGNoaWxkcmVuLCByZWFjdEkxOG5leHRPcHRpb25zKSB8fCByZWFjdEkxOG5leHRPcHRpb25zLnRyYW5zRW1wdHlOb2RlVmFsdWUgfHwgaTE4bktleTtcbiAgdmFyIGhhc2hUcmFuc0tleSA9IHJlYWN0STE4bmV4dE9wdGlvbnMuaGFzaFRyYW5zS2V5O1xuICB2YXIga2V5ID0gaTE4bktleSB8fCAoaGFzaFRyYW5zS2V5ID8gaGFzaFRyYW5zS2V5KGRlZmF1bHRWYWx1ZSkgOiBkZWZhdWx0VmFsdWUpO1xuICB2YXIgaW50ZXJwb2xhdGlvbk92ZXJyaWRlID0gdmFsdWVzID8gdE9wdGlvbnMuaW50ZXJwb2xhdGlvbiA6IHtcbiAgICBpbnRlcnBvbGF0aW9uOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHRPcHRpb25zLmludGVycG9sYXRpb24pLCB7fSwge1xuICAgICAgcHJlZml4OiAnIyQ/JyxcbiAgICAgIHN1ZmZpeDogJz8kIydcbiAgICB9KVxuICB9O1xuXG4gIHZhciBjb21iaW5lZFRPcHRzID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgdE9wdGlvbnMpLCB7fSwge1xuICAgIGNvdW50OiBjb3VudFxuICB9LCB2YWx1ZXMpLCBpbnRlcnBvbGF0aW9uT3ZlcnJpZGUpLCB7fSwge1xuICAgIGRlZmF1bHRWYWx1ZTogZGVmYXVsdFZhbHVlLFxuICAgIG5zOiBuYW1lc3BhY2VzXG4gIH0pO1xuXG4gIHZhciB0cmFuc2xhdGlvbiA9IGtleSA/IHQoa2V5LCBjb21iaW5lZFRPcHRzKSA6IGRlZmF1bHRWYWx1ZTtcbiAgdmFyIGNvbnRlbnQgPSByZW5kZXJOb2Rlcyhjb21wb25lbnRzIHx8IGNoaWxkcmVuLCB0cmFuc2xhdGlvbiwgaTE4biwgcmVhY3RJMThuZXh0T3B0aW9ucywgY29tYmluZWRUT3B0cywgc2hvdWxkVW5lc2NhcGUpO1xuICB2YXIgdXNlQXNQYXJlbnQgPSBwYXJlbnQgIT09IHVuZGVmaW5lZCA/IHBhcmVudCA6IHJlYWN0STE4bmV4dE9wdGlvbnMuZGVmYXVsdFRyYW5zUGFyZW50O1xuICByZXR1cm4gdXNlQXNQYXJlbnQgPyAoMCwgX3JlYWN0LmNyZWF0ZUVsZW1lbnQpKHVzZUFzUGFyZW50LCBhZGRpdGlvbmFsUHJvcHMsIGNvbnRlbnQpIDogY29udGVudDtcbn0iLCJmdW5jdGlvbiBfYXJyYXlXaXRoSG9sZXMoYXJyKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGFycikpIHJldHVybiBhcnI7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2FycmF5V2l0aEhvbGVzLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHM7IiwiZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheUxpbWl0KGFyciwgaSkge1xuICB2YXIgX2kgPSBhcnIgPT0gbnVsbCA/IG51bGwgOiB0eXBlb2YgU3ltYm9sICE9PSBcInVuZGVmaW5lZFwiICYmIGFycltTeW1ib2wuaXRlcmF0b3JdIHx8IGFycltcIkBAaXRlcmF0b3JcIl07XG5cbiAgaWYgKF9pID09IG51bGwpIHJldHVybjtcbiAgdmFyIF9hcnIgPSBbXTtcbiAgdmFyIF9uID0gdHJ1ZTtcbiAgdmFyIF9kID0gZmFsc2U7XG5cbiAgdmFyIF9zLCBfZTtcblxuICB0cnkge1xuICAgIGZvciAoX2kgPSBfaS5jYWxsKGFycik7ICEoX24gPSAoX3MgPSBfaS5uZXh0KCkpLmRvbmUpOyBfbiA9IHRydWUpIHtcbiAgICAgIF9hcnIucHVzaChfcy52YWx1ZSk7XG5cbiAgICAgIGlmIChpICYmIF9hcnIubGVuZ3RoID09PSBpKSBicmVhaztcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIF9kID0gdHJ1ZTtcbiAgICBfZSA9IGVycjtcbiAgfSBmaW5hbGx5IHtcbiAgICB0cnkge1xuICAgICAgaWYgKCFfbiAmJiBfaVtcInJldHVyblwiXSAhPSBudWxsKSBfaVtcInJldHVyblwiXSgpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAoX2QpIHRocm93IF9lO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBfYXJyO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9pdGVyYWJsZVRvQXJyYXlMaW1pdCwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzOyIsImZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KGFyciwgbGVuKSB7XG4gIGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoO1xuXG4gIGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykge1xuICAgIGFycjJbaV0gPSBhcnJbaV07XG4gIH1cblxuICByZXR1cm4gYXJyMjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfYXJyYXlMaWtlVG9BcnJheSwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzOyIsInZhciBhcnJheUxpa2VUb0FycmF5ID0gcmVxdWlyZShcIi4vYXJyYXlMaWtlVG9BcnJheS5qc1wiKTtcblxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8sIG1pbkxlbikge1xuICBpZiAoIW8pIHJldHVybjtcbiAgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pO1xuICB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7XG4gIGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7XG4gIGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pO1xuICBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIGFycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXksIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0czsiLCJmdW5jdGlvbiBfbm9uSXRlcmFibGVSZXN0KCkge1xuICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGRlc3RydWN0dXJlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9ub25JdGVyYWJsZVJlc3QsIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0czsiLCJ2YXIgYXJyYXlXaXRoSG9sZXMgPSByZXF1aXJlKFwiLi9hcnJheVdpdGhIb2xlcy5qc1wiKTtcblxudmFyIGl0ZXJhYmxlVG9BcnJheUxpbWl0ID0gcmVxdWlyZShcIi4vaXRlcmFibGVUb0FycmF5TGltaXQuanNcIik7XG5cbnZhciB1bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSA9IHJlcXVpcmUoXCIuL3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5LmpzXCIpO1xuXG52YXIgbm9uSXRlcmFibGVSZXN0ID0gcmVxdWlyZShcIi4vbm9uSXRlcmFibGVSZXN0LmpzXCIpO1xuXG5mdW5jdGlvbiBfc2xpY2VkVG9BcnJheShhcnIsIGkpIHtcbiAgcmV0dXJuIGFycmF5V2l0aEhvbGVzKGFycikgfHwgaXRlcmFibGVUb0FycmF5TGltaXQoYXJyLCBpKSB8fCB1bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShhcnIsIGkpIHx8IG5vbkl0ZXJhYmxlUmVzdCgpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9zbGljZWRUb0FycmF5LCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHM7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy51c2VUcmFuc2xhdGlvbiA9IHVzZVRyYW5zbGF0aW9uO1xuXG52YXIgX3NsaWNlZFRvQXJyYXkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9zbGljZWRUb0FycmF5XCIpKTtcblxudmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpKTtcblxudmFyIF9yZWFjdCA9IHJlcXVpcmUoXCJyZWFjdFwiKTtcblxudmFyIF9jb250ZXh0ID0gcmVxdWlyZShcIi4vY29udGV4dFwiKTtcblxudmFyIF91dGlscyA9IHJlcXVpcmUoXCIuL3V0aWxzXCIpO1xuXG5mdW5jdGlvbiBvd25LZXlzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHsgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTsgaWYgKGVudW1lcmFibGVPbmx5KSB7IHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlOyB9KTsgfSBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7IH0gcmV0dXJuIGtleXM7IH1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXSAhPSBudWxsID8gYXJndW1lbnRzW2ldIDoge307IGlmIChpICUgMikgeyBvd25LZXlzKE9iamVjdChzb3VyY2UpLCB0cnVlKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOyB9KTsgfSBlbHNlIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycykgeyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpOyB9IGVsc2UgeyBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7IH0pOyB9IH0gcmV0dXJuIHRhcmdldDsgfVxuXG52YXIgdXNlUHJldmlvdXMgPSBmdW5jdGlvbiB1c2VQcmV2aW91cyh2YWx1ZSwgaWdub3JlKSB7XG4gIHZhciByZWYgPSAoMCwgX3JlYWN0LnVzZVJlZikoKTtcbiAgKDAsIF9yZWFjdC51c2VFZmZlY3QpKGZ1bmN0aW9uICgpIHtcbiAgICByZWYuY3VycmVudCA9IGlnbm9yZSA/IHJlZi5jdXJyZW50IDogdmFsdWU7XG4gIH0sIFt2YWx1ZSwgaWdub3JlXSk7XG4gIHJldHVybiByZWYuY3VycmVudDtcbn07XG5cbmZ1bmN0aW9uIHVzZVRyYW5zbGF0aW9uKG5zKSB7XG4gIHZhciBwcm9wcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG4gIHZhciBpMThuRnJvbVByb3BzID0gcHJvcHMuaTE4bjtcblxuICB2YXIgX3JlZiA9ICgwLCBfcmVhY3QudXNlQ29udGV4dCkoX2NvbnRleHQuSTE4bkNvbnRleHQpIHx8IHt9LFxuICAgICAgaTE4bkZyb21Db250ZXh0ID0gX3JlZi5pMThuLFxuICAgICAgZGVmYXVsdE5TRnJvbUNvbnRleHQgPSBfcmVmLmRlZmF1bHROUztcblxuICB2YXIgaTE4biA9IGkxOG5Gcm9tUHJvcHMgfHwgaTE4bkZyb21Db250ZXh0IHx8ICgwLCBfY29udGV4dC5nZXRJMThuKSgpO1xuICBpZiAoaTE4biAmJiAhaTE4bi5yZXBvcnROYW1lc3BhY2VzKSBpMThuLnJlcG9ydE5hbWVzcGFjZXMgPSBuZXcgX2NvbnRleHQuUmVwb3J0TmFtZXNwYWNlcygpO1xuXG4gIGlmICghaTE4bikge1xuICAgICgwLCBfdXRpbHMud2Fybk9uY2UpKCdZb3Ugd2lsbCBuZWVkIHRvIHBhc3MgaW4gYW4gaTE4bmV4dCBpbnN0YW5jZSBieSB1c2luZyBpbml0UmVhY3RJMThuZXh0Jyk7XG5cbiAgICB2YXIgbm90UmVhZHlUID0gZnVuY3Rpb24gbm90UmVhZHlUKGspIHtcbiAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KGspID8ga1trLmxlbmd0aCAtIDFdIDogaztcbiAgICB9O1xuXG4gICAgdmFyIHJldE5vdFJlYWR5ID0gW25vdFJlYWR5VCwge30sIGZhbHNlXTtcbiAgICByZXROb3RSZWFkeS50ID0gbm90UmVhZHlUO1xuICAgIHJldE5vdFJlYWR5LmkxOG4gPSB7fTtcbiAgICByZXROb3RSZWFkeS5yZWFkeSA9IGZhbHNlO1xuICAgIHJldHVybiByZXROb3RSZWFkeTtcbiAgfVxuXG4gIGlmIChpMThuLm9wdGlvbnMucmVhY3QgJiYgaTE4bi5vcHRpb25zLnJlYWN0LndhaXQgIT09IHVuZGVmaW5lZCkgKDAsIF91dGlscy53YXJuT25jZSkoJ0l0IHNlZW1zIHlvdSBhcmUgc3RpbGwgdXNpbmcgdGhlIG9sZCB3YWl0IG9wdGlvbiwgeW91IG1heSBtaWdyYXRlIHRvIHRoZSBuZXcgdXNlU3VzcGVuc2UgYmVoYXZpb3VyLicpO1xuXG4gIHZhciBpMThuT3B0aW9ucyA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCAoMCwgX2NvbnRleHQuZ2V0RGVmYXVsdHMpKCkpLCBpMThuLm9wdGlvbnMucmVhY3QpLCBwcm9wcyk7XG5cbiAgdmFyIHVzZVN1c3BlbnNlID0gaTE4bk9wdGlvbnMudXNlU3VzcGVuc2UsXG4gICAgICBrZXlQcmVmaXggPSBpMThuT3B0aW9ucy5rZXlQcmVmaXg7XG4gIHZhciBuYW1lc3BhY2VzID0gbnMgfHwgZGVmYXVsdE5TRnJvbUNvbnRleHQgfHwgaTE4bi5vcHRpb25zICYmIGkxOG4ub3B0aW9ucy5kZWZhdWx0TlM7XG4gIG5hbWVzcGFjZXMgPSB0eXBlb2YgbmFtZXNwYWNlcyA9PT0gJ3N0cmluZycgPyBbbmFtZXNwYWNlc10gOiBuYW1lc3BhY2VzIHx8IFsndHJhbnNsYXRpb24nXTtcbiAgaWYgKGkxOG4ucmVwb3J0TmFtZXNwYWNlcy5hZGRVc2VkTmFtZXNwYWNlcykgaTE4bi5yZXBvcnROYW1lc3BhY2VzLmFkZFVzZWROYW1lc3BhY2VzKG5hbWVzcGFjZXMpO1xuICB2YXIgcmVhZHkgPSAoaTE4bi5pc0luaXRpYWxpemVkIHx8IGkxOG4uaW5pdGlhbGl6ZWRTdG9yZU9uY2UpICYmIG5hbWVzcGFjZXMuZXZlcnkoZnVuY3Rpb24gKG4pIHtcbiAgICByZXR1cm4gKDAsIF91dGlscy5oYXNMb2FkZWROYW1lc3BhY2UpKG4sIGkxOG4sIGkxOG5PcHRpb25zKTtcbiAgfSk7XG5cbiAgZnVuY3Rpb24gZ2V0VCgpIHtcbiAgICByZXR1cm4gaTE4bi5nZXRGaXhlZFQobnVsbCwgaTE4bk9wdGlvbnMubnNNb2RlID09PSAnZmFsbGJhY2snID8gbmFtZXNwYWNlcyA6IG5hbWVzcGFjZXNbMF0sIGtleVByZWZpeCk7XG4gIH1cblxuICB2YXIgX3VzZVN0YXRlID0gKDAsIF9yZWFjdC51c2VTdGF0ZSkoZ2V0VCksXG4gICAgICBfdXNlU3RhdGUyID0gKDAsIF9zbGljZWRUb0FycmF5MltcImRlZmF1bHRcIl0pKF91c2VTdGF0ZSwgMiksXG4gICAgICB0ID0gX3VzZVN0YXRlMlswXSxcbiAgICAgIHNldFQgPSBfdXNlU3RhdGUyWzFdO1xuXG4gIHZhciBqb2luZWROUyA9IG5hbWVzcGFjZXMuam9pbigpO1xuICB2YXIgcHJldmlvdXNKb2luZWROUyA9IHVzZVByZXZpb3VzKGpvaW5lZE5TKTtcbiAgdmFyIGlzTW91bnRlZCA9ICgwLCBfcmVhY3QudXNlUmVmKSh0cnVlKTtcbiAgKDAsIF9yZWFjdC51c2VFZmZlY3QpKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgYmluZEkxOG4gPSBpMThuT3B0aW9ucy5iaW5kSTE4bixcbiAgICAgICAgYmluZEkxOG5TdG9yZSA9IGkxOG5PcHRpb25zLmJpbmRJMThuU3RvcmU7XG4gICAgaXNNb3VudGVkLmN1cnJlbnQgPSB0cnVlO1xuXG4gICAgaWYgKCFyZWFkeSAmJiAhdXNlU3VzcGVuc2UpIHtcbiAgICAgICgwLCBfdXRpbHMubG9hZE5hbWVzcGFjZXMpKGkxOG4sIG5hbWVzcGFjZXMsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKGlzTW91bnRlZC5jdXJyZW50KSBzZXRUKGdldFQpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHJlYWR5ICYmIHByZXZpb3VzSm9pbmVkTlMgJiYgcHJldmlvdXNKb2luZWROUyAhPT0gam9pbmVkTlMgJiYgaXNNb3VudGVkLmN1cnJlbnQpIHtcbiAgICAgIHNldFQoZ2V0VCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYm91bmRSZXNldCgpIHtcbiAgICAgIGlmIChpc01vdW50ZWQuY3VycmVudCkgc2V0VChnZXRUKTtcbiAgICB9XG5cbiAgICBpZiAoYmluZEkxOG4gJiYgaTE4bikgaTE4bi5vbihiaW5kSTE4biwgYm91bmRSZXNldCk7XG4gICAgaWYgKGJpbmRJMThuU3RvcmUgJiYgaTE4bikgaTE4bi5zdG9yZS5vbihiaW5kSTE4blN0b3JlLCBib3VuZFJlc2V0KTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgaXNNb3VudGVkLmN1cnJlbnQgPSBmYWxzZTtcbiAgICAgIGlmIChiaW5kSTE4biAmJiBpMThuKSBiaW5kSTE4bi5zcGxpdCgnICcpLmZvckVhY2goZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgcmV0dXJuIGkxOG4ub2ZmKGUsIGJvdW5kUmVzZXQpO1xuICAgICAgfSk7XG4gICAgICBpZiAoYmluZEkxOG5TdG9yZSAmJiBpMThuKSBiaW5kSTE4blN0b3JlLnNwbGl0KCcgJykuZm9yRWFjaChmdW5jdGlvbiAoZSkge1xuICAgICAgICByZXR1cm4gaTE4bi5zdG9yZS5vZmYoZSwgYm91bmRSZXNldCk7XG4gICAgICB9KTtcbiAgICB9O1xuICB9LCBbaTE4biwgam9pbmVkTlNdKTtcbiAgdmFyIGlzSW5pdGlhbCA9ICgwLCBfcmVhY3QudXNlUmVmKSh0cnVlKTtcbiAgKDAsIF9yZWFjdC51c2VFZmZlY3QpKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoaXNNb3VudGVkLmN1cnJlbnQgJiYgIWlzSW5pdGlhbC5jdXJyZW50KSB7XG4gICAgICBzZXRUKGdldFQpO1xuICAgIH1cblxuICAgIGlzSW5pdGlhbC5jdXJyZW50ID0gZmFsc2U7XG4gIH0sIFtpMThuLCBrZXlQcmVmaXhdKTtcbiAgdmFyIHJldCA9IFt0LCBpMThuLCByZWFkeV07XG4gIHJldC50ID0gdDtcbiAgcmV0LmkxOG4gPSBpMThuO1xuICByZXQucmVhZHkgPSByZWFkeTtcbiAgaWYgKHJlYWR5KSByZXR1cm4gcmV0O1xuICBpZiAoIXJlYWR5ICYmICF1c2VTdXNwZW5zZSkgcmV0dXJuIHJldDtcbiAgdGhyb3cgbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAoMCwgX3V0aWxzLmxvYWROYW1lc3BhY2VzKShpMThuLCBuYW1lc3BhY2VzLCBmdW5jdGlvbiAoKSB7XG4gICAgICByZXNvbHZlKCk7XG4gICAgfSk7XG4gIH0pO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMud2l0aFRyYW5zbGF0aW9uID0gd2l0aFRyYW5zbGF0aW9uO1xuXG52YXIgX2RlZmluZVByb3BlcnR5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIikpO1xuXG52YXIgX3NsaWNlZFRvQXJyYXkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9zbGljZWRUb0FycmF5XCIpKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCIpKTtcblxudmFyIF9yZWFjdCA9IHJlcXVpcmUoXCJyZWFjdFwiKTtcblxudmFyIF91c2VUcmFuc2xhdGlvbjMgPSByZXF1aXJlKFwiLi91c2VUcmFuc2xhdGlvblwiKTtcblxudmFyIF91dGlscyA9IHJlcXVpcmUoXCIuL3V0aWxzXCIpO1xuXG52YXIgX2V4Y2x1ZGVkID0gW1wiZm9yd2FyZGVkUmVmXCJdO1xuXG5mdW5jdGlvbiBvd25LZXlzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHsgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTsgaWYgKGVudW1lcmFibGVPbmx5KSB7IHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlOyB9KTsgfSBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7IH0gcmV0dXJuIGtleXM7IH1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXSAhPSBudWxsID8gYXJndW1lbnRzW2ldIDoge307IGlmIChpICUgMikgeyBvd25LZXlzKE9iamVjdChzb3VyY2UpLCB0cnVlKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgKDAsIF9kZWZpbmVQcm9wZXJ0eTJbXCJkZWZhdWx0XCJdKSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOyB9KTsgfSBlbHNlIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycykgeyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpOyB9IGVsc2UgeyBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7IH0pOyB9IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiB3aXRoVHJhbnNsYXRpb24obnMpIHtcbiAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICByZXR1cm4gZnVuY3Rpb24gRXh0ZW5kKFdyYXBwZWRDb21wb25lbnQpIHtcbiAgICBmdW5jdGlvbiBJMThuZXh0V2l0aFRyYW5zbGF0aW9uKF9yZWYpIHtcbiAgICAgIHZhciBmb3J3YXJkZWRSZWYgPSBfcmVmLmZvcndhcmRlZFJlZixcbiAgICAgICAgICByZXN0ID0gKDAsIF9vYmplY3RXaXRob3V0UHJvcGVydGllczJbXCJkZWZhdWx0XCJdKShfcmVmLCBfZXhjbHVkZWQpO1xuXG4gICAgICB2YXIgX3VzZVRyYW5zbGF0aW9uID0gKDAsIF91c2VUcmFuc2xhdGlvbjMudXNlVHJhbnNsYXRpb24pKG5zLCBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHJlc3QpLCB7fSwge1xuICAgICAgICBrZXlQcmVmaXg6IG9wdGlvbnMua2V5UHJlZml4XG4gICAgICB9KSksXG4gICAgICAgICAgX3VzZVRyYW5zbGF0aW9uMiA9ICgwLCBfc2xpY2VkVG9BcnJheTJbXCJkZWZhdWx0XCJdKShfdXNlVHJhbnNsYXRpb24sIDMpLFxuICAgICAgICAgIHQgPSBfdXNlVHJhbnNsYXRpb24yWzBdLFxuICAgICAgICAgIGkxOG4gPSBfdXNlVHJhbnNsYXRpb24yWzFdLFxuICAgICAgICAgIHJlYWR5ID0gX3VzZVRyYW5zbGF0aW9uMlsyXTtcblxuICAgICAgdmFyIHBhc3NEb3duUHJvcHMgPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHJlc3QpLCB7fSwge1xuICAgICAgICB0OiB0LFxuICAgICAgICBpMThuOiBpMThuLFxuICAgICAgICB0UmVhZHk6IHJlYWR5XG4gICAgICB9KTtcblxuICAgICAgaWYgKG9wdGlvbnMud2l0aFJlZiAmJiBmb3J3YXJkZWRSZWYpIHtcbiAgICAgICAgcGFzc0Rvd25Qcm9wcy5yZWYgPSBmb3J3YXJkZWRSZWY7XG4gICAgICB9IGVsc2UgaWYgKCFvcHRpb25zLndpdGhSZWYgJiYgZm9yd2FyZGVkUmVmKSB7XG4gICAgICAgIHBhc3NEb3duUHJvcHMuZm9yd2FyZGVkUmVmID0gZm9yd2FyZGVkUmVmO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gKDAsIF9yZWFjdC5jcmVhdGVFbGVtZW50KShXcmFwcGVkQ29tcG9uZW50LCBwYXNzRG93blByb3BzKTtcbiAgICB9XG5cbiAgICBJMThuZXh0V2l0aFRyYW5zbGF0aW9uLmRpc3BsYXlOYW1lID0gXCJ3aXRoSTE4bmV4dFRyYW5zbGF0aW9uKFwiLmNvbmNhdCgoMCwgX3V0aWxzLmdldERpc3BsYXlOYW1lKShXcmFwcGVkQ29tcG9uZW50KSwgXCIpXCIpO1xuICAgIEkxOG5leHRXaXRoVHJhbnNsYXRpb24uV3JhcHBlZENvbXBvbmVudCA9IFdyYXBwZWRDb21wb25lbnQ7XG5cbiAgICB2YXIgZm9yd2FyZFJlZiA9IGZ1bmN0aW9uIGZvcndhcmRSZWYocHJvcHMsIHJlZikge1xuICAgICAgcmV0dXJuICgwLCBfcmVhY3QuY3JlYXRlRWxlbWVudCkoSTE4bmV4dFdpdGhUcmFuc2xhdGlvbiwgT2JqZWN0LmFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgZm9yd2FyZGVkUmVmOiByZWZcbiAgICAgIH0pKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIG9wdGlvbnMud2l0aFJlZiA/ICgwLCBfcmVhY3QuZm9yd2FyZFJlZikoZm9yd2FyZFJlZikgOiBJMThuZXh0V2l0aFRyYW5zbGF0aW9uO1xuICB9O1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuVHJhbnNsYXRpb24gPSBUcmFuc2xhdGlvbjtcblxudmFyIF9zbGljZWRUb0FycmF5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvc2xpY2VkVG9BcnJheVwiKSk7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiKSk7XG5cbnZhciBfdXNlVHJhbnNsYXRpb24zID0gcmVxdWlyZShcIi4vdXNlVHJhbnNsYXRpb25cIik7XG5cbnZhciBfZXhjbHVkZWQgPSBbXCJuc1wiLCBcImNoaWxkcmVuXCJdO1xuXG5mdW5jdGlvbiBUcmFuc2xhdGlvbihwcm9wcykge1xuICB2YXIgbnMgPSBwcm9wcy5ucyxcbiAgICAgIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgICBvcHRpb25zID0gKDAsIF9vYmplY3RXaXRob3V0UHJvcGVydGllczJbXCJkZWZhdWx0XCJdKShwcm9wcywgX2V4Y2x1ZGVkKTtcblxuICB2YXIgX3VzZVRyYW5zbGF0aW9uID0gKDAsIF91c2VUcmFuc2xhdGlvbjMudXNlVHJhbnNsYXRpb24pKG5zLCBvcHRpb25zKSxcbiAgICAgIF91c2VUcmFuc2xhdGlvbjIgPSAoMCwgX3NsaWNlZFRvQXJyYXkyW1wiZGVmYXVsdFwiXSkoX3VzZVRyYW5zbGF0aW9uLCAzKSxcbiAgICAgIHQgPSBfdXNlVHJhbnNsYXRpb24yWzBdLFxuICAgICAgaTE4biA9IF91c2VUcmFuc2xhdGlvbjJbMV0sXG4gICAgICByZWFkeSA9IF91c2VUcmFuc2xhdGlvbjJbMl07XG5cbiAgcmV0dXJuIGNoaWxkcmVuKHQsIHtcbiAgICBpMThuOiBpMThuLFxuICAgIGxuZzogaTE4bi5sYW5ndWFnZVxuICB9LCByZWFkeSk7XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLkkxOG5leHRQcm92aWRlciA9IEkxOG5leHRQcm92aWRlcjtcblxudmFyIF9yZWFjdCA9IHJlcXVpcmUoXCJyZWFjdFwiKTtcblxudmFyIF9jb250ZXh0ID0gcmVxdWlyZShcIi4vY29udGV4dFwiKTtcblxuZnVuY3Rpb24gSTE4bmV4dFByb3ZpZGVyKF9yZWYpIHtcbiAgdmFyIGkxOG4gPSBfcmVmLmkxOG4sXG4gICAgICBkZWZhdWx0TlMgPSBfcmVmLmRlZmF1bHROUyxcbiAgICAgIGNoaWxkcmVuID0gX3JlZi5jaGlsZHJlbjtcbiAgdmFyIHZhbHVlID0gKDAsIF9yZWFjdC51c2VNZW1vKShmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGkxOG46IGkxOG4sXG4gICAgICBkZWZhdWx0TlM6IGRlZmF1bHROU1xuICAgIH07XG4gIH0sIFtpMThuLCBkZWZhdWx0TlNdKTtcbiAgcmV0dXJuICgwLCBfcmVhY3QuY3JlYXRlRWxlbWVudCkoX2NvbnRleHQuSTE4bkNvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogdmFsdWVcbiAgfSwgY2hpbGRyZW4pO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy51c2VTU1IgPSB1c2VTU1I7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKFwicmVhY3RcIik7XG5cbnZhciBfY29udGV4dCA9IHJlcXVpcmUoXCIuL2NvbnRleHRcIik7XG5cbmZ1bmN0aW9uIHVzZVNTUihpbml0aWFsSTE4blN0b3JlLCBpbml0aWFsTGFuZ3VhZ2UpIHtcbiAgdmFyIHByb3BzID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB7fTtcbiAgdmFyIGkxOG5Gcm9tUHJvcHMgPSBwcm9wcy5pMThuO1xuXG4gIHZhciBfcmVmID0gKDAsIF9yZWFjdC51c2VDb250ZXh0KShfY29udGV4dC5JMThuQ29udGV4dCkgfHwge30sXG4gICAgICBpMThuRnJvbUNvbnRleHQgPSBfcmVmLmkxOG47XG5cbiAgdmFyIGkxOG4gPSBpMThuRnJvbVByb3BzIHx8IGkxOG5Gcm9tQ29udGV4dCB8fCAoMCwgX2NvbnRleHQuZ2V0STE4bikoKTtcbiAgaWYgKGkxOG4ub3B0aW9ucyAmJiBpMThuLm9wdGlvbnMuaXNDbG9uZSkgcmV0dXJuO1xuXG4gIGlmIChpbml0aWFsSTE4blN0b3JlICYmICFpMThuLmluaXRpYWxpemVkU3RvcmVPbmNlKSB7XG4gICAgaTE4bi5zZXJ2aWNlcy5yZXNvdXJjZVN0b3JlLmRhdGEgPSBpbml0aWFsSTE4blN0b3JlO1xuICAgIGkxOG4ub3B0aW9ucy5ucyA9IE9iamVjdC52YWx1ZXMoaW5pdGlhbEkxOG5TdG9yZSkucmVkdWNlKGZ1bmN0aW9uIChtZW0sIGxuZ1Jlc291cmNlcykge1xuICAgICAgT2JqZWN0LmtleXMobG5nUmVzb3VyY2VzKS5mb3JFYWNoKGZ1bmN0aW9uIChucykge1xuICAgICAgICBpZiAobWVtLmluZGV4T2YobnMpIDwgMCkgbWVtLnB1c2gobnMpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gbWVtO1xuICAgIH0sIGkxOG4ub3B0aW9ucy5ucyk7XG4gICAgaTE4bi5pbml0aWFsaXplZFN0b3JlT25jZSA9IHRydWU7XG4gICAgaTE4bi5pc0luaXRpYWxpemVkID0gdHJ1ZTtcbiAgfVxuXG4gIGlmIChpbml0aWFsTGFuZ3VhZ2UgJiYgIWkxOG4uaW5pdGlhbGl6ZWRMYW5ndWFnZU9uY2UpIHtcbiAgICBpMThuLmNoYW5nZUxhbmd1YWdlKGluaXRpYWxMYW5ndWFnZSk7XG4gICAgaTE4bi5pbml0aWFsaXplZExhbmd1YWdlT25jZSA9IHRydWU7XG4gIH1cbn0iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLndpdGhTU1IgPSB3aXRoU1NSO1xuXG52YXIgX2RlZmluZVByb3BlcnR5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIikpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIikpO1xuXG52YXIgX3JlYWN0ID0gcmVxdWlyZShcInJlYWN0XCIpO1xuXG52YXIgX3VzZVNTUiA9IHJlcXVpcmUoXCIuL3VzZVNTUlwiKTtcblxudmFyIF9jb250ZXh0ID0gcmVxdWlyZShcIi4vY29udGV4dFwiKTtcblxudmFyIF91dGlscyA9IHJlcXVpcmUoXCIuL3V0aWxzXCIpO1xuXG52YXIgX2V4Y2x1ZGVkID0gW1wiaW5pdGlhbEkxOG5TdG9yZVwiLCBcImluaXRpYWxMYW5ndWFnZVwiXTtcblxuZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7IHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7IGlmIChlbnVtZXJhYmxlT25seSkgeyBzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTsgfSk7IH0ga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpOyB9IHJldHVybiBrZXlzOyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV0gIT0gbnVsbCA/IGFyZ3VtZW50c1tpXSA6IHt9OyBpZiAoaSAlIDIpIHsgb3duS2V5cyhPYmplY3Qoc291cmNlKSwgdHJ1ZSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7ICgwLCBfZGVmaW5lUHJvcGVydHkyW1wiZGVmYXVsdFwiXSkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsgfSk7IH0gZWxzZSBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMpIHsgT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKTsgfSBlbHNlIHsgb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpOyB9KTsgfSB9IHJldHVybiB0YXJnZXQ7IH1cblxuZnVuY3Rpb24gd2l0aFNTUigpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIEV4dGVuZChXcmFwcGVkQ29tcG9uZW50KSB7XG4gICAgZnVuY3Rpb24gSTE4bmV4dFdpdGhTU1IoX3JlZikge1xuICAgICAgdmFyIGluaXRpYWxJMThuU3RvcmUgPSBfcmVmLmluaXRpYWxJMThuU3RvcmUsXG4gICAgICAgICAgaW5pdGlhbExhbmd1YWdlID0gX3JlZi5pbml0aWFsTGFuZ3VhZ2UsXG4gICAgICAgICAgcmVzdCA9ICgwLCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyW1wiZGVmYXVsdFwiXSkoX3JlZiwgX2V4Y2x1ZGVkKTtcbiAgICAgICgwLCBfdXNlU1NSLnVzZVNTUikoaW5pdGlhbEkxOG5TdG9yZSwgaW5pdGlhbExhbmd1YWdlKTtcbiAgICAgIHJldHVybiAoMCwgX3JlYWN0LmNyZWF0ZUVsZW1lbnQpKFdyYXBwZWRDb21wb25lbnQsIF9vYmplY3RTcHJlYWQoe30sIHJlc3QpKTtcbiAgICB9XG5cbiAgICBJMThuZXh0V2l0aFNTUi5nZXRJbml0aWFsUHJvcHMgPSAoMCwgX2NvbnRleHQuY29tcG9zZUluaXRpYWxQcm9wcykoV3JhcHBlZENvbXBvbmVudCk7XG4gICAgSTE4bmV4dFdpdGhTU1IuZGlzcGxheU5hbWUgPSBcIndpdGhJMThuZXh0U1NSKFwiLmNvbmNhdCgoMCwgX3V0aWxzLmdldERpc3BsYXlOYW1lKShXcmFwcGVkQ29tcG9uZW50KSwgXCIpXCIpO1xuICAgIEkxOG5leHRXaXRoU1NSLldyYXBwZWRDb21wb25lbnQgPSBXcmFwcGVkQ29tcG9uZW50O1xuICAgIHJldHVybiBJMThuZXh0V2l0aFNTUjtcbiAgfTtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlRyYW5zXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9UcmFucy5UcmFucztcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJ1c2VUcmFuc2xhdGlvblwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfdXNlVHJhbnNsYXRpb24udXNlVHJhbnNsYXRpb247XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwid2l0aFRyYW5zbGF0aW9uXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF93aXRoVHJhbnNsYXRpb24ud2l0aFRyYW5zbGF0aW9uO1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlRyYW5zbGF0aW9uXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9UcmFuc2xhdGlvbi5UcmFuc2xhdGlvbjtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJJMThuZXh0UHJvdmlkZXJcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX0kxOG5leHRQcm92aWRlci5JMThuZXh0UHJvdmlkZXI7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwid2l0aFNTUlwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfd2l0aFNTUi53aXRoU1NSO1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcInVzZVNTUlwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfdXNlU1NSLnVzZVNTUjtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJJMThuQ29udGV4dFwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfY29udGV4dC5JMThuQ29udGV4dDtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJpbml0UmVhY3RJMThuZXh0XCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9jb250ZXh0LmluaXRSZWFjdEkxOG5leHQ7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwic2V0RGVmYXVsdHNcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX2NvbnRleHQuc2V0RGVmYXVsdHM7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiZ2V0RGVmYXVsdHNcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX2NvbnRleHQuZ2V0RGVmYXVsdHM7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwic2V0STE4blwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfY29udGV4dC5zZXRJMThuO1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImdldEkxOG5cIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX2NvbnRleHQuZ2V0STE4bjtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJjb21wb3NlSW5pdGlhbFByb3BzXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9jb250ZXh0LmNvbXBvc2VJbml0aWFsUHJvcHM7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiZ2V0SW5pdGlhbFByb3BzXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9jb250ZXh0LmdldEluaXRpYWxQcm9wcztcbiAgfVxufSk7XG5leHBvcnRzLnNlbGVjdE9yZGluYWwgPSBleHBvcnRzLnBsdXJhbCA9IGV4cG9ydHMuc2VsZWN0ID0gZXhwb3J0cy5udW1iZXIgPSBleHBvcnRzLnRpbWUgPSBleHBvcnRzLmRhdGUgPSB2b2lkIDA7XG5cbnZhciBfVHJhbnMgPSByZXF1aXJlKFwiLi9UcmFuc1wiKTtcblxudmFyIF91c2VUcmFuc2xhdGlvbiA9IHJlcXVpcmUoXCIuL3VzZVRyYW5zbGF0aW9uXCIpO1xuXG52YXIgX3dpdGhUcmFuc2xhdGlvbiA9IHJlcXVpcmUoXCIuL3dpdGhUcmFuc2xhdGlvblwiKTtcblxudmFyIF9UcmFuc2xhdGlvbiA9IHJlcXVpcmUoXCIuL1RyYW5zbGF0aW9uXCIpO1xuXG52YXIgX0kxOG5leHRQcm92aWRlciA9IHJlcXVpcmUoXCIuL0kxOG5leHRQcm92aWRlclwiKTtcblxudmFyIF93aXRoU1NSID0gcmVxdWlyZShcIi4vd2l0aFNTUlwiKTtcblxudmFyIF91c2VTU1IgPSByZXF1aXJlKFwiLi91c2VTU1JcIik7XG5cbnZhciBfY29udGV4dCA9IHJlcXVpcmUoXCIuL2NvbnRleHRcIik7XG5cbnZhciBkYXRlID0gZnVuY3Rpb24gZGF0ZSgpIHtcbiAgcmV0dXJuICcnO1xufTtcblxuZXhwb3J0cy5kYXRlID0gZGF0ZTtcblxudmFyIHRpbWUgPSBmdW5jdGlvbiB0aW1lKCkge1xuICByZXR1cm4gJyc7XG59O1xuXG5leHBvcnRzLnRpbWUgPSB0aW1lO1xuXG52YXIgbnVtYmVyID0gZnVuY3Rpb24gbnVtYmVyKCkge1xuICByZXR1cm4gJyc7XG59O1xuXG5leHBvcnRzLm51bWJlciA9IG51bWJlcjtcblxudmFyIHNlbGVjdCA9IGZ1bmN0aW9uIHNlbGVjdCgpIHtcbiAgcmV0dXJuICcnO1xufTtcblxuZXhwb3J0cy5zZWxlY3QgPSBzZWxlY3Q7XG5cbnZhciBwbHVyYWwgPSBmdW5jdGlvbiBwbHVyYWwoKSB7XG4gIHJldHVybiAnJztcbn07XG5cbmV4cG9ydHMucGx1cmFsID0gcGx1cmFsO1xuXG52YXIgc2VsZWN0T3JkaW5hbCA9IGZ1bmN0aW9uIHNlbGVjdE9yZGluYWwoKSB7XG4gIHJldHVybiAnJztcbn07XG5cbmV4cG9ydHMuc2VsZWN0T3JkaW5hbCA9IHNlbGVjdE9yZGluYWw7IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX3R5cGVvZihvYmopIHtcbiAgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiO1xuXG4gIHJldHVybiBfdHlwZW9mID0gXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgXCJzeW1ib2xcIiA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKG9iaikge1xuICAgIHJldHVybiB0eXBlb2Ygb2JqO1xuICB9IDogZnVuY3Rpb24gKG9iaikge1xuICAgIHJldHVybiBvYmogJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7XG4gIH0sIF90eXBlb2Yob2JqKTtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7XG4gIGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTtcbiAgfVxufSIsImZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07XG4gICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlO1xuICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTtcbiAgICBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7XG4gIGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpO1xuICBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDb25zdHJ1Y3RvciwgXCJwcm90b3R5cGVcIiwge1xuICAgIHdyaXRhYmxlOiBmYWxzZVxuICB9KTtcbiAgcmV0dXJuIENvbnN0cnVjdG9yO1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZikge1xuICBpZiAoc2VsZiA9PT0gdm9pZCAwKSB7XG4gICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpO1xuICB9XG5cbiAgcmV0dXJuIHNlbGY7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHtcbiAgX3NldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mLmJpbmQoKSA6IGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7XG4gICAgby5fX3Byb3RvX18gPSBwO1xuICAgIHJldHVybiBvO1xuICB9O1xuICByZXR1cm4gX3NldFByb3RvdHlwZU9mKG8sIHApO1xufSIsImltcG9ydCBzZXRQcm90b3R5cGVPZiBmcm9tIFwiLi9zZXRQcm90b3R5cGVPZi5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7XG4gIGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb25cIik7XG4gIH1cblxuICBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHtcbiAgICBjb25zdHJ1Y3Rvcjoge1xuICAgICAgdmFsdWU6IHN1YkNsYXNzLFxuICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9XG4gIH0pO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc3ViQ2xhc3MsIFwicHJvdG90eXBlXCIsIHtcbiAgICB3cml0YWJsZTogZmFsc2VcbiAgfSk7XG4gIGlmIChzdXBlckNsYXNzKSBzZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcyk7XG59IiwiaW1wb3J0IF90eXBlb2YgZnJvbSBcIi4vdHlwZW9mLmpzXCI7XG5pbXBvcnQgYXNzZXJ0VGhpc0luaXRpYWxpemVkIGZyb20gXCIuL2Fzc2VydFRoaXNJbml0aWFsaXplZC5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkge1xuICBpZiAoY2FsbCAmJiAoX3R5cGVvZihjYWxsKSA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSkge1xuICAgIHJldHVybiBjYWxsO1xuICB9IGVsc2UgaWYgKGNhbGwgIT09IHZvaWQgMCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJEZXJpdmVkIGNvbnN0cnVjdG9ycyBtYXkgb25seSByZXR1cm4gb2JqZWN0IG9yIHVuZGVmaW5lZFwiKTtcbiAgfVxuXG4gIHJldHVybiBhc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZik7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHtcbiAgX2dldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LmdldFByb3RvdHlwZU9mLmJpbmQoKSA6IGZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7XG4gICAgcmV0dXJuIG8uX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihvKTtcbiAgfTtcbiAgcmV0dXJuIF9nZXRQcm90b3R5cGVPZihvKTtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7XG4gIGlmIChrZXkgaW4gb2JqKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7XG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IHRydWVcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBvYmpba2V5XSA9IHZhbHVlO1xuICB9XG5cbiAgcmV0dXJuIG9iajtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfYXJyYXlXaXRoSG9sZXMoYXJyKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGFycikpIHJldHVybiBhcnI7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheShpdGVyKSB7XG4gIGlmICh0eXBlb2YgU3ltYm9sICE9PSBcInVuZGVmaW5lZFwiICYmIGl0ZXJbU3ltYm9sLml0ZXJhdG9yXSAhPSBudWxsIHx8IGl0ZXJbXCJAQGl0ZXJhdG9yXCJdICE9IG51bGwpIHJldHVybiBBcnJheS5mcm9tKGl0ZXIpO1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KGFyciwgbGVuKSB7XG4gIGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoO1xuXG4gIGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykge1xuICAgIGFycjJbaV0gPSBhcnJbaV07XG4gIH1cblxuICByZXR1cm4gYXJyMjtcbn0iLCJpbXBvcnQgYXJyYXlMaWtlVG9BcnJheSBmcm9tIFwiLi9hcnJheUxpa2VUb0FycmF5LmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7XG4gIGlmICghbykgcmV0dXJuO1xuICBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBhcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7XG4gIHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTtcbiAgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTtcbiAgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7XG4gIGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pO1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9ub25JdGVyYWJsZVJlc3QoKSB7XG4gIHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7XG59IiwiaW1wb3J0IGFycmF5V2l0aEhvbGVzIGZyb20gXCIuL2FycmF5V2l0aEhvbGVzLmpzXCI7XG5pbXBvcnQgaXRlcmFibGVUb0FycmF5IGZyb20gXCIuL2l0ZXJhYmxlVG9BcnJheS5qc1wiO1xuaW1wb3J0IHVuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5IGZyb20gXCIuL3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5LmpzXCI7XG5pbXBvcnQgbm9uSXRlcmFibGVSZXN0IGZyb20gXCIuL25vbkl0ZXJhYmxlUmVzdC5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX3RvQXJyYXkoYXJyKSB7XG4gIHJldHVybiBhcnJheVdpdGhIb2xlcyhhcnIpIHx8IGl0ZXJhYmxlVG9BcnJheShhcnIpIHx8IHVuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KGFycikgfHwgbm9uSXRlcmFibGVSZXN0KCk7XG59IiwiaW1wb3J0IF90eXBlb2YgZnJvbSAnQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdHlwZW9mJztcbmltcG9ydCBfY2xhc3NDYWxsQ2hlY2sgZnJvbSAnQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY2xhc3NDYWxsQ2hlY2snO1xuaW1wb3J0IF9jcmVhdGVDbGFzcyBmcm9tICdAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jcmVhdGVDbGFzcyc7XG5pbXBvcnQgX2Fzc2VydFRoaXNJbml0aWFsaXplZCBmcm9tICdAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQnO1xuaW1wb3J0IF9pbmhlcml0cyBmcm9tICdAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9pbmhlcml0cyc7XG5pbXBvcnQgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4gZnJvbSAnQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vcG9zc2libGVDb25zdHJ1Y3RvclJldHVybic7XG5pbXBvcnQgX2dldFByb3RvdHlwZU9mIGZyb20gJ0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2dldFByb3RvdHlwZU9mJztcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSAnQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHknO1xuaW1wb3J0IF90b0FycmF5IGZyb20gJ0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3RvQXJyYXknO1xuXG5mdW5jdGlvbiBvd25LZXlzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHsgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTsgaWYgKGVudW1lcmFibGVPbmx5KSB7IHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlOyB9KTsgfSBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7IH0gcmV0dXJuIGtleXM7IH1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXSAhPSBudWxsID8gYXJndW1lbnRzW2ldIDoge307IGlmIChpICUgMikgeyBvd25LZXlzKE9iamVjdChzb3VyY2UpLCB0cnVlKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pOyB9IGVsc2UgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSk7IH0gZWxzZSB7IG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTsgfSk7IH0gfSByZXR1cm4gdGFyZ2V0OyB9XG5cbnZhciBjb25zb2xlTG9nZ2VyID0ge1xuICB0eXBlOiAnbG9nZ2VyJyxcbiAgbG9nOiBmdW5jdGlvbiBsb2coYXJncykge1xuICAgIHRoaXMub3V0cHV0KCdsb2cnLCBhcmdzKTtcbiAgfSxcbiAgd2FybjogZnVuY3Rpb24gd2FybihhcmdzKSB7XG4gICAgdGhpcy5vdXRwdXQoJ3dhcm4nLCBhcmdzKTtcbiAgfSxcbiAgZXJyb3I6IGZ1bmN0aW9uIGVycm9yKGFyZ3MpIHtcbiAgICB0aGlzLm91dHB1dCgnZXJyb3InLCBhcmdzKTtcbiAgfSxcbiAgb3V0cHV0OiBmdW5jdGlvbiBvdXRwdXQodHlwZSwgYXJncykge1xuICAgIGlmIChjb25zb2xlICYmIGNvbnNvbGVbdHlwZV0pIGNvbnNvbGVbdHlwZV0uYXBwbHkoY29uc29sZSwgYXJncyk7XG4gIH1cbn07XG5cbnZhciBMb2dnZXIgPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIExvZ2dlcihjb25jcmV0ZUxvZ2dlcikge1xuICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBMb2dnZXIpO1xuXG4gICAgdGhpcy5pbml0KGNvbmNyZXRlTG9nZ2VyLCBvcHRpb25zKTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhMb2dnZXIsIFt7XG4gICAga2V5OiBcImluaXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaW5pdChjb25jcmV0ZUxvZ2dlcikge1xuICAgICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICAgICAgdGhpcy5wcmVmaXggPSBvcHRpb25zLnByZWZpeCB8fCAnaTE4bmV4dDonO1xuICAgICAgdGhpcy5sb2dnZXIgPSBjb25jcmV0ZUxvZ2dlciB8fCBjb25zb2xlTG9nZ2VyO1xuICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICAgIHRoaXMuZGVidWcgPSBvcHRpb25zLmRlYnVnO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzZXREZWJ1Z1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXREZWJ1Zyhib29sKSB7XG4gICAgICB0aGlzLmRlYnVnID0gYm9vbDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwibG9nXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGxvZygpIHtcbiAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5mb3J3YXJkKGFyZ3MsICdsb2cnLCAnJywgdHJ1ZSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIndhcm5cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gd2FybigpIHtcbiAgICAgIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuMiksIF9rZXkyID0gMDsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykge1xuICAgICAgICBhcmdzW19rZXkyXSA9IGFyZ3VtZW50c1tfa2V5Ml07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLmZvcndhcmQoYXJncywgJ3dhcm4nLCAnJywgdHJ1ZSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImVycm9yXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGVycm9yKCkge1xuICAgICAgZm9yICh2YXIgX2xlbjMgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4zKSwgX2tleTMgPSAwOyBfa2V5MyA8IF9sZW4zOyBfa2V5MysrKSB7XG4gICAgICAgIGFyZ3NbX2tleTNdID0gYXJndW1lbnRzW19rZXkzXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuZm9yd2FyZChhcmdzLCAnZXJyb3InLCAnJyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImRlcHJlY2F0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkZXByZWNhdGUoKSB7XG4gICAgICBmb3IgKHZhciBfbGVuNCA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbjQpLCBfa2V5NCA9IDA7IF9rZXk0IDwgX2xlbjQ7IF9rZXk0KyspIHtcbiAgICAgICAgYXJnc1tfa2V5NF0gPSBhcmd1bWVudHNbX2tleTRdO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5mb3J3YXJkKGFyZ3MsICd3YXJuJywgJ1dBUk5JTkcgREVQUkVDQVRFRDogJywgdHJ1ZSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImZvcndhcmRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZm9yd2FyZChhcmdzLCBsdmwsIHByZWZpeCwgZGVidWdPbmx5KSB7XG4gICAgICBpZiAoZGVidWdPbmx5ICYmICF0aGlzLmRlYnVnKSByZXR1cm4gbnVsbDtcbiAgICAgIGlmICh0eXBlb2YgYXJnc1swXSA9PT0gJ3N0cmluZycpIGFyZ3NbMF0gPSBcIlwiLmNvbmNhdChwcmVmaXgpLmNvbmNhdCh0aGlzLnByZWZpeCwgXCIgXCIpLmNvbmNhdChhcmdzWzBdKTtcbiAgICAgIHJldHVybiB0aGlzLmxvZ2dlcltsdmxdKGFyZ3MpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjcmVhdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY3JlYXRlKG1vZHVsZU5hbWUpIHtcbiAgICAgIHJldHVybiBuZXcgTG9nZ2VyKHRoaXMubG9nZ2VyLCBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHtcbiAgICAgICAgcHJlZml4OiBcIlwiLmNvbmNhdCh0aGlzLnByZWZpeCwgXCI6XCIpLmNvbmNhdChtb2R1bGVOYW1lLCBcIjpcIilcbiAgICAgIH0pLCB0aGlzLm9wdGlvbnMpKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY2xvbmVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY2xvbmUob3B0aW9ucykge1xuICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwgdGhpcy5vcHRpb25zO1xuICAgICAgb3B0aW9ucy5wcmVmaXggPSBvcHRpb25zLnByZWZpeCB8fCB0aGlzLnByZWZpeDtcbiAgICAgIHJldHVybiBuZXcgTG9nZ2VyKHRoaXMubG9nZ2VyLCBvcHRpb25zKTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gTG9nZ2VyO1xufSgpO1xuXG52YXIgYmFzZUxvZ2dlciA9IG5ldyBMb2dnZXIoKTtcblxudmFyIEV2ZW50RW1pdHRlciA9IGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gRXZlbnRFbWl0dGVyKCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBFdmVudEVtaXR0ZXIpO1xuXG4gICAgdGhpcy5vYnNlcnZlcnMgPSB7fTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhFdmVudEVtaXR0ZXIsIFt7XG4gICAga2V5OiBcIm9uXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG9uKGV2ZW50cywgbGlzdGVuZXIpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgIGV2ZW50cy5zcGxpdCgnICcpLmZvckVhY2goZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIF90aGlzLm9ic2VydmVyc1tldmVudF0gPSBfdGhpcy5vYnNlcnZlcnNbZXZlbnRdIHx8IFtdO1xuXG4gICAgICAgIF90aGlzLm9ic2VydmVyc1tldmVudF0ucHVzaChsaXN0ZW5lcik7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJvZmZcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gb2ZmKGV2ZW50LCBsaXN0ZW5lcikge1xuICAgICAgaWYgKCF0aGlzLm9ic2VydmVyc1tldmVudF0pIHJldHVybjtcblxuICAgICAgaWYgKCFsaXN0ZW5lcikge1xuICAgICAgICBkZWxldGUgdGhpcy5vYnNlcnZlcnNbZXZlbnRdO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMub2JzZXJ2ZXJzW2V2ZW50XSA9IHRoaXMub2JzZXJ2ZXJzW2V2ZW50XS5maWx0ZXIoZnVuY3Rpb24gKGwpIHtcbiAgICAgICAgcmV0dXJuIGwgIT09IGxpc3RlbmVyO1xuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImVtaXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZW1pdChldmVudCkge1xuICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiA+IDEgPyBfbGVuIC0gMSA6IDApLCBfa2V5ID0gMTsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgICBhcmdzW19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMub2JzZXJ2ZXJzW2V2ZW50XSkge1xuICAgICAgICB2YXIgY2xvbmVkID0gW10uY29uY2F0KHRoaXMub2JzZXJ2ZXJzW2V2ZW50XSk7XG4gICAgICAgIGNsb25lZC5mb3JFYWNoKGZ1bmN0aW9uIChvYnNlcnZlcikge1xuICAgICAgICAgIG9ic2VydmVyLmFwcGx5KHZvaWQgMCwgYXJncyk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5vYnNlcnZlcnNbJyonXSkge1xuICAgICAgICB2YXIgX2Nsb25lZCA9IFtdLmNvbmNhdCh0aGlzLm9ic2VydmVyc1snKiddKTtcblxuICAgICAgICBfY2xvbmVkLmZvckVhY2goZnVuY3Rpb24gKG9ic2VydmVyKSB7XG4gICAgICAgICAgb2JzZXJ2ZXIuYXBwbHkob2JzZXJ2ZXIsIFtldmVudF0uY29uY2F0KGFyZ3MpKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIEV2ZW50RW1pdHRlcjtcbn0oKTtcblxuZnVuY3Rpb24gZGVmZXIoKSB7XG4gIHZhciByZXM7XG4gIHZhciByZWo7XG4gIHZhciBwcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgIHJlcyA9IHJlc29sdmU7XG4gICAgcmVqID0gcmVqZWN0O1xuICB9KTtcbiAgcHJvbWlzZS5yZXNvbHZlID0gcmVzO1xuICBwcm9taXNlLnJlamVjdCA9IHJlajtcbiAgcmV0dXJuIHByb21pc2U7XG59XG5mdW5jdGlvbiBtYWtlU3RyaW5nKG9iamVjdCkge1xuICBpZiAob2JqZWN0ID09IG51bGwpIHJldHVybiAnJztcbiAgcmV0dXJuICcnICsgb2JqZWN0O1xufVxuZnVuY3Rpb24gY29weShhLCBzLCB0KSB7XG4gIGEuZm9yRWFjaChmdW5jdGlvbiAobSkge1xuICAgIGlmIChzW21dKSB0W21dID0gc1ttXTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldExhc3RPZlBhdGgob2JqZWN0LCBwYXRoLCBFbXB0eSkge1xuICBmdW5jdGlvbiBjbGVhbktleShrZXkpIHtcbiAgICByZXR1cm4ga2V5ICYmIGtleS5pbmRleE9mKCcjIyMnKSA+IC0xID8ga2V5LnJlcGxhY2UoLyMjIy9nLCAnLicpIDoga2V5O1xuICB9XG5cbiAgZnVuY3Rpb24gY2FuTm90VHJhdmVyc2VEZWVwZXIoKSB7XG4gICAgcmV0dXJuICFvYmplY3QgfHwgdHlwZW9mIG9iamVjdCA9PT0gJ3N0cmluZyc7XG4gIH1cblxuICB2YXIgc3RhY2sgPSB0eXBlb2YgcGF0aCAhPT0gJ3N0cmluZycgPyBbXS5jb25jYXQocGF0aCkgOiBwYXRoLnNwbGl0KCcuJyk7XG5cbiAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDEpIHtcbiAgICBpZiAoY2FuTm90VHJhdmVyc2VEZWVwZXIoKSkgcmV0dXJuIHt9O1xuICAgIHZhciBrZXkgPSBjbGVhbktleShzdGFjay5zaGlmdCgpKTtcbiAgICBpZiAoIW9iamVjdFtrZXldICYmIEVtcHR5KSBvYmplY3Rba2V5XSA9IG5ldyBFbXB0eSgpO1xuXG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkpIHtcbiAgICAgIG9iamVjdCA9IG9iamVjdFtrZXldO1xuICAgIH0gZWxzZSB7XG4gICAgICBvYmplY3QgPSB7fTtcbiAgICB9XG4gIH1cblxuICBpZiAoY2FuTm90VHJhdmVyc2VEZWVwZXIoKSkgcmV0dXJuIHt9O1xuICByZXR1cm4ge1xuICAgIG9iajogb2JqZWN0LFxuICAgIGs6IGNsZWFuS2V5KHN0YWNrLnNoaWZ0KCkpXG4gIH07XG59XG5cbmZ1bmN0aW9uIHNldFBhdGgob2JqZWN0LCBwYXRoLCBuZXdWYWx1ZSkge1xuICB2YXIgX2dldExhc3RPZlBhdGggPSBnZXRMYXN0T2ZQYXRoKG9iamVjdCwgcGF0aCwgT2JqZWN0KSxcbiAgICAgIG9iaiA9IF9nZXRMYXN0T2ZQYXRoLm9iaixcbiAgICAgIGsgPSBfZ2V0TGFzdE9mUGF0aC5rO1xuXG4gIG9ialtrXSA9IG5ld1ZhbHVlO1xufVxuZnVuY3Rpb24gcHVzaFBhdGgob2JqZWN0LCBwYXRoLCBuZXdWYWx1ZSwgY29uY2F0KSB7XG4gIHZhciBfZ2V0TGFzdE9mUGF0aDIgPSBnZXRMYXN0T2ZQYXRoKG9iamVjdCwgcGF0aCwgT2JqZWN0KSxcbiAgICAgIG9iaiA9IF9nZXRMYXN0T2ZQYXRoMi5vYmosXG4gICAgICBrID0gX2dldExhc3RPZlBhdGgyLms7XG5cbiAgb2JqW2tdID0gb2JqW2tdIHx8IFtdO1xuICBpZiAoY29uY2F0KSBvYmpba10gPSBvYmpba10uY29uY2F0KG5ld1ZhbHVlKTtcbiAgaWYgKCFjb25jYXQpIG9ialtrXS5wdXNoKG5ld1ZhbHVlKTtcbn1cbmZ1bmN0aW9uIGdldFBhdGgob2JqZWN0LCBwYXRoKSB7XG4gIHZhciBfZ2V0TGFzdE9mUGF0aDMgPSBnZXRMYXN0T2ZQYXRoKG9iamVjdCwgcGF0aCksXG4gICAgICBvYmogPSBfZ2V0TGFzdE9mUGF0aDMub2JqLFxuICAgICAgayA9IF9nZXRMYXN0T2ZQYXRoMy5rO1xuXG4gIGlmICghb2JqKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gb2JqW2tdO1xufVxuZnVuY3Rpb24gZ2V0UGF0aFdpdGhEZWZhdWx0cyhkYXRhLCBkZWZhdWx0RGF0YSwga2V5KSB7XG4gIHZhciB2YWx1ZSA9IGdldFBhdGgoZGF0YSwga2V5KTtcblxuICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIHJldHVybiBnZXRQYXRoKGRlZmF1bHREYXRhLCBrZXkpO1xufVxuZnVuY3Rpb24gZGVlcEV4dGVuZCh0YXJnZXQsIHNvdXJjZSwgb3ZlcndyaXRlKSB7XG4gIGZvciAodmFyIHByb3AgaW4gc291cmNlKSB7XG4gICAgaWYgKHByb3AgIT09ICdfX3Byb3RvX18nICYmIHByb3AgIT09ICdjb25zdHJ1Y3RvcicpIHtcbiAgICAgIGlmIChwcm9wIGluIHRhcmdldCkge1xuICAgICAgICBpZiAodHlwZW9mIHRhcmdldFtwcm9wXSA9PT0gJ3N0cmluZycgfHwgdGFyZ2V0W3Byb3BdIGluc3RhbmNlb2YgU3RyaW5nIHx8IHR5cGVvZiBzb3VyY2VbcHJvcF0gPT09ICdzdHJpbmcnIHx8IHNvdXJjZVtwcm9wXSBpbnN0YW5jZW9mIFN0cmluZykge1xuICAgICAgICAgIGlmIChvdmVyd3JpdGUpIHRhcmdldFtwcm9wXSA9IHNvdXJjZVtwcm9wXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkZWVwRXh0ZW5kKHRhcmdldFtwcm9wXSwgc291cmNlW3Byb3BdLCBvdmVyd3JpdGUpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0YXJnZXRbcHJvcF0gPSBzb3VyY2VbcHJvcF07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn1cbmZ1bmN0aW9uIHJlZ2V4RXNjYXBlKHN0cikge1xuICByZXR1cm4gc3RyLnJlcGxhY2UoL1tcXC1cXFtcXF1cXC9cXHtcXH1cXChcXClcXCpcXCtcXD9cXC5cXFxcXFxeXFwkXFx8XS9nLCAnXFxcXCQmJyk7XG59XG52YXIgX2VudGl0eU1hcCA9IHtcbiAgJyYnOiAnJmFtcDsnLFxuICAnPCc6ICcmbHQ7JyxcbiAgJz4nOiAnJmd0OycsXG4gICdcIic6ICcmcXVvdDsnLFxuICBcIidcIjogJyYjMzk7JyxcbiAgJy8nOiAnJiN4MkY7J1xufTtcbmZ1bmN0aW9uIGVzY2FwZShkYXRhKSB7XG4gIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZGF0YS5yZXBsYWNlKC9bJjw+XCInXFwvXS9nLCBmdW5jdGlvbiAocykge1xuICAgICAgcmV0dXJuIF9lbnRpdHlNYXBbc107XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gZGF0YTtcbn1cbnZhciBpc0lFMTAgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cubmF2aWdhdG9yICYmIHR5cGVvZiB3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudERhdGEgPT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50ICYmIHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ01TSUUnKSA+IC0xO1xudmFyIGNoYXJzID0gWycgJywgJywnLCAnPycsICchJywgJzsnXTtcbmZ1bmN0aW9uIGxvb2tzTGlrZU9iamVjdFBhdGgoa2V5LCBuc1NlcGFyYXRvciwga2V5U2VwYXJhdG9yKSB7XG4gIG5zU2VwYXJhdG9yID0gbnNTZXBhcmF0b3IgfHwgJyc7XG4gIGtleVNlcGFyYXRvciA9IGtleVNlcGFyYXRvciB8fCAnJztcbiAgdmFyIHBvc3NpYmxlQ2hhcnMgPSBjaGFycy5maWx0ZXIoZnVuY3Rpb24gKGMpIHtcbiAgICByZXR1cm4gbnNTZXBhcmF0b3IuaW5kZXhPZihjKSA8IDAgJiYga2V5U2VwYXJhdG9yLmluZGV4T2YoYykgPCAwO1xuICB9KTtcbiAgaWYgKHBvc3NpYmxlQ2hhcnMubGVuZ3RoID09PSAwKSByZXR1cm4gdHJ1ZTtcbiAgdmFyIHIgPSBuZXcgUmVnRXhwKFwiKFwiLmNvbmNhdChwb3NzaWJsZUNoYXJzLm1hcChmdW5jdGlvbiAoYykge1xuICAgIHJldHVybiBjID09PSAnPycgPyAnXFxcXD8nIDogYztcbiAgfSkuam9pbignfCcpLCBcIilcIikpO1xuICB2YXIgbWF0Y2hlZCA9ICFyLnRlc3Qoa2V5KTtcblxuICBpZiAoIW1hdGNoZWQpIHtcbiAgICB2YXIga2kgPSBrZXkuaW5kZXhPZihrZXlTZXBhcmF0b3IpO1xuXG4gICAgaWYgKGtpID4gMCAmJiAhci50ZXN0KGtleS5zdWJzdHJpbmcoMCwga2kpKSkge1xuICAgICAgbWF0Y2hlZCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG1hdGNoZWQ7XG59XG5cbmZ1bmN0aW9uIG93bktleXMkMShvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7IHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7IGlmIChlbnVtZXJhYmxlT25seSkgeyBzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTsgfSk7IH0ga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpOyB9IHJldHVybiBrZXlzOyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQkMSh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXSAhPSBudWxsID8gYXJndW1lbnRzW2ldIDoge307IGlmIChpICUgMikgeyBvd25LZXlzJDEoT2JqZWN0KHNvdXJjZSksIHRydWUpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsgfSk7IH0gZWxzZSBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMpIHsgT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKTsgfSBlbHNlIHsgb3duS2V5cyQxKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7IH0pOyB9IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfY3JlYXRlU3VwZXIoRGVyaXZlZCkgeyB2YXIgaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCA9IF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKTsgcmV0dXJuIGZ1bmN0aW9uIF9jcmVhdGVTdXBlckludGVybmFsKCkgeyB2YXIgU3VwZXIgPSBfZ2V0UHJvdG90eXBlT2YoRGVyaXZlZCksIHJlc3VsdDsgaWYgKGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QpIHsgdmFyIE5ld1RhcmdldCA9IF9nZXRQcm90b3R5cGVPZih0aGlzKS5jb25zdHJ1Y3RvcjsgcmVzdWx0ID0gUmVmbGVjdC5jb25zdHJ1Y3QoU3VwZXIsIGFyZ3VtZW50cywgTmV3VGFyZ2V0KTsgfSBlbHNlIHsgcmVzdWx0ID0gU3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfSByZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgcmVzdWx0KTsgfTsgfVxuXG5mdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCkgeyBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwidW5kZWZpbmVkXCIgfHwgIVJlZmxlY3QuY29uc3RydWN0KSByZXR1cm4gZmFsc2U7IGlmIChSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKSByZXR1cm4gZmFsc2U7IGlmICh0eXBlb2YgUHJveHkgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIHRydWU7IHRyeSB7IEJvb2xlYW4ucHJvdG90eXBlLnZhbHVlT2YuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChCb29sZWFuLCBbXSwgZnVuY3Rpb24gKCkge30pKTsgcmV0dXJuIHRydWU7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIGZhbHNlOyB9IH1cblxuZnVuY3Rpb24gZGVlcEZpbmQob2JqLCBwYXRoKSB7XG4gIHZhciBrZXlTZXBhcmF0b3IgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6ICcuJztcbiAgaWYgKCFvYmopIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmIChvYmpbcGF0aF0pIHJldHVybiBvYmpbcGF0aF07XG4gIHZhciBwYXRocyA9IHBhdGguc3BsaXQoa2V5U2VwYXJhdG9yKTtcbiAgdmFyIGN1cnJlbnQgPSBvYmo7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXRocy5sZW5ndGg7ICsraSkge1xuICAgIGlmICghY3VycmVudCkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgIGlmICh0eXBlb2YgY3VycmVudFtwYXRoc1tpXV0gPT09ICdzdHJpbmcnICYmIGkgKyAxIDwgcGF0aHMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGlmIChjdXJyZW50W3BhdGhzW2ldXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB2YXIgaiA9IDI7XG4gICAgICB2YXIgcCA9IHBhdGhzLnNsaWNlKGksIGkgKyBqKS5qb2luKGtleVNlcGFyYXRvcik7XG4gICAgICB2YXIgbWl4ID0gY3VycmVudFtwXTtcblxuICAgICAgd2hpbGUgKG1peCA9PT0gdW5kZWZpbmVkICYmIHBhdGhzLmxlbmd0aCA+IGkgKyBqKSB7XG4gICAgICAgIGorKztcbiAgICAgICAgcCA9IHBhdGhzLnNsaWNlKGksIGkgKyBqKS5qb2luKGtleVNlcGFyYXRvcik7XG4gICAgICAgIG1peCA9IGN1cnJlbnRbcF07XG4gICAgICB9XG5cbiAgICAgIGlmIChtaXggPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIGlmIChtaXggPT09IG51bGwpIHJldHVybiBudWxsO1xuXG4gICAgICBpZiAocGF0aC5lbmRzV2l0aChwKSkge1xuICAgICAgICBpZiAodHlwZW9mIG1peCA9PT0gJ3N0cmluZycpIHJldHVybiBtaXg7XG4gICAgICAgIGlmIChwICYmIHR5cGVvZiBtaXhbcF0gPT09ICdzdHJpbmcnKSByZXR1cm4gbWl4W3BdO1xuICAgICAgfVxuXG4gICAgICB2YXIgam9pbmVkUGF0aCA9IHBhdGhzLnNsaWNlKGkgKyBqKS5qb2luKGtleVNlcGFyYXRvcik7XG4gICAgICBpZiAoam9pbmVkUGF0aCkgcmV0dXJuIGRlZXBGaW5kKG1peCwgam9pbmVkUGF0aCwga2V5U2VwYXJhdG9yKTtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgY3VycmVudCA9IGN1cnJlbnRbcGF0aHNbaV1dO1xuICB9XG5cbiAgcmV0dXJuIGN1cnJlbnQ7XG59XG5cbnZhciBSZXNvdXJjZVN0b3JlID0gZnVuY3Rpb24gKF9FdmVudEVtaXR0ZXIpIHtcbiAgX2luaGVyaXRzKFJlc291cmNlU3RvcmUsIF9FdmVudEVtaXR0ZXIpO1xuXG4gIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIoUmVzb3VyY2VTdG9yZSk7XG5cbiAgZnVuY3Rpb24gUmVzb3VyY2VTdG9yZShkYXRhKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHtcbiAgICAgIG5zOiBbJ3RyYW5zbGF0aW9uJ10sXG4gICAgICBkZWZhdWx0TlM6ICd0cmFuc2xhdGlvbidcbiAgICB9O1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFJlc291cmNlU3RvcmUpO1xuXG4gICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKTtcblxuICAgIGlmIChpc0lFMTApIHtcbiAgICAgIEV2ZW50RW1pdHRlci5jYWxsKF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpKTtcbiAgICB9XG5cbiAgICBfdGhpcy5kYXRhID0gZGF0YSB8fCB7fTtcbiAgICBfdGhpcy5vcHRpb25zID0gb3B0aW9ucztcblxuICAgIGlmIChfdGhpcy5vcHRpb25zLmtleVNlcGFyYXRvciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBfdGhpcy5vcHRpb25zLmtleVNlcGFyYXRvciA9ICcuJztcbiAgICB9XG5cbiAgICBpZiAoX3RoaXMub3B0aW9ucy5pZ25vcmVKU09OU3RydWN0dXJlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIF90aGlzLm9wdGlvbnMuaWdub3JlSlNPTlN0cnVjdHVyZSA9IHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKFJlc291cmNlU3RvcmUsIFt7XG4gICAga2V5OiBcImFkZE5hbWVzcGFjZXNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYWRkTmFtZXNwYWNlcyhucykge1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5ucy5pbmRleE9mKG5zKSA8IDApIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLm5zLnB1c2gobnMpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW1vdmVOYW1lc3BhY2VzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbW92ZU5hbWVzcGFjZXMobnMpIHtcbiAgICAgIHZhciBpbmRleCA9IHRoaXMub3B0aW9ucy5ucy5pbmRleE9mKG5zKTtcblxuICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLm5zLnNwbGljZShpbmRleCwgMSk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldFJlc291cmNlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldFJlc291cmNlKGxuZywgbnMsIGtleSkge1xuICAgICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IHt9O1xuICAgICAgdmFyIGtleVNlcGFyYXRvciA9IG9wdGlvbnMua2V5U2VwYXJhdG9yICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmtleVNlcGFyYXRvciA6IHRoaXMub3B0aW9ucy5rZXlTZXBhcmF0b3I7XG4gICAgICB2YXIgaWdub3JlSlNPTlN0cnVjdHVyZSA9IG9wdGlvbnMuaWdub3JlSlNPTlN0cnVjdHVyZSAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5pZ25vcmVKU09OU3RydWN0dXJlIDogdGhpcy5vcHRpb25zLmlnbm9yZUpTT05TdHJ1Y3R1cmU7XG4gICAgICB2YXIgcGF0aCA9IFtsbmcsIG5zXTtcbiAgICAgIGlmIChrZXkgJiYgdHlwZW9mIGtleSAhPT0gJ3N0cmluZycpIHBhdGggPSBwYXRoLmNvbmNhdChrZXkpO1xuICAgICAgaWYgKGtleSAmJiB0eXBlb2Yga2V5ID09PSAnc3RyaW5nJykgcGF0aCA9IHBhdGguY29uY2F0KGtleVNlcGFyYXRvciA/IGtleS5zcGxpdChrZXlTZXBhcmF0b3IpIDoga2V5KTtcblxuICAgICAgaWYgKGxuZy5pbmRleE9mKCcuJykgPiAtMSkge1xuICAgICAgICBwYXRoID0gbG5nLnNwbGl0KCcuJyk7XG4gICAgICB9XG5cbiAgICAgIHZhciByZXN1bHQgPSBnZXRQYXRoKHRoaXMuZGF0YSwgcGF0aCk7XG4gICAgICBpZiAocmVzdWx0IHx8ICFpZ25vcmVKU09OU3RydWN0dXJlIHx8IHR5cGVvZiBrZXkgIT09ICdzdHJpbmcnKSByZXR1cm4gcmVzdWx0O1xuICAgICAgcmV0dXJuIGRlZXBGaW5kKHRoaXMuZGF0YSAmJiB0aGlzLmRhdGFbbG5nXSAmJiB0aGlzLmRhdGFbbG5nXVtuc10sIGtleSwga2V5U2VwYXJhdG9yKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiYWRkUmVzb3VyY2VcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYWRkUmVzb3VyY2UobG5nLCBucywga2V5LCB2YWx1ZSkge1xuICAgICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gNCAmJiBhcmd1bWVudHNbNF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1s0XSA6IHtcbiAgICAgICAgc2lsZW50OiBmYWxzZVxuICAgICAgfTtcbiAgICAgIHZhciBrZXlTZXBhcmF0b3IgPSB0aGlzLm9wdGlvbnMua2V5U2VwYXJhdG9yO1xuICAgICAgaWYgKGtleVNlcGFyYXRvciA9PT0gdW5kZWZpbmVkKSBrZXlTZXBhcmF0b3IgPSAnLic7XG4gICAgICB2YXIgcGF0aCA9IFtsbmcsIG5zXTtcbiAgICAgIGlmIChrZXkpIHBhdGggPSBwYXRoLmNvbmNhdChrZXlTZXBhcmF0b3IgPyBrZXkuc3BsaXQoa2V5U2VwYXJhdG9yKSA6IGtleSk7XG5cbiAgICAgIGlmIChsbmcuaW5kZXhPZignLicpID4gLTEpIHtcbiAgICAgICAgcGF0aCA9IGxuZy5zcGxpdCgnLicpO1xuICAgICAgICB2YWx1ZSA9IG5zO1xuICAgICAgICBucyA9IHBhdGhbMV07XG4gICAgICB9XG5cbiAgICAgIHRoaXMuYWRkTmFtZXNwYWNlcyhucyk7XG4gICAgICBzZXRQYXRoKHRoaXMuZGF0YSwgcGF0aCwgdmFsdWUpO1xuICAgICAgaWYgKCFvcHRpb25zLnNpbGVudCkgdGhpcy5lbWl0KCdhZGRlZCcsIGxuZywgbnMsIGtleSwgdmFsdWUpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJhZGRSZXNvdXJjZXNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYWRkUmVzb3VyY2VzKGxuZywgbnMsIHJlc291cmNlcykge1xuICAgICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IHtcbiAgICAgICAgc2lsZW50OiBmYWxzZVxuICAgICAgfTtcblxuICAgICAgZm9yICh2YXIgbSBpbiByZXNvdXJjZXMpIHtcbiAgICAgICAgaWYgKHR5cGVvZiByZXNvdXJjZXNbbV0gPT09ICdzdHJpbmcnIHx8IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuYXBwbHkocmVzb3VyY2VzW21dKSA9PT0gJ1tvYmplY3QgQXJyYXldJykgdGhpcy5hZGRSZXNvdXJjZShsbmcsIG5zLCBtLCByZXNvdXJjZXNbbV0sIHtcbiAgICAgICAgICBzaWxlbnQ6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmICghb3B0aW9ucy5zaWxlbnQpIHRoaXMuZW1pdCgnYWRkZWQnLCBsbmcsIG5zLCByZXNvdXJjZXMpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJhZGRSZXNvdXJjZUJ1bmRsZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhZGRSZXNvdXJjZUJ1bmRsZShsbmcsIG5zLCByZXNvdXJjZXMsIGRlZXAsIG92ZXJ3cml0ZSkge1xuICAgICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gNSAmJiBhcmd1bWVudHNbNV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1s1XSA6IHtcbiAgICAgICAgc2lsZW50OiBmYWxzZVxuICAgICAgfTtcbiAgICAgIHZhciBwYXRoID0gW2xuZywgbnNdO1xuXG4gICAgICBpZiAobG5nLmluZGV4T2YoJy4nKSA+IC0xKSB7XG4gICAgICAgIHBhdGggPSBsbmcuc3BsaXQoJy4nKTtcbiAgICAgICAgZGVlcCA9IHJlc291cmNlcztcbiAgICAgICAgcmVzb3VyY2VzID0gbnM7XG4gICAgICAgIG5zID0gcGF0aFsxXTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5hZGROYW1lc3BhY2VzKG5zKTtcbiAgICAgIHZhciBwYWNrID0gZ2V0UGF0aCh0aGlzLmRhdGEsIHBhdGgpIHx8IHt9O1xuXG4gICAgICBpZiAoZGVlcCkge1xuICAgICAgICBkZWVwRXh0ZW5kKHBhY2ssIHJlc291cmNlcywgb3ZlcndyaXRlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhY2sgPSBfb2JqZWN0U3ByZWFkJDEoX29iamVjdFNwcmVhZCQxKHt9LCBwYWNrKSwgcmVzb3VyY2VzKTtcbiAgICAgIH1cblxuICAgICAgc2V0UGF0aCh0aGlzLmRhdGEsIHBhdGgsIHBhY2spO1xuICAgICAgaWYgKCFvcHRpb25zLnNpbGVudCkgdGhpcy5lbWl0KCdhZGRlZCcsIGxuZywgbnMsIHJlc291cmNlcyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbW92ZVJlc291cmNlQnVuZGxlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbW92ZVJlc291cmNlQnVuZGxlKGxuZywgbnMpIHtcbiAgICAgIGlmICh0aGlzLmhhc1Jlc291cmNlQnVuZGxlKGxuZywgbnMpKSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLmRhdGFbbG5nXVtuc107XG4gICAgICB9XG5cbiAgICAgIHRoaXMucmVtb3ZlTmFtZXNwYWNlcyhucyk7XG4gICAgICB0aGlzLmVtaXQoJ3JlbW92ZWQnLCBsbmcsIG5zKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaGFzUmVzb3VyY2VCdW5kbGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaGFzUmVzb3VyY2VCdW5kbGUobG5nLCBucykge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0UmVzb3VyY2UobG5nLCBucykgIT09IHVuZGVmaW5lZDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0UmVzb3VyY2VCdW5kbGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0UmVzb3VyY2VCdW5kbGUobG5nLCBucykge1xuICAgICAgaWYgKCFucykgbnMgPSB0aGlzLm9wdGlvbnMuZGVmYXVsdE5TO1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5jb21wYXRpYmlsaXR5QVBJID09PSAndjEnKSByZXR1cm4gX29iamVjdFNwcmVhZCQxKF9vYmplY3RTcHJlYWQkMSh7fSwge30pLCB0aGlzLmdldFJlc291cmNlKGxuZywgbnMpKTtcbiAgICAgIHJldHVybiB0aGlzLmdldFJlc291cmNlKGxuZywgbnMpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXREYXRhQnlMYW5ndWFnZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXREYXRhQnlMYW5ndWFnZShsbmcpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFbbG5nXTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaGFzTGFuZ3VhZ2VTb21lVHJhbnNsYXRpb25zXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGhhc0xhbmd1YWdlU29tZVRyYW5zbGF0aW9ucyhsbmcpIHtcbiAgICAgIHZhciBkYXRhID0gdGhpcy5nZXREYXRhQnlMYW5ndWFnZShsbmcpO1xuICAgICAgdmFyIG4gPSBkYXRhICYmIE9iamVjdC5rZXlzKGRhdGEpIHx8IFtdO1xuICAgICAgcmV0dXJuICEhbi5maW5kKGZ1bmN0aW9uICh2KSB7XG4gICAgICAgIHJldHVybiBkYXRhW3ZdICYmIE9iamVjdC5rZXlzKGRhdGFbdl0pLmxlbmd0aCA+IDA7XG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidG9KU09OXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHRvSlNPTigpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGE7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFJlc291cmNlU3RvcmU7XG59KEV2ZW50RW1pdHRlcik7XG5cbnZhciBwb3N0UHJvY2Vzc29yID0ge1xuICBwcm9jZXNzb3JzOiB7fSxcbiAgYWRkUG9zdFByb2Nlc3NvcjogZnVuY3Rpb24gYWRkUG9zdFByb2Nlc3Nvcihtb2R1bGUpIHtcbiAgICB0aGlzLnByb2Nlc3NvcnNbbW9kdWxlLm5hbWVdID0gbW9kdWxlO1xuICB9LFxuICBoYW5kbGU6IGZ1bmN0aW9uIGhhbmRsZShwcm9jZXNzb3JzLCB2YWx1ZSwga2V5LCBvcHRpb25zLCB0cmFuc2xhdG9yKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIHByb2Nlc3NvcnMuZm9yRWFjaChmdW5jdGlvbiAocHJvY2Vzc29yKSB7XG4gICAgICBpZiAoX3RoaXMucHJvY2Vzc29yc1twcm9jZXNzb3JdKSB2YWx1ZSA9IF90aGlzLnByb2Nlc3NvcnNbcHJvY2Vzc29yXS5wcm9jZXNzKHZhbHVlLCBrZXksIG9wdGlvbnMsIHRyYW5zbGF0b3IpO1xuICAgIH0pO1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxufTtcblxuZnVuY3Rpb24gb3duS2V5cyQyKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHsgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTsgaWYgKGVudW1lcmFibGVPbmx5KSB7IHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlOyB9KTsgfSBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7IH0gcmV0dXJuIGtleXM7IH1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCQyKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldICE9IG51bGwgPyBhcmd1bWVudHNbaV0gOiB7fTsgaWYgKGkgJSAyKSB7IG93bktleXMkMihPYmplY3Qoc291cmNlKSwgdHJ1ZSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOyB9KTsgfSBlbHNlIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycykgeyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpOyB9IGVsc2UgeyBvd25LZXlzJDIoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTsgfSk7IH0gfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmZ1bmN0aW9uIF9jcmVhdGVTdXBlciQxKERlcml2ZWQpIHsgdmFyIGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QgPSBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0JDEoKTsgcmV0dXJuIGZ1bmN0aW9uIF9jcmVhdGVTdXBlckludGVybmFsKCkgeyB2YXIgU3VwZXIgPSBfZ2V0UHJvdG90eXBlT2YoRGVyaXZlZCksIHJlc3VsdDsgaWYgKGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QpIHsgdmFyIE5ld1RhcmdldCA9IF9nZXRQcm90b3R5cGVPZih0aGlzKS5jb25zdHJ1Y3RvcjsgcmVzdWx0ID0gUmVmbGVjdC5jb25zdHJ1Y3QoU3VwZXIsIGFyZ3VtZW50cywgTmV3VGFyZ2V0KTsgfSBlbHNlIHsgcmVzdWx0ID0gU3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfSByZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgcmVzdWx0KTsgfTsgfVxuXG5mdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0JDEoKSB7IGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhUmVmbGVjdC5jb25zdHJ1Y3QpIHJldHVybiBmYWxzZTsgaWYgKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pIHJldHVybiBmYWxzZTsgaWYgKHR5cGVvZiBQcm94eSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gdHJ1ZTsgdHJ5IHsgQm9vbGVhbi5wcm90b3R5cGUudmFsdWVPZi5jYWxsKFJlZmxlY3QuY29uc3RydWN0KEJvb2xlYW4sIFtdLCBmdW5jdGlvbiAoKSB7fSkpOyByZXR1cm4gdHJ1ZTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0gfVxudmFyIGNoZWNrZWRMb2FkZWRGb3IgPSB7fTtcblxudmFyIFRyYW5zbGF0b3IgPSBmdW5jdGlvbiAoX0V2ZW50RW1pdHRlcikge1xuICBfaW5oZXJpdHMoVHJhbnNsYXRvciwgX0V2ZW50RW1pdHRlcik7XG5cbiAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlciQxKFRyYW5zbGF0b3IpO1xuXG4gIGZ1bmN0aW9uIFRyYW5zbGF0b3Ioc2VydmljZXMpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgVHJhbnNsYXRvcik7XG5cbiAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpO1xuXG4gICAgaWYgKGlzSUUxMCkge1xuICAgICAgRXZlbnRFbWl0dGVyLmNhbGwoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcykpO1xuICAgIH1cblxuICAgIGNvcHkoWydyZXNvdXJjZVN0b3JlJywgJ2xhbmd1YWdlVXRpbHMnLCAncGx1cmFsUmVzb2x2ZXInLCAnaW50ZXJwb2xhdG9yJywgJ2JhY2tlbmRDb25uZWN0b3InLCAnaTE4bkZvcm1hdCcsICd1dGlscyddLCBzZXJ2aWNlcywgX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcykpO1xuICAgIF90aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuXG4gICAgaWYgKF90aGlzLm9wdGlvbnMua2V5U2VwYXJhdG9yID09PSB1bmRlZmluZWQpIHtcbiAgICAgIF90aGlzLm9wdGlvbnMua2V5U2VwYXJhdG9yID0gJy4nO1xuICAgIH1cblxuICAgIF90aGlzLmxvZ2dlciA9IGJhc2VMb2dnZXIuY3JlYXRlKCd0cmFuc2xhdG9yJyk7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKFRyYW5zbGF0b3IsIFt7XG4gICAga2V5OiBcImNoYW5nZUxhbmd1YWdlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNoYW5nZUxhbmd1YWdlKGxuZykge1xuICAgICAgaWYgKGxuZykgdGhpcy5sYW5ndWFnZSA9IGxuZztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZXhpc3RzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGV4aXN0cyhrZXkpIHtcbiAgICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7XG4gICAgICAgIGludGVycG9sYXRpb246IHt9XG4gICAgICB9O1xuXG4gICAgICBpZiAoa2V5ID09PSB1bmRlZmluZWQgfHwga2V5ID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgdmFyIHJlc29sdmVkID0gdGhpcy5yZXNvbHZlKGtleSwgb3B0aW9ucyk7XG4gICAgICByZXR1cm4gcmVzb2x2ZWQgJiYgcmVzb2x2ZWQucmVzICE9PSB1bmRlZmluZWQ7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImV4dHJhY3RGcm9tS2V5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGV4dHJhY3RGcm9tS2V5KGtleSwgb3B0aW9ucykge1xuICAgICAgdmFyIG5zU2VwYXJhdG9yID0gb3B0aW9ucy5uc1NlcGFyYXRvciAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5uc1NlcGFyYXRvciA6IHRoaXMub3B0aW9ucy5uc1NlcGFyYXRvcjtcbiAgICAgIGlmIChuc1NlcGFyYXRvciA9PT0gdW5kZWZpbmVkKSBuc1NlcGFyYXRvciA9ICc6JztcbiAgICAgIHZhciBrZXlTZXBhcmF0b3IgPSBvcHRpb25zLmtleVNlcGFyYXRvciAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5rZXlTZXBhcmF0b3IgOiB0aGlzLm9wdGlvbnMua2V5U2VwYXJhdG9yO1xuICAgICAgdmFyIG5hbWVzcGFjZXMgPSBvcHRpb25zLm5zIHx8IHRoaXMub3B0aW9ucy5kZWZhdWx0TlMgfHwgW107XG4gICAgICB2YXIgd291bGRDaGVja0Zvck5zSW5LZXkgPSBuc1NlcGFyYXRvciAmJiBrZXkuaW5kZXhPZihuc1NlcGFyYXRvcikgPiAtMTtcbiAgICAgIHZhciBzZWVtc05hdHVyYWxMYW5ndWFnZSA9ICF0aGlzLm9wdGlvbnMudXNlckRlZmluZWRLZXlTZXBhcmF0b3IgJiYgIW9wdGlvbnMua2V5U2VwYXJhdG9yICYmICF0aGlzLm9wdGlvbnMudXNlckRlZmluZWROc1NlcGFyYXRvciAmJiAhb3B0aW9ucy5uc1NlcGFyYXRvciAmJiAhbG9va3NMaWtlT2JqZWN0UGF0aChrZXksIG5zU2VwYXJhdG9yLCBrZXlTZXBhcmF0b3IpO1xuXG4gICAgICBpZiAod291bGRDaGVja0Zvck5zSW5LZXkgJiYgIXNlZW1zTmF0dXJhbExhbmd1YWdlKSB7XG4gICAgICAgIHZhciBtID0ga2V5Lm1hdGNoKHRoaXMuaW50ZXJwb2xhdG9yLm5lc3RpbmdSZWdleHApO1xuXG4gICAgICAgIGlmIChtICYmIG0ubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBrZXk6IGtleSxcbiAgICAgICAgICAgIG5hbWVzcGFjZXM6IG5hbWVzcGFjZXNcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHBhcnRzID0ga2V5LnNwbGl0KG5zU2VwYXJhdG9yKTtcbiAgICAgICAgaWYgKG5zU2VwYXJhdG9yICE9PSBrZXlTZXBhcmF0b3IgfHwgbnNTZXBhcmF0b3IgPT09IGtleVNlcGFyYXRvciAmJiB0aGlzLm9wdGlvbnMubnMuaW5kZXhPZihwYXJ0c1swXSkgPiAtMSkgbmFtZXNwYWNlcyA9IHBhcnRzLnNoaWZ0KCk7XG4gICAgICAgIGtleSA9IHBhcnRzLmpvaW4oa2V5U2VwYXJhdG9yKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBuYW1lc3BhY2VzID09PSAnc3RyaW5nJykgbmFtZXNwYWNlcyA9IFtuYW1lc3BhY2VzXTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGtleToga2V5LFxuICAgICAgICBuYW1lc3BhY2VzOiBuYW1lc3BhY2VzXG4gICAgICB9O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ0cmFuc2xhdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdHJhbnNsYXRlKGtleXMsIG9wdGlvbnMsIGxhc3RLZXkpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICBpZiAoX3R5cGVvZihvcHRpb25zKSAhPT0gJ29iamVjdCcgJiYgdGhpcy5vcHRpb25zLm92ZXJsb2FkVHJhbnNsYXRpb25PcHRpb25IYW5kbGVyKSB7XG4gICAgICAgIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnMub3ZlcmxvYWRUcmFuc2xhdGlvbk9wdGlvbkhhbmRsZXIoYXJndW1lbnRzKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFvcHRpb25zKSBvcHRpb25zID0ge307XG4gICAgICBpZiAoa2V5cyA9PT0gdW5kZWZpbmVkIHx8IGtleXMgPT09IG51bGwpIHJldHVybiAnJztcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShrZXlzKSkga2V5cyA9IFtTdHJpbmcoa2V5cyldO1xuICAgICAgdmFyIHJldHVybkRldGFpbHMgPSBvcHRpb25zLnJldHVybkRldGFpbHMgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMucmV0dXJuRGV0YWlscyA6IHRoaXMub3B0aW9ucy5yZXR1cm5EZXRhaWxzO1xuICAgICAgdmFyIGtleVNlcGFyYXRvciA9IG9wdGlvbnMua2V5U2VwYXJhdG9yICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmtleVNlcGFyYXRvciA6IHRoaXMub3B0aW9ucy5rZXlTZXBhcmF0b3I7XG5cbiAgICAgIHZhciBfdGhpcyRleHRyYWN0RnJvbUtleSA9IHRoaXMuZXh0cmFjdEZyb21LZXkoa2V5c1trZXlzLmxlbmd0aCAtIDFdLCBvcHRpb25zKSxcbiAgICAgICAgICBrZXkgPSBfdGhpcyRleHRyYWN0RnJvbUtleS5rZXksXG4gICAgICAgICAgbmFtZXNwYWNlcyA9IF90aGlzJGV4dHJhY3RGcm9tS2V5Lm5hbWVzcGFjZXM7XG5cbiAgICAgIHZhciBuYW1lc3BhY2UgPSBuYW1lc3BhY2VzW25hbWVzcGFjZXMubGVuZ3RoIC0gMV07XG4gICAgICB2YXIgbG5nID0gb3B0aW9ucy5sbmcgfHwgdGhpcy5sYW5ndWFnZTtcbiAgICAgIHZhciBhcHBlbmROYW1lc3BhY2VUb0NJTW9kZSA9IG9wdGlvbnMuYXBwZW5kTmFtZXNwYWNlVG9DSU1vZGUgfHwgdGhpcy5vcHRpb25zLmFwcGVuZE5hbWVzcGFjZVRvQ0lNb2RlO1xuXG4gICAgICBpZiAobG5nICYmIGxuZy50b0xvd2VyQ2FzZSgpID09PSAnY2ltb2RlJykge1xuICAgICAgICBpZiAoYXBwZW5kTmFtZXNwYWNlVG9DSU1vZGUpIHtcbiAgICAgICAgICB2YXIgbnNTZXBhcmF0b3IgPSBvcHRpb25zLm5zU2VwYXJhdG9yIHx8IHRoaXMub3B0aW9ucy5uc1NlcGFyYXRvcjtcblxuICAgICAgICAgIGlmIChyZXR1cm5EZXRhaWxzKSB7XG4gICAgICAgICAgICByZXNvbHZlZC5yZXMgPSBcIlwiLmNvbmNhdChuYW1lc3BhY2UpLmNvbmNhdChuc1NlcGFyYXRvcikuY29uY2F0KGtleSk7XG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2ZWQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIFwiXCIuY29uY2F0KG5hbWVzcGFjZSkuY29uY2F0KG5zU2VwYXJhdG9yKS5jb25jYXQoa2V5KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXR1cm5EZXRhaWxzKSB7XG4gICAgICAgICAgcmVzb2x2ZWQucmVzID0ga2V5O1xuICAgICAgICAgIHJldHVybiByZXNvbHZlZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBrZXk7XG4gICAgICB9XG5cbiAgICAgIHZhciByZXNvbHZlZCA9IHRoaXMucmVzb2x2ZShrZXlzLCBvcHRpb25zKTtcbiAgICAgIHZhciByZXMgPSByZXNvbHZlZCAmJiByZXNvbHZlZC5yZXM7XG4gICAgICB2YXIgcmVzVXNlZEtleSA9IHJlc29sdmVkICYmIHJlc29sdmVkLnVzZWRLZXkgfHwga2V5O1xuICAgICAgdmFyIHJlc0V4YWN0VXNlZEtleSA9IHJlc29sdmVkICYmIHJlc29sdmVkLmV4YWN0VXNlZEtleSB8fCBrZXk7XG4gICAgICB2YXIgcmVzVHlwZSA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuYXBwbHkocmVzKTtcbiAgICAgIHZhciBub09iamVjdCA9IFsnW29iamVjdCBOdW1iZXJdJywgJ1tvYmplY3QgRnVuY3Rpb25dJywgJ1tvYmplY3QgUmVnRXhwXSddO1xuICAgICAgdmFyIGpvaW5BcnJheXMgPSBvcHRpb25zLmpvaW5BcnJheXMgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuam9pbkFycmF5cyA6IHRoaXMub3B0aW9ucy5qb2luQXJyYXlzO1xuICAgICAgdmFyIGhhbmRsZUFzT2JqZWN0SW5JMThuRm9ybWF0ID0gIXRoaXMuaTE4bkZvcm1hdCB8fCB0aGlzLmkxOG5Gb3JtYXQuaGFuZGxlQXNPYmplY3Q7XG4gICAgICB2YXIgaGFuZGxlQXNPYmplY3QgPSB0eXBlb2YgcmVzICE9PSAnc3RyaW5nJyAmJiB0eXBlb2YgcmVzICE9PSAnYm9vbGVhbicgJiYgdHlwZW9mIHJlcyAhPT0gJ251bWJlcic7XG5cbiAgICAgIGlmIChoYW5kbGVBc09iamVjdEluSTE4bkZvcm1hdCAmJiByZXMgJiYgaGFuZGxlQXNPYmplY3QgJiYgbm9PYmplY3QuaW5kZXhPZihyZXNUeXBlKSA8IDAgJiYgISh0eXBlb2Ygam9pbkFycmF5cyA9PT0gJ3N0cmluZycgJiYgcmVzVHlwZSA9PT0gJ1tvYmplY3QgQXJyYXldJykpIHtcbiAgICAgICAgaWYgKCFvcHRpb25zLnJldHVybk9iamVjdHMgJiYgIXRoaXMub3B0aW9ucy5yZXR1cm5PYmplY3RzKSB7XG4gICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMucmV0dXJuZWRPYmplY3RIYW5kbGVyKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKCdhY2Nlc3NpbmcgYW4gb2JqZWN0IC0gYnV0IHJldHVybk9iamVjdHMgb3B0aW9ucyBpcyBub3QgZW5hYmxlZCEnKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgciA9IHRoaXMub3B0aW9ucy5yZXR1cm5lZE9iamVjdEhhbmRsZXIgPyB0aGlzLm9wdGlvbnMucmV0dXJuZWRPYmplY3RIYW5kbGVyKHJlc1VzZWRLZXksIHJlcywgX29iamVjdFNwcmVhZCQyKF9vYmplY3RTcHJlYWQkMih7fSwgb3B0aW9ucyksIHt9LCB7XG4gICAgICAgICAgICBuczogbmFtZXNwYWNlc1xuICAgICAgICAgIH0pKSA6IFwia2V5ICdcIi5jb25jYXQoa2V5LCBcIiAoXCIpLmNvbmNhdCh0aGlzLmxhbmd1YWdlLCBcIiknIHJldHVybmVkIGFuIG9iamVjdCBpbnN0ZWFkIG9mIHN0cmluZy5cIik7XG5cbiAgICAgICAgICBpZiAocmV0dXJuRGV0YWlscykge1xuICAgICAgICAgICAgcmVzb2x2ZWQucmVzID0gcjtcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZlZDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChrZXlTZXBhcmF0b3IpIHtcbiAgICAgICAgICB2YXIgcmVzVHlwZUlzQXJyYXkgPSByZXNUeXBlID09PSAnW29iamVjdCBBcnJheV0nO1xuICAgICAgICAgIHZhciBjb3B5ID0gcmVzVHlwZUlzQXJyYXkgPyBbXSA6IHt9O1xuICAgICAgICAgIHZhciBuZXdLZXlUb1VzZSA9IHJlc1R5cGVJc0FycmF5ID8gcmVzRXhhY3RVc2VkS2V5IDogcmVzVXNlZEtleTtcblxuICAgICAgICAgIGZvciAodmFyIG0gaW4gcmVzKSB7XG4gICAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHJlcywgbSkpIHtcbiAgICAgICAgICAgICAgdmFyIGRlZXBLZXkgPSBcIlwiLmNvbmNhdChuZXdLZXlUb1VzZSkuY29uY2F0KGtleVNlcGFyYXRvcikuY29uY2F0KG0pO1xuICAgICAgICAgICAgICBjb3B5W21dID0gdGhpcy50cmFuc2xhdGUoZGVlcEtleSwgX29iamVjdFNwcmVhZCQyKF9vYmplY3RTcHJlYWQkMih7fSwgb3B0aW9ucyksIHtcbiAgICAgICAgICAgICAgICBqb2luQXJyYXlzOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBuczogbmFtZXNwYWNlc1xuICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgIGlmIChjb3B5W21dID09PSBkZWVwS2V5KSBjb3B5W21dID0gcmVzW21dO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJlcyA9IGNvcHk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaGFuZGxlQXNPYmplY3RJbkkxOG5Gb3JtYXQgJiYgdHlwZW9mIGpvaW5BcnJheXMgPT09ICdzdHJpbmcnICYmIHJlc1R5cGUgPT09ICdbb2JqZWN0IEFycmF5XScpIHtcbiAgICAgICAgcmVzID0gcmVzLmpvaW4oam9pbkFycmF5cyk7XG4gICAgICAgIGlmIChyZXMpIHJlcyA9IHRoaXMuZXh0ZW5kVHJhbnNsYXRpb24ocmVzLCBrZXlzLCBvcHRpb25zLCBsYXN0S2V5KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciB1c2VkRGVmYXVsdCA9IGZhbHNlO1xuICAgICAgICB2YXIgdXNlZEtleSA9IGZhbHNlO1xuICAgICAgICB2YXIgbmVlZHNQbHVyYWxIYW5kbGluZyA9IG9wdGlvbnMuY291bnQgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygb3B0aW9ucy5jb3VudCAhPT0gJ3N0cmluZyc7XG4gICAgICAgIHZhciBoYXNEZWZhdWx0VmFsdWUgPSBUcmFuc2xhdG9yLmhhc0RlZmF1bHRWYWx1ZShvcHRpb25zKTtcbiAgICAgICAgdmFyIGRlZmF1bHRWYWx1ZVN1ZmZpeCA9IG5lZWRzUGx1cmFsSGFuZGxpbmcgPyB0aGlzLnBsdXJhbFJlc29sdmVyLmdldFN1ZmZpeChsbmcsIG9wdGlvbnMuY291bnQsIG9wdGlvbnMpIDogJyc7XG4gICAgICAgIHZhciBkZWZhdWx0VmFsdWUgPSBvcHRpb25zW1wiZGVmYXVsdFZhbHVlXCIuY29uY2F0KGRlZmF1bHRWYWx1ZVN1ZmZpeCldIHx8IG9wdGlvbnMuZGVmYXVsdFZhbHVlO1xuXG4gICAgICAgIGlmICghdGhpcy5pc1ZhbGlkTG9va3VwKHJlcykgJiYgaGFzRGVmYXVsdFZhbHVlKSB7XG4gICAgICAgICAgdXNlZERlZmF1bHQgPSB0cnVlO1xuICAgICAgICAgIHJlcyA9IGRlZmF1bHRWYWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5pc1ZhbGlkTG9va3VwKHJlcykpIHtcbiAgICAgICAgICB1c2VkS2V5ID0gdHJ1ZTtcbiAgICAgICAgICByZXMgPSBrZXk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgbWlzc2luZ0tleU5vVmFsdWVGYWxsYmFja1RvS2V5ID0gb3B0aW9ucy5taXNzaW5nS2V5Tm9WYWx1ZUZhbGxiYWNrVG9LZXkgfHwgdGhpcy5vcHRpb25zLm1pc3NpbmdLZXlOb1ZhbHVlRmFsbGJhY2tUb0tleTtcbiAgICAgICAgdmFyIHJlc0Zvck1pc3NpbmcgPSBtaXNzaW5nS2V5Tm9WYWx1ZUZhbGxiYWNrVG9LZXkgJiYgdXNlZEtleSA/IHVuZGVmaW5lZCA6IHJlcztcbiAgICAgICAgdmFyIHVwZGF0ZU1pc3NpbmcgPSBoYXNEZWZhdWx0VmFsdWUgJiYgZGVmYXVsdFZhbHVlICE9PSByZXMgJiYgdGhpcy5vcHRpb25zLnVwZGF0ZU1pc3Npbmc7XG5cbiAgICAgICAgaWYgKHVzZWRLZXkgfHwgdXNlZERlZmF1bHQgfHwgdXBkYXRlTWlzc2luZykge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyh1cGRhdGVNaXNzaW5nID8gJ3VwZGF0ZUtleScgOiAnbWlzc2luZ0tleScsIGxuZywgbmFtZXNwYWNlLCBrZXksIHVwZGF0ZU1pc3NpbmcgPyBkZWZhdWx0VmFsdWUgOiByZXMpO1xuXG4gICAgICAgICAgaWYgKGtleVNlcGFyYXRvcikge1xuICAgICAgICAgICAgdmFyIGZrID0gdGhpcy5yZXNvbHZlKGtleSwgX29iamVjdFNwcmVhZCQyKF9vYmplY3RTcHJlYWQkMih7fSwgb3B0aW9ucyksIHt9LCB7XG4gICAgICAgICAgICAgIGtleVNlcGFyYXRvcjogZmFsc2VcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIGlmIChmayAmJiBmay5yZXMpIHRoaXMubG9nZ2VyLndhcm4oJ1NlZW1zIHRoZSBsb2FkZWQgdHJhbnNsYXRpb25zIHdlcmUgaW4gZmxhdCBKU09OIGZvcm1hdCBpbnN0ZWFkIG9mIG5lc3RlZC4gRWl0aGVyIHNldCBrZXlTZXBhcmF0b3I6IGZhbHNlIG9uIGluaXQgb3IgbWFrZSBzdXJlIHlvdXIgdHJhbnNsYXRpb25zIGFyZSBwdWJsaXNoZWQgaW4gbmVzdGVkIGZvcm1hdC4nKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgbG5ncyA9IFtdO1xuICAgICAgICAgIHZhciBmYWxsYmFja0xuZ3MgPSB0aGlzLmxhbmd1YWdlVXRpbHMuZ2V0RmFsbGJhY2tDb2Rlcyh0aGlzLm9wdGlvbnMuZmFsbGJhY2tMbmcsIG9wdGlvbnMubG5nIHx8IHRoaXMubGFuZ3VhZ2UpO1xuXG4gICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zYXZlTWlzc2luZ1RvID09PSAnZmFsbGJhY2snICYmIGZhbGxiYWNrTG5ncyAmJiBmYWxsYmFja0xuZ3NbMF0pIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmFsbGJhY2tMbmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgIGxuZ3MucHVzaChmYWxsYmFja0xuZ3NbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5vcHRpb25zLnNhdmVNaXNzaW5nVG8gPT09ICdhbGwnKSB7XG4gICAgICAgICAgICBsbmdzID0gdGhpcy5sYW5ndWFnZVV0aWxzLnRvUmVzb2x2ZUhpZXJhcmNoeShvcHRpb25zLmxuZyB8fCB0aGlzLmxhbmd1YWdlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbG5ncy5wdXNoKG9wdGlvbnMubG5nIHx8IHRoaXMubGFuZ3VhZ2UpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBzZW5kID0gZnVuY3Rpb24gc2VuZChsLCBrLCBzcGVjaWZpY0RlZmF1bHRWYWx1ZSkge1xuICAgICAgICAgICAgdmFyIGRlZmF1bHRGb3JNaXNzaW5nID0gaGFzRGVmYXVsdFZhbHVlICYmIHNwZWNpZmljRGVmYXVsdFZhbHVlICE9PSByZXMgPyBzcGVjaWZpY0RlZmF1bHRWYWx1ZSA6IHJlc0Zvck1pc3Npbmc7XG5cbiAgICAgICAgICAgIGlmIChfdGhpczIub3B0aW9ucy5taXNzaW5nS2V5SGFuZGxlcikge1xuICAgICAgICAgICAgICBfdGhpczIub3B0aW9ucy5taXNzaW5nS2V5SGFuZGxlcihsLCBuYW1lc3BhY2UsIGssIGRlZmF1bHRGb3JNaXNzaW5nLCB1cGRhdGVNaXNzaW5nLCBvcHRpb25zKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoX3RoaXMyLmJhY2tlbmRDb25uZWN0b3IgJiYgX3RoaXMyLmJhY2tlbmRDb25uZWN0b3Iuc2F2ZU1pc3NpbmcpIHtcbiAgICAgICAgICAgICAgX3RoaXMyLmJhY2tlbmRDb25uZWN0b3Iuc2F2ZU1pc3NpbmcobCwgbmFtZXNwYWNlLCBrLCBkZWZhdWx0Rm9yTWlzc2luZywgdXBkYXRlTWlzc2luZywgb3B0aW9ucyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIF90aGlzMi5lbWl0KCdtaXNzaW5nS2V5JywgbCwgbmFtZXNwYWNlLCBrLCByZXMpO1xuICAgICAgICAgIH07XG5cbiAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnNhdmVNaXNzaW5nKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnNhdmVNaXNzaW5nUGx1cmFscyAmJiBuZWVkc1BsdXJhbEhhbmRsaW5nKSB7XG4gICAgICAgICAgICAgIGxuZ3MuZm9yRWFjaChmdW5jdGlvbiAobGFuZ3VhZ2UpIHtcbiAgICAgICAgICAgICAgICBfdGhpczIucGx1cmFsUmVzb2x2ZXIuZ2V0U3VmZml4ZXMobGFuZ3VhZ2UsIG9wdGlvbnMpLmZvckVhY2goZnVuY3Rpb24gKHN1ZmZpeCkge1xuICAgICAgICAgICAgICAgICAgc2VuZChbbGFuZ3VhZ2VdLCBrZXkgKyBzdWZmaXgsIG9wdGlvbnNbXCJkZWZhdWx0VmFsdWVcIi5jb25jYXQoc3VmZml4KV0gfHwgZGVmYXVsdFZhbHVlKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzZW5kKGxuZ3MsIGtleSwgZGVmYXVsdFZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXMgPSB0aGlzLmV4dGVuZFRyYW5zbGF0aW9uKHJlcywga2V5cywgb3B0aW9ucywgcmVzb2x2ZWQsIGxhc3RLZXkpO1xuICAgICAgICBpZiAodXNlZEtleSAmJiByZXMgPT09IGtleSAmJiB0aGlzLm9wdGlvbnMuYXBwZW5kTmFtZXNwYWNlVG9NaXNzaW5nS2V5KSByZXMgPSBcIlwiLmNvbmNhdChuYW1lc3BhY2UsIFwiOlwiKS5jb25jYXQoa2V5KTtcblxuICAgICAgICBpZiAoKHVzZWRLZXkgfHwgdXNlZERlZmF1bHQpICYmIHRoaXMub3B0aW9ucy5wYXJzZU1pc3NpbmdLZXlIYW5kbGVyKSB7XG4gICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5jb21wYXRpYmlsaXR5QVBJICE9PSAndjEnKSB7XG4gICAgICAgICAgICByZXMgPSB0aGlzLm9wdGlvbnMucGFyc2VNaXNzaW5nS2V5SGFuZGxlcih0aGlzLm9wdGlvbnMuYXBwZW5kTmFtZXNwYWNlVG9NaXNzaW5nS2V5ID8gXCJcIi5jb25jYXQobmFtZXNwYWNlLCBcIjpcIikuY29uY2F0KGtleSkgOiBrZXksIHVzZWREZWZhdWx0ID8gcmVzIDogdW5kZWZpbmVkKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzID0gdGhpcy5vcHRpb25zLnBhcnNlTWlzc2luZ0tleUhhbmRsZXIocmVzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHJldHVybkRldGFpbHMpIHtcbiAgICAgICAgcmVzb2x2ZWQucmVzID0gcmVzO1xuICAgICAgICByZXR1cm4gcmVzb2x2ZWQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXM7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImV4dGVuZFRyYW5zbGF0aW9uXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGV4dGVuZFRyYW5zbGF0aW9uKHJlcywga2V5LCBvcHRpb25zLCByZXNvbHZlZCwgbGFzdEtleSkge1xuICAgICAgdmFyIF90aGlzMyA9IHRoaXM7XG5cbiAgICAgIGlmICh0aGlzLmkxOG5Gb3JtYXQgJiYgdGhpcy5pMThuRm9ybWF0LnBhcnNlKSB7XG4gICAgICAgIHJlcyA9IHRoaXMuaTE4bkZvcm1hdC5wYXJzZShyZXMsIF9vYmplY3RTcHJlYWQkMihfb2JqZWN0U3ByZWFkJDIoe30sIHRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmRlZmF1bHRWYXJpYWJsZXMpLCBvcHRpb25zKSwgcmVzb2x2ZWQudXNlZExuZywgcmVzb2x2ZWQudXNlZE5TLCByZXNvbHZlZC51c2VkS2V5LCB7XG4gICAgICAgICAgcmVzb2x2ZWQ6IHJlc29sdmVkXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmICghb3B0aW9ucy5za2lwSW50ZXJwb2xhdGlvbikge1xuICAgICAgICBpZiAob3B0aW9ucy5pbnRlcnBvbGF0aW9uKSB0aGlzLmludGVycG9sYXRvci5pbml0KF9vYmplY3RTcHJlYWQkMihfb2JqZWN0U3ByZWFkJDIoe30sIG9wdGlvbnMpLCB7XG4gICAgICAgICAgaW50ZXJwb2xhdGlvbjogX29iamVjdFNwcmVhZCQyKF9vYmplY3RTcHJlYWQkMih7fSwgdGhpcy5vcHRpb25zLmludGVycG9sYXRpb24pLCBvcHRpb25zLmludGVycG9sYXRpb24pXG4gICAgICAgIH0pKTtcbiAgICAgICAgdmFyIHNraXBPblZhcmlhYmxlcyA9IHR5cGVvZiByZXMgPT09ICdzdHJpbmcnICYmIChvcHRpb25zICYmIG9wdGlvbnMuaW50ZXJwb2xhdGlvbiAmJiBvcHRpb25zLmludGVycG9sYXRpb24uc2tpcE9uVmFyaWFibGVzICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmludGVycG9sYXRpb24uc2tpcE9uVmFyaWFibGVzIDogdGhpcy5vcHRpb25zLmludGVycG9sYXRpb24uc2tpcE9uVmFyaWFibGVzKTtcbiAgICAgICAgdmFyIG5lc3RCZWY7XG5cbiAgICAgICAgaWYgKHNraXBPblZhcmlhYmxlcykge1xuICAgICAgICAgIHZhciBuYiA9IHJlcy5tYXRjaCh0aGlzLmludGVycG9sYXRvci5uZXN0aW5nUmVnZXhwKTtcbiAgICAgICAgICBuZXN0QmVmID0gbmIgJiYgbmIubGVuZ3RoO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGRhdGEgPSBvcHRpb25zLnJlcGxhY2UgJiYgdHlwZW9mIG9wdGlvbnMucmVwbGFjZSAhPT0gJ3N0cmluZycgPyBvcHRpb25zLnJlcGxhY2UgOiBvcHRpb25zO1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmludGVycG9sYXRpb24uZGVmYXVsdFZhcmlhYmxlcykgZGF0YSA9IF9vYmplY3RTcHJlYWQkMihfb2JqZWN0U3ByZWFkJDIoe30sIHRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmRlZmF1bHRWYXJpYWJsZXMpLCBkYXRhKTtcbiAgICAgICAgcmVzID0gdGhpcy5pbnRlcnBvbGF0b3IuaW50ZXJwb2xhdGUocmVzLCBkYXRhLCBvcHRpb25zLmxuZyB8fCB0aGlzLmxhbmd1YWdlLCBvcHRpb25zKTtcblxuICAgICAgICBpZiAoc2tpcE9uVmFyaWFibGVzKSB7XG4gICAgICAgICAgdmFyIG5hID0gcmVzLm1hdGNoKHRoaXMuaW50ZXJwb2xhdG9yLm5lc3RpbmdSZWdleHApO1xuICAgICAgICAgIHZhciBuZXN0QWZ0ID0gbmEgJiYgbmEubGVuZ3RoO1xuICAgICAgICAgIGlmIChuZXN0QmVmIDwgbmVzdEFmdCkgb3B0aW9ucy5uZXN0ID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucy5uZXN0ICE9PSBmYWxzZSkgcmVzID0gdGhpcy5pbnRlcnBvbGF0b3IubmVzdChyZXMsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgICAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGxhc3RLZXkgJiYgbGFzdEtleVswXSA9PT0gYXJnc1swXSAmJiAhb3B0aW9ucy5jb250ZXh0KSB7XG4gICAgICAgICAgICBfdGhpczMubG9nZ2VyLndhcm4oXCJJdCBzZWVtcyB5b3UgYXJlIG5lc3RpbmcgcmVjdXJzaXZlbHkga2V5OiBcIi5jb25jYXQoYXJnc1swXSwgXCIgaW4ga2V5OiBcIikuY29uY2F0KGtleVswXSkpO1xuXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gX3RoaXMzLnRyYW5zbGF0ZS5hcHBseShfdGhpczMsIGFyZ3MuY29uY2F0KFtrZXldKSk7XG4gICAgICAgIH0sIG9wdGlvbnMpO1xuICAgICAgICBpZiAob3B0aW9ucy5pbnRlcnBvbGF0aW9uKSB0aGlzLmludGVycG9sYXRvci5yZXNldCgpO1xuICAgICAgfVxuXG4gICAgICB2YXIgcG9zdFByb2Nlc3MgPSBvcHRpb25zLnBvc3RQcm9jZXNzIHx8IHRoaXMub3B0aW9ucy5wb3N0UHJvY2VzcztcbiAgICAgIHZhciBwb3N0UHJvY2Vzc29yTmFtZXMgPSB0eXBlb2YgcG9zdFByb2Nlc3MgPT09ICdzdHJpbmcnID8gW3Bvc3RQcm9jZXNzXSA6IHBvc3RQcm9jZXNzO1xuXG4gICAgICBpZiAocmVzICE9PSB1bmRlZmluZWQgJiYgcmVzICE9PSBudWxsICYmIHBvc3RQcm9jZXNzb3JOYW1lcyAmJiBwb3N0UHJvY2Vzc29yTmFtZXMubGVuZ3RoICYmIG9wdGlvbnMuYXBwbHlQb3N0UHJvY2Vzc29yICE9PSBmYWxzZSkge1xuICAgICAgICByZXMgPSBwb3N0UHJvY2Vzc29yLmhhbmRsZShwb3N0UHJvY2Vzc29yTmFtZXMsIHJlcywga2V5LCB0aGlzLm9wdGlvbnMgJiYgdGhpcy5vcHRpb25zLnBvc3RQcm9jZXNzUGFzc1Jlc29sdmVkID8gX29iamVjdFNwcmVhZCQyKHtcbiAgICAgICAgICBpMThuUmVzb2x2ZWQ6IHJlc29sdmVkXG4gICAgICAgIH0sIG9wdGlvbnMpIDogb3B0aW9ucywgdGhpcyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXM7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlc29sdmVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVzb2x2ZShrZXlzKSB7XG4gICAgICB2YXIgX3RoaXM0ID0gdGhpcztcblxuICAgICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICAgICAgdmFyIGZvdW5kO1xuICAgICAgdmFyIHVzZWRLZXk7XG4gICAgICB2YXIgZXhhY3RVc2VkS2V5O1xuICAgICAgdmFyIHVzZWRMbmc7XG4gICAgICB2YXIgdXNlZE5TO1xuICAgICAgaWYgKHR5cGVvZiBrZXlzID09PSAnc3RyaW5nJykga2V5cyA9IFtrZXlzXTtcbiAgICAgIGtleXMuZm9yRWFjaChmdW5jdGlvbiAoaykge1xuICAgICAgICBpZiAoX3RoaXM0LmlzVmFsaWRMb29rdXAoZm91bmQpKSByZXR1cm47XG5cbiAgICAgICAgdmFyIGV4dHJhY3RlZCA9IF90aGlzNC5leHRyYWN0RnJvbUtleShrLCBvcHRpb25zKTtcblxuICAgICAgICB2YXIga2V5ID0gZXh0cmFjdGVkLmtleTtcbiAgICAgICAgdXNlZEtleSA9IGtleTtcbiAgICAgICAgdmFyIG5hbWVzcGFjZXMgPSBleHRyYWN0ZWQubmFtZXNwYWNlcztcbiAgICAgICAgaWYgKF90aGlzNC5vcHRpb25zLmZhbGxiYWNrTlMpIG5hbWVzcGFjZXMgPSBuYW1lc3BhY2VzLmNvbmNhdChfdGhpczQub3B0aW9ucy5mYWxsYmFja05TKTtcbiAgICAgICAgdmFyIG5lZWRzUGx1cmFsSGFuZGxpbmcgPSBvcHRpb25zLmNvdW50ICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIG9wdGlvbnMuY291bnQgIT09ICdzdHJpbmcnO1xuXG4gICAgICAgIHZhciBuZWVkc1plcm9TdWZmaXhMb29rdXAgPSBuZWVkc1BsdXJhbEhhbmRsaW5nICYmICFvcHRpb25zLm9yZGluYWwgJiYgb3B0aW9ucy5jb3VudCA9PT0gMCAmJiBfdGhpczQucGx1cmFsUmVzb2x2ZXIuc2hvdWxkVXNlSW50bEFwaSgpO1xuXG4gICAgICAgIHZhciBuZWVkc0NvbnRleHRIYW5kbGluZyA9IG9wdGlvbnMuY29udGV4dCAhPT0gdW5kZWZpbmVkICYmICh0eXBlb2Ygb3B0aW9ucy5jb250ZXh0ID09PSAnc3RyaW5nJyB8fCB0eXBlb2Ygb3B0aW9ucy5jb250ZXh0ID09PSAnbnVtYmVyJykgJiYgb3B0aW9ucy5jb250ZXh0ICE9PSAnJztcbiAgICAgICAgdmFyIGNvZGVzID0gb3B0aW9ucy5sbmdzID8gb3B0aW9ucy5sbmdzIDogX3RoaXM0Lmxhbmd1YWdlVXRpbHMudG9SZXNvbHZlSGllcmFyY2h5KG9wdGlvbnMubG5nIHx8IF90aGlzNC5sYW5ndWFnZSwgb3B0aW9ucy5mYWxsYmFja0xuZyk7XG4gICAgICAgIG5hbWVzcGFjZXMuZm9yRWFjaChmdW5jdGlvbiAobnMpIHtcbiAgICAgICAgICBpZiAoX3RoaXM0LmlzVmFsaWRMb29rdXAoZm91bmQpKSByZXR1cm47XG4gICAgICAgICAgdXNlZE5TID0gbnM7XG5cbiAgICAgICAgICBpZiAoIWNoZWNrZWRMb2FkZWRGb3JbXCJcIi5jb25jYXQoY29kZXNbMF0sIFwiLVwiKS5jb25jYXQobnMpXSAmJiBfdGhpczQudXRpbHMgJiYgX3RoaXM0LnV0aWxzLmhhc0xvYWRlZE5hbWVzcGFjZSAmJiAhX3RoaXM0LnV0aWxzLmhhc0xvYWRlZE5hbWVzcGFjZSh1c2VkTlMpKSB7XG4gICAgICAgICAgICBjaGVja2VkTG9hZGVkRm9yW1wiXCIuY29uY2F0KGNvZGVzWzBdLCBcIi1cIikuY29uY2F0KG5zKV0gPSB0cnVlO1xuXG4gICAgICAgICAgICBfdGhpczQubG9nZ2VyLndhcm4oXCJrZXkgXFxcIlwiLmNvbmNhdCh1c2VkS2V5LCBcIlxcXCIgZm9yIGxhbmd1YWdlcyBcXFwiXCIpLmNvbmNhdChjb2Rlcy5qb2luKCcsICcpLCBcIlxcXCIgd29uJ3QgZ2V0IHJlc29sdmVkIGFzIG5hbWVzcGFjZSBcXFwiXCIpLmNvbmNhdCh1c2VkTlMsIFwiXFxcIiB3YXMgbm90IHlldCBsb2FkZWRcIiksICdUaGlzIG1lYW5zIHNvbWV0aGluZyBJUyBXUk9ORyBpbiB5b3VyIHNldHVwLiBZb3UgYWNjZXNzIHRoZSB0IGZ1bmN0aW9uIGJlZm9yZSBpMThuZXh0LmluaXQgLyBpMThuZXh0LmxvYWROYW1lc3BhY2UgLyBpMThuZXh0LmNoYW5nZUxhbmd1YWdlIHdhcyBkb25lLiBXYWl0IGZvciB0aGUgY2FsbGJhY2sgb3IgUHJvbWlzZSB0byByZXNvbHZlIGJlZm9yZSBhY2Nlc3NpbmcgaXQhISEnKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChjb2RlKSB7XG4gICAgICAgICAgICBpZiAoX3RoaXM0LmlzVmFsaWRMb29rdXAoZm91bmQpKSByZXR1cm47XG4gICAgICAgICAgICB1c2VkTG5nID0gY29kZTtcbiAgICAgICAgICAgIHZhciBmaW5hbEtleXMgPSBba2V5XTtcblxuICAgICAgICAgICAgaWYgKF90aGlzNC5pMThuRm9ybWF0ICYmIF90aGlzNC5pMThuRm9ybWF0LmFkZExvb2t1cEtleXMpIHtcbiAgICAgICAgICAgICAgX3RoaXM0LmkxOG5Gb3JtYXQuYWRkTG9va3VwS2V5cyhmaW5hbEtleXMsIGtleSwgY29kZSwgbnMsIG9wdGlvbnMpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdmFyIHBsdXJhbFN1ZmZpeDtcbiAgICAgICAgICAgICAgaWYgKG5lZWRzUGx1cmFsSGFuZGxpbmcpIHBsdXJhbFN1ZmZpeCA9IF90aGlzNC5wbHVyYWxSZXNvbHZlci5nZXRTdWZmaXgoY29kZSwgb3B0aW9ucy5jb3VudCwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgIHZhciB6ZXJvU3VmZml4ID0gXCJcIi5jb25jYXQoX3RoaXM0Lm9wdGlvbnMucGx1cmFsU2VwYXJhdG9yLCBcInplcm9cIik7XG5cbiAgICAgICAgICAgICAgaWYgKG5lZWRzUGx1cmFsSGFuZGxpbmcpIHtcbiAgICAgICAgICAgICAgICBmaW5hbEtleXMucHVzaChrZXkgKyBwbHVyYWxTdWZmaXgpO1xuXG4gICAgICAgICAgICAgICAgaWYgKG5lZWRzWmVyb1N1ZmZpeExvb2t1cCkge1xuICAgICAgICAgICAgICAgICAgZmluYWxLZXlzLnB1c2goa2V5ICsgemVyb1N1ZmZpeCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaWYgKG5lZWRzQ29udGV4dEhhbmRsaW5nKSB7XG4gICAgICAgICAgICAgICAgdmFyIGNvbnRleHRLZXkgPSBcIlwiLmNvbmNhdChrZXkpLmNvbmNhdChfdGhpczQub3B0aW9ucy5jb250ZXh0U2VwYXJhdG9yKS5jb25jYXQob3B0aW9ucy5jb250ZXh0KTtcbiAgICAgICAgICAgICAgICBmaW5hbEtleXMucHVzaChjb250ZXh0S2V5KTtcblxuICAgICAgICAgICAgICAgIGlmIChuZWVkc1BsdXJhbEhhbmRsaW5nKSB7XG4gICAgICAgICAgICAgICAgICBmaW5hbEtleXMucHVzaChjb250ZXh0S2V5ICsgcGx1cmFsU3VmZml4KTtcblxuICAgICAgICAgICAgICAgICAgaWYgKG5lZWRzWmVyb1N1ZmZpeExvb2t1cCkge1xuICAgICAgICAgICAgICAgICAgICBmaW5hbEtleXMucHVzaChjb250ZXh0S2V5ICsgemVyb1N1ZmZpeCk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBwb3NzaWJsZUtleTtcblxuICAgICAgICAgICAgd2hpbGUgKHBvc3NpYmxlS2V5ID0gZmluYWxLZXlzLnBvcCgpKSB7XG4gICAgICAgICAgICAgIGlmICghX3RoaXM0LmlzVmFsaWRMb29rdXAoZm91bmQpKSB7XG4gICAgICAgICAgICAgICAgZXhhY3RVc2VkS2V5ID0gcG9zc2libGVLZXk7XG4gICAgICAgICAgICAgICAgZm91bmQgPSBfdGhpczQuZ2V0UmVzb3VyY2UoY29kZSwgbnMsIHBvc3NpYmxlS2V5LCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcmVzOiBmb3VuZCxcbiAgICAgICAgdXNlZEtleTogdXNlZEtleSxcbiAgICAgICAgZXhhY3RVc2VkS2V5OiBleGFjdFVzZWRLZXksXG4gICAgICAgIHVzZWRMbmc6IHVzZWRMbmcsXG4gICAgICAgIHVzZWROUzogdXNlZE5TXG4gICAgICB9O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJpc1ZhbGlkTG9va3VwXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGlzVmFsaWRMb29rdXAocmVzKSB7XG4gICAgICByZXR1cm4gcmVzICE9PSB1bmRlZmluZWQgJiYgISghdGhpcy5vcHRpb25zLnJldHVybk51bGwgJiYgcmVzID09PSBudWxsKSAmJiAhKCF0aGlzLm9wdGlvbnMucmV0dXJuRW1wdHlTdHJpbmcgJiYgcmVzID09PSAnJyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldFJlc291cmNlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldFJlc291cmNlKGNvZGUsIG5zLCBrZXkpIHtcbiAgICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgJiYgYXJndW1lbnRzWzNdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbM10gOiB7fTtcbiAgICAgIGlmICh0aGlzLmkxOG5Gb3JtYXQgJiYgdGhpcy5pMThuRm9ybWF0LmdldFJlc291cmNlKSByZXR1cm4gdGhpcy5pMThuRm9ybWF0LmdldFJlc291cmNlKGNvZGUsIG5zLCBrZXksIG9wdGlvbnMpO1xuICAgICAgcmV0dXJuIHRoaXMucmVzb3VyY2VTdG9yZS5nZXRSZXNvdXJjZShjb2RlLCBucywga2V5LCBvcHRpb25zKTtcbiAgICB9XG4gIH1dLCBbe1xuICAgIGtleTogXCJoYXNEZWZhdWx0VmFsdWVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaGFzRGVmYXVsdFZhbHVlKG9wdGlvbnMpIHtcbiAgICAgIHZhciBwcmVmaXggPSAnZGVmYXVsdFZhbHVlJztcblxuICAgICAgZm9yICh2YXIgb3B0aW9uIGluIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvcHRpb25zLCBvcHRpb24pICYmIHByZWZpeCA9PT0gb3B0aW9uLnN1YnN0cmluZygwLCBwcmVmaXgubGVuZ3RoKSAmJiB1bmRlZmluZWQgIT09IG9wdGlvbnNbb3B0aW9uXSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gVHJhbnNsYXRvcjtcbn0oRXZlbnRFbWl0dGVyKTtcblxuZnVuY3Rpb24gY2FwaXRhbGl6ZShzdHJpbmcpIHtcbiAgcmV0dXJuIHN0cmluZy5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHN0cmluZy5zbGljZSgxKTtcbn1cblxudmFyIExhbmd1YWdlVXRpbCA9IGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gTGFuZ3VhZ2VVdGlsKG9wdGlvbnMpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgTGFuZ3VhZ2VVdGlsKTtcblxuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgdGhpcy5zdXBwb3J0ZWRMbmdzID0gdGhpcy5vcHRpb25zLnN1cHBvcnRlZExuZ3MgfHwgZmFsc2U7XG4gICAgdGhpcy5sb2dnZXIgPSBiYXNlTG9nZ2VyLmNyZWF0ZSgnbGFuZ3VhZ2VVdGlscycpO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKExhbmd1YWdlVXRpbCwgW3tcbiAgICBrZXk6IFwiZ2V0U2NyaXB0UGFydEZyb21Db2RlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldFNjcmlwdFBhcnRGcm9tQ29kZShjb2RlKSB7XG4gICAgICBpZiAoIWNvZGUgfHwgY29kZS5pbmRleE9mKCctJykgPCAwKSByZXR1cm4gbnVsbDtcbiAgICAgIHZhciBwID0gY29kZS5zcGxpdCgnLScpO1xuICAgICAgaWYgKHAubGVuZ3RoID09PSAyKSByZXR1cm4gbnVsbDtcbiAgICAgIHAucG9wKCk7XG4gICAgICBpZiAocFtwLmxlbmd0aCAtIDFdLnRvTG93ZXJDYXNlKCkgPT09ICd4JykgcmV0dXJuIG51bGw7XG4gICAgICByZXR1cm4gdGhpcy5mb3JtYXRMYW5ndWFnZUNvZGUocC5qb2luKCctJykpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRMYW5ndWFnZVBhcnRGcm9tQ29kZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRMYW5ndWFnZVBhcnRGcm9tQ29kZShjb2RlKSB7XG4gICAgICBpZiAoIWNvZGUgfHwgY29kZS5pbmRleE9mKCctJykgPCAwKSByZXR1cm4gY29kZTtcbiAgICAgIHZhciBwID0gY29kZS5zcGxpdCgnLScpO1xuICAgICAgcmV0dXJuIHRoaXMuZm9ybWF0TGFuZ3VhZ2VDb2RlKHBbMF0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJmb3JtYXRMYW5ndWFnZUNvZGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZm9ybWF0TGFuZ3VhZ2VDb2RlKGNvZGUpIHtcbiAgICAgIGlmICh0eXBlb2YgY29kZSA9PT0gJ3N0cmluZycgJiYgY29kZS5pbmRleE9mKCctJykgPiAtMSkge1xuICAgICAgICB2YXIgc3BlY2lhbENhc2VzID0gWydoYW5zJywgJ2hhbnQnLCAnbGF0bicsICdjeXJsJywgJ2NhbnMnLCAnbW9uZycsICdhcmFiJ107XG4gICAgICAgIHZhciBwID0gY29kZS5zcGxpdCgnLScpO1xuXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMubG93ZXJDYXNlTG5nKSB7XG4gICAgICAgICAgcCA9IHAubWFwKGZ1bmN0aW9uIChwYXJ0KSB7XG4gICAgICAgICAgICByZXR1cm4gcGFydC50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHAubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgcFswXSA9IHBbMF0udG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICBwWzFdID0gcFsxXS50b1VwcGVyQ2FzZSgpO1xuICAgICAgICAgIGlmIChzcGVjaWFsQ2FzZXMuaW5kZXhPZihwWzFdLnRvTG93ZXJDYXNlKCkpID4gLTEpIHBbMV0gPSBjYXBpdGFsaXplKHBbMV0udG9Mb3dlckNhc2UoKSk7XG4gICAgICAgIH0gZWxzZSBpZiAocC5sZW5ndGggPT09IDMpIHtcbiAgICAgICAgICBwWzBdID0gcFswXS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgIGlmIChwWzFdLmxlbmd0aCA9PT0gMikgcFsxXSA9IHBbMV0udG9VcHBlckNhc2UoKTtcbiAgICAgICAgICBpZiAocFswXSAhPT0gJ3NnbicgJiYgcFsyXS5sZW5ndGggPT09IDIpIHBbMl0gPSBwWzJdLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgICAgaWYgKHNwZWNpYWxDYXNlcy5pbmRleE9mKHBbMV0udG9Mb3dlckNhc2UoKSkgPiAtMSkgcFsxXSA9IGNhcGl0YWxpemUocFsxXS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgICBpZiAoc3BlY2lhbENhc2VzLmluZGV4T2YocFsyXS50b0xvd2VyQ2FzZSgpKSA+IC0xKSBwWzJdID0gY2FwaXRhbGl6ZShwWzJdLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHAuam9pbignLScpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5vcHRpb25zLmNsZWFuQ29kZSB8fCB0aGlzLm9wdGlvbnMubG93ZXJDYXNlTG5nID8gY29kZS50b0xvd2VyQ2FzZSgpIDogY29kZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaXNTdXBwb3J0ZWRDb2RlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGlzU3VwcG9ydGVkQ29kZShjb2RlKSB7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLmxvYWQgPT09ICdsYW5ndWFnZU9ubHknIHx8IHRoaXMub3B0aW9ucy5ub25FeHBsaWNpdFN1cHBvcnRlZExuZ3MpIHtcbiAgICAgICAgY29kZSA9IHRoaXMuZ2V0TGFuZ3VhZ2VQYXJ0RnJvbUNvZGUoY29kZSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAhdGhpcy5zdXBwb3J0ZWRMbmdzIHx8ICF0aGlzLnN1cHBvcnRlZExuZ3MubGVuZ3RoIHx8IHRoaXMuc3VwcG9ydGVkTG5ncy5pbmRleE9mKGNvZGUpID4gLTE7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldEJlc3RNYXRjaEZyb21Db2Rlc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRCZXN0TWF0Y2hGcm9tQ29kZXMoY29kZXMpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgIGlmICghY29kZXMpIHJldHVybiBudWxsO1xuICAgICAgdmFyIGZvdW5kO1xuICAgICAgY29kZXMuZm9yRWFjaChmdW5jdGlvbiAoY29kZSkge1xuICAgICAgICBpZiAoZm91bmQpIHJldHVybjtcblxuICAgICAgICB2YXIgY2xlYW5lZExuZyA9IF90aGlzLmZvcm1hdExhbmd1YWdlQ29kZShjb2RlKTtcblxuICAgICAgICBpZiAoIV90aGlzLm9wdGlvbnMuc3VwcG9ydGVkTG5ncyB8fCBfdGhpcy5pc1N1cHBvcnRlZENvZGUoY2xlYW5lZExuZykpIGZvdW5kID0gY2xlYW5lZExuZztcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoIWZvdW5kICYmIHRoaXMub3B0aW9ucy5zdXBwb3J0ZWRMbmdzKSB7XG4gICAgICAgIGNvZGVzLmZvckVhY2goZnVuY3Rpb24gKGNvZGUpIHtcbiAgICAgICAgICBpZiAoZm91bmQpIHJldHVybjtcblxuICAgICAgICAgIHZhciBsbmdPbmx5ID0gX3RoaXMuZ2V0TGFuZ3VhZ2VQYXJ0RnJvbUNvZGUoY29kZSk7XG5cbiAgICAgICAgICBpZiAoX3RoaXMuaXNTdXBwb3J0ZWRDb2RlKGxuZ09ubHkpKSByZXR1cm4gZm91bmQgPSBsbmdPbmx5O1xuICAgICAgICAgIGZvdW5kID0gX3RoaXMub3B0aW9ucy5zdXBwb3J0ZWRMbmdzLmZpbmQoZnVuY3Rpb24gKHN1cHBvcnRlZExuZykge1xuICAgICAgICAgICAgaWYgKHN1cHBvcnRlZExuZy5pbmRleE9mKGxuZ09ubHkpID09PSAwKSByZXR1cm4gc3VwcG9ydGVkTG5nO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFmb3VuZCkgZm91bmQgPSB0aGlzLmdldEZhbGxiYWNrQ29kZXModGhpcy5vcHRpb25zLmZhbGxiYWNrTG5nKVswXTtcbiAgICAgIHJldHVybiBmb3VuZDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0RmFsbGJhY2tDb2Rlc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRGYWxsYmFja0NvZGVzKGZhbGxiYWNrcywgY29kZSkge1xuICAgICAgaWYgKCFmYWxsYmFja3MpIHJldHVybiBbXTtcbiAgICAgIGlmICh0eXBlb2YgZmFsbGJhY2tzID09PSAnZnVuY3Rpb24nKSBmYWxsYmFja3MgPSBmYWxsYmFja3MoY29kZSk7XG4gICAgICBpZiAodHlwZW9mIGZhbGxiYWNrcyA9PT0gJ3N0cmluZycpIGZhbGxiYWNrcyA9IFtmYWxsYmFja3NdO1xuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuYXBwbHkoZmFsbGJhY2tzKSA9PT0gJ1tvYmplY3QgQXJyYXldJykgcmV0dXJuIGZhbGxiYWNrcztcbiAgICAgIGlmICghY29kZSkgcmV0dXJuIGZhbGxiYWNrc1tcImRlZmF1bHRcIl0gfHwgW107XG4gICAgICB2YXIgZm91bmQgPSBmYWxsYmFja3NbY29kZV07XG4gICAgICBpZiAoIWZvdW5kKSBmb3VuZCA9IGZhbGxiYWNrc1t0aGlzLmdldFNjcmlwdFBhcnRGcm9tQ29kZShjb2RlKV07XG4gICAgICBpZiAoIWZvdW5kKSBmb3VuZCA9IGZhbGxiYWNrc1t0aGlzLmZvcm1hdExhbmd1YWdlQ29kZShjb2RlKV07XG4gICAgICBpZiAoIWZvdW5kKSBmb3VuZCA9IGZhbGxiYWNrc1t0aGlzLmdldExhbmd1YWdlUGFydEZyb21Db2RlKGNvZGUpXTtcbiAgICAgIGlmICghZm91bmQpIGZvdW5kID0gZmFsbGJhY2tzW1wiZGVmYXVsdFwiXTtcbiAgICAgIHJldHVybiBmb3VuZCB8fCBbXTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidG9SZXNvbHZlSGllcmFyY2h5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHRvUmVzb2x2ZUhpZXJhcmNoeShjb2RlLCBmYWxsYmFja0NvZGUpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICB2YXIgZmFsbGJhY2tDb2RlcyA9IHRoaXMuZ2V0RmFsbGJhY2tDb2RlcyhmYWxsYmFja0NvZGUgfHwgdGhpcy5vcHRpb25zLmZhbGxiYWNrTG5nIHx8IFtdLCBjb2RlKTtcbiAgICAgIHZhciBjb2RlcyA9IFtdO1xuXG4gICAgICB2YXIgYWRkQ29kZSA9IGZ1bmN0aW9uIGFkZENvZGUoYykge1xuICAgICAgICBpZiAoIWMpIHJldHVybjtcblxuICAgICAgICBpZiAoX3RoaXMyLmlzU3VwcG9ydGVkQ29kZShjKSkge1xuICAgICAgICAgIGNvZGVzLnB1c2goYyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgX3RoaXMyLmxvZ2dlci53YXJuKFwicmVqZWN0aW5nIGxhbmd1YWdlIGNvZGUgbm90IGZvdW5kIGluIHN1cHBvcnRlZExuZ3M6IFwiLmNvbmNhdChjKSk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGlmICh0eXBlb2YgY29kZSA9PT0gJ3N0cmluZycgJiYgY29kZS5pbmRleE9mKCctJykgPiAtMSkge1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmxvYWQgIT09ICdsYW5ndWFnZU9ubHknKSBhZGRDb2RlKHRoaXMuZm9ybWF0TGFuZ3VhZ2VDb2RlKGNvZGUpKTtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5sb2FkICE9PSAnbGFuZ3VhZ2VPbmx5JyAmJiB0aGlzLm9wdGlvbnMubG9hZCAhPT0gJ2N1cnJlbnRPbmx5JykgYWRkQ29kZSh0aGlzLmdldFNjcmlwdFBhcnRGcm9tQ29kZShjb2RlKSk7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMubG9hZCAhPT0gJ2N1cnJlbnRPbmx5JykgYWRkQ29kZSh0aGlzLmdldExhbmd1YWdlUGFydEZyb21Db2RlKGNvZGUpKTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGNvZGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGFkZENvZGUodGhpcy5mb3JtYXRMYW5ndWFnZUNvZGUoY29kZSkpO1xuICAgICAgfVxuXG4gICAgICBmYWxsYmFja0NvZGVzLmZvckVhY2goZnVuY3Rpb24gKGZjKSB7XG4gICAgICAgIGlmIChjb2Rlcy5pbmRleE9mKGZjKSA8IDApIGFkZENvZGUoX3RoaXMyLmZvcm1hdExhbmd1YWdlQ29kZShmYykpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gY29kZXM7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIExhbmd1YWdlVXRpbDtcbn0oKTtcblxudmFyIHNldHMgPSBbe1xuICBsbmdzOiBbJ2FjaCcsICdhaycsICdhbScsICdhcm4nLCAnYnInLCAnZmlsJywgJ2d1bicsICdsbicsICdtZmUnLCAnbWcnLCAnbWknLCAnb2MnLCAncHQnLCAncHQtQlInLCAndGcnLCAndGwnLCAndGknLCAndHInLCAndXonLCAnd2EnXSxcbiAgbnI6IFsxLCAyXSxcbiAgZmM6IDFcbn0sIHtcbiAgbG5nczogWydhZicsICdhbicsICdhc3QnLCAnYXonLCAnYmcnLCAnYm4nLCAnY2EnLCAnZGEnLCAnZGUnLCAnZGV2JywgJ2VsJywgJ2VuJywgJ2VvJywgJ2VzJywgJ2V0JywgJ2V1JywgJ2ZpJywgJ2ZvJywgJ2Z1cicsICdmeScsICdnbCcsICdndScsICdoYScsICdoaScsICdodScsICdoeScsICdpYScsICdpdCcsICdraycsICdrbicsICdrdScsICdsYicsICdtYWknLCAnbWwnLCAnbW4nLCAnbXInLCAnbmFoJywgJ25hcCcsICduYicsICduZScsICdubCcsICdubicsICdubycsICduc28nLCAncGEnLCAncGFwJywgJ3BtcycsICdwcycsICdwdC1QVCcsICdybScsICdzY28nLCAnc2UnLCAnc2knLCAnc28nLCAnc29uJywgJ3NxJywgJ3N2JywgJ3N3JywgJ3RhJywgJ3RlJywgJ3RrJywgJ3VyJywgJ3lvJ10sXG4gIG5yOiBbMSwgMl0sXG4gIGZjOiAyXG59LCB7XG4gIGxuZ3M6IFsnYXknLCAnYm8nLCAnY2dnJywgJ2ZhJywgJ2h0JywgJ2lkJywgJ2phJywgJ2pibycsICdrYScsICdrbScsICdrbycsICdreScsICdsbycsICdtcycsICdzYWgnLCAnc3UnLCAndGgnLCAndHQnLCAndWcnLCAndmknLCAnd28nLCAnemgnXSxcbiAgbnI6IFsxXSxcbiAgZmM6IDNcbn0sIHtcbiAgbG5nczogWydiZScsICdicycsICdjbnInLCAnZHonLCAnaHInLCAncnUnLCAnc3InLCAndWsnXSxcbiAgbnI6IFsxLCAyLCA1XSxcbiAgZmM6IDRcbn0sIHtcbiAgbG5nczogWydhciddLFxuICBucjogWzAsIDEsIDIsIDMsIDExLCAxMDBdLFxuICBmYzogNVxufSwge1xuICBsbmdzOiBbJ2NzJywgJ3NrJ10sXG4gIG5yOiBbMSwgMiwgNV0sXG4gIGZjOiA2XG59LCB7XG4gIGxuZ3M6IFsnY3NiJywgJ3BsJ10sXG4gIG5yOiBbMSwgMiwgNV0sXG4gIGZjOiA3XG59LCB7XG4gIGxuZ3M6IFsnY3knXSxcbiAgbnI6IFsxLCAyLCAzLCA4XSxcbiAgZmM6IDhcbn0sIHtcbiAgbG5nczogWydmciddLFxuICBucjogWzEsIDJdLFxuICBmYzogOVxufSwge1xuICBsbmdzOiBbJ2dhJ10sXG4gIG5yOiBbMSwgMiwgMywgNywgMTFdLFxuICBmYzogMTBcbn0sIHtcbiAgbG5nczogWydnZCddLFxuICBucjogWzEsIDIsIDMsIDIwXSxcbiAgZmM6IDExXG59LCB7XG4gIGxuZ3M6IFsnaXMnXSxcbiAgbnI6IFsxLCAyXSxcbiAgZmM6IDEyXG59LCB7XG4gIGxuZ3M6IFsnanYnXSxcbiAgbnI6IFswLCAxXSxcbiAgZmM6IDEzXG59LCB7XG4gIGxuZ3M6IFsna3cnXSxcbiAgbnI6IFsxLCAyLCAzLCA0XSxcbiAgZmM6IDE0XG59LCB7XG4gIGxuZ3M6IFsnbHQnXSxcbiAgbnI6IFsxLCAyLCAxMF0sXG4gIGZjOiAxNVxufSwge1xuICBsbmdzOiBbJ2x2J10sXG4gIG5yOiBbMSwgMiwgMF0sXG4gIGZjOiAxNlxufSwge1xuICBsbmdzOiBbJ21rJ10sXG4gIG5yOiBbMSwgMl0sXG4gIGZjOiAxN1xufSwge1xuICBsbmdzOiBbJ21uayddLFxuICBucjogWzAsIDEsIDJdLFxuICBmYzogMThcbn0sIHtcbiAgbG5nczogWydtdCddLFxuICBucjogWzEsIDIsIDExLCAyMF0sXG4gIGZjOiAxOVxufSwge1xuICBsbmdzOiBbJ29yJ10sXG4gIG5yOiBbMiwgMV0sXG4gIGZjOiAyXG59LCB7XG4gIGxuZ3M6IFsncm8nXSxcbiAgbnI6IFsxLCAyLCAyMF0sXG4gIGZjOiAyMFxufSwge1xuICBsbmdzOiBbJ3NsJ10sXG4gIG5yOiBbNSwgMSwgMiwgM10sXG4gIGZjOiAyMVxufSwge1xuICBsbmdzOiBbJ2hlJywgJ2l3J10sXG4gIG5yOiBbMSwgMiwgMjAsIDIxXSxcbiAgZmM6IDIyXG59XTtcbnZhciBfcnVsZXNQbHVyYWxzVHlwZXMgPSB7XG4gIDE6IGZ1bmN0aW9uIF8obikge1xuICAgIHJldHVybiBOdW1iZXIobiA+IDEpO1xuICB9LFxuICAyOiBmdW5jdGlvbiBfKG4pIHtcbiAgICByZXR1cm4gTnVtYmVyKG4gIT0gMSk7XG4gIH0sXG4gIDM6IGZ1bmN0aW9uIF8obikge1xuICAgIHJldHVybiAwO1xuICB9LFxuICA0OiBmdW5jdGlvbiBfKG4pIHtcbiAgICByZXR1cm4gTnVtYmVyKG4gJSAxMCA9PSAxICYmIG4gJSAxMDAgIT0gMTEgPyAwIDogbiAlIDEwID49IDIgJiYgbiAlIDEwIDw9IDQgJiYgKG4gJSAxMDAgPCAxMCB8fCBuICUgMTAwID49IDIwKSA/IDEgOiAyKTtcbiAgfSxcbiAgNTogZnVuY3Rpb24gXyhuKSB7XG4gICAgcmV0dXJuIE51bWJlcihuID09IDAgPyAwIDogbiA9PSAxID8gMSA6IG4gPT0gMiA/IDIgOiBuICUgMTAwID49IDMgJiYgbiAlIDEwMCA8PSAxMCA/IDMgOiBuICUgMTAwID49IDExID8gNCA6IDUpO1xuICB9LFxuICA2OiBmdW5jdGlvbiBfKG4pIHtcbiAgICByZXR1cm4gTnVtYmVyKG4gPT0gMSA/IDAgOiBuID49IDIgJiYgbiA8PSA0ID8gMSA6IDIpO1xuICB9LFxuICA3OiBmdW5jdGlvbiBfKG4pIHtcbiAgICByZXR1cm4gTnVtYmVyKG4gPT0gMSA/IDAgOiBuICUgMTAgPj0gMiAmJiBuICUgMTAgPD0gNCAmJiAobiAlIDEwMCA8IDEwIHx8IG4gJSAxMDAgPj0gMjApID8gMSA6IDIpO1xuICB9LFxuICA4OiBmdW5jdGlvbiBfKG4pIHtcbiAgICByZXR1cm4gTnVtYmVyKG4gPT0gMSA/IDAgOiBuID09IDIgPyAxIDogbiAhPSA4ICYmIG4gIT0gMTEgPyAyIDogMyk7XG4gIH0sXG4gIDk6IGZ1bmN0aW9uIF8obikge1xuICAgIHJldHVybiBOdW1iZXIobiA+PSAyKTtcbiAgfSxcbiAgMTA6IGZ1bmN0aW9uIF8obikge1xuICAgIHJldHVybiBOdW1iZXIobiA9PSAxID8gMCA6IG4gPT0gMiA/IDEgOiBuIDwgNyA/IDIgOiBuIDwgMTEgPyAzIDogNCk7XG4gIH0sXG4gIDExOiBmdW5jdGlvbiBfKG4pIHtcbiAgICByZXR1cm4gTnVtYmVyKG4gPT0gMSB8fCBuID09IDExID8gMCA6IG4gPT0gMiB8fCBuID09IDEyID8gMSA6IG4gPiAyICYmIG4gPCAyMCA/IDIgOiAzKTtcbiAgfSxcbiAgMTI6IGZ1bmN0aW9uIF8obikge1xuICAgIHJldHVybiBOdW1iZXIobiAlIDEwICE9IDEgfHwgbiAlIDEwMCA9PSAxMSk7XG4gIH0sXG4gIDEzOiBmdW5jdGlvbiBfKG4pIHtcbiAgICByZXR1cm4gTnVtYmVyKG4gIT09IDApO1xuICB9LFxuICAxNDogZnVuY3Rpb24gXyhuKSB7XG4gICAgcmV0dXJuIE51bWJlcihuID09IDEgPyAwIDogbiA9PSAyID8gMSA6IG4gPT0gMyA/IDIgOiAzKTtcbiAgfSxcbiAgMTU6IGZ1bmN0aW9uIF8obikge1xuICAgIHJldHVybiBOdW1iZXIobiAlIDEwID09IDEgJiYgbiAlIDEwMCAhPSAxMSA/IDAgOiBuICUgMTAgPj0gMiAmJiAobiAlIDEwMCA8IDEwIHx8IG4gJSAxMDAgPj0gMjApID8gMSA6IDIpO1xuICB9LFxuICAxNjogZnVuY3Rpb24gXyhuKSB7XG4gICAgcmV0dXJuIE51bWJlcihuICUgMTAgPT0gMSAmJiBuICUgMTAwICE9IDExID8gMCA6IG4gIT09IDAgPyAxIDogMik7XG4gIH0sXG4gIDE3OiBmdW5jdGlvbiBfKG4pIHtcbiAgICByZXR1cm4gTnVtYmVyKG4gPT0gMSB8fCBuICUgMTAgPT0gMSAmJiBuICUgMTAwICE9IDExID8gMCA6IDEpO1xuICB9LFxuICAxODogZnVuY3Rpb24gXyhuKSB7XG4gICAgcmV0dXJuIE51bWJlcihuID09IDAgPyAwIDogbiA9PSAxID8gMSA6IDIpO1xuICB9LFxuICAxOTogZnVuY3Rpb24gXyhuKSB7XG4gICAgcmV0dXJuIE51bWJlcihuID09IDEgPyAwIDogbiA9PSAwIHx8IG4gJSAxMDAgPiAxICYmIG4gJSAxMDAgPCAxMSA/IDEgOiBuICUgMTAwID4gMTAgJiYgbiAlIDEwMCA8IDIwID8gMiA6IDMpO1xuICB9LFxuICAyMDogZnVuY3Rpb24gXyhuKSB7XG4gICAgcmV0dXJuIE51bWJlcihuID09IDEgPyAwIDogbiA9PSAwIHx8IG4gJSAxMDAgPiAwICYmIG4gJSAxMDAgPCAyMCA/IDEgOiAyKTtcbiAgfSxcbiAgMjE6IGZ1bmN0aW9uIF8obikge1xuICAgIHJldHVybiBOdW1iZXIobiAlIDEwMCA9PSAxID8gMSA6IG4gJSAxMDAgPT0gMiA/IDIgOiBuICUgMTAwID09IDMgfHwgbiAlIDEwMCA9PSA0ID8gMyA6IDApO1xuICB9LFxuICAyMjogZnVuY3Rpb24gXyhuKSB7XG4gICAgcmV0dXJuIE51bWJlcihuID09IDEgPyAwIDogbiA9PSAyID8gMSA6IChuIDwgMCB8fCBuID4gMTApICYmIG4gJSAxMCA9PSAwID8gMiA6IDMpO1xuICB9XG59O1xudmFyIGRlcHJlY2F0ZWRKc29uVmVyc2lvbnMgPSBbJ3YxJywgJ3YyJywgJ3YzJ107XG52YXIgc3VmZml4ZXNPcmRlciA9IHtcbiAgemVybzogMCxcbiAgb25lOiAxLFxuICB0d286IDIsXG4gIGZldzogMyxcbiAgbWFueTogNCxcbiAgb3RoZXI6IDVcbn07XG5cbmZ1bmN0aW9uIGNyZWF0ZVJ1bGVzKCkge1xuICB2YXIgcnVsZXMgPSB7fTtcbiAgc2V0cy5mb3JFYWNoKGZ1bmN0aW9uIChzZXQpIHtcbiAgICBzZXQubG5ncy5mb3JFYWNoKGZ1bmN0aW9uIChsKSB7XG4gICAgICBydWxlc1tsXSA9IHtcbiAgICAgICAgbnVtYmVyczogc2V0Lm5yLFxuICAgICAgICBwbHVyYWxzOiBfcnVsZXNQbHVyYWxzVHlwZXNbc2V0LmZjXVxuICAgICAgfTtcbiAgICB9KTtcbiAgfSk7XG4gIHJldHVybiBydWxlcztcbn1cblxudmFyIFBsdXJhbFJlc29sdmVyID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBQbHVyYWxSZXNvbHZlcihsYW5ndWFnZVV0aWxzKSB7XG4gICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFBsdXJhbFJlc29sdmVyKTtcblxuICAgIHRoaXMubGFuZ3VhZ2VVdGlscyA9IGxhbmd1YWdlVXRpbHM7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICB0aGlzLmxvZ2dlciA9IGJhc2VMb2dnZXIuY3JlYXRlKCdwbHVyYWxSZXNvbHZlcicpO1xuXG4gICAgaWYgKCghdGhpcy5vcHRpb25zLmNvbXBhdGliaWxpdHlKU09OIHx8IHRoaXMub3B0aW9ucy5jb21wYXRpYmlsaXR5SlNPTiA9PT0gJ3Y0JykgJiYgKHR5cGVvZiBJbnRsID09PSAndW5kZWZpbmVkJyB8fCAhSW50bC5QbHVyYWxSdWxlcykpIHtcbiAgICAgIHRoaXMub3B0aW9ucy5jb21wYXRpYmlsaXR5SlNPTiA9ICd2Myc7XG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcignWW91ciBlbnZpcm9ubWVudCBzZWVtcyBub3QgdG8gYmUgSW50bCBBUEkgY29tcGF0aWJsZSwgdXNlIGFuIEludGwuUGx1cmFsUnVsZXMgcG9seWZpbGwuIFdpbGwgZmFsbGJhY2sgdG8gdGhlIGNvbXBhdGliaWxpdHlKU09OIHYzIGZvcm1hdCBoYW5kbGluZy4nKTtcbiAgICB9XG5cbiAgICB0aGlzLnJ1bGVzID0gY3JlYXRlUnVsZXMoKTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhQbHVyYWxSZXNvbHZlciwgW3tcbiAgICBrZXk6IFwiYWRkUnVsZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhZGRSdWxlKGxuZywgb2JqKSB7XG4gICAgICB0aGlzLnJ1bGVzW2xuZ10gPSBvYmo7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldFJ1bGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0UnVsZShjb2RlKSB7XG4gICAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG5cbiAgICAgIGlmICh0aGlzLnNob3VsZFVzZUludGxBcGkoKSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBuZXcgSW50bC5QbHVyYWxSdWxlcyhjb2RlLCB7XG4gICAgICAgICAgICB0eXBlOiBvcHRpb25zLm9yZGluYWwgPyAnb3JkaW5hbCcgOiAnY2FyZGluYWwnXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2ggKF91bnVzZWQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMucnVsZXNbY29kZV0gfHwgdGhpcy5ydWxlc1t0aGlzLmxhbmd1YWdlVXRpbHMuZ2V0TGFuZ3VhZ2VQYXJ0RnJvbUNvZGUoY29kZSldO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJuZWVkc1BsdXJhbFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBuZWVkc1BsdXJhbChjb2RlKSB7XG4gICAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG4gICAgICB2YXIgcnVsZSA9IHRoaXMuZ2V0UnVsZShjb2RlLCBvcHRpb25zKTtcblxuICAgICAgaWYgKHRoaXMuc2hvdWxkVXNlSW50bEFwaSgpKSB7XG4gICAgICAgIHJldHVybiBydWxlICYmIHJ1bGUucmVzb2x2ZWRPcHRpb25zKCkucGx1cmFsQ2F0ZWdvcmllcy5sZW5ndGggPiAxO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcnVsZSAmJiBydWxlLm51bWJlcnMubGVuZ3RoID4gMTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0UGx1cmFsRm9ybXNPZktleVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRQbHVyYWxGb3Jtc09mS2V5KGNvZGUsIGtleSkge1xuICAgICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IHt9O1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0U3VmZml4ZXMoY29kZSwgb3B0aW9ucykubWFwKGZ1bmN0aW9uIChzdWZmaXgpIHtcbiAgICAgICAgcmV0dXJuIFwiXCIuY29uY2F0KGtleSkuY29uY2F0KHN1ZmZpeCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0U3VmZml4ZXNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0U3VmZml4ZXMoY29kZSkge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICAgICAgdmFyIHJ1bGUgPSB0aGlzLmdldFJ1bGUoY29kZSwgb3B0aW9ucyk7XG5cbiAgICAgIGlmICghcnVsZSkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnNob3VsZFVzZUludGxBcGkoKSkge1xuICAgICAgICByZXR1cm4gcnVsZS5yZXNvbHZlZE9wdGlvbnMoKS5wbHVyYWxDYXRlZ29yaWVzLnNvcnQoZnVuY3Rpb24gKHBsdXJhbENhdGVnb3J5MSwgcGx1cmFsQ2F0ZWdvcnkyKSB7XG4gICAgICAgICAgcmV0dXJuIHN1ZmZpeGVzT3JkZXJbcGx1cmFsQ2F0ZWdvcnkxXSAtIHN1ZmZpeGVzT3JkZXJbcGx1cmFsQ2F0ZWdvcnkyXTtcbiAgICAgICAgfSkubWFwKGZ1bmN0aW9uIChwbHVyYWxDYXRlZ29yeSkge1xuICAgICAgICAgIHJldHVybiBcIlwiLmNvbmNhdChfdGhpcy5vcHRpb25zLnByZXBlbmQpLmNvbmNhdChwbHVyYWxDYXRlZ29yeSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcnVsZS5udW1iZXJzLm1hcChmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICAgIHJldHVybiBfdGhpcy5nZXRTdWZmaXgoY29kZSwgbnVtYmVyLCBvcHRpb25zKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRTdWZmaXhcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0U3VmZml4KGNvZGUsIGNvdW50KSB7XG4gICAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDoge307XG4gICAgICB2YXIgcnVsZSA9IHRoaXMuZ2V0UnVsZShjb2RlLCBvcHRpb25zKTtcblxuICAgICAgaWYgKHJ1bGUpIHtcbiAgICAgICAgaWYgKHRoaXMuc2hvdWxkVXNlSW50bEFwaSgpKSB7XG4gICAgICAgICAgcmV0dXJuIFwiXCIuY29uY2F0KHRoaXMub3B0aW9ucy5wcmVwZW5kKS5jb25jYXQocnVsZS5zZWxlY3QoY291bnQpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmdldFN1ZmZpeFJldHJvQ29tcGF0aWJsZShydWxlLCBjb3VudCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMubG9nZ2VyLndhcm4oXCJubyBwbHVyYWwgcnVsZSBmb3VuZCBmb3I6IFwiLmNvbmNhdChjb2RlKSk7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldFN1ZmZpeFJldHJvQ29tcGF0aWJsZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRTdWZmaXhSZXRyb0NvbXBhdGlibGUocnVsZSwgY291bnQpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICB2YXIgaWR4ID0gcnVsZS5ub0FicyA/IHJ1bGUucGx1cmFscyhjb3VudCkgOiBydWxlLnBsdXJhbHMoTWF0aC5hYnMoY291bnQpKTtcbiAgICAgIHZhciBzdWZmaXggPSBydWxlLm51bWJlcnNbaWR4XTtcblxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5zaW1wbGlmeVBsdXJhbFN1ZmZpeCAmJiBydWxlLm51bWJlcnMubGVuZ3RoID09PSAyICYmIHJ1bGUubnVtYmVyc1swXSA9PT0gMSkge1xuICAgICAgICBpZiAoc3VmZml4ID09PSAyKSB7XG4gICAgICAgICAgc3VmZml4ID0gJ3BsdXJhbCc7XG4gICAgICAgIH0gZWxzZSBpZiAoc3VmZml4ID09PSAxKSB7XG4gICAgICAgICAgc3VmZml4ID0gJyc7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIHJldHVyblN1ZmZpeCA9IGZ1bmN0aW9uIHJldHVyblN1ZmZpeCgpIHtcbiAgICAgICAgcmV0dXJuIF90aGlzMi5vcHRpb25zLnByZXBlbmQgJiYgc3VmZml4LnRvU3RyaW5nKCkgPyBfdGhpczIub3B0aW9ucy5wcmVwZW5kICsgc3VmZml4LnRvU3RyaW5nKCkgOiBzdWZmaXgudG9TdHJpbmcoKTtcbiAgICAgIH07XG5cbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuY29tcGF0aWJpbGl0eUpTT04gPT09ICd2MScpIHtcbiAgICAgICAgaWYgKHN1ZmZpeCA9PT0gMSkgcmV0dXJuICcnO1xuICAgICAgICBpZiAodHlwZW9mIHN1ZmZpeCA9PT0gJ251bWJlcicpIHJldHVybiBcIl9wbHVyYWxfXCIuY29uY2F0KHN1ZmZpeC50b1N0cmluZygpKTtcbiAgICAgICAgcmV0dXJuIHJldHVyblN1ZmZpeCgpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLm9wdGlvbnMuY29tcGF0aWJpbGl0eUpTT04gPT09ICd2MicpIHtcbiAgICAgICAgcmV0dXJuIHJldHVyblN1ZmZpeCgpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLm9wdGlvbnMuc2ltcGxpZnlQbHVyYWxTdWZmaXggJiYgcnVsZS5udW1iZXJzLmxlbmd0aCA9PT0gMiAmJiBydWxlLm51bWJlcnNbMF0gPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIHJldHVyblN1ZmZpeCgpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5vcHRpb25zLnByZXBlbmQgJiYgaWR4LnRvU3RyaW5nKCkgPyB0aGlzLm9wdGlvbnMucHJlcGVuZCArIGlkeC50b1N0cmluZygpIDogaWR4LnRvU3RyaW5nKCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNob3VsZFVzZUludGxBcGlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2hvdWxkVXNlSW50bEFwaSgpIHtcbiAgICAgIHJldHVybiAhZGVwcmVjYXRlZEpzb25WZXJzaW9ucy5pbmNsdWRlcyh0aGlzLm9wdGlvbnMuY29tcGF0aWJpbGl0eUpTT04pO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBQbHVyYWxSZXNvbHZlcjtcbn0oKTtcblxuZnVuY3Rpb24gb3duS2V5cyQzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHsgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTsgaWYgKGVudW1lcmFibGVPbmx5KSB7IHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlOyB9KTsgfSBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7IH0gcmV0dXJuIGtleXM7IH1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCQzKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldICE9IG51bGwgPyBhcmd1bWVudHNbaV0gOiB7fTsgaWYgKGkgJSAyKSB7IG93bktleXMkMyhPYmplY3Qoc291cmNlKSwgdHJ1ZSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOyB9KTsgfSBlbHNlIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycykgeyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpOyB9IGVsc2UgeyBvd25LZXlzJDMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTsgfSk7IH0gfSByZXR1cm4gdGFyZ2V0OyB9XG5cbnZhciBJbnRlcnBvbGF0b3IgPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEludGVycG9sYXRvcigpIHtcbiAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgSW50ZXJwb2xhdG9yKTtcblxuICAgIHRoaXMubG9nZ2VyID0gYmFzZUxvZ2dlci5jcmVhdGUoJ2ludGVycG9sYXRvcicpO1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG5cbiAgICB0aGlzLmZvcm1hdCA9IG9wdGlvbnMuaW50ZXJwb2xhdGlvbiAmJiBvcHRpb25zLmludGVycG9sYXRpb24uZm9ybWF0IHx8IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH07XG5cbiAgICB0aGlzLmluaXQob3B0aW9ucyk7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoSW50ZXJwb2xhdG9yLCBbe1xuICAgIGtleTogXCJpbml0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGluaXQoKSB7XG4gICAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG4gICAgICBpZiAoIW9wdGlvbnMuaW50ZXJwb2xhdGlvbikgb3B0aW9ucy5pbnRlcnBvbGF0aW9uID0ge1xuICAgICAgICBlc2NhcGVWYWx1ZTogdHJ1ZVxuICAgICAgfTtcbiAgICAgIHZhciBpT3B0cyA9IG9wdGlvbnMuaW50ZXJwb2xhdGlvbjtcbiAgICAgIHRoaXMuZXNjYXBlID0gaU9wdHMuZXNjYXBlICE9PSB1bmRlZmluZWQgPyBpT3B0cy5lc2NhcGUgOiBlc2NhcGU7XG4gICAgICB0aGlzLmVzY2FwZVZhbHVlID0gaU9wdHMuZXNjYXBlVmFsdWUgIT09IHVuZGVmaW5lZCA/IGlPcHRzLmVzY2FwZVZhbHVlIDogdHJ1ZTtcbiAgICAgIHRoaXMudXNlUmF3VmFsdWVUb0VzY2FwZSA9IGlPcHRzLnVzZVJhd1ZhbHVlVG9Fc2NhcGUgIT09IHVuZGVmaW5lZCA/IGlPcHRzLnVzZVJhd1ZhbHVlVG9Fc2NhcGUgOiBmYWxzZTtcbiAgICAgIHRoaXMucHJlZml4ID0gaU9wdHMucHJlZml4ID8gcmVnZXhFc2NhcGUoaU9wdHMucHJlZml4KSA6IGlPcHRzLnByZWZpeEVzY2FwZWQgfHwgJ3t7JztcbiAgICAgIHRoaXMuc3VmZml4ID0gaU9wdHMuc3VmZml4ID8gcmVnZXhFc2NhcGUoaU9wdHMuc3VmZml4KSA6IGlPcHRzLnN1ZmZpeEVzY2FwZWQgfHwgJ319JztcbiAgICAgIHRoaXMuZm9ybWF0U2VwYXJhdG9yID0gaU9wdHMuZm9ybWF0U2VwYXJhdG9yID8gaU9wdHMuZm9ybWF0U2VwYXJhdG9yIDogaU9wdHMuZm9ybWF0U2VwYXJhdG9yIHx8ICcsJztcbiAgICAgIHRoaXMudW5lc2NhcGVQcmVmaXggPSBpT3B0cy51bmVzY2FwZVN1ZmZpeCA/ICcnIDogaU9wdHMudW5lc2NhcGVQcmVmaXggfHwgJy0nO1xuICAgICAgdGhpcy51bmVzY2FwZVN1ZmZpeCA9IHRoaXMudW5lc2NhcGVQcmVmaXggPyAnJyA6IGlPcHRzLnVuZXNjYXBlU3VmZml4IHx8ICcnO1xuICAgICAgdGhpcy5uZXN0aW5nUHJlZml4ID0gaU9wdHMubmVzdGluZ1ByZWZpeCA/IHJlZ2V4RXNjYXBlKGlPcHRzLm5lc3RpbmdQcmVmaXgpIDogaU9wdHMubmVzdGluZ1ByZWZpeEVzY2FwZWQgfHwgcmVnZXhFc2NhcGUoJyR0KCcpO1xuICAgICAgdGhpcy5uZXN0aW5nU3VmZml4ID0gaU9wdHMubmVzdGluZ1N1ZmZpeCA/IHJlZ2V4RXNjYXBlKGlPcHRzLm5lc3RpbmdTdWZmaXgpIDogaU9wdHMubmVzdGluZ1N1ZmZpeEVzY2FwZWQgfHwgcmVnZXhFc2NhcGUoJyknKTtcbiAgICAgIHRoaXMubmVzdGluZ09wdGlvbnNTZXBhcmF0b3IgPSBpT3B0cy5uZXN0aW5nT3B0aW9uc1NlcGFyYXRvciA/IGlPcHRzLm5lc3RpbmdPcHRpb25zU2VwYXJhdG9yIDogaU9wdHMubmVzdGluZ09wdGlvbnNTZXBhcmF0b3IgfHwgJywnO1xuICAgICAgdGhpcy5tYXhSZXBsYWNlcyA9IGlPcHRzLm1heFJlcGxhY2VzID8gaU9wdHMubWF4UmVwbGFjZXMgOiAxMDAwO1xuICAgICAgdGhpcy5hbHdheXNGb3JtYXQgPSBpT3B0cy5hbHdheXNGb3JtYXQgIT09IHVuZGVmaW5lZCA/IGlPcHRzLmFsd2F5c0Zvcm1hdCA6IGZhbHNlO1xuICAgICAgdGhpcy5yZXNldFJlZ0V4cCgpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZXNldFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZXNldCgpIHtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMpIHRoaXMuaW5pdCh0aGlzLm9wdGlvbnMpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZXNldFJlZ0V4cFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZXNldFJlZ0V4cCgpIHtcbiAgICAgIHZhciByZWdleHBTdHIgPSBcIlwiLmNvbmNhdCh0aGlzLnByZWZpeCwgXCIoLis/KVwiKS5jb25jYXQodGhpcy5zdWZmaXgpO1xuICAgICAgdGhpcy5yZWdleHAgPSBuZXcgUmVnRXhwKHJlZ2V4cFN0ciwgJ2cnKTtcbiAgICAgIHZhciByZWdleHBVbmVzY2FwZVN0ciA9IFwiXCIuY29uY2F0KHRoaXMucHJlZml4KS5jb25jYXQodGhpcy51bmVzY2FwZVByZWZpeCwgXCIoLis/KVwiKS5jb25jYXQodGhpcy51bmVzY2FwZVN1ZmZpeCkuY29uY2F0KHRoaXMuc3VmZml4KTtcbiAgICAgIHRoaXMucmVnZXhwVW5lc2NhcGUgPSBuZXcgUmVnRXhwKHJlZ2V4cFVuZXNjYXBlU3RyLCAnZycpO1xuICAgICAgdmFyIG5lc3RpbmdSZWdleHBTdHIgPSBcIlwiLmNvbmNhdCh0aGlzLm5lc3RpbmdQcmVmaXgsIFwiKC4rPylcIikuY29uY2F0KHRoaXMubmVzdGluZ1N1ZmZpeCk7XG4gICAgICB0aGlzLm5lc3RpbmdSZWdleHAgPSBuZXcgUmVnRXhwKG5lc3RpbmdSZWdleHBTdHIsICdnJyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImludGVycG9sYXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGludGVycG9sYXRlKHN0ciwgZGF0YSwgbG5nLCBvcHRpb25zKSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICB2YXIgbWF0Y2g7XG4gICAgICB2YXIgdmFsdWU7XG4gICAgICB2YXIgcmVwbGFjZXM7XG4gICAgICB2YXIgZGVmYXVsdERhdGEgPSB0aGlzLm9wdGlvbnMgJiYgdGhpcy5vcHRpb25zLmludGVycG9sYXRpb24gJiYgdGhpcy5vcHRpb25zLmludGVycG9sYXRpb24uZGVmYXVsdFZhcmlhYmxlcyB8fCB7fTtcblxuICAgICAgZnVuY3Rpb24gcmVnZXhTYWZlKHZhbCkge1xuICAgICAgICByZXR1cm4gdmFsLnJlcGxhY2UoL1xcJC9nLCAnJCQkJCcpO1xuICAgICAgfVxuXG4gICAgICB2YXIgaGFuZGxlRm9ybWF0ID0gZnVuY3Rpb24gaGFuZGxlRm9ybWF0KGtleSkge1xuICAgICAgICBpZiAoa2V5LmluZGV4T2YoX3RoaXMuZm9ybWF0U2VwYXJhdG9yKSA8IDApIHtcbiAgICAgICAgICB2YXIgcGF0aCA9IGdldFBhdGhXaXRoRGVmYXVsdHMoZGF0YSwgZGVmYXVsdERhdGEsIGtleSk7XG4gICAgICAgICAgcmV0dXJuIF90aGlzLmFsd2F5c0Zvcm1hdCA/IF90aGlzLmZvcm1hdChwYXRoLCB1bmRlZmluZWQsIGxuZywgX29iamVjdFNwcmVhZCQzKF9vYmplY3RTcHJlYWQkMyhfb2JqZWN0U3ByZWFkJDMoe30sIG9wdGlvbnMpLCBkYXRhKSwge30sIHtcbiAgICAgICAgICAgIGludGVycG9sYXRpb25rZXk6IGtleVxuICAgICAgICAgIH0pKSA6IHBhdGg7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgcCA9IGtleS5zcGxpdChfdGhpcy5mb3JtYXRTZXBhcmF0b3IpO1xuICAgICAgICB2YXIgayA9IHAuc2hpZnQoKS50cmltKCk7XG4gICAgICAgIHZhciBmID0gcC5qb2luKF90aGlzLmZvcm1hdFNlcGFyYXRvcikudHJpbSgpO1xuICAgICAgICByZXR1cm4gX3RoaXMuZm9ybWF0KGdldFBhdGhXaXRoRGVmYXVsdHMoZGF0YSwgZGVmYXVsdERhdGEsIGspLCBmLCBsbmcsIF9vYmplY3RTcHJlYWQkMyhfb2JqZWN0U3ByZWFkJDMoX29iamVjdFNwcmVhZCQzKHt9LCBvcHRpb25zKSwgZGF0YSksIHt9LCB7XG4gICAgICAgICAgaW50ZXJwb2xhdGlvbmtleToga1xuICAgICAgICB9KSk7XG4gICAgICB9O1xuXG4gICAgICB0aGlzLnJlc2V0UmVnRXhwKCk7XG4gICAgICB2YXIgbWlzc2luZ0ludGVycG9sYXRpb25IYW5kbGVyID0gb3B0aW9ucyAmJiBvcHRpb25zLm1pc3NpbmdJbnRlcnBvbGF0aW9uSGFuZGxlciB8fCB0aGlzLm9wdGlvbnMubWlzc2luZ0ludGVycG9sYXRpb25IYW5kbGVyO1xuICAgICAgdmFyIHNraXBPblZhcmlhYmxlcyA9IG9wdGlvbnMgJiYgb3B0aW9ucy5pbnRlcnBvbGF0aW9uICYmIG9wdGlvbnMuaW50ZXJwb2xhdGlvbi5za2lwT25WYXJpYWJsZXMgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuaW50ZXJwb2xhdGlvbi5za2lwT25WYXJpYWJsZXMgOiB0aGlzLm9wdGlvbnMuaW50ZXJwb2xhdGlvbi5za2lwT25WYXJpYWJsZXM7XG4gICAgICB2YXIgdG9kb3MgPSBbe1xuICAgICAgICByZWdleDogdGhpcy5yZWdleHBVbmVzY2FwZSxcbiAgICAgICAgc2FmZVZhbHVlOiBmdW5jdGlvbiBzYWZlVmFsdWUodmFsKSB7XG4gICAgICAgICAgcmV0dXJuIHJlZ2V4U2FmZSh2YWwpO1xuICAgICAgICB9XG4gICAgICB9LCB7XG4gICAgICAgIHJlZ2V4OiB0aGlzLnJlZ2V4cCxcbiAgICAgICAgc2FmZVZhbHVlOiBmdW5jdGlvbiBzYWZlVmFsdWUodmFsKSB7XG4gICAgICAgICAgcmV0dXJuIF90aGlzLmVzY2FwZVZhbHVlID8gcmVnZXhTYWZlKF90aGlzLmVzY2FwZSh2YWwpKSA6IHJlZ2V4U2FmZSh2YWwpO1xuICAgICAgICB9XG4gICAgICB9XTtcbiAgICAgIHRvZG9zLmZvckVhY2goZnVuY3Rpb24gKHRvZG8pIHtcbiAgICAgICAgcmVwbGFjZXMgPSAwO1xuXG4gICAgICAgIHdoaWxlIChtYXRjaCA9IHRvZG8ucmVnZXguZXhlYyhzdHIpKSB7XG4gICAgICAgICAgdmFyIG1hdGNoZWRWYXIgPSBtYXRjaFsxXS50cmltKCk7XG4gICAgICAgICAgdmFsdWUgPSBoYW5kbGVGb3JtYXQobWF0Y2hlZFZhcik7XG5cbiAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBtaXNzaW5nSW50ZXJwb2xhdGlvbkhhbmRsZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgdmFyIHRlbXAgPSBtaXNzaW5nSW50ZXJwb2xhdGlvbkhhbmRsZXIoc3RyLCBtYXRjaCwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgIHZhbHVlID0gdHlwZW9mIHRlbXAgPT09ICdzdHJpbmcnID8gdGVtcCA6ICcnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChvcHRpb25zICYmIG9wdGlvbnMuaGFzT3duUHJvcGVydHkobWF0Y2hlZFZhcikpIHtcbiAgICAgICAgICAgICAgdmFsdWUgPSAnJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2tpcE9uVmFyaWFibGVzKSB7XG4gICAgICAgICAgICAgIHZhbHVlID0gbWF0Y2hbMF07XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgX3RoaXMubG9nZ2VyLndhcm4oXCJtaXNzZWQgdG8gcGFzcyBpbiB2YXJpYWJsZSBcIi5jb25jYXQobWF0Y2hlZFZhciwgXCIgZm9yIGludGVycG9sYXRpbmcgXCIpLmNvbmNhdChzdHIpKTtcblxuICAgICAgICAgICAgICB2YWx1ZSA9ICcnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJyAmJiAhX3RoaXMudXNlUmF3VmFsdWVUb0VzY2FwZSkge1xuICAgICAgICAgICAgdmFsdWUgPSBtYWtlU3RyaW5nKHZhbHVlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgc2FmZVZhbHVlID0gdG9kby5zYWZlVmFsdWUodmFsdWUpO1xuICAgICAgICAgIHN0ciA9IHN0ci5yZXBsYWNlKG1hdGNoWzBdLCBzYWZlVmFsdWUpO1xuXG4gICAgICAgICAgaWYgKHNraXBPblZhcmlhYmxlcykge1xuICAgICAgICAgICAgdG9kby5yZWdleC5sYXN0SW5kZXggKz0gdmFsdWUubGVuZ3RoO1xuICAgICAgICAgICAgdG9kby5yZWdleC5sYXN0SW5kZXggLT0gbWF0Y2hbMF0ubGVuZ3RoO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0b2RvLnJlZ2V4Lmxhc3RJbmRleCA9IDA7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmVwbGFjZXMrKztcblxuICAgICAgICAgIGlmIChyZXBsYWNlcyA+PSBfdGhpcy5tYXhSZXBsYWNlcykge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIm5lc3RcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbmVzdChzdHIsIGZjKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IHt9O1xuICAgICAgdmFyIG1hdGNoO1xuICAgICAgdmFyIHZhbHVlO1xuXG4gICAgICB2YXIgY2xvbmVkT3B0aW9ucyA9IF9vYmplY3RTcHJlYWQkMyh7fSwgb3B0aW9ucyk7XG5cbiAgICAgIGNsb25lZE9wdGlvbnMuYXBwbHlQb3N0UHJvY2Vzc29yID0gZmFsc2U7XG4gICAgICBkZWxldGUgY2xvbmVkT3B0aW9ucy5kZWZhdWx0VmFsdWU7XG5cbiAgICAgIGZ1bmN0aW9uIGhhbmRsZUhhc09wdGlvbnMoa2V5LCBpbmhlcml0ZWRPcHRpb25zKSB7XG4gICAgICAgIHZhciBzZXAgPSB0aGlzLm5lc3RpbmdPcHRpb25zU2VwYXJhdG9yO1xuICAgICAgICBpZiAoa2V5LmluZGV4T2Yoc2VwKSA8IDApIHJldHVybiBrZXk7XG4gICAgICAgIHZhciBjID0ga2V5LnNwbGl0KG5ldyBSZWdFeHAoXCJcIi5jb25jYXQoc2VwLCBcIlsgXSp7XCIpKSk7XG4gICAgICAgIHZhciBvcHRpb25zU3RyaW5nID0gXCJ7XCIuY29uY2F0KGNbMV0pO1xuICAgICAgICBrZXkgPSBjWzBdO1xuICAgICAgICBvcHRpb25zU3RyaW5nID0gdGhpcy5pbnRlcnBvbGF0ZShvcHRpb25zU3RyaW5nLCBjbG9uZWRPcHRpb25zKTtcbiAgICAgICAgdmFyIG1hdGNoZWRTaW5nbGVRdW90ZXMgPSBvcHRpb25zU3RyaW5nLm1hdGNoKC8nL2cpO1xuICAgICAgICB2YXIgbWF0Y2hlZERvdWJsZVF1b3RlcyA9IG9wdGlvbnNTdHJpbmcubWF0Y2goL1wiL2cpO1xuXG4gICAgICAgIGlmIChtYXRjaGVkU2luZ2xlUXVvdGVzICYmIG1hdGNoZWRTaW5nbGVRdW90ZXMubGVuZ3RoICUgMiA9PT0gMCAmJiAhbWF0Y2hlZERvdWJsZVF1b3RlcyB8fCBtYXRjaGVkRG91YmxlUXVvdGVzLmxlbmd0aCAlIDIgIT09IDApIHtcbiAgICAgICAgICBvcHRpb25zU3RyaW5nID0gb3B0aW9uc1N0cmluZy5yZXBsYWNlKC8nL2csICdcIicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjbG9uZWRPcHRpb25zID0gSlNPTi5wYXJzZShvcHRpb25zU3RyaW5nKTtcbiAgICAgICAgICBpZiAoaW5oZXJpdGVkT3B0aW9ucykgY2xvbmVkT3B0aW9ucyA9IF9vYmplY3RTcHJlYWQkMyhfb2JqZWN0U3ByZWFkJDMoe30sIGluaGVyaXRlZE9wdGlvbnMpLCBjbG9uZWRPcHRpb25zKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXCJmYWlsZWQgcGFyc2luZyBvcHRpb25zIHN0cmluZyBpbiBuZXN0aW5nIGZvciBrZXkgXCIuY29uY2F0KGtleSksIGUpO1xuICAgICAgICAgIHJldHVybiBcIlwiLmNvbmNhdChrZXkpLmNvbmNhdChzZXApLmNvbmNhdChvcHRpb25zU3RyaW5nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRlbGV0ZSBjbG9uZWRPcHRpb25zLmRlZmF1bHRWYWx1ZTtcbiAgICAgICAgcmV0dXJuIGtleTtcbiAgICAgIH1cblxuICAgICAgd2hpbGUgKG1hdGNoID0gdGhpcy5uZXN0aW5nUmVnZXhwLmV4ZWMoc3RyKSkge1xuICAgICAgICB2YXIgZm9ybWF0dGVycyA9IFtdO1xuICAgICAgICB2YXIgZG9SZWR1Y2UgPSBmYWxzZTtcblxuICAgICAgICBpZiAobWF0Y2hbMF0uaW5kZXhPZih0aGlzLmZvcm1hdFNlcGFyYXRvcikgIT09IC0xICYmICEvey4qfS8udGVzdChtYXRjaFsxXSkpIHtcbiAgICAgICAgICB2YXIgciA9IG1hdGNoWzFdLnNwbGl0KHRoaXMuZm9ybWF0U2VwYXJhdG9yKS5tYXAoZnVuY3Rpb24gKGVsZW0pIHtcbiAgICAgICAgICAgIHJldHVybiBlbGVtLnRyaW0oKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBtYXRjaFsxXSA9IHIuc2hpZnQoKTtcbiAgICAgICAgICBmb3JtYXR0ZXJzID0gcjtcbiAgICAgICAgICBkb1JlZHVjZSA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICB2YWx1ZSA9IGZjKGhhbmRsZUhhc09wdGlvbnMuY2FsbCh0aGlzLCBtYXRjaFsxXS50cmltKCksIGNsb25lZE9wdGlvbnMpLCBjbG9uZWRPcHRpb25zKTtcbiAgICAgICAgaWYgKHZhbHVlICYmIG1hdGNoWzBdID09PSBzdHIgJiYgdHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykgcmV0dXJuIHZhbHVlO1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykgdmFsdWUgPSBtYWtlU3RyaW5nKHZhbHVlKTtcblxuICAgICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIud2FybihcIm1pc3NlZCB0byByZXNvbHZlIFwiLmNvbmNhdChtYXRjaFsxXSwgXCIgZm9yIG5lc3RpbmcgXCIpLmNvbmNhdChzdHIpKTtcbiAgICAgICAgICB2YWx1ZSA9ICcnO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRvUmVkdWNlKSB7XG4gICAgICAgICAgdmFsdWUgPSBmb3JtYXR0ZXJzLnJlZHVjZShmdW5jdGlvbiAodiwgZikge1xuICAgICAgICAgICAgcmV0dXJuIF90aGlzMi5mb3JtYXQodiwgZiwgb3B0aW9ucy5sbmcsIF9vYmplY3RTcHJlYWQkMyhfb2JqZWN0U3ByZWFkJDMoe30sIG9wdGlvbnMpLCB7fSwge1xuICAgICAgICAgICAgICBpbnRlcnBvbGF0aW9ua2V5OiBtYXRjaFsxXS50cmltKClcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICB9LCB2YWx1ZS50cmltKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgc3RyID0gc3RyLnJlcGxhY2UobWF0Y2hbMF0sIHZhbHVlKTtcbiAgICAgICAgdGhpcy5yZWdleHAubGFzdEluZGV4ID0gMDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gSW50ZXJwb2xhdG9yO1xufSgpO1xuXG5mdW5jdGlvbiBvd25LZXlzJDQob2JqZWN0LCBlbnVtZXJhYmxlT25seSkgeyB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOyBpZiAoZW51bWVyYWJsZU9ubHkpIHsgc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7IH0pOyB9IGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTsgfSByZXR1cm4ga2V5czsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkJDQodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV0gIT0gbnVsbCA/IGFyZ3VtZW50c1tpXSA6IHt9OyBpZiAoaSAlIDIpIHsgb3duS2V5cyQ0KE9iamVjdChzb3VyY2UpLCB0cnVlKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pOyB9IGVsc2UgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSk7IH0gZWxzZSB7IG93bktleXMkNChPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpOyB9KTsgfSB9IHJldHVybiB0YXJnZXQ7IH1cblxuZnVuY3Rpb24gcGFyc2VGb3JtYXRTdHIoZm9ybWF0U3RyKSB7XG4gIHZhciBmb3JtYXROYW1lID0gZm9ybWF0U3RyLnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuICB2YXIgZm9ybWF0T3B0aW9ucyA9IHt9O1xuXG4gIGlmIChmb3JtYXRTdHIuaW5kZXhPZignKCcpID4gLTEpIHtcbiAgICB2YXIgcCA9IGZvcm1hdFN0ci5zcGxpdCgnKCcpO1xuICAgIGZvcm1hdE5hbWUgPSBwWzBdLnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuICAgIHZhciBvcHRTdHIgPSBwWzFdLnN1YnN0cmluZygwLCBwWzFdLmxlbmd0aCAtIDEpO1xuXG4gICAgaWYgKGZvcm1hdE5hbWUgPT09ICdjdXJyZW5jeScgJiYgb3B0U3RyLmluZGV4T2YoJzonKSA8IDApIHtcbiAgICAgIGlmICghZm9ybWF0T3B0aW9ucy5jdXJyZW5jeSkgZm9ybWF0T3B0aW9ucy5jdXJyZW5jeSA9IG9wdFN0ci50cmltKCk7XG4gICAgfSBlbHNlIGlmIChmb3JtYXROYW1lID09PSAncmVsYXRpdmV0aW1lJyAmJiBvcHRTdHIuaW5kZXhPZignOicpIDwgMCkge1xuICAgICAgaWYgKCFmb3JtYXRPcHRpb25zLnJhbmdlKSBmb3JtYXRPcHRpb25zLnJhbmdlID0gb3B0U3RyLnRyaW0oKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIG9wdHMgPSBvcHRTdHIuc3BsaXQoJzsnKTtcbiAgICAgIG9wdHMuZm9yRWFjaChmdW5jdGlvbiAob3B0KSB7XG4gICAgICAgIGlmICghb3B0KSByZXR1cm47XG5cbiAgICAgICAgdmFyIF9vcHQkc3BsaXQgPSBvcHQuc3BsaXQoJzonKSxcbiAgICAgICAgICAgIF9vcHQkc3BsaXQyID0gX3RvQXJyYXkoX29wdCRzcGxpdCksXG4gICAgICAgICAgICBrZXkgPSBfb3B0JHNwbGl0MlswXSxcbiAgICAgICAgICAgIHJlc3QgPSBfb3B0JHNwbGl0Mi5zbGljZSgxKTtcblxuICAgICAgICB2YXIgdmFsID0gcmVzdC5qb2luKCc6JykudHJpbSgpLnJlcGxhY2UoL14nK3wnKyQvZywgJycpO1xuICAgICAgICBpZiAoIWZvcm1hdE9wdGlvbnNba2V5LnRyaW0oKV0pIGZvcm1hdE9wdGlvbnNba2V5LnRyaW0oKV0gPSB2YWw7XG4gICAgICAgIGlmICh2YWwgPT09ICdmYWxzZScpIGZvcm1hdE9wdGlvbnNba2V5LnRyaW0oKV0gPSBmYWxzZTtcbiAgICAgICAgaWYgKHZhbCA9PT0gJ3RydWUnKSBmb3JtYXRPcHRpb25zW2tleS50cmltKCldID0gdHJ1ZTtcbiAgICAgICAgaWYgKCFpc05hTih2YWwpKSBmb3JtYXRPcHRpb25zW2tleS50cmltKCldID0gcGFyc2VJbnQodmFsLCAxMCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGZvcm1hdE5hbWU6IGZvcm1hdE5hbWUsXG4gICAgZm9ybWF0T3B0aW9uczogZm9ybWF0T3B0aW9uc1xuICB9O1xufVxuXG52YXIgRm9ybWF0dGVyID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBGb3JtYXR0ZXIoKSB7XG4gICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEZvcm1hdHRlcik7XG5cbiAgICB0aGlzLmxvZ2dlciA9IGJhc2VMb2dnZXIuY3JlYXRlKCdmb3JtYXR0ZXInKTtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIHRoaXMuZm9ybWF0cyA9IHtcbiAgICAgIG51bWJlcjogZnVuY3Rpb24gbnVtYmVyKHZhbCwgbG5nLCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBuZXcgSW50bC5OdW1iZXJGb3JtYXQobG5nLCBvcHRpb25zKS5mb3JtYXQodmFsKTtcbiAgICAgIH0sXG4gICAgICBjdXJyZW5jeTogZnVuY3Rpb24gY3VycmVuY3kodmFsLCBsbmcsIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBJbnRsLk51bWJlckZvcm1hdChsbmcsIF9vYmplY3RTcHJlYWQkNChfb2JqZWN0U3ByZWFkJDQoe30sIG9wdGlvbnMpLCB7fSwge1xuICAgICAgICAgIHN0eWxlOiAnY3VycmVuY3knXG4gICAgICAgIH0pKS5mb3JtYXQodmFsKTtcbiAgICAgIH0sXG4gICAgICBkYXRldGltZTogZnVuY3Rpb24gZGF0ZXRpbWUodmFsLCBsbmcsIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KGxuZywgX29iamVjdFNwcmVhZCQ0KHt9LCBvcHRpb25zKSkuZm9ybWF0KHZhbCk7XG4gICAgICB9LFxuICAgICAgcmVsYXRpdmV0aW1lOiBmdW5jdGlvbiByZWxhdGl2ZXRpbWUodmFsLCBsbmcsIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBJbnRsLlJlbGF0aXZlVGltZUZvcm1hdChsbmcsIF9vYmplY3RTcHJlYWQkNCh7fSwgb3B0aW9ucykpLmZvcm1hdCh2YWwsIG9wdGlvbnMucmFuZ2UgfHwgJ2RheScpO1xuICAgICAgfSxcbiAgICAgIGxpc3Q6IGZ1bmN0aW9uIGxpc3QodmFsLCBsbmcsIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBJbnRsLkxpc3RGb3JtYXQobG5nLCBfb2JqZWN0U3ByZWFkJDQoe30sIG9wdGlvbnMpKS5mb3JtYXQodmFsKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHRoaXMuaW5pdChvcHRpb25zKTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhGb3JtYXR0ZXIsIFt7XG4gICAga2V5OiBcImluaXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaW5pdChzZXJ2aWNlcykge1xuICAgICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHtcbiAgICAgICAgaW50ZXJwb2xhdGlvbjoge31cbiAgICAgIH07XG4gICAgICB2YXIgaU9wdHMgPSBvcHRpb25zLmludGVycG9sYXRpb247XG4gICAgICB0aGlzLmZvcm1hdFNlcGFyYXRvciA9IGlPcHRzLmZvcm1hdFNlcGFyYXRvciA/IGlPcHRzLmZvcm1hdFNlcGFyYXRvciA6IGlPcHRzLmZvcm1hdFNlcGFyYXRvciB8fCAnLCc7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImFkZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhZGQobmFtZSwgZmMpIHtcbiAgICAgIHRoaXMuZm9ybWF0c1tuYW1lLnRvTG93ZXJDYXNlKCkudHJpbSgpXSA9IGZjO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJmb3JtYXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZm9ybWF0KHZhbHVlLCBfZm9ybWF0LCBsbmcsIG9wdGlvbnMpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgIHZhciBmb3JtYXRzID0gX2Zvcm1hdC5zcGxpdCh0aGlzLmZvcm1hdFNlcGFyYXRvcik7XG5cbiAgICAgIHZhciByZXN1bHQgPSBmb3JtYXRzLnJlZHVjZShmdW5jdGlvbiAobWVtLCBmKSB7XG4gICAgICAgIHZhciBfcGFyc2VGb3JtYXRTdHIgPSBwYXJzZUZvcm1hdFN0cihmKSxcbiAgICAgICAgICAgIGZvcm1hdE5hbWUgPSBfcGFyc2VGb3JtYXRTdHIuZm9ybWF0TmFtZSxcbiAgICAgICAgICAgIGZvcm1hdE9wdGlvbnMgPSBfcGFyc2VGb3JtYXRTdHIuZm9ybWF0T3B0aW9ucztcblxuICAgICAgICBpZiAoX3RoaXMuZm9ybWF0c1tmb3JtYXROYW1lXSkge1xuICAgICAgICAgIHZhciBmb3JtYXR0ZWQgPSBtZW07XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFyIHZhbE9wdGlvbnMgPSBvcHRpb25zICYmIG9wdGlvbnMuZm9ybWF0UGFyYW1zICYmIG9wdGlvbnMuZm9ybWF0UGFyYW1zW29wdGlvbnMuaW50ZXJwb2xhdGlvbmtleV0gfHwge307XG4gICAgICAgICAgICB2YXIgbCA9IHZhbE9wdGlvbnMubG9jYWxlIHx8IHZhbE9wdGlvbnMubG5nIHx8IG9wdGlvbnMubG9jYWxlIHx8IG9wdGlvbnMubG5nIHx8IGxuZztcbiAgICAgICAgICAgIGZvcm1hdHRlZCA9IF90aGlzLmZvcm1hdHNbZm9ybWF0TmFtZV0obWVtLCBsLCBfb2JqZWN0U3ByZWFkJDQoX29iamVjdFNwcmVhZCQ0KF9vYmplY3RTcHJlYWQkNCh7fSwgZm9ybWF0T3B0aW9ucyksIG9wdGlvbnMpLCB2YWxPcHRpb25zKSk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIF90aGlzLmxvZ2dlci53YXJuKGVycm9yKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gZm9ybWF0dGVkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIF90aGlzLmxvZ2dlci53YXJuKFwidGhlcmUgd2FzIG5vIGZvcm1hdCBmdW5jdGlvbiBmb3IgXCIuY29uY2F0KGZvcm1hdE5hbWUpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBtZW07XG4gICAgICB9LCB2YWx1ZSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBGb3JtYXR0ZXI7XG59KCk7XG5cbmZ1bmN0aW9uIG93bktleXMkNShvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7IHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7IGlmIChlbnVtZXJhYmxlT25seSkgeyBzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTsgfSk7IH0ga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpOyB9IHJldHVybiBrZXlzOyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQkNSh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXSAhPSBudWxsID8gYXJndW1lbnRzW2ldIDoge307IGlmIChpICUgMikgeyBvd25LZXlzJDUoT2JqZWN0KHNvdXJjZSksIHRydWUpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsgfSk7IH0gZWxzZSBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMpIHsgT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKTsgfSBlbHNlIHsgb3duS2V5cyQ1KE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7IH0pOyB9IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfY3JlYXRlU3VwZXIkMihEZXJpdmVkKSB7IHZhciBoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0ID0gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCQyKCk7IHJldHVybiBmdW5jdGlvbiBfY3JlYXRlU3VwZXJJbnRlcm5hbCgpIHsgdmFyIFN1cGVyID0gX2dldFByb3RvdHlwZU9mKERlcml2ZWQpLCByZXN1bHQ7IGlmIChoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KSB7IHZhciBOZXdUYXJnZXQgPSBfZ2V0UHJvdG90eXBlT2YodGhpcykuY29uc3RydWN0b3I7IHJlc3VsdCA9IFJlZmxlY3QuY29uc3RydWN0KFN1cGVyLCBhcmd1bWVudHMsIE5ld1RhcmdldCk7IH0gZWxzZSB7IHJlc3VsdCA9IFN1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH0gcmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIHJlc3VsdCk7IH07IH1cblxuZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCQyKCkgeyBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwidW5kZWZpbmVkXCIgfHwgIVJlZmxlY3QuY29uc3RydWN0KSByZXR1cm4gZmFsc2U7IGlmIChSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKSByZXR1cm4gZmFsc2U7IGlmICh0eXBlb2YgUHJveHkgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIHRydWU7IHRyeSB7IEJvb2xlYW4ucHJvdG90eXBlLnZhbHVlT2YuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChCb29sZWFuLCBbXSwgZnVuY3Rpb24gKCkge30pKTsgcmV0dXJuIHRydWU7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIGZhbHNlOyB9IH1cblxuZnVuY3Rpb24gcmVtb3ZlUGVuZGluZyhxLCBuYW1lKSB7XG4gIGlmIChxLnBlbmRpbmdbbmFtZV0gIT09IHVuZGVmaW5lZCkge1xuICAgIGRlbGV0ZSBxLnBlbmRpbmdbbmFtZV07XG4gICAgcS5wZW5kaW5nQ291bnQtLTtcbiAgfVxufVxuXG52YXIgQ29ubmVjdG9yID0gZnVuY3Rpb24gKF9FdmVudEVtaXR0ZXIpIHtcbiAgX2luaGVyaXRzKENvbm5lY3RvciwgX0V2ZW50RW1pdHRlcik7XG5cbiAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlciQyKENvbm5lY3Rvcik7XG5cbiAgZnVuY3Rpb24gQ29ubmVjdG9yKGJhY2tlbmQsIHN0b3JlLCBzZXJ2aWNlcykge1xuICAgIHZhciBfdGhpcztcblxuICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgJiYgYXJndW1lbnRzWzNdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbM10gOiB7fTtcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBDb25uZWN0b3IpO1xuXG4gICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKTtcblxuICAgIGlmIChpc0lFMTApIHtcbiAgICAgIEV2ZW50RW1pdHRlci5jYWxsKF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpKTtcbiAgICB9XG5cbiAgICBfdGhpcy5iYWNrZW5kID0gYmFja2VuZDtcbiAgICBfdGhpcy5zdG9yZSA9IHN0b3JlO1xuICAgIF90aGlzLnNlcnZpY2VzID0gc2VydmljZXM7XG4gICAgX3RoaXMubGFuZ3VhZ2VVdGlscyA9IHNlcnZpY2VzLmxhbmd1YWdlVXRpbHM7XG4gICAgX3RoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgX3RoaXMubG9nZ2VyID0gYmFzZUxvZ2dlci5jcmVhdGUoJ2JhY2tlbmRDb25uZWN0b3InKTtcbiAgICBfdGhpcy53YWl0aW5nUmVhZHMgPSBbXTtcbiAgICBfdGhpcy5tYXhQYXJhbGxlbFJlYWRzID0gb3B0aW9ucy5tYXhQYXJhbGxlbFJlYWRzIHx8IDEwO1xuICAgIF90aGlzLnJlYWRpbmdDYWxscyA9IDA7XG4gICAgX3RoaXMubWF4UmV0cmllcyA9IG9wdGlvbnMubWF4UmV0cmllcyA+PSAwID8gb3B0aW9ucy5tYXhSZXRyaWVzIDogNTtcbiAgICBfdGhpcy5yZXRyeVRpbWVvdXQgPSBvcHRpb25zLnJldHJ5VGltZW91dCA+PSAxID8gb3B0aW9ucy5yZXRyeVRpbWVvdXQgOiAzNTA7XG4gICAgX3RoaXMuc3RhdGUgPSB7fTtcbiAgICBfdGhpcy5xdWV1ZSA9IFtdO1xuXG4gICAgaWYgKF90aGlzLmJhY2tlbmQgJiYgX3RoaXMuYmFja2VuZC5pbml0KSB7XG4gICAgICBfdGhpcy5iYWNrZW5kLmluaXQoc2VydmljZXMsIG9wdGlvbnMuYmFja2VuZCwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKENvbm5lY3RvciwgW3tcbiAgICBrZXk6IFwicXVldWVMb2FkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHF1ZXVlTG9hZChsYW5ndWFnZXMsIG5hbWVzcGFjZXMsIG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgdmFyIHRvTG9hZCA9IHt9O1xuICAgICAgdmFyIHBlbmRpbmcgPSB7fTtcbiAgICAgIHZhciB0b0xvYWRMYW5ndWFnZXMgPSB7fTtcbiAgICAgIHZhciB0b0xvYWROYW1lc3BhY2VzID0ge307XG4gICAgICBsYW5ndWFnZXMuZm9yRWFjaChmdW5jdGlvbiAobG5nKSB7XG4gICAgICAgIHZhciBoYXNBbGxOYW1lc3BhY2VzID0gdHJ1ZTtcbiAgICAgICAgbmFtZXNwYWNlcy5mb3JFYWNoKGZ1bmN0aW9uIChucykge1xuICAgICAgICAgIHZhciBuYW1lID0gXCJcIi5jb25jYXQobG5nLCBcInxcIikuY29uY2F0KG5zKTtcblxuICAgICAgICAgIGlmICghb3B0aW9ucy5yZWxvYWQgJiYgX3RoaXMyLnN0b3JlLmhhc1Jlc291cmNlQnVuZGxlKGxuZywgbnMpKSB7XG4gICAgICAgICAgICBfdGhpczIuc3RhdGVbbmFtZV0gPSAyO1xuICAgICAgICAgIH0gZWxzZSBpZiAoX3RoaXMyLnN0YXRlW25hbWVdIDwgMCkgOyBlbHNlIGlmIChfdGhpczIuc3RhdGVbbmFtZV0gPT09IDEpIHtcbiAgICAgICAgICAgIGlmIChwZW5kaW5nW25hbWVdID09PSB1bmRlZmluZWQpIHBlbmRpbmdbbmFtZV0gPSB0cnVlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBfdGhpczIuc3RhdGVbbmFtZV0gPSAxO1xuICAgICAgICAgICAgaGFzQWxsTmFtZXNwYWNlcyA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKHBlbmRpbmdbbmFtZV0gPT09IHVuZGVmaW5lZCkgcGVuZGluZ1tuYW1lXSA9IHRydWU7XG4gICAgICAgICAgICBpZiAodG9Mb2FkW25hbWVdID09PSB1bmRlZmluZWQpIHRvTG9hZFtuYW1lXSA9IHRydWU7XG4gICAgICAgICAgICBpZiAodG9Mb2FkTmFtZXNwYWNlc1tuc10gPT09IHVuZGVmaW5lZCkgdG9Mb2FkTmFtZXNwYWNlc1tuc10gPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghaGFzQWxsTmFtZXNwYWNlcykgdG9Mb2FkTGFuZ3VhZ2VzW2xuZ10gPSB0cnVlO1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChPYmplY3Qua2V5cyh0b0xvYWQpLmxlbmd0aCB8fCBPYmplY3Qua2V5cyhwZW5kaW5nKS5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5xdWV1ZS5wdXNoKHtcbiAgICAgICAgICBwZW5kaW5nOiBwZW5kaW5nLFxuICAgICAgICAgIHBlbmRpbmdDb3VudDogT2JqZWN0LmtleXMocGVuZGluZykubGVuZ3RoLFxuICAgICAgICAgIGxvYWRlZDoge30sXG4gICAgICAgICAgZXJyb3JzOiBbXSxcbiAgICAgICAgICBjYWxsYmFjazogY2FsbGJhY2tcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRvTG9hZDogT2JqZWN0LmtleXModG9Mb2FkKSxcbiAgICAgICAgcGVuZGluZzogT2JqZWN0LmtleXMocGVuZGluZyksXG4gICAgICAgIHRvTG9hZExhbmd1YWdlczogT2JqZWN0LmtleXModG9Mb2FkTGFuZ3VhZ2VzKSxcbiAgICAgICAgdG9Mb2FkTmFtZXNwYWNlczogT2JqZWN0LmtleXModG9Mb2FkTmFtZXNwYWNlcylcbiAgICAgIH07XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImxvYWRlZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBsb2FkZWQobmFtZSwgZXJyLCBkYXRhKSB7XG4gICAgICB2YXIgcyA9IG5hbWUuc3BsaXQoJ3wnKTtcbiAgICAgIHZhciBsbmcgPSBzWzBdO1xuICAgICAgdmFyIG5zID0gc1sxXTtcbiAgICAgIGlmIChlcnIpIHRoaXMuZW1pdCgnZmFpbGVkTG9hZGluZycsIGxuZywgbnMsIGVycik7XG5cbiAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgIHRoaXMuc3RvcmUuYWRkUmVzb3VyY2VCdW5kbGUobG5nLCBucywgZGF0YSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc3RhdGVbbmFtZV0gPSBlcnIgPyAtMSA6IDI7XG4gICAgICB2YXIgbG9hZGVkID0ge307XG4gICAgICB0aGlzLnF1ZXVlLmZvckVhY2goZnVuY3Rpb24gKHEpIHtcbiAgICAgICAgcHVzaFBhdGgocS5sb2FkZWQsIFtsbmddLCBucyk7XG4gICAgICAgIHJlbW92ZVBlbmRpbmcocSwgbmFtZSk7XG4gICAgICAgIGlmIChlcnIpIHEuZXJyb3JzLnB1c2goZXJyKTtcblxuICAgICAgICBpZiAocS5wZW5kaW5nQ291bnQgPT09IDAgJiYgIXEuZG9uZSkge1xuICAgICAgICAgIE9iamVjdC5rZXlzKHEubG9hZGVkKS5mb3JFYWNoKGZ1bmN0aW9uIChsKSB7XG4gICAgICAgICAgICBpZiAoIWxvYWRlZFtsXSkgbG9hZGVkW2xdID0ge307XG4gICAgICAgICAgICB2YXIgbG9hZGVkS2V5cyA9IHEubG9hZGVkW2xdO1xuXG4gICAgICAgICAgICBpZiAobG9hZGVkS2V5cy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgbG9hZGVkS2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChucykge1xuICAgICAgICAgICAgICAgIGlmIChsb2FkZWRbbF1bbnNdID09PSB1bmRlZmluZWQpIGxvYWRlZFtsXVtuc10gPSB0cnVlO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBxLmRvbmUgPSB0cnVlO1xuXG4gICAgICAgICAgaWYgKHEuZXJyb3JzLmxlbmd0aCkge1xuICAgICAgICAgICAgcS5jYWxsYmFjayhxLmVycm9ycyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHEuY2FsbGJhY2soKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgdGhpcy5lbWl0KCdsb2FkZWQnLCBsb2FkZWQpO1xuICAgICAgdGhpcy5xdWV1ZSA9IHRoaXMucXVldWUuZmlsdGVyKGZ1bmN0aW9uIChxKSB7XG4gICAgICAgIHJldHVybiAhcS5kb25lO1xuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlYWRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVhZChsbmcsIG5zLCBmY05hbWUpIHtcbiAgICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gICAgICB2YXIgdHJpZWQgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IDA7XG4gICAgICB2YXIgd2FpdCA9IGFyZ3VtZW50cy5sZW5ndGggPiA0ICYmIGFyZ3VtZW50c1s0XSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzRdIDogdGhpcy5yZXRyeVRpbWVvdXQ7XG4gICAgICB2YXIgY2FsbGJhY2sgPSBhcmd1bWVudHMubGVuZ3RoID4gNSA/IGFyZ3VtZW50c1s1XSA6IHVuZGVmaW5lZDtcbiAgICAgIGlmICghbG5nLmxlbmd0aCkgcmV0dXJuIGNhbGxiYWNrKG51bGwsIHt9KTtcblxuICAgICAgaWYgKHRoaXMucmVhZGluZ0NhbGxzID49IHRoaXMubWF4UGFyYWxsZWxSZWFkcykge1xuICAgICAgICB0aGlzLndhaXRpbmdSZWFkcy5wdXNoKHtcbiAgICAgICAgICBsbmc6IGxuZyxcbiAgICAgICAgICBuczogbnMsXG4gICAgICAgICAgZmNOYW1lOiBmY05hbWUsXG4gICAgICAgICAgdHJpZWQ6IHRyaWVkLFxuICAgICAgICAgIHdhaXQ6IHdhaXQsXG4gICAgICAgICAgY2FsbGJhY2s6IGNhbGxiYWNrXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMucmVhZGluZ0NhbGxzKys7XG4gICAgICByZXR1cm4gdGhpcy5iYWNrZW5kW2ZjTmFtZV0obG5nLCBucywgZnVuY3Rpb24gKGVyciwgZGF0YSkge1xuICAgICAgICBfdGhpczMucmVhZGluZ0NhbGxzLS07XG5cbiAgICAgICAgaWYgKF90aGlzMy53YWl0aW5nUmVhZHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHZhciBuZXh0ID0gX3RoaXMzLndhaXRpbmdSZWFkcy5zaGlmdCgpO1xuXG4gICAgICAgICAgX3RoaXMzLnJlYWQobmV4dC5sbmcsIG5leHQubnMsIG5leHQuZmNOYW1lLCBuZXh0LnRyaWVkLCBuZXh0LndhaXQsIG5leHQuY2FsbGJhY2spO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVyciAmJiBkYXRhICYmIHRyaWVkIDwgX3RoaXMzLm1heFJldHJpZXMpIHtcbiAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIF90aGlzMy5yZWFkLmNhbGwoX3RoaXMzLCBsbmcsIG5zLCBmY05hbWUsIHRyaWVkICsgMSwgd2FpdCAqIDIsIGNhbGxiYWNrKTtcbiAgICAgICAgICB9LCB3YWl0KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjYWxsYmFjayhlcnIsIGRhdGEpO1xuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInByZXBhcmVMb2FkaW5nXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHByZXBhcmVMb2FkaW5nKGxhbmd1YWdlcywgbmFtZXNwYWNlcykge1xuICAgICAgdmFyIF90aGlzNCA9IHRoaXM7XG5cbiAgICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB7fTtcbiAgICAgIHZhciBjYWxsYmFjayA9IGFyZ3VtZW50cy5sZW5ndGggPiAzID8gYXJndW1lbnRzWzNdIDogdW5kZWZpbmVkO1xuXG4gICAgICBpZiAoIXRoaXMuYmFja2VuZCkge1xuICAgICAgICB0aGlzLmxvZ2dlci53YXJuKCdObyBiYWNrZW5kIHdhcyBhZGRlZCB2aWEgaTE4bmV4dC51c2UuIFdpbGwgbm90IGxvYWQgcmVzb3VyY2VzLicpO1xuICAgICAgICByZXR1cm4gY2FsbGJhY2sgJiYgY2FsbGJhY2soKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBsYW5ndWFnZXMgPT09ICdzdHJpbmcnKSBsYW5ndWFnZXMgPSB0aGlzLmxhbmd1YWdlVXRpbHMudG9SZXNvbHZlSGllcmFyY2h5KGxhbmd1YWdlcyk7XG4gICAgICBpZiAodHlwZW9mIG5hbWVzcGFjZXMgPT09ICdzdHJpbmcnKSBuYW1lc3BhY2VzID0gW25hbWVzcGFjZXNdO1xuICAgICAgdmFyIHRvTG9hZCA9IHRoaXMucXVldWVMb2FkKGxhbmd1YWdlcywgbmFtZXNwYWNlcywgb3B0aW9ucywgY2FsbGJhY2spO1xuXG4gICAgICBpZiAoIXRvTG9hZC50b0xvYWQubGVuZ3RoKSB7XG4gICAgICAgIGlmICghdG9Mb2FkLnBlbmRpbmcubGVuZ3RoKSBjYWxsYmFjaygpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgdG9Mb2FkLnRvTG9hZC5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIF90aGlzNC5sb2FkT25lKG5hbWUpO1xuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImxvYWRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbG9hZChsYW5ndWFnZXMsIG5hbWVzcGFjZXMsIGNhbGxiYWNrKSB7XG4gICAgICB0aGlzLnByZXBhcmVMb2FkaW5nKGxhbmd1YWdlcywgbmFtZXNwYWNlcywge30sIGNhbGxiYWNrKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVsb2FkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbG9hZChsYW5ndWFnZXMsIG5hbWVzcGFjZXMsIGNhbGxiYWNrKSB7XG4gICAgICB0aGlzLnByZXBhcmVMb2FkaW5nKGxhbmd1YWdlcywgbmFtZXNwYWNlcywge1xuICAgICAgICByZWxvYWQ6IHRydWVcbiAgICAgIH0sIGNhbGxiYWNrKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwibG9hZE9uZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBsb2FkT25lKG5hbWUpIHtcbiAgICAgIHZhciBfdGhpczUgPSB0aGlzO1xuXG4gICAgICB2YXIgcHJlZml4ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiAnJztcbiAgICAgIHZhciBzID0gbmFtZS5zcGxpdCgnfCcpO1xuICAgICAgdmFyIGxuZyA9IHNbMF07XG4gICAgICB2YXIgbnMgPSBzWzFdO1xuICAgICAgdGhpcy5yZWFkKGxuZywgbnMsICdyZWFkJywgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGZ1bmN0aW9uIChlcnIsIGRhdGEpIHtcbiAgICAgICAgaWYgKGVycikgX3RoaXM1LmxvZ2dlci53YXJuKFwiXCIuY29uY2F0KHByZWZpeCwgXCJsb2FkaW5nIG5hbWVzcGFjZSBcIikuY29uY2F0KG5zLCBcIiBmb3IgbGFuZ3VhZ2UgXCIpLmNvbmNhdChsbmcsIFwiIGZhaWxlZFwiKSwgZXJyKTtcbiAgICAgICAgaWYgKCFlcnIgJiYgZGF0YSkgX3RoaXM1LmxvZ2dlci5sb2coXCJcIi5jb25jYXQocHJlZml4LCBcImxvYWRlZCBuYW1lc3BhY2UgXCIpLmNvbmNhdChucywgXCIgZm9yIGxhbmd1YWdlIFwiKS5jb25jYXQobG5nKSwgZGF0YSk7XG5cbiAgICAgICAgX3RoaXM1LmxvYWRlZChuYW1lLCBlcnIsIGRhdGEpO1xuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNhdmVNaXNzaW5nXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNhdmVNaXNzaW5nKGxhbmd1YWdlcywgbmFtZXNwYWNlLCBrZXksIGZhbGxiYWNrVmFsdWUsIGlzVXBkYXRlKSB7XG4gICAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiA1ICYmIGFyZ3VtZW50c1s1XSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzVdIDoge307XG5cbiAgICAgIGlmICh0aGlzLnNlcnZpY2VzLnV0aWxzICYmIHRoaXMuc2VydmljZXMudXRpbHMuaGFzTG9hZGVkTmFtZXNwYWNlICYmICF0aGlzLnNlcnZpY2VzLnV0aWxzLmhhc0xvYWRlZE5hbWVzcGFjZShuYW1lc3BhY2UpKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXCJkaWQgbm90IHNhdmUga2V5IFxcXCJcIi5jb25jYXQoa2V5LCBcIlxcXCIgYXMgdGhlIG5hbWVzcGFjZSBcXFwiXCIpLmNvbmNhdChuYW1lc3BhY2UsIFwiXFxcIiB3YXMgbm90IHlldCBsb2FkZWRcIiksICdUaGlzIG1lYW5zIHNvbWV0aGluZyBJUyBXUk9ORyBpbiB5b3VyIHNldHVwLiBZb3UgYWNjZXNzIHRoZSB0IGZ1bmN0aW9uIGJlZm9yZSBpMThuZXh0LmluaXQgLyBpMThuZXh0LmxvYWROYW1lc3BhY2UgLyBpMThuZXh0LmNoYW5nZUxhbmd1YWdlIHdhcyBkb25lLiBXYWl0IGZvciB0aGUgY2FsbGJhY2sgb3IgUHJvbWlzZSB0byByZXNvbHZlIGJlZm9yZSBhY2Nlc3NpbmcgaXQhISEnKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoa2V5ID09PSB1bmRlZmluZWQgfHwga2V5ID09PSBudWxsIHx8IGtleSA9PT0gJycpIHJldHVybjtcblxuICAgICAgaWYgKHRoaXMuYmFja2VuZCAmJiB0aGlzLmJhY2tlbmQuY3JlYXRlKSB7XG4gICAgICAgIHRoaXMuYmFja2VuZC5jcmVhdGUobGFuZ3VhZ2VzLCBuYW1lc3BhY2UsIGtleSwgZmFsbGJhY2tWYWx1ZSwgbnVsbCwgX29iamVjdFNwcmVhZCQ1KF9vYmplY3RTcHJlYWQkNSh7fSwgb3B0aW9ucyksIHt9LCB7XG4gICAgICAgICAgaXNVcGRhdGU6IGlzVXBkYXRlXG4gICAgICAgIH0pKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFsYW5ndWFnZXMgfHwgIWxhbmd1YWdlc1swXSkgcmV0dXJuO1xuICAgICAgdGhpcy5zdG9yZS5hZGRSZXNvdXJjZShsYW5ndWFnZXNbMF0sIG5hbWVzcGFjZSwga2V5LCBmYWxsYmFja1ZhbHVlKTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gQ29ubmVjdG9yO1xufShFdmVudEVtaXR0ZXIpO1xuXG5mdW5jdGlvbiBnZXQoKSB7XG4gIHJldHVybiB7XG4gICAgZGVidWc6IGZhbHNlLFxuICAgIGluaXRJbW1lZGlhdGU6IHRydWUsXG4gICAgbnM6IFsndHJhbnNsYXRpb24nXSxcbiAgICBkZWZhdWx0TlM6IFsndHJhbnNsYXRpb24nXSxcbiAgICBmYWxsYmFja0xuZzogWydkZXYnXSxcbiAgICBmYWxsYmFja05TOiBmYWxzZSxcbiAgICBzdXBwb3J0ZWRMbmdzOiBmYWxzZSxcbiAgICBub25FeHBsaWNpdFN1cHBvcnRlZExuZ3M6IGZhbHNlLFxuICAgIGxvYWQ6ICdhbGwnLFxuICAgIHByZWxvYWQ6IGZhbHNlLFxuICAgIHNpbXBsaWZ5UGx1cmFsU3VmZml4OiB0cnVlLFxuICAgIGtleVNlcGFyYXRvcjogJy4nLFxuICAgIG5zU2VwYXJhdG9yOiAnOicsXG4gICAgcGx1cmFsU2VwYXJhdG9yOiAnXycsXG4gICAgY29udGV4dFNlcGFyYXRvcjogJ18nLFxuICAgIHBhcnRpYWxCdW5kbGVkTGFuZ3VhZ2VzOiBmYWxzZSxcbiAgICBzYXZlTWlzc2luZzogZmFsc2UsXG4gICAgdXBkYXRlTWlzc2luZzogZmFsc2UsXG4gICAgc2F2ZU1pc3NpbmdUbzogJ2ZhbGxiYWNrJyxcbiAgICBzYXZlTWlzc2luZ1BsdXJhbHM6IHRydWUsXG4gICAgbWlzc2luZ0tleUhhbmRsZXI6IGZhbHNlLFxuICAgIG1pc3NpbmdJbnRlcnBvbGF0aW9uSGFuZGxlcjogZmFsc2UsXG4gICAgcG9zdFByb2Nlc3M6IGZhbHNlLFxuICAgIHBvc3RQcm9jZXNzUGFzc1Jlc29sdmVkOiBmYWxzZSxcbiAgICByZXR1cm5OdWxsOiB0cnVlLFxuICAgIHJldHVybkVtcHR5U3RyaW5nOiB0cnVlLFxuICAgIHJldHVybk9iamVjdHM6IGZhbHNlLFxuICAgIGpvaW5BcnJheXM6IGZhbHNlLFxuICAgIHJldHVybmVkT2JqZWN0SGFuZGxlcjogZmFsc2UsXG4gICAgcGFyc2VNaXNzaW5nS2V5SGFuZGxlcjogZmFsc2UsXG4gICAgYXBwZW5kTmFtZXNwYWNlVG9NaXNzaW5nS2V5OiBmYWxzZSxcbiAgICBhcHBlbmROYW1lc3BhY2VUb0NJTW9kZTogZmFsc2UsXG4gICAgb3ZlcmxvYWRUcmFuc2xhdGlvbk9wdGlvbkhhbmRsZXI6IGZ1bmN0aW9uIGhhbmRsZShhcmdzKSB7XG4gICAgICB2YXIgcmV0ID0ge307XG4gICAgICBpZiAoX3R5cGVvZihhcmdzWzFdKSA9PT0gJ29iamVjdCcpIHJldCA9IGFyZ3NbMV07XG4gICAgICBpZiAodHlwZW9mIGFyZ3NbMV0gPT09ICdzdHJpbmcnKSByZXQuZGVmYXVsdFZhbHVlID0gYXJnc1sxXTtcbiAgICAgIGlmICh0eXBlb2YgYXJnc1syXSA9PT0gJ3N0cmluZycpIHJldC50RGVzY3JpcHRpb24gPSBhcmdzWzJdO1xuXG4gICAgICBpZiAoX3R5cGVvZihhcmdzWzJdKSA9PT0gJ29iamVjdCcgfHwgX3R5cGVvZihhcmdzWzNdKSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgdmFyIG9wdGlvbnMgPSBhcmdzWzNdIHx8IGFyZ3NbMl07XG4gICAgICAgIE9iamVjdC5rZXlzKG9wdGlvbnMpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgIHJldFtrZXldID0gb3B0aW9uc1trZXldO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJldDtcbiAgICB9LFxuICAgIGludGVycG9sYXRpb246IHtcbiAgICAgIGVzY2FwZVZhbHVlOiB0cnVlLFxuICAgICAgZm9ybWF0OiBmdW5jdGlvbiBmb3JtYXQodmFsdWUsIF9mb3JtYXQsIGxuZywgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9LFxuICAgICAgcHJlZml4OiAne3snLFxuICAgICAgc3VmZml4OiAnfX0nLFxuICAgICAgZm9ybWF0U2VwYXJhdG9yOiAnLCcsXG4gICAgICB1bmVzY2FwZVByZWZpeDogJy0nLFxuICAgICAgbmVzdGluZ1ByZWZpeDogJyR0KCcsXG4gICAgICBuZXN0aW5nU3VmZml4OiAnKScsXG4gICAgICBuZXN0aW5nT3B0aW9uc1NlcGFyYXRvcjogJywnLFxuICAgICAgbWF4UmVwbGFjZXM6IDEwMDAsXG4gICAgICBza2lwT25WYXJpYWJsZXM6IHRydWVcbiAgICB9XG4gIH07XG59XG5mdW5jdGlvbiB0cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnMpIHtcbiAgaWYgKHR5cGVvZiBvcHRpb25zLm5zID09PSAnc3RyaW5nJykgb3B0aW9ucy5ucyA9IFtvcHRpb25zLm5zXTtcbiAgaWYgKHR5cGVvZiBvcHRpb25zLmZhbGxiYWNrTG5nID09PSAnc3RyaW5nJykgb3B0aW9ucy5mYWxsYmFja0xuZyA9IFtvcHRpb25zLmZhbGxiYWNrTG5nXTtcbiAgaWYgKHR5cGVvZiBvcHRpb25zLmZhbGxiYWNrTlMgPT09ICdzdHJpbmcnKSBvcHRpb25zLmZhbGxiYWNrTlMgPSBbb3B0aW9ucy5mYWxsYmFja05TXTtcblxuICBpZiAob3B0aW9ucy5zdXBwb3J0ZWRMbmdzICYmIG9wdGlvbnMuc3VwcG9ydGVkTG5ncy5pbmRleE9mKCdjaW1vZGUnKSA8IDApIHtcbiAgICBvcHRpb25zLnN1cHBvcnRlZExuZ3MgPSBvcHRpb25zLnN1cHBvcnRlZExuZ3MuY29uY2F0KFsnY2ltb2RlJ10pO1xuICB9XG5cbiAgcmV0dXJuIG9wdGlvbnM7XG59XG5cbmZ1bmN0aW9uIG93bktleXMkNihvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7IHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7IGlmIChlbnVtZXJhYmxlT25seSkgeyBzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTsgfSk7IH0ga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpOyB9IHJldHVybiBrZXlzOyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQkNih0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXSAhPSBudWxsID8gYXJndW1lbnRzW2ldIDoge307IGlmIChpICUgMikgeyBvd25LZXlzJDYoT2JqZWN0KHNvdXJjZSksIHRydWUpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsgfSk7IH0gZWxzZSBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMpIHsgT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKTsgfSBlbHNlIHsgb3duS2V5cyQ2KE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7IH0pOyB9IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfY3JlYXRlU3VwZXIkMyhEZXJpdmVkKSB7IHZhciBoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0ID0gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCQzKCk7IHJldHVybiBmdW5jdGlvbiBfY3JlYXRlU3VwZXJJbnRlcm5hbCgpIHsgdmFyIFN1cGVyID0gX2dldFByb3RvdHlwZU9mKERlcml2ZWQpLCByZXN1bHQ7IGlmIChoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KSB7IHZhciBOZXdUYXJnZXQgPSBfZ2V0UHJvdG90eXBlT2YodGhpcykuY29uc3RydWN0b3I7IHJlc3VsdCA9IFJlZmxlY3QuY29uc3RydWN0KFN1cGVyLCBhcmd1bWVudHMsIE5ld1RhcmdldCk7IH0gZWxzZSB7IHJlc3VsdCA9IFN1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH0gcmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIHJlc3VsdCk7IH07IH1cblxuZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCQzKCkgeyBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwidW5kZWZpbmVkXCIgfHwgIVJlZmxlY3QuY29uc3RydWN0KSByZXR1cm4gZmFsc2U7IGlmIChSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKSByZXR1cm4gZmFsc2U7IGlmICh0eXBlb2YgUHJveHkgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIHRydWU7IHRyeSB7IEJvb2xlYW4ucHJvdG90eXBlLnZhbHVlT2YuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChCb29sZWFuLCBbXSwgZnVuY3Rpb24gKCkge30pKTsgcmV0dXJuIHRydWU7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIGZhbHNlOyB9IH1cblxuZnVuY3Rpb24gbm9vcCgpIHt9XG5cbmZ1bmN0aW9uIGJpbmRNZW1iZXJGdW5jdGlvbnMoaW5zdCkge1xuICB2YXIgbWVtcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKE9iamVjdC5nZXRQcm90b3R5cGVPZihpbnN0KSk7XG4gIG1lbXMuZm9yRWFjaChmdW5jdGlvbiAobWVtKSB7XG4gICAgaWYgKHR5cGVvZiBpbnN0W21lbV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluc3RbbWVtXSA9IGluc3RbbWVtXS5iaW5kKGluc3QpO1xuICAgIH1cbiAgfSk7XG59XG5cbnZhciBJMThuID0gZnVuY3Rpb24gKF9FdmVudEVtaXR0ZXIpIHtcbiAgX2luaGVyaXRzKEkxOG4sIF9FdmVudEVtaXR0ZXIpO1xuXG4gIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIkMyhJMThuKTtcblxuICBmdW5jdGlvbiBJMThuKCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcbiAgICB2YXIgY2FsbGJhY2sgPSBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZDtcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBJMThuKTtcblxuICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcyk7XG5cbiAgICBpZiAoaXNJRTEwKSB7XG4gICAgICBFdmVudEVtaXR0ZXIuY2FsbChfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSk7XG4gICAgfVxuXG4gICAgX3RoaXMub3B0aW9ucyA9IHRyYW5zZm9ybU9wdGlvbnMob3B0aW9ucyk7XG4gICAgX3RoaXMuc2VydmljZXMgPSB7fTtcbiAgICBfdGhpcy5sb2dnZXIgPSBiYXNlTG9nZ2VyO1xuICAgIF90aGlzLm1vZHVsZXMgPSB7XG4gICAgICBleHRlcm5hbDogW11cbiAgICB9O1xuICAgIGJpbmRNZW1iZXJGdW5jdGlvbnMoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcykpO1xuXG4gICAgaWYgKGNhbGxiYWNrICYmICFfdGhpcy5pc0luaXRpYWxpemVkICYmICFvcHRpb25zLmlzQ2xvbmUpIHtcbiAgICAgIGlmICghX3RoaXMub3B0aW9ucy5pbml0SW1tZWRpYXRlKSB7XG4gICAgICAgIF90aGlzLmluaXQob3B0aW9ucywgY2FsbGJhY2spO1xuXG4gICAgICAgIHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihfdGhpcywgX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcykpO1xuICAgICAgfVxuXG4gICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgX3RoaXMuaW5pdChvcHRpb25zLCBjYWxsYmFjayk7XG4gICAgICB9LCAwKTtcbiAgICB9XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoSTE4biwgW3tcbiAgICBrZXk6IFwiaW5pdFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpbml0KCkge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcbiAgICAgIHZhciBjYWxsYmFjayA9IGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkO1xuXG4gICAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgY2FsbGJhY2sgPSBvcHRpb25zO1xuICAgICAgICBvcHRpb25zID0ge307XG4gICAgICB9XG5cbiAgICAgIGlmICghb3B0aW9ucy5kZWZhdWx0TlMgJiYgb3B0aW9ucy5kZWZhdWx0TlMgIT09IGZhbHNlICYmIG9wdGlvbnMubnMpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLm5zID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIG9wdGlvbnMuZGVmYXVsdE5TID0gb3B0aW9ucy5ucztcbiAgICAgICAgfSBlbHNlIGlmIChvcHRpb25zLm5zLmluZGV4T2YoJ3RyYW5zbGF0aW9uJykgPCAwKSB7XG4gICAgICAgICAgb3B0aW9ucy5kZWZhdWx0TlMgPSBvcHRpb25zLm5zWzBdO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHZhciBkZWZPcHRzID0gZ2V0KCk7XG4gICAgICB0aGlzLm9wdGlvbnMgPSBfb2JqZWN0U3ByZWFkJDYoX29iamVjdFNwcmVhZCQ2KF9vYmplY3RTcHJlYWQkNih7fSwgZGVmT3B0cyksIHRoaXMub3B0aW9ucyksIHRyYW5zZm9ybU9wdGlvbnMob3B0aW9ucykpO1xuXG4gICAgICBpZiAodGhpcy5vcHRpb25zLmNvbXBhdGliaWxpdHlBUEkgIT09ICd2MScpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLmludGVycG9sYXRpb24gPSBfb2JqZWN0U3ByZWFkJDYoX29iamVjdFNwcmVhZCQ2KHt9LCBkZWZPcHRzLmludGVycG9sYXRpb24pLCB0aGlzLm9wdGlvbnMuaW50ZXJwb2xhdGlvbik7XG4gICAgICB9XG5cbiAgICAgIGlmIChvcHRpb25zLmtleVNlcGFyYXRvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy51c2VyRGVmaW5lZEtleVNlcGFyYXRvciA9IG9wdGlvbnMua2V5U2VwYXJhdG9yO1xuICAgICAgfVxuXG4gICAgICBpZiAob3B0aW9ucy5uc1NlcGFyYXRvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy51c2VyRGVmaW5lZE5zU2VwYXJhdG9yID0gb3B0aW9ucy5uc1NlcGFyYXRvcjtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gY3JlYXRlQ2xhc3NPbkRlbWFuZChDbGFzc09yT2JqZWN0KSB7XG4gICAgICAgIGlmICghQ2xhc3NPck9iamVjdCkgcmV0dXJuIG51bGw7XG4gICAgICAgIGlmICh0eXBlb2YgQ2xhc3NPck9iamVjdCA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIG5ldyBDbGFzc09yT2JqZWN0KCk7XG4gICAgICAgIHJldHVybiBDbGFzc09yT2JqZWN0O1xuICAgICAgfVxuXG4gICAgICBpZiAoIXRoaXMub3B0aW9ucy5pc0Nsb25lKSB7XG4gICAgICAgIGlmICh0aGlzLm1vZHVsZXMubG9nZ2VyKSB7XG4gICAgICAgICAgYmFzZUxvZ2dlci5pbml0KGNyZWF0ZUNsYXNzT25EZW1hbmQodGhpcy5tb2R1bGVzLmxvZ2dlciksIHRoaXMub3B0aW9ucyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYmFzZUxvZ2dlci5pbml0KG51bGwsIHRoaXMub3B0aW9ucyk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZm9ybWF0dGVyO1xuXG4gICAgICAgIGlmICh0aGlzLm1vZHVsZXMuZm9ybWF0dGVyKSB7XG4gICAgICAgICAgZm9ybWF0dGVyID0gdGhpcy5tb2R1bGVzLmZvcm1hdHRlcjtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgSW50bCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICBmb3JtYXR0ZXIgPSBGb3JtYXR0ZXI7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgbHUgPSBuZXcgTGFuZ3VhZ2VVdGlsKHRoaXMub3B0aW9ucyk7XG4gICAgICAgIHRoaXMuc3RvcmUgPSBuZXcgUmVzb3VyY2VTdG9yZSh0aGlzLm9wdGlvbnMucmVzb3VyY2VzLCB0aGlzLm9wdGlvbnMpO1xuICAgICAgICB2YXIgcyA9IHRoaXMuc2VydmljZXM7XG4gICAgICAgIHMubG9nZ2VyID0gYmFzZUxvZ2dlcjtcbiAgICAgICAgcy5yZXNvdXJjZVN0b3JlID0gdGhpcy5zdG9yZTtcbiAgICAgICAgcy5sYW5ndWFnZVV0aWxzID0gbHU7XG4gICAgICAgIHMucGx1cmFsUmVzb2x2ZXIgPSBuZXcgUGx1cmFsUmVzb2x2ZXIobHUsIHtcbiAgICAgICAgICBwcmVwZW5kOiB0aGlzLm9wdGlvbnMucGx1cmFsU2VwYXJhdG9yLFxuICAgICAgICAgIGNvbXBhdGliaWxpdHlKU09OOiB0aGlzLm9wdGlvbnMuY29tcGF0aWJpbGl0eUpTT04sXG4gICAgICAgICAgc2ltcGxpZnlQbHVyYWxTdWZmaXg6IHRoaXMub3B0aW9ucy5zaW1wbGlmeVBsdXJhbFN1ZmZpeFxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoZm9ybWF0dGVyICYmICghdGhpcy5vcHRpb25zLmludGVycG9sYXRpb24uZm9ybWF0IHx8IHRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmZvcm1hdCA9PT0gZGVmT3B0cy5pbnRlcnBvbGF0aW9uLmZvcm1hdCkpIHtcbiAgICAgICAgICBzLmZvcm1hdHRlciA9IGNyZWF0ZUNsYXNzT25EZW1hbmQoZm9ybWF0dGVyKTtcbiAgICAgICAgICBzLmZvcm1hdHRlci5pbml0KHMsIHRoaXMub3B0aW9ucyk7XG4gICAgICAgICAgdGhpcy5vcHRpb25zLmludGVycG9sYXRpb24uZm9ybWF0ID0gcy5mb3JtYXR0ZXIuZm9ybWF0LmJpbmQocy5mb3JtYXR0ZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgcy5pbnRlcnBvbGF0b3IgPSBuZXcgSW50ZXJwb2xhdG9yKHRoaXMub3B0aW9ucyk7XG4gICAgICAgIHMudXRpbHMgPSB7XG4gICAgICAgICAgaGFzTG9hZGVkTmFtZXNwYWNlOiB0aGlzLmhhc0xvYWRlZE5hbWVzcGFjZS5iaW5kKHRoaXMpXG4gICAgICAgIH07XG4gICAgICAgIHMuYmFja2VuZENvbm5lY3RvciA9IG5ldyBDb25uZWN0b3IoY3JlYXRlQ2xhc3NPbkRlbWFuZCh0aGlzLm1vZHVsZXMuYmFja2VuZCksIHMucmVzb3VyY2VTdG9yZSwgcywgdGhpcy5vcHRpb25zKTtcbiAgICAgICAgcy5iYWNrZW5kQ29ubmVjdG9yLm9uKCcqJywgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiA+IDEgPyBfbGVuIC0gMSA6IDApLCBfa2V5ID0gMTsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgICAgICAgYXJnc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgX3RoaXMyLmVtaXQuYXBwbHkoX3RoaXMyLCBbZXZlbnRdLmNvbmNhdChhcmdzKSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICh0aGlzLm1vZHVsZXMubGFuZ3VhZ2VEZXRlY3Rvcikge1xuICAgICAgICAgIHMubGFuZ3VhZ2VEZXRlY3RvciA9IGNyZWF0ZUNsYXNzT25EZW1hbmQodGhpcy5tb2R1bGVzLmxhbmd1YWdlRGV0ZWN0b3IpO1xuICAgICAgICAgIHMubGFuZ3VhZ2VEZXRlY3Rvci5pbml0KHMsIHRoaXMub3B0aW9ucy5kZXRlY3Rpb24sIHRoaXMub3B0aW9ucyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5tb2R1bGVzLmkxOG5Gb3JtYXQpIHtcbiAgICAgICAgICBzLmkxOG5Gb3JtYXQgPSBjcmVhdGVDbGFzc09uRGVtYW5kKHRoaXMubW9kdWxlcy5pMThuRm9ybWF0KTtcbiAgICAgICAgICBpZiAocy5pMThuRm9ybWF0LmluaXQpIHMuaTE4bkZvcm1hdC5pbml0KHRoaXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy50cmFuc2xhdG9yID0gbmV3IFRyYW5zbGF0b3IodGhpcy5zZXJ2aWNlcywgdGhpcy5vcHRpb25zKTtcbiAgICAgICAgdGhpcy50cmFuc2xhdG9yLm9uKCcqJywgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4yID4gMSA/IF9sZW4yIC0gMSA6IDApLCBfa2V5MiA9IDE7IF9rZXkyIDwgX2xlbjI7IF9rZXkyKyspIHtcbiAgICAgICAgICAgIGFyZ3NbX2tleTIgLSAxXSA9IGFyZ3VtZW50c1tfa2V5Ml07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgX3RoaXMyLmVtaXQuYXBwbHkoX3RoaXMyLCBbZXZlbnRdLmNvbmNhdChhcmdzKSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLm1vZHVsZXMuZXh0ZXJuYWwuZm9yRWFjaChmdW5jdGlvbiAobSkge1xuICAgICAgICAgIGlmIChtLmluaXQpIG0uaW5pdChfdGhpczIpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5mb3JtYXQgPSB0aGlzLm9wdGlvbnMuaW50ZXJwb2xhdGlvbi5mb3JtYXQ7XG4gICAgICBpZiAoIWNhbGxiYWNrKSBjYWxsYmFjayA9IG5vb3A7XG5cbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuZmFsbGJhY2tMbmcgJiYgIXRoaXMuc2VydmljZXMubGFuZ3VhZ2VEZXRlY3RvciAmJiAhdGhpcy5vcHRpb25zLmxuZykge1xuICAgICAgICB2YXIgY29kZXMgPSB0aGlzLnNlcnZpY2VzLmxhbmd1YWdlVXRpbHMuZ2V0RmFsbGJhY2tDb2Rlcyh0aGlzLm9wdGlvbnMuZmFsbGJhY2tMbmcpO1xuICAgICAgICBpZiAoY29kZXMubGVuZ3RoID4gMCAmJiBjb2Rlc1swXSAhPT0gJ2RldicpIHRoaXMub3B0aW9ucy5sbmcgPSBjb2Rlc1swXTtcbiAgICAgIH1cblxuICAgICAgaWYgKCF0aGlzLnNlcnZpY2VzLmxhbmd1YWdlRGV0ZWN0b3IgJiYgIXRoaXMub3B0aW9ucy5sbmcpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIud2FybignaW5pdDogbm8gbGFuZ3VhZ2VEZXRlY3RvciBpcyB1c2VkIGFuZCBubyBsbmcgaXMgZGVmaW5lZCcpO1xuICAgICAgfVxuXG4gICAgICB2YXIgc3RvcmVBcGkgPSBbJ2dldFJlc291cmNlJywgJ2hhc1Jlc291cmNlQnVuZGxlJywgJ2dldFJlc291cmNlQnVuZGxlJywgJ2dldERhdGFCeUxhbmd1YWdlJ107XG4gICAgICBzdG9yZUFwaS5mb3JFYWNoKGZ1bmN0aW9uIChmY05hbWUpIHtcbiAgICAgICAgX3RoaXMyW2ZjTmFtZV0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdmFyIF90aGlzMiRzdG9yZTtcblxuICAgICAgICAgIHJldHVybiAoX3RoaXMyJHN0b3JlID0gX3RoaXMyLnN0b3JlKVtmY05hbWVdLmFwcGx5KF90aGlzMiRzdG9yZSwgYXJndW1lbnRzKTtcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgICAgdmFyIHN0b3JlQXBpQ2hhaW5lZCA9IFsnYWRkUmVzb3VyY2UnLCAnYWRkUmVzb3VyY2VzJywgJ2FkZFJlc291cmNlQnVuZGxlJywgJ3JlbW92ZVJlc291cmNlQnVuZGxlJ107XG4gICAgICBzdG9yZUFwaUNoYWluZWQuZm9yRWFjaChmdW5jdGlvbiAoZmNOYW1lKSB7XG4gICAgICAgIF90aGlzMltmY05hbWVdID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHZhciBfdGhpczIkc3RvcmUyO1xuXG4gICAgICAgICAgKF90aGlzMiRzdG9yZTIgPSBfdGhpczIuc3RvcmUpW2ZjTmFtZV0uYXBwbHkoX3RoaXMyJHN0b3JlMiwgYXJndW1lbnRzKTtcblxuICAgICAgICAgIHJldHVybiBfdGhpczI7XG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICAgIHZhciBkZWZlcnJlZCA9IGRlZmVyKCk7XG5cbiAgICAgIHZhciBsb2FkID0gZnVuY3Rpb24gbG9hZCgpIHtcbiAgICAgICAgdmFyIGZpbmlzaCA9IGZ1bmN0aW9uIGZpbmlzaChlcnIsIHQpIHtcbiAgICAgICAgICBpZiAoX3RoaXMyLmlzSW5pdGlhbGl6ZWQgJiYgIV90aGlzMi5pbml0aWFsaXplZFN0b3JlT25jZSkgX3RoaXMyLmxvZ2dlci53YXJuKCdpbml0OiBpMThuZXh0IGlzIGFscmVhZHkgaW5pdGlhbGl6ZWQuIFlvdSBzaG91bGQgY2FsbCBpbml0IGp1c3Qgb25jZSEnKTtcbiAgICAgICAgICBfdGhpczIuaXNJbml0aWFsaXplZCA9IHRydWU7XG4gICAgICAgICAgaWYgKCFfdGhpczIub3B0aW9ucy5pc0Nsb25lKSBfdGhpczIubG9nZ2VyLmxvZygnaW5pdGlhbGl6ZWQnLCBfdGhpczIub3B0aW9ucyk7XG5cbiAgICAgICAgICBfdGhpczIuZW1pdCgnaW5pdGlhbGl6ZWQnLCBfdGhpczIub3B0aW9ucyk7XG5cbiAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKHQpO1xuICAgICAgICAgIGNhbGxiYWNrKGVyciwgdCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKF90aGlzMi5sYW5ndWFnZXMgJiYgX3RoaXMyLm9wdGlvbnMuY29tcGF0aWJpbGl0eUFQSSAhPT0gJ3YxJyAmJiAhX3RoaXMyLmlzSW5pdGlhbGl6ZWQpIHJldHVybiBmaW5pc2gobnVsbCwgX3RoaXMyLnQuYmluZChfdGhpczIpKTtcblxuICAgICAgICBfdGhpczIuY2hhbmdlTGFuZ3VhZ2UoX3RoaXMyLm9wdGlvbnMubG5nLCBmaW5pc2gpO1xuICAgICAgfTtcblxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5yZXNvdXJjZXMgfHwgIXRoaXMub3B0aW9ucy5pbml0SW1tZWRpYXRlKSB7XG4gICAgICAgIGxvYWQoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNldFRpbWVvdXQobG9hZCwgMCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBkZWZlcnJlZDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwibG9hZFJlc291cmNlc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBsb2FkUmVzb3VyY2VzKGxhbmd1YWdlKSB7XG4gICAgICB2YXIgX3RoaXMzID0gdGhpcztcblxuICAgICAgdmFyIGNhbGxiYWNrID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBub29wO1xuICAgICAgdmFyIHVzZWRDYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgICAgdmFyIHVzZWRMbmcgPSB0eXBlb2YgbGFuZ3VhZ2UgPT09ICdzdHJpbmcnID8gbGFuZ3VhZ2UgOiB0aGlzLmxhbmd1YWdlO1xuICAgICAgaWYgKHR5cGVvZiBsYW5ndWFnZSA9PT0gJ2Z1bmN0aW9uJykgdXNlZENhbGxiYWNrID0gbGFuZ3VhZ2U7XG5cbiAgICAgIGlmICghdGhpcy5vcHRpb25zLnJlc291cmNlcyB8fCB0aGlzLm9wdGlvbnMucGFydGlhbEJ1bmRsZWRMYW5ndWFnZXMpIHtcbiAgICAgICAgaWYgKHVzZWRMbmcgJiYgdXNlZExuZy50b0xvd2VyQ2FzZSgpID09PSAnY2ltb2RlJykgcmV0dXJuIHVzZWRDYWxsYmFjaygpO1xuICAgICAgICB2YXIgdG9Mb2FkID0gW107XG5cbiAgICAgICAgdmFyIGFwcGVuZCA9IGZ1bmN0aW9uIGFwcGVuZChsbmcpIHtcbiAgICAgICAgICBpZiAoIWxuZykgcmV0dXJuO1xuXG4gICAgICAgICAgdmFyIGxuZ3MgPSBfdGhpczMuc2VydmljZXMubGFuZ3VhZ2VVdGlscy50b1Jlc29sdmVIaWVyYXJjaHkobG5nKTtcblxuICAgICAgICAgIGxuZ3MuZm9yRWFjaChmdW5jdGlvbiAobCkge1xuICAgICAgICAgICAgaWYgKHRvTG9hZC5pbmRleE9mKGwpIDwgMCkgdG9Mb2FkLnB1c2gobCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKCF1c2VkTG5nKSB7XG4gICAgICAgICAgdmFyIGZhbGxiYWNrcyA9IHRoaXMuc2VydmljZXMubGFuZ3VhZ2VVdGlscy5nZXRGYWxsYmFja0NvZGVzKHRoaXMub3B0aW9ucy5mYWxsYmFja0xuZyk7XG4gICAgICAgICAgZmFsbGJhY2tzLmZvckVhY2goZnVuY3Rpb24gKGwpIHtcbiAgICAgICAgICAgIHJldHVybiBhcHBlbmQobCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYXBwZW5kKHVzZWRMbmcpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5wcmVsb2FkKSB7XG4gICAgICAgICAgdGhpcy5vcHRpb25zLnByZWxvYWQuZm9yRWFjaChmdW5jdGlvbiAobCkge1xuICAgICAgICAgICAgcmV0dXJuIGFwcGVuZChsKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2VydmljZXMuYmFja2VuZENvbm5lY3Rvci5sb2FkKHRvTG9hZCwgdGhpcy5vcHRpb25zLm5zLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgIGlmICghZSAmJiAhX3RoaXMzLnJlc29sdmVkTGFuZ3VhZ2UgJiYgX3RoaXMzLmxhbmd1YWdlKSBfdGhpczMuc2V0UmVzb2x2ZWRMYW5ndWFnZShfdGhpczMubGFuZ3VhZ2UpO1xuICAgICAgICAgIHVzZWRDYWxsYmFjayhlKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB1c2VkQ2FsbGJhY2sobnVsbCk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbG9hZFJlc291cmNlc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZWxvYWRSZXNvdXJjZXMobG5ncywgbnMsIGNhbGxiYWNrKSB7XG4gICAgICB2YXIgZGVmZXJyZWQgPSBkZWZlcigpO1xuICAgICAgaWYgKCFsbmdzKSBsbmdzID0gdGhpcy5sYW5ndWFnZXM7XG4gICAgICBpZiAoIW5zKSBucyA9IHRoaXMub3B0aW9ucy5ucztcbiAgICAgIGlmICghY2FsbGJhY2spIGNhbGxiYWNrID0gbm9vcDtcbiAgICAgIHRoaXMuc2VydmljZXMuYmFja2VuZENvbm5lY3Rvci5yZWxvYWQobG5ncywgbnMsIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgZGVmZXJyZWQucmVzb2x2ZSgpO1xuICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gZGVmZXJyZWQ7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInVzZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB1c2UobW9kdWxlKSB7XG4gICAgICBpZiAoIW1vZHVsZSkgdGhyb3cgbmV3IEVycm9yKCdZb3UgYXJlIHBhc3NpbmcgYW4gdW5kZWZpbmVkIG1vZHVsZSEgUGxlYXNlIGNoZWNrIHRoZSBvYmplY3QgeW91IGFyZSBwYXNzaW5nIHRvIGkxOG5leHQudXNlKCknKTtcbiAgICAgIGlmICghbW9kdWxlLnR5cGUpIHRocm93IG5ldyBFcnJvcignWW91IGFyZSBwYXNzaW5nIGEgd3JvbmcgbW9kdWxlISBQbGVhc2UgY2hlY2sgdGhlIG9iamVjdCB5b3UgYXJlIHBhc3NpbmcgdG8gaTE4bmV4dC51c2UoKScpO1xuXG4gICAgICBpZiAobW9kdWxlLnR5cGUgPT09ICdiYWNrZW5kJykge1xuICAgICAgICB0aGlzLm1vZHVsZXMuYmFja2VuZCA9IG1vZHVsZTtcbiAgICAgIH1cblxuICAgICAgaWYgKG1vZHVsZS50eXBlID09PSAnbG9nZ2VyJyB8fCBtb2R1bGUubG9nICYmIG1vZHVsZS53YXJuICYmIG1vZHVsZS5lcnJvcikge1xuICAgICAgICB0aGlzLm1vZHVsZXMubG9nZ2VyID0gbW9kdWxlO1xuICAgICAgfVxuXG4gICAgICBpZiAobW9kdWxlLnR5cGUgPT09ICdsYW5ndWFnZURldGVjdG9yJykge1xuICAgICAgICB0aGlzLm1vZHVsZXMubGFuZ3VhZ2VEZXRlY3RvciA9IG1vZHVsZTtcbiAgICAgIH1cblxuICAgICAgaWYgKG1vZHVsZS50eXBlID09PSAnaTE4bkZvcm1hdCcpIHtcbiAgICAgICAgdGhpcy5tb2R1bGVzLmkxOG5Gb3JtYXQgPSBtb2R1bGU7XG4gICAgICB9XG5cbiAgICAgIGlmIChtb2R1bGUudHlwZSA9PT0gJ3Bvc3RQcm9jZXNzb3InKSB7XG4gICAgICAgIHBvc3RQcm9jZXNzb3IuYWRkUG9zdFByb2Nlc3Nvcihtb2R1bGUpO1xuICAgICAgfVxuXG4gICAgICBpZiAobW9kdWxlLnR5cGUgPT09ICdmb3JtYXR0ZXInKSB7XG4gICAgICAgIHRoaXMubW9kdWxlcy5mb3JtYXR0ZXIgPSBtb2R1bGU7XG4gICAgICB9XG5cbiAgICAgIGlmIChtb2R1bGUudHlwZSA9PT0gJzNyZFBhcnR5Jykge1xuICAgICAgICB0aGlzLm1vZHVsZXMuZXh0ZXJuYWwucHVzaChtb2R1bGUpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2V0UmVzb2x2ZWRMYW5ndWFnZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRSZXNvbHZlZExhbmd1YWdlKGwpIHtcbiAgICAgIGlmICghbCB8fCAhdGhpcy5sYW5ndWFnZXMpIHJldHVybjtcbiAgICAgIGlmIChbJ2NpbW9kZScsICdkZXYnXS5pbmRleE9mKGwpID4gLTEpIHJldHVybjtcblxuICAgICAgZm9yICh2YXIgbGkgPSAwOyBsaSA8IHRoaXMubGFuZ3VhZ2VzLmxlbmd0aDsgbGkrKykge1xuICAgICAgICB2YXIgbG5nSW5MbmdzID0gdGhpcy5sYW5ndWFnZXNbbGldO1xuICAgICAgICBpZiAoWydjaW1vZGUnLCAnZGV2J10uaW5kZXhPZihsbmdJbkxuZ3MpID4gLTEpIGNvbnRpbnVlO1xuXG4gICAgICAgIGlmICh0aGlzLnN0b3JlLmhhc0xhbmd1YWdlU29tZVRyYW5zbGF0aW9ucyhsbmdJbkxuZ3MpKSB7XG4gICAgICAgICAgdGhpcy5yZXNvbHZlZExhbmd1YWdlID0gbG5nSW5MbmdzO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNoYW5nZUxhbmd1YWdlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNoYW5nZUxhbmd1YWdlKGxuZywgY2FsbGJhY2spIHtcbiAgICAgIHZhciBfdGhpczQgPSB0aGlzO1xuXG4gICAgICB0aGlzLmlzTGFuZ3VhZ2VDaGFuZ2luZ1RvID0gbG5nO1xuICAgICAgdmFyIGRlZmVycmVkID0gZGVmZXIoKTtcbiAgICAgIHRoaXMuZW1pdCgnbGFuZ3VhZ2VDaGFuZ2luZycsIGxuZyk7XG5cbiAgICAgIHZhciBzZXRMbmdQcm9wcyA9IGZ1bmN0aW9uIHNldExuZ1Byb3BzKGwpIHtcbiAgICAgICAgX3RoaXM0Lmxhbmd1YWdlID0gbDtcbiAgICAgICAgX3RoaXM0Lmxhbmd1YWdlcyA9IF90aGlzNC5zZXJ2aWNlcy5sYW5ndWFnZVV0aWxzLnRvUmVzb2x2ZUhpZXJhcmNoeShsKTtcbiAgICAgICAgX3RoaXM0LnJlc29sdmVkTGFuZ3VhZ2UgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgX3RoaXM0LnNldFJlc29sdmVkTGFuZ3VhZ2UobCk7XG4gICAgICB9O1xuXG4gICAgICB2YXIgZG9uZSA9IGZ1bmN0aW9uIGRvbmUoZXJyLCBsKSB7XG4gICAgICAgIGlmIChsKSB7XG4gICAgICAgICAgc2V0TG5nUHJvcHMobCk7XG5cbiAgICAgICAgICBfdGhpczQudHJhbnNsYXRvci5jaGFuZ2VMYW5ndWFnZShsKTtcblxuICAgICAgICAgIF90aGlzNC5pc0xhbmd1YWdlQ2hhbmdpbmdUbyA9IHVuZGVmaW5lZDtcblxuICAgICAgICAgIF90aGlzNC5lbWl0KCdsYW5ndWFnZUNoYW5nZWQnLCBsKTtcblxuICAgICAgICAgIF90aGlzNC5sb2dnZXIubG9nKCdsYW5ndWFnZUNoYW5nZWQnLCBsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBfdGhpczQuaXNMYW5ndWFnZUNoYW5naW5nVG8gPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gX3RoaXM0LnQuYXBwbHkoX3RoaXM0LCBhcmd1bWVudHMpO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGNhbGxiYWNrKSBjYWxsYmFjayhlcnIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gX3RoaXM0LnQuYXBwbHkoX3RoaXM0LCBhcmd1bWVudHMpO1xuICAgICAgICB9KTtcbiAgICAgIH07XG5cbiAgICAgIHZhciBzZXRMbmcgPSBmdW5jdGlvbiBzZXRMbmcobG5ncykge1xuICAgICAgICBpZiAoIWxuZyAmJiAhbG5ncyAmJiBfdGhpczQuc2VydmljZXMubGFuZ3VhZ2VEZXRlY3RvcikgbG5ncyA9IFtdO1xuICAgICAgICB2YXIgbCA9IHR5cGVvZiBsbmdzID09PSAnc3RyaW5nJyA/IGxuZ3MgOiBfdGhpczQuc2VydmljZXMubGFuZ3VhZ2VVdGlscy5nZXRCZXN0TWF0Y2hGcm9tQ29kZXMobG5ncyk7XG5cbiAgICAgICAgaWYgKGwpIHtcbiAgICAgICAgICBpZiAoIV90aGlzNC5sYW5ndWFnZSkge1xuICAgICAgICAgICAgc2V0TG5nUHJvcHMobCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCFfdGhpczQudHJhbnNsYXRvci5sYW5ndWFnZSkgX3RoaXM0LnRyYW5zbGF0b3IuY2hhbmdlTGFuZ3VhZ2UobCk7XG4gICAgICAgICAgaWYgKF90aGlzNC5zZXJ2aWNlcy5sYW5ndWFnZURldGVjdG9yKSBfdGhpczQuc2VydmljZXMubGFuZ3VhZ2VEZXRlY3Rvci5jYWNoZVVzZXJMYW5ndWFnZShsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIF90aGlzNC5sb2FkUmVzb3VyY2VzKGwsIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgICBkb25lKGVyciwgbCk7XG4gICAgICAgIH0pO1xuICAgICAgfTtcblxuICAgICAgaWYgKCFsbmcgJiYgdGhpcy5zZXJ2aWNlcy5sYW5ndWFnZURldGVjdG9yICYmICF0aGlzLnNlcnZpY2VzLmxhbmd1YWdlRGV0ZWN0b3IuYXN5bmMpIHtcbiAgICAgICAgc2V0TG5nKHRoaXMuc2VydmljZXMubGFuZ3VhZ2VEZXRlY3Rvci5kZXRlY3QoKSk7XG4gICAgICB9IGVsc2UgaWYgKCFsbmcgJiYgdGhpcy5zZXJ2aWNlcy5sYW5ndWFnZURldGVjdG9yICYmIHRoaXMuc2VydmljZXMubGFuZ3VhZ2VEZXRlY3Rvci5hc3luYykge1xuICAgICAgICB0aGlzLnNlcnZpY2VzLmxhbmd1YWdlRGV0ZWN0b3IuZGV0ZWN0KHNldExuZyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZXRMbmcobG5nKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGRlZmVycmVkO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRGaXhlZFRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0Rml4ZWRUKGxuZywgbnMsIGtleVByZWZpeCkge1xuICAgICAgdmFyIF90aGlzNSA9IHRoaXM7XG5cbiAgICAgIHZhciBmaXhlZFQgPSBmdW5jdGlvbiBmaXhlZFQoa2V5LCBvcHRzKSB7XG4gICAgICAgIHZhciBvcHRpb25zO1xuXG4gICAgICAgIGlmIChfdHlwZW9mKG9wdHMpICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgIGZvciAodmFyIF9sZW4zID0gYXJndW1lbnRzLmxlbmd0aCwgcmVzdCA9IG5ldyBBcnJheShfbGVuMyA+IDIgPyBfbGVuMyAtIDIgOiAwKSwgX2tleTMgPSAyOyBfa2V5MyA8IF9sZW4zOyBfa2V5MysrKSB7XG4gICAgICAgICAgICByZXN0W19rZXkzIC0gMl0gPSBhcmd1bWVudHNbX2tleTNdO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIG9wdGlvbnMgPSBfdGhpczUub3B0aW9ucy5vdmVybG9hZFRyYW5zbGF0aW9uT3B0aW9uSGFuZGxlcihba2V5LCBvcHRzXS5jb25jYXQocmVzdCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG9wdGlvbnMgPSBfb2JqZWN0U3ByZWFkJDYoe30sIG9wdHMpO1xuICAgICAgICB9XG5cbiAgICAgICAgb3B0aW9ucy5sbmcgPSBvcHRpb25zLmxuZyB8fCBmaXhlZFQubG5nO1xuICAgICAgICBvcHRpb25zLmxuZ3MgPSBvcHRpb25zLmxuZ3MgfHwgZml4ZWRULmxuZ3M7XG4gICAgICAgIG9wdGlvbnMubnMgPSBvcHRpb25zLm5zIHx8IGZpeGVkVC5ucztcbiAgICAgICAgb3B0aW9ucy5rZXlQcmVmaXggPSBvcHRpb25zLmtleVByZWZpeCB8fCBrZXlQcmVmaXggfHwgZml4ZWRULmtleVByZWZpeDtcbiAgICAgICAgdmFyIGtleVNlcGFyYXRvciA9IF90aGlzNS5vcHRpb25zLmtleVNlcGFyYXRvciB8fCAnLic7XG4gICAgICAgIHZhciByZXN1bHRLZXkgPSBvcHRpb25zLmtleVByZWZpeCA/IFwiXCIuY29uY2F0KG9wdGlvbnMua2V5UHJlZml4KS5jb25jYXQoa2V5U2VwYXJhdG9yKS5jb25jYXQoa2V5KSA6IGtleTtcbiAgICAgICAgcmV0dXJuIF90aGlzNS50KHJlc3VsdEtleSwgb3B0aW9ucyk7XG4gICAgICB9O1xuXG4gICAgICBpZiAodHlwZW9mIGxuZyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgZml4ZWRULmxuZyA9IGxuZztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZpeGVkVC5sbmdzID0gbG5nO1xuICAgICAgfVxuXG4gICAgICBmaXhlZFQubnMgPSBucztcbiAgICAgIGZpeGVkVC5rZXlQcmVmaXggPSBrZXlQcmVmaXg7XG4gICAgICByZXR1cm4gZml4ZWRUO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHQoKSB7XG4gICAgICB2YXIgX3RoaXMkdHJhbnNsYXRvcjtcblxuICAgICAgcmV0dXJuIHRoaXMudHJhbnNsYXRvciAmJiAoX3RoaXMkdHJhbnNsYXRvciA9IHRoaXMudHJhbnNsYXRvcikudHJhbnNsYXRlLmFwcGx5KF90aGlzJHRyYW5zbGF0b3IsIGFyZ3VtZW50cyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImV4aXN0c1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBleGlzdHMoKSB7XG4gICAgICB2YXIgX3RoaXMkdHJhbnNsYXRvcjI7XG5cbiAgICAgIHJldHVybiB0aGlzLnRyYW5zbGF0b3IgJiYgKF90aGlzJHRyYW5zbGF0b3IyID0gdGhpcy50cmFuc2xhdG9yKS5leGlzdHMuYXBwbHkoX3RoaXMkdHJhbnNsYXRvcjIsIGFyZ3VtZW50cyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNldERlZmF1bHROYW1lc3BhY2VcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0RGVmYXVsdE5hbWVzcGFjZShucykge1xuICAgICAgdGhpcy5vcHRpb25zLmRlZmF1bHROUyA9IG5zO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJoYXNMb2FkZWROYW1lc3BhY2VcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaGFzTG9hZGVkTmFtZXNwYWNlKG5zKSB7XG4gICAgICB2YXIgX3RoaXM2ID0gdGhpcztcblxuICAgICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuXG4gICAgICBpZiAoIXRoaXMuaXNJbml0aWFsaXplZCkge1xuICAgICAgICB0aGlzLmxvZ2dlci53YXJuKCdoYXNMb2FkZWROYW1lc3BhY2U6IGkxOG5leHQgd2FzIG5vdCBpbml0aWFsaXplZCcsIHRoaXMubGFuZ3VhZ2VzKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXRoaXMubGFuZ3VhZ2VzIHx8ICF0aGlzLmxhbmd1YWdlcy5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIud2FybignaGFzTG9hZGVkTmFtZXNwYWNlOiBpMThuLmxhbmd1YWdlcyB3ZXJlIHVuZGVmaW5lZCBvciBlbXB0eScsIHRoaXMubGFuZ3VhZ2VzKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICB2YXIgbG5nID0gdGhpcy5yZXNvbHZlZExhbmd1YWdlIHx8IHRoaXMubGFuZ3VhZ2VzWzBdO1xuICAgICAgdmFyIGZhbGxiYWNrTG5nID0gdGhpcy5vcHRpb25zID8gdGhpcy5vcHRpb25zLmZhbGxiYWNrTG5nIDogZmFsc2U7XG4gICAgICB2YXIgbGFzdExuZyA9IHRoaXMubGFuZ3VhZ2VzW3RoaXMubGFuZ3VhZ2VzLmxlbmd0aCAtIDFdO1xuICAgICAgaWYgKGxuZy50b0xvd2VyQ2FzZSgpID09PSAnY2ltb2RlJykgcmV0dXJuIHRydWU7XG5cbiAgICAgIHZhciBsb2FkTm90UGVuZGluZyA9IGZ1bmN0aW9uIGxvYWROb3RQZW5kaW5nKGwsIG4pIHtcbiAgICAgICAgdmFyIGxvYWRTdGF0ZSA9IF90aGlzNi5zZXJ2aWNlcy5iYWNrZW5kQ29ubmVjdG9yLnN0YXRlW1wiXCIuY29uY2F0KGwsIFwifFwiKS5jb25jYXQobildO1xuXG4gICAgICAgIHJldHVybiBsb2FkU3RhdGUgPT09IC0xIHx8IGxvYWRTdGF0ZSA9PT0gMjtcbiAgICAgIH07XG5cbiAgICAgIGlmIChvcHRpb25zLnByZWNoZWNrKSB7XG4gICAgICAgIHZhciBwcmVSZXN1bHQgPSBvcHRpb25zLnByZWNoZWNrKHRoaXMsIGxvYWROb3RQZW5kaW5nKTtcbiAgICAgICAgaWYgKHByZVJlc3VsdCAhPT0gdW5kZWZpbmVkKSByZXR1cm4gcHJlUmVzdWx0O1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5oYXNSZXNvdXJjZUJ1bmRsZShsbmcsIG5zKSkgcmV0dXJuIHRydWU7XG4gICAgICBpZiAoIXRoaXMuc2VydmljZXMuYmFja2VuZENvbm5lY3Rvci5iYWNrZW5kIHx8IHRoaXMub3B0aW9ucy5yZXNvdXJjZXMgJiYgIXRoaXMub3B0aW9ucy5wYXJ0aWFsQnVuZGxlZExhbmd1YWdlcykgcmV0dXJuIHRydWU7XG4gICAgICBpZiAobG9hZE5vdFBlbmRpbmcobG5nLCBucykgJiYgKCFmYWxsYmFja0xuZyB8fCBsb2FkTm90UGVuZGluZyhsYXN0TG5nLCBucykpKSByZXR1cm4gdHJ1ZTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwibG9hZE5hbWVzcGFjZXNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbG9hZE5hbWVzcGFjZXMobnMsIGNhbGxiYWNrKSB7XG4gICAgICB2YXIgX3RoaXM3ID0gdGhpcztcblxuICAgICAgdmFyIGRlZmVycmVkID0gZGVmZXIoKTtcblxuICAgICAgaWYgKCF0aGlzLm9wdGlvbnMubnMpIHtcbiAgICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2soKTtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIG5zID09PSAnc3RyaW5nJykgbnMgPSBbbnNdO1xuICAgICAgbnMuZm9yRWFjaChmdW5jdGlvbiAobikge1xuICAgICAgICBpZiAoX3RoaXM3Lm9wdGlvbnMubnMuaW5kZXhPZihuKSA8IDApIF90aGlzNy5vcHRpb25zLm5zLnB1c2gobik7XG4gICAgICB9KTtcbiAgICAgIHRoaXMubG9hZFJlc291cmNlcyhmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgIGRlZmVycmVkLnJlc29sdmUoKTtcbiAgICAgICAgaWYgKGNhbGxiYWNrKSBjYWxsYmFjayhlcnIpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gZGVmZXJyZWQ7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImxvYWRMYW5ndWFnZXNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbG9hZExhbmd1YWdlcyhsbmdzLCBjYWxsYmFjaykge1xuICAgICAgdmFyIGRlZmVycmVkID0gZGVmZXIoKTtcbiAgICAgIGlmICh0eXBlb2YgbG5ncyA9PT0gJ3N0cmluZycpIGxuZ3MgPSBbbG5nc107XG4gICAgICB2YXIgcHJlbG9hZGVkID0gdGhpcy5vcHRpb25zLnByZWxvYWQgfHwgW107XG4gICAgICB2YXIgbmV3TG5ncyA9IGxuZ3MuZmlsdGVyKGZ1bmN0aW9uIChsbmcpIHtcbiAgICAgICAgcmV0dXJuIHByZWxvYWRlZC5pbmRleE9mKGxuZykgPCAwO1xuICAgICAgfSk7XG5cbiAgICAgIGlmICghbmV3TG5ncy5sZW5ndGgpIHtcbiAgICAgICAgaWYgKGNhbGxiYWNrKSBjYWxsYmFjaygpO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMub3B0aW9ucy5wcmVsb2FkID0gcHJlbG9hZGVkLmNvbmNhdChuZXdMbmdzKTtcbiAgICAgIHRoaXMubG9hZFJlc291cmNlcyhmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgIGRlZmVycmVkLnJlc29sdmUoKTtcbiAgICAgICAgaWYgKGNhbGxiYWNrKSBjYWxsYmFjayhlcnIpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gZGVmZXJyZWQ7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImRpclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkaXIobG5nKSB7XG4gICAgICBpZiAoIWxuZykgbG5nID0gdGhpcy5yZXNvbHZlZExhbmd1YWdlIHx8ICh0aGlzLmxhbmd1YWdlcyAmJiB0aGlzLmxhbmd1YWdlcy5sZW5ndGggPiAwID8gdGhpcy5sYW5ndWFnZXNbMF0gOiB0aGlzLmxhbmd1YWdlKTtcbiAgICAgIGlmICghbG5nKSByZXR1cm4gJ3J0bCc7XG4gICAgICB2YXIgcnRsTG5ncyA9IFsnYXInLCAnc2h1JywgJ3NxcicsICdzc2gnLCAneGFhJywgJ3loZCcsICd5dWQnLCAnYWFvJywgJ2FiaCcsICdhYnYnLCAnYWNtJywgJ2FjcScsICdhY3cnLCAnYWN4JywgJ2FjeScsICdhZGYnLCAnYWRzJywgJ2FlYicsICdhZWMnLCAnYWZiJywgJ2FqcCcsICdhcGMnLCAnYXBkJywgJ2FyYicsICdhcnEnLCAnYXJzJywgJ2FyeScsICdhcnonLCAnYXV6JywgJ2F2bCcsICdheWgnLCAnYXlsJywgJ2F5bicsICdheXAnLCAnYmJ6JywgJ3BnYScsICdoZScsICdpdycsICdwcycsICdwYnQnLCAncGJ1JywgJ3BzdCcsICdwcnAnLCAncHJkJywgJ3VnJywgJ3VyJywgJ3lkZCcsICd5ZHMnLCAneWloJywgJ2ppJywgJ3lpJywgJ2hibycsICdtZW4nLCAneG1uJywgJ2ZhJywgJ2pwcicsICdwZW8nLCAncGVzJywgJ3BycycsICdkdicsICdzYW0nLCAnY2tiJ107XG4gICAgICByZXR1cm4gcnRsTG5ncy5pbmRleE9mKHRoaXMuc2VydmljZXMubGFuZ3VhZ2VVdGlscy5nZXRMYW5ndWFnZVBhcnRGcm9tQ29kZShsbmcpKSA+IC0xIHx8IGxuZy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoJy1hcmFiJykgPiAxID8gJ3J0bCcgOiAnbHRyJztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY2xvbmVJbnN0YW5jZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjbG9uZUluc3RhbmNlKCkge1xuICAgICAgdmFyIF90aGlzOCA9IHRoaXM7XG5cbiAgICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcbiAgICAgIHZhciBjYWxsYmFjayA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogbm9vcDtcblxuICAgICAgdmFyIG1lcmdlZE9wdGlvbnMgPSBfb2JqZWN0U3ByZWFkJDYoX29iamVjdFNwcmVhZCQ2KF9vYmplY3RTcHJlYWQkNih7fSwgdGhpcy5vcHRpb25zKSwgb3B0aW9ucyksIHtcbiAgICAgICAgaXNDbG9uZTogdHJ1ZVxuICAgICAgfSk7XG5cbiAgICAgIHZhciBjbG9uZSA9IG5ldyBJMThuKG1lcmdlZE9wdGlvbnMpO1xuXG4gICAgICBpZiAob3B0aW9ucy5kZWJ1ZyAhPT0gdW5kZWZpbmVkIHx8IG9wdGlvbnMucHJlZml4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY2xvbmUubG9nZ2VyID0gY2xvbmUubG9nZ2VyLmNsb25lKG9wdGlvbnMpO1xuICAgICAgfVxuXG4gICAgICB2YXIgbWVtYmVyc1RvQ29weSA9IFsnc3RvcmUnLCAnc2VydmljZXMnLCAnbGFuZ3VhZ2UnXTtcbiAgICAgIG1lbWJlcnNUb0NvcHkuZm9yRWFjaChmdW5jdGlvbiAobSkge1xuICAgICAgICBjbG9uZVttXSA9IF90aGlzOFttXTtcbiAgICAgIH0pO1xuICAgICAgY2xvbmUuc2VydmljZXMgPSBfb2JqZWN0U3ByZWFkJDYoe30sIHRoaXMuc2VydmljZXMpO1xuICAgICAgY2xvbmUuc2VydmljZXMudXRpbHMgPSB7XG4gICAgICAgIGhhc0xvYWRlZE5hbWVzcGFjZTogY2xvbmUuaGFzTG9hZGVkTmFtZXNwYWNlLmJpbmQoY2xvbmUpXG4gICAgICB9O1xuICAgICAgY2xvbmUudHJhbnNsYXRvciA9IG5ldyBUcmFuc2xhdG9yKGNsb25lLnNlcnZpY2VzLCBjbG9uZS5vcHRpb25zKTtcbiAgICAgIGNsb25lLnRyYW5zbGF0b3Iub24oJyonLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgZm9yICh2YXIgX2xlbjQgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW40ID4gMSA/IF9sZW40IC0gMSA6IDApLCBfa2V5NCA9IDE7IF9rZXk0IDwgX2xlbjQ7IF9rZXk0KyspIHtcbiAgICAgICAgICBhcmdzW19rZXk0IC0gMV0gPSBhcmd1bWVudHNbX2tleTRdO1xuICAgICAgICB9XG5cbiAgICAgICAgY2xvbmUuZW1pdC5hcHBseShjbG9uZSwgW2V2ZW50XS5jb25jYXQoYXJncykpO1xuICAgICAgfSk7XG4gICAgICBjbG9uZS5pbml0KG1lcmdlZE9wdGlvbnMsIGNhbGxiYWNrKTtcbiAgICAgIGNsb25lLnRyYW5zbGF0b3Iub3B0aW9ucyA9IGNsb25lLm9wdGlvbnM7XG4gICAgICBjbG9uZS50cmFuc2xhdG9yLmJhY2tlbmRDb25uZWN0b3Iuc2VydmljZXMudXRpbHMgPSB7XG4gICAgICAgIGhhc0xvYWRlZE5hbWVzcGFjZTogY2xvbmUuaGFzTG9hZGVkTmFtZXNwYWNlLmJpbmQoY2xvbmUpXG4gICAgICB9O1xuICAgICAgcmV0dXJuIGNsb25lO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ0b0pTT05cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdG9KU09OKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgb3B0aW9uczogdGhpcy5vcHRpb25zLFxuICAgICAgICBzdG9yZTogdGhpcy5zdG9yZSxcbiAgICAgICAgbGFuZ3VhZ2U6IHRoaXMubGFuZ3VhZ2UsXG4gICAgICAgIGxhbmd1YWdlczogdGhpcy5sYW5ndWFnZXMsXG4gICAgICAgIHJlc29sdmVkTGFuZ3VhZ2U6IHRoaXMucmVzb2x2ZWRMYW5ndWFnZVxuICAgICAgfTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gSTE4bjtcbn0oRXZlbnRFbWl0dGVyKTtcblxuX2RlZmluZVByb3BlcnR5KEkxOG4sIFwiY3JlYXRlSW5zdGFuY2VcIiwgZnVuY3Rpb24gKCkge1xuICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG4gIHZhciBjYWxsYmFjayA9IGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkO1xuICByZXR1cm4gbmV3IEkxOG4ob3B0aW9ucywgY2FsbGJhY2spO1xufSk7XG5cbnZhciBpbnN0YW5jZSA9IEkxOG4uY3JlYXRlSW5zdGFuY2UoKTtcbmluc3RhbmNlLmNyZWF0ZUluc3RhbmNlID0gSTE4bi5jcmVhdGVJbnN0YW5jZTtcblxudmFyIGNyZWF0ZUluc3RhbmNlID0gaW5zdGFuY2UuY3JlYXRlSW5zdGFuY2U7XG52YXIgaW5pdCA9IGluc3RhbmNlLmluaXQ7XG52YXIgbG9hZFJlc291cmNlcyA9IGluc3RhbmNlLmxvYWRSZXNvdXJjZXM7XG52YXIgcmVsb2FkUmVzb3VyY2VzID0gaW5zdGFuY2UucmVsb2FkUmVzb3VyY2VzO1xudmFyIHVzZSA9IGluc3RhbmNlLnVzZTtcbnZhciBjaGFuZ2VMYW5ndWFnZSA9IGluc3RhbmNlLmNoYW5nZUxhbmd1YWdlO1xudmFyIGdldEZpeGVkVCA9IGluc3RhbmNlLmdldEZpeGVkVDtcbnZhciB0ID0gaW5zdGFuY2UudDtcbnZhciBleGlzdHMgPSBpbnN0YW5jZS5leGlzdHM7XG52YXIgc2V0RGVmYXVsdE5hbWVzcGFjZSA9IGluc3RhbmNlLnNldERlZmF1bHROYW1lc3BhY2U7XG52YXIgaGFzTG9hZGVkTmFtZXNwYWNlID0gaW5zdGFuY2UuaGFzTG9hZGVkTmFtZXNwYWNlO1xudmFyIGxvYWROYW1lc3BhY2VzID0gaW5zdGFuY2UubG9hZE5hbWVzcGFjZXM7XG52YXIgbG9hZExhbmd1YWdlcyA9IGluc3RhbmNlLmxvYWRMYW5ndWFnZXM7XG5cbmV4cG9ydCBkZWZhdWx0IGluc3RhbmNlO1xuZXhwb3J0IHsgY2hhbmdlTGFuZ3VhZ2UsIGNyZWF0ZUluc3RhbmNlLCBleGlzdHMsIGdldEZpeGVkVCwgaGFzTG9hZGVkTmFtZXNwYWNlLCBpbml0LCBsb2FkTGFuZ3VhZ2VzLCBsb2FkTmFtZXNwYWNlcywgbG9hZFJlc291cmNlcywgcmVsb2FkUmVzb3VyY2VzLCBzZXREZWZhdWx0TmFtZXNwYWNlLCB0LCB1c2UgfTtcbiIsImltcG9ydCB7IEFkbWluSlNPcHRpb25zLCBBc3NldHMgfSBmcm9tICcuLi8uLi8uLi9hZG1pbmpzLW9wdGlvbnMuaW50ZXJmYWNlJ1xuaW1wb3J0IHsgUGF0aHMgfSBmcm9tICcuLi8uLi8uLi9mcm9udGVuZC9zdG9yZS9zdG9yZSdcblxubGV0IGdsb2JhbEFueTogYW55ID0ge31cblxudHJ5IHtcbiAgZ2xvYmFsQW55ID0gd2luZG93XG59IGNhdGNoIChlcnJvcikge1xuICBpZiAoZXJyb3IubWVzc2FnZSAhPT0gJ3dpbmRvdyBpcyBub3QgZGVmaW5lZCcpIHtcbiAgICB0aHJvdyBlcnJvclxuICB9XG59XG5cbi8qKlxuICogQmFzZSBQYXJhbXMgZm9yIGEgYW55IGZ1bmN0aW9uXG4gKiBAYWxpYXMgQWN0aW9uUGFyYW1zXG4gKiBAbWVtYmVyb2YgVmlld0hlbHBlcnNcbiAqL1xuZXhwb3J0IHR5cGUgQWN0aW9uUGFyYW1zID0ge1xuICAvKipcbiAgICogVW5pcXVlIFJlc291cmNlIElEXG4gICAqL1xuICByZXNvdXJjZUlkOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBBY3Rpb24gbmFtZVxuICAgKi9cbiAgYWN0aW9uTmFtZTogc3RyaW5nO1xuICAvKipcbiAgICogT3B0aW9uYWwgcXVlcnkgc3RyaW5nOiA/Li4uLlxuICAgKi9cbiAgc2VhcmNoPyA6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbXMgZm9yIGEgcmVjb3JkIGFjdGlvblxuICogQGFsaWFzIFJlY29yZEFjdGlvblBhcmFtc1xuICogQGV4dGVuZHMgQWN0aW9uUGFyYW1zXG4gKiBAbWVtYmVyb2YgVmlld0hlbHBlcnNcbiAqL1xuZXhwb3J0IHR5cGUgUmVjb3JkQWN0aW9uUGFyYW1zID0gQWN0aW9uUGFyYW1zICYge1xuICAvKipcbiAgICogUmVjb3JkIElEXG4gICAqL1xuICByZWNvcmRJZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtcyBmb3IgYSBidWxrIGFjdGlvblxuICogQGFsaWFzIEJ1bGtBY3Rpb25QYXJhbXNcbiAqIEBleHRlbmRzIEFjdGlvblBhcmFtc1xuICogQG1lbWJlcm9mIFZpZXdIZWxwZXJzXG4gKi9cbmV4cG9ydCB0eXBlIEJ1bGtBY3Rpb25QYXJhbXMgPSBBY3Rpb25QYXJhbXMgJiB7XG4gIC8qKlxuICAgKiBBcnJheSBvZiBSZWNvcmRzIElEXG4gICAqL1xuICByZWNvcmRJZHM/OiBBcnJheTxzdHJpbmc+O1xufVxuXG4vKipcbiAqIFBhcmFtcyBmb3IgYSByZXNvdXJjZSBhY3Rpb25cbiAqIEBhbGlhcyBSZXNvdXJjZUFjdGlvblBhcmFtc1xuICogQGV4dGVuZHMgQWN0aW9uUGFyYW1zXG4gKiBAbWVtYmVyb2YgVmlld0hlbHBlcnNcbiAqL1xuZXhwb3J0IHR5cGUgUmVzb3VyY2VBY3Rpb25QYXJhbXMgPSBBY3Rpb25QYXJhbXNcblxuY29uc3QgcnVuRGF0ZSA9IG5ldyBEYXRlKClcblxuLyoqXG4gKiBDb2xsZWN0aW9uIG9mIGhlbHBlciBtZXRob2RzIGF2YWlsYWJsZSBpbiB0aGUgdmlld3NcbiAqL1xuZXhwb3J0IGNsYXNzIFZpZXdIZWxwZXJzIHtcbiAgcHVibGljIG9wdGlvbnM6IFBhdGhzXG5cbiAgY29uc3RydWN0b3IoeyBvcHRpb25zIH06IHsgb3B0aW9ucz86IEFkbWluSlNPcHRpb25zIH0gPSB7fSkge1xuICAgIGxldCBvcHRzOiBQYXRocyA9IFZpZXdIZWxwZXJzLmdldFBhdGhzKG9wdGlvbnMpXG5cbiAgICBvcHRzID0gb3B0cyB8fCB7XG4gICAgICByb290UGF0aDogJy9hZG1pbicsXG4gICAgfVxuXG4gICAgLy8gd2hlbiBWaWV3SGVscGVycyBhcmUgdXNlZCBvbiB0aGUgZnJvbnRlbmQsIHBhdGhzIGFyZSB0YWtlbiBmcm9tIGdsb2JhbCBSZWR1eCBTdGF0ZVxuICAgIHRoaXMub3B0aW9ucyA9IG9wdHNcbiAgfVxuXG4gIHN0YXRpYyBnZXRQYXRocyhvcHRpb25zPzogQWRtaW5KU09wdGlvbnMpOiBQYXRocyB7XG4gICAgcmV0dXJuIG9wdGlvbnMgfHwgKGdsb2JhbEFueS5SRURVWF9TVEFURT8ucGF0aHMpXG4gIH1cblxuICAvKipcbiAgICogVG8gZWFjaCByZWxhdGVkIHBhdGggYWRkcyByb290UGF0aCBwYXNzZWQgYnkgdGhlIHVzZXIsIGFzIHdlbGwgYXMgYSBxdWVyeSBzdHJpbmdcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtICB7QXJyYXk8c3RyaW5nPn0gW3BhdGhzXSAgICAgIGxpc3Qgb2YgcGFydHMgb2YgdGhlIHVybFxuICAgKiBAcmV0dXJuIHtzdHJpbmd9ICAgICAgIHBhdGhcbiAgICogQHJldHVybiB7cXVlcnl9ICAgICAgICBbc2VhcmNoPScnXSBxdWVyeSBzdHJpbmcgd2hpY2ggY2FuIGJlIGZldGNoXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBgbG9jYXRpb24uc2VhcmNoYFxuICAgKi9cbiAgdXJsQnVpbGRlcihwYXRoczogQXJyYXk8c3RyaW5nPiA9IFtdLCBzZWFyY2ggPSAnJyk6IHN0cmluZyB7XG4gICAgY29uc3Qgc2VwYXJhdG9yID0gJy8nXG4gICAgY29uc3QgcmVwbGFjZSA9IG5ldyBSZWdFeHAoYCR7c2VwYXJhdG9yfXsxLH1gLCAnZycpXG5cbiAgICBsZXQgeyByb290UGF0aCB9ID0gdGhpcy5vcHRpb25zXG4gICAgaWYgKCFyb290UGF0aC5zdGFydHNXaXRoKHNlcGFyYXRvcikpIHsgcm9vdFBhdGggPSBgJHtzZXBhcmF0b3J9JHtyb290UGF0aH1gIH1cblxuICAgIGNvbnN0IHBhcnRzID0gW3Jvb3RQYXRoLCAuLi5wYXRoc11cbiAgICByZXR1cm4gYCR7cGFydHMuam9pbihzZXBhcmF0b3IpLnJlcGxhY2UocmVwbGFjZSwgc2VwYXJhdG9yKX0ke3NlYXJjaH1gXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBsb2dpbiBVUkxcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgbG9naW5VcmwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmxvZ2luUGF0aFxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgbG9nb3V0IFVSTFxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBsb2dvdXRVcmwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmxvZ291dFBhdGhcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIFVSTCBmb3IgdGhlIGRhc2hib2FyZFxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBkYXNoYm9hcmRVcmwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLnJvb3RQYXRoXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBVUkwgZm9yIGdpdmVuIHBhZ2UgbmFtZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFnZU5hbWUgICAgICAgcGFnZSBuYW1lIHdoaWNoIGlzIGEgdW5pcXVlIGtleSBzcGVjaWZpZWQgaW5cbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtAbGluayBBZG1pbkpTT3B0aW9uc31cbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgcGFnZVVybChwYWdlTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy51cmxCdWlsZGVyKFsncGFnZXMnLCBwYWdlTmFtZV0pXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB1cmwgZm9yIGEgYGVkaXRgIGFjdGlvbiBpbiBnaXZlbiBSZXNvdXJjZS4gVXNlcyB7QGxpbmsgcmVjb3JkQWN0aW9uVXJsfVxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVzb3VyY2VJZCAgaWQgdG8gdGhlIHJlc291cmNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZWNvcmRJZCAgICBpZCB0byB0aGUgcmVjb3JkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbc2VhcmNoXSAgICAgICAgb3B0aW9uYWwgcXVlcnkgc3RyaW5nXG4gICAqL1xuICBlZGl0VXJsKHJlc291cmNlSWQ6IHN0cmluZywgcmVjb3JkSWQ6IHN0cmluZywgc2VhcmNoPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5yZWNvcmRBY3Rpb25VcmwoeyByZXNvdXJjZUlkLCByZWNvcmRJZCwgYWN0aW9uTmFtZTogJ2VkaXQnLCBzZWFyY2ggfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHVybCBmb3IgYSBgc2hvd2AgYWN0aW9uIGluIGdpdmVuIFJlc291cmNlLiBVc2VzIHtAbGluayByZWNvcmRBY3Rpb25Vcmx9XG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZXNvdXJjZUlkICBpZCB0byB0aGUgcmVzb3VyY2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlY29yZElkICAgIGlkIHRvIHRoZSByZWNvcmRcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtzZWFyY2hdICAgICAgICBvcHRpb25hbCBxdWVyeSBzdHJpbmdcbiAgICovXG4gIHNob3dVcmwocmVzb3VyY2VJZDogc3RyaW5nLCByZWNvcmRJZDogc3RyaW5nLCBzZWFyY2g/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnJlY29yZEFjdGlvblVybCh7IHJlc291cmNlSWQsIHJlY29yZElkLCBhY3Rpb25OYW1lOiAnc2hvdycsIHNlYXJjaCB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdXJsIGZvciBhIGBkZWxldGVgIGFjdGlvbiBpbiBnaXZlbiBSZXNvdXJjZS4gVXNlcyB7QGxpbmsgcmVjb3JkQWN0aW9uVXJsfVxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVzb3VyY2VJZCAgaWQgdG8gdGhlIHJlc291cmNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZWNvcmRJZCAgICBpZCB0byB0aGUgcmVjb3JkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbc2VhcmNoXSAgICAgICAgb3B0aW9uYWwgcXVlcnkgc3RyaW5nXG4gICAqL1xuICBkZWxldGVVcmwocmVzb3VyY2VJZDogc3RyaW5nLCByZWNvcmRJZDogc3RyaW5nLCBzZWFyY2g/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnJlY29yZEFjdGlvblVybCh7IHJlc291cmNlSWQsIHJlY29yZElkLCBhY3Rpb25OYW1lOiAnZGVsZXRlJywgc2VhcmNoIH0pXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB1cmwgZm9yIGEgYG5ld2AgYWN0aW9uIGluIGdpdmVuIFJlc291cmNlLiBVc2VzIHtAbGluayByZXNvdXJjZUFjdGlvblVybH1cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlc291cmNlSWQgIGlkIHRvIHRoZSByZXNvdXJjZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3NlYXJjaF0gICAgICAgIG9wdGlvbmFsIHF1ZXJ5IHN0cmluZ1xuICAgKi9cbiAgbmV3VXJsKHJlc291cmNlSWQ6IHN0cmluZywgc2VhcmNoPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5yZXNvdXJjZUFjdGlvblVybCh7IHJlc291cmNlSWQsIGFjdGlvbk5hbWU6ICduZXcnLCBzZWFyY2ggfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHVybCBmb3IgYSBgbGlzdGAgYWN0aW9uIGluIGdpdmVuIFJlc291cmNlLiBVc2VzIHtAbGluayByZXNvdXJjZUFjdGlvblVybH1cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlc291cmNlSWQgIGlkIHRvIHRoZSByZXNvdXJjZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3NlYXJjaF0gICAgICAgIG9wdGlvbmFsIHF1ZXJ5IHN0cmluZ1xuICAgKi9cbiAgbGlzdFVybChyZXNvdXJjZUlkOiBzdHJpbmcsIHNlYXJjaD86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucmVzb3VyY2VBY3Rpb25VcmwoeyByZXNvdXJjZUlkLCBhY3Rpb25OYW1lOiAnbGlzdCcsIHNlYXJjaCB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdXJsIGZvciBhIGBidWxrRGVsZXRlYCBhY3Rpb24gaW4gZ2l2ZW4gUmVzb3VyY2UuIFVzZXMge0BsaW5rIGJ1bGtBY3Rpb25Vcmx9XG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZXNvdXJjZUlkICBpZCB0byB0aGUgcmVzb3VyY2VcbiAgICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSByZWNvcmRJZHMgICBzZXBhcmF0ZWQgYnkgY29tbWEgcmVjb3Jkc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gW3NlYXJjaF0gICAgICAgIG9wdGlvbmFsIHF1ZXJ5IHN0cmluZ1xuICAgKi9cbiAgYnVsa0RlbGV0ZVVybChyZXNvdXJjZUlkOiBzdHJpbmcsIHJlY29yZElkczogQXJyYXk8c3RyaW5nPiwgc2VhcmNoPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5idWxrQWN0aW9uVXJsKHsgcmVzb3VyY2VJZCwgcmVjb3JkSWRzLCBhY3Rpb25OYW1lOiAnYnVsa0RlbGV0ZScsIHNlYXJjaCB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgcmVzb3VyY2VBY3Rpb24gdXJsXG4gICAqXG4gICAqIEBwYXJhbSAgIHtSZXNvdXJjZUFjdGlvblBhcmFtc30gIG9wdGlvbnNcbiAgICogQHBhcmFtICAge3N0cmluZ30gIG9wdGlvbnMucmVzb3VyY2VJZFxuICAgKiBAcGFyYW0gICB7c3RyaW5nfSAgb3B0aW9ucy5hY3Rpb25OYW1lXG4gICAqIEBwYXJhbSAgIHtzdHJpbmd9ICBbb3B0aW9ucy5zZWFyY2hdICAgICAgICBvcHRpb25hbCBxdWVyeSBzdHJpbmdcbiAgICpcbiAgICogQHJldHVybiAge3N0cmluZ31cbiAgICovXG4gIHJlc291cmNlQWN0aW9uVXJsKHsgcmVzb3VyY2VJZCwgYWN0aW9uTmFtZSwgc2VhcmNoIH06IFJlc291cmNlQWN0aW9uUGFyYW1zKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy51cmxCdWlsZGVyKFsncmVzb3VyY2VzJywgcmVzb3VyY2VJZCwgJ2FjdGlvbnMnLCBhY3Rpb25OYW1lXSwgc2VhcmNoKVxuICB9XG5cbiAgcmVzb3VyY2VVcmwoeyByZXNvdXJjZUlkLCBzZWFyY2ggfTogT21pdDxSZXNvdXJjZUFjdGlvblBhcmFtcywgJ2FjdGlvbk5hbWUnPik6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudXJsQnVpbGRlcihbJ3Jlc291cmNlcycsIHJlc291cmNlSWRdLCBzZWFyY2gpXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyByZWNvcmRBY3Rpb24gdXJsXG4gICAqXG4gICAqIEBwYXJhbSAgIHtSZWNvcmRBY3Rpb25QYXJhbXN9ICBvcHRpb25zXG4gICAqIEBwYXJhbSAgIHtzdHJpbmd9ICBvcHRpb25zLnJlc291cmNlSWRcbiAgICogQHBhcmFtICAge3N0cmluZ30gIG9wdGlvbnMucmVjb3JkSWRcbiAgICogQHBhcmFtICAge3N0cmluZ30gIG9wdGlvbnMuYWN0aW9uTmFtZVxuICAgKlxuICAgKiBAcmV0dXJuICB7c3RyaW5nfVxuICAgKi9cbiAgcmVjb3JkQWN0aW9uVXJsKHsgcmVzb3VyY2VJZCwgcmVjb3JkSWQsIGFjdGlvbk5hbWUsIHNlYXJjaCB9OiBSZWNvcmRBY3Rpb25QYXJhbXMpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnVybEJ1aWxkZXIoWydyZXNvdXJjZXMnLCByZXNvdXJjZUlkLCAncmVjb3JkcycsIHJlY29yZElkLCBhY3Rpb25OYW1lXSwgc2VhcmNoKVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYnVsa0FjdGlvbiB1cmxcbiAgICpcbiAgICogQHBhcmFtICAge0J1bGtBY3Rpb25QYXJhbXN9ICBvcHRpb25zXG4gICAqIEBwYXJhbSAgIHtzdHJpbmd9ICBvcHRpb25zLnJlc291cmNlSWRcbiAgICogQHBhcmFtICAge0FycmF5PHN0cmluZz59ICBbb3B0aW9ucy5yZWNvcmRJZHNdXG4gICAqIEBwYXJhbSAgIHtzdHJpbmd9ICBvcHRpb25zLmFjdGlvbk5hbWVcbiAgICpcbiAgICogQHJldHVybiAge3N0cmluZ31cbiAgICovXG4gIGJ1bGtBY3Rpb25VcmwoeyByZXNvdXJjZUlkLCByZWNvcmRJZHMsIGFjdGlvbk5hbWUsIHNlYXJjaCB9OiBCdWxrQWN0aW9uUGFyYW1zKTogc3RyaW5nIHtcbiAgICBjb25zdCB1cmwgPSB0aGlzLnVybEJ1aWxkZXIoW1xuICAgICAgJ3Jlc291cmNlcycsIHJlc291cmNlSWQsICdidWxrJywgYWN0aW9uTmFtZSxcbiAgICBdKVxuICAgIGlmIChyZWNvcmRJZHMgJiYgcmVjb3JkSWRzLmxlbmd0aCkge1xuICAgICAgY29uc3QgcXVlcnkgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHNlYXJjaClcbiAgICAgIHF1ZXJ5LnNldCgncmVjb3JkSWRzJywgcmVjb3JkSWRzLmpvaW4oJywnKSlcbiAgICAgIHJldHVybiBgJHt1cmx9PyR7cXVlcnkudG9TdHJpbmcoKX1gXG4gICAgfVxuICAgIHJldHVybiBgJHt1cmx9JHtzZWFyY2ggfHwgJyd9YFxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYWJzb2x1dGUgcGF0aCB0byBhIGdpdmVuIGFzc2V0LlxuICAgKiBAcHJpdmF0ZVxuICAgKlxuICAgKiBAcGFyYW0gIHtzdHJpbmd9IGFzc2V0XG4gICAqIEBwYXJhbSAge0Fzc2V0cyB8IHVuZGVmaW5lZH0gYXNzZXRzQ29uZmlnXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGFzc2V0UGF0aChhc3NldDogc3RyaW5nLCBhc3NldHNDb25maWc/OiBBc3NldHMpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLm9wdGlvbnMuYXNzZXRzQ0ROKSB7XG4gICAgICBjb25zdCBwYXRobmFtZSA9IGFzc2V0c0NvbmZpZz8uY29yZVNjcmlwdHM/Llthc3NldF0gPz8gYXNzZXRcbiAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwocGF0aG5hbWUsIHRoaXMub3B0aW9ucy5hc3NldHNDRE4pLmhyZWZcblxuICAgICAgLy8gYWRkaW5nIHRpbWVzdGFtcCB0byB0aGUgaHJlZiBpbnZhbGlkYXRlcyB0aGUgQ0ROIGNhY2hlXG4gICAgICByZXR1cm4gYCR7dXJsfT9kYXRlPSR7cnVuRGF0ZS5nZXRUaW1lKCl9YFxuICAgIH1cbiAgICByZXR1cm4gdGhpcy51cmxCdWlsZGVyKFsnZnJvbnRlbmQnLCAnYXNzZXRzJywgYXNzZXRdKVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFZpZXdIZWxwZXJzXG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfZXh0ZW5kcygpIHtcbiAgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduID8gT2JqZWN0LmFzc2lnbi5iaW5kKCkgOiBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07XG5cbiAgICAgIGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHtcbiAgICAgICAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRhcmdldDtcbiAgfTtcbiAgcmV0dXJuIF9leHRlbmRzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59IiwiLyogZXNsaW50LWRpc2FibGUgcmVhY3QvZnVuY3Rpb24tY29tcG9uZW50LWRlZmluaXRpb24gKi9cbmltcG9ydCBSZWFjdCwgeyBDb21wb25lbnRUeXBlIH0gZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBPdmVycmlkYWJsZUNvbXBvbmVudCB9IGZyb20gJy4uL3V0aWxzL292ZXJyaWRhYmxlLWNvbXBvbmVudCdcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICpcbiAqIEBjbGFzc2Rlc2NcbiAqIE92ZXJyaWRlcyBvbmUgb2YgdGhlIGNvbXBvbmVudCBmb3JtIEFkbWluSlMgY29yZSB3aGVuIHVzZXIgcGFzcyBpdHMgbmFtZSB0b1xuICoge0BsaW5rIENvbXBvbmVudExvYWRlci5hZGR9IG9yIHtAbGluayBDb21wb25lbnRMb2FkZXIub3ZlcnJpZGV9IG1ldGhvZC5cbiAqXG4gKiBJZiBjYXNlIG9mIGJlaW5nIG92ZXJyaWRkZW4sIGNvbXBvbmVudCByZWNlaXZlcyBhZGRpdGlvbmFsIHByb3A6IGBPcmlnaW5hbENvbXBvbmVudGBcbiAqXG4gKiBAZXhhbXBsZVxuICogbmV3IENvbXBvbmVudExvYWRlcigpLm92ZXJyaWRlKCdTaWRlYmFyRm9vdGVyJywgTXlTaWRlYmFyRm9vdGVyKVxuICovXG5mdW5jdGlvbiBhbGxvd092ZXJyaWRlPFAgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oXG4gIE9yaWdpbmFsQ29tcG9uZW50OiBDb21wb25lbnRUeXBlPFA+LFxuICBuYW1lOiBPdmVycmlkYWJsZUNvbXBvbmVudCxcbik6IENvbXBvbmVudFR5cGU8UCAmIHtPcmlnaW5hbENvbXBvbmVudD86IENvbXBvbmVudFR5cGU8UD59PiB7XG4gIGNvbnN0IFdyYXBwZXJDb21wb25lbnQgPSAocHJvcHM6IFApID0+IHtcbiAgICBsZXQgQ29tcG9uZW50ID0gT3JpZ2luYWxDb21wb25lbnRcblxuICAgIC8qKlxuICAgICAqIEBuZXcgaW4gdmVyc2lvbiA2LjNcbiAgICAgKlxuICAgICAqIFRoaXMgYWRkcyBzdXBwb3J0IGZvciBmdXR1cmUgdGhlbWUtc3BlY2lmaWMgY29tcG9uZW50cyB2aWEgdGhlaXIgXCJ0aGVtZS5idW5kbGUuanNcIlxuICAgICAqXG4gICAgICovXG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBDb21wb25lbnQgPSB3aW5kb3cuQWRtaW5KUz8uVXNlckNvbXBvbmVudHM/LltuYW1lXVxuICAgICAgICA/PyAod2luZG93IGFzIGFueSkuVEhFTUU/LkNvbXBvbmVudHM/LltuYW1lXVxuICAgICAgICA/PyBPcmlnaW5hbENvbXBvbmVudFxuICAgIH1cblxuICAgIHJldHVybiA8Q29tcG9uZW50IHsuLi5wcm9wc30gT3JpZ2luYWxDb21wb25lbnQ9e09yaWdpbmFsQ29tcG9uZW50fSAvPlxuICB9XG5cbiAgcmV0dXJuIFdyYXBwZXJDb21wb25lbnRcbn1cblxuZXhwb3J0IHtcbiAgYWxsb3dPdmVycmlkZSBhcyBkZWZhdWx0LFxuICBhbGxvd092ZXJyaWRlLFxufVxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgTGluayB9IGZyb20gJ3JlYWN0LXJvdXRlci1kb20nXG5pbXBvcnQgc3R5bGVkIGZyb20gJ3N0eWxlZC1jb21wb25lbnRzJ1xuaW1wb3J0IHsgY3NzQ2xhc3MsIHRoZW1lR2V0IH0gZnJvbSAnQGFkbWluanMvZGVzaWduLXN5c3RlbSdcblxuaW1wb3J0IFZpZXdIZWxwZXJzIGZyb20gJy4uLy4uLy4uLy4uL2JhY2tlbmQvdXRpbHMvdmlldy1oZWxwZXJzL3ZpZXctaGVscGVycydcbmltcG9ydCB7IEJyYW5kaW5nT3B0aW9ucyB9IGZyb20gJy4uLy4uLy4uLy4uL2FkbWluanMtb3B0aW9ucy5pbnRlcmZhY2UnXG5pbXBvcnQgYWxsb3dPdmVycmlkZSBmcm9tICcuLi8uLi8uLi9ob2MvYWxsb3ctb3ZlcnJpZGUnXG5cbnR5cGUgUHJvcHMgPSB7XG4gIGJyYW5kaW5nOiBCcmFuZGluZ09wdGlvbnM7XG59XG5cbmV4cG9ydCBjb25zdCBTdHlsZWRMb2dvID0gc3R5bGVkKExpbmspYFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWNvbnRlbnQ6IGNlbnRlcjtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIGZsZXgtc2hyaW5rOiAwO1xuICBwYWRkaW5nOiAke3RoZW1lR2V0KCdzcGFjZScsICdsZycpfSAke3RoZW1lR2V0KCdzcGFjZScsICd4eGwnKX0gJHt0aGVtZUdldCgnc3BhY2UnLCAneHhsJyl9O1xuICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG5cbiAgJiA+IGgxIHtcbiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gICAgZm9udC13ZWlnaHQ6ICR7dGhlbWVHZXQoJ2ZvbnRXZWlnaHRzJywgJ2JvbGRlcicpfTtcbiAgICBmb250LXNpemU6ICR7dGhlbWVHZXQoJ2ZvbnRXZWlnaHRzJywgJ2JvbGRlcicpfTtcbiAgICBjb2xvcjogJHt0aGVtZUdldCgnY29sb3JzJywgJ2dyZXk4MCcpfTtcbiAgICBmb250LXNpemU6ICR7dGhlbWVHZXQoJ2ZvbnRTaXplcycsICd4bCcpfTtcbiAgICBsaW5lLWhlaWdodDogJHt0aGVtZUdldCgnbGluZUhlaWdodHMnLCAneGwnKX07XG4gIH1cblxuICAmID4gaW1nIHtcbiAgICBtYXgtd2lkdGg6IDE3MHB4O1xuICB9XG5cbiAgJjpob3ZlciBoMSB7XG4gICAgY29sb3I6ICR7dGhlbWVHZXQoJ2NvbG9ycycsICdwcmltYXJ5MTAwJyl9O1xuICB9XG5gXG5cbmNvbnN0IGggPSBuZXcgVmlld0hlbHBlcnMoKVxuXG5jb25zdCBTaWRlYmFyQnJhbmRpbmc6IFJlYWN0LkZDPFByb3BzPiA9IChwcm9wcykgPT4ge1xuICBjb25zdCB7IGJyYW5kaW5nIH0gPSBwcm9wc1xuICBjb25zdCB7IGxvZ28sIGNvbXBhbnlOYW1lIH0gPSBicmFuZGluZ1xuICByZXR1cm4gKFxuICAgIDxTdHlsZWRMb2dvXG4gICAgICBjbGFzc05hbWU9e2Nzc0NsYXNzKCdMb2dvJyl9XG4gICAgICB0bz17aC5kYXNoYm9hcmRVcmwoKX1cbiAgICAgIGRhdGEtY3NzPVwic2lkZWJhci1sb2dvXCJcbiAgICA+XG4gICAgICB7bG9nbyA/IChcbiAgICAgICAgPGltZ1xuICAgICAgICAgIHNyYz17bG9nb31cbiAgICAgICAgICBhbHQ9e2NvbXBhbnlOYW1lfVxuICAgICAgICAvPlxuICAgICAgKSA6IDxoMT57Y29tcGFueU5hbWV9PC9oMT59XG4gICAgPC9TdHlsZWRMb2dvPlxuICApXG59XG5cbmV4cG9ydCBkZWZhdWx0IGFsbG93T3ZlcnJpZGUoU2lkZWJhckJyYW5kaW5nLCAnU2lkZWJhckJyYW5kaW5nJylcbiIsIi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLnJlZHVjZWAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yXG4gKiBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHBhcmFtIHsqfSBbYWNjdW11bGF0b3JdIFRoZSBpbml0aWFsIHZhbHVlLlxuICogQHBhcmFtIHtib29sZWFufSBbaW5pdEFjY3VtXSBTcGVjaWZ5IHVzaW5nIHRoZSBmaXJzdCBlbGVtZW50IG9mIGBhcnJheWAgYXNcbiAqICB0aGUgaW5pdGlhbCB2YWx1ZS5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBhY2N1bXVsYXRlZCB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gYXJyYXlSZWR1Y2UoYXJyYXksIGl0ZXJhdGVlLCBhY2N1bXVsYXRvciwgaW5pdEFjY3VtKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG5cbiAgaWYgKGluaXRBY2N1bSAmJiBsZW5ndGgpIHtcbiAgICBhY2N1bXVsYXRvciA9IGFycmF5WysraW5kZXhdO1xuICB9XG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgYWNjdW11bGF0b3IgPSBpdGVyYXRlZShhY2N1bXVsYXRvciwgYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpO1xuICB9XG4gIHJldHVybiBhY2N1bXVsYXRvcjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBhcnJheVJlZHVjZTtcbiIsIi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucHJvcGVydHlPZmAgd2l0aG91dCBzdXBwb3J0IGZvciBkZWVwIHBhdGhzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBhY2Nlc3NvciBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gYmFzZVByb3BlcnR5T2Yob2JqZWN0KSB7XG4gIHJldHVybiBmdW5jdGlvbihrZXkpIHtcbiAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyB1bmRlZmluZWQgOiBvYmplY3Rba2V5XTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlUHJvcGVydHlPZjtcbiIsInZhciBiYXNlUHJvcGVydHlPZiA9IHJlcXVpcmUoJy4vX2Jhc2VQcm9wZXJ0eU9mJyk7XG5cbi8qKiBVc2VkIHRvIG1hcCBMYXRpbiBVbmljb2RlIGxldHRlcnMgdG8gYmFzaWMgTGF0aW4gbGV0dGVycy4gKi9cbnZhciBkZWJ1cnJlZExldHRlcnMgPSB7XG4gIC8vIExhdGluLTEgU3VwcGxlbWVudCBibG9jay5cbiAgJ1xceGMwJzogJ0EnLCAgJ1xceGMxJzogJ0EnLCAnXFx4YzInOiAnQScsICdcXHhjMyc6ICdBJywgJ1xceGM0JzogJ0EnLCAnXFx4YzUnOiAnQScsXG4gICdcXHhlMCc6ICdhJywgICdcXHhlMSc6ICdhJywgJ1xceGUyJzogJ2EnLCAnXFx4ZTMnOiAnYScsICdcXHhlNCc6ICdhJywgJ1xceGU1JzogJ2EnLFxuICAnXFx4YzcnOiAnQycsICAnXFx4ZTcnOiAnYycsXG4gICdcXHhkMCc6ICdEJywgICdcXHhmMCc6ICdkJyxcbiAgJ1xceGM4JzogJ0UnLCAgJ1xceGM5JzogJ0UnLCAnXFx4Y2EnOiAnRScsICdcXHhjYic6ICdFJyxcbiAgJ1xceGU4JzogJ2UnLCAgJ1xceGU5JzogJ2UnLCAnXFx4ZWEnOiAnZScsICdcXHhlYic6ICdlJyxcbiAgJ1xceGNjJzogJ0knLCAgJ1xceGNkJzogJ0knLCAnXFx4Y2UnOiAnSScsICdcXHhjZic6ICdJJyxcbiAgJ1xceGVjJzogJ2knLCAgJ1xceGVkJzogJ2knLCAnXFx4ZWUnOiAnaScsICdcXHhlZic6ICdpJyxcbiAgJ1xceGQxJzogJ04nLCAgJ1xceGYxJzogJ24nLFxuICAnXFx4ZDInOiAnTycsICAnXFx4ZDMnOiAnTycsICdcXHhkNCc6ICdPJywgJ1xceGQ1JzogJ08nLCAnXFx4ZDYnOiAnTycsICdcXHhkOCc6ICdPJyxcbiAgJ1xceGYyJzogJ28nLCAgJ1xceGYzJzogJ28nLCAnXFx4ZjQnOiAnbycsICdcXHhmNSc6ICdvJywgJ1xceGY2JzogJ28nLCAnXFx4ZjgnOiAnbycsXG4gICdcXHhkOSc6ICdVJywgICdcXHhkYSc6ICdVJywgJ1xceGRiJzogJ1UnLCAnXFx4ZGMnOiAnVScsXG4gICdcXHhmOSc6ICd1JywgICdcXHhmYSc6ICd1JywgJ1xceGZiJzogJ3UnLCAnXFx4ZmMnOiAndScsXG4gICdcXHhkZCc6ICdZJywgICdcXHhmZCc6ICd5JywgJ1xceGZmJzogJ3knLFxuICAnXFx4YzYnOiAnQWUnLCAnXFx4ZTYnOiAnYWUnLFxuICAnXFx4ZGUnOiAnVGgnLCAnXFx4ZmUnOiAndGgnLFxuICAnXFx4ZGYnOiAnc3MnLFxuICAvLyBMYXRpbiBFeHRlbmRlZC1BIGJsb2NrLlxuICAnXFx1MDEwMCc6ICdBJywgICdcXHUwMTAyJzogJ0EnLCAnXFx1MDEwNCc6ICdBJyxcbiAgJ1xcdTAxMDEnOiAnYScsICAnXFx1MDEwMyc6ICdhJywgJ1xcdTAxMDUnOiAnYScsXG4gICdcXHUwMTA2JzogJ0MnLCAgJ1xcdTAxMDgnOiAnQycsICdcXHUwMTBhJzogJ0MnLCAnXFx1MDEwYyc6ICdDJyxcbiAgJ1xcdTAxMDcnOiAnYycsICAnXFx1MDEwOSc6ICdjJywgJ1xcdTAxMGInOiAnYycsICdcXHUwMTBkJzogJ2MnLFxuICAnXFx1MDEwZSc6ICdEJywgICdcXHUwMTEwJzogJ0QnLCAnXFx1MDEwZic6ICdkJywgJ1xcdTAxMTEnOiAnZCcsXG4gICdcXHUwMTEyJzogJ0UnLCAgJ1xcdTAxMTQnOiAnRScsICdcXHUwMTE2JzogJ0UnLCAnXFx1MDExOCc6ICdFJywgJ1xcdTAxMWEnOiAnRScsXG4gICdcXHUwMTEzJzogJ2UnLCAgJ1xcdTAxMTUnOiAnZScsICdcXHUwMTE3JzogJ2UnLCAnXFx1MDExOSc6ICdlJywgJ1xcdTAxMWInOiAnZScsXG4gICdcXHUwMTFjJzogJ0cnLCAgJ1xcdTAxMWUnOiAnRycsICdcXHUwMTIwJzogJ0cnLCAnXFx1MDEyMic6ICdHJyxcbiAgJ1xcdTAxMWQnOiAnZycsICAnXFx1MDExZic6ICdnJywgJ1xcdTAxMjEnOiAnZycsICdcXHUwMTIzJzogJ2cnLFxuICAnXFx1MDEyNCc6ICdIJywgICdcXHUwMTI2JzogJ0gnLCAnXFx1MDEyNSc6ICdoJywgJ1xcdTAxMjcnOiAnaCcsXG4gICdcXHUwMTI4JzogJ0knLCAgJ1xcdTAxMmEnOiAnSScsICdcXHUwMTJjJzogJ0knLCAnXFx1MDEyZSc6ICdJJywgJ1xcdTAxMzAnOiAnSScsXG4gICdcXHUwMTI5JzogJ2knLCAgJ1xcdTAxMmInOiAnaScsICdcXHUwMTJkJzogJ2knLCAnXFx1MDEyZic6ICdpJywgJ1xcdTAxMzEnOiAnaScsXG4gICdcXHUwMTM0JzogJ0onLCAgJ1xcdTAxMzUnOiAnaicsXG4gICdcXHUwMTM2JzogJ0snLCAgJ1xcdTAxMzcnOiAnaycsICdcXHUwMTM4JzogJ2snLFxuICAnXFx1MDEzOSc6ICdMJywgICdcXHUwMTNiJzogJ0wnLCAnXFx1MDEzZCc6ICdMJywgJ1xcdTAxM2YnOiAnTCcsICdcXHUwMTQxJzogJ0wnLFxuICAnXFx1MDEzYSc6ICdsJywgICdcXHUwMTNjJzogJ2wnLCAnXFx1MDEzZSc6ICdsJywgJ1xcdTAxNDAnOiAnbCcsICdcXHUwMTQyJzogJ2wnLFxuICAnXFx1MDE0Myc6ICdOJywgICdcXHUwMTQ1JzogJ04nLCAnXFx1MDE0Nyc6ICdOJywgJ1xcdTAxNGEnOiAnTicsXG4gICdcXHUwMTQ0JzogJ24nLCAgJ1xcdTAxNDYnOiAnbicsICdcXHUwMTQ4JzogJ24nLCAnXFx1MDE0Yic6ICduJyxcbiAgJ1xcdTAxNGMnOiAnTycsICAnXFx1MDE0ZSc6ICdPJywgJ1xcdTAxNTAnOiAnTycsXG4gICdcXHUwMTRkJzogJ28nLCAgJ1xcdTAxNGYnOiAnbycsICdcXHUwMTUxJzogJ28nLFxuICAnXFx1MDE1NCc6ICdSJywgICdcXHUwMTU2JzogJ1InLCAnXFx1MDE1OCc6ICdSJyxcbiAgJ1xcdTAxNTUnOiAncicsICAnXFx1MDE1Nyc6ICdyJywgJ1xcdTAxNTknOiAncicsXG4gICdcXHUwMTVhJzogJ1MnLCAgJ1xcdTAxNWMnOiAnUycsICdcXHUwMTVlJzogJ1MnLCAnXFx1MDE2MCc6ICdTJyxcbiAgJ1xcdTAxNWInOiAncycsICAnXFx1MDE1ZCc6ICdzJywgJ1xcdTAxNWYnOiAncycsICdcXHUwMTYxJzogJ3MnLFxuICAnXFx1MDE2Mic6ICdUJywgICdcXHUwMTY0JzogJ1QnLCAnXFx1MDE2Nic6ICdUJyxcbiAgJ1xcdTAxNjMnOiAndCcsICAnXFx1MDE2NSc6ICd0JywgJ1xcdTAxNjcnOiAndCcsXG4gICdcXHUwMTY4JzogJ1UnLCAgJ1xcdTAxNmEnOiAnVScsICdcXHUwMTZjJzogJ1UnLCAnXFx1MDE2ZSc6ICdVJywgJ1xcdTAxNzAnOiAnVScsICdcXHUwMTcyJzogJ1UnLFxuICAnXFx1MDE2OSc6ICd1JywgICdcXHUwMTZiJzogJ3UnLCAnXFx1MDE2ZCc6ICd1JywgJ1xcdTAxNmYnOiAndScsICdcXHUwMTcxJzogJ3UnLCAnXFx1MDE3Myc6ICd1JyxcbiAgJ1xcdTAxNzQnOiAnVycsICAnXFx1MDE3NSc6ICd3JyxcbiAgJ1xcdTAxNzYnOiAnWScsICAnXFx1MDE3Nyc6ICd5JywgJ1xcdTAxNzgnOiAnWScsXG4gICdcXHUwMTc5JzogJ1onLCAgJ1xcdTAxN2InOiAnWicsICdcXHUwMTdkJzogJ1onLFxuICAnXFx1MDE3YSc6ICd6JywgICdcXHUwMTdjJzogJ3onLCAnXFx1MDE3ZSc6ICd6JyxcbiAgJ1xcdTAxMzInOiAnSUonLCAnXFx1MDEzMyc6ICdpaicsXG4gICdcXHUwMTUyJzogJ09lJywgJ1xcdTAxNTMnOiAnb2UnLFxuICAnXFx1MDE0OSc6IFwiJ25cIiwgJ1xcdTAxN2YnOiAncydcbn07XG5cbi8qKlxuICogVXNlZCBieSBgXy5kZWJ1cnJgIHRvIGNvbnZlcnQgTGF0aW4tMSBTdXBwbGVtZW50IGFuZCBMYXRpbiBFeHRlbmRlZC1BXG4gKiBsZXR0ZXJzIHRvIGJhc2ljIExhdGluIGxldHRlcnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBsZXR0ZXIgVGhlIG1hdGNoZWQgbGV0dGVyIHRvIGRlYnVyci5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGRlYnVycmVkIGxldHRlci5cbiAqL1xudmFyIGRlYnVyckxldHRlciA9IGJhc2VQcm9wZXJ0eU9mKGRlYnVycmVkTGV0dGVycyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZGVidXJyTGV0dGVyO1xuIiwiLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBnbG9iYWxgIGZyb20gTm9kZS5qcy4gKi9cbnZhciBmcmVlR2xvYmFsID0gdHlwZW9mIGdsb2JhbCA9PSAnb2JqZWN0JyAmJiBnbG9iYWwgJiYgZ2xvYmFsLk9iamVjdCA9PT0gT2JqZWN0ICYmIGdsb2JhbDtcblxubW9kdWxlLmV4cG9ydHMgPSBmcmVlR2xvYmFsO1xuIiwidmFyIGZyZWVHbG9iYWwgPSByZXF1aXJlKCcuL19mcmVlR2xvYmFsJyk7XG5cbi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgc2VsZmAuICovXG52YXIgZnJlZVNlbGYgPSB0eXBlb2Ygc2VsZiA9PSAnb2JqZWN0JyAmJiBzZWxmICYmIHNlbGYuT2JqZWN0ID09PSBPYmplY3QgJiYgc2VsZjtcblxuLyoqIFVzZWQgYXMgYSByZWZlcmVuY2UgdG8gdGhlIGdsb2JhbCBvYmplY3QuICovXG52YXIgcm9vdCA9IGZyZWVHbG9iYWwgfHwgZnJlZVNlbGYgfHwgRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcblxubW9kdWxlLmV4cG9ydHMgPSByb290O1xuIiwidmFyIHJvb3QgPSByZXF1aXJlKCcuL19yb290Jyk7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIFN5bWJvbCA9IHJvb3QuU3ltYm9sO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFN5bWJvbDtcbiIsIi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLm1hcGAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlXG4gKiBzaG9ydGhhbmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgbWFwcGVkIGFycmF5LlxuICovXG5mdW5jdGlvbiBhcnJheU1hcChhcnJheSwgaXRlcmF0ZWUpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aCxcbiAgICAgIHJlc3VsdCA9IEFycmF5KGxlbmd0aCk7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICByZXN1bHRbaW5kZXhdID0gaXRlcmF0ZWUoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXJyYXlNYXA7XG4iLCIvKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYW4gYEFycmF5YCBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gYXJyYXksIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0FycmF5KFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5KGRvY3VtZW50LmJvZHkuY2hpbGRyZW4pO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzQXJyYXkoJ2FiYycpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzQXJyYXkoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbnZhciBpc0FycmF5ID0gQXJyYXkuaXNBcnJheTtcblxubW9kdWxlLmV4cG9ydHMgPSBpc0FycmF5O1xuIiwidmFyIFN5bWJvbCA9IHJlcXVpcmUoJy4vX1N5bWJvbCcpO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIFVzZWQgdG8gcmVzb2x2ZSB0aGVcbiAqIFtgdG9TdHJpbmdUYWdgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1vYmplY3QucHJvdG90eXBlLnRvc3RyaW5nKVxuICogb2YgdmFsdWVzLlxuICovXG52YXIgbmF0aXZlT2JqZWN0VG9TdHJpbmcgPSBvYmplY3RQcm90by50b1N0cmluZztcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgc3ltVG9TdHJpbmdUYWcgPSBTeW1ib2wgPyBTeW1ib2wudG9TdHJpbmdUYWcgOiB1bmRlZmluZWQ7XG5cbi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlR2V0VGFnYCB3aGljaCBpZ25vcmVzIGBTeW1ib2wudG9TdHJpbmdUYWdgIHZhbHVlcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSByYXcgYHRvU3RyaW5nVGFnYC5cbiAqL1xuZnVuY3Rpb24gZ2V0UmF3VGFnKHZhbHVlKSB7XG4gIHZhciBpc093biA9IGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsIHN5bVRvU3RyaW5nVGFnKSxcbiAgICAgIHRhZyA9IHZhbHVlW3N5bVRvU3RyaW5nVGFnXTtcblxuICB0cnkge1xuICAgIHZhbHVlW3N5bVRvU3RyaW5nVGFnXSA9IHVuZGVmaW5lZDtcbiAgICB2YXIgdW5tYXNrZWQgPSB0cnVlO1xuICB9IGNhdGNoIChlKSB7fVxuXG4gIHZhciByZXN1bHQgPSBuYXRpdmVPYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKTtcbiAgaWYgKHVubWFza2VkKSB7XG4gICAgaWYgKGlzT3duKSB7XG4gICAgICB2YWx1ZVtzeW1Ub1N0cmluZ1RhZ10gPSB0YWc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbGV0ZSB2YWx1ZVtzeW1Ub1N0cmluZ1RhZ107XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0UmF3VGFnO1xuIiwiLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqXG4gKiBVc2VkIHRvIHJlc29sdmUgdGhlXG4gKiBbYHRvU3RyaW5nVGFnYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtb2JqZWN0LnByb3RvdHlwZS50b3N0cmluZylcbiAqIG9mIHZhbHVlcy5cbiAqL1xudmFyIG5hdGl2ZU9iamVjdFRvU3RyaW5nID0gb2JqZWN0UHJvdG8udG9TdHJpbmc7XG5cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhIHN0cmluZyB1c2luZyBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZ2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgc3RyaW5nLlxuICovXG5mdW5jdGlvbiBvYmplY3RUb1N0cmluZyh2YWx1ZSkge1xuICByZXR1cm4gbmF0aXZlT2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gb2JqZWN0VG9TdHJpbmc7XG4iLCJ2YXIgU3ltYm9sID0gcmVxdWlyZSgnLi9fU3ltYm9sJyksXG4gICAgZ2V0UmF3VGFnID0gcmVxdWlyZSgnLi9fZ2V0UmF3VGFnJyksXG4gICAgb2JqZWN0VG9TdHJpbmcgPSByZXF1aXJlKCcuL19vYmplY3RUb1N0cmluZycpO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgbnVsbFRhZyA9ICdbb2JqZWN0IE51bGxdJyxcbiAgICB1bmRlZmluZWRUYWcgPSAnW29iamVjdCBVbmRlZmluZWRdJztcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgc3ltVG9TdHJpbmdUYWcgPSBTeW1ib2wgPyBTeW1ib2wudG9TdHJpbmdUYWcgOiB1bmRlZmluZWQ7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYGdldFRhZ2Agd2l0aG91dCBmYWxsYmFja3MgZm9yIGJ1Z2d5IGVudmlyb25tZW50cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBgdG9TdHJpbmdUYWdgLlxuICovXG5mdW5jdGlvbiBiYXNlR2V0VGFnKHZhbHVlKSB7XG4gIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWRUYWcgOiBudWxsVGFnO1xuICB9XG4gIHJldHVybiAoc3ltVG9TdHJpbmdUYWcgJiYgc3ltVG9TdHJpbmdUYWcgaW4gT2JqZWN0KHZhbHVlKSlcbiAgICA/IGdldFJhd1RhZyh2YWx1ZSlcbiAgICA6IG9iamVjdFRvU3RyaW5nKHZhbHVlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlR2V0VGFnO1xuIiwiLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBvYmplY3QtbGlrZS4gQSB2YWx1ZSBpcyBvYmplY3QtbGlrZSBpZiBpdCdzIG5vdCBgbnVsbGBcbiAqIGFuZCBoYXMgYSBgdHlwZW9mYCByZXN1bHQgb2YgXCJvYmplY3RcIi5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBvYmplY3QtbGlrZSwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZSh7fSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShfLm5vb3ApO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShudWxsKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0TGlrZSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNPYmplY3RMaWtlO1xuIiwidmFyIGJhc2VHZXRUYWcgPSByZXF1aXJlKCcuL19iYXNlR2V0VGFnJyksXG4gICAgaXNPYmplY3RMaWtlID0gcmVxdWlyZSgnLi9pc09iamVjdExpa2UnKTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIHN5bWJvbFRhZyA9ICdbb2JqZWN0IFN5bWJvbF0nO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgU3ltYm9sYCBwcmltaXRpdmUgb3Igb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgc3ltYm9sLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNTeW1ib2woU3ltYm9sLml0ZXJhdG9yKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzU3ltYm9sKCdhYmMnKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzU3ltYm9sKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ3N5bWJvbCcgfHxcbiAgICAoaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBiYXNlR2V0VGFnKHZhbHVlKSA9PSBzeW1ib2xUYWcpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzU3ltYm9sO1xuIiwidmFyIFN5bWJvbCA9IHJlcXVpcmUoJy4vX1N5bWJvbCcpLFxuICAgIGFycmF5TWFwID0gcmVxdWlyZSgnLi9fYXJyYXlNYXAnKSxcbiAgICBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5JyksXG4gICAgaXNTeW1ib2wgPSByZXF1aXJlKCcuL2lzU3ltYm9sJyk7XG5cbi8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqL1xudmFyIElORklOSVRZID0gMSAvIDA7XG5cbi8qKiBVc2VkIHRvIGNvbnZlcnQgc3ltYm9scyB0byBwcmltaXRpdmVzIGFuZCBzdHJpbmdzLiAqL1xudmFyIHN5bWJvbFByb3RvID0gU3ltYm9sID8gU3ltYm9sLnByb3RvdHlwZSA6IHVuZGVmaW5lZCxcbiAgICBzeW1ib2xUb1N0cmluZyA9IHN5bWJvbFByb3RvID8gc3ltYm9sUHJvdG8udG9TdHJpbmcgOiB1bmRlZmluZWQ7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udG9TdHJpbmdgIHdoaWNoIGRvZXNuJ3QgY29udmVydCBudWxsaXNoXG4gKiB2YWx1ZXMgdG8gZW1wdHkgc3RyaW5ncy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcHJvY2Vzcy5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHN0cmluZy5cbiAqL1xuZnVuY3Rpb24gYmFzZVRvU3RyaW5nKHZhbHVlKSB7XG4gIC8vIEV4aXQgZWFybHkgZm9yIHN0cmluZ3MgdG8gYXZvaWQgYSBwZXJmb3JtYW5jZSBoaXQgaW4gc29tZSBlbnZpcm9ubWVudHMuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgLy8gUmVjdXJzaXZlbHkgY29udmVydCB2YWx1ZXMgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS5cbiAgICByZXR1cm4gYXJyYXlNYXAodmFsdWUsIGJhc2VUb1N0cmluZykgKyAnJztcbiAgfVxuICBpZiAoaXNTeW1ib2wodmFsdWUpKSB7XG4gICAgcmV0dXJuIHN5bWJvbFRvU3RyaW5nID8gc3ltYm9sVG9TdHJpbmcuY2FsbCh2YWx1ZSkgOiAnJztcbiAgfVxuICB2YXIgcmVzdWx0ID0gKHZhbHVlICsgJycpO1xuICByZXR1cm4gKHJlc3VsdCA9PSAnMCcgJiYgKDEgLyB2YWx1ZSkgPT0gLUlORklOSVRZKSA/ICctMCcgOiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVRvU3RyaW5nO1xuIiwidmFyIGJhc2VUb1N0cmluZyA9IHJlcXVpcmUoJy4vX2Jhc2VUb1N0cmluZycpO1xuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBzdHJpbmcuIEFuIGVtcHR5IHN0cmluZyBpcyByZXR1cm5lZCBmb3IgYG51bGxgXG4gKiBhbmQgYHVuZGVmaW5lZGAgdmFsdWVzLiBUaGUgc2lnbiBvZiBgLTBgIGlzIHByZXNlcnZlZC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBzdHJpbmcuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udG9TdHJpbmcobnVsbCk7XG4gKiAvLyA9PiAnJ1xuICpcbiAqIF8udG9TdHJpbmcoLTApO1xuICogLy8gPT4gJy0wJ1xuICpcbiAqIF8udG9TdHJpbmcoWzEsIDIsIDNdKTtcbiAqIC8vID0+ICcxLDIsMydcbiAqL1xuZnVuY3Rpb24gdG9TdHJpbmcodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID09IG51bGwgPyAnJyA6IGJhc2VUb1N0cmluZyh2YWx1ZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdG9TdHJpbmc7XG4iLCJ2YXIgZGVidXJyTGV0dGVyID0gcmVxdWlyZSgnLi9fZGVidXJyTGV0dGVyJyksXG4gICAgdG9TdHJpbmcgPSByZXF1aXJlKCcuL3RvU3RyaW5nJyk7XG5cbi8qKiBVc2VkIHRvIG1hdGNoIExhdGluIFVuaWNvZGUgbGV0dGVycyAoZXhjbHVkaW5nIG1hdGhlbWF0aWNhbCBvcGVyYXRvcnMpLiAqL1xudmFyIHJlTGF0aW4gPSAvW1xceGMwLVxceGQ2XFx4ZDgtXFx4ZjZcXHhmOC1cXHhmZlxcdTAxMDAtXFx1MDE3Zl0vZztcblxuLyoqIFVzZWQgdG8gY29tcG9zZSB1bmljb2RlIGNoYXJhY3RlciBjbGFzc2VzLiAqL1xudmFyIHJzQ29tYm9NYXJrc1JhbmdlID0gJ1xcXFx1MDMwMC1cXFxcdTAzNmYnLFxuICAgIHJlQ29tYm9IYWxmTWFya3NSYW5nZSA9ICdcXFxcdWZlMjAtXFxcXHVmZTJmJyxcbiAgICByc0NvbWJvU3ltYm9sc1JhbmdlID0gJ1xcXFx1MjBkMC1cXFxcdTIwZmYnLFxuICAgIHJzQ29tYm9SYW5nZSA9IHJzQ29tYm9NYXJrc1JhbmdlICsgcmVDb21ib0hhbGZNYXJrc1JhbmdlICsgcnNDb21ib1N5bWJvbHNSYW5nZTtcblxuLyoqIFVzZWQgdG8gY29tcG9zZSB1bmljb2RlIGNhcHR1cmUgZ3JvdXBzLiAqL1xudmFyIHJzQ29tYm8gPSAnWycgKyByc0NvbWJvUmFuZ2UgKyAnXSc7XG5cbi8qKlxuICogVXNlZCB0byBtYXRjaCBbY29tYmluaW5nIGRpYWNyaXRpY2FsIG1hcmtzXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Db21iaW5pbmdfRGlhY3JpdGljYWxfTWFya3MpIGFuZFxuICogW2NvbWJpbmluZyBkaWFjcml0aWNhbCBtYXJrcyBmb3Igc3ltYm9sc10oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQ29tYmluaW5nX0RpYWNyaXRpY2FsX01hcmtzX2Zvcl9TeW1ib2xzKS5cbiAqL1xudmFyIHJlQ29tYm9NYXJrID0gUmVnRXhwKHJzQ29tYm8sICdnJyk7XG5cbi8qKlxuICogRGVidXJycyBgc3RyaW5nYCBieSBjb252ZXJ0aW5nXG4gKiBbTGF0aW4tMSBTdXBwbGVtZW50XShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9MYXRpbi0xX1N1cHBsZW1lbnRfKFVuaWNvZGVfYmxvY2spI0NoYXJhY3Rlcl90YWJsZSlcbiAqIGFuZCBbTGF0aW4gRXh0ZW5kZWQtQV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTGF0aW5fRXh0ZW5kZWQtQSlcbiAqIGxldHRlcnMgdG8gYmFzaWMgTGF0aW4gbGV0dGVycyBhbmQgcmVtb3ZpbmdcbiAqIFtjb21iaW5pbmcgZGlhY3JpdGljYWwgbWFya3NdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0NvbWJpbmluZ19EaWFjcml0aWNhbF9NYXJrcykuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAzLjAuMFxuICogQGNhdGVnb3J5IFN0cmluZ1xuICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gZGVidXJyLlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgZGVidXJyZWQgc3RyaW5nLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmRlYnVycignZMOpasOgIHZ1Jyk7XG4gKiAvLyA9PiAnZGVqYSB2dSdcbiAqL1xuZnVuY3Rpb24gZGVidXJyKHN0cmluZykge1xuICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICByZXR1cm4gc3RyaW5nICYmIHN0cmluZy5yZXBsYWNlKHJlTGF0aW4sIGRlYnVyckxldHRlcikucmVwbGFjZShyZUNvbWJvTWFyaywgJycpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGRlYnVycjtcbiIsIi8qKiBVc2VkIHRvIG1hdGNoIHdvcmRzIGNvbXBvc2VkIG9mIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzLiAqL1xudmFyIHJlQXNjaWlXb3JkID0gL1teXFx4MDAtXFx4MmZcXHgzYS1cXHg0MFxceDViLVxceDYwXFx4N2ItXFx4N2ZdKy9nO1xuXG4vKipcbiAqIFNwbGl0cyBhbiBBU0NJSSBgc3RyaW5nYCBpbnRvIGFuIGFycmF5IG9mIGl0cyB3b3Jkcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IFRoZSBzdHJpbmcgdG8gaW5zcGVjdC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgd29yZHMgb2YgYHN0cmluZ2AuXG4gKi9cbmZ1bmN0aW9uIGFzY2lpV29yZHMoc3RyaW5nKSB7XG4gIHJldHVybiBzdHJpbmcubWF0Y2gocmVBc2NpaVdvcmQpIHx8IFtdO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGFzY2lpV29yZHM7XG4iLCIvKiogVXNlZCB0byBkZXRlY3Qgc3RyaW5ncyB0aGF0IG5lZWQgYSBtb3JlIHJvYnVzdCByZWdleHAgdG8gbWF0Y2ggd29yZHMuICovXG52YXIgcmVIYXNVbmljb2RlV29yZCA9IC9bYS16XVtBLVpdfFtBLVpdezJ9W2Etel18WzAtOV1bYS16QS1aXXxbYS16QS1aXVswLTldfFteYS16QS1aMC05IF0vO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgc3RyaW5nYCBjb250YWlucyBhIHdvcmQgY29tcG9zZWQgb2YgVW5pY29kZSBzeW1ib2xzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gaW5zcGVjdC5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhIHdvcmQgaXMgZm91bmQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaGFzVW5pY29kZVdvcmQoc3RyaW5nKSB7XG4gIHJldHVybiByZUhhc1VuaWNvZGVXb3JkLnRlc3Qoc3RyaW5nKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBoYXNVbmljb2RlV29yZDtcbiIsIi8qKiBVc2VkIHRvIGNvbXBvc2UgdW5pY29kZSBjaGFyYWN0ZXIgY2xhc3Nlcy4gKi9cbnZhciByc0FzdHJhbFJhbmdlID0gJ1xcXFx1ZDgwMC1cXFxcdWRmZmYnLFxuICAgIHJzQ29tYm9NYXJrc1JhbmdlID0gJ1xcXFx1MDMwMC1cXFxcdTAzNmYnLFxuICAgIHJlQ29tYm9IYWxmTWFya3NSYW5nZSA9ICdcXFxcdWZlMjAtXFxcXHVmZTJmJyxcbiAgICByc0NvbWJvU3ltYm9sc1JhbmdlID0gJ1xcXFx1MjBkMC1cXFxcdTIwZmYnLFxuICAgIHJzQ29tYm9SYW5nZSA9IHJzQ29tYm9NYXJrc1JhbmdlICsgcmVDb21ib0hhbGZNYXJrc1JhbmdlICsgcnNDb21ib1N5bWJvbHNSYW5nZSxcbiAgICByc0RpbmdiYXRSYW5nZSA9ICdcXFxcdTI3MDAtXFxcXHUyN2JmJyxcbiAgICByc0xvd2VyUmFuZ2UgPSAnYS16XFxcXHhkZi1cXFxceGY2XFxcXHhmOC1cXFxceGZmJyxcbiAgICByc01hdGhPcFJhbmdlID0gJ1xcXFx4YWNcXFxceGIxXFxcXHhkN1xcXFx4ZjcnLFxuICAgIHJzTm9uQ2hhclJhbmdlID0gJ1xcXFx4MDAtXFxcXHgyZlxcXFx4M2EtXFxcXHg0MFxcXFx4NWItXFxcXHg2MFxcXFx4N2ItXFxcXHhiZicsXG4gICAgcnNQdW5jdHVhdGlvblJhbmdlID0gJ1xcXFx1MjAwMC1cXFxcdTIwNmYnLFxuICAgIHJzU3BhY2VSYW5nZSA9ICcgXFxcXHRcXFxceDBiXFxcXGZcXFxceGEwXFxcXHVmZWZmXFxcXG5cXFxcclxcXFx1MjAyOFxcXFx1MjAyOVxcXFx1MTY4MFxcXFx1MTgwZVxcXFx1MjAwMFxcXFx1MjAwMVxcXFx1MjAwMlxcXFx1MjAwM1xcXFx1MjAwNFxcXFx1MjAwNVxcXFx1MjAwNlxcXFx1MjAwN1xcXFx1MjAwOFxcXFx1MjAwOVxcXFx1MjAwYVxcXFx1MjAyZlxcXFx1MjA1ZlxcXFx1MzAwMCcsXG4gICAgcnNVcHBlclJhbmdlID0gJ0EtWlxcXFx4YzAtXFxcXHhkNlxcXFx4ZDgtXFxcXHhkZScsXG4gICAgcnNWYXJSYW5nZSA9ICdcXFxcdWZlMGVcXFxcdWZlMGYnLFxuICAgIHJzQnJlYWtSYW5nZSA9IHJzTWF0aE9wUmFuZ2UgKyByc05vbkNoYXJSYW5nZSArIHJzUHVuY3R1YXRpb25SYW5nZSArIHJzU3BhY2VSYW5nZTtcblxuLyoqIFVzZWQgdG8gY29tcG9zZSB1bmljb2RlIGNhcHR1cmUgZ3JvdXBzLiAqL1xudmFyIHJzQXBvcyA9IFwiWydcXHUyMDE5XVwiLFxuICAgIHJzQnJlYWsgPSAnWycgKyByc0JyZWFrUmFuZ2UgKyAnXScsXG4gICAgcnNDb21ibyA9ICdbJyArIHJzQ29tYm9SYW5nZSArICddJyxcbiAgICByc0RpZ2l0cyA9ICdcXFxcZCsnLFxuICAgIHJzRGluZ2JhdCA9ICdbJyArIHJzRGluZ2JhdFJhbmdlICsgJ10nLFxuICAgIHJzTG93ZXIgPSAnWycgKyByc0xvd2VyUmFuZ2UgKyAnXScsXG4gICAgcnNNaXNjID0gJ1teJyArIHJzQXN0cmFsUmFuZ2UgKyByc0JyZWFrUmFuZ2UgKyByc0RpZ2l0cyArIHJzRGluZ2JhdFJhbmdlICsgcnNMb3dlclJhbmdlICsgcnNVcHBlclJhbmdlICsgJ10nLFxuICAgIHJzRml0eiA9ICdcXFxcdWQ4M2NbXFxcXHVkZmZiLVxcXFx1ZGZmZl0nLFxuICAgIHJzTW9kaWZpZXIgPSAnKD86JyArIHJzQ29tYm8gKyAnfCcgKyByc0ZpdHogKyAnKScsXG4gICAgcnNOb25Bc3RyYWwgPSAnW14nICsgcnNBc3RyYWxSYW5nZSArICddJyxcbiAgICByc1JlZ2lvbmFsID0gJyg/OlxcXFx1ZDgzY1tcXFxcdWRkZTYtXFxcXHVkZGZmXSl7Mn0nLFxuICAgIHJzU3VyclBhaXIgPSAnW1xcXFx1ZDgwMC1cXFxcdWRiZmZdW1xcXFx1ZGMwMC1cXFxcdWRmZmZdJyxcbiAgICByc1VwcGVyID0gJ1snICsgcnNVcHBlclJhbmdlICsgJ10nLFxuICAgIHJzWldKID0gJ1xcXFx1MjAwZCc7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgdW5pY29kZSByZWdleGVzLiAqL1xudmFyIHJzTWlzY0xvd2VyID0gJyg/OicgKyByc0xvd2VyICsgJ3wnICsgcnNNaXNjICsgJyknLFxuICAgIHJzTWlzY1VwcGVyID0gJyg/OicgKyByc1VwcGVyICsgJ3wnICsgcnNNaXNjICsgJyknLFxuICAgIHJzT3B0Q29udHJMb3dlciA9ICcoPzonICsgcnNBcG9zICsgJyg/OmR8bGx8bXxyZXxzfHR8dmUpKT8nLFxuICAgIHJzT3B0Q29udHJVcHBlciA9ICcoPzonICsgcnNBcG9zICsgJyg/OkR8TEx8TXxSRXxTfFR8VkUpKT8nLFxuICAgIHJlT3B0TW9kID0gcnNNb2RpZmllciArICc/JyxcbiAgICByc09wdFZhciA9ICdbJyArIHJzVmFyUmFuZ2UgKyAnXT8nLFxuICAgIHJzT3B0Sm9pbiA9ICcoPzonICsgcnNaV0ogKyAnKD86JyArIFtyc05vbkFzdHJhbCwgcnNSZWdpb25hbCwgcnNTdXJyUGFpcl0uam9pbignfCcpICsgJyknICsgcnNPcHRWYXIgKyByZU9wdE1vZCArICcpKicsXG4gICAgcnNPcmRMb3dlciA9ICdcXFxcZCooPzoxc3R8Mm5kfDNyZHwoPyFbMTIzXSlcXFxcZHRoKSg/PVxcXFxifFtBLVpfXSknLFxuICAgIHJzT3JkVXBwZXIgPSAnXFxcXGQqKD86MVNUfDJORHwzUkR8KD8hWzEyM10pXFxcXGRUSCkoPz1cXFxcYnxbYS16X10pJyxcbiAgICByc1NlcSA9IHJzT3B0VmFyICsgcmVPcHRNb2QgKyByc09wdEpvaW4sXG4gICAgcnNFbW9qaSA9ICcoPzonICsgW3JzRGluZ2JhdCwgcnNSZWdpb25hbCwgcnNTdXJyUGFpcl0uam9pbignfCcpICsgJyknICsgcnNTZXE7XG5cbi8qKiBVc2VkIHRvIG1hdGNoIGNvbXBsZXggb3IgY29tcG91bmQgd29yZHMuICovXG52YXIgcmVVbmljb2RlV29yZCA9IFJlZ0V4cChbXG4gIHJzVXBwZXIgKyAnPycgKyByc0xvd2VyICsgJysnICsgcnNPcHRDb250ckxvd2VyICsgJyg/PScgKyBbcnNCcmVhaywgcnNVcHBlciwgJyQnXS5qb2luKCd8JykgKyAnKScsXG4gIHJzTWlzY1VwcGVyICsgJysnICsgcnNPcHRDb250clVwcGVyICsgJyg/PScgKyBbcnNCcmVhaywgcnNVcHBlciArIHJzTWlzY0xvd2VyLCAnJCddLmpvaW4oJ3wnKSArICcpJyxcbiAgcnNVcHBlciArICc/JyArIHJzTWlzY0xvd2VyICsgJysnICsgcnNPcHRDb250ckxvd2VyLFxuICByc1VwcGVyICsgJysnICsgcnNPcHRDb250clVwcGVyLFxuICByc09yZFVwcGVyLFxuICByc09yZExvd2VyLFxuICByc0RpZ2l0cyxcbiAgcnNFbW9qaVxuXS5qb2luKCd8JyksICdnJyk7XG5cbi8qKlxuICogU3BsaXRzIGEgVW5pY29kZSBgc3RyaW5nYCBpbnRvIGFuIGFycmF5IG9mIGl0cyB3b3Jkcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IFRoZSBzdHJpbmcgdG8gaW5zcGVjdC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgd29yZHMgb2YgYHN0cmluZ2AuXG4gKi9cbmZ1bmN0aW9uIHVuaWNvZGVXb3JkcyhzdHJpbmcpIHtcbiAgcmV0dXJuIHN0cmluZy5tYXRjaChyZVVuaWNvZGVXb3JkKSB8fCBbXTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB1bmljb2RlV29yZHM7XG4iLCJ2YXIgYXNjaWlXb3JkcyA9IHJlcXVpcmUoJy4vX2FzY2lpV29yZHMnKSxcbiAgICBoYXNVbmljb2RlV29yZCA9IHJlcXVpcmUoJy4vX2hhc1VuaWNvZGVXb3JkJyksXG4gICAgdG9TdHJpbmcgPSByZXF1aXJlKCcuL3RvU3RyaW5nJyksXG4gICAgdW5pY29kZVdvcmRzID0gcmVxdWlyZSgnLi9fdW5pY29kZVdvcmRzJyk7XG5cbi8qKlxuICogU3BsaXRzIGBzdHJpbmdgIGludG8gYW4gYXJyYXkgb2YgaXRzIHdvcmRzLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMy4wLjBcbiAqIEBjYXRlZ29yeSBTdHJpbmdcbiAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGluc3BlY3QuXG4gKiBAcGFyYW0ge1JlZ0V4cHxzdHJpbmd9IFtwYXR0ZXJuXSBUaGUgcGF0dGVybiB0byBtYXRjaCB3b3Jkcy5cbiAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHdvcmRzIG9mIGBzdHJpbmdgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLndvcmRzKCdmcmVkLCBiYXJuZXksICYgcGViYmxlcycpO1xuICogLy8gPT4gWydmcmVkJywgJ2Jhcm5leScsICdwZWJibGVzJ11cbiAqXG4gKiBfLndvcmRzKCdmcmVkLCBiYXJuZXksICYgcGViYmxlcycsIC9bXiwgXSsvZyk7XG4gKiAvLyA9PiBbJ2ZyZWQnLCAnYmFybmV5JywgJyYnLCAncGViYmxlcyddXG4gKi9cbmZ1bmN0aW9uIHdvcmRzKHN0cmluZywgcGF0dGVybiwgZ3VhcmQpIHtcbiAgc3RyaW5nID0gdG9TdHJpbmcoc3RyaW5nKTtcbiAgcGF0dGVybiA9IGd1YXJkID8gdW5kZWZpbmVkIDogcGF0dGVybjtcblxuICBpZiAocGF0dGVybiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGhhc1VuaWNvZGVXb3JkKHN0cmluZykgPyB1bmljb2RlV29yZHMoc3RyaW5nKSA6IGFzY2lpV29yZHMoc3RyaW5nKTtcbiAgfVxuICByZXR1cm4gc3RyaW5nLm1hdGNoKHBhdHRlcm4pIHx8IFtdO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHdvcmRzO1xuIiwidmFyIGFycmF5UmVkdWNlID0gcmVxdWlyZSgnLi9fYXJyYXlSZWR1Y2UnKSxcbiAgICBkZWJ1cnIgPSByZXF1aXJlKCcuL2RlYnVycicpLFxuICAgIHdvcmRzID0gcmVxdWlyZSgnLi93b3JkcycpO1xuXG4vKiogVXNlZCB0byBjb21wb3NlIHVuaWNvZGUgY2FwdHVyZSBncm91cHMuICovXG52YXIgcnNBcG9zID0gXCJbJ1xcdTIwMTldXCI7XG5cbi8qKiBVc2VkIHRvIG1hdGNoIGFwb3N0cm9waGVzLiAqL1xudmFyIHJlQXBvcyA9IFJlZ0V4cChyc0Fwb3MsICdnJyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZ1bmN0aW9uIGxpa2UgYF8uY2FtZWxDYXNlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgVGhlIGZ1bmN0aW9uIHRvIGNvbWJpbmUgZWFjaCB3b3JkLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY29tcG91bmRlciBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlQ29tcG91bmRlcihjYWxsYmFjaykge1xuICByZXR1cm4gZnVuY3Rpb24oc3RyaW5nKSB7XG4gICAgcmV0dXJuIGFycmF5UmVkdWNlKHdvcmRzKGRlYnVycihzdHJpbmcpLnJlcGxhY2UocmVBcG9zLCAnJykpLCBjYWxsYmFjaywgJycpO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNyZWF0ZUNvbXBvdW5kZXI7XG4iLCIvKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnNsaWNlYCB3aXRob3V0IGFuIGl0ZXJhdGVlIGNhbGwgZ3VhcmQuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBzbGljZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9MF0gVGhlIHN0YXJ0IHBvc2l0aW9uLlxuICogQHBhcmFtIHtudW1iZXJ9IFtlbmQ9YXJyYXkubGVuZ3RoXSBUaGUgZW5kIHBvc2l0aW9uLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLlxuICovXG5mdW5jdGlvbiBiYXNlU2xpY2UoYXJyYXksIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cbiAgaWYgKHN0YXJ0IDwgMCkge1xuICAgIHN0YXJ0ID0gLXN0YXJ0ID4gbGVuZ3RoID8gMCA6IChsZW5ndGggKyBzdGFydCk7XG4gIH1cbiAgZW5kID0gZW5kID4gbGVuZ3RoID8gbGVuZ3RoIDogZW5kO1xuICBpZiAoZW5kIDwgMCkge1xuICAgIGVuZCArPSBsZW5ndGg7XG4gIH1cbiAgbGVuZ3RoID0gc3RhcnQgPiBlbmQgPyAwIDogKChlbmQgLSBzdGFydCkgPj4+IDApO1xuICBzdGFydCA+Pj49IDA7XG5cbiAgdmFyIHJlc3VsdCA9IEFycmF5KGxlbmd0aCk7XG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgcmVzdWx0W2luZGV4XSA9IGFycmF5W2luZGV4ICsgc3RhcnRdO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVNsaWNlO1xuIiwidmFyIGJhc2VTbGljZSA9IHJlcXVpcmUoJy4vX2Jhc2VTbGljZScpO1xuXG4vKipcbiAqIENhc3RzIGBhcnJheWAgdG8gYSBzbGljZSBpZiBpdCdzIG5lZWRlZC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gKiBAcGFyYW0ge251bWJlcn0gc3RhcnQgVGhlIHN0YXJ0IHBvc2l0aW9uLlxuICogQHBhcmFtIHtudW1iZXJ9IFtlbmQ9YXJyYXkubGVuZ3RoXSBUaGUgZW5kIHBvc2l0aW9uLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBjYXN0IHNsaWNlLlxuICovXG5mdW5jdGlvbiBjYXN0U2xpY2UoYXJyYXksIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcbiAgZW5kID0gZW5kID09PSB1bmRlZmluZWQgPyBsZW5ndGggOiBlbmQ7XG4gIHJldHVybiAoIXN0YXJ0ICYmIGVuZCA+PSBsZW5ndGgpID8gYXJyYXkgOiBiYXNlU2xpY2UoYXJyYXksIHN0YXJ0LCBlbmQpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNhc3RTbGljZTtcbiIsIi8qKiBVc2VkIHRvIGNvbXBvc2UgdW5pY29kZSBjaGFyYWN0ZXIgY2xhc3Nlcy4gKi9cbnZhciByc0FzdHJhbFJhbmdlID0gJ1xcXFx1ZDgwMC1cXFxcdWRmZmYnLFxuICAgIHJzQ29tYm9NYXJrc1JhbmdlID0gJ1xcXFx1MDMwMC1cXFxcdTAzNmYnLFxuICAgIHJlQ29tYm9IYWxmTWFya3NSYW5nZSA9ICdcXFxcdWZlMjAtXFxcXHVmZTJmJyxcbiAgICByc0NvbWJvU3ltYm9sc1JhbmdlID0gJ1xcXFx1MjBkMC1cXFxcdTIwZmYnLFxuICAgIHJzQ29tYm9SYW5nZSA9IHJzQ29tYm9NYXJrc1JhbmdlICsgcmVDb21ib0hhbGZNYXJrc1JhbmdlICsgcnNDb21ib1N5bWJvbHNSYW5nZSxcbiAgICByc1ZhclJhbmdlID0gJ1xcXFx1ZmUwZVxcXFx1ZmUwZic7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgdW5pY29kZSBjYXB0dXJlIGdyb3Vwcy4gKi9cbnZhciByc1pXSiA9ICdcXFxcdTIwMGQnO1xuXG4vKiogVXNlZCB0byBkZXRlY3Qgc3RyaW5ncyB3aXRoIFt6ZXJvLXdpZHRoIGpvaW5lcnMgb3IgY29kZSBwb2ludHMgZnJvbSB0aGUgYXN0cmFsIHBsYW5lc10oaHR0cDovL2Vldi5lZS9ibG9nLzIwMTUvMDkvMTIvZGFyay1jb3JuZXJzLW9mLXVuaWNvZGUvKS4gKi9cbnZhciByZUhhc1VuaWNvZGUgPSBSZWdFeHAoJ1snICsgcnNaV0ogKyByc0FzdHJhbFJhbmdlICArIHJzQ29tYm9SYW5nZSArIHJzVmFyUmFuZ2UgKyAnXScpO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgc3RyaW5nYCBjb250YWlucyBVbmljb2RlIHN5bWJvbHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBpbnNwZWN0LlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGEgc3ltYm9sIGlzIGZvdW5kLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGhhc1VuaWNvZGUoc3RyaW5nKSB7XG4gIHJldHVybiByZUhhc1VuaWNvZGUudGVzdChzdHJpbmcpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGhhc1VuaWNvZGU7XG4iLCIvKipcbiAqIENvbnZlcnRzIGFuIEFTQ0lJIGBzdHJpbmdgIHRvIGFuIGFycmF5LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgY29udmVydGVkIGFycmF5LlxuICovXG5mdW5jdGlvbiBhc2NpaVRvQXJyYXkoc3RyaW5nKSB7XG4gIHJldHVybiBzdHJpbmcuc3BsaXQoJycpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGFzY2lpVG9BcnJheTtcbiIsIi8qKiBVc2VkIHRvIGNvbXBvc2UgdW5pY29kZSBjaGFyYWN0ZXIgY2xhc3Nlcy4gKi9cbnZhciByc0FzdHJhbFJhbmdlID0gJ1xcXFx1ZDgwMC1cXFxcdWRmZmYnLFxuICAgIHJzQ29tYm9NYXJrc1JhbmdlID0gJ1xcXFx1MDMwMC1cXFxcdTAzNmYnLFxuICAgIHJlQ29tYm9IYWxmTWFya3NSYW5nZSA9ICdcXFxcdWZlMjAtXFxcXHVmZTJmJyxcbiAgICByc0NvbWJvU3ltYm9sc1JhbmdlID0gJ1xcXFx1MjBkMC1cXFxcdTIwZmYnLFxuICAgIHJzQ29tYm9SYW5nZSA9IHJzQ29tYm9NYXJrc1JhbmdlICsgcmVDb21ib0hhbGZNYXJrc1JhbmdlICsgcnNDb21ib1N5bWJvbHNSYW5nZSxcbiAgICByc1ZhclJhbmdlID0gJ1xcXFx1ZmUwZVxcXFx1ZmUwZic7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgdW5pY29kZSBjYXB0dXJlIGdyb3Vwcy4gKi9cbnZhciByc0FzdHJhbCA9ICdbJyArIHJzQXN0cmFsUmFuZ2UgKyAnXScsXG4gICAgcnNDb21ibyA9ICdbJyArIHJzQ29tYm9SYW5nZSArICddJyxcbiAgICByc0ZpdHogPSAnXFxcXHVkODNjW1xcXFx1ZGZmYi1cXFxcdWRmZmZdJyxcbiAgICByc01vZGlmaWVyID0gJyg/OicgKyByc0NvbWJvICsgJ3wnICsgcnNGaXR6ICsgJyknLFxuICAgIHJzTm9uQXN0cmFsID0gJ1teJyArIHJzQXN0cmFsUmFuZ2UgKyAnXScsXG4gICAgcnNSZWdpb25hbCA9ICcoPzpcXFxcdWQ4M2NbXFxcXHVkZGU2LVxcXFx1ZGRmZl0pezJ9JyxcbiAgICByc1N1cnJQYWlyID0gJ1tcXFxcdWQ4MDAtXFxcXHVkYmZmXVtcXFxcdWRjMDAtXFxcXHVkZmZmXScsXG4gICAgcnNaV0ogPSAnXFxcXHUyMDBkJztcblxuLyoqIFVzZWQgdG8gY29tcG9zZSB1bmljb2RlIHJlZ2V4ZXMuICovXG52YXIgcmVPcHRNb2QgPSByc01vZGlmaWVyICsgJz8nLFxuICAgIHJzT3B0VmFyID0gJ1snICsgcnNWYXJSYW5nZSArICddPycsXG4gICAgcnNPcHRKb2luID0gJyg/OicgKyByc1pXSiArICcoPzonICsgW3JzTm9uQXN0cmFsLCByc1JlZ2lvbmFsLCByc1N1cnJQYWlyXS5qb2luKCd8JykgKyAnKScgKyByc09wdFZhciArIHJlT3B0TW9kICsgJykqJyxcbiAgICByc1NlcSA9IHJzT3B0VmFyICsgcmVPcHRNb2QgKyByc09wdEpvaW4sXG4gICAgcnNTeW1ib2wgPSAnKD86JyArIFtyc05vbkFzdHJhbCArIHJzQ29tYm8gKyAnPycsIHJzQ29tYm8sIHJzUmVnaW9uYWwsIHJzU3VyclBhaXIsIHJzQXN0cmFsXS5qb2luKCd8JykgKyAnKSc7XG5cbi8qKiBVc2VkIHRvIG1hdGNoIFtzdHJpbmcgc3ltYm9sc10oaHR0cHM6Ly9tYXRoaWFzYnluZW5zLmJlL25vdGVzL2phdmFzY3JpcHQtdW5pY29kZSkuICovXG52YXIgcmVVbmljb2RlID0gUmVnRXhwKHJzRml0eiArICcoPz0nICsgcnNGaXR6ICsgJyl8JyArIHJzU3ltYm9sICsgcnNTZXEsICdnJyk7XG5cbi8qKlxuICogQ29udmVydHMgYSBVbmljb2RlIGBzdHJpbmdgIHRvIGFuIGFycmF5LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgY29udmVydGVkIGFycmF5LlxuICovXG5mdW5jdGlvbiB1bmljb2RlVG9BcnJheShzdHJpbmcpIHtcbiAgcmV0dXJuIHN0cmluZy5tYXRjaChyZVVuaWNvZGUpIHx8IFtdO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHVuaWNvZGVUb0FycmF5O1xuIiwidmFyIGFzY2lpVG9BcnJheSA9IHJlcXVpcmUoJy4vX2FzY2lpVG9BcnJheScpLFxuICAgIGhhc1VuaWNvZGUgPSByZXF1aXJlKCcuL19oYXNVbmljb2RlJyksXG4gICAgdW5pY29kZVRvQXJyYXkgPSByZXF1aXJlKCcuL191bmljb2RlVG9BcnJheScpO1xuXG4vKipcbiAqIENvbnZlcnRzIGBzdHJpbmdgIHRvIGFuIGFycmF5LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgY29udmVydGVkIGFycmF5LlxuICovXG5mdW5jdGlvbiBzdHJpbmdUb0FycmF5KHN0cmluZykge1xuICByZXR1cm4gaGFzVW5pY29kZShzdHJpbmcpXG4gICAgPyB1bmljb2RlVG9BcnJheShzdHJpbmcpXG4gICAgOiBhc2NpaVRvQXJyYXkoc3RyaW5nKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzdHJpbmdUb0FycmF5O1xuIiwidmFyIGNhc3RTbGljZSA9IHJlcXVpcmUoJy4vX2Nhc3RTbGljZScpLFxuICAgIGhhc1VuaWNvZGUgPSByZXF1aXJlKCcuL19oYXNVbmljb2RlJyksXG4gICAgc3RyaW5nVG9BcnJheSA9IHJlcXVpcmUoJy4vX3N0cmluZ1RvQXJyYXknKSxcbiAgICB0b1N0cmluZyA9IHJlcXVpcmUoJy4vdG9TdHJpbmcnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gbGlrZSBgXy5sb3dlckZpcnN0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZE5hbWUgVGhlIG5hbWUgb2YgdGhlIGBTdHJpbmdgIGNhc2UgbWV0aG9kIHRvIHVzZS5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGNhc2UgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUNhc2VGaXJzdChtZXRob2ROYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbihzdHJpbmcpIHtcbiAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuXG4gICAgdmFyIHN0clN5bWJvbHMgPSBoYXNVbmljb2RlKHN0cmluZylcbiAgICAgID8gc3RyaW5nVG9BcnJheShzdHJpbmcpXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIHZhciBjaHIgPSBzdHJTeW1ib2xzXG4gICAgICA/IHN0clN5bWJvbHNbMF1cbiAgICAgIDogc3RyaW5nLmNoYXJBdCgwKTtcblxuICAgIHZhciB0cmFpbGluZyA9IHN0clN5bWJvbHNcbiAgICAgID8gY2FzdFNsaWNlKHN0clN5bWJvbHMsIDEpLmpvaW4oJycpXG4gICAgICA6IHN0cmluZy5zbGljZSgxKTtcblxuICAgIHJldHVybiBjaHJbbWV0aG9kTmFtZV0oKSArIHRyYWlsaW5nO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNyZWF0ZUNhc2VGaXJzdDtcbiIsInZhciBjcmVhdGVDYXNlRmlyc3QgPSByZXF1aXJlKCcuL19jcmVhdGVDYXNlRmlyc3QnKTtcblxuLyoqXG4gKiBDb252ZXJ0cyB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIGBzdHJpbmdgIHRvIHVwcGVyIGNhc2UuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IFN0cmluZ1xuICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBzdHJpbmcuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udXBwZXJGaXJzdCgnZnJlZCcpO1xuICogLy8gPT4gJ0ZyZWQnXG4gKlxuICogXy51cHBlckZpcnN0KCdGUkVEJyk7XG4gKiAvLyA9PiAnRlJFRCdcbiAqL1xudmFyIHVwcGVyRmlyc3QgPSBjcmVhdGVDYXNlRmlyc3QoJ3RvVXBwZXJDYXNlJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gdXBwZXJGaXJzdDtcbiIsInZhciBjcmVhdGVDb21wb3VuZGVyID0gcmVxdWlyZSgnLi9fY3JlYXRlQ29tcG91bmRlcicpLFxuICAgIHVwcGVyRmlyc3QgPSByZXF1aXJlKCcuL3VwcGVyRmlyc3QnKTtcblxuLyoqXG4gKiBDb252ZXJ0cyBgc3RyaW5nYCB0b1xuICogW3N0YXJ0IGNhc2VdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0xldHRlcl9jYXNlI1N0eWxpc3RpY19vcl9zcGVjaWFsaXNlZF91c2FnZSkuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAzLjEuMFxuICogQGNhdGVnb3J5IFN0cmluZ1xuICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHN0YXJ0IGNhc2VkIHN0cmluZy5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5zdGFydENhc2UoJy0tZm9vLWJhci0tJyk7XG4gKiAvLyA9PiAnRm9vIEJhcidcbiAqXG4gKiBfLnN0YXJ0Q2FzZSgnZm9vQmFyJyk7XG4gKiAvLyA9PiAnRm9vIEJhcidcbiAqXG4gKiBfLnN0YXJ0Q2FzZSgnX19GT09fQkFSX18nKTtcbiAqIC8vID0+ICdGT08gQkFSJ1xuICovXG52YXIgc3RhcnRDYXNlID0gY3JlYXRlQ29tcG91bmRlcihmdW5jdGlvbihyZXN1bHQsIHdvcmQsIGluZGV4KSB7XG4gIHJldHVybiByZXN1bHQgKyAoaW5kZXggPyAnICcgOiAnJykgKyB1cHBlckZpcnN0KHdvcmQpO1xufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gc3RhcnRDYXNlO1xuIiwiaW1wb3J0IHsgaTE4biBhcyBJMThuLCBURnVuY3Rpb24sIFRPcHRpb25zIH0gZnJvbSAnaTE4bmV4dCdcbmltcG9ydCBzdGFydENhc2UgZnJvbSAnbG9kYXNoL3N0YXJ0Q2FzZSdcblxuLyoqXG4gKiBAbWVtYmVyb2YgVHJhbnNsYXRlRnVuY3Rpb25zXG4gKiBAYWxpYXMgVHJhbnNsYXRlRnVuY3Rpb25cbiAqL1xuZXhwb3J0IHR5cGUgVHJhbnNsYXRlRnVuY3Rpb24gPSAoXG4gIC8qKlxuICAgKiBrd3kgd2hpY2ggc2hvdWxkIGJlIHRyYW5zbGF0ZWQgaW4gYSBnaXZlbiBuYW1lc3BhY2VcbiAgICovXG4gIGtleTogc3RyaW5nLFxuICAvKipcbiAgICogT3B0aW9uYWwgcmVzb3VyY2VJZCBvciBbVHJhbnNsYXRlIG9wdGlvbnNde0BsaW5rIGh0dHBzOi8vd3d3LmkxOG5leHQuY29tL292ZXJ2aWV3L2NvbmZpZ3VyYXRpb24tb3B0aW9uc31cbiAgICovXG4gIHJlc291cmNlSWQ/OiBzdHJpbmcgfCBUT3B0aW9ucyxcbiAgLyoqXG4gICAqIFtUcmFuc2xhdGUgb3B0aW9uc117QGxpbmsgaHR0cHM6Ly93d3cuaTE4bmV4dC5jb20vb3ZlcnZpZXcvY29uZmlndXJhdGlvbi1vcHRpb25zfVxuICAgKi9cbiAgb3B0aW9ucz86IFRPcHRpb25zXG4pID0+IHN0cmluZ1xuXG4vKipcbiAqIFRyYW5zbGF0ZSBGdW5jdGlvbnMgYXJlIHRoZSBoZWxwZXIgZnVuY3Rpb25zIHdoaWNoIHlvdSBjYW4gdXNlIHRvIHRyYW5zbGF0ZVxuICogeW91ciBhcHBsaWNhdGlvbi5cbiAqXG4gKiBPbiB0aGUgZnJvbnRlZCB0aGV5IGNhbiBiZSB1c2VkIHdpdGgge0BsaW5rIHVzZVRyYW5zbGF0aW9ufSBob29rLiBPbiB0aGUgYmFja2VuZFxuICogdGhleSBhcmUgaW5qZWN0ZWQgdG8gYW55IHtAbGluayBBZG1pbkpTfSBpbnN0YW5jZSBhbmQge0BsaW5rIEFjdGlvbkNvbnRleHR9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zbGF0ZUZ1bmN0aW9ucyB7XG4gIC8qKlxuICAgKiBzaG9ydGN1dCBmb3IgSTE4bi50cmFuc2xhdGUgZnVuY3Rpb24uXG4gICAqIEBzZWUgaHR0cHM6Ly93d3cuaTE4bmV4dC5jb20vb3ZlcnZpZXcvYXBpI3RcbiAgICovXG4gIHQ6IFRGdW5jdGlvbjtcbiAgLyoqXG4gICAqIEkxOG4udHJhbnNsYXRlIGZ1bmN0aW9uLlxuICAgKiBAc2VlIGh0dHBzOi8vd3d3LmkxOG5leHQuY29tL292ZXJ2aWV3L2FwaSN0XG4gICAqL1xuICB0cmFuc2xhdGU6IFRGdW5jdGlvbjtcbiAgLyoqXG4gICAqIFNob3J0Y3V0IGZvciB7QGxpbmsgVHJhbnNsYXRlRnVuY3Rpb25zI3RyYW5zbGF0ZUFjdGlvbn1cbiAgICovXG4gIHRhOiBUcmFuc2xhdGVGdW5jdGlvbjtcbiAgLyoqXG4gICAqIFRyYW5zbGF0ZXMgYWxsIFthY3Rpb25zXXtAbGluayBBY3Rpb259LCB0byBiZSBtb3JlIHNwZWNpZmljIC0gdGhlaXIgbGFiZWxzLlxuICAgKiBCeSBkZWZhdWx0LCBpdCBsb29rcyBmb3IgYSBbdHJhbnNsYXRpb24ga2V5XXtAbGluayBMb2NhbGVUcmFuc2xhdGlvbnN9IGluXG4gICAqIGByZXNvdXJjZS57cmVzb3VyY2VJZH0uYWN0aW9ucy57YWN0aW9uTmFtZX1gLCB3aGVuIGl0IGRvZXNuJ3QgZmluZFxuICAgKiB0aGF0LCB0aGUgbG9va3VwIGlzIG1vdmVkIHRvIGBhY3Rpb25zLnthY3Rpb25OYW1lfWAuXG4gICAqIEZpbmFsbHksIHdoZW4gdGhhdCBhbHNvIGZhaWxzLCBpdCByZXR1cm5zIHN0YXJ0Q2FzZSBvZiB0aGUgYWN0aW9uIG5hbWUuXG4gICAqL1xuICB0cmFuc2xhdGVBY3Rpb246IFRyYW5zbGF0ZUZ1bmN0aW9uO1xuICAvKipcbiAgICogU2hvcnRjdXQgZm9yIHtAbGluayBUcmFuc2xhdGVGdW5jdGlvbnMjdHJhbnNsYXRlQnV0dG9ufVxuICAgKi9cbiAgdGI6IFRyYW5zbGF0ZUZ1bmN0aW9uO1xuICAvKipcbiAgICogVHJhbnNsYXRlcyBhbGwgYnV0dG9ucy5cbiAgICogQnkgZGVmYXVsdCwgaXQgbG9va3MgZm9yIGEgW3RyYW5zbGF0aW9uIGtleV17QGxpbmsgTG9jYWxlVHJhbnNsYXRpb25zfSBpblxuICAgKiBgcmVzb3VyY2Uue3Jlc291cmNlSWR9LmJ1dHRvbnMue2FjdGlvbk5hbWV9YCwgd2hlbiBpdCBkb2Vzbid0IGZpbmRcbiAgICogdGhhdCwgdGhlIGxvb2t1cCBpcyBtb3ZlZCB0byBgYnV0dG9ucy57YWN0aW9uTmFtZX1gLlxuICAgKiBGaW5hbGx5LCB3aGVuIHRoYXQgYWxzbyBmYWlscywgaXQgcmV0dXJucyBzdGFydENhc2Ugb2YgdGhlIGdpdmVuIGJ1dHRvbiBuYW1lLlxuICAgKi9cbiAgdHJhbnNsYXRlQnV0dG9uOiBUcmFuc2xhdGVGdW5jdGlvbjtcbiAgLyoqXG4gICAqIFNob3J0Y3V0IGZvciB7QGxpbmsgVHJhbnNsYXRlRnVuY3Rpb25zI3RyYW5zbGF0ZUxhYmVsfVxuICAgKi9cbiAgdGw6IFRyYW5zbGF0ZUZ1bmN0aW9uO1xuICAvKipcbiAgICogVHJhbnNsYXRlcyBhbGwgbGFiZWxzLiBNb3N0IG9mIGFsbCBhbGwgcmVzb3VyY2UgbmFtZXMgYXJlIHRyZWF0ZWQgYXMgbGFiZWxzLlxuICAgKiBBbHNvLCBsYWJlbHMgYXJlIHRleHRzIGluIHRoZSB1c2VyIGludGVyZmFjZSB3aGljaCBjYW5ub3QgYmUgcmVjb2duaXplZFxuICAgKiBhcyBhbnkgb3RoZXIgdHlwZS5cbiAgICogQnkgZGVmYXVsdCwgaXQgbG9va3MgZm9yIGEgW3RyYW5zbGF0aW9uIGtleV17QGxpbmsgTG9jYWxlVHJhbnNsYXRpb25zfSBpblxuICAgKiBgcmVzb3VyY2Uue3Jlc291cmNlSWR9LmxhYmVscy57YWN0aW9uTmFtZX1gLCB3aGVuIGl0IGRvZXNuJ3QgZmluZFxuICAgKiB0aGF0LCB0aGUgbG9va3VwIGlzIG1vdmVkIHRvIGBsYWJlbHMue2FjdGlvbk5hbWV9YC5cbiAgICogRmluYWxseSwgd2hlbiB0aGF0IGFsc28gZmFpbHMsIGl0IHJldHVybnMgc3RhcnRDYXNlIG9mIHRoZSBnaXZlbiBsYWJlbC5cbiAgICovXG4gIHRyYW5zbGF0ZUxhYmVsOiBUcmFuc2xhdGVGdW5jdGlvbjtcbiAgLyoqXG4gICAqIFNob3J0Y3V0IGZvciB7QGxpbmsgVHJhbnNsYXRlRnVuY3Rpb25zI3RyYW5zbGF0ZVByb3BlcnR5fVxuICAgKi9cbiAgdHA6IFRyYW5zbGF0ZUZ1bmN0aW9uO1xuICAvKipcbiAgICogVHJhbnNsYXRlcyBhbGwgdGhlIHByb3BlcnR5IG5hbWVzLlxuICAgKiBCeSBkZWZhdWx0LCBpdCBsb29rcyBmb3IgYSBbdHJhbnNsYXRpb24ga2V5XXtAbGluayBMb2NhbGVUcmFuc2xhdGlvbnN9IGluXG4gICAqIGByZXNvdXJjZS57cmVzb3VyY2VJZH0ucHJvcGVydGllcy57cHJvcGVydHlQYXRofWAsIHdoZW4gaXQgZG9lc24ndCBmaW5kXG4gICAqIHRoYXQsIHRoZSBsb29rdXAgaXMgbW92ZWQgdG8gYHByb3BlcnRpZXMue3Byb3BlcnR5UGF0aH1gLiBXaGVuIHRoYXQgZmFpbHMsXG4gICAqIGl0IHJldHVybnMgc3RhcnRDYXNlIG9mIHRoZSBnaXZlbiBwcm9wZXJ0eSBuYW1lLlxuICAgKlxuICAgKiBXaGF0IGlzIGltcG9ydGFudCBoZXJlIGlzIHRoYXQgeW91IGNhbiBwdXQgbmVzdGVkIHByb3BlcnR5IGFzIHdlbGwsIEluIHRoYXRcbiAgICogY2FzZSB5b3UgaGF2ZSB0byBwYXNzIGRvdHRlZCBwYXRoOlxuICAgKlxuICAgKiBgYGBqYXZhc2NyaXB0XG4gICAqIHtcbiAgICogICBwcm9wZXJ0aWVzOiB7XG4gICAqICAgICAgcGFyZW50OiAncGFyZW50IHByb3BlcnR5JyxcbiAgICogICAgICAncGFyZW50Lm5lc3RlZCc6ICduZXN0ZWQgcHJvcGVydHknXG4gICAqICAgfVxuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgdHJhbnNsYXRlUHJvcGVydHk6IFRyYW5zbGF0ZUZ1bmN0aW9uO1xuICAvKipcbiAgICogU2hvcnRjdXQgZm9yIHtAbGluayBUcmFuc2xhdGVGdW5jdGlvbnMjdHJhbnNsYXRlTWVzc2FnZX1cbiAgICovXG4gIHRtOiBUcmFuc2xhdGVGdW5jdGlvbjtcbiAgLyoqXG4gICAqIFRyYW5zbGF0ZXMgYWxsIHRoZSBtZXNzYWdlcyBpbiB0aGUgYXBwbGljYXRpb24uXG4gICAqIEJ5IGRlZmF1bHQsIGl0IGxvb2tzIGZvciBhIFt0cmFuc2xhdGlvbiBrZXlde0BsaW5rIExvY2FsZVRyYW5zbGF0aW9uc30gaW5cbiAgICogYHJlc291cmNlLntyZXNvdXJjZUlkfS5tZXNzYWdlcy57bWVzc2FnZU5hbWV9YCwgd2hlbiBpdCBkb2Vzbid0IGZpbmRcbiAgICogdGhhdCwgdGhlIGxvb2t1cCBpcyBtb3ZlZCB0byBgbWVzc2FnZXMue21lc3NhZ2VOYW1lfWAuXG4gICAqIEZpbmFsbHksIHdoZW4gdGhhdCBhbHNvIGZhaWxzLCBpdCByZXR1cm5zIHN0YXJ0Q2FzZSBvZiB0aGUgZ2l2ZW4gbWVzc2FnZSBuYW1lLlxuICAgKi9cbiAgdHJhbnNsYXRlTWVzc2FnZTogVHJhbnNsYXRlRnVuY3Rpb247XG59XG5cbmV4cG9ydCBjb25zdCBmb3JtYXROYW1lID0gKG5hbWU6IHN0cmluZyk6IHN0cmluZyA9PiBuYW1lLnNwbGl0KCcuJykuam9pbignJiM0NjsnKVxuXG5jb25zdCB0cmFuc2xhdGUgPSAoXG4gIGkxOG46IEkxOG4sXG4gIGtleTogc3RyaW5nLFxuICBuYW1lOiBzdHJpbmcsXG4gIHJlc291cmNlSWQ/OiBzdHJpbmcgfCBUT3B0aW9ucyxcbiAgb3B0aW9ucz86IFRPcHRpb25zLFxuKTogc3RyaW5nID0+IHtcbiAgY29uc3QgcmVhbE9wdGlvbnM6IFRPcHRpb25zID0gKHR5cGVvZiByZXNvdXJjZUlkID09PSAnc3RyaW5nJyA/IG9wdGlvbnMgOiByZXNvdXJjZUlkKSB8fCB7fVxuICBjb25zdCBmb3JtYXR0ZWROYW1lID0gZm9ybWF0TmFtZShuYW1lKVxuICBsZXQga2V5cyA9IFtgJHtrZXl9LiR7Zm9ybWF0dGVkTmFtZX1gXVxuICBpZiAocmVzb3VyY2VJZCkge1xuICAgIGtleXMgPSBbYHJlc291cmNlcy4ke3Jlc291cmNlSWR9LiR7a2V5fS4ke2Zvcm1hdHRlZE5hbWV9YCwgLi4ua2V5c11cbiAgfVxuICBpZiAoaTE4bi5leGlzdHMoa2V5cykpIHtcbiAgICByZXR1cm4gaTE4bi50KGtleXMsIHJlYWxPcHRpb25zKVxuICB9XG4gIHJldHVybiByZWFsT3B0aW9ucy5kZWZhdWx0VmFsdWUgPz8gc3RhcnRDYXNlKG5hbWUpXG59XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVGdW5jdGlvbnMgPSAoaTE4bjogSTE4bik6IFRyYW5zbGF0ZUZ1bmN0aW9ucyA9PiB7XG4gIGNvbnN0IHRyYW5zbGF0ZUFjdGlvbjogVHJhbnNsYXRlRnVuY3Rpb24gPSAoYWN0aW9uTmFtZSwgcmVzb3VyY2VJZCwgb3B0aW9ucykgPT4gKFxuICAgIHRyYW5zbGF0ZShpMThuLCAnYWN0aW9ucycsIGFjdGlvbk5hbWUgYXMgc3RyaW5nLCByZXNvdXJjZUlkLCBvcHRpb25zKVxuICApXG5cbiAgY29uc3QgdHJhbnNsYXRlQnV0dG9uOiBUcmFuc2xhdGVGdW5jdGlvbiA9IChidXR0b25MYWJlbCwgcmVzb3VyY2VJZCwgb3B0aW9ucykgPT4gKFxuICAgIHRyYW5zbGF0ZShpMThuLCAnYnV0dG9ucycsIGJ1dHRvbkxhYmVsLCByZXNvdXJjZUlkLCBvcHRpb25zKVxuICApXG5cbiAgY29uc3QgdHJhbnNsYXRlTGFiZWw6IFRyYW5zbGF0ZUZ1bmN0aW9uID0gKGxhYmVsLCByZXNvdXJjZUlkLCBvcHRpb25zKSA9PiAoXG4gICAgdHJhbnNsYXRlKGkxOG4sICdsYWJlbHMnLCBsYWJlbCBhcyBzdHJpbmcsIHJlc291cmNlSWQsIG9wdGlvbnMpXG4gIClcblxuICBjb25zdCB0cmFuc2xhdGVQcm9wZXJ0eTogVHJhbnNsYXRlRnVuY3Rpb24gPSAocHJvcGVydHlOYW1lLCByZXNvdXJjZUlkLCBvcHRpb25zKSA9PiAoXG4gICAgdHJhbnNsYXRlKGkxOG4sICdwcm9wZXJ0aWVzJywgcHJvcGVydHlOYW1lLCByZXNvdXJjZUlkLCBvcHRpb25zKVxuICApXG5cbiAgY29uc3QgdHJhbnNsYXRlTWVzc2FnZTogVHJhbnNsYXRlRnVuY3Rpb24gPSAobWVzc2FnZU5hbWUsIHJlc291cmNlSWQsIG9wdGlvbnMpID0+IChcbiAgICB0cmFuc2xhdGUoaTE4biwgJ21lc3NhZ2VzJywgbWVzc2FnZU5hbWUsIHJlc291cmNlSWQsIG9wdGlvbnMpXG4gIClcblxuICByZXR1cm4ge1xuICAgIHRyYW5zbGF0ZUFjdGlvbixcbiAgICB0YTogdHJhbnNsYXRlQWN0aW9uLFxuICAgIHRyYW5zbGF0ZUJ1dHRvbixcbiAgICB0YjogdHJhbnNsYXRlQnV0dG9uLFxuICAgIHRyYW5zbGF0ZUxhYmVsLFxuICAgIHRsOiB0cmFuc2xhdGVMYWJlbCxcbiAgICB0cmFuc2xhdGVQcm9wZXJ0eSxcbiAgICB0cDogdHJhbnNsYXRlUHJvcGVydHksXG4gICAgdHJhbnNsYXRlTWVzc2FnZSxcbiAgICB0bTogdHJhbnNsYXRlTWVzc2FnZSxcbiAgICB0OiBpMThuLnQsXG4gICAgdHJhbnNsYXRlOiBpMThuLnQsXG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIHVzZVRyYW5zbGF0aW9uIGFzIG9yaWdpbmFsVXNlVHJhbnNsYXRpb24sXG59IGZyb20gJ3JlYWN0LWkxOG5leHQnXG5pbXBvcnQgeyBURnVuY3Rpb24sIGkxOG4gfSBmcm9tICdpMThuZXh0J1xuXG5pbXBvcnQgeyBUcmFuc2xhdGVGdW5jdGlvbnMsIGNyZWF0ZUZ1bmN0aW9ucyB9IGZyb20gJy4uLy4uL3V0aWxzL3RyYW5zbGF0ZS1mdW5jdGlvbnMuZmFjdG9yeSdcblxuLyoqXG4gKiBFeHRlbmRzIHtAbGluayBUcmFuc2xhdGVGdW5jdGlvbnN9LiBBcGFydCBmcm9tIHRoYXQgaXQgYWxzbyByZXR1cm5zIGFsbCB0aGUgcHJvcGVydGllc1xuICogZGVmaW5lZCBiZWxvdy5cbiAqXG4gKiBgYGBqYXZhc2NyaXB0XG4gKiBpbXBvcnQgeyB1c2VUcmFuc2xhdGlvbiB9IGZyb20gJ2FkbWluanMnXG4gKlxuICogY29uc3QgTXlDb21wb25lbnQgPSAoKSA9PiB7XG4gKiAgIGNvbnN0IHsgdHJhbnNsYXRlQnV0dG9uIH0gPSB1c2VUcmFuc2xhdGlvbigpXG4gKlxuICogICByZXR1cm4gKFxuICogICAgIDxCb3g+XG4gKiAgICAgICA8QnV0dG9uIHZhcmlhbnQ9XCJwcmltYXJ5XCIgb25DbGljaz17Li4ufT57dHJhbnNsYXRlQnV0dG9uKCdzYXZlJyl9PEJ1dHRvbj5cbiAqICAgICA8L0JveD5cbiAqICAgKVxuICogfVxuICogYGBgXG4gKlxuICogQG1lbWJlcm9mIHVzZVRyYW5zbGF0aW9uXG4gKiBAYWxpYXMgVXNlVHJhbnNsYXRpb25SZXNwb25zZVxuICpcbiAqIEBwcm9wZXJ0eSB7VHJhbnNsYXRlRnVuY3Rpb259IC4uLiBBbGwgZnVuY3Rpb25zIGRlZmluZWQgaW4ge0BsaW5rIFRyYW5zbGF0ZUZ1bmN0aW9uc31cbiAqL1xuZXhwb3J0IHR5cGUgVXNlVHJhbnNsYXRpb25SZXNwb25zZSA9IFRyYW5zbGF0ZUZ1bmN0aW9ucyAmIHtcbiAgdDogVEZ1bmN0aW9uO1xuICAvKipcbiAgICogQ3VycmVudCBpMThuIGluc3RhbmNlLlxuICAgKi9cbiAgaTE4bjogaTE4bjtcbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0cmFuc2xhdGlvbiBzeXN0ZW0gaXMgcmVhZHkuIEluIEFkbWluSlMgaXQgaXMgYWx3YXlzIHJlYWR5IDopLlxuICAgKi9cbiAgcmVhZHk6IGJvb2xlYW47XG59XG5cbi8qKlxuICogQGNsYXNzZGVzY1xuICogRXh0ZW5kcyB0aGUgdXNlVHJhbnNsYXRpb24gaG9vayBmcm9tIHJlYWN0LWkxOG5leHQgbGlicmFyeS5cbiAqXG4gKiBSZXR1cm5zIGFsbCB0aGUge0BsaW5rIFRyYW5zbGF0ZUZ1bmN0aW9uc30gKyBtZXRob2RzIHJldHVybmVkIGJ5IHRoZSBvcmlnaW5hbFxuICogdXNlVHJhbnNsYXRpb24gbWV0aG9kIGZyb20gcmVhY3QtaTE4bmV4dCBsaWtlOiBgaTE4bmAgaW5zdGFuY2UgYW5kIGByZWFkeWAgZmxhZy5cbiAqXG4gKiBAY2xhc3NcbiAqIEBzdWJjYXRlZ29yeSBIb29rc1xuICogQGJ1bmRsZVxuICogQGhpZGVjb25zdHJ1Y3RvclxuICogQHJldHVybnMge1VzZVRyYW5zbGF0aW9uUmVzcG9uc2V9XG4gKi9cbmV4cG9ydCBjb25zdCB1c2VUcmFuc2xhdGlvbiA9ICgpOiBVc2VUcmFuc2xhdGlvblJlc3BvbnNlID0+IHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvd1xuICBjb25zdCB7IGkxOG4sIC4uLnJlc3QgfSA9IG9yaWdpbmFsVXNlVHJhbnNsYXRpb24oKVxuICBjb25zdCB0cmFuc2xhdGVGdW5jdGlvbnMgPSBjcmVhdGVGdW5jdGlvbnMoaTE4bilcblxuICByZXR1cm4ge1xuICAgIC4uLnJlc3QsXG4gICAgaTE4bixcbiAgICAuLi50cmFuc2xhdGVGdW5jdGlvbnMsXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgdXNlVHJhbnNsYXRpb25cbiIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IE5hdmlnYXRpb24sIE5hdmlnYXRpb25FbGVtZW50UHJvcHMgfSBmcm9tICdAYWRtaW5qcy9kZXNpZ24tc3lzdGVtJ1xuXG5pbXBvcnQgeyB1c2VOYXZpZ2F0ZSwgdXNlTG9jYXRpb24gfSBmcm9tICdyZWFjdC1yb3V0ZXInXG5pbXBvcnQgVmlld0hlbHBlcnMgZnJvbSAnLi4vLi4vLi4vLi4vYmFja2VuZC91dGlscy92aWV3LWhlbHBlcnMvdmlldy1oZWxwZXJzJ1xuaW1wb3J0IHsgdXNlVHJhbnNsYXRpb24gfSBmcm9tICcuLi8uLi8uLi9ob29rcy91c2UtdHJhbnNsYXRpb24nXG5pbXBvcnQgeyBSZWR1eFN0YXRlIH0gZnJvbSAnLi4vLi4vLi4vc3RvcmUvc3RvcmUnXG5pbXBvcnQgYWxsb3dPdmVycmlkZSBmcm9tICcuLi8uLi8uLi9ob2MvYWxsb3ctb3ZlcnJpZGUnXG5cbnR5cGUgUHJvcHMgPSB7XG4gIHBhZ2VzPzogUmVkdXhTdGF0ZVsncGFnZXMnXTtcbn1cblxuY29uc3QgaCA9IG5ldyBWaWV3SGVscGVycygpXG5cbmNvbnN0IFNpZGViYXJQYWdlczogUmVhY3QuRkM8UHJvcHM+ID0gKHByb3BzKSA9PiB7XG4gIGNvbnN0IHsgcGFnZXMgfSA9IHByb3BzXG5cbiAgY29uc3QgeyB0cmFuc2xhdGVMYWJlbCB9ID0gdXNlVHJhbnNsYXRpb24oKVxuICBjb25zdCBsb2NhdGlvbiA9IHVzZUxvY2F0aW9uKClcbiAgY29uc3QgbmF2aWdhdGUgPSB1c2VOYXZpZ2F0ZSgpXG5cbiAgaWYgKCFwYWdlcyB8fCAhcGFnZXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIGNvbnN0IGlzQWN0aXZlID0gKHBhZ2UpOiBib29sZWFuID0+IChcbiAgICAhIWxvY2F0aW9uLnBhdGhuYW1lLm1hdGNoKGAvcGFnZXMvJHtwYWdlLm5hbWV9YClcbiAgKVxuXG4gIGNvbnN0IGVsZW1lbnRzOiBBcnJheTxOYXZpZ2F0aW9uRWxlbWVudFByb3BzPiA9IHBhZ2VzLm1hcCgocGFnZSkgPT4gKHtcbiAgICBpZDogcGFnZS5uYW1lLFxuICAgIGxhYmVsOiBwYWdlLm5hbWUsXG4gICAgaXNTZWxlY3RlZDogaXNBY3RpdmUocGFnZSksXG4gICAgaWNvbjogcGFnZS5pY29uLFxuICAgIGhyZWY6IGgucGFnZVVybChwYWdlLm5hbWUpLFxuICAgIG9uQ2xpY2s6IChldmVudCwgZWxlbWVudCk6IHZvaWQgPT4ge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgICAgaWYgKGVsZW1lbnQuaHJlZikge1xuICAgICAgICBuYXZpZ2F0ZShlbGVtZW50LmhyZWYpXG4gICAgICB9XG4gICAgfSxcbiAgfSkpXG5cbiAgcmV0dXJuIChcbiAgICA8TmF2aWdhdGlvblxuICAgICAgbGFiZWw9e3RyYW5zbGF0ZUxhYmVsKCdwYWdlcycpfVxuICAgICAgZWxlbWVudHM9e2VsZW1lbnRzfVxuICAgIC8+XG4gIClcbn1cblxuZXhwb3J0IGRlZmF1bHQgYWxsb3dPdmVycmlkZShTaWRlYmFyUGFnZXMsICdTaWRlYmFyUGFnZXMnKVxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgQm94LCBNYWRlV2l0aExvdmUgfSBmcm9tICdAYWRtaW5qcy9kZXNpZ24tc3lzdGVtJ1xuaW1wb3J0IHsgdXNlU2VsZWN0b3IgfSBmcm9tICdyZWFjdC1yZWR1eCdcbmltcG9ydCB7IEJyYW5kaW5nT3B0aW9ucyB9IGZyb20gJy4uLy4uLy4uLy4uL2FkbWluanMtb3B0aW9ucy5pbnRlcmZhY2UnXG5pbXBvcnQgYWxsb3dPdmVycmlkZSBmcm9tICcuLi8uLi8uLi9ob2MvYWxsb3ctb3ZlcnJpZGUnXG5pbXBvcnQgeyBSZWR1eFN0YXRlIH0gZnJvbSAnLi4vLi4vLi4vc3RvcmUnXG5cbmNvbnN0IFNpZGViYXJGb290ZXI6IFJlYWN0LkZDID0gKCkgPT4ge1xuICBjb25zdCBicmFuZGluZyA9IHVzZVNlbGVjdG9yPFJlZHV4U3RhdGUsIEJyYW5kaW5nT3B0aW9ucz4oKHN0YXRlKSA9PiBzdGF0ZS5icmFuZGluZylcblxuICByZXR1cm4gKFxuICAgIDxCb3ggbXQ9XCJsZ1wiIG1iPVwibWRcIiBkYXRhLWNzcz1cInNpZGViYXItZm9vdGVyXCI+XG4gICAgICB7YnJhbmRpbmcud2l0aE1hZGVXaXRoTG92ZSAmJiA8TWFkZVdpdGhMb3ZlIC8+fVxuICAgIDwvQm94PlxuICApXG59XG5cbmV4cG9ydCBkZWZhdWx0IGFsbG93T3ZlcnJpZGUoU2lkZWJhckZvb3RlciwgJ1NpZGViYXJGb290ZXInKVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGJpbmQoZm4sIHRoaXNBcmcpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHdyYXAoKSB7XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBhcmdzW2ldID0gYXJndW1lbnRzW2ldO1xuICAgIH1cbiAgICByZXR1cm4gZm4uYXBwbHkodGhpc0FyZywgYXJncyk7XG4gIH07XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgYmluZCA9IHJlcXVpcmUoJy4vaGVscGVycy9iaW5kJyk7XG5cbi8vIHV0aWxzIGlzIGEgbGlicmFyeSBvZiBnZW5lcmljIGhlbHBlciBmdW5jdGlvbnMgbm9uLXNwZWNpZmljIHRvIGF4aW9zXG5cbnZhciB0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBmdW5jLW5hbWVzXG52YXIga2luZE9mID0gKGZ1bmN0aW9uKGNhY2hlKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBmdW5jLW5hbWVzXG4gIHJldHVybiBmdW5jdGlvbih0aGluZykge1xuICAgIHZhciBzdHIgPSB0b1N0cmluZy5jYWxsKHRoaW5nKTtcbiAgICByZXR1cm4gY2FjaGVbc3RyXSB8fCAoY2FjaGVbc3RyXSA9IHN0ci5zbGljZSg4LCAtMSkudG9Mb3dlckNhc2UoKSk7XG4gIH07XG59KShPYmplY3QuY3JlYXRlKG51bGwpKTtcblxuZnVuY3Rpb24ga2luZE9mVGVzdCh0eXBlKSB7XG4gIHR5cGUgPSB0eXBlLnRvTG93ZXJDYXNlKCk7XG4gIHJldHVybiBmdW5jdGlvbiBpc0tpbmRPZih0aGluZykge1xuICAgIHJldHVybiBraW5kT2YodGhpbmcpID09PSB0eXBlO1xuICB9O1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGFuIEFycmF5XG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYW4gQXJyYXksIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0FycmF5KHZhbCkge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWwpO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIHVuZGVmaW5lZFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSB2YWx1ZSBpcyB1bmRlZmluZWQsIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc1VuZGVmaW5lZCh2YWwpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWwgPT09ICd1bmRlZmluZWQnO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgQnVmZmVyXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBCdWZmZXIsIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0J1ZmZlcih2YWwpIHtcbiAgcmV0dXJuIHZhbCAhPT0gbnVsbCAmJiAhaXNVbmRlZmluZWQodmFsKSAmJiB2YWwuY29uc3RydWN0b3IgIT09IG51bGwgJiYgIWlzVW5kZWZpbmVkKHZhbC5jb25zdHJ1Y3RvcilcbiAgICAmJiB0eXBlb2YgdmFsLmNvbnN0cnVjdG9yLmlzQnVmZmVyID09PSAnZnVuY3Rpb24nICYmIHZhbC5jb25zdHJ1Y3Rvci5pc0J1ZmZlcih2YWwpO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGFuIEFycmF5QnVmZmVyXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhbiBBcnJheUJ1ZmZlciwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbnZhciBpc0FycmF5QnVmZmVyID0ga2luZE9mVGVzdCgnQXJyYXlCdWZmZXInKTtcblxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgdmlldyBvbiBhbiBBcnJheUJ1ZmZlclxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgdmlldyBvbiBhbiBBcnJheUJ1ZmZlciwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzQXJyYXlCdWZmZXJWaWV3KHZhbCkge1xuICB2YXIgcmVzdWx0O1xuICBpZiAoKHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcpICYmIChBcnJheUJ1ZmZlci5pc1ZpZXcpKSB7XG4gICAgcmVzdWx0ID0gQXJyYXlCdWZmZXIuaXNWaWV3KHZhbCk7XG4gIH0gZWxzZSB7XG4gICAgcmVzdWx0ID0gKHZhbCkgJiYgKHZhbC5idWZmZXIpICYmIChpc0FycmF5QnVmZmVyKHZhbC5idWZmZXIpKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgU3RyaW5nXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBTdHJpbmcsIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc1N0cmluZyh2YWwpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgTnVtYmVyXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBOdW1iZXIsIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc051bWJlcih2YWwpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWwgPT09ICdudW1iZXInO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGFuIE9iamVjdFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGFuIE9iamVjdCwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0KHZhbCkge1xuICByZXR1cm4gdmFsICE9PSBudWxsICYmIHR5cGVvZiB2YWwgPT09ICdvYmplY3QnO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgcGxhaW4gT2JqZWN0XG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIHBsYWluIE9iamVjdCwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzUGxhaW5PYmplY3QodmFsKSB7XG4gIGlmIChraW5kT2YodmFsKSAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgcHJvdG90eXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbCk7XG4gIHJldHVybiBwcm90b3R5cGUgPT09IG51bGwgfHwgcHJvdG90eXBlID09PSBPYmplY3QucHJvdG90eXBlO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgRGF0ZVxuICpcbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHtPYmplY3R9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBEYXRlLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xudmFyIGlzRGF0ZSA9IGtpbmRPZlRlc3QoJ0RhdGUnKTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIEZpbGVcbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgRmlsZSwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbnZhciBpc0ZpbGUgPSBraW5kT2ZUZXN0KCdGaWxlJyk7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBCbG9iXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIEJsb2IsIG90aGVyd2lzZSBmYWxzZVxuICovXG52YXIgaXNCbG9iID0ga2luZE9mVGVzdCgnQmxvYicpO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgRmlsZUxpc3RcbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgRmlsZSwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbnZhciBpc0ZpbGVMaXN0ID0ga2luZE9mVGVzdCgnRmlsZUxpc3QnKTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIEZ1bmN0aW9uXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBGdW5jdGlvbiwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzRnVuY3Rpb24odmFsKSB7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKHZhbCkgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXSc7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBTdHJlYW1cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIFN0cmVhbSwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzU3RyZWFtKHZhbCkge1xuICByZXR1cm4gaXNPYmplY3QodmFsKSAmJiBpc0Z1bmN0aW9uKHZhbC5waXBlKTtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIEZvcm1EYXRhXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHRoaW5nIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhbiBGb3JtRGF0YSwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzRm9ybURhdGEodGhpbmcpIHtcbiAgdmFyIHBhdHRlcm4gPSAnW29iamVjdCBGb3JtRGF0YV0nO1xuICByZXR1cm4gdGhpbmcgJiYgKFxuICAgICh0eXBlb2YgRm9ybURhdGEgPT09ICdmdW5jdGlvbicgJiYgdGhpbmcgaW5zdGFuY2VvZiBGb3JtRGF0YSkgfHxcbiAgICB0b1N0cmluZy5jYWxsKHRoaW5nKSA9PT0gcGF0dGVybiB8fFxuICAgIChpc0Z1bmN0aW9uKHRoaW5nLnRvU3RyaW5nKSAmJiB0aGluZy50b1N0cmluZygpID09PSBwYXR0ZXJuKVxuICApO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgVVJMU2VhcmNoUGFyYW1zIG9iamVjdFxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIFVSTFNlYXJjaFBhcmFtcyBvYmplY3QsIG90aGVyd2lzZSBmYWxzZVxuICovXG52YXIgaXNVUkxTZWFyY2hQYXJhbXMgPSBraW5kT2ZUZXN0KCdVUkxTZWFyY2hQYXJhbXMnKTtcblxuLyoqXG4gKiBUcmltIGV4Y2VzcyB3aGl0ZXNwYWNlIG9mZiB0aGUgYmVnaW5uaW5nIGFuZCBlbmQgb2YgYSBzdHJpbmdcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyIFRoZSBTdHJpbmcgdG8gdHJpbVxuICogQHJldHVybnMge1N0cmluZ30gVGhlIFN0cmluZyBmcmVlZCBvZiBleGNlc3Mgd2hpdGVzcGFjZVxuICovXG5mdW5jdGlvbiB0cmltKHN0cikge1xuICByZXR1cm4gc3RyLnRyaW0gPyBzdHIudHJpbSgpIDogc3RyLnJlcGxhY2UoL15cXHMrfFxccyskL2csICcnKTtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgd2UncmUgcnVubmluZyBpbiBhIHN0YW5kYXJkIGJyb3dzZXIgZW52aXJvbm1lbnRcbiAqXG4gKiBUaGlzIGFsbG93cyBheGlvcyB0byBydW4gaW4gYSB3ZWIgd29ya2VyLCBhbmQgcmVhY3QtbmF0aXZlLlxuICogQm90aCBlbnZpcm9ubWVudHMgc3VwcG9ydCBYTUxIdHRwUmVxdWVzdCwgYnV0IG5vdCBmdWxseSBzdGFuZGFyZCBnbG9iYWxzLlxuICpcbiAqIHdlYiB3b3JrZXJzOlxuICogIHR5cGVvZiB3aW5kb3cgLT4gdW5kZWZpbmVkXG4gKiAgdHlwZW9mIGRvY3VtZW50IC0+IHVuZGVmaW5lZFxuICpcbiAqIHJlYWN0LW5hdGl2ZTpcbiAqICBuYXZpZ2F0b3IucHJvZHVjdCAtPiAnUmVhY3ROYXRpdmUnXG4gKiBuYXRpdmVzY3JpcHRcbiAqICBuYXZpZ2F0b3IucHJvZHVjdCAtPiAnTmF0aXZlU2NyaXB0JyBvciAnTlMnXG4gKi9cbmZ1bmN0aW9uIGlzU3RhbmRhcmRCcm93c2VyRW52KCkge1xuICBpZiAodHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgKG5hdmlnYXRvci5wcm9kdWN0ID09PSAnUmVhY3ROYXRpdmUnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdG9yLnByb2R1Y3QgPT09ICdOYXRpdmVTY3JpcHQnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdG9yLnByb2R1Y3QgPT09ICdOUycpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiAoXG4gICAgdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnXG4gICk7XG59XG5cbi8qKlxuICogSXRlcmF0ZSBvdmVyIGFuIEFycmF5IG9yIGFuIE9iamVjdCBpbnZva2luZyBhIGZ1bmN0aW9uIGZvciBlYWNoIGl0ZW0uXG4gKlxuICogSWYgYG9iamAgaXMgYW4gQXJyYXkgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgcGFzc2luZ1xuICogdGhlIHZhbHVlLCBpbmRleCwgYW5kIGNvbXBsZXRlIGFycmF5IGZvciBlYWNoIGl0ZW0uXG4gKlxuICogSWYgJ29iaicgaXMgYW4gT2JqZWN0IGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkIHBhc3NpbmdcbiAqIHRoZSB2YWx1ZSwga2V5LCBhbmQgY29tcGxldGUgb2JqZWN0IGZvciBlYWNoIHByb3BlcnR5LlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fEFycmF5fSBvYmogVGhlIG9iamVjdCB0byBpdGVyYXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgY2FsbGJhY2sgdG8gaW52b2tlIGZvciBlYWNoIGl0ZW1cbiAqL1xuZnVuY3Rpb24gZm9yRWFjaChvYmosIGZuKSB7XG4gIC8vIERvbid0IGJvdGhlciBpZiBubyB2YWx1ZSBwcm92aWRlZFxuICBpZiAob2JqID09PSBudWxsIHx8IHR5cGVvZiBvYmogPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gRm9yY2UgYW4gYXJyYXkgaWYgbm90IGFscmVhZHkgc29tZXRoaW5nIGl0ZXJhYmxlXG4gIGlmICh0eXBlb2Ygb2JqICE9PSAnb2JqZWN0Jykge1xuICAgIC8qZXNsaW50IG5vLXBhcmFtLXJlYXNzaWduOjAqL1xuICAgIG9iaiA9IFtvYmpdO1xuICB9XG5cbiAgaWYgKGlzQXJyYXkob2JqKSkge1xuICAgIC8vIEl0ZXJhdGUgb3ZlciBhcnJheSB2YWx1ZXNcbiAgICBmb3IgKHZhciBpID0gMCwgbCA9IG9iai5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIGZuLmNhbGwobnVsbCwgb2JqW2ldLCBpLCBvYmopO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBJdGVyYXRlIG92ZXIgb2JqZWN0IGtleXNcbiAgICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7XG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkge1xuICAgICAgICBmbi5jYWxsKG51bGwsIG9ialtrZXldLCBrZXksIG9iaik7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQWNjZXB0cyB2YXJhcmdzIGV4cGVjdGluZyBlYWNoIGFyZ3VtZW50IHRvIGJlIGFuIG9iamVjdCwgdGhlblxuICogaW1tdXRhYmx5IG1lcmdlcyB0aGUgcHJvcGVydGllcyBvZiBlYWNoIG9iamVjdCBhbmQgcmV0dXJucyByZXN1bHQuXG4gKlxuICogV2hlbiBtdWx0aXBsZSBvYmplY3RzIGNvbnRhaW4gdGhlIHNhbWUga2V5IHRoZSBsYXRlciBvYmplY3QgaW5cbiAqIHRoZSBhcmd1bWVudHMgbGlzdCB3aWxsIHRha2UgcHJlY2VkZW5jZS5cbiAqXG4gKiBFeGFtcGxlOlxuICpcbiAqIGBgYGpzXG4gKiB2YXIgcmVzdWx0ID0gbWVyZ2Uoe2ZvbzogMTIzfSwge2ZvbzogNDU2fSk7XG4gKiBjb25zb2xlLmxvZyhyZXN1bHQuZm9vKTsgLy8gb3V0cHV0cyA0NTZcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmoxIE9iamVjdCB0byBtZXJnZVxuICogQHJldHVybnMge09iamVjdH0gUmVzdWx0IG9mIGFsbCBtZXJnZSBwcm9wZXJ0aWVzXG4gKi9cbmZ1bmN0aW9uIG1lcmdlKC8qIG9iajEsIG9iajIsIG9iajMsIC4uLiAqLykge1xuICB2YXIgcmVzdWx0ID0ge307XG4gIGZ1bmN0aW9uIGFzc2lnblZhbHVlKHZhbCwga2V5KSB7XG4gICAgaWYgKGlzUGxhaW5PYmplY3QocmVzdWx0W2tleV0pICYmIGlzUGxhaW5PYmplY3QodmFsKSkge1xuICAgICAgcmVzdWx0W2tleV0gPSBtZXJnZShyZXN1bHRba2V5XSwgdmFsKTtcbiAgICB9IGVsc2UgaWYgKGlzUGxhaW5PYmplY3QodmFsKSkge1xuICAgICAgcmVzdWx0W2tleV0gPSBtZXJnZSh7fSwgdmFsKTtcbiAgICB9IGVsc2UgaWYgKGlzQXJyYXkodmFsKSkge1xuICAgICAgcmVzdWx0W2tleV0gPSB2YWwuc2xpY2UoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0W2tleV0gPSB2YWw7XG4gICAgfVxuICB9XG5cbiAgZm9yICh2YXIgaSA9IDAsIGwgPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgZm9yRWFjaChhcmd1bWVudHNbaV0sIGFzc2lnblZhbHVlKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIEV4dGVuZHMgb2JqZWN0IGEgYnkgbXV0YWJseSBhZGRpbmcgdG8gaXQgdGhlIHByb3BlcnRpZXMgb2Ygb2JqZWN0IGIuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGEgVGhlIG9iamVjdCB0byBiZSBleHRlbmRlZFxuICogQHBhcmFtIHtPYmplY3R9IGIgVGhlIG9iamVjdCB0byBjb3B5IHByb3BlcnRpZXMgZnJvbVxuICogQHBhcmFtIHtPYmplY3R9IHRoaXNBcmcgVGhlIG9iamVjdCB0byBiaW5kIGZ1bmN0aW9uIHRvXG4gKiBAcmV0dXJuIHtPYmplY3R9IFRoZSByZXN1bHRpbmcgdmFsdWUgb2Ygb2JqZWN0IGFcbiAqL1xuZnVuY3Rpb24gZXh0ZW5kKGEsIGIsIHRoaXNBcmcpIHtcbiAgZm9yRWFjaChiLCBmdW5jdGlvbiBhc3NpZ25WYWx1ZSh2YWwsIGtleSkge1xuICAgIGlmICh0aGlzQXJnICYmIHR5cGVvZiB2YWwgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGFba2V5XSA9IGJpbmQodmFsLCB0aGlzQXJnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYVtrZXldID0gdmFsO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBhO1xufVxuXG4vKipcbiAqIFJlbW92ZSBieXRlIG9yZGVyIG1hcmtlci4gVGhpcyBjYXRjaGVzIEVGIEJCIEJGICh0aGUgVVRGLTggQk9NKVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb250ZW50IHdpdGggQk9NXG4gKiBAcmV0dXJuIHtzdHJpbmd9IGNvbnRlbnQgdmFsdWUgd2l0aG91dCBCT01cbiAqL1xuZnVuY3Rpb24gc3RyaXBCT00oY29udGVudCkge1xuICBpZiAoY29udGVudC5jaGFyQ29kZUF0KDApID09PSAweEZFRkYpIHtcbiAgICBjb250ZW50ID0gY29udGVudC5zbGljZSgxKTtcbiAgfVxuICByZXR1cm4gY29udGVudDtcbn1cblxuLyoqXG4gKiBJbmhlcml0IHRoZSBwcm90b3R5cGUgbWV0aG9kcyBmcm9tIG9uZSBjb25zdHJ1Y3RvciBpbnRvIGFub3RoZXJcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBzdXBlckNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge29iamVjdH0gW3Byb3BzXVxuICogQHBhcmFtIHtvYmplY3R9IFtkZXNjcmlwdG9yc11cbiAqL1xuXG5mdW5jdGlvbiBpbmhlcml0cyhjb25zdHJ1Y3Rvciwgc3VwZXJDb25zdHJ1Y3RvciwgcHJvcHMsIGRlc2NyaXB0b3JzKSB7XG4gIGNvbnN0cnVjdG9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIGRlc2NyaXB0b3JzKTtcbiAgY29uc3RydWN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gY29uc3RydWN0b3I7XG4gIHByb3BzICYmIE9iamVjdC5hc3NpZ24oY29uc3RydWN0b3IucHJvdG90eXBlLCBwcm9wcyk7XG59XG5cbi8qKlxuICogUmVzb2x2ZSBvYmplY3Qgd2l0aCBkZWVwIHByb3RvdHlwZSBjaGFpbiB0byBhIGZsYXQgb2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gc291cmNlT2JqIHNvdXJjZSBvYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBbZGVzdE9ial1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtmaWx0ZXJdXG4gKiBAcmV0dXJucyB7T2JqZWN0fVxuICovXG5cbmZ1bmN0aW9uIHRvRmxhdE9iamVjdChzb3VyY2VPYmosIGRlc3RPYmosIGZpbHRlcikge1xuICB2YXIgcHJvcHM7XG4gIHZhciBpO1xuICB2YXIgcHJvcDtcbiAgdmFyIG1lcmdlZCA9IHt9O1xuXG4gIGRlc3RPYmogPSBkZXN0T2JqIHx8IHt9O1xuXG4gIGRvIHtcbiAgICBwcm9wcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHNvdXJjZU9iaik7XG4gICAgaSA9IHByb3BzLmxlbmd0aDtcbiAgICB3aGlsZSAoaS0tID4gMCkge1xuICAgICAgcHJvcCA9IHByb3BzW2ldO1xuICAgICAgaWYgKCFtZXJnZWRbcHJvcF0pIHtcbiAgICAgICAgZGVzdE9ialtwcm9wXSA9IHNvdXJjZU9ialtwcm9wXTtcbiAgICAgICAgbWVyZ2VkW3Byb3BdID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgc291cmNlT2JqID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHNvdXJjZU9iaik7XG4gIH0gd2hpbGUgKHNvdXJjZU9iaiAmJiAoIWZpbHRlciB8fCBmaWx0ZXIoc291cmNlT2JqLCBkZXN0T2JqKSkgJiYgc291cmNlT2JqICE9PSBPYmplY3QucHJvdG90eXBlKTtcblxuICByZXR1cm4gZGVzdE9iajtcbn1cblxuLypcbiAqIGRldGVybWluZXMgd2hldGhlciBhIHN0cmluZyBlbmRzIHdpdGggdGhlIGNoYXJhY3RlcnMgb2YgYSBzcGVjaWZpZWQgc3RyaW5nXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gKiBAcGFyYW0ge1N0cmluZ30gc2VhcmNoU3RyaW5nXG4gKiBAcGFyYW0ge051bWJlcn0gW3Bvc2l0aW9uPSAwXVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGVuZHNXaXRoKHN0ciwgc2VhcmNoU3RyaW5nLCBwb3NpdGlvbikge1xuICBzdHIgPSBTdHJpbmcoc3RyKTtcbiAgaWYgKHBvc2l0aW9uID09PSB1bmRlZmluZWQgfHwgcG9zaXRpb24gPiBzdHIubGVuZ3RoKSB7XG4gICAgcG9zaXRpb24gPSBzdHIubGVuZ3RoO1xuICB9XG4gIHBvc2l0aW9uIC09IHNlYXJjaFN0cmluZy5sZW5ndGg7XG4gIHZhciBsYXN0SW5kZXggPSBzdHIuaW5kZXhPZihzZWFyY2hTdHJpbmcsIHBvc2l0aW9uKTtcbiAgcmV0dXJuIGxhc3RJbmRleCAhPT0gLTEgJiYgbGFzdEluZGV4ID09PSBwb3NpdGlvbjtcbn1cblxuXG4vKipcbiAqIFJldHVybnMgbmV3IGFycmF5IGZyb20gYXJyYXkgbGlrZSBvYmplY3RcbiAqIEBwYXJhbSB7Kn0gW3RoaW5nXVxuICogQHJldHVybnMge0FycmF5fVxuICovXG5mdW5jdGlvbiB0b0FycmF5KHRoaW5nKSB7XG4gIGlmICghdGhpbmcpIHJldHVybiBudWxsO1xuICB2YXIgaSA9IHRoaW5nLmxlbmd0aDtcbiAgaWYgKGlzVW5kZWZpbmVkKGkpKSByZXR1cm4gbnVsbDtcbiAgdmFyIGFyciA9IG5ldyBBcnJheShpKTtcbiAgd2hpbGUgKGktLSA+IDApIHtcbiAgICBhcnJbaV0gPSB0aGluZ1tpXTtcbiAgfVxuICByZXR1cm4gYXJyO1xufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZnVuYy1uYW1lc1xudmFyIGlzVHlwZWRBcnJheSA9IChmdW5jdGlvbihUeXBlZEFycmF5KSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBmdW5jLW5hbWVzXG4gIHJldHVybiBmdW5jdGlvbih0aGluZykge1xuICAgIHJldHVybiBUeXBlZEFycmF5ICYmIHRoaW5nIGluc3RhbmNlb2YgVHlwZWRBcnJheTtcbiAgfTtcbn0pKHR5cGVvZiBVaW50OEFycmF5ICE9PSAndW5kZWZpbmVkJyAmJiBPYmplY3QuZ2V0UHJvdG90eXBlT2YoVWludDhBcnJheSkpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgaXNBcnJheTogaXNBcnJheSxcbiAgaXNBcnJheUJ1ZmZlcjogaXNBcnJheUJ1ZmZlcixcbiAgaXNCdWZmZXI6IGlzQnVmZmVyLFxuICBpc0Zvcm1EYXRhOiBpc0Zvcm1EYXRhLFxuICBpc0FycmF5QnVmZmVyVmlldzogaXNBcnJheUJ1ZmZlclZpZXcsXG4gIGlzU3RyaW5nOiBpc1N0cmluZyxcbiAgaXNOdW1iZXI6IGlzTnVtYmVyLFxuICBpc09iamVjdDogaXNPYmplY3QsXG4gIGlzUGxhaW5PYmplY3Q6IGlzUGxhaW5PYmplY3QsXG4gIGlzVW5kZWZpbmVkOiBpc1VuZGVmaW5lZCxcbiAgaXNEYXRlOiBpc0RhdGUsXG4gIGlzRmlsZTogaXNGaWxlLFxuICBpc0Jsb2I6IGlzQmxvYixcbiAgaXNGdW5jdGlvbjogaXNGdW5jdGlvbixcbiAgaXNTdHJlYW06IGlzU3RyZWFtLFxuICBpc1VSTFNlYXJjaFBhcmFtczogaXNVUkxTZWFyY2hQYXJhbXMsXG4gIGlzU3RhbmRhcmRCcm93c2VyRW52OiBpc1N0YW5kYXJkQnJvd3NlckVudixcbiAgZm9yRWFjaDogZm9yRWFjaCxcbiAgbWVyZ2U6IG1lcmdlLFxuICBleHRlbmQ6IGV4dGVuZCxcbiAgdHJpbTogdHJpbSxcbiAgc3RyaXBCT006IHN0cmlwQk9NLFxuICBpbmhlcml0czogaW5oZXJpdHMsXG4gIHRvRmxhdE9iamVjdDogdG9GbGF0T2JqZWN0LFxuICBraW5kT2Y6IGtpbmRPZixcbiAga2luZE9mVGVzdDoga2luZE9mVGVzdCxcbiAgZW5kc1dpdGg6IGVuZHNXaXRoLFxuICB0b0FycmF5OiB0b0FycmF5LFxuICBpc1R5cGVkQXJyYXk6IGlzVHlwZWRBcnJheSxcbiAgaXNGaWxlTGlzdDogaXNGaWxlTGlzdFxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi8uLi91dGlscycpO1xuXG5mdW5jdGlvbiBlbmNvZGUodmFsKSB7XG4gIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQodmFsKS5cbiAgICByZXBsYWNlKC8lM0EvZ2ksICc6JykuXG4gICAgcmVwbGFjZSgvJTI0L2csICckJykuXG4gICAgcmVwbGFjZSgvJTJDL2dpLCAnLCcpLlxuICAgIHJlcGxhY2UoLyUyMC9nLCAnKycpLlxuICAgIHJlcGxhY2UoLyU1Qi9naSwgJ1snKS5cbiAgICByZXBsYWNlKC8lNUQvZ2ksICddJyk7XG59XG5cbi8qKlxuICogQnVpbGQgYSBVUkwgYnkgYXBwZW5kaW5nIHBhcmFtcyB0byB0aGUgZW5kXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHVybCBUaGUgYmFzZSBvZiB0aGUgdXJsIChlLmcuLCBodHRwOi8vd3d3Lmdvb2dsZS5jb20pXG4gKiBAcGFyYW0ge29iamVjdH0gW3BhcmFtc10gVGhlIHBhcmFtcyB0byBiZSBhcHBlbmRlZFxuICogQHJldHVybnMge3N0cmluZ30gVGhlIGZvcm1hdHRlZCB1cmxcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBidWlsZFVSTCh1cmwsIHBhcmFtcywgcGFyYW1zU2VyaWFsaXplcikge1xuICAvKmVzbGludCBuby1wYXJhbS1yZWFzc2lnbjowKi9cbiAgaWYgKCFwYXJhbXMpIHtcbiAgICByZXR1cm4gdXJsO1xuICB9XG5cbiAgdmFyIHNlcmlhbGl6ZWRQYXJhbXM7XG4gIGlmIChwYXJhbXNTZXJpYWxpemVyKSB7XG4gICAgc2VyaWFsaXplZFBhcmFtcyA9IHBhcmFtc1NlcmlhbGl6ZXIocGFyYW1zKTtcbiAgfSBlbHNlIGlmICh1dGlscy5pc1VSTFNlYXJjaFBhcmFtcyhwYXJhbXMpKSB7XG4gICAgc2VyaWFsaXplZFBhcmFtcyA9IHBhcmFtcy50b1N0cmluZygpO1xuICB9IGVsc2Uge1xuICAgIHZhciBwYXJ0cyA9IFtdO1xuXG4gICAgdXRpbHMuZm9yRWFjaChwYXJhbXMsIGZ1bmN0aW9uIHNlcmlhbGl6ZSh2YWwsIGtleSkge1xuICAgICAgaWYgKHZhbCA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICh1dGlscy5pc0FycmF5KHZhbCkpIHtcbiAgICAgICAga2V5ID0ga2V5ICsgJ1tdJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbCA9IFt2YWxdO1xuICAgICAgfVxuXG4gICAgICB1dGlscy5mb3JFYWNoKHZhbCwgZnVuY3Rpb24gcGFyc2VWYWx1ZSh2KSB7XG4gICAgICAgIGlmICh1dGlscy5pc0RhdGUodikpIHtcbiAgICAgICAgICB2ID0gdi50b0lTT1N0cmluZygpO1xuICAgICAgICB9IGVsc2UgaWYgKHV0aWxzLmlzT2JqZWN0KHYpKSB7XG4gICAgICAgICAgdiA9IEpTT04uc3RyaW5naWZ5KHYpO1xuICAgICAgICB9XG4gICAgICAgIHBhcnRzLnB1c2goZW5jb2RlKGtleSkgKyAnPScgKyBlbmNvZGUodikpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBzZXJpYWxpemVkUGFyYW1zID0gcGFydHMuam9pbignJicpO1xuICB9XG5cbiAgaWYgKHNlcmlhbGl6ZWRQYXJhbXMpIHtcbiAgICB2YXIgaGFzaG1hcmtJbmRleCA9IHVybC5pbmRleE9mKCcjJyk7XG4gICAgaWYgKGhhc2htYXJrSW5kZXggIT09IC0xKSB7XG4gICAgICB1cmwgPSB1cmwuc2xpY2UoMCwgaGFzaG1hcmtJbmRleCk7XG4gICAgfVxuXG4gICAgdXJsICs9ICh1cmwuaW5kZXhPZignPycpID09PSAtMSA/ICc/JyA6ICcmJykgKyBzZXJpYWxpemVkUGFyYW1zO1xuICB9XG5cbiAgcmV0dXJuIHVybDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vLi4vdXRpbHMnKTtcblxuZnVuY3Rpb24gSW50ZXJjZXB0b3JNYW5hZ2VyKCkge1xuICB0aGlzLmhhbmRsZXJzID0gW107XG59XG5cbi8qKlxuICogQWRkIGEgbmV3IGludGVyY2VwdG9yIHRvIHRoZSBzdGFja1xuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bGZpbGxlZCBUaGUgZnVuY3Rpb24gdG8gaGFuZGxlIGB0aGVuYCBmb3IgYSBgUHJvbWlzZWBcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHJlamVjdGVkIFRoZSBmdW5jdGlvbiB0byBoYW5kbGUgYHJlamVjdGAgZm9yIGEgYFByb21pc2VgXG4gKlxuICogQHJldHVybiB7TnVtYmVyfSBBbiBJRCB1c2VkIHRvIHJlbW92ZSBpbnRlcmNlcHRvciBsYXRlclxuICovXG5JbnRlcmNlcHRvck1hbmFnZXIucHJvdG90eXBlLnVzZSA9IGZ1bmN0aW9uIHVzZShmdWxmaWxsZWQsIHJlamVjdGVkLCBvcHRpb25zKSB7XG4gIHRoaXMuaGFuZGxlcnMucHVzaCh7XG4gICAgZnVsZmlsbGVkOiBmdWxmaWxsZWQsXG4gICAgcmVqZWN0ZWQ6IHJlamVjdGVkLFxuICAgIHN5bmNocm9ub3VzOiBvcHRpb25zID8gb3B0aW9ucy5zeW5jaHJvbm91cyA6IGZhbHNlLFxuICAgIHJ1bldoZW46IG9wdGlvbnMgPyBvcHRpb25zLnJ1bldoZW4gOiBudWxsXG4gIH0pO1xuICByZXR1cm4gdGhpcy5oYW5kbGVycy5sZW5ndGggLSAxO1xufTtcblxuLyoqXG4gKiBSZW1vdmUgYW4gaW50ZXJjZXB0b3IgZnJvbSB0aGUgc3RhY2tcbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gaWQgVGhlIElEIHRoYXQgd2FzIHJldHVybmVkIGJ5IGB1c2VgXG4gKi9cbkludGVyY2VwdG9yTWFuYWdlci5wcm90b3R5cGUuZWplY3QgPSBmdW5jdGlvbiBlamVjdChpZCkge1xuICBpZiAodGhpcy5oYW5kbGVyc1tpZF0pIHtcbiAgICB0aGlzLmhhbmRsZXJzW2lkXSA9IG51bGw7XG4gIH1cbn07XG5cbi8qKlxuICogSXRlcmF0ZSBvdmVyIGFsbCB0aGUgcmVnaXN0ZXJlZCBpbnRlcmNlcHRvcnNcbiAqXG4gKiBUaGlzIG1ldGhvZCBpcyBwYXJ0aWN1bGFybHkgdXNlZnVsIGZvciBza2lwcGluZyBvdmVyIGFueVxuICogaW50ZXJjZXB0b3JzIHRoYXQgbWF5IGhhdmUgYmVjb21lIGBudWxsYCBjYWxsaW5nIGBlamVjdGAuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGZ1bmN0aW9uIHRvIGNhbGwgZm9yIGVhY2ggaW50ZXJjZXB0b3JcbiAqL1xuSW50ZXJjZXB0b3JNYW5hZ2VyLnByb3RvdHlwZS5mb3JFYWNoID0gZnVuY3Rpb24gZm9yRWFjaChmbikge1xuICB1dGlscy5mb3JFYWNoKHRoaXMuaGFuZGxlcnMsIGZ1bmN0aW9uIGZvckVhY2hIYW5kbGVyKGgpIHtcbiAgICBpZiAoaCAhPT0gbnVsbCkge1xuICAgICAgZm4oaCk7XG4gICAgfVxuICB9KTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gSW50ZXJjZXB0b3JNYW5hZ2VyO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIG5vcm1hbGl6ZUhlYWRlck5hbWUoaGVhZGVycywgbm9ybWFsaXplZE5hbWUpIHtcbiAgdXRpbHMuZm9yRWFjaChoZWFkZXJzLCBmdW5jdGlvbiBwcm9jZXNzSGVhZGVyKHZhbHVlLCBuYW1lKSB7XG4gICAgaWYgKG5hbWUgIT09IG5vcm1hbGl6ZWROYW1lICYmIG5hbWUudG9VcHBlckNhc2UoKSA9PT0gbm9ybWFsaXplZE5hbWUudG9VcHBlckNhc2UoKSkge1xuICAgICAgaGVhZGVyc1tub3JtYWxpemVkTmFtZV0gPSB2YWx1ZTtcbiAgICAgIGRlbGV0ZSBoZWFkZXJzW25hbWVdO1xuICAgIH1cbiAgfSk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xuXG4vKipcbiAqIENyZWF0ZSBhbiBFcnJvciB3aXRoIHRoZSBzcGVjaWZpZWQgbWVzc2FnZSwgY29uZmlnLCBlcnJvciBjb2RlLCByZXF1ZXN0IGFuZCByZXNwb25zZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZSBUaGUgZXJyb3IgbWVzc2FnZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbY29kZV0gVGhlIGVycm9yIGNvZGUgKGZvciBleGFtcGxlLCAnRUNPTk5BQk9SVEVEJykuXG4gKiBAcGFyYW0ge09iamVjdH0gW2NvbmZpZ10gVGhlIGNvbmZpZy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcmVxdWVzdF0gVGhlIHJlcXVlc3QuXG4gKiBAcGFyYW0ge09iamVjdH0gW3Jlc3BvbnNlXSBUaGUgcmVzcG9uc2UuXG4gKiBAcmV0dXJucyB7RXJyb3J9IFRoZSBjcmVhdGVkIGVycm9yLlxuICovXG5mdW5jdGlvbiBBeGlvc0Vycm9yKG1lc3NhZ2UsIGNvZGUsIGNvbmZpZywgcmVxdWVzdCwgcmVzcG9uc2UpIHtcbiAgRXJyb3IuY2FsbCh0aGlzKTtcbiAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTtcbiAgdGhpcy5uYW1lID0gJ0F4aW9zRXJyb3InO1xuICBjb2RlICYmICh0aGlzLmNvZGUgPSBjb2RlKTtcbiAgY29uZmlnICYmICh0aGlzLmNvbmZpZyA9IGNvbmZpZyk7XG4gIHJlcXVlc3QgJiYgKHRoaXMucmVxdWVzdCA9IHJlcXVlc3QpO1xuICByZXNwb25zZSAmJiAodGhpcy5yZXNwb25zZSA9IHJlc3BvbnNlKTtcbn1cblxudXRpbHMuaW5oZXJpdHMoQXhpb3NFcnJvciwgRXJyb3IsIHtcbiAgdG9KU09OOiBmdW5jdGlvbiB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC8vIFN0YW5kYXJkXG4gICAgICBtZXNzYWdlOiB0aGlzLm1lc3NhZ2UsXG4gICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICAvLyBNaWNyb3NvZnRcbiAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLmRlc2NyaXB0aW9uLFxuICAgICAgbnVtYmVyOiB0aGlzLm51bWJlcixcbiAgICAgIC8vIE1vemlsbGFcbiAgICAgIGZpbGVOYW1lOiB0aGlzLmZpbGVOYW1lLFxuICAgICAgbGluZU51bWJlcjogdGhpcy5saW5lTnVtYmVyLFxuICAgICAgY29sdW1uTnVtYmVyOiB0aGlzLmNvbHVtbk51bWJlcixcbiAgICAgIHN0YWNrOiB0aGlzLnN0YWNrLFxuICAgICAgLy8gQXhpb3NcbiAgICAgIGNvbmZpZzogdGhpcy5jb25maWcsXG4gICAgICBjb2RlOiB0aGlzLmNvZGUsXG4gICAgICBzdGF0dXM6IHRoaXMucmVzcG9uc2UgJiYgdGhpcy5yZXNwb25zZS5zdGF0dXMgPyB0aGlzLnJlc3BvbnNlLnN0YXR1cyA6IG51bGxcbiAgICB9O1xuICB9XG59KTtcblxudmFyIHByb3RvdHlwZSA9IEF4aW9zRXJyb3IucHJvdG90eXBlO1xudmFyIGRlc2NyaXB0b3JzID0ge307XG5cbltcbiAgJ0VSUl9CQURfT1BUSU9OX1ZBTFVFJyxcbiAgJ0VSUl9CQURfT1BUSU9OJyxcbiAgJ0VDT05OQUJPUlRFRCcsXG4gICdFVElNRURPVVQnLFxuICAnRVJSX05FVFdPUksnLFxuICAnRVJSX0ZSX1RPT19NQU5ZX1JFRElSRUNUUycsXG4gICdFUlJfREVQUkVDQVRFRCcsXG4gICdFUlJfQkFEX1JFU1BPTlNFJyxcbiAgJ0VSUl9CQURfUkVRVUVTVCcsXG4gICdFUlJfQ0FOQ0VMRUQnXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZnVuYy1uYW1lc1xuXS5mb3JFYWNoKGZ1bmN0aW9uKGNvZGUpIHtcbiAgZGVzY3JpcHRvcnNbY29kZV0gPSB7dmFsdWU6IGNvZGV9O1xufSk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKEF4aW9zRXJyb3IsIGRlc2NyaXB0b3JzKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShwcm90b3R5cGUsICdpc0F4aW9zRXJyb3InLCB7dmFsdWU6IHRydWV9KTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGZ1bmMtbmFtZXNcbkF4aW9zRXJyb3IuZnJvbSA9IGZ1bmN0aW9uKGVycm9yLCBjb2RlLCBjb25maWcsIHJlcXVlc3QsIHJlc3BvbnNlLCBjdXN0b21Qcm9wcykge1xuICB2YXIgYXhpb3NFcnJvciA9IE9iamVjdC5jcmVhdGUocHJvdG90eXBlKTtcblxuICB1dGlscy50b0ZsYXRPYmplY3QoZXJyb3IsIGF4aW9zRXJyb3IsIGZ1bmN0aW9uIGZpbHRlcihvYmopIHtcbiAgICByZXR1cm4gb2JqICE9PSBFcnJvci5wcm90b3R5cGU7XG4gIH0pO1xuXG4gIEF4aW9zRXJyb3IuY2FsbChheGlvc0Vycm9yLCBlcnJvci5tZXNzYWdlLCBjb2RlLCBjb25maWcsIHJlcXVlc3QsIHJlc3BvbnNlKTtcblxuICBheGlvc0Vycm9yLm5hbWUgPSBlcnJvci5uYW1lO1xuXG4gIGN1c3RvbVByb3BzICYmIE9iamVjdC5hc3NpZ24oYXhpb3NFcnJvciwgY3VzdG9tUHJvcHMpO1xuXG4gIHJldHVybiBheGlvc0Vycm9yO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBBeGlvc0Vycm9yO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgc2lsZW50SlNPTlBhcnNpbmc6IHRydWUsXG4gIGZvcmNlZEpTT05QYXJzaW5nOiB0cnVlLFxuICBjbGFyaWZ5VGltZW91dEVycm9yOiBmYWxzZVxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcblxuLyoqXG4gKiBDb252ZXJ0IGEgZGF0YSBvYmplY3QgdG8gRm9ybURhdGFcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmpcbiAqIEBwYXJhbSB7P09iamVjdH0gW2Zvcm1EYXRhXVxuICogQHJldHVybnMge09iamVjdH1cbiAqKi9cblxuZnVuY3Rpb24gdG9Gb3JtRGF0YShvYmosIGZvcm1EYXRhKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICBmb3JtRGF0YSA9IGZvcm1EYXRhIHx8IG5ldyBGb3JtRGF0YSgpO1xuXG4gIHZhciBzdGFjayA9IFtdO1xuXG4gIGZ1bmN0aW9uIGNvbnZlcnRWYWx1ZSh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkgcmV0dXJuICcnO1xuXG4gICAgaWYgKHV0aWxzLmlzRGF0ZSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB2YWx1ZS50b0lTT1N0cmluZygpO1xuICAgIH1cblxuICAgIGlmICh1dGlscy5pc0FycmF5QnVmZmVyKHZhbHVlKSB8fCB1dGlscy5pc1R5cGVkQXJyYXkodmFsdWUpKSB7XG4gICAgICByZXR1cm4gdHlwZW9mIEJsb2IgPT09ICdmdW5jdGlvbicgPyBuZXcgQmxvYihbdmFsdWVdKSA6IEJ1ZmZlci5mcm9tKHZhbHVlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBmdW5jdGlvbiBidWlsZChkYXRhLCBwYXJlbnRLZXkpIHtcbiAgICBpZiAodXRpbHMuaXNQbGFpbk9iamVjdChkYXRhKSB8fCB1dGlscy5pc0FycmF5KGRhdGEpKSB7XG4gICAgICBpZiAoc3RhY2suaW5kZXhPZihkYXRhKSAhPT0gLTEpIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoJ0NpcmN1bGFyIHJlZmVyZW5jZSBkZXRlY3RlZCBpbiAnICsgcGFyZW50S2V5KTtcbiAgICAgIH1cblxuICAgICAgc3RhY2sucHVzaChkYXRhKTtcblxuICAgICAgdXRpbHMuZm9yRWFjaChkYXRhLCBmdW5jdGlvbiBlYWNoKHZhbHVlLCBrZXkpIHtcbiAgICAgICAgaWYgKHV0aWxzLmlzVW5kZWZpbmVkKHZhbHVlKSkgcmV0dXJuO1xuICAgICAgICB2YXIgZnVsbEtleSA9IHBhcmVudEtleSA/IHBhcmVudEtleSArICcuJyArIGtleSA6IGtleTtcbiAgICAgICAgdmFyIGFycjtcblxuICAgICAgICBpZiAodmFsdWUgJiYgIXBhcmVudEtleSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgaWYgKHV0aWxzLmVuZHNXaXRoKGtleSwgJ3t9JykpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICAgICAgdmFsdWUgPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gICAgICAgICAgfSBlbHNlIGlmICh1dGlscy5lbmRzV2l0aChrZXksICdbXScpICYmIChhcnIgPSB1dGlscy50b0FycmF5KHZhbHVlKSkpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBmdW5jLW5hbWVzXG4gICAgICAgICAgICBhcnIuZm9yRWFjaChmdW5jdGlvbihlbCkge1xuICAgICAgICAgICAgICAhdXRpbHMuaXNVbmRlZmluZWQoZWwpICYmIGZvcm1EYXRhLmFwcGVuZChmdWxsS2V5LCBjb252ZXJ0VmFsdWUoZWwpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGJ1aWxkKHZhbHVlLCBmdWxsS2V5KTtcbiAgICAgIH0pO1xuXG4gICAgICBzdGFjay5wb3AoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9ybURhdGEuYXBwZW5kKHBhcmVudEtleSwgY29udmVydFZhbHVlKGRhdGEpKTtcbiAgICB9XG4gIH1cblxuICBidWlsZChvYmopO1xuXG4gIHJldHVybiBmb3JtRGF0YTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB0b0Zvcm1EYXRhO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQXhpb3NFcnJvciA9IHJlcXVpcmUoJy4vQXhpb3NFcnJvcicpO1xuXG4vKipcbiAqIFJlc29sdmUgb3IgcmVqZWN0IGEgUHJvbWlzZSBiYXNlZCBvbiByZXNwb25zZSBzdGF0dXMuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcmVzb2x2ZSBBIGZ1bmN0aW9uIHRoYXQgcmVzb2x2ZXMgdGhlIHByb21pc2UuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSByZWplY3QgQSBmdW5jdGlvbiB0aGF0IHJlamVjdHMgdGhlIHByb21pc2UuXG4gKiBAcGFyYW0ge29iamVjdH0gcmVzcG9uc2UgVGhlIHJlc3BvbnNlLlxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHNldHRsZShyZXNvbHZlLCByZWplY3QsIHJlc3BvbnNlKSB7XG4gIHZhciB2YWxpZGF0ZVN0YXR1cyA9IHJlc3BvbnNlLmNvbmZpZy52YWxpZGF0ZVN0YXR1cztcbiAgaWYgKCFyZXNwb25zZS5zdGF0dXMgfHwgIXZhbGlkYXRlU3RhdHVzIHx8IHZhbGlkYXRlU3RhdHVzKHJlc3BvbnNlLnN0YXR1cykpIHtcbiAgICByZXNvbHZlKHJlc3BvbnNlKTtcbiAgfSBlbHNlIHtcbiAgICByZWplY3QobmV3IEF4aW9zRXJyb3IoXG4gICAgICAnUmVxdWVzdCBmYWlsZWQgd2l0aCBzdGF0dXMgY29kZSAnICsgcmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgW0F4aW9zRXJyb3IuRVJSX0JBRF9SRVFVRVNULCBBeGlvc0Vycm9yLkVSUl9CQURfUkVTUE9OU0VdW01hdGguZmxvb3IocmVzcG9uc2Uuc3RhdHVzIC8gMTAwKSAtIDRdLFxuICAgICAgcmVzcG9uc2UuY29uZmlnLFxuICAgICAgcmVzcG9uc2UucmVxdWVzdCxcbiAgICAgIHJlc3BvbnNlXG4gICAgKSk7XG4gIH1cbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vLi4vdXRpbHMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSAoXG4gIHV0aWxzLmlzU3RhbmRhcmRCcm93c2VyRW52KCkgP1xuXG4gIC8vIFN0YW5kYXJkIGJyb3dzZXIgZW52cyBzdXBwb3J0IGRvY3VtZW50LmNvb2tpZVxuICAgIChmdW5jdGlvbiBzdGFuZGFyZEJyb3dzZXJFbnYoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB3cml0ZTogZnVuY3Rpb24gd3JpdGUobmFtZSwgdmFsdWUsIGV4cGlyZXMsIHBhdGgsIGRvbWFpbiwgc2VjdXJlKSB7XG4gICAgICAgICAgdmFyIGNvb2tpZSA9IFtdO1xuICAgICAgICAgIGNvb2tpZS5wdXNoKG5hbWUgKyAnPScgKyBlbmNvZGVVUklDb21wb25lbnQodmFsdWUpKTtcblxuICAgICAgICAgIGlmICh1dGlscy5pc051bWJlcihleHBpcmVzKSkge1xuICAgICAgICAgICAgY29va2llLnB1c2goJ2V4cGlyZXM9JyArIG5ldyBEYXRlKGV4cGlyZXMpLnRvR01UU3RyaW5nKCkpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh1dGlscy5pc1N0cmluZyhwYXRoKSkge1xuICAgICAgICAgICAgY29va2llLnB1c2goJ3BhdGg9JyArIHBhdGgpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh1dGlscy5pc1N0cmluZyhkb21haW4pKSB7XG4gICAgICAgICAgICBjb29raWUucHVzaCgnZG9tYWluPScgKyBkb21haW4pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChzZWN1cmUgPT09IHRydWUpIHtcbiAgICAgICAgICAgIGNvb2tpZS5wdXNoKCdzZWN1cmUnKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBkb2N1bWVudC5jb29raWUgPSBjb29raWUuam9pbignOyAnKTtcbiAgICAgICAgfSxcblxuICAgICAgICByZWFkOiBmdW5jdGlvbiByZWFkKG5hbWUpIHtcbiAgICAgICAgICB2YXIgbWF0Y2ggPSBkb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cCgnKF58O1xcXFxzKikoJyArIG5hbWUgKyAnKT0oW147XSopJykpO1xuICAgICAgICAgIHJldHVybiAobWF0Y2ggPyBkZWNvZGVVUklDb21wb25lbnQobWF0Y2hbM10pIDogbnVsbCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgcmVtb3ZlOiBmdW5jdGlvbiByZW1vdmUobmFtZSkge1xuICAgICAgICAgIHRoaXMud3JpdGUobmFtZSwgJycsIERhdGUubm93KCkgLSA4NjQwMDAwMCk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSkoKSA6XG5cbiAgLy8gTm9uIHN0YW5kYXJkIGJyb3dzZXIgZW52ICh3ZWIgd29ya2VycywgcmVhY3QtbmF0aXZlKSBsYWNrIG5lZWRlZCBzdXBwb3J0LlxuICAgIChmdW5jdGlvbiBub25TdGFuZGFyZEJyb3dzZXJFbnYoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB3cml0ZTogZnVuY3Rpb24gd3JpdGUoKSB7fSxcbiAgICAgICAgcmVhZDogZnVuY3Rpb24gcmVhZCgpIHsgcmV0dXJuIG51bGw7IH0sXG4gICAgICAgIHJlbW92ZTogZnVuY3Rpb24gcmVtb3ZlKCkge31cbiAgICAgIH07XG4gICAgfSkoKVxuKTtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBVUkwgaXMgYWJzb2x1dGVcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdXJsIFRoZSBVUkwgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIHNwZWNpZmllZCBVUkwgaXMgYWJzb2x1dGUsIG90aGVyd2lzZSBmYWxzZVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzQWJzb2x1dGVVUkwodXJsKSB7XG4gIC8vIEEgVVJMIGlzIGNvbnNpZGVyZWQgYWJzb2x1dGUgaWYgaXQgYmVnaW5zIHdpdGggXCI8c2NoZW1lPjovL1wiIG9yIFwiLy9cIiAocHJvdG9jb2wtcmVsYXRpdmUgVVJMKS5cbiAgLy8gUkZDIDM5ODYgZGVmaW5lcyBzY2hlbWUgbmFtZSBhcyBhIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMgYmVnaW5uaW5nIHdpdGggYSBsZXR0ZXIgYW5kIGZvbGxvd2VkXG4gIC8vIGJ5IGFueSBjb21iaW5hdGlvbiBvZiBsZXR0ZXJzLCBkaWdpdHMsIHBsdXMsIHBlcmlvZCwgb3IgaHlwaGVuLlxuICByZXR1cm4gL14oW2Etel1bYS16XFxkK1xcLS5dKjopP1xcL1xcLy9pLnRlc3QodXJsKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBVUkwgYnkgY29tYmluaW5nIHRoZSBzcGVjaWZpZWQgVVJMc1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlVVJMIFRoZSBiYXNlIFVSTFxuICogQHBhcmFtIHtzdHJpbmd9IHJlbGF0aXZlVVJMIFRoZSByZWxhdGl2ZSBVUkxcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBjb21iaW5lZCBVUkxcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBjb21iaW5lVVJMcyhiYXNlVVJMLCByZWxhdGl2ZVVSTCkge1xuICByZXR1cm4gcmVsYXRpdmVVUkxcbiAgICA/IGJhc2VVUkwucmVwbGFjZSgvXFwvKyQvLCAnJykgKyAnLycgKyByZWxhdGl2ZVVSTC5yZXBsYWNlKC9eXFwvKy8sICcnKVxuICAgIDogYmFzZVVSTDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBpc0Fic29sdXRlVVJMID0gcmVxdWlyZSgnLi4vaGVscGVycy9pc0Fic29sdXRlVVJMJyk7XG52YXIgY29tYmluZVVSTHMgPSByZXF1aXJlKCcuLi9oZWxwZXJzL2NvbWJpbmVVUkxzJyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBVUkwgYnkgY29tYmluaW5nIHRoZSBiYXNlVVJMIHdpdGggdGhlIHJlcXVlc3RlZFVSTCxcbiAqIG9ubHkgd2hlbiB0aGUgcmVxdWVzdGVkVVJMIGlzIG5vdCBhbHJlYWR5IGFuIGFic29sdXRlIFVSTC5cbiAqIElmIHRoZSByZXF1ZXN0VVJMIGlzIGFic29sdXRlLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHJlcXVlc3RlZFVSTCB1bnRvdWNoZWQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGJhc2VVUkwgVGhlIGJhc2UgVVJMXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVxdWVzdGVkVVJMIEFic29sdXRlIG9yIHJlbGF0aXZlIFVSTCB0byBjb21iaW5lXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgY29tYmluZWQgZnVsbCBwYXRoXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gYnVpbGRGdWxsUGF0aChiYXNlVVJMLCByZXF1ZXN0ZWRVUkwpIHtcbiAgaWYgKGJhc2VVUkwgJiYgIWlzQWJzb2x1dGVVUkwocmVxdWVzdGVkVVJMKSkge1xuICAgIHJldHVybiBjb21iaW5lVVJMcyhiYXNlVVJMLCByZXF1ZXN0ZWRVUkwpO1xuICB9XG4gIHJldHVybiByZXF1ZXN0ZWRVUkw7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLy4uL3V0aWxzJyk7XG5cbi8vIEhlYWRlcnMgd2hvc2UgZHVwbGljYXRlcyBhcmUgaWdub3JlZCBieSBub2RlXG4vLyBjLmYuIGh0dHBzOi8vbm9kZWpzLm9yZy9hcGkvaHR0cC5odG1sI2h0dHBfbWVzc2FnZV9oZWFkZXJzXG52YXIgaWdub3JlRHVwbGljYXRlT2YgPSBbXG4gICdhZ2UnLCAnYXV0aG9yaXphdGlvbicsICdjb250ZW50LWxlbmd0aCcsICdjb250ZW50LXR5cGUnLCAnZXRhZycsXG4gICdleHBpcmVzJywgJ2Zyb20nLCAnaG9zdCcsICdpZi1tb2RpZmllZC1zaW5jZScsICdpZi11bm1vZGlmaWVkLXNpbmNlJyxcbiAgJ2xhc3QtbW9kaWZpZWQnLCAnbG9jYXRpb24nLCAnbWF4LWZvcndhcmRzJywgJ3Byb3h5LWF1dGhvcml6YXRpb24nLFxuICAncmVmZXJlcicsICdyZXRyeS1hZnRlcicsICd1c2VyLWFnZW50J1xuXTtcblxuLyoqXG4gKiBQYXJzZSBoZWFkZXJzIGludG8gYW4gb2JqZWN0XG4gKlxuICogYGBgXG4gKiBEYXRlOiBXZWQsIDI3IEF1ZyAyMDE0IDA4OjU4OjQ5IEdNVFxuICogQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uXG4gKiBDb25uZWN0aW9uOiBrZWVwLWFsaXZlXG4gKiBUcmFuc2Zlci1FbmNvZGluZzogY2h1bmtlZFxuICogYGBgXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGhlYWRlcnMgSGVhZGVycyBuZWVkaW5nIHRvIGJlIHBhcnNlZFxuICogQHJldHVybnMge09iamVjdH0gSGVhZGVycyBwYXJzZWQgaW50byBhbiBvYmplY3RcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBwYXJzZUhlYWRlcnMoaGVhZGVycykge1xuICB2YXIgcGFyc2VkID0ge307XG4gIHZhciBrZXk7XG4gIHZhciB2YWw7XG4gIHZhciBpO1xuXG4gIGlmICghaGVhZGVycykgeyByZXR1cm4gcGFyc2VkOyB9XG5cbiAgdXRpbHMuZm9yRWFjaChoZWFkZXJzLnNwbGl0KCdcXG4nKSwgZnVuY3Rpb24gcGFyc2VyKGxpbmUpIHtcbiAgICBpID0gbGluZS5pbmRleE9mKCc6Jyk7XG4gICAga2V5ID0gdXRpbHMudHJpbShsaW5lLnN1YnN0cigwLCBpKSkudG9Mb3dlckNhc2UoKTtcbiAgICB2YWwgPSB1dGlscy50cmltKGxpbmUuc3Vic3RyKGkgKyAxKSk7XG5cbiAgICBpZiAoa2V5KSB7XG4gICAgICBpZiAocGFyc2VkW2tleV0gJiYgaWdub3JlRHVwbGljYXRlT2YuaW5kZXhPZihrZXkpID49IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGtleSA9PT0gJ3NldC1jb29raWUnKSB7XG4gICAgICAgIHBhcnNlZFtrZXldID0gKHBhcnNlZFtrZXldID8gcGFyc2VkW2tleV0gOiBbXSkuY29uY2F0KFt2YWxdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhcnNlZFtrZXldID0gcGFyc2VkW2tleV0gPyBwYXJzZWRba2V5XSArICcsICcgKyB2YWwgOiB2YWw7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gcGFyc2VkO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi8uLi91dGlscycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IChcbiAgdXRpbHMuaXNTdGFuZGFyZEJyb3dzZXJFbnYoKSA/XG5cbiAgLy8gU3RhbmRhcmQgYnJvd3NlciBlbnZzIGhhdmUgZnVsbCBzdXBwb3J0IG9mIHRoZSBBUElzIG5lZWRlZCB0byB0ZXN0XG4gIC8vIHdoZXRoZXIgdGhlIHJlcXVlc3QgVVJMIGlzIG9mIHRoZSBzYW1lIG9yaWdpbiBhcyBjdXJyZW50IGxvY2F0aW9uLlxuICAgIChmdW5jdGlvbiBzdGFuZGFyZEJyb3dzZXJFbnYoKSB7XG4gICAgICB2YXIgbXNpZSA9IC8obXNpZXx0cmlkZW50KS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7XG4gICAgICB2YXIgdXJsUGFyc2luZ05vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgICB2YXIgb3JpZ2luVVJMO1xuXG4gICAgICAvKipcbiAgICAqIFBhcnNlIGEgVVJMIHRvIGRpc2NvdmVyIGl0J3MgY29tcG9uZW50c1xuICAgICpcbiAgICAqIEBwYXJhbSB7U3RyaW5nfSB1cmwgVGhlIFVSTCB0byBiZSBwYXJzZWRcbiAgICAqIEByZXR1cm5zIHtPYmplY3R9XG4gICAgKi9cbiAgICAgIGZ1bmN0aW9uIHJlc29sdmVVUkwodXJsKSB7XG4gICAgICAgIHZhciBocmVmID0gdXJsO1xuXG4gICAgICAgIGlmIChtc2llKSB7XG4gICAgICAgIC8vIElFIG5lZWRzIGF0dHJpYnV0ZSBzZXQgdHdpY2UgdG8gbm9ybWFsaXplIHByb3BlcnRpZXNcbiAgICAgICAgICB1cmxQYXJzaW5nTm9kZS5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCBocmVmKTtcbiAgICAgICAgICBocmVmID0gdXJsUGFyc2luZ05vZGUuaHJlZjtcbiAgICAgICAgfVxuXG4gICAgICAgIHVybFBhcnNpbmdOb2RlLnNldEF0dHJpYnV0ZSgnaHJlZicsIGhyZWYpO1xuXG4gICAgICAgIC8vIHVybFBhcnNpbmdOb2RlIHByb3ZpZGVzIHRoZSBVcmxVdGlscyBpbnRlcmZhY2UgLSBodHRwOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jdXJsdXRpbHNcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBocmVmOiB1cmxQYXJzaW5nTm9kZS5ocmVmLFxuICAgICAgICAgIHByb3RvY29sOiB1cmxQYXJzaW5nTm9kZS5wcm90b2NvbCA/IHVybFBhcnNpbmdOb2RlLnByb3RvY29sLnJlcGxhY2UoLzokLywgJycpIDogJycsXG4gICAgICAgICAgaG9zdDogdXJsUGFyc2luZ05vZGUuaG9zdCxcbiAgICAgICAgICBzZWFyY2g6IHVybFBhcnNpbmdOb2RlLnNlYXJjaCA/IHVybFBhcnNpbmdOb2RlLnNlYXJjaC5yZXBsYWNlKC9eXFw/LywgJycpIDogJycsXG4gICAgICAgICAgaGFzaDogdXJsUGFyc2luZ05vZGUuaGFzaCA/IHVybFBhcnNpbmdOb2RlLmhhc2gucmVwbGFjZSgvXiMvLCAnJykgOiAnJyxcbiAgICAgICAgICBob3N0bmFtZTogdXJsUGFyc2luZ05vZGUuaG9zdG5hbWUsXG4gICAgICAgICAgcG9ydDogdXJsUGFyc2luZ05vZGUucG9ydCxcbiAgICAgICAgICBwYXRobmFtZTogKHVybFBhcnNpbmdOb2RlLnBhdGhuYW1lLmNoYXJBdCgwKSA9PT0gJy8nKSA/XG4gICAgICAgICAgICB1cmxQYXJzaW5nTm9kZS5wYXRobmFtZSA6XG4gICAgICAgICAgICAnLycgKyB1cmxQYXJzaW5nTm9kZS5wYXRobmFtZVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBvcmlnaW5VUkwgPSByZXNvbHZlVVJMKHdpbmRvdy5sb2NhdGlvbi5ocmVmKTtcblxuICAgICAgLyoqXG4gICAgKiBEZXRlcm1pbmUgaWYgYSBVUkwgc2hhcmVzIHRoZSBzYW1lIG9yaWdpbiBhcyB0aGUgY3VycmVudCBsb2NhdGlvblxuICAgICpcbiAgICAqIEBwYXJhbSB7U3RyaW5nfSByZXF1ZXN0VVJMIFRoZSBVUkwgdG8gdGVzdFxuICAgICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgVVJMIHNoYXJlcyB0aGUgc2FtZSBvcmlnaW4sIG90aGVyd2lzZSBmYWxzZVxuICAgICovXG4gICAgICByZXR1cm4gZnVuY3Rpb24gaXNVUkxTYW1lT3JpZ2luKHJlcXVlc3RVUkwpIHtcbiAgICAgICAgdmFyIHBhcnNlZCA9ICh1dGlscy5pc1N0cmluZyhyZXF1ZXN0VVJMKSkgPyByZXNvbHZlVVJMKHJlcXVlc3RVUkwpIDogcmVxdWVzdFVSTDtcbiAgICAgICAgcmV0dXJuIChwYXJzZWQucHJvdG9jb2wgPT09IG9yaWdpblVSTC5wcm90b2NvbCAmJlxuICAgICAgICAgICAgcGFyc2VkLmhvc3QgPT09IG9yaWdpblVSTC5ob3N0KTtcbiAgICAgIH07XG4gICAgfSkoKSA6XG5cbiAgLy8gTm9uIHN0YW5kYXJkIGJyb3dzZXIgZW52cyAod2ViIHdvcmtlcnMsIHJlYWN0LW5hdGl2ZSkgbGFjayBuZWVkZWQgc3VwcG9ydC5cbiAgICAoZnVuY3Rpb24gbm9uU3RhbmRhcmRCcm93c2VyRW52KCkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uIGlzVVJMU2FtZU9yaWdpbigpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9O1xuICAgIH0pKClcbik7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBBeGlvc0Vycm9yID0gcmVxdWlyZSgnLi4vY29yZS9BeGlvc0Vycm9yJyk7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xuXG4vKipcbiAqIEEgYENhbmNlbGVkRXJyb3JgIGlzIGFuIG9iamVjdCB0aGF0IGlzIHRocm93biB3aGVuIGFuIG9wZXJhdGlvbiBpcyBjYW5jZWxlZC5cbiAqXG4gKiBAY2xhc3NcbiAqIEBwYXJhbSB7c3RyaW5nPX0gbWVzc2FnZSBUaGUgbWVzc2FnZS5cbiAqL1xuZnVuY3Rpb24gQ2FuY2VsZWRFcnJvcihtZXNzYWdlKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1lcS1udWxsLGVxZXFlcVxuICBBeGlvc0Vycm9yLmNhbGwodGhpcywgbWVzc2FnZSA9PSBudWxsID8gJ2NhbmNlbGVkJyA6IG1lc3NhZ2UsIEF4aW9zRXJyb3IuRVJSX0NBTkNFTEVEKTtcbiAgdGhpcy5uYW1lID0gJ0NhbmNlbGVkRXJyb3InO1xufVxuXG51dGlscy5pbmhlcml0cyhDYW5jZWxlZEVycm9yLCBBeGlvc0Vycm9yLCB7XG4gIF9fQ0FOQ0VMX186IHRydWVcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IENhbmNlbGVkRXJyb3I7XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gcGFyc2VQcm90b2NvbCh1cmwpIHtcbiAgdmFyIG1hdGNoID0gL14oWy0rXFx3XXsxLDI1fSkoOj9cXC9cXC98OikvLmV4ZWModXJsKTtcbiAgcmV0dXJuIG1hdGNoICYmIG1hdGNoWzFdIHx8ICcnO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi8uLi91dGlscycpO1xudmFyIHNldHRsZSA9IHJlcXVpcmUoJy4vLi4vY29yZS9zZXR0bGUnKTtcbnZhciBjb29raWVzID0gcmVxdWlyZSgnLi8uLi9oZWxwZXJzL2Nvb2tpZXMnKTtcbnZhciBidWlsZFVSTCA9IHJlcXVpcmUoJy4vLi4vaGVscGVycy9idWlsZFVSTCcpO1xudmFyIGJ1aWxkRnVsbFBhdGggPSByZXF1aXJlKCcuLi9jb3JlL2J1aWxkRnVsbFBhdGgnKTtcbnZhciBwYXJzZUhlYWRlcnMgPSByZXF1aXJlKCcuLy4uL2hlbHBlcnMvcGFyc2VIZWFkZXJzJyk7XG52YXIgaXNVUkxTYW1lT3JpZ2luID0gcmVxdWlyZSgnLi8uLi9oZWxwZXJzL2lzVVJMU2FtZU9yaWdpbicpO1xudmFyIHRyYW5zaXRpb25hbERlZmF1bHRzID0gcmVxdWlyZSgnLi4vZGVmYXVsdHMvdHJhbnNpdGlvbmFsJyk7XG52YXIgQXhpb3NFcnJvciA9IHJlcXVpcmUoJy4uL2NvcmUvQXhpb3NFcnJvcicpO1xudmFyIENhbmNlbGVkRXJyb3IgPSByZXF1aXJlKCcuLi9jYW5jZWwvQ2FuY2VsZWRFcnJvcicpO1xudmFyIHBhcnNlUHJvdG9jb2wgPSByZXF1aXJlKCcuLi9oZWxwZXJzL3BhcnNlUHJvdG9jb2wnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiB4aHJBZGFwdGVyKGNvbmZpZykge1xuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gZGlzcGF0Y2hYaHJSZXF1ZXN0KHJlc29sdmUsIHJlamVjdCkge1xuICAgIHZhciByZXF1ZXN0RGF0YSA9IGNvbmZpZy5kYXRhO1xuICAgIHZhciByZXF1ZXN0SGVhZGVycyA9IGNvbmZpZy5oZWFkZXJzO1xuICAgIHZhciByZXNwb25zZVR5cGUgPSBjb25maWcucmVzcG9uc2VUeXBlO1xuICAgIHZhciBvbkNhbmNlbGVkO1xuICAgIGZ1bmN0aW9uIGRvbmUoKSB7XG4gICAgICBpZiAoY29uZmlnLmNhbmNlbFRva2VuKSB7XG4gICAgICAgIGNvbmZpZy5jYW5jZWxUb2tlbi51bnN1YnNjcmliZShvbkNhbmNlbGVkKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmZpZy5zaWduYWwpIHtcbiAgICAgICAgY29uZmlnLnNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKCdhYm9ydCcsIG9uQ2FuY2VsZWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh1dGlscy5pc0Zvcm1EYXRhKHJlcXVlc3REYXRhKSAmJiB1dGlscy5pc1N0YW5kYXJkQnJvd3NlckVudigpKSB7XG4gICAgICBkZWxldGUgcmVxdWVzdEhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddOyAvLyBMZXQgdGhlIGJyb3dzZXIgc2V0IGl0XG4gICAgfVxuXG4gICAgdmFyIHJlcXVlc3QgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcblxuICAgIC8vIEhUVFAgYmFzaWMgYXV0aGVudGljYXRpb25cbiAgICBpZiAoY29uZmlnLmF1dGgpIHtcbiAgICAgIHZhciB1c2VybmFtZSA9IGNvbmZpZy5hdXRoLnVzZXJuYW1lIHx8ICcnO1xuICAgICAgdmFyIHBhc3N3b3JkID0gY29uZmlnLmF1dGgucGFzc3dvcmQgPyB1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoY29uZmlnLmF1dGgucGFzc3dvcmQpKSA6ICcnO1xuICAgICAgcmVxdWVzdEhlYWRlcnMuQXV0aG9yaXphdGlvbiA9ICdCYXNpYyAnICsgYnRvYSh1c2VybmFtZSArICc6JyArIHBhc3N3b3JkKTtcbiAgICB9XG5cbiAgICB2YXIgZnVsbFBhdGggPSBidWlsZEZ1bGxQYXRoKGNvbmZpZy5iYXNlVVJMLCBjb25maWcudXJsKTtcblxuICAgIHJlcXVlc3Qub3Blbihjb25maWcubWV0aG9kLnRvVXBwZXJDYXNlKCksIGJ1aWxkVVJMKGZ1bGxQYXRoLCBjb25maWcucGFyYW1zLCBjb25maWcucGFyYW1zU2VyaWFsaXplciksIHRydWUpO1xuXG4gICAgLy8gU2V0IHRoZSByZXF1ZXN0IHRpbWVvdXQgaW4gTVNcbiAgICByZXF1ZXN0LnRpbWVvdXQgPSBjb25maWcudGltZW91dDtcblxuICAgIGZ1bmN0aW9uIG9ubG9hZGVuZCgpIHtcbiAgICAgIGlmICghcmVxdWVzdCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBQcmVwYXJlIHRoZSByZXNwb25zZVxuICAgICAgdmFyIHJlc3BvbnNlSGVhZGVycyA9ICdnZXRBbGxSZXNwb25zZUhlYWRlcnMnIGluIHJlcXVlc3QgPyBwYXJzZUhlYWRlcnMocmVxdWVzdC5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSkgOiBudWxsO1xuICAgICAgdmFyIHJlc3BvbnNlRGF0YSA9ICFyZXNwb25zZVR5cGUgfHwgcmVzcG9uc2VUeXBlID09PSAndGV4dCcgfHwgIHJlc3BvbnNlVHlwZSA9PT0gJ2pzb24nID9cbiAgICAgICAgcmVxdWVzdC5yZXNwb25zZVRleHQgOiByZXF1ZXN0LnJlc3BvbnNlO1xuICAgICAgdmFyIHJlc3BvbnNlID0ge1xuICAgICAgICBkYXRhOiByZXNwb25zZURhdGEsXG4gICAgICAgIHN0YXR1czogcmVxdWVzdC5zdGF0dXMsXG4gICAgICAgIHN0YXR1c1RleHQ6IHJlcXVlc3Quc3RhdHVzVGV4dCxcbiAgICAgICAgaGVhZGVyczogcmVzcG9uc2VIZWFkZXJzLFxuICAgICAgICBjb25maWc6IGNvbmZpZyxcbiAgICAgICAgcmVxdWVzdDogcmVxdWVzdFxuICAgICAgfTtcblxuICAgICAgc2V0dGxlKGZ1bmN0aW9uIF9yZXNvbHZlKHZhbHVlKSB7XG4gICAgICAgIHJlc29sdmUodmFsdWUpO1xuICAgICAgICBkb25lKCk7XG4gICAgICB9LCBmdW5jdGlvbiBfcmVqZWN0KGVycikge1xuICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgZG9uZSgpO1xuICAgICAgfSwgcmVzcG9uc2UpO1xuXG4gICAgICAvLyBDbGVhbiB1cCByZXF1ZXN0XG4gICAgICByZXF1ZXN0ID0gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoJ29ubG9hZGVuZCcgaW4gcmVxdWVzdCkge1xuICAgICAgLy8gVXNlIG9ubG9hZGVuZCBpZiBhdmFpbGFibGVcbiAgICAgIHJlcXVlc3Qub25sb2FkZW5kID0gb25sb2FkZW5kO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBMaXN0ZW4gZm9yIHJlYWR5IHN0YXRlIHRvIGVtdWxhdGUgb25sb2FkZW5kXG4gICAgICByZXF1ZXN0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uIGhhbmRsZUxvYWQoKSB7XG4gICAgICAgIGlmICghcmVxdWVzdCB8fCByZXF1ZXN0LnJlYWR5U3RhdGUgIT09IDQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUaGUgcmVxdWVzdCBlcnJvcmVkIG91dCBhbmQgd2UgZGlkbid0IGdldCBhIHJlc3BvbnNlLCB0aGlzIHdpbGwgYmVcbiAgICAgICAgLy8gaGFuZGxlZCBieSBvbmVycm9yIGluc3RlYWRcbiAgICAgICAgLy8gV2l0aCBvbmUgZXhjZXB0aW9uOiByZXF1ZXN0IHRoYXQgdXNpbmcgZmlsZTogcHJvdG9jb2wsIG1vc3QgYnJvd3NlcnNcbiAgICAgICAgLy8gd2lsbCByZXR1cm4gc3RhdHVzIGFzIDAgZXZlbiB0aG91Z2ggaXQncyBhIHN1Y2Nlc3NmdWwgcmVxdWVzdFxuICAgICAgICBpZiAocmVxdWVzdC5zdGF0dXMgPT09IDAgJiYgIShyZXF1ZXN0LnJlc3BvbnNlVVJMICYmIHJlcXVlc3QucmVzcG9uc2VVUkwuaW5kZXhPZignZmlsZTonKSA9PT0gMCkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gcmVhZHlzdGF0ZSBoYW5kbGVyIGlzIGNhbGxpbmcgYmVmb3JlIG9uZXJyb3Igb3Igb250aW1lb3V0IGhhbmRsZXJzLFxuICAgICAgICAvLyBzbyB3ZSBzaG91bGQgY2FsbCBvbmxvYWRlbmQgb24gdGhlIG5leHQgJ3RpY2snXG4gICAgICAgIHNldFRpbWVvdXQob25sb2FkZW5kKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGJyb3dzZXIgcmVxdWVzdCBjYW5jZWxsYXRpb24gKGFzIG9wcG9zZWQgdG8gYSBtYW51YWwgY2FuY2VsbGF0aW9uKVxuICAgIHJlcXVlc3Qub25hYm9ydCA9IGZ1bmN0aW9uIGhhbmRsZUFib3J0KCkge1xuICAgICAgaWYgKCFyZXF1ZXN0KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgcmVqZWN0KG5ldyBBeGlvc0Vycm9yKCdSZXF1ZXN0IGFib3J0ZWQnLCBBeGlvc0Vycm9yLkVDT05OQUJPUlRFRCwgY29uZmlnLCByZXF1ZXN0KSk7XG5cbiAgICAgIC8vIENsZWFuIHVwIHJlcXVlc3RcbiAgICAgIHJlcXVlc3QgPSBudWxsO1xuICAgIH07XG5cbiAgICAvLyBIYW5kbGUgbG93IGxldmVsIG5ldHdvcmsgZXJyb3JzXG4gICAgcmVxdWVzdC5vbmVycm9yID0gZnVuY3Rpb24gaGFuZGxlRXJyb3IoKSB7XG4gICAgICAvLyBSZWFsIGVycm9ycyBhcmUgaGlkZGVuIGZyb20gdXMgYnkgdGhlIGJyb3dzZXJcbiAgICAgIC8vIG9uZXJyb3Igc2hvdWxkIG9ubHkgZmlyZSBpZiBpdCdzIGEgbmV0d29yayBlcnJvclxuICAgICAgcmVqZWN0KG5ldyBBeGlvc0Vycm9yKCdOZXR3b3JrIEVycm9yJywgQXhpb3NFcnJvci5FUlJfTkVUV09SSywgY29uZmlnLCByZXF1ZXN0LCByZXF1ZXN0KSk7XG5cbiAgICAgIC8vIENsZWFuIHVwIHJlcXVlc3RcbiAgICAgIHJlcXVlc3QgPSBudWxsO1xuICAgIH07XG5cbiAgICAvLyBIYW5kbGUgdGltZW91dFxuICAgIHJlcXVlc3Qub250aW1lb3V0ID0gZnVuY3Rpb24gaGFuZGxlVGltZW91dCgpIHtcbiAgICAgIHZhciB0aW1lb3V0RXJyb3JNZXNzYWdlID0gY29uZmlnLnRpbWVvdXQgPyAndGltZW91dCBvZiAnICsgY29uZmlnLnRpbWVvdXQgKyAnbXMgZXhjZWVkZWQnIDogJ3RpbWVvdXQgZXhjZWVkZWQnO1xuICAgICAgdmFyIHRyYW5zaXRpb25hbCA9IGNvbmZpZy50cmFuc2l0aW9uYWwgfHwgdHJhbnNpdGlvbmFsRGVmYXVsdHM7XG4gICAgICBpZiAoY29uZmlnLnRpbWVvdXRFcnJvck1lc3NhZ2UpIHtcbiAgICAgICAgdGltZW91dEVycm9yTWVzc2FnZSA9IGNvbmZpZy50aW1lb3V0RXJyb3JNZXNzYWdlO1xuICAgICAgfVxuICAgICAgcmVqZWN0KG5ldyBBeGlvc0Vycm9yKFxuICAgICAgICB0aW1lb3V0RXJyb3JNZXNzYWdlLFxuICAgICAgICB0cmFuc2l0aW9uYWwuY2xhcmlmeVRpbWVvdXRFcnJvciA/IEF4aW9zRXJyb3IuRVRJTUVET1VUIDogQXhpb3NFcnJvci5FQ09OTkFCT1JURUQsXG4gICAgICAgIGNvbmZpZyxcbiAgICAgICAgcmVxdWVzdCkpO1xuXG4gICAgICAvLyBDbGVhbiB1cCByZXF1ZXN0XG4gICAgICByZXF1ZXN0ID0gbnVsbDtcbiAgICB9O1xuXG4gICAgLy8gQWRkIHhzcmYgaGVhZGVyXG4gICAgLy8gVGhpcyBpcyBvbmx5IGRvbmUgaWYgcnVubmluZyBpbiBhIHN0YW5kYXJkIGJyb3dzZXIgZW52aXJvbm1lbnQuXG4gICAgLy8gU3BlY2lmaWNhbGx5IG5vdCBpZiB3ZSdyZSBpbiBhIHdlYiB3b3JrZXIsIG9yIHJlYWN0LW5hdGl2ZS5cbiAgICBpZiAodXRpbHMuaXNTdGFuZGFyZEJyb3dzZXJFbnYoKSkge1xuICAgICAgLy8gQWRkIHhzcmYgaGVhZGVyXG4gICAgICB2YXIgeHNyZlZhbHVlID0gKGNvbmZpZy53aXRoQ3JlZGVudGlhbHMgfHwgaXNVUkxTYW1lT3JpZ2luKGZ1bGxQYXRoKSkgJiYgY29uZmlnLnhzcmZDb29raWVOYW1lID9cbiAgICAgICAgY29va2llcy5yZWFkKGNvbmZpZy54c3JmQ29va2llTmFtZSkgOlxuICAgICAgICB1bmRlZmluZWQ7XG5cbiAgICAgIGlmICh4c3JmVmFsdWUpIHtcbiAgICAgICAgcmVxdWVzdEhlYWRlcnNbY29uZmlnLnhzcmZIZWFkZXJOYW1lXSA9IHhzcmZWYWx1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBZGQgaGVhZGVycyB0byB0aGUgcmVxdWVzdFxuICAgIGlmICgnc2V0UmVxdWVzdEhlYWRlcicgaW4gcmVxdWVzdCkge1xuICAgICAgdXRpbHMuZm9yRWFjaChyZXF1ZXN0SGVhZGVycywgZnVuY3Rpb24gc2V0UmVxdWVzdEhlYWRlcih2YWwsIGtleSkge1xuICAgICAgICBpZiAodHlwZW9mIHJlcXVlc3REYXRhID09PSAndW5kZWZpbmVkJyAmJiBrZXkudG9Mb3dlckNhc2UoKSA9PT0gJ2NvbnRlbnQtdHlwZScpIHtcbiAgICAgICAgICAvLyBSZW1vdmUgQ29udGVudC1UeXBlIGlmIGRhdGEgaXMgdW5kZWZpbmVkXG4gICAgICAgICAgZGVsZXRlIHJlcXVlc3RIZWFkZXJzW2tleV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gT3RoZXJ3aXNlIGFkZCBoZWFkZXIgdG8gdGhlIHJlcXVlc3RcbiAgICAgICAgICByZXF1ZXN0LnNldFJlcXVlc3RIZWFkZXIoa2V5LCB2YWwpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBBZGQgd2l0aENyZWRlbnRpYWxzIHRvIHJlcXVlc3QgaWYgbmVlZGVkXG4gICAgaWYgKCF1dGlscy5pc1VuZGVmaW5lZChjb25maWcud2l0aENyZWRlbnRpYWxzKSkge1xuICAgICAgcmVxdWVzdC53aXRoQ3JlZGVudGlhbHMgPSAhIWNvbmZpZy53aXRoQ3JlZGVudGlhbHM7XG4gICAgfVxuXG4gICAgLy8gQWRkIHJlc3BvbnNlVHlwZSB0byByZXF1ZXN0IGlmIG5lZWRlZFxuICAgIGlmIChyZXNwb25zZVR5cGUgJiYgcmVzcG9uc2VUeXBlICE9PSAnanNvbicpIHtcbiAgICAgIHJlcXVlc3QucmVzcG9uc2VUeXBlID0gY29uZmlnLnJlc3BvbnNlVHlwZTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgcHJvZ3Jlc3MgaWYgbmVlZGVkXG4gICAgaWYgKHR5cGVvZiBjb25maWcub25Eb3dubG9hZFByb2dyZXNzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXF1ZXN0LmFkZEV2ZW50TGlzdGVuZXIoJ3Byb2dyZXNzJywgY29uZmlnLm9uRG93bmxvYWRQcm9ncmVzcyk7XG4gICAgfVxuXG4gICAgLy8gTm90IGFsbCBicm93c2VycyBzdXBwb3J0IHVwbG9hZCBldmVudHNcbiAgICBpZiAodHlwZW9mIGNvbmZpZy5vblVwbG9hZFByb2dyZXNzID09PSAnZnVuY3Rpb24nICYmIHJlcXVlc3QudXBsb2FkKSB7XG4gICAgICByZXF1ZXN0LnVwbG9hZC5hZGRFdmVudExpc3RlbmVyKCdwcm9ncmVzcycsIGNvbmZpZy5vblVwbG9hZFByb2dyZXNzKTtcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmNhbmNlbFRva2VuIHx8IGNvbmZpZy5zaWduYWwpIHtcbiAgICAgIC8vIEhhbmRsZSBjYW5jZWxsYXRpb25cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBmdW5jLW5hbWVzXG4gICAgICBvbkNhbmNlbGVkID0gZnVuY3Rpb24oY2FuY2VsKSB7XG4gICAgICAgIGlmICghcmVxdWVzdCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoIWNhbmNlbCB8fCAoY2FuY2VsICYmIGNhbmNlbC50eXBlKSA/IG5ldyBDYW5jZWxlZEVycm9yKCkgOiBjYW5jZWwpO1xuICAgICAgICByZXF1ZXN0LmFib3J0KCk7XG4gICAgICAgIHJlcXVlc3QgPSBudWxsO1xuICAgICAgfTtcblxuICAgICAgY29uZmlnLmNhbmNlbFRva2VuICYmIGNvbmZpZy5jYW5jZWxUb2tlbi5zdWJzY3JpYmUob25DYW5jZWxlZCk7XG4gICAgICBpZiAoY29uZmlnLnNpZ25hbCkge1xuICAgICAgICBjb25maWcuc2lnbmFsLmFib3J0ZWQgPyBvbkNhbmNlbGVkKCkgOiBjb25maWcuc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0Jywgb25DYW5jZWxlZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFyZXF1ZXN0RGF0YSkge1xuICAgICAgcmVxdWVzdERhdGEgPSBudWxsO1xuICAgIH1cblxuICAgIHZhciBwcm90b2NvbCA9IHBhcnNlUHJvdG9jb2woZnVsbFBhdGgpO1xuXG4gICAgaWYgKHByb3RvY29sICYmIFsgJ2h0dHAnLCAnaHR0cHMnLCAnZmlsZScgXS5pbmRleE9mKHByb3RvY29sKSA9PT0gLTEpIHtcbiAgICAgIHJlamVjdChuZXcgQXhpb3NFcnJvcignVW5zdXBwb3J0ZWQgcHJvdG9jb2wgJyArIHByb3RvY29sICsgJzonLCBBeGlvc0Vycm9yLkVSUl9CQURfUkVRVUVTVCwgY29uZmlnKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG5cbiAgICAvLyBTZW5kIHRoZSByZXF1ZXN0XG4gICAgcmVxdWVzdC5zZW5kKHJlcXVlc3REYXRhKTtcbiAgfSk7XG59O1xuIiwiLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHN0cmljdFxubW9kdWxlLmV4cG9ydHMgPSBudWxsO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xudmFyIG5vcm1hbGl6ZUhlYWRlck5hbWUgPSByZXF1aXJlKCcuLi9oZWxwZXJzL25vcm1hbGl6ZUhlYWRlck5hbWUnKTtcbnZhciBBeGlvc0Vycm9yID0gcmVxdWlyZSgnLi4vY29yZS9BeGlvc0Vycm9yJyk7XG52YXIgdHJhbnNpdGlvbmFsRGVmYXVsdHMgPSByZXF1aXJlKCcuL3RyYW5zaXRpb25hbCcpO1xudmFyIHRvRm9ybURhdGEgPSByZXF1aXJlKCcuLi9oZWxwZXJzL3RvRm9ybURhdGEnKTtcblxudmFyIERFRkFVTFRfQ09OVEVOVF9UWVBFID0ge1xuICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCdcbn07XG5cbmZ1bmN0aW9uIHNldENvbnRlbnRUeXBlSWZVbnNldChoZWFkZXJzLCB2YWx1ZSkge1xuICBpZiAoIXV0aWxzLmlzVW5kZWZpbmVkKGhlYWRlcnMpICYmIHV0aWxzLmlzVW5kZWZpbmVkKGhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddKSkge1xuICAgIGhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddID0gdmFsdWU7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0RGVmYXVsdEFkYXB0ZXIoKSB7XG4gIHZhciBhZGFwdGVyO1xuICBpZiAodHlwZW9mIFhNTEh0dHBSZXF1ZXN0ICE9PSAndW5kZWZpbmVkJykge1xuICAgIC8vIEZvciBicm93c2VycyB1c2UgWEhSIGFkYXB0ZXJcbiAgICBhZGFwdGVyID0gcmVxdWlyZSgnLi4vYWRhcHRlcnMveGhyJyk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChwcm9jZXNzKSA9PT0gJ1tvYmplY3QgcHJvY2Vzc10nKSB7XG4gICAgLy8gRm9yIG5vZGUgdXNlIEhUVFAgYWRhcHRlclxuICAgIGFkYXB0ZXIgPSByZXF1aXJlKCcuLi9hZGFwdGVycy9odHRwJyk7XG4gIH1cbiAgcmV0dXJuIGFkYXB0ZXI7XG59XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeVNhZmVseShyYXdWYWx1ZSwgcGFyc2VyLCBlbmNvZGVyKSB7XG4gIGlmICh1dGlscy5pc1N0cmluZyhyYXdWYWx1ZSkpIHtcbiAgICB0cnkge1xuICAgICAgKHBhcnNlciB8fCBKU09OLnBhcnNlKShyYXdWYWx1ZSk7XG4gICAgICByZXR1cm4gdXRpbHMudHJpbShyYXdWYWx1ZSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKGUubmFtZSAhPT0gJ1N5bnRheEVycm9yJykge1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiAoZW5jb2RlciB8fCBKU09OLnN0cmluZ2lmeSkocmF3VmFsdWUpO1xufVxuXG52YXIgZGVmYXVsdHMgPSB7XG5cbiAgdHJhbnNpdGlvbmFsOiB0cmFuc2l0aW9uYWxEZWZhdWx0cyxcblxuICBhZGFwdGVyOiBnZXREZWZhdWx0QWRhcHRlcigpLFxuXG4gIHRyYW5zZm9ybVJlcXVlc3Q6IFtmdW5jdGlvbiB0cmFuc2Zvcm1SZXF1ZXN0KGRhdGEsIGhlYWRlcnMpIHtcbiAgICBub3JtYWxpemVIZWFkZXJOYW1lKGhlYWRlcnMsICdBY2NlcHQnKTtcbiAgICBub3JtYWxpemVIZWFkZXJOYW1lKGhlYWRlcnMsICdDb250ZW50LVR5cGUnKTtcblxuICAgIGlmICh1dGlscy5pc0Zvcm1EYXRhKGRhdGEpIHx8XG4gICAgICB1dGlscy5pc0FycmF5QnVmZmVyKGRhdGEpIHx8XG4gICAgICB1dGlscy5pc0J1ZmZlcihkYXRhKSB8fFxuICAgICAgdXRpbHMuaXNTdHJlYW0oZGF0YSkgfHxcbiAgICAgIHV0aWxzLmlzRmlsZShkYXRhKSB8fFxuICAgICAgdXRpbHMuaXNCbG9iKGRhdGEpXG4gICAgKSB7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG4gICAgaWYgKHV0aWxzLmlzQXJyYXlCdWZmZXJWaWV3KGRhdGEpKSB7XG4gICAgICByZXR1cm4gZGF0YS5idWZmZXI7XG4gICAgfVxuICAgIGlmICh1dGlscy5pc1VSTFNlYXJjaFBhcmFtcyhkYXRhKSkge1xuICAgICAgc2V0Q29udGVudFR5cGVJZlVuc2V0KGhlYWRlcnMsICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7Y2hhcnNldD11dGYtOCcpO1xuICAgICAgcmV0dXJuIGRhdGEudG9TdHJpbmcoKTtcbiAgICB9XG5cbiAgICB2YXIgaXNPYmplY3RQYXlsb2FkID0gdXRpbHMuaXNPYmplY3QoZGF0YSk7XG4gICAgdmFyIGNvbnRlbnRUeXBlID0gaGVhZGVycyAmJiBoZWFkZXJzWydDb250ZW50LVR5cGUnXTtcblxuICAgIHZhciBpc0ZpbGVMaXN0O1xuXG4gICAgaWYgKChpc0ZpbGVMaXN0ID0gdXRpbHMuaXNGaWxlTGlzdChkYXRhKSkgfHwgKGlzT2JqZWN0UGF5bG9hZCAmJiBjb250ZW50VHlwZSA9PT0gJ211bHRpcGFydC9mb3JtLWRhdGEnKSkge1xuICAgICAgdmFyIF9Gb3JtRGF0YSA9IHRoaXMuZW52ICYmIHRoaXMuZW52LkZvcm1EYXRhO1xuICAgICAgcmV0dXJuIHRvRm9ybURhdGEoaXNGaWxlTGlzdCA/IHsnZmlsZXNbXSc6IGRhdGF9IDogZGF0YSwgX0Zvcm1EYXRhICYmIG5ldyBfRm9ybURhdGEoKSk7XG4gICAgfSBlbHNlIGlmIChpc09iamVjdFBheWxvYWQgfHwgY29udGVudFR5cGUgPT09ICdhcHBsaWNhdGlvbi9qc29uJykge1xuICAgICAgc2V0Q29udGVudFR5cGVJZlVuc2V0KGhlYWRlcnMsICdhcHBsaWNhdGlvbi9qc29uJyk7XG4gICAgICByZXR1cm4gc3RyaW5naWZ5U2FmZWx5KGRhdGEpO1xuICAgIH1cblxuICAgIHJldHVybiBkYXRhO1xuICB9XSxcblxuICB0cmFuc2Zvcm1SZXNwb25zZTogW2Z1bmN0aW9uIHRyYW5zZm9ybVJlc3BvbnNlKGRhdGEpIHtcbiAgICB2YXIgdHJhbnNpdGlvbmFsID0gdGhpcy50cmFuc2l0aW9uYWwgfHwgZGVmYXVsdHMudHJhbnNpdGlvbmFsO1xuICAgIHZhciBzaWxlbnRKU09OUGFyc2luZyA9IHRyYW5zaXRpb25hbCAmJiB0cmFuc2l0aW9uYWwuc2lsZW50SlNPTlBhcnNpbmc7XG4gICAgdmFyIGZvcmNlZEpTT05QYXJzaW5nID0gdHJhbnNpdGlvbmFsICYmIHRyYW5zaXRpb25hbC5mb3JjZWRKU09OUGFyc2luZztcbiAgICB2YXIgc3RyaWN0SlNPTlBhcnNpbmcgPSAhc2lsZW50SlNPTlBhcnNpbmcgJiYgdGhpcy5yZXNwb25zZVR5cGUgPT09ICdqc29uJztcblxuICAgIGlmIChzdHJpY3RKU09OUGFyc2luZyB8fCAoZm9yY2VkSlNPTlBhcnNpbmcgJiYgdXRpbHMuaXNTdHJpbmcoZGF0YSkgJiYgZGF0YS5sZW5ndGgpKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShkYXRhKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKHN0cmljdEpTT05QYXJzaW5nKSB7XG4gICAgICAgICAgaWYgKGUubmFtZSA9PT0gJ1N5bnRheEVycm9yJykge1xuICAgICAgICAgICAgdGhyb3cgQXhpb3NFcnJvci5mcm9tKGUsIEF4aW9zRXJyb3IuRVJSX0JBRF9SRVNQT05TRSwgdGhpcywgbnVsbCwgdGhpcy5yZXNwb25zZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZGF0YTtcbiAgfV0sXG5cbiAgLyoqXG4gICAqIEEgdGltZW91dCBpbiBtaWxsaXNlY29uZHMgdG8gYWJvcnQgYSByZXF1ZXN0LiBJZiBzZXQgdG8gMCAoZGVmYXVsdCkgYVxuICAgKiB0aW1lb3V0IGlzIG5vdCBjcmVhdGVkLlxuICAgKi9cbiAgdGltZW91dDogMCxcblxuICB4c3JmQ29va2llTmFtZTogJ1hTUkYtVE9LRU4nLFxuICB4c3JmSGVhZGVyTmFtZTogJ1gtWFNSRi1UT0tFTicsXG5cbiAgbWF4Q29udGVudExlbmd0aDogLTEsXG4gIG1heEJvZHlMZW5ndGg6IC0xLFxuXG4gIGVudjoge1xuICAgIEZvcm1EYXRhOiByZXF1aXJlKCcuL2Vudi9Gb3JtRGF0YScpXG4gIH0sXG5cbiAgdmFsaWRhdGVTdGF0dXM6IGZ1bmN0aW9uIHZhbGlkYXRlU3RhdHVzKHN0YXR1cykge1xuICAgIHJldHVybiBzdGF0dXMgPj0gMjAwICYmIHN0YXR1cyA8IDMwMDtcbiAgfSxcblxuICBoZWFkZXJzOiB7XG4gICAgY29tbW9uOiB7XG4gICAgICAnQWNjZXB0JzogJ2FwcGxpY2F0aW9uL2pzb24sIHRleHQvcGxhaW4sICovKidcbiAgICB9XG4gIH1cbn07XG5cbnV0aWxzLmZvckVhY2goWydkZWxldGUnLCAnZ2V0JywgJ2hlYWQnXSwgZnVuY3Rpb24gZm9yRWFjaE1ldGhvZE5vRGF0YShtZXRob2QpIHtcbiAgZGVmYXVsdHMuaGVhZGVyc1ttZXRob2RdID0ge307XG59KTtcblxudXRpbHMuZm9yRWFjaChbJ3Bvc3QnLCAncHV0JywgJ3BhdGNoJ10sIGZ1bmN0aW9uIGZvckVhY2hNZXRob2RXaXRoRGF0YShtZXRob2QpIHtcbiAgZGVmYXVsdHMuaGVhZGVyc1ttZXRob2RdID0gdXRpbHMubWVyZ2UoREVGQVVMVF9DT05URU5UX1RZUEUpO1xufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gZGVmYXVsdHM7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vLi4vdXRpbHMnKTtcbnZhciBkZWZhdWx0cyA9IHJlcXVpcmUoJy4uL2RlZmF1bHRzJyk7XG5cbi8qKlxuICogVHJhbnNmb3JtIHRoZSBkYXRhIGZvciBhIHJlcXVlc3Qgb3IgYSByZXNwb25zZVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fFN0cmluZ30gZGF0YSBUaGUgZGF0YSB0byBiZSB0cmFuc2Zvcm1lZFxuICogQHBhcmFtIHtBcnJheX0gaGVhZGVycyBUaGUgaGVhZGVycyBmb3IgdGhlIHJlcXVlc3Qgb3IgcmVzcG9uc2VcbiAqIEBwYXJhbSB7QXJyYXl8RnVuY3Rpb259IGZucyBBIHNpbmdsZSBmdW5jdGlvbiBvciBBcnJheSBvZiBmdW5jdGlvbnNcbiAqIEByZXR1cm5zIHsqfSBUaGUgcmVzdWx0aW5nIHRyYW5zZm9ybWVkIGRhdGFcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiB0cmFuc2Zvcm1EYXRhKGRhdGEsIGhlYWRlcnMsIGZucykge1xuICB2YXIgY29udGV4dCA9IHRoaXMgfHwgZGVmYXVsdHM7XG4gIC8qZXNsaW50IG5vLXBhcmFtLXJlYXNzaWduOjAqL1xuICB1dGlscy5mb3JFYWNoKGZucywgZnVuY3Rpb24gdHJhbnNmb3JtKGZuKSB7XG4gICAgZGF0YSA9IGZuLmNhbGwoY29udGV4dCwgZGF0YSwgaGVhZGVycyk7XG4gIH0pO1xuXG4gIHJldHVybiBkYXRhO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc0NhbmNlbCh2YWx1ZSkge1xuICByZXR1cm4gISEodmFsdWUgJiYgdmFsdWUuX19DQU5DRUxfXyk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLy4uL3V0aWxzJyk7XG52YXIgdHJhbnNmb3JtRGF0YSA9IHJlcXVpcmUoJy4vdHJhbnNmb3JtRGF0YScpO1xudmFyIGlzQ2FuY2VsID0gcmVxdWlyZSgnLi4vY2FuY2VsL2lzQ2FuY2VsJyk7XG52YXIgZGVmYXVsdHMgPSByZXF1aXJlKCcuLi9kZWZhdWx0cycpO1xudmFyIENhbmNlbGVkRXJyb3IgPSByZXF1aXJlKCcuLi9jYW5jZWwvQ2FuY2VsZWRFcnJvcicpO1xuXG4vKipcbiAqIFRocm93cyBhIGBDYW5jZWxlZEVycm9yYCBpZiBjYW5jZWxsYXRpb24gaGFzIGJlZW4gcmVxdWVzdGVkLlxuICovXG5mdW5jdGlvbiB0aHJvd0lmQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKGNvbmZpZykge1xuICBpZiAoY29uZmlnLmNhbmNlbFRva2VuKSB7XG4gICAgY29uZmlnLmNhbmNlbFRva2VuLnRocm93SWZSZXF1ZXN0ZWQoKTtcbiAgfVxuXG4gIGlmIChjb25maWcuc2lnbmFsICYmIGNvbmZpZy5zaWduYWwuYWJvcnRlZCkge1xuICAgIHRocm93IG5ldyBDYW5jZWxlZEVycm9yKCk7XG4gIH1cbn1cblxuLyoqXG4gKiBEaXNwYXRjaCBhIHJlcXVlc3QgdG8gdGhlIHNlcnZlciB1c2luZyB0aGUgY29uZmlndXJlZCBhZGFwdGVyLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBjb25maWcgVGhlIGNvbmZpZyB0aGF0IGlzIHRvIGJlIHVzZWQgZm9yIHRoZSByZXF1ZXN0XG4gKiBAcmV0dXJucyB7UHJvbWlzZX0gVGhlIFByb21pc2UgdG8gYmUgZnVsZmlsbGVkXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZGlzcGF0Y2hSZXF1ZXN0KGNvbmZpZykge1xuICB0aHJvd0lmQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKGNvbmZpZyk7XG5cbiAgLy8gRW5zdXJlIGhlYWRlcnMgZXhpc3RcbiAgY29uZmlnLmhlYWRlcnMgPSBjb25maWcuaGVhZGVycyB8fCB7fTtcblxuICAvLyBUcmFuc2Zvcm0gcmVxdWVzdCBkYXRhXG4gIGNvbmZpZy5kYXRhID0gdHJhbnNmb3JtRGF0YS5jYWxsKFxuICAgIGNvbmZpZyxcbiAgICBjb25maWcuZGF0YSxcbiAgICBjb25maWcuaGVhZGVycyxcbiAgICBjb25maWcudHJhbnNmb3JtUmVxdWVzdFxuICApO1xuXG4gIC8vIEZsYXR0ZW4gaGVhZGVyc1xuICBjb25maWcuaGVhZGVycyA9IHV0aWxzLm1lcmdlKFxuICAgIGNvbmZpZy5oZWFkZXJzLmNvbW1vbiB8fCB7fSxcbiAgICBjb25maWcuaGVhZGVyc1tjb25maWcubWV0aG9kXSB8fCB7fSxcbiAgICBjb25maWcuaGVhZGVyc1xuICApO1xuXG4gIHV0aWxzLmZvckVhY2goXG4gICAgWydkZWxldGUnLCAnZ2V0JywgJ2hlYWQnLCAncG9zdCcsICdwdXQnLCAncGF0Y2gnLCAnY29tbW9uJ10sXG4gICAgZnVuY3Rpb24gY2xlYW5IZWFkZXJDb25maWcobWV0aG9kKSB7XG4gICAgICBkZWxldGUgY29uZmlnLmhlYWRlcnNbbWV0aG9kXTtcbiAgICB9XG4gICk7XG5cbiAgdmFyIGFkYXB0ZXIgPSBjb25maWcuYWRhcHRlciB8fCBkZWZhdWx0cy5hZGFwdGVyO1xuXG4gIHJldHVybiBhZGFwdGVyKGNvbmZpZykudGhlbihmdW5jdGlvbiBvbkFkYXB0ZXJSZXNvbHV0aW9uKHJlc3BvbnNlKSB7XG4gICAgdGhyb3dJZkNhbmNlbGxhdGlvblJlcXVlc3RlZChjb25maWcpO1xuXG4gICAgLy8gVHJhbnNmb3JtIHJlc3BvbnNlIGRhdGFcbiAgICByZXNwb25zZS5kYXRhID0gdHJhbnNmb3JtRGF0YS5jYWxsKFxuICAgICAgY29uZmlnLFxuICAgICAgcmVzcG9uc2UuZGF0YSxcbiAgICAgIHJlc3BvbnNlLmhlYWRlcnMsXG4gICAgICBjb25maWcudHJhbnNmb3JtUmVzcG9uc2VcbiAgICApO1xuXG4gICAgcmV0dXJuIHJlc3BvbnNlO1xuICB9LCBmdW5jdGlvbiBvbkFkYXB0ZXJSZWplY3Rpb24ocmVhc29uKSB7XG4gICAgaWYgKCFpc0NhbmNlbChyZWFzb24pKSB7XG4gICAgICB0aHJvd0lmQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKGNvbmZpZyk7XG5cbiAgICAgIC8vIFRyYW5zZm9ybSByZXNwb25zZSBkYXRhXG4gICAgICBpZiAocmVhc29uICYmIHJlYXNvbi5yZXNwb25zZSkge1xuICAgICAgICByZWFzb24ucmVzcG9uc2UuZGF0YSA9IHRyYW5zZm9ybURhdGEuY2FsbChcbiAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgcmVhc29uLnJlc3BvbnNlLmRhdGEsXG4gICAgICAgICAgcmVhc29uLnJlc3BvbnNlLmhlYWRlcnMsXG4gICAgICAgICAgY29uZmlnLnRyYW5zZm9ybVJlc3BvbnNlXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KHJlYXNvbik7XG4gIH0pO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcblxuLyoqXG4gKiBDb25maWctc3BlY2lmaWMgbWVyZ2UtZnVuY3Rpb24gd2hpY2ggY3JlYXRlcyBhIG5ldyBjb25maWctb2JqZWN0XG4gKiBieSBtZXJnaW5nIHR3byBjb25maWd1cmF0aW9uIG9iamVjdHMgdG9nZXRoZXIuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZzFcbiAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcyXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBOZXcgb2JqZWN0IHJlc3VsdGluZyBmcm9tIG1lcmdpbmcgY29uZmlnMiB0byBjb25maWcxXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gbWVyZ2VDb25maWcoY29uZmlnMSwgY29uZmlnMikge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgY29uZmlnMiA9IGNvbmZpZzIgfHwge307XG4gIHZhciBjb25maWcgPSB7fTtcblxuICBmdW5jdGlvbiBnZXRNZXJnZWRWYWx1ZSh0YXJnZXQsIHNvdXJjZSkge1xuICAgIGlmICh1dGlscy5pc1BsYWluT2JqZWN0KHRhcmdldCkgJiYgdXRpbHMuaXNQbGFpbk9iamVjdChzb3VyY2UpKSB7XG4gICAgICByZXR1cm4gdXRpbHMubWVyZ2UodGFyZ2V0LCBzb3VyY2UpO1xuICAgIH0gZWxzZSBpZiAodXRpbHMuaXNQbGFpbk9iamVjdChzb3VyY2UpKSB7XG4gICAgICByZXR1cm4gdXRpbHMubWVyZ2Uoe30sIHNvdXJjZSk7XG4gICAgfSBlbHNlIGlmICh1dGlscy5pc0FycmF5KHNvdXJjZSkpIHtcbiAgICAgIHJldHVybiBzb3VyY2Uuc2xpY2UoKTtcbiAgICB9XG4gICAgcmV0dXJuIHNvdXJjZTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb25zaXN0ZW50LXJldHVyblxuICBmdW5jdGlvbiBtZXJnZURlZXBQcm9wZXJ0aWVzKHByb3ApIHtcbiAgICBpZiAoIXV0aWxzLmlzVW5kZWZpbmVkKGNvbmZpZzJbcHJvcF0pKSB7XG4gICAgICByZXR1cm4gZ2V0TWVyZ2VkVmFsdWUoY29uZmlnMVtwcm9wXSwgY29uZmlnMltwcm9wXSk7XG4gICAgfSBlbHNlIGlmICghdXRpbHMuaXNVbmRlZmluZWQoY29uZmlnMVtwcm9wXSkpIHtcbiAgICAgIHJldHVybiBnZXRNZXJnZWRWYWx1ZSh1bmRlZmluZWQsIGNvbmZpZzFbcHJvcF0pO1xuICAgIH1cbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb25zaXN0ZW50LXJldHVyblxuICBmdW5jdGlvbiB2YWx1ZUZyb21Db25maWcyKHByb3ApIHtcbiAgICBpZiAoIXV0aWxzLmlzVW5kZWZpbmVkKGNvbmZpZzJbcHJvcF0pKSB7XG4gICAgICByZXR1cm4gZ2V0TWVyZ2VkVmFsdWUodW5kZWZpbmVkLCBjb25maWcyW3Byb3BdKTtcbiAgICB9XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29uc2lzdGVudC1yZXR1cm5cbiAgZnVuY3Rpb24gZGVmYXVsdFRvQ29uZmlnMihwcm9wKSB7XG4gICAgaWYgKCF1dGlscy5pc1VuZGVmaW5lZChjb25maWcyW3Byb3BdKSkge1xuICAgICAgcmV0dXJuIGdldE1lcmdlZFZhbHVlKHVuZGVmaW5lZCwgY29uZmlnMltwcm9wXSk7XG4gICAgfSBlbHNlIGlmICghdXRpbHMuaXNVbmRlZmluZWQoY29uZmlnMVtwcm9wXSkpIHtcbiAgICAgIHJldHVybiBnZXRNZXJnZWRWYWx1ZSh1bmRlZmluZWQsIGNvbmZpZzFbcHJvcF0pO1xuICAgIH1cbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb25zaXN0ZW50LXJldHVyblxuICBmdW5jdGlvbiBtZXJnZURpcmVjdEtleXMocHJvcCkge1xuICAgIGlmIChwcm9wIGluIGNvbmZpZzIpIHtcbiAgICAgIHJldHVybiBnZXRNZXJnZWRWYWx1ZShjb25maWcxW3Byb3BdLCBjb25maWcyW3Byb3BdKTtcbiAgICB9IGVsc2UgaWYgKHByb3AgaW4gY29uZmlnMSkge1xuICAgICAgcmV0dXJuIGdldE1lcmdlZFZhbHVlKHVuZGVmaW5lZCwgY29uZmlnMVtwcm9wXSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIG1lcmdlTWFwID0ge1xuICAgICd1cmwnOiB2YWx1ZUZyb21Db25maWcyLFxuICAgICdtZXRob2QnOiB2YWx1ZUZyb21Db25maWcyLFxuICAgICdkYXRhJzogdmFsdWVGcm9tQ29uZmlnMixcbiAgICAnYmFzZVVSTCc6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgJ3RyYW5zZm9ybVJlcXVlc3QnOiBkZWZhdWx0VG9Db25maWcyLFxuICAgICd0cmFuc2Zvcm1SZXNwb25zZSc6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgJ3BhcmFtc1NlcmlhbGl6ZXInOiBkZWZhdWx0VG9Db25maWcyLFxuICAgICd0aW1lb3V0JzogZGVmYXVsdFRvQ29uZmlnMixcbiAgICAndGltZW91dE1lc3NhZ2UnOiBkZWZhdWx0VG9Db25maWcyLFxuICAgICd3aXRoQ3JlZGVudGlhbHMnOiBkZWZhdWx0VG9Db25maWcyLFxuICAgICdhZGFwdGVyJzogZGVmYXVsdFRvQ29uZmlnMixcbiAgICAncmVzcG9uc2VUeXBlJzogZGVmYXVsdFRvQ29uZmlnMixcbiAgICAneHNyZkNvb2tpZU5hbWUnOiBkZWZhdWx0VG9Db25maWcyLFxuICAgICd4c3JmSGVhZGVyTmFtZSc6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgJ29uVXBsb2FkUHJvZ3Jlc3MnOiBkZWZhdWx0VG9Db25maWcyLFxuICAgICdvbkRvd25sb2FkUHJvZ3Jlc3MnOiBkZWZhdWx0VG9Db25maWcyLFxuICAgICdkZWNvbXByZXNzJzogZGVmYXVsdFRvQ29uZmlnMixcbiAgICAnbWF4Q29udGVudExlbmd0aCc6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgJ21heEJvZHlMZW5ndGgnOiBkZWZhdWx0VG9Db25maWcyLFxuICAgICdiZWZvcmVSZWRpcmVjdCc6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgJ3RyYW5zcG9ydCc6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgJ2h0dHBBZ2VudCc6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgJ2h0dHBzQWdlbnQnOiBkZWZhdWx0VG9Db25maWcyLFxuICAgICdjYW5jZWxUb2tlbic6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgJ3NvY2tldFBhdGgnOiBkZWZhdWx0VG9Db25maWcyLFxuICAgICdyZXNwb25zZUVuY29kaW5nJzogZGVmYXVsdFRvQ29uZmlnMixcbiAgICAndmFsaWRhdGVTdGF0dXMnOiBtZXJnZURpcmVjdEtleXNcbiAgfTtcblxuICB1dGlscy5mb3JFYWNoKE9iamVjdC5rZXlzKGNvbmZpZzEpLmNvbmNhdChPYmplY3Qua2V5cyhjb25maWcyKSksIGZ1bmN0aW9uIGNvbXB1dGVDb25maWdWYWx1ZShwcm9wKSB7XG4gICAgdmFyIG1lcmdlID0gbWVyZ2VNYXBbcHJvcF0gfHwgbWVyZ2VEZWVwUHJvcGVydGllcztcbiAgICB2YXIgY29uZmlnVmFsdWUgPSBtZXJnZShwcm9wKTtcbiAgICAodXRpbHMuaXNVbmRlZmluZWQoY29uZmlnVmFsdWUpICYmIG1lcmdlICE9PSBtZXJnZURpcmVjdEtleXMpIHx8IChjb25maWdbcHJvcF0gPSBjb25maWdWYWx1ZSk7XG4gIH0pO1xuXG4gIHJldHVybiBjb25maWc7XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSB7XG4gIFwidmVyc2lvblwiOiBcIjAuMjcuMlwiXG59OyIsIid1c2Ugc3RyaWN0JztcblxudmFyIFZFUlNJT04gPSByZXF1aXJlKCcuLi9lbnYvZGF0YScpLnZlcnNpb247XG52YXIgQXhpb3NFcnJvciA9IHJlcXVpcmUoJy4uL2NvcmUvQXhpb3NFcnJvcicpO1xuXG52YXIgdmFsaWRhdG9ycyA9IHt9O1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZnVuYy1uYW1lc1xuWydvYmplY3QnLCAnYm9vbGVhbicsICdudW1iZXInLCAnZnVuY3Rpb24nLCAnc3RyaW5nJywgJ3N5bWJvbCddLmZvckVhY2goZnVuY3Rpb24odHlwZSwgaSkge1xuICB2YWxpZGF0b3JzW3R5cGVdID0gZnVuY3Rpb24gdmFsaWRhdG9yKHRoaW5nKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB0aGluZyA9PT0gdHlwZSB8fCAnYScgKyAoaSA8IDEgPyAnbiAnIDogJyAnKSArIHR5cGU7XG4gIH07XG59KTtcblxudmFyIGRlcHJlY2F0ZWRXYXJuaW5ncyA9IHt9O1xuXG4vKipcbiAqIFRyYW5zaXRpb25hbCBvcHRpb24gdmFsaWRhdG9yXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufGJvb2xlYW4/fSB2YWxpZGF0b3IgLSBzZXQgdG8gZmFsc2UgaWYgdGhlIHRyYW5zaXRpb25hbCBvcHRpb24gaGFzIGJlZW4gcmVtb3ZlZFxuICogQHBhcmFtIHtzdHJpbmc/fSB2ZXJzaW9uIC0gZGVwcmVjYXRlZCB2ZXJzaW9uIC8gcmVtb3ZlZCBzaW5jZSB2ZXJzaW9uXG4gKiBAcGFyYW0ge3N0cmluZz99IG1lc3NhZ2UgLSBzb21lIG1lc3NhZ2Ugd2l0aCBhZGRpdGlvbmFsIGluZm9cbiAqIEByZXR1cm5zIHtmdW5jdGlvbn1cbiAqL1xudmFsaWRhdG9ycy50cmFuc2l0aW9uYWwgPSBmdW5jdGlvbiB0cmFuc2l0aW9uYWwodmFsaWRhdG9yLCB2ZXJzaW9uLCBtZXNzYWdlKSB7XG4gIGZ1bmN0aW9uIGZvcm1hdE1lc3NhZ2Uob3B0LCBkZXNjKSB7XG4gICAgcmV0dXJuICdbQXhpb3MgdicgKyBWRVJTSU9OICsgJ10gVHJhbnNpdGlvbmFsIG9wdGlvbiBcXCcnICsgb3B0ICsgJ1xcJycgKyBkZXNjICsgKG1lc3NhZ2UgPyAnLiAnICsgbWVzc2FnZSA6ICcnKTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBmdW5jLW5hbWVzXG4gIHJldHVybiBmdW5jdGlvbih2YWx1ZSwgb3B0LCBvcHRzKSB7XG4gICAgaWYgKHZhbGlkYXRvciA9PT0gZmFsc2UpIHtcbiAgICAgIHRocm93IG5ldyBBeGlvc0Vycm9yKFxuICAgICAgICBmb3JtYXRNZXNzYWdlKG9wdCwgJyBoYXMgYmVlbiByZW1vdmVkJyArICh2ZXJzaW9uID8gJyBpbiAnICsgdmVyc2lvbiA6ICcnKSksXG4gICAgICAgIEF4aW9zRXJyb3IuRVJSX0RFUFJFQ0FURURcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHZlcnNpb24gJiYgIWRlcHJlY2F0ZWRXYXJuaW5nc1tvcHRdKSB7XG4gICAgICBkZXByZWNhdGVkV2FybmluZ3Nbb3B0XSA9IHRydWU7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBmb3JtYXRNZXNzYWdlKFxuICAgICAgICAgIG9wdCxcbiAgICAgICAgICAnIGhhcyBiZWVuIGRlcHJlY2F0ZWQgc2luY2UgdicgKyB2ZXJzaW9uICsgJyBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZWFyIGZ1dHVyZSdcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsaWRhdG9yID8gdmFsaWRhdG9yKHZhbHVlLCBvcHQsIG9wdHMpIDogdHJ1ZTtcbiAgfTtcbn07XG5cbi8qKlxuICogQXNzZXJ0IG9iamVjdCdzIHByb3BlcnRpZXMgdHlwZVxuICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAqIEBwYXJhbSB7b2JqZWN0fSBzY2hlbWFcbiAqIEBwYXJhbSB7Ym9vbGVhbj99IGFsbG93VW5rbm93blxuICovXG5cbmZ1bmN0aW9uIGFzc2VydE9wdGlvbnMob3B0aW9ucywgc2NoZW1hLCBhbGxvd1Vua25vd24pIHtcbiAgaWYgKHR5cGVvZiBvcHRpb25zICE9PSAnb2JqZWN0Jykge1xuICAgIHRocm93IG5ldyBBeGlvc0Vycm9yKCdvcHRpb25zIG11c3QgYmUgYW4gb2JqZWN0JywgQXhpb3NFcnJvci5FUlJfQkFEX09QVElPTl9WQUxVRSk7XG4gIH1cbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvcHRpb25zKTtcbiAgdmFyIGkgPSBrZXlzLmxlbmd0aDtcbiAgd2hpbGUgKGktLSA+IDApIHtcbiAgICB2YXIgb3B0ID0ga2V5c1tpXTtcbiAgICB2YXIgdmFsaWRhdG9yID0gc2NoZW1hW29wdF07XG4gICAgaWYgKHZhbGlkYXRvcikge1xuICAgICAgdmFyIHZhbHVlID0gb3B0aW9uc1tvcHRdO1xuICAgICAgdmFyIHJlc3VsdCA9IHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsaWRhdG9yKHZhbHVlLCBvcHQsIG9wdGlvbnMpO1xuICAgICAgaWYgKHJlc3VsdCAhPT0gdHJ1ZSkge1xuICAgICAgICB0aHJvdyBuZXcgQXhpb3NFcnJvcignb3B0aW9uICcgKyBvcHQgKyAnIG11c3QgYmUgJyArIHJlc3VsdCwgQXhpb3NFcnJvci5FUlJfQkFEX09QVElPTl9WQUxVRSk7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGFsbG93VW5rbm93biAhPT0gdHJ1ZSkge1xuICAgICAgdGhyb3cgbmV3IEF4aW9zRXJyb3IoJ1Vua25vd24gb3B0aW9uICcgKyBvcHQsIEF4aW9zRXJyb3IuRVJSX0JBRF9PUFRJT04pO1xuICAgIH1cbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgYXNzZXJ0T3B0aW9uczogYXNzZXJ0T3B0aW9ucyxcbiAgdmFsaWRhdG9yczogdmFsaWRhdG9yc1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi8uLi91dGlscycpO1xudmFyIGJ1aWxkVVJMID0gcmVxdWlyZSgnLi4vaGVscGVycy9idWlsZFVSTCcpO1xudmFyIEludGVyY2VwdG9yTWFuYWdlciA9IHJlcXVpcmUoJy4vSW50ZXJjZXB0b3JNYW5hZ2VyJyk7XG52YXIgZGlzcGF0Y2hSZXF1ZXN0ID0gcmVxdWlyZSgnLi9kaXNwYXRjaFJlcXVlc3QnKTtcbnZhciBtZXJnZUNvbmZpZyA9IHJlcXVpcmUoJy4vbWVyZ2VDb25maWcnKTtcbnZhciBidWlsZEZ1bGxQYXRoID0gcmVxdWlyZSgnLi9idWlsZEZ1bGxQYXRoJyk7XG52YXIgdmFsaWRhdG9yID0gcmVxdWlyZSgnLi4vaGVscGVycy92YWxpZGF0b3InKTtcblxudmFyIHZhbGlkYXRvcnMgPSB2YWxpZGF0b3IudmFsaWRhdG9ycztcbi8qKlxuICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIEF4aW9zXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGluc3RhbmNlQ29uZmlnIFRoZSBkZWZhdWx0IGNvbmZpZyBmb3IgdGhlIGluc3RhbmNlXG4gKi9cbmZ1bmN0aW9uIEF4aW9zKGluc3RhbmNlQ29uZmlnKSB7XG4gIHRoaXMuZGVmYXVsdHMgPSBpbnN0YW5jZUNvbmZpZztcbiAgdGhpcy5pbnRlcmNlcHRvcnMgPSB7XG4gICAgcmVxdWVzdDogbmV3IEludGVyY2VwdG9yTWFuYWdlcigpLFxuICAgIHJlc3BvbnNlOiBuZXcgSW50ZXJjZXB0b3JNYW5hZ2VyKClcbiAgfTtcbn1cblxuLyoqXG4gKiBEaXNwYXRjaCBhIHJlcXVlc3RcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIFRoZSBjb25maWcgc3BlY2lmaWMgZm9yIHRoaXMgcmVxdWVzdCAobWVyZ2VkIHdpdGggdGhpcy5kZWZhdWx0cylcbiAqL1xuQXhpb3MucHJvdG90eXBlLnJlcXVlc3QgPSBmdW5jdGlvbiByZXF1ZXN0KGNvbmZpZ09yVXJsLCBjb25maWcpIHtcbiAgLyplc2xpbnQgbm8tcGFyYW0tcmVhc3NpZ246MCovXG4gIC8vIEFsbG93IGZvciBheGlvcygnZXhhbXBsZS91cmwnWywgY29uZmlnXSkgYSBsYSBmZXRjaCBBUElcbiAgaWYgKHR5cGVvZiBjb25maWdPclVybCA9PT0gJ3N0cmluZycpIHtcbiAgICBjb25maWcgPSBjb25maWcgfHwge307XG4gICAgY29uZmlnLnVybCA9IGNvbmZpZ09yVXJsO1xuICB9IGVsc2Uge1xuICAgIGNvbmZpZyA9IGNvbmZpZ09yVXJsIHx8IHt9O1xuICB9XG5cbiAgY29uZmlnID0gbWVyZ2VDb25maWcodGhpcy5kZWZhdWx0cywgY29uZmlnKTtcblxuICAvLyBTZXQgY29uZmlnLm1ldGhvZFxuICBpZiAoY29uZmlnLm1ldGhvZCkge1xuICAgIGNvbmZpZy5tZXRob2QgPSBjb25maWcubWV0aG9kLnRvTG93ZXJDYXNlKCk7XG4gIH0gZWxzZSBpZiAodGhpcy5kZWZhdWx0cy5tZXRob2QpIHtcbiAgICBjb25maWcubWV0aG9kID0gdGhpcy5kZWZhdWx0cy5tZXRob2QudG9Mb3dlckNhc2UoKTtcbiAgfSBlbHNlIHtcbiAgICBjb25maWcubWV0aG9kID0gJ2dldCc7XG4gIH1cblxuICB2YXIgdHJhbnNpdGlvbmFsID0gY29uZmlnLnRyYW5zaXRpb25hbDtcblxuICBpZiAodHJhbnNpdGlvbmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICB2YWxpZGF0b3IuYXNzZXJ0T3B0aW9ucyh0cmFuc2l0aW9uYWwsIHtcbiAgICAgIHNpbGVudEpTT05QYXJzaW5nOiB2YWxpZGF0b3JzLnRyYW5zaXRpb25hbCh2YWxpZGF0b3JzLmJvb2xlYW4pLFxuICAgICAgZm9yY2VkSlNPTlBhcnNpbmc6IHZhbGlkYXRvcnMudHJhbnNpdGlvbmFsKHZhbGlkYXRvcnMuYm9vbGVhbiksXG4gICAgICBjbGFyaWZ5VGltZW91dEVycm9yOiB2YWxpZGF0b3JzLnRyYW5zaXRpb25hbCh2YWxpZGF0b3JzLmJvb2xlYW4pXG4gICAgfSwgZmFsc2UpO1xuICB9XG5cbiAgLy8gZmlsdGVyIG91dCBza2lwcGVkIGludGVyY2VwdG9yc1xuICB2YXIgcmVxdWVzdEludGVyY2VwdG9yQ2hhaW4gPSBbXTtcbiAgdmFyIHN5bmNocm9ub3VzUmVxdWVzdEludGVyY2VwdG9ycyA9IHRydWU7XG4gIHRoaXMuaW50ZXJjZXB0b3JzLnJlcXVlc3QuZm9yRWFjaChmdW5jdGlvbiB1bnNoaWZ0UmVxdWVzdEludGVyY2VwdG9ycyhpbnRlcmNlcHRvcikge1xuICAgIGlmICh0eXBlb2YgaW50ZXJjZXB0b3IucnVuV2hlbiA9PT0gJ2Z1bmN0aW9uJyAmJiBpbnRlcmNlcHRvci5ydW5XaGVuKGNvbmZpZykgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3luY2hyb25vdXNSZXF1ZXN0SW50ZXJjZXB0b3JzID0gc3luY2hyb25vdXNSZXF1ZXN0SW50ZXJjZXB0b3JzICYmIGludGVyY2VwdG9yLnN5bmNocm9ub3VzO1xuXG4gICAgcmVxdWVzdEludGVyY2VwdG9yQ2hhaW4udW5zaGlmdChpbnRlcmNlcHRvci5mdWxmaWxsZWQsIGludGVyY2VwdG9yLnJlamVjdGVkKTtcbiAgfSk7XG5cbiAgdmFyIHJlc3BvbnNlSW50ZXJjZXB0b3JDaGFpbiA9IFtdO1xuICB0aGlzLmludGVyY2VwdG9ycy5yZXNwb25zZS5mb3JFYWNoKGZ1bmN0aW9uIHB1c2hSZXNwb25zZUludGVyY2VwdG9ycyhpbnRlcmNlcHRvcikge1xuICAgIHJlc3BvbnNlSW50ZXJjZXB0b3JDaGFpbi5wdXNoKGludGVyY2VwdG9yLmZ1bGZpbGxlZCwgaW50ZXJjZXB0b3IucmVqZWN0ZWQpO1xuICB9KTtcblxuICB2YXIgcHJvbWlzZTtcblxuICBpZiAoIXN5bmNocm9ub3VzUmVxdWVzdEludGVyY2VwdG9ycykge1xuICAgIHZhciBjaGFpbiA9IFtkaXNwYXRjaFJlcXVlc3QsIHVuZGVmaW5lZF07XG5cbiAgICBBcnJheS5wcm90b3R5cGUudW5zaGlmdC5hcHBseShjaGFpbiwgcmVxdWVzdEludGVyY2VwdG9yQ2hhaW4pO1xuICAgIGNoYWluID0gY2hhaW4uY29uY2F0KHJlc3BvbnNlSW50ZXJjZXB0b3JDaGFpbik7XG5cbiAgICBwcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKGNvbmZpZyk7XG4gICAgd2hpbGUgKGNoYWluLmxlbmd0aCkge1xuICAgICAgcHJvbWlzZSA9IHByb21pc2UudGhlbihjaGFpbi5zaGlmdCgpLCBjaGFpbi5zaGlmdCgpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcHJvbWlzZTtcbiAgfVxuXG5cbiAgdmFyIG5ld0NvbmZpZyA9IGNvbmZpZztcbiAgd2hpbGUgKHJlcXVlc3RJbnRlcmNlcHRvckNoYWluLmxlbmd0aCkge1xuICAgIHZhciBvbkZ1bGZpbGxlZCA9IHJlcXVlc3RJbnRlcmNlcHRvckNoYWluLnNoaWZ0KCk7XG4gICAgdmFyIG9uUmVqZWN0ZWQgPSByZXF1ZXN0SW50ZXJjZXB0b3JDaGFpbi5zaGlmdCgpO1xuICAgIHRyeSB7XG4gICAgICBuZXdDb25maWcgPSBvbkZ1bGZpbGxlZChuZXdDb25maWcpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBvblJlamVjdGVkKGVycm9yKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHRyeSB7XG4gICAgcHJvbWlzZSA9IGRpc3BhdGNoUmVxdWVzdChuZXdDb25maWcpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvcik7XG4gIH1cblxuICB3aGlsZSAocmVzcG9uc2VJbnRlcmNlcHRvckNoYWluLmxlbmd0aCkge1xuICAgIHByb21pc2UgPSBwcm9taXNlLnRoZW4ocmVzcG9uc2VJbnRlcmNlcHRvckNoYWluLnNoaWZ0KCksIHJlc3BvbnNlSW50ZXJjZXB0b3JDaGFpbi5zaGlmdCgpKTtcbiAgfVxuXG4gIHJldHVybiBwcm9taXNlO1xufTtcblxuQXhpb3MucHJvdG90eXBlLmdldFVyaSA9IGZ1bmN0aW9uIGdldFVyaShjb25maWcpIHtcbiAgY29uZmlnID0gbWVyZ2VDb25maWcodGhpcy5kZWZhdWx0cywgY29uZmlnKTtcbiAgdmFyIGZ1bGxQYXRoID0gYnVpbGRGdWxsUGF0aChjb25maWcuYmFzZVVSTCwgY29uZmlnLnVybCk7XG4gIHJldHVybiBidWlsZFVSTChmdWxsUGF0aCwgY29uZmlnLnBhcmFtcywgY29uZmlnLnBhcmFtc1NlcmlhbGl6ZXIpO1xufTtcblxuLy8gUHJvdmlkZSBhbGlhc2VzIGZvciBzdXBwb3J0ZWQgcmVxdWVzdCBtZXRob2RzXG51dGlscy5mb3JFYWNoKFsnZGVsZXRlJywgJ2dldCcsICdoZWFkJywgJ29wdGlvbnMnXSwgZnVuY3Rpb24gZm9yRWFjaE1ldGhvZE5vRGF0YShtZXRob2QpIHtcbiAgLyplc2xpbnQgZnVuYy1uYW1lczowKi9cbiAgQXhpb3MucHJvdG90eXBlW21ldGhvZF0gPSBmdW5jdGlvbih1cmwsIGNvbmZpZykge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QobWVyZ2VDb25maWcoY29uZmlnIHx8IHt9LCB7XG4gICAgICBtZXRob2Q6IG1ldGhvZCxcbiAgICAgIHVybDogdXJsLFxuICAgICAgZGF0YTogKGNvbmZpZyB8fCB7fSkuZGF0YVxuICAgIH0pKTtcbiAgfTtcbn0pO1xuXG51dGlscy5mb3JFYWNoKFsncG9zdCcsICdwdXQnLCAncGF0Y2gnXSwgZnVuY3Rpb24gZm9yRWFjaE1ldGhvZFdpdGhEYXRhKG1ldGhvZCkge1xuICAvKmVzbGludCBmdW5jLW5hbWVzOjAqL1xuXG4gIGZ1bmN0aW9uIGdlbmVyYXRlSFRUUE1ldGhvZChpc0Zvcm0pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gaHR0cE1ldGhvZCh1cmwsIGRhdGEsIGNvbmZpZykge1xuICAgICAgcmV0dXJuIHRoaXMucmVxdWVzdChtZXJnZUNvbmZpZyhjb25maWcgfHwge30sIHtcbiAgICAgICAgbWV0aG9kOiBtZXRob2QsXG4gICAgICAgIGhlYWRlcnM6IGlzRm9ybSA/IHtcbiAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ211bHRpcGFydC9mb3JtLWRhdGEnXG4gICAgICAgIH0gOiB7fSxcbiAgICAgICAgdXJsOiB1cmwsXG4gICAgICAgIGRhdGE6IGRhdGFcbiAgICAgIH0pKTtcbiAgICB9O1xuICB9XG5cbiAgQXhpb3MucHJvdG90eXBlW21ldGhvZF0gPSBnZW5lcmF0ZUhUVFBNZXRob2QoKTtcblxuICBBeGlvcy5wcm90b3R5cGVbbWV0aG9kICsgJ0Zvcm0nXSA9IGdlbmVyYXRlSFRUUE1ldGhvZCh0cnVlKTtcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEF4aW9zO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQ2FuY2VsZWRFcnJvciA9IHJlcXVpcmUoJy4vQ2FuY2VsZWRFcnJvcicpO1xuXG4vKipcbiAqIEEgYENhbmNlbFRva2VuYCBpcyBhbiBvYmplY3QgdGhhdCBjYW4gYmUgdXNlZCB0byByZXF1ZXN0IGNhbmNlbGxhdGlvbiBvZiBhbiBvcGVyYXRpb24uXG4gKlxuICogQGNsYXNzXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBleGVjdXRvciBUaGUgZXhlY3V0b3IgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIENhbmNlbFRva2VuKGV4ZWN1dG9yKSB7XG4gIGlmICh0eXBlb2YgZXhlY3V0b3IgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdleGVjdXRvciBtdXN0IGJlIGEgZnVuY3Rpb24uJyk7XG4gIH1cblxuICB2YXIgcmVzb2x2ZVByb21pc2U7XG5cbiAgdGhpcy5wcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24gcHJvbWlzZUV4ZWN1dG9yKHJlc29sdmUpIHtcbiAgICByZXNvbHZlUHJvbWlzZSA9IHJlc29sdmU7XG4gIH0pO1xuXG4gIHZhciB0b2tlbiA9IHRoaXM7XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGZ1bmMtbmFtZXNcbiAgdGhpcy5wcm9taXNlLnRoZW4oZnVuY3Rpb24oY2FuY2VsKSB7XG4gICAgaWYgKCF0b2tlbi5fbGlzdGVuZXJzKSByZXR1cm47XG5cbiAgICB2YXIgaTtcbiAgICB2YXIgbCA9IHRva2VuLl9saXN0ZW5lcnMubGVuZ3RoO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IGw7IGkrKykge1xuICAgICAgdG9rZW4uX2xpc3RlbmVyc1tpXShjYW5jZWwpO1xuICAgIH1cbiAgICB0b2tlbi5fbGlzdGVuZXJzID0gbnVsbDtcbiAgfSk7XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGZ1bmMtbmFtZXNcbiAgdGhpcy5wcm9taXNlLnRoZW4gPSBmdW5jdGlvbihvbmZ1bGZpbGxlZCkge1xuICAgIHZhciBfcmVzb2x2ZTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZnVuYy1uYW1lc1xuICAgIHZhciBwcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSkge1xuICAgICAgdG9rZW4uc3Vic2NyaWJlKHJlc29sdmUpO1xuICAgICAgX3Jlc29sdmUgPSByZXNvbHZlO1xuICAgIH0pLnRoZW4ob25mdWxmaWxsZWQpO1xuXG4gICAgcHJvbWlzZS5jYW5jZWwgPSBmdW5jdGlvbiByZWplY3QoKSB7XG4gICAgICB0b2tlbi51bnN1YnNjcmliZShfcmVzb2x2ZSk7XG4gICAgfTtcblxuICAgIHJldHVybiBwcm9taXNlO1xuICB9O1xuXG4gIGV4ZWN1dG9yKGZ1bmN0aW9uIGNhbmNlbChtZXNzYWdlKSB7XG4gICAgaWYgKHRva2VuLnJlYXNvbikge1xuICAgICAgLy8gQ2FuY2VsbGF0aW9uIGhhcyBhbHJlYWR5IGJlZW4gcmVxdWVzdGVkXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdG9rZW4ucmVhc29uID0gbmV3IENhbmNlbGVkRXJyb3IobWVzc2FnZSk7XG4gICAgcmVzb2x2ZVByb21pc2UodG9rZW4ucmVhc29uKTtcbiAgfSk7XG59XG5cbi8qKlxuICogVGhyb3dzIGEgYENhbmNlbGVkRXJyb3JgIGlmIGNhbmNlbGxhdGlvbiBoYXMgYmVlbiByZXF1ZXN0ZWQuXG4gKi9cbkNhbmNlbFRva2VuLnByb3RvdHlwZS50aHJvd0lmUmVxdWVzdGVkID0gZnVuY3Rpb24gdGhyb3dJZlJlcXVlc3RlZCgpIHtcbiAgaWYgKHRoaXMucmVhc29uKSB7XG4gICAgdGhyb3cgdGhpcy5yZWFzb247XG4gIH1cbn07XG5cbi8qKlxuICogU3Vic2NyaWJlIHRvIHRoZSBjYW5jZWwgc2lnbmFsXG4gKi9cblxuQ2FuY2VsVG9rZW4ucHJvdG90eXBlLnN1YnNjcmliZSA9IGZ1bmN0aW9uIHN1YnNjcmliZShsaXN0ZW5lcikge1xuICBpZiAodGhpcy5yZWFzb24pIHtcbiAgICBsaXN0ZW5lcih0aGlzLnJlYXNvbik7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHRoaXMuX2xpc3RlbmVycykge1xuICAgIHRoaXMuX2xpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLl9saXN0ZW5lcnMgPSBbbGlzdGVuZXJdO1xuICB9XG59O1xuXG4vKipcbiAqIFVuc3Vic2NyaWJlIGZyb20gdGhlIGNhbmNlbCBzaWduYWxcbiAqL1xuXG5DYW5jZWxUb2tlbi5wcm90b3R5cGUudW5zdWJzY3JpYmUgPSBmdW5jdGlvbiB1bnN1YnNjcmliZShsaXN0ZW5lcikge1xuICBpZiAoIXRoaXMuX2xpc3RlbmVycykge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgaW5kZXggPSB0aGlzLl9saXN0ZW5lcnMuaW5kZXhPZihsaXN0ZW5lcik7XG4gIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICB0aGlzLl9saXN0ZW5lcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgfVxufTtcblxuLyoqXG4gKiBSZXR1cm5zIGFuIG9iamVjdCB0aGF0IGNvbnRhaW5zIGEgbmV3IGBDYW5jZWxUb2tlbmAgYW5kIGEgZnVuY3Rpb24gdGhhdCwgd2hlbiBjYWxsZWQsXG4gKiBjYW5jZWxzIHRoZSBgQ2FuY2VsVG9rZW5gLlxuICovXG5DYW5jZWxUb2tlbi5zb3VyY2UgPSBmdW5jdGlvbiBzb3VyY2UoKSB7XG4gIHZhciBjYW5jZWw7XG4gIHZhciB0b2tlbiA9IG5ldyBDYW5jZWxUb2tlbihmdW5jdGlvbiBleGVjdXRvcihjKSB7XG4gICAgY2FuY2VsID0gYztcbiAgfSk7XG4gIHJldHVybiB7XG4gICAgdG9rZW46IHRva2VuLFxuICAgIGNhbmNlbDogY2FuY2VsXG4gIH07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IENhbmNlbFRva2VuO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIFN5bnRhY3RpYyBzdWdhciBmb3IgaW52b2tpbmcgYSBmdW5jdGlvbiBhbmQgZXhwYW5kaW5nIGFuIGFycmF5IGZvciBhcmd1bWVudHMuXG4gKlxuICogQ29tbW9uIHVzZSBjYXNlIHdvdWxkIGJlIHRvIHVzZSBgRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5YC5cbiAqXG4gKiAgYGBganNcbiAqICBmdW5jdGlvbiBmKHgsIHksIHopIHt9XG4gKiAgdmFyIGFyZ3MgPSBbMSwgMiwgM107XG4gKiAgZi5hcHBseShudWxsLCBhcmdzKTtcbiAqICBgYGBcbiAqXG4gKiBXaXRoIGBzcHJlYWRgIHRoaXMgZXhhbXBsZSBjYW4gYmUgcmUtd3JpdHRlbi5cbiAqXG4gKiAgYGBganNcbiAqICBzcHJlYWQoZnVuY3Rpb24oeCwgeSwgeikge30pKFsxLCAyLCAzXSk7XG4gKiAgYGBgXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAqIEByZXR1cm5zIHtGdW5jdGlvbn1cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBzcHJlYWQoY2FsbGJhY2spIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHdyYXAoYXJyKSB7XG4gICAgcmV0dXJuIGNhbGxiYWNrLmFwcGx5KG51bGwsIGFycik7XG4gIH07XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLy4uL3V0aWxzJyk7XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBwYXlsb2FkIGlzIGFuIGVycm9yIHRocm93biBieSBBeGlvc1xuICpcbiAqIEBwYXJhbSB7Kn0gcGF5bG9hZCBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIHBheWxvYWQgaXMgYW4gZXJyb3IgdGhyb3duIGJ5IEF4aW9zLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc0F4aW9zRXJyb3IocGF5bG9hZCkge1xuICByZXR1cm4gdXRpbHMuaXNPYmplY3QocGF5bG9hZCkgJiYgKHBheWxvYWQuaXNBeGlvc0Vycm9yID09PSB0cnVlKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcbnZhciBiaW5kID0gcmVxdWlyZSgnLi9oZWxwZXJzL2JpbmQnKTtcbnZhciBBeGlvcyA9IHJlcXVpcmUoJy4vY29yZS9BeGlvcycpO1xudmFyIG1lcmdlQ29uZmlnID0gcmVxdWlyZSgnLi9jb3JlL21lcmdlQ29uZmlnJyk7XG52YXIgZGVmYXVsdHMgPSByZXF1aXJlKCcuL2RlZmF1bHRzJyk7XG5cbi8qKlxuICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIEF4aW9zXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGRlZmF1bHRDb25maWcgVGhlIGRlZmF1bHQgY29uZmlnIGZvciB0aGUgaW5zdGFuY2VcbiAqIEByZXR1cm4ge0F4aW9zfSBBIG5ldyBpbnN0YW5jZSBvZiBBeGlvc1xuICovXG5mdW5jdGlvbiBjcmVhdGVJbnN0YW5jZShkZWZhdWx0Q29uZmlnKSB7XG4gIHZhciBjb250ZXh0ID0gbmV3IEF4aW9zKGRlZmF1bHRDb25maWcpO1xuICB2YXIgaW5zdGFuY2UgPSBiaW5kKEF4aW9zLnByb3RvdHlwZS5yZXF1ZXN0LCBjb250ZXh0KTtcblxuICAvLyBDb3B5IGF4aW9zLnByb3RvdHlwZSB0byBpbnN0YW5jZVxuICB1dGlscy5leHRlbmQoaW5zdGFuY2UsIEF4aW9zLnByb3RvdHlwZSwgY29udGV4dCk7XG5cbiAgLy8gQ29weSBjb250ZXh0IHRvIGluc3RhbmNlXG4gIHV0aWxzLmV4dGVuZChpbnN0YW5jZSwgY29udGV4dCk7XG5cbiAgLy8gRmFjdG9yeSBmb3IgY3JlYXRpbmcgbmV3IGluc3RhbmNlc1xuICBpbnN0YW5jZS5jcmVhdGUgPSBmdW5jdGlvbiBjcmVhdGUoaW5zdGFuY2VDb25maWcpIHtcbiAgICByZXR1cm4gY3JlYXRlSW5zdGFuY2UobWVyZ2VDb25maWcoZGVmYXVsdENvbmZpZywgaW5zdGFuY2VDb25maWcpKTtcbiAgfTtcblxuICByZXR1cm4gaW5zdGFuY2U7XG59XG5cbi8vIENyZWF0ZSB0aGUgZGVmYXVsdCBpbnN0YW5jZSB0byBiZSBleHBvcnRlZFxudmFyIGF4aW9zID0gY3JlYXRlSW5zdGFuY2UoZGVmYXVsdHMpO1xuXG4vLyBFeHBvc2UgQXhpb3MgY2xhc3MgdG8gYWxsb3cgY2xhc3MgaW5oZXJpdGFuY2VcbmF4aW9zLkF4aW9zID0gQXhpb3M7XG5cbi8vIEV4cG9zZSBDYW5jZWwgJiBDYW5jZWxUb2tlblxuYXhpb3MuQ2FuY2VsZWRFcnJvciA9IHJlcXVpcmUoJy4vY2FuY2VsL0NhbmNlbGVkRXJyb3InKTtcbmF4aW9zLkNhbmNlbFRva2VuID0gcmVxdWlyZSgnLi9jYW5jZWwvQ2FuY2VsVG9rZW4nKTtcbmF4aW9zLmlzQ2FuY2VsID0gcmVxdWlyZSgnLi9jYW5jZWwvaXNDYW5jZWwnKTtcbmF4aW9zLlZFUlNJT04gPSByZXF1aXJlKCcuL2Vudi9kYXRhJykudmVyc2lvbjtcbmF4aW9zLnRvRm9ybURhdGEgPSByZXF1aXJlKCcuL2hlbHBlcnMvdG9Gb3JtRGF0YScpO1xuXG4vLyBFeHBvc2UgQXhpb3NFcnJvciBjbGFzc1xuYXhpb3MuQXhpb3NFcnJvciA9IHJlcXVpcmUoJy4uL2xpYi9jb3JlL0F4aW9zRXJyb3InKTtcblxuLy8gYWxpYXMgZm9yIENhbmNlbGVkRXJyb3IgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcbmF4aW9zLkNhbmNlbCA9IGF4aW9zLkNhbmNlbGVkRXJyb3I7XG5cbi8vIEV4cG9zZSBhbGwvc3ByZWFkXG5heGlvcy5hbGwgPSBmdW5jdGlvbiBhbGwocHJvbWlzZXMpIHtcbiAgcmV0dXJuIFByb21pc2UuYWxsKHByb21pc2VzKTtcbn07XG5heGlvcy5zcHJlYWQgPSByZXF1aXJlKCcuL2hlbHBlcnMvc3ByZWFkJyk7XG5cbi8vIEV4cG9zZSBpc0F4aW9zRXJyb3JcbmF4aW9zLmlzQXhpb3NFcnJvciA9IHJlcXVpcmUoJy4vaGVscGVycy9pc0F4aW9zRXJyb3InKTtcblxubW9kdWxlLmV4cG9ydHMgPSBheGlvcztcblxuLy8gQWxsb3cgdXNlIG9mIGRlZmF1bHQgaW1wb3J0IHN5bnRheCBpbiBUeXBlU2NyaXB0XG5tb2R1bGUuZXhwb3J0cy5kZWZhdWx0ID0gYXhpb3M7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vbGliL2F4aW9zJyk7IiwiaW1wb3J0IGF4aW9zLCB7IEF4aW9zUmVzcG9uc2UsIEF4aW9zSW5zdGFuY2UsIEF4aW9zUmVxdWVzdENvbmZpZyB9IGZyb20gJ2F4aW9zJ1xuaW1wb3J0IHtcbiAgUmVzb3VyY2VBY3Rpb25QYXJhbXMsXG4gIEJ1bGtBY3Rpb25QYXJhbXMsXG4gIFJlY29yZEFjdGlvblBhcmFtcyxcbiAgQWN0aW9uUGFyYW1zLFxufSBmcm9tICcuLi8uLi9iYWNrZW5kL3V0aWxzL3ZpZXctaGVscGVycy92aWV3LWhlbHBlcnMnXG5cbi8qIGVzbGludC1kaXNhYmxlIG5vLWFsZXJ0ICovXG5pbXBvcnQgeyBSZWNvcmRKU09OIH0gZnJvbSAnLi4vaW50ZXJmYWNlcydcbmltcG9ydCB7IFJlY29yZEFjdGlvblJlc3BvbnNlLCBBY3Rpb25SZXNwb25zZSwgQnVsa0FjdGlvblJlc3BvbnNlIH0gZnJvbSAnLi4vLi4vYmFja2VuZC9hY3Rpb25zL2FjdGlvbi5pbnRlcmZhY2UnXG5cbmxldCBnbG9iYWxBbnk6IGFueSA9IHt9XG5cbnRyeSB7XG4gIGdsb2JhbEFueSA9IHdpbmRvd1xufSBjYXRjaCAoZXJyb3IpIHtcbiAgaWYgKGVycm9yLm1lc3NhZ2UgIT09ICd3aW5kb3cgaXMgbm90IGRlZmluZWQnKSB7XG4gICAgdGhyb3cgZXJyb3JcbiAgfSBlbHNlIHtcbiAgICBnbG9iYWxBbnkgPSB7IGlzT25TZXJ2ZXI6IHRydWUgfVxuICB9XG59XG5cbi8qKlxuICogVHlwZSBvZiBhbiBbYXhpb3MgcmVxdWVzdF17QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2F4aW9zL2F4aW9zL2Jsb2IvbWFzdGVyL2luZGV4LmQudHMjTDQzfVxuICpcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEF4aW9zUmVxdWVzdENvbmZpZ1xuICogQGFsaWFzIEF4aW9zUmVxdWVzdENvbmZpZ1xuICogQG1lbWJlcm9mIEFwaUNsaWVudFxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vYXhpb3MvYXhpb3MvYmxvYi9tYXN0ZXIvaW5kZXguZC50cyNMNDNcbiAqL1xuXG5jb25zdCBjaGVja1Jlc3BvbnNlID0gKHJlc3BvbnNlOiBBeGlvc1Jlc3BvbnNlKTogdm9pZCA9PiB7XG4gIGlmIChnbG9iYWxBbnkuaXNPblNlcnZlcikgeyByZXR1cm4gfVxuICBjb25zdCBsb2dpblVybCA9IFtnbG9iYWxBbnkubG9jYXRpb24ub3JpZ2luLCBnbG9iYWxBbnkuUkVEVVhfU1RBVEUucGF0aHMubG9naW5QYXRoXS5qb2luKCcnKVxuICAvLyBpZiByZXNwb25zZSBoYXMgcmVkaXJlY3QgdG8gbG9naW5VcmxcbiAgaWYgKHJlc3BvbnNlLnJlcXVlc3QucmVzcG9uc2VVUkxcbiAgICAgICYmIHJlc3BvbnNlLnJlcXVlc3QucmVzcG9uc2VVUkwubWF0Y2gobG9naW5VcmwpXG4gICkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxuICAgIGFsZXJ0KCdZb3VyIHNlc3Npb24gZXhwaXJlZC4gWW91IHdpbGwgYmUgcmVkaXJlY3RlZCB0byBsb2dpbiBzY3JlZW4nKVxuICAgIGdsb2JhbEFueS5sb2NhdGlvbi5hc3NpZ24obG9naW5VcmwpXG4gIH1cbn1cblxuLyoqXG4gKiBFeHRlbmRzIHtAbGluayBBeGlvc1JlcXVlc3RDb25maWd9XG4gKlxuICogQGFsaWFzIEFjdGlvbkFQSVBhcmFtc1xuICogQG1lbWJlcm9mIEFwaUNsaWVudFxuICogQHByb3BlcnR5IHthbnl9ICAgLi4uICAgIGFueSBwcm9wZXJ0eSBzdXBwb3J0ZWQgYnkge0BsaW5rIEF4aW9zUmVxdWVzdENvbmZpZ31cbiAqL1xuZXhwb3J0IHR5cGUgQWN0aW9uQVBJUGFyYW1zID0gQXhpb3NSZXF1ZXN0Q29uZmlnICYgQWN0aW9uUGFyYW1zXG5cbi8qKlxuICogRXh0ZW5kcyB7QGxpbmsgQWN0aW9uQVBJUGFyYW1zfVxuICpcbiAqIEBhbGlhcyBSZXNvdXJjZUFjdGlvbkFQSVBhcmFtc1xuICogQG1lbWJlcm9mIEFwaUNsaWVudFxuICogQHByb3BlcnR5IHthbnl9ICAgLi4uICAgIGFueSBwcm9wZXJ0eSBzdXBwb3J0ZWQgYnkge0BsaW5rIEF4aW9zUmVxdWVzdENvbmZpZ31cbiAqL1xuZXhwb3J0IHR5cGUgUmVzb3VyY2VBY3Rpb25BUElQYXJhbXMgPSBBeGlvc1JlcXVlc3RDb25maWcgJiBSZXNvdXJjZUFjdGlvblBhcmFtcyAmIHtcbiAgcXVlcnk/OiBzdHJpbmc7XG59XG4vKipcbiAqIEV4dGVuZHMge0BsaW5rIEFjdGlvbkFQSVBhcmFtc31cbiAqXG4gKiBAYWxpYXMgUmVjb3JkQWN0aW9uQVBJUGFyYW1zXG4gKiBAbWVtYmVyb2YgQXBpQ2xpZW50XG4gKiBAcHJvcGVydHkge2FueX0gICAuLi4gICAgYW55IHByb3BlcnR5IHN1cHBvcnRlZCBieSB7QGxpbmsgQWN0aW9uQVBJUGFyYW1zfVxuICovXG5leHBvcnQgdHlwZSBSZWNvcmRBY3Rpb25BUElQYXJhbXMgPSBBeGlvc1JlcXVlc3RDb25maWcgJiBSZWNvcmRBY3Rpb25QYXJhbXNcblxuLyoqXG4gKiBFeHRlbmRzIHtAbGluayBBY3Rpb25BUElQYXJhbXN9XG4gKlxuICogQGFsaWFzIEJ1bGtBY3Rpb25BUElQYXJhbXNcbiAqIEBtZW1iZXJvZiBBcGlDbGllbnRcbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2F4aW9zL2F4aW9zL2Jsb2IvbWFzdGVyL2luZGV4LmQudHMjTDQzXG4gKiBAcHJvcGVydHkge2FueX0gICAuLi4gICAgYW55IHByb3BlcnR5IHN1cHBvcnRlZCBieSB7QGxpbmsgQWN0aW9uQVBJUGFyYW1zfVxuICovXG5leHBvcnQgdHlwZSBCdWxrQWN0aW9uQVBJUGFyYW1zID0gQXhpb3NSZXF1ZXN0Q29uZmlnICYgQnVsa0FjdGlvblBhcmFtc1xuXG4vKipcbiAqIEV4dGVuZHMge0BsaW5rIEF4aW9zUmVxdWVzdENvbmZpZ31cbiAqXG4gKiBAYWxpYXMgR2V0UGFnZUFQSVBhcmFtc1xuICogQG1lbWJlcm9mIEFwaUNsaWVudFxuICogQHByb3BlcnR5IHthbnl9ICAgLi4uICAgIGFueSBwcm9wZXJ0eSBzdXBwb3J0ZWQgYnkge0BsaW5rIEF4aW9zUmVxdWVzdENvbmZpZ31cbiAqL1xuZXhwb3J0IHR5cGUgR2V0UGFnZUFQSVBhcmFtcyA9IEF4aW9zUmVxdWVzdENvbmZpZyAmIHtcbiAgLyoqXG4gICAqIFVuaXF1ZSBwYWdlIG5hbWVcbiAgICovXG4gIHBhZ2VOYW1lOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ2xpZW50IHdoaWNoIGFjY2VzcyB0aGUgYWRtaW4gQVBJLlxuICogVXNlIGl0IHRvIGZldGNoIGRhdGEgZnJvbSBhdXRvIGdlbmVyYXRlZCBBZG1pbkpTIEFQSS5cbiAqXG4gKiBJbiB0aGUgYmFja2VuZCBpdCB1c2VzIFtheGlvc10oaHR0cHM6Ly9naXRodWIuY29tL2F4aW9zL2F4aW9zKSBjbGllbnRcbiAqIGxpYnJhcnkuXG4gKlxuICogVXNhZ2U6XG4gKiBgYGBqYXZhc2NyaXB0XG4gKiBpbXBvcnQgeyBBcGlDbGllbnQgfSBmcm9tICdhZG1pbmpzJ1xuICpcbiAqIGNvbnN0IGFwaSA9IG5ldyBBcGlDbGllbnQoKVxuICogLy8gZmV0Y2hpbmcgYWxsIHJlY29yZHNcbiAqIGFwaS5yZXNvdXJjZUFjdGlvbih7IHJlc291cmNlSWQ6ICdDb21tZW50cycsIGFjdGlvbk5hbWU6ICdsaXN0JyB9KS50aGVuKHJlc3VsdHMgPT4gey4uLn0pXG4gKiBgYGBcbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2F4aW9zL2F4aW9zXG4gKiBAaGlkZWNvbnN0cnVjdG9yXG4gKi9cbmNsYXNzIEFwaUNsaWVudCB7XG4gIHByaXZhdGUgYmFzZVVSTDogc3RyaW5nXG5cbiAgcHJpdmF0ZSBjbGllbnQ6IEF4aW9zSW5zdGFuY2VcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmJhc2VVUkwgPSBBcGlDbGllbnQuZ2V0QmFzZVVybCgpXG4gICAgdGhpcy5jbGllbnQgPSBheGlvcy5jcmVhdGUoe1xuICAgICAgYmFzZVVSTDogdGhpcy5iYXNlVVJMLFxuICAgIH0pXG4gIH1cblxuICBzdGF0aWMgZ2V0QmFzZVVybCgpOiBzdHJpbmcge1xuICAgIGlmIChnbG9iYWxBbnkuaXNPblNlcnZlcikgeyByZXR1cm4gJycgfVxuICAgIHJldHVybiBbZ2xvYmFsQW55LmxvY2F0aW9uLm9yaWdpbiwgZ2xvYmFsQW55LlJFRFVYX1NUQVRFPy5wYXRocy5yb290UGF0aF0uam9pbignJylcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWFyY2ggYnkgcXVlcnkgc3RyaW5nIGZvciByZWNvcmRzIGluIGEgZ2l2ZW4gcmVzb3VyY2UuXG4gICAqXG4gICAqIEBwYXJhbSAgIHtPYmplY3R9ICBvcHRpb25zXG4gICAqIEBwYXJhbSAgIHtTdHJpbmd9ICBvcHRpb25zLnJlc291cmNlSWQgICAgIGlkIG9mIGEge0BsaW5rIFJlc291cmNlSlNPTn1cbiAgICogQHBhcmFtICAge1N0cmluZ30gIG9wdGlvbnMucXVlcnkgICAgICAgICAgcXVlcnkgc3RyaW5nXG4gICAqIEBwYXJhbSAgIHtTdHJpbmd9ICBvcHRpb25zLnNlYXJjaFByb3BlcnR5IG9wdGlvbmFsIHByb3BlcnR5IG5hbWVcbiAgICpcbiAgICogQHJldHVybiAge1Byb21pc2U8U2VhcmNoUmVzcG9uc2U+fVxuICAgKi9cbiAgYXN5bmMgc2VhcmNoUmVjb3Jkcyh7IHJlc291cmNlSWQsIHF1ZXJ5LCBzZWFyY2hQcm9wZXJ0eSB9OiB7XG4gICAgcmVzb3VyY2VJZDogc3RyaW5nO1xuICAgIHF1ZXJ5OiBzdHJpbmc7XG4gICAgc2VhcmNoUHJvcGVydHk/OiBzdHJpbmc7XG4gIH0pOiBQcm9taXNlPEFycmF5PFJlY29yZEpTT04+PiB7XG4gICAgaWYgKGdsb2JhbEFueS5pc09uU2VydmVyKSB7IHJldHVybiBbXSB9XG4gICAgY29uc3QgYWN0aW9uTmFtZSA9ICdzZWFyY2gnXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLnJlc291cmNlQWN0aW9uKHtcbiAgICAgIHJlc291cmNlSWQsXG4gICAgICBhY3Rpb25OYW1lLFxuICAgICAgcXVlcnksXG4gICAgICAuLi4oc2VhcmNoUHJvcGVydHkgPyB7IHBhcmFtczogeyBzZWFyY2hQcm9wZXJ0eSB9IH0gOiB1bmRlZmluZWQpLFxuICAgIH0pXG4gICAgY2hlY2tSZXNwb25zZShyZXNwb25zZSlcbiAgICByZXR1cm4gcmVzcG9uc2UuZGF0YS5yZWNvcmRzXG4gIH1cblxuICAvKipcbiAgICogSW52b2tlcyBnaXZlbiByZXNvdXJjZSB7QGxpbmsgQWN0aW9ufSBvbiB0aGUgYmFja2VuZC5cbiAgICpcbiAgICogQHBhcmFtICAge1Jlc291cmNlQWN0aW9uQVBJUGFyYW1zfSAgICAgb3B0aW9uc1xuICAgKiBAcmV0dXJuICB7UHJvbWlzZTxBY3Rpb25SZXNwb25zZT59ICAgICByZXNwb25zZSBmcm9tIGFuIHtAbGluayBBY3Rpb259XG4gICAqL1xuICBhc3luYyByZXNvdXJjZUFjdGlvbihvcHRpb25zOiBSZXNvdXJjZUFjdGlvbkFQSVBhcmFtcyk6IFByb21pc2U8QXhpb3NSZXNwb25zZTxBY3Rpb25SZXNwb25zZT4+IHtcbiAgICBjb25zdCB7IHJlc291cmNlSWQsIGFjdGlvbk5hbWUsIGRhdGEsIHF1ZXJ5LCAuLi5heGlvc1BhcmFtcyB9ID0gb3B0aW9uc1xuICAgIGxldCB1cmwgPSBgL2FwaS9yZXNvdXJjZXMvJHtyZXNvdXJjZUlkfS9hY3Rpb25zLyR7YWN0aW9uTmFtZX1gXG4gICAgaWYgKHF1ZXJ5KSB7XG4gICAgICBjb25zdCBxID0gZW5jb2RlVVJJQ29tcG9uZW50KHF1ZXJ5KVxuICAgICAgdXJsID0gW3VybCwgcV0uam9pbignLycpXG4gICAgfVxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5jbGllbnQucmVxdWVzdCh7XG4gICAgICB1cmwsXG4gICAgICBtZXRob2Q6IGRhdGEgPyAnUE9TVCcgOiAnR0VUJyxcbiAgICAgIC4uLmF4aW9zUGFyYW1zLFxuICAgICAgZGF0YSxcbiAgICB9KVxuICAgIGNoZWNrUmVzcG9uc2UocmVzcG9uc2UpXG4gICAgcmV0dXJuIHJlc3BvbnNlXG4gIH1cblxuICAvKipcbiAgICogSW52b2tlcyBnaXZlbiByZWNvcmQge0BsaW5rIEFjdGlvbn0gb24gdGhlIGJhY2tlbmQuXG4gICAqXG4gICAqIEBwYXJhbSAgIHtSZWNvcmRBY3Rpb25BUElQYXJhbXN9IG9wdGlvbnNcbiAgICogQHJldHVybiAge1Byb21pc2U8UmVjb3JkQWN0aW9uUmVzcG9uc2U+fSAgICAgICAgICAgIHJlc3BvbnNlIGZyb20gYW4ge0BsaW5rIEFjdGlvbn1cbiAgICovXG4gIGFzeW5jIHJlY29yZEFjdGlvbihvcHRpb25zOiBSZWNvcmRBY3Rpb25BUElQYXJhbXMpOiBQcm9taXNlPEF4aW9zUmVzcG9uc2U8UmVjb3JkQWN0aW9uUmVzcG9uc2U+PiB7XG4gICAgY29uc3QgeyByZXNvdXJjZUlkLCByZWNvcmRJZCwgYWN0aW9uTmFtZSwgZGF0YSwgLi4uYXhpb3NQYXJhbXMgfSA9IG9wdGlvbnNcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuY2xpZW50LnJlcXVlc3Qoe1xuICAgICAgdXJsOiBgL2FwaS9yZXNvdXJjZXMvJHtyZXNvdXJjZUlkfS9yZWNvcmRzLyR7cmVjb3JkSWR9LyR7YWN0aW9uTmFtZX1gLFxuICAgICAgbWV0aG9kOiBkYXRhID8gJ1BPU1QnIDogJ0dFVCcsXG4gICAgICAuLi5heGlvc1BhcmFtcyxcbiAgICAgIGRhdGEsXG4gICAgfSlcbiAgICBjaGVja1Jlc3BvbnNlKHJlc3BvbnNlKVxuICAgIHJldHVybiByZXNwb25zZVxuICB9XG5cbiAgLyoqXG4gICAqIEludm9rZXMgZ2l2ZW4gYnVsayB7QGxpbmsgQWN0aW9ufSBvbiB0aGUgYmFja2VuZC5cbiAgICpcbiAgICogQHBhcmFtICAge0J1bGtBY3Rpb25BUElQYXJhbXN9IG9wdGlvbnNcbiAgICogQHJldHVybiAge1Byb21pc2U8QnVsa0FjdGlvblJlc3BvbnNlPn0gICAgICAgICAgICByZXNwb25zZSBmcm9tIGFuIHtAbGluayBBY3Rpb259XG4gICAqL1xuICBhc3luYyBidWxrQWN0aW9uKG9wdGlvbnM6IEJ1bGtBY3Rpb25BUElQYXJhbXMpOiBQcm9taXNlPEF4aW9zUmVzcG9uc2U8QnVsa0FjdGlvblJlc3BvbnNlPj4ge1xuICAgIGNvbnN0IHsgcmVzb3VyY2VJZCwgcmVjb3JkSWRzLCBhY3Rpb25OYW1lLCBkYXRhLCAuLi5heGlvc1BhcmFtcyB9ID0gb3B0aW9uc1xuXG4gICAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpXG4gICAgcGFyYW1zLnNldCgncmVjb3JkSWRzJywgKHJlY29yZElkcyB8fCBbXSkuam9pbignLCcpKVxuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNsaWVudC5yZXF1ZXN0KHtcbiAgICAgIHVybDogYC9hcGkvcmVzb3VyY2VzLyR7cmVzb3VyY2VJZH0vYnVsay8ke2FjdGlvbk5hbWV9YCxcbiAgICAgIG1ldGhvZDogZGF0YSA/ICdQT1NUJyA6ICdHRVQnLFxuICAgICAgLi4uYXhpb3NQYXJhbXMsXG4gICAgICBkYXRhLFxuICAgICAgcGFyYW1zLFxuICAgIH0pXG4gICAgY2hlY2tSZXNwb25zZShyZXNwb25zZSlcbiAgICByZXR1cm4gcmVzcG9uc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnZva2VzIGRhc2hib2FyZCBoYW5kbGVyLlxuICAgKlxuICAgKiBAcGFyYW0gICB7QXhpb3NSZXF1ZXN0Q29uZmlnfSAgICAgICBvcHRpb25zXG4gICAqIEByZXR1cm4gIHtQcm9taXNlPEF4aW9zUmVzcG9uc2U8YW55Pj59IHJlc3BvbnNlIGZyb20gdGhlIGhhbmRsZXIgZnVuY3Rpb24gZGVmaW5lZCBpblxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7QGxpbmsgQWRtaW5KU09wdGlvbnMjZGFzaGJvYXJkfVxuICAgKi9cbiAgYXN5bmMgZ2V0RGFzaGJvYXJkKG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHt9KTogUHJvbWlzZTxBeGlvc1Jlc3BvbnNlPGFueT4+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuY2xpZW50LmdldCgnL2FwaS9kYXNoYm9hcmQnLCBvcHRpb25zKVxuICAgIGNoZWNrUmVzcG9uc2UocmVzcG9uc2UpXG4gICAgcmV0dXJuIHJlc3BvbnNlXG4gIH1cblxuICAvKipcbiAgICogSW52b2tlcyBoYW5kbGVyIGZ1bmN0aW9uIG9mIGdpdmVuIHBhZ2UgYW5kIHJldHVybnMgaXRzIHJlc3BvbnNlLlxuICAgKlxuICAgKiBAcGFyYW0gICB7R2V0UGFnZUFQSVBhcmFtc30gICAgICAgICAgICAgICAgb3B0aW9uc1xuICAgKiBAcmV0dXJuICB7UHJvbWlzZTxBeGlvc1Jlc3BvbnNlPGFueT4+fSAgICAgcmVzcG9uc2UgZnJvbSB0aGUgaGFuZGxlciBvZiBnaXZlbiBwYWdlXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZpbmVkIGluIHtAbGluayBBZG1pbkpTT3B0aW9ucyNwYWdlc31cbiAgICovXG4gIGFzeW5jIGdldFBhZ2Uob3B0aW9uczogR2V0UGFnZUFQSVBhcmFtcyk6IFByb21pc2U8QXhpb3NSZXNwb25zZTxhbnk+PiB7XG4gICAgY29uc3QgeyBwYWdlTmFtZSwgLi4uYXhpb3NQYXJhbXMgfSA9IG9wdGlvbnNcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuY2xpZW50LnJlcXVlc3Qoe1xuICAgICAgdXJsOiBgL2FwaS9wYWdlcy8ke3BhZ2VOYW1lfWAsXG4gICAgICAuLi5heGlvc1BhcmFtcyxcbiAgICB9KVxuICAgIGNoZWNrUmVzcG9uc2UocmVzcG9uc2UpXG4gICAgcmV0dXJuIHJlc3BvbnNlXG4gIH1cbn1cblxuZXhwb3J0IHtcbiAgQXBpQ2xpZW50IGFzIGRlZmF1bHQsXG4gIEFwaUNsaWVudCxcbn1cbiIsImV4cG9ydCBjb25zdCBGT1JNX1ZBTFVFX05VTEwgPSAnX19GT1JNX1ZBTFVFX05VTExfXydcbmV4cG9ydCBjb25zdCBGT1JNX1ZBTFVFX0VNUFRZX09CSkVDVCA9ICdfX0ZPUk1fVkFMVUVfRU1QVFlfT0JKRUNUX18nXG5leHBvcnQgY29uc3QgRk9STV9WQUxVRV9FTVBUWV9BUlJBWSA9ICdfX0ZPUk1fVkFMVUVfRU1QVFlfQVJSQVlfXydcblxuY29uc3QgaXNPYmplY3RPckFycmF5ID0gKHZhbHVlOiBhbnkpOiBib29sZWFuID0+IChcbiAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0J1xuICAmJiAodmFsdWUgYXMgb2JqZWN0KS5jb25zdHJ1Y3RvciAhPT0gRmlsZVxuICAmJiAhKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSlcbilcblxuLyoqXG4gKiBDaGFuZ2VzIFJlY29yZEpTT04gdGhhdCBpdCBjYW4gYmUgc2VuZCBhcyBhIEZvcm1EYXRhIHRvIHRoZSBiYWNrZW5kLlxuICpcbiAqIEZvcm1EYXRhIGlzIHJlcXVpcmVkIGJlY2F1c2Ugd2UgYXJlIHNlbmRpbmcgZmlsZXMgdmlhIHRoZSB3aXJlLiBCdXQgaXQgaGFzIGxpbWl0YXRpb25zLlxuICogTmFtZWx5IGl0IGNhbiBvbmx5IHRyYW5zcG9ydCBmaWxlcyBhbmQgc3RyaW5ncy4gVGhhdCBpcyB3aHkgd2UgaGF2ZSB0byBjb252ZXJ0IHNvbWVcbiAqIHN0YW5kYXJkIHR5cGVzIGxpa2UgTlVMTCB0byBjb25zdGFudHMgc28gdGhleSBjYW4gYmUgcHJvcGVydHkgY29udmVydGVkIGJhY2sgYnkgdGhlIGJhY2tlbmQuXG4gKiBBbmQgdGh1cyBwcm9wZXJseSBoYW5kbGVkLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0gICB7UmVjb3JkSlNPTn0gIHJlY29yZFxuICogQHJldHVybiAge0Zvcm1EYXRhfVxuICovXG5mdW5jdGlvbiBwYXJhbXNUb0Zvcm1EYXRhKHBhcmFtczogUmVjb3JkPHN0cmluZywgYW55Pik6IEZvcm1EYXRhIHtcbiAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKVxuXG4gIC8vIEFzc3VtZSB0aGF0IHBhcmFtcyBhcmUgZmxhdHRlZFxuICBPYmplY3QuZW50cmllcyhwYXJhbXMpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgIC8vIHtAbGluayB1cGRhdGVSZWNvcmR9IGRvZXMgbm90IGNoYW5nZSBlbXB0eSBvYmplY3RzIFwie31cIiAtIHNvIGluIG9yZGVyIHRvIHByZXZlbnQgaGF2aW5nXG4gICAgLy8gdGhlbSBjaGFuZ2VkIHRvIFwiW29iamVjdCBPYmplY3RdXCIgd2UgaGF2ZSB0byBzZXQgdGhlbSB0byBlbXB0eSBzdHJpbmdzLlxuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGZvcm1EYXRhLnNldChrZXksIEZPUk1fVkFMVUVfTlVMTClcbiAgICB9XG4gICAgLy8gRmlsZSBvYmplY3RzIGhhcyB0byBnbyB0aHJvdWdoIGJlY2F1c2UgdGhleSBhcmUgaGFuZGxlZCBieSBGb3JtRGF0YVxuICAgIGlmIChpc09iamVjdE9yQXJyYXkodmFsdWUpKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIGZvcm1EYXRhLnNldChrZXksIEZPUk1fVkFMVUVfRU1QVFlfQVJSQVkpXG4gICAgICB9XG4gICAgICByZXR1cm4gZm9ybURhdGEuc2V0KGtleSwgRk9STV9WQUxVRV9FTVBUWV9PQkpFQ1QpXG4gICAgfVxuICAgIC8vIENvbnZlcnQgRGF0ZSBmaWVsZHMgdG8gVVRDIHRpbWV6b25lXG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgcmV0dXJuIGZvcm1EYXRhLnNldChrZXksIHZhbHVlLnRvSVNPU3RyaW5nKCkpXG4gICAgfVxuXG4gICAgLy8gUmVzdCBnb2VzIGFzIGEgc3RhbmRhcmQgdmFsdWVcbiAgICByZXR1cm4gZm9ybURhdGEuc2V0KGtleSwgdmFsdWUgYXMgc3RyaW5nKVxuICB9KVxuICByZXR1cm4gZm9ybURhdGFcbn1cblxuZXhwb3J0IHtcbiAgcGFyYW1zVG9Gb3JtRGF0YSBhcyBkZWZhdWx0LFxuICBwYXJhbXNUb0Zvcm1EYXRhLFxufVxuIiwiaW1wb3J0IHsgTm90aWNlTWVzc2FnZUluU3RhdGUgfSBmcm9tICcuLi9zdG9yZSdcbmltcG9ydCB7IE5vdGljZU1lc3NhZ2UgfSBmcm9tICcuLi8uLi9ob2Mvd2l0aC1ub3RpY2UnXG5cbmV4cG9ydCBjb25zdCBBRERfTk9USUNFID0gJ0FERF9OT1RJQ0UnXG5cbmV4cG9ydCB0eXBlIEFkZE5vdGljZVJlc3BvbnNlID0ge1xuICB0eXBlOiB0eXBlb2YgQUREX05PVElDRTtcbiAgZGF0YTogTm90aWNlTWVzc2FnZUluU3RhdGU7XG59XG5cbmV4cG9ydCBjb25zdCBhZGROb3RpY2UgPSAoZGF0YTogTm90aWNlTWVzc2FnZSA9IHsgbWVzc2FnZTogJycgfSk6IEFkZE5vdGljZVJlc3BvbnNlID0+ICh7XG4gIHR5cGU6IEFERF9OT1RJQ0UsXG4gIGRhdGE6IHtcbiAgICBtZXNzYWdlOiBkYXRhLm1lc3NhZ2UsXG4gICAgaWQ6IE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cigyLCA5KSxcbiAgICB0eXBlOiBkYXRhLnR5cGUgfHwgJ3N1Y2Nlc3MnLFxuICAgIHByb2dyZXNzOiAwLFxuICB9LFxufSlcbiIsImltcG9ydCB7IHVzZURpc3BhdGNoIH0gZnJvbSAncmVhY3QtcmVkdXgnXG5pbXBvcnQgeyBhZGROb3RpY2UgfSBmcm9tICcuLi9zdG9yZS9hY3Rpb25zL2FkZC1ub3RpY2UnXG5pbXBvcnQgeyBOb3RpY2VNZXNzYWdlIH0gZnJvbSAnLi4vaG9jL3dpdGgtbm90aWNlJ1xuXG4vKipcbiAqIEBtZW1iZXJvZiB1c2VOb3RpY2VcbiAqIEBhbGlhcyBBZGROb3RpY2VcbiAqL1xuZXhwb3J0IHR5cGUgQWRkTm90aWNlID0gKG5vdGljZTogTm90aWNlTWVzc2FnZSkgPT4gYW55O1xuXG4vKipcbiAqIEBjbGFzc2Rlc2NcbiAqIEhvb2sgd2hpY2ggYWxsb3dzIHlvdSB0byBhZGQgbm90aWNlIG1lc3NhZ2UgdG8gdGhlIGFwcC5cbiAqXG4gKiBgYGBqYXZhc2NyaXB0XG4gKiBpbXBvcnQgeyB1c2VOb3RpY2UsIEJ1dHRvbiB9IGZyb20gJ2FkbWluanMnXG4gKlxuICogY29uc3QgbXlDb21wb25lbnQgPSAoKSA9PiB7XG4gKiAgIGNvbnN0IHNlbmROb3RpY2UgPSB1c2VOb3RpY2UoKVxuICogICByZW5kZXIgKFxuICogICAgIDxCdXR0b24gb25DbGljaz17KCkgPT4gc2VuZE5vdGljZSh7IG1lc3NhZ2U6ICdJIGFtIGF3ZXNvbWUnIH0pfT5JIGFtIGF3ZXNvbWU8L0J1dHRvbj5cbiAqICAgKVxuICogfVxuICogYGBgXG4gKlxuICogQGNsYXNzXG4gKiBAc3ViY2F0ZWdvcnkgSG9va3NcbiAqIEBidW5kbGVcbiAqIEBoaWRlY29uc3RydWN0b3JcbiAqL1xuZXhwb3J0IGNvbnN0IHVzZU5vdGljZSA9ICgpOiBBZGROb3RpY2UgPT4ge1xuICBjb25zdCBkaXNwYXRjaCA9IHVzZURpc3BhdGNoKClcbiAgcmV0dXJuIChub3RpY2UpOiBhbnkgPT4gZGlzcGF0Y2goYWRkTm90aWNlKG5vdGljZSkpXG59XG5cbmV4cG9ydCBkZWZhdWx0IHVzZU5vdGljZVxuIiwiaW1wb3J0IHsgUmVjb3JkSlNPTiB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMnXG5pbXBvcnQgeyBSZWNvcmRBY3Rpb25SZXNwb25zZSB9IGZyb20gJy4uLy4uLy4uL2JhY2tlbmQvYWN0aW9ucy9hY3Rpb24uaW50ZXJmYWNlJ1xuXG4vKipcbiAqIEhhbmRsZXJzIG9mIGFsbCBbQWN0aW9uc117QGxpbmsgQWN0aW9ufSBvZiB0eXBlIGByZWNvcmRgIHJldHVybnMgcmVjb3JkLlxuICogRGVwZW5kaW5nIG9uIGEgcGxhY2UgYW5kIHJlc3BvbnNlIHdlIGhhdmUgdG8gbWVyZ2Ugd2hhdCB3YXMgcmV0dXJuZWRcbiAqIHRvIHRoZSBhY3R1YWwgc3RhdGUuIEl0IGlzIGRvbmUgaW4gZm9sbG93aW5nIHBsYWNlczpcbiAqIC0ge0BsaW5rIHVzZVJlY29yZH0gaG9va1xuICogLSB7QGxpbmsgUmVjb3JkSW5MaXN0fSBjb21wb25lbnRcbiAqIC0ge0BsaW5rIFJlY29yZEFjdGlvbn0gY29tcG9uZW50XG4gKlxuICogQHByaXZhdGVcbiAqL1xuY29uc3QgbWVyZ2VSZWNvcmRSZXNwb25zZSA9IChyZWNvcmQ6IFJlY29yZEpTT04sIHJlc3BvbnNlOiBSZWNvcmRBY3Rpb25SZXNwb25zZSk6IFJlY29yZEpTT04gPT4gKHtcbiAgLy8gd2Ugc3RhcnQgZnJvbSB0aGUgcmVzcG9uc2UgYmVjYXVzZSBpdCBjYW4gaGF2ZSBkaWZmZXJlbnQgcmVjb3JkQWN0aW9ucyBvciBidWxrQWN0aW9uc1xuICAuLi4ocmVzcG9uc2UucmVjb3JkIHx8IHJlY29yZCksXG4gIC8vIHJlY29yZHMgaGFzIHRvIGJlIHJlc2V0IGV2ZXJ5IHRpbWUgYmVjYXVzZSBzbyB0aGF0IHVzZXIgd29udFxuICAvLyBzZWUgb2xkIGVycm9ycyB3aGljaCBhcmUgbm90IHJlbGV2YW50IGFueW1vcmVcbiAgZXJyb3JzOiByZXNwb25zZS5yZWNvcmQuZXJyb3JzLFxuICBwb3B1bGF0ZWQ6IHsgLi4ucmVjb3JkLnBvcHVsYXRlZCwgLi4ucmVzcG9uc2UucmVjb3JkLnBvcHVsYXRlZCB9LFxuICBwYXJhbXM6IHsgLi4ucmVjb3JkLnBhcmFtcywgLi4ucmVzcG9uc2UucmVjb3JkLnBhcmFtcyB9LFxufSlcblxuZXhwb3J0IGRlZmF1bHQgbWVyZ2VSZWNvcmRSZXNwb25zZVxuIiwiLyohXG4gKiBEZXRlcm1pbmUgaWYgYW4gb2JqZWN0IGlzIGEgQnVmZmVyXG4gKlxuICogQGF1dGhvciAgIEZlcm9zcyBBYm91a2hhZGlqZWggPGh0dHBzOi8vZmVyb3NzLm9yZz5cbiAqIEBsaWNlbnNlICBNSVRcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzQnVmZmVyIChvYmopIHtcbiAgcmV0dXJuIG9iaiAhPSBudWxsICYmIG9iai5jb25zdHJ1Y3RvciAhPSBudWxsICYmXG4gICAgdHlwZW9mIG9iai5jb25zdHJ1Y3Rvci5pc0J1ZmZlciA9PT0gJ2Z1bmN0aW9uJyAmJiBvYmouY29uc3RydWN0b3IuaXNCdWZmZXIob2JqKVxufVxuIiwidmFyIGlzQnVmZmVyID0gcmVxdWlyZSgnaXMtYnVmZmVyJylcblxubW9kdWxlLmV4cG9ydHMgPSBmbGF0dGVuXG5mbGF0dGVuLmZsYXR0ZW4gPSBmbGF0dGVuXG5mbGF0dGVuLnVuZmxhdHRlbiA9IHVuZmxhdHRlblxuXG5mdW5jdGlvbiBmbGF0dGVuICh0YXJnZXQsIG9wdHMpIHtcbiAgb3B0cyA9IG9wdHMgfHwge31cblxuICB2YXIgZGVsaW1pdGVyID0gb3B0cy5kZWxpbWl0ZXIgfHwgJy4nXG4gIHZhciBtYXhEZXB0aCA9IG9wdHMubWF4RGVwdGhcbiAgdmFyIG91dHB1dCA9IHt9XG5cbiAgZnVuY3Rpb24gc3RlcCAob2JqZWN0LCBwcmV2LCBjdXJyZW50RGVwdGgpIHtcbiAgICBjdXJyZW50RGVwdGggPSBjdXJyZW50RGVwdGggfHwgMVxuICAgIE9iamVjdC5rZXlzKG9iamVjdCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICB2YXIgdmFsdWUgPSBvYmplY3Rba2V5XVxuICAgICAgdmFyIGlzYXJyYXkgPSBvcHRzLnNhZmUgJiYgQXJyYXkuaXNBcnJheSh2YWx1ZSlcbiAgICAgIHZhciB0eXBlID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKVxuICAgICAgdmFyIGlzYnVmZmVyID0gaXNCdWZmZXIodmFsdWUpXG4gICAgICB2YXIgaXNvYmplY3QgPSAoXG4gICAgICAgIHR5cGUgPT09ICdbb2JqZWN0IE9iamVjdF0nIHx8XG4gICAgICAgIHR5cGUgPT09ICdbb2JqZWN0IEFycmF5XSdcbiAgICAgIClcblxuICAgICAgdmFyIG5ld0tleSA9IHByZXZcbiAgICAgICAgPyBwcmV2ICsgZGVsaW1pdGVyICsga2V5XG4gICAgICAgIDoga2V5XG5cbiAgICAgIGlmICghaXNhcnJheSAmJiAhaXNidWZmZXIgJiYgaXNvYmplY3QgJiYgT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCAmJlxuICAgICAgICAoIW9wdHMubWF4RGVwdGggfHwgY3VycmVudERlcHRoIDwgbWF4RGVwdGgpKSB7XG4gICAgICAgIHJldHVybiBzdGVwKHZhbHVlLCBuZXdLZXksIGN1cnJlbnREZXB0aCArIDEpXG4gICAgICB9XG5cbiAgICAgIG91dHB1dFtuZXdLZXldID0gdmFsdWVcbiAgICB9KVxuICB9XG5cbiAgc3RlcCh0YXJnZXQpXG5cbiAgcmV0dXJuIG91dHB1dFxufVxuXG5mdW5jdGlvbiB1bmZsYXR0ZW4gKHRhcmdldCwgb3B0cykge1xuICBvcHRzID0gb3B0cyB8fCB7fVxuXG4gIHZhciBkZWxpbWl0ZXIgPSBvcHRzLmRlbGltaXRlciB8fCAnLidcbiAgdmFyIG92ZXJ3cml0ZSA9IG9wdHMub3ZlcndyaXRlIHx8IGZhbHNlXG4gIHZhciByZXN1bHQgPSB7fVxuXG4gIHZhciBpc2J1ZmZlciA9IGlzQnVmZmVyKHRhcmdldClcbiAgaWYgKGlzYnVmZmVyIHx8IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0YXJnZXQpICE9PSAnW29iamVjdCBPYmplY3RdJykge1xuICAgIHJldHVybiB0YXJnZXRcbiAgfVxuXG4gIC8vIHNhZmVseSBlbnN1cmUgdGhhdCB0aGUga2V5IGlzXG4gIC8vIGFuIGludGVnZXIuXG4gIGZ1bmN0aW9uIGdldGtleSAoa2V5KSB7XG4gICAgdmFyIHBhcnNlZEtleSA9IE51bWJlcihrZXkpXG5cbiAgICByZXR1cm4gKFxuICAgICAgaXNOYU4ocGFyc2VkS2V5KSB8fFxuICAgICAga2V5LmluZGV4T2YoJy4nKSAhPT0gLTEgfHxcbiAgICAgIG9wdHMub2JqZWN0XG4gICAgKSA/IGtleVxuICAgICAgOiBwYXJzZWRLZXlcbiAgfVxuXG4gIHZhciBzb3J0ZWRLZXlzID0gT2JqZWN0LmtleXModGFyZ2V0KS5zb3J0KGZ1bmN0aW9uIChrZXlBLCBrZXlCKSB7XG4gICAgcmV0dXJuIGtleUEubGVuZ3RoIC0ga2V5Qi5sZW5ndGhcbiAgfSlcblxuICBzb3J0ZWRLZXlzLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgIHZhciBzcGxpdCA9IGtleS5zcGxpdChkZWxpbWl0ZXIpXG4gICAgdmFyIGtleTEgPSBnZXRrZXkoc3BsaXQuc2hpZnQoKSlcbiAgICB2YXIga2V5MiA9IGdldGtleShzcGxpdFswXSlcbiAgICB2YXIgcmVjaXBpZW50ID0gcmVzdWx0XG5cbiAgICB3aGlsZSAoa2V5MiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoa2V5MSA9PT0gJ19fcHJvdG9fXycpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICB2YXIgdHlwZSA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChyZWNpcGllbnRba2V5MV0pXG4gICAgICB2YXIgaXNvYmplY3QgPSAoXG4gICAgICAgIHR5cGUgPT09ICdbb2JqZWN0IE9iamVjdF0nIHx8XG4gICAgICAgIHR5cGUgPT09ICdbb2JqZWN0IEFycmF5XSdcbiAgICAgIClcblxuICAgICAgLy8gZG8gbm90IHdyaXRlIG92ZXIgZmFsc2V5LCBub24tdW5kZWZpbmVkIHZhbHVlcyBpZiBvdmVyd3JpdGUgaXMgZmFsc2VcbiAgICAgIGlmICghb3ZlcndyaXRlICYmICFpc29iamVjdCAmJiB0eXBlb2YgcmVjaXBpZW50W2tleTFdICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgaWYgKChvdmVyd3JpdGUgJiYgIWlzb2JqZWN0KSB8fCAoIW92ZXJ3cml0ZSAmJiByZWNpcGllbnRba2V5MV0gPT0gbnVsbCkpIHtcbiAgICAgICAgcmVjaXBpZW50W2tleTFdID0gKFxuICAgICAgICAgIHR5cGVvZiBrZXkyID09PSAnbnVtYmVyJyAmJlxuICAgICAgICAgICFvcHRzLm9iamVjdCA/IFtdIDoge31cbiAgICAgICAgKVxuICAgICAgfVxuXG4gICAgICByZWNpcGllbnQgPSByZWNpcGllbnRba2V5MV1cbiAgICAgIGlmIChzcGxpdC5sZW5ndGggPiAwKSB7XG4gICAgICAgIGtleTEgPSBnZXRrZXkoc3BsaXQuc2hpZnQoKSlcbiAgICAgICAga2V5MiA9IGdldGtleShzcGxpdFswXSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyB1bmZsYXR0ZW4gYWdhaW4gZm9yICdtZXNzeSBvYmplY3RzJ1xuICAgIHJlY2lwaWVudFtrZXkxXSA9IHVuZmxhdHRlbih0YXJnZXRba2V5XSwgb3B0cylcbiAgfSlcblxuICByZXR1cm4gcmVzdWx0XG59XG4iLCJjb25zdCBERUxJTUlURVIgPSAnLidcblxuZXhwb3J0IHsgREVMSU1JVEVSIH1cbiIsImltcG9ydCB7IERFTElNSVRFUiB9IGZyb20gJy4vY29uc3RhbnRzJ1xuaW1wb3J0IHsgR2V0T3B0aW9ucyB9IGZyb20gJy4vZmxhdC50eXBlcydcbi8vIHRoaXMgaXMgdGhlIHJlZ2V4IHVzZWQgdG8gZmluZCBhbGwgZXhpc3RpbmcgcHJvcGVydGllcyBzdGFydGluZyB3aXRoIGEga2V5XG5cbmV4cG9ydCBjb25zdCBwcm9wZXJ0eUtleVJlZ2V4ID0gKHByb3BlcnR5UGF0aDogc3RyaW5nLCBvcHRpb25zPzogR2V0T3B0aW9ucyk6IFJlZ0V4cCA9PiB7XG4gIGNvbnN0IGRlbGltaXRlciA9IG5ldyBSZWdFeHAoYFxcXFwke0RFTElNSVRFUn1gLCAnZycpXG4gIGNvbnN0IGVzY2FwZWREZWxpbWl0ZXIgPSBgXFxcXCR7REVMSU1JVEVSfWBcbiAgLy8gYnV0IGZvciBgbmVzdGVkLjEucHJvcGVydHkuMGAgaXQgd2lsbCBwcm9kdWNlIGBuZXN0ZWQoXFwufFxcLlxcZCtcXC4pMShcXC58XFwuXFxkK1xcLilwcm9wZXJ0eS4wYFxuICAvLyBhbmQgdGhpcyBpcyBpbnRlbnRpb25hbCBiZWNhdXNlIHVzZXIgY2FuIGdpdmUgYW4gb25lIGluZGV4IGluIHByb3BlcnR5IHBhdGggZm9yIHdpdGggZGVlcGx5XG4gIC8vIG5lc3RlZCBhcnJheXNcbiAgY29uc3QgZXNjYXBlZERlbGltaXRlck9ySW5kZXggPSBgKCR7ZXNjYXBlZERlbGltaXRlcn18JHtlc2NhcGVkRGVsaW1pdGVyfVxcXFxkKyR7ZXNjYXBlZERlbGltaXRlcn0pYFxuICBjb25zdCBwYXRoID0gb3B0aW9ucz8uaW5jbHVkZUFsbFNpYmxpbmdzXG4gICAgPyBwcm9wZXJ0eVBhdGgucmVwbGFjZShkZWxpbWl0ZXIsIGVzY2FwZWREZWxpbWl0ZXJPckluZGV4KVxuICAgIDogcHJvcGVydHlQYXRoLnJlcGxhY2UoZGVsaW1pdGVyLCBlc2NhcGVkRGVsaW1pdGVyKVxuICByZXR1cm4gbmV3IFJlZ0V4cChgXiR7cGF0aH0oJHwke2VzY2FwZWREZWxpbWl0ZXJ9KWAsICcnKVxufVxuIiwiaW1wb3J0IHsgcHJvcGVydHlLZXlSZWdleCB9IGZyb20gJy4vcHJvcGVydHkta2V5LXJlZ2V4J1xuaW1wb3J0IHsgRmxhdHRlblBhcmFtcywgR2V0T3B0aW9ucyB9IGZyb20gJy4vZmxhdC50eXBlcydcblxuLyoqXG4gKiBAbG9hZCAuL3NlbGVjdC1wYXJhbXMuZG9jLm1kXG4gKiBAbWVtYmVyb2YgbW9kdWxlOmZsYXRcbiAqIEBwYXJhbSB7RmxhdHRlblBhcmFtc30gcGFyYW1zXG4gKiBAcGFyYW0ge3N0cmluZyB8IEFycmF5PHN0cmluZz59IHByb3BlcnRpZXNcbiAqIEBwYXJhbSB7R2V0T3B0aW9uc30gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7RmxhdHRlblBhcmFtc31cbiAqL1xuY29uc3Qgc2VsZWN0UGFyYW1zID0gKFxuICBwYXJhbXM6IEZsYXR0ZW5QYXJhbXMsXG4gIHByb3BlcnRpZXM6IHN0cmluZyB8IEFycmF5PHN0cmluZz4sXG4gIG9wdGlvbnM/OiBHZXRPcHRpb25zLFxuKTogRmxhdHRlblBhcmFtcyA9PiB7XG4gIGNvbnN0IHByb3BlcnR5QXJyYXkgPSBBcnJheS5pc0FycmF5KHByb3BlcnRpZXMpID8gcHJvcGVydGllcyA6IFtwcm9wZXJ0aWVzXVxuICBjb25zdCBzZWxlY3RlZCA9IHByb3BlcnR5QXJyYXlcbiAgICAuZmlsdGVyKChwcm9wZXJ0eVBhdGgpID0+ICEhcHJvcGVydHlQYXRoKVxuICAgIC5yZWR1Y2UoKGdsb2JhbE1lbW8sIHByb3BlcnR5UGF0aCkgPT4ge1xuICAgICAgY29uc3QgcmVnZXggPSBwcm9wZXJ0eUtleVJlZ2V4KHByb3BlcnR5UGF0aCwgb3B0aW9ucylcbiAgICAgIGNvbnN0IGZpbHRlcmVkID0gT2JqZWN0LmtleXMocGFyYW1zKVxuICAgICAgLy8gZmlsdGVyIGFsbCBrZXlzIHdoaWNoIHN0YXJ0cyB3aXRoIHByb3BlcnR5IHBhdGhcbiAgICAgICAgLmZpbHRlcigoa2V5KSA9PiBrZXkubWF0Y2gocmVnZXgpKVxuICAgICAgICAucmVkdWNlKChtZW1vLCBrZXkpID0+IHtcbiAgICAgICAgICBtZW1vW2tleV0gPSAocGFyYW1zW2tleV0gYXMgc3RyaW5nKVxuICAgICAgICAgIHJldHVybiBtZW1vXG4gICAgICAgIH0sIHt9IGFzIEZsYXR0ZW5QYXJhbXMpXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5nbG9iYWxNZW1vLFxuICAgICAgICAuLi5maWx0ZXJlZCxcbiAgICAgIH1cbiAgICB9LCB7fSBhcyBGbGF0dGVuUGFyYW1zKVxuICByZXR1cm4gc2VsZWN0ZWRcbn1cblxuZXhwb3J0IHsgc2VsZWN0UGFyYW1zIH1cbiIsImltcG9ydCB7IHByb3BlcnR5S2V5UmVnZXggfSBmcm9tICcuL3Byb3BlcnR5LWtleS1yZWdleCdcbmltcG9ydCB7IEZsYXR0ZW5QYXJhbXMgfSBmcm9tICcuL2ZsYXQudHlwZXMnXG5cbi8qKlxuICogQGxvYWQgLi9maWx0ZXItb3V0LXBhcmFtcy5kb2MubWRcbiAqIEBtZW1iZXJvZiBtb2R1bGU6ZmxhdFxuICogQHBhcmFtIHtGbGF0dGVuUGFyYW1zfSBwYXJhbXNcbiAqIEBwYXJhbSB7c3RyaW5nIHwgQXJyYXk8c3RyaW5nPn0gcHJvcGVydGllc1xuICogQHJldHVybnMge0ZsYXR0ZW5QYXJhbXN9XG4gKi9cbmNvbnN0IGZpbHRlck91dFBhcmFtcyA9IChcbiAgcGFyYW1zOiBGbGF0dGVuUGFyYW1zLFxuICBwcm9wZXJ0aWVzOiBzdHJpbmcgfCBBcnJheTxzdHJpbmc+LFxuKTogRmxhdHRlblBhcmFtcyA9PiB7XG4gIGNvbnN0IHByb3BlcnR5QXJyYXkgPSBBcnJheS5pc0FycmF5KHByb3BlcnRpZXMpID8gcHJvcGVydGllcyA6IFtwcm9wZXJ0aWVzXVxuXG4gIHJldHVybiBwcm9wZXJ0eUFycmF5XG4gICAgLmZpbHRlcigocHJvcGVydHlQYXRoKSA9PiAhIXByb3BlcnR5UGF0aClcbiAgICAucmVkdWNlKChnbG9iYWxGaWx0ZXJlZCwgcHJvcGVydHlQYXRoKSA9PiB7XG4gICAgICBjb25zdCByZWdleCA9IHByb3BlcnR5S2V5UmVnZXgocHJvcGVydHlQYXRoKVxuXG4gICAgICByZXR1cm4gT2JqZWN0LmtleXMoZ2xvYmFsRmlsdGVyZWQpXG4gICAgICAgIC5maWx0ZXIoKGtleSkgPT4gIWtleS5tYXRjaChyZWdleCkpXG4gICAgICAgIC5yZWR1Y2UoKG1lbW8sIGtleSkgPT4ge1xuICAgICAgICAgIG1lbW9ba2V5XSA9IChwYXJhbXNba2V5XSBhcyBzdHJpbmcpXG4gICAgICAgICAgcmV0dXJuIG1lbW9cbiAgICAgICAgfSwge30gYXMgRmxhdHRlblBhcmFtcylcbiAgICB9LCBwYXJhbXMpXG59XG5cbmV4cG9ydCB7IGZpbHRlck91dFBhcmFtcyB9XG4iLCJpbXBvcnQgeyBQYXRoUGFydHMgfSBmcm9tICcuL3BhdGgtcGFydHMudHlwZSdcblxuLyoqXG4gKiBAbWVtYmVyb2YgbW9kdWxlOmZsYXRcbiAqIEBhbGlhcyBQYXRoVG9QYXJ0c09wdGlvbnNcbiAqL1xuZXhwb3J0IHR5cGUgUGF0aFRvUGFydHNPcHRpb25zID0ge1xuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIGFycmF5IGluZGV4ZXMgc2hvdWxkIGJlIHNraXBwZWQgZnJvbSB0aGUgb3V0Y29tZS5cbiAgICovXG4gIHNraXBBcnJheUluZGV4ZXM/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEBsb2FkIC4vcGF0aC10by1wYXJ0cy5kb2MubWRcbiAqIEBwYXJhbSAgIHtzdHJpbmd9ICAgICAgICAgICAgICBwcm9wZXJ0eVBhdGhcbiAqIEBwYXJhbSAgIHtQYXRoVG9QYXJ0c09wdGlvbnN9ICBvcHRpb25zXG4gKiBAcmV0dXJucyAge1BhdGhQYXJ0c31cbiAqXG4gKiBAbWVtYmVyb2YgbW9kdWxlOmZsYXRcbiAqIEBhbGlhcyBwYXRoVG9QYXJ0c1xuICovXG5jb25zdCBwYXRoVG9QYXJ0cyA9IChwcm9wZXJ0eVBhdGg6IHN0cmluZywgb3B0aW9uczogUGF0aFRvUGFydHNPcHRpb25zID0ge30pOiBQYXRoUGFydHMgPT4ge1xuICBsZXQgYWxsUGFydHMgPSBwcm9wZXJ0eVBhdGguc3BsaXQoJy4nKVxuICBpZiAob3B0aW9ucy5za2lwQXJyYXlJbmRleGVzKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtZ2xvYmFsc1xuICAgIGFsbFBhcnRzID0gYWxsUGFydHMuZmlsdGVyKChwYXJ0KSA9PiBpc05hTigrcGFydCkpXG4gIH1cbiAgcmV0dXJuIGFsbFBhcnRzLnJlZHVjZSgobWVtbywgcGFydCkgPT4ge1xuICAgIGlmIChtZW1vLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgLi4ubWVtbyxcbiAgICAgICAgW21lbW9bbWVtby5sZW5ndGggLSAxXSwgcGFydF0uam9pbignLicpLFxuICAgICAgXVxuICAgIH1cbiAgICByZXR1cm4gW3BhcnRdXG4gIH0sIFtdIGFzIEFycmF5PHN0cmluZz4pXG59XG5cbmV4cG9ydCB7IHBhdGhUb1BhcnRzIH1cbiIsImltcG9ydCB7IGZsYXR0ZW4gfSBmcm9tICdmbGF0J1xuaW1wb3J0IHsgREVMSU1JVEVSIH0gZnJvbSAnLi9jb25zdGFudHMnXG5pbXBvcnQgeyBGbGF0dGVuUGFyYW1zIH0gZnJvbSAnLi4vZmxhdCdcbmltcG9ydCB7IHByb3BlcnR5S2V5UmVnZXggfSBmcm9tICcuL3Byb3BlcnR5LWtleS1yZWdleCdcbmltcG9ydCB7IHBhdGhUb1BhcnRzIH0gZnJvbSAnLi9wYXRoLXRvLXBhcnRzJ1xuXG5jb25zdCBpc09iamVjdCA9ICh2YWx1ZTogYW55KTogYm9vbGVhbiA9PiB7XG4gIC8vIE5vZGUgZW52aXJvbm1lbnRcbiAgaWYgKHR5cGVvZiBGaWxlID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsXG4gIH1cbiAgLy8gV2luZG93IGVudmlyb25tZW50XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmICEodmFsdWUgaW5zdGFuY2VvZiBGaWxlKSAmJiB2YWx1ZSAhPT0gbnVsbFxufVxuXG4vKipcbiAqIEBsb2FkIC4vc2V0LmRvYy5tZFxuICogQG1lbWJlcm9mIG1vZHVsZTpmbGF0XG4gKiBAcGFyYW0ge0ZsYXR0ZW5QYXJhbXN9IHBhcmFtc1xuICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5UGF0aFxuICogQHBhcmFtIHthbnl9IFt2YWx1ZV0gICAgICAgaWYgbm90IGdpdmUgZnVuY3Rpb24gd2lsbCBvbmx5IHRyeSB0byByZW1vdmUgb2xkIGtleXNcbiAqIEByZXR1cm5zIHtGbGF0dGVuUGFyYW1zfVxuICovXG5jb25zdCBzZXQgPSAocGFyYW1zOiBGbGF0dGVuUGFyYW1zID0ge30sIHByb3BlcnR5UGF0aDogc3RyaW5nLCB2YWx1ZT86IGFueSk6IEZsYXR0ZW5QYXJhbXMgPT4ge1xuICBjb25zdCByZWdleCA9IHByb3BlcnR5S2V5UmVnZXgocHJvcGVydHlQYXRoKVxuXG4gIC8vIHJlbW92ZSBhbGwgZXhpc3Rpbmcga2V5c1xuICBjb25zdCBwYXJhbXNDb3B5ID0gT2JqZWN0LmtleXMocGFyYW1zKVxuICAgIC5maWx0ZXIoKGtleSkgPT4gIWtleS5tYXRjaChyZWdleCkpXG4gICAgLnJlZHVjZSgobWVtbywga2V5KSA9PiB7XG4gICAgICBtZW1vW2tleV0gPSBwYXJhbXNba2V5XVxuXG4gICAgICByZXR1cm4gbWVtb1xuICAgIH0sIHt9IGFzIEZsYXR0ZW5QYXJhbXMpXG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBpZiAoaXNPYmplY3QodmFsdWUpICYmICEodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSkge1xuICAgICAgY29uc3QgZmxhdHRlbmVkID0gZmxhdHRlbih2YWx1ZSkgYXMgYW55XG5cbiAgICAgIGlmIChPYmplY3Qua2V5cyhmbGF0dGVuZWQpLmxlbmd0aCkge1xuICAgICAgICBPYmplY3Qua2V5cyhmbGF0dGVuZWQpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgIHBhcmFtc0NvcHlbYCR7cHJvcGVydHlQYXRofSR7REVMSU1JVEVSfSR7a2V5fWBdID0gZmxhdHRlbmVkW2tleV1cbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgcGFyYW1zQ29weVtwcm9wZXJ0eVBhdGhdID0gW11cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhcmFtc0NvcHlbcHJvcGVydHlQYXRoXSA9IHt9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhcmFtc0NvcHlbcHJvcGVydHlQYXRoXSA9IHZhbHVlXG4gICAgfVxuXG4gICAgLy8gd2hlbiB1c2VyIGdhdmUgeyBcIm5lc3RlZC52YWx1ZVwiOiBcInNvbWV0aGluZ1wiIH0gYW5kIGhhZCBcIm5lc3RlZFwiIHNldCB0byBgbnVsbGAsIHRoZW5cbiAgICAvLyBuZXN0ZWQgc2hvdWxkIGJlIHJlbW92ZWRcbiAgICBjb25zdCBwYXJ0cyA9IHBhdGhUb1BhcnRzKHByb3BlcnR5UGF0aCkuc2xpY2UoMCwgLTEpXG4gICAgaWYgKHBhcnRzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHBhcmFtc0NvcHkpXG4gICAgICAgIC5maWx0ZXIoKGtleSkgPT4gIXBhcnRzLmluY2x1ZGVzKGtleSkpXG4gICAgICAgIC5yZWR1Y2UoKG1lbW8sIGtleSkgPT4ge1xuICAgICAgICAgIG1lbW9ba2V5XSA9IHBhcmFtc0NvcHlba2V5XVxuXG4gICAgICAgICAgcmV0dXJuIG1lbW9cbiAgICAgICAgfSwge30gYXMgRmxhdHRlblBhcmFtcylcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHBhcmFtc0NvcHlcbn1cblxuZXhwb3J0IHsgc2V0IH1cbiIsImltcG9ydCB7IHVuZmxhdHRlbiB9IGZyb20gJ2ZsYXQnXG5pbXBvcnQgeyBERUxJTUlURVIgfSBmcm9tICcuL2NvbnN0YW50cydcbmltcG9ydCB7IHNlbGVjdFBhcmFtcyB9IGZyb20gJy4vc2VsZWN0LXBhcmFtcydcbmltcG9ydCB7IEZsYXR0ZW5QYXJhbXMgfSBmcm9tICcuLi9mbGF0J1xuaW1wb3J0IHsgcHJvcGVydHlLZXlSZWdleCB9IGZyb20gJy4vcHJvcGVydHkta2V5LXJlZ2V4J1xuaW1wb3J0IHsgR2V0T3B0aW9ucyB9IGZyb20gJy4vZmxhdC50eXBlcydcblxuY29uc3QgVEVNUF9IT0xESU5HX0tFWSA9ICdURU1QX0hPTERJTkdfS0VZJ1xuXG4vKipcbiAqIEBsb2FkIC4vZ2V0LmRvYy5tZFxuICogQG1lbWJlcm9mIG1vZHVsZTpmbGF0XG4gKiBAcGFyYW0ge0ZsYXR0ZW5QYXJhbXN9ICAgcGFyYW1zICAgICAgZmxhdHRlbiBwYXJhbXMgZnJvbSB3aGljaCBwcm9wZXJ0eSBoYXMgdG8gYmUgdGFrZW5cbiAqIEBwYXJhbSB7c3RyaW5nfSAgICAgICAgICBbcHJvcGVydHlQYXRoXSAgbmFtZSBvZiB0aGUgcHJvcGVydHlcbiAqIEBwYXJhbSB7R2V0T3B0aW9uc30gICAgICBvcHRpb25zICAgICBvcHRpb25zXG4gKiBAcmV0dXJucyB7YW55fSAgICAgICAgICAgICAgICAgICAgICAgd2hlbiBwcm9wZXJ0eSBrZXkgZXhpc3RzIGRpcmVjdGx5IGl0IHJldHVybnMgd2hhdCBpcyBpbnNpZGUsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJ3aXNlIGl0IHRyaWVzIHRvIGZpbmQgYW55IG5lc3RlZCBvYmplY3RzIGFuZCByZXR1cm5zXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbVxuICovXG5jb25zdCBnZXQgPSAocGFyYW1zOiBGbGF0dGVuUGFyYW1zID0ge30sIHByb3BlcnR5UGF0aD86IHN0cmluZywgb3B0aW9ucz86IEdldE9wdGlvbnMpOiBhbnkgPT4ge1xuICBpZiAoIXByb3BlcnR5UGF0aCkge1xuICAgIHJldHVybiB1bmZsYXR0ZW4ocGFyYW1zKVxuICB9XG5cbiAgLy8gd2hlbiBvYmplY3QgaGFzIHRoaXMga2V5IC0gc2ltcGx5IHJldHVybiBpdFxuICAvLyB3ZSBjYW5ub3QgcmVseSBvbiB0eXBlb2YgcGFyYW1zW3Byb3BlcnR5UGF0aCAhPT0gJ3VuZGVmaW5lZCcgYmVjYXVzZSBwYXJhbXMgY2FuIGFjdHVhbGx5IGJlXG4gIC8vIHVuZGVmaW5lZCBhbmQgaW4gc3VjaCBjYXNlIGlmIHdvdWxkIHBhc3MgYW5kIGZ1bmN0aW9uIHdvdWxkIHJldHVybiBbdW5kZWZpbmVkXVxuICBpZiAoT2JqZWN0LmtleXMocGFyYW1zKS5maW5kKChrZXkpID0+IChrZXkgPT09IHByb3BlcnR5UGF0aCkpKSB7XG4gICAgcmV0dXJuIHBhcmFtc1twcm9wZXJ0eVBhdGhdXG4gIH1cblxuICBjb25zdCByZWdleCA9IHByb3BlcnR5S2V5UmVnZXgocHJvcGVydHlQYXRoLCBvcHRpb25zKVxuICBjb25zdCBzZWxlY3RlZFBhcmFtcyA9IHNlbGVjdFBhcmFtcyhwYXJhbXMsIHByb3BlcnR5UGF0aCwgb3B0aW9ucylcblxuICBjb25zdCBuZXN0ZWRQcm9wZXJ0aWVzID0gT2JqZWN0LmtleXMoc2VsZWN0ZWRQYXJhbXMpLnJlZHVjZSgobWVtbywga2V5LCBpbmRleCkgPT4ge1xuICAgIGxldCBuZXdLZXkgPSBrZXkucmVwbGFjZShyZWdleCwgYCR7VEVNUF9IT0xESU5HX0tFWX0ke0RFTElNSVRFUn1gKVxuXG4gICAgLy8gd2hlbiB1c2VyIHdhbnRzIHRvIHRha2UgYWxsU2libGluZ3Mgd2UgaGF2ZSB0byBmaXggdGhlIGluZGV4ZXMgc28gbmVzdGVkIGl0ZW1zIGZyb21cbiAgICAvLyBkaWZmZXJlbnQgc2libGluZ3MgZG9uJ3Qgb3ZlcmxhcFxuICAgIC8vXG4gICAgLy8gRXhhbXBsZSBmb3Iga2V5IGBuZXN0ZWQuMS5lbGA6XG4gICAgLy8gICduZXN0ZWQuMC5lbC4wLnZhbHVlJzogJ3ZhbDAuMCcsXG4gICAgLy8gICduZXN0ZWQuMC5lbC4xLnZhbHVlJzogJ3ZhbDAuMScsXG4gICAgLy8gICduZXN0ZWQuMS5lbC4wLnZhbHVlJzogJ3ZhbDEnLFxuICAgIC8vICAnbmVzdGVkLjEuZWwuMS52YWx1ZSc6ICd2YWwyJyxcbiAgICAvL1xuICAgIC8vIGhhcyB0byBiZSBjaGFuZ2VkIHRvOlxuICAgIC8vICAnVEVNUF9IT0xESU5HX0tFWS4wLnZhbHVlJzogJ3ZhbDAuMCcsXG4gICAgLy8gICdURU1QX0hPTERJTkdfS0VZLjEudmFsdWUnOiAndmFsMC4xJyxcbiAgICAvLyAgJ1RFTVBfSE9MRElOR19LRVkuMi52YWx1ZSc6ICd2YWwxJyxcbiAgICAvLyAgJ1RFTVBfSE9MRElOR19LRVkuMy52YWx1ZSc6ICd2YWwyJyxcbiAgICBpZiAob3B0aW9ucz8uaW5jbHVkZUFsbFNpYmxpbmdzKSB7XG4gICAgICBuZXdLZXkgPSBuZXdLZXkucmVwbGFjZShcbiAgICAgICAgbmV3IFJlZ0V4cChgJHtURU1QX0hPTERJTkdfS0VZfVxcXFwke0RFTElNSVRFUn0oXFxcXGQqKWApLFxuICAgICAgICBgJHtURU1QX0hPTERJTkdfS0VZfSR7REVMSU1JVEVSfSR7aW5kZXh9YCxcbiAgICAgIClcbiAgICB9XG5cbiAgICBtZW1vW25ld0tleV0gPSBzZWxlY3RlZFBhcmFtc1trZXldXG5cbiAgICByZXR1cm4gbWVtb1xuICB9LCB7fSBhcyBGbGF0dGVuUGFyYW1zKVxuXG4gIGlmIChPYmplY3Qua2V5cyhuZXN0ZWRQcm9wZXJ0aWVzKS5sZW5ndGgpIHtcbiAgICByZXR1cm4gKHVuZmxhdHRlbihuZXN0ZWRQcm9wZXJ0aWVzKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbVEVNUF9IT0xESU5HX0tFWV1cbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkXG59XG5cbmV4cG9ydCB7IGdldCB9XG4iLCJpbXBvcnQgeyBmbGF0dGVuIH0gZnJvbSAnZmxhdCdcbmltcG9ydCB7IEZsYXR0ZW5QYXJhbXMgfSBmcm9tICcuL2ZsYXQudHlwZXMnXG5pbXBvcnQgeyBzZXQgfSBmcm9tICcuL3NldCdcblxuLyoqXG4gKiBNZXJnZXMgcGFyYW1zIHRvZ2V0aGVyIGFuZCByZXR1cm5zIGZsYXR0ZW4gcmVzdWx0XG4gKlxuICogQHBhcmFtIHthbnl9IHBhcmFtc1xuICogQHBhcmFtIHtBcnJheTxhbnk+fSAuLi5tZXJnZVBhcmFtc1xuICogQHJldHVybnMge0ZsYXR0ZW5QYXJhbXN9XG4gKiBAbWVtYmVyb2YgbW9kdWxlOmZsYXRcbiAqL1xuY29uc3QgbWVyZ2UgPSAocGFyYW1zOiBhbnkgPSB7fSwgLi4ubWVyZ2VQYXJhbXM6IEFycmF5PGFueT4pOiBGbGF0dGVuUGFyYW1zID0+IHtcbiAgY29uc3QgZmxhdHRlblBhcmFtcyA9IGZsYXR0ZW4ocGFyYW1zKVxuXG4gIC8vIHJldmVyc2UgYmVjYXVzZSB3ZSBtZXJnZSBmcm9tIHJpZ2h0XG4gIHJldHVybiBtZXJnZVBhcmFtcy5yZXZlcnNlKCkucmVkdWNlKChnbG9iYWxNZW1vLCBtZXJnZVBhcmFtKSA9PiAoXG4gICAgT2JqZWN0LmtleXMobWVyZ2VQYXJhbSlcbiAgICAgIC5yZWR1Y2UoKG1lbW8sIGtleSkgPT4gKHNldChtZW1vLCBrZXksIG1lcmdlUGFyYW1ba2V5XSkpLCBnbG9iYWxNZW1vKVxuICApLCBmbGF0dGVuUGFyYW1zIGFzIFJlY29yZDxzdHJpbmcsIGFueT4pXG59XG5cbmV4cG9ydCB7IG1lcmdlIH1cbiIsImltcG9ydCB7IGZpbHRlck91dFBhcmFtcyB9IGZyb20gJy4vZmlsdGVyLW91dC1wYXJhbXMnXG5pbXBvcnQgeyBGbGF0dGVuUGFyYW1zIH0gZnJvbSAnLi9mbGF0LnR5cGVzJ1xuaW1wb3J0IHsgZ2V0IH0gZnJvbSAnLi9nZXQnXG5pbXBvcnQgeyBzZXQgfSBmcm9tICcuL3NldCdcbmltcG9ydCB7IHBhdGhUb1BhcnRzIH0gZnJvbSAnLi9wYXRoLXRvLXBhcnRzJ1xuaW1wb3J0IHsgREVMSU1JVEVSIH0gZnJvbSAnLi9jb25zdGFudHMnXG5cbi8qKlxuICogQGxvYWQgLi9yZW1vdmUtcGF0aC5kb2MubWRcbiAqIEBtZW1iZXJvZiBtb2R1bGU6ZmxhdFxuICogQHBhcmFtIHtGbGF0dGVuUGFyYW1zfSBwYXJhbXNcbiAqIEBwYXJhbSB7Li4uc3RyaW5nfSBwcm9wZXJ0aWVzXG4gKiBAcmV0dXJucyB7RmxhdHRlblBhcmFtc31cbiAqL1xuY29uc3QgcmVtb3ZlUGF0aCA9IChwYXJhbXM6IEZsYXR0ZW5QYXJhbXMsIHBhdGg6IHN0cmluZyk6IEZsYXR0ZW5QYXJhbXMgPT4ge1xuICAvLyBieSBkZWZhdWx0IHNpbXBseSBmaWx0ZXIgb3V0IGVsZW1lbnRzIGZyb20gdGhlIG9iamVjdFxuICBsZXQgZmlsdGVyZWQgPSBmaWx0ZXJPdXRQYXJhbXMocGFyYW1zLCBwYXRoKVxuXG4gIC8vIHJldmVyc2UgbWVhbnMgdGhhdCB3ZSBpdGVyYXRlIGZyb20gdGhlIGNsb3NlcyBwYXJlbnRcbiAgY29uc3QgcGFyZW50UGF0aHMgPSBwYXRoVG9QYXJ0cyhwYXRoKS5yZXZlcnNlKClcblxuICAvLyBidXQgaWYgb25lIG9mIHRoZSBwYXJlbnQgaXMgYW4gYXJyYXlcbiAgcGFyZW50UGF0aHMuZmluZCgocGFyZW50UGF0aCwgcGFyZW50SW5kZXgpID0+IHtcbiAgICBjb25zdCBwYXJlbnQgPSBnZXQocGFyYW1zLCBwYXJlbnRQYXRoKVxuICAgIGlmIChBcnJheS5pc0FycmF5KHBhcmVudCkpIHtcbiAgICAgIC8vIHByZXZpb3VzIGVsZW1lbnQgaXMgc3RyaW5naWZpZWQgaW5kZXggbGlrZSAncHJvcGVydHkuMSdcbiAgICAgIGNvbnN0IHByZXZpb3VzUGF0aHMgPSBwYXJlbnRQYXRoc1twYXJlbnRJbmRleCAtIDFdLnNwbGl0KERFTElNSVRFUilcbiAgICAgIC8vIHNvIHRoaXMgaXMgdGhlIGluZGV4OiAxXG4gICAgICBjb25zdCBwcmV2aW91c1BhdGhJbmRleCA9IHByZXZpb3VzUGF0aHNbcHJldmlvdXNQYXRocy5sZW5ndGggLSAxXVxuICAgICAgcGFyZW50LnNwbGljZSgrcHJldmlvdXNQYXRoSW5kZXgsIDEpXG4gICAgICBmaWx0ZXJlZCA9IHNldChwYXJhbXMsIHBhcmVudFBhdGgsIHBhcmVudClcbiAgICAgIC8vIHRoaXMgd29ya3MganVzdCBmb3IgdGhlIGZpcnN0bHkgZm91bmQgYXJyYXkgaXRlbSwgYmVjYXVzZSBpbiBjYXNlIG9mIHJlbW92aW5nIHRoZSBsYXN0IG9uZVxuICAgICAgLy8gaXQgbGVhdmVzIGBbXWAgYXMgYSB2YWx1ZS5cbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9KVxuXG4gIHJldHVybiBmaWx0ZXJlZFxufVxuXG5leHBvcnQgeyByZW1vdmVQYXRoIH1cbiIsImltcG9ydCB7IGZsYXR0ZW4sIHVuZmxhdHRlbiB9IGZyb20gJ2ZsYXQnXG5cbmltcG9ydCB7IERFTElNSVRFUiB9IGZyb20gJy4vY29uc3RhbnRzJ1xuaW1wb3J0IHsgc2VsZWN0UGFyYW1zIH0gZnJvbSAnLi9zZWxlY3QtcGFyYW1zJ1xuaW1wb3J0IHsgZmlsdGVyT3V0UGFyYW1zIH0gZnJvbSAnLi9maWx0ZXItb3V0LXBhcmFtcydcbmltcG9ydCB7IHNldCB9IGZyb20gJy4vc2V0J1xuaW1wb3J0IHsgZ2V0IH0gZnJvbSAnLi9nZXQnXG5pbXBvcnQgeyBtZXJnZSB9IGZyb20gJy4vbWVyZ2UnXG5pbXBvcnQgeyBwYXRoVG9QYXJ0cyB9IGZyb20gJy4vcGF0aC10by1wYXJ0cydcbmltcG9ydCB7IHJlbW92ZVBhdGggfSBmcm9tICcuL3JlbW92ZS1wYXRoJ1xuXG5leHBvcnQgdHlwZSBGbGF0TW9kdWxlVHlwZSA9IHtcbiAgZmxhdHRlbjogdHlwZW9mIGZsYXR0ZW47XG4gIHVuZmxhdHRlbjogdHlwZW9mIHVuZmxhdHRlbjtcbiAgc2V0OiB0eXBlb2Ygc2V0O1xuICBnZXQ6IHR5cGVvZiBnZXQ7XG4gIHNlbGVjdFBhcmFtczogdHlwZW9mIHNlbGVjdFBhcmFtcztcbiAgZmlsdGVyT3V0UGFyYW1zOiB0eXBlb2YgZmlsdGVyT3V0UGFyYW1zO1xuICBERUxJTUlURVI6IHR5cGVvZiBERUxJTUlURVI7XG4gIHBhdGhUb1BhcnRzOiB0eXBlb2YgcGF0aFRvUGFydHM7XG4gIHJlbW92ZVBhdGg6IHR5cGVvZiByZW1vdmVQYXRoO1xuICBtZXJnZTogdHlwZW9mIG1lcmdlO1xufVxuXG4vKipcbiAqIEBtb2R1bGUgZmxhdFxuICogQG5hbWUgZmxhdFxuICogQG5ldyBpbiB2ZXJzaW9uIDMuM1xuICogQGxvYWQgLi9mbGF0LmRvYy5tZFxuICovXG5leHBvcnQgY29uc3QgZmxhdDogRmxhdE1vZHVsZVR5cGUgPSB7XG4gIC8qKlxuICAgKiBSYXcgYGZsYXR0ZW5gIGZ1bmN0aW9uIGV4cG9ydGVkIGZyb20gb3JpZ2luYWwge0BsaW5rIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL2ZsYXQgZmxhdH1cbiAgICogcGFja2FnZS5cbiAgICovXG4gIGZsYXR0ZW4sXG4gIC8qKlxuICAgKiBSYXcgYHVuZmxhdHRlbmAgZnVuY3Rpb24gZXhwb3J0ZWQgZnJvbSBvcmlnaW5hbCB7QGxpbmsgaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvZmxhdCBmbGF0fVxuICAgKiBwYWNrYWdlLlxuICAgKi9cbiAgdW5mbGF0dGVuLFxuXG4gIHNldCxcbiAgZ2V0LFxuICBzZWxlY3RQYXJhbXMsXG4gIGZpbHRlck91dFBhcmFtcyxcbiAgcmVtb3ZlUGF0aCxcbiAgREVMSU1JVEVSLFxuICBwYXRoVG9QYXJ0cyxcbiAgbWVyZ2UsXG59XG4iLCJpbXBvcnQgeyBmbGF0IH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvZmxhdCdcbmltcG9ydCB7IFJlY29yZEpTT04gfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzJ1xuXG4vKipcbiAqIEhPRiByZXR1cm5pbmcgYSBmdW5jdGlvbiB3aGljaCB0YWtlcyBhIHJlY29yZCBhbmQgcmV0dXJucyBhbiB1cGRhdGVkIHJlY29yZC5cbiAqIFRoaXMgd2F5IHdlIGNhbiBwYXNzIHRoaXMgdG8gc2V0U3RhdGUgaW4gcmVhY3QsIHdoaWNoIHRha2VzIG9sZCBzdGF0ZVxuICogKGluIG91ciBjYXNlIHByZXZpb3VzUmVjb3JkKSBhcyBhbiBhcmd1bWVudC5cbiAqXG4gKiBGdW5jdGlvbiBpcyB1c2VkIHdoZW4gdG8gdGhlIHtAbGluayBPblByb3BlcnR5Q2hhbmdlfSBjYWxsYmFjaywgdXNlciBwYXNzZXNcbiAqIGtleSAocHJvcGVydHkgbmFtZSkgYW5kIHRoZSB2YWx1ZSAoZm9sbG93ZWQgYnkgYW4gb3B0aW9uYWwgc2VsZWN0ZWRSZWNvcmQpLlxuICpcbiAqIFRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgZnVuY3Rpb24gaXMgdG86XG4gKiAtIGNsZWFyIG9sZCB2YWx1ZXMgdW5kZXIgcGFzc2VkIGtleTogc28gd2hlbiB1c2VyIHBhc3NlcyBwcm9wZXJ0eSA9PT0gYHNvbWUua2V5YFxuICogICBmdW5jdGlvbiByZW1vdmVzIGBzb21lLmtleS4xYCwgYHNvbWUua2V5LjJgIGV0Y1xuICogLSBzZXRzIG5ldyB2YWx1ZSB1bmRlciB0aGUgcGFzc2VkIGtleSBmb3IgcHJpbWl0aXZlIHR5cGVzXG4gKiAtIGluIGNhc2Ugb2Ygb2JqZWN0cyAtIGl0IGZsYXR0ZW5zIHRoZW0gZmlyc3QgYW5kIHRoZW4gc2V0cyBhbGwgdGhlIHJlc3VsdGVkIHZhbHVlc1xuICogICB1bmRlciB0aGUgcGF0aCBwcm92aWRlZCBpbiB0aGUgcHJvcGVydHkgYXJndW1lbnRcbiAqIC0gaXQgZmlsbHMgdmFsdWUgaW4gUmVjb3JkSlNPTiNwb3B1bGF0ZWQgd2hlbiBzZWxlY3RlZFJlY29yZCBpcyBnaXZlblxuICogLSBmaW5hbGx5IGl0IGludmFsaWRhdGVzIHBvcHVsYXRlZCBmb3IgZ2l2ZW4gcHJvcGVydHlcbiAqXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9ICAgICAgcHJvcGVydHkgICAgICAgIHByb3BlcnR5IHRoYXQgbXVzdCBiZSB1cGRhdGVkLCBzdXBwb3J0cyBuZXN0aW5nXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBkb3RzXG4gKiBAcGFyYW0ge2FueX0gICAgICAgICB2YWx1ZSAgICAgICAgICAgdmFsdWUgdGhhdCBtdXN0IGJlIHNldCwgdW5kZWZpbmVkIG9yIG51bGwgaWZcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGluZywgd2lsbCBiZSBmbGF0dGVuZWRcbiAqIEBwYXJhbSB7UmVjb3JkSlNPTn0gIHNlbGVjdGVkUmVjb3JkICBpZiB2YWx1ZSBpcyByZWZlcmVuY2UgSUQsIHRoaXMgbXVzdCBiZSBhIHJlY29yZFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0J3MgcmVmZXJlbmNpbmcgdG9cbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBjb25zdCB1cGRhdGVSZWNvcmQgPSAoXG4gIHByb3BlcnR5OiBzdHJpbmcsXG4gIHZhbHVlOiBhbnksXG4gIHNlbGVjdGVkUmVjb3JkPzogUmVjb3JkSlNPTixcbikgPT4gKHByZXZpb3VzUmVjb3JkOiBSZWNvcmRKU09OKTogUmVjb3JkSlNPTiA9PiB7XG4gIGxldCBwb3B1bGF0ZWRNb2RpZmllZCA9IGZhbHNlXG4gIGNvbnN0IHBvcHVsYXRlZENvcHkgPSB7IC4uLnByZXZpb3VzUmVjb3JkLnBvcHVsYXRlZCB9XG4gIGNvbnN0IHBhcmFtc0NvcHkgPSBmbGF0LnNldChwcmV2aW91c1JlY29yZC5wYXJhbXMsIHByb3BlcnR5LCB2YWx1ZSlcblxuICBpZiAocHJvcGVydHkgaW4gcG9wdWxhdGVkQ29weSkge1xuICAgIGRlbGV0ZSBwb3B1bGF0ZWRDb3B5W3Byb3BlcnR5XVxuICAgIHBvcHVsYXRlZE1vZGlmaWVkID0gdHJ1ZVxuICB9XG5cbiAgaWYgKHNlbGVjdGVkUmVjb3JkKSB7XG4gICAgcG9wdWxhdGVkQ29weVtwcm9wZXJ0eV0gPSBzZWxlY3RlZFJlY29yZFxuICAgIHBvcHVsYXRlZE1vZGlmaWVkID0gdHJ1ZVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5wcmV2aW91c1JlY29yZCxcbiAgICBwYXJhbXM6IHBhcmFtc0NvcHksXG4gICAgcG9wdWxhdGVkOiBwb3B1bGF0ZWRNb2RpZmllZCA/IHBvcHVsYXRlZENvcHkgOiBwcmV2aW91c1JlY29yZC5wb3B1bGF0ZWQsXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgdXBkYXRlUmVjb3JkXG4iLCJpbXBvcnQgeyBSZWNvcmRKU09OIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcydcblxuY29uc3QgaXNFbnRpcmVSZWNvcmRHaXZlbiA9IChcbiAgcHJvcGVydHlPclJlY29yZDogUmVjb3JkSlNPTiB8IHN0cmluZyxcbiAgdmFsdWU/OiBzdHJpbmcsXG4pOiBib29sZWFuID0+ICEhKHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCdcbiAgICAvLyB1c2VyIGNhbiBwYXNzIHByb3BlcnR5IGFuZCBvbWl0IHZhbHVlLiBUaGlzIG1ha2VzIHNlbnNlIHdoZW5cbiAgICAvLyB0aGlyZCBhcmd1bWVudCBvZiB0aGUgZnVuY3Rpb24gKHNlbGVjdGVkUmVjb3JkKSBpcyBwYXNzZWQgdG8gb25DaGFuZ2VcbiAgICAvLyBjYWxsYmFja1xuICAgICYmICEodHlwZW9mIHByb3BlcnR5T3JSZWNvcmQgPT09ICdzdHJpbmcnKVxuICAgIC8vIHdlIGFzc3VtZSB0aGF0IG9ubHkgcGFyYW1zIGhhcyB0byBiZSBnaXZlblxuICAgICYmIHByb3BlcnR5T3JSZWNvcmQucGFyYW1zKVxuXG5leHBvcnQge1xuICBpc0VudGlyZVJlY29yZEdpdmVuIGFzIGRlZmF1bHQsXG4gIGlzRW50aXJlUmVjb3JkR2l2ZW4sXG59XG4iLCIvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93XG5leHBvcnQgZW51bSBFcnJvclR5cGVFbnVtIHtcbiAgQXBwID0gJ0FwcEVycm9yJyxcbiAgQ29uZmlndXJhdGlvbiA9ICdDb25maWd1cmF0aW9uRXJyb3InLFxuICBGb3JiaWRkZW4gPSAnRm9yYmlkZGVuRXJyb3InLFxuICBOb3RGb3VuZCA9ICdOb3RGb3VuZEVycm9yJyxcbiAgTm90SW1wbGVtZW50ZWQgPSAnTm90SW1wbGVtZW50ZWRFcnJvcicsXG4gIFJlY29yZCA9ICdSZWNvcmRFcnJvcicsXG4gIFZhbGlkYXRpb24gPSAnVmFsaWRhdGlvbkVycm9yJyxcbn1cblxuZXhwb3J0IGRlZmF1bHQgRXJyb3JUeXBlRW51bVxuIiwiaW1wb3J0IHsgZmxhdCB9IGZyb20gJy4uLy4uLy4uL3V0aWxzJ1xuaW1wb3J0IHsgUmVjb3JkSlNPTiB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMnXG5pbXBvcnQgeyBVc2VSZWNvcmRPcHRpb25zIH0gZnJvbSAnLi91c2UtcmVjb3JkLnR5cGUnXG5cbmV4cG9ydCBjb25zdCBmaWx0ZXJSZWNvcmRQYXJhbXMgPSBmdW5jdGlvbjxUIGV4dGVuZHMgUmVjb3JkSlNPTj4gKFxuICByZWNvcmQ6IFQsXG4gIG9wdGlvbnM6IFVzZVJlY29yZE9wdGlvbnMgPSB7fSxcbik6IFQge1xuICBpZiAob3B0aW9ucy5pbmNsdWRlUGFyYW1zICYmIHJlY29yZCkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5yZWNvcmQsXG4gICAgICBwYXJhbXM6IGZsYXQuc2VsZWN0UGFyYW1zKHJlY29yZC5wYXJhbXMgfHwge30sIG9wdGlvbnMuaW5jbHVkZVBhcmFtcyksXG4gICAgfVxuICB9XG4gIHJldHVybiByZWNvcmRcbn1cblxuZXhwb3J0IGNvbnN0IGlzUHJvcGVydHlQZXJtaXR0ZWQgPSAocHJvcGVydHlOYW1lLCBvcHRpb25zOiBVc2VSZWNvcmRPcHRpb25zID0ge30pOiBib29sZWFuID0+IHtcbiAgY29uc3QgeyBpbmNsdWRlUGFyYW1zIH0gPSBvcHRpb25zXG4gIGlmIChpbmNsdWRlUGFyYW1zKSB7XG4gICAgY29uc3QgcGFydHMgPSBmbGF0LnBhdGhUb1BhcnRzKHByb3BlcnR5TmFtZSwgeyBza2lwQXJyYXlJbmRleGVzOiB0cnVlIH0pXG4gICAgcmV0dXJuIHBhcnRzLnNvbWUoKHBhcnQpID0+IGluY2x1ZGVQYXJhbXMuaW5jbHVkZXMocGFydCkpXG4gIH1cbiAgcmV0dXJuIHRydWVcbn1cbiIsImltcG9ydCB7IHVzZVN0YXRlLCB1c2VDYWxsYmFjaywgRGlzcGF0Y2gsIFNldFN0YXRlQWN0aW9uIH0gZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBBeGlvc1Jlc3BvbnNlIH0gZnJvbSAnYXhpb3MnXG5pbXBvcnQgQXBpQ2xpZW50LCB7IFJlY29yZEFjdGlvbkFQSVBhcmFtcyB9IGZyb20gJy4uLy4uL3V0aWxzL2FwaS1jbGllbnQnXG5pbXBvcnQgeyBSZWNvcmRKU09OIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcydcbmltcG9ydCB7IHBhcmFtc1RvRm9ybURhdGEgfSBmcm9tICcuL3BhcmFtcy10by1mb3JtLWRhdGEnXG5pbXBvcnQgdXNlTm90aWNlIGZyb20gJy4uL3VzZS1ub3RpY2UnXG5pbXBvcnQgeyBSZWNvcmRBY3Rpb25SZXNwb25zZSB9IGZyb20gJy4uLy4uLy4uL2JhY2tlbmQvYWN0aW9ucy9hY3Rpb24uaW50ZXJmYWNlJ1xuaW1wb3J0IG1lcmdlUmVjb3JkUmVzcG9uc2UgZnJvbSAnLi9tZXJnZS1yZWNvcmQtcmVzcG9uc2UnXG5pbXBvcnQgdXBkYXRlUmVjb3JkIGZyb20gJy4vdXBkYXRlLXJlY29yZCdcbmltcG9ydCB7IFVzZVJlY29yZE9wdGlvbnMsIFVzZVJlY29yZFJlc3VsdCwgVXNlUmVjb3JkU3VibWl0RnVuY3Rpb24gfSBmcm9tICcuL3VzZS1yZWNvcmQudHlwZSdcbmltcG9ydCBpc0VudGlyZVJlY29yZEdpdmVuIGZyb20gJy4vaXMtZW50aXJlLXJlY29yZC1naXZlbidcbmltcG9ydCB7IGZpbHRlclJlY29yZFBhcmFtcywgaXNQcm9wZXJ0eVBlcm1pdHRlZCB9IGZyb20gJy4vZmlsdGVyLXJlY29yZCdcbmltcG9ydCB7IGZsYXQgfSBmcm9tICcuLi8uLi8uLi91dGlscydcblxuY29uc3QgYXBpID0gbmV3IEFwaUNsaWVudCgpXG5cbi8qKlxuICogQGxvYWQgLi91c2UtcmVjb3JkLmRvYy5tZFxuICogQHN1YmNhdGVnb3J5IEhvb2tzXG4gKiBAY2xhc3NcbiAqIEBoaWRlY29uc3RydWN0b3JcbiAqIEBidW5kbGVcbiAqIEBwYXJhbSB7UmVjb3JkSlNPTn0gW2luaXRpYWxSZWNvcmRdLFxuICogQHBhcmFtIHtzdHJpbmd9IHJlc291cmNlSWRcbiAqIEBwYXJhbSB7VXNlUmVjb3JkT3B0aW9uc30gW29wdGlvbnNdXG4gKiBAcmV0dXJuIHtVc2VSZWNvcmRSZXN1bHR9XG4gKi9cbmV4cG9ydCBjb25zdCB1c2VSZWNvcmQgPSAoXG4gIGluaXRpYWxSZWNvcmQ6IFJlY29yZEpTT04gfCB1bmRlZmluZWQsXG4gIHJlc291cmNlSWQ6IHN0cmluZyxcbiAgb3B0aW9ucz86IFVzZVJlY29yZE9wdGlvbnMsXG4pOiBVc2VSZWNvcmRSZXN1bHQgPT4ge1xuICAvLyBzZXR0aW5nIHVwIHN0YXRlXG4gIGNvbnN0IFtsb2FkaW5nLCBzZXRMb2FkaW5nXSA9IHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCBbaXNTeW5jZWQsIHNldElzU3luY2VkXSA9IHVzZVN0YXRlKHRydWUpXG4gIGNvbnN0IFtwcm9ncmVzcywgc2V0UHJvZ3Jlc3NdID0gdXNlU3RhdGUoMClcblxuICBjb25zdCBmaWx0ZXJlZFJlY29yZCA9IGluaXRpYWxSZWNvcmQgPyBmaWx0ZXJSZWNvcmRQYXJhbXMoaW5pdGlhbFJlY29yZCwgb3B0aW9ucykgOiBudWxsXG5cbiAgY29uc3QgW3JlY29yZCwgc2V0UmVjb3JkXSA9IHVzZVN0YXRlPFJlY29yZEpTT04+KHtcbiAgICAuLi5maWx0ZXJlZFJlY29yZCxcbiAgICBwYXJhbXM6IGZpbHRlcmVkUmVjb3JkPy5wYXJhbXMgPz8ge30sXG4gICAgZXJyb3JzOiBpbml0aWFsUmVjb3JkPy5lcnJvcnMgPz8ge30sXG4gICAgcG9wdWxhdGVkOiBpbml0aWFsUmVjb3JkPy5wb3B1bGF0ZWQgPz8ge30sXG4gIH0gYXMgUmVjb3JkSlNPTilcblxuICAvLyBpdCBrZWVwcyB0aGUgc2FtZSBmb3JtYXQgYXMgdXNlU3RhdGUgZnVuY3Rpb24gd2hpY2ggY2FuIHRha2UgZWl0aGVyIHZhbHVlIG9yIGZ1bmN0aW9uXG4gIGNvbnN0IHNldEZpbHRlcmVkUmVjb3JkOiBEaXNwYXRjaDxTZXRTdGF0ZUFjdGlvbjxSZWNvcmRKU09OPj4gPSB1c2VDYWxsYmFjaygodmFsdWUpID0+IHtcbiAgICBjb25zdCBuZXdSZWNvcmQgPSB2YWx1ZSBpbnN0YW5jZW9mIEZ1bmN0aW9uID8gdmFsdWUocmVjb3JkKSA6IHZhbHVlXG4gICAgc2V0UmVjb3JkKGZpbHRlclJlY29yZFBhcmFtcyhuZXdSZWNvcmQsIG9wdGlvbnMpKVxuICB9LCBbb3B0aW9ucywgcmVjb3JkXSlcblxuICBjb25zdCBvbk5vdGljZSA9IHVzZU5vdGljZSgpXG5cbiAgY29uc3QgaGFuZGxlQ2hhbmdlID0gdXNlQ2FsbGJhY2soKFxuICAgIHByb3BlcnR5T3JSZWNvcmQ6IFJlY29yZEpTT04gfCBzdHJpbmcsXG4gICAgdmFsdWU/OiBhbnksXG4gICAgaW5jb21pbmdSZWNvcmQ/OiBSZWNvcmRKU09OLFxuICApOiB2b2lkID0+IHtcbiAgICBpZiAoaXNFbnRpcmVSZWNvcmRHaXZlbihwcm9wZXJ0eU9yUmVjb3JkLCB2YWx1ZSkpIHtcbiAgICAgIHNldEZpbHRlcmVkUmVjb3JkKHByb3BlcnR5T3JSZWNvcmQgYXMgUmVjb3JkSlNPTilcbiAgICB9IGVsc2UgaWYgKGlzUHJvcGVydHlQZXJtaXR0ZWQocHJvcGVydHlPclJlY29yZCBhcyBzdHJpbmcsIG9wdGlvbnMpKSB7XG4gICAgICBzZXRSZWNvcmQodXBkYXRlUmVjb3JkKHByb3BlcnR5T3JSZWNvcmQgYXMgc3RyaW5nLCB2YWx1ZSwgaW5jb21pbmdSZWNvcmQpKVxuICAgIH0gZWxzZSBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICBjb25zb2xlLndhcm4oW1xuICAgICAgICBgWW91IGFyZSB0cnlpbmcgdG8gc2V0IHByb3BlcnR5OiBcIiR7cHJvcGVydHlPclJlY29yZCBhcyBzdHJpbmd9XCIgd2hpY2hgLFxuICAgICAgICAnaXMgbm90IHBlcm1pdHRlZC4gVGFrZSBhIGxvb2sgYXQgYHVzZVJlY29yZCguLi4sIHsgaW5jbHVkZVBhcmFtczogWy4uLl19KWAnLFxuICAgICAgXS5qb2luKCdcXG4nKSlcbiAgICB9XG4gICAgc2V0SXNTeW5jZWQoZmFsc2UpXG4gIH0sIFtzZXRSZWNvcmQsIG9wdGlvbnNdKVxuXG4gIGNvbnN0IGhhbmRsZVN1Ym1pdDogVXNlUmVjb3JkU3VibWl0RnVuY3Rpb24gPSB1c2VDYWxsYmFjaygoXG4gICAgY3VzdG9tUGFyYW1zID0ge30sXG4gICAgc3VibWl0T3B0aW9ucyxcbiAgKTogUHJvbWlzZTxBeGlvc1Jlc3BvbnNlPFJlY29yZEFjdGlvblJlc3BvbnNlPj4gPT4ge1xuICAgIHNldExvYWRpbmcodHJ1ZSlcblxuICAgIGNvbnN0IG1lcmdlZFBhcmFtcyA9IGZsYXQubWVyZ2UocmVjb3JkLnBhcmFtcywgY3VzdG9tUGFyYW1zKVxuICAgIGNvbnN0IGZvcm1EYXRhID0gcGFyYW1zVG9Gb3JtRGF0YShtZXJnZWRQYXJhbXMpXG5cbiAgICBjb25zdCBwYXJhbXM6IE9taXQ8UmVjb3JkQWN0aW9uQVBJUGFyYW1zLCAnYWN0aW9uTmFtZScgfCAncmVjb3JkSWQnPiA9IHtcbiAgICAgIHJlc291cmNlSWQsXG4gICAgICBvblVwbG9hZFByb2dyZXNzOiAoZSk6IHZvaWQgPT4gc2V0UHJvZ3Jlc3MoTWF0aC5yb3VuZCgoZS5sb2FkZWQgKiAxMDApIC8gZS50b3RhbCkpLFxuICAgICAgZGF0YTogZm9ybURhdGEsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnbXVsdGlwYXJ0L2Zvcm0tZGF0YScgfSxcbiAgICB9XG5cbiAgICBjb25zdCBwcm9taXNlID0gaW5pdGlhbFJlY29yZD8uaWRcbiAgICAgID8gYXBpLnJlY29yZEFjdGlvbih7XG4gICAgICAgIC4uLnBhcmFtcyxcbiAgICAgICAgYWN0aW9uTmFtZTogJ2VkaXQnLFxuICAgICAgICByZWNvcmRJZDogcmVjb3JkLmlkLFxuICAgICAgfSlcbiAgICAgIDogYXBpLnJlc291cmNlQWN0aW9uKHtcbiAgICAgICAgLi4ucGFyYW1zLFxuICAgICAgICBhY3Rpb25OYW1lOiAnbmV3JyxcbiAgICAgIH0pIGFzIFByb21pc2U8QXhpb3NSZXNwb25zZTxSZWNvcmRBY3Rpb25SZXNwb25zZT4+XG5cbiAgICBwcm9taXNlLnRoZW4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBpZiAocmVzcG9uc2UuZGF0YS5ub3RpY2UpIHtcbiAgICAgICAgb25Ob3RpY2UocmVzcG9uc2UuZGF0YS5ub3RpY2UpXG4gICAgICB9XG4gICAgICBpZiAoc3VibWl0T3B0aW9ucz8udXBkYXRlT25TYXZlICE9PSBmYWxzZSkge1xuICAgICAgICBzZXRGaWx0ZXJlZFJlY29yZCgocHJldikgPT4gbWVyZ2VSZWNvcmRSZXNwb25zZShwcmV2LCByZXNwb25zZS5kYXRhKSlcbiAgICAgIH1cbiAgICAgIHNldFByb2dyZXNzKDApXG4gICAgICBzZXRMb2FkaW5nKGZhbHNlKVxuICAgICAgc2V0SXNTeW5jZWQodHJ1ZSlcbiAgICB9KS5jYXRjaCgoKSA9PiB7XG4gICAgICBvbk5vdGljZSh7XG4gICAgICAgIG1lc3NhZ2U6XG4gICAgICAgICdUaGVyZSB3YXMgYW4gZXJyb3IgdXBkYXRpbmcgcmVjb3JkLCBDaGVjayBvdXQgY29uc29sZSB0byBzZWUgbW9yZSBpbmZvcm1hdGlvbi4nLFxuICAgICAgICB0eXBlOiAnZXJyb3InLFxuICAgICAgfSlcbiAgICAgIHNldFByb2dyZXNzKDApXG4gICAgICBzZXRMb2FkaW5nKGZhbHNlKVxuICAgIH0pXG4gICAgcmV0dXJuIHByb21pc2VcbiAgfSwgW3JlY29yZCwgcmVzb3VyY2VJZCwgc2V0TG9hZGluZywgc2V0UHJvZ3Jlc3MsIHNldFJlY29yZF0pXG5cbiAgcmV0dXJuIHtcbiAgICByZWNvcmQsXG4gICAgaGFuZGxlQ2hhbmdlLFxuICAgIHN1Ym1pdDogaGFuZGxlU3VibWl0LFxuICAgIGxvYWRpbmcsXG4gICAgcHJvZ3Jlc3MsXG4gICAgc2V0UmVjb3JkOiBzZXRGaWx0ZXJlZFJlY29yZCxcbiAgICBpc1N5bmNlZCxcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCB1c2VSZWNvcmRcbiIsImltcG9ydCB7IEFjdGlvbkpTT04gfSBmcm9tICcuL2FjdGlvbi1qc29uLmludGVyZmFjZSdcblxuZXhwb3J0IGNvbnN0IGFjdGlvbkhhc0NvbXBvbmVudCA9IChhY3Rpb246IEFjdGlvbkpTT04pOiBib29sZWFuID0+IChcbiAgdHlwZW9mIGFjdGlvbi5jb21wb25lbnQgIT09ICd1bmRlZmluZWQnICYmIGFjdGlvbi5jb21wb25lbnQgPT09IGZhbHNlXG4pXG4iLCJpbXBvcnQgeyBSZWNvcmRBY3Rpb25QYXJhbXMsIFZpZXdIZWxwZXJzIH0gZnJvbSAnLi4vLi4vLi4vYmFja2VuZC91dGlscy92aWV3LWhlbHBlcnMnXG5pbXBvcnQgeyBEaWZmZXJlbnRBY3Rpb25QYXJhbXMgfSBmcm9tICcuLi8uLi9ob29rcydcbmltcG9ydCB7IEFjdGlvbkpTT04gfSBmcm9tICcuL2FjdGlvbi1qc29uLmludGVyZmFjZSdcblxuY29uc3QgaCA9IG5ldyBWaWV3SGVscGVycygpXG5cbmV4cG9ydCBjb25zdCBhY3Rpb25IcmVmID0gKFxuICBhY3Rpb246IEFjdGlvbkpTT04sXG4gIHBhcmFtczogRGlmZmVyZW50QWN0aW9uUGFyYW1zLFxuKTogc3RyaW5nIHwgbnVsbCA9PiB7XG4gIGNvbnN0IGFjdGlvbk5hbWUgPSBhY3Rpb24ubmFtZVxuXG4gIGlmICghYWN0aW9uLmNvbXBvbmVudCAmJiAhYWN0aW9uLmhhc0hhbmRsZXIpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgY29uc3QgaHJlZk1hcCA9IHtcbiAgICByZWNvcmQ6ICgpOiBzdHJpbmcgPT4gaC5yZWNvcmRBY3Rpb25Vcmwoe1xuICAgICAgLi4ucGFyYW1zIGFzIFJlY29yZEFjdGlvblBhcmFtcyxcbiAgICAgIGFjdGlvbk5hbWUsXG4gICAgfSksXG4gICAgcmVzb3VyY2U6ICgpOiBzdHJpbmcgPT4gaC5yZXNvdXJjZUFjdGlvblVybCh7XG4gICAgICByZXNvdXJjZUlkOiBwYXJhbXMucmVzb3VyY2VJZCxcbiAgICAgIGFjdGlvbk5hbWUsXG4gICAgfSksXG4gICAgYnVsazogKCk6IHN0cmluZyA9PiBoLmJ1bGtBY3Rpb25Vcmwoe1xuICAgICAgLi4ucGFyYW1zLFxuICAgICAgYWN0aW9uTmFtZSxcbiAgICB9KSxcbiAgfVxuICBpZiAoaHJlZk1hcFthY3Rpb24uYWN0aW9uVHlwZV0pIHtcbiAgICByZXR1cm4gaHJlZk1hcFthY3Rpb24uYWN0aW9uVHlwZV0oKVxuICB9XG4gIHRocm93IG5ldyBFcnJvcignXCJhY3Rpb25UeXBlXCIgc2hvdWxkIGJlIGVpdGhlciByZWNvcmQsIHJlc291cmNlIG9yIGJ1bGsnKVxufVxuIiwiZXhwb3J0IGNvbnN0IGdldFJlc291cmNlRWxlbWVudENzcyA9IChyZXNvdXJjZUlkOiBzdHJpbmcsIHN1ZmZpeDogc3RyaW5nKSA9PiBgJHtyZXNvdXJjZUlkfS0ke3N1ZmZpeH1gXG5cbmV4cG9ydCBjb25zdCBnZXRBY3Rpb25FbGVtZW50Q3NzID0gKHJlc291cmNlSWQ6IHN0cmluZywgYWN0aW9uTmFtZTogc3RyaW5nLCBzdWZmaXg6IHN0cmluZykgPT4gYCR7cmVzb3VyY2VJZH0tJHthY3Rpb25OYW1lfS0ke3N1ZmZpeH1gXG4iLCJpbXBvcnQgeyBBeGlvc1Jlc3BvbnNlIH0gZnJvbSAnYXhpb3MnXG5pbXBvcnQgeyBBY3Rpb25SZXNwb25zZSB9IGZyb20gJy4uLy4uLy4uL2JhY2tlbmQnXG5pbXBvcnQgeyBEaWZmZXJlbnRBY3Rpb25QYXJhbXMgfSBmcm9tICcuLi8uLi9ob29rcydcbmltcG9ydCB7IEFwaUNsaWVudCB9IGZyb20gJy4uLy4uL3V0aWxzJ1xuaW1wb3J0IHsgQWN0aW9uSlNPTiB9IGZyb20gJy4vYWN0aW9uLWpzb24uaW50ZXJmYWNlJ1xuXG5jb25zdCBhcGkgPSBuZXcgQXBpQ2xpZW50KClcblxuZXhwb3J0IGZ1bmN0aW9uIGNhbGxBY3Rpb25BcGk8SyBleHRlbmRzIEFjdGlvblJlc3BvbnNlPihcbiAgYWN0aW9uOiBBY3Rpb25KU09OLFxuICBwYXJhbXM6IERpZmZlcmVudEFjdGlvblBhcmFtcyxcbiAgc2VhcmNoPzogTG9jYXRpb25bJ3NlYXJjaCddLFxuKTogUHJvbWlzZTxBeGlvc1Jlc3BvbnNlPEs+PiB7XG4gIGxldCBwcm9taXNlOiBQcm9taXNlPEF4aW9zUmVzcG9uc2U8Sz4+XG4gIGNvbnN0IHsgcmVjb3JkSWQsIHJlY29yZElkcywgcmVzb3VyY2VJZCB9ID0gcGFyYW1zXG5cbiAgc3dpdGNoIChhY3Rpb24uYWN0aW9uVHlwZSkge1xuICBjYXNlICdyZWNvcmQnOlxuICAgIGlmICghcmVjb3JkSWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignWW91IGhhdmUgdG8gc3BlY2lmeSBcInJlY29yZElkXCIgZm9yIHJlY29yZCBhY3Rpb24nKVxuICAgIH1cbiAgICBwcm9taXNlID0gYXBpLnJlY29yZEFjdGlvbih7XG4gICAgICByZXNvdXJjZUlkLCBhY3Rpb25OYW1lOiBhY3Rpb24ubmFtZSwgcmVjb3JkSWQsIHNlYXJjaCxcbiAgICB9KSBhcyBhbnlcbiAgICBicmVha1xuICBjYXNlICdyZXNvdXJjZSc6XG4gICAgcHJvbWlzZSA9IGFwaS5yZXNvdXJjZUFjdGlvbih7XG4gICAgICByZXNvdXJjZUlkLCBhY3Rpb25OYW1lOiBhY3Rpb24ubmFtZSxcbiAgICB9KSBhcyBhbnlcbiAgICBicmVha1xuICBjYXNlICdidWxrJzpcbiAgICBpZiAoIXJlY29yZElkcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdZb3UgaGF2ZSB0byBzcGVjaWZ5IFwicmVjb3JkSWRzXCIgZm9yIGJ1bGsgYWN0aW9uJylcbiAgICB9XG4gICAgcHJvbWlzZSA9IGFwaS5idWxrQWN0aW9uKHtcbiAgICAgIHJlc291cmNlSWQsIGFjdGlvbk5hbWU6IGFjdGlvbi5uYW1lLCByZWNvcmRJZHMsIHNlYXJjaCxcbiAgICB9KSBhcyBhbnlcbiAgICBicmVha1xuICBkZWZhdWx0OlxuICAgIHRocm93IG5ldyBFcnJvcignXCJhY3Rpb25UeXBlXCIgc2hvdWxkIGJlIGVpdGhlciByZWNvcmQsIHJlc291cmNlIG9yIGJ1bGsnKVxuICB9XG4gIHJldHVybiBwcm9taXNlXG59XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBhcnJvdy1wYXJlbnMgKi9cbmltcG9ydCB7IEF4aW9zUmVzcG9uc2UgfSBmcm9tICdheGlvcydcbmltcG9ydCB7IEFjdGlvblJlc3BvbnNlIH0gZnJvbSAnLi4vLi4vLi4vYmFja2VuZCdcbmltcG9ydCB7IERpZmZlcmVudEFjdGlvblBhcmFtcywgdXNlQWN0aW9uUmVzcG9uc2VIYW5kbGVyIH0gZnJvbSAnLi4vLi4vaG9va3MnXG5pbXBvcnQgeyBBY3Rpb25KU09OIH0gZnJvbSAnLi9hY3Rpb24tanNvbi5pbnRlcmZhY2UnXG5pbXBvcnQgeyBjYWxsQWN0aW9uQXBpIH0gZnJvbSAnLi9jYWxsLWFjdGlvbi1hcGknXG5cbmV4cG9ydCB0eXBlIENhbGxBcGlGdW5jdGlvbjxLIGV4dGVuZHMgQWN0aW9uUmVzcG9uc2U+ID0gKCkgPT4gUHJvbWlzZTxBeGlvc1Jlc3BvbnNlPEs+PlxuXG5leHBvcnQgdHlwZSBCdWlsZEFjdGlvbkNhbGxBcGlUcmlnZ2VyT3B0aW9ucyA9IHtcbiAgYWN0aW9uOiBBY3Rpb25KU09OO1xuICBwYXJhbXM6IERpZmZlcmVudEFjdGlvblBhcmFtcztcbiAgYWN0aW9uUmVzcG9uc2VIYW5kbGVyOiBSZXR1cm5UeXBlPHR5cGVvZiB1c2VBY3Rpb25SZXNwb25zZUhhbmRsZXI+O1xuICBzZWFyY2g/OiBMb2NhdGlvblsnc2VhcmNoJ107XG59XG5cbmV4cG9ydCBjb25zdCBidWlsZEFjdGlvbkNhbGxBcGlUcmlnZ2VyID0gPEsgZXh0ZW5kcyBBY3Rpb25SZXNwb25zZT4oXG4gIG9wdGlvbnM6IEJ1aWxkQWN0aW9uQ2FsbEFwaVRyaWdnZXJPcHRpb25zLFxuKTogQ2FsbEFwaUZ1bmN0aW9uPEs+ID0+IHtcbiAgY29uc3QgeyBhY3Rpb24sIHBhcmFtcywgYWN0aW9uUmVzcG9uc2VIYW5kbGVyLCBzZWFyY2ggfSA9IG9wdGlvbnNcbiAgY29uc3QgY2FsbEFwaTogQ2FsbEFwaUZ1bmN0aW9uPEs+ID0gKCkgPT4ge1xuICAgIGNvbnN0IHByb21pc2UgPSBjYWxsQWN0aW9uQXBpKGFjdGlvbiwgcGFyYW1zLCBzZWFyY2gpXG4gICAgcHJvbWlzZS50aGVuKGFjdGlvblJlc3BvbnNlSGFuZGxlcikuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICB0aHJvdyBlcnJvclxuICAgIH0pXG5cbiAgICByZXR1cm4gcHJvbWlzZSBhcyBQcm9taXNlPEF4aW9zUmVzcG9uc2U8Sz4+XG4gIH1cbiAgcmV0dXJuIGNhbGxBcGlcbn1cbiIsImltcG9ydCB7IEFjdGlvbkpTT04gfSBmcm9tICcuL2FjdGlvbi1qc29uLmludGVyZmFjZSdcblxuZXhwb3J0IGNvbnN0IGJ1aWxkQWN0aW9uVGVzdElkID0gKGFjdGlvbjogQWN0aW9uSlNPTik6IHN0cmluZyA9PiBgYWN0aW9uLSR7YWN0aW9uLm5hbWV9YFxuIiwiLyogZXNsaW50LWRpc2FibGUgbm8tcmVzdHJpY3RlZC1nbG9iYWxzICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby11bmRlZiAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tYWxlcnQgKi9cbmltcG9ydCB7IE5hdmlnYXRlRnVuY3Rpb24gfSBmcm9tICdyZWFjdC1yb3V0ZXInXG5pbXBvcnQgeyBEaWZmZXJlbnRBY3Rpb25QYXJhbXMsIHVzZUFjdGlvblJlc3BvbnNlSGFuZGxlciB9IGZyb20gJy4uLy4uL2hvb2tzJ1xuaW1wb3J0IHsgYWN0aW9uSGFzQ29tcG9uZW50IH0gZnJvbSAnLi9hY3Rpb24taGFzLWNvbXBvbmVudCdcbmltcG9ydCB7IGFjdGlvbkhyZWYgfSBmcm9tICcuL2FjdGlvbi1ocmVmJ1xuaW1wb3J0IHsgQWN0aW9uSlNPTiB9IGZyb20gJy4vYWN0aW9uLWpzb24uaW50ZXJmYWNlJ1xuaW1wb3J0IHsgYnVpbGRBY3Rpb25DYWxsQXBpVHJpZ2dlciB9IGZyb20gJy4vYnVpbGQtYWN0aW9uLWFwaS1jYWxsLXRyaWdnZXInXG5cbmV4cG9ydCB0eXBlIEJ1aWxkQWN0aW9uQ2xpY2tPcHRpb25zID0ge1xuICBhY3Rpb246IEFjdGlvbkpTT047XG4gIHBhcmFtczogRGlmZmVyZW50QWN0aW9uUGFyYW1zO1xuICBhY3Rpb25SZXNwb25zZUhhbmRsZXI6IFJldHVyblR5cGU8dHlwZW9mIHVzZUFjdGlvblJlc3BvbnNlSGFuZGxlcj47XG4gIG5hdmlnYXRlOiBOYXZpZ2F0ZUZ1bmN0aW9uO1xufVxuXG5leHBvcnQgdHlwZSBCdWlsZEFjdGlvbkNsaWNrUmV0dXJuID0gKGV2ZW50OiBhbnkpID0+IGFueSB8IFByb21pc2U8YW55PlxuXG5leHBvcnQgY29uc3QgYnVpbGRBY3Rpb25DbGlja0hhbmRsZXIgPSAoXG4gIG9wdGlvbnM6IEJ1aWxkQWN0aW9uQ2xpY2tPcHRpb25zLFxuKTogQnVpbGRBY3Rpb25DbGlja1JldHVybiA9PiB7XG4gIGNvbnN0IHsgYWN0aW9uLCBwYXJhbXMsIGFjdGlvblJlc3BvbnNlSGFuZGxlciwgbmF2aWdhdGUgfSA9IG9wdGlvbnNcblxuICBjb25zdCBoYW5kbGVBY3Rpb25DbGljayA9IChldmVudDogUmVhY3QuTW91c2VFdmVudDxIVE1MRWxlbWVudD4pOiBQcm9taXNlPGFueT4gfCBhbnkgPT4ge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKVxuXG4gICAgY29uc3QgaHJlZiA9IGFjdGlvbkhyZWYoYWN0aW9uLCBwYXJhbXMpXG5cbiAgICBjb25zdCBjYWxsQXBpID0gYnVpbGRBY3Rpb25DYWxsQXBpVHJpZ2dlcih7XG4gICAgICBwYXJhbXMsIGFjdGlvbiwgYWN0aW9uUmVzcG9uc2VIYW5kbGVyLFxuICAgIH0pXG5cbiAgICBpZiAoYWN0aW9uLmd1YXJkICYmICFjb25maXJtKGFjdGlvbi5ndWFyZCkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChhY3Rpb25IYXNDb21wb25lbnQoYWN0aW9uKSkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbnNpc3RlbnQtcmV0dXJuXG4gICAgICByZXR1cm4gY2FsbEFwaSgpXG4gICAgfVxuXG4gICAgaWYgKGhyZWYpIHtcbiAgICAgIG5hdmlnYXRlKGhyZWYpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGhhbmRsZUFjdGlvbkNsaWNrXG59XG4iLCJleHBvcnQgY29uc3QgUkVGUkVTSF9LRVkgPSAncmVmcmVzaCdcbmV4cG9ydCBjb25zdCBJR05PUkVfUEFSQU1TX0tFWSA9ICdpZ25vcmVfcGFyYW1zJ1xuXG4vKipcbiAqIEFkZHMgcmVmcmVzaD10cnVlIHRvIHRoZSB1cmwsIHdoaWNoIGluIHR1cm4gc2hvdWxkIGNhdXNlIGxpc3QgdG8gcmVsb2FkLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgICAgICB1cmwgdG8gd2hpY2ggZnVuY3Rpb24gc2hvdWxkIGFkZCBgcmVmcmVzaGBcbiAqIEBwYXJhbSB7c3RyaW5nfSBbc2VhcmNoXSBvcHRpb25hbCBzZWFyY2ggcXVlcnkgd2hpY2ggc2hvdWxkIGJlIHVwZGF0ZWQsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IGdpdmVuIGZ1bmN0aW9uIHdpbGwgdXNlIHdpbmRvdy5sb2NhdGlvbi5zZWFyY2hcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBjb25zdCBhcHBlbmRGb3JjZVJlZnJlc2ggPSAodXJsOiBzdHJpbmcsIHNlYXJjaD86IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIGNvbnN0IHNlYXJjaFBhcmFtc0lkeCA9IHVybC5sYXN0SW5kZXhPZignPycpXG4gIGNvbnN0IHVybFNlYXJjaFBhcmFtcyA9IHNlYXJjaFBhcmFtc0lkeCAhPT0gLTFcbiAgICA/IHVybC5zdWJzdHJpbmcoc2VhcmNoUGFyYW1zSWR4ICsgMSlcbiAgICA6IG51bGxcblxuICBjb25zdCBvbGRQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHNlYXJjaCA/PyB1cmxTZWFyY2hQYXJhbXMgPz8gd2luZG93LmxvY2F0aW9uLnNlYXJjaCA/PyAnJylcbiAgY29uc3Qgc2hvdWxkSWdub3JlT2xkUGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh1cmxTZWFyY2hQYXJhbXMgfHwgJycpLmdldChJR05PUkVfUEFSQU1TX0tFWSkgPT09ICd0cnVlJ1xuICBjb25zdCBuZXdQYXJhbXMgPSBzaG91bGRJZ25vcmVPbGRQYXJhbXMgPyBuZXcgVVJMU2VhcmNoUGFyYW1zKCcnKSA6IG5ldyBVUkxTZWFyY2hQYXJhbXMob2xkUGFyYW1zLnRvU3RyaW5nKCkpXG5cbiAgbmV3UGFyYW1zLnNldChSRUZSRVNIX0tFWSwgJ3RydWUnKVxuXG4gIGNvbnN0IG5ld1VybCA9IHNlYXJjaFBhcmFtc0lkeCAhPT0gLTFcbiAgICA/IHVybC5zdWJzdHJpbmcoMCwgc2VhcmNoUGFyYW1zSWR4KVxuICAgIDogdXJsXG5cbiAgcmV0dXJuIGAke25ld1VybH0/JHtuZXdQYXJhbXMudG9TdHJpbmcoKX1gXG59XG5cbmV4cG9ydCBjb25zdCBoYXNGb3JjZVJlZnJlc2ggPSAoc2VhcmNoOiBzdHJpbmcpOiBib29sZWFuID0+IHtcbiAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyhzZWFyY2gpXG4gIHJldHVybiAhIXBhcmFtcy5nZXQoUkVGUkVTSF9LRVkpXG59XG5cbmV4cG9ydCBjb25zdCByZW1vdmVGb3JjZVJlZnJlc2ggPSAoc2VhcmNoOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHNlYXJjaClcbiAgaWYgKHBhcmFtcy5nZXQoUkVGUkVTSF9LRVkpKSB7XG4gICAgcGFyYW1zLmRlbGV0ZShSRUZSRVNIX0tFWSlcbiAgfVxuICByZXR1cm4gcGFyYW1zLnRvU3RyaW5nKClcbn1cbiIsIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9leHBsaWNpdC1mdW5jdGlvbi1yZXR1cm4tdHlwZSAqL1xuaW1wb3J0IHsgdXNlTmF2aWdhdGUsIHVzZUxvY2F0aW9uIH0gZnJvbSAncmVhY3Qtcm91dGVyJ1xuaW1wb3J0IHsgQWN0aW9uUmVzcG9uc2UgfSBmcm9tICcuLi8uLi8uLi9iYWNrZW5kL2FjdGlvbnMvYWN0aW9uLmludGVyZmFjZSdcbmltcG9ydCB7IGFwcGVuZEZvcmNlUmVmcmVzaCB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvYWN0aW9ucy91dGlscy9hcHBlbmQtZm9yY2UtcmVmcmVzaCdcbmltcG9ydCB7IEFjdGlvbkNhbGxDYWxsYmFjayB9IGZyb20gJy4nXG5pbXBvcnQgeyB1c2VOb3RpY2UgfSBmcm9tICcuLi91c2Utbm90aWNlJ1xuXG5leHBvcnQgY29uc3QgdXNlQWN0aW9uUmVzcG9uc2VIYW5kbGVyID0gKG9uQWN0aW9uQ2FsbD86IEFjdGlvbkNhbGxDYWxsYmFjaykgPT4ge1xuICBjb25zdCBsb2NhdGlvbiA9IHVzZUxvY2F0aW9uKClcbiAgY29uc3QgbmF2aWdhdGUgPSB1c2VOYXZpZ2F0ZSgpXG4gIGNvbnN0IGFkZE5vdGljZSA9IHVzZU5vdGljZSgpXG5cbiAgcmV0dXJuIChyZXNwb25zZTogQWN0aW9uUmVzcG9uc2UpID0+IHtcbiAgICBjb25zdCB7IGRhdGEgfSA9IHJlc3BvbnNlXG4gICAgaWYgKGRhdGEubm90aWNlKSB7XG4gICAgICBhZGROb3RpY2UoZGF0YS5ub3RpY2UpXG4gICAgfVxuICAgIGlmIChkYXRhLnJlZGlyZWN0VXJsICYmIGxvY2F0aW9uLnBhdGhuYW1lICE9PSBkYXRhLnJlZGlyZWN0VXJsKSB7XG4gICAgICBjb25zdCBhcHBlbmRlZCA9IGFwcGVuZEZvcmNlUmVmcmVzaChkYXRhLnJlZGlyZWN0VXJsKVxuICAgICAgbmF2aWdhdGUoYXBwZW5kZWQpXG4gICAgfVxuICAgIGlmIChvbkFjdGlvbkNhbGwpIHtcbiAgICAgIG9uQWN0aW9uQ2FsbChkYXRhKVxuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgdXNlTmF2aWdhdGUgfSBmcm9tICdyZWFjdC1yb3V0ZXInXG5cbmltcG9ydCB7IEFjdGlvblJlc3BvbnNlIH0gZnJvbSAnLi4vLi4vLi4vYmFja2VuZC9hY3Rpb25zL2FjdGlvbi5pbnRlcmZhY2UnXG5pbXBvcnQgeyBBY3Rpb25KU09OLCBidWlsZEFjdGlvbkNhbGxBcGlUcmlnZ2VyLCBidWlsZEFjdGlvbkNsaWNrSGFuZGxlciB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMnXG5pbXBvcnQgeyBEaWZmZXJlbnRBY3Rpb25QYXJhbXMsIEFjdGlvbkNhbGxDYWxsYmFjaywgVXNlQWN0aW9uUmVzdWx0IH0gZnJvbSAnLi91c2UtYWN0aW9uLnR5cGVzJ1xuaW1wb3J0IHsgYWN0aW9uSHJlZiB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvYWN0aW9uL2FjdGlvbi1ocmVmJ1xuaW1wb3J0IHsgdXNlQWN0aW9uUmVzcG9uc2VIYW5kbGVyIH0gZnJvbSAnLi91c2UtYWN0aW9uLXJlc3BvbnNlLWhhbmRsZXInXG5cbi8qKlxuICogQGxvYWQgLi91c2UtYWN0aW9uLmRvYy5tZFxuICogQHN1YmNhdGVnb3J5IEhvb2tzXG4gKlxuICogQHBhcmFtIHtBY3Rpb25KU09OfSAgIGFjdGlvbiAgICAgIGFjdGlvbiBvYmplY3RcbiAqIEBwYXJhbSB7QWN0aW9uUGFyYW1zfSBwYXJhbXNcbiAqIEBwYXJhbSB7QWN0aW9uQ2FsbENhbGxiYWNrfSBvbkFjdGlvbkNhbGwgLSBjYWxsYmFjayB0cmlnZ2VyZWQgd2hlbiBhY3Rpb24gaXMgcGVyZm9ybWVkXG4gKiBAcmV0dXJuIHtVc2VBY3Rpb25SZXN1bHR9XG4gKiBAY2xhc3NcbiAqIEBoaWRlY29uc3RydWN0b3JcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZUFjdGlvbjxLIGV4dGVuZHMgQWN0aW9uUmVzcG9uc2U+KFxuICBhY3Rpb246IEFjdGlvbkpTT04sXG4gIHBhcmFtczogRGlmZmVyZW50QWN0aW9uUGFyYW1zLFxuICBvbkFjdGlvbkNhbGw/OiBBY3Rpb25DYWxsQ2FsbGJhY2ssXG4pOiBVc2VBY3Rpb25SZXN1bHQ8Sz4ge1xuICBjb25zdCBuYXZpZ2F0ZSA9IHVzZU5hdmlnYXRlKClcblxuICBjb25zdCBhY3Rpb25SZXNwb25zZUhhbmRsZXIgPSB1c2VBY3Rpb25SZXNwb25zZUhhbmRsZXIob25BY3Rpb25DYWxsKVxuXG4gIGNvbnN0IGhyZWYgPSBhY3Rpb25IcmVmKGFjdGlvbiwgcGFyYW1zKVxuXG4gIGNvbnN0IGNhbGxBcGkgPSBidWlsZEFjdGlvbkNhbGxBcGlUcmlnZ2VyPEs+KHtcbiAgICBhY3Rpb24sXG4gICAgcGFyYW1zLFxuICAgIGFjdGlvblJlc3BvbnNlSGFuZGxlcixcbiAgfSlcblxuICBjb25zdCBoYW5kbGVDbGljayA9IGJ1aWxkQWN0aW9uQ2xpY2tIYW5kbGVyKHtcbiAgICBhY3Rpb24sXG4gICAgcGFyYW1zLFxuICAgIGFjdGlvblJlc3BvbnNlSGFuZGxlcixcbiAgICBuYXZpZ2F0ZSxcbiAgfSlcblxuICByZXR1cm4ge1xuICAgIGhyZWYsXG4gICAgY2FsbEFwaSxcbiAgICBoYW5kbGVDbGljayxcbiAgfVxufVxuIiwiaW1wb3J0IHsgQ3VycmVudEFkbWluIH0gZnJvbSAnLi4vLi4vLi4vY3VycmVudC1hZG1pbi5pbnRlcmZhY2UnXG5cbmV4cG9ydCBjb25zdCBTRVNTSU9OX0lOSVRJQUxJWkUgPSAnU0VTU0lPTl9JTklUSUFMSVpFJ1xuXG5leHBvcnQgdHlwZSBTZXRDdXJyZW50QWRtaW5SZXNwb25zZSA9IHtcbiAgdHlwZTogdHlwZW9mIFNFU1NJT05fSU5JVElBTElaRTtcbiAgZGF0YTogQ3VycmVudEFkbWluIHwgbnVsbDtcbn1cblxuZXhwb3J0IGNvbnN0IHNldEN1cnJlbnRBZG1pbiA9IChkYXRhOiBDdXJyZW50QWRtaW4gfCBudWxsID0gbnVsbCk6IFNldEN1cnJlbnRBZG1pblJlc3BvbnNlID0+ICh7XG4gIHR5cGU6IFNFU1NJT05fSU5JVElBTElaRSxcbiAgZGF0YSxcbn0pXG4iLCJpbXBvcnQgeyB1c2VEaXNwYXRjaCwgdXNlU2VsZWN0b3IgfSBmcm9tICdyZWFjdC1yZWR1eCdcbmltcG9ydCB7IFJlZHV4U3RhdGUgfSBmcm9tICcuLi9zdG9yZS9zdG9yZSdcbmltcG9ydCB7IHNldEN1cnJlbnRBZG1pbiB9IGZyb20gJy4uL3N0b3JlL2FjdGlvbnMvc2V0LWN1cnJlbnQtYWRtaW4nXG5pbXBvcnQgeyBDdXJyZW50QWRtaW4gfSBmcm9tICcuLi8uLi9jdXJyZW50LWFkbWluLmludGVyZmFjZSdcblxuZXhwb3J0IHR5cGUgVXNlQ3VycmVudEFkbWluUmVzcG9uc2UgPSBbXG4gIEN1cnJlbnRBZG1pbiB8IG51bGwsXG4gIChjdXJyZW50QWRtaW46IEN1cnJlbnRBZG1pbiB8IG51bGwpID0+IEN1cnJlbnRBZG1pbiB8IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG5dXG5cbi8qKlxuICogQGNsYXNzZGVzY1xuICogSG9vayB3aGljaCBhbGxvd3MgeW91IHRvIGdldCBhbmQgc2V0IGN1cnJlbnRBZG1pblxuICpcbiAqICMjIyBVc2FnZVxuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIGltcG9ydCB7IHVzZUN1cnJlbnRBZG1pbiB9IGZyb20gJ2FkbWluanMnXG4gKlxuICogY29uc3QgbXlDb21wb25lbnQgPSAoKSA9PiB7XG4gKiAgIGNvbnN0IFtjdXJyZW50QWRtaW4sIHNldEN1cnJlbnRBZG1pbl0gPSB1c2VDdXJyZW50QWRtaW4oKVxuICogICAvLyAuLi5cbiAqIH1cbiAqIGBgYFxuICpcbiAqIEBjbGFzc1xuICogQHN1YmNhdGVnb3J5IEhvb2tzXG4gKiBAYnVuZGxlXG4gKiBAcmV0dXJucyB7VXNlQ3VycmVudEFkbWluUmVzcG9uc2V9XG4gKiBAaGlkZWNvbnN0cnVjdG9yXG4gKi9cbmZ1bmN0aW9uIHVzZUN1cnJlbnRBZG1pbigpOiBVc2VDdXJyZW50QWRtaW5SZXNwb25zZSB7XG4gIGNvbnN0IGN1cnJlbnRBZG1pbiA9IHVzZVNlbGVjdG9yKChzdGF0ZTogUmVkdXhTdGF0ZSkgPT4gc3RhdGUuc2Vzc2lvbilcbiAgY29uc3QgZGlzcGF0Y2ggPSB1c2VEaXNwYXRjaCgpXG4gIHJldHVybiBbXG4gICAgY3VycmVudEFkbWluLFxuICAgIChhZG1pbjogQ3VycmVudEFkbWluIHwgbnVsbCk6IGFueSA9PiBkaXNwYXRjaChzZXRDdXJyZW50QWRtaW4oYWRtaW4pKSxcbiAgXVxufVxuXG5leHBvcnQge1xuICB1c2VDdXJyZW50QWRtaW4sXG4gIHVzZUN1cnJlbnRBZG1pbiBhcyBkZWZhdWx0LFxufVxuXG4vKipcbiAqIFJlc3VsdCBvZiB0aGUge0BsaW5rIHVzZUN1cnJlbnRBZG1pbn0uXG4gKiBJdCBpcyBhIHR1cGxlIGNvbnRhaW5pbmcgdmFsdWUgYW5kIHRoZSBzZXR0ZXJcbiAqXG4gKiBAdHlwZWRlZiB7QXJyYXl9IFVzZUN1cnJlbnRBZG1pblJlc3BvbnNlXG4gKiBAbWVtYmVyb2YgdXNlQ3VycmVudEFkbWluXG4gKiBAYWxpYXMgVXNlQ3VycmVudEFkbWluUmVzcG9uc2VcbiAqIEBwcm9wZXJ0eSB7Q3VycmVudEFkbWluIHwgbnVsbH0gWzBdICAgIGN1cnJlbnQgYWRtaW5cbiAqIEBwcm9wZXJ0eSB7UmVhY3QuRGlzcGF0Y2g8UmVhY3QuU2V0U3RhdGVBY3Rpb248Q3VycmVudEFkbWluPj59IFsxXSAgICB2YWx1ZSBzZXR0ZXIgY29tcGF0aWJsZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggcmVhY3QgdXNlU3RhdGVcbiAqL1xuIiwiLyogZXNsaW50LWRpc2FibGUgbm8tY29uc29sZSAqL1xuaW1wb3J0IFJlYWN0LCB7IHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBVc2VMb2NhbFN0b3JhZ2VSZXN1bHQgfSBmcm9tICcuL3VzZS1sb2NhbC1zdG9yYWdlLXJlc3VsdC50eXBlJ1xuXG4vKipcbiAqIEBsb2FkIC4vdXNlLWxvY2FsLXN0b3JhZ2UuZG9jLm1kXG4gKiBAc3ViY2F0ZWdvcnkgSG9va3NcbiAqIEBjbGFzc1xuICogQHNlZSBodHRwczovL3VzZWhvb2tzLmNvbS91c2VMb2NhbFN0b3JhZ2VcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5ICAgICAgICAgIGtleSB1bmRlciB3aGljaCBob29rIHdpbGwgc3RvcmUgdGhlIGRhdGFcbiAqIEBwYXJhbSB7VH0gICAgICBpbml0aWFsVmFsdWUgICAgdmFsdWUgd2hpY2ggd2lsbCBiZSBzdHJpbmdpZmllZCBhbmQgc3RvcmVkXG4gKiBAcmV0dXJuIHtVc2VMb2NhbFN0b3JhZ2VSZXN1bHQ8VD59XG4gKiBAYnVuZGxlXG4gKiBAdHlwZSB7RnVuY3Rpb259XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VMb2NhbFN0b3JhZ2U8VD4oa2V5OiBzdHJpbmcsIGluaXRpYWxWYWx1ZTogVCk6IFVzZUxvY2FsU3RvcmFnZVJlc3VsdDxUPiB7XG4gIC8vIFN0YXRlIHRvIHN0b3JlIG91ciB2YWx1ZVxuICAvLyBQYXNzIGluaXRpYWwgc3RhdGUgZnVuY3Rpb24gdG8gdXNlU3RhdGUgc28gbG9naWMgaXMgb25seSBleGVjdXRlZCBvbmNlXG4gIGNvbnN0IFtzdG9yZWRWYWx1ZSwgc2V0U3RvcmVkVmFsdWVdID0gdXNlU3RhdGU8VD4oKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICAvLyBHZXQgZnJvbSBsb2NhbCBzdG9yYWdlIGJ5IGtleVxuICAgICAgY29uc3QgaXRlbSA9IHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXkpXG4gICAgICAvLyBQYXJzZSBzdG9yZWQganNvbiBvciBpZiBub25lIHJldHVybiBpbml0aWFsVmFsdWVcbiAgICAgIHJldHVybiBpdGVtID8gSlNPTi5wYXJzZShpdGVtKSA6IGluaXRpYWxWYWx1ZVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBJZiBlcnJvciBhbHNvIHJldHVybiBpbml0aWFsVmFsdWVcbiAgICAgIGNvbnNvbGUubG9nKGVycm9yKVxuICAgICAgcmV0dXJuIGluaXRpYWxWYWx1ZVxuICAgIH1cbiAgfSlcblxuICAvLyBSZXR1cm4gYSB3cmFwcGVkIHZlcnNpb24gb2YgdXNlU3RhdGUncyBzZXR0ZXIgZnVuY3Rpb24gdGhhdCAuLi5cbiAgLy8gLi4uIHBlcnNpc3RzIHRoZSBuZXcgdmFsdWUgdG8gbG9jYWxTdG9yYWdlLlxuICBjb25zdCBzZXRWYWx1ZTogUmVhY3QuRGlzcGF0Y2g8UmVhY3QuU2V0U3RhdGVBY3Rpb248VD4+ID0gKHZhbHVlKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEFsbG93IHZhbHVlIHRvIGJlIGEgZnVuY3Rpb24gc28gd2UgaGF2ZSBzYW1lIEFQSSBhcyB1c2VTdGF0ZVxuICAgICAgY29uc3QgdmFsdWVUb1N0b3JlID0gdmFsdWUgaW5zdGFuY2VvZiBGdW5jdGlvbiA/IHZhbHVlKHN0b3JlZFZhbHVlKSA6IHZhbHVlXG4gICAgICAvLyBTYXZlIHN0YXRlXG4gICAgICBzZXRTdG9yZWRWYWx1ZSh2YWx1ZVRvU3RvcmUpXG4gICAgICAvLyBTYXZlIHRvIGxvY2FsIHN0b3JhZ2VcbiAgICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbShrZXksIEpTT04uc3RyaW5naWZ5KHZhbHVlVG9TdG9yZSkpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIEEgbW9yZSBhZHZhbmNlZCBpbXBsZW1lbnRhdGlvbiB3b3VsZCBoYW5kbGUgdGhlIGVycm9yIGNhc2VcbiAgICAgIGNvbnNvbGUubG9nKGVycm9yKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBbc3RvcmVkVmFsdWUsIHNldFZhbHVlXVxufVxuXG5leHBvcnQgZGVmYXVsdCB1c2VMb2NhbFN0b3JhZ2VcbiIsImltcG9ydCB7IHVzZU5hdmlnYXRlLCB1c2VMb2NhdGlvbiB9IGZyb20gJ3JlYWN0LXJvdXRlcidcbi8qIGVzbGludC1kaXNhYmxlIG5vLXBhcmFtLXJlYXNzaWduICovXG5pbXBvcnQge1xuICBOYXZpZ2F0aW9uUHJvcHMsXG4gIE5hdmlnYXRpb25FbGVtZW50UHJvcHMsXG4gIE5hdmlnYXRpb25FbGVtZW50V2l0aENoaWxkcmVuUHJvcHMsXG59IGZyb20gJ0BhZG1pbmpzL2Rlc2lnbi1zeXN0ZW0nXG5pbXBvcnQgeyB1c2VNZW1vIH0gZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBSZXNvdXJjZUpTT04gfSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuaW1wb3J0IHVzZUxvY2FsU3RvcmFnZSBmcm9tICcuL3VzZS1sb2NhbC1zdG9yYWdlL3VzZS1sb2NhbC1zdG9yYWdlJ1xuXG5jb25zdCBpc1NlbGVjdGVkID0gKGhyZWYsIGxvY2F0aW9uKTogYm9vbGVhbiA9PiB7XG4gIGNvbnN0IHJlZ0V4cCA9IG5ldyBSZWdFeHAoYCR7aHJlZn0oJHwvKWApXG4gIHJldHVybiAhIWxvY2F0aW9uLnBhdGhuYW1lLm1hdGNoKHJlZ0V4cClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZU5hdmlnYXRpb25SZXNvdXJjZXMoXG4gIHJlc291cmNlczogQXJyYXk8UmVzb3VyY2VKU09OPixcbik6IE5hdmlnYXRpb25Qcm9wc1snZWxlbWVudHMnXSB7XG4gIGNvbnN0IFtvcGVuRWxlbWVudHMsIHNldE9wZW5FbGVtZW50c10gPSB1c2VMb2NhbFN0b3JhZ2U8UmVjb3JkPHN0cmluZywgYm9vbGVhbj4+KCdzaWRlYmFyRWxlbWVudHMnLCB7fSlcbiAgY29uc3QgbmF2aWdhdGUgPSB1c2VOYXZpZ2F0ZSgpXG4gIGNvbnN0IGxvY2F0aW9uID0gdXNlTG9jYXRpb24oKVxuXG4gIGNvbnN0IGVucmljaFJlc291cmNlID0gdXNlTWVtbygoKSA9PiAoXG4gICAgcmVzb3VyY2U6IFJlc291cmNlSlNPTixcbiAgICBpY29uPzogc3RyaW5nLFxuICApOiBOYXZpZ2F0aW9uRWxlbWVudFdpdGhDaGlsZHJlblByb3BzID0+ICh7XG4gICAgaHJlZjogcmVzb3VyY2UuaHJlZiB8fCB1bmRlZmluZWQsXG4gICAgaWNvbixcbiAgICBpc1NlbGVjdGVkOiBpc1NlbGVjdGVkKHJlc291cmNlLmhyZWYsIGxvY2F0aW9uKSxcbiAgICBsYWJlbDogcmVzb3VyY2UubmFtZSxcbiAgICBpZDogcmVzb3VyY2UuaWQsXG4gICAgb25DbGljazogKGV2ZW50KTogdm9pZCA9PiB7XG4gICAgICBpZiAocmVzb3VyY2UuaHJlZikge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgIG5hdmlnYXRlKHJlc291cmNlLmhyZWYpXG4gICAgICB9XG4gICAgfSxcbiAgfSksIFtsb2NhdGlvbiwgbmF2aWdhdGVdKVxuXG4gIC8vIGdyb3VwaW5nIHJlc291cmNlcyBpbnRvIHBhcmVudHNcbiAgY29uc3QgbWFwID0gcmVzb3VyY2VzXG4gICAgLy8gZmlyc3QgZmlsdGVyIG91dCByZXNvdXJjZXMgd2hpY2ggYXJlIG5vdCB2aXNpYmxlXG4gICAgLmZpbHRlcigocmVzKSA9PiByZXMuaHJlZiAmJiByZXMubmF2aWdhdGlvbj8uc2hvdyAhPT0gZmFsc2UpXG4gICAgLnJlZHVjZSgobWVtbywgcmVzb3VyY2UpID0+IHtcbiAgICAgIC8vIGluIGNhc2UgcmVzb3VyY2UgaGFzIHRoZSBzYW1lIG5hbWUgYXMgcGFyZW50IHdlIG5hbWVzcGFjZSBpdCB3aXQgXCJyZXNvdXJjZS1cIlwiXG4gICAgICBjb25zdCBrZXkgPSByZXNvdXJjZS5uYXZpZ2F0aW9uPy5uYW1lIHx8IFsncmVzb3VyY2UnLCByZXNvdXJjZS5uYW1lXS5qb2luKCctJylcblxuICAgICAgaWYgKCFyZXNvdXJjZS5uYXZpZ2F0aW9uIHx8IHJlc291cmNlLm5hdmlnYXRpb24ubmFtZSA9PT0gbnVsbCkge1xuICAgICAgICBtZW1vW2tleV0gPSBlbnJpY2hSZXNvdXJjZShyZXNvdXJjZSwgcmVzb3VyY2UubmF2aWdhdGlvbj8uaWNvbilcbiAgICAgIH0gZWxzZSBpZiAobWVtb1trZXldICYmIG1lbW9ba2V5XS5lbGVtZW50cyAmJiByZXNvdXJjZS5uYXZpZ2F0aW9uPy5uYW1lKSB7XG4gICAgICAgIChtZW1vW2tleV0uZWxlbWVudHMgYXMgQXJyYXk8TmF2aWdhdGlvbkVsZW1lbnRQcm9wcz4pLnB1c2goZW5yaWNoUmVzb3VyY2UocmVzb3VyY2UpKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbWVtb1trZXldID0ge1xuICAgICAgICAgIGVsZW1lbnRzOiBbZW5yaWNoUmVzb3VyY2UocmVzb3VyY2UpXSxcbiAgICAgICAgICBsYWJlbDogcmVzb3VyY2UubmF2aWdhdGlvbj8ubmFtZSxcbiAgICAgICAgICBpY29uOiByZXNvdXJjZS5uYXZpZ2F0aW9uPy5pY29uLFxuICAgICAgICAgIG9uQ2xpY2s6ICgpOiB2b2lkID0+IHNldE9wZW5FbGVtZW50cyh7XG4gICAgICAgICAgICAuLi5vcGVuRWxlbWVudHMsXG4gICAgICAgICAgICBba2V5XTogIW9wZW5FbGVtZW50c1trZXldLFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIGlzT3BlbjogISFvcGVuRWxlbWVudHNba2V5XSxcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG1lbW9cbiAgICB9LCB7fSBhcyBSZWNvcmQ8c3RyaW5nLCBOYXZpZ2F0aW9uRWxlbWVudFdpdGhDaGlsZHJlblByb3BzPilcblxuICByZXR1cm4gT2JqZWN0LnZhbHVlcyhtYXApXG59XG5cbmV4cG9ydCBkZWZhdWx0IHVzZU5hdmlnYXRpb25SZXNvdXJjZXNcbiIsImltcG9ydCB7IHVzZVN0YXRlLCB1c2VFZmZlY3QgfSBmcm9tICdyZWFjdCdcblxuaW1wb3J0IHsgQXhpb3NSZXNwb25zZSB9IGZyb20gJ2F4aW9zJ1xuaW1wb3J0IHsgdXNlTG9jYXRpb24sIHVzZU5hdmlnYXRlIH0gZnJvbSAncmVhY3Qtcm91dGVyJ1xuaW1wb3J0IHsgUmVjb3JkSlNPTiB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMnXG5pbXBvcnQgdXNlTm90aWNlIGZyb20gJy4uL3VzZS1ub3RpY2UnXG5pbXBvcnQgQXBpQ2xpZW50IGZyb20gJy4uLy4uL3V0aWxzL2FwaS1jbGllbnQnXG5pbXBvcnQgeyBMaXN0QWN0aW9uUmVzcG9uc2UgfSBmcm9tICcuLi8uLi8uLi9iYWNrZW5kL2FjdGlvbnMvbGlzdC9saXN0LWFjdGlvbidcbmltcG9ydCB7IHVzZVRyYW5zbGF0aW9uIH0gZnJvbSAnLi4vdXNlLXRyYW5zbGF0aW9uJ1xuaW1wb3J0IHsgaGFzRm9yY2VSZWZyZXNoLCByZW1vdmVGb3JjZVJlZnJlc2ggfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL2FjdGlvbnMvdXRpbHMvYXBwZW5kLWZvcmNlLXJlZnJlc2gnXG5pbXBvcnQgeyBVc2VSZWNvcmRzUmVzdWx0IH0gZnJvbSAnLi91c2UtcmVjb3Jkcy1yZXN1bHQudHlwZSdcblxuY29uc3QgYXBpID0gbmV3IEFwaUNsaWVudCgpXG5cbi8qKlxuICogQGxvYWQgLi91c2UtcmVjb3Jkcy5kb2MubWRcbiAqIEBzdWJjYXRlZ29yeSBIb29rc1xuICogQGNsYXNzXG4gKiBAaGlkZWNvbnN0cnVjdG9yXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHJlc291cmNlSWQgICAgICBpZCBvZiBhIHJlc291cmNlIGZvciB3aGljaCB5b3Ugd2FudCB0byBmZXRjaCByZWNvcmRzXG4gKiBAcmV0dXJuIHtVc2VSZWNvcmRzUmVzdWx0fVxuICogQGJ1bmRsZVxuICogQHR5cGUge0Z1bmN0aW9ufVxuICovXG5mdW5jdGlvbiB1c2VSZWNvcmRzKHJlc291cmNlSWQ6IHN0cmluZyk6IFVzZVJlY29yZHNSZXN1bHQge1xuICBjb25zdCBbcmVjb3Jkcywgc2V0UmVjb3Jkc10gPSB1c2VTdGF0ZTxBcnJheTxSZWNvcmRKU09OPj4oW10pXG4gIGNvbnN0IFtsb2FkaW5nLCBzZXRMb2FkaW5nXSA9IHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCBbcGVyUGFnZSwgc2V0UGVyUGFnZV0gPSB1c2VTdGF0ZSgxMClcbiAgY29uc3QgW3BhZ2UsIHNldFBhZ2VdID0gdXNlU3RhdGUoMSlcbiAgY29uc3QgW3RvdGFsLCBzZXRUb3RhbF0gPSB1c2VTdGF0ZSgwKVxuICBjb25zdCBbZGlyZWN0aW9uLCBzZXREaXJlY3Rpb25dID0gdXNlU3RhdGU8J2FzYyd8ICdkZXNjJz4oJ2FzYycpXG4gIGNvbnN0IFtzb3J0QnksIHNldFNvcnRCeV0gPSB1c2VTdGF0ZTxzdHJpbmcgfCB1bmRlZmluZWQ+KClcbiAgY29uc3QgbG9jYXRpb24gPSB1c2VMb2NhdGlvbigpXG4gIGNvbnN0IG5hdmlnYXRlID0gdXNlTmF2aWdhdGUoKVxuICBjb25zdCBhZGROb3RpY2UgPSB1c2VOb3RpY2UoKVxuICBjb25zdCB7IHRyYW5zbGF0ZU1lc3NhZ2UgfSA9IHVzZVRyYW5zbGF0aW9uKClcbiAgY29uc3Qgb25Ob3RpY2UgPSB1c2VOb3RpY2UoKVxuXG4gIGNvbnN0IGZldGNoRGF0YSA9ICgpOiBQcm9taXNlPEF4aW9zUmVzcG9uc2U8TGlzdEFjdGlvblJlc3BvbnNlPj4gPT4ge1xuICAgIHNldExvYWRpbmcodHJ1ZSlcbiAgICBjb25zdCBxdWVyeSA9IG5ldyBVUkxTZWFyY2hQYXJhbXMobG9jYXRpb24uc2VhcmNoKVxuXG4gICAgY29uc3QgcHJvbWlzZSA9IGFwaS5yZXNvdXJjZUFjdGlvbih7XG4gICAgICBhY3Rpb25OYW1lOiAnbGlzdCcsIHJlc291cmNlSWQsIHBhcmFtczogcXVlcnksXG4gICAgfSkgYXMgUHJvbWlzZTxBeGlvc1Jlc3BvbnNlPExpc3RBY3Rpb25SZXNwb25zZT4+XG5cbiAgICBwcm9taXNlLnRoZW4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCBsaXN0QWN0aW9uUmVzcG9uc2UgPSByZXNwb25zZS5kYXRhIGFzIExpc3RBY3Rpb25SZXNwb25zZVxuICAgICAgaWYgKGxpc3RBY3Rpb25SZXNwb25zZS5ub3RpY2UpIHtcbiAgICAgICAgb25Ob3RpY2UobGlzdEFjdGlvblJlc3BvbnNlLm5vdGljZSlcbiAgICAgIH1cbiAgICAgIGlmIChsaXN0QWN0aW9uUmVzcG9uc2UucmVkaXJlY3RVcmwpIHtcbiAgICAgICAgbmF2aWdhdGUobGlzdEFjdGlvblJlc3BvbnNlLnJlZGlyZWN0VXJsKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgc2V0UmVjb3JkcyhsaXN0QWN0aW9uUmVzcG9uc2UucmVjb3JkcylcbiAgICAgIHNldFBhZ2UobGlzdEFjdGlvblJlc3BvbnNlLm1ldGEucGFnZSlcbiAgICAgIHNldFBlclBhZ2UobGlzdEFjdGlvblJlc3BvbnNlLm1ldGEucGVyUGFnZSlcbiAgICAgIHNldFRvdGFsKGxpc3RBY3Rpb25SZXNwb25zZS5tZXRhLnRvdGFsKVxuICAgICAgc2V0RGlyZWN0aW9uKGxpc3RBY3Rpb25SZXNwb25zZS5tZXRhLmRpcmVjdGlvbilcbiAgICAgIHNldFNvcnRCeShsaXN0QWN0aW9uUmVzcG9uc2UubWV0YS5zb3J0QnkpXG4gICAgICBzZXRMb2FkaW5nKGZhbHNlKVxuICAgIH0pLmNhdGNoKCgpID0+IHtcbiAgICAgIGFkZE5vdGljZSh7XG4gICAgICAgIG1lc3NhZ2U6IHRyYW5zbGF0ZU1lc3NhZ2UoJ2Vycm9yRmV0Y2hpbmdSZWNvcmRzJywgcmVzb3VyY2VJZCksXG4gICAgICAgIHR5cGU6ICdlcnJvcicsXG4gICAgICB9KVxuICAgIH0pXG4gICAgcmV0dXJuIHByb21pc2VcbiAgfVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGhhc0ZvcmNlUmVmcmVzaChsb2NhdGlvbi5zZWFyY2gpKSB7XG4gICAgICBuYXZpZ2F0ZSh7XG4gICAgICAgIHBhdGhuYW1lOiBsb2NhdGlvbi5wYXRobmFtZSxcbiAgICAgICAgc2VhcmNoOiByZW1vdmVGb3JjZVJlZnJlc2gobG9jYXRpb24uc2VhcmNoKS50b1N0cmluZygpLFxuICAgICAgfSwgeyByZXBsYWNlOiB0cnVlIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgIGZldGNoRGF0YSgpXG4gICAgfVxuICB9LCBbcmVzb3VyY2VJZCwgbG9jYXRpb24uc2VhcmNoLCBsb2NhdGlvbi5zdGF0ZV0pXG5cbiAgcmV0dXJuIHtcbiAgICByZWNvcmRzLFxuICAgIGxvYWRpbmcsXG4gICAgcGFnZSxcbiAgICB0b3RhbCxcbiAgICBkaXJlY3Rpb24sXG4gICAgc29ydEJ5LFxuICAgIHBlclBhZ2UsXG4gICAgZmV0Y2hEYXRhLFxuICB9XG59XG5cbmV4cG9ydCB7XG4gIHVzZVJlY29yZHMgYXMgZGVmYXVsdCxcbiAgdXNlUmVjb3Jkcyxcbn1cbiIsImltcG9ydCB7IHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBSZWNvcmRKU09OIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcydcbmltcG9ydCB7IFVzZVNlbGVjdGVkUmVjb3Jkc1Jlc3VsdCB9IGZyb20gJy4vdXNlLXNlbGVjdGVkLXJlY29yZHMtcmVzdWx0LnR5cGUnXG5cbi8qKlxuICogQGxvYWQgLi91c2Utc2VsZWN0ZWQtcmVjb3Jkcy5kb2MubWRcbiAqIEBzdWJjYXRlZ29yeSBIb29rc1xuICogQGNsYXNzXG4gKiBAaGlkZWNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge0FycmF5PFJlY29yZEpTT04+fSByZWNvcmRzICAgICBMaXN0IG9mIHJlY29yZHMgb24gd2hpY2ggeW91IGNhbiBwZXJmb3JtIGBzZWxlY3RgIGFjdGlvblxuICogQHJldHVybiB7VXNlU2VsZWN0ZWRSZWNvcmRzUmVzdWx0fVxuICogQGJ1bmRsZVxuICogQHR5cGUge0Z1bmN0aW9ufVxuICovXG5mdW5jdGlvbiB1c2VTZWxlY3RlZFJlY29yZHMocmVjb3JkczogQXJyYXk8UmVjb3JkSlNPTj4pOiBVc2VTZWxlY3RlZFJlY29yZHNSZXN1bHQge1xuICBjb25zdCBbc2VsZWN0ZWRSZWNvcmRzLCBzZXRTZWxlY3RlZFJlY29yZHNdID0gdXNlU3RhdGU8QXJyYXk8UmVjb3JkSlNPTj4+KFtdKVxuXG4gIGNvbnN0IGhhbmRsZVNlbGVjdCA9IChyZWNvcmQ6IFJlY29yZEpTT04pOiB2b2lkID0+IHtcbiAgICBjb25zdCBzZWxlY3RlZEluZGV4ID0gc2VsZWN0ZWRSZWNvcmRzLmZpbmRJbmRleCgoc2VsZWN0ZWQpID0+IHNlbGVjdGVkLmlkID09PSByZWNvcmQuaWQpXG4gICAgaWYgKHNlbGVjdGVkSW5kZXggPCAwKSB7XG4gICAgICBzZXRTZWxlY3RlZFJlY29yZHMoWy4uLnNlbGVjdGVkUmVjb3JkcywgcmVjb3JkXSlcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgbmV3U2VsZWN0ZWRSZWNvcmRzID0gWy4uLnNlbGVjdGVkUmVjb3Jkc11cbiAgICAgIG5ld1NlbGVjdGVkUmVjb3Jkcy5zcGxpY2Uoc2VsZWN0ZWRJbmRleCwgMSlcbiAgICAgIHNldFNlbGVjdGVkUmVjb3JkcyhuZXdTZWxlY3RlZFJlY29yZHMpXG4gICAgfVxuICB9XG5cbiAgY29uc3QgaGFuZGxlU2VsZWN0QWxsID0gKCk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IG1pc3NpbmcgPSByZWNvcmRzLmZpbHRlcigocmVjb3JkKSA9PiAoXG4gICAgICAhc2VsZWN0ZWRSZWNvcmRzLmZpbmQoKHNlbGVjdGVkKSA9PiBzZWxlY3RlZC5pZCA9PT0gcmVjb3JkLmlkKVxuICAgICAgJiYgcmVjb3JkLmJ1bGtBY3Rpb25zLmxlbmd0aFxuICAgICkpXG4gICAgaWYgKG1pc3NpbmcubGVuZ3RoKSB7XG4gICAgICBzZXRTZWxlY3RlZFJlY29yZHMoWy4uLnNlbGVjdGVkUmVjb3JkcywgLi4ubWlzc2luZ10pXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IG5ld1NlbGVjdGVkUmVjb3JkcyA9IHNlbGVjdGVkUmVjb3Jkcy5maWx0ZXIoKHNlbGVjdGVkKSA9PiAoXG4gICAgICAgICFyZWNvcmRzLmZpbmQoKHJlY29yZCkgPT4gcmVjb3JkLmlkID09PSBzZWxlY3RlZC5pZClcbiAgICAgICkpXG4gICAgICBzZXRTZWxlY3RlZFJlY29yZHMobmV3U2VsZWN0ZWRSZWNvcmRzKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgaGFuZGxlU2VsZWN0LFxuICAgIGhhbmRsZVNlbGVjdEFsbCxcbiAgICBzZWxlY3RlZFJlY29yZHMsXG4gICAgc2V0U2VsZWN0ZWRSZWNvcmRzLFxuICB9XG59XG5cbmV4cG9ydCB7XG4gIHVzZVNlbGVjdGVkUmVjb3JkcyBhcyBkZWZhdWx0LFxuICB1c2VTZWxlY3RlZFJlY29yZHMsXG59XG4iLCJpbXBvcnQgeyB1c2VTZWxlY3RvciB9IGZyb20gJ3JlYWN0LXJlZHV4J1xuaW1wb3J0IHsgUmVzb3VyY2VKU09OIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9yZXNvdXJjZS1qc29uLmludGVyZmFjZSdcbmltcG9ydCB7IFJlZHV4U3RhdGUgfSBmcm9tICcuLi8uLi9zdG9yZS9zdG9yZSdcblxuLyoqXG4gKiBAbG9hZCAuL3VzZS1yZXNvdXJjZS5kb2MubWRcbiAqIEBzdWJjYXRlZ29yeSBIb29rc1xuICogQGNsYXNzXG4gKiBAaGlkZWNvbnN0cnVjdG9yXG4gKiBAYnVuZGxlXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVzb3VyY2VJZCAgICBJZCBvZiBhIHJlc291cmNlIHlvdSB3YW50IHRvIGdldFxuICovXG5jb25zdCB1c2VSZXNvdXJjZSA9IChyZXNvdXJjZUlkOiBzdHJpbmcpOiBSZXNvdXJjZUpTT04gfCB1bmRlZmluZWQgPT4ge1xuICBjb25zdCByZXNvdXJjZXMgPSB1c2VTZWxlY3Rvcigoc3RhdGU6IFJlZHV4U3RhdGUpID0+IHN0YXRlLnJlc291cmNlcylcblxuICBjb25zdCBmb3VuZFJlc291cmNlID0gcmVzb3VyY2VzLmZpbmQoKHJlc291cmNlKSA9PiByZXNvdXJjZS5pZCA9PT0gcmVzb3VyY2VJZClcblxuICByZXR1cm4gZm91bmRSZXNvdXJjZVxufVxuXG5leHBvcnQge1xuICB1c2VSZXNvdXJjZSBhcyBkZWZhdWx0LFxuICB1c2VSZXNvdXJjZSxcbn1cbiIsImltcG9ydCB0eXBlIHsgdXNlTG9jYXRpb24gfSBmcm9tICdyZWFjdC1yb3V0ZXInXG5cbmV4cG9ydCBjb25zdCBJTklUSUFMX1JPVVRFID0gJ0lOSVRJQUxfUk9VVEUnXG5leHBvcnQgY29uc3QgUk9VVEVfQ0hBTkdFRCA9ICdST1VURV9DSEFOR0VEJ1xuXG5leHBvcnQgdHlwZSBSb3V0ZUNoYW5nZWRSZXNwb25zZSA9IHtcbiAgdHlwZTogdHlwZW9mIFJPVVRFX0NIQU5HRUQ7XG4gIGRhdGE6IGFueTtcbn07XG5cbmV4cG9ydCBjb25zdCBpbml0aWFsaXplUm91dGUgPSAoXG4gIGxvY2F0aW9uOiBQYXJ0aWFsPFJldHVyblR5cGU8dHlwZW9mIHVzZUxvY2F0aW9uPj4sXG4pOiBSb3V0ZUNoYW5nZWRSZXNwb25zZSA9PiAoe1xuICB0eXBlOiBST1VURV9DSEFOR0VELFxuICBkYXRhOiBsb2NhdGlvbixcbn0pXG5cbmV4cG9ydCBjb25zdCBjaGFuZ2VSb3V0ZSA9IChcbiAgbG9jYXRpb246IFJldHVyblR5cGU8dHlwZW9mIHVzZUxvY2F0aW9uPixcbik6IFJvdXRlQ2hhbmdlZFJlc3BvbnNlID0+ICh7XG4gIHR5cGU6IFJPVVRFX0NIQU5HRUQsXG4gIGRhdGE6IGxvY2F0aW9uLFxufSlcbiIsImltcG9ydCB7IHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgdXNlRGlzcGF0Y2gsIHVzZVNlbGVjdG9yIH0gZnJvbSAncmVhY3QtcmVkdXgnXG5pbXBvcnQgeyB1c2VMb2NhdGlvbiB9IGZyb20gJ3JlYWN0LXJvdXRlcidcbmltcG9ydCB7IHVzZUxvY2FsU3RvcmFnZSB9IGZyb20gJy4uL2hvb2tzL3VzZS1sb2NhbC1zdG9yYWdlJ1xuaW1wb3J0IHsgUmVkdXhTdGF0ZSwgUm91dGVyUHJvcHMgfSBmcm9tICcuLi9zdG9yZSdcbmltcG9ydCB7IGNoYW5nZVJvdXRlLCBpbml0aWFsaXplUm91dGUgfSBmcm9tICcuLi9zdG9yZS9hY3Rpb25zL3JvdXRlLWNoYW5nZWQnXG5cbmNvbnN0IHVzZUhpc3RvcnlMaXN0ZW4gPSAoKTogdm9pZCA9PiB7XG4gIGNvbnN0IGxvY2F0aW9uID0gdXNlTG9jYXRpb24oKVxuICBjb25zdCBbc3RvcmVkUGF0aCwgc2V0U3RvcmVkUGF0aF0gPSB1c2VMb2NhbFN0b3JhZ2U8UGFydGlhbDx0eXBlb2YgbG9jYXRpb24+PigncHJldlBhZ2UnLCB7fSlcbiAgY29uc3QgeyB0byA9IHt9LCBmcm9tID0ge30gfSA9IHVzZVNlbGVjdG9yPFJlZHV4U3RhdGUsIFJvdXRlclByb3BzPigoc3RhdGUpID0+IHN0YXRlLnJvdXRlcilcbiAgY29uc3QgZGlzcGF0Y2ggPSB1c2VEaXNwYXRjaCgpXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoc3RvcmVkUGF0aCkge1xuICAgICAgZGlzcGF0Y2goaW5pdGlhbGl6ZVJvdXRlKHN0b3JlZFBhdGgpKVxuICAgIH1cbiAgfSwgW10pXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBwcmV2aW91c1BhdGggPSBbdG8ucGF0aG5hbWUsIHRvLnNlYXJjaF0uam9pbignJylcbiAgICBjb25zdCBjdXJyZW50UGF0aCA9IFtsb2NhdGlvbi5wYXRobmFtZSwgbG9jYXRpb24uc2VhcmNoXS5qb2luKCcnKVxuXG4gICAgaWYgKHByZXZpb3VzUGF0aCAhPT0gY3VycmVudFBhdGgpIHtcbiAgICAgIGRpc3BhdGNoKGNoYW5nZVJvdXRlKGxvY2F0aW9uKSlcbiAgICB9XG4gIH0sIFtsb2NhdGlvbl0pXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoZnJvbS5wYXRobmFtZSkge1xuICAgICAgc2V0U3RvcmVkUGF0aChmcm9tKVxuICAgIH1cbiAgfSwgW2Zyb21dKVxufVxuXG5leHBvcnQge1xuICB1c2VIaXN0b3J5TGlzdGVuLFxuICB1c2VIaXN0b3J5TGlzdGVuIGFzIGRlZmF1bHQsXG59XG4iLCJpbXBvcnQgUmVhY3QsIHsgRkMgfSBmcm9tICdyZWFjdCdcbmltcG9ydCB7IE5hdmlnYXRpb24gfSBmcm9tICdAYWRtaW5qcy9kZXNpZ24tc3lzdGVtJ1xuaW1wb3J0IHsgdXNlVHJhbnNsYXRpb24gfSBmcm9tICcuLi8uLi8uLi9ob29rcy91c2UtdHJhbnNsYXRpb24nXG5pbXBvcnQgeyBSZXNvdXJjZUpTT04gfSBmcm9tICcuLi8uLi8uLi9pbnRlcmZhY2VzJ1xuaW1wb3J0IGFsbG93T3ZlcnJpZGUgZnJvbSAnLi4vLi4vLi4vaG9jL2FsbG93LW92ZXJyaWRlJ1xuaW1wb3J0IHsgdXNlTmF2aWdhdGlvblJlc291cmNlcyB9IGZyb20gJy4uLy4uLy4uL2hvb2tzJ1xuXG4vKipcbiAqIEBhbGlhcyBTaWRlYmFyUmVzb3VyY2VTZWN0aW9uUHJvcHNcbiAqIEBtZW1iZXJvZiBTaWRlYmFyUmVzb3VyY2VTZWN0aW9uXG4gKi9cbmV4cG9ydCB0eXBlIFNpZGViYXJSZXNvdXJjZVNlY3Rpb25Qcm9wcyA9IHtcbiAgLyoqIExpc3Qgb2YgdGhlIHJlc291cmNlcyB3aGljaCBzaG91bGQgYmUgcmVuZGVyZWQgKi9cbiAgcmVzb3VyY2VzOiBBcnJheTxSZXNvdXJjZUpTT04+O1xufVxuXG4vKipcbiAqIEdyb3VwcyByZXNvdXJjZXMgYnkgc2VjdGlvbnMgYW5kIHJlbmRlcnMgdGhlIGxpc3QgaW4ge0BsaW5rIFNpZGViYXJ9XG4gKlxuICogIyMjIFVzYWdlXG4gKlxuICogYGBgXG4gKiBpbXBvcnQgeyBTaWRlYmFyUmVzb3VyY2VTZWN0aW9uIH0gZnJvbSAnYWRtaW5qc2BcbiAqIGBgYFxuICpcbiAqIEBjb21wb25lbnRcbiAqIEBzdWJjYXRlZ29yeSBBcHBsaWNhdGlvblxuICogQG5hbWUgU2lkZWJhclJlc291cmNlU2VjdGlvblxuICovXG5jb25zdCBTaWRlYmFyUmVzb3VyY2VTZWN0aW9uT3JpZ2luYWw6IEZDPFNpZGViYXJSZXNvdXJjZVNlY3Rpb25Qcm9wcz4gPSAoeyByZXNvdXJjZXMgfSkgPT4ge1xuICBjb25zdCBlbGVtZW50cyA9IHVzZU5hdmlnYXRpb25SZXNvdXJjZXMocmVzb3VyY2VzKVxuXG4gIGNvbnN0IHsgdHJhbnNsYXRlTGFiZWwgfSA9IHVzZVRyYW5zbGF0aW9uKClcblxuICByZXR1cm4gKFxuICAgIDxOYXZpZ2F0aW9uXG4gICAgICBsYWJlbD17dHJhbnNsYXRlTGFiZWwoJ25hdmlnYXRpb24nKX1cbiAgICAgIGVsZW1lbnRzPXtlbGVtZW50c31cbiAgICAvPlxuICApXG59XG5cbi8vIFJvbGx1cCBjYW5ub3QgaGFuZGxlIHR5cGUgZXhwb3J0cyB3ZWxsIC0gdGhhdCBpcyB3aHkgd2UgbmVlZCB0byBkbyB0aGlzIGhhY2sgd2l0aFxuLy8gZXhwb3J0aW5nIGRlZmF1bHQgYW5kIG5hbWVkIFNpZGViYXJSZXNvdXJjZVNlY3Rpb25cbmNvbnN0IFNpZGViYXJSZXNvdXJjZVNlY3Rpb24gPSBhbGxvd092ZXJyaWRlKFNpZGViYXJSZXNvdXJjZVNlY3Rpb25PcmlnaW5hbCwgJ1NpZGViYXJSZXNvdXJjZVNlY3Rpb24nKVxuXG5leHBvcnQgeyBTaWRlYmFyUmVzb3VyY2VTZWN0aW9uIH1cbmV4cG9ydCBkZWZhdWx0IFNpZGViYXJSZXNvdXJjZVNlY3Rpb25cbiIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCBzdHlsZWQgZnJvbSAnc3R5bGVkLWNvbXBvbmVudHMnXG5pbXBvcnQgeyB1c2VTZWxlY3RvciB9IGZyb20gJ3JlYWN0LXJlZHV4J1xuaW1wb3J0IHsgQm94LCBjc3NDbGFzcywgdGhlbWVHZXQgfSBmcm9tICdAYWRtaW5qcy9kZXNpZ24tc3lzdGVtJ1xuXG5pbXBvcnQgeyBCcmFuZGluZ09wdGlvbnMgfSBmcm9tICcuLi8uLi8uLi8uLi9hZG1pbmpzLW9wdGlvbnMuaW50ZXJmYWNlJ1xuaW1wb3J0IHsgUmVzb3VyY2VKU09OLCBQYWdlSlNPTiB9IGZyb20gJy4uLy4uLy4uL2ludGVyZmFjZXMnXG5cbmltcG9ydCBTaWRlYmFyQnJhbmRpbmcgZnJvbSAnLi9zaWRlYmFyLWJyYW5kaW5nJ1xuaW1wb3J0IFNpZGViYXJQYWdlcyBmcm9tICcuL3NpZGViYXItcGFnZXMnXG5pbXBvcnQgeyBSZWR1eFN0YXRlIH0gZnJvbSAnLi4vLi4vLi4vc3RvcmUvc3RvcmUnXG5pbXBvcnQgU2lkZWJhckZvb3RlciBmcm9tICcuL3NpZGViYXItZm9vdGVyJ1xuXG5pbXBvcnQgU2lkZWJhclJlc291cmNlU2VjdGlvbiBmcm9tICcuL3NpZGViYXItcmVzb3VyY2Utc2VjdGlvbidcbmltcG9ydCBhbGxvd092ZXJyaWRlIGZyb20gJy4uLy4uLy4uL2hvYy9hbGxvdy1vdmVycmlkZSdcblxudHlwZSBQcm9wcyA9IHtcbiAgaXNWaXNpYmxlOiBib29sZWFuO1xufTtcblxuY29uc3QgU3R5bGVkU2lkZWJhciA9IHN0eWxlZChCb3gpYFxuICB0cmFuc2l0aW9uOiBsZWZ0IDAuM3M7XG4gIHRvcDogMDtcbiAgYm90dG9tOiAwO1xuICBmbGV4LXNocmluazogMDtcbiAgb3ZlcmZsb3cteTogYXV0bztcblxuICAmLmhpZGRlbiB7XG4gICAgbGVmdDogLSR7dGhlbWVHZXQoJ3NpemVzJywgJ3NpZGViYXJXaWR0aCcpfTtcbiAgfVxuICAmLnZpc2libGUge1xuICAgIGxlZnQ6IDA7XG4gIH1cbmBcblxuU3R5bGVkU2lkZWJhci5kZWZhdWx0UHJvcHMgPSB7XG4gIHBvc2l0aW9uOiBbJ2Fic29sdXRlJywgJ2Fic29sdXRlJywgJ2Fic29sdXRlJywgJ2Fic29sdXRlJywgJ2luaGVyaXQnXSxcbiAgd2lkdGg6ICdzaWRlYmFyV2lkdGgnLFxuICBib3JkZXJSaWdodDogJ2RlZmF1bHQnLFxuICBkaXNwbGF5OiAnZmxleCcsXG4gIGZsZXhEaXJlY3Rpb246ICdjb2x1bW4nLFxuICB6SW5kZXg6IDUwLFxuICBiZzogJ3doaXRlJyxcbn1cblxuY29uc3QgU2lkZWJhck9yaWdpbmFsOiBSZWFjdC5GQzxQcm9wcz4gPSAocHJvcHMpID0+IHtcbiAgY29uc3QgeyBpc1Zpc2libGUgfSA9IHByb3BzXG4gIGNvbnN0IFticmFuZGluZywgcmVzb3VyY2VzLCBwYWdlc106IFtcbiAgICBCcmFuZGluZ09wdGlvbnMsXG4gICAgUmVzb3VyY2VKU09OW10sXG4gICAgUGFnZUpTT05bXVxuICBdID0gdXNlU2VsZWN0b3IoKHN0YXRlOiBSZWR1eFN0YXRlKSA9PiBbXG4gICAgc3RhdGUuYnJhbmRpbmcsXG4gICAgc3RhdGUucmVzb3VyY2VzLFxuICAgIHN0YXRlLnBhZ2VzLFxuICBdKVxuXG4gIHJldHVybiAoXG4gICAgPFN0eWxlZFNpZGViYXIgY2xhc3NOYW1lPXtpc1Zpc2libGUgPyAndmlzaWJsZScgOiAnaGlkZGVuJ30gZGF0YS1jc3M9XCJzaWRlYmFyXCI+XG4gICAgICA8U2lkZWJhckJyYW5kaW5nIGJyYW5kaW5nPXticmFuZGluZ30gLz5cbiAgICAgIDxCb3ggZmxleEdyb3c9ezF9IGNsYXNzTmFtZT17Y3NzQ2xhc3MoJ1Jlc291cmNlcycpfSBkYXRhLWNzcz1cInNpZGViYXItcmVzb3VyY2VzXCI+XG4gICAgICAgIDxTaWRlYmFyUmVzb3VyY2VTZWN0aW9uIHJlc291cmNlcz17cmVzb3VyY2VzfSAvPlxuICAgICAgPC9Cb3g+XG4gICAgICA8U2lkZWJhclBhZ2VzIHBhZ2VzPXtwYWdlc30gLz5cbiAgICAgIDxTaWRlYmFyRm9vdGVyIC8+XG4gICAgPC9TdHlsZWRTaWRlYmFyPlxuICApXG59XG5cbmNvbnN0IFNpZGViYXIgPSBhbGxvd092ZXJyaWRlKFNpZGViYXJPcmlnaW5hbCwgJ1NpZGViYXInKVxuXG5leHBvcnQgeyBTaWRlYmFyIH1cbmV4cG9ydCBkZWZhdWx0IFNpZGViYXJcbiIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IEN1cnJlbnRVc2VyTmF2LCBCb3gsIEN1cnJlbnRVc2VyTmF2UHJvcHMgfSBmcm9tICdAYWRtaW5qcy9kZXNpZ24tc3lzdGVtJ1xuXG5pbXBvcnQgeyBDdXJyZW50QWRtaW4gfSBmcm9tICcuLi8uLi8uLi9jdXJyZW50LWFkbWluLmludGVyZmFjZSdcbmltcG9ydCB7IHVzZVRyYW5zbGF0aW9uIH0gZnJvbSAnLi4vLi4vaG9va3MnXG5pbXBvcnQgYWxsb3dPdmVycmlkZSBmcm9tICcuLi8uLi9ob2MvYWxsb3ctb3ZlcnJpZGUnXG5cbmV4cG9ydCB0eXBlIExvZ2dlZEluUHJvcHMgPSB7XG4gIHNlc3Npb246IEN1cnJlbnRBZG1pbjtcbiAgcGF0aHM6IHtcbiAgICBsb2dvdXRQYXRoOiBzdHJpbmc7XG4gIH07XG59XG5cbmNvbnN0IExvZ2dlZEluOiBSZWFjdC5GQzxMb2dnZWRJblByb3BzPiA9IChwcm9wcykgPT4ge1xuICBjb25zdCB7IHNlc3Npb24sIHBhdGhzIH0gPSBwcm9wc1xuICBjb25zdCB7IHRyYW5zbGF0ZUJ1dHRvbiB9ID0gdXNlVHJhbnNsYXRpb24oKVxuXG4gIGNvbnN0IGRyb3BBY3Rpb25zOiBDdXJyZW50VXNlck5hdlByb3BzWydkcm9wQWN0aW9ucyddID0gW3tcbiAgICBsYWJlbDogdHJhbnNsYXRlQnV0dG9uKCdsb2dvdXQnKSxcbiAgICBvbkNsaWNrOiAoZXZlbnQ6IEV2ZW50KTogdm9pZCA9PiB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IHBhdGhzLmxvZ291dFBhdGhcbiAgICB9LFxuICAgIGljb246ICdMb2dvdXQnLFxuICB9XVxuICByZXR1cm4gKFxuICAgIDxCb3ggZmxleFNocmluaz17MH0gZGF0YS1jc3M9XCJsb2dnZWQtaW5cIj5cbiAgICAgIDxDdXJyZW50VXNlck5hdlxuICAgICAgICBuYW1lPXtzZXNzaW9uLmVtYWlsfVxuICAgICAgICB0aXRsZT17c2Vzc2lvbi50aXRsZX1cbiAgICAgICAgYXZhdGFyVXJsPXtzZXNzaW9uLmF2YXRhclVybH1cbiAgICAgICAgZHJvcEFjdGlvbnM9e2Ryb3BBY3Rpb25zfVxuICAgICAgLz5cbiAgICA8L0JveD5cbiAgKVxufVxuXG5jb25zdCBPdmVycmlkYWJsZUxvZ2dlZEluID0gYWxsb3dPdmVycmlkZShMb2dnZWRJbiwgJ0xvZ2dlZEluJylcblxuZXhwb3J0IHtcbiAgT3ZlcnJpZGFibGVMb2dnZWRJbiBhcyBkZWZhdWx0LFxuICBPdmVycmlkYWJsZUxvZ2dlZEluIGFzIExvZ2dlZEluLFxufVxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHN0eWxlZCBmcm9tICdzdHlsZWQtY29tcG9uZW50cydcbmltcG9ydCB7IGNzc0NsYXNzLCBUZXh0LCBCb3ggfSBmcm9tICdAYWRtaW5qcy9kZXNpZ24tc3lzdGVtJ1xuXG5pbXBvcnQgeyBWZXJzaW9uUHJvcHMgfSBmcm9tICcuLi8uLi8uLi9hZG1pbmpzLW9wdGlvbnMuaW50ZXJmYWNlJ1xuaW1wb3J0IHsgdXNlVHJhbnNsYXRpb24gfSBmcm9tICcuLi8uLi9ob29rcydcbmltcG9ydCBhbGxvd092ZXJyaWRlIGZyb20gJy4uLy4uL2hvYy9hbGxvdy1vdmVycmlkZSdcblxuZXhwb3J0IHR5cGUgUHJvcHMgPSB7XG4gIHZlcnNpb25zOiBWZXJzaW9uUHJvcHM7XG59XG5cbmNvbnN0IFZlcnNpb25JdGVtID0gc3R5bGVkKFRleHQpYFxuICBwYWRkaW5nOiAxMnB4IDI0cHggMTJweCAwO1xuYFxuXG5WZXJzaW9uSXRlbS5kZWZhdWx0UHJvcHMgPSB7XG4gIGRpc3BsYXk6IFsnbm9uZScsICdibG9jayddLFxuICBjb2xvcjogJ2dyZXkxMDAnLFxufVxuXG5jb25zdCBWZXJzaW9uOiBSZWFjdC5GQzxQcm9wcz4gPSAocHJvcHMpID0+IHtcbiAgY29uc3QgeyB2ZXJzaW9ucyB9ID0gcHJvcHNcbiAgY29uc3QgeyBhZG1pbiwgYXBwIH0gPSB2ZXJzaW9uc1xuXG4gIGNvbnN0IHsgdHJhbnNsYXRlTGFiZWwgfSA9IHVzZVRyYW5zbGF0aW9uKClcblxuICByZXR1cm4gKFxuICAgIDxCb3ggZmxleCBmbGV4R3Jvdz17MX0gcHk9XCJkZWZhdWx0XCIgcHg9XCJ4eGxcIiBjbGFzc05hbWU9e2Nzc0NsYXNzKCdWZXJzaW9uJyl9IGRhdGEtY3NzPVwidmVyc2lvblwiPlxuICAgICAge2FkbWluICYmIChcbiAgICAgICAgPFZlcnNpb25JdGVtPlxuICAgICAgICAgIHt0cmFuc2xhdGVMYWJlbCgnYWRtaW5WZXJzaW9uJywgeyB2ZXJzaW9uOiBhZG1pbiB9KX1cbiAgICAgICAgPC9WZXJzaW9uSXRlbT5cbiAgICAgICl9XG4gICAgICB7YXBwICYmIChcbiAgICAgICAgPFZlcnNpb25JdGVtPlxuICAgICAgICAgIHt0cmFuc2xhdGVMYWJlbCgnYXBwVmVyc2lvbicsIHsgdmVyc2lvbjogYXBwIH0pfVxuICAgICAgICA8L1ZlcnNpb25JdGVtPlxuICAgICAgKX1cbiAgICA8L0JveD5cbiAgKVxufVxuXG5jb25zdCBPdmVycmlkYWJsZVZlcnNpb24gPSBhbGxvd092ZXJyaWRlKFZlcnNpb24sICdWZXJzaW9uJylcblxuZXhwb3J0IHtcbiAgT3ZlcnJpZGFibGVWZXJzaW9uIGFzIGRlZmF1bHQsXG4gIE92ZXJyaWRhYmxlVmVyc2lvbiBhcyBWZXJzaW9uLFxufVxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgdXNlU2VsZWN0b3IgfSBmcm9tICdyZWFjdC1yZWR1eCdcbmltcG9ydCBzdHlsZWQgZnJvbSAnc3R5bGVkLWNvbXBvbmVudHMnXG5pbXBvcnQgeyBjc3NDbGFzcywgQm94LCBJY29uLCB0aGVtZUdldCB9IGZyb20gJ0BhZG1pbmpzL2Rlc2lnbi1zeXN0ZW0nXG5cbmltcG9ydCBhbGxvd092ZXJyaWRlIGZyb20gJy4uLy4uL2hvYy9hbGxvdy1vdmVycmlkZSdcbmltcG9ydCBMb2dnZWRJbiBmcm9tICcuL2xvZ2dlZC1pbidcbmltcG9ydCBWZXJzaW9uIGZyb20gJy4vdmVyc2lvbidcbmltcG9ydCB7IFJlZHV4U3RhdGUsIFBhdGhzIH0gZnJvbSAnLi4vLi4vc3RvcmUvc3RvcmUnXG5pbXBvcnQgeyBDdXJyZW50QWRtaW4gfSBmcm9tICcuLi8uLi8uLi9jdXJyZW50LWFkbWluLmludGVyZmFjZSdcbmltcG9ydCB7IFZlcnNpb25Qcm9wcyB9IGZyb20gJy4uLy4uLy4uL2FkbWluanMtb3B0aW9ucy5pbnRlcmZhY2UnXG5cbmNvbnN0IE5hdkJhciA9IHN0eWxlZChCb3gpYFxuICBoZWlnaHQ6ICR7KHsgdGhlbWUgfSk6IHN0cmluZyA9PiB0aGVtZS5zaXplcy5uYXZiYXJIZWlnaHR9O1xuICBib3JkZXItYm90dG9tOiAke3RoZW1lR2V0KCdib3JkZXJzJywgJ2RlZmF1bHQnKX07XG4gIGJhY2tncm91bmQ6ICR7KHsgdGhlbWUgfSk6IHN0cmluZyA9PiB0aGVtZS5jb2xvcnMud2hpdGV9O1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICBmbGV4LXNocmluazogMDtcbmBcblxuTmF2QmFyLmRlZmF1bHRQcm9wcyA9IHtcbiAgY2xhc3NOYW1lOiBjc3NDbGFzcygnTmF2QmFyJyksXG59XG5cbnR5cGUgUHJvcHMgPSB7XG4gIHRvZ2dsZVNpZGViYXI6ICgpID0+IHZvaWRcbn1cblxuY29uc3QgVG9wQmFyOiBSZWFjdC5GQzxQcm9wcz4gPSAocHJvcHMpID0+IHtcbiAgY29uc3QgeyB0b2dnbGVTaWRlYmFyIH0gPSBwcm9wc1xuICBjb25zdCBbc2Vzc2lvbiwgcGF0aHMsIHZlcnNpb25zXSA9IHVzZVNlbGVjdG9yKFxuICAgIChzdGF0ZTogUmVkdXhTdGF0ZSk6IFtDdXJyZW50QWRtaW4gfCBudWxsLCBQYXRocywgVmVyc2lvblByb3BzXSA9PiBbXG4gICAgICBzdGF0ZS5zZXNzaW9uLFxuICAgICAgc3RhdGUucGF0aHMsXG4gICAgICBzdGF0ZS52ZXJzaW9ucyxcbiAgICBdLFxuICApXG5cbiAgcmV0dXJuIChcbiAgICA8TmF2QmFyIGRhdGEtY3NzPVwidG9wYmFyXCI+XG4gICAgICA8Qm94XG4gICAgICAgIHB5PVwibGdcIlxuICAgICAgICBweD17WydkZWZhdWx0JywgJ2xnJ119XG4gICAgICAgIG9uQ2xpY2s9e3RvZ2dsZVNpZGViYXJ9XG4gICAgICAgIGRpc3BsYXk9e1snYmxvY2snLCAnYmxvY2snLCAnYmxvY2snLCAnYmxvY2snLCAnbm9uZSddfVxuICAgICAgICBzdHlsZT17eyBjdXJzb3I6ICdwb2ludGVyJyB9fVxuICAgICAgPlxuICAgICAgICA8SWNvbiBpY29uPVwiTWVudVwiIHNpemU9ezMyfSBjb2xvcj1cImdyZXkxMDBcIiAvPlxuICAgICAgPC9Cb3g+XG4gICAgICA8VmVyc2lvbiB2ZXJzaW9ucz17dmVyc2lvbnN9IC8+XG4gICAgICB7c2Vzc2lvbiAmJiBzZXNzaW9uLmVtYWlsID8gPExvZ2dlZEluIHNlc3Npb249e3Nlc3Npb259IHBhdGhzPXtwYXRoc30gLz4gOiAnJ31cbiAgICA8L05hdkJhcj5cbiAgKVxufVxuXG5jb25zdCBPdmVycmlkYWJsZVRvcGJhciA9IGFsbG93T3ZlcnJpZGU8UHJvcHM+KFRvcEJhciwgJ1RvcEJhcicpXG5cbmV4cG9ydCB7IE92ZXJyaWRhYmxlVG9wYmFyIGFzIGRlZmF1bHQsIE92ZXJyaWRhYmxlVG9wYmFyIGFzIFRvcEJhciB9XG4iLCJleHBvcnQgY29uc3QgRFJPUF9OT1RJQ0UgPSAnRFJPUF9OT1RJQ0UnXG5cbmV4cG9ydCB0eXBlIERyb3BOb3RpY2VSZXNwb25zZSA9IHtcbiAgdHlwZTogdHlwZW9mIERST1BfTk9USUNFO1xuICBkYXRhOiB7XG4gICAgbm90aWNlSWQ6IHN0cmluZztcbiAgfTtcbn1cblxuZXhwb3J0IGNvbnN0IGRyb3BOb3RpY2UgPSAobm90aWNlSWQ6IHN0cmluZyk6IERyb3BOb3RpY2VSZXNwb25zZSA9PiAoe1xuICB0eXBlOiAnRFJPUF9OT1RJQ0UnLFxuICBkYXRhOiB7IG5vdGljZUlkIH0sXG59KVxuIiwiZXhwb3J0IGNvbnN0IFNFVF9OT1RJQ0VfUFJPR1JFU1MgPSAnU0VUX05PVElDRV9QUk9HUkVTUydcblxuZXhwb3J0IHR5cGUgU2V0Tm90aWNlUHJvZ3Jlc3MgPSB7XG4gIG5vdGljZUlkOiBzdHJpbmc7XG4gIHByb2dyZXNzOiBudW1iZXI7XG59XG5cbmV4cG9ydCB0eXBlIFNldE5vdGljZVByb2dyZXNzUmVzcG9uc2UgPSB7XG4gIHR5cGU6IHR5cGVvZiBTRVRfTk9USUNFX1BST0dSRVNTO1xuICBkYXRhOiBTZXROb3RpY2VQcm9ncmVzcztcbn1cblxuZXhwb3J0IGNvbnN0IHNldE5vdGljZVByb2dyZXNzID0gKGRhdGE6IFNldE5vdGljZVByb2dyZXNzKTogU2V0Tm90aWNlUHJvZ3Jlc3NSZXNwb25zZSA9PiAoe1xuICB0eXBlOiBTRVRfTk9USUNFX1BST0dSRVNTLFxuICBkYXRhLFxufSlcbiIsImltcG9ydCBSZWFjdCwgeyBSZWFjdE5vZGUgfSBmcm9tICdyZWFjdCdcbmltcG9ydCB7IGNvbm5lY3QgfSBmcm9tICdyZWFjdC1yZWR1eCdcbmltcG9ydCB7IE1lc3NhZ2VCb3ggfSBmcm9tICdAYWRtaW5qcy9kZXNpZ24tc3lzdGVtJ1xuXG5pbXBvcnQgeyBOb3RpY2VNZXNzYWdlSW5TdGF0ZSwgUmVkdXhTdGF0ZSB9IGZyb20gJy4uLy4uL3N0b3JlL3N0b3JlJ1xuaW1wb3J0IHsgZHJvcE5vdGljZSB9IGZyb20gJy4uLy4uL3N0b3JlL2FjdGlvbnMvZHJvcC1ub3RpY2UnXG5pbXBvcnQgeyBzZXROb3RpY2VQcm9ncmVzcyB9IGZyb20gJy4uLy4uL3N0b3JlL2FjdGlvbnMvc2V0LW5vdGljZS1wcm9ncmVzcydcbmltcG9ydCBhbGxvd092ZXJyaWRlIGZyb20gJy4uLy4uL2hvYy9hbGxvdy1vdmVycmlkZSdcblxuY29uc3QgVElNRV9UT19ESVNBUFBFQVIgPSAzXG5cbmV4cG9ydCB0eXBlIE5vdGlmeVByb2dyZXNzID0gKG9wdGlvbnM6IHtcbiAgbm90aWNlSWQ6IHN0cmluZzsgcHJvZ3Jlc3M6IG51bWJlcjtcbn0pID0+IHZvaWRcblxuZXhwb3J0IHR5cGUgTm90aWNlRWxlbWVudFByb3BzID0ge1xuICBub3RpY2U6IE5vdGljZU1lc3NhZ2VJblN0YXRlO1xuICBkcm9wOiAoKSA9PiBhbnk7XG4gIG5vdGlmeVByb2dyZXNzOiBOb3RpZnlQcm9ncmVzcztcbn1cblxuZXhwb3J0IHR5cGUgTm90aWNlRWxlbWVudFN0YXRlID0ge1xuICBwcm9ncmVzczogbnVtYmVyO1xufVxuXG5leHBvcnQgY2xhc3MgTm90aWNlRWxlbWVudCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudDxOb3RpY2VFbGVtZW50UHJvcHMsIE5vdGljZUVsZW1lbnRTdGF0ZT4ge1xuICBwcml2YXRlIHRpbWVyOiBOb2RlSlMuVGltZW91dCB8IG51bGxcblxuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKVxuICAgIGNvbnN0IHsgbm90aWNlIH0gPSBwcm9wc1xuICAgIHRoaXMudGltZXIgPSBudWxsXG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgIHByb2dyZXNzOiBub3RpY2UucHJvZ3Jlc3MgfHwgMCxcbiAgICB9XG4gIH1cblxuICBjb21wb25lbnREaWRNb3VudCgpOiB2b2lkIHtcbiAgICBjb25zdCB7IGRyb3AsIG5vdGljZSwgbm90aWZ5UHJvZ3Jlc3MgfSA9IHRoaXMucHJvcHNcblxuICAgIHRoaXMudGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICB0aGlzLnNldFN0YXRlKChzdGF0ZSkgPT4ge1xuICAgICAgICBjb25zdCBwcm9ncmVzcyA9IHN0YXRlLnByb2dyZXNzICsgMTAwIC8gVElNRV9UT19ESVNBUFBFQVJcbiAgICAgICAgbm90aWZ5UHJvZ3Jlc3MoeyBub3RpY2VJZDogbm90aWNlLmlkLCBwcm9ncmVzcyB9KVxuICAgICAgICByZXR1cm4geyBwcm9ncmVzcyB9XG4gICAgICB9KVxuICAgIH0sIDEwMDApXG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLnRpbWVyKSB7XG4gICAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy50aW1lcilcbiAgICAgIH1cbiAgICAgIGRyb3AoKVxuICAgIH0sIDEwMDAgKiAoVElNRV9UT19ESVNBUFBFQVIgKyAxKSlcbiAgfVxuXG4gIGNvbXBvbmVudFdpbGxVbm1vdW50KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnRpbWVyKSB7XG4gICAgICBjbGVhckludGVydmFsKHRoaXMudGltZXIpXG4gICAgfVxuICB9XG5cbiAgcmVuZGVyKCk6IFJlYWN0Tm9kZSB7XG4gICAgY29uc3QgeyBub3RpY2UsIGRyb3AgfSA9IHRoaXMucHJvcHNcbiAgICByZXR1cm4gKFxuICAgICAgPE1lc3NhZ2VCb3hcbiAgICAgICAgc3R5bGU9e3sgbWluV2lkdGg6ICc0ODBweCcgfX1cbiAgICAgICAgbWVzc2FnZT17bm90aWNlLm1lc3NhZ2V9XG4gICAgICAgIHZhcmlhbnQ9e25vdGljZS50eXBlID09PSAnc3VjY2VzcycgPyAnc3VjY2VzcycgOiAnZGFuZ2VyJ31cbiAgICAgICAgb25DbG9zZUNsaWNrPXtkcm9wfVxuICAgICAgLz5cbiAgICApXG4gIH1cbn1cblxudHlwZSBOb3RpY2VCb3hQcm9wc0Zyb21TdGF0ZSA9IHtcbiAgbm90aWNlczogQXJyYXk8Tm90aWNlTWVzc2FnZUluU3RhdGU+O1xufVxuXG50eXBlIE5vdGljZUJveERpc3BhdGNoRnJvbVN0YXRlID0ge1xuICBkcm9wOiAobm90aWNlSWQ6IHN0cmluZykgPT4gdm9pZDtcbiAgbm90aWZ5UHJvZ3Jlc3M6IE5vdGlmeVByb2dyZXNzO1xufVxuXG5jb25zdCBOb3RpY2VCb3g6IFJlYWN0LkZDPE5vdGljZUJveFByb3BzRnJvbVN0YXRlICYgTm90aWNlQm94RGlzcGF0Y2hGcm9tU3RhdGU+ID0gKHByb3BzKSA9PiB7XG4gIGNvbnN0IHsgZHJvcCwgbm90aWNlcywgbm90aWZ5UHJvZ3Jlc3MgfSA9IHByb3BzXG4gIGNvbnN0IG5vdGljZSA9IG5vdGljZXMubGVuZ3RoID8gbm90aWNlc1tub3RpY2VzLmxlbmd0aCAtIDFdIDogbnVsbFxuICBpZiAobm90aWNlKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXYgZGF0YS10ZXN0aWQ9XCJub3RpY2Utd3JhcHBlclwiIGRhdGEtY3NzPVwibm90aWNlLXdyYXBwZXJcIj5cbiAgICAgICAgPE5vdGljZUVsZW1lbnRcbiAgICAgICAgICBrZXk9e25vdGljZS5pZH1cbiAgICAgICAgICBub3RpY2U9e25vdGljZX1cbiAgICAgICAgICBkcm9wPXsoKTogdm9pZCA9PiBkcm9wKG5vdGljZS5pZCl9XG4gICAgICAgICAgbm90aWZ5UHJvZ3Jlc3M9e25vdGlmeVByb2dyZXNzfVxuICAgICAgICAvPlxuICAgICAgPC9kaXY+XG4gICAgKVxuICB9XG4gIHJldHVybiAoXG4gICAgPGRpdiAvPlxuICApXG59XG5cbmNvbnN0IG1hcFN0YXRlVG9Qcm9wcyA9IChzdGF0ZTogUmVkdXhTdGF0ZSk6IE5vdGljZUJveFByb3BzRnJvbVN0YXRlID0+ICh7XG4gIG5vdGljZXM6IHN0YXRlLm5vdGljZXMsXG59KVxuXG5jb25zdCBtYXBEaXNwYXRjaFRvUHJvcHMgPSAoZGlzcGF0Y2gpOiBOb3RpY2VCb3hEaXNwYXRjaEZyb21TdGF0ZSA9PiAoe1xuICBkcm9wOiAobm90aWNlSWQ6IHN0cmluZyk6IHZvaWQgPT4gZGlzcGF0Y2goZHJvcE5vdGljZShub3RpY2VJZCkpLFxuICBub3RpZnlQcm9ncmVzczogKHtcbiAgICBub3RpY2VJZCwgcHJvZ3Jlc3MsXG4gIH0pOiB2b2lkID0+IGRpc3BhdGNoKHNldE5vdGljZVByb2dyZXNzKHsgbm90aWNlSWQsIHByb2dyZXNzIH0pKSxcbn0pXG5cbmNvbnN0IENvbm5lY3RlZE5vdGljZUJveCA9IGNvbm5lY3QobWFwU3RhdGVUb1Byb3BzLCBtYXBEaXNwYXRjaFRvUHJvcHMpKE5vdGljZUJveClcbmNvbnN0IE92ZXJyaWRhYmxlQ29ubmVjdGVkTm90aWNlQm94ID0gYWxsb3dPdmVycmlkZShDb25uZWN0ZWROb3RpY2VCb3gsICdOb3RpY2VCb3gnKVxuXG5leHBvcnQge1xuICBPdmVycmlkYWJsZUNvbm5lY3RlZE5vdGljZUJveCBhcyBkZWZhdWx0LFxuICBPdmVycmlkYWJsZUNvbm5lY3RlZE5vdGljZUJveCBhcyBOb3RpY2VCb3gsXG59XG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgc3R5bGVkIGZyb20gJ3N0eWxlZC1jb21wb25lbnRzJ1xuaW1wb3J0IHtcbiAgQm94LFxuICBIMixcbiAgSDUsXG4gIEg0LFxuICBUZXh0LFxuICBJbGx1c3RyYXRpb24sXG4gIElsbHVzdHJhdGlvblByb3BzLFxuICBCdXR0b24sXG59IGZyb20gJ0BhZG1pbmpzL2Rlc2lnbi1zeXN0ZW0nXG5cbmltcG9ydCB7IHVzZVRyYW5zbGF0aW9uIH0gZnJvbSAnLi4vLi4vaG9va3MnXG5cbmNvbnN0IHBhZ2VIZWFkZXJIZWlnaHQgPSAyODRcbmNvbnN0IHBhZ2VIZWFkZXJQYWRkaW5nWSA9IDc0XG5jb25zdCBwYWdlSGVhZGVyUGFkZGluZ1ggPSAyNTBcblxuZXhwb3J0IGNvbnN0IERhc2hib2FyZEhlYWRlcjogUmVhY3QuRkMgPSAoKSA9PiB7XG4gIGNvbnN0IHsgdHJhbnNsYXRlTWVzc2FnZSB9ID0gdXNlVHJhbnNsYXRpb24oKVxuICByZXR1cm4gKFxuICAgIDxCb3ggcG9zaXRpb249XCJyZWxhdGl2ZVwiIG92ZXJmbG93PVwiaGlkZGVuXCIgZGF0YS1jc3M9XCJkZWZhdWx0LWRhc2hib2FyZFwiPlxuICAgICAgPEJveFxuICAgICAgICBwb3NpdGlvbj1cImFic29sdXRlXCJcbiAgICAgICAgdG9wPXs1MH1cbiAgICAgICAgbGVmdD17LTEwfVxuICAgICAgICBvcGFjaXR5PXtbMC4yLCAwLjQsIDFdfVxuICAgICAgICBhbmltYXRlXG4gICAgICA+XG4gICAgICAgIDxJbGx1c3RyYXRpb24gdmFyaWFudD1cIlJvY2tldFwiIC8+XG4gICAgICA8L0JveD5cbiAgICAgIDxCb3hcbiAgICAgICAgcG9zaXRpb249XCJhYnNvbHV0ZVwiXG4gICAgICAgIHRvcD17LTcwfVxuICAgICAgICByaWdodD17LTE1fVxuICAgICAgICBvcGFjaXR5PXtbMC4yLCAwLjQsIDFdfVxuICAgICAgICBhbmltYXRlXG4gICAgICA+XG4gICAgICAgIDxJbGx1c3RyYXRpb24gdmFyaWFudD1cIk1vb25cIiAvPlxuICAgICAgPC9Cb3g+XG4gICAgICA8Qm94XG4gICAgICAgIGJnPVwiZ3JleTEwMFwiXG4gICAgICAgIGhlaWdodD17cGFnZUhlYWRlckhlaWdodH1cbiAgICAgICAgcHk9e3BhZ2VIZWFkZXJQYWRkaW5nWX1cbiAgICAgICAgcHg9e1snZGVmYXVsdCcsICdsZycsIHBhZ2VIZWFkZXJQYWRkaW5nWF19XG4gICAgICA+XG4gICAgICAgIDxUZXh0IHRleHRBbGlnbj1cImNlbnRlclwiIGNvbG9yPVwid2hpdGVcIj5cbiAgICAgICAgICA8SDI+e3RyYW5zbGF0ZU1lc3NhZ2UoJ3dlbGNvbWVPbkJvYXJkX3RpdGxlJyl9PC9IMj5cbiAgICAgICAgICA8VGV4dCBvcGFjaXR5PXswLjh9PlxuICAgICAgICAgICAge3RyYW5zbGF0ZU1lc3NhZ2UoJ3dlbGNvbWVPbkJvYXJkX3N1YnRpdGxlJyl9XG4gICAgICAgICAgPC9UZXh0PlxuICAgICAgICA8L1RleHQ+XG4gICAgICA8L0JveD5cbiAgICA8L0JveD5cbiAgKVxufVxuXG50eXBlIEJveFR5cGUgPSB7XG4gIHZhcmlhbnQ6IHN0cmluZztcbiAgdGl0bGU6IHN0cmluZztcbiAgc3VidGl0bGU6IHN0cmluZztcbiAgaHJlZjogc3RyaW5nO1xufVxuXG5jb25zdCBib3hlcyA9ICh7IHRyYW5zbGF0ZU1lc3NhZ2UgfSk6IEFycmF5PEJveFR5cGU+ID0+IFt7XG4gIHZhcmlhbnQ6ICdQbGFuZXQnLFxuICB0aXRsZTogdHJhbnNsYXRlTWVzc2FnZSgnYWRkaW5nUmVzb3VyY2VzX3RpdGxlJyksXG4gIHN1YnRpdGxlOiB0cmFuc2xhdGVNZXNzYWdlKCdhZGRpbmdSZXNvdXJjZXNfc3VidGl0bGUnKSxcbiAgaHJlZjogJ2h0dHBzOi8vYWRtaW5qcy5jby90dXRvcmlhbC1wYXNzaW5nLXJlc291cmNlcy5odG1sJyxcbn0sIHtcbiAgdmFyaWFudDogJ0RvY3VtZW50Q2hlY2snLFxuICB0aXRsZTogdHJhbnNsYXRlTWVzc2FnZSgnY3VzdG9taXplUmVzb3VyY2VzX3RpdGxlJyksXG4gIHN1YnRpdGxlOiB0cmFuc2xhdGVNZXNzYWdlKCdjdXN0b21pemVSZXNvdXJjZXNfc3VidGl0bGUnKSxcbiAgaHJlZjogJ2h0dHBzOi8vYWRtaW5qcy5jby90dXRvcmlhbC1jdXN0b21pemluZy1yZXNvdXJjZXMuaHRtbCcsXG59LCB7XG4gIHZhcmlhbnQ6ICdEb2N1bWVudFNlYXJjaCcsXG4gIHRpdGxlOiB0cmFuc2xhdGVNZXNzYWdlKCdjdXN0b21pemVBY3Rpb25zX3RpdGxlJyksXG4gIHN1YnRpdGxlOiB0cmFuc2xhdGVNZXNzYWdlKCdjdXN0b21pemVBY3Rpb25zX3N1YnRpdGxlJyksXG4gIGhyZWY6ICdodHRwczovL2FkbWluanMuY28vdHV0b3JpYWwtYWN0aW9ucy5odG1sJyxcbn0sIHtcbiAgdmFyaWFudDogJ0ZsYWdJbkNvZycsXG4gIHRpdGxlOiB0cmFuc2xhdGVNZXNzYWdlKCd3cml0ZU93bkNvbXBvbmVudHNfdGl0bGUnKSxcbiAgc3VidGl0bGU6IHRyYW5zbGF0ZU1lc3NhZ2UoJ3dyaXRlT3duQ29tcG9uZW50c19zdWJ0aXRsZScpLFxuICBocmVmOiAnaHR0cHM6Ly9hZG1pbmpzLmNvL3R1dG9yaWFsLXdyaXRpbmctcmVhY3QtY29tcG9uZW50cy5odG1sJyxcbn0sIHtcbiAgdmFyaWFudDogJ0ZvbGRlcnMnLFxuICB0aXRsZTogdHJhbnNsYXRlTWVzc2FnZSgnY3VzdG9tRGFzaGJvYXJkX3RpdGxlJyksXG4gIHN1YnRpdGxlOiB0cmFuc2xhdGVNZXNzYWdlKCdjdXN0b21EYXNoYm9hcmRfc3VidGl0bGUnKSxcbiAgaHJlZjogJ2h0dHBzOi8vYWRtaW5qcy5jby90dXRvcmlhbC1jdXN0b20tZGFzaGJvYXJkLmh0bWwnLFxufSwge1xuICB2YXJpYW50OiAnQXN0cm9uYXV0JyxcbiAgdGl0bGU6IHRyYW5zbGF0ZU1lc3NhZ2UoJ3JvbGVCYXNlZEFjY2Vzc190aXRsZScpLFxuICBzdWJ0aXRsZTogdHJhbnNsYXRlTWVzc2FnZSgncm9sZUJhc2VkQWNjZXNzX3N1YnRpdGxlJyksXG4gIGhyZWY6ICdodHRwczovL2FkbWluanMuY28vdHV0b3JpYWwtcmJhYy5odG1sJyxcbn1dXG5cbmNvbnN0IENhcmQgPSBzdHlsZWQoQm94KWBcbiAgZGlzcGxheTogJHsoeyBmbGV4IH0pOiBzdHJpbmcgPT4gKGZsZXggPyAnZmxleCcgOiAnYmxvY2snKX07XG4gIGNvbG9yOiAkeyh7IHRoZW1lIH0pOiBzdHJpbmcgPT4gdGhlbWUuY29sb3JzLmdyZXkxMDB9O1xuICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gIGJvcmRlcjogMXB4IHNvbGlkIHRyYW5zcGFyZW50O1xuICAmOmhvdmVyIHtcbiAgICBib3JkZXI6IDFweCBzb2xpZCAkeyh7IHRoZW1lIH0pOiBzdHJpbmcgPT4gdGhlbWUuY29sb3JzLnByaW1hcnkxMDB9O1xuICAgIGJveC1zaGFkb3c6ICR7KHsgdGhlbWUgfSk6IHN0cmluZyA9PiB0aGVtZS5zaGFkb3dzLmNhcmRIb3Zlcn07XG4gIH1cbmBcblxuQ2FyZC5kZWZhdWx0UHJvcHMgPSB7XG4gIHZhcmlhbnQ6ICd3aGl0ZScsXG4gIGJveFNoYWRvdzogJ2NhcmQnLFxufVxuXG5leHBvcnQgY29uc3QgRGFzaGJvYXJkOiBSZWFjdC5GQyA9ICgpID0+IHtcbiAgY29uc3QgeyB0cmFuc2xhdGVNZXNzYWdlLCB0cmFuc2xhdGVCdXR0b24gfSA9IHVzZVRyYW5zbGF0aW9uKClcbiAgcmV0dXJuIChcbiAgICA8Qm94PlxuICAgICAgPERhc2hib2FyZEhlYWRlciAvPlxuICAgICAgPEJveFxuICAgICAgICBtdD17Wyd4bCcsICd4bCcsICctMTAwcHgnXX1cbiAgICAgICAgbWI9XCJ4bFwiXG4gICAgICAgIG14PXtbMCwgMCwgMCwgJ2F1dG8nXX1cbiAgICAgICAgcHg9e1snZGVmYXVsdCcsICdsZycsICd4eGwnLCAnMCddfVxuICAgICAgICBwb3NpdGlvbj1cInJlbGF0aXZlXCJcbiAgICAgICAgZmxleFxuICAgICAgICBmbGV4RGlyZWN0aW9uPVwicm93XCJcbiAgICAgICAgZmxleFdyYXA9XCJ3cmFwXCJcbiAgICAgICAgd2lkdGg9e1sxLCAxLCAxLCAxMDI0XX1cbiAgICAgID5cbiAgICAgICAge2JveGVzKHsgdHJhbnNsYXRlTWVzc2FnZSB9KS5tYXAoKGJveCwgaW5kZXgpID0+IChcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3Qvbm8tYXJyYXktaW5kZXgta2V5XG4gICAgICAgICAgPEJveCBrZXk9e2luZGV4fSB3aWR0aD17WzEsIDEgLyAyLCAxIC8gMiwgMSAvIDNdfSBwPVwibGdcIj5cbiAgICAgICAgICAgIDxDYXJkIGFzPVwiYVwiIGhyZWY9e2JveC5ocmVmfSB0YXJnZXQ9XCJfYmxhbmtcIj5cbiAgICAgICAgICAgICAgPFRleHQgdGV4dEFsaWduPVwiY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgPElsbHVzdHJhdGlvblxuICAgICAgICAgICAgICAgICAgdmFyaWFudD17Ym94LnZhcmlhbnQgYXMgSWxsdXN0cmF0aW9uUHJvcHNbJ3ZhcmlhbnQnXX1cbiAgICAgICAgICAgICAgICAgIHdpZHRoPXsxMDB9XG4gICAgICAgICAgICAgICAgICBoZWlnaHQ9ezcwfVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPEg1IG10PVwibGdcIj57Ym94LnRpdGxlfTwvSDU+XG4gICAgICAgICAgICAgICAgPFRleHQ+e2JveC5zdWJ0aXRsZX08L1RleHQ+XG4gICAgICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgICAgIDwvQ2FyZD5cbiAgICAgICAgICA8L0JveD5cbiAgICAgICAgKSl9XG4gICAgICAgIDxCb3ggd2lkdGg9e1sxLCAxLCAxIC8gMl19IHA9XCJsZ1wiPlxuICAgICAgICAgIDxDYXJkIGFzPVwiYVwiIGZsZXggaHJlZj1cImh0dHBzOi8vam9pbi5zbGFjay5jb20vdC9hZG1pbmJyby9zaGFyZWRfaW52aXRlL3p0LWRqc3F4eHB6LV9ZQ1M4VU10UTlBZGU2RFB1TFI3WndcIiB0YXJnZXQ9XCJfYmxhbmtcIj5cbiAgICAgICAgICAgIDxCb3ggZmxleFNocmluaz17MH0+PElsbHVzdHJhdGlvbiB2YXJpYW50PVwiU2xhY2tMb2dvXCIgLz48L0JveD5cbiAgICAgICAgICAgIDxCb3ggbWw9XCJ4bFwiPlxuICAgICAgICAgICAgICA8SDQ+e3RyYW5zbGF0ZU1lc3NhZ2UoJ2NvbW11bml0eV90aXRsZScpfTwvSDQ+XG4gICAgICAgICAgICAgIDxUZXh0Pnt0cmFuc2xhdGVNZXNzYWdlKCdjb21tdW5pdHlfc3VidGl0bGUnKX08L1RleHQ+XG4gICAgICAgICAgICA8L0JveD5cbiAgICAgICAgICA8L0NhcmQ+XG4gICAgICAgIDwvQm94PlxuICAgICAgICA8Qm94IHdpZHRoPXtbMSwgMSwgMSAvIDJdfSBwPVwibGdcIj5cbiAgICAgICAgICA8Q2FyZCBhcz1cImFcIiBmbGV4IGhyZWY9XCJodHRwczovL2dpdGh1Yi5jb20vU29mdHdhcmVCcm90aGVycy9hZG1pbmpzL2lzc3Vlc1wiIHRhcmdldD1cIl9ibGFua1wiPlxuICAgICAgICAgICAgPEJveCBmbGV4U2hyaW5rPXswfT48SWxsdXN0cmF0aW9uIHZhcmlhbnQ9XCJHaXRodWJMb2dvXCIgLz48L0JveD5cbiAgICAgICAgICAgIDxCb3ggbWw9XCJ4bFwiPlxuICAgICAgICAgICAgICA8SDQ+e3RyYW5zbGF0ZU1lc3NhZ2UoJ2ZvdW5kQnVnX3RpdGxlJyl9PC9IND5cbiAgICAgICAgICAgICAgPFRleHQ+e3RyYW5zbGF0ZU1lc3NhZ2UoJ2ZvdW5kQnVnX3N1YnRpdGxlJyl9PC9UZXh0PlxuICAgICAgICAgICAgPC9Cb3g+XG4gICAgICAgICAgPC9DYXJkPlxuICAgICAgICA8L0JveD5cbiAgICAgICAgPEJveCB2YXJpYW50PVwid2hpdGVcIiBib3hTaGFkb3c9XCJjYXJkXCIgd2lkdGg9ezF9IG09XCJsZ1wiPlxuICAgICAgICAgIDxUZXh0IHRleHRBbGlnbj1cImNlbnRlclwiPlxuICAgICAgICAgICAgPElsbHVzdHJhdGlvbiB2YXJpYW50PVwiQWRtaW5KU0xvZ29cIiAvPlxuICAgICAgICAgICAgPEg0Pnt0cmFuc2xhdGVNZXNzYWdlKCduZWVkTW9yZVNvbHV0aW9uc190aXRsZScpfTwvSDQ+XG4gICAgICAgICAgICA8VGV4dD57dHJhbnNsYXRlTWVzc2FnZSgnbmVlZE1vcmVTb2x1dGlvbnNfc3VidGl0bGUnKX08L1RleHQ+XG4gICAgICAgICAgICA8VGV4dCBtdD1cInh4bFwiPlxuICAgICAgICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgICAgICAgYXM9XCJhXCJcbiAgICAgICAgICAgICAgICB2YXJpYW50PVwicHJpbWFyeVwiXG4gICAgICAgICAgICAgICAgaHJlZj1cImh0dHBzOi8vc2hhcmUuaHNmb3Jtcy5jb20vMUllZHZtRXo2Ukgyb3JoY0w2ZzJVSEE4b2M1YVwiXG4gICAgICAgICAgICAgICAgdGFyZ2V0PVwiX2JsYW5rXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHt0cmFuc2xhdGVCdXR0b24oJ2NvbnRhY3RVcycpfVxuICAgICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgICA8L1RleHQ+XG4gICAgICAgIDwvQm94PlxuICAgICAgPC9Cb3g+XG4gICAgPC9Cb3g+XG4gIClcbn1cblxuZXhwb3J0IGRlZmF1bHQgRGFzaGJvYXJkXG4iLCJpbXBvcnQgUmVhY3QsIHsgUmVhY3ROb2RlIH0gZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBUZXh0LCBNZXNzYWdlQm94IH0gZnJvbSAnQGFkbWluanMvZGVzaWduLXN5c3RlbSdcblxuaW1wb3J0IHsgdXNlVHJhbnNsYXRpb24gfSBmcm9tICcuLi8uLi9ob29rcydcblxudHlwZSBTdGF0ZSA9IHtcbiAgZXJyb3I6IGFueTtcbn1cblxuY29uc3QgRXJyb3JNZXNzYWdlOiBSZWFjdC5GQzxTdGF0ZT4gPSAoeyBlcnJvciB9KSA9PiB7XG4gIGNvbnN0IHsgdHJhbnNsYXRlTWVzc2FnZSB9ID0gdXNlVHJhbnNsYXRpb24oKVxuICByZXR1cm4gKFxuICAgIDxNZXNzYWdlQm94IG09XCJ4eGxcIiB2YXJpYW50PVwiZGFuZ2VyXCIgbWVzc2FnZT1cIkphdmFzY3JpcHQgRXJyb3JcIj5cbiAgICAgIDxUZXh0PntlcnJvci50b1N0cmluZygpfTwvVGV4dD5cbiAgICAgIDxUZXh0IG10PVwiZGVmYXVsdFwiPnt0cmFuc2xhdGVNZXNzYWdlKCdzZWVDb25zb2xlRm9yTW9yZScpfTwvVGV4dD5cbiAgICA8L01lc3NhZ2VCb3g+XG4gIClcbn1cblxuZXhwb3J0IGNsYXNzIEVycm9yQm91bmRhcnkgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQ8YW55LCBTdGF0ZT4ge1xuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKVxuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICBlcnJvcjogbnVsbCxcbiAgICB9XG4gIH1cblxuICBjb21wb25lbnREaWRDYXRjaChlcnJvcik6IHZvaWQge1xuICAgIHRoaXMuc2V0U3RhdGUoeyBlcnJvciB9KVxuICB9XG5cbiAgcmVuZGVyKCk6IFJlYWN0Tm9kZSB7XG4gICAgY29uc3QgeyBjaGlsZHJlbiB9ID0gdGhpcy5wcm9wc1xuXG4gICAgY29uc3QgeyBlcnJvciB9ID0gdGhpcy5zdGF0ZVxuXG4gICAgaWYgKGVycm9yICE9PSBudWxsKSB7XG4gICAgICByZXR1cm4gKDxFcnJvck1lc3NhZ2UgZXJyb3I9e2Vycm9yfSAvPilcbiAgICB9XG5cbiAgICByZXR1cm4gY2hpbGRyZW4gfHwgbnVsbFxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEVycm9yQm91bmRhcnlcbiIsImltcG9ydCBSZWFjdCwgeyBSZWFjdE5vZGUsIEZ1bmN0aW9uQ29tcG9uZW50IH0gZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBjb25uZWN0IH0gZnJvbSAncmVhY3QtcmVkdXgnXG5cbmltcG9ydCBEZWZhdWx0RGFzaGJvYXJkIGZyb20gJy4uL2FwcC9kZWZhdWx0LWRhc2hib2FyZCdcbmltcG9ydCBFcnJvckJvdW5kYXJ5IGZyb20gJy4uL2FwcC9lcnJvci1ib3VuZGFyeSdcbmltcG9ydCB7IFJlZHV4U3RhdGUgfSBmcm9tICcuLi8uLi9zdG9yZS9zdG9yZSdcbmltcG9ydCBhbGxvd092ZXJyaWRlIGZyb20gJy4uLy4uL2hvYy9hbGxvdy1vdmVycmlkZSdcblxuZGVjbGFyZSBjb25zdCBBZG1pbkpTOiB7XG4gIFVzZXJDb21wb25lbnRzOiBSZWNvcmQ8c3RyaW5nLCBGdW5jdGlvbkNvbXBvbmVudD47XG59XG5cbnR5cGUgU3RhdGUgPSB7XG4gIGlzQ2xpZW50OiBib29sZWFuO1xufVxuXG50eXBlIFByb3BzRnJvbVN0YXRlID0ge1xuICBkYXNoYm9hcmQ6IHtcbiAgICBjb21wb25lbnQ/OiBzdHJpbmc7XG4gIH07XG59XG5cbmNsYXNzIERhc2hib2FyZCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudDxQcm9wc0Zyb21TdGF0ZSwgU3RhdGU+IHtcbiAgY29uc3RydWN0b3IocHJvcHM6IFByb3BzRnJvbVN0YXRlKSB7XG4gICAgc3VwZXIocHJvcHMpXG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgIGlzQ2xpZW50OiBmYWxzZSxcbiAgICB9XG4gIH1cblxuICBjb21wb25lbnREaWRNb3VudCgpOiB2b2lkIHtcbiAgICB0aGlzLnNldFN0YXRlKHsgaXNDbGllbnQ6IHRydWUgfSlcbiAgfVxuXG4gIHJlbmRlcigpOiBSZWFjdE5vZGUge1xuICAgIGNvbnN0IHsgZGFzaGJvYXJkIH0gPSB0aGlzLnByb3BzXG4gICAgY29uc3QgeyBpc0NsaWVudCB9ID0gdGhpcy5zdGF0ZVxuICAgIGxldCBDb21wb25lbnRcbiAgICBpZiAoZGFzaGJvYXJkICYmIGRhc2hib2FyZC5jb21wb25lbnQgJiYgaXNDbGllbnRcbiAgICAgICAgJiYgQWRtaW5KUy5Vc2VyQ29tcG9uZW50c1tkYXNoYm9hcmQuY29tcG9uZW50XVxuICAgICkge1xuICAgICAgQ29tcG9uZW50ID0gQWRtaW5KUy5Vc2VyQ29tcG9uZW50c1tkYXNoYm9hcmQuY29tcG9uZW50XSBhcyBGdW5jdGlvbkNvbXBvbmVudFxuICAgIH0gZWxzZSB7XG4gICAgICBDb21wb25lbnQgPSBEZWZhdWx0RGFzaGJvYXJkXG4gICAgfVxuXG4gICAgcmV0dXJuIChcbiAgICAgIDxFcnJvckJvdW5kYXJ5PlxuICAgICAgICA8Q29tcG9uZW50IC8+XG4gICAgICA8L0Vycm9yQm91bmRhcnk+XG4gICAgKVxuICB9XG59XG5cbmNvbnN0IG1hcFN0YXRlVG9Qcm9wcyA9IChzdGF0ZTogUmVkdXhTdGF0ZSk6IFByb3BzRnJvbVN0YXRlID0+ICh7XG4gIGRhc2hib2FyZDogc3RhdGUuZGFzaGJvYXJkLFxufSlcblxuZXhwb3J0IGRlZmF1bHQgYWxsb3dPdmVycmlkZShjb25uZWN0KG1hcFN0YXRlVG9Qcm9wcykoRGFzaGJvYXJkKSwgJ0Rhc2hib2FyZFJvdXRlJylcbiIsImltcG9ydCB7IEJveCwgY3NzQ2xhc3MsIFRleHQgfSBmcm9tICdAYWRtaW5qcy9kZXNpZ24tc3lzdGVtJ1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgTGluayB9IGZyb20gJ3JlYWN0LXJvdXRlci1kb20nXG5pbXBvcnQgc3R5bGVkIGZyb20gJ3N0eWxlZC1jb21wb25lbnRzJ1xuXG5pbXBvcnQgVmlld0hlbHBlcnMgZnJvbSAnLi4vLi4vLi4vYmFja2VuZC91dGlscy92aWV3LWhlbHBlcnMvdmlldy1oZWxwZXJzJ1xuaW1wb3J0IGFsbG93T3ZlcnJpZGUgZnJvbSAnLi4vLi4vaG9jL2FsbG93LW92ZXJyaWRlJ1xuaW1wb3J0IHsgdXNlVHJhbnNsYXRpb24gfSBmcm9tICcuLi8uLi9ob29rcy91c2UtdHJhbnNsYXRpb24nXG5pbXBvcnQgeyBSZWNvcmRKU09OLCBSZXNvdXJjZUpTT04gfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzJ1xuaW1wb3J0IHsgZ2V0QWN0aW9uRWxlbWVudENzcyB9IGZyb20gJy4uLy4uL3V0aWxzJ1xuXG5leHBvcnQgY29uc3QgQnJlYWRjcnVtYkxpbmsgPSBzdHlsZWQoTGluaylgXG4gIGNvbG9yOiAkeyh7IHRoZW1lIH0pOiBzdHJpbmcgPT4gdGhlbWUuY29sb3JzLmdyZXk0MH07XG4gIGZvbnQtZmFtaWx5OiAkeyh7IHRoZW1lIH0pOiBzdHJpbmcgPT4gdGhlbWUuZm9udH07XG4gIGxpbmUtaGVpZ2h0OiAkeyh7IHRoZW1lIH0pOiBzdHJpbmcgPT4gdGhlbWUubGluZUhlaWdodHMuZGVmYXVsdH07XG4gIGZvbnQtc2l6ZTogJHsoeyB0aGVtZSB9KTogc3RyaW5nID0+IHRoZW1lLmZvbnRTaXplcy5kZWZhdWx0fTtcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuXG4gICY6aG92ZXIge1xuICAgIGNvbG9yOiAkeyh7IHRoZW1lIH0pOiBzdHJpbmcgPT4gdGhlbWUuY29sb3JzLnByaW1hcnkxMDB9O1xuICB9XG5cbiAgJjphZnRlciB7XG4gICAgY29udGVudDogJy8nO1xuICAgIHBhZGRpbmc6IDAgJHsoeyB0aGVtZSB9KTogc3RyaW5nID0+IHRoZW1lLnNwYWNlLmRlZmF1bHR9O1xuICB9XG5cbiAgJjpsYXN0LWNoaWxkIHtcbiAgICAmOmFmdGVyIHtcbiAgICAgIGNvbnRlbnQ6ICcnO1xuICAgIH1cbiAgfVxuYFxuXG5leHBvcnQgY29uc3QgQnJlYWRjcnVtYlRleHQgPSBzdHlsZWQoVGV4dClgXG4gIGNvbG9yOiAkeyh7IHRoZW1lIH0pOiBzdHJpbmcgPT4gdGhlbWUuY29sb3JzLmdyZXk0MH07XG4gIGZvbnQtZmFtaWx5OiAkeyh7IHRoZW1lIH0pOiBzdHJpbmcgPT4gdGhlbWUuZm9udH07XG4gIGZvbnQtd2VpZ2h0OiAkeyh7IHRoZW1lIH0pOiBzdHJpbmcgPT4gdGhlbWUuZm9udFdlaWdodHMubm9ybWFsLnRvU3RyaW5nKCl9O1xuICBsaW5lLWhlaWdodDogJHsoeyB0aGVtZSB9KTogc3RyaW5nID0+IHRoZW1lLmxpbmVIZWlnaHRzLmRlZmF1bHR9O1xuICBmb250LXNpemU6ICR7KHsgdGhlbWUgfSk6IHN0cmluZyA9PiB0aGVtZS5mb250U2l6ZXMuZGVmYXVsdH07XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgZGlzcGxheTogaW5saW5lO1xuXG4gICY6YWZ0ZXIge1xuICAgIGNvbnRlbnQ6ICcvJztcbiAgICBwYWRkaW5nOiAwICR7KHsgdGhlbWUgfSk6IHN0cmluZyA9PiB0aGVtZS5zcGFjZS5kZWZhdWx0fTtcbiAgfVxuXG4gICY6bGFzdC1jaGlsZCB7XG4gICAgJjphZnRlciB7XG4gICAgICBjb250ZW50OiAnJztcbiAgICB9XG4gIH1cbmBcblxuLyoqXG4gKiBAbWVtYmVyb2YgQnJlYWRjcnVtYnNcbiAqL1xuZXhwb3J0IHR5cGUgQnJlYWRjcnVtYlByb3BzID0ge1xuICAvKipcbiAgICogUmVzb3VyY2VcbiAgICovXG4gIHJlc291cmNlOiBSZXNvdXJjZUpTT05cbiAgLyoqXG4gICAqIHJlY29yZFxuICAgKi9cbiAgcmVjb3JkPzogUmVjb3JkSlNPTiB8IG51bGxcbiAgLyoqXG4gICAqIE5hbWUgb2YgYW4gYWN0aW9uXG4gICAqL1xuICBhY3Rpb25OYW1lOiBzdHJpbmdcbn1cblxuLyoqXG4gKiBAY29tcG9uZW50XG4gKiBAcHJpdmF0ZVxuICovXG5jb25zdCBCcmVhZGNydW1iczogUmVhY3QuRkM8QnJlYWRjcnVtYlByb3BzPiA9IChwcm9wcykgPT4ge1xuICBjb25zdCB7IHJlc291cmNlLCByZWNvcmQsIGFjdGlvbk5hbWUgfSA9IHByb3BzXG5cbiAgY29uc3QgbGlzdEFjdGlvbiA9IHJlc291cmNlLnJlc291cmNlQWN0aW9ucy5maW5kKCh7IG5hbWUgfSkgPT4gbmFtZSA9PT0gJ2xpc3QnKVxuICBjb25zdCBhY3Rpb24gPSByZXNvdXJjZS5hY3Rpb25zLmZpbmQoKGEpID0+IGEubmFtZSA9PT0gYWN0aW9uTmFtZSlcbiAgY29uc3QgaCA9IG5ldyBWaWV3SGVscGVycygpXG4gIGNvbnN0IHsgdHJhbnNsYXRlTGFiZWw6IHRsIH0gPSB1c2VUcmFuc2xhdGlvbigpXG4gIGNvbnN0IGNvbnRlbnRUYWcgPSBnZXRBY3Rpb25FbGVtZW50Q3NzKHJlc291cmNlLmlkLCBhY3Rpb25OYW1lLCAnYnJlYWRjcnVtYnMnKVxuICByZXR1cm4gKFxuICAgIDxCb3ggZmxleEdyb3c9ezF9IGNsYXNzTmFtZT17Y3NzQ2xhc3MoJ0JyZWFkY3J1bWJzJyl9IGRhdGEtY3NzPXtjb250ZW50VGFnfT5cbiAgICAgIDxCcmVhZGNydW1iTGluayB0bz17aC5kYXNoYm9hcmRVcmwoKX0+e3RsKCdkYXNoYm9hcmQnKX08L0JyZWFkY3J1bWJMaW5rPlxuICAgICAge2xpc3RBY3Rpb24gPyAoXG4gICAgICAgIDxCcmVhZGNydW1iTGluayB0bz17cmVzb3VyY2UuaHJlZiA/IHJlc291cmNlLmhyZWYgOiAnLyd9IGNsYXNzTmFtZT17cmVjb3JkID8gJ2lzLWFjdGl2ZScgOiAnJ30+XG4gICAgICAgICAge3Jlc291cmNlLm5hbWV9XG4gICAgICAgIDwvQnJlYWRjcnVtYkxpbms+XG4gICAgICApIDogKFxuICAgICAgICA8QnJlYWRjcnVtYlRleHQ+e3Jlc291cmNlLm5hbWV9PC9CcmVhZGNydW1iVGV4dD5cbiAgICAgICl9XG4gICAgICB7YWN0aW9uICYmIGFjdGlvbi5uYW1lICE9PSAnbGlzdCcgJiYgPEJyZWFkY3J1bWJMaW5rIHRvPVwiI1wiPnthY3Rpb24ubGFiZWx9PC9CcmVhZGNydW1iTGluaz59XG4gICAgPC9Cb3g+XG4gIClcbn1cblxuY29uc3QgT3ZlcnJpZGFibGVCcmVhZGNydW1icyA9IGFsbG93T3ZlcnJpZGUoQnJlYWRjcnVtYnMsICdCcmVhZGNydW1icycpXG5cbmV4cG9ydCB7IE92ZXJyaWRhYmxlQnJlYWRjcnVtYnMgYXMgZGVmYXVsdCwgT3ZlcnJpZGFibGVCcmVhZGNydW1icyBhcyBCcmVhZGNydW1icyB9XG4iLCJpbXBvcnQgeyBCdXR0b25Hcm91cFByb3BzLCBCdXR0b25Jbkdyb3VwUHJvcHMgfSBmcm9tICdAYWRtaW5qcy9kZXNpZ24tc3lzdGVtJ1xuXG5pbXBvcnQgeyBhY3Rpb25IcmVmLCBBY3Rpb25KU09OLCBidWlsZEFjdGlvblRlc3RJZCB9IGZyb20gJy4uLy4uLy4uL2ludGVyZmFjZXMnXG5pbXBvcnQgeyBEaWZmZXJlbnRBY3Rpb25QYXJhbXMgfSBmcm9tICcuLi8uLi8uLi9ob29rcydcblxuZXhwb3J0IHR5cGUgYWN0aW9uc1RvQnV0dG9uR3JvdXBPcHRpb25zID0ge1xuICBhY3Rpb25zOiBBcnJheTxBY3Rpb25KU09OPjtcbiAgcGFyYW1zOiBEaWZmZXJlbnRBY3Rpb25QYXJhbXM7XG4gIGhhbmRsZUNsaWNrOiBCdXR0b25Jbkdyb3VwUHJvcHNbJ29uQ2xpY2snXTtcbn1cblxuZXhwb3J0IGNvbnN0IGFjdGlvbnNUb0J1dHRvbkdyb3VwID0gKFxuICBvcHRpb25zOiBhY3Rpb25zVG9CdXR0b25Hcm91cE9wdGlvbnMsXG4pOiBCdXR0b25Hcm91cFByb3BzWydidXR0b25zJ10gPT4ge1xuICBjb25zdCB7IGFjdGlvbnMsIHBhcmFtcywgaGFuZGxlQ2xpY2sgfSA9IG9wdGlvbnNcbiAgY29uc3QgYnV0dG9ucyA9IGFjdGlvbnMubWFwKChhY3Rpb24pID0+IHtcbiAgICBjb25zdCBocmVmID0gYWN0aW9uSHJlZihhY3Rpb24sIHBhcmFtcylcbiAgICByZXR1cm4ge1xuICAgICAgaWNvbjogYWN0aW9uLmljb24sXG4gICAgICBsYWJlbDogYWN0aW9uLmxhYmVsLFxuICAgICAgdmFyaWFudDogYWN0aW9uLnZhcmlhbnQsXG4gICAgICBzb3VyY2U6IGFjdGlvbixcbiAgICAgIGhyZWY6IGhyZWYgfHwgdW5kZWZpbmVkLFxuICAgICAgLy8gd2hlbiBocmVmIGlzIG5vdCBkZWZpbmVkIC0gaGFuZGxlIGNsaWNrIHNob3VsZCBhbHNvIGJlIG5vdCBkZWZpbmVkXG4gICAgICAvLyBUaGlzIHByZXZlbnRzIGZyb20gXCJjdXJzb3I6IHBvaW50ZXI7XCJcbiAgICAgIG9uQ2xpY2s6IGhyZWYgPyBoYW5kbGVDbGljayA6IHVuZGVmaW5lZCxcbiAgICAgICdkYXRhLXRlc3RpZCc6IGJ1aWxkQWN0aW9uVGVzdElkKGFjdGlvbiksXG4gICAgICBidXR0b25zOiBbXSxcbiAgICAgICdkYXRhLWNzcyc6IGAke2FjdGlvbi5yZXNvdXJjZUlkfS0ke2FjdGlvbi5uYW1lfS1idXR0b25gLFxuICAgIH1cbiAgfSlcblxuICAvLyBuZXN0aW5nIGJ1dHRvbnNcbiAgY29uc3QgYnV0dG9uc01hcCA9IGJ1dHRvbnMucmVkdWNlKChtZW1vLCBidXR0b24pID0+IHtcbiAgICBjb25zdCBhY3Rpb24gPSBidXR0b24uc291cmNlXG4gICAgaWYgKGFjdGlvbi5wYXJlbnQpIHtcbiAgICAgIGNvbnN0IHBhcmVudDogQnV0dG9uSW5Hcm91cFByb3BzID0gbWVtb1thY3Rpb24ucGFyZW50XVxuICAgICAgICB8fCBidXR0b25zLmZpbmQoKGJ0bikgPT4gYnRuLnNvdXJjZS5uYW1lID09PSBhY3Rpb24ucGFyZW50KVxuICAgICAgICB8fCB7XG4gICAgICAgICAgbGFiZWw6IGFjdGlvbi5wYXJlbnQsXG4gICAgICAgIH1cblxuICAgICAgcGFyZW50LmJ1dHRvbnMgPSBwYXJlbnQuYnV0dG9ucyB8fCBbXVxuICAgICAgcGFyZW50LmJ1dHRvbnMucHVzaChidXR0b24pXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5tZW1vLFxuICAgICAgICBbYWN0aW9uLnBhcmVudF06IHBhcmVudCxcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLm1lbW8sXG4gICAgICBbYnV0dG9uLnNvdXJjZS5uYW1lXTogYnV0dG9uLFxuICAgIH1cbiAgfSwge30gYXMgUmVjb3JkPHN0cmluZywgQnV0dG9uSW5Hcm91cFByb3BzPilcbiAgcmV0dXJuIE9iamVjdC52YWx1ZXMoYnV0dG9uc01hcClcbn1cbiIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCBzdHlsZWQgZnJvbSAnc3R5bGVkLWNvbXBvbmVudHMnXG5pbXBvcnQgeyBMaW5rIGFzIFJvdXRlckxpbmssIHVzZU5hdmlnYXRlIH0gZnJvbSAncmVhY3Qtcm91dGVyLWRvbSdcbmltcG9ydCB7XG4gIEJ1dHRvbkNTUyxcbiAgQnV0dG9uUHJvcHMsXG4gIEljb24sXG59IGZyb20gJ0BhZG1pbmpzL2Rlc2lnbi1zeXN0ZW0nXG5cbmltcG9ydCBhbGxvd092ZXJyaWRlIGZyb20gJy4uLy4uLy4uL2hvYy9hbGxvdy1vdmVycmlkZSdcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuY29uc3QgU3R5bGVkTGluayA9IHN0eWxlZCgoeyByb3VuZGVkLCAuLi5yZXN0IH0pID0+IDxSb3V0ZXJMaW5rIHsuLi5yZXN0fSAvPik8QnV0dG9uUHJvcHM+YCR7QnV0dG9uQ1NTfWBcblxuZXhwb3J0IHR5cGUgU3R5bGVkQmFja0J1dHRvblByb3BzID0ge1xuICBzaG93SW5EcmF3ZXI6IGJvb2xlYW47XG59XG5cbmNvbnN0IFN0eWxlZEJhY2tCdXR0b246IFJlYWN0LkZDPFN0eWxlZEJhY2tCdXR0b25Qcm9wcz4gPSAocHJvcHMpID0+IHtcbiAgY29uc3QgeyBzaG93SW5EcmF3ZXIgfSA9IHByb3BzXG4gIGNvbnN0IGNzc0Nsb3NlSWNvbiA9IHNob3dJbkRyYXdlciA/ICdDaGV2cm9uUmlnaHQnIDogJ0NoZXZyb25MZWZ0J1xuXG4gIGNvbnN0IG5hdmlnYXRlID0gdXNlTmF2aWdhdGUoKVxuXG4gIHJldHVybiAoXG4gICAgPFN0eWxlZExpbmtcbiAgICAgIHNpemU9XCJpY29uXCJcbiAgICAgIHRvPXtuYXZpZ2F0ZSgtMSl9XG4gICAgICByb3VuZGVkXG4gICAgICBtcj1cImxnXCJcbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgID5cbiAgICAgIDxJY29uIGljb249e2Nzc0Nsb3NlSWNvbn0gLz5cbiAgICA8L1N0eWxlZExpbms+XG4gIClcbn1cblxuY29uc3QgT3ZlcnJpZGFibGVTdHlsZWRCYWNrQnV0dG9uID0gYWxsb3dPdmVycmlkZShTdHlsZWRCYWNrQnV0dG9uLCAnU3R5bGVkQmFja0J1dHRvbicpXG5cbmV4cG9ydCB7XG4gIE92ZXJyaWRhYmxlU3R5bGVkQmFja0J1dHRvbiBhcyBkZWZhdWx0LFxuICBPdmVycmlkYWJsZVN0eWxlZEJhY2tCdXR0b24gYXMgU3R5bGVkQmFja0J1dHRvbixcbn1cbiIsIi8qIGVzbGludC1kaXNhYmxlIGpzeC1hMTF5L2FuY2hvci1pcy12YWxpZCAqL1xuaW1wb3J0IHsgQmFkZ2UsIEJveCwgQnV0dG9uR3JvdXAsIGNzc0NsYXNzLCBIMiwgSDMgfSBmcm9tICdAYWRtaW5qcy9kZXNpZ24tc3lzdGVtJ1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgdXNlTmF2aWdhdGUgfSBmcm9tICdyZWFjdC1yb3V0ZXInXG5pbXBvcnQgYWxsb3dPdmVycmlkZSBmcm9tICcuLi8uLi8uLi9ob2MvYWxsb3ctb3ZlcnJpZGUnXG5pbXBvcnQgeyB1c2VBY3Rpb25SZXNwb25zZUhhbmRsZXIsIHVzZVRyYW5zbGF0aW9uIH0gZnJvbSAnLi4vLi4vLi4vaG9va3MnXG5pbXBvcnQgeyBBY3Rpb25KU09OLCBidWlsZEFjdGlvbkNsaWNrSGFuZGxlciB9IGZyb20gJy4uLy4uLy4uL2ludGVyZmFjZXMvYWN0aW9uJ1xuaW1wb3J0IHsgZ2V0QWN0aW9uRWxlbWVudENzcywgZ2V0UmVzb3VyY2VFbGVtZW50Q3NzIH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMnXG5pbXBvcnQgQnJlYWRjcnVtYnMgZnJvbSAnLi4vYnJlYWRjcnVtYnMnXG5pbXBvcnQgeyBBY3Rpb25IZWFkZXJQcm9wcyB9IGZyb20gJy4vYWN0aW9uLWhlYWRlci1wcm9wcydcbmltcG9ydCB7IGFjdGlvbnNUb0J1dHRvbkdyb3VwIH0gZnJvbSAnLi9hY3Rpb25zLXRvLWJ1dHRvbi1ncm91cCdcbmltcG9ydCB7IFN0eWxlZEJhY2tCdXR0b24gfSBmcm9tICcuL3N0eWxlZC1iYWNrLWJ1dHRvbidcblxuLyoqXG4gKiBIZWFkZXIgb2YgYW4gYWN0aW9uLiBJdCByZW5kZXJzIEFjdGlvbiBuYW1lIHdpdGggYnV0dG9ucyBmb3IgYWxsIHRoZSBhY3Rpb25zLlxuICpcbiAqICMjIyBVc2FnZVxuICpcbiAqIGBgYFxuICogaW1wb3J0IHsgQWN0aW9uSGVhZGVyIH0gZnJvbSAnYWRtaW5qcydcbiAqIGBgYFxuICpcbiAqIEBjb21wb25lbnRcbiAqIEBzdWJjYXRlZ29yeSBBcHBsaWNhdGlvblxuICovXG5jb25zdCBBY3Rpb25IZWFkZXI6IFJlYWN0LkZDPEFjdGlvbkhlYWRlclByb3BzPiA9IChwcm9wcykgPT4ge1xuICBjb25zdCB7XG4gICAgcmVzb3VyY2UsIHRvZ2dsZUZpbHRlciwgYWN0aW9uUGVyZm9ybWVkLCByZWNvcmQsIGFjdGlvbiwgdGFnLCBvbWl0QWN0aW9ucyxcbiAgfSA9IHByb3BzXG5cbiAgY29uc3QgeyB0cmFuc2xhdGVCdXR0b24gfSA9IHVzZVRyYW5zbGF0aW9uKClcbiAgY29uc3QgbmF2aWdhdGUgPSB1c2VOYXZpZ2F0ZSgpXG4gIGNvbnN0IGFjdGlvblJlc3BvbnNlSGFuZGxlciA9IHVzZUFjdGlvblJlc3BvbnNlSGFuZGxlcihhY3Rpb25QZXJmb3JtZWQpXG5cbiAgaWYgKGFjdGlvbi5oaWRlQWN0aW9uSGVhZGVyKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIGNvbnN0IHJlc291cmNlSWQgPSByZXNvdXJjZS5pZFxuICBjb25zdCBwYXJhbXMgPSB7IHJlc291cmNlSWQsIHJlY29yZElkOiByZWNvcmQ/LmlkIH1cblxuICBjb25zdCBoYW5kbGVBY3Rpb25DbGljayA9IChldmVudCwgc291cmNlQWN0aW9uOiBBY3Rpb25KU09OKTogYW55IHwgUHJvbWlzZTxhbnk+ID0+IChcbiAgICBidWlsZEFjdGlvbkNsaWNrSGFuZGxlcih7XG4gICAgICBhY3Rpb246IHNvdXJjZUFjdGlvbixcbiAgICAgIHBhcmFtcyxcbiAgICAgIGFjdGlvblJlc3BvbnNlSGFuZGxlcixcbiAgICAgIG5hdmlnYXRlLFxuICAgIH0pKGV2ZW50KVxuICApXG5cbiAgY29uc3QgYWN0aW9uQnV0dG9ucyA9IGFjdGlvbnNUb0J1dHRvbkdyb3VwKHtcbiAgICBhY3Rpb25zOiByZWNvcmRcbiAgICAgID8gcmVjb3JkLnJlY29yZEFjdGlvbnMuZmlsdGVyKChyYSkgPT4gIWFjdGlvbiB8fCBhY3Rpb24ubmFtZSAhPT0gcmEubmFtZSlcbiAgICAgIC8vIG9ubHkgbmV3IGFjdGlvbiBzaG91bGQgYmUgc2VlbiBpbiByZWd1bGFyIFwiQmlnXCIgYWN0aW9ucyBwbGFjZVxuICAgICAgOiByZXNvdXJjZS5yZXNvdXJjZUFjdGlvbnMuZmlsdGVyKChyYSkgPT4gcmEubmFtZSA9PT0gJ25ldycgJiYgKCFhY3Rpb24gfHwgYWN0aW9uLm5hbWUgIT09IHJhLm5hbWUpKSxcbiAgICBwYXJhbXMsXG4gICAgaGFuZGxlQ2xpY2s6IGhhbmRsZUFjdGlvbkNsaWNrLFxuICB9KVxuXG4gIGlmICh0b2dnbGVGaWx0ZXIpIHtcbiAgICBhY3Rpb25CdXR0b25zLnB1c2goe1xuICAgICAgbGFiZWw6IHRyYW5zbGF0ZUJ1dHRvbignZmlsdGVyJywgcmVzb3VyY2UuaWQpLFxuICAgICAgb25DbGljazogdG9nZ2xlRmlsdGVyLFxuICAgICAgaWNvbjogJ1NldHRpbmdzQWRqdXN0JyxcbiAgICAgICdkYXRhLWNzcyc6IGdldFJlc291cmNlRWxlbWVudENzcyhyZXNvdXJjZS5pZCwgJ2ZpbHRlci1idXR0b24nKSxcbiAgICB9KVxuICB9XG5cbiAgLy8gbGlzdCBhbmQgbmV3IGFjdGlvbnMgYXJlIHNwZWNpYWwgYW5kIGFyZSBhcmUgYWx3YXlzXG4gIGNvbnN0IGN1c3RvbVJlc291cmNlQnV0dG9ucyA9IGFjdGlvbnNUb0J1dHRvbkdyb3VwKHtcbiAgICBhY3Rpb25zOiBhY3Rpb24uc2hvd1Jlc291cmNlQWN0aW9uc1xuICAgICAgPyByZXNvdXJjZS5yZXNvdXJjZUFjdGlvbnMuZmlsdGVyKChyYSkgPT4gIVsnbGlzdCcsICduZXcnXS5pbmNsdWRlcyhyYS5uYW1lKSlcbiAgICAgIDogW10sXG4gICAgcGFyYW1zOiB7IHJlc291cmNlSWQgfSxcbiAgICBoYW5kbGVDbGljazogaGFuZGxlQWN0aW9uQ2xpY2ssXG4gIH0pXG5cbiAgY29uc3QgdGl0bGUgPSBhY3Rpb24gPyBhY3Rpb24ubGFiZWwgOiByZXNvdXJjZS5uYW1lXG5cbiAgLy8gc3R5bGVkIHdoaWNoIGRpZmZlcnMgaWYgYWN0aW9uIGhlYWRlciBpcyBpbiB0aGUgZHJhd2VyIG9yIG5vdFxuICBjb25zdCBjc3NJc1Jvb3RGbGV4ID0gIWFjdGlvbi5zaG93SW5EcmF3ZXJcbiAgY29uc3QgY3NzSGVhZGVyTVQgPSBhY3Rpb24uc2hvd0luRHJhd2VyID8gJycgOiAnbGcnXG4gIGNvbnN0IGNzc0FjdGlvbnNNQiA9IGFjdGlvbi5zaG93SW5EcmF3ZXIgPyAneGwnIDogJ2RlZmF1bHQnXG4gIGNvbnN0IENzc0hDb21wb25lbnQgPSBhY3Rpb24uc2hvd0luRHJhd2VyID8gSDMgOiBIMlxuICBjb25zdCBjb250ZW50VGFnID0gZ2V0QWN0aW9uRWxlbWVudENzcyhyZXNvdXJjZUlkLCBhY3Rpb24ubmFtZSwgJ2FjdGlvbi1oZWFkZXInKVxuICByZXR1cm4gKFxuICAgIDxCb3ggY2xhc3NOYW1lPXtjc3NDbGFzcygnQWN0aW9uSGVhZGVyJyl9IGRhdGEtY3NzPXtjb250ZW50VGFnfT5cbiAgICAgIHthY3Rpb24uc2hvd0luRHJhd2VyID8gJycgOiAoXG4gICAgICAgIDxCb3ggZmxleCBmbGV4RGlyZWN0aW9uPVwicm93XCIgcHg9e1snZGVmYXVsdCcsIDBdfT5cbiAgICAgICAgICA8QnJlYWRjcnVtYnMgcmVzb3VyY2U9e3Jlc291cmNlfSBhY3Rpb25OYW1lPXthY3Rpb24ubmFtZX0gcmVjb3JkPXtyZWNvcmR9IC8+XG4gICAgICAgICAgPEJveCBmbGV4U2hyaW5rPXswfT5cbiAgICAgICAgICAgIDxCdXR0b25Hcm91cCBzaXplPVwic21cIiByb3VuZGVkIGJ1dHRvbnM9e2N1c3RvbVJlc291cmNlQnV0dG9uc30gLz5cbiAgICAgICAgICA8L0JveD5cbiAgICAgICAgPC9Cb3g+XG4gICAgICApfVxuICAgICAgPEJveCBkaXNwbGF5PXtbJ2Jsb2NrJywgY3NzSXNSb290RmxleCA/ICdmbGV4JyA6ICdibG9jayddfT5cbiAgICAgICAgPEJveCBtdD17Y3NzSGVhZGVyTVR9IGZsZXhHcm93PXsxfSBweD17WydkZWZhdWx0JywgMF19PlxuICAgICAgICAgIDxDc3NIQ29tcG9uZW50IG1iPVwibGdcIj5cbiAgICAgICAgICAgIHthY3Rpb24uc2hvd0luRHJhd2VyID8gKFxuICAgICAgICAgICAgICA8U3R5bGVkQmFja0J1dHRvbiBzaG93SW5EcmF3ZXI9e2FjdGlvbi5zaG93SW5EcmF3ZXJ9IC8+XG4gICAgICAgICAgICApIDogJyd9XG4gICAgICAgICAgICB7dGl0bGV9XG4gICAgICAgICAgICB7dGFnID8gKDxCYWRnZSB2YXJpYW50PVwicHJpbWFyeVwiIG1sPVwiZGVmYXVsdFwiPnt0YWd9PC9CYWRnZT4pIDogJyd9XG4gICAgICAgICAgPC9Dc3NIQ29tcG9uZW50PlxuICAgICAgICA8L0JveD5cbiAgICAgICAge29taXRBY3Rpb25zID8gJycgOiAoXG4gICAgICAgICAgPEJveCBtdD1cInhsXCIgbWI9e2Nzc0FjdGlvbnNNQn0gZmxleFNocmluaz17MH0+XG4gICAgICAgICAgICA8QnV0dG9uR3JvdXAgYnV0dG9ucz17YWN0aW9uQnV0dG9uc30gLz5cbiAgICAgICAgICA8L0JveD5cbiAgICAgICAgKX1cbiAgICAgIDwvQm94PlxuICAgIDwvQm94PlxuICApXG59XG5cbmNvbnN0IE92ZXJyaWRhYmxlQWN0aW9uSGVhZGVyID0gYWxsb3dPdmVycmlkZShBY3Rpb25IZWFkZXIsICdBY3Rpb25IZWFkZXInKVxuXG5leHBvcnQge1xuICBPdmVycmlkYWJsZUFjdGlvbkhlYWRlciBhcyBkZWZhdWx0LFxuICBPdmVycmlkYWJsZUFjdGlvbkhlYWRlciBhcyBBY3Rpb25IZWFkZXIsXG59XG4iLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG5cbnZhciByZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG5cbmZ1bmN0aW9uIGFyZUlucHV0c0VxdWFsKG5ld0lucHV0cywgbGFzdElucHV0cykge1xuICBpZiAobmV3SW5wdXRzLmxlbmd0aCAhPT0gbGFzdElucHV0cy5sZW5ndGgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IG5ld0lucHV0cy5sZW5ndGg7IGkrKykge1xuICAgIGlmIChuZXdJbnB1dHNbaV0gIT09IGxhc3RJbnB1dHNbaV0pIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gdXNlTWVtb09uZShnZXRSZXN1bHQsIGlucHV0cykge1xuICB2YXIgaW5pdGlhbCA9IHJlYWN0LnVzZVN0YXRlKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaW5wdXRzOiBpbnB1dHMsXG4gICAgICByZXN1bHQ6IGdldFJlc3VsdCgpXG4gICAgfTtcbiAgfSlbMF07XG4gIHZhciBpc0ZpcnN0UnVuID0gcmVhY3QudXNlUmVmKHRydWUpO1xuICB2YXIgY29tbWl0dGVkID0gcmVhY3QudXNlUmVmKGluaXRpYWwpO1xuICB2YXIgdXNlQ2FjaGUgPSBpc0ZpcnN0UnVuLmN1cnJlbnQgfHwgQm9vbGVhbihpbnB1dHMgJiYgY29tbWl0dGVkLmN1cnJlbnQuaW5wdXRzICYmIGFyZUlucHV0c0VxdWFsKGlucHV0cywgY29tbWl0dGVkLmN1cnJlbnQuaW5wdXRzKSk7XG4gIHZhciBjYWNoZSA9IHVzZUNhY2hlID8gY29tbWl0dGVkLmN1cnJlbnQgOiB7XG4gICAgaW5wdXRzOiBpbnB1dHMsXG4gICAgcmVzdWx0OiBnZXRSZXN1bHQoKVxuICB9O1xuICByZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlzRmlyc3RSdW4uY3VycmVudCA9IGZhbHNlO1xuICAgIGNvbW1pdHRlZC5jdXJyZW50ID0gY2FjaGU7XG4gIH0sIFtjYWNoZV0pO1xuICByZXR1cm4gY2FjaGUucmVzdWx0O1xufVxuZnVuY3Rpb24gdXNlQ2FsbGJhY2tPbmUoY2FsbGJhY2ssIGlucHV0cykge1xuICByZXR1cm4gdXNlTWVtb09uZShmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGNhbGxiYWNrO1xuICB9LCBpbnB1dHMpO1xufVxudmFyIHVzZU1lbW8gPSB1c2VNZW1vT25lO1xudmFyIHVzZUNhbGxiYWNrID0gdXNlQ2FsbGJhY2tPbmU7XG5cbmV4cG9ydHMudXNlQ2FsbGJhY2sgPSB1c2VDYWxsYmFjaztcbmV4cG9ydHMudXNlQ2FsbGJhY2tPbmUgPSB1c2VDYWxsYmFja09uZTtcbmV4cG9ydHMudXNlTWVtbyA9IHVzZU1lbW87XG5leHBvcnRzLnVzZU1lbW9PbmUgPSB1c2VNZW1vT25lO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgaXNQcm9kdWN0aW9uID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJztcbnZhciBwcmVmaXggPSAnSW52YXJpYW50IGZhaWxlZCc7XG5mdW5jdGlvbiBpbnZhcmlhbnQoY29uZGl0aW9uLCBtZXNzYWdlKSB7XG4gICAgaWYgKGNvbmRpdGlvbikge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChpc1Byb2R1Y3Rpb24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKHByZWZpeCk7XG4gICAgfVxuICAgIHZhciBwcm92aWRlZCA9IHR5cGVvZiBtZXNzYWdlID09PSAnZnVuY3Rpb24nID8gbWVzc2FnZSgpIDogbWVzc2FnZTtcbiAgICB2YXIgdmFsdWUgPSBwcm92aWRlZCA/IFwiXCIuY29uY2F0KHByZWZpeCwgXCI6IFwiKS5jb25jYXQocHJvdmlkZWQpIDogcHJlZml4O1xuICAgIHRocm93IG5ldyBFcnJvcih2YWx1ZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaW52YXJpYW50O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuXG5mdW5jdGlvbiBfaW50ZXJvcERlZmF1bHQgKGV4KSB7IHJldHVybiAoZXggJiYgKHR5cGVvZiBleCA9PT0gJ29iamVjdCcpICYmICdkZWZhdWx0JyBpbiBleCkgPyBleFsnZGVmYXVsdCddIDogZXg7IH1cblxudmFyIGludmFyaWFudCA9IF9pbnRlcm9wRGVmYXVsdChyZXF1aXJlKCd0aW55LWludmFyaWFudCcpKTtcblxudmFyIGdldFJlY3QgPSBmdW5jdGlvbiBnZXRSZWN0KF9yZWYpIHtcbiAgdmFyIHRvcCA9IF9yZWYudG9wLFxuICAgICAgcmlnaHQgPSBfcmVmLnJpZ2h0LFxuICAgICAgYm90dG9tID0gX3JlZi5ib3R0b20sXG4gICAgICBsZWZ0ID0gX3JlZi5sZWZ0O1xuICB2YXIgd2lkdGggPSByaWdodCAtIGxlZnQ7XG4gIHZhciBoZWlnaHQgPSBib3R0b20gLSB0b3A7XG4gIHZhciByZWN0ID0ge1xuICAgIHRvcDogdG9wLFxuICAgIHJpZ2h0OiByaWdodCxcbiAgICBib3R0b206IGJvdHRvbSxcbiAgICBsZWZ0OiBsZWZ0LFxuICAgIHdpZHRoOiB3aWR0aCxcbiAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICB4OiBsZWZ0LFxuICAgIHk6IHRvcCxcbiAgICBjZW50ZXI6IHtcbiAgICAgIHg6IChyaWdodCArIGxlZnQpIC8gMixcbiAgICAgIHk6IChib3R0b20gKyB0b3ApIC8gMlxuICAgIH1cbiAgfTtcbiAgcmV0dXJuIHJlY3Q7XG59O1xudmFyIGV4cGFuZCA9IGZ1bmN0aW9uIGV4cGFuZCh0YXJnZXQsIGV4cGFuZEJ5KSB7XG4gIHJldHVybiB7XG4gICAgdG9wOiB0YXJnZXQudG9wIC0gZXhwYW5kQnkudG9wLFxuICAgIGxlZnQ6IHRhcmdldC5sZWZ0IC0gZXhwYW5kQnkubGVmdCxcbiAgICBib3R0b206IHRhcmdldC5ib3R0b20gKyBleHBhbmRCeS5ib3R0b20sXG4gICAgcmlnaHQ6IHRhcmdldC5yaWdodCArIGV4cGFuZEJ5LnJpZ2h0XG4gIH07XG59O1xudmFyIHNocmluayA9IGZ1bmN0aW9uIHNocmluayh0YXJnZXQsIHNocmlua0J5KSB7XG4gIHJldHVybiB7XG4gICAgdG9wOiB0YXJnZXQudG9wICsgc2hyaW5rQnkudG9wLFxuICAgIGxlZnQ6IHRhcmdldC5sZWZ0ICsgc2hyaW5rQnkubGVmdCxcbiAgICBib3R0b206IHRhcmdldC5ib3R0b20gLSBzaHJpbmtCeS5ib3R0b20sXG4gICAgcmlnaHQ6IHRhcmdldC5yaWdodCAtIHNocmlua0J5LnJpZ2h0XG4gIH07XG59O1xuXG52YXIgc2hpZnQgPSBmdW5jdGlvbiBzaGlmdCh0YXJnZXQsIHNoaWZ0QnkpIHtcbiAgcmV0dXJuIHtcbiAgICB0b3A6IHRhcmdldC50b3AgKyBzaGlmdEJ5LnksXG4gICAgbGVmdDogdGFyZ2V0LmxlZnQgKyBzaGlmdEJ5LngsXG4gICAgYm90dG9tOiB0YXJnZXQuYm90dG9tICsgc2hpZnRCeS55LFxuICAgIHJpZ2h0OiB0YXJnZXQucmlnaHQgKyBzaGlmdEJ5LnhcbiAgfTtcbn07XG5cbnZhciBub1NwYWNpbmcgPSB7XG4gIHRvcDogMCxcbiAgcmlnaHQ6IDAsXG4gIGJvdHRvbTogMCxcbiAgbGVmdDogMFxufTtcbnZhciBjcmVhdGVCb3ggPSBmdW5jdGlvbiBjcmVhdGVCb3goX3JlZjIpIHtcbiAgdmFyIGJvcmRlckJveCA9IF9yZWYyLmJvcmRlckJveCxcbiAgICAgIF9yZWYyJG1hcmdpbiA9IF9yZWYyLm1hcmdpbixcbiAgICAgIG1hcmdpbiA9IF9yZWYyJG1hcmdpbiA9PT0gdm9pZCAwID8gbm9TcGFjaW5nIDogX3JlZjIkbWFyZ2luLFxuICAgICAgX3JlZjIkYm9yZGVyID0gX3JlZjIuYm9yZGVyLFxuICAgICAgYm9yZGVyID0gX3JlZjIkYm9yZGVyID09PSB2b2lkIDAgPyBub1NwYWNpbmcgOiBfcmVmMiRib3JkZXIsXG4gICAgICBfcmVmMiRwYWRkaW5nID0gX3JlZjIucGFkZGluZyxcbiAgICAgIHBhZGRpbmcgPSBfcmVmMiRwYWRkaW5nID09PSB2b2lkIDAgPyBub1NwYWNpbmcgOiBfcmVmMiRwYWRkaW5nO1xuICB2YXIgbWFyZ2luQm94ID0gZ2V0UmVjdChleHBhbmQoYm9yZGVyQm94LCBtYXJnaW4pKTtcbiAgdmFyIHBhZGRpbmdCb3ggPSBnZXRSZWN0KHNocmluayhib3JkZXJCb3gsIGJvcmRlcikpO1xuICB2YXIgY29udGVudEJveCA9IGdldFJlY3Qoc2hyaW5rKHBhZGRpbmdCb3gsIHBhZGRpbmcpKTtcbiAgcmV0dXJuIHtcbiAgICBtYXJnaW5Cb3g6IG1hcmdpbkJveCxcbiAgICBib3JkZXJCb3g6IGdldFJlY3QoYm9yZGVyQm94KSxcbiAgICBwYWRkaW5nQm94OiBwYWRkaW5nQm94LFxuICAgIGNvbnRlbnRCb3g6IGNvbnRlbnRCb3gsXG4gICAgbWFyZ2luOiBtYXJnaW4sXG4gICAgYm9yZGVyOiBib3JkZXIsXG4gICAgcGFkZGluZzogcGFkZGluZ1xuICB9O1xufTtcblxudmFyIHBhcnNlID0gZnVuY3Rpb24gcGFyc2UocmF3KSB7XG4gIHZhciB2YWx1ZSA9IHJhdy5zbGljZSgwLCAtMik7XG4gIHZhciBzdWZmaXggPSByYXcuc2xpY2UoLTIpO1xuXG4gIGlmIChzdWZmaXggIT09ICdweCcpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIHZhciByZXN1bHQgPSBOdW1iZXIodmFsdWUpO1xuICAhIWlzTmFOKHJlc3VsdCkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBpbnZhcmlhbnQoZmFsc2UsIFwiQ291bGQgbm90IHBhcnNlIHZhbHVlIFtyYXc6IFwiICsgcmF3ICsgXCIsIHdpdGhvdXQgc3VmZml4OiBcIiArIHZhbHVlICsgXCJdXCIpIDogaW52YXJpYW50KGZhbHNlKSA6IHZvaWQgMDtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbnZhciBnZXRXaW5kb3dTY3JvbGwgPSBmdW5jdGlvbiBnZXRXaW5kb3dTY3JvbGwoKSB7XG4gIHJldHVybiB7XG4gICAgeDogd2luZG93LnBhZ2VYT2Zmc2V0LFxuICAgIHk6IHdpbmRvdy5wYWdlWU9mZnNldFxuICB9O1xufTtcblxudmFyIG9mZnNldCA9IGZ1bmN0aW9uIG9mZnNldChvcmlnaW5hbCwgY2hhbmdlKSB7XG4gIHZhciBib3JkZXJCb3ggPSBvcmlnaW5hbC5ib3JkZXJCb3gsXG4gICAgICBib3JkZXIgPSBvcmlnaW5hbC5ib3JkZXIsXG4gICAgICBtYXJnaW4gPSBvcmlnaW5hbC5tYXJnaW4sXG4gICAgICBwYWRkaW5nID0gb3JpZ2luYWwucGFkZGluZztcbiAgdmFyIHNoaWZ0ZWQgPSBzaGlmdChib3JkZXJCb3gsIGNoYW5nZSk7XG4gIHJldHVybiBjcmVhdGVCb3goe1xuICAgIGJvcmRlckJveDogc2hpZnRlZCxcbiAgICBib3JkZXI6IGJvcmRlcixcbiAgICBtYXJnaW46IG1hcmdpbixcbiAgICBwYWRkaW5nOiBwYWRkaW5nXG4gIH0pO1xufTtcbnZhciB3aXRoU2Nyb2xsID0gZnVuY3Rpb24gd2l0aFNjcm9sbChvcmlnaW5hbCwgc2Nyb2xsKSB7XG4gIGlmIChzY3JvbGwgPT09IHZvaWQgMCkge1xuICAgIHNjcm9sbCA9IGdldFdpbmRvd1Njcm9sbCgpO1xuICB9XG5cbiAgcmV0dXJuIG9mZnNldChvcmlnaW5hbCwgc2Nyb2xsKTtcbn07XG52YXIgY2FsY3VsYXRlQm94ID0gZnVuY3Rpb24gY2FsY3VsYXRlQm94KGJvcmRlckJveCwgc3R5bGVzKSB7XG4gIHZhciBtYXJnaW4gPSB7XG4gICAgdG9wOiBwYXJzZShzdHlsZXMubWFyZ2luVG9wKSxcbiAgICByaWdodDogcGFyc2Uoc3R5bGVzLm1hcmdpblJpZ2h0KSxcbiAgICBib3R0b206IHBhcnNlKHN0eWxlcy5tYXJnaW5Cb3R0b20pLFxuICAgIGxlZnQ6IHBhcnNlKHN0eWxlcy5tYXJnaW5MZWZ0KVxuICB9O1xuICB2YXIgcGFkZGluZyA9IHtcbiAgICB0b3A6IHBhcnNlKHN0eWxlcy5wYWRkaW5nVG9wKSxcbiAgICByaWdodDogcGFyc2Uoc3R5bGVzLnBhZGRpbmdSaWdodCksXG4gICAgYm90dG9tOiBwYXJzZShzdHlsZXMucGFkZGluZ0JvdHRvbSksXG4gICAgbGVmdDogcGFyc2Uoc3R5bGVzLnBhZGRpbmdMZWZ0KVxuICB9O1xuICB2YXIgYm9yZGVyID0ge1xuICAgIHRvcDogcGFyc2Uoc3R5bGVzLmJvcmRlclRvcFdpZHRoKSxcbiAgICByaWdodDogcGFyc2Uoc3R5bGVzLmJvcmRlclJpZ2h0V2lkdGgpLFxuICAgIGJvdHRvbTogcGFyc2Uoc3R5bGVzLmJvcmRlckJvdHRvbVdpZHRoKSxcbiAgICBsZWZ0OiBwYXJzZShzdHlsZXMuYm9yZGVyTGVmdFdpZHRoKVxuICB9O1xuICByZXR1cm4gY3JlYXRlQm94KHtcbiAgICBib3JkZXJCb3g6IGJvcmRlckJveCxcbiAgICBtYXJnaW46IG1hcmdpbixcbiAgICBwYWRkaW5nOiBwYWRkaW5nLFxuICAgIGJvcmRlcjogYm9yZGVyXG4gIH0pO1xufTtcbnZhciBnZXRCb3ggPSBmdW5jdGlvbiBnZXRCb3goZWwpIHtcbiAgdmFyIGJvcmRlckJveCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICB2YXIgc3R5bGVzID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWwpO1xuICByZXR1cm4gY2FsY3VsYXRlQm94KGJvcmRlckJveCwgc3R5bGVzKTtcbn07XG5cbmV4cG9ydHMuY2FsY3VsYXRlQm94ID0gY2FsY3VsYXRlQm94O1xuZXhwb3J0cy5jcmVhdGVCb3ggPSBjcmVhdGVCb3g7XG5leHBvcnRzLmV4cGFuZCA9IGV4cGFuZDtcbmV4cG9ydHMuZ2V0Qm94ID0gZ2V0Qm94O1xuZXhwb3J0cy5nZXRSZWN0ID0gZ2V0UmVjdDtcbmV4cG9ydHMub2Zmc2V0ID0gb2Zmc2V0O1xuZXhwb3J0cy5zaHJpbmsgPSBzaHJpbms7XG5leHBvcnRzLndpdGhTY3JvbGwgPSB3aXRoU2Nyb2xsO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgc2FmZUlzTmFOID0gTnVtYmVyLmlzTmFOIHx8XG4gICAgZnVuY3Rpb24gcG9ueWZpbGwodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgdmFsdWUgIT09IHZhbHVlO1xuICAgIH07XG5mdW5jdGlvbiBpc0VxdWFsKGZpcnN0LCBzZWNvbmQpIHtcbiAgICBpZiAoZmlyc3QgPT09IHNlY29uZCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHNhZmVJc05hTihmaXJzdCkgJiYgc2FmZUlzTmFOKHNlY29uZCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGFyZUlucHV0c0VxdWFsKG5ld0lucHV0cywgbGFzdElucHV0cykge1xuICAgIGlmIChuZXdJbnB1dHMubGVuZ3RoICE9PSBsYXN0SW5wdXRzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmV3SW5wdXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICghaXNFcXVhbChuZXdJbnB1dHNbaV0sIGxhc3RJbnB1dHNbaV0pKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIG1lbW9pemVPbmUocmVzdWx0Rm4sIGlzRXF1YWwpIHtcbiAgICBpZiAoaXNFcXVhbCA9PT0gdm9pZCAwKSB7IGlzRXF1YWwgPSBhcmVJbnB1dHNFcXVhbDsgfVxuICAgIHZhciBjYWNoZSA9IG51bGw7XG4gICAgZnVuY3Rpb24gbWVtb2l6ZWQoKSB7XG4gICAgICAgIHZhciBuZXdBcmdzID0gW107XG4gICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICBuZXdBcmdzW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNhY2hlICYmIGNhY2hlLmxhc3RUaGlzID09PSB0aGlzICYmIGlzRXF1YWwobmV3QXJncywgY2FjaGUubGFzdEFyZ3MpKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FjaGUubGFzdFJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbGFzdFJlc3VsdCA9IHJlc3VsdEZuLmFwcGx5KHRoaXMsIG5ld0FyZ3MpO1xuICAgICAgICBjYWNoZSA9IHtcbiAgICAgICAgICAgIGxhc3RSZXN1bHQ6IGxhc3RSZXN1bHQsXG4gICAgICAgICAgICBsYXN0QXJnczogbmV3QXJncyxcbiAgICAgICAgICAgIGxhc3RUaGlzOiB0aGlzLFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gbGFzdFJlc3VsdDtcbiAgICB9XG4gICAgbWVtb2l6ZWQuY2xlYXIgPSBmdW5jdGlvbiBjbGVhcigpIHtcbiAgICAgICAgY2FjaGUgPSBudWxsO1xuICAgIH07XG4gICAgcmV0dXJuIG1lbW9pemVkO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG1lbW9pemVPbmU7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciByYWZTY2hkID0gZnVuY3Rpb24gcmFmU2NoZChmbikge1xuICB2YXIgbGFzdEFyZ3MgPSBbXTtcbiAgdmFyIGZyYW1lSWQgPSBudWxsO1xuXG4gIHZhciB3cmFwcGVyRm4gPSBmdW5jdGlvbiB3cmFwcGVyRm4oKSB7XG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cblxuICAgIGxhc3RBcmdzID0gYXJncztcblxuICAgIGlmIChmcmFtZUlkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZnJhbWVJZCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbiAoKSB7XG4gICAgICBmcmFtZUlkID0gbnVsbDtcbiAgICAgIGZuLmFwcGx5KHZvaWQgMCwgbGFzdEFyZ3MpO1xuICAgIH0pO1xuICB9O1xuXG4gIHdyYXBwZXJGbi5jYW5jZWwgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFmcmFtZUlkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUoZnJhbWVJZCk7XG4gICAgZnJhbWVJZCA9IG51bGw7XG4gIH07XG5cbiAgcmV0dXJuIHdyYXBwZXJGbjtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gcmFmU2NoZDtcbiIsImZ1bmN0aW9uIF9leHRlbmRzKCkge1xuICBtb2R1bGUuZXhwb3J0cyA9IF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiA/IE9iamVjdC5hc3NpZ24uYmluZCgpIDogZnVuY3Rpb24gKHRhcmdldCkge1xuICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldO1xuXG4gICAgICBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7XG4gICAgICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0YXJnZXQ7XG4gIH0sIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0cztcbiAgcmV0dXJuIF9leHRlbmRzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2V4dGVuZHMsIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0czsiLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG5cbnZhciBSZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG52YXIgUmVhY3RET00gPSByZXF1aXJlKCdyZWFjdC1kb20nKTtcbnZhciByZWR1eCA9IHJlcXVpcmUoJ3JlZHV4Jyk7XG52YXIgcmVhY3RSZWR1eCA9IHJlcXVpcmUoJ3JlYWN0LXJlZHV4Jyk7XG52YXIgdXNlTWVtb09uZSA9IHJlcXVpcmUoJ3VzZS1tZW1vLW9uZScpO1xudmFyIGNzc0JveE1vZGVsID0gcmVxdWlyZSgnY3NzLWJveC1tb2RlbCcpO1xudmFyIG1lbW9pemVPbmUgPSByZXF1aXJlKCdtZW1vaXplLW9uZScpO1xudmFyIHJhZlNjaGQgPSByZXF1aXJlKCdyYWYtc2NoZCcpO1xudmFyIF9leHRlbmRzID0gcmVxdWlyZSgnQGJhYmVsL3J1bnRpbWUvaGVscGVycy9leHRlbmRzJyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wRGVmYXVsdExlZ2FjeSAoZSkgeyByZXR1cm4gZSAmJiB0eXBlb2YgZSA9PT0gJ29iamVjdCcgJiYgJ2RlZmF1bHQnIGluIGUgPyBlIDogeyAnZGVmYXVsdCc6IGUgfTsgfVxuXG52YXIgUmVhY3RfX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX2ludGVyb3BEZWZhdWx0TGVnYWN5KFJlYWN0KTtcbnZhciBSZWFjdERPTV9fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9faW50ZXJvcERlZmF1bHRMZWdhY3koUmVhY3RET00pO1xudmFyIG1lbW9pemVPbmVfX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX2ludGVyb3BEZWZhdWx0TGVnYWN5KG1lbW9pemVPbmUpO1xudmFyIHJhZlNjaGRfX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX2ludGVyb3BEZWZhdWx0TGVnYWN5KHJhZlNjaGQpO1xudmFyIF9leHRlbmRzX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19pbnRlcm9wRGVmYXVsdExlZ2FjeShfZXh0ZW5kcyk7XG5cbmNvbnN0IGlzUHJvZHVjdGlvbiQxID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJztcbmNvbnN0IHNwYWNlc0FuZFRhYnMgPSAvWyBcXHRdezIsfS9nO1xuY29uc3QgbGluZVN0YXJ0V2l0aFNwYWNlcyA9IC9eWyBcXHRdKi9nbTtcblxuY29uc3QgY2xlYW4kMiA9IHZhbHVlID0+IHZhbHVlLnJlcGxhY2Uoc3BhY2VzQW5kVGFicywgJyAnKS5yZXBsYWNlKGxpbmVTdGFydFdpdGhTcGFjZXMsICcnKS50cmltKCk7XG5cbmNvbnN0IGdldERldk1lc3NhZ2UgPSBtZXNzYWdlID0+IGNsZWFuJDIoYFxuICAlY0BoZWxsby1wYW5nZWEvZG5kXG5cbiAgJWMke2NsZWFuJDIobWVzc2FnZSl9XG5cbiAgJWPwn5G34oCNIFRoaXMgaXMgYSBkZXZlbG9wbWVudCBvbmx5IG1lc3NhZ2UuIEl0IHdpbGwgYmUgcmVtb3ZlZCBpbiBwcm9kdWN0aW9uIGJ1aWxkcy5cbmApO1xuXG5jb25zdCBnZXRGb3JtYXR0ZWRNZXNzYWdlID0gbWVzc2FnZSA9PiBbZ2V0RGV2TWVzc2FnZShtZXNzYWdlKSwgJ2NvbG9yOiAjMDBDNTg0OyBmb250LXNpemU6IDEuMmVtOyBmb250LXdlaWdodDogYm9sZDsnLCAnbGluZS1oZWlnaHQ6IDEuNScsICdjb2xvcjogIzcyMzg3NDsnXTtcbmNvbnN0IGlzRGlzYWJsZWRGbGFnID0gJ19fQGhlbGxvLXBhbmdlYS9kbmQtZGlzYWJsZS1kZXYtd2FybmluZ3MnO1xuZnVuY3Rpb24gbG9nKHR5cGUsIG1lc3NhZ2UpIHtcbiAgaWYgKGlzUHJvZHVjdGlvbiQxKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvd1tpc0Rpc2FibGVkRmxhZ10pIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zb2xlW3R5cGVdKC4uLmdldEZvcm1hdHRlZE1lc3NhZ2UobWVzc2FnZSkpO1xufVxuY29uc3Qgd2FybmluZyA9IGxvZy5iaW5kKG51bGwsICd3YXJuJyk7XG5jb25zdCBlcnJvciA9IGxvZy5iaW5kKG51bGwsICdlcnJvcicpO1xuXG5mdW5jdGlvbiBub29wJDIoKSB7fVxuXG5mdW5jdGlvbiBnZXRPcHRpb25zKHNoYXJlZCwgZnJvbUJpbmRpbmcpIHtcbiAgcmV0dXJuIHsgLi4uc2hhcmVkLFxuICAgIC4uLmZyb21CaW5kaW5nXG4gIH07XG59XG5cbmZ1bmN0aW9uIGJpbmRFdmVudHMoZWwsIGJpbmRpbmdzLCBzaGFyZWRPcHRpb25zKSB7XG4gIGNvbnN0IHVuYmluZGluZ3MgPSBiaW5kaW5ncy5tYXAoYmluZGluZyA9PiB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IGdldE9wdGlvbnMoc2hhcmVkT3B0aW9ucywgYmluZGluZy5vcHRpb25zKTtcbiAgICBlbC5hZGRFdmVudExpc3RlbmVyKGJpbmRpbmcuZXZlbnROYW1lLCBiaW5kaW5nLmZuLCBvcHRpb25zKTtcbiAgICByZXR1cm4gZnVuY3Rpb24gdW5iaW5kKCkge1xuICAgICAgZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihiaW5kaW5nLmV2ZW50TmFtZSwgYmluZGluZy5mbiwgb3B0aW9ucyk7XG4gICAgfTtcbiAgfSk7XG4gIHJldHVybiBmdW5jdGlvbiB1bmJpbmRBbGwoKSB7XG4gICAgdW5iaW5kaW5ncy5mb3JFYWNoKHVuYmluZCA9PiB7XG4gICAgICB1bmJpbmQoKTtcbiAgICB9KTtcbiAgfTtcbn1cblxuY29uc3QgaXNQcm9kdWN0aW9uID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJztcbmNvbnN0IHByZWZpeCQxID0gJ0ludmFyaWFudCBmYWlsZWQnO1xuY2xhc3MgUmJkSW52YXJpYW50IGV4dGVuZHMgRXJyb3Ige31cblxuUmJkSW52YXJpYW50LnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICByZXR1cm4gdGhpcy5tZXNzYWdlO1xufTtcblxuZnVuY3Rpb24gaW52YXJpYW50KGNvbmRpdGlvbiwgbWVzc2FnZSkge1xuICBpZiAoY29uZGl0aW9uKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGlzUHJvZHVjdGlvbikge1xuICAgIHRocm93IG5ldyBSYmRJbnZhcmlhbnQocHJlZml4JDEpO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBSYmRJbnZhcmlhbnQoYCR7cHJlZml4JDF9OiAke21lc3NhZ2UgfHwgJyd9YCk7XG4gIH1cbn1cblxuY2xhc3MgRXJyb3JCb3VuZGFyeSBleHRlbmRzIFJlYWN0X19kZWZhdWx0W1wiZGVmYXVsdFwiXS5Db21wb25lbnQge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgIHRoaXMuY2FsbGJhY2tzID0gbnVsbDtcbiAgICB0aGlzLnVuYmluZCA9IG5vb3AkMjtcblxuICAgIHRoaXMub25XaW5kb3dFcnJvciA9IGV2ZW50ID0+IHtcbiAgICAgIGNvbnN0IGNhbGxiYWNrcyA9IHRoaXMuZ2V0Q2FsbGJhY2tzKCk7XG5cbiAgICAgIGlmIChjYWxsYmFja3MuaXNEcmFnZ2luZygpKSB7XG4gICAgICAgIGNhbGxiYWNrcy50cnlBYm9ydCgpO1xuICAgICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB3YXJuaW5nKGBcbiAgICAgICAgQW4gZXJyb3Igd2FzIGNhdWdodCBieSBvdXIgd2luZG93ICdlcnJvcicgZXZlbnQgbGlzdGVuZXIgd2hpbGUgYSBkcmFnIHdhcyBvY2N1cnJpbmcuXG4gICAgICAgIFRoZSBhY3RpdmUgZHJhZyBoYXMgYmVlbiBhYm9ydGVkLlxuICAgICAgYCkgOiB2b2lkIDA7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVyciA9IGV2ZW50LmVycm9yO1xuXG4gICAgICBpZiAoZXJyIGluc3RhbmNlb2YgUmJkSW52YXJpYW50KSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICBlcnJvcihlcnIubWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdGhpcy5nZXRDYWxsYmFja3MgPSAoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuY2FsbGJhY2tzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGZpbmQgQXBwQ2FsbGJhY2tzIGluIDxFcnJvckJvdW5kYXJ5Lz4nKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuY2FsbGJhY2tzO1xuICAgIH07XG5cbiAgICB0aGlzLnNldENhbGxiYWNrcyA9IGNhbGxiYWNrcyA9PiB7XG4gICAgICB0aGlzLmNhbGxiYWNrcyA9IGNhbGxiYWNrcztcbiAgICB9O1xuICB9XG5cbiAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgdGhpcy51bmJpbmQgPSBiaW5kRXZlbnRzKHdpbmRvdywgW3tcbiAgICAgIGV2ZW50TmFtZTogJ2Vycm9yJyxcbiAgICAgIGZuOiB0aGlzLm9uV2luZG93RXJyb3JcbiAgICB9XSk7XG4gIH1cblxuICBjb21wb25lbnREaWRDYXRjaChlcnIpIHtcbiAgICBpZiAoZXJyIGluc3RhbmNlb2YgUmJkSW52YXJpYW50KSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICBlcnJvcihlcnIubWVzc2FnZSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc2V0U3RhdGUoe30pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRocm93IGVycjtcbiAgfVxuXG4gIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgIHRoaXMudW5iaW5kKCk7XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMuY2hpbGRyZW4odGhpcy5zZXRDYWxsYmFja3MpO1xuICB9XG5cbn1cblxuY29uc3QgZHJhZ0hhbmRsZVVzYWdlSW5zdHJ1Y3Rpb25zID0gYFxuICBQcmVzcyBzcGFjZSBiYXIgdG8gc3RhcnQgYSBkcmFnLlxuICBXaGVuIGRyYWdnaW5nIHlvdSBjYW4gdXNlIHRoZSBhcnJvdyBrZXlzIHRvIG1vdmUgdGhlIGl0ZW0gYXJvdW5kIGFuZCBlc2NhcGUgdG8gY2FuY2VsLlxuICBTb21lIHNjcmVlbiByZWFkZXJzIG1heSByZXF1aXJlIHlvdSB0byBiZSBpbiBmb2N1cyBtb2RlIG9yIHRvIHVzZSB5b3VyIHBhc3MgdGhyb3VnaCBrZXlcbmA7XG5cbmNvbnN0IHBvc2l0aW9uID0gaW5kZXggPT4gaW5kZXggKyAxO1xuXG5jb25zdCBvbkRyYWdTdGFydCA9IHN0YXJ0ID0+IGBcbiAgWW91IGhhdmUgbGlmdGVkIGFuIGl0ZW0gaW4gcG9zaXRpb24gJHtwb3NpdGlvbihzdGFydC5zb3VyY2UuaW5kZXgpfVxuYDtcblxuY29uc3Qgd2l0aExvY2F0aW9uID0gKHNvdXJjZSwgZGVzdGluYXRpb24pID0+IHtcbiAgY29uc3QgaXNJbkhvbWVMaXN0ID0gc291cmNlLmRyb3BwYWJsZUlkID09PSBkZXN0aW5hdGlvbi5kcm9wcGFibGVJZDtcbiAgY29uc3Qgc3RhcnRQb3NpdGlvbiA9IHBvc2l0aW9uKHNvdXJjZS5pbmRleCk7XG4gIGNvbnN0IGVuZFBvc2l0aW9uID0gcG9zaXRpb24oZGVzdGluYXRpb24uaW5kZXgpO1xuXG4gIGlmIChpc0luSG9tZUxpc3QpIHtcbiAgICByZXR1cm4gYFxuICAgICAgWW91IGhhdmUgbW92ZWQgdGhlIGl0ZW0gZnJvbSBwb3NpdGlvbiAke3N0YXJ0UG9zaXRpb259XG4gICAgICB0byBwb3NpdGlvbiAke2VuZFBvc2l0aW9ufVxuICAgIGA7XG4gIH1cblxuICByZXR1cm4gYFxuICAgIFlvdSBoYXZlIG1vdmVkIHRoZSBpdGVtIGZyb20gcG9zaXRpb24gJHtzdGFydFBvc2l0aW9ufVxuICAgIGluIGxpc3QgJHtzb3VyY2UuZHJvcHBhYmxlSWR9XG4gICAgdG8gbGlzdCAke2Rlc3RpbmF0aW9uLmRyb3BwYWJsZUlkfVxuICAgIGluIHBvc2l0aW9uICR7ZW5kUG9zaXRpb259XG4gIGA7XG59O1xuXG5jb25zdCB3aXRoQ29tYmluZSA9IChpZCwgc291cmNlLCBjb21iaW5lKSA9PiB7XG4gIGNvbnN0IGluSG9tZUxpc3QgPSBzb3VyY2UuZHJvcHBhYmxlSWQgPT09IGNvbWJpbmUuZHJvcHBhYmxlSWQ7XG5cbiAgaWYgKGluSG9tZUxpc3QpIHtcbiAgICByZXR1cm4gYFxuICAgICAgVGhlIGl0ZW0gJHtpZH1cbiAgICAgIGhhcyBiZWVuIGNvbWJpbmVkIHdpdGggJHtjb21iaW5lLmRyYWdnYWJsZUlkfWA7XG4gIH1cblxuICByZXR1cm4gYFxuICAgICAgVGhlIGl0ZW0gJHtpZH1cbiAgICAgIGluIGxpc3QgJHtzb3VyY2UuZHJvcHBhYmxlSWR9XG4gICAgICBoYXMgYmVlbiBjb21iaW5lZCB3aXRoICR7Y29tYmluZS5kcmFnZ2FibGVJZH1cbiAgICAgIGluIGxpc3QgJHtjb21iaW5lLmRyb3BwYWJsZUlkfVxuICAgIGA7XG59O1xuXG5jb25zdCBvbkRyYWdVcGRhdGUgPSB1cGRhdGUgPT4ge1xuICBjb25zdCBsb2NhdGlvbiA9IHVwZGF0ZS5kZXN0aW5hdGlvbjtcblxuICBpZiAobG9jYXRpb24pIHtcbiAgICByZXR1cm4gd2l0aExvY2F0aW9uKHVwZGF0ZS5zb3VyY2UsIGxvY2F0aW9uKTtcbiAgfVxuXG4gIGNvbnN0IGNvbWJpbmUgPSB1cGRhdGUuY29tYmluZTtcblxuICBpZiAoY29tYmluZSkge1xuICAgIHJldHVybiB3aXRoQ29tYmluZSh1cGRhdGUuZHJhZ2dhYmxlSWQsIHVwZGF0ZS5zb3VyY2UsIGNvbWJpbmUpO1xuICB9XG5cbiAgcmV0dXJuICdZb3UgYXJlIG92ZXIgYW4gYXJlYSB0aGF0IGNhbm5vdCBiZSBkcm9wcGVkIG9uJztcbn07XG5cbmNvbnN0IHJldHVybmVkVG9TdGFydCA9IHNvdXJjZSA9PiBgXG4gIFRoZSBpdGVtIGhhcyByZXR1cm5lZCB0byBpdHMgc3RhcnRpbmcgcG9zaXRpb25cbiAgb2YgJHtwb3NpdGlvbihzb3VyY2UuaW5kZXgpfVxuYDtcblxuY29uc3Qgb25EcmFnRW5kID0gcmVzdWx0ID0+IHtcbiAgaWYgKHJlc3VsdC5yZWFzb24gPT09ICdDQU5DRUwnKSB7XG4gICAgcmV0dXJuIGBcbiAgICAgIE1vdmVtZW50IGNhbmNlbGxlZC5cbiAgICAgICR7cmV0dXJuZWRUb1N0YXJ0KHJlc3VsdC5zb3VyY2UpfVxuICAgIGA7XG4gIH1cblxuICBjb25zdCBsb2NhdGlvbiA9IHJlc3VsdC5kZXN0aW5hdGlvbjtcbiAgY29uc3QgY29tYmluZSA9IHJlc3VsdC5jb21iaW5lO1xuXG4gIGlmIChsb2NhdGlvbikge1xuICAgIHJldHVybiBgXG4gICAgICBZb3UgaGF2ZSBkcm9wcGVkIHRoZSBpdGVtLlxuICAgICAgJHt3aXRoTG9jYXRpb24ocmVzdWx0LnNvdXJjZSwgbG9jYXRpb24pfVxuICAgIGA7XG4gIH1cblxuICBpZiAoY29tYmluZSkge1xuICAgIHJldHVybiBgXG4gICAgICBZb3UgaGF2ZSBkcm9wcGVkIHRoZSBpdGVtLlxuICAgICAgJHt3aXRoQ29tYmluZShyZXN1bHQuZHJhZ2dhYmxlSWQsIHJlc3VsdC5zb3VyY2UsIGNvbWJpbmUpfVxuICAgIGA7XG4gIH1cblxuICByZXR1cm4gYFxuICAgIFRoZSBpdGVtIGhhcyBiZWVuIGRyb3BwZWQgd2hpbGUgbm90IG92ZXIgYSBkcm9wIGFyZWEuXG4gICAgJHtyZXR1cm5lZFRvU3RhcnQocmVzdWx0LnNvdXJjZSl9XG4gIGA7XG59O1xuXG5jb25zdCBwcmVzZXQgPSB7XG4gIGRyYWdIYW5kbGVVc2FnZUluc3RydWN0aW9ucyxcbiAgb25EcmFnU3RhcnQsXG4gIG9uRHJhZ1VwZGF0ZSxcbiAgb25EcmFnRW5kXG59O1xudmFyIHByZXNldCQxID0gcHJlc2V0O1xuXG5jb25zdCBvcmlnaW4gPSB7XG4gIHg6IDAsXG4gIHk6IDBcbn07XG5jb25zdCBhZGQgPSAocG9pbnQxLCBwb2ludDIpID0+ICh7XG4gIHg6IHBvaW50MS54ICsgcG9pbnQyLngsXG4gIHk6IHBvaW50MS55ICsgcG9pbnQyLnlcbn0pO1xuY29uc3Qgc3VidHJhY3QgPSAocG9pbnQxLCBwb2ludDIpID0+ICh7XG4gIHg6IHBvaW50MS54IC0gcG9pbnQyLngsXG4gIHk6IHBvaW50MS55IC0gcG9pbnQyLnlcbn0pO1xuY29uc3QgaXNFcXVhbCQxID0gKHBvaW50MSwgcG9pbnQyKSA9PiBwb2ludDEueCA9PT0gcG9pbnQyLnggJiYgcG9pbnQxLnkgPT09IHBvaW50Mi55O1xuY29uc3QgbmVnYXRlID0gcG9pbnQgPT4gKHtcbiAgeDogcG9pbnQueCAhPT0gMCA/IC1wb2ludC54IDogMCxcbiAgeTogcG9pbnQueSAhPT0gMCA/IC1wb2ludC55IDogMFxufSk7XG5jb25zdCBwYXRjaCA9IGZ1bmN0aW9uIChsaW5lLCB2YWx1ZSwgb3RoZXJWYWx1ZSkge1xuICBpZiAob3RoZXJWYWx1ZSA9PT0gdm9pZCAwKSB7XG4gICAgb3RoZXJWYWx1ZSA9IDA7XG4gIH1cblxuICBpZiAobGluZSA9PT0gJ3gnKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IHZhbHVlLFxuICAgICAgeTogb3RoZXJWYWx1ZVxuICAgIH07XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHg6IG90aGVyVmFsdWUsXG4gICAgeTogdmFsdWVcbiAgfTtcbn07XG5jb25zdCBkaXN0YW5jZSA9IChwb2ludDEsIHBvaW50MikgPT4gTWF0aC5zcXJ0KChwb2ludDIueCAtIHBvaW50MS54KSAqKiAyICsgKHBvaW50Mi55IC0gcG9pbnQxLnkpICoqIDIpO1xuY29uc3QgY2xvc2VzdCQxID0gKHRhcmdldCwgcG9pbnRzKSA9PiBNYXRoLm1pbiguLi5wb2ludHMubWFwKHBvaW50ID0+IGRpc3RhbmNlKHRhcmdldCwgcG9pbnQpKSk7XG5jb25zdCBhcHBseSA9IGZuID0+IHBvaW50ID0+ICh7XG4gIHg6IGZuKHBvaW50LngpLFxuICB5OiBmbihwb2ludC55KVxufSk7XG5cbnZhciBleGVjdXRlQ2xpcCA9ICgoZnJhbWUsIHN1YmplY3QpID0+IHtcbiAgY29uc3QgcmVzdWx0ID0gY3NzQm94TW9kZWwuZ2V0UmVjdCh7XG4gICAgdG9wOiBNYXRoLm1heChzdWJqZWN0LnRvcCwgZnJhbWUudG9wKSxcbiAgICByaWdodDogTWF0aC5taW4oc3ViamVjdC5yaWdodCwgZnJhbWUucmlnaHQpLFxuICAgIGJvdHRvbTogTWF0aC5taW4oc3ViamVjdC5ib3R0b20sIGZyYW1lLmJvdHRvbSksXG4gICAgbGVmdDogTWF0aC5tYXgoc3ViamVjdC5sZWZ0LCBmcmFtZS5sZWZ0KVxuICB9KTtcblxuICBpZiAocmVzdWx0LndpZHRoIDw9IDAgfHwgcmVzdWx0LmhlaWdodCA8PSAwKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufSk7XG5cbmNvbnN0IG9mZnNldEJ5UG9zaXRpb24gPSAoc3BhY2luZywgcG9pbnQpID0+ICh7XG4gIHRvcDogc3BhY2luZy50b3AgKyBwb2ludC55LFxuICBsZWZ0OiBzcGFjaW5nLmxlZnQgKyBwb2ludC54LFxuICBib3R0b206IHNwYWNpbmcuYm90dG9tICsgcG9pbnQueSxcbiAgcmlnaHQ6IHNwYWNpbmcucmlnaHQgKyBwb2ludC54XG59KTtcbmNvbnN0IGdldENvcm5lcnMgPSBzcGFjaW5nID0+IFt7XG4gIHg6IHNwYWNpbmcubGVmdCxcbiAgeTogc3BhY2luZy50b3Bcbn0sIHtcbiAgeDogc3BhY2luZy5yaWdodCxcbiAgeTogc3BhY2luZy50b3Bcbn0sIHtcbiAgeDogc3BhY2luZy5sZWZ0LFxuICB5OiBzcGFjaW5nLmJvdHRvbVxufSwge1xuICB4OiBzcGFjaW5nLnJpZ2h0LFxuICB5OiBzcGFjaW5nLmJvdHRvbVxufV07XG5jb25zdCBub1NwYWNpbmcgPSB7XG4gIHRvcDogMCxcbiAgcmlnaHQ6IDAsXG4gIGJvdHRvbTogMCxcbiAgbGVmdDogMFxufTtcblxuY29uc3Qgc2Nyb2xsJDEgPSAodGFyZ2V0LCBmcmFtZSkgPT4ge1xuICBpZiAoIWZyYW1lKSB7XG4gICAgcmV0dXJuIHRhcmdldDtcbiAgfVxuXG4gIHJldHVybiBvZmZzZXRCeVBvc2l0aW9uKHRhcmdldCwgZnJhbWUuc2Nyb2xsLmRpZmYuZGlzcGxhY2VtZW50KTtcbn07XG5cbmNvbnN0IGluY3JlYXNlID0gKHRhcmdldCwgYXhpcywgd2l0aFBsYWNlaG9sZGVyKSA9PiB7XG4gIGlmICh3aXRoUGxhY2Vob2xkZXIgJiYgd2l0aFBsYWNlaG9sZGVyLmluY3JlYXNlZEJ5KSB7XG4gICAgcmV0dXJuIHsgLi4udGFyZ2V0LFxuICAgICAgW2F4aXMuZW5kXTogdGFyZ2V0W2F4aXMuZW5kXSArIHdpdGhQbGFjZWhvbGRlci5pbmNyZWFzZWRCeVtheGlzLmxpbmVdXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59O1xuXG5jb25zdCBjbGlwID0gKHRhcmdldCwgZnJhbWUpID0+IHtcbiAgaWYgKGZyYW1lICYmIGZyYW1lLnNob3VsZENsaXBTdWJqZWN0KSB7XG4gICAgcmV0dXJuIGV4ZWN1dGVDbGlwKGZyYW1lLnBhZ2VNYXJnaW5Cb3gsIHRhcmdldCk7XG4gIH1cblxuICByZXR1cm4gY3NzQm94TW9kZWwuZ2V0UmVjdCh0YXJnZXQpO1xufTtcblxudmFyIGdldFN1YmplY3QgPSAoX3JlZiA9PiB7XG4gIGxldCB7XG4gICAgcGFnZSxcbiAgICB3aXRoUGxhY2Vob2xkZXIsXG4gICAgYXhpcyxcbiAgICBmcmFtZVxuICB9ID0gX3JlZjtcbiAgY29uc3Qgc2Nyb2xsZWQgPSBzY3JvbGwkMShwYWdlLm1hcmdpbkJveCwgZnJhbWUpO1xuICBjb25zdCBpbmNyZWFzZWQgPSBpbmNyZWFzZShzY3JvbGxlZCwgYXhpcywgd2l0aFBsYWNlaG9sZGVyKTtcbiAgY29uc3QgY2xpcHBlZCA9IGNsaXAoaW5jcmVhc2VkLCBmcmFtZSk7XG4gIHJldHVybiB7XG4gICAgcGFnZSxcbiAgICB3aXRoUGxhY2Vob2xkZXIsXG4gICAgYWN0aXZlOiBjbGlwcGVkXG4gIH07XG59KTtcblxudmFyIHNjcm9sbERyb3BwYWJsZSA9ICgoZHJvcHBhYmxlLCBuZXdTY3JvbGwpID0+IHtcbiAgIWRyb3BwYWJsZS5mcmFtZSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IGludmFyaWFudChmYWxzZSkgOiBpbnZhcmlhbnQoZmFsc2UpIDogdm9pZCAwO1xuICBjb25zdCBzY3JvbGxhYmxlID0gZHJvcHBhYmxlLmZyYW1lO1xuICBjb25zdCBzY3JvbGxEaWZmID0gc3VidHJhY3QobmV3U2Nyb2xsLCBzY3JvbGxhYmxlLnNjcm9sbC5pbml0aWFsKTtcbiAgY29uc3Qgc2Nyb2xsRGlzcGxhY2VtZW50ID0gbmVnYXRlKHNjcm9sbERpZmYpO1xuICBjb25zdCBmcmFtZSA9IHsgLi4uc2Nyb2xsYWJsZSxcbiAgICBzY3JvbGw6IHtcbiAgICAgIGluaXRpYWw6IHNjcm9sbGFibGUuc2Nyb2xsLmluaXRpYWwsXG4gICAgICBjdXJyZW50OiBuZXdTY3JvbGwsXG4gICAgICBkaWZmOiB7XG4gICAgICAgIHZhbHVlOiBzY3JvbGxEaWZmLFxuICAgICAgICBkaXNwbGFjZW1lbnQ6IHNjcm9sbERpc3BsYWNlbWVudFxuICAgICAgfSxcbiAgICAgIG1heDogc2Nyb2xsYWJsZS5zY3JvbGwubWF4XG4gICAgfVxuICB9O1xuICBjb25zdCBzdWJqZWN0ID0gZ2V0U3ViamVjdCh7XG4gICAgcGFnZTogZHJvcHBhYmxlLnN1YmplY3QucGFnZSxcbiAgICB3aXRoUGxhY2Vob2xkZXI6IGRyb3BwYWJsZS5zdWJqZWN0LndpdGhQbGFjZWhvbGRlcixcbiAgICBheGlzOiBkcm9wcGFibGUuYXhpcyxcbiAgICBmcmFtZVxuICB9KTtcbiAgY29uc3QgcmVzdWx0ID0geyAuLi5kcm9wcGFibGUsXG4gICAgZnJhbWUsXG4gICAgc3ViamVjdFxuICB9O1xuICByZXR1cm4gcmVzdWx0O1xufSk7XG5cbmNvbnN0IHRvRHJvcHBhYmxlTWFwID0gbWVtb2l6ZU9uZV9fZGVmYXVsdFtcImRlZmF1bHRcIl0oZHJvcHBhYmxlcyA9PiBkcm9wcGFibGVzLnJlZHVjZSgocHJldmlvdXMsIGN1cnJlbnQpID0+IHtcbiAgcHJldmlvdXNbY3VycmVudC5kZXNjcmlwdG9yLmlkXSA9IGN1cnJlbnQ7XG4gIHJldHVybiBwcmV2aW91cztcbn0sIHt9KSk7XG5jb25zdCB0b0RyYWdnYWJsZU1hcCA9IG1lbW9pemVPbmVfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKGRyYWdnYWJsZXMgPT4gZHJhZ2dhYmxlcy5yZWR1Y2UoKHByZXZpb3VzLCBjdXJyZW50KSA9PiB7XG4gIHByZXZpb3VzW2N1cnJlbnQuZGVzY3JpcHRvci5pZF0gPSBjdXJyZW50O1xuICByZXR1cm4gcHJldmlvdXM7XG59LCB7fSkpO1xuY29uc3QgdG9Ecm9wcGFibGVMaXN0ID0gbWVtb2l6ZU9uZV9fZGVmYXVsdFtcImRlZmF1bHRcIl0oZHJvcHBhYmxlcyA9PiBPYmplY3QudmFsdWVzKGRyb3BwYWJsZXMpKTtcbmNvbnN0IHRvRHJhZ2dhYmxlTGlzdCA9IG1lbW9pemVPbmVfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKGRyYWdnYWJsZXMgPT4gT2JqZWN0LnZhbHVlcyhkcmFnZ2FibGVzKSk7XG5cbnZhciBnZXREcmFnZ2FibGVzSW5zaWRlRHJvcHBhYmxlID0gbWVtb2l6ZU9uZV9fZGVmYXVsdFtcImRlZmF1bHRcIl0oKGRyb3BwYWJsZUlkLCBkcmFnZ2FibGVzKSA9PiB7XG4gIGNvbnN0IHJlc3VsdCA9IHRvRHJhZ2dhYmxlTGlzdChkcmFnZ2FibGVzKS5maWx0ZXIoZHJhZ2dhYmxlID0+IGRyb3BwYWJsZUlkID09PSBkcmFnZ2FibGUuZGVzY3JpcHRvci5kcm9wcGFibGVJZCkuc29ydCgoYSwgYikgPT4gYS5kZXNjcmlwdG9yLmluZGV4IC0gYi5kZXNjcmlwdG9yLmluZGV4KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn0pO1xuXG5mdW5jdGlvbiB0cnlHZXREZXN0aW5hdGlvbihpbXBhY3QpIHtcbiAgaWYgKGltcGFjdC5hdCAmJiBpbXBhY3QuYXQudHlwZSA9PT0gJ1JFT1JERVInKSB7XG4gICAgcmV0dXJuIGltcGFjdC5hdC5kZXN0aW5hdGlvbjtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gdHJ5R2V0Q29tYmluZShpbXBhY3QpIHtcbiAgaWYgKGltcGFjdC5hdCAmJiBpbXBhY3QuYXQudHlwZSA9PT0gJ0NPTUJJTkUnKSB7XG4gICAgcmV0dXJuIGltcGFjdC5hdC5jb21iaW5lO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbnZhciByZW1vdmVEcmFnZ2FibGVGcm9tTGlzdCA9IG1lbW9pemVPbmVfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKChyZW1vdmUsIGxpc3QpID0+IGxpc3QuZmlsdGVyKGl0ZW0gPT4gaXRlbS5kZXNjcmlwdG9yLmlkICE9PSByZW1vdmUuZGVzY3JpcHRvci5pZCkpO1xuXG52YXIgbW92ZVRvTmV4dENvbWJpbmUgPSAoX3JlZiA9PiB7XG4gIGxldCB7XG4gICAgaXNNb3ZpbmdGb3J3YXJkLFxuICAgIGRyYWdnYWJsZSxcbiAgICBkZXN0aW5hdGlvbixcbiAgICBpbnNpZGVEZXN0aW5hdGlvbixcbiAgICBwcmV2aW91c0ltcGFjdFxuICB9ID0gX3JlZjtcblxuICBpZiAoIWRlc3RpbmF0aW9uLmlzQ29tYmluZUVuYWJsZWQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IGxvY2F0aW9uID0gdHJ5R2V0RGVzdGluYXRpb24ocHJldmlvdXNJbXBhY3QpO1xuXG4gIGlmICghbG9jYXRpb24pIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldEltcGFjdCh0YXJnZXQpIHtcbiAgICBjb25zdCBhdCA9IHtcbiAgICAgIHR5cGU6ICdDT01CSU5FJyxcbiAgICAgIGNvbWJpbmU6IHtcbiAgICAgICAgZHJhZ2dhYmxlSWQ6IHRhcmdldCxcbiAgICAgICAgZHJvcHBhYmxlSWQ6IGRlc3RpbmF0aW9uLmRlc2NyaXB0b3IuaWRcbiAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiB7IC4uLnByZXZpb3VzSW1wYWN0LFxuICAgICAgYXRcbiAgICB9O1xuICB9XG5cbiAgY29uc3QgYWxsID0gcHJldmlvdXNJbXBhY3QuZGlzcGxhY2VkLmFsbDtcbiAgY29uc3QgY2xvc2VzdElkID0gYWxsLmxlbmd0aCA/IGFsbFswXSA6IG51bGw7XG5cbiAgaWYgKGlzTW92aW5nRm9yd2FyZCkge1xuICAgIHJldHVybiBjbG9zZXN0SWQgPyBnZXRJbXBhY3QoY2xvc2VzdElkKSA6IG51bGw7XG4gIH1cblxuICBjb25zdCB3aXRob3V0RHJhZ2dhYmxlID0gcmVtb3ZlRHJhZ2dhYmxlRnJvbUxpc3QoZHJhZ2dhYmxlLCBpbnNpZGVEZXN0aW5hdGlvbik7XG5cbiAgaWYgKCFjbG9zZXN0SWQpIHtcbiAgICBpZiAoIXdpdGhvdXREcmFnZ2FibGUubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBsYXN0ID0gd2l0aG91dERyYWdnYWJsZVt3aXRob3V0RHJhZ2dhYmxlLmxlbmd0aCAtIDFdO1xuICAgIHJldHVybiBnZXRJbXBhY3QobGFzdC5kZXNjcmlwdG9yLmlkKTtcbiAgfVxuXG4gIGNvbnN0IGluZGV4T2ZDbG9zZXN0ID0gd2l0aG91dERyYWdnYWJsZS5maW5kSW5kZXgoZCA9PiBkLmRlc2NyaXB0b3IuaWQgPT09IGNsb3Nlc3RJZCk7XG4gICEoaW5kZXhPZkNsb3Nlc3QgIT09IC0xKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IGludmFyaWFudChmYWxzZSwgJ0NvdWxkIG5vdCBmaW5kIGRpc3BsYWNlZCBpdGVtIGluIHNldCcpIDogaW52YXJpYW50KGZhbHNlKSA6IHZvaWQgMDtcbiAgY29uc3QgcHJvcG9zZWRJbmRleCA9IGluZGV4T2ZDbG9zZXN0IC0gMTtcblxuICBpZiAocHJvcG9zZWRJbmRleCA8IDApIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IGJlZm9yZSA9IHdpdGhvdXREcmFnZ2FibGVbcHJvcG9zZWRJbmRleF07XG4gIHJldHVybiBnZXRJbXBhY3QoYmVmb3JlLmRlc2NyaXB0b3IuaWQpO1xufSk7XG5cbnZhciBpc0hvbWVPZiA9ICgoZHJhZ2dhYmxlLCBkZXN0aW5hdGlvbikgPT4gZHJhZ2dhYmxlLmRlc2NyaXB0b3IuZHJvcHBhYmxlSWQgPT09IGRlc3RpbmF0aW9uLmRlc2NyaXB0b3IuaWQpO1xuXG5jb25zdCBub0Rpc3BsYWNlZEJ5ID0ge1xuICBwb2ludDogb3JpZ2luLFxuICB2YWx1ZTogMFxufTtcbmNvbnN0IGVtcHR5R3JvdXBzID0ge1xuICBpbnZpc2libGU6IHt9LFxuICB2aXNpYmxlOiB7fSxcbiAgYWxsOiBbXVxufTtcbmNvbnN0IG5vSW1wYWN0ID0ge1xuICBkaXNwbGFjZWQ6IGVtcHR5R3JvdXBzLFxuICBkaXNwbGFjZWRCeTogbm9EaXNwbGFjZWRCeSxcbiAgYXQ6IG51bGxcbn07XG52YXIgbm9JbXBhY3QkMSA9IG5vSW1wYWN0O1xuXG52YXIgaXNXaXRoaW4gPSAoKGxvd2VyQm91bmQsIHVwcGVyQm91bmQpID0+IHZhbHVlID0+IGxvd2VyQm91bmQgPD0gdmFsdWUgJiYgdmFsdWUgPD0gdXBwZXJCb3VuZCk7XG5cbnZhciBpc1BhcnRpYWxseVZpc2libGVUaHJvdWdoRnJhbWUgPSAoZnJhbWUgPT4ge1xuICBjb25zdCBpc1dpdGhpblZlcnRpY2FsID0gaXNXaXRoaW4oZnJhbWUudG9wLCBmcmFtZS5ib3R0b20pO1xuICBjb25zdCBpc1dpdGhpbkhvcml6b250YWwgPSBpc1dpdGhpbihmcmFtZS5sZWZ0LCBmcmFtZS5yaWdodCk7XG4gIHJldHVybiBzdWJqZWN0ID0+IHtcbiAgICBjb25zdCBpc0NvbnRhaW5lZCA9IGlzV2l0aGluVmVydGljYWwoc3ViamVjdC50b3ApICYmIGlzV2l0aGluVmVydGljYWwoc3ViamVjdC5ib3R0b20pICYmIGlzV2l0aGluSG9yaXpvbnRhbChzdWJqZWN0LmxlZnQpICYmIGlzV2l0aGluSG9yaXpvbnRhbChzdWJqZWN0LnJpZ2h0KTtcblxuICAgIGlmIChpc0NvbnRhaW5lZCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgY29uc3QgaXNQYXJ0aWFsbHlWaXNpYmxlVmVydGljYWxseSA9IGlzV2l0aGluVmVydGljYWwoc3ViamVjdC50b3ApIHx8IGlzV2l0aGluVmVydGljYWwoc3ViamVjdC5ib3R0b20pO1xuICAgIGNvbnN0IGlzUGFydGlhbGx5VmlzaWJsZUhvcml6b250YWxseSA9IGlzV2l0aGluSG9yaXpvbnRhbChzdWJqZWN0LmxlZnQpIHx8IGlzV2l0aGluSG9yaXpvbnRhbChzdWJqZWN0LnJpZ2h0KTtcbiAgICBjb25zdCBpc1BhcnRpYWxseUNvbnRhaW5lZCA9IGlzUGFydGlhbGx5VmlzaWJsZVZlcnRpY2FsbHkgJiYgaXNQYXJ0aWFsbHlWaXNpYmxlSG9yaXpvbnRhbGx5O1xuXG4gICAgaWYgKGlzUGFydGlhbGx5Q29udGFpbmVkKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBpc0JpZ2dlclZlcnRpY2FsbHkgPSBzdWJqZWN0LnRvcCA8IGZyYW1lLnRvcCAmJiBzdWJqZWN0LmJvdHRvbSA+IGZyYW1lLmJvdHRvbTtcbiAgICBjb25zdCBpc0JpZ2dlckhvcml6b250YWxseSA9IHN1YmplY3QubGVmdCA8IGZyYW1lLmxlZnQgJiYgc3ViamVjdC5yaWdodCA+IGZyYW1lLnJpZ2h0O1xuICAgIGNvbnN0IGlzVGFyZ2V0QmlnZ2VyVGhhbkZyYW1lID0gaXNCaWdnZXJWZXJ0aWNhbGx5ICYmIGlzQmlnZ2VySG9yaXpvbnRhbGx5O1xuXG4gICAgaWYgKGlzVGFyZ2V0QmlnZ2VyVGhhbkZyYW1lKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBpc1RhcmdldEJpZ2dlck9uT25lQXhpcyA9IGlzQmlnZ2VyVmVydGljYWxseSAmJiBpc1BhcnRpYWxseVZpc2libGVIb3Jpem9udGFsbHkgfHwgaXNCaWdnZXJIb3Jpem9udGFsbHkgJiYgaXNQYXJ0aWFsbHlWaXNpYmxlVmVydGljYWxseTtcbiAgICByZXR1cm4gaXNUYXJnZXRCaWdnZXJPbk9uZUF4aXM7XG4gIH07XG59KTtcblxudmFyIGlzVG90YWxseVZpc2libGVUaHJvdWdoRnJhbWUgPSAoZnJhbWUgPT4ge1xuICBjb25zdCBpc1dpdGhpblZlcnRpY2FsID0gaXNXaXRoaW4oZnJhbWUudG9wLCBmcmFtZS5ib3R0b20pO1xuICBjb25zdCBpc1dpdGhpbkhvcml6b250YWwgPSBpc1dpdGhpbihmcmFtZS5sZWZ0LCBmcmFtZS5yaWdodCk7XG4gIHJldHVybiBzdWJqZWN0ID0+IHtcbiAgICBjb25zdCBpc0NvbnRhaW5lZCA9IGlzV2l0aGluVmVydGljYWwoc3ViamVjdC50b3ApICYmIGlzV2l0aGluVmVydGljYWwoc3ViamVjdC5ib3R0b20pICYmIGlzV2l0aGluSG9yaXpvbnRhbChzdWJqZWN0LmxlZnQpICYmIGlzV2l0aGluSG9yaXpvbnRhbChzdWJqZWN0LnJpZ2h0KTtcbiAgICByZXR1cm4gaXNDb250YWluZWQ7XG4gIH07XG59KTtcblxuY29uc3QgdmVydGljYWwgPSB7XG4gIGRpcmVjdGlvbjogJ3ZlcnRpY2FsJyxcbiAgbGluZTogJ3knLFxuICBjcm9zc0F4aXNMaW5lOiAneCcsXG4gIHN0YXJ0OiAndG9wJyxcbiAgZW5kOiAnYm90dG9tJyxcbiAgc2l6ZTogJ2hlaWdodCcsXG4gIGNyb3NzQXhpc1N0YXJ0OiAnbGVmdCcsXG4gIGNyb3NzQXhpc0VuZDogJ3JpZ2h0JyxcbiAgY3Jvc3NBeGlzU2l6ZTogJ3dpZHRoJ1xufTtcbmNvbnN0IGhvcml6b250YWwgPSB7XG4gIGRpcmVjdGlvbjogJ2hvcml6b250YWwnLFxuICBsaW5lOiAneCcsXG4gIGNyb3NzQXhpc0xpbmU6ICd5JyxcbiAgc3RhcnQ6ICdsZWZ0JyxcbiAgZW5kOiAncmlnaHQnLFxuICBzaXplOiAnd2lkdGgnLFxuICBjcm9zc0F4aXNTdGFydDogJ3RvcCcsXG4gIGNyb3NzQXhpc0VuZDogJ2JvdHRvbScsXG4gIGNyb3NzQXhpc1NpemU6ICdoZWlnaHQnXG59O1xuXG52YXIgaXNUb3RhbGx5VmlzaWJsZVRocm91Z2hGcmFtZU9uQXhpcyA9IChheGlzID0+IGZyYW1lID0+IHtcbiAgY29uc3QgaXNXaXRoaW5WZXJ0aWNhbCA9IGlzV2l0aGluKGZyYW1lLnRvcCwgZnJhbWUuYm90dG9tKTtcbiAgY29uc3QgaXNXaXRoaW5Ib3Jpem9udGFsID0gaXNXaXRoaW4oZnJhbWUubGVmdCwgZnJhbWUucmlnaHQpO1xuICByZXR1cm4gc3ViamVjdCA9PiB7XG4gICAgaWYgKGF4aXMgPT09IHZlcnRpY2FsKSB7XG4gICAgICByZXR1cm4gaXNXaXRoaW5WZXJ0aWNhbChzdWJqZWN0LnRvcCkgJiYgaXNXaXRoaW5WZXJ0aWNhbChzdWJqZWN0LmJvdHRvbSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGlzV2l0aGluSG9yaXpvbnRhbChzdWJqZWN0LmxlZnQpICYmIGlzV2l0aGluSG9yaXpvbnRhbChzdWJqZWN0LnJpZ2h0KTtcbiAgfTtcbn0pO1xuXG5jb25zdCBnZXREcm9wcGFibGVEaXNwbGFjZWQgPSAodGFyZ2V0LCBkZXN0aW5hdGlvbikgPT4ge1xuICBjb25zdCBkaXNwbGFjZW1lbnQgPSBkZXN0aW5hdGlvbi5mcmFtZSA/IGRlc3RpbmF0aW9uLmZyYW1lLnNjcm9sbC5kaWZmLmRpc3BsYWNlbWVudCA6IG9yaWdpbjtcbiAgcmV0dXJuIG9mZnNldEJ5UG9zaXRpb24odGFyZ2V0LCBkaXNwbGFjZW1lbnQpO1xufTtcblxuY29uc3QgaXNWaXNpYmxlSW5Ecm9wcGFibGUgPSAodGFyZ2V0LCBkZXN0aW5hdGlvbiwgaXNWaXNpYmxlVGhyb3VnaEZyYW1lRm4pID0+IHtcbiAgaWYgKCFkZXN0aW5hdGlvbi5zdWJqZWN0LmFjdGl2ZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBpc1Zpc2libGVUaHJvdWdoRnJhbWVGbihkZXN0aW5hdGlvbi5zdWJqZWN0LmFjdGl2ZSkodGFyZ2V0KTtcbn07XG5cbmNvbnN0IGlzVmlzaWJsZUluVmlld3BvcnQgPSAodGFyZ2V0LCB2aWV3cG9ydCwgaXNWaXNpYmxlVGhyb3VnaEZyYW1lRm4pID0+IGlzVmlzaWJsZVRocm91Z2hGcmFtZUZuKHZpZXdwb3J0KSh0YXJnZXQpO1xuXG5jb25zdCBpc1Zpc2libGUkMSA9IF9yZWYgPT4ge1xuICBsZXQge1xuICAgIHRhcmdldDogdG9CZURpc3BsYWNlZCxcbiAgICBkZXN0aW5hdGlvbixcbiAgICB2aWV3cG9ydCxcbiAgICB3aXRoRHJvcHBhYmxlRGlzcGxhY2VtZW50LFxuICAgIGlzVmlzaWJsZVRocm91Z2hGcmFtZUZuXG4gIH0gPSBfcmVmO1xuICBjb25zdCBkaXNwbGFjZWRUYXJnZXQgPSB3aXRoRHJvcHBhYmxlRGlzcGxhY2VtZW50ID8gZ2V0RHJvcHBhYmxlRGlzcGxhY2VkKHRvQmVEaXNwbGFjZWQsIGRlc3RpbmF0aW9uKSA6IHRvQmVEaXNwbGFjZWQ7XG4gIHJldHVybiBpc1Zpc2libGVJbkRyb3BwYWJsZShkaXNwbGFjZWRUYXJnZXQsIGRlc3RpbmF0aW9uLCBpc1Zpc2libGVUaHJvdWdoRnJhbWVGbikgJiYgaXNWaXNpYmxlSW5WaWV3cG9ydChkaXNwbGFjZWRUYXJnZXQsIHZpZXdwb3J0LCBpc1Zpc2libGVUaHJvdWdoRnJhbWVGbik7XG59O1xuXG5jb25zdCBpc1BhcnRpYWxseVZpc2libGUgPSBhcmdzID0+IGlzVmlzaWJsZSQxKHsgLi4uYXJncyxcbiAgaXNWaXNpYmxlVGhyb3VnaEZyYW1lRm46IGlzUGFydGlhbGx5VmlzaWJsZVRocm91Z2hGcmFtZVxufSk7XG5jb25zdCBpc1RvdGFsbHlWaXNpYmxlID0gYXJncyA9PiBpc1Zpc2libGUkMSh7IC4uLmFyZ3MsXG4gIGlzVmlzaWJsZVRocm91Z2hGcmFtZUZuOiBpc1RvdGFsbHlWaXNpYmxlVGhyb3VnaEZyYW1lXG59KTtcbmNvbnN0IGlzVG90YWxseVZpc2libGVPbkF4aXMgPSBhcmdzID0+IGlzVmlzaWJsZSQxKHsgLi4uYXJncyxcbiAgaXNWaXNpYmxlVGhyb3VnaEZyYW1lRm46IGlzVG90YWxseVZpc2libGVUaHJvdWdoRnJhbWVPbkF4aXMoYXJncy5kZXN0aW5hdGlvbi5heGlzKVxufSk7XG5cbmNvbnN0IGdldFNob3VsZEFuaW1hdGUgPSAoaWQsIGxhc3QsIGZvcmNlU2hvdWxkQW5pbWF0ZSkgPT4ge1xuICBpZiAodHlwZW9mIGZvcmNlU2hvdWxkQW5pbWF0ZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgcmV0dXJuIGZvcmNlU2hvdWxkQW5pbWF0ZTtcbiAgfVxuXG4gIGlmICghbGFzdCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgY29uc3Qge1xuICAgIGludmlzaWJsZSxcbiAgICB2aXNpYmxlXG4gIH0gPSBsYXN0O1xuXG4gIGlmIChpbnZpc2libGVbaWRdKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgcHJldmlvdXMgPSB2aXNpYmxlW2lkXTtcbiAgcmV0dXJuIHByZXZpb3VzID8gcHJldmlvdXMuc2hvdWxkQW5pbWF0ZSA6IHRydWU7XG59O1xuXG5mdW5jdGlvbiBnZXRUYXJnZXQoZHJhZ2dhYmxlLCBkaXNwbGFjZWRCeSkge1xuICBjb25zdCBtYXJnaW5Cb3ggPSBkcmFnZ2FibGUucGFnZS5tYXJnaW5Cb3g7XG4gIGNvbnN0IGV4cGFuZEJ5ID0ge1xuICAgIHRvcDogZGlzcGxhY2VkQnkucG9pbnQueSxcbiAgICByaWdodDogMCxcbiAgICBib3R0b206IDAsXG4gICAgbGVmdDogZGlzcGxhY2VkQnkucG9pbnQueFxuICB9O1xuICByZXR1cm4gY3NzQm94TW9kZWwuZ2V0UmVjdChjc3NCb3hNb2RlbC5leHBhbmQobWFyZ2luQm94LCBleHBhbmRCeSkpO1xufVxuXG5mdW5jdGlvbiBnZXREaXNwbGFjZW1lbnRHcm91cHMoX3JlZikge1xuICBsZXQge1xuICAgIGFmdGVyRHJhZ2dpbmcsXG4gICAgZGVzdGluYXRpb24sXG4gICAgZGlzcGxhY2VkQnksXG4gICAgdmlld3BvcnQsXG4gICAgZm9yY2VTaG91bGRBbmltYXRlLFxuICAgIGxhc3RcbiAgfSA9IF9yZWY7XG4gIHJldHVybiBhZnRlckRyYWdnaW5nLnJlZHVjZShmdW5jdGlvbiBwcm9jZXNzKGdyb3VwcywgZHJhZ2dhYmxlKSB7XG4gICAgY29uc3QgdGFyZ2V0ID0gZ2V0VGFyZ2V0KGRyYWdnYWJsZSwgZGlzcGxhY2VkQnkpO1xuICAgIGNvbnN0IGlkID0gZHJhZ2dhYmxlLmRlc2NyaXB0b3IuaWQ7XG4gICAgZ3JvdXBzLmFsbC5wdXNoKGlkKTtcbiAgICBjb25zdCBpc1Zpc2libGUgPSBpc1BhcnRpYWxseVZpc2libGUoe1xuICAgICAgdGFyZ2V0LFxuICAgICAgZGVzdGluYXRpb24sXG4gICAgICB2aWV3cG9ydCxcbiAgICAgIHdpdGhEcm9wcGFibGVEaXNwbGFjZW1lbnQ6IHRydWVcbiAgICB9KTtcblxuICAgIGlmICghaXNWaXNpYmxlKSB7XG4gICAgICBncm91cHMuaW52aXNpYmxlW2RyYWdnYWJsZS5kZXNjcmlwdG9yLmlkXSA9IHRydWU7XG4gICAgICByZXR1cm4gZ3JvdXBzO1xuICAgIH1cblxuICAgIGNvbnN0IHNob3VsZEFuaW1hdGUgPSBnZXRTaG91bGRBbmltYXRlKGlkLCBsYXN0LCBmb3JjZVNob3VsZEFuaW1hdGUpO1xuICAgIGNvbnN0IGRpc3BsYWNlbWVudCA9IHtcbiAgICAgIGRyYWdnYWJsZUlkOiBpZCxcbiAgICAgIHNob3VsZEFuaW1hdGVcbiAgICB9O1xuICAgIGdyb3Vwcy52aXNpYmxlW2lkXSA9IGRpc3BsYWNlbWVudDtcbiAgICByZXR1cm4gZ3JvdXBzO1xuICB9LCB7XG4gICAgYWxsOiBbXSxcbiAgICB2aXNpYmxlOiB7fSxcbiAgICBpbnZpc2libGU6IHt9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRJbmRleE9mTGFzdEl0ZW0oZHJhZ2dhYmxlcywgb3B0aW9ucykge1xuICBpZiAoIWRyYWdnYWJsZXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBjb25zdCBpbmRleE9mTGFzdEl0ZW0gPSBkcmFnZ2FibGVzW2RyYWdnYWJsZXMubGVuZ3RoIC0gMV0uZGVzY3JpcHRvci5pbmRleDtcbiAgcmV0dXJuIG9wdGlvbnMuaW5Ib21lTGlzdCA/IGluZGV4T2ZMYXN0SXRlbSA6IGluZGV4T2ZMYXN0SXRlbSArIDE7XG59XG5cbmZ1bmN0aW9uIGdvQXRFbmQoX3JlZikge1xuICBsZXQge1xuICAgIGluc2lkZURlc3RpbmF0aW9uLFxuICAgIGluSG9tZUxpc3QsXG4gICAgZGlzcGxhY2VkQnksXG4gICAgZGVzdGluYXRpb25cbiAgfSA9IF9yZWY7XG4gIGNvbnN0IG5ld0luZGV4ID0gZ2V0SW5kZXhPZkxhc3RJdGVtKGluc2lkZURlc3RpbmF0aW9uLCB7XG4gICAgaW5Ib21lTGlzdFxuICB9KTtcbiAgcmV0dXJuIHtcbiAgICBkaXNwbGFjZWQ6IGVtcHR5R3JvdXBzLFxuICAgIGRpc3BsYWNlZEJ5LFxuICAgIGF0OiB7XG4gICAgICB0eXBlOiAnUkVPUkRFUicsXG4gICAgICBkZXN0aW5hdGlvbjoge1xuICAgICAgICBkcm9wcGFibGVJZDogZGVzdGluYXRpb24uZGVzY3JpcHRvci5pZCxcbiAgICAgICAgaW5kZXg6IG5ld0luZGV4XG4gICAgICB9XG4gICAgfVxuICB9O1xufVxuXG5mdW5jdGlvbiBjYWxjdWxhdGVSZW9yZGVySW1wYWN0KF9yZWYyKSB7XG4gIGxldCB7XG4gICAgZHJhZ2dhYmxlLFxuICAgIGluc2lkZURlc3RpbmF0aW9uLFxuICAgIGRlc3RpbmF0aW9uLFxuICAgIHZpZXdwb3J0LFxuICAgIGRpc3BsYWNlZEJ5LFxuICAgIGxhc3QsXG4gICAgaW5kZXgsXG4gICAgZm9yY2VTaG91bGRBbmltYXRlXG4gIH0gPSBfcmVmMjtcbiAgY29uc3QgaW5Ib21lTGlzdCA9IGlzSG9tZU9mKGRyYWdnYWJsZSwgZGVzdGluYXRpb24pO1xuXG4gIGlmIChpbmRleCA9PSBudWxsKSB7XG4gICAgcmV0dXJuIGdvQXRFbmQoe1xuICAgICAgaW5zaWRlRGVzdGluYXRpb24sXG4gICAgICBpbkhvbWVMaXN0LFxuICAgICAgZGlzcGxhY2VkQnksXG4gICAgICBkZXN0aW5hdGlvblxuICAgIH0pO1xuICB9XG5cbiAgY29uc3QgbWF0Y2ggPSBpbnNpZGVEZXN0aW5hdGlvbi5maW5kKGl0ZW0gPT4gaXRlbS5kZXNjcmlwdG9yLmluZGV4ID09PSBpbmRleCk7XG5cbiAgaWYgKCFtYXRjaCkge1xuICAgIHJldHVybiBnb0F0RW5kKHtcbiAgICAgIGluc2lkZURlc3RpbmF0aW9uLFxuICAgICAgaW5Ib21lTGlzdCxcbiAgICAgIGRpc3BsYWNlZEJ5LFxuICAgICAgZGVzdGluYXRpb25cbiAgICB9KTtcbiAgfVxuXG4gIGNvbnN0IHdpdGhvdXREcmFnZ2luZyA9IHJlbW92ZURyYWdnYWJsZUZyb21MaXN0KGRyYWdnYWJsZSwgaW5zaWRlRGVzdGluYXRpb24pO1xuICBjb25zdCBzbGljZUZyb20gPSBpbnNpZGVEZXN0aW5hdGlvbi5pbmRleE9mKG1hdGNoKTtcbiAgY29uc3QgaW1wYWN0ZWQgPSB3aXRob3V0RHJhZ2dpbmcuc2xpY2Uoc2xpY2VGcm9tKTtcbiAgY29uc3QgZGlzcGxhY2VkID0gZ2V0RGlzcGxhY2VtZW50R3JvdXBzKHtcbiAgICBhZnRlckRyYWdnaW5nOiBpbXBhY3RlZCxcbiAgICBkZXN0aW5hdGlvbixcbiAgICBkaXNwbGFjZWRCeSxcbiAgICBsYXN0LFxuICAgIHZpZXdwb3J0OiB2aWV3cG9ydC5mcmFtZSxcbiAgICBmb3JjZVNob3VsZEFuaW1hdGVcbiAgfSk7XG4gIHJldHVybiB7XG4gICAgZGlzcGxhY2VkLFxuICAgIGRpc3BsYWNlZEJ5LFxuICAgIGF0OiB7XG4gICAgICB0eXBlOiAnUkVPUkRFUicsXG4gICAgICBkZXN0aW5hdGlvbjoge1xuICAgICAgICBkcm9wcGFibGVJZDogZGVzdGluYXRpb24uZGVzY3JpcHRvci5pZCxcbiAgICAgICAgaW5kZXhcbiAgICAgIH1cbiAgICB9XG4gIH07XG59XG5cbmZ1bmN0aW9uIGRpZFN0YXJ0QWZ0ZXJDcml0aWNhbChkcmFnZ2FibGVJZCwgYWZ0ZXJDcml0aWNhbCkge1xuICByZXR1cm4gQm9vbGVhbihhZnRlckNyaXRpY2FsLmVmZmVjdGVkW2RyYWdnYWJsZUlkXSk7XG59XG5cbnZhciBmcm9tQ29tYmluZSA9IChfcmVmID0+IHtcbiAgbGV0IHtcbiAgICBpc01vdmluZ0ZvcndhcmQsXG4gICAgZGVzdGluYXRpb24sXG4gICAgZHJhZ2dhYmxlcyxcbiAgICBjb21iaW5lLFxuICAgIGFmdGVyQ3JpdGljYWxcbiAgfSA9IF9yZWY7XG5cbiAgaWYgKCFkZXN0aW5hdGlvbi5pc0NvbWJpbmVFbmFibGVkKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBjb21iaW5lSWQgPSBjb21iaW5lLmRyYWdnYWJsZUlkO1xuICBjb25zdCBjb21iaW5lV2l0aCA9IGRyYWdnYWJsZXNbY29tYmluZUlkXTtcbiAgY29uc3QgY29tYmluZVdpdGhJbmRleCA9IGNvbWJpbmVXaXRoLmRlc2NyaXB0b3IuaW5kZXg7XG4gIGNvbnN0IGRpZENvbWJpbmVXaXRoU3RhcnRBZnRlckNyaXRpY2FsID0gZGlkU3RhcnRBZnRlckNyaXRpY2FsKGNvbWJpbmVJZCwgYWZ0ZXJDcml0aWNhbCk7XG5cbiAgaWYgKGRpZENvbWJpbmVXaXRoU3RhcnRBZnRlckNyaXRpY2FsKSB7XG4gICAgaWYgKGlzTW92aW5nRm9yd2FyZCkge1xuICAgICAgcmV0dXJuIGNvbWJpbmVXaXRoSW5kZXg7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbWJpbmVXaXRoSW5kZXggLSAxO1xuICB9XG5cbiAgaWYgKGlzTW92aW5nRm9yd2FyZCkge1xuICAgIHJldHVybiBjb21iaW5lV2l0aEluZGV4ICsgMTtcbiAgfVxuXG4gIHJldHVybiBjb21iaW5lV2l0aEluZGV4O1xufSk7XG5cbnZhciBmcm9tUmVvcmRlciA9IChfcmVmID0+IHtcbiAgbGV0IHtcbiAgICBpc01vdmluZ0ZvcndhcmQsXG4gICAgaXNJbkhvbWVMaXN0LFxuICAgIGluc2lkZURlc3RpbmF0aW9uLFxuICAgIGxvY2F0aW9uXG4gIH0gPSBfcmVmO1xuXG4gIGlmICghaW5zaWRlRGVzdGluYXRpb24ubGVuZ3RoKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBjdXJyZW50SW5kZXggPSBsb2NhdGlvbi5pbmRleDtcbiAgY29uc3QgcHJvcG9zZWRJbmRleCA9IGlzTW92aW5nRm9yd2FyZCA/IGN1cnJlbnRJbmRleCArIDEgOiBjdXJyZW50SW5kZXggLSAxO1xuICBjb25zdCBmaXJzdEluZGV4ID0gaW5zaWRlRGVzdGluYXRpb25bMF0uZGVzY3JpcHRvci5pbmRleDtcbiAgY29uc3QgbGFzdEluZGV4ID0gaW5zaWRlRGVzdGluYXRpb25baW5zaWRlRGVzdGluYXRpb24ubGVuZ3RoIC0gMV0uZGVzY3JpcHRvci5pbmRleDtcbiAgY29uc3QgdXBwZXJCb3VuZCA9IGlzSW5Ib21lTGlzdCA/IGxhc3RJbmRleCA6IGxhc3RJbmRleCArIDE7XG5cbiAgaWYgKHByb3Bvc2VkSW5kZXggPCBmaXJzdEluZGV4KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZiAocHJvcG9zZWRJbmRleCA+IHVwcGVyQm91bmQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiBwcm9wb3NlZEluZGV4O1xufSk7XG5cbnZhciBtb3ZlVG9OZXh0SW5kZXggPSAoX3JlZiA9PiB7XG4gIGxldCB7XG4gICAgaXNNb3ZpbmdGb3J3YXJkLFxuICAgIGlzSW5Ib21lTGlzdCxcbiAgICBkcmFnZ2FibGUsXG4gICAgZHJhZ2dhYmxlcyxcbiAgICBkZXN0aW5hdGlvbixcbiAgICBpbnNpZGVEZXN0aW5hdGlvbixcbiAgICBwcmV2aW91c0ltcGFjdCxcbiAgICB2aWV3cG9ydCxcbiAgICBhZnRlckNyaXRpY2FsXG4gIH0gPSBfcmVmO1xuICBjb25zdCB3YXNBdCA9IHByZXZpb3VzSW1wYWN0LmF0O1xuICAhd2FzQXQgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBpbnZhcmlhbnQoZmFsc2UsICdDYW5ub3QgbW92ZSBpbiBkaXJlY3Rpb24gd2l0aG91dCBwcmV2aW91cyBpbXBhY3QgbG9jYXRpb24nKSA6IGludmFyaWFudChmYWxzZSkgOiB2b2lkIDA7XG5cbiAgaWYgKHdhc0F0LnR5cGUgPT09ICdSRU9SREVSJykge1xuICAgIGNvbnN0IG5ld0luZGV4ID0gZnJvbVJlb3JkZXIoe1xuICAgICAgaXNNb3ZpbmdGb3J3YXJkLFxuICAgICAgaXNJbkhvbWVMaXN0LFxuICAgICAgbG9jYXRpb246IHdhc0F0LmRlc3RpbmF0aW9uLFxuICAgICAgaW5zaWRlRGVzdGluYXRpb25cbiAgICB9KTtcblxuICAgIGlmIChuZXdJbmRleCA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gY2FsY3VsYXRlUmVvcmRlckltcGFjdCh7XG4gICAgICBkcmFnZ2FibGUsXG4gICAgICBpbnNpZGVEZXN0aW5hdGlvbixcbiAgICAgIGRlc3RpbmF0aW9uLFxuICAgICAgdmlld3BvcnQsXG4gICAgICBsYXN0OiBwcmV2aW91c0ltcGFjdC5kaXNwbGFjZWQsXG4gICAgICBkaXNwbGFjZWRCeTogcHJldmlvdXNJbXBhY3QuZGlzcGxhY2VkQnksXG4gICAgICBpbmRleDogbmV3SW5kZXhcbiAgICB9KTtcbiAgfVxuXG4gIGNvbnN0IG5ld0luZGV4ID0gZnJvbUNvbWJpbmUoe1xuICAgIGlzTW92aW5nRm9yd2FyZCxcbiAgICBkZXN0aW5hdGlvbixcbiAgICBkaXNwbGFjZWQ6IHByZXZpb3VzSW1wYWN0LmRpc3BsYWNlZCxcbiAgICBkcmFnZ2FibGVzLFxuICAgIGNvbWJpbmU6IHdhc0F0LmNvbWJpbmUsXG4gICAgYWZ0ZXJDcml0aWNhbFxuICB9KTtcblxuICBpZiAobmV3SW5kZXggPT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIGNhbGN1bGF0ZVJlb3JkZXJJbXBhY3Qoe1xuICAgIGRyYWdnYWJsZSxcbiAgICBpbnNpZGVEZXN0aW5hdGlvbixcbiAgICBkZXN0aW5hdGlvbixcbiAgICB2aWV3cG9ydCxcbiAgICBsYXN0OiBwcmV2aW91c0ltcGFjdC5kaXNwbGFjZWQsXG4gICAgZGlzcGxhY2VkQnk6IHByZXZpb3VzSW1wYWN0LmRpc3BsYWNlZEJ5LFxuICAgIGluZGV4OiBuZXdJbmRleFxuICB9KTtcbn0pO1xuXG52YXIgZ2V0Q29tYmluZWRJdGVtRGlzcGxhY2VtZW50ID0gKF9yZWYgPT4ge1xuICBsZXQge1xuICAgIGRpc3BsYWNlZCxcbiAgICBhZnRlckNyaXRpY2FsLFxuICAgIGNvbWJpbmVXaXRoLFxuICAgIGRpc3BsYWNlZEJ5XG4gIH0gPSBfcmVmO1xuICBjb25zdCBpc0Rpc3BsYWNlZCA9IEJvb2xlYW4oZGlzcGxhY2VkLnZpc2libGVbY29tYmluZVdpdGhdIHx8IGRpc3BsYWNlZC5pbnZpc2libGVbY29tYmluZVdpdGhdKTtcblxuICBpZiAoZGlkU3RhcnRBZnRlckNyaXRpY2FsKGNvbWJpbmVXaXRoLCBhZnRlckNyaXRpY2FsKSkge1xuICAgIHJldHVybiBpc0Rpc3BsYWNlZCA/IG9yaWdpbiA6IG5lZ2F0ZShkaXNwbGFjZWRCeS5wb2ludCk7XG4gIH1cblxuICByZXR1cm4gaXNEaXNwbGFjZWQgPyBkaXNwbGFjZWRCeS5wb2ludCA6IG9yaWdpbjtcbn0pO1xuXG52YXIgd2hlbkNvbWJpbmluZyA9IChfcmVmID0+IHtcbiAgbGV0IHtcbiAgICBhZnRlckNyaXRpY2FsLFxuICAgIGltcGFjdCxcbiAgICBkcmFnZ2FibGVzXG4gIH0gPSBfcmVmO1xuICBjb25zdCBjb21iaW5lID0gdHJ5R2V0Q29tYmluZShpbXBhY3QpO1xuICAhY29tYmluZSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IGludmFyaWFudChmYWxzZSkgOiBpbnZhcmlhbnQoZmFsc2UpIDogdm9pZCAwO1xuICBjb25zdCBjb21iaW5lV2l0aCA9IGNvbWJpbmUuZHJhZ2dhYmxlSWQ7XG4gIGNvbnN0IGNlbnRlciA9IGRyYWdnYWJsZXNbY29tYmluZVdpdGhdLnBhZ2UuYm9yZGVyQm94LmNlbnRlcjtcbiAgY29uc3QgZGlzcGxhY2VCeSA9IGdldENvbWJpbmVkSXRlbURpc3BsYWNlbWVudCh7XG4gICAgZGlzcGxhY2VkOiBpbXBhY3QuZGlzcGxhY2VkLFxuICAgIGFmdGVyQ3JpdGljYWwsXG4gICAgY29tYmluZVdpdGgsXG4gICAgZGlzcGxhY2VkQnk6IGltcGFjdC5kaXNwbGFjZWRCeVxuICB9KTtcbiAgcmV0dXJuIGFkZChjZW50ZXIsIGRpc3BsYWNlQnkpO1xufSk7XG5cbmNvbnN0IGRpc3RhbmNlRnJvbVN0YXJ0VG9Cb3JkZXJCb3hDZW50ZXIgPSAoYXhpcywgYm94KSA9PiBib3gubWFyZ2luW2F4aXMuc3RhcnRdICsgYm94LmJvcmRlckJveFtheGlzLnNpemVdIC8gMjtcblxuY29uc3QgZGlzdGFuY2VGcm9tRW5kVG9Cb3JkZXJCb3hDZW50ZXIgPSAoYXhpcywgYm94KSA9PiBib3gubWFyZ2luW2F4aXMuZW5kXSArIGJveC5ib3JkZXJCb3hbYXhpcy5zaXplXSAvIDI7XG5cbmNvbnN0IGdldENyb3NzQXhpc0JvcmRlckJveENlbnRlciA9IChheGlzLCB0YXJnZXQsIGlzTW92aW5nKSA9PiB0YXJnZXRbYXhpcy5jcm9zc0F4aXNTdGFydF0gKyBpc01vdmluZy5tYXJnaW5bYXhpcy5jcm9zc0F4aXNTdGFydF0gKyBpc01vdmluZy5ib3JkZXJCb3hbYXhpcy5jcm9zc0F4aXNTaXplXSAvIDI7XG5cbmNvbnN0IGdvQWZ0ZXIgPSBfcmVmID0+IHtcbiAgbGV0IHtcbiAgICBheGlzLFxuICAgIG1vdmVSZWxhdGl2ZVRvLFxuICAgIGlzTW92aW5nXG4gIH0gPSBfcmVmO1xuICByZXR1cm4gcGF0Y2goYXhpcy5saW5lLCBtb3ZlUmVsYXRpdmVUby5tYXJnaW5Cb3hbYXhpcy5lbmRdICsgZGlzdGFuY2VGcm9tU3RhcnRUb0JvcmRlckJveENlbnRlcihheGlzLCBpc01vdmluZyksIGdldENyb3NzQXhpc0JvcmRlckJveENlbnRlcihheGlzLCBtb3ZlUmVsYXRpdmVUby5tYXJnaW5Cb3gsIGlzTW92aW5nKSk7XG59O1xuY29uc3QgZ29CZWZvcmUgPSBfcmVmMiA9PiB7XG4gIGxldCB7XG4gICAgYXhpcyxcbiAgICBtb3ZlUmVsYXRpdmVUbyxcbiAgICBpc01vdmluZ1xuICB9ID0gX3JlZjI7XG4gIHJldHVybiBwYXRjaChheGlzLmxpbmUsIG1vdmVSZWxhdGl2ZVRvLm1hcmdpbkJveFtheGlzLnN0YXJ0XSAtIGRpc3RhbmNlRnJvbUVuZFRvQm9yZGVyQm94Q2VudGVyKGF4aXMsIGlzTW92aW5nKSwgZ2V0Q3Jvc3NBeGlzQm9yZGVyQm94Q2VudGVyKGF4aXMsIG1vdmVSZWxhdGl2ZVRvLm1hcmdpbkJveCwgaXNNb3ZpbmcpKTtcbn07XG5jb25zdCBnb0ludG9TdGFydCA9IF9yZWYzID0+IHtcbiAgbGV0IHtcbiAgICBheGlzLFxuICAgIG1vdmVJbnRvLFxuICAgIGlzTW92aW5nXG4gIH0gPSBfcmVmMztcbiAgcmV0dXJuIHBhdGNoKGF4aXMubGluZSwgbW92ZUludG8uY29udGVudEJveFtheGlzLnN0YXJ0XSArIGRpc3RhbmNlRnJvbVN0YXJ0VG9Cb3JkZXJCb3hDZW50ZXIoYXhpcywgaXNNb3ZpbmcpLCBnZXRDcm9zc0F4aXNCb3JkZXJCb3hDZW50ZXIoYXhpcywgbW92ZUludG8uY29udGVudEJveCwgaXNNb3ZpbmcpKTtcbn07XG5cbnZhciB3aGVuUmVvcmRlcmluZyA9IChfcmVmID0+IHtcbiAgbGV0IHtcbiAgICBpbXBhY3QsXG4gICAgZHJhZ2dhYmxlLFxuICAgIGRyYWdnYWJsZXMsXG4gICAgZHJvcHBhYmxlLFxuICAgIGFmdGVyQ3JpdGljYWxcbiAgfSA9IF9yZWY7XG4gIGNvbnN0IGluc2lkZURlc3RpbmF0aW9uID0gZ2V0RHJhZ2dhYmxlc0luc2lkZURyb3BwYWJsZShkcm9wcGFibGUuZGVzY3JpcHRvci5pZCwgZHJhZ2dhYmxlcyk7XG4gIGNvbnN0IGRyYWdnYWJsZVBhZ2UgPSBkcmFnZ2FibGUucGFnZTtcbiAgY29uc3QgYXhpcyA9IGRyb3BwYWJsZS5heGlzO1xuXG4gIGlmICghaW5zaWRlRGVzdGluYXRpb24ubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGdvSW50b1N0YXJ0KHtcbiAgICAgIGF4aXMsXG4gICAgICBtb3ZlSW50bzogZHJvcHBhYmxlLnBhZ2UsXG4gICAgICBpc01vdmluZzogZHJhZ2dhYmxlUGFnZVxuICAgIH0pO1xuICB9XG5cbiAgY29uc3Qge1xuICAgIGRpc3BsYWNlZCxcbiAgICBkaXNwbGFjZWRCeVxuICB9ID0gaW1wYWN0O1xuICBjb25zdCBjbG9zZXN0QWZ0ZXIgPSBkaXNwbGFjZWQuYWxsWzBdO1xuXG4gIGlmIChjbG9zZXN0QWZ0ZXIpIHtcbiAgICBjb25zdCBjbG9zZXN0ID0gZHJhZ2dhYmxlc1tjbG9zZXN0QWZ0ZXJdO1xuXG4gICAgaWYgKGRpZFN0YXJ0QWZ0ZXJDcml0aWNhbChjbG9zZXN0QWZ0ZXIsIGFmdGVyQ3JpdGljYWwpKSB7XG4gICAgICByZXR1cm4gZ29CZWZvcmUoe1xuICAgICAgICBheGlzLFxuICAgICAgICBtb3ZlUmVsYXRpdmVUbzogY2xvc2VzdC5wYWdlLFxuICAgICAgICBpc01vdmluZzogZHJhZ2dhYmxlUGFnZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3Qgd2l0aERpc3BsYWNlbWVudCA9IGNzc0JveE1vZGVsLm9mZnNldChjbG9zZXN0LnBhZ2UsIGRpc3BsYWNlZEJ5LnBvaW50KTtcbiAgICByZXR1cm4gZ29CZWZvcmUoe1xuICAgICAgYXhpcyxcbiAgICAgIG1vdmVSZWxhdGl2ZVRvOiB3aXRoRGlzcGxhY2VtZW50LFxuICAgICAgaXNNb3Zpbmc6IGRyYWdnYWJsZVBhZ2VcbiAgICB9KTtcbiAgfVxuXG4gIGNvbnN0IGxhc3QgPSBpbnNpZGVEZXN0aW5hdGlvbltpbnNpZGVEZXN0aW5hdGlvbi5sZW5ndGggLSAxXTtcblxuICBpZiAobGFzdC5kZXNjcmlwdG9yLmlkID09PSBkcmFnZ2FibGUuZGVzY3JpcHRvci5pZCkge1xuICAgIHJldHVybiBkcmFnZ2FibGVQYWdlLmJvcmRlckJveC5jZW50ZXI7XG4gIH1cblxuICBpZiAoZGlkU3RhcnRBZnRlckNyaXRpY2FsKGxhc3QuZGVzY3JpcHRvci5pZCwgYWZ0ZXJDcml0aWNhbCkpIHtcbiAgICBjb25zdCBwYWdlID0gY3NzQm94TW9kZWwub2Zmc2V0KGxhc3QucGFnZSwgbmVnYXRlKGFmdGVyQ3JpdGljYWwuZGlzcGxhY2VkQnkucG9pbnQpKTtcbiAgICByZXR1cm4gZ29BZnRlcih7XG4gICAgICBheGlzLFxuICAgICAgbW92ZVJlbGF0aXZlVG86IHBhZ2UsXG4gICAgICBpc01vdmluZzogZHJhZ2dhYmxlUGFnZVxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIGdvQWZ0ZXIoe1xuICAgIGF4aXMsXG4gICAgbW92ZVJlbGF0aXZlVG86IGxhc3QucGFnZSxcbiAgICBpc01vdmluZzogZHJhZ2dhYmxlUGFnZVxuICB9KTtcbn0pO1xuXG52YXIgd2l0aERyb3BwYWJsZURpc3BsYWNlbWVudCA9ICgoZHJvcHBhYmxlLCBwb2ludCkgPT4ge1xuICBjb25zdCBmcmFtZSA9IGRyb3BwYWJsZS5mcmFtZTtcblxuICBpZiAoIWZyYW1lKSB7XG4gICAgcmV0dXJuIHBvaW50O1xuICB9XG5cbiAgcmV0dXJuIGFkZChwb2ludCwgZnJhbWUuc2Nyb2xsLmRpZmYuZGlzcGxhY2VtZW50KTtcbn0pO1xuXG5jb25zdCBnZXRSZXN1bHRXaXRob3V0RHJvcHBhYmxlRGlzcGxhY2VtZW50ID0gX3JlZiA9PiB7XG4gIGxldCB7XG4gICAgaW1wYWN0LFxuICAgIGRyYWdnYWJsZSxcbiAgICBkcm9wcGFibGUsXG4gICAgZHJhZ2dhYmxlcyxcbiAgICBhZnRlckNyaXRpY2FsXG4gIH0gPSBfcmVmO1xuICBjb25zdCBvcmlnaW5hbCA9IGRyYWdnYWJsZS5wYWdlLmJvcmRlckJveC5jZW50ZXI7XG4gIGNvbnN0IGF0ID0gaW1wYWN0LmF0O1xuXG4gIGlmICghZHJvcHBhYmxlKSB7XG4gICAgcmV0dXJuIG9yaWdpbmFsO1xuICB9XG5cbiAgaWYgKCFhdCkge1xuICAgIHJldHVybiBvcmlnaW5hbDtcbiAgfVxuXG4gIGlmIChhdC50eXBlID09PSAnUkVPUkRFUicpIHtcbiAgICByZXR1cm4gd2hlblJlb3JkZXJpbmcoe1xuICAgICAgaW1wYWN0LFxuICAgICAgZHJhZ2dhYmxlLFxuICAgICAgZHJhZ2dhYmxlcyxcbiAgICAgIGRyb3BwYWJsZSxcbiAgICAgIGFmdGVyQ3JpdGljYWxcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiB3aGVuQ29tYmluaW5nKHtcbiAgICBpbXBhY3QsXG4gICAgZHJhZ2dhYmxlcyxcbiAgICBhZnRlckNyaXRpY2FsXG4gIH0pO1xufTtcblxudmFyIGdldFBhZ2VCb3JkZXJCb3hDZW50ZXJGcm9tSW1wYWN0ID0gKGFyZ3MgPT4ge1xuICBjb25zdCB3aXRob3V0RGlzcGxhY2VtZW50ID0gZ2V0UmVzdWx0V2l0aG91dERyb3BwYWJsZURpc3BsYWNlbWVudChhcmdzKTtcbiAgY29uc3QgZHJvcHBhYmxlID0gYXJncy5kcm9wcGFibGU7XG4gIGNvbnN0IHdpdGhEaXNwbGFjZW1lbnQgPSBkcm9wcGFibGUgPyB3aXRoRHJvcHBhYmxlRGlzcGxhY2VtZW50KGRyb3BwYWJsZSwgd2l0aG91dERpc3BsYWNlbWVudCkgOiB3aXRob3V0RGlzcGxhY2VtZW50O1xuICByZXR1cm4gd2l0aERpc3BsYWNlbWVudDtcbn0pO1xuXG52YXIgc2Nyb2xsVmlld3BvcnQgPSAoKHZpZXdwb3J0LCBuZXdTY3JvbGwpID0+IHtcbiAgY29uc3QgZGlmZiA9IHN1YnRyYWN0KG5ld1Njcm9sbCwgdmlld3BvcnQuc2Nyb2xsLmluaXRpYWwpO1xuICBjb25zdCBkaXNwbGFjZW1lbnQgPSBuZWdhdGUoZGlmZik7XG4gIGNvbnN0IGZyYW1lID0gY3NzQm94TW9kZWwuZ2V0UmVjdCh7XG4gICAgdG9wOiBuZXdTY3JvbGwueSxcbiAgICBib3R0b206IG5ld1Njcm9sbC55ICsgdmlld3BvcnQuZnJhbWUuaGVpZ2h0LFxuICAgIGxlZnQ6IG5ld1Njcm9sbC54LFxuICAgIHJpZ2h0OiBuZXdTY3JvbGwueCArIHZpZXdwb3J0LmZyYW1lLndpZHRoXG4gIH0pO1xuICBjb25zdCB1cGRhdGVkID0ge1xuICAgIGZyYW1lLFxuICAgIHNjcm9sbDoge1xuICAgICAgaW5pdGlhbDogdmlld3BvcnQuc2Nyb2xsLmluaXRpYWwsXG4gICAgICBtYXg6IHZpZXdwb3J0LnNjcm9sbC5tYXgsXG4gICAgICBjdXJyZW50OiBuZXdTY3JvbGwsXG4gICAgICBkaWZmOiB7XG4gICAgICAgIHZhbHVlOiBkaWZmLFxuICAgICAgICBkaXNwbGFjZW1lbnRcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIHJldHVybiB1cGRhdGVkO1xufSk7XG5cbmZ1bmN0aW9uIGdldERyYWdnYWJsZXMkMShpZHMsIGRyYWdnYWJsZXMpIHtcbiAgcmV0dXJuIGlkcy5tYXAoaWQgPT4gZHJhZ2dhYmxlc1tpZF0pO1xufVxuXG5mdW5jdGlvbiB0cnlHZXRWaXNpYmxlKGlkLCBncm91cHMpIHtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBncm91cHMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBkaXNwbGFjZW1lbnQgPSBncm91cHNbaV0udmlzaWJsZVtpZF07XG5cbiAgICBpZiAoZGlzcGxhY2VtZW50KSB7XG4gICAgICByZXR1cm4gZGlzcGxhY2VtZW50O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG52YXIgc3BlY3VsYXRpdmVseUluY3JlYXNlID0gKF9yZWYgPT4ge1xuICBsZXQge1xuICAgIGltcGFjdCxcbiAgICB2aWV3cG9ydCxcbiAgICBkZXN0aW5hdGlvbixcbiAgICBkcmFnZ2FibGVzLFxuICAgIG1heFNjcm9sbENoYW5nZVxuICB9ID0gX3JlZjtcbiAgY29uc3Qgc2Nyb2xsZWRWaWV3cG9ydCA9IHNjcm9sbFZpZXdwb3J0KHZpZXdwb3J0LCBhZGQodmlld3BvcnQuc2Nyb2xsLmN1cnJlbnQsIG1heFNjcm9sbENoYW5nZSkpO1xuICBjb25zdCBzY3JvbGxlZERyb3BwYWJsZSA9IGRlc3RpbmF0aW9uLmZyYW1lID8gc2Nyb2xsRHJvcHBhYmxlKGRlc3RpbmF0aW9uLCBhZGQoZGVzdGluYXRpb24uZnJhbWUuc2Nyb2xsLmN1cnJlbnQsIG1heFNjcm9sbENoYW5nZSkpIDogZGVzdGluYXRpb247XG4gIGNvbnN0IGxhc3QgPSBpbXBhY3QuZGlzcGxhY2VkO1xuICBjb25zdCB3aXRoVmlld3BvcnRTY3JvbGwgPSBnZXREaXNwbGFjZW1lbnRHcm91cHMoe1xuICAgIGFmdGVyRHJhZ2dpbmc6IGdldERyYWdnYWJsZXMkMShsYXN0LmFsbCwgZHJhZ2dhYmxlcyksXG4gICAgZGVzdGluYXRpb24sXG4gICAgZGlzcGxhY2VkQnk6IGltcGFjdC5kaXNwbGFjZWRCeSxcbiAgICB2aWV3cG9ydDogc2Nyb2xsZWRWaWV3cG9ydC5mcmFtZSxcbiAgICBsYXN0LFxuICAgIGZvcmNlU2hvdWxkQW5pbWF0ZTogZmFsc2VcbiAgfSk7XG4gIGNvbnN0IHdpdGhEcm9wcGFibGVTY3JvbGwgPSBnZXREaXNwbGFjZW1lbnRHcm91cHMoe1xuICAgIGFmdGVyRHJhZ2dpbmc6IGdldERyYWdnYWJsZXMkMShsYXN0LmFsbCwgZHJhZ2dhYmxlcyksXG4gICAgZGVzdGluYXRpb246IHNjcm9sbGVkRHJvcHBhYmxlLFxuICAgIGRpc3BsYWNlZEJ5OiBpbXBhY3QuZGlzcGxhY2VkQnksXG4gICAgdmlld3BvcnQ6IHZpZXdwb3J0LmZyYW1lLFxuICAgIGxhc3QsXG4gICAgZm9yY2VTaG91bGRBbmltYXRlOiBmYWxzZVxuICB9KTtcbiAgY29uc3QgaW52aXNpYmxlID0ge307XG4gIGNvbnN0IHZpc2libGUgPSB7fTtcbiAgY29uc3QgZ3JvdXBzID0gW2xhc3QsIHdpdGhWaWV3cG9ydFNjcm9sbCwgd2l0aERyb3BwYWJsZVNjcm9sbF07XG4gIGxhc3QuYWxsLmZvckVhY2goaWQgPT4ge1xuICAgIGNvbnN0IGRpc3BsYWNlbWVudCA9IHRyeUdldFZpc2libGUoaWQsIGdyb3Vwcyk7XG5cbiAgICBpZiAoZGlzcGxhY2VtZW50KSB7XG4gICAgICB2aXNpYmxlW2lkXSA9IGRpc3BsYWNlbWVudDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpbnZpc2libGVbaWRdID0gdHJ1ZTtcbiAgfSk7XG4gIGNvbnN0IG5ld0ltcGFjdCA9IHsgLi4uaW1wYWN0LFxuICAgIGRpc3BsYWNlZDoge1xuICAgICAgYWxsOiBsYXN0LmFsbCxcbiAgICAgIGludmlzaWJsZSxcbiAgICAgIHZpc2libGVcbiAgICB9XG4gIH07XG4gIHJldHVybiBuZXdJbXBhY3Q7XG59KTtcblxudmFyIHdpdGhWaWV3cG9ydERpc3BsYWNlbWVudCA9ICgodmlld3BvcnQsIHBvaW50KSA9PiBhZGQodmlld3BvcnQuc2Nyb2xsLmRpZmYuZGlzcGxhY2VtZW50LCBwb2ludCkpO1xuXG52YXIgZ2V0Q2xpZW50RnJvbVBhZ2VCb3JkZXJCb3hDZW50ZXIgPSAoX3JlZiA9PiB7XG4gIGxldCB7XG4gICAgcGFnZUJvcmRlckJveENlbnRlcixcbiAgICBkcmFnZ2FibGUsXG4gICAgdmlld3BvcnRcbiAgfSA9IF9yZWY7XG4gIGNvbnN0IHdpdGhvdXRQYWdlU2Nyb2xsQ2hhbmdlID0gd2l0aFZpZXdwb3J0RGlzcGxhY2VtZW50KHZpZXdwb3J0LCBwYWdlQm9yZGVyQm94Q2VudGVyKTtcbiAgY29uc3Qgb2Zmc2V0ID0gc3VidHJhY3Qod2l0aG91dFBhZ2VTY3JvbGxDaGFuZ2UsIGRyYWdnYWJsZS5wYWdlLmJvcmRlckJveC5jZW50ZXIpO1xuICByZXR1cm4gYWRkKGRyYWdnYWJsZS5jbGllbnQuYm9yZGVyQm94LmNlbnRlciwgb2Zmc2V0KTtcbn0pO1xuXG52YXIgaXNUb3RhbGx5VmlzaWJsZUluTmV3TG9jYXRpb24gPSAoX3JlZiA9PiB7XG4gIGxldCB7XG4gICAgZHJhZ2dhYmxlLFxuICAgIGRlc3RpbmF0aW9uLFxuICAgIG5ld1BhZ2VCb3JkZXJCb3hDZW50ZXIsXG4gICAgdmlld3BvcnQsXG4gICAgd2l0aERyb3BwYWJsZURpc3BsYWNlbWVudCxcbiAgICBvbmx5T25NYWluQXhpcyA9IGZhbHNlXG4gIH0gPSBfcmVmO1xuICBjb25zdCBjaGFuZ2VOZWVkZWQgPSBzdWJ0cmFjdChuZXdQYWdlQm9yZGVyQm94Q2VudGVyLCBkcmFnZ2FibGUucGFnZS5ib3JkZXJCb3guY2VudGVyKTtcbiAgY29uc3Qgc2hpZnRlZCA9IG9mZnNldEJ5UG9zaXRpb24oZHJhZ2dhYmxlLnBhZ2UuYm9yZGVyQm94LCBjaGFuZ2VOZWVkZWQpO1xuICBjb25zdCBhcmdzID0ge1xuICAgIHRhcmdldDogc2hpZnRlZCxcbiAgICBkZXN0aW5hdGlvbixcbiAgICB3aXRoRHJvcHBhYmxlRGlzcGxhY2VtZW50LFxuICAgIHZpZXdwb3J0XG4gIH07XG4gIHJldHVybiBvbmx5T25NYWluQXhpcyA/IGlzVG90YWxseVZpc2libGVPbkF4aXMoYXJncykgOiBpc1RvdGFsbHlWaXNpYmxlKGFyZ3MpO1xufSk7XG5cbnZhciBtb3ZlVG9OZXh0UGxhY2UgPSAoX3JlZiA9PiB7XG4gIGxldCB7XG4gICAgaXNNb3ZpbmdGb3J3YXJkLFxuICAgIGRyYWdnYWJsZSxcbiAgICBkZXN0aW5hdGlvbixcbiAgICBkcmFnZ2FibGVzLFxuICAgIHByZXZpb3VzSW1wYWN0LFxuICAgIHZpZXdwb3J0LFxuICAgIHByZXZpb3VzUGFnZUJvcmRlckJveENlbnRlcixcbiAgICBwcmV2aW91c0NsaWVudFNlbGVjdGlvbixcbiAgICBhZnRlckNyaXRpY2FsXG4gIH0gPSBfcmVmO1xuXG4gIGlmICghZGVzdGluYXRpb24uaXNFbmFibGVkKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBpbnNpZGVEZXN0aW5hdGlvbiA9IGdldERyYWdnYWJsZXNJbnNpZGVEcm9wcGFibGUoZGVzdGluYXRpb24uZGVzY3JpcHRvci5pZCwgZHJhZ2dhYmxlcyk7XG4gIGNvbnN0IGlzSW5Ib21lTGlzdCA9IGlzSG9tZU9mKGRyYWdnYWJsZSwgZGVzdGluYXRpb24pO1xuICBjb25zdCBpbXBhY3QgPSBtb3ZlVG9OZXh0Q29tYmluZSh7XG4gICAgaXNNb3ZpbmdGb3J3YXJkLFxuICAgIGRyYWdnYWJsZSxcbiAgICBkZXN0aW5hdGlvbixcbiAgICBpbnNpZGVEZXN0aW5hdGlvbixcbiAgICBwcmV2aW91c0ltcGFjdFxuICB9KSB8fCBtb3ZlVG9OZXh0SW5kZXgoe1xuICAgIGlzTW92aW5nRm9yd2FyZCxcbiAgICBpc0luSG9tZUxpc3QsXG4gICAgZHJhZ2dhYmxlLFxuICAgIGRyYWdnYWJsZXMsXG4gICAgZGVzdGluYXRpb24sXG4gICAgaW5zaWRlRGVzdGluYXRpb24sXG4gICAgcHJldmlvdXNJbXBhY3QsXG4gICAgdmlld3BvcnQsXG4gICAgYWZ0ZXJDcml0aWNhbFxuICB9KTtcblxuICBpZiAoIWltcGFjdCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgcGFnZUJvcmRlckJveENlbnRlciA9IGdldFBhZ2VCb3JkZXJCb3hDZW50ZXJGcm9tSW1wYWN0KHtcbiAgICBpbXBhY3QsXG4gICAgZHJhZ2dhYmxlLFxuICAgIGRyb3BwYWJsZTogZGVzdGluYXRpb24sXG4gICAgZHJhZ2dhYmxlcyxcbiAgICBhZnRlckNyaXRpY2FsXG4gIH0pO1xuICBjb25zdCBpc1Zpc2libGVJbk5ld0xvY2F0aW9uID0gaXNUb3RhbGx5VmlzaWJsZUluTmV3TG9jYXRpb24oe1xuICAgIGRyYWdnYWJsZSxcbiAgICBkZXN0aW5hdGlvbixcbiAgICBuZXdQYWdlQm9yZGVyQm94Q2VudGVyOiBwYWdlQm9yZGVyQm94Q2VudGVyLFxuICAgIHZpZXdwb3J0OiB2aWV3cG9ydC5mcmFtZSxcbiAgICB3aXRoRHJvcHBhYmxlRGlzcGxhY2VtZW50OiBmYWxzZSxcbiAgICBvbmx5T25NYWluQXhpczogdHJ1ZVxuICB9KTtcblxuICBpZiAoaXNWaXNpYmxlSW5OZXdMb2NhdGlvbikge1xuICAgIGNvbnN0IGNsaWVudFNlbGVjdGlvbiA9IGdldENsaWVudEZyb21QYWdlQm9yZGVyQm94Q2VudGVyKHtcbiAgICAgIHBhZ2VCb3JkZXJCb3hDZW50ZXIsXG4gICAgICBkcmFnZ2FibGUsXG4gICAgICB2aWV3cG9ydFxuICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICBjbGllbnRTZWxlY3Rpb24sXG4gICAgICBpbXBhY3QsXG4gICAgICBzY3JvbGxKdW1wUmVxdWVzdDogbnVsbFxuICAgIH07XG4gIH1cblxuICBjb25zdCBkaXN0YW5jZSA9IHN1YnRyYWN0KHBhZ2VCb3JkZXJCb3hDZW50ZXIsIHByZXZpb3VzUGFnZUJvcmRlckJveENlbnRlcik7XG4gIGNvbnN0IGNhdXRpb3VzID0gc3BlY3VsYXRpdmVseUluY3JlYXNlKHtcbiAgICBpbXBhY3QsXG4gICAgdmlld3BvcnQsXG4gICAgZGVzdGluYXRpb24sXG4gICAgZHJhZ2dhYmxlcyxcbiAgICBtYXhTY3JvbGxDaGFuZ2U6IGRpc3RhbmNlXG4gIH0pO1xuICByZXR1cm4ge1xuICAgIGNsaWVudFNlbGVjdGlvbjogcHJldmlvdXNDbGllbnRTZWxlY3Rpb24sXG4gICAgaW1wYWN0OiBjYXV0aW91cyxcbiAgICBzY3JvbGxKdW1wUmVxdWVzdDogZGlzdGFuY2VcbiAgfTtcbn0pO1xuXG5jb25zdCBnZXRLbm93bkFjdGl2ZSA9IGRyb3BwYWJsZSA9PiB7XG4gIGNvbnN0IHJlY3QgPSBkcm9wcGFibGUuc3ViamVjdC5hY3RpdmU7XG4gICFyZWN0ID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gaW52YXJpYW50KGZhbHNlLCAnQ2Fubm90IGdldCBjbGlwcGVkIGFyZWEgZnJvbSBkcm9wcGFibGUnKSA6IGludmFyaWFudChmYWxzZSkgOiB2b2lkIDA7XG4gIHJldHVybiByZWN0O1xufTtcblxudmFyIGdldEJlc3RDcm9zc0F4aXNEcm9wcGFibGUgPSAoX3JlZiA9PiB7XG4gIGxldCB7XG4gICAgaXNNb3ZpbmdGb3J3YXJkLFxuICAgIHBhZ2VCb3JkZXJCb3hDZW50ZXIsXG4gICAgc291cmNlLFxuICAgIGRyb3BwYWJsZXMsXG4gICAgdmlld3BvcnRcbiAgfSA9IF9yZWY7XG4gIGNvbnN0IGFjdGl2ZSA9IHNvdXJjZS5zdWJqZWN0LmFjdGl2ZTtcblxuICBpZiAoIWFjdGl2ZSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgYXhpcyA9IHNvdXJjZS5heGlzO1xuICBjb25zdCBpc0JldHdlZW5Tb3VyY2VDbGlwcGVkID0gaXNXaXRoaW4oYWN0aXZlW2F4aXMuc3RhcnRdLCBhY3RpdmVbYXhpcy5lbmRdKTtcbiAgY29uc3QgY2FuZGlkYXRlcyA9IHRvRHJvcHBhYmxlTGlzdChkcm9wcGFibGVzKS5maWx0ZXIoZHJvcHBhYmxlID0+IGRyb3BwYWJsZSAhPT0gc291cmNlKS5maWx0ZXIoZHJvcHBhYmxlID0+IGRyb3BwYWJsZS5pc0VuYWJsZWQpLmZpbHRlcihkcm9wcGFibGUgPT4gQm9vbGVhbihkcm9wcGFibGUuc3ViamVjdC5hY3RpdmUpKS5maWx0ZXIoZHJvcHBhYmxlID0+IGlzUGFydGlhbGx5VmlzaWJsZVRocm91Z2hGcmFtZSh2aWV3cG9ydC5mcmFtZSkoZ2V0S25vd25BY3RpdmUoZHJvcHBhYmxlKSkpLmZpbHRlcihkcm9wcGFibGUgPT4ge1xuICAgIGNvbnN0IGFjdGl2ZU9mVGFyZ2V0ID0gZ2V0S25vd25BY3RpdmUoZHJvcHBhYmxlKTtcblxuICAgIGlmIChpc01vdmluZ0ZvcndhcmQpIHtcbiAgICAgIHJldHVybiBhY3RpdmVbYXhpcy5jcm9zc0F4aXNFbmRdIDwgYWN0aXZlT2ZUYXJnZXRbYXhpcy5jcm9zc0F4aXNFbmRdO1xuICAgIH1cblxuICAgIHJldHVybiBhY3RpdmVPZlRhcmdldFtheGlzLmNyb3NzQXhpc1N0YXJ0XSA8IGFjdGl2ZVtheGlzLmNyb3NzQXhpc1N0YXJ0XTtcbiAgfSkuZmlsdGVyKGRyb3BwYWJsZSA9PiB7XG4gICAgY29uc3QgYWN0aXZlT2ZUYXJnZXQgPSBnZXRLbm93bkFjdGl2ZShkcm9wcGFibGUpO1xuICAgIGNvbnN0IGlzQmV0d2VlbkRlc3RpbmF0aW9uQ2xpcHBlZCA9IGlzV2l0aGluKGFjdGl2ZU9mVGFyZ2V0W2F4aXMuc3RhcnRdLCBhY3RpdmVPZlRhcmdldFtheGlzLmVuZF0pO1xuICAgIHJldHVybiBpc0JldHdlZW5Tb3VyY2VDbGlwcGVkKGFjdGl2ZU9mVGFyZ2V0W2F4aXMuc3RhcnRdKSB8fCBpc0JldHdlZW5Tb3VyY2VDbGlwcGVkKGFjdGl2ZU9mVGFyZ2V0W2F4aXMuZW5kXSkgfHwgaXNCZXR3ZWVuRGVzdGluYXRpb25DbGlwcGVkKGFjdGl2ZVtheGlzLnN0YXJ0XSkgfHwgaXNCZXR3ZWVuRGVzdGluYXRpb25DbGlwcGVkKGFjdGl2ZVtheGlzLmVuZF0pO1xuICB9KS5zb3J0KChhLCBiKSA9PiB7XG4gICAgY29uc3QgZmlyc3QgPSBnZXRLbm93bkFjdGl2ZShhKVtheGlzLmNyb3NzQXhpc1N0YXJ0XTtcbiAgICBjb25zdCBzZWNvbmQgPSBnZXRLbm93bkFjdGl2ZShiKVtheGlzLmNyb3NzQXhpc1N0YXJ0XTtcblxuICAgIGlmIChpc01vdmluZ0ZvcndhcmQpIHtcbiAgICAgIHJldHVybiBmaXJzdCAtIHNlY29uZDtcbiAgICB9XG5cbiAgICByZXR1cm4gc2Vjb25kIC0gZmlyc3Q7XG4gIH0pLmZpbHRlcigoZHJvcHBhYmxlLCBpbmRleCwgYXJyYXkpID0+IGdldEtub3duQWN0aXZlKGRyb3BwYWJsZSlbYXhpcy5jcm9zc0F4aXNTdGFydF0gPT09IGdldEtub3duQWN0aXZlKGFycmF5WzBdKVtheGlzLmNyb3NzQXhpc1N0YXJ0XSk7XG5cbiAgaWYgKCFjYW5kaWRhdGVzLmxlbmd0aCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKGNhbmRpZGF0ZXMubGVuZ3RoID09PSAxKSB7XG4gICAgcmV0dXJuIGNhbmRpZGF0ZXNbMF07XG4gIH1cblxuICBjb25zdCBjb250YWlucyA9IGNhbmRpZGF0ZXMuZmlsdGVyKGRyb3BwYWJsZSA9PiB7XG4gICAgY29uc3QgaXNXaXRoaW5Ecm9wcGFibGUgPSBpc1dpdGhpbihnZXRLbm93bkFjdGl2ZShkcm9wcGFibGUpW2F4aXMuc3RhcnRdLCBnZXRLbm93bkFjdGl2ZShkcm9wcGFibGUpW2F4aXMuZW5kXSk7XG4gICAgcmV0dXJuIGlzV2l0aGluRHJvcHBhYmxlKHBhZ2VCb3JkZXJCb3hDZW50ZXJbYXhpcy5saW5lXSk7XG4gIH0pO1xuXG4gIGlmIChjb250YWlucy5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4gY29udGFpbnNbMF07XG4gIH1cblxuICBpZiAoY29udGFpbnMubGVuZ3RoID4gMSkge1xuICAgIHJldHVybiBjb250YWlucy5zb3J0KChhLCBiKSA9PiBnZXRLbm93bkFjdGl2ZShhKVtheGlzLnN0YXJ0XSAtIGdldEtub3duQWN0aXZlKGIpW2F4aXMuc3RhcnRdKVswXTtcbiAgfVxuXG4gIHJldHVybiBjYW5kaWRhdGVzLnNvcnQoKGEsIGIpID0+IHtcbiAgICBjb25zdCBmaXJzdCA9IGNsb3Nlc3QkMShwYWdlQm9yZGVyQm94Q2VudGVyLCBnZXRDb3JuZXJzKGdldEtub3duQWN0aXZlKGEpKSk7XG4gICAgY29uc3Qgc2Vjb25kID0gY2xvc2VzdCQxKHBhZ2VCb3JkZXJCb3hDZW50ZXIsIGdldENvcm5lcnMoZ2V0S25vd25BY3RpdmUoYikpKTtcblxuICAgIGlmIChmaXJzdCAhPT0gc2Vjb25kKSB7XG4gICAgICByZXR1cm4gZmlyc3QgLSBzZWNvbmQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGdldEtub3duQWN0aXZlKGEpW2F4aXMuc3RhcnRdIC0gZ2V0S25vd25BY3RpdmUoYilbYXhpcy5zdGFydF07XG4gIH0pWzBdO1xufSk7XG5cbmNvbnN0IGdldEN1cnJlbnRQYWdlQm9yZGVyQm94Q2VudGVyID0gKGRyYWdnYWJsZSwgYWZ0ZXJDcml0aWNhbCkgPT4ge1xuICBjb25zdCBvcmlnaW5hbCA9IGRyYWdnYWJsZS5wYWdlLmJvcmRlckJveC5jZW50ZXI7XG4gIHJldHVybiBkaWRTdGFydEFmdGVyQ3JpdGljYWwoZHJhZ2dhYmxlLmRlc2NyaXB0b3IuaWQsIGFmdGVyQ3JpdGljYWwpID8gc3VidHJhY3Qob3JpZ2luYWwsIGFmdGVyQ3JpdGljYWwuZGlzcGxhY2VkQnkucG9pbnQpIDogb3JpZ2luYWw7XG59O1xuY29uc3QgZ2V0Q3VycmVudFBhZ2VCb3JkZXJCb3ggPSAoZHJhZ2dhYmxlLCBhZnRlckNyaXRpY2FsKSA9PiB7XG4gIGNvbnN0IG9yaWdpbmFsID0gZHJhZ2dhYmxlLnBhZ2UuYm9yZGVyQm94O1xuICByZXR1cm4gZGlkU3RhcnRBZnRlckNyaXRpY2FsKGRyYWdnYWJsZS5kZXNjcmlwdG9yLmlkLCBhZnRlckNyaXRpY2FsKSA/IG9mZnNldEJ5UG9zaXRpb24ob3JpZ2luYWwsIG5lZ2F0ZShhZnRlckNyaXRpY2FsLmRpc3BsYWNlZEJ5LnBvaW50KSkgOiBvcmlnaW5hbDtcbn07XG5cbnZhciBnZXRDbG9zZXN0RHJhZ2dhYmxlID0gKF9yZWYgPT4ge1xuICBsZXQge1xuICAgIHBhZ2VCb3JkZXJCb3hDZW50ZXIsXG4gICAgdmlld3BvcnQsXG4gICAgZGVzdGluYXRpb24sXG4gICAgaW5zaWRlRGVzdGluYXRpb24sXG4gICAgYWZ0ZXJDcml0aWNhbFxuICB9ID0gX3JlZjtcbiAgY29uc3Qgc29ydGVkID0gaW5zaWRlRGVzdGluYXRpb24uZmlsdGVyKGRyYWdnYWJsZSA9PiBpc1RvdGFsbHlWaXNpYmxlKHtcbiAgICB0YXJnZXQ6IGdldEN1cnJlbnRQYWdlQm9yZGVyQm94KGRyYWdnYWJsZSwgYWZ0ZXJDcml0aWNhbCksXG4gICAgZGVzdGluYXRpb24sXG4gICAgdmlld3BvcnQ6IHZpZXdwb3J0LmZyYW1lLFxuICAgIHdpdGhEcm9wcGFibGVEaXNwbGFjZW1lbnQ6IHRydWVcbiAgfSkpLnNvcnQoKGEsIGIpID0+IHtcbiAgICBjb25zdCBkaXN0YW5jZVRvQSA9IGRpc3RhbmNlKHBhZ2VCb3JkZXJCb3hDZW50ZXIsIHdpdGhEcm9wcGFibGVEaXNwbGFjZW1lbnQoZGVzdGluYXRpb24sIGdldEN1cnJlbnRQYWdlQm9yZGVyQm94Q2VudGVyKGEsIGFmdGVyQ3JpdGljYWwpKSk7XG4gICAgY29uc3QgZGlzdGFuY2VUb0IgPSBkaXN0YW5jZShwYWdlQm9yZGVyQm94Q2VudGVyLCB3aXRoRHJvcHBhYmxlRGlzcGxhY2VtZW50KGRlc3RpbmF0aW9uLCBnZXRDdXJyZW50UGFnZUJvcmRlckJveENlbnRlcihiLCBhZnRlckNyaXRpY2FsKSkpO1xuXG4gICAgaWYgKGRpc3RhbmNlVG9BIDwgZGlzdGFuY2VUb0IpIHtcbiAgICAgIHJldHVybiAtMTtcbiAgICB9XG5cbiAgICBpZiAoZGlzdGFuY2VUb0IgPCBkaXN0YW5jZVRvQSkge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuXG4gICAgcmV0dXJuIGEuZGVzY3JpcHRvci5pbmRleCAtIGIuZGVzY3JpcHRvci5pbmRleDtcbiAgfSk7XG4gIHJldHVybiBzb3J0ZWRbMF0gfHwgbnVsbDtcbn0pO1xuXG52YXIgZ2V0RGlzcGxhY2VkQnkgPSBtZW1vaXplT25lX19kZWZhdWx0W1wiZGVmYXVsdFwiXShmdW5jdGlvbiBnZXREaXNwbGFjZWRCeShheGlzLCBkaXNwbGFjZUJ5KSB7XG4gIGNvbnN0IGRpc3BsYWNlbWVudCA9IGRpc3BsYWNlQnlbYXhpcy5saW5lXTtcbiAgcmV0dXJuIHtcbiAgICB2YWx1ZTogZGlzcGxhY2VtZW50LFxuICAgIHBvaW50OiBwYXRjaChheGlzLmxpbmUsIGRpc3BsYWNlbWVudClcbiAgfTtcbn0pO1xuXG5jb25zdCBnZXRSZXF1aXJlZEdyb3d0aEZvclBsYWNlaG9sZGVyID0gKGRyb3BwYWJsZSwgcGxhY2Vob2xkZXJTaXplLCBkcmFnZ2FibGVzKSA9PiB7XG4gIGNvbnN0IGF4aXMgPSBkcm9wcGFibGUuYXhpcztcblxuICBpZiAoZHJvcHBhYmxlLmRlc2NyaXB0b3IubW9kZSA9PT0gJ3ZpcnR1YWwnKSB7XG4gICAgcmV0dXJuIHBhdGNoKGF4aXMubGluZSwgcGxhY2Vob2xkZXJTaXplW2F4aXMubGluZV0pO1xuICB9XG5cbiAgY29uc3QgYXZhaWxhYmxlU3BhY2UgPSBkcm9wcGFibGUuc3ViamVjdC5wYWdlLmNvbnRlbnRCb3hbYXhpcy5zaXplXTtcbiAgY29uc3QgaW5zaWRlRHJvcHBhYmxlID0gZ2V0RHJhZ2dhYmxlc0luc2lkZURyb3BwYWJsZShkcm9wcGFibGUuZGVzY3JpcHRvci5pZCwgZHJhZ2dhYmxlcyk7XG4gIGNvbnN0IHNwYWNlVXNlZCA9IGluc2lkZURyb3BwYWJsZS5yZWR1Y2UoKHN1bSwgZGltZW5zaW9uKSA9PiBzdW0gKyBkaW1lbnNpb24uY2xpZW50Lm1hcmdpbkJveFtheGlzLnNpemVdLCAwKTtcbiAgY29uc3QgcmVxdWlyZWRTcGFjZSA9IHNwYWNlVXNlZCArIHBsYWNlaG9sZGVyU2l6ZVtheGlzLmxpbmVdO1xuICBjb25zdCBuZWVkc1RvR3Jvd0J5ID0gcmVxdWlyZWRTcGFjZSAtIGF2YWlsYWJsZVNwYWNlO1xuXG4gIGlmIChuZWVkc1RvR3Jvd0J5IDw9IDApIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiBwYXRjaChheGlzLmxpbmUsIG5lZWRzVG9Hcm93QnkpO1xufTtcblxuY29uc3Qgd2l0aE1heFNjcm9sbCA9IChmcmFtZSwgbWF4KSA9PiAoeyAuLi5mcmFtZSxcbiAgc2Nyb2xsOiB7IC4uLmZyYW1lLnNjcm9sbCxcbiAgICBtYXhcbiAgfVxufSk7XG5cbmNvbnN0IGFkZFBsYWNlaG9sZGVyID0gKGRyb3BwYWJsZSwgZHJhZ2dhYmxlLCBkcmFnZ2FibGVzKSA9PiB7XG4gIGNvbnN0IGZyYW1lID0gZHJvcHBhYmxlLmZyYW1lO1xuICAhIWlzSG9tZU9mKGRyYWdnYWJsZSwgZHJvcHBhYmxlKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IGludmFyaWFudChmYWxzZSwgJ1Nob3VsZCBub3QgYWRkIHBsYWNlaG9sZGVyIHNwYWNlIHRvIGhvbWUgbGlzdCcpIDogaW52YXJpYW50KGZhbHNlKSA6IHZvaWQgMDtcbiAgISFkcm9wcGFibGUuc3ViamVjdC53aXRoUGxhY2Vob2xkZXIgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBpbnZhcmlhbnQoZmFsc2UsICdDYW5ub3QgYWRkIHBsYWNlaG9sZGVyIHNpemUgdG8gYSBzdWJqZWN0IHdoZW4gaXQgYWxyZWFkeSBoYXMgb25lJykgOiBpbnZhcmlhbnQoZmFsc2UpIDogdm9pZCAwO1xuICBjb25zdCBwbGFjZWhvbGRlclNpemUgPSBnZXREaXNwbGFjZWRCeShkcm9wcGFibGUuYXhpcywgZHJhZ2dhYmxlLmRpc3BsYWNlQnkpLnBvaW50O1xuICBjb25zdCByZXF1aXJlZEdyb3d0aCA9IGdldFJlcXVpcmVkR3Jvd3RoRm9yUGxhY2Vob2xkZXIoZHJvcHBhYmxlLCBwbGFjZWhvbGRlclNpemUsIGRyYWdnYWJsZXMpO1xuICBjb25zdCBhZGRlZCA9IHtcbiAgICBwbGFjZWhvbGRlclNpemUsXG4gICAgaW5jcmVhc2VkQnk6IHJlcXVpcmVkR3Jvd3RoLFxuICAgIG9sZEZyYW1lTWF4U2Nyb2xsOiBkcm9wcGFibGUuZnJhbWUgPyBkcm9wcGFibGUuZnJhbWUuc2Nyb2xsLm1heCA6IG51bGxcbiAgfTtcblxuICBpZiAoIWZyYW1lKSB7XG4gICAgY29uc3Qgc3ViamVjdCA9IGdldFN1YmplY3Qoe1xuICAgICAgcGFnZTogZHJvcHBhYmxlLnN1YmplY3QucGFnZSxcbiAgICAgIHdpdGhQbGFjZWhvbGRlcjogYWRkZWQsXG4gICAgICBheGlzOiBkcm9wcGFibGUuYXhpcyxcbiAgICAgIGZyYW1lOiBkcm9wcGFibGUuZnJhbWVcbiAgICB9KTtcbiAgICByZXR1cm4geyAuLi5kcm9wcGFibGUsXG4gICAgICBzdWJqZWN0XG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0IG1heFNjcm9sbCA9IHJlcXVpcmVkR3Jvd3RoID8gYWRkKGZyYW1lLnNjcm9sbC5tYXgsIHJlcXVpcmVkR3Jvd3RoKSA6IGZyYW1lLnNjcm9sbC5tYXg7XG4gIGNvbnN0IG5ld0ZyYW1lID0gd2l0aE1heFNjcm9sbChmcmFtZSwgbWF4U2Nyb2xsKTtcbiAgY29uc3Qgc3ViamVjdCA9IGdldFN1YmplY3Qoe1xuICAgIHBhZ2U6IGRyb3BwYWJsZS5zdWJqZWN0LnBhZ2UsXG4gICAgd2l0aFBsYWNlaG9sZGVyOiBhZGRlZCxcbiAgICBheGlzOiBkcm9wcGFibGUuYXhpcyxcbiAgICBmcmFtZTogbmV3RnJhbWVcbiAgfSk7XG4gIHJldHVybiB7IC4uLmRyb3BwYWJsZSxcbiAgICBzdWJqZWN0LFxuICAgIGZyYW1lOiBuZXdGcmFtZVxuICB9O1xufTtcbmNvbnN0IHJlbW92ZVBsYWNlaG9sZGVyID0gZHJvcHBhYmxlID0+IHtcbiAgY29uc3QgYWRkZWQgPSBkcm9wcGFibGUuc3ViamVjdC53aXRoUGxhY2Vob2xkZXI7XG4gICFhZGRlZCA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IGludmFyaWFudChmYWxzZSwgJ0Nhbm5vdCByZW1vdmUgcGxhY2Vob2xkZXIgZm9ybSBzdWJqZWN0IHdoZW4gdGhlcmUgd2FzIG5vbmUnKSA6IGludmFyaWFudChmYWxzZSkgOiB2b2lkIDA7XG4gIGNvbnN0IGZyYW1lID0gZHJvcHBhYmxlLmZyYW1lO1xuXG4gIGlmICghZnJhbWUpIHtcbiAgICBjb25zdCBzdWJqZWN0ID0gZ2V0U3ViamVjdCh7XG4gICAgICBwYWdlOiBkcm9wcGFibGUuc3ViamVjdC5wYWdlLFxuICAgICAgYXhpczogZHJvcHBhYmxlLmF4aXMsXG4gICAgICBmcmFtZTogbnVsbCxcbiAgICAgIHdpdGhQbGFjZWhvbGRlcjogbnVsbFxuICAgIH0pO1xuICAgIHJldHVybiB7IC4uLmRyb3BwYWJsZSxcbiAgICAgIHN1YmplY3RcbiAgICB9O1xuICB9XG5cbiAgY29uc3Qgb2xkTWF4U2Nyb2xsID0gYWRkZWQub2xkRnJhbWVNYXhTY3JvbGw7XG4gICFvbGRNYXhTY3JvbGwgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBpbnZhcmlhbnQoZmFsc2UsICdFeHBlY3RlZCBkcm9wcGFibGUgd2l0aCBmcmFtZSB0byBoYXZlIG9sZCBtYXggZnJhbWUgc2Nyb2xsIHdoZW4gcmVtb3ZpbmcgcGxhY2Vob2xkZXInKSA6IGludmFyaWFudChmYWxzZSkgOiB2b2lkIDA7XG4gIGNvbnN0IG5ld0ZyYW1lID0gd2l0aE1heFNjcm9sbChmcmFtZSwgb2xkTWF4U2Nyb2xsKTtcbiAgY29uc3Qgc3ViamVjdCA9IGdldFN1YmplY3Qoe1xuICAgIHBhZ2U6IGRyb3BwYWJsZS5zdWJqZWN0LnBhZ2UsXG4gICAgYXhpczogZHJvcHBhYmxlLmF4aXMsXG4gICAgZnJhbWU6IG5ld0ZyYW1lLFxuICAgIHdpdGhQbGFjZWhvbGRlcjogbnVsbFxuICB9KTtcbiAgcmV0dXJuIHsgLi4uZHJvcHBhYmxlLFxuICAgIHN1YmplY3QsXG4gICAgZnJhbWU6IG5ld0ZyYW1lXG4gIH07XG59O1xuXG52YXIgbW92ZVRvTmV3RHJvcHBhYmxlID0gKF9yZWYgPT4ge1xuICBsZXQge1xuICAgIHByZXZpb3VzUGFnZUJvcmRlckJveENlbnRlcixcbiAgICBtb3ZlUmVsYXRpdmVUbyxcbiAgICBpbnNpZGVEZXN0aW5hdGlvbixcbiAgICBkcmFnZ2FibGUsXG4gICAgZHJhZ2dhYmxlcyxcbiAgICBkZXN0aW5hdGlvbixcbiAgICB2aWV3cG9ydCxcbiAgICBhZnRlckNyaXRpY2FsXG4gIH0gPSBfcmVmO1xuXG4gIGlmICghbW92ZVJlbGF0aXZlVG8pIHtcbiAgICBpZiAoaW5zaWRlRGVzdGluYXRpb24ubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9wb3NlZCA9IHtcbiAgICAgIGRpc3BsYWNlZDogZW1wdHlHcm91cHMsXG4gICAgICBkaXNwbGFjZWRCeTogbm9EaXNwbGFjZWRCeSxcbiAgICAgIGF0OiB7XG4gICAgICAgIHR5cGU6ICdSRU9SREVSJyxcbiAgICAgICAgZGVzdGluYXRpb246IHtcbiAgICAgICAgICBkcm9wcGFibGVJZDogZGVzdGluYXRpb24uZGVzY3JpcHRvci5pZCxcbiAgICAgICAgICBpbmRleDogMFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICBjb25zdCBwcm9wb3NlZFBhZ2VCb3JkZXJCb3hDZW50ZXIgPSBnZXRQYWdlQm9yZGVyQm94Q2VudGVyRnJvbUltcGFjdCh7XG4gICAgICBpbXBhY3Q6IHByb3Bvc2VkLFxuICAgICAgZHJhZ2dhYmxlLFxuICAgICAgZHJvcHBhYmxlOiBkZXN0aW5hdGlvbixcbiAgICAgIGRyYWdnYWJsZXMsXG4gICAgICBhZnRlckNyaXRpY2FsXG4gICAgfSk7XG4gICAgY29uc3Qgd2l0aFBsYWNlaG9sZGVyID0gaXNIb21lT2YoZHJhZ2dhYmxlLCBkZXN0aW5hdGlvbikgPyBkZXN0aW5hdGlvbiA6IGFkZFBsYWNlaG9sZGVyKGRlc3RpbmF0aW9uLCBkcmFnZ2FibGUsIGRyYWdnYWJsZXMpO1xuICAgIGNvbnN0IGlzVmlzaWJsZUluTmV3TG9jYXRpb24gPSBpc1RvdGFsbHlWaXNpYmxlSW5OZXdMb2NhdGlvbih7XG4gICAgICBkcmFnZ2FibGUsXG4gICAgICBkZXN0aW5hdGlvbjogd2l0aFBsYWNlaG9sZGVyLFxuICAgICAgbmV3UGFnZUJvcmRlckJveENlbnRlcjogcHJvcG9zZWRQYWdlQm9yZGVyQm94Q2VudGVyLFxuICAgICAgdmlld3BvcnQ6IHZpZXdwb3J0LmZyYW1lLFxuICAgICAgd2l0aERyb3BwYWJsZURpc3BsYWNlbWVudDogZmFsc2UsXG4gICAgICBvbmx5T25NYWluQXhpczogdHJ1ZVxuICAgIH0pO1xuICAgIHJldHVybiBpc1Zpc2libGVJbk5ld0xvY2F0aW9uID8gcHJvcG9zZWQgOiBudWxsO1xuICB9XG5cbiAgY29uc3QgaXNHb2luZ0JlZm9yZVRhcmdldCA9IEJvb2xlYW4ocHJldmlvdXNQYWdlQm9yZGVyQm94Q2VudGVyW2Rlc3RpbmF0aW9uLmF4aXMubGluZV0gPD0gbW92ZVJlbGF0aXZlVG8ucGFnZS5ib3JkZXJCb3guY2VudGVyW2Rlc3RpbmF0aW9uLmF4aXMubGluZV0pO1xuXG4gIGNvbnN0IHByb3Bvc2VkSW5kZXggPSAoKCkgPT4ge1xuICAgIGNvbnN0IHJlbGF0aXZlVG8gPSBtb3ZlUmVsYXRpdmVUby5kZXNjcmlwdG9yLmluZGV4O1xuXG4gICAgaWYgKG1vdmVSZWxhdGl2ZVRvLmRlc2NyaXB0b3IuaWQgPT09IGRyYWdnYWJsZS5kZXNjcmlwdG9yLmlkKSB7XG4gICAgICByZXR1cm4gcmVsYXRpdmVUbztcbiAgICB9XG5cbiAgICBpZiAoaXNHb2luZ0JlZm9yZVRhcmdldCkge1xuICAgICAgcmV0dXJuIHJlbGF0aXZlVG87XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlbGF0aXZlVG8gKyAxO1xuICB9KSgpO1xuXG4gIGNvbnN0IGRpc3BsYWNlZEJ5ID0gZ2V0RGlzcGxhY2VkQnkoZGVzdGluYXRpb24uYXhpcywgZHJhZ2dhYmxlLmRpc3BsYWNlQnkpO1xuICByZXR1cm4gY2FsY3VsYXRlUmVvcmRlckltcGFjdCh7XG4gICAgZHJhZ2dhYmxlLFxuICAgIGluc2lkZURlc3RpbmF0aW9uLFxuICAgIGRlc3RpbmF0aW9uLFxuICAgIHZpZXdwb3J0LFxuICAgIGRpc3BsYWNlZEJ5LFxuICAgIGxhc3Q6IGVtcHR5R3JvdXBzLFxuICAgIGluZGV4OiBwcm9wb3NlZEluZGV4XG4gIH0pO1xufSk7XG5cbnZhciBtb3ZlQ3Jvc3NBeGlzID0gKF9yZWYgPT4ge1xuICBsZXQge1xuICAgIGlzTW92aW5nRm9yd2FyZCxcbiAgICBwcmV2aW91c1BhZ2VCb3JkZXJCb3hDZW50ZXIsXG4gICAgZHJhZ2dhYmxlLFxuICAgIGlzT3ZlcixcbiAgICBkcmFnZ2FibGVzLFxuICAgIGRyb3BwYWJsZXMsXG4gICAgdmlld3BvcnQsXG4gICAgYWZ0ZXJDcml0aWNhbFxuICB9ID0gX3JlZjtcbiAgY29uc3QgZGVzdGluYXRpb24gPSBnZXRCZXN0Q3Jvc3NBeGlzRHJvcHBhYmxlKHtcbiAgICBpc01vdmluZ0ZvcndhcmQsXG4gICAgcGFnZUJvcmRlckJveENlbnRlcjogcHJldmlvdXNQYWdlQm9yZGVyQm94Q2VudGVyLFxuICAgIHNvdXJjZTogaXNPdmVyLFxuICAgIGRyb3BwYWJsZXMsXG4gICAgdmlld3BvcnRcbiAgfSk7XG5cbiAgaWYgKCFkZXN0aW5hdGlvbikge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgaW5zaWRlRGVzdGluYXRpb24gPSBnZXREcmFnZ2FibGVzSW5zaWRlRHJvcHBhYmxlKGRlc3RpbmF0aW9uLmRlc2NyaXB0b3IuaWQsIGRyYWdnYWJsZXMpO1xuICBjb25zdCBtb3ZlUmVsYXRpdmVUbyA9IGdldENsb3Nlc3REcmFnZ2FibGUoe1xuICAgIHBhZ2VCb3JkZXJCb3hDZW50ZXI6IHByZXZpb3VzUGFnZUJvcmRlckJveENlbnRlcixcbiAgICB2aWV3cG9ydCxcbiAgICBkZXN0aW5hdGlvbixcbiAgICBpbnNpZGVEZXN0aW5hdGlvbixcbiAgICBhZnRlckNyaXRpY2FsXG4gIH0pO1xuICBjb25zdCBpbXBhY3QgPSBtb3ZlVG9OZXdEcm9wcGFibGUoe1xuICAgIHByZXZpb3VzUGFnZUJvcmRlckJveENlbnRlcixcbiAgICBkZXN0aW5hdGlvbixcbiAgICBkcmFnZ2FibGUsXG4gICAgZHJhZ2dhYmxlcyxcbiAgICBtb3ZlUmVsYXRpdmVUbyxcbiAgICBpbnNpZGVEZXN0aW5hdGlvbixcbiAgICB2aWV3cG9ydCxcbiAgICBhZnRlckNyaXRpY2FsXG4gIH0pO1xuXG4gIGlmICghaW1wYWN0KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBwYWdlQm9yZGVyQm94Q2VudGVyID0gZ2V0UGFnZUJvcmRlckJveENlbnRlckZyb21JbXBhY3Qoe1xuICAgIGltcGFjdCxcbiAgICBkcmFnZ2FibGUsXG4gICAgZHJvcHBhYmxlOiBkZXN0aW5hdGlvbixcbiAgICBkcmFnZ2FibGVzLFxuICAgIGFmdGVyQ3JpdGljYWxcbiAgfSk7XG4gIGNvbnN0IGNsaWVudFNlbGVjdGlvbiA9IGdldENsaWVudEZyb21QYWdlQm9yZGVyQm94Q2VudGVyKHtcbiAgICBwYWdlQm9yZGVyQm94Q2VudGVyLFxuICAgIGRyYWdnYWJsZSxcbiAgICB2aWV3cG9ydFxuICB9KTtcbiAgcmV0dXJuIHtcbiAgICBjbGllbnRTZWxlY3Rpb24sXG4gICAgaW1wYWN0LFxuICAgIHNjcm9sbEp1bXBSZXF1ZXN0OiBudWxsXG4gIH07XG59KTtcblxudmFyIHdoYXRJc0RyYWdnZWRPdmVyID0gKGltcGFjdCA9PiB7XG4gIGNvbnN0IGF0ID0gaW1wYWN0LmF0O1xuXG4gIGlmICghYXQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmIChhdC50eXBlID09PSAnUkVPUkRFUicpIHtcbiAgICByZXR1cm4gYXQuZGVzdGluYXRpb24uZHJvcHBhYmxlSWQ7XG4gIH1cblxuICByZXR1cm4gYXQuY29tYmluZS5kcm9wcGFibGVJZDtcbn0pO1xuXG5jb25zdCBnZXREcm9wcGFibGVPdmVyJDEgPSAoaW1wYWN0LCBkcm9wcGFibGVzKSA9PiB7XG4gIGNvbnN0IGlkID0gd2hhdElzRHJhZ2dlZE92ZXIoaW1wYWN0KTtcbiAgcmV0dXJuIGlkID8gZHJvcHBhYmxlc1tpZF0gOiBudWxsO1xufTtcblxudmFyIG1vdmVJbkRpcmVjdGlvbiA9IChfcmVmID0+IHtcbiAgbGV0IHtcbiAgICBzdGF0ZSxcbiAgICB0eXBlXG4gIH0gPSBfcmVmO1xuICBjb25zdCBpc0FjdHVhbGx5T3ZlciA9IGdldERyb3BwYWJsZU92ZXIkMShzdGF0ZS5pbXBhY3QsIHN0YXRlLmRpbWVuc2lvbnMuZHJvcHBhYmxlcyk7XG4gIGNvbnN0IGlzTWFpbkF4aXNNb3ZlbWVudEFsbG93ZWQgPSBCb29sZWFuKGlzQWN0dWFsbHlPdmVyKTtcbiAgY29uc3QgaG9tZSA9IHN0YXRlLmRpbWVuc2lvbnMuZHJvcHBhYmxlc1tzdGF0ZS5jcml0aWNhbC5kcm9wcGFibGUuaWRdO1xuICBjb25zdCBpc092ZXIgPSBpc0FjdHVhbGx5T3ZlciB8fCBob21lO1xuICBjb25zdCBkaXJlY3Rpb24gPSBpc092ZXIuYXhpcy5kaXJlY3Rpb247XG4gIGNvbnN0IGlzTW92aW5nT25NYWluQXhpcyA9IGRpcmVjdGlvbiA9PT0gJ3ZlcnRpY2FsJyAmJiAodHlwZSA9PT0gJ01PVkVfVVAnIHx8IHR5cGUgPT09ICdNT1ZFX0RPV04nKSB8fCBkaXJlY3Rpb24gPT09ICdob3Jpem9udGFsJyAmJiAodHlwZSA9PT0gJ01PVkVfTEVGVCcgfHwgdHlwZSA9PT0gJ01PVkVfUklHSFQnKTtcblxuICBpZiAoaXNNb3ZpbmdPbk1haW5BeGlzICYmICFpc01haW5BeGlzTW92ZW1lbnRBbGxvd2VkKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBpc01vdmluZ0ZvcndhcmQgPSB0eXBlID09PSAnTU9WRV9ET1dOJyB8fCB0eXBlID09PSAnTU9WRV9SSUdIVCc7XG4gIGNvbnN0IGRyYWdnYWJsZSA9IHN0YXRlLmRpbWVuc2lvbnMuZHJhZ2dhYmxlc1tzdGF0ZS5jcml0aWNhbC5kcmFnZ2FibGUuaWRdO1xuICBjb25zdCBwcmV2aW91c1BhZ2VCb3JkZXJCb3hDZW50ZXIgPSBzdGF0ZS5jdXJyZW50LnBhZ2UuYm9yZGVyQm94Q2VudGVyO1xuICBjb25zdCB7XG4gICAgZHJhZ2dhYmxlcyxcbiAgICBkcm9wcGFibGVzXG4gIH0gPSBzdGF0ZS5kaW1lbnNpb25zO1xuICByZXR1cm4gaXNNb3ZpbmdPbk1haW5BeGlzID8gbW92ZVRvTmV4dFBsYWNlKHtcbiAgICBpc01vdmluZ0ZvcndhcmQsXG4gICAgcHJldmlvdXNQYWdlQm9yZGVyQm94Q2VudGVyLFxuICAgIGRyYWdnYWJsZSxcbiAgICBkZXN0aW5hdGlvbjogaXNPdmVyLFxuICAgIGRyYWdnYWJsZXMsXG4gICAgdmlld3BvcnQ6IHN0YXRlLnZpZXdwb3J0LFxuICAgIHByZXZpb3VzQ2xpZW50U2VsZWN0aW9uOiBzdGF0ZS5jdXJyZW50LmNsaWVudC5zZWxlY3Rpb24sXG4gICAgcHJldmlvdXNJbXBhY3Q6IHN0YXRlLmltcGFjdCxcbiAgICBhZnRlckNyaXRpY2FsOiBzdGF0ZS5hZnRlckNyaXRpY2FsXG4gIH0pIDogbW92ZUNyb3NzQXhpcyh7XG4gICAgaXNNb3ZpbmdGb3J3YXJkLFxuICAgIHByZXZpb3VzUGFnZUJvcmRlckJveENlbnRlcixcbiAgICBkcmFnZ2FibGUsXG4gICAgaXNPdmVyLFxuICAgIGRyYWdnYWJsZXMsXG4gICAgZHJvcHBhYmxlcyxcbiAgICB2aWV3cG9ydDogc3RhdGUudmlld3BvcnQsXG4gICAgYWZ0ZXJDcml0aWNhbDogc3RhdGUuYWZ0ZXJDcml0aWNhbFxuICB9KTtcbn0pO1xuXG5mdW5jdGlvbiBpc01vdmVtZW50QWxsb3dlZChzdGF0ZSkge1xuICByZXR1cm4gc3RhdGUucGhhc2UgPT09ICdEUkFHR0lORycgfHwgc3RhdGUucGhhc2UgPT09ICdDT0xMRUNUSU5HJztcbn1cblxuZnVuY3Rpb24gaXNQb3NpdGlvbkluRnJhbWUoZnJhbWUpIHtcbiAgY29uc3QgaXNXaXRoaW5WZXJ0aWNhbCA9IGlzV2l0aGluKGZyYW1lLnRvcCwgZnJhbWUuYm90dG9tKTtcbiAgY29uc3QgaXNXaXRoaW5Ib3Jpem9udGFsID0gaXNXaXRoaW4oZnJhbWUubGVmdCwgZnJhbWUucmlnaHQpO1xuICByZXR1cm4gZnVuY3Rpb24gcnVuKHBvaW50KSB7XG4gICAgcmV0dXJuIGlzV2l0aGluVmVydGljYWwocG9pbnQueSkgJiYgaXNXaXRoaW5Ib3Jpem9udGFsKHBvaW50LngpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBnZXRIYXNPdmVybGFwKGZpcnN0LCBzZWNvbmQpIHtcbiAgcmV0dXJuIGZpcnN0LmxlZnQgPCBzZWNvbmQucmlnaHQgJiYgZmlyc3QucmlnaHQgPiBzZWNvbmQubGVmdCAmJiBmaXJzdC50b3AgPCBzZWNvbmQuYm90dG9tICYmIGZpcnN0LmJvdHRvbSA+IHNlY29uZC50b3A7XG59XG5cbmZ1bmN0aW9uIGdldEZ1cnRoZXN0QXdheShfcmVmKSB7XG4gIGxldCB7XG4gICAgcGFnZUJvcmRlckJveCxcbiAgICBkcmFnZ2FibGUsXG4gICAgY2FuZGlkYXRlc1xuICB9ID0gX3JlZjtcbiAgY29uc3Qgc3RhcnRDZW50ZXIgPSBkcmFnZ2FibGUucGFnZS5ib3JkZXJCb3guY2VudGVyO1xuICBjb25zdCBzb3J0ZWQgPSBjYW5kaWRhdGVzLm1hcChjYW5kaWRhdGUgPT4ge1xuICAgIGNvbnN0IGF4aXMgPSBjYW5kaWRhdGUuYXhpcztcbiAgICBjb25zdCB0YXJnZXQgPSBwYXRjaChjYW5kaWRhdGUuYXhpcy5saW5lLCBwYWdlQm9yZGVyQm94LmNlbnRlcltheGlzLmxpbmVdLCBjYW5kaWRhdGUucGFnZS5ib3JkZXJCb3guY2VudGVyW2F4aXMuY3Jvc3NBeGlzTGluZV0pO1xuICAgIHJldHVybiB7XG4gICAgICBpZDogY2FuZGlkYXRlLmRlc2NyaXB0b3IuaWQsXG4gICAgICBkaXN0YW5jZTogZGlzdGFuY2Uoc3RhcnRDZW50ZXIsIHRhcmdldClcbiAgICB9O1xuICB9KS5zb3J0KChhLCBiKSA9PiBiLmRpc3RhbmNlIC0gYS5kaXN0YW5jZSk7XG4gIHJldHVybiBzb3J0ZWRbMF0gPyBzb3J0ZWRbMF0uaWQgOiBudWxsO1xufVxuXG5mdW5jdGlvbiBnZXREcm9wcGFibGVPdmVyKF9yZWYyKSB7XG4gIGxldCB7XG4gICAgcGFnZUJvcmRlckJveCxcbiAgICBkcmFnZ2FibGUsXG4gICAgZHJvcHBhYmxlc1xuICB9ID0gX3JlZjI7XG4gIGNvbnN0IGNhbmRpZGF0ZXMgPSB0b0Ryb3BwYWJsZUxpc3QoZHJvcHBhYmxlcykuZmlsdGVyKGl0ZW0gPT4ge1xuICAgIGlmICghaXRlbS5pc0VuYWJsZWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBhY3RpdmUgPSBpdGVtLnN1YmplY3QuYWN0aXZlO1xuXG4gICAgaWYgKCFhY3RpdmUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoIWdldEhhc092ZXJsYXAocGFnZUJvcmRlckJveCwgYWN0aXZlKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChpc1Bvc2l0aW9uSW5GcmFtZShhY3RpdmUpKHBhZ2VCb3JkZXJCb3guY2VudGVyKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgY29uc3QgYXhpcyA9IGl0ZW0uYXhpcztcbiAgICBjb25zdCBjaGlsZENlbnRlciA9IGFjdGl2ZS5jZW50ZXJbYXhpcy5jcm9zc0F4aXNMaW5lXTtcbiAgICBjb25zdCBjcm9zc0F4aXNTdGFydCA9IHBhZ2VCb3JkZXJCb3hbYXhpcy5jcm9zc0F4aXNTdGFydF07XG4gICAgY29uc3QgY3Jvc3NBeGlzRW5kID0gcGFnZUJvcmRlckJveFtheGlzLmNyb3NzQXhpc0VuZF07XG4gICAgY29uc3QgaXNDb250YWluZWQgPSBpc1dpdGhpbihhY3RpdmVbYXhpcy5jcm9zc0F4aXNTdGFydF0sIGFjdGl2ZVtheGlzLmNyb3NzQXhpc0VuZF0pO1xuICAgIGNvbnN0IGlzU3RhcnRDb250YWluZWQgPSBpc0NvbnRhaW5lZChjcm9zc0F4aXNTdGFydCk7XG4gICAgY29uc3QgaXNFbmRDb250YWluZWQgPSBpc0NvbnRhaW5lZChjcm9zc0F4aXNFbmQpO1xuXG4gICAgaWYgKCFpc1N0YXJ0Q29udGFpbmVkICYmICFpc0VuZENvbnRhaW5lZCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKGlzU3RhcnRDb250YWluZWQpIHtcbiAgICAgIHJldHVybiBjcm9zc0F4aXNTdGFydCA8IGNoaWxkQ2VudGVyO1xuICAgIH1cblxuICAgIHJldHVybiBjcm9zc0F4aXNFbmQgPiBjaGlsZENlbnRlcjtcbiAgfSk7XG5cbiAgaWYgKCFjYW5kaWRhdGVzLmxlbmd0aCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKGNhbmRpZGF0ZXMubGVuZ3RoID09PSAxKSB7XG4gICAgcmV0dXJuIGNhbmRpZGF0ZXNbMF0uZGVzY3JpcHRvci5pZDtcbiAgfVxuXG4gIHJldHVybiBnZXRGdXJ0aGVzdEF3YXkoe1xuICAgIHBhZ2VCb3JkZXJCb3gsXG4gICAgZHJhZ2dhYmxlLFxuICAgIGNhbmRpZGF0ZXNcbiAgfSk7XG59XG5cbmNvbnN0IG9mZnNldFJlY3RCeVBvc2l0aW9uID0gKHJlY3QsIHBvaW50KSA9PiBjc3NCb3hNb2RlbC5nZXRSZWN0KG9mZnNldEJ5UG9zaXRpb24ocmVjdCwgcG9pbnQpKTtcblxudmFyIHdpdGhEcm9wcGFibGVTY3JvbGwgPSAoKGRyb3BwYWJsZSwgYXJlYSkgPT4ge1xuICBjb25zdCBmcmFtZSA9IGRyb3BwYWJsZS5mcmFtZTtcblxuICBpZiAoIWZyYW1lKSB7XG4gICAgcmV0dXJuIGFyZWE7XG4gIH1cblxuICByZXR1cm4gb2Zmc2V0UmVjdEJ5UG9zaXRpb24oYXJlYSwgZnJhbWUuc2Nyb2xsLmRpZmYudmFsdWUpO1xufSk7XG5cbmZ1bmN0aW9uIGdldElzRGlzcGxhY2VkKF9yZWYpIHtcbiAgbGV0IHtcbiAgICBkaXNwbGFjZWQsXG4gICAgaWRcbiAgfSA9IF9yZWY7XG4gIHJldHVybiBCb29sZWFuKGRpc3BsYWNlZC52aXNpYmxlW2lkXSB8fCBkaXNwbGFjZWQuaW52aXNpYmxlW2lkXSk7XG59XG5cbmZ1bmN0aW9uIGF0SW5kZXgoX3JlZikge1xuICBsZXQge1xuICAgIGRyYWdnYWJsZSxcbiAgICBjbG9zZXN0LFxuICAgIGluSG9tZUxpc3RcbiAgfSA9IF9yZWY7XG5cbiAgaWYgKCFjbG9zZXN0KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZiAoIWluSG9tZUxpc3QpIHtcbiAgICByZXR1cm4gY2xvc2VzdC5kZXNjcmlwdG9yLmluZGV4O1xuICB9XG5cbiAgaWYgKGNsb3Nlc3QuZGVzY3JpcHRvci5pbmRleCA+IGRyYWdnYWJsZS5kZXNjcmlwdG9yLmluZGV4KSB7XG4gICAgcmV0dXJuIGNsb3Nlc3QuZGVzY3JpcHRvci5pbmRleCAtIDE7XG4gIH1cblxuICByZXR1cm4gY2xvc2VzdC5kZXNjcmlwdG9yLmluZGV4O1xufVxuXG52YXIgZ2V0UmVvcmRlckltcGFjdCA9IChfcmVmMiA9PiB7XG4gIGxldCB7XG4gICAgcGFnZUJvcmRlckJveFdpdGhEcm9wcGFibGVTY3JvbGw6IHRhcmdldFJlY3QsXG4gICAgZHJhZ2dhYmxlLFxuICAgIGRlc3RpbmF0aW9uLFxuICAgIGluc2lkZURlc3RpbmF0aW9uLFxuICAgIGxhc3QsXG4gICAgdmlld3BvcnQsXG4gICAgYWZ0ZXJDcml0aWNhbFxuICB9ID0gX3JlZjI7XG4gIGNvbnN0IGF4aXMgPSBkZXN0aW5hdGlvbi5heGlzO1xuICBjb25zdCBkaXNwbGFjZWRCeSA9IGdldERpc3BsYWNlZEJ5KGRlc3RpbmF0aW9uLmF4aXMsIGRyYWdnYWJsZS5kaXNwbGFjZUJ5KTtcbiAgY29uc3QgZGlzcGxhY2VtZW50ID0gZGlzcGxhY2VkQnkudmFsdWU7XG4gIGNvbnN0IHRhcmdldFN0YXJ0ID0gdGFyZ2V0UmVjdFtheGlzLnN0YXJ0XTtcbiAgY29uc3QgdGFyZ2V0RW5kID0gdGFyZ2V0UmVjdFtheGlzLmVuZF07XG4gIGNvbnN0IHdpdGhvdXREcmFnZ2luZyA9IHJlbW92ZURyYWdnYWJsZUZyb21MaXN0KGRyYWdnYWJsZSwgaW5zaWRlRGVzdGluYXRpb24pO1xuICBjb25zdCBjbG9zZXN0ID0gd2l0aG91dERyYWdnaW5nLmZpbmQoY2hpbGQgPT4ge1xuICAgIGNvbnN0IGlkID0gY2hpbGQuZGVzY3JpcHRvci5pZDtcbiAgICBjb25zdCBjaGlsZENlbnRlciA9IGNoaWxkLnBhZ2UuYm9yZGVyQm94LmNlbnRlcltheGlzLmxpbmVdO1xuICAgIGNvbnN0IGRpZFN0YXJ0QWZ0ZXJDcml0aWNhbCQxID0gZGlkU3RhcnRBZnRlckNyaXRpY2FsKGlkLCBhZnRlckNyaXRpY2FsKTtcbiAgICBjb25zdCBpc0Rpc3BsYWNlZCA9IGdldElzRGlzcGxhY2VkKHtcbiAgICAgIGRpc3BsYWNlZDogbGFzdCxcbiAgICAgIGlkXG4gICAgfSk7XG5cbiAgICBpZiAoZGlkU3RhcnRBZnRlckNyaXRpY2FsJDEpIHtcbiAgICAgIGlmIChpc0Rpc3BsYWNlZCkge1xuICAgICAgICByZXR1cm4gdGFyZ2V0RW5kIDw9IGNoaWxkQ2VudGVyO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGFyZ2V0U3RhcnQgPCBjaGlsZENlbnRlciAtIGRpc3BsYWNlbWVudDtcbiAgICB9XG5cbiAgICBpZiAoaXNEaXNwbGFjZWQpIHtcbiAgICAgIHJldHVybiB0YXJnZXRFbmQgPD0gY2hpbGRDZW50ZXIgKyBkaXNwbGFjZW1lbnQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRhcmdldFN0YXJ0IDwgY2hpbGRDZW50ZXI7XG4gIH0pIHx8IG51bGw7XG4gIGNvbnN0IG5ld0luZGV4ID0gYXRJbmRleCh7XG4gICAgZHJhZ2dhYmxlLFxuICAgIGNsb3Nlc3QsXG4gICAgaW5Ib21lTGlzdDogaXNIb21lT2YoZHJhZ2dhYmxlLCBkZXN0aW5hdGlvbilcbiAgfSk7XG4gIHJldHVybiBjYWxjdWxhdGVSZW9yZGVySW1wYWN0KHtcbiAgICBkcmFnZ2FibGUsXG4gICAgaW5zaWRlRGVzdGluYXRpb24sXG4gICAgZGVzdGluYXRpb24sXG4gICAgdmlld3BvcnQsXG4gICAgbGFzdCxcbiAgICBkaXNwbGFjZWRCeSxcbiAgICBpbmRleDogbmV3SW5kZXhcbiAgfSk7XG59KTtcblxuY29uc3QgY29tYmluZVRocmVzaG9sZERpdmlzb3IgPSA0O1xudmFyIGdldENvbWJpbmVJbXBhY3QgPSAoX3JlZiA9PiB7XG4gIGxldCB7XG4gICAgZHJhZ2dhYmxlLFxuICAgIHBhZ2VCb3JkZXJCb3hXaXRoRHJvcHBhYmxlU2Nyb2xsOiB0YXJnZXRSZWN0LFxuICAgIHByZXZpb3VzSW1wYWN0LFxuICAgIGRlc3RpbmF0aW9uLFxuICAgIGluc2lkZURlc3RpbmF0aW9uLFxuICAgIGFmdGVyQ3JpdGljYWxcbiAgfSA9IF9yZWY7XG5cbiAgaWYgKCFkZXN0aW5hdGlvbi5pc0NvbWJpbmVFbmFibGVkKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBheGlzID0gZGVzdGluYXRpb24uYXhpcztcbiAgY29uc3QgZGlzcGxhY2VkQnkgPSBnZXREaXNwbGFjZWRCeShkZXN0aW5hdGlvbi5heGlzLCBkcmFnZ2FibGUuZGlzcGxhY2VCeSk7XG4gIGNvbnN0IGRpc3BsYWNlbWVudCA9IGRpc3BsYWNlZEJ5LnZhbHVlO1xuICBjb25zdCB0YXJnZXRTdGFydCA9IHRhcmdldFJlY3RbYXhpcy5zdGFydF07XG4gIGNvbnN0IHRhcmdldEVuZCA9IHRhcmdldFJlY3RbYXhpcy5lbmRdO1xuICBjb25zdCB3aXRob3V0RHJhZ2dpbmcgPSByZW1vdmVEcmFnZ2FibGVGcm9tTGlzdChkcmFnZ2FibGUsIGluc2lkZURlc3RpbmF0aW9uKTtcbiAgY29uc3QgY29tYmluZVdpdGggPSB3aXRob3V0RHJhZ2dpbmcuZmluZChjaGlsZCA9PiB7XG4gICAgY29uc3QgaWQgPSBjaGlsZC5kZXNjcmlwdG9yLmlkO1xuICAgIGNvbnN0IGNoaWxkUmVjdCA9IGNoaWxkLnBhZ2UuYm9yZGVyQm94O1xuICAgIGNvbnN0IGNoaWxkU2l6ZSA9IGNoaWxkUmVjdFtheGlzLnNpemVdO1xuICAgIGNvbnN0IHRocmVzaG9sZCA9IGNoaWxkU2l6ZSAvIGNvbWJpbmVUaHJlc2hvbGREaXZpc29yO1xuICAgIGNvbnN0IGRpZFN0YXJ0QWZ0ZXJDcml0aWNhbCQxID0gZGlkU3RhcnRBZnRlckNyaXRpY2FsKGlkLCBhZnRlckNyaXRpY2FsKTtcbiAgICBjb25zdCBpc0Rpc3BsYWNlZCA9IGdldElzRGlzcGxhY2VkKHtcbiAgICAgIGRpc3BsYWNlZDogcHJldmlvdXNJbXBhY3QuZGlzcGxhY2VkLFxuICAgICAgaWRcbiAgICB9KTtcblxuICAgIGlmIChkaWRTdGFydEFmdGVyQ3JpdGljYWwkMSkge1xuICAgICAgaWYgKGlzRGlzcGxhY2VkKSB7XG4gICAgICAgIHJldHVybiB0YXJnZXRFbmQgPiBjaGlsZFJlY3RbYXhpcy5zdGFydF0gKyB0aHJlc2hvbGQgJiYgdGFyZ2V0RW5kIDwgY2hpbGRSZWN0W2F4aXMuZW5kXSAtIHRocmVzaG9sZDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRhcmdldFN0YXJ0ID4gY2hpbGRSZWN0W2F4aXMuc3RhcnRdIC0gZGlzcGxhY2VtZW50ICsgdGhyZXNob2xkICYmIHRhcmdldFN0YXJ0IDwgY2hpbGRSZWN0W2F4aXMuZW5kXSAtIGRpc3BsYWNlbWVudCAtIHRocmVzaG9sZDtcbiAgICB9XG5cbiAgICBpZiAoaXNEaXNwbGFjZWQpIHtcbiAgICAgIHJldHVybiB0YXJnZXRFbmQgPiBjaGlsZFJlY3RbYXhpcy5zdGFydF0gKyBkaXNwbGFjZW1lbnQgKyB0aHJlc2hvbGQgJiYgdGFyZ2V0RW5kIDwgY2hpbGRSZWN0W2F4aXMuZW5kXSArIGRpc3BsYWNlbWVudCAtIHRocmVzaG9sZDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGFyZ2V0U3RhcnQgPiBjaGlsZFJlY3RbYXhpcy5zdGFydF0gKyB0aHJlc2hvbGQgJiYgdGFyZ2V0U3RhcnQgPCBjaGlsZFJlY3RbYXhpcy5lbmRdIC0gdGhyZXNob2xkO1xuICB9KTtcblxuICBpZiAoIWNvbWJpbmVXaXRoKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBpbXBhY3QgPSB7XG4gICAgZGlzcGxhY2VkQnksXG4gICAgZGlzcGxhY2VkOiBwcmV2aW91c0ltcGFjdC5kaXNwbGFjZWQsXG4gICAgYXQ6IHtcbiAgICAgIHR5cGU6ICdDT01CSU5FJyxcbiAgICAgIGNvbWJpbmU6IHtcbiAgICAgICAgZHJhZ2dhYmxlSWQ6IGNvbWJpbmVXaXRoLmRlc2NyaXB0b3IuaWQsXG4gICAgICAgIGRyb3BwYWJsZUlkOiBkZXN0aW5hdGlvbi5kZXNjcmlwdG9yLmlkXG4gICAgICB9XG4gICAgfVxuICB9O1xuICByZXR1cm4gaW1wYWN0O1xufSk7XG5cbnZhciBnZXREcmFnSW1wYWN0ID0gKF9yZWYgPT4ge1xuICBsZXQge1xuICAgIHBhZ2VPZmZzZXQsXG4gICAgZHJhZ2dhYmxlLFxuICAgIGRyYWdnYWJsZXMsXG4gICAgZHJvcHBhYmxlcyxcbiAgICBwcmV2aW91c0ltcGFjdCxcbiAgICB2aWV3cG9ydCxcbiAgICBhZnRlckNyaXRpY2FsXG4gIH0gPSBfcmVmO1xuICBjb25zdCBwYWdlQm9yZGVyQm94ID0gb2Zmc2V0UmVjdEJ5UG9zaXRpb24oZHJhZ2dhYmxlLnBhZ2UuYm9yZGVyQm94LCBwYWdlT2Zmc2V0KTtcbiAgY29uc3QgZGVzdGluYXRpb25JZCA9IGdldERyb3BwYWJsZU92ZXIoe1xuICAgIHBhZ2VCb3JkZXJCb3gsXG4gICAgZHJhZ2dhYmxlLFxuICAgIGRyb3BwYWJsZXNcbiAgfSk7XG5cbiAgaWYgKCFkZXN0aW5hdGlvbklkKSB7XG4gICAgcmV0dXJuIG5vSW1wYWN0JDE7XG4gIH1cblxuICBjb25zdCBkZXN0aW5hdGlvbiA9IGRyb3BwYWJsZXNbZGVzdGluYXRpb25JZF07XG4gIGNvbnN0IGluc2lkZURlc3RpbmF0aW9uID0gZ2V0RHJhZ2dhYmxlc0luc2lkZURyb3BwYWJsZShkZXN0aW5hdGlvbi5kZXNjcmlwdG9yLmlkLCBkcmFnZ2FibGVzKTtcbiAgY29uc3QgcGFnZUJvcmRlckJveFdpdGhEcm9wcGFibGVTY3JvbGwgPSB3aXRoRHJvcHBhYmxlU2Nyb2xsKGRlc3RpbmF0aW9uLCBwYWdlQm9yZGVyQm94KTtcbiAgcmV0dXJuIGdldENvbWJpbmVJbXBhY3Qoe1xuICAgIHBhZ2VCb3JkZXJCb3hXaXRoRHJvcHBhYmxlU2Nyb2xsLFxuICAgIGRyYWdnYWJsZSxcbiAgICBwcmV2aW91c0ltcGFjdCxcbiAgICBkZXN0aW5hdGlvbixcbiAgICBpbnNpZGVEZXN0aW5hdGlvbixcbiAgICBhZnRlckNyaXRpY2FsXG4gIH0pIHx8IGdldFJlb3JkZXJJbXBhY3Qoe1xuICAgIHBhZ2VCb3JkZXJCb3hXaXRoRHJvcHBhYmxlU2Nyb2xsLFxuICAgIGRyYWdnYWJsZSxcbiAgICBkZXN0aW5hdGlvbixcbiAgICBpbnNpZGVEZXN0aW5hdGlvbixcbiAgICBsYXN0OiBwcmV2aW91c0ltcGFjdC5kaXNwbGFjZWQsXG4gICAgdmlld3BvcnQsXG4gICAgYWZ0ZXJDcml0aWNhbFxuICB9KTtcbn0pO1xuXG52YXIgcGF0Y2hEcm9wcGFibGVNYXAgPSAoKGRyb3BwYWJsZXMsIHVwZGF0ZWQpID0+ICh7IC4uLmRyb3BwYWJsZXMsXG4gIFt1cGRhdGVkLmRlc2NyaXB0b3IuaWRdOiB1cGRhdGVkXG59KSk7XG5cbmNvbnN0IGNsZWFyVW51c2VkUGxhY2Vob2xkZXIgPSBfcmVmID0+IHtcbiAgbGV0IHtcbiAgICBwcmV2aW91c0ltcGFjdCxcbiAgICBpbXBhY3QsXG4gICAgZHJvcHBhYmxlc1xuICB9ID0gX3JlZjtcbiAgY29uc3QgbGFzdCA9IHdoYXRJc0RyYWdnZWRPdmVyKHByZXZpb3VzSW1wYWN0KTtcbiAgY29uc3Qgbm93ID0gd2hhdElzRHJhZ2dlZE92ZXIoaW1wYWN0KTtcblxuICBpZiAoIWxhc3QpIHtcbiAgICByZXR1cm4gZHJvcHBhYmxlcztcbiAgfVxuXG4gIGlmIChsYXN0ID09PSBub3cpIHtcbiAgICByZXR1cm4gZHJvcHBhYmxlcztcbiAgfVxuXG4gIGNvbnN0IGxhc3REcm9wcGFibGUgPSBkcm9wcGFibGVzW2xhc3RdO1xuXG4gIGlmICghbGFzdERyb3BwYWJsZS5zdWJqZWN0LndpdGhQbGFjZWhvbGRlcikge1xuICAgIHJldHVybiBkcm9wcGFibGVzO1xuICB9XG5cbiAgY29uc3QgdXBkYXRlZCA9IHJlbW92ZVBsYWNlaG9sZGVyKGxhc3REcm9wcGFibGUpO1xuICByZXR1cm4gcGF0Y2hEcm9wcGFibGVNYXAoZHJvcHBhYmxlcywgdXBkYXRlZCk7XG59O1xuXG52YXIgcmVjb21wdXRlUGxhY2Vob2xkZXJzID0gKF9yZWYyID0+IHtcbiAgbGV0IHtcbiAgICBkcmFnZ2FibGUsXG4gICAgZHJhZ2dhYmxlcyxcbiAgICBkcm9wcGFibGVzLFxuICAgIHByZXZpb3VzSW1wYWN0LFxuICAgIGltcGFjdFxuICB9ID0gX3JlZjI7XG4gIGNvbnN0IGNsZWFuZWQgPSBjbGVhclVudXNlZFBsYWNlaG9sZGVyKHtcbiAgICBwcmV2aW91c0ltcGFjdCxcbiAgICBpbXBhY3QsXG4gICAgZHJvcHBhYmxlc1xuICB9KTtcbiAgY29uc3QgaXNPdmVyID0gd2hhdElzRHJhZ2dlZE92ZXIoaW1wYWN0KTtcblxuICBpZiAoIWlzT3Zlcikge1xuICAgIHJldHVybiBjbGVhbmVkO1xuICB9XG5cbiAgY29uc3QgZHJvcHBhYmxlID0gZHJvcHBhYmxlc1tpc092ZXJdO1xuXG4gIGlmIChpc0hvbWVPZihkcmFnZ2FibGUsIGRyb3BwYWJsZSkpIHtcbiAgICByZXR1cm4gY2xlYW5lZDtcbiAgfVxuXG4gIGlmIChkcm9wcGFibGUuc3ViamVjdC53aXRoUGxhY2Vob2xkZXIpIHtcbiAgICByZXR1cm4gY2xlYW5lZDtcbiAgfVxuXG4gIGNvbnN0IHBhdGNoZWQgPSBhZGRQbGFjZWhvbGRlcihkcm9wcGFibGUsIGRyYWdnYWJsZSwgZHJhZ2dhYmxlcyk7XG4gIHJldHVybiBwYXRjaERyb3BwYWJsZU1hcChjbGVhbmVkLCBwYXRjaGVkKTtcbn0pO1xuXG52YXIgdXBkYXRlID0gKF9yZWYgPT4ge1xuICBsZXQge1xuICAgIHN0YXRlLFxuICAgIGNsaWVudFNlbGVjdGlvbjogZm9yY2VkQ2xpZW50U2VsZWN0aW9uLFxuICAgIGRpbWVuc2lvbnM6IGZvcmNlZERpbWVuc2lvbnMsXG4gICAgdmlld3BvcnQ6IGZvcmNlZFZpZXdwb3J0LFxuICAgIGltcGFjdDogZm9yY2VkSW1wYWN0LFxuICAgIHNjcm9sbEp1bXBSZXF1ZXN0XG4gIH0gPSBfcmVmO1xuICBjb25zdCB2aWV3cG9ydCA9IGZvcmNlZFZpZXdwb3J0IHx8IHN0YXRlLnZpZXdwb3J0O1xuICBjb25zdCBkaW1lbnNpb25zID0gZm9yY2VkRGltZW5zaW9ucyB8fCBzdGF0ZS5kaW1lbnNpb25zO1xuICBjb25zdCBjbGllbnRTZWxlY3Rpb24gPSBmb3JjZWRDbGllbnRTZWxlY3Rpb24gfHwgc3RhdGUuY3VycmVudC5jbGllbnQuc2VsZWN0aW9uO1xuICBjb25zdCBvZmZzZXQgPSBzdWJ0cmFjdChjbGllbnRTZWxlY3Rpb24sIHN0YXRlLmluaXRpYWwuY2xpZW50LnNlbGVjdGlvbik7XG4gIGNvbnN0IGNsaWVudCA9IHtcbiAgICBvZmZzZXQsXG4gICAgc2VsZWN0aW9uOiBjbGllbnRTZWxlY3Rpb24sXG4gICAgYm9yZGVyQm94Q2VudGVyOiBhZGQoc3RhdGUuaW5pdGlhbC5jbGllbnQuYm9yZGVyQm94Q2VudGVyLCBvZmZzZXQpXG4gIH07XG4gIGNvbnN0IHBhZ2UgPSB7XG4gICAgc2VsZWN0aW9uOiBhZGQoY2xpZW50LnNlbGVjdGlvbiwgdmlld3BvcnQuc2Nyb2xsLmN1cnJlbnQpLFxuICAgIGJvcmRlckJveENlbnRlcjogYWRkKGNsaWVudC5ib3JkZXJCb3hDZW50ZXIsIHZpZXdwb3J0LnNjcm9sbC5jdXJyZW50KSxcbiAgICBvZmZzZXQ6IGFkZChjbGllbnQub2Zmc2V0LCB2aWV3cG9ydC5zY3JvbGwuZGlmZi52YWx1ZSlcbiAgfTtcbiAgY29uc3QgY3VycmVudCA9IHtcbiAgICBjbGllbnQsXG4gICAgcGFnZVxuICB9O1xuXG4gIGlmIChzdGF0ZS5waGFzZSA9PT0gJ0NPTExFQ1RJTkcnKSB7XG4gICAgcmV0dXJuIHsgLi4uc3RhdGUsXG4gICAgICBkaW1lbnNpb25zLFxuICAgICAgdmlld3BvcnQsXG4gICAgICBjdXJyZW50XG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0IGRyYWdnYWJsZSA9IGRpbWVuc2lvbnMuZHJhZ2dhYmxlc1tzdGF0ZS5jcml0aWNhbC5kcmFnZ2FibGUuaWRdO1xuICBjb25zdCBuZXdJbXBhY3QgPSBmb3JjZWRJbXBhY3QgfHwgZ2V0RHJhZ0ltcGFjdCh7XG4gICAgcGFnZU9mZnNldDogcGFnZS5vZmZzZXQsXG4gICAgZHJhZ2dhYmxlLFxuICAgIGRyYWdnYWJsZXM6IGRpbWVuc2lvbnMuZHJhZ2dhYmxlcyxcbiAgICBkcm9wcGFibGVzOiBkaW1lbnNpb25zLmRyb3BwYWJsZXMsXG4gICAgcHJldmlvdXNJbXBhY3Q6IHN0YXRlLmltcGFjdCxcbiAgICB2aWV3cG9ydCxcbiAgICBhZnRlckNyaXRpY2FsOiBzdGF0ZS5hZnRlckNyaXRpY2FsXG4gIH0pO1xuICBjb25zdCB3aXRoVXBkYXRlZFBsYWNlaG9sZGVycyA9IHJlY29tcHV0ZVBsYWNlaG9sZGVycyh7XG4gICAgZHJhZ2dhYmxlLFxuICAgIGltcGFjdDogbmV3SW1wYWN0LFxuICAgIHByZXZpb3VzSW1wYWN0OiBzdGF0ZS5pbXBhY3QsXG4gICAgZHJhZ2dhYmxlczogZGltZW5zaW9ucy5kcmFnZ2FibGVzLFxuICAgIGRyb3BwYWJsZXM6IGRpbWVuc2lvbnMuZHJvcHBhYmxlc1xuICB9KTtcbiAgY29uc3QgcmVzdWx0ID0geyAuLi5zdGF0ZSxcbiAgICBjdXJyZW50LFxuICAgIGRpbWVuc2lvbnM6IHtcbiAgICAgIGRyYWdnYWJsZXM6IGRpbWVuc2lvbnMuZHJhZ2dhYmxlcyxcbiAgICAgIGRyb3BwYWJsZXM6IHdpdGhVcGRhdGVkUGxhY2Vob2xkZXJzXG4gICAgfSxcbiAgICBpbXBhY3Q6IG5ld0ltcGFjdCxcbiAgICB2aWV3cG9ydCxcbiAgICBzY3JvbGxKdW1wUmVxdWVzdDogc2Nyb2xsSnVtcFJlcXVlc3QgfHwgbnVsbCxcbiAgICBmb3JjZVNob3VsZEFuaW1hdGU6IHNjcm9sbEp1bXBSZXF1ZXN0ID8gZmFsc2UgOiBudWxsXG4gIH07XG4gIHJldHVybiByZXN1bHQ7XG59KTtcblxuZnVuY3Rpb24gZ2V0RHJhZ2dhYmxlcyhpZHMsIGRyYWdnYWJsZXMpIHtcbiAgcmV0dXJuIGlkcy5tYXAoaWQgPT4gZHJhZ2dhYmxlc1tpZF0pO1xufVxuXG52YXIgcmVjb21wdXRlID0gKF9yZWYgPT4ge1xuICBsZXQge1xuICAgIGltcGFjdCxcbiAgICB2aWV3cG9ydCxcbiAgICBkcmFnZ2FibGVzLFxuICAgIGRlc3RpbmF0aW9uLFxuICAgIGZvcmNlU2hvdWxkQW5pbWF0ZVxuICB9ID0gX3JlZjtcbiAgY29uc3QgbGFzdCA9IGltcGFjdC5kaXNwbGFjZWQ7XG4gIGNvbnN0IGFmdGVyRHJhZ2dpbmcgPSBnZXREcmFnZ2FibGVzKGxhc3QuYWxsLCBkcmFnZ2FibGVzKTtcbiAgY29uc3QgZGlzcGxhY2VkID0gZ2V0RGlzcGxhY2VtZW50R3JvdXBzKHtcbiAgICBhZnRlckRyYWdnaW5nLFxuICAgIGRlc3RpbmF0aW9uLFxuICAgIGRpc3BsYWNlZEJ5OiBpbXBhY3QuZGlzcGxhY2VkQnksXG4gICAgdmlld3BvcnQ6IHZpZXdwb3J0LmZyYW1lLFxuICAgIGZvcmNlU2hvdWxkQW5pbWF0ZSxcbiAgICBsYXN0XG4gIH0pO1xuICByZXR1cm4geyAuLi5pbXBhY3QsXG4gICAgZGlzcGxhY2VkXG4gIH07XG59KTtcblxudmFyIGdldENsaWVudEJvcmRlckJveENlbnRlciA9IChfcmVmID0+IHtcbiAgbGV0IHtcbiAgICBpbXBhY3QsXG4gICAgZHJhZ2dhYmxlLFxuICAgIGRyb3BwYWJsZSxcbiAgICBkcmFnZ2FibGVzLFxuICAgIHZpZXdwb3J0LFxuICAgIGFmdGVyQ3JpdGljYWxcbiAgfSA9IF9yZWY7XG4gIGNvbnN0IHBhZ2VCb3JkZXJCb3hDZW50ZXIgPSBnZXRQYWdlQm9yZGVyQm94Q2VudGVyRnJvbUltcGFjdCh7XG4gICAgaW1wYWN0LFxuICAgIGRyYWdnYWJsZSxcbiAgICBkcmFnZ2FibGVzLFxuICAgIGRyb3BwYWJsZSxcbiAgICBhZnRlckNyaXRpY2FsXG4gIH0pO1xuICByZXR1cm4gZ2V0Q2xpZW50RnJvbVBhZ2VCb3JkZXJCb3hDZW50ZXIoe1xuICAgIHBhZ2VCb3JkZXJCb3hDZW50ZXIsXG4gICAgZHJhZ2dhYmxlLFxuICAgIHZpZXdwb3J0XG4gIH0pO1xufSk7XG5cbnZhciByZWZyZXNoU25hcCA9IChfcmVmID0+IHtcbiAgbGV0IHtcbiAgICBzdGF0ZSxcbiAgICBkaW1lbnNpb25zOiBmb3JjZWREaW1lbnNpb25zLFxuICAgIHZpZXdwb3J0OiBmb3JjZWRWaWV3cG9ydFxuICB9ID0gX3JlZjtcbiAgIShzdGF0ZS5tb3ZlbWVudE1vZGUgPT09ICdTTkFQJykgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBpbnZhcmlhbnQoZmFsc2UpIDogaW52YXJpYW50KGZhbHNlKSA6IHZvaWQgMDtcbiAgY29uc3QgbmVlZHNWaXNpYmlsaXR5Q2hlY2sgPSBzdGF0ZS5pbXBhY3Q7XG4gIGNvbnN0IHZpZXdwb3J0ID0gZm9yY2VkVmlld3BvcnQgfHwgc3RhdGUudmlld3BvcnQ7XG4gIGNvbnN0IGRpbWVuc2lvbnMgPSBmb3JjZWREaW1lbnNpb25zIHx8IHN0YXRlLmRpbWVuc2lvbnM7XG4gIGNvbnN0IHtcbiAgICBkcmFnZ2FibGVzLFxuICAgIGRyb3BwYWJsZXNcbiAgfSA9IGRpbWVuc2lvbnM7XG4gIGNvbnN0IGRyYWdnYWJsZSA9IGRyYWdnYWJsZXNbc3RhdGUuY3JpdGljYWwuZHJhZ2dhYmxlLmlkXTtcbiAgY29uc3QgaXNPdmVyID0gd2hhdElzRHJhZ2dlZE92ZXIobmVlZHNWaXNpYmlsaXR5Q2hlY2spO1xuICAhaXNPdmVyID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gaW52YXJpYW50KGZhbHNlLCAnTXVzdCBiZSBvdmVyIGEgZGVzdGluYXRpb24gaW4gU05BUCBtb3ZlbWVudCBtb2RlJykgOiBpbnZhcmlhbnQoZmFsc2UpIDogdm9pZCAwO1xuICBjb25zdCBkZXN0aW5hdGlvbiA9IGRyb3BwYWJsZXNbaXNPdmVyXTtcbiAgY29uc3QgaW1wYWN0ID0gcmVjb21wdXRlKHtcbiAgICBpbXBhY3Q6IG5lZWRzVmlzaWJpbGl0eUNoZWNrLFxuICAgIHZpZXdwb3J0LFxuICAgIGRlc3RpbmF0aW9uLFxuICAgIGRyYWdnYWJsZXNcbiAgfSk7XG4gIGNvbnN0IGNsaWVudFNlbGVjdGlvbiA9IGdldENsaWVudEJvcmRlckJveENlbnRlcih7XG4gICAgaW1wYWN0LFxuICAgIGRyYWdnYWJsZSxcbiAgICBkcm9wcGFibGU6IGRlc3RpbmF0aW9uLFxuICAgIGRyYWdnYWJsZXMsXG4gICAgdmlld3BvcnQsXG4gICAgYWZ0ZXJDcml0aWNhbDogc3RhdGUuYWZ0ZXJDcml0aWNhbFxuICB9KTtcbiAgcmV0dXJuIHVwZGF0ZSh7XG4gICAgaW1wYWN0LFxuICAgIGNsaWVudFNlbGVjdGlvbixcbiAgICBzdGF0ZSxcbiAgICBkaW1lbnNpb25zLFxuICAgIHZpZXdwb3J0XG4gIH0pO1xufSk7XG5cbnZhciBnZXRIb21lTG9jYXRpb24gPSAoZGVzY3JpcHRvciA9PiAoe1xuICBpbmRleDogZGVzY3JpcHRvci5pbmRleCxcbiAgZHJvcHBhYmxlSWQ6IGRlc2NyaXB0b3IuZHJvcHBhYmxlSWRcbn0pKTtcblxudmFyIGdldExpZnRFZmZlY3QgPSAoX3JlZiA9PiB7XG4gIGxldCB7XG4gICAgZHJhZ2dhYmxlLFxuICAgIGhvbWUsXG4gICAgZHJhZ2dhYmxlcyxcbiAgICB2aWV3cG9ydFxuICB9ID0gX3JlZjtcbiAgY29uc3QgZGlzcGxhY2VkQnkgPSBnZXREaXNwbGFjZWRCeShob21lLmF4aXMsIGRyYWdnYWJsZS5kaXNwbGFjZUJ5KTtcbiAgY29uc3QgaW5zaWRlSG9tZSA9IGdldERyYWdnYWJsZXNJbnNpZGVEcm9wcGFibGUoaG9tZS5kZXNjcmlwdG9yLmlkLCBkcmFnZ2FibGVzKTtcbiAgY29uc3QgcmF3SW5kZXggPSBpbnNpZGVIb21lLmluZGV4T2YoZHJhZ2dhYmxlKTtcbiAgIShyYXdJbmRleCAhPT0gLTEpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gaW52YXJpYW50KGZhbHNlLCAnRXhwZWN0ZWQgZHJhZ2dhYmxlIHRvIGJlIGluc2lkZSBob21lIGxpc3QnKSA6IGludmFyaWFudChmYWxzZSkgOiB2b2lkIDA7XG4gIGNvbnN0IGFmdGVyRHJhZ2dpbmcgPSBpbnNpZGVIb21lLnNsaWNlKHJhd0luZGV4ICsgMSk7XG4gIGNvbnN0IGVmZmVjdGVkID0gYWZ0ZXJEcmFnZ2luZy5yZWR1Y2UoKHByZXZpb3VzLCBpdGVtKSA9PiB7XG4gICAgcHJldmlvdXNbaXRlbS5kZXNjcmlwdG9yLmlkXSA9IHRydWU7XG4gICAgcmV0dXJuIHByZXZpb3VzO1xuICB9LCB7fSk7XG4gIGNvbnN0IGFmdGVyQ3JpdGljYWwgPSB7XG4gICAgaW5WaXJ0dWFsTGlzdDogaG9tZS5kZXNjcmlwdG9yLm1vZGUgPT09ICd2aXJ0dWFsJyxcbiAgICBkaXNwbGFjZWRCeSxcbiAgICBlZmZlY3RlZFxuICB9O1xuICBjb25zdCBkaXNwbGFjZWQgPSBnZXREaXNwbGFjZW1lbnRHcm91cHMoe1xuICAgIGFmdGVyRHJhZ2dpbmcsXG4gICAgZGVzdGluYXRpb246IGhvbWUsXG4gICAgZGlzcGxhY2VkQnksXG4gICAgbGFzdDogbnVsbCxcbiAgICB2aWV3cG9ydDogdmlld3BvcnQuZnJhbWUsXG4gICAgZm9yY2VTaG91bGRBbmltYXRlOiBmYWxzZVxuICB9KTtcbiAgY29uc3QgaW1wYWN0ID0ge1xuICAgIGRpc3BsYWNlZCxcbiAgICBkaXNwbGFjZWRCeSxcbiAgICBhdDoge1xuICAgICAgdHlwZTogJ1JFT1JERVInLFxuICAgICAgZGVzdGluYXRpb246IGdldEhvbWVMb2NhdGlvbihkcmFnZ2FibGUuZGVzY3JpcHRvcilcbiAgICB9XG4gIH07XG4gIHJldHVybiB7XG4gICAgaW1wYWN0LFxuICAgIGFmdGVyQ3JpdGljYWxcbiAgfTtcbn0pO1xuXG52YXIgcGF0Y2hEaW1lbnNpb25NYXAgPSAoKGRpbWVuc2lvbnMsIHVwZGF0ZWQpID0+ICh7XG4gIGRyYWdnYWJsZXM6IGRpbWVuc2lvbnMuZHJhZ2dhYmxlcyxcbiAgZHJvcHBhYmxlczogcGF0Y2hEcm9wcGFibGVNYXAoZGltZW5zaW9ucy5kcm9wcGFibGVzLCB1cGRhdGVkKVxufSkpO1xuXG5jb25zdCBzdGFydCA9IGtleSA9PiB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxufTtcbmNvbnN0IGZpbmlzaCA9IGtleSA9PiB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxufTtcblxudmFyIG9mZnNldERyYWdnYWJsZSA9IChfcmVmID0+IHtcbiAgbGV0IHtcbiAgICBkcmFnZ2FibGUsXG4gICAgb2Zmc2V0LFxuICAgIGluaXRpYWxXaW5kb3dTY3JvbGxcbiAgfSA9IF9yZWY7XG4gIGNvbnN0IGNsaWVudCA9IGNzc0JveE1vZGVsLm9mZnNldChkcmFnZ2FibGUuY2xpZW50LCBvZmZzZXQpO1xuICBjb25zdCBwYWdlID0gY3NzQm94TW9kZWwud2l0aFNjcm9sbChjbGllbnQsIGluaXRpYWxXaW5kb3dTY3JvbGwpO1xuICBjb25zdCBtb3ZlZCA9IHsgLi4uZHJhZ2dhYmxlLFxuICAgIHBsYWNlaG9sZGVyOiB7IC4uLmRyYWdnYWJsZS5wbGFjZWhvbGRlcixcbiAgICAgIGNsaWVudFxuICAgIH0sXG4gICAgY2xpZW50LFxuICAgIHBhZ2VcbiAgfTtcbiAgcmV0dXJuIG1vdmVkO1xufSk7XG5cbnZhciBnZXRGcmFtZSA9IChkcm9wcGFibGUgPT4ge1xuICBjb25zdCBmcmFtZSA9IGRyb3BwYWJsZS5mcmFtZTtcbiAgIWZyYW1lID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gaW52YXJpYW50KGZhbHNlLCAnRXhwZWN0ZWQgRHJvcHBhYmxlIHRvIGhhdmUgYSBmcmFtZScpIDogaW52YXJpYW50KGZhbHNlKSA6IHZvaWQgMDtcbiAgcmV0dXJuIGZyYW1lO1xufSk7XG5cbnZhciBhZGp1c3RBZGRpdGlvbnNGb3JTY3JvbGxDaGFuZ2VzID0gKF9yZWYgPT4ge1xuICBsZXQge1xuICAgIGFkZGl0aW9ucyxcbiAgICB1cGRhdGVkRHJvcHBhYmxlcyxcbiAgICB2aWV3cG9ydFxuICB9ID0gX3JlZjtcbiAgY29uc3Qgd2luZG93U2Nyb2xsQ2hhbmdlID0gdmlld3BvcnQuc2Nyb2xsLmRpZmYudmFsdWU7XG4gIHJldHVybiBhZGRpdGlvbnMubWFwKGRyYWdnYWJsZSA9PiB7XG4gICAgY29uc3QgZHJvcHBhYmxlSWQgPSBkcmFnZ2FibGUuZGVzY3JpcHRvci5kcm9wcGFibGVJZDtcbiAgICBjb25zdCBtb2RpZmllZCA9IHVwZGF0ZWREcm9wcGFibGVzW2Ryb3BwYWJsZUlkXTtcbiAgICBjb25zdCBmcmFtZSA9IGdldEZyYW1lKG1vZGlmaWVkKTtcbiAgICBjb25zdCBkcm9wcGFibGVTY3JvbGxDaGFuZ2UgPSBmcmFtZS5zY3JvbGwuZGlmZi52YWx1ZTtcbiAgICBjb25zdCB0b3RhbENoYW5nZSA9IGFkZCh3aW5kb3dTY3JvbGxDaGFuZ2UsIGRyb3BwYWJsZVNjcm9sbENoYW5nZSk7XG4gICAgY29uc3QgbW92ZWQgPSBvZmZzZXREcmFnZ2FibGUoe1xuICAgICAgZHJhZ2dhYmxlLFxuICAgICAgb2Zmc2V0OiB0b3RhbENoYW5nZSxcbiAgICAgIGluaXRpYWxXaW5kb3dTY3JvbGw6IHZpZXdwb3J0LnNjcm9sbC5pbml0aWFsXG4gICAgfSk7XG4gICAgcmV0dXJuIG1vdmVkO1xuICB9KTtcbn0pO1xuXG5jb25zdCB0aW1pbmdzS2V5ID0gJ1Byb2Nlc3NpbmcgZHluYW1pYyBjaGFuZ2VzJztcbnZhciBwdWJsaXNoV2hpbGVEcmFnZ2luZ0luVmlydHVhbCA9IChfcmVmID0+IHtcbiAgbGV0IHtcbiAgICBzdGF0ZSxcbiAgICBwdWJsaXNoZWRcbiAgfSA9IF9yZWY7XG4gIHN0YXJ0KHRpbWluZ3NLZXkpO1xuICBjb25zdCB3aXRoU2Nyb2xsQ2hhbmdlID0gcHVibGlzaGVkLm1vZGlmaWVkLm1hcCh1cGRhdGUgPT4ge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gc3RhdGUuZGltZW5zaW9ucy5kcm9wcGFibGVzW3VwZGF0ZS5kcm9wcGFibGVJZF07XG4gICAgY29uc3Qgc2Nyb2xsZWQgPSBzY3JvbGxEcm9wcGFibGUoZXhpc3RpbmcsIHVwZGF0ZS5zY3JvbGwpO1xuICAgIHJldHVybiBzY3JvbGxlZDtcbiAgfSk7XG4gIGNvbnN0IGRyb3BwYWJsZXMgPSB7IC4uLnN0YXRlLmRpbWVuc2lvbnMuZHJvcHBhYmxlcyxcbiAgICAuLi50b0Ryb3BwYWJsZU1hcCh3aXRoU2Nyb2xsQ2hhbmdlKVxuICB9O1xuICBjb25zdCB1cGRhdGVkQWRkaXRpb25zID0gdG9EcmFnZ2FibGVNYXAoYWRqdXN0QWRkaXRpb25zRm9yU2Nyb2xsQ2hhbmdlcyh7XG4gICAgYWRkaXRpb25zOiBwdWJsaXNoZWQuYWRkaXRpb25zLFxuICAgIHVwZGF0ZWREcm9wcGFibGVzOiBkcm9wcGFibGVzLFxuICAgIHZpZXdwb3J0OiBzdGF0ZS52aWV3cG9ydFxuICB9KSk7XG4gIGNvbnN0IGRyYWdnYWJsZXMgPSB7IC4uLnN0YXRlLmRpbWVuc2lvbnMuZHJhZ2dhYmxlcyxcbiAgICAuLi51cGRhdGVkQWRkaXRpb25zXG4gIH07XG4gIHB1Ymxpc2hlZC5yZW1vdmFscy5mb3JFYWNoKGlkID0+IHtcbiAgICBkZWxldGUgZHJhZ2dhYmxlc1tpZF07XG4gIH0pO1xuICBjb25zdCBkaW1lbnNpb25zID0ge1xuICAgIGRyb3BwYWJsZXMsXG4gICAgZHJhZ2dhYmxlc1xuICB9O1xuICBjb25zdCB3YXNPdmVySWQgPSB3aGF0SXNEcmFnZ2VkT3ZlcihzdGF0ZS5pbXBhY3QpO1xuICBjb25zdCB3YXNPdmVyID0gd2FzT3ZlcklkID8gZGltZW5zaW9ucy5kcm9wcGFibGVzW3dhc092ZXJJZF0gOiBudWxsO1xuICBjb25zdCBkcmFnZ2FibGUgPSBkaW1lbnNpb25zLmRyYWdnYWJsZXNbc3RhdGUuY3JpdGljYWwuZHJhZ2dhYmxlLmlkXTtcbiAgY29uc3QgaG9tZSA9IGRpbWVuc2lvbnMuZHJvcHBhYmxlc1tzdGF0ZS5jcml0aWNhbC5kcm9wcGFibGUuaWRdO1xuICBjb25zdCB7XG4gICAgaW1wYWN0OiBvbkxpZnRJbXBhY3QsXG4gICAgYWZ0ZXJDcml0aWNhbFxuICB9ID0gZ2V0TGlmdEVmZmVjdCh7XG4gICAgZHJhZ2dhYmxlLFxuICAgIGhvbWUsXG4gICAgZHJhZ2dhYmxlcyxcbiAgICB2aWV3cG9ydDogc3RhdGUudmlld3BvcnRcbiAgfSk7XG4gIGNvbnN0IHByZXZpb3VzSW1wYWN0ID0gd2FzT3ZlciAmJiB3YXNPdmVyLmlzQ29tYmluZUVuYWJsZWQgPyBzdGF0ZS5pbXBhY3QgOiBvbkxpZnRJbXBhY3Q7XG4gIGNvbnN0IGltcGFjdCA9IGdldERyYWdJbXBhY3Qoe1xuICAgIHBhZ2VPZmZzZXQ6IHN0YXRlLmN1cnJlbnQucGFnZS5vZmZzZXQsXG4gICAgZHJhZ2dhYmxlOiBkaW1lbnNpb25zLmRyYWdnYWJsZXNbc3RhdGUuY3JpdGljYWwuZHJhZ2dhYmxlLmlkXSxcbiAgICBkcmFnZ2FibGVzOiBkaW1lbnNpb25zLmRyYWdnYWJsZXMsXG4gICAgZHJvcHBhYmxlczogZGltZW5zaW9ucy5kcm9wcGFibGVzLFxuICAgIHByZXZpb3VzSW1wYWN0LFxuICAgIHZpZXdwb3J0OiBzdGF0ZS52aWV3cG9ydCxcbiAgICBhZnRlckNyaXRpY2FsXG4gIH0pO1xuICBmaW5pc2godGltaW5nc0tleSk7XG4gIGNvbnN0IGRyYWdnaW5nU3RhdGUgPSB7IC4uLnN0YXRlLFxuICAgIHBoYXNlOiAnRFJBR0dJTkcnLFxuICAgIGltcGFjdCxcbiAgICBvbkxpZnRJbXBhY3QsXG4gICAgZGltZW5zaW9ucyxcbiAgICBhZnRlckNyaXRpY2FsLFxuICAgIGZvcmNlU2hvdWxkQW5pbWF0ZTogZmFsc2VcbiAgfTtcblxuICBpZiAoc3RhdGUucGhhc2UgPT09ICdDT0xMRUNUSU5HJykge1xuICAgIHJldHVybiBkcmFnZ2luZ1N0YXRlO1xuICB9XG5cbiAgY29uc3QgZHJvcFBlbmRpbmcgPSB7IC4uLmRyYWdnaW5nU3RhdGUsXG4gICAgcGhhc2U6ICdEUk9QX1BFTkRJTkcnLFxuICAgIHJlYXNvbjogc3RhdGUucmVhc29uLFxuICAgIGlzV2FpdGluZzogZmFsc2VcbiAgfTtcbiAgcmV0dXJuIGRyb3BQZW5kaW5nO1xufSk7XG5cbmNvbnN0IGlzU25hcHBpbmcgPSBzdGF0ZSA9PiBzdGF0ZS5tb3ZlbWVudE1vZGUgPT09ICdTTkFQJztcblxuY29uc3QgcG9zdERyb3BwYWJsZUNoYW5nZSA9IChzdGF0ZSwgdXBkYXRlZCwgaXNFbmFibGVkQ2hhbmdpbmcpID0+IHtcbiAgY29uc3QgZGltZW5zaW9ucyA9IHBhdGNoRGltZW5zaW9uTWFwKHN0YXRlLmRpbWVuc2lvbnMsIHVwZGF0ZWQpO1xuXG4gIGlmICghaXNTbmFwcGluZyhzdGF0ZSkgfHwgaXNFbmFibGVkQ2hhbmdpbmcpIHtcbiAgICByZXR1cm4gdXBkYXRlKHtcbiAgICAgIHN0YXRlLFxuICAgICAgZGltZW5zaW9uc1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHJlZnJlc2hTbmFwKHtcbiAgICBzdGF0ZSxcbiAgICBkaW1lbnNpb25zXG4gIH0pO1xufTtcblxuZnVuY3Rpb24gcmVtb3ZlU2Nyb2xsSnVtcFJlcXVlc3Qoc3RhdGUpIHtcbiAgaWYgKHN0YXRlLmlzRHJhZ2dpbmcgJiYgc3RhdGUubW92ZW1lbnRNb2RlID09PSAnU05BUCcpIHtcbiAgICByZXR1cm4geyAuLi5zdGF0ZSxcbiAgICAgIHNjcm9sbEp1bXBSZXF1ZXN0OiBudWxsXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBzdGF0ZTtcbn1cblxuY29uc3QgaWRsZSQyID0ge1xuICBwaGFzZTogJ0lETEUnLFxuICBjb21wbGV0ZWQ6IG51bGwsXG4gIHNob3VsZEZsdXNoOiBmYWxzZVxufTtcbnZhciByZWR1Y2VyID0gKGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uKSB7XG4gIGlmIChzdGF0ZSA9PT0gdm9pZCAwKSB7XG4gICAgc3RhdGUgPSBpZGxlJDI7XG4gIH1cblxuICBpZiAoYWN0aW9uLnR5cGUgPT09ICdGTFVTSCcpIHtcbiAgICByZXR1cm4geyAuLi5pZGxlJDIsXG4gICAgICBzaG91bGRGbHVzaDogdHJ1ZVxuICAgIH07XG4gIH1cblxuICBpZiAoYWN0aW9uLnR5cGUgPT09ICdJTklUSUFMX1BVQkxJU0gnKSB7XG4gICAgIShzdGF0ZS5waGFzZSA9PT0gJ0lETEUnKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IGludmFyaWFudChmYWxzZSwgJ0lOSVRJQUxfUFVCTElTSCBtdXN0IGNvbWUgYWZ0ZXIgYSBJRExFIHBoYXNlJykgOiBpbnZhcmlhbnQoZmFsc2UpIDogdm9pZCAwO1xuICAgIGNvbnN0IHtcbiAgICAgIGNyaXRpY2FsLFxuICAgICAgY2xpZW50U2VsZWN0aW9uLFxuICAgICAgdmlld3BvcnQsXG4gICAgICBkaW1lbnNpb25zLFxuICAgICAgbW92ZW1lbnRNb2RlXG4gICAgfSA9IGFjdGlvbi5wYXlsb2FkO1xuICAgIGNvbnN0IGRyYWdnYWJsZSA9IGRpbWVuc2lvbnMuZHJhZ2dhYmxlc1tjcml0aWNhbC5kcmFnZ2FibGUuaWRdO1xuICAgIGNvbnN0IGhvbWUgPSBkaW1lbnNpb25zLmRyb3BwYWJsZXNbY3JpdGljYWwuZHJvcHBhYmxlLmlkXTtcbiAgICBjb25zdCBjbGllbnQgPSB7XG4gICAgICBzZWxlY3Rpb246IGNsaWVudFNlbGVjdGlvbixcbiAgICAgIGJvcmRlckJveENlbnRlcjogZHJhZ2dhYmxlLmNsaWVudC5ib3JkZXJCb3guY2VudGVyLFxuICAgICAgb2Zmc2V0OiBvcmlnaW5cbiAgICB9O1xuICAgIGNvbnN0IGluaXRpYWwgPSB7XG4gICAgICBjbGllbnQsXG4gICAgICBwYWdlOiB7XG4gICAgICAgIHNlbGVjdGlvbjogYWRkKGNsaWVudC5zZWxlY3Rpb24sIHZpZXdwb3J0LnNjcm9sbC5pbml0aWFsKSxcbiAgICAgICAgYm9yZGVyQm94Q2VudGVyOiBhZGQoY2xpZW50LnNlbGVjdGlvbiwgdmlld3BvcnQuc2Nyb2xsLmluaXRpYWwpLFxuICAgICAgICBvZmZzZXQ6IGFkZChjbGllbnQuc2VsZWN0aW9uLCB2aWV3cG9ydC5zY3JvbGwuZGlmZi52YWx1ZSlcbiAgICAgIH1cbiAgICB9O1xuICAgIGNvbnN0IGlzV2luZG93U2Nyb2xsQWxsb3dlZCA9IHRvRHJvcHBhYmxlTGlzdChkaW1lbnNpb25zLmRyb3BwYWJsZXMpLmV2ZXJ5KGl0ZW0gPT4gIWl0ZW0uaXNGaXhlZE9uUGFnZSk7XG4gICAgY29uc3Qge1xuICAgICAgaW1wYWN0LFxuICAgICAgYWZ0ZXJDcml0aWNhbFxuICAgIH0gPSBnZXRMaWZ0RWZmZWN0KHtcbiAgICAgIGRyYWdnYWJsZSxcbiAgICAgIGhvbWUsXG4gICAgICBkcmFnZ2FibGVzOiBkaW1lbnNpb25zLmRyYWdnYWJsZXMsXG4gICAgICB2aWV3cG9ydFxuICAgIH0pO1xuICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgIHBoYXNlOiAnRFJBR0dJTkcnLFxuICAgICAgaXNEcmFnZ2luZzogdHJ1ZSxcbiAgICAgIGNyaXRpY2FsLFxuICAgICAgbW92ZW1lbnRNb2RlLFxuICAgICAgZGltZW5zaW9ucyxcbiAgICAgIGluaXRpYWwsXG4gICAgICBjdXJyZW50OiBpbml0aWFsLFxuICAgICAgaXNXaW5kb3dTY3JvbGxBbGxvd2VkLFxuICAgICAgaW1wYWN0LFxuICAgICAgYWZ0ZXJDcml0aWNhbCxcbiAgICAgIG9uTGlmdEltcGFjdDogaW1wYWN0LFxuICAgICAgdmlld3BvcnQsXG4gICAgICBzY3JvbGxKdW1wUmVxdWVzdDogbnVsbCxcbiAgICAgIGZvcmNlU2hvdWxkQW5pbWF0ZTogbnVsbFxuICAgIH07XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGlmIChhY3Rpb24udHlwZSA9PT0gJ0NPTExFQ1RJT05fU1RBUlRJTkcnKSB7XG4gICAgaWYgKHN0YXRlLnBoYXNlID09PSAnQ09MTEVDVElORycgfHwgc3RhdGUucGhhc2UgPT09ICdEUk9QX1BFTkRJTkcnKSB7XG4gICAgICByZXR1cm4gc3RhdGU7XG4gICAgfVxuXG4gICAgIShzdGF0ZS5waGFzZSA9PT0gJ0RSQUdHSU5HJykgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBpbnZhcmlhbnQoZmFsc2UsIGBDb2xsZWN0aW9uIGNhbm5vdCBzdGFydCBmcm9tIHBoYXNlICR7c3RhdGUucGhhc2V9YCkgOiBpbnZhcmlhbnQoZmFsc2UpIDogdm9pZCAwO1xuICAgIGNvbnN0IHJlc3VsdCA9IHsgLi4uc3RhdGUsXG4gICAgICBwaGFzZTogJ0NPTExFQ1RJTkcnXG4gICAgfTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgaWYgKGFjdGlvbi50eXBlID09PSAnUFVCTElTSF9XSElMRV9EUkFHR0lORycpIHtcbiAgICAhKHN0YXRlLnBoYXNlID09PSAnQ09MTEVDVElORycgfHwgc3RhdGUucGhhc2UgPT09ICdEUk9QX1BFTkRJTkcnKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IGludmFyaWFudChmYWxzZSwgYFVuZXhwZWN0ZWQgJHthY3Rpb24udHlwZX0gcmVjZWl2ZWQgaW4gcGhhc2UgJHtzdGF0ZS5waGFzZX1gKSA6IGludmFyaWFudChmYWxzZSkgOiB2b2lkIDA7XG4gICAgcmV0dXJuIHB1Ymxpc2hXaGlsZURyYWdnaW5nSW5WaXJ0dWFsKHtcbiAgICAgIHN0YXRlLFxuICAgICAgcHVibGlzaGVkOiBhY3Rpb24ucGF5bG9hZFxuICAgIH0pO1xuICB9XG5cbiAgaWYgKGFjdGlvbi50eXBlID09PSAnTU9WRScpIHtcbiAgICBpZiAoc3RhdGUucGhhc2UgPT09ICdEUk9QX1BFTkRJTkcnKSB7XG4gICAgICByZXR1cm4gc3RhdGU7XG4gICAgfVxuXG4gICAgIWlzTW92ZW1lbnRBbGxvd2VkKHN0YXRlKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IGludmFyaWFudChmYWxzZSwgYCR7YWN0aW9uLnR5cGV9IG5vdCBwZXJtaXR0ZWQgaW4gcGhhc2UgJHtzdGF0ZS5waGFzZX1gKSA6IGludmFyaWFudChmYWxzZSkgOiB2b2lkIDA7XG4gICAgY29uc3Qge1xuICAgICAgY2xpZW50OiBjbGllbnRTZWxlY3Rpb25cbiAgICB9ID0gYWN0aW9uLnBheWxvYWQ7XG5cbiAgICBpZiAoaXNFcXVhbCQxKGNsaWVudFNlbGVjdGlvbiwgc3RhdGUuY3VycmVudC5jbGllbnQuc2VsZWN0aW9uKSkge1xuICAgICAgcmV0dXJuIHN0YXRlO1xuICAgIH1cblxuICAgIHJldHVybiB1cGRhdGUoe1xuICAgICAgc3RhdGUsXG4gICAgICBjbGllbnRTZWxlY3Rpb24sXG4gICAgICBpbXBhY3Q6IGlzU25hcHBpbmcoc3RhdGUpID8gc3RhdGUuaW1wYWN0IDogbnVsbFxuICAgIH0pO1xuICB9XG5cbiAgaWYgKGFjdGlvbi50eXBlID09PSAnVVBEQVRFX0RST1BQQUJMRV9TQ1JPTEwnKSB7XG4gICAgaWYgKHN0YXRlLnBoYXNlID09PSAnRFJPUF9QRU5ESU5HJykge1xuICAgICAgcmV0dXJuIHJlbW92ZVNjcm9sbEp1bXBSZXF1ZXN0KHN0YXRlKTtcbiAgICB9XG5cbiAgICBpZiAoc3RhdGUucGhhc2UgPT09ICdDT0xMRUNUSU5HJykge1xuICAgICAgcmV0dXJuIHJlbW92ZVNjcm9sbEp1bXBSZXF1ZXN0KHN0YXRlKTtcbiAgICB9XG5cbiAgICAhaXNNb3ZlbWVudEFsbG93ZWQoc3RhdGUpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gaW52YXJpYW50KGZhbHNlLCBgJHthY3Rpb24udHlwZX0gbm90IHBlcm1pdHRlZCBpbiBwaGFzZSAke3N0YXRlLnBoYXNlfWApIDogaW52YXJpYW50KGZhbHNlKSA6IHZvaWQgMDtcbiAgICBjb25zdCB7XG4gICAgICBpZCxcbiAgICAgIG5ld1Njcm9sbFxuICAgIH0gPSBhY3Rpb24ucGF5bG9hZDtcbiAgICBjb25zdCB0YXJnZXQgPSBzdGF0ZS5kaW1lbnNpb25zLmRyb3BwYWJsZXNbaWRdO1xuXG4gICAgaWYgKCF0YXJnZXQpIHtcbiAgICAgIHJldHVybiBzdGF0ZTtcbiAgICB9XG5cbiAgICBjb25zdCBzY3JvbGxlZCA9IHNjcm9sbERyb3BwYWJsZSh0YXJnZXQsIG5ld1Njcm9sbCk7XG4gICAgcmV0dXJuIHBvc3REcm9wcGFibGVDaGFuZ2Uoc3RhdGUsIHNjcm9sbGVkLCBmYWxzZSk7XG4gIH1cblxuICBpZiAoYWN0aW9uLnR5cGUgPT09ICdVUERBVEVfRFJPUFBBQkxFX0lTX0VOQUJMRUQnKSB7XG4gICAgaWYgKHN0YXRlLnBoYXNlID09PSAnRFJPUF9QRU5ESU5HJykge1xuICAgICAgcmV0dXJuIHN0YXRlO1xuICAgIH1cblxuICAgICFpc01vdmVtZW50QWxsb3dlZChzdGF0ZSkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBpbnZhcmlhbnQoZmFsc2UsIGBBdHRlbXB0aW5nIHRvIG1vdmUgaW4gYW4gdW5zdXBwb3J0ZWQgcGhhc2UgJHtzdGF0ZS5waGFzZX1gKSA6IGludmFyaWFudChmYWxzZSkgOiB2b2lkIDA7XG4gICAgY29uc3Qge1xuICAgICAgaWQsXG4gICAgICBpc0VuYWJsZWRcbiAgICB9ID0gYWN0aW9uLnBheWxvYWQ7XG4gICAgY29uc3QgdGFyZ2V0ID0gc3RhdGUuZGltZW5zaW9ucy5kcm9wcGFibGVzW2lkXTtcbiAgICAhdGFyZ2V0ID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gaW52YXJpYW50KGZhbHNlLCBgQ2Fubm90IGZpbmQgRHJvcHBhYmxlW2lkOiAke2lkfV0gdG8gdG9nZ2xlIGl0cyBlbmFibGVkIHN0YXRlYCkgOiBpbnZhcmlhbnQoZmFsc2UpIDogdm9pZCAwO1xuICAgICEodGFyZ2V0LmlzRW5hYmxlZCAhPT0gaXNFbmFibGVkKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IGludmFyaWFudChmYWxzZSwgYFRyeWluZyB0byBzZXQgZHJvcHBhYmxlIGlzRW5hYmxlZCB0byAke1N0cmluZyhpc0VuYWJsZWQpfVxuICAgICAgYnV0IGl0IGlzIGFscmVhZHkgJHtTdHJpbmcodGFyZ2V0LmlzRW5hYmxlZCl9YCkgOiBpbnZhcmlhbnQoZmFsc2UpIDogdm9pZCAwO1xuICAgIGNvbnN0IHVwZGF0ZWQgPSB7IC4uLnRhcmdldCxcbiAgICAgIGlzRW5hYmxlZFxuICAgIH07XG4gICAgcmV0dXJuIHBvc3REcm9wcGFibGVDaGFuZ2Uoc3RhdGUsIHVwZGF0ZWQsIHRydWUpO1xuICB9XG5cbiAgaWYgKGFjdGlvbi50eXBlID09PSAnVVBEQVRFX0RST1BQQUJMRV9JU19DT01CSU5FX0VOQUJMRUQnKSB7XG4gICAgaWYgKHN0YXRlLnBoYXNlID09PSAnRFJPUF9QRU5ESU5HJykge1xuICAgICAgcmV0dXJuIHN0YXRlO1xuICAgIH1cblxuICAgICFpc01vdmVtZW50QWxsb3dlZChzdGF0ZSkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBpbnZhcmlhbnQoZmFsc2UsIGBBdHRlbXB0aW5nIHRvIG1vdmUgaW4gYW4gdW5zdXBwb3J0ZWQgcGhhc2UgJHtzdGF0ZS5waGFzZX1gKSA6IGludmFyaWFudChmYWxzZSkgOiB2b2lkIDA7XG4gICAgY29uc3Qge1xuICAgICAgaWQsXG4gICAgICBpc0NvbWJpbmVFbmFibGVkXG4gICAgfSA9IGFjdGlvbi5wYXlsb2FkO1xuICAgIGNvbnN0IHRhcmdldCA9IHN0YXRlLmRpbWVuc2lvbnMuZHJvcHBhYmxlc1tpZF07XG4gICAgIXRhcmdldCA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IGludmFyaWFudChmYWxzZSwgYENhbm5vdCBmaW5kIERyb3BwYWJsZVtpZDogJHtpZH1dIHRvIHRvZ2dsZSBpdHMgaXNDb21iaW5lRW5hYmxlZCBzdGF0ZWApIDogaW52YXJpYW50KGZhbHNlKSA6IHZvaWQgMDtcbiAgICAhKHRhcmdldC5pc0NvbWJpbmVFbmFibGVkICE9PSBpc0NvbWJpbmVFbmFibGVkKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IGludmFyaWFudChmYWxzZSwgYFRyeWluZyB0byBzZXQgZHJvcHBhYmxlIGlzQ29tYmluZUVuYWJsZWQgdG8gJHtTdHJpbmcoaXNDb21iaW5lRW5hYmxlZCl9XG4gICAgICBidXQgaXQgaXMgYWxyZWFkeSAke1N0cmluZyh0YXJnZXQuaXNDb21iaW5lRW5hYmxlZCl9YCkgOiBpbnZhcmlhbnQoZmFsc2UpIDogdm9pZCAwO1xuICAgIGNvbnN0IHVwZGF0ZWQgPSB7IC4uLnRhcmdldCxcbiAgICAgIGlzQ29tYmluZUVuYWJsZWRcbiAgICB9O1xuICAgIHJldHVybiBwb3N0RHJvcHBhYmxlQ2hhbmdlKHN0YXRlLCB1cGRhdGVkLCB0cnVlKTtcbiAgfVxuXG4gIGlmIChhY3Rpb24udHlwZSA9PT0gJ01PVkVfQllfV0lORE9XX1NDUk9MTCcpIHtcbiAgICBpZiAoc3RhdGUucGhhc2UgPT09ICdEUk9QX1BFTkRJTkcnIHx8IHN0YXRlLnBoYXNlID09PSAnRFJPUF9BTklNQVRJTkcnKSB7XG4gICAgICByZXR1cm4gc3RhdGU7XG4gICAgfVxuXG4gICAgIWlzTW92ZW1lbnRBbGxvd2VkKHN0YXRlKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IGludmFyaWFudChmYWxzZSwgYENhbm5vdCBtb3ZlIGJ5IHdpbmRvdyBpbiBwaGFzZSAke3N0YXRlLnBoYXNlfWApIDogaW52YXJpYW50KGZhbHNlKSA6IHZvaWQgMDtcbiAgICAhc3RhdGUuaXNXaW5kb3dTY3JvbGxBbGxvd2VkID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gaW52YXJpYW50KGZhbHNlLCAnV2luZG93IHNjcm9sbGluZyBpcyBjdXJyZW50bHkgbm90IHN1cHBvcnRlZCBmb3IgZml4ZWQgbGlzdHMnKSA6IGludmFyaWFudChmYWxzZSkgOiB2b2lkIDA7XG4gICAgY29uc3QgbmV3U2Nyb2xsID0gYWN0aW9uLnBheWxvYWQubmV3U2Nyb2xsO1xuXG4gICAgaWYgKGlzRXF1YWwkMShzdGF0ZS52aWV3cG9ydC5zY3JvbGwuY3VycmVudCwgbmV3U2Nyb2xsKSkge1xuICAgICAgcmV0dXJuIHJlbW92ZVNjcm9sbEp1bXBSZXF1ZXN0KHN0YXRlKTtcbiAgICB9XG5cbiAgICBjb25zdCB2aWV3cG9ydCA9IHNjcm9sbFZpZXdwb3J0KHN0YXRlLnZpZXdwb3J0LCBuZXdTY3JvbGwpO1xuXG4gICAgaWYgKGlzU25hcHBpbmcoc3RhdGUpKSB7XG4gICAgICByZXR1cm4gcmVmcmVzaFNuYXAoe1xuICAgICAgICBzdGF0ZSxcbiAgICAgICAgdmlld3BvcnRcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB1cGRhdGUoe1xuICAgICAgc3RhdGUsXG4gICAgICB2aWV3cG9ydFxuICAgIH0pO1xuICB9XG5cbiAgaWYgKGFjdGlvbi50eXBlID09PSAnVVBEQVRFX1ZJRVdQT1JUX01BWF9TQ1JPTEwnKSB7XG4gICAgaWYgKCFpc01vdmVtZW50QWxsb3dlZChzdGF0ZSkpIHtcbiAgICAgIHJldHVybiBzdGF0ZTtcbiAgICB9XG5cbiAgICBjb25zdCBtYXhTY3JvbGwgPSBhY3Rpb24ucGF5bG9hZC5tYXhTY3JvbGw7XG5cbiAgICBpZiAoaXNFcXVhbCQxKG1heFNjcm9sbCwgc3RhdGUudmlld3BvcnQuc2Nyb2xsLm1heCkpIHtcbiAgICAgIHJldHVybiBzdGF0ZTtcbiAgICB9XG5cbiAgICBjb25zdCB3aXRoTWF4U2Nyb2xsID0geyAuLi5zdGF0ZS52aWV3cG9ydCxcbiAgICAgIHNjcm9sbDogeyAuLi5zdGF0ZS52aWV3cG9ydC5zY3JvbGwsXG4gICAgICAgIG1heDogbWF4U2Nyb2xsXG4gICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4geyAuLi5zdGF0ZSxcbiAgICAgIHZpZXdwb3J0OiB3aXRoTWF4U2Nyb2xsXG4gICAgfTtcbiAgfVxuXG4gIGlmIChhY3Rpb24udHlwZSA9PT0gJ01PVkVfVVAnIHx8IGFjdGlvbi50eXBlID09PSAnTU9WRV9ET1dOJyB8fCBhY3Rpb24udHlwZSA9PT0gJ01PVkVfTEVGVCcgfHwgYWN0aW9uLnR5cGUgPT09ICdNT1ZFX1JJR0hUJykge1xuICAgIGlmIChzdGF0ZS5waGFzZSA9PT0gJ0NPTExFQ1RJTkcnIHx8IHN0YXRlLnBoYXNlID09PSAnRFJPUF9QRU5ESU5HJykge1xuICAgICAgcmV0dXJuIHN0YXRlO1xuICAgIH1cblxuICAgICEoc3RhdGUucGhhc2UgPT09ICdEUkFHR0lORycpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gaW52YXJpYW50KGZhbHNlLCBgJHthY3Rpb24udHlwZX0gcmVjZWl2ZWQgd2hpbGUgbm90IGluIERSQUdHSU5HIHBoYXNlYCkgOiBpbnZhcmlhbnQoZmFsc2UpIDogdm9pZCAwO1xuICAgIGNvbnN0IHJlc3VsdCA9IG1vdmVJbkRpcmVjdGlvbih7XG4gICAgICBzdGF0ZSxcbiAgICAgIHR5cGU6IGFjdGlvbi50eXBlXG4gICAgfSk7XG5cbiAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgcmV0dXJuIHN0YXRlO1xuICAgIH1cblxuICAgIHJldHVybiB1cGRhdGUoe1xuICAgICAgc3RhdGUsXG4gICAgICBpbXBhY3Q6IHJlc3VsdC5pbXBhY3QsXG4gICAgICBjbGllbnRTZWxlY3Rpb246IHJlc3VsdC5jbGllbnRTZWxlY3Rpb24sXG4gICAgICBzY3JvbGxKdW1wUmVxdWVzdDogcmVzdWx0LnNjcm9sbEp1bXBSZXF1ZXN0XG4gICAgfSk7XG4gIH1cblxuICBpZiAoYWN0aW9uLnR5cGUgPT09ICdEUk9QX1BFTkRJTkcnKSB7XG4gICAgY29uc3QgcmVhc29uID0gYWN0aW9uLnBheWxvYWQucmVhc29uO1xuICAgICEoc3RhdGUucGhhc2UgPT09ICdDT0xMRUNUSU5HJykgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBpbnZhcmlhbnQoZmFsc2UsICdDYW4gb25seSBtb3ZlIGludG8gdGhlIERST1BfUEVORElORyBwaGFzZSBmcm9tIHRoZSBDT0xMRUNUSU5HIHBoYXNlJykgOiBpbnZhcmlhbnQoZmFsc2UpIDogdm9pZCAwO1xuICAgIGNvbnN0IG5ld1N0YXRlID0geyAuLi5zdGF0ZSxcbiAgICAgIHBoYXNlOiAnRFJPUF9QRU5ESU5HJyxcbiAgICAgIGlzV2FpdGluZzogdHJ1ZSxcbiAgICAgIHJlYXNvblxuICAgIH07XG4gICAgcmV0dXJuIG5ld1N0YXRlO1xuICB9XG5cbiAgaWYgKGFjdGlvbi50eXBlID09PSAnRFJPUF9BTklNQVRFJykge1xuICAgIGNvbnN0IHtcbiAgICAgIGNvbXBsZXRlZCxcbiAgICAgIGRyb3BEdXJhdGlvbixcbiAgICAgIG5ld0hvbWVDbGllbnRPZmZzZXRcbiAgICB9ID0gYWN0aW9uLnBheWxvYWQ7XG4gICAgIShzdGF0ZS5waGFzZSA9PT0gJ0RSQUdHSU5HJyB8fCBzdGF0ZS5waGFzZSA9PT0gJ0RST1BfUEVORElORycpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gaW52YXJpYW50KGZhbHNlLCBgQ2Fubm90IGFuaW1hdGUgZHJvcCBmcm9tIHBoYXNlICR7c3RhdGUucGhhc2V9YCkgOiBpbnZhcmlhbnQoZmFsc2UpIDogdm9pZCAwO1xuICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgIHBoYXNlOiAnRFJPUF9BTklNQVRJTkcnLFxuICAgICAgY29tcGxldGVkLFxuICAgICAgZHJvcER1cmF0aW9uLFxuICAgICAgbmV3SG9tZUNsaWVudE9mZnNldCxcbiAgICAgIGRpbWVuc2lvbnM6IHN0YXRlLmRpbWVuc2lvbnNcbiAgICB9O1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBpZiAoYWN0aW9uLnR5cGUgPT09ICdEUk9QX0NPTVBMRVRFJykge1xuICAgIGNvbnN0IHtcbiAgICAgIGNvbXBsZXRlZFxuICAgIH0gPSBhY3Rpb24ucGF5bG9hZDtcbiAgICByZXR1cm4ge1xuICAgICAgcGhhc2U6ICdJRExFJyxcbiAgICAgIGNvbXBsZXRlZCxcbiAgICAgIHNob3VsZEZsdXNoOiBmYWxzZVxuICAgIH07XG4gIH1cblxuICByZXR1cm4gc3RhdGU7XG59KTtcblxuY29uc3QgYmVmb3JlSW5pdGlhbENhcHR1cmUgPSBhcmdzID0+ICh7XG4gIHR5cGU6ICdCRUZPUkVfSU5JVElBTF9DQVBUVVJFJyxcbiAgcGF5bG9hZDogYXJnc1xufSk7XG5jb25zdCBsaWZ0JDEgPSBhcmdzID0+ICh7XG4gIHR5cGU6ICdMSUZUJyxcbiAgcGF5bG9hZDogYXJnc1xufSk7XG5jb25zdCBpbml0aWFsUHVibGlzaCA9IGFyZ3MgPT4gKHtcbiAgdHlwZTogJ0lOSVRJQUxfUFVCTElTSCcsXG4gIHBheWxvYWQ6IGFyZ3Ncbn0pO1xuY29uc3QgcHVibGlzaFdoaWxlRHJhZ2dpbmcgPSBhcmdzID0+ICh7XG4gIHR5cGU6ICdQVUJMSVNIX1dISUxFX0RSQUdHSU5HJyxcbiAgcGF5bG9hZDogYXJnc1xufSk7XG5jb25zdCBjb2xsZWN0aW9uU3RhcnRpbmcgPSAoKSA9PiAoe1xuICB0eXBlOiAnQ09MTEVDVElPTl9TVEFSVElORycsXG4gIHBheWxvYWQ6IG51bGxcbn0pO1xuY29uc3QgdXBkYXRlRHJvcHBhYmxlU2Nyb2xsID0gYXJncyA9PiAoe1xuICB0eXBlOiAnVVBEQVRFX0RST1BQQUJMRV9TQ1JPTEwnLFxuICBwYXlsb2FkOiBhcmdzXG59KTtcbmNvbnN0IHVwZGF0ZURyb3BwYWJsZUlzRW5hYmxlZCA9IGFyZ3MgPT4gKHtcbiAgdHlwZTogJ1VQREFURV9EUk9QUEFCTEVfSVNfRU5BQkxFRCcsXG4gIHBheWxvYWQ6IGFyZ3Ncbn0pO1xuY29uc3QgdXBkYXRlRHJvcHBhYmxlSXNDb21iaW5lRW5hYmxlZCA9IGFyZ3MgPT4gKHtcbiAgdHlwZTogJ1VQREFURV9EUk9QUEFCTEVfSVNfQ09NQklORV9FTkFCTEVEJyxcbiAgcGF5bG9hZDogYXJnc1xufSk7XG5jb25zdCBtb3ZlID0gYXJncyA9PiAoe1xuICB0eXBlOiAnTU9WRScsXG4gIHBheWxvYWQ6IGFyZ3Ncbn0pO1xuY29uc3QgbW92ZUJ5V2luZG93U2Nyb2xsID0gYXJncyA9PiAoe1xuICB0eXBlOiAnTU9WRV9CWV9XSU5ET1dfU0NST0xMJyxcbiAgcGF5bG9hZDogYXJnc1xufSk7XG5jb25zdCB1cGRhdGVWaWV3cG9ydE1heFNjcm9sbCA9IGFyZ3MgPT4gKHtcbiAgdHlwZTogJ1VQREFURV9WSUVXUE9SVF9NQVhfU0NST0xMJyxcbiAgcGF5bG9hZDogYXJnc1xufSk7XG5jb25zdCBtb3ZlVXAgPSAoKSA9PiAoe1xuICB0eXBlOiAnTU9WRV9VUCcsXG4gIHBheWxvYWQ6IG51bGxcbn0pO1xuY29uc3QgbW92ZURvd24gPSAoKSA9PiAoe1xuICB0eXBlOiAnTU9WRV9ET1dOJyxcbiAgcGF5bG9hZDogbnVsbFxufSk7XG5jb25zdCBtb3ZlUmlnaHQgPSAoKSA9PiAoe1xuICB0eXBlOiAnTU9WRV9SSUdIVCcsXG4gIHBheWxvYWQ6IG51bGxcbn0pO1xuY29uc3QgbW92ZUxlZnQgPSAoKSA9PiAoe1xuICB0eXBlOiAnTU9WRV9MRUZUJyxcbiAgcGF5bG9hZDogbnVsbFxufSk7XG5jb25zdCBmbHVzaCA9ICgpID0+ICh7XG4gIHR5cGU6ICdGTFVTSCcsXG4gIHBheWxvYWQ6IG51bGxcbn0pO1xuY29uc3QgYW5pbWF0ZURyb3AgPSBhcmdzID0+ICh7XG4gIHR5cGU6ICdEUk9QX0FOSU1BVEUnLFxuICBwYXlsb2FkOiBhcmdzXG59KTtcbmNvbnN0IGNvbXBsZXRlRHJvcCA9IGFyZ3MgPT4gKHtcbiAgdHlwZTogJ0RST1BfQ09NUExFVEUnLFxuICBwYXlsb2FkOiBhcmdzXG59KTtcbmNvbnN0IGRyb3AkMSA9IGFyZ3MgPT4gKHtcbiAgdHlwZTogJ0RST1AnLFxuICBwYXlsb2FkOiBhcmdzXG59KTtcbmNvbnN0IGRyb3BQZW5kaW5nID0gYXJncyA9PiAoe1xuICB0eXBlOiAnRFJPUF9QRU5ESU5HJyxcbiAgcGF5bG9hZDogYXJnc1xufSk7XG5jb25zdCBkcm9wQW5pbWF0aW9uRmluaXNoZWQgPSAoKSA9PiAoe1xuICB0eXBlOiAnRFJPUF9BTklNQVRJT05fRklOSVNIRUQnLFxuICBwYXlsb2FkOiBudWxsXG59KTtcblxuZnVuY3Rpb24gY2hlY2tJbmRleGVzKGluc2lkZURlc3RpbmF0aW9uKSB7XG4gIGlmIChpbnNpZGVEZXN0aW5hdGlvbi5sZW5ndGggPD0gMSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGluZGV4ZXMgPSBpbnNpZGVEZXN0aW5hdGlvbi5tYXAoZCA9PiBkLmRlc2NyaXB0b3IuaW5kZXgpO1xuICBjb25zdCBlcnJvcnMgPSB7fTtcblxuICBmb3IgKGxldCBpID0gMTsgaSA8IGluZGV4ZXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBjdXJyZW50ID0gaW5kZXhlc1tpXTtcbiAgICBjb25zdCBwcmV2aW91cyA9IGluZGV4ZXNbaSAtIDFdO1xuXG4gICAgaWYgKGN1cnJlbnQgIT09IHByZXZpb3VzICsgMSkge1xuICAgICAgZXJyb3JzW2N1cnJlbnRdID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBpZiAoIU9iamVjdC5rZXlzKGVycm9ycykubGVuZ3RoKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgZm9ybWF0dGVkID0gaW5kZXhlcy5tYXAoaW5kZXggPT4ge1xuICAgIGNvbnN0IGhhc0Vycm9yID0gQm9vbGVhbihlcnJvcnNbaW5kZXhdKTtcbiAgICByZXR1cm4gaGFzRXJyb3IgPyBgW/CflKUke2luZGV4fV1gIDogYCR7aW5kZXh9YDtcbiAgfSkuam9pbignLCAnKTtcbiAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gd2FybmluZyhgXG4gICAgRGV0ZWN0ZWQgbm9uLWNvbnNlY3V0aXZlIDxEcmFnZ2FibGUgLz4gaW5kZXhlcy5cblxuICAgIChUaGlzIGNhbiBjYXVzZSB1bmV4cGVjdGVkIGJ1Z3MpXG5cbiAgICAke2Zvcm1hdHRlZH1cbiAgYCkgOiB2b2lkIDA7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlRGltZW5zaW9ucyhjcml0aWNhbCwgZGltZW5zaW9ucykge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGNvbnN0IGluc2lkZURlc3RpbmF0aW9uID0gZ2V0RHJhZ2dhYmxlc0luc2lkZURyb3BwYWJsZShjcml0aWNhbC5kcm9wcGFibGUuaWQsIGRpbWVuc2lvbnMuZHJhZ2dhYmxlcyk7XG4gICAgY2hlY2tJbmRleGVzKGluc2lkZURlc3RpbmF0aW9uKTtcbiAgfVxufVxuXG52YXIgbGlmdCA9IChtYXJzaGFsID0+IF9yZWYgPT4ge1xuICBsZXQge1xuICAgIGdldFN0YXRlLFxuICAgIGRpc3BhdGNoXG4gIH0gPSBfcmVmO1xuICByZXR1cm4gbmV4dCA9PiBhY3Rpb24gPT4ge1xuICAgIGlmIChhY3Rpb24udHlwZSAhPT0gJ0xJRlQnKSB7XG4gICAgICBuZXh0KGFjdGlvbik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qge1xuICAgICAgaWQsXG4gICAgICBjbGllbnRTZWxlY3Rpb24sXG4gICAgICBtb3ZlbWVudE1vZGVcbiAgICB9ID0gYWN0aW9uLnBheWxvYWQ7XG4gICAgY29uc3QgaW5pdGlhbCA9IGdldFN0YXRlKCk7XG5cbiAgICBpZiAoaW5pdGlhbC5waGFzZSA9PT0gJ0RST1BfQU5JTUFUSU5HJykge1xuICAgICAgZGlzcGF0Y2goY29tcGxldGVEcm9wKHtcbiAgICAgICAgY29tcGxldGVkOiBpbml0aWFsLmNvbXBsZXRlZFxuICAgICAgfSkpO1xuICAgIH1cblxuICAgICEoZ2V0U3RhdGUoKS5waGFzZSA9PT0gJ0lETEUnKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IGludmFyaWFudChmYWxzZSwgJ1VuZXhwZWN0ZWQgcGhhc2UgdG8gc3RhcnQgYSBkcmFnJykgOiBpbnZhcmlhbnQoZmFsc2UpIDogdm9pZCAwO1xuICAgIGRpc3BhdGNoKGZsdXNoKCkpO1xuICAgIGRpc3BhdGNoKGJlZm9yZUluaXRpYWxDYXB0dXJlKHtcbiAgICAgIGRyYWdnYWJsZUlkOiBpZCxcbiAgICAgIG1vdmVtZW50TW9kZVxuICAgIH0pKTtcbiAgICBjb25zdCBzY3JvbGxPcHRpb25zID0ge1xuICAgICAgc2hvdWxkUHVibGlzaEltbWVkaWF0ZWx5OiBtb3ZlbWVudE1vZGUgPT09ICdTTkFQJ1xuICAgIH07XG4gICAgY29uc3QgcmVxdWVzdCA9IHtcbiAgICAgIGRyYWdnYWJsZUlkOiBpZCxcbiAgICAgIHNjcm9sbE9wdGlvbnNcbiAgICB9O1xuICAgIGNvbnN0IHtcbiAgICAgIGNyaXRpY2FsLFxuICAgICAgZGltZW5zaW9ucyxcbiAgICAgIHZpZXdwb3J0XG4gICAgfSA9IG1hcnNoYWwuc3RhcnRQdWJsaXNoaW5nKHJlcXVlc3QpO1xuICAgIHZhbGlkYXRlRGltZW5zaW9ucyhjcml0aWNhbCwgZGltZW5zaW9ucyk7XG4gICAgZGlzcGF0Y2goaW5pdGlhbFB1Ymxpc2goe1xuICAgICAgY3JpdGljYWwsXG4gICAgICBkaW1lbnNpb25zLFxuICAgICAgY2xpZW50U2VsZWN0aW9uLFxuICAgICAgbW92ZW1lbnRNb2RlLFxuICAgICAgdmlld3BvcnRcbiAgICB9KSk7XG4gIH07XG59KTtcblxudmFyIHN0eWxlID0gKG1hcnNoYWwgPT4gKCkgPT4gbmV4dCA9PiBhY3Rpb24gPT4ge1xuICBpZiAoYWN0aW9uLnR5cGUgPT09ICdJTklUSUFMX1BVQkxJU0gnKSB7XG4gICAgbWFyc2hhbC5kcmFnZ2luZygpO1xuICB9XG5cbiAgaWYgKGFjdGlvbi50eXBlID09PSAnRFJPUF9BTklNQVRFJykge1xuICAgIG1hcnNoYWwuZHJvcHBpbmcoYWN0aW9uLnBheWxvYWQuY29tcGxldGVkLnJlc3VsdC5yZWFzb24pO1xuICB9XG5cbiAgaWYgKGFjdGlvbi50eXBlID09PSAnRkxVU0gnIHx8IGFjdGlvbi50eXBlID09PSAnRFJPUF9DT01QTEVURScpIHtcbiAgICBtYXJzaGFsLnJlc3RpbmcoKTtcbiAgfVxuXG4gIG5leHQoYWN0aW9uKTtcbn0pO1xuXG5jb25zdCBjdXJ2ZXMgPSB7XG4gIG91dE9mVGhlV2F5OiAnY3ViaWMtYmV6aWVyKDAuMiwgMCwgMCwgMSknLFxuICBkcm9wOiAnY3ViaWMtYmV6aWVyKC4yLDEsLjEsMSknXG59O1xuY29uc3QgY29tYmluZSA9IHtcbiAgb3BhY2l0eToge1xuICAgIGRyb3A6IDAsXG4gICAgY29tYmluaW5nOiAwLjdcbiAgfSxcbiAgc2NhbGU6IHtcbiAgICBkcm9wOiAwLjc1XG4gIH1cbn07XG5jb25zdCB0aW1pbmdzID0ge1xuICBvdXRPZlRoZVdheTogMC4yLFxuICBtaW5Ecm9wVGltZTogMC4zMyxcbiAgbWF4RHJvcFRpbWU6IDAuNTVcbn07XG5jb25zdCBvdXRPZlRoZVdheVRpbWluZyA9IGAke3RpbWluZ3Mub3V0T2ZUaGVXYXl9cyAke2N1cnZlcy5vdXRPZlRoZVdheX1gO1xuY29uc3QgdHJhbnNpdGlvbnMgPSB7XG4gIGZsdWlkOiBgb3BhY2l0eSAke291dE9mVGhlV2F5VGltaW5nfWAsXG4gIHNuYXA6IGB0cmFuc2Zvcm0gJHtvdXRPZlRoZVdheVRpbWluZ30sIG9wYWNpdHkgJHtvdXRPZlRoZVdheVRpbWluZ31gLFxuICBkcm9wOiBkdXJhdGlvbiA9PiB7XG4gICAgY29uc3QgdGltaW5nID0gYCR7ZHVyYXRpb259cyAke2N1cnZlcy5kcm9wfWA7XG4gICAgcmV0dXJuIGB0cmFuc2Zvcm0gJHt0aW1pbmd9LCBvcGFjaXR5ICR7dGltaW5nfWA7XG4gIH0sXG4gIG91dE9mVGhlV2F5OiBgdHJhbnNmb3JtICR7b3V0T2ZUaGVXYXlUaW1pbmd9YCxcbiAgcGxhY2Vob2xkZXI6IGBoZWlnaHQgJHtvdXRPZlRoZVdheVRpbWluZ30sIHdpZHRoICR7b3V0T2ZUaGVXYXlUaW1pbmd9LCBtYXJnaW4gJHtvdXRPZlRoZVdheVRpbWluZ31gXG59O1xuXG5jb25zdCBtb3ZlVG8gPSBvZmZzZXQgPT4gaXNFcXVhbCQxKG9mZnNldCwgb3JpZ2luKSA/IHVuZGVmaW5lZCA6IGB0cmFuc2xhdGUoJHtvZmZzZXQueH1weCwgJHtvZmZzZXQueX1weClgO1xuXG5jb25zdCB0cmFuc2Zvcm1zID0ge1xuICBtb3ZlVG8sXG4gIGRyb3A6IChvZmZzZXQsIGlzQ29tYmluaW5nKSA9PiB7XG4gICAgY29uc3QgdHJhbnNsYXRlID0gbW92ZVRvKG9mZnNldCk7XG5cbiAgICBpZiAoIXRyYW5zbGF0ZSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBpZiAoIWlzQ29tYmluaW5nKSB7XG4gICAgICByZXR1cm4gdHJhbnNsYXRlO1xuICAgIH1cblxuICAgIHJldHVybiBgJHt0cmFuc2xhdGV9IHNjYWxlKCR7Y29tYmluZS5zY2FsZS5kcm9wfSlgO1xuICB9XG59O1xuXG5jb25zdCB7XG4gIG1pbkRyb3BUaW1lLFxuICBtYXhEcm9wVGltZVxufSA9IHRpbWluZ3M7XG5jb25zdCBkcm9wVGltZVJhbmdlID0gbWF4RHJvcFRpbWUgLSBtaW5Ecm9wVGltZTtcbmNvbnN0IG1heERyb3BUaW1lQXREaXN0YW5jZSA9IDE1MDA7XG5jb25zdCBjYW5jZWxEcm9wTW9kaWZpZXIgPSAwLjY7XG52YXIgZ2V0RHJvcER1cmF0aW9uID0gKF9yZWYgPT4ge1xuICBsZXQge1xuICAgIGN1cnJlbnQsXG4gICAgZGVzdGluYXRpb24sXG4gICAgcmVhc29uXG4gIH0gPSBfcmVmO1xuICBjb25zdCBkaXN0YW5jZSQxID0gZGlzdGFuY2UoY3VycmVudCwgZGVzdGluYXRpb24pO1xuXG4gIGlmIChkaXN0YW5jZSQxIDw9IDApIHtcbiAgICByZXR1cm4gbWluRHJvcFRpbWU7XG4gIH1cblxuICBpZiAoZGlzdGFuY2UkMSA+PSBtYXhEcm9wVGltZUF0RGlzdGFuY2UpIHtcbiAgICByZXR1cm4gbWF4RHJvcFRpbWU7XG4gIH1cblxuICBjb25zdCBwZXJjZW50YWdlID0gZGlzdGFuY2UkMSAvIG1heERyb3BUaW1lQXREaXN0YW5jZTtcbiAgY29uc3QgZHVyYXRpb24gPSBtaW5Ecm9wVGltZSArIGRyb3BUaW1lUmFuZ2UgKiBwZXJjZW50YWdlO1xuICBjb25zdCB3aXRoRHVyYXRpb24gPSByZWFzb24gPT09ICdDQU5DRUwnID8gZHVyYXRpb24gKiBjYW5jZWxEcm9wTW9kaWZpZXIgOiBkdXJhdGlvbjtcbiAgcmV0dXJuIE51bWJlcih3aXRoRHVyYXRpb24udG9GaXhlZCgyKSk7XG59KTtcblxudmFyIGdldE5ld0hvbWVDbGllbnRPZmZzZXQgPSAoX3JlZiA9PiB7XG4gIGxldCB7XG4gICAgaW1wYWN0LFxuICAgIGRyYWdnYWJsZSxcbiAgICBkaW1lbnNpb25zLFxuICAgIHZpZXdwb3J0LFxuICAgIGFmdGVyQ3JpdGljYWxcbiAgfSA9IF9yZWY7XG4gIGNvbnN0IHtcbiAgICBkcmFnZ2FibGVzLFxuICAgIGRyb3BwYWJsZXNcbiAgfSA9IGRpbWVuc2lvbnM7XG4gIGNvbnN0IGRyb3BwYWJsZUlkID0gd2hhdElzRHJhZ2dlZE92ZXIoaW1wYWN0KTtcbiAgY29uc3QgZGVzdGluYXRpb24gPSBkcm9wcGFibGVJZCA/IGRyb3BwYWJsZXNbZHJvcHBhYmxlSWRdIDogbnVsbDtcbiAgY29uc3QgaG9tZSA9IGRyb3BwYWJsZXNbZHJhZ2dhYmxlLmRlc2NyaXB0b3IuZHJvcHBhYmxlSWRdO1xuICBjb25zdCBuZXdDbGllbnRDZW50ZXIgPSBnZXRDbGllbnRCb3JkZXJCb3hDZW50ZXIoe1xuICAgIGltcGFjdCxcbiAgICBkcmFnZ2FibGUsXG4gICAgZHJhZ2dhYmxlcyxcbiAgICBhZnRlckNyaXRpY2FsLFxuICAgIGRyb3BwYWJsZTogZGVzdGluYXRpb24gfHwgaG9tZSxcbiAgICB2aWV3cG9ydFxuICB9KTtcbiAgY29uc3Qgb2Zmc2V0ID0gc3VidHJhY3QobmV3Q2xpZW50Q2VudGVyLCBkcmFnZ2FibGUuY2xpZW50LmJvcmRlckJveC5jZW50ZXIpO1xuICByZXR1cm4gb2Zmc2V0O1xufSk7XG5cbnZhciBnZXREcm9wSW1wYWN0ID0gKF9yZWYgPT4ge1xuICBsZXQge1xuICAgIGRyYWdnYWJsZXMsXG4gICAgcmVhc29uLFxuICAgIGxhc3RJbXBhY3QsXG4gICAgaG9tZSxcbiAgICB2aWV3cG9ydCxcbiAgICBvbkxpZnRJbXBhY3RcbiAgfSA9IF9yZWY7XG5cbiAgaWYgKCFsYXN0SW1wYWN0LmF0IHx8IHJlYXNvbiAhPT0gJ0RST1AnKSB7XG4gICAgY29uc3QgcmVjb21wdXRlZEhvbWVJbXBhY3QgPSByZWNvbXB1dGUoe1xuICAgICAgZHJhZ2dhYmxlcyxcbiAgICAgIGltcGFjdDogb25MaWZ0SW1wYWN0LFxuICAgICAgZGVzdGluYXRpb246IGhvbWUsXG4gICAgICB2aWV3cG9ydCxcbiAgICAgIGZvcmNlU2hvdWxkQW5pbWF0ZTogdHJ1ZVxuICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICBpbXBhY3Q6IHJlY29tcHV0ZWRIb21lSW1wYWN0LFxuICAgICAgZGlkRHJvcEluc2lkZURyb3BwYWJsZTogZmFsc2VcbiAgICB9O1xuICB9XG5cbiAgaWYgKGxhc3RJbXBhY3QuYXQudHlwZSA9PT0gJ1JFT1JERVInKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGltcGFjdDogbGFzdEltcGFjdCxcbiAgICAgIGRpZERyb3BJbnNpZGVEcm9wcGFibGU6IHRydWVcbiAgICB9O1xuICB9XG5cbiAgY29uc3Qgd2l0aG91dE1vdmVtZW50ID0geyAuLi5sYXN0SW1wYWN0LFxuICAgIGRpc3BsYWNlZDogZW1wdHlHcm91cHNcbiAgfTtcbiAgcmV0dXJuIHtcbiAgICBpbXBhY3Q6IHdpdGhvdXRNb3ZlbWVudCxcbiAgICBkaWREcm9wSW5zaWRlRHJvcHBhYmxlOiB0cnVlXG4gIH07XG59KTtcblxuY29uc3QgZHJvcE1pZGRsZXdhcmUgPSBfcmVmID0+IHtcbiAgbGV0IHtcbiAgICBnZXRTdGF0ZSxcbiAgICBkaXNwYXRjaFxuICB9ID0gX3JlZjtcbiAgcmV0dXJuIG5leHQgPT4gYWN0aW9uID0+IHtcbiAgICBpZiAoYWN0aW9uLnR5cGUgIT09ICdEUk9QJykge1xuICAgICAgbmV4dChhY3Rpb24pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHN0YXRlID0gZ2V0U3RhdGUoKTtcbiAgICBjb25zdCByZWFzb24gPSBhY3Rpb24ucGF5bG9hZC5yZWFzb247XG5cbiAgICBpZiAoc3RhdGUucGhhc2UgPT09ICdDT0xMRUNUSU5HJykge1xuICAgICAgZGlzcGF0Y2goZHJvcFBlbmRpbmcoe1xuICAgICAgICByZWFzb25cbiAgICAgIH0pKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoc3RhdGUucGhhc2UgPT09ICdJRExFJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGlzV2FpdGluZ0ZvckRyb3AgPSBzdGF0ZS5waGFzZSA9PT0gJ0RST1BfUEVORElORycgJiYgc3RhdGUuaXNXYWl0aW5nO1xuICAgICEhaXNXYWl0aW5nRm9yRHJvcCA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IGludmFyaWFudChmYWxzZSwgJ0EgRFJPUCBhY3Rpb24gb2NjdXJyZWQgd2hpbGUgRFJPUF9QRU5ESU5HIGFuZCBzdGlsbCB3YWl0aW5nJykgOiBpbnZhcmlhbnQoZmFsc2UpIDogdm9pZCAwO1xuICAgICEoc3RhdGUucGhhc2UgPT09ICdEUkFHR0lORycgfHwgc3RhdGUucGhhc2UgPT09ICdEUk9QX1BFTkRJTkcnKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IGludmFyaWFudChmYWxzZSwgYENhbm5vdCBkcm9wIGluIHBoYXNlOiAke3N0YXRlLnBoYXNlfWApIDogaW52YXJpYW50KGZhbHNlKSA6IHZvaWQgMDtcbiAgICBjb25zdCBjcml0aWNhbCA9IHN0YXRlLmNyaXRpY2FsO1xuICAgIGNvbnN0IGRpbWVuc2lvbnMgPSBzdGF0ZS5kaW1lbnNpb25zO1xuICAgIGNvbnN0IGRyYWdnYWJsZSA9IGRpbWVuc2lvbnMuZHJhZ2dhYmxlc1tzdGF0ZS5jcml0aWNhbC5kcmFnZ2FibGUuaWRdO1xuICAgIGNvbnN0IHtcbiAgICAgIGltcGFjdCxcbiAgICAgIGRpZERyb3BJbnNpZGVEcm9wcGFibGVcbiAgICB9ID0gZ2V0RHJvcEltcGFjdCh7XG4gICAgICByZWFzb24sXG4gICAgICBsYXN0SW1wYWN0OiBzdGF0ZS5pbXBhY3QsXG4gICAgICBhZnRlckNyaXRpY2FsOiBzdGF0ZS5hZnRlckNyaXRpY2FsLFxuICAgICAgb25MaWZ0SW1wYWN0OiBzdGF0ZS5vbkxpZnRJbXBhY3QsXG4gICAgICBob21lOiBzdGF0ZS5kaW1lbnNpb25zLmRyb3BwYWJsZXNbc3RhdGUuY3JpdGljYWwuZHJvcHBhYmxlLmlkXSxcbiAgICAgIHZpZXdwb3J0OiBzdGF0ZS52aWV3cG9ydCxcbiAgICAgIGRyYWdnYWJsZXM6IHN0YXRlLmRpbWVuc2lvbnMuZHJhZ2dhYmxlc1xuICAgIH0pO1xuICAgIGNvbnN0IGRlc3RpbmF0aW9uID0gZGlkRHJvcEluc2lkZURyb3BwYWJsZSA/IHRyeUdldERlc3RpbmF0aW9uKGltcGFjdCkgOiBudWxsO1xuICAgIGNvbnN0IGNvbWJpbmUgPSBkaWREcm9wSW5zaWRlRHJvcHBhYmxlID8gdHJ5R2V0Q29tYmluZShpbXBhY3QpIDogbnVsbDtcbiAgICBjb25zdCBzb3VyY2UgPSB7XG4gICAgICBpbmRleDogY3JpdGljYWwuZHJhZ2dhYmxlLmluZGV4LFxuICAgICAgZHJvcHBhYmxlSWQ6IGNyaXRpY2FsLmRyb3BwYWJsZS5pZFxuICAgIH07XG4gICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgZHJhZ2dhYmxlSWQ6IGRyYWdnYWJsZS5kZXNjcmlwdG9yLmlkLFxuICAgICAgdHlwZTogZHJhZ2dhYmxlLmRlc2NyaXB0b3IudHlwZSxcbiAgICAgIHNvdXJjZSxcbiAgICAgIHJlYXNvbixcbiAgICAgIG1vZGU6IHN0YXRlLm1vdmVtZW50TW9kZSxcbiAgICAgIGRlc3RpbmF0aW9uLFxuICAgICAgY29tYmluZVxuICAgIH07XG4gICAgY29uc3QgbmV3SG9tZUNsaWVudE9mZnNldCA9IGdldE5ld0hvbWVDbGllbnRPZmZzZXQoe1xuICAgICAgaW1wYWN0LFxuICAgICAgZHJhZ2dhYmxlLFxuICAgICAgZGltZW5zaW9ucyxcbiAgICAgIHZpZXdwb3J0OiBzdGF0ZS52aWV3cG9ydCxcbiAgICAgIGFmdGVyQ3JpdGljYWw6IHN0YXRlLmFmdGVyQ3JpdGljYWxcbiAgICB9KTtcbiAgICBjb25zdCBjb21wbGV0ZWQgPSB7XG4gICAgICBjcml0aWNhbDogc3RhdGUuY3JpdGljYWwsXG4gICAgICBhZnRlckNyaXRpY2FsOiBzdGF0ZS5hZnRlckNyaXRpY2FsLFxuICAgICAgcmVzdWx0LFxuICAgICAgaW1wYWN0XG4gICAgfTtcbiAgICBjb25zdCBpc0FuaW1hdGlvblJlcXVpcmVkID0gIWlzRXF1YWwkMShzdGF0ZS5jdXJyZW50LmNsaWVudC5vZmZzZXQsIG5ld0hvbWVDbGllbnRPZmZzZXQpIHx8IEJvb2xlYW4ocmVzdWx0LmNvbWJpbmUpO1xuXG4gICAgaWYgKCFpc0FuaW1hdGlvblJlcXVpcmVkKSB7XG4gICAgICBkaXNwYXRjaChjb21wbGV0ZURyb3Aoe1xuICAgICAgICBjb21wbGV0ZWRcbiAgICAgIH0pKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBkcm9wRHVyYXRpb24gPSBnZXREcm9wRHVyYXRpb24oe1xuICAgICAgY3VycmVudDogc3RhdGUuY3VycmVudC5jbGllbnQub2Zmc2V0LFxuICAgICAgZGVzdGluYXRpb246IG5ld0hvbWVDbGllbnRPZmZzZXQsXG4gICAgICByZWFzb25cbiAgICB9KTtcbiAgICBjb25zdCBhcmdzID0ge1xuICAgICAgbmV3SG9tZUNsaWVudE9mZnNldCxcbiAgICAgIGRyb3BEdXJhdGlvbixcbiAgICAgIGNvbXBsZXRlZFxuICAgIH07XG4gICAgZGlzcGF0Y2goYW5pbWF0ZURyb3AoYXJncykpO1xuICB9O1xufTtcblxudmFyIGRyb3AgPSBkcm9wTWlkZGxld2FyZTtcblxudmFyIGdldFdpbmRvd1Njcm9sbCA9ICgoKSA9PiAoe1xuICB4OiB3aW5kb3cucGFnZVhPZmZzZXQsXG4gIHk6IHdpbmRvdy5wYWdlWU9mZnNldFxufSkpO1xuXG5mdW5jdGlvbiBnZXRXaW5kb3dTY3JvbGxCaW5kaW5nKHVwZGF0ZSkge1xuICByZXR1cm4ge1xuICAgIGV2ZW50TmFtZTogJ3Njcm9sbCcsXG4gICAgb3B0aW9uczoge1xuICAgICAgcGFzc2l2ZTogdHJ1ZSxcbiAgICAgIGNhcHR1cmU6IGZhbHNlXG4gICAgfSxcbiAgICBmbjogZXZlbnQgPT4ge1xuICAgICAgaWYgKGV2ZW50LnRhcmdldCAhPT0gd2luZG93ICYmIGV2ZW50LnRhcmdldCAhPT0gd2luZG93LmRvY3VtZW50KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdXBkYXRlKCk7XG4gICAgfVxuICB9O1xufVxuXG5mdW5jdGlvbiBnZXRTY3JvbGxMaXN0ZW5lcihfcmVmKSB7XG4gIGxldCB7XG4gICAgb25XaW5kb3dTY3JvbGxcbiAgfSA9IF9yZWY7XG5cbiAgZnVuY3Rpb24gdXBkYXRlU2Nyb2xsKCkge1xuICAgIG9uV2luZG93U2Nyb2xsKGdldFdpbmRvd1Njcm9sbCgpKTtcbiAgfVxuXG4gIGNvbnN0IHNjaGVkdWxlZCA9IHJhZlNjaGRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKHVwZGF0ZVNjcm9sbCk7XG4gIGNvbnN0IGJpbmRpbmcgPSBnZXRXaW5kb3dTY3JvbGxCaW5kaW5nKHNjaGVkdWxlZCk7XG4gIGxldCB1bmJpbmQgPSBub29wJDI7XG5cbiAgZnVuY3Rpb24gaXNBY3RpdmUoKSB7XG4gICAgcmV0dXJuIHVuYmluZCAhPT0gbm9vcCQyO1xuICB9XG5cbiAgZnVuY3Rpb24gc3RhcnQoKSB7XG4gICAgISFpc0FjdGl2ZSgpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gaW52YXJpYW50KGZhbHNlLCAnQ2Fubm90IHN0YXJ0IHNjcm9sbCBsaXN0ZW5lciB3aGVuIGFscmVhZHkgYWN0aXZlJykgOiBpbnZhcmlhbnQoZmFsc2UpIDogdm9pZCAwO1xuICAgIHVuYmluZCA9IGJpbmRFdmVudHMod2luZG93LCBbYmluZGluZ10pO1xuICB9XG5cbiAgZnVuY3Rpb24gc3RvcCgpIHtcbiAgICAhaXNBY3RpdmUoKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IGludmFyaWFudChmYWxzZSwgJ0Nhbm5vdCBzdG9wIHNjcm9sbCBsaXN0ZW5lciB3aGVuIG5vdCBhY3RpdmUnKSA6IGludmFyaWFudChmYWxzZSkgOiB2b2lkIDA7XG4gICAgc2NoZWR1bGVkLmNhbmNlbCgpO1xuICAgIHVuYmluZCgpO1xuICAgIHVuYmluZCA9IG5vb3AkMjtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgc3RhcnQsXG4gICAgc3RvcCxcbiAgICBpc0FjdGl2ZVxuICB9O1xufVxuXG5jb25zdCBzaG91bGRFbmQgPSBhY3Rpb24gPT4gYWN0aW9uLnR5cGUgPT09ICdEUk9QX0NPTVBMRVRFJyB8fCBhY3Rpb24udHlwZSA9PT0gJ0RST1BfQU5JTUFURScgfHwgYWN0aW9uLnR5cGUgPT09ICdGTFVTSCc7XG5cbmNvbnN0IHNjcm9sbExpc3RlbmVyID0gc3RvcmUgPT4ge1xuICBjb25zdCBsaXN0ZW5lciA9IGdldFNjcm9sbExpc3RlbmVyKHtcbiAgICBvbldpbmRvd1Njcm9sbDogbmV3U2Nyb2xsID0+IHtcbiAgICAgIHN0b3JlLmRpc3BhdGNoKG1vdmVCeVdpbmRvd1Njcm9sbCh7XG4gICAgICAgIG5ld1Njcm9sbFxuICAgICAgfSkpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBuZXh0ID0+IGFjdGlvbiA9PiB7XG4gICAgaWYgKCFsaXN0ZW5lci5pc0FjdGl2ZSgpICYmIGFjdGlvbi50eXBlID09PSAnSU5JVElBTF9QVUJMSVNIJykge1xuICAgICAgbGlzdGVuZXIuc3RhcnQoKTtcbiAgICB9XG5cbiAgICBpZiAobGlzdGVuZXIuaXNBY3RpdmUoKSAmJiBzaG91bGRFbmQoYWN0aW9uKSkge1xuICAgICAgbGlzdGVuZXIuc3RvcCgpO1xuICAgIH1cblxuICAgIG5leHQoYWN0aW9uKTtcbiAgfTtcbn07XG5cbnZhciBzY3JvbGxMaXN0ZW5lciQxID0gc2Nyb2xsTGlzdGVuZXI7XG5cbnZhciBnZXRFeHBpcmluZ0Fubm91bmNlID0gKGFubm91bmNlID0+IHtcbiAgbGV0IHdhc0NhbGxlZCA9IGZhbHNlO1xuICBsZXQgaXNFeHBpcmVkID0gZmFsc2U7XG4gIGNvbnN0IHRpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgIGlzRXhwaXJlZCA9IHRydWU7XG4gIH0pO1xuXG4gIGNvbnN0IHJlc3VsdCA9IG1lc3NhZ2UgPT4ge1xuICAgIGlmICh3YXNDYWxsZWQpIHtcbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHdhcm5pbmcoJ0Fubm91bmNlbWVudCBhbHJlYWR5IG1hZGUuIE5vdCBtYWtpbmcgYSBzZWNvbmQgYW5ub3VuY2VtZW50JykgOiB2b2lkIDA7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGlzRXhwaXJlZCkge1xuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gd2FybmluZyhgXG4gICAgICAgIEFubm91bmNlbWVudHMgY2Fubm90IGJlIG1hZGUgYXN5bmNocm9ub3VzbHkuXG4gICAgICAgIERlZmF1bHQgbWVzc2FnZSBoYXMgYWxyZWFkeSBiZWVuIGFubm91bmNlZC5cbiAgICAgIGApIDogdm9pZCAwO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHdhc0NhbGxlZCA9IHRydWU7XG4gICAgYW5ub3VuY2UobWVzc2FnZSk7XG4gICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG4gIH07XG5cbiAgcmVzdWx0Lndhc0NhbGxlZCA9ICgpID0+IHdhc0NhbGxlZDtcblxuICByZXR1cm4gcmVzdWx0O1xufSk7XG5cbnZhciBnZXRBc3luY01hcnNoYWwgPSAoKCkgPT4ge1xuICBjb25zdCBlbnRyaWVzID0gW107XG5cbiAgY29uc3QgZXhlY3V0ZSA9IHRpbWVySWQgPT4ge1xuICAgIGNvbnN0IGluZGV4ID0gZW50cmllcy5maW5kSW5kZXgoaXRlbSA9PiBpdGVtLnRpbWVySWQgPT09IHRpbWVySWQpO1xuICAgICEoaW5kZXggIT09IC0xKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IGludmFyaWFudChmYWxzZSwgJ0NvdWxkIG5vdCBmaW5kIHRpbWVyJykgOiBpbnZhcmlhbnQoZmFsc2UpIDogdm9pZCAwO1xuICAgIGNvbnN0IFtlbnRyeV0gPSBlbnRyaWVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgZW50cnkuY2FsbGJhY2soKTtcbiAgfTtcblxuICBjb25zdCBhZGQgPSBmbiA9PiB7XG4gICAgY29uc3QgdGltZXJJZCA9IHNldFRpbWVvdXQoKCkgPT4gZXhlY3V0ZSh0aW1lcklkKSk7XG4gICAgY29uc3QgZW50cnkgPSB7XG4gICAgICB0aW1lcklkLFxuICAgICAgY2FsbGJhY2s6IGZuXG4gICAgfTtcbiAgICBlbnRyaWVzLnB1c2goZW50cnkpO1xuICB9O1xuXG4gIGNvbnN0IGZsdXNoID0gKCkgPT4ge1xuICAgIGlmICghZW50cmllcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzaGFsbG93ID0gWy4uLmVudHJpZXNdO1xuICAgIGVudHJpZXMubGVuZ3RoID0gMDtcbiAgICBzaGFsbG93LmZvckVhY2goZW50cnkgPT4ge1xuICAgICAgY2xlYXJUaW1lb3V0KGVudHJ5LnRpbWVySWQpO1xuICAgICAgZW50cnkuY2FsbGJhY2soKTtcbiAgICB9KTtcbiAgfTtcblxuICByZXR1cm4ge1xuICAgIGFkZCxcbiAgICBmbHVzaFxuICB9O1xufSk7XG5cbmNvbnN0IGFyZUxvY2F0aW9uc0VxdWFsID0gKGZpcnN0LCBzZWNvbmQpID0+IHtcbiAgaWYgKGZpcnN0ID09IG51bGwgJiYgc2Vjb25kID09IG51bGwpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmIChmaXJzdCA9PSBudWxsIHx8IHNlY29uZCA9PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIGZpcnN0LmRyb3BwYWJsZUlkID09PSBzZWNvbmQuZHJvcHBhYmxlSWQgJiYgZmlyc3QuaW5kZXggPT09IHNlY29uZC5pbmRleDtcbn07XG5jb25zdCBpc0NvbWJpbmVFcXVhbCA9IChmaXJzdCwgc2Vjb25kKSA9PiB7XG4gIGlmIChmaXJzdCA9PSBudWxsICYmIHNlY29uZCA9PSBudWxsKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoZmlyc3QgPT0gbnVsbCB8fCBzZWNvbmQgPT0gbnVsbCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBmaXJzdC5kcmFnZ2FibGVJZCA9PT0gc2Vjb25kLmRyYWdnYWJsZUlkICYmIGZpcnN0LmRyb3BwYWJsZUlkID09PSBzZWNvbmQuZHJvcHBhYmxlSWQ7XG59O1xuY29uc3QgaXNDcml0aWNhbEVxdWFsID0gKGZpcnN0LCBzZWNvbmQpID0+IHtcbiAgaWYgKGZpcnN0ID09PSBzZWNvbmQpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGNvbnN0IGlzRHJhZ2dhYmxlRXF1YWwgPSBmaXJzdC5kcmFnZ2FibGUuaWQgPT09IHNlY29uZC5kcmFnZ2FibGUuaWQgJiYgZmlyc3QuZHJhZ2dhYmxlLmRyb3BwYWJsZUlkID09PSBzZWNvbmQuZHJhZ2dhYmxlLmRyb3BwYWJsZUlkICYmIGZpcnN0LmRyYWdnYWJsZS50eXBlID09PSBzZWNvbmQuZHJhZ2dhYmxlLnR5cGUgJiYgZmlyc3QuZHJhZ2dhYmxlLmluZGV4ID09PSBzZWNvbmQuZHJhZ2dhYmxlLmluZGV4O1xuICBjb25zdCBpc0Ryb3BwYWJsZUVxdWFsID0gZmlyc3QuZHJvcHBhYmxlLmlkID09PSBzZWNvbmQuZHJvcHBhYmxlLmlkICYmIGZpcnN0LmRyb3BwYWJsZS50eXBlID09PSBzZWNvbmQuZHJvcHBhYmxlLnR5cGU7XG4gIHJldHVybiBpc0RyYWdnYWJsZUVxdWFsICYmIGlzRHJvcHBhYmxlRXF1YWw7XG59O1xuXG5jb25zdCB3aXRoVGltaW5ncyA9IChrZXksIGZuKSA9PiB7XG4gIHN0YXJ0KCk7XG4gIGZuKCk7XG4gIGZpbmlzaCgpO1xufTtcblxuY29uc3QgZ2V0RHJhZ1N0YXJ0ID0gKGNyaXRpY2FsLCBtb2RlKSA9PiAoe1xuICBkcmFnZ2FibGVJZDogY3JpdGljYWwuZHJhZ2dhYmxlLmlkLFxuICB0eXBlOiBjcml0aWNhbC5kcm9wcGFibGUudHlwZSxcbiAgc291cmNlOiB7XG4gICAgZHJvcHBhYmxlSWQ6IGNyaXRpY2FsLmRyb3BwYWJsZS5pZCxcbiAgICBpbmRleDogY3JpdGljYWwuZHJhZ2dhYmxlLmluZGV4XG4gIH0sXG4gIG1vZGVcbn0pO1xuXG5mdW5jdGlvbiBleGVjdXRlKHJlc3BvbmRlciwgZGF0YSwgYW5ub3VuY2UsIGdldERlZmF1bHRNZXNzYWdlKSB7XG4gIGlmICghcmVzcG9uZGVyKSB7XG4gICAgYW5ub3VuY2UoZ2V0RGVmYXVsdE1lc3NhZ2UoZGF0YSkpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHdpbGxFeHBpcmUgPSBnZXRFeHBpcmluZ0Fubm91bmNlKGFubm91bmNlKTtcbiAgY29uc3QgcHJvdmlkZWQgPSB7XG4gICAgYW5ub3VuY2U6IHdpbGxFeHBpcmVcbiAgfTtcbiAgcmVzcG9uZGVyKGRhdGEsIHByb3ZpZGVkKTtcblxuICBpZiAoIXdpbGxFeHBpcmUud2FzQ2FsbGVkKCkpIHtcbiAgICBhbm5vdW5jZShnZXREZWZhdWx0TWVzc2FnZShkYXRhKSk7XG4gIH1cbn1cblxudmFyIGdldFB1Ymxpc2hlciA9ICgoZ2V0UmVzcG9uZGVycywgYW5ub3VuY2UpID0+IHtcbiAgY29uc3QgYXN5bmNNYXJzaGFsID0gZ2V0QXN5bmNNYXJzaGFsKCk7XG4gIGxldCBkcmFnZ2luZyA9IG51bGw7XG5cbiAgY29uc3QgYmVmb3JlQ2FwdHVyZSA9IChkcmFnZ2FibGVJZCwgbW9kZSkgPT4ge1xuICAgICEhZHJhZ2dpbmcgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBpbnZhcmlhbnQoZmFsc2UsICdDYW5ub3QgZmlyZSBvbkJlZm9yZUNhcHR1cmUgYXMgYSBkcmFnIHN0YXJ0IGhhcyBhbHJlYWR5IGJlZW4gcHVibGlzaGVkJykgOiBpbnZhcmlhbnQoZmFsc2UpIDogdm9pZCAwO1xuICAgIHdpdGhUaW1pbmdzKCdvbkJlZm9yZUNhcHR1cmUnLCAoKSA9PiB7XG4gICAgICBjb25zdCBmbiA9IGdldFJlc3BvbmRlcnMoKS5vbkJlZm9yZUNhcHR1cmU7XG5cbiAgICAgIGlmIChmbikge1xuICAgICAgICBjb25zdCBiZWZvcmUgPSB7XG4gICAgICAgICAgZHJhZ2dhYmxlSWQsXG4gICAgICAgICAgbW9kZVxuICAgICAgICB9O1xuICAgICAgICBmbihiZWZvcmUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIGNvbnN0IGJlZm9yZVN0YXJ0ID0gKGNyaXRpY2FsLCBtb2RlKSA9PiB7XG4gICAgISFkcmFnZ2luZyA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IGludmFyaWFudChmYWxzZSwgJ0Nhbm5vdCBmaXJlIG9uQmVmb3JlRHJhZ1N0YXJ0IGFzIGEgZHJhZyBzdGFydCBoYXMgYWxyZWFkeSBiZWVuIHB1Ymxpc2hlZCcpIDogaW52YXJpYW50KGZhbHNlKSA6IHZvaWQgMDtcbiAgICB3aXRoVGltaW5ncygnb25CZWZvcmVEcmFnU3RhcnQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBmbiA9IGdldFJlc3BvbmRlcnMoKS5vbkJlZm9yZURyYWdTdGFydDtcblxuICAgICAgaWYgKGZuKSB7XG4gICAgICAgIGZuKGdldERyYWdTdGFydChjcml0aWNhbCwgbW9kZSkpO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIGNvbnN0IHN0YXJ0ID0gKGNyaXRpY2FsLCBtb2RlKSA9PiB7XG4gICAgISFkcmFnZ2luZyA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IGludmFyaWFudChmYWxzZSwgJ0Nhbm5vdCBmaXJlIG9uQmVmb3JlRHJhZ1N0YXJ0IGFzIGEgZHJhZyBzdGFydCBoYXMgYWxyZWFkeSBiZWVuIHB1Ymxpc2hlZCcpIDogaW52YXJpYW50KGZhbHNlKSA6IHZvaWQgMDtcbiAgICBjb25zdCBkYXRhID0gZ2V0RHJhZ1N0YXJ0KGNyaXRpY2FsLCBtb2RlKTtcbiAgICBkcmFnZ2luZyA9IHtcbiAgICAgIG1vZGUsXG4gICAgICBsYXN0Q3JpdGljYWw6IGNyaXRpY2FsLFxuICAgICAgbGFzdExvY2F0aW9uOiBkYXRhLnNvdXJjZSxcbiAgICAgIGxhc3RDb21iaW5lOiBudWxsXG4gICAgfTtcbiAgICBhc3luY01hcnNoYWwuYWRkKCgpID0+IHtcbiAgICAgIHdpdGhUaW1pbmdzKCdvbkRyYWdTdGFydCcsICgpID0+IGV4ZWN1dGUoZ2V0UmVzcG9uZGVycygpLm9uRHJhZ1N0YXJ0LCBkYXRhLCBhbm5vdW5jZSwgcHJlc2V0JDEub25EcmFnU3RhcnQpKTtcbiAgICB9KTtcbiAgfTtcblxuICBjb25zdCB1cGRhdGUgPSAoY3JpdGljYWwsIGltcGFjdCkgPT4ge1xuICAgIGNvbnN0IGxvY2F0aW9uID0gdHJ5R2V0RGVzdGluYXRpb24oaW1wYWN0KTtcbiAgICBjb25zdCBjb21iaW5lID0gdHJ5R2V0Q29tYmluZShpbXBhY3QpO1xuICAgICFkcmFnZ2luZyA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IGludmFyaWFudChmYWxzZSwgJ0Nhbm5vdCBmaXJlIG9uRHJhZ01vdmUgd2hlbiBvbkRyYWdTdGFydCBoYXMgbm90IGJlZW4gY2FsbGVkJykgOiBpbnZhcmlhbnQoZmFsc2UpIDogdm9pZCAwO1xuICAgIGNvbnN0IGhhc0NyaXRpY2FsQ2hhbmdlZCA9ICFpc0NyaXRpY2FsRXF1YWwoY3JpdGljYWwsIGRyYWdnaW5nLmxhc3RDcml0aWNhbCk7XG5cbiAgICBpZiAoaGFzQ3JpdGljYWxDaGFuZ2VkKSB7XG4gICAgICBkcmFnZ2luZy5sYXN0Q3JpdGljYWwgPSBjcml0aWNhbDtcbiAgICB9XG5cbiAgICBjb25zdCBoYXNMb2NhdGlvbkNoYW5nZWQgPSAhYXJlTG9jYXRpb25zRXF1YWwoZHJhZ2dpbmcubGFzdExvY2F0aW9uLCBsb2NhdGlvbik7XG5cbiAgICBpZiAoaGFzTG9jYXRpb25DaGFuZ2VkKSB7XG4gICAgICBkcmFnZ2luZy5sYXN0TG9jYXRpb24gPSBsb2NhdGlvbjtcbiAgICB9XG5cbiAgICBjb25zdCBoYXNHcm91cGluZ0NoYW5nZWQgPSAhaXNDb21iaW5lRXF1YWwoZHJhZ2dpbmcubGFzdENvbWJpbmUsIGNvbWJpbmUpO1xuXG4gICAgaWYgKGhhc0dyb3VwaW5nQ2hhbmdlZCkge1xuICAgICAgZHJhZ2dpbmcubGFzdENvbWJpbmUgPSBjb21iaW5lO1xuICAgIH1cblxuICAgIGlmICghaGFzQ3JpdGljYWxDaGFuZ2VkICYmICFoYXNMb2NhdGlvbkNoYW5nZWQgJiYgIWhhc0dyb3VwaW5nQ2hhbmdlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGRhdGEgPSB7IC4uLmdldERyYWdTdGFydChjcml0aWNhbCwgZHJhZ2dpbmcubW9kZSksXG4gICAgICBjb21iaW5lLFxuICAgICAgZGVzdGluYXRpb246IGxvY2F0aW9uXG4gICAgfTtcbiAgICBhc3luY01hcnNoYWwuYWRkKCgpID0+IHtcbiAgICAgIHdpdGhUaW1pbmdzKCdvbkRyYWdVcGRhdGUnLCAoKSA9PiBleGVjdXRlKGdldFJlc3BvbmRlcnMoKS5vbkRyYWdVcGRhdGUsIGRhdGEsIGFubm91bmNlLCBwcmVzZXQkMS5vbkRyYWdVcGRhdGUpKTtcbiAgICB9KTtcbiAgfTtcblxuICBjb25zdCBmbHVzaCA9ICgpID0+IHtcbiAgICAhZHJhZ2dpbmcgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBpbnZhcmlhbnQoZmFsc2UsICdDYW4gb25seSBmbHVzaCByZXNwb25kZXJzIHdoaWxlIGRyYWdnaW5nJykgOiBpbnZhcmlhbnQoZmFsc2UpIDogdm9pZCAwO1xuICAgIGFzeW5jTWFyc2hhbC5mbHVzaCgpO1xuICB9O1xuXG4gIGNvbnN0IGRyb3AgPSByZXN1bHQgPT4ge1xuICAgICFkcmFnZ2luZyA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IGludmFyaWFudChmYWxzZSwgJ0Nhbm5vdCBmaXJlIG9uRHJhZ0VuZCB3aGVuIHRoZXJlIGlzIG5vIG1hdGNoaW5nIG9uRHJhZ1N0YXJ0JykgOiBpbnZhcmlhbnQoZmFsc2UpIDogdm9pZCAwO1xuICAgIGRyYWdnaW5nID0gbnVsbDtcbiAgICB3aXRoVGltaW5ncygnb25EcmFnRW5kJywgKCkgPT4gZXhlY3V0ZShnZXRSZXNwb25kZXJzKCkub25EcmFnRW5kLCByZXN1bHQsIGFubm91bmNlLCBwcmVzZXQkMS5vbkRyYWdFbmQpKTtcbiAgfTtcblxuICBjb25zdCBhYm9ydCA9ICgpID0+IHtcbiAgICBpZiAoIWRyYWdnaW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0geyAuLi5nZXREcmFnU3RhcnQoZHJhZ2dpbmcubGFzdENyaXRpY2FsLCBkcmFnZ2luZy5tb2RlKSxcbiAgICAgIGNvbWJpbmU6IG51bGwsXG4gICAgICBkZXN0aW5hdGlvbjogbnVsbCxcbiAgICAgIHJlYXNvbjogJ0NBTkNFTCdcbiAgICB9O1xuICAgIGRyb3AocmVzdWx0KTtcbiAgfTtcblxuICByZXR1cm4ge1xuICAgIGJlZm9yZUNhcHR1cmUsXG4gICAgYmVmb3JlU3RhcnQsXG4gICAgc3RhcnQsXG4gICAgdXBkYXRlLFxuICAgIGZsdXNoLFxuICAgIGRyb3AsXG4gICAgYWJvcnRcbiAgfTtcbn0pO1xuXG52YXIgcmVzcG9uZGVycyA9ICgoZ2V0UmVzcG9uZGVycywgYW5ub3VuY2UpID0+IHtcbiAgY29uc3QgcHVibGlzaGVyID0gZ2V0UHVibGlzaGVyKGdldFJlc3BvbmRlcnMsIGFubm91bmNlKTtcbiAgcmV0dXJuIHN0b3JlID0+IG5leHQgPT4gYWN0aW9uID0+IHtcbiAgICBpZiAoYWN0aW9uLnR5cGUgPT09ICdCRUZPUkVfSU5JVElBTF9DQVBUVVJFJykge1xuICAgICAgcHVibGlzaGVyLmJlZm9yZUNhcHR1cmUoYWN0aW9uLnBheWxvYWQuZHJhZ2dhYmxlSWQsIGFjdGlvbi5wYXlsb2FkLm1vdmVtZW50TW9kZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGFjdGlvbi50eXBlID09PSAnSU5JVElBTF9QVUJMSVNIJykge1xuICAgICAgY29uc3QgY3JpdGljYWwgPSBhY3Rpb24ucGF5bG9hZC5jcml0aWNhbDtcbiAgICAgIHB1Ymxpc2hlci5iZWZvcmVTdGFydChjcml0aWNhbCwgYWN0aW9uLnBheWxvYWQubW92ZW1lbnRNb2RlKTtcbiAgICAgIG5leHQoYWN0aW9uKTtcbiAgICAgIHB1Ymxpc2hlci5zdGFydChjcml0aWNhbCwgYWN0aW9uLnBheWxvYWQubW92ZW1lbnRNb2RlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoYWN0aW9uLnR5cGUgPT09ICdEUk9QX0NPTVBMRVRFJykge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYWN0aW9uLnBheWxvYWQuY29tcGxldGVkLnJlc3VsdDtcbiAgICAgIHB1Ymxpc2hlci5mbHVzaCgpO1xuICAgICAgbmV4dChhY3Rpb24pO1xuICAgICAgcHVibGlzaGVyLmRyb3AocmVzdWx0KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBuZXh0KGFjdGlvbik7XG5cbiAgICBpZiAoYWN0aW9uLnR5cGUgPT09ICdGTFVTSCcpIHtcbiAgICAgIHB1Ymxpc2hlci5hYm9ydCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHN0YXRlID0gc3RvcmUuZ2V0U3RhdGUoKTtcblxuICAgIGlmIChzdGF0ZS5waGFzZSA9PT0gJ0RSQUdHSU5HJykge1xuICAgICAgcHVibGlzaGVyLnVwZGF0ZShzdGF0ZS5jcml0aWNhbCwgc3RhdGUuaW1wYWN0KTtcbiAgICB9XG4gIH07XG59KTtcblxuY29uc3QgZHJvcEFuaW1hdGlvbkZpbmlzaE1pZGRsZXdhcmUgPSBzdG9yZSA9PiBuZXh0ID0+IGFjdGlvbiA9PiB7XG4gIGlmIChhY3Rpb24udHlwZSAhPT0gJ0RST1BfQU5JTUFUSU9OX0ZJTklTSEVEJykge1xuICAgIG5leHQoYWN0aW9uKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBzdGF0ZSA9IHN0b3JlLmdldFN0YXRlKCk7XG4gICEoc3RhdGUucGhhc2UgPT09ICdEUk9QX0FOSU1BVElORycpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gaW52YXJpYW50KGZhbHNlLCAnQ2Fubm90IGZpbmlzaCBhIGRyb3AgYW5pbWF0aW5nIHdoZW4gbm8gZHJvcCBpcyBvY2N1cnJpbmcnKSA6IGludmFyaWFudChmYWxzZSkgOiB2b2lkIDA7XG4gIHN0b3JlLmRpc3BhdGNoKGNvbXBsZXRlRHJvcCh7XG4gICAgY29tcGxldGVkOiBzdGF0ZS5jb21wbGV0ZWRcbiAgfSkpO1xufTtcblxudmFyIGRyb3BBbmltYXRpb25GaW5pc2ggPSBkcm9wQW5pbWF0aW9uRmluaXNoTWlkZGxld2FyZTtcblxuY29uc3QgZHJvcEFuaW1hdGlvbkZsdXNoT25TY3JvbGxNaWRkbGV3YXJlID0gc3RvcmUgPT4ge1xuICBsZXQgdW5iaW5kID0gbnVsbDtcbiAgbGV0IGZyYW1lSWQgPSBudWxsO1xuXG4gIGZ1bmN0aW9uIGNsZWFyKCkge1xuICAgIGlmIChmcmFtZUlkKSB7XG4gICAgICBjYW5jZWxBbmltYXRpb25GcmFtZShmcmFtZUlkKTtcbiAgICAgIGZyYW1lSWQgPSBudWxsO1xuICAgIH1cblxuICAgIGlmICh1bmJpbmQpIHtcbiAgICAgIHVuYmluZCgpO1xuICAgICAgdW5iaW5kID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV4dCA9PiBhY3Rpb24gPT4ge1xuICAgIGlmIChhY3Rpb24udHlwZSA9PT0gJ0ZMVVNIJyB8fCBhY3Rpb24udHlwZSA9PT0gJ0RST1BfQ09NUExFVEUnIHx8IGFjdGlvbi50eXBlID09PSAnRFJPUF9BTklNQVRJT05fRklOSVNIRUQnKSB7XG4gICAgICBjbGVhcigpO1xuICAgIH1cblxuICAgIG5leHQoYWN0aW9uKTtcblxuICAgIGlmIChhY3Rpb24udHlwZSAhPT0gJ0RST1BfQU5JTUFURScpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBiaW5kaW5nID0ge1xuICAgICAgZXZlbnROYW1lOiAnc2Nyb2xsJyxcbiAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgY2FwdHVyZTogdHJ1ZSxcbiAgICAgICAgcGFzc2l2ZTogZmFsc2UsXG4gICAgICAgIG9uY2U6IHRydWVcbiAgICAgIH0sXG4gICAgICBmbjogZnVuY3Rpb24gZmx1c2hEcm9wQW5pbWF0aW9uKCkge1xuICAgICAgICBjb25zdCBzdGF0ZSA9IHN0b3JlLmdldFN0YXRlKCk7XG5cbiAgICAgICAgaWYgKHN0YXRlLnBoYXNlID09PSAnRFJPUF9BTklNQVRJTkcnKSB7XG4gICAgICAgICAgc3RvcmUuZGlzcGF0Y2goZHJvcEFuaW1hdGlvbkZpbmlzaGVkKCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICBmcmFtZUlkID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgIGZyYW1lSWQgPSBudWxsO1xuICAgICAgdW5iaW5kID0gYmluZEV2ZW50cyh3aW5kb3csIFtiaW5kaW5nXSk7XG4gICAgfSk7XG4gIH07XG59O1xuXG52YXIgZHJvcEFuaW1hdGlvbkZsdXNoT25TY3JvbGwgPSBkcm9wQW5pbWF0aW9uRmx1c2hPblNjcm9sbE1pZGRsZXdhcmU7XG5cbnZhciBkaW1lbnNpb25NYXJzaGFsU3RvcHBlciA9IChtYXJzaGFsID0+ICgpID0+IG5leHQgPT4gYWN0aW9uID0+IHtcbiAgaWYgKGFjdGlvbi50eXBlID09PSAnRFJPUF9DT01QTEVURScgfHwgYWN0aW9uLnR5cGUgPT09ICdGTFVTSCcgfHwgYWN0aW9uLnR5cGUgPT09ICdEUk9QX0FOSU1BVEUnKSB7XG4gICAgbWFyc2hhbC5zdG9wUHVibGlzaGluZygpO1xuICB9XG5cbiAgbmV4dChhY3Rpb24pO1xufSk7XG5cbnZhciBmb2N1cyA9IChtYXJzaGFsID0+IHtcbiAgbGV0IGlzV2F0Y2hpbmcgPSBmYWxzZTtcbiAgcmV0dXJuICgpID0+IG5leHQgPT4gYWN0aW9uID0+IHtcbiAgICBpZiAoYWN0aW9uLnR5cGUgPT09ICdJTklUSUFMX1BVQkxJU0gnKSB7XG4gICAgICBpc1dhdGNoaW5nID0gdHJ1ZTtcbiAgICAgIG1hcnNoYWwudHJ5UmVjb3JkRm9jdXMoYWN0aW9uLnBheWxvYWQuY3JpdGljYWwuZHJhZ2dhYmxlLmlkKTtcbiAgICAgIG5leHQoYWN0aW9uKTtcbiAgICAgIG1hcnNoYWwudHJ5UmVzdG9yZUZvY3VzUmVjb3JkZWQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBuZXh0KGFjdGlvbik7XG5cbiAgICBpZiAoIWlzV2F0Y2hpbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoYWN0aW9uLnR5cGUgPT09ICdGTFVTSCcpIHtcbiAgICAgIGlzV2F0Y2hpbmcgPSBmYWxzZTtcbiAgICAgIG1hcnNoYWwudHJ5UmVzdG9yZUZvY3VzUmVjb3JkZWQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoYWN0aW9uLnR5cGUgPT09ICdEUk9QX0NPTVBMRVRFJykge1xuICAgICAgaXNXYXRjaGluZyA9IGZhbHNlO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYWN0aW9uLnBheWxvYWQuY29tcGxldGVkLnJlc3VsdDtcblxuICAgICAgaWYgKHJlc3VsdC5jb21iaW5lKSB7XG4gICAgICAgIG1hcnNoYWwudHJ5U2hpZnRSZWNvcmQocmVzdWx0LmRyYWdnYWJsZUlkLCByZXN1bHQuY29tYmluZS5kcmFnZ2FibGVJZCk7XG4gICAgICB9XG5cbiAgICAgIG1hcnNoYWwudHJ5UmVzdG9yZUZvY3VzUmVjb3JkZWQoKTtcbiAgICB9XG4gIH07XG59KTtcblxuY29uc3Qgc2hvdWxkU3RvcCA9IGFjdGlvbiA9PiBhY3Rpb24udHlwZSA9PT0gJ0RST1BfQ09NUExFVEUnIHx8IGFjdGlvbi50eXBlID09PSAnRFJPUF9BTklNQVRFJyB8fCBhY3Rpb24udHlwZSA9PT0gJ0ZMVVNIJztcblxudmFyIGF1dG9TY3JvbGwgPSAoYXV0b1Njcm9sbGVyID0+IHN0b3JlID0+IG5leHQgPT4gYWN0aW9uID0+IHtcbiAgaWYgKHNob3VsZFN0b3AoYWN0aW9uKSkge1xuICAgIGF1dG9TY3JvbGxlci5zdG9wKCk7XG4gICAgbmV4dChhY3Rpb24pO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChhY3Rpb24udHlwZSA9PT0gJ0lOSVRJQUxfUFVCTElTSCcpIHtcbiAgICBuZXh0KGFjdGlvbik7XG4gICAgY29uc3Qgc3RhdGUgPSBzdG9yZS5nZXRTdGF0ZSgpO1xuICAgICEoc3RhdGUucGhhc2UgPT09ICdEUkFHR0lORycpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gaW52YXJpYW50KGZhbHNlLCAnRXhwZWN0ZWQgcGhhc2UgdG8gYmUgRFJBR0dJTkcgYWZ0ZXIgSU5JVElBTF9QVUJMSVNIJykgOiBpbnZhcmlhbnQoZmFsc2UpIDogdm9pZCAwO1xuICAgIGF1dG9TY3JvbGxlci5zdGFydChzdGF0ZSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbmV4dChhY3Rpb24pO1xuICBhdXRvU2Nyb2xsZXIuc2Nyb2xsKHN0b3JlLmdldFN0YXRlKCkpO1xufSk7XG5cbmNvbnN0IHBlbmRpbmdEcm9wID0gc3RvcmUgPT4gbmV4dCA9PiBhY3Rpb24gPT4ge1xuICBuZXh0KGFjdGlvbik7XG5cbiAgaWYgKGFjdGlvbi50eXBlICE9PSAnUFVCTElTSF9XSElMRV9EUkFHR0lORycpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBwb3N0QWN0aW9uU3RhdGUgPSBzdG9yZS5nZXRTdGF0ZSgpO1xuXG4gIGlmIChwb3N0QWN0aW9uU3RhdGUucGhhc2UgIT09ICdEUk9QX1BFTkRJTkcnKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHBvc3RBY3Rpb25TdGF0ZS5pc1dhaXRpbmcpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBzdG9yZS5kaXNwYXRjaChkcm9wJDEoe1xuICAgIHJlYXNvbjogcG9zdEFjdGlvblN0YXRlLnJlYXNvblxuICB9KSk7XG59O1xuXG52YXIgcGVuZGluZ0Ryb3AkMSA9IHBlbmRpbmdEcm9wO1xuXG5jb25zdCBjb21wb3NlRW5oYW5jZXJzID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuX19SRURVWF9ERVZUT09MU19FWFRFTlNJT05fQ09NUE9TRV9fID8gd2luZG93Ll9fUkVEVVhfREVWVE9PTFNfRVhURU5TSU9OX0NPTVBPU0VfXyh7XG4gIG5hbWU6ICdAaGVsbG8tcGFuZ2VhL2RuZCdcbn0pIDogcmVkdXguY29tcG9zZTtcbnZhciBjcmVhdGVTdG9yZSA9IChfcmVmID0+IHtcbiAgbGV0IHtcbiAgICBkaW1lbnNpb25NYXJzaGFsLFxuICAgIGZvY3VzTWFyc2hhbCxcbiAgICBzdHlsZU1hcnNoYWwsXG4gICAgZ2V0UmVzcG9uZGVycyxcbiAgICBhbm5vdW5jZSxcbiAgICBhdXRvU2Nyb2xsZXJcbiAgfSA9IF9yZWY7XG4gIHJldHVybiByZWR1eC5jcmVhdGVTdG9yZShyZWR1Y2VyLCBjb21wb3NlRW5oYW5jZXJzKHJlZHV4LmFwcGx5TWlkZGxld2FyZShzdHlsZShzdHlsZU1hcnNoYWwpLCBkaW1lbnNpb25NYXJzaGFsU3RvcHBlcihkaW1lbnNpb25NYXJzaGFsKSwgbGlmdChkaW1lbnNpb25NYXJzaGFsKSwgZHJvcCwgZHJvcEFuaW1hdGlvbkZpbmlzaCwgZHJvcEFuaW1hdGlvbkZsdXNoT25TY3JvbGwsIHBlbmRpbmdEcm9wJDEsIGF1dG9TY3JvbGwoYXV0b1Njcm9sbGVyKSwgc2Nyb2xsTGlzdGVuZXIkMSwgZm9jdXMoZm9jdXNNYXJzaGFsKSwgcmVzcG9uZGVycyhnZXRSZXNwb25kZXJzLCBhbm5vdW5jZSkpKSk7XG59KTtcblxuY29uc3QgY2xlYW4kMSA9ICgpID0+ICh7XG4gIGFkZGl0aW9uczoge30sXG4gIHJlbW92YWxzOiB7fSxcbiAgbW9kaWZpZWQ6IHt9XG59KTtcbmZ1bmN0aW9uIGNyZWF0ZVB1Ymxpc2hlcihfcmVmKSB7XG4gIGxldCB7XG4gICAgcmVnaXN0cnksXG4gICAgY2FsbGJhY2tzXG4gIH0gPSBfcmVmO1xuICBsZXQgc3RhZ2luZyA9IGNsZWFuJDEoKTtcbiAgbGV0IGZyYW1lSWQgPSBudWxsO1xuXG4gIGNvbnN0IGNvbGxlY3QgPSAoKSA9PiB7XG4gICAgaWYgKGZyYW1lSWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjYWxsYmFja3MuY29sbGVjdGlvblN0YXJ0aW5nKCk7XG4gICAgZnJhbWVJZCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICBmcmFtZUlkID0gbnVsbDtcbiAgICAgIHN0YXJ0KCk7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGFkZGl0aW9ucyxcbiAgICAgICAgcmVtb3ZhbHMsXG4gICAgICAgIG1vZGlmaWVkXG4gICAgICB9ID0gc3RhZ2luZztcbiAgICAgIGNvbnN0IGFkZGVkID0gT2JqZWN0LmtleXMoYWRkaXRpb25zKS5tYXAoaWQgPT4gcmVnaXN0cnkuZHJhZ2dhYmxlLmdldEJ5SWQoaWQpLmdldERpbWVuc2lvbihvcmlnaW4pKS5zb3J0KChhLCBiKSA9PiBhLmRlc2NyaXB0b3IuaW5kZXggLSBiLmRlc2NyaXB0b3IuaW5kZXgpO1xuICAgICAgY29uc3QgdXBkYXRlZCA9IE9iamVjdC5rZXlzKG1vZGlmaWVkKS5tYXAoaWQgPT4ge1xuICAgICAgICBjb25zdCBlbnRyeSA9IHJlZ2lzdHJ5LmRyb3BwYWJsZS5nZXRCeUlkKGlkKTtcbiAgICAgICAgY29uc3Qgc2Nyb2xsID0gZW50cnkuY2FsbGJhY2tzLmdldFNjcm9sbFdoaWxlRHJhZ2dpbmcoKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBkcm9wcGFibGVJZDogaWQsXG4gICAgICAgICAgc2Nyb2xsXG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICAgYWRkaXRpb25zOiBhZGRlZCxcbiAgICAgICAgcmVtb3ZhbHM6IE9iamVjdC5rZXlzKHJlbW92YWxzKSxcbiAgICAgICAgbW9kaWZpZWQ6IHVwZGF0ZWRcbiAgICAgIH07XG4gICAgICBzdGFnaW5nID0gY2xlYW4kMSgpO1xuICAgICAgZmluaXNoKCk7XG4gICAgICBjYWxsYmFja3MucHVibGlzaChyZXN1bHQpO1xuICAgIH0pO1xuICB9O1xuXG4gIGNvbnN0IGFkZCA9IGVudHJ5ID0+IHtcbiAgICBjb25zdCBpZCA9IGVudHJ5LmRlc2NyaXB0b3IuaWQ7XG4gICAgc3RhZ2luZy5hZGRpdGlvbnNbaWRdID0gZW50cnk7XG4gICAgc3RhZ2luZy5tb2RpZmllZFtlbnRyeS5kZXNjcmlwdG9yLmRyb3BwYWJsZUlkXSA9IHRydWU7XG5cbiAgICBpZiAoc3RhZ2luZy5yZW1vdmFsc1tpZF0pIHtcbiAgICAgIGRlbGV0ZSBzdGFnaW5nLnJlbW92YWxzW2lkXTtcbiAgICB9XG5cbiAgICBjb2xsZWN0KCk7XG4gIH07XG5cbiAgY29uc3QgcmVtb3ZlID0gZW50cnkgPT4ge1xuICAgIGNvbnN0IGRlc2NyaXB0b3IgPSBlbnRyeS5kZXNjcmlwdG9yO1xuICAgIHN0YWdpbmcucmVtb3ZhbHNbZGVzY3JpcHRvci5pZF0gPSB0cnVlO1xuICAgIHN0YWdpbmcubW9kaWZpZWRbZGVzY3JpcHRvci5kcm9wcGFibGVJZF0gPSB0cnVlO1xuXG4gICAgaWYgKHN0YWdpbmcuYWRkaXRpb25zW2Rlc2NyaXB0b3IuaWRdKSB7XG4gICAgICBkZWxldGUgc3RhZ2luZy5hZGRpdGlvbnNbZGVzY3JpcHRvci5pZF07XG4gICAgfVxuXG4gICAgY29sbGVjdCgpO1xuICB9O1xuXG4gIGNvbnN0IHN0b3AgPSAoKSA9PiB7XG4gICAgaWYgKCFmcmFtZUlkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUoZnJhbWVJZCk7XG4gICAgZnJhbWVJZCA9IG51bGw7XG4gICAgc3RhZ2luZyA9IGNsZWFuJDEoKTtcbiAgfTtcblxuICByZXR1cm4ge1xuICAgIGFkZCxcbiAgICByZW1vdmUsXG4gICAgc3RvcFxuICB9O1xufVxuXG52YXIgZ2V0TWF4U2Nyb2xsID0gKF9yZWYgPT4ge1xuICBsZXQge1xuICAgIHNjcm9sbEhlaWdodCxcbiAgICBzY3JvbGxXaWR0aCxcbiAgICBoZWlnaHQsXG4gICAgd2lkdGhcbiAgfSA9IF9yZWY7XG4gIGNvbnN0IG1heFNjcm9sbCA9IHN1YnRyYWN0KHtcbiAgICB4OiBzY3JvbGxXaWR0aCxcbiAgICB5OiBzY3JvbGxIZWlnaHRcbiAgfSwge1xuICAgIHg6IHdpZHRoLFxuICAgIHk6IGhlaWdodFxuICB9KTtcbiAgY29uc3QgYWRqdXN0ZWRNYXhTY3JvbGwgPSB7XG4gICAgeDogTWF0aC5tYXgoMCwgbWF4U2Nyb2xsLngpLFxuICAgIHk6IE1hdGgubWF4KDAsIG1heFNjcm9sbC55KVxuICB9O1xuICByZXR1cm4gYWRqdXN0ZWRNYXhTY3JvbGw7XG59KTtcblxudmFyIGdldERvY3VtZW50RWxlbWVudCA9ICgoKSA9PiB7XG4gIGNvbnN0IGRvYyA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgIWRvYyA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IGludmFyaWFudChmYWxzZSwgJ0Nhbm5vdCBmaW5kIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCcpIDogaW52YXJpYW50KGZhbHNlKSA6IHZvaWQgMDtcbiAgcmV0dXJuIGRvYztcbn0pO1xuXG52YXIgZ2V0TWF4V2luZG93U2Nyb2xsID0gKCgpID0+IHtcbiAgY29uc3QgZG9jID0gZ2V0RG9jdW1lbnRFbGVtZW50KCk7XG4gIGNvbnN0IG1heFNjcm9sbCA9IGdldE1heFNjcm9sbCh7XG4gICAgc2Nyb2xsSGVpZ2h0OiBkb2Muc2Nyb2xsSGVpZ2h0LFxuICAgIHNjcm9sbFdpZHRoOiBkb2Muc2Nyb2xsV2lkdGgsXG4gICAgd2lkdGg6IGRvYy5jbGllbnRXaWR0aCxcbiAgICBoZWlnaHQ6IGRvYy5jbGllbnRIZWlnaHRcbiAgfSk7XG4gIHJldHVybiBtYXhTY3JvbGw7XG59KTtcblxudmFyIGdldFZpZXdwb3J0ID0gKCgpID0+IHtcbiAgY29uc3Qgc2Nyb2xsID0gZ2V0V2luZG93U2Nyb2xsKCk7XG4gIGNvbnN0IG1heFNjcm9sbCA9IGdldE1heFdpbmRvd1Njcm9sbCgpO1xuICBjb25zdCB0b3AgPSBzY3JvbGwueTtcbiAgY29uc3QgbGVmdCA9IHNjcm9sbC54O1xuICBjb25zdCBkb2MgPSBnZXREb2N1bWVudEVsZW1lbnQoKTtcbiAgY29uc3Qgd2lkdGggPSBkb2MuY2xpZW50V2lkdGg7XG4gIGNvbnN0IGhlaWdodCA9IGRvYy5jbGllbnRIZWlnaHQ7XG4gIGNvbnN0IHJpZ2h0ID0gbGVmdCArIHdpZHRoO1xuICBjb25zdCBib3R0b20gPSB0b3AgKyBoZWlnaHQ7XG4gIGNvbnN0IGZyYW1lID0gY3NzQm94TW9kZWwuZ2V0UmVjdCh7XG4gICAgdG9wLFxuICAgIGxlZnQsXG4gICAgcmlnaHQsXG4gICAgYm90dG9tXG4gIH0pO1xuICBjb25zdCB2aWV3cG9ydCA9IHtcbiAgICBmcmFtZSxcbiAgICBzY3JvbGw6IHtcbiAgICAgIGluaXRpYWw6IHNjcm9sbCxcbiAgICAgIGN1cnJlbnQ6IHNjcm9sbCxcbiAgICAgIG1heDogbWF4U2Nyb2xsLFxuICAgICAgZGlmZjoge1xuICAgICAgICB2YWx1ZTogb3JpZ2luLFxuICAgICAgICBkaXNwbGFjZW1lbnQ6IG9yaWdpblxuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgcmV0dXJuIHZpZXdwb3J0O1xufSk7XG5cbnZhciBnZXRJbml0aWFsUHVibGlzaCA9IChfcmVmID0+IHtcbiAgbGV0IHtcbiAgICBjcml0aWNhbCxcbiAgICBzY3JvbGxPcHRpb25zLFxuICAgIHJlZ2lzdHJ5XG4gIH0gPSBfcmVmO1xuICBzdGFydCgpO1xuICBjb25zdCB2aWV3cG9ydCA9IGdldFZpZXdwb3J0KCk7XG4gIGNvbnN0IHdpbmRvd1Njcm9sbCA9IHZpZXdwb3J0LnNjcm9sbC5jdXJyZW50O1xuICBjb25zdCBob21lID0gY3JpdGljYWwuZHJvcHBhYmxlO1xuICBjb25zdCBkcm9wcGFibGVzID0gcmVnaXN0cnkuZHJvcHBhYmxlLmdldEFsbEJ5VHlwZShob21lLnR5cGUpLm1hcChlbnRyeSA9PiBlbnRyeS5jYWxsYmFja3MuZ2V0RGltZW5zaW9uQW5kV2F0Y2hTY3JvbGwod2luZG93U2Nyb2xsLCBzY3JvbGxPcHRpb25zKSk7XG4gIGNvbnN0IGRyYWdnYWJsZXMgPSByZWdpc3RyeS5kcmFnZ2FibGUuZ2V0QWxsQnlUeXBlKGNyaXRpY2FsLmRyYWdnYWJsZS50eXBlKS5tYXAoZW50cnkgPT4gZW50cnkuZ2V0RGltZW5zaW9uKHdpbmRvd1Njcm9sbCkpO1xuICBjb25zdCBkaW1lbnNpb25zID0ge1xuICAgIGRyYWdnYWJsZXM6IHRvRHJhZ2dhYmxlTWFwKGRyYWdnYWJsZXMpLFxuICAgIGRyb3BwYWJsZXM6IHRvRHJvcHBhYmxlTWFwKGRyb3BwYWJsZXMpXG4gIH07XG4gIGZpbmlzaCgpO1xuICBjb25zdCByZXN1bHQgPSB7XG4gICAgZGltZW5zaW9ucyxcbiAgICBjcml0aWNhbCxcbiAgICB2aWV3cG9ydFxuICB9O1xuICByZXR1cm4gcmVzdWx0O1xufSk7XG5cbmZ1bmN0aW9uIHNob3VsZFB1Ymxpc2hVcGRhdGUocmVnaXN0cnksIGRyYWdnaW5nLCBlbnRyeSkge1xuICBpZiAoZW50cnkuZGVzY3JpcHRvci5pZCA9PT0gZHJhZ2dpbmcuaWQpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoZW50cnkuZGVzY3JpcHRvci50eXBlICE9PSBkcmFnZ2luZy50eXBlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgaG9tZSA9IHJlZ2lzdHJ5LmRyb3BwYWJsZS5nZXRCeUlkKGVudHJ5LmRlc2NyaXB0b3IuZHJvcHBhYmxlSWQpO1xuXG4gIGlmIChob21lLmRlc2NyaXB0b3IubW9kZSAhPT0gJ3ZpcnR1YWwnKSB7XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gd2FybmluZyhgXG4gICAgICBZb3UgYXJlIGF0dGVtcHRpbmcgdG8gYWRkIG9yIHJlbW92ZSBhIERyYWdnYWJsZSBbaWQ6ICR7ZW50cnkuZGVzY3JpcHRvci5pZH1dXG4gICAgICB3aGlsZSBhIGRyYWcgaXMgb2NjdXJyaW5nLiBUaGlzIGlzIG9ubHkgc3VwcG9ydGVkIGZvciB2aXJ0dWFsIGxpc3RzLlxuXG4gICAgICBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2hlbGxvLXBhbmdlYS9kbmQvYmxvYi9tYWluL2RvY3MvcGF0dGVybnMvdmlydHVhbC1saXN0cy5tZFxuICAgIGApIDogdm9pZCAwO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG52YXIgY3JlYXRlRGltZW5zaW9uTWFyc2hhbCA9ICgocmVnaXN0cnksIGNhbGxiYWNrcykgPT4ge1xuICBsZXQgY29sbGVjdGlvbiA9IG51bGw7XG4gIGNvbnN0IHB1Ymxpc2hlciA9IGNyZWF0ZVB1Ymxpc2hlcih7XG4gICAgY2FsbGJhY2tzOiB7XG4gICAgICBwdWJsaXNoOiBjYWxsYmFja3MucHVibGlzaFdoaWxlRHJhZ2dpbmcsXG4gICAgICBjb2xsZWN0aW9uU3RhcnRpbmc6IGNhbGxiYWNrcy5jb2xsZWN0aW9uU3RhcnRpbmdcbiAgICB9LFxuICAgIHJlZ2lzdHJ5XG4gIH0pO1xuXG4gIGNvbnN0IHVwZGF0ZURyb3BwYWJsZUlzRW5hYmxlZCA9IChpZCwgaXNFbmFibGVkKSA9PiB7XG4gICAgIXJlZ2lzdHJ5LmRyb3BwYWJsZS5leGlzdHMoaWQpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gaW52YXJpYW50KGZhbHNlLCBgQ2Fubm90IHVwZGF0ZSBpcyBlbmFibGVkIGZsYWcgb2YgRHJvcHBhYmxlICR7aWR9IGFzIGl0IGlzIG5vdCByZWdpc3RlcmVkYCkgOiBpbnZhcmlhbnQoZmFsc2UpIDogdm9pZCAwO1xuXG4gICAgaWYgKCFjb2xsZWN0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY2FsbGJhY2tzLnVwZGF0ZURyb3BwYWJsZUlzRW5hYmxlZCh7XG4gICAgICBpZCxcbiAgICAgIGlzRW5hYmxlZFxuICAgIH0pO1xuICB9O1xuXG4gIGNvbnN0IHVwZGF0ZURyb3BwYWJsZUlzQ29tYmluZUVuYWJsZWQgPSAoaWQsIGlzQ29tYmluZUVuYWJsZWQpID0+IHtcbiAgICBpZiAoIWNvbGxlY3Rpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAhcmVnaXN0cnkuZHJvcHBhYmxlLmV4aXN0cyhpZCkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBpbnZhcmlhbnQoZmFsc2UsIGBDYW5ub3QgdXBkYXRlIGlzQ29tYmluZUVuYWJsZWQgZmxhZyBvZiBEcm9wcGFibGUgJHtpZH0gYXMgaXQgaXMgbm90IHJlZ2lzdGVyZWRgKSA6IGludmFyaWFudChmYWxzZSkgOiB2b2lkIDA7XG4gICAgY2FsbGJhY2tzLnVwZGF0ZURyb3BwYWJsZUlzQ29tYmluZUVuYWJsZWQoe1xuICAgICAgaWQsXG4gICAgICBpc0NvbWJpbmVFbmFibGVkXG4gICAgfSk7XG4gIH07XG5cbiAgY29uc3QgdXBkYXRlRHJvcHBhYmxlU2Nyb2xsID0gKGlkLCBuZXdTY3JvbGwpID0+IHtcbiAgICBpZiAoIWNvbGxlY3Rpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAhcmVnaXN0cnkuZHJvcHBhYmxlLmV4aXN0cyhpZCkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBpbnZhcmlhbnQoZmFsc2UsIGBDYW5ub3QgdXBkYXRlIHRoZSBzY3JvbGwgb24gRHJvcHBhYmxlICR7aWR9IGFzIGl0IGlzIG5vdCByZWdpc3RlcmVkYCkgOiBpbnZhcmlhbnQoZmFsc2UpIDogdm9pZCAwO1xuICAgIGNhbGxiYWNrcy51cGRhdGVEcm9wcGFibGVTY3JvbGwoe1xuICAgICAgaWQsXG4gICAgICBuZXdTY3JvbGxcbiAgICB9KTtcbiAgfTtcblxuICBjb25zdCBzY3JvbGxEcm9wcGFibGUgPSAoaWQsIGNoYW5nZSkgPT4ge1xuICAgIGlmICghY29sbGVjdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHJlZ2lzdHJ5LmRyb3BwYWJsZS5nZXRCeUlkKGlkKS5jYWxsYmFja3Muc2Nyb2xsKGNoYW5nZSk7XG4gIH07XG5cbiAgY29uc3Qgc3RvcFB1Ymxpc2hpbmcgPSAoKSA9PiB7XG4gICAgaWYgKCFjb2xsZWN0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcHVibGlzaGVyLnN0b3AoKTtcbiAgICBjb25zdCBob21lID0gY29sbGVjdGlvbi5jcml0aWNhbC5kcm9wcGFibGU7XG4gICAgcmVnaXN0cnkuZHJvcHBhYmxlLmdldEFsbEJ5VHlwZShob21lLnR5cGUpLmZvckVhY2goZW50cnkgPT4gZW50cnkuY2FsbGJhY2tzLmRyYWdTdG9wcGVkKCkpO1xuICAgIGNvbGxlY3Rpb24udW5zdWJzY3JpYmUoKTtcbiAgICBjb2xsZWN0aW9uID0gbnVsbDtcbiAgfTtcblxuICBjb25zdCBzdWJzY3JpYmVyID0gZXZlbnQgPT4ge1xuICAgICFjb2xsZWN0aW9uID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gaW52YXJpYW50KGZhbHNlLCAnU2hvdWxkIG9ubHkgYmUgc3Vic2NyaWJlZCB3aGVuIGEgY29sbGVjdGlvbiBpcyBvY2N1cnJpbmcnKSA6IGludmFyaWFudChmYWxzZSkgOiB2b2lkIDA7XG4gICAgY29uc3QgZHJhZ2dpbmcgPSBjb2xsZWN0aW9uLmNyaXRpY2FsLmRyYWdnYWJsZTtcblxuICAgIGlmIChldmVudC50eXBlID09PSAnQURESVRJT04nKSB7XG4gICAgICBpZiAoc2hvdWxkUHVibGlzaFVwZGF0ZShyZWdpc3RyeSwgZHJhZ2dpbmcsIGV2ZW50LnZhbHVlKSkge1xuICAgICAgICBwdWJsaXNoZXIuYWRkKGV2ZW50LnZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ1JFTU9WQUwnKSB7XG4gICAgICBpZiAoc2hvdWxkUHVibGlzaFVwZGF0ZShyZWdpc3RyeSwgZHJhZ2dpbmcsIGV2ZW50LnZhbHVlKSkge1xuICAgICAgICBwdWJsaXNoZXIucmVtb3ZlKGV2ZW50LnZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgY29uc3Qgc3RhcnRQdWJsaXNoaW5nID0gcmVxdWVzdCA9PiB7XG4gICAgISFjb2xsZWN0aW9uID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gaW52YXJpYW50KGZhbHNlLCAnQ2Fubm90IHN0YXJ0IGNhcHR1cmluZyBjcml0aWNhbCBkaW1lbnNpb25zIGFzIHRoZXJlIGlzIGFscmVhZHkgYSBjb2xsZWN0aW9uJykgOiBpbnZhcmlhbnQoZmFsc2UpIDogdm9pZCAwO1xuICAgIGNvbnN0IGVudHJ5ID0gcmVnaXN0cnkuZHJhZ2dhYmxlLmdldEJ5SWQocmVxdWVzdC5kcmFnZ2FibGVJZCk7XG4gICAgY29uc3QgaG9tZSA9IHJlZ2lzdHJ5LmRyb3BwYWJsZS5nZXRCeUlkKGVudHJ5LmRlc2NyaXB0b3IuZHJvcHBhYmxlSWQpO1xuICAgIGNvbnN0IGNyaXRpY2FsID0ge1xuICAgICAgZHJhZ2dhYmxlOiBlbnRyeS5kZXNjcmlwdG9yLFxuICAgICAgZHJvcHBhYmxlOiBob21lLmRlc2NyaXB0b3JcbiAgICB9O1xuICAgIGNvbnN0IHVuc3Vic2NyaWJlID0gcmVnaXN0cnkuc3Vic2NyaWJlKHN1YnNjcmliZXIpO1xuICAgIGNvbGxlY3Rpb24gPSB7XG4gICAgICBjcml0aWNhbCxcbiAgICAgIHVuc3Vic2NyaWJlXG4gICAgfTtcbiAgICByZXR1cm4gZ2V0SW5pdGlhbFB1Ymxpc2goe1xuICAgICAgY3JpdGljYWwsXG4gICAgICByZWdpc3RyeSxcbiAgICAgIHNjcm9sbE9wdGlvbnM6IHJlcXVlc3Quc2Nyb2xsT3B0aW9uc1xuICAgIH0pO1xuICB9O1xuXG4gIGNvbnN0IG1hcnNoYWwgPSB7XG4gICAgdXBkYXRlRHJvcHBhYmxlSXNFbmFibGVkLFxuICAgIHVwZGF0ZURyb3BwYWJsZUlzQ29tYmluZUVuYWJsZWQsXG4gICAgc2Nyb2xsRHJvcHBhYmxlLFxuICAgIHVwZGF0ZURyb3BwYWJsZVNjcm9sbCxcbiAgICBzdGFydFB1Ymxpc2hpbmcsXG4gICAgc3RvcFB1Ymxpc2hpbmdcbiAgfTtcbiAgcmV0dXJuIG1hcnNoYWw7XG59KTtcblxudmFyIGNhblN0YXJ0RHJhZyA9ICgoc3RhdGUsIGlkKSA9PiB7XG4gIGlmIChzdGF0ZS5waGFzZSA9PT0gJ0lETEUnKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoc3RhdGUucGhhc2UgIT09ICdEUk9QX0FOSU1BVElORycpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoc3RhdGUuY29tcGxldGVkLnJlc3VsdC5kcmFnZ2FibGVJZCA9PT0gaWQpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gc3RhdGUuY29tcGxldGVkLnJlc3VsdC5yZWFzb24gPT09ICdEUk9QJztcbn0pO1xuXG52YXIgc2Nyb2xsV2luZG93ID0gKGNoYW5nZSA9PiB7XG4gIHdpbmRvdy5zY3JvbGxCeShjaGFuZ2UueCwgY2hhbmdlLnkpO1xufSk7XG5cbmNvbnN0IGdldFNjcm9sbGFibGVEcm9wcGFibGVzID0gbWVtb2l6ZU9uZV9fZGVmYXVsdFtcImRlZmF1bHRcIl0oZHJvcHBhYmxlcyA9PiB0b0Ryb3BwYWJsZUxpc3QoZHJvcHBhYmxlcykuZmlsdGVyKGRyb3BwYWJsZSA9PiB7XG4gIGlmICghZHJvcHBhYmxlLmlzRW5hYmxlZCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghZHJvcHBhYmxlLmZyYW1lKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59KSk7XG5cbmNvbnN0IGdldFNjcm9sbGFibGVEcm9wcGFibGVPdmVyID0gKHRhcmdldCwgZHJvcHBhYmxlcykgPT4ge1xuICBjb25zdCBtYXliZSA9IGdldFNjcm9sbGFibGVEcm9wcGFibGVzKGRyb3BwYWJsZXMpLmZpbmQoZHJvcHBhYmxlID0+IHtcbiAgICAhZHJvcHBhYmxlLmZyYW1lID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gaW52YXJpYW50KGZhbHNlLCAnSW52YWxpZCByZXN1bHQnKSA6IGludmFyaWFudChmYWxzZSkgOiB2b2lkIDA7XG4gICAgcmV0dXJuIGlzUG9zaXRpb25JbkZyYW1lKGRyb3BwYWJsZS5mcmFtZS5wYWdlTWFyZ2luQm94KSh0YXJnZXQpO1xuICB9KSB8fCBudWxsO1xuICByZXR1cm4gbWF5YmU7XG59O1xuXG52YXIgZ2V0QmVzdFNjcm9sbGFibGVEcm9wcGFibGUgPSAoX3JlZiA9PiB7XG4gIGxldCB7XG4gICAgY2VudGVyLFxuICAgIGRlc3RpbmF0aW9uLFxuICAgIGRyb3BwYWJsZXNcbiAgfSA9IF9yZWY7XG5cbiAgaWYgKGRlc3RpbmF0aW9uKSB7XG4gICAgY29uc3QgZGltZW5zaW9uID0gZHJvcHBhYmxlc1tkZXN0aW5hdGlvbl07XG5cbiAgICBpZiAoIWRpbWVuc2lvbi5mcmFtZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRpbWVuc2lvbjtcbiAgfVxuXG4gIGNvbnN0IGRpbWVuc2lvbiA9IGdldFNjcm9sbGFibGVEcm9wcGFibGVPdmVyKGNlbnRlciwgZHJvcHBhYmxlcyk7XG4gIHJldHVybiBkaW1lbnNpb247XG59KTtcblxuY29uc3QgY29uZmlnID0ge1xuICBzdGFydEZyb21QZXJjZW50YWdlOiAwLjI1LFxuICBtYXhTY3JvbGxBdFBlcmNlbnRhZ2U6IDAuMDUsXG4gIG1heFBpeGVsU2Nyb2xsOiAyOCxcbiAgZWFzZTogcGVyY2VudGFnZSA9PiBwZXJjZW50YWdlICoqIDIsXG4gIGR1cmF0aW9uRGFtcGVuaW5nOiB7XG4gICAgc3RvcERhbXBlbmluZ0F0OiAxMjAwLFxuICAgIGFjY2VsZXJhdGVBdDogMzYwXG4gIH1cbn07XG52YXIgY29uZmlnJDEgPSBjb25maWc7XG5cbnZhciBnZXREaXN0YW5jZVRocmVzaG9sZHMgPSAoKGNvbnRhaW5lciwgYXhpcykgPT4ge1xuICBjb25zdCBzdGFydFNjcm9sbGluZ0Zyb20gPSBjb250YWluZXJbYXhpcy5zaXplXSAqIGNvbmZpZyQxLnN0YXJ0RnJvbVBlcmNlbnRhZ2U7XG4gIGNvbnN0IG1heFNjcm9sbFZhbHVlQXQgPSBjb250YWluZXJbYXhpcy5zaXplXSAqIGNvbmZpZyQxLm1heFNjcm9sbEF0UGVyY2VudGFnZTtcbiAgY29uc3QgdGhyZXNob2xkcyA9IHtcbiAgICBzdGFydFNjcm9sbGluZ0Zyb20sXG4gICAgbWF4U2Nyb2xsVmFsdWVBdFxuICB9O1xuICByZXR1cm4gdGhyZXNob2xkcztcbn0pO1xuXG52YXIgZ2V0UGVyY2VudGFnZSA9IChfcmVmID0+IHtcbiAgbGV0IHtcbiAgICBzdGFydE9mUmFuZ2UsXG4gICAgZW5kT2ZSYW5nZSxcbiAgICBjdXJyZW50XG4gIH0gPSBfcmVmO1xuICBjb25zdCByYW5nZSA9IGVuZE9mUmFuZ2UgLSBzdGFydE9mUmFuZ2U7XG5cbiAgaWYgKHJhbmdlID09PSAwKSB7XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gd2FybmluZyhgXG4gICAgICBEZXRlY3RlZCBkaXN0YW5jZSByYW5nZSBvZiAwIGluIHRoZSBmbHVpZCBhdXRvIHNjcm9sbGVyXG4gICAgICBUaGlzIGlzIHVuZXhwZWN0ZWQgYW5kIHdvdWxkIGNhdXNlIGEgZGl2aWRlIGJ5IDAgaXNzdWUuXG4gICAgICBOb3QgYWxsb3dpbmcgYW4gYXV0byBzY3JvbGxcbiAgICBgKSA6IHZvaWQgMDtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGNvbnN0IGN1cnJlbnRJblJhbmdlID0gY3VycmVudCAtIHN0YXJ0T2ZSYW5nZTtcbiAgY29uc3QgcGVyY2VudGFnZSA9IGN1cnJlbnRJblJhbmdlIC8gcmFuZ2U7XG4gIHJldHVybiBwZXJjZW50YWdlO1xufSk7XG5cbnZhciBtaW5TY3JvbGwgPSAxO1xuXG52YXIgZ2V0VmFsdWVGcm9tRGlzdGFuY2UgPSAoKGRpc3RhbmNlVG9FZGdlLCB0aHJlc2hvbGRzKSA9PiB7XG4gIGlmIChkaXN0YW5jZVRvRWRnZSA+IHRocmVzaG9sZHMuc3RhcnRTY3JvbGxpbmdGcm9tKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBpZiAoZGlzdGFuY2VUb0VkZ2UgPD0gdGhyZXNob2xkcy5tYXhTY3JvbGxWYWx1ZUF0KSB7XG4gICAgcmV0dXJuIGNvbmZpZyQxLm1heFBpeGVsU2Nyb2xsO1xuICB9XG5cbiAgaWYgKGRpc3RhbmNlVG9FZGdlID09PSB0aHJlc2hvbGRzLnN0YXJ0U2Nyb2xsaW5nRnJvbSkge1xuICAgIHJldHVybiBtaW5TY3JvbGw7XG4gIH1cblxuICBjb25zdCBwZXJjZW50YWdlRnJvbU1heFNjcm9sbFZhbHVlQXQgPSBnZXRQZXJjZW50YWdlKHtcbiAgICBzdGFydE9mUmFuZ2U6IHRocmVzaG9sZHMubWF4U2Nyb2xsVmFsdWVBdCxcbiAgICBlbmRPZlJhbmdlOiB0aHJlc2hvbGRzLnN0YXJ0U2Nyb2xsaW5nRnJvbSxcbiAgICBjdXJyZW50OiBkaXN0YW5jZVRvRWRnZVxuICB9KTtcbiAgY29uc3QgcGVyY2VudGFnZUZyb21TdGFydFNjcm9sbGluZ0Zyb20gPSAxIC0gcGVyY2VudGFnZUZyb21NYXhTY3JvbGxWYWx1ZUF0O1xuICBjb25zdCBzY3JvbGwgPSBjb25maWckMS5tYXhQaXhlbFNjcm9sbCAqIGNvbmZpZyQxLmVhc2UocGVyY2VudGFnZUZyb21TdGFydFNjcm9sbGluZ0Zyb20pO1xuICByZXR1cm4gTWF0aC5jZWlsKHNjcm9sbCk7XG59KTtcblxuY29uc3QgYWNjZWxlcmF0ZUF0ID0gY29uZmlnJDEuZHVyYXRpb25EYW1wZW5pbmcuYWNjZWxlcmF0ZUF0O1xuY29uc3Qgc3RvcEF0ID0gY29uZmlnJDEuZHVyYXRpb25EYW1wZW5pbmcuc3RvcERhbXBlbmluZ0F0O1xudmFyIGRhbXBlblZhbHVlQnlUaW1lID0gKChwcm9wb3NlZFNjcm9sbCwgZHJhZ1N0YXJ0VGltZSkgPT4ge1xuICBjb25zdCBzdGFydE9mUmFuZ2UgPSBkcmFnU3RhcnRUaW1lO1xuICBjb25zdCBlbmRPZlJhbmdlID0gc3RvcEF0O1xuICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICBjb25zdCBydW5UaW1lID0gbm93IC0gc3RhcnRPZlJhbmdlO1xuXG4gIGlmIChydW5UaW1lID49IHN0b3BBdCkge1xuICAgIHJldHVybiBwcm9wb3NlZFNjcm9sbDtcbiAgfVxuXG4gIGlmIChydW5UaW1lIDwgYWNjZWxlcmF0ZUF0KSB7XG4gICAgcmV0dXJuIG1pblNjcm9sbDtcbiAgfVxuXG4gIGNvbnN0IGJldHdlZW5BY2NlbGVyYXRlQXRBbmRTdG9wQXRQZXJjZW50YWdlID0gZ2V0UGVyY2VudGFnZSh7XG4gICAgc3RhcnRPZlJhbmdlOiBhY2NlbGVyYXRlQXQsXG4gICAgZW5kT2ZSYW5nZSxcbiAgICBjdXJyZW50OiBydW5UaW1lXG4gIH0pO1xuICBjb25zdCBzY3JvbGwgPSBwcm9wb3NlZFNjcm9sbCAqIGNvbmZpZyQxLmVhc2UoYmV0d2VlbkFjY2VsZXJhdGVBdEFuZFN0b3BBdFBlcmNlbnRhZ2UpO1xuICByZXR1cm4gTWF0aC5jZWlsKHNjcm9sbCk7XG59KTtcblxudmFyIGdldFZhbHVlID0gKF9yZWYgPT4ge1xuICBsZXQge1xuICAgIGRpc3RhbmNlVG9FZGdlLFxuICAgIHRocmVzaG9sZHMsXG4gICAgZHJhZ1N0YXJ0VGltZSxcbiAgICBzaG91bGRVc2VUaW1lRGFtcGVuaW5nXG4gIH0gPSBfcmVmO1xuICBjb25zdCBzY3JvbGwgPSBnZXRWYWx1ZUZyb21EaXN0YW5jZShkaXN0YW5jZVRvRWRnZSwgdGhyZXNob2xkcyk7XG5cbiAgaWYgKHNjcm9sbCA9PT0gMCkge1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgaWYgKCFzaG91bGRVc2VUaW1lRGFtcGVuaW5nKSB7XG4gICAgcmV0dXJuIHNjcm9sbDtcbiAgfVxuXG4gIHJldHVybiBNYXRoLm1heChkYW1wZW5WYWx1ZUJ5VGltZShzY3JvbGwsIGRyYWdTdGFydFRpbWUpLCBtaW5TY3JvbGwpO1xufSk7XG5cbnZhciBnZXRTY3JvbGxPbkF4aXMgPSAoX3JlZiA9PiB7XG4gIGxldCB7XG4gICAgY29udGFpbmVyLFxuICAgIGRpc3RhbmNlVG9FZGdlcyxcbiAgICBkcmFnU3RhcnRUaW1lLFxuICAgIGF4aXMsXG4gICAgc2hvdWxkVXNlVGltZURhbXBlbmluZ1xuICB9ID0gX3JlZjtcbiAgY29uc3QgdGhyZXNob2xkcyA9IGdldERpc3RhbmNlVGhyZXNob2xkcyhjb250YWluZXIsIGF4aXMpO1xuICBjb25zdCBpc0Nsb3NlclRvRW5kID0gZGlzdGFuY2VUb0VkZ2VzW2F4aXMuZW5kXSA8IGRpc3RhbmNlVG9FZGdlc1theGlzLnN0YXJ0XTtcblxuICBpZiAoaXNDbG9zZXJUb0VuZCkge1xuICAgIHJldHVybiBnZXRWYWx1ZSh7XG4gICAgICBkaXN0YW5jZVRvRWRnZTogZGlzdGFuY2VUb0VkZ2VzW2F4aXMuZW5kXSxcbiAgICAgIHRocmVzaG9sZHMsXG4gICAgICBkcmFnU3RhcnRUaW1lLFxuICAgICAgc2hvdWxkVXNlVGltZURhbXBlbmluZ1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIC0xICogZ2V0VmFsdWUoe1xuICAgIGRpc3RhbmNlVG9FZGdlOiBkaXN0YW5jZVRvRWRnZXNbYXhpcy5zdGFydF0sXG4gICAgdGhyZXNob2xkcyxcbiAgICBkcmFnU3RhcnRUaW1lLFxuICAgIHNob3VsZFVzZVRpbWVEYW1wZW5pbmdcbiAgfSk7XG59KTtcblxudmFyIGFkanVzdEZvclNpemVMaW1pdHMgPSAoX3JlZiA9PiB7XG4gIGxldCB7XG4gICAgY29udGFpbmVyLFxuICAgIHN1YmplY3QsXG4gICAgcHJvcG9zZWRTY3JvbGxcbiAgfSA9IF9yZWY7XG4gIGNvbnN0IGlzVG9vQmlnVmVydGljYWxseSA9IHN1YmplY3QuaGVpZ2h0ID4gY29udGFpbmVyLmhlaWdodDtcbiAgY29uc3QgaXNUb29CaWdIb3Jpem9udGFsbHkgPSBzdWJqZWN0LndpZHRoID4gY29udGFpbmVyLndpZHRoO1xuXG4gIGlmICghaXNUb29CaWdIb3Jpem9udGFsbHkgJiYgIWlzVG9vQmlnVmVydGljYWxseSkge1xuICAgIHJldHVybiBwcm9wb3NlZFNjcm9sbDtcbiAgfVxuXG4gIGlmIChpc1Rvb0JpZ0hvcml6b250YWxseSAmJiBpc1Rvb0JpZ1ZlcnRpY2FsbHkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgeDogaXNUb29CaWdIb3Jpem9udGFsbHkgPyAwIDogcHJvcG9zZWRTY3JvbGwueCxcbiAgICB5OiBpc1Rvb0JpZ1ZlcnRpY2FsbHkgPyAwIDogcHJvcG9zZWRTY3JvbGwueVxuICB9O1xufSk7XG5cbmNvbnN0IGNsZWFuID0gYXBwbHkodmFsdWUgPT4gdmFsdWUgPT09IDAgPyAwIDogdmFsdWUpO1xudmFyIGdldFNjcm9sbCQxID0gKF9yZWYgPT4ge1xuICBsZXQge1xuICAgIGRyYWdTdGFydFRpbWUsXG4gICAgY29udGFpbmVyLFxuICAgIHN1YmplY3QsXG4gICAgY2VudGVyLFxuICAgIHNob3VsZFVzZVRpbWVEYW1wZW5pbmdcbiAgfSA9IF9yZWY7XG4gIGNvbnN0IGRpc3RhbmNlVG9FZGdlcyA9IHtcbiAgICB0b3A6IGNlbnRlci55IC0gY29udGFpbmVyLnRvcCxcbiAgICByaWdodDogY29udGFpbmVyLnJpZ2h0IC0gY2VudGVyLngsXG4gICAgYm90dG9tOiBjb250YWluZXIuYm90dG9tIC0gY2VudGVyLnksXG4gICAgbGVmdDogY2VudGVyLnggLSBjb250YWluZXIubGVmdFxuICB9O1xuICBjb25zdCB5ID0gZ2V0U2Nyb2xsT25BeGlzKHtcbiAgICBjb250YWluZXIsXG4gICAgZGlzdGFuY2VUb0VkZ2VzLFxuICAgIGRyYWdTdGFydFRpbWUsXG4gICAgYXhpczogdmVydGljYWwsXG4gICAgc2hvdWxkVXNlVGltZURhbXBlbmluZ1xuICB9KTtcbiAgY29uc3QgeCA9IGdldFNjcm9sbE9uQXhpcyh7XG4gICAgY29udGFpbmVyLFxuICAgIGRpc3RhbmNlVG9FZGdlcyxcbiAgICBkcmFnU3RhcnRUaW1lLFxuICAgIGF4aXM6IGhvcml6b250YWwsXG4gICAgc2hvdWxkVXNlVGltZURhbXBlbmluZ1xuICB9KTtcbiAgY29uc3QgcmVxdWlyZWQgPSBjbGVhbih7XG4gICAgeCxcbiAgICB5XG4gIH0pO1xuXG4gIGlmIChpc0VxdWFsJDEocmVxdWlyZWQsIG9yaWdpbikpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IGxpbWl0ZWQgPSBhZGp1c3RGb3JTaXplTGltaXRzKHtcbiAgICBjb250YWluZXIsXG4gICAgc3ViamVjdCxcbiAgICBwcm9wb3NlZFNjcm9sbDogcmVxdWlyZWRcbiAgfSk7XG5cbiAgaWYgKCFsaW1pdGVkKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4gaXNFcXVhbCQxKGxpbWl0ZWQsIG9yaWdpbikgPyBudWxsIDogbGltaXRlZDtcbn0pO1xuXG5jb25zdCBzbWFsbGVzdFNpZ25lZCA9IGFwcGx5KHZhbHVlID0+IHtcbiAgaWYgKHZhbHVlID09PSAwKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICByZXR1cm4gdmFsdWUgPiAwID8gMSA6IC0xO1xufSk7XG5jb25zdCBnZXRPdmVybGFwID0gKCgpID0+IHtcbiAgY29uc3QgZ2V0UmVtYWluZGVyID0gKHRhcmdldCwgbWF4KSA9PiB7XG4gICAgaWYgKHRhcmdldCA8IDApIHtcbiAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfVxuXG4gICAgaWYgKHRhcmdldCA+IG1heCkge1xuICAgICAgcmV0dXJuIHRhcmdldCAtIG1heDtcbiAgICB9XG5cbiAgICByZXR1cm4gMDtcbiAgfTtcblxuICByZXR1cm4gX3JlZiA9PiB7XG4gICAgbGV0IHtcbiAgICAgIGN1cnJlbnQsXG4gICAgICBtYXgsXG4gICAgICBjaGFuZ2VcbiAgICB9ID0gX3JlZjtcbiAgICBjb25zdCB0YXJnZXRTY3JvbGwgPSBhZGQoY3VycmVudCwgY2hhbmdlKTtcbiAgICBjb25zdCBvdmVybGFwID0ge1xuICAgICAgeDogZ2V0UmVtYWluZGVyKHRhcmdldFNjcm9sbC54LCBtYXgueCksXG4gICAgICB5OiBnZXRSZW1haW5kZXIodGFyZ2V0U2Nyb2xsLnksIG1heC55KVxuICAgIH07XG5cbiAgICBpZiAoaXNFcXVhbCQxKG92ZXJsYXAsIG9yaWdpbikpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBvdmVybGFwO1xuICB9O1xufSkoKTtcbmNvbnN0IGNhblBhcnRpYWxseVNjcm9sbCA9IF9yZWYyID0+IHtcbiAgbGV0IHtcbiAgICBtYXg6IHJhd01heCxcbiAgICBjdXJyZW50LFxuICAgIGNoYW5nZVxuICB9ID0gX3JlZjI7XG4gIGNvbnN0IG1heCA9IHtcbiAgICB4OiBNYXRoLm1heChjdXJyZW50LngsIHJhd01heC54KSxcbiAgICB5OiBNYXRoLm1heChjdXJyZW50LnksIHJhd01heC55KVxuICB9O1xuICBjb25zdCBzbWFsbGVzdENoYW5nZSA9IHNtYWxsZXN0U2lnbmVkKGNoYW5nZSk7XG4gIGNvbnN0IG92ZXJsYXAgPSBnZXRPdmVybGFwKHtcbiAgICBtYXgsXG4gICAgY3VycmVudCxcbiAgICBjaGFuZ2U6IHNtYWxsZXN0Q2hhbmdlXG4gIH0pO1xuXG4gIGlmICghb3ZlcmxhcCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKHNtYWxsZXN0Q2hhbmdlLnggIT09IDAgJiYgb3ZlcmxhcC54ID09PSAwKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoc21hbGxlc3RDaGFuZ2UueSAhPT0gMCAmJiBvdmVybGFwLnkgPT09IDApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn07XG5jb25zdCBjYW5TY3JvbGxXaW5kb3cgPSAodmlld3BvcnQsIGNoYW5nZSkgPT4gY2FuUGFydGlhbGx5U2Nyb2xsKHtcbiAgY3VycmVudDogdmlld3BvcnQuc2Nyb2xsLmN1cnJlbnQsXG4gIG1heDogdmlld3BvcnQuc2Nyb2xsLm1heCxcbiAgY2hhbmdlXG59KTtcbmNvbnN0IGdldFdpbmRvd092ZXJsYXAgPSAodmlld3BvcnQsIGNoYW5nZSkgPT4ge1xuICBpZiAoIWNhblNjcm9sbFdpbmRvdyh2aWV3cG9ydCwgY2hhbmdlKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgbWF4ID0gdmlld3BvcnQuc2Nyb2xsLm1heDtcbiAgY29uc3QgY3VycmVudCA9IHZpZXdwb3J0LnNjcm9sbC5jdXJyZW50O1xuICByZXR1cm4gZ2V0T3ZlcmxhcCh7XG4gICAgY3VycmVudCxcbiAgICBtYXgsXG4gICAgY2hhbmdlXG4gIH0pO1xufTtcbmNvbnN0IGNhblNjcm9sbERyb3BwYWJsZSA9IChkcm9wcGFibGUsIGNoYW5nZSkgPT4ge1xuICBjb25zdCBmcmFtZSA9IGRyb3BwYWJsZS5mcmFtZTtcblxuICBpZiAoIWZyYW1lKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIGNhblBhcnRpYWxseVNjcm9sbCh7XG4gICAgY3VycmVudDogZnJhbWUuc2Nyb2xsLmN1cnJlbnQsXG4gICAgbWF4OiBmcmFtZS5zY3JvbGwubWF4LFxuICAgIGNoYW5nZVxuICB9KTtcbn07XG5jb25zdCBnZXREcm9wcGFibGVPdmVybGFwID0gKGRyb3BwYWJsZSwgY2hhbmdlKSA9PiB7XG4gIGNvbnN0IGZyYW1lID0gZHJvcHBhYmxlLmZyYW1lO1xuXG4gIGlmICghZnJhbWUpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmICghY2FuU2Nyb2xsRHJvcHBhYmxlKGRyb3BwYWJsZSwgY2hhbmdlKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIGdldE92ZXJsYXAoe1xuICAgIGN1cnJlbnQ6IGZyYW1lLnNjcm9sbC5jdXJyZW50LFxuICAgIG1heDogZnJhbWUuc2Nyb2xsLm1heCxcbiAgICBjaGFuZ2VcbiAgfSk7XG59O1xuXG52YXIgZ2V0V2luZG93U2Nyb2xsQ2hhbmdlID0gKF9yZWYgPT4ge1xuICBsZXQge1xuICAgIHZpZXdwb3J0LFxuICAgIHN1YmplY3QsXG4gICAgY2VudGVyLFxuICAgIGRyYWdTdGFydFRpbWUsXG4gICAgc2hvdWxkVXNlVGltZURhbXBlbmluZ1xuICB9ID0gX3JlZjtcbiAgY29uc3Qgc2Nyb2xsID0gZ2V0U2Nyb2xsJDEoe1xuICAgIGRyYWdTdGFydFRpbWUsXG4gICAgY29udGFpbmVyOiB2aWV3cG9ydC5mcmFtZSxcbiAgICBzdWJqZWN0LFxuICAgIGNlbnRlcixcbiAgICBzaG91bGRVc2VUaW1lRGFtcGVuaW5nXG4gIH0pO1xuICByZXR1cm4gc2Nyb2xsICYmIGNhblNjcm9sbFdpbmRvdyh2aWV3cG9ydCwgc2Nyb2xsKSA/IHNjcm9sbCA6IG51bGw7XG59KTtcblxudmFyIGdldERyb3BwYWJsZVNjcm9sbENoYW5nZSA9IChfcmVmID0+IHtcbiAgbGV0IHtcbiAgICBkcm9wcGFibGUsXG4gICAgc3ViamVjdCxcbiAgICBjZW50ZXIsXG4gICAgZHJhZ1N0YXJ0VGltZSxcbiAgICBzaG91bGRVc2VUaW1lRGFtcGVuaW5nXG4gIH0gPSBfcmVmO1xuICBjb25zdCBmcmFtZSA9IGRyb3BwYWJsZS5mcmFtZTtcblxuICBpZiAoIWZyYW1lKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBzY3JvbGwgPSBnZXRTY3JvbGwkMSh7XG4gICAgZHJhZ1N0YXJ0VGltZSxcbiAgICBjb250YWluZXI6IGZyYW1lLnBhZ2VNYXJnaW5Cb3gsXG4gICAgc3ViamVjdCxcbiAgICBjZW50ZXIsXG4gICAgc2hvdWxkVXNlVGltZURhbXBlbmluZ1xuICB9KTtcbiAgcmV0dXJuIHNjcm9sbCAmJiBjYW5TY3JvbGxEcm9wcGFibGUoZHJvcHBhYmxlLCBzY3JvbGwpID8gc2Nyb2xsIDogbnVsbDtcbn0pO1xuXG52YXIgc2Nyb2xsID0gKF9yZWYgPT4ge1xuICBsZXQge1xuICAgIHN0YXRlLFxuICAgIGRyYWdTdGFydFRpbWUsXG4gICAgc2hvdWxkVXNlVGltZURhbXBlbmluZyxcbiAgICBzY3JvbGxXaW5kb3csXG4gICAgc2Nyb2xsRHJvcHBhYmxlXG4gIH0gPSBfcmVmO1xuICBjb25zdCBjZW50ZXIgPSBzdGF0ZS5jdXJyZW50LnBhZ2UuYm9yZGVyQm94Q2VudGVyO1xuICBjb25zdCBkcmFnZ2FibGUgPSBzdGF0ZS5kaW1lbnNpb25zLmRyYWdnYWJsZXNbc3RhdGUuY3JpdGljYWwuZHJhZ2dhYmxlLmlkXTtcbiAgY29uc3Qgc3ViamVjdCA9IGRyYWdnYWJsZS5wYWdlLm1hcmdpbkJveDtcblxuICBpZiAoc3RhdGUuaXNXaW5kb3dTY3JvbGxBbGxvd2VkKSB7XG4gICAgY29uc3Qgdmlld3BvcnQgPSBzdGF0ZS52aWV3cG9ydDtcbiAgICBjb25zdCBjaGFuZ2UgPSBnZXRXaW5kb3dTY3JvbGxDaGFuZ2Uoe1xuICAgICAgZHJhZ1N0YXJ0VGltZSxcbiAgICAgIHZpZXdwb3J0LFxuICAgICAgc3ViamVjdCxcbiAgICAgIGNlbnRlcixcbiAgICAgIHNob3VsZFVzZVRpbWVEYW1wZW5pbmdcbiAgICB9KTtcblxuICAgIGlmIChjaGFuZ2UpIHtcbiAgICAgIHNjcm9sbFdpbmRvdyhjaGFuZ2UpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGRyb3BwYWJsZSA9IGdldEJlc3RTY3JvbGxhYmxlRHJvcHBhYmxlKHtcbiAgICBjZW50ZXIsXG4gICAgZGVzdGluYXRpb246IHdoYXRJc0RyYWdnZWRPdmVyKHN0YXRlLmltcGFjdCksXG4gICAgZHJvcHBhYmxlczogc3RhdGUuZGltZW5zaW9ucy5kcm9wcGFibGVzXG4gIH0pO1xuXG4gIGlmICghZHJvcHBhYmxlKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgY2hhbmdlID0gZ2V0RHJvcHBhYmxlU2Nyb2xsQ2hhbmdlKHtcbiAgICBkcmFnU3RhcnRUaW1lLFxuICAgIGRyb3BwYWJsZSxcbiAgICBzdWJqZWN0LFxuICAgIGNlbnRlcixcbiAgICBzaG91bGRVc2VUaW1lRGFtcGVuaW5nXG4gIH0pO1xuXG4gIGlmIChjaGFuZ2UpIHtcbiAgICBzY3JvbGxEcm9wcGFibGUoZHJvcHBhYmxlLmRlc2NyaXB0b3IuaWQsIGNoYW5nZSk7XG4gIH1cbn0pO1xuXG52YXIgY3JlYXRlRmx1aWRTY3JvbGxlciA9IChfcmVmID0+IHtcbiAgbGV0IHtcbiAgICBzY3JvbGxXaW5kb3csXG4gICAgc2Nyb2xsRHJvcHBhYmxlXG4gIH0gPSBfcmVmO1xuICBjb25zdCBzY2hlZHVsZVdpbmRvd1Njcm9sbCA9IHJhZlNjaGRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKHNjcm9sbFdpbmRvdyk7XG4gIGNvbnN0IHNjaGVkdWxlRHJvcHBhYmxlU2Nyb2xsID0gcmFmU2NoZF9fZGVmYXVsdFtcImRlZmF1bHRcIl0oc2Nyb2xsRHJvcHBhYmxlKTtcbiAgbGV0IGRyYWdnaW5nID0gbnVsbDtcblxuICBjb25zdCB0cnlTY3JvbGwgPSBzdGF0ZSA9PiB7XG4gICAgIWRyYWdnaW5nID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gaW52YXJpYW50KGZhbHNlLCAnQ2Fubm90IGZsdWlkIHNjcm9sbCBpZiBub3QgZHJhZ2dpbmcnKSA6IGludmFyaWFudChmYWxzZSkgOiB2b2lkIDA7XG4gICAgY29uc3Qge1xuICAgICAgc2hvdWxkVXNlVGltZURhbXBlbmluZyxcbiAgICAgIGRyYWdTdGFydFRpbWVcbiAgICB9ID0gZHJhZ2dpbmc7XG4gICAgc2Nyb2xsKHtcbiAgICAgIHN0YXRlLFxuICAgICAgc2Nyb2xsV2luZG93OiBzY2hlZHVsZVdpbmRvd1Njcm9sbCxcbiAgICAgIHNjcm9sbERyb3BwYWJsZTogc2NoZWR1bGVEcm9wcGFibGVTY3JvbGwsXG4gICAgICBkcmFnU3RhcnRUaW1lLFxuICAgICAgc2hvdWxkVXNlVGltZURhbXBlbmluZ1xuICAgIH0pO1xuICB9O1xuXG4gIGNvbnN0IHN0YXJ0JDEgPSBzdGF0ZSA9PiB7XG4gICAgc3RhcnQoKTtcbiAgICAhIWRyYWdnaW5nID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gaW52YXJpYW50KGZhbHNlLCAnQ2Fubm90IHN0YXJ0IGF1dG8gc2Nyb2xsaW5nIHdoZW4gYWxyZWFkeSBzdGFydGVkJykgOiBpbnZhcmlhbnQoZmFsc2UpIDogdm9pZCAwO1xuICAgIGNvbnN0IGRyYWdTdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIGxldCB3YXNTY3JvbGxOZWVkZWQgPSBmYWxzZTtcblxuICAgIGNvbnN0IGZha2VTY3JvbGxDYWxsYmFjayA9ICgpID0+IHtcbiAgICAgIHdhc1Njcm9sbE5lZWRlZCA9IHRydWU7XG4gICAgfTtcblxuICAgIHNjcm9sbCh7XG4gICAgICBzdGF0ZSxcbiAgICAgIGRyYWdTdGFydFRpbWU6IDAsXG4gICAgICBzaG91bGRVc2VUaW1lRGFtcGVuaW5nOiBmYWxzZSxcbiAgICAgIHNjcm9sbFdpbmRvdzogZmFrZVNjcm9sbENhbGxiYWNrLFxuICAgICAgc2Nyb2xsRHJvcHBhYmxlOiBmYWtlU2Nyb2xsQ2FsbGJhY2tcbiAgICB9KTtcbiAgICBkcmFnZ2luZyA9IHtcbiAgICAgIGRyYWdTdGFydFRpbWUsXG4gICAgICBzaG91bGRVc2VUaW1lRGFtcGVuaW5nOiB3YXNTY3JvbGxOZWVkZWRcbiAgICB9O1xuICAgIGZpbmlzaCgpO1xuXG4gICAgaWYgKHdhc1Njcm9sbE5lZWRlZCkge1xuICAgICAgdHJ5U2Nyb2xsKHN0YXRlKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3Qgc3RvcCA9ICgpID0+IHtcbiAgICBpZiAoIWRyYWdnaW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc2NoZWR1bGVXaW5kb3dTY3JvbGwuY2FuY2VsKCk7XG4gICAgc2NoZWR1bGVEcm9wcGFibGVTY3JvbGwuY2FuY2VsKCk7XG4gICAgZHJhZ2dpbmcgPSBudWxsO1xuICB9O1xuXG4gIHJldHVybiB7XG4gICAgc3RhcnQ6IHN0YXJ0JDEsXG4gICAgc3RvcCxcbiAgICBzY3JvbGw6IHRyeVNjcm9sbFxuICB9O1xufSk7XG5cbnZhciBjcmVhdGVKdW1wU2Nyb2xsZXIgPSAoX3JlZiA9PiB7XG4gIGxldCB7XG4gICAgbW92ZSxcbiAgICBzY3JvbGxEcm9wcGFibGUsXG4gICAgc2Nyb2xsV2luZG93XG4gIH0gPSBfcmVmO1xuXG4gIGNvbnN0IG1vdmVCeU9mZnNldCA9IChzdGF0ZSwgb2Zmc2V0KSA9PiB7XG4gICAgY29uc3QgY2xpZW50ID0gYWRkKHN0YXRlLmN1cnJlbnQuY2xpZW50LnNlbGVjdGlvbiwgb2Zmc2V0KTtcbiAgICBtb3ZlKHtcbiAgICAgIGNsaWVudFxuICAgIH0pO1xuICB9O1xuXG4gIGNvbnN0IHNjcm9sbERyb3BwYWJsZUFzTXVjaEFzSXRDYW4gPSAoZHJvcHBhYmxlLCBjaGFuZ2UpID0+IHtcbiAgICBpZiAoIWNhblNjcm9sbERyb3BwYWJsZShkcm9wcGFibGUsIGNoYW5nZSkpIHtcbiAgICAgIHJldHVybiBjaGFuZ2U7XG4gICAgfVxuXG4gICAgY29uc3Qgb3ZlcmxhcCA9IGdldERyb3BwYWJsZU92ZXJsYXAoZHJvcHBhYmxlLCBjaGFuZ2UpO1xuXG4gICAgaWYgKCFvdmVybGFwKSB7XG4gICAgICBzY3JvbGxEcm9wcGFibGUoZHJvcHBhYmxlLmRlc2NyaXB0b3IuaWQsIGNoYW5nZSk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCB3aGF0VGhlRHJvcHBhYmxlQ2FuU2Nyb2xsID0gc3VidHJhY3QoY2hhbmdlLCBvdmVybGFwKTtcbiAgICBzY3JvbGxEcm9wcGFibGUoZHJvcHBhYmxlLmRlc2NyaXB0b3IuaWQsIHdoYXRUaGVEcm9wcGFibGVDYW5TY3JvbGwpO1xuICAgIGNvbnN0IHJlbWFpbmRlciA9IHN1YnRyYWN0KGNoYW5nZSwgd2hhdFRoZURyb3BwYWJsZUNhblNjcm9sbCk7XG4gICAgcmV0dXJuIHJlbWFpbmRlcjtcbiAgfTtcblxuICBjb25zdCBzY3JvbGxXaW5kb3dBc011Y2hBc0l0Q2FuID0gKGlzV2luZG93U2Nyb2xsQWxsb3dlZCwgdmlld3BvcnQsIGNoYW5nZSkgPT4ge1xuICAgIGlmICghaXNXaW5kb3dTY3JvbGxBbGxvd2VkKSB7XG4gICAgICByZXR1cm4gY2hhbmdlO1xuICAgIH1cblxuICAgIGlmICghY2FuU2Nyb2xsV2luZG93KHZpZXdwb3J0LCBjaGFuZ2UpKSB7XG4gICAgICByZXR1cm4gY2hhbmdlO1xuICAgIH1cblxuICAgIGNvbnN0IG92ZXJsYXAgPSBnZXRXaW5kb3dPdmVybGFwKHZpZXdwb3J0LCBjaGFuZ2UpO1xuXG4gICAgaWYgKCFvdmVybGFwKSB7XG4gICAgICBzY3JvbGxXaW5kb3coY2hhbmdlKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHdoYXRUaGVXaW5kb3dDYW5TY3JvbGwgPSBzdWJ0cmFjdChjaGFuZ2UsIG92ZXJsYXApO1xuICAgIHNjcm9sbFdpbmRvdyh3aGF0VGhlV2luZG93Q2FuU2Nyb2xsKTtcbiAgICBjb25zdCByZW1haW5kZXIgPSBzdWJ0cmFjdChjaGFuZ2UsIHdoYXRUaGVXaW5kb3dDYW5TY3JvbGwpO1xuICAgIHJldHVybiByZW1haW5kZXI7XG4gIH07XG5cbiAgY29uc3QganVtcFNjcm9sbGVyID0gc3RhdGUgPT4ge1xuICAgIGNvbnN0IHJlcXVlc3QgPSBzdGF0ZS5zY3JvbGxKdW1wUmVxdWVzdDtcblxuICAgIGlmICghcmVxdWVzdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGRlc3RpbmF0aW9uID0gd2hhdElzRHJhZ2dlZE92ZXIoc3RhdGUuaW1wYWN0KTtcbiAgICAhZGVzdGluYXRpb24gPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBpbnZhcmlhbnQoZmFsc2UsICdDYW5ub3QgcGVyZm9ybSBhIGp1bXAgc2Nyb2xsIHdoZW4gdGhlcmUgaXMgbm8gZGVzdGluYXRpb24nKSA6IGludmFyaWFudChmYWxzZSkgOiB2b2lkIDA7XG4gICAgY29uc3QgZHJvcHBhYmxlUmVtYWluZGVyID0gc2Nyb2xsRHJvcHBhYmxlQXNNdWNoQXNJdENhbihzdGF0ZS5kaW1lbnNpb25zLmRyb3BwYWJsZXNbZGVzdGluYXRpb25dLCByZXF1ZXN0KTtcblxuICAgIGlmICghZHJvcHBhYmxlUmVtYWluZGVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgdmlld3BvcnQgPSBzdGF0ZS52aWV3cG9ydDtcbiAgICBjb25zdCB3aW5kb3dSZW1haW5kZXIgPSBzY3JvbGxXaW5kb3dBc011Y2hBc0l0Q2FuKHN0YXRlLmlzV2luZG93U2Nyb2xsQWxsb3dlZCwgdmlld3BvcnQsIGRyb3BwYWJsZVJlbWFpbmRlcik7XG5cbiAgICBpZiAoIXdpbmRvd1JlbWFpbmRlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG1vdmVCeU9mZnNldChzdGF0ZSwgd2luZG93UmVtYWluZGVyKTtcbiAgfTtcblxuICByZXR1cm4ganVtcFNjcm9sbGVyO1xufSk7XG5cbnZhciBjcmVhdGVBdXRvU2Nyb2xsZXIgPSAoX3JlZiA9PiB7XG4gIGxldCB7XG4gICAgc2Nyb2xsRHJvcHBhYmxlLFxuICAgIHNjcm9sbFdpbmRvdyxcbiAgICBtb3ZlXG4gIH0gPSBfcmVmO1xuICBjb25zdCBmbHVpZFNjcm9sbGVyID0gY3JlYXRlRmx1aWRTY3JvbGxlcih7XG4gICAgc2Nyb2xsV2luZG93LFxuICAgIHNjcm9sbERyb3BwYWJsZVxuICB9KTtcbiAgY29uc3QganVtcFNjcm9sbCA9IGNyZWF0ZUp1bXBTY3JvbGxlcih7XG4gICAgbW92ZSxcbiAgICBzY3JvbGxXaW5kb3csXG4gICAgc2Nyb2xsRHJvcHBhYmxlXG4gIH0pO1xuXG4gIGNvbnN0IHNjcm9sbCA9IHN0YXRlID0+IHtcbiAgICBpZiAoc3RhdGUucGhhc2UgIT09ICdEUkFHR0lORycpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoc3RhdGUubW92ZW1lbnRNb2RlID09PSAnRkxVSUQnKSB7XG4gICAgICBmbHVpZFNjcm9sbGVyLnNjcm9sbChzdGF0ZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFzdGF0ZS5zY3JvbGxKdW1wUmVxdWVzdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGp1bXBTY3JvbGwoc3RhdGUpO1xuICB9O1xuXG4gIGNvbnN0IHNjcm9sbGVyID0ge1xuICAgIHNjcm9sbCxcbiAgICBzdGFydDogZmx1aWRTY3JvbGxlci5zdGFydCxcbiAgICBzdG9wOiBmbHVpZFNjcm9sbGVyLnN0b3BcbiAgfTtcbiAgcmV0dXJuIHNjcm9sbGVyO1xufSk7XG5cbmNvbnN0IHByZWZpeCA9ICdkYXRhLXJmZCc7XG5jb25zdCBkcmFnSGFuZGxlID0gKCgpID0+IHtcbiAgY29uc3QgYmFzZSA9IGAke3ByZWZpeH0tZHJhZy1oYW5kbGVgO1xuICByZXR1cm4ge1xuICAgIGJhc2UsXG4gICAgZHJhZ2dhYmxlSWQ6IGAke2Jhc2V9LWRyYWdnYWJsZS1pZGAsXG4gICAgY29udGV4dElkOiBgJHtiYXNlfS1jb250ZXh0LWlkYFxuICB9O1xufSkoKTtcbmNvbnN0IGRyYWdnYWJsZSA9ICgoKSA9PiB7XG4gIGNvbnN0IGJhc2UgPSBgJHtwcmVmaXh9LWRyYWdnYWJsZWA7XG4gIHJldHVybiB7XG4gICAgYmFzZSxcbiAgICBjb250ZXh0SWQ6IGAke2Jhc2V9LWNvbnRleHQtaWRgLFxuICAgIGlkOiBgJHtiYXNlfS1pZGBcbiAgfTtcbn0pKCk7XG5jb25zdCBkcm9wcGFibGUgPSAoKCkgPT4ge1xuICBjb25zdCBiYXNlID0gYCR7cHJlZml4fS1kcm9wcGFibGVgO1xuICByZXR1cm4ge1xuICAgIGJhc2UsXG4gICAgY29udGV4dElkOiBgJHtiYXNlfS1jb250ZXh0LWlkYCxcbiAgICBpZDogYCR7YmFzZX0taWRgXG4gIH07XG59KSgpO1xuY29uc3Qgc2Nyb2xsQ29udGFpbmVyID0ge1xuICBjb250ZXh0SWQ6IGAke3ByZWZpeH0tc2Nyb2xsLWNvbnRhaW5lci1jb250ZXh0LWlkYFxufTtcblxuY29uc3QgbWFrZUdldFNlbGVjdG9yID0gY29udGV4dCA9PiBhdHRyaWJ1dGUgPT4gYFske2F0dHJpYnV0ZX09XCIke2NvbnRleHR9XCJdYDtcblxuY29uc3QgZ2V0U3R5bGVzID0gKHJ1bGVzLCBwcm9wZXJ0eSkgPT4gcnVsZXMubWFwKHJ1bGUgPT4ge1xuICBjb25zdCB2YWx1ZSA9IHJ1bGUuc3R5bGVzW3Byb3BlcnR5XTtcblxuICBpZiAoIXZhbHVlKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgcmV0dXJuIGAke3J1bGUuc2VsZWN0b3J9IHsgJHt2YWx1ZX0gfWA7XG59KS5qb2luKCcgJyk7XG5cbmNvbnN0IG5vUG9pbnRlckV2ZW50cyA9ICdwb2ludGVyLWV2ZW50czogbm9uZTsnO1xudmFyIGdldFN0eWxlcyQxID0gKGNvbnRleHRJZCA9PiB7XG4gIGNvbnN0IGdldFNlbGVjdG9yID0gbWFrZUdldFNlbGVjdG9yKGNvbnRleHRJZCk7XG5cbiAgY29uc3QgZHJhZ0hhbmRsZSQxID0gKCgpID0+IHtcbiAgICBjb25zdCBncmFiQ3Vyc29yID0gYFxuICAgICAgY3Vyc29yOiAtd2Via2l0LWdyYWI7XG4gICAgICBjdXJzb3I6IGdyYWI7XG4gICAgYDtcbiAgICByZXR1cm4ge1xuICAgICAgc2VsZWN0b3I6IGdldFNlbGVjdG9yKGRyYWdIYW5kbGUuY29udGV4dElkKSxcbiAgICAgIHN0eWxlczoge1xuICAgICAgICBhbHdheXM6IGBcbiAgICAgICAgICAtd2Via2l0LXRvdWNoLWNhbGxvdXQ6IG5vbmU7XG4gICAgICAgICAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiByZ2JhKDAsMCwwLDApO1xuICAgICAgICAgIHRvdWNoLWFjdGlvbjogbWFuaXB1bGF0aW9uO1xuICAgICAgICBgLFxuICAgICAgICByZXN0aW5nOiBncmFiQ3Vyc29yLFxuICAgICAgICBkcmFnZ2luZzogbm9Qb2ludGVyRXZlbnRzLFxuICAgICAgICBkcm9wQW5pbWF0aW5nOiBncmFiQ3Vyc29yXG4gICAgICB9XG4gICAgfTtcbiAgfSkoKTtcblxuICBjb25zdCBkcmFnZ2FibGUkMSA9ICgoKSA9PiB7XG4gICAgY29uc3QgdHJhbnNpdGlvbiA9IGBcbiAgICAgIHRyYW5zaXRpb246ICR7dHJhbnNpdGlvbnMub3V0T2ZUaGVXYXl9O1xuICAgIGA7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNlbGVjdG9yOiBnZXRTZWxlY3RvcihkcmFnZ2FibGUuY29udGV4dElkKSxcbiAgICAgIHN0eWxlczoge1xuICAgICAgICBkcmFnZ2luZzogdHJhbnNpdGlvbixcbiAgICAgICAgZHJvcEFuaW1hdGluZzogdHJhbnNpdGlvbixcbiAgICAgICAgdXNlckNhbmNlbDogdHJhbnNpdGlvblxuICAgICAgfVxuICAgIH07XG4gIH0pKCk7XG5cbiAgY29uc3QgZHJvcHBhYmxlJDEgPSB7XG4gICAgc2VsZWN0b3I6IGdldFNlbGVjdG9yKGRyb3BwYWJsZS5jb250ZXh0SWQpLFxuICAgIHN0eWxlczoge1xuICAgICAgYWx3YXlzOiBgb3ZlcmZsb3ctYW5jaG9yOiBub25lO2BcbiAgICB9XG4gIH07XG4gIGNvbnN0IGJvZHkgPSB7XG4gICAgc2VsZWN0b3I6ICdib2R5JyxcbiAgICBzdHlsZXM6IHtcbiAgICAgIGRyYWdnaW5nOiBgXG4gICAgICAgIGN1cnNvcjogZ3JhYmJpbmc7XG4gICAgICAgIGN1cnNvcjogLXdlYmtpdC1ncmFiYmluZztcbiAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgICAgIC1tb3otdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgICAgIC1tcy11c2VyLXNlbGVjdDogbm9uZTtcbiAgICAgICAgb3ZlcmZsb3ctYW5jaG9yOiBub25lO1xuICAgICAgYFxuICAgIH1cbiAgfTtcbiAgY29uc3QgcnVsZXMgPSBbZHJhZ2dhYmxlJDEsIGRyYWdIYW5kbGUkMSwgZHJvcHBhYmxlJDEsIGJvZHldO1xuICByZXR1cm4ge1xuICAgIGFsd2F5czogZ2V0U3R5bGVzKHJ1bGVzLCAnYWx3YXlzJyksXG4gICAgcmVzdGluZzogZ2V0U3R5bGVzKHJ1bGVzLCAncmVzdGluZycpLFxuICAgIGRyYWdnaW5nOiBnZXRTdHlsZXMocnVsZXMsICdkcmFnZ2luZycpLFxuICAgIGRyb3BBbmltYXRpbmc6IGdldFN0eWxlcyhydWxlcywgJ2Ryb3BBbmltYXRpbmcnKSxcbiAgICB1c2VyQ2FuY2VsOiBnZXRTdHlsZXMocnVsZXMsICd1c2VyQ2FuY2VsJylcbiAgfTtcbn0pO1xuXG5jb25zdCB1c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0ID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHdpbmRvdy5kb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50ICE9PSAndW5kZWZpbmVkJyA/IFJlYWN0LnVzZUxheW91dEVmZmVjdCA6IFJlYWN0LnVzZUVmZmVjdDtcbnZhciB1c2VMYXlvdXRFZmZlY3QgPSB1c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0O1xuXG5jb25zdCBnZXRIZWFkID0gKCkgPT4ge1xuICBjb25zdCBoZWFkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignaGVhZCcpO1xuICAhaGVhZCA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IGludmFyaWFudChmYWxzZSwgJ0Nhbm5vdCBmaW5kIHRoZSBoZWFkIHRvIGFwcGVuZCBhIHN0eWxlIHRvJykgOiBpbnZhcmlhbnQoZmFsc2UpIDogdm9pZCAwO1xuICByZXR1cm4gaGVhZDtcbn07XG5cbmNvbnN0IGNyZWF0ZVN0eWxlRWwgPSBub25jZSA9PiB7XG4gIGNvbnN0IGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcblxuICBpZiAobm9uY2UpIHtcbiAgICBlbC5zZXRBdHRyaWJ1dGUoJ25vbmNlJywgbm9uY2UpO1xuICB9XG5cbiAgZWwudHlwZSA9ICd0ZXh0L2Nzcyc7XG4gIHJldHVybiBlbDtcbn07XG5cbmZ1bmN0aW9uIHVzZVN0eWxlTWFyc2hhbChjb250ZXh0SWQsIG5vbmNlKSB7XG4gIGNvbnN0IHN0eWxlcyA9IHVzZU1lbW9PbmUudXNlTWVtbygoKSA9PiBnZXRTdHlsZXMkMShjb250ZXh0SWQpLCBbY29udGV4dElkXSk7XG4gIGNvbnN0IGFsd2F5c1JlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgY29uc3QgZHluYW1pY1JlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgY29uc3Qgc2V0RHluYW1pY1N0eWxlID0gdXNlTWVtb09uZS51c2VDYWxsYmFjayhtZW1vaXplT25lX19kZWZhdWx0W1wiZGVmYXVsdFwiXShwcm9wb3NlZCA9PiB7XG4gICAgY29uc3QgZWwgPSBkeW5hbWljUmVmLmN1cnJlbnQ7XG4gICAgIWVsID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gaW52YXJpYW50KGZhbHNlLCAnQ2Fubm90IHNldCBkeW5hbWljIHN0eWxlIGVsZW1lbnQgaWYgaXQgaXMgbm90IHNldCcpIDogaW52YXJpYW50KGZhbHNlKSA6IHZvaWQgMDtcbiAgICBlbC50ZXh0Q29udGVudCA9IHByb3Bvc2VkO1xuICB9KSwgW10pO1xuICBjb25zdCBzZXRBbHdheXNTdHlsZSA9IHVzZU1lbW9PbmUudXNlQ2FsbGJhY2socHJvcG9zZWQgPT4ge1xuICAgIGNvbnN0IGVsID0gYWx3YXlzUmVmLmN1cnJlbnQ7XG4gICAgIWVsID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gaW52YXJpYW50KGZhbHNlLCAnQ2Fubm90IHNldCBkeW5hbWljIHN0eWxlIGVsZW1lbnQgaWYgaXQgaXMgbm90IHNldCcpIDogaW52YXJpYW50KGZhbHNlKSA6IHZvaWQgMDtcbiAgICBlbC50ZXh0Q29udGVudCA9IHByb3Bvc2VkO1xuICB9LCBbXSk7XG4gIHVzZUxheW91dEVmZmVjdCgoKSA9PiB7XG4gICAgISghYWx3YXlzUmVmLmN1cnJlbnQgJiYgIWR5bmFtaWNSZWYuY3VycmVudCkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBpbnZhcmlhbnQoZmFsc2UsICdzdHlsZSBlbGVtZW50cyBhbHJlYWR5IG1vdW50ZWQnKSA6IGludmFyaWFudChmYWxzZSkgOiB2b2lkIDA7XG4gICAgY29uc3QgYWx3YXlzID0gY3JlYXRlU3R5bGVFbChub25jZSk7XG4gICAgY29uc3QgZHluYW1pYyA9IGNyZWF0ZVN0eWxlRWwobm9uY2UpO1xuICAgIGFsd2F5c1JlZi5jdXJyZW50ID0gYWx3YXlzO1xuICAgIGR5bmFtaWNSZWYuY3VycmVudCA9IGR5bmFtaWM7XG4gICAgYWx3YXlzLnNldEF0dHJpYnV0ZShgJHtwcmVmaXh9LWFsd2F5c2AsIGNvbnRleHRJZCk7XG4gICAgZHluYW1pYy5zZXRBdHRyaWJ1dGUoYCR7cHJlZml4fS1keW5hbWljYCwgY29udGV4dElkKTtcbiAgICBnZXRIZWFkKCkuYXBwZW5kQ2hpbGQoYWx3YXlzKTtcbiAgICBnZXRIZWFkKCkuYXBwZW5kQ2hpbGQoZHluYW1pYyk7XG4gICAgc2V0QWx3YXlzU3R5bGUoc3R5bGVzLmFsd2F5cyk7XG4gICAgc2V0RHluYW1pY1N0eWxlKHN0eWxlcy5yZXN0aW5nKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgY29uc3QgcmVtb3ZlID0gcmVmID0+IHtcbiAgICAgICAgY29uc3QgY3VycmVudCA9IHJlZi5jdXJyZW50O1xuICAgICAgICAhY3VycmVudCA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IGludmFyaWFudChmYWxzZSwgJ0Nhbm5vdCB1bm1vdW50IHJlZiBhcyBpdCBpcyBub3Qgc2V0JykgOiBpbnZhcmlhbnQoZmFsc2UpIDogdm9pZCAwO1xuICAgICAgICBnZXRIZWFkKCkucmVtb3ZlQ2hpbGQoY3VycmVudCk7XG4gICAgICAgIHJlZi5jdXJyZW50ID0gbnVsbDtcbiAgICAgIH07XG5cbiAgICAgIHJlbW92ZShhbHdheXNSZWYpO1xuICAgICAgcmVtb3ZlKGR5bmFtaWNSZWYpO1xuICAgIH07XG4gIH0sIFtub25jZSwgc2V0QWx3YXlzU3R5bGUsIHNldER5bmFtaWNTdHlsZSwgc3R5bGVzLmFsd2F5cywgc3R5bGVzLnJlc3RpbmcsIGNvbnRleHRJZF0pO1xuICBjb25zdCBkcmFnZ2luZyA9IHVzZU1lbW9PbmUudXNlQ2FsbGJhY2soKCkgPT4gc2V0RHluYW1pY1N0eWxlKHN0eWxlcy5kcmFnZ2luZyksIFtzZXREeW5hbWljU3R5bGUsIHN0eWxlcy5kcmFnZ2luZ10pO1xuICBjb25zdCBkcm9wcGluZyA9IHVzZU1lbW9PbmUudXNlQ2FsbGJhY2socmVhc29uID0+IHtcbiAgICBpZiAocmVhc29uID09PSAnRFJPUCcpIHtcbiAgICAgIHNldER5bmFtaWNTdHlsZShzdHlsZXMuZHJvcEFuaW1hdGluZyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc2V0RHluYW1pY1N0eWxlKHN0eWxlcy51c2VyQ2FuY2VsKTtcbiAgfSwgW3NldER5bmFtaWNTdHlsZSwgc3R5bGVzLmRyb3BBbmltYXRpbmcsIHN0eWxlcy51c2VyQ2FuY2VsXSk7XG4gIGNvbnN0IHJlc3RpbmcgPSB1c2VNZW1vT25lLnVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBpZiAoIWR5bmFtaWNSZWYuY3VycmVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHNldER5bmFtaWNTdHlsZShzdHlsZXMucmVzdGluZyk7XG4gIH0sIFtzZXREeW5hbWljU3R5bGUsIHN0eWxlcy5yZXN0aW5nXSk7XG4gIGNvbnN0IG1hcnNoYWwgPSB1c2VNZW1vT25lLnVzZU1lbW8oKCkgPT4gKHtcbiAgICBkcmFnZ2luZyxcbiAgICBkcm9wcGluZyxcbiAgICByZXN0aW5nXG4gIH0pLCBbZHJhZ2dpbmcsIGRyb3BwaW5nLCByZXN0aW5nXSk7XG4gIHJldHVybiBtYXJzaGFsO1xufVxuXG5mdW5jdGlvbiBxdWVyeVNlbGVjdG9yQWxsKHBhcmVudE5vZGUsIHNlbGVjdG9yKSB7XG4gIHJldHVybiBBcnJheS5mcm9tKHBhcmVudE5vZGUucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvcikpO1xufVxuXG52YXIgZ2V0V2luZG93RnJvbUVsID0gKGVsID0+IHtcbiAgdmFyIF9lbCRvd25lckRvY3VtZW50O1xuXG4gIHJldHVybiAoZWwgPT0gbnVsbCA/IHZvaWQgMCA6IChfZWwkb3duZXJEb2N1bWVudCA9IGVsLm93bmVyRG9jdW1lbnQpID09IG51bGwgPyB2b2lkIDAgOiBfZWwkb3duZXJEb2N1bWVudC5kZWZhdWx0VmlldykgfHwgd2luZG93O1xufSk7XG5cbmZ1bmN0aW9uIGlzSHRtbEVsZW1lbnQoZWwpIHtcbiAgcmV0dXJuIGVsIGluc3RhbmNlb2YgZ2V0V2luZG93RnJvbUVsKGVsKS5IVE1MRWxlbWVudDtcbn1cblxuZnVuY3Rpb24gZmluZERyYWdIYW5kbGUoY29udGV4dElkLCBkcmFnZ2FibGVJZCkge1xuICBjb25zdCBzZWxlY3RvciA9IGBbJHtkcmFnSGFuZGxlLmNvbnRleHRJZH09XCIke2NvbnRleHRJZH1cIl1gO1xuICBjb25zdCBwb3NzaWJsZSA9IHF1ZXJ5U2VsZWN0b3JBbGwoZG9jdW1lbnQsIHNlbGVjdG9yKTtcblxuICBpZiAoIXBvc3NpYmxlLmxlbmd0aCkge1xuICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHdhcm5pbmcoYFVuYWJsZSB0byBmaW5kIGFueSBkcmFnIGhhbmRsZXMgaW4gdGhlIGNvbnRleHQgXCIke2NvbnRleHRJZH1cImApIDogdm9pZCAwO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgaGFuZGxlID0gcG9zc2libGUuZmluZChlbCA9PiB7XG4gICAgcmV0dXJuIGVsLmdldEF0dHJpYnV0ZShkcmFnSGFuZGxlLmRyYWdnYWJsZUlkKSA9PT0gZHJhZ2dhYmxlSWQ7XG4gIH0pO1xuXG4gIGlmICghaGFuZGxlKSB7XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gd2FybmluZyhgVW5hYmxlIHRvIGZpbmQgZHJhZyBoYW5kbGUgd2l0aCBpZCBcIiR7ZHJhZ2dhYmxlSWR9XCIgYXMgbm8gaGFuZGxlIHdpdGggYSBtYXRjaGluZyBpZCB3YXMgZm91bmRgKSA6IHZvaWQgMDtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmICghaXNIdG1sRWxlbWVudChoYW5kbGUpKSB7XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gd2FybmluZygnZHJhZyBoYW5kbGUgbmVlZHMgdG8gYmUgYSBIVE1MRWxlbWVudCcpIDogdm9pZCAwO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIGhhbmRsZTtcbn1cblxuZnVuY3Rpb24gdXNlRm9jdXNNYXJzaGFsKGNvbnRleHRJZCkge1xuICBjb25zdCBlbnRyaWVzUmVmID0gUmVhY3QudXNlUmVmKHt9KTtcbiAgY29uc3QgcmVjb3JkUmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICBjb25zdCByZXN0b3JlRm9jdXNGcmFtZVJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgY29uc3QgaXNNb3VudGVkUmVmID0gUmVhY3QudXNlUmVmKGZhbHNlKTtcbiAgY29uc3QgcmVnaXN0ZXIgPSB1c2VNZW1vT25lLnVzZUNhbGxiYWNrKGZ1bmN0aW9uIHJlZ2lzdGVyKGlkLCBmb2N1cykge1xuICAgIGNvbnN0IGVudHJ5ID0ge1xuICAgICAgaWQsXG4gICAgICBmb2N1c1xuICAgIH07XG4gICAgZW50cmllc1JlZi5jdXJyZW50W2lkXSA9IGVudHJ5O1xuICAgIHJldHVybiBmdW5jdGlvbiB1bnJlZ2lzdGVyKCkge1xuICAgICAgY29uc3QgZW50cmllcyA9IGVudHJpZXNSZWYuY3VycmVudDtcbiAgICAgIGNvbnN0IGN1cnJlbnQgPSBlbnRyaWVzW2lkXTtcblxuICAgICAgaWYgKGN1cnJlbnQgIT09IGVudHJ5KSB7XG4gICAgICAgIGRlbGV0ZSBlbnRyaWVzW2lkXTtcbiAgICAgIH1cbiAgICB9O1xuICB9LCBbXSk7XG4gIGNvbnN0IHRyeUdpdmVGb2N1cyA9IHVzZU1lbW9PbmUudXNlQ2FsbGJhY2soZnVuY3Rpb24gdHJ5R2l2ZUZvY3VzKHRyeUdpdmVGb2N1c1RvKSB7XG4gICAgY29uc3QgaGFuZGxlID0gZmluZERyYWdIYW5kbGUoY29udGV4dElkLCB0cnlHaXZlRm9jdXNUbyk7XG5cbiAgICBpZiAoaGFuZGxlICYmIGhhbmRsZSAhPT0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkge1xuICAgICAgaGFuZGxlLmZvY3VzKCk7XG4gICAgfVxuICB9LCBbY29udGV4dElkXSk7XG4gIGNvbnN0IHRyeVNoaWZ0UmVjb3JkID0gdXNlTWVtb09uZS51c2VDYWxsYmFjayhmdW5jdGlvbiB0cnlTaGlmdFJlY29yZChwcmV2aW91cywgcmVkaXJlY3RUbykge1xuICAgIGlmIChyZWNvcmRSZWYuY3VycmVudCA9PT0gcHJldmlvdXMpIHtcbiAgICAgIHJlY29yZFJlZi5jdXJyZW50ID0gcmVkaXJlY3RUbztcbiAgICB9XG4gIH0sIFtdKTtcbiAgY29uc3QgdHJ5UmVzdG9yZUZvY3VzUmVjb3JkZWQgPSB1c2VNZW1vT25lLnVzZUNhbGxiYWNrKGZ1bmN0aW9uIHRyeVJlc3RvcmVGb2N1c1JlY29yZGVkKCkge1xuICAgIGlmIChyZXN0b3JlRm9jdXNGcmFtZVJlZi5jdXJyZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFpc01vdW50ZWRSZWYuY3VycmVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHJlc3RvcmVGb2N1c0ZyYW1lUmVmLmN1cnJlbnQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgcmVzdG9yZUZvY3VzRnJhbWVSZWYuY3VycmVudCA9IG51bGw7XG4gICAgICBjb25zdCByZWNvcmQgPSByZWNvcmRSZWYuY3VycmVudDtcblxuICAgICAgaWYgKHJlY29yZCkge1xuICAgICAgICB0cnlHaXZlRm9jdXMocmVjb3JkKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSwgW3RyeUdpdmVGb2N1c10pO1xuICBjb25zdCB0cnlSZWNvcmRGb2N1cyA9IHVzZU1lbW9PbmUudXNlQ2FsbGJhY2soZnVuY3Rpb24gdHJ5UmVjb3JkRm9jdXMoaWQpIHtcbiAgICByZWNvcmRSZWYuY3VycmVudCA9IG51bGw7XG4gICAgY29uc3QgZm9jdXNlZCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG5cbiAgICBpZiAoIWZvY3VzZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZm9jdXNlZC5nZXRBdHRyaWJ1dGUoZHJhZ0hhbmRsZS5kcmFnZ2FibGVJZCkgIT09IGlkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmVjb3JkUmVmLmN1cnJlbnQgPSBpZDtcbiAgfSwgW10pO1xuICB1c2VMYXlvdXRFZmZlY3QoKCkgPT4ge1xuICAgIGlzTW91bnRlZFJlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICByZXR1cm4gZnVuY3Rpb24gY2xlYXJGcmFtZU9uVW5tb3VudCgpIHtcbiAgICAgIGlzTW91bnRlZFJlZi5jdXJyZW50ID0gZmFsc2U7XG4gICAgICBjb25zdCBmcmFtZUlkID0gcmVzdG9yZUZvY3VzRnJhbWVSZWYuY3VycmVudDtcblxuICAgICAgaWYgKGZyYW1lSWQpIHtcbiAgICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUoZnJhbWVJZCk7XG4gICAgICB9XG4gICAgfTtcbiAgfSwgW10pO1xuICBjb25zdCBtYXJzaGFsID0gdXNlTWVtb09uZS51c2VNZW1vKCgpID0+ICh7XG4gICAgcmVnaXN0ZXIsXG4gICAgdHJ5UmVjb3JkRm9jdXMsXG4gICAgdHJ5UmVzdG9yZUZvY3VzUmVjb3JkZWQsXG4gICAgdHJ5U2hpZnRSZWNvcmRcbiAgfSksIFtyZWdpc3RlciwgdHJ5UmVjb3JkRm9jdXMsIHRyeVJlc3RvcmVGb2N1c1JlY29yZGVkLCB0cnlTaGlmdFJlY29yZF0pO1xuICByZXR1cm4gbWFyc2hhbDtcbn1cblxuZnVuY3Rpb24gY3JlYXRlUmVnaXN0cnkoKSB7XG4gIGNvbnN0IGVudHJpZXMgPSB7XG4gICAgZHJhZ2dhYmxlczoge30sXG4gICAgZHJvcHBhYmxlczoge31cbiAgfTtcbiAgY29uc3Qgc3Vic2NyaWJlcnMgPSBbXTtcblxuICBmdW5jdGlvbiBzdWJzY3JpYmUoY2IpIHtcbiAgICBzdWJzY3JpYmVycy5wdXNoKGNiKTtcbiAgICByZXR1cm4gZnVuY3Rpb24gdW5zdWJzY3JpYmUoKSB7XG4gICAgICBjb25zdCBpbmRleCA9IHN1YnNjcmliZXJzLmluZGV4T2YoY2IpO1xuXG4gICAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgc3Vic2NyaWJlcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gbm90aWZ5KGV2ZW50KSB7XG4gICAgaWYgKHN1YnNjcmliZXJzLmxlbmd0aCkge1xuICAgICAgc3Vic2NyaWJlcnMuZm9yRWFjaChjYiA9PiBjYihldmVudCkpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGZpbmREcmFnZ2FibGVCeUlkKGlkKSB7XG4gICAgcmV0dXJuIGVudHJpZXMuZHJhZ2dhYmxlc1tpZF0gfHwgbnVsbDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldERyYWdnYWJsZUJ5SWQoaWQpIHtcbiAgICBjb25zdCBlbnRyeSA9IGZpbmREcmFnZ2FibGVCeUlkKGlkKTtcbiAgICAhZW50cnkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBpbnZhcmlhbnQoZmFsc2UsIGBDYW5ub3QgZmluZCBkcmFnZ2FibGUgZW50cnkgd2l0aCBpZCBbJHtpZH1dYCkgOiBpbnZhcmlhbnQoZmFsc2UpIDogdm9pZCAwO1xuICAgIHJldHVybiBlbnRyeTtcbiAgfVxuXG4gIGNvbnN0IGRyYWdnYWJsZUFQSSA9IHtcbiAgICByZWdpc3RlcjogZW50cnkgPT4ge1xuICAgICAgZW50cmllcy5kcmFnZ2FibGVzW2VudHJ5LmRlc2NyaXB0b3IuaWRdID0gZW50cnk7XG4gICAgICBub3RpZnkoe1xuICAgICAgICB0eXBlOiAnQURESVRJT04nLFxuICAgICAgICB2YWx1ZTogZW50cnlcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgdXBkYXRlOiAoZW50cnksIGxhc3QpID0+IHtcbiAgICAgIGNvbnN0IGN1cnJlbnQgPSBlbnRyaWVzLmRyYWdnYWJsZXNbbGFzdC5kZXNjcmlwdG9yLmlkXTtcblxuICAgICAgaWYgKCFjdXJyZW50KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGN1cnJlbnQudW5pcXVlSWQgIT09IGVudHJ5LnVuaXF1ZUlkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgZGVsZXRlIGVudHJpZXMuZHJhZ2dhYmxlc1tsYXN0LmRlc2NyaXB0b3IuaWRdO1xuICAgICAgZW50cmllcy5kcmFnZ2FibGVzW2VudHJ5LmRlc2NyaXB0b3IuaWRdID0gZW50cnk7XG4gICAgfSxcbiAgICB1bnJlZ2lzdGVyOiBlbnRyeSA9PiB7XG4gICAgICBjb25zdCBkcmFnZ2FibGVJZCA9IGVudHJ5LmRlc2NyaXB0b3IuaWQ7XG4gICAgICBjb25zdCBjdXJyZW50ID0gZmluZERyYWdnYWJsZUJ5SWQoZHJhZ2dhYmxlSWQpO1xuXG4gICAgICBpZiAoIWN1cnJlbnQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoZW50cnkudW5pcXVlSWQgIT09IGN1cnJlbnQudW5pcXVlSWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBkZWxldGUgZW50cmllcy5kcmFnZ2FibGVzW2RyYWdnYWJsZUlkXTtcblxuICAgICAgaWYgKGVudHJpZXMuZHJvcHBhYmxlc1tlbnRyeS5kZXNjcmlwdG9yLmRyb3BwYWJsZUlkXSkge1xuICAgICAgICBub3RpZnkoe1xuICAgICAgICAgIHR5cGU6ICdSRU1PVkFMJyxcbiAgICAgICAgICB2YWx1ZTogZW50cnlcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSxcbiAgICBnZXRCeUlkOiBnZXREcmFnZ2FibGVCeUlkLFxuICAgIGZpbmRCeUlkOiBmaW5kRHJhZ2dhYmxlQnlJZCxcbiAgICBleGlzdHM6IGlkID0+IEJvb2xlYW4oZmluZERyYWdnYWJsZUJ5SWQoaWQpKSxcbiAgICBnZXRBbGxCeVR5cGU6IHR5cGUgPT4gT2JqZWN0LnZhbHVlcyhlbnRyaWVzLmRyYWdnYWJsZXMpLmZpbHRlcihlbnRyeSA9PiBlbnRyeS5kZXNjcmlwdG9yLnR5cGUgPT09IHR5cGUpXG4gIH07XG5cbiAgZnVuY3Rpb24gZmluZERyb3BwYWJsZUJ5SWQoaWQpIHtcbiAgICByZXR1cm4gZW50cmllcy5kcm9wcGFibGVzW2lkXSB8fCBudWxsO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0RHJvcHBhYmxlQnlJZChpZCkge1xuICAgIGNvbnN0IGVudHJ5ID0gZmluZERyb3BwYWJsZUJ5SWQoaWQpO1xuICAgICFlbnRyeSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IGludmFyaWFudChmYWxzZSwgYENhbm5vdCBmaW5kIGRyb3BwYWJsZSBlbnRyeSB3aXRoIGlkIFske2lkfV1gKSA6IGludmFyaWFudChmYWxzZSkgOiB2b2lkIDA7XG4gICAgcmV0dXJuIGVudHJ5O1xuICB9XG5cbiAgY29uc3QgZHJvcHBhYmxlQVBJID0ge1xuICAgIHJlZ2lzdGVyOiBlbnRyeSA9PiB7XG4gICAgICBlbnRyaWVzLmRyb3BwYWJsZXNbZW50cnkuZGVzY3JpcHRvci5pZF0gPSBlbnRyeTtcbiAgICB9LFxuICAgIHVucmVnaXN0ZXI6IGVudHJ5ID0+IHtcbiAgICAgIGNvbnN0IGN1cnJlbnQgPSBmaW5kRHJvcHBhYmxlQnlJZChlbnRyeS5kZXNjcmlwdG9yLmlkKTtcblxuICAgICAgaWYgKCFjdXJyZW50KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGVudHJ5LnVuaXF1ZUlkICE9PSBjdXJyZW50LnVuaXF1ZUlkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgZGVsZXRlIGVudHJpZXMuZHJvcHBhYmxlc1tlbnRyeS5kZXNjcmlwdG9yLmlkXTtcbiAgICB9LFxuICAgIGdldEJ5SWQ6IGdldERyb3BwYWJsZUJ5SWQsXG4gICAgZmluZEJ5SWQ6IGZpbmREcm9wcGFibGVCeUlkLFxuICAgIGV4aXN0czogaWQgPT4gQm9vbGVhbihmaW5kRHJvcHBhYmxlQnlJZChpZCkpLFxuICAgIGdldEFsbEJ5VHlwZTogdHlwZSA9PiBPYmplY3QudmFsdWVzKGVudHJpZXMuZHJvcHBhYmxlcykuZmlsdGVyKGVudHJ5ID0+IGVudHJ5LmRlc2NyaXB0b3IudHlwZSA9PT0gdHlwZSlcbiAgfTtcblxuICBmdW5jdGlvbiBjbGVhbigpIHtcbiAgICBlbnRyaWVzLmRyYWdnYWJsZXMgPSB7fTtcbiAgICBlbnRyaWVzLmRyb3BwYWJsZXMgPSB7fTtcbiAgICBzdWJzY3JpYmVycy5sZW5ndGggPSAwO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBkcmFnZ2FibGU6IGRyYWdnYWJsZUFQSSxcbiAgICBkcm9wcGFibGU6IGRyb3BwYWJsZUFQSSxcbiAgICBzdWJzY3JpYmUsXG4gICAgY2xlYW5cbiAgfTtcbn1cblxuZnVuY3Rpb24gdXNlUmVnaXN0cnkoKSB7XG4gIGNvbnN0IHJlZ2lzdHJ5ID0gdXNlTWVtb09uZS51c2VNZW1vKGNyZWF0ZVJlZ2lzdHJ5LCBbXSk7XG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIHVubW91bnQoKSB7XG4gICAgICBpZiAoUmVhY3RfX2RlZmF1bHRbXCJkZWZhdWx0XCJdLnZlcnNpb24uc3RhcnRzV2l0aCgnMTYnKSB8fCBSZWFjdF9fZGVmYXVsdFtcImRlZmF1bHRcIl0udmVyc2lvbi5zdGFydHNXaXRoKCcxNycpKSB7XG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShyZWdpc3RyeS5jbGVhbik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZWdpc3RyeS5jbGVhbigpO1xuICAgICAgfVxuICAgIH07XG4gIH0sIFtyZWdpc3RyeV0pO1xuICByZXR1cm4gcmVnaXN0cnk7XG59XG5cbnZhciBTdG9yZUNvbnRleHQgPSBSZWFjdF9fZGVmYXVsdFtcImRlZmF1bHRcIl0uY3JlYXRlQ29udGV4dChudWxsKTtcblxudmFyIGdldEJvZHlFbGVtZW50ID0gKCgpID0+IHtcbiAgY29uc3QgYm9keSA9IGRvY3VtZW50LmJvZHk7XG4gICFib2R5ID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gaW52YXJpYW50KGZhbHNlLCAnQ2Fubm90IGZpbmQgZG9jdW1lbnQuYm9keScpIDogaW52YXJpYW50KGZhbHNlKSA6IHZvaWQgMDtcbiAgcmV0dXJuIGJvZHk7XG59KTtcblxuY29uc3QgdmlzdWFsbHlIaWRkZW4gPSB7XG4gIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICB3aWR0aDogJzFweCcsXG4gIGhlaWdodDogJzFweCcsXG4gIG1hcmdpbjogJy0xcHgnLFxuICBib3JkZXI6ICcwJyxcbiAgcGFkZGluZzogJzAnLFxuICBvdmVyZmxvdzogJ2hpZGRlbicsXG4gIGNsaXA6ICdyZWN0KDAgMCAwIDApJyxcbiAgJ2NsaXAtcGF0aCc6ICdpbnNldCgxMDAlKSdcbn07XG52YXIgdmlzdWFsbHlIaWRkZW4kMSA9IHZpc3VhbGx5SGlkZGVuO1xuXG5jb25zdCBnZXRJZCA9IGNvbnRleHRJZCA9PiBgcmZkLWFubm91bmNlbWVudC0ke2NvbnRleHRJZH1gO1xuZnVuY3Rpb24gdXNlQW5ub3VuY2VyKGNvbnRleHRJZCkge1xuICBjb25zdCBpZCA9IHVzZU1lbW9PbmUudXNlTWVtbygoKSA9PiBnZXRJZChjb250ZXh0SWQpLCBbY29udGV4dElkXSk7XG4gIGNvbnN0IHJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uIHNldHVwKCkge1xuICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgcmVmLmN1cnJlbnQgPSBlbDtcbiAgICBlbC5pZCA9IGlkO1xuICAgIGVsLnNldEF0dHJpYnV0ZSgnYXJpYS1saXZlJywgJ2Fzc2VydGl2ZScpO1xuICAgIGVsLnNldEF0dHJpYnV0ZSgnYXJpYS1hdG9taWMnLCAndHJ1ZScpO1xuXG4gICAgX2V4dGVuZHNfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKGVsLnN0eWxlLCB2aXN1YWxseUhpZGRlbiQxKTtcblxuICAgIGdldEJvZHlFbGVtZW50KCkuYXBwZW5kQ2hpbGQoZWwpO1xuICAgIHJldHVybiBmdW5jdGlvbiBjbGVhbnVwKCkge1xuICAgICAgc2V0VGltZW91dChmdW5jdGlvbiByZW1vdmUoKSB7XG4gICAgICAgIGNvbnN0IGJvZHkgPSBnZXRCb2R5RWxlbWVudCgpO1xuXG4gICAgICAgIGlmIChib2R5LmNvbnRhaW5zKGVsKSkge1xuICAgICAgICAgIGJvZHkucmVtb3ZlQ2hpbGQoZWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVsID09PSByZWYuY3VycmVudCkge1xuICAgICAgICAgIHJlZi5jdXJyZW50ID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcbiAgfSwgW2lkXSk7XG4gIGNvbnN0IGFubm91bmNlID0gdXNlTWVtb09uZS51c2VDYWxsYmFjayhtZXNzYWdlID0+IHtcbiAgICBjb25zdCBlbCA9IHJlZi5jdXJyZW50O1xuXG4gICAgaWYgKGVsKSB7XG4gICAgICBlbC50ZXh0Q29udGVudCA9IG1lc3NhZ2U7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gd2FybmluZyhgXG4gICAgICBBIHNjcmVlbiByZWFkZXIgbWVzc2FnZSB3YXMgdHJ5aW5nIHRvIGJlIGFubm91bmNlZCBidXQgaXQgd2FzIHVuYWJsZSB0byBkbyBzby5cbiAgICAgIFRoaXMgY2FuIG9jY3VyIGlmIHlvdSB1bm1vdW50IHlvdXIgPERyYWdEcm9wQ29udGV4dCAvPiBpbiB5b3VyIG9uRHJhZ0VuZC5cbiAgICAgIENvbnNpZGVyIGNhbGxpbmcgcHJvdmlkZWQuYW5ub3VuY2UoKSBiZWZvcmUgdGhlIHVubW91bnQgc28gdGhhdCB0aGUgaW5zdHJ1Y3Rpb24gd2lsbFxuICAgICAgbm90IGJlIGxvc3QgZm9yIHVzZXJzIHJlbHlpbmcgb24gYSBzY3JlZW4gcmVhZGVyLlxuXG4gICAgICBNZXNzYWdlIG5vdCBwYXNzZWQgdG8gc2NyZWVuIHJlYWRlcjpcblxuICAgICAgXCIke21lc3NhZ2V9XCJcbiAgICBgKSA6IHZvaWQgMDtcbiAgfSwgW10pO1xuICByZXR1cm4gYW5ub3VuY2U7XG59XG5cbmxldCBjb3VudCQxID0gMDtcbmNvbnN0IGRlZmF1bHRzID0ge1xuICBzZXBhcmF0b3I6ICc6Oidcbn07XG5mdW5jdGlvbiByZXNldCQxKCkge1xuICBjb3VudCQxID0gMDtcbn1cbmZ1bmN0aW9uIHVzZVVuaXF1ZUlkKHByZWZpeCwgb3B0aW9ucykge1xuICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgb3B0aW9ucyA9IGRlZmF1bHRzO1xuICB9XG5cbiAgcmV0dXJuIHVzZU1lbW9PbmUudXNlTWVtbygoKSA9PiBgJHtwcmVmaXh9JHtvcHRpb25zLnNlcGFyYXRvcn0ke2NvdW50JDErK31gLCBbb3B0aW9ucy5zZXBhcmF0b3IsIHByZWZpeF0pO1xufVxuXG5mdW5jdGlvbiBnZXRFbGVtZW50SWQoX3JlZikge1xuICBsZXQge1xuICAgIGNvbnRleHRJZCxcbiAgICB1bmlxdWVJZFxuICB9ID0gX3JlZjtcbiAgcmV0dXJuIGByZmQtaGlkZGVuLXRleHQtJHtjb250ZXh0SWR9LSR7dW5pcXVlSWR9YDtcbn1cbmZ1bmN0aW9uIHVzZUhpZGRlblRleHRFbGVtZW50KF9yZWYyKSB7XG4gIGxldCB7XG4gICAgY29udGV4dElkLFxuICAgIHRleHRcbiAgfSA9IF9yZWYyO1xuICBjb25zdCB1bmlxdWVJZCA9IHVzZVVuaXF1ZUlkKCdoaWRkZW4tdGV4dCcsIHtcbiAgICBzZXBhcmF0b3I6ICctJ1xuICB9KTtcbiAgY29uc3QgaWQgPSB1c2VNZW1vT25lLnVzZU1lbW8oKCkgPT4gZ2V0RWxlbWVudElkKHtcbiAgICBjb250ZXh0SWQsXG4gICAgdW5pcXVlSWRcbiAgfSksIFt1bmlxdWVJZCwgY29udGV4dElkXSk7XG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiBtb3VudCgpIHtcbiAgICBjb25zdCBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGVsLmlkID0gaWQ7XG4gICAgZWwudGV4dENvbnRlbnQgPSB0ZXh0O1xuICAgIGVsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgZ2V0Qm9keUVsZW1lbnQoKS5hcHBlbmRDaGlsZChlbCk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIHVubW91bnQoKSB7XG4gICAgICBjb25zdCBib2R5ID0gZ2V0Qm9keUVsZW1lbnQoKTtcblxuICAgICAgaWYgKGJvZHkuY29udGFpbnMoZWwpKSB7XG4gICAgICAgIGJvZHkucmVtb3ZlQ2hpbGQoZWwpO1xuICAgICAgfVxuICAgIH07XG4gIH0sIFtpZCwgdGV4dF0pO1xuICByZXR1cm4gaWQ7XG59XG5cbnZhciBBcHBDb250ZXh0ID0gUmVhY3RfX2RlZmF1bHRbXCJkZWZhdWx0XCJdLmNyZWF0ZUNvbnRleHQobnVsbCk7XG5cbnZhciBwZWVyRGVwZW5kZW5jaWVzID0ge1xuXHRyZWFjdDogXCJeMTYuOC41IHx8IF4xNy4wLjAgfHwgXjE4LjAuMFwiLFxuXHRcInJlYWN0LWRvbVwiOiBcIl4xNi44LjUgfHwgXjE3LjAuMCB8fCBeMTguMC4wXCJcbn07XG5cbmNvbnN0IHNlbXZlciA9IC8oXFxkKylcXC4oXFxkKylcXC4oXFxkKykvO1xuXG5jb25zdCBnZXRWZXJzaW9uID0gdmFsdWUgPT4ge1xuICBjb25zdCByZXN1bHQgPSBzZW12ZXIuZXhlYyh2YWx1ZSk7XG4gICEocmVzdWx0ICE9IG51bGwpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gaW52YXJpYW50KGZhbHNlLCBgVW5hYmxlIHRvIHBhcnNlIFJlYWN0IHZlcnNpb24gJHt2YWx1ZX1gKSA6IGludmFyaWFudChmYWxzZSkgOiB2b2lkIDA7XG4gIGNvbnN0IG1ham9yID0gTnVtYmVyKHJlc3VsdFsxXSk7XG4gIGNvbnN0IG1pbm9yID0gTnVtYmVyKHJlc3VsdFsyXSk7XG4gIGNvbnN0IHBhdGNoID0gTnVtYmVyKHJlc3VsdFszXSk7XG4gIHJldHVybiB7XG4gICAgbWFqb3IsXG4gICAgbWlub3IsXG4gICAgcGF0Y2gsXG4gICAgcmF3OiB2YWx1ZVxuICB9O1xufTtcblxuY29uc3QgaXNTYXRpc2ZpZWQgPSAoZXhwZWN0ZWQsIGFjdHVhbCkgPT4ge1xuICBpZiAoYWN0dWFsLm1ham9yID4gZXhwZWN0ZWQubWFqb3IpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmIChhY3R1YWwubWFqb3IgPCBleHBlY3RlZC5tYWpvcikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChhY3R1YWwubWlub3IgPiBleHBlY3RlZC5taW5vcikge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKGFjdHVhbC5taW5vciA8IGV4cGVjdGVkLm1pbm9yKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIGFjdHVhbC5wYXRjaCA+PSBleHBlY3RlZC5wYXRjaDtcbn07XG5cbnZhciBjaGVja1JlYWN0VmVyc2lvbiA9ICgocGVlckRlcFZhbHVlLCBhY3R1YWxWYWx1ZSkgPT4ge1xuICBjb25zdCBwZWVyRGVwID0gZ2V0VmVyc2lvbihwZWVyRGVwVmFsdWUpO1xuICBjb25zdCBhY3R1YWwgPSBnZXRWZXJzaW9uKGFjdHVhbFZhbHVlKTtcblxuICBpZiAoaXNTYXRpc2ZpZWQocGVlckRlcCwgYWN0dWFsKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHdhcm5pbmcoYFxuICAgIFJlYWN0IHZlcnNpb246IFske2FjdHVhbC5yYXd9XVxuICAgIGRvZXMgbm90IHNhdGlzZnkgZXhwZWN0ZWQgcGVlciBkZXBlbmRlbmN5IHZlcnNpb246IFske3BlZXJEZXAucmF3fV1cblxuICAgIFRoaXMgY2FuIHJlc3VsdCBpbiBydW4gdGltZSBidWdzLCBhbmQgZXZlbiBmYXRhbCBjcmFzaGVzXG4gIGApIDogdm9pZCAwO1xufSk7XG5cbmNvbnN0IHN1ZmZpeCA9IGBcbiAgV2UgZXhwZWN0IGEgaHRtbDUgZG9jdHlwZTogPCFkb2N0eXBlIGh0bWw+XG4gIFRoaXMgaXMgdG8gZW5zdXJlIGNvbnNpc3RlbnQgYnJvd3NlciBsYXlvdXQgYW5kIG1lYXN1cmVtZW50XG5cbiAgTW9yZSBpbmZvcm1hdGlvbjogaHR0cHM6Ly9naXRodWIuY29tL2hlbGxvLXBhbmdlYS9kbmQvYmxvYi9tYWluL2RvY3MvZ3VpZGVzL2RvY3R5cGUubWRcbmA7XG52YXIgY2hlY2tEb2N0eXBlID0gKGRvYyA9PiB7XG4gIGNvbnN0IGRvY3R5cGUgPSBkb2MuZG9jdHlwZTtcblxuICBpZiAoIWRvY3R5cGUpIHtcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB3YXJuaW5nKGBcbiAgICAgIE5vIDwhZG9jdHlwZSBodG1sPiBmb3VuZC5cblxuICAgICAgJHtzdWZmaXh9XG4gICAgYCkgOiB2b2lkIDA7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGRvY3R5cGUubmFtZS50b0xvd2VyQ2FzZSgpICE9PSAnaHRtbCcpIHtcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB3YXJuaW5nKGBcbiAgICAgIFVuZXhwZWN0ZWQgPCFkb2N0eXBlPiBmb3VuZDogKCR7ZG9jdHlwZS5uYW1lfSlcblxuICAgICAgJHtzdWZmaXh9XG4gICAgYCkgOiB2b2lkIDA7XG4gIH1cblxuICBpZiAoZG9jdHlwZS5wdWJsaWNJZCAhPT0gJycpIHtcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB3YXJuaW5nKGBcbiAgICAgIFVuZXhwZWN0ZWQgPCFkb2N0eXBlPiBwdWJsaWNJZCBmb3VuZDogKCR7ZG9jdHlwZS5wdWJsaWNJZH0pXG4gICAgICBBIGh0bWw1IGRvY3R5cGUgZG9lcyBub3QgaGF2ZSBhIHB1YmxpY0lkXG5cbiAgICAgICR7c3VmZml4fVxuICAgIGApIDogdm9pZCAwO1xuICB9XG59KTtcblxuZnVuY3Rpb24gdXNlRGV2KHVzZUhvb2spIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICB1c2VIb29rKCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdXNlRGV2U2V0dXBXYXJuaW5nKGZuLCBpbnB1dHMpIHtcbiAgdXNlRGV2KCgpID0+IHtcbiAgICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgZm4oKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgZXJyb3IoYFxuICAgICAgICAgIEEgc2V0dXAgcHJvYmxlbSB3YXMgZW5jb3VudGVyZWQuXG5cbiAgICAgICAgICA+ICR7ZS5tZXNzYWdlfVxuICAgICAgICBgKTtcbiAgICAgIH1cbiAgICB9LCBpbnB1dHMpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gdXNlU3RhcnR1cFZhbGlkYXRpb24oKSB7XG4gIHVzZURldlNldHVwV2FybmluZygoKSA9PiB7XG4gICAgY2hlY2tSZWFjdFZlcnNpb24ocGVlckRlcGVuZGVuY2llcy5yZWFjdCwgUmVhY3RfX2RlZmF1bHRbXCJkZWZhdWx0XCJdLnZlcnNpb24pO1xuICAgIGNoZWNrRG9jdHlwZShkb2N1bWVudCk7XG4gIH0sIFtdKTtcbn1cblxuZnVuY3Rpb24gdXNlUHJldmlvdXMoY3VycmVudCkge1xuICBjb25zdCByZWYgPSBSZWFjdC51c2VSZWYoY3VycmVudCk7XG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgcmVmLmN1cnJlbnQgPSBjdXJyZW50O1xuICB9KTtcbiAgcmV0dXJuIHJlZjtcbn1cblxuZnVuY3Rpb24gY3JlYXRlKCkge1xuICBsZXQgbG9jayA9IG51bGw7XG5cbiAgZnVuY3Rpb24gaXNDbGFpbWVkKCkge1xuICAgIHJldHVybiBCb29sZWFuKGxvY2spO1xuICB9XG5cbiAgZnVuY3Rpb24gaXNBY3RpdmUodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgPT09IGxvY2s7XG4gIH1cblxuICBmdW5jdGlvbiBjbGFpbShhYmFuZG9uKSB7XG4gICAgISFsb2NrID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gaW52YXJpYW50KGZhbHNlLCAnQ2Fubm90IGNsYWltIGxvY2sgYXMgaXQgaXMgYWxyZWFkeSBjbGFpbWVkJykgOiBpbnZhcmlhbnQoZmFsc2UpIDogdm9pZCAwO1xuICAgIGNvbnN0IG5ld0xvY2sgPSB7XG4gICAgICBhYmFuZG9uXG4gICAgfTtcbiAgICBsb2NrID0gbmV3TG9jaztcbiAgICByZXR1cm4gbmV3TG9jaztcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlbGVhc2UoKSB7XG4gICAgIWxvY2sgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBpbnZhcmlhbnQoZmFsc2UsICdDYW5ub3QgcmVsZWFzZSBsb2NrIHdoZW4gdGhlcmUgaXMgbm8gbG9jaycpIDogaW52YXJpYW50KGZhbHNlKSA6IHZvaWQgMDtcbiAgICBsb2NrID0gbnVsbDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRyeUFiYW5kb24oKSB7XG4gICAgaWYgKGxvY2spIHtcbiAgICAgIGxvY2suYWJhbmRvbigpO1xuICAgICAgcmVsZWFzZSgpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgaXNDbGFpbWVkLFxuICAgIGlzQWN0aXZlLFxuICAgIGNsYWltLFxuICAgIHJlbGVhc2UsXG4gICAgdHJ5QWJhbmRvblxuICB9O1xufVxuXG5mdW5jdGlvbiBpc0RyYWdnaW5nKHN0YXRlKSB7XG4gIGlmIChzdGF0ZS5waGFzZSA9PT0gJ0lETEUnIHx8IHN0YXRlLnBoYXNlID09PSAnRFJPUF9BTklNQVRJTkcnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHN0YXRlLmlzRHJhZ2dpbmc7XG59XG5cbmNvbnN0IHRhYiA9IDk7XG5jb25zdCBlbnRlciA9IDEzO1xuY29uc3QgZXNjYXBlID0gMjc7XG5jb25zdCBzcGFjZSA9IDMyO1xuY29uc3QgcGFnZVVwID0gMzM7XG5jb25zdCBwYWdlRG93biA9IDM0O1xuY29uc3QgZW5kID0gMzU7XG5jb25zdCBob21lID0gMzY7XG5jb25zdCBhcnJvd0xlZnQgPSAzNztcbmNvbnN0IGFycm93VXAgPSAzODtcbmNvbnN0IGFycm93UmlnaHQgPSAzOTtcbmNvbnN0IGFycm93RG93biA9IDQwO1xuXG5jb25zdCBwcmV2ZW50ZWRLZXlzID0ge1xuICBbZW50ZXJdOiB0cnVlLFxuICBbdGFiXTogdHJ1ZVxufTtcbnZhciBwcmV2ZW50U3RhbmRhcmRLZXlFdmVudHMgPSAoZXZlbnQgPT4ge1xuICBpZiAocHJldmVudGVkS2V5c1tldmVudC5rZXlDb2RlXSkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIH1cbn0pO1xuXG5jb25zdCBzdXBwb3J0ZWRFdmVudE5hbWUgPSAoKCkgPT4ge1xuICBjb25zdCBiYXNlID0gJ3Zpc2liaWxpdHljaGFuZ2UnO1xuXG4gIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIGJhc2U7XG4gIH1cblxuICBjb25zdCBjYW5kaWRhdGVzID0gW2Jhc2UsIGBtcyR7YmFzZX1gLCBgd2Via2l0JHtiYXNlfWAsIGBtb3oke2Jhc2V9YCwgYG8ke2Jhc2V9YF07XG4gIGNvbnN0IHN1cHBvcnRlZCA9IGNhbmRpZGF0ZXMuZmluZChldmVudE5hbWUgPT4gYG9uJHtldmVudE5hbWV9YCBpbiBkb2N1bWVudCk7XG4gIHJldHVybiBzdXBwb3J0ZWQgfHwgYmFzZTtcbn0pKCk7XG5cbnZhciBzdXBwb3J0ZWRQYWdlVmlzaWJpbGl0eUV2ZW50TmFtZSA9IHN1cHBvcnRlZEV2ZW50TmFtZTtcblxuY29uc3QgcHJpbWFyeUJ1dHRvbiA9IDA7XG5jb25zdCBzbG9wcHlDbGlja1RocmVzaG9sZCA9IDU7XG5cbmZ1bmN0aW9uIGlzU2xvcHB5Q2xpY2tUaHJlc2hvbGRFeGNlZWRlZChvcmlnaW5hbCwgY3VycmVudCkge1xuICByZXR1cm4gTWF0aC5hYnMoY3VycmVudC54IC0gb3JpZ2luYWwueCkgPj0gc2xvcHB5Q2xpY2tUaHJlc2hvbGQgfHwgTWF0aC5hYnMoY3VycmVudC55IC0gb3JpZ2luYWwueSkgPj0gc2xvcHB5Q2xpY2tUaHJlc2hvbGQ7XG59XG5cbmNvbnN0IGlkbGUkMSA9IHtcbiAgdHlwZTogJ0lETEUnXG59O1xuXG5mdW5jdGlvbiBnZXRDYXB0dXJlQmluZGluZ3MoX3JlZikge1xuICBsZXQge1xuICAgIGNhbmNlbCxcbiAgICBjb21wbGV0ZWQsXG4gICAgZ2V0UGhhc2UsXG4gICAgc2V0UGhhc2VcbiAgfSA9IF9yZWY7XG4gIHJldHVybiBbe1xuICAgIGV2ZW50TmFtZTogJ21vdXNlbW92ZScsXG4gICAgZm46IGV2ZW50ID0+IHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgYnV0dG9uLFxuICAgICAgICBjbGllbnRYLFxuICAgICAgICBjbGllbnRZXG4gICAgICB9ID0gZXZlbnQ7XG5cbiAgICAgIGlmIChidXR0b24gIT09IHByaW1hcnlCdXR0b24pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwb2ludCA9IHtcbiAgICAgICAgeDogY2xpZW50WCxcbiAgICAgICAgeTogY2xpZW50WVxuICAgICAgfTtcbiAgICAgIGNvbnN0IHBoYXNlID0gZ2V0UGhhc2UoKTtcblxuICAgICAgaWYgKHBoYXNlLnR5cGUgPT09ICdEUkFHR0lORycpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgcGhhc2UuYWN0aW9ucy5tb3ZlKHBvaW50KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAhKHBoYXNlLnR5cGUgPT09ICdQRU5ESU5HJykgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBpbnZhcmlhbnQoZmFsc2UsICdDYW5ub3QgYmUgSURMRScpIDogaW52YXJpYW50KGZhbHNlKSA6IHZvaWQgMDtcbiAgICAgIGNvbnN0IHBlbmRpbmcgPSBwaGFzZS5wb2ludDtcblxuICAgICAgaWYgKCFpc1Nsb3BweUNsaWNrVGhyZXNob2xkRXhjZWVkZWQocGVuZGluZywgcG9pbnQpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGNvbnN0IGFjdGlvbnMgPSBwaGFzZS5hY3Rpb25zLmZsdWlkTGlmdChwb2ludCk7XG4gICAgICBzZXRQaGFzZSh7XG4gICAgICAgIHR5cGU6ICdEUkFHR0lORycsXG4gICAgICAgIGFjdGlvbnNcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwge1xuICAgIGV2ZW50TmFtZTogJ21vdXNldXAnLFxuICAgIGZuOiBldmVudCA9PiB7XG4gICAgICBjb25zdCBwaGFzZSA9IGdldFBoYXNlKCk7XG5cbiAgICAgIGlmIChwaGFzZS50eXBlICE9PSAnRFJBR0dJTkcnKSB7XG4gICAgICAgIGNhbmNlbCgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBwaGFzZS5hY3Rpb25zLmRyb3Aoe1xuICAgICAgICBzaG91bGRCbG9ja05leHRDbGljazogdHJ1ZVxuICAgICAgfSk7XG4gICAgICBjb21wbGV0ZWQoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBldmVudE5hbWU6ICdtb3VzZWRvd24nLFxuICAgIGZuOiBldmVudCA9PiB7XG4gICAgICBpZiAoZ2V0UGhhc2UoKS50eXBlID09PSAnRFJBR0dJTkcnKSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9XG5cbiAgICAgIGNhbmNlbCgpO1xuICAgIH1cbiAgfSwge1xuICAgIGV2ZW50TmFtZTogJ2tleWRvd24nLFxuICAgIGZuOiBldmVudCA9PiB7XG4gICAgICBjb25zdCBwaGFzZSA9IGdldFBoYXNlKCk7XG5cbiAgICAgIGlmIChwaGFzZS50eXBlID09PSAnUEVORElORycpIHtcbiAgICAgICAgY2FuY2VsKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGV2ZW50LmtleUNvZGUgPT09IGVzY2FwZSkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBjYW5jZWwoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBwcmV2ZW50U3RhbmRhcmRLZXlFdmVudHMoZXZlbnQpO1xuICAgIH1cbiAgfSwge1xuICAgIGV2ZW50TmFtZTogJ3Jlc2l6ZScsXG4gICAgZm46IGNhbmNlbFxuICB9LCB7XG4gICAgZXZlbnROYW1lOiAnc2Nyb2xsJyxcbiAgICBvcHRpb25zOiB7XG4gICAgICBwYXNzaXZlOiB0cnVlLFxuICAgICAgY2FwdHVyZTogZmFsc2VcbiAgICB9LFxuICAgIGZuOiAoKSA9PiB7XG4gICAgICBpZiAoZ2V0UGhhc2UoKS50eXBlID09PSAnUEVORElORycpIHtcbiAgICAgICAgY2FuY2VsKCk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAgZXZlbnROYW1lOiAnd2Via2l0bW91c2Vmb3JjZWRvd24nLFxuICAgIGZuOiBldmVudCA9PiB7XG4gICAgICBjb25zdCBwaGFzZSA9IGdldFBoYXNlKCk7XG4gICAgICAhKHBoYXNlLnR5cGUgIT09ICdJRExFJykgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBpbnZhcmlhbnQoZmFsc2UsICdVbmV4cGVjdGVkIHBoYXNlJykgOiBpbnZhcmlhbnQoZmFsc2UpIDogdm9pZCAwO1xuXG4gICAgICBpZiAocGhhc2UuYWN0aW9ucy5zaG91bGRSZXNwZWN0Rm9yY2VQcmVzcygpKSB7XG4gICAgICAgIGNhbmNlbCgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICB9LCB7XG4gICAgZXZlbnROYW1lOiBzdXBwb3J0ZWRQYWdlVmlzaWJpbGl0eUV2ZW50TmFtZSxcbiAgICBmbjogY2FuY2VsXG4gIH1dO1xufVxuXG5mdW5jdGlvbiB1c2VNb3VzZVNlbnNvcihhcGkpIHtcbiAgY29uc3QgcGhhc2VSZWYgPSBSZWFjdC51c2VSZWYoaWRsZSQxKTtcbiAgY29uc3QgdW5iaW5kRXZlbnRzUmVmID0gUmVhY3QudXNlUmVmKG5vb3AkMik7XG4gIGNvbnN0IHN0YXJ0Q2FwdHVyZUJpbmRpbmcgPSB1c2VNZW1vT25lLnVzZU1lbW8oKCkgPT4gKHtcbiAgICBldmVudE5hbWU6ICdtb3VzZWRvd24nLFxuICAgIGZuOiBmdW5jdGlvbiBvbk1vdXNlRG93bihldmVudCkge1xuICAgICAgaWYgKGV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXZlbnQuYnV0dG9uICE9PSBwcmltYXJ5QnV0dG9uKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQubWV0YUtleSB8fCBldmVudC5zaGlmdEtleSB8fCBldmVudC5hbHRLZXkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBkcmFnZ2FibGVJZCA9IGFwaS5maW5kQ2xvc2VzdERyYWdnYWJsZUlkKGV2ZW50KTtcblxuICAgICAgaWYgKCFkcmFnZ2FibGVJZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGFjdGlvbnMgPSBhcGkudHJ5R2V0TG9jayhkcmFnZ2FibGVJZCwgc3RvcCwge1xuICAgICAgICBzb3VyY2VFdmVudDogZXZlbnRcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoIWFjdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgY29uc3QgcG9pbnQgPSB7XG4gICAgICAgIHg6IGV2ZW50LmNsaWVudFgsXG4gICAgICAgIHk6IGV2ZW50LmNsaWVudFlcbiAgICAgIH07XG4gICAgICB1bmJpbmRFdmVudHNSZWYuY3VycmVudCgpO1xuICAgICAgc3RhcnRQZW5kaW5nRHJhZyhhY3Rpb25zLCBwb2ludCk7XG4gICAgfVxuICB9KSwgW2FwaV0pO1xuICBjb25zdCBwcmV2ZW50Rm9yY2VQcmVzc0JpbmRpbmcgPSB1c2VNZW1vT25lLnVzZU1lbW8oKCkgPT4gKHtcbiAgICBldmVudE5hbWU6ICd3ZWJraXRtb3VzZWZvcmNld2lsbGJlZ2luJyxcbiAgICBmbjogZXZlbnQgPT4ge1xuICAgICAgaWYgKGV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBpZCA9IGFwaS5maW5kQ2xvc2VzdERyYWdnYWJsZUlkKGV2ZW50KTtcblxuICAgICAgaWYgKCFpZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG9wdGlvbnMgPSBhcGkuZmluZE9wdGlvbnNGb3JEcmFnZ2FibGUoaWQpO1xuXG4gICAgICBpZiAoIW9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAob3B0aW9ucy5zaG91bGRSZXNwZWN0Rm9yY2VQcmVzcykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICghYXBpLmNhbkdldExvY2soaWQpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gIH0pLCBbYXBpXSk7XG4gIGNvbnN0IGxpc3RlbkZvckNhcHR1cmUgPSB1c2VNZW1vT25lLnVzZUNhbGxiYWNrKGZ1bmN0aW9uIGxpc3RlbkZvckNhcHR1cmUoKSB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgIHBhc3NpdmU6IGZhbHNlLFxuICAgICAgY2FwdHVyZTogdHJ1ZVxuICAgIH07XG4gICAgdW5iaW5kRXZlbnRzUmVmLmN1cnJlbnQgPSBiaW5kRXZlbnRzKHdpbmRvdywgW3ByZXZlbnRGb3JjZVByZXNzQmluZGluZywgc3RhcnRDYXB0dXJlQmluZGluZ10sIG9wdGlvbnMpO1xuICB9LCBbcHJldmVudEZvcmNlUHJlc3NCaW5kaW5nLCBzdGFydENhcHR1cmVCaW5kaW5nXSk7XG4gIGNvbnN0IHN0b3AgPSB1c2VNZW1vT25lLnVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBjb25zdCBjdXJyZW50ID0gcGhhc2VSZWYuY3VycmVudDtcblxuICAgIGlmIChjdXJyZW50LnR5cGUgPT09ICdJRExFJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHBoYXNlUmVmLmN1cnJlbnQgPSBpZGxlJDE7XG4gICAgdW5iaW5kRXZlbnRzUmVmLmN1cnJlbnQoKTtcbiAgICBsaXN0ZW5Gb3JDYXB0dXJlKCk7XG4gIH0sIFtsaXN0ZW5Gb3JDYXB0dXJlXSk7XG4gIGNvbnN0IGNhbmNlbCA9IHVzZU1lbW9PbmUudXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGNvbnN0IHBoYXNlID0gcGhhc2VSZWYuY3VycmVudDtcbiAgICBzdG9wKCk7XG5cbiAgICBpZiAocGhhc2UudHlwZSA9PT0gJ0RSQUdHSU5HJykge1xuICAgICAgcGhhc2UuYWN0aW9ucy5jYW5jZWwoe1xuICAgICAgICBzaG91bGRCbG9ja05leHRDbGljazogdHJ1ZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHBoYXNlLnR5cGUgPT09ICdQRU5ESU5HJykge1xuICAgICAgcGhhc2UuYWN0aW9ucy5hYm9ydCgpO1xuICAgIH1cbiAgfSwgW3N0b3BdKTtcbiAgY29uc3QgYmluZENhcHR1cmluZ0V2ZW50cyA9IHVzZU1lbW9PbmUudXNlQ2FsbGJhY2soZnVuY3Rpb24gYmluZENhcHR1cmluZ0V2ZW50cygpIHtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgY2FwdHVyZTogdHJ1ZSxcbiAgICAgIHBhc3NpdmU6IGZhbHNlXG4gICAgfTtcbiAgICBjb25zdCBiaW5kaW5ncyA9IGdldENhcHR1cmVCaW5kaW5ncyh7XG4gICAgICBjYW5jZWwsXG4gICAgICBjb21wbGV0ZWQ6IHN0b3AsXG4gICAgICBnZXRQaGFzZTogKCkgPT4gcGhhc2VSZWYuY3VycmVudCxcbiAgICAgIHNldFBoYXNlOiBwaGFzZSA9PiB7XG4gICAgICAgIHBoYXNlUmVmLmN1cnJlbnQgPSBwaGFzZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB1bmJpbmRFdmVudHNSZWYuY3VycmVudCA9IGJpbmRFdmVudHMod2luZG93LCBiaW5kaW5ncywgb3B0aW9ucyk7XG4gIH0sIFtjYW5jZWwsIHN0b3BdKTtcbiAgY29uc3Qgc3RhcnRQZW5kaW5nRHJhZyA9IHVzZU1lbW9PbmUudXNlQ2FsbGJhY2soZnVuY3Rpb24gc3RhcnRQZW5kaW5nRHJhZyhhY3Rpb25zLCBwb2ludCkge1xuICAgICEocGhhc2VSZWYuY3VycmVudC50eXBlID09PSAnSURMRScpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gaW52YXJpYW50KGZhbHNlLCAnRXhwZWN0ZWQgdG8gbW92ZSBmcm9tIElETEUgdG8gUEVORElORyBkcmFnJykgOiBpbnZhcmlhbnQoZmFsc2UpIDogdm9pZCAwO1xuICAgIHBoYXNlUmVmLmN1cnJlbnQgPSB7XG4gICAgICB0eXBlOiAnUEVORElORycsXG4gICAgICBwb2ludCxcbiAgICAgIGFjdGlvbnNcbiAgICB9O1xuICAgIGJpbmRDYXB0dXJpbmdFdmVudHMoKTtcbiAgfSwgW2JpbmRDYXB0dXJpbmdFdmVudHNdKTtcbiAgdXNlTGF5b3V0RWZmZWN0KGZ1bmN0aW9uIG1vdW50KCkge1xuICAgIGxpc3RlbkZvckNhcHR1cmUoKTtcbiAgICByZXR1cm4gZnVuY3Rpb24gdW5tb3VudCgpIHtcbiAgICAgIHVuYmluZEV2ZW50c1JlZi5jdXJyZW50KCk7XG4gICAgfTtcbiAgfSwgW2xpc3RlbkZvckNhcHR1cmVdKTtcbn1cblxuZnVuY3Rpb24gbm9vcCQxKCkge31cblxuY29uc3Qgc2Nyb2xsSnVtcEtleXMgPSB7XG4gIFtwYWdlRG93bl06IHRydWUsXG4gIFtwYWdlVXBdOiB0cnVlLFxuICBbaG9tZV06IHRydWUsXG4gIFtlbmRdOiB0cnVlXG59O1xuXG5mdW5jdGlvbiBnZXREcmFnZ2luZ0JpbmRpbmdzKGFjdGlvbnMsIHN0b3ApIHtcbiAgZnVuY3Rpb24gY2FuY2VsKCkge1xuICAgIHN0b3AoKTtcbiAgICBhY3Rpb25zLmNhbmNlbCgpO1xuICB9XG5cbiAgZnVuY3Rpb24gZHJvcCgpIHtcbiAgICBzdG9wKCk7XG4gICAgYWN0aW9ucy5kcm9wKCk7XG4gIH1cblxuICByZXR1cm4gW3tcbiAgICBldmVudE5hbWU6ICdrZXlkb3duJyxcbiAgICBmbjogZXZlbnQgPT4ge1xuICAgICAgaWYgKGV2ZW50LmtleUNvZGUgPT09IGVzY2FwZSkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBjYW5jZWwoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXZlbnQua2V5Q29kZSA9PT0gc3BhY2UpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZHJvcCgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChldmVudC5rZXlDb2RlID09PSBhcnJvd0Rvd24pIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgYWN0aW9ucy5tb3ZlRG93bigpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChldmVudC5rZXlDb2RlID09PSBhcnJvd1VwKSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGFjdGlvbnMubW92ZVVwKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGV2ZW50LmtleUNvZGUgPT09IGFycm93UmlnaHQpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgYWN0aW9ucy5tb3ZlUmlnaHQoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXZlbnQua2V5Q29kZSA9PT0gYXJyb3dMZWZ0KSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGFjdGlvbnMubW92ZUxlZnQoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2Nyb2xsSnVtcEtleXNbZXZlbnQua2V5Q29kZV0pIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBwcmV2ZW50U3RhbmRhcmRLZXlFdmVudHMoZXZlbnQpO1xuICAgIH1cbiAgfSwge1xuICAgIGV2ZW50TmFtZTogJ21vdXNlZG93bicsXG4gICAgZm46IGNhbmNlbFxuICB9LCB7XG4gICAgZXZlbnROYW1lOiAnbW91c2V1cCcsXG4gICAgZm46IGNhbmNlbFxuICB9LCB7XG4gICAgZXZlbnROYW1lOiAnY2xpY2snLFxuICAgIGZuOiBjYW5jZWxcbiAgfSwge1xuICAgIGV2ZW50TmFtZTogJ3RvdWNoc3RhcnQnLFxuICAgIGZuOiBjYW5jZWxcbiAgfSwge1xuICAgIGV2ZW50TmFtZTogJ3Jlc2l6ZScsXG4gICAgZm46IGNhbmNlbFxuICB9LCB7XG4gICAgZXZlbnROYW1lOiAnd2hlZWwnLFxuICAgIGZuOiBjYW5jZWwsXG4gICAgb3B0aW9uczoge1xuICAgICAgcGFzc2l2ZTogdHJ1ZVxuICAgIH1cbiAgfSwge1xuICAgIGV2ZW50TmFtZTogc3VwcG9ydGVkUGFnZVZpc2liaWxpdHlFdmVudE5hbWUsXG4gICAgZm46IGNhbmNlbFxuICB9XTtcbn1cblxuZnVuY3Rpb24gdXNlS2V5Ym9hcmRTZW5zb3IoYXBpKSB7XG4gIGNvbnN0IHVuYmluZEV2ZW50c1JlZiA9IFJlYWN0LnVzZVJlZihub29wJDEpO1xuICBjb25zdCBzdGFydENhcHR1cmVCaW5kaW5nID0gdXNlTWVtb09uZS51c2VNZW1vKCgpID0+ICh7XG4gICAgZXZlbnROYW1lOiAna2V5ZG93bicsXG4gICAgZm46IGZ1bmN0aW9uIG9uS2V5RG93bihldmVudCkge1xuICAgICAgaWYgKGV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXZlbnQua2V5Q29kZSAhPT0gc3BhY2UpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBkcmFnZ2FibGVJZCA9IGFwaS5maW5kQ2xvc2VzdERyYWdnYWJsZUlkKGV2ZW50KTtcblxuICAgICAgaWYgKCFkcmFnZ2FibGVJZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHByZURyYWcgPSBhcGkudHJ5R2V0TG9jayhkcmFnZ2FibGVJZCwgc3RvcCwge1xuICAgICAgICBzb3VyY2VFdmVudDogZXZlbnRcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoIXByZURyYWcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgbGV0IGlzQ2FwdHVyaW5nID0gdHJ1ZTtcbiAgICAgIGNvbnN0IGFjdGlvbnMgPSBwcmVEcmFnLnNuYXBMaWZ0KCk7XG4gICAgICB1bmJpbmRFdmVudHNSZWYuY3VycmVudCgpO1xuXG4gICAgICBmdW5jdGlvbiBzdG9wKCkge1xuICAgICAgICAhaXNDYXB0dXJpbmcgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBpbnZhcmlhbnQoZmFsc2UsICdDYW5ub3Qgc3RvcCBjYXB0dXJpbmcgYSBrZXlib2FyZCBkcmFnIHdoZW4gbm90IGNhcHR1cmluZycpIDogaW52YXJpYW50KGZhbHNlKSA6IHZvaWQgMDtcbiAgICAgICAgaXNDYXB0dXJpbmcgPSBmYWxzZTtcbiAgICAgICAgdW5iaW5kRXZlbnRzUmVmLmN1cnJlbnQoKTtcbiAgICAgICAgbGlzdGVuRm9yQ2FwdHVyZSgpO1xuICAgICAgfVxuXG4gICAgICB1bmJpbmRFdmVudHNSZWYuY3VycmVudCA9IGJpbmRFdmVudHMod2luZG93LCBnZXREcmFnZ2luZ0JpbmRpbmdzKGFjdGlvbnMsIHN0b3ApLCB7XG4gICAgICAgIGNhcHR1cmU6IHRydWUsXG4gICAgICAgIHBhc3NpdmU6IGZhbHNlXG4gICAgICB9KTtcbiAgICB9XG4gIH0pLCBbYXBpXSk7XG4gIGNvbnN0IGxpc3RlbkZvckNhcHR1cmUgPSB1c2VNZW1vT25lLnVzZUNhbGxiYWNrKGZ1bmN0aW9uIHRyeVN0YXJ0Q2FwdHVyZSgpIHtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgcGFzc2l2ZTogZmFsc2UsXG4gICAgICBjYXB0dXJlOiB0cnVlXG4gICAgfTtcbiAgICB1bmJpbmRFdmVudHNSZWYuY3VycmVudCA9IGJpbmRFdmVudHMod2luZG93LCBbc3RhcnRDYXB0dXJlQmluZGluZ10sIG9wdGlvbnMpO1xuICB9LCBbc3RhcnRDYXB0dXJlQmluZGluZ10pO1xuICB1c2VMYXlvdXRFZmZlY3QoZnVuY3Rpb24gbW91bnQoKSB7XG4gICAgbGlzdGVuRm9yQ2FwdHVyZSgpO1xuICAgIHJldHVybiBmdW5jdGlvbiB1bm1vdW50KCkge1xuICAgICAgdW5iaW5kRXZlbnRzUmVmLmN1cnJlbnQoKTtcbiAgICB9O1xuICB9LCBbbGlzdGVuRm9yQ2FwdHVyZV0pO1xufVxuXG5jb25zdCBpZGxlID0ge1xuICB0eXBlOiAnSURMRSdcbn07XG5jb25zdCB0aW1lRm9yTG9uZ1ByZXNzID0gMTIwO1xuY29uc3QgZm9yY2VQcmVzc1RocmVzaG9sZCA9IDAuMTU7XG5cbmZ1bmN0aW9uIGdldFdpbmRvd0JpbmRpbmdzKF9yZWYpIHtcbiAgbGV0IHtcbiAgICBjYW5jZWwsXG4gICAgZ2V0UGhhc2VcbiAgfSA9IF9yZWY7XG4gIHJldHVybiBbe1xuICAgIGV2ZW50TmFtZTogJ29yaWVudGF0aW9uY2hhbmdlJyxcbiAgICBmbjogY2FuY2VsXG4gIH0sIHtcbiAgICBldmVudE5hbWU6ICdyZXNpemUnLFxuICAgIGZuOiBjYW5jZWxcbiAgfSwge1xuICAgIGV2ZW50TmFtZTogJ2NvbnRleHRtZW51JyxcbiAgICBmbjogZXZlbnQgPT4ge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBldmVudE5hbWU6ICdrZXlkb3duJyxcbiAgICBmbjogZXZlbnQgPT4ge1xuICAgICAgaWYgKGdldFBoYXNlKCkudHlwZSAhPT0gJ0RSQUdHSU5HJykge1xuICAgICAgICBjYW5jZWwoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXZlbnQua2V5Q29kZSA9PT0gZXNjYXBlKSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9XG5cbiAgICAgIGNhbmNlbCgpO1xuICAgIH1cbiAgfSwge1xuICAgIGV2ZW50TmFtZTogc3VwcG9ydGVkUGFnZVZpc2liaWxpdHlFdmVudE5hbWUsXG4gICAgZm46IGNhbmNlbFxuICB9XTtcbn1cblxuZnVuY3Rpb24gZ2V0SGFuZGxlQmluZGluZ3MoX3JlZjIpIHtcbiAgbGV0IHtcbiAgICBjYW5jZWwsXG4gICAgY29tcGxldGVkLFxuICAgIGdldFBoYXNlXG4gIH0gPSBfcmVmMjtcbiAgcmV0dXJuIFt7XG4gICAgZXZlbnROYW1lOiAndG91Y2htb3ZlJyxcbiAgICBvcHRpb25zOiB7XG4gICAgICBjYXB0dXJlOiBmYWxzZVxuICAgIH0sXG4gICAgZm46IGV2ZW50ID0+IHtcbiAgICAgIGNvbnN0IHBoYXNlID0gZ2V0UGhhc2UoKTtcblxuICAgICAgaWYgKHBoYXNlLnR5cGUgIT09ICdEUkFHR0lORycpIHtcbiAgICAgICAgY2FuY2VsKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgcGhhc2UuaGFzTW92ZWQgPSB0cnVlO1xuICAgICAgY29uc3Qge1xuICAgICAgICBjbGllbnRYLFxuICAgICAgICBjbGllbnRZXG4gICAgICB9ID0gZXZlbnQudG91Y2hlc1swXTtcbiAgICAgIGNvbnN0IHBvaW50ID0ge1xuICAgICAgICB4OiBjbGllbnRYLFxuICAgICAgICB5OiBjbGllbnRZXG4gICAgICB9O1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHBoYXNlLmFjdGlvbnMubW92ZShwb2ludCk7XG4gICAgfVxuICB9LCB7XG4gICAgZXZlbnROYW1lOiAndG91Y2hlbmQnLFxuICAgIGZuOiBldmVudCA9PiB7XG4gICAgICBjb25zdCBwaGFzZSA9IGdldFBoYXNlKCk7XG5cbiAgICAgIGlmIChwaGFzZS50eXBlICE9PSAnRFJBR0dJTkcnKSB7XG4gICAgICAgIGNhbmNlbCgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBwaGFzZS5hY3Rpb25zLmRyb3Aoe1xuICAgICAgICBzaG91bGRCbG9ja05leHRDbGljazogdHJ1ZVxuICAgICAgfSk7XG4gICAgICBjb21wbGV0ZWQoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBldmVudE5hbWU6ICd0b3VjaGNhbmNlbCcsXG4gICAgZm46IGV2ZW50ID0+IHtcbiAgICAgIGlmIChnZXRQaGFzZSgpLnR5cGUgIT09ICdEUkFHR0lORycpIHtcbiAgICAgICAgY2FuY2VsKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGNhbmNlbCgpO1xuICAgIH1cbiAgfSwge1xuICAgIGV2ZW50TmFtZTogJ3RvdWNoZm9yY2VjaGFuZ2UnLFxuICAgIGZuOiBldmVudCA9PiB7XG4gICAgICBjb25zdCBwaGFzZSA9IGdldFBoYXNlKCk7XG4gICAgICAhKHBoYXNlLnR5cGUgIT09ICdJRExFJykgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBpbnZhcmlhbnQoZmFsc2UpIDogaW52YXJpYW50KGZhbHNlKSA6IHZvaWQgMDtcbiAgICAgIGNvbnN0IHRvdWNoID0gZXZlbnQudG91Y2hlc1swXTtcblxuICAgICAgaWYgKCF0b3VjaCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGlzRm9yY2VQcmVzcyA9IHRvdWNoLmZvcmNlID49IGZvcmNlUHJlc3NUaHJlc2hvbGQ7XG5cbiAgICAgIGlmICghaXNGb3JjZVByZXNzKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2hvdWxkUmVzcGVjdCA9IHBoYXNlLmFjdGlvbnMuc2hvdWxkUmVzcGVjdEZvcmNlUHJlc3MoKTtcblxuICAgICAgaWYgKHBoYXNlLnR5cGUgPT09ICdQRU5ESU5HJykge1xuICAgICAgICBpZiAoc2hvdWxkUmVzcGVjdCkge1xuICAgICAgICAgIGNhbmNlbCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2hvdWxkUmVzcGVjdCkge1xuICAgICAgICBpZiAocGhhc2UuaGFzTW92ZWQpIHtcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNhbmNlbCgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICB9LCB7XG4gICAgZXZlbnROYW1lOiBzdXBwb3J0ZWRQYWdlVmlzaWJpbGl0eUV2ZW50TmFtZSxcbiAgICBmbjogY2FuY2VsXG4gIH1dO1xufVxuXG5mdW5jdGlvbiB1c2VUb3VjaFNlbnNvcihhcGkpIHtcbiAgY29uc3QgcGhhc2VSZWYgPSBSZWFjdC51c2VSZWYoaWRsZSk7XG4gIGNvbnN0IHVuYmluZEV2ZW50c1JlZiA9IFJlYWN0LnVzZVJlZihub29wJDIpO1xuICBjb25zdCBnZXRQaGFzZSA9IHVzZU1lbW9PbmUudXNlQ2FsbGJhY2soZnVuY3Rpb24gZ2V0UGhhc2UoKSB7XG4gICAgcmV0dXJuIHBoYXNlUmVmLmN1cnJlbnQ7XG4gIH0sIFtdKTtcbiAgY29uc3Qgc2V0UGhhc2UgPSB1c2VNZW1vT25lLnVzZUNhbGxiYWNrKGZ1bmN0aW9uIHNldFBoYXNlKHBoYXNlKSB7XG4gICAgcGhhc2VSZWYuY3VycmVudCA9IHBoYXNlO1xuICB9LCBbXSk7XG4gIGNvbnN0IHN0YXJ0Q2FwdHVyZUJpbmRpbmcgPSB1c2VNZW1vT25lLnVzZU1lbW8oKCkgPT4gKHtcbiAgICBldmVudE5hbWU6ICd0b3VjaHN0YXJ0JyxcbiAgICBmbjogZnVuY3Rpb24gb25Ub3VjaFN0YXJ0KGV2ZW50KSB7XG4gICAgICBpZiAoZXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRyYWdnYWJsZUlkID0gYXBpLmZpbmRDbG9zZXN0RHJhZ2dhYmxlSWQoZXZlbnQpO1xuXG4gICAgICBpZiAoIWRyYWdnYWJsZUlkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYWN0aW9ucyA9IGFwaS50cnlHZXRMb2NrKGRyYWdnYWJsZUlkLCBzdG9wLCB7XG4gICAgICAgIHNvdXJjZUV2ZW50OiBldmVudFxuICAgICAgfSk7XG5cbiAgICAgIGlmICghYWN0aW9ucykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRvdWNoID0gZXZlbnQudG91Y2hlc1swXTtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgY2xpZW50WCxcbiAgICAgICAgY2xpZW50WVxuICAgICAgfSA9IHRvdWNoO1xuICAgICAgY29uc3QgcG9pbnQgPSB7XG4gICAgICAgIHg6IGNsaWVudFgsXG4gICAgICAgIHk6IGNsaWVudFlcbiAgICAgIH07XG4gICAgICB1bmJpbmRFdmVudHNSZWYuY3VycmVudCgpO1xuICAgICAgc3RhcnRQZW5kaW5nRHJhZyhhY3Rpb25zLCBwb2ludCk7XG4gICAgfVxuICB9KSwgW2FwaV0pO1xuICBjb25zdCBsaXN0ZW5Gb3JDYXB0dXJlID0gdXNlTWVtb09uZS51c2VDYWxsYmFjayhmdW5jdGlvbiBsaXN0ZW5Gb3JDYXB0dXJlKCkge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICBjYXB0dXJlOiB0cnVlLFxuICAgICAgcGFzc2l2ZTogZmFsc2VcbiAgICB9O1xuICAgIHVuYmluZEV2ZW50c1JlZi5jdXJyZW50ID0gYmluZEV2ZW50cyh3aW5kb3csIFtzdGFydENhcHR1cmVCaW5kaW5nXSwgb3B0aW9ucyk7XG4gIH0sIFtzdGFydENhcHR1cmVCaW5kaW5nXSk7XG4gIGNvbnN0IHN0b3AgPSB1c2VNZW1vT25lLnVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBjb25zdCBjdXJyZW50ID0gcGhhc2VSZWYuY3VycmVudDtcblxuICAgIGlmIChjdXJyZW50LnR5cGUgPT09ICdJRExFJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChjdXJyZW50LnR5cGUgPT09ICdQRU5ESU5HJykge1xuICAgICAgY2xlYXJUaW1lb3V0KGN1cnJlbnQubG9uZ1ByZXNzVGltZXJJZCk7XG4gICAgfVxuXG4gICAgc2V0UGhhc2UoaWRsZSk7XG4gICAgdW5iaW5kRXZlbnRzUmVmLmN1cnJlbnQoKTtcbiAgICBsaXN0ZW5Gb3JDYXB0dXJlKCk7XG4gIH0sIFtsaXN0ZW5Gb3JDYXB0dXJlLCBzZXRQaGFzZV0pO1xuICBjb25zdCBjYW5jZWwgPSB1c2VNZW1vT25lLnVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBjb25zdCBwaGFzZSA9IHBoYXNlUmVmLmN1cnJlbnQ7XG4gICAgc3RvcCgpO1xuXG4gICAgaWYgKHBoYXNlLnR5cGUgPT09ICdEUkFHR0lORycpIHtcbiAgICAgIHBoYXNlLmFjdGlvbnMuY2FuY2VsKHtcbiAgICAgICAgc2hvdWxkQmxvY2tOZXh0Q2xpY2s6IHRydWVcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChwaGFzZS50eXBlID09PSAnUEVORElORycpIHtcbiAgICAgIHBoYXNlLmFjdGlvbnMuYWJvcnQoKTtcbiAgICB9XG4gIH0sIFtzdG9wXSk7XG4gIGNvbnN0IGJpbmRDYXB0dXJpbmdFdmVudHMgPSB1c2VNZW1vT25lLnVzZUNhbGxiYWNrKGZ1bmN0aW9uIGJpbmRDYXB0dXJpbmdFdmVudHMoKSB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgIGNhcHR1cmU6IHRydWUsXG4gICAgICBwYXNzaXZlOiBmYWxzZVxuICAgIH07XG4gICAgY29uc3QgYXJncyA9IHtcbiAgICAgIGNhbmNlbCxcbiAgICAgIGNvbXBsZXRlZDogc3RvcCxcbiAgICAgIGdldFBoYXNlXG4gICAgfTtcbiAgICBjb25zdCB1bmJpbmRUYXJnZXQgPSBiaW5kRXZlbnRzKHdpbmRvdywgZ2V0SGFuZGxlQmluZGluZ3MoYXJncyksIG9wdGlvbnMpO1xuICAgIGNvbnN0IHVuYmluZFdpbmRvdyA9IGJpbmRFdmVudHMod2luZG93LCBnZXRXaW5kb3dCaW5kaW5ncyhhcmdzKSwgb3B0aW9ucyk7XG5cbiAgICB1bmJpbmRFdmVudHNSZWYuY3VycmVudCA9IGZ1bmN0aW9uIHVuYmluZEFsbCgpIHtcbiAgICAgIHVuYmluZFRhcmdldCgpO1xuICAgICAgdW5iaW5kV2luZG93KCk7XG4gICAgfTtcbiAgfSwgW2NhbmNlbCwgZ2V0UGhhc2UsIHN0b3BdKTtcbiAgY29uc3Qgc3RhcnREcmFnZ2luZyA9IHVzZU1lbW9PbmUudXNlQ2FsbGJhY2soZnVuY3Rpb24gc3RhcnREcmFnZ2luZygpIHtcbiAgICBjb25zdCBwaGFzZSA9IGdldFBoYXNlKCk7XG4gICAgIShwaGFzZS50eXBlID09PSAnUEVORElORycpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gaW52YXJpYW50KGZhbHNlLCBgQ2Fubm90IHN0YXJ0IGRyYWdnaW5nIGZyb20gcGhhc2UgJHtwaGFzZS50eXBlfWApIDogaW52YXJpYW50KGZhbHNlKSA6IHZvaWQgMDtcbiAgICBjb25zdCBhY3Rpb25zID0gcGhhc2UuYWN0aW9ucy5mbHVpZExpZnQocGhhc2UucG9pbnQpO1xuICAgIHNldFBoYXNlKHtcbiAgICAgIHR5cGU6ICdEUkFHR0lORycsXG4gICAgICBhY3Rpb25zLFxuICAgICAgaGFzTW92ZWQ6IGZhbHNlXG4gICAgfSk7XG4gIH0sIFtnZXRQaGFzZSwgc2V0UGhhc2VdKTtcbiAgY29uc3Qgc3RhcnRQZW5kaW5nRHJhZyA9IHVzZU1lbW9PbmUudXNlQ2FsbGJhY2soZnVuY3Rpb24gc3RhcnRQZW5kaW5nRHJhZyhhY3Rpb25zLCBwb2ludCkge1xuICAgICEoZ2V0UGhhc2UoKS50eXBlID09PSAnSURMRScpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gaW52YXJpYW50KGZhbHNlLCAnRXhwZWN0ZWQgdG8gbW92ZSBmcm9tIElETEUgdG8gUEVORElORyBkcmFnJykgOiBpbnZhcmlhbnQoZmFsc2UpIDogdm9pZCAwO1xuICAgIGNvbnN0IGxvbmdQcmVzc1RpbWVySWQgPSBzZXRUaW1lb3V0KHN0YXJ0RHJhZ2dpbmcsIHRpbWVGb3JMb25nUHJlc3MpO1xuICAgIHNldFBoYXNlKHtcbiAgICAgIHR5cGU6ICdQRU5ESU5HJyxcbiAgICAgIHBvaW50LFxuICAgICAgYWN0aW9ucyxcbiAgICAgIGxvbmdQcmVzc1RpbWVySWRcbiAgICB9KTtcbiAgICBiaW5kQ2FwdHVyaW5nRXZlbnRzKCk7XG4gIH0sIFtiaW5kQ2FwdHVyaW5nRXZlbnRzLCBnZXRQaGFzZSwgc2V0UGhhc2UsIHN0YXJ0RHJhZ2dpbmddKTtcbiAgdXNlTGF5b3V0RWZmZWN0KGZ1bmN0aW9uIG1vdW50KCkge1xuICAgIGxpc3RlbkZvckNhcHR1cmUoKTtcbiAgICByZXR1cm4gZnVuY3Rpb24gdW5tb3VudCgpIHtcbiAgICAgIHVuYmluZEV2ZW50c1JlZi5jdXJyZW50KCk7XG4gICAgICBjb25zdCBwaGFzZSA9IGdldFBoYXNlKCk7XG5cbiAgICAgIGlmIChwaGFzZS50eXBlID09PSAnUEVORElORycpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHBoYXNlLmxvbmdQcmVzc1RpbWVySWQpO1xuICAgICAgICBzZXRQaGFzZShpZGxlKTtcbiAgICAgIH1cbiAgICB9O1xuICB9LCBbZ2V0UGhhc2UsIGxpc3RlbkZvckNhcHR1cmUsIHNldFBoYXNlXSk7XG4gIHVzZUxheW91dEVmZmVjdChmdW5jdGlvbiB3ZWJraXRIYWNrKCkge1xuICAgIGNvbnN0IHVuYmluZCA9IGJpbmRFdmVudHMod2luZG93LCBbe1xuICAgICAgZXZlbnROYW1lOiAndG91Y2htb3ZlJyxcbiAgICAgIGZuOiAoKSA9PiB7fSxcbiAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgY2FwdHVyZTogZmFsc2UsXG4gICAgICAgIHBhc3NpdmU6IGZhbHNlXG4gICAgICB9XG4gICAgfV0pO1xuICAgIHJldHVybiB1bmJpbmQ7XG4gIH0sIFtdKTtcbn1cblxuZnVuY3Rpb24gdXNlVmFsaWRhdGVTZW5zb3JIb29rcyhzZW5zb3JIb29rcykge1xuICB1c2VEZXYoKCkgPT4ge1xuICAgIGNvbnN0IHByZXZpb3VzUmVmID0gdXNlUHJldmlvdXMoc2Vuc29ySG9va3MpO1xuICAgIHVzZURldlNldHVwV2FybmluZygoKSA9PiB7XG4gICAgICAhKHByZXZpb3VzUmVmLmN1cnJlbnQubGVuZ3RoID09PSBzZW5zb3JIb29rcy5sZW5ndGgpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gaW52YXJpYW50KGZhbHNlLCAnQ2Fubm90IGNoYW5nZSB0aGUgYW1vdW50IG9mIHNlbnNvciBob29rcyBhZnRlciBtb3VudGluZycpIDogaW52YXJpYW50KGZhbHNlKSA6IHZvaWQgMDtcbiAgICB9KTtcbiAgfSk7XG59XG5cbmNvbnN0IGludGVyYWN0aXZlVGFnTmFtZXMgPSBbJ2lucHV0JywgJ2J1dHRvbicsICd0ZXh0YXJlYScsICdzZWxlY3QnLCAnb3B0aW9uJywgJ29wdGdyb3VwJywgJ3ZpZGVvJywgJ2F1ZGlvJ107XG5cbmZ1bmN0aW9uIGlzQW5JbnRlcmFjdGl2ZUVsZW1lbnQocGFyZW50LCBjdXJyZW50KSB7XG4gIGlmIChjdXJyZW50ID09IG51bGwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBoYXNBbkludGVyYWN0aXZlVGFnID0gaW50ZXJhY3RpdmVUYWdOYW1lcy5pbmNsdWRlcyhjdXJyZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKSk7XG5cbiAgaWYgKGhhc0FuSW50ZXJhY3RpdmVUYWcpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGNvbnN0IGF0dHJpYnV0ZSA9IGN1cnJlbnQuZ2V0QXR0cmlidXRlKCdjb250ZW50ZWRpdGFibGUnKTtcblxuICBpZiAoYXR0cmlidXRlID09PSAndHJ1ZScgfHwgYXR0cmlidXRlID09PSAnJykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKGN1cnJlbnQgPT09IHBhcmVudCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBpc0FuSW50ZXJhY3RpdmVFbGVtZW50KHBhcmVudCwgY3VycmVudC5wYXJlbnRFbGVtZW50KTtcbn1cblxuZnVuY3Rpb24gaXNFdmVudEluSW50ZXJhY3RpdmVFbGVtZW50KGRyYWdnYWJsZSwgZXZlbnQpIHtcbiAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xuXG4gIGlmICghaXNIdG1sRWxlbWVudCh0YXJnZXQpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIGlzQW5JbnRlcmFjdGl2ZUVsZW1lbnQoZHJhZ2dhYmxlLCB0YXJnZXQpO1xufVxuXG52YXIgZ2V0Qm9yZGVyQm94Q2VudGVyUG9zaXRpb24gPSAoZWwgPT4gY3NzQm94TW9kZWwuZ2V0UmVjdChlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSkuY2VudGVyKTtcblxuZnVuY3Rpb24gaXNFbGVtZW50KGVsKSB7XG4gIHJldHVybiBlbCBpbnN0YW5jZW9mIGdldFdpbmRvd0Zyb21FbChlbCkuRWxlbWVudDtcbn1cblxuY29uc3Qgc3VwcG9ydGVkTWF0Y2hlc05hbWUgPSAoKCkgPT4ge1xuICBjb25zdCBiYXNlID0gJ21hdGNoZXMnO1xuXG4gIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIGJhc2U7XG4gIH1cblxuICBjb25zdCBjYW5kaWRhdGVzID0gW2Jhc2UsICdtc01hdGNoZXNTZWxlY3RvcicsICd3ZWJraXRNYXRjaGVzU2VsZWN0b3InXTtcbiAgY29uc3QgdmFsdWUgPSBjYW5kaWRhdGVzLmZpbmQobmFtZSA9PiBuYW1lIGluIEVsZW1lbnQucHJvdG90eXBlKTtcbiAgcmV0dXJuIHZhbHVlIHx8IGJhc2U7XG59KSgpO1xuXG5mdW5jdGlvbiBjbG9zZXN0UG9ueWZpbGwoZWwsIHNlbGVjdG9yKSB7XG4gIGlmIChlbCA9PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZiAoZWxbc3VwcG9ydGVkTWF0Y2hlc05hbWVdKHNlbGVjdG9yKSkge1xuICAgIHJldHVybiBlbDtcbiAgfVxuXG4gIHJldHVybiBjbG9zZXN0UG9ueWZpbGwoZWwucGFyZW50RWxlbWVudCwgc2VsZWN0b3IpO1xufVxuXG5mdW5jdGlvbiBjbG9zZXN0KGVsLCBzZWxlY3Rvcikge1xuICBpZiAoZWwuY2xvc2VzdCkge1xuICAgIHJldHVybiBlbC5jbG9zZXN0KHNlbGVjdG9yKTtcbiAgfVxuXG4gIHJldHVybiBjbG9zZXN0UG9ueWZpbGwoZWwsIHNlbGVjdG9yKTtcbn1cblxuZnVuY3Rpb24gZ2V0U2VsZWN0b3IoY29udGV4dElkKSB7XG4gIHJldHVybiBgWyR7ZHJhZ0hhbmRsZS5jb250ZXh0SWR9PVwiJHtjb250ZXh0SWR9XCJdYDtcbn1cblxuZnVuY3Rpb24gZmluZENsb3Nlc3REcmFnSGFuZGxlRnJvbUV2ZW50KGNvbnRleHRJZCwgZXZlbnQpIHtcbiAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xuXG4gIGlmICghaXNFbGVtZW50KHRhcmdldCkpIHtcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB3YXJuaW5nKCdldmVudC50YXJnZXQgbXVzdCBiZSBhIEVsZW1lbnQnKSA6IHZvaWQgMDtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHNlbGVjdG9yID0gZ2V0U2VsZWN0b3IoY29udGV4dElkKTtcbiAgY29uc3QgaGFuZGxlID0gY2xvc2VzdCh0YXJnZXQsIHNlbGVjdG9yKTtcblxuICBpZiAoIWhhbmRsZSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKCFpc0h0bWxFbGVtZW50KGhhbmRsZSkpIHtcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB3YXJuaW5nKCdkcmFnIGhhbmRsZSBtdXN0IGJlIGEgSFRNTEVsZW1lbnQnKSA6IHZvaWQgMDtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiBoYW5kbGU7XG59XG5cbmZ1bmN0aW9uIHRyeUdldENsb3Nlc3REcmFnZ2FibGVJZEZyb21FdmVudChjb250ZXh0SWQsIGV2ZW50KSB7XG4gIGNvbnN0IGhhbmRsZSA9IGZpbmRDbG9zZXN0RHJhZ0hhbmRsZUZyb21FdmVudChjb250ZXh0SWQsIGV2ZW50KTtcblxuICBpZiAoIWhhbmRsZSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIGhhbmRsZS5nZXRBdHRyaWJ1dGUoZHJhZ0hhbmRsZS5kcmFnZ2FibGVJZCk7XG59XG5cbmZ1bmN0aW9uIGZpbmREcmFnZ2FibGUoY29udGV4dElkLCBkcmFnZ2FibGVJZCkge1xuICBjb25zdCBzZWxlY3RvciA9IGBbJHtkcmFnZ2FibGUuY29udGV4dElkfT1cIiR7Y29udGV4dElkfVwiXWA7XG4gIGNvbnN0IHBvc3NpYmxlID0gcXVlcnlTZWxlY3RvckFsbChkb2N1bWVudCwgc2VsZWN0b3IpO1xuICBjb25zdCBkcmFnZ2FibGUkMSA9IHBvc3NpYmxlLmZpbmQoZWwgPT4ge1xuICAgIHJldHVybiBlbC5nZXRBdHRyaWJ1dGUoZHJhZ2dhYmxlLmlkKSA9PT0gZHJhZ2dhYmxlSWQ7XG4gIH0pO1xuXG4gIGlmICghZHJhZ2dhYmxlJDEpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmICghaXNIdG1sRWxlbWVudChkcmFnZ2FibGUkMSkpIHtcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB3YXJuaW5nKCdEcmFnZ2FibGUgZWxlbWVudCBpcyBub3QgYSBIVE1MRWxlbWVudCcpIDogdm9pZCAwO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIGRyYWdnYWJsZSQxO1xufVxuXG5mdW5jdGlvbiBwcmV2ZW50RGVmYXVsdChldmVudCkge1xuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xufVxuXG5mdW5jdGlvbiBpc0FjdGl2ZShfcmVmKSB7XG4gIGxldCB7XG4gICAgZXhwZWN0ZWQsXG4gICAgcGhhc2UsXG4gICAgaXNMb2NrQWN0aXZlLFxuICAgIHNob3VsZFdhcm5cbiAgfSA9IF9yZWY7XG5cbiAgaWYgKCFpc0xvY2tBY3RpdmUoKSkge1xuICAgIGlmIChzaG91bGRXYXJuKSB7XG4gICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB3YXJuaW5nKGBcbiAgICAgICAgQ2Fubm90IHBlcmZvcm0gYWN0aW9uLlxuICAgICAgICBUaGUgc2Vuc29yIG5vIGxvbmdlciBoYXMgYW4gYWN0aW9uIGxvY2suXG5cbiAgICAgICAgVGlwczpcblxuICAgICAgICAtIFRocm93IGF3YXkgeW91ciBhY3Rpb24gaGFuZGxlcnMgd2hlbiBmb3JjZVN0b3AoKSBpcyBjYWxsZWRcbiAgICAgICAgLSBDaGVjayBhY3Rpb25zLmlzQWN0aXZlKCkgaWYgeW91IHJlYWxseSBuZWVkIHRvXG4gICAgICBgKSA6IHZvaWQgMDtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoZXhwZWN0ZWQgIT09IHBoYXNlKSB7XG4gICAgaWYgKHNob3VsZFdhcm4pIHtcbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHdhcm5pbmcoYFxuICAgICAgICBDYW5ub3QgcGVyZm9ybSBhY3Rpb24uXG4gICAgICAgIFRoZSBhY3Rpb25zIHlvdSB1c2VkIGJlbG9uZyB0byBhbiBvdXRkYXRlZCBwaGFzZVxuXG4gICAgICAgIEN1cnJlbnQgcGhhc2U6ICR7ZXhwZWN0ZWR9XG4gICAgICAgIFlvdSBjYWxsZWQgYW4gYWN0aW9uIGZyb20gb3V0ZGF0ZWQgcGhhc2U6ICR7cGhhc2V9XG5cbiAgICAgICAgVGlwczpcblxuICAgICAgICAtIERvIG5vdCB1c2UgcHJlRHJhZ0FjdGlvbnMgYWN0aW9ucyBhZnRlciBjYWxsaW5nIHByZURyYWdBY3Rpb25zLmxpZnQoKVxuICAgICAgYCkgOiB2b2lkIDA7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGNhblN0YXJ0KF9yZWYyKSB7XG4gIGxldCB7XG4gICAgbG9ja0FQSSxcbiAgICBzdG9yZSxcbiAgICByZWdpc3RyeSxcbiAgICBkcmFnZ2FibGVJZFxuICB9ID0gX3JlZjI7XG5cbiAgaWYgKGxvY2tBUEkuaXNDbGFpbWVkKCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBlbnRyeSA9IHJlZ2lzdHJ5LmRyYWdnYWJsZS5maW5kQnlJZChkcmFnZ2FibGVJZCk7XG5cbiAgaWYgKCFlbnRyeSkge1xuICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHdhcm5pbmcoYFVuYWJsZSB0byBmaW5kIGRyYWdnYWJsZSB3aXRoIGlkOiAke2RyYWdnYWJsZUlkfWApIDogdm9pZCAwO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghZW50cnkub3B0aW9ucy5pc0VuYWJsZWQpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIWNhblN0YXJ0RHJhZyhzdG9yZS5nZXRTdGF0ZSgpLCBkcmFnZ2FibGVJZCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gdHJ5U3RhcnQoX3JlZjMpIHtcbiAgbGV0IHtcbiAgICBsb2NrQVBJLFxuICAgIGNvbnRleHRJZCxcbiAgICBzdG9yZSxcbiAgICByZWdpc3RyeSxcbiAgICBkcmFnZ2FibGVJZCxcbiAgICBmb3JjZVNlbnNvclN0b3AsXG4gICAgc291cmNlRXZlbnRcbiAgfSA9IF9yZWYzO1xuICBjb25zdCBzaG91bGRTdGFydCA9IGNhblN0YXJ0KHtcbiAgICBsb2NrQVBJLFxuICAgIHN0b3JlLFxuICAgIHJlZ2lzdHJ5LFxuICAgIGRyYWdnYWJsZUlkXG4gIH0pO1xuXG4gIGlmICghc2hvdWxkU3RhcnQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IGVudHJ5ID0gcmVnaXN0cnkuZHJhZ2dhYmxlLmdldEJ5SWQoZHJhZ2dhYmxlSWQpO1xuICBjb25zdCBlbCA9IGZpbmREcmFnZ2FibGUoY29udGV4dElkLCBlbnRyeS5kZXNjcmlwdG9yLmlkKTtcblxuICBpZiAoIWVsKSB7XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gd2FybmluZyhgVW5hYmxlIHRvIGZpbmQgZHJhZ2dhYmxlIGVsZW1lbnQgd2l0aCBpZDogJHtkcmFnZ2FibGVJZH1gKSA6IHZvaWQgMDtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmIChzb3VyY2VFdmVudCAmJiAhZW50cnkub3B0aW9ucy5jYW5EcmFnSW50ZXJhY3RpdmVFbGVtZW50cyAmJiBpc0V2ZW50SW5JbnRlcmFjdGl2ZUVsZW1lbnQoZWwsIHNvdXJjZUV2ZW50KSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgbG9jayA9IGxvY2tBUEkuY2xhaW0oZm9yY2VTZW5zb3JTdG9wIHx8IG5vb3AkMik7XG4gIGxldCBwaGFzZSA9ICdQUkVfRFJBRyc7XG5cbiAgZnVuY3Rpb24gZ2V0U2hvdWxkUmVzcGVjdEZvcmNlUHJlc3MoKSB7XG4gICAgcmV0dXJuIGVudHJ5Lm9wdGlvbnMuc2hvdWxkUmVzcGVjdEZvcmNlUHJlc3M7XG4gIH1cblxuICBmdW5jdGlvbiBpc0xvY2tBY3RpdmUoKSB7XG4gICAgcmV0dXJuIGxvY2tBUEkuaXNBY3RpdmUobG9jayk7XG4gIH1cblxuICBmdW5jdGlvbiB0cnlEaXNwYXRjaChleHBlY3RlZCwgZ2V0QWN0aW9uKSB7XG4gICAgaWYgKGlzQWN0aXZlKHtcbiAgICAgIGV4cGVjdGVkLFxuICAgICAgcGhhc2UsXG4gICAgICBpc0xvY2tBY3RpdmUsXG4gICAgICBzaG91bGRXYXJuOiB0cnVlXG4gICAgfSkpIHtcbiAgICAgIHN0b3JlLmRpc3BhdGNoKGdldEFjdGlvbigpKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCB0cnlEaXNwYXRjaFdoZW5EcmFnZ2luZyA9IHRyeURpc3BhdGNoLmJpbmQobnVsbCwgJ0RSQUdHSU5HJyk7XG5cbiAgZnVuY3Rpb24gbGlmdChhcmdzKSB7XG4gICAgZnVuY3Rpb24gY29tcGxldGVkKCkge1xuICAgICAgbG9ja0FQSS5yZWxlYXNlKCk7XG4gICAgICBwaGFzZSA9ICdDT01QTEVURUQnO1xuICAgIH1cblxuICAgIGlmIChwaGFzZSAhPT0gJ1BSRV9EUkFHJykge1xuICAgICAgY29tcGxldGVkKCk7XG4gICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBpbnZhcmlhbnQoZmFsc2UsIGBDYW5ub3QgbGlmdCBpbiBwaGFzZSAke3BoYXNlfWApIDogaW52YXJpYW50KGZhbHNlKSA7XG4gICAgfVxuXG4gICAgc3RvcmUuZGlzcGF0Y2gobGlmdCQxKGFyZ3MubGlmdEFjdGlvbkFyZ3MpKTtcbiAgICBwaGFzZSA9ICdEUkFHR0lORyc7XG5cbiAgICBmdW5jdGlvbiBmaW5pc2gocmVhc29uLCBvcHRpb25zKSB7XG4gICAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgICAgIG9wdGlvbnMgPSB7XG4gICAgICAgICAgc2hvdWxkQmxvY2tOZXh0Q2xpY2s6IGZhbHNlXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGFyZ3MuY2xlYW51cCgpO1xuXG4gICAgICBpZiAob3B0aW9ucy5zaG91bGRCbG9ja05leHRDbGljaykge1xuICAgICAgICBjb25zdCB1bmJpbmQgPSBiaW5kRXZlbnRzKHdpbmRvdywgW3tcbiAgICAgICAgICBldmVudE5hbWU6ICdjbGljaycsXG4gICAgICAgICAgZm46IHByZXZlbnREZWZhdWx0LFxuICAgICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgIG9uY2U6IHRydWUsXG4gICAgICAgICAgICBwYXNzaXZlOiBmYWxzZSxcbiAgICAgICAgICAgIGNhcHR1cmU6IHRydWVcbiAgICAgICAgICB9XG4gICAgICAgIH1dKTtcbiAgICAgICAgc2V0VGltZW91dCh1bmJpbmQpO1xuICAgICAgfVxuXG4gICAgICBjb21wbGV0ZWQoKTtcbiAgICAgIHN0b3JlLmRpc3BhdGNoKGRyb3AkMSh7XG4gICAgICAgIHJlYXNvblxuICAgICAgfSkpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBpc0FjdGl2ZTogKCkgPT4gaXNBY3RpdmUoe1xuICAgICAgICBleHBlY3RlZDogJ0RSQUdHSU5HJyxcbiAgICAgICAgcGhhc2UsXG4gICAgICAgIGlzTG9ja0FjdGl2ZSxcbiAgICAgICAgc2hvdWxkV2FybjogZmFsc2VcbiAgICAgIH0pLFxuICAgICAgc2hvdWxkUmVzcGVjdEZvcmNlUHJlc3M6IGdldFNob3VsZFJlc3BlY3RGb3JjZVByZXNzLFxuICAgICAgZHJvcDogb3B0aW9ucyA9PiBmaW5pc2goJ0RST1AnLCBvcHRpb25zKSxcbiAgICAgIGNhbmNlbDogb3B0aW9ucyA9PiBmaW5pc2goJ0NBTkNFTCcsIG9wdGlvbnMpLFxuICAgICAgLi4uYXJncy5hY3Rpb25zXG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZsdWlkTGlmdChjbGllbnRTZWxlY3Rpb24pIHtcbiAgICBjb25zdCBtb3ZlJDEgPSByYWZTY2hkX19kZWZhdWx0W1wiZGVmYXVsdFwiXShjbGllbnQgPT4ge1xuICAgICAgdHJ5RGlzcGF0Y2hXaGVuRHJhZ2dpbmcoKCkgPT4gbW92ZSh7XG4gICAgICAgIGNsaWVudFxuICAgICAgfSkpO1xuICAgIH0pO1xuICAgIGNvbnN0IGFwaSA9IGxpZnQoe1xuICAgICAgbGlmdEFjdGlvbkFyZ3M6IHtcbiAgICAgICAgaWQ6IGRyYWdnYWJsZUlkLFxuICAgICAgICBjbGllbnRTZWxlY3Rpb24sXG4gICAgICAgIG1vdmVtZW50TW9kZTogJ0ZMVUlEJ1xuICAgICAgfSxcbiAgICAgIGNsZWFudXA6ICgpID0+IG1vdmUkMS5jYW5jZWwoKSxcbiAgICAgIGFjdGlvbnM6IHtcbiAgICAgICAgbW92ZTogbW92ZSQxXG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHsgLi4uYXBpLFxuICAgICAgbW92ZTogbW92ZSQxXG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNuYXBMaWZ0KCkge1xuICAgIGNvbnN0IGFjdGlvbnMgPSB7XG4gICAgICBtb3ZlVXA6ICgpID0+IHRyeURpc3BhdGNoV2hlbkRyYWdnaW5nKG1vdmVVcCksXG4gICAgICBtb3ZlUmlnaHQ6ICgpID0+IHRyeURpc3BhdGNoV2hlbkRyYWdnaW5nKG1vdmVSaWdodCksXG4gICAgICBtb3ZlRG93bjogKCkgPT4gdHJ5RGlzcGF0Y2hXaGVuRHJhZ2dpbmcobW92ZURvd24pLFxuICAgICAgbW92ZUxlZnQ6ICgpID0+IHRyeURpc3BhdGNoV2hlbkRyYWdnaW5nKG1vdmVMZWZ0KVxuICAgIH07XG4gICAgcmV0dXJuIGxpZnQoe1xuICAgICAgbGlmdEFjdGlvbkFyZ3M6IHtcbiAgICAgICAgaWQ6IGRyYWdnYWJsZUlkLFxuICAgICAgICBjbGllbnRTZWxlY3Rpb246IGdldEJvcmRlckJveENlbnRlclBvc2l0aW9uKGVsKSxcbiAgICAgICAgbW92ZW1lbnRNb2RlOiAnU05BUCdcbiAgICAgIH0sXG4gICAgICBjbGVhbnVwOiBub29wJDIsXG4gICAgICBhY3Rpb25zXG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBhYm9ydFByZURyYWcoKSB7XG4gICAgY29uc3Qgc2hvdWxkUmVsZWFzZSA9IGlzQWN0aXZlKHtcbiAgICAgIGV4cGVjdGVkOiAnUFJFX0RSQUcnLFxuICAgICAgcGhhc2UsXG4gICAgICBpc0xvY2tBY3RpdmUsXG4gICAgICBzaG91bGRXYXJuOiB0cnVlXG4gICAgfSk7XG5cbiAgICBpZiAoc2hvdWxkUmVsZWFzZSkge1xuICAgICAgbG9ja0FQSS5yZWxlYXNlKCk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcHJlRHJhZyA9IHtcbiAgICBpc0FjdGl2ZTogKCkgPT4gaXNBY3RpdmUoe1xuICAgICAgZXhwZWN0ZWQ6ICdQUkVfRFJBRycsXG4gICAgICBwaGFzZSxcbiAgICAgIGlzTG9ja0FjdGl2ZSxcbiAgICAgIHNob3VsZFdhcm46IGZhbHNlXG4gICAgfSksXG4gICAgc2hvdWxkUmVzcGVjdEZvcmNlUHJlc3M6IGdldFNob3VsZFJlc3BlY3RGb3JjZVByZXNzLFxuICAgIGZsdWlkTGlmdCxcbiAgICBzbmFwTGlmdCxcbiAgICBhYm9ydDogYWJvcnRQcmVEcmFnXG4gIH07XG4gIHJldHVybiBwcmVEcmFnO1xufVxuXG5jb25zdCBkZWZhdWx0U2Vuc29ycyA9IFt1c2VNb3VzZVNlbnNvciwgdXNlS2V5Ym9hcmRTZW5zb3IsIHVzZVRvdWNoU2Vuc29yXTtcbmZ1bmN0aW9uIHVzZVNlbnNvck1hcnNoYWwoX3JlZjQpIHtcbiAgbGV0IHtcbiAgICBjb250ZXh0SWQsXG4gICAgc3RvcmUsXG4gICAgcmVnaXN0cnksXG4gICAgY3VzdG9tU2Vuc29ycyxcbiAgICBlbmFibGVEZWZhdWx0U2Vuc29yc1xuICB9ID0gX3JlZjQ7XG4gIGNvbnN0IHVzZVNlbnNvcnMgPSBbLi4uKGVuYWJsZURlZmF1bHRTZW5zb3JzID8gZGVmYXVsdFNlbnNvcnMgOiBbXSksIC4uLihjdXN0b21TZW5zb3JzIHx8IFtdKV07XG4gIGNvbnN0IGxvY2tBUEkgPSBSZWFjdC51c2VTdGF0ZSgoKSA9PiBjcmVhdGUoKSlbMF07XG4gIGNvbnN0IHRyeUFiYW5kb25Mb2NrID0gdXNlTWVtb09uZS51c2VDYWxsYmFjayhmdW5jdGlvbiB0cnlBYmFuZG9uTG9jayhwcmV2aW91cywgY3VycmVudCkge1xuICAgIGlmIChpc0RyYWdnaW5nKHByZXZpb3VzKSAmJiAhaXNEcmFnZ2luZyhjdXJyZW50KSkge1xuICAgICAgbG9ja0FQSS50cnlBYmFuZG9uKCk7XG4gICAgfVxuICB9LCBbbG9ja0FQSV0pO1xuICB1c2VMYXlvdXRFZmZlY3QoZnVuY3Rpb24gbGlzdGVuVG9TdG9yZSgpIHtcbiAgICBsZXQgcHJldmlvdXMgPSBzdG9yZS5nZXRTdGF0ZSgpO1xuICAgIGNvbnN0IHVuc3Vic2NyaWJlID0gc3RvcmUuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIGNvbnN0IGN1cnJlbnQgPSBzdG9yZS5nZXRTdGF0ZSgpO1xuICAgICAgdHJ5QWJhbmRvbkxvY2socHJldmlvdXMsIGN1cnJlbnQpO1xuICAgICAgcHJldmlvdXMgPSBjdXJyZW50O1xuICAgIH0pO1xuICAgIHJldHVybiB1bnN1YnNjcmliZTtcbiAgfSwgW2xvY2tBUEksIHN0b3JlLCB0cnlBYmFuZG9uTG9ja10pO1xuICB1c2VMYXlvdXRFZmZlY3QoKCkgPT4ge1xuICAgIHJldHVybiBsb2NrQVBJLnRyeUFiYW5kb247XG4gIH0sIFtsb2NrQVBJLnRyeUFiYW5kb25dKTtcbiAgY29uc3QgY2FuR2V0TG9jayA9IHVzZU1lbW9PbmUudXNlQ2FsbGJhY2soZHJhZ2dhYmxlSWQgPT4ge1xuICAgIHJldHVybiBjYW5TdGFydCh7XG4gICAgICBsb2NrQVBJLFxuICAgICAgcmVnaXN0cnksXG4gICAgICBzdG9yZSxcbiAgICAgIGRyYWdnYWJsZUlkXG4gICAgfSk7XG4gIH0sIFtsb2NrQVBJLCByZWdpc3RyeSwgc3RvcmVdKTtcbiAgY29uc3QgdHJ5R2V0TG9jayA9IHVzZU1lbW9PbmUudXNlQ2FsbGJhY2soKGRyYWdnYWJsZUlkLCBmb3JjZVN0b3AsIG9wdGlvbnMpID0+IHRyeVN0YXJ0KHtcbiAgICBsb2NrQVBJLFxuICAgIHJlZ2lzdHJ5LFxuICAgIGNvbnRleHRJZCxcbiAgICBzdG9yZSxcbiAgICBkcmFnZ2FibGVJZCxcbiAgICBmb3JjZVNlbnNvclN0b3A6IGZvcmNlU3RvcCB8fCBudWxsLFxuICAgIHNvdXJjZUV2ZW50OiBvcHRpb25zICYmIG9wdGlvbnMuc291cmNlRXZlbnQgPyBvcHRpb25zLnNvdXJjZUV2ZW50IDogbnVsbFxuICB9KSwgW2NvbnRleHRJZCwgbG9ja0FQSSwgcmVnaXN0cnksIHN0b3JlXSk7XG4gIGNvbnN0IGZpbmRDbG9zZXN0RHJhZ2dhYmxlSWQgPSB1c2VNZW1vT25lLnVzZUNhbGxiYWNrKGV2ZW50ID0+IHRyeUdldENsb3Nlc3REcmFnZ2FibGVJZEZyb21FdmVudChjb250ZXh0SWQsIGV2ZW50KSwgW2NvbnRleHRJZF0pO1xuICBjb25zdCBmaW5kT3B0aW9uc0ZvckRyYWdnYWJsZSA9IHVzZU1lbW9PbmUudXNlQ2FsbGJhY2soaWQgPT4ge1xuICAgIGNvbnN0IGVudHJ5ID0gcmVnaXN0cnkuZHJhZ2dhYmxlLmZpbmRCeUlkKGlkKTtcbiAgICByZXR1cm4gZW50cnkgPyBlbnRyeS5vcHRpb25zIDogbnVsbDtcbiAgfSwgW3JlZ2lzdHJ5LmRyYWdnYWJsZV0pO1xuICBjb25zdCB0cnlSZWxlYXNlTG9jayA9IHVzZU1lbW9PbmUudXNlQ2FsbGJhY2soZnVuY3Rpb24gdHJ5UmVsZWFzZUxvY2soKSB7XG4gICAgaWYgKCFsb2NrQVBJLmlzQ2xhaW1lZCgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbG9ja0FQSS50cnlBYmFuZG9uKCk7XG5cbiAgICBpZiAoc3RvcmUuZ2V0U3RhdGUoKS5waGFzZSAhPT0gJ0lETEUnKSB7XG4gICAgICBzdG9yZS5kaXNwYXRjaChmbHVzaCgpKTtcbiAgICB9XG4gIH0sIFtsb2NrQVBJLCBzdG9yZV0pO1xuICBjb25zdCBpc0xvY2tDbGFpbWVkID0gdXNlTWVtb09uZS51c2VDYWxsYmFjaygoKSA9PiBsb2NrQVBJLmlzQ2xhaW1lZCgpLCBbbG9ja0FQSV0pO1xuICBjb25zdCBhcGkgPSB1c2VNZW1vT25lLnVzZU1lbW8oKCkgPT4gKHtcbiAgICBjYW5HZXRMb2NrLFxuICAgIHRyeUdldExvY2ssXG4gICAgZmluZENsb3Nlc3REcmFnZ2FibGVJZCxcbiAgICBmaW5kT3B0aW9uc0ZvckRyYWdnYWJsZSxcbiAgICB0cnlSZWxlYXNlTG9jayxcbiAgICBpc0xvY2tDbGFpbWVkXG4gIH0pLCBbY2FuR2V0TG9jaywgdHJ5R2V0TG9jaywgZmluZENsb3Nlc3REcmFnZ2FibGVJZCwgZmluZE9wdGlvbnNGb3JEcmFnZ2FibGUsIHRyeVJlbGVhc2VMb2NrLCBpc0xvY2tDbGFpbWVkXSk7XG4gIHVzZVZhbGlkYXRlU2Vuc29ySG9va3ModXNlU2Vuc29ycyk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB1c2VTZW5zb3JzLmxlbmd0aDsgaSsrKSB7XG4gICAgdXNlU2Vuc29yc1tpXShhcGkpO1xuICB9XG59XG5cbmNvbnN0IGNyZWF0ZVJlc3BvbmRlcnMgPSBwcm9wcyA9PiAoe1xuICBvbkJlZm9yZUNhcHR1cmU6IHQgPT4ge1xuICAgIGNvbnN0IG9uQmVmb3JlQ2FwdXJlQ2FsbGJhY2sgPSAoKSA9PiB7XG4gICAgICBpZiAocHJvcHMub25CZWZvcmVDYXB0dXJlKSB7XG4gICAgICAgIHByb3BzLm9uQmVmb3JlQ2FwdHVyZSh0KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgaWYgKFJlYWN0X19kZWZhdWx0W1wiZGVmYXVsdFwiXS52ZXJzaW9uLnN0YXJ0c1dpdGgoJzE2JykgfHwgUmVhY3RfX2RlZmF1bHRbXCJkZWZhdWx0XCJdLnZlcnNpb24uc3RhcnRzV2l0aCgnMTcnKSkge1xuICAgICAgb25CZWZvcmVDYXB1cmVDYWxsYmFjaygpO1xuICAgIH0gZWxzZSB7XG4gICAgICBSZWFjdERPTS5mbHVzaFN5bmMob25CZWZvcmVDYXB1cmVDYWxsYmFjayk7XG4gICAgfVxuICB9LFxuICBvbkJlZm9yZURyYWdTdGFydDogcHJvcHMub25CZWZvcmVEcmFnU3RhcnQsXG4gIG9uRHJhZ1N0YXJ0OiBwcm9wcy5vbkRyYWdTdGFydCxcbiAgb25EcmFnRW5kOiBwcm9wcy5vbkRyYWdFbmQsXG4gIG9uRHJhZ1VwZGF0ZTogcHJvcHMub25EcmFnVXBkYXRlXG59KTtcblxuZnVuY3Rpb24gZ2V0U3RvcmUobGF6eVJlZikge1xuICAhbGF6eVJlZi5jdXJyZW50ID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gaW52YXJpYW50KGZhbHNlLCAnQ291bGQgbm90IGZpbmQgc3RvcmUgZnJvbSBsYXp5IHJlZicpIDogaW52YXJpYW50KGZhbHNlKSA6IHZvaWQgMDtcbiAgcmV0dXJuIGxhenlSZWYuY3VycmVudDtcbn1cblxuZnVuY3Rpb24gQXBwKHByb3BzKSB7XG4gIGNvbnN0IHtcbiAgICBjb250ZXh0SWQsXG4gICAgc2V0Q2FsbGJhY2tzLFxuICAgIHNlbnNvcnMsXG4gICAgbm9uY2UsXG4gICAgZHJhZ0hhbmRsZVVzYWdlSW5zdHJ1Y3Rpb25zXG4gIH0gPSBwcm9wcztcbiAgY29uc3QgbGF6eVN0b3JlUmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICB1c2VTdGFydHVwVmFsaWRhdGlvbigpO1xuICBjb25zdCBsYXN0UHJvcHNSZWYgPSB1c2VQcmV2aW91cyhwcm9wcyk7XG4gIGNvbnN0IGdldFJlc3BvbmRlcnMgPSB1c2VNZW1vT25lLnVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICByZXR1cm4gY3JlYXRlUmVzcG9uZGVycyhsYXN0UHJvcHNSZWYuY3VycmVudCk7XG4gIH0sIFtsYXN0UHJvcHNSZWZdKTtcbiAgY29uc3QgYW5ub3VuY2UgPSB1c2VBbm5vdW5jZXIoY29udGV4dElkKTtcbiAgY29uc3QgZHJhZ0hhbmRsZVVzYWdlSW5zdHJ1Y3Rpb25zSWQgPSB1c2VIaWRkZW5UZXh0RWxlbWVudCh7XG4gICAgY29udGV4dElkLFxuICAgIHRleHQ6IGRyYWdIYW5kbGVVc2FnZUluc3RydWN0aW9uc1xuICB9KTtcbiAgY29uc3Qgc3R5bGVNYXJzaGFsID0gdXNlU3R5bGVNYXJzaGFsKGNvbnRleHRJZCwgbm9uY2UpO1xuICBjb25zdCBsYXp5RGlzcGF0Y2ggPSB1c2VNZW1vT25lLnVzZUNhbGxiYWNrKGFjdGlvbiA9PiB7XG4gICAgZ2V0U3RvcmUobGF6eVN0b3JlUmVmKS5kaXNwYXRjaChhY3Rpb24pO1xuICB9LCBbXSk7XG4gIGNvbnN0IG1hcnNoYWxDYWxsYmFja3MgPSB1c2VNZW1vT25lLnVzZU1lbW8oKCkgPT4gcmVkdXguYmluZEFjdGlvbkNyZWF0b3JzKHtcbiAgICBwdWJsaXNoV2hpbGVEcmFnZ2luZyxcbiAgICB1cGRhdGVEcm9wcGFibGVTY3JvbGwsXG4gICAgdXBkYXRlRHJvcHBhYmxlSXNFbmFibGVkLFxuICAgIHVwZGF0ZURyb3BwYWJsZUlzQ29tYmluZUVuYWJsZWQsXG4gICAgY29sbGVjdGlvblN0YXJ0aW5nXG4gIH0sIGxhenlEaXNwYXRjaCksIFtsYXp5RGlzcGF0Y2hdKTtcbiAgY29uc3QgcmVnaXN0cnkgPSB1c2VSZWdpc3RyeSgpO1xuICBjb25zdCBkaW1lbnNpb25NYXJzaGFsID0gdXNlTWVtb09uZS51c2VNZW1vKCgpID0+IHtcbiAgICByZXR1cm4gY3JlYXRlRGltZW5zaW9uTWFyc2hhbChyZWdpc3RyeSwgbWFyc2hhbENhbGxiYWNrcyk7XG4gIH0sIFtyZWdpc3RyeSwgbWFyc2hhbENhbGxiYWNrc10pO1xuICBjb25zdCBhdXRvU2Nyb2xsZXIgPSB1c2VNZW1vT25lLnVzZU1lbW8oKCkgPT4gY3JlYXRlQXV0b1Njcm9sbGVyKHtcbiAgICBzY3JvbGxXaW5kb3csXG4gICAgc2Nyb2xsRHJvcHBhYmxlOiBkaW1lbnNpb25NYXJzaGFsLnNjcm9sbERyb3BwYWJsZSxcbiAgICAuLi5yZWR1eC5iaW5kQWN0aW9uQ3JlYXRvcnMoe1xuICAgICAgbW92ZVxuICAgIH0sIGxhenlEaXNwYXRjaClcbiAgfSksIFtkaW1lbnNpb25NYXJzaGFsLnNjcm9sbERyb3BwYWJsZSwgbGF6eURpc3BhdGNoXSk7XG4gIGNvbnN0IGZvY3VzTWFyc2hhbCA9IHVzZUZvY3VzTWFyc2hhbChjb250ZXh0SWQpO1xuICBjb25zdCBzdG9yZSA9IHVzZU1lbW9PbmUudXNlTWVtbygoKSA9PiBjcmVhdGVTdG9yZSh7XG4gICAgYW5ub3VuY2UsXG4gICAgYXV0b1Njcm9sbGVyLFxuICAgIGRpbWVuc2lvbk1hcnNoYWwsXG4gICAgZm9jdXNNYXJzaGFsLFxuICAgIGdldFJlc3BvbmRlcnMsXG4gICAgc3R5bGVNYXJzaGFsXG4gIH0pLCBbYW5ub3VuY2UsIGF1dG9TY3JvbGxlciwgZGltZW5zaW9uTWFyc2hhbCwgZm9jdXNNYXJzaGFsLCBnZXRSZXNwb25kZXJzLCBzdHlsZU1hcnNoYWxdKTtcblxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGlmIChsYXp5U3RvcmVSZWYuY3VycmVudCAmJiBsYXp5U3RvcmVSZWYuY3VycmVudCAhPT0gc3RvcmUpIHtcbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHdhcm5pbmcoJ3VuZXhwZWN0ZWQgc3RvcmUgY2hhbmdlJykgOiB2b2lkIDA7XG4gICAgfVxuICB9XG5cbiAgbGF6eVN0b3JlUmVmLmN1cnJlbnQgPSBzdG9yZTtcbiAgY29uc3QgdHJ5UmVzZXRTdG9yZSA9IHVzZU1lbW9PbmUudXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGNvbnN0IGN1cnJlbnQgPSBnZXRTdG9yZShsYXp5U3RvcmVSZWYpO1xuICAgIGNvbnN0IHN0YXRlID0gY3VycmVudC5nZXRTdGF0ZSgpO1xuXG4gICAgaWYgKHN0YXRlLnBoYXNlICE9PSAnSURMRScpIHtcbiAgICAgIGN1cnJlbnQuZGlzcGF0Y2goZmx1c2goKSk7XG4gICAgfVxuICB9LCBbXSk7XG4gIGNvbnN0IGlzRHJhZ2dpbmcgPSB1c2VNZW1vT25lLnVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBjb25zdCBzdGF0ZSA9IGdldFN0b3JlKGxhenlTdG9yZVJlZikuZ2V0U3RhdGUoKTtcblxuICAgIGlmIChzdGF0ZS5waGFzZSA9PT0gJ0RST1BfQU5JTUFUSU5HJykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHN0YXRlLnBoYXNlID09PSAnSURMRScpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3RhdGUuaXNEcmFnZ2luZztcbiAgfSwgW10pO1xuICBjb25zdCBhcHBDYWxsYmFja3MgPSB1c2VNZW1vT25lLnVzZU1lbW8oKCkgPT4gKHtcbiAgICBpc0RyYWdnaW5nLFxuICAgIHRyeUFib3J0OiB0cnlSZXNldFN0b3JlXG4gIH0pLCBbaXNEcmFnZ2luZywgdHJ5UmVzZXRTdG9yZV0pO1xuICBzZXRDYWxsYmFja3MoYXBwQ2FsbGJhY2tzKTtcbiAgY29uc3QgZ2V0Q2FuTGlmdCA9IHVzZU1lbW9PbmUudXNlQ2FsbGJhY2soaWQgPT4gY2FuU3RhcnREcmFnKGdldFN0b3JlKGxhenlTdG9yZVJlZikuZ2V0U3RhdGUoKSwgaWQpLCBbXSk7XG4gIGNvbnN0IGdldElzTW92ZW1lbnRBbGxvd2VkID0gdXNlTWVtb09uZS51c2VDYWxsYmFjaygoKSA9PiBpc01vdmVtZW50QWxsb3dlZChnZXRTdG9yZShsYXp5U3RvcmVSZWYpLmdldFN0YXRlKCkpLCBbXSk7XG4gIGNvbnN0IGFwcENvbnRleHQgPSB1c2VNZW1vT25lLnVzZU1lbW8oKCkgPT4gKHtcbiAgICBtYXJzaGFsOiBkaW1lbnNpb25NYXJzaGFsLFxuICAgIGZvY3VzOiBmb2N1c01hcnNoYWwsXG4gICAgY29udGV4dElkLFxuICAgIGNhbkxpZnQ6IGdldENhbkxpZnQsXG4gICAgaXNNb3ZlbWVudEFsbG93ZWQ6IGdldElzTW92ZW1lbnRBbGxvd2VkLFxuICAgIGRyYWdIYW5kbGVVc2FnZUluc3RydWN0aW9uc0lkLFxuICAgIHJlZ2lzdHJ5XG4gIH0pLCBbY29udGV4dElkLCBkaW1lbnNpb25NYXJzaGFsLCBkcmFnSGFuZGxlVXNhZ2VJbnN0cnVjdGlvbnNJZCwgZm9jdXNNYXJzaGFsLCBnZXRDYW5MaWZ0LCBnZXRJc01vdmVtZW50QWxsb3dlZCwgcmVnaXN0cnldKTtcbiAgdXNlU2Vuc29yTWFyc2hhbCh7XG4gICAgY29udGV4dElkLFxuICAgIHN0b3JlLFxuICAgIHJlZ2lzdHJ5LFxuICAgIGN1c3RvbVNlbnNvcnM6IHNlbnNvcnMgfHwgbnVsbCxcbiAgICBlbmFibGVEZWZhdWx0U2Vuc29yczogcHJvcHMuZW5hYmxlRGVmYXVsdFNlbnNvcnMgIT09IGZhbHNlXG4gIH0pO1xuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIHJldHVybiB0cnlSZXNldFN0b3JlO1xuICB9LCBbdHJ5UmVzZXRTdG9yZV0pO1xuICByZXR1cm4gUmVhY3RfX2RlZmF1bHRbXCJkZWZhdWx0XCJdLmNyZWF0ZUVsZW1lbnQoQXBwQ29udGV4dC5Qcm92aWRlciwge1xuICAgIHZhbHVlOiBhcHBDb250ZXh0XG4gIH0sIFJlYWN0X19kZWZhdWx0W1wiZGVmYXVsdFwiXS5jcmVhdGVFbGVtZW50KHJlYWN0UmVkdXguUHJvdmlkZXIsIHtcbiAgICBjb250ZXh0OiBTdG9yZUNvbnRleHQsXG4gICAgc3RvcmU6IHN0b3JlXG4gIH0sIHByb3BzLmNoaWxkcmVuKSk7XG59XG5cbmxldCBjb3VudCA9IDA7XG5mdW5jdGlvbiByZXNldCgpIHtcbiAgY291bnQgPSAwO1xufVxuZnVuY3Rpb24gdXNlSW5zdGFuY2VDb3VudCgpIHtcbiAgcmV0dXJuIHVzZU1lbW9PbmUudXNlTWVtbygoKSA9PiBgJHtjb3VudCsrfWAsIFtdKTtcbn1cblxuZnVuY3Rpb24gcmVzZXRTZXJ2ZXJDb250ZXh0KCkge1xuICByZXNldCgpO1xuICByZXNldCQxKCk7XG59XG5mdW5jdGlvbiBEcmFnRHJvcENvbnRleHQocHJvcHMpIHtcbiAgY29uc3QgY29udGV4dElkID0gdXNlSW5zdGFuY2VDb3VudCgpO1xuICBjb25zdCBkcmFnSGFuZGxlVXNhZ2VJbnN0cnVjdGlvbnMgPSBwcm9wcy5kcmFnSGFuZGxlVXNhZ2VJbnN0cnVjdGlvbnMgfHwgcHJlc2V0JDEuZHJhZ0hhbmRsZVVzYWdlSW5zdHJ1Y3Rpb25zO1xuICByZXR1cm4gUmVhY3RfX2RlZmF1bHRbXCJkZWZhdWx0XCJdLmNyZWF0ZUVsZW1lbnQoRXJyb3JCb3VuZGFyeSwgbnVsbCwgc2V0Q2FsbGJhY2tzID0+IFJlYWN0X19kZWZhdWx0W1wiZGVmYXVsdFwiXS5jcmVhdGVFbGVtZW50KEFwcCwge1xuICAgIG5vbmNlOiBwcm9wcy5ub25jZSxcbiAgICBjb250ZXh0SWQ6IGNvbnRleHRJZCxcbiAgICBzZXRDYWxsYmFja3M6IHNldENhbGxiYWNrcyxcbiAgICBkcmFnSGFuZGxlVXNhZ2VJbnN0cnVjdGlvbnM6IGRyYWdIYW5kbGVVc2FnZUluc3RydWN0aW9ucyxcbiAgICBlbmFibGVEZWZhdWx0U2Vuc29yczogcHJvcHMuZW5hYmxlRGVmYXVsdFNlbnNvcnMsXG4gICAgc2Vuc29yczogcHJvcHMuc2Vuc29ycyxcbiAgICBvbkJlZm9yZUNhcHR1cmU6IHByb3BzLm9uQmVmb3JlQ2FwdHVyZSxcbiAgICBvbkJlZm9yZURyYWdTdGFydDogcHJvcHMub25CZWZvcmVEcmFnU3RhcnQsXG4gICAgb25EcmFnU3RhcnQ6IHByb3BzLm9uRHJhZ1N0YXJ0LFxuICAgIG9uRHJhZ1VwZGF0ZTogcHJvcHMub25EcmFnVXBkYXRlLFxuICAgIG9uRHJhZ0VuZDogcHJvcHMub25EcmFnRW5kXG4gIH0sIHByb3BzLmNoaWxkcmVuKSk7XG59XG5cbmNvbnN0IHpJbmRleE9wdGlvbnMgPSB7XG4gIGRyYWdnaW5nOiA1MDAwLFxuICBkcm9wQW5pbWF0aW5nOiA0NTAwXG59O1xuXG5jb25zdCBnZXREcmFnZ2luZ1RyYW5zaXRpb24gPSAoc2hvdWxkQW5pbWF0ZURyYWdNb3ZlbWVudCwgZHJvcHBpbmcpID0+IHtcbiAgaWYgKGRyb3BwaW5nKSB7XG4gICAgcmV0dXJuIHRyYW5zaXRpb25zLmRyb3AoZHJvcHBpbmcuZHVyYXRpb24pO1xuICB9XG5cbiAgaWYgKHNob3VsZEFuaW1hdGVEcmFnTW92ZW1lbnQpIHtcbiAgICByZXR1cm4gdHJhbnNpdGlvbnMuc25hcDtcbiAgfVxuXG4gIHJldHVybiB0cmFuc2l0aW9ucy5mbHVpZDtcbn07XG5cbmNvbnN0IGdldERyYWdnaW5nT3BhY2l0eSA9IChpc0NvbWJpbmluZywgaXNEcm9wQW5pbWF0aW5nKSA9PiB7XG4gIGlmICghaXNDb21iaW5pbmcpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcmV0dXJuIGlzRHJvcEFuaW1hdGluZyA/IGNvbWJpbmUub3BhY2l0eS5kcm9wIDogY29tYmluZS5vcGFjaXR5LmNvbWJpbmluZztcbn07XG5cbmNvbnN0IGdldFNob3VsZERyYWdnaW5nQW5pbWF0ZSA9IGRyYWdnaW5nID0+IHtcbiAgaWYgKGRyYWdnaW5nLmZvcmNlU2hvdWxkQW5pbWF0ZSAhPSBudWxsKSB7XG4gICAgcmV0dXJuIGRyYWdnaW5nLmZvcmNlU2hvdWxkQW5pbWF0ZTtcbiAgfVxuXG4gIHJldHVybiBkcmFnZ2luZy5tb2RlID09PSAnU05BUCc7XG59O1xuXG5mdW5jdGlvbiBnZXREcmFnZ2luZ1N0eWxlKGRyYWdnaW5nKSB7XG4gIGNvbnN0IGRpbWVuc2lvbiA9IGRyYWdnaW5nLmRpbWVuc2lvbjtcbiAgY29uc3QgYm94ID0gZGltZW5zaW9uLmNsaWVudDtcbiAgY29uc3Qge1xuICAgIG9mZnNldCxcbiAgICBjb21iaW5lV2l0aCxcbiAgICBkcm9wcGluZ1xuICB9ID0gZHJhZ2dpbmc7XG4gIGNvbnN0IGlzQ29tYmluaW5nID0gQm9vbGVhbihjb21iaW5lV2l0aCk7XG4gIGNvbnN0IHNob3VsZEFuaW1hdGUgPSBnZXRTaG91bGREcmFnZ2luZ0FuaW1hdGUoZHJhZ2dpbmcpO1xuICBjb25zdCBpc0Ryb3BBbmltYXRpbmcgPSBCb29sZWFuKGRyb3BwaW5nKTtcbiAgY29uc3QgdHJhbnNmb3JtID0gaXNEcm9wQW5pbWF0aW5nID8gdHJhbnNmb3Jtcy5kcm9wKG9mZnNldCwgaXNDb21iaW5pbmcpIDogdHJhbnNmb3Jtcy5tb3ZlVG8ob2Zmc2V0KTtcbiAgY29uc3Qgc3R5bGUgPSB7XG4gICAgcG9zaXRpb246ICdmaXhlZCcsXG4gICAgdG9wOiBib3gubWFyZ2luQm94LnRvcCxcbiAgICBsZWZ0OiBib3gubWFyZ2luQm94LmxlZnQsXG4gICAgYm94U2l6aW5nOiAnYm9yZGVyLWJveCcsXG4gICAgd2lkdGg6IGJveC5ib3JkZXJCb3gud2lkdGgsXG4gICAgaGVpZ2h0OiBib3guYm9yZGVyQm94LmhlaWdodCxcbiAgICB0cmFuc2l0aW9uOiBnZXREcmFnZ2luZ1RyYW5zaXRpb24oc2hvdWxkQW5pbWF0ZSwgZHJvcHBpbmcpLFxuICAgIHRyYW5zZm9ybSxcbiAgICBvcGFjaXR5OiBnZXREcmFnZ2luZ09wYWNpdHkoaXNDb21iaW5pbmcsIGlzRHJvcEFuaW1hdGluZyksXG4gICAgekluZGV4OiBpc0Ryb3BBbmltYXRpbmcgPyB6SW5kZXhPcHRpb25zLmRyb3BBbmltYXRpbmcgOiB6SW5kZXhPcHRpb25zLmRyYWdnaW5nLFxuICAgIHBvaW50ZXJFdmVudHM6ICdub25lJ1xuICB9O1xuICByZXR1cm4gc3R5bGU7XG59XG5cbmZ1bmN0aW9uIGdldFNlY29uZGFyeVN0eWxlKHNlY29uZGFyeSkge1xuICByZXR1cm4ge1xuICAgIHRyYW5zZm9ybTogdHJhbnNmb3Jtcy5tb3ZlVG8oc2Vjb25kYXJ5Lm9mZnNldCksXG4gICAgdHJhbnNpdGlvbjogc2Vjb25kYXJ5LnNob3VsZEFuaW1hdGVEaXNwbGFjZW1lbnQgPyB1bmRlZmluZWQgOiAnbm9uZSdcbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0U3R5bGUkMShtYXBwZWQpIHtcbiAgcmV0dXJuIG1hcHBlZC50eXBlID09PSAnRFJBR0dJTkcnID8gZ2V0RHJhZ2dpbmdTdHlsZShtYXBwZWQpIDogZ2V0U2Vjb25kYXJ5U3R5bGUobWFwcGVkKTtcbn1cblxuZnVuY3Rpb24gZ2V0RGltZW5zaW9uJDEoZGVzY3JpcHRvciwgZWwsIHdpbmRvd1Njcm9sbCkge1xuICBpZiAod2luZG93U2Nyb2xsID09PSB2b2lkIDApIHtcbiAgICB3aW5kb3dTY3JvbGwgPSBvcmlnaW47XG4gIH1cblxuICBjb25zdCBjb21wdXRlZFN0eWxlcyA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsKTtcbiAgY29uc3QgYm9yZGVyQm94ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gIGNvbnN0IGNsaWVudCA9IGNzc0JveE1vZGVsLmNhbGN1bGF0ZUJveChib3JkZXJCb3gsIGNvbXB1dGVkU3R5bGVzKTtcbiAgY29uc3QgcGFnZSA9IGNzc0JveE1vZGVsLndpdGhTY3JvbGwoY2xpZW50LCB3aW5kb3dTY3JvbGwpO1xuICBjb25zdCBwbGFjZWhvbGRlciA9IHtcbiAgICBjbGllbnQsXG4gICAgdGFnTmFtZTogZWwudGFnTmFtZS50b0xvd2VyQ2FzZSgpLFxuICAgIGRpc3BsYXk6IGNvbXB1dGVkU3R5bGVzLmRpc3BsYXlcbiAgfTtcbiAgY29uc3QgZGlzcGxhY2VCeSA9IHtcbiAgICB4OiBjbGllbnQubWFyZ2luQm94LndpZHRoLFxuICAgIHk6IGNsaWVudC5tYXJnaW5Cb3guaGVpZ2h0XG4gIH07XG4gIGNvbnN0IGRpbWVuc2lvbiA9IHtcbiAgICBkZXNjcmlwdG9yLFxuICAgIHBsYWNlaG9sZGVyLFxuICAgIGRpc3BsYWNlQnksXG4gICAgY2xpZW50LFxuICAgIHBhZ2VcbiAgfTtcbiAgcmV0dXJuIGRpbWVuc2lvbjtcbn1cblxuZnVuY3Rpb24gdXNlRHJhZ2dhYmxlUHVibGlzaGVyKGFyZ3MpIHtcbiAgY29uc3QgdW5pcXVlSWQgPSB1c2VVbmlxdWVJZCgnZHJhZ2dhYmxlJyk7XG4gIGNvbnN0IHtcbiAgICBkZXNjcmlwdG9yLFxuICAgIHJlZ2lzdHJ5LFxuICAgIGdldERyYWdnYWJsZVJlZixcbiAgICBjYW5EcmFnSW50ZXJhY3RpdmVFbGVtZW50cyxcbiAgICBzaG91bGRSZXNwZWN0Rm9yY2VQcmVzcyxcbiAgICBpc0VuYWJsZWRcbiAgfSA9IGFyZ3M7XG4gIGNvbnN0IG9wdGlvbnMgPSB1c2VNZW1vT25lLnVzZU1lbW8oKCkgPT4gKHtcbiAgICBjYW5EcmFnSW50ZXJhY3RpdmVFbGVtZW50cyxcbiAgICBzaG91bGRSZXNwZWN0Rm9yY2VQcmVzcyxcbiAgICBpc0VuYWJsZWRcbiAgfSksIFtjYW5EcmFnSW50ZXJhY3RpdmVFbGVtZW50cywgaXNFbmFibGVkLCBzaG91bGRSZXNwZWN0Rm9yY2VQcmVzc10pO1xuICBjb25zdCBnZXREaW1lbnNpb24gPSB1c2VNZW1vT25lLnVzZUNhbGxiYWNrKHdpbmRvd1Njcm9sbCA9PiB7XG4gICAgY29uc3QgZWwgPSBnZXREcmFnZ2FibGVSZWYoKTtcbiAgICAhZWwgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBpbnZhcmlhbnQoZmFsc2UsICdDYW5ub3QgZ2V0IGRpbWVuc2lvbiB3aGVuIG5vIHJlZiBpcyBzZXQnKSA6IGludmFyaWFudChmYWxzZSkgOiB2b2lkIDA7XG4gICAgcmV0dXJuIGdldERpbWVuc2lvbiQxKGRlc2NyaXB0b3IsIGVsLCB3aW5kb3dTY3JvbGwpO1xuICB9LCBbZGVzY3JpcHRvciwgZ2V0RHJhZ2dhYmxlUmVmXSk7XG4gIGNvbnN0IGVudHJ5ID0gdXNlTWVtb09uZS51c2VNZW1vKCgpID0+ICh7XG4gICAgdW5pcXVlSWQsXG4gICAgZGVzY3JpcHRvcixcbiAgICBvcHRpb25zLFxuICAgIGdldERpbWVuc2lvblxuICB9KSwgW2Rlc2NyaXB0b3IsIGdldERpbWVuc2lvbiwgb3B0aW9ucywgdW5pcXVlSWRdKTtcbiAgY29uc3QgcHVibGlzaGVkUmVmID0gUmVhY3QudXNlUmVmKGVudHJ5KTtcbiAgY29uc3QgaXNGaXJzdFB1Ymxpc2hSZWYgPSBSZWFjdC51c2VSZWYodHJ1ZSk7XG4gIHVzZUxheW91dEVmZmVjdCgoKSA9PiB7XG4gICAgcmVnaXN0cnkuZHJhZ2dhYmxlLnJlZ2lzdGVyKHB1Ymxpc2hlZFJlZi5jdXJyZW50KTtcbiAgICByZXR1cm4gKCkgPT4gcmVnaXN0cnkuZHJhZ2dhYmxlLnVucmVnaXN0ZXIocHVibGlzaGVkUmVmLmN1cnJlbnQpO1xuICB9LCBbcmVnaXN0cnkuZHJhZ2dhYmxlXSk7XG4gIHVzZUxheW91dEVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGlzRmlyc3RQdWJsaXNoUmVmLmN1cnJlbnQpIHtcbiAgICAgIGlzRmlyc3RQdWJsaXNoUmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBsYXN0ID0gcHVibGlzaGVkUmVmLmN1cnJlbnQ7XG4gICAgcHVibGlzaGVkUmVmLmN1cnJlbnQgPSBlbnRyeTtcbiAgICByZWdpc3RyeS5kcmFnZ2FibGUudXBkYXRlKGVudHJ5LCBsYXN0KTtcbiAgfSwgW2VudHJ5LCByZWdpc3RyeS5kcmFnZ2FibGVdKTtcbn1cblxudmFyIERyb3BwYWJsZUNvbnRleHQgPSBSZWFjdF9fZGVmYXVsdFtcImRlZmF1bHRcIl0uY3JlYXRlQ29udGV4dChudWxsKTtcblxuZnVuY3Rpb24gY2hlY2tJc1ZhbGlkSW5uZXJSZWYoZWwpIHtcbiAgIShlbCAmJiBpc0h0bWxFbGVtZW50KGVsKSkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBpbnZhcmlhbnQoZmFsc2UsIGBcbiAgICBwcm92aWRlZC5pbm5lclJlZiBoYXMgbm90IGJlZW4gcHJvdmlkZWQgd2l0aCBhIEhUTUxFbGVtZW50LlxuXG4gICAgWW91IGNhbiBmaW5kIGEgZ3VpZGUgb24gdXNpbmcgdGhlIGlubmVyUmVmIGNhbGxiYWNrIGZ1bmN0aW9ucyBhdDpcbiAgICBodHRwczovL2dpdGh1Yi5jb20vaGVsbG8tcGFuZ2VhL2RuZC9ibG9iL21haW4vZG9jcy9ndWlkZXMvdXNpbmctaW5uZXItcmVmLm1kXG4gIGApIDogaW52YXJpYW50KGZhbHNlKSA6IHZvaWQgMDtcbn1cblxuZnVuY3Rpb24gdXNlVmFsaWRhdGlvbiQxKHByb3BzLCBjb250ZXh0SWQsIGdldFJlZikge1xuICB1c2VEZXZTZXR1cFdhcm5pbmcoKCkgPT4ge1xuICAgIGZ1bmN0aW9uIHByZWZpeChpZCkge1xuICAgICAgcmV0dXJuIGBEcmFnZ2FibGVbaWQ6ICR7aWR9XTogYDtcbiAgICB9XG5cbiAgICBjb25zdCBpZCA9IHByb3BzLmRyYWdnYWJsZUlkO1xuICAgICFpZCA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IGludmFyaWFudChmYWxzZSwgJ0RyYWdnYWJsZSByZXF1aXJlcyBhIGRyYWdnYWJsZUlkJykgOiBpbnZhcmlhbnQoZmFsc2UpIDogdm9pZCAwO1xuICAgICEodHlwZW9mIGlkID09PSAnc3RyaW5nJykgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBpbnZhcmlhbnQoZmFsc2UsIGBEcmFnZ2FibGUgcmVxdWlyZXMgYSBbc3RyaW5nXSBkcmFnZ2FibGVJZC5cbiAgICAgIFByb3ZpZGVkOiBbdHlwZTogJHt0eXBlb2YgaWR9XSAodmFsdWU6ICR7aWR9KWApIDogaW52YXJpYW50KGZhbHNlKSA6IHZvaWQgMDtcbiAgICAhTnVtYmVyLmlzSW50ZWdlcihwcm9wcy5pbmRleCkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBpbnZhcmlhbnQoZmFsc2UsIGAke3ByZWZpeChpZCl9IHJlcXVpcmVzIGFuIGludGVnZXIgaW5kZXggcHJvcGApIDogaW52YXJpYW50KGZhbHNlKSA6IHZvaWQgMDtcblxuICAgIGlmIChwcm9wcy5tYXBwZWQudHlwZSA9PT0gJ0RSQUdHSU5HJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNoZWNrSXNWYWxpZElubmVyUmVmKGdldFJlZigpKTtcblxuICAgIGlmIChwcm9wcy5pc0VuYWJsZWQpIHtcbiAgICAgICFmaW5kRHJhZ0hhbmRsZShjb250ZXh0SWQsIGlkKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IGludmFyaWFudChmYWxzZSwgYCR7cHJlZml4KGlkKX0gVW5hYmxlIHRvIGZpbmQgZHJhZyBoYW5kbGVgKSA6IGludmFyaWFudChmYWxzZSkgOiB2b2lkIDA7XG4gICAgfVxuICB9KTtcbn1cbmZ1bmN0aW9uIHVzZUNsb25lUHJvcFZhbGlkYXRpb24oaXNDbG9uZSkge1xuICB1c2VEZXYoKCkgPT4ge1xuICAgIGNvbnN0IGluaXRpYWxSZWYgPSBSZWFjdC51c2VSZWYoaXNDbG9uZSk7XG4gICAgdXNlRGV2U2V0dXBXYXJuaW5nKCgpID0+IHtcbiAgICAgICEoaXNDbG9uZSA9PT0gaW5pdGlhbFJlZi5jdXJyZW50KSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IGludmFyaWFudChmYWxzZSwgJ0RyYWdnYWJsZSBpc0Nsb25lIHByb3AgdmFsdWUgY2hhbmdlZCBkdXJpbmcgY29tcG9uZW50IGxpZmUnKSA6IGludmFyaWFudChmYWxzZSkgOiB2b2lkIDA7XG4gICAgfSwgW2lzQ2xvbmVdKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHVzZVJlcXVpcmVkQ29udGV4dChDb250ZXh0KSB7XG4gIGNvbnN0IHJlc3VsdCA9IFJlYWN0LnVzZUNvbnRleHQoQ29udGV4dCk7XG4gICFyZXN1bHQgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBpbnZhcmlhbnQoZmFsc2UsICdDb3VsZCBub3QgZmluZCByZXF1aXJlZCBjb250ZXh0JykgOiBpbnZhcmlhbnQoZmFsc2UpIDogdm9pZCAwO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBwcmV2ZW50SHRtbDVEbmQoZXZlbnQpIHtcbiAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbn1cblxuY29uc3QgRHJhZ2dhYmxlID0gcHJvcHMgPT4ge1xuICBjb25zdCByZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gIGNvbnN0IHNldFJlZiA9IHVzZU1lbW9PbmUudXNlQ2FsbGJhY2soZnVuY3Rpb24gKGVsKSB7XG4gICAgaWYgKGVsID09PSB2b2lkIDApIHtcbiAgICAgIGVsID0gbnVsbDtcbiAgICB9XG5cbiAgICByZWYuY3VycmVudCA9IGVsO1xuICB9LCBbXSk7XG4gIGNvbnN0IGdldFJlZiA9IHVzZU1lbW9PbmUudXNlQ2FsbGJhY2soKCkgPT4gcmVmLmN1cnJlbnQsIFtdKTtcbiAgY29uc3Qge1xuICAgIGNvbnRleHRJZCxcbiAgICBkcmFnSGFuZGxlVXNhZ2VJbnN0cnVjdGlvbnNJZCxcbiAgICByZWdpc3RyeVxuICB9ID0gdXNlUmVxdWlyZWRDb250ZXh0KEFwcENvbnRleHQpO1xuICBjb25zdCB7XG4gICAgdHlwZSxcbiAgICBkcm9wcGFibGVJZFxuICB9ID0gdXNlUmVxdWlyZWRDb250ZXh0KERyb3BwYWJsZUNvbnRleHQpO1xuICBjb25zdCBkZXNjcmlwdG9yID0gdXNlTWVtb09uZS51c2VNZW1vKCgpID0+ICh7XG4gICAgaWQ6IHByb3BzLmRyYWdnYWJsZUlkLFxuICAgIGluZGV4OiBwcm9wcy5pbmRleCxcbiAgICB0eXBlLFxuICAgIGRyb3BwYWJsZUlkXG4gIH0pLCBbcHJvcHMuZHJhZ2dhYmxlSWQsIHByb3BzLmluZGV4LCB0eXBlLCBkcm9wcGFibGVJZF0pO1xuICBjb25zdCB7XG4gICAgY2hpbGRyZW4sXG4gICAgZHJhZ2dhYmxlSWQsXG4gICAgaXNFbmFibGVkLFxuICAgIHNob3VsZFJlc3BlY3RGb3JjZVByZXNzLFxuICAgIGNhbkRyYWdJbnRlcmFjdGl2ZUVsZW1lbnRzLFxuICAgIGlzQ2xvbmUsXG4gICAgbWFwcGVkLFxuICAgIGRyb3BBbmltYXRpb25GaW5pc2hlZDogZHJvcEFuaW1hdGlvbkZpbmlzaGVkQWN0aW9uXG4gIH0gPSBwcm9wcztcbiAgdXNlVmFsaWRhdGlvbiQxKHByb3BzLCBjb250ZXh0SWQsIGdldFJlZik7XG4gIHVzZUNsb25lUHJvcFZhbGlkYXRpb24oaXNDbG9uZSk7XG5cbiAgaWYgKCFpc0Nsb25lKSB7XG4gICAgY29uc3QgZm9yUHVibGlzaGVyID0gdXNlTWVtb09uZS51c2VNZW1vKCgpID0+ICh7XG4gICAgICBkZXNjcmlwdG9yLFxuICAgICAgcmVnaXN0cnksXG4gICAgICBnZXREcmFnZ2FibGVSZWY6IGdldFJlZixcbiAgICAgIGNhbkRyYWdJbnRlcmFjdGl2ZUVsZW1lbnRzLFxuICAgICAgc2hvdWxkUmVzcGVjdEZvcmNlUHJlc3MsXG4gICAgICBpc0VuYWJsZWRcbiAgICB9KSwgW2Rlc2NyaXB0b3IsIHJlZ2lzdHJ5LCBnZXRSZWYsIGNhbkRyYWdJbnRlcmFjdGl2ZUVsZW1lbnRzLCBzaG91bGRSZXNwZWN0Rm9yY2VQcmVzcywgaXNFbmFibGVkXSk7XG4gICAgdXNlRHJhZ2dhYmxlUHVibGlzaGVyKGZvclB1Ymxpc2hlcik7XG4gIH1cblxuICBjb25zdCBkcmFnSGFuZGxlUHJvcHMgPSB1c2VNZW1vT25lLnVzZU1lbW8oKCkgPT4gaXNFbmFibGVkID8ge1xuICAgIHRhYkluZGV4OiAwLFxuICAgIHJvbGU6ICdidXR0b24nLFxuICAgICdhcmlhLWRlc2NyaWJlZGJ5JzogZHJhZ0hhbmRsZVVzYWdlSW5zdHJ1Y3Rpb25zSWQsXG4gICAgJ2RhdGEtcmZkLWRyYWctaGFuZGxlLWRyYWdnYWJsZS1pZCc6IGRyYWdnYWJsZUlkLFxuICAgICdkYXRhLXJmZC1kcmFnLWhhbmRsZS1jb250ZXh0LWlkJzogY29udGV4dElkLFxuICAgIGRyYWdnYWJsZTogZmFsc2UsXG4gICAgb25EcmFnU3RhcnQ6IHByZXZlbnRIdG1sNURuZFxuICB9IDogbnVsbCwgW2NvbnRleHRJZCwgZHJhZ0hhbmRsZVVzYWdlSW5zdHJ1Y3Rpb25zSWQsIGRyYWdnYWJsZUlkLCBpc0VuYWJsZWRdKTtcbiAgY29uc3Qgb25Nb3ZlRW5kID0gdXNlTWVtb09uZS51c2VDYWxsYmFjayhldmVudCA9PiB7XG4gICAgaWYgKG1hcHBlZC50eXBlICE9PSAnRFJBR0dJTkcnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFtYXBwZWQuZHJvcHBpbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZXZlbnQucHJvcGVydHlOYW1lICE9PSAndHJhbnNmb3JtJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChSZWFjdF9fZGVmYXVsdFtcImRlZmF1bHRcIl0udmVyc2lvbi5zdGFydHNXaXRoKCcxNicpIHx8IFJlYWN0X19kZWZhdWx0W1wiZGVmYXVsdFwiXS52ZXJzaW9uLnN0YXJ0c1dpdGgoJzE3JykpIHtcbiAgICAgIGRyb3BBbmltYXRpb25GaW5pc2hlZEFjdGlvbigpO1xuICAgIH0gZWxzZSB7XG4gICAgICBSZWFjdERPTS5mbHVzaFN5bmMoZHJvcEFuaW1hdGlvbkZpbmlzaGVkQWN0aW9uKTtcbiAgICB9XG4gIH0sIFtkcm9wQW5pbWF0aW9uRmluaXNoZWRBY3Rpb24sIG1hcHBlZF0pO1xuICBjb25zdCBwcm92aWRlZCA9IHVzZU1lbW9PbmUudXNlTWVtbygoKSA9PiB7XG4gICAgY29uc3Qgc3R5bGUgPSBnZXRTdHlsZSQxKG1hcHBlZCk7XG4gICAgY29uc3Qgb25UcmFuc2l0aW9uRW5kID0gbWFwcGVkLnR5cGUgPT09ICdEUkFHR0lORycgJiYgbWFwcGVkLmRyb3BwaW5nID8gb25Nb3ZlRW5kIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgIGlubmVyUmVmOiBzZXRSZWYsXG4gICAgICBkcmFnZ2FibGVQcm9wczoge1xuICAgICAgICAnZGF0YS1yZmQtZHJhZ2dhYmxlLWNvbnRleHQtaWQnOiBjb250ZXh0SWQsXG4gICAgICAgICdkYXRhLXJmZC1kcmFnZ2FibGUtaWQnOiBkcmFnZ2FibGVJZCxcbiAgICAgICAgc3R5bGUsXG4gICAgICAgIG9uVHJhbnNpdGlvbkVuZFxuICAgICAgfSxcbiAgICAgIGRyYWdIYW5kbGVQcm9wc1xuICAgIH07XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSwgW2NvbnRleHRJZCwgZHJhZ0hhbmRsZVByb3BzLCBkcmFnZ2FibGVJZCwgbWFwcGVkLCBvbk1vdmVFbmQsIHNldFJlZl0pO1xuICBjb25zdCBydWJyaWMgPSB1c2VNZW1vT25lLnVzZU1lbW8oKCkgPT4gKHtcbiAgICBkcmFnZ2FibGVJZDogZGVzY3JpcHRvci5pZCxcbiAgICB0eXBlOiBkZXNjcmlwdG9yLnR5cGUsXG4gICAgc291cmNlOiB7XG4gICAgICBpbmRleDogZGVzY3JpcHRvci5pbmRleCxcbiAgICAgIGRyb3BwYWJsZUlkOiBkZXNjcmlwdG9yLmRyb3BwYWJsZUlkXG4gICAgfVxuICB9KSwgW2Rlc2NyaXB0b3IuZHJvcHBhYmxlSWQsIGRlc2NyaXB0b3IuaWQsIGRlc2NyaXB0b3IuaW5kZXgsIGRlc2NyaXB0b3IudHlwZV0pO1xuICByZXR1cm4gUmVhY3RfX2RlZmF1bHRbXCJkZWZhdWx0XCJdLmNyZWF0ZUVsZW1lbnQoUmVhY3RfX2RlZmF1bHRbXCJkZWZhdWx0XCJdLkZyYWdtZW50LCBudWxsLCBjaGlsZHJlbihwcm92aWRlZCwgbWFwcGVkLnNuYXBzaG90LCBydWJyaWMpKTtcbn07XG5cbnZhciBEcmFnZ2FibGUkMSA9IERyYWdnYWJsZTtcblxudmFyIGlzU3RyaWN0RXF1YWwgPSAoKGEsIGIpID0+IGEgPT09IGIpO1xuXG52YXIgd2hhdElzRHJhZ2dlZE92ZXJGcm9tUmVzdWx0ID0gKHJlc3VsdCA9PiB7XG4gIGNvbnN0IHtcbiAgICBjb21iaW5lLFxuICAgIGRlc3RpbmF0aW9uXG4gIH0gPSByZXN1bHQ7XG5cbiAgaWYgKGRlc3RpbmF0aW9uKSB7XG4gICAgcmV0dXJuIGRlc3RpbmF0aW9uLmRyb3BwYWJsZUlkO1xuICB9XG5cbiAgaWYgKGNvbWJpbmUpIHtcbiAgICByZXR1cm4gY29tYmluZS5kcm9wcGFibGVJZDtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufSk7XG5cbmNvbnN0IGdldENvbWJpbmVXaXRoRnJvbVJlc3VsdCA9IHJlc3VsdCA9PiB7XG4gIHJldHVybiByZXN1bHQuY29tYmluZSA/IHJlc3VsdC5jb21iaW5lLmRyYWdnYWJsZUlkIDogbnVsbDtcbn07XG5cbmNvbnN0IGdldENvbWJpbmVXaXRoRnJvbUltcGFjdCA9IGltcGFjdCA9PiB7XG4gIHJldHVybiBpbXBhY3QuYXQgJiYgaW1wYWN0LmF0LnR5cGUgPT09ICdDT01CSU5FJyA/IGltcGFjdC5hdC5jb21iaW5lLmRyYWdnYWJsZUlkIDogbnVsbDtcbn07XG5cbmZ1bmN0aW9uIGdldERyYWdnYWJsZVNlbGVjdG9yKCkge1xuICBjb25zdCBtZW1vaXplZE9mZnNldCA9IG1lbW9pemVPbmVfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKCh4LCB5KSA9PiAoe1xuICAgIHgsXG4gICAgeVxuICB9KSk7XG4gIGNvbnN0IGdldE1lbW9pemVkU25hcHNob3QgPSBtZW1vaXplT25lX19kZWZhdWx0W1wiZGVmYXVsdFwiXShmdW5jdGlvbiAobW9kZSwgaXNDbG9uZSwgZHJhZ2dpbmdPdmVyLCBjb21iaW5lV2l0aCwgZHJvcHBpbmcpIHtcbiAgICBpZiAoZHJhZ2dpbmdPdmVyID09PSB2b2lkIDApIHtcbiAgICAgIGRyYWdnaW5nT3ZlciA9IG51bGw7XG4gICAgfVxuXG4gICAgaWYgKGNvbWJpbmVXaXRoID09PSB2b2lkIDApIHtcbiAgICAgIGNvbWJpbmVXaXRoID0gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoZHJvcHBpbmcgPT09IHZvaWQgMCkge1xuICAgICAgZHJvcHBpbmcgPSBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBpc0RyYWdnaW5nOiB0cnVlLFxuICAgICAgaXNDbG9uZSxcbiAgICAgIGlzRHJvcEFuaW1hdGluZzogQm9vbGVhbihkcm9wcGluZyksXG4gICAgICBkcm9wQW5pbWF0aW9uOiBkcm9wcGluZyxcbiAgICAgIG1vZGUsXG4gICAgICBkcmFnZ2luZ092ZXIsXG4gICAgICBjb21iaW5lV2l0aCxcbiAgICAgIGNvbWJpbmVUYXJnZXRGb3I6IG51bGxcbiAgICB9O1xuICB9KTtcbiAgY29uc3QgZ2V0TWVtb2l6ZWRQcm9wcyA9IG1lbW9pemVPbmVfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKGZ1bmN0aW9uIChvZmZzZXQsIG1vZGUsIGRpbWVuc2lvbiwgaXNDbG9uZSwgZHJhZ2dpbmdPdmVyLCBjb21iaW5lV2l0aCwgZm9yY2VTaG91bGRBbmltYXRlKSB7XG4gICAgaWYgKGRyYWdnaW5nT3ZlciA9PT0gdm9pZCAwKSB7XG4gICAgICBkcmFnZ2luZ092ZXIgPSBudWxsO1xuICAgIH1cblxuICAgIGlmIChjb21iaW5lV2l0aCA9PT0gdm9pZCAwKSB7XG4gICAgICBjb21iaW5lV2l0aCA9IG51bGw7XG4gICAgfVxuXG4gICAgaWYgKGZvcmNlU2hvdWxkQW5pbWF0ZSA9PT0gdm9pZCAwKSB7XG4gICAgICBmb3JjZVNob3VsZEFuaW1hdGUgPSBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBtYXBwZWQ6IHtcbiAgICAgICAgdHlwZTogJ0RSQUdHSU5HJyxcbiAgICAgICAgZHJvcHBpbmc6IG51bGwsXG4gICAgICAgIGRyYWdnaW5nT3ZlcixcbiAgICAgICAgY29tYmluZVdpdGgsXG4gICAgICAgIG1vZGUsXG4gICAgICAgIG9mZnNldCxcbiAgICAgICAgZGltZW5zaW9uLFxuICAgICAgICBmb3JjZVNob3VsZEFuaW1hdGUsXG4gICAgICAgIHNuYXBzaG90OiBnZXRNZW1vaXplZFNuYXBzaG90KG1vZGUsIGlzQ2xvbmUsIGRyYWdnaW5nT3ZlciwgY29tYmluZVdpdGgsIG51bGwpXG4gICAgICB9XG4gICAgfTtcbiAgfSk7XG5cbiAgY29uc3Qgc2VsZWN0b3IgPSAoc3RhdGUsIG93blByb3BzKSA9PiB7XG4gICAgaWYgKGlzRHJhZ2dpbmcoc3RhdGUpKSB7XG4gICAgICBpZiAoc3RhdGUuY3JpdGljYWwuZHJhZ2dhYmxlLmlkICE9PSBvd25Qcm9wcy5kcmFnZ2FibGVJZCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgb2Zmc2V0ID0gc3RhdGUuY3VycmVudC5jbGllbnQub2Zmc2V0O1xuICAgICAgY29uc3QgZGltZW5zaW9uID0gc3RhdGUuZGltZW5zaW9ucy5kcmFnZ2FibGVzW293blByb3BzLmRyYWdnYWJsZUlkXTtcbiAgICAgIGNvbnN0IGRyYWdnaW5nT3ZlciA9IHdoYXRJc0RyYWdnZWRPdmVyKHN0YXRlLmltcGFjdCk7XG4gICAgICBjb25zdCBjb21iaW5lV2l0aCA9IGdldENvbWJpbmVXaXRoRnJvbUltcGFjdChzdGF0ZS5pbXBhY3QpO1xuICAgICAgY29uc3QgZm9yY2VTaG91bGRBbmltYXRlID0gc3RhdGUuZm9yY2VTaG91bGRBbmltYXRlO1xuICAgICAgcmV0dXJuIGdldE1lbW9pemVkUHJvcHMobWVtb2l6ZWRPZmZzZXQob2Zmc2V0LngsIG9mZnNldC55KSwgc3RhdGUubW92ZW1lbnRNb2RlLCBkaW1lbnNpb24sIG93blByb3BzLmlzQ2xvbmUsIGRyYWdnaW5nT3ZlciwgY29tYmluZVdpdGgsIGZvcmNlU2hvdWxkQW5pbWF0ZSk7XG4gICAgfVxuXG4gICAgaWYgKHN0YXRlLnBoYXNlID09PSAnRFJPUF9BTklNQVRJTkcnKSB7XG4gICAgICBjb25zdCBjb21wbGV0ZWQgPSBzdGF0ZS5jb21wbGV0ZWQ7XG5cbiAgICAgIGlmIChjb21wbGV0ZWQucmVzdWx0LmRyYWdnYWJsZUlkICE9PSBvd25Qcm9wcy5kcmFnZ2FibGVJZCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgaXNDbG9uZSA9IG93blByb3BzLmlzQ2xvbmU7XG4gICAgICBjb25zdCBkaW1lbnNpb24gPSBzdGF0ZS5kaW1lbnNpb25zLmRyYWdnYWJsZXNbb3duUHJvcHMuZHJhZ2dhYmxlSWRdO1xuICAgICAgY29uc3QgcmVzdWx0ID0gY29tcGxldGVkLnJlc3VsdDtcbiAgICAgIGNvbnN0IG1vZGUgPSByZXN1bHQubW9kZTtcbiAgICAgIGNvbnN0IGRyYWdnaW5nT3ZlciA9IHdoYXRJc0RyYWdnZWRPdmVyRnJvbVJlc3VsdChyZXN1bHQpO1xuICAgICAgY29uc3QgY29tYmluZVdpdGggPSBnZXRDb21iaW5lV2l0aEZyb21SZXN1bHQocmVzdWx0KTtcbiAgICAgIGNvbnN0IGR1cmF0aW9uID0gc3RhdGUuZHJvcER1cmF0aW9uO1xuICAgICAgY29uc3QgZHJvcHBpbmcgPSB7XG4gICAgICAgIGR1cmF0aW9uLFxuICAgICAgICBjdXJ2ZTogY3VydmVzLmRyb3AsXG4gICAgICAgIG1vdmVUbzogc3RhdGUubmV3SG9tZUNsaWVudE9mZnNldCxcbiAgICAgICAgb3BhY2l0eTogY29tYmluZVdpdGggPyBjb21iaW5lLm9wYWNpdHkuZHJvcCA6IG51bGwsXG4gICAgICAgIHNjYWxlOiBjb21iaW5lV2l0aCA/IGNvbWJpbmUuc2NhbGUuZHJvcCA6IG51bGxcbiAgICAgIH07XG4gICAgICByZXR1cm4ge1xuICAgICAgICBtYXBwZWQ6IHtcbiAgICAgICAgICB0eXBlOiAnRFJBR0dJTkcnLFxuICAgICAgICAgIG9mZnNldDogc3RhdGUubmV3SG9tZUNsaWVudE9mZnNldCxcbiAgICAgICAgICBkaW1lbnNpb24sXG4gICAgICAgICAgZHJvcHBpbmcsXG4gICAgICAgICAgZHJhZ2dpbmdPdmVyLFxuICAgICAgICAgIGNvbWJpbmVXaXRoLFxuICAgICAgICAgIG1vZGUsXG4gICAgICAgICAgZm9yY2VTaG91bGRBbmltYXRlOiBudWxsLFxuICAgICAgICAgIHNuYXBzaG90OiBnZXRNZW1vaXplZFNuYXBzaG90KG1vZGUsIGlzQ2xvbmUsIGRyYWdnaW5nT3ZlciwgY29tYmluZVdpdGgsIGRyb3BwaW5nKVxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9O1xuXG4gIHJldHVybiBzZWxlY3Rvcjtcbn1cblxuZnVuY3Rpb24gZ2V0U2Vjb25kYXJ5U25hcHNob3QoY29tYmluZVRhcmdldEZvcikge1xuICBpZiAoY29tYmluZVRhcmdldEZvciA9PT0gdm9pZCAwKSB7XG4gICAgY29tYmluZVRhcmdldEZvciA9IG51bGw7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGlzRHJhZ2dpbmc6IGZhbHNlLFxuICAgIGlzRHJvcEFuaW1hdGluZzogZmFsc2UsXG4gICAgaXNDbG9uZTogZmFsc2UsXG4gICAgZHJvcEFuaW1hdGlvbjogbnVsbCxcbiAgICBtb2RlOiBudWxsLFxuICAgIGRyYWdnaW5nT3ZlcjogbnVsbCxcbiAgICBjb21iaW5lVGFyZ2V0Rm9yLFxuICAgIGNvbWJpbmVXaXRoOiBudWxsXG4gIH07XG59XG5cbmNvbnN0IGF0UmVzdCA9IHtcbiAgbWFwcGVkOiB7XG4gICAgdHlwZTogJ1NFQ09OREFSWScsXG4gICAgb2Zmc2V0OiBvcmlnaW4sXG4gICAgY29tYmluZVRhcmdldEZvcjogbnVsbCxcbiAgICBzaG91bGRBbmltYXRlRGlzcGxhY2VtZW50OiB0cnVlLFxuICAgIHNuYXBzaG90OiBnZXRTZWNvbmRhcnlTbmFwc2hvdChudWxsKVxuICB9XG59O1xuXG5mdW5jdGlvbiBnZXRTZWNvbmRhcnlTZWxlY3RvcigpIHtcbiAgY29uc3QgbWVtb2l6ZWRPZmZzZXQgPSBtZW1vaXplT25lX19kZWZhdWx0W1wiZGVmYXVsdFwiXSgoeCwgeSkgPT4gKHtcbiAgICB4LFxuICAgIHlcbiAgfSkpO1xuICBjb25zdCBnZXRNZW1vaXplZFNuYXBzaG90ID0gbWVtb2l6ZU9uZV9fZGVmYXVsdFtcImRlZmF1bHRcIl0oZ2V0U2Vjb25kYXJ5U25hcHNob3QpO1xuICBjb25zdCBnZXRNZW1vaXplZFByb3BzID0gbWVtb2l6ZU9uZV9fZGVmYXVsdFtcImRlZmF1bHRcIl0oZnVuY3Rpb24gKG9mZnNldCwgY29tYmluZVRhcmdldEZvciwgc2hvdWxkQW5pbWF0ZURpc3BsYWNlbWVudCkge1xuICAgIGlmIChjb21iaW5lVGFyZ2V0Rm9yID09PSB2b2lkIDApIHtcbiAgICAgIGNvbWJpbmVUYXJnZXRGb3IgPSBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBtYXBwZWQ6IHtcbiAgICAgICAgdHlwZTogJ1NFQ09OREFSWScsXG4gICAgICAgIG9mZnNldCxcbiAgICAgICAgY29tYmluZVRhcmdldEZvcixcbiAgICAgICAgc2hvdWxkQW5pbWF0ZURpc3BsYWNlbWVudCxcbiAgICAgICAgc25hcHNob3Q6IGdldE1lbW9pemVkU25hcHNob3QoY29tYmluZVRhcmdldEZvcilcbiAgICAgIH1cbiAgICB9O1xuICB9KTtcblxuICBjb25zdCBnZXRGYWxsYmFjayA9IGNvbWJpbmVUYXJnZXRGb3IgPT4ge1xuICAgIHJldHVybiBjb21iaW5lVGFyZ2V0Rm9yID8gZ2V0TWVtb2l6ZWRQcm9wcyhvcmlnaW4sIGNvbWJpbmVUYXJnZXRGb3IsIHRydWUpIDogbnVsbDtcbiAgfTtcblxuICBjb25zdCBnZXRQcm9wcyA9IChvd25JZCwgZHJhZ2dpbmdJZCwgaW1wYWN0LCBhZnRlckNyaXRpY2FsKSA9PiB7XG4gICAgY29uc3QgdmlzdWFsRGlzcGxhY2VtZW50ID0gaW1wYWN0LmRpc3BsYWNlZC52aXNpYmxlW293bklkXTtcbiAgICBjb25zdCBpc0FmdGVyQ3JpdGljYWxJblZpcnR1YWxMaXN0ID0gQm9vbGVhbihhZnRlckNyaXRpY2FsLmluVmlydHVhbExpc3QgJiYgYWZ0ZXJDcml0aWNhbC5lZmZlY3RlZFtvd25JZF0pO1xuICAgIGNvbnN0IGNvbWJpbmUgPSB0cnlHZXRDb21iaW5lKGltcGFjdCk7XG4gICAgY29uc3QgY29tYmluZVRhcmdldEZvciA9IGNvbWJpbmUgJiYgY29tYmluZS5kcmFnZ2FibGVJZCA9PT0gb3duSWQgPyBkcmFnZ2luZ0lkIDogbnVsbDtcblxuICAgIGlmICghdmlzdWFsRGlzcGxhY2VtZW50KSB7XG4gICAgICBpZiAoIWlzQWZ0ZXJDcml0aWNhbEluVmlydHVhbExpc3QpIHtcbiAgICAgICAgcmV0dXJuIGdldEZhbGxiYWNrKGNvbWJpbmVUYXJnZXRGb3IpO1xuICAgICAgfVxuXG4gICAgICBpZiAoaW1wYWN0LmRpc3BsYWNlZC5pbnZpc2libGVbb3duSWRdKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjaGFuZ2UgPSBuZWdhdGUoYWZ0ZXJDcml0aWNhbC5kaXNwbGFjZWRCeS5wb2ludCk7XG4gICAgICBjb25zdCBvZmZzZXQgPSBtZW1vaXplZE9mZnNldChjaGFuZ2UueCwgY2hhbmdlLnkpO1xuICAgICAgcmV0dXJuIGdldE1lbW9pemVkUHJvcHMob2Zmc2V0LCBjb21iaW5lVGFyZ2V0Rm9yLCB0cnVlKTtcbiAgICB9XG5cbiAgICBpZiAoaXNBZnRlckNyaXRpY2FsSW5WaXJ0dWFsTGlzdCkge1xuICAgICAgcmV0dXJuIGdldEZhbGxiYWNrKGNvbWJpbmVUYXJnZXRGb3IpO1xuICAgIH1cblxuICAgIGNvbnN0IGRpc3BsYWNlQnkgPSBpbXBhY3QuZGlzcGxhY2VkQnkucG9pbnQ7XG4gICAgY29uc3Qgb2Zmc2V0ID0gbWVtb2l6ZWRPZmZzZXQoZGlzcGxhY2VCeS54LCBkaXNwbGFjZUJ5LnkpO1xuICAgIHJldHVybiBnZXRNZW1vaXplZFByb3BzKG9mZnNldCwgY29tYmluZVRhcmdldEZvciwgdmlzdWFsRGlzcGxhY2VtZW50LnNob3VsZEFuaW1hdGUpO1xuICB9O1xuXG4gIGNvbnN0IHNlbGVjdG9yID0gKHN0YXRlLCBvd25Qcm9wcykgPT4ge1xuICAgIGlmIChpc0RyYWdnaW5nKHN0YXRlKSkge1xuICAgICAgaWYgKHN0YXRlLmNyaXRpY2FsLmRyYWdnYWJsZS5pZCA9PT0gb3duUHJvcHMuZHJhZ2dhYmxlSWQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBnZXRQcm9wcyhvd25Qcm9wcy5kcmFnZ2FibGVJZCwgc3RhdGUuY3JpdGljYWwuZHJhZ2dhYmxlLmlkLCBzdGF0ZS5pbXBhY3QsIHN0YXRlLmFmdGVyQ3JpdGljYWwpO1xuICAgIH1cblxuICAgIGlmIChzdGF0ZS5waGFzZSA9PT0gJ0RST1BfQU5JTUFUSU5HJykge1xuICAgICAgY29uc3QgY29tcGxldGVkID0gc3RhdGUuY29tcGxldGVkO1xuXG4gICAgICBpZiAoY29tcGxldGVkLnJlc3VsdC5kcmFnZ2FibGVJZCA9PT0gb3duUHJvcHMuZHJhZ2dhYmxlSWQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBnZXRQcm9wcyhvd25Qcm9wcy5kcmFnZ2FibGVJZCwgY29tcGxldGVkLnJlc3VsdC5kcmFnZ2FibGVJZCwgY29tcGxldGVkLmltcGFjdCwgY29tcGxldGVkLmFmdGVyQ3JpdGljYWwpO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9O1xuXG4gIHJldHVybiBzZWxlY3Rvcjtcbn1cblxuY29uc3QgbWFrZU1hcFN0YXRlVG9Qcm9wcyQxID0gKCkgPT4ge1xuICBjb25zdCBkcmFnZ2luZ1NlbGVjdG9yID0gZ2V0RHJhZ2dhYmxlU2VsZWN0b3IoKTtcbiAgY29uc3Qgc2Vjb25kYXJ5U2VsZWN0b3IgPSBnZXRTZWNvbmRhcnlTZWxlY3RvcigpO1xuXG4gIGNvbnN0IHNlbGVjdG9yID0gKHN0YXRlLCBvd25Qcm9wcykgPT4gZHJhZ2dpbmdTZWxlY3RvcihzdGF0ZSwgb3duUHJvcHMpIHx8IHNlY29uZGFyeVNlbGVjdG9yKHN0YXRlLCBvd25Qcm9wcykgfHwgYXRSZXN0O1xuXG4gIHJldHVybiBzZWxlY3Rvcjtcbn07XG5jb25zdCBtYXBEaXNwYXRjaFRvUHJvcHMkMSA9IHtcbiAgZHJvcEFuaW1hdGlvbkZpbmlzaGVkOiBkcm9wQW5pbWF0aW9uRmluaXNoZWRcbn07XG5jb25zdCBDb25uZWN0ZWREcmFnZ2FibGUgPSByZWFjdFJlZHV4LmNvbm5lY3QobWFrZU1hcFN0YXRlVG9Qcm9wcyQxLCBtYXBEaXNwYXRjaFRvUHJvcHMkMSwgbnVsbCwge1xuICBjb250ZXh0OiBTdG9yZUNvbnRleHQsXG4gIGFyZVN0YXRlUHJvcHNFcXVhbDogaXNTdHJpY3RFcXVhbFxufSkoRHJhZ2dhYmxlJDEpO1xudmFyIENvbm5lY3RlZERyYWdnYWJsZSQxID0gQ29ubmVjdGVkRHJhZ2dhYmxlO1xuXG5mdW5jdGlvbiBQcml2YXRlRHJhZ2dhYmxlKHByb3BzKSB7XG4gIGNvbnN0IGRyb3BwYWJsZUNvbnRleHQgPSB1c2VSZXF1aXJlZENvbnRleHQoRHJvcHBhYmxlQ29udGV4dCk7XG4gIGNvbnN0IGlzVXNpbmdDbG9uZUZvciA9IGRyb3BwYWJsZUNvbnRleHQuaXNVc2luZ0Nsb25lRm9yO1xuXG4gIGlmIChpc1VzaW5nQ2xvbmVGb3IgPT09IHByb3BzLmRyYWdnYWJsZUlkICYmICFwcm9wcy5pc0Nsb25lKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4gUmVhY3RfX2RlZmF1bHRbXCJkZWZhdWx0XCJdLmNyZWF0ZUVsZW1lbnQoQ29ubmVjdGVkRHJhZ2dhYmxlJDEsIHByb3BzKTtcbn1cbmZ1bmN0aW9uIFB1YmxpY0RyYWdnYWJsZShwcm9wcykge1xuICBjb25zdCBpc0VuYWJsZWQgPSB0eXBlb2YgcHJvcHMuaXNEcmFnRGlzYWJsZWQgPT09ICdib29sZWFuJyA/ICFwcm9wcy5pc0RyYWdEaXNhYmxlZCA6IHRydWU7XG4gIGNvbnN0IGNhbkRyYWdJbnRlcmFjdGl2ZUVsZW1lbnRzID0gQm9vbGVhbihwcm9wcy5kaXNhYmxlSW50ZXJhY3RpdmVFbGVtZW50QmxvY2tpbmcpO1xuICBjb25zdCBzaG91bGRSZXNwZWN0Rm9yY2VQcmVzcyA9IEJvb2xlYW4ocHJvcHMuc2hvdWxkUmVzcGVjdEZvcmNlUHJlc3MpO1xuICByZXR1cm4gUmVhY3RfX2RlZmF1bHRbXCJkZWZhdWx0XCJdLmNyZWF0ZUVsZW1lbnQoUHJpdmF0ZURyYWdnYWJsZSwgX2V4dGVuZHNfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKHt9LCBwcm9wcywge1xuICAgIGlzQ2xvbmU6IGZhbHNlLFxuICAgIGlzRW5hYmxlZDogaXNFbmFibGVkLFxuICAgIGNhbkRyYWdJbnRlcmFjdGl2ZUVsZW1lbnRzOiBjYW5EcmFnSW50ZXJhY3RpdmVFbGVtZW50cyxcbiAgICBzaG91bGRSZXNwZWN0Rm9yY2VQcmVzczogc2hvdWxkUmVzcGVjdEZvcmNlUHJlc3NcbiAgfSkpO1xufVxuXG5jb25zdCBpc0VxdWFsID0gYmFzZSA9PiB2YWx1ZSA9PiBiYXNlID09PSB2YWx1ZTtcblxuY29uc3QgaXNTY3JvbGwgPSBpc0VxdWFsKCdzY3JvbGwnKTtcbmNvbnN0IGlzQXV0byA9IGlzRXF1YWwoJ2F1dG8nKTtcbmNvbnN0IGlzVmlzaWJsZSA9IGlzRXF1YWwoJ3Zpc2libGUnKTtcblxuY29uc3QgaXNFaXRoZXIgPSAob3ZlcmZsb3csIGZuKSA9PiBmbihvdmVyZmxvdy5vdmVyZmxvd1gpIHx8IGZuKG92ZXJmbG93Lm92ZXJmbG93WSk7XG5cbmNvbnN0IGlzQm90aCA9IChvdmVyZmxvdywgZm4pID0+IGZuKG92ZXJmbG93Lm92ZXJmbG93WCkgJiYgZm4ob3ZlcmZsb3cub3ZlcmZsb3dZKTtcblxuY29uc3QgaXNFbGVtZW50U2Nyb2xsYWJsZSA9IGVsID0+IHtcbiAgY29uc3Qgc3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbCk7XG4gIGNvbnN0IG92ZXJmbG93ID0ge1xuICAgIG92ZXJmbG93WDogc3R5bGUub3ZlcmZsb3dYLFxuICAgIG92ZXJmbG93WTogc3R5bGUub3ZlcmZsb3dZXG4gIH07XG4gIHJldHVybiBpc0VpdGhlcihvdmVyZmxvdywgaXNTY3JvbGwpIHx8IGlzRWl0aGVyKG92ZXJmbG93LCBpc0F1dG8pO1xufTtcblxuY29uc3QgaXNCb2R5U2Nyb2xsYWJsZSA9ICgpID0+IHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBib2R5ID0gZ2V0Qm9keUVsZW1lbnQoKTtcbiAgY29uc3QgaHRtbCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgIWh0bWwgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBpbnZhcmlhbnQoZmFsc2UpIDogaW52YXJpYW50KGZhbHNlKSA6IHZvaWQgMDtcblxuICBpZiAoIWlzRWxlbWVudFNjcm9sbGFibGUoYm9keSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBodG1sU3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShodG1sKTtcbiAgY29uc3QgaHRtbE92ZXJmbG93ID0ge1xuICAgIG92ZXJmbG93WDogaHRtbFN0eWxlLm92ZXJmbG93WCxcbiAgICBvdmVyZmxvd1k6IGh0bWxTdHlsZS5vdmVyZmxvd1lcbiAgfTtcblxuICBpZiAoaXNCb3RoKGh0bWxPdmVyZmxvdywgaXNWaXNpYmxlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHdhcm5pbmcoYFxuICAgIFdlIGhhdmUgZGV0ZWN0ZWQgdGhhdCB5b3VyIDxib2R5PiBlbGVtZW50IG1pZ2h0IGJlIGEgc2Nyb2xsIGNvbnRhaW5lci5cbiAgICBXZSBoYXZlIGZvdW5kIG5vIHJlbGlhYmxlIHdheSBvZiBkZXRlY3Rpbmcgd2hldGhlciB0aGUgPGJvZHk+IGVsZW1lbnQgaXMgYSBzY3JvbGwgY29udGFpbmVyLlxuICAgIFVuZGVyIG1vc3QgY2lyY3Vtc3RhbmNlcyBhIDxib2R5PiBzY3JvbGwgYmFyIHdpbGwgYmUgb24gdGhlIDxodG1sPiBlbGVtZW50IChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpXG5cbiAgICBCZWNhdXNlIHdlIGNhbm5vdCBkZXRlcm1pbmUgaWYgdGhlIDxib2R5PiBpcyBhIHNjcm9sbCBjb250YWluZXIsIGFuZCBnZW5lcmFsbHkgaXQgaXMgbm90IG9uZSxcbiAgICB3ZSB3aWxsIGJlIHRyZWF0aW5nIHRoZSA8Ym9keT4gYXMgKm5vdCogYSBzY3JvbGwgY29udGFpbmVyXG5cbiAgICBNb3JlIGluZm9ybWF0aW9uOiBodHRwczovL2dpdGh1Yi5jb20vaGVsbG8tcGFuZ2VhL2RuZC9ibG9iL21haW4vZG9jcy9ndWlkZXMvaG93LXdlLWRldGVjdC1zY3JvbGwtY29udGFpbmVycy5tZFxuICBgKSA6IHZvaWQgMDtcbiAgcmV0dXJuIGZhbHNlO1xufTtcblxuY29uc3QgZ2V0Q2xvc2VzdFNjcm9sbGFibGUgPSBlbCA9PiB7XG4gIGlmIChlbCA9PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZiAoZWwgPT09IGRvY3VtZW50LmJvZHkpIHtcbiAgICByZXR1cm4gaXNCb2R5U2Nyb2xsYWJsZSgpID8gZWwgOiBudWxsO1xuICB9XG5cbiAgaWYgKGVsID09PSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmICghaXNFbGVtZW50U2Nyb2xsYWJsZShlbCkpIHtcbiAgICByZXR1cm4gZ2V0Q2xvc2VzdFNjcm9sbGFibGUoZWwucGFyZW50RWxlbWVudCk7XG4gIH1cblxuICByZXR1cm4gZWw7XG59O1xuXG52YXIgZ2V0Q2xvc2VzdFNjcm9sbGFibGUkMSA9IGdldENsb3Nlc3RTY3JvbGxhYmxlO1xuXG52YXIgY2hlY2tGb3JOZXN0ZWRTY3JvbGxDb250YWluZXJzID0gKHNjcm9sbGFibGUgPT4ge1xuICBpZiAoIXNjcm9sbGFibGUpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBhbm90aGVyU2Nyb2xsUGFyZW50ID0gZ2V0Q2xvc2VzdFNjcm9sbGFibGUkMShzY3JvbGxhYmxlLnBhcmVudEVsZW1lbnQpO1xuXG4gIGlmICghYW5vdGhlclNjcm9sbFBhcmVudCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHdhcm5pbmcoYFxuICAgIERyb3BwYWJsZTogdW5zdXBwb3J0ZWQgbmVzdGVkIHNjcm9sbCBjb250YWluZXIgZGV0ZWN0ZWQuXG4gICAgQSBEcm9wcGFibGUgY2FuIG9ubHkgaGF2ZSBvbmUgc2Nyb2xsIHBhcmVudCAod2hpY2ggY2FuIGJlIGl0c2VsZilcbiAgICBOZXN0ZWQgc2Nyb2xsIGNvbnRhaW5lcnMgYXJlIGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkLlxuXG4gICAgV2UgaG9wZSB0byBzdXBwb3J0IG5lc3RlZCBzY3JvbGwgY29udGFpbmVycyBzb29uOiBodHRwczovL2dpdGh1Yi5jb20vYXRsYXNzaWFuL3JlYWN0LWJlYXV0aWZ1bC1kbmQvaXNzdWVzLzEzMVxuICBgKSA6IHZvaWQgMDtcbn0pO1xuXG52YXIgZ2V0U2Nyb2xsID0gKGVsID0+ICh7XG4gIHg6IGVsLnNjcm9sbExlZnQsXG4gIHk6IGVsLnNjcm9sbFRvcFxufSkpO1xuXG5jb25zdCBnZXRJc0ZpeGVkID0gZWwgPT4ge1xuICBpZiAoIWVsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3Qgc3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbCk7XG5cbiAgaWYgKHN0eWxlLnBvc2l0aW9uID09PSAnZml4ZWQnKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gZ2V0SXNGaXhlZChlbC5wYXJlbnRFbGVtZW50KTtcbn07XG5cbnZhciBnZXRFbnYgPSAoc3RhcnQgPT4ge1xuICBjb25zdCBjbG9zZXN0U2Nyb2xsYWJsZSA9IGdldENsb3Nlc3RTY3JvbGxhYmxlJDEoc3RhcnQpO1xuICBjb25zdCBpc0ZpeGVkT25QYWdlID0gZ2V0SXNGaXhlZChzdGFydCk7XG4gIHJldHVybiB7XG4gICAgY2xvc2VzdFNjcm9sbGFibGUsXG4gICAgaXNGaXhlZE9uUGFnZVxuICB9O1xufSk7XG5cbnZhciBnZXREcm9wcGFibGVEaW1lbnNpb24gPSAoX3JlZiA9PiB7XG4gIGxldCB7XG4gICAgZGVzY3JpcHRvcixcbiAgICBpc0VuYWJsZWQsXG4gICAgaXNDb21iaW5lRW5hYmxlZCxcbiAgICBpc0ZpeGVkT25QYWdlLFxuICAgIGRpcmVjdGlvbixcbiAgICBjbGllbnQsXG4gICAgcGFnZSxcbiAgICBjbG9zZXN0XG4gIH0gPSBfcmVmO1xuXG4gIGNvbnN0IGZyYW1lID0gKCgpID0+IHtcbiAgICBpZiAoIWNsb3Nlc3QpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHtcbiAgICAgIHNjcm9sbFNpemUsXG4gICAgICBjbGllbnQ6IGZyYW1lQ2xpZW50XG4gICAgfSA9IGNsb3Nlc3Q7XG4gICAgY29uc3QgbWF4U2Nyb2xsID0gZ2V0TWF4U2Nyb2xsKHtcbiAgICAgIHNjcm9sbEhlaWdodDogc2Nyb2xsU2l6ZS5zY3JvbGxIZWlnaHQsXG4gICAgICBzY3JvbGxXaWR0aDogc2Nyb2xsU2l6ZS5zY3JvbGxXaWR0aCxcbiAgICAgIGhlaWdodDogZnJhbWVDbGllbnQucGFkZGluZ0JveC5oZWlnaHQsXG4gICAgICB3aWR0aDogZnJhbWVDbGllbnQucGFkZGluZ0JveC53aWR0aFxuICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICBwYWdlTWFyZ2luQm94OiBjbG9zZXN0LnBhZ2UubWFyZ2luQm94LFxuICAgICAgZnJhbWVDbGllbnQsXG4gICAgICBzY3JvbGxTaXplLFxuICAgICAgc2hvdWxkQ2xpcFN1YmplY3Q6IGNsb3Nlc3Quc2hvdWxkQ2xpcFN1YmplY3QsXG4gICAgICBzY3JvbGw6IHtcbiAgICAgICAgaW5pdGlhbDogY2xvc2VzdC5zY3JvbGwsXG4gICAgICAgIGN1cnJlbnQ6IGNsb3Nlc3Quc2Nyb2xsLFxuICAgICAgICBtYXg6IG1heFNjcm9sbCxcbiAgICAgICAgZGlmZjoge1xuICAgICAgICAgIHZhbHVlOiBvcmlnaW4sXG4gICAgICAgICAgZGlzcGxhY2VtZW50OiBvcmlnaW5cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH0pKCk7XG5cbiAgY29uc3QgYXhpcyA9IGRpcmVjdGlvbiA9PT0gJ3ZlcnRpY2FsJyA/IHZlcnRpY2FsIDogaG9yaXpvbnRhbDtcbiAgY29uc3Qgc3ViamVjdCA9IGdldFN1YmplY3Qoe1xuICAgIHBhZ2UsXG4gICAgd2l0aFBsYWNlaG9sZGVyOiBudWxsLFxuICAgIGF4aXMsXG4gICAgZnJhbWVcbiAgfSk7XG4gIGNvbnN0IGRpbWVuc2lvbiA9IHtcbiAgICBkZXNjcmlwdG9yLFxuICAgIGlzQ29tYmluZUVuYWJsZWQsXG4gICAgaXNGaXhlZE9uUGFnZSxcbiAgICBheGlzLFxuICAgIGlzRW5hYmxlZCxcbiAgICBjbGllbnQsXG4gICAgcGFnZSxcbiAgICBmcmFtZSxcbiAgICBzdWJqZWN0XG4gIH07XG4gIHJldHVybiBkaW1lbnNpb247XG59KTtcblxuY29uc3QgZ2V0Q2xpZW50ID0gKHRhcmdldFJlZiwgY2xvc2VzdFNjcm9sbGFibGUpID0+IHtcbiAgY29uc3QgYmFzZSA9IGNzc0JveE1vZGVsLmdldEJveCh0YXJnZXRSZWYpO1xuXG4gIGlmICghY2xvc2VzdFNjcm9sbGFibGUpIHtcbiAgICByZXR1cm4gYmFzZTtcbiAgfVxuXG4gIGlmICh0YXJnZXRSZWYgIT09IGNsb3Nlc3RTY3JvbGxhYmxlKSB7XG4gICAgcmV0dXJuIGJhc2U7XG4gIH1cblxuICBjb25zdCB0b3AgPSBiYXNlLnBhZGRpbmdCb3gudG9wIC0gY2xvc2VzdFNjcm9sbGFibGUuc2Nyb2xsVG9wO1xuICBjb25zdCBsZWZ0ID0gYmFzZS5wYWRkaW5nQm94LmxlZnQgLSBjbG9zZXN0U2Nyb2xsYWJsZS5zY3JvbGxMZWZ0O1xuICBjb25zdCBib3R0b20gPSB0b3AgKyBjbG9zZXN0U2Nyb2xsYWJsZS5zY3JvbGxIZWlnaHQ7XG4gIGNvbnN0IHJpZ2h0ID0gbGVmdCArIGNsb3Nlc3RTY3JvbGxhYmxlLnNjcm9sbFdpZHRoO1xuICBjb25zdCBwYWRkaW5nQm94ID0ge1xuICAgIHRvcCxcbiAgICByaWdodCxcbiAgICBib3R0b20sXG4gICAgbGVmdFxuICB9O1xuICBjb25zdCBib3JkZXJCb3ggPSBjc3NCb3hNb2RlbC5leHBhbmQocGFkZGluZ0JveCwgYmFzZS5ib3JkZXIpO1xuICBjb25zdCBjbGllbnQgPSBjc3NCb3hNb2RlbC5jcmVhdGVCb3goe1xuICAgIGJvcmRlckJveCxcbiAgICBtYXJnaW46IGJhc2UubWFyZ2luLFxuICAgIGJvcmRlcjogYmFzZS5ib3JkZXIsXG4gICAgcGFkZGluZzogYmFzZS5wYWRkaW5nXG4gIH0pO1xuICByZXR1cm4gY2xpZW50O1xufTtcblxudmFyIGdldERpbWVuc2lvbiA9IChfcmVmID0+IHtcbiAgbGV0IHtcbiAgICByZWYsXG4gICAgZGVzY3JpcHRvcixcbiAgICBlbnYsXG4gICAgd2luZG93U2Nyb2xsLFxuICAgIGRpcmVjdGlvbixcbiAgICBpc0Ryb3BEaXNhYmxlZCxcbiAgICBpc0NvbWJpbmVFbmFibGVkLFxuICAgIHNob3VsZENsaXBTdWJqZWN0XG4gIH0gPSBfcmVmO1xuICBjb25zdCBjbG9zZXN0U2Nyb2xsYWJsZSA9IGVudi5jbG9zZXN0U2Nyb2xsYWJsZTtcbiAgY29uc3QgY2xpZW50ID0gZ2V0Q2xpZW50KHJlZiwgY2xvc2VzdFNjcm9sbGFibGUpO1xuICBjb25zdCBwYWdlID0gY3NzQm94TW9kZWwud2l0aFNjcm9sbChjbGllbnQsIHdpbmRvd1Njcm9sbCk7XG5cbiAgY29uc3QgY2xvc2VzdCA9ICgoKSA9PiB7XG4gICAgaWYgKCFjbG9zZXN0U2Nyb2xsYWJsZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgZnJhbWVDbGllbnQgPSBjc3NCb3hNb2RlbC5nZXRCb3goY2xvc2VzdFNjcm9sbGFibGUpO1xuICAgIGNvbnN0IHNjcm9sbFNpemUgPSB7XG4gICAgICBzY3JvbGxIZWlnaHQ6IGNsb3Nlc3RTY3JvbGxhYmxlLnNjcm9sbEhlaWdodCxcbiAgICAgIHNjcm9sbFdpZHRoOiBjbG9zZXN0U2Nyb2xsYWJsZS5zY3JvbGxXaWR0aFxuICAgIH07XG4gICAgcmV0dXJuIHtcbiAgICAgIGNsaWVudDogZnJhbWVDbGllbnQsXG4gICAgICBwYWdlOiBjc3NCb3hNb2RlbC53aXRoU2Nyb2xsKGZyYW1lQ2xpZW50LCB3aW5kb3dTY3JvbGwpLFxuICAgICAgc2Nyb2xsOiBnZXRTY3JvbGwoY2xvc2VzdFNjcm9sbGFibGUpLFxuICAgICAgc2Nyb2xsU2l6ZSxcbiAgICAgIHNob3VsZENsaXBTdWJqZWN0XG4gICAgfTtcbiAgfSkoKTtcblxuICBjb25zdCBkaW1lbnNpb24gPSBnZXREcm9wcGFibGVEaW1lbnNpb24oe1xuICAgIGRlc2NyaXB0b3IsXG4gICAgaXNFbmFibGVkOiAhaXNEcm9wRGlzYWJsZWQsXG4gICAgaXNDb21iaW5lRW5hYmxlZCxcbiAgICBpc0ZpeGVkT25QYWdlOiBlbnYuaXNGaXhlZE9uUGFnZSxcbiAgICBkaXJlY3Rpb24sXG4gICAgY2xpZW50LFxuICAgIHBhZ2UsXG4gICAgY2xvc2VzdFxuICB9KTtcbiAgcmV0dXJuIGRpbWVuc2lvbjtcbn0pO1xuXG5jb25zdCBpbW1lZGlhdGUgPSB7XG4gIHBhc3NpdmU6IGZhbHNlXG59O1xuY29uc3QgZGVsYXllZCA9IHtcbiAgcGFzc2l2ZTogdHJ1ZVxufTtcbnZhciBnZXRMaXN0ZW5lck9wdGlvbnMgPSAob3B0aW9ucyA9PiBvcHRpb25zLnNob3VsZFB1Ymxpc2hJbW1lZGlhdGVseSA/IGltbWVkaWF0ZSA6IGRlbGF5ZWQpO1xuXG5jb25zdCBnZXRDbG9zZXN0U2Nyb2xsYWJsZUZyb21EcmFnID0gZHJhZ2dpbmcgPT4gZHJhZ2dpbmcgJiYgZHJhZ2dpbmcuZW52LmNsb3Nlc3RTY3JvbGxhYmxlIHx8IG51bGw7XG5cbmZ1bmN0aW9uIHVzZURyb3BwYWJsZVB1Ymxpc2hlcihhcmdzKSB7XG4gIGNvbnN0IHdoaWxlRHJhZ2dpbmdSZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gIGNvbnN0IGFwcENvbnRleHQgPSB1c2VSZXF1aXJlZENvbnRleHQoQXBwQ29udGV4dCk7XG4gIGNvbnN0IHVuaXF1ZUlkID0gdXNlVW5pcXVlSWQoJ2Ryb3BwYWJsZScpO1xuICBjb25zdCB7XG4gICAgcmVnaXN0cnksXG4gICAgbWFyc2hhbFxuICB9ID0gYXBwQ29udGV4dDtcbiAgY29uc3QgcHJldmlvdXNSZWYgPSB1c2VQcmV2aW91cyhhcmdzKTtcbiAgY29uc3QgZGVzY3JpcHRvciA9IHVzZU1lbW9PbmUudXNlTWVtbygoKSA9PiAoe1xuICAgIGlkOiBhcmdzLmRyb3BwYWJsZUlkLFxuICAgIHR5cGU6IGFyZ3MudHlwZSxcbiAgICBtb2RlOiBhcmdzLm1vZGVcbiAgfSksIFthcmdzLmRyb3BwYWJsZUlkLCBhcmdzLm1vZGUsIGFyZ3MudHlwZV0pO1xuICBjb25zdCBwdWJsaXNoZWREZXNjcmlwdG9yUmVmID0gUmVhY3QudXNlUmVmKGRlc2NyaXB0b3IpO1xuICBjb25zdCBtZW1vaXplZFVwZGF0ZVNjcm9sbCA9IHVzZU1lbW9PbmUudXNlTWVtbygoKSA9PiBtZW1vaXplT25lX19kZWZhdWx0W1wiZGVmYXVsdFwiXSgoeCwgeSkgPT4ge1xuICAgICF3aGlsZURyYWdnaW5nUmVmLmN1cnJlbnQgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBpbnZhcmlhbnQoZmFsc2UsICdDYW4gb25seSB1cGRhdGUgc2Nyb2xsIHdoZW4gZHJhZ2dpbmcnKSA6IGludmFyaWFudChmYWxzZSkgOiB2b2lkIDA7XG4gICAgY29uc3Qgc2Nyb2xsID0ge1xuICAgICAgeCxcbiAgICAgIHlcbiAgICB9O1xuICAgIG1hcnNoYWwudXBkYXRlRHJvcHBhYmxlU2Nyb2xsKGRlc2NyaXB0b3IuaWQsIHNjcm9sbCk7XG4gIH0pLCBbZGVzY3JpcHRvci5pZCwgbWFyc2hhbF0pO1xuICBjb25zdCBnZXRDbG9zZXN0U2Nyb2xsID0gdXNlTWVtb09uZS51c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgY29uc3QgZHJhZ2dpbmcgPSB3aGlsZURyYWdnaW5nUmVmLmN1cnJlbnQ7XG5cbiAgICBpZiAoIWRyYWdnaW5nIHx8ICFkcmFnZ2luZy5lbnYuY2xvc2VzdFNjcm9sbGFibGUpIHtcbiAgICAgIHJldHVybiBvcmlnaW47XG4gICAgfVxuXG4gICAgcmV0dXJuIGdldFNjcm9sbChkcmFnZ2luZy5lbnYuY2xvc2VzdFNjcm9sbGFibGUpO1xuICB9LCBbXSk7XG4gIGNvbnN0IHVwZGF0ZVNjcm9sbCA9IHVzZU1lbW9PbmUudXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGNvbnN0IHNjcm9sbCA9IGdldENsb3Nlc3RTY3JvbGwoKTtcbiAgICBtZW1vaXplZFVwZGF0ZVNjcm9sbChzY3JvbGwueCwgc2Nyb2xsLnkpO1xuICB9LCBbZ2V0Q2xvc2VzdFNjcm9sbCwgbWVtb2l6ZWRVcGRhdGVTY3JvbGxdKTtcbiAgY29uc3Qgc2NoZWR1bGVTY3JvbGxVcGRhdGUgPSB1c2VNZW1vT25lLnVzZU1lbW8oKCkgPT4gcmFmU2NoZF9fZGVmYXVsdFtcImRlZmF1bHRcIl0odXBkYXRlU2Nyb2xsKSwgW3VwZGF0ZVNjcm9sbF0pO1xuICBjb25zdCBvbkNsb3Nlc3RTY3JvbGwgPSB1c2VNZW1vT25lLnVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBjb25zdCBkcmFnZ2luZyA9IHdoaWxlRHJhZ2dpbmdSZWYuY3VycmVudDtcbiAgICBjb25zdCBjbG9zZXN0ID0gZ2V0Q2xvc2VzdFNjcm9sbGFibGVGcm9tRHJhZyhkcmFnZ2luZyk7XG4gICAgIShkcmFnZ2luZyAmJiBjbG9zZXN0KSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IGludmFyaWFudChmYWxzZSwgJ0NvdWxkIG5vdCBmaW5kIHNjcm9sbCBvcHRpb25zIHdoaWxlIHNjcm9sbGluZycpIDogaW52YXJpYW50KGZhbHNlKSA6IHZvaWQgMDtcbiAgICBjb25zdCBvcHRpb25zID0gZHJhZ2dpbmcuc2Nyb2xsT3B0aW9ucztcblxuICAgIGlmIChvcHRpb25zLnNob3VsZFB1Ymxpc2hJbW1lZGlhdGVseSkge1xuICAgICAgdXBkYXRlU2Nyb2xsKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc2NoZWR1bGVTY3JvbGxVcGRhdGUoKTtcbiAgfSwgW3NjaGVkdWxlU2Nyb2xsVXBkYXRlLCB1cGRhdGVTY3JvbGxdKTtcbiAgY29uc3QgZ2V0RGltZW5zaW9uQW5kV2F0Y2hTY3JvbGwgPSB1c2VNZW1vT25lLnVzZUNhbGxiYWNrKCh3aW5kb3dTY3JvbGwsIG9wdGlvbnMpID0+IHtcbiAgICAhIXdoaWxlRHJhZ2dpbmdSZWYuY3VycmVudCA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IGludmFyaWFudChmYWxzZSwgJ0Nhbm5vdCBjb2xsZWN0IGEgZHJvcHBhYmxlIHdoaWxlIGEgZHJhZyBpcyBvY2N1cnJpbmcnKSA6IGludmFyaWFudChmYWxzZSkgOiB2b2lkIDA7XG4gICAgY29uc3QgcHJldmlvdXMgPSBwcmV2aW91c1JlZi5jdXJyZW50O1xuICAgIGNvbnN0IHJlZiA9IHByZXZpb3VzLmdldERyb3BwYWJsZVJlZigpO1xuICAgICFyZWYgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBpbnZhcmlhbnQoZmFsc2UsICdDYW5ub3QgY29sbGVjdCB3aXRob3V0IGEgZHJvcHBhYmxlIHJlZicpIDogaW52YXJpYW50KGZhbHNlKSA6IHZvaWQgMDtcbiAgICBjb25zdCBlbnYgPSBnZXRFbnYocmVmKTtcbiAgICBjb25zdCBkcmFnZ2luZyA9IHtcbiAgICAgIHJlZixcbiAgICAgIGRlc2NyaXB0b3IsXG4gICAgICBlbnYsXG4gICAgICBzY3JvbGxPcHRpb25zOiBvcHRpb25zXG4gICAgfTtcbiAgICB3aGlsZURyYWdnaW5nUmVmLmN1cnJlbnQgPSBkcmFnZ2luZztcbiAgICBjb25zdCBkaW1lbnNpb24gPSBnZXREaW1lbnNpb24oe1xuICAgICAgcmVmLFxuICAgICAgZGVzY3JpcHRvcixcbiAgICAgIGVudixcbiAgICAgIHdpbmRvd1Njcm9sbCxcbiAgICAgIGRpcmVjdGlvbjogcHJldmlvdXMuZGlyZWN0aW9uLFxuICAgICAgaXNEcm9wRGlzYWJsZWQ6IHByZXZpb3VzLmlzRHJvcERpc2FibGVkLFxuICAgICAgaXNDb21iaW5lRW5hYmxlZDogcHJldmlvdXMuaXNDb21iaW5lRW5hYmxlZCxcbiAgICAgIHNob3VsZENsaXBTdWJqZWN0OiAhcHJldmlvdXMuaWdub3JlQ29udGFpbmVyQ2xpcHBpbmdcbiAgICB9KTtcbiAgICBjb25zdCBzY3JvbGxhYmxlID0gZW52LmNsb3Nlc3RTY3JvbGxhYmxlO1xuXG4gICAgaWYgKHNjcm9sbGFibGUpIHtcbiAgICAgIHNjcm9sbGFibGUuc2V0QXR0cmlidXRlKHNjcm9sbENvbnRhaW5lci5jb250ZXh0SWQsIGFwcENvbnRleHQuY29udGV4dElkKTtcbiAgICAgIHNjcm9sbGFibGUuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgb25DbG9zZXN0U2Nyb2xsLCBnZXRMaXN0ZW5lck9wdGlvbnMoZHJhZ2dpbmcuc2Nyb2xsT3B0aW9ucykpO1xuXG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICBjaGVja0Zvck5lc3RlZFNjcm9sbENvbnRhaW5lcnMoc2Nyb2xsYWJsZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGRpbWVuc2lvbjtcbiAgfSwgW2FwcENvbnRleHQuY29udGV4dElkLCBkZXNjcmlwdG9yLCBvbkNsb3Nlc3RTY3JvbGwsIHByZXZpb3VzUmVmXSk7XG4gIGNvbnN0IGdldFNjcm9sbFdoaWxlRHJhZ2dpbmcgPSB1c2VNZW1vT25lLnVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBjb25zdCBkcmFnZ2luZyA9IHdoaWxlRHJhZ2dpbmdSZWYuY3VycmVudDtcbiAgICBjb25zdCBjbG9zZXN0ID0gZ2V0Q2xvc2VzdFNjcm9sbGFibGVGcm9tRHJhZyhkcmFnZ2luZyk7XG4gICAgIShkcmFnZ2luZyAmJiBjbG9zZXN0KSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IGludmFyaWFudChmYWxzZSwgJ0NhbiBvbmx5IHJlY29sbGVjdCBEcm9wcGFibGUgY2xpZW50IGZvciBEcm9wcGFibGVzIHRoYXQgaGF2ZSBhIHNjcm9sbCBjb250YWluZXInKSA6IGludmFyaWFudChmYWxzZSkgOiB2b2lkIDA7XG4gICAgcmV0dXJuIGdldFNjcm9sbChjbG9zZXN0KTtcbiAgfSwgW10pO1xuICBjb25zdCBkcmFnU3RvcHBlZCA9IHVzZU1lbW9PbmUudXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGNvbnN0IGRyYWdnaW5nID0gd2hpbGVEcmFnZ2luZ1JlZi5jdXJyZW50O1xuICAgICFkcmFnZ2luZyA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IGludmFyaWFudChmYWxzZSwgJ0Nhbm5vdCBzdG9wIGRyYWcgd2hlbiBubyBhY3RpdmUgZHJhZycpIDogaW52YXJpYW50KGZhbHNlKSA6IHZvaWQgMDtcbiAgICBjb25zdCBjbG9zZXN0ID0gZ2V0Q2xvc2VzdFNjcm9sbGFibGVGcm9tRHJhZyhkcmFnZ2luZyk7XG4gICAgd2hpbGVEcmFnZ2luZ1JlZi5jdXJyZW50ID0gbnVsbDtcblxuICAgIGlmICghY2xvc2VzdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHNjaGVkdWxlU2Nyb2xsVXBkYXRlLmNhbmNlbCgpO1xuICAgIGNsb3Nlc3QucmVtb3ZlQXR0cmlidXRlKHNjcm9sbENvbnRhaW5lci5jb250ZXh0SWQpO1xuICAgIGNsb3Nlc3QucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgb25DbG9zZXN0U2Nyb2xsLCBnZXRMaXN0ZW5lck9wdGlvbnMoZHJhZ2dpbmcuc2Nyb2xsT3B0aW9ucykpO1xuICB9LCBbb25DbG9zZXN0U2Nyb2xsLCBzY2hlZHVsZVNjcm9sbFVwZGF0ZV0pO1xuICBjb25zdCBzY3JvbGwgPSB1c2VNZW1vT25lLnVzZUNhbGxiYWNrKGNoYW5nZSA9PiB7XG4gICAgY29uc3QgZHJhZ2dpbmcgPSB3aGlsZURyYWdnaW5nUmVmLmN1cnJlbnQ7XG4gICAgIWRyYWdnaW5nID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gaW52YXJpYW50KGZhbHNlLCAnQ2Fubm90IHNjcm9sbCB3aGVuIHRoZXJlIGlzIG5vIGRyYWcnKSA6IGludmFyaWFudChmYWxzZSkgOiB2b2lkIDA7XG4gICAgY29uc3QgY2xvc2VzdCA9IGdldENsb3Nlc3RTY3JvbGxhYmxlRnJvbURyYWcoZHJhZ2dpbmcpO1xuICAgICFjbG9zZXN0ID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gaW52YXJpYW50KGZhbHNlLCAnQ2Fubm90IHNjcm9sbCBhIGRyb3BwYWJsZSB3aXRoIG5vIGNsb3Nlc3Qgc2Nyb2xsYWJsZScpIDogaW52YXJpYW50KGZhbHNlKSA6IHZvaWQgMDtcbiAgICBjbG9zZXN0LnNjcm9sbFRvcCArPSBjaGFuZ2UueTtcbiAgICBjbG9zZXN0LnNjcm9sbExlZnQgKz0gY2hhbmdlLng7XG4gIH0sIFtdKTtcbiAgY29uc3QgY2FsbGJhY2tzID0gdXNlTWVtb09uZS51c2VNZW1vKCgpID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgZ2V0RGltZW5zaW9uQW5kV2F0Y2hTY3JvbGwsXG4gICAgICBnZXRTY3JvbGxXaGlsZURyYWdnaW5nLFxuICAgICAgZHJhZ1N0b3BwZWQsXG4gICAgICBzY3JvbGxcbiAgICB9O1xuICB9LCBbZHJhZ1N0b3BwZWQsIGdldERpbWVuc2lvbkFuZFdhdGNoU2Nyb2xsLCBnZXRTY3JvbGxXaGlsZURyYWdnaW5nLCBzY3JvbGxdKTtcbiAgY29uc3QgZW50cnkgPSB1c2VNZW1vT25lLnVzZU1lbW8oKCkgPT4gKHtcbiAgICB1bmlxdWVJZCxcbiAgICBkZXNjcmlwdG9yLFxuICAgIGNhbGxiYWNrc1xuICB9KSwgW2NhbGxiYWNrcywgZGVzY3JpcHRvciwgdW5pcXVlSWRdKTtcbiAgdXNlTGF5b3V0RWZmZWN0KCgpID0+IHtcbiAgICBwdWJsaXNoZWREZXNjcmlwdG9yUmVmLmN1cnJlbnQgPSBlbnRyeS5kZXNjcmlwdG9yO1xuICAgIHJlZ2lzdHJ5LmRyb3BwYWJsZS5yZWdpc3RlcihlbnRyeSk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGlmICh3aGlsZURyYWdnaW5nUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gd2FybmluZygnVW5zdXBwb3J0ZWQ6IGNoYW5naW5nIHRoZSBkcm9wcGFibGVJZCBvciB0eXBlIG9mIGEgRHJvcHBhYmxlIGR1cmluZyBhIGRyYWcnKSA6IHZvaWQgMDtcbiAgICAgICAgZHJhZ1N0b3BwZWQoKTtcbiAgICAgIH1cblxuICAgICAgcmVnaXN0cnkuZHJvcHBhYmxlLnVucmVnaXN0ZXIoZW50cnkpO1xuICAgIH07XG4gIH0sIFtjYWxsYmFja3MsIGRlc2NyaXB0b3IsIGRyYWdTdG9wcGVkLCBlbnRyeSwgbWFyc2hhbCwgcmVnaXN0cnkuZHJvcHBhYmxlXSk7XG4gIHVzZUxheW91dEVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCF3aGlsZURyYWdnaW5nUmVmLmN1cnJlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBtYXJzaGFsLnVwZGF0ZURyb3BwYWJsZUlzRW5hYmxlZChwdWJsaXNoZWREZXNjcmlwdG9yUmVmLmN1cnJlbnQuaWQsICFhcmdzLmlzRHJvcERpc2FibGVkKTtcbiAgfSwgW2FyZ3MuaXNEcm9wRGlzYWJsZWQsIG1hcnNoYWxdKTtcbiAgdXNlTGF5b3V0RWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIXdoaWxlRHJhZ2dpbmdSZWYuY3VycmVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG1hcnNoYWwudXBkYXRlRHJvcHBhYmxlSXNDb21iaW5lRW5hYmxlZChwdWJsaXNoZWREZXNjcmlwdG9yUmVmLmN1cnJlbnQuaWQsIGFyZ3MuaXNDb21iaW5lRW5hYmxlZCk7XG4gIH0sIFthcmdzLmlzQ29tYmluZUVuYWJsZWQsIG1hcnNoYWxdKTtcbn1cblxuZnVuY3Rpb24gbm9vcCgpIHt9XG5cbmNvbnN0IGVtcHR5ID0ge1xuICB3aWR0aDogMCxcbiAgaGVpZ2h0OiAwLFxuICBtYXJnaW46IG5vU3BhY2luZ1xufTtcblxuY29uc3QgZ2V0U2l6ZSA9IF9yZWYgPT4ge1xuICBsZXQge1xuICAgIGlzQW5pbWF0aW5nT3Blbk9uTW91bnQsXG4gICAgcGxhY2Vob2xkZXIsXG4gICAgYW5pbWF0ZVxuICB9ID0gX3JlZjtcblxuICBpZiAoaXNBbmltYXRpbmdPcGVuT25Nb3VudCkge1xuICAgIHJldHVybiBlbXB0eTtcbiAgfVxuXG4gIGlmIChhbmltYXRlID09PSAnY2xvc2UnKSB7XG4gICAgcmV0dXJuIGVtcHR5O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBoZWlnaHQ6IHBsYWNlaG9sZGVyLmNsaWVudC5ib3JkZXJCb3guaGVpZ2h0LFxuICAgIHdpZHRoOiBwbGFjZWhvbGRlci5jbGllbnQuYm9yZGVyQm94LndpZHRoLFxuICAgIG1hcmdpbjogcGxhY2Vob2xkZXIuY2xpZW50Lm1hcmdpblxuICB9O1xufTtcblxuY29uc3QgZ2V0U3R5bGUgPSBfcmVmMiA9PiB7XG4gIGxldCB7XG4gICAgaXNBbmltYXRpbmdPcGVuT25Nb3VudCxcbiAgICBwbGFjZWhvbGRlcixcbiAgICBhbmltYXRlXG4gIH0gPSBfcmVmMjtcbiAgY29uc3Qgc2l6ZSA9IGdldFNpemUoe1xuICAgIGlzQW5pbWF0aW5nT3Blbk9uTW91bnQsXG4gICAgcGxhY2Vob2xkZXIsXG4gICAgYW5pbWF0ZVxuICB9KTtcbiAgcmV0dXJuIHtcbiAgICBkaXNwbGF5OiBwbGFjZWhvbGRlci5kaXNwbGF5LFxuICAgIGJveFNpemluZzogJ2JvcmRlci1ib3gnLFxuICAgIHdpZHRoOiBzaXplLndpZHRoLFxuICAgIGhlaWdodDogc2l6ZS5oZWlnaHQsXG4gICAgbWFyZ2luVG9wOiBzaXplLm1hcmdpbi50b3AsXG4gICAgbWFyZ2luUmlnaHQ6IHNpemUubWFyZ2luLnJpZ2h0LFxuICAgIG1hcmdpbkJvdHRvbTogc2l6ZS5tYXJnaW4uYm90dG9tLFxuICAgIG1hcmdpbkxlZnQ6IHNpemUubWFyZ2luLmxlZnQsXG4gICAgZmxleFNocmluazogJzAnLFxuICAgIGZsZXhHcm93OiAnMCcsXG4gICAgcG9pbnRlckV2ZW50czogJ25vbmUnLFxuICAgIHRyYW5zaXRpb246IGFuaW1hdGUgIT09ICdub25lJyA/IHRyYW5zaXRpb25zLnBsYWNlaG9sZGVyIDogbnVsbFxuICB9O1xufTtcblxuY29uc3QgUGxhY2Vob2xkZXIgPSBwcm9wcyA9PiB7XG4gIGNvbnN0IGFuaW1hdGVPcGVuVGltZXJSZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gIGNvbnN0IHRyeUNsZWFyQW5pbWF0ZU9wZW5UaW1lciA9IHVzZU1lbW9PbmUudXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGlmICghYW5pbWF0ZU9wZW5UaW1lclJlZi5jdXJyZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY2xlYXJUaW1lb3V0KGFuaW1hdGVPcGVuVGltZXJSZWYuY3VycmVudCk7XG4gICAgYW5pbWF0ZU9wZW5UaW1lclJlZi5jdXJyZW50ID0gbnVsbDtcbiAgfSwgW10pO1xuICBjb25zdCB7XG4gICAgYW5pbWF0ZSxcbiAgICBvblRyYW5zaXRpb25FbmQsXG4gICAgb25DbG9zZSxcbiAgICBjb250ZXh0SWRcbiAgfSA9IHByb3BzO1xuICBjb25zdCBbaXNBbmltYXRpbmdPcGVuT25Nb3VudCwgc2V0SXNBbmltYXRpbmdPcGVuT25Nb3VudF0gPSBSZWFjdC51c2VTdGF0ZShwcm9wcy5hbmltYXRlID09PSAnb3BlbicpO1xuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghaXNBbmltYXRpbmdPcGVuT25Nb3VudCkge1xuICAgICAgcmV0dXJuIG5vb3A7XG4gICAgfVxuXG4gICAgaWYgKGFuaW1hdGUgIT09ICdvcGVuJykge1xuICAgICAgdHJ5Q2xlYXJBbmltYXRlT3BlblRpbWVyKCk7XG4gICAgICBzZXRJc0FuaW1hdGluZ09wZW5Pbk1vdW50KGZhbHNlKTtcbiAgICAgIHJldHVybiBub29wO1xuICAgIH1cblxuICAgIGlmIChhbmltYXRlT3BlblRpbWVyUmVmLmN1cnJlbnQpIHtcbiAgICAgIHJldHVybiBub29wO1xuICAgIH1cblxuICAgIGFuaW1hdGVPcGVuVGltZXJSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgYW5pbWF0ZU9wZW5UaW1lclJlZi5jdXJyZW50ID0gbnVsbDtcbiAgICAgIHNldElzQW5pbWF0aW5nT3Blbk9uTW91bnQoZmFsc2UpO1xuICAgIH0pO1xuICAgIHJldHVybiB0cnlDbGVhckFuaW1hdGVPcGVuVGltZXI7XG4gIH0sIFthbmltYXRlLCBpc0FuaW1hdGluZ09wZW5Pbk1vdW50LCB0cnlDbGVhckFuaW1hdGVPcGVuVGltZXJdKTtcbiAgY29uc3Qgb25TaXplQ2hhbmdlRW5kID0gdXNlTWVtb09uZS51c2VDYWxsYmFjayhldmVudCA9PiB7XG4gICAgaWYgKGV2ZW50LnByb3BlcnR5TmFtZSAhPT0gJ2hlaWdodCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBvblRyYW5zaXRpb25FbmQoKTtcblxuICAgIGlmIChhbmltYXRlID09PSAnY2xvc2UnKSB7XG4gICAgICBvbkNsb3NlKCk7XG4gICAgfVxuICB9LCBbYW5pbWF0ZSwgb25DbG9zZSwgb25UcmFuc2l0aW9uRW5kXSk7XG4gIGNvbnN0IHN0eWxlID0gZ2V0U3R5bGUoe1xuICAgIGlzQW5pbWF0aW5nT3Blbk9uTW91bnQsXG4gICAgYW5pbWF0ZTogcHJvcHMuYW5pbWF0ZSxcbiAgICBwbGFjZWhvbGRlcjogcHJvcHMucGxhY2Vob2xkZXJcbiAgfSk7XG4gIHJldHVybiBSZWFjdF9fZGVmYXVsdFtcImRlZmF1bHRcIl0uY3JlYXRlRWxlbWVudChwcm9wcy5wbGFjZWhvbGRlci50YWdOYW1lLCB7XG4gICAgc3R5bGUsXG4gICAgJ2RhdGEtcmZkLXBsYWNlaG9sZGVyLWNvbnRleHQtaWQnOiBjb250ZXh0SWQsXG4gICAgb25UcmFuc2l0aW9uRW5kOiBvblNpemVDaGFuZ2VFbmQsXG4gICAgcmVmOiBwcm9wcy5pbm5lclJlZlxuICB9KTtcbn07XG5cbnZhciBQbGFjZWhvbGRlciQxID0gUmVhY3RfX2RlZmF1bHRbXCJkZWZhdWx0XCJdLm1lbW8oUGxhY2Vob2xkZXIpO1xuXG5mdW5jdGlvbiBpc0Jvb2xlYW4odmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nO1xufVxuXG5mdW5jdGlvbiBydW5DaGVja3MoYXJncywgY2hlY2tzKSB7XG4gIGNoZWNrcy5mb3JFYWNoKGNoZWNrID0+IGNoZWNrKGFyZ3MpKTtcbn1cblxuY29uc3Qgc2hhcmVkID0gW2Z1bmN0aW9uIHJlcXVpcmVkKF9yZWYpIHtcbiAgbGV0IHtcbiAgICBwcm9wc1xuICB9ID0gX3JlZjtcbiAgIXByb3BzLmRyb3BwYWJsZUlkID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gaW52YXJpYW50KGZhbHNlLCAnQSBEcm9wcGFibGUgcmVxdWlyZXMgYSBkcm9wcGFibGVJZCBwcm9wJykgOiBpbnZhcmlhbnQoZmFsc2UpIDogdm9pZCAwO1xuICAhKHR5cGVvZiBwcm9wcy5kcm9wcGFibGVJZCA9PT0gJ3N0cmluZycpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gaW52YXJpYW50KGZhbHNlLCBgQSBEcm9wcGFibGUgcmVxdWlyZXMgYSBbc3RyaW5nXSBkcm9wcGFibGVJZC4gUHJvdmlkZWQ6IFske3R5cGVvZiBwcm9wcy5kcm9wcGFibGVJZH1dYCkgOiBpbnZhcmlhbnQoZmFsc2UpIDogdm9pZCAwO1xufSwgZnVuY3Rpb24gYm9vbGVhbihfcmVmMikge1xuICBsZXQge1xuICAgIHByb3BzXG4gIH0gPSBfcmVmMjtcbiAgIWlzQm9vbGVhbihwcm9wcy5pc0Ryb3BEaXNhYmxlZCkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBpbnZhcmlhbnQoZmFsc2UsICdpc0Ryb3BEaXNhYmxlZCBtdXN0IGJlIGEgYm9vbGVhbicpIDogaW52YXJpYW50KGZhbHNlKSA6IHZvaWQgMDtcbiAgIWlzQm9vbGVhbihwcm9wcy5pc0NvbWJpbmVFbmFibGVkKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IGludmFyaWFudChmYWxzZSwgJ2lzQ29tYmluZUVuYWJsZWQgbXVzdCBiZSBhIGJvb2xlYW4nKSA6IGludmFyaWFudChmYWxzZSkgOiB2b2lkIDA7XG4gICFpc0Jvb2xlYW4ocHJvcHMuaWdub3JlQ29udGFpbmVyQ2xpcHBpbmcpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gaW52YXJpYW50KGZhbHNlLCAnaWdub3JlQ29udGFpbmVyQ2xpcHBpbmcgbXVzdCBiZSBhIGJvb2xlYW4nKSA6IGludmFyaWFudChmYWxzZSkgOiB2b2lkIDA7XG59LCBmdW5jdGlvbiByZWYoX3JlZjMpIHtcbiAgbGV0IHtcbiAgICBnZXREcm9wcGFibGVSZWZcbiAgfSA9IF9yZWYzO1xuICBjaGVja0lzVmFsaWRJbm5lclJlZihnZXREcm9wcGFibGVSZWYoKSk7XG59XTtcbmNvbnN0IHN0YW5kYXJkID0gW2Z1bmN0aW9uIHBsYWNlaG9sZGVyKF9yZWY0KSB7XG4gIGxldCB7XG4gICAgcHJvcHMsXG4gICAgZ2V0UGxhY2Vob2xkZXJSZWZcbiAgfSA9IF9yZWY0O1xuXG4gIGlmICghcHJvcHMucGxhY2Vob2xkZXIpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCByZWYgPSBnZXRQbGFjZWhvbGRlclJlZigpO1xuXG4gIGlmIChyZWYpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB3YXJuaW5nKGBcbiAgICAgIERyb3BwYWJsZSBzZXR1cCBpc3N1ZSBbZHJvcHBhYmxlSWQ6IFwiJHtwcm9wcy5kcm9wcGFibGVJZH1cIl06XG4gICAgICBEcm9wcGFibGVQcm92aWRlZCA+IHBsYWNlaG9sZGVyIGNvdWxkIG5vdCBiZSBmb3VuZC5cblxuICAgICAgUGxlYXNlIGJlIHN1cmUgdG8gYWRkIHRoZSB7cHJvdmlkZWQucGxhY2Vob2xkZXJ9IFJlYWN0IE5vZGUgYXMgYSBjaGlsZCBvZiB5b3VyIERyb3BwYWJsZS5cbiAgICAgIE1vcmUgaW5mb3JtYXRpb246IGh0dHBzOi8vZ2l0aHViLmNvbS9oZWxsby1wYW5nZWEvZG5kL2Jsb2IvbWFpbi9kb2NzL2FwaS9kcm9wcGFibGUubWRcbiAgICBgKSA6IHZvaWQgMDtcbn1dO1xuY29uc3QgdmlydHVhbCA9IFtmdW5jdGlvbiBoYXNDbG9uZShfcmVmNSkge1xuICBsZXQge1xuICAgIHByb3BzXG4gIH0gPSBfcmVmNTtcbiAgIXByb3BzLnJlbmRlckNsb25lID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gaW52YXJpYW50KGZhbHNlLCAnTXVzdCBwcm92aWRlIGEgY2xvbmUgcmVuZGVyIGZ1bmN0aW9uIChyZW5kZXJDbG9uZSkgZm9yIHZpcnR1YWwgbGlzdHMnKSA6IGludmFyaWFudChmYWxzZSkgOiB2b2lkIDA7XG59LCBmdW5jdGlvbiBoYXNOb1BsYWNlaG9sZGVyKF9yZWY2KSB7XG4gIGxldCB7XG4gICAgZ2V0UGxhY2Vob2xkZXJSZWZcbiAgfSA9IF9yZWY2O1xuICAhIWdldFBsYWNlaG9sZGVyUmVmKCkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBpbnZhcmlhbnQoZmFsc2UsICdFeHBlY3RlZCB2aXJ0dWFsIGxpc3QgdG8gbm90IGhhdmUgYSBwbGFjZWhvbGRlcicpIDogaW52YXJpYW50KGZhbHNlKSA6IHZvaWQgMDtcbn1dO1xuZnVuY3Rpb24gdXNlVmFsaWRhdGlvbihhcmdzKSB7XG4gIHVzZURldlNldHVwV2FybmluZygoKSA9PiB7XG4gICAgcnVuQ2hlY2tzKGFyZ3MsIHNoYXJlZCk7XG5cbiAgICBpZiAoYXJncy5wcm9wcy5tb2RlID09PSAnc3RhbmRhcmQnKSB7XG4gICAgICBydW5DaGVja3MoYXJncywgc3RhbmRhcmQpO1xuICAgIH1cblxuICAgIGlmIChhcmdzLnByb3BzLm1vZGUgPT09ICd2aXJ0dWFsJykge1xuICAgICAgcnVuQ2hlY2tzKGFyZ3MsIHZpcnR1YWwpO1xuICAgIH1cbiAgfSk7XG59XG5cbmNsYXNzIEFuaW1hdGVJbk91dCBleHRlbmRzIFJlYWN0X19kZWZhdWx0W1wiZGVmYXVsdFwiXS5QdXJlQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgaXNWaXNpYmxlOiBCb29sZWFuKHRoaXMucHJvcHMub24pLFxuICAgICAgZGF0YTogdGhpcy5wcm9wcy5vbixcbiAgICAgIGFuaW1hdGU6IHRoaXMucHJvcHMuc2hvdWxkQW5pbWF0ZSAmJiB0aGlzLnByb3BzLm9uID8gJ29wZW4nIDogJ25vbmUnXG4gICAgfTtcblxuICAgIHRoaXMub25DbG9zZSA9ICgpID0+IHtcbiAgICAgIGlmICh0aGlzLnN0YXRlLmFuaW1hdGUgIT09ICdjbG9zZScpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgaXNWaXNpYmxlOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfTtcbiAgfVxuXG4gIHN0YXRpYyBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMocHJvcHMsIHN0YXRlKSB7XG4gICAgaWYgKCFwcm9wcy5zaG91bGRBbmltYXRlKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBpc1Zpc2libGU6IEJvb2xlYW4ocHJvcHMub24pLFxuICAgICAgICBkYXRhOiBwcm9wcy5vbixcbiAgICAgICAgYW5pbWF0ZTogJ25vbmUnXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmIChwcm9wcy5vbikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaXNWaXNpYmxlOiB0cnVlLFxuICAgICAgICBkYXRhOiBwcm9wcy5vbixcbiAgICAgICAgYW5pbWF0ZTogJ29wZW4nXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmIChzdGF0ZS5pc1Zpc2libGUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlzVmlzaWJsZTogdHJ1ZSxcbiAgICAgICAgZGF0YTogc3RhdGUuZGF0YSxcbiAgICAgICAgYW5pbWF0ZTogJ2Nsb3NlJ1xuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgaXNWaXNpYmxlOiBmYWxzZSxcbiAgICAgIGFuaW1hdGU6ICdjbG9zZScsXG4gICAgICBkYXRhOiBudWxsXG4gICAgfTtcbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICBpZiAoIXRoaXMuc3RhdGUuaXNWaXNpYmxlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBwcm92aWRlZCA9IHtcbiAgICAgIG9uQ2xvc2U6IHRoaXMub25DbG9zZSxcbiAgICAgIGRhdGE6IHRoaXMuc3RhdGUuZGF0YSxcbiAgICAgIGFuaW1hdGU6IHRoaXMuc3RhdGUuYW5pbWF0ZVxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMucHJvcHMuY2hpbGRyZW4ocHJvdmlkZWQpO1xuICB9XG5cbn1cblxuY29uc3QgRHJvcHBhYmxlID0gcHJvcHMgPT4ge1xuICBjb25zdCBhcHBDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChBcHBDb250ZXh0KTtcbiAgIWFwcENvbnRleHQgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBpbnZhcmlhbnQoZmFsc2UsICdDb3VsZCBub3QgZmluZCBhcHAgY29udGV4dCcpIDogaW52YXJpYW50KGZhbHNlKSA6IHZvaWQgMDtcbiAgY29uc3Qge1xuICAgIGNvbnRleHRJZCxcbiAgICBpc01vdmVtZW50QWxsb3dlZFxuICB9ID0gYXBwQ29udGV4dDtcbiAgY29uc3QgZHJvcHBhYmxlUmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICBjb25zdCBwbGFjZWhvbGRlclJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgY29uc3Qge1xuICAgIGNoaWxkcmVuLFxuICAgIGRyb3BwYWJsZUlkLFxuICAgIHR5cGUsXG4gICAgbW9kZSxcbiAgICBkaXJlY3Rpb24sXG4gICAgaWdub3JlQ29udGFpbmVyQ2xpcHBpbmcsXG4gICAgaXNEcm9wRGlzYWJsZWQsXG4gICAgaXNDb21iaW5lRW5hYmxlZCxcbiAgICBzbmFwc2hvdCxcbiAgICB1c2VDbG9uZSxcbiAgICB1cGRhdGVWaWV3cG9ydE1heFNjcm9sbCxcbiAgICBnZXRDb250YWluZXJGb3JDbG9uZVxuICB9ID0gcHJvcHM7XG4gIGNvbnN0IGdldERyb3BwYWJsZVJlZiA9IHVzZU1lbW9PbmUudXNlQ2FsbGJhY2soKCkgPT4gZHJvcHBhYmxlUmVmLmN1cnJlbnQsIFtdKTtcbiAgY29uc3Qgc2V0RHJvcHBhYmxlUmVmID0gdXNlTWVtb09uZS51c2VDYWxsYmFjayhmdW5jdGlvbiAodmFsdWUpIHtcbiAgICBpZiAodmFsdWUgPT09IHZvaWQgMCkge1xuICAgICAgdmFsdWUgPSBudWxsO1xuICAgIH1cblxuICAgIGRyb3BwYWJsZVJlZi5jdXJyZW50ID0gdmFsdWU7XG4gIH0sIFtdKTtcbiAgY29uc3QgZ2V0UGxhY2Vob2xkZXJSZWYgPSB1c2VNZW1vT25lLnVzZUNhbGxiYWNrKCgpID0+IHBsYWNlaG9sZGVyUmVmLmN1cnJlbnQsIFtdKTtcbiAgY29uc3Qgc2V0UGxhY2Vob2xkZXJSZWYgPSB1c2VNZW1vT25lLnVzZUNhbGxiYWNrKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSA9PT0gdm9pZCAwKSB7XG4gICAgICB2YWx1ZSA9IG51bGw7XG4gICAgfVxuXG4gICAgcGxhY2Vob2xkZXJSZWYuY3VycmVudCA9IHZhbHVlO1xuICB9LCBbXSk7XG4gIHVzZVZhbGlkYXRpb24oe1xuICAgIHByb3BzLFxuICAgIGdldERyb3BwYWJsZVJlZixcbiAgICBnZXRQbGFjZWhvbGRlclJlZlxuICB9KTtcbiAgY29uc3Qgb25QbGFjZWhvbGRlclRyYW5zaXRpb25FbmQgPSB1c2VNZW1vT25lLnVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBpZiAoaXNNb3ZlbWVudEFsbG93ZWQoKSkge1xuICAgICAgdXBkYXRlVmlld3BvcnRNYXhTY3JvbGwoe1xuICAgICAgICBtYXhTY3JvbGw6IGdldE1heFdpbmRvd1Njcm9sbCgpXG4gICAgICB9KTtcbiAgICB9XG4gIH0sIFtpc01vdmVtZW50QWxsb3dlZCwgdXBkYXRlVmlld3BvcnRNYXhTY3JvbGxdKTtcbiAgdXNlRHJvcHBhYmxlUHVibGlzaGVyKHtcbiAgICBkcm9wcGFibGVJZCxcbiAgICB0eXBlLFxuICAgIG1vZGUsXG4gICAgZGlyZWN0aW9uLFxuICAgIGlzRHJvcERpc2FibGVkLFxuICAgIGlzQ29tYmluZUVuYWJsZWQsXG4gICAgaWdub3JlQ29udGFpbmVyQ2xpcHBpbmcsXG4gICAgZ2V0RHJvcHBhYmxlUmVmXG4gIH0pO1xuICBjb25zdCBwbGFjZWhvbGRlciA9IHVzZU1lbW9PbmUudXNlTWVtbygoKSA9PiBSZWFjdF9fZGVmYXVsdFtcImRlZmF1bHRcIl0uY3JlYXRlRWxlbWVudChBbmltYXRlSW5PdXQsIHtcbiAgICBvbjogcHJvcHMucGxhY2Vob2xkZXIsXG4gICAgc2hvdWxkQW5pbWF0ZTogcHJvcHMuc2hvdWxkQW5pbWF0ZVBsYWNlaG9sZGVyXG4gIH0sIF9yZWYgPT4ge1xuICAgIGxldCB7XG4gICAgICBvbkNsb3NlLFxuICAgICAgZGF0YSxcbiAgICAgIGFuaW1hdGVcbiAgICB9ID0gX3JlZjtcbiAgICByZXR1cm4gUmVhY3RfX2RlZmF1bHRbXCJkZWZhdWx0XCJdLmNyZWF0ZUVsZW1lbnQoUGxhY2Vob2xkZXIkMSwge1xuICAgICAgcGxhY2Vob2xkZXI6IGRhdGEsXG4gICAgICBvbkNsb3NlOiBvbkNsb3NlLFxuICAgICAgaW5uZXJSZWY6IHNldFBsYWNlaG9sZGVyUmVmLFxuICAgICAgYW5pbWF0ZTogYW5pbWF0ZSxcbiAgICAgIGNvbnRleHRJZDogY29udGV4dElkLFxuICAgICAgb25UcmFuc2l0aW9uRW5kOiBvblBsYWNlaG9sZGVyVHJhbnNpdGlvbkVuZFxuICAgIH0pO1xuICB9KSwgW2NvbnRleHRJZCwgb25QbGFjZWhvbGRlclRyYW5zaXRpb25FbmQsIHByb3BzLnBsYWNlaG9sZGVyLCBwcm9wcy5zaG91bGRBbmltYXRlUGxhY2Vob2xkZXIsIHNldFBsYWNlaG9sZGVyUmVmXSk7XG4gIGNvbnN0IHByb3ZpZGVkID0gdXNlTWVtb09uZS51c2VNZW1vKCgpID0+ICh7XG4gICAgaW5uZXJSZWY6IHNldERyb3BwYWJsZVJlZixcbiAgICBwbGFjZWhvbGRlcixcbiAgICBkcm9wcGFibGVQcm9wczoge1xuICAgICAgJ2RhdGEtcmZkLWRyb3BwYWJsZS1pZCc6IGRyb3BwYWJsZUlkLFxuICAgICAgJ2RhdGEtcmZkLWRyb3BwYWJsZS1jb250ZXh0LWlkJzogY29udGV4dElkXG4gICAgfVxuICB9KSwgW2NvbnRleHRJZCwgZHJvcHBhYmxlSWQsIHBsYWNlaG9sZGVyLCBzZXREcm9wcGFibGVSZWZdKTtcbiAgY29uc3QgaXNVc2luZ0Nsb25lRm9yID0gdXNlQ2xvbmUgPyB1c2VDbG9uZS5kcmFnZ2luZy5kcmFnZ2FibGVJZCA6IG51bGw7XG4gIGNvbnN0IGRyb3BwYWJsZUNvbnRleHQgPSB1c2VNZW1vT25lLnVzZU1lbW8oKCkgPT4gKHtcbiAgICBkcm9wcGFibGVJZCxcbiAgICB0eXBlLFxuICAgIGlzVXNpbmdDbG9uZUZvclxuICB9KSwgW2Ryb3BwYWJsZUlkLCBpc1VzaW5nQ2xvbmVGb3IsIHR5cGVdKTtcblxuICBmdW5jdGlvbiBnZXRDbG9uZSgpIHtcbiAgICBpZiAoIXVzZUNsb25lKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCB7XG4gICAgICBkcmFnZ2luZyxcbiAgICAgIHJlbmRlclxuICAgIH0gPSB1c2VDbG9uZTtcbiAgICBjb25zdCBub2RlID0gUmVhY3RfX2RlZmF1bHRbXCJkZWZhdWx0XCJdLmNyZWF0ZUVsZW1lbnQoUHJpdmF0ZURyYWdnYWJsZSwge1xuICAgICAgZHJhZ2dhYmxlSWQ6IGRyYWdnaW5nLmRyYWdnYWJsZUlkLFxuICAgICAgaW5kZXg6IGRyYWdnaW5nLnNvdXJjZS5pbmRleCxcbiAgICAgIGlzQ2xvbmU6IHRydWUsXG4gICAgICBpc0VuYWJsZWQ6IHRydWUsXG4gICAgICBzaG91bGRSZXNwZWN0Rm9yY2VQcmVzczogZmFsc2UsXG4gICAgICBjYW5EcmFnSW50ZXJhY3RpdmVFbGVtZW50czogdHJ1ZVxuICAgIH0sIChkcmFnZ2FibGVQcm92aWRlZCwgZHJhZ2dhYmxlU25hcHNob3QpID0+IHJlbmRlcihkcmFnZ2FibGVQcm92aWRlZCwgZHJhZ2dhYmxlU25hcHNob3QsIGRyYWdnaW5nKSk7XG4gICAgcmV0dXJuIFJlYWN0RE9NX19kZWZhdWx0W1wiZGVmYXVsdFwiXS5jcmVhdGVQb3J0YWwobm9kZSwgZ2V0Q29udGFpbmVyRm9yQ2xvbmUoKSk7XG4gIH1cblxuICByZXR1cm4gUmVhY3RfX2RlZmF1bHRbXCJkZWZhdWx0XCJdLmNyZWF0ZUVsZW1lbnQoRHJvcHBhYmxlQ29udGV4dC5Qcm92aWRlciwge1xuICAgIHZhbHVlOiBkcm9wcGFibGVDb250ZXh0XG4gIH0sIGNoaWxkcmVuKHByb3ZpZGVkLCBzbmFwc2hvdCksIGdldENsb25lKCkpO1xufTtcblxudmFyIERyb3BwYWJsZSQxID0gRHJvcHBhYmxlO1xuXG5jb25zdCBpc01hdGNoaW5nVHlwZSA9ICh0eXBlLCBjcml0aWNhbCkgPT4gdHlwZSA9PT0gY3JpdGljYWwuZHJvcHBhYmxlLnR5cGU7XG5cbmNvbnN0IGdldERyYWdnYWJsZSA9IChjcml0aWNhbCwgZGltZW5zaW9ucykgPT4gZGltZW5zaW9ucy5kcmFnZ2FibGVzW2NyaXRpY2FsLmRyYWdnYWJsZS5pZF07XG5cbmNvbnN0IG1ha2VNYXBTdGF0ZVRvUHJvcHMgPSAoKSA9PiB7XG4gIGNvbnN0IGlkbGVXaXRoQW5pbWF0aW9uID0ge1xuICAgIHBsYWNlaG9sZGVyOiBudWxsLFxuICAgIHNob3VsZEFuaW1hdGVQbGFjZWhvbGRlcjogdHJ1ZSxcbiAgICBzbmFwc2hvdDoge1xuICAgICAgaXNEcmFnZ2luZ092ZXI6IGZhbHNlLFxuICAgICAgZHJhZ2dpbmdPdmVyV2l0aDogbnVsbCxcbiAgICAgIGRyYWdnaW5nRnJvbVRoaXNXaXRoOiBudWxsLFxuICAgICAgaXNVc2luZ1BsYWNlaG9sZGVyOiBmYWxzZVxuICAgIH0sXG4gICAgdXNlQ2xvbmU6IG51bGxcbiAgfTtcbiAgY29uc3QgaWRsZVdpdGhvdXRBbmltYXRpb24gPSB7IC4uLmlkbGVXaXRoQW5pbWF0aW9uLFxuICAgIHNob3VsZEFuaW1hdGVQbGFjZWhvbGRlcjogZmFsc2VcbiAgfTtcbiAgY29uc3QgZ2V0RHJhZ2dhYmxlUnVicmljID0gbWVtb2l6ZU9uZV9fZGVmYXVsdFtcImRlZmF1bHRcIl0oZGVzY3JpcHRvciA9PiAoe1xuICAgIGRyYWdnYWJsZUlkOiBkZXNjcmlwdG9yLmlkLFxuICAgIHR5cGU6IGRlc2NyaXB0b3IudHlwZSxcbiAgICBzb3VyY2U6IHtcbiAgICAgIGluZGV4OiBkZXNjcmlwdG9yLmluZGV4LFxuICAgICAgZHJvcHBhYmxlSWQ6IGRlc2NyaXB0b3IuZHJvcHBhYmxlSWRcbiAgICB9XG4gIH0pKTtcbiAgY29uc3QgZ2V0TWFwUHJvcHMgPSBtZW1vaXplT25lX19kZWZhdWx0W1wiZGVmYXVsdFwiXSgoaWQsIGlzRW5hYmxlZCwgaXNEcmFnZ2luZ092ZXJGb3JDb25zdW1lciwgaXNEcmFnZ2luZ092ZXJGb3JJbXBhY3QsIGRyYWdnaW5nLCByZW5kZXJDbG9uZSkgPT4ge1xuICAgIGNvbnN0IGRyYWdnYWJsZUlkID0gZHJhZ2dpbmcuZGVzY3JpcHRvci5pZDtcbiAgICBjb25zdCBpc0hvbWUgPSBkcmFnZ2luZy5kZXNjcmlwdG9yLmRyb3BwYWJsZUlkID09PSBpZDtcblxuICAgIGlmIChpc0hvbWUpIHtcbiAgICAgIGNvbnN0IHVzZUNsb25lID0gcmVuZGVyQ2xvbmUgPyB7XG4gICAgICAgIHJlbmRlcjogcmVuZGVyQ2xvbmUsXG4gICAgICAgIGRyYWdnaW5nOiBnZXREcmFnZ2FibGVSdWJyaWMoZHJhZ2dpbmcuZGVzY3JpcHRvcilcbiAgICAgIH0gOiBudWxsO1xuICAgICAgY29uc3Qgc25hcHNob3QgPSB7XG4gICAgICAgIGlzRHJhZ2dpbmdPdmVyOiBpc0RyYWdnaW5nT3ZlckZvckNvbnN1bWVyLFxuICAgICAgICBkcmFnZ2luZ092ZXJXaXRoOiBpc0RyYWdnaW5nT3ZlckZvckNvbnN1bWVyID8gZHJhZ2dhYmxlSWQgOiBudWxsLFxuICAgICAgICBkcmFnZ2luZ0Zyb21UaGlzV2l0aDogZHJhZ2dhYmxlSWQsXG4gICAgICAgIGlzVXNpbmdQbGFjZWhvbGRlcjogdHJ1ZVxuICAgICAgfTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHBsYWNlaG9sZGVyOiBkcmFnZ2luZy5wbGFjZWhvbGRlcixcbiAgICAgICAgc2hvdWxkQW5pbWF0ZVBsYWNlaG9sZGVyOiBmYWxzZSxcbiAgICAgICAgc25hcHNob3QsXG4gICAgICAgIHVzZUNsb25lXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmICghaXNFbmFibGVkKSB7XG4gICAgICByZXR1cm4gaWRsZVdpdGhvdXRBbmltYXRpb247XG4gICAgfVxuXG4gICAgaWYgKCFpc0RyYWdnaW5nT3ZlckZvckltcGFjdCkge1xuICAgICAgcmV0dXJuIGlkbGVXaXRoQW5pbWF0aW9uO1xuICAgIH1cblxuICAgIGNvbnN0IHNuYXBzaG90ID0ge1xuICAgICAgaXNEcmFnZ2luZ092ZXI6IGlzRHJhZ2dpbmdPdmVyRm9yQ29uc3VtZXIsXG4gICAgICBkcmFnZ2luZ092ZXJXaXRoOiBkcmFnZ2FibGVJZCxcbiAgICAgIGRyYWdnaW5nRnJvbVRoaXNXaXRoOiBudWxsLFxuICAgICAgaXNVc2luZ1BsYWNlaG9sZGVyOiB0cnVlXG4gICAgfTtcbiAgICByZXR1cm4ge1xuICAgICAgcGxhY2Vob2xkZXI6IGRyYWdnaW5nLnBsYWNlaG9sZGVyLFxuICAgICAgc2hvdWxkQW5pbWF0ZVBsYWNlaG9sZGVyOiB0cnVlLFxuICAgICAgc25hcHNob3QsXG4gICAgICB1c2VDbG9uZTogbnVsbFxuICAgIH07XG4gIH0pO1xuXG4gIGNvbnN0IHNlbGVjdG9yID0gKHN0YXRlLCBvd25Qcm9wcykgPT4ge1xuICAgIGNvbnN0IGlkID0gb3duUHJvcHMuZHJvcHBhYmxlSWQ7XG4gICAgY29uc3QgdHlwZSA9IG93blByb3BzLnR5cGU7XG4gICAgY29uc3QgaXNFbmFibGVkID0gIW93blByb3BzLmlzRHJvcERpc2FibGVkO1xuICAgIGNvbnN0IHJlbmRlckNsb25lID0gb3duUHJvcHMucmVuZGVyQ2xvbmU7XG5cbiAgICBpZiAoaXNEcmFnZ2luZyhzdGF0ZSkpIHtcbiAgICAgIGNvbnN0IGNyaXRpY2FsID0gc3RhdGUuY3JpdGljYWw7XG5cbiAgICAgIGlmICghaXNNYXRjaGluZ1R5cGUodHlwZSwgY3JpdGljYWwpKSB7XG4gICAgICAgIHJldHVybiBpZGxlV2l0aG91dEFuaW1hdGlvbjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZHJhZ2dpbmcgPSBnZXREcmFnZ2FibGUoY3JpdGljYWwsIHN0YXRlLmRpbWVuc2lvbnMpO1xuICAgICAgY29uc3QgaXNEcmFnZ2luZ092ZXIgPSB3aGF0SXNEcmFnZ2VkT3ZlcihzdGF0ZS5pbXBhY3QpID09PSBpZDtcbiAgICAgIHJldHVybiBnZXRNYXBQcm9wcyhpZCwgaXNFbmFibGVkLCBpc0RyYWdnaW5nT3ZlciwgaXNEcmFnZ2luZ092ZXIsIGRyYWdnaW5nLCByZW5kZXJDbG9uZSk7XG4gICAgfVxuXG4gICAgaWYgKHN0YXRlLnBoYXNlID09PSAnRFJPUF9BTklNQVRJTkcnKSB7XG4gICAgICBjb25zdCBjb21wbGV0ZWQgPSBzdGF0ZS5jb21wbGV0ZWQ7XG5cbiAgICAgIGlmICghaXNNYXRjaGluZ1R5cGUodHlwZSwgY29tcGxldGVkLmNyaXRpY2FsKSkge1xuICAgICAgICByZXR1cm4gaWRsZVdpdGhvdXRBbmltYXRpb247XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRyYWdnaW5nID0gZ2V0RHJhZ2dhYmxlKGNvbXBsZXRlZC5jcml0aWNhbCwgc3RhdGUuZGltZW5zaW9ucyk7XG4gICAgICByZXR1cm4gZ2V0TWFwUHJvcHMoaWQsIGlzRW5hYmxlZCwgd2hhdElzRHJhZ2dlZE92ZXJGcm9tUmVzdWx0KGNvbXBsZXRlZC5yZXN1bHQpID09PSBpZCwgd2hhdElzRHJhZ2dlZE92ZXIoY29tcGxldGVkLmltcGFjdCkgPT09IGlkLCBkcmFnZ2luZywgcmVuZGVyQ2xvbmUpO1xuICAgIH1cblxuICAgIGlmIChzdGF0ZS5waGFzZSA9PT0gJ0lETEUnICYmIHN0YXRlLmNvbXBsZXRlZCAmJiAhc3RhdGUuc2hvdWxkRmx1c2gpIHtcbiAgICAgIGNvbnN0IGNvbXBsZXRlZCA9IHN0YXRlLmNvbXBsZXRlZDtcblxuICAgICAgaWYgKCFpc01hdGNoaW5nVHlwZSh0eXBlLCBjb21wbGV0ZWQuY3JpdGljYWwpKSB7XG4gICAgICAgIHJldHVybiBpZGxlV2l0aG91dEFuaW1hdGlvbjtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgd2FzT3ZlciA9IHdoYXRJc0RyYWdnZWRPdmVyKGNvbXBsZXRlZC5pbXBhY3QpID09PSBpZDtcbiAgICAgIGNvbnN0IHdhc0NvbWJpbmluZyA9IEJvb2xlYW4oY29tcGxldGVkLmltcGFjdC5hdCAmJiBjb21wbGV0ZWQuaW1wYWN0LmF0LnR5cGUgPT09ICdDT01CSU5FJyk7XG4gICAgICBjb25zdCBpc0hvbWUgPSBjb21wbGV0ZWQuY3JpdGljYWwuZHJvcHBhYmxlLmlkID09PSBpZDtcblxuICAgICAgaWYgKHdhc092ZXIpIHtcbiAgICAgICAgcmV0dXJuIHdhc0NvbWJpbmluZyA/IGlkbGVXaXRoQW5pbWF0aW9uIDogaWRsZVdpdGhvdXRBbmltYXRpb247XG4gICAgICB9XG5cbiAgICAgIGlmIChpc0hvbWUpIHtcbiAgICAgICAgcmV0dXJuIGlkbGVXaXRoQW5pbWF0aW9uO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gaWRsZVdpdGhvdXRBbmltYXRpb247XG4gICAgfVxuXG4gICAgcmV0dXJuIGlkbGVXaXRob3V0QW5pbWF0aW9uO1xuICB9O1xuXG4gIHJldHVybiBzZWxlY3Rvcjtcbn07XG5jb25zdCBtYXBEaXNwYXRjaFRvUHJvcHMgPSB7XG4gIHVwZGF0ZVZpZXdwb3J0TWF4U2Nyb2xsOiB1cGRhdGVWaWV3cG9ydE1heFNjcm9sbFxufTtcblxuZnVuY3Rpb24gZ2V0Qm9keSgpIHtcbiAgIWRvY3VtZW50LmJvZHkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBpbnZhcmlhbnQoZmFsc2UsICdkb2N1bWVudC5ib2R5IGlzIG5vdCByZWFkeScpIDogaW52YXJpYW50KGZhbHNlKSA6IHZvaWQgMDtcbiAgcmV0dXJuIGRvY3VtZW50LmJvZHk7XG59XG5cbmNvbnN0IGRlZmF1bHRQcm9wcyA9IHtcbiAgbW9kZTogJ3N0YW5kYXJkJyxcbiAgdHlwZTogJ0RFRkFVTFQnLFxuICBkaXJlY3Rpb246ICd2ZXJ0aWNhbCcsXG4gIGlzRHJvcERpc2FibGVkOiBmYWxzZSxcbiAgaXNDb21iaW5lRW5hYmxlZDogZmFsc2UsXG4gIGlnbm9yZUNvbnRhaW5lckNsaXBwaW5nOiBmYWxzZSxcbiAgcmVuZGVyQ2xvbmU6IG51bGwsXG4gIGdldENvbnRhaW5lckZvckNsb25lOiBnZXRCb2R5XG59O1xuY29uc3QgQ29ubmVjdGVkRHJvcHBhYmxlID0gcmVhY3RSZWR1eC5jb25uZWN0KG1ha2VNYXBTdGF0ZVRvUHJvcHMsIG1hcERpc3BhdGNoVG9Qcm9wcywgbnVsbCwge1xuICBjb250ZXh0OiBTdG9yZUNvbnRleHQsXG4gIGFyZVN0YXRlUHJvcHNFcXVhbDogaXNTdHJpY3RFcXVhbFxufSkoRHJvcHBhYmxlJDEpO1xuQ29ubmVjdGVkRHJvcHBhYmxlLmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcbnZhciBDb25uZWN0ZWREcm9wcGFibGUkMSA9IENvbm5lY3RlZERyb3BwYWJsZTtcblxuZXhwb3J0cy5EcmFnRHJvcENvbnRleHQgPSBEcmFnRHJvcENvbnRleHQ7XG5leHBvcnRzLkRyYWdnYWJsZSA9IFB1YmxpY0RyYWdnYWJsZTtcbmV4cG9ydHMuRHJvcHBhYmxlID0gQ29ubmVjdGVkRHJvcHBhYmxlJDE7XG5leHBvcnRzLnJlc2V0U2VydmVyQ29udGV4dCA9IHJlc2V0U2VydmVyQ29udGV4dDtcbmV4cG9ydHMudXNlS2V5Ym9hcmRTZW5zb3IgPSB1c2VLZXlib2FyZFNlbnNvcjtcbmV4cG9ydHMudXNlTW91c2VTZW5zb3IgPSB1c2VNb3VzZVNlbnNvcjtcbmV4cG9ydHMudXNlVG91Y2hTZW5zb3IgPSB1c2VUb3VjaFNlbnNvcjtcbiIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IEljb24sIEJveCB9IGZyb20gJ0BhZG1pbmpzL2Rlc2lnbi1zeXN0ZW0nXG5cbmltcG9ydCB7IHVzZVRyYW5zbGF0aW9uIH0gZnJvbSAnLi4vLi4vLi4vaG9va3MnXG5pbXBvcnQgeyBSZXNvdXJjZUpTT04sIFByb3BlcnR5SlNPTiB9IGZyb20gJy4uLy4uLy4uL2ludGVyZmFjZXMnXG5cbnR5cGUgQWRkTmV3SXRlbUJ1dHRvblByb3BzID0ge1xuICByZXNvdXJjZTogUmVzb3VyY2VKU09OO1xuICBwcm9wZXJ0eTogUHJvcGVydHlKU09OO1xufVxuXG5jb25zdCBBZGROZXdJdGVtQnV0dG9uOiBSZWFjdC5GQzxBZGROZXdJdGVtQnV0dG9uUHJvcHM+ID0gKHByb3BzKSA9PiB7XG4gIGNvbnN0IHsgcmVzb3VyY2UsIHByb3BlcnR5IH0gPSBwcm9wc1xuICBjb25zdCB7IHRyYW5zbGF0ZVByb3BlcnR5LCB0cmFuc2xhdGVCdXR0b24gfSA9IHVzZVRyYW5zbGF0aW9uKClcbiAgY29uc3QgbGFiZWwgPSB0cmFuc2xhdGVQcm9wZXJ0eShcbiAgICBgJHtwcm9wZXJ0eS5wYXRofS5hZGROZXdJdGVtYCxcbiAgICByZXNvdXJjZS5pZCxcbiAgICB7XG4gICAgICBkZWZhdWx0VmFsdWU6IHRyYW5zbGF0ZUJ1dHRvbignYWRkTmV3SXRlbScsIHJlc291cmNlLmlkKSxcbiAgICB9LFxuICApXG5cbiAgcmV0dXJuIChcbiAgICA8Qm94PlxuICAgICAgPEljb24gaWNvbj1cIkFkZFwiIC8+XG4gICAgICB7bGFiZWx9XG4gICAgPC9Cb3g+XG4gIClcbn1cblxuZXhwb3J0IGRlZmF1bHQgQWRkTmV3SXRlbUJ1dHRvblxuIiwiaW1wb3J0IHsgQm94LCBJY29uLCBUb29sdGlwIH0gZnJvbSAnQGFkbWluanMvZGVzaWduLXN5c3RlbSdcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcblxuaW1wb3J0IHsgUHJvcGVydHlKU09OIH0gZnJvbSAnLi4vLi4vLi4vLi4vaW50ZXJmYWNlcydcbmltcG9ydCBhbGxvd092ZXJyaWRlIGZyb20gJy4uLy4uLy4uLy4uL2hvYy9hbGxvdy1vdmVycmlkZSdcblxuZXhwb3J0IHR5cGUgUHJvcGVydHlEZXNjcmlwdGlvblByb3BzID0ge1xuICBwcm9wZXJ0eTogUHJvcGVydHlKU09OO1xufVxuXG5jb25zdCBQcm9wZXJ0eURlc2NyaXB0aW9uOiBSZWFjdC5GQzxQcm9wZXJ0eURlc2NyaXB0aW9uUHJvcHM+ID0gKHByb3BzKSA9PiB7XG4gIGNvbnN0IHsgcHJvcGVydHkgfSA9IHByb3BzXG5cbiAgaWYgKCFwcm9wZXJ0eS5kZXNjcmlwdGlvbikgeyByZXR1cm4gbnVsbCB9XG4gIGNvbnN0IGRpcmVjdGlvbiA9IHByb3BlcnR5LmN1c3RvbT8udG9vbHRpcERpcmVjdGlvbiB8fCAndG9wJ1xuXG4gIHJldHVybiAoXG4gICAgPEJveCBteD1cInNtXCIgZGlzcGxheT1cImlubGluZS1mbGV4XCI+XG4gICAgICA8VG9vbHRpcCBkaXJlY3Rpb249e2RpcmVjdGlvbn0gdGl0bGU9e3Byb3BlcnR5LmRlc2NyaXB0aW9ufSBzaXplPVwibGdcIj5cbiAgICAgICAgPEJveD5cbiAgICAgICAgICA8SWNvbiBpY29uPVwiSGVscFwiIGNvbG9yPVwiaW5mb1wiIC8+XG4gICAgICAgIDwvQm94PlxuICAgICAgPC9Ub29sdGlwPlxuICAgIDwvQm94PlxuICApXG59XG5cbmNvbnN0IE92ZXJyaWRhYmxlUHJvcGVydHlEZXNjcmlwdGlvbiA9IGFsbG93T3ZlcnJpZGUoUHJvcGVydHlEZXNjcmlwdGlvbiwgJ1Byb3BlcnR5RGVzY3JpcHRpb24nKVxuXG5leHBvcnQge1xuICBPdmVycmlkYWJsZVByb3BlcnR5RGVzY3JpcHRpb24gYXMgZGVmYXVsdCxcbiAgT3ZlcnJpZGFibGVQcm9wZXJ0eURlc2NyaXB0aW9uIGFzIFByb3BlcnR5RGVzY3JpcHRpb24sXG59XG4iLCJpbXBvcnQgeyBMYWJlbCwgTGFiZWxQcm9wcyB9IGZyb20gJ0BhZG1pbmpzL2Rlc2lnbi1zeXN0ZW0nXG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnXG5cbmltcG9ydCB7IFByb3BlcnR5SlNPTiB9IGZyb20gJy4uLy4uLy4uLy4uL2ludGVyZmFjZXMnXG5pbXBvcnQgeyBQcm9wZXJ0eURlc2NyaXB0aW9uIH0gZnJvbSAnLi4vcHJvcGVydHktZGVzY3JpcHRpb24nXG5pbXBvcnQgYWxsb3dPdmVycmlkZSBmcm9tICcuLi8uLi8uLi8uLi9ob2MvYWxsb3ctb3ZlcnJpZGUnXG5cbmV4cG9ydCB0eXBlIFByb3BlcnR5TGFiZWxQcm9wcyA9IHtcbiAgcHJvcGVydHk6IFByb3BlcnR5SlNPTjtcbiAgcHJvcHM/OiBMYWJlbFByb3BzO1xufVxuXG5jb25zdCBQcm9wZXJ0eUxhYmVsOiBSZWFjdC5GQzxQcm9wZXJ0eUxhYmVsUHJvcHM+ID0gKHByb3BzKSA9PiB7XG4gIGNvbnN0IHsgcHJvcGVydHksIHByb3BzOiBsYWJlbFByb3BzIH0gPSBwcm9wc1xuXG4gIGlmIChwcm9wZXJ0eS5oaWRlTGFiZWwpIHsgcmV0dXJuIG51bGwgfVxuXG4gIHJldHVybiAoXG4gICAgPExhYmVsXG4gICAgICBodG1sRm9yPXtwcm9wZXJ0eS5wYXRofVxuICAgICAgcmVxdWlyZWQ9e3Byb3BlcnR5LmlzUmVxdWlyZWR9XG4gICAgICB7Li4ubGFiZWxQcm9wc31cbiAgICA+XG4gICAgICB7cHJvcGVydHkubGFiZWx9XG4gICAgICB7cHJvcGVydHkuZGVzY3JpcHRpb24gJiYgPFByb3BlcnR5RGVzY3JpcHRpb24gcHJvcGVydHk9e3Byb3BlcnR5fSAvPn1cbiAgICA8L0xhYmVsPlxuICApXG59XG5cbmNvbnN0IE92ZXJyaWRhYmxlUHJvcGVydHlMYWJlbCA9IGFsbG93T3ZlcnJpZGUoUHJvcGVydHlMYWJlbCwgJ1Byb3BlcnR5TGFiZWwnKVxuXG5leHBvcnQge1xuICBPdmVycmlkYWJsZVByb3BlcnR5TGFiZWwgYXMgZGVmYXVsdCxcbiAgT3ZlcnJpZGFibGVQcm9wZXJ0eUxhYmVsIGFzIFByb3BlcnR5TGFiZWwsXG59XG4iLCJpbXBvcnQgeyBERUxJTUlURVIgfSBmcm9tICcuLi8uLi8uLi8uLi91dGlscy9mbGF0L2NvbnN0YW50cydcbmltcG9ydCB7IFByb3BlcnR5SlNPTiB9IGZyb20gJy4uLy4uLy4uL2ludGVyZmFjZXMnXG5cbmV4cG9ydCBjb25zdCBnZXRTdWJwcm9wZXJ0eVBhdGggPSAocGF0aDogc3RyaW5nLCBpbmRleDogbnVtYmVyKSA9PiBbcGF0aCwgaW5kZXhdLmpvaW4oREVMSU1JVEVSKVxuZXhwb3J0IGNvbnN0IGdldEluZGV4RnJvbVN1YnByb3BlcnR5UGF0aCA9IChzdWJwcm9wZXJ0eVBhdGg6IHN0cmluZykgPT4ge1xuICBjb25zdCBbLCBpbmRleF0gPSBzdWJwcm9wZXJ0eVBhdGguc3BsaXQoREVMSU1JVEVSKVxuICByZXR1cm4gcGFyc2VJbnQoaW5kZXgsIDEwKVxufVxuXG4vKipcbiAqIENvbnZlcnRzIHByb3BlcnR5OiBQcm9wZXJ0eUpTT04gZnJvbSBhbiBhcnJheSB0byBhIHN1Yi1wcm9wZXJ0eSBmb3IgYW4gYWN0dWFsIGl0ZW0gaW4gdGhlIGFycmF5XG4gKiBJdCBjaGFuZ2UgcGF0aCB0aGF0IGl0IGhhcyBpbmRleCBpbnNpZGUgYWxvbmcgd2l0aCB0aGUgbGFiZWwuIEZ1dGhlcm1vcmUgZmxhdCBpc0FycmF5IGlzIHJlbW92ZWRcbiAqICxiZWNhdXNlIGl0IHdhcyBhbHJlYWR5IGhhbmRsZWQsIHNvIHRoYXQgaXRlbVJlbmRlcmVyIGNhbiByZW5kZXIgcHJvcGVydHkgYXMgYSByZWd1bGFyIG9uZVxuICpcbiAqIEBwYXJhbSB7UHJvcGVydHlKU09OfSAgYXJyYXlQcm9wZXJ0eSBwcm9wZXJ0eSB3aXRoIHBhdGggc2V0IHRvIGFuIHJvb3QgQXJyYXkgdHlwZSBwcm9wZXJ0eSxcbiAqIEBwYXJhbSB7TnVtYmVyfSAgICAgICAgaW5kZXggICAgICAgICBpbmRleCB1bmRlciB3aGljaCBzdWItcHJvcGVydHkgc2hvdWxkIGJlIHBsYWNlZFxuICogQHByaXZhdGVcbiAqIEBoaWRlXG4gKi9cbmV4cG9ydCBjb25zdCBjb252ZXJ0VG9TdWJQcm9wZXJ0eSA9IChhcnJheVByb3BlcnR5OiBQcm9wZXJ0eUpTT04sIGluZGV4OiBudW1iZXIpOiBQcm9wZXJ0eUpTT04gPT4gKFxuICB7XG4gICAgLi4uYXJyYXlQcm9wZXJ0eSxcbiAgICBwYXRoOiBnZXRTdWJwcm9wZXJ0eVBhdGgoYXJyYXlQcm9wZXJ0eS5wYXRoLCBpbmRleCksXG4gICAgbGFiZWw6IGBbJHtpbmRleCArIDF9XWAsXG4gICAgaXNBcnJheTogZmFsc2UsXG4gICAgaXNEcmFnZ2FibGU6IGZhbHNlLFxuICB9XG4pXG4iLCJpbXBvcnQgeyBmbGF0IH0gZnJvbSAnLi4vLi4vLi4vLi4vdXRpbHMnXG5pbXBvcnQgeyBSZWNvcmRKU09OIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJmYWNlcydcblxuLyoqXG4gKiBSZW1vdmVzIHNlbGVjdGVkIGFycmF5IGl0ZW0gZnJvbSBnaXZlbiByZWNvcmQuIEl0IHBlcmZvcm1zIGZvbGxvd2luZyB0YXNrczpcbiAqIDEuIHJlbW92ZXMgYXJyYXkgaXRlbSBmcm9tIHRoZSBhcnJheVxuICogMi4gcmVvcmRlcnMga2V5cyBpbiBuZXcgYXJyYXkgaXRlbVxuICogMy4gaWYgcHJvcGVydHkgaGFzIHBvcHVsYXRlZCBmaWVsZHMgaXQgYWxzbyByZW9yZGVycyB0aGVtXG4gKiBpdCB1c2VzIHtAbGluayBmbGF0IH0gbW9kdWxlIGFuZCBpdHMgcmVtb3ZlUGF0aCBtZXRob2RcbiAqXG4gKiBAcGFyYW0ge1JlY29yZEpTT059IHJlY29yZFxuICogQHBhcmFtIHtzdHJpbmd9ICAgICBzdWJQcm9wZXJ0eVBhdGggICAgICAgICAgICB3aGljaCBoYXMgdG8gYmUgcmVtb3ZlZC4gSXQgaGFzIHRvIGJlIGZsYXR0ZW5lZFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBub3RhdGlvbiwgYW5kIGVuZGluZyB3aXRoIGFycmF5IGluZGV4XG4gKiBAcHJpdmF0ZVxuICogQGhpZGVcbiAqL1xuZXhwb3J0IGNvbnN0IHJlbW92ZVN1YlByb3BlcnR5ID0gKHJlY29yZDogUmVjb3JkSlNPTiwgc3ViUHJvcGVydHlQYXRoOiBzdHJpbmcpOiBSZWNvcmRKU09OID0+IHtcbiAgLy8gYnkgZGVmYXVsdCBwb3B1bGF0ZWQgaXMgZmxhdHRlbiBqdXN0IHRvIHRoZSBwYXRoIGxldmVsIC0gb2JqZWN0IGl0c2VsZiBpcyBub3QgZmxhdHRlbi4gVGhhdCBpc1xuICAvLyB3aHkgd2UgaGF2ZSB0byByZXRyaWV2ZSB0aGUgb3JpZ2luYWwgc3RhdGUuIFRoYXQgaXMgd2h5IHdlIGhhdmUgdG8gcmVwbGFjZSByZWNvcmQucG9wdWxhdGVkIHRvXG4gIC8vIGZyb20geyAnc29tZS5uZXN0ZWQuMS5rZXknOiBSZWNvcmRKU09OIH0gdG8geyAnc29tZS5uZXN0ZWQuMS5rZXknOiAnc29tZS5uZXN0ZWQuMS5rZXknIH0sXG4gIC8vIHRoZW4gcmVtb3ZlIGtleXMsIGFuZCByZWZpbGwgYmFjayBzb21lLm5lc3RlZC4xLmtleSB0byB0aGUgdmFsdWUgZnJvbSB0aGUgb3JpZ2luYWwgcG9wdWxhdGVkXG4gIC8vIG9iamVjdC5cbiAgY29uc3QgcG9wdWxhdGVkS2V5TWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0gT2JqZWN0LmtleXMocmVjb3JkLnBvcHVsYXRlZCkucmVkdWNlKFxuICAgIChtZW1vLCBwcm9wZXJ0eUtleSkgPT4gKHtcbiAgICAgIC4uLm1lbW8sXG4gICAgICBbcHJvcGVydHlLZXldOiBwcm9wZXJ0eUtleSxcbiAgICB9KSxcbiAgICB7fSxcbiAgKVxuXG4gIGNvbnN0IG5ld1BvcHVsYXRlZEtleU1hcCA9IGZsYXQucmVtb3ZlUGF0aChwb3B1bGF0ZWRLZXlNYXAsIHN1YlByb3BlcnR5UGF0aClcbiAgY29uc3QgbmV3UG9wdWxhdGVkID0gT2JqZWN0LmVudHJpZXMobmV3UG9wdWxhdGVkS2V5TWFwKVxuICAgIC5yZWR1Y2UoKG1lbW8sIFtuZXdQcm9wZXJ0eUtleSwgb2xkUHJvcGVydHlLZXldKSA9PiAoe1xuICAgICAgLi4ubWVtbyxcbiAgICAgIFtuZXdQcm9wZXJ0eUtleV06IG9sZFByb3BlcnR5S2V5ICYmIHJlY29yZC5wb3B1bGF0ZWRbb2xkUHJvcGVydHlLZXk/LnRvU3RyaW5nKCldLFxuICAgIH0pLCB7fSlcblxuICByZXR1cm4ge1xuICAgIC4uLnJlY29yZCxcbiAgICBwYXJhbXM6IGZsYXQucmVtb3ZlUGF0aChyZWNvcmQucGFyYW1zLCBzdWJQcm9wZXJ0eVBhdGgpLFxuICAgIHBvcHVsYXRlZDogbmV3UG9wdWxhdGVkLFxuICB9XG59XG4iLCJpbXBvcnQgUmVhY3QsIHsgTW91c2VFdmVudCwgdXNlQ2FsbGJhY2sgfSBmcm9tICdyZWFjdCdcbmltcG9ydCB7IEJ1dHRvbiwgU2VjdGlvbiwgRm9ybUdyb3VwLCBGb3JtTWVzc2FnZSwgSWNvbiwgQm94IH0gZnJvbSAnQGFkbWluanMvZGVzaWduLXN5c3RlbSdcbmltcG9ydCB7IERyYWdEcm9wQ29udGV4dCwgRHJvcHBhYmxlLCBEcmFnZ2FibGUsIERyb3BSZXN1bHQgfSBmcm9tICdAaGVsbG8tcGFuZ2VhL2RuZCdcblxuaW1wb3J0IEFkZE5ld0l0ZW1CdXR0b24gZnJvbSAnLi9hZGQtbmV3LWl0ZW0tdHJhbnNsYXRpb24nXG5pbXBvcnQgeyBmbGF0IH0gZnJvbSAnLi4vLi4vLi4vLi4vdXRpbHMnXG5pbXBvcnQgeyBFZGl0UHJvcGVydHlQcm9wc0luQXJyYXkgfSBmcm9tICcuLi9iYXNlLXByb3BlcnR5LXByb3BzJ1xuaW1wb3J0IHsgUHJvcGVydHlMYWJlbCB9IGZyb20gJy4uL3V0aWxzL3Byb3BlcnR5LWxhYmVsJ1xuaW1wb3J0IHsgY29udmVydFRvU3ViUHJvcGVydHkgfSBmcm9tICcuL2NvbnZlcnQtdG8tc3ViLXByb3BlcnR5J1xuaW1wb3J0IHsgUHJvcGVydHlKU09OIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJmYWNlcydcbmltcG9ydCB7IHJlbW92ZVN1YlByb3BlcnR5IH0gZnJvbSAnLi9yZW1vdmUtc3ViLXByb3BlcnR5J1xuaW1wb3J0IGFsbG93T3ZlcnJpZGUgZnJvbSAnLi4vLi4vLi4vaG9jL2FsbG93LW92ZXJyaWRlJ1xuXG50eXBlIEVkaXRQcm9wcyA9IFJlcXVpcmVkPEVkaXRQcm9wZXJ0eVByb3BzSW5BcnJheT5cblxudHlwZSBJdGVtUmVuZGVyZXJQcm9wcyA9IHtcbiAgb25EZWxldGU6IChldmVudDogTW91c2VFdmVudCwgcHJvcGVydHk6IFByb3BlcnR5SlNPTikgPT4gYm9vbGVhbjtcbiAgaW5kZXg6IG51bWJlcjtcbiAgaXNEcmFnZ2FibGU6IGJvb2xlYW47XG59XG5cbmNvbnN0IEl0ZW1SZW5kZXJlcjogUmVhY3QuRkM8RWRpdFByb3BzICYgSXRlbVJlbmRlcmVyUHJvcHM+ID0gKHByb3BzKSA9PiB7XG4gIGNvbnN0IHsgSXRlbUNvbXBvbmVudCwgcHJvcGVydHksIG9uRGVsZXRlLCBpbmRleCwgcmVjb3JkLCBpc0RyYWdnYWJsZSB9ID0gcHJvcHNcbiAgY29uc3QgdW5pcXVlRHJhZ2dhYmxlSWQgPSB3aW5kb3cuYnRvYSh1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoYCR7SlNPTi5zdHJpbmdpZnkoZmxhdC5nZXQocmVjb3JkLnBhcmFtcywgcHJvcGVydHkucGF0aCkpfS0ke3Byb3BlcnR5LnBhdGh9YCkpKVxuXG4gIHJldHVybiAoXG4gICAgPERyYWdnYWJsZVxuICAgICAgZHJhZ2dhYmxlSWQ9e3VuaXF1ZURyYWdnYWJsZUlkfVxuICAgICAgaW5kZXg9e2luZGV4fVxuICAgICAga2V5PXt1bmlxdWVEcmFnZ2FibGVJZH1cbiAgICAgIGlzRHJhZ0Rpc2FibGVkPXshaXNEcmFnZ2FibGV9XG4gICAgPlxuICAgICAgeyhwcm92aWRlZCk6IEpTWC5FbGVtZW50ID0+IChcbiAgICAgICAgPEJveFxuICAgICAgICAgIHJlZj17cHJvdmlkZWQuaW5uZXJSZWZ9XG4gICAgICAgICAgey4uLnByb3ZpZGVkLmRyYWdnYWJsZVByb3BzfVxuICAgICAgICAgIHsuLi5wcm92aWRlZC5kcmFnSGFuZGxlUHJvcHN9XG4gICAgICAgICAgYmFja2dyb3VuZENvbG9yPVwid2hpdGVcIlxuICAgICAgICAgIGZsZXhcbiAgICAgICAgICBmbGV4RGlyZWN0aW9uPVwicm93XCJcbiAgICAgICAgICBhbGlnbkl0ZW1zPVwiY2VudGVyXCJcbiAgICAgICAgICBkYXRhLXRlc3RpZD17cHJvcGVydHkucGF0aH1cbiAgICAgICAgPlxuICAgICAgICAgIDxCb3ggZmxleEdyb3c9ezF9PlxuICAgICAgICAgICAgPEl0ZW1Db21wb25lbnQgey4uLnByb3BzfSAvPlxuICAgICAgICAgIDwvQm94PlxuICAgICAgICAgIDxCb3ggZmxleFNocmluaz17MH0gbWw9XCJsZ1wiPlxuICAgICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgICByb3VuZGVkXG4gICAgICAgICAgICAgIG1sPVwiZGVmYXVsdFwiXG4gICAgICAgICAgICAgIGRhdGEtdGVzdGlkPVwiZGVsZXRlLWl0ZW1cIlxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgc2l6ZT1cImljb25cIlxuICAgICAgICAgICAgICBvbkNsaWNrPXsoZXZlbnQpOiBib29sZWFuID0+IG9uRGVsZXRlKGV2ZW50LCBwcm9wZXJ0eSl9XG4gICAgICAgICAgICAgIHZhcmlhbnQ9XCJkYW5nZXJcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8SWNvbiBpY29uPVwiVHJhc2hDYW5cIiAvPlxuICAgICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgPC9Cb3g+XG4gICAgICAgIDwvQm94PlxuICAgICAgKX1cbiAgICA8L0RyYWdnYWJsZT5cbiAgKVxufVxuXG5jb25zdCBJbnB1dHNJblNlY3Rpb246IFJlYWN0LkZDPEVkaXRQcm9wcz4gPSAocHJvcHMpID0+IHtcbiAgY29uc3QgeyBwcm9wZXJ0eSwgcmVjb3JkLCByZXNvdXJjZSwgb25DaGFuZ2UgfSA9IHByb3BzXG4gIGNvbnN0IGl0ZW1zID0gZmxhdC5nZXQocmVjb3JkLnBhcmFtcywgcHJvcGVydHkucGF0aCkgfHwgW11cblxuICBjb25zdCBhZGROZXcgPSB1c2VDYWxsYmFjaygoZXZlbnQ6IE1vdXNlRXZlbnQpOiBib29sZWFuID0+IHtcbiAgICBjb25zdCBuZXdJdGVtcyA9IFtcbiAgICAgIC4uLml0ZW1zLFxuICAgICAgcHJvcGVydHkuc3ViUHJvcGVydGllcy5sZW5ndGggPyB7fSA6ICcnLFxuICAgIF1cbiAgICBvbkNoYW5nZShwcm9wZXJ0eS5wYXRoLCBuZXdJdGVtcylcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgcmV0dXJuIGZhbHNlXG4gIH0sIFtyZWNvcmQsIG9uQ2hhbmdlLCBwcm9wZXJ0eV0pXG5cbiAgY29uc3QgcmVtb3ZlSXRlbSA9IHVzZUNhbGxiYWNrKChldmVudDogTW91c2VFdmVudCwgc3ViUHJvcGVydHk6IFByb3BlcnR5SlNPTik6IGJvb2xlYW4gPT4ge1xuICAgIGNvbnN0IG5ld1JlY29yZCA9IHJlbW92ZVN1YlByb3BlcnR5KHJlY29yZCwgc3ViUHJvcGVydHkucGF0aClcbiAgICBvbkNoYW5nZShuZXdSZWNvcmQpXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgIHJldHVybiBmYWxzZVxuICB9LCBbcmVjb3JkLCBvbkNoYW5nZSwgcHJvcGVydHldKVxuXG4gIGNvbnN0IGhhbmRsZU9uRHJhZ0VuZCA9IHVzZUNhbGxiYWNrKChyZXN1bHQ6IERyb3BSZXN1bHQpOiB2b2lkID0+IHtcbiAgICBjb25zdCB7IHNvdXJjZSwgZGVzdGluYXRpb24gfSA9IHJlc3VsdFxuXG4gICAgaWYgKCFzb3VyY2UgfHwgIWRlc3RpbmF0aW9uIHx8IGRlc3RpbmF0aW9uLmluZGV4ID09PSBzb3VyY2UuaW5kZXgpIHJldHVyblxuXG4gICAgY29uc3QgaXRlbXNDb3B5ID0gQXJyYXkuZnJvbShpdGVtcylcbiAgICBjb25zdCBbc291cmNlSXRlbV0gPSBpdGVtc0NvcHkuc3BsaWNlKHNvdXJjZS5pbmRleCwgMSlcbiAgICBpdGVtc0NvcHkuc3BsaWNlKGRlc3RpbmF0aW9uLmluZGV4LCAwLCBzb3VyY2VJdGVtKVxuXG4gICAgb25DaGFuZ2UocHJvcGVydHkucGF0aCwgaXRlbXNDb3B5KVxuICB9LCBbcmVjb3JkLCBvbkNoYW5nZSwgcHJvcGVydHldKVxuXG4gIHJldHVybiAoXG4gICAgPERyYWdEcm9wQ29udGV4dCBvbkRyYWdFbmQ9e2hhbmRsZU9uRHJhZ0VuZH0+XG4gICAgICA8RHJvcHBhYmxlIGRyb3BwYWJsZUlkPXtwcm9wZXJ0eS5wYXRofT5cbiAgICAgICAgeyhwcm92aWRlZCk6IEpTWC5FbGVtZW50ID0+IChcbiAgICAgICAgICA8U2VjdGlvblxuICAgICAgICAgICAgcmVmPXtwcm92aWRlZC5pbm5lclJlZn1cbiAgICAgICAgICAgIHsuLi5wcm92aWRlZC5kcm9wcGFibGVQcm9wc31cbiAgICAgICAgICAgIG10PVwieGxcIlxuICAgICAgICAgICAgY2xhc3NOYW1lPXtwcm9wZXJ0eS5wYXRofVxuICAgICAgICAgID5cbiAgICAgICAgICAgIHtpdGVtcy5tYXAoKGl0ZW0sIGkpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgaXRlbVByb3BlcnR5ID0gY29udmVydFRvU3ViUHJvcGVydHkocHJvcGVydHksIGkpXG4gICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgPEl0ZW1SZW5kZXJlclxuICAgICAgICAgICAgICAgICAgey4uLnByb3BzfVxuICAgICAgICAgICAgICAgICAgcHJvcGVydHk9e2l0ZW1Qcm9wZXJ0eX1cbiAgICAgICAgICAgICAgICAgIGlzRHJhZ2dhYmxlPXtwcm9wZXJ0eS5pc0RyYWdnYWJsZX1cbiAgICAgICAgICAgICAgICAgIGtleT17aXRlbVByb3BlcnR5LnBhdGh9XG4gICAgICAgICAgICAgICAgICBvbkRlbGV0ZT17cmVtb3ZlSXRlbX1cbiAgICAgICAgICAgICAgICAgIGluZGV4PXtpfVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAge3Byb3ZpZGVkLnBsYWNlaG9sZGVyfVxuICAgICAgICAgICAgPEJ1dHRvbiBvbkNsaWNrPXthZGROZXd9IHR5cGU9XCJidXR0b25cIiByb3VuZGVkPlxuICAgICAgICAgICAgICA8QWRkTmV3SXRlbUJ1dHRvbiByZXNvdXJjZT17cmVzb3VyY2V9IHByb3BlcnR5PXtwcm9wZXJ0eX0gLz5cbiAgICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICAgIDwvU2VjdGlvbj5cbiAgICAgICAgKX1cbiAgICAgIDwvRHJvcHBhYmxlPlxuICAgIDwvRHJhZ0Ryb3BDb250ZXh0PlxuICApXG59XG5cbmNvbnN0IEVkaXQ6IFJlYWN0LkZDPEVkaXRQcm9wcz4gPSAocHJvcHMpID0+IHtcbiAgY29uc3QgeyBwcm9wZXJ0eSwgcmVjb3JkLCB0ZXN0SWQgfSA9IHByb3BzXG4gIGNvbnN0IGVycm9yID0gcmVjb3JkLmVycm9ycyAmJiByZWNvcmQuZXJyb3JzW3Byb3BlcnR5LnByb3BlcnR5UGF0aF1cblxuICByZXR1cm4gKFxuICAgIDxGb3JtR3JvdXAgZXJyb3I9eyEhZXJyb3J9IGRhdGEtdGVzdGlkPXt0ZXN0SWR9PlxuICAgICAgPFByb3BlcnR5TGFiZWwgcHJvcGVydHk9e3Byb3BlcnR5fSAvPlxuICAgICAgPElucHV0c0luU2VjdGlvbiB7Li4ucHJvcHN9IC8+XG4gICAgICA8Rm9ybU1lc3NhZ2U+e2Vycm9yICYmIGVycm9yLm1lc3NhZ2V9PC9Gb3JtTWVzc2FnZT5cbiAgICA8L0Zvcm1Hcm91cD5cbiAgKVxufVxuXG5jb25zdCBPdmVycmlkYWJsZUVkaXQgPSBhbGxvd092ZXJyaWRlKEVkaXQsICdEZWZhdWx0QXJyYXlFZGl0UHJvcGVydHknKVxuXG5leHBvcnQge1xuICBPdmVycmlkYWJsZUVkaXQgYXMgZGVmYXVsdCxcbiAgT3ZlcnJpZGFibGVFZGl0IGFzIEVkaXQsXG59XG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnXG5cbmltcG9ydCB7IHVzZVRyYW5zbGF0aW9uIH0gZnJvbSAnLi4vLi4vLi4vaG9va3MvdXNlLXRyYW5zbGF0aW9uJ1xuaW1wb3J0IHsgZmxhdCB9IGZyb20gJy4uLy4uLy4uLy4uL3V0aWxzJ1xuaW1wb3J0IHsgU2hvd1Byb3BlcnR5UHJvcHMgfSBmcm9tICcuLi9iYXNlLXByb3BlcnR5LXByb3BzJ1xuaW1wb3J0IGFsbG93T3ZlcnJpZGUgZnJvbSAnLi4vLi4vLi4vaG9jL2FsbG93LW92ZXJyaWRlJ1xuXG5jb25zdCBMaXN0OiBSZWFjdC5GQzxTaG93UHJvcGVydHlQcm9wcz4gPSAocHJvcHMpID0+IHtcbiAgY29uc3QgeyBwcm9wZXJ0eSwgcmVjb3JkIH0gPSBwcm9wc1xuICBjb25zdCB2YWx1ZXMgPSBmbGF0LmdldChyZWNvcmQucGFyYW1zLCBwcm9wZXJ0eS5wYXRoKSB8fCBbXVxuICBjb25zdCB7IHRyYW5zbGF0ZVByb3BlcnR5IH0gPSB1c2VUcmFuc2xhdGlvbigpXG5cbiAgcmV0dXJuIChcbiAgICA8c3Bhbj57YCR7dHJhbnNsYXRlUHJvcGVydHkoJ2xlbmd0aCcpfTogJHt2YWx1ZXMubGVuZ3RofWB9PC9zcGFuPlxuICApXG59XG5cbmV4cG9ydCBkZWZhdWx0IGFsbG93T3ZlcnJpZGUoTGlzdCwgJ0RlZmF1bHRBcnJheUxpc3RQcm9wZXJ0eScpXG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBTZWN0aW9uLCBWYWx1ZUdyb3VwIH0gZnJvbSAnQGFkbWluanMvZGVzaWduLXN5c3RlbSdcblxuaW1wb3J0IHsgZmxhdCB9IGZyb20gJy4uLy4uLy4uLy4uL3V0aWxzJ1xuaW1wb3J0IHsgY29udmVydFRvU3ViUHJvcGVydHkgfSBmcm9tICcuL2NvbnZlcnQtdG8tc3ViLXByb3BlcnR5J1xuaW1wb3J0IGFsbG93T3ZlcnJpZGUgZnJvbSAnLi4vLi4vLi4vaG9jL2FsbG93LW92ZXJyaWRlJ1xuaW1wb3J0IHsgU2hvd1Byb3BlcnR5UHJvcHMgfSBmcm9tICcuLi9iYXNlLXByb3BlcnR5LXByb3BzJ1xuXG50eXBlIFByb3BzID0gU2hvd1Byb3BlcnR5UHJvcHMgJiB7XG4gIEl0ZW1Db21wb25lbnQ6IHR5cGVvZiBSZWFjdC5Db21wb25lbnQ7XG59XG5cbmNvbnN0IFNob3c6IFJlYWN0LkZDPFByb3BzPiA9IChwcm9wcykgPT4ge1xuICBjb25zdCB7IHByb3BlcnR5LCByZWNvcmQsIEl0ZW1Db21wb25lbnQgfSA9IHByb3BzXG5cbiAgY29uc3QgaXRlbXMgPSBmbGF0LmdldChyZWNvcmQucGFyYW1zLCBwcm9wZXJ0eS5wYXRoKSB8fCBbXVxuXG4gIHJldHVybiAoXG4gICAgPFZhbHVlR3JvdXAgbGFiZWw9e3Byb3BlcnR5LmxhYmVsfT5cbiAgICAgIDxTZWN0aW9uPlxuICAgICAgICB7KGl0ZW1zIHx8IFtdKS5tYXAoKGl0ZW0sIGkpID0+IHtcbiAgICAgICAgICBjb25zdCBpdGVtUHJvcGVydHkgPSBjb252ZXJ0VG9TdWJQcm9wZXJ0eShwcm9wZXJ0eSwgaSlcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPEl0ZW1Db21wb25lbnRcbiAgICAgICAgICAgICAgey4uLnByb3BzfVxuICAgICAgICAgICAgICBrZXk9e2l0ZW1Qcm9wZXJ0eS5wYXRofVxuICAgICAgICAgICAgICBwcm9wZXJ0eT17aXRlbVByb3BlcnR5fVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICApXG4gICAgICAgIH0pfVxuICAgICAgPC9TZWN0aW9uPlxuICAgIDwvVmFsdWVHcm91cD5cbiAgKVxufVxuXG5leHBvcnQgZGVmYXVsdCBhbGxvd092ZXJyaWRlKFNob3csICdEZWZhdWx0QXJyYXlTaG93UHJvcGVydHknKVxuIiwiLy8gaW1wb3J0IFNob3cgZnJvbSAnLi9zaG93J1xuaW1wb3J0IEVkaXQgZnJvbSAnLi9lZGl0J1xuaW1wb3J0IExpc3QgZnJvbSAnLi9saXN0J1xuaW1wb3J0IFNob3cgZnJvbSAnLi9zaG93J1xuXG5leHBvcnQge1xuICBTaG93IGFzIHNob3csXG4gIEVkaXQgYXMgZWRpdCxcbiAgTGlzdCBhcyBsaXN0LFxufVxuIiwiaW1wb3J0IFJlYWN0LCB7IHVzZUVmZmVjdCwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCdcbmltcG9ydCB7IFNlY3Rpb24sIEZvcm1Hcm91cCwgRm9ybU1lc3NhZ2UsIEJ1dHRvbiwgSW5wdXQsIEJveCwgSWNvbiB9IGZyb20gJ0BhZG1pbmpzL2Rlc2lnbi1zeXN0ZW0nXG5cbmltcG9ydCB7IFByb3BlcnR5SlNPTiB9IGZyb20gJy4uLy4uLy4uL2ludGVyZmFjZXMvcHJvcGVydHktanNvbidcbmltcG9ydCB7IEVkaXRQcm9wZXJ0eVByb3BzIH0gZnJvbSAnLi4vYmFzZS1wcm9wZXJ0eS1wcm9wcydcbmltcG9ydCB7IFByb3BlcnR5TGFiZWwgfSBmcm9tICcuLi91dGlscy9wcm9wZXJ0eS1sYWJlbCdcbmltcG9ydCB7IGZsYXQgfSBmcm9tICcuLi8uLi8uLi8uLi91dGlscy9mbGF0J1xuaW1wb3J0IHsgdXNlVHJhbnNsYXRpb24gfSBmcm9tICcuLi8uLi8uLi9ob29rcy91c2UtdHJhbnNsYXRpb24nXG5pbXBvcnQgeyBSZWNvcmRFcnJvciB9IGZyb20gJy4uLy4uLy4uLy4uL2JhY2tlbmQvdXRpbHMvZXJyb3JzJ1xuXG5leHBvcnQgdHlwZSBFZGl0S2V5VmFsdWVQYWlyUHJvcHMgPSB7XG4gIG9uS2V5Q2hhbmdlOiAoa2V5OiBzdHJpbmcsIG5ld0tleTogc3RyaW5nKSA9PiB2b2lkXG4gIG9uVmFsdWVDaGFuZ2U6IChrZXk6IHN0cmluZywgbmV3VmFsdWU6IHN0cmluZykgPT4gdm9pZFxuICBvblJlbW92ZUl0ZW06IChrZXk6IHN0cmluZykgPT4gdm9pZFxuICBvYmplY3RWYWx1ZTogc3RyaW5nXG4gIG9iamVjdEtleTogc3RyaW5nXG4gIHByb3BlcnR5OiBQcm9wZXJ0eUpTT05cbiAgZXJyb3I/OiBSZWNvcmRFcnJvclxufVxuXG5jb25zdCBFZGl0S2V5VmFsdWVQYWlyOiBSZWFjdC5GQzxFZGl0S2V5VmFsdWVQYWlyUHJvcHM+ID0gKHByb3BzKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBvbktleUNoYW5nZSxcbiAgICBvblZhbHVlQ2hhbmdlLFxuICAgIG9uUmVtb3ZlSXRlbSxcbiAgICBwcm9wZXJ0eSxcbiAgICBvYmplY3RWYWx1ZSxcbiAgICBvYmplY3RLZXksXG4gICAgZXJyb3IsXG4gIH0gPSBwcm9wc1xuICBjb25zdCB7IHRtIH0gPSB1c2VUcmFuc2xhdGlvbigpXG4gIGNvbnN0IFtjdXJyZW50VmFsdWUsIHNldFZhbHVlXSA9IHVzZVN0YXRlKG9iamVjdFZhbHVlID8/ICcnKVxuICBjb25zdCBbY3VycmVudEtleSwgc2V0S2V5XSA9IHVzZVN0YXRlKG9iamVjdEtleSA/PyAnJylcblxuICByZXR1cm4gKFxuICAgIDxCb3ggZmxleCBtYj1cImxnXCI+XG4gICAgICA8Qm94IGZsZXgganVzdGlmeUNvbnRlbnQ9XCJzcGFjZS1iZXR3ZWVuXCIgZmxleEdyb3c9ezF9IGZsZXhTaHJpbms9ezB9PlxuICAgICAgICA8Rm9ybUdyb3VwIGVycm9yPXtCb29sZWFuKGVycm9yKX0gbXI9XCJsZ1wiIG1iPVwiMHB4XCI+XG4gICAgICAgICAgPElucHV0XG4gICAgICAgICAgICBwbGFjZWhvbGRlcj17dG0oJ2tleVBsYWNlaG9sZGVyJyl9XG4gICAgICAgICAgICBvbkNoYW5nZT17KGUpID0+IHNldEtleShlLnRhcmdldC52YWx1ZSl9XG4gICAgICAgICAgICBvbkJsdXI9eygpID0+IG9uS2V5Q2hhbmdlKG9iamVjdEtleSwgY3VycmVudEtleSl9XG4gICAgICAgICAgICBvbktleURvd249eyhlKSA9PiBlLmtleUNvZGUgPT09IDEzICYmIG9uS2V5Q2hhbmdlKG9iamVjdEtleSwgY3VycmVudEtleSl9XG4gICAgICAgICAgICB2YWx1ZT17Y3VycmVudEtleX1cbiAgICAgICAgICAgIHsuLi4ocHJvcGVydHkucHJvcHM/LmtleUlucHV0UHJvcHMgPz8ge30pfVxuICAgICAgICAgIC8+XG4gICAgICAgICAge2Vycm9yICYmIDxGb3JtTWVzc2FnZT57ZXJyb3IubWVzc2FnZX08L0Zvcm1NZXNzYWdlPn1cbiAgICAgICAgPC9Gb3JtR3JvdXA+XG4gICAgICAgIDxGb3JtR3JvdXAgbWI9XCIwcHhcIj5cbiAgICAgICAgICA8SW5wdXRcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPXt0bSgndmFsdWVQbGFjZWhvbGRlcicpfVxuICAgICAgICAgICAgb25DaGFuZ2U9eyhlKSA9PiBzZXRWYWx1ZShlLnRhcmdldC52YWx1ZSl9XG4gICAgICAgICAgICBvbkJsdXI9eygpID0+IG9uVmFsdWVDaGFuZ2UoY3VycmVudEtleSwgY3VycmVudFZhbHVlKX1cbiAgICAgICAgICAgIG9uS2V5RG93bj17KGUpID0+IGUua2V5Q29kZSA9PT0gMTMgJiYgb25WYWx1ZUNoYW5nZShjdXJyZW50S2V5LCBjdXJyZW50VmFsdWUpfVxuICAgICAgICAgICAgdmFsdWU9e2N1cnJlbnRWYWx1ZX1cbiAgICAgICAgICAgIGRpc2FibGVkPXshb2JqZWN0S2V5fVxuICAgICAgICAgICAgey4uLihwcm9wZXJ0eS5wcm9wcz8udmFsdWVJbnB1dFByb3BzID8/IHt9KX1cbiAgICAgICAgICAvPlxuICAgICAgICA8L0Zvcm1Hcm91cD5cbiAgICAgIDwvQm94PlxuICAgICAgPEJ1dHRvblxuICAgICAgICByb3VuZGVkXG4gICAgICAgIG1sPVwic21cIlxuICAgICAgICBkYXRhLXRlc3RpZD1cImRlbGV0ZS1pdGVtXCJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIHNpemU9XCJpY29uXCJcbiAgICAgICAgb25DbGljaz17KCkgPT4gb25SZW1vdmVJdGVtKGN1cnJlbnRLZXkpfVxuICAgICAgICB2YXJpYW50PVwiZGFuZ2VyXCJcbiAgICAgICAgZmxleEdyb3c9ezB9XG4gICAgICAgIGZsZXhTaHJpbms9ezF9XG4gICAgICA+XG4gICAgICAgIDxJY29uIGljb249XCJUcmFzaENhblwiIC8+XG4gICAgICA8L0J1dHRvbj5cbiAgICA8L0JveD5cbiAgKVxufVxuXG5jb25zdCBFZGl0OiBSZWFjdC5GQzxFZGl0UHJvcGVydHlQcm9wcz4gPSAocHJvcHMpID0+IHtcbiAgY29uc3QgeyBwcm9wZXJ0eSwgcmVjb3JkLCBvbkNoYW5nZSwgcmVzb3VyY2UgfSA9IHByb3BzXG4gIGNvbnN0IHsgdG0sIHRiIH0gPSB1c2VUcmFuc2xhdGlvbigpXG4gIGNvbnN0IFtvYmplY3RWYWx1ZSwgc2V0T2JqZWN0VmFsdWVdID0gdXNlU3RhdGU8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4oXG4gICAgZmxhdC5nZXQocmVjb3JkLnBhcmFtcywgcHJvcGVydHkucGF0aCkgPz8ge30sXG4gIClcblxuICBjb25zdCBoYW5kbGVLZXlDaGFuZ2UgPSAob2xkS2V5OiBzdHJpbmcsIG5ld0tleTogc3RyaW5nKSA9PiB7XG4gICAgaWYgKG9sZEtleSA9PT0gbmV3S2V5KSByZXR1cm5cblxuICAgIGNvbnN0IHRtcFZhbHVlID0gb2JqZWN0VmFsdWVbb2xkS2V5XVxuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIGNvbnN0IHsgW29sZEtleV06IF9yZW1vdmVkS2V5LCAuLi5vYmplY3RDb3B5IH0gPSBvYmplY3RWYWx1ZVxuXG4gICAgb2JqZWN0Q29weVtuZXdLZXldID0gdG1wVmFsdWUgPz8gJydcblxuICAgIHNldE9iamVjdFZhbHVlKHBhcnNlT2JqZWN0VmFsdWUob2JqZWN0Q29weSkpXG4gIH1cblxuICBjb25zdCBoYW5kbGVWYWx1ZUNoYW5nZSA9IChrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZykgPT4ge1xuICAgIG9iamVjdFZhbHVlW2tleV0gPSB2YWx1ZVxuXG4gICAgc2V0T2JqZWN0VmFsdWUocGFyc2VPYmplY3RWYWx1ZSh7IC4uLm9iamVjdFZhbHVlIH0pKVxuICB9XG5cbiAgY29uc3QgcGFyc2VPYmplY3RWYWx1ZSA9IChvYmo6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pID0+IE9iamVjdC5lbnRyaWVzKG9iailcbiAgICAucmVkdWNlKChtZW1vLCBbaywgdl0pID0+IHtcbiAgICAgIGlmICghayB8fCAhay5sZW5ndGgpIHJldHVybiBtZW1vXG4gICAgICBtZW1vW2tdID0gdlxuICAgICAgcmV0dXJuIG1lbW9cbiAgICB9LCB7fSlcblxuICAvKipcbiAgICogVGhpcyBpcyB1c2VkIHRvIHByZXZlbnQgZW1wdHkvZHVwbGljYXRlIGtleXMgZnJvbSBiZWluZyBhZGRlZCB0byBKU09OXG4gICAqL1xuICBjb25zdCBnZXROZXh0S2V5ID0gKHByZXZpb3VzSWQ/OiBudW1iZXIpID0+IHtcbiAgICBjb25zdCBuZXh0SWQgPSBwcmV2aW91c0lkXG4gICAgICA/IHByZXZpb3VzSWQgKyAxXG4gICAgICA6IE9iamVjdC5rZXlzKG9iamVjdFZhbHVlID8/IHt9KS5sZW5ndGggKyAxXG4gICAgY29uc3QgbmV4dEtleSA9IGAke3RtKCdpbml0aWFsS2V5JywgcmVzb3VyY2UuaWQsIHsgbnVtYmVyOiBuZXh0SWQgfSl9YFxuXG4gICAgaWYgKG9iamVjdFZhbHVlW25leHRLZXldICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBnZXROZXh0S2V5KG5leHRJZClcbiAgICB9XG5cbiAgICByZXR1cm4gbmV4dEtleVxuICB9XG5cbiAgY29uc3QgYWRkTmV3S2V5VmFsdWVQYWlyID0gKGV2ZW50KSA9PiB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuXG4gICAgY29uc3Qga2V5ID0gZ2V0TmV4dEtleSgpXG5cbiAgICBvYmplY3RWYWx1ZVtrZXldID0gJydcblxuICAgIHNldE9iamVjdFZhbHVlKHBhcnNlT2JqZWN0VmFsdWUoeyAuLi5vYmplY3RWYWx1ZSB9KSlcbiAgfVxuXG4gIGNvbnN0IGhhbmRsZVJlbW92ZUl0ZW0gPSAoa2V5OiBzdHJpbmcpID0+IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgY29uc3QgeyBba2V5XTogX3JlbW92ZWRLZXksIC4uLm9iamVjdENvcHkgfSA9IG9iamVjdFZhbHVlXG5cbiAgICBzZXRPYmplY3RWYWx1ZShwYXJzZU9iamVjdFZhbHVlKG9iamVjdENvcHkpKVxuICB9XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBvbkNoYW5nZShwcm9wZXJ0eS5wYXRoLCBvYmplY3RWYWx1ZSlcbiAgfSwgW29iamVjdFZhbHVlXSlcblxuICBjb25zdCBlcnJvciA9IHJlY29yZC5lcnJvcnMgJiYgcmVjb3JkLmVycm9yc1twcm9wZXJ0eS5wYXRoXVxuICBpZiAocHJvcGVydHkuZGVzY3JpcHRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgIHByb3BlcnR5LmRlc2NyaXB0aW9uID0gdG0oJ2tleVZhbHVlUHJvcGVydHlEZWZhdWx0RGVzY3JpcHRpb24nLCByZXNvdXJjZS5pZClcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPEZvcm1Hcm91cCBlcnJvcj17ISFlcnJvcn0+XG4gICAgICA8UHJvcGVydHlMYWJlbCBwcm9wZXJ0eT17cHJvcGVydHl9IC8+XG4gICAgICA8U2VjdGlvbiB7Li4ucHJvcGVydHkucHJvcHN9PlxuICAgICAgICB7T2JqZWN0LmVudHJpZXMob2JqZWN0VmFsdWUpLm1hcCgoW2tleSwgdmFsdWVdKSA9PiAoXG4gICAgICAgICAgPEVkaXRLZXlWYWx1ZVBhaXJcbiAgICAgICAgICAgIGtleT17a2V5fVxuICAgICAgICAgICAgcHJvcGVydHk9e3Byb3BlcnR5fVxuICAgICAgICAgICAgb2JqZWN0VmFsdWU9e3ZhbHVlfVxuICAgICAgICAgICAgb2JqZWN0S2V5PXtrZXl9XG4gICAgICAgICAgICBvbktleUNoYW5nZT17aGFuZGxlS2V5Q2hhbmdlfVxuICAgICAgICAgICAgb25WYWx1ZUNoYW5nZT17aGFuZGxlVmFsdWVDaGFuZ2V9XG4gICAgICAgICAgICBvblJlbW92ZUl0ZW09e2hhbmRsZVJlbW92ZUl0ZW19XG4gICAgICAgICAgICBlcnJvcj17cmVjb3JkLmVycm9yc1tgJHtwcm9wZXJ0eS5wYXRofSR7ZmxhdC5ERUxJTUlURVJ9JHtrZXl9YF19XG4gICAgICAgICAgLz5cbiAgICAgICAgKSl9XG4gICAgICAgIDxCdXR0b24gbXQ9XCJsZ1wiIHZhcmlhbnQ9XCJwcmltYXJ5XCIgb25DbGljaz17YWRkTmV3S2V5VmFsdWVQYWlyfT5cbiAgICAgICAgICB7dGIoJ2FkZE5ld0l0ZW0nLCByZXNvdXJjZS5pZCl9XG4gICAgICAgIDwvQnV0dG9uPlxuICAgICAgPC9TZWN0aW9uPlxuICAgICAgPEZvcm1NZXNzYWdlPntlcnJvciAmJiBlcnJvci5tZXNzYWdlfTwvRm9ybU1lc3NhZ2U+XG4gICAgPC9Gb3JtR3JvdXA+XG4gIClcbn1cblxuZXhwb3J0IGRlZmF1bHQgRWRpdFxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgU2VjdGlvbiwgRm9ybUdyb3VwLCBJbnB1dCwgQm94LCBWYWx1ZUdyb3VwIH0gZnJvbSAnQGFkbWluanMvZGVzaWduLXN5c3RlbSdcblxuaW1wb3J0IHsgU2hvd1Byb3BlcnR5UHJvcHMgfSBmcm9tICcuLi9iYXNlLXByb3BlcnR5LXByb3BzJ1xuaW1wb3J0IHsgZmxhdCB9IGZyb20gJy4uLy4uLy4uLy4uL3V0aWxzL2ZsYXQnXG5pbXBvcnQgeyB1c2VUcmFuc2xhdGlvbiB9IGZyb20gJy4uLy4uLy4uL2hvb2tzL3VzZS10cmFuc2xhdGlvbidcblxuZXhwb3J0IHR5cGUgU2hvd0tleVZhbHVlUGFpclByb3BzID0ge1xuICBvYmplY3RWYWx1ZTogc3RyaW5nXG4gIG9iamVjdEtleTogc3RyaW5nXG59XG5cbmNvbnN0IFNob3dLZXlWYWx1ZVBhaXI6IFJlYWN0LkZDPFNob3dLZXlWYWx1ZVBhaXJQcm9wcz4gPSAocHJvcHMpID0+IHtcbiAgY29uc3Qge1xuICAgIG9iamVjdFZhbHVlLFxuICAgIG9iamVjdEtleSxcbiAgfSA9IHByb3BzXG4gIGNvbnN0IHsgdG0gfSA9IHVzZVRyYW5zbGF0aW9uKClcblxuICByZXR1cm4gKFxuICAgIDxCb3ggZmxleCBtYj1cImxnXCI+XG4gICAgICA8Rm9ybUdyb3VwIG1yPVwibGdcIiBtYj1cIjBweFwiPlxuICAgICAgICA8SW5wdXRcbiAgICAgICAgICBwbGFjZWhvbGRlcj17dG0oJ2tleVBsYWNlaG9sZGVyJyl9XG4gICAgICAgICAgdmFsdWU9e29iamVjdEtleX1cbiAgICAgICAgICBkaXNhYmxlZFxuICAgICAgICAvPlxuICAgICAgPC9Gb3JtR3JvdXA+XG4gICAgICA8Rm9ybUdyb3VwIG1iPVwiMHB4XCI+XG4gICAgICAgIDxJbnB1dFxuICAgICAgICAgIHBsYWNlaG9sZGVyPXt0bSgndmFsdWVQbGFjZWhvbGRlcicpfVxuICAgICAgICAgIHZhbHVlPXtvYmplY3RWYWx1ZX1cbiAgICAgICAgICBkaXNhYmxlZFxuICAgICAgICAvPlxuICAgICAgPC9Gb3JtR3JvdXA+XG4gICAgPC9Cb3g+XG4gIClcbn1cblxuY29uc3QgU2hvdzogUmVhY3QuRkM8U2hvd1Byb3BlcnR5UHJvcHM+ID0gKHByb3BzKSA9PiB7XG4gIGNvbnN0IHsgcHJvcGVydHksIHJlY29yZCB9ID0gcHJvcHNcblxuICBjb25zdCBvYmplY3RWYWx1ZTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IGZsYXQuZ2V0KHJlY29yZC5wYXJhbXMsIHByb3BlcnR5LnBhdGgpID8/IHt9XG5cbiAgcmV0dXJuIChcbiAgICA8VmFsdWVHcm91cCBsYWJlbD17cHJvcGVydHkubGFiZWx9PlxuICAgICAgPFNlY3Rpb24+XG4gICAgICAgIHtPYmplY3QuZW50cmllcyhvYmplY3RWYWx1ZSkubWFwKChba2V5LCB2YWx1ZV0pID0+IChcbiAgICAgICAgICA8U2hvd0tleVZhbHVlUGFpclxuICAgICAgICAgICAga2V5PXtrZXl9XG4gICAgICAgICAgICBvYmplY3RWYWx1ZT17dmFsdWV9XG4gICAgICAgICAgICBvYmplY3RLZXk9e2tleX1cbiAgICAgICAgICAvPlxuICAgICAgICApKX1cbiAgICAgIDwvU2VjdGlvbj5cbiAgICA8L1ZhbHVlR3JvdXA+XG4gIClcbn1cblxuZXhwb3J0IGRlZmF1bHQgU2hvd1xuIiwiaW1wb3J0IHsgREVMSU1JVEVSIH0gZnJvbSAnLi4vLi4vLi4vLi4vdXRpbHMvZmxhdC9jb25zdGFudHMnXG5pbXBvcnQgeyBQcm9wZXJ0eUpTT04sIEJhc2VQcm9wZXJ0eUpTT04gfSBmcm9tICcuLi8uLi8uLi9pbnRlcmZhY2VzJ1xuXG5leHBvcnQgZnVuY3Rpb24gY29udmVydFRvU3ViUHJvcGVydHkoXG4gIHByb3BlcnR5OiBQcm9wZXJ0eUpTT04sXG4gIHN1YlByb3BlcnR5OiBCYXNlUHJvcGVydHlKU09OLFxuKTogUHJvcGVydHlKU09OIHtcbiAgY29uc3QgW3N1YlByb3BlcnR5UGF0aF0gPSBzdWJQcm9wZXJ0eS5uYW1lLnNwbGl0KERFTElNSVRFUikuc2xpY2UoLTEpXG4gIHJldHVybiB7XG4gICAgLi4uc3ViUHJvcGVydHksXG4gICAgcGF0aDogW3Byb3BlcnR5LnBhdGgsIHN1YlByb3BlcnR5UGF0aF0uam9pbihERUxJTUlURVIpLFxuICB9XG59XG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBTZWN0aW9uLCBGb3JtR3JvdXAsIEZvcm1NZXNzYWdlIH0gZnJvbSAnQGFkbWluanMvZGVzaWduLXN5c3RlbSdcblxuaW1wb3J0IHsgRWRpdFByb3BlcnR5UHJvcHMgfSBmcm9tICcuLi9iYXNlLXByb3BlcnR5LXByb3BzJ1xuaW1wb3J0IHsgUHJvcGVydHlMYWJlbCB9IGZyb20gJy4uL3V0aWxzL3Byb3BlcnR5LWxhYmVsJ1xuaW1wb3J0IHsgY29udmVydFRvU3ViUHJvcGVydHkgfSBmcm9tICcuL2NvbnZlcnQtdG8tc3ViLXByb3BlcnR5J1xuaW1wb3J0IGFsbG93T3ZlcnJpZGUgZnJvbSAnLi4vLi4vLi4vaG9jL2FsbG93LW92ZXJyaWRlJ1xuXG50eXBlIFByb3BzID0ge1xuICBJdGVtQ29tcG9uZW50OiB0eXBlb2YgUmVhY3QuQ29tcG9uZW50O1xufVxuXG5jb25zdCBFZGl0OiBSZWFjdC5GQzxQcm9wcyAmIEVkaXRQcm9wZXJ0eVByb3BzPiA9IChwcm9wcykgPT4ge1xuICBjb25zdCB7IHByb3BlcnR5LCByZWNvcmQsIEl0ZW1Db21wb25lbnQgfSA9IHByb3BzXG4gIGNvbnN0IGVycm9yID0gcmVjb3JkLmVycm9ycyAmJiByZWNvcmQuZXJyb3JzW3Byb3BlcnR5LnBhdGhdXG4gIHJldHVybiAoXG4gICAgPEZvcm1Hcm91cCBlcnJvcj17ISFlcnJvcn0+XG4gICAgICA8UHJvcGVydHlMYWJlbCBwcm9wZXJ0eT17cHJvcGVydHl9IC8+XG4gICAgICA8U2VjdGlvbiB7Li4ucHJvcGVydHkucHJvcHN9PlxuICAgICAgICB7cHJvcGVydHkuc3ViUHJvcGVydGllcy5maWx0ZXIoKHN1YlByb3BlcnR5KSA9PiAhc3ViUHJvcGVydHkuaXNJZCkubWFwKChzdWJQcm9wZXJ0eSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHN1YlByb3BlcnR5V2l0aFBhdGggPSBjb252ZXJ0VG9TdWJQcm9wZXJ0eShwcm9wZXJ0eSwgc3ViUHJvcGVydHkpXG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxJdGVtQ29tcG9uZW50XG4gICAgICAgICAgICAgIHsuLi5wcm9wc31cbiAgICAgICAgICAgICAga2V5PXtzdWJQcm9wZXJ0eVdpdGhQYXRoLnBhdGh9XG4gICAgICAgICAgICAgIHByb3BlcnR5PXtzdWJQcm9wZXJ0eVdpdGhQYXRofVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICApXG4gICAgICAgIH0pfVxuICAgICAgPC9TZWN0aW9uPlxuICAgICAgPEZvcm1NZXNzYWdlPntlcnJvciAmJiBlcnJvci5tZXNzYWdlfTwvRm9ybU1lc3NhZ2U+XG4gICAgPC9Gb3JtR3JvdXA+XG4gIClcbn1cblxuZXhwb3J0IGRlZmF1bHQgYWxsb3dPdmVycmlkZShFZGl0LCAnRGVmYXVsdE1peGVkRWRpdFByb3BlcnR5JylcbiIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IFNlY3Rpb24sIFZhbHVlR3JvdXAgfSBmcm9tICdAYWRtaW5qcy9kZXNpZ24tc3lzdGVtJ1xuXG5pbXBvcnQgeyBCYXNlUHJvcGVydHlQcm9wcyB9IGZyb20gJy4uL2Jhc2UtcHJvcGVydHktcHJvcHMnXG5pbXBvcnQgeyBjb252ZXJ0VG9TdWJQcm9wZXJ0eSB9IGZyb20gJy4vY29udmVydC10by1zdWItcHJvcGVydHknXG5pbXBvcnQgYWxsb3dPdmVycmlkZSBmcm9tICcuLi8uLi8uLi9ob2MvYWxsb3ctb3ZlcnJpZGUnXG5cbmludGVyZmFjZSBQcm9wcyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgSXRlbUNvbXBvbmVudDogdHlwZW9mIFJlYWN0LkNvbXBvbmVudDtcbn1cblxuY29uc3QgU2hvdzogUmVhY3QuRkM8UHJvcHMgJiBCYXNlUHJvcGVydHlQcm9wcz4gPSAocHJvcHMpID0+IHtcbiAgY29uc3QgeyBwcm9wZXJ0eSwgSXRlbUNvbXBvbmVudCB9ID0gcHJvcHNcbiAgcmV0dXJuIChcbiAgICA8VmFsdWVHcm91cCBsYWJlbD17cHJvcGVydHkubGFiZWx9PlxuICAgICAgPFNlY3Rpb24+XG4gICAgICAgIHtwcm9wZXJ0eS5zdWJQcm9wZXJ0aWVzLmZpbHRlcigoc3ViUHJvcGVydHkpID0+ICFzdWJQcm9wZXJ0eS5pc0lkKS5tYXAoKHN1YlByb3BlcnR5KSA9PiB7XG4gICAgICAgICAgY29uc3Qgc3ViUHJvcGVydHlXaXRoUGF0aCA9IGNvbnZlcnRUb1N1YlByb3BlcnR5KHByb3BlcnR5LCBzdWJQcm9wZXJ0eSlcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPEl0ZW1Db21wb25lbnRcbiAgICAgICAgICAgICAgey4uLnByb3BzfVxuICAgICAgICAgICAgICBrZXk9e3N1YlByb3BlcnR5V2l0aFBhdGgucGF0aH1cbiAgICAgICAgICAgICAgcHJvcGVydHk9e3N1YlByb3BlcnR5V2l0aFBhdGh9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgIClcbiAgICAgICAgfSl9XG4gICAgICA8L1NlY3Rpb24+XG4gICAgPC9WYWx1ZUdyb3VwPlxuICApXG59XG5cbmV4cG9ydCBkZWZhdWx0IGFsbG93T3ZlcnJpZGUoU2hvdywgJ0RlZmF1bHRNaXhlZFNob3dQcm9wZXJ0eScpXG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBMaW5rIH0gZnJvbSAncmVhY3Qtcm91dGVyLWRvbSdcbmltcG9ydCB7IExhYmVsIH0gZnJvbSAnQGFkbWluanMvZGVzaWduLXN5c3RlbSdcblxuaW1wb3J0IFZpZXdIZWxwZXJzIGZyb20gJy4uLy4uLy4uLy4uL2JhY2tlbmQvdXRpbHMvdmlldy1oZWxwZXJzL3ZpZXctaGVscGVycydcbmltcG9ydCB7IEVkaXRQcm9wZXJ0eVByb3BzLCBCYXNlUHJvcGVydHlQcm9wcyB9IGZyb20gJy4uL2Jhc2UtcHJvcGVydHktcHJvcHMnXG5pbXBvcnQgeyBjb252ZXJ0VG9TdWJQcm9wZXJ0eSB9IGZyb20gJy4vY29udmVydC10by1zdWItcHJvcGVydHknXG5pbXBvcnQgYWxsb3dPdmVycmlkZSBmcm9tICcuLi8uLi8uLi9ob2MvYWxsb3ctb3ZlcnJpZGUnXG5cbnR5cGUgSXRlbUNvbXBvbmVudFByb3BzID0gQmFzZVByb3BlcnR5UHJvcHM7XG5cbmludGVyZmFjZSBQcm9wcyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgSXRlbUNvbXBvbmVudDogUmVhY3QuRkM8SXRlbUNvbXBvbmVudFByb3BzPjtcbn1cblxuY29uc3QgTGlzdDogUmVhY3QuRkM8UHJvcHMgJiBFZGl0UHJvcGVydHlQcm9wcz4gPSAocHJvcHMpID0+IHtcbiAgY29uc3QgeyBwcm9wZXJ0eSwgcmVjb3JkLCByZXNvdXJjZSwgSXRlbUNvbXBvbmVudCB9ID0gcHJvcHNcblxuICBjb25zdCByZW5kZXJJdGVtcyA9ICgpID0+IChcbiAgICA8PlxuICAgICAge3Byb3BlcnR5LnN1YlByb3BlcnRpZXMuZmlsdGVyKChzdWJQcm9wZXJ0eSkgPT4gIXN1YlByb3BlcnR5LmlzSWQpLm1hcCgoc3ViUHJvcGVydHkpID0+IHtcbiAgICAgICAgY29uc3Qgc3ViUHJvcGVydHlXaXRoUGF0aCA9IGNvbnZlcnRUb1N1YlByb3BlcnR5KHByb3BlcnR5LCBzdWJQcm9wZXJ0eSlcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICA8ZGl2IGtleT17c3ViUHJvcGVydHlXaXRoUGF0aC5wYXRofT5cbiAgICAgICAgICAgIDxMYWJlbCBpbmxpbmU+e2Ake3N1YlByb3BlcnR5LmxhYmVsfTogYH08L0xhYmVsPlxuICAgICAgICAgICAgPEl0ZW1Db21wb25lbnRcbiAgICAgICAgICAgICAgey4uLnByb3BzfVxuICAgICAgICAgICAgICBwcm9wZXJ0eT17c3ViUHJvcGVydHlXaXRoUGF0aH1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIClcbiAgICAgIH0pfVxuICAgIDwvPlxuICApXG5cbiAgY29uc3Qgc2hvd0FjdGlvbiA9IHJlY29yZC5yZWNvcmRBY3Rpb25zLmZpbmQoKGEpID0+IGEubmFtZSA9PT0gJ3Nob3cnKVxuXG4gIGlmIChyZXNvdXJjZS50aXRsZVByb3BlcnR5LnByb3BlcnR5UGF0aCA9PT0gcHJvcGVydHkucHJvcGVydHlQYXRoICYmIHNob3dBY3Rpb24pIHtcbiAgICBjb25zdCBoID0gbmV3IFZpZXdIZWxwZXJzKClcbiAgICBjb25zdCBocmVmID0gaC5yZWNvcmRBY3Rpb25Vcmwoe1xuICAgICAgcmVzb3VyY2VJZDogcmVzb3VyY2UuaWQsIHJlY29yZElkOiByZWNvcmQuaWQsIGFjdGlvbk5hbWU6ICdzaG93JyxcbiAgICB9KVxuICAgIHJldHVybiAoXG4gICAgICA8TGluayB0bz17aHJlZn0+e3JlbmRlckl0ZW1zKCl9PC9MaW5rPlxuICAgIClcbiAgfVxuXG4gIHJldHVybiByZW5kZXJJdGVtcygpXG59XG5cbmV4cG9ydCBkZWZhdWx0IGFsbG93T3ZlcnJpZGUoTGlzdCwgJ0RlZmF1bHRNaXhlZExpc3RQcm9wZXJ0eScpXG4iLCIvLyBpbXBvcnQgU2hvdyBmcm9tICcuL3Nob3cnXG5pbXBvcnQgRWRpdCBmcm9tICcuL2VkaXQnXG5pbXBvcnQgU2hvdyBmcm9tICcuL3Nob3cnXG5pbXBvcnQgTGlzdCBmcm9tICcuL2xpc3QnXG5cbmV4cG9ydCB7XG4gIFNob3cgYXMgc2hvdyxcbiAgRWRpdCBhcyBlZGl0LFxuICBMaXN0IGFzIGxpc3QsXG59XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBpbXBvcnQvcHJlZmVyLWRlZmF1bHQtZXhwb3J0ICovXG5pbXBvcnQgeyBFZGl0UHJvcGVydHlQcm9wcywgU2hvd1Byb3BlcnR5UHJvcHMgfSBmcm9tICcuL2Jhc2UtcHJvcGVydHktcHJvcHMnXG5cbi8qKlxuICogRnVuY3Rpb24gdXNlZCBpbiBSZWFjdCBtZW1vIHRvIGNvbXBhcmUgaWYgcHJldmlvdXMgcHJvcGVydHkgdmFsdWUgYW5kIG5leHRcbiAqIHByb3BlcnR5IHZhbHVlIGFyZSB0aGUgc2FtZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgY29uc3QgcmVjb3JkUHJvcGVydHlJc0VxdWFsID0gKFxuICBwcmV2UHJvcHM6IFJlYWRvbmx5PEVkaXRQcm9wZXJ0eVByb3BzIHwgU2hvd1Byb3BlcnR5UHJvcHM+LFxuICBuZXh0UHJvcHM6IFJlYWRvbmx5PEVkaXRQcm9wZXJ0eVByb3BzIHwgU2hvd1Byb3BlcnR5UHJvcHM+LFxuKTogYm9vbGVhbiA9PiB7XG4gIGNvbnN0IHByZXZWYWx1ZSA9IHByZXZQcm9wcy5yZWNvcmQucGFyYW1zW3ByZXZQcm9wcy5wcm9wZXJ0eS5wYXRoXVxuICBjb25zdCBuZXh0VmFsdWUgPSBuZXh0UHJvcHMucmVjb3JkLnBhcmFtc1tuZXh0UHJvcHMucHJvcGVydHkucGF0aF1cblxuICBjb25zdCBwcmV2RXJyb3IgPSBwcmV2UHJvcHMucmVjb3JkLmVycm9yc1twcmV2UHJvcHMucHJvcGVydHkucGF0aF1cbiAgY29uc3QgbmV4dEVycm9yID0gbmV4dFByb3BzLnJlY29yZC5lcnJvcnNbbmV4dFByb3BzLnByb3BlcnR5LnBhdGhdXG5cbiAgcmV0dXJuIHByZXZWYWx1ZSA9PT0gbmV4dFZhbHVlICYmIHByZXZFcnJvciA9PT0gbmV4dEVycm9yXG59XG4iLCJpbXBvcnQgUmVhY3QsIHsgbWVtbyB9IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgQ2hlY2tCb3gsIEZvcm1Hcm91cCwgRm9ybU1lc3NhZ2UgfSBmcm9tICdAYWRtaW5qcy9kZXNpZ24tc3lzdGVtJ1xuXG5pbXBvcnQgeyBFZGl0UHJvcGVydHlQcm9wcyB9IGZyb20gJy4uL2Jhc2UtcHJvcGVydHktcHJvcHMnXG5pbXBvcnQgeyByZWNvcmRQcm9wZXJ0eUlzRXF1YWwgfSBmcm9tICcuLi9yZWNvcmQtcHJvcGVydHktaXMtZXF1YWwnXG5pbXBvcnQgeyBQcm9wZXJ0eUxhYmVsIH0gZnJvbSAnLi4vdXRpbHMvcHJvcGVydHktbGFiZWwnXG5pbXBvcnQgYWxsb3dPdmVycmlkZSBmcm9tICcuLi8uLi8uLi9ob2MvYWxsb3ctb3ZlcnJpZGUnXG5cbmNvbnN0IHBhcnNlVmFsdWUgPSAodmFsdWUpOiBib29sZWFuID0+ICEoIXZhbHVlIHx8IHZhbHVlID09PSAnZmFsc2UnKVxuXG5jb25zdCBFZGl0OiBSZWFjdC5GQzxFZGl0UHJvcGVydHlQcm9wcz4gPSAocHJvcHMpID0+IHtcbiAgY29uc3QgeyBwcm9wZXJ0eSwgb25DaGFuZ2UsIHJlY29yZCB9ID0gcHJvcHNcbiAgY29uc3QgdmFsdWUgPSBwYXJzZVZhbHVlKHJlY29yZC5wYXJhbXMgJiYgcmVjb3JkLnBhcmFtc1twcm9wZXJ0eS5wYXRoXSlcbiAgY29uc3QgZXJyb3IgPSByZWNvcmQuZXJyb3JzICYmIHJlY29yZC5lcnJvcnNbcHJvcGVydHkucGF0aF1cblxuICBjb25zdCBoYW5kbGVDaGFuZ2UgPSAoKTogdm9pZCA9PiB7XG4gICAgaWYgKCFwcm9wZXJ0eS5pc0Rpc2FibGVkKSB7XG4gICAgICBvbkNoYW5nZShwcm9wZXJ0eS5wYXRoLCAhdmFsdWUpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIChcbiAgICA8Rm9ybUdyb3VwIGVycm9yPXshIWVycm9yfT5cbiAgICAgIDxDaGVja0JveFxuICAgICAgICBpZD17cHJvcGVydHkucGF0aH1cbiAgICAgICAgbmFtZT17cHJvcGVydHkucGF0aH1cbiAgICAgICAgb25DaGFuZ2U9e2hhbmRsZUNoYW5nZX1cbiAgICAgICAgY2hlY2tlZD17dmFsdWV9XG4gICAgICAgIGRpc2FibGVkPXtwcm9wZXJ0eS5pc0Rpc2FibGVkfVxuICAgICAgICB7Li4ucHJvcGVydHkucHJvcHN9XG4gICAgICAvPlxuICAgICAgPFByb3BlcnR5TGFiZWwgcHJvcGVydHk9e3Byb3BlcnR5fSBwcm9wcz17eyBpbmxpbmU6IHRydWUgfX0gLz5cbiAgICAgIDxGb3JtTWVzc2FnZT57ZXJyb3IgJiYgZXJyb3IubWVzc2FnZX08L0Zvcm1NZXNzYWdlPlxuICAgIDwvRm9ybUdyb3VwPlxuICApXG59XG5cbmV4cG9ydCBkZWZhdWx0IGFsbG93T3ZlcnJpZGUobWVtbyhFZGl0LCByZWNvcmRQcm9wZXJ0eUlzRXF1YWwpLCAnRGVmYXVsdEJvb2xlYW5FZGl0UHJvcGVydHknKVxuIiwiZXhwb3J0IGRlZmF1bHQgKHZhbHVlKTogJ1llcycgfCAnTm8nIHwgJycgPT4ge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiAnJ1xuICB9XG4gIHJldHVybiB2YWx1ZSA/ICdZZXMnIDogJ05vJ1xufVxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgQmFkZ2UgfSBmcm9tICdAYWRtaW5qcy9kZXNpZ24tc3lzdGVtJ1xuXG5pbXBvcnQgeyBTaG93UHJvcGVydHlQcm9wcyB9IGZyb20gJy4uL2Jhc2UtcHJvcGVydHktcHJvcHMnXG5pbXBvcnQgeyB1c2VUcmFuc2xhdGlvbiB9IGZyb20gJy4uLy4uLy4uL2hvb2tzJ1xuaW1wb3J0IG1hcFZhbHVlIGZyb20gJy4vbWFwLXZhbHVlJ1xuaW1wb3J0IGFsbG93T3ZlcnJpZGUgZnJvbSAnLi4vLi4vLi4vaG9jL2FsbG93LW92ZXJyaWRlJ1xuXG5jb25zdCBCb29sZWFuUHJvcGVydHlWYWx1ZTogUmVhY3QuRkM8U2hvd1Byb3BlcnR5UHJvcHM+ID0gKHByb3BzKSA9PiB7XG4gIGNvbnN0IHsgcmVjb3JkLCBwcm9wZXJ0eSwgcmVzb3VyY2UgfSA9IHByb3BzXG5cbiAgY29uc3QgeyB0cmFuc2xhdGVQcm9wZXJ0eSB9ID0gdXNlVHJhbnNsYXRpb24oKVxuXG4gIGNvbnN0IHJhd1ZhbHVlID0gcmVjb3JkPy5wYXJhbXNbcHJvcGVydHkucGF0aF1cblxuICBpZiAodHlwZW9mIHJhd1ZhbHVlID09PSAndW5kZWZpbmVkJyB8fCByYXdWYWx1ZSA9PT0gJycpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG4gIGNvbnN0IGJhc2UgPSBtYXBWYWx1ZShyYXdWYWx1ZSlcbiAgY29uc3QgdHJhbnNsYXRpb24gPSB0cmFuc2xhdGVQcm9wZXJ0eShgJHtwcm9wZXJ0eS5wYXRofS4ke3Jhd1ZhbHVlfWAsIHJlc291cmNlLmlkLCB7XG4gICAgZGVmYXVsdFZhbHVlOiBiYXNlLFxuICB9KVxuXG4gIHJldHVybiAoXG4gICAgPEJhZGdlIG91dGxpbmUgc2l6ZT1cInNtXCI+e3RyYW5zbGF0aW9ufTwvQmFkZ2U+XG4gIClcbn1cblxuZXhwb3J0IGRlZmF1bHQgYWxsb3dPdmVycmlkZShCb29sZWFuUHJvcGVydHlWYWx1ZSwgJ0Jvb2xlYW5Qcm9wZXJ0eVZhbHVlJylcbiIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IFZhbHVlR3JvdXAgfSBmcm9tICdAYWRtaW5qcy9kZXNpZ24tc3lzdGVtJ1xuXG5pbXBvcnQgQm9vbGVhblByb3BlcnR5VmFsdWUgZnJvbSAnLi9ib29sZWFuLXByb3BlcnR5LXZhbHVlJ1xuaW1wb3J0IHsgU2hvd1Byb3BlcnR5UHJvcHMgfSBmcm9tICcuLi9iYXNlLXByb3BlcnR5LXByb3BzJ1xuaW1wb3J0IGFsbG93T3ZlcnJpZGUgZnJvbSAnLi4vLi4vLi4vaG9jL2FsbG93LW92ZXJyaWRlJ1xuXG5jb25zdCBTaG93OiBSZWFjdC5GQzxTaG93UHJvcGVydHlQcm9wcz4gPSAocHJvcHMpID0+IHtcbiAgY29uc3QgeyBwcm9wZXJ0eSB9ID0gcHJvcHNcbiAgcmV0dXJuIChcbiAgICA8VmFsdWVHcm91cCBsYWJlbD17cHJvcGVydHkubGFiZWx9PlxuICAgICAgPEJvb2xlYW5Qcm9wZXJ0eVZhbHVlIHsuLi5wcm9wc30gLz5cbiAgICA8L1ZhbHVlR3JvdXA+XG4gIClcbn1cblxuZXhwb3J0IGRlZmF1bHQgYWxsb3dPdmVycmlkZShTaG93LCAnRGVmYXVsdEJvb2xlYW5TaG93UHJvcGVydHknKVxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuXG5pbXBvcnQgQm9vbGVhblByb3BlcnR5VmFsdWUgZnJvbSAnLi9ib29sZWFuLXByb3BlcnR5LXZhbHVlJ1xuaW1wb3J0IHsgU2hvd1Byb3BlcnR5UHJvcHMgfSBmcm9tICcuLi9iYXNlLXByb3BlcnR5LXByb3BzJ1xuaW1wb3J0IGFsbG93T3ZlcnJpZGUgZnJvbSAnLi4vLi4vLi4vaG9jL2FsbG93LW92ZXJyaWRlJ1xuXG5jb25zdCBMaXN0OiBSZWFjdC5GQzxTaG93UHJvcGVydHlQcm9wcz4gPSAocHJvcHMpID0+IChcbiAgPEJvb2xlYW5Qcm9wZXJ0eVZhbHVlIHsuLi5wcm9wc30gLz5cbilcblxuZXhwb3J0IGRlZmF1bHQgYWxsb3dPdmVycmlkZShMaXN0LCAnRGVmYXVsdEJvb2xlYW5MaXN0UHJvcGVydHknKVxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgRm9ybUdyb3VwLCBMYWJlbCwgU2VsZWN0IH0gZnJvbSAnQGFkbWluanMvZGVzaWduLXN5c3RlbSdcblxuaW1wb3J0IG1hcFZhbHVlIGZyb20gJy4vbWFwLXZhbHVlJ1xuaW1wb3J0IHsgRmlsdGVyUHJvcGVydHlQcm9wcyB9IGZyb20gJy4uL2Jhc2UtcHJvcGVydHktcHJvcHMnXG5pbXBvcnQgYWxsb3dPdmVycmlkZSBmcm9tICcuLi8uLi8uLi9ob2MvYWxsb3ctb3ZlcnJpZGUnXG5cbmNvbnN0IGJvb2xWYWx1ZSA9IChzOiBzdHJpbmcpOiBib29sZWFuID0+IHtcbiAgaWYgKC90cnVlL2kudGVzdChzKSkge1xuICAgIHJldHVybiB0cnVlXG4gIH1cbiAgcmV0dXJuIGZhbHNlXG59XG5cbmNvbnN0IEZpbHRlcjogUmVhY3QuRkM8RmlsdGVyUHJvcGVydHlQcm9wcz4gPSAocHJvcHMpID0+IHtcbiAgY29uc3QgeyBwcm9wZXJ0eSwgZmlsdGVyID0ge30sIG9uQ2hhbmdlIH0gPSBwcm9wc1xuICBjb25zdCB2YWx1ZSA9IHR5cGVvZiBmaWx0ZXJbcHJvcGVydHkucGF0aF0gPT09ICd1bmRlZmluZWQnID8gJycgOiBib29sVmFsdWUoZmlsdGVyW3Byb3BlcnR5LnBhdGhdKVxuICBjb25zdCBvcHRpb25zID0gW1xuICAgIHsgdmFsdWU6IHRydWUsIGxhYmVsOiBtYXBWYWx1ZSh0cnVlKSB9LFxuICAgIHsgdmFsdWU6IGZhbHNlLCBsYWJlbDogbWFwVmFsdWUoZmFsc2UpIH0sXG4gIF1cbiAgY29uc3Qgc2VsZWN0ZWQgPSBvcHRpb25zLmZpbmQoKG8pID0+IG8udmFsdWUgPT09IHZhbHVlKVxuICBjb25zdCBoYW5kbGVDaGFuZ2UgPSAocykgPT4ge1xuICAgIGNvbnN0IG5ld1ZhbHVlID0gcyA/IHMudmFsdWUgOiB1bmRlZmluZWRcbiAgICBvbkNoYW5nZShwcm9wZXJ0eS5wYXRoLCBuZXdWYWx1ZSlcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPEZvcm1Hcm91cD5cbiAgICAgIDxMYWJlbD57cHJvcGVydHkubGFiZWx9PC9MYWJlbD5cbiAgICAgIDxTZWxlY3RcbiAgICAgICAgdmFyaWFudD1cImZpbHRlclwiXG4gICAgICAgIHZhbHVlPXt0eXBlb2Ygc2VsZWN0ZWQgPT09ICd1bmRlZmluZWQnID8gJycgOiBzZWxlY3RlZH1cbiAgICAgICAgaXNDbGVhcmFibGVcbiAgICAgICAgb3B0aW9ucz17b3B0aW9uc31cbiAgICAgICAgb25DaGFuZ2U9e2hhbmRsZUNoYW5nZX1cbiAgICAgIC8+XG4gICAgPC9Gb3JtR3JvdXA+XG4gIClcbn1cblxuZXhwb3J0IGRlZmF1bHQgYWxsb3dPdmVycmlkZShGaWx0ZXIsICdEZWZhdWx0Qm9vbGVhbkZpbHRlclByb3BlcnR5JylcbiIsImltcG9ydCB7IEN1cnJlbmN5SW5wdXQsIEN1cnJlbmN5SW5wdXRQcm9wcyB9IGZyb20gJ0BhZG1pbmpzL2Rlc2lnbi1zeXN0ZW0nXG5pbXBvcnQgUmVhY3QsIHsgRkMsIHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnXG5cbmltcG9ydCBhbGxvd092ZXJyaWRlIGZyb20gJy4uLy4uLy4uL2hvYy9hbGxvdy1vdmVycmlkZSdcblxuZXhwb3J0IHR5cGUgQ3VycmVuY3lJbnB1dFdyYXBwZXJQcm9wcyA9IHtcbiAgaWQ6IHN0cmluZztcbiAgaW5pdGlhbDogc3RyaW5nO1xuICBvcHRpb25zPzogQ3VycmVuY3lJbnB1dFByb3BzXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXR5cGVzXG4gIG9uQ2hhbmdlOiAodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCkgPT4gdm9pZDtcbn1cblxuY29uc3QgQ3VycmVuY3lJbnB1dFdyYXBwZXI6IEZDPEN1cnJlbmN5SW5wdXRXcmFwcGVyUHJvcHM+ID0gKHByb3BzKSA9PiB7XG4gIGNvbnN0IHsgaWQsIGluaXRpYWwsIG9uQ2hhbmdlLCBvcHRpb25zIH0gPSBwcm9wc1xuICBjb25zdCBbdmFsdWUsIHNldFZhbHVlXSA9IHVzZVN0YXRlPHN0cmluZyB8IHVuZGVmaW5lZD4oaW5pdGlhbClcbiAgY29uc3Qgb25WYWx1ZUNoYW5nZSA9IChjdXJyZW50VmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHZvaWQgPT4ge1xuICAgIHNldFZhbHVlKGN1cnJlbnRWYWx1ZSlcbiAgICBvbkNoYW5nZShjdXJyZW50VmFsdWUpXG4gIH1cbiAgcmV0dXJuIChcbiAgICA8Q3VycmVuY3lJbnB1dFxuICAgICAgaWQ9e2lkfVxuICAgICAgbmFtZT17aWR9XG4gICAgICB2YWx1ZT17dmFsdWV9XG4gICAgICBvblZhbHVlQ2hhbmdlPXtvblZhbHVlQ2hhbmdlfVxuICAgICAgey4uLm9wdGlvbnN9XG4gICAgLz5cbiAgKVxufVxuXG5jb25zdCBPdmVycmlkYWJsZUN1cnJlbmN5SW5wdXRXcmFwcGVyID0gYWxsb3dPdmVycmlkZShDdXJyZW5jeUlucHV0V3JhcHBlciwgJ0N1cnJlbmN5UHJvcGVydHlJbnB1dFdyYXBwZXInKVxuXG5leHBvcnQge1xuICBPdmVycmlkYWJsZUN1cnJlbmN5SW5wdXRXcmFwcGVyIGFzIEN1cnJlbmN5SW5wdXRXcmFwcGVyLFxuICBPdmVycmlkYWJsZUN1cnJlbmN5SW5wdXRXcmFwcGVyIGFzIGRlZmF1bHQsXG59XG4iLCJpbXBvcnQgeyBDdXJyZW5jeUlucHV0UHJvcHMsIEZvcm1Hcm91cCwgRm9ybU1lc3NhZ2UgfSBmcm9tICdAYWRtaW5qcy9kZXNpZ24tc3lzdGVtJ1xuaW1wb3J0IFJlYWN0LCB7IEZDLCBtZW1vIH0gZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBFZGl0UHJvcGVydHlQcm9wcyB9IGZyb20gJy4uL2Jhc2UtcHJvcGVydHktcHJvcHMnXG5pbXBvcnQgeyByZWNvcmRQcm9wZXJ0eUlzRXF1YWwgfSBmcm9tICcuLi9yZWNvcmQtcHJvcGVydHktaXMtZXF1YWwnXG5pbXBvcnQgeyBQcm9wZXJ0eUxhYmVsIH0gZnJvbSAnLi4vdXRpbHMvcHJvcGVydHktbGFiZWwnXG5pbXBvcnQgYWxsb3dPdmVycmlkZSBmcm9tICcuLi8uLi8uLi9ob2MvYWxsb3ctb3ZlcnJpZGUnXG5pbXBvcnQgeyBDdXJyZW5jeUlucHV0V3JhcHBlciB9IGZyb20gJy4vY3VycmVuY3ktaW5wdXQtd3JhcHBlcidcblxuY29uc3QgRWRpdDogRkM8RWRpdFByb3BlcnR5UHJvcHM+ID0gKHByb3BzKSA9PiB7XG4gIGNvbnN0IHsgb25DaGFuZ2UsIHByb3BlcnR5LCByZWNvcmQgfSA9IHByb3BzXG4gIGNvbnN0IHByb3BWYWx1ZSA9IHJlY29yZC5wYXJhbXM/Lltwcm9wZXJ0eS5wYXRoXSA/PyAnJ1xuICBjb25zdCBlcnJvciA9IHJlY29yZC5lcnJvcnM/Lltwcm9wZXJ0eS5wYXRoXVxuXG4gIHJldHVybiAoXG4gICAgPEZvcm1Hcm91cCBlcnJvcj17Qm9vbGVhbihlcnJvcil9PlxuICAgICAgPFByb3BlcnR5TGFiZWwgcHJvcGVydHk9e3Byb3BlcnR5fSAvPlxuICAgICAgPEN1cnJlbmN5SW5wdXRXcmFwcGVyXG4gICAgICAgIGlkPXtwcm9wZXJ0eS5wYXRofVxuICAgICAgICBpbml0aWFsPXtwcm9wVmFsdWV9XG4gICAgICAgIG9wdGlvbnM9e3Byb3BlcnR5LnByb3BzIGFzIEN1cnJlbmN5SW5wdXRQcm9wc31cbiAgICAgICAgb25DaGFuZ2U9eyh2YWx1ZSkgPT4gb25DaGFuZ2UocHJvcGVydHkucGF0aCwgdmFsdWUpfVxuICAgICAgLz5cbiAgICAgIDxGb3JtTWVzc2FnZT57ZXJyb3IgJiYgZXJyb3IubWVzc2FnZX08L0Zvcm1NZXNzYWdlPlxuICAgIDwvRm9ybUdyb3VwPlxuICApXG59XG5cbmV4cG9ydCBkZWZhdWx0IGFsbG93T3ZlcnJpZGUobWVtbyhFZGl0LCByZWNvcmRQcm9wZXJ0eUlzRXF1YWwpLCAnRGVmYXVsdEN1cnJlbmN5RWRpdFByb3BlcnR5JylcbiIsImltcG9ydCB7IEN1cnJlbmN5SW5wdXQsIEN1cnJlbmN5SW5wdXRQcm9wcywgRm9ybUdyb3VwIH0gZnJvbSAnQGFkbWluanMvZGVzaWduLXN5c3RlbSdcbmltcG9ydCBSZWFjdCwgeyBGQyB9IGZyb20gJ3JlYWN0J1xuXG5pbXBvcnQgeyBFZGl0UHJvcGVydHlQcm9wcyB9IGZyb20gJy4uL2Jhc2UtcHJvcGVydHktcHJvcHMnXG5pbXBvcnQgeyBQcm9wZXJ0eUxhYmVsIH0gZnJvbSAnLi4vdXRpbHMvcHJvcGVydHktbGFiZWwnXG5pbXBvcnQgYWxsb3dPdmVycmlkZSBmcm9tICcuLi8uLi8uLi9ob2MvYWxsb3ctb3ZlcnJpZGUnXG5cbmNvbnN0IEZpbHRlcjogRkM8RWRpdFByb3BlcnR5UHJvcHM+ID0gKHByb3BzKSA9PiB7XG4gIGNvbnN0IHsgb25DaGFuZ2UsIHByb3BlcnR5LCBmaWx0ZXIgfSA9IHByb3BzXG5cbiAgY29uc3QgaGFuZGxlQ2hhbmdlID0gKHZhbHVlKSA9PiB7XG4gICAgb25DaGFuZ2UocHJvcGVydHkucGF0aCwgdmFsdWUpXG4gIH1cblxuICByZXR1cm4gKFxuICAgIDxGb3JtR3JvdXAgdmFyaWFudD1cImZpbHRlclwiPlxuICAgICAgPFByb3BlcnR5TGFiZWwgcHJvcGVydHk9e3Byb3BlcnR5fSAvPlxuICAgICAgPEN1cnJlbmN5SW5wdXRcbiAgICAgICAgaWQ9e3Byb3BlcnR5LnBhdGh9XG4gICAgICAgIG5hbWU9e2BmaWx0ZXItJHtwcm9wZXJ0eS5wYXRofWB9XG4gICAgICAgIG9uVmFsdWVDaGFuZ2U9e2hhbmRsZUNoYW5nZX1cbiAgICAgICAgdmFsdWU9e2ZpbHRlcltwcm9wZXJ0eS5wYXRoXX1cbiAgICAgICAgey4uLnByb3BlcnR5LnByb3BzIGFzIEN1cnJlbmN5SW5wdXRQcm9wc31cbiAgICAgIC8+XG4gICAgPC9Gb3JtR3JvdXA+XG4gIClcbn1cblxuZXhwb3J0IGRlZmF1bHQgYWxsb3dPdmVycmlkZShGaWx0ZXIsICdEZWZhdWx0Q3VycmVuY3lGaWx0ZXJQcm9wZXJ0eScpXG4iLCJpbXBvcnQgeyBmb3JtYXRDdXJyZW5jeVByb3BlcnR5IH0gZnJvbSAnQGFkbWluanMvZGVzaWduLXN5c3RlbSdcblxudHlwZSBGb3JtYXRDdXJyZW5jeU9wdGlvbnMgPSBQYXJhbWV0ZXJzPHR5cGVvZiBmb3JtYXRDdXJyZW5jeVByb3BlcnR5PlswXVxuY29uc3Qgb3B0aW9uc0tleXM6IChrZXlvZiBGb3JtYXRDdXJyZW5jeU9wdGlvbnMpW10gPSBbXG4gICd2YWx1ZScsXG4gICdkZWNpbWFsU2VwYXJhdG9yJyxcbiAgJ2dyb3VwU2VwYXJhdG9yJyxcbiAgJ2Rpc2FibGVHcm91cFNlcGFyYXRvcnMnLFxuICAnaW50bENvbmZpZycsXG4gICdkZWNpbWFsU2NhbGUnLFxuICAncHJlZml4JyxcbiAgJ3N1ZmZpeCcsXG5dXG5cbmNvbnN0IHBpY2tGb3JtYXRPcHRpb25zID0gKHByb3BzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KTogRm9ybWF0Q3VycmVuY3lPcHRpb25zID0+IHtcbiAgY29uc3QgcGlja2VkUHJvcHMgPSBPYmplY3Qua2V5cyhwcm9wcykucmVkdWNlKChhY2MsIGN1cnIpID0+IHtcbiAgICBpZiAob3B0aW9uc0tleXMuaW5jbHVkZXMoY3VyciBhcyBhbnkpKSBhY2NbY3Vycl0gPSBwcm9wc1tjdXJyXVxuICAgIHJldHVybiBhY2NcbiAgfSwge30gYXMgRm9ybWF0Q3VycmVuY3lPcHRpb25zKVxuICByZXR1cm4gcGlja2VkUHJvcHNcbn1cblxuY29uc3QgZm9ybWF0VmFsdWUgPSAodmFsdWU6IHN0cmluZywgcHJvcHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fSk6IHN0cmluZyA9PiB7XG4gIGNvbnN0IGZvcm1hdE9wdGlvbnMgPSBwaWNrRm9ybWF0T3B0aW9ucyh7IHZhbHVlLCAuLi5wcm9wcyB9KVxuICByZXR1cm4gZm9ybWF0Q3VycmVuY3lQcm9wZXJ0eShmb3JtYXRPcHRpb25zKVxufVxuXG5leHBvcnQgZGVmYXVsdCBmb3JtYXRWYWx1ZVxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuXG5pbXBvcnQgZm9ybWF0VmFsdWUgZnJvbSAnLi9mb3JtYXQtdmFsdWUnXG5pbXBvcnQgYWxsb3dPdmVycmlkZSBmcm9tICcuLi8uLi8uLi9ob2MvYWxsb3ctb3ZlcnJpZGUnXG5pbXBvcnQgeyBTaG93UHJvcGVydHlQcm9wcyB9IGZyb20gJy4uL2Jhc2UtcHJvcGVydHktcHJvcHMnXG5cbmNvbnN0IExpc3Q6IFJlYWN0LkZDPFNob3dQcm9wZXJ0eVByb3BzPiA9IChwcm9wcykgPT4ge1xuICBjb25zdCB7IHByb3BlcnR5LCByZWNvcmQgfSA9IHByb3BzXG4gIGNvbnN0IHZhbHVlID0gZm9ybWF0VmFsdWUocmVjb3JkLnBhcmFtc1twcm9wZXJ0eS5wYXRoXSwgcHJvcGVydHkucHJvcHMpXG5cbiAgcmV0dXJuIDxzcGFuPnt2YWx1ZX08L3NwYW4+XG59XG5cbmV4cG9ydCBkZWZhdWx0IGFsbG93T3ZlcnJpZGUoTGlzdCwgJ0RlZmF1bHRDdXJyZW5jeUxpc3RQcm9wZXJ0eScpXG4iLCJpbXBvcnQgeyBWYWx1ZUdyb3VwIH0gZnJvbSAnQGFkbWluanMvZGVzaWduLXN5c3RlbSdcbmltcG9ydCBSZWFjdCwgeyBGQyB9IGZyb20gJ3JlYWN0J1xuXG5pbXBvcnQgeyBFZGl0UHJvcGVydHlQcm9wcyB9IGZyb20gJy4uL2Jhc2UtcHJvcGVydHktcHJvcHMnXG5pbXBvcnQgZm9ybWF0VmFsdWUgZnJvbSAnLi9mb3JtYXQtdmFsdWUnXG5pbXBvcnQgYWxsb3dPdmVycmlkZSBmcm9tICcuLi8uLi8uLi9ob2MvYWxsb3ctb3ZlcnJpZGUnXG5cbmNvbnN0IFNob3c6IEZDPEVkaXRQcm9wZXJ0eVByb3BzPiA9IChwcm9wcykgPT4ge1xuICBjb25zdCB7IHByb3BlcnR5LCByZWNvcmQgfSA9IHByb3BzXG4gIGNvbnN0IHZhbHVlID0gYCR7cmVjb3JkLnBhcmFtc1twcm9wZXJ0eS5wYXRoXX1gXG5cbiAgcmV0dXJuIChcbiAgICA8VmFsdWVHcm91cCBsYWJlbD17cHJvcGVydHkubGFiZWx9PlxuICAgICAge2Zvcm1hdFZhbHVlKHZhbHVlLCBwcm9wZXJ0eS5wcm9wcyl9XG4gICAgPC9WYWx1ZUdyb3VwPlxuICApXG59XG5cbmV4cG9ydCBkZWZhdWx0IGFsbG93T3ZlcnJpZGUoU2hvdywgJ0RlZmF1bHRDdXJyZW5jeVNob3dQcm9wZXJ0eScpXG4iLCJpbXBvcnQgUmVhY3QsIHsgbWVtbyB9IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgRGF0ZVBpY2tlciwgRm9ybUdyb3VwLCBGb3JtTWVzc2FnZSB9IGZyb20gJ0BhZG1pbmpzL2Rlc2lnbi1zeXN0ZW0nXG5cbmltcG9ydCB7IEVkaXRQcm9wZXJ0eVByb3BzIH0gZnJvbSAnLi4vYmFzZS1wcm9wZXJ0eS1wcm9wcydcbmltcG9ydCB7IHJlY29yZFByb3BlcnR5SXNFcXVhbCB9IGZyb20gJy4uL3JlY29yZC1wcm9wZXJ0eS1pcy1lcXVhbCdcbmltcG9ydCB7IFByb3BlcnR5TGFiZWwgfSBmcm9tICcuLi91dGlscy9wcm9wZXJ0eS1sYWJlbCdcbmltcG9ydCBhbGxvd092ZXJyaWRlIGZyb20gJy4uLy4uLy4uL2hvYy9hbGxvdy1vdmVycmlkZSdcblxuY29uc3QgRWRpdDogUmVhY3QuRkM8RWRpdFByb3BlcnR5UHJvcHM+ID0gKHByb3BzKSA9PiB7XG4gIGNvbnN0IHsgcHJvcGVydHksIG9uQ2hhbmdlLCByZWNvcmQgfSA9IHByb3BzXG4gIGNvbnN0IHZhbHVlID0gKHJlY29yZC5wYXJhbXMgJiYgcmVjb3JkLnBhcmFtc1twcm9wZXJ0eS5wYXRoXSkgfHwgJydcbiAgY29uc3QgZXJyb3IgPSByZWNvcmQuZXJyb3JzICYmIHJlY29yZC5lcnJvcnNbcHJvcGVydHkucGF0aF1cblxuICByZXR1cm4gKFxuICAgIDxGb3JtR3JvdXAgZXJyb3I9eyEhZXJyb3J9PlxuICAgICAgPFByb3BlcnR5TGFiZWwgcHJvcGVydHk9e3Byb3BlcnR5fSAvPlxuICAgICAgPERhdGVQaWNrZXJcbiAgICAgICAgdmFsdWU9e3ZhbHVlfVxuICAgICAgICBkaXNhYmxlZD17cHJvcGVydHkuaXNEaXNhYmxlZH1cbiAgICAgICAgb25DaGFuZ2U9eyhkYXRlKSA9PiBvbkNoYW5nZShwcm9wZXJ0eS5wYXRoLCBkYXRlKX1cbiAgICAgICAgcHJvcGVydHlUeXBlPXtwcm9wZXJ0eS50eXBlfVxuICAgICAgICB7Li4ucHJvcGVydHkucHJvcHN9XG4gICAgICAvPlxuICAgICAgPEZvcm1NZXNzYWdlPntlcnJvciAmJiBlcnJvci5tZXNzYWdlfTwvRm9ybU1lc3NhZ2U+XG4gICAgPC9Gb3JtR3JvdXA+XG4gIClcbn1cblxuZXhwb3J0IGRlZmF1bHQgYWxsb3dPdmVycmlkZShtZW1vKEVkaXQsIHJlY29yZFByb3BlcnR5SXNFcXVhbCksICdEZWZhdWx0RGF0ZXRpbWVFZGl0UHJvcGVydHknKVxuIiwiaW1wb3J0IHsgZm9ybWF0RGF0ZVByb3BlcnR5IH0gZnJvbSAnQGFkbWluanMvZGVzaWduLXN5c3RlbSdcbmltcG9ydCB7IFByb3BlcnR5VHlwZSB9IGZyb20gJy4uLy4uLy4uLy4uL2JhY2tlbmQvYWRhcHRlcnMvcHJvcGVydHkvYmFzZS1wcm9wZXJ0eSdcblxuZXhwb3J0IGRlZmF1bHQgKHZhbHVlOiBEYXRlLCBwcm9wZXJ0eVR5cGU6IFByb3BlcnR5VHlwZSk6IHN0cmluZyA9PiB7XG4gIGlmICghdmFsdWUpIHtcbiAgICByZXR1cm4gJydcbiAgfVxuICBjb25zdCBkYXRlID0gbmV3IERhdGUodmFsdWUpXG4gIGlmIChkYXRlKSB7XG4gICAgcmV0dXJuIGZvcm1hdERhdGVQcm9wZXJ0eShkYXRlLCBwcm9wZXJ0eVR5cGUpXG4gIH1cbiAgcmV0dXJuICcnXG59XG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBWYWx1ZUdyb3VwIH0gZnJvbSAnQGFkbWluanMvZGVzaWduLXN5c3RlbSdcblxuaW1wb3J0IGFsbG93T3ZlcnJpZGUgZnJvbSAnLi4vLi4vLi4vaG9jL2FsbG93LW92ZXJyaWRlJ1xuaW1wb3J0IG1hcFZhbHVlIGZyb20gJy4vbWFwLXZhbHVlJ1xuaW1wb3J0IHsgU2hvd1Byb3BlcnR5UHJvcHMgfSBmcm9tICcuLi9iYXNlLXByb3BlcnR5LXByb3BzJ1xuXG5jb25zdCBTaG93OiBSZWFjdC5GQzxTaG93UHJvcGVydHlQcm9wcz4gPSAocHJvcHMpID0+IHtcbiAgY29uc3QgeyBwcm9wZXJ0eSwgcmVjb3JkIH0gPSBwcm9wc1xuICBjb25zdCB2YWx1ZSA9IG1hcFZhbHVlKHJlY29yZC5wYXJhbXNbcHJvcGVydHkucGF0aF0sIHByb3BlcnR5LnR5cGUpXG5cbiAgcmV0dXJuIChcbiAgICA8VmFsdWVHcm91cCBsYWJlbD17cHJvcGVydHkubGFiZWx9PlxuICAgICAge3ZhbHVlfVxuICAgIDwvVmFsdWVHcm91cD5cbiAgKVxufVxuXG5leHBvcnQgZGVmYXVsdCBhbGxvd092ZXJyaWRlKFNob3csICdEZWZhdWx0RGF0ZXRpbWVTaG93UHJvcGVydHknKVxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuXG5pbXBvcnQgbWFwVmFsdWUgZnJvbSAnLi9tYXAtdmFsdWUnXG5pbXBvcnQgYWxsb3dPdmVycmlkZSBmcm9tICcuLi8uLi8uLi9ob2MvYWxsb3ctb3ZlcnJpZGUnXG5pbXBvcnQgeyBTaG93UHJvcGVydHlQcm9wcyB9IGZyb20gJy4uL2Jhc2UtcHJvcGVydHktcHJvcHMnXG5cbmNvbnN0IExpc3Q6IFJlYWN0LkZDPFNob3dQcm9wZXJ0eVByb3BzPiA9IChwcm9wcykgPT4ge1xuICBjb25zdCB7IHByb3BlcnR5LCByZWNvcmQgfSA9IHByb3BzXG4gIGNvbnN0IHZhbHVlID0gbWFwVmFsdWUocmVjb3JkLnBhcmFtc1twcm9wZXJ0eS5wYXRoXSwgcHJvcGVydHkudHlwZSlcblxuICByZXR1cm4gKFxuICAgIDxzcGFuPnt2YWx1ZX08L3NwYW4+XG4gIClcbn1cblxuZXhwb3J0IGRlZmF1bHQgYWxsb3dPdmVycmlkZShMaXN0LCAnRGVmYXVsdERhdGV0aW1lTGlzdFByb3BlcnR5JylcbiIsImltcG9ydCB7IGZsYXQgfSBmcm9tICcuLi8uLi8uLi91dGlscy9mbGF0J1xuaW1wb3J0IEJhc2VQcm9wZXJ0eSBmcm9tICcuLi8uLi9hZGFwdGVycy9wcm9wZXJ0eS9iYXNlLXByb3BlcnR5J1xuaW1wb3J0IEJhc2VSZXNvdXJjZSBmcm9tICcuLi8uLi9hZGFwdGVycy9yZXNvdXJjZS9iYXNlLXJlc291cmNlJ1xuaW1wb3J0IEJhc2VSZWNvcmQgZnJvbSAnLi4vLi4vYWRhcHRlcnMvcmVjb3JkL2Jhc2UtcmVjb3JkJ1xuXG5leHBvcnQgY29uc3QgUEFSQU1fU0VQQVJBVE9SID0gJ35+J1xuXG5leHBvcnQgdHlwZSBGaWx0ZXJFbGVtZW50ID0ge1xuICBwYXRoOiBzdHJpbmc7XG4gIHByb3BlcnR5OiBCYXNlUHJvcGVydHk7XG4gIHZhbHVlOiBzdHJpbmcgfCB7XG4gICAgZnJvbTogc3RyaW5nO1xuICAgIHRvOiBzdHJpbmc7XG4gIH07XG4gIHBvcHVsYXRlZD86IEJhc2VSZWNvcmQgfCBudWxsO1xufVxuXG5pbnRlcmZhY2UgUmVkdWNlQ2FsbGJhY2s8VD4ge1xuICAobWVtbzogVCwgZWxlbWVudDogRmlsdGVyRWxlbWVudCk6IFQ7XG59XG5cbi8qKlxuICogRmlsdGVyIG9iamVjdCB3cmFwcGluZyB1cCBzZWxlY3RlZCBmaWx0ZXJzLlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGNsYXNzIEZpbHRlciB7XG4gIHB1YmxpYyBmaWx0ZXJzOiB7W2tleTogc3RyaW5nXTogRmlsdGVyRWxlbWVudH1cblxuICBwcml2YXRlIHJlc291cmNlOiBCYXNlUmVzb3VyY2VcblxuICAvKipcbiAgICogQ2hhbmdlcyByYXcgbmVzdGVkIGZpbHRlcnMgdG8gZm9ybSBPYmplY3Q8cGF0aCwgdmFsdWU+LlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBjb25zdCBmaWx0ZXJzID0ge1xuICAgKiAgbmVzdGVkOiB7ZmllbGQ6ICdhbGEnfSxcbiAgICogICdkYXRhRmllbGR+fmZyb20nOiAnMjAxOS0wOC0xNCdcbiAgICogfVxuICAgKlxuICAgKiBjb25zdCBub3JtYWxpemVkID0gRmlsdGVyLm5vcm1hbGl6ZUZpbHRlcnMoZmlsdGVycylcbiAgICogLy8ge1xuICAgKiAvLyAgICduZXN0ZWQuZmlsdGVyJzogJ2FsYScsXG4gICAqIC8vICAgJ2RhdGFGaWVsZCc6IHtmcm9tOiAnMjAxOS0wOC0xNCd9XG4gICAqIC8vIH1cbiAgICpcbiAgICpcbiAgICogQHBhcmFtICAge09iamVjdH0gIGZpbHRlcnNcbiAgICpcbiAgICogQHJldHVybiAge09iamVjdH1cbiAgICovXG4gIHN0YXRpYyBub3JtYWxpemVLZXlzKGZpbHRlcnMpOiBNYXA8c3RyaW5nLCBhbnk+IHtcbiAgICByZXR1cm4gZmxhdC51bmZsYXR0ZW4oZmxhdC5mbGF0dGVuKGZpbHRlcnMpLCB7IGRlbGltaXRlcjogUEFSQU1fU0VQQVJBVE9SIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtICAge09iamVjdDxTdHJpbmcsT2JqZWN0IHwgU3RyaW5nPn0gIGZpbHRlcnMgICBzZWxlY3RlZCBmaWx0ZXJzXG4gICAqIEBwYXJhbSAgIHtCYXNlUmVzb3VyY2V9ICAgICAgICAgICAgICAgICAgICByZXNvdXJjZSAgICByZXNvdXJjZSB3aGljaCBpcyBmaWx0ZXJlZFxuICAgKi9cbiAgY29uc3RydWN0b3IoZmlsdGVycyA9IHt9LCByZXNvdXJjZSkge1xuICAgIHRoaXMucmVzb3VyY2UgPSByZXNvdXJjZVxuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBGaWx0ZXIubm9ybWFsaXplS2V5cyhmaWx0ZXJzKVxuICAgIHRoaXMuZmlsdGVycyA9IE9iamVjdC5rZXlzKG5vcm1hbGl6ZWQpLnJlZHVjZSgobWVtbywgcGF0aCkgPT4ge1xuICAgICAgbWVtb1twYXRoXSA9IHtcbiAgICAgICAgcGF0aCxcbiAgICAgICAgcHJvcGVydHk6IHRoaXMucmVzb3VyY2UucHJvcGVydHkocGF0aCksXG4gICAgICAgIHZhbHVlOiBub3JtYWxpemVkW3BhdGhdLFxuICAgICAgfVxuXG4gICAgICByZXR1cm4gbWVtb1xuICAgIH0sIHt9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgZmlsdGVyIGZvciBhIGdpdmVuIHByb3BlcnR5IGtleVxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30ga2V5ICAgICAgcHJvcGVydHkga2V5XG4gICAqIEByZXR1cm5zIHtGaWx0ZXIuUHJvcGVydHkgfCB1bmRlZmluZWR9XG4gICAqL1xuICBnZXQoa2V5OiBzdHJpbmcpOiBGaWx0ZXJFbGVtZW50IHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyc1trZXldXG4gIH1cblxuICAvKipcbiAgICogUG9wdWxhdGVzIGFsbCBmaWx0ZXJlZCBwcm9wZXJ0aWVzIHdoaWNoIHJlZmVycyB0byBvdGhlciByZXNvdXJjZXNcbiAgICovXG4gIGFzeW5jIHBvcHVsYXRlKCk6IFByb21pc2U8RmlsdGVyPiB7XG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHRoaXMuZmlsdGVycylcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwga2V5cy5sZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICAgIGNvbnN0IGtleSA9IGtleXNbaW5kZXhdXG4gICAgICBjb25zdCByZWZlcmVuY2VSZXNvdXJjZSA9IHRoaXMucmVzb3VyY2UuZGVjb3JhdGUoKS5nZXRQcm9wZXJ0eUJ5S2V5KGtleSk/LnJlZmVyZW5jZSgpXG4gICAgICBpZiAocmVmZXJlbmNlUmVzb3VyY2UpIHtcbiAgICAgICAgdGhpcy5maWx0ZXJzW2tleV0ucG9wdWxhdGVkID0gYXdhaXQgcmVmZXJlbmNlUmVzb3VyY2UuZmluZE9uZShcbiAgICAgICAgICB0aGlzLmZpbHRlcnNba2V5XS52YWx1ZSBhcyBzdHJpbmcsXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIHJlZHVjZTxUPihjYWxsYmFjazogUmVkdWNlQ2FsbGJhY2s8VD4sIGluaXRpYWw6IFQpOiBUIHtcbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh0aGlzLmZpbHRlcnMpLnJlZHVjZShjYWxsYmFjaywgaW5pdGlhbCB8fCB7fSBhcyBUKVxuICB9XG5cbiAgaXNWaXNpYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIU9iamVjdC5rZXlzKHRoaXMuZmlsdGVycykubGVuZ3RoXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgRmlsdGVyXG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBGb3JtR3JvdXAsIExhYmVsLCBEYXRlUGlja2VyIH0gZnJvbSAnQGFkbWluanMvZGVzaWduLXN5c3RlbSdcblxuaW1wb3J0ICogYXMgQmFja2VuZEZpbHRlciBmcm9tICcuLi8uLi8uLi8uLi9iYWNrZW5kL3V0aWxzL2ZpbHRlci9maWx0ZXInXG5pbXBvcnQgeyB1c2VUcmFuc2xhdGlvbiB9IGZyb20gJy4uLy4uLy4uL2hvb2tzL3VzZS10cmFuc2xhdGlvbidcbmltcG9ydCB7IEZpbHRlclByb3BlcnR5UHJvcHMgfSBmcm9tICcuLi9iYXNlLXByb3BlcnR5LXByb3BzJ1xuaW1wb3J0IGFsbG93T3ZlcnJpZGUgZnJvbSAnLi4vLi4vLi4vaG9jL2FsbG93LW92ZXJyaWRlJ1xuXG5jb25zdCB7IFBBUkFNX1NFUEFSQVRPUiB9ID0gQmFja2VuZEZpbHRlclxuXG5jb25zdCBGaWx0ZXI6IFJlYWN0LkZDPEZpbHRlclByb3BlcnR5UHJvcHM+ID0gKHByb3BzKSA9PiB7XG4gIGNvbnN0IHsgcHJvcGVydHksIGZpbHRlciwgb25DaGFuZ2UgfSA9IHByb3BzXG4gIGNvbnN0IHsgdHJhbnNsYXRlUHJvcGVydHkgfSA9IHVzZVRyYW5zbGF0aW9uKClcblxuICBjb25zdCBmcm9tS2V5ID0gYCR7cHJvcGVydHkucGF0aH0ke1BBUkFNX1NFUEFSQVRPUn1mcm9tYFxuICBjb25zdCB0b0tleSA9IGAke3Byb3BlcnR5LnBhdGh9JHtQQVJBTV9TRVBBUkFUT1J9dG9gXG4gIGNvbnN0IGZyb21WYWx1ZSA9IGZpbHRlcltmcm9tS2V5XVxuICBjb25zdCB0b1ZhbHVlID0gZmlsdGVyW3RvS2V5XVxuXG4gIHJldHVybiAoXG4gICAgPEZvcm1Hcm91cCB2YXJpYW50PVwiZmlsdGVyXCI+XG4gICAgICA8TGFiZWw+e3Byb3BlcnR5LmxhYmVsfTwvTGFiZWw+XG4gICAgICA8TGFiZWw+e2AtICR7dHJhbnNsYXRlUHJvcGVydHkoJ2Zyb20nKX06IGB9PC9MYWJlbD5cbiAgICAgIDxEYXRlUGlja2VyXG4gICAgICAgIHZhbHVlPXtmcm9tVmFsdWV9XG4gICAgICAgIG9uQ2hhbmdlPXsoZGF0ZSkgPT4gb25DaGFuZ2UoZnJvbUtleSwgZGF0ZSl9XG4gICAgICAgIHByb3BlcnR5VHlwZT17cHJvcGVydHkudHlwZX1cbiAgICAgIC8+XG4gICAgICA8TGFiZWwgbXQ9XCJkZWZhdWx0XCI+e2AtICR7dHJhbnNsYXRlUHJvcGVydHkoJ3RvJyl9OiBgfTwvTGFiZWw+XG4gICAgICA8RGF0ZVBpY2tlclxuICAgICAgICB2YWx1ZT17dG9WYWx1ZX1cbiAgICAgICAgb25DaGFuZ2U9eyhkYXRlKSA9PiBvbkNoYW5nZSh0b0tleSwgZGF0ZSl9XG4gICAgICAgIHByb3BlcnR5VHlwZT17cHJvcGVydHkudHlwZX1cbiAgICAgIC8+XG4gICAgPC9Gb3JtR3JvdXA+XG4gIClcbn1cblxuZXhwb3J0IGRlZmF1bHQgYWxsb3dPdmVycmlkZShGaWx0ZXIsICdEZWZhdWx0RGF0ZXRpbWVGaWx0ZXJQcm9wZXJ0eScpXG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBCYWRnZSB9IGZyb20gJ0BhZG1pbmpzL2Rlc2lnbi1zeXN0ZW0nXG5cbmltcG9ydCBhbGxvd092ZXJyaWRlIGZyb20gJy4uLy4uLy4uL2hvYy9hbGxvdy1vdmVycmlkZSdcbmltcG9ydCB7IFNob3dQcm9wZXJ0eVByb3BzIH0gZnJvbSAnLi4vYmFzZS1wcm9wZXJ0eS1wcm9wcydcblxuY29uc3QgRGVmYXVsdFByb3BlcnR5VmFsdWU6IFJlYWN0LkZDPFNob3dQcm9wZXJ0eVByb3BzPiA9IChwcm9wcykgPT4ge1xuICBjb25zdCB7IHByb3BlcnR5LCByZWNvcmQgfSA9IHByb3BzXG5cbiAgY29uc3QgcmF3VmFsdWUgPSByZWNvcmQ/LnBhcmFtc1twcm9wZXJ0eS5wYXRoXVxuXG4gIGlmICh0eXBlb2YgcmF3VmFsdWUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIGlmIChwcm9wZXJ0eS5hdmFpbGFibGVWYWx1ZXMpIHtcbiAgICBjb25zdCBvcHRpb24gPSBwcm9wZXJ0eS5hdmFpbGFibGVWYWx1ZXMuZmluZCgob3B0KSA9PiBvcHQudmFsdWUgPT09IHJhd1ZhbHVlKVxuXG4gICAgaWYgKCFvcHRpb24pIHtcbiAgICAgIHJldHVybiByYXdWYWx1ZVxuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICA8QmFkZ2U+e29wdGlvbj8ubGFiZWwgfHwgcmF3VmFsdWV9PC9CYWRnZT5cbiAgICApXG4gIH1cblxuICByZXR1cm4gcmF3VmFsdWVcbn1cblxuZXhwb3J0IGRlZmF1bHQgYWxsb3dPdmVycmlkZShEZWZhdWx0UHJvcGVydHlWYWx1ZSwgJ0RlZmF1bHRQcm9wZXJ0eVZhbHVlJylcbiIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IFZhbHVlR3JvdXAgfSBmcm9tICdAYWRtaW5qcy9kZXNpZ24tc3lzdGVtJ1xuXG5pbXBvcnQgYWxsb3dPdmVycmlkZSBmcm9tICcuLi8uLi8uLi9ob2MvYWxsb3ctb3ZlcnJpZGUnXG5pbXBvcnQgeyBTaG93UHJvcGVydHlQcm9wcyB9IGZyb20gJy4uL2Jhc2UtcHJvcGVydHktcHJvcHMnXG5pbXBvcnQgRGVmYXVsdFByb3BlcnR5VmFsdWUgZnJvbSAnLi9kZWZhdWx0LXByb3BlcnR5LXZhbHVlJ1xuXG5jb25zdCBTaG93OiBSZWFjdC5GQzxTaG93UHJvcGVydHlQcm9wcz4gPSAocHJvcHMpID0+IHtcbiAgY29uc3QgeyBwcm9wZXJ0eSB9ID0gcHJvcHNcbiAgcmV0dXJuIChcbiAgICA8VmFsdWVHcm91cCBsYWJlbD17cHJvcGVydHkubGFiZWx9PlxuICAgICAgPERlZmF1bHRQcm9wZXJ0eVZhbHVlIHsuLi5wcm9wc30gLz5cbiAgICA8L1ZhbHVlR3JvdXA+XG4gIClcbn1cblxuZXhwb3J0IGRlZmF1bHQgYWxsb3dPdmVycmlkZShTaG93LCAnRGVmYXVsdFNob3dQcm9wZXJ0eScpXG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvZXhwbGljaXQtZnVuY3Rpb24tcmV0dXJuLXR5cGUgKi9cbmltcG9ydCBSZWFjdCwgeyBGQywgdXNlU3RhdGUsIG1lbW8sIHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgSW5wdXQsIEZvcm1NZXNzYWdlLCBGb3JtR3JvdXAsIFNlbGVjdCB9IGZyb20gJ0BhZG1pbmpzL2Rlc2lnbi1zeXN0ZW0nXG5cbmltcG9ydCB7IEVkaXRQcm9wZXJ0eVByb3BzIH0gZnJvbSAnLi4vYmFzZS1wcm9wZXJ0eS1wcm9wcydcbmltcG9ydCB7IHJlY29yZFByb3BlcnR5SXNFcXVhbCB9IGZyb20gJy4uL3JlY29yZC1wcm9wZXJ0eS1pcy1lcXVhbCdcbmltcG9ydCB7IFByb3BlcnR5TGFiZWwgfSBmcm9tICcuLi91dGlscy9wcm9wZXJ0eS1sYWJlbCdcbmltcG9ydCBhbGxvd092ZXJyaWRlIGZyb20gJy4uLy4uLy4uL2hvYy9hbGxvdy1vdmVycmlkZSdcblxudHlwZSBDb21iaW5lZFByb3BzID0gRWRpdFByb3BlcnR5UHJvcHNcblxuY29uc3QgRWRpdDogRkM8Q29tYmluZWRQcm9wcz4gPSAocHJvcHMpID0+IHtcbiAgY29uc3QgeyBwcm9wZXJ0eSwgcmVjb3JkIH0gPSBwcm9wc1xuICBjb25zdCBlcnJvciA9IHJlY29yZC5lcnJvcnM/Lltwcm9wZXJ0eS5wYXRoXVxuXG4gIHJldHVybiAoXG4gICAgPEZvcm1Hcm91cCBlcnJvcj17Qm9vbGVhbihlcnJvcil9PlxuICAgICAgPFByb3BlcnR5TGFiZWwgcHJvcGVydHk9e3Byb3BlcnR5fSAvPlxuICAgICAge3Byb3BlcnR5LmF2YWlsYWJsZVZhbHVlcyA/IDxTZWxlY3RFZGl0IHsuLi5wcm9wc30gLz4gOiA8VGV4dEVkaXQgey4uLnByb3BzfSAvPn1cbiAgICAgIDxGb3JtTWVzc2FnZT57ZXJyb3IgJiYgZXJyb3IubWVzc2FnZX08L0Zvcm1NZXNzYWdlPlxuICAgIDwvRm9ybUdyb3VwPlxuICApXG59XG5cbmNvbnN0IFNlbGVjdEVkaXQ6IEZDPENvbWJpbmVkUHJvcHM+ID0gKHByb3BzKSA9PiB7XG4gIGNvbnN0IHsgcmVjb3JkLCBwcm9wZXJ0eSwgb25DaGFuZ2UgfSA9IHByb3BzXG4gIGlmICghcHJvcGVydHkuYXZhaWxhYmxlVmFsdWVzKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuICBjb25zdCBwcm9wVmFsdWUgPSByZWNvcmQucGFyYW1zPy5bcHJvcGVydHkucGF0aF0gPz8gJydcbiAgY29uc3Qgc2VsZWN0ZWQgPSBwcm9wZXJ0eS5hdmFpbGFibGVWYWx1ZXMuZmluZCgoYXYpID0+IGF2LnZhbHVlID09PSBwcm9wVmFsdWUpXG5cbiAgcmV0dXJuIChcbiAgICA8U2VsZWN0XG4gICAgICB2YWx1ZT17c2VsZWN0ZWR9XG4gICAgICBvcHRpb25zPXtwcm9wZXJ0eS5hdmFpbGFibGVWYWx1ZXN9XG4gICAgICBvbkNoYW5nZT17KHMpID0+IG9uQ2hhbmdlKHByb3BlcnR5LnBhdGgsIHM/LnZhbHVlID8/ICcnKX1cbiAgICAgIGlzRGlzYWJsZWQ9e3Byb3BlcnR5LmlzRGlzYWJsZWR9XG4gICAgICB7Li4ucHJvcGVydHkucHJvcHN9XG4gICAgLz5cbiAgKVxufVxuXG5jb25zdCBUZXh0RWRpdDogRkM8Q29tYmluZWRQcm9wcz4gPSAocHJvcHMpID0+IHtcbiAgY29uc3QgeyBwcm9wZXJ0eSwgcmVjb3JkLCBvbkNoYW5nZSB9ID0gcHJvcHNcbiAgY29uc3QgcHJvcFZhbHVlID0gcmVjb3JkLnBhcmFtcz8uW3Byb3BlcnR5LnBhdGhdID8/ICcnXG4gIGNvbnN0IFt2YWx1ZSwgc2V0VmFsdWVdID0gdXNlU3RhdGUocHJvcFZhbHVlKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHZhbHVlICE9PSBwcm9wVmFsdWUpIHtcbiAgICAgIHNldFZhbHVlKHByb3BWYWx1ZSlcbiAgICB9XG4gIH0sIFtwcm9wVmFsdWVdKVxuXG4gIHJldHVybiAoXG4gICAgPElucHV0XG4gICAgICBpZD17cHJvcGVydHkucGF0aH1cbiAgICAgIG5hbWU9e3Byb3BlcnR5LnBhdGh9XG4gICAgICByZXF1aXJlZD17cHJvcGVydHkuaXNSZXF1aXJlZH1cbiAgICAgIG9uQ2hhbmdlPXsoZSkgPT4gc2V0VmFsdWUoZS50YXJnZXQudmFsdWUpfVxuICAgICAgb25CbHVyPXsoKSA9PiBvbkNoYW5nZShwcm9wZXJ0eS5wYXRoLCB2YWx1ZSl9XG4gICAgICAvLyBoYW5kbGUgY2xpY2tpbmcgRU5URVJcbiAgICAgIG9uS2V5RG93bj17KGUpID0+IGUua2V5Q29kZSA9PT0gMTMgJiYgb25DaGFuZ2UocHJvcGVydHkucGF0aCwgdmFsdWUpfVxuICAgICAgdmFsdWU9e3ZhbHVlfVxuICAgICAgZGlzYWJsZWQ9e3Byb3BlcnR5LmlzRGlzYWJsZWR9XG4gICAgICB7Li4ucHJvcGVydHkucHJvcHN9XG4gICAgLz5cbiAgKVxufVxuXG5leHBvcnQgZGVmYXVsdCBhbGxvd092ZXJyaWRlKG1lbW8oRWRpdCwgcmVjb3JkUHJvcGVydHlJc0VxdWFsKSwgJ0RlZmF1bHRFZGl0UHJvcGVydHknKVxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgRm9ybUdyb3VwLCBMYWJlbCwgSW5wdXQsIFNlbGVjdCB9IGZyb20gJ0BhZG1pbmpzL2Rlc2lnbi1zeXN0ZW0nXG5cbmltcG9ydCBhbGxvd092ZXJyaWRlIGZyb20gJy4uLy4uLy4uL2hvYy9hbGxvdy1vdmVycmlkZSdcbmltcG9ydCB7IEZpbHRlclByb3BlcnR5UHJvcHMgfSBmcm9tICcuLi9iYXNlLXByb3BlcnR5LXByb3BzJ1xuXG5jb25zdCBGaWx0ZXI6IFJlYWN0LkZDPEZpbHRlclByb3BlcnR5UHJvcHM+ID0gKHByb3BzKSA9PiB7XG4gIGNvbnN0IHsgcHJvcGVydHksIG9uQ2hhbmdlLCBmaWx0ZXIgfSA9IHByb3BzXG5cbiAgY29uc3QgaGFuZGxlSW5wdXRDaGFuZ2UgPSAoZXZlbnQpID0+IHtcbiAgICBvbkNoYW5nZShwcm9wZXJ0eS5wYXRoLCBldmVudC50YXJnZXQudmFsdWUpXG4gIH1cblxuICBjb25zdCBoYW5kbGVTZWxlY3RDaGFuZ2UgPSAoc2VsZWN0ZWQpID0+IHtcbiAgICBjb25zdCB2YWx1ZSA9IHNlbGVjdGVkID8gc2VsZWN0ZWQudmFsdWUgOiAnJ1xuICAgIG9uQ2hhbmdlKHByb3BlcnR5LnBhdGgsIHZhbHVlKVxuICB9XG5cbiAgY29uc3QgcmVuZGVySW5wdXQgPSAoKSA9PiB7XG4gICAgY29uc3QgZmlsdGVyS2V5ID0gYGZpbHRlci0ke3Byb3BlcnR5LnBhdGh9YFxuICAgIGNvbnN0IHZhbHVlID0gZmlsdGVyW3Byb3BlcnR5LnBhdGhdIHx8ICcnXG4gICAgaWYgKHByb3BlcnR5LmF2YWlsYWJsZVZhbHVlcykge1xuICAgICAgY29uc3Qgc2VsZWN0ZWQgPSBwcm9wZXJ0eS5hdmFpbGFibGVWYWx1ZXMuZmluZCgoYXYpID0+IGF2LnZhbHVlID09PSB2YWx1ZSlcbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxTZWxlY3RcbiAgICAgICAgICB2YXJpYW50PVwiZmlsdGVyXCJcbiAgICAgICAgICB2YWx1ZT17dHlwZW9mIHNlbGVjdGVkID09PSAndW5kZWZpbmVkJyA/ICcnIDogc2VsZWN0ZWR9XG4gICAgICAgICAgaXNDbGVhcmFibGVcbiAgICAgICAgICBvcHRpb25zPXtwcm9wZXJ0eS5hdmFpbGFibGVWYWx1ZXN9XG4gICAgICAgICAgb25DaGFuZ2U9e2hhbmRsZVNlbGVjdENoYW5nZX1cbiAgICAgICAgLz5cbiAgICAgIClcbiAgICB9XG4gICAgcmV0dXJuIChcbiAgICAgIDxJbnB1dFxuICAgICAgICBuYW1lPXtmaWx0ZXJLZXl9XG4gICAgICAgIG9uQ2hhbmdlPXtoYW5kbGVJbnB1dENoYW5nZX1cbiAgICAgICAgdmFsdWU9e3ZhbHVlfVxuICAgICAgLz5cbiAgICApXG4gIH1cblxuICByZXR1cm4gKFxuICAgIDxGb3JtR3JvdXAgdmFyaWFudD1cImZpbHRlclwiPlxuICAgICAgPExhYmVsPntwcm9wZXJ0eS5sYWJlbH08L0xhYmVsPlxuICAgICAge3JlbmRlcklucHV0KCl9XG4gICAgPC9Gb3JtR3JvdXA+XG4gIClcbn1cblxuZXhwb3J0IGRlZmF1bHQgYWxsb3dPdmVycmlkZShGaWx0ZXIsICdEZWZhdWx0RmlsdGVyUHJvcGVydHknKVxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuXG5pbXBvcnQgRGVmYXVsdFByb3BlcnR5VmFsdWUgZnJvbSAnLi9kZWZhdWx0LXByb3BlcnR5LXZhbHVlJ1xuaW1wb3J0IGFsbG93T3ZlcnJpZGUgZnJvbSAnLi4vLi4vLi4vaG9jL2FsbG93LW92ZXJyaWRlJ1xuaW1wb3J0IHsgU2hvd1Byb3BlcnR5UHJvcHMgfSBmcm9tICcuLi9iYXNlLXByb3BlcnR5LXByb3BzJ1xuXG5jb25zdCBMaXN0OiBSZWFjdC5GQzxTaG93UHJvcGVydHlQcm9wcz4gPSAocHJvcHMpID0+ICg8RGVmYXVsdFByb3BlcnR5VmFsdWUgey4uLnByb3BzfSAvPilcblxuZXhwb3J0IGRlZmF1bHQgYWxsb3dPdmVycmlkZShMaXN0LCAnRGVmYXVsdExpc3RQcm9wZXJ0eScpXG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvZXhwbGljaXQtZnVuY3Rpb24tcmV0dXJuLXR5cGUgKi9cbmltcG9ydCBSZWFjdCwgeyB1c2VTdGF0ZSwgbWVtbywgdXNlRWZmZWN0IH0gZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBJbnB1dCwgRm9ybUdyb3VwLCBJbnB1dEdyb3VwLCBGb3JtTWVzc2FnZSwgQnV0dG9uLCBJY29uIH0gZnJvbSAnQGFkbWluanMvZGVzaWduLXN5c3RlbSdcblxuaW1wb3J0IHsgRWRpdFByb3BlcnR5UHJvcHMgfSBmcm9tICcuLi9iYXNlLXByb3BlcnR5LXByb3BzJ1xuaW1wb3J0IHsgcmVjb3JkUHJvcGVydHlJc0VxdWFsIH0gZnJvbSAnLi4vcmVjb3JkLXByb3BlcnR5LWlzLWVxdWFsJ1xuaW1wb3J0IHsgUHJvcGVydHlMYWJlbCB9IGZyb20gJy4uL3V0aWxzL3Byb3BlcnR5LWxhYmVsJ1xuaW1wb3J0IGFsbG93T3ZlcnJpZGUgZnJvbSAnLi4vLi4vLi4vaG9jL2FsbG93LW92ZXJyaWRlJ1xuXG5jb25zdCBFZGl0OiBSZWFjdC5GQzxFZGl0UHJvcGVydHlQcm9wcz4gPSAocHJvcHMpID0+IHtcbiAgY29uc3QgeyBwcm9wZXJ0eSwgcmVjb3JkLCBvbkNoYW5nZSB9ID0gcHJvcHNcbiAgY29uc3QgcHJvcFZhbHVlID0gcmVjb3JkLnBhcmFtc1twcm9wZXJ0eS5wYXRoXVxuICBjb25zdCBbdmFsdWUsIHNldFZhbHVlXSA9IHVzZVN0YXRlKHByb3BWYWx1ZSlcbiAgY29uc3QgZXJyb3IgPSByZWNvcmQuZXJyb3JzICYmIHJlY29yZC5lcnJvcnNbcHJvcGVydHkucGF0aF1cbiAgY29uc3QgW2lzSW5wdXQsIHNldElzSW5wdXRdID0gdXNlU3RhdGUoZmFsc2UpXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAodmFsdWUgIT09IHByb3BWYWx1ZSkge1xuICAgICAgc2V0VmFsdWUocHJvcFZhbHVlKVxuICAgIH1cbiAgfSwgW3Byb3BWYWx1ZV0pXG5cbiAgcmV0dXJuIChcbiAgICA8Rm9ybUdyb3VwIGVycm9yPXshIWVycm9yfT5cbiAgICAgIDxQcm9wZXJ0eUxhYmVsIHByb3BlcnR5PXtwcm9wZXJ0eX0gLz5cbiAgICAgIDxJbnB1dEdyb3VwPlxuICAgICAgICA8SW5wdXRcbiAgICAgICAgICB0eXBlPXtpc0lucHV0ID8gJ2lucHV0JyA6ICdwYXNzd29yZCd9XG4gICAgICAgICAgY2xhc3NOYW1lPVwiaW5wdXRcIlxuICAgICAgICAgIGlkPXtwcm9wZXJ0eS5wYXRofVxuICAgICAgICAgIG5hbWU9e3Byb3BlcnR5LnBhdGh9XG4gICAgICAgICAgb25DaGFuZ2U9eyhldmVudCkgPT4gc2V0VmFsdWUoZXZlbnQudGFyZ2V0LnZhbHVlKX1cbiAgICAgICAgICBvbkJsdXI9eygpID0+IG9uQ2hhbmdlKHByb3BlcnR5LnBhdGgsIHZhbHVlKX1cbiAgICAgICAgICBvbktleURvd249eyhlKSA9PiBlLmtleUNvZGUgPT09IDEzICYmIG9uQ2hhbmdlKHByb3BlcnR5LnBhdGgsIHZhbHVlKX1cbiAgICAgICAgICB2YWx1ZT17dmFsdWUgPz8gJyd9XG4gICAgICAgICAgZGlzYWJsZWQ9e3Byb3BlcnR5LmlzRGlzYWJsZWR9XG4gICAgICAgICAgey4uLnByb3BlcnR5LnByb3BzfVxuICAgICAgICAvPlxuICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgdmFyaWFudD17aXNJbnB1dCA/ICdwcmltYXJ5JyA6ICd0ZXh0J31cbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBzaXplPVwiaWNvblwiXG4gICAgICAgICAgb25DbGljaz17KCkgPT4gc2V0SXNJbnB1dCghaXNJbnB1dCl9XG4gICAgICAgID5cbiAgICAgICAgICA8SWNvbiBpY29uPVwiVmlld1wiIC8+XG4gICAgICAgIDwvQnV0dG9uPlxuICAgICAgPC9JbnB1dEdyb3VwPlxuICAgICAgPEZvcm1NZXNzYWdlPntlcnJvciAmJiBlcnJvci5tZXNzYWdlfTwvRm9ybU1lc3NhZ2U+XG4gICAgPC9Gb3JtR3JvdXA+XG4gIClcbn1cblxuZXhwb3J0IGRlZmF1bHQgYWxsb3dPdmVycmlkZShtZW1vKEVkaXQsIHJlY29yZFByb3BlcnR5SXNFcXVhbCksICdEZWZhdWx0UGFzc3dvcmRFZGl0UHJvcGVydHknKVxuIiwiLyogZXNsaW50LWRpc2FibGUgaW1wb3J0L3ByZWZlci1kZWZhdWx0LWV4cG9ydCAqL1xuaW1wb3J0IEVkaXQgZnJvbSAnLi9lZGl0J1xuXG5leHBvcnQge1xuICBFZGl0IGFzIGVkaXQsXG59XG4iLCJpbXBvcnQgeyBQaG9uZUlucHV0LCBQaG9uZUlucHV0UHJvcHMsIEZvcm1Hcm91cCwgRm9ybU1lc3NhZ2UgfSBmcm9tICdAYWRtaW5qcy9kZXNpZ24tc3lzdGVtJ1xuaW1wb3J0IFJlYWN0LCB7IEZDLCBtZW1vLCB1c2VFZmZlY3QsIHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnXG5cbmltcG9ydCB7IEVkaXRQcm9wZXJ0eVByb3BzIH0gZnJvbSAnLi4vYmFzZS1wcm9wZXJ0eS1wcm9wcydcbmltcG9ydCB7IHJlY29yZFByb3BlcnR5SXNFcXVhbCB9IGZyb20gJy4uL3JlY29yZC1wcm9wZXJ0eS1pcy1lcXVhbCdcbmltcG9ydCB7IFByb3BlcnR5TGFiZWwgfSBmcm9tICcuLi91dGlscy9wcm9wZXJ0eS1sYWJlbCdcbmltcG9ydCBhbGxvd092ZXJyaWRlIGZyb20gJy4uLy4uLy4uL2hvYy9hbGxvdy1vdmVycmlkZSdcblxuY29uc3QgRWRpdDogRkM8RWRpdFByb3BlcnR5UHJvcHM+ID0gKHByb3BzKSA9PiB7XG4gIGNvbnN0IHsgb25DaGFuZ2UsIHByb3BlcnR5LCByZWNvcmQgfSA9IHByb3BzXG4gIGNvbnN0IHByb3BWYWx1ZSA9IHJlY29yZC5wYXJhbXM/Lltwcm9wZXJ0eS5wYXRoXSA/PyAnJ1xuICBjb25zdCBbdmFsdWUsIHNldFZhbHVlXSA9IHVzZVN0YXRlKHByb3BWYWx1ZSlcbiAgY29uc3QgZXJyb3IgPSByZWNvcmQuZXJyb3JzPy5bcHJvcGVydHkucGF0aF1cblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICh2YWx1ZSAhPT0gcHJvcFZhbHVlKSB7XG4gICAgICBzZXRWYWx1ZShwcm9wVmFsdWUpXG4gICAgfVxuICB9LCBbcHJvcFZhbHVlXSlcblxuICByZXR1cm4gKFxuICAgIDxGb3JtR3JvdXAgZXJyb3I9e0Jvb2xlYW4oZXJyb3IpfT5cbiAgICAgIDxQcm9wZXJ0eUxhYmVsIHByb3BlcnR5PXtwcm9wZXJ0eX0gLz5cbiAgICAgIDxQaG9uZUlucHV0XG4gICAgICAgIGlkPXtwcm9wZXJ0eS5wYXRofVxuICAgICAgICBpbnB1dFByb3BzPXt7XG4gICAgICAgICAgbmFtZTogcHJvcGVydHkucGF0aCxcbiAgICAgICAgICByZXF1aXJlZDogcHJvcGVydHkuaXNSZXF1aXJlZCxcbiAgICAgICAgfX1cbiAgICAgICAgb25DaGFuZ2U9e3NldFZhbHVlfVxuICAgICAgICBvbkJsdXI9eygpOiB2b2lkID0+IG9uQ2hhbmdlKHByb3BlcnR5LnBhdGgsIHZhbHVlKX1cbiAgICAgICAgdmFsdWU9e3ZhbHVlfVxuICAgICAgICB7Li4ucHJvcGVydHkucHJvcHMgYXMgUGhvbmVJbnB1dFByb3BzfVxuICAgICAgLz5cbiAgICAgIDxGb3JtTWVzc2FnZT57ZXJyb3IgJiYgZXJyb3IubWVzc2FnZX08L0Zvcm1NZXNzYWdlPlxuICAgIDwvRm9ybUdyb3VwPlxuICApXG59XG5cbmV4cG9ydCBkZWZhdWx0IGFsbG93T3ZlcnJpZGUobWVtbyhFZGl0LCByZWNvcmRQcm9wZXJ0eUlzRXF1YWwpLCAnRGVmYXVsdFBob25lRWRpdFByb3BlcnR5JylcbiIsImltcG9ydCB7IFBob25lSW5wdXQsIFBob25lSW5wdXRQcm9wcywgRm9ybUdyb3VwIH0gZnJvbSAnQGFkbWluanMvZGVzaWduLXN5c3RlbSdcbmltcG9ydCBSZWFjdCwgeyBGQywgdXNlQ2FsbGJhY2sgfSBmcm9tICdyZWFjdCdcblxuaW1wb3J0IHsgRmlsdGVyUHJvcGVydHlQcm9wcyB9IGZyb20gJy4uL2Jhc2UtcHJvcGVydHktcHJvcHMnXG5pbXBvcnQgeyBQcm9wZXJ0eUxhYmVsIH0gZnJvbSAnLi4vdXRpbHMvcHJvcGVydHktbGFiZWwnXG5pbXBvcnQgYWxsb3dPdmVycmlkZSBmcm9tICcuLi8uLi8uLi9ob2MvYWxsb3ctb3ZlcnJpZGUnXG5cbmNvbnN0IEZpbHRlcjogRkM8RmlsdGVyUHJvcGVydHlQcm9wcz4gPSAocHJvcHMpID0+IHtcbiAgY29uc3QgeyBvbkNoYW5nZSwgcHJvcGVydHksIGZpbHRlciB9ID0gcHJvcHNcblxuICBjb25zdCBoYW5kbGVDaGFuZ2UgPSB1c2VDYWxsYmFjaygodmFsdWUpID0+IHtcbiAgICBvbkNoYW5nZShwcm9wZXJ0eS5wYXRoLCB2YWx1ZSlcbiAgfSwgW10pXG5cbiAgcmV0dXJuIChcbiAgICA8Rm9ybUdyb3VwIHZhcmlhbnQ9XCJmaWx0ZXJcIj5cbiAgICAgIDxQcm9wZXJ0eUxhYmVsIHByb3BlcnR5PXtwcm9wZXJ0eX0gLz5cbiAgICAgIDxQaG9uZUlucHV0XG4gICAgICAgIGlkPXtwcm9wZXJ0eS5wYXRofVxuICAgICAgICBpbnB1dFByb3BzPXt7XG4gICAgICAgICAgbmFtZTogYGZpbHRlci0ke3Byb3BlcnR5LnBhdGh9YCxcbiAgICAgICAgfX1cbiAgICAgICAgb25DaGFuZ2U9e2hhbmRsZUNoYW5nZX1cbiAgICAgICAgdmFsdWU9e2ZpbHRlcltwcm9wZXJ0eS5wYXRoXX1cbiAgICAgICAgey4uLnByb3BlcnR5LnByb3BzIGFzIFBob25lSW5wdXRQcm9wc31cbiAgICAgIC8+XG4gICAgPC9Gb3JtR3JvdXA+XG4gIClcbn1cblxuZXhwb3J0IGRlZmF1bHQgYWxsb3dPdmVycmlkZShGaWx0ZXIsICdEZWZhdWx0UGhvbmVGaWx0ZXJQcm9wZXJ0eScpXG4iLCJpbXBvcnQgUmVhY3QsIHsgRkMgfSBmcm9tICdyZWFjdCdcblxuaW1wb3J0IERlZmF1bHRQcm9wZXJ0eVZhbHVlIGZyb20gJy4uL2RlZmF1bHQtdHlwZS9kZWZhdWx0LXByb3BlcnR5LXZhbHVlJ1xuaW1wb3J0IGFsbG93T3ZlcnJpZGUgZnJvbSAnLi4vLi4vLi4vaG9jL2FsbG93LW92ZXJyaWRlJ1xuaW1wb3J0IHsgU2hvd1Byb3BlcnR5UHJvcHMgfSBmcm9tICcuLi9iYXNlLXByb3BlcnR5LXByb3BzJ1xuXG5jb25zdCBMaXN0OiBGQzxTaG93UHJvcGVydHlQcm9wcz4gPSAocHJvcHMpID0+IDxEZWZhdWx0UHJvcGVydHlWYWx1ZSB7Li4ucHJvcHN9IC8+XG5cbmV4cG9ydCBkZWZhdWx0IGFsbG93T3ZlcnJpZGUoTGlzdCwgJ0RlZmF1bHRQaG9uZUxpc3RQcm9wZXJ0eScpXG4iLCJpbXBvcnQgUmVhY3QsIHsgRkMgfSBmcm9tICdyZWFjdCdcbmltcG9ydCB7IFZhbHVlR3JvdXAgfSBmcm9tICdAYWRtaW5qcy9kZXNpZ24tc3lzdGVtJ1xuXG5pbXBvcnQgeyBTaG93UHJvcGVydHlQcm9wcyB9IGZyb20gJy4uL2Jhc2UtcHJvcGVydHktcHJvcHMnXG5pbXBvcnQgRGVmYXVsdFByb3BlcnR5VmFsdWUgZnJvbSAnLi4vZGVmYXVsdC10eXBlL2RlZmF1bHQtcHJvcGVydHktdmFsdWUnXG5pbXBvcnQgYWxsb3dPdmVycmlkZSBmcm9tICcuLi8uLi8uLi9ob2MvYWxsb3ctb3ZlcnJpZGUnXG5cbmNvbnN0IFNob3c6IEZDPFNob3dQcm9wZXJ0eVByb3BzPiA9IChwcm9wcykgPT4ge1xuICBjb25zdCB7IHByb3BlcnR5IH0gPSBwcm9wc1xuICByZXR1cm4gKFxuICAgIDxWYWx1ZUdyb3VwIGxhYmVsPXtwcm9wZXJ0eS5sYWJlbH0+XG4gICAgICA8RGVmYXVsdFByb3BlcnR5VmFsdWUgey4uLnByb3BzfSAvPlxuICAgIDwvVmFsdWVHcm91cD5cbiAgKVxufVxuXG5leHBvcnQgZGVmYXVsdCBhbGxvd092ZXJyaWRlKFNob3csICdEZWZhdWx0UGhvbmVTaG93UHJvcGVydHknKVxuIiwiaW1wb3J0IFJlYWN0LCB7IEZDLCB1c2VTdGF0ZSwgdXNlRWZmZWN0LCB1c2VNZW1vLCBtZW1vIH0gZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBGb3JtR3JvdXAsIEZvcm1NZXNzYWdlLCBTZWxlY3RBc3luYyB9IGZyb20gJ0BhZG1pbmpzL2Rlc2lnbi1zeXN0ZW0nXG5cbmltcG9ydCBBcGlDbGllbnQgZnJvbSAnLi4vLi4vLi4vdXRpbHMvYXBpLWNsaWVudCdcbmltcG9ydCB7IEVkaXRQcm9wZXJ0eVByb3BzLCBTZWxlY3RSZWNvcmQgfSBmcm9tICcuLi9iYXNlLXByb3BlcnR5LXByb3BzJ1xuaW1wb3J0IHsgUmVjb3JkSlNPTiB9IGZyb20gJy4uLy4uLy4uL2ludGVyZmFjZXMnXG5pbXBvcnQgeyBQcm9wZXJ0eUxhYmVsIH0gZnJvbSAnLi4vdXRpbHMvcHJvcGVydHktbGFiZWwnXG5pbXBvcnQgeyBmbGF0IH0gZnJvbSAnLi4vLi4vLi4vLi4vdXRpbHMvZmxhdCdcbmltcG9ydCB7IHJlY29yZFByb3BlcnR5SXNFcXVhbCB9IGZyb20gJy4uL3JlY29yZC1wcm9wZXJ0eS1pcy1lcXVhbCdcbmltcG9ydCBhbGxvd092ZXJyaWRlIGZyb20gJy4uLy4uLy4uL2hvYy9hbGxvdy1vdmVycmlkZSdcblxudHlwZSBDb21iaW5lZFByb3BzID0gRWRpdFByb3BlcnR5UHJvcHNcbnR5cGUgU2VsZWN0UmVjb3JkRW5oYW5jZWQgPSBTZWxlY3RSZWNvcmQgJiB7XG4gIHJlY29yZDogUmVjb3JkSlNPTjtcbn1cblxuY29uc3QgRWRpdDogRkM8Q29tYmluZWRQcm9wcz4gPSAocHJvcHMpID0+IHtcbiAgY29uc3QgeyBvbkNoYW5nZSwgcHJvcGVydHksIHJlY29yZCB9ID0gcHJvcHNcbiAgY29uc3QgeyByZWZlcmVuY2U6IHJlc291cmNlSWQgfSA9IHByb3BlcnR5XG5cbiAgaWYgKCFyZXNvdXJjZUlkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcmVmZXJlbmNlIHJlc291cmNlIGluIHByb3BlcnR5ICcke3Byb3BlcnR5LnBhdGh9J2ApXG4gIH1cblxuICBjb25zdCBoYW5kbGVDaGFuZ2UgPSAoc2VsZWN0ZWQ6IFNlbGVjdFJlY29yZEVuaGFuY2VkKTogdm9pZCA9PiB7XG4gICAgaWYgKHNlbGVjdGVkKSB7XG4gICAgICBvbkNoYW5nZShwcm9wZXJ0eS5wYXRoLCBzZWxlY3RlZC52YWx1ZSwgc2VsZWN0ZWQucmVjb3JkKVxuICAgIH0gZWxzZSB7XG4gICAgICBvbkNoYW5nZShwcm9wZXJ0eS5wYXRoLCBudWxsKVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGxvYWRPcHRpb25zID0gYXN5bmMgKGlucHV0VmFsdWU6IHN0cmluZyk6IFByb21pc2U8U2VsZWN0UmVjb3JkRW5oYW5jZWRbXT4gPT4ge1xuICAgIGNvbnN0IGFwaSA9IG5ldyBBcGlDbGllbnQoKVxuXG4gICAgY29uc3Qgb3B0aW9uUmVjb3JkcyA9IGF3YWl0IGFwaS5zZWFyY2hSZWNvcmRzKHtcbiAgICAgIHJlc291cmNlSWQsXG4gICAgICBxdWVyeTogaW5wdXRWYWx1ZSxcbiAgICB9KVxuICAgIHJldHVybiBvcHRpb25SZWNvcmRzLm1hcCgob3B0aW9uUmVjb3JkOiBSZWNvcmRKU09OKSA9PiAoe1xuICAgICAgdmFsdWU6IG9wdGlvblJlY29yZC5pZCxcbiAgICAgIGxhYmVsOiBvcHRpb25SZWNvcmQudGl0bGUsXG4gICAgICByZWNvcmQ6IG9wdGlvblJlY29yZCxcbiAgICB9KSlcbiAgfVxuICBjb25zdCBlcnJvciA9IHJlY29yZD8uZXJyb3JzW3Byb3BlcnR5LnBhdGhdXG5cbiAgY29uc3Qgc2VsZWN0ZWRJZCA9IHVzZU1lbW8oXG4gICAgKCkgPT4gZmxhdC5nZXQocmVjb3JkPy5wYXJhbXMsIHByb3BlcnR5LnBhdGgpIGFzIHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBbcmVjb3JkXSxcbiAgKVxuICBjb25zdCBbbG9hZGVkUmVjb3JkLCBzZXRMb2FkZWRSZWNvcmRdID0gdXNlU3RhdGU8UmVjb3JkSlNPTiB8IHVuZGVmaW5lZD4oKVxuICBjb25zdCBbbG9hZGluZ1JlY29yZCwgc2V0TG9hZGluZ1JlY29yZF0gPSB1c2VTdGF0ZSgwKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHNlbGVjdGVkSWQpIHtcbiAgICAgIHNldExvYWRpbmdSZWNvcmQoKGMpID0+IGMgKyAxKVxuICAgICAgY29uc3QgYXBpID0gbmV3IEFwaUNsaWVudCgpXG4gICAgICBhcGkucmVjb3JkQWN0aW9uKHtcbiAgICAgICAgYWN0aW9uTmFtZTogJ3Nob3cnLFxuICAgICAgICByZXNvdXJjZUlkLFxuICAgICAgICByZWNvcmRJZDogc2VsZWN0ZWRJZCxcbiAgICAgIH0pLnRoZW4oKHsgZGF0YSB9OiBhbnkpID0+IHtcbiAgICAgICAgc2V0TG9hZGVkUmVjb3JkKGRhdGEucmVjb3JkKVxuICAgICAgfSkuZmluYWxseSgoKSA9PiB7XG4gICAgICAgIHNldExvYWRpbmdSZWNvcmQoKGMpID0+IGMgLSAxKVxuICAgICAgfSlcbiAgICB9XG4gIH0sIFtzZWxlY3RlZElkLCByZXNvdXJjZUlkXSlcblxuICBjb25zdCBzZWxlY3RlZFZhbHVlID0gbG9hZGVkUmVjb3JkXG4gIGNvbnN0IHNlbGVjdGVkT3B0aW9uID0gKHNlbGVjdGVkSWQgJiYgc2VsZWN0ZWRWYWx1ZSkgPyB7XG4gICAgdmFsdWU6IHNlbGVjdGVkVmFsdWUuaWQsXG4gICAgbGFiZWw6IHNlbGVjdGVkVmFsdWUudGl0bGUsXG4gIH0gOiB7XG4gICAgdmFsdWU6ICcnLFxuICAgIGxhYmVsOiAnJyxcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPEZvcm1Hcm91cCBlcnJvcj17Qm9vbGVhbihlcnJvcil9PlxuICAgICAgPFByb3BlcnR5TGFiZWwgcHJvcGVydHk9e3Byb3BlcnR5fSAvPlxuICAgICAgPFNlbGVjdEFzeW5jXG4gICAgICAgIGNhY2hlT3B0aW9uc1xuICAgICAgICB2YWx1ZT17c2VsZWN0ZWRPcHRpb259XG4gICAgICAgIGRlZmF1bHRPcHRpb25zXG4gICAgICAgIGxvYWRPcHRpb25zPXtsb2FkT3B0aW9uc31cbiAgICAgICAgb25DaGFuZ2U9e2hhbmRsZUNoYW5nZX1cbiAgICAgICAgaXNDbGVhcmFibGVcbiAgICAgICAgaXNEaXNhYmxlZD17cHJvcGVydHkuaXNEaXNhYmxlZH1cbiAgICAgICAgaXNMb2FkaW5nPXshIWxvYWRpbmdSZWNvcmR9XG4gICAgICAgIHsuLi5wcm9wZXJ0eS5wcm9wc31cbiAgICAgIC8+XG4gICAgICA8Rm9ybU1lc3NhZ2U+e2Vycm9yPy5tZXNzYWdlfTwvRm9ybU1lc3NhZ2U+XG4gICAgPC9Gb3JtR3JvdXA+XG4gIClcbn1cblxuZXhwb3J0IGRlZmF1bHQgYWxsb3dPdmVycmlkZShtZW1vKEVkaXQsIHJlY29yZFByb3BlcnR5SXNFcXVhbCksICdEZWZhdWx0UmVmZXJlbmNlRWRpdFByb3BlcnR5JylcbiIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCBzdHlsZWQgZnJvbSAnc3R5bGVkLWNvbXBvbmVudHMnXG5pbXBvcnQgeyBMaW5rIH0gZnJvbSAncmVhY3Qtcm91dGVyLWRvbSdcbmltcG9ydCB7IEJ1dHRvbkNTUyB9IGZyb20gJ0BhZG1pbmpzL2Rlc2lnbi1zeXN0ZW0nXG5cbmltcG9ydCBWaWV3SGVscGVycyBmcm9tICcuLi8uLi8uLi8uLi9iYWNrZW5kL3V0aWxzL3ZpZXctaGVscGVycy92aWV3LWhlbHBlcnMnXG5pbXBvcnQgYWxsb3dPdmVycmlkZSBmcm9tICcuLi8uLi8uLi9ob2MvYWxsb3ctb3ZlcnJpZGUnXG5pbXBvcnQgeyBTaG93UHJvcGVydHlQcm9wcyB9IGZyb20gJy4uL2Jhc2UtcHJvcGVydHktcHJvcHMnXG5cbmNvbnN0IFN0eWxlZExpbmsgPSBzdHlsZWQ8YW55PihMaW5rKWBcbiAgJHtCdXR0b25DU1N9O1xuICBwYWRkaW5nLWxlZnQ6ICR7KHsgdGhlbWUgfSk6IHN0cmluZyA9PiB0aGVtZS5zcGFjZS54c307XG4gIHBhZGRpbmctcmlnaHQ6ICR7KHsgdGhlbWUgfSk6IHN0cmluZyA9PiB0aGVtZS5zcGFjZS54c307XG5gXG5cbnR5cGUgUHJvcHMgPSBQaWNrPFNob3dQcm9wZXJ0eVByb3BzLCAncHJvcGVydHknIHwgJ3JlY29yZCc+XG5cbmNvbnN0IFJlZmVyZW5jZVZhbHVlOiBSZWFjdC5GQzxQcm9wcz4gPSAocHJvcHMpID0+IHtcbiAgY29uc3QgeyBwcm9wZXJ0eSwgcmVjb3JkIH0gPSBwcm9wc1xuXG4gIGNvbnN0IGggPSBuZXcgVmlld0hlbHBlcnMoKVxuICBjb25zdCByZWZJZCA9IHJlY29yZC5wYXJhbXNbcHJvcGVydHkucGF0aF1cbiAgY29uc3QgcG9wdWxhdGVkID0gcmVjb3JkLnBvcHVsYXRlZFtwcm9wZXJ0eS5wYXRoXVxuICBjb25zdCB2YWx1ZSA9IChwb3B1bGF0ZWQgJiYgcG9wdWxhdGVkLnRpdGxlKSB8fCByZWZJZFxuXG4gIGlmICghcHJvcGVydHkucmVmZXJlbmNlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBwcm9wZXJ0eTogXCIke3Byb3BlcnR5LnBhdGh9XCIgZG9lcyBub3QgaGF2ZSBhIHJlZmVyZW5jZWApXG4gIH1cblxuICBpZiAocG9wdWxhdGVkICYmIHBvcHVsYXRlZC5yZWNvcmRBY3Rpb25zLmZpbmQoKGEpID0+IGEubmFtZSA9PT0gJ3Nob3cnKSkge1xuICAgIGNvbnN0IGhyZWYgPSBoLnJlY29yZEFjdGlvblVybCh7XG4gICAgICByZXNvdXJjZUlkOiBwcm9wZXJ0eS5yZWZlcmVuY2UsIHJlY29yZElkOiByZWZJZCwgYWN0aW9uTmFtZTogJ3Nob3cnLFxuICAgIH0pXG4gICAgcmV0dXJuIChcbiAgICAgIDxTdHlsZWRMaW5rIHZhcmlhbnQ9XCJ0ZXh0XCIgdG89e2hyZWZ9Pnt2YWx1ZX08L1N0eWxlZExpbms+XG4gICAgKVxuICB9XG4gIHJldHVybiAoXG4gICAgPHNwYW4+e3ZhbHVlfTwvc3Bhbj5cbiAgKVxufVxuXG5leHBvcnQgZGVmYXVsdCBhbGxvd092ZXJyaWRlKFJlZmVyZW5jZVZhbHVlLCAnRGVmYXVsdFJlZmVyZW5jZVZhbHVlJylcbiIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IFZhbHVlR3JvdXAgfSBmcm9tICdAYWRtaW5qcy9kZXNpZ24tc3lzdGVtJ1xuXG5pbXBvcnQgUmVmZXJlbmNlVmFsdWUgZnJvbSAnLi9yZWZlcmVuY2UtdmFsdWUnXG5pbXBvcnQgeyBTaG93UHJvcGVydHlQcm9wcyB9IGZyb20gJy4uL2Jhc2UtcHJvcGVydHktcHJvcHMnXG5pbXBvcnQgYWxsb3dPdmVycmlkZSBmcm9tICcuLi8uLi8uLi9ob2MvYWxsb3ctb3ZlcnJpZGUnXG5cbmNvbnN0IFNob3c6IFJlYWN0LkZDPFNob3dQcm9wZXJ0eVByb3BzPiA9IChwcm9wcykgPT4ge1xuICBjb25zdCB7IHByb3BlcnR5LCByZWNvcmQgfSA9IHByb3BzXG5cbiAgcmV0dXJuIChcbiAgICA8VmFsdWVHcm91cCBsYWJlbD17cHJvcGVydHkubGFiZWx9PlxuICAgICAgPFJlZmVyZW5jZVZhbHVlXG4gICAgICAgIHByb3BlcnR5PXtwcm9wZXJ0eX1cbiAgICAgICAgcmVjb3JkPXtyZWNvcmR9XG4gICAgICAvPlxuICAgIDwvVmFsdWVHcm91cD5cbiAgKVxufVxuXG5leHBvcnQgZGVmYXVsdCBhbGxvd092ZXJyaWRlKFNob3csICdEZWZhdWx0UmVmZXJlbmNlU2hvd1Byb3BlcnR5JylcbiIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcblxuaW1wb3J0IFJlZmVyZW5jZVZhbHVlIGZyb20gJy4vcmVmZXJlbmNlLXZhbHVlJ1xuaW1wb3J0IHsgU2hvd1Byb3BlcnR5UHJvcHMgfSBmcm9tICcuLi9iYXNlLXByb3BlcnR5LXByb3BzJ1xuaW1wb3J0IGFsbG93T3ZlcnJpZGUgZnJvbSAnLi4vLi4vLi4vaG9jL2FsbG93LW92ZXJyaWRlJ1xuXG5jb25zdCBMaXN0OiBSZWFjdC5GQzxTaG93UHJvcGVydHlQcm9wcz4gPSAocHJvcHMpID0+IChcbiAgPFJlZmVyZW5jZVZhbHVlIHsuLi5wcm9wc30gLz5cbilcblxuZXhwb3J0IGRlZmF1bHQgYWxsb3dPdmVycmlkZShMaXN0LCAnRGVmYXVsdFJlZmVyZW5jZUxpc3RQcm9wZXJ0eScpXG4iLCJpbXBvcnQgUmVhY3QsIHsgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCdcbmltcG9ydCB7IEZvcm1Hcm91cCwgTGFiZWwsIFNlbGVjdEFzeW5jIH0gZnJvbSAnQGFkbWluanMvZGVzaWduLXN5c3RlbSdcblxuaW1wb3J0IEFwaUNsaWVudCBmcm9tICcuLi8uLi8uLi91dGlscy9hcGktY2xpZW50J1xuaW1wb3J0IHsgRmlsdGVyUHJvcGVydHlQcm9wcywgU2VsZWN0UmVjb3JkIH0gZnJvbSAnLi4vYmFzZS1wcm9wZXJ0eS1wcm9wcydcbmltcG9ydCBhbGxvd092ZXJyaWRlIGZyb20gJy4uLy4uLy4uL2hvYy9hbGxvdy1vdmVycmlkZSdcblxudHlwZSBTZWxlY3RPcHRpb25zID0gQXJyYXk8e3ZhbHVlOiBzdHJpbmcgfCBudW1iZXI7IGxhYmVsOiBzdHJpbmcgfT5cblxuY29uc3QgRmlsdGVyOiBSZWFjdC5GQzxGaWx0ZXJQcm9wZXJ0eVByb3BzPiA9IChwcm9wcykgPT4ge1xuICBjb25zdCB7IHByb3BlcnR5LCBmaWx0ZXIsIG9uQ2hhbmdlIH0gPSBwcm9wc1xuICBjb25zdCBbb3B0aW9ucywgc2V0T3B0aW9uc10gPSB1c2VTdGF0ZTxTZWxlY3RPcHRpb25zPihbXSlcblxuICBjb25zdCBhcGkgPSBuZXcgQXBpQ2xpZW50KClcblxuICBjb25zdCBoYW5kbGVDaGFuZ2UgPSAoc2VsZWN0ZWQ6IFNlbGVjdFJlY29yZCkgPT4ge1xuICAgIG9uQ2hhbmdlKHByb3BlcnR5LnBhdGgsIHNlbGVjdGVkID8gc2VsZWN0ZWQudmFsdWUgOiAnJylcbiAgfVxuXG4gIGNvbnN0IGxvYWRPcHRpb25zID0gYXN5bmMgKGlucHV0VmFsdWU6IHN0cmluZyk6IFByb21pc2U8U2VsZWN0T3B0aW9ucz4gPT4ge1xuICAgIGNvbnN0IHJlY29yZHMgPSBhd2FpdCBhcGkuc2VhcmNoUmVjb3Jkcyh7XG4gICAgICByZXNvdXJjZUlkOiBwcm9wZXJ0eS5yZWZlcmVuY2UgYXMgc3RyaW5nLFxuICAgICAgcXVlcnk6IGlucHV0VmFsdWUsXG4gICAgfSlcblxuICAgIGNvbnN0IGxvYWRlZE9wdGlvbnMgPSByZWNvcmRzLm1hcCgocikgPT4gKHsgdmFsdWU6IHIuaWQsIGxhYmVsOiByLnRpdGxlIH0pKVxuICAgIHNldE9wdGlvbnMobG9hZGVkT3B0aW9ucylcblxuICAgIHJldHVybiBsb2FkZWRPcHRpb25zXG4gIH1cblxuICBjb25zdCB2YWx1ZSA9IHR5cGVvZiBmaWx0ZXJbcHJvcGVydHkucGF0aF0gPT09ICd1bmRlZmluZWQnID8gJycgOiBmaWx0ZXJbcHJvcGVydHkucGF0aF1cbiAgY29uc3Qgc2VsZWN0ZWQgPSAob3B0aW9ucyB8fCBbXSkuZmluZCgobykgPT4gU3RyaW5nKG8udmFsdWUpID09PSBTdHJpbmcodmFsdWUpKVxuXG4gIHJldHVybiAoXG4gICAgPEZvcm1Hcm91cD5cbiAgICAgIDxMYWJlbD57cHJvcGVydHkubGFiZWx9PC9MYWJlbD5cbiAgICAgIDxTZWxlY3RBc3luY1xuICAgICAgICB2YXJpYW50PVwiZmlsdGVyXCJcbiAgICAgICAgdmFsdWU9e3R5cGVvZiBzZWxlY3RlZCA9PT0gJ3VuZGVmaW5lZCcgPyAnJyA6IHNlbGVjdGVkfVxuICAgICAgICBpc0NsZWFyYWJsZVxuICAgICAgICBjYWNoZU9wdGlvbnNcbiAgICAgICAgbG9hZE9wdGlvbnM9e2xvYWRPcHRpb25zfVxuICAgICAgICBvbkNoYW5nZT17aGFuZGxlQ2hhbmdlfVxuICAgICAgICBkZWZhdWx0T3B0aW9uc1xuICAgICAgLz5cbiAgICA8L0Zvcm1Hcm91cD5cbiAgKVxufVxuXG5leHBvcnQgZGVmYXVsdCBhbGxvd092ZXJyaWRlKEZpbHRlciwgJ0RlZmF1bHRSZWZlcmVuY2VGaWx0ZXJQcm9wZXJ0eScpXG4iLCJpbXBvcnQgeyBGb3JtR3JvdXAsIEZvcm1NZXNzYWdlLCBSaWNoVGV4dEVkaXRvciB9IGZyb20gJ0BhZG1pbmpzL2Rlc2lnbi1zeXN0ZW0nXG5pbXBvcnQgUmVhY3QsIHsgRkMsIG1lbW8sIHVzZUNhbGxiYWNrIH0gZnJvbSAncmVhY3QnXG5cbmltcG9ydCB7IEVkaXRQcm9wZXJ0eVByb3BzIH0gZnJvbSAnLi4vYmFzZS1wcm9wZXJ0eS1wcm9wcydcbmltcG9ydCB7IHJlY29yZFByb3BlcnR5SXNFcXVhbCB9IGZyb20gJy4uL3JlY29yZC1wcm9wZXJ0eS1pcy1lcXVhbCdcbmltcG9ydCB7IFByb3BlcnR5TGFiZWwgfSBmcm9tICcuLi91dGlscy9wcm9wZXJ0eS1sYWJlbCdcbmltcG9ydCBhbGxvd092ZXJyaWRlIGZyb20gJy4uLy4uLy4uL2hvYy9hbGxvdy1vdmVycmlkZSdcblxuY29uc3QgRWRpdDogRkM8RWRpdFByb3BlcnR5UHJvcHM+ID0gKHByb3BzKSA9PiB7XG4gIGNvbnN0IHsgcHJvcGVydHksIHJlY29yZCwgb25DaGFuZ2UgfSA9IHByb3BzXG4gIGNvbnN0IHZhbHVlID0gcmVjb3JkLnBhcmFtcz8uW3Byb3BlcnR5LnBhdGhdXG4gIGNvbnN0IGVycm9yID0gcmVjb3JkLmVycm9ycyAmJiByZWNvcmQuZXJyb3JzW3Byb3BlcnR5LnBhdGhdXG5cbiAgY29uc3QgaGFuZGxlVXBkYXRlID0gdXNlQ2FsbGJhY2soKG5ld1ZhbHVlOiBzdHJpbmcpID0+IHtcbiAgICBvbkNoYW5nZShwcm9wZXJ0eS5wYXRoLCBuZXdWYWx1ZSlcbiAgfSwgW10pXG5cbiAgcmV0dXJuIChcbiAgICA8Rm9ybUdyb3VwIGVycm9yPXtCb29sZWFuKGVycm9yKX0+XG4gICAgICA8UHJvcGVydHlMYWJlbCBwcm9wZXJ0eT17cHJvcGVydHl9IC8+XG4gICAgICA8UmljaFRleHRFZGl0b3IgdmFsdWU9e3ZhbHVlfSBvbkNoYW5nZT17aGFuZGxlVXBkYXRlfSBvcHRpb25zPXtwcm9wZXJ0eS5wcm9wc30gLz5cbiAgICAgIDxGb3JtTWVzc2FnZT57ZXJyb3I/Lm1lc3NhZ2V9PC9Gb3JtTWVzc2FnZT5cbiAgICA8L0Zvcm1Hcm91cD5cbiAgKVxufVxuXG5leHBvcnQgZGVmYXVsdCBhbGxvd092ZXJyaWRlKG1lbW8oRWRpdCwgcmVjb3JkUHJvcGVydHlJc0VxdWFsKSwgJ0RlZmF1bHRSaWNodGV4dEVkaXRQcm9wZXJ0eScpXG4iLCIvKipcbiAqIGNzc2ZpbHRlclxuICpcbiAqIEBhdXRob3Ig6ICB6Zu3PGxlaXpvbmdtaW5AZ21haWwuY29tPlxuICovXG5cbmZ1bmN0aW9uIGdldERlZmF1bHRXaGl0ZUxpc3QgKCkge1xuICAvLyDnmb3lkI3ljZXlgLzor7TmmI7vvJpcbiAgLy8gdHJ1ZTog5YWB6K646K+l5bGe5oCnXG4gIC8vIEZ1bmN0aW9uOiBmdW5jdGlvbiAodmFsKSB7IH0g6L+U5ZuedHJ1ZeihqOekuuWFgeiuuOivpeWxnuaAp++8jOWFtuS7luWAvOWdh+ihqOekuuS4jeWFgeiuuFxuICAvLyBSZWdFeHA6IHJlZ2V4cC50ZXN0KHZhbCkg6L+U5ZuedHJ1ZeihqOekuuWFgeiuuOivpeWxnuaAp++8jOWFtuS7luWAvOWdh+ihqOekuuS4jeWFgeiuuFxuICAvLyDpmaTkuIrpnaLliJflh7rnmoTlgLzlpJblnYfooajnpLrkuI3lhYHorrhcbiAgdmFyIHdoaXRlTGlzdCA9IHt9O1xuXG4gIHdoaXRlTGlzdFsnYWxpZ24tY29udGVudCddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IGF1dG9cbiAgd2hpdGVMaXN0WydhbGlnbi1pdGVtcyddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IGF1dG9cbiAgd2hpdGVMaXN0WydhbGlnbi1zZWxmJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogYXV0b1xuICB3aGl0ZUxpc3RbJ2FsaWdubWVudC1hZGp1c3QnXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBhdXRvXG4gIHdoaXRlTGlzdFsnYWxpZ25tZW50LWJhc2VsaW5lJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogYmFzZWxpbmVcbiAgd2hpdGVMaXN0WydhbGwnXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBkZXBlbmRpbmcgb24gaW5kaXZpZHVhbCBwcm9wZXJ0aWVzXG4gIHdoaXRlTGlzdFsnYW5jaG9yLXBvaW50J10gPSBmYWxzZTsgLy8gZGVmYXVsdDogbm9uZVxuICB3aGl0ZUxpc3RbJ2FuaW1hdGlvbiddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IGRlcGVuZGluZyBvbiBpbmRpdmlkdWFsIHByb3BlcnRpZXNcbiAgd2hpdGVMaXN0WydhbmltYXRpb24tZGVsYXknXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiAwXG4gIHdoaXRlTGlzdFsnYW5pbWF0aW9uLWRpcmVjdGlvbiddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IG5vcm1hbFxuICB3aGl0ZUxpc3RbJ2FuaW1hdGlvbi1kdXJhdGlvbiddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IDBcbiAgd2hpdGVMaXN0WydhbmltYXRpb24tZmlsbC1tb2RlJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogbm9uZVxuICB3aGl0ZUxpc3RbJ2FuaW1hdGlvbi1pdGVyYXRpb24tY291bnQnXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiAxXG4gIHdoaXRlTGlzdFsnYW5pbWF0aW9uLW5hbWUnXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBub25lXG4gIHdoaXRlTGlzdFsnYW5pbWF0aW9uLXBsYXktc3RhdGUnXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBydW5uaW5nXG4gIHdoaXRlTGlzdFsnYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbiddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IGVhc2VcbiAgd2hpdGVMaXN0WydhemltdXRoJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogY2VudGVyXG4gIHdoaXRlTGlzdFsnYmFja2ZhY2UtdmlzaWJpbGl0eSddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IHZpc2libGVcbiAgd2hpdGVMaXN0WydiYWNrZ3JvdW5kJ10gPSB0cnVlOyAvLyBkZWZhdWx0OiBkZXBlbmRpbmcgb24gaW5kaXZpZHVhbCBwcm9wZXJ0aWVzXG4gIHdoaXRlTGlzdFsnYmFja2dyb3VuZC1hdHRhY2htZW50J10gPSB0cnVlOyAvLyBkZWZhdWx0OiBzY3JvbGxcbiAgd2hpdGVMaXN0WydiYWNrZ3JvdW5kLWNsaXAnXSA9IHRydWU7IC8vIGRlZmF1bHQ6IGJvcmRlci1ib3hcbiAgd2hpdGVMaXN0WydiYWNrZ3JvdW5kLWNvbG9yJ10gPSB0cnVlOyAvLyBkZWZhdWx0OiB0cmFuc3BhcmVudFxuICB3aGl0ZUxpc3RbJ2JhY2tncm91bmQtaW1hZ2UnXSA9IHRydWU7IC8vIGRlZmF1bHQ6IG5vbmVcbiAgd2hpdGVMaXN0WydiYWNrZ3JvdW5kLW9yaWdpbiddID0gdHJ1ZTsgLy8gZGVmYXVsdDogcGFkZGluZy1ib3hcbiAgd2hpdGVMaXN0WydiYWNrZ3JvdW5kLXBvc2l0aW9uJ10gPSB0cnVlOyAvLyBkZWZhdWx0OiAwJSAwJVxuICB3aGl0ZUxpc3RbJ2JhY2tncm91bmQtcmVwZWF0J10gPSB0cnVlOyAvLyBkZWZhdWx0OiByZXBlYXRcbiAgd2hpdGVMaXN0WydiYWNrZ3JvdW5kLXNpemUnXSA9IHRydWU7IC8vIGRlZmF1bHQ6IGF1dG9cbiAgd2hpdGVMaXN0WydiYXNlbGluZS1zaGlmdCddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IGJhc2VsaW5lXG4gIHdoaXRlTGlzdFsnYmluZGluZyddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IG5vbmVcbiAgd2hpdGVMaXN0WydibGVlZCddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IDZwdFxuICB3aGl0ZUxpc3RbJ2Jvb2ttYXJrLWxhYmVsJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogY29udGVudCgpXG4gIHdoaXRlTGlzdFsnYm9va21hcmstbGV2ZWwnXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBub25lXG4gIHdoaXRlTGlzdFsnYm9va21hcmstc3RhdGUnXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBvcGVuXG4gIHdoaXRlTGlzdFsnYm9yZGVyJ10gPSB0cnVlOyAvLyBkZWZhdWx0OiBkZXBlbmRpbmcgb24gaW5kaXZpZHVhbCBwcm9wZXJ0aWVzXG4gIHdoaXRlTGlzdFsnYm9yZGVyLWJvdHRvbSddID0gdHJ1ZTsgLy8gZGVmYXVsdDogZGVwZW5kaW5nIG9uIGluZGl2aWR1YWwgcHJvcGVydGllc1xuICB3aGl0ZUxpc3RbJ2JvcmRlci1ib3R0b20tY29sb3InXSA9IHRydWU7IC8vIGRlZmF1bHQ6IGN1cnJlbnQgY29sb3JcbiAgd2hpdGVMaXN0Wydib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzJ10gPSB0cnVlOyAvLyBkZWZhdWx0OiAwXG4gIHdoaXRlTGlzdFsnYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXMnXSA9IHRydWU7IC8vIGRlZmF1bHQ6IDBcbiAgd2hpdGVMaXN0Wydib3JkZXItYm90dG9tLXN0eWxlJ10gPSB0cnVlOyAvLyBkZWZhdWx0OiBub25lXG4gIHdoaXRlTGlzdFsnYm9yZGVyLWJvdHRvbS13aWR0aCddID0gdHJ1ZTsgLy8gZGVmYXVsdDogbWVkaXVtXG4gIHdoaXRlTGlzdFsnYm9yZGVyLWNvbGxhcHNlJ10gPSB0cnVlOyAvLyBkZWZhdWx0OiBzZXBhcmF0ZVxuICB3aGl0ZUxpc3RbJ2JvcmRlci1jb2xvciddID0gdHJ1ZTsgLy8gZGVmYXVsdDogZGVwZW5kaW5nIG9uIGluZGl2aWR1YWwgcHJvcGVydGllc1xuICB3aGl0ZUxpc3RbJ2JvcmRlci1pbWFnZSddID0gdHJ1ZTsgLy8gZGVmYXVsdDogbm9uZVxuICB3aGl0ZUxpc3RbJ2JvcmRlci1pbWFnZS1vdXRzZXQnXSA9IHRydWU7IC8vIGRlZmF1bHQ6IDBcbiAgd2hpdGVMaXN0Wydib3JkZXItaW1hZ2UtcmVwZWF0J10gPSB0cnVlOyAvLyBkZWZhdWx0OiBzdHJldGNoXG4gIHdoaXRlTGlzdFsnYm9yZGVyLWltYWdlLXNsaWNlJ10gPSB0cnVlOyAvLyBkZWZhdWx0OiAxMDAlXG4gIHdoaXRlTGlzdFsnYm9yZGVyLWltYWdlLXNvdXJjZSddID0gdHJ1ZTsgLy8gZGVmYXVsdDogbm9uZVxuICB3aGl0ZUxpc3RbJ2JvcmRlci1pbWFnZS13aWR0aCddID0gdHJ1ZTsgLy8gZGVmYXVsdDogMVxuICB3aGl0ZUxpc3RbJ2JvcmRlci1sZWZ0J10gPSB0cnVlOyAvLyBkZWZhdWx0OiBkZXBlbmRpbmcgb24gaW5kaXZpZHVhbCBwcm9wZXJ0aWVzXG4gIHdoaXRlTGlzdFsnYm9yZGVyLWxlZnQtY29sb3InXSA9IHRydWU7IC8vIGRlZmF1bHQ6IGN1cnJlbnQgY29sb3JcbiAgd2hpdGVMaXN0Wydib3JkZXItbGVmdC1zdHlsZSddID0gdHJ1ZTsgLy8gZGVmYXVsdDogbm9uZVxuICB3aGl0ZUxpc3RbJ2JvcmRlci1sZWZ0LXdpZHRoJ10gPSB0cnVlOyAvLyBkZWZhdWx0OiBtZWRpdW1cbiAgd2hpdGVMaXN0Wydib3JkZXItcmFkaXVzJ10gPSB0cnVlOyAvLyBkZWZhdWx0OiAwXG4gIHdoaXRlTGlzdFsnYm9yZGVyLXJpZ2h0J10gPSB0cnVlOyAvLyBkZWZhdWx0OiBkZXBlbmRpbmcgb24gaW5kaXZpZHVhbCBwcm9wZXJ0aWVzXG4gIHdoaXRlTGlzdFsnYm9yZGVyLXJpZ2h0LWNvbG9yJ10gPSB0cnVlOyAvLyBkZWZhdWx0OiBjdXJyZW50IGNvbG9yXG4gIHdoaXRlTGlzdFsnYm9yZGVyLXJpZ2h0LXN0eWxlJ10gPSB0cnVlOyAvLyBkZWZhdWx0OiBub25lXG4gIHdoaXRlTGlzdFsnYm9yZGVyLXJpZ2h0LXdpZHRoJ10gPSB0cnVlOyAvLyBkZWZhdWx0OiBtZWRpdW1cbiAgd2hpdGVMaXN0Wydib3JkZXItc3BhY2luZyddID0gdHJ1ZTsgLy8gZGVmYXVsdDogMFxuICB3aGl0ZUxpc3RbJ2JvcmRlci1zdHlsZSddID0gdHJ1ZTsgLy8gZGVmYXVsdDogZGVwZW5kaW5nIG9uIGluZGl2aWR1YWwgcHJvcGVydGllc1xuICB3aGl0ZUxpc3RbJ2JvcmRlci10b3AnXSA9IHRydWU7IC8vIGRlZmF1bHQ6IGRlcGVuZGluZyBvbiBpbmRpdmlkdWFsIHByb3BlcnRpZXNcbiAgd2hpdGVMaXN0Wydib3JkZXItdG9wLWNvbG9yJ10gPSB0cnVlOyAvLyBkZWZhdWx0OiBjdXJyZW50IGNvbG9yXG4gIHdoaXRlTGlzdFsnYm9yZGVyLXRvcC1sZWZ0LXJhZGl1cyddID0gdHJ1ZTsgLy8gZGVmYXVsdDogMFxuICB3aGl0ZUxpc3RbJ2JvcmRlci10b3AtcmlnaHQtcmFkaXVzJ10gPSB0cnVlOyAvLyBkZWZhdWx0OiAwXG4gIHdoaXRlTGlzdFsnYm9yZGVyLXRvcC1zdHlsZSddID0gdHJ1ZTsgLy8gZGVmYXVsdDogbm9uZVxuICB3aGl0ZUxpc3RbJ2JvcmRlci10b3Atd2lkdGgnXSA9IHRydWU7IC8vIGRlZmF1bHQ6IG1lZGl1bVxuICB3aGl0ZUxpc3RbJ2JvcmRlci13aWR0aCddID0gdHJ1ZTsgLy8gZGVmYXVsdDogZGVwZW5kaW5nIG9uIGluZGl2aWR1YWwgcHJvcGVydGllc1xuICB3aGl0ZUxpc3RbJ2JvdHRvbSddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IGF1dG9cbiAgd2hpdGVMaXN0Wydib3gtZGVjb3JhdGlvbi1icmVhayddID0gdHJ1ZTsgLy8gZGVmYXVsdDogc2xpY2VcbiAgd2hpdGVMaXN0Wydib3gtc2hhZG93J10gPSB0cnVlOyAvLyBkZWZhdWx0OiBub25lXG4gIHdoaXRlTGlzdFsnYm94LXNpemluZyddID0gdHJ1ZTsgLy8gZGVmYXVsdDogY29udGVudC1ib3hcbiAgd2hpdGVMaXN0Wydib3gtc25hcCddID0gdHJ1ZTsgLy8gZGVmYXVsdDogbm9uZVxuICB3aGl0ZUxpc3RbJ2JveC1zdXBwcmVzcyddID0gdHJ1ZTsgLy8gZGVmYXVsdDogc2hvd1xuICB3aGl0ZUxpc3RbJ2JyZWFrLWFmdGVyJ10gPSB0cnVlOyAvLyBkZWZhdWx0OiBhdXRvXG4gIHdoaXRlTGlzdFsnYnJlYWstYmVmb3JlJ10gPSB0cnVlOyAvLyBkZWZhdWx0OiBhdXRvXG4gIHdoaXRlTGlzdFsnYnJlYWstaW5zaWRlJ10gPSB0cnVlOyAvLyBkZWZhdWx0OiBhdXRvXG4gIHdoaXRlTGlzdFsnY2FwdGlvbi1zaWRlJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogdG9wXG4gIHdoaXRlTGlzdFsnY2hhaW5zJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogbm9uZVxuICB3aGl0ZUxpc3RbJ2NsZWFyJ10gPSB0cnVlOyAvLyBkZWZhdWx0OiBub25lXG4gIHdoaXRlTGlzdFsnY2xpcCddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IGF1dG9cbiAgd2hpdGVMaXN0WydjbGlwLXBhdGgnXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBub25lXG4gIHdoaXRlTGlzdFsnY2xpcC1ydWxlJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogbm9uemVyb1xuICB3aGl0ZUxpc3RbJ2NvbG9yJ10gPSB0cnVlOyAvLyBkZWZhdWx0OiBpbXBsZW1lbnRhdGlvbiBkZXBlbmRlbnRcbiAgd2hpdGVMaXN0Wydjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnMnXSA9IHRydWU7IC8vIGRlZmF1bHQ6IGF1dG9cbiAgd2hpdGVMaXN0Wydjb2x1bW4tY291bnQnXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBhdXRvXG4gIHdoaXRlTGlzdFsnY29sdW1uLWZpbGwnXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBiYWxhbmNlXG4gIHdoaXRlTGlzdFsnY29sdW1uLWdhcCddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IG5vcm1hbFxuICB3aGl0ZUxpc3RbJ2NvbHVtbi1ydWxlJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogZGVwZW5kaW5nIG9uIGluZGl2aWR1YWwgcHJvcGVydGllc1xuICB3aGl0ZUxpc3RbJ2NvbHVtbi1ydWxlLWNvbG9yJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogY3VycmVudCBjb2xvclxuICB3aGl0ZUxpc3RbJ2NvbHVtbi1ydWxlLXN0eWxlJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogbWVkaXVtXG4gIHdoaXRlTGlzdFsnY29sdW1uLXJ1bGUtd2lkdGgnXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBtZWRpdW1cbiAgd2hpdGVMaXN0Wydjb2x1bW4tc3BhbiddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IG5vbmVcbiAgd2hpdGVMaXN0Wydjb2x1bW4td2lkdGgnXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBhdXRvXG4gIHdoaXRlTGlzdFsnY29sdW1ucyddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IGRlcGVuZGluZyBvbiBpbmRpdmlkdWFsIHByb3BlcnRpZXNcbiAgd2hpdGVMaXN0Wydjb250YWluJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogbm9uZVxuICB3aGl0ZUxpc3RbJ2NvbnRlbnQnXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBub3JtYWxcbiAgd2hpdGVMaXN0Wydjb3VudGVyLWluY3JlbWVudCddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IG5vbmVcbiAgd2hpdGVMaXN0Wydjb3VudGVyLXJlc2V0J10gPSBmYWxzZTsgLy8gZGVmYXVsdDogbm9uZVxuICB3aGl0ZUxpc3RbJ2NvdW50ZXItc2V0J10gPSBmYWxzZTsgLy8gZGVmYXVsdDogbm9uZVxuICB3aGl0ZUxpc3RbJ2Nyb3AnXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBhdXRvXG4gIHdoaXRlTGlzdFsnY3VlJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogZGVwZW5kaW5nIG9uIGluZGl2aWR1YWwgcHJvcGVydGllc1xuICB3aGl0ZUxpc3RbJ2N1ZS1hZnRlciddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IG5vbmVcbiAgd2hpdGVMaXN0WydjdWUtYmVmb3JlJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogbm9uZVxuICB3aGl0ZUxpc3RbJ2N1cnNvciddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IGF1dG9cbiAgd2hpdGVMaXN0WydkaXJlY3Rpb24nXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBsdHJcbiAgd2hpdGVMaXN0WydkaXNwbGF5J10gPSB0cnVlOyAvLyBkZWZhdWx0OiBkZXBlbmRpbmcgb24gaW5kaXZpZHVhbCBwcm9wZXJ0aWVzXG4gIHdoaXRlTGlzdFsnZGlzcGxheS1pbnNpZGUnXSA9IHRydWU7IC8vIGRlZmF1bHQ6IGF1dG9cbiAgd2hpdGVMaXN0WydkaXNwbGF5LWxpc3QnXSA9IHRydWU7IC8vIGRlZmF1bHQ6IG5vbmVcbiAgd2hpdGVMaXN0WydkaXNwbGF5LW91dHNpZGUnXSA9IHRydWU7IC8vIGRlZmF1bHQ6IGlubGluZS1sZXZlbFxuICB3aGl0ZUxpc3RbJ2RvbWluYW50LWJhc2VsaW5lJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogYXV0b1xuICB3aGl0ZUxpc3RbJ2VsZXZhdGlvbiddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IGxldmVsXG4gIHdoaXRlTGlzdFsnZW1wdHktY2VsbHMnXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBzaG93XG4gIHdoaXRlTGlzdFsnZmlsdGVyJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogbm9uZVxuICB3aGl0ZUxpc3RbJ2ZsZXgnXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBkZXBlbmRpbmcgb24gaW5kaXZpZHVhbCBwcm9wZXJ0aWVzXG4gIHdoaXRlTGlzdFsnZmxleC1iYXNpcyddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IGF1dG9cbiAgd2hpdGVMaXN0WydmbGV4LWRpcmVjdGlvbiddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IHJvd1xuICB3aGl0ZUxpc3RbJ2ZsZXgtZmxvdyddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IGRlcGVuZGluZyBvbiBpbmRpdmlkdWFsIHByb3BlcnRpZXNcbiAgd2hpdGVMaXN0WydmbGV4LWdyb3cnXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiAwXG4gIHdoaXRlTGlzdFsnZmxleC1zaHJpbmsnXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiAxXG4gIHdoaXRlTGlzdFsnZmxleC13cmFwJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogbm93cmFwXG4gIHdoaXRlTGlzdFsnZmxvYXQnXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBub25lXG4gIHdoaXRlTGlzdFsnZmxvYXQtb2Zmc2V0J10gPSBmYWxzZTsgLy8gZGVmYXVsdDogMCAwXG4gIHdoaXRlTGlzdFsnZmxvb2QtY29sb3InXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBibGFja1xuICB3aGl0ZUxpc3RbJ2Zsb29kLW9wYWNpdHknXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiAxXG4gIHdoaXRlTGlzdFsnZmxvdy1mcm9tJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogbm9uZVxuICB3aGl0ZUxpc3RbJ2Zsb3ctaW50byddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IG5vbmVcbiAgd2hpdGVMaXN0Wydmb250J10gPSB0cnVlOyAvLyBkZWZhdWx0OiBkZXBlbmRpbmcgb24gaW5kaXZpZHVhbCBwcm9wZXJ0aWVzXG4gIHdoaXRlTGlzdFsnZm9udC1mYW1pbHknXSA9IHRydWU7IC8vIGRlZmF1bHQ6IGltcGxlbWVudGF0aW9uIGRlcGVuZGVudFxuICB3aGl0ZUxpc3RbJ2ZvbnQtZmVhdHVyZS1zZXR0aW5ncyddID0gdHJ1ZTsgLy8gZGVmYXVsdDogbm9ybWFsXG4gIHdoaXRlTGlzdFsnZm9udC1rZXJuaW5nJ10gPSB0cnVlOyAvLyBkZWZhdWx0OiBhdXRvXG4gIHdoaXRlTGlzdFsnZm9udC1sYW5ndWFnZS1vdmVycmlkZSddID0gdHJ1ZTsgLy8gZGVmYXVsdDogbm9ybWFsXG4gIHdoaXRlTGlzdFsnZm9udC1zaXplJ10gPSB0cnVlOyAvLyBkZWZhdWx0OiBtZWRpdW1cbiAgd2hpdGVMaXN0Wydmb250LXNpemUtYWRqdXN0J10gPSB0cnVlOyAvLyBkZWZhdWx0OiBub25lXG4gIHdoaXRlTGlzdFsnZm9udC1zdHJldGNoJ10gPSB0cnVlOyAvLyBkZWZhdWx0OiBub3JtYWxcbiAgd2hpdGVMaXN0Wydmb250LXN0eWxlJ10gPSB0cnVlOyAvLyBkZWZhdWx0OiBub3JtYWxcbiAgd2hpdGVMaXN0Wydmb250LXN5bnRoZXNpcyddID0gdHJ1ZTsgLy8gZGVmYXVsdDogd2VpZ2h0IHN0eWxlXG4gIHdoaXRlTGlzdFsnZm9udC12YXJpYW50J10gPSB0cnVlOyAvLyBkZWZhdWx0OiBub3JtYWxcbiAgd2hpdGVMaXN0Wydmb250LXZhcmlhbnQtYWx0ZXJuYXRlcyddID0gdHJ1ZTsgLy8gZGVmYXVsdDogbm9ybWFsXG4gIHdoaXRlTGlzdFsnZm9udC12YXJpYW50LWNhcHMnXSA9IHRydWU7IC8vIGRlZmF1bHQ6IG5vcm1hbFxuICB3aGl0ZUxpc3RbJ2ZvbnQtdmFyaWFudC1lYXN0LWFzaWFuJ10gPSB0cnVlOyAvLyBkZWZhdWx0OiBub3JtYWxcbiAgd2hpdGVMaXN0Wydmb250LXZhcmlhbnQtbGlnYXR1cmVzJ10gPSB0cnVlOyAvLyBkZWZhdWx0OiBub3JtYWxcbiAgd2hpdGVMaXN0Wydmb250LXZhcmlhbnQtbnVtZXJpYyddID0gdHJ1ZTsgLy8gZGVmYXVsdDogbm9ybWFsXG4gIHdoaXRlTGlzdFsnZm9udC12YXJpYW50LXBvc2l0aW9uJ10gPSB0cnVlOyAvLyBkZWZhdWx0OiBub3JtYWxcbiAgd2hpdGVMaXN0Wydmb250LXdlaWdodCddID0gdHJ1ZTsgLy8gZGVmYXVsdDogbm9ybWFsXG4gIHdoaXRlTGlzdFsnZ3JpZCddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IGRlcGVuZGluZyBvbiBpbmRpdmlkdWFsIHByb3BlcnRpZXNcbiAgd2hpdGVMaXN0WydncmlkLWFyZWEnXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBkZXBlbmRpbmcgb24gaW5kaXZpZHVhbCBwcm9wZXJ0aWVzXG4gIHdoaXRlTGlzdFsnZ3JpZC1hdXRvLWNvbHVtbnMnXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBhdXRvXG4gIHdoaXRlTGlzdFsnZ3JpZC1hdXRvLWZsb3cnXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBub25lXG4gIHdoaXRlTGlzdFsnZ3JpZC1hdXRvLXJvd3MnXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBhdXRvXG4gIHdoaXRlTGlzdFsnZ3JpZC1jb2x1bW4nXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBkZXBlbmRpbmcgb24gaW5kaXZpZHVhbCBwcm9wZXJ0aWVzXG4gIHdoaXRlTGlzdFsnZ3JpZC1jb2x1bW4tZW5kJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogYXV0b1xuICB3aGl0ZUxpc3RbJ2dyaWQtY29sdW1uLXN0YXJ0J10gPSBmYWxzZTsgLy8gZGVmYXVsdDogYXV0b1xuICB3aGl0ZUxpc3RbJ2dyaWQtcm93J10gPSBmYWxzZTsgLy8gZGVmYXVsdDogZGVwZW5kaW5nIG9uIGluZGl2aWR1YWwgcHJvcGVydGllc1xuICB3aGl0ZUxpc3RbJ2dyaWQtcm93LWVuZCddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IGF1dG9cbiAgd2hpdGVMaXN0WydncmlkLXJvdy1zdGFydCddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IGF1dG9cbiAgd2hpdGVMaXN0WydncmlkLXRlbXBsYXRlJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogZGVwZW5kaW5nIG9uIGluZGl2aWR1YWwgcHJvcGVydGllc1xuICB3aGl0ZUxpc3RbJ2dyaWQtdGVtcGxhdGUtYXJlYXMnXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBub25lXG4gIHdoaXRlTGlzdFsnZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogbm9uZVxuICB3aGl0ZUxpc3RbJ2dyaWQtdGVtcGxhdGUtcm93cyddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IG5vbmVcbiAgd2hpdGVMaXN0WydoYW5naW5nLXB1bmN0dWF0aW9uJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogbm9uZVxuICB3aGl0ZUxpc3RbJ2hlaWdodCddID0gdHJ1ZTsgLy8gZGVmYXVsdDogYXV0b1xuICB3aGl0ZUxpc3RbJ2h5cGhlbnMnXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBtYW51YWxcbiAgd2hpdGVMaXN0WydpY29uJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogYXV0b1xuICB3aGl0ZUxpc3RbJ2ltYWdlLW9yaWVudGF0aW9uJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogYXV0b1xuICB3aGl0ZUxpc3RbJ2ltYWdlLXJlc29sdXRpb24nXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBub3JtYWxcbiAgd2hpdGVMaXN0WydpbWUtbW9kZSddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IGF1dG9cbiAgd2hpdGVMaXN0Wydpbml0aWFsLWxldHRlcnMnXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBub3JtYWxcbiAgd2hpdGVMaXN0WydpbmxpbmUtYm94LWFsaWduJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogbGFzdFxuICB3aGl0ZUxpc3RbJ2p1c3RpZnktY29udGVudCddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IGF1dG9cbiAgd2hpdGVMaXN0WydqdXN0aWZ5LWl0ZW1zJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogYXV0b1xuICB3aGl0ZUxpc3RbJ2p1c3RpZnktc2VsZiddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IGF1dG9cbiAgd2hpdGVMaXN0WydsZWZ0J10gPSBmYWxzZTsgLy8gZGVmYXVsdDogYXV0b1xuICB3aGl0ZUxpc3RbJ2xldHRlci1zcGFjaW5nJ10gPSB0cnVlOyAvLyBkZWZhdWx0OiBub3JtYWxcbiAgd2hpdGVMaXN0WydsaWdodGluZy1jb2xvciddID0gdHJ1ZTsgLy8gZGVmYXVsdDogd2hpdGVcbiAgd2hpdGVMaXN0WydsaW5lLWJveC1jb250YWluJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogYmxvY2sgaW5saW5lIHJlcGxhY2VkXG4gIHdoaXRlTGlzdFsnbGluZS1icmVhayddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IGF1dG9cbiAgd2hpdGVMaXN0WydsaW5lLWdyaWQnXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBtYXRjaC1wYXJlbnRcbiAgd2hpdGVMaXN0WydsaW5lLWhlaWdodCddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IG5vcm1hbFxuICB3aGl0ZUxpc3RbJ2xpbmUtc25hcCddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IG5vbmVcbiAgd2hpdGVMaXN0WydsaW5lLXN0YWNraW5nJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogZGVwZW5kaW5nIG9uIGluZGl2aWR1YWwgcHJvcGVydGllc1xuICB3aGl0ZUxpc3RbJ2xpbmUtc3RhY2tpbmctcnVieSddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IGV4Y2x1ZGUtcnVieVxuICB3aGl0ZUxpc3RbJ2xpbmUtc3RhY2tpbmctc2hpZnQnXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBjb25zaWRlci1zaGlmdHNcbiAgd2hpdGVMaXN0WydsaW5lLXN0YWNraW5nLXN0cmF0ZWd5J10gPSBmYWxzZTsgLy8gZGVmYXVsdDogaW5saW5lLWxpbmUtaGVpZ2h0XG4gIHdoaXRlTGlzdFsnbGlzdC1zdHlsZSddID0gdHJ1ZTsgLy8gZGVmYXVsdDogZGVwZW5kaW5nIG9uIGluZGl2aWR1YWwgcHJvcGVydGllc1xuICB3aGl0ZUxpc3RbJ2xpc3Qtc3R5bGUtaW1hZ2UnXSA9IHRydWU7IC8vIGRlZmF1bHQ6IG5vbmVcbiAgd2hpdGVMaXN0WydsaXN0LXN0eWxlLXBvc2l0aW9uJ10gPSB0cnVlOyAvLyBkZWZhdWx0OiBvdXRzaWRlXG4gIHdoaXRlTGlzdFsnbGlzdC1zdHlsZS10eXBlJ10gPSB0cnVlOyAvLyBkZWZhdWx0OiBkaXNjXG4gIHdoaXRlTGlzdFsnbWFyZ2luJ10gPSB0cnVlOyAvLyBkZWZhdWx0OiBkZXBlbmRpbmcgb24gaW5kaXZpZHVhbCBwcm9wZXJ0aWVzXG4gIHdoaXRlTGlzdFsnbWFyZ2luLWJvdHRvbSddID0gdHJ1ZTsgLy8gZGVmYXVsdDogMFxuICB3aGl0ZUxpc3RbJ21hcmdpbi1sZWZ0J10gPSB0cnVlOyAvLyBkZWZhdWx0OiAwXG4gIHdoaXRlTGlzdFsnbWFyZ2luLXJpZ2h0J10gPSB0cnVlOyAvLyBkZWZhdWx0OiAwXG4gIHdoaXRlTGlzdFsnbWFyZ2luLXRvcCddID0gdHJ1ZTsgLy8gZGVmYXVsdDogMFxuICB3aGl0ZUxpc3RbJ21hcmtlci1vZmZzZXQnXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBhdXRvXG4gIHdoaXRlTGlzdFsnbWFya2VyLXNpZGUnXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBsaXN0LWl0ZW1cbiAgd2hpdGVMaXN0WydtYXJrcyddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IG5vbmVcbiAgd2hpdGVMaXN0WydtYXNrJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogYm9yZGVyLWJveFxuICB3aGl0ZUxpc3RbJ21hc2stYm94J10gPSBmYWxzZTsgLy8gZGVmYXVsdDogc2VlIGluZGl2aWR1YWwgcHJvcGVydGllc1xuICB3aGl0ZUxpc3RbJ21hc2stYm94LW91dHNldCddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IDBcbiAgd2hpdGVMaXN0WydtYXNrLWJveC1yZXBlYXQnXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBzdHJldGNoXG4gIHdoaXRlTGlzdFsnbWFzay1ib3gtc2xpY2UnXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiAwIGZpbGxcbiAgd2hpdGVMaXN0WydtYXNrLWJveC1zb3VyY2UnXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBub25lXG4gIHdoaXRlTGlzdFsnbWFzay1ib3gtd2lkdGgnXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBhdXRvXG4gIHdoaXRlTGlzdFsnbWFzay1jbGlwJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogYm9yZGVyLWJveFxuICB3aGl0ZUxpc3RbJ21hc2staW1hZ2UnXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBub25lXG4gIHdoaXRlTGlzdFsnbWFzay1vcmlnaW4nXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBib3JkZXItYm94XG4gIHdoaXRlTGlzdFsnbWFzay1wb3NpdGlvbiddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IGNlbnRlclxuICB3aGl0ZUxpc3RbJ21hc2stcmVwZWF0J10gPSBmYWxzZTsgLy8gZGVmYXVsdDogbm8tcmVwZWF0XG4gIHdoaXRlTGlzdFsnbWFzay1zaXplJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogYm9yZGVyLWJveFxuICB3aGl0ZUxpc3RbJ21hc2stc291cmNlLXR5cGUnXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBhdXRvXG4gIHdoaXRlTGlzdFsnbWFzay10eXBlJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogbHVtaW5hbmNlXG4gIHdoaXRlTGlzdFsnbWF4LWhlaWdodCddID0gdHJ1ZTsgLy8gZGVmYXVsdDogbm9uZVxuICB3aGl0ZUxpc3RbJ21heC1saW5lcyddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IG5vbmVcbiAgd2hpdGVMaXN0WydtYXgtd2lkdGgnXSA9IHRydWU7IC8vIGRlZmF1bHQ6IG5vbmVcbiAgd2hpdGVMaXN0WydtaW4taGVpZ2h0J10gPSB0cnVlOyAvLyBkZWZhdWx0OiAwXG4gIHdoaXRlTGlzdFsnbWluLXdpZHRoJ10gPSB0cnVlOyAvLyBkZWZhdWx0OiAwXG4gIHdoaXRlTGlzdFsnbW92ZS10byddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IG5vcm1hbFxuICB3aGl0ZUxpc3RbJ25hdi1kb3duJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogYXV0b1xuICB3aGl0ZUxpc3RbJ25hdi1pbmRleCddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IGF1dG9cbiAgd2hpdGVMaXN0WyduYXYtbGVmdCddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IGF1dG9cbiAgd2hpdGVMaXN0WyduYXYtcmlnaHQnXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBhdXRvXG4gIHdoaXRlTGlzdFsnbmF2LXVwJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogYXV0b1xuICB3aGl0ZUxpc3RbJ29iamVjdC1maXQnXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBmaWxsXG4gIHdoaXRlTGlzdFsnb2JqZWN0LXBvc2l0aW9uJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogNTAlIDUwJVxuICB3aGl0ZUxpc3RbJ29wYWNpdHknXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiAxXG4gIHdoaXRlTGlzdFsnb3JkZXInXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiAwXG4gIHdoaXRlTGlzdFsnb3JwaGFucyddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IDJcbiAgd2hpdGVMaXN0WydvdXRsaW5lJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogZGVwZW5kaW5nIG9uIGluZGl2aWR1YWwgcHJvcGVydGllc1xuICB3aGl0ZUxpc3RbJ291dGxpbmUtY29sb3InXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBpbnZlcnRcbiAgd2hpdGVMaXN0WydvdXRsaW5lLW9mZnNldCddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IDBcbiAgd2hpdGVMaXN0WydvdXRsaW5lLXN0eWxlJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogbm9uZVxuICB3aGl0ZUxpc3RbJ291dGxpbmUtd2lkdGgnXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBtZWRpdW1cbiAgd2hpdGVMaXN0WydvdmVyZmxvdyddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IGRlcGVuZGluZyBvbiBpbmRpdmlkdWFsIHByb3BlcnRpZXNcbiAgd2hpdGVMaXN0WydvdmVyZmxvdy13cmFwJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogbm9ybWFsXG4gIHdoaXRlTGlzdFsnb3ZlcmZsb3cteCddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IHZpc2libGVcbiAgd2hpdGVMaXN0WydvdmVyZmxvdy15J10gPSBmYWxzZTsgLy8gZGVmYXVsdDogdmlzaWJsZVxuICB3aGl0ZUxpc3RbJ3BhZGRpbmcnXSA9IHRydWU7IC8vIGRlZmF1bHQ6IGRlcGVuZGluZyBvbiBpbmRpdmlkdWFsIHByb3BlcnRpZXNcbiAgd2hpdGVMaXN0WydwYWRkaW5nLWJvdHRvbSddID0gdHJ1ZTsgLy8gZGVmYXVsdDogMFxuICB3aGl0ZUxpc3RbJ3BhZGRpbmctbGVmdCddID0gdHJ1ZTsgLy8gZGVmYXVsdDogMFxuICB3aGl0ZUxpc3RbJ3BhZGRpbmctcmlnaHQnXSA9IHRydWU7IC8vIGRlZmF1bHQ6IDBcbiAgd2hpdGVMaXN0WydwYWRkaW5nLXRvcCddID0gdHJ1ZTsgLy8gZGVmYXVsdDogMFxuICB3aGl0ZUxpc3RbJ3BhZ2UnXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBhdXRvXG4gIHdoaXRlTGlzdFsncGFnZS1icmVhay1hZnRlciddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IGF1dG9cbiAgd2hpdGVMaXN0WydwYWdlLWJyZWFrLWJlZm9yZSddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IGF1dG9cbiAgd2hpdGVMaXN0WydwYWdlLWJyZWFrLWluc2lkZSddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IGF1dG9cbiAgd2hpdGVMaXN0WydwYWdlLXBvbGljeSddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IHN0YXJ0XG4gIHdoaXRlTGlzdFsncGF1c2UnXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBpbXBsZW1lbnRhdGlvbiBkZXBlbmRlbnRcbiAgd2hpdGVMaXN0WydwYXVzZS1hZnRlciddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IGltcGxlbWVudGF0aW9uIGRlcGVuZGVudFxuICB3aGl0ZUxpc3RbJ3BhdXNlLWJlZm9yZSddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IGltcGxlbWVudGF0aW9uIGRlcGVuZGVudFxuICB3aGl0ZUxpc3RbJ3BlcnNwZWN0aXZlJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogbm9uZVxuICB3aGl0ZUxpc3RbJ3BlcnNwZWN0aXZlLW9yaWdpbiddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IDUwJSA1MCVcbiAgd2hpdGVMaXN0WydwaXRjaCddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IG1lZGl1bVxuICB3aGl0ZUxpc3RbJ3BpdGNoLXJhbmdlJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogNTBcbiAgd2hpdGVMaXN0WydwbGF5LWR1cmluZyddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IGF1dG9cbiAgd2hpdGVMaXN0Wydwb3NpdGlvbiddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IHN0YXRpY1xuICB3aGl0ZUxpc3RbJ3ByZXNlbnRhdGlvbi1sZXZlbCddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IDBcbiAgd2hpdGVMaXN0WydxdW90ZXMnXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiB0ZXh0XG4gIHdoaXRlTGlzdFsncmVnaW9uLWZyYWdtZW50J10gPSBmYWxzZTsgLy8gZGVmYXVsdDogYXV0b1xuICB3aGl0ZUxpc3RbJ3Jlc2l6ZSddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IG5vbmVcbiAgd2hpdGVMaXN0WydyZXN0J10gPSBmYWxzZTsgLy8gZGVmYXVsdDogZGVwZW5kaW5nIG9uIGluZGl2aWR1YWwgcHJvcGVydGllc1xuICB3aGl0ZUxpc3RbJ3Jlc3QtYWZ0ZXInXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBub25lXG4gIHdoaXRlTGlzdFsncmVzdC1iZWZvcmUnXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBub25lXG4gIHdoaXRlTGlzdFsncmljaG5lc3MnXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiA1MFxuICB3aGl0ZUxpc3RbJ3JpZ2h0J10gPSBmYWxzZTsgLy8gZGVmYXVsdDogYXV0b1xuICB3aGl0ZUxpc3RbJ3JvdGF0aW9uJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogMFxuICB3aGl0ZUxpc3RbJ3JvdGF0aW9uLXBvaW50J10gPSBmYWxzZTsgLy8gZGVmYXVsdDogNTAlIDUwJVxuICB3aGl0ZUxpc3RbJ3J1YnktYWxpZ24nXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBhdXRvXG4gIHdoaXRlTGlzdFsncnVieS1tZXJnZSddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IHNlcGFyYXRlXG4gIHdoaXRlTGlzdFsncnVieS1wb3NpdGlvbiddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IGJlZm9yZVxuICB3aGl0ZUxpc3RbJ3NoYXBlLWltYWdlLXRocmVzaG9sZCddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IDAuMFxuICB3aGl0ZUxpc3RbJ3NoYXBlLW91dHNpZGUnXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBub25lXG4gIHdoaXRlTGlzdFsnc2hhcGUtbWFyZ2luJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogMFxuICB3aGl0ZUxpc3RbJ3NpemUnXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBhdXRvXG4gIHdoaXRlTGlzdFsnc3BlYWsnXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBhdXRvXG4gIHdoaXRlTGlzdFsnc3BlYWstYXMnXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBub3JtYWxcbiAgd2hpdGVMaXN0WydzcGVhay1oZWFkZXInXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBvbmNlXG4gIHdoaXRlTGlzdFsnc3BlYWstbnVtZXJhbCddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IGNvbnRpbnVvdXNcbiAgd2hpdGVMaXN0WydzcGVhay1wdW5jdHVhdGlvbiddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IG5vbmVcbiAgd2hpdGVMaXN0WydzcGVlY2gtcmF0ZSddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IG1lZGl1bVxuICB3aGl0ZUxpc3RbJ3N0cmVzcyddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IDUwXG4gIHdoaXRlTGlzdFsnc3RyaW5nLXNldCddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IG5vbmVcbiAgd2hpdGVMaXN0Wyd0YWItc2l6ZSddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IDhcbiAgd2hpdGVMaXN0Wyd0YWJsZS1sYXlvdXQnXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBhdXRvXG4gIHdoaXRlTGlzdFsndGV4dC1hbGlnbiddID0gdHJ1ZTsgLy8gZGVmYXVsdDogc3RhcnRcbiAgd2hpdGVMaXN0Wyd0ZXh0LWFsaWduLWxhc3QnXSA9IHRydWU7IC8vIGRlZmF1bHQ6IGF1dG9cbiAgd2hpdGVMaXN0Wyd0ZXh0LWNvbWJpbmUtdXByaWdodCddID0gdHJ1ZTsgLy8gZGVmYXVsdDogbm9uZVxuICB3aGl0ZUxpc3RbJ3RleHQtZGVjb3JhdGlvbiddID0gdHJ1ZTsgLy8gZGVmYXVsdDogbm9uZVxuICB3aGl0ZUxpc3RbJ3RleHQtZGVjb3JhdGlvbi1jb2xvciddID0gdHJ1ZTsgLy8gZGVmYXVsdDogY3VycmVudENvbG9yXG4gIHdoaXRlTGlzdFsndGV4dC1kZWNvcmF0aW9uLWxpbmUnXSA9IHRydWU7IC8vIGRlZmF1bHQ6IG5vbmVcbiAgd2hpdGVMaXN0Wyd0ZXh0LWRlY29yYXRpb24tc2tpcCddID0gdHJ1ZTsgLy8gZGVmYXVsdDogb2JqZWN0c1xuICB3aGl0ZUxpc3RbJ3RleHQtZGVjb3JhdGlvbi1zdHlsZSddID0gdHJ1ZTsgLy8gZGVmYXVsdDogc29saWRcbiAgd2hpdGVMaXN0Wyd0ZXh0LWVtcGhhc2lzJ10gPSB0cnVlOyAvLyBkZWZhdWx0OiBkZXBlbmRpbmcgb24gaW5kaXZpZHVhbCBwcm9wZXJ0aWVzXG4gIHdoaXRlTGlzdFsndGV4dC1lbXBoYXNpcy1jb2xvciddID0gdHJ1ZTsgLy8gZGVmYXVsdDogY3VycmVudENvbG9yXG4gIHdoaXRlTGlzdFsndGV4dC1lbXBoYXNpcy1wb3NpdGlvbiddID0gdHJ1ZTsgLy8gZGVmYXVsdDogb3ZlciByaWdodFxuICB3aGl0ZUxpc3RbJ3RleHQtZW1waGFzaXMtc3R5bGUnXSA9IHRydWU7IC8vIGRlZmF1bHQ6IG5vbmVcbiAgd2hpdGVMaXN0Wyd0ZXh0LWhlaWdodCddID0gdHJ1ZTsgLy8gZGVmYXVsdDogYXV0b1xuICB3aGl0ZUxpc3RbJ3RleHQtaW5kZW50J10gPSB0cnVlOyAvLyBkZWZhdWx0OiAwXG4gIHdoaXRlTGlzdFsndGV4dC1qdXN0aWZ5J10gPSB0cnVlOyAvLyBkZWZhdWx0OiBhdXRvXG4gIHdoaXRlTGlzdFsndGV4dC1vcmllbnRhdGlvbiddID0gdHJ1ZTsgLy8gZGVmYXVsdDogbWl4ZWRcbiAgd2hpdGVMaXN0Wyd0ZXh0LW92ZXJmbG93J10gPSB0cnVlOyAvLyBkZWZhdWx0OiBjbGlwXG4gIHdoaXRlTGlzdFsndGV4dC1zaGFkb3cnXSA9IHRydWU7IC8vIGRlZmF1bHQ6IG5vbmVcbiAgd2hpdGVMaXN0Wyd0ZXh0LXNwYWNlLWNvbGxhcHNlJ10gPSB0cnVlOyAvLyBkZWZhdWx0OiBjb2xsYXBzZVxuICB3aGl0ZUxpc3RbJ3RleHQtdHJhbnNmb3JtJ10gPSB0cnVlOyAvLyBkZWZhdWx0OiBub25lXG4gIHdoaXRlTGlzdFsndGV4dC11bmRlcmxpbmUtcG9zaXRpb24nXSA9IHRydWU7IC8vIGRlZmF1bHQ6IGF1dG9cbiAgd2hpdGVMaXN0Wyd0ZXh0LXdyYXAnXSA9IHRydWU7IC8vIGRlZmF1bHQ6IG5vcm1hbFxuICB3aGl0ZUxpc3RbJ3RvcCddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IGF1dG9cbiAgd2hpdGVMaXN0Wyd0cmFuc2Zvcm0nXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBub25lXG4gIHdoaXRlTGlzdFsndHJhbnNmb3JtLW9yaWdpbiddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IDUwJSA1MCUgMFxuICB3aGl0ZUxpc3RbJ3RyYW5zZm9ybS1zdHlsZSddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IGZsYXRcbiAgd2hpdGVMaXN0Wyd0cmFuc2l0aW9uJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogZGVwZW5kaW5nIG9uIGluZGl2aWR1YWwgcHJvcGVydGllc1xuICB3aGl0ZUxpc3RbJ3RyYW5zaXRpb24tZGVsYXknXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiAwc1xuICB3aGl0ZUxpc3RbJ3RyYW5zaXRpb24tZHVyYXRpb24nXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiAwc1xuICB3aGl0ZUxpc3RbJ3RyYW5zaXRpb24tcHJvcGVydHknXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBhbGxcbiAgd2hpdGVMaXN0Wyd0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbiddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IGVhc2VcbiAgd2hpdGVMaXN0Wyd1bmljb2RlLWJpZGknXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBub3JtYWxcbiAgd2hpdGVMaXN0Wyd2ZXJ0aWNhbC1hbGlnbiddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IGJhc2VsaW5lXG4gIHdoaXRlTGlzdFsndmlzaWJpbGl0eSddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IHZpc2libGVcbiAgd2hpdGVMaXN0Wyd2b2ljZS1iYWxhbmNlJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogY2VudGVyXG4gIHdoaXRlTGlzdFsndm9pY2UtZHVyYXRpb24nXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBhdXRvXG4gIHdoaXRlTGlzdFsndm9pY2UtZmFtaWx5J10gPSBmYWxzZTsgLy8gZGVmYXVsdDogaW1wbGVtZW50YXRpb24gZGVwZW5kZW50XG4gIHdoaXRlTGlzdFsndm9pY2UtcGl0Y2gnXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBtZWRpdW1cbiAgd2hpdGVMaXN0Wyd2b2ljZS1yYW5nZSddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IG1lZGl1bVxuICB3aGl0ZUxpc3RbJ3ZvaWNlLXJhdGUnXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBub3JtYWxcbiAgd2hpdGVMaXN0Wyd2b2ljZS1zdHJlc3MnXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBub3JtYWxcbiAgd2hpdGVMaXN0Wyd2b2ljZS12b2x1bWUnXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBtZWRpdW1cbiAgd2hpdGVMaXN0Wyd2b2x1bWUnXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBtZWRpdW1cbiAgd2hpdGVMaXN0Wyd3aGl0ZS1zcGFjZSddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IG5vcm1hbFxuICB3aGl0ZUxpc3RbJ3dpZG93cyddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IDJcbiAgd2hpdGVMaXN0Wyd3aWR0aCddID0gdHJ1ZTsgLy8gZGVmYXVsdDogYXV0b1xuICB3aGl0ZUxpc3RbJ3dpbGwtY2hhbmdlJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogYXV0b1xuICB3aGl0ZUxpc3RbJ3dvcmQtYnJlYWsnXSA9IHRydWU7IC8vIGRlZmF1bHQ6IG5vcm1hbFxuICB3aGl0ZUxpc3RbJ3dvcmQtc3BhY2luZyddID0gdHJ1ZTsgLy8gZGVmYXVsdDogbm9ybWFsXG4gIHdoaXRlTGlzdFsnd29yZC13cmFwJ10gPSB0cnVlOyAvLyBkZWZhdWx0OiBub3JtYWxcbiAgd2hpdGVMaXN0Wyd3cmFwLWZsb3cnXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBhdXRvXG4gIHdoaXRlTGlzdFsnd3JhcC10aHJvdWdoJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogd3JhcFxuICB3aGl0ZUxpc3RbJ3dyaXRpbmctbW9kZSddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IGhvcml6b250YWwtdGJcbiAgd2hpdGVMaXN0Wyd6LWluZGV4J10gPSBmYWxzZTsgLy8gZGVmYXVsdDogYXV0b1xuXG4gIHJldHVybiB3aGl0ZUxpc3Q7XG59XG5cblxuLyoqXG4gKiDljLnphY3liLDnmb3lkI3ljZXkuIrnmoTkuIDkuKrlsZ7mgKfml7ZcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtTdHJpbmd9IHZhbHVlXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICogQHJldHVybiB7U3RyaW5nfVxuICovXG5mdW5jdGlvbiBvbkF0dHIgKG5hbWUsIHZhbHVlLCBvcHRpb25zKSB7XG4gIC8vIGRvIG5vdGhpbmdcbn1cblxuLyoqXG4gKiDljLnphY3liLDkuI3lnKjnmb3lkI3ljZXkuIrnmoTkuIDkuKrlsZ7mgKfml7ZcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtTdHJpbmd9IHZhbHVlXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICogQHJldHVybiB7U3RyaW5nfVxuICovXG5mdW5jdGlvbiBvbklnbm9yZUF0dHIgKG5hbWUsIHZhbHVlLCBvcHRpb25zKSB7XG4gIC8vIGRvIG5vdGhpbmdcbn1cblxudmFyIFJFR0VYUF9VUkxfSkFWQVNDUklQVCA9IC9qYXZhc2NyaXB0XFxzKlxcOi9pbWc7XG5cbi8qKlxuICog6L+H5ruk5bGe5oCn5YC8XG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7U3RyaW5nfSB2YWx1ZVxuICogQHJldHVybiB7U3RyaW5nfVxuICovXG5mdW5jdGlvbiBzYWZlQXR0clZhbHVlKG5hbWUsIHZhbHVlKSB7XG4gIGlmIChSRUdFWFBfVVJMX0pBVkFTQ1JJUFQudGVzdCh2YWx1ZSkpIHJldHVybiAnJztcbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5cbmV4cG9ydHMud2hpdGVMaXN0ID0gZ2V0RGVmYXVsdFdoaXRlTGlzdCgpO1xuZXhwb3J0cy5nZXREZWZhdWx0V2hpdGVMaXN0ID0gZ2V0RGVmYXVsdFdoaXRlTGlzdDtcbmV4cG9ydHMub25BdHRyID0gb25BdHRyO1xuZXhwb3J0cy5vbklnbm9yZUF0dHIgPSBvbklnbm9yZUF0dHI7XG5leHBvcnRzLnNhZmVBdHRyVmFsdWUgPSBzYWZlQXR0clZhbHVlO1xuIiwibW9kdWxlLmV4cG9ydHMgPSB7XG4gIGluZGV4T2Y6IGZ1bmN0aW9uIChhcnIsIGl0ZW0pIHtcbiAgICB2YXIgaSwgajtcbiAgICBpZiAoQXJyYXkucHJvdG90eXBlLmluZGV4T2YpIHtcbiAgICAgIHJldHVybiBhcnIuaW5kZXhPZihpdGVtKTtcbiAgICB9XG4gICAgZm9yIChpID0gMCwgaiA9IGFyci5sZW5ndGg7IGkgPCBqOyBpKyspIHtcbiAgICAgIGlmIChhcnJbaV0gPT09IGl0ZW0pIHtcbiAgICAgICAgcmV0dXJuIGk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAtMTtcbiAgfSxcbiAgZm9yRWFjaDogZnVuY3Rpb24gKGFyciwgZm4sIHNjb3BlKSB7XG4gICAgdmFyIGksIGo7XG4gICAgaWYgKEFycmF5LnByb3RvdHlwZS5mb3JFYWNoKSB7XG4gICAgICByZXR1cm4gYXJyLmZvckVhY2goZm4sIHNjb3BlKTtcbiAgICB9XG4gICAgZm9yIChpID0gMCwgaiA9IGFyci5sZW5ndGg7IGkgPCBqOyBpKyspIHtcbiAgICAgIGZuLmNhbGwoc2NvcGUsIGFycltpXSwgaSwgYXJyKTtcbiAgICB9XG4gIH0sXG4gIHRyaW06IGZ1bmN0aW9uIChzdHIpIHtcbiAgICBpZiAoU3RyaW5nLnByb3RvdHlwZS50cmltKSB7XG4gICAgICByZXR1cm4gc3RyLnRyaW0oKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlKC8oXlxccyopfChcXHMqJCkvZywgJycpO1xuICB9LFxuICB0cmltUmlnaHQ6IGZ1bmN0aW9uIChzdHIpIHtcbiAgICBpZiAoU3RyaW5nLnByb3RvdHlwZS50cmltUmlnaHQpIHtcbiAgICAgIHJldHVybiBzdHIudHJpbVJpZ2h0KCk7XG4gICAgfVxuICAgIHJldHVybiBzdHIucmVwbGFjZSgvKFxccyokKS9nLCAnJyk7XG4gIH1cbn07XG4iLCIvKipcbiAqIGNzc2ZpbHRlclxuICpcbiAqIEBhdXRob3Ig6ICB6Zu3PGxlaXpvbmdtaW5AZ21haWwuY29tPlxuICovXG5cbnZhciBfID0gcmVxdWlyZSgnLi91dGlsJyk7XG5cblxuLyoqXG4gKiDop6PmnpBzdHlsZVxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBjc3NcbiAqIEBwYXJhbSB7RnVuY3Rpb259IG9uQXR0ciDlpITnkIblsZ7mgKfnmoTlh73mlbBcbiAqICAg5Y+C5pWw5qC85byP77yaIGZ1bmN0aW9uIChzb3VyY2VQb3NpdGlvbiwgcG9zaXRpb24sIG5hbWUsIHZhbHVlLCBzb3VyY2UpXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIHBhcnNlU3R5bGUgKGNzcywgb25BdHRyKSB7XG4gIGNzcyA9IF8udHJpbVJpZ2h0KGNzcyk7XG4gIGlmIChjc3NbY3NzLmxlbmd0aCAtIDFdICE9PSAnOycpIGNzcyArPSAnOyc7XG4gIHZhciBjc3NMZW5ndGggPSBjc3MubGVuZ3RoO1xuICB2YXIgaXNQYXJlbnRoZXNpc09wZW4gPSBmYWxzZTtcbiAgdmFyIGxhc3RQb3MgPSAwO1xuICB2YXIgaSA9IDA7XG4gIHZhciByZXRDU1MgPSAnJztcblxuICBmdW5jdGlvbiBhZGROZXdBdHRyICgpIHtcbiAgICAvLyDlpoLmnpzmsqHmnInmraPluLjnmoTpl63lkIjlnIbmi6zlj7fvvIzliJnnm7TmjqXlv73nlaXlvZPliY3lsZ7mgKdcbiAgICBpZiAoIWlzUGFyZW50aGVzaXNPcGVuKSB7XG4gICAgICB2YXIgc291cmNlID0gXy50cmltKGNzcy5zbGljZShsYXN0UG9zLCBpKSk7XG4gICAgICB2YXIgaiA9IHNvdXJjZS5pbmRleE9mKCc6Jyk7XG4gICAgICBpZiAoaiAhPT0gLTEpIHtcbiAgICAgICAgdmFyIG5hbWUgPSBfLnRyaW0oc291cmNlLnNsaWNlKDAsIGopKTtcbiAgICAgICAgdmFyIHZhbHVlID0gXy50cmltKHNvdXJjZS5zbGljZShqICsgMSkpO1xuICAgICAgICAvLyDlv4XpobvmnInlsZ7mgKflkI3np7BcbiAgICAgICAgaWYgKG5hbWUpIHtcbiAgICAgICAgICB2YXIgcmV0ID0gb25BdHRyKGxhc3RQb3MsIHJldENTUy5sZW5ndGgsIG5hbWUsIHZhbHVlLCBzb3VyY2UpO1xuICAgICAgICAgIGlmIChyZXQpIHJldENTUyArPSByZXQgKyAnOyAnO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGxhc3RQb3MgPSBpICsgMTtcbiAgfVxuXG4gIGZvciAoOyBpIDwgY3NzTGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgYyA9IGNzc1tpXTtcbiAgICBpZiAoYyA9PT0gJy8nICYmIGNzc1tpICsgMV0gPT09ICcqJykge1xuICAgICAgLy8g5aSH5rOo5byA5aeLXG4gICAgICB2YXIgaiA9IGNzcy5pbmRleE9mKCcqLycsIGkgKyAyKTtcbiAgICAgIC8vIOWmguaenOayoeacieato+W4uOeahOWkh+azqOe7k+adn++8jOWImeWQjumdoueahOmDqOWIhuWFqOmDqOi3s+i/h1xuICAgICAgaWYgKGogPT09IC0xKSBicmVhaztcbiAgICAgIC8vIOebtOaOpeWwhuW9k+WJjeS9jee9ruiwg+WIsOWkh+azqOe7k+Wwvu+8jOW5tuS4lOWIneWni+WMlueKtuaAgVxuICAgICAgaSA9IGogKyAxO1xuICAgICAgbGFzdFBvcyA9IGkgKyAxO1xuICAgICAgaXNQYXJlbnRoZXNpc09wZW4gPSBmYWxzZTtcbiAgICB9IGVsc2UgaWYgKGMgPT09ICcoJykge1xuICAgICAgaXNQYXJlbnRoZXNpc09wZW4gPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAoYyA9PT0gJyknKSB7XG4gICAgICBpc1BhcmVudGhlc2lzT3BlbiA9IGZhbHNlO1xuICAgIH0gZWxzZSBpZiAoYyA9PT0gJzsnKSB7XG4gICAgICBpZiAoaXNQYXJlbnRoZXNpc09wZW4pIHtcbiAgICAgICAgLy8g5Zyo5ZyG5ous5Y+36YeM6Z2i77yM5b+955WlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhZGROZXdBdHRyKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjID09PSAnXFxuJykge1xuICAgICAgYWRkTmV3QXR0cigpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBfLnRyaW0ocmV0Q1NTKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBwYXJzZVN0eWxlO1xuIiwiLyoqXG4gKiBjc3NmaWx0ZXJcbiAqXG4gKiBAYXV0aG9yIOiAgembtzxsZWl6b25nbWluQGdtYWlsLmNvbT5cbiAqL1xuXG52YXIgREVGQVVMVCA9IHJlcXVpcmUoJy4vZGVmYXVsdCcpO1xudmFyIHBhcnNlU3R5bGUgPSByZXF1aXJlKCcuL3BhcnNlcicpO1xudmFyIF8gPSByZXF1aXJlKCcuL3V0aWwnKTtcblxuXG4vKipcbiAqIOi/lOWbnuWAvOaYr+WQpuS4uuepulxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmpcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGlzTnVsbCAob2JqKSB7XG4gIHJldHVybiAob2JqID09PSB1bmRlZmluZWQgfHwgb2JqID09PSBudWxsKTtcbn1cblxuLyoqXG4gKiDmtYXmi7fotJ3lr7nosaFcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIHNoYWxsb3dDb3B5T2JqZWN0IChvYmopIHtcbiAgdmFyIHJldCA9IHt9O1xuICBmb3IgKHZhciBpIGluIG9iaikge1xuICAgIHJldFtpXSA9IG9ialtpXTtcbiAgfVxuICByZXR1cm4gcmV0O1xufVxuXG4vKipcbiAqIOWIm+W7ukNTU+i/h+a7pOWZqFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gKiAgIC0ge09iamVjdH0gd2hpdGVMaXN0XG4gKiAgIC0ge0Z1bmN0aW9ufSBvbkF0dHJcbiAqICAgLSB7RnVuY3Rpb259IG9uSWdub3JlQXR0clxuICogICAtIHtGdW5jdGlvbn0gc2FmZUF0dHJWYWx1ZVxuICovXG5mdW5jdGlvbiBGaWx0ZXJDU1MgKG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IHNoYWxsb3dDb3B5T2JqZWN0KG9wdGlvbnMgfHwge30pO1xuICBvcHRpb25zLndoaXRlTGlzdCA9IG9wdGlvbnMud2hpdGVMaXN0IHx8IERFRkFVTFQud2hpdGVMaXN0O1xuICBvcHRpb25zLm9uQXR0ciA9IG9wdGlvbnMub25BdHRyIHx8IERFRkFVTFQub25BdHRyO1xuICBvcHRpb25zLm9uSWdub3JlQXR0ciA9IG9wdGlvbnMub25JZ25vcmVBdHRyIHx8IERFRkFVTFQub25JZ25vcmVBdHRyO1xuICBvcHRpb25zLnNhZmVBdHRyVmFsdWUgPSBvcHRpb25zLnNhZmVBdHRyVmFsdWUgfHwgREVGQVVMVC5zYWZlQXR0clZhbHVlO1xuICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xufVxuXG5GaWx0ZXJDU1MucHJvdG90eXBlLnByb2Nlc3MgPSBmdW5jdGlvbiAoY3NzKSB7XG4gIC8vIOWFvOWuueWQhOenjeWlh+iRqei+k+WFpVxuICBjc3MgPSBjc3MgfHwgJyc7XG4gIGNzcyA9IGNzcy50b1N0cmluZygpO1xuICBpZiAoIWNzcykgcmV0dXJuICcnO1xuXG4gIHZhciBtZSA9IHRoaXM7XG4gIHZhciBvcHRpb25zID0gbWUub3B0aW9ucztcbiAgdmFyIHdoaXRlTGlzdCA9IG9wdGlvbnMud2hpdGVMaXN0O1xuICB2YXIgb25BdHRyID0gb3B0aW9ucy5vbkF0dHI7XG4gIHZhciBvbklnbm9yZUF0dHIgPSBvcHRpb25zLm9uSWdub3JlQXR0cjtcbiAgdmFyIHNhZmVBdHRyVmFsdWUgPSBvcHRpb25zLnNhZmVBdHRyVmFsdWU7XG5cbiAgdmFyIHJldENTUyA9IHBhcnNlU3R5bGUoY3NzLCBmdW5jdGlvbiAoc291cmNlUG9zaXRpb24sIHBvc2l0aW9uLCBuYW1lLCB2YWx1ZSwgc291cmNlKSB7XG5cbiAgICB2YXIgY2hlY2sgPSB3aGl0ZUxpc3RbbmFtZV07XG4gICAgdmFyIGlzV2hpdGUgPSBmYWxzZTtcbiAgICBpZiAoY2hlY2sgPT09IHRydWUpIGlzV2hpdGUgPSBjaGVjaztcbiAgICBlbHNlIGlmICh0eXBlb2YgY2hlY2sgPT09ICdmdW5jdGlvbicpIGlzV2hpdGUgPSBjaGVjayh2YWx1ZSk7XG4gICAgZWxzZSBpZiAoY2hlY2sgaW5zdGFuY2VvZiBSZWdFeHApIGlzV2hpdGUgPSBjaGVjay50ZXN0KHZhbHVlKTtcbiAgICBpZiAoaXNXaGl0ZSAhPT0gdHJ1ZSkgaXNXaGl0ZSA9IGZhbHNlO1xuXG4gICAgLy8g5aaC5p6c6L+H5ruk5ZCOIHZhbHVlIOS4uuepuuWImeebtOaOpeW/veeVpVxuICAgIHZhbHVlID0gc2FmZUF0dHJWYWx1ZShuYW1lLCB2YWx1ZSk7XG4gICAgaWYgKCF2YWx1ZSkgcmV0dXJuO1xuXG4gICAgdmFyIG9wdHMgPSB7XG4gICAgICBwb3NpdGlvbjogcG9zaXRpb24sXG4gICAgICBzb3VyY2VQb3NpdGlvbjogc291cmNlUG9zaXRpb24sXG4gICAgICBzb3VyY2U6IHNvdXJjZSxcbiAgICAgIGlzV2hpdGU6IGlzV2hpdGVcbiAgICB9O1xuXG4gICAgaWYgKGlzV2hpdGUpIHtcblxuICAgICAgdmFyIHJldCA9IG9uQXR0cihuYW1lLCB2YWx1ZSwgb3B0cyk7XG4gICAgICBpZiAoaXNOdWxsKHJldCkpIHtcbiAgICAgICAgcmV0dXJuIG5hbWUgKyAnOicgKyB2YWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgICB9XG5cbiAgICB9IGVsc2Uge1xuXG4gICAgICB2YXIgcmV0ID0gb25JZ25vcmVBdHRyKG5hbWUsIHZhbHVlLCBvcHRzKTtcbiAgICAgIGlmICghaXNOdWxsKHJldCkpIHtcbiAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgIH1cblxuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIHJldENTUztcbn07XG5cblxubW9kdWxlLmV4cG9ydHMgPSBGaWx0ZXJDU1M7XG4iLCIvKipcbiAqIGNzc2ZpbHRlclxuICpcbiAqIEBhdXRob3Ig6ICB6Zu3PGxlaXpvbmdtaW5AZ21haWwuY29tPlxuICovXG5cbnZhciBERUZBVUxUID0gcmVxdWlyZSgnLi9kZWZhdWx0Jyk7XG52YXIgRmlsdGVyQ1NTID0gcmVxdWlyZSgnLi9jc3MnKTtcblxuXG4vKipcbiAqIFhTU+i/h+a7pFxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBjc3Mg6KaB6L+H5ruk55qEQ1NT5Luj56CBXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyDpgInpobnvvJp3aGl0ZUxpc3QsIG9uQXR0ciwgb25JZ25vcmVBdHRyXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGZpbHRlckNTUyAoaHRtbCwgb3B0aW9ucykge1xuICB2YXIgeHNzID0gbmV3IEZpbHRlckNTUyhvcHRpb25zKTtcbiAgcmV0dXJuIHhzcy5wcm9jZXNzKGh0bWwpO1xufVxuXG5cbi8vIOi+k+WHulxuZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gZmlsdGVyQ1NTO1xuZXhwb3J0cy5GaWx0ZXJDU1MgPSBGaWx0ZXJDU1M7XG5mb3IgKHZhciBpIGluIERFRkFVTFQpIGV4cG9ydHNbaV0gPSBERUZBVUxUW2ldO1xuXG4vLyDlnKjmtY/op4jlmajnq6/kvb/nlKhcbmlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICB3aW5kb3cuZmlsdGVyQ1NTID0gbW9kdWxlLmV4cG9ydHM7XG59XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHtcbiAgaW5kZXhPZjogZnVuY3Rpb24gKGFyciwgaXRlbSkge1xuICAgIHZhciBpLCBqO1xuICAgIGlmIChBcnJheS5wcm90b3R5cGUuaW5kZXhPZikge1xuICAgICAgcmV0dXJuIGFyci5pbmRleE9mKGl0ZW0pO1xuICAgIH1cbiAgICBmb3IgKGkgPSAwLCBqID0gYXJyLmxlbmd0aDsgaSA8IGo7IGkrKykge1xuICAgICAgaWYgKGFycltpXSA9PT0gaXRlbSkge1xuICAgICAgICByZXR1cm4gaTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIC0xO1xuICB9LFxuICBmb3JFYWNoOiBmdW5jdGlvbiAoYXJyLCBmbiwgc2NvcGUpIHtcbiAgICB2YXIgaSwgajtcbiAgICBpZiAoQXJyYXkucHJvdG90eXBlLmZvckVhY2gpIHtcbiAgICAgIHJldHVybiBhcnIuZm9yRWFjaChmbiwgc2NvcGUpO1xuICAgIH1cbiAgICBmb3IgKGkgPSAwLCBqID0gYXJyLmxlbmd0aDsgaSA8IGo7IGkrKykge1xuICAgICAgZm4uY2FsbChzY29wZSwgYXJyW2ldLCBpLCBhcnIpO1xuICAgIH1cbiAgfSxcbiAgdHJpbTogZnVuY3Rpb24gKHN0cikge1xuICAgIGlmIChTdHJpbmcucHJvdG90eXBlLnRyaW0pIHtcbiAgICAgIHJldHVybiBzdHIudHJpbSgpO1xuICAgIH1cbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoLyheXFxzKil8KFxccyokKS9nLCBcIlwiKTtcbiAgfSxcbiAgc3BhY2VJbmRleDogZnVuY3Rpb24gKHN0cikge1xuICAgIHZhciByZWcgPSAvXFxzfFxcbnxcXHQvO1xuICAgIHZhciBtYXRjaCA9IHJlZy5leGVjKHN0cik7XG4gICAgcmV0dXJuIG1hdGNoID8gbWF0Y2guaW5kZXggOiAtMTtcbiAgfSxcbn07XG4iLCIvKipcbiAqIGRlZmF1bHQgc2V0dGluZ3NcbiAqXG4gKiBAYXV0aG9yIFpvbmdtaW4gTGVpPGxlaXpvbmdtaW5AZ21haWwuY29tPlxuICovXG5cbnZhciBGaWx0ZXJDU1MgPSByZXF1aXJlKFwiY3NzZmlsdGVyXCIpLkZpbHRlckNTUztcbnZhciBnZXREZWZhdWx0Q1NTV2hpdGVMaXN0ID0gcmVxdWlyZShcImNzc2ZpbHRlclwiKS5nZXREZWZhdWx0V2hpdGVMaXN0O1xudmFyIF8gPSByZXF1aXJlKFwiLi91dGlsXCIpO1xuXG5mdW5jdGlvbiBnZXREZWZhdWx0V2hpdGVMaXN0KCkge1xuICByZXR1cm4ge1xuICAgIGE6IFtcInRhcmdldFwiLCBcImhyZWZcIiwgXCJ0aXRsZVwiXSxcbiAgICBhYmJyOiBbXCJ0aXRsZVwiXSxcbiAgICBhZGRyZXNzOiBbXSxcbiAgICBhcmVhOiBbXCJzaGFwZVwiLCBcImNvb3Jkc1wiLCBcImhyZWZcIiwgXCJhbHRcIl0sXG4gICAgYXJ0aWNsZTogW10sXG4gICAgYXNpZGU6IFtdLFxuICAgIGF1ZGlvOiBbXG4gICAgICBcImF1dG9wbGF5XCIsXG4gICAgICBcImNvbnRyb2xzXCIsXG4gICAgICBcImNyb3Nzb3JpZ2luXCIsXG4gICAgICBcImxvb3BcIixcbiAgICAgIFwibXV0ZWRcIixcbiAgICAgIFwicHJlbG9hZFwiLFxuICAgICAgXCJzcmNcIixcbiAgICBdLFxuICAgIGI6IFtdLFxuICAgIGJkaTogW1wiZGlyXCJdLFxuICAgIGJkbzogW1wiZGlyXCJdLFxuICAgIGJpZzogW10sXG4gICAgYmxvY2txdW90ZTogW1wiY2l0ZVwiXSxcbiAgICBicjogW10sXG4gICAgY2FwdGlvbjogW10sXG4gICAgY2VudGVyOiBbXSxcbiAgICBjaXRlOiBbXSxcbiAgICBjb2RlOiBbXSxcbiAgICBjb2w6IFtcImFsaWduXCIsIFwidmFsaWduXCIsIFwic3BhblwiLCBcIndpZHRoXCJdLFxuICAgIGNvbGdyb3VwOiBbXCJhbGlnblwiLCBcInZhbGlnblwiLCBcInNwYW5cIiwgXCJ3aWR0aFwiXSxcbiAgICBkZDogW10sXG4gICAgZGVsOiBbXCJkYXRldGltZVwiXSxcbiAgICBkZXRhaWxzOiBbXCJvcGVuXCJdLFxuICAgIGRpdjogW10sXG4gICAgZGw6IFtdLFxuICAgIGR0OiBbXSxcbiAgICBlbTogW10sXG4gICAgZmlnY2FwdGlvbjogW10sXG4gICAgZmlndXJlOiBbXSxcbiAgICBmb250OiBbXCJjb2xvclwiLCBcInNpemVcIiwgXCJmYWNlXCJdLFxuICAgIGZvb3RlcjogW10sXG4gICAgaDE6IFtdLFxuICAgIGgyOiBbXSxcbiAgICBoMzogW10sXG4gICAgaDQ6IFtdLFxuICAgIGg1OiBbXSxcbiAgICBoNjogW10sXG4gICAgaGVhZGVyOiBbXSxcbiAgICBocjogW10sXG4gICAgaTogW10sXG4gICAgaW1nOiBbXCJzcmNcIiwgXCJhbHRcIiwgXCJ0aXRsZVwiLCBcIndpZHRoXCIsIFwiaGVpZ2h0XCJdLFxuICAgIGluczogW1wiZGF0ZXRpbWVcIl0sXG4gICAgbGk6IFtdLFxuICAgIG1hcms6IFtdLFxuICAgIG5hdjogW10sXG4gICAgb2w6IFtdLFxuICAgIHA6IFtdLFxuICAgIHByZTogW10sXG4gICAgczogW10sXG4gICAgc2VjdGlvbjogW10sXG4gICAgc21hbGw6IFtdLFxuICAgIHNwYW46IFtdLFxuICAgIHN1YjogW10sXG4gICAgc3VtbWFyeTogW10sXG4gICAgc3VwOiBbXSxcbiAgICBzdHJvbmc6IFtdLFxuICAgIHN0cmlrZTogW10sXG4gICAgdGFibGU6IFtcIndpZHRoXCIsIFwiYm9yZGVyXCIsIFwiYWxpZ25cIiwgXCJ2YWxpZ25cIl0sXG4gICAgdGJvZHk6IFtcImFsaWduXCIsIFwidmFsaWduXCJdLFxuICAgIHRkOiBbXCJ3aWR0aFwiLCBcInJvd3NwYW5cIiwgXCJjb2xzcGFuXCIsIFwiYWxpZ25cIiwgXCJ2YWxpZ25cIl0sXG4gICAgdGZvb3Q6IFtcImFsaWduXCIsIFwidmFsaWduXCJdLFxuICAgIHRoOiBbXCJ3aWR0aFwiLCBcInJvd3NwYW5cIiwgXCJjb2xzcGFuXCIsIFwiYWxpZ25cIiwgXCJ2YWxpZ25cIl0sXG4gICAgdGhlYWQ6IFtcImFsaWduXCIsIFwidmFsaWduXCJdLFxuICAgIHRyOiBbXCJyb3dzcGFuXCIsIFwiYWxpZ25cIiwgXCJ2YWxpZ25cIl0sXG4gICAgdHQ6IFtdLFxuICAgIHU6IFtdLFxuICAgIHVsOiBbXSxcbiAgICB2aWRlbzogW1xuICAgICAgXCJhdXRvcGxheVwiLFxuICAgICAgXCJjb250cm9sc1wiLFxuICAgICAgXCJjcm9zc29yaWdpblwiLFxuICAgICAgXCJsb29wXCIsXG4gICAgICBcIm11dGVkXCIsXG4gICAgICBcInBsYXlzaW5saW5lXCIsXG4gICAgICBcInBvc3RlclwiLFxuICAgICAgXCJwcmVsb2FkXCIsXG4gICAgICBcInNyY1wiLFxuICAgICAgXCJoZWlnaHRcIixcbiAgICAgIFwid2lkdGhcIixcbiAgICBdLFxuICB9O1xufVxuXG52YXIgZGVmYXVsdENTU0ZpbHRlciA9IG5ldyBGaWx0ZXJDU1MoKTtcblxuLyoqXG4gKiBkZWZhdWx0IG9uVGFnIGZ1bmN0aW9uXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHRhZ1xuICogQHBhcmFtIHtTdHJpbmd9IGh0bWxcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIG9uVGFnKHRhZywgaHRtbCwgb3B0aW9ucykge1xuICAvLyBkbyBub3RoaW5nXG59XG5cbi8qKlxuICogZGVmYXVsdCBvbklnbm9yZVRhZyBmdW5jdGlvblxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSB0YWdcbiAqIEBwYXJhbSB7U3RyaW5nfSBodG1sXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICogQHJldHVybiB7U3RyaW5nfVxuICovXG5mdW5jdGlvbiBvbklnbm9yZVRhZyh0YWcsIGh0bWwsIG9wdGlvbnMpIHtcbiAgLy8gZG8gbm90aGluZ1xufVxuXG4vKipcbiAqIGRlZmF1bHQgb25UYWdBdHRyIGZ1bmN0aW9uXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHRhZ1xuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7U3RyaW5nfSB2YWx1ZVxuICogQHJldHVybiB7U3RyaW5nfVxuICovXG5mdW5jdGlvbiBvblRhZ0F0dHIodGFnLCBuYW1lLCB2YWx1ZSkge1xuICAvLyBkbyBub3RoaW5nXG59XG5cbi8qKlxuICogZGVmYXVsdCBvbklnbm9yZVRhZ0F0dHIgZnVuY3Rpb25cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gdGFnXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtTdHJpbmd9IHZhbHVlXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIG9uSWdub3JlVGFnQXR0cih0YWcsIG5hbWUsIHZhbHVlKSB7XG4gIC8vIGRvIG5vdGhpbmdcbn1cblxuLyoqXG4gKiBkZWZhdWx0IGVzY2FwZUh0bWwgZnVuY3Rpb25cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gaHRtbFxuICovXG5mdW5jdGlvbiBlc2NhcGVIdG1sKGh0bWwpIHtcbiAgcmV0dXJuIGh0bWwucmVwbGFjZShSRUdFWFBfTFQsIFwiJmx0O1wiKS5yZXBsYWNlKFJFR0VYUF9HVCwgXCImZ3Q7XCIpO1xufVxuXG4vKipcbiAqIGRlZmF1bHQgc2FmZUF0dHJWYWx1ZSBmdW5jdGlvblxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSB0YWdcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge1N0cmluZ30gdmFsdWVcbiAqIEBwYXJhbSB7T2JqZWN0fSBjc3NGaWx0ZXJcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqL1xuZnVuY3Rpb24gc2FmZUF0dHJWYWx1ZSh0YWcsIG5hbWUsIHZhbHVlLCBjc3NGaWx0ZXIpIHtcbiAgLy8gdW5lc2NhcGUgYXR0cmlidXRlIHZhbHVlIGZpcnN0bHlcbiAgdmFsdWUgPSBmcmllbmRseUF0dHJWYWx1ZSh2YWx1ZSk7XG5cbiAgaWYgKG5hbWUgPT09IFwiaHJlZlwiIHx8IG5hbWUgPT09IFwic3JjXCIpIHtcbiAgICAvLyBmaWx0ZXIgYGhyZWZgIGFuZCBgc3JjYCBhdHRyaWJ1dGVcbiAgICAvLyBvbmx5IGFsbG93IHRoZSB2YWx1ZSB0aGF0IHN0YXJ0cyB3aXRoIGBodHRwOi8vYCB8IGBodHRwczovL2AgfCBgbWFpbHRvOmAgfCBgL2AgfCBgI2BcbiAgICB2YWx1ZSA9IF8udHJpbSh2YWx1ZSk7XG4gICAgaWYgKHZhbHVlID09PSBcIiNcIikgcmV0dXJuIFwiI1wiO1xuICAgIGlmIChcbiAgICAgICEoXG4gICAgICAgIHZhbHVlLnN1YnN0cigwLCA3KSA9PT0gXCJodHRwOi8vXCIgfHxcbiAgICAgICAgdmFsdWUuc3Vic3RyKDAsIDgpID09PSBcImh0dHBzOi8vXCIgfHxcbiAgICAgICAgdmFsdWUuc3Vic3RyKDAsIDcpID09PSBcIm1haWx0bzpcIiB8fFxuICAgICAgICB2YWx1ZS5zdWJzdHIoMCwgNCkgPT09IFwidGVsOlwiIHx8XG4gICAgICAgIHZhbHVlLnN1YnN0cigwLCAxMSkgPT09IFwiZGF0YTppbWFnZS9cIiB8fFxuICAgICAgICB2YWx1ZS5zdWJzdHIoMCwgNikgPT09IFwiZnRwOi8vXCIgfHxcbiAgICAgICAgdmFsdWUuc3Vic3RyKDAsIDIpID09PSBcIi4vXCIgfHxcbiAgICAgICAgdmFsdWUuc3Vic3RyKDAsIDMpID09PSBcIi4uL1wiIHx8XG4gICAgICAgIHZhbHVlWzBdID09PSBcIiNcIiB8fFxuICAgICAgICB2YWx1ZVswXSA9PT0gXCIvXCJcbiAgICAgIClcbiAgICApIHtcbiAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cbiAgfSBlbHNlIGlmIChuYW1lID09PSBcImJhY2tncm91bmRcIikge1xuICAgIC8vIGZpbHRlciBgYmFja2dyb3VuZGAgYXR0cmlidXRlIChtYXliZSBubyB1c2UpXG4gICAgLy8gYGphdmFzY3JpcHQ6YFxuICAgIFJFR0VYUF9ERUZBVUxUX09OX1RBR19BVFRSXzQubGFzdEluZGV4ID0gMDtcbiAgICBpZiAoUkVHRVhQX0RFRkFVTFRfT05fVEFHX0FUVFJfNC50ZXN0KHZhbHVlKSkge1xuICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxuICB9IGVsc2UgaWYgKG5hbWUgPT09IFwic3R5bGVcIikge1xuICAgIC8vIGBleHByZXNzaW9uKClgXG4gICAgUkVHRVhQX0RFRkFVTFRfT05fVEFHX0FUVFJfNy5sYXN0SW5kZXggPSAwO1xuICAgIGlmIChSRUdFWFBfREVGQVVMVF9PTl9UQUdfQVRUUl83LnRlc3QodmFsdWUpKSB7XG4gICAgICByZXR1cm4gXCJcIjtcbiAgICB9XG4gICAgLy8gYHVybCgpYFxuICAgIFJFR0VYUF9ERUZBVUxUX09OX1RBR19BVFRSXzgubGFzdEluZGV4ID0gMDtcbiAgICBpZiAoUkVHRVhQX0RFRkFVTFRfT05fVEFHX0FUVFJfOC50ZXN0KHZhbHVlKSkge1xuICAgICAgUkVHRVhQX0RFRkFVTFRfT05fVEFHX0FUVFJfNC5sYXN0SW5kZXggPSAwO1xuICAgICAgaWYgKFJFR0VYUF9ERUZBVUxUX09OX1RBR19BVFRSXzQudGVzdCh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjc3NGaWx0ZXIgIT09IGZhbHNlKSB7XG4gICAgICBjc3NGaWx0ZXIgPSBjc3NGaWx0ZXIgfHwgZGVmYXVsdENTU0ZpbHRlcjtcbiAgICAgIHZhbHVlID0gY3NzRmlsdGVyLnByb2Nlc3ModmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIC8vIGVzY2FwZSBgPD5cImAgYmVmb3JlIHJldHVybnNcbiAgdmFsdWUgPSBlc2NhcGVBdHRyVmFsdWUodmFsdWUpO1xuICByZXR1cm4gdmFsdWU7XG59XG5cbi8vIFJlZ0V4cCBsaXN0XG52YXIgUkVHRVhQX0xUID0gLzwvZztcbnZhciBSRUdFWFBfR1QgPSAvPi9nO1xudmFyIFJFR0VYUF9RVU9URSA9IC9cIi9nO1xudmFyIFJFR0VYUF9RVU9URV8yID0gLyZxdW90Oy9nO1xudmFyIFJFR0VYUF9BVFRSX1ZBTFVFXzEgPSAvJiMoW2EtekEtWjAtOV0qKTs/L2dpbTtcbnZhciBSRUdFWFBfQVRUUl9WQUxVRV9DT0xPTiA9IC8mY29sb247Py9naW07XG52YXIgUkVHRVhQX0FUVFJfVkFMVUVfTkVXTElORSA9IC8mbmV3bGluZTs/L2dpbTtcbi8vIHZhciBSRUdFWFBfREVGQVVMVF9PTl9UQUdfQVRUUl8zID0gL1xcL1xcKnxcXCpcXC8vZ207XG52YXIgUkVHRVhQX0RFRkFVTFRfT05fVEFHX0FUVFJfNCA9XG4gIC8oKGpcXHMqYVxccyp2XFxzKmF8dlxccypifGxcXHMqaVxccyp2XFxzKmUpXFxzKnNcXHMqY1xccypyXFxzKmlcXHMqcFxccyp0XFxzKnxtXFxzKm9cXHMqY1xccypoXFxzKmEpOi9naTtcbi8vIHZhciBSRUdFWFBfREVGQVVMVF9PTl9UQUdfQVRUUl81ID0gL15bXFxzXCInYF0qKGRcXHMqYVxccyp0XFxzKmFcXHMqKVxcOi9naTtcbi8vIHZhciBSRUdFWFBfREVGQVVMVF9PTl9UQUdfQVRUUl82ID0gL15bXFxzXCInYF0qKGRcXHMqYVxccyp0XFxzKmFcXHMqKVxcOlxccyppbWFnZVxcLy9naTtcbnZhciBSRUdFWFBfREVGQVVMVF9PTl9UQUdfQVRUUl83ID1cbiAgL2VcXHMqeFxccypwXFxzKnJcXHMqZVxccypzXFxzKnNcXHMqaVxccypvXFxzKm5cXHMqXFwoLiovZ2k7XG52YXIgUkVHRVhQX0RFRkFVTFRfT05fVEFHX0FUVFJfOCA9IC91XFxzKnJcXHMqbFxccypcXCguKi9naTtcblxuLyoqXG4gKiBlc2NhcGUgZG91YmxlIHF1b3RlXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0clxuICogQHJldHVybiB7U3RyaW5nfSBzdHJcbiAqL1xuZnVuY3Rpb24gZXNjYXBlUXVvdGUoc3RyKSB7XG4gIHJldHVybiBzdHIucmVwbGFjZShSRUdFWFBfUVVPVEUsIFwiJnF1b3Q7XCIpO1xufVxuXG4vKipcbiAqIHVuZXNjYXBlIGRvdWJsZSBxdW90ZVxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiAqIEByZXR1cm4ge1N0cmluZ30gc3RyXG4gKi9cbmZ1bmN0aW9uIHVuZXNjYXBlUXVvdGUoc3RyKSB7XG4gIHJldHVybiBzdHIucmVwbGFjZShSRUdFWFBfUVVPVEVfMiwgJ1wiJyk7XG59XG5cbi8qKlxuICogZXNjYXBlIGh0bWwgZW50aXRpZXNcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGVzY2FwZUh0bWxFbnRpdGllcyhzdHIpIHtcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKFJFR0VYUF9BVFRSX1ZBTFVFXzEsIGZ1bmN0aW9uIHJlcGxhY2VVbmljb2RlKHN0ciwgY29kZSkge1xuICAgIHJldHVybiBjb2RlWzBdID09PSBcInhcIiB8fCBjb2RlWzBdID09PSBcIlhcIlxuICAgICAgPyBTdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KGNvZGUuc3Vic3RyKDEpLCAxNikpXG4gICAgICA6IFN0cmluZy5mcm9tQ2hhckNvZGUocGFyc2VJbnQoY29kZSwgMTApKTtcbiAgfSk7XG59XG5cbi8qKlxuICogZXNjYXBlIGh0bWw1IG5ldyBkYW5nZXIgZW50aXRpZXNcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGVzY2FwZURhbmdlckh0bWw1RW50aXRpZXMoc3RyKSB7XG4gIHJldHVybiBzdHJcbiAgICAucmVwbGFjZShSRUdFWFBfQVRUUl9WQUxVRV9DT0xPTiwgXCI6XCIpXG4gICAgLnJlcGxhY2UoUkVHRVhQX0FUVFJfVkFMVUVfTkVXTElORSwgXCIgXCIpO1xufVxuXG4vKipcbiAqIGNsZWFyIG5vbnByaW50YWJsZSBjaGFyYWN0ZXJzXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0clxuICogQHJldHVybiB7U3RyaW5nfVxuICovXG5mdW5jdGlvbiBjbGVhck5vblByaW50YWJsZUNoYXJhY3RlcihzdHIpIHtcbiAgdmFyIHN0cjIgPSBcIlwiO1xuICBmb3IgKHZhciBpID0gMCwgbGVuID0gc3RyLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgc3RyMiArPSBzdHIuY2hhckNvZGVBdChpKSA8IDMyID8gXCIgXCIgOiBzdHIuY2hhckF0KGkpO1xuICB9XG4gIHJldHVybiBfLnRyaW0oc3RyMik7XG59XG5cbi8qKlxuICogZ2V0IGZyaWVuZGx5IGF0dHJpYnV0ZSB2YWx1ZVxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqL1xuZnVuY3Rpb24gZnJpZW5kbHlBdHRyVmFsdWUoc3RyKSB7XG4gIHN0ciA9IHVuZXNjYXBlUXVvdGUoc3RyKTtcbiAgc3RyID0gZXNjYXBlSHRtbEVudGl0aWVzKHN0cik7XG4gIHN0ciA9IGVzY2FwZURhbmdlckh0bWw1RW50aXRpZXMoc3RyKTtcbiAgc3RyID0gY2xlYXJOb25QcmludGFibGVDaGFyYWN0ZXIoc3RyKTtcbiAgcmV0dXJuIHN0cjtcbn1cblxuLyoqXG4gKiB1bmVzY2FwZSBhdHRyaWJ1dGUgdmFsdWVcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGVzY2FwZUF0dHJWYWx1ZShzdHIpIHtcbiAgc3RyID0gZXNjYXBlUXVvdGUoc3RyKTtcbiAgc3RyID0gZXNjYXBlSHRtbChzdHIpO1xuICByZXR1cm4gc3RyO1xufVxuXG4vKipcbiAqIGBvbklnbm9yZVRhZ2AgZnVuY3Rpb24gZm9yIHJlbW92aW5nIGFsbCB0aGUgdGFncyB0aGF0IGFyZSBub3QgaW4gd2hpdGVsaXN0XG4gKi9cbmZ1bmN0aW9uIG9uSWdub3JlVGFnU3RyaXBBbGwoKSB7XG4gIHJldHVybiBcIlwiO1xufVxuXG4vKipcbiAqIHJlbW92ZSB0YWcgYm9keVxuICogc3BlY2lmeSBhIGB0YWdzYCBsaXN0LCBpZiB0aGUgdGFnIGlzIG5vdCBpbiB0aGUgYHRhZ3NgIGxpc3QgdGhlbiBwcm9jZXNzIGJ5IHRoZSBzcGVjaWZ5IGZ1bmN0aW9uIChvcHRpb25hbClcbiAqXG4gKiBAcGFyYW0ge2FycmF5fSB0YWdzXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBuZXh0XG4gKi9cbmZ1bmN0aW9uIFN0cmlwVGFnQm9keSh0YWdzLCBuZXh0KSB7XG4gIGlmICh0eXBlb2YgbmV4dCAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgbmV4dCA9IGZ1bmN0aW9uICgpIHt9O1xuICB9XG5cbiAgdmFyIGlzUmVtb3ZlQWxsVGFnID0gIUFycmF5LmlzQXJyYXkodGFncyk7XG4gIGZ1bmN0aW9uIGlzUmVtb3ZlVGFnKHRhZykge1xuICAgIGlmIChpc1JlbW92ZUFsbFRhZykgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuIF8uaW5kZXhPZih0YWdzLCB0YWcpICE9PSAtMTtcbiAgfVxuXG4gIHZhciByZW1vdmVMaXN0ID0gW107XG4gIHZhciBwb3NTdGFydCA9IGZhbHNlO1xuXG4gIHJldHVybiB7XG4gICAgb25JZ25vcmVUYWc6IGZ1bmN0aW9uICh0YWcsIGh0bWwsIG9wdGlvbnMpIHtcbiAgICAgIGlmIChpc1JlbW92ZVRhZyh0YWcpKSB7XG4gICAgICAgIGlmIChvcHRpb25zLmlzQ2xvc2luZykge1xuICAgICAgICAgIHZhciByZXQgPSBcIlsvcmVtb3ZlZF1cIjtcbiAgICAgICAgICB2YXIgZW5kID0gb3B0aW9ucy5wb3NpdGlvbiArIHJldC5sZW5ndGg7XG4gICAgICAgICAgcmVtb3ZlTGlzdC5wdXNoKFtcbiAgICAgICAgICAgIHBvc1N0YXJ0ICE9PSBmYWxzZSA/IHBvc1N0YXJ0IDogb3B0aW9ucy5wb3NpdGlvbixcbiAgICAgICAgICAgIGVuZCxcbiAgICAgICAgICBdKTtcbiAgICAgICAgICBwb3NTdGFydCA9IGZhbHNlO1xuICAgICAgICAgIHJldHVybiByZXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKCFwb3NTdGFydCkge1xuICAgICAgICAgICAgcG9zU3RhcnQgPSBvcHRpb25zLnBvc2l0aW9uO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gXCJbcmVtb3ZlZF1cIjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG5leHQodGFnLCBodG1sLCBvcHRpb25zKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHJlbW92ZTogZnVuY3Rpb24gKGh0bWwpIHtcbiAgICAgIHZhciByZXRodG1sID0gXCJcIjtcbiAgICAgIHZhciBsYXN0UG9zID0gMDtcbiAgICAgIF8uZm9yRWFjaChyZW1vdmVMaXN0LCBmdW5jdGlvbiAocG9zKSB7XG4gICAgICAgIHJldGh0bWwgKz0gaHRtbC5zbGljZShsYXN0UG9zLCBwb3NbMF0pO1xuICAgICAgICBsYXN0UG9zID0gcG9zWzFdO1xuICAgICAgfSk7XG4gICAgICByZXRodG1sICs9IGh0bWwuc2xpY2UobGFzdFBvcyk7XG4gICAgICByZXR1cm4gcmV0aHRtbDtcbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqIHJlbW92ZSBodG1sIGNvbW1lbnRzXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGh0bWxcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqL1xuZnVuY3Rpb24gc3RyaXBDb21tZW50VGFnKGh0bWwpIHtcbiAgdmFyIHJldEh0bWwgPSBcIlwiO1xuICB2YXIgbGFzdFBvcyA9IDA7XG4gIHdoaWxlIChsYXN0UG9zIDwgaHRtbC5sZW5ndGgpIHtcbiAgICB2YXIgaSA9IGh0bWwuaW5kZXhPZihcIjwhLS1cIiwgbGFzdFBvcyk7XG4gICAgaWYgKGkgPT09IC0xKSB7XG4gICAgICByZXRIdG1sICs9IGh0bWwuc2xpY2UobGFzdFBvcyk7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgcmV0SHRtbCArPSBodG1sLnNsaWNlKGxhc3RQb3MsIGkpO1xuICAgIHZhciBqID0gaHRtbC5pbmRleE9mKFwiLS0+XCIsIGkpO1xuICAgIGlmIChqID09PSAtMSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGxhc3RQb3MgPSBqICsgMztcbiAgfVxuICByZXR1cm4gcmV0SHRtbDtcbn1cblxuLyoqXG4gKiByZW1vdmUgaW52aXNpYmxlIGNoYXJhY3RlcnNcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gaHRtbFxuICogQHJldHVybiB7U3RyaW5nfVxuICovXG5mdW5jdGlvbiBzdHJpcEJsYW5rQ2hhcihodG1sKSB7XG4gIHZhciBjaGFycyA9IGh0bWwuc3BsaXQoXCJcIik7XG4gIGNoYXJzID0gY2hhcnMuZmlsdGVyKGZ1bmN0aW9uIChjaGFyKSB7XG4gICAgdmFyIGMgPSBjaGFyLmNoYXJDb2RlQXQoMCk7XG4gICAgaWYgKGMgPT09IDEyNykgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChjIDw9IDMxKSB7XG4gICAgICBpZiAoYyA9PT0gMTAgfHwgYyA9PT0gMTMpIHJldHVybiB0cnVlO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSk7XG4gIHJldHVybiBjaGFycy5qb2luKFwiXCIpO1xufVxuXG5leHBvcnRzLndoaXRlTGlzdCA9IGdldERlZmF1bHRXaGl0ZUxpc3QoKTtcbmV4cG9ydHMuZ2V0RGVmYXVsdFdoaXRlTGlzdCA9IGdldERlZmF1bHRXaGl0ZUxpc3Q7XG5leHBvcnRzLm9uVGFnID0gb25UYWc7XG5leHBvcnRzLm9uSWdub3JlVGFnID0gb25JZ25vcmVUYWc7XG5leHBvcnRzLm9uVGFnQXR0ciA9IG9uVGFnQXR0cjtcbmV4cG9ydHMub25JZ25vcmVUYWdBdHRyID0gb25JZ25vcmVUYWdBdHRyO1xuZXhwb3J0cy5zYWZlQXR0clZhbHVlID0gc2FmZUF0dHJWYWx1ZTtcbmV4cG9ydHMuZXNjYXBlSHRtbCA9IGVzY2FwZUh0bWw7XG5leHBvcnRzLmVzY2FwZVF1b3RlID0gZXNjYXBlUXVvdGU7XG5leHBvcnRzLnVuZXNjYXBlUXVvdGUgPSB1bmVzY2FwZVF1b3RlO1xuZXhwb3J0cy5lc2NhcGVIdG1sRW50aXRpZXMgPSBlc2NhcGVIdG1sRW50aXRpZXM7XG5leHBvcnRzLmVzY2FwZURhbmdlckh0bWw1RW50aXRpZXMgPSBlc2NhcGVEYW5nZXJIdG1sNUVudGl0aWVzO1xuZXhwb3J0cy5jbGVhck5vblByaW50YWJsZUNoYXJhY3RlciA9IGNsZWFyTm9uUHJpbnRhYmxlQ2hhcmFjdGVyO1xuZXhwb3J0cy5mcmllbmRseUF0dHJWYWx1ZSA9IGZyaWVuZGx5QXR0clZhbHVlO1xuZXhwb3J0cy5lc2NhcGVBdHRyVmFsdWUgPSBlc2NhcGVBdHRyVmFsdWU7XG5leHBvcnRzLm9uSWdub3JlVGFnU3RyaXBBbGwgPSBvbklnbm9yZVRhZ1N0cmlwQWxsO1xuZXhwb3J0cy5TdHJpcFRhZ0JvZHkgPSBTdHJpcFRhZ0JvZHk7XG5leHBvcnRzLnN0cmlwQ29tbWVudFRhZyA9IHN0cmlwQ29tbWVudFRhZztcbmV4cG9ydHMuc3RyaXBCbGFua0NoYXIgPSBzdHJpcEJsYW5rQ2hhcjtcbmV4cG9ydHMuY3NzRmlsdGVyID0gZGVmYXVsdENTU0ZpbHRlcjtcbmV4cG9ydHMuZ2V0RGVmYXVsdENTU1doaXRlTGlzdCA9IGdldERlZmF1bHRDU1NXaGl0ZUxpc3Q7XG4iLCIvKipcbiAqIFNpbXBsZSBIVE1MIFBhcnNlclxuICpcbiAqIEBhdXRob3IgWm9uZ21pbiBMZWk8bGVpem9uZ21pbkBnbWFpbC5jb20+XG4gKi9cblxudmFyIF8gPSByZXF1aXJlKFwiLi91dGlsXCIpO1xuXG4vKipcbiAqIGdldCB0YWcgbmFtZVxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBodG1sIGUuZy4gJzxhIGhlZj1cIiNcIj4nXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGdldFRhZ05hbWUoaHRtbCkge1xuICB2YXIgaSA9IF8uc3BhY2VJbmRleChodG1sKTtcbiAgdmFyIHRhZ05hbWU7XG4gIGlmIChpID09PSAtMSkge1xuICAgIHRhZ05hbWUgPSBodG1sLnNsaWNlKDEsIC0xKTtcbiAgfSBlbHNlIHtcbiAgICB0YWdOYW1lID0gaHRtbC5zbGljZSgxLCBpICsgMSk7XG4gIH1cbiAgdGFnTmFtZSA9IF8udHJpbSh0YWdOYW1lKS50b0xvd2VyQ2FzZSgpO1xuICBpZiAodGFnTmFtZS5zbGljZSgwLCAxKSA9PT0gXCIvXCIpIHRhZ05hbWUgPSB0YWdOYW1lLnNsaWNlKDEpO1xuICBpZiAodGFnTmFtZS5zbGljZSgtMSkgPT09IFwiL1wiKSB0YWdOYW1lID0gdGFnTmFtZS5zbGljZSgwLCAtMSk7XG4gIHJldHVybiB0YWdOYW1lO1xufVxuXG4vKipcbiAqIGlzIGNsb3NlIHRhZz9cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gaHRtbCDlpoLvvJonPGEgaGVmPVwiI1wiPidcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGlzQ2xvc2luZyhodG1sKSB7XG4gIHJldHVybiBodG1sLnNsaWNlKDAsIDIpID09PSBcIjwvXCI7XG59XG5cbi8qKlxuICogcGFyc2UgaW5wdXQgaHRtbCBhbmQgcmV0dXJucyBwcm9jZXNzZWQgaHRtbFxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBodG1sXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblRhZyBlLmcuIGZ1bmN0aW9uIChzb3VyY2VQb3NpdGlvbiwgcG9zaXRpb24sIHRhZywgaHRtbCwgaXNDbG9zaW5nKVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZXNjYXBlSHRtbFxuICogQHJldHVybiB7U3RyaW5nfVxuICovXG5mdW5jdGlvbiBwYXJzZVRhZyhodG1sLCBvblRhZywgZXNjYXBlSHRtbCkge1xuICBcInVzZSBzdHJpY3RcIjtcblxuICB2YXIgcmV0aHRtbCA9IFwiXCI7XG4gIHZhciBsYXN0UG9zID0gMDtcbiAgdmFyIHRhZ1N0YXJ0ID0gZmFsc2U7XG4gIHZhciBxdW90ZVN0YXJ0ID0gZmFsc2U7XG4gIHZhciBjdXJyZW50UG9zID0gMDtcbiAgdmFyIGxlbiA9IGh0bWwubGVuZ3RoO1xuICB2YXIgY3VycmVudFRhZ05hbWUgPSBcIlwiO1xuICB2YXIgY3VycmVudEh0bWwgPSBcIlwiO1xuXG4gIGNoYXJpdGVyYXRvcjogZm9yIChjdXJyZW50UG9zID0gMDsgY3VycmVudFBvcyA8IGxlbjsgY3VycmVudFBvcysrKSB7XG4gICAgdmFyIGMgPSBodG1sLmNoYXJBdChjdXJyZW50UG9zKTtcbiAgICBpZiAodGFnU3RhcnQgPT09IGZhbHNlKSB7XG4gICAgICBpZiAoYyA9PT0gXCI8XCIpIHtcbiAgICAgICAgdGFnU3RhcnQgPSBjdXJyZW50UG9zO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHF1b3RlU3RhcnQgPT09IGZhbHNlKSB7XG4gICAgICAgIGlmIChjID09PSBcIjxcIikge1xuICAgICAgICAgIHJldGh0bWwgKz0gZXNjYXBlSHRtbChodG1sLnNsaWNlKGxhc3RQb3MsIGN1cnJlbnRQb3MpKTtcbiAgICAgICAgICB0YWdTdGFydCA9IGN1cnJlbnRQb3M7XG4gICAgICAgICAgbGFzdFBvcyA9IGN1cnJlbnRQb3M7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGMgPT09IFwiPlwiIHx8IGN1cnJlbnRQb3MgPT09IGxlbiAtIDEpIHtcbiAgICAgICAgICByZXRodG1sICs9IGVzY2FwZUh0bWwoaHRtbC5zbGljZShsYXN0UG9zLCB0YWdTdGFydCkpO1xuICAgICAgICAgIGN1cnJlbnRIdG1sID0gaHRtbC5zbGljZSh0YWdTdGFydCwgY3VycmVudFBvcyArIDEpO1xuICAgICAgICAgIGN1cnJlbnRUYWdOYW1lID0gZ2V0VGFnTmFtZShjdXJyZW50SHRtbCk7XG4gICAgICAgICAgcmV0aHRtbCArPSBvblRhZyhcbiAgICAgICAgICAgIHRhZ1N0YXJ0LFxuICAgICAgICAgICAgcmV0aHRtbC5sZW5ndGgsXG4gICAgICAgICAgICBjdXJyZW50VGFnTmFtZSxcbiAgICAgICAgICAgIGN1cnJlbnRIdG1sLFxuICAgICAgICAgICAgaXNDbG9zaW5nKGN1cnJlbnRIdG1sKVxuICAgICAgICAgICk7XG4gICAgICAgICAgbGFzdFBvcyA9IGN1cnJlbnRQb3MgKyAxO1xuICAgICAgICAgIHRhZ1N0YXJ0ID0gZmFsc2U7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGMgPT09ICdcIicgfHwgYyA9PT0gXCInXCIpIHtcbiAgICAgICAgICB2YXIgaSA9IDE7XG4gICAgICAgICAgdmFyIGljID0gaHRtbC5jaGFyQXQoY3VycmVudFBvcyAtIGkpO1xuXG4gICAgICAgICAgd2hpbGUgKGljLnRyaW0oKSA9PT0gXCJcIiB8fCBpYyA9PT0gXCI9XCIpIHtcbiAgICAgICAgICAgIGlmIChpYyA9PT0gXCI9XCIpIHtcbiAgICAgICAgICAgICAgcXVvdGVTdGFydCA9IGM7XG4gICAgICAgICAgICAgIGNvbnRpbnVlIGNoYXJpdGVyYXRvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGljID0gaHRtbC5jaGFyQXQoY3VycmVudFBvcyAtICsraSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoYyA9PT0gcXVvdGVTdGFydCkge1xuICAgICAgICAgIHF1b3RlU3RhcnQgPSBmYWxzZTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAobGFzdFBvcyA8IGxlbikge1xuICAgIHJldGh0bWwgKz0gZXNjYXBlSHRtbChodG1sLnN1YnN0cihsYXN0UG9zKSk7XG4gIH1cblxuICByZXR1cm4gcmV0aHRtbDtcbn1cblxudmFyIFJFR0VYUF9JTExFR0FMX0FUVFJfTkFNRSA9IC9bXmEtekEtWjAtOVxcXFxfOi4tXS9naW07XG5cbi8qKlxuICogcGFyc2UgaW5wdXQgYXR0cmlidXRlcyBhbmQgcmV0dXJucyBwcm9jZXNzZWQgYXR0cmlidXRlc1xuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBodG1sIGUuZy4gYGhyZWY9XCIjXCIgdGFyZ2V0PVwiX2JsYW5rXCJgXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkF0dHIgZS5nLiBgZnVuY3Rpb24gKG5hbWUsIHZhbHVlKWBcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqL1xuZnVuY3Rpb24gcGFyc2VBdHRyKGh0bWwsIG9uQXR0cikge1xuICBcInVzZSBzdHJpY3RcIjtcblxuICB2YXIgbGFzdFBvcyA9IDA7XG4gIHZhciBsYXN0TWFya1BvcyA9IDA7XG4gIHZhciByZXRBdHRycyA9IFtdO1xuICB2YXIgdG1wTmFtZSA9IGZhbHNlO1xuICB2YXIgbGVuID0gaHRtbC5sZW5ndGg7XG5cbiAgZnVuY3Rpb24gYWRkQXR0cihuYW1lLCB2YWx1ZSkge1xuICAgIG5hbWUgPSBfLnRyaW0obmFtZSk7XG4gICAgbmFtZSA9IG5hbWUucmVwbGFjZShSRUdFWFBfSUxMRUdBTF9BVFRSX05BTUUsIFwiXCIpLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKG5hbWUubGVuZ3RoIDwgMSkgcmV0dXJuO1xuICAgIHZhciByZXQgPSBvbkF0dHIobmFtZSwgdmFsdWUgfHwgXCJcIik7XG4gICAgaWYgKHJldCkgcmV0QXR0cnMucHVzaChyZXQpO1xuICB9XG5cbiAgLy8g6YCQ5Liq5YiG5p6Q5a2X56ymXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICB2YXIgYyA9IGh0bWwuY2hhckF0KGkpO1xuICAgIHZhciB2LCBqO1xuICAgIGlmICh0bXBOYW1lID09PSBmYWxzZSAmJiBjID09PSBcIj1cIikge1xuICAgICAgdG1wTmFtZSA9IGh0bWwuc2xpY2UobGFzdFBvcywgaSk7XG4gICAgICBsYXN0UG9zID0gaSArIDE7XG4gICAgICBsYXN0TWFya1BvcyA9IGh0bWwuY2hhckF0KGxhc3RQb3MpID09PSAnXCInIHx8IGh0bWwuY2hhckF0KGxhc3RQb3MpID09PSBcIidcIiA/IGxhc3RQb3MgOiBmaW5kTmV4dFF1b3RhdGlvbk1hcmsoaHRtbCwgaSArIDEpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmICh0bXBOYW1lICE9PSBmYWxzZSkge1xuICAgICAgaWYgKFxuICAgICAgICBpID09PSBsYXN0TWFya1Bvc1xuICAgICAgKSB7XG4gICAgICAgIGogPSBodG1sLmluZGV4T2YoYywgaSArIDEpO1xuICAgICAgICBpZiAoaiA9PT0gLTEpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2ID0gXy50cmltKGh0bWwuc2xpY2UobGFzdE1hcmtQb3MgKyAxLCBqKSk7XG4gICAgICAgICAgYWRkQXR0cih0bXBOYW1lLCB2KTtcbiAgICAgICAgICB0bXBOYW1lID0gZmFsc2U7XG4gICAgICAgICAgaSA9IGo7XG4gICAgICAgICAgbGFzdFBvcyA9IGkgKyAxO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmICgvXFxzfFxcbnxcXHQvLnRlc3QoYykpIHtcbiAgICAgIGh0bWwgPSBodG1sLnJlcGxhY2UoL1xcc3xcXG58XFx0L2csIFwiIFwiKTtcbiAgICAgIGlmICh0bXBOYW1lID09PSBmYWxzZSkge1xuICAgICAgICBqID0gZmluZE5leHRFcXVhbChodG1sLCBpKTtcbiAgICAgICAgaWYgKGogPT09IC0xKSB7XG4gICAgICAgICAgdiA9IF8udHJpbShodG1sLnNsaWNlKGxhc3RQb3MsIGkpKTtcbiAgICAgICAgICBhZGRBdHRyKHYpO1xuICAgICAgICAgIHRtcE5hbWUgPSBmYWxzZTtcbiAgICAgICAgICBsYXN0UG9zID0gaSArIDE7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaSA9IGogLSAxO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBqID0gZmluZEJlZm9yZUVxdWFsKGh0bWwsIGkgLSAxKTtcbiAgICAgICAgaWYgKGogPT09IC0xKSB7XG4gICAgICAgICAgdiA9IF8udHJpbShodG1sLnNsaWNlKGxhc3RQb3MsIGkpKTtcbiAgICAgICAgICB2ID0gc3RyaXBRdW90ZVdyYXAodik7XG4gICAgICAgICAgYWRkQXR0cih0bXBOYW1lLCB2KTtcbiAgICAgICAgICB0bXBOYW1lID0gZmFsc2U7XG4gICAgICAgICAgbGFzdFBvcyA9IGkgKyAxO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGxhc3RQb3MgPCBodG1sLmxlbmd0aCkge1xuICAgIGlmICh0bXBOYW1lID09PSBmYWxzZSkge1xuICAgICAgYWRkQXR0cihodG1sLnNsaWNlKGxhc3RQb3MpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYWRkQXR0cih0bXBOYW1lLCBzdHJpcFF1b3RlV3JhcChfLnRyaW0oaHRtbC5zbGljZShsYXN0UG9zKSkpKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gXy50cmltKHJldEF0dHJzLmpvaW4oXCIgXCIpKTtcbn1cblxuZnVuY3Rpb24gZmluZE5leHRFcXVhbChzdHIsIGkpIHtcbiAgZm9yICg7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgYyA9IHN0cltpXTtcbiAgICBpZiAoYyA9PT0gXCIgXCIpIGNvbnRpbnVlO1xuICAgIGlmIChjID09PSBcIj1cIikgcmV0dXJuIGk7XG4gICAgcmV0dXJuIC0xO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmROZXh0UXVvdGF0aW9uTWFyayhzdHIsIGkpIHtcbiAgZm9yICg7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgYyA9IHN0cltpXTtcbiAgICBpZiAoYyA9PT0gXCIgXCIpIGNvbnRpbnVlO1xuICAgIGlmIChjID09PSBcIidcIiB8fCBjID09PSAnXCInKSByZXR1cm4gaTtcbiAgICByZXR1cm4gLTE7XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluZEJlZm9yZUVxdWFsKHN0ciwgaSkge1xuICBmb3IgKDsgaSA+IDA7IGktLSkge1xuICAgIHZhciBjID0gc3RyW2ldO1xuICAgIGlmIChjID09PSBcIiBcIikgY29udGludWU7XG4gICAgaWYgKGMgPT09IFwiPVwiKSByZXR1cm4gaTtcbiAgICByZXR1cm4gLTE7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNRdW90ZVdyYXBTdHJpbmcodGV4dCkge1xuICBpZiAoXG4gICAgKHRleHRbMF0gPT09ICdcIicgJiYgdGV4dFt0ZXh0Lmxlbmd0aCAtIDFdID09PSAnXCInKSB8fFxuICAgICh0ZXh0WzBdID09PSBcIidcIiAmJiB0ZXh0W3RleHQubGVuZ3RoIC0gMV0gPT09IFwiJ1wiKVxuICApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gc3RyaXBRdW90ZVdyYXAodGV4dCkge1xuICBpZiAoaXNRdW90ZVdyYXBTdHJpbmcodGV4dCkpIHtcbiAgICByZXR1cm4gdGV4dC5zdWJzdHIoMSwgdGV4dC5sZW5ndGggLSAyKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdGV4dDtcbiAgfVxufVxuXG5leHBvcnRzLnBhcnNlVGFnID0gcGFyc2VUYWc7XG5leHBvcnRzLnBhcnNlQXR0ciA9IHBhcnNlQXR0cjtcbiIsIi8qKlxuICogZmlsdGVyIHhzc1xuICpcbiAqIEBhdXRob3IgWm9uZ21pbiBMZWk8bGVpem9uZ21pbkBnbWFpbC5jb20+XG4gKi9cblxudmFyIEZpbHRlckNTUyA9IHJlcXVpcmUoXCJjc3NmaWx0ZXJcIikuRmlsdGVyQ1NTO1xudmFyIERFRkFVTFQgPSByZXF1aXJlKFwiLi9kZWZhdWx0XCIpO1xudmFyIHBhcnNlciA9IHJlcXVpcmUoXCIuL3BhcnNlclwiKTtcbnZhciBwYXJzZVRhZyA9IHBhcnNlci5wYXJzZVRhZztcbnZhciBwYXJzZUF0dHIgPSBwYXJzZXIucGFyc2VBdHRyO1xudmFyIF8gPSByZXF1aXJlKFwiLi91dGlsXCIpO1xuXG4vKipcbiAqIHJldHVybnMgYHRydWVgIGlmIHRoZSBpbnB1dCB2YWx1ZSBpcyBgdW5kZWZpbmVkYCBvciBgbnVsbGBcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5mdW5jdGlvbiBpc051bGwob2JqKSB7XG4gIHJldHVybiBvYmogPT09IHVuZGVmaW5lZCB8fCBvYmogPT09IG51bGw7XG59XG5cbi8qKlxuICogZ2V0IGF0dHJpYnV0ZXMgZm9yIGEgdGFnXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGh0bWxcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqICAgLSB7U3RyaW5nfSBodG1sXG4gKiAgIC0ge0Jvb2xlYW59IGNsb3NpbmdcbiAqL1xuZnVuY3Rpb24gZ2V0QXR0cnMoaHRtbCkge1xuICB2YXIgaSA9IF8uc3BhY2VJbmRleChodG1sKTtcbiAgaWYgKGkgPT09IC0xKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGh0bWw6IFwiXCIsXG4gICAgICBjbG9zaW5nOiBodG1sW2h0bWwubGVuZ3RoIC0gMl0gPT09IFwiL1wiLFxuICAgIH07XG4gIH1cbiAgaHRtbCA9IF8udHJpbShodG1sLnNsaWNlKGkgKyAxLCAtMSkpO1xuICB2YXIgaXNDbG9zaW5nID0gaHRtbFtodG1sLmxlbmd0aCAtIDFdID09PSBcIi9cIjtcbiAgaWYgKGlzQ2xvc2luZykgaHRtbCA9IF8udHJpbShodG1sLnNsaWNlKDAsIC0xKSk7XG4gIHJldHVybiB7XG4gICAgaHRtbDogaHRtbCxcbiAgICBjbG9zaW5nOiBpc0Nsb3NpbmcsXG4gIH07XG59XG5cbi8qKlxuICogc2hhbGxvdyBjb3B5XG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9ialxuICogQHJldHVybiB7T2JqZWN0fVxuICovXG5mdW5jdGlvbiBzaGFsbG93Q29weU9iamVjdChvYmopIHtcbiAgdmFyIHJldCA9IHt9O1xuICBmb3IgKHZhciBpIGluIG9iaikge1xuICAgIHJldFtpXSA9IG9ialtpXTtcbiAgfVxuICByZXR1cm4gcmV0O1xufVxuXG5mdW5jdGlvbiBrZXlzVG9Mb3dlckNhc2Uob2JqKSB7XG4gIHZhciByZXQgPSB7fTtcbiAgZm9yICh2YXIgaSBpbiBvYmopIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShvYmpbaV0pKSB7XG4gICAgICByZXRbaS50b0xvd2VyQ2FzZSgpXSA9IG9ialtpXS5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgcmV0dXJuIGl0ZW0udG9Mb3dlckNhc2UoKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXRbaS50b0xvd2VyQ2FzZSgpXSA9IG9ialtpXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuLyoqXG4gKiBGaWx0ZXJYU1MgY2xhc3NcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICogICAgICAgIHdoaXRlTGlzdCAob3IgYWxsb3dMaXN0KSwgb25UYWcsIG9uVGFnQXR0ciwgb25JZ25vcmVUYWcsXG4gKiAgICAgICAgb25JZ25vcmVUYWdBdHRyLCBzYWZlQXR0clZhbHVlLCBlc2NhcGVIdG1sXG4gKiAgICAgICAgc3RyaXBJZ25vcmVUYWdCb2R5LCBhbGxvd0NvbW1lbnRUYWcsIHN0cmlwQmxhbmtDaGFyXG4gKiAgICAgICAgY3Nze3doaXRlTGlzdCwgb25BdHRyLCBvbklnbm9yZUF0dHJ9IGBjc3M9ZmFsc2VgIG1lYW5zIGRvbid0IHVzZSBgY3NzZmlsdGVyYFxuICovXG5mdW5jdGlvbiBGaWx0ZXJYU1Mob3B0aW9ucykge1xuICBvcHRpb25zID0gc2hhbGxvd0NvcHlPYmplY3Qob3B0aW9ucyB8fCB7fSk7XG5cbiAgaWYgKG9wdGlvbnMuc3RyaXBJZ25vcmVUYWcpIHtcbiAgICBpZiAob3B0aW9ucy5vbklnbm9yZVRhZykge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgJ05vdGVzOiBjYW5ub3QgdXNlIHRoZXNlIHR3byBvcHRpb25zIFwic3RyaXBJZ25vcmVUYWdcIiBhbmQgXCJvbklnbm9yZVRhZ1wiIGF0IHRoZSBzYW1lIHRpbWUnXG4gICAgICApO1xuICAgIH1cbiAgICBvcHRpb25zLm9uSWdub3JlVGFnID0gREVGQVVMVC5vbklnbm9yZVRhZ1N0cmlwQWxsO1xuICB9XG4gIGlmIChvcHRpb25zLndoaXRlTGlzdCB8fCBvcHRpb25zLmFsbG93TGlzdCkge1xuICAgIG9wdGlvbnMud2hpdGVMaXN0ID0ga2V5c1RvTG93ZXJDYXNlKG9wdGlvbnMud2hpdGVMaXN0IHx8IG9wdGlvbnMuYWxsb3dMaXN0KTtcbiAgfSBlbHNlIHtcbiAgICBvcHRpb25zLndoaXRlTGlzdCA9IERFRkFVTFQud2hpdGVMaXN0O1xuICB9XG5cbiAgb3B0aW9ucy5vblRhZyA9IG9wdGlvbnMub25UYWcgfHwgREVGQVVMVC5vblRhZztcbiAgb3B0aW9ucy5vblRhZ0F0dHIgPSBvcHRpb25zLm9uVGFnQXR0ciB8fCBERUZBVUxULm9uVGFnQXR0cjtcbiAgb3B0aW9ucy5vbklnbm9yZVRhZyA9IG9wdGlvbnMub25JZ25vcmVUYWcgfHwgREVGQVVMVC5vbklnbm9yZVRhZztcbiAgb3B0aW9ucy5vbklnbm9yZVRhZ0F0dHIgPSBvcHRpb25zLm9uSWdub3JlVGFnQXR0ciB8fCBERUZBVUxULm9uSWdub3JlVGFnQXR0cjtcbiAgb3B0aW9ucy5zYWZlQXR0clZhbHVlID0gb3B0aW9ucy5zYWZlQXR0clZhbHVlIHx8IERFRkFVTFQuc2FmZUF0dHJWYWx1ZTtcbiAgb3B0aW9ucy5lc2NhcGVIdG1sID0gb3B0aW9ucy5lc2NhcGVIdG1sIHx8IERFRkFVTFQuZXNjYXBlSHRtbDtcbiAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcblxuICBpZiAob3B0aW9ucy5jc3MgPT09IGZhbHNlKSB7XG4gICAgdGhpcy5jc3NGaWx0ZXIgPSBmYWxzZTtcbiAgfSBlbHNlIHtcbiAgICBvcHRpb25zLmNzcyA9IG9wdGlvbnMuY3NzIHx8IHt9O1xuICAgIHRoaXMuY3NzRmlsdGVyID0gbmV3IEZpbHRlckNTUyhvcHRpb25zLmNzcyk7XG4gIH1cbn1cblxuLyoqXG4gKiBzdGFydCBwcm9jZXNzIGFuZCByZXR1cm5zIHJlc3VsdFxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBodG1sXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cbkZpbHRlclhTUy5wcm90b3R5cGUucHJvY2VzcyA9IGZ1bmN0aW9uIChodG1sKSB7XG4gIC8vIGNvbXBhdGlibGUgd2l0aCB0aGUgaW5wdXRcbiAgaHRtbCA9IGh0bWwgfHwgXCJcIjtcbiAgaHRtbCA9IGh0bWwudG9TdHJpbmcoKTtcbiAgaWYgKCFodG1sKSByZXR1cm4gXCJcIjtcblxuICB2YXIgbWUgPSB0aGlzO1xuICB2YXIgb3B0aW9ucyA9IG1lLm9wdGlvbnM7XG4gIHZhciB3aGl0ZUxpc3QgPSBvcHRpb25zLndoaXRlTGlzdDtcbiAgdmFyIG9uVGFnID0gb3B0aW9ucy5vblRhZztcbiAgdmFyIG9uSWdub3JlVGFnID0gb3B0aW9ucy5vbklnbm9yZVRhZztcbiAgdmFyIG9uVGFnQXR0ciA9IG9wdGlvbnMub25UYWdBdHRyO1xuICB2YXIgb25JZ25vcmVUYWdBdHRyID0gb3B0aW9ucy5vbklnbm9yZVRhZ0F0dHI7XG4gIHZhciBzYWZlQXR0clZhbHVlID0gb3B0aW9ucy5zYWZlQXR0clZhbHVlO1xuICB2YXIgZXNjYXBlSHRtbCA9IG9wdGlvbnMuZXNjYXBlSHRtbDtcbiAgdmFyIGNzc0ZpbHRlciA9IG1lLmNzc0ZpbHRlcjtcblxuICAvLyByZW1vdmUgaW52aXNpYmxlIGNoYXJhY3RlcnNcbiAgaWYgKG9wdGlvbnMuc3RyaXBCbGFua0NoYXIpIHtcbiAgICBodG1sID0gREVGQVVMVC5zdHJpcEJsYW5rQ2hhcihodG1sKTtcbiAgfVxuXG4gIC8vIHJlbW92ZSBodG1sIGNvbW1lbnRzXG4gIGlmICghb3B0aW9ucy5hbGxvd0NvbW1lbnRUYWcpIHtcbiAgICBodG1sID0gREVGQVVMVC5zdHJpcENvbW1lbnRUYWcoaHRtbCk7XG4gIH1cblxuICAvLyBpZiBlbmFibGUgc3RyaXBJZ25vcmVUYWdCb2R5XG4gIHZhciBzdHJpcElnbm9yZVRhZ0JvZHkgPSBmYWxzZTtcbiAgaWYgKG9wdGlvbnMuc3RyaXBJZ25vcmVUYWdCb2R5KSB7XG4gICAgc3RyaXBJZ25vcmVUYWdCb2R5ID0gREVGQVVMVC5TdHJpcFRhZ0JvZHkoXG4gICAgICBvcHRpb25zLnN0cmlwSWdub3JlVGFnQm9keSxcbiAgICAgIG9uSWdub3JlVGFnXG4gICAgKTtcbiAgICBvbklnbm9yZVRhZyA9IHN0cmlwSWdub3JlVGFnQm9keS5vbklnbm9yZVRhZztcbiAgfVxuXG4gIHZhciByZXRIdG1sID0gcGFyc2VUYWcoXG4gICAgaHRtbCxcbiAgICBmdW5jdGlvbiAoc291cmNlUG9zaXRpb24sIHBvc2l0aW9uLCB0YWcsIGh0bWwsIGlzQ2xvc2luZykge1xuICAgICAgdmFyIGluZm8gPSB7XG4gICAgICAgIHNvdXJjZVBvc2l0aW9uOiBzb3VyY2VQb3NpdGlvbixcbiAgICAgICAgcG9zaXRpb246IHBvc2l0aW9uLFxuICAgICAgICBpc0Nsb3Npbmc6IGlzQ2xvc2luZyxcbiAgICAgICAgaXNXaGl0ZTogT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHdoaXRlTGlzdCwgdGFnKSxcbiAgICAgIH07XG5cbiAgICAgIC8vIGNhbGwgYG9uVGFnKClgXG4gICAgICB2YXIgcmV0ID0gb25UYWcodGFnLCBodG1sLCBpbmZvKTtcbiAgICAgIGlmICghaXNOdWxsKHJldCkpIHJldHVybiByZXQ7XG5cbiAgICAgIGlmIChpbmZvLmlzV2hpdGUpIHtcbiAgICAgICAgaWYgKGluZm8uaXNDbG9zaW5nKSB7XG4gICAgICAgICAgcmV0dXJuIFwiPC9cIiArIHRhZyArIFwiPlwiO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGF0dHJzID0gZ2V0QXR0cnMoaHRtbCk7XG4gICAgICAgIHZhciB3aGl0ZUF0dHJMaXN0ID0gd2hpdGVMaXN0W3RhZ107XG4gICAgICAgIHZhciBhdHRyc0h0bWwgPSBwYXJzZUF0dHIoYXR0cnMuaHRtbCwgZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7XG4gICAgICAgICAgLy8gY2FsbCBgb25UYWdBdHRyKClgXG4gICAgICAgICAgdmFyIGlzV2hpdGVBdHRyID0gXy5pbmRleE9mKHdoaXRlQXR0ckxpc3QsIG5hbWUpICE9PSAtMTtcbiAgICAgICAgICB2YXIgcmV0ID0gb25UYWdBdHRyKHRhZywgbmFtZSwgdmFsdWUsIGlzV2hpdGVBdHRyKTtcbiAgICAgICAgICBpZiAoIWlzTnVsbChyZXQpKSByZXR1cm4gcmV0O1xuXG4gICAgICAgICAgaWYgKGlzV2hpdGVBdHRyKSB7XG4gICAgICAgICAgICAvLyBjYWxsIGBzYWZlQXR0clZhbHVlKClgXG4gICAgICAgICAgICB2YWx1ZSA9IHNhZmVBdHRyVmFsdWUodGFnLCBuYW1lLCB2YWx1ZSwgY3NzRmlsdGVyKTtcbiAgICAgICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgICByZXR1cm4gbmFtZSArICc9XCInICsgdmFsdWUgKyAnXCInO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG5hbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGNhbGwgYG9uSWdub3JlVGFnQXR0cigpYFxuICAgICAgICAgICAgcmV0ID0gb25JZ25vcmVUYWdBdHRyKHRhZywgbmFtZSwgdmFsdWUsIGlzV2hpdGVBdHRyKTtcbiAgICAgICAgICAgIGlmICghaXNOdWxsKHJldCkpIHJldHVybiByZXQ7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBidWlsZCBuZXcgdGFnIGh0bWxcbiAgICAgICAgaHRtbCA9IFwiPFwiICsgdGFnO1xuICAgICAgICBpZiAoYXR0cnNIdG1sKSBodG1sICs9IFwiIFwiICsgYXR0cnNIdG1sO1xuICAgICAgICBpZiAoYXR0cnMuY2xvc2luZykgaHRtbCArPSBcIiAvXCI7XG4gICAgICAgIGh0bWwgKz0gXCI+XCI7XG4gICAgICAgIHJldHVybiBodG1sO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gY2FsbCBgb25JZ25vcmVUYWcoKWBcbiAgICAgICAgcmV0ID0gb25JZ25vcmVUYWcodGFnLCBodG1sLCBpbmZvKTtcbiAgICAgICAgaWYgKCFpc051bGwocmV0KSkgcmV0dXJuIHJldDtcbiAgICAgICAgcmV0dXJuIGVzY2FwZUh0bWwoaHRtbCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBlc2NhcGVIdG1sXG4gICk7XG5cbiAgLy8gaWYgZW5hYmxlIHN0cmlwSWdub3JlVGFnQm9keVxuICBpZiAoc3RyaXBJZ25vcmVUYWdCb2R5KSB7XG4gICAgcmV0SHRtbCA9IHN0cmlwSWdub3JlVGFnQm9keS5yZW1vdmUocmV0SHRtbCk7XG4gIH1cblxuICByZXR1cm4gcmV0SHRtbDtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gRmlsdGVyWFNTO1xuIiwiLyoqXG4gKiB4c3NcbiAqXG4gKiBAYXV0aG9yIFpvbmdtaW4gTGVpPGxlaXpvbmdtaW5AZ21haWwuY29tPlxuICovXG5cbnZhciBERUZBVUxUID0gcmVxdWlyZShcIi4vZGVmYXVsdFwiKTtcbnZhciBwYXJzZXIgPSByZXF1aXJlKFwiLi9wYXJzZXJcIik7XG52YXIgRmlsdGVyWFNTID0gcmVxdWlyZShcIi4veHNzXCIpO1xuXG4vKipcbiAqIGZpbHRlciB4c3MgZnVuY3Rpb25cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gaHRtbFxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgeyB3aGl0ZUxpc3QsIG9uVGFnLCBvblRhZ0F0dHIsIG9uSWdub3JlVGFnLCBvbklnbm9yZVRhZ0F0dHIsIHNhZmVBdHRyVmFsdWUsIGVzY2FwZUh0bWwgfVxuICogQHJldHVybiB7U3RyaW5nfVxuICovXG5mdW5jdGlvbiBmaWx0ZXJYU1MoaHRtbCwgb3B0aW9ucykge1xuICB2YXIgeHNzID0gbmV3IEZpbHRlclhTUyhvcHRpb25zKTtcbiAgcmV0dXJuIHhzcy5wcm9jZXNzKGh0bWwpO1xufVxuXG5leHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBmaWx0ZXJYU1M7XG5leHBvcnRzLmZpbHRlclhTUyA9IGZpbHRlclhTUztcbmV4cG9ydHMuRmlsdGVyWFNTID0gRmlsdGVyWFNTO1xuXG4oZnVuY3Rpb24gKCkge1xuICBmb3IgKHZhciBpIGluIERFRkFVTFQpIHtcbiAgICBleHBvcnRzW2ldID0gREVGQVVMVFtpXTtcbiAgfVxuICBmb3IgKHZhciBqIGluIHBhcnNlcikge1xuICAgIGV4cG9ydHNbal0gPSBwYXJzZXJbal07XG4gIH1cbn0pKCk7XG5cbi8vIHVzaW5nIGB4c3NgIG9uIHRoZSBicm93c2VyLCBvdXRwdXQgYGZpbHRlclhTU2AgdG8gdGhlIGdsb2JhbHNcbmlmICh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gIHdpbmRvdy5maWx0ZXJYU1MgPSBtb2R1bGUuZXhwb3J0cztcbn1cblxuLy8gdXNpbmcgYHhzc2Agb24gdGhlIFdlYldvcmtlciwgb3V0cHV0IGBmaWx0ZXJYU1NgIHRvIHRoZSBnbG9iYWxzXG5mdW5jdGlvbiBpc1dvcmtlckVudigpIHtcbiAgcmV0dXJuIChcbiAgICB0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgIHR5cGVvZiBEZWRpY2F0ZWRXb3JrZXJHbG9iYWxTY29wZSAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgIHNlbGYgaW5zdGFuY2VvZiBEZWRpY2F0ZWRXb3JrZXJHbG9iYWxTY29wZVxuICApO1xufVxuaWYgKGlzV29ya2VyRW52KCkpIHtcbiAgc2VsZi5maWx0ZXJYU1MgPSBtb2R1bGUuZXhwb3J0cztcbn1cbiIsImltcG9ydCB7IEJveCwgVGV4dCwgVmFsdWVHcm91cCB9IGZyb20gJ0BhZG1pbmpzL2Rlc2lnbi1zeXN0ZW0nXG5pbXBvcnQgUmVhY3QsIHsgRkMgfSBmcm9tICdyZWFjdCdcbmltcG9ydCB4c3MgZnJvbSAneHNzJ1xuXG5pbXBvcnQgeyBFZGl0UHJvcGVydHlQcm9wcyB9IGZyb20gJy4uL2Jhc2UtcHJvcGVydHktcHJvcHMnXG5pbXBvcnQgYWxsb3dPdmVycmlkZSBmcm9tICcuLi8uLi8uLi9ob2MvYWxsb3ctb3ZlcnJpZGUnXG5cbnR5cGUgSW5uZXJIdG1sUHJvcCA9IHtcbiAgX19odG1sOiBzdHJpbmc7XG59XG5cbmNvbnN0IFNob3c6IEZDPEVkaXRQcm9wZXJ0eVByb3BzPiA9IChwcm9wcykgPT4ge1xuICBjb25zdCB7IHByb3BlcnR5LCByZWNvcmQgfSA9IHByb3BzXG5cbiAgY29uc3QgdmFsdWU6IHN0cmluZyA9IHJlY29yZC5wYXJhbXNbcHJvcGVydHkucGF0aF0gfHwgJydcblxuICBjb25zdCBjcmVhdGVNYXJrdXAgPSAoaHRtbDogc3RyaW5nKTogSW5uZXJIdG1sUHJvcCA9PiAoeyBfX2h0bWw6IHhzcyhodG1sKSB9KVxuXG4gIHJldHVybiAoXG4gICAgPFZhbHVlR3JvdXAgbGFiZWw9e3Byb3BlcnR5LmxhYmVsfT5cbiAgICAgIDxCb3ggcHk9XCJ4bFwiIHB4PXtbJzAnLCAneGwnXX0gYm9yZGVyPVwiZGVmYXVsdFwiPlxuICAgICAgICA8VGV4dCBkYW5nZXJvdXNseVNldElubmVySFRNTD17Y3JlYXRlTWFya3VwKHZhbHVlKX0gLz5cbiAgICAgIDwvQm94PlxuICAgIDwvVmFsdWVHcm91cD5cbiAgKVxufVxuXG5leHBvcnQgZGVmYXVsdCBhbGxvd092ZXJyaWRlKFNob3csICdEZWZhdWx0UmljaHRleHRTaG93UHJvcGVydHknKVxuIiwiLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyB0aGVcbiAqIFtsYW5ndWFnZSB0eXBlXShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtZWNtYXNjcmlwdC1sYW5ndWFnZS10eXBlcylcbiAqIG9mIGBPYmplY3RgLiAoZS5nLiBhcnJheXMsIGZ1bmN0aW9ucywgb2JqZWN0cywgcmVnZXhlcywgYG5ldyBOdW1iZXIoMClgLCBhbmQgYG5ldyBTdHJpbmcoJycpYClcbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdCh7fSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QoXy5ub29wKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3QodmFsdWUpIHtcbiAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gIHJldHVybiB2YWx1ZSAhPSBudWxsICYmICh0eXBlID09ICdvYmplY3QnIHx8IHR5cGUgPT0gJ2Z1bmN0aW9uJyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNPYmplY3Q7XG4iLCJ2YXIgYmFzZUdldFRhZyA9IHJlcXVpcmUoJy4vX2Jhc2VHZXRUYWcnKSxcbiAgICBpc09iamVjdExpa2UgPSByZXF1aXJlKCcuL2lzT2JqZWN0TGlrZScpO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgcmVnZXhwVGFnID0gJ1tvYmplY3QgUmVnRXhwXSc7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNSZWdFeHBgIHdpdGhvdXQgTm9kZS5qcyBvcHRpbWl6YXRpb25zLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgcmVnZXhwLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VJc1JlZ0V4cCh2YWx1ZSkge1xuICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBiYXNlR2V0VGFnKHZhbHVlKSA9PSByZWdleHBUYWc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUlzUmVnRXhwO1xuIiwiLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy51bmFyeWAgd2l0aG91dCBzdXBwb3J0IGZvciBzdG9yaW5nIG1ldGFkYXRhLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBjYXAgYXJndW1lbnRzIGZvci5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGNhcHBlZCBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gYmFzZVVuYXJ5KGZ1bmMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgcmV0dXJuIGZ1bmModmFsdWUpO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VVbmFyeTtcbiIsInZhciBmcmVlR2xvYmFsID0gcmVxdWlyZSgnLi9fZnJlZUdsb2JhbCcpO1xuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYGV4cG9ydHNgLiAqL1xudmFyIGZyZWVFeHBvcnRzID0gdHlwZW9mIGV4cG9ydHMgPT0gJ29iamVjdCcgJiYgZXhwb3J0cyAmJiAhZXhwb3J0cy5ub2RlVHlwZSAmJiBleHBvcnRzO1xuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYG1vZHVsZWAuICovXG52YXIgZnJlZU1vZHVsZSA9IGZyZWVFeHBvcnRzICYmIHR5cGVvZiBtb2R1bGUgPT0gJ29iamVjdCcgJiYgbW9kdWxlICYmICFtb2R1bGUubm9kZVR5cGUgJiYgbW9kdWxlO1xuXG4vKiogRGV0ZWN0IHRoZSBwb3B1bGFyIENvbW1vbkpTIGV4dGVuc2lvbiBgbW9kdWxlLmV4cG9ydHNgLiAqL1xudmFyIG1vZHVsZUV4cG9ydHMgPSBmcmVlTW9kdWxlICYmIGZyZWVNb2R1bGUuZXhwb3J0cyA9PT0gZnJlZUV4cG9ydHM7XG5cbi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgcHJvY2Vzc2AgZnJvbSBOb2RlLmpzLiAqL1xudmFyIGZyZWVQcm9jZXNzID0gbW9kdWxlRXhwb3J0cyAmJiBmcmVlR2xvYmFsLnByb2Nlc3M7XG5cbi8qKiBVc2VkIHRvIGFjY2VzcyBmYXN0ZXIgTm9kZS5qcyBoZWxwZXJzLiAqL1xudmFyIG5vZGVVdGlsID0gKGZ1bmN0aW9uKCkge1xuICB0cnkge1xuICAgIC8vIFVzZSBgdXRpbC50eXBlc2AgZm9yIE5vZGUuanMgMTArLlxuICAgIHZhciB0eXBlcyA9IGZyZWVNb2R1bGUgJiYgZnJlZU1vZHVsZS5yZXF1aXJlICYmIGZyZWVNb2R1bGUucmVxdWlyZSgndXRpbCcpLnR5cGVzO1xuXG4gICAgaWYgKHR5cGVzKSB7XG4gICAgICByZXR1cm4gdHlwZXM7XG4gICAgfVxuXG4gICAgLy8gTGVnYWN5IGBwcm9jZXNzLmJpbmRpbmcoJ3V0aWwnKWAgZm9yIE5vZGUuanMgPCAxMC5cbiAgICByZXR1cm4gZnJlZVByb2Nlc3MgJiYgZnJlZVByb2Nlc3MuYmluZGluZyAmJiBmcmVlUHJvY2Vzcy5iaW5kaW5nKCd1dGlsJyk7XG4gIH0gY2F0Y2ggKGUpIHt9XG59KCkpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IG5vZGVVdGlsO1xuIiwidmFyIGJhc2VJc1JlZ0V4cCA9IHJlcXVpcmUoJy4vX2Jhc2VJc1JlZ0V4cCcpLFxuICAgIGJhc2VVbmFyeSA9IHJlcXVpcmUoJy4vX2Jhc2VVbmFyeScpLFxuICAgIG5vZGVVdGlsID0gcmVxdWlyZSgnLi9fbm9kZVV0aWwnKTtcblxuLyogTm9kZS5qcyBoZWxwZXIgcmVmZXJlbmNlcy4gKi9cbnZhciBub2RlSXNSZWdFeHAgPSBub2RlVXRpbCAmJiBub2RlVXRpbC5pc1JlZ0V4cDtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYFJlZ0V4cGAgb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgcmVnZXhwLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNSZWdFeHAoL2FiYy8pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNSZWdFeHAoJy9hYmMvJyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG52YXIgaXNSZWdFeHAgPSBub2RlSXNSZWdFeHAgPyBiYXNlVW5hcnkobm9kZUlzUmVnRXhwKSA6IGJhc2VJc1JlZ0V4cDtcblxubW9kdWxlLmV4cG9ydHMgPSBpc1JlZ0V4cDtcbiIsIi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucHJvcGVydHlgIHdpdGhvdXQgc3VwcG9ydCBmb3IgZGVlcCBwYXRocy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBhY2Nlc3NvciBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gYmFzZVByb3BlcnR5KGtleSkge1xuICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gdW5kZWZpbmVkIDogb2JqZWN0W2tleV07XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVByb3BlcnR5O1xuIiwidmFyIGJhc2VQcm9wZXJ0eSA9IHJlcXVpcmUoJy4vX2Jhc2VQcm9wZXJ0eScpO1xuXG4vKipcbiAqIEdldHMgdGhlIHNpemUgb2YgYW4gQVNDSUkgYHN0cmluZ2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyBpbnNwZWN0LlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgc3RyaW5nIHNpemUuXG4gKi9cbnZhciBhc2NpaVNpemUgPSBiYXNlUHJvcGVydHkoJ2xlbmd0aCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGFzY2lpU2l6ZTtcbiIsIi8qKiBVc2VkIHRvIGNvbXBvc2UgdW5pY29kZSBjaGFyYWN0ZXIgY2xhc3Nlcy4gKi9cbnZhciByc0FzdHJhbFJhbmdlID0gJ1xcXFx1ZDgwMC1cXFxcdWRmZmYnLFxuICAgIHJzQ29tYm9NYXJrc1JhbmdlID0gJ1xcXFx1MDMwMC1cXFxcdTAzNmYnLFxuICAgIHJlQ29tYm9IYWxmTWFya3NSYW5nZSA9ICdcXFxcdWZlMjAtXFxcXHVmZTJmJyxcbiAgICByc0NvbWJvU3ltYm9sc1JhbmdlID0gJ1xcXFx1MjBkMC1cXFxcdTIwZmYnLFxuICAgIHJzQ29tYm9SYW5nZSA9IHJzQ29tYm9NYXJrc1JhbmdlICsgcmVDb21ib0hhbGZNYXJrc1JhbmdlICsgcnNDb21ib1N5bWJvbHNSYW5nZSxcbiAgICByc1ZhclJhbmdlID0gJ1xcXFx1ZmUwZVxcXFx1ZmUwZic7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgdW5pY29kZSBjYXB0dXJlIGdyb3Vwcy4gKi9cbnZhciByc0FzdHJhbCA9ICdbJyArIHJzQXN0cmFsUmFuZ2UgKyAnXScsXG4gICAgcnNDb21ibyA9ICdbJyArIHJzQ29tYm9SYW5nZSArICddJyxcbiAgICByc0ZpdHogPSAnXFxcXHVkODNjW1xcXFx1ZGZmYi1cXFxcdWRmZmZdJyxcbiAgICByc01vZGlmaWVyID0gJyg/OicgKyByc0NvbWJvICsgJ3wnICsgcnNGaXR6ICsgJyknLFxuICAgIHJzTm9uQXN0cmFsID0gJ1teJyArIHJzQXN0cmFsUmFuZ2UgKyAnXScsXG4gICAgcnNSZWdpb25hbCA9ICcoPzpcXFxcdWQ4M2NbXFxcXHVkZGU2LVxcXFx1ZGRmZl0pezJ9JyxcbiAgICByc1N1cnJQYWlyID0gJ1tcXFxcdWQ4MDAtXFxcXHVkYmZmXVtcXFxcdWRjMDAtXFxcXHVkZmZmXScsXG4gICAgcnNaV0ogPSAnXFxcXHUyMDBkJztcblxuLyoqIFVzZWQgdG8gY29tcG9zZSB1bmljb2RlIHJlZ2V4ZXMuICovXG52YXIgcmVPcHRNb2QgPSByc01vZGlmaWVyICsgJz8nLFxuICAgIHJzT3B0VmFyID0gJ1snICsgcnNWYXJSYW5nZSArICddPycsXG4gICAgcnNPcHRKb2luID0gJyg/OicgKyByc1pXSiArICcoPzonICsgW3JzTm9uQXN0cmFsLCByc1JlZ2lvbmFsLCByc1N1cnJQYWlyXS5qb2luKCd8JykgKyAnKScgKyByc09wdFZhciArIHJlT3B0TW9kICsgJykqJyxcbiAgICByc1NlcSA9IHJzT3B0VmFyICsgcmVPcHRNb2QgKyByc09wdEpvaW4sXG4gICAgcnNTeW1ib2wgPSAnKD86JyArIFtyc05vbkFzdHJhbCArIHJzQ29tYm8gKyAnPycsIHJzQ29tYm8sIHJzUmVnaW9uYWwsIHJzU3VyclBhaXIsIHJzQXN0cmFsXS5qb2luKCd8JykgKyAnKSc7XG5cbi8qKiBVc2VkIHRvIG1hdGNoIFtzdHJpbmcgc3ltYm9sc10oaHR0cHM6Ly9tYXRoaWFzYnluZW5zLmJlL25vdGVzL2phdmFzY3JpcHQtdW5pY29kZSkuICovXG52YXIgcmVVbmljb2RlID0gUmVnRXhwKHJzRml0eiArICcoPz0nICsgcnNGaXR6ICsgJyl8JyArIHJzU3ltYm9sICsgcnNTZXEsICdnJyk7XG5cbi8qKlxuICogR2V0cyB0aGUgc2l6ZSBvZiBhIFVuaWNvZGUgYHN0cmluZ2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyBpbnNwZWN0LlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgc3RyaW5nIHNpemUuXG4gKi9cbmZ1bmN0aW9uIHVuaWNvZGVTaXplKHN0cmluZykge1xuICB2YXIgcmVzdWx0ID0gcmVVbmljb2RlLmxhc3RJbmRleCA9IDA7XG4gIHdoaWxlIChyZVVuaWNvZGUudGVzdChzdHJpbmcpKSB7XG4gICAgKytyZXN1bHQ7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB1bmljb2RlU2l6ZTtcbiIsInZhciBhc2NpaVNpemUgPSByZXF1aXJlKCcuL19hc2NpaVNpemUnKSxcbiAgICBoYXNVbmljb2RlID0gcmVxdWlyZSgnLi9faGFzVW5pY29kZScpLFxuICAgIHVuaWNvZGVTaXplID0gcmVxdWlyZSgnLi9fdW5pY29kZVNpemUnKTtcblxuLyoqXG4gKiBHZXRzIHRoZSBudW1iZXIgb2Ygc3ltYm9scyBpbiBgc3RyaW5nYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGluc3BlY3QuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBzdHJpbmcgc2l6ZS5cbiAqL1xuZnVuY3Rpb24gc3RyaW5nU2l6ZShzdHJpbmcpIHtcbiAgcmV0dXJuIGhhc1VuaWNvZGUoc3RyaW5nKVxuICAgID8gdW5pY29kZVNpemUoc3RyaW5nKVxuICAgIDogYXNjaWlTaXplKHN0cmluZyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc3RyaW5nU2l6ZTtcbiIsIi8qKiBVc2VkIHRvIG1hdGNoIGEgc2luZ2xlIHdoaXRlc3BhY2UgY2hhcmFjdGVyLiAqL1xudmFyIHJlV2hpdGVzcGFjZSA9IC9cXHMvO1xuXG4vKipcbiAqIFVzZWQgYnkgYF8udHJpbWAgYW5kIGBfLnRyaW1FbmRgIHRvIGdldCB0aGUgaW5kZXggb2YgdGhlIGxhc3Qgbm9uLXdoaXRlc3BhY2VcbiAqIGNoYXJhY3RlciBvZiBgc3RyaW5nYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGluc3BlY3QuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbGFzdCBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIuXG4gKi9cbmZ1bmN0aW9uIHRyaW1tZWRFbmRJbmRleChzdHJpbmcpIHtcbiAgdmFyIGluZGV4ID0gc3RyaW5nLmxlbmd0aDtcblxuICB3aGlsZSAoaW5kZXgtLSAmJiByZVdoaXRlc3BhY2UudGVzdChzdHJpbmcuY2hhckF0KGluZGV4KSkpIHt9XG4gIHJldHVybiBpbmRleDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB0cmltbWVkRW5kSW5kZXg7XG4iLCJ2YXIgdHJpbW1lZEVuZEluZGV4ID0gcmVxdWlyZSgnLi9fdHJpbW1lZEVuZEluZGV4Jyk7XG5cbi8qKiBVc2VkIHRvIG1hdGNoIGxlYWRpbmcgd2hpdGVzcGFjZS4gKi9cbnZhciByZVRyaW1TdGFydCA9IC9eXFxzKy87XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udHJpbWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byB0cmltLlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdHJpbW1lZCBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIGJhc2VUcmltKHN0cmluZykge1xuICByZXR1cm4gc3RyaW5nXG4gICAgPyBzdHJpbmcuc2xpY2UoMCwgdHJpbW1lZEVuZEluZGV4KHN0cmluZykgKyAxKS5yZXBsYWNlKHJlVHJpbVN0YXJ0LCAnJylcbiAgICA6IHN0cmluZztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlVHJpbTtcbiIsInZhciBiYXNlVHJpbSA9IHJlcXVpcmUoJy4vX2Jhc2VUcmltJyksXG4gICAgaXNPYmplY3QgPSByZXF1aXJlKCcuL2lzT2JqZWN0JyksXG4gICAgaXNTeW1ib2wgPSByZXF1aXJlKCcuL2lzU3ltYm9sJyk7XG5cbi8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqL1xudmFyIE5BTiA9IDAgLyAwO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgYmFkIHNpZ25lZCBoZXhhZGVjaW1hbCBzdHJpbmcgdmFsdWVzLiAqL1xudmFyIHJlSXNCYWRIZXggPSAvXlstK10weFswLTlhLWZdKyQvaTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IGJpbmFyeSBzdHJpbmcgdmFsdWVzLiAqL1xudmFyIHJlSXNCaW5hcnkgPSAvXjBiWzAxXSskL2k7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBvY3RhbCBzdHJpbmcgdmFsdWVzLiAqL1xudmFyIHJlSXNPY3RhbCA9IC9eMG9bMC03XSskL2k7XG5cbi8qKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyB3aXRob3V0IGEgZGVwZW5kZW5jeSBvbiBgcm9vdGAuICovXG52YXIgZnJlZVBhcnNlSW50ID0gcGFyc2VJbnQ7XG5cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhIG51bWJlci5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcHJvY2Vzcy5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIG51bWJlci5cbiAqIEBleGFtcGxlXG4gKlxuICogXy50b051bWJlcigzLjIpO1xuICogLy8gPT4gMy4yXG4gKlxuICogXy50b051bWJlcihOdW1iZXIuTUlOX1ZBTFVFKTtcbiAqIC8vID0+IDVlLTMyNFxuICpcbiAqIF8udG9OdW1iZXIoSW5maW5pdHkpO1xuICogLy8gPT4gSW5maW5pdHlcbiAqXG4gKiBfLnRvTnVtYmVyKCczLjInKTtcbiAqIC8vID0+IDMuMlxuICovXG5mdW5jdGlvbiB0b051bWJlcih2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlID09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIGlmIChpc1N5bWJvbCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gTkFOO1xuICB9XG4gIGlmIChpc09iamVjdCh2YWx1ZSkpIHtcbiAgICB2YXIgb3RoZXIgPSB0eXBlb2YgdmFsdWUudmFsdWVPZiA9PSAnZnVuY3Rpb24nID8gdmFsdWUudmFsdWVPZigpIDogdmFsdWU7XG4gICAgdmFsdWUgPSBpc09iamVjdChvdGhlcikgPyAob3RoZXIgKyAnJykgOiBvdGhlcjtcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSAwID8gdmFsdWUgOiArdmFsdWU7XG4gIH1cbiAgdmFsdWUgPSBiYXNlVHJpbSh2YWx1ZSk7XG4gIHZhciBpc0JpbmFyeSA9IHJlSXNCaW5hcnkudGVzdCh2YWx1ZSk7XG4gIHJldHVybiAoaXNCaW5hcnkgfHwgcmVJc09jdGFsLnRlc3QodmFsdWUpKVxuICAgID8gZnJlZVBhcnNlSW50KHZhbHVlLnNsaWNlKDIpLCBpc0JpbmFyeSA/IDIgOiA4KVxuICAgIDogKHJlSXNCYWRIZXgudGVzdCh2YWx1ZSkgPyBOQU4gOiArdmFsdWUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHRvTnVtYmVyO1xuIiwidmFyIHRvTnVtYmVyID0gcmVxdWlyZSgnLi90b051bWJlcicpO1xuXG4vKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB2YXJpb3VzIGBOdW1iZXJgIGNvbnN0YW50cy4gKi9cbnZhciBJTkZJTklUWSA9IDEgLyAwLFxuICAgIE1BWF9JTlRFR0VSID0gMS43OTc2OTMxMzQ4NjIzMTU3ZSszMDg7XG5cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhIGZpbml0ZSBudW1iZXIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjEyLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgY29udmVydGVkIG51bWJlci5cbiAqIEBleGFtcGxlXG4gKlxuICogXy50b0Zpbml0ZSgzLjIpO1xuICogLy8gPT4gMy4yXG4gKlxuICogXy50b0Zpbml0ZShOdW1iZXIuTUlOX1ZBTFVFKTtcbiAqIC8vID0+IDVlLTMyNFxuICpcbiAqIF8udG9GaW5pdGUoSW5maW5pdHkpO1xuICogLy8gPT4gMS43OTc2OTMxMzQ4NjIzMTU3ZSszMDhcbiAqXG4gKiBfLnRvRmluaXRlKCczLjInKTtcbiAqIC8vID0+IDMuMlxuICovXG5mdW5jdGlvbiB0b0Zpbml0ZSh2YWx1ZSkge1xuICBpZiAoIXZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSAwID8gdmFsdWUgOiAwO1xuICB9XG4gIHZhbHVlID0gdG9OdW1iZXIodmFsdWUpO1xuICBpZiAodmFsdWUgPT09IElORklOSVRZIHx8IHZhbHVlID09PSAtSU5GSU5JVFkpIHtcbiAgICB2YXIgc2lnbiA9ICh2YWx1ZSA8IDAgPyAtMSA6IDEpO1xuICAgIHJldHVybiBzaWduICogTUFYX0lOVEVHRVI7XG4gIH1cbiAgcmV0dXJuIHZhbHVlID09PSB2YWx1ZSA/IHZhbHVlIDogMDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB0b0Zpbml0ZTtcbiIsInZhciB0b0Zpbml0ZSA9IHJlcXVpcmUoJy4vdG9GaW5pdGUnKTtcblxuLyoqXG4gKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGFuIGludGVnZXIuXG4gKlxuICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGxvb3NlbHkgYmFzZWQgb25cbiAqIFtgVG9JbnRlZ2VyYF0oaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXRvaW50ZWdlcikuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgaW50ZWdlci5cbiAqIEBleGFtcGxlXG4gKlxuICogXy50b0ludGVnZXIoMy4yKTtcbiAqIC8vID0+IDNcbiAqXG4gKiBfLnRvSW50ZWdlcihOdW1iZXIuTUlOX1ZBTFVFKTtcbiAqIC8vID0+IDBcbiAqXG4gKiBfLnRvSW50ZWdlcihJbmZpbml0eSk7XG4gKiAvLyA9PiAxLjc5NzY5MzEzNDg2MjMxNTdlKzMwOFxuICpcbiAqIF8udG9JbnRlZ2VyKCczLjInKTtcbiAqIC8vID0+IDNcbiAqL1xuZnVuY3Rpb24gdG9JbnRlZ2VyKHZhbHVlKSB7XG4gIHZhciByZXN1bHQgPSB0b0Zpbml0ZSh2YWx1ZSksXG4gICAgICByZW1haW5kZXIgPSByZXN1bHQgJSAxO1xuXG4gIHJldHVybiByZXN1bHQgPT09IHJlc3VsdCA/IChyZW1haW5kZXIgPyByZXN1bHQgLSByZW1haW5kZXIgOiByZXN1bHQpIDogMDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB0b0ludGVnZXI7XG4iLCJ2YXIgYmFzZVRvU3RyaW5nID0gcmVxdWlyZSgnLi9fYmFzZVRvU3RyaW5nJyksXG4gICAgY2FzdFNsaWNlID0gcmVxdWlyZSgnLi9fY2FzdFNsaWNlJyksXG4gICAgaGFzVW5pY29kZSA9IHJlcXVpcmUoJy4vX2hhc1VuaWNvZGUnKSxcbiAgICBpc09iamVjdCA9IHJlcXVpcmUoJy4vaXNPYmplY3QnKSxcbiAgICBpc1JlZ0V4cCA9IHJlcXVpcmUoJy4vaXNSZWdFeHAnKSxcbiAgICBzdHJpbmdTaXplID0gcmVxdWlyZSgnLi9fc3RyaW5nU2l6ZScpLFxuICAgIHN0cmluZ1RvQXJyYXkgPSByZXF1aXJlKCcuL19zdHJpbmdUb0FycmF5JyksXG4gICAgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi90b0ludGVnZXInKSxcbiAgICB0b1N0cmluZyA9IHJlcXVpcmUoJy4vdG9TdHJpbmcnKTtcblxuLyoqIFVzZWQgYXMgZGVmYXVsdCBvcHRpb25zIGZvciBgXy50cnVuY2F0ZWAuICovXG52YXIgREVGQVVMVF9UUlVOQ19MRU5HVEggPSAzMCxcbiAgICBERUZBVUxUX1RSVU5DX09NSVNTSU9OID0gJy4uLic7XG5cbi8qKiBVc2VkIHRvIG1hdGNoIGBSZWdFeHBgIGZsYWdzIGZyb20gdGhlaXIgY29lcmNlZCBzdHJpbmcgdmFsdWVzLiAqL1xudmFyIHJlRmxhZ3MgPSAvXFx3KiQvO1xuXG4vKipcbiAqIFRydW5jYXRlcyBgc3RyaW5nYCBpZiBpdCdzIGxvbmdlciB0aGFuIHRoZSBnaXZlbiBtYXhpbXVtIHN0cmluZyBsZW5ndGguXG4gKiBUaGUgbGFzdCBjaGFyYWN0ZXJzIG9mIHRoZSB0cnVuY2F0ZWQgc3RyaW5nIGFyZSByZXBsYWNlZCB3aXRoIHRoZSBvbWlzc2lvblxuICogc3RyaW5nIHdoaWNoIGRlZmF1bHRzIHRvIFwiLi4uXCIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IFN0cmluZ1xuICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gdHJ1bmNhdGUuXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dIFRoZSBvcHRpb25zIG9iamVjdC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5sZW5ndGg9MzBdIFRoZSBtYXhpbXVtIHN0cmluZyBsZW5ndGguXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMub21pc3Npb249Jy4uLiddIFRoZSBzdHJpbmcgdG8gaW5kaWNhdGUgdGV4dCBpcyBvbWl0dGVkLlxuICogQHBhcmFtIHtSZWdFeHB8c3RyaW5nfSBbb3B0aW9ucy5zZXBhcmF0b3JdIFRoZSBzZXBhcmF0b3IgcGF0dGVybiB0byB0cnVuY2F0ZSB0by5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHRydW5jYXRlZCBzdHJpbmcuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udHJ1bmNhdGUoJ2hpLWRpZGRseS1obyB0aGVyZSwgbmVpZ2hib3Jpbm8nKTtcbiAqIC8vID0+ICdoaS1kaWRkbHktaG8gdGhlcmUsIG5laWdoYm8uLi4nXG4gKlxuICogXy50cnVuY2F0ZSgnaGktZGlkZGx5LWhvIHRoZXJlLCBuZWlnaGJvcmlubycsIHtcbiAqICAgJ2xlbmd0aCc6IDI0LFxuICogICAnc2VwYXJhdG9yJzogJyAnXG4gKiB9KTtcbiAqIC8vID0+ICdoaS1kaWRkbHktaG8gdGhlcmUsLi4uJ1xuICpcbiAqIF8udHJ1bmNhdGUoJ2hpLWRpZGRseS1obyB0aGVyZSwgbmVpZ2hib3Jpbm8nLCB7XG4gKiAgICdsZW5ndGgnOiAyNCxcbiAqICAgJ3NlcGFyYXRvcic6IC8sPyArL1xuICogfSk7XG4gKiAvLyA9PiAnaGktZGlkZGx5LWhvIHRoZXJlLi4uJ1xuICpcbiAqIF8udHJ1bmNhdGUoJ2hpLWRpZGRseS1obyB0aGVyZSwgbmVpZ2hib3Jpbm8nLCB7XG4gKiAgICdvbWlzc2lvbic6ICcgWy4uLl0nXG4gKiB9KTtcbiAqIC8vID0+ICdoaS1kaWRkbHktaG8gdGhlcmUsIG5laWcgWy4uLl0nXG4gKi9cbmZ1bmN0aW9uIHRydW5jYXRlKHN0cmluZywgb3B0aW9ucykge1xuICB2YXIgbGVuZ3RoID0gREVGQVVMVF9UUlVOQ19MRU5HVEgsXG4gICAgICBvbWlzc2lvbiA9IERFRkFVTFRfVFJVTkNfT01JU1NJT047XG5cbiAgaWYgKGlzT2JqZWN0KG9wdGlvbnMpKSB7XG4gICAgdmFyIHNlcGFyYXRvciA9ICdzZXBhcmF0b3InIGluIG9wdGlvbnMgPyBvcHRpb25zLnNlcGFyYXRvciA6IHNlcGFyYXRvcjtcbiAgICBsZW5ndGggPSAnbGVuZ3RoJyBpbiBvcHRpb25zID8gdG9JbnRlZ2VyKG9wdGlvbnMubGVuZ3RoKSA6IGxlbmd0aDtcbiAgICBvbWlzc2lvbiA9ICdvbWlzc2lvbicgaW4gb3B0aW9ucyA/IGJhc2VUb1N0cmluZyhvcHRpb25zLm9taXNzaW9uKSA6IG9taXNzaW9uO1xuICB9XG4gIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG5cbiAgdmFyIHN0ckxlbmd0aCA9IHN0cmluZy5sZW5ndGg7XG4gIGlmIChoYXNVbmljb2RlKHN0cmluZykpIHtcbiAgICB2YXIgc3RyU3ltYm9scyA9IHN0cmluZ1RvQXJyYXkoc3RyaW5nKTtcbiAgICBzdHJMZW5ndGggPSBzdHJTeW1ib2xzLmxlbmd0aDtcbiAgfVxuICBpZiAobGVuZ3RoID49IHN0ckxlbmd0aCkge1xuICAgIHJldHVybiBzdHJpbmc7XG4gIH1cbiAgdmFyIGVuZCA9IGxlbmd0aCAtIHN0cmluZ1NpemUob21pc3Npb24pO1xuICBpZiAoZW5kIDwgMSkge1xuICAgIHJldHVybiBvbWlzc2lvbjtcbiAgfVxuICB2YXIgcmVzdWx0ID0gc3RyU3ltYm9sc1xuICAgID8gY2FzdFNsaWNlKHN0clN5bWJvbHMsIDAsIGVuZCkuam9pbignJylcbiAgICA6IHN0cmluZy5zbGljZSgwLCBlbmQpO1xuXG4gIGlmIChzZXBhcmF0b3IgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiByZXN1bHQgKyBvbWlzc2lvbjtcbiAgfVxuICBpZiAoc3RyU3ltYm9scykge1xuICAgIGVuZCArPSAocmVzdWx0Lmxlbmd0aCAtIGVuZCk7XG4gIH1cbiAgaWYgKGlzUmVnRXhwKHNlcGFyYXRvcikpIHtcbiAgICBpZiAoc3RyaW5nLnNsaWNlKGVuZCkuc2VhcmNoKHNlcGFyYXRvcikpIHtcbiAgICAgIHZhciBtYXRjaCxcbiAgICAgICAgICBzdWJzdHJpbmcgPSByZXN1bHQ7XG5cbiAgICAgIGlmICghc2VwYXJhdG9yLmdsb2JhbCkge1xuICAgICAgICBzZXBhcmF0b3IgPSBSZWdFeHAoc2VwYXJhdG9yLnNvdXJjZSwgdG9TdHJpbmcocmVGbGFncy5leGVjKHNlcGFyYXRvcikpICsgJ2cnKTtcbiAgICAgIH1cbiAgICAgIHNlcGFyYXRvci5sYXN0SW5kZXggPSAwO1xuICAgICAgd2hpbGUgKChtYXRjaCA9IHNlcGFyYXRvci5leGVjKHN1YnN0cmluZykpKSB7XG4gICAgICAgIHZhciBuZXdFbmQgPSBtYXRjaC5pbmRleDtcbiAgICAgIH1cbiAgICAgIHJlc3VsdCA9IHJlc3VsdC5zbGljZSgwLCBuZXdFbmQgPT09IHVuZGVmaW5lZCA/IGVuZCA6IG5ld0VuZCk7XG4gICAgfVxuICB9IGVsc2UgaWYgKHN0cmluZy5pbmRleE9mKGJhc2VUb1N0cmluZyhzZXBhcmF0b3IpLCBlbmQpICE9IGVuZCkge1xuICAgIHZhciBpbmRleCA9IHJlc3VsdC5sYXN0SW5kZXhPZihzZXBhcmF0b3IpO1xuICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICByZXN1bHQgPSByZXN1bHQuc2xpY2UoMCwgaW5kZXgpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0ICsgb21pc3Npb247XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdHJ1bmNhdGU7XG4iLCJpbXBvcnQgdHJ1bmNhdGUgZnJvbSAnbG9kYXNoL3RydW5jYXRlJ1xuaW1wb3J0IFJlYWN0LCB7IEZDIH0gZnJvbSAncmVhY3QnXG5cbmltcG9ydCB7IFNob3dQcm9wZXJ0eVByb3BzIH0gZnJvbSAnLi4vYmFzZS1wcm9wZXJ0eS1wcm9wcydcbmltcG9ydCBhbGxvd092ZXJyaWRlIGZyb20gJy4uLy4uLy4uL2hvYy9hbGxvdy1vdmVycmlkZSdcblxuY29uc3Qgc3RyaXBIdG1sID0gKGh0bWw6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIGNvbnN0IGVsID0gd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ0RJVicpXG4gIGVsLmlubmVySFRNTCA9IGh0bWxcblxuICByZXR1cm4gZWwudGV4dENvbnRlbnQgfHwgZWwuaW5uZXJUZXh0IHx8ICcnXG59XG5cbmNvbnN0IExpc3Q6IEZDPFNob3dQcm9wZXJ0eVByb3BzPiA9IChwcm9wcykgPT4ge1xuICBjb25zdCB7IHByb3BlcnR5LCByZWNvcmQgfSA9IHByb3BzXG4gIGNvbnN0IG1heExlbmd0aCA9IHByb3BlcnR5LmN1c3RvbT8ubWF4TGVuZ3RoIHx8IDE1XG4gIGNvbnN0IHZhbHVlOiBzdHJpbmcgPSByZWNvcmQucGFyYW1zW3Byb3BlcnR5LnBhdGhdIHx8ICcnXG4gIGNvbnN0IHRleHRWYWx1ZSA9IHN0cmlwSHRtbCh2YWx1ZSlcblxuICByZXR1cm4gPD57dHJ1bmNhdGUodGV4dFZhbHVlLCB7IGxlbmd0aDogbWF4TGVuZ3RoLCBzZXBhcmF0b3I6ICcgJyB9KX08Lz5cbn1cblxuZXhwb3J0IGRlZmF1bHQgYWxsb3dPdmVycmlkZShMaXN0LCAnRGVmYXVsdFJlZmVyZW5jZUxpc3RQcm9wZXJ0eScpXG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBWYWx1ZUdyb3VwIH0gZnJvbSAnQGFkbWluanMvZGVzaWduLXN5c3RlbSdcblxuaW1wb3J0IGFsbG93T3ZlcnJpZGUgZnJvbSAnLi4vLi4vLi4vaG9jL2FsbG93LW92ZXJyaWRlJ1xuaW1wb3J0IHsgU2hvd1Byb3BlcnR5UHJvcHMgfSBmcm9tICcuLi9iYXNlLXByb3BlcnR5LXByb3BzJ1xuXG5jb25zdCBTaG93OiBSZWFjdC5GQzxTaG93UHJvcGVydHlQcm9wcz4gPSAocHJvcHMpID0+IHtcbiAgY29uc3QgeyBwcm9wZXJ0eSwgcmVjb3JkIH0gPSBwcm9wc1xuXG4gIGNvbnN0IHZhbHVlID0gcmVjb3JkLnBhcmFtc1twcm9wZXJ0eS5wYXRoXSB8fCAnJ1xuXG4gIHJldHVybiAoXG4gICAgPFZhbHVlR3JvdXAgbGFiZWw9e3Byb3BlcnR5LmxhYmVsfT5cbiAgICAgIHt2YWx1ZS5zcGxpdCgvKD86XFxyXFxufFxccnxcXG4pL2cpLm1hcCgobGluZSwgaSkgPT4gKFxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3Qvbm8tYXJyYXktaW5kZXgta2V5XG4gICAgICAgIDxSZWFjdC5GcmFnbWVudCBrZXk9e2l9PlxuICAgICAgICAgIHtsaW5lfVxuICAgICAgICAgIDxiciAvPlxuICAgICAgICA8L1JlYWN0LkZyYWdtZW50PlxuICAgICAgKSl9XG4gICAgPC9WYWx1ZUdyb3VwPlxuICApXG59XG5cbmV4cG9ydCBkZWZhdWx0IGFsbG93T3ZlcnJpZGUoU2hvdywgJ0RlZmF1bHRUZXh0YXJlYVNob3dQcm9wZXJ0eScpXG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvZXhwbGljaXQtZnVuY3Rpb24tcmV0dXJuLXR5cGUgKi9cbmltcG9ydCBSZWFjdCwgeyBtZW1vLCB1c2VTdGF0ZSwgRkMsIHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgSW5wdXQsIEZvcm1Hcm91cCwgRm9ybU1lc3NhZ2UgfSBmcm9tICdAYWRtaW5qcy9kZXNpZ24tc3lzdGVtJ1xuXG5pbXBvcnQgeyBFZGl0UHJvcGVydHlQcm9wcyB9IGZyb20gJy4uL2Jhc2UtcHJvcGVydHktcHJvcHMnXG5pbXBvcnQgeyByZWNvcmRQcm9wZXJ0eUlzRXF1YWwgfSBmcm9tICcuLi9yZWNvcmQtcHJvcGVydHktaXMtZXF1YWwnXG5pbXBvcnQgeyBQcm9wZXJ0eUxhYmVsIH0gZnJvbSAnLi4vdXRpbHMvcHJvcGVydHktbGFiZWwnXG5pbXBvcnQgYWxsb3dPdmVycmlkZSBmcm9tICcuLi8uLi8uLi9ob2MvYWxsb3ctb3ZlcnJpZGUnXG5cbmNvbnN0IEVkaXQ6IEZDPEVkaXRQcm9wZXJ0eVByb3BzPiA9IChwcm9wcykgPT4ge1xuICBjb25zdCB7IG9uQ2hhbmdlLCBwcm9wZXJ0eSwgcmVjb3JkIH0gPSBwcm9wc1xuICBjb25zdCBwcm9wVmFsdWUgPSByZWNvcmQucGFyYW1zPy5bcHJvcGVydHkucGF0aF0gPz8gJydcbiAgY29uc3QgW3ZhbHVlLCBzZXRWYWx1ZV0gPSB1c2VTdGF0ZShwcm9wVmFsdWUpXG4gIGNvbnN0IGVycm9yID0gcmVjb3JkLmVycm9ycz8uW3Byb3BlcnR5LnBhdGhdXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAodmFsdWUgIT09IHByb3BWYWx1ZSkge1xuICAgICAgc2V0VmFsdWUocHJvcFZhbHVlKVxuICAgIH1cbiAgfSwgW3Byb3BWYWx1ZV0pXG5cbiAgcmV0dXJuIChcbiAgICA8Rm9ybUdyb3VwIGVycm9yPXtCb29sZWFuKGVycm9yKX0+XG4gICAgICA8UHJvcGVydHlMYWJlbCBwcm9wZXJ0eT17cHJvcGVydHl9IC8+XG4gICAgICA8SW5wdXRcbiAgICAgICAgYXM9XCJ0ZXh0YXJlYVwiXG4gICAgICAgIHJvd3M9eyh2YWx1ZS5tYXRjaCgvXFxuL2cpIHx8IFtdKS5sZW5ndGggKyAxfVxuICAgICAgICBpZD17cHJvcGVydHkucGF0aH1cbiAgICAgICAgbmFtZT17cHJvcGVydHkucGF0aH1cbiAgICAgICAgb25DaGFuZ2U9eyhlKSA9PiBzZXRWYWx1ZShlLnRhcmdldC52YWx1ZSl9XG4gICAgICAgIG9uQmx1cj17KCkgPT4gb25DaGFuZ2UocHJvcGVydHkucGF0aCwgdmFsdWUpfVxuICAgICAgICB2YWx1ZT17dmFsdWV9XG4gICAgICAgIGRpc2FibGVkPXtwcm9wZXJ0eS5pc0Rpc2FibGVkfVxuICAgICAgICB7Li4ucHJvcGVydHkucHJvcHN9XG4gICAgICAvPlxuICAgICAgPEZvcm1NZXNzYWdlPntlcnJvciAmJiBlcnJvci5tZXNzYWdlfTwvRm9ybU1lc3NhZ2U+XG4gICAgPC9Gb3JtR3JvdXA+XG4gIClcbn1cblxuZXhwb3J0IGRlZmF1bHQgYWxsb3dPdmVycmlkZShtZW1vKEVkaXQsIHJlY29yZFByb3BlcnR5SXNFcXVhbCksICdEZWZhdWx0VGV4dGFyZWFFZGl0UHJvcGVydHknKVxuIiwiaW1wb3J0IHsgQm94IH0gZnJvbSAnQGFkbWluanMvZGVzaWduLXN5c3RlbSdcbmltcG9ydCB7IFJlYWN0Q29tcG9uZW50TGlrZSB9IGZyb20gJ3Byb3AtdHlwZXMnXG5pbXBvcnQgUmVhY3QsIHsgdXNlTWVtbyB9IGZyb20gJ3JlYWN0J1xuXG5pbXBvcnQgRXJyb3JCb3VuZGFyeSBmcm9tICcuLi9hcHAvZXJyb3ItYm91bmRhcnknXG5cbmltcG9ydCAqIGFzIEFycmF5VHlwZSBmcm9tICcuL2FycmF5J1xuaW1wb3J0ICogYXMgS2V5VmFsdWVUeXBlIGZyb20gJy4va2V5LXZhbHVlJ1xuaW1wb3J0ICogYXMgTWl4ZWRUeXBlIGZyb20gJy4vbWl4ZWQnXG5cbmltcG9ydCB7IFByb3BlcnR5VHlwZSB9IGZyb20gJy4uLy4uLy4uL2JhY2tlbmQvYWRhcHRlcnMvcHJvcGVydHkvYmFzZS1wcm9wZXJ0eSdcbmltcG9ydCB7IFByb3BlcnR5SlNPTiB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMnXG5pbXBvcnQgeyBnZXRBY3Rpb25FbGVtZW50Q3NzIH0gZnJvbSAnLi4vLi4vdXRpbHMnXG5pbXBvcnQgeyBCYXNlUHJvcGVydHlDb21wb25lbnRQcm9wcyB9IGZyb20gJy4vYmFzZS1wcm9wZXJ0eS1wcm9wcydcbmltcG9ydCAqIGFzIGJvb2xlYW4gZnJvbSAnLi9ib29sZWFuJ1xuaW1wb3J0ICogYXMgY3VycmVuY3kgZnJvbSAnLi9jdXJyZW5jeSdcbmltcG9ydCAqIGFzIGRhdGV0aW1lIGZyb20gJy4vZGF0ZXRpbWUnXG5pbXBvcnQgKiBhcyBkZWZhdWx0VHlwZSBmcm9tICcuL2RlZmF1bHQtdHlwZSdcbmltcG9ydCAqIGFzIHBhc3N3b3JkIGZyb20gJy4vcGFzc3dvcmQnXG5pbXBvcnQgKiBhcyBwaG9uZSBmcm9tICcuL3Bob25lJ1xuaW1wb3J0ICogYXMgcmVmZXJlbmNlIGZyb20gJy4vcmVmZXJlbmNlJ1xuaW1wb3J0ICogYXMgcmljaHRleHQgZnJvbSAnLi9yaWNodGV4dCdcbmltcG9ydCAqIGFzIHRleHRhcmVhIGZyb20gJy4vdGV4dGFyZWEnXG5cbmxldCBnbG9iYWxBbnk6IGFueSA9IHt9XG5cbnRyeSB7XG4gIGdsb2JhbEFueSA9IHdpbmRvd1xufSBjYXRjaCAoZXJyb3IpIHtcbiAgaWYgKGVycm9yLm1lc3NhZ2UgIT09ICd3aW5kb3cgaXMgbm90IGRlZmluZWQnKSB7XG4gICAgdGhyb3cgZXJyb3JcbiAgfVxufVxuXG5jb25zdCB0eXBlczogUmVjb3JkPFByb3BlcnR5VHlwZSwgYW55PiA9IHtcbiAgdGV4dGFyZWEsXG4gIGJvb2xlYW4sXG4gIGRhdGV0aW1lLFxuICByZWZlcmVuY2UsXG4gIHBhc3N3b3JkLFxuICBkYXRlOiBkYXRldGltZSxcbiAgcmljaHRleHQsXG4gIHN0cmluZzogZGVmYXVsdFR5cGUsXG4gIG51bWJlcjogZGVmYXVsdFR5cGUsXG4gIGZsb2F0OiBkZWZhdWx0VHlwZSxcbiAgdXVpZDogZGVmYXVsdFR5cGUsXG4gIG1peGVkOiBudWxsLFxuICAna2V5LXZhbHVlJzogbnVsbCxcbiAgY3VycmVuY3ksXG4gIHBob25lLFxufVxuXG4vKipcbiAqIEBsb2FkIC4vYmFzZS1wcm9wZXJ0eS1jb21wb25lbnQuZG9jLm1kXG4gKiBAY29tcG9uZW50XG4gKiBAbmFtZSBCYXNlUHJvcGVydHlDb21wb25lbnRcbiAqIEBzdWJjYXRlZ29yeSBBcHBsaWNhdGlvblxuICogQGNsYXNzXG4gKiBAaGlkZWNvbnN0cnVjdG9yXG4gKi9cbmNvbnN0IEJhc2VQcm9wZXJ0eUNvbXBvbmVudDogUmVhY3QuRkM8QmFzZVByb3BlcnR5Q29tcG9uZW50UHJvcHM+ID0gKHByb3BzKSA9PiB7XG4gIGNvbnN0IHsgcHJvcGVydHk6IGJhc2VQcm9wZXJ0eSwgcmVzb3VyY2UsIHJlY29yZCwgZmlsdGVyLCB3aGVyZSwgb25DaGFuZ2UgfSA9IHByb3BzXG5cbiAgY29uc3QgcHJvcGVydHk6IFByb3BlcnR5SlNPTiA9IHVzZU1lbW8oKCkgPT4gKHtcbiAgICAuLi5iYXNlUHJvcGVydHksXG4gICAgLy8gd2UgZmlsbCB0aGUgcGF0aCBpZiBpdCBpcyBub3QgdGhlcmUuIFRoYXQgaXMgd2h5IGFsbCB0aGUgYWN0dWFsIENvbXBvbmVudCBSZW5kZXJlcnMgYXJlXG4gICAgLy8gY2FsbGVkIHdpdGggdGhlIHBhdGggc2V0IHRvIHRoaXMgcm9vdCBwYXRoLiBOZXh0IG1peGVkIGFuZCBhcnJheSBjb21wb25lbnRzIGFkZHMgdG8gdGhpc1xuICAgIC8vIHBhdGggZWl0aGVyIGluZGV4IChmb3IgYXJyYXkpIG9yIHN1YlByb3BlcnR5IG5hbWUuXG4gICAgcGF0aDogKGJhc2VQcm9wZXJ0eSBhcyBQcm9wZXJ0eUpTT04pLnBhdGggfHwgYmFzZVByb3BlcnR5LnByb3BlcnR5UGF0aCxcbiAgfSksIFtiYXNlUHJvcGVydHldKVxuXG4gIGNvbnN0IHRlc3RJZCA9IGBwcm9wZXJ0eS0ke3doZXJlfS0ke3Byb3BlcnR5LnBhdGh9YFxuICBjb25zdCBjb250ZW50VGFnID0gZ2V0QWN0aW9uRWxlbWVudENzcyhyZXNvdXJjZS5pZCwgd2hlcmUsIHByb3BlcnR5LnBhdGgpXG5cbiAgbGV0IENvbXBvbmVudDogUmVhY3RDb21wb25lbnRMaWtlID0gKHR5cGVzW3Byb3BlcnR5LnR5cGVdICYmIHR5cGVzW3Byb3BlcnR5LnR5cGVdW3doZXJlXSlcbiAgICB8fCBkZWZhdWx0VHlwZVt3aGVyZV1cblxuICBpZiAocHJvcGVydHkuY29tcG9uZW50cyAmJiBwcm9wZXJ0eS5jb21wb25lbnRzW3doZXJlXSkge1xuICAgIGNvbnN0IGNvbXBvbmVudCA9IHByb3BlcnR5LmNvbXBvbmVudHNbd2hlcmVdXG4gICAgaWYgKCFjb21wb25lbnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgdGhlcmUgaXMgbm8gXCIke3Byb3BlcnR5LnBhdGh9LmNvbXBvbmVudHMuJHt3aGVyZX1cImApXG4gICAgfVxuICAgIENvbXBvbmVudCA9IGdsb2JhbEFueS5BZG1pbkpTLlVzZXJDb21wb25lbnRzW2NvbXBvbmVudF0gPz8gKCgpID0+IHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ29tcG9uZW50IFwiJHtjb21wb25lbnR9XCIgaGFzIG5vdCBiZWVuIGJ1bmRsZWQsIGVuc3VyZSBpdCB3YXMgYWRkZWQgdG8geW91ciBDb21wb25lbnRMb2FkZXIgaW5zdGFuY2UgKHRoZSBvbmUgaW5jbHVkZWQgaW4gQWRtaW5KUyBvcHRpb25zKS5gKVxuICAgIH0pXG4gICAgcmV0dXJuIChcbiAgICAgIDxFcnJvckJvdW5kYXJ5PlxuICAgICAgICA8Qm94IGRhdGEtY3NzPXtjb250ZW50VGFnfSBkYXRhLXRlc3RpZD17dGVzdElkfT5cbiAgICAgICAgICA8Q29tcG9uZW50XG4gICAgICAgICAgICBwcm9wZXJ0eT17cHJvcGVydHl9XG4gICAgICAgICAgICByZXNvdXJjZT17cmVzb3VyY2V9XG4gICAgICAgICAgICByZWNvcmQ9e3JlY29yZH1cbiAgICAgICAgICAgIGZpbHRlcj17ZmlsdGVyfVxuICAgICAgICAgICAgb25DaGFuZ2U9e29uQ2hhbmdlfVxuICAgICAgICAgICAgd2hlcmU9e3doZXJlfVxuICAgICAgICAgIC8+XG4gICAgICAgIDwvQm94PlxuICAgICAgPC9FcnJvckJvdW5kYXJ5PlxuICAgIClcbiAgfVxuXG4gIGNvbnN0IEFycmF5ID0gQXJyYXlUeXBlW3doZXJlXVxuICBjb25zdCBNaXhlZCA9IE1peGVkVHlwZVt3aGVyZV1cbiAgY29uc3QgS2V5VmFsdWUgPSBLZXlWYWx1ZVR5cGVbd2hlcmVdXG5cbiAgaWYgKGJhc2VQcm9wZXJ0eS5pc0FycmF5KSB7XG4gICAgaWYgKCFBcnJheSkgeyByZXR1cm4gKDxkaXYgLz4pIH1cbiAgICByZXR1cm4gKFxuICAgICAgPEFycmF5XG4gICAgICAgIHsuLi5wcm9wc31cbiAgICAgICAgcHJvcGVydHk9e3Byb3BlcnR5fVxuICAgICAgICBJdGVtQ29tcG9uZW50PXtCYXNlUHJvcGVydHlDb21wb25lbnR9XG4gICAgICAgIHRlc3RJZD17dGVzdElkfVxuICAgICAgLz5cbiAgICApXG4gIH1cblxuICBpZiAoYmFzZVByb3BlcnR5LnR5cGUgPT09ICdrZXktdmFsdWUnKSB7XG4gICAgaWYgKCFLZXlWYWx1ZSkgeyByZXR1cm4gKDxkaXYgLz4pIH1cbiAgICByZXR1cm4gKFxuICAgICAgPEtleVZhbHVlXG4gICAgICAgIHsuLi5wcm9wc31cbiAgICAgICAgcHJvcGVydHk9e3Byb3BlcnR5fVxuICAgICAgICB0ZXN0SWQ9e3Rlc3RJZH1cbiAgICAgIC8+XG4gICAgKVxuICB9XG5cbiAgaWYgKGJhc2VQcm9wZXJ0eS50eXBlID09PSAnbWl4ZWQnKSB7XG4gICAgaWYgKCFNaXhlZCkgeyByZXR1cm4gKDxkaXYgLz4pIH1cbiAgICByZXR1cm4gKFxuICAgICAgPE1peGVkXG4gICAgICAgIHsuLi5wcm9wc31cbiAgICAgICAgcHJvcGVydHk9e3Byb3BlcnR5fVxuICAgICAgICBJdGVtQ29tcG9uZW50PXtCYXNlUHJvcGVydHlDb21wb25lbnR9XG4gICAgICAgIHRlc3RJZD17dGVzdElkfVxuICAgICAgLz5cbiAgICApXG4gIH1cblxuICByZXR1cm4gKFxuICAgIDxFcnJvckJvdW5kYXJ5PlxuICAgICAgPEJveCBkYXRhLWNzcz17Y29udGVudFRhZ30gZGF0YS10ZXN0aWQ9e3Rlc3RJZH0+XG4gICAgICAgIDxDb21wb25lbnRcbiAgICAgICAgICBwcm9wZXJ0eT17cHJvcGVydHl9XG4gICAgICAgICAgcmVzb3VyY2U9e3Jlc291cmNlfVxuICAgICAgICAgIHJlY29yZD17cmVjb3JkfVxuICAgICAgICAgIGZpbHRlcj17ZmlsdGVyfVxuICAgICAgICAgIG9uQ2hhbmdlPXtvbkNoYW5nZX1cbiAgICAgICAgICB3aGVyZT17d2hlcmV9XG4gICAgICAgIC8+XG4gICAgICA8L0JveD5cbiAgICA8L0Vycm9yQm91bmRhcnk+XG4gIClcbn1cbmV4cG9ydCB7XG4gIEJhc2VQcm9wZXJ0eUNvbXBvbmVudCBhcyBkZWZhdWx0LFxuICBCYXNlUHJvcGVydHlDb21wb25lbnQsXG59XG4iLCJpbXBvcnQgUmVhY3QsIHsgRkMsIHVzZU1lbW8gfSBmcm9tICdyZWFjdCdcbmltcG9ydCB7IEJhc2VQcm9wZXJ0eVByb3BzIH0gZnJvbSAnLi9iYXNlLXByb3BlcnR5LXByb3BzJ1xuaW1wb3J0IHsgQmFzZVByb3BlcnR5Q29tcG9uZW50IH0gZnJvbSAnLi9iYXNlLXByb3BlcnR5LWNvbXBvbmVudCdcbi8qKlxuICogVGhpcyBjb21wb25lbnQgaXMgdGhlIHNhbWUgYXMgYEJhc2VQcm9wZXJ0eUNvbXBvbmVudGAgYnV0IGl0IHdpbGwgbm90IHJlbmRlclxuICogY3VzdG9tIGNvbXBvbmVudHMuIFVzZSB0aGlzIGluIHlvdXIgY3VzdG9tIGNvbXBvbmVudHMgdG8gcmVuZGVyIHRoZSBkZWZhdWx0XG4gKiBwcm9wZXJ0eSBjb21wb25lbnQuXG4gKlxuICogVGhpcyBpcyB1c2VmdWwgaWYgeW91IHdhbnQgeW91ciBjdXN0b20gY29tcG9uZW50IHRvIGFwcGVhciBjdXN0b20gb25seSBmb3JcbiAqIHNwZWNpZmljIGB3aGVyZWAgdmFsdWUgYW5kIGRlZmF1bHQgZm9yIGFsbCBvdGhlcnMuXG4gKi9cbmNvbnN0IENsZWFuUHJvcGVydHlDb21wb25lbnQ6IEZDPEJhc2VQcm9wZXJ0eVByb3BzPiA9IChwcm9wcykgPT4ge1xuICBjb25zdCB7IHByb3BlcnR5IH0gPSBwcm9wc1xuICBjb25zdCBjbGVhblByb3BlcnR5ID0gdXNlTWVtbygoKSA9PiAoeyAuLi5wcm9wZXJ0eSwgY29tcG9uZW50czoge30gfSksIFtwcm9wZXJ0eV0pXG5cbiAgcmV0dXJuIDxCYXNlUHJvcGVydHlDb21wb25lbnQgey4uLnByb3BzfSBwcm9wZXJ0eT17Y2xlYW5Qcm9wZXJ0eX0gLz5cbn1cblxuZXhwb3J0IGRlZmF1bHQgQ2xlYW5Qcm9wZXJ0eUNvbXBvbmVudFxuIiwiaW1wb3J0IEJhc2VQcm9wZXJ0eUNvbXBvbmVudCBmcm9tICcuL2Jhc2UtcHJvcGVydHktY29tcG9uZW50J1xuaW1wb3J0IENsZWFuUHJvcGVydHlDb21wb25lbnQgZnJvbSAnLi9jbGVhbi1wcm9wZXJ0eS1jb21wb25lbnQnXG5cbmltcG9ydCAqIGFzIGRlZmF1bHRUeXBlIGZyb20gJy4vZGVmYXVsdC10eXBlJ1xuaW1wb3J0ICogYXMgYm9vbGVhbiBmcm9tICcuL2Jvb2xlYW4nXG5pbXBvcnQgKiBhcyBkYXRldGltZSBmcm9tICcuL2RhdGV0aW1lJ1xuaW1wb3J0ICogYXMgcmljaHRleHQgZnJvbSAnLi9yaWNodGV4dCdcbmltcG9ydCAqIGFzIHJlZmVyZW5jZSBmcm9tICcuL3JlZmVyZW5jZSdcbmltcG9ydCAqIGFzIHRleHRhcmVhIGZyb20gJy4vdGV4dGFyZWEnXG5pbXBvcnQgKiBhcyBwYXNzd29yZCBmcm9tICcuL3Bhc3N3b3JkJ1xuaW1wb3J0ICogYXMgY3VycmVuY3kgZnJvbSAnLi9jdXJyZW5jeSdcbmltcG9ydCAqIGFzIHBob25lIGZyb20gJy4vcGhvbmUnXG5pbXBvcnQgeyBCYXNlUHJvcGVydHlDb21wb25lbnRQcm9wcyB9IGZyb20gJy4vYmFzZS1wcm9wZXJ0eS1wcm9wcydcblxudHlwZSBCYXNlUHJvcGVydHlDb21wb25lbnRUeXBlID0gUmVhY3QuRkM8QmFzZVByb3BlcnR5Q29tcG9uZW50UHJvcHM+ICYge1xuICBEZWZhdWx0VHlwZTogYW55XG4gIEJvb2xlYW46IGFueVxuICBEYXRlVGltZTogYW55XG4gIFJpY2hUZXh0OiBhbnlcbiAgUmVmZXJlbmNlOiBhbnlcbiAgVGV4dEFyZWE6IGFueVxuICBQYXNzd29yZDogYW55XG59XG5cbmZ1bmN0aW9uIGNhbWVsaXplUHJvcGVydHlUeXBlPFQ+KHR5cGU6IHsgW2tleTogc3RyaW5nXTogVCB9KTogeyBba2V5OiBzdHJpbmddOiBUIH0ge1xuICByZXR1cm4ge1xuICAgIEVkaXQ6IHR5cGUuZWRpdCxcbiAgICBTaG93OiB0eXBlLnNob3csXG4gICAgTGlzdDogdHlwZS5saXN0LFxuICAgIEZpbHRlcjogdHlwZS5maWx0ZXIsXG4gIH1cbn1cblxuY29uc3QgQmFzZVByb3BlcnR5Q29tcG9uZW50RXh0ZW5kZWQ6IEJhc2VQcm9wZXJ0eUNvbXBvbmVudFR5cGUgPSBPYmplY3QuYXNzaWduKFxuICBCYXNlUHJvcGVydHlDb21wb25lbnQsXG4gIHtcbiAgICBEZWZhdWx0VHlwZTogY2FtZWxpemVQcm9wZXJ0eVR5cGUoZGVmYXVsdFR5cGUpLFxuICAgIEJvb2xlYW46IGNhbWVsaXplUHJvcGVydHlUeXBlKGJvb2xlYW4pLFxuICAgIERhdGVUaW1lOiBjYW1lbGl6ZVByb3BlcnR5VHlwZShkYXRldGltZSksXG4gICAgUmljaFRleHQ6IGNhbWVsaXplUHJvcGVydHlUeXBlKHJpY2h0ZXh0KSxcbiAgICBSZWZlcmVuY2U6IGNhbWVsaXplUHJvcGVydHlUeXBlKHJlZmVyZW5jZSksXG4gICAgVGV4dEFyZWE6IGNhbWVsaXplUHJvcGVydHlUeXBlKHRleHRhcmVhKSxcbiAgICBQYXNzd29yZDogY2FtZWxpemVQcm9wZXJ0eVR5cGUocGFzc3dvcmQpLFxuICAgIEN1cnJlbmN5OiBjYW1lbGl6ZVByb3BlcnR5VHlwZShjdXJyZW5jeSksXG4gICAgUGhvbmU6IGNhbWVsaXplUHJvcGVydHlUeXBlKHBob25lKSxcbiAgfSxcbilcblxuZXhwb3J0IHtcbiAgQmFzZVByb3BlcnR5Q29tcG9uZW50RXh0ZW5kZWQgYXMgZGVmYXVsdCxcbiAgQmFzZVByb3BlcnR5Q29tcG9uZW50RXh0ZW5kZWQgYXMgQmFzZVByb3BlcnR5Q29tcG9uZW50LFxuICBDbGVhblByb3BlcnR5Q29tcG9uZW50LFxufVxuXG5leHBvcnQgKiBmcm9tICcuL2Jhc2UtcHJvcGVydHktcHJvcHMnXG5leHBvcnQgKiBmcm9tICcuL3V0aWxzJ1xuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0ICogYXMgRGVzaWduU3lzdGVtIGZyb20gJ0BhZG1pbmpzL2Rlc2lnbi1zeXN0ZW0nXG5pbXBvcnQgeyBBY3Rpb25Qcm9wcyB9IGZyb20gJy4uL2FjdGlvbi5wcm9wcydcbmltcG9ydCBQcm9wZXJ0eVR5cGUgZnJvbSAnLi4vLi4vcHJvcGVydHktdHlwZSdcbmltcG9ydCB7IFByb3BlcnR5UGxhY2UgfSBmcm9tICcuLi8uLi8uLi9pbnRlcmZhY2VzL3Byb3BlcnR5LWpzb24vcHJvcGVydHktanNvbi5pbnRlcmZhY2UnXG5pbXBvcnQgeyBQYXJzZWRMYXlvdXRFbGVtZW50IH0gZnJvbSAnLi4vLi4vLi4vLi4vYmFja2VuZC91dGlscy9sYXlvdXQtZWxlbWVudC1wYXJzZXInXG5pbXBvcnQgeyBCYXNlUHJvcGVydHlQcm9wcyB9IGZyb20gJy4uLy4uL3Byb3BlcnR5LXR5cGUvYmFzZS1wcm9wZXJ0eS1wcm9wcydcblxudHlwZSBQcm9wcyA9IEFjdGlvblByb3BzICYge1xuICBsYXlvdXRFbGVtZW50OiBQYXJzZWRMYXlvdXRFbGVtZW50O1xuICB3aGVyZTogUHJvcGVydHlQbGFjZTtcbiAgb25DaGFuZ2U/OiBCYXNlUHJvcGVydHlQcm9wc1snb25DaGFuZ2UnXTtcbn1cblxuZXhwb3J0IGNvbnN0IExheW91dEVsZW1lbnRSZW5kZXJlcjogUmVhY3QuRkM8UHJvcHM+ID0gKHByb3BzKSA9PiB7XG4gIGNvbnN0IHsgbGF5b3V0RWxlbWVudCwgcmVzb3VyY2UsIHdoZXJlLCByZWNvcmQsIG9uQ2hhbmdlIH0gPSBwcm9wc1xuXG4gIGNvbnN0IHtcbiAgICBwcm9wczogbGF5b3V0UHJvcHMsXG4gICAgcHJvcGVydGllczogcHJvcGVydHlOYW1lcyxcbiAgICBsYXlvdXRFbGVtZW50czogaW5uZXJMYXlvdXRFbGVtZW50cyxcbiAgICBjb21wb25lbnQsXG4gIH0gPSBsYXlvdXRFbGVtZW50XG5cbiAgY29uc3QgeyBjaGlsZHJlbiwgLi4ub3RoZXIgfSA9IGxheW91dFByb3BzXG5cbiAgY29uc3QgcHJvcGVydGllcyA9IHByb3BlcnR5TmFtZXMubWFwKChuYW1lKSA9PiByZXNvdXJjZS5wcm9wZXJ0aWVzW25hbWVdKVxuXG4gIGNvbnN0IENvbXBvbmVudCA9IERlc2lnblN5c3RlbVtjb21wb25lbnRdXG4gIGlmICghQ29tcG9uZW50KSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxEZXNpZ25TeXN0ZW0uTWVzc2FnZUJveFxuICAgICAgICBzaXplPVwic21cIlxuICAgICAgICBtZXNzYWdlPVwiSmF2YXNjcmlwdCBFcnJvclwiXG4gICAgICAgIHZhcmlhbnQ9XCJkYW5nZXJcIlxuICAgICAgICBweT1cInhsXCJcbiAgICAgID5cbiAgICAgICAgVGhlcmUgaXMgbm8gY29tcG9uZW50IGJ5IHRoZSBuYW1lIG9mXG4gICAgICAgIDxEZXNpZ25TeXN0ZW0uQmFkZ2Ugc2l6ZT1cInNtXCIgdmFyaWFudD1cImRhbmdlclwiIG14PVwiZGVmYXVsdFwiPntjb21wb25lbnR9PC9EZXNpZ25TeXN0ZW0uQmFkZ2U+XG4gICAgICAgIGluIEBhZG1pbmpzL2Rlc2lnbi1zeXN0ZW0uIENoYW5nZVxuICAgICAgICA8RGVzaWduU3lzdGVtLkJhZGdlIHNpemU9XCJzbVwiIHZhcmlhbnQ9XCJkYW5nZXJcIiBteD1cImRlZmF1bHRcIj57YEAke2NvbXBvbmVudH1gfTwvRGVzaWduU3lzdGVtLkJhZGdlPlxuICAgICAgICB0byBhdmFpbGFibGUgY29tcG9uZW50IGxpa2UgQEhlYWRlclxuICAgICAgPC9EZXNpZ25TeXN0ZW0uTWVzc2FnZUJveD5cbiAgICApXG4gIH1cblxuICByZXR1cm4gKFxuICAgIDxDb21wb25lbnQgey4uLm90aGVyIGFzIGFueX0+XG4gICAgICB7cHJvcGVydGllcy5tYXAoKHByb3BlcnR5KSA9PiAoXG4gICAgICAgIDxEZXNpZ25TeXN0ZW0uQm94IGZsZXhHcm93PXsxfSBrZXk9e3Byb3BlcnR5LnByb3BlcnR5UGF0aH0+XG4gICAgICAgICAgPFByb3BlcnR5VHlwZVxuICAgICAgICAgICAga2V5PXtwcm9wZXJ0eS5wcm9wZXJ0eVBhdGh9XG4gICAgICAgICAgICB3aGVyZT17d2hlcmV9XG4gICAgICAgICAgICBwcm9wZXJ0eT17cHJvcGVydHl9XG4gICAgICAgICAgICByZXNvdXJjZT17cmVzb3VyY2V9XG4gICAgICAgICAgICByZWNvcmQ9e3JlY29yZH1cbiAgICAgICAgICAgIG9uQ2hhbmdlPXtvbkNoYW5nZX1cbiAgICAgICAgICAvPlxuICAgICAgICA8L0Rlc2lnblN5c3RlbS5Cb3g+XG4gICAgICApKX1cbiAgICAgIHtpbm5lckxheW91dEVsZW1lbnRzLm1hcCgoaW5uZXJMYXlvdXRFbGVtZW50LCBpKSA9PiAoXG4gICAgICAgIDxMYXlvdXRFbGVtZW50UmVuZGVyZXJcbiAgICAgICAgICB7Li4ucHJvcHN9XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0L25vLWFycmF5LWluZGV4LWtleVxuICAgICAgICAgIGtleT17aX1cbiAgICAgICAgICBsYXlvdXRFbGVtZW50PXtpbm5lckxheW91dEVsZW1lbnR9XG4gICAgICAgIC8+XG4gICAgICApKX1cbiAgICAgIHtjaGlsZHJlbn1cbiAgICA8L0NvbXBvbmVudD5cbiAgKVxufVxuXG5leHBvcnQgZGVmYXVsdCBMYXlvdXRFbGVtZW50UmVuZGVyZXJcbiIsImltcG9ydCB7IEJveCwgQnV0dG9uLCBEcmF3ZXJDb250ZW50LCBEcmF3ZXJGb290ZXIsIEljb24gfSBmcm9tICdAYWRtaW5qcy9kZXNpZ24tc3lzdGVtJ1xuaW1wb3J0IFJlYWN0LCB7IEZDLCB1c2VFZmZlY3QgfSBmcm9tICdyZWFjdCdcbmltcG9ydCB7IHVzZU5hdmlnYXRlIH0gZnJvbSAncmVhY3Qtcm91dGVyJ1xuXG5pbXBvcnQgYWxsb3dPdmVycmlkZSBmcm9tICcuLi8uLi9ob2MvYWxsb3ctb3ZlcnJpZGUnXG5pbXBvcnQgdXNlUmVjb3JkIGZyb20gJy4uLy4uL2hvb2tzL3VzZS1yZWNvcmQvdXNlLXJlY29yZCdcbmltcG9ydCB7IHVzZVRyYW5zbGF0aW9uIH0gZnJvbSAnLi4vLi4vaG9va3MvdXNlLXRyYW5zbGF0aW9uJ1xuaW1wb3J0IHsgUmVjb3JkSlNPTiB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMnXG5pbXBvcnQgeyBnZXRBY3Rpb25FbGVtZW50Q3NzIH0gZnJvbSAnLi4vLi4vdXRpbHMnXG5pbXBvcnQgQWN0aW9uSGVhZGVyIGZyb20gJy4uL2FwcC9hY3Rpb24taGVhZGVyL2FjdGlvbi1oZWFkZXInXG5pbXBvcnQgUHJvcGVydHlUeXBlIGZyb20gJy4uL3Byb3BlcnR5LXR5cGUnXG5pbXBvcnQgeyBBY3Rpb25Qcm9wcyB9IGZyb20gJy4vYWN0aW9uLnByb3BzJ1xuaW1wb3J0IHsgYXBwZW5kRm9yY2VSZWZyZXNoIH0gZnJvbSAnLi91dGlscy9hcHBlbmQtZm9yY2UtcmVmcmVzaCdcbmltcG9ydCBMYXlvdXRFbGVtZW50UmVuZGVyZXIgZnJvbSAnLi91dGlscy9sYXlvdXQtZWxlbWVudC1yZW5kZXJlcidcblxuY29uc3QgTmV3OiBGQzxBY3Rpb25Qcm9wcz4gPSAocHJvcHMpID0+IHtcbiAgY29uc3QgeyByZWNvcmQ6IGluaXRpYWxSZWNvcmQsIHJlc291cmNlLCBhY3Rpb24gfSA9IHByb3BzXG4gIGNvbnN0IHtcbiAgICByZWNvcmQsXG4gICAgaGFuZGxlQ2hhbmdlLFxuICAgIHN1Ym1pdDogaGFuZGxlU3VibWl0LFxuICAgIGxvYWRpbmcsXG4gICAgc2V0UmVjb3JkLFxuICB9ID0gdXNlUmVjb3JkKGluaXRpYWxSZWNvcmQsIHJlc291cmNlLmlkKVxuICBjb25zdCB7IHRyYW5zbGF0ZUJ1dHRvbiB9ID0gdXNlVHJhbnNsYXRpb24oKVxuICBjb25zdCBuYXZpZ2F0ZSA9IHVzZU5hdmlnYXRlKClcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChpbml0aWFsUmVjb3JkKSB7XG4gICAgICBzZXRSZWNvcmQoaW5pdGlhbFJlY29yZClcbiAgICB9XG4gIH0sIFtpbml0aWFsUmVjb3JkXSlcblxuICBjb25zdCBzdWJtaXQgPSAoZXZlbnQ6IFJlYWN0LkZvcm1FdmVudDxIVE1MRm9ybUVsZW1lbnQ+KTogYm9vbGVhbiA9PiB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgIGhhbmRsZVN1Ym1pdCgpLnRoZW4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBpZiAocmVzcG9uc2UuZGF0YS5yZWRpcmVjdFVybCkge1xuICAgICAgICBuYXZpZ2F0ZShhcHBlbmRGb3JjZVJlZnJlc2gocmVzcG9uc2UuZGF0YS5yZWRpcmVjdFVybCkpXG4gICAgICB9XG4gICAgICAvLyBpZiByZWNvcmQgaGFzIGlkID09PSBoYXMgYmVlbiBjcmVhdGVkXG4gICAgICBpZiAocmVzcG9uc2UuZGF0YS5yZWNvcmQuaWQgJiYgIU9iamVjdC5rZXlzKHJlc3BvbnNlLmRhdGEucmVjb3JkLmVycm9ycykubGVuZ3RoKSB7XG4gICAgICAgIGhhbmRsZUNoYW5nZSh7IHBhcmFtczoge30sIHBvcHVsYXRlZDoge30sIGVycm9yczoge30gfSBhcyBSZWNvcmRKU09OKVxuICAgICAgfVxuICAgIH0pXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBjb25zdCBjb250ZW50VGFnID0gZ2V0QWN0aW9uRWxlbWVudENzcyhyZXNvdXJjZS5pZCwgYWN0aW9uLm5hbWUsICdkcmF3ZXItY29udGVudCcpXG4gIGNvbnN0IGZvcm1UYWcgPSBnZXRBY3Rpb25FbGVtZW50Q3NzKHJlc291cmNlLmlkLCBhY3Rpb24ubmFtZSwgJ2Zvcm0nKVxuICBjb25zdCBmb290ZXJUYWcgPSBnZXRBY3Rpb25FbGVtZW50Q3NzKHJlc291cmNlLmlkLCBhY3Rpb24ubmFtZSwgJ2RyYXdlci1mb290ZXInKVxuICBjb25zdCBidXR0b25UYWcgPSBnZXRBY3Rpb25FbGVtZW50Q3NzKHJlc291cmNlLmlkLCBhY3Rpb24ubmFtZSwgJ2RyYXdlci1zdWJtaXQnKVxuXG4gIHJldHVybiAoXG4gICAgPEJveFxuICAgICAgYXM9XCJmb3JtXCJcbiAgICAgIG9uU3VibWl0PXtzdWJtaXR9XG4gICAgICBmbGV4XG4gICAgICBmbGV4R3Jvdz17MX1cbiAgICAgIGZsZXhEaXJlY3Rpb249XCJjb2x1bW5cIlxuICAgICAgZGF0YS1jc3M9e2Zvcm1UYWd9XG4gICAgPlxuICAgICAgPERyYXdlckNvbnRlbnQgZGF0YS1jc3M9e2NvbnRlbnRUYWd9PlxuICAgICAgICB7YWN0aW9uPy5zaG93SW5EcmF3ZXIgPyA8QWN0aW9uSGVhZGVyIHsuLi5wcm9wc30gLz4gOiBudWxsfVxuICAgICAgICB7YWN0aW9uLmxheW91dCA/IGFjdGlvbi5sYXlvdXQubWFwKChsYXlvdXRFbGVtZW50LCBpKSA9PiAoXG4gICAgICAgICAgPExheW91dEVsZW1lbnRSZW5kZXJlclxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0L25vLWFycmF5LWluZGV4LWtleVxuICAgICAgICAgICAga2V5PXtpfVxuICAgICAgICAgICAgbGF5b3V0RWxlbWVudD17bGF5b3V0RWxlbWVudH1cbiAgICAgICAgICAgIHsuLi5wcm9wc31cbiAgICAgICAgICAgIHdoZXJlPVwiZWRpdFwiXG4gICAgICAgICAgICBvbkNoYW5nZT17aGFuZGxlQ2hhbmdlfVxuICAgICAgICAgICAgcmVjb3JkPXtyZWNvcmQgYXMgUmVjb3JkSlNPTn1cbiAgICAgICAgICAvPlxuICAgICAgICApKSA6IHJlc291cmNlLmVkaXRQcm9wZXJ0aWVzLm1hcCgocHJvcGVydHkpID0+IChcbiAgICAgICAgICA8UHJvcGVydHlUeXBlXG4gICAgICAgICAgICBrZXk9e3Byb3BlcnR5LnByb3BlcnR5UGF0aH1cbiAgICAgICAgICAgIHdoZXJlPVwiZWRpdFwiXG4gICAgICAgICAgICBvbkNoYW5nZT17aGFuZGxlQ2hhbmdlfVxuICAgICAgICAgICAgcHJvcGVydHk9e3Byb3BlcnR5fVxuICAgICAgICAgICAgcmVzb3VyY2U9e3Jlc291cmNlfVxuICAgICAgICAgICAgcmVjb3JkPXtyZWNvcmQgYXMgUmVjb3JkSlNPTn1cbiAgICAgICAgICAvPlxuICAgICAgICApKX1cbiAgICAgIDwvRHJhd2VyQ29udGVudD5cbiAgICAgIDxEcmF3ZXJGb290ZXIgZGF0YS1jc3M9e2Zvb3RlclRhZ30+XG4gICAgICAgIDxCdXR0b24gdmFyaWFudD1cInByaW1hcnlcIiBzaXplPVwibGdcIiB0eXBlPVwic3VibWl0XCIgZGF0YS1jc3M9e2J1dHRvblRhZ30gZGF0YS10ZXN0aWQ9XCJidXR0b24tc2F2ZVwiIGRpc2FibGVkPXtsb2FkaW5nfT5cbiAgICAgICAgICB7bG9hZGluZyA/ICg8SWNvbiBpY29uPVwiRmFkZVwiIHNwaW4gLz4pIDogbnVsbH1cbiAgICAgICAgICB7dHJhbnNsYXRlQnV0dG9uKCdzYXZlJywgcmVzb3VyY2UuaWQpfVxuICAgICAgICA8L0J1dHRvbj5cbiAgICAgIDwvRHJhd2VyRm9vdGVyPlxuICAgIDwvQm94PlxuICApXG59XG5cbmNvbnN0IE92ZXJyaWRhYmxlTmV3ID0gYWxsb3dPdmVycmlkZShOZXcsICdEZWZhdWx0TmV3QWN0aW9uJylcblxuZXhwb3J0IHtcbiAgT3ZlcnJpZGFibGVOZXcgYXMgZGVmYXVsdCxcbiAgT3ZlcnJpZGFibGVOZXcgYXMgTmV3LFxufVxuIiwiaW1wb3J0IHsgQm94LCBCdXR0b24sIERyYXdlckNvbnRlbnQsIERyYXdlckZvb3RlciwgSWNvbiB9IGZyb20gJ0BhZG1pbmpzL2Rlc2lnbi1zeXN0ZW0nXG5pbXBvcnQgUmVhY3QsIHsgRkMsIHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgdXNlTmF2aWdhdGUgfSBmcm9tICdyZWFjdC1yb3V0ZXInXG5cbmltcG9ydCBhbGxvd092ZXJyaWRlIGZyb20gJy4uLy4uL2hvYy9hbGxvdy1vdmVycmlkZSdcbmltcG9ydCB1c2VSZWNvcmQgZnJvbSAnLi4vLi4vaG9va3MvdXNlLXJlY29yZC91c2UtcmVjb3JkJ1xuaW1wb3J0IHsgdXNlVHJhbnNsYXRpb24gfSBmcm9tICcuLi8uLi9ob29rcy91c2UtdHJhbnNsYXRpb24nXG5pbXBvcnQgeyBSZWNvcmRKU09OIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcydcbmltcG9ydCB7IGdldEFjdGlvbkVsZW1lbnRDc3MgfSBmcm9tICcuLi8uLi91dGlscydcbmltcG9ydCBBY3Rpb25IZWFkZXIgZnJvbSAnLi4vYXBwL2FjdGlvbi1oZWFkZXIvYWN0aW9uLWhlYWRlcidcbmltcG9ydCBQcm9wZXJ0eVR5cGUgZnJvbSAnLi4vcHJvcGVydHktdHlwZSdcbmltcG9ydCB7IEFjdGlvblByb3BzIH0gZnJvbSAnLi9hY3Rpb24ucHJvcHMnXG5pbXBvcnQgeyBhcHBlbmRGb3JjZVJlZnJlc2ggfSBmcm9tICcuL3V0aWxzL2FwcGVuZC1mb3JjZS1yZWZyZXNoJ1xuaW1wb3J0IExheW91dEVsZW1lbnRSZW5kZXJlciBmcm9tICcuL3V0aWxzL2xheW91dC1lbGVtZW50LXJlbmRlcmVyJ1xuXG5jb25zdCBFZGl0OiBGQzxBY3Rpb25Qcm9wcz4gPSAocHJvcHMpID0+IHtcbiAgY29uc3QgeyByZWNvcmQ6IGluaXRpYWxSZWNvcmQsIHJlc291cmNlLCBhY3Rpb24gfSA9IHByb3BzXG5cbiAgY29uc3Qge1xuICAgIHJlY29yZCxcbiAgICBoYW5kbGVDaGFuZ2UsXG4gICAgc3VibWl0OiBoYW5kbGVTdWJtaXQsXG4gICAgbG9hZGluZyxcbiAgICBzZXRSZWNvcmQsXG4gIH0gPSB1c2VSZWNvcmQoaW5pdGlhbFJlY29yZCwgcmVzb3VyY2UuaWQpXG4gIGNvbnN0IHsgdHJhbnNsYXRlQnV0dG9uIH0gPSB1c2VUcmFuc2xhdGlvbigpXG4gIGNvbnN0IG5hdmlnYXRlID0gdXNlTmF2aWdhdGUoKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGluaXRpYWxSZWNvcmQpIHtcbiAgICAgIHNldFJlY29yZChpbml0aWFsUmVjb3JkKVxuICAgIH1cbiAgfSwgW2luaXRpYWxSZWNvcmRdKVxuXG4gIGNvbnN0IHN1Ym1pdCA9IChldmVudDogUmVhY3QuRm9ybUV2ZW50PEhUTUxGb3JtRWxlbWVudD4pOiBib29sZWFuID0+IHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgaGFuZGxlU3VibWl0KCkudGhlbigocmVzcG9uc2UpID0+IHtcbiAgICAgIGlmIChyZXNwb25zZS5kYXRhLnJlZGlyZWN0VXJsKSB7XG4gICAgICAgIG5hdmlnYXRlKGFwcGVuZEZvcmNlUmVmcmVzaChyZXNwb25zZS5kYXRhLnJlZGlyZWN0VXJsKSlcbiAgICAgIH1cbiAgICB9KVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgY29uc3QgY29udGVudFRhZyA9IGdldEFjdGlvbkVsZW1lbnRDc3MocmVzb3VyY2UuaWQsIGFjdGlvbi5uYW1lLCAnZHJhd2VyLWNvbnRlbnQnKVxuICBjb25zdCBmb3JtVGFnID0gZ2V0QWN0aW9uRWxlbWVudENzcyhyZXNvdXJjZS5pZCwgYWN0aW9uLm5hbWUsICdmb3JtJylcbiAgY29uc3QgZm9vdGVyVGFnID0gZ2V0QWN0aW9uRWxlbWVudENzcyhyZXNvdXJjZS5pZCwgYWN0aW9uLm5hbWUsICdkcmF3ZXItZm9vdGVyJylcbiAgY29uc3QgYnV0dG9uVGFnID0gZ2V0QWN0aW9uRWxlbWVudENzcyhyZXNvdXJjZS5pZCwgYWN0aW9uLm5hbWUsICdkcmF3ZXItc3VibWl0JylcblxuICByZXR1cm4gKFxuICAgIDxCb3hcbiAgICAgIGFzPVwiZm9ybVwiXG4gICAgICBvblN1Ym1pdD17c3VibWl0fVxuICAgICAgZmxleFxuICAgICAgZmxleERpcmVjdGlvbj1cImNvbHVtblwiXG4gICAgICBkYXRhLWNzcz17Zm9ybVRhZ31cbiAgICA+XG4gICAgICA8RHJhd2VyQ29udGVudCBkYXRhLWNzcz17Y29udGVudFRhZ30+XG4gICAgICAgIHthY3Rpb24/LnNob3dJbkRyYXdlciA/IDxBY3Rpb25IZWFkZXIgey4uLnByb3BzfSAvPiA6IG51bGx9XG4gICAgICAgIHthY3Rpb24ubGF5b3V0ID8gYWN0aW9uLmxheW91dC5tYXAoKGxheW91dEVsZW1lbnQsIGkpID0+IChcbiAgICAgICAgICA8TGF5b3V0RWxlbWVudFJlbmRlcmVyXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3Qvbm8tYXJyYXktaW5kZXgta2V5XG4gICAgICAgICAgICBrZXk9e2l9XG4gICAgICAgICAgICBsYXlvdXRFbGVtZW50PXtsYXlvdXRFbGVtZW50fVxuICAgICAgICAgICAgey4uLnByb3BzfVxuICAgICAgICAgICAgd2hlcmU9XCJlZGl0XCJcbiAgICAgICAgICAgIG9uQ2hhbmdlPXtoYW5kbGVDaGFuZ2V9XG4gICAgICAgICAgICByZWNvcmQ9e3JlY29yZCBhcyBSZWNvcmRKU09OfVxuICAgICAgICAgIC8+XG4gICAgICAgICkpIDogcmVzb3VyY2UuZWRpdFByb3BlcnRpZXMubWFwKChwcm9wZXJ0eSkgPT4gKFxuICAgICAgICAgIDxQcm9wZXJ0eVR5cGVcbiAgICAgICAgICAgIGtleT17cHJvcGVydHkucHJvcGVydHlQYXRofVxuICAgICAgICAgICAgd2hlcmU9XCJlZGl0XCJcbiAgICAgICAgICAgIG9uQ2hhbmdlPXtoYW5kbGVDaGFuZ2V9XG4gICAgICAgICAgICBwcm9wZXJ0eT17cHJvcGVydHl9XG4gICAgICAgICAgICByZXNvdXJjZT17cmVzb3VyY2V9XG4gICAgICAgICAgICByZWNvcmQ9e3JlY29yZCBhcyBSZWNvcmRKU09OfVxuICAgICAgICAgIC8+XG4gICAgICAgICkpfVxuICAgICAgPC9EcmF3ZXJDb250ZW50PlxuICAgICAgPERyYXdlckZvb3RlciBkYXRhLWNzcz17Zm9vdGVyVGFnfT5cbiAgICAgICAgPEJ1dHRvbiB2YXJpYW50PVwicHJpbWFyeVwiIHNpemU9XCJsZ1wiIHR5cGU9XCJzdWJtaXRcIiBkYXRhLWNzcz17YnV0dG9uVGFnfSBkYXRhLXRlc3RpZD1cImJ1dHRvbi1zYXZlXCIgZGlzYWJsZWQ9e2xvYWRpbmd9PlxuICAgICAgICAgIHtsb2FkaW5nID8gKDxJY29uIGljb249XCJGYWRlXCIgc3BpbiAvPikgOiBudWxsfVxuICAgICAgICAgIHt0cmFuc2xhdGVCdXR0b24oJ3NhdmUnLCByZXNvdXJjZS5pZCl9XG4gICAgICAgIDwvQnV0dG9uPlxuICAgICAgPC9EcmF3ZXJGb290ZXI+XG4gICAgPC9Cb3g+XG4gIClcbn1cblxuY29uc3QgT3ZlcnJpZGFibGVFZGl0ID0gYWxsb3dPdmVycmlkZShFZGl0LCAnRGVmYXVsdEVkaXRBY3Rpb24nKVxuXG5leHBvcnQge1xuICBPdmVycmlkYWJsZUVkaXQgYXMgZGVmYXVsdCxcbiAgT3ZlcnJpZGFibGVFZGl0IGFzIEVkaXQsXG59XG4iLCJpbXBvcnQgeyBEcmF3ZXJDb250ZW50IH0gZnJvbSAnQGFkbWluanMvZGVzaWduLXN5c3RlbSdcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcblxuaW1wb3J0IGFsbG93T3ZlcnJpZGUgZnJvbSAnLi4vLi4vaG9jL2FsbG93LW92ZXJyaWRlJ1xuaW1wb3J0IHsgZ2V0QWN0aW9uRWxlbWVudENzcyB9IGZyb20gJy4uLy4uL3V0aWxzJ1xuaW1wb3J0IEFjdGlvbkhlYWRlciBmcm9tICcuLi9hcHAvYWN0aW9uLWhlYWRlci9hY3Rpb24taGVhZGVyJ1xuaW1wb3J0IFByb3BlcnR5VHlwZSBmcm9tICcuLi9wcm9wZXJ0eS10eXBlJ1xuaW1wb3J0IHsgQWN0aW9uUHJvcHMgfSBmcm9tICcuL2FjdGlvbi5wcm9wcydcbmltcG9ydCBMYXlvdXRFbGVtZW50UmVuZGVyZXIgZnJvbSAnLi91dGlscy9sYXlvdXQtZWxlbWVudC1yZW5kZXJlcidcblxuLyoqXG4gKiBAbmFtZSBTaG93QWN0aW9uXG4gKiBAY2F0ZWdvcnkgQWN0aW9uc1xuICogQGRlc2NyaXB0aW9uIFNob3dzIGEgZ2l2ZW4gcmVjb3JkLlxuICogQGNvbXBvbmVudFxuICogQHByaXZhdGVcbiAqL1xuY29uc3QgU2hvdzogUmVhY3QuRkM8QWN0aW9uUHJvcHM+ID0gKHByb3BzKSA9PiB7XG4gIGNvbnN0IHsgcmVzb3VyY2UsIHJlY29yZCwgYWN0aW9uIH0gPSBwcm9wc1xuICBjb25zdCBwcm9wZXJ0aWVzID0gcmVzb3VyY2Uuc2hvd1Byb3BlcnRpZXNcblxuICBjb25zdCBjb250ZW50VGFnID0gZ2V0QWN0aW9uRWxlbWVudENzcyhyZXNvdXJjZS5pZCwgYWN0aW9uLm5hbWUsICdkcmF3ZXItY29udGVudCcpXG5cbiAgcmV0dXJuIChcbiAgICA8RHJhd2VyQ29udGVudCBkYXRhLWNzcz17Y29udGVudFRhZ30+XG4gICAgICB7YWN0aW9uPy5zaG93SW5EcmF3ZXIgPyA8QWN0aW9uSGVhZGVyIHsuLi5wcm9wc30gLz4gOiBudWxsfVxuICAgICAge2FjdGlvbi5sYXlvdXQgPyBhY3Rpb24ubGF5b3V0Lm1hcCgobGF5b3V0RWxlbWVudCwgaSkgPT4gKFxuICAgICAgICA8TGF5b3V0RWxlbWVudFJlbmRlcmVyXG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0L25vLWFycmF5LWluZGV4LWtleVxuICAgICAgICAgIGtleT17aX1cbiAgICAgICAgICBsYXlvdXRFbGVtZW50PXtsYXlvdXRFbGVtZW50fVxuICAgICAgICAgIHsuLi5wcm9wc31cbiAgICAgICAgICB3aGVyZT1cInNob3dcIlxuICAgICAgICAvPlxuICAgICAgKSkgOiBwcm9wZXJ0aWVzLm1hcCgocHJvcGVydHkpID0+IChcbiAgICAgICAgPFByb3BlcnR5VHlwZVxuICAgICAgICAgIGtleT17cHJvcGVydHkucHJvcGVydHlQYXRofVxuICAgICAgICAgIHdoZXJlPVwic2hvd1wiXG4gICAgICAgICAgcHJvcGVydHk9e3Byb3BlcnR5fVxuICAgICAgICAgIHJlc291cmNlPXtyZXNvdXJjZX1cbiAgICAgICAgICByZWNvcmQ9e3JlY29yZH1cbiAgICAgICAgLz5cbiAgICAgICkpfVxuXG4gICAgPC9EcmF3ZXJDb250ZW50PlxuICApXG59XG5cbmNvbnN0IE92ZXJyaWRhYmxlU2hvdyA9IGFsbG93T3ZlcnJpZGUoU2hvdywgJ0RlZmF1bHRTaG93QWN0aW9uJylcblxuZXhwb3J0IHtcbiAgT3ZlcnJpZGFibGVTaG93IGFzIGRlZmF1bHQsXG4gIE92ZXJyaWRhYmxlU2hvdyBhcyBTaG93LFxufVxuIiwiLyogZXNsaW50LWRpc2FibGUgbm8tdW5kZWYgKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vLWFsZXJ0ICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1yZXN0cmljdGVkLWdsb2JhbHMgKi9cblxuaW1wb3J0IFJlYWN0LCB7IFJlYWN0RWxlbWVudCB9IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgQWN0aW9uUmVzcG9uc2UgfSBmcm9tICcuLi8uLi8uLi8uLi9iYWNrZW5kL2FjdGlvbnMvYWN0aW9uLmludGVyZmFjZSdcblxuaW1wb3J0IGFsbG93T3ZlcnJpZGUgZnJvbSAnLi4vLi4vLi4vaG9jL2FsbG93LW92ZXJyaWRlJ1xuaW1wb3J0IHsgdXNlQWN0aW9uIH0gZnJvbSAnLi4vLi4vLi4vaG9va3MnXG5pbXBvcnQgeyBBY3Rpb25KU09OLCBidWlsZEFjdGlvblRlc3RJZCB9IGZyb20gJy4uLy4uLy4uL2ludGVyZmFjZXMnXG5pbXBvcnQgeyBnZXRBY3Rpb25FbGVtZW50Q3NzIH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMnXG5cbi8qKlxuICogQGFsaWFzIEFjdGlvbkJ1dHRvblByb3BzXG4gKiBAbWVtYmVyb2YgQWN0aW9uQnV0dG9uXG4gKi9cbmV4cG9ydCB0eXBlIEFjdGlvbkJ1dHRvblByb3BzID0ge1xuICAvKiogQWN0aW9uIHRvIHdoaWNoIGJ1dHRvbiBzaG91bGQgcmVkaXJlY3QgKi9cbiAgYWN0aW9uOiBBY3Rpb25KU09OO1xuICAvKiogSWQgb2YgYSByZXNvdXJjZSBvZiBhbiBhY3Rpb24gKi9cbiAgcmVzb3VyY2VJZDogc3RyaW5nO1xuICAvKiogT3B0aW9uYWwgcmVjb3JkSWQgZm9yIF9yZWNvcmRfIGFjdGlvbiAqL1xuICByZWNvcmRJZD86IHN0cmluZztcbiAgLyoqIE9wdGlvbmFsIHJlY29yZElkcyBmb3IgX2J1bGtfIGFjdGlvbiAqL1xuICByZWNvcmRJZHM/OiBBcnJheTxzdHJpbmc+O1xuICAvKiogb3B0aW9uYWwgY2FsbGJhY2sgZnVuY3Rpb24gd2hpY2ggd2lsbCBiZSB0cmlnZ2VyZWQgd2hlbiBhY3Rpb24gaXMgcGVyZm9ybWVkICovXG4gIGFjdGlvblBlcmZvcm1lZD86IChhY3Rpb246IEFjdGlvblJlc3BvbnNlKSA9PiBhbnk7XG4gIGNoaWxkcmVuPzogUmVhY3QuUmVhY3ROb2RlO1xufVxuXG4vKipcbiAqIFJlbmRlcnMgQnV0dG9uIHdoaWNoIHJlZGlyZWN0cyB0byBnaXZlbiBhY3Rpb25cbiAqXG4gKiAjIyMgVXNhZ2VcbiAqXG4gKiBgYGBcbiAqIGltcG9ydCB7IEFjdGlvbkJ1dHRvbiB9IGZyb20gJ2FkbWluanMnXG4gKiBgYGBcbiAqXG4gKiBAY29tcG9uZW50XG4gKiBAc3ViY2F0ZWdvcnkgQXBwbGljYXRpb25cbiAqL1xuY29uc3QgQWN0aW9uQnV0dG9uOiBSZWFjdC5GQzxBY3Rpb25CdXR0b25Qcm9wcz4gPSAocHJvcHMpID0+IHtcbiAgY29uc3QgeyBjaGlsZHJlbiwgYWN0aW9uLCBhY3Rpb25QZXJmb3JtZWQsIHJlc291cmNlSWQsIHJlY29yZElkLCByZWNvcmRJZHMgfSA9IHByb3BzXG5cbiAgY29uc3QgeyBocmVmLCBoYW5kbGVDbGljayB9ID0gdXNlQWN0aW9uKGFjdGlvbiwge1xuICAgIHJlc291cmNlSWQsIHJlY29yZElkLCByZWNvcmRJZHMsXG4gIH0sIGFjdGlvblBlcmZvcm1lZClcblxuICBpZiAoIWFjdGlvbikge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBjb25zdCBmaXJzdENoaWxkID0gUmVhY3QuQ2hpbGRyZW4udG9BcnJheShjaGlsZHJlbilbMF1cblxuICBpZiAoIWZpcnN0Q2hpbGRcbiAgICB8fCB0eXBlb2YgZmlyc3RDaGlsZCA9PT0gJ3N0cmluZydcbiAgICB8fCB0eXBlb2YgZmlyc3RDaGlsZCA9PT0gJ251bWJlcidcbiAgICB8fCB0eXBlb2YgZmlyc3RDaGlsZCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdBY3Rpb25CdXR0b24gaGFzIHRvIGhhdmUgb25lIGNoaWxkJylcbiAgfVxuXG4gIGNvbnN0IGNvbnRlbnRUYWcgPSBnZXRBY3Rpb25FbGVtZW50Q3NzKHJlc291cmNlSWQsIGFjdGlvbi5uYW1lLCAnYnV0dG9uJylcblxuICBjb25zdCBXcmFwcGVkRWxlbWVudCA9IFJlYWN0LmNsb25lRWxlbWVudChmaXJzdENoaWxkIGFzIFJlYWN0RWxlbWVudDxhbnk+LCB7XG4gICAgb25DbGljazogaGFuZGxlQ2xpY2ssXG4gICAgJ2RhdGEtdGVzdGlkJzogYnVpbGRBY3Rpb25UZXN0SWQoYWN0aW9uKSxcbiAgICAnZGF0YS1jc3MnOiBjb250ZW50VGFnLFxuICAgIGhyZWYsXG4gIH0pXG5cbiAgcmV0dXJuIFdyYXBwZWRFbGVtZW50XG59XG5cbmNvbnN0IE92ZXJyaWRhYmxlQWN0aW9uQnV0dG9uID0gYWxsb3dPdmVycmlkZShBY3Rpb25CdXR0b24sICdBY3Rpb25CdXR0b24nKVxuXG5leHBvcnQge1xuICBPdmVycmlkYWJsZUFjdGlvbkJ1dHRvbiBhcyBkZWZhdWx0LFxuICBPdmVycmlkYWJsZUFjdGlvbkJ1dHRvbiBhcyBBY3Rpb25CdXR0b24sXG59XG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBUZXh0LCBCdXR0b24sIEljb24sIEluZm9Cb3ggfSBmcm9tICdAYWRtaW5qcy9kZXNpZ24tc3lzdGVtJ1xuXG5pbXBvcnQgeyBSZXNvdXJjZUpTT04gfSBmcm9tICcuLi8uLi8uLi9pbnRlcmZhY2VzJ1xuaW1wb3J0IHsgdXNlVHJhbnNsYXRpb24gfSBmcm9tICcuLi8uLi8uLi9ob29rcydcbmltcG9ydCBhbGxvd092ZXJyaWRlIGZyb20gJy4uLy4uLy4uL2hvYy9hbGxvdy1vdmVycmlkZSdcbmltcG9ydCBBY3Rpb25CdXR0b24gZnJvbSAnLi4vYWN0aW9uLWJ1dHRvbi9hY3Rpb24tYnV0dG9uJ1xuXG5leHBvcnQgdHlwZSBOb1JlY29yZHNQcm9wcyA9IHtcbiAgcmVzb3VyY2U6IFJlc291cmNlSlNPTjtcbn1cblxuY29uc3QgTm9SZWNvcmRzT3JpZ2luYWw6IFJlYWN0LkZDPE5vUmVjb3Jkc1Byb3BzPiA9IChwcm9wcykgPT4ge1xuICBjb25zdCB7IHJlc291cmNlIH0gPSBwcm9wc1xuICBjb25zdCB7IHRyYW5zbGF0ZUJ1dHRvbiwgdHJhbnNsYXRlTWVzc2FnZSB9ID0gdXNlVHJhbnNsYXRpb24oKVxuXG4gIGNvbnN0IGNhbkNyZWF0ZSA9IHJlc291cmNlLnJlc291cmNlQWN0aW9ucy5maW5kKChhKSA9PiBhLm5hbWUgPT09ICduZXcnKVxuXG4gIHJldHVybiAoXG4gICAgPEluZm9Cb3ggdGl0bGU9e3RyYW5zbGF0ZU1lc3NhZ2UoJ25vUmVjb3JkcycsIHJlc291cmNlLmlkKX0+XG4gICAgICA8VGV4dCBtYj1cInh4bFwiPlxuICAgICAgICB7dHJhbnNsYXRlTWVzc2FnZSgnbm9SZWNvcmRzSW5SZXNvdXJjZScsIHJlc291cmNlLmlkKX1cbiAgICAgIDwvVGV4dD5cbiAgICAgIHtjYW5DcmVhdGUgPyAoXG4gICAgICAgIDxBY3Rpb25CdXR0b24gYWN0aW9uPXtjYW5DcmVhdGV9IHJlc291cmNlSWQ9e3Jlc291cmNlLmlkfT5cbiAgICAgICAgICA8QnV0dG9uIHZhcmlhbnQ9XCJwcmltYXJ5XCI+XG4gICAgICAgICAgICA8SWNvbiBpY29uPVwiQWRkXCIgLz5cbiAgICAgICAgICAgIHt0cmFuc2xhdGVCdXR0b24oJ2NyZWF0ZUZpcnN0UmVjb3JkJywgcmVzb3VyY2UuaWQpfVxuICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICA8L0FjdGlvbkJ1dHRvbj5cbiAgICAgICkgOiAnJ31cbiAgICA8L0luZm9Cb3g+XG4gIClcbn1cblxuLy8gVGhpcyBoYWNrIHByZXZlbnRzIHJvbGx1cCBmcm9tIHRocm93aW5nIGFuIGVycm9yXG5jb25zdCBOb1JlY29yZHMgPSBhbGxvd092ZXJyaWRlKE5vUmVjb3Jkc09yaWdpbmFsLCAnTm9SZWNvcmRzJylcblxuZXhwb3J0IHsgTm9SZWNvcmRzIH1cbmV4cG9ydCBkZWZhdWx0IE5vUmVjb3Jkc1xuIiwiZXhwb3J0IGNvbnN0IGRpc3BsYXkgPSAoaXNUaXRsZTogYm9vbGVhbik6IEFycmF5PHN0cmluZz4gPT4gW1xuICBpc1RpdGxlID8gJ3RhYmxlLWNlbGwnIDogJ25vbmUnLFxuICBpc1RpdGxlID8gJ3RhYmxlLWNlbGwnIDogJ25vbmUnLFxuICAndGFibGUtY2VsbCcsXG4gICd0YWJsZS1jZWxsJyxcbl1cbiIsImltcG9ydCBSZWFjdCwgeyB1c2VTdGF0ZSwgdXNlRWZmZWN0LCB1c2VDYWxsYmFjayB9IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgdXNlTmF2aWdhdGUgfSBmcm9tICdyZWFjdC1yb3V0ZXInXG5pbXBvcnQge1xuICBQbGFjZWhvbGRlciwgVGFibGVSb3csIFRhYmxlQ2VsbCwgQ2hlY2tCb3gsIEJ1dHRvbkdyb3VwLFxufSBmcm9tICdAYWRtaW5qcy9kZXNpZ24tc3lzdGVtJ1xuXG5pbXBvcnQgUHJvcGVydHlUeXBlIGZyb20gJy4uLy4uL3Byb3BlcnR5LXR5cGUnXG5pbXBvcnQgeyBBY3Rpb25KU09OLCBidWlsZEFjdGlvbkNsaWNrSGFuZGxlciwgUmVjb3JkSlNPTiwgUmVzb3VyY2VKU09OIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJmYWNlcydcbmltcG9ydCB7IGRpc3BsYXkgfSBmcm9tICcuL3V0aWxzL2Rpc3BsYXknXG5pbXBvcnQgeyBBY3Rpb25SZXNwb25zZSwgUmVjb3JkQWN0aW9uUmVzcG9uc2UgfSBmcm9tICcuLi8uLi8uLi8uLi9iYWNrZW5kL2FjdGlvbnMvYWN0aW9uLmludGVyZmFjZSdcbmltcG9ydCBtZXJnZVJlY29yZFJlc3BvbnNlIGZyb20gJy4uLy4uLy4uL2hvb2tzL3VzZS1yZWNvcmQvbWVyZ2UtcmVjb3JkLXJlc3BvbnNlJ1xuaW1wb3J0IHsgdXNlQWN0aW9uUmVzcG9uc2VIYW5kbGVyIH0gZnJvbSAnLi4vLi4vLi4vaG9va3MnXG5pbXBvcnQgeyBhY3Rpb25zVG9CdXR0b25Hcm91cCB9IGZyb20gJy4uL2FjdGlvbi1oZWFkZXIvYWN0aW9ucy10by1idXR0b24tZ3JvdXAnXG5pbXBvcnQgYWxsb3dPdmVycmlkZSBmcm9tICcuLi8uLi8uLi9ob2MvYWxsb3ctb3ZlcnJpZGUnXG5pbXBvcnQgeyBnZXRSZXNvdXJjZUVsZW1lbnRDc3MgfSBmcm9tICcuLi8uLi8uLi91dGlscydcblxuZXhwb3J0IHR5cGUgUmVjb3JkSW5MaXN0UHJvcHMgPSB7XG4gIHJlc291cmNlOiBSZXNvdXJjZUpTT047XG4gIHJlY29yZDogUmVjb3JkSlNPTjtcbiAgYWN0aW9uUGVyZm9ybWVkPzogKGFjdGlvbjogQWN0aW9uUmVzcG9uc2UpID0+IGFueTtcbiAgaXNMb2FkaW5nPzogYm9vbGVhbjtcbiAgb25TZWxlY3Q/OiAocmVjb3JkOiBSZWNvcmRKU09OKSA9PiB2b2lkO1xuICBpc1NlbGVjdGVkPzogYm9vbGVhbjtcbn1cblxuY29uc3QgUmVjb3JkSW5MaXN0OiBSZWFjdC5GQzxSZWNvcmRJbkxpc3RQcm9wcz4gPSAocHJvcHMpID0+IHtcbiAgY29uc3Qge1xuICAgIHJlc291cmNlLCByZWNvcmQ6IHJlY29yZEZyb21Qcm9wcywgYWN0aW9uUGVyZm9ybWVkLFxuICAgIGlzTG9hZGluZywgb25TZWxlY3QsIGlzU2VsZWN0ZWQsXG4gIH0gPSBwcm9wc1xuICBjb25zdCBbcmVjb3JkLCBzZXRSZWNvcmRdID0gdXNlU3RhdGU8UmVjb3JkSlNPTj4ocmVjb3JkRnJvbVByb3BzKVxuICBjb25zdCBuYXZpZ2F0ZSA9IHVzZU5hdmlnYXRlKClcblxuICBjb25zdCBoYW5kbGVBY3Rpb25DYWxsYmFjayA9IHVzZUNhbGxiYWNrKChhY3Rpb25SZXNwb25zZTogQWN0aW9uUmVzcG9uc2UpID0+IHtcbiAgICBpZiAoYWN0aW9uUmVzcG9uc2UucmVjb3JkICYmICFhY3Rpb25SZXNwb25zZS5yZWRpcmVjdFVybCkge1xuICAgICAgc2V0UmVjb3JkKG1lcmdlUmVjb3JkUmVzcG9uc2UocmVjb3JkLCBhY3Rpb25SZXNwb25zZSBhcyBSZWNvcmRBY3Rpb25SZXNwb25zZSkpXG4gICAgfSBlbHNlIGlmIChhY3Rpb25QZXJmb3JtZWQpIHtcbiAgICAgIGFjdGlvblBlcmZvcm1lZChhY3Rpb25SZXNwb25zZSlcbiAgICB9XG4gIH0sIFthY3Rpb25QZXJmb3JtZWQsIHJlY29yZF0pXG5cbiAgY29uc3QgYWN0aW9uUmVzcG9uc2VIYW5kbGVyID0gdXNlQWN0aW9uUmVzcG9uc2VIYW5kbGVyKGhhbmRsZUFjdGlvbkNhbGxiYWNrKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgc2V0UmVjb3JkKHJlY29yZEZyb21Qcm9wcylcbiAgfSwgW3JlY29yZEZyb21Qcm9wc10pXG5cbiAgY29uc3QgeyByZWNvcmRBY3Rpb25zIH0gPSByZWNvcmRcblxuICBjb25zdCBzaG93ID0gcmVjb3JkLnJlY29yZEFjdGlvbnMuZmluZCgoeyBuYW1lIH0pID0+IG5hbWUgPT09ICdzaG93JylcbiAgY29uc3QgZWRpdCA9IHJlY29yZC5yZWNvcmRBY3Rpb25zLmZpbmQoKHsgbmFtZSB9KSA9PiBuYW1lID09PSAnZWRpdCcpXG4gIGNvbnN0IGFjdGlvbiA9IHNob3cgfHwgZWRpdFxuXG4gIGNvbnN0IGhhbmRsZUNsaWNrID0gKGV2ZW50KTogdm9pZCA9PiB7XG4gICAgY29uc3QgdGFyZ2V0VGFnTmFtZSA9IChldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLnRhZ05hbWUudG9Mb3dlckNhc2UoKVxuICAgIGlmIChhY3Rpb25cbiAgICAgICYmIHRhcmdldFRhZ05hbWUgIT09ICdhJ1xuICAgICAgJiYgdGFyZ2V0VGFnTmFtZSAhPT0gJ2J1dHRvbidcbiAgICAgICYmIHRhcmdldFRhZ05hbWUgIT09ICdzdmcnXG4gICAgKSB7XG4gICAgICBidWlsZEFjdGlvbkNsaWNrSGFuZGxlcih7XG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgcGFyYW1zOiB7IHJlc291cmNlSWQ6IHJlc291cmNlLmlkLCByZWNvcmRJZDogcmVjb3JkLmlkIH0sXG4gICAgICAgIGFjdGlvblJlc3BvbnNlSGFuZGxlcixcbiAgICAgICAgbmF2aWdhdGUsXG4gICAgICB9KShldmVudClcbiAgICB9XG4gIH1cblxuICBjb25zdCBhY3Rpb25QYXJhbXMgPSB7IHJlc291cmNlSWQ6IHJlc291cmNlLmlkLCByZWNvcmRJZDogcmVjb3JkLmlkIH1cblxuICBjb25zdCBoYW5kbGVBY3Rpb25DbGljayA9IChldmVudCwgc291cmNlQWN0aW9uOiBBY3Rpb25KU09OKTogdm9pZCB8IFByb21pc2U8dm9pZD4gPT4gKFxuICAgIGJ1aWxkQWN0aW9uQ2xpY2tIYW5kbGVyKHtcbiAgICAgIGFjdGlvbjogc291cmNlQWN0aW9uLFxuICAgICAgcGFyYW1zOiBhY3Rpb25QYXJhbXMsXG4gICAgICBhY3Rpb25SZXNwb25zZUhhbmRsZXIsXG4gICAgICBuYXZpZ2F0ZSxcbiAgICB9KShldmVudClcbiAgKVxuXG4gIGNvbnN0IGJ1dHRvbnMgPSBbe1xuICAgIGljb246ICdPdmVyZmxvd01lbnVIb3Jpem9udGFsJyxcbiAgICB2YXJpYW50OiAnbGlnaHQnIGFzIGNvbnN0LFxuICAgIGxhYmVsOiB1bmRlZmluZWQsXG4gICAgJ2RhdGEtdGVzdGlkJzogJ2FjdGlvbnMtZHJvcGRvd24nLFxuICAgIGJ1dHRvbnM6IGFjdGlvbnNUb0J1dHRvbkdyb3VwKHtcbiAgICAgIGFjdGlvbnM6IHJlY29yZEFjdGlvbnMsXG4gICAgICBwYXJhbXM6IGFjdGlvblBhcmFtcyxcbiAgICAgIGhhbmRsZUNsaWNrOiBoYW5kbGVBY3Rpb25DbGljayxcbiAgICB9KSxcbiAgfV1cbiAgY29uc3QgY29udGVudFRhZyA9IGdldFJlc291cmNlRWxlbWVudENzcyhyZXNvdXJjZS5pZCwgJ3RhYmxlLXJvdycpXG4gIHJldHVybiAoXG4gICAgPFRhYmxlUm93IG9uQ2xpY2s9e2hhbmRsZUNsaWNrfSBkYXRhLWlkPXtyZWNvcmQuaWR9IGRhdGEtY3NzPXtjb250ZW50VGFnfT5cbiAgICAgIDxUYWJsZUNlbGwgY2xhc3NOYW1lPXtpc1NlbGVjdGVkID8gJ3NlbGVjdGVkJyA6ICdub3Qtc2VsZWN0ZWQnfT5cbiAgICAgICAge29uU2VsZWN0ICYmIHJlY29yZC5idWxrQWN0aW9ucy5sZW5ndGggPyAoXG4gICAgICAgICAgPENoZWNrQm94XG4gICAgICAgICAgICBvbkNoYW5nZT17KCkgPT4gb25TZWxlY3QocmVjb3JkKX1cbiAgICAgICAgICAgIGNoZWNrZWQ9e2lzU2VsZWN0ZWR9XG4gICAgICAgICAgLz5cbiAgICAgICAgKSA6IG51bGx9XG4gICAgICA8L1RhYmxlQ2VsbD5cbiAgICAgIHtyZXNvdXJjZS5saXN0UHJvcGVydGllcy5tYXAoKHByb3BlcnR5KSA9PiB7XG4gICAgICAgIGNvbnN0IGNlbGxUYWcgPSBgJHtyZXNvdXJjZS5pZH0tJHtwcm9wZXJ0eS5uYW1lfS10YWJsZS1jZWxsYFxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIDxUYWJsZUNlbGxcbiAgICAgICAgICAgIHN0eWxlPXt7IGN1cnNvcjogJ3BvaW50ZXInIH19XG4gICAgICAgICAgICBrZXk9e3Byb3BlcnR5LnByb3BlcnR5UGF0aH1cbiAgICAgICAgICAgIGRhdGEtcHJvcGVydHktbmFtZT17cHJvcGVydHkucHJvcGVydHlQYXRofVxuICAgICAgICAgICAgZGlzcGxheT17ZGlzcGxheShwcm9wZXJ0eS5pc1RpdGxlKX1cbiAgICAgICAgICAgIGRhdGEtY3NzPXtjZWxsVGFnfVxuICAgICAgICAgID5cbiAgICAgICAgICAgIHtpc0xvYWRpbmcgPyAoXG4gICAgICAgICAgICAgIDxQbGFjZWhvbGRlciBzdHlsZT17eyBoZWlnaHQ6IDE0IH19IC8+XG4gICAgICAgICAgICApIDogKFxuICAgICAgICAgICAgICA8UHJvcGVydHlUeXBlXG4gICAgICAgICAgICAgICAga2V5PXtwcm9wZXJ0eS5wcm9wZXJ0eVBhdGh9XG4gICAgICAgICAgICAgICAgd2hlcmU9XCJsaXN0XCJcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eT17cHJvcGVydHl9XG4gICAgICAgICAgICAgICAgcmVzb3VyY2U9e3Jlc291cmNlfVxuICAgICAgICAgICAgICAgIHJlY29yZD17cmVjb3JkfVxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICA8L1RhYmxlQ2VsbD5cbiAgICAgICAgKVxuICAgICAgfSl9XG4gICAgICA8VGFibGVDZWxsIGtleT1cIm9wdGlvbnNcIj5cbiAgICAgICAge3JlY29yZEFjdGlvbnMubGVuZ3RoID8gKFxuICAgICAgICAgIDxCdXR0b25Hcm91cCBidXR0b25zPXtidXR0b25zfSAvPlxuICAgICAgICApIDogJyd9XG4gICAgICA8L1RhYmxlQ2VsbD5cbiAgICA8L1RhYmxlUm93PlxuICApXG59XG5cbmNvbnN0IE92ZXJyaWRhYmxlUmVjb3JkSW5MaXN0ID0gYWxsb3dPdmVycmlkZShSZWNvcmRJbkxpc3QsICdSZWNvcmRJbkxpc3QnKVxuXG5leHBvcnQge1xuICBPdmVycmlkYWJsZVJlY29yZEluTGlzdCBhcyBkZWZhdWx0LFxuICBPdmVycmlkYWJsZVJlY29yZEluTGlzdCBhcyBSZWNvcmRJbkxpc3QsXG59XG4iLCJpbXBvcnQgUmVhY3QsIHsgbWVtbywgdXNlTWVtbyB9IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgdXNlTG9jYXRpb24sIE5hdkxpbmsgfSBmcm9tICdyZWFjdC1yb3V0ZXItZG9tJ1xuXG5pbXBvcnQgeyBJY29uLCBjc3NDbGFzcyB9IGZyb20gJ0BhZG1pbmpzL2Rlc2lnbi1zeXN0ZW0nXG5cbmltcG9ydCB7IEJhc2VQcm9wZXJ0eUpTT04gfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzJ1xuXG5leHBvcnQgdHlwZSBTb3J0TGlua1Byb3BzID0ge1xuICBwcm9wZXJ0eTogQmFzZVByb3BlcnR5SlNPTjtcbiAgZGlyZWN0aW9uPzogJ2FzYycgfCAnZGVzYyc7XG4gIHNvcnRCeT86IHN0cmluZztcbn1cblxuY29uc3QgU29ydExpbms6IFJlYWN0LkZDPFNvcnRMaW5rUHJvcHM+ID0gKHByb3BzKSA9PiB7XG4gIGNvbnN0IHsgc29ydEJ5LCBwcm9wZXJ0eSwgZGlyZWN0aW9uIH0gPSBwcm9wc1xuICBjb25zdCBsb2NhdGlvbiA9IHVzZUxvY2F0aW9uKClcblxuICBjb25zdCBpc0FjdGl2ZSA9IHVzZU1lbW8oKCkgPT4gc29ydEJ5ID09PSBwcm9wZXJ0eS5wcm9wZXJ0eVBhdGgsIFtzb3J0QnksIHByb3BlcnR5XSlcblxuICBjb25zdCBxdWVyeSA9IG5ldyBVUkxTZWFyY2hQYXJhbXMobG9jYXRpb24uc2VhcmNoKVxuICBjb25zdCBvcHBvc2l0ZURpcmVjdGlvbiA9IChpc0FjdGl2ZSAmJiBkaXJlY3Rpb24gPT09ICdhc2MnKSA/ICdkZXNjJyA6ICdhc2MnXG4gIGNvbnN0IHNvcnRlZEJ5SWNvbiA9IGBDYXJldCR7ZGlyZWN0aW9uID09PSAnYXNjJyA/ICdVcCcgOiAnRG93bid9YFxuXG4gIHF1ZXJ5LnNldCgnZGlyZWN0aW9uJywgb3Bwb3NpdGVEaXJlY3Rpb24pXG4gIHF1ZXJ5LnNldCgnc29ydEJ5JywgcHJvcGVydHkucHJvcGVydHlQYXRoKVxuXG4gIHJldHVybiAoXG4gICAgPE5hdkxpbmsgdG89e3sgc2VhcmNoOiBxdWVyeS50b1N0cmluZygpIH19IGNsYXNzTmFtZT17Y3NzQ2xhc3MoJ1NvcnRMaW5rJyl9PlxuICAgICAge3Byb3BlcnR5LmxhYmVsfVxuICAgICAge2lzQWN0aXZlID8gKDxJY29uIGljb249e3NvcnRlZEJ5SWNvbn0gY29sb3I9XCJwcmltYXJ5MTAwXCIgbWw9XCJkZWZhdWx0XCIgLz4pIDogJyd9XG4gICAgPC9OYXZMaW5rPlxuICApXG59XG5cbmNvbnN0IGNoZWNrU29ydFByb3BzID0gKFxuICBwcmV2UHJvcHM6IFJlYWRvbmx5PFNvcnRMaW5rUHJvcHM+LFxuICBuZXh0UHJvcHM6IFJlYWRvbmx5PFNvcnRMaW5rUHJvcHM+LFxuKSA9PiAocHJldlByb3BzLmRpcmVjdGlvbiA9PT0gbmV4dFByb3BzLmRpcmVjdGlvblxuICAmJiBwcmV2UHJvcHMucHJvcGVydHkucHJvcGVydHlQYXRoID09PSBuZXh0UHJvcHMucHJvcGVydHkucHJvcGVydHlQYXRoXG4gICYmIHByZXZQcm9wcy5zb3J0QnkgPT09IG5leHRQcm9wcy5zb3J0QnkpXG5cbmV4cG9ydCBkZWZhdWx0IG1lbW8oU29ydExpbmssIGNoZWNrU29ydFByb3BzKVxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgVGFibGVDZWxsIH0gZnJvbSAnQGFkbWluanMvZGVzaWduLXN5c3RlbSdcblxuaW1wb3J0IHsgQmFzZVByb3BlcnR5SlNPTiB9IGZyb20gJy4uLy4uLy4uL2ludGVyZmFjZXMnXG5pbXBvcnQgU29ydExpbmsgZnJvbSAnLi4vc29ydC1saW5rJ1xuaW1wb3J0IGFsbG93T3ZlcnJpZGUgZnJvbSAnLi4vLi4vLi4vaG9jL2FsbG93LW92ZXJyaWRlJ1xuXG5leHBvcnQgdHlwZSBQcm9wZXJ0eUhlYWRlclByb3BzID0ge1xuICBwcm9wZXJ0eTogQmFzZVByb3BlcnR5SlNPTjtcbiAgLyoqXG4gICAqIFByb3BlcnR5IHdoaWNoIHNob3VsZCBiZSB0cmVhdGVkIGFzIG1haW4gcHJvcGVydHkuXG4gICAqL1xuICB0aXRsZVByb3BlcnR5OiBCYXNlUHJvcGVydHlKU09OO1xuICAvKipcbiAgICogY3VycmVudGx5IHNlbGVjdGVkIGRpcmVjdGlvbi4gRWl0aGVyICdhc2MnIG9yICdkZXNjJy5cbiAgICovXG4gIGRpcmVjdGlvbj86ICdhc2MnIHwgJ2Rlc2MnO1xuICAvKipcbiAgICogY3VycmVudGx5IHNlbGVjdGVkIGZpZWxkIGJ5IHdoaWNoIGxpc3QgaXMgc29ydGVkLlxuICAgKi9cbiAgc29ydEJ5Pzogc3RyaW5nO1xuXG4gIGRpc3BsYXk/OiBzdHJpbmcgfCBBcnJheTxzdHJpbmc+O1xufVxuXG5jb25zdCBQcm9wZXJ0eUhlYWRlcjogUmVhY3QuRkM8UHJvcGVydHlIZWFkZXJQcm9wcz4gPSAocHJvcHMpID0+IHtcbiAgY29uc3QgeyBwcm9wZXJ0eSwgdGl0bGVQcm9wZXJ0eSwgZGlzcGxheSB9ID0gcHJvcHNcblxuICBjb25zdCBpc01haW4gPSBwcm9wZXJ0eS5wcm9wZXJ0eVBhdGggPT09IHRpdGxlUHJvcGVydHkucHJvcGVydHlQYXRoXG5cbiAgcmV0dXJuIChcbiAgICA8VGFibGVDZWxsXG4gICAgICBjbGFzc05hbWU9e2lzTWFpbiA/ICdtYWluJyA6IHVuZGVmaW5lZH1cbiAgICAgIGRpc3BsYXk9e2Rpc3BsYXl9XG4gICAgPlxuICAgICAge3Byb3BlcnR5LmlzU29ydGFibGUgPyA8U29ydExpbmsgey4uLnByb3BzfSAvPiA6IHByb3BlcnR5LmxhYmVsfVxuICAgIDwvVGFibGVDZWxsPlxuICApXG59XG5cbmNvbnN0IE92ZXJyaWRhYmxlUHJvcGVydHlIZWFkZXIgPSBhbGxvd092ZXJyaWRlKFByb3BlcnR5SGVhZGVyLCAnUHJvcGVydHlIZWFkZXInKVxuXG5leHBvcnQge1xuICBPdmVycmlkYWJsZVByb3BlcnR5SGVhZGVyIGFzIGRlZmF1bHQsXG4gIE92ZXJyaWRhYmxlUHJvcGVydHlIZWFkZXIgYXMgUHJvcGVydHlIZWFkZXIsXG59XG4iLCJpbXBvcnQgeyBDaGVja0JveCwgVGFibGVDZWxsLCBUYWJsZUhlYWQsIFRhYmxlUm93IH0gZnJvbSAnQGFkbWluanMvZGVzaWduLXN5c3RlbSdcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcblxuaW1wb3J0IGFsbG93T3ZlcnJpZGUgZnJvbSAnLi4vLi4vLi4vaG9jL2FsbG93LW92ZXJyaWRlJ1xuaW1wb3J0IHsgQmFzZVByb3BlcnR5SlNPTiB9IGZyb20gJy4uLy4uLy4uL2ludGVyZmFjZXMnXG5pbXBvcnQgeyBnZXRSZXNvdXJjZUVsZW1lbnRDc3MgfSBmcm9tICcuLi8uLi8uLi91dGlscydcbmltcG9ydCBQcm9wZXJ0eUhlYWRlciBmcm9tICcuL3Byb3BlcnR5LWhlYWRlcidcbmltcG9ydCB7IGRpc3BsYXkgfSBmcm9tICcuL3V0aWxzL2Rpc3BsYXknXG5cbi8qKlxuICogQG1lbWJlcm9mIFJlY29yZHNUYWJsZUhlYWRlclxuICogQGFsaWFzIFJlY29yZHNUYWJsZUhlYWRlclByb3BzXG4gKi9cbmV4cG9ydCB0eXBlIFJlY29yZHNUYWJsZUhlYWRlclByb3BzID0ge1xuICAvKipcbiAgICogUHJvcGVydHkgd2hpY2ggc2hvdWxkIGJlIHRyZWF0ZWQgYXMgYSBUaXRsZSBQcm9wZXJ0eVxuICAgKi9cbiAgdGl0bGVQcm9wZXJ0eTogQmFzZVByb3BlcnR5SlNPTjtcbiAgLyoqXG4gICAqIEFsbCBwcm9wZXJ0aWVzIHdoaWNoIHNob3VsZCBiZSBwcmVzZW50ZWRcbiAgICovXG4gIHByb3BlcnRpZXM6IEFycmF5PEJhc2VQcm9wZXJ0eUpTT04+O1xuICAvKipcbiAgICogTmFtZSBvZiB0aGUgcHJvcGVydHkgd2hpY2ggc2hvdWxkIGJlIG1hcmtlZCBhcyBjdXJyZW50bHkgc29ydGVkIGJ5XG4gICAqL1xuICBzb3J0Qnk/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBTb3J0IGRpcmVjdGlvblxuICAgKi9cbiAgZGlyZWN0aW9uPzogJ2FzYycgfCAnZGVzYyc7XG4gIC8qKlxuICAgKiBIYW5kbGVyIGZ1bmN0aW9uIGludm9rZWQgd2hlbiBjaGVja2JveCBpcyBjbGlja2VkLiBJZiBnaXZlbiBleHRyYSBjb2x1bW5cbiAgICogd2l0aCBjaGVja2JveCB3aWxsIGJlIHJlbmRlcmVkXG4gICAqL1xuICBvblNlbGVjdEFsbD86ICgpID0+IGFueTtcbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiBcImJ1bGtcIiBjaGVja2JveCBzaG91bGQgYmUgY2hlY2tlZFxuICAgKi9cbiAgc2VsZWN0ZWRBbGw/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFByaW50cyBgdGhlYWRgIHNlY3Rpb24gZm9yIHRhYmxlIHdpdGggcmVjb3Jkcy5cbiAqXG4gKiBgYGBcbiAqIGltcG9ydCB7IFJlY29yZHNUYWJsZUhlYWRlciB9IGZyb20gJ2FkbWluanMnXG4gKiBgYGBcbiAqXG4gKiBAY29tcG9uZW50XG4gKiBAc3ViY2F0ZWdvcnkgQXBwbGljYXRpb25cbiAqIEBleGFtcGxlIDxjYXB0aW9uPkxpc3Qgd2l0aCAyIHByb3BlcnRpZXM8L2NhcHRpb24+XG4gKiBjb25zdCBwcm9wZXJ0aWVzID0gW3tcbiAqICAgbGFiZWw6ICdGaXJzdCBOYW1lJyxcbiAqICAgbmFtZTogJ2ZpcnN0TmFtZScsXG4gKiAgIGlzU29ydGFibGU6IHRydWUsXG4gKiB9LCB7XG4gKiAgIGxhYmVsOiAnTGFzdCBOYW1lJyxcbiAqICAgbmFtZTogJ2xhc3ROYW1lJyxcbiAqIH1dXG4gKiByZXR1cm4gKFxuICogPEJveCBweT1cInhsXCI+XG4gKiAgIDxUYWJsZT5cbiAqICAgIDxSZWNvcmRzVGFibGVIZWFkZXJcbiAqICAgICAgcHJvcGVydGllcz17cHJvcGVydGllc31cbiAqICAgICAgdGl0bGVQcm9wZXJ0eT17cHJvcGVydGllc1swXX1cbiAqICAgICAgc29ydEJ5PXsnZmlyc3ROYW1lJ31cbiAqICAgICAgZGlyZWN0aW9uPXsnYXNjJ31cbiAqICAgIC8+XG4gKiAgICA8VGFibGVCb2R5PlxuICogICAgICA8VGFibGVSb3c+XG4gKiAgICAgICAgPFRhYmxlQ2VsbD5Kb2huPC9UYWJsZUNlbGw+XG4gKiAgICAgICAgPFRhYmxlQ2VsbD5Eb2U8L1RhYmxlQ2VsbD5cbiAqICAgICAgICA8VGFibGVDZWxsPjwvVGFibGVDZWxsPlxuICogICAgICA8L1RhYmxlUm93PlxuICogICAgICA8VGFibGVSb3c+XG4gKiAgICAgICAgPFRhYmxlQ2VsbD5NYXg8L1RhYmxlQ2VsbD5cbiAqICAgICAgICA8VGFibGVDZWxsPktvZGFseTwvVGFibGVDZWxsPlxuICogICAgICAgIDxUYWJsZUNlbGw+PC9UYWJsZUNlbGw+XG4gKiAgICAgIDwvVGFibGVSb3c+XG4gKiAgICA8L1RhYmxlQm9keT5cbiAqICAgPC9UYWJsZT5cbiAqIDwvQm94PlxuICogKVxuICovXG5jb25zdCBSZWNvcmRzVGFibGVIZWFkZXI6IFJlYWN0LkZDPFJlY29yZHNUYWJsZUhlYWRlclByb3BzPiA9IChwcm9wcykgPT4ge1xuICBjb25zdCB7XG4gICAgdGl0bGVQcm9wZXJ0eSwgcHJvcGVydGllcyxcbiAgICBzb3J0QnksIGRpcmVjdGlvbixcbiAgICBvblNlbGVjdEFsbCwgc2VsZWN0ZWRBbGwgfSA9IHByb3BzXG5cbiAgY29uc3QgY29udGVudFRhZyA9IGdldFJlc291cmNlRWxlbWVudENzcyh0aXRsZVByb3BlcnR5LnJlc291cmNlSWQsICd0YWJsZS1oZWFkJylcblxuICBjb25zdCByb3dUYWcgPSBgJHt0aXRsZVByb3BlcnR5LnJlc291cmNlSWR9LXRhYmxlLWhlYWQtcm93YFxuICBjb25zdCBjaGVja2JveENzcyA9IGAke3RpdGxlUHJvcGVydHkucmVzb3VyY2VJZH0tY2hlY2tib3gtdGFibGUtY2VsbGBcbiAgcmV0dXJuIChcbiAgICA8VGFibGVIZWFkIGRhdGEtY3NzPXtjb250ZW50VGFnfT5cbiAgICAgIDxUYWJsZVJvdyBkYXRhLWNzcz17cm93VGFnfT5cbiAgICAgICAgPFRhYmxlQ2VsbCBkYXRhLWNzcz17Y2hlY2tib3hDc3N9PlxuICAgICAgICAgIHtvblNlbGVjdEFsbCA/IChcbiAgICAgICAgICAgIDxDaGVja0JveFxuICAgICAgICAgICAgICBzdHlsZT17eyBtYXJnaW5MZWZ0OiA1IH19XG4gICAgICAgICAgICAgIG9uQ2hhbmdlPXsoKSA9PiBvblNlbGVjdEFsbCgpfVxuICAgICAgICAgICAgICBjaGVja2VkPXtzZWxlY3RlZEFsbH1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgKSA6IG51bGx9XG4gICAgICAgIDwvVGFibGVDZWxsPlxuICAgICAgICB7cHJvcGVydGllcy5tYXAoKHByb3BlcnR5KSA9PiAoXG4gICAgICAgICAgPFByb3BlcnR5SGVhZGVyXG4gICAgICAgICAgICBkaXNwbGF5PXtkaXNwbGF5KHByb3BlcnR5LmlzVGl0bGUpfVxuICAgICAgICAgICAga2V5PXtwcm9wZXJ0eS5wcm9wZXJ0eVBhdGh9XG4gICAgICAgICAgICB0aXRsZVByb3BlcnR5PXt0aXRsZVByb3BlcnR5fVxuICAgICAgICAgICAgcHJvcGVydHk9e3Byb3BlcnR5fVxuICAgICAgICAgICAgc29ydEJ5PXtzb3J0Qnl9XG4gICAgICAgICAgICBkaXJlY3Rpb249e2RpcmVjdGlvbn1cbiAgICAgICAgICAvPlxuICAgICAgICApKX1cbiAgICAgICAgPFRhYmxlQ2VsbCBrZXk9XCJhY3Rpb25zXCIgc3R5bGU9e3sgd2lkdGg6IDgwIH19IC8+XG4gICAgICA8L1RhYmxlUm93PlxuICAgIDwvVGFibGVIZWFkPlxuICApXG59XG5cbmNvbnN0IE92ZXJyaWRhYmxlUmVjb3Jkc1RhYmxlSGVhZGVyID0gYWxsb3dPdmVycmlkZShSZWNvcmRzVGFibGVIZWFkZXIsICdSZWNvcmRzVGFibGVIZWFkZXInKVxuXG5leHBvcnQge1xuICBPdmVycmlkYWJsZVJlY29yZHNUYWJsZUhlYWRlciBhcyBkZWZhdWx0LFxuICBPdmVycmlkYWJsZVJlY29yZHNUYWJsZUhlYWRlciBhcyBSZWNvcmRzVGFibGVIZWFkZXIsXG59XG4iLCJpbXBvcnQgeyBBY3Rpb25KU09OLCBSZWNvcmRKU09OIH0gZnJvbSAnLi4vLi4vLi4vLi4vaW50ZXJmYWNlcydcblxuY29uc3QgZ2V0QnVsa0FjdGlvbnNGcm9tUmVjb3JkcyA9IChyZWNvcmRzOiBBcnJheTxSZWNvcmRKU09OPik6IEFycmF5PEFjdGlvbkpTT04+ID0+IHtcbiAgY29uc3QgYWN0aW9ucyA9IE9iamVjdC52YWx1ZXMocmVjb3Jkcy5yZWR1Y2UoKG1lbW8sIHJlY29yZCkgPT4gKHtcbiAgICAuLi5tZW1vLFxuICAgIC4uLnJlY29yZC5idWxrQWN0aW9ucy5yZWR1Y2UoKGFjdGlvbnNNZW1vLCBhY3Rpb24pID0+ICh7XG4gICAgICAuLi5hY3Rpb25zTWVtbyxcbiAgICAgIFthY3Rpb24ubmFtZV06IGFjdGlvbixcbiAgICB9KSwge30gYXMgUmVjb3JkPHN0cmluZywgQWN0aW9uSlNPTj4pLFxuICB9KSwge30gYXMgUmVjb3JkPHN0cmluZywgQWN0aW9uSlNPTj4pKVxuICByZXR1cm4gYWN0aW9uc1xufVxuXG5leHBvcnQgZGVmYXVsdCBnZXRCdWxrQWN0aW9uc0Zyb21SZWNvcmRzXG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBUYWJsZUNhcHRpb24sIFRpdGxlLCBCdXR0b25Hcm91cCwgQm94IH0gZnJvbSAnQGFkbWluanMvZGVzaWduLXN5c3RlbSdcblxuaW1wb3J0IHsgdXNlTmF2aWdhdGUgfSBmcm9tICdyZWFjdC1yb3V0ZXInXG5pbXBvcnQgeyBBY3Rpb25KU09OLCBidWlsZEFjdGlvbkNsaWNrSGFuZGxlciwgUmVjb3JkSlNPTiwgUmVzb3VyY2VKU09OIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJmYWNlcydcbmltcG9ydCBnZXRCdWxrQWN0aW9uc0Zyb21SZWNvcmRzIGZyb20gJy4vdXRpbHMvZ2V0LWJ1bGstYWN0aW9ucy1mcm9tLXJlY29yZHMnXG5pbXBvcnQgeyB1c2VBY3Rpb25SZXNwb25zZUhhbmRsZXIsIHVzZVRyYW5zbGF0aW9uIH0gZnJvbSAnLi4vLi4vLi4vaG9va3MnXG5pbXBvcnQgeyBhY3Rpb25zVG9CdXR0b25Hcm91cCB9IGZyb20gJy4uL2FjdGlvbi1oZWFkZXIvYWN0aW9ucy10by1idXR0b24tZ3JvdXAnXG5pbXBvcnQgYWxsb3dPdmVycmlkZSBmcm9tICcuLi8uLi8uLi9ob2MvYWxsb3ctb3ZlcnJpZGUnXG5pbXBvcnQgeyBnZXRSZXNvdXJjZUVsZW1lbnRDc3MgfSBmcm9tICcuLi8uLi8uLi91dGlscydcblxudHlwZSBTZWxlY3RlZFJlY29yZHNQcm9wcyA9IHtcbiAgcmVzb3VyY2U6IFJlc291cmNlSlNPTjtcbiAgc2VsZWN0ZWRSZWNvcmRzPzogQXJyYXk8UmVjb3JkSlNPTj47XG59XG5cbmNvbnN0IFNlbGVjdGVkUmVjb3JkczogUmVhY3QuRkM8U2VsZWN0ZWRSZWNvcmRzUHJvcHM+ID0gKHByb3BzKSA9PiB7XG4gIGNvbnN0IHsgcmVzb3VyY2UsIHNlbGVjdGVkUmVjb3JkcyB9ID0gcHJvcHNcbiAgY29uc3QgeyB0cmFuc2xhdGVMYWJlbCB9ID0gdXNlVHJhbnNsYXRpb24oKVxuICBjb25zdCBuYXZpZ2F0ZSA9IHVzZU5hdmlnYXRlKClcbiAgY29uc3QgYWN0aW9uUmVzcG9uc2VIYW5kbGVyID0gdXNlQWN0aW9uUmVzcG9uc2VIYW5kbGVyKClcblxuICBpZiAoIXNlbGVjdGVkUmVjb3JkcyB8fCAhc2VsZWN0ZWRSZWNvcmRzLmxlbmd0aCkge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBjb25zdCBwYXJhbXMgPSB7XG4gICAgcmVzb3VyY2VJZDogcmVzb3VyY2UuaWQsXG4gICAgcmVjb3JkSWRzOiBzZWxlY3RlZFJlY29yZHMubWFwKChyZWNvcmRzKSA9PiByZWNvcmRzLmlkKSxcbiAgfVxuXG4gIGNvbnN0IGhhbmRsZUFjdGlvbkNsaWNrID0gKGV2ZW50LCBzb3VyY2VBY3Rpb246IEFjdGlvbkpTT04pOiB2b2lkID0+IChcbiAgICBidWlsZEFjdGlvbkNsaWNrSGFuZGxlcih7XG4gICAgICBhY3Rpb246IHNvdXJjZUFjdGlvbixcbiAgICAgIHBhcmFtcyxcbiAgICAgIGFjdGlvblJlc3BvbnNlSGFuZGxlcixcbiAgICAgIG5hdmlnYXRlLFxuICAgIH0pKGV2ZW50KVxuICApXG5cbiAgY29uc3QgYnVsa0J1dHRvbnMgPSBhY3Rpb25zVG9CdXR0b25Hcm91cCh7XG4gICAgYWN0aW9uczogZ2V0QnVsa0FjdGlvbnNGcm9tUmVjb3JkcyhzZWxlY3RlZFJlY29yZHMpLFxuICAgIHBhcmFtcyxcbiAgICBoYW5kbGVDbGljazogaGFuZGxlQWN0aW9uQ2xpY2ssXG4gIH0pXG4gIGNvbnN0IGNvbnRlbnRUYWcgPSBnZXRSZXNvdXJjZUVsZW1lbnRDc3MocmVzb3VyY2UuaWQsICd0YWJsZS1jYXB0aW9uJylcbiAgcmV0dXJuIChcbiAgICA8VGFibGVDYXB0aW9uIGRhdGEtY3NzPXtjb250ZW50VGFnfT5cbiAgICAgIDxCb3ggZmxleCBweT1cInNtXCIgYWxpZ25JdGVtcz1cImNlbnRlclwiPlxuICAgICAgICA8VGl0bGUgbXI9XCJsZ1wiPlxuICAgICAgICAgIHt0cmFuc2xhdGVMYWJlbCgnc2VsZWN0ZWRSZWNvcmRzJywgcmVzb3VyY2UuaWQsIHsgc2VsZWN0ZWQ6IHNlbGVjdGVkUmVjb3Jkcy5sZW5ndGggfSl9XG4gICAgICAgIDwvVGl0bGU+XG4gICAgICAgIDxCdXR0b25Hcm91cCBzaXplPVwic21cIiByb3VuZGVkIGJ1dHRvbnM9e2J1bGtCdXR0b25zfSAvPlxuICAgICAgPC9Cb3g+XG4gICAgPC9UYWJsZUNhcHRpb24+XG4gIClcbn1cblxuY29uc3QgT3ZlcnJpZGFibGVTZWxlY3RlZFJlY29yZHMgPSBhbGxvd092ZXJyaWRlKFNlbGVjdGVkUmVjb3JkcywgJ1NlbGVjdGVkUmVjb3JkcycpXG5cbmV4cG9ydCB7XG4gIE92ZXJyaWRhYmxlU2VsZWN0ZWRSZWNvcmRzIGFzIGRlZmF1bHQsXG4gIE92ZXJyaWRhYmxlU2VsZWN0ZWRSZWNvcmRzIGFzIFNlbGVjdGVkUmVjb3Jkcyxcbn1cbiIsImltcG9ydCB7IExvYWRlciwgVGFibGUsIFRhYmxlQm9keSB9IGZyb20gJ0BhZG1pbmpzL2Rlc2lnbi1zeXN0ZW0nXG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnXG5cbmltcG9ydCB7IEFjdGlvblJlc3BvbnNlIH0gZnJvbSAnLi4vLi4vLi4vLi4vYmFja2VuZC9hY3Rpb25zL2FjdGlvbi5pbnRlcmZhY2UnXG5pbXBvcnQgYWxsb3dPdmVycmlkZSBmcm9tICcuLi8uLi8uLi9ob2MvYWxsb3ctb3ZlcnJpZGUnXG5pbXBvcnQgeyBSZWNvcmRKU09OLCBSZXNvdXJjZUpTT04gfSBmcm9tICcuLi8uLi8uLi9pbnRlcmZhY2VzJ1xuaW1wb3J0IHsgZ2V0UmVzb3VyY2VFbGVtZW50Q3NzIH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMnXG5pbXBvcnQgTm9SZWNvcmRzIGZyb20gJy4vbm8tcmVjb3JkcydcbmltcG9ydCBSZWNvcmRJbkxpc3QgZnJvbSAnLi9yZWNvcmQtaW4tbGlzdCdcbmltcG9ydCBSZWNvcmRzVGFibGVIZWFkZXIgZnJvbSAnLi9yZWNvcmRzLXRhYmxlLWhlYWRlcidcbmltcG9ydCBTZWxlY3RlZFJlY29yZHMgZnJvbSAnLi9zZWxlY3RlZC1yZWNvcmRzJ1xuXG4vKipcbiAqIEBhbGlhcyBSZWNvcmRzVGFibGVQcm9wc1xuICogQG1lbWJlcm9mIFJlY29yZHNUYWJsZVxuICovXG5leHBvcnQgdHlwZSBSZWNvcmRzVGFibGVQcm9wcyA9IHtcbiAgLyoqXG4gICAqIFJlc291cmNlIHdoaWNoIHR5cGUgcmVjb3JkcyBhcmUgcmVuZGVyZWQuIEJhc2Ugb24gdGhhdCB3ZSBkZWZpbmUgd2hpY2ggY29sdW1ucyBzaG91bGQgYmUgc2Vlbi5cbiAgICovXG4gIHJlc291cmNlOiBSZXNvdXJjZUpTT047XG4gIC8qKlxuICAgKiBBcnJheSBvZiByZWNvcmRzIHNlZW4gaW4gdGhlIHRhYmxlXG4gICAqL1xuICByZWNvcmRzOiBBcnJheTxSZWNvcmRKU09OPjtcbiAgLyoqXG4gICAqIEhhbmRsZXIgZnVuY3Rpb24gaW52b2tlZCB3aGVuIHNvbWVvbmUgcGVyZm9ybXMgYWN0aW9uIHdpdGhvdXQgY29tcG9uZW50IG9uIGEgZ2l2ZW4gcmVjb3JkLlxuICAgKiBBY3Rpb24gd2l0aG91dCBjb21wb25lbnQgaXMgYSBgZGVsZXRlYCBhY3Rpb24gLSB5b3UgbWlnaHQgd2FudCB0byByZWZyZXNoIHRoZSBsaXN0IGFmdGVyIHRoYXRcbiAgICovXG4gIGFjdGlvblBlcmZvcm1lZD86IChyZXNwb25zZTogQWN0aW9uUmVzcG9uc2UpID0+IGFueTtcbiAgLyoqIGRlZmF1bHQgc29ydCBieSBjb2x1bW4gKi9cbiAgc29ydEJ5Pzogc3RyaW5nO1xuICAvKiogc29ydCBkaXJlY3Rpb24gKi9cbiAgZGlyZWN0aW9uPzogJ2FzYycgfCAnZGVzYyc7XG4gIC8qKiBpbmRpY2F0ZXMgaWYgdGhlIHRhYmxlIHNob3VsZCBiZSBpbiBsb2FkaW5nIHN0YXRlICovXG4gIGlzTG9hZGluZz86IGJvb2xlYW47XG4gIC8qKiBsaXN0IG9mIHNlbGVjdGVkIHJlY29yZHMgKi9cbiAgc2VsZWN0ZWRSZWNvcmRzPzogQXJyYXk8UmVjb3JkSlNPTj47XG4gIC8qKiBoYW5kbGVyIGZ1bmN0aW9uIHRyaWdnZXJlZCB3aGVuIHJlY29yZCBpcyBzZWxlY3RlZCAqL1xuICBvblNlbGVjdD86IChyZWNvcmQ6IFJlY29yZEpTT04pID0+IGFueTtcbiAgLyoqIGhhbmRsZXIgZnVuY3Rpb24gdHJpZ2dlcmVkIHdoZW4gYWxsIGl0ZW1zIGFyZSBzZWxlY3RlZCAqL1xuICBvblNlbGVjdEFsbD86ICgpID0+IGFueTtcbn1cblxuLyoqXG4gKiBAY2xhc3NkZXNjXG4gKiBSZW5kZXJzIGFuIGVudGlyZSByZWNvcmRzIHRhYmxlLiBUbyBmaWxsIHRoZSBkYXRhIHlvdSBtaWdodCBuZWVkOlxuICpcbiAqIC0ge0BsaW5rIHVzZVJlY29yZHN9IGFuZFxuICogLSB7QGxpbmsgdXNlU2VsZWN0ZWRSZWNvcmRzfSBob29rc1xuICpcbiAqIHNvIG1ha2Ugc3VyZSB0byBzZWUgYXQgdGhlIGRvY3VtZW50YXRpb24gcGFnZXMgZm9yIGJvdGggb2YgdGhlbVxuICpcbiAqIEBjb21wb25lbnRcbiAqIEBjbGFzc1xuICogQGhpZGVjb25zdHJ1Y3RvclxuICogQHN1YmNhdGVnb3J5IEFwcGxpY2F0aW9uXG4gKi9cbmNvbnN0IFJlY29yZHNUYWJsZTogUmVhY3QuRkM8UmVjb3Jkc1RhYmxlUHJvcHM+ID0gKHByb3BzKSA9PiB7XG4gIGNvbnN0IHtcbiAgICByZXNvdXJjZSwgcmVjb3JkcyxcbiAgICBhY3Rpb25QZXJmb3JtZWQsIHNvcnRCeSxcbiAgICBkaXJlY3Rpb24sIGlzTG9hZGluZyxcbiAgICBvblNlbGVjdCwgc2VsZWN0ZWRSZWNvcmRzLFxuICAgIG9uU2VsZWN0QWxsLFxuICB9ID0gcHJvcHNcbiAgaWYgKCFyZWNvcmRzLmxlbmd0aCkge1xuICAgIGlmIChpc0xvYWRpbmcpIHtcbiAgICAgIHJldHVybiAoPExvYWRlciAvPilcbiAgICB9XG4gICAgcmV0dXJuICg8Tm9SZWNvcmRzIHJlc291cmNlPXtyZXNvdXJjZX0gLz4pXG4gIH1cblxuICBjb25zdCBzZWxlY3RlZEFsbCA9IHNlbGVjdGVkUmVjb3JkcyAmJiAhIXJlY29yZHMuZmluZCgocmVjb3JkKSA9PiAoXG4gICAgc2VsZWN0ZWRSZWNvcmRzLmZpbmQoKHNlbGVjdGVkKSA9PiBzZWxlY3RlZC5pZCA9PT0gcmVjb3JkLmlkKVxuICApKVxuXG4gIGNvbnN0IHJlY29yZHNIYXZlQnVsa0FjdGlvbiA9ICEhcmVjb3Jkcy5maW5kKChyZWNvcmQpID0+IHJlY29yZC5idWxrQWN0aW9ucy5sZW5ndGgpXG5cbiAgY29uc3QgY29udGVudFRhZyA9IGdldFJlc291cmNlRWxlbWVudENzcyhyZXNvdXJjZS5pZCwgJ3RhYmxlJylcbiAgY29uc3Qgc2VsZWN0ZWRUYWcgPSBnZXRSZXNvdXJjZUVsZW1lbnRDc3MocmVzb3VyY2UuaWQsICd0YWJsZS1zZWxlY3RlZC1yZWNvcmRzJylcbiAgY29uc3QgYm9keVRhZyA9IGdldFJlc291cmNlRWxlbWVudENzcyhyZXNvdXJjZS5pZCwgJ3RhYmxlLWJvZHknKVxuXG4gIHJldHVybiAoXG4gICAgPFRhYmxlIGRhdGEtY3NzPXtjb250ZW50VGFnfT5cbiAgICAgIDxTZWxlY3RlZFJlY29yZHNcbiAgICAgICAgcmVzb3VyY2U9e3Jlc291cmNlfVxuICAgICAgICBzZWxlY3RlZFJlY29yZHM9e3NlbGVjdGVkUmVjb3Jkc31cbiAgICAgICAgZGF0YS1jc3M9e3NlbGVjdGVkVGFnfVxuICAgICAgLz5cbiAgICAgIDxSZWNvcmRzVGFibGVIZWFkZXJcbiAgICAgICAgcHJvcGVydGllcz17cmVzb3VyY2UubGlzdFByb3BlcnRpZXN9XG4gICAgICAgIHRpdGxlUHJvcGVydHk9e3Jlc291cmNlLnRpdGxlUHJvcGVydHl9XG4gICAgICAgIGRpcmVjdGlvbj17ZGlyZWN0aW9ufVxuICAgICAgICBzb3J0Qnk9e3NvcnRCeX1cbiAgICAgICAgb25TZWxlY3RBbGw9e3JlY29yZHNIYXZlQnVsa0FjdGlvbiA/IG9uU2VsZWN0QWxsIDogdW5kZWZpbmVkfVxuICAgICAgICBzZWxlY3RlZEFsbD17c2VsZWN0ZWRBbGx9XG4gICAgICAvPlxuICAgICAgPFRhYmxlQm9keSBkYXRhLWNzcz17Ym9keVRhZ30+XG4gICAgICAgIHtyZWNvcmRzLm1hcCgocmVjb3JkKSA9PiAoXG4gICAgICAgICAgPFJlY29yZEluTGlzdFxuICAgICAgICAgICAgcmVjb3JkPXtyZWNvcmR9XG4gICAgICAgICAgICByZXNvdXJjZT17cmVzb3VyY2V9XG4gICAgICAgICAgICBrZXk9e3JlY29yZC5pZH1cbiAgICAgICAgICAgIGFjdGlvblBlcmZvcm1lZD17YWN0aW9uUGVyZm9ybWVkfVxuICAgICAgICAgICAgaXNMb2FkaW5nPXtpc0xvYWRpbmd9XG4gICAgICAgICAgICBvblNlbGVjdD17b25TZWxlY3R9XG4gICAgICAgICAgICBpc1NlbGVjdGVkPXtcbiAgICAgICAgICAgICAgc2VsZWN0ZWRSZWNvcmRzICYmICEhc2VsZWN0ZWRSZWNvcmRzLmZpbmQoKHNlbGVjdGVkKSA9PiBzZWxlY3RlZC5pZCA9PT0gcmVjb3JkLmlkKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIC8+XG4gICAgICAgICkpfVxuICAgICAgPC9UYWJsZUJvZHk+XG4gICAgPC9UYWJsZT5cbiAgKVxufVxuXG5jb25zdCBPdmVycmlkYWJsZVJlY29yZHNUYWJsZSA9IGFsbG93T3ZlcnJpZGUoUmVjb3Jkc1RhYmxlLCAnUmVjb3Jkc1RhYmxlJylcblxuZXhwb3J0IHtcbiAgT3ZlcnJpZGFibGVSZWNvcmRzVGFibGUgYXMgZGVmYXVsdCxcbiAgT3ZlcnJpZGFibGVSZWNvcmRzVGFibGUgYXMgUmVjb3Jkc1RhYmxlLFxufVxuIiwiaW1wb3J0IHsgQm94LCBQYWdpbmF0aW9uLCBUZXh0IH0gZnJvbSAnQGFkbWluanMvZGVzaWduLXN5c3RlbSdcbmltcG9ydCBSZWFjdCwgeyB1c2VFZmZlY3QgfSBmcm9tICdyZWFjdCdcbmltcG9ydCB7IHVzZUxvY2F0aW9uLCB1c2VOYXZpZ2F0ZSB9IGZyb20gJ3JlYWN0LXJvdXRlcidcblxuaW1wb3J0IGFsbG93T3ZlcnJpZGUgZnJvbSAnLi4vLi4vaG9jL2FsbG93LW92ZXJyaWRlJ1xuaW1wb3J0IHVzZVJlY29yZHMgZnJvbSAnLi4vLi4vaG9va3MvdXNlLXJlY29yZHMvdXNlLXJlY29yZHMnXG5pbXBvcnQgdXNlU2VsZWN0ZWRSZWNvcmRzIGZyb20gJy4uLy4uL2hvb2tzL3VzZS1zZWxlY3RlZC1yZWNvcmRzL3VzZS1zZWxlY3RlZC1yZWNvcmRzJ1xuaW1wb3J0IHsgZ2V0QWN0aW9uRWxlbWVudENzcyB9IGZyb20gJy4uLy4uL3V0aWxzJ1xuaW1wb3J0IFJlY29yZHNUYWJsZSBmcm9tICcuLi9hcHAvcmVjb3Jkcy10YWJsZS9yZWNvcmRzLXRhYmxlJ1xuaW1wb3J0IHsgQWN0aW9uUHJvcHMgfSBmcm9tICcuL2FjdGlvbi5wcm9wcydcbmltcG9ydCB7IFJFRlJFU0hfS0VZIH0gZnJvbSAnLi91dGlscy9hcHBlbmQtZm9yY2UtcmVmcmVzaCdcblxuY29uc3QgTGlzdDogUmVhY3QuRkM8QWN0aW9uUHJvcHM+ID0gKHsgcmVzb3VyY2UsIHNldFRhZyB9KSA9PiB7XG4gIGNvbnN0IHtcbiAgICByZWNvcmRzLFxuICAgIGxvYWRpbmcsXG4gICAgZGlyZWN0aW9uLFxuICAgIHNvcnRCeSxcbiAgICBwYWdlLFxuICAgIHRvdGFsLFxuICAgIGZldGNoRGF0YSxcbiAgICBwZXJQYWdlLFxuICB9ID0gdXNlUmVjb3JkcyhyZXNvdXJjZS5pZClcbiAgY29uc3Qge1xuICAgIHNlbGVjdGVkUmVjb3JkcyxcbiAgICBoYW5kbGVTZWxlY3QsXG4gICAgaGFuZGxlU2VsZWN0QWxsLFxuICAgIHNldFNlbGVjdGVkUmVjb3JkcyxcbiAgfSA9IHVzZVNlbGVjdGVkUmVjb3JkcyhyZWNvcmRzKVxuICBjb25zdCBsb2NhdGlvbiA9IHVzZUxvY2F0aW9uKClcbiAgY29uc3QgbmF2aWdhdGUgPSB1c2VOYXZpZ2F0ZSgpXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoc2V0VGFnKSB7XG4gICAgICBzZXRUYWcodG90YWwudG9TdHJpbmcoKSlcbiAgICB9XG4gIH0sIFt0b3RhbF0pXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBzZXRTZWxlY3RlZFJlY29yZHMoW10pXG4gIH0sIFtyZXNvdXJjZS5pZF0pXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBzZWFyY2ggPSBuZXcgVVJMU2VhcmNoUGFyYW1zKGxvY2F0aW9uLnNlYXJjaClcbiAgICBpZiAoc2VhcmNoLmdldChSRUZSRVNIX0tFWSkpIHtcbiAgICAgIHNldFNlbGVjdGVkUmVjb3JkcyhbXSlcbiAgICB9XG4gIH0sIFtsb2NhdGlvbi5zZWFyY2hdKVxuXG4gIGNvbnN0IGhhbmRsZUFjdGlvblBlcmZvcm1lZCA9ICgpOiBhbnkgPT4gZmV0Y2hEYXRhKClcblxuICBjb25zdCBoYW5kbGVQYWdpbmF0aW9uQ2hhbmdlID0gKHBhZ2VOdW1iZXI6IG51bWJlcik6IHZvaWQgPT4ge1xuICAgIGNvbnN0IHNlYXJjaCA9IG5ldyBVUkxTZWFyY2hQYXJhbXMobG9jYXRpb24uc2VhcmNoKVxuICAgIHNlYXJjaC5zZXQoJ3BhZ2UnLCBwYWdlTnVtYmVyLnRvU3RyaW5nKCkpXG4gICAgbmF2aWdhdGUoeyBzZWFyY2g6IHNlYXJjaC50b1N0cmluZygpIH0pXG4gIH1cblxuICBjb25zdCBjb250ZW50VGFnID0gZ2V0QWN0aW9uRWxlbWVudENzcyhyZXNvdXJjZS5pZCwgJ2xpc3QnLCAndGFibGUtd3JhcHBlcicpXG5cbiAgcmV0dXJuIChcbiAgICA8Qm94IHZhcmlhbnQ9XCJ3aGl0ZVwiIGRhdGEtY3NzPXtjb250ZW50VGFnfT5cbiAgICAgIDxSZWNvcmRzVGFibGVcbiAgICAgICAgcmVzb3VyY2U9e3Jlc291cmNlfVxuICAgICAgICByZWNvcmRzPXtyZWNvcmRzfVxuICAgICAgICBhY3Rpb25QZXJmb3JtZWQ9e2hhbmRsZUFjdGlvblBlcmZvcm1lZH1cbiAgICAgICAgb25TZWxlY3Q9e2hhbmRsZVNlbGVjdH1cbiAgICAgICAgb25TZWxlY3RBbGw9e2hhbmRsZVNlbGVjdEFsbH1cbiAgICAgICAgc2VsZWN0ZWRSZWNvcmRzPXtzZWxlY3RlZFJlY29yZHN9XG4gICAgICAgIGRpcmVjdGlvbj17ZGlyZWN0aW9ufVxuICAgICAgICBzb3J0Qnk9e3NvcnRCeX1cbiAgICAgICAgaXNMb2FkaW5nPXtsb2FkaW5nfVxuICAgICAgLz5cbiAgICAgIDxUZXh0IG10PVwieGxcIiB0ZXh0QWxpZ249XCJjZW50ZXJcIj5cbiAgICAgICAgPFBhZ2luYXRpb25cbiAgICAgICAgICBwYWdlPXtwYWdlfVxuICAgICAgICAgIHBlclBhZ2U9e3BlclBhZ2V9XG4gICAgICAgICAgdG90YWw9e3RvdGFsfVxuICAgICAgICAgIG9uQ2hhbmdlPXtoYW5kbGVQYWdpbmF0aW9uQ2hhbmdlfVxuICAgICAgICAvPlxuICAgICAgPC9UZXh0PlxuICAgIDwvQm94PlxuICApXG59XG5cbmNvbnN0IE92ZXJyaWRhYmxlTGlzdCA9IGFsbG93T3ZlcnJpZGUoTGlzdCwgJ0RlZmF1bHRMaXN0QWN0aW9uJylcblxuZXhwb3J0IHtcbiAgT3ZlcnJpZGFibGVMaXN0IGFzIGRlZmF1bHQsXG4gIE92ZXJyaWRhYmxlTGlzdCBhcyBMaXN0LFxufVxuIiwiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L2V4cGxpY2l0LWZ1bmN0aW9uLXJldHVybi10eXBlICovXG5pbXBvcnQgeyBjb25uZWN0IH0gZnJvbSAncmVhY3QtcmVkdXgnXG5pbXBvcnQgeyBhZGROb3RpY2UgfSBmcm9tICcuLi9zdG9yZS9hY3Rpb25zL2FkZC1ub3RpY2UnXG5cbi8qKlxuICogTm90aWNlTWVzc2FnZSB3aGljaCBjYW4gYmUgcHJlc2VudGVkIGFzIGEgXCJUb2FzdFwiIG1lc3NhZ2UuXG4gKiBAYWxpYXMgTm90aWNlTWVzc2FnZVxuICogQG1lbWJlcm9mIHdpdGhOb3RpY2VcbiAqL1xuZXhwb3J0IHR5cGUgTm90aWNlTWVzc2FnZSA9IHtcbiAgbWVzc2FnZTogc3RyaW5nO1xuICB0eXBlPzogJ3N1Y2Nlc3MnIHwgJ2Vycm9yJztcbn1cblxuLyoqXG4gKiBBZGRpdGlvbmFsIHByb3BzIHdoaWNoIGFyZSBwYXNzZWQgdG8geW91ciBjb21wb25lbnRcbiAqIEBhbGlhcyBBZGROb3RpY2VQcm9wc1xuICogQG1lbWJlcm9mIHdpdGhOb3RpY2VcbiAqL1xuZXhwb3J0IHR5cGUgQWRkTm90aWNlUHJvcHMgPSB7XG4gIC8vIEZ1bmN0aW9uIHRyaWdnZXJpbmcgbm90aWNlIG1lc3NhZ2VzXG4gIGFkZE5vdGljZTogKG5vdGljZTogTm90aWNlTWVzc2FnZSkgPT4gdm9pZDtcbn1cblxuY29uc3QgbWFwRGlzcGF0Y2hUb1Byb3BzID0gKGRpc3BhdGNoKTogQWRkTm90aWNlUHJvcHMgPT4gKHtcbiAgYWRkTm90aWNlOiAobm90aWNlOiBOb3RpY2VNZXNzYWdlKTogdm9pZCA9PiBkaXNwYXRjaChhZGROb3RpY2Uobm90aWNlKSksXG59KVxuXG4vKipcbiAqIEhpZ2hlciBPcmRlciBDb21wb25lbnQgd2hpY2ggYWxsb3dzIHlvdSB0byBwb3N0IG5vdGljZSBtZXNzYWdlcyBmcm9tIHlvdXIgY29tcG9uZW50c1xuICpcbiAqIEl0IGdpdmVzIHlvdSB0aGUgYWRkaXRpb25hbCBwcm9wOiBgYWRkTm90aWNlKG5vdGljZU1lc3NhZ2UpYCB0YWtpbmcge0BsaW5rIE5vdGljZU1lc3NhZ2V9LlxuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIGltcG9ydCB7IHdpdGhOb3RpY2UgfSBmcm9tICdhZG1pbmpzL2NvcmUnXG4gKlxuICogY29uc3QgTVlfTUVTU0FHRSA9IHtcbiAqICAgbWVzc2FnZTogJ0kgYW0gdG9hc3QgbWVzc2FnZScsXG4gKiAgIHR5cGU6ICdzdWNjZXNzJyxcbiAqIH1cbiAqIGNvbnN0IE15Q3VzdG9tQ29tcG9uZW50ID0gKHsgYWRkTm90aWNlIH0pID0+IHtcbiAqICAgcmV0dXJuIChcbiAqICAgICA8YSBvbkNsaWNrPXsoKSA9PiBhZGROb3RpY2UoTVlfTUVTU0FHRSl9PkNsaWNrIE1lPC9hPlxuICogICApXG4gKiB9XG4gKiBleHBvcnQgZGVmYXVsdCB3aXRoTm90aWNlKE15Q3VzdG9tQ29tcG9uZW50KVxuICogYGBgXG4gKlxuICogQGNvbXBvbmVudFxuICogQHN1YmNhdGVnb3J5IEhPQ1xuICovXG5jb25zdCB3aXRoTm90aWNlID0gKENvbXBvbmVudCkgPT4gY29ubmVjdChudWxsLCBtYXBEaXNwYXRjaFRvUHJvcHMpKENvbXBvbmVudClcblxuZXhwb3J0IHtcbiAgd2l0aE5vdGljZSBhcyBkZWZhdWx0LFxuICB3aXRoTm90aWNlLFxufVxuIiwiaW1wb3J0IHsgQnV0dG9uLCBEcmF3ZXJDb250ZW50LCBEcmF3ZXJGb290ZXIsIEljb24sIE1lc3NhZ2VCb3gsIFRhYmxlLCBUYWJsZUJvZHksIFRhYmxlQ2VsbCwgVGFibGVSb3csIFRleHQgfSBmcm9tICdAYWRtaW5qcy9kZXNpZ24tc3lzdGVtJ1xuaW1wb3J0IFJlYWN0LCB7IHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnXG5pbXBvcnQgeyB1c2VOYXZpZ2F0ZSB9IGZyb20gJ3JlYWN0LXJvdXRlcidcblxuaW1wb3J0IGFsbG93T3ZlcnJpZGUgZnJvbSAnLi4vLi4vaG9jL2FsbG93LW92ZXJyaWRlJ1xuaW1wb3J0IHdpdGhOb3RpY2UsIHsgQWRkTm90aWNlUHJvcHMgfSBmcm9tICcuLi8uLi9ob2Mvd2l0aC1ub3RpY2UnXG5pbXBvcnQgeyB1c2VUcmFuc2xhdGlvbiB9IGZyb20gJy4uLy4uL2hvb2tzJ1xuaW1wb3J0IHsgZ2V0QWN0aW9uRWxlbWVudENzcyB9IGZyb20gJy4uLy4uL3V0aWxzJ1xuaW1wb3J0IEFwaUNsaWVudCBmcm9tICcuLi8uLi91dGlscy9hcGktY2xpZW50J1xuaW1wb3J0IEFjdGlvbkhlYWRlciBmcm9tICcuLi9hcHAvYWN0aW9uLWhlYWRlci9hY3Rpb24taGVhZGVyJ1xuaW1wb3J0IFByb3BlcnR5VHlwZSBmcm9tICcuLi9wcm9wZXJ0eS10eXBlJ1xuaW1wb3J0IHsgQWN0aW9uUHJvcHMgfSBmcm9tICcuL2FjdGlvbi5wcm9wcydcbmltcG9ydCB7IGFwcGVuZEZvcmNlUmVmcmVzaCB9IGZyb20gJy4vdXRpbHMvYXBwZW5kLWZvcmNlLXJlZnJlc2gnXG5cbi8qKlxuICogQG5hbWUgQnVsa0RlbGV0ZUFjdGlvblxuICogQGNhdGVnb3J5IEFjdGlvbnNcbiAqIEBkZXNjcmlwdGlvbiBEZWxldGVzIHNlbGVjdGVkIHJlY29yZHMuXG4gKiBAY29tcG9uZW50XG4gKiBAcHJpdmF0ZVxuICovXG5jb25zdCBCdWxrRGVsZXRlOiBSZWFjdC5GQzxBY3Rpb25Qcm9wcyAmIEFkZE5vdGljZVByb3BzPiA9IChwcm9wcykgPT4ge1xuICBjb25zdCB7IHJlc291cmNlLCByZWNvcmRzLCBhY3Rpb24sIGFkZE5vdGljZSB9ID0gcHJvcHNcblxuICBjb25zdCBuYXZpZ2F0ZSA9IHVzZU5hdmlnYXRlKClcbiAgY29uc3QgW2xvYWRpbmcsIHNldExvYWRpbmddID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IHsgdHJhbnNsYXRlTWVzc2FnZSwgdHJhbnNsYXRlQnV0dG9uIH0gPSB1c2VUcmFuc2xhdGlvbigpXG5cbiAgaWYgKCFyZWNvcmRzKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxUZXh0PlxuICAgICAgICB7dHJhbnNsYXRlTWVzc2FnZSgncGlja1NvbWVGaXJzdFRvUmVtb3ZlJywgcmVzb3VyY2UuaWQpfVxuICAgICAgPC9UZXh0PlxuICAgIClcbiAgfVxuXG4gIGNvbnN0IGhhbmRsZUNsaWNrID0gKCk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IGFwaSA9IG5ldyBBcGlDbGllbnQoKVxuICAgIHNldExvYWRpbmcodHJ1ZSlcbiAgICBjb25zdCByZWNvcmRJZHMgPSByZWNvcmRzLm1hcCgocikgPT4gci5pZClcbiAgICBhcGkuYnVsa0FjdGlvbih7XG4gICAgICByZXNvdXJjZUlkOiByZXNvdXJjZS5pZCxcbiAgICAgIGFjdGlvbk5hbWU6IGFjdGlvbi5uYW1lLFxuICAgICAgcmVjb3JkSWRzLFxuICAgICAgbWV0aG9kOiAncG9zdCcsXG4gICAgfSkudGhlbigoKHJlc3BvbnNlKSA9PiB7XG4gICAgICBzZXRMb2FkaW5nKGZhbHNlKVxuICAgICAgaWYgKHJlc3BvbnNlLmRhdGEubm90aWNlKSB7XG4gICAgICAgIGFkZE5vdGljZShyZXNwb25zZS5kYXRhLm5vdGljZSlcbiAgICAgIH1cbiAgICAgIGlmIChyZXNwb25zZS5kYXRhLnJlZGlyZWN0VXJsKSB7XG4gICAgICAgIGNvbnN0IHNlYXJjaCA9IG5ldyBVUkxTZWFyY2hQYXJhbXMod2luZG93LmxvY2F0aW9uLnNlYXJjaClcbiAgICAgICAgLy8gYnVsayBmdW5jdGlvbiBoYXZlIHJlY29yZElkcyBpbiB0aGUgVVJMIHNvIGl0IGhhcyB0byBiZSBzdHJpcHBlZCBiZWZvcmUgcmVkaXJlY3RcbiAgICAgICAgc2VhcmNoLmRlbGV0ZSgncmVjb3JkSWRzJylcbiAgICAgICAgbmF2aWdhdGUoYXBwZW5kRm9yY2VSZWZyZXNoKHJlc3BvbnNlLmRhdGEucmVkaXJlY3RVcmwsIHNlYXJjaC50b1N0cmluZygpKSlcbiAgICAgIH1cbiAgICB9KSkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICBzZXRMb2FkaW5nKGZhbHNlKVxuICAgICAgYWRkTm90aWNlKHtcbiAgICAgICAgbWVzc2FnZTogdHJhbnNsYXRlTWVzc2FnZSgnYnVsa0RlbGV0ZUVycm9yJywgcmVzb3VyY2UuaWQpLFxuICAgICAgICB0eXBlOiAnZXJyb3InLFxuICAgICAgfSlcbiAgICAgIHRocm93IGVycm9yXG4gICAgfSlcbiAgfVxuXG4gIGNvbnN0IGNvbnRlbnRUYWcgPSBnZXRBY3Rpb25FbGVtZW50Q3NzKHJlc291cmNlLmlkLCBhY3Rpb24ubmFtZSwgJ2RyYXdlci1jb250ZW50JylcbiAgY29uc3QgdGFibGVUYWcgPSBnZXRBY3Rpb25FbGVtZW50Q3NzKHJlc291cmNlLmlkLCBhY3Rpb24ubmFtZSwgJ3RhYmxlJylcbiAgY29uc3QgZm9vdGVyVGFnID0gZ2V0QWN0aW9uRWxlbWVudENzcyhyZXNvdXJjZS5pZCwgYWN0aW9uLm5hbWUsICdkcmF3ZXItZm9vdGVyJylcblxuICByZXR1cm4gKFxuICAgIDw+XG4gICAgICA8RHJhd2VyQ29udGVudCBkYXRhLWNzcz17Y29udGVudFRhZ30+XG4gICAgICAgIHthY3Rpb24/LnNob3dJbkRyYXdlciA/IDxBY3Rpb25IZWFkZXIgb21pdEFjdGlvbnMgey4uLnByb3BzfSAvPiA6IG51bGx9XG4gICAgICAgIDxNZXNzYWdlQm94XG4gICAgICAgICAgbWI9XCJ4eGxcIlxuICAgICAgICAgIHZhcmlhbnQ9XCJkYW5nZXJcIlxuICAgICAgICAgIG1lc3NhZ2U9e3RyYW5zbGF0ZU1lc3NhZ2UocmVjb3Jkcy5sZW5ndGggPiAxID8gJ3RoZXNlUmVjb3Jkc1dpbGxCZVJlbW92ZWRfcGx1cmFsJyA6ICd0aGVzZVJlY29yZHNXaWxsQmVSZW1vdmVkJywgcmVzb3VyY2UuaWQsIHsgY291bnQ6IHJlY29yZHMubGVuZ3RoIH0pfVxuICAgICAgICAvPlxuICAgICAgICA8VGFibGUgZGF0YS1jc3M9e3RhYmxlVGFnfT5cbiAgICAgICAgICA8VGFibGVCb2R5PlxuICAgICAgICAgICAge3JlY29yZHMubWFwKChyZWNvcmQpID0+IChcbiAgICAgICAgICAgICAgPFRhYmxlUm93IGtleT17cmVjb3JkLmlkfT5cbiAgICAgICAgICAgICAgICA8VGFibGVDZWxsPlxuICAgICAgICAgICAgICAgICAgPFByb3BlcnR5VHlwZVxuICAgICAgICAgICAgICAgICAgICB3aGVyZT1cImxpc3RcIlxuICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eT17cmVzb3VyY2UudGl0bGVQcm9wZXJ0eX1cbiAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2U9e3Jlc291cmNlfVxuICAgICAgICAgICAgICAgICAgICByZWNvcmQ9e3JlY29yZH1cbiAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPC9UYWJsZUNlbGw+XG4gICAgICAgICAgICAgIDwvVGFibGVSb3c+XG4gICAgICAgICAgICApKX1cbiAgICAgICAgICA8L1RhYmxlQm9keT5cbiAgICAgICAgPC9UYWJsZT5cbiAgICAgIDwvRHJhd2VyQ29udGVudD5cbiAgICAgIDxEcmF3ZXJGb290ZXIgZGF0YS1jc3M9e2Zvb3RlclRhZ30+XG4gICAgICAgIDxCdXR0b24gdmFyaWFudD1cInByaW1hcnlcIiBzaXplPVwibGdcIiBvbkNsaWNrPXtoYW5kbGVDbGlja30gZGlzYWJsZWQ9e2xvYWRpbmd9PlxuICAgICAgICAgIHtsb2FkaW5nID8gKDxJY29uIGljb249XCJGYWRlXCIgc3BpbiAvPikgOiBudWxsfVxuICAgICAgICAgIHt0cmFuc2xhdGVCdXR0b24ocmVjb3Jkcy5sZW5ndGggPiAxID8gJ2NvbmZpcm1SZW1vdmFsTWFueV9wbHVyYWwnIDogJ2NvbmZpcm1SZW1vdmFsTWFueScsIHJlc291cmNlLmlkLCB7IGNvdW50OiByZWNvcmRzLmxlbmd0aCB9KX1cbiAgICAgICAgPC9CdXR0b24+XG4gICAgICA8L0RyYXdlckZvb3Rlcj5cbiAgICA8Lz5cbiAgKVxufVxuXG5jb25zdCBGb3JtYXR0ZWRCdWxrRGVsZXRlID0gd2l0aE5vdGljZShCdWxrRGVsZXRlKVxuY29uc3QgT3ZlcnJpZGFibGVGb3JtYXR0ZWRCdWxrRGVsZXRlID0gYWxsb3dPdmVycmlkZShGb3JtYXR0ZWRCdWxrRGVsZXRlLCAnRGVmYXVsdEJ1bGtEZWxldGVBY3Rpb24nKVxuXG5leHBvcnQge1xuICBPdmVycmlkYWJsZUZvcm1hdHRlZEJ1bGtEZWxldGUgYXMgZGVmYXVsdCxcbiAgT3ZlcnJpZGFibGVGb3JtYXR0ZWRCdWxrRGVsZXRlIGFzIEJ1bGtEZWxldGUsXG59XG4iLCJpbXBvcnQgeyBOZXcgfSBmcm9tICcuL25ldydcbmltcG9ydCB7IEVkaXQgfSBmcm9tICcuL2VkaXQnXG5pbXBvcnQgeyBTaG93IH0gZnJvbSAnLi9zaG93J1xuaW1wb3J0IHsgTGlzdCB9IGZyb20gJy4vbGlzdCdcbmltcG9ydCB7IEJ1bGtEZWxldGUgfSBmcm9tICcuL2J1bGstZGVsZXRlJ1xuXG5leHBvcnQgKiBmcm9tICcuL25ldydcbmV4cG9ydCAqIGZyb20gJy4vYWN0aW9uLnByb3BzJ1xuZXhwb3J0ICogZnJvbSAnLi9lZGl0J1xuZXhwb3J0ICogZnJvbSAnLi9zaG93J1xuZXhwb3J0ICogZnJvbSAnLi9saXN0J1xuZXhwb3J0ICogZnJvbSAnLi9idWxrLWRlbGV0ZSdcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMnXG5cbmV4cG9ydCBjb25zdCBhY3Rpb25zID0ge1xuICBuZXc6IE5ldyxcbiAgZWRpdDogRWRpdCxcbiAgc2hvdzogU2hvdyxcbiAgbGlzdDogTGlzdCxcbiAgYnVsa0RlbGV0ZTogQnVsa0RlbGV0ZSxcbn1cbiIsIi8qIGNzcGVsbDogZGlzYWJsZSAqL1xuZXhwb3J0IGNvbnN0IERPQ1MgPSAnaHR0cHM6Ly9kb2NzLmFkbWluanMuY28nXG5leHBvcnQgY29uc3QgREVGQVVMVF9QQVRIUyA9IHtcbiAgcm9vdFBhdGg6ICcvYWRtaW4nLFxuICBsb2dvdXRQYXRoOiAnL2FkbWluL2xvZ291dCcsXG4gIGxvZ2luUGF0aDogJy9hZG1pbi9sb2dpbicsXG59XG5cbmNvbnN0IERFRkFVTFRfVE1QX0RJUiA9ICcuYWRtaW5qcydcbmV4cG9ydCBjb25zdCBBRE1JTl9KU19UTVBfRElSID0gdHlwZW9mIHByb2Nlc3MgPT09ICdvYmplY3QnXG4gID8gcHJvY2Vzcy5lbnYuQURNSU5fSlNfVE1QX0RJUiB8fCBERUZBVUxUX1RNUF9ESVJcbiAgOiBERUZBVUxUX1RNUF9ESVJcbiIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IFRyYW5zIH0gZnJvbSAncmVhY3QtaTE4bmV4dCdcbmltcG9ydCB7IE1lc3NhZ2VCb3gsIExpbmsgfSBmcm9tICdAYWRtaW5qcy9kZXNpZ24tc3lzdGVtJ1xuXG5pbXBvcnQgRXJyb3JCb3VuZGFyeSBmcm9tICcuL2Vycm9yLWJvdW5kYXJ5J1xuaW1wb3J0IHsgYWN0aW9ucyB9IGZyb20gJy4uL2FjdGlvbnMnXG5pbXBvcnQgeyBET0NTIH0gZnJvbSAnLi4vLi4vLi4vY29uc3RhbnRzJ1xuaW1wb3J0IHsgQWN0aW9uUHJvcHMgfSBmcm9tICcuLi9hY3Rpb25zL2FjdGlvbi5wcm9wcydcbmltcG9ydCB7IHVzZVRyYW5zbGF0aW9uIH0gZnJvbSAnLi4vLi4vaG9va3MnXG5cbmRlY2xhcmUgY29uc3QgQWRtaW5KUzoge1xuICBVc2VyQ29tcG9uZW50czogQXJyYXk8c3RyaW5nPjtcbn1cblxuLyoqXG4gKiBDb21wb25lbnQgd2hpY2ggcmVuZGVycyBhbGwgdGhlIGRlZmF1bHQgYW5kIGN1c3RvbSBhY3Rpb25zIGZvciBib3RoIHRoZSBSZXNvdXJjZSBhbmQgdGhlIFJlY29yZC5cbiAqXG4gKiBJdCBwYXNzZXMgYWxsIHByb3BzIGRvd24gdG8gdGhlIGFjdHVhbCBBY3Rpb24gY29tcG9uZW50LlxuICpcbiAqIEV4YW1wbGUgb2YgY3JlYXRpbmcgeW91ciBvd24gYWN0aW9uczpcbiAqIGBgYFxuICogLy8gQWRtaW5KUyBvcHRpb25zXG4gKiBjb25zdCBBZG1pbkpTT3B0aW9ucyA9IHtcbiAqICAgcmVzb3VyY2VzOiBbXG4gKiAgICAgIHJlc291cmNlLFxuICogICAgICBvcHRpb25zOiB7XG4gKiAgICAgICAgYWN0aW9uczoge1xuICogICAgICAgICAgIG15TmV3QWN0aW9uOiB7XG4gKiAgICAgICAgICAgICBsYWJlbDogJ2FtYXppbmcgYWN0aW9uJyxcbiAqICAgICAgICAgICAgIGljb246ICdBZGQnLFxuICogICAgICAgICAgICAgaW5WaXNpYmxlOiAocmVzb3VyY2UsIHJlY29yZCkgPT4gcmVjb3JkLnBhcmFtKCdlbWFpbCcpICE9PSAnJyxcbiAqICAgICAgICAgICAgIGFjdGlvblR5cGU6ICdyZWNvcmQnLFxuICogICAgICAgICAgICAgY29tcG9uZW50OiAnTXlOZXdBY3Rpb24nLFxuICogICAgICAgICAgICAgaGFuZGxlcjogKHJlcXVlc3QsIHJlc3BvbnNlLCBkYXRhKSA9PiB7XG4gKiAgICAgICAgICAgICAgIHJldHVybiB7XG4gKiAgICAgICAgICAgICAgICAgIC4uLlxuICogICAgICAgICAgICAgICB9XG4gKiAgICAgICAgICAgICB9XG4gKiAgICAgICAgICAgfVxuICogICAgICAgIH1cbiAqICAgICAgfVxuICogICBdXG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBgYGBcbiAqIC8vIC4vbXktbmV3LWFjdGlvbi5qc3hcbiAqIGltcG9ydCB7IEJveCB9IGZyb20gJ2FkbWluanMnXG4gKlxuICogY29uc3QgTXlOZXdBY3Rpb24gPSAocHJvcHMpID0+IHtcbiAqICAgY29uc3QgeyByZXNvdXJjZSwgYWN0aW9uLCByZWNvcmQgfSA9IHByb3BzXG4gKiAgIC8vIGRvIHNvbWV0aGluZyB3aXRoIHRoZSBwcm9wcyBhbmQgcmVuZGVyIGFjdGlvblxuICogICByZXR1cm4gKFxuICogICAgIDxCb3g+U29tZSBBY3Rpb24gQ29udGVudDwvQm94PlxuICogICApXG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBAY29tcG9uZW50XG4gKiBAbmFtZSBCYXNlQWN0aW9uQ29tcG9uZW50XG4gKiBAc3ViY2F0ZWdvcnkgQXBwbGljYXRpb25cbiAqL1xuZXhwb3J0IGNvbnN0IEJhc2VBY3Rpb25Db21wb25lbnQ6IFJlYWN0LkZDPEFjdGlvblByb3BzPiA9IChwcm9wcykgPT4ge1xuICBjb25zdCB7IHJlc291cmNlLCBhY3Rpb24sIHJlY29yZCwgcmVjb3Jkcywgc2V0VGFnIH0gPSBwcm9wc1xuICBjb25zdCBkb2N1bWVudGF0aW9uTGluayA9IFtET0NTLCAnQmFzZUFjdGlvbi5odG1sJ10uam9pbignLycpXG5cbiAgY29uc3QgeyB0cmFuc2xhdGVNZXNzYWdlIH0gPSB1c2VUcmFuc2xhdGlvbigpXG5cbiAgbGV0IEFjdGlvbiA9IGFjdGlvbnNbYWN0aW9uLm5hbWVdXG5cbiAgaWYgKGFjdGlvbi5jb21wb25lbnQpIHtcbiAgICBBY3Rpb24gPSBBZG1pbkpTLlVzZXJDb21wb25lbnRzW2FjdGlvbi5jb21wb25lbnRdXG4gIH1cblxuICBpZiAoQWN0aW9uKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxFcnJvckJvdW5kYXJ5PlxuICAgICAgICA8QWN0aW9uXG4gICAgICAgICAgYWN0aW9uPXthY3Rpb259XG4gICAgICAgICAgcmVzb3VyY2U9e3Jlc291cmNlfVxuICAgICAgICAgIHJlY29yZD17cmVjb3JkfVxuICAgICAgICAgIHJlY29yZHM9e3JlY29yZHN9XG4gICAgICAgICAgc2V0VGFnPXtzZXRUYWd9XG4gICAgICAgIC8+XG4gICAgICA8L0Vycm9yQm91bmRhcnk+XG4gICAgKVxuICB9XG4gIHJldHVybiBBY3Rpb24gfHwgKFxuICAgIDxNZXNzYWdlQm94IHZhcmlhbnQ9XCJkYW5nZXJcIj5cbiAgICAgIHt0cmFuc2xhdGVNZXNzYWdlKCdub0FjdGlvbkNvbXBvbmVudCcpfVxuICAgICAgPFRyYW5zIGtleT1cIm1lc3NhZ2VzLmJ1dHRvbnMuc2VlVGhlRG9jdW1lbnRhdGlvblwiPlxuICAgICAgICBTZWU6XG4gICAgICAgIDxMaW5rIG1sPVwiZGVmYXVsdFwiIGhyZWY9e2RvY3VtZW50YXRpb25MaW5rfT50aGUgZG9jdW1lbnRhdGlvbjwvTGluaz5cbiAgICAgIDwvVHJhbnM+XG4gICAgPC9NZXNzYWdlQm94PlxuICApXG59XG5cbmV4cG9ydCBkZWZhdWx0IEJhc2VBY3Rpb25Db21wb25lbnRcbiIsImltcG9ydCBSZWFjdCwgeyBSZWFjdE5vZGUgfSBmcm9tICdyZWFjdCdcbmltcG9ydCB7IE1lc3NhZ2VCb3gsIFRleHQgfSBmcm9tICdAYWRtaW5qcy9kZXNpZ24tc3lzdGVtJ1xuaW1wb3J0IHsgdXNlVHJhbnNsYXRpb24gfSBmcm9tICcuLi8uLi9ob29rcydcblxuLyoqXG4gKiBAbWVtYmVyb2YgRXJyb3JNZXNzYWdlQm94XG4gKiBAYWxpYXMgRXJyb3JNZXNzYWdlQm94UHJvcHNcbiAqL1xuZXhwb3J0IHR5cGUgRXJyb3JNZXNzYWdlQm94UHJvcHMgPSB7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIGNoaWxkcmVuOiBSZWFjdE5vZGU7XG4gIHRlc3RJZD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBAY2xhc3NcbiAqIFByaW50cyBlcnJvciBtZXNzYWdlXG4gKlxuICogQGNvbXBvbmVudFxuICogQHByaXZhdGVcbiAqIEBleGFtcGxlXG4gKiByZXR1cm4gKFxuICogPEVycm9yTWVzc2FnZUJveCB0aXRsZT17J1NvbWUgZXJyb3InfT5cbiAqICAgPHA+VGV4dCBiZWxvdyB0aGUgdGl0bGU8L3A+XG4gKiA8L0Vycm9yTWVzc2FnZUJveD5cbiAqIClcbiAqL1xuY29uc3QgRXJyb3JNZXNzYWdlQm94OiBSZWFjdC5GQzxFcnJvck1lc3NhZ2VCb3hQcm9wcz4gPSAocHJvcHMpID0+IHtcbiAgY29uc3QgeyBjaGlsZHJlbiwgdGl0bGUsIHRlc3RJZCB9ID0gcHJvcHNcbiAgcmV0dXJuIChcbiAgICA8TWVzc2FnZUJveCBkYXRhLXRlc3RpZD17dGVzdElkfSBtZXNzYWdlPXt0aXRsZX0+XG4gICAgICA8VGV4dD5cbiAgICAgICAge2NoaWxkcmVufVxuICAgICAgPC9UZXh0PlxuICAgIDwvTWVzc2FnZUJveD5cbiAgKVxufVxuXG5jb25zdCBOb1Jlc291cmNlRXJyb3I6IFJlYWN0LkZDPHtyZXNvdXJjZUlkOiBzdHJpbmd9PiA9IChwcm9wcykgPT4ge1xuICBjb25zdCB7IHJlc291cmNlSWQgfSA9IHByb3BzXG4gIGNvbnN0IHsgdHJhbnNsYXRlTWVzc2FnZSB9ID0gdXNlVHJhbnNsYXRpb24oKVxuICByZXR1cm4gKFxuICAgIDxNZXNzYWdlQm94XG4gICAgICBtZXNzYWdlPVwiNDA0IC0gUEFHRSBOT1QgRk9VTkRcIlxuICAgICAgZGF0YS10ZXN0aWQ9XCJOb1Jlc291cmNlRXJyb3JcIlxuICAgICAgdmFyaWFudD1cImluZm9cIlxuICAgICAgbT1cInh4bFwiXG4gICAgPlxuICAgICAgPFRleHQ+XG4gICAgICAgIHt0cmFuc2xhdGVNZXNzYWdlKCdlcnJvcjQwNFJlc291cmNlJywgcmVzb3VyY2VJZCwgeyByZXNvdXJjZUlkIH0pfVxuICAgICAgPC9UZXh0PlxuICAgIDwvTWVzc2FnZUJveD5cbiAgKVxufVxuXG5jb25zdCBOb0FjdGlvbkVycm9yOiBSZWFjdC5GQzx7IHJlc291cmNlSWQ6IHN0cmluZzsgYWN0aW9uTmFtZTogc3RyaW5nIH0+ID0gKHByb3BzKSA9PiB7XG4gIGNvbnN0IHsgcmVzb3VyY2VJZCwgYWN0aW9uTmFtZSB9ID0gcHJvcHNcbiAgY29uc3QgeyB0cmFuc2xhdGVNZXNzYWdlIH0gPSB1c2VUcmFuc2xhdGlvbigpXG4gIHJldHVybiAoXG4gICAgPE1lc3NhZ2VCb3hcbiAgICAgIG1lc3NhZ2U9XCI0MDQgLSBQQUdFIE5PVCBGT1VORFwiXG4gICAgICBkYXRhLXRlc3RpZD1cIk5vQWN0aW9uRXJyb3JcIlxuICAgICAgdmFyaWFudD1cImluZm9cIlxuICAgICAgbT1cInh4bFwiXG4gICAgPlxuICAgICAgPFRleHQ+XG4gICAgICAgIHt0cmFuc2xhdGVNZXNzYWdlKCdlcnJvcjQwNEFjdGlvbicsIHJlc291cmNlSWQsIHsgcmVzb3VyY2VJZCwgYWN0aW9uTmFtZSB9KX1cbiAgICAgIDwvVGV4dD5cbiAgICA8L01lc3NhZ2VCb3g+XG4gIClcbn1cblxuY29uc3QgTm9SZWNvcmRFcnJvcjogUmVhY3QuRkM8e1xuICByZXNvdXJjZUlkOiBzdHJpbmc7XG4gIHJlY29yZElkOiBzdHJpbmc7XG59PiA9IChwcm9wcykgPT4ge1xuICBjb25zdCB7IHJlc291cmNlSWQsIHJlY29yZElkIH0gPSBwcm9wc1xuICBjb25zdCB7IHRyYW5zbGF0ZU1lc3NhZ2UgfSA9IHVzZVRyYW5zbGF0aW9uKClcbiAgcmV0dXJuIChcbiAgICA8TWVzc2FnZUJveFxuICAgICAgbWVzc2FnZT1cIjQwNCAtIFBBR0UgTk9UIEZPVU5EXCJcbiAgICAgIGRhdGEtdGVzdGlkPVwiTm9SZWNvcmRFcnJvclwiXG4gICAgICB2YXJpYW50PVwiaW5mb1wiXG4gICAgICBtPVwieHhsXCJcbiAgICA+XG4gICAgICA8VGV4dD5cbiAgICAgICAge3RyYW5zbGF0ZU1lc3NhZ2UoJ2Vycm9yNDA0UmVjb3JkJywgcmVzb3VyY2VJZCwgeyByZXNvdXJjZUlkLCByZWNvcmRJZCB9KX1cbiAgICAgIDwvVGV4dD5cbiAgICA8L01lc3NhZ2VCb3g+XG4gIClcbn1cblxuZXhwb3J0IHtcbiAgTm9SZXNvdXJjZUVycm9yLFxuICBOb0FjdGlvbkVycm9yLFxuICBOb1JlY29yZEVycm9yLFxuICBFcnJvck1lc3NhZ2VCb3gsXG4gIEVycm9yTWVzc2FnZUJveCBhcyBkZWZhdWx0LFxufVxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHN0eWxlZCBmcm9tICdzdHlsZWQtY29tcG9uZW50cydcbmltcG9ydCB7IEJveCwgQm94UHJvcHMsIERyYXdlckNvbnRlbnQsIERyYXdlckZvb3RlciB9IGZyb20gJ0BhZG1pbmpzL2Rlc2lnbi1zeXN0ZW0nXG5cbmltcG9ydCBhbGxvd092ZXJyaWRlIGZyb20gJy4uLy4uLy4uL2hvYy9hbGxvdy1vdmVycmlkZSdcblxuY29uc3QgU3R5bGVkV3JhcHBlcldpdGhGaWx0ZXIgPSBzdHlsZWQoQm94KWBcbiAgJiA+ICR7RHJhd2VyQ29udGVudH0ge1xuICAgIGJhY2tncm91bmQ6ICR7KHsgdGhlbWUgfSk6IHN0cmluZyA9PiB0aGVtZS5jb2xvcnMud2hpdGV9O1xuICAgIHBhZGRpbmc6ICR7KHsgdGhlbWUgfSk6IHN0cmluZyA9PiB0aGVtZS5zcGFjZS54eGx9O1xuICAgIG92ZXJmbG93OiB2aXNpYmxlO1xuICB9XG5cbiAgJiA+ICR7RHJhd2VyRm9vdGVyfSB7XG4gICAgYmFja2dyb3VuZDogJHsoeyB0aGVtZSB9KTogc3RyaW5nID0+IHRoZW1lLmNvbG9ycy53aGl0ZX07XG4gICAgcGFkZGluZzogMCAkeyh7IHRoZW1lIH0pOiBzdHJpbmcgPT4gdGhlbWUuc3BhY2UueHhsfSAkeyh7IHRoZW1lIH0pOiBzdHJpbmcgPT4gdGhlbWUuc3BhY2UueHhsfTtcbiAgfVxuYFxuXG5jb25zdCBTdHlsZWRXcmFwcGVyID0gc3R5bGVkKEJveClgXG4gICYgJHtEcmF3ZXJDb250ZW50fSB7XG4gICAgYmFja2dyb3VuZDogJHsoeyB0aGVtZSB9KTogc3RyaW5nID0+IHRoZW1lLmNvbG9ycy53aGl0ZX07XG4gICAgcGFkZGluZzogJHsoeyB0aGVtZSB9KTogc3RyaW5nID0+IHRoZW1lLnNwYWNlLnh4bH07XG4gICAgb3ZlcmZsb3c6IHZpc2libGU7XG4gIH1cblxuICAmICR7RHJhd2VyRm9vdGVyfSB7XG4gICAgYmFja2dyb3VuZDogJHsoeyB0aGVtZSB9KTogc3RyaW5nID0+IHRoZW1lLmNvbG9ycy53aGl0ZX07XG4gICAgcGFkZGluZzogMCAkeyh7IHRoZW1lIH0pOiBzdHJpbmcgPT4gdGhlbWUuc3BhY2UueHhsfSAkeyh7IHRoZW1lIH0pOiBzdHJpbmcgPT4gdGhlbWUuc3BhY2UueHhsfTtcbiAgfVxuYFxuXG50eXBlIFdyYXBwZXJQcm9wcyA9IEJveFByb3BzICYge1xuICBzaG93RmlsdGVyPzogYm9vbGVhbjtcbiAgY2hpbGRyZW4/OiBSZWFjdC5SZWFjdE5vZGU7XG59XG5cbmNvbnN0IFdyYXBwZXI6IFJlYWN0LkZDPFdyYXBwZXJQcm9wcz4gPSAocHJvcHMpID0+IHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBjb25zdCB7IGNoaWxkcmVuLCB2YXJpYW50LCBjb2xvciwgc2hvd0ZpbHRlciA9IGZhbHNlLCAuLi5yZXN0IH0gPSBwcm9wc1xuXG4gIGNvbnN0IENvbXBvbmVudCA9IHNob3dGaWx0ZXIgPyBTdHlsZWRXcmFwcGVyV2l0aEZpbHRlciA6IFN0eWxlZFdyYXBwZXJcbiAgcmV0dXJuIChcbiAgICA8Q29tcG9uZW50IHsuLi5yZXN0fSB2YXJpYW50PVwiZ3JleVwiIG14PVwiYXV0b1wiIGRhdGEtY3NzPVwic3R5bGVkLXdyYXBwZXJcIj5cbiAgICAgIHtjaGlsZHJlbn1cbiAgICA8L0NvbXBvbmVudD5cbiAgKVxufVxuXG5leHBvcnQgZGVmYXVsdCBhbGxvd092ZXJyaWRlKFdyYXBwZXIsICdSb3V0ZVdyYXBwZXInKVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgbSA9IHJlcXVpcmUoJ3JlYWN0LWRvbScpO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHtcbiAgZXhwb3J0cy5jcmVhdGVSb290ID0gbS5jcmVhdGVSb290O1xuICBleHBvcnRzLmh5ZHJhdGVSb290ID0gbS5oeWRyYXRlUm9vdDtcbn0gZWxzZSB7XG4gIHZhciBpID0gbS5fX1NFQ1JFVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9ZT1VfV0lMTF9CRV9GSVJFRDtcbiAgZXhwb3J0cy5jcmVhdGVSb290ID0gZnVuY3Rpb24oYywgbykge1xuICAgIGkudXNpbmdDbGllbnRFbnRyeVBvaW50ID0gdHJ1ZTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIG0uY3JlYXRlUm9vdChjLCBvKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaS51c2luZ0NsaWVudEVudHJ5UG9pbnQgPSBmYWxzZTtcbiAgICB9XG4gIH07XG4gIGV4cG9ydHMuaHlkcmF0ZVJvb3QgPSBmdW5jdGlvbihjLCBoLCBvKSB7XG4gICAgaS51c2luZ0NsaWVudEVudHJ5UG9pbnQgPSB0cnVlO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gbS5oeWRyYXRlUm9vdChjLCBoLCBvKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaS51c2luZ0NsaWVudEVudHJ5UG9pbnQgPSBmYWxzZTtcbiAgICB9XG4gIH07XG59XG4iLCJpbXBvcnQgUmVhY3QsIHsgdXNlRWZmZWN0LCBSZWFjdE5vZGUsIHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBjcmVhdGVQb3J0YWwgfSBmcm9tICdyZWFjdC1kb20nXG5pbXBvcnQgeyBjcmVhdGVSb290IH0gZnJvbSAncmVhY3QtZG9tL2NsaWVudCdcbmltcG9ydCB7IERyYXdlciwgREVGQVVMVF9EUkFXRVJfV0lEVEggfSBmcm9tICdAYWRtaW5qcy9kZXNpZ24tc3lzdGVtJ1xuaW1wb3J0IHsgVGhlbWVQcm92aWRlciB9IGZyb20gJ3N0eWxlZC1jb21wb25lbnRzJ1xuXG4vKipcbiAqIEBhbGlhcyBEcmF3ZXJQb3J0YWxQcm9wc1xuICogQG1lbWJlcm9mIERyYXdlclBvcnRhbFxuICovXG5leHBvcnQgdHlwZSBEcmF3ZXJQb3J0YWxQcm9wcyA9IHtcbiAgLyoqXG4gICAqIFRoZSBkcmF3ZXIgY29udGVudFxuICAgKi9cbiAgY2hpbGRyZW46IFJlYWN0Tm9kZTtcblxuICAvKipcbiAgICogT3B0aW9uYWwgZHJhd2VyIHdpZHRoXG4gICAqL1xuICB3aWR0aD86IG51bWJlciB8IHN0cmluZyB8IEFycmF5PG51bWJlciB8IHN0cmluZz47XG59XG5cbmV4cG9ydCB0eXBlIERyYXdlcldyYXBwZXJQcm9wcyA9IHtcbiAgb25Nb3VudDogKCkgPT4gdm9pZDtcbn1cblxuY29uc3QgRFJBV0VSX1BPUlRBTF9JRCA9ICdkcmF3ZXJQb3J0YWwnXG5jb25zdCBEUkFXRVJfUE9SVEFMX1dSQVBQRVJfSUQgPSAnZHJhd2VyUG9ydGFsV3JhcHBlcidcblxuY29uc3QgRHJhd2VyV3JhcHBlcjogUmVhY3QuRkM8RHJhd2VyV3JhcHBlclByb3BzPiA9ICh7IG9uTW91bnQgfSkgPT4ge1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIG9uTW91bnQoKVxuICB9LCBbXSlcbiAgcmV0dXJuIChcbiAgICA8VGhlbWVQcm92aWRlciB0aGVtZT17KHdpbmRvdyBhcyBhbnkpLlRIRU1FfT5cbiAgICAgIDxEcmF3ZXIgaWQ9e0RSQVdFUl9QT1JUQUxfSUR9IGNsYXNzTmFtZT1cImhpZGRlblwiIGRhdGEtY3NzPVwiZHJhd2VyXCIgLz5cbiAgICA8L1RoZW1lUHJvdmlkZXI+XG4gIClcbn1cblxuY29uc3QgZ2V0T3JDcmVhdGVQb3J0YWxDb250YWluZXIgPSAoaWQ6IHN0cmluZykgPT4ge1xuICBsZXQgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpXG5cbiAgaWYgKCFjb250YWluZXIpIHtcbiAgICBjb250YWluZXIgPSB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcbiAgICBjb250YWluZXIuaWQgPSBpZFxuICAgIHdpbmRvdy5kb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGNvbnRhaW5lcilcbiAgfVxuXG4gIHJldHVybiBjb250YWluZXJcbn1cblxuLyoqXG4gKiBTaG93cyBhbGwgb2YgaXRzIGNoaWxkcmVuIGluIGEgRHJhd2VyIG9uIHRoZSByaWdodC5cbiAqIEluc3RlYWQgb2YgcmVuZGVyaW5nIGl0J3Mgb3duIHtAbGluayBEcmF3ZXJ9IGNvbXBvbmVudCBpdCByZXVzZXNcbiAqIHRoZSBnbG9iYWwgRHJhd2VyIHZpYSBSZWFjdCBQb3J0YWwuXG4gKlxuICogIyMjIFVzYWdlXG4gKlxuICogYGBgXG4gKiBpbXBvcnQgeyBEcmF3ZXJQb3J0YWwgfSBmcm9tICdhZG1pbmpzJ1xuICogYGBgXG4gKlxuICogQGNvbXBvbmVudFxuICogQHN1YmNhdGVnb3J5IEFwcGxpY2F0aW9uXG4gKi9cbmV4cG9ydCBjb25zdCBEcmF3ZXJQb3J0YWw6IFJlYWN0LkZDPERyYXdlclBvcnRhbFByb3BzPiA9ICh7IGNoaWxkcmVuLCB3aWR0aCB9KSA9PiB7XG4gIGNvbnN0IFtkcmF3ZXJFbGVtZW50LCBzZXREcmF3ZXJFbGVtZW50XSA9IHVzZVN0YXRlKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKERSQVdFUl9QT1JUQUxfSUQpKVxuXG4gIGNvbnN0IGhhbmRsZURyYXdlck1vdW50ID0gKCkgPT4ge1xuICAgIHNldERyYXdlckVsZW1lbnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoRFJBV0VSX1BPUlRBTF9JRCkpXG4gIH1cblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGlubmVyV3JhcHBlckVsZW1lbnQgPSBnZXRPckNyZWF0ZVBvcnRhbENvbnRhaW5lcihEUkFXRVJfUE9SVEFMX1dSQVBQRVJfSUQpXG4gICAgaWYgKCFkcmF3ZXJFbGVtZW50ICYmIHdpbmRvdykge1xuICAgICAgY29uc3QgZHJhd2VyUm9vdCA9IGNyZWF0ZVJvb3QoaW5uZXJXcmFwcGVyRWxlbWVudClcbiAgICAgIGRyYXdlclJvb3QucmVuZGVyKDxEcmF3ZXJXcmFwcGVyIG9uTW91bnQ9e2hhbmRsZURyYXdlck1vdW50fSAvPilcbiAgICB9XG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgY29uc3QgaW5uZXJXcmFwcGVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoRFJBV0VSX1BPUlRBTF9XUkFQUEVSX0lEKVxuICAgICAgaWYgKGlubmVyV3JhcHBlcikgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChpbm5lcldyYXBwZXIpXG4gICAgfVxuICB9LCBbXSlcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChkcmF3ZXJFbGVtZW50KSB7XG4gICAgICBkcmF3ZXJFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2hpZGRlbicpXG4gICAgICBpZiAod2lkdGgpIHtcbiAgICAgICAgZHJhd2VyRWxlbWVudC5zdHlsZS53aWR0aCA9IEFycmF5LmlzQXJyYXkod2lkdGgpXG4gICAgICAgICAgPyB3aWR0aFswXS50b1N0cmluZygpXG4gICAgICAgICAgOiB3aWR0aC50b1N0cmluZygpXG4gICAgICB9XG4gICAgICByZXR1cm4gKCk6IHZvaWQgPT4ge1xuICAgICAgICBkcmF3ZXJFbGVtZW50LnN0eWxlLndpZHRoID0gREVGQVVMVF9EUkFXRVJfV0lEVEhcbiAgICAgICAgZHJhd2VyRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKVxuICAgICAgICBkcmF3ZXJFbGVtZW50LnNldEF0dHJpYnV0ZSgnZGF0YS1jc3MnLCAnZHJhd2VyLWVsZW1lbnQnKVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gKCkgPT4gdW5kZWZpbmVkXG4gIH0sIFtkcmF3ZXJFbGVtZW50XSlcblxuICBpZiAoIWRyYXdlckVsZW1lbnQpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgcmV0dXJuIGNyZWF0ZVBvcnRhbChcbiAgICBjaGlsZHJlbixcbiAgICBkcmF3ZXJFbGVtZW50LFxuICApXG59XG5cbmV4cG9ydCBkZWZhdWx0IERyYXdlclBvcnRhbFxuIiwiaW1wb3J0IHtcbiAgQm94LCBCdXR0b24sIERyYXdlcixcbiAgRHJhd2VyQ29udGVudCxcbiAgRHJhd2VyRm9vdGVyLCBIMywgSWNvbixcbn0gZnJvbSAnQGFkbWluanMvZGVzaWduLXN5c3RlbSdcbmltcG9ydCBSZWFjdCwgeyBNb3VzZUV2ZW50LCBTeW50aGV0aWNFdmVudCwgdXNlRWZmZWN0LCB1c2VSZWYsIHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnXG5pbXBvcnQgeyB1c2VMb2NhdGlvbiwgdXNlTmF2aWdhdGUsIHVzZVBhcmFtcyB9IGZyb20gJ3JlYWN0LXJvdXRlci1kb20nXG5cbmltcG9ydCBhbGxvd092ZXJyaWRlIGZyb20gJy4uLy4uL2hvYy9hbGxvdy1vdmVycmlkZSdcbmltcG9ydCB7IHVzZVRyYW5zbGF0aW9uIH0gZnJvbSAnLi4vLi4vaG9va3MnXG5pbXBvcnQgeyBSZWNvcmRKU09OLCBSZXNvdXJjZUpTT04gfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzJ1xuaW1wb3J0IHsgZ2V0UmVzb3VyY2VFbGVtZW50Q3NzIH0gZnJvbSAnLi4vLi4vdXRpbHMnXG5pbXBvcnQgUHJvcGVydHlUeXBlIGZyb20gJy4uL3Byb3BlcnR5LXR5cGUnXG5cbmV4cG9ydCB0eXBlIEZpbHRlclByb3BzID0ge1xuICByZXNvdXJjZTogUmVzb3VyY2VKU09OO1xuICB0b2dnbGVGaWx0ZXI6ICgpID0+IHZvaWQ7XG4gIGlzVmlzaWJsZTogYm9vbGVhbjtcbn1cblxudHlwZSBNYXRjaFByb3BzID0ge1xuICByZXNvdXJjZUlkOiBzdHJpbmc7XG59XG5cbmNvbnN0IHBhcnNlUXVlcnkgPSAobG9jYXRpb24pOiBhbnkgPT4ge1xuICBjb25zdCBmaWx0ZXI6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fVxuICBjb25zdCBxdWVyeSA9IG5ldyBVUkxTZWFyY2hQYXJhbXMobG9jYXRpb24uc2VhcmNoKVxuICBmb3IgKGNvbnN0IGVudHJ5IG9mIHF1ZXJ5LmVudHJpZXMoKSkge1xuICAgIGNvbnN0IFtrZXksIHZhbHVlXSA9IGVudHJ5XG4gICAgaWYgKGtleS5tYXRjaCgnZmlsdGVycy4nKSkge1xuICAgICAgZmlsdGVyW2tleS5yZXBsYWNlKCdmaWx0ZXJzLicsICcnKV0gPSB2YWx1ZVxuICAgIH1cbiAgfVxuICByZXR1cm4gZmlsdGVyXG59XG5cbmNvbnN0IEZpbHRlckRyYXdlcjogUmVhY3QuRkM8RmlsdGVyUHJvcHM+ID0gKHByb3BzKSA9PiB7XG4gIGNvbnN0IHsgcmVzb3VyY2UsIGlzVmlzaWJsZSwgdG9nZ2xlRmlsdGVyIH0gPSBwcm9wc1xuICBjb25zdCBwcm9wZXJ0aWVzID0gcmVzb3VyY2UuZmlsdGVyUHJvcGVydGllc1xuXG4gIGNvbnN0IGxvY2F0aW9uID0gdXNlTG9jYXRpb24oKVxuICBjb25zdCBbZmlsdGVyLCBzZXRGaWx0ZXJdID0gdXNlU3RhdGUocGFyc2VRdWVyeShsb2NhdGlvbikpXG4gIGNvbnN0IHBhcmFtcyA9IHVzZVBhcmFtczxNYXRjaFByb3BzPigpXG4gIGNvbnN0IG5hdmlnYXRlID0gdXNlTmF2aWdhdGUoKVxuICBjb25zdCB7IHRyYW5zbGF0ZUxhYmVsLCB0cmFuc2xhdGVCdXR0b24gfSA9IHVzZVRyYW5zbGF0aW9uKClcbiAgY29uc3QgaW5pdGlhbExvYWQgPSB1c2VSZWYodHJ1ZSlcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChpbml0aWFsTG9hZC5jdXJyZW50KSB7XG4gICAgICBpbml0aWFsTG9hZC5jdXJyZW50ID0gZmFsc2VcbiAgICB9IGVsc2Uge1xuICAgICAgc2V0RmlsdGVyKHt9KVxuICAgIH1cbiAgfSwgW3BhcmFtcy5yZXNvdXJjZUlkXSlcblxuICBjb25zdCBoYW5kbGVTdWJtaXQgPSAoZXZlbnQ6IFN5bnRoZXRpY0V2ZW50KTogZmFsc2UgPT4ge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICBjb25zdCBzZWFyY2ggPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpXG4gICAgT2JqZWN0LmtleXMoZmlsdGVyKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgIGlmIChmaWx0ZXJba2V5XSAhPT0gJycpIHtcbiAgICAgICAgc2VhcmNoLnNldChgZmlsdGVycy4ke2tleX1gLCBmaWx0ZXJba2V5XSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNlYXJjaC5kZWxldGUoYGZpbHRlcnMuJHtrZXl9YClcbiAgICAgIH1cbiAgICB9KVxuICAgIHRvZ2dsZUZpbHRlcigpXG4gICAgc2VhcmNoLnNldCgncGFnZScsICcxJylcbiAgICBuYXZpZ2F0ZShgJHtsb2NhdGlvbi5wYXRobmFtZX0/JHtzZWFyY2gudG9TdHJpbmcoKX1gKVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgY29uc3QgcmVzZXRGaWx0ZXIgPSAoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkID0+IHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgY29uc3QgZmlsdGVyZWRTZWFyY2ggPSBuZXcgVVJMU2VhcmNoUGFyYW1zKClcbiAgICBjb25zdCBzZWFyY2ggPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpXG4gICAgZm9yIChjb25zdCBrZXkgb2Ygc2VhcmNoLmtleXMoKSkge1xuICAgICAgaWYgKCFrZXkubWF0Y2goJ2ZpbHRlcnMuJykpIHtcbiAgICAgICAgZmlsdGVyZWRTZWFyY2guc2V0KGtleSwgc2VhcmNoLmdldChrZXkpIGFzIHN0cmluZylcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcXVlcnkgPSBmaWx0ZXJlZFNlYXJjaC50b1N0cmluZygpID09PSAnJyA/IGA/JHtmaWx0ZXJlZFNlYXJjaC50b1N0cmluZygpfWAgOiAnJ1xuICAgIHRvZ2dsZUZpbHRlcigpXG4gICAgbmF2aWdhdGUobG9jYXRpb24ucGF0aG5hbWUgKyBxdWVyeSlcbiAgICBzZXRGaWx0ZXIoe30pXG4gIH1cblxuICBjb25zdCBoYW5kbGVDaGFuZ2UgPSAocHJvcGVydHlOYW1lOiBzdHJpbmcgfCBSZWNvcmRKU09OLCB2YWx1ZTogYW55KTogdm9pZCA9PiB7XG4gICAgaWYgKChwcm9wZXJ0eU5hbWUgYXMgUmVjb3JkSlNPTikucGFyYW1zKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3lvdSBjYW4gbm90IHBhc3MgUmVjb3JkSlNPTiB0byBmaWx0ZXJzJylcbiAgICB9XG4gICAgc2V0RmlsdGVyKHtcbiAgICAgIC4uLmZpbHRlcixcbiAgICAgIFtwcm9wZXJ0eU5hbWUgYXMgc3RyaW5nXTogdmFsdWUsXG4gICAgfSlcbiAgfVxuXG4gIGNvbnN0IGNvbnRlbnRUYWcgPSBnZXRSZXNvdXJjZUVsZW1lbnRDc3MocGFyYW1zLnJlc291cmNlSWQhLCAnZmlsdGVyLWRyYXdlcicpXG4gIGNvbnN0IGNzc0NvbnRlbnQgPSBnZXRSZXNvdXJjZUVsZW1lbnRDc3MocGFyYW1zLnJlc291cmNlSWQhLCAnZmlsdGVyLWRyYXdlci1jb250ZW50JylcbiAgY29uc3QgY3NzRm9vdGVyID0gZ2V0UmVzb3VyY2VFbGVtZW50Q3NzKHBhcmFtcy5yZXNvdXJjZUlkISwgJ2ZpbHRlci1kcmF3ZXItZm9vdGVyJylcbiAgY29uc3QgY3NzQnV0dG9uQXBwbHkgPSBnZXRSZXNvdXJjZUVsZW1lbnRDc3MocGFyYW1zLnJlc291cmNlSWQhLCAnZmlsdGVyLWRyYXdlci1idXR0b24tYXBwbHknKVxuICBjb25zdCBjc3NCdXR0b25SZXNldCA9IGdldFJlc291cmNlRWxlbWVudENzcyhwYXJhbXMucmVzb3VyY2VJZCEsICdmaWx0ZXItZHJhd2VyLWJ1dHRvbi1yZXNldCcpXG5cbiAgcmV0dXJuIChcbiAgICA8RHJhd2VyIHZhcmlhbnQ9XCJmaWx0ZXJcIiBpc0hpZGRlbj17IWlzVmlzaWJsZX0gYXM9XCJmb3JtXCIgb25TdWJtaXQ9e2hhbmRsZVN1Ym1pdH0gZGF0YS1jc3M9e2NvbnRlbnRUYWd9PlxuICAgICAgPERyYXdlckNvbnRlbnQgZGF0YS1jc3M9e2Nzc0NvbnRlbnR9PlxuICAgICAgICA8SDM+XG4gICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBzaXplPVwiaWNvblwiXG4gICAgICAgICAgICByb3VuZGVkXG4gICAgICAgICAgICBtcj1cImxnXCJcbiAgICAgICAgICAgIG9uQ2xpY2s9eygpOiB2b2lkID0+IHRvZ2dsZUZpbHRlcigpfVxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxJY29uIGljb249XCJDaGV2cm9uUmlnaHRcIiBjb2xvcj1cIndoaXRlXCIgLz5cbiAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICB7dHJhbnNsYXRlTGFiZWwoJ2ZpbHRlcnMnLCByZXNvdXJjZS5pZCl9XG4gICAgICAgIDwvSDM+XG4gICAgICAgIDxCb3ggbXk9XCJ4M1wiPlxuICAgICAgICAgIHtwcm9wZXJ0aWVzLm1hcCgocHJvcGVydHkpID0+IChcbiAgICAgICAgICAgIDxQcm9wZXJ0eVR5cGVcbiAgICAgICAgICAgICAga2V5PXtwcm9wZXJ0eS5wcm9wZXJ0eVBhdGh9XG4gICAgICAgICAgICAgIHdoZXJlPVwiZmlsdGVyXCJcbiAgICAgICAgICAgICAgb25DaGFuZ2U9e2hhbmRsZUNoYW5nZX1cbiAgICAgICAgICAgICAgcHJvcGVydHk9e3Byb3BlcnR5fVxuICAgICAgICAgICAgICBmaWx0ZXI9e2ZpbHRlcn1cbiAgICAgICAgICAgICAgcmVzb3VyY2U9e3Jlc291cmNlfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICApKX1cbiAgICAgICAgPC9Cb3g+XG4gICAgICA8L0RyYXdlckNvbnRlbnQ+XG4gICAgICA8RHJhd2VyRm9vdGVyIGRhdGEtY3NzPXtjc3NGb290ZXJ9PlxuICAgICAgICA8QnV0dG9uIHZhcmlhbnQ9XCJwcmltYXJ5XCIgc2l6ZT1cImxnXCIgZGF0YS1jc3M9e2Nzc0J1dHRvbkFwcGx5fT5cbiAgICAgICAgICB7dHJhbnNsYXRlQnV0dG9uKCdhcHBseUNoYW5nZXMnLCByZXNvdXJjZS5pZCl9XG4gICAgICAgIDwvQnV0dG9uPlxuICAgICAgICA8QnV0dG9uIHZhcmlhbnQ9XCJ0ZXh0XCIgc2l6ZT1cImxnXCIgb25DbGljaz17cmVzZXRGaWx0ZXJ9IHR5cGU9XCJidXR0b25cIiBjb2xvcj1cIndoaXRlXCIgZGF0YS1jc3M9e2Nzc0J1dHRvblJlc2V0fT5cbiAgICAgICAgICB7dHJhbnNsYXRlQnV0dG9uKCdyZXNldEZpbHRlcicsIHJlc291cmNlLmlkKX1cbiAgICAgICAgPC9CdXR0b24+XG4gICAgICA8L0RyYXdlckZvb3Rlcj5cbiAgICA8L0RyYXdlcj5cbiAgKVxufVxuXG5jb25zdCBPdmVycmlkYWJsZUZpbHRlckRyYXdlciA9IGFsbG93T3ZlcnJpZGUoRmlsdGVyRHJhd2VyLCAnRmlsdGVyRHJhd2VyJylcblxuZXhwb3J0IHtcbiAgT3ZlcnJpZGFibGVGaWx0ZXJEcmF3ZXIgYXMgZGVmYXVsdCxcbiAgT3ZlcnJpZGFibGVGaWx0ZXJEcmF3ZXIgYXMgRmlsdGVyRHJhd2VyLFxufVxuIiwiaW1wb3J0IFJlYWN0LCB7IHVzZVN0YXRlLCB1c2VFZmZlY3QsIHVzZUNhbGxiYWNrIH0gZnJvbSAncmVhY3QnXG5pbXBvcnQgeyB1c2VQYXJhbXMgfSBmcm9tICdyZWFjdC1yb3V0ZXInXG5pbXBvcnQgeyBMb2FkZXIgfSBmcm9tICdAYWRtaW5qcy9kZXNpZ24tc3lzdGVtJ1xuXG5pbXBvcnQgeyBFcnJvclR5cGVFbnVtIH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvZXJyb3ItdHlwZS5lbnVtJ1xuaW1wb3J0IEJhc2VBY3Rpb25Db21wb25lbnQgZnJvbSAnLi4vYXBwL2Jhc2UtYWN0aW9uLWNvbXBvbmVudCdcbmltcG9ydCBBcGlDbGllbnQgZnJvbSAnLi4vLi4vdXRpbHMvYXBpLWNsaWVudCdcbmltcG9ydCB7IFJlY29yZEFjdGlvblBhcmFtcyB9IGZyb20gJy4uLy4uLy4uL2JhY2tlbmQvdXRpbHMvdmlldy1oZWxwZXJzL3ZpZXctaGVscGVycydcbmltcG9ydCB7IEFjdGlvbkpTT04sIFJlY29yZEpTT04gfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzJ1xuaW1wb3J0IHsgTm9SZXNvdXJjZUVycm9yLCBOb0FjdGlvbkVycm9yLCBOb1JlY29yZEVycm9yIH0gZnJvbSAnLi4vYXBwL2Vycm9yLW1lc3NhZ2UnXG5pbXBvcnQgV3JhcHBlciBmcm9tICcuL3V0aWxzL3dyYXBwZXInXG5pbXBvcnQgeyBBY3Rpb25IZWFkZXIgfSBmcm9tICcuLi9hcHAnXG5pbXBvcnQgeyB1c2VOb3RpY2UsIHVzZVJlc291cmNlLCB1c2VUcmFuc2xhdGlvbiB9IGZyb20gJy4uLy4uL2hvb2tzJ1xuaW1wb3J0IERyYXdlclBvcnRhbCBmcm9tICcuLi9hcHAvZHJhd2VyLXBvcnRhbCdcbmltcG9ydCB7IEFjdGlvblJlc3BvbnNlLCBSZWNvcmRBY3Rpb25SZXNwb25zZSB9IGZyb20gJy4uLy4uLy4uL2JhY2tlbmQvYWN0aW9ucy9hY3Rpb24uaW50ZXJmYWNlJ1xuaW1wb3J0IG1lcmdlUmVjb3JkUmVzcG9uc2UgZnJvbSAnLi4vLi4vaG9va3MvdXNlLXJlY29yZC9tZXJnZS1yZWNvcmQtcmVzcG9uc2UnXG5pbXBvcnQgYWxsb3dPdmVycmlkZSBmcm9tICcuLi8uLi9ob2MvYWxsb3ctb3ZlcnJpZGUnXG5cbmNvbnN0IGFwaSA9IG5ldyBBcGlDbGllbnQoKVxuXG5jb25zdCBSZWNvcmRBY3Rpb246IFJlYWN0LkZDID0gKCkgPT4ge1xuICBjb25zdCBbcmVjb3JkLCBzZXRSZWNvcmRdID0gdXNlU3RhdGU8UmVjb3JkSlNPTj4oKVxuICBjb25zdCBbbG9hZGluZywgc2V0TG9hZGluZ10gPSB1c2VTdGF0ZSh0cnVlKVxuICBjb25zdCBwYXJhbXMgPSB1c2VQYXJhbXM8UmVjb3JkQWN0aW9uUGFyYW1zPigpXG4gIGNvbnN0IGFkZE5vdGljZSA9IHVzZU5vdGljZSgpXG4gIGNvbnN0IHsgdHJhbnNsYXRlTWVzc2FnZSB9ID0gdXNlVHJhbnNsYXRpb24oKVxuXG4gIGNvbnN0IHsgYWN0aW9uTmFtZSwgcmVjb3JkSWQsIHJlc291cmNlSWQgfSA9IHBhcmFtc1xuICBjb25zdCByZXNvdXJjZSA9IHVzZVJlc291cmNlKHJlc291cmNlSWQhKVxuXG4gIGNvbnN0IGFjdGlvbiA9IHJlY29yZCAmJiByZWNvcmQucmVjb3JkQWN0aW9ucy5maW5kKChyKSA9PiByLm5hbWUgPT09IGFjdGlvbk5hbWUpXG5cbiAgY29uc3QgZmV0Y2hSZWNvcmQgPSAoKTogdm9pZCA9PiB7XG4gICAgc2V0TG9hZGluZyh0cnVlKVxuICAgIGFwaS5yZWNvcmRBY3Rpb24ocGFyYW1zIGFzIFJlY29yZEFjdGlvblBhcmFtcykudGhlbigocmVzcG9uc2UpID0+IHtcbiAgICAgIGlmIChyZXNwb25zZS5kYXRhLm5vdGljZSAmJiByZXNwb25zZS5kYXRhLm5vdGljZS50eXBlID09PSAnZXJyb3InKSB7XG4gICAgICAgIGFkZE5vdGljZShyZXNwb25zZS5kYXRhLm5vdGljZSlcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgIXJlc3BvbnNlLmRhdGEucmVjb3JkPy5iYXNlRXJyb3I/LnR5cGVcbiAgICAgICAgfHwgIVtcbiAgICAgICAgICBFcnJvclR5cGVFbnVtLkFwcCxcbiAgICAgICAgICBFcnJvclR5cGVFbnVtLk5vdEZvdW5kLFxuICAgICAgICAgIEVycm9yVHlwZUVudW0uRm9yYmlkZGVuLFxuICAgICAgICBdLmluY2x1ZGVzKHJlc3BvbnNlLmRhdGEucmVjb3JkPy5iYXNlRXJyb3I/LnR5cGUgYXMgRXJyb3JUeXBlRW51bSlcbiAgICAgICkge1xuICAgICAgICBzZXRSZWNvcmQocmVzcG9uc2UuZGF0YS5yZWNvcmQpXG4gICAgICB9XG4gICAgfSkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICBhZGROb3RpY2Uoe1xuICAgICAgICBtZXNzYWdlOiB0cmFuc2xhdGVNZXNzYWdlKCdlcnJvckZldGNoaW5nUmVjb3JkJywgcmVzb3VyY2VJZCksXG4gICAgICAgIHR5cGU6ICdlcnJvcicsXG4gICAgICB9KVxuICAgICAgdGhyb3cgZXJyb3JcbiAgICB9KS5maW5hbGx5KCgpID0+IHtcbiAgICAgIHNldExvYWRpbmcoZmFsc2UpXG4gICAgfSlcbiAgfVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgZmV0Y2hSZWNvcmQoKVxuICB9LCBbYWN0aW9uTmFtZSwgcmVjb3JkSWQsIHJlc291cmNlSWRdKVxuXG4gIGNvbnN0IGhhbmRsZUFjdGlvblBlcmZvcm1lZCA9IHVzZUNhbGxiYWNrKChvbGRSZWNvcmQ6IFJlY29yZEpTT04sIHJlc3BvbnNlOiBBY3Rpb25SZXNwb25zZSkgPT4ge1xuICAgIGlmIChyZXNwb25zZS5yZWNvcmQpIHtcbiAgICAgIHNldFJlY29yZChtZXJnZVJlY29yZFJlc3BvbnNlKG9sZFJlY29yZCwgcmVzcG9uc2UgYXMgUmVjb3JkQWN0aW9uUmVzcG9uc2UpKVxuICAgIH0gZWxzZSB7XG4gICAgICBmZXRjaFJlY29yZCgpXG4gICAgfVxuICB9LCBbZmV0Y2hSZWNvcmRdKVxuXG4gIGlmICghcmVzb3VyY2UpIHtcbiAgICByZXR1cm4gKDxOb1Jlc291cmNlRXJyb3IgcmVzb3VyY2VJZD17cmVzb3VyY2VJZCF9IC8+KVxuICB9XG5cbiAgLy8gV2hlbiB0aGUgdXNlciB2aXNpdHMgdGhpcyByb3V0ZSAocmVjb3JkIGFjdGlvbikgZnJvbSBhIGRpZmZlcmVudCwgdGhhbiB0aGUgY3VycmVudCBvbmUsIHJlY29yZC5cbiAgLy8gSXQgcmVuZGVycyBldmVyeXRoaW5nIHdpdGggYSBuZXcgcmVzb3VyY2UuIFRoZSBvbGQgcmVjb3JkIHJlbWFpbnMgdW50aWwgdXNlRWZmZWN0IGZldGNoZXMgZGF0YVxuICAvLyBmcm9tIHRoZSBBUEkuIHRoYXQgaXMgd2h5IHdlIGhhdmUgdG8gY2hlY2sgaWYgdGhlIGN1cnJlbnQgcmVjb3JkIGhhcyBjb3JyZWN0IHJlY29yZC5pZC5cbiAgLy8gQWx0ZXJuYXRpdmUgYXBwcm9hY2ggd291bGQgYmUgdG8gc2V0UmVjb3JkKHVuZGVmaW5lZCkgYmVmb3JlIHRoZSBmZXRjaCwgYnV0IGl0IGlzIGFzeW5jIGFuZFxuICAvLyB3ZSBjYW5ub3QgYmUgc3VyZSB0aGF0IHRoZSBjb21wb25lbnQgd29udCBiZSByZW5kZXJlZCAoaXQgd2lsbCBiZSBhdCBsZWFzdCBvbmNlKSB3aXRoIHRoZVxuICAvLyB3cm9uZyBkYXRhLlxuICBjb25zdCBoYXNEaWZmZXJlbnRSZWNvcmQgPSByZWNvcmQgJiYgcmVjb3JkLmlkICYmIHJlY29yZC5pZC50b1N0cmluZygpICE9PSByZWNvcmRJZFxuXG4gIGlmIChsb2FkaW5nIHx8IGhhc0RpZmZlcmVudFJlY29yZCkge1xuICAgIGNvbnN0IGFjdGlvbkZyb21SZXNvdXJjZSA9IHJlc291cmNlLmFjdGlvbnMuZmluZCgocikgPT4gci5uYW1lID09PSBhY3Rpb25OYW1lKVxuICAgIHJldHVybiBhY3Rpb25Gcm9tUmVzb3VyY2U/LnNob3dJbkRyYXdlciA/ICg8RHJhd2VyUG9ydGFsPjxMb2FkZXIgLz48L0RyYXdlclBvcnRhbD4pIDogPExvYWRlciAvPlxuICB9XG5cbiAgaWYgKCFhY3Rpb24pIHtcbiAgICByZXR1cm4gKDxOb0FjdGlvbkVycm9yIHJlc291cmNlSWQ9e3Jlc291cmNlSWQhfSBhY3Rpb25OYW1lPXthY3Rpb25OYW1lIX0gLz4pXG4gIH1cblxuICBpZiAoIXJlY29yZCkge1xuICAgIHJldHVybiAoPE5vUmVjb3JkRXJyb3IgcmVzb3VyY2VJZD17cmVzb3VyY2VJZCF9IHJlY29yZElkPXtyZWNvcmRJZCF9IC8+KVxuICB9XG5cbiAgaWYgKGFjdGlvbi5zaG93SW5EcmF3ZXIpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPERyYXdlclBvcnRhbCB3aWR0aD17YWN0aW9uLmNvbnRhaW5lcldpZHRofT5cbiAgICAgICAgPEJhc2VBY3Rpb25Db21wb25lbnRcbiAgICAgICAgICBhY3Rpb249e2FjdGlvbiBhcyBBY3Rpb25KU09OfVxuICAgICAgICAgIHJlc291cmNlPXtyZXNvdXJjZX1cbiAgICAgICAgICByZWNvcmQ9e3JlY29yZH1cbiAgICAgICAgLz5cbiAgICAgIDwvRHJhd2VyUG9ydGFsPlxuICAgIClcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPFdyYXBwZXIgd2lkdGg9e2FjdGlvbi5jb250YWluZXJXaWR0aH0+XG4gICAgICA8QWN0aW9uSGVhZGVyXG4gICAgICAgIHJlc291cmNlPXtyZXNvdXJjZX1cbiAgICAgICAgYWN0aW9uPXthY3Rpb259XG4gICAgICAgIHJlY29yZD17cmVjb3JkfVxuICAgICAgICBhY3Rpb25QZXJmb3JtZWQ9eyhyZXNwb25zZTogQWN0aW9uUmVzcG9uc2UpOiB2b2lkID0+IChcbiAgICAgICAgICBoYW5kbGVBY3Rpb25QZXJmb3JtZWQocmVjb3JkLCByZXNwb25zZSlcbiAgICAgICAgKX1cbiAgICAgIC8+XG4gICAgICA8QmFzZUFjdGlvbkNvbXBvbmVudFxuICAgICAgICBhY3Rpb249e2FjdGlvbn1cbiAgICAgICAgcmVzb3VyY2U9e3Jlc291cmNlfVxuICAgICAgICByZWNvcmQ9e3JlY29yZH1cbiAgICAgIC8+XG4gICAgPC9XcmFwcGVyPlxuICApXG59XG5cbmV4cG9ydCBkZWZhdWx0IGFsbG93T3ZlcnJpZGUoUmVjb3JkQWN0aW9uLCAnUmVjb3JkQWN0aW9uUm91dGUnKVxuIiwiaW1wb3J0IFJlYWN0LCB7IHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBjb25uZWN0IH0gZnJvbSAncmVhY3QtcmVkdXgnXG5cbmltcG9ydCB7IHVzZVBhcmFtcyB9IGZyb20gJ3JlYWN0LXJvdXRlcidcbmltcG9ydCBCYXNlQWN0aW9uQ29tcG9uZW50IGZyb20gJy4uL2FwcC9iYXNlLWFjdGlvbi1jb21wb25lbnQnXG5pbXBvcnQgeyBSZXNvdXJjZUpTT04gfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzJ1xuaW1wb3J0IHsgUmVkdXhTdGF0ZSB9IGZyb20gJy4uLy4uL3N0b3JlL3N0b3JlJ1xuaW1wb3J0IHsgTm9SZXNvdXJjZUVycm9yLCBOb0FjdGlvbkVycm9yIH0gZnJvbSAnLi4vYXBwL2Vycm9yLW1lc3NhZ2UnXG5pbXBvcnQgeyBSZXNvdXJjZUFjdGlvblBhcmFtcyB9IGZyb20gJy4uLy4uLy4uL2JhY2tlbmQvdXRpbHMvdmlldy1oZWxwZXJzL3ZpZXctaGVscGVycydcbmltcG9ydCB7IEFjdGlvbkhlYWRlciB9IGZyb20gJy4uL2FwcCdcbmltcG9ydCBXcmFwcGVyIGZyb20gJy4vdXRpbHMvd3JhcHBlcidcbmltcG9ydCBEcmF3ZXJQb3J0YWwgZnJvbSAnLi4vYXBwL2RyYXdlci1wb3J0YWwnXG5pbXBvcnQgRmlsdGVyRHJhd2VyIGZyb20gJy4uL2FwcC9maWx0ZXItZHJhd2VyJ1xuaW1wb3J0IGFsbG93T3ZlcnJpZGUgZnJvbSAnLi4vLi4vaG9jL2FsbG93LW92ZXJyaWRlJ1xuXG50eXBlIFByb3BzRnJvbVN0YXRlID0ge1xuICByZXNvdXJjZXM6IEFycmF5PFJlc291cmNlSlNPTj47XG59XG5cbnR5cGUgUHJvcHMgPSBQcm9wc0Zyb21TdGF0ZVxuXG5jb25zdCBSZXNvdXJjZUFjdGlvbjogUmVhY3QuRkM8UHJvcHM+ID0gKHByb3BzKSA9PiB7XG4gIGNvbnN0IHBhcmFtcyA9IHVzZVBhcmFtczxSZXNvdXJjZUFjdGlvblBhcmFtcz4oKVxuICBjb25zdCB7IHJlc291cmNlcyB9ID0gcHJvcHNcbiAgY29uc3QgeyByZXNvdXJjZUlkLCBhY3Rpb25OYW1lIH0gPSBwYXJhbXNcbiAgY29uc3QgW2ZpbHRlclZpc2libGUsIHNldEZpbHRlclZpc2libGVdID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IFt0YWcsIHNldFRhZ10gPSB1c2VTdGF0ZSgnJylcblxuICBjb25zdCByZXNvdXJjZSA9IHJlc291cmNlcy5maW5kKChyKSA9PiByLmlkID09PSByZXNvdXJjZUlkKVxuICBpZiAoIXJlc291cmNlKSB7XG4gICAgcmV0dXJuICg8Tm9SZXNvdXJjZUVycm9yIHJlc291cmNlSWQ9e3Jlc291cmNlSWQhfSAvPilcbiAgfVxuICBjb25zdCBhY3Rpb24gPSByZXNvdXJjZS5yZXNvdXJjZUFjdGlvbnMuZmluZCgocikgPT4gci5uYW1lID09PSBhY3Rpb25OYW1lKVxuICBpZiAoIWFjdGlvbikge1xuICAgIHJldHVybiAoPE5vQWN0aW9uRXJyb3IgcmVzb3VyY2VJZD17cmVzb3VyY2VJZCF9IGFjdGlvbk5hbWU9e2FjdGlvbk5hbWUhfSAvPilcbiAgfVxuXG4gIGNvbnN0IHRvZ2dsZUZpbHRlciA9IGFjdGlvbi5zaG93RmlsdGVyXG4gICAgPyAoKCk6IHZvaWQgPT4gc2V0RmlsdGVyVmlzaWJsZSghZmlsdGVyVmlzaWJsZSkpXG4gICAgOiB1bmRlZmluZWRcblxuICBpZiAoYWN0aW9uLnNob3dJbkRyYXdlcikge1xuICAgIHJldHVybiAoXG4gICAgICA8RHJhd2VyUG9ydGFsIHdpZHRoPXthY3Rpb24uY29udGFpbmVyV2lkdGh9PlxuICAgICAgICA8QmFzZUFjdGlvbkNvbXBvbmVudFxuICAgICAgICAgIGFjdGlvbj17YWN0aW9ufVxuICAgICAgICAgIHJlc291cmNlPXtyZXNvdXJjZX1cbiAgICAgICAgLz5cbiAgICAgIDwvRHJhd2VyUG9ydGFsPlxuICAgIClcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPFdyYXBwZXIgd2lkdGg9e2FjdGlvbi5jb250YWluZXJXaWR0aH0gc2hvd0ZpbHRlcj17YWN0aW9uLnNob3dGaWx0ZXJ9PlxuICAgICAgPEFjdGlvbkhlYWRlclxuICAgICAgICByZXNvdXJjZT17cmVzb3VyY2V9XG4gICAgICAgIGFjdGlvbj17YWN0aW9ufVxuICAgICAgICB0b2dnbGVGaWx0ZXI9e3RvZ2dsZUZpbHRlcn1cbiAgICAgICAgdGFnPXt0YWd9XG4gICAgICAvPlxuICAgICAgPEJhc2VBY3Rpb25Db21wb25lbnRcbiAgICAgICAgYWN0aW9uPXthY3Rpb259XG4gICAgICAgIHJlc291cmNlPXtyZXNvdXJjZX1cbiAgICAgICAgc2V0VGFnPXtzZXRUYWd9XG4gICAgICAvPlxuICAgICAge2FjdGlvbi5zaG93RmlsdGVyID8gKFxuICAgICAgICA8RmlsdGVyRHJhd2VyXG4gICAgICAgICAga2V5PXtmaWx0ZXJWaXNpYmxlLnRvU3RyaW5nKCl9XG4gICAgICAgICAgcmVzb3VyY2U9e3Jlc291cmNlfVxuICAgICAgICAgIGlzVmlzaWJsZT17ZmlsdGVyVmlzaWJsZX1cbiAgICAgICAgICB0b2dnbGVGaWx0ZXI9e3RvZ2dsZUZpbHRlciF9XG4gICAgICAgIC8+XG4gICAgICApIDogJyd9XG4gICAgPC9XcmFwcGVyPlxuICApXG59XG5cbmNvbnN0IG1hcFN0YXRlVG9Qcm9wcyA9IChzdGF0ZTogUmVkdXhTdGF0ZSk6IFByb3BzRnJvbVN0YXRlID0+ICh7XG4gIHJlc291cmNlczogc3RhdGUucmVzb3VyY2VzLFxufSlcblxuZXhwb3J0IGRlZmF1bHQgYWxsb3dPdmVycmlkZShjb25uZWN0KG1hcFN0YXRlVG9Qcm9wcykoUmVzb3VyY2VBY3Rpb24pLCAnUmVzb3VyY2VBY3Rpb25Sb3V0ZScpXG4iLCJpbXBvcnQgUmVhY3QsIHsgdXNlU3RhdGUsIHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgTG9hZGVyIH0gZnJvbSAnQGFkbWluanMvZGVzaWduLXN5c3RlbSdcbmltcG9ydCB7IHVzZUxvY2F0aW9uLCB1c2VQYXJhbXMgfSBmcm9tICdyZWFjdC1yb3V0ZXInXG5cbmltcG9ydCB7IEJ1bGtBY3Rpb25QYXJhbXMgfSBmcm9tICcuLi8uLi8uLi9iYWNrZW5kL3V0aWxzL3ZpZXctaGVscGVycy92aWV3LWhlbHBlcnMnXG5cbmltcG9ydCBBcGlDbGllbnQgZnJvbSAnLi4vLi4vdXRpbHMvYXBpLWNsaWVudCdcbmltcG9ydCBnZXRCdWxrQWN0aW9uc0Zyb21SZWNvcmRzIGZyb20gJy4uL2FwcC9yZWNvcmRzLXRhYmxlL3V0aWxzL2dldC1idWxrLWFjdGlvbnMtZnJvbS1yZWNvcmRzJ1xuaW1wb3J0IHsgQWN0aW9uSlNPTiwgUmVjb3JkSlNPTiB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMnXG5pbXBvcnQgV3JhcHBlciBmcm9tICcuL3V0aWxzL3dyYXBwZXInXG5pbXBvcnQge1xuICBBY3Rpb25IZWFkZXIsXG4gIERyYXdlclBvcnRhbCxcbiAgQmFzZUFjdGlvbkNvbXBvbmVudCxcbiAgRXJyb3JNZXNzYWdlQm94LFxuICBOb1Jlc291cmNlRXJyb3IsXG4gIE5vQWN0aW9uRXJyb3IsXG59IGZyb20gJy4uL2FwcCdcbmltcG9ydCB7IHVzZVRyYW5zbGF0aW9uLCB1c2VOb3RpY2UsIHVzZVJlc291cmNlIH0gZnJvbSAnLi4vLi4vaG9va3MnXG5pbXBvcnQgYWxsb3dPdmVycmlkZSBmcm9tICcuLi8uLi9ob2MvYWxsb3ctb3ZlcnJpZGUnXG5cbnR5cGUgTWF0Y2hQYXJhbXMgPSBQaWNrPEJ1bGtBY3Rpb25QYXJhbXMsICdhY3Rpb25OYW1lJyB8ICdyZXNvdXJjZUlkJz5cblxuY29uc3QgYXBpID0gbmV3IEFwaUNsaWVudCgpXG5cbmNvbnN0IEJ1bGtBY3Rpb246IFJlYWN0LkZDID0gKCkgPT4ge1xuICBjb25zdCBwYXJhbXMgPSB1c2VQYXJhbXM8TWF0Y2hQYXJhbXM+KClcbiAgY29uc3QgW3JlY29yZHMsIHNldFJlY29yZHNdID0gdXNlU3RhdGU8QXJyYXk8UmVjb3JkSlNPTj4+KFtdKVxuICBjb25zdCBbbG9hZGluZywgc2V0TG9hZGluZ10gPSB1c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgeyB0cmFuc2xhdGVNZXNzYWdlIH0gPSB1c2VUcmFuc2xhdGlvbigpXG4gIGNvbnN0IGFkZE5vdGljZSA9IHVzZU5vdGljZSgpXG4gIGNvbnN0IGxvY2F0aW9uID0gdXNlTG9jYXRpb24oKVxuXG4gIGNvbnN0IHsgcmVzb3VyY2VJZCwgYWN0aW9uTmFtZSB9ID0gcGFyYW1zXG4gIGNvbnN0IHJlc291cmNlID0gdXNlUmVzb3VyY2UocmVzb3VyY2VJZCEpXG5cbiAgY29uc3QgZmV0Y2hSZWNvcmRzID0gKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGNvbnN0IHJlY29yZElkc1N0cmluZyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMobG9jYXRpb24uc2VhcmNoKS5nZXQoJ3JlY29yZElkcycpXG4gICAgY29uc3QgcmVjb3JkSWRzID0gcmVjb3JkSWRzU3RyaW5nID8gcmVjb3JkSWRzU3RyaW5nLnNwbGl0KCcsJykgOiBbXVxuICAgIHNldExvYWRpbmcodHJ1ZSlcblxuICAgIHJldHVybiBhcGkuYnVsa0FjdGlvbih7XG4gICAgICByZXNvdXJjZUlkOiByZXNvdXJjZUlkISxcbiAgICAgIHJlY29yZElkcyxcbiAgICAgIGFjdGlvbk5hbWU6IGFjdGlvbk5hbWUhLFxuICAgIH0pLnRoZW4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBzZXRMb2FkaW5nKGZhbHNlKVxuICAgICAgc2V0UmVjb3JkcyhyZXNwb25zZS5kYXRhLnJlY29yZHMpXG4gICAgfSkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICBzZXRMb2FkaW5nKGZhbHNlKVxuICAgICAgYWRkTm90aWNlKHtcbiAgICAgICAgbWVzc2FnZTogdHJhbnNsYXRlTWVzc2FnZSgnZXJyb3JGZXRjaGluZ1JlY29yZHMnLCByZXNvdXJjZUlkKSxcbiAgICAgICAgdHlwZTogJ2Vycm9yJyxcbiAgICAgIH0pXG4gICAgICB0aHJvdyBlcnJvclxuICAgIH0pXG4gIH1cblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGZldGNoUmVjb3JkcygpXG4gIH0sIFtwYXJhbXMucmVzb3VyY2VJZCwgcGFyYW1zLmFjdGlvbk5hbWVdKVxuXG4gIGlmICghcmVzb3VyY2UpIHtcbiAgICByZXR1cm4gKDxOb1Jlc291cmNlRXJyb3IgcmVzb3VyY2VJZD17cmVzb3VyY2VJZCF9IC8+KVxuICB9XG5cbiAgaWYgKCFyZWNvcmRzICYmICFsb2FkaW5nKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxFcnJvck1lc3NhZ2VCb3ggdGl0bGU9XCJObyByZWNvcmRzXCI+XG4gICAgICAgIDxwPnt0cmFuc2xhdGVNZXNzYWdlKCdub1JlY29yZHNTZWxlY3RlZCcsIHJlc291cmNlSWQpfTwvcD5cbiAgICAgIDwvRXJyb3JNZXNzYWdlQm94PlxuICAgIClcbiAgfVxuXG4gIGNvbnN0IGFjdGlvbiA9IGdldEJ1bGtBY3Rpb25zRnJvbVJlY29yZHMocmVjb3JkcyB8fCBbXSkuZmluZCgocikgPT4gci5uYW1lID09PSBhY3Rpb25OYW1lKVxuXG4gIGlmIChsb2FkaW5nKSB7XG4gICAgY29uc3QgYWN0aW9uRnJvbVJlc291cmNlID0gcmVzb3VyY2UuYWN0aW9ucy5maW5kKChyKSA9PiByLm5hbWUgPT09IGFjdGlvbk5hbWUpXG4gICAgcmV0dXJuIGFjdGlvbkZyb21SZXNvdXJjZT8uc2hvd0luRHJhd2VyID8gKDxEcmF3ZXJQb3J0YWw+PExvYWRlciAvPjwvRHJhd2VyUG9ydGFsPikgOiA8TG9hZGVyIC8+XG4gIH1cblxuICBpZiAoIWFjdGlvbikge1xuICAgIHJldHVybiAoPE5vQWN0aW9uRXJyb3IgcmVzb3VyY2VJZD17cmVzb3VyY2VJZCF9IGFjdGlvbk5hbWU9e2FjdGlvbk5hbWUhfSAvPilcbiAgfVxuXG4gIGlmIChhY3Rpb24uc2hvd0luRHJhd2VyKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxEcmF3ZXJQb3J0YWwgd2lkdGg9e2FjdGlvbi5jb250YWluZXJXaWR0aH0+XG4gICAgICAgIDxCYXNlQWN0aW9uQ29tcG9uZW50XG4gICAgICAgICAgYWN0aW9uPXthY3Rpb24gYXMgQWN0aW9uSlNPTn1cbiAgICAgICAgICByZXNvdXJjZT17cmVzb3VyY2V9XG4gICAgICAgICAgcmVjb3Jkcz17cmVjb3Jkc31cbiAgICAgICAgLz5cbiAgICAgIDwvRHJhd2VyUG9ydGFsPlxuICAgIClcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPFdyYXBwZXIgd2lkdGg9e2FjdGlvbi5jb250YWluZXJXaWR0aH0+XG4gICAgICB7IWFjdGlvbj8uc2hvd0luRHJhd2VyID8gKFxuICAgICAgICA8QWN0aW9uSGVhZGVyXG4gICAgICAgICAgcmVzb3VyY2U9e3Jlc291cmNlfVxuICAgICAgICAgIGFjdGlvbj17YWN0aW9ufVxuICAgICAgICAvPlxuICAgICAgKSA6ICcnfVxuICAgICAgPEJhc2VBY3Rpb25Db21wb25lbnRcbiAgICAgICAgYWN0aW9uPXthY3Rpb24gYXMgQWN0aW9uSlNPTn1cbiAgICAgICAgcmVzb3VyY2U9e3Jlc291cmNlfVxuICAgICAgICByZWNvcmRzPXtyZWNvcmRzfVxuICAgICAgLz5cbiAgICA8L1dyYXBwZXI+XG4gIClcbn1cblxuZXhwb3J0IGRlZmF1bHQgYWxsb3dPdmVycmlkZShCdWxrQWN0aW9uLCAnQnVsa0FjdGlvblJvdXRlJylcbiIsImltcG9ydCBSZWFjdCwgeyBGdW5jdGlvbkNvbXBvbmVudCwgdXNlU3RhdGUsIHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgdXNlU2VsZWN0b3IgfSBmcm9tICdyZWFjdC1yZWR1eCdcbmltcG9ydCB7IHVzZVBhcmFtcyB9IGZyb20gJ3JlYWN0LXJvdXRlcidcblxuaW1wb3J0IEVycm9yQm91bmRhcnkgZnJvbSAnLi4vYXBwL2Vycm9yLWJvdW5kYXJ5J1xuaW1wb3J0IHsgUmVkdXhTdGF0ZSB9IGZyb20gJy4uLy4uL3N0b3JlL3N0b3JlJ1xuaW1wb3J0IEVycm9yTWVzc2FnZUJveCBmcm9tICcuLi9hcHAvZXJyb3ItbWVzc2FnZSdcbmltcG9ydCBhbGxvd092ZXJyaWRlIGZyb20gJy4uLy4uL2hvYy9hbGxvdy1vdmVycmlkZSdcblxuZGVjbGFyZSBjb25zdCBBZG1pbkpTOiB7XG4gIFVzZXJDb21wb25lbnRzOiBSZWNvcmQ8c3RyaW5nLCBGdW5jdGlvbkNvbXBvbmVudD47XG59XG5cbnR5cGUgUGFnZVJvdXRlUHJvcHMgPSB7XG4gIHBhZ2VOYW1lOiBzdHJpbmc7XG59XG5cbmNvbnN0IFBhZ2U6IFJlYWN0LkZDID0gKCkgPT4ge1xuICBjb25zdCBbcGFnZXNdID0gdXNlU2VsZWN0b3IoKHN0YXRlOiBSZWR1eFN0YXRlKSA9PiBbc3RhdGUucGFnZXNdKVxuICBjb25zdCBwYXJhbXMgPSB1c2VQYXJhbXM8UGFnZVJvdXRlUHJvcHM+KClcbiAgY29uc3QgeyBwYWdlTmFtZSB9ID0gcGFyYW1zXG4gIGNvbnN0IFtpc0NsaWVudCwgc2V0SXNDbGllbnRdID0gdXNlU3RhdGUoZmFsc2UpXG5cbiAgY29uc3QgY3VycmVudFBhZ2UgPSBwYWdlcy5maW5kKChwYWdlKSA9PiBwYWdlLm5hbWUgPT09IHBhZ2VOYW1lKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgc2V0SXNDbGllbnQodHJ1ZSlcbiAgfSwgW10pXG5cbiAgaWYgKCFjdXJyZW50UGFnZSkge1xuICAgIHJldHVybiAoXG4gICAgICA8RXJyb3JNZXNzYWdlQm94IHRpdGxlPVwiVGhlcmUgaXMgbm8gcGFnZSBvZiBnaXZlbiBuYW1lXCI+XG4gICAgICAgIDxwPlxuICAgICAgICAgIFBhZ2U6XG4gICAgICAgICAgPGI+e2AgXCIke3BhZ2VOYW1lfVwiIGB9PC9iPlxuICAgICAgICAgIGRvZXMgbm90IGV4aXN0LlxuICAgICAgICA8L3A+XG4gICAgICA8L0Vycm9yTWVzc2FnZUJveD5cbiAgICApXG4gIH1cblxuICBjb25zdCBDb21wb25lbnQgPSBBZG1pbkpTLlVzZXJDb21wb25lbnRzW2N1cnJlbnRQYWdlLmNvbXBvbmVudF1cblxuICBpZiAoIUNvbXBvbmVudCB8fCAhaXNDbGllbnQpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPEVycm9yTWVzc2FnZUJveCB0aXRsZT1cIk5vIGNvbXBvbmVudCBzcGVjaWZpZWRcIj5cbiAgICAgICAgPHA+WW91IGhhdmUgdG8gc3BlY2lmeSBjb21wb25lbnQgd2hpY2ggd2lsbCByZW5kZXIgdGhpcyBQYWdlPC9wPlxuICAgICAgPC9FcnJvck1lc3NhZ2VCb3g+XG4gICAgKVxuICB9XG5cbiAgcmV0dXJuIChcbiAgICA8RXJyb3JCb3VuZGFyeT5cbiAgICAgIDxDb21wb25lbnQgLz5cbiAgICA8L0Vycm9yQm91bmRhcnk+XG4gIClcbn1cblxuZXhwb3J0IGRlZmF1bHQgYWxsb3dPdmVycmlkZShQYWdlLCAnUGFnZVJvdXRlJylcbiIsImltcG9ydCB7IEJveCB9IGZyb20gJ0BhZG1pbmpzL2Rlc2lnbi1zeXN0ZW0nXG5pbXBvcnQgUmVhY3QsIHsgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCdcbmltcG9ydCB7IGNvbm5lY3QgfSBmcm9tICdyZWFjdC1yZWR1eCdcbmltcG9ydCB7IHVzZU1hdGNoLCB1c2VQYXJhbXMgfSBmcm9tICdyZWFjdC1yb3V0ZXInXG5cbmltcG9ydCBWaWV3SGVscGVycywgeyBSZXNvdXJjZUFjdGlvblBhcmFtcyB9IGZyb20gJy4uLy4uLy4uL2JhY2tlbmQvdXRpbHMvdmlldy1oZWxwZXJzL3ZpZXctaGVscGVycydcbmltcG9ydCBhbGxvd092ZXJyaWRlIGZyb20gJy4uLy4uL2hvYy9hbGxvdy1vdmVycmlkZSdcbmltcG9ydCB7IEFjdGlvbkpTT04sIFJlc291cmNlSlNPTiB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMnXG5pbXBvcnQgeyBSZWR1eFN0YXRlIH0gZnJvbSAnLi4vLi4vc3RvcmUvc3RvcmUnXG5pbXBvcnQgeyBnZXRSZXNvdXJjZUVsZW1lbnRDc3MgfSBmcm9tICcuLi8uLi91dGlscydcbmltcG9ydCB7IEFjdGlvbkhlYWRlciB9IGZyb20gJy4uL2FwcCdcbmltcG9ydCBCYXNlQWN0aW9uIGZyb20gJy4uL2FwcC9iYXNlLWFjdGlvbi1jb21wb25lbnQnXG5pbXBvcnQgeyBOb0FjdGlvbkVycm9yLCBOb1Jlc291cmNlRXJyb3IgfSBmcm9tICcuLi9hcHAvZXJyb3ItbWVzc2FnZSdcbmltcG9ydCBGaWx0ZXJEcmF3ZXIgZnJvbSAnLi4vYXBwL2ZpbHRlci1kcmF3ZXInXG5cbnR5cGUgUHJvcHNGcm9tU3RhdGUgPSB7XG4gIHJlc291cmNlczogQXJyYXk8UmVzb3VyY2VKU09OPjtcbn1cblxudHlwZSBQcm9wcyA9IFByb3BzRnJvbVN0YXRlXG5cbnR5cGUgU3RyaW5naWZpZWRCdWxrPFQ+ID0gT21pdDxULCAncmVjb3Jkc0lkJz4gJiB7XG4gIHJlY29yZHNJZHM/OiBzdHJpbmc7XG59XG5cbmNvbnN0IGdldEFjdGlvbiA9IChyZXNvdXJjZTogUmVzb3VyY2VKU09OKTogQWN0aW9uSlNPTiB8IHVuZGVmaW5lZCA9PiB7XG4gIGNvbnN0IGggPSBuZXcgVmlld0hlbHBlcnMoKVxuXG4gIGNvbnN0IHJlc291cmNlSWQgPSAnOnJlc291cmNlSWQnXG4gIGNvbnN0IGFjdGlvbk5hbWUgPSAnOmFjdGlvbk5hbWUnXG4gIGNvbnN0IHJlY29yZElkID0gJzpyZWNvcmRJZCdcblxuICBjb25zdCByZWNvcmRBY3Rpb25VcmwgPSBoLnJlY29yZEFjdGlvblVybCh7IHJlc291cmNlSWQsIHJlY29yZElkLCBhY3Rpb25OYW1lIH0pXG4gIGNvbnN0IHJlc291cmNlQWN0aW9uVXJsID0gaC5yZXNvdXJjZUFjdGlvblVybCh7IHJlc291cmNlSWQsIGFjdGlvbk5hbWUgfSlcbiAgY29uc3QgYnVsa0FjdGlvblVybCA9IGguYnVsa0FjdGlvblVybCh7IHJlc291cmNlSWQsIGFjdGlvbk5hbWUgfSlcblxuICBjb25zdCByZXNvdXJjZUFjdGlvbk1hdGNoID0gdXNlTWF0Y2goXG4gICAgcmVzb3VyY2VBY3Rpb25VcmwsXG4gIClcbiAgY29uc3QgcmVjb3JkQWN0aW9uTWF0Y2ggPSB1c2VNYXRjaChyZWNvcmRBY3Rpb25VcmwpXG4gIGNvbnN0IGJ1bGtBY3Rpb25NYXRjaCA9IHVzZU1hdGNoKGJ1bGtBY3Rpb25VcmwpXG5cbiAgY29uc3QgYWN0aW9uID0gcmVzb3VyY2VBY3Rpb25NYXRjaD8ucGFyYW1zLmFjdGlvbk5hbWVcbiAgICB8fCByZWNvcmRBY3Rpb25NYXRjaD8ucGFyYW1zLmFjdGlvbk5hbWVcbiAgICB8fCBidWxrQWN0aW9uTWF0Y2g/LnBhcmFtcy5hY3Rpb25OYW1lXG5cbiAgcmV0dXJuIGFjdGlvbiA/IHJlc291cmNlLmFjdGlvbnMuZmluZCgoYSkgPT4gYS5uYW1lID09PSBhY3Rpb24pIDogdW5kZWZpbmVkXG59XG5cbmNvbnN0IFJlc291cmNlQWN0aW9uOiBSZWFjdC5GQzxQcm9wcz4gPSAocHJvcHMpID0+IHtcbiAgY29uc3QgcGFyYW1zID0gdXNlUGFyYW1zPFN0cmluZ2lmaWVkQnVsazxSZXNvdXJjZUFjdGlvblBhcmFtcz4+KClcbiAgY29uc3QgeyByZXNvdXJjZXMgfSA9IHByb3BzXG4gIGNvbnN0IHsgcmVzb3VyY2VJZCB9ID0gcGFyYW1zXG5cbiAgY29uc3QgW2ZpbHRlclZpc2libGUsIHNldEZpbHRlclZpc2libGVdID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IFt0YWcsIHNldFRhZ10gPSB1c2VTdGF0ZSgnJylcblxuICBpZiAoIXJlc291cmNlSWQpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgY29uc3QgcmVzb3VyY2UgPSByZXNvdXJjZXMuZmluZCgocikgPT4gci5pZCA9PT0gcmVzb3VyY2VJZClcbiAgaWYgKCFyZXNvdXJjZSkge1xuICAgIHJldHVybiAoPE5vUmVzb3VyY2VFcnJvciByZXNvdXJjZUlkPXtyZXNvdXJjZUlkfSAvPilcbiAgfVxuXG4gIGNvbnN0IHJlYWxFbmRBY3Rpb24gPSBnZXRBY3Rpb24ocmVzb3VyY2UpXG4gIGlmIChyZWFsRW5kQWN0aW9uICYmICFyZWFsRW5kQWN0aW9uLnNob3dJbkRyYXdlcikge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBjb25zdCBsaXN0QWN0aW9uTmFtZSA9ICdsaXN0J1xuICBjb25zdCBsaXN0QWN0aW9uID0gcmVzb3VyY2UucmVzb3VyY2VBY3Rpb25zLmZpbmQoKHIpID0+IHIubmFtZSA9PT0gbGlzdEFjdGlvbk5hbWUpXG5cbiAgaWYgKCFsaXN0QWN0aW9uKSB7XG4gICAgcmV0dXJuICg8Tm9BY3Rpb25FcnJvciByZXNvdXJjZUlkPXtyZXNvdXJjZUlkfSBhY3Rpb25OYW1lPXtsaXN0QWN0aW9uTmFtZX0gLz4pXG4gIH1cblxuICBjb25zdCB0b2dnbGVGaWx0ZXIgPSBsaXN0QWN0aW9uLnNob3dGaWx0ZXJcbiAgICA/ICgoKTogdm9pZCA9PiBzZXRGaWx0ZXJWaXNpYmxlKCFmaWx0ZXJWaXNpYmxlKSlcbiAgICA6IHVuZGVmaW5lZFxuXG4gIGNvbnN0IGNvbnRlbnRUYWcgPSBnZXRSZXNvdXJjZUVsZW1lbnRDc3MocmVzb3VyY2UuaWQsICdsaXN0JylcblxuICByZXR1cm4gKFxuICAgIDxCb3ggdmFyaWFudD1cImdyZXlcIiB3aWR0aD17bGlzdEFjdGlvbi5jb250YWluZXJXaWR0aH0gbXg9XCJhdXRvXCIgZGF0YS1jc3M9e2NvbnRlbnRUYWd9PlxuICAgICAgPEFjdGlvbkhlYWRlclxuICAgICAgICByZXNvdXJjZT17cmVzb3VyY2V9XG4gICAgICAgIGFjdGlvbj17bGlzdEFjdGlvbn1cbiAgICAgICAgdGFnPXt0YWd9XG4gICAgICAgIHRvZ2dsZUZpbHRlcj17dG9nZ2xlRmlsdGVyfVxuICAgICAgLz5cbiAgICAgIDxCYXNlQWN0aW9uIGFjdGlvbj17bGlzdEFjdGlvbn0gcmVzb3VyY2U9e3Jlc291cmNlfSBzZXRUYWc9e3NldFRhZ30gLz5cbiAgICAgIHtsaXN0QWN0aW9uLnNob3dGaWx0ZXIgPyAoXG4gICAgICAgIDxGaWx0ZXJEcmF3ZXJcbiAgICAgICAgICBrZXk9e2ZpbHRlclZpc2libGUudG9TdHJpbmcoKX1cbiAgICAgICAgICByZXNvdXJjZT17cmVzb3VyY2V9XG4gICAgICAgICAgaXNWaXNpYmxlPXtmaWx0ZXJWaXNpYmxlfVxuICAgICAgICAgIHRvZ2dsZUZpbHRlcj17KCk6IHZvaWQgPT4geyBzZXRGaWx0ZXJWaXNpYmxlKCFmaWx0ZXJWaXNpYmxlKSB9fVxuICAgICAgICAvPlxuICAgICAgKSA6ICcnfVxuICAgIDwvQm94PlxuICApXG59XG5cbmNvbnN0IG1hcFN0YXRlVG9Qcm9wcyA9IChzdGF0ZTogUmVkdXhTdGF0ZSk6IFByb3BzRnJvbVN0YXRlID0+ICh7XG4gIHJlc291cmNlczogc3RhdGUucmVzb3VyY2VzLFxufSlcblxuZXhwb3J0IGRlZmF1bHQgYWxsb3dPdmVycmlkZShjb25uZWN0KG1hcFN0YXRlVG9Qcm9wcykoUmVzb3VyY2VBY3Rpb24pLCAnUmVzb3VyY2VSb3V0ZScpXG4iLCIvKiBlc2xpbnQtZGlzYWJsZSByZWFjdC9uby1jaGlsZHJlbi1wcm9wICovXG5pbXBvcnQgUmVhY3QsIHsgdXNlRWZmZWN0LCB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgUm91dGVzLCBSb3V0ZSB9IGZyb20gJ3JlYWN0LXJvdXRlci1kb20nXG5pbXBvcnQgeyBjcmVhdGVHbG9iYWxTdHlsZSB9IGZyb20gJ3N0eWxlZC1jb21wb25lbnRzJ1xuaW1wb3J0IHsgQm94LCBPdmVybGF5LCBSZXNldCB9IGZyb20gJ0BhZG1pbmpzL2Rlc2lnbi1zeXN0ZW0nXG5pbXBvcnQgeyB1c2VMb2NhdGlvbiB9IGZyb20gJ3JlYWN0LXJvdXRlcidcblxuaW1wb3J0IFZpZXdIZWxwZXJzIGZyb20gJy4uLy4uL2JhY2tlbmQvdXRpbHMvdmlldy1oZWxwZXJzL3ZpZXctaGVscGVycydcbmltcG9ydCBTaWRlYmFyIGZyb20gJy4vYXBwL3NpZGViYXIvc2lkZWJhcidcbmltcG9ydCBUb3BCYXIgZnJvbSAnLi9hcHAvdG9wLWJhcidcbmltcG9ydCBOb3RpY2UgZnJvbSAnLi9hcHAvbm90aWNlJ1xuaW1wb3J0IGFsbG93T3ZlcnJpZGUgZnJvbSAnLi4vaG9jL2FsbG93LW92ZXJyaWRlJ1xuaW1wb3J0IHtcbiAgRGFzaGJvYXJkUm91dGUsIFJlc291cmNlQWN0aW9uUm91dGUsIFJlY29yZEFjdGlvblJvdXRlLCBQYWdlUm91dGUsIEJ1bGtBY3Rpb25Sb3V0ZSwgUmVzb3VyY2VSb3V0ZSxcbn0gZnJvbSAnLi9yb3V0ZXMnXG5pbXBvcnQgdXNlSGlzdG9yeUxpc3RlbiBmcm9tICcuLi9ob29rcy91c2UtaGlzdG9yeS1saXN0ZW4nXG5cbmNvbnN0IEdsb2JhbFN0eWxlID0gY3JlYXRlR2xvYmFsU3R5bGVgXG4gIGh0bWwsIGJvZHksICNhcHAge1xuICAgIG1hcmdpbjogMDtcbiAgICBwYWRkaW5nOiAwO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGhlaWdodDogMTAwJTtcbiAgICBjb2xvcjogJHsoeyB0aGVtZSB9KTogc3RyaW5nID0+IHRoZW1lLmNvbG9ycy5ncmV5MTAwfVxuICB9XG5gXG5cbmNvbnN0IGggPSBuZXcgVmlld0hlbHBlcnMoKVxuXG5jb25zdCBBcHA6IFJlYWN0LkZDID0gKCkgPT4ge1xuICBjb25zdCBbc2lkZWJhclZpc2libGUsIHRvZ2dsZVNpZGViYXJdID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IGxvY2F0aW9uID0gdXNlTG9jYXRpb24oKVxuXG4gIHVzZUhpc3RvcnlMaXN0ZW4oKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHNpZGViYXJWaXNpYmxlKSB7IHRvZ2dsZVNpZGViYXIoZmFsc2UpIH1cbiAgfSwgW2xvY2F0aW9uXSlcblxuICBjb25zdCByZXNvdXJjZUlkID0gJzpyZXNvdXJjZUlkJ1xuICBjb25zdCBhY3Rpb25OYW1lID0gJzphY3Rpb25OYW1lJ1xuICBjb25zdCByZWNvcmRJZCA9ICc6cmVjb3JkSWQnXG4gIGNvbnN0IHBhZ2VOYW1lID0gJzpwYWdlTmFtZSdcblxuICBjb25zdCBkYXNoYm9hcmRVcmwgPSBoLmRhc2hib2FyZFVybCgpXG4gIGNvbnN0IHJlY29yZEFjdGlvblVybCA9IGgucmVjb3JkQWN0aW9uVXJsKHsgcmVzb3VyY2VJZCwgcmVjb3JkSWQsIGFjdGlvbk5hbWUgfSlcbiAgY29uc3QgcmVzb3VyY2VBY3Rpb25VcmwgPSBoLnJlc291cmNlQWN0aW9uVXJsKHsgcmVzb3VyY2VJZCwgYWN0aW9uTmFtZSB9KVxuICBjb25zdCBidWxrQWN0aW9uVXJsID0gaC5idWxrQWN0aW9uVXJsKHsgcmVzb3VyY2VJZCwgYWN0aW9uTmFtZSB9KVxuICBjb25zdCByZXNvdXJjZVVybCA9IGgucmVzb3VyY2VVcmwoeyByZXNvdXJjZUlkIH0pXG4gIGNvbnN0IHBhZ2VVcmwgPSBoLnBhZ2VVcmwocGFnZU5hbWUpXG5cbiAgLyoqXG4gICAqIFdoZW4gZGVmaW5pbmcgQWRtaW5KUyByb3V0ZXMsIHdlIHVzZSBSb3V0ZXMgY29tcG9uZW50IHR3aWNlLlxuICAgKiBUaGlzIHJlc3VsdHMgaW4gd2FybmluZ3MgYXBwZWFyaW5nIGluIGNvbnNvbGUsIGZvciBleGFtcGxlIGFib3V0IG5vdCBiZWluZyBhYmxlIHRvIGxvY2F0ZVxuICAgKiBcIi9hZG1pblwiIHJvdXRlLiBUaGV5IGNhbiBiZSBzYWZlbHkgaWdub3JlZCB0aG91Z2ggYW5kIHNob3VsZCBhcHBlYXIgb25seVxuICAgKiBpbiBkZXZlbG9wbWVudCBlbnZpcm9ubWVudC4gVGhlIHdhcm5pbmdzIG9yaWdpbmF0ZSBmcm9tIHRoZSBkaWZmZXJlbmNlIGJldHdlZW5cbiAgICogXCJTd2l0Y2hcIiBjb21wb25lbnQgdGhhdCBBZG1pbkpTIGhhZCB1c2VkIGluIFwicmVhY3Qtcm91dGVyXCIgdjUgd2hpY2ggd2FzIGxhdGVyIHJlcGxhY2VkXG4gICAqIHdpdGggXCJSb3V0ZXNcIiBpbiBcInJlYWN0LXJvdXRlclwiIHY2LiBcIlN3aXRjaFwiIHdvdWxkIHVzZSB0aGUgZmlyc3QgXCJSb3V0ZVwiIGNvbXBvbmVudFxuICAgKiB0aGF0IG1hdGNoZWQgdGhlIHByb3ZpZGVkIHBhdGgsIHdoaWxlIFwiUm91dGVzXCIgc2VhcmNoZXMgZm9yIHRoZSBiZXN0IG1hdGNoaW5nIHBhdHRlcm4uXG4gICAqIEluIEFkbWluSlMgd2UgdXNlIFwiRHJhd2VyUG9ydGFsXCIgdG8gZGlzcGxheSBhY3Rpb25zIGluIGEgZHJhd2VyIHdoZW5cbiAgICogXCJzaG93SW5EcmF3ZXJcIiBvcHRpb24gaXMgc2V0IHRvIHRydWUuIFRoZSBkcmF3ZXIgc2hvdWxkIGFwcGVhciBhYm92ZSB0aGUgY3VycmVudGx5IHZpZXdlZFxuICAgKiBwYWdlLCBidXQgXCJSb3V0ZXNcIiBicm9rZSB0aGlzIGJlaGF2aW9yIGJlY2F1c2UgaXQgaW5zdGVhZCBzaG93ZWQgYSByZWNvcmQgYWN0aW9uIHJvdXRlIHdpdGhcbiAgICogYW4gZW1wdHkgYmFja2dyb3VuZC5cbiAgICogVGhlIGN1cnJlbnQgZmxvdyBpcyB0aGF0IGZpcnN0IFwiUm91dGVzXCIgY29tcG9uZW50IGluY2x1ZGVzIFwiUmVzb3VyY2VcIiByb3V0ZSBjb21wb25lbnRcbiAgICogZm9yIGRyYXdlci1wbGFjZWQgYWN0aW9ucyBhbmQgdGhlIHNlY29uZCBcIlJvdXRlc1wiIGlzIGVudGVyZWQgZm9yIHJlY29yZCBhY3Rpb25zXG4gICAqIG9uIGEgc2VwYXJhdGUgcGFnZS5cbiAgICovXG4gIHJldHVybiAoXG4gICAgPD5cbiAgICAgIDxSZXNldCAvPlxuICAgICAgPEdsb2JhbFN0eWxlIC8+XG4gICAgICA8Qm94IGhlaWdodD1cIjEwMCVcIiBmbGV4IGRhdGEtY3NzPVwiYXBwXCI+XG4gICAgICAgIHtzaWRlYmFyVmlzaWJsZSA/IChcbiAgICAgICAgICA8T3ZlcmxheVxuICAgICAgICAgICAgb25DbGljaz17KCk6IHZvaWQgPT4gdG9nZ2xlU2lkZWJhcighc2lkZWJhclZpc2libGUpfVxuICAgICAgICAgIC8+XG4gICAgICAgICkgOiBudWxsfVxuICAgICAgICA8U2lkZWJhciBpc1Zpc2libGU9e3NpZGViYXJWaXNpYmxlfSBkYXRhLWNzcz1cInNpZGViYXJcIiAvPlxuICAgICAgICA8Qm94IGZsZXggZmxleEdyb3c9ezF9IGZsZXhEaXJlY3Rpb249XCJjb2x1bW5cIiBvdmVyZmxvd1k9XCJhdXRvXCIgYmc9XCJiZ1wiIGRhdGEtY3NzPVwiYXBwLWNvbnRlbnRcIj5cbiAgICAgICAgICA8VG9wQmFyIHRvZ2dsZVNpZGViYXI9eygpID0+IHRvZ2dsZVNpZGViYXIoIXNpZGViYXJWaXNpYmxlKX0gLz5cbiAgICAgICAgICA8Qm94IHBvc2l0aW9uPVwiYWJzb2x1dGVcIiB0b3A9ezB9IHpJbmRleD17MjAwMH0gZGF0YS1jc3M9XCJub3RpY2VcIj5cbiAgICAgICAgICAgIDxOb3RpY2UgLz5cbiAgICAgICAgICA8L0JveD5cbiAgICAgICAgICA8Um91dGVzPlxuICAgICAgICAgICAgPFJvdXRlIHBhdGg9e2Ake3Jlc291cmNlVXJsfS8qYH0gZWxlbWVudD17PFJlc291cmNlUm91dGUgLz59IC8+XG4gICAgICAgICAgICA8Um91dGUgcGF0aD17cGFnZVVybH0gZWxlbWVudD17PFBhZ2VSb3V0ZSAvPn0gLz5cbiAgICAgICAgICAgIDxSb3V0ZSBwYXRoPXtkYXNoYm9hcmRVcmx9IGVsZW1lbnQ9ezxEYXNoYm9hcmRSb3V0ZSAvPn0gLz5cbiAgICAgICAgICA8L1JvdXRlcz5cbiAgICAgICAgICA8Um91dGVzPlxuICAgICAgICAgICAgPFJvdXRlIHBhdGg9e2Ake3Jlc291cmNlQWN0aW9uVXJsfS8qYH0gZWxlbWVudD17PFJlc291cmNlQWN0aW9uUm91dGUgLz59IC8+XG4gICAgICAgICAgICA8Um91dGUgcGF0aD17YCR7YnVsa0FjdGlvblVybH0vKmB9IGVsZW1lbnQ9ezxCdWxrQWN0aW9uUm91dGUgLz59IC8+XG4gICAgICAgICAgICA8Um91dGUgcGF0aD17YCR7cmVjb3JkQWN0aW9uVXJsfS8qYH0gZWxlbWVudD17PFJlY29yZEFjdGlvblJvdXRlIC8+fSAvPlxuICAgICAgICAgIDwvUm91dGVzPlxuICAgICAgICA8L0JveD5cbiAgICAgIDwvQm94PlxuICAgIDwvPlxuXG4gIClcbn1cblxuZXhwb3J0IGRlZmF1bHQgYWxsb3dPdmVycmlkZShBcHAsICdBcHBsaWNhdGlvbicpXG4iLCJpbXBvcnQgeyBBc3NldHMgfSBmcm9tICcuLi8uLi8uLi9hZG1pbmpzLW9wdGlvbnMuaW50ZXJmYWNlJ1xuXG5leHBvcnQgY29uc3QgQVNTRVRTX0lOSVRJQUxJWkUgPSAnQVNTRVRTX0lOSVRJQUxJWkUnXG5cbmV4cG9ydCB0eXBlIGluaXRpYWxpemVBc3NldHNSZXNwb25zZSA9IHtcbiAgdHlwZTogc3RyaW5nO1xuICBkYXRhOiBBc3NldHM7XG59XG5cbmV4cG9ydCBjb25zdCBpbml0aWFsaXplQXNzZXRzID0gKGRhdGE6IEFzc2V0cyk6IGluaXRpYWxpemVBc3NldHNSZXNwb25zZSA9PiAoe1xuICB0eXBlOiBBU1NFVFNfSU5JVElBTElaRSxcbiAgZGF0YSxcbn0pXG4iLCJpbXBvcnQgeyBCcmFuZGluZ09wdGlvbnMgfSBmcm9tICcuLi8uLi8uLi9hZG1pbmpzLW9wdGlvbnMuaW50ZXJmYWNlJ1xuXG5leHBvcnQgY29uc3QgQlJBTkRJTkdfSU5JVElBTElaRSA9ICdCUkFORElOR19JTklUSUFMSVpFJ1xuXG5leHBvcnQgdHlwZSBJbml0aWFsaXplQnJhbmRpbmdSZXNwb25zZSA9IHtcbiAgdHlwZTogdHlwZW9mIEJSQU5ESU5HX0lOSVRJQUxJWkU7XG4gIGRhdGE6IEJyYW5kaW5nT3B0aW9ucztcbn1cblxuZXhwb3J0IGNvbnN0IGluaXRpYWxpemVCcmFuZGluZyA9IChkYXRhOiBCcmFuZGluZ09wdGlvbnMpOiBJbml0aWFsaXplQnJhbmRpbmdSZXNwb25zZSA9PiAoe1xuICB0eXBlOiBCUkFORElOR19JTklUSUFMSVpFLFxuICBkYXRhLFxufSlcbiIsImltcG9ydCB7IERhc2hib2FyZEluU3RhdGUgfSBmcm9tICcuLi9zdG9yZSdcblxuZXhwb3J0IGNvbnN0IERBU0hCT0FSRF9JTklUSUFMSVpFID0gJ0RBU0hCT0FSRF9JTklUSUFMSVpFJ1xuXG5leHBvcnQgdHlwZSBJbml0aWFsaXplRGFzaGJvYXJkUmVzcG9uc2UgPSB7XG4gIHR5cGU6IHR5cGVvZiBEQVNIQk9BUkRfSU5JVElBTElaRTtcbiAgZGF0YTogRGFzaGJvYXJkSW5TdGF0ZTtcbn1cblxuZXhwb3J0IGNvbnN0IGluaXRpYWxpemVEYXNoYm9hcmQgPSAoZGF0YTogRGFzaGJvYXJkSW5TdGF0ZSk6IEluaXRpYWxpemVEYXNoYm9hcmRSZXNwb25zZSA9PiAoe1xuICB0eXBlOiBEQVNIQk9BUkRfSU5JVElBTElaRSxcbiAgZGF0YSxcbn0pXG4iLCJpbXBvcnQgeyBMb2NhbGUgfSBmcm9tICcuLi8uLi8uLi9sb2NhbGUvY29uZmlnJ1xuXG5leHBvcnQgY29uc3QgTE9DQUxFX0lOSVRJQUxJWkUgPSAnTE9DQUxFX0lOSVRJQUxJWkUnXG5cbmV4cG9ydCB0eXBlIEluaXRpYWxpemVMb2NhbGVSZXNwb25zZSA9IHtcbiAgdHlwZTogdHlwZW9mIExPQ0FMRV9JTklUSUFMSVpFO1xuICBkYXRhOiBMb2NhbGU7XG59XG5cbmV4cG9ydCBjb25zdCBpbml0aWFsaXplTG9jYWxlID0gKGRhdGE6IExvY2FsZSk6IEluaXRpYWxpemVMb2NhbGVSZXNwb25zZSA9PiAoe1xuICB0eXBlOiBMT0NBTEVfSU5JVElBTElaRSxcbiAgZGF0YSxcbn0pXG4iLCJpbXBvcnQgeyBBZG1pblBhZ2UgfSBmcm9tICcuLi8uLi8uLi9hZG1pbmpzLW9wdGlvbnMuaW50ZXJmYWNlJ1xuXG5leHBvcnQgY29uc3QgUEFHRVNfSU5JVElBTElaRSA9ICdQQUdFU19JTklUSUFMSVpFJ1xuXG5leHBvcnQgdHlwZSBJbml0aWFsaXplUGFnZXNSZXNwb25zZSA9IHtcbiAgdHlwZTogdHlwZW9mIFBBR0VTX0lOSVRJQUxJWkU7XG4gIGRhdGE6IEFycmF5PEFkbWluUGFnZT47XG59XG5cbmV4cG9ydCBjb25zdCBpbml0aWFsaXplUGFnZXMgPSAoZGF0YTogQXJyYXk8QWRtaW5QYWdlPik6IEluaXRpYWxpemVQYWdlc1Jlc3BvbnNlID0+ICh7XG4gIHR5cGU6IFBBR0VTX0lOSVRJQUxJWkUsXG4gIGRhdGEsXG59KVxuIiwiaW1wb3J0IHsgUGF0aHMgfSBmcm9tICcuLi9zdG9yZSdcblxuZXhwb3J0IGNvbnN0IFBBVEhTX0lOSVRJQUxJWkUgPSAnUEFUSFNfSU5JVElBTElaRSdcblxuZXhwb3J0IHR5cGUgSW5pdGlhbGl6ZVBhdGhzUmVzcG9uc2UgPSB7XG4gIHR5cGU6IHR5cGVvZiBQQVRIU19JTklUSUFMSVpFO1xuICBkYXRhOiBQYXRocztcbn1cblxuZXhwb3J0IGNvbnN0IGluaXRpYWxpemVQYXRocyA9IChkYXRhOiBQYXRocyk6IEluaXRpYWxpemVQYXRoc1Jlc3BvbnNlID0+ICh7XG4gIHR5cGU6IFBBVEhTX0lOSVRJQUxJWkUsXG4gIGRhdGEsXG59KVxuIiwiaW1wb3J0IHsgUmVzb3VyY2VKU09OIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcydcblxuZXhwb3J0IGNvbnN0IFJFU09VUkNFU19JTklUSUFMSVpFID0gJ1JFU09VUkNFU19JTklUSUFMSVpFJ1xuXG5leHBvcnQgdHlwZSBJbml0aWFsaXplUmVzb3VyY2VzUmVzcG9uc2UgPSB7XG4gIHR5cGU6IHR5cGVvZiBSRVNPVVJDRVNfSU5JVElBTElaRTtcbiAgZGF0YTogQXJyYXk8UmVzb3VyY2VKU09OPjtcbn1cblxuZXhwb3J0IGNvbnN0IGluaXRpYWxpemVSZXNvdXJjZXMgPSAoZGF0YTogQXJyYXk8UmVzb3VyY2VKU09OPik6IEluaXRpYWxpemVSZXNvdXJjZXNSZXNwb25zZSA9PiAoe1xuICB0eXBlOiBSRVNPVVJDRVNfSU5JVElBTElaRSxcbiAgZGF0YSxcbn0pXG4iLCJpbXBvcnQgeyBWZXJzaW9uUHJvcHMgfSBmcm9tICcuLi8uLi8uLi9hZG1pbmpzLW9wdGlvbnMuaW50ZXJmYWNlJ1xuXG5leHBvcnQgY29uc3QgVkVSU0lPTlNfSU5JVElBTElaRSA9ICdWRVJTSU9OU19JTklUSUFMSVpFJ1xuXG5leHBvcnQgdHlwZSBJbml0aWFsaXplVmVyc2lvbnNSZXNwb25zZSA9IHtcbiAgdHlwZTogdHlwZW9mIFZFUlNJT05TX0lOSVRJQUxJWkU7XG4gIGRhdGE6IFZlcnNpb25Qcm9wcztcbn1cblxuZXhwb3J0IGNvbnN0IGluaXRpYWxpemVWZXJzaW9ucyA9IChkYXRhOiBWZXJzaW9uUHJvcHMpOiBJbml0aWFsaXplVmVyc2lvbnNSZXNwb25zZSA9PiAoe1xuICB0eXBlOiBWRVJTSU9OU19JTklUSUFMSVpFLFxuICBkYXRhLFxufSlcbiIsIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9leHBsaWNpdC1mdW5jdGlvbi1yZXR1cm4tdHlwZSAqL1xuLy8gTm90ZTogV2UgYXJlIHVzaW5nIGxlZ2FjeSBcImNyZWF0ZVN0b3JlXCJcbi8vIGJlY2F1c2UgQWRtaW5KUyB3aWxsIHN3aXRjaCB0byBFdmVudHJpeCBmcm9tIHY3IG9ud2FyZHMgYW55d2F5XG5pbXBvcnQgeyBjb21iaW5lUmVkdWNlcnMsIGxlZ2FjeV9jcmVhdGVTdG9yZSBhcyBjcmVhdGVTdG9yZSB9IGZyb20gJ3JlZHV4J1xuaW1wb3J0IHR5cGUgeyB1c2VMb2NhdGlvbiB9IGZyb20gJ3JlYWN0LXJvdXRlcidcbmltcG9ydCB7XG4gIFZFUlNJT05TX0lOSVRJQUxJWkUsXG4gIFNFU1NJT05fSU5JVElBTElaRSxcbiAgREFTSEJPQVJEX0lOSVRJQUxJWkUsXG4gIFBBVEhTX0lOSVRJQUxJWkUsXG4gIEFTU0VUU19JTklUSUFMSVpFLFxuICBCUkFORElOR19JTklUSUFMSVpFLFxuICBMT0NBTEVfSU5JVElBTElaRSxcbiAgUEFHRVNfSU5JVElBTElaRSxcbiAgUkVTT1VSQ0VTX0lOSVRJQUxJWkUsXG4gIFNFVF9OT1RJQ0VfUFJPR1JFU1MsXG4gIERST1BfTk9USUNFLFxuICBBRERfTk9USUNFLFxuICBST1VURV9DSEFOR0VELFxuICBJTklUSUFMX1JPVVRFIH0gZnJvbSAnLi9hY3Rpb25zJ1xuXG5pbXBvcnQgeyBBc3NldHMsIEJyYW5kaW5nT3B0aW9ucywgVmVyc2lvblByb3BzIH0gZnJvbSAnLi4vLi4vYWRtaW5qcy1vcHRpb25zLmludGVyZmFjZSdcbmltcG9ydCB7IFBhZ2VKU09OLCBSZXNvdXJjZUpTT04gfSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuaW1wb3J0IHsgREVGQVVMVF9QQVRIUyB9IGZyb20gJy4uLy4uL2NvbnN0YW50cydcbmltcG9ydCB7IEN1cnJlbnRBZG1pbiB9IGZyb20gJy4uLy4uL2N1cnJlbnQtYWRtaW4uaW50ZXJmYWNlJ1xuaW1wb3J0IHsgTG9jYWxlIH0gZnJvbSAnLi4vLi4vbG9jYWxlL2NvbmZpZydcbmltcG9ydCB7IE5vdGljZU1lc3NhZ2UgfSBmcm9tICcuLi9ob2Mvd2l0aC1ub3RpY2UnXG5cbmV4cG9ydCB0eXBlIERhc2hib2FyZEluU3RhdGUgPSB7XG4gIGNvbXBvbmVudD86IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgTm90aWNlTWVzc2FnZUluU3RhdGUgPSBOb3RpY2VNZXNzYWdlICYge1xuICBtZXNzYWdlOiBzdHJpbmc7XG4gIGlkOiBzdHJpbmc7XG4gIHR5cGU6IE5vdGljZU1lc3NhZ2VbJ3R5cGUnXTtcbiAgcHJvZ3Jlc3M6IG51bWJlcjtcbn1cblxuZXhwb3J0IHR5cGUgUGF0aHMgPSB7XG4gIHJvb3RQYXRoOiBzdHJpbmc7XG4gIGxvZ291dFBhdGg6IHN0cmluZztcbiAgbG9naW5QYXRoOiBzdHJpbmc7XG4gIGFzc2V0c0NETj86IHN0cmluZztcbn1cblxuY29uc3QgcmVzb3VyY2VzUmVkdWNlciA9IChcbiAgc3RhdGU6IEFycmF5PFJlc291cmNlSlNPTj4gPSBbXSxcbiAgYWN0aW9uOiB7XG4gICAgdHlwZTogc3RyaW5nO1xuICAgIGRhdGE6IEFycmF5PFJlc291cmNlSlNPTj47XG4gIH0sXG4pID0+IHtcbiAgc3dpdGNoIChhY3Rpb24udHlwZSkge1xuICBjYXNlIFJFU09VUkNFU19JTklUSUFMSVpFOlxuICAgIHJldHVybiBhY3Rpb24uZGF0YVxuICBkZWZhdWx0OiByZXR1cm4gc3RhdGVcbiAgfVxufVxuXG5jb25zdCBwYWdlc1JlZHVjZXIgPSAoXG4gIHN0YXRlOiBBcnJheTxQYWdlSlNPTj4gPSBbXSxcbiAgYWN0aW9uOiB7XG4gICAgdHlwZTogc3RyaW5nO1xuICAgIGRhdGE6IEFycmF5PFBhZ2VKU09OPjtcbiAgfSxcbikgPT4ge1xuICBzd2l0Y2ggKGFjdGlvbi50eXBlKSB7XG4gIGNhc2UgUEFHRVNfSU5JVElBTElaRTpcbiAgICByZXR1cm4gYWN0aW9uLmRhdGFcbiAgZGVmYXVsdDogcmV0dXJuIHN0YXRlXG4gIH1cbn1cblxuY29uc3QgbG9jYWxlc1JlZHVjZXIgPSAoXG4gIHN0YXRlOiBMb2NhbGUgPSB7IGxhbmd1YWdlOiAnZW4nLCB0cmFuc2xhdGlvbnM6IHt9IH0gYXMgTG9jYWxlLFxuICBhY3Rpb246IHtcbiAgICB0eXBlOiBzdHJpbmc7XG4gICAgZGF0YTogTG9jYWxlO1xuICB9LFxuKSA9PiB7XG4gIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAgY2FzZSBMT0NBTEVfSU5JVElBTElaRTpcbiAgICByZXR1cm4gYWN0aW9uLmRhdGFcbiAgZGVmYXVsdDogcmV0dXJuIHN0YXRlXG4gIH1cbn1cblxuY29uc3QgYnJhbmRpbmdSZWR1Y2VyID0gKHN0YXRlID0ge30sIGFjdGlvbjoge1xuICB0eXBlOiBzdHJpbmc7XG4gIGRhdGE6IEJyYW5kaW5nT3B0aW9ucztcbn0pID0+IHtcbiAgc3dpdGNoIChhY3Rpb24udHlwZSkge1xuICBjYXNlIEJSQU5ESU5HX0lOSVRJQUxJWkU6XG4gICAgcmV0dXJuIGFjdGlvbi5kYXRhXG4gIGRlZmF1bHQ6IHJldHVybiBzdGF0ZVxuICB9XG59XG5cbmNvbnN0IGFzc2V0c1JlZHVjZXIgPSAoc3RhdGUgPSB7fSwgYWN0aW9uOiB7XG4gIHR5cGU6IHN0cmluZztcbiAgZGF0YTogQXNzZXRzO1xufSkgPT4ge1xuICBzd2l0Y2ggKGFjdGlvbi50eXBlKSB7XG4gIGNhc2UgQVNTRVRTX0lOSVRJQUxJWkU6XG4gICAgcmV0dXJuIGFjdGlvbi5kYXRhXG4gIGRlZmF1bHQ6IHJldHVybiBzdGF0ZVxuICB9XG59XG5cbmNvbnN0IHBhdGhzUmVkdWNlciA9IChcbiAgc3RhdGU6IFBhdGhzID0gREVGQVVMVF9QQVRIUyxcbiAgYWN0aW9uOiB7dHlwZTogc3RyaW5nOyBkYXRhOiBQYXRoc30sXG4pOiBQYXRocyA9PiB7XG4gIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAgY2FzZSBQQVRIU19JTklUSUFMSVpFOlxuICAgIHJldHVybiBhY3Rpb24uZGF0YVxuICBkZWZhdWx0OiByZXR1cm4gc3RhdGVcbiAgfVxufVxuXG5jb25zdCBkYXNoYm9hcmRSZWR1Y2VyID0gKHN0YXRlID0ge30sIGFjdGlvbjoge1xuICB0eXBlOiBzdHJpbmc7XG4gIGRhdGE6IERhc2hib2FyZEluU3RhdGU7XG59KTogRGFzaGJvYXJkSW5TdGF0ZSA9PiB7XG4gIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAgY2FzZSBEQVNIQk9BUkRfSU5JVElBTElaRTpcbiAgICByZXR1cm4gYWN0aW9uLmRhdGFcbiAgZGVmYXVsdDogcmV0dXJuIHN0YXRlXG4gIH1cbn1cblxuY29uc3Qgc2Vzc2lvblJlZHVjZXIgPSAoXG4gIHN0YXRlOiBDdXJyZW50QWRtaW4gfCBudWxsID0gbnVsbCxcbiAgYWN0aW9uOiB7XG4gICAgdHlwZTogc3RyaW5nO1xuICAgIGRhdGE6IEN1cnJlbnRBZG1pbiB8IG51bGw7XG4gIH0sXG4pID0+IHtcbiAgc3dpdGNoIChhY3Rpb24udHlwZSkge1xuICBjYXNlIFNFU1NJT05fSU5JVElBTElaRTpcbiAgICByZXR1cm4gYWN0aW9uLmRhdGFcbiAgZGVmYXVsdDogcmV0dXJuIHN0YXRlXG4gIH1cbn1cblxuY29uc3QgdmVyc2lvbnNSZWR1Y2VyID0gKHN0YXRlID0ge30sIGFjdGlvbjoge1xuICB0eXBlOiBzdHJpbmc7XG4gIGRhdGE6IFZlcnNpb25Qcm9wcztcbn0pID0+IHtcbiAgc3dpdGNoIChhY3Rpb24udHlwZSkge1xuICBjYXNlIFZFUlNJT05TX0lOSVRJQUxJWkU6XG4gICAgcmV0dXJuIHtcbiAgICAgIGFkbWluOiBhY3Rpb24uZGF0YS5hZG1pbixcbiAgICAgIGFwcDogYWN0aW9uLmRhdGEuYXBwLFxuICAgIH1cbiAgZGVmYXVsdDogcmV0dXJuIHN0YXRlXG4gIH1cbn1cblxuZXhwb3J0IHR5cGUgUm91dGVyUHJvcHMgPSB7XG4gIGZyb206IFBhcnRpYWw8UmV0dXJuVHlwZTx0eXBlb2YgdXNlTG9jYXRpb24+PjtcbiAgdG86IFBhcnRpYWw8UmV0dXJuVHlwZTx0eXBlb2YgdXNlTG9jYXRpb24+Pjtcbn1cblxuY29uc3Qgcm91dGVyUmVkdWNlciA9IChzdGF0ZTogUm91dGVyUHJvcHMgPSB7IGZyb206IHt9LCB0bzoge30gfSwgYWN0aW9uOiB7XG4gIHR5cGU6IHN0cmluZztcbiAgZGF0YTogYW55O1xufSkgPT4ge1xuICBzd2l0Y2ggKGFjdGlvbi50eXBlKSB7XG4gIGNhc2UgSU5JVElBTF9ST1VURTpcbiAgICByZXR1cm4ge1xuICAgICAgLi4uc3RhdGUsXG4gICAgICBmcm9tOiB7IC4uLmFjdGlvbi5kYXRhIH0sXG4gICAgfVxuICBjYXNlIFJPVVRFX0NIQU5HRUQ6XG4gICAgcmV0dXJuIHtcbiAgICAgIGZyb206IHsgLi4uc3RhdGUudG8gfSxcbiAgICAgIHRvOiB7IC4uLmFjdGlvbi5kYXRhIH0sXG4gICAgfVxuICBkZWZhdWx0OiByZXR1cm4gc3RhdGVcbiAgfVxufVxuXG50eXBlIE5vdGljZUFyZ3MgPSB7IG5vdGljZUlkOiBzdHJpbmc7IHByb2dyZXNzOiBudW1iZXIgfVxuXG5jb25zdCBub3RpY2VzUmVkdWNlciA9IChzdGF0ZTogQXJyYXk8Tm90aWNlTWVzc2FnZUluU3RhdGU+ID0gW10sIGFjdGlvbjoge1xuICB0eXBlOiBzdHJpbmc7XG4gIGRhdGE6IE5vdGljZU1lc3NhZ2VJblN0YXRlIHwgTm90aWNlQXJncztcbn0pOiBBcnJheTxOb3RpY2VNZXNzYWdlSW5TdGF0ZT4gPT4ge1xuICBzd2l0Y2ggKGFjdGlvbi50eXBlKSB7XG4gIGNhc2UgQUREX05PVElDRToge1xuICAgIGNvbnN0IG5vdGljZXMgPSBbYWN0aW9uLmRhdGEgYXMgTm90aWNlTWVzc2FnZUluU3RhdGVdXG4gICAgcmV0dXJuIG5vdGljZXNcbiAgfVxuICBjYXNlIERST1BfTk9USUNFOiB7XG4gICAgcmV0dXJuIHN0YXRlLmZpbHRlcigobm90aWNlKSA9PiBub3RpY2UuaWQgIT09IChhY3Rpb24uZGF0YSBhcyBOb3RpY2VBcmdzKS5ub3RpY2VJZClcbiAgfVxuICBjYXNlIFNFVF9OT1RJQ0VfUFJPR1JFU1M6IHtcbiAgICByZXR1cm4gc3RhdGUubWFwKChub3RpY2UpID0+ICh7XG4gICAgICAuLi5ub3RpY2UsXG4gICAgICBwcm9ncmVzczogbm90aWNlLmlkID09PSAoYWN0aW9uLmRhdGEgYXMgTm90aWNlQXJncykubm90aWNlSWRcbiAgICAgICAgPyBhY3Rpb24uZGF0YS5wcm9ncmVzc1xuICAgICAgICA6IG5vdGljZS5wcm9ncmVzcyxcbiAgICB9KSlcbiAgfVxuICBkZWZhdWx0OiByZXR1cm4gc3RhdGVcbiAgfVxufVxuXG5leHBvcnQgdHlwZSBSZWR1eFN0YXRlID0ge1xuICByZXNvdXJjZXM6IEFycmF5PFJlc291cmNlSlNPTj47XG4gIGJyYW5kaW5nOiBCcmFuZGluZ09wdGlvbnM7XG4gIGFzc2V0czogQXNzZXRzO1xuICBwYXRoczogUGF0aHM7XG4gIHNlc3Npb246IEN1cnJlbnRBZG1pbiB8IG51bGw7XG4gIGRhc2hib2FyZDogRGFzaGJvYXJkSW5TdGF0ZTtcbiAgbm90aWNlczogQXJyYXk8Tm90aWNlTWVzc2FnZUluU3RhdGU+O1xuICB2ZXJzaW9uczogVmVyc2lvblByb3BzO1xuICBwYWdlczogQXJyYXk8UGFnZUpTT04+O1xuICBsb2NhbGU6IExvY2FsZTtcbiAgcm91dGVyOiBSb3V0ZXJQcm9wcztcbn1cblxuY29uc3QgcmVkdWNlciA9IGNvbWJpbmVSZWR1Y2VyczxSZWR1eFN0YXRlPih7XG4gIHJlc291cmNlczogcmVzb3VyY2VzUmVkdWNlcixcbiAgYnJhbmRpbmc6IGJyYW5kaW5nUmVkdWNlcixcbiAgYXNzZXRzOiBhc3NldHNSZWR1Y2VyLFxuICBwYXRoczogcGF0aHNSZWR1Y2VyLFxuICBzZXNzaW9uOiBzZXNzaW9uUmVkdWNlcixcbiAgZGFzaGJvYXJkOiBkYXNoYm9hcmRSZWR1Y2VyLFxuICBub3RpY2VzOiBub3RpY2VzUmVkdWNlcixcbiAgdmVyc2lvbnM6IHZlcnNpb25zUmVkdWNlcixcbiAgcGFnZXM6IHBhZ2VzUmVkdWNlcixcbiAgbG9jYWxlOiBsb2NhbGVzUmVkdWNlcixcbiAgcm91dGVyOiByb3V0ZXJSZWR1Y2VyLFxufSlcblxuZXhwb3J0IGRlZmF1bHQgKGluaXRpYWxTdGF0ZSA9IHt9KSA9PiBjcmVhdGVTdG9yZShyZWR1Y2VyLCBpbml0aWFsU3RhdGUpXG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBQcm92aWRlciB9IGZyb20gJ3JlYWN0LXJlZHV4J1xuaW1wb3J0IHsgQnJvd3NlclJvdXRlciB9IGZyb20gJ3JlYWN0LXJvdXRlci1kb20nXG5pbXBvcnQgeyBUaGVtZVByb3ZpZGVyIH0gZnJvbSAnc3R5bGVkLWNvbXBvbmVudHMnXG5pbXBvcnQgeyBpbml0UmVhY3RJMThuZXh0IH0gZnJvbSAncmVhY3QtaTE4bmV4dCdcbmltcG9ydCBpMThuIGZyb20gJ2kxOG5leHQnXG5cbmltcG9ydCBBcHAgZnJvbSAnLi9jb21wb25lbnRzL2FwcGxpY2F0aW9uJ1xuaW1wb3J0IEJhc2VQcm9wZXJ0eUNvbXBvbmVudCwgeyBDbGVhblByb3BlcnR5Q29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL3Byb3BlcnR5LXR5cGUnXG5pbXBvcnQgY3JlYXRlU3RvcmUgZnJvbSAnLi9zdG9yZS9zdG9yZSdcbmltcG9ydCBWaWV3SGVscGVycyBmcm9tICcuLi9iYWNrZW5kL3V0aWxzL3ZpZXctaGVscGVycy92aWV3LWhlbHBlcnMnXG5pbXBvcnQgKiBhcyBBcHBDb21wb25lbnRzIGZyb20gJy4vY29tcG9uZW50cy9hcHAnXG5pbXBvcnQgKiBhcyBIb29rcyBmcm9tICcuL2hvb2tzJ1xuaW1wb3J0IEFwaUNsaWVudCBmcm9tICcuL3V0aWxzL2FwaS1jbGllbnQnXG5pbXBvcnQgd2l0aE5vdGljZSBmcm9tICcuL2hvYy93aXRoLW5vdGljZSdcbmltcG9ydCB7IGZsYXQgfSBmcm9tICcuLi91dGlscy9mbGF0J1xuXG5jb25zdCBlbnYgPSB7XG4gIE5PREVfRU5WOiBwcm9jZXNzLmVudi5OT0RFX0VOViB8fCAnZGV2ZWxvcG1lbnQnLFxufVxuXG5jb25zdCBzdG9yZSA9IGNyZWF0ZVN0b3JlKHdpbmRvdy5SRURVWF9TVEFURSlcbmNvbnN0IHRoZW1lID0gd2luZG93LlRIRU1FXG5jb25zdCB7IGxvY2FsZSB9ID0gd2luZG93LlJFRFVYX1NUQVRFXG5cbmkxOG4udXNlKGluaXRSZWFjdEkxOG5leHQpLmluaXQoe1xuICByZXNvdXJjZXM6IHtcbiAgICBbbG9jYWxlLmxhbmd1YWdlXToge1xuICAgICAgdHJhbnNsYXRpb246IGxvY2FsZS50cmFuc2xhdGlvbnMsXG4gICAgfSxcbiAgfSxcbiAgbG5nOiBsb2NhbGUubGFuZ3VhZ2UsXG4gIGludGVycG9sYXRpb246IHsgZXNjYXBlVmFsdWU6IGZhbHNlIH0sXG59KVxuXG5jb25zdCBBcHBsaWNhdGlvbiA9IChcbiAgPFByb3ZpZGVyIHN0b3JlPXtzdG9yZX0+XG4gICAgPFRoZW1lUHJvdmlkZXIgdGhlbWU9e3RoZW1lfT5cbiAgICAgIDxCcm93c2VyUm91dGVyPlxuICAgICAgICA8QXBwIC8+XG4gICAgICA8L0Jyb3dzZXJSb3V0ZXI+XG4gICAgPC9UaGVtZVByb3ZpZGVyPlxuICA8L1Byb3ZpZGVyPlxuKVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZcbndpbmRvdy5yZWdlbmVyYXRvclJ1bnRpbWUgPSByZWdlbmVyYXRvclJ1bnRpbWVcblxuZXhwb3J0IGRlZmF1bHQge1xuICB3aXRoTm90aWNlLFxuICBBcHBsaWNhdGlvbixcbiAgVmlld0hlbHBlcnMsXG4gIFVzZXJDb21wb25lbnRzOiB7fSxcbiAgQXBpQ2xpZW50LFxuICBCYXNlUHJvcGVydHlDb21wb25lbnQsXG4gIENsZWFuUHJvcGVydHlDb21wb25lbnQsXG4gIGVudixcbiAgLi4uQXBwQ29tcG9uZW50cyxcbiAgLi4uSG9va3MsXG4gIGZsYXQsXG59XG4iXSwibmFtZXMiOlsicmVxdWlyZSQkMCIsIl91bmVzY2FwZSIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlJCQxIiwicmVxdWlyZSQkMiIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJyZXF1aXJlJCQzIiwiX3JlYWN0IiwicmVxdWlyZSQkNCIsInJlcXVpcmUkJDUiLCJvd25LZXlzIiwiX29iamVjdFNwcmVhZCIsInV0aWxzIiwiVHJhbnNfMSIsIl9vYmplY3RXaXRob3V0UHJvcGVydGllczIiLCJfY29udGV4dCIsInJlcXVpcmUkJDYiLCJfdXRpbHMiLCJyZXF1aXJlJCQ3IiwiX2V4Y2x1ZGVkIiwidXNlVHJhbnNsYXRpb25fMSIsInVzZVRyYW5zbGF0aW9uIiwiX3NsaWNlZFRvQXJyYXkyIiwidXNlUHJldmlvdXMiLCJ3aXRoVHJhbnNsYXRpb25fMSIsIl91c2VUcmFuc2xhdGlvbjMiLCJUcmFuc2xhdGlvbl8xIiwiSTE4bmV4dFByb3ZpZGVyXzEiLCJ1c2VTU1JfMSIsIndpdGhTU1JfMSIsInNldFByb3RvdHlwZU9mIiwiYXNzZXJ0VGhpc0luaXRpYWxpemVkIiwiYXJyYXlMaWtlVG9BcnJheSIsImFycmF5V2l0aEhvbGVzIiwiaXRlcmFibGVUb0FycmF5IiwidW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkiLCJub25JdGVyYWJsZVJlc3QiLCJlc2NhcGUiLCJnZXQiLCJub29wIiwiZ2xvYmFsQW55Iiwid2luZG93IiwiZXJyb3IiLCJtZXNzYWdlIiwicnVuRGF0ZSIsIkRhdGUiLCJWaWV3SGVscGVycyIsImNvbnN0cnVjdG9yIiwib3B0aW9ucyIsIm9wdHMiLCJnZXRQYXRocyIsInJvb3RQYXRoIiwiUkVEVVhfU1RBVEUiLCJwYXRocyIsInVybEJ1aWxkZXIiLCJzZWFyY2giLCJzZXBhcmF0b3IiLCJyZXBsYWNlIiwiUmVnRXhwIiwic3RhcnRzV2l0aCIsInBhcnRzIiwiam9pbiIsImxvZ2luVXJsIiwibG9naW5QYXRoIiwibG9nb3V0VXJsIiwibG9nb3V0UGF0aCIsImRhc2hib2FyZFVybCIsInBhZ2VVcmwiLCJwYWdlTmFtZSIsImVkaXRVcmwiLCJyZXNvdXJjZUlkIiwicmVjb3JkSWQiLCJyZWNvcmRBY3Rpb25VcmwiLCJhY3Rpb25OYW1lIiwic2hvd1VybCIsImRlbGV0ZVVybCIsIm5ld1VybCIsInJlc291cmNlQWN0aW9uVXJsIiwibGlzdFVybCIsImJ1bGtEZWxldGVVcmwiLCJyZWNvcmRJZHMiLCJidWxrQWN0aW9uVXJsIiwicmVzb3VyY2VVcmwiLCJ1cmwiLCJsZW5ndGgiLCJxdWVyeSIsIlVSTFNlYXJjaFBhcmFtcyIsInNldCIsInRvU3RyaW5nIiwiYXNzZXRQYXRoIiwiYXNzZXQiLCJhc3NldHNDb25maWciLCJhc3NldHNDRE4iLCJwYXRobmFtZSIsImNvcmVTY3JpcHRzIiwiVVJMIiwiaHJlZiIsImdldFRpbWUiLCJfZXh0ZW5kcyIsImFsbG93T3ZlcnJpZGUiLCJPcmlnaW5hbENvbXBvbmVudCIsIm5hbWUiLCJXcmFwcGVyQ29tcG9uZW50IiwicHJvcHMiLCJDb21wb25lbnQiLCJBZG1pbkpTIiwiVXNlckNvbXBvbmVudHMiLCJUSEVNRSIsIkNvbXBvbmVudHMiLCJSZWFjdCIsIlN0eWxlZExvZ28iLCJzdHlsZWQiLCJMaW5rIiwidGhlbWVHZXQiLCJoIiwiU2lkZWJhckJyYW5kaW5nIiwiYnJhbmRpbmciLCJsb2dvIiwiY29tcGFueU5hbWUiLCJjc3NDbGFzcyIsImFycmF5UmVkdWNlIiwiYmFzZVByb3BlcnR5T2YiLCJkZWJ1cnJMZXR0ZXIiLCJmcmVlR2xvYmFsIiwiZ2xvYmFsIiwicm9vdCIsIlN5bWJvbCIsImFycmF5TWFwIiwiaXNBcnJheSIsIm9iamVjdFByb3RvIiwibmF0aXZlT2JqZWN0VG9TdHJpbmciLCJzeW1Ub1N0cmluZ1RhZyIsImdldFJhd1RhZyIsIm9iamVjdFRvU3RyaW5nIiwiYmFzZUdldFRhZyIsImlzT2JqZWN0TGlrZSIsImlzU3ltYm9sIiwiSU5GSU5JVFkiLCJiYXNlVG9TdHJpbmciLCJyc0NvbWJvTWFya3NSYW5nZSIsInJlQ29tYm9IYWxmTWFya3NSYW5nZSIsInJzQ29tYm9TeW1ib2xzUmFuZ2UiLCJyc0NvbWJvUmFuZ2UiLCJyc0NvbWJvIiwiZGVidXJyIiwiYXNjaWlXb3JkcyIsImhhc1VuaWNvZGVXb3JkIiwicnNBc3RyYWxSYW5nZSIsInJzVmFyUmFuZ2UiLCJyc0Fwb3MiLCJyc0ZpdHoiLCJyc01vZGlmaWVyIiwicnNOb25Bc3RyYWwiLCJyc1JlZ2lvbmFsIiwicnNTdXJyUGFpciIsInJzWldKIiwicmVPcHRNb2QiLCJyc09wdFZhciIsInJzT3B0Sm9pbiIsInJzU2VxIiwidW5pY29kZVdvcmRzIiwid29yZHMiLCJjcmVhdGVDb21wb3VuZGVyIiwiYmFzZVNsaWNlIiwiY2FzdFNsaWNlIiwiaGFzVW5pY29kZSIsImFzY2lpVG9BcnJheSIsInJzQXN0cmFsIiwicnNTeW1ib2wiLCJyZVVuaWNvZGUiLCJ1bmljb2RlVG9BcnJheSIsInN0cmluZ1RvQXJyYXkiLCJjcmVhdGVDYXNlRmlyc3QiLCJ1cHBlckZpcnN0IiwiZm9ybWF0TmFtZSIsInNwbGl0IiwidHJhbnNsYXRlIiwiaTE4biIsImtleSIsInJlYWxPcHRpb25zIiwiZm9ybWF0dGVkTmFtZSIsImtleXMiLCJleGlzdHMiLCJ0IiwiZGVmYXVsdFZhbHVlIiwic3RhcnRDYXNlIiwiY3JlYXRlRnVuY3Rpb25zIiwidHJhbnNsYXRlQWN0aW9uIiwidHJhbnNsYXRlQnV0dG9uIiwiYnV0dG9uTGFiZWwiLCJ0cmFuc2xhdGVMYWJlbCIsImxhYmVsIiwidHJhbnNsYXRlUHJvcGVydHkiLCJwcm9wZXJ0eU5hbWUiLCJ0cmFuc2xhdGVNZXNzYWdlIiwibWVzc2FnZU5hbWUiLCJ0YSIsInRiIiwidGwiLCJ0cCIsInRtIiwicmVzdCIsIm9yaWdpbmFsVXNlVHJhbnNsYXRpb24iLCJ0cmFuc2xhdGVGdW5jdGlvbnMiLCJTaWRlYmFyUGFnZXMiLCJwYWdlcyIsImxvY2F0aW9uIiwidXNlTG9jYXRpb24iLCJuYXZpZ2F0ZSIsInVzZU5hdmlnYXRlIiwiaXNBY3RpdmUiLCJwYWdlIiwibWF0Y2giLCJlbGVtZW50cyIsIm1hcCIsImlkIiwiaXNTZWxlY3RlZCIsImljb24iLCJvbkNsaWNrIiwiZXZlbnQiLCJlbGVtZW50IiwicHJldmVudERlZmF1bHQiLCJOYXZpZ2F0aW9uIiwiU2lkZWJhckZvb3RlciIsInVzZVNlbGVjdG9yIiwic3RhdGUiLCJCb3giLCJ3aXRoTWFkZVdpdGhMb3ZlIiwiTWFkZVdpdGhMb3ZlIiwiYmluZCIsImlzQnVmZmVyIiwiaXNPYmplY3QiLCJtZXJnZSIsImJ1aWxkVVJMIiwiSW50ZXJjZXB0b3JNYW5hZ2VyIiwibm9ybWFsaXplSGVhZGVyTmFtZSIsImlzQWJzb2x1dGVVUkwiLCJjb21iaW5lVVJMcyIsImJ1aWxkRnVsbFBhdGgiLCJyZXF1aXJlJCQ4IiwicmVxdWlyZSQkOSIsInJlcXVpcmUkJDEwIiwiQXhpb3NFcnJvciIsImRlZmF1bHRzIiwidHJhbnNmb3JtRGF0YSIsImlzQ2FuY2VsIiwiZGlzcGF0Y2hSZXF1ZXN0IiwibWVyZ2VDb25maWciLCJ2YWxpZGF0b3JzIiwidmFsaWRhdG9yIiwiQXhpb3MiLCJheGlvcyIsInJlcXVpcmUkJDExIiwicmVxdWlyZSQkMTIiLCJheGlvc01vZHVsZSIsImF4aW9zXzEiLCJpc09uU2VydmVyIiwiY2hlY2tSZXNwb25zZSIsInJlc3BvbnNlIiwib3JpZ2luIiwicmVxdWVzdCIsInJlc3BvbnNlVVJMIiwiYWxlcnQiLCJhc3NpZ24iLCJBcGlDbGllbnQiLCJiYXNlVVJMIiwiZ2V0QmFzZVVybCIsImNsaWVudCIsImNyZWF0ZSIsInNlYXJjaFJlY29yZHMiLCJzZWFyY2hQcm9wZXJ0eSIsInJlc291cmNlQWN0aW9uIiwicGFyYW1zIiwidW5kZWZpbmVkIiwiZGF0YSIsInJlY29yZHMiLCJheGlvc1BhcmFtcyIsInEiLCJlbmNvZGVVUklDb21wb25lbnQiLCJtZXRob2QiLCJyZWNvcmRBY3Rpb24iLCJidWxrQWN0aW9uIiwiZ2V0RGFzaGJvYXJkIiwiZ2V0UGFnZSIsIkZPUk1fVkFMVUVfTlVMTCIsIkZPUk1fVkFMVUVfRU1QVFlfT0JKRUNUIiwiRk9STV9WQUxVRV9FTVBUWV9BUlJBWSIsImlzT2JqZWN0T3JBcnJheSIsInZhbHVlIiwiRmlsZSIsInBhcmFtc1RvRm9ybURhdGEiLCJmb3JtRGF0YSIsIkZvcm1EYXRhIiwiT2JqZWN0IiwiZW50cmllcyIsImZvckVhY2giLCJBcnJheSIsInRvSVNPU3RyaW5nIiwiQUREX05PVElDRSIsImFkZE5vdGljZSIsInR5cGUiLCJNYXRoIiwicmFuZG9tIiwic3Vic3RyIiwicHJvZ3Jlc3MiLCJ1c2VOb3RpY2UiLCJkaXNwYXRjaCIsInVzZURpc3BhdGNoIiwibm90aWNlIiwibWVyZ2VSZWNvcmRSZXNwb25zZSIsInJlY29yZCIsImVycm9ycyIsInBvcHVsYXRlZCIsImZsYXQiLCJERUxJTUlURVIiLCJwcm9wZXJ0eUtleVJlZ2V4IiwicHJvcGVydHlQYXRoIiwiZGVsaW1pdGVyIiwiZXNjYXBlZERlbGltaXRlciIsImVzY2FwZWREZWxpbWl0ZXJPckluZGV4IiwicGF0aCIsImluY2x1ZGVBbGxTaWJsaW5ncyIsInNlbGVjdFBhcmFtcyIsInByb3BlcnRpZXMiLCJwcm9wZXJ0eUFycmF5Iiwic2VsZWN0ZWQiLCJmaWx0ZXIiLCJyZWR1Y2UiLCJnbG9iYWxNZW1vIiwicmVnZXgiLCJmaWx0ZXJlZCIsIm1lbW8iLCJmaWx0ZXJPdXRQYXJhbXMiLCJnbG9iYWxGaWx0ZXJlZCIsInBhdGhUb1BhcnRzIiwiYWxsUGFydHMiLCJza2lwQXJyYXlJbmRleGVzIiwicGFydCIsImlzTmFOIiwicGFyYW1zQ29weSIsImZsYXR0ZW5lZCIsImZsYXR0ZW4iLCJzbGljZSIsImluY2x1ZGVzIiwiVEVNUF9IT0xESU5HX0tFWSIsInVuZmxhdHRlbiIsImZpbmQiLCJzZWxlY3RlZFBhcmFtcyIsIm5lc3RlZFByb3BlcnRpZXMiLCJpbmRleCIsIm5ld0tleSIsIm1lcmdlUGFyYW1zIiwiZmxhdHRlblBhcmFtcyIsInJldmVyc2UiLCJtZXJnZVBhcmFtIiwicmVtb3ZlUGF0aCIsInBhcmVudFBhdGhzIiwicGFyZW50UGF0aCIsInBhcmVudEluZGV4IiwicGFyZW50IiwicHJldmlvdXNQYXRocyIsInByZXZpb3VzUGF0aEluZGV4Iiwic3BsaWNlIiwidXBkYXRlUmVjb3JkIiwicHJvcGVydHkiLCJzZWxlY3RlZFJlY29yZCIsInByZXZpb3VzUmVjb3JkIiwicG9wdWxhdGVkTW9kaWZpZWQiLCJwb3B1bGF0ZWRDb3B5IiwiaXNFbnRpcmVSZWNvcmRHaXZlbiIsInByb3BlcnR5T3JSZWNvcmQiLCJFcnJvclR5cGVFbnVtIiwiZmlsdGVyUmVjb3JkUGFyYW1zIiwiaW5jbHVkZVBhcmFtcyIsImlzUHJvcGVydHlQZXJtaXR0ZWQiLCJzb21lIiwiYXBpIiwidXNlUmVjb3JkIiwiaW5pdGlhbFJlY29yZCIsImxvYWRpbmciLCJzZXRMb2FkaW5nIiwidXNlU3RhdGUiLCJpc1N5bmNlZCIsInNldElzU3luY2VkIiwic2V0UHJvZ3Jlc3MiLCJmaWx0ZXJlZFJlY29yZCIsInNldFJlY29yZCIsInNldEZpbHRlcmVkUmVjb3JkIiwidXNlQ2FsbGJhY2siLCJuZXdSZWNvcmQiLCJGdW5jdGlvbiIsIm9uTm90aWNlIiwiaGFuZGxlQ2hhbmdlIiwiaW5jb21pbmdSZWNvcmQiLCJjb25zb2xlIiwid2FybiIsImhhbmRsZVN1Ym1pdCIsImN1c3RvbVBhcmFtcyIsInN1Ym1pdE9wdGlvbnMiLCJtZXJnZWRQYXJhbXMiLCJvblVwbG9hZFByb2dyZXNzIiwiZSIsInJvdW5kIiwibG9hZGVkIiwidG90YWwiLCJoZWFkZXJzIiwicHJvbWlzZSIsInRoZW4iLCJ1cGRhdGVPblNhdmUiLCJwcmV2IiwiY2F0Y2giLCJzdWJtaXQiLCJhY3Rpb25IYXNDb21wb25lbnQiLCJhY3Rpb24iLCJjb21wb25lbnQiLCJhY3Rpb25IcmVmIiwiaGFzSGFuZGxlciIsImhyZWZNYXAiLCJyZXNvdXJjZSIsImJ1bGsiLCJhY3Rpb25UeXBlIiwiRXJyb3IiLCJnZXRSZXNvdXJjZUVsZW1lbnRDc3MiLCJzdWZmaXgiLCJnZXRBY3Rpb25FbGVtZW50Q3NzIiwiY2FsbEFjdGlvbkFwaSIsImJ1aWxkQWN0aW9uQ2FsbEFwaVRyaWdnZXIiLCJhY3Rpb25SZXNwb25zZUhhbmRsZXIiLCJjYWxsQXBpIiwiYnVpbGRBY3Rpb25UZXN0SWQiLCJidWlsZEFjdGlvbkNsaWNrSGFuZGxlciIsImhhbmRsZUFjdGlvbkNsaWNrIiwic3RvcFByb3BhZ2F0aW9uIiwiZ3VhcmQiLCJjb25maXJtIiwiUkVGUkVTSF9LRVkiLCJJR05PUkVfUEFSQU1TX0tFWSIsImFwcGVuZEZvcmNlUmVmcmVzaCIsInNlYXJjaFBhcmFtc0lkeCIsImxhc3RJbmRleE9mIiwidXJsU2VhcmNoUGFyYW1zIiwic3Vic3RyaW5nIiwib2xkUGFyYW1zIiwic2hvdWxkSWdub3JlT2xkUGFyYW1zIiwibmV3UGFyYW1zIiwiaGFzRm9yY2VSZWZyZXNoIiwicmVtb3ZlRm9yY2VSZWZyZXNoIiwiZGVsZXRlIiwidXNlQWN0aW9uUmVzcG9uc2VIYW5kbGVyIiwib25BY3Rpb25DYWxsIiwicmVkaXJlY3RVcmwiLCJhcHBlbmRlZCIsInVzZUFjdGlvbiIsImhhbmRsZUNsaWNrIiwiU0VTU0lPTl9JTklUSUFMSVpFIiwic2V0Q3VycmVudEFkbWluIiwidXNlQ3VycmVudEFkbWluIiwiY3VycmVudEFkbWluIiwic2Vzc2lvbiIsImFkbWluIiwidXNlTG9jYWxTdG9yYWdlIiwiaW5pdGlhbFZhbHVlIiwic3RvcmVkVmFsdWUiLCJzZXRTdG9yZWRWYWx1ZSIsIml0ZW0iLCJsb2NhbFN0b3JhZ2UiLCJnZXRJdGVtIiwiSlNPTiIsInBhcnNlIiwibG9nIiwic2V0VmFsdWUiLCJ2YWx1ZVRvU3RvcmUiLCJzZXRJdGVtIiwic3RyaW5naWZ5IiwicmVnRXhwIiwidXNlTmF2aWdhdGlvblJlc291cmNlcyIsInJlc291cmNlcyIsIm9wZW5FbGVtZW50cyIsInNldE9wZW5FbGVtZW50cyIsImVucmljaFJlc291cmNlIiwidXNlTWVtbyIsInJlcyIsIm5hdmlnYXRpb24iLCJzaG93IiwicHVzaCIsImlzT3BlbiIsInZhbHVlcyIsInVzZVJlY29yZHMiLCJzZXRSZWNvcmRzIiwicGVyUGFnZSIsInNldFBlclBhZ2UiLCJzZXRQYWdlIiwic2V0VG90YWwiLCJkaXJlY3Rpb24iLCJzZXREaXJlY3Rpb24iLCJzb3J0QnkiLCJzZXRTb3J0QnkiLCJmZXRjaERhdGEiLCJsaXN0QWN0aW9uUmVzcG9uc2UiLCJtZXRhIiwidXNlRWZmZWN0IiwidXNlU2VsZWN0ZWRSZWNvcmRzIiwic2VsZWN0ZWRSZWNvcmRzIiwic2V0U2VsZWN0ZWRSZWNvcmRzIiwiaGFuZGxlU2VsZWN0Iiwic2VsZWN0ZWRJbmRleCIsImZpbmRJbmRleCIsIm5ld1NlbGVjdGVkUmVjb3JkcyIsImhhbmRsZVNlbGVjdEFsbCIsIm1pc3NpbmciLCJidWxrQWN0aW9ucyIsInVzZVJlc291cmNlIiwiZm91bmRSZXNvdXJjZSIsIklOSVRJQUxfUk9VVEUiLCJST1VURV9DSEFOR0VEIiwiaW5pdGlhbGl6ZVJvdXRlIiwiY2hhbmdlUm91dGUiLCJ1c2VIaXN0b3J5TGlzdGVuIiwic3RvcmVkUGF0aCIsInNldFN0b3JlZFBhdGgiLCJ0byIsImZyb20iLCJyb3V0ZXIiLCJwcmV2aW91c1BhdGgiLCJjdXJyZW50UGF0aCIsIlNpZGViYXJSZXNvdXJjZVNlY3Rpb25PcmlnaW5hbCIsIlNpZGViYXJSZXNvdXJjZVNlY3Rpb24iLCJTdHlsZWRTaWRlYmFyIiwiZGVmYXVsdFByb3BzIiwicG9zaXRpb24iLCJ3aWR0aCIsImJvcmRlclJpZ2h0IiwiZGlzcGxheSIsImZsZXhEaXJlY3Rpb24iLCJ6SW5kZXgiLCJiZyIsIlNpZGViYXJPcmlnaW5hbCIsImlzVmlzaWJsZSIsIlNpZGViYXIiLCJMb2dnZWRJbiIsImRyb3BBY3Rpb25zIiwiQ3VycmVudFVzZXJOYXYiLCJlbWFpbCIsInRpdGxlIiwiYXZhdGFyVXJsIiwiT3ZlcnJpZGFibGVMb2dnZWRJbiIsIlZlcnNpb25JdGVtIiwiVGV4dCIsImNvbG9yIiwiVmVyc2lvbiIsInZlcnNpb25zIiwiYXBwIiwidmVyc2lvbiIsIk92ZXJyaWRhYmxlVmVyc2lvbiIsIk5hdkJhciIsInRoZW1lIiwic2l6ZXMiLCJuYXZiYXJIZWlnaHQiLCJjb2xvcnMiLCJ3aGl0ZSIsImNsYXNzTmFtZSIsIlRvcEJhciIsInRvZ2dsZVNpZGViYXIiLCJjdXJzb3IiLCJJY29uIiwiT3ZlcnJpZGFibGVUb3BiYXIiLCJEUk9QX05PVElDRSIsImRyb3BOb3RpY2UiLCJub3RpY2VJZCIsIlNFVF9OT1RJQ0VfUFJPR1JFU1MiLCJzZXROb3RpY2VQcm9ncmVzcyIsIlRJTUVfVE9fRElTQVBQRUFSIiwiTm90aWNlRWxlbWVudCIsInRpbWVyIiwiY29tcG9uZW50RGlkTW91bnQiLCJkcm9wIiwibm90aWZ5UHJvZ3Jlc3MiLCJzZXRJbnRlcnZhbCIsInNldFN0YXRlIiwic2V0VGltZW91dCIsImNsZWFySW50ZXJ2YWwiLCJjb21wb25lbnRXaWxsVW5tb3VudCIsInJlbmRlciIsIk1lc3NhZ2VCb3giLCJtaW5XaWR0aCIsIk5vdGljZUJveCIsIm5vdGljZXMiLCJtYXBTdGF0ZVRvUHJvcHMiLCJtYXBEaXNwYXRjaFRvUHJvcHMiLCJDb25uZWN0ZWROb3RpY2VCb3giLCJjb25uZWN0IiwiT3ZlcnJpZGFibGVDb25uZWN0ZWROb3RpY2VCb3giLCJwYWdlSGVhZGVySGVpZ2h0IiwicGFnZUhlYWRlclBhZGRpbmdZIiwicGFnZUhlYWRlclBhZGRpbmdYIiwiRGFzaGJvYXJkSGVhZGVyIiwiSWxsdXN0cmF0aW9uIiwiSDIiLCJib3hlcyIsInZhcmlhbnQiLCJzdWJ0aXRsZSIsIkNhcmQiLCJmbGV4IiwiZ3JleTEwMCIsInByaW1hcnkxMDAiLCJzaGFkb3dzIiwiY2FyZEhvdmVyIiwiYm94U2hhZG93IiwiRGFzaGJvYXJkIiwiYm94IiwiSDUiLCJINCIsIkJ1dHRvbiIsIkVycm9yTWVzc2FnZSIsIkVycm9yQm91bmRhcnkiLCJjb21wb25lbnREaWRDYXRjaCIsImNoaWxkcmVuIiwiaXNDbGllbnQiLCJkYXNoYm9hcmQiLCJEZWZhdWx0RGFzaGJvYXJkIiwiQnJlYWRjcnVtYkxpbmsiLCJncmV5NDAiLCJmb250IiwibGluZUhlaWdodHMiLCJkZWZhdWx0IiwiZm9udFNpemVzIiwic3BhY2UiLCJCcmVhZGNydW1iVGV4dCIsImZvbnRXZWlnaHRzIiwibm9ybWFsIiwiQnJlYWRjcnVtYnMiLCJsaXN0QWN0aW9uIiwicmVzb3VyY2VBY3Rpb25zIiwiYWN0aW9ucyIsImEiLCJjb250ZW50VGFnIiwiT3ZlcnJpZGFibGVCcmVhZGNydW1icyIsImFjdGlvbnNUb0J1dHRvbkdyb3VwIiwiYnV0dG9ucyIsInNvdXJjZSIsImJ1dHRvbnNNYXAiLCJidXR0b24iLCJidG4iLCJTdHlsZWRMaW5rIiwicm91bmRlZCIsIlJvdXRlckxpbmsiLCJCdXR0b25DU1MiLCJTdHlsZWRCYWNrQnV0dG9uIiwic2hvd0luRHJhd2VyIiwiY3NzQ2xvc2VJY29uIiwiT3ZlcnJpZGFibGVTdHlsZWRCYWNrQnV0dG9uIiwiQWN0aW9uSGVhZGVyIiwidG9nZ2xlRmlsdGVyIiwiYWN0aW9uUGVyZm9ybWVkIiwidGFnIiwib21pdEFjdGlvbnMiLCJoaWRlQWN0aW9uSGVhZGVyIiwic291cmNlQWN0aW9uIiwiYWN0aW9uQnV0dG9ucyIsInJlY29yZEFjdGlvbnMiLCJyYSIsImN1c3RvbVJlc291cmNlQnV0dG9ucyIsInNob3dSZXNvdXJjZUFjdGlvbnMiLCJjc3NJc1Jvb3RGbGV4IiwiY3NzSGVhZGVyTVQiLCJjc3NBY3Rpb25zTUIiLCJDc3NIQ29tcG9uZW50IiwiSDMiLCJCdXR0b25Hcm91cCIsIkJhZGdlIiwiT3ZlcnJpZGFibGVBY3Rpb25IZWFkZXIiLCJhcmVJbnB1dHNFcXVhbCIsInVzZU1lbW9PbmUiLCJwcmVmaXgiLCJpbnZhcmlhbnQiLCJfaW50ZXJvcERlZmF1bHQiLCJub1NwYWNpbmciLCJnZXRXaW5kb3dTY3JvbGwiLCJpc0VxdWFsIiwibWVtb2l6ZU9uZSIsInJhZlNjaGQiLCJfaW50ZXJvcERlZmF1bHRMZWdhY3kiLCJyZWR1Y2VyIiwiY3JlYXRlU3RvcmUiLCJBcHAiLCJBZGROZXdJdGVtQnV0dG9uIiwiUHJvcGVydHlEZXNjcmlwdGlvbiIsImRlc2NyaXB0aW9uIiwiY3VzdG9tIiwidG9vbHRpcERpcmVjdGlvbiIsIlRvb2x0aXAiLCJPdmVycmlkYWJsZVByb3BlcnR5RGVzY3JpcHRpb24iLCJQcm9wZXJ0eUxhYmVsIiwibGFiZWxQcm9wcyIsImhpZGVMYWJlbCIsIkxhYmVsIiwiaXNSZXF1aXJlZCIsIk92ZXJyaWRhYmxlUHJvcGVydHlMYWJlbCIsImdldFN1YnByb3BlcnR5UGF0aCIsImNvbnZlcnRUb1N1YlByb3BlcnR5IiwiYXJyYXlQcm9wZXJ0eSIsImlzRHJhZ2dhYmxlIiwicmVtb3ZlU3ViUHJvcGVydHkiLCJzdWJQcm9wZXJ0eVBhdGgiLCJwb3B1bGF0ZWRLZXlNYXAiLCJwcm9wZXJ0eUtleSIsIm5ld1BvcHVsYXRlZEtleU1hcCIsIm5ld1BvcHVsYXRlZCIsIm5ld1Byb3BlcnR5S2V5Iiwib2xkUHJvcGVydHlLZXkiLCJJdGVtUmVuZGVyZXIiLCJJdGVtQ29tcG9uZW50Iiwib25EZWxldGUiLCJ1bmlxdWVEcmFnZ2FibGVJZCIsImJ0b2EiLCJ1bmVzY2FwZSIsIkRyYWdnYWJsZSIsInByb3ZpZGVkIiwiaW5uZXJSZWYiLCJkcmFnZ2FibGVQcm9wcyIsImRyYWdIYW5kbGVQcm9wcyIsIklucHV0c0luU2VjdGlvbiIsIm9uQ2hhbmdlIiwiaXRlbXMiLCJhZGROZXciLCJuZXdJdGVtcyIsInN1YlByb3BlcnRpZXMiLCJyZW1vdmVJdGVtIiwic3ViUHJvcGVydHkiLCJoYW5kbGVPbkRyYWdFbmQiLCJyZXN1bHQiLCJkZXN0aW5hdGlvbiIsIml0ZW1zQ29weSIsInNvdXJjZUl0ZW0iLCJEcmFnRHJvcENvbnRleHQiLCJEcm9wcGFibGUiLCJTZWN0aW9uIiwiZHJvcHBhYmxlUHJvcHMiLCJpIiwiaXRlbVByb3BlcnR5IiwicGxhY2Vob2xkZXIiLCJFZGl0IiwidGVzdElkIiwiRm9ybUdyb3VwIiwiRm9ybU1lc3NhZ2UiLCJPdmVycmlkYWJsZUVkaXQiLCJMaXN0IiwiU2hvdyIsIlZhbHVlR3JvdXAiLCJFZGl0S2V5VmFsdWVQYWlyIiwib25LZXlDaGFuZ2UiLCJvblZhbHVlQ2hhbmdlIiwib25SZW1vdmVJdGVtIiwib2JqZWN0VmFsdWUiLCJvYmplY3RLZXkiLCJjdXJyZW50VmFsdWUiLCJjdXJyZW50S2V5Iiwic2V0S2V5IiwiQm9vbGVhbiIsIklucHV0IiwidGFyZ2V0Iiwia2V5Q29kZSIsImtleUlucHV0UHJvcHMiLCJ2YWx1ZUlucHV0UHJvcHMiLCJzZXRPYmplY3RWYWx1ZSIsImhhbmRsZUtleUNoYW5nZSIsIm9sZEtleSIsInRtcFZhbHVlIiwiX3JlbW92ZWRLZXkiLCJvYmplY3RDb3B5IiwicGFyc2VPYmplY3RWYWx1ZSIsImhhbmRsZVZhbHVlQ2hhbmdlIiwib2JqIiwiayIsInYiLCJnZXROZXh0S2V5IiwicHJldmlvdXNJZCIsIm5leHRJZCIsIm5leHRLZXkiLCJudW1iZXIiLCJhZGROZXdLZXlWYWx1ZVBhaXIiLCJoYW5kbGVSZW1vdmVJdGVtIiwiU2hvd0tleVZhbHVlUGFpciIsImlzSWQiLCJzdWJQcm9wZXJ0eVdpdGhQYXRoIiwicmVuZGVySXRlbXMiLCJzaG93QWN0aW9uIiwidGl0bGVQcm9wZXJ0eSIsInJlY29yZFByb3BlcnR5SXNFcXVhbCIsInByZXZQcm9wcyIsIm5leHRQcm9wcyIsInByZXZWYWx1ZSIsIm5leHRWYWx1ZSIsInByZXZFcnJvciIsIm5leHRFcnJvciIsInBhcnNlVmFsdWUiLCJpc0Rpc2FibGVkIiwiQ2hlY2tCb3giLCJpbmxpbmUiLCJCb29sZWFuUHJvcGVydHlWYWx1ZSIsInJhd1ZhbHVlIiwiYmFzZSIsIm1hcFZhbHVlIiwidHJhbnNsYXRpb24iLCJib29sVmFsdWUiLCJzIiwidGVzdCIsIkZpbHRlciIsIm8iLCJuZXdWYWx1ZSIsIlNlbGVjdCIsIkN1cnJlbmN5SW5wdXRXcmFwcGVyIiwiaW5pdGlhbCIsIkN1cnJlbmN5SW5wdXQiLCJPdmVycmlkYWJsZUN1cnJlbmN5SW5wdXRXcmFwcGVyIiwicHJvcFZhbHVlIiwib3B0aW9uc0tleXMiLCJwaWNrRm9ybWF0T3B0aW9ucyIsInBpY2tlZFByb3BzIiwiYWNjIiwiY3VyciIsImZvcm1hdFZhbHVlIiwiZm9ybWF0T3B0aW9ucyIsImZvcm1hdEN1cnJlbmN5UHJvcGVydHkiLCJEYXRlUGlja2VyIiwiZGF0ZSIsInByb3BlcnR5VHlwZSIsImZvcm1hdERhdGVQcm9wZXJ0eSIsIlBBUkFNX1NFUEFSQVRPUiIsIm5vcm1hbGl6ZUtleXMiLCJmaWx0ZXJzIiwibm9ybWFsaXplZCIsInBvcHVsYXRlIiwicmVmZXJlbmNlUmVzb3VyY2UiLCJkZWNvcmF0ZSIsImdldFByb3BlcnR5QnlLZXkiLCJyZWZlcmVuY2UiLCJmaW5kT25lIiwiY2FsbGJhY2siLCJCYWNrZW5kRmlsdGVyIiwiZnJvbUtleSIsInRvS2V5IiwiZnJvbVZhbHVlIiwidG9WYWx1ZSIsIkRlZmF1bHRQcm9wZXJ0eVZhbHVlIiwiYXZhaWxhYmxlVmFsdWVzIiwib3B0aW9uIiwib3B0IiwiU2VsZWN0RWRpdCIsImF2IiwiVGV4dEVkaXQiLCJoYW5kbGVJbnB1dENoYW5nZSIsImhhbmRsZVNlbGVjdENoYW5nZSIsInJlbmRlcklucHV0IiwiZmlsdGVyS2V5IiwiaXNJbnB1dCIsInNldElzSW5wdXQiLCJJbnB1dEdyb3VwIiwiUGhvbmVJbnB1dCIsInJlcXVpcmVkIiwibG9hZE9wdGlvbnMiLCJpbnB1dFZhbHVlIiwib3B0aW9uUmVjb3JkcyIsIm9wdGlvblJlY29yZCIsInNlbGVjdGVkSWQiLCJsb2FkZWRSZWNvcmQiLCJzZXRMb2FkZWRSZWNvcmQiLCJsb2FkaW5nUmVjb3JkIiwic2V0TG9hZGluZ1JlY29yZCIsImMiLCJmaW5hbGx5Iiwic2VsZWN0ZWRWYWx1ZSIsInNlbGVjdGVkT3B0aW9uIiwiU2VsZWN0QXN5bmMiLCJ4cyIsIlJlZmVyZW5jZVZhbHVlIiwicmVmSWQiLCJzZXRPcHRpb25zIiwibG9hZGVkT3B0aW9ucyIsInIiLCJTdHJpbmciLCJoYW5kbGVVcGRhdGUiLCJSaWNoVGV4dEVkaXRvciIsImdldERlZmF1bHRXaGl0ZUxpc3QiLCJzYWZlQXR0clZhbHVlIiwidXRpbCIsIl8iLCJwYXJzZVN0eWxlIiwicGFyc2VyIiwiREVGQVVMVCIsImlzTnVsbCIsInNoYWxsb3dDb3B5T2JqZWN0IiwiRmlsdGVyQ1NTIiwiX2RlZmF1bHQiLCJwYXJzZVRhZyIsInBhcnNlQXR0ciIsInhzcyIsImNyZWF0ZU1hcmt1cCIsImh0bWwiLCJfX2h0bWwiLCJiYXNlSXNSZWdFeHAiLCJiYXNlVW5hcnkiLCJpc1JlZ0V4cCIsImJhc2VQcm9wZXJ0eSIsImFzY2lpU2l6ZSIsInVuaWNvZGVTaXplIiwic3RyaW5nU2l6ZSIsInRyaW1tZWRFbmRJbmRleCIsImJhc2VUcmltIiwidG9OdW1iZXIiLCJ0b0Zpbml0ZSIsInRvSW50ZWdlciIsInN0cmlwSHRtbCIsImVsIiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50IiwiaW5uZXJIVE1MIiwidGV4dENvbnRlbnQiLCJpbm5lclRleHQiLCJtYXhMZW5ndGgiLCJ0ZXh0VmFsdWUiLCJ0cnVuY2F0ZSIsImxpbmUiLCJ0eXBlcyIsInRleHRhcmVhIiwiYm9vbGVhbiIsImRhdGV0aW1lIiwicGFzc3dvcmQiLCJyaWNodGV4dCIsInN0cmluZyIsImRlZmF1bHRUeXBlIiwiZmxvYXQiLCJ1dWlkIiwibWl4ZWQiLCJjdXJyZW5jeSIsInBob25lIiwiQmFzZVByb3BlcnR5Q29tcG9uZW50Iiwid2hlcmUiLCJjb21wb25lbnRzIiwiQXJyYXlUeXBlIiwiTWl4ZWQiLCJNaXhlZFR5cGUiLCJLZXlWYWx1ZSIsIktleVZhbHVlVHlwZSIsIkNsZWFuUHJvcGVydHlDb21wb25lbnQiLCJjbGVhblByb3BlcnR5IiwiY2FtZWxpemVQcm9wZXJ0eVR5cGUiLCJlZGl0IiwibGlzdCIsIkJhc2VQcm9wZXJ0eUNvbXBvbmVudEV4dGVuZGVkIiwiRGVmYXVsdFR5cGUiLCJEYXRlVGltZSIsIlJpY2hUZXh0IiwiUmVmZXJlbmNlIiwiVGV4dEFyZWEiLCJQYXNzd29yZCIsIkN1cnJlbmN5IiwiUGhvbmUiLCJMYXlvdXRFbGVtZW50UmVuZGVyZXIiLCJsYXlvdXRFbGVtZW50IiwibGF5b3V0UHJvcHMiLCJwcm9wZXJ0eU5hbWVzIiwibGF5b3V0RWxlbWVudHMiLCJpbm5lckxheW91dEVsZW1lbnRzIiwib3RoZXIiLCJEZXNpZ25TeXN0ZW0iLCJQcm9wZXJ0eVR5cGUiLCJpbm5lckxheW91dEVsZW1lbnQiLCJOZXciLCJmb3JtVGFnIiwiZm9vdGVyVGFnIiwiYnV0dG9uVGFnIiwiRHJhd2VyQ29udGVudCIsImxheW91dCIsImVkaXRQcm9wZXJ0aWVzIiwiRHJhd2VyRm9vdGVyIiwiT3ZlcnJpZGFibGVOZXciLCJzaG93UHJvcGVydGllcyIsIk92ZXJyaWRhYmxlU2hvdyIsIkFjdGlvbkJ1dHRvbiIsImZpcnN0Q2hpbGQiLCJDaGlsZHJlbiIsInRvQXJyYXkiLCJXcmFwcGVkRWxlbWVudCIsImNsb25lRWxlbWVudCIsIk92ZXJyaWRhYmxlQWN0aW9uQnV0dG9uIiwiTm9SZWNvcmRzT3JpZ2luYWwiLCJjYW5DcmVhdGUiLCJJbmZvQm94IiwiTm9SZWNvcmRzIiwiaXNUaXRsZSIsIlJlY29yZEluTGlzdCIsInJlY29yZEZyb21Qcm9wcyIsImlzTG9hZGluZyIsIm9uU2VsZWN0IiwiaGFuZGxlQWN0aW9uQ2FsbGJhY2siLCJhY3Rpb25SZXNwb25zZSIsInRhcmdldFRhZ05hbWUiLCJ0YWdOYW1lIiwidG9Mb3dlckNhc2UiLCJhY3Rpb25QYXJhbXMiLCJUYWJsZVJvdyIsIlRhYmxlQ2VsbCIsImxpc3RQcm9wZXJ0aWVzIiwiY2VsbFRhZyIsIlBsYWNlaG9sZGVyIiwiaGVpZ2h0IiwiT3ZlcnJpZGFibGVSZWNvcmRJbkxpc3QiLCJTb3J0TGluayIsIm9wcG9zaXRlRGlyZWN0aW9uIiwic29ydGVkQnlJY29uIiwiTmF2TGluayIsImNoZWNrU29ydFByb3BzIiwiUHJvcGVydHlIZWFkZXIiLCJpc01haW4iLCJpc1NvcnRhYmxlIiwiT3ZlcnJpZGFibGVQcm9wZXJ0eUhlYWRlciIsIlJlY29yZHNUYWJsZUhlYWRlciIsIm9uU2VsZWN0QWxsIiwic2VsZWN0ZWRBbGwiLCJyb3dUYWciLCJjaGVja2JveENzcyIsIlRhYmxlSGVhZCIsIm1hcmdpbkxlZnQiLCJPdmVycmlkYWJsZVJlY29yZHNUYWJsZUhlYWRlciIsImdldEJ1bGtBY3Rpb25zRnJvbVJlY29yZHMiLCJhY3Rpb25zTWVtbyIsIlNlbGVjdGVkUmVjb3JkcyIsImJ1bGtCdXR0b25zIiwiVGFibGVDYXB0aW9uIiwiVGl0bGUiLCJPdmVycmlkYWJsZVNlbGVjdGVkUmVjb3JkcyIsIlJlY29yZHNUYWJsZSIsIkxvYWRlciIsInJlY29yZHNIYXZlQnVsa0FjdGlvbiIsInNlbGVjdGVkVGFnIiwiYm9keVRhZyIsIlRhYmxlIiwiVGFibGVCb2R5IiwiT3ZlcnJpZGFibGVSZWNvcmRzVGFibGUiLCJzZXRUYWciLCJoYW5kbGVBY3Rpb25QZXJmb3JtZWQiLCJoYW5kbGVQYWdpbmF0aW9uQ2hhbmdlIiwicGFnZU51bWJlciIsIlBhZ2luYXRpb24iLCJPdmVycmlkYWJsZUxpc3QiLCJ3aXRoTm90aWNlIiwiQnVsa0RlbGV0ZSIsInRhYmxlVGFnIiwiY291bnQiLCJGb3JtYXR0ZWRCdWxrRGVsZXRlIiwiT3ZlcnJpZGFibGVGb3JtYXR0ZWRCdWxrRGVsZXRlIiwibmV3IiwiYnVsa0RlbGV0ZSIsIkJhc2VBY3Rpb25Db21wb25lbnQiLCJkb2N1bWVudGF0aW9uTGluayIsIkRPQ1MiLCJBY3Rpb24iLCJUcmFucyIsIkVycm9yTWVzc2FnZUJveCIsIk5vUmVzb3VyY2VFcnJvciIsIk5vQWN0aW9uRXJyb3IiLCJOb1JlY29yZEVycm9yIiwiU3R5bGVkV3JhcHBlcldpdGhGaWx0ZXIiLCJ4eGwiLCJTdHlsZWRXcmFwcGVyIiwiV3JhcHBlciIsInNob3dGaWx0ZXIiLCJEUkFXRVJfUE9SVEFMX0lEIiwiRFJBV0VSX1BPUlRBTF9XUkFQUEVSX0lEIiwiRHJhd2VyV3JhcHBlciIsIm9uTW91bnQiLCJUaGVtZVByb3ZpZGVyIiwiRHJhd2VyIiwiZ2V0T3JDcmVhdGVQb3J0YWxDb250YWluZXIiLCJjb250YWluZXIiLCJnZXRFbGVtZW50QnlJZCIsImJvZHkiLCJhcHBlbmRDaGlsZCIsIkRyYXdlclBvcnRhbCIsImRyYXdlckVsZW1lbnQiLCJzZXREcmF3ZXJFbGVtZW50IiwiaGFuZGxlRHJhd2VyTW91bnQiLCJpbm5lcldyYXBwZXJFbGVtZW50IiwiZHJhd2VyUm9vdCIsImNyZWF0ZVJvb3QiLCJpbm5lcldyYXBwZXIiLCJyZW1vdmVDaGlsZCIsImNsYXNzTGlzdCIsInJlbW92ZSIsInN0eWxlIiwiREVGQVVMVF9EUkFXRVJfV0lEVEgiLCJhZGQiLCJzZXRBdHRyaWJ1dGUiLCJjcmVhdGVQb3J0YWwiLCJwYXJzZVF1ZXJ5IiwiZW50cnkiLCJGaWx0ZXJEcmF3ZXIiLCJmaWx0ZXJQcm9wZXJ0aWVzIiwic2V0RmlsdGVyIiwidXNlUGFyYW1zIiwiaW5pdGlhbExvYWQiLCJ1c2VSZWYiLCJjdXJyZW50IiwicmVzZXRGaWx0ZXIiLCJmaWx0ZXJlZFNlYXJjaCIsImNzc0NvbnRlbnQiLCJjc3NGb290ZXIiLCJjc3NCdXR0b25BcHBseSIsImNzc0J1dHRvblJlc2V0IiwiT3ZlcnJpZGFibGVGaWx0ZXJEcmF3ZXIiLCJSZWNvcmRBY3Rpb24iLCJmZXRjaFJlY29yZCIsImJhc2VFcnJvciIsIk5vdEZvdW5kIiwiRm9yYmlkZGVuIiwib2xkUmVjb3JkIiwiaGFzRGlmZmVyZW50UmVjb3JkIiwiYWN0aW9uRnJvbVJlc291cmNlIiwiY29udGFpbmVyV2lkdGgiLCJSZXNvdXJjZUFjdGlvbiIsImZpbHRlclZpc2libGUiLCJzZXRGaWx0ZXJWaXNpYmxlIiwiQnVsa0FjdGlvbiIsImZldGNoUmVjb3JkcyIsInJlY29yZElkc1N0cmluZyIsIlBhZ2UiLCJzZXRJc0NsaWVudCIsImN1cnJlbnRQYWdlIiwiZ2V0QWN0aW9uIiwicmVzb3VyY2VBY3Rpb25NYXRjaCIsInVzZU1hdGNoIiwicmVjb3JkQWN0aW9uTWF0Y2giLCJidWxrQWN0aW9uTWF0Y2giLCJyZWFsRW5kQWN0aW9uIiwibGlzdEFjdGlvbk5hbWUiLCJCYXNlQWN0aW9uIiwiR2xvYmFsU3R5bGUiLCJjcmVhdGVHbG9iYWxTdHlsZSIsInNpZGViYXJWaXNpYmxlIiwiUmVzZXQiLCJPdmVybGF5IiwiTm90aWNlIiwiUm91dGVzIiwiUm91dGUiLCJBU1NFVFNfSU5JVElBTElaRSIsIkJSQU5ESU5HX0lOSVRJQUxJWkUiLCJEQVNIQk9BUkRfSU5JVElBTElaRSIsIkxPQ0FMRV9JTklUSUFMSVpFIiwiUEFHRVNfSU5JVElBTElaRSIsIlBBVEhTX0lOSVRJQUxJWkUiLCJSRVNPVVJDRVNfSU5JVElBTElaRSIsIlZFUlNJT05TX0lOSVRJQUxJWkUiLCJyZXNvdXJjZXNSZWR1Y2VyIiwicGFnZXNSZWR1Y2VyIiwibG9jYWxlc1JlZHVjZXIiLCJsYW5ndWFnZSIsInRyYW5zbGF0aW9ucyIsImJyYW5kaW5nUmVkdWNlciIsImFzc2V0c1JlZHVjZXIiLCJwYXRoc1JlZHVjZXIiLCJERUZBVUxUX1BBVEhTIiwiZGFzaGJvYXJkUmVkdWNlciIsInNlc3Npb25SZWR1Y2VyIiwidmVyc2lvbnNSZWR1Y2VyIiwicm91dGVyUmVkdWNlciIsIm5vdGljZXNSZWR1Y2VyIiwiY29tYmluZVJlZHVjZXJzIiwiYXNzZXRzIiwibG9jYWxlIiwiaW5pdGlhbFN0YXRlIiwiZW52IiwiTk9ERV9FTlYiLCJzdG9yZSIsInVzZSIsImluaXRSZWFjdEkxOG5leHQiLCJpbml0IiwibG5nIiwiaW50ZXJwb2xhdGlvbiIsImVzY2FwZVZhbHVlIiwiQXBwbGljYXRpb24iLCJQcm92aWRlciIsIkJyb3dzZXJSb3V0ZXIiLCJyZWdlbmVyYXRvclJ1bnRpbWUiLCJfcmVnZW5lcmF0b3JSdW50aW1lIiwiQXBwQ29tcG9uZW50cyIsIkhvb2tzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQUFBLFNBQVMsT0FBTyxDQUFDLEdBQUcsRUFBRTtDQUN0QixHQUFFLHlCQUF5QixDQUFDO0FBQzVCO0NBQ0EsR0FBRSxPQUFPLENBQUMsTUFBQSxDQUFBLE9BQUEsR0FBaUIsT0FBTyxHQUFHLFVBQVUsSUFBSSxPQUFPLE1BQU0sSUFBSSxRQUFRLElBQUksT0FBTyxNQUFNLENBQUMsUUFBUSxHQUFHLFVBQVUsR0FBRyxFQUFFO01BQ3BILE9BQU8sT0FBTyxHQUFHLENBQUM7S0FDbkIsR0FBRyxVQUFVLEdBQUcsRUFBRTtNQUNqQixPQUFPLEdBQUcsSUFBSSxVQUFVLElBQUksT0FBTyxNQUFNLElBQUksR0FBRyxDQUFDLFdBQVcsS0FBSyxNQUFNLElBQUksR0FBRyxLQUFLLE1BQU0sQ0FBQyxTQUFTLEdBQUcsUUFBUSxHQUFHLE9BQU8sR0FBRyxDQUFDO0NBQ2hJLElBQUcsRUFBRSxNQUE0QixDQUFBLE9BQUEsQ0FBQSxVQUFBLEdBQUEsSUFBSSxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsTUFBTSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7R0FDaEc7QUFDRDtDQUNBLENBQUEsTUFBQSxDQUFBLE9BQUEsR0FBaUIsT0FBTyxFQUFFLE1BQTRCLENBQUEsT0FBQSxDQUFB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QUFvRCxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLE9BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsR0FBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLGlEQUFpRCxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLGtCQUFjLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxXQUFXLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztDQUNqbEUsQ0FBQTs7Ozs7Ozs7Ozs7Ozs7Q0NEQSxFQUFBLFNBQVMsZUFBZSxDQUFDLFFBQVEsRUFBRSxXQUFXLEVBQUU7Q0FDaEQsSUFBRSxJQUFJLEVBQUUsUUFBUSxZQUFZLFdBQVcsQ0FBQyxFQUFFO0NBQzFDLE1BQUksTUFBTSxJQUFJLFNBQVMsQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDO01BQzFEO0lBQ0Y7QUFDRDtDQUNBLEVBQUEsTUFBQSxDQUFBLE9BQUEsR0FBaUIsZUFBZSxFQUFFLE1BQTRCLENBQUEsT0FBQSxDQUFBLFVBQUEsR0FBQSxJQUFJLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFBOzs7Ozs7Ozs7Ozs7O0NDTjlHLEVBQUEsU0FBUyxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFO0NBQzFDLElBQUUsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Q0FDekMsTUFBSSxJQUFJLFVBQVUsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7T0FDMUIsVUFBVSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUMsVUFBVSxJQUFJLEtBQUssQ0FBQztDQUMzRCxNQUFJLFVBQVUsQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO09BQy9CLElBQUksT0FBTyxJQUFJLFVBQVUsRUFBRSxVQUFVLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztDQUMxRCxNQUFJLE1BQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsVUFBVSxDQUFDLENBQUM7TUFDM0Q7SUFDRjtBQUNEO0NBQ0EsRUFBQSxTQUFTLFlBQVksQ0FBQyxXQUFXLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRTtLQUMxRCxJQUFJLFVBQVUsRUFBRSxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0tBQ3JFLElBQUksV0FBVyxFQUFFLGlCQUFpQixDQUFDLFdBQVcsRUFBRSxXQUFXLENBQUMsQ0FBQztDQUMvRCxJQUFFLE1BQU0sQ0FBQyxjQUFjLENBQUMsV0FBVyxFQUFFLFdBQVcsRUFBRTtPQUM5QyxRQUFRLEVBQUUsS0FBSztDQUNuQixLQUFHLENBQUMsQ0FBQztLQUNILE9BQU8sV0FBVyxDQUFDO0lBQ3BCO0FBQ0Q7Q0FDQSxFQUFBLE1BQUEsQ0FBQSxPQUFBLEdBQWlCLFlBQVksRUFBRSxNQUE0QixDQUFBLE9BQUEsQ0FBQSxVQUFBLEdBQUEsSUFBSSxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQTs7Ozs7Ozs7Ozs7O0FDbEIzRztDQUNBLENBQUEsTUFBTSxDQUFDLGNBQWMsQ0FBQ0MsV0FBTyxFQUFFLFlBQVksRUFBRTtJQUMzQyxLQUFLLEVBQUUsSUFBSTtDQUNiLEVBQUMsQ0FBQyxDQUFDO0NBQ0gsQ0FBZ0JBLFdBQUEsQ0FBQSxRQUFBLEdBQUcsS0FBSyxDQUFDLENBQUM7RUFDMUIsSUFBSSxlQUFlLEdBQUcsbUdBQW1HLENBQUM7Q0FDMUgsQ0FBQSxJQUFJLFlBQVksR0FBRztJQUNqQixPQUFPLEVBQUUsR0FBRztJQUNaLE9BQU8sRUFBRSxHQUFHO0lBQ1osTUFBTSxFQUFFLEdBQUc7SUFDWCxPQUFPLEVBQUUsR0FBRztJQUNaLE1BQU0sRUFBRSxHQUFHO0lBQ1gsT0FBTyxFQUFFLEdBQUc7SUFDWixRQUFRLEVBQUUsR0FBRztJQUNiLE9BQU8sRUFBRSxHQUFHO0lBQ1osUUFBUSxFQUFFLEdBQUc7SUFDYixPQUFPLEVBQUUsR0FBRztJQUNaLFFBQVEsRUFBRSxHQUFHO0lBQ2IsUUFBUSxFQUFFLEdBQUc7SUFDYixRQUFRLEVBQUUsR0FBRztJQUNiLFFBQVEsRUFBRSxHQUFHO0lBQ2IsT0FBTyxFQUFFLEdBQUc7SUFDWixRQUFRLEVBQUUsR0FBRztJQUNiLFVBQVUsRUFBRSxHQUFHO0lBQ2YsU0FBUyxFQUFFLEdBQUc7SUFDZCxRQUFRLEVBQUUsR0FBRztJQUNiLE9BQU8sRUFBRSxHQUFHO0NBQ2QsRUFBQyxDQUFDO0FBQ0Y7Q0FDQSxDQUFBLElBQUksa0JBQWtCLEdBQUcsU0FBUyxrQkFBa0IsQ0FBQyxDQUFDLEVBQUU7Q0FDeEQsR0FBRSxPQUFPLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztDQUN6QixFQUFDLENBQUM7QUFDRjtDQUNBLENBQUEsSUFBSSxRQUFRLEdBQUcsU0FBUyxRQUFRLENBQUMsSUFBSSxFQUFFO0lBQ3JDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztDQUMzRCxFQUFDLENBQUM7QUFDRjtDQUNBLENBQUFBLFdBQUEsQ0FBQSxRQUFnQixHQUFHLFFBQVEsQ0FBQTs7OztDQ3BDM0IsSUFBSUMsd0JBQXNCLEdBQUdGLDZCQUF1RCxDQUFDO0FBQ3JGO0NBQ0EsTUFBTSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsWUFBWSxFQUFFO0NBQzdDLEVBQUUsS0FBSyxFQUFFLElBQUk7Q0FDYixDQUFDLENBQUMsQ0FBQztDQUNnQixPQUFBLENBQUEsV0FBQSxHQUFHLFlBQVk7Q0FDZixPQUFBLENBQUEsV0FBQSxHQUFHLFlBQVk7Q0FDbkIsT0FBQSxDQUFBLE9BQUEsR0FBRyxRQUFRO0NBQ1gsT0FBQSxDQUFBLE9BQUEsR0FBRyxRQUFRO0NBQ0MsT0FBQSxDQUFBLG1CQUFBLEdBQUcsb0JBQW9CO0NBQzNCLE9BQUEsQ0FBQSxlQUFBLEdBQUcsZ0JBQWdCO0NBQzFDLE9BQUEsQ0FBQSxnQkFBd0IsR0FBMkIsT0FBQSxDQUFBLGdCQUFBLHNCQUFzQixHQUFHLEtBQUssRUFBRTtBQUNuRjtDQUNBLElBQUksZ0JBQWdCLEdBQUdFLHdCQUFzQixDQUFDQyxxQkFBQSxFQUFnRCxDQUFDLENBQUM7QUFDaEc7Q0FDQSxJQUFJLGFBQWEsR0FBR0Qsd0JBQXNCLENBQUNFLGtCQUFBLEVBQTZDLENBQUMsQ0FBQztBQUMxRjtDQUNBLElBQUlDLGtCQUFnQixHQUFHSCx3QkFBc0IsQ0FBQ0kscUJBQUEsRUFBZ0QsQ0FBQyxDQUFDO0FBQ2hHO0NBQ0EsSUFBSUMsUUFBTSxHQUFHQywyQkFBZ0IsQ0FBQztBQUM5QjtDQUNBLElBQUksU0FBUyxHQUFHQyxnQkFBQSxFQUFxQixDQUFDO0FBQ3RDO0NBQ0EsU0FBU0MsU0FBTyxDQUFDLE1BQU0sRUFBRSxjQUFjLEVBQUUsRUFBRSxJQUFJLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMscUJBQXFCLEVBQUUsRUFBRSxJQUFJLE9BQU8sR0FBRyxNQUFNLENBQUMscUJBQXFCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLGNBQWMsRUFBRSxFQUFFLE9BQU8sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLFVBQVUsR0FBRyxFQUFFLEVBQUUsT0FBTyxNQUFNLENBQUMsd0JBQXdCLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLElBQUksQ0FBQyxFQUFFO0FBQ3pWO0NBQ0EsU0FBU0MsZUFBYSxDQUFDLE1BQU0sRUFBRSxFQUFFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsSUFBSSxNQUFNLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUVELFNBQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsR0FBRyxFQUFFLEVBQUUsSUFBSUwsa0JBQWdCLENBQUMsU0FBUyxDQUFDLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLE1BQU0sSUFBSSxNQUFNLENBQUMseUJBQXlCLEVBQUUsRUFBRSxNQUFNLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyx5QkFBeUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFSyxTQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsR0FBRyxFQUFFLEVBQUUsTUFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxPQUFPLE1BQU0sQ0FBQyxFQUFFO0FBQ3ZpQjtDQUNBLElBQUksY0FBYyxHQUFHO0NBQ3JCLEVBQUUsUUFBUSxFQUFFLGlCQUFpQjtDQUM3QixFQUFFLGFBQWEsRUFBRSxFQUFFO0NBQ25CLEVBQUUsbUJBQW1CLEVBQUUsRUFBRTtDQUN6QixFQUFFLDBCQUEwQixFQUFFLElBQUk7Q0FDbEMsRUFBRSxrQkFBa0IsRUFBRSxFQUFFO0NBQ3hCLEVBQUUsMEJBQTBCLEVBQUUsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7Q0FDeEQsRUFBRSxXQUFXLEVBQUUsSUFBSTtDQUNuQixFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsUUFBUTtDQUM5QixDQUFDLENBQUM7Q0FDRixJQUFJLFlBQVksQ0FBQztDQUNqQixJQUFJLFdBQVcsR0FBRyxJQUFJSCxRQUFNLENBQUMsYUFBYSxHQUFHLENBQUM7Q0FDM0IsT0FBQSxDQUFBLFdBQUEsR0FBRyxZQUFZO0FBQ2xDO0NBQ0EsU0FBUyxXQUFXLEdBQUc7Q0FDdkIsRUFBRSxJQUFJLE9BQU8sR0FBRyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7Q0FDdkYsRUFBRSxjQUFjLEdBQUdJLGVBQWEsQ0FBQ0EsZUFBYSxDQUFDLEVBQUUsRUFBRSxjQUFjLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztDQUM3RSxDQUFDO0FBQ0Q7Q0FDQSxTQUFTLFdBQVcsR0FBRztDQUN2QixFQUFFLE9BQU8sY0FBYyxDQUFDO0NBQ3hCLENBQUM7QUFDRDtDQUNBLElBQUksZ0JBQWdCLEdBQUcsWUFBWTtDQUNuQyxFQUFFLFNBQVMsZ0JBQWdCLEdBQUc7Q0FDOUIsSUFBSSxJQUFJLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxFQUFFLElBQUksRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO0NBQzdELElBQUksSUFBSSxDQUFDLGNBQWMsR0FBRyxFQUFFLENBQUM7Q0FDN0IsR0FBRztBQUNIO0NBQ0EsRUFBRSxJQUFJLGFBQWEsQ0FBQyxTQUFTLENBQUMsRUFBRSxnQkFBZ0IsRUFBRSxDQUFDO0NBQ25ELElBQUksR0FBRyxFQUFFLG1CQUFtQjtDQUM1QixJQUFJLEtBQUssRUFBRSxTQUFTLGlCQUFpQixDQUFDLFVBQVUsRUFBRTtDQUNsRCxNQUFNLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQztBQUN2QjtDQUNBLE1BQU0sVUFBVSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsRUFBRTtDQUN2QyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDO0NBQ3ZFLE9BQU8sQ0FBQyxDQUFDO0NBQ1QsS0FBSztDQUNMLEdBQUcsRUFBRTtDQUNMLElBQUksR0FBRyxFQUFFLG1CQUFtQjtDQUM1QixJQUFJLEtBQUssRUFBRSxTQUFTLGlCQUFpQixHQUFHO0NBQ3hDLE1BQU0sT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztDQUM5QyxLQUFLO0NBQ0wsR0FBRyxDQUFDLENBQUMsQ0FBQztDQUNOLEVBQUUsT0FBTyxnQkFBZ0IsQ0FBQztDQUMxQixDQUFDLEVBQUUsQ0FBQztBQUNKO0NBQ3dCLE9BQUEsQ0FBQSxnQkFBQSxHQUFHLGlCQUFpQjtBQUM1QztDQUNBLFNBQVMsT0FBTyxDQUFDLFFBQVEsRUFBRTtDQUMzQixFQUFFLFlBQVksR0FBRyxRQUFRLENBQUM7Q0FDMUIsQ0FBQztBQUNEO0NBQ0EsU0FBUyxPQUFPLEdBQUc7Q0FDbkIsRUFBRSxPQUFPLFlBQVksQ0FBQztDQUN0QixDQUFDO0FBQ0Q7Q0FDQSxJQUFJLGdCQUFnQixHQUFHO0NBQ3ZCLEVBQUUsSUFBSSxFQUFFLFVBQVU7Q0FDbEIsRUFBRSxJQUFJLEVBQUUsU0FBUyxJQUFJLENBQUMsUUFBUSxFQUFFO0NBQ2hDLElBQUksV0FBVyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7Q0FDeEMsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7Q0FDdEIsR0FBRztDQUNILENBQUMsQ0FBQztDQUNzQixPQUFBLENBQUEsZ0JBQUEsR0FBRyxnQkFBZ0IsQ0FBQztBQUM1QztDQUNBLFNBQVMsbUJBQW1CLENBQUMsWUFBWSxFQUFFO0NBQzNDLEVBQUUsT0FBTyxVQUFVLEdBQUcsRUFBRTtDQUN4QixJQUFJLE9BQU8sSUFBSSxPQUFPLENBQUMsVUFBVSxPQUFPLEVBQUU7Q0FDMUMsTUFBTSxJQUFJLGdCQUFnQixHQUFHLGVBQWUsRUFBRSxDQUFDO0FBQy9DO0NBQ0EsTUFBTSxJQUFJLFlBQVksQ0FBQyxlQUFlLEVBQUU7Q0FDeEMsUUFBUSxZQUFZLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLHNCQUFzQixFQUFFO0NBQ2pGLFVBQVUsT0FBTyxDQUFDQSxlQUFhLENBQUNBLGVBQWEsQ0FBQyxFQUFFLEVBQUUsc0JBQXNCLENBQUMsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7Q0FDOUYsU0FBUyxDQUFDLENBQUM7Q0FDWCxPQUFPLE1BQU07Q0FDYixRQUFRLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0NBQ2xDLE9BQU87Q0FDUCxLQUFLLENBQUMsQ0FBQztDQUNQLEdBQUcsQ0FBQztDQUNKLENBQUM7QUFDRDtDQUNBLFNBQVMsZUFBZSxHQUFHO0NBQzNCLEVBQUUsSUFBSSxJQUFJLEdBQUcsT0FBTyxFQUFFLENBQUM7Q0FDdkIsRUFBRSxJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGlCQUFpQixFQUFFLEdBQUcsRUFBRSxDQUFDO0NBQzFGLEVBQUUsSUFBSSxHQUFHLEdBQUcsRUFBRSxDQUFDO0NBQ2YsRUFBRSxJQUFJLGdCQUFnQixHQUFHLEVBQUUsQ0FBQztDQUM1QixFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUFFO0NBQ3RDLElBQUksZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0NBQzdCLElBQUksVUFBVSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsRUFBRTtDQUNyQyxNQUFNLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO0NBQ3BFLEtBQUssQ0FBQyxDQUFDO0NBQ1AsR0FBRyxDQUFDLENBQUM7Q0FDTCxFQUFFLEdBQUcsQ0FBQyxnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQztDQUMxQyxFQUFFLEdBQUcsQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztDQUN0QyxFQUFFLE9BQU8sR0FBRyxDQUFDO0NBQ2I7Ozs7Ozs7OztBQzVIQTtDQUNBLENBQUEsTUFBTSxDQUFDLGNBQWMsQ0FBQ0MsT0FBTyxFQUFFLFlBQVksRUFBRTtJQUMzQyxLQUFLLEVBQUUsSUFBSTtDQUNiLEVBQUMsQ0FBQyxDQUFDO0NBQ0gsQ0FBWUEsT0FBQSxDQUFBLElBQUEsR0FBRyxJQUFJLENBQUM7Q0FDcEIsQ0FBZ0JBLE9BQUEsQ0FBQSxRQUFBLEdBQUcsUUFBUSxDQUFDO0NBQzVCLENBQXNCQSxPQUFBLENBQUEsY0FBQSxHQUFHLGNBQWMsQ0FBQztDQUN4QyxDQUEwQkEsT0FBQSxDQUFBLGtCQUFBLEdBQUcsa0JBQWtCLENBQUM7Q0FDaEQsQ0FBc0JBLE9BQUEsQ0FBQSxjQUFBLEdBQUcsY0FBYyxDQUFDO0FBQ3hDO0NBQ0EsQ0FBQSxTQUFTLElBQUksR0FBRztDQUNoQixHQUFFLElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxJQUFJLEVBQUU7TUFDM0IsSUFBSSxRQUFRLENBQUM7QUFDakI7TUFDSSxLQUFLLElBQUksSUFBSSxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxHQUFHLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksR0FBRyxDQUFDLEVBQUUsSUFBSSxHQUFHLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRTtRQUN2RixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO09BQzlCO0FBQ0w7TUFDSSxJQUFJLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsa0JBQWtCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xGO0NBQ0EsS0FBSSxDQUFDLFFBQVEsR0FBRyxPQUFPLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7S0FDakQ7R0FDRjtBQUNEO0VBQ0EsSUFBSSxhQUFhLEdBQUcsRUFBRSxDQUFDO0FBQ3ZCO0NBQ0EsQ0FBQSxTQUFTLFFBQVEsR0FBRztJQUNsQixLQUFLLElBQUksS0FBSyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxHQUFHLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRTtNQUM3RixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO0tBQ2hDO0FBQ0g7Q0FDQSxHQUFFLElBQUksT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssUUFBUSxJQUFJLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPO0lBQ2xFLElBQUksT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssUUFBUSxFQUFFLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO0lBQ3JFLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7R0FDMUI7QUFDRDtDQUNBLENBQUEsU0FBUyxjQUFjLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUU7Q0FDdEMsR0FBRSxJQUFJLENBQUMsY0FBYyxDQUFDLEVBQUUsRUFBRSxZQUFZO0NBQ3RDLEtBQUksSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFO1FBQ3RCLEVBQUUsRUFBRSxDQUFDO0NBQ1gsTUFBSyxNQUFNO0NBQ1gsT0FBTSxJQUFJLFdBQVcsR0FBRyxTQUFTLFdBQVcsR0FBRztVQUN2QyxVQUFVLENBQUMsWUFBWTtZQUNyQixJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxXQUFXLENBQUMsQ0FBQztXQUN0QyxFQUFFLENBQUMsQ0FBQyxDQUFDO1VBQ04sRUFBRSxFQUFFLENBQUM7Q0FDYixRQUFPLENBQUM7QUFDUjtRQUNNLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxFQUFFLFdBQVcsQ0FBQyxDQUFDO09BQ3JDO0NBQ0wsSUFBRyxDQUFDLENBQUM7R0FDSjtBQUNEO0NBQ0EsQ0FBQSxTQUFTLDRCQUE0QixDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUU7SUFDOUMsSUFBSSxPQUFPLEdBQUcsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ3JGLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7Q0FDOUIsR0FBRSxJQUFJLFdBQVcsR0FBRyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztDQUNwRSxHQUFFLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDeEQsSUFBSSxHQUFHLENBQUMsV0FBVyxFQUFFLEtBQUssUUFBUSxFQUFFLE9BQU8sSUFBSSxDQUFDO0FBQ2xEO0lBQ0UsSUFBSSxjQUFjLEdBQUcsU0FBUyxjQUFjLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRTtNQUNqRCxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNsRixPQUFPLFNBQVMsS0FBSyxDQUFDLENBQUMsSUFBSSxTQUFTLEtBQUssQ0FBQyxDQUFDO0NBQy9DLElBQUcsQ0FBQztBQUNKO0NBQ0EsR0FBRSxJQUFJLE9BQU8sQ0FBQyxRQUFRLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsb0JBQW9CLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLEVBQUUsQ0FBQyxFQUFFLE9BQU8sS0FBSyxDQUFDO0NBQ25OLEdBQUUsSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLE9BQU8sSUFBSSxDQUFDO0lBQ2pELElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsdUJBQXVCLEVBQUUsT0FBTyxJQUFJLENBQUM7SUFDNUgsSUFBSSxjQUFjLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsV0FBVyxJQUFJLGNBQWMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxPQUFPLElBQUksQ0FBQztJQUMxRixPQUFPLEtBQUssQ0FBQztHQUNkO0FBQ0Q7Q0FDQSxDQUFBLFNBQVMsa0JBQWtCLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRTtJQUNwQyxJQUFJLE9BQU8sR0FBRyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDdkY7Q0FDQSxHQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUU7TUFDN0MsUUFBUSxDQUFDLHdDQUF3QyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztNQUNuRSxPQUFPLElBQUksQ0FBQztLQUNiO0FBQ0g7SUFDRSxJQUFJLGNBQWMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLG1CQUFtQixLQUFLLFNBQVMsQ0FBQztBQUN0RTtJQUNFLElBQUksQ0FBQyxjQUFjLEVBQUU7TUFDbkIsT0FBTyw0QkFBNEIsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0tBQ3hEO0FBQ0g7Q0FDQSxHQUFFLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLEVBQUUsRUFBRTtNQUNqQyxRQUFRLEVBQUUsU0FBUyxRQUFRLENBQUMsWUFBWSxFQUFFLGNBQWMsRUFBRTtDQUM5RCxPQUFNLElBQUksT0FBTyxDQUFDLFFBQVEsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLFlBQVksQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxJQUFJLFlBQVksQ0FBQyxvQkFBb0IsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsb0JBQW9CLEVBQUUsRUFBRSxDQUFDLEVBQUUsT0FBTyxLQUFLLENBQUM7T0FDMU87Q0FDTCxJQUFHLENBQUMsQ0FBQztHQUNKO0FBQ0Q7RUFDQSxTQUFTLGNBQWMsQ0FBQyxTQUFTLEVBQUU7SUFDakMsT0FBTyxTQUFTLENBQUMsV0FBVyxJQUFJLFNBQVMsQ0FBQyxJQUFJLEtBQUssT0FBTyxTQUFTLEtBQUssUUFBUSxJQUFJLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxHQUFHLFNBQVMsR0FBRyxTQUFTLENBQUMsQ0FBQztDQUNwSSxFQUFBOzs7O0NDOUZBLElBQUlWLHdCQUFzQixHQUFHRiw2QkFBdUQsQ0FBQztBQUNyRjtDQUNBLE1BQU0sQ0FBQyxjQUFjLENBQUNhLE9BQU8sRUFBRSxZQUFZLEVBQUU7Q0FDN0MsRUFBRSxLQUFLLEVBQUUsSUFBSTtDQUNiLENBQUMsQ0FBQyxDQUFDO0FBQ2tCQSxRQUFBLENBQUEsYUFBQSxHQUFHLGNBQWM7QUFDekJBLFFBQUEsQ0FBQSxLQUFBLEdBQUcsTUFBTTtBQUN0QjtDQUNBLElBQUlDLDJCQUF5QixHQUFHWix3QkFBc0IsQ0FBQ0MsOEJBQUEsRUFBeUQsQ0FBQyxDQUFDO0FBQ2xIO0NBQ0EsSUFBSSxRQUFRLEdBQUdELHdCQUFzQixDQUFDRSxpQkFBd0MsQ0FBQyxDQUFDO0FBQ2hGO0NBQ0EsSUFBSUMsa0JBQWdCLEdBQUdILHdCQUFzQixDQUFDSSxxQkFBQSxFQUFnRCxDQUFDLENBQUM7QUFDaEc7Q0FDQSxJQUFJQyxRQUFNLEdBQUdDLDJCQUFnQixDQUFDO0FBQzlCO0NBQ0EsSUFBSSxtQkFBbUIsR0FBR04sd0JBQXNCLENBQUNPLHlCQUFBLEVBQStCLENBQUMsQ0FBQztBQUNsRjtDQUNBLElBQUlNLFVBQVEsR0FBR0MsT0FBb0IsQ0FBQztBQUNwQztDQUNBLElBQUlDLFFBQU0sR0FBR0MsWUFBQSxFQUFrQixDQUFDO0FBQ2hDO0NBQ0EsSUFBSUMsV0FBUyxHQUFHLENBQUMsUUFBUSxDQUFDO0NBQzFCLElBQUksVUFBVSxHQUFHLENBQUMsVUFBVSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztBQUM1SjtDQUNBLFNBQVNULFNBQU8sQ0FBQyxNQUFNLEVBQUUsY0FBYyxFQUFFLEVBQUUsSUFBSSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLHFCQUFxQixFQUFFLEVBQUUsSUFBSSxPQUFPLEdBQUcsTUFBTSxDQUFDLHFCQUFxQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxjQUFjLEVBQUUsRUFBRSxPQUFPLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxVQUFVLEdBQUcsRUFBRSxFQUFFLE9BQU8sTUFBTSxDQUFDLHdCQUF3QixDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxJQUFJLENBQUMsRUFBRTtBQUN6VjtDQUNBLFNBQVNDLGVBQWEsQ0FBQyxNQUFNLEVBQUUsRUFBRSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksTUFBTSxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFRCxTQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLEdBQUcsRUFBRSxFQUFFLElBQUlMLGtCQUFnQixDQUFDLFNBQVMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxNQUFNLElBQUksTUFBTSxDQUFDLHlCQUF5QixFQUFFLEVBQUUsTUFBTSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMseUJBQXlCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRUssU0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLEdBQUcsRUFBRSxFQUFFLE1BQU0sQ0FBQyxjQUFjLENBQUMsTUFB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TUFBTSxDQUFDLHdCQUF3QixDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxJQUFJLENBQUMsRUFBRTtBQUN6VjtDQUNBLFNBQVNDLGVBQWEsQ0FBQyxNQUFNLEVBQUUsRUFBRSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksTUFBTSxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFRCxTQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLEdBQUcsRUFBRSxFQUFFLElBQUlMLGtCQUFnQixDQUFDLFNBQVMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxNQUFNLElBQUksTUFBTSxDQUFDLHlCQUF5QixFQUFFLEVBQUUsTUFBTSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMseUJBQXlCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRUssU0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLEdBQUcsRUFBRSxFQUFFLE1BQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxNQUFNLENBQUMsd0JBQXdCLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsT0FBTyxNQUFNLENBQUMsRUFBRTtBQUN2aUI7Q0FDQSxTQUFTLGVBQWUsQ0FBQyxFQUFFLEVBQUU7Q0FDN0IsRUFBRSxJQUFJLE9BQU8sR0FBRyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7Q0FDdkYsRUFBRSxPQUFPLFNBQVMsTUFBTSxDQUFDLGdCQUFnQixFQUFFO0NBQzNDLElBQUksU0FBUyxzQkFBc0IsQ0FBQyxJQUFJLEVBQUU7Q0FDMUMsTUFBTSxJQUFJLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWTtDQUMxQyxVQUFVLElBQUksR0FBRyxJQUFJSSwyQkFBeUIsQ0FBQyxTQUFTLENBQUMsRUFBRSxJQUFJLEVBQUVLLFdBQVMsQ0FBQyxDQUFDO0FBQzVFO0NBQ0EsTUFBTSxJQUFJLGVBQWUsR0FBRyxJQUFJTSxrQkFBZ0IsQ0FBQyxjQUFjLEVBQUUsRUFBRSxFQUFFZCxlQUFhLENBQUNBLGVBQWEsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFO0NBQ2hILFFBQVEsU0FBUyxFQUFFLE9BQU8sQ0FBQyxTQUFTO0NBQ3BDLE9BQU8sQ0FBQyxDQUFDO0NBQ1QsVUFBVSxnQkFBZ0IsR0FBRyxJQUFJVyxpQkFBZSxDQUFDLFNBQVMsQ0FBQyxFQUFFLGVBQWUsRUFBRSxDQUFDLENBQUM7Q0FDaEYsVUFBVSxDQUFDLEdBQUcsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO0NBQ2pDLFVBQVUsSUFBSSxHQUFHLGdCQUFnQixDQUFDLENBQUMsQ0FBQztDQUNwQyxVQUFVLEtBQUssR0FBRyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0QztDQUNBLE1BQU0sSUFBSSxhQUFhLEdBQUdYLGVBQWEsQ0FBQ0EsZUFBYSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUU7Q0FDckUsUUFBUSxDQUFDLEVBQUUsQ0FBQztDQUNaLFFBQVEsSUFBSSxFQUFFLElBQUk7Q0FDbEIsUUFBUSxNQUFNLEVBQUUsS0FBSztDQUNyQixPQUFPLENBQUMsQ0FBQztBQUNUO0NBQ0EsTUFBTSxJQUFJLE9BQU8sQ0FBQyxPQUFPLElBQUksWUFBWSxFQUFFO0NBQzNDLFFBQVEsYUFBYSxDQUFDLEdBQUcsR0FBRyxZQUFZLENBQUM7Q0FDekMsT0FBTyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxJQUFJLFlBQVksRUFBRTtDQUNuRCxRQUFRLGFBQWEsQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO0NBQ2xELE9BQU87QUFDUDtDQUNBLE1BQU0sT0FBTyxJQUFJSixRQUFNLENBQUMsYUFBYSxFQUFFLGdCQUFnQixFQUFFLGFBQWEsQ0FBQyxDQUFDO0NBQ3hFLEtBQUs7QUFDTDtDQUNBLElBQUksc0JBQXNCLENBQUMsV0FBVyxHQUFHLHlCQUF5QixDQUFDLE1BQU0sQ0FBQyxJQUFJVSxRQUFNLENBQUMsY0FBYyxFQUFFLGdCQUFnQixDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7Q0FDN0gsSUFBSSxzQkFBc0IsQ0FBQyxnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQztBQUMvRDtDQUNBLElBQUksSUFBSSxVQUFVLEdBQUcsU0FBUyxVQUFVLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRTtDQUNyRCxNQUFNLE9BQU8sSUFBSVYsUUFBTSxDQUFDLGFBQWEsRUFBRSxzQkFBc0IsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUU7Q0FDeEYsUUFBUSxZQUFZLEVBQUUsR0FBRztDQUN6QixPQUFPLENBQUMsQ0FBQyxDQUFDO0NBQ1YsS0FBSyxDQUFDO0FBQ047Q0FDQSxJQUFJLE9BQU8sT0FBTyxDQUFDLE9BQU8sR0FBRyxJQUFJQSxRQUFNLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxHQUFHLHNCQUFzQixDQUFDO0NBQ3pGLEdBQUcsQ0FBQztDQUNKOzs7O0NDbEVBLElBQUlMLHdCQUFzQixHQUFHRiw2QkFBdUQsQ0FBQztBQUNyRjtDQUNBLE1BQU0sQ0FBQyxjQUFjLENBQUMwQixhQUFPLEVBQUUsWUFBWSxFQUFFO0NBQzdDLEVBQUUsS0FBSyxFQUFFLElBQUk7Q0FDYixDQUFDLENBQUMsQ0FBQztBQUNnQkEsY0FBQSxDQUFBLFdBQUEsR0FBRyxZQUFZO0FBQ2xDO0NBQ0EsSUFBSSxlQUFlLEdBQUd4Qix3QkFBc0IsQ0FBQ0Msb0JBQUEsRUFBK0MsQ0FBQyxDQUFDO0FBQzlGO0NBQ0EsSUFBSVcsMkJBQXlCLEdBQUdaLHdCQUFzQixDQUFDRSw4QkFBQSxFQUF5RCxDQUFDLENBQUM7QUFDbEg7Q0FDQSxJQUFJLGdCQUFnQixHQUFHRSxnQkFBMkIsQ0FBQztBQUNuRDtDQUNBLElBQUlhLFdBQVMsR0FBRyxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQztBQUNuQztDQUNBLFNBQVMsV0FBVyxDQUFDLEtBQUssRUFBRTtDQUM1QixFQUFFLElBQUksRUFBRSxHQUFHLEtBQUssQ0FBQyxFQUFFO0NBQ25CLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxRQUFRO0NBQy9CLE1BQU0sT0FBTyxHQUFHLElBQUlMLDJCQUF5QixDQUFDLFNBQVMsQ0FBQyxFQUFFLEtBQUssRUFBRUssV0FBUyxDQUFDLENBQUM7QUFDNUU7Q0FDQSxFQUFFLElBQUksZUFBZSxHQUFHLElBQUksZ0JBQWdCLENBQUMsY0FBYyxFQUFFLEVBQUUsRUFBRSxPQUFPLENBQUM7Q0FDekUsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLGVBQWUsQ0FBQyxTQUFTLENBQUMsRUFBRSxlQUFlLEVBQUUsQ0FBQyxDQUFDO0NBQzVFLE1BQU0sQ0FBQyxHQUFHLGdCQUFnQixDQUFDLENBQUMsQ0FBQztDQUM3QixNQUFNLElBQUksR0FBRyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7Q0FDaEMsTUFBTSxLQUFLLEdBQUcsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEM7Q0FDQSxFQUFFLE9BQU8sUUFBUSxDQUFDLENBQUMsRUFBRTtDQUNyQixJQUFJLElBQUksRUFBRSxJQUFJO0NBQ2QsSUFBSSxHQUFHLEVBQUUsSUFBSSxDQUFDLFFBQVE7Q0FDdEIsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO0NBQ1o7Ozs7Q0M5QkEsTUFBTSxDQUFDLGNBQWMsQ0FBQ1EsaUJBQU8sRUFBRSxZQUFZLEVBQUU7Q0FDN0MsRUFBRSxLQUFLLEVBQUUsSUFBSTtDQUNiLENBQUMsQ0FBQyxDQUFDO0FBQ29CQSxrQkFBQSxDQUFBLGVBQUEsR0FBRyxnQkFBZ0I7QUFDMUM7Q0FDQSxJQUFJcEIsUUFBTSxHQUFHUCwyQkFBZ0IsQ0FBQztBQUM5QjtDQUNBLElBQUllLFVBQVEsR0FBR1osT0FBb0IsQ0FBQztBQUNwQztDQUNBLFNBQVMsZUFBZSxDQUFDLElBQUksRUFBRTtDQUMvQixFQUFFLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJO0NBQ3RCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTO0NBQ2hDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7Q0FDL0IsRUFBRSxJQUFJLEtBQUssR0FBRyxJQUFJSSxRQUFNLENBQUMsT0FBTyxFQUFFLFlBQVk7Q0FDOUMsSUFBSSxPQUFPO0NBQ1gsTUFBTSxJQUFJLEVBQUUsSUFBSTtDQUNoQixNQUFNLFNBQVMsRUFBRSxTQUFTO0NBQzFCLEtBQUssQ0FBQztDQUNOLEdBQUcsRUFBRSxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO0NBQ3hCLEVBQUUsT0FBTyxJQUFJQSxRQUFNLENBQUMsYUFBYSxFQUFFUSxVQUFRLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRTtDQUNsRSxJQUFJLEtBQUssRUFBRSxLQUFLO0NBQ2hCLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQztDQUNmOzs7Ozs7Q0N0QkEsTUFBTSxDQUFDLGNBQWMsQ0FBQ2EsUUFBTyxFQUFFLFlBQVksRUFBRTtDQUM3QyxFQUFFLEtBQUssRUFBRSxJQUFJO0NBQ2IsQ0FBQyxDQUFDLENBQUM7QUFDV0EsU0FBQSxDQUFBLE1BQUEsR0FBRyxPQUFPO0FBQ3hCO0NBQ0EsSUFBSXJCLFFBQU0sR0FBR1AsMkJBQWdCLENBQUM7QUFDOUI7Q0FDQSxJQUFJZSxVQUFRLEdBQUdaLE9BQW9CLENBQUM7QUFDcEM7Q0FDQSxTQUFTLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRSxlQUFlLEVBQUU7Q0FDbkQsRUFBRSxJQUFJLEtBQUssR0FBRyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7Q0FDckYsRUFBRSxJQUFJLGFBQWEsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDO0FBQ2pDO0NBQ0EsRUFBRSxJQUFJLElBQUksR0FBRyxJQUFJSSxRQUFNLENBQUMsVUFBVSxFQUFFUSxVQUFRLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRTtDQUMvRCxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO0FBQ2xDO0NBQ0EsRUFBRSxJQUFJLElBQUksR0FBRyxhQUFhLElBQUksZUFBZSxJQUFJLElBQUlBLFVBQVEsQ0FBQyxPQUFPLEdBQUcsQ0FBQztDQUN6RSxFQUFFLElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxPQUFPO0FBQ25EO0NBQ0EsRUFBRSxJQUFJLGdCQUFnQixJQUFJLENBQUMsSUFBSSxDQUFDLG9CQUFvQixFQUFFO0NBQ3RELElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsSUFBSSxHQUFHLGdCQUFnQixDQUFDO0NBQ3hELElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLEdBQUcsRUFBRSxZQUFZLEVBQUU7Q0FDMUYsTUFBTSxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsRUFBRTtDQUN0RCxRQUFRLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztDQUM5QyxPQUFPLENBQUMsQ0FBQztDQUNULE1BQU0sT0FBTyxHQUFHLENBQUM7Q0FDakIsS0FBSyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7Q0FDeEIsSUFBSSxJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDO0NBQ3JDLElBQUksSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7Q0FDOUIsR0FBRztBQUNIO0NBQ0EsRUFBRSxJQUFJLGVBQWUsSUFBSSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsRUFBRTtDQUN4RCxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDLENBQUM7Q0FDekMsSUFBSSxJQUFJLENBQUMsdUJBQXVCLEdBQUcsSUFBSSxDQUFDO0NBQ3hDLEdBQUc7Q0FDSDs7Q0NuQ0EsSUFBSSxzQkFBc0IsR0FBR2YsNkJBQXVELENBQUM7QUFDckY7Q0FDQSxNQUFNLENBQUMsY0FBYyxDQUFDNkIsU0FBTyxFQUFFLFlBQVksRUFBRTtDQUM3QyxFQUFFLEtBQUssRUFBRSxJQUFJO0NBQ2IsQ0FBQyxDQUFDLENBQUM7QUFDWUEsVUFBQSxDQUFBLE9BQUEsR0FBRyxRQUFRO0FBQzFCO0NBQ0EsSUFBSSxnQkFBZ0IsR0FBRyxzQkFBc0IsQ0FBQzFCLHFCQUFBLEVBQWdELENBQUMsQ0FBQztBQUNoRztDQUNBLElBQUkseUJBQXlCLEdBQUcsc0JBQXNCLENBQUNDLDhCQUFBLEVBQXlELENBQUMsQ0FBQztBQUNsSDtDQUNBLElBQUksTUFBTSxHQUFHRSwyQkFBZ0IsQ0FBQztBQUM5QjtDQUNBLElBQUksT0FBTyxHQUFHRSxRQUFtQixDQUFDO0FBQ2xDO0NBQ0EsSUFBSSxRQUFRLEdBQUdDLE9BQW9CLENBQUM7QUFDcEM7Q0FDQSxJQUFJLE1BQU0sR0FBR08sWUFBQSxFQUFrQixDQUFDO0FBQ2hDO0NBQ0EsSUFBSSxTQUFTLEdBQUcsQ0FBQyxrQkFBa0IsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO0FBQ3hEO0NBQ0EsU0FBU04sU0FBTyxDQUFDLE1BQU0sRUFBRSxjQUFjLEVBQUUsRUFBRSxJQUFJLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMscUJBQXFCLEVBQUUsRUFBRSxJQUFJLE9BQU8sR0FBRyxNQUFNLENBQUMscUJBQXFCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLGNBQWMsRUFBRSxFQUFFLE9BQU8sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLFVBQVUsR0FBRyxFQUFFLEVBQUUsT0FBTyxNQUFNLENBQUMsd0JBQXdCLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLElBQUksQ0FBQyxFQUFFO0FBQ3pWO0NBQ0EsU0FBU0MsZUFBYSxDQUFDLE1BQU0sRUFBRSxFQUFFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsSUFBSSxNQUFNLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUVELFNBQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsR0FBRyxFQUFFLEVBQUUsSUFBSSxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsTUFBTSxJQUFJLE1BQU0sQ0FBQyx5QkFBeUIsRUFBRSxFQUFFLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLHlCQUF5QixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUVBLFNBQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxHQUFHLEVBQUUsRUFBRSxNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsTUFBTSxDQUFDLHdCQUF3QixDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLE9BQU8sTUFBTSxDQUFDLEVBQUU7QUFDdmlCO0NBQ0EsU0FBUyxPQUFPLEdBQUc7Q0FDbkIsRUFBRSxPQUFPLFNBQVMsTUFBTSxDQUFDLGdCQUFnQixFQUFFO0NBQzNDLElBQUksU0FBUyxjQUFjLENBQUMsSUFBSSxFQUFFO0NBQ2xDLE1BQU0sSUFBSSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsZ0JBQWdCO0NBQ2xELFVBQVUsZUFBZSxHQUFHLElBQUksQ0FBQyxlQUFlO0NBQ2hELFVBQVUsSUFBSSxHQUFHLElBQUkseUJBQXlCLENBQUMsU0FBUyxDQUFDLEVBQUUsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0NBQzVFLE1BQU0sSUFBSSxPQUFPLENBQUMsTUFBTSxFQUFFLGdCQUFnQixFQUFFLGVBQWUsQ0FBQyxDQUFDO0NBQzdELE1BQU0sT0FBTyxJQUFJLE1BQU0sQ0FBQyxhQUFhLEVBQUUsZ0JBQWdCLEVBQUVDLGVBQWEsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztDQUNsRixLQUFLO0FBQ0w7Q0FDQSxJQUFJLGNBQWMsQ0FBQyxlQUFlLEdBQUcsSUFBSSxRQUFRLENBQUMsbUJBQW1CLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztDQUN6RixJQUFJLGNBQWMsQ0FBQyxXQUFXLEdBQUcsaUJBQWlCLENBQUMsTUFBTSxDQUFDLElBQUksTUFBTSxDQUFDLGNBQWMsRUFBRSxnQkFBZ0IsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0NBQzdHLElBQUksY0FBYyxDQUFDLGdCQUFnQixHQUFHLGdCQUFnQixDQUFDO0NBQ3ZELElBQUksT0FBTyxjQUFjLENBQUM7Q0FDMUIsR0FBRyxDQUFDO0NBQ0o7OztBQ3pDQTtDQUNBLENBQUEsTUFBTSxDQUFDLGNBQWMsQ0FBVSxPQUFBLEVBQUEsWUFBWSxFQUFFO0lBQzNDLEtBQUssRUFBRSxJQUFJO0NBQ2IsRUFBQyxDQUFDLENBQUM7Q0FDSCxDQUFBLE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRTtJQUN0QyxVQUFVLEVBQUUsSUFBSTtDQUNsQixHQUFFLEdBQUcsRUFBRSxTQUFTLEdBQUcsR0FBRztDQUN0QixLQUFJLE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQztLQUNyQjtDQUNILEVBQUMsQ0FBQyxDQUFDO0NBQ0gsQ0FBQSxNQUFNLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRTtJQUMvQyxVQUFVLEVBQUUsSUFBSTtDQUNsQixHQUFFLEdBQUcsRUFBRSxTQUFTLEdBQUcsR0FBRztDQUN0QixLQUFJLE9BQU8sZUFBZSxDQUFDLGNBQWMsQ0FBQztLQUN2QztDQUNILEVBQUMsQ0FBQyxDQUFDO0NBQ0gsQ0FBQSxNQUFNLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRTtJQUNoRCxVQUFVLEVBQUUsSUFBSTtDQUNsQixHQUFFLEdBQUcsRUFBRSxTQUFTLEdBQUcsR0FBRztDQUN0QixLQUFJLE9BQU8sZ0JBQWdCLENBQUMsZUFBZSxDQUFDO0tBQ3pDO0NBQ0gsRUFBQyxDQUFDLENBQUM7Q0FDSCxDQUFBLE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLGFBQWEsRUFBRTtJQUM1QyxVQUFVLEVBQUUsSUFBSTtDQUNsQixHQUFFLEdBQUcsRUFBRSxTQUFTLEdBQUcsR0FBRztDQUN0QixLQUFJLE9BQU8sWUFBWSxDQUFDLFdBQVcsQ0FBQztLQUNqQztDQUNILEVBQUMsQ0FBQyxDQUFDO0NBQ0gsQ0FBQSxNQUFNLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRTtJQUNoRCxVQUFVLEVBQUUsSUFBSTtDQUNsQixHQUFFLEdBQUcsRUFBRSxTQUFTLEdBQUcsR0FBRztDQUN0QixLQUFJLE9BQU8sZ0JBQWdCLENBQUMsZUFBZSxDQUFDO0tBQ3pDO0NBQ0gsRUFBQyxDQUFDLENBQUM7Q0FDSCxDQUFBLE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRTtJQUN4QyxVQUFVLEVBQUUsSUFBSTtDQUNsQixHQUFFLEdBQUcsRUFBRSxTQUFTLEdBQUcsR0FBRztDQUN0QixLQUFJLE9BQU8sUUFBUSxDQUFDLE9BQU8sQ0FBQztLQUN6QjtDQUNILEVBQUMsQ0FBQyxDQUFDO0NBQ0gsQ0FBQSxNQUFNLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUU7SUFDdkMsVUFBVSxFQUFFLElBQUk7Q0FDbEIsR0FBRSxHQUFHLEVBQUUsU0FBUyxHQUFHLEdBQUc7Q0FDdEIsS0FBSSxPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUM7S0FDdkI7Q0FDSCxFQUFDLENBQUMsQ0FBQztDQUNILENBQUEsTUFBTSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsYUFBYSxFQUFFO0lBQzVDLFVBQVUsRUFBRSxJQUFJO0NBQ2xCLEdBQUUsR0FBRyxFQUFFLFNBQVMsR0FBRyxHQUFHO0NBQ3RCLEtBQUksT0FBTyxRQUFRLENBQUMsV0FBVyxDQUFDO0tBQzdCO0NBQ0gsRUFBQyxDQUFDLENBQUM7Q0FDSCxDQUFBLE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLGtCQUFrQixFQUFFO0lBQ2pELFVBQVUsRUFBRSxJQUFJO0NBQ2xCLEdBQUUsR0FBRyxFQUFFLFNBQVMsR0FBRyxHQUFHO0NBQ3RCLEtBQUksT0FBTyxRQUFRLENBQUMsZ0JBQWdCLENBQUM7S0FDbEM7Q0FDSCxFQUFDLENBQUMsQ0FBQztDQUNILENBQUEsTUFBTSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsYUFBYSxFQUFFO0lBQzVDLFVBQVUsRUFBRSxJQUFJO0NBQ2xCLEdBQUUsR0FBRyxFQUFFLFNBQVMsR0FBRyxHQUFHO0NBQ3RCLEtBQUksT0FBTyxRQUFRLENBQUMsV0FBVyxDQUFDO0tBQzdCO0NBQ0gsRUFBQyxDQUFDLENBQUM7Q0FDSCxDQUFBLE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLGFBQWEsRUFBRTtJQUM1QyxVQUFVLEVBQUUsSUFBSTtDQUNsQixHQUFFLEdBQUcsRUFBRSxTQUFTLEdBQUcsR0FBRztDQUN0QixLQUFJLE9BQU8sUUFBUSxDQUFDLFdBQVcsQ0FBQztLQUM3QjtDQUNILEVBQUMsQ0FBQyxDQUFDO0NBQ0gsQ0FBQSxNQUFNLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUU7SUFDeEMsVUFBVSxFQUFFLElBQUk7Q0FDbEIsR0FBRSxHQUFHLEVBQUUsU0FBUyxHQUFHLEdBQUc7Q0FDdEIsS0FBSSxPQUFPLFFBQVEsQ0FBQyxPQUFPLENBQUM7S0FDekI7Q0FDSCxFQUFDLENBQUMsQ0FBQztDQUNILENBQUEsTUFBTSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFO0lBQ3hDLFVBQVUsRUFBRSxJQUFJO0NBQ2xCLEdBQUUsR0FBRyxFQUFFLFNBQVMsR0FBRyxHQUFHO0NBQ3RCLEtBQUksT0FBTyxRQUFRLENBQUMsT0FBTyxDQUFDO0tBQ3pCO0NBQ0gsRUFBQyxDQUFDLENBQUM7Q0FDSCxDQUFBLE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLHFCQUFxQixFQUFFO0lBQ3BELFVBQVUsRUFBRSxJQUFJO0NBQ2xCLEdBQUUsR0FBRyxFQUFFLFNBQVMsR0FBRyxHQUFHO0NBQ3RCLEtBQUksT0FBTyxRQUFRLENBQUMsbUJBQW1CLENBQUM7S0FDckM7Q0FDSCxFQUFDLENBQUMsQ0FBQztDQUNILENBQUEsTUFBTSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUU7SUFDaEQsVUFBVSxFQUFFLElBQUk7Q0FDbEIsR0FBRSxHQUFHLEVBQUUsU0FBUyxHQUFHLEdBQUc7Q0FDdEIsS0FBSSxPQUFPLFFBQVEsQ0FBQyxlQUFlLENBQUM7S0FDakM7Q0FDSCxFQUFDLENBQUMsQ0FBQztDQUNILENBQUEsT0FBQSxDQUFBLGFBQUEsR0FBd0IsaUJBQWlCLE9BQWlCLENBQUEsTUFBQSxHQUFBLE9BQUEsQ0FBQSxNQUFBLEdBQWlCLGVBQWUsT0FBZSxDQUFBLElBQUEsR0FBQSxLQUFLLENBQUMsQ0FBQztBQUNoSDtFQUNBLElBQUksTUFBTSxHQUFHWCxPQUFrQixDQUFDO0FBQ2hDO0VBQ0EsSUFBSSxlQUFlLEdBQUdHLGdCQUEyQixDQUFDO0FBQ2xEO0VBQ0EsSUFBSSxnQkFBZ0IsR0FBR0MsaUJBQTRCLENBQUM7QUFDcEQ7RUFDQSxJQUFJLFlBQVksR0FBR0UsYUFBd0IsQ0FBQztBQUM1QztFQUNBLElBQUksZ0JBQWdCLEdBQUdFLGlCQUE0QixDQUFDO0FBQ3BEO0VBQ0EsSUFBSSxRQUFRLEdBQUdDLFNBQW9CLENBQUM7QUFDcEM7RUFDQSxJQUFJLE9BQU8sR0FBR08sUUFBbUIsQ0FBQztBQUNsQztFQUNBLElBQUksUUFBUSxHQUFHRSxPQUFvQixDQUFDO0FBQ3BDO0NBQ0EsQ0FBQSxJQUFJLElBQUksR0FBRyxTQUFTLElBQUksR0FBRztJQUN6QixPQUFPLEVBQUUsQ0FBQztDQUNaLEVBQUMsQ0FBQztBQUNGO0NBQ0EsQ0FBQSxPQUFBLENBQUEsSUFBQSxHQUFlLElBQUksQ0FBQztBQUNwQjtDQUNBLENBQUEsSUFBSSxJQUFJLEdBQUcsU0FBUyxJQUFJLEdBQUc7SUFDekIsT0FBTyxFQUFFLENBQUM7Q0FDWixFQUFDLENBQUM7QUFDRjtDQUNBLENBQUEsT0FBQSxDQUFBLElBQUEsR0FBZSxJQUFJLENBQUM7QUFDcEI7Q0FDQSxDQUFBLElBQUksTUFBTSxHQUFHLFNBQVMsTUFBTSxHQUFHO0lBQzdCLE9BQU8sRUFBRSxDQUFDO0NBQ1osRUFBQyxDQUFDO0FBQ0Y7Q0FDQSxDQUFBLE9BQUEsQ0FBQSxNQUFBLEdBQWlCLE1BQU0sQ0FBQztBQUN4QjtDQUNBLENBQUEsSUFBSSxNQUFNLEdBQUcsU0FBUyxNQUFNLEdBQUc7SUFDN0IsT0FBTyxFQUFFLENBQUM7Q0FDWixFQUFDLENBQUM7QUFDRjtDQUNBLENBQUEsT0FBQSxDQUFBLE1BQUEsR0FBaUIsTUFBTSxDQUFDO0FBQ3hCO0NBQ0EsQ0FBQSxJQUFJLE1BQU0sR0FBRyxTQUFTLE1BQU0sR0FBRztJQUM3QixPQUFPLEVBQUUsQ0FBQztDQUNaLEVBQUMsQ0FBQztBQUNGO0NBQ0EsQ0FBQSxPQUFBLENBQUEsTUFBQSxHQUFpQixNQUFNLENBQUM7QUFDeEI7Q0FDQSxDQUFBLElBQUksYUFBYSxHQUFHLFNBQVMsYUFBYSxHQUFHO0lBQzNDLE9BQU8sRUFBRSxDQUFDO0NBQ1osRUFBQyxDQUFDO0FBQ0Y7Q0FDQSxDQUFBLE9BQUEsQ0FBQSxhQUFBLEdBQXdCLGFBQWEsQ0FBQTs7O0NDbkp0QixTQUFTLE9BQU8sQ0FBQyxHQUFHLEVBQUU7Q0FDckMsRUFBRSx5QkFBeUIsQ0FBQztBQUM1QjtDQUNBLEVBQUUsT0FBTyxPQUFPLEdBQUcsVUFBVSxJQUFJLE9BQU8sTUFBTSxJQUFJLFFBQVEsSUFBSSxPQUFPLE1BQU0sQ0FBQyxRQUFRLEdBQUcsVUFBVSxHQUFHLEVBQUU7Q0FDdEcsSUFBSSxPQUFPLE9BQU8sR0FBRyxDQUFDO0NBQ3RCLEdBQUcsR0FBRyxVQUFVLEdBQUcsRUFBRTtDQUNyQixJQUFJLE9BQU8sR0FBRyxJQUFJLFVBQVUsSUFBSSxPQUFPLE1BQU0sSUFBSSxHQUFHLENBQUMsV0FBVyxLQUFLLE1BQU0sSUFBSSxHQUFHLEtBQUssTUFBTSxDQUFDLFNBQVMsR0FBRyxRQUFRLEdBQUcsT0FBTyxHQUFHLENBQUM7Q0FDaEksR0FBRyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztDQUNsQjs7Q0NSZSxTQUFTLGVBQWUsQ0FBQyxRQUFRLEVBQUUsV0FBVyxFQUFFO0NBQy9ELEVBQUUsSUFBSSxFQUFFLFFBQVEsWUFBWSxXQUFXLENBQUMsRUFBRTtDQUMxQyxJQUFJLE1BQU0sSUFBSSxTQUFTLENBQUMsbUNBQW1DLENBQUMsQ0FBQztDQUM3RCxHQUFHO0NBQ0g7O0NDSkEsU0FBUyxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFO0NBQzFDLEVBQUUsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Q0FDekMsSUFBSSxJQUFJLFVBQVUsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7Q0FDOUIsSUFBSSxVQUFVLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQyxVQUFVLElBQUksS0FBSyxDQUFDO0NBQzNELElBQUksVUFBVSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7Q0FDbkMsSUFBSSxJQUFJLE9BQU8sSUFBSSxVQUFVLEVBQUUsVUFBVSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7Q0FDMUQsSUFBSSxNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0NBQzlELEdBQUc7Q0FDSCxDQUFDO0FBQ0Q7Q0FDZSxTQUFTLFlBQVksQ0FBQyxXQUFXLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRTtDQUMzRSxFQUFFLElBQUksVUFBVSxFQUFFLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsVUFBVSxDQUFDLENBQUM7Q0FDdkUsRUFBRSxJQUFJLFdBQVcsRUFBRSxpQkFBaUIsQ0FBQyxXQUFXLEVBQUUsV0FBVyxDQUFDLENBQUM7Q0FDL0QsRUFBRSxNQUFNLENBQUMsY0FBYyxDQUFDLFdBQVcsRUFBRSxXQUFXLEVBQUU7Q0FDbEQsSUFBSSxRQUFRLEVBQUUsS0FBSztDQUNuQixHQUFHLENBQUMsQ0FBQztDQUNMLEVBQUUsT0FBTyxXQUFXLENBQUM7Q0FDckI7O0NDakJlLFNBQVMsc0JBQXNCLENBQUMsSUFBSSxFQUFFO0NBQ3JELEVBQUUsSUFBSSxJQUFJLEtBQUssS0FBSyxDQUFDLEVBQUU7Q0FDdkIsSUFBSSxNQUFNLElBQUksY0FBYyxDQUFDLDJEQUEyRCxDQUFDLENBQUM7Q0FDMUYsR0FBRztBQUNIO0NBQ0EsRUFBRSxPQUFPLElBQUksQ0FBQztDQUNkOztDQ05lLFNBQVMsZUFBZSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUU7Q0FDOUMsRUFBRSxlQUFlLEdBQUcsTUFBTSxDQUFDLGNBQWMsR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxHQUFHLFNBQVMsZUFBZSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUU7Q0FDMUcsSUFBSSxDQUFDLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQztDQUNwQixJQUFJLE9BQU8sQ0FBQyxDQUFDO0NBQ2IsR0FBRyxDQUFDO0NBQ0osRUFBRSxPQUFPLGVBQWUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7Q0FDL0I7O0NDTGUsU0FBUyxTQUFTLENBQUMsUUFBUSxFQUFFLFVBQVUsRUFBRTtDQUN4RCxFQUFFLElBQUksT0FBTyxVQUFVLEtBQUssVUFBVSxJQUFJLFVBQVUsS0FBSyxJQUFJLEVBQUU7Q0FDL0QsSUFBSSxNQUFNLElBQUksU0FBUyxDQUFDLG9EQUFvRCxDQUFDLENBQUM7Q0FDOUUsR0FBRztBQUNIO0NBQ0EsRUFBRSxRQUFRLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxJQUFJLFVBQVUsQ0FBQyxTQUFTLEVBQUU7Q0FDekUsSUFBSSxXQUFXLEVBQUU7Q0FDakIsTUFBTSxLQUFLLEVBQUUsUUFBUTtDQUNyQixNQUFNLFFBQVEsRUFBRSxJQUFJO0NBQ3BCLE1BQU0sWUFBWSxFQUFFLElBQUk7Q0FDeEIsS0FBSztDQUNMLEdBQUcsQ0FBQyxDQUFDO0NBQ0wsRUFBRSxNQUFNLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxXQUFXLEVBQUU7Q0FDL0MsSUFBSSxRQUFRLEVBQUUsS0FBSztDQUNuQixHQUFHLENBQUMsQ0FBQztDQUNMLEVBQUUsSUFBSSxVQUFVLEVBQUVZLGVBQWMsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUM7Q0FDdkQ7O0NDZmUsU0FBUywwQkFBMEIsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFO0NBQy9ELEVBQUUsSUFBSSxJQUFJLEtBQUssT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLFFBQVEsSUFBSSxPQUFPLElBQUksS0FBSyxVQUFVLENBQUMsRUFBRTtDQUMxRSxJQUFJLE9BQU8sSUFBSSxDQUFDO0NBQ2hCLEdBQUcsTUFBTSxJQUFJLElBQUksS0FBSyxLQUFLLENBQUMsRUFBRTtDQUM5QixJQUFJLE1BQU0sSUFBSSxTQUFTLENBQUMsMERBQTBELENBQUMsQ0FBQztDQUNwRixHQUFHO0FBQ0g7Q0FDQSxFQUFFLE9BQU9DLHNCQUFxQixDQUFDLElBQUksQ0FBQyxDQUFDO0NBQ3JDOztDQ1ZlLFNBQVMsZUFBZSxDQUFDLENBQUMsRUFBRTtDQUMzQyxFQUFFLGVBQWUsR0FBRyxNQUFNLENBQUMsY0FBYyxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLEdBQUcsU0FBUyxlQUFlLENBQUMsQ0FBQyxFQUFFO0NBQ3ZHLElBQUksT0FBTyxDQUFDLENBQUMsU0FBUyxJQUFJLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUM7Q0FDbkQsR0FBRyxDQUFDO0NBQ0osRUFBRSxPQUFPLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQztDQUM1Qjs7Q0NMZSxTQUFTLGVBQWUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRTtDQUN6RCxFQUFFLElBQUksR0FBRyxJQUFJLEdBQUcsRUFBRTtDQUNsQixJQUFJLE1BQU0sQ0FBQyxjQUFjLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRTtDQUNwQyxNQUFNLEtBQUssRUFBRSxLQUFLO0NBQ2xCLE1BQU0sVUFBVSxFQUFFLElBQUk7Q0FDdEIsTUFBTSxZQUFZLEVBQUUsSUFBSTtDQUN4QixNQUFNLFFBQVEsRUFBRSxJQUFJO0NBQ3BCLEtBQUssQ0FBQyxDQUFDO0NBQ1AsR0FBRyxNQUFNO0NBQ1QsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDO0NBQ3JCLEdBQUc7QUFDSDtDQUNBLEVBQUUsT0FBTyxHQUFHLENBQUM7Q0FDYjs7Q0NiZSxTQUFTLGVBQWUsQ0FBQyxHQUFHLEVBQUU7Q0FDN0MsRUFBRSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsT0FBTyxHQUFHLENBQUM7Q0FDckM7O0NDRmUsU0FBUyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUU7Q0FDL0MsRUFBRSxJQUFJLE9BQU8sTUFBTSxLQUFLLFdBQVcsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksSUFBSSxFQUFFLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztDQUM1SDs7Q0NGZSxTQUFTLGlCQUFpQixDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUU7Q0FDcEQsRUFBRSxJQUFJLEdBQUcsSUFBSSxJQUFJLElBQUksR0FBRyxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUUsR0FBRyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUM7QUFDeEQ7Q0FDQSxFQUFFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksR0FBRyxJQUFJLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFO0NBQ3ZELElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztDQUNyQixHQUFHO0FBQ0g7Q0FDQSxFQUFFLE9BQU8sSUFBSSxDQUFDO0NBQ2Q7O0NDUGUsU0FBUywyQkFBMkIsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFO0NBQy9ELEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxPQUFPO0NBQ2pCLEVBQUUsSUFBSSxPQUFPLENBQUMsS0FBSyxRQUFRLEVBQUUsT0FBT0MsaUJBQWdCLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0NBQ2hFLEVBQUUsSUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztDQUN6RCxFQUFFLElBQUksQ0FBQyxLQUFLLFFBQVEsSUFBSSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQztDQUM5RCxFQUFFLElBQUksQ0FBQyxLQUFLLEtBQUssSUFBSSxDQUFDLEtBQUssS0FBSyxFQUFFLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztDQUN2RCxFQUFFLElBQUksQ0FBQyxLQUFLLFdBQVcsSUFBSSwwQ0FBMEMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBT0EsaUJBQWdCLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0NBQ2xIOztDQ1JlLFNBQVMsZ0JBQWdCLEdBQUc7Q0FDM0MsRUFBRSxNQUFNLElBQUksU0FBUyxDQUFDLDJJQUEySSxDQUFDLENBQUM7Q0FDbks7O0NDRWUsU0FBUyxRQUFRLENBQUMsR0FBRyxFQUFFO0NBQ3RDLEVBQUUsT0FBT0MsZUFBYyxDQUFDLEdBQUcsQ0FBQyxJQUFJQyxnQkFBZSxDQUFDLEdBQUcsQ0FBQyxJQUFJQywyQkFBMEIsQ0FBQyxHQUFHLENBQUMsSUFBSUMsZ0JBQWUsRUFBRSxDQUFDO0NBQzdHOztDQ0lBLFNBQVMsT0FBTyxDQUFDLE1BQU0sRUFBRSxjQUFjLEVBQUUsRUFBRSxJQUFJLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMscUJBQXFCLEVBQUUsRUFBRSxJQUFJLE9BQU8sR0FBRyxNQUFNLENBQUMscUJBQXFCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLGNBQWMsRUFBRSxFQUFFLE9BQU8sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLFVBQVUsR0FBRyxFQUFFLEVBQUUsT0FBTyxNQUFNLENBQUMsd0JBQXdCLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLElBQUksQ0FBQyxFQUFFO0FBQ3pWO0NBQ0EsU0FBUyxhQUFhLENBQUMsTUFBTSxFQUFFLEVBQUUsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxJQUFJLE1BQU0sR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLEdBQUcsRUFBRSxFQUFFLGVBQWUsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsTUFBTSxJQUFJLE1BQU0sQ0FBQyx5QkFBeUIsRUFBRSxFQUFFLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLHlCQUF5QixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLEdBQUcsRUFBRSxFQUFFLE1BQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxNQUFNLENBQUMsd0JBQXdCLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsT0FBTyxNQUFNLENBQUMsRUFBRTtBQUN0aEI7Q0FDQSxJQUFJLGFBQWEsR0FBRztDQUNwQixFQUFFLElBQUksRUFBRSxRQUFRO0NBQ2hCLEVBQUUsR0FBRyxFQUFFLFNBQVMsR0FBRyxDQUFDLElBQUksRUFBRTtDQUMxQixJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO0NBQzdCLEdBQUc7Q0FDSCxFQUFFLElBQUksRUFBRSxTQUFTLElBQUksQ0FBQyxJQUFJLEVBQUU7Q0FDNUIsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztDQUM5QixHQUFHO0NBQ0gsRUFBRSxLQUFLLEVBQUUsU0FBUyxLQUFLLENBQUMsSUFBSSxFQUFFO0NBQzlCLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7Q0FDL0IsR0FBRztDQUNILEVBQUUsTUFBTSxFQUFFLFNBQVMsTUFBTSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUU7Q0FDdEMsSUFBSSxJQUFJLE9BQU8sSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7Q0FDckUsR0FBRztDQUNILENBQUMsQ0FBQztBQUNGO0NBQ0EsSUFBSSxNQUFNLEdBQUcsWUFBWTtDQUN6QixFQUFFLFNBQVMsTUFBTSxDQUFDLGNBQWMsRUFBRTtDQUNsQyxJQUFJLElBQUksT0FBTyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUN6RjtDQUNBLElBQUksZUFBZSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztBQUNsQztDQUNBLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsT0FBTyxDQUFDLENBQUM7Q0FDdkMsR0FBRztBQUNIO0NBQ0EsRUFBRSxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUM7Q0FDeEIsSUFBSSxHQUFHLEVBQUUsTUFBTTtDQUNmLElBQUksS0FBSyxFQUFFLFNBQVMsSUFBSSxDQUFDLGNBQWMsRUFBRTtDQUN6QyxNQUFNLElBQUksT0FBTyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztDQUMzRixNQUFNLElBQUksQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDLE1BQU0sSUFBSSxVQUFVLENBQUM7Q0FDakQsTUFBTSxJQUFJLENBQUMsTUFBTSxHQUFHLGNBQWMsSUFBSSxhQUFhLENBQUM7Q0FDcEQsTUFBTSxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztDQUM3QixNQUFNLElBQUksQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQztDQUNqQyxLQUFLO0NBQ0wsR0FBRyxFQUFFO0NBQ0wsSUFBSSxHQUFHLEVBQUUsVUFBVTtDQUNuQixJQUFJLEtBQUssRUFBRSxTQUFTLFFBQVEsQ0FBQyxJQUFJLEVBQUU7Q0FDbkMsTUFBTSxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztDQUN4QixLQUFLO0NBQ0wsR0FBRyxFQUFFO0NBQ0wsSUFBSSxHQUFHLEVBQUUsS0FBSztDQUNkLElBQUksS0FBSyxFQUFFLFNBQVMsR0FBRyxHQUFHO0NBQzFCLE1BQU0sS0FBSyxJQUFJLElBQUksR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLElBQUksR0FBRyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEdBQUcsQ0FBQyxFQUFFLElBQUksR0FBRyxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUU7Q0FDL0YsUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO0NBQ3JDLE9BQU87QUFDUDtDQUNBLE1BQU0sT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO0NBQ2pELEtBQUs7Q0FDTCxHQUFHLEVBQUU7Q0FDTCxJQUFJLEdBQUcsRUFBRSxNQUFNO0NBQ2YsSUFBSSxLQUFLLEVBQUUsU0FBUyxJQUFJLEdBQUc7Q0FDM0IsTUFBTSxLQUFLLElBQUksS0FBSyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxHQUFHLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRTtDQUNyRyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7Q0FDdkMsT0FBTztBQUNQO0NBQ0EsTUFBTSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7Q0FDbEQsS0FBSztDQUNMLEdBQUcsRUFBRTtDQUNMLElBQUksR0FBRyxFQUFFLE9BQU87Q0FDaEIsSUFBSSxLQUFLLEVBQUUsU0FBUyxLQUFLLEdBQUc7Q0FDNUIsTUFBTSxLQUFLLElBQUksS0FBSyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxHQUFHLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRTtDQUNyRyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7Q0FDdkMsT0FBTztBQUNQO0NBQ0EsTUFBTSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQztDQUM3QyxLQUFLO0NBQ0wsR0FBRyxFQUFFO0NBQ0wsSUFBSSxHQUFHLEVBQUUsV0FBVztDQUNwQixJQUFJLEtBQUssRUFBRSxTQUFTLFNBQVMsR0FBRztDQUNoQyxNQUFNLEtBQUssSUFBSSxLQUFLLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxJQUFJLEdBQUcsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUUsS0FBSyxHQUFHLENBQUMsRUFBRSxLQUFLLEdBQUcsS0FBSyxFQUFFLEtBQUssRUFBRSxFQUFFO0NBQ3JHLFFBQVEsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztDQUN2QyxPQUFPO0FBQ1A7Q0FDQSxNQUFNLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLHNCQUFzQixFQUFFLElBQUksQ0FBQyxDQUFDO0NBQ3RFLEtBQUs7Q0FDTCxHQUFHLEVBQUU7Q0FDTCxJQUFJLEdBQUcsRUFBRSxTQUFTO0NBQ2xCLElBQUksS0FBSyxFQUFFLFNBQVMsT0FBTyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRTtDQUMxRCxNQUFNLElBQUksU0FBUyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxPQUFPLElBQUksQ0FBQztDQUNoRCxNQUFNLElBQUksT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztDQUM1RyxNQUFNLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztDQUNwQyxLQUFLO0NBQ0wsR0FBRyxFQUFFO0NBQ0wsSUFBSSxHQUFHLEVBQUUsUUFBUTtDQUNqQixJ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WSxDQUFDLENBQUM7QUFDdkM7Q0FDQSxJQUFJLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRTtDQUNqRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUM7Q0FDckIsS0FBSztDQUNMLEdBQUc7QUFDSDtDQUNBLEVBQUUsT0FBTyxPQUFPLENBQUM7Q0FDakIsQ0FBQztBQUNEO0NBQ0EsU0FBUyxTQUFTLENBQUMsTUFBTSxFQUFFLGNBQWMsRUFBRSxFQUFFLElBQUksSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxxQkFBcUIsRUFBRSxFQUFFLElBQUksT0FBTyxHQUFHLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksY0FBYyxFQUFFLEVBQUUsT0FBTyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsVUFBVSxHQUFHLEVBQUUsRUFBRSxPQUFPLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sSUFBSSxDQUFDLEVBQUU7QUFDM1Y7Q0FDQSxTQUFTLGVBQWUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksTUFBTSxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLFNB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SSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDO0NBQ3hJLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztDQUNaLEVBQUUsRUFBRSxFQUFFLENBQUM7Q0FDUCxDQUFDLEVBQUU7Q0FDSCxFQUFFLElBQUksRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDO0NBQ2haLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztDQUNaLEVBQUUsRUFBRSxFQUFFLENBQUM7Q0FDUCxDQUFDLEVBQUU7Q0FDSCxFQUFFLElBQUksRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQztDQUMvSSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztDQUNULEVBQUUsRUFBRSxFQUFFLENBQUM7Q0FDUCxDQUFDLEVBQUU7Q0FDSCxFQUFFLElBQUksRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUM7Q0FDekQsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztDQUNmLEVBQUUsRUFBRSxFQUFFLENBQUM7Q0FDUCxDQUFDLEVBQUU7Q0FDSCxFQUFFLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQztDQUNkLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUM7Q0FDM0IsRUFBRSxFQUFFLEVBQUUsQ0FBQztDQUNQLENBQUMsRUFBRTtDQUNILEVBQUUsSUFBSSxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQztDQUNwQixFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0NBQ2YsRUFBRSxFQUFFLEVBQUUsQ0FBQztDQUNQLENBQUMsRUFBRTtDQUNILEVBQUUsSUFBSSxFQUFFLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQztDQUNyQixFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0NBQ2YsRUFBRSxFQUFFLEVBQUUsQ0FBQztDQUNQLENBQUMsRUFBRTtDQUNILEVBQUUsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDO0NBQ2QsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7Q0FDbEIsRUFBRSxFQUFFLEVBQUUsQ0FBQztDQUNQLENBQUMsRUFBRTtDQUNILEVBQUUsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDO0NBQ2QsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0NBQ1osRUFBRSxFQUFFLEVBQUUsQ0FBQztDQUNQLENBQUMsRUFBRTtDQUNILEVBQUUsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDO0NBQ2QsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO0NBQ3RCLEVBQUUsRUFBRSxFQUFFLEVBQUU7Q0FDUixDQUFDLEVBQUU7Q0FDSCxFQUFFLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQztDQUNkLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO0NBQ25CLEVBQUUsRUFBRSxFQUFFLEVBQUU7Q0FDUixDQUFDLEVBQUU7Q0FDSCxFQUFFLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQztDQUNkLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztDQUNaLEVBQUUsRUFBRSxFQUFFLEVBQUU7Q0FDUixDQUFDLEVBQUU7Q0FDSCxFQUFFLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQztDQUNkLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztDQUNaLEVBQUUsRUFBRSxFQUFFLEVBQUU7Q0FDUixDQUFDLEVBQUU7Q0FDSCxFQUFFLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQztDQUNkLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0NBQ2xCLEVBQUUsRUFBRSxFQUFFLEVBQUU7Q0FDUixDQUFDLEVBQUU7Q0FDSCxFQUFFLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQztDQUNkLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Q0FDaEIsRUFBRSxFQUFFLEVBQUUsRUFBRTtDQUNSLENBQUMsRUFBRTtDQUNILEVBQUUsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDO0NBQ2QsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztDQUNmLEVBQUUsRUFBRSxFQUFFLEVBQUU7Q0FDUixDQUFDLEVBQUU7Q0FDSCxFQUFFLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQztDQUNkLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztDQUNaLEVBQUUsRUFBRSxFQUFFLEVBQUU7Q0FDUixDQUFDLEVBQUU7Q0FDSCxFQUFFLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQztDQUNmLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7Q0FDZixFQUFFLEVBQUUsRUFBRSxFQUFFO0NBQ1IsQ0FBQyxFQUFFO0NBQ0gsRUFBRSxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUM7Q0FDZCxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQztDQUNwQixFQUFFLEVBQUUsRUFBRSxFQUFFO0NBQ1IsQ0FBQyxFQUFFO0NBQ0gsRUFBRSxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUM7Q0FDZCxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7Q0FDWixFQUFFLEVBQUUsRUFBRSxDQUFDO0NBQ1AsQ0FBQyxFQUFFO0NBQ0gsRUFBRSxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUM7Q0FDZCxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO0NBQ2hCLEVBQUUsRUFBRSxFQUFFLEVBQUU7Q0FDUixDQUFDLEVBQUU7Q0FDSCxFQUFFLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQztDQUNkLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0NBQ2xCLEVBQUUsRUFBRSxFQUFFLEVBQUU7Q0FDUixDQUFDLEVBQUU7Q0FDSCxFQUFFLElBQUksRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUM7Q0FDcEIsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7Q0FDcEIsRUFBRSxFQUFFLEVBQUUsRUFBRTtDQUNSLENBQUMsQ0FBQyxDQUFDO0NBQ0gsSUFBSSxrQkFBa0IsR0FBRztDQUN6QixFQUFFLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUU7Q0FDbkIsSUFBSSxPQUFPLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7Q0FDekIsR0FBRztDQUNILEVBQUUsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRTtDQUNuQixJQUFJLE9BQU8sTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztDQUMxQixHQUFHO0NBQ0gsRUFBRSxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFO0NBQ25CLElBQUksT0FBTyxDQUFDLENBQUM7Q0FDYixHQUFHO0NBQ0gsRUFBRSxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFO0NBQ25CLElBQUksT0FBTyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0NBQzVILEdBQUc7Q0FDSCxFQUFFLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUU7Q0FDbkIsSUFBSSxPQUFPLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0NBQ3BILEdBQUc7Q0FDSCxFQUFFLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUU7Q0FDbkIsSUFBSSxPQUFPLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0NBQ3pELEdBQUc7Q0FDSCxFQUFFLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUU7Q0FDbkIsSUFBSSxPQUFPLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztDQUN0RyxHQUFHO0NBQ0gsRUFBRSxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFO0NBQ25CLElBQUksT0FBTyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztDQUN2RSxHQUFHO0NBQ0gsRUFBRSxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFO0NBQ25CLElBQUksT0FBTyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0NBQzFCLEdBQUc7Q0FDSCxFQUFFLEVBQUUsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUU7Q0FDcEIsSUFBSSxPQUFPLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztDQUN4RSxHQUFHO0NBQ0gsRUFBRSxFQUFFLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFO0NBQ3BCLElBQUksT0FBTyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7Q0FDM0YsR0FBRztDQUNILEVBQUUsRUFBRSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRTtDQUNwQixJQUFJLE9BQU8sTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksRUFBRSxDQUFDLENBQUM7Q0FDaEQsR0FBRztDQUNILEVBQUUsRUFBRSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRTtDQUNwQixJQUFJLE9BQU8sTUFBTSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztDQUMzQixHQUFHO0NBQ0gsRUFBRSxFQUFFLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFO0NBQ3BCLElBQUksT0FBTyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7Q0FDNUQsR0FBRztDQUNILEVBQUUsRUFBRSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRTtDQUNwQixJQUFJLE9BQU8sTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztDQUM3RyxHQUFHO0NBQ0gsRUFBRSxFQUFFLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFO0NBQ3BCLElBQUksT0FBTyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0NBQ3RFLEdBQUc7Q0FDSCxFQUFFLEVBQUUsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUU7Q0FDcEIsSUFBSSxPQUFPLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztDQUNsRSxHQUFHO0NBQ0gsRUFBRSxFQUFFLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFO0NBQ3BCLElBQUksT0FBTyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7Q0FDL0MsR0FBRztDQUNILEVBQUUsRUFBRSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRTtDQUNwQixJQUFJLE9BQU8sTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztDQUNqSCxHQUFHO0NBQ0gsRUFBRSxFQUFFLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFO0NBQ3BCLElBQUksT0FBTyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7Q0FDOUUsR0FBRztDQUNILEVBQUUsRUFBRSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRTtDQUNwQixJQUFJLE9BQU8sTUFBTSxDQUFDLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FB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S0FBSztDQUNMLEdBQUcsRUFBRTtDQUNMLElBQUksR0FBRyxFQUFFLFFBQVE7Q0FDakIsSUFBSSxLQUFLLEVBQUUsU0FBUyxNQUFNLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUU7Q0FDNUMsTUFBTSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0NBQzlCLE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0NBQ3JCLE1BQU0sSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0NBQ3BCLE1BQU0sSUFBSSxHQUFHLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUN4RDtDQUNBLE1BQU0sSUFBSSxJQUFJLEVBQUU7Q0FDaEIsUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7Q0FDcEQsT0FBTztBQUNQO0NBQ0EsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7Q0FDdEMsTUFBTSxJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7Q0FDdEIsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsRUFBRTtDQUN0QyxRQUFRLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7Q0FDdEMsUUFBUSxhQUFhLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0NBQy9CLFFBQVEsSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEM7Q0FDQSxRQUFRLElBQUksQ0FBQyxDQUFDLFlBQVksS0FBSyxDQUFD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QUksQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFO0NBQ3JDLFVBQVUsQ0FBQyxDQUFDLFVBQVUsR0FBRyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0NBQ3RFLFVBQVUsSUFBSSxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztDQUN6RCxTQUFTO0FBQ1Q7Q0FDQSxRQUFRLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7Q0FDdEUsUUFBUSxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsVUFBVSxLQUFLLEVBQUU7Q0FDakQsVUFBVSxLQUFLLElBQUksS0FBSyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxHQUFHLElBQUksS0FBSyxDQUFDLEtBQUssR0FBRyxDQUFDLEdBQUcsS0FBSyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUU7Q0FDN0gsWUFBWSxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztDQUMvQyxXQUFXO0FBQ1g7Q0FDQSxVQUFVLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0NBQzFELFNBQVMsQ0FBQyxDQUFDO0NBQ1gsUUFBUSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEVBQUU7Q0FDbkQsVUFBVSxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztD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LEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7Q0FDN2IsTUFBTSxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsdUJBQXVCLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsV0FBVyxFQUFFLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLEdBQUcsS0FBSyxDQUFDO0NBQ3RKLEtBQUs7Q0FDTCxHQUFHLEVBQUU7Q0FDTCxJQUFJLEdBQUcsRUFBRSxlQUFlO0NBQ3hCLElBQUksS0FBSyxFQUFFLFNBQVMsYUFBYSxHQUFHO0NBQ3BDLE1BQU0sSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDO0FBQ3hCO0NBQ0EsTUFBTSxJQUFJLE9BQU8sR0FBRyxTQUFTLENB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LE1BQU0sRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLEdBQUc7Q0FDckQsRUFBRSxNQUFNLEVBQUUsR0FBRyxHQUFHLE1BQU0sRUFBRSxHQUFHO0NBQzNCLEVBQUUsTUFBTSxFQUFFLEdBQUcsR0FBRyxNQUFNLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxHQUFHO0NBQy9FLEVBQUUsTUFBTSxFQUFFLEdBQUcsR0FBRyxNQUFNLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxHQUFHO0NBQy9FLEVBQUUsTUFBTSxFQUFFLEdBQUcsR0FBRyxNQUFNLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLEdBQUc7Q0FDckQsRUFBRSxNQUFNLEVBQUUsR0FBRyxHQUFHLE1BQU0sRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsR0FBRztDQUNyRCxFQUFFLE1BQU0sRUFBRSxHQUFHLEdBQUcsTUFBTSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsR0FBRztDQUN4QyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUk7Q0FDNUIsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJO0NBQzVCLEVBQUUsTUFBTSxFQUFFLElBQUk7Q0FDZDtDQUNBLEVBQUUsUUFBUSxFQUFFLEdBQUcsR0FBRyxRQUFRLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxHQUFHO0NBQzlDLEVBQUUsUUFBUSxFQUFFLEdBQUcsR0FBRyxRQUFRLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxHQUFHO0NBQzlDLEVBQUUsUUFBUSxFQUFFLEdBQUcsR0FBRyxRQUFRLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLEdBQUc7Q0FDN0QsRUFBRSxRQUFRLEVBQUUsR0FBRyxHQUFHLFFBQVEsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsR0FBRztDQUM3RCxFQUFFLFFBQVEsRUFBRSxHQUFHLEdBQUcsUUFBUSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxHQUFHO0NBQzdELEVBQUUsUUFBUSxFQUFFLEdBQUcsR0FBRyxRQUFRLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsR0FBRztDQUM1RSxFQUFFLFFBQVEsRUFBRSxHQUFHLEdBQUcsUUFBUSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLEdBQUc7Q0FDNUUsRUFBRSxRQUFRLEVBQUUsR0FBRyxHQUFHLFFBQVEsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsR0FBRztDQUM3RCxFQUFFLFFBQVEsRUFBRSxHQUFHLEdBQUcsUUFBUSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxHQUFHO0NBQzdELEVBQUUsUUFBUSxFQUFFLEdBQUcsR0FBRyxRQUFRLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLEdBQUc7Q0FDN0QsRUFBRSxRQUFRLEVBQUUsR0FBRyxHQUFHLFFBQVEsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxHQUFHO0NBQzVFLEVBQUUsUUFBUSxFQUFFLEdBQUcsR0FBRyxRQUFRLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsR0FBRztDQUM1RSxFQUFFLFFBQVEsRUFBRSxHQUFHLEdBQUcsUUFBUSxFQUFFLEdBQUc7Q0FDL0IsRUFBRSxRQUFRLEVBQUUsR0FBRyxHQUFHLFFBQVEsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLEdBQUc7Q0FDOUMsRUFBRSxRQUFRLEVBQUUsR0FBRyxHQUFHLFFBQVEsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxHQUFHO0NBQzVFLEVBQUUsUUFBUSxFQUFFLEdBQUcsR0FBRyxRQUFRLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsR0FBRztDQUM1RSxFQUFFLFFBQVEsRUFBRSxHQUFHLEdBQUcsUUFBUSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxHQUFHO0NBQzdELEVBQUUsUUFBUSxFQUFFLEdBQUcsR0FBRyxRQUFRLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLEdBQUc7Q0FDN0QsRUFBRSxRQUFRLEVBQUUsR0FBRyxHQUFHLFFBQVEsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLEdBQUc7Q0FDOUMsRUFBRSxRQUFRLEVBQUUsR0FBRyxHQUFHLFFBQVEsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLEdBQUc7Q0FDOUMsRUFBRSxRQUFRLEVBQUUsR0FBRyxHQUFHLFFBQVEsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLEdBQUc7Q0FDOUMsRUFBRSxRQUFRLEVBQUUsR0FBRyxHQUFHLFFBQVEsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLEdBQUc7Q0FDOUMsRUFBRSxRQUFRLEVBQUUsR0FBRyxHQUFHLFFBQVEsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsR0FBRztDQUM3RCxFQUFFLFFBQVEsRUFBRSxHQUFHLEdBQUcsUUFBUSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxHQUFHO0NBQzdELEVBQUUsUUFBUSxFQUFFLEdBQUcsR0FBRyxRQUFRLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxHQUFHO0NBQzlDLEVBQUUsUUFBUSxFQUFFLEdBQUcsR0FBRyxRQUFRLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxHQUFHO0NBQzlDLEVBQUUsUUFBUSxFQUFFLEdBQUcsR0FBRyxRQUFRLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxHQUFHO0NBQzNGLEVBQUUsUUFBUSxFQUFFLEdBQUcsR0FBRyxRQUFRLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxHQUFHO0NBQzNGLEVBQUUsUUFBUSxFQUFFLEdBQUcsR0FBRyxRQUFRLEVBQUUsR0FBRztDQUMvQixFQUFFLFFBQVEsRUFBRSxHQUFHLEdBQUcsUUFBUSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsR0FBRztDQUM5QyxFQUFFLFFBQVEsRUFBRSxHQUFHLEdBQUcsUUFBUSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsR0FBRztDQUM5QyxFQUFFLFFBQVEsRUFBRSxHQUFHLEdBQUcsUUFBUSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsR0FBRztDQUM5QyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUk7Q0FDaEMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJO0NBQ2hDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsR0FBRztDQUMvQixDQUFDLENBQUM7QUFDRjtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQSxJQUFJMEgsY0FBWSxHQUFHLGNBQWMsQ0FBQyxlQUFlLENBQUMsQ0FBQztBQUNuRDtDQUNBLElBQUEsYUFBYyxHQUFHQSxj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