From 78053b8f7e50504f528eed5088b2089271d605c1 Mon Sep 17 00:00:00 2001 From: X_Rian <904416525@qq.com> Date: Thu, 4 Jul 2024 14:09:33 +0800 Subject: [PATCH] =?UTF-8?q?flx=EF=BC=9A=E5=8D=B1=E5=A4=A7=E5=B7=A5?= =?UTF-8?q?=E7=A8=8B=20=E4=BF=AE=E6=94=B9=E6=96=BD=E5=B7=A5=E7=8A=B6?= =?UTF-8?q?=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pages/projectEnd/dangerBigProject/index.vue | 11 +++++++---- unpackage/dist/dev/app-plus/app-service.js | 2 +- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/pages/projectEnd/dangerBigProject/index.vue b/pages/projectEnd/dangerBigProject/index.vue index ac2f16b3..ac128fff 100644 --- a/pages/projectEnd/dangerBigProject/index.vue +++ b/pages/projectEnd/dangerBigProject/index.vue @@ -16,14 +16,17 @@ - - - + + + {{item.finalAcceptanceStatus == 1 ? "在施" : item.finalAcceptanceStatus == 2 ? "已完工" : ""}} + diff --git a/unpackage/dist/dev/app-plus/app-service.js b/unpackage/dist/dev/app-plus/app-service.js index a777a272..0d230ceb 100644 --- a/unpackage/dist/dev/app-plus/app-service.js +++ b/unpackage/dist/dev/app-plus/app-service.js @@ -148919,7 +148919,7 @@ eval("\n\nvar _interopRequireDefault = __webpack_require__(/*! @babel/runtime/he /***/ (function(module, exports, __webpack_require__) { "use strict"; -eval("/* WEBPACK VAR INJECTION */(function(process, __f__) {\n\nvar _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ 2);\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\nvar _typeof2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/typeof */ 5));\nfunction _extends() {\n _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n return target;\n };\n return _extends.apply(this, arguments);\n}\n\n/* eslint no-console:0 */\nvar formatRegExp = /%[sdj%]/g;\nvar warning = function warning() {}; // don't print warning message when in production env or node runtime\n\nif (typeof process !== 'undefined' && Object({\"NODE_ENV\":\"development\",\"VUE_APP_DARK_MODE\":\"false\",\"VUE_APP_NAME\":\"智慧安全\",\"VUE_APP_PLATFORM\":\"app-plus\",\"BASE_URL\":\"/\"}) && \"development\" !== 'production' && typeof window !== 'undefined' && typeof document !== 'undefined') {\n warning = function warning(type, errors) {\n if (typeof console !== 'undefined' && console.warn) {\n if (errors.every(function (e) {\n return typeof e === 'string';\n })) {\n __f__(\"warn\", type, errors, \" at uview-ui/libs/util/async-validator.js:30\");\n }\n }\n };\n}\nfunction convertFieldsError(errors) {\n if (!errors || !errors.length) return null;\n var fields = {};\n errors.forEach(function (error) {\n var field = error.field;\n fields[field] = fields[field] || [];\n fields[field].push(error);\n });\n return fields;\n}\nfunction format() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n var i = 1;\n var f = args[0];\n var len = args.length;\n if (typeof f === 'function') {\n return f.apply(null, args.slice(1));\n }\n if (typeof f === 'string') {\n var str = String(f).replace(formatRegExp, function (x) {\n if (x === '%%') {\n return '%';\n }\n if (i >= len) {\n return x;\n }\n switch (x) {\n case '%s':\n return String(args[i++]);\n case '%d':\n return Number(args[i++]);\n case '%j':\n try {\n return JSON.stringify(args[i++]);\n } catch (_) {\n return '[Circular]';\n }\n break;\n default:\n return x;\n }\n });\n for (var arg = args[i]; i < len; arg = args[++i]) {\n str += \" \" + arg;\n }\n return str;\n }\n return f;\n}\nfunction isNativeStringType(type) {\n return type === 'string' || type === 'url' || type === 'hex' || type === 'email' || type === 'pattern';\n}\nfunction isEmptyValue(value, type) {\n if (value === undefined || value === null) {\n return true;\n }\n if (type === 'array' && Array.isArray(value) && !value.length) {\n return true;\n }\n if (isNativeStringType(type) && typeof value === 'string' && !value) {\n return true;\n }\n return false;\n}\nfunction asyncParallelArray(arr, func, callback) {\n var results = [];\n var total = 0;\n var arrLength = arr.length;\n function count(errors) {\n results.push.apply(results, errors);\n total++;\n if (total === arrLength) {\n callback(results);\n }\n }\n arr.forEach(function (a) {\n func(a, count);\n });\n}\nfunction asyncSerialArray(arr, func, callback) {\n var index = 0;\n var arrLength = arr.length;\n function next(errors) {\n if (errors && errors.length) {\n callback(errors);\n return;\n }\n var original = index;\n index = index + 1;\n if (original < arrLength) {\n func(arr[original], next);\n } else {\n callback([]);\n }\n }\n next([]);\n}\nfunction flattenObjArr(objArr) {\n var ret = [];\n Object.keys(objArr).forEach(function (k) {\n ret.push.apply(ret, objArr[k]);\n });\n return ret;\n}\nfunction asyncMap(objArr, option, func, callback) {\n if (option.first) {\n var _pending = new Promise(function (resolve, reject) {\n var next = function next(errors) {\n callback(errors);\n return errors.length ? reject({\n errors: errors,\n fields: convertFieldsError(errors)\n }) : resolve();\n };\n var flattenArr = flattenObjArr(objArr);\n asyncSerialArray(flattenArr, func, next);\n });\n _pending[\"catch\"](function (e) {\n return e;\n });\n return _pending;\n }\n var firstFields = option.firstFields || [];\n if (firstFields === true) {\n firstFields = Object.keys(objArr);\n }\n var objArrKeys = Object.keys(objArr);\n var objArrLength = objArrKeys.length;\n var total = 0;\n var results = [];\n var pending = new Promise(function (resolve, reject) {\n var next = function next(errors) {\n results.push.apply(results, errors);\n total++;\n if (total === objArrLength) {\n callback(results);\n return results.length ? reject({\n errors: results,\n fields: convertFieldsError(results)\n }) : resolve();\n }\n };\n if (!objArrKeys.length) {\n callback(results);\n resolve();\n }\n objArrKeys.forEach(function (key) {\n var arr = objArr[key];\n if (firstFields.indexOf(key) !== -1) {\n asyncSerialArray(arr, func, next);\n } else {\n asyncParallelArray(arr, func, next);\n }\n });\n });\n pending[\"catch\"](function (e) {\n return e;\n });\n return pending;\n}\nfunction complementError(rule) {\n return function (oe) {\n if (oe && oe.message) {\n oe.field = oe.field || rule.fullField;\n return oe;\n }\n return {\n message: typeof oe === 'function' ? oe() : oe,\n field: oe.field || rule.fullField\n };\n };\n}\nfunction deepMerge(target, source) {\n if (source) {\n for (var s in source) {\n if (source.hasOwnProperty(s)) {\n var value = source[s];\n if ((0, _typeof2.default)(value) === 'object' && (0, _typeof2.default)(target[s]) === 'object') {\n target[s] = _extends({}, target[s], {}, value);\n } else {\n target[s] = value;\n }\n }\n }\n }\n return target;\n}\n\n/**\r\n * Rule for validating required fields.\r\n *\r\n * @param rule The validation rule.\r\n * @param value The value of the field on the source object.\r\n * @param source The source object being validated.\r\n * @param errors An array of errors that this rule may add\r\n * validation errors to.\r\n * @param options The validation options.\r\n * @param options.messages The validation messages.\r\n */\n\nfunction required(rule, value, source, errors, options, type) {\n if (rule.required && (!source.hasOwnProperty(rule.field) || isEmptyValue(value, type || rule.type))) {\n errors.push(format(options.messages.required, rule.fullField));\n }\n}\n\n/**\r\n * Rule for validating whitespace.\r\n *\r\n * @param rule The validation rule.\r\n * @param value The value of the field on the source object.\r\n * @param source The source object being validated.\r\n * @param errors An array of errors that this rule may add\r\n * validation errors to.\r\n * @param options The validation options.\r\n * @param options.messages The validation messages.\r\n */\n\nfunction whitespace(rule, value, source, errors, options) {\n if (/^\\s+$/.test(value) || value === '') {\n errors.push(format(options.messages.whitespace, rule.fullField));\n }\n}\n\n/* eslint max-len:0 */\n\nvar pattern = {\n // http://emailregex.com/\n email: /^(([^<>()\\[\\]\\\\.,;:\\s@\"]+(\\.[^<>()\\[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/,\n url: new RegExp(\"^(?!mailto:)(?:(?:http|https|ftp)://|//)(?:\\\\S+(?::\\\\S*)?@)?(?:(?:(?:[1-9]\\\\d?|1\\\\d\\\\d|2[01]\\\\d|22[0-3])(?:\\\\.(?:1?\\\\d{1,2}|2[0-4]\\\\d|25[0-5])){2}(?:\\\\.(?:[0-9]\\\\d?|1\\\\d\\\\d|2[0-4]\\\\d|25[0-4]))|(?:(?:[a-z\\\\u00a1-\\\\uffff0-9]+-*)*[a-z\\\\u00a1-\\\\uffff0-9]+)(?:\\\\.(?:[a-z\\\\u00a1-\\\\uffff0-9]+-*)*[a-z\\\\u00a1-\\\\uffff0-9]+)*(?:\\\\.(?:[a-z\\\\u00a1-\\\\uffff]{2,})))|localhost)(?::\\\\d{2,5})?(?:(/|\\\\?|#)[^\\\\s]*)?$\", 'i'),\n hex: /^#?([a-f0-9]{6}|[a-f0-9]{3})$/i\n};\nvar types = {\n integer: function integer(value) {\n return types.number(value) && parseInt(value, 10) === value;\n },\n \"float\": function float(value) {\n return types.number(value) && !types.integer(value);\n },\n array: function array(value) {\n return Array.isArray(value);\n },\n regexp: function regexp(value) {\n if (value instanceof RegExp) {\n return true;\n }\n try {\n return !!new RegExp(value);\n } catch (e) {\n return false;\n }\n },\n date: function date(value) {\n return typeof value.getTime === 'function' && typeof value.getMonth === 'function' && typeof value.getYear === 'function';\n },\n number: function number(value) {\n if (isNaN(value)) {\n return false;\n }\n\n // 修改源码,将字符串数值先转为数值\n return typeof +value === 'number';\n },\n object: function object(value) {\n return (0, _typeof2.default)(value) === 'object' && !types.array(value);\n },\n method: function method(value) {\n return typeof value === 'function';\n },\n email: function email(value) {\n return typeof value === 'string' && !!value.match(pattern.email) && value.length < 255;\n },\n url: function url(value) {\n return typeof value === 'string' && !!value.match(pattern.url);\n },\n hex: function hex(value) {\n return typeof value === 'string' && !!value.match(pattern.hex);\n }\n};\n/**\r\n * Rule for validating the type of a value.\r\n *\r\n * @param rule The validation rule.\r\n * @param value The value of the field on the source object.\r\n * @param source The source object being validated.\r\n * @param errors An array of errors that this rule may add\r\n * validation errors to.\r\n * @param options The validation options.\r\n * @param options.messages The validation messages.\r\n */\n\nfunction type(rule, value, source, errors, options) {\n if (rule.required && value === undefined) {\n required(rule, value, source, errors, options);\n return;\n }\n var custom = ['integer', 'float', 'array', 'regexp', 'object', 'method', 'email', 'number', 'date', 'url', 'hex'];\n var ruleType = rule.type;\n if (custom.indexOf(ruleType) > -1) {\n if (!types[ruleType](value)) {\n errors.push(format(options.messages.types[ruleType], rule.fullField, rule.type));\n } // straight typeof check\n } else if (ruleType && (0, _typeof2.default)(value) !== rule.type) {\n errors.push(format(options.messages.types[ruleType], rule.fullField, rule.type));\n }\n}\n\n/**\r\n * Rule for validating minimum and maximum allowed values.\r\n *\r\n * @param rule The validation rule.\r\n * @param value The value of the field on the source object.\r\n * @param source The source object being validated.\r\n * @param errors An array of errors that this rule may add\r\n * validation errors to.\r\n * @param options The validation options.\r\n * @param options.messages The validation messages.\r\n */\n\nfunction range(rule, value, source, errors, options) {\n var len = typeof rule.len === 'number';\n var min = typeof rule.min === 'number';\n var max = typeof rule.max === 'number'; // 正则匹配码点范围从U+010000一直到U+10FFFF的文字(补充平面Supplementary Plane)\n\n var spRegexp = /[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g;\n var val = value;\n var key = null;\n var num = typeof value === 'number';\n var str = typeof value === 'string';\n var arr = Array.isArray(value);\n if (num) {\n key = 'number';\n } else if (str) {\n key = 'string';\n } else if (arr) {\n key = 'array';\n } // if the value is not of a supported type for range validation\n // the validation rule rule should use the\n // type property to also test for a particular type\n\n if (!key) {\n return false;\n }\n if (arr) {\n val = value.length;\n }\n if (str) {\n // 处理码点大于U+010000的文字length属性不准确的bug,如\"𠮷𠮷𠮷\".length !== 3\n val = value.replace(spRegexp, '_').length;\n }\n if (len) {\n if (val !== rule.len) {\n errors.push(format(options.messages[key].len, rule.fullField, rule.len));\n }\n } else if (min && !max && val < rule.min) {\n errors.push(format(options.messages[key].min, rule.fullField, rule.min));\n } else if (max && !min && val > rule.max) {\n errors.push(format(options.messages[key].max, rule.fullField, rule.max));\n } else if (min && max && (val < rule.min || val > rule.max)) {\n errors.push(format(options.messages[key].range, rule.fullField, rule.min, rule.max));\n }\n}\nvar ENUM = 'enum';\n/**\r\n * Rule for validating a value exists in an enumerable list.\r\n *\r\n * @param rule The validation rule.\r\n * @param value The value of the field on the source object.\r\n * @param source The source object being validated.\r\n * @param errors An array of errors that this rule may add\r\n * validation errors to.\r\n * @param options The validation options.\r\n * @param options.messages The validation messages.\r\n */\n\nfunction enumerable(rule, value, source, errors, options) {\n rule[ENUM] = Array.isArray(rule[ENUM]) ? rule[ENUM] : [];\n if (rule[ENUM].indexOf(value) === -1) {\n errors.push(format(options.messages[ENUM], rule.fullField, rule[ENUM].join(', ')));\n }\n}\n\n/**\r\n * Rule for validating a regular expression pattern.\r\n *\r\n * @param rule The validation rule.\r\n * @param value The value of the field on the source object.\r\n * @param source The source object being validated.\r\n * @param errors An array of errors that this rule may add\r\n * validation errors to.\r\n * @param options The validation options.\r\n * @param options.messages The validation messages.\r\n */\n\nfunction pattern$1(rule, value, source, errors, options) {\n if (rule.pattern) {\n if (rule.pattern instanceof RegExp) {\n // if a RegExp instance is passed, reset `lastIndex` in case its `global`\n // flag is accidentally set to `true`, which in a validation scenario\n // is not necessary and the result might be misleading\n rule.pattern.lastIndex = 0;\n if (!rule.pattern.test(value)) {\n errors.push(format(options.messages.pattern.mismatch, rule.fullField, value, rule.pattern));\n }\n } else if (typeof rule.pattern === 'string') {\n var _pattern = new RegExp(rule.pattern);\n if (!_pattern.test(value)) {\n errors.push(format(options.messages.pattern.mismatch, rule.fullField, value, rule.pattern));\n }\n }\n }\n}\nvar rules = {\n required: required,\n whitespace: whitespace,\n type: type,\n range: range,\n \"enum\": enumerable,\n pattern: pattern$1\n};\n\n/**\r\n * Performs validation for string types.\r\n *\r\n * @param rule The validation rule.\r\n * @param value The value of the field on the source object.\r\n * @param callback The callback function.\r\n * @param source The source object being validated.\r\n * @param options The validation options.\r\n * @param options.messages The validation messages.\r\n */\n\nfunction string(rule, value, callback, source, options) {\n var errors = [];\n var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);\n if (validate) {\n if (isEmptyValue(value, 'string') && !rule.required) {\n return callback();\n }\n rules.required(rule, value, source, errors, options, 'string');\n if (!isEmptyValue(value, 'string')) {\n rules.type(rule, value, source, errors, options);\n rules.range(rule, value, source, errors, options);\n rules.pattern(rule, value, source, errors, options);\n if (rule.whitespace === true) {\n rules.whitespace(rule, value, source, errors, options);\n }\n }\n }\n callback(errors);\n}\n\n/**\r\n * Validates a function.\r\n *\r\n * @param rule The validation rule.\r\n * @param value The value of the field on the source object.\r\n * @param callback The callback function.\r\n * @param source The source object being validated.\r\n * @param options The validation options.\r\n * @param options.messages The validation messages.\r\n */\n\nfunction method(rule, value, callback, source, options) {\n var errors = [];\n var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);\n if (validate) {\n if (isEmptyValue(value) && !rule.required) {\n return callback();\n }\n rules.required(rule, value, source, errors, options);\n if (value !== undefined) {\n rules.type(rule, value, source, errors, options);\n }\n }\n callback(errors);\n}\n\n/**\r\n * Validates a number.\r\n *\r\n * @param rule The validation rule.\r\n * @param value The value of the field on the source object.\r\n * @param callback The callback function.\r\n * @param source The source object being validated.\r\n * @param options The validation options.\r\n * @param options.messages The validation messages.\r\n */\n\nfunction number(rule, value, callback, source, options) {\n var errors = [];\n var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);\n if (validate) {\n if (value === '') {\n value = undefined;\n }\n if (isEmptyValue(value) && !rule.required) {\n return callback();\n }\n rules.required(rule, value, source, errors, options);\n if (value !== undefined) {\n rules.type(rule, value, source, errors, options);\n rules.range(rule, value, source, errors, options);\n }\n }\n callback(errors);\n}\n\n/**\r\n * Validates a boolean.\r\n *\r\n * @param rule The validation rule.\r\n * @param value The value of the field on the source object.\r\n * @param callback The callback function.\r\n * @param source The source object being validated.\r\n * @param options The validation options.\r\n * @param options.messages The validation messages.\r\n */\n\nfunction _boolean(rule, value, callback, source, options) {\n var errors = [];\n var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);\n if (validate) {\n if (isEmptyValue(value) && !rule.required) {\n return callback();\n }\n rules.required(rule, value, source, errors, options);\n if (value !== undefined) {\n rules.type(rule, value, source, errors, options);\n }\n }\n callback(errors);\n}\n\n/**\r\n * Validates the regular expression type.\r\n *\r\n * @param rule The validation rule.\r\n * @param value The value of the field on the source object.\r\n * @param callback The callback function.\r\n * @param source The source object being validated.\r\n * @param options The validation options.\r\n * @param options.messages The validation messages.\r\n */\n\nfunction regexp(rule, value, callback, source, options) {\n var errors = [];\n var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);\n if (validate) {\n if (isEmptyValue(value) && !rule.required) {\n return callback();\n }\n rules.required(rule, value, source, errors, options);\n if (!isEmptyValue(value)) {\n rules.type(rule, value, source, errors, options);\n }\n }\n callback(errors);\n}\n\n/**\r\n * Validates a number is an integer.\r\n *\r\n * @param rule The validation rule.\r\n * @param value The value of the field on the source object.\r\n * @param callback The callback function.\r\n * @param source The source object being validated.\r\n * @param options The validation options.\r\n * @param options.messages The validation messages.\r\n */\n\nfunction integer(rule, value, callback, source, options) {\n var errors = [];\n var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);\n if (validate) {\n if (isEmptyValue(value) && !rule.required) {\n return callback();\n }\n rules.required(rule, value, source, errors, options);\n if (value !== undefined) {\n rules.type(rule, value, source, errors, options);\n rules.range(rule, value, source, errors, options);\n }\n }\n callback(errors);\n}\n\n/**\r\n * Validates a number is a floating point number.\r\n *\r\n * @param rule The validation rule.\r\n * @param value The value of the field on the source object.\r\n * @param callback The callback function.\r\n * @param source The source object being validated.\r\n * @param options The validation options.\r\n * @param options.messages The validation messages.\r\n */\n\nfunction floatFn(rule, value, callback, source, options) {\n var errors = [];\n var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);\n if (validate) {\n if (isEmptyValue(value) && !rule.required) {\n return callback();\n }\n rules.required(rule, value, source, errors, options);\n if (value !== undefined) {\n rules.type(rule, value, source, errors, options);\n rules.range(rule, value, source, errors, options);\n }\n }\n callback(errors);\n}\n\n/**\r\n * Validates an array.\r\n *\r\n * @param rule The validation rule.\r\n * @param value The value of the field on the source object.\r\n * @param callback The callback function.\r\n * @param source The source object being validated.\r\n * @param options The validation options.\r\n * @param options.messages The validation messages.\r\n */\n\nfunction array(rule, value, callback, source, options) {\n var errors = [];\n var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);\n if (validate) {\n if (isEmptyValue(value, 'array') && !rule.required) {\n return callback();\n }\n rules.required(rule, value, source, errors, options, 'array');\n if (!isEmptyValue(value, 'array')) {\n rules.type(rule, value, source, errors, options);\n rules.range(rule, value, source, errors, options);\n }\n }\n callback(errors);\n}\n\n/**\r\n * Validates an object.\r\n *\r\n * @param rule The validation rule.\r\n * @param value The value of the field on the source object.\r\n * @param callback The callback function.\r\n * @param source The source object being validated.\r\n * @param options The validation options.\r\n * @param options.messages The validation messages.\r\n */\n\nfunction object(rule, value, callback, source, options) {\n var errors = [];\n var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);\n if (validate) {\n if (isEmptyValue(value) && !rule.required) {\n return callback();\n }\n rules.required(rule, value, source, errors, options);\n if (value !== undefined) {\n rules.type(rule, value, source, errors, options);\n }\n }\n callback(errors);\n}\nvar ENUM$1 = 'enum';\n/**\r\n * Validates an enumerable list.\r\n *\r\n * @param rule The validation rule.\r\n * @param value The value of the field on the source object.\r\n * @param callback The callback function.\r\n * @param source The source object being validated.\r\n * @param options The validation options.\r\n * @param options.messages The validation messages.\r\n */\n\nfunction enumerable$1(rule, value, callback, source, options) {\n var errors = [];\n var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);\n if (validate) {\n if (isEmptyValue(value) && !rule.required) {\n return callback();\n }\n rules.required(rule, value, source, errors, options);\n if (value !== undefined) {\n rules[ENUM$1](rule, value, source, errors, options);\n }\n }\n callback(errors);\n}\n\n/**\r\n * Validates a regular expression pattern.\r\n *\r\n * Performs validation when a rule only contains\r\n * a pattern property but is not declared as a string type.\r\n *\r\n * @param rule The validation rule.\r\n * @param value The value of the field on the source object.\r\n * @param callback The callback function.\r\n * @param source The source object being validated.\r\n * @param options The validation options.\r\n * @param options.messages The validation messages.\r\n */\n\nfunction pattern$2(rule, value, callback, source, options) {\n var errors = [];\n var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);\n if (validate) {\n if (isEmptyValue(value, 'string') && !rule.required) {\n return callback();\n }\n rules.required(rule, value, source, errors, options);\n if (!isEmptyValue(value, 'string')) {\n rules.pattern(rule, value, source, errors, options);\n }\n }\n callback(errors);\n}\nfunction date(rule, value, callback, source, options) {\n var errors = [];\n var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);\n if (validate) {\n if (isEmptyValue(value) && !rule.required) {\n return callback();\n }\n rules.required(rule, value, source, errors, options);\n if (!isEmptyValue(value)) {\n var dateObject;\n if (typeof value === 'number') {\n dateObject = new Date(value);\n } else {\n dateObject = value;\n }\n rules.type(rule, dateObject, source, errors, options);\n if (dateObject) {\n rules.range(rule, dateObject.getTime(), source, errors, options);\n }\n }\n }\n callback(errors);\n}\nfunction required$1(rule, value, callback, source, options) {\n var errors = [];\n var type = Array.isArray(value) ? 'array' : (0, _typeof2.default)(value);\n rules.required(rule, value, source, errors, options, type);\n callback(errors);\n}\nfunction type$1(rule, value, callback, source, options) {\n var ruleType = rule.type;\n var errors = [];\n var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);\n if (validate) {\n if (isEmptyValue(value, ruleType) && !rule.required) {\n return callback();\n }\n rules.required(rule, value, source, errors, options, ruleType);\n if (!isEmptyValue(value, ruleType)) {\n rules.type(rule, value, source, errors, options);\n }\n }\n callback(errors);\n}\n\n/**\r\n * Performs validation for any type.\r\n *\r\n * @param rule The validation rule.\r\n * @param value The value of the field on the source object.\r\n * @param callback The callback function.\r\n * @param source The source object being validated.\r\n * @param options The validation options.\r\n * @param options.messages The validation messages.\r\n */\n\nfunction any(rule, value, callback, source, options) {\n var errors = [];\n var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);\n if (validate) {\n if (isEmptyValue(value) && !rule.required) {\n return callback();\n }\n rules.required(rule, value, source, errors, options);\n }\n callback(errors);\n}\nvar validators = {\n string: string,\n method: method,\n number: number,\n \"boolean\": _boolean,\n regexp: regexp,\n integer: integer,\n \"float\": floatFn,\n array: array,\n object: object,\n \"enum\": enumerable$1,\n pattern: pattern$2,\n date: date,\n url: type$1,\n hex: type$1,\n email: type$1,\n required: required$1,\n any: any\n};\nfunction newMessages() {\n return {\n \"default\": 'Validation error on field %s',\n required: '%s is required',\n \"enum\": '%s must be one of %s',\n whitespace: '%s cannot be empty',\n date: {\n format: '%s date %s is invalid for format %s',\n parse: '%s date could not be parsed, %s is invalid ',\n invalid: '%s date %s is invalid'\n },\n types: {\n string: '%s is not a %s',\n method: '%s is not a %s (function)',\n array: '%s is not an %s',\n object: '%s is not an %s',\n number: '%s is not a %s',\n date: '%s is not a %s',\n \"boolean\": '%s is not a %s',\n integer: '%s is not an %s',\n \"float\": '%s is not a %s',\n regexp: '%s is not a valid %s',\n email: '%s is not a valid %s',\n url: '%s is not a valid %s',\n hex: '%s is not a valid %s'\n },\n string: {\n len: '%s must be exactly %s characters',\n min: '%s must be at least %s characters',\n max: '%s cannot be longer than %s characters',\n range: '%s must be between %s and %s characters'\n },\n number: {\n len: '%s must equal %s',\n min: '%s cannot be less than %s',\n max: '%s cannot be greater than %s',\n range: '%s must be between %s and %s'\n },\n array: {\n len: '%s must be exactly %s in length',\n min: '%s cannot be less than %s in length',\n max: '%s cannot be greater than %s in length',\n range: '%s must be between %s and %s in length'\n },\n pattern: {\n mismatch: '%s value %s does not match pattern %s'\n },\n clone: function clone() {\n var cloned = JSON.parse(JSON.stringify(this));\n cloned.clone = this.clone;\n return cloned;\n }\n };\n}\nvar messages = newMessages();\n\n/**\r\n * Encapsulates a validation schema.\r\n *\r\n * @param descriptor An object declaring validation rules\r\n * for this schema.\r\n */\n\nfunction Schema(descriptor) {\n this.rules = null;\n this._messages = messages;\n this.define(descriptor);\n}\nSchema.prototype = {\n messages: function messages(_messages) {\n if (_messages) {\n this._messages = deepMerge(newMessages(), _messages);\n }\n return this._messages;\n },\n define: function define(rules) {\n if (!rules) {\n throw new Error('Cannot configure a schema with no rules');\n }\n if ((0, _typeof2.default)(rules) !== 'object' || Array.isArray(rules)) {\n throw new Error('Rules must be an object');\n }\n this.rules = {};\n var z;\n var item;\n for (z in rules) {\n if (rules.hasOwnProperty(z)) {\n item = rules[z];\n this.rules[z] = Array.isArray(item) ? item : [item];\n }\n }\n },\n validate: function validate(source_, o, oc) {\n var _this = this;\n if (o === void 0) {\n o = {};\n }\n if (oc === void 0) {\n oc = function oc() {};\n }\n var source = source_;\n var options = o;\n var callback = oc;\n if (typeof options === 'function') {\n callback = options;\n options = {};\n }\n if (!this.rules || Object.keys(this.rules).length === 0) {\n if (callback) {\n callback();\n }\n return Promise.resolve();\n }\n function complete(results) {\n var i;\n var errors = [];\n var fields = {};\n function add(e) {\n if (Array.isArray(e)) {\n var _errors;\n errors = (_errors = errors).concat.apply(_errors, e);\n } else {\n errors.push(e);\n }\n }\n for (i = 0; i < results.length; i++) {\n add(results[i]);\n }\n if (!errors.length) {\n errors = null;\n fields = null;\n } else {\n fields = convertFieldsError(errors);\n }\n callback(errors, fields);\n }\n if (options.messages) {\n var messages$1 = this.messages();\n if (messages$1 === messages) {\n messages$1 = newMessages();\n }\n deepMerge(messages$1, options.messages);\n options.messages = messages$1;\n } else {\n options.messages = this.messages();\n }\n var arr;\n var value;\n var series = {};\n var keys = options.keys || Object.keys(this.rules);\n keys.forEach(function (z) {\n arr = _this.rules[z];\n value = source[z];\n arr.forEach(function (r) {\n var rule = r;\n if (typeof rule.transform === 'function') {\n if (source === source_) {\n source = _extends({}, source);\n }\n value = source[z] = rule.transform(value);\n }\n if (typeof rule === 'function') {\n rule = {\n validator: rule\n };\n } else {\n rule = _extends({}, rule);\n }\n rule.validator = _this.getValidationMethod(rule);\n rule.field = z;\n rule.fullField = rule.fullField || z;\n rule.type = _this.getType(rule);\n if (!rule.validator) {\n return;\n }\n series[z] = series[z] || [];\n series[z].push({\n rule: rule,\n value: value,\n source: source,\n field: z\n });\n });\n });\n var errorFields = {};\n return asyncMap(series, options, function (data, doIt) {\n var rule = data.rule;\n var deep = (rule.type === 'object' || rule.type === 'array') && ((0, _typeof2.default)(rule.fields) === 'object' || (0, _typeof2.default)(rule.defaultField) === 'object');\n deep = deep && (rule.required || !rule.required && data.value);\n rule.field = data.field;\n function addFullfield(key, schema) {\n return _extends({}, schema, {\n fullField: rule.fullField + \".\" + key\n });\n }\n function cb(e) {\n if (e === void 0) {\n e = [];\n }\n var errors = e;\n if (!Array.isArray(errors)) {\n errors = [errors];\n }\n if (!options.suppressWarning && errors.length) {\n Schema.warning('async-validator:', errors);\n }\n if (errors.length && rule.message) {\n errors = [].concat(rule.message);\n }\n errors = errors.map(complementError(rule));\n if (options.first && errors.length) {\n errorFields[rule.field] = 1;\n return doIt(errors);\n }\n if (!deep) {\n doIt(errors);\n } else {\n // if rule is required but the target object\n // does not exist fail at the rule level and don't\n // go deeper\n if (rule.required && !data.value) {\n if (rule.message) {\n errors = [].concat(rule.message).map(complementError(rule));\n } else if (options.error) {\n errors = [options.error(rule, format(options.messages.required, rule.field))];\n } else {\n errors = [];\n }\n return doIt(errors);\n }\n var fieldsSchema = {};\n if (rule.defaultField) {\n for (var k in data.value) {\n if (data.value.hasOwnProperty(k)) {\n fieldsSchema[k] = rule.defaultField;\n }\n }\n }\n fieldsSchema = _extends({}, fieldsSchema, {}, data.rule.fields);\n for (var f in fieldsSchema) {\n if (fieldsSchema.hasOwnProperty(f)) {\n var fieldSchema = Array.isArray(fieldsSchema[f]) ? fieldsSchema[f] : [fieldsSchema[f]];\n fieldsSchema[f] = fieldSchema.map(addFullfield.bind(null, f));\n }\n }\n var schema = new Schema(fieldsSchema);\n schema.messages(options.messages);\n if (data.rule.options) {\n data.rule.options.messages = options.messages;\n data.rule.options.error = options.error;\n }\n schema.validate(data.value, data.rule.options || options, function (errs) {\n var finalErrors = [];\n if (errors && errors.length) {\n finalErrors.push.apply(finalErrors, errors);\n }\n if (errs && errs.length) {\n finalErrors.push.apply(finalErrors, errs);\n }\n doIt(finalErrors.length ? finalErrors : null);\n });\n }\n }\n var res;\n if (rule.asyncValidator) {\n res = rule.asyncValidator(rule, data.value, cb, data.source, options);\n } else if (rule.validator) {\n res = rule.validator(rule, data.value, cb, data.source, options);\n if (res === true) {\n cb();\n } else if (res === false) {\n cb(rule.message || rule.field + \" fails\");\n } else if (res instanceof Array) {\n cb(res);\n } else if (res instanceof Error) {\n cb(res.message);\n }\n }\n if (res && res.then) {\n res.then(function () {\n return cb();\n }, function (e) {\n return cb(e);\n });\n }\n }, function (results) {\n complete(results);\n });\n },\n getType: function getType(rule) {\n if (rule.type === undefined && rule.pattern instanceof RegExp) {\n rule.type = 'pattern';\n }\n if (typeof rule.validator !== 'function' && rule.type && !validators.hasOwnProperty(rule.type)) {\n throw new Error(format('Unknown rule type %s', rule.type));\n }\n return rule.type || 'string';\n },\n getValidationMethod: function getValidationMethod(rule) {\n if (typeof rule.validator === 'function') {\n return rule.validator;\n }\n var keys = Object.keys(rule);\n var messageIndex = keys.indexOf('message');\n if (messageIndex !== -1) {\n keys.splice(messageIndex, 1);\n }\n if (keys.length === 1 && keys[0] === 'required') {\n return validators.required;\n }\n return validators[this.getType(rule)] || false;\n }\n};\nSchema.register = function register(type, validator) {\n if (typeof validator !== 'function') {\n throw new Error('Cannot register a validator by type, validator is not a function');\n }\n validators[type] = validator;\n};\nSchema.warning = warning;\nSchema.messages = messages;\nvar _default = Schema;\nexports.default = _default;\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../../../HBuider软件/HBuilderX/HBuilderX/plugins/uniapp-cli/node_modules/node-libs-browser/mock/process.js */ 1448), __webpack_require__(/*! ./node_modules/@dcloudio/vue-cli-plugin-uni/lib/format-log.js */ 1)[\"default\"]))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInVuaS1hcHA6Ly8vdXZpZXctdWkvbGlicy91dGlsL2FzeW5jLXZhbGlkYXRvci5qcyJdLCJuYW1lcyI6WyJfZXh0ZW5kcyIsIk9iamVjdCIsImFzc2lnbiIsInRhcmdldCIsImkiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJzb3VyY2UiLCJrZXkiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJhcHBseSIsImZvcm1hdFJlZ0V4cCIsIndhcm5pbmciLCJwcm9jZXNzIiwid2luZG93IiwiZG9jdW1lbnQiLCJ0eXBlIiwiZXJyb3JzIiwiY29uc29sZSIsIndhcm4iLCJldmVyeSIsImUiLCJjb252ZXJ0RmllbGRzRXJyb3IiLCJmaWVsZHMiLCJmb3JFYWNoIiwiZXJyb3IiLCJmaWVsZCIsInB1c2giLCJmb3JtYXQiLCJfbGVuIiwiYXJncyIsIkFycmF5IiwiX2tleSIsImYiLCJsZW4iLCJzbGljZSIsInN0ciIsIlN0cmluZyIsInJlcGxhY2UiLCJ4IiwiTnVtYmVyIiwiSlNPTiIsInN0cmluZ2lmeSIsIl8iLCJhcmciLCJpc05hdGl2ZVN0cmluZ1R5cGUiLCJpc0VtcHR5VmFsdWUiLCJ2YWx1ZSIsInVuZGVmaW5lZCIsImlzQXJyYXkiLCJhc3luY1BhcmFsbGVsQXJyYXkiLCJhcnIiLCJmdW5jIiwiY2FsbGJhY2siLCJyZXN1bHRzIiwidG90YWwiLCJhcnJMZW5ndGgiLCJjb3VudCIsImEiLCJhc3luY1NlcmlhbEFycmF5IiwiaW5kZXgiLCJuZXh0Iiwib3JpZ2luYWwiLCJmbGF0dGVuT2JqQXJyIiwib2JqQXJyIiwicmV0Iiwia2V5cyIsImsiLCJhc3luY01hcCIsIm9wdGlvbiIsImZpcnN0IiwiX3BlbmRpbmciLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsImZsYXR0ZW5BcnIiLCJmaXJzdEZpZWxkcyIsIm9iakFycktleXMiLCJvYmpBcnJMZW5ndGgiLCJwZW5kaW5nIiwiaW5kZXhPZiIsImNvbXBsZW1lbnRFcnJvciIsInJ1bGUiLCJvZSIsIm1lc3NhZ2UiLCJmdWxsRmllbGQiLCJkZWVwTWVyZ2UiLCJzIiwicmVxdWlyZWQiLCJvcHRpb25zIiwibWVzc2FnZXMiLCJ3aGl0ZXNwYWNlIiwidGVzdCIsInBhdHRlcm4iLCJlbWFpbCIsInVybCIsIlJlZ0V4cCIsImhleCIsInR5cGVzIiwiaW50ZWdlciIsIm51bWJlciIsInBhcnNlSW50IiwiZmxvYXQiLCJhcnJheSIsInJlZ2V4cCIsImRhdGUiLCJnZXRUaW1lIiwiZ2V0TW9udGgiLCJnZXRZZWFyIiwiaXNOYU4iLCJvYmplY3QiLCJtZXRob2QiLCJtYXRjaCIsImN1c3RvbSIsInJ1bGVUeXBlIiwicmFuZ2UiLCJtaW4iLCJtYXgiLCJzcFJlZ2V4cCIsInZhbCIsIm51bSIsIkVOVU0iLCJlbnVtZXJhYmxlIiwiam9pbiIsInBhdHRlcm4kMSIsImxhc3RJbmRleCIsIm1pc21hdGNoIiwiX3BhdHRlcm4iLCJydWxlcyIsInN0cmluZyIsInZhbGlkYXRlIiwiX2Jvb2xlYW4iLCJmbG9hdEZuIiwiRU5VTSQxIiwiZW51bWVyYWJsZSQxIiwicGF0dGVybiQyIiwiZGF0ZU9iamVjdCIsIkRhdGUiLCJyZXF1aXJlZCQxIiwidHlwZSQxIiwiYW55IiwidmFsaWRhdG9ycyIsIm5ld01lc3NhZ2VzIiwicGFyc2UiLCJpbnZhbGlkIiwiY2xvbmUiLCJjbG9uZWQiLCJTY2hlbWEiLCJkZXNjcmlwdG9yIiwiX21lc3NhZ2VzIiwiZGVmaW5lIiwiRXJyb3IiLCJ6IiwiaXRlbSIsInNvdXJjZV8iLCJvIiwib2MiLCJfdGhpcyIsImNvbXBsZXRlIiwiYWRkIiwiX2Vycm9ycyIsImNvbmNhdCIsIm1lc3NhZ2VzJDEiLCJzZXJpZXMiLCJyIiwidHJhbnNmb3JtIiwidmFsaWRhdG9yIiwiZ2V0VmFsaWRhdGlvbk1ldGhvZCIsImdldFR5cGUiLCJlcnJvckZpZWxkcyIsImRhdGEiLCJkb0l0IiwiZGVlcCIsImRlZmF1bHRGaWVsZCIsImFkZEZ1bGxmaWVsZCIsInNjaGVtYSIsImNiIiwic3VwcHJlc3NXYXJuaW5nIiwibWFwIiwiZmllbGRzU2NoZW1hIiwiZmllbGRTY2hlbWEiLCJiaW5kIiwiZXJycyIsImZpbmFsRXJyb3JzIiwicmVzIiwiYXN5bmNWYWxpZGF0b3IiLCJ0aGVuIiwibWVzc2FnZUluZGV4Iiwic3BsaWNlIiwicmVnaXN0ZXIiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUEsU0FBU0EsUUFBUSxHQUFHO0VBQ25CQSxRQUFRLEdBQUdDLE1BQU0sQ0FBQ0MsTUFBTSxJQUFJLFVBQVNDLE1BQU0sRUFBRTtJQUM1QyxLQUFLLElBQUlDLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsR0FBR0MsU0FBUyxDQUFDQyxNQUFNLEVBQUVGLENBQUMsRUFBRSxFQUFFO01BQzFDLElBQUlHLE1BQU0sR0FBR0YsU0FBUyxDQUFDRCxDQUFDLENBQUM7TUFFekIsS0FBSyxJQUFJSSxHQUFHLElBQUlELE1BQU0sRUFBRTtRQUN2QixJQUFJTixNQUFNLENBQUNRLFNBQVMsQ0FBQ0MsY0FBYyxDQUFDQyxJQUFJLENBQUNKLE1BQU0sRUFBRUMsR0FBRyxDQUFDLEVBQUU7VUFDdERMLE1BQU0sQ0FBQ0ssR0FBRyxDQUFDLEdBQUdELE1BQU0sQ0FBQ0MsR0FBRyxDQUFDO1FBQzFCO01BQ0Q7SUFDRDtJQUVBLE9BQU9MLE1BQU07RUFDZCxDQUFDO0VBRUQsT0FBT0gsUUFBUSxDQUFDWSxLQUFLLENBQUMsSUFBSSxFQUFFUCxTQUFTLENBQUM7QUFDdkM7O0FBRUE7QUFDQSxJQUFJUSxZQUFZLEdBQUcsVUFBVTtBQUM3QixJQUFJQyxPQUFPLEdBQUcsU0FBU0EsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7O0FBRXJDLElBQUksT0FBT0MsT0FBTyxLQUFLLFdBQVcsSUFBSUEsaUlBQVcsSUFBSUEsYUFBb0IsS0FBSyxZQUFZLElBQUksT0FBT0MsTUFBTSxLQUMxRyxXQUFXLElBQUksT0FBT0MsUUFBUSxLQUFLLFdBQVcsRUFBRTtFQUNoREgsT0FBTyxHQUFHLFNBQVNBLE9BQU8sQ0FBQ0ksSUFBSSxFQUFFQyxNQUFN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QUFDRCxZQUFZLEVBQUUsQ0FBQyxDQUFDO0lBQzdCO0lBRUEsSUFBSXpILElBQUksQ0FBQzlELE1BQU0sS0FBSyxDQUFDLElBQUk4RCxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssVUFBVSxFQUFFO01BQ2hELE9BQU8yRSxVQUFVLENBQUNyRCxRQUFRO0lBQzNCO0lBRUEsT0FBT3FELFVBQVUsQ0FBQyxJQUFJLENBQUMyQixPQUFPLENBQUN0RixJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUs7RUFDL0M7QUFDRCxDQUFDO0FBRURpRSxNQUFNLENBQUMwQyxRQUFRLEdBQUcsU0FBU0EsUUFBUSxDQUFDN0ssSUFBSSxFQUFFc0osU0FBUyxFQUFFO0VBQ3BELElBQUksT0FBT0EsU0FBUyxLQUFLLFVBQVUsRUFBRTtJQUNwQyxNQUFNLElBQUlmLEtBQUssQ0FBQyxrRUFBa0UsQ0FBQztFQUNwRjtFQUVBVixVQUFVLENBQUM3SCxJQUFJLENBQUMsR0FBR3NKLFNBQVM7QUFDN0IsQ0FBQztBQUVEbkIsTUFBTSxDQUFDdkksT0FBTyxHQUFHQSxPQUFPO0FBQ3hCdUksTUFBTSxDQUFDekQsUUFBUSxHQUFHQSxRQUFRO0FBQUMsZUFFWnlELE1BQU07QUFBQSwyQiIsImZpbGUiOiIxNDQ3LmpzIiwic291cmNlc0NvbnRlbnQiOlsiZnVuY3Rpb24gX2V4dGVuZHMoKSB7XHJcblx0X2V4dGVuZHMgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uKHRhcmdldCkge1xyXG5cdFx0Zm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0dmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTtcclxuXHJcblx0XHRcdGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHtcclxuXHRcdFx0XHRpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkge1xyXG5cdFx0XHRcdFx0dGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGFyZ2V0O1xyXG5cdH07XHJcblxyXG5cdHJldHVybiBfZXh0ZW5kcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xyXG59XHJcblxyXG4vKiBlc2xpbnQgbm8tY29uc29sZTowICovXHJcbnZhciBmb3JtYXRSZWdFeHAgPSAvJVtzZGolXS9nO1xyXG52YXIgd2FybmluZyA9IGZ1bmN0aW9uIHdhcm5pbmcoKSB7fTsgLy8gZG9uJ3QgcHJpbnQgd2FybmluZyBtZXNzYWdlIHdoZW4gaW4gcHJvZHVjdGlvbiBlbnYgb3Igbm9kZSBydW50aW1lXHJcblxyXG5pZiAodHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmIHByb2Nlc3MuZW52ICYmIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgdHlwZW9mIHdpbmRvdyAhPT1cclxuXHQndW5kZWZpbmVkJyAmJiB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnKSB7XHJcblx0d2FybmluZyA9IGZ1bmN0aW9uIHdhcm5pbmcodHlwZSwgZXJyb3JzKSB7XHJcblx0XHRpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnICYmIGNvbnNvbGUud2Fybikge1xyXG5cdFx0XHRpZiAoZXJyb3JzLmV2ZXJ5KGZ1bmN0aW9uKGUpIHtcclxuXHRcdFx0XHRcdHJldHVybiB0eXBlb2YgZSA9PT0gJ3N0cmluZyc7XHJcblx0XHRcdFx0fSkpIHtcclxuXHRcdFx0XHRjb25zb2xlLndhcm4odHlwZSwgZXJyb3JzKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH07XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNvbnZlcnRGaWVsZHNFcnJvcihlcnJvcnMpIHtcclxuXHRpZiAoIWVycm9ycyB8fCAhZXJyb3JzLmxlbmd0aCkgcmV0dXJuIG51bGw7XHJcblx0dmFyIGZpZWxkcyA9IHt9O1xyXG5cdGVycm9ycy5mb3JFYWNoKGZ1bmN0aW9uKGVycm9yKSB7XHJcblx0XHR2YXIgZmllbGQgPSBlcnJvci5maWVsZDtcclxuXHRcdGZpZWxkc1tmaWVsZF0gPSBmaWVsZHNbZmllbGRdIHx8IFtdO1xyXG5cdFx0ZmllbGRzW2ZpZWxkXS5wdXNoKGVycm9yKTtcclxuXHR9KTtcclxuXHRyZXR1cm4gZmllbGRzO1xyXG59XHJcblxyXG5mdW5jdGlvbiBmb3JtYXQoKSB7XHJcblx0Zm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XHJcblx0XHRhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xyXG5cdH1cclxuXHJcblx0dmFyIGkgPSAxO1xyXG5cdHZhciBmID0gYXJnc1swXTtcclxuXHR2YXIgbGVuID0gYXJncy5sZW5ndGg7XHJcblxyXG5cdGlmICh0eXBlb2YgZiA9PT0gJ2Z1bmN0aW9uJykge1xyXG5cdFx0cmV0dXJuIGYuYXBwbHkobnVsbCwgYXJncy5zbGljZSgxKSk7XHJcblx0fVxyXG5cclxuXHRpZiAodHlwZW9mIGYgPT09ICdzdHJpbmcnKSB7XHJcblx0XHR2YXIgc3RyID0gU3RyaW5nKGYpLnJlcGxhY2UoZm9ybWF0UmVnRXhwLCBmdW5jdGlvbih4KSB7XHJcblx0XHRcdGlmICh4ID09PSAnJSUnKSB7XHJcblx0XHRcdFx0cmV0dXJuICclJztcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKGkgPj0gbGVuKSB7XHJcblx0XHRcdFx0cmV0dXJuIHg7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHN3aXRjaCAoeCkge1xyXG5cdFx0XHRcdGNhc2UgJyVzJzpcclxuXHRcdFx0XHRcdHJldHVybiBTdHJpbmcoYXJnc1tpKytdKTtcclxuXHJcblx0XHRcdFx0Y2FzZSAnJWQnOlxyXG5cdFx0XHRcdFx0cmV0dXJuIE51bWJlcihhcmdzW2krK10pO1xyXG5cclxuXHRcdFx0XHRjYXNlICclaic6XHJcblx0XHRcdFx0XHR0cnkge1xyXG5cdFx0XHRcdFx0XHRyZXR1cm4gSlNPTi5zdHJpbmdpZnkoYXJnc1tpKytdKTtcclxuXHRcdFx0XHRcdH0gY2F0Y2ggKF8pIHtcclxuXHRcdFx0XHRcdFx0cmV0dXJuICdbQ2lyY3VsYXJdJztcclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0ZGVmYXVsdDpcclxuXHRcdFx0XHRcdHJldHVybiB4O1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHJcblx0XHRmb3IgKHZhciBhcmcgPSBhcmdzW2ldOyBpIDwgbGVuOyBhcmcgPSBhcmdzWysraV0pIHtcclxuXHRcdFx0c3RyICs9IFwiIFwiICsgYXJnO1xyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBzdHI7XHJcblx0fVxyXG5cclxuXHRyZXR1cm4gZjtcclxufVxyXG5cclxuZnVuY3Rpb24gaXNOYXRpdmVTdHJpbmdUeXBlKHR5cGUpIHtcclxuXHRyZXR1cm4gdHlwZSA9PT0gJ3N0cmluZycgfHwgdHlwZSA9PT0gJ3VybCcgfHwgdHlwZSA9PT0gJ2hleCcgfHwgdHlwZSA9PT0gJ2VtYWlsJyB8fCB0eXBlID09PSAncGF0dGVybic7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGlzRW1wdHlWYWx1ZSh2YWx1ZSwgdHlwZSkge1xyXG5cdGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsKSB7XHJcblx0XHRyZXR1cm4gdHJ1ZTtcclxuXHR9XHJcblxyXG5cdGlmICh0eXBlID09PSAnYXJyYXknICYmIEFycmF5LmlzQXJyYXkodmFsdWUpICYmICF2YWx1ZS5sZW5ndGgpIHtcclxuXHRcdHJldHVybiB0cnVlO1xyXG5cdH1cclxuXHJcblx0aWYgKGlzTmF0aXZlU3RyaW5nVHlwZSh0eXBlKSAmJiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmICF2YWx1ZSkge1xyXG5cdFx0cmV0dXJuIHRydWU7XHJcblx0fVxyXG5cclxuXHRyZXR1cm4gZmFsc2U7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGFzeW5jUGFyYWxsZWxBcnJheShhcnIsIGZ1bmMsIGNhbGxiYWNrKSB7XHJcblx0dmFyIHJlc3VsdHMgPSBbXTtcclxuXHR2YXIgdG90YWwgPSAwO1xyXG5cdHZhciBhcnJMZW5ndGggPSBhcnIubGVuZ3RoO1xyXG5cclxuXHRmdW5jdGlvbiBjb3VudChlcnJvcnMpIHtcclxuXHRcdHJlc3VsdHMucHVzaC5hcHBseShyZXN1bHRzLCBlcnJvcnMpO1xyXG5cdFx0dG90YWwrKztcclxuXHJcblx0XHRpZiAodG90YWwgPT09IGFyckxlbmd0aCkge1xyXG5cdFx0XHRjYWxsYmFjayhyZXN1bHRzKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdGFyci5mb3JFYWNoKGZ1bmN0aW9uKGEpIHtcclxuXHRcdGZ1bmMoYSwgY291bnQpO1xyXG5cdH0pO1xyXG59XHJcblxyXG5mdW5jdGlvbiBhc3luY1NlcmlhbEFycmF5KGFyciwgZnVuYywgY2FsbGJhY2spIHtcclxuXHR2YXIgaW5kZXggPSAwO1xyXG5cdHZhciBhcnJMZW5ndGggPSBhcnIubGVuZ3RoO1xyXG5cclxuXHRmdW5jdGlvbiBuZXh0KGVycm9ycykge1xyXG5cdFx0aWYgKGVycm9ycyAmJiBlcnJvcnMubGVuZ3RoKSB7XHJcblx0XHRcdGNhbGxiYWNrKGVycm9ycyk7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHJcblx0XHR2YXIgb3JpZ2luYWwgPSBpbmRleDtcclxuXHRcdGluZGV4ID0gaW5kZXggKyAxO1xyXG5cclxuXHRcdGlmIChvcmlnaW5hbCA8IGFyckxlbmd0aCkge1xyXG5cdFx0XHRmdW5jKGFycltvcmlnaW5hbF0sIG5leHQpO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0Y2FsbGJhY2soW10pO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0bmV4dChbXSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGZsYXR0ZW5PYmpBcnIob2JqQXJyKSB7XHJcblx0dmFyIHJldCA9IFtdO1xyXG5cdE9iamVjdC5rZXlzKG9iakFycikuZm9yRWFjaChmdW5jdGlvbihrKSB7XHJcblx0XHRyZXQucHVzaC5hcHBseShyZXQsIG9iakFycltrXSk7XHJcblx0fSk7XHJcblx0cmV0dXJuIHJldDtcclxufVxyXG5cclxuZnVuY3Rpb24gYXN5bmNNYXAob2JqQXJyLCBvcHRpb24sIGZ1bmMsIGNhbGxiYWNrKSB7XHJcblx0aWYgKG9wdGlvbi5maXJzdCkge1xyXG5cdFx0dmFyIF9wZW5kaW5nID0gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XHJcblx0XHRcdHZhciBuZXh0ID0gZnVuY3Rpb24gbmV4dChlcnJvcnMpIHtcclxuXHRcdFx0XHRjYWxsYmFjayhlcnJvcnMpO1xyXG5cdFx0XHRcdHJldHVybiBlcnJvcnMubGVuZ3RoID8gcmVqZWN0KHtcclxuXHRcdFx0XHRcdGVycm9yczogZXJyb3JzLFxyXG5cdFx0XHRcdFx0ZmllbGRzOiBjb252ZXJ0RmllbGRzRXJyb3IoZXJyb3JzKVxyXG5cdFx0XHRcdH0pIDogcmVzb2x2ZSgpO1xyXG5cdFx0XHR9O1xyXG5cclxuXHRcdFx0dmFyIGZsYXR0ZW5BcnIgPSBmbGF0dGVuT2JqQXJyKG9iakFycik7XHJcblx0XHRcdGFzeW5jU2VyaWFsQXJyYXkoZmxhdHRlbkFyciwgZnVuYywgbmV4dCk7XHJcblx0XHR9KTtcclxuXHJcblx0XHRfcGVuZGluZ1tcImNhdGNoXCJdKGZ1bmN0aW9uKGUpIHtcclxuXHRcdFx0cmV0dXJuIGU7XHJcblx0XHR9KTtcclxuXHJcblx0XHRyZXR1cm4gX3BlbmRpbmc7XHJcblx0fVxyXG5cclxuXHR2YXIgZmlyc3RGaWVsZHMgPSBvcHRpb24uZmlyc3RGaWVsZHMgfHwgW107XHJcblxyXG5cdGlmIChmaXJzdEZpZWxkcyA9PT0gdHJ1ZSkge1xyXG5cdFx0Zmlyc3RGaWVsZHMgPSBPYmplY3Qua2V5cyhvYmpBcnIpO1xyXG5cdH1cclxuXHJcblx0dmFyIG9iakFycktleXMgPSBPYmplY3Qua2V5cyhvYmpBcnIpO1xyXG5cdHZhciBvYmpBcnJMZW5ndGggPSBvYmpBcnJLZXlzLmxlbmd0aDtcclxuXHR2YXIgdG90YWwgPSAwO1xyXG5cdHZhciByZXN1bHRzID0gW107XHJcblx0dmFyIHBlbmRpbmcgPSBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcclxuXHRcdHZhciBuZXh0ID0gZnVuY3Rpb24gbmV4dChlcnJvcnMpIHtcclxuXHRcdFx0cmVzdWx0cy5wdXNoLmFwcGx5KHJlc3VsdHMsIGVycm9ycyk7XHJcblx0XHRcdHRvdGFsKys7XHJcblxyXG5cdFx0XHRpZiAodG90YWwgPT09IG9iakFyckxlbmd0aCkge1xyXG5cdFx0XHRcdGNhbGxiYWNrKHJlc3VsdHMpO1xyXG5cdFx0XHRcdHJldHVybiByZXN1bHRzLmxlbmd0aCA/IHJlamVjdCh7XHJcblx0XHRcdFx0XHRlcnJvcnM6IHJlc3VsdHMsXHJcblx0XHRcdFx0XHRmaWVsZHM6IGNvbnZlcnRGaWVsZHNFcnJvcihyZXN1bHRzKVxyXG5cdFx0XHRcdH0pIDogcmVzb2x2ZSgpO1xyXG5cdFx0XHR9XHJcblx0XHR9O1xyXG5cclxuXHRcdGlmICghb2JqQXJyS2V5cy5sZW5ndGgpIHtcclxuXHRcdFx0Y2FsbGJhY2socmVzdWx0cyk7XHJcblx0XHRcdHJlc29sdmUoKTtcclxuXHRcdH1cclxuXHJcblx0XHRvYmpBcnJLZXlzLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XHJcblx0XHRcdHZhciBhcnIgPSBvYmpBcnJba2V5XTtcclxuXHJcblx0XHRcdGlmIChmaXJzdEZpZWxkcy5pbmRleE9mKGtleSkgIT09IC0xKSB7XHJcblx0XHRcdFx0YXN5bmNTZXJpYWxBcnJheShhcnIsIGZ1bmMsIG5leHQpO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdGFzeW5jUGFyYWxsZWxBcnJheShhcnIsIGZ1bmMsIG5leHQpO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHR9KTtcclxuXHRwZW5kaW5nW1wiY2F0Y2hcIl0oZnVuY3Rpb24oZSkge1xyXG5cdFx0cmV0dXJuIGU7XHJcblx0fSk7XHJcblx0cmV0dXJuIHBlbmRpbmc7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNvbXBsZW1lbnRFcnJvcihydWxlKSB7XHJcblx0cmV0dXJuIGZ1bmN0aW9uKG9lKSB7XHJcblx0XHRpZiAob2UgJiYgb2UubWVzc2FnZSkge1xyXG5cdFx0XHRvZS5maWVsZCA9IG9lLmZpZWxkIHx8IHJ1bGUuZnVsbEZpZWxkO1xyXG5cdFx0XHRyZXR1cm4gb2U7XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHtcclxuXHRcdFx0bWVzc2FnZTogdHlwZW9mIG9lID09PSAnZnVuY3Rpb24nID8gb2UoKSA6IG9lLFxyXG5cdFx0XHRmaWVsZDogb2UuZmllbGQgfHwgcnVsZS5mdWxsRmllbGRcclxuXHRcdH07XHJcblx0fTtcclxufVxyXG5cclxuZnVuY3Rpb24gZGVlcE1lcmdlKHRhcmdldCwgc291cmNlKSB7XHJcblx0aWYgKHNvdXJjZSkge1xyXG5cdFx0Zm9yICh2YXIgcyBpbiBzb3VyY2UpIHtcclxuXHRcdFx0aWYgKHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShzKSkge1xyXG5cdFx0XHRcdHZhciB2YWx1ZSA9IHNvdXJjZVtzXTtcclxuXHJcblx0XHRcdFx0aWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIHRhcmdldFtzXSA9PT0gJ29iamVjdCcpIHtcclxuXHRcdFx0XHRcdHRhcmdldFtzXSA9IF9leHRlbmRzKHt9LCB0YXJnZXRbc10sIHt9LCB2YWx1ZSk7XHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdHRhcmdldFtzXSA9IHZhbHVlO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0cmV0dXJuIHRhcmdldDtcclxufVxyXG5cclxuLyoqXHJcbiAqICBSdWxlIGZvciB2YWxpZGF0aW5nIHJlcXVpcmVkIGZpZWxkcy5cclxuICpcclxuICogIEBwYXJhbSBydWxlIFRoZSB2YWxpZGF0aW9uIHJ1bGUuXHJcbiAqICBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBvbiB0aGUgc291cmNlIG9iamVjdC5cclxuICogIEBwYXJhbSBzb3VyY2UgVGhlIHNvdXJjZSBvYmplY3QgYmVpbmcgdmFsaWRhdGVkLlxyXG4gKiAgQHBhcmFtIGVycm9ycyBBbiBhcnJheSBvZiBlcnJvcnMgdGhhdCB0aGlzIHJ1bGUgbWF5IGFkZFxyXG4gKiAgdmFsaWRhdGlvbiBlcnJvcnMgdG8uXHJcbiAqICBAcGFyYW0gb3B0aW9ucyBUaGUgdmFsaWRhdGlvbiBvcHRpb25zLlxyXG4gKiAgQHBhcmFtIG9wdGlvbnMubWVzc2FnZXMgVGhlIHZhbGlkYXRpb24gbWVzc2FnZXMuXHJcbiAqL1xyXG5cclxuZnVuY3Rpb24gcmVxdWlyZWQocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zLCB0eXBlKSB7XHJcblx0aWYgKHJ1bGUucmVxdWlyZWQgJiYgKCFzb3VyY2UuaGFzT3duUHJvcGVydHkocnVsZS5maWVsZCkgfHwgaXNFbXB0eVZhbHVlKHZhbHVlLCB0eXBlIHx8IHJ1bGUudHlwZSkpKSB7XHJcblx0XHRlcnJvcnMucHVzaChmb3JtYXQob3B0aW9ucy5tZXNzYWdlcy5yZXF1aXJlZCwgcnVsZS5mdWxsRmllbGQpKTtcclxuXHR9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiAgUnVsZSBmb3IgdmFsaWRhdGluZyB3aGl0ZXNwYWNlLlxyXG4gKlxyXG4gKiAgQHBhcmFtIHJ1bGUgVGhlIHZhbGlkYXRpb24gcnVsZS5cclxuICogIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIGZpZWxkIG9uIHRoZSBzb3VyY2Ugb2JqZWN0LlxyXG4gKiAgQHBhcmFtIHNvdXJjZSBUaGUgc291cmNlIG9iamVjdCBiZWluZyB2YWxpZGF0ZWQuXHJcbiAqICBAcGFyYW0gZXJyb3JzIEFuIGFycmF5IG9mIGVycm9ycyB0aGF0IHRoaXMgcnVsZSBtYXkgYWRkXHJcbiAqICB2YWxpZGF0aW9uIGVycm9ycyB0by5cclxuICogIEBwYXJhbSBvcHRpb25zIFRoZSB2YWxpZGF0aW9uIG9wdGlvbnMuXHJcbiAqICBAcGFyYW0gb3B0aW9ucy5tZXNzYWdlcyBUaGUgdmFsaWRhdGlvbiBtZXNzYWdlcy5cclxuICovXHJcblxyXG5mdW5jdGlvbiB3aGl0ZXNwYWNlKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucykge1xyXG5cdGlmICgvXlxccyskLy50ZXN0KHZhbHVlKSB8fCB2YWx1ZSA9PT0gJycpIHtcclxuXHRcdGVycm9ycy5wdXNoKGZvcm1hdChvcHRpb25zLm1lc3NhZ2VzLndoaXRlc3BhY2UsIHJ1bGUuZnVsbEZpZWxkKSk7XHJcblx0fVxyXG59XHJcblxyXG4vKiBlc2xpbnQgbWF4LWxlbjowICovXHJcblxyXG52YXIgcGF0dGVybiA9IHtcclxuXHQvLyBodHRwOi8vZW1haWxyZWdleC5jb20vXHJcblx0ZW1haWw6IC9eKChbXjw+KClcXFtcXF1cXFxcLiw7Olxcc0BcIl0rKFxcLltePD4oKVxcW1xcXVxcXFwuLDs6XFxzQFwiXSspKil8KFwiLitcIikpQCgoXFxbWzAtOV17MSwzfVxcLlswLTldezEsM31cXC5bMC05XXsxLDN9XFwuWzAtOV17MSwzfV0pfCgoW2EtekEtWlxcLTAtOV0rXFwuKStbYS16QS1aXXsyLH0pKSQvLFxyXG5cdHVybDogbmV3IFJlZ0V4cChcclxuXHRcdFwiXig/IW1haWx0bzopKD86KD86aHR0cHxodHRwc3xmdHApOi8vfC8vKSg/OlxcXFxTKyg/OjpcXFxcUyopP0ApPyg/Oig/Oig/OlsxLTldXFxcXGQ/fDFcXFxcZFxcXFxkfDJbMDFdXFxcXGR8MjJbMC0zXSkoPzpcXFxcLig/OjE/XFxcXGR7MSwyfXwyWzAtNF1cXFxcZHwyNVswLTVdKSl7Mn0oPzpcXFxcLig/OlswLTldXFxcXGQ/fDFcXFxcZFxcXFxkfDJbMC00XVxcXFxkfDI1WzAtNF0pKXwoPzooPzpbYS16XFxcXHUwMGExLVxcXFx1ZmZmZjAtOV0rLSopKlthLXpcXFxcdTAwYTEtXFxcXHVmZmZmMC05XSspKD86XFxcXC4oPzpbYS16XFxcXHUwMGExLVxcXFx1ZmZmZjAtOV0rLSopKlthLXpcXFxcdTAwYTEtXFxcXHVmZmZmMC05XSspKig/OlxcXFwuKD86W2EtelxcXFx1MDBhMS1cXFxcdWZmZmZdezIsfSkpKXxsb2NhbGhvc3QpKD86OlxcXFxkezIsNX0pPyg/OigvfFxcXFw/fCMpW15cXFxcc10qKT8kXCIsXHJcblx0XHQnaScpLFxyXG5cdGhleDogL14jPyhbYS1mMC05XXs2fXxbYS1mMC05XXszfSkkL2lcclxufTtcclxudmFyIHR5cGVzID0ge1xyXG5cdGludGVnZXI6IGZ1bmN0aW9uIGludGVnZXIodmFsdWUpIHtcclxuXHRcdHJldHVybiB0eXBlcy5udW1iZXIodmFsdWUpICYmIHBhcnNlSW50KHZhbHVlLCAxMCkgPT09IHZhbHVlO1xyXG5cdH0sXHJcblx0XCJmbG9hdFwiOiBmdW5jdGlvbiBmbG9hdCh2YWx1ZSkge1xyXG5cdFx0cmV0dXJuIHR5cGVzLm51bWJlcih2YWx1ZSkgJiYgIXR5cGVzLmludGVnZXIodmFsdWUpO1xyXG5cdH0sXHJcblx0YXJyYXk6IGZ1bmN0aW9uIGFycmF5KHZhbHVlKSB7XHJcblx0XHRyZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSk7XHJcblx0fSxcclxuXHRyZWdleHA6IGZ1bmN0aW9uIHJlZ2V4cCh2YWx1ZSkge1xyXG5cdFx0aWYgKHZhbHVlIGluc3RhbmNlb2YgUmVnRXhwKSB7XHJcblx0XHRcdHJldHVybiB0cnVlO1xyXG5cdFx0fVxyXG5cclxuXHRcdHRyeSB7XHJcblx0XHRcdHJldHVybiAhIW5ldyBSZWdFeHAodmFsdWUpO1xyXG5cdFx0fSBjYXRjaCAoZSkge1xyXG5cdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHR9XHJcblx0fSxcclxuXHRkYXRlOiBmdW5jdGlvbiBkYXRlKHZhbHVlKSB7XHJcblx0XHRyZXR1cm4gdHlwZW9mIHZhbHVlLmdldFRpbWUgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIHZhbHVlLmdldE1vbnRoID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiB2YWx1ZS5nZXRZZWFyID09PVxyXG5cdFx0XHQnZnVuY3Rpb24nO1xyXG5cdH0sXHJcblx0bnVtYmVyOiBmdW5jdGlvbiBudW1iZXIodmFsdWUpIHtcclxuXHRcdGlmIChpc05hTih2YWx1ZSkpIHtcclxuXHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIOS/ruaUuea6kOegge+8jOWwhuWtl+espuS4suaVsOWAvOWFiOi9rOS4uuaVsOWAvFxyXG5cdFx0cmV0dXJuIHR5cGVvZiArdmFsdWUgPT09ICdudW1iZXInO1xyXG5cdH0sXHJcblx0b2JqZWN0OiBmdW5jdGlvbiBvYmplY3QodmFsdWUpIHtcclxuXHRcdHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmICF0eXBlcy5hcnJheSh2YWx1ZSk7XHJcblx0fSxcclxuXHRtZXRob2Q6IGZ1bmN0aW9uIG1ldGhvZCh2YWx1ZSkge1xyXG5cdFx0cmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJztcclxuXHR9LFxyXG5cdGVtYWlsOiBmdW5jdGlvbiBlbWFpbCh2YWx1ZSkge1xyXG5cdFx0cmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgISF2YWx1ZS5tYXRjaChwYXR0ZXJuLmVtYWlsKSAmJiB2YWx1ZS5sZW5ndGggPCAyNTU7XHJcblx0fSxcclxuXHR1cmw6IGZ1bmN0aW9uIHVybCh2YWx1ZSkge1xyXG5cdFx0cmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgISF2YWx1ZS5tYXRjaChwYXR0ZXJuLnVybCk7XHJcblx0fSxcclxuXHRoZXg6IGZ1bmN0aW9uIGhleCh2YWx1ZSkge1xyXG5cdFx0cmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgISF2YWx1ZS5tYXRjaChwYXR0ZXJuLmhleCk7XHJcblx0fVxyXG59O1xyXG4vKipcclxuICogIFJ1bGUgZm9yIHZhbGlkYXRpbmcgdGhlIHR5cGUgb2YgYSB2YWx1ZS5cclxuICpcclxuICogIEBwYXJhbSBydWxlIFRoZSB2YWxpZGF0aW9uIHJ1bGUuXHJcbiAqICBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBvbiB0aGUgc291cmNlIG9iamVjdC5cclxuICogIEBwYXJhbSBzb3VyY2UgVGhlIHNvdXJjZSBvYmplY3QgYmVpbmcgdmFsaWRhdGVkLlxyXG4gKiAgQHBhcmFtIGVycm9ycyBBbiBhcnJheSBvZiBlcnJvcnMgdGhhdCB0aGlzIHJ1bGUgbWF5IGFkZFxyXG4gKiAgdmFsaWRhdGlvbiBlcnJvcnMgdG8uXHJcbiAqICBAcGFyYW0gb3B0aW9ucyBUaGUgdmFsaWRhdGlvbiBvcHRpb25zLlxyXG4gKiAgQHBhcmFtIG9wdGlvbnMubWVzc2FnZXMgVGhlIHZhbGlkYXRpb24gbWVzc2FnZXMuXHJcbiAqL1xyXG5cclxuZnVuY3Rpb24gdHlwZShydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpIHtcclxuXHRpZiAocnVsZS5yZXF1aXJlZCAmJiB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XHJcblx0XHRyZXF1aXJlZChydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xyXG5cdFx0cmV0dXJuO1xyXG5cdH1cclxuXHJcblx0dmFyIGN1c3RvbSA9IFsnaW50ZWdlcicsICdmbG9hdCcsICdhcnJheScsICdyZWdleHAnLCAnb2JqZWN0JywgJ21ldGhvZCcsICdlbWFpbCcsICdudW1iZXInLCAnZGF0ZScsICd1cmwnLCAnaGV4J107XHJcblx0dmFyIHJ1bGVUeXBlID0gcnVsZS50eXBlO1xyXG5cclxuXHRpZiAoY3VzdG9tLmluZGV4T2YocnVsZVR5cGUpID4gLTEpIHtcclxuXHRcdGlmICghdHlwZXNbcnVsZVR5cGVdKHZhbHVlKSkge1xyXG5cdFx0XHRlcnJvcnMucHVzaChmb3JtYXQob3B0aW9ucy5tZXNzYWdlcy50eXBlc1tydWxlVHlwZV0sIHJ1bGUuZnVsbEZpZWxkLCBydWxlLnR5cGUpKTtcclxuXHRcdH0gLy8gc3RyYWlnaHQgdHlwZW9mIGNoZWNrXHJcblxyXG5cdH0gZWxzZSBpZiAocnVsZVR5cGUgJiYgdHlwZW9mIHZhbHVlICE9PSBydWxlLnR5cGUpIHtcclxuXHRcdGVycm9ycy5wdXNoKGZvcm1hdChvcHRpb25zLm1lc3NhZ2VzLnR5cGVzW3J1bGVUeXBlXSwgcnVsZS5mdWxsRmllbGQsIHJ1bGUudHlwZSkpO1xyXG5cdH1cclxufVxyXG5cclxuLyoqXHJcbiAqICBSdWxlIGZvciB2YWxpZGF0aW5nIG1pbmltdW0gYW5kIG1heGltdW0gYWxsb3dlZCB2YWx1ZXMuXHJcbiAqXHJcbiAqICBAcGFyYW0gcnVsZSBUaGUgdmFsaWRhdGlvbiBydWxlLlxyXG4gKiAgQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgb24gdGhlIHNvdXJjZSBvYmplY3QuXHJcbiAqICBAcGFyYW0gc291cmNlIFRoZSBzb3VyY2Ugb2JqZWN0IGJlaW5nIHZhbGlkYXRlZC5cclxuICogIEBwYXJhbSBlcnJvcnMgQW4gYXJyYXkgb2YgZXJyb3JzIHRoYXQgdGhpcyBydWxlIG1heSBhZGRcclxuICogIHZhbGlkYXRpb24gZXJyb3JzIHRvLlxyXG4gKiAgQHBhcmFtIG9wdGlvbnMgVGhlIHZhbGlkYXRpb24gb3B0aW9ucy5cclxuICogIEBwYXJhbSBvcHRpb25zLm1lc3NhZ2VzIFRoZSB2YWxpZGF0aW9uIG1lc3NhZ2VzLlxyXG4gKi9cclxuXHJcbmZ1bmN0aW9uIHJhbmdlKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucykge1xyXG5cdHZhciBsZW4gPSB0eXBlb2YgcnVsZS5sZW4gPT09ICdudW1iZXInO1xyXG5cdHZhciBtaW4gPSB0eXBlb2YgcnVsZS5taW4gPT09ICdudW1iZXInO1xyXG5cdHZhciBtYXggPSB0eXBlb2YgcnVsZS5tYXggPT09ICdudW1iZXInOyAvLyDmraPliJnljLnphY3noIHngrnojIPlm7Tku45VKzAxMDAwMOS4gOebtOWIsFUrMTBGRkZG55qE5paH5a2X77yI6KGl5YWF5bmz6Z2iU3VwcGxlbWVudGFyeSBQbGFuZe+8iVxyXG5cclxuXHR2YXIgc3BSZWdleHAgPSAvW1xcdUQ4MDAtXFx1REJGRl1bXFx1REMwMC1cXHVERkZGXS9nO1xyXG5cdHZhciB2YWwgPSB2YWx1ZTtcclxuXHR2YXIga2V5ID0gbnVsbDtcclxuXHR2YXIgbnVtID0gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJztcclxuXHR2YXIgc3RyID0gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJztcclxuXHR2YXIgYXJyID0gQXJyYXkuaXNBcnJheSh2YWx1ZSk7XHJcblxyXG5cdGlmIChudW0pIHtcclxuXHRcdGtleSA9ICdudW1iZXInO1xyXG5cdH0gZWxzZSBpZiAoc3RyKSB7XHJcblx0XHRrZXkgPSAnc3RyaW5nJztcclxuXHR9IGVsc2UgaWYgKGFycikge1xyXG5cdFx0a2V5ID0gJ2FycmF5JztcclxuXHR9IC8vIGlmIHRoZSB2YWx1ZSBpcyBub3Qgb2YgYSBzdXBwb3J0ZWQgdHlwZSBmb3IgcmFuZ2UgdmFsaWRhdGlvblxyXG5cdC8vIHRoZSB2YWxpZGF0aW9uIHJ1bGUgcnVsZSBzaG91bGQgdXNlIHRoZVxyXG5cdC8vIHR5cGUgcHJvcGVydHkgdG8gYWxzbyB0ZXN0IGZvciBhIHBhcnRpY3VsYXIgdHlwZVxyXG5cclxuXHJcblx0aWYgKCFrZXkpIHtcclxuXHRcdHJldHVybiBmYWxzZTtcclxuXHR9XHJcblxyXG5cdGlmIChhcnIpIHtcclxuXHRcdHZhbCA9IHZhbHVlLmxlbmd0aDtcclxuXHR9XHJcblxyXG5cdGlmIChzdHIpIHtcclxuXHRcdC8vIOWkhOeQhueggeeCueWkp+S6jlUrMDEwMDAw55qE5paH5a2XbGVuZ3Ro5bGe5oCn5LiN5YeG56Gu55qEYnVn77yM5aaCXCLwoK638KCut/CgrrdcIi5sZW5ndGggIT09IDNcclxuXHRcdHZhbCA9IHZhbHVlLnJlcGxhY2Uoc3BSZWdleHAsICdfJykubGVuZ3RoO1xyXG5cdH1cclxuXHJcblx0aWYgKGxlbikge1xyXG5cdFx0aWYgKHZhbCAhPT0gcnVsZS5sZW4pIHtcclxuXHRcdFx0ZXJyb3JzLnB1c2goZm9ybWF0KG9wdGlvbnMubWVzc2FnZXNba2V5XS5sZW4sIHJ1bGUuZnVsbEZpZWxkLCBydWxlLmxlbikpO1xyXG5cdFx0fVxyXG5cdH0gZWxzZSBpZiAobWluICYmICFtYXggJiYgdmFsIDwgcnVsZS5taW4pIHtcclxuXHRcdGVycm9ycy5wdXNoKGZvcm1hdChvcHRpb25zLm1lc3NhZ2VzW2tleV0ubWluLCBydWxlLmZ1bGxGaWVsZCwgcnVsZS5taW4pKTtcclxuXHR9IGVsc2UgaWYgKG1heCAmJiAhbWluICYmIHZhbCA+IHJ1bGUubWF4KSB7XHJcblx0XHRlcnJvcnMucHVzaChmb3JtYXQob3B0aW9ucy5tZXNzYWdlc1trZXldLm1heCwgcnVsZS5mdWxsRmllbGQsIHJ1bGUubWF4KSk7XHJcblx0fSBlbHNlIGlmIChtaW4gJiYgbWF4ICYmICh2YWwgPCBydWxlLm1pbiB8fCB2YWwgPiBydWxlLm1heCkpIHtcclxuXHRcdGVycm9ycy5wdXNoKGZvcm1hdChvcHRpb25zLm1lc3NhZ2VzW2tleV0ucmFuZ2UsIHJ1bGUuZnVsbEZpZWxkLCBydWxlLm1pbiwgcnVsZS5tYXgpKTtcclxuXHR9XHJcbn1cclxuXHJcbnZhciBFTlVNID0gJ2VudW0nO1xyXG4vKipcclxuICogIFJ1bGUgZm9yIHZhbGlkYXRpbmcgYSB2YWx1ZSBleGlzdHMgaW4gYW4gZW51bWVyYWJsZSBsaXN0LlxyXG4gKlxyXG4gKiAgQHBhcmFtIHJ1bGUgVGhlIHZhbGlkYXRpb24gcnVsZS5cclxuICogIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIGZpZWxkIG9uIHRoZSBzb3VyY2Ugb2JqZWN0LlxyXG4gKiAgQHBhcmFtIHNvdXJjZSBUaGUgc291cmNlIG9iamVjdCBiZWluZyB2YWxpZGF0ZWQuXHJcbiAqICBAcGFyYW0gZXJyb3JzIEFuIGFycmF5IG9mIGVycm9ycyB0aGF0IHRoaXMgcnVsZSBtYXkgYWRkXHJcbiAqICB2YWxpZGF0aW9uIGVycm9ycyB0by5cclxuICogIEBwYXJhbSBvcHRpb25zIFRoZSB2YWxpZGF0aW9uIG9wdGlvbnMuXHJcbiAqICBAcGFyYW0gb3B0aW9ucy5tZXNzYWdlcyBUaGUgdmFsaWRhdGlvbiBtZXNzYWdlcy5cclxuICovXHJcblxyXG5mdW5jdGlvbiBlbnVtZXJhYmxlKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucykge1xyXG5cdHJ1bGVbRU5VTV0gPSBBcnJheS5pc0FycmF5KHJ1bGVbRU5VTV0pID8gcnVsZVtFTlVNXSA6IFtdO1xyXG5cclxuXHRpZiAocnVsZVtFTlVNXS5pbmRleE9mKHZhbHVlKSA9PT0gLTEpIHtcclxuXHRcdGVycm9ycy5wdXNoKGZvcm1hdChvcHRpb25zLm1lc3NhZ2VzW0VOVU1dLCBydWxlLmZ1bGxGaWVsZCwgcnVsZVtFTlVNXS5qb2luKCcsICcpKSk7XHJcblx0fVxyXG59XHJcblxyXG4vKipcclxuICogIFJ1bGUgZm9yIHZhbGlkYXRpbmcgYSByZWd1bGFyIGV4cHJlc3Npb24gcGF0dGVybi5cclxuICpcclxuICogIEBwYXJhbSBydWxlIFRoZSB2YWxpZGF0aW9uIHJ1bGUuXHJcbiAqICBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBvbiB0aGUgc291cmNlIG9iamVjdC5cclxuICogIEBwYXJhbSBzb3VyY2UgVGhlIHNvdXJjZSBvYmplY3QgYmVpbmcgdmFsaWRhdGVkLlxyXG4gKiAgQHBhcmFtIGVycm9ycyBBbiBhcnJheSBvZiBlcnJvcnMgdGhhdCB0aGlzIHJ1bGUgbWF5IGFkZFxyXG4gKiAgdmFsaWRhdGlvbiBlcnJvcnMgdG8uXHJcbiAqICBAcGFyYW0gb3B0aW9ucyBUaGUgdmFsaWRhdGlvbiBvcHRpb25zLlxyXG4gKiAgQHBhcmFtIG9wdGlvbnMubWVzc2FnZXMgVGhlIHZhbGlkYXRpb24gbWVzc2FnZXMuXHJcbiAqL1xyXG5cclxuZnVuY3Rpb24gcGF0dGVybiQxKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucykge1xyXG5cdGlmIChydWxlLnBhdHRlcm4pIHtcclxuXHRcdGlmIChydWxlLnBhdHRlcm4gaW5zdGFuY2VvZiBSZWdFeHApIHtcclxuXHRcdFx0Ly8gaWYgYSBSZWdFeHAgaW5zdGFuY2UgaXMgcGFzc2VkLCByZXNldCBgbGFzdEluZGV4YCBpbiBjYXNlIGl0cyBgZ2xvYmFsYFxyXG5cdFx0XHQvLyBmbGFnIGlzIGFjY2lkZW50YWxseSBzZXQgdG8gYHRydWVgLCB3aGljaCBpbiBhIHZhbGlkYXRpb24gc2NlbmFyaW9cclxuXHRcdFx0Ly8gaXMgbm90IG5lY2Vzc2FyeSBhbmQgdGhlIHJlc3VsdCBtaWdodCBiZSBtaXNsZWFkaW5nXHJcblx0XHRcdHJ1bGUucGF0dGVybi5sYXN0SW5kZXggPSAwO1xyXG5cclxuXHRcdFx0aWYgKCFydWxlLnBhdHRlcm4udGVzdCh2YWx1ZSkpIHtcclxuXHRcdFx0XHRlcnJvcnMucHVzaChmb3JtYXQob3B0aW9ucy5tZXNzYWdlcy5wYXR0ZXJuLm1pc21hdGNoLCBydWxlLmZ1bGxGaWVsZCwgdmFsdWUsIHJ1bGUucGF0dGVybikpO1xyXG5cdFx0XHR9XHJcblx0XHR9IGVsc2UgaWYgKHR5cGVvZiBydWxlLnBhdHRlcm4gPT09ICdzdHJpbmcnKSB7XHJcblx0XHRcdHZhciBfcGF0dGVybiA9IG5ldyBSZWdFeHAocnVsZS5wYXR0ZXJuKTtcclxuXHJcblx0XHRcdGlmICghX3BhdHRlcm4udGVzdCh2YWx1ZSkpIHtcclxuXHRcdFx0XHRlcnJvcnMucHVzaChmb3JtYXQob3B0aW9ucy5tZXNzYWdlcy5wYXR0ZXJuLm1pc21hdGNoLCBydWxlLmZ1bGxGaWVsZCwgdmFsdWUsIHJ1bGUucGF0dGVybikpO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG59XHJcblxyXG52YXIgcnVsZXMgPSB7XHJcblx0cmVxdWlyZWQ6IHJlcXVpcmVkLFxyXG5cdHdoaXRlc3BhY2U6IHdoaXRlc3BhY2UsXHJcblx0dHlwZTogdHlwZSxcclxuXHRyYW5nZTogcmFuZ2UsXHJcblx0XCJlbnVtXCI6IGVudW1lcmFibGUsXHJcblx0cGF0dGVybjogcGF0dGVybiQxXHJcbn07XHJcblxyXG4vKipcclxuICogIFBlcmZvcm1zIHZhbGlkYXRpb24gZm9yIHN0cmluZyB0eXBlcy5cclxuICpcclxuICogIEBwYXJhbSBydWxlIFRoZSB2YWxpZGF0aW9uIHJ1bGUuXHJcbiAqICBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBvbiB0aGUgc291cmNlIG9iamVjdC5cclxuICogIEBwYXJhbSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgZnVuY3Rpb24uXHJcbiAqICBAcGFyYW0gc291cmNlIFRoZSBzb3VyY2Ugb2JqZWN0IGJlaW5nIHZhbGlkYXRlZC5cclxuICogIEBwYXJhbSBvcHRpb25zIFRoZSB2YWxpZGF0aW9uIG9wdGlvbnMuXHJcbiAqICBAcGFyYW0gb3B0aW9ucy5tZXNzYWdlcyBUaGUgdmFsaWRhdGlvbiBtZXNzYWdlcy5cclxuICovXHJcblxyXG5mdW5jdGlvbiBzdHJpbmcocnVsZSwgdmFsdWUsIGNhbGxiYWNrLCBzb3VyY2UsIG9wdGlvbnMpIHtcclxuXHR2YXIgZXJyb3JzID0gW107XHJcblx0dmFyIHZhbGlkYXRlID0gcnVsZS5yZXF1aXJlZCB8fCAhcnVsZS5yZXF1aXJlZCAmJiBzb3VyY2UuaGFzT3duUHJvcGVydHkocnVsZS5maWVsZCk7XHJcblxyXG5cdGlmICh2YWxpZGF0ZSkge1xyXG5cdFx0aWYgKGlzRW1wdHlWYWx1ZSh2YWx1ZSwgJ3N0cmluZycpICYmICFydWxlLnJlcXVpcmVkKSB7XHJcblx0XHRcdHJldHVybiBjYWxsYmFjaygpO1xyXG5cdFx0fVxyXG5cclxuXHRcdHJ1bGVzLnJlcXVpcmVkKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucywgJ3N0cmluZycpO1xyXG5cclxuXHRcdGlmICghaXNFbXB0eVZhbHVlKHZhbHVlLCAnc3RyaW5nJykpIHtcclxuXHRcdFx0cnVsZXMudHlwZShydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xyXG5cdFx0XHRydWxlcy5yYW5nZShydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xyXG5cdFx0XHRydWxlcy5wYXR0ZXJuKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XHJcblxyXG5cdFx0XHRpZiAocnVsZS53aGl0ZXNwYWNlID09PSB0cnVlKSB7XHJcblx0XHRcdFx0cnVsZXMud2hpdGVzcGFjZShydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRjYWxsYmFjayhlcnJvcnMpO1xyXG59XHJcblxyXG4vKipcclxuICogIFZhbGlkYXRlcyBhIGZ1bmN0aW9uLlxyXG4gKlxyXG4gKiAgQHBhcmFtIHJ1bGUgVGhlIHZhbGlkYXRpb24gcnVsZS5cclxuICogIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIGZpZWxkIG9uIHRoZSBzb3VyY2Ugb2JqZWN0LlxyXG4gKiAgQHBhcmFtIGNhbGxiYWNrIFRoZSBjYWxsYmFjayBmdW5jdGlvbi5cclxuICogIEBwYXJhbSBzb3VyY2UgVGhlIHNvdXJjZSBvYmplY3QgYmVpbmcgdmFsaWRhdGVkLlxyXG4gKiAgQHBhcmFtIG9wdGlvbnMgVGhlIHZhbGlkYXRpb24gb3B0aW9ucy5cclxuICogIEBwYXJhbSBvcHRpb25zLm1lc3NhZ2VzIFRoZSB2YWxpZGF0aW9uIG1lc3NhZ2VzLlxyXG4gKi9cclxuXHJcbmZ1bmN0aW9uIG1ldGhvZChydWxlLCB2YWx1ZSwgY2FsbGJhY2ssIHNvdXJjZSwgb3B0aW9ucykge1xyXG5cdHZhciBlcnJvcnMgPSBbXTtcclxuXHR2YXIgdmFsaWRhdGUgPSBydWxlLnJlcXVpcmVkIHx8ICFydWxlLnJlcXVpcmVkICYmIHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShydWxlLmZpZWxkKTtcclxuXHJcblx0aWYgKHZhbGlkYXRlKSB7XHJcblx0XHRpZiAoaXNFbXB0eVZhbHVlKHZhbHVlKSAmJiAhcnVsZS5yZXF1aXJlZCkge1xyXG5cdFx0XHRyZXR1cm4gY2FsbGJhY2soKTtcclxuXHRcdH1cclxuXHJcblx0XHRydWxlcy5yZXF1aXJlZChydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xyXG5cclxuXHRcdGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdHJ1bGVzLnR5cGUocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdGNhbGxiYWNrKGVycm9ycyk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiAgVmFsaWRhdGVzIGEgbnVtYmVyLlxyXG4gKlxyXG4gKiAgQHBhcmFtIHJ1bGUgVGhlIHZhbGlkYXRpb24gcnVsZS5cclxuICogIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIGZpZWxkIG9uIHRoZSBzb3VyY2Ugb2JqZWN0LlxyXG4gKiAgQHBhcmFtIGNhbGxiYWNrIFRoZSBjYWxsYmFjayBmdW5jdGlvbi5cclxuICogIEBwYXJhbSBzb3VyY2UgVGhlIHNvdXJjZSBvYmplY3QgYmVpbmcgdmFsaWRhdGVkLlxyXG4gKiAgQHBhcmFtIG9wdGlvbnMgVGhlIHZhbGlkYXRpb24gb3B0aW9ucy5cclxuICogIEBwYXJhbSBvcHRpb25zLm1lc3NhZ2VzIFRoZSB2YWxpZGF0aW9uIG1lc3NhZ2VzLlxyXG4gKi9cclxuXHJcbmZ1bmN0aW9uIG51bWJlcihydWxlLCB2YWx1ZSwgY2FsbGJhY2ssIHNvdXJjZSwgb3B0aW9ucykge1xyXG5cdHZhciBlcnJvcnMgPSBbXTtcclxuXHR2YXIgdmFsaWRhdGUgPSBydWxlLnJlcXVpcmVkIHx8ICFydWxlLnJlcXVpcmVkICYmIHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShydWxlLmZpZWxkKTtcclxuXHJcblx0aWYgKHZhbGlkYXRlKSB7XHJcblx0XHRpZiAodmFsdWUgPT09ICcnKSB7XHJcblx0XHRcdHZhbHVlID0gdW5kZWZpbmVkO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmIChpc0VtcHR5VmFsdWUodmFsdWUpICYmICFydWxlLnJlcXVpcmVkKSB7XHJcblx0XHRcdHJldHVybiBjYWxsYmFjaygpO1xyXG5cdFx0fVxyXG5cclxuXHRcdHJ1bGVzLnJlcXVpcmVkKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XHJcblxyXG5cdFx0aWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcclxuXHRcdFx0cnVsZXMudHlwZShydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xyXG5cdFx0XHRydWxlcy5yYW5nZShydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0Y2FsbGJhY2soZXJyb3JzKTtcclxufVxyXG5cclxuLyoqXHJcbiAqICBWYWxpZGF0ZXMgYSBib29sZWFuLlxyXG4gKlxyXG4gKiAgQHBhcmFtIHJ1bGUgVGhlIHZhbGlkYXRpb24gcnVsZS5cclxuICogIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIGZpZWxkIG9uIHRoZSBzb3VyY2Ugb2JqZWN0LlxyXG4gKiAgQHBhcmFtIGNhbGxiYWNrIFRoZSBjYWxsYmFjayBmdW5jdGlvbi5cclxuICogIEBwYXJhbSBzb3VyY2UgVGhlIHNvdXJjZSBvYmplY3QgYmVpbmcgdmFsaWRhdGVkLlxyXG4gKiAgQHBhcmFtIG9wdGlvbnMgVGhlIHZhbGlkYXRpb24gb3B0aW9ucy5cclxuICogIEBwYXJhbSBvcHRpb25zLm1lc3NhZ2VzIFRoZSB2YWxpZGF0aW9uIG1lc3NhZ2VzLlxyXG4gKi9cclxuXHJcbmZ1bmN0aW9uIF9ib29sZWFuKHJ1bGUsIHZhbHVlLCBjYWxsYmFjaywgc291cmNlLCBvcHRpb25zKSB7XHJcblx0dmFyIGVycm9ycyA9IFtdO1xyXG5cdHZhciB2YWxpZGF0ZSA9IHJ1bGUucmVxdWlyZWQgfHwgIXJ1bGUucmVxdWlyZWQgJiYgc291cmNlLmhhc093blByb3BlcnR5KHJ1bGUuZmllbGQpO1xyXG5cclxuXHRpZiAodmFsaWRhdGUpIHtcclxuXHRcdGlmIChpc0VtcHR5VmFsdWUodmFsdWUpICYmICFydWxlLnJlcXVpcmVkKSB7XHJcblx0XHRcdHJldHVybiBjYWxsYmFjaygpO1xyXG5cdFx0fVxyXG5cclxuXHRcdHJ1bGVzLnJlcXVpcmVkKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XHJcblxyXG5cdFx0aWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcclxuXHRcdFx0cnVsZXMudHlwZShydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0Y2FsbGJhY2soZXJyb3JzKTtcclxufVxyXG5cclxuLyoqXHJcbiAqICBWYWxpZGF0ZXMgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiB0eXBlLlxyXG4gKlxyXG4gKiAgQHBhcmFtIHJ1bGUgVGhlIHZhbGlkYXRpb24gcnVsZS5cclxuICogIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIGZpZWxkIG9uIHRoZSBzb3VyY2Ugb2JqZWN0LlxyXG4gKiAgQHBhcmFtIGNhbGxiYWNrIFRoZSBjYWxsYmFjayBmdW5jdGlvbi5cclxuICogIEBwYXJhbSBzb3VyY2UgVGhlIHNvdXJjZSBvYmplY3QgYmVpbmcgdmFsaWRhdGVkLlxyXG4gKiAgQHBhcmFtIG9wdGlvbnMgVGhlIHZhbGlkYXRpb24gb3B0aW9ucy5cclxuICogIEBwYXJhbSBvcHRpb25zLm1lc3NhZ2VzIFRoZSB2YWxpZGF0aW9uIG1lc3NhZ2VzLlxyXG4gKi9cclxuXHJcbmZ1bmN0aW9uIHJlZ2V4cChydWxlLCB2YWx1ZSwgY2FsbGJhY2ssIHNvdXJjZSwgb3B0aW9ucykge1xyXG5cdHZhciBlcnJvcnMgPSBbXTtcclxuXHR2YXIgdmFsaWRhdGUgPSBydWxlLnJlcXVpcmVkIHx8ICFydWxlLnJlcXVpcmVkICYmIHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShydWxlLmZpZWxkKTtcclxuXHJcblx0aWYgKHZhbGlkYXRlKSB7XHJcblx0XHRpZiAoaXNFbXB0eVZhbHVlKHZhbHVlKSAmJiAhcnVsZS5yZXF1aXJlZCkge1xyXG5cdFx0XHRyZXR1cm4gY2FsbGJhY2soKTtcclxuXHRcdH1cclxuXHJcblx0XHRydWxlcy5yZXF1aXJlZChydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xyXG5cclxuXHRcdGlmICghaXNFbXB0eVZhbHVlKHZhbHVlKSkge1xyXG5cdFx0XHRydWxlcy50eXBlKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRjYWxsYmFjayhlcnJvcnMpO1xyXG59XHJcblxyXG4vKipcclxuICogIFZhbGlkYXRlcyBhIG51bWJlciBpcyBhbiBpbnRlZ2VyLlxyXG4gKlxyXG4gKiAgQHBhcmFtIHJ1bGUgVGhlIHZhbGlkYXRpb24gcnVsZS5cclxuICogIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIGZpZWxkIG9uIHRoZSBzb3VyY2Ugb2JqZWN0LlxyXG4gKiAgQHBhcmFtIGNhbGxiYWNrIFRoZSBjYWxsYmFjayBmdW5jdGlvbi5cclxuICogIEBwYXJhbSBzb3VyY2UgVGhlIHNvdXJjZSBvYmplY3QgYmVpbmcgdmFsaWRhdGVkLlxyXG4gKiAgQHBhcmFtIG9wdGlvbnMgVGhlIHZhbGlkYXRpb24gb3B0aW9ucy5cclxuICogIEBwYXJhbSBvcHRpb25zLm1lc3NhZ2VzIFRoZSB2YWxpZGF0aW9uIG1lc3NhZ2VzLlxyXG4gKi9cclxuXHJcbmZ1bmN0aW9uIGludGVnZXIocnVsZSwgdmFsdWUsIGNhbGxiYWNrLCBzb3VyY2UsIG9wdGlvbnMpIHtcclxuXHR2YXIgZXJyb3JzID0gW107XHJcblx0dmFyIHZhbGlkYXRlID0gcnVsZS5yZXF1aXJlZCB8fCAhcnVsZS5yZXF1aXJlZCAmJiBzb3VyY2UuaGFzT3duUHJvcGVydHkocnVsZS5maWVsZCk7XHJcblxyXG5cdGlmICh2YWxpZGF0ZSkge1xyXG5cdFx0aWYgKGlzRW1wdHlWYWx1ZSh2YWx1ZSkgJiYgIXJ1bGUucmVxdWlyZWQpIHtcclxuXHRcdFx0cmV0dXJuIGNhbGxiYWNrKCk7XHJcblx0XHR9XHJcblxyXG5cdFx0cnVsZXMucmVxdWlyZWQocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcclxuXHJcblx0XHRpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xyXG5cdFx0XHRydWxlcy50eXBlKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XHJcblx0XHRcdHJ1bGVzLnJhbmdlKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRjYWxsYmFjayhlcnJvcnMpO1xyXG59XHJcblxyXG4vKipcclxuICogIFZhbGlkYXRlcyBhIG51bWJlciBpcyBhIGZsb2F0aW5nIHBvaW50IG51bWJlci5cclxuICpcclxuICogIEBwYXJhbSBydWxlIFRoZSB2YWxpZGF0aW9uIHJ1bGUuXHJcbiAqICBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBvbiB0aGUgc291cmNlIG9iamVjdC5cclxuICogIEBwYXJhbSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgZnVuY3Rpb24uXHJcbiAqICBAcGFyYW0gc291cmNlIFRoZSBzb3VyY2Ugb2JqZWN0IGJlaW5nIHZhbGlkYXRlZC5cclxuICogIEBwYXJhbSBvcHRpb25zIFRoZSB2YWxpZGF0aW9uIG9wdGlvbnMuXHJcbiAqICBAcGFyYW0gb3B0aW9ucy5tZXNzYWdlcyBUaGUgdmFsaWRhdGlvbiBtZXNzYWdlcy5cclxuICovXHJcblxyXG5mdW5jdGlvbiBmbG9hdEZuKHJ1bGUsIHZhbHVlLCBjYWxsYmFjaywgc291cmNlLCBvcHRpb25zKSB7XHJcblx0dmFyIGVycm9ycyA9IFtdO1xyXG5cdHZhciB2YWxpZGF0ZSA9IHJ1bGUucmVxdWlyZWQgfHwgIXJ1bGUucmVxdWlyZWQgJiYgc291cmNlLmhhc093blByb3BlcnR5KHJ1bGUuZmllbGQpO1xyXG5cclxuXHRpZiAodmFsaWRhdGUpIHtcclxuXHRcdGlmIChpc0VtcHR5VmFsdWUodmFsdWUpICYmICFydWxlLnJlcXVpcmVkKSB7XHJcblx0XHRcdHJldHVybiBjYWxsYmFjaygpO1xyXG5cdFx0fVxyXG5cclxuXHRcdHJ1bGVzLnJlcXVpcmVkKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XHJcblxyXG5cdFx0aWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcclxuXHRcdFx0cnVsZXMudHlwZShydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xyXG5cdFx0XHRydWxlcy5yYW5nZShydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0Y2FsbGJhY2soZXJyb3JzKTtcclxufVxyXG5cclxuLyoqXHJcbiAqICBWYWxpZGF0ZXMgYW4gYXJyYXkuXHJcbiAqXHJcbiAqICBAcGFyYW0gcnVsZSBUaGUgdmFsaWRhdGlvbiBydWxlLlxyXG4gKiAgQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgb24gdGhlIHNvdXJjZSBvYmplY3QuXHJcbiAqICBAcGFyYW0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIGZ1bmN0aW9uLlxyXG4gKiAgQHBhcmFtIHNvdXJjZSBUaGUgc291cmNlIG9iamVjdCBiZWluZyB2YWxpZGF0ZWQuXHJcbiAqICBAcGFyYW0gb3B0aW9ucyBUaGUgdmFsaWRhdGlvbiBvcHRpb25zLlxyXG4gKiAgQHBhcmFtIG9wdGlvbnMubWVzc2FnZXMgVGhlIHZhbGlkYXRpb24gbWVzc2FnZXMuXHJcbiAqL1xyXG5cclxuZnVuY3Rpb24gYXJyYXkocnVsZSwgdmFsdWUsIGNhbGxiYWNrLCBzb3VyY2UsIG9wdGlvbnMpIHtcclxuXHR2YXIgZXJyb3JzID0gW107XHJcblx0dmFyIHZhbGlkYXRlID0gcnVsZS5yZXF1aXJlZCB8fCAhcnVsZS5yZXF1aXJlZCAmJiBzb3VyY2UuaGFzT3duUHJvcGVydHkocnVsZS5maWVsZCk7XHJcblxyXG5cdGlmICh2YWxpZGF0ZSkge1xyXG5cdFx0aWYgKGlzRW1wdHlWYWx1ZSh2YWx1ZSwgJ2FycmF5JykgJiYgIXJ1bGUucmVxdWlyZWQpIHtcclxuXHRcdFx0cmV0dXJuIGNhbGxiYWNrKCk7XHJcblx0XHR9XHJcblxyXG5cdFx0cnVsZXMucmVxdWlyZWQocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zLCAnYXJyYXknKTtcclxuXHJcblx0XHRpZiAoIWlzRW1wdHlWYWx1ZSh2YWx1ZSwgJ2FycmF5JykpIHtcclxuXHRcdFx0cnVsZXMudHlwZShydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xyXG5cdFx0XHRydWxlcy5yYW5nZShydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0Y2FsbGJhY2soZXJyb3JzKTtcclxufVxyXG5cclxuLyoqXHJcbiAqICBWYWxpZGF0ZXMgYW4gb2JqZWN0LlxyXG4gKlxyXG4gKiAgQHBhcmFtIHJ1bGUgVGhlIHZhbGlkYXRpb24gcnVsZS5cclxuICogIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIGZpZWxkIG9uIHRoZSBzb3VyY2Ugb2JqZWN0LlxyXG4gKiAgQHBhcmFtIGNhbGxiYWNrIFRoZSBjYWxsYmFjayBmdW5jdGlvbi5cclxuICogIEBwYXJhbSBzb3VyY2UgVGhlIHNvdXJjZSBvYmplY3QgYmVpbmcgdmFsaWRhdGVkLlxyXG4gKiAgQHBhcmFtIG9wdGlvbnMgVGhlIHZhbGlkYXRpb24gb3B0aW9ucy5cclxuICogIEBwYXJhbSBvcHRpb25zLm1lc3NhZ2VzIFRoZSB2YWxpZGF0aW9uIG1lc3NhZ2VzLlxyXG4gKi9cclxuXHJcbmZ1bmN0aW9uIG9iamVjdChydWxlLCB2YWx1ZSwgY2FsbGJhY2ssIHNvdXJjZSwgb3B0aW9ucykge1xyXG5cdHZhciBlcnJvcnMgPSBbXTtcclxuXHR2YXIgdmFsaWRhdGUgPSBydWxlLnJlcXVpcmVkIHx8ICFydWxlLnJlcXVpcmVkICYmIHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShydWxlLmZpZWxkKTtcclxuXHJcblx0aWYgKHZhbGlkYXRlKSB7XHJcblx0XHRpZiAoaXNFbXB0eVZhbHVlKHZhbHVlKSAmJiAhcnVsZS5yZXF1aXJlZCkge1xyXG5cdFx0XHRyZXR1cm4gY2FsbGJhY2soKTtcclxuXHRcdH1cclxuXHJcblx0XHRydWxlcy5yZXF1aXJlZChydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xyXG5cclxuXHRcdGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdHJ1bGVzLnR5cGUocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdGNhbGxiYWNrKGVycm9ycyk7XHJcbn1cclxuXHJcbnZhciBFTlVNJDEgPSAnZW51bSc7XHJcbi8qKlxyXG4gKiAgVmFsaWRhdGVzIGFuIGVudW1lcmFibGUgbGlzdC5cclxuICpcclxuICogIEBwYXJhbSBydWxlIFRoZSB2YWxpZGF0aW9uIHJ1bGUuXHJcbiAqICBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBvbiB0aGUgc291cmNlIG9iamVjdC5cclxuICogIEBwYXJhbSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgZnVuY3Rpb24uXHJcbiAqICBAcGFyYW0gc291cmNlIFRoZSBzb3VyY2Ugb2JqZWN0IGJlaW5nIHZhbGlkYXRlZC5cclxuICogIEBwYXJhbSBvcHRpb25zIFRoZSB2YWxpZGF0aW9uIG9wdGlvbnMuXHJcbiAqICBAcGFyYW0gb3B0aW9ucy5tZXNzYWdlcyBUaGUgdmFsaWRhdGlvbiBtZXNzYWdlcy5cclxuICovXHJcblxyXG5mdW5jdGlvbiBlbnVtZXJhYmxlJDEocnVsZSwgdmFsdWUsIGNhbGxiYWNrLCBzb3VyY2UsIG9wdGlvbnMpIHtcclxuXHR2YXIgZXJyb3JzID0gW107XHJcblx0dmFyIHZhbGlkYXRlID0gcnVsZS5yZXF1aXJlZCB8fCAhcnVsZS5yZXF1aXJlZCAmJiBzb3VyY2UuaGFzT3duUHJvcGVydHkocnVsZS5maWVsZCk7XHJcblxyXG5cdGlmICh2YWxpZGF0ZSkge1xyXG5cdFx0aWYgKGlzRW1wdHlWYWx1ZSh2YWx1ZSkgJiYgIXJ1bGUucmVxdWlyZWQpIHtcclxuXHRcdFx0cmV0dXJuIGNhbGxiYWNrKCk7XHJcblx0XHR9XHJcblxyXG5cdFx0cnVsZXMucmVxdWlyZWQocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcclxuXHJcblx0XHRpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xyXG5cdFx0XHRydWxlc1tFTlVNJDFdKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRjYWxsYmFjayhlcnJvcnMpO1xyXG59XHJcblxyXG4vKipcclxuICogIFZhbGlkYXRlcyBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXR0ZXJuLlxyXG4gKlxyXG4gKiAgUGVyZm9ybXMgdmFsaWRhdGlvbiB3aGVuIGEgcnVsZSBvbmx5IGNvbnRhaW5zXHJcbiAqICBhIHBhdHRlcm4gcHJvcGVydHkgYnV0IGlzIG5vdCBkZWNsYXJlZCBhcyBhIHN0cmluZyB0eXBlLlxyXG4gKlxyXG4gKiAgQHBhcmFtIHJ1bGUgVGhlIHZhbGlkYXRpb24gcnVsZS5cclxuICogIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIGZpZWxkIG9uIHRoZSBzb3VyY2Ugb2JqZWN0LlxyXG4gKiAgQHBhcmFtIGNhbGxiYWNrIFRoZSBjYWxsYmFjayBmdW5jdGlvbi5cclxuICogIEBwYXJhbSBzb3VyY2UgVGhlIHNvdXJjZSBvYmplY3QgYmVpbmcgdmFsaWRhdGVkLlxyXG4gKiAgQHBhcmFtIG9wdGlvbnMgVGhlIHZhbGlkYXRpb24gb3B0aW9ucy5cclxuICogIEBwYXJhbSBvcHRpb25zLm1lc3NhZ2VzIFRoZSB2YWxpZGF0aW9uIG1lc3NhZ2VzLlxyXG4gKi9cclxuXHJcbmZ1bmN0aW9uIHBhdHRlcm4kMihydWxlLCB2YWx1ZSwgY2FsbGJhY2ssIHNvdXJjZSwgb3B0aW9ucykge1xyXG5cdHZhciBlcnJvcnMgPSBbXTtcclxuXHR2YXIgdmFsaWRhdGUgPSBydWxlLnJlcXVpcmVkIHx8ICFydWxlLnJlcXVpcmVkICYmIHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShydWxlLmZpZWxkKTtcclxuXHJcblx0aWYgKHZhbGlkYXRlKSB7XHJcblx0XHRpZiAoaXNFbXB0eVZhbHVlKHZhbHVlLCAnc3RyaW5nJykgJiYgIXJ1bGUucmVxdWlyZWQpIHtcclxuXHRcdFx0cmV0dXJuIGNhbGxiYWNrKCk7XHJcblx0XHR9XHJcblxyXG5cdFx0cnVsZXMucmVxdWlyZWQocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcclxuXHJcblx0XHRpZiAoIWlzRW1wdHlWYWx1ZSh2YWx1ZSwgJ3N0cmluZycpKSB7XHJcblx0XHRcdHJ1bGVzLnBhdHRlcm4ocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdGNhbGxiYWNrKGVycm9ycyk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGRhdGUocnVsZSwgdmFsdWUsIGNhbGxiYWNrLCBzb3VyY2UsIG9wdGlvbnMpIHtcclxuXHR2YXIgZXJyb3JzID0gW107XHJcblx0dmFyIHZhbGlkYXRlID0gcnVsZS5yZXF1aXJlZCB8fCAhcnVsZS5yZXF1aXJlZCAmJiBzb3VyY2UuaGFzT3duUHJvcGVydHkocnVsZS5maWVsZCk7IFxyXG5cclxuXHRpZiAodmFsaWRhdGUpIHtcclxuXHRcdGlmIChpc0VtcHR5VmFsdWUodmFsdWUpICYmICFydWxlLnJlcXVpcmVkKSB7XHJcblx0XHRcdHJldHVybiBjYWxsYmFjaygpO1xyXG5cdFx0fVxyXG5cclxuXHRcdHJ1bGVzLnJlcXVpcmVkKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XHJcblxyXG5cdFx0aWYgKCFpc0VtcHR5VmFsdWUodmFsdWUpKSB7XHJcblx0XHRcdHZhciBkYXRlT2JqZWN0O1xyXG5cclxuXHRcdFx0aWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcclxuXHRcdFx0XHRkYXRlT2JqZWN0ID0gbmV3IERhdGUodmFsdWUpO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdGRhdGVPYmplY3QgPSB2YWx1ZTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cnVsZXMudHlwZShydWxlLCBkYXRlT2JqZWN0LCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XHJcblxyXG5cdFx0XHRpZiAoZGF0ZU9iamVjdCkge1xyXG5cdFx0XHRcdHJ1bGVzLnJhbmdlKHJ1bGUsIGRhdGVPYmplY3QuZ2V0VGltZSgpLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdGNhbGxiYWNrKGVycm9ycyk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHJlcXVpcmVkJDEocnVsZSwgdmFsdWUsIGNhbGxiYWNrLCBzb3VyY2UsIG9wdGlvbnMpIHtcclxuXHR2YXIgZXJyb3JzID0gW107XHJcblx0dmFyIHR5cGUgPSBBcnJheS5pc0FycmF5KHZhbHVlKSA/ICdhcnJheScgOiB0eXBlb2YgdmFsdWU7XHJcblx0cnVsZXMucmVxdWlyZWQocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zLCB0eXBlKTtcclxuXHRjYWxsYmFjayhlcnJvcnMpO1xyXG59XHJcblxyXG5mdW5jdGlvbiB0eXBlJDEocnVsZSwgdmFsdWUsIGNhbGxiYWNrLCBzb3VyY2UsIG9wdGlvbnMpIHtcclxuXHR2YXIgcnVsZVR5cGUgPSBydWxlLnR5cGU7XHJcblx0dmFyIGVycm9ycyA9IFtdO1xyXG5cdHZhciB2YWxpZGF0ZSA9IHJ1bGUucmVxdWlyZWQgfHwgIXJ1bGUucmVxdWlyZWQgJiYgc291cmNlLmhhc093blByb3BlcnR5KHJ1bGUuZmllbGQpO1xyXG5cclxuXHRpZiAodmFsaWRhdGUpIHtcclxuXHRcdGlmIChpc0VtcHR5VmFsdWUodmFsdWUsIHJ1bGVUeXBlKSAmJiAhcnVsZS5yZXF1aXJlZCkge1xyXG5cdFx0XHRyZXR1cm4gY2FsbGJhY2soKTtcclxuXHRcdH1cclxuXHJcblx0XHRydWxlcy5yZXF1aXJlZChydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMsIHJ1bGVUeXBlKTtcclxuXHJcblx0XHRpZiAoIWlzRW1wdHlWYWx1ZSh2YWx1ZSwgcnVsZVR5cGUpKSB7XHJcblx0XHRcdHJ1bGVzLnR5cGUocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdGNhbGxiYWNrKGVycm9ycyk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiAgUGVyZm9ybXMgdmFsaWRhdGlvbiBmb3IgYW55IHR5cGUuXHJcbiAqXHJcbiAqICBAcGFyYW0gcnVsZSBUaGUgdmFsaWRhdGlvbiBydWxlLlxyXG4gKiAgQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgb24gdGhlIHNvdXJjZSBvYmplY3QuXHJcbiAqICBAcGFyYW0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIGZ1bmN0aW9uLlxyXG4gKiAgQHBhcmFtIHNvdXJjZSBUaGUgc291cmNlIG9iamVjdCBiZWluZyB2YWxpZGF0ZWQuXHJcbiAqICBAcGFyYW0gb3B0aW9ucyBUaGUgdmFsaWRhdGlvbiBvcHRpb25zLlxyXG4gKiAgQHBhcmFtIG9wdGlvbnMubWVzc2FnZXMgVGhlIHZhbGlkYXRpb24gbWVzc2FnZXMuXHJcbiAqL1xyXG5cclxuZnVuY3Rpb24gYW55KHJ1bGUsIHZhbHVlLCBjYWxsYmFjaywgc291cmNlLCBvcHRpb25zKSB7XHJcblx0dmFyIGVycm9ycyA9IFtdO1xyXG5cdHZhciB2YWxpZGF0ZSA9IHJ1bGUucmVxdWlyZWQgfHwgIXJ1bGUucmVxdWlyZWQgJiYgc291cmNlLmhhc093blByb3BlcnR5KHJ1bGUuZmllbGQpO1xyXG5cclxuXHRpZiAodmFsaWRhdGUpIHtcclxuXHRcdGlmIChpc0VtcHR5VmFsdWUodmFsdWUpICYmICFydWxlLnJlcXVpcmVkKSB7XHJcblx0XHRcdHJldHVybiBjYWxsYmFjaygpO1xyXG5cdFx0fVxyXG5cclxuXHRcdHJ1bGVzLnJlcXVpcmVkKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XHJcblx0fVxyXG5cclxuXHRjYWxsYmFjayhlcnJvcnMpO1xyXG59XHJcblxyXG52YXIgdmFsaWRhdG9ycyA9IHtcclxuXHRzdHJpbmc6IHN0cmluZyxcclxuXHRtZXRob2Q6IG1ldGhvZCxcclxuXHRudW1iZXI6IG51bWJlcixcclxuXHRcImJvb2xlYW5cIjogX2Jvb2xlYW4sXHJcblx0cmVnZXhwOiByZWdleHAsXHJcblx0aW50ZWdlcjogaW50ZWdlcixcclxuXHRcImZsb2F0XCI6IGZsb2F0Rm4sXHJcblx0YXJyYXk6IGFycmF5LFxyXG5cdG9iamVjdDogb2JqZWN0LFxyXG5cdFwiZW51bVwiOiBlbnVtZXJhYmxlJDEsXHJcblx0cGF0dGVybjogcGF0dGVybiQyLFxyXG5cdGRhdGU6IGRhdGUsXHJcblx0dXJsOiB0eXBlJDEsXHJcblx0aGV4OiB0eXBlJDEsXHJcblx0ZW1haWw6IHR5cGUkMSxcclxuXHRyZXF1aXJlZDogcmVxdWlyZWQkMSxcclxuXHRhbnk6IGFueVxyXG59O1xyXG5cclxuZnVuY3Rpb24gbmV3TWVzc2FnZXMoKSB7XHJcblx0cmV0dXJuIHtcclxuXHRcdFwiZGVmYXVsdFwiOiAnVmFsaWRhdGlvbiBlcnJvciBvbiBmaWVsZCAlcycsXHJcblx0XHRyZXF1aXJlZDogJyVzIGlzIHJlcXVpcmVkJyxcclxuXHRcdFwiZW51bVwiOiAnJXMgbXVzdCBiZSBvbmUgb2YgJXMnLFxyXG5cdFx0d2hpdGVzcGFjZTogJyVzIGNhbm5vdCBiZSBlbXB0eScsXHJcblx0XHRkYXRlOiB7XHJcblx0XHRcdGZvcm1hdDogJyVzIGRhdGUgJXMgaXMgaW52YWxpZCBmb3IgZm9ybWF0ICVzJyxcclxuXHRcdFx0cGFyc2U6ICclcyBkYXRlIGNvdWxkIG5vdCBiZSBwYXJzZWQsICVzIGlzIGludmFsaWQgJyxcclxuXHRcdFx0aW52YWxpZDogJyVzIGRhdGUgJXMgaXMgaW52YWxpZCdcclxuXHRcdH0sXHJcblx0XHR0eXBlczoge1xyXG5cdFx0XHRzdHJpbmc6ICclcyBpcyBub3QgYSAlcycsXHJcblx0XHRcdG1ldGhvZDogJyVzIGlzIG5vdCBhICVzIChmdW5jdGlvbiknLFxyXG5cdFx0XHRhcnJheTogJyVzIGlzIG5vdCBhbiAlcycsXHJcblx0XHRcdG9iamVjdDogJyVzIGlzIG5vdCBhbiAlcycsXHJcblx0XHRcdG51bWJlcjogJyVzIGlzIG5vdCBhICVzJyxcclxuXHRcdFx0ZGF0ZTogJyVzIGlzIG5vdCBhICVzJyxcclxuXHRcdFx0XCJib29sZWFuXCI6ICclcyBpcyBub3QgYSAlcycsXHJcblx0XHRcdGludGVnZXI6ICclcyBpcyBub3QgYW4gJXMnLFxyXG5cdFx0XHRcImZsb2F0XCI6ICclcyBpcyBub3QgYSAlcycsXHJcblx0XHRcdHJlZ2V4cDogJyVzIGlzIG5vdCBhIHZhbGlkICVzJyxcclxuXHRcdFx0ZW1haWw6ICclcyBpcyBub3QgYSB2YWxpZCAlcycsXHJcblx0XHRcdHVybDogJyVzIGlzIG5vdCBhIHZhbGlkICVzJyxcclxuXHRcdFx0aGV4OiAnJXMgaXMgbm90IGEgdmFsaWQgJXMnXHJcblx0XHR9LFxyXG5cdFx0c3RyaW5nOiB7XHJcblx0XHRcdGxlbjogJyVzIG11c3QgYmUgZXhhY3RseSAlcyBjaGFyYWN0ZXJzJyxcclxuXHRcdFx0bWluOiAnJXMgbXVzdCBiZSBhdCBsZWFzdCAlcyBjaGFyYWN0ZXJzJyxcclxuXHRcdFx0bWF4OiAnJXMgY2Fubm90IGJlIGxvbmdlciB0aGFuICVzIGNoYXJhY3RlcnMnLFxyXG5cdFx0XHRyYW5nZTogJyVzIG11c3QgYmUgYmV0d2VlbiAlcyBhbmQgJXMgY2hhcmFjdGVycydcclxuXHRcdH0sXHJcblx0XHRudW1iZXI6IHtcclxuXHRcdFx0bGVuOiAnJXMgbXVzdCBlcXVhbCAlcycsXHJcblx0XHRcdG1pbjogJyVzIGNhbm5vdCBiZSBsZXNzIHRoYW4gJXMnLFxyXG5cdFx0XHRtYXg6ICclcyBjYW5ub3QgYmUgZ3JlYXRlciB0aGFuICVzJyxcclxuXHRcdFx0cmFuZ2U6ICclcyBtdXN0IGJlIGJldHdlZW4gJXMgYW5kICVzJ1xyXG5cdFx0fSxcclxuXHRcdGFycmF5OiB7XHJcblx0XHRcdGxlbjogJyVzIG11c3QgYmUgZXhhY3RseSAlcyBpbiBsZW5ndGgnLFxyXG5cdFx0XHRtaW46ICclcyBjYW5ub3QgYmUgbGVzcyB0aGFuICVzIGluIGxlbmd0aCcsXHJcblx0XHRcdG1heDogJyVzIGNhbm5vdCBiZSBncmVhdGVyIHRoYW4gJXMgaW4gbGVuZ3RoJyxcclxuXHRcdFx0cmFuZ2U6ICclcyBtdXN0IGJlIGJldHdlZW4gJXMgYW5kICVzIGluIGxlbmd0aCdcclxuXHRcdH0sXHJcblx0XHRwYXR0ZXJuOiB7XHJcblx0XHRcdG1pc21hdGNoOiAnJXMgdmFsdWUgJXMgZG9lcyBub3QgbWF0Y2ggcGF0dGVybiAlcydcclxuXHRcdH0sXHJcblx0XHRjbG9uZTogZnVuY3Rpb24gY2xvbmUoKSB7XHJcblx0XHRcdHZhciBjbG9uZWQgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMpKTtcclxuXHRcdFx0Y2xvbmVkLmNsb25lID0gdGhpcy5jbG9uZTtcclxuXHRcdFx0cmV0dXJuIGNsb25lZDtcclxuXHRcdH1cclxuXHR9O1xyXG59XHJcbnZhciBtZXNzYWdlcyA9IG5ld01lc3NhZ2VzKCk7XHJcblxyXG4vKipcclxuICogIEVuY2Fwc3VsYXRlcyBhIHZhbGlkYXRpb24gc2NoZW1hLlxyXG4gKlxyXG4gKiAgQHBhcmFtIGRlc2NyaXB0b3IgQW4gb2JqZWN0IGRlY2xhcmluZyB2YWxpZGF0aW9uIHJ1bGVzXHJcbiAqICBmb3IgdGhpcyBzY2hlbWEuXHJcbiAqL1xyXG5cclxuZnVuY3Rpb24gU2NoZW1hKGRlc2NyaXB0b3IpIHtcclxuXHR0aGlzLnJ1bGVzID0gbnVsbDtcclxuXHR0aGlzLl9tZXNzYWdlcyA9IG1lc3NhZ2VzO1xyXG5cdHRoaXMuZGVmaW5lKGRlc2NyaXB0b3IpO1xyXG59XHJcblxyXG5TY2hlbWEucHJvdG90eXBlID0ge1xyXG5cdG1lc3NhZ2VzOiBmdW5jdGlvbiBtZXNzYWdlcyhfbWVzc2FnZXMpIHtcclxuXHRcdGlmIChfbWVzc2FnZXMpIHtcclxuXHRcdFx0dGhpcy5fbWVzc2FnZXMgPSBkZWVwTWVyZ2UobmV3TWVzc2FnZXMoKSwgX21lc3NhZ2VzKTtcclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcy5fbWVzc2FnZXM7XHJcblx0fSxcclxuXHRkZWZpbmU6IGZ1bmN0aW9uIGRlZmluZShydWxlcykge1xyXG5cdFx0aWYgKCFydWxlcykge1xyXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBjb25maWd1cmUgYSBzY2hlbWEgd2l0aCBubyBydWxlcycpO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICh0eXBlb2YgcnVsZXMgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkocnVsZXMpKSB7XHJcblx0XHRcdHRocm93IG5ldyBFcnJvcignUnVsZXMgbXVzdCBiZSBhbiBvYmplY3QnKTtcclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLnJ1bGVzID0ge307XHJcblx0XHR2YXIgejtcclxuXHRcdHZhciBpdGVtO1xyXG5cclxuXHRcdGZvciAoeiBpbiBydWxlcykge1xyXG5cdFx0XHRpZiAocnVsZXMuaGFzT3duUHJvcGVydHkoeikpIHtcclxuXHRcdFx0XHRpdGVtID0gcnVsZXNbel07XHJcblx0XHRcdFx0dGhpcy5ydWxlc1t6XSA9IEFycmF5LmlzQXJyYXkoaXRlbSkgPyBpdGVtIDogW2l0ZW1dO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fSxcclxuXHR2YWxpZGF0ZTogZnVuY3Rpb24gdmFsaWRhdGUoc291cmNlXywgbywgb2MpIHtcclxuXHRcdHZhciBfdGhpcyA9IHRoaXM7XHJcblxyXG5cdFx0aWYgKG8gPT09IHZvaWQgMCkge1xyXG5cdFx0XHRvID0ge307XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKG9jID09PSB2b2lkIDApIHtcclxuXHRcdFx0b2MgPSBmdW5jdGlvbiBvYygpIHt9O1xyXG5cdFx0fVxyXG5cclxuXHRcdHZhciBzb3VyY2UgPSBzb3VyY2VfO1xyXG5cdFx0dmFyIG9wdGlvbnMgPSBvO1xyXG5cdFx0dmFyIGNhbGxiYWNrID0gb2M7XHJcblxyXG5cdFx0aWYgKHR5cGVvZiBvcHRpb25zID09PSAnZnVuY3Rpb24nKSB7XHJcblx0XHRcdGNhbGxiYWNrID0gb3B0aW9ucztcclxuXHRcdFx0b3B0aW9ucyA9IHt9O1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICghdGhpcy5ydWxlcyB8fCBPYmplY3Qua2V5cyh0aGlzLnJ1bGVzKS5sZW5ndGggPT09IDApIHtcclxuXHRcdFx0aWYgKGNhbGxiYWNrKSB7XHJcblx0XHRcdFx0Y2FsbGJhY2soKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xyXG5cdFx0fVxyXG5cclxuXHRcdGZ1bmN0aW9uIGNvbXBsZXRlKHJlc3VsdHMpIHtcclxuXHRcdFx0dmFyIGk7XHJcblx0XHRcdHZhciBlcnJvcnMgPSBbXTtcclxuXHRcdFx0dmFyIGZpZWxkcyA9IHt9O1xyXG5cclxuXHRcdFx0ZnVuY3Rpb24gYWRkKGUpIHtcclxuXHRcdFx0XHRpZiAoQXJyYXkuaXNBcnJheShlKSkge1xyXG5cdFx0XHRcdFx0dmFyIF9lcnJvcnM7XHJcblxyXG5cdFx0XHRcdFx0ZXJyb3JzID0gKF9lcnJvcnMgPSBlcnJvcnMpLmNvbmNhdC5hcHBseShfZXJyb3JzLCBlKTtcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0ZXJyb3JzLnB1c2goZSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRmb3IgKGkgPSAwOyBpIDwgcmVzdWx0cy5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRcdGFkZChyZXN1bHRzW2ldKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKCFlcnJvcnMubGVuZ3RoKSB7XHJcblx0XHRcdFx0ZXJyb3JzID0gbnVsbDtcclxuXHRcdFx0XHRmaWVsZHMgPSBudWxsO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdGZpZWxkcyA9IGNvbnZlcnRGaWVsZHNFcnJvcihlcnJvcnMpO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRjYWxsYmFjayhlcnJvcnMsIGZpZWxkcyk7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKG9wdGlvbnMubWVzc2FnZXMpIHtcclxuXHRcdFx0dmFyIG1lc3NhZ2VzJDEgPSB0aGlzLm1lc3NhZ2VzKCk7XHJcblxyXG5cdFx0XHRpZiAobWVzc2FnZXMkMSA9PT0gbWVzc2FnZXMpIHtcclxuXHRcdFx0XHRtZXNzYWdlcyQxID0gbmV3TWVzc2FnZXMoKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0ZGVlcE1lcmdlKG1lc3NhZ2VzJDEsIG9wdGlvbnMubWVzc2FnZXMpO1xyXG5cdFx0XHRvcHRpb25zLm1lc3NhZ2VzID0gbWVzc2FnZXMkMTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdG9wdGlvbnMubWVzc2FnZXMgPSB0aGlzLm1lc3NhZ2VzKCk7XHJcblx0XHR9XHJcblxyXG5cdFx0dmFyIGFycjtcclxuXHRcdHZhciB2YWx1ZTtcclxuXHRcdHZhciBzZXJpZXMgPSB7fTtcclxuXHRcdHZhciBrZXlzID0gb3B0aW9ucy5rZXlzIHx8IE9iamVjdC5rZXlzKHRoaXMucnVsZXMpO1xyXG5cdFx0a2V5cy5mb3JFYWNoKGZ1bmN0aW9uKHopIHtcclxuXHRcdFx0YXJyID0gX3RoaXMucnVsZXNbel07XHJcblx0XHRcdHZhbHVlID0gc291cmNlW3pdO1xyXG5cdFx0XHRhcnIuZm9yRWFjaChmdW5jdGlvbihyKSB7XHJcblx0XHRcdFx0dmFyIHJ1bGUgPSByO1xyXG5cclxuXHRcdFx0XHRpZiAodHlwZW9mIHJ1bGUudHJhbnNmb3JtID09PSAnZnVuY3Rpb24nKSB7XHJcblx0XHRcdFx0XHRpZiAoc291cmNlID09PSBzb3VyY2VfKSB7XHJcblx0XHRcdFx0XHRcdHNvdXJjZSA9IF9leHRlbmRzKHt9LCBzb3VyY2UpO1xyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdHZhbHVlID0gc291cmNlW3pdID0gcnVsZS50cmFuc2Zvcm0odmFsdWUpO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0aWYgKHR5cGVvZiBydWxlID09PSAnZnVuY3Rpb24nKSB7XHJcblx0XHRcdFx0XHRydWxlID0ge1xyXG5cdFx0XHRcdFx0XHR2YWxpZGF0b3I6IHJ1bGVcclxuXHRcdFx0XHRcdH07XHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdHJ1bGUgPSBfZXh0ZW5kcyh7fSwgcnVsZSk7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRydWxlLnZhbGlkYXRvciA9IF90aGlzLmdldFZhbGlkYXRpb25NZXRob2QocnVsZSk7XHJcblx0XHRcdFx0cnVsZS5maWVsZCA9IHo7XHJcblx0XHRcdFx0cnVsZS5mdWxsRmllbGQgPSBydWxlLmZ1bGxGaWVsZCB8fCB6O1xyXG5cdFx0XHRcdHJ1bGUudHlwZSA9IF90aGlzLmdldFR5cGUocnVsZSk7XHJcblxyXG5cdFx0XHRcdGlmICghcnVsZS52YWxpZGF0b3IpIHtcclxuXHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdHNlcmllc1t6XSA9IHNlcmllc1t6XSB8fCBbXTtcclxuXHRcdFx0XHRzZXJpZXNbel0ucHVzaCh7XHJcblx0XHRcdFx0XHRydWxlOiBydWxlLFxyXG5cdFx0XHRcdFx0dmFsdWU6IHZhbHVlLFxyXG5cdFx0XHRcdFx0c291cmNlOiBzb3VyY2UsXHJcblx0XHRcdFx0XHRmaWVsZDogelxyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR9KTtcclxuXHRcdH0pO1xyXG5cdFx0dmFyIGVycm9yRmllbGRzID0ge307XHJcblx0XHRyZXR1cm4gYXN5bmNNYXAoc2VyaWVzLCBvcHRpb25zLCBmdW5jdGlvbihkYXRhLCBkb0l0KSB7XHJcblx0XHRcdHZhciBydWxlID0gZGF0YS5ydWxlO1xyXG5cdFx0XHR2YXIgZGVlcCA9IChydWxlLnR5cGUgPT09ICdvYmplY3QnIHx8IHJ1bGUudHlwZSA9PT0gJ2FycmF5JykgJiYgKHR5cGVvZiBydWxlLmZpZWxkcyA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIHJ1bGUuZGVmYXVsdEZpZWxkID09PVxyXG5cdFx0XHRcdCdvYmplY3QnKTtcclxuXHRcdFx0ZGVlcCA9IGRlZXAgJiYgKHJ1bGUucmVxdWlyZWQgfHwgIXJ1bGUucmVxdWlyZWQgJiYgZGF0YS52YWx1ZSk7XHJcblx0XHRcdHJ1bGUuZmllbGQgPSBkYXRhLmZpZWxkO1xyXG5cclxuXHRcdFx0ZnVuY3Rpb24gYWRkRnVsbGZpZWxkKGtleSwgc2NoZW1hKSB7XHJcblx0XHRcdFx0cmV0dXJuIF9leHRlbmRzKHt9LCBzY2hlbWEsIHtcclxuXHRcdFx0XHRcdGZ1bGxGaWVsZDogcnVsZS5mdWxsRmllbGQgKyBcIi5cIiArIGtleVxyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRmdW5jdGlvbiBjYihlKSB7XHJcblx0XHRcdFx0aWYgKGUgPT09IHZvaWQgMCkge1xyXG5cdFx0XHRcdFx0ZSA9IFtdO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0dmFyIGVycm9ycyA9IGU7XHJcblxyXG5cdFx0XHRcdGlmICghQXJyYXkuaXNBcnJheShlcnJvcnMpKSB7XHJcblx0XHRcdFx0XHRlcnJvcnMgPSBbZXJyb3JzXTtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGlmICghb3B0aW9ucy5zdXBwcmVzc1dhcm5pbmcgJiYgZXJyb3JzLmxlbmd0aCkge1xyXG5cdFx0XHRcdFx0U2NoZW1hLndhcm5pbmcoJ2FzeW5jLXZhbGlkYXRvcjonLCBlcnJvcnMpO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0aWYgKGVycm9ycy5sZW5ndGggJiYgcnVsZS5tZXNzYWdlKSB7XHJcblx0XHRcdFx0XHRlcnJvcnMgPSBbXS5jb25jYXQocnVsZS5tZXNzYWdlKTtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGVycm9ycyA9IGVycm9ycy5tYXAoY29tcGxlbWVudEVycm9yKHJ1bGUpKTtcclxuXHJcblx0XHRcdFx0aWYgKG9wdGlvbnMuZmlyc3QgJiYgZXJyb3JzLmxlbmd0aCkge1xyXG5cdFx0XHRcdFx0ZXJyb3JGaWVsZHNbcnVsZS5maWVsZF0gPSAxO1xyXG5cdFx0XHRcdFx0cmV0dXJuIGRvSXQoZXJyb3JzKTtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGlmICghZGVlcCkge1xyXG5cdFx0XHRcdFx0ZG9JdChlcnJvcnMpO1xyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHQvLyBpZiBydWxlIGlzIHJlcXVpcmVkIGJ1dCB0aGUgdGFyZ2V0IG9iamVjdFxyXG5cdFx0XHRcdFx0Ly8gZG9lcyBub3QgZXhpc3QgZmFpbCBhdCB0aGUgcnVsZSBsZXZlbCBhbmQgZG9uJ3RcclxuXHRcdFx0XHRcdC8vIGdvIGRlZXBlclxyXG5cdFx0XHRcdFx0aWYgKHJ1bGUucmVxdWlyZWQgJiYgIWRhdGEudmFsdWUpIHtcclxuXHRcdFx0XHRcdFx0aWYgKHJ1bGUubWVzc2FnZSkge1xyXG5cdFx0XHRcdFx0XHRcdGVycm9ycyA9IFtdLmNvbmNhdChydWxlLm1lc3NhZ2UpLm1hcChjb21wbGVtZW50RXJyb3IocnVsZSkpO1xyXG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKG9wdGlvbnMuZXJyb3IpIHtcclxuXHRcdFx0XHRcdFx0XHRlcnJvcnMgPSBbb3B0aW9ucy5lcnJvcihydWxlLCBmb3JtYXQob3B0aW9ucy5tZXNzYWdlcy5yZXF1aXJlZCwgcnVsZS5maWVsZCkpXTtcclxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRlcnJvcnMgPSBbXTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0cmV0dXJuIGRvSXQoZXJyb3JzKTtcclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHR2YXIgZmllbGRzU2NoZW1hID0ge307XHJcblxyXG5cdFx0XHRcdFx0aWYgKHJ1bGUuZGVmYXVsdEZpZWxkKSB7XHJcblx0XHRcdFx0XHRcdGZvciAodmFyIGsgaW4gZGF0YS52YWx1ZSkge1xyXG5cdFx0XHRcdFx0XHRcdGlmIChkYXRhLnZhbHVlLmhhc093blByb3BlcnR5KGspKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRmaWVsZHNTY2hlbWFba10gPSBydWxlLmRlZmF1bHRGaWVsZDtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRmaWVsZHNTY2hlbWEgPSBfZXh0ZW5kcyh7fSwgZmllbGRzU2NoZW1hLCB7fSwgZGF0YS5ydWxlLmZpZWxkcyk7XHJcblxyXG5cdFx0XHRcdFx0Zm9yICh2YXIgZiBpbiBmaWVsZHNTY2hlbWEpIHtcclxuXHRcdFx0XHRcdFx0aWYgKGZpZWxkc1NjaGVtYS5oYXNPd25Qcm9wZXJ0eShmKSkge1xyXG5cdFx0XHRcdFx0XHRcdHZhciBmaWVsZFNjaGVtYSA9IEFycmF5LmlzQXJyYXkoZmllbGRzU2NoZW1hW2ZdKSA/IGZpZWxkc1NjaGVtYVtmXSA6IFtmaWVsZHNTY2hlbWFbZl1dO1xyXG5cdFx0XHRcdFx0XHRcdGZpZWxkc1NjaGVtYVtmXSA9IGZpZWxkU2NoZW1hLm1hcChhZGRGdWxsZmllbGQuYmluZChudWxsLCBmKSk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHR2YXIgc2NoZW1hID0gbmV3IFNjaGVtYShmaWVsZHNTY2hlbWEpO1xyXG5cdFx0XHRcdFx0c2NoZW1hLm1lc3NhZ2VzKG9wdGlvbnMubWVzc2FnZXMpO1xyXG5cclxuXHRcdFx0XHRcdGlmIChkYXRhLnJ1bGUub3B0aW9ucykge1xyXG5cdFx0XHRcdFx0XHRkYXRhLnJ1bGUub3B0aW9ucy5tZXNzYWdlcyA9IG9wdGlvbnMubWVzc2FnZXM7XHJcblx0XHRcdFx0XHRcdGRhdGEucnVsZS5vcHRpb25zLmVycm9yID0gb3B0aW9ucy5lcnJvcjtcclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRzY2hlbWEudmFsaWRhdGUoZGF0YS52YWx1ZSwgZGF0YS5ydWxlLm9wdGlvbnMgfHwgb3B0aW9ucywgZnVuY3Rpb24oZXJycykge1xyXG5cdFx0XHRcdFx0XHR2YXIgZmluYWxFcnJvcnMgPSBbXTtcclxuXHJcblx0XHRcdFx0XHRcdGlmIChlcnJvcnMgJiYgZXJyb3JzLmxlbmd0aCkge1xyXG5cdFx0XHRcdFx0XHRcdGZpbmFsRXJyb3JzLnB1c2guYXBwbHkoZmluYWxFcnJvcnMsIGVycm9ycyk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdGlmIChlcnJzICYmIGVycnMubGVuZ3RoKSB7XHJcblx0XHRcdFx0XHRcdFx0ZmluYWxFcnJvcnMucHVzaC5hcHBseShmaW5hbEVycm9ycywgZXJycyk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdGRvSXQoZmluYWxFcnJvcnMubGVuZ3RoID8gZmluYWxFcnJvcnMgOiBudWxsKTtcclxuXHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dmFyIHJlcztcclxuXHJcblx0XHRcdGlmIChydWxlLmFzeW5jVmFsaWRhdG9yKSB7XHJcblx0XHRcdFx0cmVzID0gcnVsZS5hc3luY1ZhbGlkYXRvcihydWxlLCBkYXRhLnZhbHVlLCBjYiwgZGF0YS5zb3VyY2UsIG9wdGlvbnMpO1xyXG5cdFx0XHR9IGVsc2UgaWYgKHJ1bGUudmFsaWRhdG9yKSB7XHJcblx0XHRcdFx0cmVzID0gcnVsZS52YWxpZGF0b3IocnVsZSwgZGF0YS52YWx1ZSwgY2IsIGRhdGEuc291cmNlLCBvcHRpb25zKTtcclxuXHJcblx0XHRcdFx0aWYgKHJlcyA9PT0gdHJ1ZSkge1xyXG5cdFx0XHRcdFx0Y2IoKTtcclxuXHRcdFx0XHR9IGVsc2UgaWYgKHJlcyA9PT0gZmFsc2UpIHtcclxuXHRcdFx0XHRcdGNiKHJ1bGUubWVzc2FnZSB8fCBydWxlLmZpZWxkICsgXCIgZmFpbHNcIik7XHJcblx0XHRcdFx0fSBlbHNlIGlmIChyZXMgaW5zdGFuY2VvZiBBcnJheSkge1xyXG5cdFx0XHRcdFx0Y2IocmVzKTtcclxuXHRcdFx0XHR9IGVsc2UgaWYgKHJlcyBpbnN0YW5jZW9mIEVycm9yKSB7XHJcblx0XHRcdFx0XHRjYihyZXMubWVzc2FnZSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAocmVzICYmIHJlcy50aGVuKSB7XHJcblx0XHRcdFx0cmVzLnRoZW4oZnVuY3Rpb24oKSB7XHJcblx0XHRcdFx0XHRyZXR1cm4gY2IoKTtcclxuXHRcdFx0XHR9LCBmdW5jdGlvbihlKSB7XHJcblx0XHRcdFx0XHRyZXR1cm4gY2IoZSk7XHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdH1cclxuXHRcdH0sIGZ1bmN0aW9uKHJlc3VsdHMpIHtcclxuXHRcdFx0Y29tcGxldGUocmVzdWx0cyk7XHJcblx0XHR9KTtcclxuXHR9LFxyXG5cdGdldFR5cGU6IGZ1bmN0aW9uIGdldFR5cGUocnVsZSkge1xyXG5cdFx0aWYgKHJ1bGUudHlwZSA9PT0gdW5kZWZpbmVkICYmIHJ1bGUucGF0dGVybiBpbnN0YW5jZW9mIFJlZ0V4cCkge1xyXG5cdFx0XHRydWxlLnR5cGUgPSAncGF0dGVybic7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKHR5cGVvZiBydWxlLnZhbGlkYXRvciAhPT0gJ2Z1bmN0aW9uJyAmJiBydWxlLnR5cGUgJiYgIXZhbGlkYXRvcnMuaGFzT3duUHJvcGVydHkocnVsZS50eXBlKSkge1xyXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoZm9ybWF0KCdVbmtub3duIHJ1bGUgdHlwZSAlcycsIHJ1bGUudHlwZSkpO1xyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBydWxlLnR5cGUgfHwgJ3N0cmluZyc7XHJcblx0fSxcclxuXHRnZXRWYWxpZGF0aW9uTWV0aG9kOiBmdW5jdGlvbiBnZXRWYWxpZGF0aW9uTWV0aG9kKHJ1bGUpIHtcclxuXHRcdGlmICh0eXBlb2YgcnVsZS52YWxpZGF0b3IgPT09ICdmdW5jdGlvbicpIHtcclxuXHRcdFx0cmV0dXJuIHJ1bGUudmFsaWRhdG9yO1xyXG5cdFx0fVxyXG5cclxuXHRcdHZhciBrZXlzID0gT2JqZWN0LmtleXMocnVsZSk7XHJcblx0XHR2YXIgbWVzc2FnZUluZGV4ID0ga2V5cy5pbmRleE9mKCdtZXNzYWdlJyk7XHJcblxyXG5cdFx0aWYgKG1lc3NhZ2VJbmRleCAhPT0gLTEpIHtcclxuXHRcdFx0a2V5cy5zcGxpY2UobWVzc2FnZUluZGV4LCAxKTtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAoa2V5cy5sZW5ndGggPT09IDEgJiYga2V5c1swXSA9PT0gJ3JlcXVpcmVkJykge1xyXG5cdFx0XHRyZXR1cm4gdmFsaWRhdG9ycy5yZXF1aXJlZDtcclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdmFsaWRhdG9yc1t0aGlzLmdldFR5cGUocnVsZSldIHx8IGZhbHNlO1xyXG5cdH1cclxufTtcclxuXHJcblNjaGVtYS5yZWdpc3RlciA9IGZ1bmN0aW9uIHJlZ2lzdGVyKHR5cGUsIHZhbGlkYXRvcikge1xyXG5cdGlmICh0eXBlb2YgdmFsaWRhdG9yICE9PSAnZnVuY3Rpb24nKSB7XHJcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCByZWdpc3RlciBhIHZhbGlkYXRvciBieSB0eXBlLCB2YWxpZGF0b3IgaXMgbm90IGEgZnVuY3Rpb24nKTtcclxuXHR9XHJcblxyXG5cdHZhbGlkYXRvcnNbdHlwZV0gPSB2YWxpZGF0b3I7XHJcbn07XHJcblxyXG5TY2hlbWEud2FybmluZyA9IHdhcm5pbmc7XHJcblNjaGVtYS5tZXNzYWdlcyA9IG1lc3NhZ2VzO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgU2NoZW1hO1xyXG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXBcclxuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///1447\n"); +eval("/* WEBPACK VAR INJECTION */(function(process, __f__) {\n\nvar _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ 2);\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\nvar _typeof2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/typeof */ 5));\nfunction _extends() {\n _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n return target;\n };\n return _extends.apply(this, arguments);\n}\n\n/* eslint no-console:0 */\nvar formatRegExp = /%[sdj%]/g;\nvar warning = function warning() {}; // don't print warning message when in production env or node runtime\n\nif (typeof process !== 'undefined' && Object({\"VUE_APP_DARK_MODE\":\"false\",\"VUE_APP_NAME\":\"智慧安全\",\"VUE_APP_PLATFORM\":\"app-plus\",\"NODE_ENV\":\"development\",\"BASE_URL\":\"/\"}) && \"development\" !== 'production' && typeof window !== 'undefined' && typeof document !== 'undefined') {\n warning = function warning(type, errors) {\n if (typeof console !== 'undefined' && console.warn) {\n if (errors.every(function (e) {\n return typeof e === 'string';\n })) {\n __f__(\"warn\", type, errors, \" at uview-ui/libs/util/async-validator.js:30\");\n }\n }\n };\n}\nfunction convertFieldsError(errors) {\n if (!errors || !errors.length) return null;\n var fields = {};\n errors.forEach(function (error) {\n var field = error.field;\n fields[field] = fields[field] || [];\n fields[field].push(error);\n });\n return fields;\n}\nfunction format() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n var i = 1;\n var f = args[0];\n var len = args.length;\n if (typeof f === 'function') {\n return f.apply(null, args.slice(1));\n }\n if (typeof f === 'string') {\n var str = String(f).replace(formatRegExp, function (x) {\n if (x === '%%') {\n return '%';\n }\n if (i >= len) {\n return x;\n }\n switch (x) {\n case '%s':\n return String(args[i++]);\n case '%d':\n return Number(args[i++]);\n case '%j':\n try {\n return JSON.stringify(args[i++]);\n } catch (_) {\n return '[Circular]';\n }\n break;\n default:\n return x;\n }\n });\n for (var arg = args[i]; i < len; arg = args[++i]) {\n str += \" \" + arg;\n }\n return str;\n }\n return f;\n}\nfunction isNativeStringType(type) {\n return type === 'string' || type === 'url' || type === 'hex' || type === 'email' || type === 'pattern';\n}\nfunction isEmptyValue(value, type) {\n if (value === undefined || value === null) {\n return true;\n }\n if (type === 'array' && Array.isArray(value) && !value.length) {\n return true;\n }\n if (isNativeStringType(type) && typeof value === 'string' && !value) {\n return true;\n }\n return false;\n}\nfunction asyncParallelArray(arr, func, callback) {\n var results = [];\n var total = 0;\n var arrLength = arr.length;\n function count(errors) {\n results.push.apply(results, errors);\n total++;\n if (total === arrLength) {\n callback(results);\n }\n }\n arr.forEach(function (a) {\n func(a, count);\n });\n}\nfunction asyncSerialArray(arr, func, callback) {\n var index = 0;\n var arrLength = arr.length;\n function next(errors) {\n if (errors && errors.length) {\n callback(errors);\n return;\n }\n var original = index;\n index = index + 1;\n if (original < arrLength) {\n func(arr[original], next);\n } else {\n callback([]);\n }\n }\n next([]);\n}\nfunction flattenObjArr(objArr) {\n var ret = [];\n Object.keys(objArr).forEach(function (k) {\n ret.push.apply(ret, objArr[k]);\n });\n return ret;\n}\nfunction asyncMap(objArr, option, func, callback) {\n if (option.first) {\n var _pending = new Promise(function (resolve, reject) {\n var next = function next(errors) {\n callback(errors);\n return errors.length ? reject({\n errors: errors,\n fields: convertFieldsError(errors)\n }) : resolve();\n };\n var flattenArr = flattenObjArr(objArr);\n asyncSerialArray(flattenArr, func, next);\n });\n _pending[\"catch\"](function (e) {\n return e;\n });\n return _pending;\n }\n var firstFields = option.firstFields || [];\n if (firstFields === true) {\n firstFields = Object.keys(objArr);\n }\n var objArrKeys = Object.keys(objArr);\n var objArrLength = objArrKeys.length;\n var total = 0;\n var results = [];\n var pending = new Promise(function (resolve, reject) {\n var next = function next(errors) {\n results.push.apply(results, errors);\n total++;\n if (total === objArrLength) {\n callback(results);\n return results.length ? reject({\n errors: results,\n fields: convertFieldsError(results)\n }) : resolve();\n }\n };\n if (!objArrKeys.length) {\n callback(results);\n resolve();\n }\n objArrKeys.forEach(function (key) {\n var arr = objArr[key];\n if (firstFields.indexOf(key) !== -1) {\n asyncSerialArray(arr, func, next);\n } else {\n asyncParallelArray(arr, func, next);\n }\n });\n });\n pending[\"catch\"](function (e) {\n return e;\n });\n return pending;\n}\nfunction complementError(rule) {\n return function (oe) {\n if (oe && oe.message) {\n oe.field = oe.field || rule.fullField;\n return oe;\n }\n return {\n message: typeof oe === 'function' ? oe() : oe,\n field: oe.field || rule.fullField\n };\n };\n}\nfunction deepMerge(target, source) {\n if (source) {\n for (var s in source) {\n if (source.hasOwnProperty(s)) {\n var value = source[s];\n if ((0, _typeof2.default)(value) === 'object' && (0, _typeof2.default)(target[s]) === 'object') {\n target[s] = _extends({}, target[s], {}, value);\n } else {\n target[s] = value;\n }\n }\n }\n }\n return target;\n}\n\n/**\r\n * Rule for validating required fields.\r\n *\r\n * @param rule The validation rule.\r\n * @param value The value of the field on the source object.\r\n * @param source The source object being validated.\r\n * @param errors An array of errors that this rule may add\r\n * validation errors to.\r\n * @param options The validation options.\r\n * @param options.messages The validation messages.\r\n */\n\nfunction required(rule, value, source, errors, options, type) {\n if (rule.required && (!source.hasOwnProperty(rule.field) || isEmptyValue(value, type || rule.type))) {\n errors.push(format(options.messages.required, rule.fullField));\n }\n}\n\n/**\r\n * Rule for validating whitespace.\r\n *\r\n * @param rule The validation rule.\r\n * @param value The value of the field on the source object.\r\n * @param source The source object being validated.\r\n * @param errors An array of errors that this rule may add\r\n * validation errors to.\r\n * @param options The validation options.\r\n * @param options.messages The validation messages.\r\n */\n\nfunction whitespace(rule, value, source, errors, options) {\n if (/^\\s+$/.test(value) || value === '') {\n errors.push(format(options.messages.whitespace, rule.fullField));\n }\n}\n\n/* eslint max-len:0 */\n\nvar pattern = {\n // http://emailregex.com/\n email: /^(([^<>()\\[\\]\\\\.,;:\\s@\"]+(\\.[^<>()\\[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/,\n url: new RegExp(\"^(?!mailto:)(?:(?:http|https|ftp)://|//)(?:\\\\S+(?::\\\\S*)?@)?(?:(?:(?:[1-9]\\\\d?|1\\\\d\\\\d|2[01]\\\\d|22[0-3])(?:\\\\.(?:1?\\\\d{1,2}|2[0-4]\\\\d|25[0-5])){2}(?:\\\\.(?:[0-9]\\\\d?|1\\\\d\\\\d|2[0-4]\\\\d|25[0-4]))|(?:(?:[a-z\\\\u00a1-\\\\uffff0-9]+-*)*[a-z\\\\u00a1-\\\\uffff0-9]+)(?:\\\\.(?:[a-z\\\\u00a1-\\\\uffff0-9]+-*)*[a-z\\\\u00a1-\\\\uffff0-9]+)*(?:\\\\.(?:[a-z\\\\u00a1-\\\\uffff]{2,})))|localhost)(?::\\\\d{2,5})?(?:(/|\\\\?|#)[^\\\\s]*)?$\", 'i'),\n hex: /^#?([a-f0-9]{6}|[a-f0-9]{3})$/i\n};\nvar types = {\n integer: function integer(value) {\n return types.number(value) && parseInt(value, 10) === value;\n },\n \"float\": function float(value) {\n return types.number(value) && !types.integer(value);\n },\n array: function array(value) {\n return Array.isArray(value);\n },\n regexp: function regexp(value) {\n if (value instanceof RegExp) {\n return true;\n }\n try {\n return !!new RegExp(value);\n } catch (e) {\n return false;\n }\n },\n date: function date(value) {\n return typeof value.getTime === 'function' && typeof value.getMonth === 'function' && typeof value.getYear === 'function';\n },\n number: function number(value) {\n if (isNaN(value)) {\n return false;\n }\n\n // 修改源码,将字符串数值先转为数值\n return typeof +value === 'number';\n },\n object: function object(value) {\n return (0, _typeof2.default)(value) === 'object' && !types.array(value);\n },\n method: function method(value) {\n return typeof value === 'function';\n },\n email: function email(value) {\n return typeof value === 'string' && !!value.match(pattern.email) && value.length < 255;\n },\n url: function url(value) {\n return typeof value === 'string' && !!value.match(pattern.url);\n },\n hex: function hex(value) {\n return typeof value === 'string' && !!value.match(pattern.hex);\n }\n};\n/**\r\n * Rule for validating the type of a value.\r\n *\r\n * @param rule The validation rule.\r\n * @param value The value of the field on the source object.\r\n * @param source The source object being validated.\r\n * @param errors An array of errors that this rule may add\r\n * validation errors to.\r\n * @param options The validation options.\r\n * @param options.messages The validation messages.\r\n */\n\nfunction type(rule, value, source, errors, options) {\n if (rule.required && value === undefined) {\n required(rule, value, source, errors, options);\n return;\n }\n var custom = ['integer', 'float', 'array', 'regexp', 'object', 'method', 'email', 'number', 'date', 'url', 'hex'];\n var ruleType = rule.type;\n if (custom.indexOf(ruleType) > -1) {\n if (!types[ruleType](value)) {\n errors.push(format(options.messages.types[ruleType], rule.fullField, rule.type));\n } // straight typeof check\n } else if (ruleType && (0, _typeof2.default)(value) !== rule.type) {\n errors.push(format(options.messages.types[ruleType], rule.fullField, rule.type));\n }\n}\n\n/**\r\n * Rule for validating minimum and maximum allowed values.\r\n *\r\n * @param rule The validation rule.\r\n * @param value The value of the field on the source object.\r\n * @param source The source object being validated.\r\n * @param errors An array of errors that this rule may add\r\n * validation errors to.\r\n * @param options The validation options.\r\n * @param options.messages The validation messages.\r\n */\n\nfunction range(rule, value, source, errors, options) {\n var len = typeof rule.len === 'number';\n var min = typeof rule.min === 'number';\n var max = typeof rule.max === 'number'; // 正则匹配码点范围从U+010000一直到U+10FFFF的文字(补充平面Supplementary Plane)\n\n var spRegexp = /[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g;\n var val = value;\n var key = null;\n var num = typeof value === 'number';\n var str = typeof value === 'string';\n var arr = Array.isArray(value);\n if (num) {\n key = 'number';\n } else if (str) {\n key = 'string';\n } else if (arr) {\n key = 'array';\n } // if the value is not of a supported type for range validation\n // the validation rule rule should use the\n // type property to also test for a particular type\n\n if (!key) {\n return false;\n }\n if (arr) {\n val = value.length;\n }\n if (str) {\n // 处理码点大于U+010000的文字length属性不准确的bug,如\"𠮷𠮷𠮷\".length !== 3\n val = value.replace(spRegexp, '_').length;\n }\n if (len) {\n if (val !== rule.len) {\n errors.push(format(options.messages[key].len, rule.fullField, rule.len));\n }\n } else if (min && !max && val < rule.min) {\n errors.push(format(options.messages[key].min, rule.fullField, rule.min));\n } else if (max && !min && val > rule.max) {\n errors.push(format(options.messages[key].max, rule.fullField, rule.max));\n } else if (min && max && (val < rule.min || val > rule.max)) {\n errors.push(format(options.messages[key].range, rule.fullField, rule.min, rule.max));\n }\n}\nvar ENUM = 'enum';\n/**\r\n * Rule for validating a value exists in an enumerable list.\r\n *\r\n * @param rule The validation rule.\r\n * @param value The value of the field on the source object.\r\n * @param source The source object being validated.\r\n * @param errors An array of errors that this rule may add\r\n * validation errors to.\r\n * @param options The validation options.\r\n * @param options.messages The validation messages.\r\n */\n\nfunction enumerable(rule, value, source, errors, options) {\n rule[ENUM] = Array.isArray(rule[ENUM]) ? rule[ENUM] : [];\n if (rule[ENUM].indexOf(value) === -1) {\n errors.push(format(options.messages[ENUM], rule.fullField, rule[ENUM].join(', ')));\n }\n}\n\n/**\r\n * Rule for validating a regular expression pattern.\r\n *\r\n * @param rule The validation rule.\r\n * @param value The value of the field on the source object.\r\n * @param source The source object being validated.\r\n * @param errors An array of errors that this rule may add\r\n * validation errors to.\r\n * @param options The validation options.\r\n * @param options.messages The validation messages.\r\n */\n\nfunction pattern$1(rule, value, source, errors, options) {\n if (rule.pattern) {\n if (rule.pattern instanceof RegExp) {\n // if a RegExp instance is passed, reset `lastIndex` in case its `global`\n // flag is accidentally set to `true`, which in a validation scenario\n // is not necessary and the result might be misleading\n rule.pattern.lastIndex = 0;\n if (!rule.pattern.test(value)) {\n errors.push(format(options.messages.pattern.mismatch, rule.fullField, value, rule.pattern));\n }\n } else if (typeof rule.pattern === 'string') {\n var _pattern = new RegExp(rule.pattern);\n if (!_pattern.test(value)) {\n errors.push(format(options.messages.pattern.mismatch, rule.fullField, value, rule.pattern));\n }\n }\n }\n}\nvar rules = {\n required: required,\n whitespace: whitespace,\n type: type,\n range: range,\n \"enum\": enumerable,\n pattern: pattern$1\n};\n\n/**\r\n * Performs validation for string types.\r\n *\r\n * @param rule The validation rule.\r\n * @param value The value of the field on the source object.\r\n * @param callback The callback function.\r\n * @param source The source object being validated.\r\n * @param options The validation options.\r\n * @param options.messages The validation messages.\r\n */\n\nfunction string(rule, value, callback, source, options) {\n var errors = [];\n var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);\n if (validate) {\n if (isEmptyValue(value, 'string') && !rule.required) {\n return callback();\n }\n rules.required(rule, value, source, errors, options, 'string');\n if (!isEmptyValue(value, 'string')) {\n rules.type(rule, value, source, errors, options);\n rules.range(rule, value, source, errors, options);\n rules.pattern(rule, value, source, errors, options);\n if (rule.whitespace === true) {\n rules.whitespace(rule, value, source, errors, options);\n }\n }\n }\n callback(errors);\n}\n\n/**\r\n * Validates a function.\r\n *\r\n * @param rule The validation rule.\r\n * @param value The value of the field on the source object.\r\n * @param callback The callback function.\r\n * @param source The source object being validated.\r\n * @param options The validation options.\r\n * @param options.messages The validation messages.\r\n */\n\nfunction method(rule, value, callback, source, options) {\n var errors = [];\n var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);\n if (validate) {\n if (isEmptyValue(value) && !rule.required) {\n return callback();\n }\n rules.required(rule, value, source, errors, options);\n if (value !== undefined) {\n rules.type(rule, value, source, errors, options);\n }\n }\n callback(errors);\n}\n\n/**\r\n * Validates a number.\r\n *\r\n * @param rule The validation rule.\r\n * @param value The value of the field on the source object.\r\n * @param callback The callback function.\r\n * @param source The source object being validated.\r\n * @param options The validation options.\r\n * @param options.messages The validation messages.\r\n */\n\nfunction number(rule, value, callback, source, options) {\n var errors = [];\n var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);\n if (validate) {\n if (value === '') {\n value = undefined;\n }\n if (isEmptyValue(value) && !rule.required) {\n return callback();\n }\n rules.required(rule, value, source, errors, options);\n if (value !== undefined) {\n rules.type(rule, value, source, errors, options);\n rules.range(rule, value, source, errors, options);\n }\n }\n callback(errors);\n}\n\n/**\r\n * Validates a boolean.\r\n *\r\n * @param rule The validation rule.\r\n * @param value The value of the field on the source object.\r\n * @param callback The callback function.\r\n * @param source The source object being validated.\r\n * @param options The validation options.\r\n * @param options.messages The validation messages.\r\n */\n\nfunction _boolean(rule, value, callback, source, options) {\n var errors = [];\n var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);\n if (validate) {\n if (isEmptyValue(value) && !rule.required) {\n return callback();\n }\n rules.required(rule, value, source, errors, options);\n if (value !== undefined) {\n rules.type(rule, value, source, errors, options);\n }\n }\n callback(errors);\n}\n\n/**\r\n * Validates the regular expression type.\r\n *\r\n * @param rule The validation rule.\r\n * @param value The value of the field on the source object.\r\n * @param callback The callback function.\r\n * @param source The source object being validated.\r\n * @param options The validation options.\r\n * @param options.messages The validation messages.\r\n */\n\nfunction regexp(rule, value, callback, source, options) {\n var errors = [];\n var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);\n if (validate) {\n if (isEmptyValue(value) && !rule.required) {\n return callback();\n }\n rules.required(rule, value, source, errors, options);\n if (!isEmptyValue(value)) {\n rules.type(rule, value, source, errors, options);\n }\n }\n callback(errors);\n}\n\n/**\r\n * Validates a number is an integer.\r\n *\r\n * @param rule The validation rule.\r\n * @param value The value of the field on the source object.\r\n * @param callback The callback function.\r\n * @param source The source object being validated.\r\n * @param options The validation options.\r\n * @param options.messages The validation messages.\r\n */\n\nfunction integer(rule, value, callback, source, options) {\n var errors = [];\n var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);\n if (validate) {\n if (isEmptyValue(value) && !rule.required) {\n return callback();\n }\n rules.required(rule, value, source, errors, options);\n if (value !== undefined) {\n rules.type(rule, value, source, errors, options);\n rules.range(rule, value, source, errors, options);\n }\n }\n callback(errors);\n}\n\n/**\r\n * Validates a number is a floating point number.\r\n *\r\n * @param rule The validation rule.\r\n * @param value The value of the field on the source object.\r\n * @param callback The callback function.\r\n * @param source The source object being validated.\r\n * @param options The validation options.\r\n * @param options.messages The validation messages.\r\n */\n\nfunction floatFn(rule, value, callback, source, options) {\n var errors = [];\n var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);\n if (validate) {\n if (isEmptyValue(value) && !rule.required) {\n return callback();\n }\n rules.required(rule, value, source, errors, options);\n if (value !== undefined) {\n rules.type(rule, value, source, errors, options);\n rules.range(rule, value, source, errors, options);\n }\n }\n callback(errors);\n}\n\n/**\r\n * Validates an array.\r\n *\r\n * @param rule The validation rule.\r\n * @param value The value of the field on the source object.\r\n * @param callback The callback function.\r\n * @param source The source object being validated.\r\n * @param options The validation options.\r\n * @param options.messages The validation messages.\r\n */\n\nfunction array(rule, value, callback, source, options) {\n var errors = [];\n var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);\n if (validate) {\n if (isEmptyValue(value, 'array') && !rule.required) {\n return callback();\n }\n rules.required(rule, value, source, errors, options, 'array');\n if (!isEmptyValue(value, 'array')) {\n rules.type(rule, value, source, errors, options);\n rules.range(rule, value, source, errors, options);\n }\n }\n callback(errors);\n}\n\n/**\r\n * Validates an object.\r\n *\r\n * @param rule The validation rule.\r\n * @param value The value of the field on the source object.\r\n * @param callback The callback function.\r\n * @param source The source object being validated.\r\n * @param options The validation options.\r\n * @param options.messages The validation messages.\r\n */\n\nfunction object(rule, value, callback, source, options) {\n var errors = [];\n var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);\n if (validate) {\n if (isEmptyValue(value) && !rule.required) {\n return callback();\n }\n rules.required(rule, value, source, errors, options);\n if (value !== undefined) {\n rules.type(rule, value, source, errors, options);\n }\n }\n callback(errors);\n}\nvar ENUM$1 = 'enum';\n/**\r\n * Validates an enumerable list.\r\n *\r\n * @param rule The validation rule.\r\n * @param value The value of the field on the source object.\r\n * @param callback The callback function.\r\n * @param source The source object being validated.\r\n * @param options The validation options.\r\n * @param options.messages The validation messages.\r\n */\n\nfunction enumerable$1(rule, value, callback, source, options) {\n var errors = [];\n var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);\n if (validate) {\n if (isEmptyValue(value) && !rule.required) {\n return callback();\n }\n rules.required(rule, value, source, errors, options);\n if (value !== undefined) {\n rules[ENUM$1](rule, value, source, errors, options);\n }\n }\n callback(errors);\n}\n\n/**\r\n * Validates a regular expression pattern.\r\n *\r\n * Performs validation when a rule only contains\r\n * a pattern property but is not declared as a string type.\r\n *\r\n * @param rule The validation rule.\r\n * @param value The value of the field on the source object.\r\n * @param callback The callback function.\r\n * @param source The source object being validated.\r\n * @param options The validation options.\r\n * @param options.messages The validation messages.\r\n */\n\nfunction pattern$2(rule, value, callback, source, options) {\n var errors = [];\n var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);\n if (validate) {\n if (isEmptyValue(value, 'string') && !rule.required) {\n return callback();\n }\n rules.required(rule, value, source, errors, options);\n if (!isEmptyValue(value, 'string')) {\n rules.pattern(rule, value, source, errors, options);\n }\n }\n callback(errors);\n}\nfunction date(rule, value, callback, source, options) {\n var errors = [];\n var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);\n if (validate) {\n if (isEmptyValue(value) && !rule.required) {\n return callback();\n }\n rules.required(rule, value, source, errors, options);\n if (!isEmptyValue(value)) {\n var dateObject;\n if (typeof value === 'number') {\n dateObject = new Date(value);\n } else {\n dateObject = value;\n }\n rules.type(rule, dateObject, source, errors, options);\n if (dateObject) {\n rules.range(rule, dateObject.getTime(), source, errors, options);\n }\n }\n }\n callback(errors);\n}\nfunction required$1(rule, value, callback, source, options) {\n var errors = [];\n var type = Array.isArray(value) ? 'array' : (0, _typeof2.default)(value);\n rules.required(rule, value, source, errors, options, type);\n callback(errors);\n}\nfunction type$1(rule, value, callback, source, options) {\n var ruleType = rule.type;\n var errors = [];\n var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);\n if (validate) {\n if (isEmptyValue(value, ruleType) && !rule.required) {\n return callback();\n }\n rules.required(rule, value, source, errors, options, ruleType);\n if (!isEmptyValue(value, ruleType)) {\n rules.type(rule, value, source, errors, options);\n }\n }\n callback(errors);\n}\n\n/**\r\n * Performs validation for any type.\r\n *\r\n * @param rule The validation rule.\r\n * @param value The value of the field on the source object.\r\n * @param callback The callback function.\r\n * @param source The source object being validated.\r\n * @param options The validation options.\r\n * @param options.messages The validation messages.\r\n */\n\nfunction any(rule, value, callback, source, options) {\n var errors = [];\n var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);\n if (validate) {\n if (isEmptyValue(value) && !rule.required) {\n return callback();\n }\n rules.required(rule, value, source, errors, options);\n }\n callback(errors);\n}\nvar validators = {\n string: string,\n method: method,\n number: number,\n \"boolean\": _boolean,\n regexp: regexp,\n integer: integer,\n \"float\": floatFn,\n array: array,\n object: object,\n \"enum\": enumerable$1,\n pattern: pattern$2,\n date: date,\n url: type$1,\n hex: type$1,\n email: type$1,\n required: required$1,\n any: any\n};\nfunction newMessages() {\n return {\n \"default\": 'Validation error on field %s',\n required: '%s is required',\n \"enum\": '%s must be one of %s',\n whitespace: '%s cannot be empty',\n date: {\n format: '%s date %s is invalid for format %s',\n parse: '%s date could not be parsed, %s is invalid ',\n invalid: '%s date %s is invalid'\n },\n types: {\n string: '%s is not a %s',\n method: '%s is not a %s (function)',\n array: '%s is not an %s',\n object: '%s is not an %s',\n number: '%s is not a %s',\n date: '%s is not a %s',\n \"boolean\": '%s is not a %s',\n integer: '%s is not an %s',\n \"float\": '%s is not a %s',\n regexp: '%s is not a valid %s',\n email: '%s is not a valid %s',\n url: '%s is not a valid %s',\n hex: '%s is not a valid %s'\n },\n string: {\n len: '%s must be exactly %s characters',\n min: '%s must be at least %s characters',\n max: '%s cannot be longer than %s characters',\n range: '%s must be between %s and %s characters'\n },\n number: {\n len: '%s must equal %s',\n min: '%s cannot be less than %s',\n max: '%s cannot be greater than %s',\n range: '%s must be between %s and %s'\n },\n array: {\n len: '%s must be exactly %s in length',\n min: '%s cannot be less than %s in length',\n max: '%s cannot be greater than %s in length',\n range: '%s must be between %s and %s in length'\n },\n pattern: {\n mismatch: '%s value %s does not match pattern %s'\n },\n clone: function clone() {\n var cloned = JSON.parse(JSON.stringify(this));\n cloned.clone = this.clone;\n return cloned;\n }\n };\n}\nvar messages = newMessages();\n\n/**\r\n * Encapsulates a validation schema.\r\n *\r\n * @param descriptor An object declaring validation rules\r\n * for this schema.\r\n */\n\nfunction Schema(descriptor) {\n this.rules = null;\n this._messages = messages;\n this.define(descriptor);\n}\nSchema.prototype = {\n messages: function messages(_messages) {\n if (_messages) {\n this._messages = deepMerge(newMessages(), _messages);\n }\n return this._messages;\n },\n define: function define(rules) {\n if (!rules) {\n throw new Error('Cannot configure a schema with no rules');\n }\n if ((0, _typeof2.default)(rules) !== 'object' || Array.isArray(rules)) {\n throw new Error('Rules must be an object');\n }\n this.rules = {};\n var z;\n var item;\n for (z in rules) {\n if (rules.hasOwnProperty(z)) {\n item = rules[z];\n this.rules[z] = Array.isArray(item) ? item : [item];\n }\n }\n },\n validate: function validate(source_, o, oc) {\n var _this = this;\n if (o === void 0) {\n o = {};\n }\n if (oc === void 0) {\n oc = function oc() {};\n }\n var source = source_;\n var options = o;\n var callback = oc;\n if (typeof options === 'function') {\n callback = options;\n options = {};\n }\n if (!this.rules || Object.keys(this.rules).length === 0) {\n if (callback) {\n callback();\n }\n return Promise.resolve();\n }\n function complete(results) {\n var i;\n var errors = [];\n var fields = {};\n function add(e) {\n if (Array.isArray(e)) {\n var _errors;\n errors = (_errors = errors).concat.apply(_errors, e);\n } else {\n errors.push(e);\n }\n }\n for (i = 0; i < results.length; i++) {\n add(results[i]);\n }\n if (!errors.length) {\n errors = null;\n fields = null;\n } else {\n fields = convertFieldsError(errors);\n }\n callback(errors, fields);\n }\n if (options.messages) {\n var messages$1 = this.messages();\n if (messages$1 === messages) {\n messages$1 = newMessages();\n }\n deepMerge(messages$1, options.messages);\n options.messages = messages$1;\n } else {\n options.messages = this.messages();\n }\n var arr;\n var value;\n var series = {};\n var keys = options.keys || Object.keys(this.rules);\n keys.forEach(function (z) {\n arr = _this.rules[z];\n value = source[z];\n arr.forEach(function (r) {\n var rule = r;\n if (typeof rule.transform === 'function') {\n if (source === source_) {\n source = _extends({}, source);\n }\n value = source[z] = rule.transform(value);\n }\n if (typeof rule === 'function') {\n rule = {\n validator: rule\n };\n } else {\n rule = _extends({}, rule);\n }\n rule.validator = _this.getValidationMethod(rule);\n rule.field = z;\n rule.fullField = rule.fullField || z;\n rule.type = _this.getType(rule);\n if (!rule.validator) {\n return;\n }\n series[z] = series[z] || [];\n series[z].push({\n rule: rule,\n value: value,\n source: source,\n field: z\n });\n });\n });\n var errorFields = {};\n return asyncMap(series, options, function (data, doIt) {\n var rule = data.rule;\n var deep = (rule.type === 'object' || rule.type === 'array') && ((0, _typeof2.default)(rule.fields) === 'object' || (0, _typeof2.default)(rule.defaultField) === 'object');\n deep = deep && (rule.required || !rule.required && data.value);\n rule.field = data.field;\n function addFullfield(key, schema) {\n return _extends({}, schema, {\n fullField: rule.fullField + \".\" + key\n });\n }\n function cb(e) {\n if (e === void 0) {\n e = [];\n }\n var errors = e;\n if (!Array.isArray(errors)) {\n errors = [errors];\n }\n if (!options.suppressWarning && errors.length) {\n Schema.warning('async-validator:', errors);\n }\n if (errors.length && rule.message) {\n errors = [].concat(rule.message);\n }\n errors = errors.map(complementError(rule));\n if (options.first && errors.length) {\n errorFields[rule.field] = 1;\n return doIt(errors);\n }\n if (!deep) {\n doIt(errors);\n } else {\n // if rule is required but the target object\n // does not exist fail at the rule level and don't\n // go deeper\n if (rule.required && !data.value) {\n if (rule.message) {\n errors = [].concat(rule.message).map(complementError(rule));\n } else if (options.error) {\n errors = [options.error(rule, format(options.messages.required, rule.field))];\n } else {\n errors = [];\n }\n return doIt(errors);\n }\n var fieldsSchema = {};\n if (rule.defaultField) {\n for (var k in data.value) {\n if (data.value.hasOwnProperty(k)) {\n fieldsSchema[k] = rule.defaultField;\n }\n }\n }\n fieldsSchema = _extends({}, fieldsSchema, {}, data.rule.fields);\n for (var f in fieldsSchema) {\n if (fieldsSchema.hasOwnProperty(f)) {\n var fieldSchema = Array.isArray(fieldsSchema[f]) ? fieldsSchema[f] : [fieldsSchema[f]];\n fieldsSchema[f] = fieldSchema.map(addFullfield.bind(null, f));\n }\n }\n var schema = new Schema(fieldsSchema);\n schema.messages(options.messages);\n if (data.rule.options) {\n data.rule.options.messages = options.messages;\n data.rule.options.error = options.error;\n }\n schema.validate(data.value, data.rule.options || options, function (errs) {\n var finalErrors = [];\n if (errors && errors.length) {\n finalErrors.push.apply(finalErrors, errors);\n }\n if (errs && errs.length) {\n finalErrors.push.apply(finalErrors, errs);\n }\n doIt(finalErrors.length ? finalErrors : null);\n });\n }\n }\n var res;\n if (rule.asyncValidator) {\n res = rule.asyncValidator(rule, data.value, cb, data.source, options);\n } else if (rule.validator) {\n res = rule.validator(rule, data.value, cb, data.source, options);\n if (res === true) {\n cb();\n } else if (res === false) {\n cb(rule.message || rule.field + \" fails\");\n } else if (res instanceof Array) {\n cb(res);\n } else if (res instanceof Error) {\n cb(res.message);\n }\n }\n if (res && res.then) {\n res.then(function () {\n return cb();\n }, function (e) {\n return cb(e);\n });\n }\n }, function (results) {\n complete(results);\n });\n },\n getType: function getType(rule) {\n if (rule.type === undefined && rule.pattern instanceof RegExp) {\n rule.type = 'pattern';\n }\n if (typeof rule.validator !== 'function' && rule.type && !validators.hasOwnProperty(rule.type)) {\n throw new Error(format('Unknown rule type %s', rule.type));\n }\n return rule.type || 'string';\n },\n getValidationMethod: function getValidationMethod(rule) {\n if (typeof rule.validator === 'function') {\n return rule.validator;\n }\n var keys = Object.keys(rule);\n var messageIndex = keys.indexOf('message');\n if (messageIndex !== -1) {\n keys.splice(messageIndex, 1);\n }\n if (keys.length === 1 && keys[0] === 'required') {\n return validators.required;\n }\n return validators[this.getType(rule)] || false;\n }\n};\nSchema.register = function register(type, validator) {\n if (typeof validator !== 'function') {\n throw new Error('Cannot register a validator by type, validator is not a function');\n }\n validators[type] = validator;\n};\nSchema.warning = warning;\nSchema.messages = messages;\nvar _default = Schema;\nexports.default = _default;\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../../../HBuider软件/HBuilderX/HBuilderX/plugins/uniapp-cli/node_modules/node-libs-browser/mock/process.js */ 1448), __webpack_require__(/*! ./node_modules/@dcloudio/vue-cli-plugin-uni/lib/format-log.js */ 1)[\"default\"]))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInVuaS1hcHA6Ly8vdXZpZXctdWkvbGlicy91dGlsL2FzeW5jLXZhbGlkYXRvci5qcyJdLCJuYW1lcyI6WyJfZXh0ZW5kcyIsIk9iamVjdCIsImFzc2lnbiIsInRhcmdldCIsImkiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJzb3VyY2UiLCJrZXkiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJhcHBseSIsImZvcm1hdFJlZ0V4cCIsIndhcm5pbmciLCJwcm9jZXNzIiwid2luZG93IiwiZG9jdW1lbnQiLCJ0eXBlIiwiZXJyb3JzIiwiY29uc29sZSIsIndhcm4iLCJldmVyeSIsImUiLCJjb252ZXJ0RmllbGRzRXJyb3IiLCJmaWVsZHMiLCJmb3JFYWNoIiwiZXJyb3IiLCJmaWVsZCIsInB1c2giLCJmb3JtYXQiLCJfbGVuIiwiYXJncyIsIkFycmF5IiwiX2tleSIsImYiLCJsZW4iLCJzbGljZSIsInN0ciIsIlN0cmluZyIsInJlcGxhY2UiLCJ4IiwiTnVtYmVyIiwiSlNPTiIsInN0cmluZ2lmeSIsIl8iLCJhcmciLCJpc05hdGl2ZVN0cmluZ1R5cGUiLCJpc0VtcHR5VmFsdWUiLCJ2YWx1ZSIsInVuZGVmaW5lZCIsImlzQXJyYXkiLCJhc3luY1BhcmFsbGVsQXJyYXkiLCJhcnIiLCJmdW5jIiwiY2FsbGJhY2siLCJyZXN1bHRzIiwidG90YWwiLCJhcnJMZW5ndGgiLCJjb3VudCIsImEiLCJhc3luY1NlcmlhbEFycmF5IiwiaW5kZXgiLCJuZXh0Iiwib3JpZ2luYWwiLCJmbGF0dGVuT2JqQXJyIiwib2JqQXJyIiwicmV0Iiwia2V5cyIsImsiLCJhc3luY01hcCIsIm9wdGlvbiIsImZpcnN0IiwiX3BlbmRpbmciLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsImZsYXR0ZW5BcnIiLCJmaXJzdEZpZWxkcyIsIm9iakFycktleXMiLCJvYmpBcnJMZW5ndGgiLCJwZW5kaW5nIiwiaW5kZXhPZiIsImNvbXBsZW1lbnRFcnJvciIsInJ1bGUiLCJvZSIsIm1lc3NhZ2UiLCJmdWxsRmllbGQiLCJkZWVwTWVyZ2UiLCJzIiwicmVxdWlyZWQiLCJvcHRpb25zIiwibWVzc2FnZXMiLCJ3aGl0ZXNwYWNlIiwidGVzdCIsInBhdHRlcm4iLCJlbWFpbCIsInVybCIsIlJlZ0V4cCIsImhleCIsInR5cGVzIiwiaW50ZWdlciIsIm51bWJlciIsInBhcnNlSW50IiwiZmxvYXQiLCJhcnJheSIsInJlZ2V4cCIsImRhdGUiLCJnZXRUaW1lIiwiZ2V0TW9udGgiLCJnZXRZZWFyIiwiaXNOYU4iLCJvYmplY3QiLCJtZXRob2QiLCJtYXRjaCIsImN1c3RvbSIsInJ1bGVUeXBlIiwicmFuZ2UiLCJtaW4iLCJtYXgiLCJzcFJlZ2V4cCIsInZhbCIsIm51bSIsIkVOVU0iLCJlbnVtZXJhYmxlIiwiam9pbiIsInBhdHRlcm4kMSIsImxhc3RJbmRleCIsIm1pc21hdGNoIiwiX3BhdHRlcm4iLCJydWxlcyIsInN0cmluZyIsInZhbGlkYXRlIiwiX2Jvb2xlYW4iLCJmbG9hdEZuIiwiRU5VTSQxIiwiZW51bWVyYWJsZSQxIiwicGF0dGVybiQyIiwiZGF0ZU9iamVjdCIsIkRhdGUiLCJyZXF1aXJlZCQxIiwidHlwZSQxIiwiYW55IiwidmFsaWRhdG9ycyIsIm5ld01lc3NhZ2VzIiwicGFyc2UiLCJpbnZhbGlkIiwiY2xvbmUiLCJjbG9uZWQiLCJTY2hlbWEiLCJkZXNjcmlwdG9yIiwiX21lc3NhZ2VzIiwiZGVmaW5lIiwiRXJyb3IiLCJ6IiwiaXRlbSIsInNvdXJjZV8iLCJvIiwib2MiLCJfdGhpcyIsImNvbXBsZXRlIiwiYWRkIiwiX2Vycm9ycyIsImNvbmNhdCIsIm1lc3NhZ2VzJDEiLCJzZXJpZXMiLCJyIiwidHJhbnNmb3JtIiwidmFsaWRhdG9yIiwiZ2V0VmFsaWRhdGlvbk1ldGhvZCIsImdldFR5cGUiLCJlcnJvckZpZWxkcyIsImRhdGEiLCJkb0l0IiwiZGVlcCIsImRlZmF1bHRGaWVsZCIsImFkZEZ1bGxmaWVsZCIsInNjaGVtYSIsImNiIiwic3VwcHJlc3NXYXJuaW5nIiwibWFwIiwiZmllbGRzU2NoZW1hIiwiZmllbGRTY2hlbWEiLCJiaW5kIiwiZXJycyIsImZpbmFsRXJyb3JzIiwicmVzIiwiYXN5bmNWYWxpZGF0b3IiLCJ0aGVuIiwibWVzc2FnZUluZGV4Iiwic3BsaWNlIiwicmVnaXN0ZXIiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUEsU0FBU0EsUUFBUSxHQUFHO0VBQ25CQSxRQUFRLEdBQUdDLE1BQU0sQ0FBQ0MsTUFBTSxJQUFJLFVBQVNDLE1BQU0sRUFBRTtJQUM1QyxLQUFLLElBQUlDLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsR0FBR0MsU0FBUyxDQUFDQyxNQUFNLEVBQUVGLENBQUMsRUFBRSxFQUFFO01BQzFDLElBQUlHLE1BQU0sR0FBR0YsU0FBUyxDQUFDRCxDQUFDLENBQUM7TUFFekIsS0FBSyxJQUFJSSxHQUFHLElBQUlELE1BQU0sRUFBRTtRQUN2QixJQUFJTixNQUFNLENBQUNRLFNBQVMsQ0FBQ0MsY0FBYyxDQUFDQyxJQUFJLENBQUNKLE1BQU0sRUFBRUMsR0FBRyxDQUFDLEVBQUU7VUFDdERMLE1BQU0sQ0FBQ0ssR0FBRyxDQUFDLEdBQUdELE1BQU0sQ0FBQ0MsR0FBRyxDQUFDO1FBQzFCO01BQ0Q7SUFDRDtJQUVBLE9BQU9MLE1BQU07RUFDZCxDQUFDO0VBRUQsT0FBT0gsUUFBUSxDQUFDWSxLQUFLLENBQUMsSUFBSSxFQUFFUCxTQUFTLENBQUM7QUFDdkM7O0FBRUE7QUFDQSxJQUFJUSxZQUFZLEdBQUcsVUFBVTtBQUM3QixJQUFJQyxPQUFPLEdBQUcsU0FBU0EsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7O0FBRXJDLElBQUksT0FBT0MsT0FBTyxLQUFLLFdBQVcsSUFBSUEsaUlBQVcsSUFBSUEsYUFBb0IsS0FBSyxZQUFZLElBQUksT0FBT0MsTUFBTSxLQUMxRyxXQUFXLElBQUksT0FBT0MsUUFBUSxLQUFLLFdBQVcsRUFBRTtFQUNoREgsT0FBTyxHQUFHLFNBQVNBLE9BQU8sQ0FBQ0ksSUFBSSxFQUFFQyxNQUFN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QUFDRCxZQUFZLEVBQUUsQ0FBQyxDQUFDO0lBQzdCO0lBRUEsSUFBSXpILElBQUksQ0FBQzlELE1BQU0sS0FBSyxDQUFDLElBQUk4RCxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssVUFBVSxFQUFFO01BQ2hELE9BQU8yRSxVQUFVLENBQUNyRCxRQUFRO0lBQzNCO0lBRUEsT0FBT3FELFVBQVUsQ0FBQyxJQUFJLENBQUMyQixPQUFPLENBQUN0RixJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUs7RUFDL0M7QUFDRCxDQUFDO0FBRURpRSxNQUFNLENBQUMwQyxRQUFRLEdBQUcsU0FBU0EsUUFBUSxDQUFDN0ssSUFBSSxFQUFFc0osU0FBUyxFQUFFO0VBQ3BELElBQUksT0FBT0EsU0FBUyxLQUFLLFVBQVUsRUFBRTtJQUNwQyxNQUFNLElBQUlmLEtBQUssQ0FBQyxrRUFBa0UsQ0FBQztFQUNwRjtFQUVBVixVQUFVLENBQUM3SCxJQUFJLENBQUMsR0FBR3NKLFNBQVM7QUFDN0IsQ0FBQztBQUVEbkIsTUFBTSxDQUFDdkksT0FBTyxHQUFHQSxPQUFPO0FBQ3hCdUksTUFBTSxDQUFDekQsUUFBUSxHQUFHQSxRQUFRO0FBQUMsZUFFWnlELE1BQU07QUFBQSwyQiIsImZpbGUiOiIxNDQ3LmpzIiwic291cmNlc0NvbnRlbnQiOlsiZnVuY3Rpb24gX2V4dGVuZHMoKSB7XHJcblx0X2V4dGVuZHMgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uKHRhcmdldCkge1xyXG5cdFx0Zm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0dmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTtcclxuXHJcblx0XHRcdGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHtcclxuXHRcdFx0XHRpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkge1xyXG5cdFx0XHRcdFx0dGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGFyZ2V0O1xyXG5cdH07XHJcblxyXG5cdHJldHVybiBfZXh0ZW5kcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xyXG59XHJcblxyXG4vKiBlc2xpbnQgbm8tY29uc29sZTowICovXHJcbnZhciBmb3JtYXRSZWdFeHAgPSAvJVtzZGolXS9nO1xyXG52YXIgd2FybmluZyA9IGZ1bmN0aW9uIHdhcm5pbmcoKSB7fTsgLy8gZG9uJ3QgcHJpbnQgd2FybmluZyBtZXNzYWdlIHdoZW4gaW4gcHJvZHVjdGlvbiBlbnYgb3Igbm9kZSBydW50aW1lXHJcblxyXG5pZiAodHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmIHByb2Nlc3MuZW52ICYmIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgdHlwZW9mIHdpbmRvdyAhPT1cclxuXHQndW5kZWZpbmVkJyAmJiB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnKSB7XHJcblx0d2FybmluZyA9IGZ1bmN0aW9uIHdhcm5pbmcodHlwZSwgZXJyb3JzKSB7XHJcblx0XHRpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnICYmIGNvbnNvbGUud2Fybikge1xyXG5cdFx0XHRpZiAoZXJyb3JzLmV2ZXJ5KGZ1bmN0aW9uKGUpIHtcclxuXHRcdFx0XHRcdHJldHVybiB0eXBlb2YgZSA9PT0gJ3N0cmluZyc7XHJcblx0XHRcdFx0fSkpIHtcclxuXHRcdFx0XHRjb25zb2xlLndhcm4odHlwZSwgZXJyb3JzKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH07XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNvbnZlcnRGaWVsZHNFcnJvcihlcnJvcnMpIHtcclxuXHRpZiAoIWVycm9ycyB8fCAhZXJyb3JzLmxlbmd0aCkgcmV0dXJuIG51bGw7XHJcblx0dmFyIGZpZWxkcyA9IHt9O1xyXG5cdGVycm9ycy5mb3JFYWNoKGZ1bmN0aW9uKGVycm9yKSB7XHJcblx0XHR2YXIgZmllbGQgPSBlcnJvci5maWVsZDtcclxuXHRcdGZpZWxkc1tmaWVsZF0gPSBmaWVsZHNbZmllbGRdIHx8IFtdO1xyXG5cdFx0ZmllbGRzW2ZpZWxkXS5wdXNoKGVycm9yKTtcclxuXHR9KTtcclxuXHRyZXR1cm4gZmllbGRzO1xyXG59XHJcblxyXG5mdW5jdGlvbiBmb3JtYXQoKSB7XHJcblx0Zm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XHJcblx0XHRhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xyXG5cdH1cclxuXHJcblx0dmFyIGkgPSAxO1xyXG5cdHZhciBmID0gYXJnc1swXTtcclxuXHR2YXIgbGVuID0gYXJncy5sZW5ndGg7XHJcblxyXG5cdGlmICh0eXBlb2YgZiA9PT0gJ2Z1bmN0aW9uJykge1xyXG5cdFx0cmV0dXJuIGYuYXBwbHkobnVsbCwgYXJncy5zbGljZSgxKSk7XHJcblx0fVxyXG5cclxuXHRpZiAodHlwZW9mIGYgPT09ICdzdHJpbmcnKSB7XHJcblx0XHR2YXIgc3RyID0gU3RyaW5nKGYpLnJlcGxhY2UoZm9ybWF0UmVnRXhwLCBmdW5jdGlvbih4KSB7XHJcblx0XHRcdGlmICh4ID09PSAnJSUnKSB7XHJcblx0XHRcdFx0cmV0dXJuICclJztcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKGkgPj0gbGVuKSB7XHJcblx0XHRcdFx0cmV0dXJuIHg7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHN3aXRjaCAoeCkge1xyXG5cdFx0XHRcdGNhc2UgJyVzJzpcclxuXHRcdFx0XHRcdHJldHVybiBTdHJpbmcoYXJnc1tpKytdKTtcclxuXHJcblx0XHRcdFx0Y2FzZSAnJWQnOlxyXG5cdFx0XHRcdFx0cmV0dXJuIE51bWJlcihhcmdzW2krK10pO1xyXG5cclxuXHRcdFx0XHRjYXNlICclaic6XHJcblx0XHRcdFx0XHR0cnkge1xyXG5cdFx0XHRcdFx0XHRyZXR1cm4gSlNPTi5zdHJpbmdpZnkoYXJnc1tpKytdKTtcclxuXHRcdFx0XHRcdH0gY2F0Y2ggKF8pIHtcclxuXHRcdFx0XHRcdFx0cmV0dXJuICdbQ2lyY3VsYXJdJztcclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0ZGVmYXVsdDpcclxuXHRcdFx0XHRcdHJldHVybiB4O1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHJcblx0XHRmb3IgKHZhciBhcmcgPSBhcmdzW2ldOyBpIDwgbGVuOyBhcmcgPSBhcmdzWysraV0pIHtcclxuXHRcdFx0c3RyICs9IFwiIFwiICsgYXJnO1xyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBzdHI7XHJcblx0fVxyXG5cclxuXHRyZXR1cm4gZjtcclxufVxyXG5cclxuZnVuY3Rpb24gaXNOYXRpdmVTdHJpbmdUeXBlKHR5cGUpIHtcclxuXHRyZXR1cm4gdHlwZSA9PT0gJ3N0cmluZycgfHwgdHlwZSA9PT0gJ3VybCcgfHwgdHlwZSA9PT0gJ2hleCcgfHwgdHlwZSA9PT0gJ2VtYWlsJyB8fCB0eXBlID09PSAncGF0dGVybic7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGlzRW1wdHlWYWx1ZSh2YWx1ZSwgdHlwZSkge1xyXG5cdGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsKSB7XHJcblx0XHRyZXR1cm4gdHJ1ZTtcclxuXHR9XHJcblxyXG5cdGlmICh0eXBlID09PSAnYXJyYXknICYmIEFycmF5LmlzQXJyYXkodmFsdWUpICYmICF2YWx1ZS5sZW5ndGgpIHtcclxuXHRcdHJldHVybiB0cnVlO1xyXG5cdH1cclxuXHJcblx0aWYgKGlzTmF0aXZlU3RyaW5nVHlwZSh0eXBlKSAmJiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmICF2YWx1ZSkge1xyXG5cdFx0cmV0dXJuIHRydWU7XHJcblx0fVxyXG5cclxuXHRyZXR1cm4gZmFsc2U7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGFzeW5jUGFyYWxsZWxBcnJheShhcnIsIGZ1bmMsIGNhbGxiYWNrKSB7XHJcblx0dmFyIHJlc3VsdHMgPSBbXTtcclxuXHR2YXIgdG90YWwgPSAwO1xyXG5cdHZhciBhcnJMZW5ndGggPSBhcnIubGVuZ3RoO1xyXG5cclxuXHRmdW5jdGlvbiBjb3VudChlcnJvcnMpIHtcclxuXHRcdHJlc3VsdHMucHVzaC5hcHBseShyZXN1bHRzLCBlcnJvcnMpO1xyXG5cdFx0dG90YWwrKztcclxuXHJcblx0XHRpZiAodG90YWwgPT09IGFyckxlbmd0aCkge1xyXG5cdFx0XHRjYWxsYmFjayhyZXN1bHRzKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdGFyci5mb3JFYWNoKGZ1bmN0aW9uKGEpIHtcclxuXHRcdGZ1bmMoYSwgY291bnQpO1xyXG5cdH0pO1xyXG59XHJcblxyXG5mdW5jdGlvbiBhc3luY1NlcmlhbEFycmF5KGFyciwgZnVuYywgY2FsbGJhY2spIHtcclxuXHR2YXIgaW5kZXggPSAwO1xyXG5cdHZhciBhcnJMZW5ndGggPSBhcnIubGVuZ3RoO1xyXG5cclxuXHRmdW5jdGlvbiBuZXh0KGVycm9ycykge1xyXG5cdFx0aWYgKGVycm9ycyAmJiBlcnJvcnMubGVuZ3RoKSB7XHJcblx0XHRcdGNhbGxiYWNrKGVycm9ycyk7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHJcblx0XHR2YXIgb3JpZ2luYWwgPSBpbmRleDtcclxuXHRcdGluZGV4ID0gaW5kZXggKyAxO1xyXG5cclxuXHRcdGlmIChvcmlnaW5hbCA8IGFyckxlbmd0aCkge1xyXG5cdFx0XHRmdW5jKGFycltvcmlnaW5hbF0sIG5leHQpO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0Y2FsbGJhY2soW10pO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0bmV4dChbXSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGZsYXR0ZW5PYmpBcnIob2JqQXJyKSB7XHJcblx0dmFyIHJldCA9IFtdO1xyXG5cdE9iamVjdC5rZXlzKG9iakFycikuZm9yRWFjaChmdW5jdGlvbihrKSB7XHJcblx0XHRyZXQucHVzaC5hcHBseShyZXQsIG9iakFycltrXSk7XHJcblx0fSk7XHJcblx0cmV0dXJuIHJldDtcclxufVxyXG5cclxuZnVuY3Rpb24gYXN5bmNNYXAob2JqQXJyLCBvcHRpb24sIGZ1bmMsIGNhbGxiYWNrKSB7XHJcblx0aWYgKG9wdGlvbi5maXJzdCkge1xyXG5cdFx0dmFyIF9wZW5kaW5nID0gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XHJcblx0XHRcdHZhciBuZXh0ID0gZnVuY3Rpb24gbmV4dChlcnJvcnMpIHtcclxuXHRcdFx0XHRjYWxsYmFjayhlcnJvcnMpO1xyXG5cdFx0XHRcdHJldHVybiBlcnJvcnMubGVuZ3RoID8gcmVqZWN0KHtcclxuXHRcdFx0XHRcdGVycm9yczogZXJyb3JzLFxyXG5cdFx0XHRcdFx0ZmllbGRzOiBjb252ZXJ0RmllbGRzRXJyb3IoZXJyb3JzKVxyXG5cdFx0XHRcdH0pIDogcmVzb2x2ZSgpO1xyXG5cdFx0XHR9O1xyXG5cclxuXHRcdFx0dmFyIGZsYXR0ZW5BcnIgPSBmbGF0dGVuT2JqQXJyKG9iakFycik7XHJcblx0XHRcdGFzeW5jU2VyaWFsQXJyYXkoZmxhdHRlbkFyciwgZnVuYywgbmV4dCk7XHJcblx0XHR9KTtcclxuXHJcblx0XHRfcGVuZGluZ1tcImNhdGNoXCJdKGZ1bmN0aW9uKGUpIHtcclxuXHRcdFx0cmV0dXJuIGU7XHJcblx0XHR9KTtcclxuXHJcblx0XHRyZXR1cm4gX3BlbmRpbmc7XHJcblx0fVxyXG5cclxuXHR2YXIgZmlyc3RGaWVsZHMgPSBvcHRpb24uZmlyc3RGaWVsZHMgfHwgW107XHJcblxyXG5cdGlmIChmaXJzdEZpZWxkcyA9PT0gdHJ1ZSkge1xyXG5cdFx0Zmlyc3RGaWVsZHMgPSBPYmplY3Qua2V5cyhvYmpBcnIpO1xyXG5cdH1cclxuXHJcblx0dmFyIG9iakFycktleXMgPSBPYmplY3Qua2V5cyhvYmpBcnIpO1xyXG5cdHZhciBvYmpBcnJMZW5ndGggPSBvYmpBcnJLZXlzLmxlbmd0aDtcclxuXHR2YXIgdG90YWwgPSAwO1xyXG5cdHZhciByZXN1bHRzID0gW107XHJcblx0dmFyIHBlbmRpbmcgPSBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcclxuXHRcdHZhciBuZXh0ID0gZnVuY3Rpb24gbmV4dChlcnJvcnMpIHtcclxuXHRcdFx0cmVzdWx0cy5wdXNoLmFwcGx5KHJlc3VsdHMsIGVycm9ycyk7XHJcblx0XHRcdHRvdGFsKys7XHJcblxyXG5cdFx0XHRpZiAodG90YWwgPT09IG9iakFyckxlbmd0aCkge1xyXG5cdFx0XHRcdGNhbGxiYWNrKHJlc3VsdHMpO1xyXG5cdFx0XHRcdHJldHVybiByZXN1bHRzLmxlbmd0aCA/IHJlamVjdCh7XHJcblx0XHRcdFx0XHRlcnJvcnM6IHJlc3VsdHMsXHJcblx0XHRcdFx0XHRmaWVsZHM6IGNvbnZlcnRGaWVsZHNFcnJvcihyZXN1bHRzKVxyXG5cdFx0XHRcdH0pIDogcmVzb2x2ZSgpO1xyXG5cdFx0XHR9XHJcblx0XHR9O1xyXG5cclxuXHRcdGlmICghb2JqQXJyS2V5cy5sZW5ndGgpIHtcclxuXHRcdFx0Y2FsbGJhY2socmVzdWx0cyk7XHJcblx0XHRcdHJlc29sdmUoKTtcclxuXHRcdH1cclxuXHJcblx0XHRvYmpBcnJLZXlzLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XHJcblx0XHRcdHZhciBhcnIgPSBvYmpBcnJba2V5XTtcclxuXHJcblx0XHRcdGlmIChmaXJzdEZpZWxkcy5pbmRleE9mKGtleSkgIT09IC0xKSB7XHJcblx0XHRcdFx0YXN5bmNTZXJpYWxBcnJheShhcnIsIGZ1bmMsIG5leHQpO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdGFzeW5jUGFyYWxsZWxBcnJheShhcnIsIGZ1bmMsIG5leHQpO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHR9KTtcclxuXHRwZW5kaW5nW1wiY2F0Y2hcIl0oZnVuY3Rpb24oZSkge1xyXG5cdFx0cmV0dXJuIGU7XHJcblx0fSk7XHJcblx0cmV0dXJuIHBlbmRpbmc7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNvbXBsZW1lbnRFcnJvcihydWxlKSB7XHJcblx0cmV0dXJuIGZ1bmN0aW9uKG9lKSB7XHJcblx0XHRpZiAob2UgJiYgb2UubWVzc2FnZSkge1xyXG5cdFx0XHRvZS5maWVsZCA9IG9lLmZpZWxkIHx8IHJ1bGUuZnVsbEZpZWxkO1xyXG5cdFx0XHRyZXR1cm4gb2U7XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHtcclxuXHRcdFx0bWVzc2FnZTogdHlwZW9mIG9lID09PSAnZnVuY3Rpb24nID8gb2UoKSA6IG9lLFxyXG5cdFx0XHRmaWVsZDogb2UuZmllbGQgfHwgcnVsZS5mdWxsRmllbGRcclxuXHRcdH07XHJcblx0fTtcclxufVxyXG5cclxuZnVuY3Rpb24gZGVlcE1lcmdlKHRhcmdldCwgc291cmNlKSB7XHJcblx0aWYgKHNvdXJjZSkge1xyXG5cdFx0Zm9yICh2YXIgcyBpbiBzb3VyY2UpIHtcclxuXHRcdFx0aWYgKHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShzKSkge1xyXG5cdFx0XHRcdHZhciB2YWx1ZSA9IHNvdXJjZVtzXTtcclxuXHJcblx0XHRcdFx0aWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIHRhcmdldFtzXSA9PT0gJ29iamVjdCcpIHtcclxuXHRcdFx0XHRcdHRhcmdldFtzXSA9IF9leHRlbmRzKHt9LCB0YXJnZXRbc10sIHt9LCB2YWx1ZSk7XHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdHRhcmdldFtzXSA9IHZhbHVlO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0cmV0dXJuIHRhcmdldDtcclxufVxyXG5cclxuLyoqXHJcbiAqICBSdWxlIGZvciB2YWxpZGF0aW5nIHJlcXVpcmVkIGZpZWxkcy5cclxuICpcclxuICogIEBwYXJhbSBydWxlIFRoZSB2YWxpZGF0aW9uIHJ1bGUuXHJcbiAqICBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBvbiB0aGUgc291cmNlIG9iamVjdC5cclxuICogIEBwYXJhbSBzb3VyY2UgVGhlIHNvdXJjZSBvYmplY3QgYmVpbmcgdmFsaWRhdGVkLlxyXG4gKiAgQHBhcmFtIGVycm9ycyBBbiBhcnJheSBvZiBlcnJvcnMgdGhhdCB0aGlzIHJ1bGUgbWF5IGFkZFxyXG4gKiAgdmFsaWRhdGlvbiBlcnJvcnMgdG8uXHJcbiAqICBAcGFyYW0gb3B0aW9ucyBUaGUgdmFsaWRhdGlvbiBvcHRpb25zLlxyXG4gKiAgQHBhcmFtIG9wdGlvbnMubWVzc2FnZXMgVGhlIHZhbGlkYXRpb24gbWVzc2FnZXMuXHJcbiAqL1xyXG5cclxuZnVuY3Rpb24gcmVxdWlyZWQocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zLCB0eXBlKSB7XHJcblx0aWYgKHJ1bGUucmVxdWlyZWQgJiYgKCFzb3VyY2UuaGFzT3duUHJvcGVydHkocnVsZS5maWVsZCkgfHwgaXNFbXB0eVZhbHVlKHZhbHVlLCB0eXBlIHx8IHJ1bGUudHlwZSkpKSB7XHJcblx0XHRlcnJvcnMucHVzaChmb3JtYXQob3B0aW9ucy5tZXNzYWdlcy5yZXF1aXJlZCwgcnVsZS5mdWxsRmllbGQpKTtcclxuXHR9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiAgUnVsZSBmb3IgdmFsaWRhdGluZyB3aGl0ZXNwYWNlLlxyXG4gKlxyXG4gKiAgQHBhcmFtIHJ1bGUgVGhlIHZhbGlkYXRpb24gcnVsZS5cclxuICogIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIGZpZWxkIG9uIHRoZSBzb3VyY2Ugb2JqZWN0LlxyXG4gKiAgQHBhcmFtIHNvdXJjZSBUaGUgc291cmNlIG9iamVjdCBiZWluZyB2YWxpZGF0ZWQuXHJcbiAqICBAcGFyYW0gZXJyb3JzIEFuIGFycmF5IG9mIGVycm9ycyB0aGF0IHRoaXMgcnVsZSBtYXkgYWRkXHJcbiAqICB2YWxpZGF0aW9uIGVycm9ycyB0by5cclxuICogIEBwYXJhbSBvcHRpb25zIFRoZSB2YWxpZGF0aW9uIG9wdGlvbnMuXHJcbiAqICBAcGFyYW0gb3B0aW9ucy5tZXNzYWdlcyBUaGUgdmFsaWRhdGlvbiBtZXNzYWdlcy5cclxuICovXHJcblxyXG5mdW5jdGlvbiB3aGl0ZXNwYWNlKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucykge1xyXG5cdGlmICgvXlxccyskLy50ZXN0KHZhbHVlKSB8fCB2YWx1ZSA9PT0gJycpIHtcclxuXHRcdGVycm9ycy5wdXNoKGZvcm1hdChvcHRpb25zLm1lc3NhZ2VzLndoaXRlc3BhY2UsIHJ1bGUuZnVsbEZpZWxkKSk7XHJcblx0fVxyXG59XHJcblxyXG4vKiBlc2xpbnQgbWF4LWxlbjowICovXHJcblxyXG52YXIgcGF0dGVybiA9IHtcclxuXHQvLyBodHRwOi8vZW1haWxyZWdleC5jb20vXHJcblx0ZW1haWw6IC9eKChbXjw+KClcXFtcXF1cXFxcLiw7Olxcc0BcIl0rKFxcLltePD4oKVxcW1xcXVxcXFwuLDs6XFxzQFwiXSspKil8KFwiLitcIikpQCgoXFxbWzAtOV17MSwzfVxcLlswLTldezEsM31cXC5bMC05XXsxLDN9XFwuWzAtOV17MSwzfV0pfCgoW2EtekEtWlxcLTAtOV0rXFwuKStbYS16QS1aXXsyLH0pKSQvLFxyXG5cdHVybDogbmV3IFJlZ0V4cChcclxuXHRcdFwiXig/IW1haWx0bzopKD86KD86aHR0cHxodHRwc3xmdHApOi8vfC8vKSg/OlxcXFxTKyg/OjpcXFxcUyopP0ApPyg/Oig/Oig/OlsxLTldXFxcXGQ/fDFcXFxcZFxcXFxkfDJbMDFdXFxcXGR8MjJbMC0zXSkoPzpcXFxcLig/OjE/XFxcXGR7MSwyfXwyWzAtNF1cXFxcZHwyNVswLTVdKSl7Mn0oPzpcXFxcLig/OlswLTldXFxcXGQ/fDFcXFxcZFxcXFxkfDJbMC00XVxcXFxkfDI1WzAtNF0pKXwoPzooPzpbYS16XFxcXHUwMGExLVxcXFx1ZmZmZjAtOV0rLSopKlthLXpcXFxcdTAwYTEtXFxcXHVmZmZmMC05XSspKD86XFxcXC4oPzpbYS16XFxcXHUwMGExLVxcXFx1ZmZmZjAtOV0rLSopKlthLXpcXFxcdTAwYTEtXFxcXHVmZmZmMC05XSspKig/OlxcXFwuKD86W2EtelxcXFx1MDBhMS1cXFxcdWZmZmZdezIsfSkpKXxsb2NhbGhvc3QpKD86OlxcXFxkezIsNX0pPyg/OigvfFxcXFw/fCMpW15cXFxcc10qKT8kXCIsXHJcblx0XHQnaScpLFxyXG5cdGhleDogL14jPyhbYS1mMC05XXs2fXxbYS1mMC05XXszfSkkL2lcclxufTtcclxudmFyIHR5cGVzID0ge1xyXG5cdGludGVnZXI6IGZ1bmN0aW9uIGludGVnZXIodmFsdWUpIHtcclxuXHRcdHJldHVybiB0eXBlcy5udW1iZXIodmFsdWUpICYmIHBhcnNlSW50KHZhbHVlLCAxMCkgPT09IHZhbHVlO1xyXG5cdH0sXHJcblx0XCJmbG9hdFwiOiBmdW5jdGlvbiBmbG9hdCh2YWx1ZSkge1xyXG5cdFx0cmV0dXJuIHR5cGVzLm51bWJlcih2YWx1ZSkgJiYgIXR5cGVzLmludGVnZXIodmFsdWUpO1xyXG5cdH0sXHJcblx0YXJyYXk6IGZ1bmN0aW9uIGFycmF5KHZhbHVlKSB7XHJcblx0XHRyZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSk7XHJcblx0fSxcclxuXHRyZWdleHA6IGZ1bmN0aW9uIHJlZ2V4cCh2YWx1ZSkge1xyXG5cdFx0aWYgKHZhbHVlIGluc3RhbmNlb2YgUmVnRXhwKSB7XHJcblx0XHRcdHJldHVybiB0cnVlO1xyXG5cdFx0fVxyXG5cclxuXHRcdHRyeSB7XHJcblx0XHRcdHJldHVybiAhIW5ldyBSZWdFeHAodmFsdWUpO1xyXG5cdFx0fSBjYXRjaCAoZSkge1xyXG5cdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHR9XHJcblx0fSxcclxuXHRkYXRlOiBmdW5jdGlvbiBkYXRlKHZhbHVlKSB7XHJcblx0XHRyZXR1cm4gdHlwZW9mIHZhbHVlLmdldFRpbWUgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIHZhbHVlLmdldE1vbnRoID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiB2YWx1ZS5nZXRZZWFyID09PVxyXG5cdFx0XHQnZnVuY3Rpb24nO1xyXG5cdH0sXHJcblx0bnVtYmVyOiBmdW5jdGlvbiBudW1iZXIodmFsdWUpIHtcclxuXHRcdGlmIChpc05hTih2YWx1ZSkpIHtcclxuXHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIOS/ruaUuea6kOegge+8jOWwhuWtl+espuS4suaVsOWAvOWFiOi9rOS4uuaVsOWAvFxyXG5cdFx0cmV0dXJuIHR5cGVvZiArdmFsdWUgPT09ICdudW1iZXInO1xyXG5cdH0sXHJcblx0b2JqZWN0OiBmdW5jdGlvbiBvYmplY3QodmFsdWUpIHtcclxuXHRcdHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmICF0eXBlcy5hcnJheSh2YWx1ZSk7XHJcblx0fSxcclxuXHRtZXRob2Q6IGZ1bmN0aW9uIG1ldGhvZCh2YWx1ZSkge1xyXG5cdFx0cmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJztcclxuXHR9LFxyXG5cdGVtYWlsOiBmdW5jdGlvbiBlbWFpbCh2YWx1ZSkge1xyXG5cdFx0cmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgISF2YWx1ZS5tYXRjaChwYXR0ZXJuLmVtYWlsKSAmJiB2YWx1ZS5sZW5ndGggPCAyNTU7XHJcblx0fSxcclxuXHR1cmw6IGZ1bmN0aW9uIHVybCh2YWx1ZSkge1xyXG5cdFx0cmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgISF2YWx1ZS5tYXRjaChwYXR0ZXJuLnVybCk7XHJcblx0fSxcclxuXHRoZXg6IGZ1bmN0aW9uIGhleCh2YWx1ZSkge1xyXG5cdFx0cmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgISF2YWx1ZS5tYXRjaChwYXR0ZXJuLmhleCk7XHJcblx0fVxyXG59O1xyXG4vKipcclxuICogIFJ1bGUgZm9yIHZhbGlkYXRpbmcgdGhlIHR5cGUgb2YgYSB2YWx1ZS5cclxuICpcclxuICogIEBwYXJhbSBydWxlIFRoZSB2YWxpZGF0aW9uIHJ1bGUuXHJcbiAqICBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBvbiB0aGUgc291cmNlIG9iamVjdC5cclxuICogIEBwYXJhbSBzb3VyY2UgVGhlIHNvdXJjZSBvYmplY3QgYmVpbmcgdmFsaWRhdGVkLlxyXG4gKiAgQHBhcmFtIGVycm9ycyBBbiBhcnJheSBvZiBlcnJvcnMgdGhhdCB0aGlzIHJ1bGUgbWF5IGFkZFxyXG4gKiAgdmFsaWRhdGlvbiBlcnJvcnMgdG8uXHJcbiAqICBAcGFyYW0gb3B0aW9ucyBUaGUgdmFsaWRhdGlvbiBvcHRpb25zLlxyXG4gKiAgQHBhcmFtIG9wdGlvbnMubWVzc2FnZXMgVGhlIHZhbGlkYXRpb24gbWVzc2FnZXMuXHJcbiAqL1xyXG5cclxuZnVuY3Rpb24gdHlwZShydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpIHtcclxuXHRpZiAocnVsZS5yZXF1aXJlZCAmJiB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XHJcblx0XHRyZXF1aXJlZChydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xyXG5cdFx0cmV0dXJuO1xyXG5cdH1cclxuXHJcblx0dmFyIGN1c3RvbSA9IFsnaW50ZWdlcicsICdmbG9hdCcsICdhcnJheScsICdyZWdleHAnLCAnb2JqZWN0JywgJ21ldGhvZCcsICdlbWFpbCcsICdudW1iZXInLCAnZGF0ZScsICd1cmwnLCAnaGV4J107XHJcblx0dmFyIHJ1bGVUeXBlID0gcnVsZS50eXBlO1xyXG5cclxuXHRpZiAoY3VzdG9tLmluZGV4T2YocnVsZVR5cGUpID4gLTEpIHtcclxuXHRcdGlmICghdHlwZXNbcnVsZVR5cGVdKHZhbHVlKSkge1xyXG5cdFx0XHRlcnJvcnMucHVzaChmb3JtYXQob3B0aW9ucy5tZXNzYWdlcy50eXBlc1tydWxlVHlwZV0sIHJ1bGUuZnVsbEZpZWxkLCBydWxlLnR5cGUpKTtcclxuXHRcdH0gLy8gc3RyYWlnaHQgdHlwZW9mIGNoZWNrXHJcblxyXG5cdH0gZWxzZSBpZiAocnVsZVR5cGUgJiYgdHlwZW9mIHZhbHVlICE9PSBydWxlLnR5cGUpIHtcclxuXHRcdGVycm9ycy5wdXNoKGZvcm1hdChvcHRpb25zLm1lc3NhZ2VzLnR5cGVzW3J1bGVUeXBlXSwgcnVsZS5mdWxsRmllbGQsIHJ1bGUudHlwZSkpO1xyXG5cdH1cclxufVxyXG5cclxuLyoqXHJcbiAqICBSdWxlIGZvciB2YWxpZGF0aW5nIG1pbmltdW0gYW5kIG1heGltdW0gYWxsb3dlZCB2YWx1ZXMuXHJcbiAqXHJcbiAqICBAcGFyYW0gcnVsZSBUaGUgdmFsaWRhdGlvbiBydWxlLlxyXG4gKiAgQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgb24gdGhlIHNvdXJjZSBvYmplY3QuXHJcbiAqICBAcGFyYW0gc291cmNlIFRoZSBzb3VyY2Ugb2JqZWN0IGJlaW5nIHZhbGlkYXRlZC5cclxuICogIEBwYXJhbSBlcnJvcnMgQW4gYXJyYXkgb2YgZXJyb3JzIHRoYXQgdGhpcyBydWxlIG1heSBhZGRcclxuICogIHZhbGlkYXRpb24gZXJyb3JzIHRvLlxyXG4gKiAgQHBhcmFtIG9wdGlvbnMgVGhlIHZhbGlkYXRpb24gb3B0aW9ucy5cclxuICogIEBwYXJhbSBvcHRpb25zLm1lc3NhZ2VzIFRoZSB2YWxpZGF0aW9uIG1lc3NhZ2VzLlxyXG4gKi9cclxuXHJcbmZ1bmN0aW9uIHJhbmdlKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucykge1xyXG5cdHZhciBsZW4gPSB0eXBlb2YgcnVsZS5sZW4gPT09ICdudW1iZXInO1xyXG5cdHZhciBtaW4gPSB0eXBlb2YgcnVsZS5taW4gPT09ICdudW1iZXInO1xyXG5cdHZhciBtYXggPSB0eXBlb2YgcnVsZS5tYXggPT09ICdudW1iZXInOyAvLyDmraPliJnljLnphY3noIHngrnojIPlm7Tku45VKzAxMDAwMOS4gOebtOWIsFUrMTBGRkZG55qE5paH5a2X77yI6KGl5YWF5bmz6Z2iU3VwcGxlbWVudGFyeSBQbGFuZe+8iVxyXG5cclxuXHR2YXIgc3BSZWdleHAgPSAvW1xcdUQ4MDAtXFx1REJGRl1bXFx1REMwMC1cXHVERkZGXS9nO1xyXG5cdHZhciB2YWwgPSB2YWx1ZTtcclxuXHR2YXIga2V5ID0gbnVsbDtcclxuXHR2YXIgbnVtID0gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJztcclxuXHR2YXIgc3RyID0gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJztcclxuXHR2YXIgYXJyID0gQXJyYXkuaXNBcnJheSh2YWx1ZSk7XHJcblxyXG5cdGlmIChudW0pIHtcclxuXHRcdGtleSA9ICdudW1iZXInO1xyXG5cdH0gZWxzZSBpZiAoc3RyKSB7XHJcblx0XHRrZXkgPSAnc3RyaW5nJztcclxuXHR9IGVsc2UgaWYgKGFycikge1xyXG5cdFx0a2V5ID0gJ2FycmF5JztcclxuXHR9IC8vIGlmIHRoZSB2YWx1ZSBpcyBub3Qgb2YgYSBzdXBwb3J0ZWQgdHlwZSBmb3IgcmFuZ2UgdmFsaWRhdGlvblxyXG5cdC8vIHRoZSB2YWxpZGF0aW9uIHJ1bGUgcnVsZSBzaG91bGQgdXNlIHRoZVxyXG5cdC8vIHR5cGUgcHJvcGVydHkgdG8gYWxzbyB0ZXN0IGZvciBhIHBhcnRpY3VsYXIgdHlwZVxyXG5cclxuXHJcblx0aWYgKCFrZXkpIHtcclxuXHRcdHJldHVybiBmYWxzZTtcclxuXHR9XHJcblxyXG5cdGlmIChhcnIpIHtcclxuXHRcdHZhbCA9IHZhbHVlLmxlbmd0aDtcclxuXHR9XHJcblxyXG5cdGlmIChzdHIpIHtcclxuXHRcdC8vIOWkhOeQhueggeeCueWkp+S6jlUrMDEwMDAw55qE5paH5a2XbGVuZ3Ro5bGe5oCn5LiN5YeG56Gu55qEYnVn77yM5aaCXCLwoK638KCut/CgrrdcIi5sZW5ndGggIT09IDNcclxuXHRcdHZhbCA9IHZhbHVlLnJlcGxhY2Uoc3BSZWdleHAsICdfJykubGVuZ3RoO1xyXG5cdH1cclxuXHJcblx0aWYgKGxlbikge1xyXG5cdFx0aWYgKHZhbCAhPT0gcnVsZS5sZW4pIHtcclxuXHRcdFx0ZXJyb3JzLnB1c2goZm9ybWF0KG9wdGlvbnMubWVzc2FnZXNba2V5XS5sZW4sIHJ1bGUuZnVsbEZpZWxkLCBydWxlLmxlbikpO1xyXG5cdFx0fVxyXG5cdH0gZWxzZSBpZiAobWluICYmICFtYXggJiYgdmFsIDwgcnVsZS5taW4pIHtcclxuXHRcdGVycm9ycy5wdXNoKGZvcm1hdChvcHRpb25zLm1lc3NhZ2VzW2tleV0ubWluLCBydWxlLmZ1bGxGaWVsZCwgcnVsZS5taW4pKTtcclxuXHR9IGVsc2UgaWYgKG1heCAmJiAhbWluICYmIHZhbCA+IHJ1bGUubWF4KSB7XHJcblx0XHRlcnJvcnMucHVzaChmb3JtYXQob3B0aW9ucy5tZXNzYWdlc1trZXldLm1heCwgcnVsZS5mdWxsRmllbGQsIHJ1bGUubWF4KSk7XHJcblx0fSBlbHNlIGlmIChtaW4gJiYgbWF4ICYmICh2YWwgPCBydWxlLm1pbiB8fCB2YWwgPiBydWxlLm1heCkpIHtcclxuXHRcdGVycm9ycy5wdXNoKGZvcm1hdChvcHRpb25zLm1lc3NhZ2VzW2tleV0ucmFuZ2UsIHJ1bGUuZnVsbEZpZWxkLCBydWxlLm1pbiwgcnVsZS5tYXgpKTtcclxuXHR9XHJcbn1cclxuXHJcbnZhciBFTlVNID0gJ2VudW0nO1xyXG4vKipcclxuICogIFJ1bGUgZm9yIHZhbGlkYXRpbmcgYSB2YWx1ZSBleGlzdHMgaW4gYW4gZW51bWVyYWJsZSBsaXN0LlxyXG4gKlxyXG4gKiAgQHBhcmFtIHJ1bGUgVGhlIHZhbGlkYXRpb24gcnVsZS5cclxuICogIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIGZpZWxkIG9uIHRoZSBzb3VyY2Ugb2JqZWN0LlxyXG4gKiAgQHBhcmFtIHNvdXJjZSBUaGUgc291cmNlIG9iamVjdCBiZWluZyB2YWxpZGF0ZWQuXHJcbiAqICBAcGFyYW0gZXJyb3JzIEFuIGFycmF5IG9mIGVycm9ycyB0aGF0IHRoaXMgcnVsZSBtYXkgYWRkXHJcbiAqICB2YWxpZGF0aW9uIGVycm9ycyB0by5cclxuICogIEBwYXJhbSBvcHRpb25zIFRoZSB2YWxpZGF0aW9uIG9wdGlvbnMuXHJcbiAqICBAcGFyYW0gb3B0aW9ucy5tZXNzYWdlcyBUaGUgdmFsaWRhdGlvbiBtZXNzYWdlcy5cclxuICovXHJcblxyXG5mdW5jdGlvbiBlbnVtZXJhYmxlKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucykge1xyXG5cdHJ1bGVbRU5VTV0gPSBBcnJheS5pc0FycmF5KHJ1bGVbRU5VTV0pID8gcnVsZVtFTlVNXSA6IFtdO1xyXG5cclxuXHRpZiAocnVsZVtFTlVNXS5pbmRleE9mKHZhbHVlKSA9PT0gLTEpIHtcclxuXHRcdGVycm9ycy5wdXNoKGZvcm1hdChvcHRpb25zLm1lc3NhZ2VzW0VOVU1dLCBydWxlLmZ1bGxGaWVsZCwgcnVsZVtFTlVNXS5qb2luKCcsICcpKSk7XHJcblx0fVxyXG59XHJcblxyXG4vKipcclxuICogIFJ1bGUgZm9yIHZhbGlkYXRpbmcgYSByZWd1bGFyIGV4cHJlc3Npb24gcGF0dGVybi5cclxuICpcclxuICogIEBwYXJhbSBydWxlIFRoZSB2YWxpZGF0aW9uIHJ1bGUuXHJcbiAqICBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBvbiB0aGUgc291cmNlIG9iamVjdC5cclxuICogIEBwYXJhbSBzb3VyY2UgVGhlIHNvdXJjZSBvYmplY3QgYmVpbmcgdmFsaWRhdGVkLlxyXG4gKiAgQHBhcmFtIGVycm9ycyBBbiBhcnJheSBvZiBlcnJvcnMgdGhhdCB0aGlzIHJ1bGUgbWF5IGFkZFxyXG4gKiAgdmFsaWRhdGlvbiBlcnJvcnMgdG8uXHJcbiAqICBAcGFyYW0gb3B0aW9ucyBUaGUgdmFsaWRhdGlvbiBvcHRpb25zLlxyXG4gKiAgQHBhcmFtIG9wdGlvbnMubWVzc2FnZXMgVGhlIHZhbGlkYXRpb24gbWVzc2FnZXMuXHJcbiAqL1xyXG5cclxuZnVuY3Rpb24gcGF0dGVybiQxKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucykge1xyXG5cdGlmIChydWxlLnBhdHRlcm4pIHtcclxuXHRcdGlmIChydWxlLnBhdHRlcm4gaW5zdGFuY2VvZiBSZWdFeHApIHtcclxuXHRcdFx0Ly8gaWYgYSBSZWdFeHAgaW5zdGFuY2UgaXMgcGFzc2VkLCByZXNldCBgbGFzdEluZGV4YCBpbiBjYXNlIGl0cyBgZ2xvYmFsYFxyXG5cdFx0XHQvLyBmbGFnIGlzIGFjY2lkZW50YWxseSBzZXQgdG8gYHRydWVgLCB3aGljaCBpbiBhIHZhbGlkYXRpb24gc2NlbmFyaW9cclxuXHRcdFx0Ly8gaXMgbm90IG5lY2Vzc2FyeSBhbmQgdGhlIHJlc3VsdCBtaWdodCBiZSBtaXNsZWFkaW5nXHJcblx0XHRcdHJ1bGUucGF0dGVybi5sYXN0SW5kZXggPSAwO1xyXG5cclxuXHRcdFx0aWYgKCFydWxlLnBhdHRlcm4udGVzdCh2YWx1ZSkpIHtcclxuXHRcdFx0XHRlcnJvcnMucHVzaChmb3JtYXQob3B0aW9ucy5tZXNzYWdlcy5wYXR0ZXJuLm1pc21hdGNoLCBydWxlLmZ1bGxGaWVsZCwgdmFsdWUsIHJ1bGUucGF0dGVybikpO1xyXG5cdFx0XHR9XHJcblx0XHR9IGVsc2UgaWYgKHR5cGVvZiBydWxlLnBhdHRlcm4gPT09ICdzdHJpbmcnKSB7XHJcblx0XHRcdHZhciBfcGF0dGVybiA9IG5ldyBSZWdFeHAocnVsZS5wYXR0ZXJuKTtcclxuXHJcblx0XHRcdGlmICghX3BhdHRlcm4udGVzdCh2YWx1ZSkpIHtcclxuXHRcdFx0XHRlcnJvcnMucHVzaChmb3JtYXQob3B0aW9ucy5tZXNzYWdlcy5wYXR0ZXJuLm1pc21hdGNoLCBydWxlLmZ1bGxGaWVsZCwgdmFsdWUsIHJ1bGUucGF0dGVybikpO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG59XHJcblxyXG52YXIgcnVsZXMgPSB7XHJcblx0cmVxdWlyZWQ6IHJlcXVpcmVkLFxyXG5cdHdoaXRlc3BhY2U6IHdoaXRlc3BhY2UsXHJcblx0dHlwZTogdHlwZSxcclxuXHRyYW5nZTogcmFuZ2UsXHJcblx0XCJlbnVtXCI6IGVudW1lcmFibGUsXHJcblx0cGF0dGVybjogcGF0dGVybiQxXHJcbn07XHJcblxyXG4vKipcclxuICogIFBlcmZvcm1zIHZhbGlkYXRpb24gZm9yIHN0cmluZyB0eXBlcy5cclxuICpcclxuICogIEBwYXJhbSBydWxlIFRoZSB2YWxpZGF0aW9uIHJ1bGUuXHJcbiAqICBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBvbiB0aGUgc291cmNlIG9iamVjdC5cclxuICogIEBwYXJhbSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgZnVuY3Rpb24uXHJcbiAqICBAcGFyYW0gc291cmNlIFRoZSBzb3VyY2Ugb2JqZWN0IGJlaW5nIHZhbGlkYXRlZC5cclxuICogIEBwYXJhbSBvcHRpb25zIFRoZSB2YWxpZGF0aW9uIG9wdGlvbnMuXHJcbiAqICBAcGFyYW0gb3B0aW9ucy5tZXNzYWdlcyBUaGUgdmFsaWRhdGlvbiBtZXNzYWdlcy5cclxuICovXHJcblxyXG5mdW5jdGlvbiBzdHJpbmcocnVsZSwgdmFsdWUsIGNhbGxiYWNrLCBzb3VyY2UsIG9wdGlvbnMpIHtcclxuXHR2YXIgZXJyb3JzID0gW107XHJcblx0dmFyIHZhbGlkYXRlID0gcnVsZS5yZXF1aXJlZCB8fCAhcnVsZS5yZXF1aXJlZCAmJiBzb3VyY2UuaGFzT3duUHJvcGVydHkocnVsZS5maWVsZCk7XHJcblxyXG5cdGlmICh2YWxpZGF0ZSkge1xyXG5cdFx0aWYgKGlzRW1wdHlWYWx1ZSh2YWx1ZSwgJ3N0cmluZycpICYmICFydWxlLnJlcXVpcmVkKSB7XHJcblx0XHRcdHJldHVybiBjYWxsYmFjaygpO1xyXG5cdFx0fVxyXG5cclxuXHRcdHJ1bGVzLnJlcXVpcmVkKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucywgJ3N0cmluZycpO1xyXG5cclxuXHRcdGlmICghaXNFbXB0eVZhbHVlKHZhbHVlLCAnc3RyaW5nJykpIHtcclxuXHRcdFx0cnVsZXMudHlwZShydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xyXG5cdFx0XHRydWxlcy5yYW5nZShydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xyXG5cdFx0XHRydWxlcy5wYXR0ZXJuKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XHJcblxyXG5cdFx0XHRpZiAocnVsZS53aGl0ZXNwYWNlID09PSB0cnVlKSB7XHJcblx0XHRcdFx0cnVsZXMud2hpdGVzcGFjZShydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRjYWxsYmFjayhlcnJvcnMpO1xyXG59XHJcblxyXG4vKipcclxuICogIFZhbGlkYXRlcyBhIGZ1bmN0aW9uLlxyXG4gKlxyXG4gKiAgQHBhcmFtIHJ1bGUgVGhlIHZhbGlkYXRpb24gcnVsZS5cclxuICogIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIGZpZWxkIG9uIHRoZSBzb3VyY2Ugb2JqZWN0LlxyXG4gKiAgQHBhcmFtIGNhbGxiYWNrIFRoZSBjYWxsYmFjayBmdW5jdGlvbi5cclxuICogIEBwYXJhbSBzb3VyY2UgVGhlIHNvdXJjZSBvYmplY3QgYmVpbmcgdmFsaWRhdGVkLlxyXG4gKiAgQHBhcmFtIG9wdGlvbnMgVGhlIHZhbGlkYXRpb24gb3B0aW9ucy5cclxuICogIEBwYXJhbSBvcHRpb25zLm1lc3NhZ2VzIFRoZSB2YWxpZGF0aW9uIG1lc3NhZ2VzLlxyXG4gKi9cclxuXHJcbmZ1bmN0aW9uIG1ldGhvZChydWxlLCB2YWx1ZSwgY2FsbGJhY2ssIHNvdXJjZSwgb3B0aW9ucykge1xyXG5cdHZhciBlcnJvcnMgPSBbXTtcclxuXHR2YXIgdmFsaWRhdGUgPSBydWxlLnJlcXVpcmVkIHx8ICFydWxlLnJlcXVpcmVkICYmIHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShydWxlLmZpZWxkKTtcclxuXHJcblx0aWYgKHZhbGlkYXRlKSB7XHJcblx0XHRpZiAoaXNFbXB0eVZhbHVlKHZhbHVlKSAmJiAhcnVsZS5yZXF1aXJlZCkge1xyXG5cdFx0XHRyZXR1cm4gY2FsbGJhY2soKTtcclxuXHRcdH1cclxuXHJcblx0XHRydWxlcy5yZXF1aXJlZChydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xyXG5cclxuXHRcdGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdHJ1bGVzLnR5cGUocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdGNhbGxiYWNrKGVycm9ycyk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiAgVmFsaWRhdGVzIGEgbnVtYmVyLlxyXG4gKlxyXG4gKiAgQHBhcmFtIHJ1bGUgVGhlIHZhbGlkYXRpb24gcnVsZS5cclxuICogIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIGZpZWxkIG9uIHRoZSBzb3VyY2Ugb2JqZWN0LlxyXG4gKiAgQHBhcmFtIGNhbGxiYWNrIFRoZSBjYWxsYmFjayBmdW5jdGlvbi5cclxuICogIEBwYXJhbSBzb3VyY2UgVGhlIHNvdXJjZSBvYmplY3QgYmVpbmcgdmFsaWRhdGVkLlxyXG4gKiAgQHBhcmFtIG9wdGlvbnMgVGhlIHZhbGlkYXRpb24gb3B0aW9ucy5cclxuICogIEBwYXJhbSBvcHRpb25zLm1lc3NhZ2VzIFRoZSB2YWxpZGF0aW9uIG1lc3NhZ2VzLlxyXG4gKi9cclxuXHJcbmZ1bmN0aW9uIG51bWJlcihydWxlLCB2YWx1ZSwgY2FsbGJhY2ssIHNvdXJjZSwgb3B0aW9ucykge1xyXG5cdHZhciBlcnJvcnMgPSBbXTtcclxuXHR2YXIgdmFsaWRhdGUgPSBydWxlLnJlcXVpcmVkIHx8ICFydWxlLnJlcXVpcmVkICYmIHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShydWxlLmZpZWxkKTtcclxuXHJcblx0aWYgKHZhbGlkYXRlKSB7XHJcblx0XHRpZiAodmFsdWUgPT09ICcnKSB7XHJcblx0XHRcdHZhbHVlID0gdW5kZWZpbmVkO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmIChpc0VtcHR5VmFsdWUodmFsdWUpICYmICFydWxlLnJlcXVpcmVkKSB7XHJcblx0XHRcdHJldHVybiBjYWxsYmFjaygpO1xyXG5cdFx0fVxyXG5cclxuXHRcdHJ1bGVzLnJlcXVpcmVkKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XHJcblxyXG5cdFx0aWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcclxuXHRcdFx0cnVsZXMudHlwZShydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xyXG5cdFx0XHRydWxlcy5yYW5nZShydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0Y2FsbGJhY2soZXJyb3JzKTtcclxufVxyXG5cclxuLyoqXHJcbiAqICBWYWxpZGF0ZXMgYSBib29sZWFuLlxyXG4gKlxyXG4gKiAgQHBhcmFtIHJ1bGUgVGhlIHZhbGlkYXRpb24gcnVsZS5cclxuICogIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIGZpZWxkIG9uIHRoZSBzb3VyY2Ugb2JqZWN0LlxyXG4gKiAgQHBhcmFtIGNhbGxiYWNrIFRoZSBjYWxsYmFjayBmdW5jdGlvbi5cclxuICogIEBwYXJhbSBzb3VyY2UgVGhlIHNvdXJjZSBvYmplY3QgYmVpbmcgdmFsaWRhdGVkLlxyXG4gKiAgQHBhcmFtIG9wdGlvbnMgVGhlIHZhbGlkYXRpb24gb3B0aW9ucy5cclxuICogIEBwYXJhbSBvcHRpb25zLm1lc3NhZ2VzIFRoZSB2YWxpZGF0aW9uIG1lc3NhZ2VzLlxyXG4gKi9cclxuXHJcbmZ1bmN0aW9uIF9ib29sZWFuKHJ1bGUsIHZhbHVlLCBjYWxsYmFjaywgc291cmNlLCBvcHRpb25zKSB7XHJcblx0dmFyIGVycm9ycyA9IFtdO1xyXG5cdHZhciB2YWxpZGF0ZSA9IHJ1bGUucmVxdWlyZWQgfHwgIXJ1bGUucmVxdWlyZWQgJiYgc291cmNlLmhhc093blByb3BlcnR5KHJ1bGUuZmllbGQpO1xyXG5cclxuXHRpZiAodmFsaWRhdGUpIHtcclxuXHRcdGlmIChpc0VtcHR5VmFsdWUodmFsdWUpICYmICFydWxlLnJlcXVpcmVkKSB7XHJcblx0XHRcdHJldHVybiBjYWxsYmFjaygpO1xyXG5cdFx0fVxyXG5cclxuXHRcdHJ1bGVzLnJlcXVpcmVkKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XHJcblxyXG5cdFx0aWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcclxuXHRcdFx0cnVsZXMudHlwZShydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0Y2FsbGJhY2soZXJyb3JzKTtcclxufVxyXG5cclxuLyoqXHJcbiAqICBWYWxpZGF0ZXMgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiB0eXBlLlxyXG4gKlxyXG4gKiAgQHBhcmFtIHJ1bGUgVGhlIHZhbGlkYXRpb24gcnVsZS5cclxuICogIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIGZpZWxkIG9uIHRoZSBzb3VyY2Ugb2JqZWN0LlxyXG4gKiAgQHBhcmFtIGNhbGxiYWNrIFRoZSBjYWxsYmFjayBmdW5jdGlvbi5cclxuICogIEBwYXJhbSBzb3VyY2UgVGhlIHNvdXJjZSBvYmplY3QgYmVpbmcgdmFsaWRhdGVkLlxyXG4gKiAgQHBhcmFtIG9wdGlvbnMgVGhlIHZhbGlkYXRpb24gb3B0aW9ucy5cclxuICogIEBwYXJhbSBvcHRpb25zLm1lc3NhZ2VzIFRoZSB2YWxpZGF0aW9uIG1lc3NhZ2VzLlxyXG4gKi9cclxuXHJcbmZ1bmN0aW9uIHJlZ2V4cChydWxlLCB2YWx1ZSwgY2FsbGJhY2ssIHNvdXJjZSwgb3B0aW9ucykge1xyXG5cdHZhciBlcnJvcnMgPSBbXTtcclxuXHR2YXIgdmFsaWRhdGUgPSBydWxlLnJlcXVpcmVkIHx8ICFydWxlLnJlcXVpcmVkICYmIHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShydWxlLmZpZWxkKTtcclxuXHJcblx0aWYgKHZhbGlkYXRlKSB7XHJcblx0XHRpZiAoaXNFbXB0eVZhbHVlKHZhbHVlKSAmJiAhcnVsZS5yZXF1aXJlZCkge1xyXG5cdFx0XHRyZXR1cm4gY2FsbGJhY2soKTtcclxuXHRcdH1cclxuXHJcblx0XHRydWxlcy5yZXF1aXJlZChydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xyXG5cclxuXHRcdGlmICghaXNFbXB0eVZhbHVlKHZhbHVlKSkge1xyXG5cdFx0XHRydWxlcy50eXBlKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRjYWxsYmFjayhlcnJvcnMpO1xyXG59XHJcblxyXG4vKipcclxuICogIFZhbGlkYXRlcyBhIG51bWJlciBpcyBhbiBpbnRlZ2VyLlxyXG4gKlxyXG4gKiAgQHBhcmFtIHJ1bGUgVGhlIHZhbGlkYXRpb24gcnVsZS5cclxuICogIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIGZpZWxkIG9uIHRoZSBzb3VyY2Ugb2JqZWN0LlxyXG4gKiAgQHBhcmFtIGNhbGxiYWNrIFRoZSBjYWxsYmFjayBmdW5jdGlvbi5cclxuICogIEBwYXJhbSBzb3VyY2UgVGhlIHNvdXJjZSBvYmplY3QgYmVpbmcgdmFsaWRhdGVkLlxyXG4gKiAgQHBhcmFtIG9wdGlvbnMgVGhlIHZhbGlkYXRpb24gb3B0aW9ucy5cclxuICogIEBwYXJhbSBvcHRpb25zLm1lc3NhZ2VzIFRoZSB2YWxpZGF0aW9uIG1lc3NhZ2VzLlxyXG4gKi9cclxuXHJcbmZ1bmN0aW9uIGludGVnZXIocnVsZSwgdmFsdWUsIGNhbGxiYWNrLCBzb3VyY2UsIG9wdGlvbnMpIHtcclxuXHR2YXIgZXJyb3JzID0gW107XHJcblx0dmFyIHZhbGlkYXRlID0gcnVsZS5yZXF1aXJlZCB8fCAhcnVsZS5yZXF1aXJlZCAmJiBzb3VyY2UuaGFzT3duUHJvcGVydHkocnVsZS5maWVsZCk7XHJcblxyXG5cdGlmICh2YWxpZGF0ZSkge1xyXG5cdFx0aWYgKGlzRW1wdHlWYWx1ZSh2YWx1ZSkgJiYgIXJ1bGUucmVxdWlyZWQpIHtcclxuXHRcdFx0cmV0dXJuIGNhbGxiYWNrKCk7XHJcblx0XHR9XHJcblxyXG5cdFx0cnVsZXMucmVxdWlyZWQocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcclxuXHJcblx0XHRpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xyXG5cdFx0XHRydWxlcy50eXBlKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XHJcblx0XHRcdHJ1bGVzLnJhbmdlKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRjYWxsYmFjayhlcnJvcnMpO1xyXG59XHJcblxyXG4vKipcclxuICogIFZhbGlkYXRlcyBhIG51bWJlciBpcyBhIGZsb2F0aW5nIHBvaW50IG51bWJlci5cclxuICpcclxuICogIEBwYXJhbSBydWxlIFRoZSB2YWxpZGF0aW9uIHJ1bGUuXHJcbiAqICBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBvbiB0aGUgc291cmNlIG9iamVjdC5cclxuICogIEBwYXJhbSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgZnVuY3Rpb24uXHJcbiAqICBAcGFyYW0gc291cmNlIFRoZSBzb3VyY2Ugb2JqZWN0IGJlaW5nIHZhbGlkYXRlZC5cclxuICogIEBwYXJhbSBvcHRpb25zIFRoZSB2YWxpZGF0aW9uIG9wdGlvbnMuXHJcbiAqICBAcGFyYW0gb3B0aW9ucy5tZXNzYWdlcyBUaGUgdmFsaWRhdGlvbiBtZXNzYWdlcy5cclxuICovXHJcblxyXG5mdW5jdGlvbiBmbG9hdEZuKHJ1bGUsIHZhbHVlLCBjYWxsYmFjaywgc291cmNlLCBvcHRpb25zKSB7XHJcblx0dmFyIGVycm9ycyA9IFtdO1xyXG5cdHZhciB2YWxpZGF0ZSA9IHJ1bGUucmVxdWlyZWQgfHwgIXJ1bGUucmVxdWlyZWQgJiYgc291cmNlLmhhc093blByb3BlcnR5KHJ1bGUuZmllbGQpO1xyXG5cclxuXHRpZiAodmFsaWRhdGUpIHtcclxuXHRcdGlmIChpc0VtcHR5VmFsdWUodmFsdWUpICYmICFydWxlLnJlcXVpcmVkKSB7XHJcblx0XHRcdHJldHVybiBjYWxsYmFjaygpO1xyXG5cdFx0fVxyXG5cclxuXHRcdHJ1bGVzLnJlcXVpcmVkKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XHJcblxyXG5cdFx0aWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcclxuXHRcdFx0cnVsZXMudHlwZShydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xyXG5cdFx0XHRydWxlcy5yYW5nZShydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0Y2FsbGJhY2soZXJyb3JzKTtcclxufVxyXG5cclxuLyoqXHJcbiAqICBWYWxpZGF0ZXMgYW4gYXJyYXkuXHJcbiAqXHJcbiAqICBAcGFyYW0gcnVsZSBUaGUgdmFsaWRhdGlvbiBydWxlLlxyXG4gKiAgQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgb24gdGhlIHNvdXJjZSBvYmplY3QuXHJcbiAqICBAcGFyYW0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIGZ1bmN0aW9uLlxyXG4gKiAgQHBhcmFtIHNvdXJjZSBUaGUgc291cmNlIG9iamVjdCBiZWluZyB2YWxpZGF0ZWQuXHJcbiAqICBAcGFyYW0gb3B0aW9ucyBUaGUgdmFsaWRhdGlvbiBvcHRpb25zLlxyXG4gKiAgQHBhcmFtIG9wdGlvbnMubWVzc2FnZXMgVGhlIHZhbGlkYXRpb24gbWVzc2FnZXMuXHJcbiAqL1xyXG5cclxuZnVuY3Rpb24gYXJyYXkocnVsZSwgdmFsdWUsIGNhbGxiYWNrLCBzb3VyY2UsIG9wdGlvbnMpIHtcclxuXHR2YXIgZXJyb3JzID0gW107XHJcblx0dmFyIHZhbGlkYXRlID0gcnVsZS5yZXF1aXJlZCB8fCAhcnVsZS5yZXF1aXJlZCAmJiBzb3VyY2UuaGFzT3duUHJvcGVydHkocnVsZS5maWVsZCk7XHJcblxyXG5cdGlmICh2YWxpZGF0ZSkge1xyXG5cdFx0aWYgKGlzRW1wdHlWYWx1ZSh2YWx1ZSwgJ2FycmF5JykgJiYgIXJ1bGUucmVxdWlyZWQpIHtcclxuXHRcdFx0cmV0dXJuIGNhbGxiYWNrKCk7XHJcblx0XHR9XHJcblxyXG5cdFx0cnVsZXMucmVxdWlyZWQocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zLCAnYXJyYXknKTtcclxuXHJcblx0XHRpZiAoIWlzRW1wdHlWYWx1ZSh2YWx1ZSwgJ2FycmF5JykpIHtcclxuXHRcdFx0cnVsZXMudHlwZShydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xyXG5cdFx0XHRydWxlcy5yYW5nZShydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0Y2FsbGJhY2soZXJyb3JzKTtcclxufVxyXG5cclxuLyoqXHJcbiAqICBWYWxpZGF0ZXMgYW4gb2JqZWN0LlxyXG4gKlxyXG4gKiAgQHBhcmFtIHJ1bGUgVGhlIHZhbGlkYXRpb24gcnVsZS5cclxuICogIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIGZpZWxkIG9uIHRoZSBzb3VyY2Ugb2JqZWN0LlxyXG4gKiAgQHBhcmFtIGNhbGxiYWNrIFRoZSBjYWxsYmFjayBmdW5jdGlvbi5cclxuICogIEBwYXJhbSBzb3VyY2UgVGhlIHNvdXJjZSBvYmplY3QgYmVpbmcgdmFsaWRhdGVkLlxyXG4gKiAgQHBhcmFtIG9wdGlvbnMgVGhlIHZhbGlkYXRpb24gb3B0aW9ucy5cclxuICogIEBwYXJhbSBvcHRpb25zLm1lc3NhZ2VzIFRoZSB2YWxpZGF0aW9uIG1lc3NhZ2VzLlxyXG4gKi9cclxuXHJcbmZ1bmN0aW9uIG9iamVjdChydWxlLCB2YWx1ZSwgY2FsbGJhY2ssIHNvdXJjZSwgb3B0aW9ucykge1xyXG5cdHZhciBlcnJvcnMgPSBbXTtcclxuXHR2YXIgdmFsaWRhdGUgPSBydWxlLnJlcXVpcmVkIHx8ICFydWxlLnJlcXVpcmVkICYmIHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShydWxlLmZpZWxkKTtcclxuXHJcblx0aWYgKHZhbGlkYXRlKSB7XHJcblx0XHRpZiAoaXNFbXB0eVZhbHVlKHZhbHVlKSAmJiAhcnVsZS5yZXF1aXJlZCkge1xyXG5cdFx0XHRyZXR1cm4gY2FsbGJhY2soKTtcclxuXHRcdH1cclxuXHJcblx0XHRydWxlcy5yZXF1aXJlZChydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xyXG5cclxuXHRcdGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdHJ1bGVzLnR5cGUocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdGNhbGxiYWNrKGVycm9ycyk7XHJcbn1cclxuXHJcbnZhciBFTlVNJDEgPSAnZW51bSc7XHJcbi8qKlxyXG4gKiAgVmFsaWRhdGVzIGFuIGVudW1lcmFibGUgbGlzdC5cclxuICpcclxuICogIEBwYXJhbSBydWxlIFRoZSB2YWxpZGF0aW9uIHJ1bGUuXHJcbiAqICBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBvbiB0aGUgc291cmNlIG9iamVjdC5cclxuICogIEBwYXJhbSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgZnVuY3Rpb24uXHJcbiAqICBAcGFyYW0gc291cmNlIFRoZSBzb3VyY2Ugb2JqZWN0IGJlaW5nIHZhbGlkYXRlZC5cclxuICogIEBwYXJhbSBvcHRpb25zIFRoZSB2YWxpZGF0aW9uIG9wdGlvbnMuXHJcbiAqICBAcGFyYW0gb3B0aW9ucy5tZXNzYWdlcyBUaGUgdmFsaWRhdGlvbiBtZXNzYWdlcy5cclxuICovXHJcblxyXG5mdW5jdGlvbiBlbnVtZXJhYmxlJDEocnVsZSwgdmFsdWUsIGNhbGxiYWNrLCBzb3VyY2UsIG9wdGlvbnMpIHtcclxuXHR2YXIgZXJyb3JzID0gW107XHJcblx0dmFyIHZhbGlkYXRlID0gcnVsZS5yZXF1aXJlZCB8fCAhcnVsZS5yZXF1aXJlZCAmJiBzb3VyY2UuaGFzT3duUHJvcGVydHkocnVsZS5maWVsZCk7XHJcblxyXG5cdGlmICh2YWxpZGF0ZSkge1xyXG5cdFx0aWYgKGlzRW1wdHlWYWx1ZSh2YWx1ZSkgJiYgIXJ1bGUucmVxdWlyZWQpIHtcclxuXHRcdFx0cmV0dXJuIGNhbGxiYWNrKCk7XHJcblx0XHR9XHJcblxyXG5cdFx0cnVsZXMucmVxdWlyZWQocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcclxuXHJcblx0XHRpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xyXG5cdFx0XHRydWxlc1tFTlVNJDFdKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRjYWxsYmFjayhlcnJvcnMpO1xyXG59XHJcblxyXG4vKipcclxuICogIFZhbGlkYXRlcyBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXR0ZXJuLlxyXG4gKlxyXG4gKiAgUGVyZm9ybXMgdmFsaWRhdGlvbiB3aGVuIGEgcnVsZSBvbmx5IGNvbnRhaW5zXHJcbiAqICBhIHBhdHRlcm4gcHJvcGVydHkgYnV0IGlzIG5vdCBkZWNsYXJlZCBhcyBhIHN0cmluZyB0eXBlLlxyXG4gKlxyXG4gKiAgQHBhcmFtIHJ1bGUgVGhlIHZhbGlkYXRpb24gcnVsZS5cclxuICogIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIGZpZWxkIG9uIHRoZSBzb3VyY2Ugb2JqZWN0LlxyXG4gKiAgQHBhcmFtIGNhbGxiYWNrIFRoZSBjYWxsYmFjayBmdW5jdGlvbi5cclxuICogIEBwYXJhbSBzb3VyY2UgVGhlIHNvdXJjZSBvYmplY3QgYmVpbmcgdmFsaWRhdGVkLlxyXG4gKiAgQHBhcmFtIG9wdGlvbnMgVGhlIHZhbGlkYXRpb24gb3B0aW9ucy5cclxuICogIEBwYXJhbSBvcHRpb25zLm1lc3NhZ2VzIFRoZSB2YWxpZGF0aW9uIG1lc3NhZ2VzLlxyXG4gKi9cclxuXHJcbmZ1bmN0aW9uIHBhdHRlcm4kMihydWxlLCB2YWx1ZSwgY2FsbGJhY2ssIHNvdXJjZSwgb3B0aW9ucykge1xyXG5cdHZhciBlcnJvcnMgPSBbXTtcclxuXHR2YXIgdmFsaWRhdGUgPSBydWxlLnJlcXVpcmVkIHx8ICFydWxlLnJlcXVpcmVkICYmIHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShydWxlLmZpZWxkKTtcclxuXHJcblx0aWYgKHZhbGlkYXRlKSB7XHJcblx0XHRpZiAoaXNFbXB0eVZhbHVlKHZhbHVlLCAnc3RyaW5nJykgJiYgIXJ1bGUucmVxdWlyZWQpIHtcclxuXHRcdFx0cmV0dXJuIGNhbGxiYWNrKCk7XHJcblx0XHR9XHJcblxyXG5cdFx0cnVsZXMucmVxdWlyZWQocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcclxuXHJcblx0XHRpZiAoIWlzRW1wdHlWYWx1ZSh2YWx1ZSwgJ3N0cmluZycpKSB7XHJcblx0XHRcdHJ1bGVzLnBhdHRlcm4ocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdGNhbGxiYWNrKGVycm9ycyk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGRhdGUocnVsZSwgdmFsdWUsIGNhbGxiYWNrLCBzb3VyY2UsIG9wdGlvbnMpIHtcclxuXHR2YXIgZXJyb3JzID0gW107XHJcblx0dmFyIHZhbGlkYXRlID0gcnVsZS5yZXF1aXJlZCB8fCAhcnVsZS5yZXF1aXJlZCAmJiBzb3VyY2UuaGFzT3duUHJvcGVydHkocnVsZS5maWVsZCk7IFxyXG5cclxuXHRpZiAodmFsaWRhdGUpIHtcclxuXHRcdGlmIChpc0VtcHR5VmFsdWUodmFsdWUpICYmICFydWxlLnJlcXVpcmVkKSB7XHJcblx0XHRcdHJldHVybiBjYWxsYmFjaygpO1xyXG5cdFx0fVxyXG5cclxuXHRcdHJ1bGVzLnJlcXVpcmVkKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XHJcblxyXG5cdFx0aWYgKCFpc0VtcHR5VmFsdWUodmFsdWUpKSB7XHJcblx0XHRcdHZhciBkYXRlT2JqZWN0O1xyXG5cclxuXHRcdFx0aWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcclxuXHRcdFx0XHRkYXRlT2JqZWN0ID0gbmV3IERhdGUodmFsdWUpO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdGRhdGVPYmplY3QgPSB2YWx1ZTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cnVsZXMudHlwZShydWxlLCBkYXRlT2JqZWN0LCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XHJcblxyXG5cdFx0XHRpZiAoZGF0ZU9iamVjdCkge1xyXG5cdFx0XHRcdHJ1bGVzLnJhbmdlKHJ1bGUsIGRhdGVPYmplY3QuZ2V0VGltZSgpLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdGNhbGxiYWNrKGVycm9ycyk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHJlcXVpcmVkJDEocnVsZSwgdmFsdWUsIGNhbGxiYWNrLCBzb3VyY2UsIG9wdGlvbnMpIHtcclxuXHR2YXIgZXJyb3JzID0gW107XHJcblx0dmFyIHR5cGUgPSBBcnJheS5pc0FycmF5KHZhbHVlKSA/ICdhcnJheScgOiB0eXBlb2YgdmFsdWU7XHJcblx0cnVsZXMucmVxdWlyZWQocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zLCB0eXBlKTtcclxuXHRjYWxsYmFjayhlcnJvcnMpO1xyXG59XHJcblxyXG5mdW5jdGlvbiB0eXBlJDEocnVsZSwgdmFsdWUsIGNhbGxiYWNrLCBzb3VyY2UsIG9wdGlvbnMpIHtcclxuXHR2YXIgcnVsZVR5cGUgPSBydWxlLnR5cGU7XHJcblx0dmFyIGVycm9ycyA9IFtdO1xyXG5cdHZhciB2YWxpZGF0ZSA9IHJ1bGUucmVxdWlyZWQgfHwgIXJ1bGUucmVxdWlyZWQgJiYgc291cmNlLmhhc093blByb3BlcnR5KHJ1bGUuZmllbGQpO1xyXG5cclxuXHRpZiAodmFsaWRhdGUpIHtcclxuXHRcdGlmIChpc0VtcHR5VmFsdWUodmFsdWUsIHJ1bGVUeXBlKSAmJiAhcnVsZS5yZXF1aXJlZCkge1xyXG5cdFx0XHRyZXR1cm4gY2FsbGJhY2soKTtcclxuXHRcdH1cclxuXHJcblx0XHRydWxlcy5yZXF1aXJlZChydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMsIHJ1bGVUeXBlKTtcclxuXHJcblx0XHRpZiAoIWlzRW1wdHlWYWx1ZSh2YWx1ZSwgcnVsZVR5cGUpKSB7XHJcblx0XHRcdHJ1bGVzLnR5cGUocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdGNhbGxiYWNrKGVycm9ycyk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiAgUGVyZm9ybXMgdmFsaWRhdGlvbiBmb3IgYW55IHR5cGUuXHJcbiAqXHJcbiAqICBAcGFyYW0gcnVsZSBUaGUgdmFsaWRhdGlvbiBydWxlLlxyXG4gKiAgQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgb24gdGhlIHNvdXJjZSBvYmplY3QuXHJcbiAqICBAcGFyYW0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIGZ1bmN0aW9uLlxyXG4gKiAgQHBhcmFtIHNvdXJjZSBUaGUgc291cmNlIG9iamVjdCBiZWluZyB2YWxpZGF0ZWQuXHJcbiAqICBAcGFyYW0gb3B0aW9ucyBUaGUgdmFsaWRhdGlvbiBvcHRpb25zLlxyXG4gKiAgQHBhcmFtIG9wdGlvbnMubWVzc2FnZXMgVGhlIHZhbGlkYXRpb24gbWVzc2FnZXMuXHJcbiAqL1xyXG5cclxuZnVuY3Rpb24gYW55KHJ1bGUsIHZhbHVlLCBjYWxsYmFjaywgc291cmNlLCBvcHRpb25zKSB7XHJcblx0dmFyIGVycm9ycyA9IFtdO1xyXG5cdHZhciB2YWxpZGF0ZSA9IHJ1bGUucmVxdWlyZWQgfHwgIXJ1bGUucmVxdWlyZWQgJiYgc291cmNlLmhhc093blByb3BlcnR5KHJ1bGUuZmllbGQpO1xyXG5cclxuXHRpZiAodmFsaWRhdGUpIHtcclxuXHRcdGlmIChpc0VtcHR5VmFsdWUodmFsdWUpICYmICFydWxlLnJlcXVpcmVkKSB7XHJcblx0XHRcdHJldHVybiBjYWxsYmFjaygpO1xyXG5cdFx0fVxyXG5cclxuXHRcdHJ1bGVzLnJlcXVpcmVkKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XHJcblx0fVxyXG5cclxuXHRjYWxsYmFjayhlcnJvcnMpO1xyXG59XHJcblxyXG52YXIgdmFsaWRhdG9ycyA9IHtcclxuXHRzdHJpbmc6IHN0cmluZyxcclxuXHRtZXRob2Q6IG1ldGhvZCxcclxuXHRudW1iZXI6IG51bWJlcixcclxuXHRcImJvb2xlYW5cIjogX2Jvb2xlYW4sXHJcblx0cmVnZXhwOiByZWdleHAsXHJcblx0aW50ZWdlcjogaW50ZWdlcixcclxuXHRcImZsb2F0XCI6IGZsb2F0Rm4sXHJcblx0YXJyYXk6IGFycmF5LFxyXG5cdG9iamVjdDogb2JqZWN0LFxyXG5cdFwiZW51bVwiOiBlbnVtZXJhYmxlJDEsXHJcblx0cGF0dGVybjogcGF0dGVybiQyLFxyXG5cdGRhdGU6IGRhdGUsXHJcblx0dXJsOiB0eXBlJDEsXHJcblx0aGV4OiB0eXBlJDEsXHJcblx0ZW1haWw6IHR5cGUkMSxcclxuXHRyZXF1aXJlZDogcmVxdWlyZWQkMSxcclxuXHRhbnk6IGFueVxyXG59O1xyXG5cclxuZnVuY3Rpb24gbmV3TWVzc2FnZXMoKSB7XHJcblx0cmV0dXJuIHtcclxuXHRcdFwiZGVmYXVsdFwiOiAnVmFsaWRhdGlvbiBlcnJvciBvbiBmaWVsZCAlcycsXHJcblx0XHRyZXF1aXJlZDogJyVzIGlzIHJlcXVpcmVkJyxcclxuXHRcdFwiZW51bVwiOiAnJXMgbXVzdCBiZSBvbmUgb2YgJXMnLFxyXG5cdFx0d2hpdGVzcGFjZTogJyVzIGNhbm5vdCBiZSBlbXB0eScsXHJcblx0XHRkYXRlOiB7XHJcblx0XHRcdGZvcm1hdDogJyVzIGRhdGUgJXMgaXMgaW52YWxpZCBmb3IgZm9ybWF0ICVzJyxcclxuXHRcdFx0cGFyc2U6ICclcyBkYXRlIGNvdWxkIG5vdCBiZSBwYXJzZWQsICVzIGlzIGludmFsaWQgJyxcclxuXHRcdFx0aW52YWxpZDogJyVzIGRhdGUgJXMgaXMgaW52YWxpZCdcclxuXHRcdH0sXHJcblx0XHR0eXBlczoge1xyXG5cdFx0XHRzdHJpbmc6ICclcyBpcyBub3QgYSAlcycsXHJcblx0XHRcdG1ldGhvZDogJyVzIGlzIG5vdCBhICVzIChmdW5jdGlvbiknLFxyXG5cdFx0XHRhcnJheTogJyVzIGlzIG5vdCBhbiAlcycsXHJcblx0XHRcdG9iamVjdDogJyVzIGlzIG5vdCBhbiAlcycsXHJcblx0XHRcdG51bWJlcjogJyVzIGlzIG5vdCBhICVzJyxcclxuXHRcdFx0ZGF0ZTogJyVzIGlzIG5vdCBhICVzJyxcclxuXHRcdFx0XCJib29sZWFuXCI6ICclcyBpcyBub3QgYSAlcycsXHJcblx0XHRcdGludGVnZXI6ICclcyBpcyBub3QgYW4gJXMnLFxyXG5cdFx0XHRcImZsb2F0XCI6ICclcyBpcyBub3QgYSAlcycsXHJcblx0XHRcdHJlZ2V4cDogJyVzIGlzIG5vdCBhIHZhbGlkICVzJyxcclxuXHRcdFx0ZW1haWw6ICclcyBpcyBub3QgYSB2YWxpZCAlcycsXHJcblx0XHRcdHVybDogJyVzIGlzIG5vdCBhIHZhbGlkICVzJyxcclxuXHRcdFx0aGV4OiAnJXMgaXMgbm90IGEgdmFsaWQgJXMnXHJcblx0XHR9LFxyXG5cdFx0c3RyaW5nOiB7XHJcblx0XHRcdGxlbjogJyVzIG11c3QgYmUgZXhhY3RseSAlcyBjaGFyYWN0ZXJzJyxcclxuXHRcdFx0bWluOiAnJXMgbXVzdCBiZSBhdCBsZWFzdCAlcyBjaGFyYWN0ZXJzJyxcclxuXHRcdFx0bWF4OiAnJXMgY2Fubm90IGJlIGxvbmdlciB0aGFuICVzIGNoYXJhY3RlcnMnLFxyXG5cdFx0XHRyYW5nZTogJyVzIG11c3QgYmUgYmV0d2VlbiAlcyBhbmQgJXMgY2hhcmFjdGVycydcclxuXHRcdH0sXHJcblx0XHRudW1iZXI6IHtcclxuXHRcdFx0bGVuOiAnJXMgbXVzdCBlcXVhbCAlcycsXHJcblx0XHRcdG1pbjogJyVzIGNhbm5vdCBiZSBsZXNzIHRoYW4gJXMnLFxyXG5cdFx0XHRtYXg6ICclcyBjYW5ub3QgYmUgZ3JlYXRlciB0aGFuICVzJyxcclxuXHRcdFx0cmFuZ2U6ICclcyBtdXN0IGJlIGJldHdlZW4gJXMgYW5kICVzJ1xyXG5cdFx0fSxcclxuXHRcdGFycmF5OiB7XHJcblx0XHRcdGxlbjogJyVzIG11c3QgYmUgZXhhY3RseSAlcyBpbiBsZW5ndGgnLFxyXG5cdFx0XHRtaW46ICclcyBjYW5ub3QgYmUgbGVzcyB0aGFuICVzIGluIGxlbmd0aCcsXHJcblx0XHRcdG1heDogJyVzIGNhbm5vdCBiZSBncmVhdGVyIHRoYW4gJXMgaW4gbGVuZ3RoJyxcclxuXHRcdFx0cmFuZ2U6ICclcyBtdXN0IGJlIGJldHdlZW4gJXMgYW5kICVzIGluIGxlbmd0aCdcclxuXHRcdH0sXHJcblx0XHRwYXR0ZXJuOiB7XHJcblx0XHRcdG1pc21hdGNoOiAnJXMgdmFsdWUgJXMgZG9lcyBub3QgbWF0Y2ggcGF0dGVybiAlcydcclxuXHRcdH0sXHJcblx0XHRjbG9uZTogZnVuY3Rpb24gY2xvbmUoKSB7XHJcblx0XHRcdHZhciBjbG9uZWQgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMpKTtcclxuXHRcdFx0Y2xvbmVkLmNsb25lID0gdGhpcy5jbG9uZTtcclxuXHRcdFx0cmV0dXJuIGNsb25lZDtcclxuXHRcdH1cclxuXHR9O1xyXG59XHJcbnZhciBtZXNzYWdlcyA9IG5ld01lc3NhZ2VzKCk7XHJcblxyXG4vKipcclxuICogIEVuY2Fwc3VsYXRlcyBhIHZhbGlkYXRpb24gc2NoZW1hLlxyXG4gKlxyXG4gKiAgQHBhcmFtIGRlc2NyaXB0b3IgQW4gb2JqZWN0IGRlY2xhcmluZyB2YWxpZGF0aW9uIHJ1bGVzXHJcbiAqICBmb3IgdGhpcyBzY2hlbWEuXHJcbiAqL1xyXG5cclxuZnVuY3Rpb24gU2NoZW1hKGRlc2NyaXB0b3IpIHtcclxuXHR0aGlzLnJ1bGVzID0gbnVsbDtcclxuXHR0aGlzLl9tZXNzYWdlcyA9IG1lc3NhZ2VzO1xyXG5cdHRoaXMuZGVmaW5lKGRlc2NyaXB0b3IpO1xyXG59XHJcblxyXG5TY2hlbWEucHJvdG90eXBlID0ge1xyXG5cdG1lc3NhZ2VzOiBmdW5jdGlvbiBtZXNzYWdlcyhfbWVzc2FnZXMpIHtcclxuXHRcdGlmIChfbWVzc2FnZXMpIHtcclxuXHRcdFx0dGhpcy5fbWVzc2FnZXMgPSBkZWVwTWVyZ2UobmV3TWVzc2FnZXMoKSwgX21lc3NhZ2VzKTtcclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcy5fbWVzc2FnZXM7XHJcblx0fSxcclxuXHRkZWZpbmU6IGZ1bmN0aW9uIGRlZmluZShydWxlcykge1xyXG5cdFx0aWYgKCFydWxlcykge1xyXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBjb25maWd1cmUgYSBzY2hlbWEgd2l0aCBubyBydWxlcycpO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICh0eXBlb2YgcnVsZXMgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkocnVsZXMpKSB7XHJcblx0XHRcdHRocm93IG5ldyBFcnJvcignUnVsZXMgbXVzdCBiZSBhbiBvYmplY3QnKTtcclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLnJ1bGVzID0ge307XHJcblx0XHR2YXIgejtcclxuXHRcdHZhciBpdGVtO1xyXG5cclxuXHRcdGZvciAoeiBpbiBydWxlcykge1xyXG5cdFx0XHRpZiAocnVsZXMuaGFzT3duUHJvcGVydHkoeikpIHtcclxuXHRcdFx0XHRpdGVtID0gcnVsZXNbel07XHJcblx0XHRcdFx0dGhpcy5ydWxlc1t6XSA9IEFycmF5LmlzQXJyYXkoaXRlbSkgPyBpdGVtIDogW2l0ZW1dO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fSxcclxuXHR2YWxpZGF0ZTogZnVuY3Rpb24gdmFsaWRhdGUoc291cmNlXywgbywgb2MpIHtcclxuXHRcdHZhciBfdGhpcyA9IHRoaXM7XHJcblxyXG5cdFx0aWYgKG8gPT09IHZvaWQgMCkge1xyXG5cdFx0XHRvID0ge307XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKG9jID09PSB2b2lkIDApIHtcclxuXHRcdFx0b2MgPSBmdW5jdGlvbiBvYygpIHt9O1xyXG5cdFx0fVxyXG5cclxuXHRcdHZhciBzb3VyY2UgPSBzb3VyY2VfO1xyXG5cdFx0dmFyIG9wdGlvbnMgPSBvO1xyXG5cdFx0dmFyIGNhbGxiYWNrID0gb2M7XHJcblxyXG5cdFx0aWYgKHR5cGVvZiBvcHRpb25zID09PSAnZnVuY3Rpb24nKSB7XHJcblx0XHRcdGNhbGxiYWNrID0gb3B0aW9ucztcclxuXHRcdFx0b3B0aW9ucyA9IHt9O1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICghdGhpcy5ydWxlcyB8fCBPYmplY3Qua2V5cyh0aGlzLnJ1bGVzKS5sZW5ndGggPT09IDApIHtcclxuXHRcdFx0aWYgKGNhbGxiYWNrKSB7XHJcblx0XHRcdFx0Y2FsbGJhY2soKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xyXG5cdFx0fVxyXG5cclxuXHRcdGZ1bmN0aW9uIGNvbXBsZXRlKHJlc3VsdHMpIHtcclxuXHRcdFx0dmFyIGk7XHJcblx0XHRcdHZhciBlcnJvcnMgPSBbXTtcclxuXHRcdFx0dmFyIGZpZWxkcyA9IHt9O1xyXG5cclxuXHRcdFx0ZnVuY3Rpb24gYWRkKGUpIHtcclxuXHRcdFx0XHRpZiAoQXJyYXkuaXNBcnJheShlKSkge1xyXG5cdFx0XHRcdFx0dmFyIF9lcnJvcnM7XHJcblxyXG5cdFx0XHRcdFx0ZXJyb3JzID0gKF9lcnJvcnMgPSBlcnJvcnMpLmNvbmNhdC5hcHBseShfZXJyb3JzLCBlKTtcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0ZXJyb3JzLnB1c2goZSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRmb3IgKGkgPSAwOyBpIDwgcmVzdWx0cy5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRcdGFkZChyZXN1bHRzW2ldKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKCFlcnJvcnMubGVuZ3RoKSB7XHJcblx0XHRcdFx0ZXJyb3JzID0gbnVsbDtcclxuXHRcdFx0XHRmaWVsZHMgPSBudWxsO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdGZpZWxkcyA9IGNvbnZlcnRGaWVsZHNFcnJvcihlcnJvcnMpO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRjYWxsYmFjayhlcnJvcnMsIGZpZWxkcyk7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKG9wdGlvbnMubWVzc2FnZXMpIHtcclxuXHRcdFx0dmFyIG1lc3NhZ2VzJDEgPSB0aGlzLm1lc3NhZ2VzKCk7XHJcblxyXG5cdFx0XHRpZiAobWVzc2FnZXMkMSA9PT0gbWVzc2FnZXMpIHtcclxuXHRcdFx0XHRtZXNzYWdlcyQxID0gbmV3TWVzc2FnZXMoKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0ZGVlcE1lcmdlKG1lc3NhZ2VzJDEsIG9wdGlvbnMubWVzc2FnZXMpO1xyXG5cdFx0XHRvcHRpb25zLm1lc3NhZ2VzID0gbWVzc2FnZXMkMTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdG9wdGlvbnMubWVzc2FnZXMgPSB0aGlzLm1lc3NhZ2VzKCk7XHJcblx0XHR9XHJcblxyXG5cdFx0dmFyIGFycjtcclxuXHRcdHZhciB2YWx1ZTtcclxuXHRcdHZhciBzZXJpZXMgPSB7fTtcclxuXHRcdHZhciBrZXlzID0gb3B0aW9ucy5rZXlzIHx8IE9iamVjdC5rZXlzKHRoaXMucnVsZXMpO1xyXG5cdFx0a2V5cy5mb3JFYWNoKGZ1bmN0aW9uKHopIHtcclxuXHRcdFx0YXJyID0gX3RoaXMucnVsZXNbel07XHJcblx0XHRcdHZhbHVlID0gc291cmNlW3pdO1xyXG5cdFx0XHRhcnIuZm9yRWFjaChmdW5jdGlvbihyKSB7XHJcblx0XHRcdFx0dmFyIHJ1bGUgPSByO1xyXG5cclxuXHRcdFx0XHRpZiAodHlwZW9mIHJ1bGUudHJhbnNmb3JtID09PSAnZnVuY3Rpb24nKSB7XHJcblx0XHRcdFx0XHRpZiAoc291cmNlID09PSBzb3VyY2VfKSB7XHJcblx0XHRcdFx0XHRcdHNvdXJjZSA9IF9leHRlbmRzKHt9LCBzb3VyY2UpO1xyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdHZhbHVlID0gc291cmNlW3pdID0gcnVsZS50cmFuc2Zvcm0odmFsdWUpO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0aWYgKHR5cGVvZiBydWxlID09PSAnZnVuY3Rpb24nKSB7XHJcblx0XHRcdFx0XHRydWxlID0ge1xyXG5cdFx0XHRcdFx0XHR2YWxpZGF0b3I6IHJ1bGVcclxuXHRcdFx0XHRcdH07XHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdHJ1bGUgPSBfZXh0ZW5kcyh7fSwgcnVsZSk7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRydWxlLnZhbGlkYXRvciA9IF90aGlzLmdldFZhbGlkYXRpb25NZXRob2QocnVsZSk7XHJcblx0XHRcdFx0cnVsZS5maWVsZCA9IHo7XHJcblx0XHRcdFx0cnVsZS5mdWxsRmllbGQgPSBydWxlLmZ1bGxGaWVsZCB8fCB6O1xyXG5cdFx0XHRcdHJ1bGUudHlwZSA9IF90aGlzLmdldFR5cGUocnVsZSk7XHJcblxyXG5cdFx0XHRcdGlmICghcnVsZS52YWxpZGF0b3IpIHtcclxuXHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdHNlcmllc1t6XSA9IHNlcmllc1t6XSB8fCBbXTtcclxuXHRcdFx0XHRzZXJpZXNbel0ucHVzaCh7XHJcblx0XHRcdFx0XHRydWxlOiBydWxlLFxyXG5cdFx0XHRcdFx0dmFsdWU6IHZhbHVlLFxyXG5cdFx0XHRcdFx0c291cmNlOiBzb3VyY2UsXHJcblx0XHRcdFx0XHRmaWVsZDogelxyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR9KTtcclxuXHRcdH0pO1xyXG5cdFx0dmFyIGVycm9yRmllbGRzID0ge307XHJcblx0XHRyZXR1cm4gYXN5bmNNYXAoc2VyaWVzLCBvcHRpb25zLCBmdW5jdGlvbihkYXRhLCBkb0l0KSB7XHJcblx0XHRcdHZhciBydWxlID0gZGF0YS5ydWxlO1xyXG5cdFx0XHR2YXIgZGVlcCA9IChydWxlLnR5cGUgPT09ICdvYmplY3QnIHx8IHJ1bGUudHlwZSA9PT0gJ2FycmF5JykgJiYgKHR5cGVvZiBydWxlLmZpZWxkcyA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIHJ1bGUuZGVmYXVsdEZpZWxkID09PVxyXG5cdFx0XHRcdCdvYmplY3QnKTtcclxuXHRcdFx0ZGVlcCA9IGRlZXAgJiYgKHJ1bGUucmVxdWlyZWQgfHwgIXJ1bGUucmVxdWlyZWQgJiYgZGF0YS52YWx1ZSk7XHJcblx0XHRcdHJ1bGUuZmllbGQgPSBkYXRhLmZpZWxkO1xyXG5cclxuXHRcdFx0ZnVuY3Rpb24gYWRkRnVsbGZpZWxkKGtleSwgc2NoZW1hKSB7XHJcblx0XHRcdFx0cmV0dXJuIF9leHRlbmRzKHt9LCBzY2hlbWEsIHtcclxuXHRcdFx0XHRcdGZ1bGxGaWVsZDogcnVsZS5mdWxsRmllbGQgKyBcIi5cIiArIGtleVxyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRmdW5jdGlvbiBjYihlKSB7XHJcblx0XHRcdFx0aWYgKGUgPT09IHZvaWQgMCkge1xyXG5cdFx0XHRcdFx0ZSA9IFtdO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0dmFyIGVycm9ycyA9IGU7XHJcblxyXG5cdFx0XHRcdGlmICghQXJyYXkuaXNBcnJheShlcnJvcnMpKSB7XHJcblx0XHRcdFx0XHRlcnJvcnMgPSBbZXJyb3JzXTtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGlmICghb3B0aW9ucy5zdXBwcmVzc1dhcm5pbmcgJiYgZXJyb3JzLmxlbmd0aCkge1xyXG5cdFx0XHRcdFx0U2NoZW1hLndhcm5pbmcoJ2FzeW5jLXZhbGlkYXRvcjonLCBlcnJvcnMpO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0aWYgKGVycm9ycy5sZW5ndGggJiYgcnVsZS5tZXNzYWdlKSB7XHJcblx0XHRcdFx0XHRlcnJvcnMgPSBbXS5jb25jYXQocnVsZS5tZXNzYWdlKTtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGVycm9ycyA9IGVycm9ycy5tYXAoY29tcGxlbWVudEVycm9yKHJ1bGUpKTtcclxuXHJcblx0XHRcdFx0aWYgKG9wdGlvbnMuZmlyc3QgJiYgZXJyb3JzLmxlbmd0aCkge1xyXG5cdFx0XHRcdFx0ZXJyb3JGaWVsZHNbcnVsZS5maWVsZF0gPSAxO1xyXG5cdFx0XHRcdFx0cmV0dXJuIGRvSXQoZXJyb3JzKTtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGlmICghZGVlcCkge1xyXG5cdFx0XHRcdFx0ZG9JdChlcnJvcnMpO1xyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHQvLyBpZiBydWxlIGlzIHJlcXVpcmVkIGJ1dCB0aGUgdGFyZ2V0IG9iamVjdFxyXG5cdFx0XHRcdFx0Ly8gZG9lcyBub3QgZXhpc3QgZmFpbCBhdCB0aGUgcnVsZSBsZXZlbCBhbmQgZG9uJ3RcclxuXHRcdFx0XHRcdC8vIGdvIGRlZXBlclxyXG5cdFx0XHRcdFx0aWYgKHJ1bGUucmVxdWlyZWQgJiYgIWRhdGEudmFsdWUpIHtcclxuXHRcdFx0XHRcdFx0aWYgKHJ1bGUubWVzc2FnZSkge1xyXG5cdFx0XHRcdFx0XHRcdGVycm9ycyA9IFtdLmNvbmNhdChydWxlLm1lc3NhZ2UpLm1hcChjb21wbGVtZW50RXJyb3IocnVsZSkpO1xyXG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKG9wdGlvbnMuZXJyb3IpIHtcclxuXHRcdFx0XHRcdFx0XHRlcnJvcnMgPSBbb3B0aW9ucy5lcnJvcihydWxlLCBmb3JtYXQob3B0aW9ucy5tZXNzYWdlcy5yZXF1aXJlZCwgcnVsZS5maWVsZCkpXTtcclxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRlcnJvcnMgPSBbXTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0cmV0dXJuIGRvSXQoZXJyb3JzKTtcclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHR2YXIgZmllbGRzU2NoZW1hID0ge307XHJcblxyXG5cdFx0XHRcdFx0aWYgKHJ1bGUuZGVmYXVsdEZpZWxkKSB7XHJcblx0XHRcdFx0XHRcdGZvciAodmFyIGsgaW4gZGF0YS52YWx1ZSkge1xyXG5cdFx0XHRcdFx0XHRcdGlmIChkYXRhLnZhbHVlLmhhc093blByb3BlcnR5KGspKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRmaWVsZHNTY2hlbWFba10gPSBydWxlLmRlZmF1bHRGaWVsZDtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRmaWVsZHNTY2hlbWEgPSBfZXh0ZW5kcyh7fSwgZmllbGRzU2NoZW1hLCB7fSwgZGF0YS5ydWxlLmZpZWxkcyk7XHJcblxyXG5cdFx0XHRcdFx0Zm9yICh2YXIgZiBpbiBmaWVsZHNTY2hlbWEpIHtcclxuXHRcdFx0XHRcdFx0aWYgKGZpZWxkc1NjaGVtYS5oYXNPd25Qcm9wZXJ0eShmKSkge1xyXG5cdFx0XHRcdFx0XHRcdHZhciBmaWVsZFNjaGVtYSA9IEFycmF5LmlzQXJyYXkoZmllbGRzU2NoZW1hW2ZdKSA/IGZpZWxkc1NjaGVtYVtmXSA6IFtmaWVsZHNTY2hlbWFbZl1dO1xyXG5cdFx0XHRcdFx0XHRcdGZpZWxkc1NjaGVtYVtmXSA9IGZpZWxkU2NoZW1hLm1hcChhZGRGdWxsZmllbGQuYmluZChudWxsLCBmKSk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHR2YXIgc2NoZW1hID0gbmV3IFNjaGVtYShmaWVsZHNTY2hlbWEpO1xyXG5cdFx0XHRcdFx0c2NoZW1hLm1lc3NhZ2VzKG9wdGlvbnMubWVzc2FnZXMpO1xyXG5cclxuXHRcdFx0XHRcdGlmIChkYXRhLnJ1bGUub3B0aW9ucykge1xyXG5cdFx0XHRcdFx0XHRkYXRhLnJ1bGUub3B0aW9ucy5tZXNzYWdlcyA9IG9wdGlvbnMubWVzc2FnZXM7XHJcblx0XHRcdFx0XHRcdGRhdGEucnVsZS5vcHRpb25zLmVycm9yID0gb3B0aW9ucy5lcnJvcjtcclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRzY2hlbWEudmFsaWRhdGUoZGF0YS52YWx1ZSwgZGF0YS5ydWxlLm9wdGlvbnMgfHwgb3B0aW9ucywgZnVuY3Rpb24oZXJycykge1xyXG5cdFx0XHRcdFx0XHR2YXIgZmluYWxFcnJvcnMgPSBbXTtcclxuXHJcblx0XHRcdFx0XHRcdGlmIChlcnJvcnMgJiYgZXJyb3JzLmxlbmd0aCkge1xyXG5cdFx0XHRcdFx0XHRcdGZpbmFsRXJyb3JzLnB1c2guYXBwbHkoZmluYWxFcnJvcnMsIGVycm9ycyk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdGlmIChlcnJzICYmIGVycnMubGVuZ3RoKSB7XHJcblx0XHRcdFx0XHRcdFx0ZmluYWxFcnJvcnMucHVzaC5hcHBseShmaW5hbEVycm9ycywgZXJycyk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdGRvSXQoZmluYWxFcnJvcnMubGVuZ3RoID8gZmluYWxFcnJvcnMgOiBudWxsKTtcclxuXHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dmFyIHJlcztcclxuXHJcblx0XHRcdGlmIChydWxlLmFzeW5jVmFsaWRhdG9yKSB7XHJcblx0XHRcdFx0cmVzID0gcnVsZS5hc3luY1ZhbGlkYXRvcihydWxlLCBkYXRhLnZhbHVlLCBjYiwgZGF0YS5zb3VyY2UsIG9wdGlvbnMpO1xyXG5cdFx0XHR9IGVsc2UgaWYgKHJ1bGUudmFsaWRhdG9yKSB7XHJcblx0XHRcdFx0cmVzID0gcnVsZS52YWxpZGF0b3IocnVsZSwgZGF0YS52YWx1ZSwgY2IsIGRhdGEuc291cmNlLCBvcHRpb25zKTtcclxuXHJcblx0XHRcdFx0aWYgKHJlcyA9PT0gdHJ1ZSkge1xyXG5cdFx0XHRcdFx0Y2IoKTtcclxuXHRcdFx0XHR9IGVsc2UgaWYgKHJlcyA9PT0gZmFsc2UpIHtcclxuXHRcdFx0XHRcdGNiKHJ1bGUubWVzc2FnZSB8fCBydWxlLmZpZWxkICsgXCIgZmFpbHNcIik7XHJcblx0XHRcdFx0fSBlbHNlIGlmIChyZXMgaW5zdGFuY2VvZiBBcnJheSkge1xyXG5cdFx0XHRcdFx0Y2IocmVzKTtcclxuXHRcdFx0XHR9IGVsc2UgaWYgKHJlcyBpbnN0YW5jZW9mIEVycm9yKSB7XHJcblx0XHRcdFx0XHRjYihyZXMubWVzc2FnZSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAocmVzICYmIHJlcy50aGVuKSB7XHJcblx0XHRcdFx0cmVzLnRoZW4oZnVuY3Rpb24oKSB7XHJcblx0XHRcdFx0XHRyZXR1cm4gY2IoKTtcclxuXHRcdFx0XHR9LCBmdW5jdGlvbihlKSB7XHJcblx0XHRcdFx0XHRyZXR1cm4gY2IoZSk7XHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdH1cclxuXHRcdH0sIGZ1bmN0aW9uKHJlc3VsdHMpIHtcclxuXHRcdFx0Y29tcGxldGUocmVzdWx0cyk7XHJcblx0XHR9KTtcclxuXHR9LFxyXG5cdGdldFR5cGU6IGZ1bmN0aW9uIGdldFR5cGUocnVsZSkge1xyXG5cdFx0aWYgKHJ1bGUudHlwZSA9PT0gdW5kZWZpbmVkICYmIHJ1bGUucGF0dGVybiBpbnN0YW5jZW9mIFJlZ0V4cCkge1xyXG5cdFx0XHRydWxlLnR5cGUgPSAncGF0dGVybic7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKHR5cGVvZiBydWxlLnZhbGlkYXRvciAhPT0gJ2Z1bmN0aW9uJyAmJiBydWxlLnR5cGUgJiYgIXZhbGlkYXRvcnMuaGFzT3duUHJvcGVydHkocnVsZS50eXBlKSkge1xyXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoZm9ybWF0KCdVbmtub3duIHJ1bGUgdHlwZSAlcycsIHJ1bGUudHlwZSkpO1xyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBydWxlLnR5cGUgfHwgJ3N0cmluZyc7XHJcblx0fSxcclxuXHRnZXRWYWxpZGF0aW9uTWV0aG9kOiBmdW5jdGlvbiBnZXRWYWxpZGF0aW9uTWV0aG9kKHJ1bGUpIHtcclxuXHRcdGlmICh0eXBlb2YgcnVsZS52YWxpZGF0b3IgPT09ICdmdW5jdGlvbicpIHtcclxuXHRcdFx0cmV0dXJuIHJ1bGUudmFsaWRhdG9yO1xyXG5cdFx0fVxyXG5cclxuXHRcdHZhciBrZXlzID0gT2JqZWN0LmtleXMocnVsZSk7XHJcblx0XHR2YXIgbWVzc2FnZUluZGV4ID0ga2V5cy5pbmRleE9mKCdtZXNzYWdlJyk7XHJcblxyXG5cdFx0aWYgKG1lc3NhZ2VJbmRleCAhPT0gLTEpIHtcclxuXHRcdFx0a2V5cy5zcGxpY2UobWVzc2FnZUluZGV4LCAxKTtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAoa2V5cy5sZW5ndGggPT09IDEgJiYga2V5c1swXSA9PT0gJ3JlcXVpcmVkJykge1xyXG5cdFx0XHRyZXR1cm4gdmFsaWRhdG9ycy5yZXF1aXJlZDtcclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdmFsaWRhdG9yc1t0aGlzLmdldFR5cGUocnVsZSldIHx8IGZhbHNlO1xyXG5cdH1cclxufTtcclxuXHJcblNjaGVtYS5yZWdpc3RlciA9IGZ1bmN0aW9uIHJlZ2lzdGVyKHR5cGUsIHZhbGlkYXRvcikge1xyXG5cdGlmICh0eXBlb2YgdmFsaWRhdG9yICE9PSAnZnVuY3Rpb24nKSB7XHJcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCByZWdpc3RlciBhIHZhbGlkYXRvciBieSB0eXBlLCB2YWxpZGF0b3IgaXMgbm90IGEgZnVuY3Rpb24nKTtcclxuXHR9XHJcblxyXG5cdHZhbGlkYXRvcnNbdHlwZV0gPSB2YWxpZGF0b3I7XHJcbn07XHJcblxyXG5TY2hlbWEud2FybmluZyA9IHdhcm5pbmc7XHJcblNjaGVtYS5tZXNzYWdlcyA9IG1lc3NhZ2VzO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgU2NoZW1hO1xyXG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXBcclxuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///1447\n"); /***/ }), /* 1448 */